pca9450-regulator.c 30 KB

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