diff mbox series

[U-Boot] power: fan53555: add support for Silergy SYR82X and SYR83X

Message ID 20191116193203.261954-1-anarsoul@gmail.com
State Accepted
Commit 5ef1e02e997ade6e482e589a5c5ed7cf442b173b
Delegated to: Kever Yang
Headers show
Series [U-Boot] power: fan53555: add support for Silergy SYR82X and SYR83X | expand

Commit Message

Vasily Khoruzhick Nov. 16, 2019, 7:32 p.m. UTC
SYR82X and SYR83X are almost identical to FAN53555, the only difference
is different die ID and revision, voltage ranges and steps.

Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
---
 drivers/power/pmic/fan53555.c      |  7 +++--
 drivers/power/regulator/fan53555.c | 45 ++++++++++++++++++++++--------
 include/power/fan53555.h           | 14 ++++++++++
 3 files changed, 52 insertions(+), 14 deletions(-)
 create mode 100644 include/power/fan53555.h

Comments

Anand Moon Nov. 20, 2019, 1:51 a.m. UTC | #1
Hi Vasily,

I have got a development board Odroid N1
it has SYR837PKC and SYR838PKC regulator IC on the board.

On testing this patch, it failed with below message.

Model: Hardkernel ODROID-N1
DRAM:  3.9 GiB
SW: fan53555_voltages_setup: die id 7 rev 7 not supported!
MMC:   dwmmc@fe320000: 1, sdhci@fe330000: 0
Loading Environment from MMC... Card did not respond to voltage select!
*** Warning - No block device, using default environment

could you add this *die id* and *rev id* and update in the next patch.

Could we enable this feature on all rk3399 development boards

-Anand

On Sun, 17 Nov 2019 at 01:02, Vasily Khoruzhick <anarsoul@gmail.com> wrote:
>
> SYR82X and SYR83X are almost identical to FAN53555, the only difference
> is different die ID and revision, voltage ranges and steps.
>
> Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
> ---
>  drivers/power/pmic/fan53555.c      |  7 +++--
>  drivers/power/regulator/fan53555.c | 45 ++++++++++++++++++++++--------
>  include/power/fan53555.h           | 14 ++++++++++
>  3 files changed, 52 insertions(+), 14 deletions(-)
>  create mode 100644 include/power/fan53555.h
>
> diff --git a/drivers/power/pmic/fan53555.c b/drivers/power/pmic/fan53555.c
> index 1ca59c5f0c..11304d2146 100644
> --- a/drivers/power/pmic/fan53555.c
> +++ b/drivers/power/pmic/fan53555.c
> @@ -8,6 +8,7 @@
>  #include <dm/device-internal.h>
>  #include <dm/lists.h>
>  #include <i2c.h>
> +#include <power/fan53555.h>
>  #include <power/pmic.h>
>  #include <power/regulator.h>
>
> @@ -58,7 +59,7 @@ static int pmic_fan53555_bind(struct udevice *dev)
>                 return -ENOENT;
>         }
>
> -       return device_bind_with_driver_data(dev, drv, "SW", 0,
> +       return device_bind_with_driver_data(dev, drv, "SW", dev->driver_data,
>                                             dev_ofnode(dev), &child);
>  };
>
> @@ -69,7 +70,9 @@ static struct dm_pmic_ops pmic_fan53555_ops = {
>  };
>
>  static const struct udevice_id pmic_fan53555_match[] = {
> -       { .compatible = "fcs,fan53555" },
> +       { .compatible = "fcs,fan53555", .data = FAN53555_VENDOR_FAIRCHILD, },
> +       { .compatible = "silergy,syr827", .data = FAN53555_VENDOR_SILERGY, },
> +       { .compatible = "silergy,syr828", .data = FAN53555_VENDOR_SILERGY, },
>         { },
>  };
>
> diff --git a/drivers/power/regulator/fan53555.c b/drivers/power/regulator/fan53555.c
> index dbd5502377..9c48b26216 100644
> --- a/drivers/power/regulator/fan53555.c
> +++ b/drivers/power/regulator/fan53555.c
> @@ -10,6 +10,7 @@
>  #include <fdtdec.h>
>  #include <i2c.h>
>  #include <asm/gpio.h>
> +#include <power/fan53555.h>
>  #include <power/pmic.h>
>  #include <power/regulator.h>
>
> @@ -27,21 +28,37 @@
>   * See http://www.onsemi.com/pub/Collateral/FAN53555-D.pdf for details.
>   */
>  static const struct {
> +       unsigned int vendor;
>         u8 die_id;
>         u8 die_rev;
> +       bool check_rev;
>         u32 vsel_min;
>         u32 vsel_step;
>  } ic_types[] = {
> -       { 0x0, 0x3, 600000, 10000 },  /* Option 00 */
> -       { 0x0, 0xf, 800000, 10000 },  /* Option 13 */
> -       { 0x0, 0xc, 600000, 12500 },  /* Option 23 */
> -       { 0x1, 0x3, 600000, 10000 },  /* Option 01 */
> -       { 0x3, 0x3, 600000, 10000 },  /* Option 03 */
> -       { 0x4, 0xf, 603000, 12826 },  /* Option 04 */
> -       { 0x5, 0x3, 600000, 10000 },  /* Option 05 */
> -       { 0x8, 0x1, 600000, 10000 },  /* Option 08 */
> -       { 0x8, 0xf, 600000, 10000 },  /* Option 08 */
> -       { 0xc, 0xf, 603000, 12826 },  /* Option 09 */
> +       /* Option 00 */
> +       { FAN53555_VENDOR_FAIRCHILD, 0x0, 0x3, true,  600000, 10000 },
> +       /* Option 13 */
> +       { FAN53555_VENDOR_FAIRCHILD, 0x0, 0xf, true,  800000, 10000 },
> +       /* Option 23 */
> +       { FAN53555_VENDOR_FAIRCHILD, 0x0, 0xc, true,  600000, 12500 },
> +       /* Option 01 */
> +       { FAN53555_VENDOR_FAIRCHILD, 0x1, 0x3, true,  600000, 10000 },
> +       /* Option 03 */
> +       { FAN53555_VENDOR_FAIRCHILD, 0x3, 0x3, true,  600000, 10000 },
> +       /* Option 04 */
> +       { FAN53555_VENDOR_FAIRCHILD, 0x4, 0xf, true,  603000, 12826 },
> +       /* Option 05 */
> +       { FAN53555_VENDOR_FAIRCHILD, 0x5, 0x3, true,  600000, 10000 },
> +       /* Option 08 */
> +       { FAN53555_VENDOR_FAIRCHILD, 0x8, 0x1, true,  600000, 10000 },
> +       /* Option 08 */
> +       { FAN53555_VENDOR_FAIRCHILD, 0x8, 0xf, true,  600000, 10000 },
> +       /* Option 09 */
> +       { FAN53555_VENDOR_FAIRCHILD, 0xc, 0xf, true,  603000, 12826 },
> +       /* SYL82X */
> +       { FAN53555_VENDOR_SILERGY,   0x8, 0x0, false, 712500, 12500 },
> +       /* SYL83X */
> +       { FAN53555_VENDOR_SILERGY,   0x9, 0x0, false, 712500, 12500 },
>  };
>
>  /* I2C-accessible byte-sized registers */
> @@ -152,10 +169,14 @@ static int fan53555_voltages_setup(struct udevice *dev)
>
>         /* Init voltage range and step */
>         for (i = 0; i < ARRAY_SIZE(ic_types); ++i) {
> +               if (ic_types[i].vendor != priv->vendor)
> +                       continue;
> +
>                 if (ic_types[i].die_id != priv->die_id)
>                         continue;
>
> -               if (ic_types[i].die_rev != priv->die_rev)
> +               if (ic_types[i].check_rev &&
> +                   ic_types[i].die_rev != priv->die_rev)
>                         continue;
>
>                 priv->vsel_min = ic_types[i].vsel_min;
> @@ -193,7 +214,7 @@ static int fan53555_probe(struct udevice *dev)
>                 return ID2;
>
>         /* extract vendor, die_id and die_rev */
> -       priv->vendor = bitfield_extract(ID1, 5, 3);
> +       priv->vendor = dev->driver_data;
>         priv->die_id = ID1 & GENMASK(3, 0);
>         priv->die_rev = ID2 & GENMASK(3, 0);
>
> diff --git a/include/power/fan53555.h b/include/power/fan53555.h
> new file mode 100644
> index 0000000000..c039f06071
> --- /dev/null
> +++ b/include/power/fan53555.h
> @@ -0,0 +1,14 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Copyright (C) 2019 Vasily Khoruzhick <anarsoul@gmail.com>
> + */
> +
> +#ifndef _FAN53555_H_
> +#define _FAN53555_H_
> +
> +enum fan53555_vendor {
> +       FAN53555_VENDOR_FAIRCHILD,
> +       FAN53555_VENDOR_SILERGY,
> +};
> +
> +#endif
> --
> 2.24.0
>
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> https://lists.denx.de/listinfo/u-boot
Vasily Khoruzhick Nov. 20, 2019, 5:15 a.m. UTC | #2
On Tue, Nov 19, 2019 at 5:51 PM Anand Moon <linux.amoon@gmail.com> wrote:
>
> Hi Vasily,
>
> I have got a development board Odroid N1
> it has SYR837PKC and SYR838PKC regulator IC on the board.
>
> On testing this patch, it failed with below message.
>
> Model: Hardkernel ODROID-N1
> DRAM:  3.9 GiB
> SW: fan53555_voltages_setup: die id 7 rev 7 not supported!
> MMC:   dwmmc@fe320000: 1, sdhci@fe330000: 0
> Loading Environment from MMC... Card did not respond to voltage select!
> *** Warning - No block device, using default environment
>
> could you add this *die id* and *rev id* and update in the next patch.

Likely you're missing another patch from me, see
https://patchwork.ozlabs.org/patch/1196194/ so ID you're getting here
are not correct.

> Could we enable this feature on all rk3399 development boards

That's out of scope of this patch.

> -Anand
>
> On Sun, 17 Nov 2019 at 01:02, Vasily Khoruzhick <anarsoul@gmail.com> wrote:
> >
> > SYR82X and SYR83X are almost identical to FAN53555, the only difference
> > is different die ID and revision, voltage ranges and steps.
> >
> > Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
> > ---
> >  drivers/power/pmic/fan53555.c      |  7 +++--
> >  drivers/power/regulator/fan53555.c | 45 ++++++++++++++++++++++--------
> >  include/power/fan53555.h           | 14 ++++++++++
> >  3 files changed, 52 insertions(+), 14 deletions(-)
> >  create mode 100644 include/power/fan53555.h
> >
> > diff --git a/drivers/power/pmic/fan53555.c b/drivers/power/pmic/fan53555.c
> > index 1ca59c5f0c..11304d2146 100644
> > --- a/drivers/power/pmic/fan53555.c
> > +++ b/drivers/power/pmic/fan53555.c
> > @@ -8,6 +8,7 @@
> >  #include <dm/device-internal.h>
> >  #include <dm/lists.h>
> >  #include <i2c.h>
> > +#include <power/fan53555.h>
> >  #include <power/pmic.h>
> >  #include <power/regulator.h>
> >
> > @@ -58,7 +59,7 @@ static int pmic_fan53555_bind(struct udevice *dev)
> >                 return -ENOENT;
> >         }
> >
> > -       return device_bind_with_driver_data(dev, drv, "SW", 0,
> > +       return device_bind_with_driver_data(dev, drv, "SW", dev->driver_data,
> >                                             dev_ofnode(dev), &child);
> >  };
> >
> > @@ -69,7 +70,9 @@ static struct dm_pmic_ops pmic_fan53555_ops = {
> >  };
> >
> >  static const struct udevice_id pmic_fan53555_match[] = {
> > -       { .compatible = "fcs,fan53555" },
> > +       { .compatible = "fcs,fan53555", .data = FAN53555_VENDOR_FAIRCHILD, },
> > +       { .compatible = "silergy,syr827", .data = FAN53555_VENDOR_SILERGY, },
> > +       { .compatible = "silergy,syr828", .data = FAN53555_VENDOR_SILERGY, },
> >         { },
> >  };
> >
> > diff --git a/drivers/power/regulator/fan53555.c b/drivers/power/regulator/fan53555.c
> > index dbd5502377..9c48b26216 100644
> > --- a/drivers/power/regulator/fan53555.c
> > +++ b/drivers/power/regulator/fan53555.c
> > @@ -10,6 +10,7 @@
> >  #include <fdtdec.h>
> >  #include <i2c.h>
> >  #include <asm/gpio.h>
> > +#include <power/fan53555.h>
> >  #include <power/pmic.h>
> >  #include <power/regulator.h>
> >
> > @@ -27,21 +28,37 @@
> >   * See http://www.onsemi.com/pub/Collateral/FAN53555-D.pdf for details.
> >   */
> >  static const struct {
> > +       unsigned int vendor;
> >         u8 die_id;
> >         u8 die_rev;
> > +       bool check_rev;
> >         u32 vsel_min;
> >         u32 vsel_step;
> >  } ic_types[] = {
> > -       { 0x0, 0x3, 600000, 10000 },  /* Option 00 */
> > -       { 0x0, 0xf, 800000, 10000 },  /* Option 13 */
> > -       { 0x0, 0xc, 600000, 12500 },  /* Option 23 */
> > -       { 0x1, 0x3, 600000, 10000 },  /* Option 01 */
> > -       { 0x3, 0x3, 600000, 10000 },  /* Option 03 */
> > -       { 0x4, 0xf, 603000, 12826 },  /* Option 04 */
> > -       { 0x5, 0x3, 600000, 10000 },  /* Option 05 */
> > -       { 0x8, 0x1, 600000, 10000 },  /* Option 08 */
> > -       { 0x8, 0xf, 600000, 10000 },  /* Option 08 */
> > -       { 0xc, 0xf, 603000, 12826 },  /* Option 09 */
> > +       /* Option 00 */
> > +       { FAN53555_VENDOR_FAIRCHILD, 0x0, 0x3, true,  600000, 10000 },
> > +       /* Option 13 */
> > +       { FAN53555_VENDOR_FAIRCHILD, 0x0, 0xf, true,  800000, 10000 },
> > +       /* Option 23 */
> > +       { FAN53555_VENDOR_FAIRCHILD, 0x0, 0xc, true,  600000, 12500 },
> > +       /* Option 01 */
> > +       { FAN53555_VENDOR_FAIRCHILD, 0x1, 0x3, true,  600000, 10000 },
> > +       /* Option 03 */
> > +       { FAN53555_VENDOR_FAIRCHILD, 0x3, 0x3, true,  600000, 10000 },
> > +       /* Option 04 */
> > +       { FAN53555_VENDOR_FAIRCHILD, 0x4, 0xf, true,  603000, 12826 },
> > +       /* Option 05 */
> > +       { FAN53555_VENDOR_FAIRCHILD, 0x5, 0x3, true,  600000, 10000 },
> > +       /* Option 08 */
> > +       { FAN53555_VENDOR_FAIRCHILD, 0x8, 0x1, true,  600000, 10000 },
> > +       /* Option 08 */
> > +       { FAN53555_VENDOR_FAIRCHILD, 0x8, 0xf, true,  600000, 10000 },
> > +       /* Option 09 */
> > +       { FAN53555_VENDOR_FAIRCHILD, 0xc, 0xf, true,  603000, 12826 },
> > +       /* SYL82X */
> > +       { FAN53555_VENDOR_SILERGY,   0x8, 0x0, false, 712500, 12500 },
> > +       /* SYL83X */
> > +       { FAN53555_VENDOR_SILERGY,   0x9, 0x0, false, 712500, 12500 },
> >  };
> >
> >  /* I2C-accessible byte-sized registers */
> > @@ -152,10 +169,14 @@ static int fan53555_voltages_setup(struct udevice *dev)
> >
> >         /* Init voltage range and step */
> >         for (i = 0; i < ARRAY_SIZE(ic_types); ++i) {
> > +               if (ic_types[i].vendor != priv->vendor)
> > +                       continue;
> > +
> >                 if (ic_types[i].die_id != priv->die_id)
> >                         continue;
> >
> > -               if (ic_types[i].die_rev != priv->die_rev)
> > +               if (ic_types[i].check_rev &&
> > +                   ic_types[i].die_rev != priv->die_rev)
> >                         continue;
> >
> >                 priv->vsel_min = ic_types[i].vsel_min;
> > @@ -193,7 +214,7 @@ static int fan53555_probe(struct udevice *dev)
> >                 return ID2;
> >
> >         /* extract vendor, die_id and die_rev */
> > -       priv->vendor = bitfield_extract(ID1, 5, 3);
> > +       priv->vendor = dev->driver_data;
> >         priv->die_id = ID1 & GENMASK(3, 0);
> >         priv->die_rev = ID2 & GENMASK(3, 0);
> >
> > diff --git a/include/power/fan53555.h b/include/power/fan53555.h
> > new file mode 100644
> > index 0000000000..c039f06071
> > --- /dev/null
> > +++ b/include/power/fan53555.h
> > @@ -0,0 +1,14 @@
> > +/* SPDX-License-Identifier: GPL-2.0+ */
> > +/*
> > + * Copyright (C) 2019 Vasily Khoruzhick <anarsoul@gmail.com>
> > + */
> > +
> > +#ifndef _FAN53555_H_
> > +#define _FAN53555_H_
> > +
> > +enum fan53555_vendor {
> > +       FAN53555_VENDOR_FAIRCHILD,
> > +       FAN53555_VENDOR_SILERGY,
> > +};
> > +
> > +#endif
> > --
> > 2.24.0
> >
> > _______________________________________________
> > U-Boot mailing list
> > U-Boot@lists.denx.de
> > https://lists.denx.de/listinfo/u-boot
Anand Moon Nov. 20, 2019, 6:05 a.m. UTC | #3
Hi Vasily,

On Wed, 20 Nov 2019 at 10:45, Vasily Khoruzhick <anarsoul@gmail.com> wrote:
>
> On Tue, Nov 19, 2019 at 5:51 PM Anand Moon <linux.amoon@gmail.com> wrote:
> >
> > Hi Vasily,
> >
> > I have got a development board Odroid N1
> > it has SYR837PKC and SYR838PKC regulator IC on the board.
> >
> > On testing this patch, it failed with below message.
> >
> > Model: Hardkernel ODROID-N1
> > DRAM:  3.9 GiB
> > SW: fan53555_voltages_setup: die id 7 rev 7 not supported!
> > MMC:   dwmmc@fe320000: 1, sdhci@fe330000: 0
> > Loading Environment from MMC... Card did not respond to voltage select!
> > *** Warning - No block device, using default environment
> >
> > could you add this *die id* and *rev id* and update in the next patch.
>
> Likely you're missing another patch from me, see
> https://patchwork.ozlabs.org/patch/1196194/ so ID you're getting here
> are not correct.
>

Ok thanks. This fix my warning.

Please add my
Tested-by: Anand Moon <linux.amoon@gmail.com>

-Anand
Kever Yang Nov. 20, 2019, 7:11 a.m. UTC | #4
On 2019/11/17 上午3:32, Vasily Khoruzhick wrote:
> SYR82X and SYR83X are almost identical to FAN53555, the only difference
> is different die ID and revision, voltage ranges and steps.
>
> Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>

Reviewed-by: Kever Yang <kever.yang@rock-chips.com>

Thanks,
- Kever
> ---
>   drivers/power/pmic/fan53555.c      |  7 +++--
>   drivers/power/regulator/fan53555.c | 45 ++++++++++++++++++++++--------
>   include/power/fan53555.h           | 14 ++++++++++
>   3 files changed, 52 insertions(+), 14 deletions(-)
>   create mode 100644 include/power/fan53555.h
>
> diff --git a/drivers/power/pmic/fan53555.c b/drivers/power/pmic/fan53555.c
> index 1ca59c5f0c..11304d2146 100644
> --- a/drivers/power/pmic/fan53555.c
> +++ b/drivers/power/pmic/fan53555.c
> @@ -8,6 +8,7 @@
>   #include <dm/device-internal.h>
>   #include <dm/lists.h>
>   #include <i2c.h>
> +#include <power/fan53555.h>
>   #include <power/pmic.h>
>   #include <power/regulator.h>
>   
> @@ -58,7 +59,7 @@ static int pmic_fan53555_bind(struct udevice *dev)
>   		return -ENOENT;
>   	}
>   
> -	return device_bind_with_driver_data(dev, drv, "SW", 0,
> +	return device_bind_with_driver_data(dev, drv, "SW", dev->driver_data,
>   					    dev_ofnode(dev), &child);
>   };
>   
> @@ -69,7 +70,9 @@ static struct dm_pmic_ops pmic_fan53555_ops = {
>   };
>   
>   static const struct udevice_id pmic_fan53555_match[] = {
> -	{ .compatible = "fcs,fan53555" },
> +	{ .compatible = "fcs,fan53555", .data = FAN53555_VENDOR_FAIRCHILD, },
> +	{ .compatible = "silergy,syr827", .data = FAN53555_VENDOR_SILERGY, },
> +	{ .compatible = "silergy,syr828", .data = FAN53555_VENDOR_SILERGY, },
>   	{ },
>   };
>   
> diff --git a/drivers/power/regulator/fan53555.c b/drivers/power/regulator/fan53555.c
> index dbd5502377..9c48b26216 100644
> --- a/drivers/power/regulator/fan53555.c
> +++ b/drivers/power/regulator/fan53555.c
> @@ -10,6 +10,7 @@
>   #include <fdtdec.h>
>   #include <i2c.h>
>   #include <asm/gpio.h>
> +#include <power/fan53555.h>
>   #include <power/pmic.h>
>   #include <power/regulator.h>
>   
> @@ -27,21 +28,37 @@
>    * See http://www.onsemi.com/pub/Collateral/FAN53555-D.pdf for details.
>    */
>   static const struct {
> +	unsigned int vendor;
>   	u8 die_id;
>   	u8 die_rev;
> +	bool check_rev;
>   	u32 vsel_min;
>   	u32 vsel_step;
>   } ic_types[] = {
> -	{ 0x0, 0x3, 600000, 10000 },  /* Option 00 */
> -	{ 0x0, 0xf, 800000, 10000 },  /* Option 13 */
> -	{ 0x0, 0xc, 600000, 12500 },  /* Option 23 */
> -	{ 0x1, 0x3, 600000, 10000 },  /* Option 01 */
> -	{ 0x3, 0x3, 600000, 10000 },  /* Option 03 */
> -	{ 0x4, 0xf, 603000, 12826 },  /* Option 04 */
> -	{ 0x5, 0x3, 600000, 10000 },  /* Option 05 */
> -	{ 0x8, 0x1, 600000, 10000 },  /* Option 08 */
> -	{ 0x8, 0xf, 600000, 10000 },  /* Option 08 */
> -	{ 0xc, 0xf, 603000, 12826 },  /* Option 09 */
> +	/* Option 00 */
> +	{ FAN53555_VENDOR_FAIRCHILD, 0x0, 0x3, true,  600000, 10000 },
> +	/* Option 13 */
> +	{ FAN53555_VENDOR_FAIRCHILD, 0x0, 0xf, true,  800000, 10000 },
> +	/* Option 23 */
> +	{ FAN53555_VENDOR_FAIRCHILD, 0x0, 0xc, true,  600000, 12500 },
> +	/* Option 01 */
> +	{ FAN53555_VENDOR_FAIRCHILD, 0x1, 0x3, true,  600000, 10000 },
> +	/* Option 03 */
> +	{ FAN53555_VENDOR_FAIRCHILD, 0x3, 0x3, true,  600000, 10000 },
> +	/* Option 04 */
> +	{ FAN53555_VENDOR_FAIRCHILD, 0x4, 0xf, true,  603000, 12826 },
> +	/* Option 05 */
> +	{ FAN53555_VENDOR_FAIRCHILD, 0x5, 0x3, true,  600000, 10000 },
> +	/* Option 08 */
> +	{ FAN53555_VENDOR_FAIRCHILD, 0x8, 0x1, true,  600000, 10000 },
> +	/* Option 08 */
> +	{ FAN53555_VENDOR_FAIRCHILD, 0x8, 0xf, true,  600000, 10000 },
> +	/* Option 09 */
> +	{ FAN53555_VENDOR_FAIRCHILD, 0xc, 0xf, true,  603000, 12826 },
> +	/* SYL82X */
> +	{ FAN53555_VENDOR_SILERGY,   0x8, 0x0, false, 712500, 12500 },
> +	/* SYL83X */
> +	{ FAN53555_VENDOR_SILERGY,   0x9, 0x0, false, 712500, 12500 },
>   };
>   
>   /* I2C-accessible byte-sized registers */
> @@ -152,10 +169,14 @@ static int fan53555_voltages_setup(struct udevice *dev)
>   
>   	/* Init voltage range and step */
>   	for (i = 0; i < ARRAY_SIZE(ic_types); ++i) {
> +		if (ic_types[i].vendor != priv->vendor)
> +			continue;
> +
>   		if (ic_types[i].die_id != priv->die_id)
>   			continue;
>   
> -		if (ic_types[i].die_rev != priv->die_rev)
> +		if (ic_types[i].check_rev &&
> +		    ic_types[i].die_rev != priv->die_rev)
>   			continue;
>   
>   		priv->vsel_min = ic_types[i].vsel_min;
> @@ -193,7 +214,7 @@ static int fan53555_probe(struct udevice *dev)
>   		return ID2;
>   
>   	/* extract vendor, die_id and die_rev */
> -	priv->vendor = bitfield_extract(ID1, 5, 3);
> +	priv->vendor = dev->driver_data;
>   	priv->die_id = ID1 & GENMASK(3, 0);
>   	priv->die_rev = ID2 & GENMASK(3, 0);
>   
> diff --git a/include/power/fan53555.h b/include/power/fan53555.h
> new file mode 100644
> index 0000000000..c039f06071
> --- /dev/null
> +++ b/include/power/fan53555.h
> @@ -0,0 +1,14 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Copyright (C) 2019 Vasily Khoruzhick <anarsoul@gmail.com>
> + */
> +
> +#ifndef _FAN53555_H_
> +#define _FAN53555_H_
> +
> +enum fan53555_vendor {
> +	FAN53555_VENDOR_FAIRCHILD,
> +	FAN53555_VENDOR_SILERGY,
> +};
> +
> +#endif
diff mbox series

Patch

diff --git a/drivers/power/pmic/fan53555.c b/drivers/power/pmic/fan53555.c
index 1ca59c5f0c..11304d2146 100644
--- a/drivers/power/pmic/fan53555.c
+++ b/drivers/power/pmic/fan53555.c
@@ -8,6 +8,7 @@ 
 #include <dm/device-internal.h>
 #include <dm/lists.h>
 #include <i2c.h>
+#include <power/fan53555.h>
 #include <power/pmic.h>
 #include <power/regulator.h>
 
@@ -58,7 +59,7 @@  static int pmic_fan53555_bind(struct udevice *dev)
 		return -ENOENT;
 	}
 
-	return device_bind_with_driver_data(dev, drv, "SW", 0,
+	return device_bind_with_driver_data(dev, drv, "SW", dev->driver_data,
 					    dev_ofnode(dev), &child);
 };
 
@@ -69,7 +70,9 @@  static struct dm_pmic_ops pmic_fan53555_ops = {
 };
 
 static const struct udevice_id pmic_fan53555_match[] = {
-	{ .compatible = "fcs,fan53555" },
+	{ .compatible = "fcs,fan53555", .data = FAN53555_VENDOR_FAIRCHILD, },
+	{ .compatible = "silergy,syr827", .data = FAN53555_VENDOR_SILERGY, },
+	{ .compatible = "silergy,syr828", .data = FAN53555_VENDOR_SILERGY, },
 	{ },
 };
 
diff --git a/drivers/power/regulator/fan53555.c b/drivers/power/regulator/fan53555.c
index dbd5502377..9c48b26216 100644
--- a/drivers/power/regulator/fan53555.c
+++ b/drivers/power/regulator/fan53555.c
@@ -10,6 +10,7 @@ 
 #include <fdtdec.h>
 #include <i2c.h>
 #include <asm/gpio.h>
+#include <power/fan53555.h>
 #include <power/pmic.h>
 #include <power/regulator.h>
 
@@ -27,21 +28,37 @@ 
  * See http://www.onsemi.com/pub/Collateral/FAN53555-D.pdf for details.
  */
 static const struct {
+	unsigned int vendor;
 	u8 die_id;
 	u8 die_rev;
+	bool check_rev;
 	u32 vsel_min;
 	u32 vsel_step;
 } ic_types[] = {
-	{ 0x0, 0x3, 600000, 10000 },  /* Option 00 */
-	{ 0x0, 0xf, 800000, 10000 },  /* Option 13 */
-	{ 0x0, 0xc, 600000, 12500 },  /* Option 23 */
-	{ 0x1, 0x3, 600000, 10000 },  /* Option 01 */
-	{ 0x3, 0x3, 600000, 10000 },  /* Option 03 */
-	{ 0x4, 0xf, 603000, 12826 },  /* Option 04 */
-	{ 0x5, 0x3, 600000, 10000 },  /* Option 05 */
-	{ 0x8, 0x1, 600000, 10000 },  /* Option 08 */
-	{ 0x8, 0xf, 600000, 10000 },  /* Option 08 */
-	{ 0xc, 0xf, 603000, 12826 },  /* Option 09 */
+	/* Option 00 */
+	{ FAN53555_VENDOR_FAIRCHILD, 0x0, 0x3, true,  600000, 10000 },
+	/* Option 13 */
+	{ FAN53555_VENDOR_FAIRCHILD, 0x0, 0xf, true,  800000, 10000 },
+	/* Option 23 */
+	{ FAN53555_VENDOR_FAIRCHILD, 0x0, 0xc, true,  600000, 12500 },
+	/* Option 01 */
+	{ FAN53555_VENDOR_FAIRCHILD, 0x1, 0x3, true,  600000, 10000 },
+	/* Option 03 */
+	{ FAN53555_VENDOR_FAIRCHILD, 0x3, 0x3, true,  600000, 10000 },
+	/* Option 04 */
+	{ FAN53555_VENDOR_FAIRCHILD, 0x4, 0xf, true,  603000, 12826 },
+	/* Option 05 */
+	{ FAN53555_VENDOR_FAIRCHILD, 0x5, 0x3, true,  600000, 10000 },
+	/* Option 08 */
+	{ FAN53555_VENDOR_FAIRCHILD, 0x8, 0x1, true,  600000, 10000 },
+	/* Option 08 */
+	{ FAN53555_VENDOR_FAIRCHILD, 0x8, 0xf, true,  600000, 10000 },
+	/* Option 09 */
+	{ FAN53555_VENDOR_FAIRCHILD, 0xc, 0xf, true,  603000, 12826 },
+	/* SYL82X */
+	{ FAN53555_VENDOR_SILERGY,   0x8, 0x0, false, 712500, 12500 },
+	/* SYL83X */
+	{ FAN53555_VENDOR_SILERGY,   0x9, 0x0, false, 712500, 12500 },
 };
 
 /* I2C-accessible byte-sized registers */
@@ -152,10 +169,14 @@  static int fan53555_voltages_setup(struct udevice *dev)
 
 	/* Init voltage range and step */
 	for (i = 0; i < ARRAY_SIZE(ic_types); ++i) {
+		if (ic_types[i].vendor != priv->vendor)
+			continue;
+
 		if (ic_types[i].die_id != priv->die_id)
 			continue;
 
-		if (ic_types[i].die_rev != priv->die_rev)
+		if (ic_types[i].check_rev &&
+		    ic_types[i].die_rev != priv->die_rev)
 			continue;
 
 		priv->vsel_min = ic_types[i].vsel_min;
@@ -193,7 +214,7 @@  static int fan53555_probe(struct udevice *dev)
 		return ID2;
 
 	/* extract vendor, die_id and die_rev */
-	priv->vendor = bitfield_extract(ID1, 5, 3);
+	priv->vendor = dev->driver_data;
 	priv->die_id = ID1 & GENMASK(3, 0);
 	priv->die_rev = ID2 & GENMASK(3, 0);
 
diff --git a/include/power/fan53555.h b/include/power/fan53555.h
new file mode 100644
index 0000000000..c039f06071
--- /dev/null
+++ b/include/power/fan53555.h
@@ -0,0 +1,14 @@ 
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2019 Vasily Khoruzhick <anarsoul@gmail.com>
+ */
+
+#ifndef _FAN53555_H_
+#define _FAN53555_H_
+
+enum fan53555_vendor {
+	FAN53555_VENDOR_FAIRCHILD,
+	FAN53555_VENDOR_SILERGY,
+};
+
+#endif