12ece646cSMatti Vaittinen // SPDX-License-Identifier: GPL-2.0 22ece646cSMatti Vaittinen // Copyright (C) 2018 ROHM Semiconductors 32ece646cSMatti Vaittinen // bd71837-regulator.c ROHM BD71837MWV/BD71847MWV regulator driver 42ece646cSMatti Vaittinen 52ece646cSMatti Vaittinen #include <linux/delay.h> 62ece646cSMatti Vaittinen #include <linux/err.h> 72ece646cSMatti Vaittinen #include <linux/interrupt.h> 82ece646cSMatti Vaittinen #include <linux/kernel.h> 92ece646cSMatti Vaittinen #include <linux/mfd/rohm-bd718x7.h> 102ece646cSMatti Vaittinen #include <linux/module.h> 119cce7244SMatti Vaittinen #include <linux/of.h> 122ece646cSMatti Vaittinen #include <linux/platform_device.h> 132ece646cSMatti Vaittinen #include <linux/regulator/driver.h> 142ece646cSMatti Vaittinen #include <linux/regulator/machine.h> 152ece646cSMatti Vaittinen #include <linux/regulator/of_regulator.h> 162ece646cSMatti Vaittinen #include <linux/slab.h> 172ece646cSMatti Vaittinen 182ece646cSMatti Vaittinen /* 192ece646cSMatti Vaittinen * BUCK1/2/3/4 202ece646cSMatti Vaittinen * BUCK1RAMPRATE[1:0] BUCK1 DVS ramp rate setting 212ece646cSMatti Vaittinen * 00: 10.00mV/usec 10mV 1uS 222ece646cSMatti Vaittinen * 01: 5.00mV/usec 10mV 2uS 232ece646cSMatti Vaittinen * 10: 2.50mV/usec 10mV 4uS 242ece646cSMatti Vaittinen * 11: 1.25mV/usec 10mV 8uS 252ece646cSMatti Vaittinen */ 262ece646cSMatti Vaittinen static int bd718xx_buck1234_set_ramp_delay(struct regulator_dev *rdev, 272ece646cSMatti Vaittinen int ramp_delay) 282ece646cSMatti Vaittinen { 290a245f0eSAxel Lin int id = rdev_get_id(rdev); 300a245f0eSAxel Lin unsigned int ramp_value; 312ece646cSMatti Vaittinen 32bcb047ebSAxel Lin dev_dbg(&rdev->dev, "Buck[%d] Set Ramp = %d\n", id + 1, 332ece646cSMatti Vaittinen ramp_delay); 342ece646cSMatti Vaittinen switch (ramp_delay) { 352ece646cSMatti Vaittinen case 1 ... 1250: 362ece646cSMatti Vaittinen ramp_value = BUCK_RAMPRATE_1P25MV; 372ece646cSMatti Vaittinen break; 382ece646cSMatti Vaittinen case 1251 ... 2500: 392ece646cSMatti Vaittinen ramp_value = BUCK_RAMPRATE_2P50MV; 402ece646cSMatti Vaittinen break; 412ece646cSMatti Vaittinen case 2501 ... 5000: 422ece646cSMatti Vaittinen ramp_value = BUCK_RAMPRATE_5P00MV; 432ece646cSMatti Vaittinen break; 442ece646cSMatti Vaittinen case 5001 ... 10000: 452ece646cSMatti Vaittinen ramp_value = BUCK_RAMPRATE_10P00MV; 462ece646cSMatti Vaittinen break; 472ece646cSMatti Vaittinen default: 482ece646cSMatti Vaittinen ramp_value = BUCK_RAMPRATE_10P00MV; 49bcb047ebSAxel Lin dev_err(&rdev->dev, 502ece646cSMatti Vaittinen "%s: ramp_delay: %d not supported, setting 10000mV//us\n", 512ece646cSMatti Vaittinen rdev->desc->name, ramp_delay); 522ece646cSMatti Vaittinen } 532ece646cSMatti Vaittinen 54bcb047ebSAxel Lin return regmap_update_bits(rdev->regmap, BD718XX_REG_BUCK1_CTRL + id, 552ece646cSMatti Vaittinen BUCK_RAMPRATE_MASK, ramp_value << 6); 562ece646cSMatti Vaittinen } 572ece646cSMatti Vaittinen 582ece646cSMatti Vaittinen /* Bucks 1 to 4 support DVS. PWM mode is used when voltage is changed. 592ece646cSMatti Vaittinen * Bucks 5 to 8 and LDOs can use PFM and must be disabled when voltage 602ece646cSMatti Vaittinen * is changed. Hence we return -EBUSY for these if voltage is changed 612ece646cSMatti Vaittinen * when BUCK/LDO is enabled. 622ece646cSMatti Vaittinen */ 632ece646cSMatti Vaittinen static int bd718xx_set_voltage_sel_restricted(struct regulator_dev *rdev, 642ece646cSMatti Vaittinen unsigned int sel) 652ece646cSMatti Vaittinen { 662ece646cSMatti Vaittinen if (regulator_is_enabled_regmap(rdev)) 672ece646cSMatti Vaittinen return -EBUSY; 682ece646cSMatti Vaittinen 692ece646cSMatti Vaittinen return regulator_set_voltage_sel_regmap(rdev, sel); 702ece646cSMatti Vaittinen } 712ece646cSMatti Vaittinen 722ece646cSMatti Vaittinen static int bd718xx_set_voltage_sel_pickable_restricted( 732ece646cSMatti Vaittinen struct regulator_dev *rdev, unsigned int sel) 742ece646cSMatti Vaittinen { 752ece646cSMatti Vaittinen if (regulator_is_enabled_regmap(rdev)) 762ece646cSMatti Vaittinen return -EBUSY; 772ece646cSMatti Vaittinen 782ece646cSMatti Vaittinen return regulator_set_voltage_sel_pickable_regmap(rdev, sel); 792ece646cSMatti Vaittinen } 802ece646cSMatti Vaittinen 81704c5c01SAxel Lin static const struct regulator_ops bd718xx_pickable_range_ldo_ops = { 822ece646cSMatti Vaittinen .enable = regulator_enable_regmap, 832ece646cSMatti Vaittinen .disable = regulator_disable_regmap, 842ece646cSMatti Vaittinen .is_enabled = regulator_is_enabled_regmap, 852ece646cSMatti Vaittinen .list_voltage = regulator_list_voltage_pickable_linear_range, 862ece646cSMatti Vaittinen .set_voltage_sel = bd718xx_set_voltage_sel_pickable_restricted, 872ece646cSMatti Vaittinen .get_voltage_sel = regulator_get_voltage_sel_pickable_regmap, 882ece646cSMatti Vaittinen }; 892ece646cSMatti Vaittinen 90704c5c01SAxel Lin static const struct regulator_ops bd718xx_pickable_range_buck_ops = { 912ece646cSMatti Vaittinen .enable = regulator_enable_regmap, 922ece646cSMatti Vaittinen .disable = regulator_disable_regmap, 932ece646cSMatti Vaittinen .is_enabled = regulator_is_enabled_regmap, 942ece646cSMatti Vaittinen .list_voltage = regulator_list_voltage_pickable_linear_range, 952ece646cSMatti Vaittinen .set_voltage_sel = bd718xx_set_voltage_sel_pickable_restricted, 962ece646cSMatti Vaittinen .get_voltage_sel = regulator_get_voltage_sel_pickable_regmap, 972ece646cSMatti Vaittinen .set_voltage_time_sel = regulator_set_voltage_time_sel, 982ece646cSMatti Vaittinen }; 992ece646cSMatti Vaittinen 100704c5c01SAxel Lin static const struct regulator_ops bd718xx_ldo_regulator_ops = { 1012ece646cSMatti Vaittinen .enable = regulator_enable_regmap, 1022ece646cSMatti Vaittinen .disable = regulator_disable_regmap, 1032ece646cSMatti Vaittinen .is_enabled = regulator_is_enabled_regmap, 1042ece646cSMatti Vaittinen .list_voltage = regulator_list_voltage_linear_range, 1052ece646cSMatti Vaittinen .set_voltage_sel = bd718xx_set_voltage_sel_restricted, 1062ece646cSMatti Vaittinen .get_voltage_sel = regulator_get_voltage_sel_regmap, 1072ece646cSMatti Vaittinen }; 1082ece646cSMatti Vaittinen 109704c5c01SAxel Lin static const struct regulator_ops bd718xx_ldo_regulator_nolinear_ops = { 1102ece646cSMatti Vaittinen .enable = regulator_enable_regmap, 1112ece646cSMatti Vaittinen .disable = regulator_disable_regmap, 1122ece646cSMatti Vaittinen .is_enabled = regulator_is_enabled_regmap, 1132ece646cSMatti Vaittinen .list_voltage = regulator_list_voltage_table, 1142ece646cSMatti Vaittinen .set_voltage_sel = bd718xx_set_voltage_sel_restricted, 1152ece646cSMatti Vaittinen .get_voltage_sel = regulator_get_voltage_sel_regmap, 1162ece646cSMatti Vaittinen }; 1172ece646cSMatti Vaittinen 118704c5c01SAxel Lin static const struct regulator_ops bd718xx_buck_regulator_ops = { 1192ece646cSMatti Vaittinen .enable = regulator_enable_regmap, 1202ece646cSMatti Vaittinen .disable = regulator_disable_regmap, 1212ece646cSMatti Vaittinen .is_enabled = regulator_is_enabled_regmap, 1222ece646cSMatti Vaittinen .list_voltage = regulator_list_voltage_linear_range, 1232ece646cSMatti Vaittinen .set_voltage_sel = bd718xx_set_voltage_sel_restricted, 1242ece646cSMatti Vaittinen .get_voltage_sel = regulator_get_voltage_sel_regmap, 1252ece646cSMatti Vaittinen .set_voltage_time_sel = regulator_set_voltage_time_sel, 1262ece646cSMatti Vaittinen }; 1272ece646cSMatti Vaittinen 128704c5c01SAxel Lin static const struct regulator_ops bd718xx_buck_regulator_nolinear_ops = { 1292ece646cSMatti Vaittinen .enable = regulator_enable_regmap, 1302ece646cSMatti Vaittinen .disable = regulator_disable_regmap, 1312ece646cSMatti Vaittinen .is_enabled = regulator_is_enabled_regmap, 1322ece646cSMatti Vaittinen .list_voltage = regulator_list_voltage_table, 1332e61286dSAxel Lin .map_voltage = regulator_map_voltage_ascend, 1342ece646cSMatti Vaittinen .set_voltage_sel = bd718xx_set_voltage_sel_restricted, 1352ece646cSMatti Vaittinen .get_voltage_sel = regulator_get_voltage_sel_regmap, 1362ece646cSMatti Vaittinen .set_voltage_time_sel = regulator_set_voltage_time_sel, 1372ece646cSMatti Vaittinen }; 1382ece646cSMatti Vaittinen 139704c5c01SAxel Lin static const struct regulator_ops bd718xx_dvs_buck_regulator_ops = { 1402ece646cSMatti Vaittinen .enable = regulator_enable_regmap, 1412ece646cSMatti Vaittinen .disable = regulator_disable_regmap, 1422ece646cSMatti Vaittinen .is_enabled = regulator_is_enabled_regmap, 1432ece646cSMatti Vaittinen .list_voltage = regulator_list_voltage_linear_range, 1442ece646cSMatti Vaittinen .set_voltage_sel = regulator_set_voltage_sel_regmap, 1452ece646cSMatti Vaittinen .get_voltage_sel = regulator_get_voltage_sel_regmap, 1462ece646cSMatti Vaittinen .set_voltage_time_sel = regulator_set_voltage_time_sel, 1472ece646cSMatti Vaittinen .set_ramp_delay = bd718xx_buck1234_set_ramp_delay, 1482ece646cSMatti Vaittinen }; 1492ece646cSMatti Vaittinen 1502ece646cSMatti Vaittinen /* 1512ece646cSMatti Vaittinen * BD71837 BUCK1/2/3/4 1522ece646cSMatti Vaittinen * BD71847 BUCK1/2 1532ece646cSMatti Vaittinen * 0.70 to 1.30V (10mV step) 1542ece646cSMatti Vaittinen */ 1552ece646cSMatti Vaittinen static const struct regulator_linear_range bd718xx_dvs_buck_volts[] = { 1562ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(700000, 0x00, 0x3C, 10000), 1572ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(1300000, 0x3D, 0x3F, 0), 1582ece646cSMatti Vaittinen }; 1592ece646cSMatti Vaittinen 1602ece646cSMatti Vaittinen /* 1612ece646cSMatti Vaittinen * BD71837 BUCK5 1622ece646cSMatti Vaittinen * 0.7V to 1.35V (range 0) 1632ece646cSMatti Vaittinen * and 1642ece646cSMatti Vaittinen * 0.675 to 1.325 (range 1) 1652ece646cSMatti Vaittinen */ 1662ece646cSMatti Vaittinen static const struct regulator_linear_range bd71837_buck5_volts[] = { 1672ece646cSMatti Vaittinen /* Ranges when VOLT_SEL bit is 0 */ 1682ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(700000, 0x00, 0x03, 100000), 1692ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(1050000, 0x04, 0x05, 50000), 1702ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(1200000, 0x06, 0x07, 150000), 1712ece646cSMatti Vaittinen /* Ranges when VOLT_SEL bit is 1 */ 1722ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(675000, 0x0, 0x3, 100000), 1732ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(1025000, 0x4, 0x5, 50000), 1742ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(1175000, 0x6, 0x7, 150000), 1752ece646cSMatti Vaittinen }; 1762ece646cSMatti Vaittinen 1772ece646cSMatti Vaittinen /* 1782ece646cSMatti Vaittinen * Range selector for first 3 linear ranges is 0x0 1792ece646cSMatti Vaittinen * and 0x1 for last 3 ranges. 1802ece646cSMatti Vaittinen */ 1812ece646cSMatti Vaittinen static const unsigned int bd71837_buck5_volt_range_sel[] = { 1822ece646cSMatti Vaittinen 0x0, 0x0, 0x0, 0x80, 0x80, 0x80 1832ece646cSMatti Vaittinen }; 1842ece646cSMatti Vaittinen 1852ece646cSMatti Vaittinen /* 1862ece646cSMatti Vaittinen * BD71847 BUCK3 1872ece646cSMatti Vaittinen */ 1882ece646cSMatti Vaittinen static const struct regulator_linear_range bd71847_buck3_volts[] = { 1892ece646cSMatti Vaittinen /* Ranges when VOLT_SEL bits are 00 */ 1902ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(700000, 0x00, 0x03, 100000), 1912ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(1050000, 0x04, 0x05, 50000), 1922ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(1200000, 0x06, 0x07, 150000), 1932ece646cSMatti Vaittinen /* Ranges when VOLT_SEL bits are 01 */ 1942ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(550000, 0x0, 0x7, 50000), 1952ece646cSMatti Vaittinen /* Ranges when VOLT_SEL bits are 11 */ 1962ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(675000, 0x0, 0x3, 100000), 1972ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(1025000, 0x4, 0x5, 50000), 1982ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(1175000, 0x6, 0x7, 150000), 1992ece646cSMatti Vaittinen }; 2002ece646cSMatti Vaittinen 2012ece646cSMatti Vaittinen static const unsigned int bd71847_buck3_volt_range_sel[] = { 2022ece646cSMatti Vaittinen 0x0, 0x0, 0x0, 0x40, 0x80, 0x80, 0x80 2032ece646cSMatti Vaittinen }; 2042ece646cSMatti Vaittinen 2052ece646cSMatti Vaittinen static const struct regulator_linear_range bd71847_buck4_volts[] = { 2062ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(3000000, 0x00, 0x03, 100000), 2072ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(2600000, 0x00, 0x03, 100000), 2082ece646cSMatti Vaittinen }; 2092ece646cSMatti Vaittinen 2102ece646cSMatti Vaittinen static const unsigned int bd71847_buck4_volt_range_sel[] = { 0x0, 0x40 }; 2112ece646cSMatti Vaittinen 2122ece646cSMatti Vaittinen /* 2132ece646cSMatti Vaittinen * BUCK6 2142ece646cSMatti Vaittinen * 3.0V to 3.3V (step 100mV) 2152ece646cSMatti Vaittinen */ 2162ece646cSMatti Vaittinen static const struct regulator_linear_range bd71837_buck6_volts[] = { 2172ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(3000000, 0x00, 0x03, 100000), 2182ece646cSMatti Vaittinen }; 2192ece646cSMatti Vaittinen 2202ece646cSMatti Vaittinen /* 2212ece646cSMatti Vaittinen * BD71837 BUCK7 2222ece646cSMatti Vaittinen * BD71847 BUCK5 2232ece646cSMatti Vaittinen * 000 = 1.605V 2242ece646cSMatti Vaittinen * 001 = 1.695V 2252ece646cSMatti Vaittinen * 010 = 1.755V 2262ece646cSMatti Vaittinen * 011 = 1.8V (Initial) 2272ece646cSMatti Vaittinen * 100 = 1.845V 2282ece646cSMatti Vaittinen * 101 = 1.905V 2292ece646cSMatti Vaittinen * 110 = 1.95V 2302ece646cSMatti Vaittinen * 111 = 1.995V 2312ece646cSMatti Vaittinen */ 2322ece646cSMatti Vaittinen static const unsigned int bd718xx_3rd_nodvs_buck_volts[] = { 2332ece646cSMatti Vaittinen 1605000, 1695000, 1755000, 1800000, 1845000, 1905000, 1950000, 1995000 2342ece646cSMatti Vaittinen }; 2352ece646cSMatti Vaittinen 2362ece646cSMatti Vaittinen /* 2372ece646cSMatti Vaittinen * BUCK8 2382ece646cSMatti Vaittinen * 0.8V to 1.40V (step 10mV) 2392ece646cSMatti Vaittinen */ 2402ece646cSMatti Vaittinen static const struct regulator_linear_range bd718xx_4th_nodvs_buck_volts[] = { 2412ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(800000, 0x00, 0x3C, 10000), 2422ece646cSMatti Vaittinen }; 2432ece646cSMatti Vaittinen 2442ece646cSMatti Vaittinen /* 2452ece646cSMatti Vaittinen * LDO1 2462ece646cSMatti Vaittinen * 3.0 to 3.3V (100mV step) 2472ece646cSMatti Vaittinen */ 2482ece646cSMatti Vaittinen static const struct regulator_linear_range bd718xx_ldo1_volts[] = { 2492ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(3000000, 0x00, 0x03, 100000), 2502ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(1600000, 0x00, 0x03, 100000), 2512ece646cSMatti Vaittinen }; 2522ece646cSMatti Vaittinen 2532ece646cSMatti Vaittinen static const unsigned int bd718xx_ldo1_volt_range_sel[] = { 0x0, 0x20 }; 2542ece646cSMatti Vaittinen 2552ece646cSMatti Vaittinen /* 2562ece646cSMatti Vaittinen * LDO2 2572ece646cSMatti Vaittinen * 0.8 or 0.9V 2582ece646cSMatti Vaittinen */ 2592ece646cSMatti Vaittinen static const unsigned int ldo_2_volts[] = { 2602ece646cSMatti Vaittinen 900000, 800000 2612ece646cSMatti Vaittinen }; 2622ece646cSMatti Vaittinen 2632ece646cSMatti Vaittinen /* 2642ece646cSMatti Vaittinen * LDO3 2652ece646cSMatti Vaittinen * 1.8 to 3.3V (100mV step) 2662ece646cSMatti Vaittinen */ 2672ece646cSMatti Vaittinen static const struct regulator_linear_range bd718xx_ldo3_volts[] = { 2682ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(1800000, 0x00, 0x0F, 100000), 2692ece646cSMatti Vaittinen }; 2702ece646cSMatti Vaittinen 2712ece646cSMatti Vaittinen /* 2722ece646cSMatti Vaittinen * LDO4 2732ece646cSMatti Vaittinen * 0.9 to 1.8V (100mV step) 2742ece646cSMatti Vaittinen */ 2752ece646cSMatti Vaittinen static const struct regulator_linear_range bd718xx_ldo4_volts[] = { 2762ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(900000, 0x00, 0x09, 100000), 2772ece646cSMatti Vaittinen }; 2782ece646cSMatti Vaittinen 2792ece646cSMatti Vaittinen /* 2802ece646cSMatti Vaittinen * LDO5 for BD71837 2812ece646cSMatti Vaittinen * 1.8 to 3.3V (100mV step) 2822ece646cSMatti Vaittinen */ 2832ece646cSMatti Vaittinen static const struct regulator_linear_range bd71837_ldo5_volts[] = { 2842ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(1800000, 0x00, 0x0F, 100000), 2852ece646cSMatti Vaittinen }; 2862ece646cSMatti Vaittinen 2872ece646cSMatti Vaittinen /* 2882ece646cSMatti Vaittinen * LDO5 for BD71837 2892ece646cSMatti Vaittinen * 1.8 to 3.3V (100mV step) 2902ece646cSMatti Vaittinen */ 2912ece646cSMatti Vaittinen static const struct regulator_linear_range bd71847_ldo5_volts[] = { 2922ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(1800000, 0x00, 0x0F, 100000), 2932ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(800000, 0x00, 0x0F, 100000), 2942ece646cSMatti Vaittinen }; 2952ece646cSMatti Vaittinen 2962ece646cSMatti Vaittinen static const unsigned int bd71847_ldo5_volt_range_sel[] = { 0x0, 0x20 }; 2972ece646cSMatti Vaittinen 2982ece646cSMatti Vaittinen /* 2992ece646cSMatti Vaittinen * LDO6 3002ece646cSMatti Vaittinen * 0.9 to 1.8V (100mV step) 3012ece646cSMatti Vaittinen */ 3022ece646cSMatti Vaittinen static const struct regulator_linear_range bd718xx_ldo6_volts[] = { 3032ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(900000, 0x00, 0x09, 100000), 3042ece646cSMatti Vaittinen }; 3052ece646cSMatti Vaittinen 3062ece646cSMatti Vaittinen /* 3072ece646cSMatti Vaittinen * LDO7 3082ece646cSMatti Vaittinen * 1.8 to 3.3V (100mV step) 3092ece646cSMatti Vaittinen */ 3102ece646cSMatti Vaittinen static const struct regulator_linear_range bd71837_ldo7_volts[] = { 3112ece646cSMatti Vaittinen REGULATOR_LINEAR_RANGE(1800000, 0x00, 0x0F, 100000), 3122ece646cSMatti Vaittinen }; 3132ece646cSMatti Vaittinen 3142ece646cSMatti Vaittinen struct reg_init { 3152ece646cSMatti Vaittinen unsigned int reg; 3162ece646cSMatti Vaittinen unsigned int mask; 3172ece646cSMatti Vaittinen unsigned int val; 3182ece646cSMatti Vaittinen }; 3192ece646cSMatti Vaittinen struct bd718xx_regulator_data { 3202ece646cSMatti Vaittinen struct regulator_desc desc; 3212ece646cSMatti Vaittinen const struct reg_init init; 3222ece646cSMatti Vaittinen const struct reg_init *additional_inits; 3232ece646cSMatti Vaittinen int additional_init_amnt; 3242ece646cSMatti Vaittinen }; 3252ece646cSMatti Vaittinen 3262ece646cSMatti Vaittinen /* 3272ece646cSMatti Vaittinen * There is a HW quirk in BD71837. The shutdown sequence timings for 3282ece646cSMatti Vaittinen * bucks/LDOs which are controlled via register interface are changed. 3292ece646cSMatti Vaittinen * At PMIC poweroff the voltage for BUCK6/7 is cut immediately at the 3302ece646cSMatti Vaittinen * beginning of shut-down sequence. As bucks 6 and 7 are parent 3312ece646cSMatti Vaittinen * supplies for LDO5 and LDO6 - this causes LDO5/6 voltage 3322ece646cSMatti Vaittinen * monitoring to errorneously detect under voltage and force PMIC to 3332ece646cSMatti Vaittinen * emergency state instead of poweroff. In order to avoid this we 3342ece646cSMatti Vaittinen * disable voltage monitoring for LDO5 and LDO6 3352ece646cSMatti Vaittinen */ 3362ece646cSMatti Vaittinen static const struct reg_init bd71837_ldo5_inits[] = { 3372ece646cSMatti Vaittinen { 3382ece646cSMatti Vaittinen .reg = BD718XX_REG_MVRFLTMASK2, 3392ece646cSMatti Vaittinen .mask = BD718XX_LDO5_VRMON80, 3402ece646cSMatti Vaittinen .val = BD718XX_LDO5_VRMON80, 3412ece646cSMatti Vaittinen }, 3422ece646cSMatti Vaittinen }; 3432ece646cSMatti Vaittinen 3442ece646cSMatti Vaittinen static const struct reg_init bd71837_ldo6_inits[] = { 3452ece646cSMatti Vaittinen { 3462ece646cSMatti Vaittinen .reg = BD718XX_REG_MVRFLTMASK2, 3472ece646cSMatti Vaittinen .mask = BD718XX_LDO6_VRMON80, 3482ece646cSMatti Vaittinen .val = BD718XX_LDO6_VRMON80, 3492ece646cSMatti Vaittinen }, 3502ece646cSMatti Vaittinen }; 3512ece646cSMatti Vaittinen 352049369d4SMatti Vaittinen #define NUM_DVS_BUCKS 4 353049369d4SMatti Vaittinen 354049369d4SMatti Vaittinen struct of_dvs_setting { 355049369d4SMatti Vaittinen const char *prop; 356049369d4SMatti Vaittinen unsigned int reg; 357049369d4SMatti Vaittinen }; 358049369d4SMatti Vaittinen 359049369d4SMatti Vaittinen static int set_dvs_levels(const struct of_dvs_setting *dvs, 360049369d4SMatti Vaittinen struct device_node *np, 361049369d4SMatti Vaittinen const struct regulator_desc *desc, 362049369d4SMatti Vaittinen struct regmap *regmap) 363049369d4SMatti Vaittinen { 364049369d4SMatti Vaittinen int ret, i; 365049369d4SMatti Vaittinen unsigned int uv; 366049369d4SMatti Vaittinen 367049369d4SMatti Vaittinen ret = of_property_read_u32(np, dvs->prop, &uv); 368049369d4SMatti Vaittinen if (ret) { 369049369d4SMatti Vaittinen if (ret != -EINVAL) 370049369d4SMatti Vaittinen return ret; 371049369d4SMatti Vaittinen return 0; 372049369d4SMatti Vaittinen } 373049369d4SMatti Vaittinen 374049369d4SMatti Vaittinen for (i = 0; i < desc->n_voltages; i++) { 375049369d4SMatti Vaittinen ret = regulator_desc_list_voltage_linear_range(desc, i); 376049369d4SMatti Vaittinen if (ret < 0) 377049369d4SMatti Vaittinen continue; 378049369d4SMatti Vaittinen if (ret == uv) { 379049369d4SMatti Vaittinen i <<= ffs(desc->vsel_mask) - 1; 380049369d4SMatti Vaittinen ret = regmap_update_bits(regmap, dvs->reg, 381049369d4SMatti Vaittinen DVS_BUCK_RUN_MASK, i); 382049369d4SMatti Vaittinen break; 383049369d4SMatti Vaittinen } 384049369d4SMatti Vaittinen } 385049369d4SMatti Vaittinen return ret; 386049369d4SMatti Vaittinen } 387049369d4SMatti Vaittinen 388049369d4SMatti Vaittinen static int buck4_set_hw_dvs_levels(struct device_node *np, 389049369d4SMatti Vaittinen const struct regulator_desc *desc, 390049369d4SMatti Vaittinen struct regulator_config *cfg) 391049369d4SMatti Vaittinen { 392049369d4SMatti Vaittinen int ret, i; 393049369d4SMatti Vaittinen const struct of_dvs_setting dvs[] = { 394049369d4SMatti Vaittinen { 395049369d4SMatti Vaittinen .prop = "rohm,dvs-run-voltage", 396049369d4SMatti Vaittinen .reg = BD71837_REG_BUCK4_VOLT_RUN, 397049369d4SMatti Vaittinen }, 398049369d4SMatti Vaittinen }; 399049369d4SMatti Vaittinen 400049369d4SMatti Vaittinen for (i = 0; i < ARRAY_SIZE(dvs); i++) { 401049369d4SMatti Vaittinen ret = set_dvs_levels(&dvs[i], np, desc, cfg->regmap); 402049369d4SMatti Vaittinen if (ret) 403049369d4SMatti Vaittinen break; 404049369d4SMatti Vaittinen } 405049369d4SMatti Vaittinen return ret; 406049369d4SMatti Vaittinen } 407049369d4SMatti Vaittinen static int buck3_set_hw_dvs_levels(struct device_node *np, 408049369d4SMatti Vaittinen const struct regulator_desc *desc, 409049369d4SMatti Vaittinen struct regulator_config *cfg) 410049369d4SMatti Vaittinen { 411049369d4SMatti Vaittinen int ret, i; 412049369d4SMatti Vaittinen const struct of_dvs_setting dvs[] = { 413049369d4SMatti Vaittinen { 414049369d4SMatti Vaittinen .prop = "rohm,dvs-run-voltage", 415049369d4SMatti Vaittinen .reg = BD71837_REG_BUCK3_VOLT_RUN, 416049369d4SMatti Vaittinen }, 417049369d4SMatti Vaittinen }; 418049369d4SMatti Vaittinen 419049369d4SMatti Vaittinen for (i = 0; i < ARRAY_SIZE(dvs); i++) { 420049369d4SMatti Vaittinen ret = set_dvs_levels(&dvs[i], np, desc, cfg->regmap); 421049369d4SMatti Vaittinen if (ret) 422049369d4SMatti Vaittinen break; 423049369d4SMatti Vaittinen } 424049369d4SMatti Vaittinen return ret; 425049369d4SMatti Vaittinen } 426049369d4SMatti Vaittinen 427049369d4SMatti Vaittinen static int buck2_set_hw_dvs_levels(struct device_node *np, 428049369d4SMatti Vaittinen const struct regulator_desc *desc, 429049369d4SMatti Vaittinen struct regulator_config *cfg) 430049369d4SMatti Vaittinen { 431049369d4SMatti Vaittinen int ret, i; 432049369d4SMatti Vaittinen const struct of_dvs_setting dvs[] = { 433049369d4SMatti Vaittinen { 434049369d4SMatti Vaittinen .prop = "rohm,dvs-run-voltage", 435049369d4SMatti Vaittinen .reg = BD718XX_REG_BUCK2_VOLT_RUN, 436049369d4SMatti Vaittinen }, 437049369d4SMatti Vaittinen { 438049369d4SMatti Vaittinen .prop = "rohm,dvs-idle-voltage", 439049369d4SMatti Vaittinen .reg = BD718XX_REG_BUCK2_VOLT_IDLE, 440049369d4SMatti Vaittinen }, 441049369d4SMatti Vaittinen }; 442049369d4SMatti Vaittinen 443049369d4SMatti Vaittinen 444049369d4SMatti Vaittinen 445049369d4SMatti Vaittinen for (i = 0; i < ARRAY_SIZE(dvs); i++) { 446049369d4SMatti Vaittinen ret = set_dvs_levels(&dvs[i], np, desc, cfg->regmap); 447049369d4SMatti Vaittinen if (ret) 448049369d4SMatti Vaittinen break; 449049369d4SMatti Vaittinen } 450049369d4SMatti Vaittinen return ret; 451049369d4SMatti Vaittinen } 452049369d4SMatti Vaittinen 453049369d4SMatti Vaittinen static int buck1_set_hw_dvs_levels(struct device_node *np, 454049369d4SMatti Vaittinen const struct regulator_desc *desc, 455049369d4SMatti Vaittinen struct regulator_config *cfg) 456049369d4SMatti Vaittinen { 457049369d4SMatti Vaittinen int ret, i; 458049369d4SMatti Vaittinen const struct of_dvs_setting dvs[] = { 459049369d4SMatti Vaittinen { 460049369d4SMatti Vaittinen .prop = "rohm,dvs-run-voltage", 461049369d4SMatti Vaittinen .reg = BD718XX_REG_BUCK1_VOLT_RUN, 462049369d4SMatti Vaittinen }, 463049369d4SMatti Vaittinen { 464049369d4SMatti Vaittinen .prop = "rohm,dvs-idle-voltage", 465049369d4SMatti Vaittinen .reg = BD718XX_REG_BUCK1_VOLT_IDLE, 466049369d4SMatti Vaittinen }, 467049369d4SMatti Vaittinen { 468049369d4SMatti Vaittinen .prop = "rohm,dvs-suspend-voltage", 469049369d4SMatti Vaittinen .reg = BD718XX_REG_BUCK1_VOLT_SUSP, 470049369d4SMatti Vaittinen }, 471049369d4SMatti Vaittinen }; 472049369d4SMatti Vaittinen 473049369d4SMatti Vaittinen for (i = 0; i < ARRAY_SIZE(dvs); i++) { 474049369d4SMatti Vaittinen ret = set_dvs_levels(&dvs[i], np, desc, cfg->regmap); 475049369d4SMatti Vaittinen if (ret) 476049369d4SMatti Vaittinen break; 477049369d4SMatti Vaittinen } 478049369d4SMatti Vaittinen return ret; 479049369d4SMatti Vaittinen } 480049369d4SMatti Vaittinen 4812ece646cSMatti Vaittinen static const struct bd718xx_regulator_data bd71847_regulators[] = { 4822ece646cSMatti Vaittinen { 4832ece646cSMatti Vaittinen .desc = { 4842ece646cSMatti Vaittinen .name = "buck1", 4852ece646cSMatti Vaittinen .of_match = of_match_ptr("BUCK1"), 4862ece646cSMatti Vaittinen .regulators_node = of_match_ptr("regulators"), 4872ece646cSMatti Vaittinen .id = BD718XX_BUCK1, 4882ece646cSMatti Vaittinen .ops = &bd718xx_dvs_buck_regulator_ops, 4892ece646cSMatti Vaittinen .type = REGULATOR_VOLTAGE, 4902ece646cSMatti Vaittinen .n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM, 4912ece646cSMatti Vaittinen .linear_ranges = bd718xx_dvs_buck_volts, 4922ece646cSMatti Vaittinen .n_linear_ranges = 4932ece646cSMatti Vaittinen ARRAY_SIZE(bd718xx_dvs_buck_volts), 4942ece646cSMatti Vaittinen .vsel_reg = BD718XX_REG_BUCK1_VOLT_RUN, 4952ece646cSMatti Vaittinen .vsel_mask = DVS_BUCK_RUN_MASK, 4962ece646cSMatti Vaittinen .enable_reg = BD718XX_REG_BUCK1_CTRL, 4972ece646cSMatti Vaittinen .enable_mask = BD718XX_BUCK_EN, 4982ece646cSMatti Vaittinen .owner = THIS_MODULE, 499049369d4SMatti Vaittinen .of_parse_cb = buck1_set_hw_dvs_levels, 5002ece646cSMatti Vaittinen }, 5012ece646cSMatti Vaittinen .init = { 5022ece646cSMatti Vaittinen .reg = BD718XX_REG_BUCK1_CTRL, 5032ece646cSMatti Vaittinen .mask = BD718XX_BUCK_SEL, 5042ece646cSMatti Vaittinen .val = BD718XX_BUCK_SEL, 5052ece646cSMatti Vaittinen }, 5062ece646cSMatti Vaittinen }, 5072ece646cSMatti Vaittinen { 5082ece646cSMatti Vaittinen .desc = { 5092ece646cSMatti Vaittinen .name = "buck2", 5102ece646cSMatti Vaittinen .of_match = of_match_ptr("BUCK2"), 5112ece646cSMatti Vaittinen .regulators_node = of_match_ptr("regulators"), 5122ece646cSMatti Vaittinen .id = BD718XX_BUCK2, 5132ece646cSMatti Vaittinen .ops = &bd718xx_dvs_buck_regulator_ops, 5142ece646cSMatti Vaittinen .type = REGULATOR_VOLTAGE, 5152ece646cSMatti Vaittinen .n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM, 5162ece646cSMatti Vaittinen .linear_ranges = bd718xx_dvs_buck_volts, 5172ece646cSMatti Vaittinen .n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts), 5182ece646cSMatti Vaittinen .vsel_reg = BD718XX_REG_BUCK2_VOLT_RUN, 5192ece646cSMatti Vaittinen .vsel_mask = DVS_BUCK_RUN_MASK, 5202ece646cSMatti Vaittinen .enable_reg = BD718XX_REG_BUCK2_CTRL, 5212ece646cSMatti Vaittinen .enable_mask = BD718XX_BUCK_EN, 5222ece646cSMatti Vaittinen .owner = THIS_MODULE, 523049369d4SMatti Vaittinen .of_parse_cb = buck2_set_hw_dvs_levels, 5242ece646cSMatti Vaittinen }, 5252ece646cSMatti Vaittinen .init = { 5262ece646cSMatti Vaittinen .reg = BD718XX_REG_BUCK2_CTRL, 5272ece646cSMatti Vaittinen .mask = BD718XX_BUCK_SEL, 5282ece646cSMatti Vaittinen .val = BD718XX_BUCK_SEL, 5292ece646cSMatti Vaittinen }, 5302ece646cSMatti Vaittinen }, 5312ece646cSMatti Vaittinen { 5322ece646cSMatti Vaittinen .desc = { 5332ece646cSMatti Vaittinen .name = "buck3", 5342ece646cSMatti Vaittinen .of_match = of_match_ptr("BUCK3"), 5352ece646cSMatti Vaittinen .regulators_node = of_match_ptr("regulators"), 5362ece646cSMatti Vaittinen .id = BD718XX_BUCK3, 5372ece646cSMatti Vaittinen .ops = &bd718xx_pickable_range_buck_ops, 5382ece646cSMatti Vaittinen .type = REGULATOR_VOLTAGE, 5392ece646cSMatti Vaittinen .n_voltages = BD71847_BUCK3_VOLTAGE_NUM, 5402ece646cSMatti Vaittinen .linear_ranges = bd71847_buck3_volts, 5412ece646cSMatti Vaittinen .n_linear_ranges = 5422ece646cSMatti Vaittinen ARRAY_SIZE(bd71847_buck3_volts), 5432ece646cSMatti Vaittinen .vsel_reg = BD718XX_REG_1ST_NODVS_BUCK_VOLT, 5442ece646cSMatti Vaittinen .vsel_mask = BD718XX_1ST_NODVS_BUCK_MASK, 5452ece646cSMatti Vaittinen .vsel_range_reg = BD718XX_REG_1ST_NODVS_BUCK_VOLT, 5462ece646cSMatti Vaittinen .vsel_range_mask = BD71847_BUCK3_RANGE_MASK, 5472ece646cSMatti Vaittinen .linear_range_selectors = bd71847_buck3_volt_range_sel, 5482ece646cSMatti Vaittinen .enable_reg = BD718XX_REG_1ST_NODVS_BUCK_CTRL, 5492ece646cSMatti Vaittinen .enable_mask = BD718XX_BUCK_EN, 5502ece646cSMatti Vaittinen .owner = THIS_MODULE, 5512ece646cSMatti Vaittinen }, 5522ece646cSMatti Vaittinen .init = { 5532ece646cSMatti Vaittinen .reg = BD718XX_REG_1ST_NODVS_BUCK_CTRL, 5542ece646cSMatti Vaittinen .mask = BD718XX_BUCK_SEL, 5552ece646cSMatti Vaittinen .val = BD718XX_BUCK_SEL, 5562ece646cSMatti Vaittinen }, 5572ece646cSMatti Vaittinen }, 5582ece646cSMatti Vaittinen { 5592ece646cSMatti Vaittinen .desc = { 5602ece646cSMatti Vaittinen .name = "buck4", 5612ece646cSMatti Vaittinen .of_match = of_match_ptr("BUCK4"), 5622ece646cSMatti Vaittinen .regulators_node = of_match_ptr("regulators"), 5632ece646cSMatti Vaittinen .id = BD718XX_BUCK4, 5642ece646cSMatti Vaittinen .ops = &bd718xx_pickable_range_buck_ops, 5652ece646cSMatti Vaittinen .type = REGULATOR_VOLTAGE, 5662ece646cSMatti Vaittinen .n_voltages = BD71847_BUCK4_VOLTAGE_NUM, 5672ece646cSMatti Vaittinen .linear_ranges = bd71847_buck4_volts, 5682ece646cSMatti Vaittinen .n_linear_ranges = 5692ece646cSMatti Vaittinen ARRAY_SIZE(bd71847_buck4_volts), 5702ece646cSMatti Vaittinen .enable_reg = BD718XX_REG_2ND_NODVS_BUCK_CTRL, 5712ece646cSMatti Vaittinen .vsel_reg = BD718XX_REG_2ND_NODVS_BUCK_VOLT, 5722ece646cSMatti Vaittinen .vsel_mask = BD71847_BUCK4_MASK, 5732ece646cSMatti Vaittinen .vsel_range_reg = BD718XX_REG_2ND_NODVS_BUCK_VOLT, 5742ece646cSMatti Vaittinen .vsel_range_mask = BD71847_BUCK4_RANGE_MASK, 5752ece646cSMatti Vaittinen .linear_range_selectors = bd71847_buck4_volt_range_sel, 5762ece646cSMatti Vaittinen .enable_mask = BD718XX_BUCK_EN, 5772ece646cSMatti Vaittinen .owner = THIS_MODULE, 5782ece646cSMatti Vaittinen }, 5792ece646cSMatti Vaittinen .init = { 5802ece646cSMatti Vaittinen .reg = BD718XX_REG_2ND_NODVS_BUCK_CTRL, 5812ece646cSMatti Vaittinen .mask = BD718XX_BUCK_SEL, 5822ece646cSMatti Vaittinen .val = BD718XX_BUCK_SEL, 5832ece646cSMatti Vaittinen }, 5842ece646cSMatti Vaittinen }, 5852ece646cSMatti Vaittinen { 5862ece646cSMatti Vaittinen .desc = { 5872ece646cSMatti Vaittinen .name = "buck5", 5882ece646cSMatti Vaittinen .of_match = of_match_ptr("BUCK5"), 5892ece646cSMatti Vaittinen .regulators_node = of_match_ptr("regulators"), 5902ece646cSMatti Vaittinen .id = BD718XX_BUCK5, 5912ece646cSMatti Vaittinen .ops = &bd718xx_buck_regulator_nolinear_ops, 5922ece646cSMatti Vaittinen .type = REGULATOR_VOLTAGE, 5932ece646cSMatti Vaittinen .volt_table = &bd718xx_3rd_nodvs_buck_volts[0], 5942ece646cSMatti Vaittinen .n_voltages = ARRAY_SIZE(bd718xx_3rd_nodvs_buck_volts), 5952ece646cSMatti Vaittinen .vsel_reg = BD718XX_REG_3RD_NODVS_BUCK_VOLT, 5962ece646cSMatti Vaittinen .vsel_mask = BD718XX_3RD_NODVS_BUCK_MASK, 5972ece646cSMatti Vaittinen .enable_reg = BD718XX_REG_3RD_NODVS_BUCK_CTRL, 5982ece646cSMatti Vaittinen .enable_mask = BD718XX_BUCK_EN, 5992ece646cSMatti Vaittinen .owner = THIS_MODULE, 6002ece646cSMatti Vaittinen }, 6012ece646cSMatti Vaittinen .init = { 6022ece646cSMatti Vaittinen .reg = BD718XX_REG_3RD_NODVS_BUCK_CTRL, 6032ece646cSMatti Vaittinen .mask = BD718XX_BUCK_SEL, 6042ece646cSMatti Vaittinen .val = BD718XX_BUCK_SEL, 6052ece646cSMatti Vaittinen }, 6062ece646cSMatti Vaittinen }, 6072ece646cSMatti Vaittinen { 6082ece646cSMatti Vaittinen .desc = { 6092ece646cSMatti Vaittinen .name = "buck6", 6102ece646cSMatti Vaittinen .of_match = of_match_ptr("BUCK6"), 6112ece646cSMatti Vaittinen .regulators_node = of_match_ptr("regulators"), 6122ece646cSMatti Vaittinen .id = BD718XX_BUCK6, 6132ece646cSMatti Vaittinen .ops = &bd718xx_buck_regulator_ops, 6142ece646cSMatti Vaittinen .type = REGULATOR_VOLTAGE, 6152ece646cSMatti Vaittinen .n_voltages = BD718XX_4TH_NODVS_BUCK_VOLTAGE_NUM, 6162ece646cSMatti Vaittinen .linear_ranges = bd718xx_4th_nodvs_buck_volts, 6172ece646cSMatti Vaittinen .n_linear_ranges = 6182ece646cSMatti Vaittinen ARRAY_SIZE(bd718xx_4th_nodvs_buck_volts), 6192ece646cSMatti Vaittinen .vsel_reg = BD718XX_REG_4TH_NODVS_BUCK_VOLT, 6202ece646cSMatti Vaittinen .vsel_mask = BD718XX_4TH_NODVS_BUCK_MASK, 6212ece646cSMatti Vaittinen .enable_reg = BD718XX_REG_4TH_NODVS_BUCK_CTRL, 6222ece646cSMatti Vaittinen .enable_mask = BD718XX_BUCK_EN, 6232ece646cSMatti Vaittinen .owner = THIS_MODULE, 6242ece646cSMatti Vaittinen }, 6252ece646cSMatti Vaittinen .init = { 6262ece646cSMatti Vaittinen .reg = BD718XX_REG_4TH_NODVS_BUCK_CTRL, 6272ece646cSMatti Vaittinen .mask = BD718XX_BUCK_SEL, 6282ece646cSMatti Vaittinen .val = BD718XX_BUCK_SEL, 6292ece646cSMatti Vaittinen }, 6302ece646cSMatti Vaittinen }, 6312ece646cSMatti Vaittinen { 6322ece646cSMatti Vaittinen .desc = { 6332ece646cSMatti Vaittinen .name = "ldo1", 6342ece646cSMatti Vaittinen .of_match = of_match_ptr("LDO1"), 6352ece646cSMatti Vaittinen .regulators_node = of_match_ptr("regulators"), 6362ece646cSMatti Vaittinen .id = BD718XX_LDO1, 6372ece646cSMatti Vaittinen .ops = &bd718xx_pickable_range_ldo_ops, 6382ece646cSMatti Vaittinen .type = REGULATOR_VOLTAGE, 6392ece646cSMatti Vaittinen .n_voltages = BD718XX_LDO1_VOLTAGE_NUM, 6402ece646cSMatti Vaittinen .linear_ranges = bd718xx_ldo1_volts, 6412ece646cSMatti Vaittinen .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo1_volts), 6422ece646cSMatti Vaittinen .vsel_reg = BD718XX_REG_LDO1_VOLT, 6432ece646cSMatti Vaittinen .vsel_mask = BD718XX_LDO1_MASK, 6442ece646cSMatti Vaittinen .vsel_range_reg = BD718XX_REG_LDO1_VOLT, 6452ece646cSMatti Vaittinen .vsel_range_mask = BD718XX_LDO1_RANGE_MASK, 6462ece646cSMatti Vaittinen .linear_range_selectors = bd718xx_ldo1_volt_range_sel, 6472ece646cSMatti Vaittinen .enable_reg = BD718XX_REG_LDO1_VOLT, 6482ece646cSMatti Vaittinen .enable_mask = BD718XX_LDO_EN, 6492ece646cSMatti Vaittinen .owner = THIS_MODULE, 6502ece646cSMatti Vaittinen }, 6512ece646cSMatti Vaittinen .init = { 6522ece646cSMatti Vaittinen .reg = BD718XX_REG_LDO1_VOLT, 6532ece646cSMatti Vaittinen .mask = BD718XX_LDO_SEL, 6542ece646cSMatti Vaittinen .val = BD718XX_LDO_SEL, 6552ece646cSMatti Vaittinen }, 6562ece646cSMatti Vaittinen }, 6572ece646cSMatti Vaittinen { 6582ece646cSMatti Vaittinen .desc = { 6592ece646cSMatti Vaittinen .name = "ldo2", 6602ece646cSMatti Vaittinen .of_match = of_match_ptr("LDO2"), 6612ece646cSMatti Vaittinen .regulators_node = of_match_ptr("regulators"), 6622ece646cSMatti Vaittinen .id = BD718XX_LDO2, 6632ece646cSMatti Vaittinen .ops = &bd718xx_ldo_regulator_nolinear_ops, 6642ece646cSMatti Vaittinen .type = REGULATOR_VOLTAGE, 6652ece646cSMatti Vaittinen .volt_table = &ldo_2_volts[0], 6662ece646cSMatti Vaittinen .vsel_reg = BD718XX_REG_LDO2_VOLT, 6672ece646cSMatti Vaittinen .vsel_mask = BD718XX_LDO2_MASK, 6682ece646cSMatti Vaittinen .n_voltages = ARRAY_SIZE(ldo_2_volts), 6692ece646cSMatti Vaittinen .enable_reg = BD718XX_REG_LDO2_VOLT, 6702ece646cSMatti Vaittinen .enable_mask = BD718XX_LDO_EN, 6712ece646cSMatti Vaittinen .owner = THIS_MODULE, 6722ece646cSMatti Vaittinen }, 6732ece646cSMatti Vaittinen .init = { 6742ece646cSMatti Vaittinen .reg = BD718XX_REG_LDO2_VOLT, 6752ece646cSMatti Vaittinen .mask = BD718XX_LDO_SEL, 6762ece646cSMatti Vaittinen .val = BD718XX_LDO_SEL, 6772ece646cSMatti Vaittinen }, 6782ece646cSMatti Vaittinen }, 6792ece646cSMatti Vaittinen { 6802ece646cSMatti Vaittinen .desc = { 6812ece646cSMatti Vaittinen .name = "ldo3", 6822ece646cSMatti Vaittinen .of_match = of_match_ptr("LDO3"), 6832ece646cSMatti Vaittinen .regulators_node = of_match_ptr("regulators"), 6842ece646cSMatti Vaittinen .id = BD718XX_LDO3, 6852ece646cSMatti Vaittinen .ops = &bd718xx_ldo_regulator_ops, 6862ece646cSMatti Vaittinen .type = REGULATOR_VOLTAGE, 6872ece646cSMatti Vaittinen .n_voltages = BD718XX_LDO3_VOLTAGE_NUM, 6882ece646cSMatti Vaittinen .linear_ranges = bd718xx_ldo3_volts, 6892ece646cSMatti Vaittinen .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo3_volts), 6902ece646cSMatti Vaittinen .vsel_reg = BD718XX_REG_LDO3_VOLT, 6912ece646cSMatti Vaittinen .vsel_mask = BD718XX_LDO3_MASK, 6922ece646cSMatti Vaittinen .enable_reg = BD718XX_REG_LDO3_VOLT, 6932ece646cSMatti Vaittinen .enable_mask = BD718XX_LDO_EN, 6942ece646cSMatti Vaittinen .owner = THIS_MODULE, 6952ece646cSMatti Vaittinen }, 6962ece646cSMatti Vaittinen .init = { 6972ece646cSMatti Vaittinen .reg = BD718XX_REG_LDO3_VOLT, 6982ece646cSMatti Vaittinen .mask = BD718XX_LDO_SEL, 6992ece646cSMatti Vaittinen .val = BD718XX_LDO_SEL, 7002ece646cSMatti Vaittinen }, 7012ece646cSMatti Vaittinen }, 7022ece646cSMatti Vaittinen { 7032ece646cSMatti Vaittinen .desc = { 7042ece646cSMatti Vaittinen .name = "ldo4", 7052ece646cSMatti Vaittinen .of_match = of_match_ptr("LDO4"), 7062ece646cSMatti Vaittinen .regulators_node = of_match_ptr("regulators"), 7072ece646cSMatti Vaittinen .id = BD718XX_LDO4, 7082ece646cSMatti Vaittinen .ops = &bd718xx_ldo_regulator_ops, 7092ece646cSMatti Vaittinen .type = REGULATOR_VOLTAGE, 7102ece646cSMatti Vaittinen .n_voltages = BD718XX_LDO4_VOLTAGE_NUM, 7112ece646cSMatti Vaittinen .linear_ranges = bd718xx_ldo4_volts, 7122ece646cSMatti Vaittinen .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo4_volts), 7132ece646cSMatti Vaittinen .vsel_reg = BD718XX_REG_LDO4_VOLT, 7142ece646cSMatti Vaittinen .vsel_mask = BD718XX_LDO4_MASK, 7152ece646cSMatti Vaittinen .enable_reg = BD718XX_REG_LDO4_VOLT, 7162ece646cSMatti Vaittinen .enable_mask = BD718XX_LDO_EN, 7172ece646cSMatti Vaittinen .owner = THIS_MODULE, 7182ece646cSMatti Vaittinen }, 7192ece646cSMatti Vaittinen .init = { 7202ece646cSMatti Vaittinen .reg = BD718XX_REG_LDO4_VOLT, 7212ece646cSMatti Vaittinen .mask = BD718XX_LDO_SEL, 7222ece646cSMatti Vaittinen .val = BD718XX_LDO_SEL, 7232ece646cSMatti Vaittinen }, 7242ece646cSMatti Vaittinen }, 7252ece646cSMatti Vaittinen { 7262ece646cSMatti Vaittinen .desc = { 7272ece646cSMatti Vaittinen .name = "ldo5", 7282ece646cSMatti Vaittinen .of_match = of_match_ptr("LDO5"), 7292ece646cSMatti Vaittinen .regulators_node = of_match_ptr("regulators"), 7302ece646cSMatti Vaittinen .id = BD718XX_LDO5, 7312ece646cSMatti Vaittinen .ops = &bd718xx_pickable_range_ldo_ops, 7322ece646cSMatti Vaittinen .type = REGULATOR_VOLTAGE, 7332ece646cSMatti Vaittinen .n_voltages = BD71847_LDO5_VOLTAGE_NUM, 7342ece646cSMatti Vaittinen .linear_ranges = bd71847_ldo5_volts, 7352ece646cSMatti Vaittinen .n_linear_ranges = ARRAY_SIZE(bd71847_ldo5_volts), 7362ece646cSMatti Vaittinen .vsel_reg = BD718XX_REG_LDO5_VOLT, 7372ece646cSMatti Vaittinen .vsel_mask = BD71847_LDO5_MASK, 7382ece646cSMatti Vaittinen .vsel_range_reg = BD718XX_REG_LDO5_VOLT, 7392ece646cSMatti Vaittinen .vsel_range_mask = BD71847_LDO5_RANGE_MASK, 7402ece646cSMatti Vaittinen .linear_range_selectors = bd71847_ldo5_volt_range_sel, 7412ece646cSMatti Vaittinen .enable_reg = BD718XX_REG_LDO5_VOLT, 7422ece646cSMatti Vaittinen .enable_mask = BD718XX_LDO_EN, 7432ece646cSMatti Vaittinen .owner = THIS_MODULE, 7442ece646cSMatti Vaittinen }, 7452ece646cSMatti Vaittinen .init = { 7462ece646cSMatti Vaittinen .reg = BD718XX_REG_LDO5_VOLT, 7472ece646cSMatti Vaittinen .mask = BD718XX_LDO_SEL, 7482ece646cSMatti Vaittinen .val = BD718XX_LDO_SEL, 7492ece646cSMatti Vaittinen }, 7502ece646cSMatti Vaittinen }, 7512ece646cSMatti Vaittinen { 7522ece646cSMatti Vaittinen .desc = { 7532ece646cSMatti Vaittinen .name = "ldo6", 7542ece646cSMatti Vaittinen .of_match = of_match_ptr("LDO6"), 7552ece646cSMatti Vaittinen .regulators_node = of_match_ptr("regulators"), 7562ece646cSMatti Vaittinen .id = BD718XX_LDO6, 7572ece646cSMatti Vaittinen .ops = &bd718xx_ldo_regulator_ops, 7582ece646cSMatti Vaittinen .type = REGULATOR_VOLTAGE, 7592ece646cSMatti Vaittinen .n_voltages = BD718XX_LDO6_VOLTAGE_NUM, 7602ece646cSMatti Vaittinen .linear_ranges = bd718xx_ldo6_volts, 7612ece646cSMatti Vaittinen .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo6_volts), 7622ece646cSMatti Vaittinen /* LDO6 is supplied by buck5 */ 7632ece646cSMatti Vaittinen .supply_name = "buck5", 7642ece646cSMatti Vaittinen .vsel_reg = BD718XX_REG_LDO6_VOLT, 7652ece646cSMatti Vaittinen .vsel_mask = BD718XX_LDO6_MASK, 7662ece646cSMatti Vaittinen .enable_reg = BD718XX_REG_LDO6_VOLT, 7672ece646cSMatti Vaittinen .enable_mask = BD718XX_LDO_EN, 7682ece646cSMatti Vaittinen .owner = THIS_MODULE, 7692ece646cSMatti Vaittinen }, 7702ece646cSMatti Vaittinen .init = { 7712ece646cSMatti Vaittinen .reg = BD718XX_REG_LDO6_VOLT, 7722ece646cSMatti Vaittinen .mask = BD718XX_LDO_SEL, 7732ece646cSMatti Vaittinen .val = BD718XX_LDO_SEL, 7742ece646cSMatti Vaittinen }, 7752ece646cSMatti Vaittinen }, 7762ece646cSMatti Vaittinen }; 7772ece646cSMatti Vaittinen 7782ece646cSMatti Vaittinen static const struct bd718xx_regulator_data bd71837_regulators[] = { 7792ece646cSMatti Vaittinen { 7802ece646cSMatti Vaittinen .desc = { 7812ece646cSMatti Vaittinen .name = "buck1", 7822ece646cSMatti Vaittinen .of_match = of_match_ptr("BUCK1"), 7832ece646cSMatti Vaittinen .regulators_node = of_match_ptr("regulators"), 7842ece646cSMatti Vaittinen .id = BD718XX_BUCK1, 7852ece646cSMatti Vaittinen .ops = &bd718xx_dvs_buck_regulator_ops, 7862ece646cSMatti Vaittinen .type = REGULATOR_VOLTAGE, 7872ece646cSMatti Vaittinen .n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM, 7882ece646cSMatti Vaittinen .linear_ranges = bd718xx_dvs_buck_volts, 7892ece646cSMatti Vaittinen .n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts), 7902ece646cSMatti Vaittinen .vsel_reg = BD718XX_REG_BUCK1_VOLT_RUN, 7912ece646cSMatti Vaittinen .vsel_mask = DVS_BUCK_RUN_MASK, 7922ece646cSMatti Vaittinen .enable_reg = BD718XX_REG_BUCK1_CTRL, 7932ece646cSMatti Vaittinen .enable_mask = BD718XX_BUCK_EN, 7942ece646cSMatti Vaittinen .owner = THIS_MODULE, 795049369d4SMatti Vaittinen .of_parse_cb = buck1_set_hw_dvs_levels, 7962ece646cSMatti Vaittinen }, 7972ece646cSMatti Vaittinen .init = { 7982ece646cSMatti Vaittinen .reg = BD718XX_REG_BUCK1_CTRL, 7992ece646cSMatti Vaittinen .mask = BD718XX_BUCK_SEL, 8002ece646cSMatti Vaittinen .val = BD718XX_BUCK_SEL, 8012ece646cSMatti Vaittinen }, 8022ece646cSMatti Vaittinen }, 8032ece646cSMatti Vaittinen { 8042ece646cSMatti Vaittinen .desc = { 8052ece646cSMatti Vaittinen .name = "buck2", 8062ece646cSMatti Vaittinen .of_match = of_match_ptr("BUCK2"), 8072ece646cSMatti Vaittinen .regulators_node = of_match_ptr("regulators"), 8082ece646cSMatti Vaittinen .id = BD718XX_BUCK2, 8092ece646cSMatti Vaittinen .ops = &bd718xx_dvs_buck_regulator_ops, 8102ece646cSMatti Vaittinen .type = REGULATOR_VOLTAGE, 8112ece646cSMatti Vaittinen .n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM, 8122ece646cSMatti Vaittinen .linear_ranges = bd718xx_dvs_buck_volts, 8132ece646cSMatti Vaittinen .n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts), 8142ece646cSMatti Vaittinen .vsel_reg = BD718XX_REG_BUCK2_VOLT_RUN, 8152ece646cSMatti Vaittinen .vsel_mask = DVS_BUCK_RUN_MASK, 8162ece646cSMatti Vaittinen .enable_reg = BD718XX_REG_BUCK2_CTRL, 8172ece646cSMatti Vaittinen .enable_mask = BD718XX_BUCK_EN, 8182ece646cSMatti Vaittinen .owner = THIS_MODULE, 819049369d4SMatti Vaittinen .of_parse_cb = buck2_set_hw_dvs_levels, 8202ece646cSMatti Vaittinen }, 8212ece646cSMatti Vaittinen .init = { 8222ece646cSMatti Vaittinen .reg = BD718XX_REG_BUCK2_CTRL, 8232ece646cSMatti Vaittinen .mask = BD718XX_BUCK_SEL, 8242ece646cSMatti Vaittinen .val = BD718XX_BUCK_SEL, 8252ece646cSMatti Vaittinen }, 8262ece646cSMatti Vaittinen }, 8272ece646cSMatti Vaittinen { 8282ece646cSMatti Vaittinen .desc = { 8292ece646cSMatti Vaittinen .name = "buck3", 8302ece646cSMatti Vaittinen .of_match = of_match_ptr("BUCK3"), 8312ece646cSMatti Vaittinen .regulators_node = of_match_ptr("regulators"), 8322ece646cSMatti Vaittinen .id = BD718XX_BUCK3, 8332ece646cSMatti Vaittinen .ops = &bd718xx_dvs_buck_regulator_ops, 8342ece646cSMatti Vaittinen .type = REGULATOR_VOLTAGE, 8352ece646cSMatti Vaittinen .n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM, 8362ece646cSMatti Vaittinen .linear_ranges = bd718xx_dvs_buck_volts, 8372ece646cSMatti Vaittinen .n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts), 8382ece646cSMatti Vaittinen .vsel_reg = BD71837_REG_BUCK3_VOLT_RUN, 8392ece646cSMatti Vaittinen .vsel_mask = DVS_BUCK_RUN_MASK, 8402ece646cSMatti Vaittinen .enable_reg = BD71837_REG_BUCK3_CTRL, 8412ece646cSMatti Vaittinen .enable_mask = BD718XX_BUCK_EN, 8422ece646cSMatti Vaittinen .owner = THIS_MODULE, 843049369d4SMatti Vaittinen .of_parse_cb = buck3_set_hw_dvs_levels, 8442ece646cSMatti Vaittinen }, 8452ece646cSMatti Vaittinen .init = { 8462ece646cSMatti Vaittinen .reg = BD71837_REG_BUCK3_CTRL, 8472ece646cSMatti Vaittinen .mask = BD718XX_BUCK_SEL, 8482ece646cSMatti Vaittinen .val = BD718XX_BUCK_SEL, 8492ece646cSMatti Vaittinen }, 8502ece646cSMatti Vaittinen }, 8512ece646cSMatti Vaittinen { 8522ece646cSMatti Vaittinen .desc = { 8532ece646cSMatti Vaittinen .name = "buck4", 8542ece646cSMatti Vaittinen .of_match = of_match_ptr("BUCK4"), 8552ece646cSMatti Vaittinen .regulators_node = of_match_ptr("regulators"), 8562ece646cSMatti Vaittinen .id = BD718XX_BUCK4, 8572ece646cSMatti Vaittinen .ops = &bd718xx_dvs_buck_regulator_ops, 8582ece646cSMatti Vaittinen .type = REGULATOR_VOLTAGE, 8592ece646cSMatti Vaittinen .n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM, 8602ece646cSMatti Vaittinen .linear_ranges = bd718xx_dvs_buck_volts, 8612ece646cSMatti Vaittinen .n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts), 8622ece646cSMatti Vaittinen .vsel_reg = BD71837_REG_BUCK4_VOLT_RUN, 8632ece646cSMatti Vaittinen .vsel_mask = DVS_BUCK_RUN_MASK, 8642ece646cSMatti Vaittinen .enable_reg = BD71837_REG_BUCK4_CTRL, 8652ece646cSMatti Vaittinen .enable_mask = BD718XX_BUCK_EN, 8662ece646cSMatti Vaittinen .owner = THIS_MODULE, 867049369d4SMatti Vaittinen .of_parse_cb = buck4_set_hw_dvs_levels, 8682ece646cSMatti Vaittinen }, 8692ece646cSMatti Vaittinen .init = { 8702ece646cSMatti Vaittinen .reg = BD71837_REG_BUCK4_CTRL, 8712ece646cSMatti Vaittinen .mask = BD718XX_BUCK_SEL, 8722ece646cSMatti Vaittinen .val = BD718XX_BUCK_SEL, 8732ece646cSMatti Vaittinen }, 8742ece646cSMatti Vaittinen }, 8752ece646cSMatti Vaittinen { 8762ece646cSMatti Vaittinen .desc = { 8772ece646cSMatti Vaittinen .name = "buck5", 8782ece646cSMatti Vaittinen .of_match = of_match_ptr("BUCK5"), 8792ece646cSMatti Vaittinen .regulators_node = of_match_ptr("regulators"), 8802ece646cSMatti Vaittinen .id = BD718XX_BUCK5, 8812ece646cSMatti Vaittinen .ops = &bd718xx_pickable_range_buck_ops, 8822ece646cSMatti Vaittinen .type = REGULATOR_VOLTAGE, 8832ece646cSMatti Vaittinen .n_voltages = BD71837_BUCK5_VOLTAGE_NUM, 8842ece646cSMatti Vaittinen .linear_ranges = bd71837_buck5_volts, 8852ece646cSMatti Vaittinen .n_linear_ranges = 8862ece646cSMatti Vaittinen ARRAY_SIZE(bd71837_buck5_volts), 8872ece646cSMatti Vaittinen .vsel_reg = BD718XX_REG_1ST_NODVS_BUCK_VOLT, 8882ece646cSMatti Vaittinen .vsel_mask = BD71837_BUCK5_MASK, 8892ece646cSMatti Vaittinen .vsel_range_reg = BD718XX_REG_1ST_NODVS_BUCK_VOLT, 8902ece646cSMatti Vaittinen .vsel_range_mask = BD71837_BUCK5_RANGE_MASK, 8912ece646cSMatti Vaittinen .linear_range_selectors = bd71837_buck5_volt_range_sel, 8922ece646cSMatti Vaittinen .enable_reg = BD718XX_REG_1ST_NODVS_BUCK_CTRL, 8932ece646cSMatti Vaittinen .enable_mask = BD718XX_BUCK_EN, 8942ece646cSMatti Vaittinen .owner = THIS_MODULE, 8952ece646cSMatti Vaittinen }, 8962ece646cSMatti Vaittinen .init = { 8972ece646cSMatti Vaittinen .reg = BD718XX_REG_1ST_NODVS_BUCK_CTRL, 8982ece646cSMatti Vaittinen .mask = BD718XX_BUCK_SEL, 8992ece646cSMatti Vaittinen .val = BD718XX_BUCK_SEL, 9002ece646cSMatti Vaittinen }, 9012ece646cSMatti Vaittinen }, 9022ece646cSMatti Vaittinen { 9032ece646cSMatti Vaittinen .desc = { 9042ece646cSMatti Vaittinen .name = "buck6", 9052ece646cSMatti Vaittinen .of_match = of_match_ptr("BUCK6"), 9062ece646cSMatti Vaittinen .regulators_node = of_match_ptr("regulators"), 9072ece646cSMatti Vaittinen .id = BD718XX_BUCK6, 9082ece646cSMatti Vaittinen .ops = &bd718xx_buck_regulator_ops, 9092ece646cSMatti Vaittinen .type = REGULATOR_VOLTAGE, 9102ece646cSMatti Vaittinen .n_voltages = BD71837_BUCK6_VOLTAGE_NUM, 9112ece646cSMatti Vaittinen .linear_ranges = bd71837_buck6_volts, 9122ece646cSMatti Vaittinen .n_linear_ranges = 9132ece646cSMatti Vaittinen ARRAY_SIZE(bd71837_buck6_volts), 9142ece646cSMatti Vaittinen .vsel_reg = BD718XX_REG_2ND_NODVS_BUCK_VOLT, 9152ece646cSMatti Vaittinen .vsel_mask = BD71837_BUCK6_MASK, 9162ece646cSMatti Vaittinen .enable_reg = BD718XX_REG_2ND_NODVS_BUCK_CTRL, 9172ece646cSMatti Vaittinen .enable_mask = BD718XX_BUCK_EN, 9182ece646cSMatti Vaittinen .owner = THIS_MODULE, 9192ece646cSMatti Vaittinen }, 9202ece646cSMatti Vaittinen .init = { 9212ece646cSMatti Vaittinen .reg = BD718XX_REG_2ND_NODVS_BUCK_CTRL, 9222ece646cSMatti Vaittinen .mask = BD718XX_BUCK_SEL, 9232ece646cSMatti Vaittinen .val = BD718XX_BUCK_SEL, 9242ece646cSMatti Vaittinen }, 9252ece646cSMatti Vaittinen }, 9262ece646cSMatti Vaittinen { 9272ece646cSMatti Vaittinen .desc = { 9282ece646cSMatti Vaittinen .name = "buck7", 9292ece646cSMatti Vaittinen .of_match = of_match_ptr("BUCK7"), 9302ece646cSMatti Vaittinen .regulators_node = of_match_ptr("regulators"), 9312ece646cSMatti Vaittinen .id = BD718XX_BUCK7, 9322ece646cSMatti Vaittinen .ops = &bd718xx_buck_regulator_nolinear_ops, 9332ece646cSMatti Vaittinen .type = REGULATOR_VOLTAGE, 9342ece646cSMatti Vaittinen .volt_table = &bd718xx_3rd_nodvs_buck_volts[0], 9352ece646cSMatti Vaittinen .n_voltages = ARRAY_SIZE(bd718xx_3rd_nodvs_buck_volts), 9362ece646cSMatti Vaittinen .vsel_reg = BD718XX_REG_3RD_NODVS_BUCK_VOLT, 9372ece646cSMatti Vaittinen .vsel_mask = BD718XX_3RD_NODVS_BUCK_MASK, 9382ece646cSMatti Vaittinen .enable_reg = BD718XX_REG_3RD_NODVS_BUCK_CTRL, 9392ece646cSMatti Vaittinen .enable_mask = BD718XX_BUCK_EN, 9402ece646cSMatti Vaittinen .owner = THIS_MODULE, 9412ece646cSMatti Vaittinen }, 9422ece646cSMatti Vaittinen .init = { 9432ece646cSMatti Vaittinen .reg = BD718XX_REG_3RD_NODVS_BUCK_CTRL, 9442ece646cSMatti Vaittinen .mask = BD718XX_BUCK_SEL, 9452ece646cSMatti Vaittinen .val = BD718XX_BUCK_SEL, 9462ece646cSMatti Vaittinen }, 9472ece646cSMatti Vaittinen }, 9482ece646cSMatti Vaittinen { 9492ece646cSMatti Vaittinen .desc = { 9502ece646cSMatti Vaittinen .name = "buck8", 9512ece646cSMatti Vaittinen .of_match = of_match_ptr("BUCK8"), 9522ece646cSMatti Vaittinen .regulators_node = of_match_ptr("regulators"), 9532ece646cSMatti Vaittinen .id = BD718XX_BUCK8, 9542ece646cSMatti Vaittinen .ops = &bd718xx_buck_regulator_ops, 9552ece646cSMatti Vaittinen .type = REGULATOR_VOLTAGE, 9562ece646cSMatti Vaittinen .n_voltages = BD718XX_4TH_NODVS_BUCK_VOLTAGE_NUM, 9572ece646cSMatti Vaittinen .linear_ranges = bd718xx_4th_nodvs_buck_volts, 9582ece646cSMatti Vaittinen .n_linear_ranges = 9592ece646cSMatti Vaittinen ARRAY_SIZE(bd718xx_4th_nodvs_buck_volts), 9602ece646cSMatti Vaittinen .vsel_reg = BD718XX_REG_4TH_NODVS_BUCK_VOLT, 9612ece646cSMatti Vaittinen .vsel_mask = BD718XX_4TH_NODVS_BUCK_MASK, 9622ece646cSMatti Vaittinen .enable_reg = BD718XX_REG_4TH_NODVS_BUCK_CTRL, 9632ece646cSMatti Vaittinen .enable_mask = BD718XX_BUCK_EN, 9642ece646cSMatti Vaittinen .owner = THIS_MODULE, 9652ece646cSMatti Vaittinen }, 9662ece646cSMatti Vaittinen .init = { 9672ece646cSMatti Vaittinen .reg = BD718XX_REG_4TH_NODVS_BUCK_CTRL, 9682ece646cSMatti Vaittinen .mask = BD718XX_BUCK_SEL, 9692ece646cSMatti Vaittinen .val = BD718XX_BUCK_SEL, 9702ece646cSMatti Vaittinen }, 9712ece646cSMatti Vaittinen }, 9722ece646cSMatti Vaittinen { 9732ece646cSMatti Vaittinen .desc = { 9742ece646cSMatti Vaittinen .name = "ldo1", 9752ece646cSMatti Vaittinen .of_match = of_match_ptr("LDO1"), 9762ece646cSMatti Vaittinen .regulators_node = of_match_ptr("regulators"), 9772ece646cSMatti Vaittinen .id = BD718XX_LDO1, 9782ece646cSMatti Vaittinen .ops = &bd718xx_pickable_range_ldo_ops, 9792ece646cSMatti Vaittinen .type = REGULATOR_VOLTAGE, 9802ece646cSMatti Vaittinen .n_voltages = BD718XX_LDO1_VOLTAGE_NUM, 9812ece646cSMatti Vaittinen .linear_ranges = bd718xx_ldo1_volts, 9822ece646cSMatti Vaittinen .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo1_volts), 9832ece646cSMatti Vaittinen .vsel_reg = BD718XX_REG_LDO1_VOLT, 9842ece646cSMatti Vaittinen .vsel_mask = BD718XX_LDO1_MASK, 9852ece646cSMatti Vaittinen .vsel_range_reg = BD718XX_REG_LDO1_VOLT, 9862ece646cSMatti Vaittinen .vsel_range_mask = BD718XX_LDO1_RANGE_MASK, 9872ece646cSMatti Vaittinen .linear_range_selectors = bd718xx_ldo1_volt_range_sel, 9882ece646cSMatti Vaittinen .enable_reg = BD718XX_REG_LDO1_VOLT, 9892ece646cSMatti Vaittinen .enable_mask = BD718XX_LDO_EN, 9902ece646cSMatti Vaittinen .owner = THIS_MODULE, 9912ece646cSMatti Vaittinen }, 9922ece646cSMatti Vaittinen .init = { 9932ece646cSMatti Vaittinen .reg = BD718XX_REG_LDO1_VOLT, 9942ece646cSMatti Vaittinen .mask = BD718XX_LDO_SEL, 9952ece646cSMatti Vaittinen .val = BD718XX_LDO_SEL, 9962ece646cSMatti Vaittinen }, 9972ece646cSMatti Vaittinen }, 9982ece646cSMatti Vaittinen { 9992ece646cSMatti Vaittinen .desc = { 10002ece646cSMatti Vaittinen .name = "ldo2", 10012ece646cSMatti Vaittinen .of_match = of_match_ptr("LDO2"), 10022ece646cSMatti Vaittinen .regulators_node = of_match_ptr("regulators"), 10032ece646cSMatti Vaittinen .id = BD718XX_LDO2, 10042ece646cSMatti Vaittinen .ops = &bd718xx_ldo_regulator_nolinear_ops, 10052ece646cSMatti Vaittinen .type = REGULATOR_VOLTAGE, 10062ece646cSMatti Vaittinen .volt_table = &ldo_2_volts[0], 10072ece646cSMatti Vaittinen .vsel_reg = BD718XX_REG_LDO2_VOLT, 10082ece646cSMatti Vaittinen .vsel_mask = BD718XX_LDO2_MASK, 10092ece646cSMatti Vaittinen .n_voltages = ARRAY_SIZE(ldo_2_volts), 10102ece646cSMatti Vaittinen .enable_reg = BD718XX_REG_LDO2_VOLT, 10112ece646cSMatti Vaittinen .enable_mask = BD718XX_LDO_EN, 10122ece646cSMatti Vaittinen .owner = THIS_MODULE, 10132ece646cSMatti Vaittinen }, 10142ece646cSMatti Vaittinen .init = { 10152ece646cSMatti Vaittinen .reg = BD718XX_REG_LDO2_VOLT, 10162ece646cSMatti Vaittinen .mask = BD718XX_LDO_SEL, 10172ece646cSMatti Vaittinen .val = BD718XX_LDO_SEL, 10182ece646cSMatti Vaittinen }, 10192ece646cSMatti Vaittinen }, 10202ece646cSMatti Vaittinen { 10212ece646cSMatti Vaittinen .desc = { 10222ece646cSMatti Vaittinen .name = "ldo3", 10232ece646cSMatti Vaittinen .of_match = of_match_ptr("LDO3"), 10242ece646cSMatti Vaittinen .regulators_node = of_match_ptr("regulators"), 10252ece646cSMatti Vaittinen .id = BD718XX_LDO3, 10262ece646cSMatti Vaittinen .ops = &bd718xx_ldo_regulator_ops, 10272ece646cSMatti Vaittinen .type = REGULATOR_VOLTAGE, 10282ece646cSMatti Vaittinen .n_voltages = BD718XX_LDO3_VOLTAGE_NUM, 10292ece646cSMatti Vaittinen .linear_ranges = bd718xx_ldo3_volts, 10302ece646cSMatti Vaittinen .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo3_volts), 10312ece646cSMatti Vaittinen .vsel_reg = BD718XX_REG_LDO3_VOLT, 10322ece646cSMatti Vaittinen .vsel_mask = BD718XX_LDO3_MASK, 10332ece646cSMatti Vaittinen .enable_reg = BD718XX_REG_LDO3_VOLT, 10342ece646cSMatti Vaittinen .enable_mask = BD718XX_LDO_EN, 10352ece646cSMatti Vaittinen .owner = THIS_MODULE, 10362ece646cSMatti Vaittinen }, 10372ece646cSMatti Vaittinen .init = { 10382ece646cSMatti Vaittinen .reg = BD718XX_REG_LDO3_VOLT, 10392ece646cSMatti Vaittinen .mask = BD718XX_LDO_SEL, 10402ece646cSMatti Vaittinen .val = BD718XX_LDO_SEL, 10412ece646cSMatti Vaittinen }, 10422ece646cSMatti Vaittinen }, 10432ece646cSMatti Vaittinen { 10442ece646cSMatti Vaittinen .desc = { 10452ece646cSMatti Vaittinen .name = "ldo4", 10462ece646cSMatti Vaittinen .of_match = of_match_ptr("LDO4"), 10472ece646cSMatti Vaittinen .regulators_node = of_match_ptr("regulators"), 10482ece646cSMatti Vaittinen .id = BD718XX_LDO4, 10492ece646cSMatti Vaittinen .ops = &bd718xx_ldo_regulator_ops, 10502ece646cSMatti Vaittinen .type = REGULATOR_VOLTAGE, 10512ece646cSMatti Vaittinen .n_voltages = BD718XX_LDO4_VOLTAGE_NUM, 10522ece646cSMatti Vaittinen .linear_ranges = bd718xx_ldo4_volts, 10532ece646cSMatti Vaittinen .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo4_volts), 10542ece646cSMatti Vaittinen .vsel_reg = BD718XX_REG_LDO4_VOLT, 10552ece646cSMatti Vaittinen .vsel_mask = BD718XX_LDO4_MASK, 10562ece646cSMatti Vaittinen .enable_reg = BD718XX_REG_LDO4_VOLT, 10572ece646cSMatti Vaittinen .enable_mask = BD718XX_LDO_EN, 10582ece646cSMatti Vaittinen .owner = THIS_MODULE, 10592ece646cSMatti Vaittinen }, 10602ece646cSMatti Vaittinen .init = { 10612ece646cSMatti Vaittinen .reg = BD718XX_REG_LDO4_VOLT, 10622ece646cSMatti Vaittinen .mask = BD718XX_LDO_SEL, 10632ece646cSMatti Vaittinen .val = BD718XX_LDO_SEL, 10642ece646cSMatti Vaittinen }, 10652ece646cSMatti Vaittinen }, 10662ece646cSMatti Vaittinen { 10672ece646cSMatti Vaittinen .desc = { 10682ece646cSMatti Vaittinen .name = "ldo5", 10692ece646cSMatti Vaittinen .of_match = of_match_ptr("LDO5"), 10702ece646cSMatti Vaittinen .regulators_node = of_match_ptr("regulators"), 10712ece646cSMatti Vaittinen .id = BD718XX_LDO5, 10722ece646cSMatti Vaittinen .ops = &bd718xx_ldo_regulator_ops, 10732ece646cSMatti Vaittinen .type = REGULATOR_VOLTAGE, 10742ece646cSMatti Vaittinen .n_voltages = BD71837_LDO5_VOLTAGE_NUM, 10752ece646cSMatti Vaittinen .linear_ranges = bd71837_ldo5_volts, 10762ece646cSMatti Vaittinen .n_linear_ranges = ARRAY_SIZE(bd71837_ldo5_volts), 10772ece646cSMatti Vaittinen /* LDO5 is supplied by buck6 */ 10782ece646cSMatti Vaittinen .supply_name = "buck6", 10792ece646cSMatti Vaittinen .vsel_reg = BD718XX_REG_LDO5_VOLT, 10802ece646cSMatti Vaittinen .vsel_mask = BD71837_LDO5_MASK, 10812ece646cSMatti Vaittinen .enable_reg = BD718XX_REG_LDO5_VOLT, 10822ece646cSMatti Vaittinen .enable_mask = BD718XX_LDO_EN, 10832ece646cSMatti Vaittinen .owner = THIS_MODULE, 10842ece646cSMatti Vaittinen }, 10852ece646cSMatti Vaittinen .init = { 10862ece646cSMatti Vaittinen .reg = BD718XX_REG_LDO5_VOLT, 10872ece646cSMatti Vaittinen .mask = BD718XX_LDO_SEL, 10882ece646cSMatti Vaittinen .val = BD718XX_LDO_SEL, 10892ece646cSMatti Vaittinen }, 10902ece646cSMatti Vaittinen .additional_inits = bd71837_ldo5_inits, 10912ece646cSMatti Vaittinen .additional_init_amnt = ARRAY_SIZE(bd71837_ldo5_inits), 10922ece646cSMatti Vaittinen }, 10932ece646cSMatti Vaittinen { 10942ece646cSMatti Vaittinen .desc = { 10952ece646cSMatti Vaittinen .name = "ldo6", 10962ece646cSMatti Vaittinen .of_match = of_match_ptr("LDO6"), 10972ece646cSMatti Vaittinen .regulators_node = of_match_ptr("regulators"), 10982ece646cSMatti Vaittinen .id = BD718XX_LDO6, 10992ece646cSMatti Vaittinen .ops = &bd718xx_ldo_regulator_ops, 11002ece646cSMatti Vaittinen .type = REGULATOR_VOLTAGE, 11012ece646cSMatti Vaittinen .n_voltages = BD718XX_LDO6_VOLTAGE_NUM, 11022ece646cSMatti Vaittinen .linear_ranges = bd718xx_ldo6_volts, 11032ece646cSMatti Vaittinen .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo6_volts), 11042ece646cSMatti Vaittinen /* LDO6 is supplied by buck7 */ 11052ece646cSMatti Vaittinen .supply_name = "buck7", 11062ece646cSMatti Vaittinen .vsel_reg = BD718XX_REG_LDO6_VOLT, 11072ece646cSMatti Vaittinen .vsel_mask = BD718XX_LDO6_MASK, 11082ece646cSMatti Vaittinen .enable_reg = BD718XX_REG_LDO6_VOLT, 11092ece646cSMatti Vaittinen .enable_mask = BD718XX_LDO_EN, 11102ece646cSMatti Vaittinen .owner = THIS_MODULE, 11112ece646cSMatti Vaittinen }, 11122ece646cSMatti Vaittinen .init = { 11132ece646cSMatti Vaittinen .reg = BD718XX_REG_LDO6_VOLT, 11142ece646cSMatti Vaittinen .mask = BD718XX_LDO_SEL, 11152ece646cSMatti Vaittinen .val = BD718XX_LDO_SEL, 11162ece646cSMatti Vaittinen }, 11172ece646cSMatti Vaittinen .additional_inits = bd71837_ldo6_inits, 11182ece646cSMatti Vaittinen .additional_init_amnt = ARRAY_SIZE(bd71837_ldo6_inits), 11192ece646cSMatti Vaittinen }, 11202ece646cSMatti Vaittinen { 11212ece646cSMatti Vaittinen .desc = { 11222ece646cSMatti Vaittinen .name = "ldo7", 11232ece646cSMatti Vaittinen .of_match = of_match_ptr("LDO7"), 11242ece646cSMatti Vaittinen .regulators_node = of_match_ptr("regulators"), 11252ece646cSMatti Vaittinen .id = BD718XX_LDO7, 11262ece646cSMatti Vaittinen .ops = &bd718xx_ldo_regulator_ops, 11272ece646cSMatti Vaittinen .type = REGULATOR_VOLTAGE, 11282ece646cSMatti Vaittinen .n_voltages = BD71837_LDO7_VOLTAGE_NUM, 11292ece646cSMatti Vaittinen .linear_ranges = bd71837_ldo7_volts, 11302ece646cSMatti Vaittinen .n_linear_ranges = ARRAY_SIZE(bd71837_ldo7_volts), 11312ece646cSMatti Vaittinen .vsel_reg = BD71837_REG_LDO7_VOLT, 11322ece646cSMatti Vaittinen .vsel_mask = BD71837_LDO7_MASK, 11332ece646cSMatti Vaittinen .enable_reg = BD71837_REG_LDO7_VOLT, 11342ece646cSMatti Vaittinen .enable_mask = BD718XX_LDO_EN, 11352ece646cSMatti Vaittinen .owner = THIS_MODULE, 11362ece646cSMatti Vaittinen }, 11372ece646cSMatti Vaittinen .init = { 11382ece646cSMatti Vaittinen .reg = BD71837_REG_LDO7_VOLT, 11392ece646cSMatti Vaittinen .mask = BD718XX_LDO_SEL, 11402ece646cSMatti Vaittinen .val = BD718XX_LDO_SEL, 11412ece646cSMatti Vaittinen }, 11422ece646cSMatti Vaittinen }, 11432ece646cSMatti Vaittinen }; 11442ece646cSMatti Vaittinen 11452ece646cSMatti Vaittinen static int bd718xx_probe(struct platform_device *pdev) 11462ece646cSMatti Vaittinen { 1147bcb047ebSAxel Lin struct bd718xx *mfd; 11482ece646cSMatti Vaittinen struct regulator_config config = { 0 }; 11492ece646cSMatti Vaittinen int i, j, err; 1150049369d4SMatti Vaittinen bool use_snvs; 1151b389ceaeSAxel Lin const struct bd718xx_regulator_data *reg_data; 1152b389ceaeSAxel Lin unsigned int num_reg_data; 11532ece646cSMatti Vaittinen 1154bcb047ebSAxel Lin mfd = dev_get_drvdata(pdev->dev.parent); 1155bcb047ebSAxel Lin if (!mfd) { 11562ece646cSMatti Vaittinen dev_err(&pdev->dev, "No MFD driver data\n"); 11572ece646cSMatti Vaittinen err = -EINVAL; 11582ece646cSMatti Vaittinen goto err; 11592ece646cSMatti Vaittinen } 1160bcb047ebSAxel Lin 1161b389ceaeSAxel Lin switch (mfd->chip.chip_type) { 1162b389ceaeSAxel Lin case ROHM_CHIP_TYPE_BD71837: 1163b389ceaeSAxel Lin reg_data = bd71837_regulators; 1164b389ceaeSAxel Lin num_reg_data = ARRAY_SIZE(bd71837_regulators); 1165b389ceaeSAxel Lin break; 1166b389ceaeSAxel Lin case ROHM_CHIP_TYPE_BD71847: 1167b389ceaeSAxel Lin reg_data = bd71847_regulators; 1168b389ceaeSAxel Lin num_reg_data = ARRAY_SIZE(bd71847_regulators); 1169b389ceaeSAxel Lin break; 1170b389ceaeSAxel Lin default: 11712ece646cSMatti Vaittinen dev_err(&pdev->dev, "Unsupported chip type\n"); 11722ece646cSMatti Vaittinen err = -EINVAL; 11732ece646cSMatti Vaittinen goto err; 11742ece646cSMatti Vaittinen } 11752ece646cSMatti Vaittinen 11762ece646cSMatti Vaittinen /* Register LOCK release */ 11772a6a7aacSMatti Vaittinen err = regmap_update_bits(mfd->chip.regmap, BD718XX_REG_REGLOCK, 11782ece646cSMatti Vaittinen (REGLOCK_PWRSEQ | REGLOCK_VREG), 0); 11792ece646cSMatti Vaittinen if (err) { 1180bcb047ebSAxel Lin dev_err(&pdev->dev, "Failed to unlock PMIC (%d)\n", err); 11812ece646cSMatti Vaittinen goto err; 11822ece646cSMatti Vaittinen } else { 1183bcb047ebSAxel Lin dev_dbg(&pdev->dev, "Unlocked lock register 0x%x\n", 11842ece646cSMatti Vaittinen BD718XX_REG_REGLOCK); 11852ece646cSMatti Vaittinen } 11862ece646cSMatti Vaittinen 1187049369d4SMatti Vaittinen use_snvs = of_property_read_bool(pdev->dev.parent->of_node, 1188049369d4SMatti Vaittinen "rohm,reset-snvs-powered"); 1189049369d4SMatti Vaittinen 1190049369d4SMatti Vaittinen /* 1191e770b18bSMatti Vaittinen * Change the next stage from poweroff to be READY instead of SNVS 1192e770b18bSMatti Vaittinen * for all reset types because OTP loading at READY will clear SEL 1193e770b18bSMatti Vaittinen * bit allowing HW defaults for power rails to be used 1194e770b18bSMatti Vaittinen */ 1195049369d4SMatti Vaittinen if (!use_snvs) { 11962a6a7aacSMatti Vaittinen err = regmap_update_bits(mfd->chip.regmap, 11972a6a7aacSMatti Vaittinen BD718XX_REG_TRANS_COND1, 1198e770b18bSMatti Vaittinen BD718XX_ON_REQ_POWEROFF_MASK | 1199e770b18bSMatti Vaittinen BD718XX_SWRESET_POWEROFF_MASK | 1200e770b18bSMatti Vaittinen BD718XX_WDOG_POWEROFF_MASK | 1201e770b18bSMatti Vaittinen BD718XX_KEY_L_POWEROFF_MASK, 1202e770b18bSMatti Vaittinen BD718XX_POWOFF_TO_RDY); 1203e770b18bSMatti Vaittinen if (err) { 1204e770b18bSMatti Vaittinen dev_err(&pdev->dev, "Failed to change reset target\n"); 1205e770b18bSMatti Vaittinen goto err; 1206e770b18bSMatti Vaittinen } else { 1207049369d4SMatti Vaittinen dev_dbg(&pdev->dev, 1208049369d4SMatti Vaittinen "Changed all resets from SVNS to READY\n"); 1209049369d4SMatti Vaittinen } 1210e770b18bSMatti Vaittinen } 1211e770b18bSMatti Vaittinen 1212b389ceaeSAxel Lin for (i = 0; i < num_reg_data; i++) { 12132ece646cSMatti Vaittinen 12142ece646cSMatti Vaittinen const struct regulator_desc *desc; 12152ece646cSMatti Vaittinen struct regulator_dev *rdev; 12162ece646cSMatti Vaittinen const struct bd718xx_regulator_data *r; 12172ece646cSMatti Vaittinen 1218b389ceaeSAxel Lin r = ®_data[i]; 12192ece646cSMatti Vaittinen desc = &r->desc; 12202ece646cSMatti Vaittinen 12212ece646cSMatti Vaittinen config.dev = pdev->dev.parent; 12222a6a7aacSMatti Vaittinen config.regmap = mfd->chip.regmap; 12232ece646cSMatti Vaittinen 12242ece646cSMatti Vaittinen rdev = devm_regulator_register(&pdev->dev, desc, &config); 12252ece646cSMatti Vaittinen if (IS_ERR(rdev)) { 1226bcb047ebSAxel Lin dev_err(&pdev->dev, 12272ece646cSMatti Vaittinen "failed to register %s regulator\n", 12282ece646cSMatti Vaittinen desc->name); 12292ece646cSMatti Vaittinen err = PTR_ERR(rdev); 12302ece646cSMatti Vaittinen goto err; 12312ece646cSMatti Vaittinen } 1232049369d4SMatti Vaittinen 1233049369d4SMatti Vaittinen /* 1234049369d4SMatti Vaittinen * Regulator register gets the regulator constraints and 12352ece646cSMatti Vaittinen * applies them (set_machine_constraints). This should have 12362ece646cSMatti Vaittinen * turned the control register(s) to correct values and we 12372ece646cSMatti Vaittinen * can now switch the control from PMIC state machine to the 12382ece646cSMatti Vaittinen * register interface 1239049369d4SMatti Vaittinen * 1240049369d4SMatti Vaittinen * At poweroff transition PMIC HW disables EN bit for 1241049369d4SMatti Vaittinen * regulators but leaves SEL bit untouched. So if state 1242049369d4SMatti Vaittinen * transition from POWEROFF is done to SNVS - then all power 1243049369d4SMatti Vaittinen * rails controlled by SW (having SEL bit set) stay disabled 1244049369d4SMatti Vaittinen * as EN is cleared. This will result boot failure if any 1245049369d4SMatti Vaittinen * crucial systems are powered by these rails. We don't 1246049369d4SMatti Vaittinen * enable SW control for crucial regulators if snvs state is 1247049369d4SMatti Vaittinen * used 12482ece646cSMatti Vaittinen */ 1249049369d4SMatti Vaittinen if (!use_snvs || !rdev->constraints->always_on || 1250049369d4SMatti Vaittinen !rdev->constraints->boot_on) { 12512a6a7aacSMatti Vaittinen err = regmap_update_bits(mfd->chip.regmap, r->init.reg, 12522ece646cSMatti Vaittinen r->init.mask, r->init.val); 12532ece646cSMatti Vaittinen if (err) { 1254bcb047ebSAxel Lin dev_err(&pdev->dev, 1255049369d4SMatti Vaittinen "Failed to take control for (%s)\n", 12562ece646cSMatti Vaittinen desc->name); 12572ece646cSMatti Vaittinen goto err; 12582ece646cSMatti Vaittinen } 1259049369d4SMatti Vaittinen } 12602ece646cSMatti Vaittinen for (j = 0; j < r->additional_init_amnt; j++) { 12612a6a7aacSMatti Vaittinen err = regmap_update_bits(mfd->chip.regmap, 12622ece646cSMatti Vaittinen r->additional_inits[j].reg, 12632ece646cSMatti Vaittinen r->additional_inits[j].mask, 12642ece646cSMatti Vaittinen r->additional_inits[j].val); 12652ece646cSMatti Vaittinen if (err) { 1266bcb047ebSAxel Lin dev_err(&pdev->dev, 12672ece646cSMatti Vaittinen "Buck (%s) initialization failed\n", 12682ece646cSMatti Vaittinen desc->name); 12692ece646cSMatti Vaittinen goto err; 12702ece646cSMatti Vaittinen } 12712ece646cSMatti Vaittinen } 12722ece646cSMatti Vaittinen } 12732ece646cSMatti Vaittinen 12742ece646cSMatti Vaittinen err: 12752ece646cSMatti Vaittinen return err; 12762ece646cSMatti Vaittinen } 12772ece646cSMatti Vaittinen 12782ece646cSMatti Vaittinen static struct platform_driver bd718xx_regulator = { 12792ece646cSMatti Vaittinen .driver = { 12802ece646cSMatti Vaittinen .name = "bd718xx-pmic", 12812ece646cSMatti Vaittinen }, 12822ece646cSMatti Vaittinen .probe = bd718xx_probe, 12832ece646cSMatti Vaittinen }; 12842ece646cSMatti Vaittinen 12852ece646cSMatti Vaittinen module_platform_driver(bd718xx_regulator); 12862ece646cSMatti Vaittinen 12872ece646cSMatti Vaittinen MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>"); 12882ece646cSMatti Vaittinen MODULE_DESCRIPTION("BD71837/BD71847 voltage regulator driver"); 12892ece646cSMatti Vaittinen MODULE_LICENSE("GPL"); 129095bddd8bSGuido Günther MODULE_ALIAS("platform:bd718xx-pmic"); 1291