mbox series

[v6,0/8] MFD: add driver for HiSilicon Hi6421v530 PMIC

Message ID 20170608220841.26531-1-guodong.xu@linaro.org
Headers show
Series MFD: add driver for HiSilicon Hi6421v530 PMIC | expand

Message

Guodong Xu June 8, 2017, 10:08 p.m. UTC
This patchset adds driver for HiSilicon Hi6421v530 PMIC.

Mainline kernel already has driver support to a similar chip, Hi6421.
Hi6421 and Hi6421v530 are both from the same vendor, HiSilicon, but
they are at different revisions. They both use the same Memory-mapped
I/O method to communicate with Main SoC. However, they differ quite a
lot in their regulator designs. Eg. they have completely different LDO
voltage points.

Patch 1 and 2 are hi6421-pmic cleaning up.
Patch 3 and 4 extends hi6421-pmic-core.c to support Hi6421v530 revision.
Patch 5 add hi6421v530-regulator.c driver for LDO regulators.
Patch 6 fixes an issue for hi6421 regulator, which is not related to v530
         but it's found in this review.
Patch 7 is dts change, it depends on and can be applied to hi3660/hikey960
        patchset [1].
Patch 8 enables the relevant config items.

[1], http://www.spinics.net/lists/devicetree/msg178303.html

Major changes in v6:
 - Patch 5, solve review comments from Mark Brown, add hi6421v530 regulator
     driver to module device table.
 - Add Acked-by from Arnd Bergmann

Major changes in v5:
 - Patch 3, solve review comments from Lee Johes

Major changes in v4:
 - put hi6421-pmic cleanup in separate patches.
 - solve review comments from Lee Johes.
 - regulator-name should not have '/' character. Otherwise it "Failed to
     create debugfs directory"

Major changes in v3:
 - in hi6421-pmic-core.c
    * use shorter license script.
    * arrange #include in alphabetical order.
    * using recommended error log messages from Lee Jones.
 - in hi6421v530-regulator.c
    * remove unused #include files
    * arrange remaining ones in alphabetical order.

Major changes in v2:
 - instead of writing a new driver, extend hi6421-pmic-core.c
     to support its v530 revision
 - update hi6421v530-regulator.c to use modern regulator driver
     design logics.

Guodong Xu (6):
  mfd: hi6421-pmic: cleanup: change license text to shorter form
  mfd: hi6421-pmic: cleanup: update dev_err messages
  dt-bindings: mfd: hi6421: Add hi6421v530 compatible string
  mfd: hi6421-pmic: add support for HiSilicon Hi6421v530
  regulator: hi6421: Describe consumed platform device
  arm64: defconfig: enable support hi6421v530 PMIC

Wang Xiaoyin (2):
  regulator: hi6421v530: add driver for hi6421v530 voltage regulator
  arm64: dts: hikey960: add device node for pmic and regulators

 Documentation/devicetree/bindings/mfd/hi6421.txt  |   4 +-
 arch/arm64/boot/dts/hisilicon/hi3660-hikey960.dts |  46 +++++
 arch/arm64/configs/defconfig                      |   2 +
 drivers/mfd/hi6421-pmic-core.c                    |  89 +++++----
 drivers/regulator/Kconfig                         |  10 +
 drivers/regulator/Makefile                        |   1 +
 drivers/regulator/hi6421-regulator.c              |   7 +
 drivers/regulator/hi6421v530-regulator.c          | 214 ++++++++++++++++++++++
 include/linux/mfd/hi6421-pmic.h                   |   5 +
 9 files changed, 345 insertions(+), 33 deletions(-)
 create mode 100644 drivers/regulator/hi6421v530-regulator.c

-- 
2.10.2

Comments

Guodong Xu June 26, 2017, 1:33 p.m. UTC | #1
Hi, Lee

Sorry to disturb. May I get some of your bandwidth on this patch? Does
it looks good or needs more tweak?

Other patches in this patchset, dts, regulator, have been integrated
into linux-next. So, only this one and the patch 8/8 of defconfig [1]
need your special attention.

[1] defconfig: https://lkml.org/lkml/2017/6/8/1077

Thank you.

Best regards,
Guodong

On Fri, Jun 9, 2017 at 6:08 AM, Guodong Xu <guodong.xu@linaro.org> wrote:
> Add support for HiSilicon Hi6421v530 PMIC. Hi6421v530 communicates with

> main SoC via memory-mapped I/O.

>

> Hi6421v530 and Hi6421 are PMIC chips from the same vendor, HiSilicon,

> but at different revisions. They share the same memory-mapped I/O

> design. They differ in integrated devices, such as regulator details,

> LDO voltage points.

>

> Signed-off-by: Wang Xiaoyin <hw.wangxiaoyin@hisilicon.com>

> Signed-off-by: Guodong Xu <guodong.xu@linaro.org>

> Acked-by: Arnd Bergmann <arnd@arndb.de>

> ---

>  drivers/mfd/hi6421-pmic-core.c  | 70 ++++++++++++++++++++++++++++++-----------

>  include/linux/mfd/hi6421-pmic.h |  5 +++

>  2 files changed, 57 insertions(+), 18 deletions(-)

>

> diff --git a/drivers/mfd/hi6421-pmic-core.c b/drivers/mfd/hi6421-pmic-core.c

> index b1139d4..6fb7ba2 100644

> --- a/drivers/mfd/hi6421-pmic-core.c

> +++ b/drivers/mfd/hi6421-pmic-core.c

> @@ -1,9 +1,9 @@

>  /*

> - * Device driver for Hi6421 IC

> + * Device driver for Hi6421 PMIC

>   *

>   * Copyright (c) <2011-2014> HiSilicon Technologies Co., Ltd.

>   *              http://www.hisilicon.com

> - * Copyright (c) <2013-2014> Linaro Ltd.

> + * Copyright (c) <2013-2017> Linaro Ltd.

>   *              http://www.linaro.org

>   *

>   * Author: Guodong Xu <guodong.xu@linaro.org>

> @@ -16,16 +16,20 @@

>  #include <linux/device.h>

>  #include <linux/err.h>

>  #include <linux/mfd/core.h>

> +#include <linux/mfd/hi6421-pmic.h>

>  #include <linux/module.h>

> -#include <linux/of.h>

> +#include <linux/of_device.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 const struct mfd_cell hi6421v530_devs[] = {

> +       { .name = "hi6421v530-regulator", },

> +};

> +

>  static const struct regmap_config hi6421_regmap_config = {

>         .reg_bits = 32,

>         .reg_stride = 4,

> @@ -33,12 +37,33 @@ static const struct regmap_config hi6421_regmap_config = {

>         .max_register = HI6421_REG_TO_BUS_ADDR(HI6421_REG_MAX),

>  };

>

> +static const struct of_device_id of_hi6421_pmic_match[] = {

> +       {

> +               .compatible = "hisilicon,hi6421-pmic",

> +               .data = (void *)HI6421

> +       },

> +       {

> +               .compatible = "hisilicon,hi6421v530-pmic",

> +               .data = (void *)HI6421_V530

> +       },

> +       { },

> +};

> +MODULE_DEVICE_TABLE(of, of_hi6421_pmic_match);

> +

>  static int hi6421_pmic_probe(struct platform_device *pdev)

>  {

>         struct hi6421_pmic *pmic;

>         struct resource *res;

> +       const struct of_device_id *id;

> +       const struct mfd_cell *subdevs;

> +       enum hi6421_type type;

>         void __iomem *base;

> -       int ret;

> +       int n_subdevs, ret;

> +

> +       id = of_match_device(of_hi6421_pmic_match, &pdev->dev);

> +       if (!id)

> +               return -EINVAL;

> +       type = (enum hi6421_type)id->data;

>

>         pmic = devm_kzalloc(&pdev->dev, sizeof(*pmic), GFP_KERNEL);

>         if (!pmic)

> @@ -57,18 +82,33 @@ static int hi6421_pmic_probe(struct platform_device *pdev)

>                 return PTR_ERR(pmic->regmap);

>         }

>

> -       /* set over-current protection debounce 8ms */

> -       regmap_update_bits(pmic->regmap, HI6421_OCP_DEB_CTRL_REG,

> +       platform_set_drvdata(pdev, pmic);

> +

> +       switch (type) {

> +       case HI6421:

> +               /* 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);

> +               subdevs = hi6421_devs;

> +               n_subdevs = ARRAY_SIZE(hi6421_devs);

> +               break;

> +       case HI6421_V530:

> +               subdevs = hi6421v530_devs;

> +               n_subdevs = ARRAY_SIZE(hi6421v530_devs);

> +               break;

> +       default:

> +               dev_err(&pdev->dev, "Unknown device type %d\n",

> +                                               (unsigned int)type);

> +               return -EINVAL;

> +       }

>

> -       ret = devm_mfd_add_devices(&pdev->dev, 0, hi6421_devs,

> -                                  ARRAY_SIZE(hi6421_devs), NULL, 0, NULL);

> +       ret = devm_mfd_add_devices(&pdev->dev, PLATFORM_DEVID_NONE,

> +                                  subdevs, n_subdevs, NULL, 0, NULL);

>         if (ret) {

>                 dev_err(&pdev->dev, "Failed to add child devices: %d\n", ret);

>                 return ret;

> @@ -77,16 +117,10 @@ static int hi6421_pmic_probe(struct platform_device *pdev)

>         return 0;

>  }

>

> -static const struct of_device_id of_hi6421_pmic_match_tbl[] = {

> -       { .compatible = "hisilicon,hi6421-pmic", },

> -       { },

> -};

> -MODULE_DEVICE_TABLE(of, of_hi6421_pmic_match_tbl);

> -

>  static struct platform_driver hi6421_pmic_driver = {

>         .driver = {

> -               .name   = "hi6421_pmic",

> -               .of_match_table = of_hi6421_pmic_match_tbl,

> +               .name = "hi6421_pmic",

> +               .of_match_table = of_hi6421_pmic_match,

>         },

>         .probe  = hi6421_pmic_probe,

>  };

> diff --git a/include/linux/mfd/hi6421-pmic.h b/include/linux/mfd/hi6421-pmic.h

> index 587273e..2580c08 100644

> --- a/include/linux/mfd/hi6421-pmic.h

> +++ b/include/linux/mfd/hi6421-pmic.h

> @@ -38,4 +38,9 @@ struct hi6421_pmic {

>         struct regmap           *regmap;

>  };

>

> +enum hi6421_type {

> +       HI6421 = 0,

> +       HI6421_V530,

> +};

> +

>  #endif         /* __HI6421_PMIC_H */

> --

> 2.10.2

>