^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright 2020 NXP.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * NXP PCA9450 pmic driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/err.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/gpio/consumer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/of.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/of_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/platform_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/regulator/driver.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/regulator/machine.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/regulator/of_regulator.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/regulator/pca9450.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) struct pc9450_dvs_config {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) unsigned int run_reg; /* dvs0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) unsigned int run_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) unsigned int standby_reg; /* dvs1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) unsigned int standby_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) struct pca9450_regulator_desc {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) struct regulator_desc desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) const struct pc9450_dvs_config dvs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) struct pca9450 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) struct device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) struct regmap *regmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) struct gpio_desc *sd_vsel_gpio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) enum pca9450_chip_type type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) unsigned int rcnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) int irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) static const struct regmap_range pca9450_status_range = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) .range_min = PCA9450_REG_INT1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) .range_max = PCA9450_REG_PWRON_STAT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) static const struct regmap_access_table pca9450_volatile_regs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) .yes_ranges = &pca9450_status_range,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) .n_yes_ranges = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) static const struct regmap_config pca9450_regmap_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) .reg_bits = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) .val_bits = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) .volatile_table = &pca9450_volatile_regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) .max_register = PCA9450_MAX_REGISTER - 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) .cache_type = REGCACHE_RBTREE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) * BUCK1/2/3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) * BUCK1RAM[1:0] BUCK1 DVS ramp rate setting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) * 00: 25mV/1usec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) * 01: 25mV/2usec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) * 10: 25mV/4usec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) * 11: 25mV/8usec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) static int pca9450_dvs_set_ramp_delay(struct regulator_dev *rdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) int ramp_delay)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) int id = rdev_get_id(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) unsigned int ramp_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) switch (ramp_delay) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) case 1 ... 3125:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) ramp_value = BUCK1_RAMP_3P125MV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) case 3126 ... 6250:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) ramp_value = BUCK1_RAMP_6P25MV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) case 6251 ... 12500:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) ramp_value = BUCK1_RAMP_12P5MV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) case 12501 ... 25000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) ramp_value = BUCK1_RAMP_25MV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) ramp_value = BUCK1_RAMP_25MV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) return regmap_update_bits(rdev->regmap, PCA9450_REG_BUCK1CTRL + id * 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) BUCK1_RAMP_MASK, ramp_value << 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) static const struct regulator_ops pca9450_dvs_buck_regulator_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) .enable = regulator_enable_regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) .disable = regulator_disable_regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) .is_enabled = regulator_is_enabled_regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) .list_voltage = regulator_list_voltage_linear_range,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) .set_voltage_sel = regulator_set_voltage_sel_regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) .get_voltage_sel = regulator_get_voltage_sel_regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) .set_voltage_time_sel = regulator_set_voltage_time_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) .set_ramp_delay = pca9450_dvs_set_ramp_delay,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) static const struct regulator_ops pca9450_buck_regulator_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) .enable = regulator_enable_regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) .disable = regulator_disable_regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) .is_enabled = regulator_is_enabled_regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) .list_voltage = regulator_list_voltage_linear_range,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) .set_voltage_sel = regulator_set_voltage_sel_regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) .get_voltage_sel = regulator_get_voltage_sel_regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) .set_voltage_time_sel = regulator_set_voltage_time_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) static const struct regulator_ops pca9450_ldo_regulator_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) .enable = regulator_enable_regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) .disable = regulator_disable_regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) .is_enabled = regulator_is_enabled_regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) .list_voltage = regulator_list_voltage_linear_range,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) .set_voltage_sel = regulator_set_voltage_sel_regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) .get_voltage_sel = regulator_get_voltage_sel_regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) * BUCK1/2/3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) * 0.60 to 2.1875V (12.5mV step)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) static const struct linear_range pca9450_dvs_buck_volts[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) REGULATOR_LINEAR_RANGE(600000, 0x00, 0x7F, 12500),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) * BUCK4/5/6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) * 0.6V to 3.4V (25mV step)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) static const struct linear_range pca9450_buck_volts[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) REGULATOR_LINEAR_RANGE(600000, 0x00, 0x70, 25000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) REGULATOR_LINEAR_RANGE(3400000, 0x71, 0x7F, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) * LDO1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) * 1.6 to 3.3V ()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) static const struct linear_range pca9450_ldo1_volts[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) REGULATOR_LINEAR_RANGE(1600000, 0x00, 0x03, 100000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) REGULATOR_LINEAR_RANGE(3000000, 0x04, 0x07, 100000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) * LDO2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) * 0.8 to 1.15V (50mV step)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) static const struct linear_range pca9450_ldo2_volts[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) REGULATOR_LINEAR_RANGE(800000, 0x00, 0x07, 50000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) * LDO3/4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) * 0.8 to 3.3V (100mV step)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) static const struct linear_range pca9450_ldo34_volts[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) REGULATOR_LINEAR_RANGE(800000, 0x00, 0x19, 100000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) REGULATOR_LINEAR_RANGE(3300000, 0x1A, 0x1F, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) * LDO5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) * 1.8 to 3.3V (100mV step)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) static const struct linear_range pca9450_ldo5_volts[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) REGULATOR_LINEAR_RANGE(1800000, 0x00, 0x0F, 100000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) static int buck_set_dvs(const struct regulator_desc *desc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) struct device_node *np, struct regmap *regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) char *prop, unsigned int reg, unsigned int mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) int ret, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) uint32_t uv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) ret = of_property_read_u32(np, prop, &uv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) if (ret == -EINVAL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) else if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) for (i = 0; i < desc->n_voltages; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) ret = regulator_desc_list_voltage_linear_range(desc, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) if (ret == uv) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) i <<= ffs(desc->vsel_mask) - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) ret = regmap_update_bits(regmap, reg, mask, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) static int pca9450_set_dvs_levels(struct device_node *np,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) const struct regulator_desc *desc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) struct regulator_config *cfg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) struct pca9450_regulator_desc *data = container_of(desc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) struct pca9450_regulator_desc, desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) const struct pc9450_dvs_config *dvs = &data->dvs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) unsigned int reg, mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) char *prop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) int i, ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) for (i = 0; i < PCA9450_DVS_LEVEL_MAX; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) switch (i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) case PCA9450_DVS_LEVEL_RUN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) prop = "nxp,dvs-run-voltage";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) reg = dvs->run_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) mask = dvs->run_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) case PCA9450_DVS_LEVEL_STANDBY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) prop = "nxp,dvs-standby-voltage";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) reg = dvs->standby_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) mask = dvs->standby_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) ret = buck_set_dvs(desc, np, cfg->regmap, prop, reg, mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) static const struct pca9450_regulator_desc pca9450a_regulators[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) .desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) .name = "buck1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) .of_match = of_match_ptr("BUCK1"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) .regulators_node = of_match_ptr("regulators"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) .id = PCA9450_BUCK1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) .ops = &pca9450_dvs_buck_regulator_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) .type = REGULATOR_VOLTAGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) .n_voltages = PCA9450_BUCK1_VOLTAGE_NUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) .linear_ranges = pca9450_dvs_buck_volts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) .n_linear_ranges = ARRAY_SIZE(pca9450_dvs_buck_volts),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) .vsel_reg = PCA9450_REG_BUCK1OUT_DVS0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) .vsel_mask = BUCK1OUT_DVS0_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) .enable_reg = PCA9450_REG_BUCK1CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) .enable_mask = BUCK1_ENMODE_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) .of_parse_cb = pca9450_set_dvs_levels,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) .dvs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) .run_reg = PCA9450_REG_BUCK1OUT_DVS0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) .run_mask = BUCK1OUT_DVS0_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) .standby_reg = PCA9450_REG_BUCK1OUT_DVS1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) .standby_mask = BUCK1OUT_DVS1_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) .desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) .name = "buck2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) .of_match = of_match_ptr("BUCK2"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) .regulators_node = of_match_ptr("regulators"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) .id = PCA9450_BUCK2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) .ops = &pca9450_dvs_buck_regulator_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) .type = REGULATOR_VOLTAGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) .n_voltages = PCA9450_BUCK2_VOLTAGE_NUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) .linear_ranges = pca9450_dvs_buck_volts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) .n_linear_ranges = ARRAY_SIZE(pca9450_dvs_buck_volts),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) .vsel_reg = PCA9450_REG_BUCK2OUT_DVS0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) .vsel_mask = BUCK2OUT_DVS0_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) .enable_reg = PCA9450_REG_BUCK2CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) .enable_mask = BUCK1_ENMODE_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) .of_parse_cb = pca9450_set_dvs_levels,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) .dvs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) .run_reg = PCA9450_REG_BUCK2OUT_DVS0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) .run_mask = BUCK2OUT_DVS0_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) .standby_reg = PCA9450_REG_BUCK2OUT_DVS1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) .standby_mask = BUCK2OUT_DVS1_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) .desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) .name = "buck3",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) .of_match = of_match_ptr("BUCK3"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) .regulators_node = of_match_ptr("regulators"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) .id = PCA9450_BUCK3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) .ops = &pca9450_dvs_buck_regulator_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) .type = REGULATOR_VOLTAGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) .n_voltages = PCA9450_BUCK3_VOLTAGE_NUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) .linear_ranges = pca9450_dvs_buck_volts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) .n_linear_ranges = ARRAY_SIZE(pca9450_dvs_buck_volts),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) .vsel_reg = PCA9450_REG_BUCK3OUT_DVS0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) .vsel_mask = BUCK3OUT_DVS0_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) .enable_reg = PCA9450_REG_BUCK3CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) .enable_mask = BUCK3_ENMODE_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) .of_parse_cb = pca9450_set_dvs_levels,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) .dvs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) .run_reg = PCA9450_REG_BUCK3OUT_DVS0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) .run_mask = BUCK3OUT_DVS0_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) .standby_reg = PCA9450_REG_BUCK3OUT_DVS1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) .standby_mask = BUCK3OUT_DVS1_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) .desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) .name = "buck4",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) .of_match = of_match_ptr("BUCK4"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) .regulators_node = of_match_ptr("regulators"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) .id = PCA9450_BUCK4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) .ops = &pca9450_buck_regulator_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) .type = REGULATOR_VOLTAGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) .n_voltages = PCA9450_BUCK4_VOLTAGE_NUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) .linear_ranges = pca9450_buck_volts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) .n_linear_ranges = ARRAY_SIZE(pca9450_buck_volts),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) .vsel_reg = PCA9450_REG_BUCK4OUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) .vsel_mask = BUCK4OUT_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) .enable_reg = PCA9450_REG_BUCK4CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) .enable_mask = BUCK4_ENMODE_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) .desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) .name = "buck5",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) .of_match = of_match_ptr("BUCK5"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) .regulators_node = of_match_ptr("regulators"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) .id = PCA9450_BUCK5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) .ops = &pca9450_buck_regulator_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) .type = REGULATOR_VOLTAGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) .n_voltages = PCA9450_BUCK5_VOLTAGE_NUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) .linear_ranges = pca9450_buck_volts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) .n_linear_ranges = ARRAY_SIZE(pca9450_buck_volts),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) .vsel_reg = PCA9450_REG_BUCK5OUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) .vsel_mask = BUCK5OUT_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) .enable_reg = PCA9450_REG_BUCK5CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) .enable_mask = BUCK5_ENMODE_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) .desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) .name = "buck6",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) .of_match = of_match_ptr("BUCK6"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) .regulators_node = of_match_ptr("regulators"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) .id = PCA9450_BUCK6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) .ops = &pca9450_buck_regulator_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) .type = REGULATOR_VOLTAGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) .n_voltages = PCA9450_BUCK6_VOLTAGE_NUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) .linear_ranges = pca9450_buck_volts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) .n_linear_ranges = ARRAY_SIZE(pca9450_buck_volts),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) .vsel_reg = PCA9450_REG_BUCK6OUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) .vsel_mask = BUCK6OUT_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) .enable_reg = PCA9450_REG_BUCK6CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) .enable_mask = BUCK6_ENMODE_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) .desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) .name = "ldo1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) .of_match = of_match_ptr("LDO1"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) .regulators_node = of_match_ptr("regulators"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) .id = PCA9450_LDO1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) .ops = &pca9450_ldo_regulator_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) .type = REGULATOR_VOLTAGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) .n_voltages = PCA9450_LDO1_VOLTAGE_NUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) .linear_ranges = pca9450_ldo1_volts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) .n_linear_ranges = ARRAY_SIZE(pca9450_ldo1_volts),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) .vsel_reg = PCA9450_REG_LDO1CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) .vsel_mask = LDO1OUT_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) .enable_reg = PCA9450_REG_LDO1CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) .enable_mask = LDO1_EN_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) .desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) .name = "ldo2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) .of_match = of_match_ptr("LDO2"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) .regulators_node = of_match_ptr("regulators"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) .id = PCA9450_LDO2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) .ops = &pca9450_ldo_regulator_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) .type = REGULATOR_VOLTAGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) .n_voltages = PCA9450_LDO2_VOLTAGE_NUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) .linear_ranges = pca9450_ldo2_volts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) .n_linear_ranges = ARRAY_SIZE(pca9450_ldo2_volts),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) .vsel_reg = PCA9450_REG_LDO2CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) .vsel_mask = LDO2OUT_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) .enable_reg = PCA9450_REG_LDO2CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) .enable_mask = LDO2_EN_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) .desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) .name = "ldo3",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) .of_match = of_match_ptr("LDO3"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) .regulators_node = of_match_ptr("regulators"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) .id = PCA9450_LDO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) .ops = &pca9450_ldo_regulator_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) .type = REGULATOR_VOLTAGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) .n_voltages = PCA9450_LDO3_VOLTAGE_NUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) .linear_ranges = pca9450_ldo34_volts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) .n_linear_ranges = ARRAY_SIZE(pca9450_ldo34_volts),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) .vsel_reg = PCA9450_REG_LDO3CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) .vsel_mask = LDO3OUT_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) .enable_reg = PCA9450_REG_LDO3CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) .enable_mask = LDO3_EN_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) .desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) .name = "ldo4",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) .of_match = of_match_ptr("LDO4"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) .regulators_node = of_match_ptr("regulators"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) .id = PCA9450_LDO4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) .ops = &pca9450_ldo_regulator_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) .type = REGULATOR_VOLTAGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) .n_voltages = PCA9450_LDO4_VOLTAGE_NUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) .linear_ranges = pca9450_ldo34_volts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) .n_linear_ranges = ARRAY_SIZE(pca9450_ldo34_volts),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) .vsel_reg = PCA9450_REG_LDO4CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) .vsel_mask = LDO4OUT_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) .enable_reg = PCA9450_REG_LDO4CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) .enable_mask = LDO4_EN_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) .desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) .name = "ldo5",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) .of_match = of_match_ptr("LDO5"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) .regulators_node = of_match_ptr("regulators"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) .id = PCA9450_LDO5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) .ops = &pca9450_ldo_regulator_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) .type = REGULATOR_VOLTAGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) .n_voltages = PCA9450_LDO5_VOLTAGE_NUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) .linear_ranges = pca9450_ldo5_volts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) .n_linear_ranges = ARRAY_SIZE(pca9450_ldo5_volts),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) .vsel_reg = PCA9450_REG_LDO5CTRL_H,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) .vsel_mask = LDO5HOUT_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) .enable_reg = PCA9450_REG_LDO5CTRL_H,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) .enable_mask = LDO5H_EN_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) * Buck3 removed on PCA9450B and connected with Buck1 internal for dual phase
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) * on PCA9450C as no Buck3.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) static const struct pca9450_regulator_desc pca9450bc_regulators[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) .desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) .name = "buck1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) .of_match = of_match_ptr("BUCK1"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) .regulators_node = of_match_ptr("regulators"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) .id = PCA9450_BUCK1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) .ops = &pca9450_dvs_buck_regulator_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) .type = REGULATOR_VOLTAGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) .n_voltages = PCA9450_BUCK1_VOLTAGE_NUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) .linear_ranges = pca9450_dvs_buck_volts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) .n_linear_ranges = ARRAY_SIZE(pca9450_dvs_buck_volts),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) .vsel_reg = PCA9450_REG_BUCK1OUT_DVS0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) .vsel_mask = BUCK1OUT_DVS0_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) .enable_reg = PCA9450_REG_BUCK1CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) .enable_mask = BUCK1_ENMODE_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) .of_parse_cb = pca9450_set_dvs_levels,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) .dvs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) .run_reg = PCA9450_REG_BUCK1OUT_DVS0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) .run_mask = BUCK1OUT_DVS0_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) .standby_reg = PCA9450_REG_BUCK1OUT_DVS1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) .standby_mask = BUCK1OUT_DVS1_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) .desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) .name = "buck2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) .of_match = of_match_ptr("BUCK2"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) .regulators_node = of_match_ptr("regulators"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) .id = PCA9450_BUCK2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) .ops = &pca9450_dvs_buck_regulator_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) .type = REGULATOR_VOLTAGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) .n_voltages = PCA9450_BUCK2_VOLTAGE_NUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) .linear_ranges = pca9450_dvs_buck_volts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) .n_linear_ranges = ARRAY_SIZE(pca9450_dvs_buck_volts),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) .vsel_reg = PCA9450_REG_BUCK2OUT_DVS0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) .vsel_mask = BUCK2OUT_DVS0_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) .enable_reg = PCA9450_REG_BUCK2CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) .enable_mask = BUCK1_ENMODE_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) .of_parse_cb = pca9450_set_dvs_levels,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) .dvs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) .run_reg = PCA9450_REG_BUCK2OUT_DVS0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) .run_mask = BUCK2OUT_DVS0_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) .standby_reg = PCA9450_REG_BUCK2OUT_DVS1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) .standby_mask = BUCK2OUT_DVS1_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) .desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) .name = "buck4",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) .of_match = of_match_ptr("BUCK4"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) .regulators_node = of_match_ptr("regulators"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) .id = PCA9450_BUCK4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) .ops = &pca9450_buck_regulator_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) .type = REGULATOR_VOLTAGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) .n_voltages = PCA9450_BUCK4_VOLTAGE_NUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) .linear_ranges = pca9450_buck_volts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) .n_linear_ranges = ARRAY_SIZE(pca9450_buck_volts),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) .vsel_reg = PCA9450_REG_BUCK4OUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) .vsel_mask = BUCK4OUT_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) .enable_reg = PCA9450_REG_BUCK4CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) .enable_mask = BUCK4_ENMODE_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) .desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) .name = "buck5",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) .of_match = of_match_ptr("BUCK5"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) .regulators_node = of_match_ptr("regulators"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) .id = PCA9450_BUCK5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) .ops = &pca9450_buck_regulator_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) .type = REGULATOR_VOLTAGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) .n_voltages = PCA9450_BUCK5_VOLTAGE_NUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) .linear_ranges = pca9450_buck_volts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) .n_linear_ranges = ARRAY_SIZE(pca9450_buck_volts),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) .vsel_reg = PCA9450_REG_BUCK5OUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) .vsel_mask = BUCK5OUT_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) .enable_reg = PCA9450_REG_BUCK5CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) .enable_mask = BUCK5_ENMODE_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) .desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) .name = "buck6",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) .of_match = of_match_ptr("BUCK6"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) .regulators_node = of_match_ptr("regulators"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) .id = PCA9450_BUCK6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) .ops = &pca9450_buck_regulator_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) .type = REGULATOR_VOLTAGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) .n_voltages = PCA9450_BUCK6_VOLTAGE_NUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) .linear_ranges = pca9450_buck_volts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) .n_linear_ranges = ARRAY_SIZE(pca9450_buck_volts),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) .vsel_reg = PCA9450_REG_BUCK6OUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) .vsel_mask = BUCK6OUT_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) .enable_reg = PCA9450_REG_BUCK6CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) .enable_mask = BUCK6_ENMODE_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) .desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) .name = "ldo1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) .of_match = of_match_ptr("LDO1"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) .regulators_node = of_match_ptr("regulators"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) .id = PCA9450_LDO1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) .ops = &pca9450_ldo_regulator_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) .type = REGULATOR_VOLTAGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) .n_voltages = PCA9450_LDO1_VOLTAGE_NUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) .linear_ranges = pca9450_ldo1_volts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) .n_linear_ranges = ARRAY_SIZE(pca9450_ldo1_volts),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) .vsel_reg = PCA9450_REG_LDO1CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) .vsel_mask = LDO1OUT_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) .enable_reg = PCA9450_REG_LDO1CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) .enable_mask = LDO1_EN_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) .desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) .name = "ldo2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) .of_match = of_match_ptr("LDO2"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) .regulators_node = of_match_ptr("regulators"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) .id = PCA9450_LDO2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) .ops = &pca9450_ldo_regulator_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) .type = REGULATOR_VOLTAGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) .n_voltages = PCA9450_LDO2_VOLTAGE_NUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) .linear_ranges = pca9450_ldo2_volts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) .n_linear_ranges = ARRAY_SIZE(pca9450_ldo2_volts),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) .vsel_reg = PCA9450_REG_LDO2CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) .vsel_mask = LDO2OUT_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) .enable_reg = PCA9450_REG_LDO2CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) .enable_mask = LDO2_EN_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) .desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) .name = "ldo3",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) .of_match = of_match_ptr("LDO3"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) .regulators_node = of_match_ptr("regulators"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) .id = PCA9450_LDO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) .ops = &pca9450_ldo_regulator_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) .type = REGULATOR_VOLTAGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) .n_voltages = PCA9450_LDO3_VOLTAGE_NUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) .linear_ranges = pca9450_ldo34_volts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) .n_linear_ranges = ARRAY_SIZE(pca9450_ldo34_volts),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) .vsel_reg = PCA9450_REG_LDO3CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) .vsel_mask = LDO3OUT_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) .enable_reg = PCA9450_REG_LDO3CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) .enable_mask = LDO3_EN_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) .desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) .name = "ldo4",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) .of_match = of_match_ptr("LDO4"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) .regulators_node = of_match_ptr("regulators"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) .id = PCA9450_LDO4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) .ops = &pca9450_ldo_regulator_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) .type = REGULATOR_VOLTAGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) .n_voltages = PCA9450_LDO4_VOLTAGE_NUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) .linear_ranges = pca9450_ldo34_volts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) .n_linear_ranges = ARRAY_SIZE(pca9450_ldo34_volts),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) .vsel_reg = PCA9450_REG_LDO4CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) .vsel_mask = LDO4OUT_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) .enable_reg = PCA9450_REG_LDO4CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) .enable_mask = LDO4_EN_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) .desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) .name = "ldo5",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) .of_match = of_match_ptr("LDO5"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) .regulators_node = of_match_ptr("regulators"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) .id = PCA9450_LDO5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) .ops = &pca9450_ldo_regulator_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) .type = REGULATOR_VOLTAGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) .n_voltages = PCA9450_LDO5_VOLTAGE_NUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) .linear_ranges = pca9450_ldo5_volts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) .n_linear_ranges = ARRAY_SIZE(pca9450_ldo5_volts),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) .vsel_reg = PCA9450_REG_LDO5CTRL_H,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) .vsel_mask = LDO5HOUT_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) .enable_reg = PCA9450_REG_LDO5CTRL_H,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) .enable_mask = LDO5H_EN_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) static irqreturn_t pca9450_irq_handler(int irq, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) struct pca9450 *pca9450 = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) struct regmap *regmap = pca9450->regmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) unsigned int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) ret = regmap_read(regmap, PCA9450_REG_INT1, &status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) dev_err(pca9450->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) "Failed to read INT1(%d)\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) return IRQ_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) if (status & IRQ_PWRON)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) dev_warn(pca9450->dev, "PWRON interrupt.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) if (status & IRQ_WDOGB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) dev_warn(pca9450->dev, "WDOGB interrupt.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) if (status & IRQ_VR_FLT1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) dev_warn(pca9450->dev, "VRFLT1 interrupt.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) if (status & IRQ_VR_FLT2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) dev_warn(pca9450->dev, "VRFLT2 interrupt.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) if (status & IRQ_LOWVSYS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) dev_warn(pca9450->dev, "LOWVSYS interrupt.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) if (status & IRQ_THERM_105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) dev_warn(pca9450->dev, "IRQ_THERM_105 interrupt.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) if (status & IRQ_THERM_125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) dev_warn(pca9450->dev, "IRQ_THERM_125 interrupt.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) return IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) static int pca9450_i2c_probe(struct i2c_client *i2c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) const struct i2c_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) enum pca9450_chip_type type = (unsigned int)(uintptr_t)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) of_device_get_match_data(&i2c->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) const struct pca9450_regulator_desc *regulator_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) struct regulator_config config = { };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) struct pca9450 *pca9450;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) unsigned int device_id, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) if (!i2c->irq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) dev_err(&i2c->dev, "No IRQ configured?\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) pca9450 = devm_kzalloc(&i2c->dev, sizeof(struct pca9450), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) if (!pca9450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) switch (type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) case PCA9450_TYPE_PCA9450A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) regulator_desc = pca9450a_regulators;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) pca9450->rcnt = ARRAY_SIZE(pca9450a_regulators);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) case PCA9450_TYPE_PCA9450BC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) regulator_desc = pca9450bc_regulators;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) pca9450->rcnt = ARRAY_SIZE(pca9450bc_regulators);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) dev_err(&i2c->dev, "Unknown device type");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) pca9450->irq = i2c->irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) pca9450->type = type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) pca9450->dev = &i2c->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) dev_set_drvdata(&i2c->dev, pca9450);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) pca9450->regmap = devm_regmap_init_i2c(i2c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) &pca9450_regmap_config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) if (IS_ERR(pca9450->regmap)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) dev_err(&i2c->dev, "regmap initialization failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) return PTR_ERR(pca9450->regmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) ret = regmap_read(pca9450->regmap, PCA9450_REG_DEV_ID, &device_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) dev_err(&i2c->dev, "Read device id error\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) /* Check your board and dts for match the right pmic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) if (((device_id >> 4) != 0x1 && type == PCA9450_TYPE_PCA9450A) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) ((device_id >> 4) != 0x3 && type == PCA9450_TYPE_PCA9450BC)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) dev_err(&i2c->dev, "Device id(%x) mismatched\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) device_id >> 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) for (i = 0; i < pca9450->rcnt; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) const struct regulator_desc *desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) struct regulator_dev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) const struct pca9450_regulator_desc *r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) r = ®ulator_desc[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) desc = &r->desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) config.regmap = pca9450->regmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) config.dev = pca9450->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) rdev = devm_regulator_register(pca9450->dev, desc, &config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) if (IS_ERR(rdev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) ret = PTR_ERR(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) dev_err(pca9450->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) "Failed to register regulator(%s): %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) desc->name, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) ret = devm_request_threaded_irq(pca9450->dev, pca9450->irq, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) pca9450_irq_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) (IRQF_TRIGGER_FALLING | IRQF_ONESHOT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) "pca9450-irq", pca9450);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) if (ret != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) dev_err(pca9450->dev, "Failed to request IRQ: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) pca9450->irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) /* Unmask all interrupt except PWRON/WDOG/RSVD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) ret = regmap_update_bits(pca9450->regmap, PCA9450_REG_INT1_MSK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) IRQ_VR_FLT1 | IRQ_VR_FLT2 | IRQ_LOWVSYS |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) IRQ_THERM_105 | IRQ_THERM_125,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) IRQ_PWRON | IRQ_WDOGB | IRQ_RSVD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) dev_err(&i2c->dev, "Unmask irq error\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) /* Clear PRESET_EN bit in BUCK123_DVS to use DVS registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) ret = regmap_clear_bits(pca9450->regmap, PCA9450_REG_BUCK123_DVS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) BUCK123_PRESET_EN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) dev_err(&i2c->dev, "Failed to clear PRESET_EN bit: %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) /* Set reset behavior on assertion of WDOG_B signal */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) ret = regmap_update_bits(pca9450->regmap, PCA9450_REG_RESET_CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) WDOG_B_CFG_MASK, WDOG_B_CFG_COLD_LDO12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) dev_err(&i2c->dev, "Failed to set WDOG_B reset behavior\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) * The driver uses the LDO5CTRL_H register to control the LDO5 regulator.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) * This is only valid if the SD_VSEL input of the PMIC is high. Let's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) * check if the pin is available as GPIO and set it to high.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) pca9450->sd_vsel_gpio = gpiod_get_optional(pca9450->dev, "sd-vsel", GPIOD_OUT_HIGH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) if (IS_ERR(pca9450->sd_vsel_gpio)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) dev_err(&i2c->dev, "Failed to get SD_VSEL GPIO\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) dev_info(&i2c->dev, "%s probed.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) type == PCA9450_TYPE_PCA9450A ? "pca9450a" : "pca9450bc");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) static const struct of_device_id pca9450_of_match[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) .compatible = "nxp,pca9450a",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) .data = (void *)PCA9450_TYPE_PCA9450A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) .compatible = "nxp,pca9450b",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) .data = (void *)PCA9450_TYPE_PCA9450BC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) .compatible = "nxp,pca9450c",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) .data = (void *)PCA9450_TYPE_PCA9450BC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) MODULE_DEVICE_TABLE(of, pca9450_of_match);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) static struct i2c_driver pca9450_i2c_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) .name = "nxp-pca9450",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) .of_match_table = pca9450_of_match,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) .probe = pca9450_i2c_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) module_i2c_driver(pca9450_i2c_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) MODULE_AUTHOR("Robin Gong <yibin.gong@nxp.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) MODULE_DESCRIPTION("NXP PCA9450 Power Management IC driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) MODULE_LICENSE("GPL");