^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) * Regulator driver for TPS6524x PMIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 2010 Texas Instruments
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * This program is free software; you can redistribute it and/or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * modify it under the terms of the GNU General Public License as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * published by the Free Software Foundation version 2.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * This program is distributed "as is" WITHOUT ANY WARRANTY of any kind,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * whether express or implied; without even the implied warranty of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * General Public License for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/err.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/spi/spi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/regulator/driver.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/regulator/machine.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define REG_LDO_SET 0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define LDO_ILIM_MASK 1 /* 0 = 400-800, 1 = 900-1500 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define LDO_VSEL_MASK 0x0f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define LDO2_ILIM_SHIFT 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define LDO2_VSEL_SHIFT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define LDO1_ILIM_SHIFT 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define LDO1_VSEL_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define REG_BLOCK_EN 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define BLOCK_MASK 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define BLOCK_LDO1_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define BLOCK_LDO2_SHIFT 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define BLOCK_LCD_SHIFT 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define BLOCK_USB_SHIFT 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define REG_DCDC_SET 0x2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define DCDC_VDCDC_MASK 0x1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define DCDC_VDCDC1_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define DCDC_VDCDC2_SHIFT 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define DCDC_VDCDC3_SHIFT 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define REG_DCDC_EN 0x3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define DCDCDCDC_EN_MASK 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define DCDCDCDC1_EN_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define DCDCDCDC1_PG_MSK BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define DCDCDCDC2_EN_SHIFT 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define DCDCDCDC2_PG_MSK BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define DCDCDCDC3_EN_SHIFT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define DCDCDCDC3_PG_MSK BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define REG_USB 0x4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define USB_ILIM_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define USB_ILIM_MASK 0x3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define USB_TSD_SHIFT 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define USB_TSD_MASK 0x3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define USB_TWARN_SHIFT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define USB_TWARN_MASK 0x3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define USB_IWARN_SD BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define USB_FAST_LOOP BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define REG_ALARM 0x5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #define ALARM_LDO1 BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define ALARM_DCDC1 BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define ALARM_DCDC2 BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define ALARM_DCDC3 BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define ALARM_LDO2 BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #define ALARM_USB_WARN BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #define ALARM_USB_ALARM BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define ALARM_LCD BIT(9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define ALARM_TEMP_WARM BIT(10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #define ALARM_TEMP_HOT BIT(11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #define ALARM_NRST BIT(14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #define ALARM_POWERUP BIT(15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #define REG_INT_ENABLE 0x6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #define INT_LDO1 BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #define INT_DCDC1 BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #define INT_DCDC2 BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #define INT_DCDC3 BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #define INT_LDO2 BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #define INT_USB_WARN BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #define INT_USB_ALARM BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #define INT_LCD BIT(9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #define INT_TEMP_WARM BIT(10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #define INT_TEMP_HOT BIT(11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #define INT_GLOBAL_EN BIT(15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #define REG_INT_STATUS 0x7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #define STATUS_LDO1 BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #define STATUS_DCDC1 BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) #define STATUS_DCDC2 BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #define STATUS_DCDC3 BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) #define STATUS_LDO2 BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) #define STATUS_USB_WARN BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) #define STATUS_USB_ALARM BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define STATUS_LCD BIT(9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define STATUS_TEMP_WARM BIT(10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define STATUS_TEMP_HOT BIT(11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define REG_SOFTWARE_RESET 0xb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #define REG_WRITE_ENABLE 0xd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define REG_REV_ID 0xf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #define N_DCDC 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define N_LDO 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define N_SWITCH 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #define N_REGULATORS (N_DCDC + N_LDO + N_SWITCH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #define CMD_READ(reg) ((reg) << 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define CMD_WRITE(reg) (BIT(5) | (reg) << 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define STAT_CLK BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #define STAT_WRITE BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define STAT_INVALID BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #define STAT_WP BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) struct field {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) int reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) int shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) int mask;
^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) struct supply_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) const char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) int n_voltages;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) const unsigned int *voltages;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) int n_ilimsels;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) const unsigned int *ilimsels;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) struct field enable, voltage, ilimsel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) struct tps6524x {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) struct device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) struct spi_device *spi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) struct mutex lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) struct regulator_desc desc[N_REGULATORS];
^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) static int __read_reg(struct tps6524x *hw, int reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) int error = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) u16 cmd = CMD_READ(reg), in;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) u8 status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) struct spi_message m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) struct spi_transfer t[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) spi_message_init(&m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) memset(t, 0, sizeof(t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) t[0].tx_buf = &cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) t[0].len = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) t[0].bits_per_word = 12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) spi_message_add_tail(&t[0], &m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) t[1].rx_buf = ∈
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) t[1].len = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) t[1].bits_per_word = 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) spi_message_add_tail(&t[1], &m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) t[2].rx_buf = &status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) t[2].len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) t[2].bits_per_word = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) spi_message_add_tail(&t[2], &m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) error = spi_sync(hw->spi, &m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) if (error < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) dev_dbg(hw->dev, "read reg %d, data %x, status %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) reg, in, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) if (!(status & STAT_CLK) || (status & STAT_WRITE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) if (status & STAT_INVALID)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) return in;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) static int read_reg(struct tps6524x *hw, int reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) mutex_lock(&hw->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) ret = __read_reg(hw, reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) mutex_unlock(&hw->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) static int __write_reg(struct tps6524x *hw, int reg, int val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) int error = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) u16 cmd = CMD_WRITE(reg), out = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) u8 status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) struct spi_message m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) struct spi_transfer t[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) spi_message_init(&m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) memset(t, 0, sizeof(t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) t[0].tx_buf = &cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) t[0].len = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) t[0].bits_per_word = 12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) spi_message_add_tail(&t[0], &m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) t[1].tx_buf = &out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) t[1].len = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) t[1].bits_per_word = 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) spi_message_add_tail(&t[1], &m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) t[2].rx_buf = &status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) t[2].len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) t[2].bits_per_word = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) spi_message_add_tail(&t[2], &m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) error = spi_sync(hw->spi, &m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) if (error < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) dev_dbg(hw->dev, "wrote reg %d, data %x, status %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) reg, out, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) if (!(status & STAT_CLK) || !(status & STAT_WRITE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) if (status & (STAT_INVALID | STAT_WP))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) static int __rmw_reg(struct tps6524x *hw, int reg, int mask, int val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) ret = __read_reg(hw, reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) ret &= ~mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) ret |= val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) ret = __write_reg(hw, reg, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) return (ret < 0) ? ret : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) static int rmw_protect(struct tps6524x *hw, int reg, int mask, int val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) mutex_lock(&hw->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) ret = __write_reg(hw, REG_WRITE_ENABLE, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) dev_err(hw->dev, "failed to set write enable\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) goto error;
^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) ret = __rmw_reg(hw, reg, mask, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) dev_err(hw->dev, "failed to rmw register %d\n", reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) ret = __write_reg(hw, REG_WRITE_ENABLE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) dev_err(hw->dev, "failed to clear write enable\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) mutex_unlock(&hw->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) static int read_field(struct tps6524x *hw, const struct field *field)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) int tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) tmp = read_reg(hw, field->reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) if (tmp < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) return tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) return (tmp >> field->shift) & field->mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) static int write_field(struct tps6524x *hw, const struct field *field,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) int val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) if (val & ~field->mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) return -EOVERFLOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) return rmw_protect(hw, field->reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) field->mask << field->shift,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) val << field->shift);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) static const unsigned int dcdc1_voltages[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 800000, 825000, 850000, 875000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 900000, 925000, 950000, 975000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 1000000, 1025000, 1050000, 1075000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 1100000, 1125000, 1150000, 1175000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 1200000, 1225000, 1250000, 1275000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 1300000, 1325000, 1350000, 1375000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 1400000, 1425000, 1450000, 1475000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 1500000, 1525000, 1550000, 1575000,
^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) static const unsigned int dcdc2_voltages[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 1400000, 1450000, 1500000, 1550000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 1600000, 1650000, 1700000, 1750000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 1800000, 1850000, 1900000, 1950000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 2000000, 2050000, 2100000, 2150000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 2200000, 2250000, 2300000, 2350000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 2400000, 2450000, 2500000, 2550000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 2600000, 2650000, 2700000, 2750000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 2800000, 2850000, 2900000, 2950000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) static const unsigned int dcdc3_voltages[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 2400000, 2450000, 2500000, 2550000, 2600000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 2650000, 2700000, 2750000, 2800000, 2850000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) 2900000, 2950000, 3000000, 3050000, 3100000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 3150000, 3200000, 3250000, 3300000, 3350000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) 3400000, 3450000, 3500000, 3550000, 3600000,
^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) static const unsigned int ldo1_voltages[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) 4300000, 4350000, 4400000, 4450000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) 4500000, 4550000, 4600000, 4650000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 4700000, 4750000, 4800000, 4850000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 4900000, 4950000, 5000000, 5050000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) static const unsigned int ldo2_voltages[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 1100000, 1150000, 1200000, 1250000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) 1300000, 1700000, 1750000, 1800000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 1850000, 1900000, 3150000, 3200000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) 3250000, 3300000, 3350000, 3400000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) static const unsigned int fixed_5000000_voltage[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 5000000
^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) static const unsigned int ldo_ilimsel[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) 400000, 1500000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) static const unsigned int usb_ilimsel[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) 200000, 400000, 800000, 1000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) static const unsigned int fixed_2400000_ilimsel[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 2400000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) static const unsigned int fixed_1200000_ilimsel[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 1200000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) static const unsigned int fixed_400000_ilimsel[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 400000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) #define __MK_FIELD(_reg, _mask, _shift) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) { .reg = (_reg), .mask = (_mask), .shift = (_shift), }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) static const struct supply_info supply_info[N_REGULATORS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) .name = "DCDC1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) .n_voltages = ARRAY_SIZE(dcdc1_voltages),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) .voltages = dcdc1_voltages,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) .n_ilimsels = ARRAY_SIZE(fixed_2400000_ilimsel),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) .ilimsels = fixed_2400000_ilimsel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) .enable = __MK_FIELD(REG_DCDC_EN, DCDCDCDC_EN_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) DCDCDCDC1_EN_SHIFT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) .voltage = __MK_FIELD(REG_DCDC_SET, DCDC_VDCDC_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) DCDC_VDCDC1_SHIFT),
^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) .name = "DCDC2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) .n_voltages = ARRAY_SIZE(dcdc2_voltages),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) .voltages = dcdc2_voltages,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) .n_ilimsels = ARRAY_SIZE(fixed_1200000_ilimsel),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) .ilimsels = fixed_1200000_ilimsel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) .enable = __MK_FIELD(REG_DCDC_EN, DCDCDCDC_EN_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) DCDCDCDC2_EN_SHIFT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) .voltage = __MK_FIELD(REG_DCDC_SET, DCDC_VDCDC_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) DCDC_VDCDC2_SHIFT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) .name = "DCDC3",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) .n_voltages = ARRAY_SIZE(dcdc3_voltages),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) .voltages = dcdc3_voltages,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) .n_ilimsels = ARRAY_SIZE(fixed_1200000_ilimsel),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) .ilimsels = fixed_1200000_ilimsel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) .enable = __MK_FIELD(REG_DCDC_EN, DCDCDCDC_EN_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) DCDCDCDC3_EN_SHIFT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) .voltage = __MK_FIELD(REG_DCDC_SET, DCDC_VDCDC_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) DCDC_VDCDC3_SHIFT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) .name = "LDO1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) .n_voltages = ARRAY_SIZE(ldo1_voltages),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) .voltages = ldo1_voltages,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) .n_ilimsels = ARRAY_SIZE(ldo_ilimsel),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) .ilimsels = ldo_ilimsel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) .enable = __MK_FIELD(REG_BLOCK_EN, BLOCK_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) BLOCK_LDO1_SHIFT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) .voltage = __MK_FIELD(REG_LDO_SET, LDO_VSEL_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) LDO1_VSEL_SHIFT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) .ilimsel = __MK_FIELD(REG_LDO_SET, LDO_ILIM_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) LDO1_ILIM_SHIFT),
^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) .name = "LDO2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) .n_voltages = ARRAY_SIZE(ldo2_voltages),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) .voltages = ldo2_voltages,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) .n_ilimsels = ARRAY_SIZE(ldo_ilimsel),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) .ilimsels = ldo_ilimsel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) .enable = __MK_FIELD(REG_BLOCK_EN, BLOCK_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) BLOCK_LDO2_SHIFT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) .voltage = __MK_FIELD(REG_LDO_SET, LDO_VSEL_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) LDO2_VSEL_SHIFT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) .ilimsel = __MK_FIELD(REG_LDO_SET, LDO_ILIM_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) LDO2_ILIM_SHIFT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) .name = "USB",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) .n_voltages = ARRAY_SIZE(fixed_5000000_voltage),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) .voltages = fixed_5000000_voltage,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) .n_ilimsels = ARRAY_SIZE(usb_ilimsel),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) .ilimsels = usb_ilimsel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) .enable = __MK_FIELD(REG_BLOCK_EN, BLOCK_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) BLOCK_USB_SHIFT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) .ilimsel = __MK_FIELD(REG_USB, USB_ILIM_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) USB_ILIM_SHIFT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) .name = "LCD",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) .n_voltages = ARRAY_SIZE(fixed_5000000_voltage),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) .voltages = fixed_5000000_voltage,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) .n_ilimsels = ARRAY_SIZE(fixed_400000_ilimsel),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) .ilimsels = fixed_400000_ilimsel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) .enable = __MK_FIELD(REG_BLOCK_EN, BLOCK_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) BLOCK_LCD_SHIFT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) static int set_voltage_sel(struct regulator_dev *rdev, unsigned selector)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) const struct supply_info *info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) struct tps6524x *hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) hw = rdev_get_drvdata(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) info = &supply_info[rdev_get_id(rdev)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) if (rdev->desc->n_voltages == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) return write_field(hw, &info->voltage, selector);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) static int get_voltage_sel(struct regulator_dev *rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) const struct supply_info *info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) struct tps6524x *hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) hw = rdev_get_drvdata(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) info = &supply_info[rdev_get_id(rdev)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) if (rdev->desc->n_voltages == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) ret = read_field(hw, &info->voltage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) if (WARN_ON(ret >= info->n_voltages))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) return ret;
^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) static int set_current_limit(struct regulator_dev *rdev, int min_uA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) int max_uA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) const struct supply_info *info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) struct tps6524x *hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) hw = rdev_get_drvdata(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) info = &supply_info[rdev_get_id(rdev)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) if (info->n_ilimsels == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) for (i = info->n_ilimsels - 1; i >= 0; i--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) if (min_uA <= info->ilimsels[i] &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) max_uA >= info->ilimsels[i])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) return write_field(hw, &info->ilimsel, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) static int get_current_limit(struct regulator_dev *rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) const struct supply_info *info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) struct tps6524x *hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) hw = rdev_get_drvdata(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) info = &supply_info[rdev_get_id(rdev)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) if (info->n_ilimsels == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) return info->ilimsels[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) ret = read_field(hw, &info->ilimsel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) if (WARN_ON(ret >= info->n_ilimsels))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) return info->ilimsels[ret];
^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) static int enable_supply(struct regulator_dev *rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) const struct supply_info *info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) struct tps6524x *hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) hw = rdev_get_drvdata(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) info = &supply_info[rdev_get_id(rdev)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) return write_field(hw, &info->enable, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) static int disable_supply(struct regulator_dev *rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) const struct supply_info *info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) struct tps6524x *hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) hw = rdev_get_drvdata(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) info = &supply_info[rdev_get_id(rdev)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) return write_field(hw, &info->enable, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) static int is_supply_enabled(struct regulator_dev *rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) const struct supply_info *info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) struct tps6524x *hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) hw = rdev_get_drvdata(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) info = &supply_info[rdev_get_id(rdev)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) return read_field(hw, &info->enable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) static const struct regulator_ops regulator_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) .is_enabled = is_supply_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) .enable = enable_supply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) .disable = disable_supply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) .get_voltage_sel = get_voltage_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) .set_voltage_sel = set_voltage_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) .list_voltage = regulator_list_voltage_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) .map_voltage = regulator_map_voltage_ascend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) .set_current_limit = set_current_limit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) .get_current_limit = get_current_limit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) static int pmic_probe(struct spi_device *spi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) struct tps6524x *hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) struct device *dev = &spi->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) const struct supply_info *info = supply_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) struct regulator_init_data *init_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) struct regulator_config config = { };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) struct regulator_dev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) init_data = dev_get_platdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) if (!init_data) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) dev_err(dev, "could not find regulator platform data\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) hw = devm_kzalloc(&spi->dev, sizeof(struct tps6524x), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) if (!hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) spi_set_drvdata(spi, hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) memset(hw, 0, sizeof(struct tps6524x));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) hw->dev = dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) hw->spi = spi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) mutex_init(&hw->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) for (i = 0; i < N_REGULATORS; i++, info++, init_data++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) hw->desc[i].name = info->name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) hw->desc[i].id = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) hw->desc[i].n_voltages = info->n_voltages;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) hw->desc[i].volt_table = info->voltages;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) hw->desc[i].ops = ®ulator_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) hw->desc[i].type = REGULATOR_VOLTAGE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) hw->desc[i].owner = THIS_MODULE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) config.dev = dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) config.init_data = init_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) config.driver_data = hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) rdev = devm_regulator_register(dev, &hw->desc[i], &config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) if (IS_ERR(rdev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) return PTR_ERR(rdev);
^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) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) static struct spi_driver pmic_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) .probe = pmic_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) .name = "tps6524x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) module_spi_driver(pmic_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) MODULE_DESCRIPTION("TPS6524X PMIC Driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) MODULE_AUTHOR("Cyril Chemparathy");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) MODULE_ALIAS("spi:tps6524x");