162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci// 362306a36Sopenharmony_ci// Copyright (c) 2021 MediaTek Inc. 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <linux/platform_device.h> 662306a36Sopenharmony_ci#include <linux/mfd/mt6359/registers.h> 762306a36Sopenharmony_ci#include <linux/mfd/mt6359p/registers.h> 862306a36Sopenharmony_ci#include <linux/mfd/mt6397/core.h> 962306a36Sopenharmony_ci#include <linux/module.h> 1062306a36Sopenharmony_ci#include <linux/of.h> 1162306a36Sopenharmony_ci#include <linux/regmap.h> 1262306a36Sopenharmony_ci#include <linux/regulator/driver.h> 1362306a36Sopenharmony_ci#include <linux/regulator/machine.h> 1462306a36Sopenharmony_ci#include <linux/regulator/mt6359-regulator.h> 1562306a36Sopenharmony_ci#include <linux/regulator/of_regulator.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define MT6359_BUCK_MODE_AUTO 0 1862306a36Sopenharmony_ci#define MT6359_BUCK_MODE_FORCE_PWM 1 1962306a36Sopenharmony_ci#define MT6359_BUCK_MODE_NORMAL 0 2062306a36Sopenharmony_ci#define MT6359_BUCK_MODE_LP 2 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/* 2362306a36Sopenharmony_ci * MT6359 regulators' information 2462306a36Sopenharmony_ci * 2562306a36Sopenharmony_ci * @desc: standard fields of regulator description. 2662306a36Sopenharmony_ci * @status_reg: for query status of regulators. 2762306a36Sopenharmony_ci * @qi: Mask for query enable signal status of regulators. 2862306a36Sopenharmony_ci * @modeset_reg: for operating AUTO/PWM mode register. 2962306a36Sopenharmony_ci * @modeset_mask: MASK for operating modeset register. 3062306a36Sopenharmony_ci */ 3162306a36Sopenharmony_cistruct mt6359_regulator_info { 3262306a36Sopenharmony_ci struct regulator_desc desc; 3362306a36Sopenharmony_ci u32 status_reg; 3462306a36Sopenharmony_ci u32 qi; 3562306a36Sopenharmony_ci u32 modeset_reg; 3662306a36Sopenharmony_ci u32 modeset_mask; 3762306a36Sopenharmony_ci u32 lp_mode_reg; 3862306a36Sopenharmony_ci u32 lp_mode_mask; 3962306a36Sopenharmony_ci}; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci#define MT6359_BUCK(match, _name, min, max, step, \ 4262306a36Sopenharmony_ci _enable_reg, _status_reg, \ 4362306a36Sopenharmony_ci _vsel_reg, _vsel_mask, \ 4462306a36Sopenharmony_ci _lp_mode_reg, _lp_mode_shift, \ 4562306a36Sopenharmony_ci _modeset_reg, _modeset_shift) \ 4662306a36Sopenharmony_ci[MT6359_ID_##_name] = { \ 4762306a36Sopenharmony_ci .desc = { \ 4862306a36Sopenharmony_ci .name = #_name, \ 4962306a36Sopenharmony_ci .of_match = of_match_ptr(match), \ 5062306a36Sopenharmony_ci .regulators_node = of_match_ptr("regulators"), \ 5162306a36Sopenharmony_ci .ops = &mt6359_volt_linear_ops, \ 5262306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, \ 5362306a36Sopenharmony_ci .id = MT6359_ID_##_name, \ 5462306a36Sopenharmony_ci .owner = THIS_MODULE, \ 5562306a36Sopenharmony_ci .uV_step = (step), \ 5662306a36Sopenharmony_ci .n_voltages = ((max) - (min)) / (step) + 1, \ 5762306a36Sopenharmony_ci .min_uV = (min), \ 5862306a36Sopenharmony_ci .vsel_reg = _vsel_reg, \ 5962306a36Sopenharmony_ci .vsel_mask = _vsel_mask, \ 6062306a36Sopenharmony_ci .enable_reg = _enable_reg, \ 6162306a36Sopenharmony_ci .enable_mask = BIT(0), \ 6262306a36Sopenharmony_ci .of_map_mode = mt6359_map_mode, \ 6362306a36Sopenharmony_ci }, \ 6462306a36Sopenharmony_ci .status_reg = _status_reg, \ 6562306a36Sopenharmony_ci .qi = BIT(0), \ 6662306a36Sopenharmony_ci .lp_mode_reg = _lp_mode_reg, \ 6762306a36Sopenharmony_ci .lp_mode_mask = BIT(_lp_mode_shift), \ 6862306a36Sopenharmony_ci .modeset_reg = _modeset_reg, \ 6962306a36Sopenharmony_ci .modeset_mask = BIT(_modeset_shift), \ 7062306a36Sopenharmony_ci} 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci#define MT6359_LDO_LINEAR(match, _name, min, max, step, \ 7362306a36Sopenharmony_ci _enable_reg, _status_reg, _vsel_reg, _vsel_mask) \ 7462306a36Sopenharmony_ci[MT6359_ID_##_name] = { \ 7562306a36Sopenharmony_ci .desc = { \ 7662306a36Sopenharmony_ci .name = #_name, \ 7762306a36Sopenharmony_ci .of_match = of_match_ptr(match), \ 7862306a36Sopenharmony_ci .regulators_node = of_match_ptr("regulators"), \ 7962306a36Sopenharmony_ci .ops = &mt6359_volt_linear_ops, \ 8062306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, \ 8162306a36Sopenharmony_ci .id = MT6359_ID_##_name, \ 8262306a36Sopenharmony_ci .owner = THIS_MODULE, \ 8362306a36Sopenharmony_ci .uV_step = (step), \ 8462306a36Sopenharmony_ci .n_voltages = ((max) - (min)) / (step) + 1, \ 8562306a36Sopenharmony_ci .min_uV = (min), \ 8662306a36Sopenharmony_ci .vsel_reg = _vsel_reg, \ 8762306a36Sopenharmony_ci .vsel_mask = _vsel_mask, \ 8862306a36Sopenharmony_ci .enable_reg = _enable_reg, \ 8962306a36Sopenharmony_ci .enable_mask = BIT(0), \ 9062306a36Sopenharmony_ci }, \ 9162306a36Sopenharmony_ci .status_reg = _status_reg, \ 9262306a36Sopenharmony_ci .qi = BIT(0), \ 9362306a36Sopenharmony_ci} 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci#define MT6359_LDO(match, _name, _volt_table, \ 9662306a36Sopenharmony_ci _enable_reg, _enable_mask, _status_reg, \ 9762306a36Sopenharmony_ci _vsel_reg, _vsel_mask, _en_delay) \ 9862306a36Sopenharmony_ci[MT6359_ID_##_name] = { \ 9962306a36Sopenharmony_ci .desc = { \ 10062306a36Sopenharmony_ci .name = #_name, \ 10162306a36Sopenharmony_ci .of_match = of_match_ptr(match), \ 10262306a36Sopenharmony_ci .regulators_node = of_match_ptr("regulators"), \ 10362306a36Sopenharmony_ci .ops = &mt6359_volt_table_ops, \ 10462306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, \ 10562306a36Sopenharmony_ci .id = MT6359_ID_##_name, \ 10662306a36Sopenharmony_ci .owner = THIS_MODULE, \ 10762306a36Sopenharmony_ci .n_voltages = ARRAY_SIZE(_volt_table), \ 10862306a36Sopenharmony_ci .volt_table = _volt_table, \ 10962306a36Sopenharmony_ci .vsel_reg = _vsel_reg, \ 11062306a36Sopenharmony_ci .vsel_mask = _vsel_mask, \ 11162306a36Sopenharmony_ci .enable_reg = _enable_reg, \ 11262306a36Sopenharmony_ci .enable_mask = BIT(_enable_mask), \ 11362306a36Sopenharmony_ci .enable_time = _en_delay, \ 11462306a36Sopenharmony_ci }, \ 11562306a36Sopenharmony_ci .status_reg = _status_reg, \ 11662306a36Sopenharmony_ci .qi = BIT(0), \ 11762306a36Sopenharmony_ci} 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci#define MT6359_REG_FIXED(match, _name, _enable_reg, \ 12062306a36Sopenharmony_ci _status_reg, _fixed_volt) \ 12162306a36Sopenharmony_ci[MT6359_ID_##_name] = { \ 12262306a36Sopenharmony_ci .desc = { \ 12362306a36Sopenharmony_ci .name = #_name, \ 12462306a36Sopenharmony_ci .of_match = of_match_ptr(match), \ 12562306a36Sopenharmony_ci .regulators_node = of_match_ptr("regulators"), \ 12662306a36Sopenharmony_ci .ops = &mt6359_volt_fixed_ops, \ 12762306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, \ 12862306a36Sopenharmony_ci .id = MT6359_ID_##_name, \ 12962306a36Sopenharmony_ci .owner = THIS_MODULE, \ 13062306a36Sopenharmony_ci .n_voltages = 1, \ 13162306a36Sopenharmony_ci .enable_reg = _enable_reg, \ 13262306a36Sopenharmony_ci .enable_mask = BIT(0), \ 13362306a36Sopenharmony_ci .fixed_uV = (_fixed_volt), \ 13462306a36Sopenharmony_ci }, \ 13562306a36Sopenharmony_ci .status_reg = _status_reg, \ 13662306a36Sopenharmony_ci .qi = BIT(0), \ 13762306a36Sopenharmony_ci} 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci#define MT6359P_LDO1(match, _name, _ops, _volt_table, \ 14062306a36Sopenharmony_ci _enable_reg, _enable_mask, _status_reg, \ 14162306a36Sopenharmony_ci _vsel_reg, _vsel_mask) \ 14262306a36Sopenharmony_ci[MT6359_ID_##_name] = { \ 14362306a36Sopenharmony_ci .desc = { \ 14462306a36Sopenharmony_ci .name = #_name, \ 14562306a36Sopenharmony_ci .of_match = of_match_ptr(match), \ 14662306a36Sopenharmony_ci .regulators_node = of_match_ptr("regulators"), \ 14762306a36Sopenharmony_ci .ops = &_ops, \ 14862306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, \ 14962306a36Sopenharmony_ci .id = MT6359_ID_##_name, \ 15062306a36Sopenharmony_ci .owner = THIS_MODULE, \ 15162306a36Sopenharmony_ci .n_voltages = ARRAY_SIZE(_volt_table), \ 15262306a36Sopenharmony_ci .volt_table = _volt_table, \ 15362306a36Sopenharmony_ci .vsel_reg = _vsel_reg, \ 15462306a36Sopenharmony_ci .vsel_mask = _vsel_mask, \ 15562306a36Sopenharmony_ci .enable_reg = _enable_reg, \ 15662306a36Sopenharmony_ci .enable_mask = BIT(_enable_mask), \ 15762306a36Sopenharmony_ci }, \ 15862306a36Sopenharmony_ci .status_reg = _status_reg, \ 15962306a36Sopenharmony_ci .qi = BIT(0), \ 16062306a36Sopenharmony_ci} 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_cistatic const unsigned int vsim1_voltages[] = { 16362306a36Sopenharmony_ci 0, 0, 0, 1700000, 1800000, 0, 0, 0, 2700000, 0, 0, 3000000, 3100000, 16462306a36Sopenharmony_ci}; 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_cistatic const unsigned int vibr_voltages[] = { 16762306a36Sopenharmony_ci 1200000, 1300000, 1500000, 0, 1800000, 2000000, 0, 0, 2700000, 2800000, 16862306a36Sopenharmony_ci 0, 3000000, 0, 3300000, 16962306a36Sopenharmony_ci}; 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_cistatic const unsigned int vrf12_voltages[] = { 17262306a36Sopenharmony_ci 0, 0, 1100000, 1200000, 1300000, 17362306a36Sopenharmony_ci}; 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_cistatic const unsigned int volt18_voltages[] = { 17662306a36Sopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1700000, 1800000, 1900000, 17762306a36Sopenharmony_ci}; 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_cistatic const unsigned int vcn13_voltages[] = { 18062306a36Sopenharmony_ci 900000, 1000000, 0, 1200000, 1300000, 18162306a36Sopenharmony_ci}; 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_cistatic const unsigned int vcn33_voltages[] = { 18462306a36Sopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 2800000, 0, 0, 0, 3300000, 3400000, 3500000, 18562306a36Sopenharmony_ci}; 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_cistatic const unsigned int vefuse_voltages[] = { 18862306a36Sopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1700000, 1800000, 1900000, 2000000, 18962306a36Sopenharmony_ci}; 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_cistatic const unsigned int vxo22_voltages[] = { 19262306a36Sopenharmony_ci 1800000, 0, 0, 0, 2200000, 19362306a36Sopenharmony_ci}; 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_cistatic const unsigned int vrfck_voltages[] = { 19662306a36Sopenharmony_ci 0, 0, 1500000, 0, 0, 0, 0, 1600000, 0, 0, 0, 0, 1700000, 19762306a36Sopenharmony_ci}; 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_cistatic const unsigned int vrfck_voltages_1[] = { 20062306a36Sopenharmony_ci 1240000, 1600000, 20162306a36Sopenharmony_ci}; 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_cistatic const unsigned int vio28_voltages[] = { 20462306a36Sopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 2800000, 2900000, 3000000, 3100000, 3300000, 20562306a36Sopenharmony_ci}; 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_cistatic const unsigned int vemc_voltages[] = { 20862306a36Sopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2900000, 3000000, 0, 3300000, 20962306a36Sopenharmony_ci}; 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_cistatic const unsigned int vemc_voltages_1[] = { 21262306a36Sopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 2500000, 2800000, 2900000, 3000000, 3100000, 21362306a36Sopenharmony_ci 3300000, 21462306a36Sopenharmony_ci}; 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_cistatic const unsigned int va12_voltages[] = { 21762306a36Sopenharmony_ci 0, 0, 0, 0, 0, 0, 1200000, 1300000, 21862306a36Sopenharmony_ci}; 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_cistatic const unsigned int va09_voltages[] = { 22162306a36Sopenharmony_ci 0, 0, 800000, 900000, 0, 0, 1200000, 22262306a36Sopenharmony_ci}; 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_cistatic const unsigned int vrf18_voltages[] = { 22562306a36Sopenharmony_ci 0, 0, 0, 0, 0, 1700000, 1800000, 1810000, 22662306a36Sopenharmony_ci}; 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_cistatic const unsigned int vbbck_voltages[] = { 22962306a36Sopenharmony_ci 0, 0, 0, 0, 1100000, 0, 0, 0, 1150000, 0, 0, 0, 1200000, 23062306a36Sopenharmony_ci}; 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_cistatic const unsigned int vsim2_voltages[] = { 23362306a36Sopenharmony_ci 0, 0, 0, 1700000, 1800000, 0, 0, 0, 2700000, 0, 0, 3000000, 3100000, 23462306a36Sopenharmony_ci}; 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_cistatic inline unsigned int mt6359_map_mode(unsigned int mode) 23762306a36Sopenharmony_ci{ 23862306a36Sopenharmony_ci switch (mode) { 23962306a36Sopenharmony_ci case MT6359_BUCK_MODE_NORMAL: 24062306a36Sopenharmony_ci return REGULATOR_MODE_NORMAL; 24162306a36Sopenharmony_ci case MT6359_BUCK_MODE_FORCE_PWM: 24262306a36Sopenharmony_ci return REGULATOR_MODE_FAST; 24362306a36Sopenharmony_ci case MT6359_BUCK_MODE_LP: 24462306a36Sopenharmony_ci return REGULATOR_MODE_IDLE; 24562306a36Sopenharmony_ci default: 24662306a36Sopenharmony_ci return REGULATOR_MODE_INVALID; 24762306a36Sopenharmony_ci } 24862306a36Sopenharmony_ci} 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_cistatic int mt6359_get_status(struct regulator_dev *rdev) 25162306a36Sopenharmony_ci{ 25262306a36Sopenharmony_ci int ret; 25362306a36Sopenharmony_ci u32 regval; 25462306a36Sopenharmony_ci struct mt6359_regulator_info *info = rdev_get_drvdata(rdev); 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_ci ret = regmap_read(rdev->regmap, info->status_reg, ®val); 25762306a36Sopenharmony_ci if (ret != 0) { 25862306a36Sopenharmony_ci dev_err(&rdev->dev, "Failed to get enable reg: %d\n", ret); 25962306a36Sopenharmony_ci return ret; 26062306a36Sopenharmony_ci } 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ci if (regval & info->qi) 26362306a36Sopenharmony_ci return REGULATOR_STATUS_ON; 26462306a36Sopenharmony_ci else 26562306a36Sopenharmony_ci return REGULATOR_STATUS_OFF; 26662306a36Sopenharmony_ci} 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_cistatic unsigned int mt6359_regulator_get_mode(struct regulator_dev *rdev) 26962306a36Sopenharmony_ci{ 27062306a36Sopenharmony_ci struct mt6359_regulator_info *info = rdev_get_drvdata(rdev); 27162306a36Sopenharmony_ci int ret, regval; 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci ret = regmap_read(rdev->regmap, info->modeset_reg, ®val); 27462306a36Sopenharmony_ci if (ret != 0) { 27562306a36Sopenharmony_ci dev_err(&rdev->dev, 27662306a36Sopenharmony_ci "Failed to get mt6359 buck mode: %d\n", ret); 27762306a36Sopenharmony_ci return ret; 27862306a36Sopenharmony_ci } 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ci regval &= info->modeset_mask; 28162306a36Sopenharmony_ci regval >>= ffs(info->modeset_mask) - 1; 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_ci if (regval == MT6359_BUCK_MODE_FORCE_PWM) 28462306a36Sopenharmony_ci return REGULATOR_MODE_FAST; 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci ret = regmap_read(rdev->regmap, info->lp_mode_reg, ®val); 28762306a36Sopenharmony_ci if (ret != 0) { 28862306a36Sopenharmony_ci dev_err(&rdev->dev, 28962306a36Sopenharmony_ci "Failed to get mt6359 buck lp mode: %d\n", ret); 29062306a36Sopenharmony_ci return ret; 29162306a36Sopenharmony_ci } 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ci if (regval & info->lp_mode_mask) 29462306a36Sopenharmony_ci return REGULATOR_MODE_IDLE; 29562306a36Sopenharmony_ci else 29662306a36Sopenharmony_ci return REGULATOR_MODE_NORMAL; 29762306a36Sopenharmony_ci} 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_cistatic int mt6359_regulator_set_mode(struct regulator_dev *rdev, 30062306a36Sopenharmony_ci unsigned int mode) 30162306a36Sopenharmony_ci{ 30262306a36Sopenharmony_ci struct mt6359_regulator_info *info = rdev_get_drvdata(rdev); 30362306a36Sopenharmony_ci int ret = 0, val; 30462306a36Sopenharmony_ci int curr_mode; 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_ci curr_mode = mt6359_regulator_get_mode(rdev); 30762306a36Sopenharmony_ci switch (mode) { 30862306a36Sopenharmony_ci case REGULATOR_MODE_FAST: 30962306a36Sopenharmony_ci val = MT6359_BUCK_MODE_FORCE_PWM; 31062306a36Sopenharmony_ci val <<= ffs(info->modeset_mask) - 1; 31162306a36Sopenharmony_ci ret = regmap_update_bits(rdev->regmap, 31262306a36Sopenharmony_ci info->modeset_reg, 31362306a36Sopenharmony_ci info->modeset_mask, 31462306a36Sopenharmony_ci val); 31562306a36Sopenharmony_ci break; 31662306a36Sopenharmony_ci case REGULATOR_MODE_NORMAL: 31762306a36Sopenharmony_ci if (curr_mode == REGULATOR_MODE_FAST) { 31862306a36Sopenharmony_ci val = MT6359_BUCK_MODE_AUTO; 31962306a36Sopenharmony_ci val <<= ffs(info->modeset_mask) - 1; 32062306a36Sopenharmony_ci ret = regmap_update_bits(rdev->regmap, 32162306a36Sopenharmony_ci info->modeset_reg, 32262306a36Sopenharmony_ci info->modeset_mask, 32362306a36Sopenharmony_ci val); 32462306a36Sopenharmony_ci } else if (curr_mode == REGULATOR_MODE_IDLE) { 32562306a36Sopenharmony_ci val = MT6359_BUCK_MODE_NORMAL; 32662306a36Sopenharmony_ci val <<= ffs(info->lp_mode_mask) - 1; 32762306a36Sopenharmony_ci ret = regmap_update_bits(rdev->regmap, 32862306a36Sopenharmony_ci info->lp_mode_reg, 32962306a36Sopenharmony_ci info->lp_mode_mask, 33062306a36Sopenharmony_ci val); 33162306a36Sopenharmony_ci udelay(100); 33262306a36Sopenharmony_ci } 33362306a36Sopenharmony_ci break; 33462306a36Sopenharmony_ci case REGULATOR_MODE_IDLE: 33562306a36Sopenharmony_ci val = MT6359_BUCK_MODE_LP >> 1; 33662306a36Sopenharmony_ci val <<= ffs(info->lp_mode_mask) - 1; 33762306a36Sopenharmony_ci ret = regmap_update_bits(rdev->regmap, 33862306a36Sopenharmony_ci info->lp_mode_reg, 33962306a36Sopenharmony_ci info->lp_mode_mask, 34062306a36Sopenharmony_ci val); 34162306a36Sopenharmony_ci break; 34262306a36Sopenharmony_ci default: 34362306a36Sopenharmony_ci return -EINVAL; 34462306a36Sopenharmony_ci } 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_ci if (ret != 0) { 34762306a36Sopenharmony_ci dev_err(&rdev->dev, 34862306a36Sopenharmony_ci "Failed to set mt6359 buck mode: %d\n", ret); 34962306a36Sopenharmony_ci } 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_ci return ret; 35262306a36Sopenharmony_ci} 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_cistatic int mt6359p_vemc_set_voltage_sel(struct regulator_dev *rdev, 35562306a36Sopenharmony_ci u32 sel) 35662306a36Sopenharmony_ci{ 35762306a36Sopenharmony_ci struct mt6359_regulator_info *info = rdev_get_drvdata(rdev); 35862306a36Sopenharmony_ci int ret; 35962306a36Sopenharmony_ci u32 val = 0; 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_ci sel <<= ffs(info->desc.vsel_mask) - 1; 36262306a36Sopenharmony_ci ret = regmap_write(rdev->regmap, MT6359P_TMA_KEY_ADDR, TMA_KEY); 36362306a36Sopenharmony_ci if (ret) 36462306a36Sopenharmony_ci return ret; 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_ci ret = regmap_read(rdev->regmap, MT6359P_VM_MODE_ADDR, &val); 36762306a36Sopenharmony_ci if (ret) 36862306a36Sopenharmony_ci return ret; 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_ci switch (val) { 37162306a36Sopenharmony_ci case 0: 37262306a36Sopenharmony_ci /* If HW trapping is 0, use VEMC_VOSEL_0 */ 37362306a36Sopenharmony_ci ret = regmap_update_bits(rdev->regmap, 37462306a36Sopenharmony_ci info->desc.vsel_reg, 37562306a36Sopenharmony_ci info->desc.vsel_mask, sel); 37662306a36Sopenharmony_ci break; 37762306a36Sopenharmony_ci case 1: 37862306a36Sopenharmony_ci /* If HW trapping is 1, use VEMC_VOSEL_1 */ 37962306a36Sopenharmony_ci ret = regmap_update_bits(rdev->regmap, 38062306a36Sopenharmony_ci info->desc.vsel_reg + 0x2, 38162306a36Sopenharmony_ci info->desc.vsel_mask, sel); 38262306a36Sopenharmony_ci break; 38362306a36Sopenharmony_ci default: 38462306a36Sopenharmony_ci return -EINVAL; 38562306a36Sopenharmony_ci } 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_ci if (ret) 38862306a36Sopenharmony_ci return ret; 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_ci ret = regmap_write(rdev->regmap, MT6359P_TMA_KEY_ADDR, 0); 39162306a36Sopenharmony_ci return ret; 39262306a36Sopenharmony_ci} 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_cistatic int mt6359p_vemc_get_voltage_sel(struct regulator_dev *rdev) 39562306a36Sopenharmony_ci{ 39662306a36Sopenharmony_ci struct mt6359_regulator_info *info = rdev_get_drvdata(rdev); 39762306a36Sopenharmony_ci int ret; 39862306a36Sopenharmony_ci u32 val = 0; 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_ci ret = regmap_read(rdev->regmap, MT6359P_VM_MODE_ADDR, &val); 40162306a36Sopenharmony_ci if (ret) 40262306a36Sopenharmony_ci return ret; 40362306a36Sopenharmony_ci switch (val) { 40462306a36Sopenharmony_ci case 0: 40562306a36Sopenharmony_ci /* If HW trapping is 0, use VEMC_VOSEL_0 */ 40662306a36Sopenharmony_ci ret = regmap_read(rdev->regmap, 40762306a36Sopenharmony_ci info->desc.vsel_reg, &val); 40862306a36Sopenharmony_ci break; 40962306a36Sopenharmony_ci case 1: 41062306a36Sopenharmony_ci /* If HW trapping is 1, use VEMC_VOSEL_1 */ 41162306a36Sopenharmony_ci ret = regmap_read(rdev->regmap, 41262306a36Sopenharmony_ci info->desc.vsel_reg + 0x2, &val); 41362306a36Sopenharmony_ci break; 41462306a36Sopenharmony_ci default: 41562306a36Sopenharmony_ci return -EINVAL; 41662306a36Sopenharmony_ci } 41762306a36Sopenharmony_ci if (ret) 41862306a36Sopenharmony_ci return ret; 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_ci val &= info->desc.vsel_mask; 42162306a36Sopenharmony_ci val >>= ffs(info->desc.vsel_mask) - 1; 42262306a36Sopenharmony_ci 42362306a36Sopenharmony_ci return val; 42462306a36Sopenharmony_ci} 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_cistatic const struct regulator_ops mt6359_volt_linear_ops = { 42762306a36Sopenharmony_ci .list_voltage = regulator_list_voltage_linear, 42862306a36Sopenharmony_ci .map_voltage = regulator_map_voltage_linear, 42962306a36Sopenharmony_ci .set_voltage_sel = regulator_set_voltage_sel_regmap, 43062306a36Sopenharmony_ci .get_voltage_sel = regulator_get_voltage_sel_regmap, 43162306a36Sopenharmony_ci .set_voltage_time_sel = regulator_set_voltage_time_sel, 43262306a36Sopenharmony_ci .enable = regulator_enable_regmap, 43362306a36Sopenharmony_ci .disable = regulator_disable_regmap, 43462306a36Sopenharmony_ci .is_enabled = regulator_is_enabled_regmap, 43562306a36Sopenharmony_ci .get_status = mt6359_get_status, 43662306a36Sopenharmony_ci .set_mode = mt6359_regulator_set_mode, 43762306a36Sopenharmony_ci .get_mode = mt6359_regulator_get_mode, 43862306a36Sopenharmony_ci}; 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_cistatic const struct regulator_ops mt6359_volt_table_ops = { 44162306a36Sopenharmony_ci .list_voltage = regulator_list_voltage_table, 44262306a36Sopenharmony_ci .map_voltage = regulator_map_voltage_iterate, 44362306a36Sopenharmony_ci .set_voltage_sel = regulator_set_voltage_sel_regmap, 44462306a36Sopenharmony_ci .get_voltage_sel = regulator_get_voltage_sel_regmap, 44562306a36Sopenharmony_ci .set_voltage_time_sel = regulator_set_voltage_time_sel, 44662306a36Sopenharmony_ci .enable = regulator_enable_regmap, 44762306a36Sopenharmony_ci .disable = regulator_disable_regmap, 44862306a36Sopenharmony_ci .is_enabled = regulator_is_enabled_regmap, 44962306a36Sopenharmony_ci .get_status = mt6359_get_status, 45062306a36Sopenharmony_ci}; 45162306a36Sopenharmony_ci 45262306a36Sopenharmony_cistatic const struct regulator_ops mt6359_volt_fixed_ops = { 45362306a36Sopenharmony_ci .enable = regulator_enable_regmap, 45462306a36Sopenharmony_ci .disable = regulator_disable_regmap, 45562306a36Sopenharmony_ci .is_enabled = regulator_is_enabled_regmap, 45662306a36Sopenharmony_ci .get_status = mt6359_get_status, 45762306a36Sopenharmony_ci}; 45862306a36Sopenharmony_ci 45962306a36Sopenharmony_cistatic const struct regulator_ops mt6359p_vemc_ops = { 46062306a36Sopenharmony_ci .list_voltage = regulator_list_voltage_table, 46162306a36Sopenharmony_ci .map_voltage = regulator_map_voltage_iterate, 46262306a36Sopenharmony_ci .set_voltage_sel = mt6359p_vemc_set_voltage_sel, 46362306a36Sopenharmony_ci .get_voltage_sel = mt6359p_vemc_get_voltage_sel, 46462306a36Sopenharmony_ci .set_voltage_time_sel = regulator_set_voltage_time_sel, 46562306a36Sopenharmony_ci .enable = regulator_enable_regmap, 46662306a36Sopenharmony_ci .disable = regulator_disable_regmap, 46762306a36Sopenharmony_ci .is_enabled = regulator_is_enabled_regmap, 46862306a36Sopenharmony_ci .get_status = mt6359_get_status, 46962306a36Sopenharmony_ci}; 47062306a36Sopenharmony_ci 47162306a36Sopenharmony_ci/* The array is indexed by id(MT6359_ID_XXX) */ 47262306a36Sopenharmony_cistatic struct mt6359_regulator_info mt6359_regulators[] = { 47362306a36Sopenharmony_ci MT6359_BUCK("buck_vs1", VS1, 800000, 2200000, 12500, 47462306a36Sopenharmony_ci MT6359_RG_BUCK_VS1_EN_ADDR, 47562306a36Sopenharmony_ci MT6359_DA_VS1_EN_ADDR, MT6359_RG_BUCK_VS1_VOSEL_ADDR, 47662306a36Sopenharmony_ci MT6359_RG_BUCK_VS1_VOSEL_MASK << 47762306a36Sopenharmony_ci MT6359_RG_BUCK_VS1_VOSEL_SHIFT, 47862306a36Sopenharmony_ci MT6359_RG_BUCK_VS1_LP_ADDR, MT6359_RG_BUCK_VS1_LP_SHIFT, 47962306a36Sopenharmony_ci MT6359_RG_VS1_FPWM_ADDR, MT6359_RG_VS1_FPWM_SHIFT), 48062306a36Sopenharmony_ci MT6359_BUCK("buck_vgpu11", VGPU11, 400000, 1193750, 6250, 48162306a36Sopenharmony_ci MT6359_RG_BUCK_VGPU11_EN_ADDR, 48262306a36Sopenharmony_ci MT6359_DA_VGPU11_EN_ADDR, MT6359_RG_BUCK_VGPU11_VOSEL_ADDR, 48362306a36Sopenharmony_ci MT6359_RG_BUCK_VGPU11_VOSEL_MASK << 48462306a36Sopenharmony_ci MT6359_RG_BUCK_VGPU11_VOSEL_SHIFT, 48562306a36Sopenharmony_ci MT6359_RG_BUCK_VGPU11_LP_ADDR, 48662306a36Sopenharmony_ci MT6359_RG_BUCK_VGPU11_LP_SHIFT, 48762306a36Sopenharmony_ci MT6359_RG_VGPU11_FCCM_ADDR, MT6359_RG_VGPU11_FCCM_SHIFT), 48862306a36Sopenharmony_ci MT6359_BUCK("buck_vmodem", VMODEM, 400000, 1100000, 6250, 48962306a36Sopenharmony_ci MT6359_RG_BUCK_VMODEM_EN_ADDR, 49062306a36Sopenharmony_ci MT6359_DA_VMODEM_EN_ADDR, MT6359_RG_BUCK_VMODEM_VOSEL_ADDR, 49162306a36Sopenharmony_ci MT6359_RG_BUCK_VMODEM_VOSEL_MASK << 49262306a36Sopenharmony_ci MT6359_RG_BUCK_VMODEM_VOSEL_SHIFT, 49362306a36Sopenharmony_ci MT6359_RG_BUCK_VMODEM_LP_ADDR, 49462306a36Sopenharmony_ci MT6359_RG_BUCK_VMODEM_LP_SHIFT, 49562306a36Sopenharmony_ci MT6359_RG_VMODEM_FCCM_ADDR, MT6359_RG_VMODEM_FCCM_SHIFT), 49662306a36Sopenharmony_ci MT6359_BUCK("buck_vpu", VPU, 400000, 1193750, 6250, 49762306a36Sopenharmony_ci MT6359_RG_BUCK_VPU_EN_ADDR, 49862306a36Sopenharmony_ci MT6359_DA_VPU_EN_ADDR, MT6359_RG_BUCK_VPU_VOSEL_ADDR, 49962306a36Sopenharmony_ci MT6359_RG_BUCK_VPU_VOSEL_MASK << 50062306a36Sopenharmony_ci MT6359_RG_BUCK_VPU_VOSEL_SHIFT, 50162306a36Sopenharmony_ci MT6359_RG_BUCK_VPU_LP_ADDR, MT6359_RG_BUCK_VPU_LP_SHIFT, 50262306a36Sopenharmony_ci MT6359_RG_VPU_FCCM_ADDR, MT6359_RG_VPU_FCCM_SHIFT), 50362306a36Sopenharmony_ci MT6359_BUCK("buck_vcore", VCORE, 400000, 1193750, 6250, 50462306a36Sopenharmony_ci MT6359_RG_BUCK_VCORE_EN_ADDR, 50562306a36Sopenharmony_ci MT6359_DA_VCORE_EN_ADDR, MT6359_RG_BUCK_VCORE_VOSEL_ADDR, 50662306a36Sopenharmony_ci MT6359_RG_BUCK_VCORE_VOSEL_MASK << 50762306a36Sopenharmony_ci MT6359_RG_BUCK_VCORE_VOSEL_SHIFT, 50862306a36Sopenharmony_ci MT6359_RG_BUCK_VCORE_LP_ADDR, MT6359_RG_BUCK_VCORE_LP_SHIFT, 50962306a36Sopenharmony_ci MT6359_RG_VCORE_FCCM_ADDR, MT6359_RG_VCORE_FCCM_SHIFT), 51062306a36Sopenharmony_ci MT6359_BUCK("buck_vs2", VS2, 800000, 1600000, 12500, 51162306a36Sopenharmony_ci MT6359_RG_BUCK_VS2_EN_ADDR, 51262306a36Sopenharmony_ci MT6359_DA_VS2_EN_ADDR, MT6359_RG_BUCK_VS2_VOSEL_ADDR, 51362306a36Sopenharmony_ci MT6359_RG_BUCK_VS2_VOSEL_MASK << 51462306a36Sopenharmony_ci MT6359_RG_BUCK_VS2_VOSEL_SHIFT, 51562306a36Sopenharmony_ci MT6359_RG_BUCK_VS2_LP_ADDR, MT6359_RG_BUCK_VS2_LP_SHIFT, 51662306a36Sopenharmony_ci MT6359_RG_VS2_FPWM_ADDR, MT6359_RG_VS2_FPWM_SHIFT), 51762306a36Sopenharmony_ci MT6359_BUCK("buck_vpa", VPA, 500000, 3650000, 50000, 51862306a36Sopenharmony_ci MT6359_RG_BUCK_VPA_EN_ADDR, 51962306a36Sopenharmony_ci MT6359_DA_VPA_EN_ADDR, MT6359_RG_BUCK_VPA_VOSEL_ADDR, 52062306a36Sopenharmony_ci MT6359_RG_BUCK_VPA_VOSEL_MASK << 52162306a36Sopenharmony_ci MT6359_RG_BUCK_VPA_VOSEL_SHIFT, 52262306a36Sopenharmony_ci MT6359_RG_BUCK_VPA_LP_ADDR, MT6359_RG_BUCK_VPA_LP_SHIFT, 52362306a36Sopenharmony_ci MT6359_RG_VPA_MODESET_ADDR, MT6359_RG_VPA_MODESET_SHIFT), 52462306a36Sopenharmony_ci MT6359_BUCK("buck_vproc2", VPROC2, 400000, 1193750, 6250, 52562306a36Sopenharmony_ci MT6359_RG_BUCK_VPROC2_EN_ADDR, 52662306a36Sopenharmony_ci MT6359_DA_VPROC2_EN_ADDR, MT6359_RG_BUCK_VPROC2_VOSEL_ADDR, 52762306a36Sopenharmony_ci MT6359_RG_BUCK_VPROC2_VOSEL_MASK << 52862306a36Sopenharmony_ci MT6359_RG_BUCK_VPROC2_VOSEL_SHIFT, 52962306a36Sopenharmony_ci MT6359_RG_BUCK_VPROC2_LP_ADDR, 53062306a36Sopenharmony_ci MT6359_RG_BUCK_VPROC2_LP_SHIFT, 53162306a36Sopenharmony_ci MT6359_RG_VPROC2_FCCM_ADDR, MT6359_RG_VPROC2_FCCM_SHIFT), 53262306a36Sopenharmony_ci MT6359_BUCK("buck_vproc1", VPROC1, 400000, 1193750, 6250, 53362306a36Sopenharmony_ci MT6359_RG_BUCK_VPROC1_EN_ADDR, 53462306a36Sopenharmony_ci MT6359_DA_VPROC1_EN_ADDR, MT6359_RG_BUCK_VPROC1_VOSEL_ADDR, 53562306a36Sopenharmony_ci MT6359_RG_BUCK_VPROC1_VOSEL_MASK << 53662306a36Sopenharmony_ci MT6359_RG_BUCK_VPROC1_VOSEL_SHIFT, 53762306a36Sopenharmony_ci MT6359_RG_BUCK_VPROC1_LP_ADDR, 53862306a36Sopenharmony_ci MT6359_RG_BUCK_VPROC1_LP_SHIFT, 53962306a36Sopenharmony_ci MT6359_RG_VPROC1_FCCM_ADDR, MT6359_RG_VPROC1_FCCM_SHIFT), 54062306a36Sopenharmony_ci MT6359_BUCK("buck_vcore_sshub", VCORE_SSHUB, 400000, 1193750, 6250, 54162306a36Sopenharmony_ci MT6359_RG_BUCK_VCORE_SSHUB_EN_ADDR, 54262306a36Sopenharmony_ci MT6359_DA_VCORE_EN_ADDR, 54362306a36Sopenharmony_ci MT6359_RG_BUCK_VCORE_SSHUB_VOSEL_ADDR, 54462306a36Sopenharmony_ci MT6359_RG_BUCK_VCORE_SSHUB_VOSEL_MASK << 54562306a36Sopenharmony_ci MT6359_RG_BUCK_VCORE_SSHUB_VOSEL_SHIFT, 54662306a36Sopenharmony_ci MT6359_RG_BUCK_VCORE_LP_ADDR, MT6359_RG_BUCK_VCORE_LP_SHIFT, 54762306a36Sopenharmony_ci MT6359_RG_VCORE_FCCM_ADDR, MT6359_RG_VCORE_FCCM_SHIFT), 54862306a36Sopenharmony_ci MT6359_REG_FIXED("ldo_vaud18", VAUD18, MT6359_RG_LDO_VAUD18_EN_ADDR, 54962306a36Sopenharmony_ci MT6359_DA_VAUD18_B_EN_ADDR, 1800000), 55062306a36Sopenharmony_ci MT6359_LDO("ldo_vsim1", VSIM1, vsim1_voltages, 55162306a36Sopenharmony_ci MT6359_RG_LDO_VSIM1_EN_ADDR, MT6359_RG_LDO_VSIM1_EN_SHIFT, 55262306a36Sopenharmony_ci MT6359_DA_VSIM1_B_EN_ADDR, MT6359_RG_VSIM1_VOSEL_ADDR, 55362306a36Sopenharmony_ci MT6359_RG_VSIM1_VOSEL_MASK << MT6359_RG_VSIM1_VOSEL_SHIFT, 55462306a36Sopenharmony_ci 480), 55562306a36Sopenharmony_ci MT6359_LDO("ldo_vibr", VIBR, vibr_voltages, 55662306a36Sopenharmony_ci MT6359_RG_LDO_VIBR_EN_ADDR, MT6359_RG_LDO_VIBR_EN_SHIFT, 55762306a36Sopenharmony_ci MT6359_DA_VIBR_B_EN_ADDR, MT6359_RG_VIBR_VOSEL_ADDR, 55862306a36Sopenharmony_ci MT6359_RG_VIBR_VOSEL_MASK << MT6359_RG_VIBR_VOSEL_SHIFT, 55962306a36Sopenharmony_ci 240), 56062306a36Sopenharmony_ci MT6359_LDO("ldo_vrf12", VRF12, vrf12_voltages, 56162306a36Sopenharmony_ci MT6359_RG_LDO_VRF12_EN_ADDR, MT6359_RG_LDO_VRF12_EN_SHIFT, 56262306a36Sopenharmony_ci MT6359_DA_VRF12_B_EN_ADDR, MT6359_RG_VRF12_VOSEL_ADDR, 56362306a36Sopenharmony_ci MT6359_RG_VRF12_VOSEL_MASK << MT6359_RG_VRF12_VOSEL_SHIFT, 56462306a36Sopenharmony_ci 120), 56562306a36Sopenharmony_ci MT6359_REG_FIXED("ldo_vusb", VUSB, MT6359_RG_LDO_VUSB_EN_0_ADDR, 56662306a36Sopenharmony_ci MT6359_DA_VUSB_B_EN_ADDR, 3000000), 56762306a36Sopenharmony_ci MT6359_LDO_LINEAR("ldo_vsram_proc2", VSRAM_PROC2, 500000, 1293750, 6250, 56862306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_PROC2_EN_ADDR, 56962306a36Sopenharmony_ci MT6359_DA_VSRAM_PROC2_B_EN_ADDR, 57062306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_PROC2_VOSEL_ADDR, 57162306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_PROC2_VOSEL_MASK << 57262306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_PROC2_VOSEL_SHIFT), 57362306a36Sopenharmony_ci MT6359_LDO("ldo_vio18", VIO18, volt18_voltages, 57462306a36Sopenharmony_ci MT6359_RG_LDO_VIO18_EN_ADDR, MT6359_RG_LDO_VIO18_EN_SHIFT, 57562306a36Sopenharmony_ci MT6359_DA_VIO18_B_EN_ADDR, MT6359_RG_VIO18_VOSEL_ADDR, 57662306a36Sopenharmony_ci MT6359_RG_VIO18_VOSEL_MASK << MT6359_RG_VIO18_VOSEL_SHIFT, 57762306a36Sopenharmony_ci 960), 57862306a36Sopenharmony_ci MT6359_LDO("ldo_vcamio", VCAMIO, volt18_voltages, 57962306a36Sopenharmony_ci MT6359_RG_LDO_VCAMIO_EN_ADDR, MT6359_RG_LDO_VCAMIO_EN_SHIFT, 58062306a36Sopenharmony_ci MT6359_DA_VCAMIO_B_EN_ADDR, MT6359_RG_VCAMIO_VOSEL_ADDR, 58162306a36Sopenharmony_ci MT6359_RG_VCAMIO_VOSEL_MASK << MT6359_RG_VCAMIO_VOSEL_SHIFT, 58262306a36Sopenharmony_ci 1290), 58362306a36Sopenharmony_ci MT6359_REG_FIXED("ldo_vcn18", VCN18, MT6359_RG_LDO_VCN18_EN_ADDR, 58462306a36Sopenharmony_ci MT6359_DA_VCN18_B_EN_ADDR, 1800000), 58562306a36Sopenharmony_ci MT6359_REG_FIXED("ldo_vfe28", VFE28, MT6359_RG_LDO_VFE28_EN_ADDR, 58662306a36Sopenharmony_ci MT6359_DA_VFE28_B_EN_ADDR, 2800000), 58762306a36Sopenharmony_ci MT6359_LDO("ldo_vcn13", VCN13, vcn13_voltages, 58862306a36Sopenharmony_ci MT6359_RG_LDO_VCN13_EN_ADDR, MT6359_RG_LDO_VCN13_EN_SHIFT, 58962306a36Sopenharmony_ci MT6359_DA_VCN13_B_EN_ADDR, MT6359_RG_VCN13_VOSEL_ADDR, 59062306a36Sopenharmony_ci MT6359_RG_VCN13_VOSEL_MASK << MT6359_RG_VCN13_VOSEL_SHIFT, 59162306a36Sopenharmony_ci 240), 59262306a36Sopenharmony_ci MT6359_LDO("ldo_vcn33_1_bt", VCN33_1_BT, vcn33_voltages, 59362306a36Sopenharmony_ci MT6359_RG_LDO_VCN33_1_EN_0_ADDR, 59462306a36Sopenharmony_ci MT6359_RG_LDO_VCN33_1_EN_0_SHIFT, 59562306a36Sopenharmony_ci MT6359_DA_VCN33_1_B_EN_ADDR, MT6359_RG_VCN33_1_VOSEL_ADDR, 59662306a36Sopenharmony_ci MT6359_RG_VCN33_1_VOSEL_MASK << 59762306a36Sopenharmony_ci MT6359_RG_VCN33_1_VOSEL_SHIFT, 240), 59862306a36Sopenharmony_ci MT6359_LDO("ldo_vcn33_1_wifi", VCN33_1_WIFI, vcn33_voltages, 59962306a36Sopenharmony_ci MT6359_RG_LDO_VCN33_1_EN_1_ADDR, 60062306a36Sopenharmony_ci MT6359_RG_LDO_VCN33_1_EN_1_SHIFT, 60162306a36Sopenharmony_ci MT6359_DA_VCN33_1_B_EN_ADDR, MT6359_RG_VCN33_1_VOSEL_ADDR, 60262306a36Sopenharmony_ci MT6359_RG_VCN33_1_VOSEL_MASK << 60362306a36Sopenharmony_ci MT6359_RG_VCN33_1_VOSEL_SHIFT, 240), 60462306a36Sopenharmony_ci MT6359_REG_FIXED("ldo_vaux18", VAUX18, MT6359_RG_LDO_VAUX18_EN_ADDR, 60562306a36Sopenharmony_ci MT6359_DA_VAUX18_B_EN_ADDR, 1800000), 60662306a36Sopenharmony_ci MT6359_LDO_LINEAR("ldo_vsram_others", VSRAM_OTHERS, 500000, 1293750, 60762306a36Sopenharmony_ci 6250, 60862306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_OTHERS_EN_ADDR, 60962306a36Sopenharmony_ci MT6359_DA_VSRAM_OTHERS_B_EN_ADDR, 61062306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_OTHERS_VOSEL_ADDR, 61162306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_OTHERS_VOSEL_MASK << 61262306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_OTHERS_VOSEL_SHIFT), 61362306a36Sopenharmony_ci MT6359_LDO("ldo_vefuse", VEFUSE, vefuse_voltages, 61462306a36Sopenharmony_ci MT6359_RG_LDO_VEFUSE_EN_ADDR, MT6359_RG_LDO_VEFUSE_EN_SHIFT, 61562306a36Sopenharmony_ci MT6359_DA_VEFUSE_B_EN_ADDR, MT6359_RG_VEFUSE_VOSEL_ADDR, 61662306a36Sopenharmony_ci MT6359_RG_VEFUSE_VOSEL_MASK << MT6359_RG_VEFUSE_VOSEL_SHIFT, 61762306a36Sopenharmony_ci 240), 61862306a36Sopenharmony_ci MT6359_LDO("ldo_vxo22", VXO22, vxo22_voltages, 61962306a36Sopenharmony_ci MT6359_RG_LDO_VXO22_EN_ADDR, MT6359_RG_LDO_VXO22_EN_SHIFT, 62062306a36Sopenharmony_ci MT6359_DA_VXO22_B_EN_ADDR, MT6359_RG_VXO22_VOSEL_ADDR, 62162306a36Sopenharmony_ci MT6359_RG_VXO22_VOSEL_MASK << MT6359_RG_VXO22_VOSEL_SHIFT, 62262306a36Sopenharmony_ci 120), 62362306a36Sopenharmony_ci MT6359_LDO("ldo_vrfck", VRFCK, vrfck_voltages, 62462306a36Sopenharmony_ci MT6359_RG_LDO_VRFCK_EN_ADDR, MT6359_RG_LDO_VRFCK_EN_SHIFT, 62562306a36Sopenharmony_ci MT6359_DA_VRFCK_B_EN_ADDR, MT6359_RG_VRFCK_VOSEL_ADDR, 62662306a36Sopenharmony_ci MT6359_RG_VRFCK_VOSEL_MASK << MT6359_RG_VRFCK_VOSEL_SHIFT, 62762306a36Sopenharmony_ci 480), 62862306a36Sopenharmony_ci MT6359_REG_FIXED("ldo_vbif28", VBIF28, MT6359_RG_LDO_VBIF28_EN_ADDR, 62962306a36Sopenharmony_ci MT6359_DA_VBIF28_B_EN_ADDR, 2800000), 63062306a36Sopenharmony_ci MT6359_LDO("ldo_vio28", VIO28, vio28_voltages, 63162306a36Sopenharmony_ci MT6359_RG_LDO_VIO28_EN_ADDR, MT6359_RG_LDO_VIO28_EN_SHIFT, 63262306a36Sopenharmony_ci MT6359_DA_VIO28_B_EN_ADDR, MT6359_RG_VIO28_VOSEL_ADDR, 63362306a36Sopenharmony_ci MT6359_RG_VIO28_VOSEL_MASK << MT6359_RG_VIO28_VOSEL_SHIFT, 63462306a36Sopenharmony_ci 240), 63562306a36Sopenharmony_ci MT6359_LDO("ldo_vemc", VEMC, vemc_voltages, 63662306a36Sopenharmony_ci MT6359_RG_LDO_VEMC_EN_ADDR, MT6359_RG_LDO_VEMC_EN_SHIFT, 63762306a36Sopenharmony_ci MT6359_DA_VEMC_B_EN_ADDR, MT6359_RG_VEMC_VOSEL_ADDR, 63862306a36Sopenharmony_ci MT6359_RG_VEMC_VOSEL_MASK << MT6359_RG_VEMC_VOSEL_SHIFT, 63962306a36Sopenharmony_ci 240), 64062306a36Sopenharmony_ci MT6359_LDO("ldo_vcn33_2_bt", VCN33_2_BT, vcn33_voltages, 64162306a36Sopenharmony_ci MT6359_RG_LDO_VCN33_2_EN_0_ADDR, 64262306a36Sopenharmony_ci MT6359_RG_LDO_VCN33_2_EN_0_SHIFT, 64362306a36Sopenharmony_ci MT6359_DA_VCN33_2_B_EN_ADDR, MT6359_RG_VCN33_2_VOSEL_ADDR, 64462306a36Sopenharmony_ci MT6359_RG_VCN33_2_VOSEL_MASK << 64562306a36Sopenharmony_ci MT6359_RG_VCN33_2_VOSEL_SHIFT, 240), 64662306a36Sopenharmony_ci MT6359_LDO("ldo_vcn33_2_wifi", VCN33_2_WIFI, vcn33_voltages, 64762306a36Sopenharmony_ci MT6359_RG_LDO_VCN33_2_EN_1_ADDR, 64862306a36Sopenharmony_ci MT6359_RG_LDO_VCN33_2_EN_1_SHIFT, 64962306a36Sopenharmony_ci MT6359_DA_VCN33_2_B_EN_ADDR, MT6359_RG_VCN33_2_VOSEL_ADDR, 65062306a36Sopenharmony_ci MT6359_RG_VCN33_2_VOSEL_MASK << 65162306a36Sopenharmony_ci MT6359_RG_VCN33_2_VOSEL_SHIFT, 240), 65262306a36Sopenharmony_ci MT6359_LDO("ldo_va12", VA12, va12_voltages, 65362306a36Sopenharmony_ci MT6359_RG_LDO_VA12_EN_ADDR, MT6359_RG_LDO_VA12_EN_SHIFT, 65462306a36Sopenharmony_ci MT6359_DA_VA12_B_EN_ADDR, MT6359_RG_VA12_VOSEL_ADDR, 65562306a36Sopenharmony_ci MT6359_RG_VA12_VOSEL_MASK << MT6359_RG_VA12_VOSEL_SHIFT, 65662306a36Sopenharmony_ci 240), 65762306a36Sopenharmony_ci MT6359_LDO("ldo_va09", VA09, va09_voltages, 65862306a36Sopenharmony_ci MT6359_RG_LDO_VA09_EN_ADDR, MT6359_RG_LDO_VA09_EN_SHIFT, 65962306a36Sopenharmony_ci MT6359_DA_VA09_B_EN_ADDR, MT6359_RG_VA09_VOSEL_ADDR, 66062306a36Sopenharmony_ci MT6359_RG_VA09_VOSEL_MASK << MT6359_RG_VA09_VOSEL_SHIFT, 66162306a36Sopenharmony_ci 240), 66262306a36Sopenharmony_ci MT6359_LDO("ldo_vrf18", VRF18, vrf18_voltages, 66362306a36Sopenharmony_ci MT6359_RG_LDO_VRF18_EN_ADDR, MT6359_RG_LDO_VRF18_EN_SHIFT, 66462306a36Sopenharmony_ci MT6359_DA_VRF18_B_EN_ADDR, MT6359_RG_VRF18_VOSEL_ADDR, 66562306a36Sopenharmony_ci MT6359_RG_VRF18_VOSEL_MASK << MT6359_RG_VRF18_VOSEL_SHIFT, 66662306a36Sopenharmony_ci 120), 66762306a36Sopenharmony_ci MT6359_LDO_LINEAR("ldo_vsram_md", VSRAM_MD, 500000, 1100000, 6250, 66862306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_MD_EN_ADDR, 66962306a36Sopenharmony_ci MT6359_DA_VSRAM_MD_B_EN_ADDR, 67062306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_MD_VOSEL_ADDR, 67162306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_MD_VOSEL_MASK << 67262306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_MD_VOSEL_SHIFT), 67362306a36Sopenharmony_ci MT6359_LDO("ldo_vufs", VUFS, volt18_voltages, 67462306a36Sopenharmony_ci MT6359_RG_LDO_VUFS_EN_ADDR, MT6359_RG_LDO_VUFS_EN_SHIFT, 67562306a36Sopenharmony_ci MT6359_DA_VUFS_B_EN_ADDR, MT6359_RG_VUFS_VOSEL_ADDR, 67662306a36Sopenharmony_ci MT6359_RG_VUFS_VOSEL_MASK << MT6359_RG_VUFS_VOSEL_SHIFT, 67762306a36Sopenharmony_ci 1920), 67862306a36Sopenharmony_ci MT6359_LDO("ldo_vm18", VM18, volt18_voltages, 67962306a36Sopenharmony_ci MT6359_RG_LDO_VM18_EN_ADDR, MT6359_RG_LDO_VM18_EN_SHIFT, 68062306a36Sopenharmony_ci MT6359_DA_VM18_B_EN_ADDR, MT6359_RG_VM18_VOSEL_ADDR, 68162306a36Sopenharmony_ci MT6359_RG_VM18_VOSEL_MASK << MT6359_RG_VM18_VOSEL_SHIFT, 68262306a36Sopenharmony_ci 1920), 68362306a36Sopenharmony_ci MT6359_LDO("ldo_vbbck", VBBCK, vbbck_voltages, 68462306a36Sopenharmony_ci MT6359_RG_LDO_VBBCK_EN_ADDR, MT6359_RG_LDO_VBBCK_EN_SHIFT, 68562306a36Sopenharmony_ci MT6359_DA_VBBCK_B_EN_ADDR, MT6359_RG_VBBCK_VOSEL_ADDR, 68662306a36Sopenharmony_ci MT6359_RG_VBBCK_VOSEL_MASK << MT6359_RG_VBBCK_VOSEL_SHIFT, 68762306a36Sopenharmony_ci 240), 68862306a36Sopenharmony_ci MT6359_LDO_LINEAR("ldo_vsram_proc1", VSRAM_PROC1, 500000, 1293750, 6250, 68962306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_PROC1_EN_ADDR, 69062306a36Sopenharmony_ci MT6359_DA_VSRAM_PROC1_B_EN_ADDR, 69162306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_PROC1_VOSEL_ADDR, 69262306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_PROC1_VOSEL_MASK << 69362306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_PROC1_VOSEL_SHIFT), 69462306a36Sopenharmony_ci MT6359_LDO("ldo_vsim2", VSIM2, vsim2_voltages, 69562306a36Sopenharmony_ci MT6359_RG_LDO_VSIM2_EN_ADDR, MT6359_RG_LDO_VSIM2_EN_SHIFT, 69662306a36Sopenharmony_ci MT6359_DA_VSIM2_B_EN_ADDR, MT6359_RG_VSIM2_VOSEL_ADDR, 69762306a36Sopenharmony_ci MT6359_RG_VSIM2_VOSEL_MASK << MT6359_RG_VSIM2_VOSEL_SHIFT, 69862306a36Sopenharmony_ci 480), 69962306a36Sopenharmony_ci MT6359_LDO_LINEAR("ldo_vsram_others_sshub", VSRAM_OTHERS_SSHUB, 70062306a36Sopenharmony_ci 500000, 1293750, 6250, 70162306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_OTHERS_SSHUB_EN_ADDR, 70262306a36Sopenharmony_ci MT6359_DA_VSRAM_OTHERS_B_EN_ADDR, 70362306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_OTHERS_SSHUB_VOSEL_ADDR, 70462306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_OTHERS_SSHUB_VOSEL_MASK << 70562306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_OTHERS_SSHUB_VOSEL_SHIFT), 70662306a36Sopenharmony_ci}; 70762306a36Sopenharmony_ci 70862306a36Sopenharmony_cistatic struct mt6359_regulator_info mt6359p_regulators[] = { 70962306a36Sopenharmony_ci MT6359_BUCK("buck_vs1", VS1, 800000, 2200000, 12500, 71062306a36Sopenharmony_ci MT6359_RG_BUCK_VS1_EN_ADDR, 71162306a36Sopenharmony_ci MT6359_DA_VS1_EN_ADDR, MT6359_RG_BUCK_VS1_VOSEL_ADDR, 71262306a36Sopenharmony_ci MT6359_RG_BUCK_VS1_VOSEL_MASK << 71362306a36Sopenharmony_ci MT6359_RG_BUCK_VS1_VOSEL_SHIFT, 71462306a36Sopenharmony_ci MT6359_RG_BUCK_VS1_LP_ADDR, MT6359_RG_BUCK_VS1_LP_SHIFT, 71562306a36Sopenharmony_ci MT6359_RG_VS1_FPWM_ADDR, MT6359_RG_VS1_FPWM_SHIFT), 71662306a36Sopenharmony_ci MT6359_BUCK("buck_vgpu11", VGPU11, 400000, 1193750, 6250, 71762306a36Sopenharmony_ci MT6359_RG_BUCK_VGPU11_EN_ADDR, 71862306a36Sopenharmony_ci MT6359_DA_VGPU11_EN_ADDR, MT6359P_RG_BUCK_VGPU11_VOSEL_ADDR, 71962306a36Sopenharmony_ci MT6359_RG_BUCK_VGPU11_VOSEL_MASK << 72062306a36Sopenharmony_ci MT6359_RG_BUCK_VGPU11_VOSEL_SHIFT, 72162306a36Sopenharmony_ci MT6359_RG_BUCK_VGPU11_LP_ADDR, 72262306a36Sopenharmony_ci MT6359_RG_BUCK_VGPU11_LP_SHIFT, 72362306a36Sopenharmony_ci MT6359_RG_VGPU11_FCCM_ADDR, MT6359_RG_VGPU11_FCCM_SHIFT), 72462306a36Sopenharmony_ci MT6359_BUCK("buck_vmodem", VMODEM, 400000, 1100000, 6250, 72562306a36Sopenharmony_ci MT6359_RG_BUCK_VMODEM_EN_ADDR, 72662306a36Sopenharmony_ci MT6359_DA_VMODEM_EN_ADDR, MT6359_RG_BUCK_VMODEM_VOSEL_ADDR, 72762306a36Sopenharmony_ci MT6359_RG_BUCK_VMODEM_VOSEL_MASK << 72862306a36Sopenharmony_ci MT6359_RG_BUCK_VMODEM_VOSEL_SHIFT, 72962306a36Sopenharmony_ci MT6359_RG_BUCK_VMODEM_LP_ADDR, 73062306a36Sopenharmony_ci MT6359_RG_BUCK_VMODEM_LP_SHIFT, 73162306a36Sopenharmony_ci MT6359_RG_VMODEM_FCCM_ADDR, MT6359_RG_VMODEM_FCCM_SHIFT), 73262306a36Sopenharmony_ci MT6359_BUCK("buck_vpu", VPU, 400000, 1193750, 6250, 73362306a36Sopenharmony_ci MT6359_RG_BUCK_VPU_EN_ADDR, 73462306a36Sopenharmony_ci MT6359_DA_VPU_EN_ADDR, MT6359_RG_BUCK_VPU_VOSEL_ADDR, 73562306a36Sopenharmony_ci MT6359_RG_BUCK_VPU_VOSEL_MASK << 73662306a36Sopenharmony_ci MT6359_RG_BUCK_VPU_VOSEL_SHIFT, 73762306a36Sopenharmony_ci MT6359_RG_BUCK_VPU_LP_ADDR, MT6359_RG_BUCK_VPU_LP_SHIFT, 73862306a36Sopenharmony_ci MT6359_RG_VPU_FCCM_ADDR, MT6359_RG_VPU_FCCM_SHIFT), 73962306a36Sopenharmony_ci MT6359_BUCK("buck_vcore", VCORE, 506250, 1300000, 6250, 74062306a36Sopenharmony_ci MT6359_RG_BUCK_VCORE_EN_ADDR, 74162306a36Sopenharmony_ci MT6359_DA_VCORE_EN_ADDR, MT6359P_RG_BUCK_VCORE_VOSEL_ADDR, 74262306a36Sopenharmony_ci MT6359_RG_BUCK_VCORE_VOSEL_MASK << 74362306a36Sopenharmony_ci MT6359_RG_BUCK_VCORE_VOSEL_SHIFT, 74462306a36Sopenharmony_ci MT6359_RG_BUCK_VCORE_LP_ADDR, MT6359_RG_BUCK_VCORE_LP_SHIFT, 74562306a36Sopenharmony_ci MT6359_RG_VCORE_FCCM_ADDR, MT6359_RG_VCORE_FCCM_SHIFT), 74662306a36Sopenharmony_ci MT6359_BUCK("buck_vs2", VS2, 800000, 1600000, 12500, 74762306a36Sopenharmony_ci MT6359_RG_BUCK_VS2_EN_ADDR, 74862306a36Sopenharmony_ci MT6359_DA_VS2_EN_ADDR, MT6359_RG_BUCK_VS2_VOSEL_ADDR, 74962306a36Sopenharmony_ci MT6359_RG_BUCK_VS2_VOSEL_MASK << 75062306a36Sopenharmony_ci MT6359_RG_BUCK_VS2_VOSEL_SHIFT, 75162306a36Sopenharmony_ci MT6359_RG_BUCK_VS2_LP_ADDR, MT6359_RG_BUCK_VS2_LP_SHIFT, 75262306a36Sopenharmony_ci MT6359_RG_VS2_FPWM_ADDR, MT6359_RG_VS2_FPWM_SHIFT), 75362306a36Sopenharmony_ci MT6359_BUCK("buck_vpa", VPA, 500000, 3650000, 50000, 75462306a36Sopenharmony_ci MT6359_RG_BUCK_VPA_EN_ADDR, 75562306a36Sopenharmony_ci MT6359_DA_VPA_EN_ADDR, MT6359_RG_BUCK_VPA_VOSEL_ADDR, 75662306a36Sopenharmony_ci MT6359_RG_BUCK_VPA_VOSEL_MASK << 75762306a36Sopenharmony_ci MT6359_RG_BUCK_VPA_VOSEL_SHIFT, 75862306a36Sopenharmony_ci MT6359_RG_BUCK_VPA_LP_ADDR, MT6359_RG_BUCK_VPA_LP_SHIFT, 75962306a36Sopenharmony_ci MT6359_RG_VPA_MODESET_ADDR, MT6359_RG_VPA_MODESET_SHIFT), 76062306a36Sopenharmony_ci MT6359_BUCK("buck_vproc2", VPROC2, 400000, 1193750, 6250, 76162306a36Sopenharmony_ci MT6359_RG_BUCK_VPROC2_EN_ADDR, 76262306a36Sopenharmony_ci MT6359_DA_VPROC2_EN_ADDR, MT6359_RG_BUCK_VPROC2_VOSEL_ADDR, 76362306a36Sopenharmony_ci MT6359_RG_BUCK_VPROC2_VOSEL_MASK << 76462306a36Sopenharmony_ci MT6359_RG_BUCK_VPROC2_VOSEL_SHIFT, 76562306a36Sopenharmony_ci MT6359_RG_BUCK_VPROC2_LP_ADDR, 76662306a36Sopenharmony_ci MT6359_RG_BUCK_VPROC2_LP_SHIFT, 76762306a36Sopenharmony_ci MT6359_RG_VPROC2_FCCM_ADDR, MT6359_RG_VPROC2_FCCM_SHIFT), 76862306a36Sopenharmony_ci MT6359_BUCK("buck_vproc1", VPROC1, 400000, 1193750, 6250, 76962306a36Sopenharmony_ci MT6359_RG_BUCK_VPROC1_EN_ADDR, 77062306a36Sopenharmony_ci MT6359_DA_VPROC1_EN_ADDR, MT6359_RG_BUCK_VPROC1_VOSEL_ADDR, 77162306a36Sopenharmony_ci MT6359_RG_BUCK_VPROC1_VOSEL_MASK << 77262306a36Sopenharmony_ci MT6359_RG_BUCK_VPROC1_VOSEL_SHIFT, 77362306a36Sopenharmony_ci MT6359_RG_BUCK_VPROC1_LP_ADDR, 77462306a36Sopenharmony_ci MT6359_RG_BUCK_VPROC1_LP_SHIFT, 77562306a36Sopenharmony_ci MT6359_RG_VPROC1_FCCM_ADDR, MT6359_RG_VPROC1_FCCM_SHIFT), 77662306a36Sopenharmony_ci MT6359_BUCK("buck_vgpu11_sshub", VGPU11_SSHUB, 400000, 1193750, 6250, 77762306a36Sopenharmony_ci MT6359P_RG_BUCK_VGPU11_SSHUB_EN_ADDR, 77862306a36Sopenharmony_ci MT6359_DA_VGPU11_EN_ADDR, 77962306a36Sopenharmony_ci MT6359P_RG_BUCK_VGPU11_SSHUB_VOSEL_ADDR, 78062306a36Sopenharmony_ci MT6359P_RG_BUCK_VGPU11_SSHUB_VOSEL_MASK << 78162306a36Sopenharmony_ci MT6359P_RG_BUCK_VGPU11_SSHUB_VOSEL_SHIFT, 78262306a36Sopenharmony_ci MT6359_RG_BUCK_VGPU11_LP_ADDR, 78362306a36Sopenharmony_ci MT6359_RG_BUCK_VGPU11_LP_SHIFT, 78462306a36Sopenharmony_ci MT6359_RG_VGPU11_FCCM_ADDR, MT6359_RG_VGPU11_FCCM_SHIFT), 78562306a36Sopenharmony_ci MT6359_REG_FIXED("ldo_vaud18", VAUD18, MT6359P_RG_LDO_VAUD18_EN_ADDR, 78662306a36Sopenharmony_ci MT6359P_DA_VAUD18_B_EN_ADDR, 1800000), 78762306a36Sopenharmony_ci MT6359_LDO("ldo_vsim1", VSIM1, vsim1_voltages, 78862306a36Sopenharmony_ci MT6359P_RG_LDO_VSIM1_EN_ADDR, MT6359P_RG_LDO_VSIM1_EN_SHIFT, 78962306a36Sopenharmony_ci MT6359P_DA_VSIM1_B_EN_ADDR, MT6359P_RG_VSIM1_VOSEL_ADDR, 79062306a36Sopenharmony_ci MT6359_RG_VSIM1_VOSEL_MASK << MT6359_RG_VSIM1_VOSEL_SHIFT, 79162306a36Sopenharmony_ci 480), 79262306a36Sopenharmony_ci MT6359_LDO("ldo_vibr", VIBR, vibr_voltages, 79362306a36Sopenharmony_ci MT6359P_RG_LDO_VIBR_EN_ADDR, MT6359P_RG_LDO_VIBR_EN_SHIFT, 79462306a36Sopenharmony_ci MT6359P_DA_VIBR_B_EN_ADDR, MT6359P_RG_VIBR_VOSEL_ADDR, 79562306a36Sopenharmony_ci MT6359_RG_VIBR_VOSEL_MASK << MT6359_RG_VIBR_VOSEL_SHIFT, 79662306a36Sopenharmony_ci 240), 79762306a36Sopenharmony_ci MT6359_LDO("ldo_vrf12", VRF12, vrf12_voltages, 79862306a36Sopenharmony_ci MT6359P_RG_LDO_VRF12_EN_ADDR, MT6359P_RG_LDO_VRF12_EN_SHIFT, 79962306a36Sopenharmony_ci MT6359P_DA_VRF12_B_EN_ADDR, MT6359P_RG_VRF12_VOSEL_ADDR, 80062306a36Sopenharmony_ci MT6359_RG_VRF12_VOSEL_MASK << MT6359_RG_VRF12_VOSEL_SHIFT, 80162306a36Sopenharmony_ci 480), 80262306a36Sopenharmony_ci MT6359_REG_FIXED("ldo_vusb", VUSB, MT6359P_RG_LDO_VUSB_EN_0_ADDR, 80362306a36Sopenharmony_ci MT6359P_DA_VUSB_B_EN_ADDR, 3000000), 80462306a36Sopenharmony_ci MT6359_LDO_LINEAR("ldo_vsram_proc2", VSRAM_PROC2, 500000, 1293750, 6250, 80562306a36Sopenharmony_ci MT6359P_RG_LDO_VSRAM_PROC2_EN_ADDR, 80662306a36Sopenharmony_ci MT6359P_DA_VSRAM_PROC2_B_EN_ADDR, 80762306a36Sopenharmony_ci MT6359P_RG_LDO_VSRAM_PROC2_VOSEL_ADDR, 80862306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_PROC2_VOSEL_MASK << 80962306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_PROC2_VOSEL_SHIFT), 81062306a36Sopenharmony_ci MT6359_LDO("ldo_vio18", VIO18, volt18_voltages, 81162306a36Sopenharmony_ci MT6359P_RG_LDO_VIO18_EN_ADDR, MT6359P_RG_LDO_VIO18_EN_SHIFT, 81262306a36Sopenharmony_ci MT6359P_DA_VIO18_B_EN_ADDR, MT6359P_RG_VIO18_VOSEL_ADDR, 81362306a36Sopenharmony_ci MT6359_RG_VIO18_VOSEL_MASK << MT6359_RG_VIO18_VOSEL_SHIFT, 81462306a36Sopenharmony_ci 960), 81562306a36Sopenharmony_ci MT6359_LDO("ldo_vcamio", VCAMIO, volt18_voltages, 81662306a36Sopenharmony_ci MT6359P_RG_LDO_VCAMIO_EN_ADDR, 81762306a36Sopenharmony_ci MT6359P_RG_LDO_VCAMIO_EN_SHIFT, 81862306a36Sopenharmony_ci MT6359P_DA_VCAMIO_B_EN_ADDR, MT6359P_RG_VCAMIO_VOSEL_ADDR, 81962306a36Sopenharmony_ci MT6359_RG_VCAMIO_VOSEL_MASK << MT6359_RG_VCAMIO_VOSEL_SHIFT, 82062306a36Sopenharmony_ci 1290), 82162306a36Sopenharmony_ci MT6359_REG_FIXED("ldo_vcn18", VCN18, MT6359P_RG_LDO_VCN18_EN_ADDR, 82262306a36Sopenharmony_ci MT6359P_DA_VCN18_B_EN_ADDR, 1800000), 82362306a36Sopenharmony_ci MT6359_REG_FIXED("ldo_vfe28", VFE28, MT6359P_RG_LDO_VFE28_EN_ADDR, 82462306a36Sopenharmony_ci MT6359P_DA_VFE28_B_EN_ADDR, 2800000), 82562306a36Sopenharmony_ci MT6359_LDO("ldo_vcn13", VCN13, vcn13_voltages, 82662306a36Sopenharmony_ci MT6359P_RG_LDO_VCN13_EN_ADDR, MT6359P_RG_LDO_VCN13_EN_SHIFT, 82762306a36Sopenharmony_ci MT6359P_DA_VCN13_B_EN_ADDR, MT6359P_RG_VCN13_VOSEL_ADDR, 82862306a36Sopenharmony_ci MT6359_RG_VCN13_VOSEL_MASK << MT6359_RG_VCN13_VOSEL_SHIFT, 82962306a36Sopenharmony_ci 240), 83062306a36Sopenharmony_ci MT6359_LDO("ldo_vcn33_1_bt", VCN33_1_BT, vcn33_voltages, 83162306a36Sopenharmony_ci MT6359P_RG_LDO_VCN33_1_EN_0_ADDR, 83262306a36Sopenharmony_ci MT6359_RG_LDO_VCN33_1_EN_0_SHIFT, 83362306a36Sopenharmony_ci MT6359P_DA_VCN33_1_B_EN_ADDR, MT6359P_RG_VCN33_1_VOSEL_ADDR, 83462306a36Sopenharmony_ci MT6359_RG_VCN33_1_VOSEL_MASK << 83562306a36Sopenharmony_ci MT6359_RG_VCN33_1_VOSEL_SHIFT, 240), 83662306a36Sopenharmony_ci MT6359_LDO("ldo_vcn33_1_wifi", VCN33_1_WIFI, vcn33_voltages, 83762306a36Sopenharmony_ci MT6359P_RG_LDO_VCN33_1_EN_1_ADDR, 83862306a36Sopenharmony_ci MT6359P_RG_LDO_VCN33_1_EN_1_SHIFT, 83962306a36Sopenharmony_ci MT6359P_DA_VCN33_1_B_EN_ADDR, MT6359P_RG_VCN33_1_VOSEL_ADDR, 84062306a36Sopenharmony_ci MT6359_RG_VCN33_1_VOSEL_MASK << 84162306a36Sopenharmony_ci MT6359_RG_VCN33_1_VOSEL_SHIFT, 240), 84262306a36Sopenharmony_ci MT6359_REG_FIXED("ldo_vaux18", VAUX18, MT6359P_RG_LDO_VAUX18_EN_ADDR, 84362306a36Sopenharmony_ci MT6359P_DA_VAUX18_B_EN_ADDR, 1800000), 84462306a36Sopenharmony_ci MT6359_LDO_LINEAR("ldo_vsram_others", VSRAM_OTHERS, 500000, 1293750, 84562306a36Sopenharmony_ci 6250, 84662306a36Sopenharmony_ci MT6359P_RG_LDO_VSRAM_OTHERS_EN_ADDR, 84762306a36Sopenharmony_ci MT6359P_DA_VSRAM_OTHERS_B_EN_ADDR, 84862306a36Sopenharmony_ci MT6359P_RG_LDO_VSRAM_OTHERS_VOSEL_ADDR, 84962306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_OTHERS_VOSEL_MASK << 85062306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_OTHERS_VOSEL_SHIFT), 85162306a36Sopenharmony_ci MT6359_LDO("ldo_vefuse", VEFUSE, vefuse_voltages, 85262306a36Sopenharmony_ci MT6359P_RG_LDO_VEFUSE_EN_ADDR, 85362306a36Sopenharmony_ci MT6359P_RG_LDO_VEFUSE_EN_SHIFT, 85462306a36Sopenharmony_ci MT6359P_DA_VEFUSE_B_EN_ADDR, MT6359P_RG_VEFUSE_VOSEL_ADDR, 85562306a36Sopenharmony_ci MT6359_RG_VEFUSE_VOSEL_MASK << MT6359_RG_VEFUSE_VOSEL_SHIFT, 85662306a36Sopenharmony_ci 240), 85762306a36Sopenharmony_ci MT6359_LDO("ldo_vxo22", VXO22, vxo22_voltages, 85862306a36Sopenharmony_ci MT6359P_RG_LDO_VXO22_EN_ADDR, MT6359P_RG_LDO_VXO22_EN_SHIFT, 85962306a36Sopenharmony_ci MT6359P_DA_VXO22_B_EN_ADDR, MT6359P_RG_VXO22_VOSEL_ADDR, 86062306a36Sopenharmony_ci MT6359_RG_VXO22_VOSEL_MASK << MT6359_RG_VXO22_VOSEL_SHIFT, 86162306a36Sopenharmony_ci 480), 86262306a36Sopenharmony_ci MT6359_LDO("ldo_vrfck_1", VRFCK, vrfck_voltages_1, 86362306a36Sopenharmony_ci MT6359P_RG_LDO_VRFCK_EN_ADDR, MT6359P_RG_LDO_VRFCK_EN_SHIFT, 86462306a36Sopenharmony_ci MT6359P_DA_VRFCK_B_EN_ADDR, MT6359P_RG_VRFCK_VOSEL_ADDR, 86562306a36Sopenharmony_ci MT6359_RG_VRFCK_VOSEL_MASK << MT6359_RG_VRFCK_VOSEL_SHIFT, 86662306a36Sopenharmony_ci 480), 86762306a36Sopenharmony_ci MT6359_REG_FIXED("ldo_vbif28", VBIF28, MT6359P_RG_LDO_VBIF28_EN_ADDR, 86862306a36Sopenharmony_ci MT6359P_DA_VBIF28_B_EN_ADDR, 2800000), 86962306a36Sopenharmony_ci MT6359_LDO("ldo_vio28", VIO28, vio28_voltages, 87062306a36Sopenharmony_ci MT6359P_RG_LDO_VIO28_EN_ADDR, MT6359P_RG_LDO_VIO28_EN_SHIFT, 87162306a36Sopenharmony_ci MT6359P_DA_VIO28_B_EN_ADDR, MT6359P_RG_VIO28_VOSEL_ADDR, 87262306a36Sopenharmony_ci MT6359_RG_VIO28_VOSEL_MASK << MT6359_RG_VIO28_VOSEL_SHIFT, 87362306a36Sopenharmony_ci 1920), 87462306a36Sopenharmony_ci MT6359P_LDO1("ldo_vemc_1", VEMC, mt6359p_vemc_ops, vemc_voltages_1, 87562306a36Sopenharmony_ci MT6359P_RG_LDO_VEMC_EN_ADDR, MT6359P_RG_LDO_VEMC_EN_SHIFT, 87662306a36Sopenharmony_ci MT6359P_DA_VEMC_B_EN_ADDR, 87762306a36Sopenharmony_ci MT6359P_RG_LDO_VEMC_VOSEL_0_ADDR, 87862306a36Sopenharmony_ci MT6359P_RG_LDO_VEMC_VOSEL_0_MASK << 87962306a36Sopenharmony_ci MT6359P_RG_LDO_VEMC_VOSEL_0_SHIFT), 88062306a36Sopenharmony_ci MT6359_LDO("ldo_vcn33_2_bt", VCN33_2_BT, vcn33_voltages, 88162306a36Sopenharmony_ci MT6359P_RG_LDO_VCN33_2_EN_0_ADDR, 88262306a36Sopenharmony_ci MT6359P_RG_LDO_VCN33_2_EN_0_SHIFT, 88362306a36Sopenharmony_ci MT6359P_DA_VCN33_2_B_EN_ADDR, MT6359P_RG_VCN33_2_VOSEL_ADDR, 88462306a36Sopenharmony_ci MT6359_RG_VCN33_2_VOSEL_MASK << 88562306a36Sopenharmony_ci MT6359_RG_VCN33_2_VOSEL_SHIFT, 240), 88662306a36Sopenharmony_ci MT6359_LDO("ldo_vcn33_2_wifi", VCN33_2_WIFI, vcn33_voltages, 88762306a36Sopenharmony_ci MT6359P_RG_LDO_VCN33_2_EN_1_ADDR, 88862306a36Sopenharmony_ci MT6359_RG_LDO_VCN33_2_EN_1_SHIFT, 88962306a36Sopenharmony_ci MT6359P_DA_VCN33_2_B_EN_ADDR, MT6359P_RG_VCN33_2_VOSEL_ADDR, 89062306a36Sopenharmony_ci MT6359_RG_VCN33_2_VOSEL_MASK << 89162306a36Sopenharmony_ci MT6359_RG_VCN33_2_VOSEL_SHIFT, 240), 89262306a36Sopenharmony_ci MT6359_LDO("ldo_va12", VA12, va12_voltages, 89362306a36Sopenharmony_ci MT6359P_RG_LDO_VA12_EN_ADDR, MT6359P_RG_LDO_VA12_EN_SHIFT, 89462306a36Sopenharmony_ci MT6359P_DA_VA12_B_EN_ADDR, MT6359P_RG_VA12_VOSEL_ADDR, 89562306a36Sopenharmony_ci MT6359_RG_VA12_VOSEL_MASK << MT6359_RG_VA12_VOSEL_SHIFT, 89662306a36Sopenharmony_ci 960), 89762306a36Sopenharmony_ci MT6359_LDO("ldo_va09", VA09, va09_voltages, 89862306a36Sopenharmony_ci MT6359P_RG_LDO_VA09_EN_ADDR, MT6359P_RG_LDO_VA09_EN_SHIFT, 89962306a36Sopenharmony_ci MT6359P_DA_VA09_B_EN_ADDR, MT6359P_RG_VA09_VOSEL_ADDR, 90062306a36Sopenharmony_ci MT6359_RG_VA09_VOSEL_MASK << MT6359_RG_VA09_VOSEL_SHIFT, 90162306a36Sopenharmony_ci 960), 90262306a36Sopenharmony_ci MT6359_LDO("ldo_vrf18", VRF18, vrf18_voltages, 90362306a36Sopenharmony_ci MT6359P_RG_LDO_VRF18_EN_ADDR, MT6359P_RG_LDO_VRF18_EN_SHIFT, 90462306a36Sopenharmony_ci MT6359P_DA_VRF18_B_EN_ADDR, MT6359P_RG_VRF18_VOSEL_ADDR, 90562306a36Sopenharmony_ci MT6359_RG_VRF18_VOSEL_MASK << MT6359_RG_VRF18_VOSEL_SHIFT, 90662306a36Sopenharmony_ci 240), 90762306a36Sopenharmony_ci MT6359_LDO_LINEAR("ldo_vsram_md", VSRAM_MD, 500000, 1293750, 6250, 90862306a36Sopenharmony_ci MT6359P_RG_LDO_VSRAM_MD_EN_ADDR, 90962306a36Sopenharmony_ci MT6359P_DA_VSRAM_MD_B_EN_ADDR, 91062306a36Sopenharmony_ci MT6359P_RG_LDO_VSRAM_MD_VOSEL_ADDR, 91162306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_MD_VOSEL_MASK << 91262306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_MD_VOSEL_SHIFT), 91362306a36Sopenharmony_ci MT6359_LDO("ldo_vufs", VUFS, volt18_voltages, 91462306a36Sopenharmony_ci MT6359P_RG_LDO_VUFS_EN_ADDR, MT6359P_RG_LDO_VUFS_EN_SHIFT, 91562306a36Sopenharmony_ci MT6359P_DA_VUFS_B_EN_ADDR, MT6359P_RG_VUFS_VOSEL_ADDR, 91662306a36Sopenharmony_ci MT6359_RG_VUFS_VOSEL_MASK << MT6359_RG_VUFS_VOSEL_SHIFT, 91762306a36Sopenharmony_ci 1920), 91862306a36Sopenharmony_ci MT6359_LDO("ldo_vm18", VM18, volt18_voltages, 91962306a36Sopenharmony_ci MT6359P_RG_LDO_VM18_EN_ADDR, MT6359P_RG_LDO_VM18_EN_SHIFT, 92062306a36Sopenharmony_ci MT6359P_DA_VM18_B_EN_ADDR, MT6359P_RG_VM18_VOSEL_ADDR, 92162306a36Sopenharmony_ci MT6359_RG_VM18_VOSEL_MASK << MT6359_RG_VM18_VOSEL_SHIFT, 92262306a36Sopenharmony_ci 1920), 92362306a36Sopenharmony_ci MT6359_LDO("ldo_vbbck", VBBCK, vbbck_voltages, 92462306a36Sopenharmony_ci MT6359P_RG_LDO_VBBCK_EN_ADDR, MT6359P_RG_LDO_VBBCK_EN_SHIFT, 92562306a36Sopenharmony_ci MT6359P_DA_VBBCK_B_EN_ADDR, MT6359P_RG_VBBCK_VOSEL_ADDR, 92662306a36Sopenharmony_ci MT6359P_RG_VBBCK_VOSEL_MASK << MT6359P_RG_VBBCK_VOSEL_SHIFT, 92762306a36Sopenharmony_ci 480), 92862306a36Sopenharmony_ci MT6359_LDO_LINEAR("ldo_vsram_proc1", VSRAM_PROC1, 500000, 1293750, 6250, 92962306a36Sopenharmony_ci MT6359P_RG_LDO_VSRAM_PROC1_EN_ADDR, 93062306a36Sopenharmony_ci MT6359P_DA_VSRAM_PROC1_B_EN_ADDR, 93162306a36Sopenharmony_ci MT6359P_RG_LDO_VSRAM_PROC1_VOSEL_ADDR, 93262306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_PROC1_VOSEL_MASK << 93362306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_PROC1_VOSEL_SHIFT), 93462306a36Sopenharmony_ci MT6359_LDO("ldo_vsim2", VSIM2, vsim2_voltages, 93562306a36Sopenharmony_ci MT6359P_RG_LDO_VSIM2_EN_ADDR, MT6359P_RG_LDO_VSIM2_EN_SHIFT, 93662306a36Sopenharmony_ci MT6359P_DA_VSIM2_B_EN_ADDR, MT6359P_RG_VSIM2_VOSEL_ADDR, 93762306a36Sopenharmony_ci MT6359_RG_VSIM2_VOSEL_MASK << MT6359_RG_VSIM2_VOSEL_SHIFT, 93862306a36Sopenharmony_ci 480), 93962306a36Sopenharmony_ci MT6359_LDO_LINEAR("ldo_vsram_others_sshub", VSRAM_OTHERS_SSHUB, 94062306a36Sopenharmony_ci 500000, 1293750, 6250, 94162306a36Sopenharmony_ci MT6359P_RG_LDO_VSRAM_OTHERS_SSHUB_EN_ADDR, 94262306a36Sopenharmony_ci MT6359P_DA_VSRAM_OTHERS_B_EN_ADDR, 94362306a36Sopenharmony_ci MT6359P_RG_LDO_VSRAM_OTHERS_SSHUB_VOSEL_ADDR, 94462306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_OTHERS_SSHUB_VOSEL_MASK << 94562306a36Sopenharmony_ci MT6359_RG_LDO_VSRAM_OTHERS_SSHUB_VOSEL_SHIFT), 94662306a36Sopenharmony_ci}; 94762306a36Sopenharmony_ci 94862306a36Sopenharmony_cistatic int mt6359_regulator_probe(struct platform_device *pdev) 94962306a36Sopenharmony_ci{ 95062306a36Sopenharmony_ci struct mt6397_chip *mt6397 = dev_get_drvdata(pdev->dev.parent); 95162306a36Sopenharmony_ci struct regulator_config config = {}; 95262306a36Sopenharmony_ci struct regulator_dev *rdev; 95362306a36Sopenharmony_ci struct mt6359_regulator_info *mt6359_info; 95462306a36Sopenharmony_ci int i, hw_ver, ret; 95562306a36Sopenharmony_ci 95662306a36Sopenharmony_ci ret = regmap_read(mt6397->regmap, MT6359P_HWCID, &hw_ver); 95762306a36Sopenharmony_ci if (ret) 95862306a36Sopenharmony_ci return ret; 95962306a36Sopenharmony_ci 96062306a36Sopenharmony_ci if (hw_ver >= MT6359P_CHIP_VER) 96162306a36Sopenharmony_ci mt6359_info = mt6359p_regulators; 96262306a36Sopenharmony_ci else 96362306a36Sopenharmony_ci mt6359_info = mt6359_regulators; 96462306a36Sopenharmony_ci 96562306a36Sopenharmony_ci config.dev = mt6397->dev; 96662306a36Sopenharmony_ci config.regmap = mt6397->regmap; 96762306a36Sopenharmony_ci for (i = 0; i < MT6359_MAX_REGULATOR; i++, mt6359_info++) { 96862306a36Sopenharmony_ci config.driver_data = mt6359_info; 96962306a36Sopenharmony_ci rdev = devm_regulator_register(&pdev->dev, &mt6359_info->desc, &config); 97062306a36Sopenharmony_ci if (IS_ERR(rdev)) { 97162306a36Sopenharmony_ci dev_err(&pdev->dev, "failed to register %s\n", mt6359_info->desc.name); 97262306a36Sopenharmony_ci return PTR_ERR(rdev); 97362306a36Sopenharmony_ci } 97462306a36Sopenharmony_ci } 97562306a36Sopenharmony_ci 97662306a36Sopenharmony_ci return 0; 97762306a36Sopenharmony_ci} 97862306a36Sopenharmony_ci 97962306a36Sopenharmony_cistatic const struct platform_device_id mt6359_platform_ids[] = { 98062306a36Sopenharmony_ci {"mt6359-regulator", 0}, 98162306a36Sopenharmony_ci { /* sentinel */ }, 98262306a36Sopenharmony_ci}; 98362306a36Sopenharmony_ciMODULE_DEVICE_TABLE(platform, mt6359_platform_ids); 98462306a36Sopenharmony_ci 98562306a36Sopenharmony_cistatic struct platform_driver mt6359_regulator_driver = { 98662306a36Sopenharmony_ci .driver = { 98762306a36Sopenharmony_ci .name = "mt6359-regulator", 98862306a36Sopenharmony_ci .probe_type = PROBE_PREFER_ASYNCHRONOUS, 98962306a36Sopenharmony_ci }, 99062306a36Sopenharmony_ci .probe = mt6359_regulator_probe, 99162306a36Sopenharmony_ci .id_table = mt6359_platform_ids, 99262306a36Sopenharmony_ci}; 99362306a36Sopenharmony_ci 99462306a36Sopenharmony_cimodule_platform_driver(mt6359_regulator_driver); 99562306a36Sopenharmony_ci 99662306a36Sopenharmony_ciMODULE_AUTHOR("Wen Su <wen.su@mediatek.com>"); 99762306a36Sopenharmony_ciMODULE_DESCRIPTION("Regulator Driver for MediaTek MT6359 PMIC"); 99862306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 999