Lines Matching +full:single +full:- +full:chip

1 // SPDX-License-Identifier: GPL-2.0-only
3 // DA9121 Single-channel dual-phase 10A buck converter
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)
30 #include "da9121-regulator.h"
32 /* Chip data */
118 int buck_id; /* 0=core, 1/2-buck */
124 char *warn; /* if NULL, notify - otherwise dev_warn this string */
147 * re-occur. When this driver starts, it is expected that these will have
148 * self-cleared for when the IRQs are enabled, so these should never be seen.
172 struct da9121 *chip = rdev_get_drvdata(rdev); in da9121_get_current_limit() local
175 variant_parameters[chip->variant_id].current_range; in da9121_get_current_limit()
179 ret = regmap_read(chip->regmap, da9121_current_field[id].reg, &val); in da9121_get_current_limit()
181 dev_err(chip->dev, "Cannot read BUCK register: %d\n", ret); in da9121_get_current_limit()
185 if (val < range->reg_min) { in da9121_get_current_limit()
186 ret = -EACCES; in da9121_get_current_limit()
190 if (val > range->reg_max) { in da9121_get_current_limit()
191 ret = -EINVAL; in da9121_get_current_limit()
195 return range->val_min + (range->val_stp * (val - range->reg_min)); in da9121_get_current_limit()
204 struct da9121 *chip = rdev_get_drvdata(rdev); in da9121_ceiling_selector() local
206 variant_parameters[chip->variant_id].current_range; in da9121_ceiling_selector()
212 if (range->val_min > max || range->val_max < min) { in da9121_ceiling_selector()
213 dev_err(chip->dev, in da9121_ceiling_selector()
215 ret = -EINVAL; in da9121_ceiling_selector()
219 level = range->val_max; in da9121_ceiling_selector()
220 for (i = range->reg_max; i >= range->reg_min; i--) { in da9121_ceiling_selector()
225 level -= range->val_stp; in da9121_ceiling_selector()
229 dev_err(chip->dev, in da9121_ceiling_selector()
231 ret = -EINVAL; in da9121_ceiling_selector()
243 struct da9121 *chip = rdev_get_drvdata(rdev); in da9121_set_current_limit() local
246 variant_parameters[chip->variant_id].current_range; in da9121_set_current_limit()
250 if (min_ua < range->val_min || in da9121_set_current_limit()
251 max_ua > range->val_max) { in da9121_set_current_limit()
252 ret = -EINVAL; in da9121_set_current_limit()
260 ret = regmap_update_bits(chip->regmap, in da9121_set_current_limit()
265 dev_err(chip->dev, "Cannot update BUCK current limit, err: %d\n", ret); in da9121_set_current_limit()
289 struct da9121 *chip = rdev_get_drvdata(rdev); in da9121_buck_set_mode() local
307 return -EINVAL; in da9121_buck_set_mode()
310 return regmap_update_bits(chip->regmap, in da9121_buck_set_mode()
318 struct da9121 *chip = rdev_get_drvdata(rdev); in da9121_buck_get_mode() local
323 ret = regmap_read(chip->regmap, da9121_mode_field[id].reg, &val); in da9121_buck_get_mode()
325 dev_err(chip->dev, "Cannot read BUCK register: %d\n", ret); in da9121_buck_get_mode()
326 return -EINVAL; in da9121_buck_get_mode()
331 return -EINVAL; in da9121_buck_get_mode()
358 struct da9121 *chip = config->driver_data; in da9121_of_parse_cb() local
362 if (chip->pdata == NULL) { in da9121_of_parse_cb()
363 pdata = devm_kzalloc(chip->dev, sizeof(*pdata), GFP_KERNEL); in da9121_of_parse_cb()
365 return -ENOMEM; in da9121_of_parse_cb()
367 pdata = chip->pdata; in da9121_of_parse_cb()
370 pdata->num_buck++; in da9121_of_parse_cb()
372 if (pdata->num_buck > variant_parameters[chip->variant_id].num_bucks) { in da9121_of_parse_cb()
373 dev_err(chip->dev, "Error: excessive regulators for device\n"); in da9121_of_parse_cb()
374 return -ENODEV; in da9121_of_parse_cb()
380 "da9121-enable"); in da9121_of_parse_cb()
382 config->ena_gpiod = ena_gpiod; in da9121_of_parse_cb()
384 if (variant_parameters[chip->variant_id].num_bucks == 2) { in da9121_of_parse_cb()
389 if (of_property_read_u32(da9121_matches[pdata->num_buck-1].of_node, in da9121_of_parse_cb()
390 "dlg,ripple-cancel", &ripple_cancel)) { in da9121_of_parse_cb()
391 if (pdata->num_buck > 1) in da9121_of_parse_cb()
396 ret = regmap_update_bits(chip->regmap, ripple_reg, in da9121_of_parse_cb()
400 dev_err(chip->dev, "Cannot set ripple mode, err: %d\n", ret); in da9121_of_parse_cb()
411 #define DA9121_N_VOLTAGES (((DA9121_MAX_MV - DA9121_MIN_MV) / DA9121_STEP_MV) \
549 struct da9121 *chip = container_of(work, struct da9121, work.work); in da9121_status_poll_on() local
556 ret = regmap_bulk_read(chip->regmap, DA9121_REG_SYS_STATUS_0, status, 2); in da9121_status_poll_on()
558 dev_err(chip->dev, in da9121_status_poll_on()
565 * and the respective state cleared - then flagged to unmask for next IRQ. in da9121_status_poll_on()
569 int reg_idx = item->reg_index; in da9121_status_poll_on()
570 bool relevant = (item->buck_id <= variant_parameters[chip->variant_id].num_bucks); in da9121_status_poll_on()
571 bool supported = (item->warn == NULL); in da9121_status_poll_on()
572 bool persisting = (chip->persistent[reg_idx] & item->event_bit); in da9121_status_poll_on()
573 bool now_cleared = !(status[reg_idx] & item->status_bit); in da9121_status_poll_on()
576 clear[reg_idx] |= item->mask_bit; in da9121_status_poll_on()
577 chip->persistent[reg_idx] &= ~item->event_bit; in da9121_status_poll_on()
586 ret = regmap_update_bits(chip->regmap, reg, mbit, 0); in da9121_status_poll_on()
588 dev_err(chip->dev, in da9121_status_poll_on()
596 if (chip->persistent[0] | chip->persistent[1]) { in da9121_status_poll_on()
597 delay = msecs_to_jiffies(chip->passive_delay); in da9121_status_poll_on()
598 queue_delayed_work(system_freezable_wq, &chip->work, delay); in da9121_status_poll_on()
607 struct da9121 *chip = data; in da9121_irq_handler() local
616 err = regmap_bulk_read(chip->regmap, DA9121_REG_SYS_EVENT_0, event, 3); in da9121_irq_handler()
618 dev_err(chip->dev, "Failed to read EVENT registers %d\n", err); in da9121_irq_handler()
623 err = regmap_bulk_read(chip->regmap, DA9121_REG_SYS_MASK_0, mask, 3); in da9121_irq_handler()
625 dev_err(chip->dev, in da9121_irq_handler()
631 rdev = chip->rdev[DA9121_IDX_BUCK1]; in da9121_irq_handler()
635 * or a warning given for unexpected events - those from device POR, and in da9121_irq_handler()
640 int reg_idx = item->reg_index; in da9121_irq_handler()
641 bool relevant = (item->buck_id <= variant_parameters[chip->variant_id].num_bucks); in da9121_irq_handler()
642 bool enabled = !(mask[reg_idx] & item->mask_bit); in da9121_irq_handler()
643 bool active = (event[reg_idx] & item->event_bit); in da9121_irq_handler()
644 bool notify = (item->warn == NULL); in da9121_irq_handler()
648 chip->persistent[reg_idx] |= item->event_bit; in da9121_irq_handler()
649 regulator_notifier_call_chain(rdev, item->notification, NULL); in da9121_irq_handler()
651 dev_warn(chip->dev, item->warn); in da9121_irq_handler()
652 handled[reg_idx] |= item->event_bit; in da9121_irq_handler()
660 dev_warn(chip->dev, in da9121_irq_handler()
672 err = regmap_update_bits(chip->regmap, reg, mbit, mbit); in da9121_irq_handler()
674 dev_err(chip->dev, in da9121_irq_handler()
685 err = regmap_bulk_write(chip->regmap, DA9121_REG_SYS_EVENT_0, handled, 3); in da9121_irq_handler()
687 dev_err(chip->dev, "Fail to write EVENTs %d\n", err); in da9121_irq_handler()
693 queue_delayed_work(system_freezable_wq, &chip->work, 0); in da9121_irq_handler()
698 static int da9121_set_regulator_config(struct da9121 *chip) in da9121_set_regulator_config() argument
701 unsigned int max_matches = variant_parameters[chip->variant_id].num_bucks; in da9121_set_regulator_config()
707 local_da9121_regulators[chip->variant_id][i]; in da9121_set_regulator_config()
709 config.dev = chip->dev; in da9121_set_regulator_config()
710 config.driver_data = chip; in da9121_set_regulator_config()
711 config.regmap = chip->regmap; in da9121_set_regulator_config()
713 chip->rdev[i] = devm_regulator_register(chip->dev, in da9121_set_regulator_config()
715 if (IS_ERR(chip->rdev[i])) { in da9121_set_regulator_config()
716 dev_err(chip->dev, "Failed to register regulator %s, %d/%d\n", in da9121_set_regulator_config()
717 regl_desc->name, (i+1), max_matches); in da9121_set_regulator_config()
718 ret = PTR_ERR(chip->rdev[i]); in da9121_set_regulator_config()
727 /* DA9121 chip register model */
817 static int da9121_check_device_type(struct i2c_client *i2c, struct da9121 *chip) in da9121_check_device_type() argument
826 ret = regmap_read(chip->regmap, DA9121_REG_OTP_DEVICE_ID, &device_id); in da9121_check_device_type()
828 dev_err(chip->dev, "Cannot read device ID: %d\n", ret); in da9121_check_device_type()
832 ret = regmap_read(chip->regmap, DA9121_REG_OTP_VARIANT_ID, &variant_id); in da9121_check_device_type()
834 dev_err(chip->dev, "Cannot read variant ID: %d\n", ret); in da9121_check_device_type()
839 dev_err(chip->dev, "Invalid device ID: 0x%02x\n", device_id); in da9121_check_device_type()
840 ret = -ENODEV; in da9121_check_device_type()
846 switch (chip->subvariant_id) { in da9121_check_device_type()
880 dev_info(chip->dev, in da9121_check_device_type()
881 "Device detected (device-ID: 0x%02X, var-ID: 0x%02X, %s)\n", in da9121_check_device_type()
885 dev_err(chip->dev, "Device tree configuration does not match detected device.\n"); in da9121_check_device_type()
886 ret = -EINVAL; in da9121_check_device_type()
895 dev_err(chip->dev, in da9121_check_device_type()
897 ret = -EINVAL; in da9121_check_device_type()
904 struct da9121 *chip) in da9121_assign_chip_model() argument
909 chip->dev = &i2c->dev; in da9121_assign_chip_model()
914 switch (chip->subvariant_id) { in da9121_assign_chip_model()
917 chip->variant_id = DA9121_TYPE_DA9121_DA9130; in da9121_assign_chip_model()
921 chip->variant_id = DA9121_TYPE_DA9217; in da9121_assign_chip_model()
926 chip->variant_id = DA9121_TYPE_DA9122_DA9131; in da9121_assign_chip_model()
931 chip->variant_id = DA9121_TYPE_DA9220_DA9132; in da9121_assign_chip_model()
937 da9121_matches[0].desc = local_da9121_regulators[chip->variant_id][0]; in da9121_assign_chip_model()
938 da9121_matches[1].desc = local_da9121_regulators[chip->variant_id][1]; in da9121_assign_chip_model()
940 chip->regmap = devm_regmap_init_i2c(i2c, regmap); in da9121_assign_chip_model()
941 if (IS_ERR(chip->regmap)) { in da9121_assign_chip_model()
942 ret = PTR_ERR(chip->regmap); in da9121_assign_chip_model()
943 dev_err(chip->dev, "Failed to configure a register map: %d\n", in da9121_assign_chip_model()
948 ret = da9121_check_device_type(i2c, chip); in da9121_assign_chip_model()
954 struct da9121 *chip) in da9121_config_irq() argument
960 chip->chip_irq = i2c->irq; in da9121_config_irq()
962 if (chip->chip_irq != 0) { in da9121_config_irq()
963 if (!of_property_read_u32(chip->dev->of_node, in da9121_config_irq()
964 "dlg,irq-polling-delay-passive-ms", in da9121_config_irq()
968 dev_warn(chip->dev, in da9121_config_irq()
969 "Out-of-range polling period %d ms\n", in da9121_config_irq()
975 chip->passive_delay = p_delay; in da9121_config_irq()
977 ret = request_threaded_irq(chip->chip_irq, NULL, in da9121_config_irq()
980 "da9121", chip); in da9121_config_irq()
982 dev_err(chip->dev, "Failed IRQ request: %d\n", in da9121_config_irq()
983 chip->chip_irq); in da9121_config_irq()
987 ret = regmap_bulk_write(chip->regmap, DA9121_REG_SYS_MASK_0, mask_all, 4); in da9121_config_irq()
989 dev_err(chip->dev, "Failed to set IRQ masks: %d\n", in da9121_config_irq()
994 INIT_DELAYED_WORK(&chip->work, da9121_status_poll_on); in da9121_config_irq()
995 dev_info(chip->dev, "Interrupt polling period set at %d ms\n", in da9121_config_irq()
996 chip->passive_delay); in da9121_config_irq()
1001 free_irq(chip->chip_irq, chip); in da9121_config_irq()
1023 return -EINVAL; in da9121_of_get_id()
1025 return (uintptr_t)id->data; in da9121_of_get_id()
1031 struct da9121 *chip; in da9121_i2c_probe() local
1035 chip = devm_kzalloc(&i2c->dev, sizeof(struct da9121), GFP_KERNEL); in da9121_i2c_probe()
1036 if (!chip) { in da9121_i2c_probe()
1037 ret = -ENOMEM; in da9121_i2c_probe()
1041 chip->pdata = i2c->dev.platform_data; in da9121_i2c_probe()
1042 chip->subvariant_id = da9121_of_get_id(&i2c->dev); in da9121_i2c_probe()
1044 ret = da9121_assign_chip_model(i2c, chip); in da9121_i2c_probe()
1048 ret = regmap_bulk_write(chip->regmap, DA9121_REG_SYS_MASK_0, mask_all, 4); in da9121_i2c_probe()
1050 dev_err(chip->dev, "Failed to set IRQ masks: %d\n", ret); in da9121_i2c_probe()
1054 ret = da9121_set_regulator_config(chip); in da9121_i2c_probe()
1058 ret = da9121_config_irq(i2c, chip); in da9121_i2c_probe()
1066 struct da9121 *chip = i2c_get_clientdata(i2c); in da9121_i2c_remove() local
1070 free_irq(chip->chip_irq, chip); in da9121_i2c_remove()
1071 cancel_delayed_work_sync(&chip->work); in da9121_i2c_remove()
1073 ret = regmap_bulk_write(chip->regmap, DA9121_REG_SYS_MASK_0, mask_all, 4); in da9121_i2c_remove()
1075 dev_err(chip->dev, "Failed to set IRQ masks: %d\n", ret); in da9121_i2c_remove()