Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

misc: tps6594-pfsm: Add TI TPS65224 PMIC PFSM

Add support for TPS65224 PFSM in the TPS6594 PFSM driver as they share
significant functionality.

Signed-off-by: Bhargav Raviprakash <bhargav.r@ltts.com>
Acked-by: Julien Panis <jpanis@baylibre.com>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Link: https://lore.kernel.org/r/0109018f2fdc9dc4-db5a45c0-0148-48cc-8462-d1c5b577a4bd-000000@ap-south-1.amazonses.com
Signed-off-by: Lee Jones <lee@kernel.org>

authored by

Bhargav Raviprakash and committed by
Lee Jones
91020aec 9d855b81

+35 -13
+35 -13
drivers/misc/tps6594-pfsm.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0 2 2 /* 3 - * PFSM (Pre-configurable Finite State Machine) driver for TI TPS6594/TPS6593/LP8764 PMICs 3 + * PFSM (Pre-configurable Finite State Machine) driver for TI TPS65224/TPS6594/TPS6593/LP8764 PMICs 4 4 * 5 5 * Copyright (C) 2023 BayLibre Incorporated - https://www.baylibre.com/ 6 6 */ ··· 39 39 * 40 40 * @miscdev: misc device infos 41 41 * @regmap: regmap for accessing the device registers 42 + * @chip_id: chip identifier of the device 42 43 */ 43 44 struct tps6594_pfsm { 44 45 struct miscdevice miscdev; 45 46 struct regmap *regmap; 47 + unsigned long chip_id; 46 48 }; 47 49 48 50 static ssize_t tps6594_pfsm_read(struct file *f, char __user *buf, ··· 135 133 struct tps6594_pfsm *pfsm = TPS6594_FILE_TO_PFSM(f); 136 134 struct pmic_state_opt state_opt; 137 135 void __user *argp = (void __user *)arg; 136 + unsigned int regmap_reg, mask; 138 137 int ret = -ENOIOCTLCMD; 139 138 140 139 switch (cmd) { 141 140 case PMIC_GOTO_STANDBY: 142 - /* Disable LP mode */ 143 - ret = regmap_clear_bits(pfsm->regmap, TPS6594_REG_RTC_CTRL_2, 144 - TPS6594_BIT_LP_STANDBY_SEL); 145 - if (ret) 146 - return ret; 141 + /* Disable LP mode on TPS6594 Family PMIC */ 142 + if (pfsm->chip_id != TPS65224) { 143 + ret = regmap_clear_bits(pfsm->regmap, TPS6594_REG_RTC_CTRL_2, 144 + TPS6594_BIT_LP_STANDBY_SEL); 145 + 146 + if (ret) 147 + return ret; 148 + } 147 149 148 150 /* Force trigger */ 149 151 ret = regmap_write_bits(pfsm->regmap, TPS6594_REG_FSM_I2C_TRIGGERS, 150 152 TPS6594_BIT_TRIGGER_I2C(0), TPS6594_BIT_TRIGGER_I2C(0)); 151 153 break; 152 154 case PMIC_GOTO_LP_STANDBY: 155 + /* TPS65224 does not support LP STANDBY */ 156 + if (pfsm->chip_id == TPS65224) 157 + return ret; 158 + 153 159 /* Enable LP mode */ 154 160 ret = regmap_set_bits(pfsm->regmap, TPS6594_REG_RTC_CTRL_2, 155 161 TPS6594_BIT_LP_STANDBY_SEL); ··· 179 169 TPS6594_BIT_NSLEEP1B | TPS6594_BIT_NSLEEP2B); 180 170 break; 181 171 case PMIC_SET_MCU_ONLY_STATE: 172 + /* TPS65224 does not support MCU_ONLY_STATE */ 173 + if (pfsm->chip_id == TPS65224) 174 + return ret; 175 + 182 176 if (copy_from_user(&state_opt, argp, sizeof(state_opt))) 183 177 return -EFAULT; 184 178 ··· 206 192 return -EFAULT; 207 193 208 194 /* Configure wake-up destination */ 195 + if (pfsm->chip_id == TPS65224) { 196 + regmap_reg = TPS65224_REG_STARTUP_CTRL; 197 + mask = TPS65224_MASK_STARTUP_DEST; 198 + } else { 199 + regmap_reg = TPS6594_REG_RTC_CTRL_2; 200 + mask = TPS6594_MASK_STARTUP_DEST; 201 + } 202 + 209 203 if (state_opt.mcu_only_startup_dest) 210 - ret = regmap_write_bits(pfsm->regmap, TPS6594_REG_RTC_CTRL_2, 211 - TPS6594_MASK_STARTUP_DEST, 212 - TPS6594_STARTUP_DEST_MCU_ONLY); 204 + ret = regmap_write_bits(pfsm->regmap, regmap_reg, 205 + mask, TPS6594_STARTUP_DEST_MCU_ONLY); 213 206 else 214 - ret = regmap_write_bits(pfsm->regmap, TPS6594_REG_RTC_CTRL_2, 215 - TPS6594_MASK_STARTUP_DEST, 216 - TPS6594_STARTUP_DEST_ACTIVE); 207 + ret = regmap_write_bits(pfsm->regmap, regmap_reg, 208 + mask, TPS6594_STARTUP_DEST_ACTIVE); 217 209 if (ret) 218 210 return ret; 219 211 ··· 231 211 232 212 /* Modify NSLEEP1-2 bits */ 233 213 ret = regmap_clear_bits(pfsm->regmap, TPS6594_REG_FSM_NSLEEP_TRIGGERS, 234 - TPS6594_BIT_NSLEEP2B); 214 + pfsm->chip_id == TPS65224 ? 215 + TPS6594_BIT_NSLEEP1B : TPS6594_BIT_NSLEEP2B); 235 216 break; 236 217 } 237 218 ··· 283 262 tps->chip_id, tps->reg); 284 263 pfsm->miscdev.fops = &tps6594_pfsm_fops; 285 264 pfsm->miscdev.parent = dev->parent; 265 + pfsm->chip_id = tps->chip_id; 286 266 287 267 for (i = 0 ; i < pdev->num_resources ; i++) { 288 268 irq = platform_get_irq_byname(pdev, pdev->resource[i].name);