1*9bd9e0deSMauro Carvalho Chehab // SPDX-License-Identifier: GPL-2.0 2*9bd9e0deSMauro Carvalho Chehab /* 3*9bd9e0deSMauro Carvalho Chehab * Device driver for regulators in HISI PMIC IC 4*9bd9e0deSMauro Carvalho Chehab * 5*9bd9e0deSMauro Carvalho Chehab * Copyright (c) 2013 Linaro Ltd. 6*9bd9e0deSMauro Carvalho Chehab * Copyright (c) 2011 Hisilicon. 7*9bd9e0deSMauro Carvalho Chehab * Copyright (c) 2020-2021 Huawei Technologies Co., Ltd. 8*9bd9e0deSMauro Carvalho Chehab */ 9*9bd9e0deSMauro Carvalho Chehab 10*9bd9e0deSMauro Carvalho Chehab #include <linux/mfd/core.h> 11*9bd9e0deSMauro Carvalho Chehab #include <linux/mfd/hi6421-spmi-pmic.h> 12*9bd9e0deSMauro Carvalho Chehab #include <linux/module.h> 13*9bd9e0deSMauro Carvalho Chehab #include <linux/platform_device.h> 14*9bd9e0deSMauro Carvalho Chehab #include <linux/regmap.h> 15*9bd9e0deSMauro Carvalho Chehab #include <linux/slab.h> 16*9bd9e0deSMauro Carvalho Chehab #include <linux/spmi.h> 17*9bd9e0deSMauro Carvalho Chehab 18*9bd9e0deSMauro Carvalho Chehab static const struct mfd_cell hi6421v600_devs[] = { 19*9bd9e0deSMauro Carvalho Chehab { .name = "hi6421v600-irq", }, 20*9bd9e0deSMauro Carvalho Chehab { .name = "hi6421v600-regulator", }, 21*9bd9e0deSMauro Carvalho Chehab }; 22*9bd9e0deSMauro Carvalho Chehab 23*9bd9e0deSMauro Carvalho Chehab static const struct regmap_config regmap_config = { 24*9bd9e0deSMauro Carvalho Chehab .reg_bits = 16, 25*9bd9e0deSMauro Carvalho Chehab .val_bits = BITS_PER_BYTE, 26*9bd9e0deSMauro Carvalho Chehab .max_register = 0xffff, 27*9bd9e0deSMauro Carvalho Chehab .fast_io = true 28*9bd9e0deSMauro Carvalho Chehab }; 29*9bd9e0deSMauro Carvalho Chehab 30*9bd9e0deSMauro Carvalho Chehab static int hi6421_spmi_pmic_probe(struct spmi_device *sdev) 31*9bd9e0deSMauro Carvalho Chehab { 32*9bd9e0deSMauro Carvalho Chehab struct device *dev = &sdev->dev; 33*9bd9e0deSMauro Carvalho Chehab int ret; 34*9bd9e0deSMauro Carvalho Chehab struct hi6421_spmi_pmic *ddata; 35*9bd9e0deSMauro Carvalho Chehab ddata = devm_kzalloc(dev, sizeof(*ddata), GFP_KERNEL); 36*9bd9e0deSMauro Carvalho Chehab if (!ddata) 37*9bd9e0deSMauro Carvalho Chehab return -ENOMEM; 38*9bd9e0deSMauro Carvalho Chehab 39*9bd9e0deSMauro Carvalho Chehab ddata->regmap = devm_regmap_init_spmi_ext(sdev, ®map_config); 40*9bd9e0deSMauro Carvalho Chehab if (IS_ERR(ddata->regmap)) 41*9bd9e0deSMauro Carvalho Chehab return PTR_ERR(ddata->regmap); 42*9bd9e0deSMauro Carvalho Chehab 43*9bd9e0deSMauro Carvalho Chehab ddata->dev = dev; 44*9bd9e0deSMauro Carvalho Chehab 45*9bd9e0deSMauro Carvalho Chehab dev_set_drvdata(&sdev->dev, ddata); 46*9bd9e0deSMauro Carvalho Chehab 47*9bd9e0deSMauro Carvalho Chehab ret = devm_mfd_add_devices(&sdev->dev, PLATFORM_DEVID_NONE, 48*9bd9e0deSMauro Carvalho Chehab hi6421v600_devs, ARRAY_SIZE(hi6421v600_devs), 49*9bd9e0deSMauro Carvalho Chehab NULL, 0, NULL); 50*9bd9e0deSMauro Carvalho Chehab if (ret < 0) 51*9bd9e0deSMauro Carvalho Chehab dev_err(dev, "Failed to add child devices: %d\n", ret); 52*9bd9e0deSMauro Carvalho Chehab 53*9bd9e0deSMauro Carvalho Chehab return ret; 54*9bd9e0deSMauro Carvalho Chehab } 55*9bd9e0deSMauro Carvalho Chehab 56*9bd9e0deSMauro Carvalho Chehab static const struct of_device_id pmic_spmi_id_table[] = { 57*9bd9e0deSMauro Carvalho Chehab { .compatible = "hisilicon,hi6421-spmi" }, 58*9bd9e0deSMauro Carvalho Chehab { } 59*9bd9e0deSMauro Carvalho Chehab }; 60*9bd9e0deSMauro Carvalho Chehab MODULE_DEVICE_TABLE(of, pmic_spmi_id_table); 61*9bd9e0deSMauro Carvalho Chehab 62*9bd9e0deSMauro Carvalho Chehab static struct spmi_driver hi6421_spmi_pmic_driver = { 63*9bd9e0deSMauro Carvalho Chehab .driver = { 64*9bd9e0deSMauro Carvalho Chehab .name = "hi6421-spmi-pmic", 65*9bd9e0deSMauro Carvalho Chehab .of_match_table = pmic_spmi_id_table, 66*9bd9e0deSMauro Carvalho Chehab }, 67*9bd9e0deSMauro Carvalho Chehab .probe = hi6421_spmi_pmic_probe, 68*9bd9e0deSMauro Carvalho Chehab }; 69*9bd9e0deSMauro Carvalho Chehab module_spmi_driver(hi6421_spmi_pmic_driver); 70*9bd9e0deSMauro Carvalho Chehab 71*9bd9e0deSMauro Carvalho Chehab MODULE_DESCRIPTION("HiSilicon Hi6421v600 SPMI PMIC driver"); 72*9bd9e0deSMauro Carvalho Chehab MODULE_LICENSE("GPL v2"); 73