mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-12-01 08:59:33 +00:00
power: fan53555: add support for Silergy SYR82X and SYR83X
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> Tested-by: Anand Moon <linux.amoon@gmail.com> Reviewed-by: Kever Yang <kever.yang@rock-chips.com>
This commit is contained in:
parent
d8765e2422
commit
5ef1e02e99
3 changed files with 52 additions and 14 deletions
|
@ -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, },
|
||||
{ },
|
||||
};
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
14
include/power/fan53555.h
Normal file
14
include/power/fan53555.h
Normal file
|
@ -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
|
Loading…
Reference in a new issue