pca9450-regulator.c 24 KB

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