1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (c) 2021 Rockchip Electronics Co., Ltd 4 */ 5 #include <common.h> 6 #include <dm.h> 7 #include <errno.h> 8 #include <i2c.h> 9 #include <syscon.h> 10 #include <asm/gpio.h> 11 #include <power/regulator.h> 12 #include <asm/arch/clock.h> 13 #include <asm/io.h> 14 15 DECLARE_GLOBAL_DATA_PTR; 16 17 /* Voltage setting */ 18 19 #define RK860X_VSEL0_A 0x00 20 #define RK860X_VSEL1_A 0x01 21 #define RK860X_VSEL0_B 0x06 22 #define RK860X_VSEL1_B 0x07 23 #define RK860X_MAX_SET 0x08 24 25 /* Control register */ 26 #define RK860X_CONTROL 0x02 27 /* IC Type */ 28 #define RK860X_ID1 0x03 29 /* IC mask version */ 30 #define RK860X_ID2 0x04 31 /* Monitor register */ 32 #define RK860X_MONITOR 0x05 33 34 /* VSEL bit definitions */ 35 #define VSEL_BUCK_EN BIT(7) 36 #define VSEL_MODE BIT(6) 37 #define VSEL_A_NSEL_MASK 0x3F 38 #define VSEL_B_NSEL_MASK 0xff 39 40 /* Chip ID */ 41 #define DIE_ID 0x0F 42 #define DIE_REV 0x0F 43 /* Control bit definitions */ 44 #define CTL_OUTPUT_DISCHG BIT(7) 45 #define CTL_SLEW_MASK (0x7 << 4) 46 #define CTL_SLEW_SHIFT 4 47 #define CTL_RESET BIT(2) 48 49 #define RK860X_NVOLTAGES_64 64 50 #define RK860X_NVOLTAGES_160 160 51 52 /* IC Type */ 53 enum { 54 RK860X_CHIP_ID_00 = 0, 55 RK860X_CHIP_ID_01, 56 RK860X_CHIP_ID_02, 57 RK860X_CHIP_ID_03, 58 }; 59 60 struct rk860x_regulator_info { 61 struct udevice *dev; 62 /* IC Type and Rev */ 63 int chip_id; 64 /* Voltage setting register */ 65 unsigned int vol_reg; 66 unsigned int sleep_reg; 67 unsigned int en_reg; 68 unsigned int sleep_en_reg; 69 unsigned int mode_reg; 70 unsigned int vol_mask; 71 unsigned int mode_mask; 72 unsigned int n_voltages; 73 /* Voltage range and step(linear) */ 74 unsigned int vsel_min; 75 unsigned int vsel_step; 76 struct gpio_desc vsel_gpio; 77 struct gpio_desc en_gpio; 78 unsigned int sleep_vsel_id; 79 }; 80 81 static int rk860x_write(struct udevice *dev, uint reg, const uint8_t *buff, 82 int len) 83 { 84 int ret; 85 86 ret = dm_i2c_write(dev, reg, buff, len); 87 if (ret) { 88 debug("%s: write reg 0x%02x failed, ret=%d\n", 89 __func__, reg, ret); 90 return ret; 91 } 92 93 return 0; 94 } 95 96 static int rk860x_read(struct udevice *dev, uint reg, uint8_t *buff, int len) 97 { 98 int ret; 99 100 ret = dm_i2c_read(dev, reg, buff, len); 101 if (ret) { 102 debug("%s: read reg 0x%02x failed, ret=%d\n", 103 __func__, reg, ret); 104 return ret; 105 } 106 107 return 0; 108 } 109 110 int rk860x_reg_read(struct udevice *dev, uint reg) 111 { 112 u8 byte; 113 int ret; 114 115 debug("%s: reg=%x", __func__, reg); 116 ret = rk860x_read(dev, reg, &byte, 1); 117 debug(", value=%x, ret=%d\n", byte, ret); 118 119 return ret ? ret : byte; 120 } 121 122 int rk860x_reg_write(struct udevice *dev, uint reg, uint value) 123 { 124 u8 byte = value; 125 int ret; 126 127 debug("%s: reg=%x, value=%x", __func__, reg, value); 128 ret = rk860x_write(dev, reg, &byte, 1); 129 debug(", ret=%d\n", ret); 130 131 return ret; 132 } 133 134 int rk860x_clrsetbits(struct udevice *dev, uint reg, uint clr, uint set) 135 { 136 u8 byte; 137 int ret; 138 139 ret = rk860x_reg_read(dev, reg); 140 if (ret < 0) 141 return ret; 142 byte = (ret & ~clr) | set; 143 144 return rk860x_reg_write(dev, reg, byte); 145 } 146 147 static int rk860x_regulator_set_enable(struct udevice *dev, bool enable) 148 { 149 struct rk860x_regulator_info *priv = dev_get_priv(dev); 150 int val, sleep_vsel_id; 151 152 if (enable) { 153 val = VSEL_BUCK_EN; 154 sleep_vsel_id = !priv->sleep_vsel_id; 155 } else { 156 val = 0; 157 sleep_vsel_id = priv->sleep_vsel_id; 158 } 159 160 if (dm_gpio_is_valid(&priv->vsel_gpio)) { 161 dm_gpio_set_value(&priv->vsel_gpio, sleep_vsel_id); 162 return 0; 163 } 164 rk860x_clrsetbits(dev, priv->en_reg, VSEL_BUCK_EN, val); 165 166 return 0; 167 } 168 169 static int rk860x_regulator_get_enable(struct udevice *dev) 170 { 171 struct rk860x_regulator_info *priv = dev_get_priv(dev); 172 int val; 173 174 if (dm_gpio_is_valid(&priv->vsel_gpio)) { 175 if (priv->sleep_vsel_id) 176 return !dm_gpio_get_value(&priv->vsel_gpio); 177 else 178 return dm_gpio_get_value(&priv->vsel_gpio); 179 } 180 181 val = rk860x_reg_read(dev, priv->en_reg); 182 if (val & VSEL_BUCK_EN) 183 return 1; 184 else 185 return 0; 186 } 187 188 static int rk860x_regulator_set_suspend_enable(struct udevice *dev, 189 bool enable) 190 { 191 struct rk860x_regulator_info *priv = dev_get_priv(dev); 192 int val; 193 194 if (enable) 195 val = VSEL_BUCK_EN; 196 else 197 val = 0; 198 199 rk860x_clrsetbits(dev, priv->sleep_en_reg, VSEL_BUCK_EN, val); 200 201 return 0; 202 } 203 204 static int rk860x_regulator_get_suspend_enable(struct udevice *dev) 205 { 206 struct rk860x_regulator_info *priv = dev_get_priv(dev); 207 int val; 208 209 val = rk860x_reg_read(dev, priv->sleep_en_reg); 210 if (val & VSEL_BUCK_EN) 211 return 1; 212 else 213 return 0; 214 } 215 216 static int rk860x_regulator_get_voltage(struct udevice *dev) 217 { 218 struct rk860x_regulator_info *priv = dev_get_priv(dev); 219 int uvolt = 0, val; 220 221 val = rk860x_reg_read(dev, priv->vol_reg); 222 val &= priv->vol_mask; 223 uvolt = (val * priv->vsel_step) + priv->vsel_min; 224 225 return uvolt; 226 } 227 228 static int rk860x_regulator_set_voltage(struct udevice *dev, int uvolt) 229 { 230 struct rk860x_regulator_info *priv = dev_get_priv(dev); 231 int val; 232 233 val = ((uvolt - priv->vsel_min) / priv->vsel_step); 234 rk860x_clrsetbits(dev, priv->vol_reg, priv->vol_mask, val); 235 236 return 0; 237 } 238 239 static int rk860x_regulator_get_suspend_voltage(struct udevice *dev) 240 { 241 struct rk860x_regulator_info *priv = dev_get_priv(dev); 242 int uvolt = 0, val; 243 244 val = rk860x_reg_read(dev, priv->sleep_reg); 245 val &= priv->vol_mask; 246 uvolt = (val * priv->vsel_step) + priv->vsel_min; 247 248 return uvolt; 249 } 250 251 static int rk860x_regulator_set_suspend_voltage(struct udevice *dev, 252 int uvolt) 253 { 254 struct rk860x_regulator_info *priv = dev_get_priv(dev); 255 int val; 256 257 val = ((uvolt - priv->vsel_min) / priv->vsel_step); 258 rk860x_clrsetbits(dev, priv->sleep_reg, priv->vol_mask, val); 259 260 return 0; 261 } 262 263 /* For 00,01 options: 264 * VOUT = 0.7125V + NSELx * 12.5mV, from 0.7125 to 1.5V. 265 * For 02,03 options: 266 * VOUT = 0.5V + NSELx * 6.25mV, from 0.5 to 1.5V. 267 */ 268 static int rk860x_device_setup(struct rk860x_regulator_info *di) 269 { 270 int ret = 0; 271 272 switch (di->chip_id) { 273 case RK860X_CHIP_ID_00: 274 case RK860X_CHIP_ID_01: 275 di->vsel_min = 712500; 276 di->vsel_step = 12500; 277 di->n_voltages = RK860X_NVOLTAGES_64; 278 di->vol_mask = VSEL_A_NSEL_MASK; 279 if (di->sleep_vsel_id) { 280 di->sleep_reg = RK860X_VSEL1_A; 281 di->vol_reg = RK860X_VSEL0_A; 282 di->mode_reg = RK860X_VSEL0_A; 283 di->en_reg = RK860X_VSEL0_A; 284 di->sleep_en_reg = RK860X_VSEL1_A; 285 } else { 286 di->sleep_reg = RK860X_VSEL0_A; 287 di->vol_reg = RK860X_VSEL1_A; 288 di->mode_reg = RK860X_VSEL1_A; 289 di->en_reg = RK860X_VSEL1_A; 290 di->sleep_en_reg = RK860X_VSEL0_A; 291 } 292 break; 293 case RK860X_CHIP_ID_02: 294 case RK860X_CHIP_ID_03: 295 di->vsel_min = 500000; 296 di->vsel_step = 6250; 297 di->n_voltages = RK860X_NVOLTAGES_160; 298 di->vol_mask = VSEL_B_NSEL_MASK; 299 if (di->sleep_vsel_id) { 300 di->sleep_reg = RK860X_VSEL1_B; 301 di->vol_reg = RK860X_VSEL0_B; 302 di->mode_reg = RK860X_VSEL0_A; 303 di->en_reg = RK860X_VSEL0_A; 304 di->sleep_en_reg = RK860X_VSEL1_A; 305 } else { 306 di->sleep_reg = RK860X_VSEL0_B; 307 di->vol_reg = RK860X_VSEL1_B; 308 di->mode_reg = RK860X_VSEL1_A; 309 di->en_reg = RK860X_VSEL1_A; 310 di->sleep_en_reg = RK860X_VSEL0_A; 311 } 312 break; 313 default: 314 dev_err(di->dev, 315 "Chip ID %d not supported!\n", 316 di->chip_id); 317 return -EINVAL; 318 } 319 320 di->mode_mask = VSEL_MODE; 321 322 return ret; 323 } 324 325 static int rk860x_regulator_ofdata_to_platdata(struct udevice *dev) 326 { 327 struct rk860x_regulator_info *priv = dev_get_priv(dev); 328 int ret; 329 330 priv->sleep_vsel_id = dev_read_u32_default(dev, 331 "rockchip,suspend-voltage-selector", 332 1); 333 334 ret = gpio_request_by_name(dev, "vsel-gpios", 0, 335 &priv->vsel_gpio, GPIOD_IS_OUT); 336 if (ret) 337 dev_err(dev, "vsel-gpios- not found! Error: %d\n", ret); 338 339 if (dm_gpio_is_valid(&priv->vsel_gpio)) 340 dm_gpio_set_value(&priv->vsel_gpio, !priv->sleep_vsel_id); 341 342 ret = gpio_request_by_name(dev, "en-gpios", 0, 343 &priv->en_gpio, GPIOD_IS_OUT); 344 if (ret) 345 dev_err(dev, "en-gpios- not found! Error: %d\n", ret); 346 347 if (dm_gpio_is_valid(&priv->en_gpio)) 348 dm_gpio_set_value(&priv->en_gpio, 1); 349 350 return 0; 351 } 352 353 static int rk860x_regulator_probe(struct udevice *dev) 354 { 355 struct rk860x_regulator_info *di = dev_get_priv(dev); 356 struct dm_regulator_uclass_platdata *uc_pdata; 357 u8 val; 358 int ret; 359 360 uc_pdata = dev_get_uclass_platdata(dev); 361 uc_pdata->type = REGULATOR_TYPE_BUCK; 362 uc_pdata->mode_count = 0; 363 364 /* Get chip ID */ 365 val = rk860x_reg_read(dev, RK860X_ID1); 366 if (val < 0) { 367 dev_err(dev, "Failed to get chip ID!\n"); 368 return val; 369 } 370 if ((val & DIE_ID) == 0x8) 371 di->chip_id = RK860X_CHIP_ID_00; 372 else 373 di->chip_id = RK860X_CHIP_ID_02; 374 375 debug("RK860X Option[%d] Detected!\n", val & DIE_ID); 376 377 /* Device init */ 378 ret = rk860x_device_setup(di); 379 if (ret < 0) { 380 dev_err(dev, "Failed to setup device!\n"); 381 return ret; 382 } 383 384 return 0; 385 } 386 387 static const struct udevice_id rk860x_id[] = { 388 { 389 .compatible = "rockchip,rk860x", 390 }, 391 { }, 392 }; 393 394 static const struct dm_regulator_ops rk860x_regulator_ops = { 395 .get_value = rk860x_regulator_get_voltage, 396 .set_value = rk860x_regulator_set_voltage, 397 .set_suspend_value = rk860x_regulator_set_suspend_voltage, 398 .get_suspend_value = rk860x_regulator_get_suspend_voltage, 399 .set_enable = rk860x_regulator_set_enable, 400 .get_enable = rk860x_regulator_get_enable, 401 .set_suspend_enable = rk860x_regulator_set_suspend_enable, 402 .get_suspend_enable = rk860x_regulator_get_suspend_enable, 403 }; 404 405 U_BOOT_DRIVER(rk860x_regulator) = { 406 .name = "rk860x_regulator", 407 .id = UCLASS_REGULATOR, 408 .ops = &rk860x_regulator_ops, 409 .probe = rk860x_regulator_probe, 410 .of_match = rk860x_id, 411 .ofdata_to_platdata = rk860x_regulator_ofdata_to_platdata, 412 .priv_auto_alloc_size = sizeof(struct rk860x_regulator_info), 413 }; 414 415