Lines Matching +full:rk860x +full:- +full:reg
1 // SPDX-License-Identifier: GPL-2.0
112 ret = regmap_read(di->regmap, RK860X_MAX_SET, &val); in rk860x_get_voltage()
130 ret = regmap_update_bits(di->regmap, di->sleep_reg, in rk860x_set_suspend_voltage()
131 di->vol_mask, ret); in rk860x_set_suspend_voltage()
142 return regmap_update_bits(di->regmap, di->sleep_en_reg, in rk860x_set_suspend_enable()
150 return regmap_update_bits(di->regmap, di->sleep_en_reg, in rk860x_set_suspend_disable()
158 if (!rdev->constraints->state_mem.changeable) in rk860x_resume()
172 if (di->vsel_gpio) { in rk860x_set_enable()
173 gpiod_set_raw_value(di->vsel_gpio, !di->sleep_vsel_id); in rk860x_set_enable()
177 return regmap_update_bits(di->regmap, di->en_reg, in rk860x_set_enable()
185 if (di->vsel_gpio) { in rk860x_set_disable()
186 gpiod_set_raw_value(di->vsel_gpio, di->sleep_vsel_id); in rk860x_set_disable()
190 return regmap_update_bits(di->regmap, di->en_reg, in rk860x_set_disable()
200 if (di->vsel_gpio) { in rk860x_is_enabled()
201 if (di->sleep_vsel_id) in rk860x_is_enabled()
202 return !gpiod_get_raw_value(di->vsel_gpio); in rk860x_is_enabled()
204 return gpiod_get_raw_value(di->vsel_gpio); in rk860x_is_enabled()
207 ret = regmap_read(di->regmap, di->en_reg, &val); in rk860x_is_enabled()
222 regmap_update_bits(di->regmap, di->mode_reg, in rk860x_set_mode()
223 di->mode_mask, di->mode_mask); in rk860x_set_mode()
226 regmap_update_bits(di->regmap, di->mode_reg, di->mode_mask, 0); in rk860x_set_mode()
229 return -EINVAL; in rk860x_set_mode()
240 ret = regmap_read(di->regmap, di->mode_reg, &val); in rk860x_get_mode()
243 if (val & di->mode_mask) in rk860x_get_mode()
263 int regval = -1, i; in rk860x_set_ramp()
278 dev_err(di->dev, "unsupported ramp value %d\n", ramp); in rk860x_set_ramp()
279 return -EINVAL; in rk860x_set_ramp()
282 return regmap_update_bits(di->regmap, di->slew_reg, in rk860x_set_ramp()
283 di->slew_mask, regval << di->slew_shift); in rk860x_set_ramp()
315 switch (di->chip_id) { in rk860x_device_setup()
318 di->vsel_min = 712500; in rk860x_device_setup()
319 di->vsel_step = 12500; in rk860x_device_setup()
320 di->n_voltages = RK860X_NVOLTAGES_64; in rk860x_device_setup()
321 di->vol_mask = VSEL_A_NSEL_MASK; in rk860x_device_setup()
322 if (di->sleep_vsel_id) { in rk860x_device_setup()
323 di->sleep_reg = RK860X_VSEL1_A; in rk860x_device_setup()
324 di->vol_reg = RK860X_VSEL0_A; in rk860x_device_setup()
325 di->mode_reg = RK860X_VSEL0_A; in rk860x_device_setup()
326 di->en_reg = RK860X_VSEL0_A; in rk860x_device_setup()
327 di->sleep_en_reg = RK860X_VSEL1_A; in rk860x_device_setup()
329 di->sleep_reg = RK860X_VSEL0_A; in rk860x_device_setup()
330 di->vol_reg = RK860X_VSEL1_A; in rk860x_device_setup()
331 di->mode_reg = RK860X_VSEL1_A; in rk860x_device_setup()
332 di->en_reg = RK860X_VSEL1_A; in rk860x_device_setup()
333 di->sleep_en_reg = RK860X_VSEL0_A; in rk860x_device_setup()
338 di->vsel_min = 500000; in rk860x_device_setup()
339 di->vsel_step = 6250; in rk860x_device_setup()
340 di->n_voltages = RK860X_NVOLTAGES_160; in rk860x_device_setup()
341 di->vol_mask = VSEL_B_NSEL_MASK; in rk860x_device_setup()
342 if (di->sleep_vsel_id) { in rk860x_device_setup()
343 di->sleep_reg = RK860X_VSEL1_B; in rk860x_device_setup()
344 di->vol_reg = RK860X_VSEL0_B; in rk860x_device_setup()
345 di->mode_reg = RK860X_VSEL0_A; in rk860x_device_setup()
346 di->en_reg = RK860X_VSEL0_A; in rk860x_device_setup()
347 di->sleep_en_reg = RK860X_VSEL1_A; in rk860x_device_setup()
349 di->sleep_reg = RK860X_VSEL0_B; in rk860x_device_setup()
350 di->vol_reg = RK860X_VSEL1_B; in rk860x_device_setup()
351 di->mode_reg = RK860X_VSEL1_A; in rk860x_device_setup()
352 di->en_reg = RK860X_VSEL1_A; in rk860x_device_setup()
353 di->sleep_en_reg = RK860X_VSEL0_A; in rk860x_device_setup()
357 dev_err(di->dev, "Chip ID %d not supported!\n", di->chip_id); in rk860x_device_setup()
358 return -EINVAL; in rk860x_device_setup()
361 di->mode_mask = VSEL_MODE; in rk860x_device_setup()
362 di->slew_reg = RK860X_CONTROL; in rk860x_device_setup()
363 di->slew_mask = CTL_SLEW_MASK; in rk860x_device_setup()
364 di->slew_shift = CTL_SLEW_SHIFT; in rk860x_device_setup()
366 if (pdata->limit_volt) { in rk860x_device_setup()
367 if (pdata->limit_volt < di->vsel_min || in rk860x_device_setup()
368 pdata->limit_volt > 1500000) in rk860x_device_setup()
369 pdata->limit_volt = 1500000; in rk860x_device_setup()
370 val = (pdata->limit_volt - di->vsel_min) / di->vsel_step; in rk860x_device_setup()
371 ret = regmap_write(di->regmap, RK860X_MAX_SET, val); in rk860x_device_setup()
373 dev_err(di->dev, "Failed to set limit voltage!\n"); in rk860x_device_setup()
384 struct regulator_desc *rdesc = &di->desc; in rk860x_regulator_register()
386 rdesc->name = "rk860x-reg"; in rk860x_regulator_register()
387 rdesc->supply_name = "vin"; in rk860x_regulator_register()
388 rdesc->ops = &rk860x_regulator_ops; in rk860x_regulator_register()
389 rdesc->type = REGULATOR_VOLTAGE; in rk860x_regulator_register()
390 rdesc->n_voltages = di->n_voltages; in rk860x_regulator_register()
391 rdesc->enable_reg = di->en_reg; in rk860x_regulator_register()
392 rdesc->enable_mask = VSEL_BUCK_EN; in rk860x_regulator_register()
393 rdesc->min_uV = di->vsel_min; in rk860x_regulator_register()
394 rdesc->uV_step = di->vsel_step; in rk860x_regulator_register()
395 rdesc->vsel_reg = di->vol_reg; in rk860x_regulator_register()
396 rdesc->vsel_mask = di->vol_mask; in rk860x_regulator_register()
397 rdesc->owner = THIS_MODULE; in rk860x_regulator_register()
398 rdesc->enable_time = 400; in rk860x_regulator_register()
400 di->rdev = devm_regulator_register(di->dev, &di->desc, config); in rk860x_regulator_register()
401 return PTR_ERR_OR_ZERO(di->rdev); in rk860x_regulator_register()
421 pdata->regulator = of_get_regulator_init_data(dev, np, desc); in rk860x_parse_dt()
422 pdata->regulator->constraints.initial_state = PM_SUSPEND_MEM; in rk860x_parse_dt()
424 if (!(of_property_read_u32(np, "limit-microvolt", &limit_volt))) in rk860x_parse_dt()
425 pdata->limit_volt = limit_volt; in rk860x_parse_dt()
427 ret = of_property_read_u32(np, "rockchip,suspend-voltage-selector", in rk860x_parse_dt()
430 pdata->sleep_vsel_id = tmp; in rk860x_parse_dt()
432 if (pdata->sleep_vsel_id) in rk860x_parse_dt()
437 pdata->vsel_gpio = devm_gpiod_get_index_optional(dev, "vsel", 0, flag); in rk860x_parse_dt()
438 if (IS_ERR(pdata->vsel_gpio)) { in rk860x_parse_dt()
439 ret = PTR_ERR(pdata->vsel_gpio); in rk860x_parse_dt()
441 pdata->vsel_gpio = NULL; in rk860x_parse_dt()
472 struct device_node *np = client->dev.of_node; in rk860x_regulator_probe()
479 di = devm_kzalloc(&client->dev, sizeof(*di), GFP_KERNEL); in rk860x_regulator_probe()
481 return -ENOMEM; in rk860x_regulator_probe()
483 di->desc.of_map_mode = rk860x_map_mode; in rk860x_regulator_probe()
485 pdata = dev_get_platdata(&client->dev); in rk860x_regulator_probe()
487 pdata = rk860x_parse_dt(&client->dev, np, &di->desc); in rk860x_regulator_probe()
489 if (!pdata || !pdata->regulator) { in rk860x_regulator_probe()
490 dev_err(&client->dev, "Platform data not found!\n"); in rk860x_regulator_probe()
491 return -ENODEV; in rk860x_regulator_probe()
494 di->vsel_gpio = pdata->vsel_gpio; in rk860x_regulator_probe()
495 di->sleep_vsel_id = pdata->sleep_vsel_id; in rk860x_regulator_probe()
497 di->regulator = pdata->regulator; in rk860x_regulator_probe()
498 if (client->dev.of_node) { in rk860x_regulator_probe()
499 di->chip_id = in rk860x_regulator_probe()
500 (unsigned long)of_device_get_match_data(&client->dev); in rk860x_regulator_probe()
503 if (!di->regulator->constraints.ramp_delay) { in rk860x_regulator_probe()
504 int slew_idx = (pdata->slew_rate & 0x7) in rk860x_regulator_probe()
505 ? pdata->slew_rate : 0; in rk860x_regulator_probe()
507 di->regulator->constraints.ramp_delay = in rk860x_regulator_probe()
510 di->chip_id = id->driver_data; in rk860x_regulator_probe()
513 di->regmap = devm_regmap_init_i2c(client, &rk860x_regmap_config); in rk860x_regulator_probe()
514 if (IS_ERR(di->regmap)) { in rk860x_regulator_probe()
515 dev_err(&client->dev, "Failed to allocate regmap!\n"); in rk860x_regulator_probe()
516 return PTR_ERR(di->regmap); in rk860x_regulator_probe()
518 di->dev = &client->dev; in rk860x_regulator_probe()
521 ret = regmap_read(di->regmap, RK860X_ID1, &val); in rk860x_regulator_probe()
523 dev_err(&client->dev, "Failed to get chip ID!\n"); in rk860x_regulator_probe()
527 switch (di->chip_id) { in rk860x_regulator_probe()
531 dev_err(&client->dev, "Failed to match chip ID!\n"); in rk860x_regulator_probe()
532 return -EINVAL; in rk860x_regulator_probe()
538 dev_err(&client->dev, "Failed to match chip ID!\n"); in rk860x_regulator_probe()
539 return -EINVAL; in rk860x_regulator_probe()
543 return -EINVAL; in rk860x_regulator_probe()
549 dev_err(&client->dev, "Failed to setup device!\n"); in rk860x_regulator_probe()
553 config.dev = di->dev; in rk860x_regulator_probe()
554 config.init_data = di->regulator; in rk860x_regulator_probe()
555 config.regmap = di->regmap; in rk860x_regulator_probe()
561 dev_err(&client->dev, "Failed to register regulator!\n"); in rk860x_regulator_probe()
573 dev_info(di->dev, "rk860..... reset\n"); in rk860x_regulator_shutdown()
575 ret = regmap_update_bits(di->regmap, di->slew_reg, in rk860x_regulator_shutdown()
579 dev_err(di->dev, "force rk860x_reset error! ret=%d\n", ret); in rk860x_regulator_shutdown()
581 dev_info(di->dev, "force rk860x_reset ok!\n"); in rk860x_regulator_shutdown()
595 .name = "rk860-regulator",
605 MODULE_AUTHOR("Elaine Zhang <zhangqing@rock-chips.com>");
606 MODULE_DESCRIPTION("rk860x regulator driver");