aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorGuodong Xu <guodong.xu@linaro.org>2014-09-01 04:28:34 -0400
committerLee Jones <lee.jones@linaro.org>2014-09-26 03:23:43 -0400
commit8bdf87b400271ebc7fbf71e117c299d19a97ebb4 (patch)
tree236c32fe5eaf83e13a949cf95a8068afd92f9a68 /drivers
parent0709b048cea5a368e078e10fa25adc030392125a (diff)
mfd: Add HI6421 PMIC Core driver
This adds driver to support HiSilicon Hi6421 PMIC. Hi6421 includes multi- functions, such as regulators, codec, ADCs, Coulomb counter, etc. This driver includes core APIs _only_. Drivers for individul components, like voltage regulators, are implemented in corresponding driver directories and files. Registers in Hi6421 are memory mapped, so using regmap-mmio API. Signed-off-by: Guodong Xu <guodong.xu@linaro.org> Signed-off-by: Lee Jones <lee.jones@linaro.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mfd/Kconfig13
-rw-r--r--drivers/mfd/Makefile1
-rw-r--r--drivers/mfd/hi6421-pmic-core.c113
3 files changed, 127 insertions, 0 deletions
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 049796a28215..609b7a2144d6 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -210,6 +210,19 @@ config MFD_MC13XXX_I2C
210 help 210 help
211 Select this if your MC13xxx is connected via an I2C bus. 211 Select this if your MC13xxx is connected via an I2C bus.
212 212
213config MFD_HI6421_PMIC
214 tristate "HiSilicon Hi6421 PMU/Codec IC"
215 depends on OF
216 select MFD_CORE
217 select REGMAP_MMIO
218 help
219 Add support for HiSilicon Hi6421 PMIC. Hi6421 includes multi-
220 functions, such as regulators, RTC, codec, Coulomb counter, etc.
221 This driver includes core APIs _only_. You have to select
222 individul components like voltage regulators under corresponding
223 menus in order to enable them.
224 We communicate with the Hi6421 via memory-mapped I/O.
225
213config HTC_EGPIO 226config HTC_EGPIO
214 bool "HTC EGPIO support" 227 bool "HTC EGPIO support"
215 depends on GPIOLIB && ARM 228 depends on GPIOLIB && ARM
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index bd111213bd58..1d11a247abbb 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -172,6 +172,7 @@ obj-$(CONFIG_MFD_AS3722) += as3722.o
172obj-$(CONFIG_MFD_STW481X) += stw481x.o 172obj-$(CONFIG_MFD_STW481X) += stw481x.o
173obj-$(CONFIG_MFD_IPAQ_MICRO) += ipaq-micro.o 173obj-$(CONFIG_MFD_IPAQ_MICRO) += ipaq-micro.o
174obj-$(CONFIG_MFD_MENF21BMC) += menf21bmc.o 174obj-$(CONFIG_MFD_MENF21BMC) += menf21bmc.o
175obj-$(CONFIG_MFD_HI6421_PMIC) += hi6421-pmic-core.o
175 176
176intel-soc-pmic-objs := intel_soc_pmic_core.o intel_soc_pmic_crc.o 177intel-soc-pmic-objs := intel_soc_pmic_core.o intel_soc_pmic_crc.o
177obj-$(CONFIG_INTEL_SOC_PMIC) += intel-soc-pmic.o 178obj-$(CONFIG_INTEL_SOC_PMIC) += intel-soc-pmic.o
diff --git a/drivers/mfd/hi6421-pmic-core.c b/drivers/mfd/hi6421-pmic-core.c
new file mode 100644
index 000000000000..321a2656fd00
--- /dev/null
+++ b/drivers/mfd/hi6421-pmic-core.c
@@ -0,0 +1,113 @@
1/*
2 * Device driver for Hi6421 IC
3 *
4 * Copyright (c) <2011-2014> HiSilicon Technologies Co., Ltd.
5 * http://www.hisilicon.com
6 * Copyright (c) <2013-2014> Linaro Ltd.
7 * http://www.linaro.org
8 *
9 * Author: Guodong Xu <guodong.xu@linaro.org>
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope it will be useful, but WITHOUT
17 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
19 * more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program. If not, see <http://www.gnu.org/licenses/>.
23 */
24
25#include <linux/device.h>
26#include <linux/err.h>
27#include <linux/mfd/core.h>
28#include <linux/module.h>
29#include <linux/of.h>
30#include <linux/platform_device.h>
31#include <linux/regmap.h>
32#include <linux/mfd/hi6421-pmic.h>
33
34static const struct mfd_cell hi6421_devs[] = {
35 { .name = "hi6421-regulator", },
36};
37
38static struct regmap_config hi6421_regmap_config = {
39 .reg_bits = 32,
40 .reg_stride = 4,
41 .val_bits = 8,
42 .max_register = HI6421_REG_TO_BUS_ADDR(HI6421_REG_MAX),
43};
44
45static int hi6421_pmic_probe(struct platform_device *pdev)
46{
47 struct hi6421_pmic *pmic;
48 struct resource *res;
49 void __iomem *base;
50 int ret;
51
52 pmic = devm_kzalloc(&pdev->dev, sizeof(*pmic), GFP_KERNEL);
53 if (!pmic)
54 return -ENOMEM;
55
56 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
57 base = devm_ioremap_resource(&pdev->dev, res);
58 if (IS_ERR(base))
59 return PTR_ERR(base);
60
61 pmic->regmap = devm_regmap_init_mmio_clk(&pdev->dev, NULL, base,
62 &hi6421_regmap_config);
63 if (IS_ERR(pmic->regmap)) {
64 dev_err(&pdev->dev,
65 "regmap init failed: %ld\n", PTR_ERR(pmic->regmap));
66 return PTR_ERR(pmic->regmap);
67 }
68
69 /* set over-current protection debounce 8ms */
70 regmap_update_bits(pmic->regmap, HI6421_OCP_DEB_CTRL_REG,
71 (HI6421_OCP_DEB_SEL_MASK
72 | HI6421_OCP_EN_DEBOUNCE_MASK
73 | HI6421_OCP_AUTO_STOP_MASK),
74 (HI6421_OCP_DEB_SEL_8MS
75 | HI6421_OCP_EN_DEBOUNCE_ENABLE));
76
77 platform_set_drvdata(pdev, pmic);
78
79 ret = mfd_add_devices(&pdev->dev, 0, hi6421_devs,
80 ARRAY_SIZE(hi6421_devs), NULL, 0, NULL);
81 if (ret) {
82 dev_err(&pdev->dev, "add mfd devices failed: %d\n", ret);
83 return ret;
84 }
85
86 return 0;
87}
88
89static int hi6421_pmic_remove(struct platform_device *pdev)
90{
91 mfd_remove_devices(&pdev->dev);
92
93 return 0;
94}
95
96static struct of_device_id of_hi6421_pmic_match_tbl[] = {
97 { .compatible = "hisilicon,hi6421-pmic", },
98 { },
99};
100
101static struct platform_driver hi6421_pmic_driver = {
102 .driver = {
103 .name = "hi6421_pmic",
104 .of_match_table = of_hi6421_pmic_match_tbl,
105 },
106 .probe = hi6421_pmic_probe,
107 .remove = hi6421_pmic_remove,
108};
109module_platform_driver(hi6421_pmic_driver);
110
111MODULE_AUTHOR("Guodong Xu <guodong.xu@linaro.org>");
112MODULE_DESCRIPTION("Hi6421 PMIC driver");
113MODULE_LICENSE("GPL v2");