diff --git a/target/linux/rockchip/patches-5.15/036-v6.4-regulator-fan53555-Remove-unused-SLEW_SHIFT-definitions.patch b/target/linux/rockchip/patches-5.15/036-v6.4-regulator-fan53555-Remove-unused-SLEW_SHIFT-definitions.patch new file mode 100644 index 0000000000..64d2db7330 --- /dev/null +++ b/target/linux/rockchip/patches-5.15/036-v6.4-regulator-fan53555-Remove-unused-SLEW_SHIFT-definitions.patch @@ -0,0 +1,35 @@ +From d5edc0e36bb1657d2c46b7521010d4f0894a5c74 Mon Sep 17 00:00:00 2001 +From: Cristian Ciocaltea +Date: Thu, 6 Apr 2023 22:41:54 +0300 +Subject: [PATCH] regulator: fan53555: Remove unused *_SLEW_SHIFT definitions + +Commit b61ac767db4d ("regulator: fan53555: Convert to use +regulator_set_ramp_delay_regmap") removed the slew_shift member from +struct fan53555_device_info, hence the {CTL,TCS}_SLEW_SHIFT definitions +remained unused. Drop them. + +Signed-off-by: Cristian Ciocaltea +Link: https://lore.kernel.org/r/20230406194158.963352-5-cristian.ciocaltea@collabora.com +Signed-off-by: Mark Brown +--- + drivers/regulator/fan53555.c | 2 -- + 1 file changed, 2 deletions(-) + +--- a/drivers/regulator/fan53555.c ++++ b/drivers/regulator/fan53555.c +@@ -49,7 +49,6 @@ + /* Control bit definitions */ + #define CTL_OUTPUT_DISCHG (1 << 7) + #define CTL_SLEW_MASK (0x7 << 4) +-#define CTL_SLEW_SHIFT 4 + #define CTL_RESET (1 << 2) + #define CTL_MODE_VSEL0_MODE BIT(0) + #define CTL_MODE_VSEL1_MODE BIT(1) +@@ -60,7 +59,6 @@ + #define TCS_VSEL0_MODE (1 << 7) + #define TCS_VSEL1_MODE (1 << 6) + +-#define TCS_SLEW_SHIFT 3 + #define TCS_SLEW_MASK GENMASK(4, 3) + + enum fan53555_vendor { diff --git a/target/linux/rockchip/patches-5.15/037-v6.4-regulator-fan53555-Make-use-of-the-bit-macros.patch b/target/linux/rockchip/patches-5.15/037-v6.4-regulator-fan53555-Make-use-of-the-bit-macros.patch new file mode 100644 index 0000000000..62ce4f4e93 --- /dev/null +++ b/target/linux/rockchip/patches-5.15/037-v6.4-regulator-fan53555-Make-use-of-the-bit-macros.patch @@ -0,0 +1,53 @@ +From d25016618c0845b2a0f9ae64d084a66efd39b03c Mon Sep 17 00:00:00 2001 +From: Cristian Ciocaltea +Date: Thu, 6 Apr 2023 22:41:55 +0300 +Subject: [PATCH] regulator: fan53555: Make use of the bit macros + +For consistency and improved clarity, use BIT() and GENMASK() macros for +defining the bitfields inside the registers. No functional changes +intended. + +While here, also fix DIE_{ID,REV} inconsistent indentation. + +Signed-off-by: Cristian Ciocaltea +Link: https://lore.kernel.org/r/20230406194158.963352-6-cristian.ciocaltea@collabora.com +Signed-off-by: Mark Brown +--- + drivers/regulator/fan53555.c | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +--- a/drivers/regulator/fan53555.c ++++ b/drivers/regulator/fan53555.c +@@ -41,23 +41,23 @@ + #define FAN53555_MONITOR 0x05 + + /* VSEL bit definitions */ +-#define VSEL_BUCK_EN (1 << 7) +-#define VSEL_MODE (1 << 6) ++#define VSEL_BUCK_EN BIT(7) ++#define VSEL_MODE BIT(6) + /* Chip ID and Verison */ +-#define DIE_ID 0x0F /* ID1 */ +-#define DIE_REV 0x0F /* ID2 */ ++#define DIE_ID 0x0F /* ID1 */ ++#define DIE_REV 0x0F /* ID2 */ + /* Control bit definitions */ +-#define CTL_OUTPUT_DISCHG (1 << 7) +-#define CTL_SLEW_MASK (0x7 << 4) +-#define CTL_RESET (1 << 2) ++#define CTL_OUTPUT_DISCHG BIT(7) ++#define CTL_SLEW_MASK GENMASK(6, 4) ++#define CTL_RESET BIT(2) + #define CTL_MODE_VSEL0_MODE BIT(0) + #define CTL_MODE_VSEL1_MODE BIT(1) + + #define FAN53555_NVOLTAGES 64 /* Numbers of voltages */ + #define FAN53526_NVOLTAGES 128 + +-#define TCS_VSEL0_MODE (1 << 7) +-#define TCS_VSEL1_MODE (1 << 6) ++#define TCS_VSEL0_MODE BIT(7) ++#define TCS_VSEL1_MODE BIT(6) + + #define TCS_SLEW_MASK GENMASK(4, 3) + diff --git a/target/linux/rockchip/patches-5.15/038-v6.4-regulator-fan53555-Improve-vsel_mask-computation.patch b/target/linux/rockchip/patches-5.15/038-v6.4-regulator-fan53555-Improve-vsel_mask-computation.patch new file mode 100644 index 0000000000..a001a7cc59 --- /dev/null +++ b/target/linux/rockchip/patches-5.15/038-v6.4-regulator-fan53555-Improve-vsel_mask-computation.patch @@ -0,0 +1,39 @@ +From 6bb18339c6b54e0241344280fe4d14909db9356c Mon Sep 17 00:00:00 2001 +From: Cristian Ciocaltea +Date: Thu, 6 Apr 2023 22:41:56 +0300 +Subject: [PATCH] regulator: fan53555: Improve vsel_mask computation + +In preparation for introducing support for additional regulators which +do not use the maximum number of voltage selectors available for a given +mask, improve the mask computation formula by using fls(). + +Note fls() requires the bitops header, hence include it explicitly and +drop bits.h which is already pulled by bitops.h. + +Signed-off-by: Cristian Ciocaltea +Link: https://lore.kernel.org/r/20230406194158.963352-7-cristian.ciocaltea@collabora.com +Signed-off-by: Mark Brown +--- + drivers/regulator/fan53555.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/regulator/fan53555.c ++++ b/drivers/regulator/fan53555.c +@@ -8,7 +8,7 @@ + // Copyright (c) 2012 Marvell Technology Ltd. + // Yunfan Zhang + +-#include ++#include + #include + #include + #include +@@ -486,7 +486,7 @@ static int fan53555_regulator_register(s + rdesc->min_uV = di->vsel_min; + rdesc->uV_step = di->vsel_step; + rdesc->vsel_reg = di->vol_reg; +- rdesc->vsel_mask = di->vsel_count - 1; ++ rdesc->vsel_mask = BIT(fls(di->vsel_count - 1)) - 1; + rdesc->ramp_reg = di->slew_reg; + rdesc->ramp_mask = di->slew_mask; + rdesc->ramp_delay_table = di->ramp_delay_table; diff --git a/target/linux/rockchip/patches-5.15/039-v6.4-regulator-fan53555-Use-dev_err_probe.patch b/target/linux/rockchip/patches-5.15/039-v6.4-regulator-fan53555-Use-dev_err_probe.patch new file mode 100644 index 0000000000..b0fba84204 --- /dev/null +++ b/target/linux/rockchip/patches-5.15/039-v6.4-regulator-fan53555-Use-dev_err_probe.patch @@ -0,0 +1,106 @@ +From 2c82f5b8ae6d0b5bbac1526021d9c3120d183555 Mon Sep 17 00:00:00 2001 +From: Cristian Ciocaltea +Date: Thu, 6 Apr 2023 22:41:57 +0300 +Subject: [PATCH] regulator: fan53555: Use dev_err_probe + +Use dev_err_probe() instead of dev_err() in the probe function, which +ensures the error code is always printed and, additionally, simplifies +the code a bit. + +Signed-off-by: Cristian Ciocaltea +Link: https://lore.kernel.org/r/20230406194158.963352-8-cristian.ciocaltea@collabora.com +Signed-off-by: Mark Brown +--- + drivers/regulator/fan53555.c | 47 ++++++++++++++++-------------------- + 1 file changed, 21 insertions(+), 26 deletions(-) + +--- a/drivers/regulator/fan53555.c ++++ b/drivers/regulator/fan53555.c +@@ -568,10 +568,9 @@ static int fan53555_regulator_probe(stru + if (!pdata) + pdata = fan53555_parse_dt(&client->dev, np, &di->desc); + +- if (!pdata || !pdata->regulator) { +- dev_err(&client->dev, "Platform data not found!\n"); +- return -ENODEV; +- } ++ if (!pdata || !pdata->regulator) ++ return dev_err_probe(&client->dev, -ENODEV, ++ "Platform data not found!\n"); + + di->regulator = pdata->regulator; + if (client->dev.of_node) { +@@ -580,10 +579,9 @@ static int fan53555_regulator_probe(stru + } else { + /* if no ramp constraint set, get the pdata ramp_delay */ + if (!di->regulator->constraints.ramp_delay) { +- if (pdata->slew_rate >= ARRAY_SIZE(slew_rates)) { +- dev_err(&client->dev, "Invalid slew_rate\n"); +- return -EINVAL; +- } ++ if (pdata->slew_rate >= ARRAY_SIZE(slew_rates)) ++ return dev_err_probe(&client->dev, -EINVAL, ++ "Invalid slew_rate\n"); + + di->regulator->constraints.ramp_delay + = slew_rates[pdata->slew_rate]; +@@ -593,34 +591,31 @@ static int fan53555_regulator_probe(stru + } + + regmap = devm_regmap_init_i2c(client, &fan53555_regmap_config); +- if (IS_ERR(regmap)) { +- dev_err(&client->dev, "Failed to allocate regmap!\n"); +- return PTR_ERR(regmap); +- } ++ if (IS_ERR(regmap)) ++ return dev_err_probe(&client->dev, PTR_ERR(regmap), ++ "Failed to allocate regmap!\n"); ++ + di->dev = &client->dev; + i2c_set_clientdata(client, di); + /* Get chip ID */ + ret = regmap_read(regmap, FAN53555_ID1, &val); +- if (ret < 0) { +- dev_err(&client->dev, "Failed to get chip ID!\n"); +- return ret; +- } ++ if (ret < 0) ++ return dev_err_probe(&client->dev, ret, "Failed to get chip ID!\n"); ++ + di->chip_id = val & DIE_ID; + /* Get chip revision */ + ret = regmap_read(regmap, FAN53555_ID2, &val); +- if (ret < 0) { +- dev_err(&client->dev, "Failed to get chip Rev!\n"); +- return ret; +- } ++ if (ret < 0) ++ return dev_err_probe(&client->dev, ret, "Failed to get chip Rev!\n"); ++ + di->chip_rev = val & DIE_REV; + dev_info(&client->dev, "FAN53555 Option[%d] Rev[%d] Detected!\n", + di->chip_id, di->chip_rev); + /* Device init */ + ret = fan53555_device_setup(di, pdata); +- if (ret < 0) { +- dev_err(&client->dev, "Failed to setup device!\n"); +- return ret; +- } ++ if (ret < 0) ++ return dev_err_probe(&client->dev, ret, "Failed to setup device!\n"); ++ + /* Register regulator */ + config.dev = di->dev; + config.init_data = di->regulator; +@@ -630,9 +625,9 @@ static int fan53555_regulator_probe(stru + + ret = fan53555_regulator_register(di, &config); + if (ret < 0) +- dev_err(&client->dev, "Failed to register regulator!\n"); +- return ret; ++ dev_err_probe(&client->dev, ret, "Failed to register regulator!\n"); + ++ return ret; + } + + static const struct i2c_device_id fan53555_id[] = { diff --git a/target/linux/rockchip/patches-5.15/040-v6.4-regulator-fan53555-Add-support-for-RK860X.patch b/target/linux/rockchip/patches-5.15/040-v6.4-regulator-fan53555-Add-support-for-RK860X.patch new file mode 100644 index 0000000000..f8fbd8378f --- /dev/null +++ b/target/linux/rockchip/patches-5.15/040-v6.4-regulator-fan53555-Add-support-for-RK860X.patch @@ -0,0 +1,263 @@ +From a27e71a66ee0f887fefcc31b85a804b0905fa865 Mon Sep 17 00:00:00 2001 +From: Cristian Ciocaltea +Date: Thu, 6 Apr 2023 22:41:58 +0300 +Subject: [PATCH] regulator: fan53555: Add support for RK860X + +Extend the existing fan53555 driver to support the Rockchip RK860X +regulators. + +RK8600/RK8601 are pretty similar to the FAN53555 regulators. + +RK8602/RK8603 are a bit different, having a wider output voltage +selection range, from 0.5 V to 1.5 V in 6.25 mV steps. They also use +additional VSEL0/VSEL1 registers for the voltage selector, but the +enable and mode bits are still located in the original FAN53555 specific +VSEL0/VSEL1 registers. + +Signed-off-by: Cristian Ciocaltea +Acked-by: Krzysztof Kozlowski +Link: https://lore.kernel.org/r/20230406194158.963352-9-cristian.ciocaltea@collabora.com +Signed-off-by: Mark Brown +--- + drivers/regulator/fan53555.c | 121 ++++++++++++++++++++++++++++++++++- + 1 file changed, 118 insertions(+), 3 deletions(-) + +--- a/drivers/regulator/fan53555.c ++++ b/drivers/regulator/fan53555.c +@@ -26,6 +26,9 @@ + #define FAN53555_VSEL0 0x00 + #define FAN53555_VSEL1 0x01 + ++#define RK8602_VSEL0 0x06 ++#define RK8602_VSEL1 0x07 ++ + #define TCS4525_VSEL0 0x11 + #define TCS4525_VSEL1 0x10 + #define TCS4525_TIME 0x13 +@@ -55,6 +58,7 @@ + + #define FAN53555_NVOLTAGES 64 /* Numbers of voltages */ + #define FAN53526_NVOLTAGES 128 ++#define RK8602_NVOLTAGES 160 + + #define TCS_VSEL0_MODE BIT(7) + #define TCS_VSEL1_MODE BIT(6) +@@ -64,6 +68,8 @@ + enum fan53555_vendor { + FAN53526_VENDOR_FAIRCHILD = 0, + FAN53555_VENDOR_FAIRCHILD, ++ FAN53555_VENDOR_ROCKCHIP, /* RK8600, RK8601 */ ++ RK8602_VENDOR_ROCKCHIP, /* RK8602, RK8603 */ + FAN53555_VENDOR_SILERGY, + FAN53526_VENDOR_TCS, + }; +@@ -88,6 +94,14 @@ enum { + }; + + enum { ++ RK8600_CHIP_ID_08 = 8, /* RK8600, RK8601 */ ++}; ++ ++enum { ++ RK8602_CHIP_ID_10 = 10, /* RK8602, RK8603 */ ++}; ++ ++enum { + TCS4525_CHIP_ID_12 = 12, + }; + +@@ -117,6 +131,8 @@ struct fan53555_device_info { + /* Voltage setting register */ + unsigned int vol_reg; + unsigned int sleep_reg; ++ unsigned int en_reg; ++ unsigned int sleep_en_reg; + /* Voltage range and step(linear) */ + unsigned int vsel_min; + unsigned int vsel_step; +@@ -159,7 +175,7 @@ static int fan53555_set_suspend_enable(s + { + struct fan53555_device_info *di = rdev_get_drvdata(rdev); + +- return regmap_update_bits(rdev->regmap, di->sleep_reg, ++ return regmap_update_bits(rdev->regmap, di->sleep_en_reg, + VSEL_BUCK_EN, VSEL_BUCK_EN); + } + +@@ -167,7 +183,7 @@ static int fan53555_set_suspend_disable( + { + struct fan53555_device_info *di = rdev_get_drvdata(rdev); + +- return regmap_update_bits(rdev->regmap, di->sleep_reg, ++ return regmap_update_bits(rdev->regmap, di->sleep_en_reg, + VSEL_BUCK_EN, 0); + } + +@@ -317,6 +333,50 @@ static int fan53555_voltages_setup_fairc + return 0; + } + ++static int fan53555_voltages_setup_rockchip(struct fan53555_device_info *di) ++{ ++ /* Init voltage range and step */ ++ switch (di->chip_id) { ++ case RK8600_CHIP_ID_08: ++ di->vsel_min = 712500; ++ di->vsel_step = 12500; ++ break; ++ default: ++ dev_err(di->dev, ++ "Chip ID %d not supported!\n", di->chip_id); ++ return -EINVAL; ++ } ++ di->slew_reg = FAN53555_CONTROL; ++ di->slew_mask = CTL_SLEW_MASK; ++ di->ramp_delay_table = slew_rates; ++ di->n_ramp_values = ARRAY_SIZE(slew_rates); ++ di->vsel_count = FAN53555_NVOLTAGES; ++ ++ return 0; ++} ++ ++static int rk8602_voltages_setup_rockchip(struct fan53555_device_info *di) ++{ ++ /* Init voltage range and step */ ++ switch (di->chip_id) { ++ case RK8602_CHIP_ID_10: ++ di->vsel_min = 500000; ++ di->vsel_step = 6250; ++ break; ++ default: ++ dev_err(di->dev, ++ "Chip ID %d not supported!\n", di->chip_id); ++ return -EINVAL; ++ } ++ di->slew_reg = FAN53555_CONTROL; ++ di->slew_mask = CTL_SLEW_MASK; ++ di->ramp_delay_table = slew_rates; ++ di->n_ramp_values = ARRAY_SIZE(slew_rates); ++ di->vsel_count = RK8602_NVOLTAGES; ++ ++ return 0; ++} ++ + static int fan53555_voltages_setup_silergy(struct fan53555_device_info *di) + { + /* Init voltage range and step */ +@@ -377,6 +437,7 @@ static int fan53555_device_setup(struct + switch (di->vendor) { + case FAN53526_VENDOR_FAIRCHILD: + case FAN53555_VENDOR_FAIRCHILD: ++ case FAN53555_VENDOR_ROCKCHIP: + case FAN53555_VENDOR_SILERGY: + switch (pdata->sleep_vsel_id) { + case FAN53555_VSEL_ID_0: +@@ -391,6 +452,27 @@ static int fan53555_device_setup(struct + dev_err(di->dev, "Invalid VSEL ID!\n"); + return -EINVAL; + } ++ di->sleep_en_reg = di->sleep_reg; ++ di->en_reg = di->vol_reg; ++ break; ++ case RK8602_VENDOR_ROCKCHIP: ++ switch (pdata->sleep_vsel_id) { ++ case FAN53555_VSEL_ID_0: ++ di->sleep_reg = RK8602_VSEL0; ++ di->vol_reg = RK8602_VSEL1; ++ di->sleep_en_reg = FAN53555_VSEL0; ++ di->en_reg = FAN53555_VSEL1; ++ break; ++ case FAN53555_VSEL_ID_1: ++ di->sleep_reg = RK8602_VSEL1; ++ di->vol_reg = RK8602_VSEL0; ++ di->sleep_en_reg = FAN53555_VSEL1; ++ di->en_reg = FAN53555_VSEL0; ++ break; ++ default: ++ dev_err(di->dev, "Invalid VSEL ID!\n"); ++ return -EINVAL; ++ } + break; + case FAN53526_VENDOR_TCS: + switch (pdata->sleep_vsel_id) { +@@ -406,6 +488,8 @@ static int fan53555_device_setup(struct + dev_err(di->dev, "Invalid VSEL ID!\n"); + return -EINVAL; + } ++ di->sleep_en_reg = di->sleep_reg; ++ di->en_reg = di->vol_reg; + break; + default: + dev_err(di->dev, "vendor %d not supported!\n", di->vendor); +@@ -427,10 +511,23 @@ static int fan53555_device_setup(struct + } + break; + case FAN53555_VENDOR_FAIRCHILD: ++ case FAN53555_VENDOR_ROCKCHIP: + case FAN53555_VENDOR_SILERGY: + di->mode_reg = di->vol_reg; + di->mode_mask = VSEL_MODE; + break; ++ case RK8602_VENDOR_ROCKCHIP: ++ di->mode_mask = VSEL_MODE; ++ ++ switch (pdata->sleep_vsel_id) { ++ case FAN53555_VSEL_ID_0: ++ di->mode_reg = FAN53555_VSEL1; ++ break; ++ case FAN53555_VSEL_ID_1: ++ di->mode_reg = FAN53555_VSEL0; ++ break; ++ } ++ break; + case FAN53526_VENDOR_TCS: + di->mode_reg = TCS4525_COMMAND; + +@@ -456,6 +553,12 @@ static int fan53555_device_setup(struct + case FAN53555_VENDOR_FAIRCHILD: + ret = fan53555_voltages_setup_fairchild(di); + break; ++ case FAN53555_VENDOR_ROCKCHIP: ++ ret = fan53555_voltages_setup_rockchip(di); ++ break; ++ case RK8602_VENDOR_ROCKCHIP: ++ ret = rk8602_voltages_setup_rockchip(di); ++ break; + case FAN53555_VENDOR_SILERGY: + ret = fan53555_voltages_setup_silergy(di); + break; +@@ -481,7 +584,7 @@ static int fan53555_regulator_register(s + rdesc->ops = &fan53555_regulator_ops; + rdesc->type = REGULATOR_VOLTAGE; + rdesc->n_voltages = di->vsel_count; +- rdesc->enable_reg = di->vol_reg; ++ rdesc->enable_reg = di->en_reg; + rdesc->enable_mask = VSEL_BUCK_EN; + rdesc->min_uV = di->vsel_min; + rdesc->uV_step = di->vsel_step; +@@ -532,6 +635,12 @@ static const struct of_device_id __maybe + .compatible = "fcs,fan53555", + .data = (void *)FAN53555_VENDOR_FAIRCHILD + }, { ++ .compatible = "rockchip,rk8600", ++ .data = (void *)FAN53555_VENDOR_ROCKCHIP ++ }, { ++ .compatible = "rockchip,rk8602", ++ .data = (void *)RK8602_VENDOR_ROCKCHIP ++ }, { + .compatible = "silergy,syr827", + .data = (void *)FAN53555_VENDOR_SILERGY, + }, { +@@ -638,6 +747,12 @@ static const struct i2c_device_id fan535 + .name = "fan53555", + .driver_data = FAN53555_VENDOR_FAIRCHILD + }, { ++ .name = "rk8600", ++ .driver_data = FAN53555_VENDOR_ROCKCHIP ++ }, { ++ .name = "rk8602", ++ .driver_data = RK8602_VENDOR_ROCKCHIP ++ }, { + .name = "syr827", + .driver_data = FAN53555_VENDOR_SILERGY + }, {