mfd: act8945a: Add Active-semi ACT8945A PMIC MFD driver
authorWenyou Yang <wenyou.yang@atmel.com>
Fri, 5 Feb 2016 03:36:29 +0000 (11:36 +0800)
committerLee Jones <lee.jones@linaro.org>
Wed, 16 Mar 2016 08:50:25 +0000 (08:50 +0000)
This patch adds support for the Active-semi ACT8945A PMIC.
It is a Multi Function Device with the following subdevices:
 - Regulator
 - Charger

It is interfaced to the host controller using I2C interface,
ACT8945A is a child device of the I2C.

Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
Acked-by: Peter Korsgaard <peter@korsgaard.com>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
drivers/mfd/Kconfig
drivers/mfd/Makefile
drivers/mfd/act8945a.c [new file with mode: 0644]

index 3719cc86be0b45e3d776eb932682f6299a9bb094..aa21dc55eb15bb8f929a8d6abbc678f88b6eb7f2 100644 (file)
@@ -18,6 +18,17 @@ config MFD_CS5535
          This is the core driver for CS5535/CS5536 MFD functions.  This is
           necessary for using the board's GPIO and MFGPT functionality.
 
+config MFD_ACT8945A
+       tristate "Active-semi ACT8945A"
+       select MFD_CORE
+       select REGMAP_I2C
+       depends on I2C && OF
+       help
+         Support for the ACT8945A PMIC from Active-semi. This device
+         features three step-down DC/DC converters and four low-dropout
+         linear regulators, along with a complete ActivePath battery
+         charger.
+
 config MFD_AS3711
        bool "AMS AS3711"
        select MFD_CORE
index d2ddcf45ccd1753898b2d73cce4aa0da8201f29b..5eaa6465d0a6e2bf20df77951b573b4c0ccc477f 100644 (file)
@@ -6,6 +6,7 @@
 obj-$(CONFIG_MFD_88PM860X)     += 88pm860x.o
 obj-$(CONFIG_MFD_88PM800)      += 88pm800.o 88pm80x.o
 obj-$(CONFIG_MFD_88PM805)      += 88pm805.o 88pm80x.o
+obj-$(CONFIG_MFD_ACT8945A)     += act8945a.o
 obj-$(CONFIG_MFD_SM501)                += sm501.o
 obj-$(CONFIG_MFD_ASIC3)                += asic3.o tmio_core.o
 obj-$(CONFIG_MFD_BCM590XX)     += bcm590xx.o
diff --git a/drivers/mfd/act8945a.c b/drivers/mfd/act8945a.c
new file mode 100644 (file)
index 0000000..525b546
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * MFD driver for Active-semi ACT8945a PMIC
+ *
+ * Copyright (C) 2015 Atmel Corporation.
+ *
+ * Author: Wenyou Yang <wenyou.yang@atmel.com>
+ *
+ * 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.
+ */
+
+#include <linux/i2c.h>
+#include <linux/mfd/core.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/regmap.h>
+
+static const struct mfd_cell act8945a_devs[] = {
+       {
+               .name = "act8945a-regulator",
+       },
+       {
+               .name = "act8945a-charger",
+       },
+};
+
+static const struct regmap_config act8945a_regmap_config = {
+       .reg_bits = 8,
+       .val_bits = 8,
+};
+
+static int act8945a_i2c_probe(struct i2c_client *i2c,
+                             const struct i2c_device_id *id)
+{
+       int ret;
+       struct regmap *regmap;
+
+       regmap = devm_regmap_init_i2c(i2c, &act8945a_regmap_config);
+       if (IS_ERR(regmap)) {
+               ret = PTR_ERR(regmap);
+               dev_err(&i2c->dev, "regmap init failed: %d\n", ret);
+               return ret;
+       }
+
+       i2c_set_clientdata(i2c, regmap);
+
+       ret = mfd_add_devices(&i2c->dev, PLATFORM_DEVID_NONE, act8945a_devs,
+                             ARRAY_SIZE(act8945a_devs), NULL, 0, NULL);
+       if (ret) {
+               dev_err(&i2c->dev, "Failed to add sub devices\n");
+               return ret;
+       }
+
+       return 0;
+}
+
+static int act8945a_i2c_remove(struct i2c_client *i2c)
+{
+       mfd_remove_devices(&i2c->dev);
+
+       return 0;
+}
+
+static const struct i2c_device_id act8945a_i2c_id[] = {
+       { "act8945a", 0 },
+       {}
+};
+MODULE_DEVICE_TABLE(i2c, act8945a_i2c_id);
+
+static const struct of_device_id act8945a_of_match[] = {
+       { .compatible = "active-semi,act8945a", },
+       {},
+};
+MODULE_DEVICE_TABLE(of, act8945a_of_match);
+
+static struct i2c_driver act8945a_i2c_driver = {
+       .driver = {
+                  .name = "act8945a",
+                  .of_match_table = of_match_ptr(act8945a_of_match),
+       },
+       .probe = act8945a_i2c_probe,
+       .remove = act8945a_i2c_remove,
+       .id_table = act8945a_i2c_id,
+};
+
+static int __init act8945a_i2c_init(void)
+{
+       return i2c_add_driver(&act8945a_i2c_driver);
+}
+subsys_initcall(act8945a_i2c_init);
+
+static void __exit act8945a_i2c_exit(void)
+{
+       i2c_del_driver(&act8945a_i2c_driver);
+}
+module_exit(act8945a_i2c_exit);
+
+MODULE_DESCRIPTION("ACT8945A PMIC multi-function driver");
+MODULE_AUTHOR("Wenyou Yang <wenyou.yang@atmel.com>");
+MODULE_LICENSE("GPL");