162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci// 362306a36Sopenharmony_ci// Copyright (c) 2022 MediaTek Inc. 462306a36Sopenharmony_ci// Copyright (c) 2022 BayLibre, SAS. 562306a36Sopenharmony_ci// Author: Chen Zhong <chen.zhong@mediatek.com> 662306a36Sopenharmony_ci// Author: Fabien Parent <fparent@baylibre.com> 762306a36Sopenharmony_ci// Author: Alexandre Mergnat <amergnat@baylibre.com> 862306a36Sopenharmony_ci// 962306a36Sopenharmony_ci// Based on mt6397-regulator.c 1062306a36Sopenharmony_ci// 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <linux/module.h> 1362306a36Sopenharmony_ci#include <linux/of.h> 1462306a36Sopenharmony_ci#include <linux/platform_device.h> 1562306a36Sopenharmony_ci#include <linux/regmap.h> 1662306a36Sopenharmony_ci#include <linux/mfd/mt6397/core.h> 1762306a36Sopenharmony_ci#include <linux/mfd/mt6357/registers.h> 1862306a36Sopenharmony_ci#include <linux/regulator/driver.h> 1962306a36Sopenharmony_ci#include <linux/regulator/machine.h> 2062306a36Sopenharmony_ci#include <linux/regulator/mt6357-regulator.h> 2162306a36Sopenharmony_ci#include <linux/regulator/of_regulator.h> 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci/* 2462306a36Sopenharmony_ci * MT6357 regulators' information 2562306a36Sopenharmony_ci * 2662306a36Sopenharmony_ci * @desc: standard fields of regulator description. 2762306a36Sopenharmony_ci * @da_vsel_reg: Monitor register for query buck's voltage. 2862306a36Sopenharmony_ci * @da_vsel_mask: Mask for query buck's voltage. 2962306a36Sopenharmony_ci */ 3062306a36Sopenharmony_cistruct mt6357_regulator_info { 3162306a36Sopenharmony_ci struct regulator_desc desc; 3262306a36Sopenharmony_ci u32 da_vsel_reg; 3362306a36Sopenharmony_ci u32 da_vsel_mask; 3462306a36Sopenharmony_ci}; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#define MT6357_BUCK(match, vreg, min, max, step, \ 3762306a36Sopenharmony_ci volt_ranges, vosel_reg, vosel_mask, _da_vsel_mask) \ 3862306a36Sopenharmony_ci[MT6357_ID_##vreg] = { \ 3962306a36Sopenharmony_ci .desc = { \ 4062306a36Sopenharmony_ci .name = #vreg, \ 4162306a36Sopenharmony_ci .of_match = of_match_ptr(match), \ 4262306a36Sopenharmony_ci .regulators_node = "regulators", \ 4362306a36Sopenharmony_ci .ops = &mt6357_volt_range_ops, \ 4462306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, \ 4562306a36Sopenharmony_ci .id = MT6357_ID_##vreg, \ 4662306a36Sopenharmony_ci .owner = THIS_MODULE, \ 4762306a36Sopenharmony_ci .n_voltages = ((max) - (min)) / (step) + 1, \ 4862306a36Sopenharmony_ci .linear_ranges = volt_ranges, \ 4962306a36Sopenharmony_ci .n_linear_ranges = ARRAY_SIZE(volt_ranges), \ 5062306a36Sopenharmony_ci .vsel_reg = vosel_reg, \ 5162306a36Sopenharmony_ci .vsel_mask = vosel_mask, \ 5262306a36Sopenharmony_ci .enable_reg = MT6357_BUCK_##vreg##_CON0, \ 5362306a36Sopenharmony_ci .enable_mask = BIT(0), \ 5462306a36Sopenharmony_ci }, \ 5562306a36Sopenharmony_ci .da_vsel_reg = MT6357_BUCK_##vreg##_DBG0, \ 5662306a36Sopenharmony_ci .da_vsel_mask = vosel_mask, \ 5762306a36Sopenharmony_ci} 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci#define MT6357_LDO(match, vreg, ldo_volt_table, \ 6062306a36Sopenharmony_ci enreg, vosel, vosel_mask) \ 6162306a36Sopenharmony_ci[MT6357_ID_##vreg] = { \ 6262306a36Sopenharmony_ci .desc = { \ 6362306a36Sopenharmony_ci .name = #vreg, \ 6462306a36Sopenharmony_ci .of_match = of_match_ptr(match), \ 6562306a36Sopenharmony_ci .regulators_node = "regulators", \ 6662306a36Sopenharmony_ci .ops = &mt6357_volt_table_ops, \ 6762306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, \ 6862306a36Sopenharmony_ci .id = MT6357_ID_##vreg, \ 6962306a36Sopenharmony_ci .owner = THIS_MODULE, \ 7062306a36Sopenharmony_ci .n_voltages = ARRAY_SIZE(ldo_volt_table), \ 7162306a36Sopenharmony_ci .volt_table = ldo_volt_table, \ 7262306a36Sopenharmony_ci .vsel_reg = vosel, \ 7362306a36Sopenharmony_ci .vsel_mask = vosel_mask, \ 7462306a36Sopenharmony_ci .enable_reg = enreg, \ 7562306a36Sopenharmony_ci .enable_mask = BIT(0), \ 7662306a36Sopenharmony_ci }, \ 7762306a36Sopenharmony_ci} 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci#define MT6357_LDO1(match, vreg, min, max, step, volt_ranges, \ 8062306a36Sopenharmony_ci enreg, vosel, vosel_mask) \ 8162306a36Sopenharmony_ci[MT6357_ID_##vreg] = { \ 8262306a36Sopenharmony_ci .desc = { \ 8362306a36Sopenharmony_ci .name = #vreg, \ 8462306a36Sopenharmony_ci .of_match = of_match_ptr(match), \ 8562306a36Sopenharmony_ci .regulators_node = "regulators", \ 8662306a36Sopenharmony_ci .ops = &mt6357_volt_range_ops, \ 8762306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, \ 8862306a36Sopenharmony_ci .id = MT6357_ID_##vreg, \ 8962306a36Sopenharmony_ci .owner = THIS_MODULE, \ 9062306a36Sopenharmony_ci .n_voltages = ((max) - (min)) / (step) + 1, \ 9162306a36Sopenharmony_ci .linear_ranges = volt_ranges, \ 9262306a36Sopenharmony_ci .n_linear_ranges = ARRAY_SIZE(volt_ranges), \ 9362306a36Sopenharmony_ci .vsel_reg = vosel, \ 9462306a36Sopenharmony_ci .vsel_mask = vosel_mask, \ 9562306a36Sopenharmony_ci .enable_reg = enreg, \ 9662306a36Sopenharmony_ci .enable_mask = BIT(0), \ 9762306a36Sopenharmony_ci }, \ 9862306a36Sopenharmony_ci .da_vsel_reg = MT6357_LDO_##vreg##_DBG0, \ 9962306a36Sopenharmony_ci .da_vsel_mask = 0x7f00, \ 10062306a36Sopenharmony_ci} 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci#define MT6357_REG_FIXED(match, vreg, volt) \ 10362306a36Sopenharmony_ci[MT6357_ID_##vreg] = { \ 10462306a36Sopenharmony_ci .desc = { \ 10562306a36Sopenharmony_ci .name = #vreg, \ 10662306a36Sopenharmony_ci .of_match = of_match_ptr(match), \ 10762306a36Sopenharmony_ci .regulators_node = "regulators", \ 10862306a36Sopenharmony_ci .ops = &mt6357_volt_fixed_ops, \ 10962306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, \ 11062306a36Sopenharmony_ci .id = MT6357_ID_##vreg, \ 11162306a36Sopenharmony_ci .owner = THIS_MODULE, \ 11262306a36Sopenharmony_ci .n_voltages = 1, \ 11362306a36Sopenharmony_ci .enable_reg = MT6357_LDO_##vreg##_CON0, \ 11462306a36Sopenharmony_ci .enable_mask = BIT(0), \ 11562306a36Sopenharmony_ci .min_uV = volt, \ 11662306a36Sopenharmony_ci }, \ 11762306a36Sopenharmony_ci} 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci/** 12062306a36Sopenharmony_ci * mt6357_get_buck_voltage_sel - get_voltage_sel for regmap users 12162306a36Sopenharmony_ci * 12262306a36Sopenharmony_ci * @rdev: regulator to operate on 12362306a36Sopenharmony_ci * 12462306a36Sopenharmony_ci * Regulators that use regmap for their register I/O can set the 12562306a36Sopenharmony_ci * da_vsel_reg and da_vsel_mask fields in the info structure and 12662306a36Sopenharmony_ci * then use this as their get_voltage_vsel operation. 12762306a36Sopenharmony_ci */ 12862306a36Sopenharmony_cistatic int mt6357_get_buck_voltage_sel(struct regulator_dev *rdev) 12962306a36Sopenharmony_ci{ 13062306a36Sopenharmony_ci int ret, regval; 13162306a36Sopenharmony_ci struct mt6357_regulator_info *info = rdev_get_drvdata(rdev); 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci ret = regmap_read(rdev->regmap, info->da_vsel_reg, ®val); 13462306a36Sopenharmony_ci if (ret != 0) { 13562306a36Sopenharmony_ci dev_err(&rdev->dev, 13662306a36Sopenharmony_ci "Failed to get mt6357 Buck %s vsel reg: %d\n", 13762306a36Sopenharmony_ci info->desc.name, ret); 13862306a36Sopenharmony_ci return ret; 13962306a36Sopenharmony_ci } 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci regval &= info->da_vsel_mask; 14262306a36Sopenharmony_ci regval >>= ffs(info->da_vsel_mask) - 1; 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci return regval; 14562306a36Sopenharmony_ci} 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_cistatic const struct regulator_ops mt6357_volt_range_ops = { 14862306a36Sopenharmony_ci .list_voltage = regulator_list_voltage_linear_range, 14962306a36Sopenharmony_ci .map_voltage = regulator_map_voltage_linear_range, 15062306a36Sopenharmony_ci .set_voltage_sel = regulator_set_voltage_sel_regmap, 15162306a36Sopenharmony_ci .get_voltage_sel = mt6357_get_buck_voltage_sel, 15262306a36Sopenharmony_ci .set_voltage_time_sel = regulator_set_voltage_time_sel, 15362306a36Sopenharmony_ci .enable = regulator_enable_regmap, 15462306a36Sopenharmony_ci .disable = regulator_disable_regmap, 15562306a36Sopenharmony_ci .is_enabled = regulator_is_enabled_regmap, 15662306a36Sopenharmony_ci}; 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_cistatic const struct regulator_ops mt6357_volt_table_ops = { 15962306a36Sopenharmony_ci .list_voltage = regulator_list_voltage_table, 16062306a36Sopenharmony_ci .map_voltage = regulator_map_voltage_iterate, 16162306a36Sopenharmony_ci .set_voltage_sel = regulator_set_voltage_sel_regmap, 16262306a36Sopenharmony_ci .get_voltage_sel = regulator_get_voltage_sel_regmap, 16362306a36Sopenharmony_ci .set_voltage_time_sel = regulator_set_voltage_time_sel, 16462306a36Sopenharmony_ci .enable = regulator_enable_regmap, 16562306a36Sopenharmony_ci .disable = regulator_disable_regmap, 16662306a36Sopenharmony_ci .is_enabled = regulator_is_enabled_regmap, 16762306a36Sopenharmony_ci}; 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_cistatic const struct regulator_ops mt6357_volt_fixed_ops = { 17062306a36Sopenharmony_ci .list_voltage = regulator_list_voltage_linear, 17162306a36Sopenharmony_ci .enable = regulator_enable_regmap, 17262306a36Sopenharmony_ci .disable = regulator_disable_regmap, 17362306a36Sopenharmony_ci .is_enabled = regulator_is_enabled_regmap, 17462306a36Sopenharmony_ci}; 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_cistatic const int vxo22_voltages[] = { 17762306a36Sopenharmony_ci 2200000, 17862306a36Sopenharmony_ci 0, 17962306a36Sopenharmony_ci 2400000, 18062306a36Sopenharmony_ci}; 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_cistatic const int vefuse_voltages[] = { 18362306a36Sopenharmony_ci 1200000, 18462306a36Sopenharmony_ci 1300000, 18562306a36Sopenharmony_ci 1500000, 18662306a36Sopenharmony_ci 0, 18762306a36Sopenharmony_ci 1800000, 18862306a36Sopenharmony_ci 0, 18962306a36Sopenharmony_ci 0, 19062306a36Sopenharmony_ci 0, 19162306a36Sopenharmony_ci 0, 19262306a36Sopenharmony_ci 2800000, 19362306a36Sopenharmony_ci 2900000, 19462306a36Sopenharmony_ci 3000000, 19562306a36Sopenharmony_ci 0, 19662306a36Sopenharmony_ci 3300000, 19762306a36Sopenharmony_ci}; 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_cistatic const int vcn33_voltages[] = { 20062306a36Sopenharmony_ci 0, 20162306a36Sopenharmony_ci 3300000, 20262306a36Sopenharmony_ci 3400000, 20362306a36Sopenharmony_ci 3500000, 20462306a36Sopenharmony_ci}; 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_cistatic const int vcama_voltages[] = { 20762306a36Sopenharmony_ci 0, 20862306a36Sopenharmony_ci 0, 20962306a36Sopenharmony_ci 0, 21062306a36Sopenharmony_ci 0, 21162306a36Sopenharmony_ci 0, 21262306a36Sopenharmony_ci 0, 21362306a36Sopenharmony_ci 0, 21462306a36Sopenharmony_ci 2500000, 21562306a36Sopenharmony_ci 0, 21662306a36Sopenharmony_ci 0, 21762306a36Sopenharmony_ci 2800000, 21862306a36Sopenharmony_ci}; 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_cistatic const int vcamd_voltages[] = { 22162306a36Sopenharmony_ci 0, 22262306a36Sopenharmony_ci 0, 22362306a36Sopenharmony_ci 0, 22462306a36Sopenharmony_ci 0, 22562306a36Sopenharmony_ci 1000000, 22662306a36Sopenharmony_ci 1100000, 22762306a36Sopenharmony_ci 1200000, 22862306a36Sopenharmony_ci 1300000, 22962306a36Sopenharmony_ci 0, 23062306a36Sopenharmony_ci 1500000, 23162306a36Sopenharmony_ci 0, 23262306a36Sopenharmony_ci 0, 23362306a36Sopenharmony_ci 1800000, 23462306a36Sopenharmony_ci}; 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_cistatic const int vldo28_voltages[] = { 23762306a36Sopenharmony_ci 0, 23862306a36Sopenharmony_ci 2800000, 23962306a36Sopenharmony_ci 0, 24062306a36Sopenharmony_ci 3000000, 24162306a36Sopenharmony_ci}; 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_cistatic const int vdram_voltages[] = { 24462306a36Sopenharmony_ci 0, 24562306a36Sopenharmony_ci 1100000, 24662306a36Sopenharmony_ci 1200000, 24762306a36Sopenharmony_ci}; 24862306a36Sopenharmony_ci 24962306a36Sopenharmony_cistatic const int vsim_voltages[] = { 25062306a36Sopenharmony_ci 0, 25162306a36Sopenharmony_ci 0, 25262306a36Sopenharmony_ci 0, 25362306a36Sopenharmony_ci 1700000, 25462306a36Sopenharmony_ci 1800000, 25562306a36Sopenharmony_ci 0, 25662306a36Sopenharmony_ci 0, 25762306a36Sopenharmony_ci 0, 25862306a36Sopenharmony_ci 2700000, 25962306a36Sopenharmony_ci 0, 26062306a36Sopenharmony_ci 0, 26162306a36Sopenharmony_ci 3000000, 26262306a36Sopenharmony_ci 3100000, 26362306a36Sopenharmony_ci}; 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_cistatic const int vibr_voltages[] = { 26662306a36Sopenharmony_ci 1200000, 26762306a36Sopenharmony_ci 1300000, 26862306a36Sopenharmony_ci 1500000, 26962306a36Sopenharmony_ci 0, 27062306a36Sopenharmony_ci 1800000, 27162306a36Sopenharmony_ci 2000000, 27262306a36Sopenharmony_ci 0, 27362306a36Sopenharmony_ci 0, 27462306a36Sopenharmony_ci 0, 27562306a36Sopenharmony_ci 2800000, 27662306a36Sopenharmony_ci 0, 27762306a36Sopenharmony_ci 3000000, 27862306a36Sopenharmony_ci 0, 27962306a36Sopenharmony_ci 3300000, 28062306a36Sopenharmony_ci}; 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_cistatic const int vmc_voltages[] = { 28362306a36Sopenharmony_ci 0, 28462306a36Sopenharmony_ci 0, 28562306a36Sopenharmony_ci 0, 28662306a36Sopenharmony_ci 0, 28762306a36Sopenharmony_ci 1800000, 28862306a36Sopenharmony_ci 0, 28962306a36Sopenharmony_ci 0, 29062306a36Sopenharmony_ci 0, 29162306a36Sopenharmony_ci 0, 29262306a36Sopenharmony_ci 0, 29362306a36Sopenharmony_ci 2900000, 29462306a36Sopenharmony_ci 3000000, 29562306a36Sopenharmony_ci 0, 29662306a36Sopenharmony_ci 3300000, 29762306a36Sopenharmony_ci}; 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_cistatic const int vmch_voltages[] = { 30062306a36Sopenharmony_ci 0, 30162306a36Sopenharmony_ci 0, 30262306a36Sopenharmony_ci 2900000, 30362306a36Sopenharmony_ci 3000000, 30462306a36Sopenharmony_ci 0, 30562306a36Sopenharmony_ci 3300000, 30662306a36Sopenharmony_ci}; 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_cistatic const int vemc_voltages[] = { 30962306a36Sopenharmony_ci 0, 31062306a36Sopenharmony_ci 0, 31162306a36Sopenharmony_ci 2900000, 31262306a36Sopenharmony_ci 3000000, 31362306a36Sopenharmony_ci 0, 31462306a36Sopenharmony_ci 3300000, 31562306a36Sopenharmony_ci}; 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_cistatic const int vusb_voltages[] = { 31862306a36Sopenharmony_ci 0, 31962306a36Sopenharmony_ci 0, 32062306a36Sopenharmony_ci 0, 32162306a36Sopenharmony_ci 3000000, 32262306a36Sopenharmony_ci 3100000, 32362306a36Sopenharmony_ci}; 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_cistatic const struct linear_range buck_volt_range1[] = { 32662306a36Sopenharmony_ci REGULATOR_LINEAR_RANGE(518750, 0, 0x7f, 6250), 32762306a36Sopenharmony_ci}; 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_cistatic const struct linear_range buck_volt_range2[] = { 33062306a36Sopenharmony_ci REGULATOR_LINEAR_RANGE(500000, 0, 0x7f, 6250), 33162306a36Sopenharmony_ci}; 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_cistatic const struct linear_range buck_volt_range3[] = { 33462306a36Sopenharmony_ci REGULATOR_LINEAR_RANGE(500000, 0, 0x3f, 50000), 33562306a36Sopenharmony_ci}; 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_cistatic const struct linear_range buck_volt_range4[] = { 33862306a36Sopenharmony_ci REGULATOR_LINEAR_RANGE(1200000, 0, 0x7f, 12500), 33962306a36Sopenharmony_ci}; 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci/* The array is indexed by id(MT6357_ID_XXX) */ 34262306a36Sopenharmony_cistatic struct mt6357_regulator_info mt6357_regulators[] = { 34362306a36Sopenharmony_ci /* Bucks */ 34462306a36Sopenharmony_ci MT6357_BUCK("buck-vcore", VCORE, 518750, 1312500, 6250, 34562306a36Sopenharmony_ci buck_volt_range1, MT6357_BUCK_VCORE_ELR0, 0x7f, 0x7f), 34662306a36Sopenharmony_ci MT6357_BUCK("buck-vproc", VPROC, 518750, 1312500, 6250, 34762306a36Sopenharmony_ci buck_volt_range1, MT6357_BUCK_VPROC_ELR0, 0x7f, 0x7f), 34862306a36Sopenharmony_ci MT6357_BUCK("buck-vmodem", VMODEM, 500000, 1293750, 6250, 34962306a36Sopenharmony_ci buck_volt_range2, MT6357_BUCK_VMODEM_ELR0, 0x7f, 0x7f), 35062306a36Sopenharmony_ci MT6357_BUCK("buck-vpa", VPA, 500000, 3650000, 50000, 35162306a36Sopenharmony_ci buck_volt_range3, MT6357_BUCK_VPA_CON1, 0x3f, 0x3f), 35262306a36Sopenharmony_ci MT6357_BUCK("buck-vs1", VS1, 1200000, 2787500, 12500, 35362306a36Sopenharmony_ci buck_volt_range4, MT6357_BUCK_VS1_ELR0, 0x7f, 0x7f), 35462306a36Sopenharmony_ci 35562306a36Sopenharmony_ci /* LDOs */ 35662306a36Sopenharmony_ci MT6357_LDO("ldo-vcama", VCAMA, vcama_voltages, 35762306a36Sopenharmony_ci MT6357_LDO_VCAMA_CON0, MT6357_VCAMA_ANA_CON0, 0xf00), 35862306a36Sopenharmony_ci MT6357_LDO("ldo-vcamd", VCAMD, vcamd_voltages, 35962306a36Sopenharmony_ci MT6357_LDO_VCAMD_CON0, MT6357_VCAMD_ANA_CON0, 0xf00), 36062306a36Sopenharmony_ci MT6357_LDO("ldo-vcn33-bt", VCN33_BT, vcn33_voltages, 36162306a36Sopenharmony_ci MT6357_LDO_VCN33_CON0_0, MT6357_VCN33_ANA_CON0, 0x300), 36262306a36Sopenharmony_ci MT6357_LDO("ldo-vcn33-wifi", VCN33_WIFI, vcn33_voltages, 36362306a36Sopenharmony_ci MT6357_LDO_VCN33_CON0_1, MT6357_VCN33_ANA_CON0, 0x300), 36462306a36Sopenharmony_ci MT6357_LDO("ldo-vdram", VDRAM, vdram_voltages, 36562306a36Sopenharmony_ci MT6357_LDO_VDRAM_CON0, MT6357_VDRAM_ELR_2, 0x300), 36662306a36Sopenharmony_ci MT6357_LDO("ldo-vefuse", VEFUSE, vefuse_voltages, 36762306a36Sopenharmony_ci MT6357_LDO_VEFUSE_CON0, MT6357_VEFUSE_ANA_CON0, 0xf00), 36862306a36Sopenharmony_ci MT6357_LDO("ldo-vemc", VEMC, vemc_voltages, 36962306a36Sopenharmony_ci MT6357_LDO_VEMC_CON0, MT6357_VEMC_ANA_CON0, 0x700), 37062306a36Sopenharmony_ci MT6357_LDO("ldo-vibr", VIBR, vibr_voltages, 37162306a36Sopenharmony_ci MT6357_LDO_VIBR_CON0, MT6357_VIBR_ANA_CON0, 0xf00), 37262306a36Sopenharmony_ci MT6357_LDO("ldo-vldo28", VLDO28, vldo28_voltages, 37362306a36Sopenharmony_ci MT6357_LDO_VLDO28_CON0_0, MT6357_VLDO28_ANA_CON0, 0x300), 37462306a36Sopenharmony_ci MT6357_LDO("ldo-vmc", VMC, vmc_voltages, 37562306a36Sopenharmony_ci MT6357_LDO_VMC_CON0, MT6357_VMC_ANA_CON0, 0xf00), 37662306a36Sopenharmony_ci MT6357_LDO("ldo-vmch", VMCH, vmch_voltages, 37762306a36Sopenharmony_ci MT6357_LDO_VMCH_CON0, MT6357_VMCH_ANA_CON0, 0x700), 37862306a36Sopenharmony_ci MT6357_LDO("ldo-vsim1", VSIM1, vsim_voltages, 37962306a36Sopenharmony_ci MT6357_LDO_VSIM1_CON0, MT6357_VSIM1_ANA_CON0, 0xf00), 38062306a36Sopenharmony_ci MT6357_LDO("ldo-vsim2", VSIM2, vsim_voltages, 38162306a36Sopenharmony_ci MT6357_LDO_VSIM2_CON0, MT6357_VSIM2_ANA_CON0, 0xf00), 38262306a36Sopenharmony_ci MT6357_LDO("ldo-vusb33", VUSB33, vusb_voltages, 38362306a36Sopenharmony_ci MT6357_LDO_VUSB33_CON0_0, MT6357_VUSB33_ANA_CON0, 0x700), 38462306a36Sopenharmony_ci MT6357_LDO("ldo-vxo22", VXO22, vxo22_voltages, 38562306a36Sopenharmony_ci MT6357_LDO_VXO22_CON0, MT6357_VXO22_ANA_CON0, 0x300), 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_ci MT6357_LDO1("ldo-vsram-proc", VSRAM_PROC, 518750, 1312500, 6250, 38862306a36Sopenharmony_ci buck_volt_range1, MT6357_LDO_VSRAM_PROC_CON0, 38962306a36Sopenharmony_ci MT6357_LDO_VSRAM_CON0, 0x7f00), 39062306a36Sopenharmony_ci MT6357_LDO1("ldo-vsram-others", VSRAM_OTHERS, 518750, 1312500, 6250, 39162306a36Sopenharmony_ci buck_volt_range1, MT6357_LDO_VSRAM_OTHERS_CON0, 39262306a36Sopenharmony_ci MT6357_LDO_VSRAM_CON1, 0x7f00), 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci MT6357_REG_FIXED("ldo-vaud28", VAUD28, 2800000), 39562306a36Sopenharmony_ci MT6357_REG_FIXED("ldo-vaux18", VAUX18, 1800000), 39662306a36Sopenharmony_ci MT6357_REG_FIXED("ldo-vcamio18", VCAMIO, 1800000), 39762306a36Sopenharmony_ci MT6357_REG_FIXED("ldo-vcn18", VCN18, 1800000), 39862306a36Sopenharmony_ci MT6357_REG_FIXED("ldo-vcn28", VCN28, 2800000), 39962306a36Sopenharmony_ci MT6357_REG_FIXED("ldo-vfe28", VFE28, 2800000), 40062306a36Sopenharmony_ci MT6357_REG_FIXED("ldo-vio18", VIO18, 1800000), 40162306a36Sopenharmony_ci MT6357_REG_FIXED("ldo-vio28", VIO28, 2800000), 40262306a36Sopenharmony_ci MT6357_REG_FIXED("ldo-vrf12", VRF12, 1200000), 40362306a36Sopenharmony_ci MT6357_REG_FIXED("ldo-vrf18", VRF18, 1800000), 40462306a36Sopenharmony_ci}; 40562306a36Sopenharmony_ci 40662306a36Sopenharmony_cistatic int mt6357_regulator_probe(struct platform_device *pdev) 40762306a36Sopenharmony_ci{ 40862306a36Sopenharmony_ci struct mt6397_chip *mt6357 = dev_get_drvdata(pdev->dev.parent); 40962306a36Sopenharmony_ci struct regulator_config config = {}; 41062306a36Sopenharmony_ci struct regulator_dev *rdev; 41162306a36Sopenharmony_ci int i; 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_ci pdev->dev.of_node = pdev->dev.parent->of_node; 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ci for (i = 0; i < MT6357_MAX_REGULATOR; i++) { 41662306a36Sopenharmony_ci config.dev = &pdev->dev; 41762306a36Sopenharmony_ci config.driver_data = &mt6357_regulators[i]; 41862306a36Sopenharmony_ci config.regmap = mt6357->regmap; 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_ci rdev = devm_regulator_register(&pdev->dev, 42162306a36Sopenharmony_ci &mt6357_regulators[i].desc, 42262306a36Sopenharmony_ci &config); 42362306a36Sopenharmony_ci if (IS_ERR(rdev)) { 42462306a36Sopenharmony_ci dev_err(&pdev->dev, "failed to register %s\n", 42562306a36Sopenharmony_ci mt6357_regulators[i].desc.name); 42662306a36Sopenharmony_ci return PTR_ERR(rdev); 42762306a36Sopenharmony_ci } 42862306a36Sopenharmony_ci } 42962306a36Sopenharmony_ci 43062306a36Sopenharmony_ci return 0; 43162306a36Sopenharmony_ci} 43262306a36Sopenharmony_ci 43362306a36Sopenharmony_cistatic const struct platform_device_id mt6357_platform_ids[] = { 43462306a36Sopenharmony_ci { "mt6357-regulator" }, 43562306a36Sopenharmony_ci { /* sentinel */ }, 43662306a36Sopenharmony_ci}; 43762306a36Sopenharmony_ciMODULE_DEVICE_TABLE(platform, mt6357_platform_ids); 43862306a36Sopenharmony_ci 43962306a36Sopenharmony_cistatic struct platform_driver mt6357_regulator_driver = { 44062306a36Sopenharmony_ci .driver = { 44162306a36Sopenharmony_ci .name = "mt6357-regulator", 44262306a36Sopenharmony_ci .probe_type = PROBE_PREFER_ASYNCHRONOUS, 44362306a36Sopenharmony_ci }, 44462306a36Sopenharmony_ci .probe = mt6357_regulator_probe, 44562306a36Sopenharmony_ci .id_table = mt6357_platform_ids, 44662306a36Sopenharmony_ci}; 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_cimodule_platform_driver(mt6357_regulator_driver); 44962306a36Sopenharmony_ci 45062306a36Sopenharmony_ciMODULE_AUTHOR("Chen Zhong <chen.zhong@mediatek.com>"); 45162306a36Sopenharmony_ciMODULE_AUTHOR("Fabien Parent <fabien.parent@linaro.org>"); 45262306a36Sopenharmony_ciMODULE_AUTHOR("Alexandre Mergnat <amergnat@baylibre.com>"); 45362306a36Sopenharmony_ciMODULE_DESCRIPTION("Regulator Driver for MediaTek MT6357 PMIC"); 45462306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 455