regulator: fan52555: add support for fan53528 fan

This commit is contained in:
azkali authored and Thomas Makin committed 2026-08-24 18:39:42 -05:00
1 parent 18b308e7ed
commit 84d6d81d7e
1 file changed
+49 -5
+49 -5
View File
@@ -56,6 +56,11 @@
#define CTL_MODE_VSEL0_MODE BIT(0)
#define CTL_MODE_VSEL1_MODE BIT(1)
#define FAN53528_CTL_MODE_MASK 0x3
#define FAN53528_CTL_MODE_FPWM (BIT(1) | BIT(0))
#define FAN53528_CTL_MODE_AUTFPWM 0x0
#define FAN53528_VOLTAGE_MASK 0x7F
#define FAN53555_NVOLTAGES 64 /* Numbers of voltages */
#define FAN53526_NVOLTAGES 128
#define RK8602_NVOLTAGES 160
@@ -67,6 +72,7 @@
enum fan53555_vendor {
FAN53526_VENDOR_FAIRCHILD = 0,
FAN53528_VENDOR_FAIRCHILD,
FAN53555_VENDOR_FAIRCHILD,
FAN53555_VENDOR_ROCKCHIP, /* RK8600, RK8601 */
RK8602_VENDOR_ROCKCHIP, /* RK8602, RK8603 */
@@ -161,8 +167,12 @@ static int fan53555_set_suspend_voltage(struct regulator_dev *rdev, int uV)
ret = regulator_map_voltage_linear(rdev, uV, uV);
if (ret < 0)
return ret;
ret = regmap_update_bits(rdev->regmap, di->sleep_reg,
di->desc.vsel_mask, ret);
if (di->vendor == FAN53528_VENDOR_FAIRCHILD)
ret = regmap_update_bits(rdev->regmap, di->sleep_reg,
FAN53528_VOLTAGE_MASK, ret);
else
ret = regmap_update_bits(rdev->regmap, di->sleep_reg,
di->desc.vsel_mask, ret);
if (ret < 0)
return ret;
/* Cache the sleep voltage setting.
@@ -194,11 +204,21 @@ static int fan53555_set_mode(struct regulator_dev *rdev, unsigned int mode)
switch (mode) {
case REGULATOR_MODE_FAST:
regmap_update_bits(rdev->regmap, di->mode_reg,
di->mode_mask, di->mode_mask);
if (di->vendor == FAN53528_VENDOR_FAIRCHILD)
regmap_update_bits(rdev->regmap, FAN53555_CONTROL,
FAN53528_CTL_MODE_MASK,
FAN53528_CTL_MODE_FPWM);
else
regmap_update_bits(rdev->regmap, di->mode_reg,
di->mode_mask, di->mode_mask);
break;
case REGULATOR_MODE_NORMAL:
regmap_update_bits(rdev->regmap, di->vol_reg, di->mode_mask, 0);
if (di->vendor == FAN53528_VENDOR_FAIRCHILD)
regmap_update_bits(di->regmap, FAN53555_CONTROL,
FAN53528_CTL_MODE_MASK,
FAN53528_CTL_MODE_AUTFPWM);
else
regmap_update_bits(rdev->regmap, di->vol_reg, di->mode_mask, 0);
break;
default:
return -EINVAL;
@@ -212,6 +232,17 @@ static unsigned int fan53555_get_mode(struct regulator_dev *rdev)
unsigned int val;
int ret = 0;
if (di->vendor == FAN53528_VENDOR_FAIRCHILD) {
ret = regmap_read(di->regmap, FAN53555_CONTROL, &val);
if (ret < 0)
return ret;
if ((val & FAN53528_CTL_MODE_MASK) == FAN53528_CTL_MODE_FPWM)
return REGULATOR_MODE_FAST;
else
return REGULATOR_MODE_NORMAL;
return 0;
}
ret = regmap_read(rdev->regmap, di->mode_reg, &val);
if (ret < 0)
return ret;
@@ -610,6 +641,13 @@ static int fan53555_regulator_register(struct fan53555_device_info *di,
rdesc->enable_time = di->enable_time;
rdesc->owner = THIS_MODULE;
if (di->vendor == FAN53528_VENDOR_FAIRCHILD) {
rdesc->name = "fan53528-reg";
rdesc->n_voltages = FAN53526_NVOLTAGES;
rdesc->vsel_mask = FAN53528_VOLTAGE_MASK;
};
rdev = devm_regulator_register(di->dev, &di->desc, config);
return PTR_ERR_OR_ZERO(rdev);
}
@@ -645,6 +683,9 @@ static const struct of_device_id __maybe_unused fan53555_dt_ids[] = {
{
.compatible = "fcs,fan53526",
.data = (void *)FAN53526_VENDOR_FAIRCHILD,
}, {
.compatible = "fcs,fan53528",
.data = (void *)FAN53528_VENDOR_FAIRCHILD,
}, {
.compatible = "fcs,fan53555",
.data = (void *)FAN53555_VENDOR_FAIRCHILD
@@ -752,6 +793,9 @@ static const struct i2c_device_id fan53555_id[] = {
{
.name = "fan53526",
.driver_data = FAN53526_VENDOR_FAIRCHILD
}, {
.name = "fan53528",
.driver_data = FAN53528_VENDOR_FAIRCHILD
}, {
.name = "fan53555",
.driver_data = FAN53555_VENDOR_FAIRCHILD