pca9450-regulator.c 23 KB

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