1fe669cb9SAxel Lin // SPDX-License-Identifier: GPL-2.0 2fe669cb9SAxel Lin // 3fe669cb9SAxel Lin // Copyright (c) 2017 MediaTek Inc. 4fe669cb9SAxel Lin // Author: Chenglin Xu <chenglin.xu@mediatek.com> 5a551e273SChenglin Xu 6a551e273SChenglin Xu #include <linux/module.h> 7a551e273SChenglin Xu #include <linux/of.h> 8a551e273SChenglin Xu #include <linux/platform_device.h> 9a551e273SChenglin Xu #include <linux/regmap.h> 10a551e273SChenglin Xu #include <linux/regulator/driver.h> 11a551e273SChenglin Xu #include <linux/regulator/machine.h> 12a551e273SChenglin Xu #include <linux/regulator/mt6380-regulator.h> 13a551e273SChenglin Xu #include <linux/regulator/of_regulator.h> 14a551e273SChenglin Xu 15a551e273SChenglin Xu /* PMIC Registers */ 16a551e273SChenglin Xu #define MT6380_ALDO_CON_0 0x0000 17a551e273SChenglin Xu #define MT6380_BTLDO_CON_0 0x0004 18a551e273SChenglin Xu #define MT6380_COMP_CON_0 0x0008 19a551e273SChenglin Xu #define MT6380_CPUBUCK_CON_0 0x000C 20a551e273SChenglin Xu #define MT6380_CPUBUCK_CON_1 0x0010 21a551e273SChenglin Xu #define MT6380_CPUBUCK_CON_2 0x0014 22a551e273SChenglin Xu #define MT6380_DDRLDO_CON_0 0x0018 23a551e273SChenglin Xu #define MT6380_MLDO_CON_0 0x001C 24a551e273SChenglin Xu #define MT6380_PALDO_CON_0 0x0020 25a551e273SChenglin Xu #define MT6380_PHYLDO_CON_0 0x0024 26a551e273SChenglin Xu #define MT6380_SIDO_CON_0 0x0028 27a551e273SChenglin Xu #define MT6380_SIDO_CON_1 0x002C 28a551e273SChenglin Xu #define MT6380_SIDO_CON_2 0x0030 29a551e273SChenglin Xu #define MT6380_SLDO_CON_0 0x0034 30a551e273SChenglin Xu #define MT6380_TLDO_CON_0 0x0038 31a551e273SChenglin Xu #define MT6380_STARTUP_CON_0 0x003C 32a551e273SChenglin Xu #define MT6380_STARTUP_CON_1 0x0040 33a551e273SChenglin Xu #define MT6380_SMPS_TOP_CON_0 0x0044 34a551e273SChenglin Xu #define MT6380_SMPS_TOP_CON_1 0x0048 35a551e273SChenglin Xu #define MT6380_ANA_CTRL_0 0x0050 36a551e273SChenglin Xu #define MT6380_ANA_CTRL_1 0x0054 37a551e273SChenglin Xu #define MT6380_ANA_CTRL_2 0x0058 38a551e273SChenglin Xu #define MT6380_ANA_CTRL_3 0x005C 39a551e273SChenglin Xu #define MT6380_ANA_CTRL_4 0x0060 40a551e273SChenglin Xu #define MT6380_SPK_CON9 0x0064 41a551e273SChenglin Xu #define MT6380_SPK_CON11 0x0068 42a551e273SChenglin Xu #define MT6380_SPK_CON12 0x006A 43a551e273SChenglin Xu #define MT6380_CLK_CTRL 0x0070 44a551e273SChenglin Xu #define MT6380_PINMUX_CTRL 0x0074 45a551e273SChenglin Xu #define MT6380_IO_CTRL 0x0078 46a551e273SChenglin Xu #define MT6380_SLP_MODE_CTRL_0 0x007C 47a551e273SChenglin Xu #define MT6380_SLP_MODE_CTRL_1 0x0080 48a551e273SChenglin Xu #define MT6380_SLP_MODE_CTRL_2 0x0084 49a551e273SChenglin Xu #define MT6380_SLP_MODE_CTRL_3 0x0088 50a551e273SChenglin Xu #define MT6380_SLP_MODE_CTRL_4 0x008C 51a551e273SChenglin Xu #define MT6380_SLP_MODE_CTRL_5 0x0090 52a551e273SChenglin Xu #define MT6380_SLP_MODE_CTRL_6 0x0094 53a551e273SChenglin Xu #define MT6380_SLP_MODE_CTRL_7 0x0098 54a551e273SChenglin Xu #define MT6380_SLP_MODE_CTRL_8 0x009C 55a551e273SChenglin Xu #define MT6380_FCAL_CTRL_0 0x00A0 56a551e273SChenglin Xu #define MT6380_FCAL_CTRL_1 0x00A4 57a551e273SChenglin Xu #define MT6380_LDO_CTRL_0 0x00A8 58a551e273SChenglin Xu #define MT6380_LDO_CTRL_1 0x00AC 59a551e273SChenglin Xu #define MT6380_LDO_CTRL_2 0x00B0 60a551e273SChenglin Xu #define MT6380_LDO_CTRL_3 0x00B4 61a551e273SChenglin Xu #define MT6380_LDO_CTRL_4 0x00B8 62a551e273SChenglin Xu #define MT6380_DEBUG_CTRL_0 0x00BC 63a551e273SChenglin Xu #define MT6380_EFU_CTRL_0 0x0200 64a551e273SChenglin Xu #define MT6380_EFU_CTRL_1 0x0201 65a551e273SChenglin Xu #define MT6380_EFU_CTRL_2 0x0202 66a551e273SChenglin Xu #define MT6380_EFU_CTRL_3 0x0203 67a551e273SChenglin Xu #define MT6380_EFU_CTRL_4 0x0204 68a551e273SChenglin Xu #define MT6380_EFU_CTRL_5 0x0205 69a551e273SChenglin Xu #define MT6380_EFU_CTRL_6 0x0206 70a551e273SChenglin Xu #define MT6380_EFU_CTRL_7 0x0207 71a551e273SChenglin Xu #define MT6380_EFU_CTRL_8 0x0208 72a551e273SChenglin Xu 73a551e273SChenglin Xu #define MT6380_REGULATOR_MODE_AUTO 0 74a551e273SChenglin Xu #define MT6380_REGULATOR_MODE_FORCE_PWM 1 75a551e273SChenglin Xu 76a551e273SChenglin Xu /* 77a551e273SChenglin Xu * mt6380 regulators' information 78a551e273SChenglin Xu * 79a551e273SChenglin Xu * @desc: standard fields of regulator description 80a551e273SChenglin Xu * @vselon_reg: Register sections for hardware control mode of bucks 81a551e273SChenglin Xu * @modeset_reg: Register for controlling the buck/LDO control mode 82a551e273SChenglin Xu * @modeset_mask: Mask for controlling the buck/LDO control mode 83a551e273SChenglin Xu */ 84a551e273SChenglin Xu struct mt6380_regulator_info { 85a551e273SChenglin Xu struct regulator_desc desc; 86a551e273SChenglin Xu u32 vselon_reg; 87a551e273SChenglin Xu u32 modeset_reg; 88a551e273SChenglin Xu u32 modeset_mask; 89a551e273SChenglin Xu }; 90a551e273SChenglin Xu 91a551e273SChenglin Xu #define MT6380_BUCK(match, vreg, min, max, step, volt_ranges, enreg, \ 92a551e273SChenglin Xu vosel, vosel_mask, enbit, voselon, _modeset_reg, \ 93a551e273SChenglin Xu _modeset_mask) \ 94a551e273SChenglin Xu [MT6380_ID_##vreg] = { \ 95a551e273SChenglin Xu .desc = { \ 96a551e273SChenglin Xu .name = #vreg, \ 97a551e273SChenglin Xu .of_match = of_match_ptr(match), \ 98a551e273SChenglin Xu .ops = &mt6380_volt_range_ops, \ 99a551e273SChenglin Xu .type = REGULATOR_VOLTAGE, \ 100a551e273SChenglin Xu .id = MT6380_ID_##vreg, \ 101a551e273SChenglin Xu .owner = THIS_MODULE, \ 102a551e273SChenglin Xu .n_voltages = ((max) - (min)) / (step) + 1, \ 103a551e273SChenglin Xu .linear_ranges = volt_ranges, \ 104a551e273SChenglin Xu .n_linear_ranges = ARRAY_SIZE(volt_ranges), \ 105a551e273SChenglin Xu .vsel_reg = vosel, \ 106a551e273SChenglin Xu .vsel_mask = vosel_mask, \ 107a551e273SChenglin Xu .enable_reg = enreg, \ 108a551e273SChenglin Xu .enable_mask = BIT(enbit), \ 109a551e273SChenglin Xu }, \ 110a551e273SChenglin Xu .vselon_reg = voselon, \ 111a551e273SChenglin Xu .modeset_reg = _modeset_reg, \ 112a551e273SChenglin Xu .modeset_mask = _modeset_mask, \ 113a551e273SChenglin Xu } 114a551e273SChenglin Xu 115a551e273SChenglin Xu #define MT6380_LDO(match, vreg, ldo_volt_table, enreg, enbit, vosel, \ 116a551e273SChenglin Xu vosel_mask, _modeset_reg, _modeset_mask) \ 117a551e273SChenglin Xu [MT6380_ID_##vreg] = { \ 118a551e273SChenglin Xu .desc = { \ 119a551e273SChenglin Xu .name = #vreg, \ 120a551e273SChenglin Xu .of_match = of_match_ptr(match), \ 121a551e273SChenglin Xu .ops = &mt6380_volt_table_ops, \ 122a551e273SChenglin Xu .type = REGULATOR_VOLTAGE, \ 123a551e273SChenglin Xu .id = MT6380_ID_##vreg, \ 124a551e273SChenglin Xu .owner = THIS_MODULE, \ 125a551e273SChenglin Xu .n_voltages = ARRAY_SIZE(ldo_volt_table), \ 126a551e273SChenglin Xu .volt_table = ldo_volt_table, \ 127a551e273SChenglin Xu .vsel_reg = vosel, \ 128a551e273SChenglin Xu .vsel_mask = vosel_mask, \ 129a551e273SChenglin Xu .enable_reg = enreg, \ 130a551e273SChenglin Xu .enable_mask = BIT(enbit), \ 131a551e273SChenglin Xu }, \ 132a551e273SChenglin Xu .modeset_reg = _modeset_reg, \ 133a551e273SChenglin Xu .modeset_mask = _modeset_mask, \ 134a551e273SChenglin Xu } 135a551e273SChenglin Xu 136a551e273SChenglin Xu #define MT6380_REG_FIXED(match, vreg, enreg, enbit, volt, \ 137a551e273SChenglin Xu _modeset_reg, _modeset_mask) \ 138a551e273SChenglin Xu [MT6380_ID_##vreg] = { \ 139a551e273SChenglin Xu .desc = { \ 140a551e273SChenglin Xu .name = #vreg, \ 141a551e273SChenglin Xu .of_match = of_match_ptr(match), \ 142a551e273SChenglin Xu .ops = &mt6380_volt_fixed_ops, \ 143a551e273SChenglin Xu .type = REGULATOR_VOLTAGE, \ 144a551e273SChenglin Xu .id = MT6380_ID_##vreg, \ 145a551e273SChenglin Xu .owner = THIS_MODULE, \ 146a551e273SChenglin Xu .n_voltages = 1, \ 147a551e273SChenglin Xu .enable_reg = enreg, \ 148a551e273SChenglin Xu .enable_mask = BIT(enbit), \ 149a551e273SChenglin Xu .min_uV = volt, \ 150a551e273SChenglin Xu }, \ 151a551e273SChenglin Xu .modeset_reg = _modeset_reg, \ 152a551e273SChenglin Xu .modeset_mask = _modeset_mask, \ 153a551e273SChenglin Xu } 154a551e273SChenglin Xu 15560ab7f41SMatti Vaittinen static const struct linear_range buck_volt_range1[] = { 156a551e273SChenglin Xu REGULATOR_LINEAR_RANGE(600000, 0, 0xfe, 6250), 157a551e273SChenglin Xu }; 158a551e273SChenglin Xu 15960ab7f41SMatti Vaittinen static const struct linear_range buck_volt_range2[] = { 160a551e273SChenglin Xu REGULATOR_LINEAR_RANGE(600000, 0, 0xfe, 6250), 161a551e273SChenglin Xu }; 162a551e273SChenglin Xu 16360ab7f41SMatti Vaittinen static const struct linear_range buck_volt_range3[] = { 164a551e273SChenglin Xu REGULATOR_LINEAR_RANGE(1200000, 0, 0x3c, 25000), 165a551e273SChenglin Xu }; 166a551e273SChenglin Xu 1671fc26296SAxel Lin static const unsigned int ldo_volt_table1[] = { 168a551e273SChenglin Xu 1400000, 1350000, 1300000, 1250000, 1200000, 1150000, 1100000, 1050000, 169a551e273SChenglin Xu }; 170a551e273SChenglin Xu 1711fc26296SAxel Lin static const unsigned int ldo_volt_table2[] = { 172a551e273SChenglin Xu 2200000, 3300000, 173a551e273SChenglin Xu }; 174a551e273SChenglin Xu 1751fc26296SAxel Lin static const unsigned int ldo_volt_table3[] = { 176a551e273SChenglin Xu 1240000, 1390000, 1540000, 1840000, 177a551e273SChenglin Xu }; 178a551e273SChenglin Xu 1791fc26296SAxel Lin static const unsigned int ldo_volt_table4[] = { 180a551e273SChenglin Xu 2200000, 3300000, 181a551e273SChenglin Xu }; 182a551e273SChenglin Xu 183a551e273SChenglin Xu static int mt6380_regulator_set_mode(struct regulator_dev *rdev, 184a551e273SChenglin Xu unsigned int mode) 185a551e273SChenglin Xu { 186a551e273SChenglin Xu int ret, val = 0; 187a551e273SChenglin Xu struct mt6380_regulator_info *info = rdev_get_drvdata(rdev); 188a551e273SChenglin Xu 189a551e273SChenglin Xu switch (mode) { 190a551e273SChenglin Xu case REGULATOR_MODE_NORMAL: 191a551e273SChenglin Xu val = MT6380_REGULATOR_MODE_AUTO; 192a551e273SChenglin Xu break; 193a551e273SChenglin Xu case REGULATOR_MODE_FAST: 194a551e273SChenglin Xu val = MT6380_REGULATOR_MODE_FORCE_PWM; 195a551e273SChenglin Xu break; 196a551e273SChenglin Xu default: 197a551e273SChenglin Xu return -EINVAL; 198a551e273SChenglin Xu } 199a551e273SChenglin Xu 200a551e273SChenglin Xu val <<= ffs(info->modeset_mask) - 1; 201a551e273SChenglin Xu 202a551e273SChenglin Xu ret = regmap_update_bits(rdev->regmap, info->modeset_reg, 203a551e273SChenglin Xu info->modeset_mask, val); 204a551e273SChenglin Xu 205a551e273SChenglin Xu return ret; 206a551e273SChenglin Xu } 207a551e273SChenglin Xu 208a551e273SChenglin Xu static unsigned int mt6380_regulator_get_mode(struct regulator_dev *rdev) 209a551e273SChenglin Xu { 210a551e273SChenglin Xu unsigned int val; 211a551e273SChenglin Xu unsigned int mode; 212a551e273SChenglin Xu int ret; 213a551e273SChenglin Xu struct mt6380_regulator_info *info = rdev_get_drvdata(rdev); 214a551e273SChenglin Xu 215a551e273SChenglin Xu ret = regmap_read(rdev->regmap, info->modeset_reg, &val); 216a551e273SChenglin Xu if (ret < 0) 217a551e273SChenglin Xu return ret; 218a551e273SChenglin Xu 219a551e273SChenglin Xu val &= info->modeset_mask; 220a551e273SChenglin Xu val >>= ffs(info->modeset_mask) - 1; 221a551e273SChenglin Xu 222a551e273SChenglin Xu switch (val) { 223a551e273SChenglin Xu case MT6380_REGULATOR_MODE_AUTO: 224a551e273SChenglin Xu mode = REGULATOR_MODE_NORMAL; 225a551e273SChenglin Xu break; 226a551e273SChenglin Xu case MT6380_REGULATOR_MODE_FORCE_PWM: 227a551e273SChenglin Xu mode = REGULATOR_MODE_FAST; 228a551e273SChenglin Xu break; 229a551e273SChenglin Xu default: 230a551e273SChenglin Xu return -EINVAL; 231a551e273SChenglin Xu } 232a551e273SChenglin Xu 233a551e273SChenglin Xu return mode; 234a551e273SChenglin Xu } 235a551e273SChenglin Xu 236a551e273SChenglin Xu static const struct regulator_ops mt6380_volt_range_ops = { 237a551e273SChenglin Xu .list_voltage = regulator_list_voltage_linear_range, 238a551e273SChenglin Xu .map_voltage = regulator_map_voltage_linear_range, 239a551e273SChenglin Xu .set_voltage_sel = regulator_set_voltage_sel_regmap, 240a551e273SChenglin Xu .get_voltage_sel = regulator_get_voltage_sel_regmap, 241a551e273SChenglin Xu .set_voltage_time_sel = regulator_set_voltage_time_sel, 242a551e273SChenglin Xu .enable = regulator_enable_regmap, 243a551e273SChenglin Xu .disable = regulator_disable_regmap, 244a551e273SChenglin Xu .is_enabled = regulator_is_enabled_regmap, 245a551e273SChenglin Xu .set_mode = mt6380_regulator_set_mode, 246a551e273SChenglin Xu .get_mode = mt6380_regulator_get_mode, 247a551e273SChenglin Xu }; 248a551e273SChenglin Xu 249a551e273SChenglin Xu static const struct regulator_ops mt6380_volt_table_ops = { 250a551e273SChenglin Xu .list_voltage = regulator_list_voltage_table, 251a551e273SChenglin Xu .map_voltage = regulator_map_voltage_iterate, 252a551e273SChenglin Xu .set_voltage_sel = regulator_set_voltage_sel_regmap, 253a551e273SChenglin Xu .get_voltage_sel = regulator_get_voltage_sel_regmap, 254a551e273SChenglin Xu .set_voltage_time_sel = regulator_set_voltage_time_sel, 255a551e273SChenglin Xu .enable = regulator_enable_regmap, 256a551e273SChenglin Xu .disable = regulator_disable_regmap, 257a551e273SChenglin Xu .is_enabled = regulator_is_enabled_regmap, 258a551e273SChenglin Xu .set_mode = mt6380_regulator_set_mode, 259a551e273SChenglin Xu .get_mode = mt6380_regulator_get_mode, 260a551e273SChenglin Xu }; 261a551e273SChenglin Xu 262a551e273SChenglin Xu static const struct regulator_ops mt6380_volt_fixed_ops = { 263a551e273SChenglin Xu .list_voltage = regulator_list_voltage_linear, 264a551e273SChenglin Xu .enable = regulator_enable_regmap, 265a551e273SChenglin Xu .disable = regulator_disable_regmap, 266a551e273SChenglin Xu .is_enabled = regulator_is_enabled_regmap, 267a551e273SChenglin Xu .set_mode = mt6380_regulator_set_mode, 268a551e273SChenglin Xu .get_mode = mt6380_regulator_get_mode, 269a551e273SChenglin Xu }; 270a551e273SChenglin Xu 271a551e273SChenglin Xu /* The array is indexed by id(MT6380_ID_XXX) */ 272a551e273SChenglin Xu static struct mt6380_regulator_info mt6380_regulators[] = { 273a551e273SChenglin Xu MT6380_BUCK("buck-vcore1", VCPU, 600000, 1393750, 6250, 274a551e273SChenglin Xu buck_volt_range1, MT6380_ANA_CTRL_3, MT6380_ANA_CTRL_1, 275a551e273SChenglin Xu 0xfe, 3, MT6380_ANA_CTRL_1, 276a551e273SChenglin Xu MT6380_CPUBUCK_CON_0, 0x8000000), 277a551e273SChenglin Xu MT6380_BUCK("buck-vcore", VCORE, 600000, 1393750, 6250, 278a551e273SChenglin Xu buck_volt_range2, MT6380_ANA_CTRL_3, MT6380_ANA_CTRL_2, 279a551e273SChenglin Xu 0xfe, 2, MT6380_ANA_CTRL_2, MT6380_SIDO_CON_0, 0x1000000), 280a551e273SChenglin Xu MT6380_BUCK("buck-vrf", VRF, 1200000, 1575000, 25000, 281a551e273SChenglin Xu buck_volt_range3, MT6380_ANA_CTRL_3, MT6380_SIDO_CON_0, 282a551e273SChenglin Xu 0x78, 1, MT6380_SIDO_CON_0, MT6380_SIDO_CON_0, 0x8000), 283a551e273SChenglin Xu MT6380_LDO("ldo-vm", VMLDO, ldo_volt_table1, MT6380_LDO_CTRL_0, 284a551e273SChenglin Xu 1, MT6380_MLDO_CON_0, 0xE000, MT6380_ANA_CTRL_1, 0x4000000), 285a551e273SChenglin Xu MT6380_LDO("ldo-va", VALDO, ldo_volt_table2, MT6380_LDO_CTRL_0, 286a551e273SChenglin Xu 2, MT6380_ALDO_CON_0, 0x400, MT6380_ALDO_CON_0, 0x20), 287a551e273SChenglin Xu MT6380_REG_FIXED("ldo-vphy", VPHYLDO, MT6380_LDO_CTRL_0, 7, 1800000, 288a551e273SChenglin Xu MT6380_PHYLDO_CON_0, 0x80), 289a551e273SChenglin Xu MT6380_LDO("ldo-vddr", VDDRLDO, ldo_volt_table3, MT6380_LDO_CTRL_0, 290a551e273SChenglin Xu 8, MT6380_DDRLDO_CON_0, 0x3000, MT6380_DDRLDO_CON_0, 0x80), 291a551e273SChenglin Xu MT6380_LDO("ldo-vt", VTLDO, ldo_volt_table4, MT6380_LDO_CTRL_0, 3, 292a551e273SChenglin Xu MT6380_TLDO_CON_0, 0x400, MT6380_TLDO_CON_0, 0x20), 293a551e273SChenglin Xu }; 294a551e273SChenglin Xu 295a551e273SChenglin Xu static int mt6380_regulator_probe(struct platform_device *pdev) 296a551e273SChenglin Xu { 297a551e273SChenglin Xu struct regmap *regmap = dev_get_regmap(pdev->dev.parent, NULL); 298a551e273SChenglin Xu struct regulator_config config = {}; 299a551e273SChenglin Xu struct regulator_dev *rdev; 300a551e273SChenglin Xu int i; 301a551e273SChenglin Xu 302a551e273SChenglin Xu for (i = 0; i < MT6380_MAX_REGULATOR; i++) { 303a551e273SChenglin Xu config.dev = &pdev->dev; 304a551e273SChenglin Xu config.driver_data = &mt6380_regulators[i]; 305a551e273SChenglin Xu config.regmap = regmap; 306a551e273SChenglin Xu rdev = devm_regulator_register(&pdev->dev, 307a551e273SChenglin Xu &mt6380_regulators[i].desc, 308a551e273SChenglin Xu &config); 309a551e273SChenglin Xu if (IS_ERR(rdev)) { 310a551e273SChenglin Xu dev_err(&pdev->dev, "failed to register %s\n", 311a551e273SChenglin Xu mt6380_regulators[i].desc.name); 312a551e273SChenglin Xu return PTR_ERR(rdev); 313a551e273SChenglin Xu } 314a551e273SChenglin Xu } 315a551e273SChenglin Xu return 0; 316a551e273SChenglin Xu } 317a551e273SChenglin Xu 318a551e273SChenglin Xu static const struct platform_device_id mt6380_platform_ids[] = { 319a551e273SChenglin Xu {"mt6380-regulator", 0}, 320a551e273SChenglin Xu { /* sentinel */ }, 321a551e273SChenglin Xu }; 322a551e273SChenglin Xu MODULE_DEVICE_TABLE(platform, mt6380_platform_ids); 323a551e273SChenglin Xu 324a551e273SChenglin Xu static const struct of_device_id mt6380_of_match[] = { 325a551e273SChenglin Xu { .compatible = "mediatek,mt6380-regulator", }, 326a551e273SChenglin Xu { /* sentinel */ }, 327a551e273SChenglin Xu }; 328a551e273SChenglin Xu MODULE_DEVICE_TABLE(of, mt6380_of_match); 329a551e273SChenglin Xu 330a551e273SChenglin Xu static struct platform_driver mt6380_regulator_driver = { 331a551e273SChenglin Xu .driver = { 332a551e273SChenglin Xu .name = "mt6380-regulator", 333a551e273SChenglin Xu .of_match_table = of_match_ptr(mt6380_of_match), 334a551e273SChenglin Xu }, 335a551e273SChenglin Xu .probe = mt6380_regulator_probe, 336a551e273SChenglin Xu .id_table = mt6380_platform_ids, 337a551e273SChenglin Xu }; 338a551e273SChenglin Xu 339a551e273SChenglin Xu module_platform_driver(mt6380_regulator_driver); 340a551e273SChenglin Xu 341a551e273SChenglin Xu MODULE_AUTHOR("Chenglin Xu <chenglin.xu@mediatek.com>"); 342a551e273SChenglin Xu MODULE_DESCRIPTION("Regulator Driver for MediaTek MT6380 PMIC"); 343a551e273SChenglin Xu MODULE_LICENSE("GPL v2"); 344