diff mbox

[v5,1/2] mfd: act8945a: add Active-semi ACT8945A PMIC MFD driver

Message ID 1452747845-2962-2-git-send-email-wenyou.yang@atmel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Wenyou Yang Jan. 14, 2016, 5:04 a.m. UTC
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>
---

Changes in v5:
 - change depends on to 'I2C=y'.

Changes in v4:
 - add a space before .compatible.
 - collect Reviewed-by from Krzysztof Kozlowski.

Changes in v3: None
Changes in v2:
 - add more help information in Kconfig.
 - update the file header with short version license and author line.
 - remove unused structure members (dev, i2c_client) of stuct act8945a_dev.
 - use define "PLATFORM_DEVID_NONE" for mfd_add_devices(), instead of '-1'.
 - use more explicit info to indicate the failure to add sub devices.
 - remove the unnecessary print out.
 - substitute MODULE_LICENSE("GPL") for MODULE_LICENSE("GPL v2").

 drivers/mfd/Kconfig          |   11 +++++
 drivers/mfd/Makefile         |    1 +
 drivers/mfd/act8945a.c       |  109 ++++++++++++++++++++++++++++++++++++++++++
 include/linux/mfd/act8945a.h |   21 ++++++++
 4 files changed, 142 insertions(+)
 create mode 100644 drivers/mfd/act8945a.c
 create mode 100644 include/linux/mfd/act8945a.h

Comments

Peter Korsgaard Jan. 14, 2016, 1:35 p.m. UTC | #1
>>>>> "Wenyou" == Wenyou Yang <wenyou.yang@atmel.com> writes:

 > 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>
 > ---

 > Changes in v5:
 >  - change depends on to 'I2C=y'.

Why not make it a tristate instead? Having regulators as modules is
perhaps not a very wise thing to do, but conceptually I don't see why
this code couldn't be a module.
 
 > +config MFD_ACT8945A
 > +	bool "Active-semi ACT8945A"
 > +	select MFD_CORE
 > +	select REGMAP_I2C
 > +	depends on I2C=y && 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.
 > +

[snip]

> +++ b/drivers/mfd/act8945a.c
 > @@ -0,0 +1,109 @@
 > +/*
 > + * 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/act8945a.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-pmic",
 > +		.of_compatible = "active-semi,act8945a-regulator",
 > +	},
 > +	{
 > +		.name = "act8945a-charger",
 > +		.of_compatible = "active-semi,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)
 > +{
 > +	struct act8945a_dev *act8945a;
 > +	int ret;
 > +
 > +	act8945a = devm_kzalloc(&i2c->dev, sizeof(*act8945a), GFP_KERNEL);
 > +	if (!act8945a)
 > +		return -ENOMEM;
 > +

What is the point of this structure (and the header file)? Can't the
subdevices just do dev_get_regmap(dev->parent)? regulator_register()
afaik already does this by default.
Wenyou Yang Jan. 15, 2016, 1:16 a.m. UTC | #2
Hi Peter,

> -----Original Message-----

> From: Peter Korsgaard [mailto:jacmet@gmail.com] On Behalf Of Peter Korsgaard

> Sent: 2016?1?14? 21:35

> To: Yang, Wenyou <Wenyou.Yang@atmel.com>

> Cc: Lee Jones <lee.jones@linaro.org>; Rob Herring <robh+dt@kernel.org>;

> Pawel Moll <pawel.moll@arm.com>; Mark Rutland <mark.rutland@arm.com>; Ian

> Campbell <ijc+devicetree@hellion.org.uk>; Kumar Gala <galak@codeaurora.org>;

> devicetree@vger.kernel.org; Krzysztof Kozlowski <k.kozlowski@samsung.com>;

> Ferre, Nicolas <Nicolas.FERRE@atmel.com>; linux-kernel@vger.kernel.org;

> Javier Martinez Canillas <javier@dowhile0.org>; linux-arm-

> kernel@lists.infradead.org

> Subject: Re: [PATCH v5 1/2] mfd: act8945a: add Active-semi ACT8945A PMIC

> MFD driver

> 

> >>>>> "Wenyou" == Wenyou Yang <wenyou.yang@atmel.com> writes:

> 

>  > 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>  > ---

> 

>  > Changes in v5:

>  >  - change depends on to 'I2C=y'.

> 

> Why not make it a tristate instead? Having regulators as modules is perhaps not a

> very wise thing to do, but conceptually I don't see why this code couldn't be a

> module.


Yes, you are right. it can be use a tristate.

> 

>  > +config MFD_ACT8945A

>  > +	bool "Active-semi ACT8945A"

>  > +	select MFD_CORE

>  > +	select REGMAP_I2C

>  > +	depends on I2C=y && 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.

>  > +

> 

> [snip]

> 

> > +++ b/drivers/mfd/act8945a.c

>  > @@ -0,0 +1,109 @@

>  > +/*

>  > + * 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/act8945a.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-pmic",

>  > +		.of_compatible = "active-semi,act8945a-regulator",

>  > +	},

>  > +	{

>  > +		.name = "act8945a-charger",

>  > +		.of_compatible = "active-semi,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)

>  > +{

>  > +	struct act8945a_dev *act8945a;

>  > +	int ret;

>  > +

>  > +	act8945a = devm_kzalloc(&i2c->dev, sizeof(*act8945a), GFP_KERNEL);

>  > +	if (!act8945a)

>  > +		return -ENOMEM;

>  > +

> 

> What is the point of this structure (and the header file)? Can't the subdevices just

> do dev_get_regmap(dev->parent)? regulator_register() afaik already does this by

> default.


Yes, I re-read regulator_register() code. It did do dev_get_regmap(dev->parent).

I think this structure should be pointed by dev->parent, this structure is necessary.

Yes regulator driver should be simpler.

Moreover, it is used by another sub device, charger. Which don't such code.

> 

> --

> Bye, Peter Korsgaard



Best Regards,
Wenyou Yang
Peter Korsgaard Jan. 15, 2016, 7:58 a.m. UTC | #3
>>>>> "Yang," == Yang, Wenyou <Wenyou.Yang@atmel.com> writes:

Hi,

 >> Why not make it a tristate instead? Having regulators as modules is perhaps not a
 >> very wise thing to do, but conceptually I don't see why this code couldn't be a
 >> module.

 > Yes, you are right. it can be use a tristate.

Ok, good.

>> > +	act8945a = devm_kzalloc(&i2c->dev, sizeof(*act8945a), GFP_KERNEL);
 >> > +	if (!act8945a)
 >> > +		return -ENOMEM;
 >> > +
 >> 
 >> What is the point of this structure (and the header file)? Can't the subdevices just
 >> do dev_get_regmap(dev->parent)? regulator_register() afaik already does this by
 >> default.

 > Yes, I re-read regulator_register() code. It did do dev_get_regmap(dev->parent).

 > I think this structure should be pointed by dev->parent, this structure is necessary.

 > Yes regulator driver should be simpler.

 > Moreover, it is used by another sub device, charger. Which don't such code.

But the charger driver can just as well do:

dev_get_regmap(dev->parent);

instead of:

dev_get_drvdata(pdev->dev.parent)->regmap.
Wenyou Yang Jan. 15, 2016, 8:38 a.m. UTC | #4
Hi Peter,

> -----Original Message-----

> From: Peter Korsgaard [mailto:jacmet@gmail.com] On Behalf Of Peter Korsgaard

> Sent: 2016?1?15? 15:58

> To: Yang, Wenyou <Wenyou.Yang@atmel.com>

> Cc: Lee Jones <lee.jones@linaro.org>; Rob Herring <robh+dt@kernel.org>;

> Pawel Moll <pawel.moll@arm.com>; Mark Rutland <mark.rutland@arm.com>; Ian

> Campbell <ijc+devicetree@hellion.org.uk>; Kumar Gala <galak@codeaurora.org>;

> devicetree@vger.kernel.org; Krzysztof Kozlowski <k.kozlowski@samsung.com>;

> Ferre, Nicolas <Nicolas.FERRE@atmel.com>; linux-kernel@vger.kernel.org;

> Javier Martinez Canillas <javier@dowhile0.org>; linux-arm-

> kernel@lists.infradead.org

> Subject: Re: [PATCH v5 1/2] mfd: act8945a: add Active-semi ACT8945A PMIC

> MFD driver

> 

> >>>>> "Yang," == Yang, Wenyou <Wenyou.Yang@atmel.com> writes:

> 

> Hi,

> 

>  >> Why not make it a tristate instead? Having regulators as modules is perhaps

> not a  >> very wise thing to do, but conceptually I don't see why this code couldn't

> be a  >> module.

> 

>  > Yes, you are right. it can be use a tristate.

> 

> Ok, good.

> 

> >> > +	act8945a = devm_kzalloc(&i2c->dev, sizeof(*act8945a),

> >> > +GFP_KERNEL);

>  >> > +	if (!act8945a)

>  >> > +		return -ENOMEM;

>  >> > +

>  >>

>  >> What is the point of this structure (and the header file)? Can't the subdevices

> just  >> do dev_get_regmap(dev->parent)? regulator_register() afaik already does

> this by  >> default.

> 

>  > Yes, I re-read regulator_register() code. It did do dev_get_regmap(dev-

> >parent).

> 

>  > I think this structure should be pointed by dev->parent, this structure is

> necessary.

> 

>  > Yes regulator driver should be simpler.

> 

>  > Moreover, it is used by another sub device, charger. Which don't such code.

> 

> But the charger driver can just as well do:

> 

> dev_get_regmap(dev->parent);

> 

> instead of:

> 

> dev_get_drvdata(pdev->dev.parent)->regmap.


Understand. 

Thank you!


Best Regards,
Wenyou Yang
Wenyou Yang Jan. 20, 2016, 7:26 a.m. UTC | #5
Hi Peter,

> -----Original Message-----

> From: Peter Korsgaard [mailto:jacmet@gmail.com] On Behalf Of Peter Korsgaard

> Sent: 2016?1?15? 15:58

> To: Yang, Wenyou <Wenyou.Yang@atmel.com>

> Cc: Lee Jones <lee.jones@linaro.org>; Rob Herring <robh+dt@kernel.org>;

> Pawel Moll <pawel.moll@arm.com>; Mark Rutland <mark.rutland@arm.com>; Ian

> Campbell <ijc+devicetree@hellion.org.uk>; Kumar Gala <galak@codeaurora.org>;

> devicetree@vger.kernel.org; Krzysztof Kozlowski <k.kozlowski@samsung.com>;

> Ferre, Nicolas <Nicolas.FERRE@atmel.com>; linux-kernel@vger.kernel.org;

> Javier Martinez Canillas <javier@dowhile0.org>; linux-arm-

> kernel@lists.infradead.org

> Subject: Re: [PATCH v5 1/2] mfd: act8945a: add Active-semi ACT8945A PMIC

> MFD driver

> 

> >>>>> "Yang," == Yang, Wenyou <Wenyou.Yang@atmel.com> writes:

> 

> Hi,

> 

>  >> Why not make it a tristate instead? Having regulators as modules is perhaps

> not a  >> very wise thing to do, but conceptually I don't see why this code couldn't

> be a  >> module.

> 

>  > Yes, you are right. it can be use a tristate.

> 

> Ok, good.

> 

> >> > +	act8945a = devm_kzalloc(&i2c->dev, sizeof(*act8945a),

> >> > +GFP_KERNEL);

>  >> > +	if (!act8945a)

>  >> > +		return -ENOMEM;

>  >> > +

>  >>

>  >> What is the point of this structure (and the header file)? Can't the subdevices

> just  >> do dev_get_regmap(dev->parent)? regulator_register() afaik already does

> this by  >> default.

> 

>  > Yes, I re-read regulator_register() code. It did do dev_get_regmap(dev-

> >parent).

> 

>  > I think this structure should be pointed by dev->parent, this structure is

> necessary.

> 

>  > Yes regulator driver should be simpler.

> 

>  > Moreover, it is used by another sub device, charger. Which don't such code.

> 

> But the charger driver can just as well do:

> 

> dev_get_regmap(dev->parent);

> 

> instead of:

> 

> dev_get_drvdata(pdev->dev.parent)->regmap.


For regulator, it works use the core do dev_get_regmap(dev->parent), but for charger, it need to export *act8945a.


Best Regards,
Wenyou Yang
Peter Korsgaard Jan. 20, 2016, 7:40 a.m. UTC | #6
>>>>> "Yang," == Yang, Wenyou <Wenyou.Yang@atmel.com> writes:

Hi,

>> But the charger driver can just as well do:
 >> 
 >> dev_get_regmap(dev->parent);
 >> 
 >> instead of:
 >> 
 >> dev_get_drvdata(pdev->dev.parent)->regmap.

 > For regulator, it works use the core do dev_get_regmap(dev->parent),
 > but for charger, it need to export *act8945a.

Why?

Just like the regulator core does, your battery driver can do:

dev_get_regmap(dev->parent);
Wenyou Yang Jan. 20, 2016, 7:50 a.m. UTC | #7
Hi Peter,

On 2016/1/20 15:40, Peter Korsgaard wrote:
>>>>>> "Yang," == Yang, Wenyou <Wenyou.Yang@atmel.com> writes:
> Hi,
>
>>> But the charger driver can just as well do:
>   >>
>   >> dev_get_regmap(dev->parent);
>   >>
>   >> instead of:
>   >>
>   >> dev_get_drvdata(pdev->dev.parent)->regmap.
>
>   > For regulator, it works use the core do dev_get_regmap(dev->parent),
>   > but for charger, it need to export *act8945a.
>
> Why?

There is a callback (*get_property)(...), who will read the charger 
register via regmap,

but it doesn't provide the argument for regmap.

include/linux/power_supply.h

struct power_supply_desc {
         [ ... ]
         int (*get_property)(struct power_supply *psy,
                              enum power_supply_property psp,
                              union power_supply_propval *val);
         [ ... ]

}

>
> Just like the regulator core does, your battery driver can do:
>
> dev_get_regmap(dev->parent);
>

Best Regards,
Wenyou Yang
Krzysztof Kozlowski Jan. 20, 2016, 7:53 a.m. UTC | #8
On 20.01.2016 16:50, Yang, Wenyou wrote:
> Hi Peter,
> 
> On 2016/1/20 15:40, Peter Korsgaard wrote:
>>>>>>> "Yang," == Yang, Wenyou <Wenyou.Yang@atmel.com> writes:
>> Hi,
>>
>>>> But the charger driver can just as well do:
>>   >>
>>   >> dev_get_regmap(dev->parent);
>>   >>
>>   >> instead of:
>>   >>
>>   >> dev_get_drvdata(pdev->dev.parent)->regmap.
>>
>>   > For regulator, it works use the core do dev_get_regmap(dev->parent),
>>   > but for charger, it need to export *act8945a.
>>
>> Why?
> 
> There is a callback (*get_property)(...), who will read the charger
> register via regmap,
> 
> but it doesn't provide the argument for regmap.
> 
> include/linux/power_supply.h
> 
> struct power_supply_desc {
>         [ ... ]
>         int (*get_property)(struct power_supply *psy,
>                              enum power_supply_property psp,
>                              union power_supply_propval *val);
>         [ ... ]
> 
> }
> 
>>
>> Just like the regulator core does, your battery driver can do:
>>
>> dev_get_regmap(dev->parent);
>>

Why can't you store the pointer to regmap as power supply driver data?
There is really no need for the structure containing only one pointer.

BR,
Krzysztof
diff mbox

Patch

diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 9ca66de..cd8762a 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -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
+	bool "Active-semi ACT8945A"
+	select MFD_CORE
+	select REGMAP_I2C
+	depends on I2C=y && 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
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 0f230a6..2f1ca82 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -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
index 0000000..f5745b1
--- /dev/null
+++ b/drivers/mfd/act8945a.c
@@ -0,0 +1,109 @@ 
+/*
+ * 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/act8945a.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-pmic",
+		.of_compatible = "active-semi,act8945a-regulator",
+	},
+	{
+		.name = "act8945a-charger",
+		.of_compatible = "active-semi,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)
+{
+	struct act8945a_dev *act8945a;
+	int ret;
+
+	act8945a = devm_kzalloc(&i2c->dev, sizeof(*act8945a), GFP_KERNEL);
+	if (!act8945a)
+		return -ENOMEM;
+
+	i2c_set_clientdata(i2c, act8945a);
+
+	act8945a->regmap = devm_regmap_init_i2c(i2c, &act8945a_regmap_config);
+	if (IS_ERR(act8945a->regmap)) {
+		ret = PTR_ERR(act8945a->regmap);
+		dev_err(&i2c->dev, "regmap init failed: %d\n", ret);
+		return ret;
+	}
+
+	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");
diff --git a/include/linux/mfd/act8945a.h b/include/linux/mfd/act8945a.h
new file mode 100644
index 0000000..5f67009
--- /dev/null
+++ b/include/linux/mfd/act8945a.h
@@ -0,0 +1,21 @@ 
+/*
+ * 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.
+ */
+
+#ifndef _LINUX_MFD_ACT8945A_H
+#define _LINUX_MFD_ACT8945A_H
+
+struct act8945a_dev {
+	struct regmap *regmap;
+};
+
+#endif