162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci#include <linux/bitops.h> 462306a36Sopenharmony_ci#include <linux/i2c.h> 562306a36Sopenharmony_ci#include <linux/kernel.h> 662306a36Sopenharmony_ci#include <linux/module.h> 762306a36Sopenharmony_ci#include <linux/of.h> 862306a36Sopenharmony_ci#include <linux/regmap.h> 962306a36Sopenharmony_ci#include <linux/regulator/driver.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_cienum { 1262306a36Sopenharmony_ci RTQ2134_IDX_BUCK1 = 0, 1362306a36Sopenharmony_ci RTQ2134_IDX_BUCK2, 1462306a36Sopenharmony_ci RTQ2134_IDX_BUCK3, 1562306a36Sopenharmony_ci RTQ2134_IDX_MAX 1662306a36Sopenharmony_ci}; 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define RTQ2134_AUTO_MODE 0 1962306a36Sopenharmony_ci#define RTQ2134_FCCM_MODE 1 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#define RTQ2134_BUCK_DVS0_CTRL 0 2262306a36Sopenharmony_ci#define RTQ2134_BUCK_VSEL_CTRL 2 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#define RTQ2134_REG_IO_CHIPNAME 0x01 2562306a36Sopenharmony_ci#define RTQ2134_REG_FLT_RECORDTEMP 0x13 2662306a36Sopenharmony_ci#define RTQ2134_REG_FLT_RECORDBUCK(_id) (0x14 + (_id)) 2762306a36Sopenharmony_ci#define RTQ2134_REG_FLT_BUCKCTRL(_id) (0x37 + (_id)) 2862306a36Sopenharmony_ci#define RTQ2134_REG_BUCK1_CFG0 0x42 2962306a36Sopenharmony_ci#define RTQ2134_REG_BUCK1_DVS0CFG1 0x48 3062306a36Sopenharmony_ci#define RTQ2134_REG_BUCK1_DVS0CFG0 0x49 3162306a36Sopenharmony_ci#define RTQ2134_REG_BUCK1_DVS1CFG1 0x4A 3262306a36Sopenharmony_ci#define RTQ2134_REG_BUCK1_DVS1CFG0 0x4B 3362306a36Sopenharmony_ci#define RTQ2134_REG_BUCK1_DVSCFG 0x52 3462306a36Sopenharmony_ci#define RTQ2134_REG_BUCK1_RSPCFG 0x54 3562306a36Sopenharmony_ci#define RTQ2134_REG_BUCK2_CFG0 0x5F 3662306a36Sopenharmony_ci#define RTQ2134_REG_BUCK2_DVS0CFG1 0x62 3762306a36Sopenharmony_ci#define RTQ2134_REG_BUCK2_DVS0CFG0 0x63 3862306a36Sopenharmony_ci#define RTQ2134_REG_BUCK2_DVS1CFG1 0x64 3962306a36Sopenharmony_ci#define RTQ2134_REG_BUCK2_DVS1CFG0 0x65 4062306a36Sopenharmony_ci#define RTQ2134_REG_BUCK2_DVSCFG 0x6C 4162306a36Sopenharmony_ci#define RTQ2134_REG_BUCK2_RSPCFG 0x6E 4262306a36Sopenharmony_ci#define RTQ2134_REG_BUCK3_CFG0 0x79 4362306a36Sopenharmony_ci#define RTQ2134_REG_BUCK3_DVS0CFG1 0x7C 4462306a36Sopenharmony_ci#define RTQ2134_REG_BUCK3_DVS0CFG0 0x7D 4562306a36Sopenharmony_ci#define RTQ2134_REG_BUCK3_DVS1CFG1 0x7E 4662306a36Sopenharmony_ci#define RTQ2134_REG_BUCK3_DVS1CFG0 0x7F 4762306a36Sopenharmony_ci#define RTQ2134_REG_BUCK3_DVSCFG 0x86 4862306a36Sopenharmony_ci#define RTQ2134_REG_BUCK3_RSPCFG 0x88 4962306a36Sopenharmony_ci#define RTQ2134_REG_BUCK3_SLEWCTRL 0x89 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci#define RTQ2134_VOUT_MAXNUM 256 5262306a36Sopenharmony_ci#define RTQ2134_VOUT_MASK 0xFF 5362306a36Sopenharmony_ci#define RTQ2134_VOUTEN_MASK BIT(0) 5462306a36Sopenharmony_ci#define RTQ2134_ACTDISCHG_MASK BIT(0) 5562306a36Sopenharmony_ci#define RTQ2134_RSPUP_MASK GENMASK(6, 4) 5662306a36Sopenharmony_ci#define RTQ2134_FCCM_MASK BIT(5) 5762306a36Sopenharmony_ci#define RTQ2134_UVHICCUP_MASK BIT(3) 5862306a36Sopenharmony_ci#define RTQ2134_BUCKDVS_CTRL_MASK GENMASK(1, 0) 5962306a36Sopenharmony_ci#define RTQ2134_CHIPOT_MASK BIT(2) 6062306a36Sopenharmony_ci#define RTQ2134_BUCKOV_MASK BIT(5) 6162306a36Sopenharmony_ci#define RTQ2134_BUCKUV_MASK BIT(4) 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_cistruct rtq2134_regulator_desc { 6462306a36Sopenharmony_ci struct regulator_desc desc; 6562306a36Sopenharmony_ci /* Extension for proprietary register and mask */ 6662306a36Sopenharmony_ci unsigned int mode_reg; 6762306a36Sopenharmony_ci unsigned int mode_mask; 6862306a36Sopenharmony_ci unsigned int suspend_enable_reg; 6962306a36Sopenharmony_ci unsigned int suspend_enable_mask; 7062306a36Sopenharmony_ci unsigned int suspend_vsel_reg; 7162306a36Sopenharmony_ci unsigned int suspend_vsel_mask; 7262306a36Sopenharmony_ci unsigned int suspend_mode_reg; 7362306a36Sopenharmony_ci unsigned int suspend_mode_mask; 7462306a36Sopenharmony_ci unsigned int dvs_ctrl_reg; 7562306a36Sopenharmony_ci}; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_cistatic int rtq2134_buck_set_mode(struct regulator_dev *rdev, unsigned int mode) 7862306a36Sopenharmony_ci{ 7962306a36Sopenharmony_ci struct rtq2134_regulator_desc *desc = 8062306a36Sopenharmony_ci (struct rtq2134_regulator_desc *)rdev->desc; 8162306a36Sopenharmony_ci unsigned int val; 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci if (mode == REGULATOR_MODE_NORMAL) 8462306a36Sopenharmony_ci val = RTQ2134_AUTO_MODE; 8562306a36Sopenharmony_ci else if (mode == REGULATOR_MODE_FAST) 8662306a36Sopenharmony_ci val = RTQ2134_FCCM_MODE; 8762306a36Sopenharmony_ci else 8862306a36Sopenharmony_ci return -EINVAL; 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci val <<= ffs(desc->mode_mask) - 1; 9162306a36Sopenharmony_ci return regmap_update_bits(rdev->regmap, desc->mode_reg, desc->mode_mask, 9262306a36Sopenharmony_ci val); 9362306a36Sopenharmony_ci} 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_cistatic unsigned int rtq2134_buck_get_mode(struct regulator_dev *rdev) 9662306a36Sopenharmony_ci{ 9762306a36Sopenharmony_ci struct rtq2134_regulator_desc *desc = 9862306a36Sopenharmony_ci (struct rtq2134_regulator_desc *)rdev->desc; 9962306a36Sopenharmony_ci unsigned int mode; 10062306a36Sopenharmony_ci int ret; 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci ret = regmap_read(rdev->regmap, desc->mode_reg, &mode); 10362306a36Sopenharmony_ci if (ret) 10462306a36Sopenharmony_ci return ret; 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci if (mode & desc->mode_mask) 10762306a36Sopenharmony_ci return REGULATOR_MODE_FAST; 10862306a36Sopenharmony_ci return REGULATOR_MODE_NORMAL; 10962306a36Sopenharmony_ci} 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_cistatic int rtq2134_buck_set_suspend_voltage(struct regulator_dev *rdev, int uV) 11262306a36Sopenharmony_ci{ 11362306a36Sopenharmony_ci struct rtq2134_regulator_desc *desc = 11462306a36Sopenharmony_ci (struct rtq2134_regulator_desc *)rdev->desc; 11562306a36Sopenharmony_ci int sel; 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci sel = regulator_map_voltage_linear_range(rdev, uV, uV); 11862306a36Sopenharmony_ci if (sel < 0) 11962306a36Sopenharmony_ci return sel; 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci sel <<= ffs(desc->suspend_vsel_mask) - 1; 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci return regmap_update_bits(rdev->regmap, desc->suspend_vsel_reg, 12462306a36Sopenharmony_ci desc->suspend_vsel_mask, sel); 12562306a36Sopenharmony_ci} 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_cistatic int rtq2134_buck_set_suspend_enable(struct regulator_dev *rdev) 12862306a36Sopenharmony_ci{ 12962306a36Sopenharmony_ci struct rtq2134_regulator_desc *desc = 13062306a36Sopenharmony_ci (struct rtq2134_regulator_desc *)rdev->desc; 13162306a36Sopenharmony_ci unsigned int val = desc->suspend_enable_mask; 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci return regmap_update_bits(rdev->regmap, desc->suspend_enable_reg, 13462306a36Sopenharmony_ci desc->suspend_enable_mask, val); 13562306a36Sopenharmony_ci} 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_cistatic int rtq2134_buck_set_suspend_disable(struct regulator_dev *rdev) 13862306a36Sopenharmony_ci{ 13962306a36Sopenharmony_ci struct rtq2134_regulator_desc *desc = 14062306a36Sopenharmony_ci (struct rtq2134_regulator_desc *)rdev->desc; 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci return regmap_update_bits(rdev->regmap, desc->suspend_enable_reg, 14362306a36Sopenharmony_ci desc->suspend_enable_mask, 0); 14462306a36Sopenharmony_ci} 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_cistatic int rtq2134_buck_set_suspend_mode(struct regulator_dev *rdev, 14762306a36Sopenharmony_ci unsigned int mode) 14862306a36Sopenharmony_ci{ 14962306a36Sopenharmony_ci struct rtq2134_regulator_desc *desc = 15062306a36Sopenharmony_ci (struct rtq2134_regulator_desc *)rdev->desc; 15162306a36Sopenharmony_ci unsigned int val; 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci if (mode == REGULATOR_MODE_NORMAL) 15462306a36Sopenharmony_ci val = RTQ2134_AUTO_MODE; 15562306a36Sopenharmony_ci else if (mode == REGULATOR_MODE_FAST) 15662306a36Sopenharmony_ci val = RTQ2134_FCCM_MODE; 15762306a36Sopenharmony_ci else 15862306a36Sopenharmony_ci return -EINVAL; 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci val <<= ffs(desc->suspend_mode_mask) - 1; 16162306a36Sopenharmony_ci return regmap_update_bits(rdev->regmap, desc->suspend_mode_reg, 16262306a36Sopenharmony_ci desc->suspend_mode_mask, val); 16362306a36Sopenharmony_ci} 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_cistatic int rtq2134_buck_get_error_flags(struct regulator_dev *rdev, 16662306a36Sopenharmony_ci unsigned int *flags) 16762306a36Sopenharmony_ci{ 16862306a36Sopenharmony_ci int rid = rdev_get_id(rdev); 16962306a36Sopenharmony_ci unsigned int chip_error, buck_error, events = 0; 17062306a36Sopenharmony_ci int ret; 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci ret = regmap_read(rdev->regmap, RTQ2134_REG_FLT_RECORDTEMP, 17362306a36Sopenharmony_ci &chip_error); 17462306a36Sopenharmony_ci if (ret) { 17562306a36Sopenharmony_ci dev_err(&rdev->dev, "Failed to get chip error flag\n"); 17662306a36Sopenharmony_ci return ret; 17762306a36Sopenharmony_ci } 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci ret = regmap_read(rdev->regmap, RTQ2134_REG_FLT_RECORDBUCK(rid), 18062306a36Sopenharmony_ci &buck_error); 18162306a36Sopenharmony_ci if (ret) { 18262306a36Sopenharmony_ci dev_err(&rdev->dev, "Failed to get buck error flag\n"); 18362306a36Sopenharmony_ci return ret; 18462306a36Sopenharmony_ci } 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci if (chip_error & RTQ2134_CHIPOT_MASK) 18762306a36Sopenharmony_ci events |= REGULATOR_ERROR_OVER_TEMP; 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ci if (buck_error & RTQ2134_BUCKUV_MASK) 19062306a36Sopenharmony_ci events |= REGULATOR_ERROR_UNDER_VOLTAGE; 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci if (buck_error & RTQ2134_BUCKOV_MASK) 19362306a36Sopenharmony_ci events |= REGULATOR_ERROR_REGULATION_OUT; 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci *flags = events; 19662306a36Sopenharmony_ci return 0; 19762306a36Sopenharmony_ci} 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_cistatic const struct regulator_ops rtq2134_buck_ops = { 20062306a36Sopenharmony_ci .list_voltage = regulator_list_voltage_linear_range, 20162306a36Sopenharmony_ci .set_voltage_sel = regulator_set_voltage_sel_regmap, 20262306a36Sopenharmony_ci .get_voltage_sel = regulator_get_voltage_sel_regmap, 20362306a36Sopenharmony_ci .enable = regulator_enable_regmap, 20462306a36Sopenharmony_ci .disable = regulator_disable_regmap, 20562306a36Sopenharmony_ci .is_enabled = regulator_is_enabled_regmap, 20662306a36Sopenharmony_ci .set_active_discharge = regulator_set_active_discharge_regmap, 20762306a36Sopenharmony_ci .set_ramp_delay = regulator_set_ramp_delay_regmap, 20862306a36Sopenharmony_ci .set_mode = rtq2134_buck_set_mode, 20962306a36Sopenharmony_ci .get_mode = rtq2134_buck_get_mode, 21062306a36Sopenharmony_ci .set_suspend_voltage = rtq2134_buck_set_suspend_voltage, 21162306a36Sopenharmony_ci .set_suspend_enable = rtq2134_buck_set_suspend_enable, 21262306a36Sopenharmony_ci .set_suspend_disable = rtq2134_buck_set_suspend_disable, 21362306a36Sopenharmony_ci .set_suspend_mode = rtq2134_buck_set_suspend_mode, 21462306a36Sopenharmony_ci .get_error_flags = rtq2134_buck_get_error_flags, 21562306a36Sopenharmony_ci}; 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_cistatic const struct linear_range rtq2134_buck_vout_ranges[] = { 21862306a36Sopenharmony_ci REGULATOR_LINEAR_RANGE(300000, 0, 200, 5000), 21962306a36Sopenharmony_ci REGULATOR_LINEAR_RANGE(1310000, 201, 255, 10000) 22062306a36Sopenharmony_ci}; 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_cistatic unsigned int rtq2134_buck_of_map_mode(unsigned int mode) 22362306a36Sopenharmony_ci{ 22462306a36Sopenharmony_ci switch (mode) { 22562306a36Sopenharmony_ci case RTQ2134_AUTO_MODE: 22662306a36Sopenharmony_ci return REGULATOR_MODE_NORMAL; 22762306a36Sopenharmony_ci case RTQ2134_FCCM_MODE: 22862306a36Sopenharmony_ci return REGULATOR_MODE_FAST; 22962306a36Sopenharmony_ci } 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ci return REGULATOR_MODE_INVALID; 23262306a36Sopenharmony_ci} 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_cistatic int rtq2134_buck_of_parse_cb(struct device_node *np, 23562306a36Sopenharmony_ci const struct regulator_desc *desc, 23662306a36Sopenharmony_ci struct regulator_config *cfg) 23762306a36Sopenharmony_ci{ 23862306a36Sopenharmony_ci struct rtq2134_regulator_desc *rdesc = 23962306a36Sopenharmony_ci (struct rtq2134_regulator_desc *)desc; 24062306a36Sopenharmony_ci int rid = desc->id; 24162306a36Sopenharmony_ci bool uv_shutdown, vsel_dvs; 24262306a36Sopenharmony_ci unsigned int val; 24362306a36Sopenharmony_ci int ret; 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci vsel_dvs = of_property_read_bool(np, "richtek,use-vsel-dvs"); 24662306a36Sopenharmony_ci if (vsel_dvs) 24762306a36Sopenharmony_ci val = RTQ2134_BUCK_VSEL_CTRL; 24862306a36Sopenharmony_ci else 24962306a36Sopenharmony_ci val = RTQ2134_BUCK_DVS0_CTRL; 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci ret = regmap_update_bits(cfg->regmap, rdesc->dvs_ctrl_reg, 25262306a36Sopenharmony_ci RTQ2134_BUCKDVS_CTRL_MASK, val); 25362306a36Sopenharmony_ci if (ret) 25462306a36Sopenharmony_ci return ret; 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_ci uv_shutdown = of_property_read_bool(np, "richtek,uv-shutdown"); 25762306a36Sopenharmony_ci if (uv_shutdown) 25862306a36Sopenharmony_ci val = 0; 25962306a36Sopenharmony_ci else 26062306a36Sopenharmony_ci val = RTQ2134_UVHICCUP_MASK; 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ci return regmap_update_bits(cfg->regmap, RTQ2134_REG_FLT_BUCKCTRL(rid), 26362306a36Sopenharmony_ci RTQ2134_UVHICCUP_MASK, val); 26462306a36Sopenharmony_ci} 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_cistatic const unsigned int rtq2134_buck_ramp_delay_table[] = { 26762306a36Sopenharmony_ci 0, 16000, 0, 8000, 4000, 2000, 1000, 500 26862306a36Sopenharmony_ci}; 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_ci#define RTQ2134_BUCK_DESC(_id) { \ 27162306a36Sopenharmony_ci .desc = { \ 27262306a36Sopenharmony_ci .name = "rtq2134_buck" #_id, \ 27362306a36Sopenharmony_ci .of_match = of_match_ptr("buck" #_id), \ 27462306a36Sopenharmony_ci .regulators_node = of_match_ptr("regulators"), \ 27562306a36Sopenharmony_ci .id = RTQ2134_IDX_BUCK##_id, \ 27662306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, \ 27762306a36Sopenharmony_ci .owner = THIS_MODULE, \ 27862306a36Sopenharmony_ci .ops = &rtq2134_buck_ops, \ 27962306a36Sopenharmony_ci .n_voltages = RTQ2134_VOUT_MAXNUM, \ 28062306a36Sopenharmony_ci .linear_ranges = rtq2134_buck_vout_ranges, \ 28162306a36Sopenharmony_ci .n_linear_ranges = ARRAY_SIZE(rtq2134_buck_vout_ranges), \ 28262306a36Sopenharmony_ci .vsel_reg = RTQ2134_REG_BUCK##_id##_DVS0CFG1, \ 28362306a36Sopenharmony_ci .vsel_mask = RTQ2134_VOUT_MASK, \ 28462306a36Sopenharmony_ci .enable_reg = RTQ2134_REG_BUCK##_id##_DVS0CFG0, \ 28562306a36Sopenharmony_ci .enable_mask = RTQ2134_VOUTEN_MASK, \ 28662306a36Sopenharmony_ci .active_discharge_reg = RTQ2134_REG_BUCK##_id##_CFG0, \ 28762306a36Sopenharmony_ci .active_discharge_mask = RTQ2134_ACTDISCHG_MASK, \ 28862306a36Sopenharmony_ci .active_discharge_on = RTQ2134_ACTDISCHG_MASK, \ 28962306a36Sopenharmony_ci .ramp_reg = RTQ2134_REG_BUCK##_id##_RSPCFG, \ 29062306a36Sopenharmony_ci .ramp_mask = RTQ2134_RSPUP_MASK, \ 29162306a36Sopenharmony_ci .ramp_delay_table = rtq2134_buck_ramp_delay_table, \ 29262306a36Sopenharmony_ci .n_ramp_values = ARRAY_SIZE(rtq2134_buck_ramp_delay_table), \ 29362306a36Sopenharmony_ci .of_map_mode = rtq2134_buck_of_map_mode, \ 29462306a36Sopenharmony_ci .of_parse_cb = rtq2134_buck_of_parse_cb, \ 29562306a36Sopenharmony_ci }, \ 29662306a36Sopenharmony_ci .mode_reg = RTQ2134_REG_BUCK##_id##_DVS0CFG0, \ 29762306a36Sopenharmony_ci .mode_mask = RTQ2134_FCCM_MASK, \ 29862306a36Sopenharmony_ci .suspend_mode_reg = RTQ2134_REG_BUCK##_id##_DVS1CFG0, \ 29962306a36Sopenharmony_ci .suspend_mode_mask = RTQ2134_FCCM_MASK, \ 30062306a36Sopenharmony_ci .suspend_enable_reg = RTQ2134_REG_BUCK##_id##_DVS1CFG0, \ 30162306a36Sopenharmony_ci .suspend_enable_mask = RTQ2134_VOUTEN_MASK, \ 30262306a36Sopenharmony_ci .suspend_vsel_reg = RTQ2134_REG_BUCK##_id##_DVS1CFG1, \ 30362306a36Sopenharmony_ci .suspend_vsel_mask = RTQ2134_VOUT_MASK, \ 30462306a36Sopenharmony_ci .dvs_ctrl_reg = RTQ2134_REG_BUCK##_id##_DVSCFG, \ 30562306a36Sopenharmony_ci} 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_cistatic const struct rtq2134_regulator_desc rtq2134_regulator_descs[] = { 30862306a36Sopenharmony_ci RTQ2134_BUCK_DESC(1), 30962306a36Sopenharmony_ci RTQ2134_BUCK_DESC(2), 31062306a36Sopenharmony_ci RTQ2134_BUCK_DESC(3) 31162306a36Sopenharmony_ci}; 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_cistatic bool rtq2134_is_accissible_reg(struct device *dev, unsigned int reg) 31462306a36Sopenharmony_ci{ 31562306a36Sopenharmony_ci if (reg >= RTQ2134_REG_IO_CHIPNAME && reg <= RTQ2134_REG_BUCK3_SLEWCTRL) 31662306a36Sopenharmony_ci return true; 31762306a36Sopenharmony_ci return false; 31862306a36Sopenharmony_ci} 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_cistatic const struct regmap_config rtq2134_regmap_config = { 32162306a36Sopenharmony_ci .reg_bits = 8, 32262306a36Sopenharmony_ci .val_bits = 8, 32362306a36Sopenharmony_ci .max_register = RTQ2134_REG_BUCK3_SLEWCTRL, 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_ci .readable_reg = rtq2134_is_accissible_reg, 32662306a36Sopenharmony_ci .writeable_reg = rtq2134_is_accissible_reg, 32762306a36Sopenharmony_ci}; 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_cistatic int rtq2134_probe(struct i2c_client *i2c) 33062306a36Sopenharmony_ci{ 33162306a36Sopenharmony_ci struct regmap *regmap; 33262306a36Sopenharmony_ci struct regulator_dev *rdev; 33362306a36Sopenharmony_ci struct regulator_config regulator_cfg = {}; 33462306a36Sopenharmony_ci int i; 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_ci regmap = devm_regmap_init_i2c(i2c, &rtq2134_regmap_config); 33762306a36Sopenharmony_ci if (IS_ERR(regmap)) { 33862306a36Sopenharmony_ci dev_err(&i2c->dev, "Failed to allocate regmap\n"); 33962306a36Sopenharmony_ci return PTR_ERR(regmap); 34062306a36Sopenharmony_ci } 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ci regulator_cfg.dev = &i2c->dev; 34362306a36Sopenharmony_ci regulator_cfg.regmap = regmap; 34462306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(rtq2134_regulator_descs); i++) { 34562306a36Sopenharmony_ci rdev = devm_regulator_register(&i2c->dev, 34662306a36Sopenharmony_ci &rtq2134_regulator_descs[i].desc, 34762306a36Sopenharmony_ci ®ulator_cfg); 34862306a36Sopenharmony_ci if (IS_ERR(rdev)) { 34962306a36Sopenharmony_ci dev_err(&i2c->dev, "Failed to init %d regulator\n", i); 35062306a36Sopenharmony_ci return PTR_ERR(rdev); 35162306a36Sopenharmony_ci } 35262306a36Sopenharmony_ci } 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci return 0; 35562306a36Sopenharmony_ci} 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_cistatic const struct of_device_id __maybe_unused rtq2134_device_tables[] = { 35862306a36Sopenharmony_ci { .compatible = "richtek,rtq2134", }, 35962306a36Sopenharmony_ci {} 36062306a36Sopenharmony_ci}; 36162306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, rtq2134_device_tables); 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_cistatic struct i2c_driver rtq2134_driver = { 36462306a36Sopenharmony_ci .driver = { 36562306a36Sopenharmony_ci .name = "rtq2134", 36662306a36Sopenharmony_ci .probe_type = PROBE_PREFER_ASYNCHRONOUS, 36762306a36Sopenharmony_ci .of_match_table = rtq2134_device_tables, 36862306a36Sopenharmony_ci }, 36962306a36Sopenharmony_ci .probe = rtq2134_probe, 37062306a36Sopenharmony_ci}; 37162306a36Sopenharmony_cimodule_i2c_driver(rtq2134_driver); 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_ciMODULE_AUTHOR("ChiYuan Huang <cy_huang@richtek.com>"); 37462306a36Sopenharmony_ciMODULE_DESCRIPTION("Richtek RTQ2134 Regulator Driver"); 37562306a36Sopenharmony_ciMODULE_LICENSE("GPL v2"); 376