[PATCH v3 3/3] mfd: max8998: Add support for Device Tree

Sachin Kamat sachin.kamat at linaro.org
Mon Jun 24 10:54:25 EDT 2013


Hi Tomasz,

On 24 June 2013 18:09, Tomasz Figa <t.figa at samsung.com> wrote:
> This patch adds Device Tree support to max8998 driver.
>
> Signed-off-by: Tomasz Figa <t.figa at samsung.com>
> ---
>  Documentation/devicetree/bindings/mfd/max8998.txt | 108 ++++++++++++++++
>  drivers/mfd/max8998.c                             |  75 +++++++++++-
>  drivers/regulator/max8998.c                       | 143 +++++++++++++++++++++-
>  drivers/rtc/rtc-max8998.c                         |   2 +-
>  include/linux/mfd/max8998-private.h               |   2 +
>  include/linux/mfd/max8998.h                       |   2 +
>  6 files changed, 325 insertions(+), 7 deletions(-)
>  create mode 100644 Documentation/devicetree/bindings/mfd/max8998.txt
>
> diff --git a/Documentation/devicetree/bindings/mfd/max8998.txt b/Documentation/devicetree/bindings/mfd/max8998.txt
> new file mode 100644
> index 0000000..5304558
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/mfd/max8998.txt
> @@ -0,0 +1,108 @@
> +* Maxim MAX8998, National/TI LP3974 Voltage and Current Regulator
> +
> +The Maxim MAX8998 is a multi-function device which includes volatage and

s/volatage/voltage

> +current regulators, rtc, charger controller and other sub-blocks. It is
> +interfaced to the host controller using a i2c interface. Each sub-block is
> +addressed by the host system using different i2c slave address. This document
> +describes the bindings for 'pmic' sub-block of max8998.
> +
> +Required properties:
> +- compatible: Should be one of the following:
> +    - "maxim,max8998" for Maxim MAX8998
> +    - "national,lp3974" or "ti,lp3974" for National/TI LP3974.
> +- reg: Specifies the i2c slave address of the pmic block. It should be 0x66.
> +
> +Optional properties:
> +- interrupt-parent: Specifies the phandle of the interrupt controller to which
> +  the interrupts from max8998 are delivered to.
> +- interrupts: Interrupt specifiers for two interrupt sources.
> +  - First interrupt specifier is for main interrupt.
> +  - Second interrupt specifier is for power-on/-off interrupt.
> +- max8998,pmic-buck1-dvs-gpios: GPIO specifiers for two host gpios used
> +  for buck 1 dvs. The format of the gpio specifier depends in the gpio

s/in/on

> +  controller.
> +- max8998,pmic-buck2-dvs-gpio: GPIO specifier for host gpio used
> +  for buck 2 dvs. The format of the gpio specifier depends in the gpio

ditto

> +  controller.
> +- max8998,pmic-buck1-default-dvs-idx: Default voltage setting selected from
> +  the possible 4 options selectable by the dvs gpios. The value of this
> +  property should be between 0 and 3. If not specified or if out of range, the
> +  default value of this property is set to 0.

[snip]

> +static struct max8998_platform_data *max8998_i2c_parse_dt_pdata(
> +                                                       struct device *dev)
> +{
> +       struct max8998_platform_data *pd;
> +
> +       pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL);
> +       if (!pd) {
> +               dev_err(dev, "could not allocate memory for pdata\n");

Redundant print.

> +               return ERR_PTR(-ENOMEM);
> +       }
> +
> +       pd->ono = irq_of_parse_and_map(dev->of_node, 1);
> +
> +       /*
> +        * ToDo: the 'wakeup' member in the platform data is more of a linux
> +        * specfic information. Hence, there is no binding for that yet and
> +        * not parsed here.
> +        */
> +
> +       return pd;
> +}
> +#else
> +static struct max8998_platform_data *max8998_i2c_parse_dt_pdata(
> +                                                       struct device *dev)
> +{
> +       return 0;

return NULL for syntactic correctness.

> +}
> +#endif
> +
> +static inline int max8998_i2c_get_driver_data(struct i2c_client *i2c,
> +                                               const struct i2c_device_id *id)
> +{
> +       if (i2c->dev.of_node) {
> +               const struct of_device_id *match;
> +               match = of_match_node(max8998_dt_match, i2c->dev.of_node);
> +               return (int)match->data;
> +       }
> +
> +       return (int)id->driver_data;
> +}
> +
>  static int max8998_i2c_probe(struct i2c_client *i2c,
>                             const struct i2c_device_id *id)
>  {
> @@ -139,11 +200,20 @@ static int max8998_i2c_probe(struct i2c_client *i2c,
>         if (max8998 == NULL)
>                 return -ENOMEM;
>
> +       if (i2c->dev.of_node) {
> +               pdata = max8998_i2c_parse_dt_pdata(&i2c->dev);
> +               if (IS_ERR(pdata)) {
> +                       ret = PTR_ERR(pdata);
> +                       goto err;
> +               }
> +       }
> +
>         i2c_set_clientdata(i2c, max8998);
>         max8998->dev = &i2c->dev;
>         max8998->i2c = i2c;
>         max8998->irq = i2c->irq;
> -       max8998->type = id->driver_data;
> +       max8998->type = max8998_i2c_get_driver_data(i2c, id);
> +       max8998->pdata = pdata;
>         if (pdata) {
>                 max8998->ono = pdata->ono;
>                 max8998->irq_base = pdata->irq_base;
> @@ -158,7 +228,7 @@ static int max8998_i2c_probe(struct i2c_client *i2c,
>
>         pm_runtime_set_active(max8998->dev);
>
> -       switch (id->driver_data) {
> +       switch (max8998->type) {
>         case TYPE_LP3974:
>                 ret = mfd_add_devices(max8998->dev, -1,
>                                       lp3974_devs, ARRAY_SIZE(lp3974_devs),
> @@ -314,6 +384,7 @@ static struct i2c_driver max8998_i2c_driver = {
>                    .name = "max8998",
>                    .owner = THIS_MODULE,
>                    .pm = &max8998_pm,
> +                  .of_match_table = of_match_ptr(max8998_dt_match),

Need to include <linux/of.h>.

-- 
With warm regards,
Sachin



More information about the linux-arm-kernel mailing list