-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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>
- Loading branch information
Guodong Xu
authored and
Lee Jones
committed
Sep 26, 2014
1 parent
0709b04
commit 8bdf87b
Showing
4 changed files
with
168 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
/* | ||
* Device driver for Hi6421 IC | ||
* | ||
* Copyright (c) <2011-2014> HiSilicon Technologies Co., Ltd. | ||
* http://www.hisilicon.com | ||
* Copyright (c) <2013-2014> Linaro Ltd. | ||
* http://www.linaro.org | ||
* | ||
* Author: Guodong Xu <guodong.xu@linaro.org> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation; either version 2 of the License, or | ||
* (at your option) any later version. | ||
* | ||
* This program is distributed in the hope it will be useful, but WITHOUT | ||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
* more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
*/ | ||
|
||
#include <linux/device.h> | ||
#include <linux/err.h> | ||
#include <linux/mfd/core.h> | ||
#include <linux/module.h> | ||
#include <linux/of.h> | ||
#include <linux/platform_device.h> | ||
#include <linux/regmap.h> | ||
#include <linux/mfd/hi6421-pmic.h> | ||
|
||
static const struct mfd_cell hi6421_devs[] = { | ||
{ .name = "hi6421-regulator", }, | ||
}; | ||
|
||
static struct regmap_config hi6421_regmap_config = { | ||
.reg_bits = 32, | ||
.reg_stride = 4, | ||
.val_bits = 8, | ||
.max_register = HI6421_REG_TO_BUS_ADDR(HI6421_REG_MAX), | ||
}; | ||
|
||
static int hi6421_pmic_probe(struct platform_device *pdev) | ||
{ | ||
struct hi6421_pmic *pmic; | ||
struct resource *res; | ||
void __iomem *base; | ||
int ret; | ||
|
||
pmic = devm_kzalloc(&pdev->dev, sizeof(*pmic), GFP_KERNEL); | ||
if (!pmic) | ||
return -ENOMEM; | ||
|
||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
base = devm_ioremap_resource(&pdev->dev, res); | ||
if (IS_ERR(base)) | ||
return PTR_ERR(base); | ||
|
||
pmic->regmap = devm_regmap_init_mmio_clk(&pdev->dev, NULL, base, | ||
&hi6421_regmap_config); | ||
if (IS_ERR(pmic->regmap)) { | ||
dev_err(&pdev->dev, | ||
"regmap init failed: %ld\n", PTR_ERR(pmic->regmap)); | ||
return PTR_ERR(pmic->regmap); | ||
} | ||
|
||
/* set over-current protection debounce 8ms */ | ||
regmap_update_bits(pmic->regmap, HI6421_OCP_DEB_CTRL_REG, | ||
(HI6421_OCP_DEB_SEL_MASK | ||
| HI6421_OCP_EN_DEBOUNCE_MASK | ||
| HI6421_OCP_AUTO_STOP_MASK), | ||
(HI6421_OCP_DEB_SEL_8MS | ||
| HI6421_OCP_EN_DEBOUNCE_ENABLE)); | ||
|
||
platform_set_drvdata(pdev, pmic); | ||
|
||
ret = mfd_add_devices(&pdev->dev, 0, hi6421_devs, | ||
ARRAY_SIZE(hi6421_devs), NULL, 0, NULL); | ||
if (ret) { | ||
dev_err(&pdev->dev, "add mfd devices failed: %d\n", ret); | ||
return ret; | ||
} | ||
|
||
return 0; | ||
} | ||
|
||
static int hi6421_pmic_remove(struct platform_device *pdev) | ||
{ | ||
mfd_remove_devices(&pdev->dev); | ||
|
||
return 0; | ||
} | ||
|
||
static struct of_device_id of_hi6421_pmic_match_tbl[] = { | ||
{ .compatible = "hisilicon,hi6421-pmic", }, | ||
{ }, | ||
}; | ||
|
||
static struct platform_driver hi6421_pmic_driver = { | ||
.driver = { | ||
.name = "hi6421_pmic", | ||
.of_match_table = of_hi6421_pmic_match_tbl, | ||
}, | ||
.probe = hi6421_pmic_probe, | ||
.remove = hi6421_pmic_remove, | ||
}; | ||
module_platform_driver(hi6421_pmic_driver); | ||
|
||
MODULE_AUTHOR("Guodong Xu <guodong.xu@linaro.org>"); | ||
MODULE_DESCRIPTION("Hi6421 PMIC driver"); | ||
MODULE_LICENSE("GPL v2"); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
/* | ||
* Header file for device driver Hi6421 PMIC | ||
* | ||
* Copyright (c) <2011-2014> HiSilicon Technologies Co., Ltd. | ||
* http://www.hisilicon.com | ||
* Copyright (c) <2013-2014> Linaro Ltd. | ||
* http://www.linaro.org | ||
* | ||
* Author: Guodong Xu <guodong.xu@linaro.org> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
*/ | ||
|
||
#ifndef __HI6421_PMIC_H | ||
#define __HI6421_PMIC_H | ||
|
||
/* Hi6421 registers are mapped to memory bus in 4 bytes stride */ | ||
#define HI6421_REG_TO_BUS_ADDR(x) (x << 2) | ||
|
||
/* Hi6421 maximum register number */ | ||
#define HI6421_REG_MAX 0xFF | ||
|
||
/* Hi6421 OCP (over current protection) and DEB (debounce) control register */ | ||
#define HI6421_OCP_DEB_CTRL_REG HI6421_REG_TO_BUS_ADDR(0x51) | ||
#define HI6421_OCP_DEB_SEL_MASK 0x0C | ||
#define HI6421_OCP_DEB_SEL_8MS 0x00 | ||
#define HI6421_OCP_DEB_SEL_16MS 0x04 | ||
#define HI6421_OCP_DEB_SEL_32MS 0x08 | ||
#define HI6421_OCP_DEB_SEL_64MS 0x0C | ||
#define HI6421_OCP_EN_DEBOUNCE_MASK 0x02 | ||
#define HI6421_OCP_EN_DEBOUNCE_ENABLE 0x02 | ||
#define HI6421_OCP_AUTO_STOP_MASK 0x01 | ||
#define HI6421_OCP_AUTO_STOP_ENABLE 0x01 | ||
|
||
struct hi6421_pmic { | ||
struct regmap *regmap; | ||
}; | ||
|
||
#endif /* __HI6421_PMIC_H */ |