da9121-regulator.c (f3fbd5566f6a8cdb7c48ab29bd1096205b7fbcaf) | da9121-regulator.c (c860476b9e3a420192b28e580cb749e024d032eb) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-only | 1// SPDX-License-Identifier: GPL-2.0-only |
2/* Copyright (C) 2020 Axis Communications AB */ | 2// 3// DA9121 Single-channel dual-phase 10A buck converter 4// 5// Copyright (C) 2020 Axis Communications AB 6// 7// DA9130 Single-channel dual-phase 10A buck converter (Automotive) 8// DA9217 Single-channel dual-phase 6A buck converter 9// DA9122 Dual-channel single-phase 5A buck converter 10// DA9131 Dual-channel single-phase 5A buck converter (Automotive) 11// DA9220 Dual-channel single-phase 3A buck converter 12// DA9132 Dual-channel single-phase 3A buck converter (Automotive) 13// 14// Copyright (C) 2020 Dialog Semiconductor |
3 4#include <linux/of_device.h> 5#include <linux/regulator/of_regulator.h> 6#include <linux/regulator/machine.h> 7#include <linux/regulator/driver.h> 8#include <linux/module.h> 9#include <linux/regmap.h> 10#include <linux/err.h> 11#include <linux/i2c.h> | 15 16#include <linux/of_device.h> 17#include <linux/regulator/of_regulator.h> 18#include <linux/regulator/machine.h> 19#include <linux/regulator/driver.h> 20#include <linux/module.h> 21#include <linux/regmap.h> 22#include <linux/err.h> 23#include <linux/i2c.h> |
24#include <linux/regulator/da9121.h> 25 |
|
12#include "da9121-regulator.h" 13 14/* Chip data */ 15struct da9121 { 16 struct device *dev; | 26#include "da9121-regulator.h" 27 28/* Chip data */ 29struct da9121 { 30 struct device *dev; |
31 struct regmap *regmap; |
|
17 int variant_id; 18}; 19 | 32 int variant_id; 33}; 34 |
20#define DA9121_MIN_MV 300 21#define DA9121_MAX_MV 1900 22#define DA9121_STEP_MV 10 23#define DA9121_MIN_SEL (DA9121_MIN_MV / DA9121_STEP_MV) 24#define DA9121_N_VOLTAGES (((DA9121_MAX_MV - DA9121_MIN_MV) / DA9121_STEP_MV) \ 25 + 1 + DA9121_MIN_SEL) 26 27static const struct regmap_config da9121_regmap_config = { 28 .reg_bits = 8, 29 .val_bits = 8, 30}; 31 | |
32static const struct regulator_ops da9121_buck_ops = { 33 .enable = regulator_enable_regmap, 34 .disable = regulator_disable_regmap, 35 .is_enabled = regulator_is_enabled_regmap, 36 .set_voltage_sel = regulator_set_voltage_sel_regmap, 37 .get_voltage_sel = regulator_get_voltage_sel_regmap, 38 .list_voltage = regulator_list_voltage_linear, 39}; 40 | 35static const struct regulator_ops da9121_buck_ops = { 36 .enable = regulator_enable_regmap, 37 .disable = regulator_disable_regmap, 38 .is_enabled = regulator_is_enabled_regmap, 39 .set_voltage_sel = regulator_set_voltage_sel_regmap, 40 .get_voltage_sel = regulator_get_voltage_sel_regmap, 41 .list_voltage = regulator_list_voltage_linear, 42}; 43 |
44#define DA9121_MIN_MV 300 45#define DA9121_MAX_MV 1900 46#define DA9121_STEP_MV 10 47#define DA9121_MIN_SEL (DA9121_MIN_MV / DA9121_STEP_MV) 48#define DA9121_N_VOLTAGES (((DA9121_MAX_MV - DA9121_MIN_MV) / DA9121_STEP_MV) \ 49 + 1 + DA9121_MIN_SEL) 50 |
|
41static const struct regulator_desc da9121_reg = { 42 .name = "da9121", 43 .of_match = "buck1", 44 .owner = THIS_MODULE, 45 .ops = &da9121_buck_ops, 46 .type = REGULATOR_VOLTAGE, 47 .n_voltages = DA9121_N_VOLTAGES, 48 .min_uV = DA9121_MIN_MV * 1000, --- 4 unchanged lines hidden (view full) --- 53 .enable_reg = DA9121_REG_BUCK_BUCK1_0, 54 .enable_mask = DA9121_MASK_BUCK_BUCKx_0_CHx_EN, 55 /* Default value of BUCK_BUCK1_0.CH1_SRC_DVC_UP */ 56 .ramp_delay = 20000, 57 /* tBUCK_EN */ 58 .enable_time = 20, 59}; 60 | 51static const struct regulator_desc da9121_reg = { 52 .name = "da9121", 53 .of_match = "buck1", 54 .owner = THIS_MODULE, 55 .ops = &da9121_buck_ops, 56 .type = REGULATOR_VOLTAGE, 57 .n_voltages = DA9121_N_VOLTAGES, 58 .min_uV = DA9121_MIN_MV * 1000, --- 4 unchanged lines hidden (view full) --- 63 .enable_reg = DA9121_REG_BUCK_BUCK1_0, 64 .enable_mask = DA9121_MASK_BUCK_BUCKx_0_CHx_EN, 65 /* Default value of BUCK_BUCK1_0.CH1_SRC_DVC_UP */ 66 .ramp_delay = 20000, 67 /* tBUCK_EN */ 68 .enable_time = 20, 69}; 70 |
71/* DA9121 chip register model */ 72static const struct regmap_range da9121_1ch_readable_ranges[] = { 73 regmap_reg_range(DA9121_REG_SYS_STATUS_0, DA9121_REG_SYS_MASK_3), 74 regmap_reg_range(DA9121_REG_SYS_CONFIG_2, DA9121_REG_SYS_CONFIG_3), 75 regmap_reg_range(DA9121_REG_SYS_GPIO0_0, DA9121_REG_SYS_GPIO2_1), 76 regmap_reg_range(DA9121_REG_BUCK_BUCK1_0, DA9121_REG_BUCK_BUCK1_6), 77 regmap_reg_range(DA9121_REG_OTP_DEVICE_ID, DA9121_REG_OTP_CONFIG_ID), 78}; 79 80static const struct regmap_access_table da9121_1ch_readable_table = { 81 .yes_ranges = da9121_1ch_readable_ranges, 82 .n_yes_ranges = ARRAY_SIZE(da9121_1ch_readable_ranges), 83}; 84 85static const struct regmap_range da9121_2ch_readable_ranges[] = { 86 regmap_reg_range(DA9121_REG_SYS_STATUS_0, DA9121_REG_SYS_MASK_3), 87 regmap_reg_range(DA9121_REG_SYS_CONFIG_2, DA9121_REG_SYS_CONFIG_3), 88 regmap_reg_range(DA9121_REG_SYS_GPIO0_0, DA9121_REG_SYS_GPIO2_1), 89 regmap_reg_range(DA9121_REG_BUCK_BUCK1_0, DA9121_REG_BUCK_BUCK1_7), 90 regmap_reg_range(DA9xxx_REG_BUCK_BUCK2_0, DA9xxx_REG_BUCK_BUCK2_7), 91 regmap_reg_range(DA9121_REG_OTP_DEVICE_ID, DA9121_REG_OTP_CONFIG_ID), 92}; 93 94static const struct regmap_access_table da9121_2ch_readable_table = { 95 .yes_ranges = da9121_2ch_readable_ranges, 96 .n_yes_ranges = ARRAY_SIZE(da9121_2ch_readable_ranges), 97}; 98 99static const struct regmap_range da9121_1ch_writeable_ranges[] = { 100 regmap_reg_range(DA9121_REG_SYS_EVENT_0, DA9121_REG_SYS_MASK_3), 101 regmap_reg_range(DA9121_REG_SYS_CONFIG_2, DA9121_REG_SYS_CONFIG_3), 102 regmap_reg_range(DA9121_REG_SYS_GPIO0_0, DA9121_REG_SYS_GPIO2_1), 103 regmap_reg_range(DA9121_REG_BUCK_BUCK1_0, DA9121_REG_BUCK_BUCK1_2), 104 regmap_reg_range(DA9121_REG_BUCK_BUCK1_4, DA9121_REG_BUCK_BUCK1_6), 105}; 106 107static const struct regmap_access_table da9121_1ch_writeable_table = { 108 .yes_ranges = da9121_1ch_writeable_ranges, 109 .n_yes_ranges = ARRAY_SIZE(da9121_1ch_writeable_ranges), 110}; 111 112static const struct regmap_range da9121_2ch_writeable_ranges[] = { 113 regmap_reg_range(DA9121_REG_SYS_EVENT_0, DA9121_REG_SYS_MASK_3), 114 regmap_reg_range(DA9121_REG_SYS_CONFIG_2, DA9121_REG_SYS_CONFIG_3), 115 regmap_reg_range(DA9121_REG_SYS_GPIO0_0, DA9121_REG_SYS_GPIO2_1), 116 regmap_reg_range(DA9121_REG_BUCK_BUCK1_0, DA9121_REG_BUCK_BUCK1_2), 117 regmap_reg_range(DA9121_REG_BUCK_BUCK1_4, DA9121_REG_BUCK_BUCK1_7), 118 regmap_reg_range(DA9xxx_REG_BUCK_BUCK2_0, DA9xxx_REG_BUCK_BUCK2_2), 119 regmap_reg_range(DA9xxx_REG_BUCK_BUCK2_4, DA9xxx_REG_BUCK_BUCK2_7), 120}; 121 122static const struct regmap_access_table da9121_2ch_writeable_table = { 123 .yes_ranges = da9121_2ch_writeable_ranges, 124 .n_yes_ranges = ARRAY_SIZE(da9121_2ch_writeable_ranges), 125}; 126 127 128static const struct regmap_range da9121_volatile_ranges[] = { 129 regmap_reg_range(DA9121_REG_SYS_STATUS_0, DA9121_REG_SYS_EVENT_2), 130 regmap_reg_range(DA9121_REG_SYS_GPIO0_0, DA9121_REG_SYS_GPIO2_1), 131 regmap_reg_range(DA9121_REG_BUCK_BUCK1_0, DA9121_REG_BUCK_BUCK1_6), 132}; 133 134static const struct regmap_access_table da9121_volatile_table = { 135 .yes_ranges = da9121_volatile_ranges, 136 .n_yes_ranges = ARRAY_SIZE(da9121_volatile_ranges), 137}; 138 139/* DA9121 regmap config for 1 channel variants */ 140static struct regmap_config da9121_1ch_regmap_config = { 141 .reg_bits = 8, 142 .val_bits = 8, 143 .max_register = DA9121_REG_OTP_CONFIG_ID, 144 .rd_table = &da9121_1ch_readable_table, 145 .wr_table = &da9121_1ch_writeable_table, 146 .volatile_table = &da9121_volatile_table, 147 .cache_type = REGCACHE_RBTREE, 148}; 149 150/* DA9121 regmap config for 2 channel variants */ 151static struct regmap_config da9121_2ch_regmap_config = { 152 .reg_bits = 8, 153 .val_bits = 8, 154 .max_register = DA9121_REG_OTP_CONFIG_ID, 155 .rd_table = &da9121_2ch_readable_table, 156 .wr_table = &da9121_2ch_writeable_table, 157 .volatile_table = &da9121_volatile_table, 158 .cache_type = REGCACHE_RBTREE, 159}; 160 161static int da9121_check_device_type(struct i2c_client *i2c, struct da9121 *chip) 162{ 163 u32 device_id; 164 u8 chip_id = chip->variant_id; 165 u32 variant_id; 166 u8 variant_mrc, variant_vrc; 167 char *type; 168 const char *name; 169 bool config_match = false; 170 int ret = 0; 171 172 ret = regmap_read(chip->regmap, DA9121_REG_OTP_DEVICE_ID, &device_id); 173 if (ret < 0) { 174 dev_err(chip->dev, "Cannot read device ID: %d\n", ret); 175 goto error; 176 } 177 178 ret = regmap_read(chip->regmap, DA9121_REG_OTP_VARIANT_ID, &variant_id); 179 if (ret < 0) { 180 dev_err(chip->dev, "Cannot read variant ID: %d\n", ret); 181 goto error; 182 } 183 184 if (device_id != DA9121_DEVICE_ID) { 185 dev_err(chip->dev, "Invalid device ID: 0x%02x\n", device_id); 186 ret = -ENODEV; 187 goto error; 188 } 189 190 variant_vrc = variant_id & DA9121_MASK_OTP_VARIANT_ID_VRC; 191 192 switch (variant_vrc) { 193 case DA9121_VARIANT_VRC: 194 type = "DA9121/DA9130"; 195 config_match = (chip_id == DA9121_TYPE_DA9121_DA9130); 196 break; 197 case DA9220_VARIANT_VRC: 198 type = "DA9220/DA9132"; 199 config_match = (chip_id == DA9121_TYPE_DA9220_DA9132); 200 break; 201 case DA9122_VARIANT_VRC: 202 type = "DA9122/DA9131"; 203 config_match = (chip_id == DA9121_TYPE_DA9122_DA9131); 204 break; 205 case DA9217_VARIANT_VRC: 206 type = "DA9217"; 207 config_match = (chip_id == DA9121_TYPE_DA9217); 208 break; 209 default: 210 type = "Unknown"; 211 break; 212 } 213 214 dev_info(chip->dev, 215 "Device detected (device-ID: 0x%02X, var-ID: 0x%02X, %s)\n", 216 device_id, variant_id, type); 217 218 if (!config_match) { 219 dev_err(chip->dev, "Device tree configuration '%s' does not match detected device.\n", name); 220 ret = -EINVAL; 221 goto error; 222 } 223 224 variant_mrc = (variant_id & DA9121_MASK_OTP_VARIANT_ID_MRC) 225 >> DA9121_SHIFT_OTP_VARIANT_ID_MRC; 226 227 if ((device_id == DA9121_DEVICE_ID) && 228 (variant_mrc < DA9121_VARIANT_MRC_BASE)) { 229 dev_err(chip->dev, 230 "Cannot support variant MRC: 0x%02X\n", variant_mrc); 231 ret = -EINVAL; 232 } 233error: 234 return ret; 235} 236 237static int da9121_assign_chip_model(struct i2c_client *i2c, 238 struct da9121 *chip) 239{ 240 struct regmap_config *regmap; 241 int ret = 0; 242 243 chip->dev = &i2c->dev; 244 245 switch (chip->variant_id) { 246 case DA9121_TYPE_DA9121_DA9130: 247 fallthrough; 248 case DA9121_TYPE_DA9217: 249 regmap = &da9121_1ch_regmap_config; 250 break; 251 case DA9121_TYPE_DA9122_DA9131: 252 fallthrough; 253 case DA9121_TYPE_DA9220_DA9132: 254 regmap = &da9121_2ch_regmap_config; 255 break; 256 } 257 258 chip->regmap = devm_regmap_init_i2c(i2c, regmap); 259 if (IS_ERR(chip->regmap)) { 260 ret = PTR_ERR(chip->regmap); 261 dev_err(chip->dev, "Failed to configure a register map: %d\n", 262 ret); 263 } 264 265 ret = da9121_check_device_type(i2c, chip); 266 267 return ret; 268} 269 |
|
61static const struct of_device_id da9121_dt_ids[] = { 62 { .compatible = "dlg,da9121", .data = (void *) DA9121_TYPE_DA9121_DA9130 }, 63 { .compatible = "dlg,da9130", .data = (void *) DA9121_TYPE_DA9121_DA9130 }, 64 { .compatible = "dlg,da9217", .data = (void *) DA9121_TYPE_DA9217 }, 65 { .compatible = "dlg,da9122", .data = (void *) DA9121_TYPE_DA9122_DA9131 }, 66 { .compatible = "dlg,da9131", .data = (void *) DA9121_TYPE_DA9122_DA9131 }, 67 { .compatible = "dlg,da9220", .data = (void *) DA9121_TYPE_DA9220_DA9132 }, 68 { .compatible = "dlg,da9132", .data = (void *) DA9121_TYPE_DA9220_DA9132 }, --- 15 unchanged lines hidden (view full) --- 84static int da9121_i2c_probe(struct i2c_client *i2c, 85 const struct i2c_device_id *id) 86{ 87 struct da9121 *chip; 88 int ret = 0; 89 struct device *dev = &i2c->dev; 90 struct regulator_config config = {}; 91 struct regulator_dev *rdev; | 270static const struct of_device_id da9121_dt_ids[] = { 271 { .compatible = "dlg,da9121", .data = (void *) DA9121_TYPE_DA9121_DA9130 }, 272 { .compatible = "dlg,da9130", .data = (void *) DA9121_TYPE_DA9121_DA9130 }, 273 { .compatible = "dlg,da9217", .data = (void *) DA9121_TYPE_DA9217 }, 274 { .compatible = "dlg,da9122", .data = (void *) DA9121_TYPE_DA9122_DA9131 }, 275 { .compatible = "dlg,da9131", .data = (void *) DA9121_TYPE_DA9122_DA9131 }, 276 { .compatible = "dlg,da9220", .data = (void *) DA9121_TYPE_DA9220_DA9132 }, 277 { .compatible = "dlg,da9132", .data = (void *) DA9121_TYPE_DA9220_DA9132 }, --- 15 unchanged lines hidden (view full) --- 293static int da9121_i2c_probe(struct i2c_client *i2c, 294 const struct i2c_device_id *id) 295{ 296 struct da9121 *chip; 297 int ret = 0; 298 struct device *dev = &i2c->dev; 299 struct regulator_config config = {}; 300 struct regulator_dev *rdev; |
92 struct regmap *regmap; | |
93 94 chip = devm_kzalloc(&i2c->dev, sizeof(struct da9121), GFP_KERNEL); 95 if (!chip) { 96 ret = -ENOMEM; 97 goto error; 98 } 99 100 chip->variant_id = da9121_of_get_id(&i2c->dev); 101 | 301 302 chip = devm_kzalloc(&i2c->dev, sizeof(struct da9121), GFP_KERNEL); 303 if (!chip) { 304 ret = -ENOMEM; 305 goto error; 306 } 307 308 chip->variant_id = da9121_of_get_id(&i2c->dev); 309 |
102 regmap = devm_regmap_init_i2c(i2c, &da9121_regmap_config); 103 if (IS_ERR(regmap)) 104 return PTR_ERR(regmap); | 310 ret = da9121_assign_chip_model(i2c, chip); 311 if (ret < 0) 312 goto error; |
105 106 config.dev = &i2c->dev; 107 config.of_node = dev->of_node; | 313 314 config.dev = &i2c->dev; 315 config.of_node = dev->of_node; |
108 config.regmap = regmap; | 316 config.regmap = chip->regmap; |
109 110 rdev = devm_regulator_register(&i2c->dev, &da9121_reg, &config); 111 if (IS_ERR(rdev)) { 112 dev_err(&i2c->dev, "Failed to register da9121 regulator\n"); 113 return PTR_ERR(rdev); 114 } 115 116error: --- 27 unchanged lines hidden --- | 317 318 rdev = devm_regulator_register(&i2c->dev, &da9121_reg, &config); 319 if (IS_ERR(rdev)) { 320 dev_err(&i2c->dev, "Failed to register da9121 regulator\n"); 321 return PTR_ERR(rdev); 322 } 323 324error: --- 27 unchanged lines hidden --- |