2 * Device driver for Hi6421 IC
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
9 * Author: Guodong Xu <guodong.xu@linaro.org>
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.
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
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/>.
25 #include <linux/device.h>
26 #include <linux/err.h>
27 #include <linux/mfd/core.h>
28 #include <linux/module.h>
30 #include <linux/platform_device.h>
31 #include <linux/regmap.h>
32 #include <linux/mfd/hi6421-pmic.h>
34 static const struct mfd_cell hi6421_devs
[] = {
35 { .name
= "hi6421-regulator", },
38 static const struct regmap_config hi6421_regmap_config
= {
42 .max_register
= HI6421_REG_TO_BUS_ADDR(HI6421_REG_MAX
),
45 static int hi6421_pmic_probe(struct platform_device
*pdev
)
47 struct hi6421_pmic
*pmic
;
52 pmic
= devm_kzalloc(&pdev
->dev
, sizeof(*pmic
), GFP_KERNEL
);
56 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
57 base
= devm_ioremap_resource(&pdev
->dev
, res
);
61 pmic
->regmap
= devm_regmap_init_mmio_clk(&pdev
->dev
, NULL
, base
,
62 &hi6421_regmap_config
);
63 if (IS_ERR(pmic
->regmap
)) {
65 "regmap init failed: %ld\n", PTR_ERR(pmic
->regmap
));
66 return PTR_ERR(pmic
->regmap
);
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
));
77 platform_set_drvdata(pdev
, pmic
);
79 ret
= mfd_add_devices(&pdev
->dev
, 0, hi6421_devs
,
80 ARRAY_SIZE(hi6421_devs
), NULL
, 0, NULL
);
82 dev_err(&pdev
->dev
, "add mfd devices failed: %d\n", ret
);
89 static int hi6421_pmic_remove(struct platform_device
*pdev
)
91 mfd_remove_devices(&pdev
->dev
);
96 static const struct of_device_id of_hi6421_pmic_match_tbl
[] = {
97 { .compatible
= "hisilicon,hi6421-pmic", },
101 static struct platform_driver hi6421_pmic_driver
= {
103 .name
= "hi6421_pmic",
104 .of_match_table
= of_hi6421_pmic_match_tbl
,
106 .probe
= hi6421_pmic_probe
,
107 .remove
= hi6421_pmic_remove
,
109 module_platform_driver(hi6421_pmic_driver
);
111 MODULE_AUTHOR("Guodong Xu <guodong.xu@linaro.org>");
112 MODULE_DESCRIPTION("Hi6421 PMIC driver");
113 MODULE_LICENSE("GPL v2");