pf0900-regulator.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975
  1. // SPDX-License-Identifier: GPL-2.0
  2. // Copyright 2025 NXP.
  3. // NXP PF0900 pmic driver
  4. #include <linux/bitfield.h>
  5. #include <linux/crc8.h>
  6. #include <linux/err.h>
  7. #include <linux/gpio/consumer.h>
  8. #include <linux/i2c.h>
  9. #include <linux/interrupt.h>
  10. #include <linux/kernel.h>
  11. #include <linux/module.h>
  12. #include <linux/of.h>
  13. #include <linux/of_device.h>
  14. #include <linux/platform_device.h>
  15. #include <linux/regmap.h>
  16. #include <linux/regulator/driver.h>
  17. #include <linux/regulator/machine.h>
  18. #include <linux/regulator/of_regulator.h>
  19. enum pf0900_regulators {
  20. PF0900_SW1 = 0,
  21. PF0900_SW2,
  22. PF0900_SW3,
  23. PF0900_SW4,
  24. PF0900_SW5,
  25. PF0900_LDO1,
  26. PF0900_LDO2,
  27. PF0900_LDO3,
  28. PF0900_VAON,
  29. PF0900_REGULATOR_CNT,
  30. };
  31. enum {
  32. PF0900_DVS_LEVEL_RUN = 0,
  33. PF0900_DVS_LEVEL_STANDBY,
  34. PF0900_DVS_LEVEL_MAX,
  35. };
  36. #define PF0900_VAON_VOLTAGE_NUM 0x03
  37. #define PF0900_SW_VOLTAGE_NUM 0x100
  38. #define PF0900_LDO_VOLTAGE_NUM 0x20
  39. #define REGU_SW_CNT 0x5
  40. #define REGU_LDO_VAON_CNT 0x4
  41. enum {
  42. PF0900_REG_DEV_ID = 0x00,
  43. PF0900_REG_DEV_FAM = 0x01,
  44. PF0900_REG_REV_ID = 0x02,
  45. PF0900_REG_PROG_ID1 = 0x03,
  46. PF0900_REG_PROG_ID2 = 0x04,
  47. PF0900_REG_SYSTEM_INT = 0x05,
  48. PF0900_REG_STATUS1_INT = 0x06,
  49. PF0900_REG_STATUS1_MSK = 0x07,
  50. PF0900_REG_STATUS1_SNS = 0x08,
  51. PF0900_REG_STATUS2_INT = 0x09,
  52. PF0900_REG_STATUS2_MSK = 0x0A,
  53. PF0900_REG_STATUS2_SNS = 0x0B,
  54. PF0900_REG_STATUS3_INT = 0x0C,
  55. PF0900_REG_STATUS3_MSK = 0x0D,
  56. PF0900_REG_SW_MODE_INT = 0x0E,
  57. PF0900_REG_SW_MODE_MSK = 0x0F,
  58. PF0900_REG_SW_ILIM_INT = 0x10,
  59. PF0900_REG_SW_ILIM_MSK = 0x11,
  60. PF0900_REG_SW_ILIM_SNS = 0x12,
  61. PF0900_REG_LDO_ILIM_INT = 0x13,
  62. PF0900_REG_LDO_ILIM_MSK = 0x14,
  63. PF0900_REG_LDO_ILIM_SNS = 0x15,
  64. PF0900_REG_SW_UV_INT = 0x16,
  65. PF0900_REG_SW_UV_MSK = 0x17,
  66. PF0900_REG_SW_UV_SNS = 0x18,
  67. PF0900_REG_SW_OV_INT = 0x19,
  68. PF0900_REG_SW_OV_MSK = 0x1A,
  69. PF0900_REG_SW_OV_SNS = 0x1B,
  70. PF0900_REG_LDO_UV_INT = 0x1C,
  71. PF0900_REG_LDO_UV_MSK = 0x1D,
  72. PF0900_REG_LDO_UV_SNS = 0x1E,
  73. PF0900_REG_LDO_OV_INT = 0x1F,
  74. PF0900_REG_LDO_OV_MSK = 0x20,
  75. PF0900_REG_LDO_OV_SNS = 0x21,
  76. PF0900_REG_PWRON_INT = 0x22,
  77. PF0900_REG_IO_INT = 0x24,
  78. PF0900_REG_IO_MSK = 0x25,
  79. PF0900_REG_IO_SNS = 0x26,
  80. PF0900_REG_IOSHORT_SNS = 0x27,
  81. PF0900_REG_ABIST_OV1 = 0x28,
  82. PF0900_REG_ABIST_OV2 = 0x29,
  83. PF0900_REG_ABIST_UV1 = 0x2A,
  84. PF0900_REG_ABIST_UV2 = 0x2B,
  85. PF0900_REG_ABIST_IO = 0x2C,
  86. PF0900_REG_TEST_FLAGS = 0x2D,
  87. PF0900_REG_HFAULT_FLAGS = 0x2E,
  88. PF0900_REG_FAULT_FLAGS = 0x2F,
  89. PF0900_REG_FS0B_CFG = 0x30,
  90. PF0900_REG_FCCU_CFG = 0x31,
  91. PF0900_REG_RSTB_CFG1 = 0x32,
  92. PF0900_REG_SYSTEM_CMD = 0x33,
  93. PF0900_REG_FS0B_CMD = 0x34,
  94. PF0900_REG_SECURE_WR1 = 0x35,
  95. PF0900_REG_SECURE_WR2 = 0x36,
  96. PF0900_REG_VMON_CFG1 = 0x37,
  97. PF0900_REG_SYS_CFG1 = 0x38,
  98. PF0900_REG_GPO_CFG = 0x39,
  99. PF0900_REG_GPO_CTRL = 0x3A,
  100. PF0900_REG_PWRUP_CFG = 0x3B,
  101. PF0900_REG_RSTB_PWRUP = 0x3C,
  102. PF0900_REG_GPIO1_PWRUP = 0x3D,
  103. PF0900_REG_GPIO2_PWRUP = 0x3E,
  104. PF0900_REG_GPIO3_PWRUP = 0x3F,
  105. PF0900_REG_GPIO4_PWRUP = 0x40,
  106. PF0900_REG_VMON1_PWRUP = 0x41,
  107. PF0900_REG_VMON2_PWRUP = 0x42,
  108. PF0900_REG_SW1_PWRUP = 0x43,
  109. PF0900_REG_SW2_PWRUP = 0x44,
  110. PF0900_REG_SW3_PWRUP = 0x45,
  111. PF0900_REG_SW4_PWRUP = 0x46,
  112. PF0900_REG_SW5_PWRUP = 0x47,
  113. PF0900_REG_LDO1_PWRUP = 0x48,
  114. PF0900_REG_LDO2_PWRUP = 0x49,
  115. PF0900_REG_LDO3_PWRUP = 0x4A,
  116. PF0900_REG_VAON_PWRUP = 0x4B,
  117. PF0900_REG_FREQ_CTRL = 0x4C,
  118. PF0900_REG_PWRON_CFG = 0x4D,
  119. PF0900_REG_WD_CTRL1 = 0x4E,
  120. PF0900_REG_WD_CTRL2 = 0x4F,
  121. PF0900_REG_WD_CFG1 = 0x50,
  122. PF0900_REG_WD_CFG2 = 0x51,
  123. PF0900_REG_WD_CNT1 = 0x52,
  124. PF0900_REG_WD_CNT2 = 0x53,
  125. PF0900_REG_FAULT_CFG = 0x54,
  126. PF0900_REG_FAULT_CNT = 0x55,
  127. PF0900_REG_DFS_CNT = 0x56,
  128. PF0900_REG_AMUX_CFG = 0x57,
  129. PF0900_REG_VMON1_RUN_CFG = 0x58,
  130. PF0900_REG_VMON1_STBY_CFG = 0x59,
  131. PF0900_REG_VMON1_CTRL = 0x5A,
  132. PF0900_REG_VMON2_RUN_CFG = 0x5B,
  133. PF0900_REG_VMON2_STBY_CFG = 0x5C,
  134. PF0900_REG_VMON2_CTRL = 0x5D,
  135. PF0900_REG_SW1_VRUN = 0x5E,
  136. PF0900_REG_SW1_VSTBY = 0x5F,
  137. PF0900_REG_SW1_MODE = 0x60,
  138. PF0900_REG_SW1_CFG1 = 0x61,
  139. PF0900_REG_SW1_CFG2 = 0x62,
  140. PF0900_REG_SW2_VRUN = 0x63,
  141. PF0900_REG_SW2_VSTBY = 0x64,
  142. PF0900_REG_SW2_MODE = 0x65,
  143. PF0900_REG_SW2_CFG1 = 0x66,
  144. PF0900_REG_SW2_CFG2 = 0x67,
  145. PF0900_REG_SW3_VRUN = 0x68,
  146. PF0900_REG_SW3_VSTBY = 0x69,
  147. PF0900_REG_SW3_MODE = 0x6A,
  148. PF0900_REG_SW3_CFG1 = 0x6B,
  149. PF0900_REG_SW3_CFG2 = 0x6C,
  150. PF0900_REG_SW4_VRUN = 0x6D,
  151. PF0900_REG_SW4_VSTBY = 0x6E,
  152. PF0900_REG_SW4_MODE = 0x6F,
  153. PF0900_REG_SW4_CFG1 = 0x70,
  154. PF0900_REG_SW4_CFG2 = 0x71,
  155. PF0900_REG_SW5_VRUN = 0x72,
  156. PF0900_REG_SW5_VSTBY = 0x73,
  157. PF0900_REG_SW5_MODE = 0x74,
  158. PF0900_REG_SW5_CFG1 = 0x75,
  159. PF0900_REG_SW5_CFG2 = 0x76,
  160. PF0900_REG_LDO1_RUN = 0x77,
  161. PF0900_REG_LDO1_STBY = 0x78,
  162. PF0900_REG_LDO1_CFG2 = 0x79,
  163. PF0900_REG_LDO2_RUN = 0x7A,
  164. PF0900_REG_LDO2_STBY = 0x7B,
  165. PF0900_REG_LDO2_CFG2 = 0x7C,
  166. PF0900_REG_LDO3_RUN = 0x7D,
  167. PF0900_REG_LDO3_STBY = 0x7E,
  168. PF0900_REG_LDO3_CFG2 = 0x7F,
  169. PF0900_REG_VAON_CFG1 = 0x80,
  170. PF0900_REG_VAON_CFG2 = 0x81,
  171. PF0900_REG_SYS_DIAG = 0x82,
  172. PF0900_MAX_REGISTER,
  173. };
  174. /* PF0900 SW MODE */
  175. #define SW_RUN_MODE_OFF 0x00
  176. #define SW_RUN_MODE_PWM 0x01
  177. #define SW_RUN_MODE_PFM 0x02
  178. #define SW_STBY_MODE_OFF 0x00
  179. #define SW_STBY_MODE_PWM 0x04
  180. #define SW_STBY_MODE_PFM 0x08
  181. /* PF0900 SW MODE MASK */
  182. #define SW_RUN_MODE_MASK GENMASK(1, 0)
  183. #define SW_STBY_MODE_MASK GENMASK(3, 2)
  184. /* PF0900 SW VRUN/VSTBY MASK */
  185. #define PF0900_SW_VOL_MASK GENMASK(7, 0)
  186. /* PF0900_REG_VAON_CFG1 bits */
  187. #define PF0900_VAON_1P8V 0x01
  188. #define PF0900_VAON_MASK GENMASK(1, 0)
  189. /* PF0900_REG_SWX_CFG1 MASK */
  190. #define PF0900_SW_DVS_MASK GENMASK(4, 3)
  191. /* PF0900_REG_LDO_RUN MASK */
  192. #define VLDO_RUN_MASK GENMASK(4, 0)
  193. #define LDO_RUN_EN_MASK BIT(5)
  194. /* PF0900_REG_STATUS1_INT bits */
  195. #define PF0900_IRQ_PWRUP BIT(3)
  196. /* PF0900_REG_ILIM_INT bits */
  197. #define PF0900_IRQ_SW1_IL BIT(0)
  198. #define PF0900_IRQ_SW2_IL BIT(1)
  199. #define PF0900_IRQ_SW3_IL BIT(2)
  200. #define PF0900_IRQ_SW4_IL BIT(3)
  201. #define PF0900_IRQ_SW5_IL BIT(4)
  202. #define PF0900_IRQ_LDO1_IL BIT(0)
  203. #define PF0900_IRQ_LDO2_IL BIT(1)
  204. #define PF0900_IRQ_LDO3_IL BIT(2)
  205. /* PF0900_REG_UV_INT bits */
  206. #define PF0900_IRQ_SW1_UV BIT(0)
  207. #define PF0900_IRQ_SW2_UV BIT(1)
  208. #define PF0900_IRQ_SW3_UV BIT(2)
  209. #define PF0900_IRQ_SW4_UV BIT(3)
  210. #define PF0900_IRQ_SW5_UV BIT(4)
  211. #define PF0900_IRQ_LDO1_UV BIT(0)
  212. #define PF0900_IRQ_LDO2_UV BIT(1)
  213. #define PF0900_IRQ_LDO3_UV BIT(2)
  214. #define PF0900_IRQ_VAON_UV BIT(3)
  215. /* PF0900_REG_OV_INT bits */
  216. #define PF0900_IRQ_SW1_OV BIT(0)
  217. #define PF0900_IRQ_SW2_OV BIT(1)
  218. #define PF0900_IRQ_SW3_OV BIT(2)
  219. #define PF0900_IRQ_SW4_OV BIT(3)
  220. #define PF0900_IRQ_SW5_OV BIT(4)
  221. #define PF0900_IRQ_LDO1_OV BIT(0)
  222. #define PF0900_IRQ_LDO2_OV BIT(1)
  223. #define PF0900_IRQ_LDO3_OV BIT(2)
  224. #define PF0900_IRQ_VAON_OV BIT(3)
  225. struct pf0900_regulator_desc {
  226. struct regulator_desc desc;
  227. unsigned int suspend_enable_mask;
  228. unsigned int suspend_voltage_reg;
  229. unsigned int suspend_voltage_cache;
  230. };
  231. struct pf0900_drvdata {
  232. const struct pf0900_regulator_desc *desc;
  233. unsigned int rcnt;
  234. };
  235. struct pf0900 {
  236. struct device *dev;
  237. struct regmap *regmap;
  238. const struct pf0900_drvdata *drvdata;
  239. struct regulator_dev *rdevs[PF0900_REGULATOR_CNT];
  240. int irq;
  241. unsigned short addr;
  242. bool crc_en;
  243. };
  244. enum pf0900_regulator_type {
  245. PF0900_SW = 0,
  246. PF0900_LDO,
  247. };
  248. #define PF0900_REGU_IRQ(_reg, _type, _event) \
  249. { \
  250. .reg = _reg, \
  251. .type = _type, \
  252. .event = _event, \
  253. }
  254. struct pf0900_regulator_irq {
  255. unsigned int reg;
  256. unsigned int type;
  257. unsigned int event;
  258. };
  259. static const struct regmap_range pf0900_range = {
  260. .range_min = PF0900_REG_DEV_ID,
  261. .range_max = PF0900_REG_SYS_DIAG,
  262. };
  263. static const struct regmap_access_table pf0900_volatile_regs = {
  264. .yes_ranges = &pf0900_range,
  265. .n_yes_ranges = 1,
  266. };
  267. static const struct regmap_config pf0900_regmap_config = {
  268. .reg_bits = 8,
  269. .val_bits = 8,
  270. .volatile_table = &pf0900_volatile_regs,
  271. .max_register = PF0900_MAX_REGISTER - 1,
  272. .cache_type = REGCACHE_MAPLE,
  273. };
  274. static uint8_t crc8_j1850(unsigned short addr, unsigned int reg,
  275. unsigned int val)
  276. {
  277. uint8_t crcBuf[3];
  278. uint8_t t_crc;
  279. uint8_t i, j;
  280. crcBuf[0] = addr;
  281. crcBuf[1] = reg;
  282. crcBuf[2] = val;
  283. t_crc = 0xFF;
  284. /*
  285. * The CRC calculation is based on the standard CRC-8-SAE as
  286. * defined in the SAE-J1850 specification with the following
  287. * characteristics.
  288. * Polynomial = 0x1D
  289. * Initial Value = 0xFF
  290. * The CRC byte is calculated by shifting 24-bit data through
  291. * the CRC polynomial.The 24-bits package is built as follows:
  292. * DEVICE_ADDR[b8] + REGISTER_ADDR [b8] +DATA[b8]
  293. * The DEVICE_ADDR is calculated as the 7-bit slave address
  294. * shifted left one space plus the corresponding read/write bit.
  295. * (7Bit Address [b7] << 1 ) + R/W = DEVICE_ADDR[b8]
  296. */
  297. for (i = 0; i < sizeof(crcBuf); i++) {
  298. t_crc ^= crcBuf[i];
  299. for (j = 0; j < 8; j++) {
  300. if ((t_crc & 0x80) != 0) {
  301. t_crc <<= 1;
  302. t_crc ^= 0x1D;
  303. } else {
  304. t_crc <<= 1;
  305. }
  306. }
  307. }
  308. return t_crc;
  309. }
  310. static int pf0900_regmap_read(void *context, unsigned int reg,
  311. unsigned int *val)
  312. {
  313. struct device *dev = context;
  314. struct i2c_client *i2c = to_i2c_client(dev);
  315. struct pf0900 *pf0900 = dev_get_drvdata(dev);
  316. int ret;
  317. u8 crc;
  318. if (!pf0900 || !pf0900->dev)
  319. return -EINVAL;
  320. if (reg >= PF0900_MAX_REGISTER) {
  321. dev_err(pf0900->dev, "Invalid register address: 0x%x\n", reg);
  322. return -EINVAL;
  323. }
  324. if (pf0900->crc_en) {
  325. ret = i2c_smbus_read_word_data(i2c, reg);
  326. if (ret < 0) {
  327. dev_err(pf0900->dev, "Read error at reg=0x%x: %d\n", reg, ret);
  328. return ret;
  329. }
  330. *val = (u16)ret;
  331. crc = crc8_j1850(pf0900->addr << 1 | 0x1, reg, FIELD_GET(GENMASK(7, 0), *val));
  332. if (crc != FIELD_GET(GENMASK(15, 8), *val)) {
  333. dev_err(pf0900->dev, "Crc check error!\n");
  334. return -EINVAL;
  335. }
  336. *val = FIELD_GET(GENMASK(7, 0), *val);
  337. } else {
  338. ret = i2c_smbus_read_byte_data(i2c, reg);
  339. if (ret < 0) {
  340. dev_err(pf0900->dev, "Read error at reg=0x%x: %d\n", reg, ret);
  341. return ret;
  342. }
  343. *val = ret;
  344. }
  345. return 0;
  346. }
  347. static int pf0900_regmap_write(void *context, unsigned int reg,
  348. unsigned int val)
  349. {
  350. struct device *dev = context;
  351. struct i2c_client *i2c = to_i2c_client(dev);
  352. struct pf0900 *pf0900 = dev_get_drvdata(dev);
  353. uint8_t data[2];
  354. int ret;
  355. if (!pf0900 || !pf0900->dev)
  356. return -EINVAL;
  357. if (reg >= PF0900_MAX_REGISTER) {
  358. dev_err(pf0900->dev, "Invalid register address: 0x%x\n", reg);
  359. return -EINVAL;
  360. }
  361. data[0] = val;
  362. if (pf0900->crc_en) {
  363. /* Get CRC */
  364. data[1] = crc8_j1850(pf0900->addr << 1, reg, data[0]);
  365. val = FIELD_PREP(GENMASK(15, 8), data[1]) | data[0];
  366. ret = i2c_smbus_write_word_data(i2c, reg, val);
  367. } else {
  368. ret = i2c_smbus_write_byte_data(i2c, reg, data[0]);
  369. }
  370. if (ret) {
  371. dev_err(pf0900->dev, "Write reg=0x%x error!\n", reg);
  372. return ret;
  373. }
  374. return 0;
  375. }
  376. static int pf0900_suspend_enable(struct regulator_dev *rdev)
  377. {
  378. struct pf0900_regulator_desc *rdata = rdev_get_drvdata(rdev);
  379. struct regmap *rmap = rdev_get_regmap(rdev);
  380. return regmap_update_bits(rmap, rdata->desc.enable_reg,
  381. rdata->suspend_enable_mask, SW_STBY_MODE_PFM);
  382. }
  383. static int pf0900_suspend_disable(struct regulator_dev *rdev)
  384. {
  385. struct pf0900_regulator_desc *rdata = rdev_get_drvdata(rdev);
  386. struct regmap *rmap = rdev_get_regmap(rdev);
  387. return regmap_update_bits(rmap, rdata->desc.enable_reg,
  388. rdata->suspend_enable_mask, SW_STBY_MODE_OFF);
  389. }
  390. static int pf0900_set_suspend_voltage(struct regulator_dev *rdev, int uV)
  391. {
  392. struct pf0900_regulator_desc *rdata = rdev_get_drvdata(rdev);
  393. struct regmap *rmap = rdev_get_regmap(rdev);
  394. int ret;
  395. if (rdata->suspend_voltage_cache == uV)
  396. return 0;
  397. ret = regulator_map_voltage_iterate(rdev, uV, uV);
  398. if (ret < 0) {
  399. dev_err(rdev_get_dev(rdev), "failed to map %i uV\n", uV);
  400. return ret;
  401. }
  402. dev_dbg(rdev_get_dev(rdev), "uV: %i, reg: 0x%x, msk: 0x%x, val: 0x%x\n",
  403. uV, rdata->suspend_voltage_reg, rdata->desc.vsel_mask, ret);
  404. ret = regmap_update_bits(rmap, rdata->suspend_voltage_reg,
  405. rdata->desc.vsel_mask, ret);
  406. if (ret < 0) {
  407. dev_err(rdev_get_dev(rdev), "failed to set %i uV\n", uV);
  408. return ret;
  409. }
  410. rdata->suspend_voltage_cache = uV;
  411. return 0;
  412. }
  413. static const struct regmap_bus pf0900_regmap_bus = {
  414. .reg_read = pf0900_regmap_read,
  415. .reg_write = pf0900_regmap_write,
  416. };
  417. static const struct regulator_ops pf0900_avon_regulator_ops = {
  418. .list_voltage = regulator_list_voltage_table,
  419. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  420. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  421. };
  422. static const struct regulator_ops pf0900_dvs_sw_regulator_ops = {
  423. .enable = regulator_enable_regmap,
  424. .disable = regulator_disable_regmap,
  425. .is_enabled = regulator_is_enabled_regmap,
  426. .list_voltage = regulator_list_voltage_linear_range,
  427. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  428. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  429. .set_voltage_time_sel = regulator_set_voltage_time_sel,
  430. .set_ramp_delay = regulator_set_ramp_delay_regmap,
  431. .set_suspend_enable = pf0900_suspend_enable,
  432. .set_suspend_disable = pf0900_suspend_disable,
  433. .set_suspend_voltage = pf0900_set_suspend_voltage,
  434. };
  435. static const struct regulator_ops pf0900_ldo_regulator_ops = {
  436. .enable = regulator_enable_regmap,
  437. .disable = regulator_disable_regmap,
  438. .is_enabled = regulator_is_enabled_regmap,
  439. .list_voltage = regulator_list_voltage_linear_range,
  440. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  441. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  442. };
  443. /*
  444. * SW1/2/3/4/5
  445. * SW1_DVS[1:0] SW1 DVS ramp rate setting
  446. * 00: 15.6mV/8usec
  447. * 01: 15.6mV/4usec
  448. * 10: 15.6mV/2usec
  449. * 11: 15.6mV/1usec
  450. */
  451. static const unsigned int pf0900_dvs_sw_ramp_table[] = {
  452. 1950, 3900, 7800, 15600
  453. };
  454. /* VAON 1.8V, 3.0V, or 3.3V */
  455. static const int pf0900_vaon_voltages[] = {
  456. 0, 1800000, 3000000, 3300000,
  457. };
  458. /*
  459. * SW1 0.5V to 3.3V
  460. * 0.5V to 1.35V (6.25mV step)
  461. * 1.8V to 2.5V (125mV step)
  462. * 2.8V to 3.3V (250mV step)
  463. */
  464. static const struct linear_range pf0900_dvs_sw1_volts[] = {
  465. REGULATOR_LINEAR_RANGE(0, 0x00, 0x08, 0),
  466. REGULATOR_LINEAR_RANGE(500000, 0x09, 0x91, 6250),
  467. REGULATOR_LINEAR_RANGE(0, 0x92, 0x9E, 0),
  468. REGULATOR_LINEAR_RANGE(1500000, 0x9F, 0x9F, 0),
  469. REGULATOR_LINEAR_RANGE(1800000, 0xA0, 0xD8, 12500),
  470. REGULATOR_LINEAR_RANGE(0, 0xD9, 0xDF, 0),
  471. REGULATOR_LINEAR_RANGE(2800000, 0xE0, 0xF4, 25000),
  472. REGULATOR_LINEAR_RANGE(0, 0xF5, 0xFF, 0),
  473. };
  474. /*
  475. * SW2/3/4/5 0.3V to 3.3V
  476. * 0.45V to 1.35V (6.25mV step)
  477. * 1.8V to 2.5V (125mV step)
  478. * 2.8V to 3.3V (250mV step)
  479. */
  480. static const struct linear_range pf0900_dvs_sw2345_volts[] = {
  481. REGULATOR_LINEAR_RANGE(300000, 0x00, 0x00, 0),
  482. REGULATOR_LINEAR_RANGE(450000, 0x01, 0x91, 6250),
  483. REGULATOR_LINEAR_RANGE(0, 0x92, 0x9E, 0),
  484. REGULATOR_LINEAR_RANGE(1500000, 0x9F, 0x9F, 0),
  485. REGULATOR_LINEAR_RANGE(1800000, 0xA0, 0xD8, 12500),
  486. REGULATOR_LINEAR_RANGE(0, 0xD9, 0xDF, 0),
  487. REGULATOR_LINEAR_RANGE(2800000, 0xE0, 0xF4, 25000),
  488. REGULATOR_LINEAR_RANGE(0, 0xF5, 0xFF, 0),
  489. };
  490. /*
  491. * LDO1
  492. * 0.75V to 3.3V
  493. */
  494. static const struct linear_range pf0900_ldo1_volts[] = {
  495. REGULATOR_LINEAR_RANGE(750000, 0x00, 0x0F, 50000),
  496. REGULATOR_LINEAR_RANGE(1800000, 0x10, 0x1F, 100000),
  497. };
  498. /*
  499. * LDO2/3
  500. * 0.65V to 3.3V (50mV step)
  501. */
  502. static const struct linear_range pf0900_ldo23_volts[] = {
  503. REGULATOR_LINEAR_RANGE(650000, 0x00, 0x0D, 50000),
  504. REGULATOR_LINEAR_RANGE(1400000, 0x0E, 0x0F, 100000),
  505. REGULATOR_LINEAR_RANGE(1800000, 0x10, 0x1F, 100000),
  506. };
  507. static const struct pf0900_regulator_desc pf0900_regulators[] = {
  508. {
  509. .desc = {
  510. .name = "sw1",
  511. .of_match = of_match_ptr("sw1"),
  512. .regulators_node = of_match_ptr("regulators"),
  513. .id = PF0900_SW1,
  514. .ops = &pf0900_dvs_sw_regulator_ops,
  515. .type = REGULATOR_VOLTAGE,
  516. .n_voltages = PF0900_SW_VOLTAGE_NUM,
  517. .linear_ranges = pf0900_dvs_sw1_volts,
  518. .n_linear_ranges = ARRAY_SIZE(pf0900_dvs_sw1_volts),
  519. .vsel_reg = PF0900_REG_SW1_VRUN,
  520. .vsel_mask = PF0900_SW_VOL_MASK,
  521. .enable_reg = PF0900_REG_SW1_MODE,
  522. .enable_mask = SW_RUN_MODE_MASK,
  523. .enable_val = SW_RUN_MODE_PWM,
  524. .ramp_reg = PF0900_REG_SW1_CFG1,
  525. .ramp_mask = PF0900_SW_DVS_MASK,
  526. .ramp_delay_table = pf0900_dvs_sw_ramp_table,
  527. .n_ramp_values = ARRAY_SIZE(pf0900_dvs_sw_ramp_table),
  528. .owner = THIS_MODULE,
  529. },
  530. .suspend_enable_mask = SW_STBY_MODE_MASK,
  531. .suspend_voltage_reg = PF0900_REG_SW1_VSTBY,
  532. },
  533. {
  534. .desc = {
  535. .name = "sw2",
  536. .of_match = of_match_ptr("sw2"),
  537. .regulators_node = of_match_ptr("regulators"),
  538. .id = PF0900_SW2,
  539. .ops = &pf0900_dvs_sw_regulator_ops,
  540. .type = REGULATOR_VOLTAGE,
  541. .n_voltages = PF0900_SW_VOLTAGE_NUM,
  542. .linear_ranges = pf0900_dvs_sw2345_volts,
  543. .n_linear_ranges = ARRAY_SIZE(pf0900_dvs_sw2345_volts),
  544. .vsel_reg = PF0900_REG_SW2_VRUN,
  545. .vsel_mask = PF0900_SW_VOL_MASK,
  546. .enable_reg = PF0900_REG_SW2_MODE,
  547. .enable_mask = SW_RUN_MODE_MASK,
  548. .enable_val = SW_RUN_MODE_PWM,
  549. .ramp_reg = PF0900_REG_SW2_CFG1,
  550. .ramp_mask = PF0900_SW_DVS_MASK,
  551. .ramp_delay_table = pf0900_dvs_sw_ramp_table,
  552. .n_ramp_values = ARRAY_SIZE(pf0900_dvs_sw_ramp_table),
  553. .owner = THIS_MODULE,
  554. },
  555. .suspend_enable_mask = SW_STBY_MODE_MASK,
  556. .suspend_voltage_reg = PF0900_REG_SW2_VSTBY,
  557. },
  558. {
  559. .desc = {
  560. .name = "sw3",
  561. .of_match = of_match_ptr("sw3"),
  562. .regulators_node = of_match_ptr("regulators"),
  563. .id = PF0900_SW3,
  564. .ops = &pf0900_dvs_sw_regulator_ops,
  565. .type = REGULATOR_VOLTAGE,
  566. .n_voltages = PF0900_SW_VOLTAGE_NUM,
  567. .linear_ranges = pf0900_dvs_sw2345_volts,
  568. .n_linear_ranges = ARRAY_SIZE(pf0900_dvs_sw2345_volts),
  569. .vsel_reg = PF0900_REG_SW3_VRUN,
  570. .vsel_mask = PF0900_SW_VOL_MASK,
  571. .enable_reg = PF0900_REG_SW3_MODE,
  572. .enable_mask = SW_RUN_MODE_MASK,
  573. .enable_val = SW_RUN_MODE_PWM,
  574. .ramp_reg = PF0900_REG_SW3_CFG1,
  575. .ramp_mask = PF0900_SW_DVS_MASK,
  576. .ramp_delay_table = pf0900_dvs_sw_ramp_table,
  577. .n_ramp_values = ARRAY_SIZE(pf0900_dvs_sw_ramp_table),
  578. .owner = THIS_MODULE,
  579. },
  580. .suspend_enable_mask = SW_STBY_MODE_MASK,
  581. .suspend_voltage_reg = PF0900_REG_SW3_VSTBY,
  582. },
  583. {
  584. .desc = {
  585. .name = "sw4",
  586. .of_match = of_match_ptr("sw4"),
  587. .regulators_node = of_match_ptr("regulators"),
  588. .id = PF0900_SW4,
  589. .ops = &pf0900_dvs_sw_regulator_ops,
  590. .type = REGULATOR_VOLTAGE,
  591. .n_voltages = PF0900_SW_VOLTAGE_NUM,
  592. .linear_ranges = pf0900_dvs_sw2345_volts,
  593. .n_linear_ranges = ARRAY_SIZE(pf0900_dvs_sw2345_volts),
  594. .vsel_reg = PF0900_REG_SW4_VRUN,
  595. .vsel_mask = PF0900_SW_VOL_MASK,
  596. .enable_reg = PF0900_REG_SW4_MODE,
  597. .enable_mask = SW_RUN_MODE_MASK,
  598. .enable_val = SW_RUN_MODE_PWM,
  599. .ramp_reg = PF0900_REG_SW4_CFG1,
  600. .ramp_mask = PF0900_SW_DVS_MASK,
  601. .ramp_delay_table = pf0900_dvs_sw_ramp_table,
  602. .n_ramp_values = ARRAY_SIZE(pf0900_dvs_sw_ramp_table),
  603. .owner = THIS_MODULE,
  604. },
  605. .suspend_enable_mask = SW_STBY_MODE_MASK,
  606. .suspend_voltage_reg = PF0900_REG_SW4_VSTBY,
  607. },
  608. {
  609. .desc = {
  610. .name = "sw5",
  611. .of_match = of_match_ptr("sw5"),
  612. .regulators_node = of_match_ptr("regulators"),
  613. .id = PF0900_SW5,
  614. .ops = &pf0900_dvs_sw_regulator_ops,
  615. .type = REGULATOR_VOLTAGE,
  616. .n_voltages = PF0900_SW_VOLTAGE_NUM,
  617. .linear_ranges = pf0900_dvs_sw2345_volts,
  618. .n_linear_ranges = ARRAY_SIZE(pf0900_dvs_sw2345_volts),
  619. .vsel_reg = PF0900_REG_SW5_VRUN,
  620. .vsel_mask = PF0900_SW_VOL_MASK,
  621. .enable_reg = PF0900_REG_SW5_MODE,
  622. .enable_mask = SW_RUN_MODE_MASK,
  623. .enable_val = SW_RUN_MODE_PWM,
  624. .ramp_reg = PF0900_REG_SW5_CFG1,
  625. .ramp_mask = PF0900_SW_DVS_MASK,
  626. .ramp_delay_table = pf0900_dvs_sw_ramp_table,
  627. .n_ramp_values = ARRAY_SIZE(pf0900_dvs_sw_ramp_table),
  628. .owner = THIS_MODULE,
  629. },
  630. .suspend_enable_mask = SW_STBY_MODE_MASK,
  631. .suspend_voltage_reg = PF0900_REG_SW5_VSTBY,
  632. },
  633. {
  634. .desc = {
  635. .name = "ldo1",
  636. .of_match = of_match_ptr("ldo1"),
  637. .regulators_node = of_match_ptr("regulators"),
  638. .id = PF0900_LDO1,
  639. .ops = &pf0900_ldo_regulator_ops,
  640. .type = REGULATOR_VOLTAGE,
  641. .n_voltages = PF0900_LDO_VOLTAGE_NUM,
  642. .linear_ranges = pf0900_ldo1_volts,
  643. .n_linear_ranges = ARRAY_SIZE(pf0900_ldo1_volts),
  644. .vsel_reg = PF0900_REG_LDO1_RUN,
  645. .vsel_mask = VLDO_RUN_MASK,
  646. .enable_reg = PF0900_REG_LDO1_RUN,
  647. .enable_mask = LDO_RUN_EN_MASK,
  648. .owner = THIS_MODULE,
  649. },
  650. },
  651. {
  652. .desc = {
  653. .name = "ldo2",
  654. .of_match = of_match_ptr("ldo2"),
  655. .regulators_node = of_match_ptr("regulators"),
  656. .id = PF0900_LDO2,
  657. .ops = &pf0900_ldo_regulator_ops,
  658. .type = REGULATOR_VOLTAGE,
  659. .n_voltages = PF0900_LDO_VOLTAGE_NUM,
  660. .linear_ranges = pf0900_ldo23_volts,
  661. .n_linear_ranges = ARRAY_SIZE(pf0900_ldo23_volts),
  662. .vsel_reg = PF0900_REG_LDO2_RUN,
  663. .vsel_mask = VLDO_RUN_MASK,
  664. .enable_reg = PF0900_REG_LDO2_RUN,
  665. .enable_mask = LDO_RUN_EN_MASK,
  666. .owner = THIS_MODULE,
  667. },
  668. },
  669. {
  670. .desc = {
  671. .name = "ldo3",
  672. .of_match = of_match_ptr("ldo3"),
  673. .regulators_node = of_match_ptr("regulators"),
  674. .id = PF0900_LDO3,
  675. .ops = &pf0900_ldo_regulator_ops,
  676. .type = REGULATOR_VOLTAGE,
  677. .n_voltages = PF0900_LDO_VOLTAGE_NUM,
  678. .linear_ranges = pf0900_ldo23_volts,
  679. .n_linear_ranges = ARRAY_SIZE(pf0900_ldo23_volts),
  680. .vsel_reg = PF0900_REG_LDO3_RUN,
  681. .vsel_mask = VLDO_RUN_MASK,
  682. .enable_reg = PF0900_REG_LDO3_RUN,
  683. .enable_mask = LDO_RUN_EN_MASK,
  684. .owner = THIS_MODULE,
  685. },
  686. },
  687. {
  688. .desc = {
  689. .name = "vaon",
  690. .of_match = of_match_ptr("vaon"),
  691. .regulators_node = of_match_ptr("regulators"),
  692. .id = PF0900_VAON,
  693. .ops = &pf0900_avon_regulator_ops,
  694. .type = REGULATOR_VOLTAGE,
  695. .n_voltages = PF0900_VAON_VOLTAGE_NUM,
  696. .volt_table = pf0900_vaon_voltages,
  697. .enable_reg = PF0900_REG_VAON_CFG1,
  698. .enable_mask = PF0900_VAON_MASK,
  699. .enable_val = PF0900_VAON_1P8V,
  700. .vsel_reg = PF0900_REG_VAON_CFG1,
  701. .vsel_mask = PF0900_VAON_MASK,
  702. .owner = THIS_MODULE,
  703. },
  704. },
  705. };
  706. struct pf0900_regulator_irq regu_irqs[] = {
  707. PF0900_REGU_IRQ(PF0900_REG_SW_ILIM_INT, PF0900_SW, REGULATOR_ERROR_OVER_CURRENT_WARN),
  708. PF0900_REGU_IRQ(PF0900_REG_LDO_ILIM_INT, PF0900_LDO, REGULATOR_ERROR_OVER_CURRENT_WARN),
  709. PF0900_REGU_IRQ(PF0900_REG_SW_UV_INT, PF0900_SW, REGULATOR_ERROR_UNDER_VOLTAGE_WARN),
  710. PF0900_REGU_IRQ(PF0900_REG_LDO_UV_INT, PF0900_LDO, REGULATOR_ERROR_UNDER_VOLTAGE_WARN),
  711. PF0900_REGU_IRQ(PF0900_REG_SW_OV_INT, PF0900_SW, REGULATOR_ERROR_OVER_VOLTAGE_WARN),
  712. PF0900_REGU_IRQ(PF0900_REG_LDO_OV_INT, PF0900_LDO, REGULATOR_ERROR_OVER_VOLTAGE_WARN),
  713. };
  714. static irqreturn_t pf0900_irq_handler(int irq, void *data)
  715. {
  716. unsigned int val, regu, i, index;
  717. struct pf0900 *pf0900 = data;
  718. int ret;
  719. for (i = 0; i < ARRAY_SIZE(regu_irqs); i++) {
  720. ret = regmap_read(pf0900->regmap, regu_irqs[i].reg, &val);
  721. if (ret < 0) {
  722. dev_err(pf0900->dev, "Failed to read %d\n", ret);
  723. return IRQ_NONE;
  724. }
  725. if (val) {
  726. ret = regmap_write_bits(pf0900->regmap, regu_irqs[i].reg, val, val);
  727. if (ret < 0) {
  728. dev_err(pf0900->dev, "Failed to update %d\n", ret);
  729. return IRQ_NONE;
  730. }
  731. if (regu_irqs[i].type == PF0900_SW) {
  732. for (index = 0; index < REGU_SW_CNT; index++) {
  733. if (val & BIT(index)) {
  734. regu = (enum pf0900_regulators)index;
  735. regulator_notifier_call_chain(pf0900->rdevs[regu],
  736. regu_irqs[i].event,
  737. NULL);
  738. }
  739. }
  740. } else if (regu_irqs[i].type == PF0900_LDO) {
  741. for (index = 0; index < REGU_LDO_VAON_CNT; index++) {
  742. if (val & BIT(index)) {
  743. regu = (enum pf0900_regulators)index + PF0900_LDO1;
  744. regulator_notifier_call_chain(pf0900->rdevs[regu],
  745. regu_irqs[i].event,
  746. NULL);
  747. }
  748. }
  749. }
  750. }
  751. }
  752. return IRQ_HANDLED;
  753. }
  754. static int pf0900_i2c_probe(struct i2c_client *i2c)
  755. {
  756. const struct pf0900_regulator_desc *regulator_desc;
  757. const struct pf0900_drvdata *drvdata = NULL;
  758. struct device_node *np = i2c->dev.of_node;
  759. unsigned int device_id, device_fam, i;
  760. struct regulator_config config = { };
  761. struct pf0900 *pf0900;
  762. int ret;
  763. if (!i2c->irq)
  764. return dev_err_probe(&i2c->dev, -EINVAL, "No IRQ configured?\n");
  765. pf0900 = devm_kzalloc(&i2c->dev, sizeof(struct pf0900), GFP_KERNEL);
  766. if (!pf0900)
  767. return -ENOMEM;
  768. drvdata = device_get_match_data(&i2c->dev);
  769. if (!drvdata)
  770. return dev_err_probe(&i2c->dev, -EINVAL, "unable to find driver data\n");
  771. regulator_desc = drvdata->desc;
  772. pf0900->drvdata = drvdata;
  773. pf0900->crc_en = of_property_read_bool(np, "nxp,i2c-crc-enable");
  774. pf0900->irq = i2c->irq;
  775. pf0900->dev = &i2c->dev;
  776. pf0900->addr = i2c->addr;
  777. dev_set_drvdata(&i2c->dev, pf0900);
  778. pf0900->regmap = devm_regmap_init(&i2c->dev, &pf0900_regmap_bus, &i2c->dev,
  779. &pf0900_regmap_config);
  780. if (IS_ERR(pf0900->regmap))
  781. return dev_err_probe(&i2c->dev, PTR_ERR(pf0900->regmap),
  782. "regmap initialization failed\n");
  783. ret = regmap_read(pf0900->regmap, PF0900_REG_DEV_ID, &device_id);
  784. if (ret)
  785. return dev_err_probe(&i2c->dev, ret, "Read device id error\n");
  786. ret = regmap_read(pf0900->regmap, PF0900_REG_DEV_FAM, &device_fam);
  787. if (ret)
  788. return dev_err_probe(&i2c->dev, ret, "Read device fam error\n");
  789. /* Check your board and dts for match the right pmic */
  790. if (device_fam == 0x09 && (device_id & 0x1F) != 0x0)
  791. return dev_err_probe(&i2c->dev, -EINVAL, "Device id(%x) mismatched\n",
  792. device_id >> 4);
  793. for (i = 0; i < drvdata->rcnt; i++) {
  794. const struct regulator_desc *desc;
  795. const struct pf0900_regulator_desc *r;
  796. r = &regulator_desc[i];
  797. desc = &r->desc;
  798. config.regmap = pf0900->regmap;
  799. config.driver_data = (void *)r;
  800. config.dev = pf0900->dev;
  801. pf0900->rdevs[i] = devm_regulator_register(pf0900->dev, desc, &config);
  802. if (IS_ERR(pf0900->rdevs[i]))
  803. return dev_err_probe(pf0900->dev, PTR_ERR(pf0900->rdevs[i]),
  804. "Failed to register regulator(%s)\n", desc->name);
  805. }
  806. ret = devm_request_threaded_irq(pf0900->dev, pf0900->irq, NULL,
  807. pf0900_irq_handler,
  808. (IRQF_TRIGGER_FALLING | IRQF_ONESHOT),
  809. "pf0900-irq", pf0900);
  810. if (ret != 0)
  811. return dev_err_probe(pf0900->dev, ret, "Failed to request IRQ: %d\n",
  812. pf0900->irq);
  813. /*
  814. * The PWRUP_M is unmasked by default. When the device enter in RUN state,
  815. * it will assert the PWRUP_I interrupt and assert the INTB pin to inform
  816. * the MCU that it has finished the power up sequence properly.
  817. */
  818. ret = regmap_write_bits(pf0900->regmap, PF0900_REG_STATUS1_INT, PF0900_IRQ_PWRUP,
  819. PF0900_IRQ_PWRUP);
  820. if (ret)
  821. return dev_err_probe(&i2c->dev, ret, "Clean PWRUP_I error\n");
  822. /* mask interrupt PWRUP */
  823. ret = regmap_update_bits(pf0900->regmap, PF0900_REG_STATUS1_MSK, PF0900_IRQ_PWRUP,
  824. PF0900_IRQ_PWRUP);
  825. if (ret)
  826. return dev_err_probe(&i2c->dev, ret, "Unmask irq error\n");
  827. ret = regmap_update_bits(pf0900->regmap, PF0900_REG_SW_ILIM_MSK, PF0900_IRQ_SW1_IL |
  828. PF0900_IRQ_SW2_IL | PF0900_IRQ_SW3_IL | PF0900_IRQ_SW4_IL |
  829. PF0900_IRQ_SW5_IL, 0);
  830. if (ret)
  831. return dev_err_probe(&i2c->dev, ret, "Unmask irq error\n");
  832. ret = regmap_update_bits(pf0900->regmap, PF0900_REG_SW_UV_MSK, PF0900_IRQ_SW1_UV |
  833. PF0900_IRQ_SW2_UV | PF0900_IRQ_SW3_UV | PF0900_IRQ_SW4_UV |
  834. PF0900_IRQ_SW5_UV, 0);
  835. if (ret)
  836. return dev_err_probe(&i2c->dev, ret, "Unmask irq error\n");
  837. ret = regmap_update_bits(pf0900->regmap, PF0900_REG_SW_OV_MSK, PF0900_IRQ_SW1_OV |
  838. PF0900_IRQ_SW2_OV | PF0900_IRQ_SW3_OV | PF0900_IRQ_SW4_OV |
  839. PF0900_IRQ_SW5_OV, 0);
  840. if (ret)
  841. return dev_err_probe(&i2c->dev, ret, "Unmask irq error\n");
  842. ret = regmap_update_bits(pf0900->regmap, PF0900_REG_LDO_ILIM_MSK, PF0900_IRQ_LDO1_IL |
  843. PF0900_IRQ_LDO2_IL | PF0900_IRQ_LDO3_IL, 0);
  844. if (ret)
  845. return dev_err_probe(&i2c->dev, ret, "Unmask irq error\n");
  846. ret = regmap_update_bits(pf0900->regmap, PF0900_REG_LDO_UV_MSK, PF0900_IRQ_LDO1_UV |
  847. PF0900_IRQ_LDO2_UV | PF0900_IRQ_LDO3_UV | PF0900_IRQ_VAON_UV, 0);
  848. if (ret)
  849. return dev_err_probe(&i2c->dev, ret, "Unmask irq error\n");
  850. ret = regmap_update_bits(pf0900->regmap, PF0900_REG_LDO_OV_MSK, PF0900_IRQ_LDO1_OV |
  851. PF0900_IRQ_LDO2_OV | PF0900_IRQ_LDO3_OV | PF0900_IRQ_VAON_OV, 0);
  852. if (ret)
  853. return dev_err_probe(&i2c->dev, ret, "Unmask irq error\n");
  854. return 0;
  855. }
  856. static struct pf0900_drvdata pf0900_drvdata = {
  857. .desc = pf0900_regulators,
  858. .rcnt = ARRAY_SIZE(pf0900_regulators),
  859. };
  860. static const struct of_device_id pf0900_of_match[] = {
  861. { .compatible = "nxp,pf0900", .data = &pf0900_drvdata},
  862. { }
  863. };
  864. MODULE_DEVICE_TABLE(of, pf0900_of_match);
  865. static struct i2c_driver pf0900_i2c_driver = {
  866. .driver = {
  867. .name = "nxp-pf0900",
  868. .of_match_table = pf0900_of_match,
  869. },
  870. .probe = pf0900_i2c_probe,
  871. };
  872. module_i2c_driver(pf0900_i2c_driver);
  873. MODULE_AUTHOR("Joy Zou <joy.zou@nxp.com>");
  874. MODULE_DESCRIPTION("NXP PF0900 Power Management IC driver");
  875. MODULE_LICENSE("GPL");