pca9450-regulator.c 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467
  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/reboot.h>
  12. #include <linux/module.h>
  13. #include <linux/of.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. #include <dt-bindings/regulator/nxp,pca9450-regulator.h>
  20. static unsigned int pca9450_buck_get_mode(struct regulator_dev *rdev);
  21. static int pca9450_buck_set_mode(struct regulator_dev *rdev, unsigned int mode);
  22. struct pc9450_dvs_config {
  23. unsigned int run_reg; /* dvs0 */
  24. unsigned int run_mask;
  25. unsigned int standby_reg; /* dvs1 */
  26. unsigned int standby_mask;
  27. unsigned int mode_reg; /* ctrl */
  28. unsigned int mode_mask;
  29. };
  30. struct pca9450_regulator_desc {
  31. struct regulator_desc desc;
  32. const struct pc9450_dvs_config dvs;
  33. };
  34. struct pca9450 {
  35. struct device *dev;
  36. struct regmap *regmap;
  37. struct gpio_desc *sd_vsel_gpio;
  38. enum pca9450_chip_type type;
  39. unsigned int rcnt;
  40. int irq;
  41. bool sd_vsel_fixed_low;
  42. };
  43. static const struct regmap_range pca9450_status_range = {
  44. .range_min = PCA9450_REG_INT1,
  45. .range_max = PCA9450_REG_PWRON_STAT,
  46. };
  47. static const struct regmap_access_table pca9450_volatile_regs = {
  48. .yes_ranges = &pca9450_status_range,
  49. .n_yes_ranges = 1,
  50. };
  51. static const struct regmap_config pca9450_regmap_config = {
  52. .reg_bits = 8,
  53. .val_bits = 8,
  54. .volatile_table = &pca9450_volatile_regs,
  55. .max_register = PCA9450_MAX_REGISTER - 1,
  56. .cache_type = REGCACHE_MAPLE,
  57. };
  58. /*
  59. * BUCK1/2/3
  60. * BUCK1RAM[1:0] BUCK1 DVS ramp rate setting
  61. * 00: 25mV/1usec
  62. * 01: 25mV/2usec
  63. * 10: 25mV/4usec
  64. * 11: 25mV/8usec
  65. */
  66. static const unsigned int pca9450_dvs_buck_ramp_table[] = {
  67. 25000, 12500, 6250, 3125
  68. };
  69. static const struct regulator_ops pca9450_dvs_buck_regulator_ops = {
  70. .enable = regulator_enable_regmap,
  71. .disable = regulator_disable_regmap,
  72. .is_enabled = regulator_is_enabled_regmap,
  73. .list_voltage = regulator_list_voltage_linear_range,
  74. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  75. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  76. .set_voltage_time_sel = regulator_set_voltage_time_sel,
  77. .set_ramp_delay = regulator_set_ramp_delay_regmap,
  78. .set_mode = pca9450_buck_set_mode,
  79. .get_mode = pca9450_buck_get_mode,
  80. };
  81. static const struct regulator_ops pca9450_buck_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. .set_voltage_time_sel = regulator_set_voltage_time_sel,
  89. .set_mode = pca9450_buck_set_mode,
  90. .get_mode = pca9450_buck_get_mode,
  91. };
  92. static const struct regulator_ops pca9450_ldo_regulator_ops = {
  93. .enable = regulator_enable_regmap,
  94. .disable = regulator_disable_regmap,
  95. .is_enabled = regulator_is_enabled_regmap,
  96. .list_voltage = regulator_list_voltage_linear_range,
  97. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  98. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  99. };
  100. static unsigned int pca9450_ldo5_get_reg_voltage_sel(struct regulator_dev *rdev)
  101. {
  102. struct pca9450 *pca9450 = rdev_get_drvdata(rdev);
  103. if (pca9450->sd_vsel_fixed_low)
  104. return PCA9450_REG_LDO5CTRL_L;
  105. if (pca9450->sd_vsel_gpio && !gpiod_get_value(pca9450->sd_vsel_gpio))
  106. return PCA9450_REG_LDO5CTRL_L;
  107. return rdev->desc->vsel_reg;
  108. }
  109. static int pca9450_ldo5_get_voltage_sel_regmap(struct regulator_dev *rdev)
  110. {
  111. unsigned int val;
  112. int ret;
  113. ret = regmap_read(rdev->regmap, pca9450_ldo5_get_reg_voltage_sel(rdev), &val);
  114. if (ret != 0)
  115. return ret;
  116. val &= rdev->desc->vsel_mask;
  117. val >>= ffs(rdev->desc->vsel_mask) - 1;
  118. return val;
  119. }
  120. static int pca9450_ldo5_set_voltage_sel_regmap(struct regulator_dev *rdev, unsigned int sel)
  121. {
  122. int ret;
  123. sel <<= ffs(rdev->desc->vsel_mask) - 1;
  124. ret = regmap_update_bits(rdev->regmap, pca9450_ldo5_get_reg_voltage_sel(rdev),
  125. rdev->desc->vsel_mask, sel);
  126. if (ret)
  127. return ret;
  128. if (rdev->desc->apply_bit)
  129. ret = regmap_update_bits(rdev->regmap, rdev->desc->apply_reg,
  130. rdev->desc->apply_bit,
  131. rdev->desc->apply_bit);
  132. return ret;
  133. }
  134. static const struct regulator_ops pca9450_ldo5_regulator_ops = {
  135. .enable = regulator_enable_regmap,
  136. .disable = regulator_disable_regmap,
  137. .is_enabled = regulator_is_enabled_regmap,
  138. .list_voltage = regulator_list_voltage_linear_range,
  139. .set_voltage_sel = pca9450_ldo5_set_voltage_sel_regmap,
  140. .get_voltage_sel = pca9450_ldo5_get_voltage_sel_regmap,
  141. };
  142. /*
  143. * BUCK1/2/3
  144. * 0.60 to 2.1875V (12.5mV step)
  145. */
  146. static const struct linear_range pca9450_dvs_buck_volts[] = {
  147. REGULATOR_LINEAR_RANGE(600000, 0x00, 0x7F, 12500),
  148. };
  149. /*
  150. * BUCK1/3
  151. * 0.65 to 2.2375V (12.5mV step)
  152. */
  153. static const struct linear_range pca9451a_dvs_buck_volts[] = {
  154. REGULATOR_LINEAR_RANGE(650000, 0x00, 0x7F, 12500),
  155. };
  156. /*
  157. * BUCK4/5/6
  158. * 0.6V to 3.4V (25mV step)
  159. */
  160. static const struct linear_range pca9450_buck_volts[] = {
  161. REGULATOR_LINEAR_RANGE(600000, 0x00, 0x70, 25000),
  162. REGULATOR_LINEAR_RANGE(3400000, 0x71, 0x7F, 0),
  163. };
  164. /*
  165. * LDO1
  166. * 1.6 to 3.3V ()
  167. */
  168. static const struct linear_range pca9450_ldo1_volts[] = {
  169. REGULATOR_LINEAR_RANGE(1600000, 0x00, 0x03, 100000),
  170. REGULATOR_LINEAR_RANGE(3000000, 0x04, 0x07, 100000),
  171. };
  172. /*
  173. * LDO2
  174. * 0.8 to 1.15V (50mV step)
  175. */
  176. static const struct linear_range pca9450_ldo2_volts[] = {
  177. REGULATOR_LINEAR_RANGE(800000, 0x00, 0x07, 50000),
  178. };
  179. /*
  180. * LDO3/4
  181. * 0.8 to 3.3V (100mV step)
  182. */
  183. static const struct linear_range pca9450_ldo34_volts[] = {
  184. REGULATOR_LINEAR_RANGE(800000, 0x00, 0x19, 100000),
  185. REGULATOR_LINEAR_RANGE(3300000, 0x1A, 0x1F, 0),
  186. };
  187. /*
  188. * LDO5
  189. * 1.8 to 3.3V (100mV step)
  190. */
  191. static const struct linear_range pca9450_ldo5_volts[] = {
  192. REGULATOR_LINEAR_RANGE(1800000, 0x00, 0x0F, 100000),
  193. };
  194. static int buck_set_dvs(const struct regulator_desc *desc,
  195. struct device_node *np, struct regmap *regmap,
  196. char *prop, unsigned int reg, unsigned int mask)
  197. {
  198. int ret, i;
  199. uint32_t uv;
  200. ret = of_property_read_u32(np, prop, &uv);
  201. if (ret == -EINVAL)
  202. return 0;
  203. else if (ret)
  204. return ret;
  205. for (i = 0; i < desc->n_voltages; i++) {
  206. ret = regulator_desc_list_voltage_linear_range(desc, i);
  207. if (ret < 0)
  208. continue;
  209. if (ret == uv) {
  210. i <<= ffs(desc->vsel_mask) - 1;
  211. ret = regmap_update_bits(regmap, reg, mask, i);
  212. break;
  213. }
  214. }
  215. if (ret == 0) {
  216. const struct pca9450_regulator_desc *regulator = container_of_const(desc,
  217. struct pca9450_regulator_desc, desc);
  218. /* Enable DVS control through PMIC_STBY_REQ for this BUCK */
  219. ret = regmap_update_bits(regmap, regulator->desc.enable_reg,
  220. BUCK1_DVS_CTRL, BUCK1_DVS_CTRL);
  221. }
  222. return ret;
  223. }
  224. static int pca9450_set_dvs_levels(struct device_node *np,
  225. const struct regulator_desc *desc,
  226. struct regulator_config *cfg)
  227. {
  228. const struct pca9450_regulator_desc *data = container_of_const(desc,
  229. struct pca9450_regulator_desc, desc);
  230. const struct pc9450_dvs_config *dvs = &data->dvs;
  231. unsigned int reg, mask;
  232. char *prop;
  233. int i, ret = 0;
  234. for (i = 0; i < PCA9450_DVS_LEVEL_MAX; i++) {
  235. switch (i) {
  236. case PCA9450_DVS_LEVEL_RUN:
  237. prop = "nxp,dvs-run-voltage";
  238. reg = dvs->run_reg;
  239. mask = dvs->run_mask;
  240. break;
  241. case PCA9450_DVS_LEVEL_STANDBY:
  242. prop = "nxp,dvs-standby-voltage";
  243. reg = dvs->standby_reg;
  244. mask = dvs->standby_mask;
  245. break;
  246. default:
  247. return -EINVAL;
  248. }
  249. ret = buck_set_dvs(desc, np, cfg->regmap, prop, reg, mask);
  250. if (ret)
  251. break;
  252. }
  253. return ret;
  254. }
  255. static inline unsigned int pca9450_map_mode(unsigned int mode)
  256. {
  257. switch (mode) {
  258. case PCA9450_BUCK_MODE_AUTO:
  259. return REGULATOR_MODE_NORMAL;
  260. case PCA9450_BUCK_MODE_FORCE_PWM:
  261. return REGULATOR_MODE_FAST;
  262. default:
  263. return REGULATOR_MODE_INVALID;
  264. }
  265. }
  266. static int pca9450_buck_set_mode(struct regulator_dev *rdev, unsigned int mode)
  267. {
  268. const struct pca9450_regulator_desc *desc = container_of_const(rdev->desc,
  269. struct pca9450_regulator_desc, desc);
  270. const struct pc9450_dvs_config *dvs = &desc->dvs;
  271. int val;
  272. switch (mode) {
  273. case REGULATOR_MODE_FAST:
  274. val = dvs->mode_mask;
  275. break;
  276. case REGULATOR_MODE_NORMAL:
  277. val = 0;
  278. break;
  279. default:
  280. return -EINVAL;
  281. }
  282. dev_dbg(&rdev->dev, "pca9450 buck set_mode %#x, %#x, %#x\n",
  283. dvs->mode_reg, dvs->mode_mask, val);
  284. return regmap_update_bits(rdev->regmap, dvs->mode_reg,
  285. dvs->mode_mask, val);
  286. }
  287. static unsigned int pca9450_buck_get_mode(struct regulator_dev *rdev)
  288. {
  289. const struct pca9450_regulator_desc *desc = container_of_const(rdev->desc,
  290. struct pca9450_regulator_desc, desc);
  291. const struct pc9450_dvs_config *dvs = &desc->dvs;
  292. int ret = 0, regval;
  293. ret = regmap_read(rdev->regmap, dvs->mode_reg, &regval);
  294. if (ret != 0) {
  295. dev_err(&rdev->dev,
  296. "Failed to get pca9450 buck mode: %d\n", ret);
  297. return ret;
  298. }
  299. if ((regval & dvs->mode_mask) == dvs->mode_mask)
  300. return REGULATOR_MODE_FAST;
  301. return REGULATOR_MODE_NORMAL;
  302. }
  303. static struct pca9450_regulator_desc pca9450a_regulators[] = {
  304. {
  305. .desc = {
  306. .name = "buck1",
  307. .supply_name = "inb13",
  308. .of_match = of_match_ptr("BUCK1"),
  309. .regulators_node = of_match_ptr("regulators"),
  310. .id = PCA9450_BUCK1,
  311. .ops = &pca9450_dvs_buck_regulator_ops,
  312. .type = REGULATOR_VOLTAGE,
  313. .n_voltages = PCA9450_BUCK1_VOLTAGE_NUM,
  314. .linear_ranges = pca9450_dvs_buck_volts,
  315. .n_linear_ranges = ARRAY_SIZE(pca9450_dvs_buck_volts),
  316. .vsel_reg = PCA9450_REG_BUCK1OUT_DVS0,
  317. .vsel_mask = BUCK1OUT_DVS0_MASK,
  318. .enable_reg = PCA9450_REG_BUCK1CTRL,
  319. .enable_mask = BUCK1_ENMODE_MASK,
  320. .ramp_reg = PCA9450_REG_BUCK1CTRL,
  321. .ramp_mask = BUCK1_RAMP_MASK,
  322. .ramp_delay_table = pca9450_dvs_buck_ramp_table,
  323. .n_ramp_values = ARRAY_SIZE(pca9450_dvs_buck_ramp_table),
  324. .enable_val = BUCK_ENMODE_ONREQ,
  325. .owner = THIS_MODULE,
  326. .of_parse_cb = pca9450_set_dvs_levels,
  327. .of_map_mode = pca9450_map_mode,
  328. },
  329. .dvs = {
  330. .run_reg = PCA9450_REG_BUCK1OUT_DVS0,
  331. .run_mask = BUCK1OUT_DVS0_MASK,
  332. .standby_reg = PCA9450_REG_BUCK1OUT_DVS1,
  333. .standby_mask = BUCK1OUT_DVS1_MASK,
  334. .mode_reg = PCA9450_REG_BUCK1CTRL,
  335. .mode_mask = BUCK1_FPWM,
  336. },
  337. },
  338. {
  339. .desc = {
  340. .name = "buck2",
  341. .supply_name = "inb26",
  342. .of_match = of_match_ptr("BUCK2"),
  343. .regulators_node = of_match_ptr("regulators"),
  344. .id = PCA9450_BUCK2,
  345. .ops = &pca9450_dvs_buck_regulator_ops,
  346. .type = REGULATOR_VOLTAGE,
  347. .n_voltages = PCA9450_BUCK2_VOLTAGE_NUM,
  348. .linear_ranges = pca9450_dvs_buck_volts,
  349. .n_linear_ranges = ARRAY_SIZE(pca9450_dvs_buck_volts),
  350. .vsel_reg = PCA9450_REG_BUCK2OUT_DVS0,
  351. .vsel_mask = BUCK2OUT_DVS0_MASK,
  352. .enable_reg = PCA9450_REG_BUCK2CTRL,
  353. .enable_mask = BUCK2_ENMODE_MASK,
  354. .enable_val = BUCK_ENMODE_ONREQ_STBYREQ,
  355. .ramp_reg = PCA9450_REG_BUCK2CTRL,
  356. .ramp_mask = BUCK2_RAMP_MASK,
  357. .ramp_delay_table = pca9450_dvs_buck_ramp_table,
  358. .n_ramp_values = ARRAY_SIZE(pca9450_dvs_buck_ramp_table),
  359. .owner = THIS_MODULE,
  360. .of_parse_cb = pca9450_set_dvs_levels,
  361. .of_map_mode = pca9450_map_mode,
  362. },
  363. .dvs = {
  364. .run_reg = PCA9450_REG_BUCK2OUT_DVS0,
  365. .run_mask = BUCK2OUT_DVS0_MASK,
  366. .standby_reg = PCA9450_REG_BUCK2OUT_DVS1,
  367. .standby_mask = BUCK2OUT_DVS1_MASK,
  368. .mode_reg = PCA9450_REG_BUCK2CTRL,
  369. .mode_mask = BUCK2_FPWM,
  370. },
  371. },
  372. {
  373. .desc = {
  374. .name = "buck3",
  375. .supply_name = "inb13",
  376. .of_match = of_match_ptr("BUCK3"),
  377. .regulators_node = of_match_ptr("regulators"),
  378. .id = PCA9450_BUCK3,
  379. .ops = &pca9450_dvs_buck_regulator_ops,
  380. .type = REGULATOR_VOLTAGE,
  381. .n_voltages = PCA9450_BUCK3_VOLTAGE_NUM,
  382. .linear_ranges = pca9450_dvs_buck_volts,
  383. .n_linear_ranges = ARRAY_SIZE(pca9450_dvs_buck_volts),
  384. .vsel_reg = PCA9450_REG_BUCK3OUT_DVS0,
  385. .vsel_mask = BUCK3OUT_DVS0_MASK,
  386. .enable_reg = PCA9450_REG_BUCK3CTRL,
  387. .enable_mask = BUCK3_ENMODE_MASK,
  388. .enable_val = BUCK_ENMODE_ONREQ,
  389. .ramp_reg = PCA9450_REG_BUCK3CTRL,
  390. .ramp_mask = BUCK3_RAMP_MASK,
  391. .ramp_delay_table = pca9450_dvs_buck_ramp_table,
  392. .n_ramp_values = ARRAY_SIZE(pca9450_dvs_buck_ramp_table),
  393. .owner = THIS_MODULE,
  394. .of_parse_cb = pca9450_set_dvs_levels,
  395. .of_map_mode = pca9450_map_mode,
  396. },
  397. .dvs = {
  398. .run_reg = PCA9450_REG_BUCK3OUT_DVS0,
  399. .run_mask = BUCK3OUT_DVS0_MASK,
  400. .standby_reg = PCA9450_REG_BUCK3OUT_DVS1,
  401. .standby_mask = BUCK3OUT_DVS1_MASK,
  402. .mode_reg = PCA9450_REG_BUCK3CTRL,
  403. .mode_mask = BUCK3_FPWM,
  404. },
  405. },
  406. {
  407. .desc = {
  408. .name = "buck4",
  409. .supply_name = "inb45",
  410. .of_match = of_match_ptr("BUCK4"),
  411. .regulators_node = of_match_ptr("regulators"),
  412. .id = PCA9450_BUCK4,
  413. .ops = &pca9450_buck_regulator_ops,
  414. .type = REGULATOR_VOLTAGE,
  415. .n_voltages = PCA9450_BUCK4_VOLTAGE_NUM,
  416. .linear_ranges = pca9450_buck_volts,
  417. .n_linear_ranges = ARRAY_SIZE(pca9450_buck_volts),
  418. .vsel_reg = PCA9450_REG_BUCK4OUT,
  419. .vsel_mask = BUCK4OUT_MASK,
  420. .enable_reg = PCA9450_REG_BUCK4CTRL,
  421. .enable_mask = BUCK4_ENMODE_MASK,
  422. .enable_val = BUCK_ENMODE_ONREQ,
  423. .owner = THIS_MODULE,
  424. .of_map_mode = pca9450_map_mode,
  425. },
  426. .dvs = {
  427. .mode_reg = PCA9450_REG_BUCK4CTRL,
  428. .mode_mask = BUCK4_FPWM,
  429. },
  430. },
  431. {
  432. .desc = {
  433. .name = "buck5",
  434. .supply_name = "inb45",
  435. .of_match = of_match_ptr("BUCK5"),
  436. .regulators_node = of_match_ptr("regulators"),
  437. .id = PCA9450_BUCK5,
  438. .ops = &pca9450_buck_regulator_ops,
  439. .type = REGULATOR_VOLTAGE,
  440. .n_voltages = PCA9450_BUCK5_VOLTAGE_NUM,
  441. .linear_ranges = pca9450_buck_volts,
  442. .n_linear_ranges = ARRAY_SIZE(pca9450_buck_volts),
  443. .vsel_reg = PCA9450_REG_BUCK5OUT,
  444. .vsel_mask = BUCK5OUT_MASK,
  445. .enable_reg = PCA9450_REG_BUCK5CTRL,
  446. .enable_mask = BUCK5_ENMODE_MASK,
  447. .enable_val = BUCK_ENMODE_ONREQ,
  448. .owner = THIS_MODULE,
  449. .of_map_mode = pca9450_map_mode,
  450. },
  451. .dvs = {
  452. .mode_reg = PCA9450_REG_BUCK5CTRL,
  453. .mode_mask = BUCK5_FPWM,
  454. },
  455. },
  456. {
  457. .desc = {
  458. .name = "buck6",
  459. .supply_name = "inb26",
  460. .of_match = of_match_ptr("BUCK6"),
  461. .regulators_node = of_match_ptr("regulators"),
  462. .id = PCA9450_BUCK6,
  463. .ops = &pca9450_buck_regulator_ops,
  464. .type = REGULATOR_VOLTAGE,
  465. .n_voltages = PCA9450_BUCK6_VOLTAGE_NUM,
  466. .linear_ranges = pca9450_buck_volts,
  467. .n_linear_ranges = ARRAY_SIZE(pca9450_buck_volts),
  468. .vsel_reg = PCA9450_REG_BUCK6OUT,
  469. .vsel_mask = BUCK6OUT_MASK,
  470. .enable_reg = PCA9450_REG_BUCK6CTRL,
  471. .enable_mask = BUCK6_ENMODE_MASK,
  472. .enable_val = BUCK_ENMODE_ONREQ,
  473. .owner = THIS_MODULE,
  474. .of_map_mode = pca9450_map_mode,
  475. },
  476. .dvs = {
  477. .mode_reg = PCA9450_REG_BUCK6CTRL,
  478. .mode_mask = BUCK6_FPWM,
  479. },
  480. },
  481. {
  482. .desc = {
  483. .name = "ldo1",
  484. .supply_name = "inl1",
  485. .of_match = of_match_ptr("LDO1"),
  486. .regulators_node = of_match_ptr("regulators"),
  487. .id = PCA9450_LDO1,
  488. .ops = &pca9450_ldo_regulator_ops,
  489. .type = REGULATOR_VOLTAGE,
  490. .n_voltages = PCA9450_LDO1_VOLTAGE_NUM,
  491. .linear_ranges = pca9450_ldo1_volts,
  492. .n_linear_ranges = ARRAY_SIZE(pca9450_ldo1_volts),
  493. .vsel_reg = PCA9450_REG_LDO1CTRL,
  494. .vsel_mask = LDO1OUT_MASK,
  495. .enable_reg = PCA9450_REG_LDO1CTRL,
  496. .enable_mask = LDO1_EN_MASK,
  497. .owner = THIS_MODULE,
  498. },
  499. },
  500. {
  501. .desc = {
  502. .name = "ldo2",
  503. .supply_name = "inl1",
  504. .of_match = of_match_ptr("LDO2"),
  505. .regulators_node = of_match_ptr("regulators"),
  506. .id = PCA9450_LDO2,
  507. .ops = &pca9450_ldo_regulator_ops,
  508. .type = REGULATOR_VOLTAGE,
  509. .n_voltages = PCA9450_LDO2_VOLTAGE_NUM,
  510. .linear_ranges = pca9450_ldo2_volts,
  511. .n_linear_ranges = ARRAY_SIZE(pca9450_ldo2_volts),
  512. .vsel_reg = PCA9450_REG_LDO2CTRL,
  513. .vsel_mask = LDO2OUT_MASK,
  514. .enable_reg = PCA9450_REG_LDO2CTRL,
  515. .enable_mask = LDO2_EN_MASK,
  516. .owner = THIS_MODULE,
  517. },
  518. },
  519. {
  520. .desc = {
  521. .name = "ldo3",
  522. .supply_name = "inl1",
  523. .of_match = of_match_ptr("LDO3"),
  524. .regulators_node = of_match_ptr("regulators"),
  525. .id = PCA9450_LDO3,
  526. .ops = &pca9450_ldo_regulator_ops,
  527. .type = REGULATOR_VOLTAGE,
  528. .n_voltages = PCA9450_LDO3_VOLTAGE_NUM,
  529. .linear_ranges = pca9450_ldo34_volts,
  530. .n_linear_ranges = ARRAY_SIZE(pca9450_ldo34_volts),
  531. .vsel_reg = PCA9450_REG_LDO3CTRL,
  532. .vsel_mask = LDO3OUT_MASK,
  533. .enable_reg = PCA9450_REG_LDO3CTRL,
  534. .enable_mask = LDO3_EN_MASK,
  535. .owner = THIS_MODULE,
  536. },
  537. },
  538. {
  539. .desc = {
  540. .name = "ldo4",
  541. .supply_name = "inl1",
  542. .of_match = of_match_ptr("LDO4"),
  543. .regulators_node = of_match_ptr("regulators"),
  544. .id = PCA9450_LDO4,
  545. .ops = &pca9450_ldo_regulator_ops,
  546. .type = REGULATOR_VOLTAGE,
  547. .n_voltages = PCA9450_LDO4_VOLTAGE_NUM,
  548. .linear_ranges = pca9450_ldo34_volts,
  549. .n_linear_ranges = ARRAY_SIZE(pca9450_ldo34_volts),
  550. .vsel_reg = PCA9450_REG_LDO4CTRL,
  551. .vsel_mask = LDO4OUT_MASK,
  552. .enable_reg = PCA9450_REG_LDO4CTRL,
  553. .enable_mask = LDO4_EN_MASK,
  554. .owner = THIS_MODULE,
  555. },
  556. },
  557. {
  558. .desc = {
  559. .name = "ldo5",
  560. .supply_name = "inl1",
  561. .of_match = of_match_ptr("LDO5"),
  562. .regulators_node = of_match_ptr("regulators"),
  563. .id = PCA9450_LDO5,
  564. .ops = &pca9450_ldo5_regulator_ops,
  565. .type = REGULATOR_VOLTAGE,
  566. .n_voltages = PCA9450_LDO5_VOLTAGE_NUM,
  567. .linear_ranges = pca9450_ldo5_volts,
  568. .n_linear_ranges = ARRAY_SIZE(pca9450_ldo5_volts),
  569. .vsel_reg = PCA9450_REG_LDO5CTRL_H,
  570. .vsel_mask = LDO5HOUT_MASK,
  571. .enable_reg = PCA9450_REG_LDO5CTRL_L,
  572. .enable_mask = LDO5H_EN_MASK,
  573. .owner = THIS_MODULE,
  574. },
  575. },
  576. };
  577. /*
  578. * Buck3 removed on PCA9450B and connected with Buck1 internal for dual phase
  579. * on PCA9450C as no Buck3.
  580. */
  581. static struct pca9450_regulator_desc pca9450bc_regulators[] = {
  582. {
  583. .desc = {
  584. .name = "buck1",
  585. .supply_name = "inb13",
  586. .of_match = of_match_ptr("BUCK1"),
  587. .regulators_node = of_match_ptr("regulators"),
  588. .id = PCA9450_BUCK1,
  589. .ops = &pca9450_dvs_buck_regulator_ops,
  590. .type = REGULATOR_VOLTAGE,
  591. .n_voltages = PCA9450_BUCK1_VOLTAGE_NUM,
  592. .linear_ranges = pca9450_dvs_buck_volts,
  593. .n_linear_ranges = ARRAY_SIZE(pca9450_dvs_buck_volts),
  594. .vsel_reg = PCA9450_REG_BUCK1OUT_DVS0,
  595. .vsel_mask = BUCK1OUT_DVS0_MASK,
  596. .enable_reg = PCA9450_REG_BUCK1CTRL,
  597. .enable_mask = BUCK1_ENMODE_MASK,
  598. .enable_val = BUCK_ENMODE_ONREQ,
  599. .ramp_reg = PCA9450_REG_BUCK1CTRL,
  600. .ramp_mask = BUCK1_RAMP_MASK,
  601. .ramp_delay_table = pca9450_dvs_buck_ramp_table,
  602. .n_ramp_values = ARRAY_SIZE(pca9450_dvs_buck_ramp_table),
  603. .owner = THIS_MODULE,
  604. .of_parse_cb = pca9450_set_dvs_levels,
  605. .of_map_mode = pca9450_map_mode,
  606. },
  607. .dvs = {
  608. .run_reg = PCA9450_REG_BUCK1OUT_DVS0,
  609. .run_mask = BUCK1OUT_DVS0_MASK,
  610. .standby_reg = PCA9450_REG_BUCK1OUT_DVS1,
  611. .standby_mask = BUCK1OUT_DVS1_MASK,
  612. .mode_reg = PCA9450_REG_BUCK1CTRL,
  613. .mode_mask = BUCK1_FPWM,
  614. },
  615. },
  616. {
  617. .desc = {
  618. .name = "buck2",
  619. .supply_name = "inb26",
  620. .of_match = of_match_ptr("BUCK2"),
  621. .regulators_node = of_match_ptr("regulators"),
  622. .id = PCA9450_BUCK2,
  623. .ops = &pca9450_dvs_buck_regulator_ops,
  624. .type = REGULATOR_VOLTAGE,
  625. .n_voltages = PCA9450_BUCK2_VOLTAGE_NUM,
  626. .linear_ranges = pca9450_dvs_buck_volts,
  627. .n_linear_ranges = ARRAY_SIZE(pca9450_dvs_buck_volts),
  628. .vsel_reg = PCA9450_REG_BUCK2OUT_DVS0,
  629. .vsel_mask = BUCK2OUT_DVS0_MASK,
  630. .enable_reg = PCA9450_REG_BUCK2CTRL,
  631. .enable_mask = BUCK2_ENMODE_MASK,
  632. .enable_val = BUCK_ENMODE_ONREQ_STBYREQ,
  633. .ramp_reg = PCA9450_REG_BUCK2CTRL,
  634. .ramp_mask = BUCK2_RAMP_MASK,
  635. .ramp_delay_table = pca9450_dvs_buck_ramp_table,
  636. .n_ramp_values = ARRAY_SIZE(pca9450_dvs_buck_ramp_table),
  637. .owner = THIS_MODULE,
  638. .of_parse_cb = pca9450_set_dvs_levels,
  639. .of_map_mode = pca9450_map_mode,
  640. },
  641. .dvs = {
  642. .run_reg = PCA9450_REG_BUCK2OUT_DVS0,
  643. .run_mask = BUCK2OUT_DVS0_MASK,
  644. .standby_reg = PCA9450_REG_BUCK2OUT_DVS1,
  645. .standby_mask = BUCK2OUT_DVS1_MASK,
  646. .mode_reg = PCA9450_REG_BUCK2CTRL,
  647. .mode_mask = BUCK2_FPWM,
  648. },
  649. },
  650. {
  651. .desc = {
  652. .name = "buck4",
  653. .supply_name = "inb45",
  654. .of_match = of_match_ptr("BUCK4"),
  655. .regulators_node = of_match_ptr("regulators"),
  656. .id = PCA9450_BUCK4,
  657. .ops = &pca9450_buck_regulator_ops,
  658. .type = REGULATOR_VOLTAGE,
  659. .n_voltages = PCA9450_BUCK4_VOLTAGE_NUM,
  660. .linear_ranges = pca9450_buck_volts,
  661. .n_linear_ranges = ARRAY_SIZE(pca9450_buck_volts),
  662. .vsel_reg = PCA9450_REG_BUCK4OUT,
  663. .vsel_mask = BUCK4OUT_MASK,
  664. .enable_reg = PCA9450_REG_BUCK4CTRL,
  665. .enable_mask = BUCK4_ENMODE_MASK,
  666. .enable_val = BUCK_ENMODE_ONREQ,
  667. .owner = THIS_MODULE,
  668. .of_map_mode = pca9450_map_mode,
  669. },
  670. .dvs = {
  671. .mode_reg = PCA9450_REG_BUCK4CTRL,
  672. .mode_mask = BUCK4_FPWM,
  673. },
  674. },
  675. {
  676. .desc = {
  677. .name = "buck5",
  678. .supply_name = "inb45",
  679. .of_match = of_match_ptr("BUCK5"),
  680. .regulators_node = of_match_ptr("regulators"),
  681. .id = PCA9450_BUCK5,
  682. .ops = &pca9450_buck_regulator_ops,
  683. .type = REGULATOR_VOLTAGE,
  684. .n_voltages = PCA9450_BUCK5_VOLTAGE_NUM,
  685. .linear_ranges = pca9450_buck_volts,
  686. .n_linear_ranges = ARRAY_SIZE(pca9450_buck_volts),
  687. .vsel_reg = PCA9450_REG_BUCK5OUT,
  688. .vsel_mask = BUCK5OUT_MASK,
  689. .enable_reg = PCA9450_REG_BUCK5CTRL,
  690. .enable_mask = BUCK5_ENMODE_MASK,
  691. .enable_val = BUCK_ENMODE_ONREQ,
  692. .owner = THIS_MODULE,
  693. .of_map_mode = pca9450_map_mode,
  694. },
  695. .dvs = {
  696. .mode_reg = PCA9450_REG_BUCK5CTRL,
  697. .mode_mask = BUCK5_FPWM,
  698. },
  699. },
  700. {
  701. .desc = {
  702. .name = "buck6",
  703. .supply_name = "inb26",
  704. .of_match = of_match_ptr("BUCK6"),
  705. .regulators_node = of_match_ptr("regulators"),
  706. .id = PCA9450_BUCK6,
  707. .ops = &pca9450_buck_regulator_ops,
  708. .type = REGULATOR_VOLTAGE,
  709. .n_voltages = PCA9450_BUCK6_VOLTAGE_NUM,
  710. .linear_ranges = pca9450_buck_volts,
  711. .n_linear_ranges = ARRAY_SIZE(pca9450_buck_volts),
  712. .vsel_reg = PCA9450_REG_BUCK6OUT,
  713. .vsel_mask = BUCK6OUT_MASK,
  714. .enable_reg = PCA9450_REG_BUCK6CTRL,
  715. .enable_mask = BUCK6_ENMODE_MASK,
  716. .enable_val = BUCK_ENMODE_ONREQ,
  717. .owner = THIS_MODULE,
  718. .of_map_mode = pca9450_map_mode,
  719. },
  720. .dvs = {
  721. .mode_reg = PCA9450_REG_BUCK6CTRL,
  722. .mode_mask = BUCK6_FPWM,
  723. },
  724. },
  725. {
  726. .desc = {
  727. .name = "ldo1",
  728. .supply_name = "inl1",
  729. .of_match = of_match_ptr("LDO1"),
  730. .regulators_node = of_match_ptr("regulators"),
  731. .id = PCA9450_LDO1,
  732. .ops = &pca9450_ldo_regulator_ops,
  733. .type = REGULATOR_VOLTAGE,
  734. .n_voltages = PCA9450_LDO1_VOLTAGE_NUM,
  735. .linear_ranges = pca9450_ldo1_volts,
  736. .n_linear_ranges = ARRAY_SIZE(pca9450_ldo1_volts),
  737. .vsel_reg = PCA9450_REG_LDO1CTRL,
  738. .vsel_mask = LDO1OUT_MASK,
  739. .enable_reg = PCA9450_REG_LDO1CTRL,
  740. .enable_mask = LDO1_EN_MASK,
  741. .owner = THIS_MODULE,
  742. },
  743. },
  744. {
  745. .desc = {
  746. .name = "ldo2",
  747. .supply_name = "inl1",
  748. .of_match = of_match_ptr("LDO2"),
  749. .regulators_node = of_match_ptr("regulators"),
  750. .id = PCA9450_LDO2,
  751. .ops = &pca9450_ldo_regulator_ops,
  752. .type = REGULATOR_VOLTAGE,
  753. .n_voltages = PCA9450_LDO2_VOLTAGE_NUM,
  754. .linear_ranges = pca9450_ldo2_volts,
  755. .n_linear_ranges = ARRAY_SIZE(pca9450_ldo2_volts),
  756. .vsel_reg = PCA9450_REG_LDO2CTRL,
  757. .vsel_mask = LDO2OUT_MASK,
  758. .enable_reg = PCA9450_REG_LDO2CTRL,
  759. .enable_mask = LDO2_EN_MASK,
  760. .owner = THIS_MODULE,
  761. },
  762. },
  763. {
  764. .desc = {
  765. .name = "ldo3",
  766. .supply_name = "inl1",
  767. .of_match = of_match_ptr("LDO3"),
  768. .regulators_node = of_match_ptr("regulators"),
  769. .id = PCA9450_LDO3,
  770. .ops = &pca9450_ldo_regulator_ops,
  771. .type = REGULATOR_VOLTAGE,
  772. .n_voltages = PCA9450_LDO3_VOLTAGE_NUM,
  773. .linear_ranges = pca9450_ldo34_volts,
  774. .n_linear_ranges = ARRAY_SIZE(pca9450_ldo34_volts),
  775. .vsel_reg = PCA9450_REG_LDO3CTRL,
  776. .vsel_mask = LDO3OUT_MASK,
  777. .enable_reg = PCA9450_REG_LDO3CTRL,
  778. .enable_mask = LDO3_EN_MASK,
  779. .owner = THIS_MODULE,
  780. },
  781. },
  782. {
  783. .desc = {
  784. .name = "ldo4",
  785. .supply_name = "inl1",
  786. .of_match = of_match_ptr("LDO4"),
  787. .regulators_node = of_match_ptr("regulators"),
  788. .id = PCA9450_LDO4,
  789. .ops = &pca9450_ldo_regulator_ops,
  790. .type = REGULATOR_VOLTAGE,
  791. .n_voltages = PCA9450_LDO4_VOLTAGE_NUM,
  792. .linear_ranges = pca9450_ldo34_volts,
  793. .n_linear_ranges = ARRAY_SIZE(pca9450_ldo34_volts),
  794. .vsel_reg = PCA9450_REG_LDO4CTRL,
  795. .vsel_mask = LDO4OUT_MASK,
  796. .enable_reg = PCA9450_REG_LDO4CTRL,
  797. .enable_mask = LDO4_EN_MASK,
  798. .owner = THIS_MODULE,
  799. },
  800. },
  801. {
  802. .desc = {
  803. .name = "ldo5",
  804. .supply_name = "inl1",
  805. .of_match = of_match_ptr("LDO5"),
  806. .regulators_node = of_match_ptr("regulators"),
  807. .id = PCA9450_LDO5,
  808. .ops = &pca9450_ldo5_regulator_ops,
  809. .type = REGULATOR_VOLTAGE,
  810. .n_voltages = PCA9450_LDO5_VOLTAGE_NUM,
  811. .linear_ranges = pca9450_ldo5_volts,
  812. .n_linear_ranges = ARRAY_SIZE(pca9450_ldo5_volts),
  813. .vsel_reg = PCA9450_REG_LDO5CTRL_H,
  814. .vsel_mask = LDO5HOUT_MASK,
  815. .enable_reg = PCA9450_REG_LDO5CTRL_L,
  816. .enable_mask = LDO5H_EN_MASK,
  817. .owner = THIS_MODULE,
  818. },
  819. },
  820. };
  821. static struct pca9450_regulator_desc pca9451a_regulators[] = {
  822. {
  823. .desc = {
  824. .name = "buck1",
  825. .supply_name = "inb13",
  826. .of_match = of_match_ptr("BUCK1"),
  827. .regulators_node = of_match_ptr("regulators"),
  828. .id = PCA9450_BUCK1,
  829. .ops = &pca9450_dvs_buck_regulator_ops,
  830. .type = REGULATOR_VOLTAGE,
  831. .n_voltages = PCA9450_BUCK1_VOLTAGE_NUM,
  832. .linear_ranges = pca9451a_dvs_buck_volts,
  833. .n_linear_ranges = ARRAY_SIZE(pca9451a_dvs_buck_volts),
  834. .vsel_reg = PCA9450_REG_BUCK1OUT_DVS0,
  835. .vsel_mask = BUCK1OUT_DVS0_MASK,
  836. .enable_reg = PCA9450_REG_BUCK1CTRL,
  837. .enable_mask = BUCK1_ENMODE_MASK,
  838. .enable_val = BUCK_ENMODE_ONREQ,
  839. .ramp_mask = BUCK1_RAMP_MASK,
  840. .ramp_delay_table = pca9450_dvs_buck_ramp_table,
  841. .n_ramp_values = ARRAY_SIZE(pca9450_dvs_buck_ramp_table),
  842. .owner = THIS_MODULE,
  843. .of_parse_cb = pca9450_set_dvs_levels,
  844. .of_map_mode = pca9450_map_mode,
  845. },
  846. .dvs = {
  847. .run_reg = PCA9450_REG_BUCK1OUT_DVS0,
  848. .run_mask = BUCK1OUT_DVS0_MASK,
  849. .standby_reg = PCA9450_REG_BUCK1OUT_DVS1,
  850. .standby_mask = BUCK1OUT_DVS1_MASK,
  851. .mode_reg = PCA9450_REG_BUCK1CTRL,
  852. .mode_mask = BUCK1_FPWM,
  853. },
  854. },
  855. {
  856. .desc = {
  857. .name = "buck2",
  858. .supply_name = "inb26",
  859. .of_match = of_match_ptr("BUCK2"),
  860. .regulators_node = of_match_ptr("regulators"),
  861. .id = PCA9450_BUCK2,
  862. .ops = &pca9450_dvs_buck_regulator_ops,
  863. .type = REGULATOR_VOLTAGE,
  864. .n_voltages = PCA9450_BUCK2_VOLTAGE_NUM,
  865. .linear_ranges = pca9450_dvs_buck_volts,
  866. .n_linear_ranges = ARRAY_SIZE(pca9450_dvs_buck_volts),
  867. .vsel_reg = PCA9450_REG_BUCK2OUT_DVS0,
  868. .vsel_mask = BUCK2OUT_DVS0_MASK,
  869. .enable_reg = PCA9450_REG_BUCK2CTRL,
  870. .enable_mask = BUCK2_ENMODE_MASK,
  871. .enable_val = BUCK_ENMODE_ONREQ_STBYREQ,
  872. .ramp_mask = BUCK2_RAMP_MASK,
  873. .ramp_delay_table = pca9450_dvs_buck_ramp_table,
  874. .n_ramp_values = ARRAY_SIZE(pca9450_dvs_buck_ramp_table),
  875. .owner = THIS_MODULE,
  876. .of_parse_cb = pca9450_set_dvs_levels,
  877. .of_map_mode = pca9450_map_mode,
  878. },
  879. .dvs = {
  880. .run_reg = PCA9450_REG_BUCK2OUT_DVS0,
  881. .run_mask = BUCK2OUT_DVS0_MASK,
  882. .standby_reg = PCA9450_REG_BUCK2OUT_DVS1,
  883. .standby_mask = BUCK2OUT_DVS1_MASK,
  884. .mode_reg = PCA9450_REG_BUCK2CTRL,
  885. .mode_mask = BUCK2_FPWM,
  886. },
  887. },
  888. {
  889. .desc = {
  890. .name = "buck4",
  891. .supply_name = "inb45",
  892. .of_match = of_match_ptr("BUCK4"),
  893. .regulators_node = of_match_ptr("regulators"),
  894. .id = PCA9450_BUCK4,
  895. .ops = &pca9450_buck_regulator_ops,
  896. .type = REGULATOR_VOLTAGE,
  897. .n_voltages = PCA9450_BUCK4_VOLTAGE_NUM,
  898. .linear_ranges = pca9450_buck_volts,
  899. .n_linear_ranges = ARRAY_SIZE(pca9450_buck_volts),
  900. .vsel_reg = PCA9450_REG_BUCK4OUT,
  901. .vsel_mask = BUCK4OUT_MASK,
  902. .enable_reg = PCA9450_REG_BUCK4CTRL,
  903. .enable_mask = BUCK4_ENMODE_MASK,
  904. .enable_val = BUCK_ENMODE_ONREQ,
  905. .owner = THIS_MODULE,
  906. .of_map_mode = pca9450_map_mode,
  907. },
  908. .dvs = {
  909. .mode_reg = PCA9450_REG_BUCK4CTRL,
  910. .mode_mask = BUCK4_FPWM,
  911. },
  912. },
  913. {
  914. .desc = {
  915. .name = "buck5",
  916. .supply_name = "inb45",
  917. .of_match = of_match_ptr("BUCK5"),
  918. .regulators_node = of_match_ptr("regulators"),
  919. .id = PCA9450_BUCK5,
  920. .ops = &pca9450_buck_regulator_ops,
  921. .type = REGULATOR_VOLTAGE,
  922. .n_voltages = PCA9450_BUCK5_VOLTAGE_NUM,
  923. .linear_ranges = pca9450_buck_volts,
  924. .n_linear_ranges = ARRAY_SIZE(pca9450_buck_volts),
  925. .vsel_reg = PCA9450_REG_BUCK5OUT,
  926. .vsel_mask = BUCK5OUT_MASK,
  927. .enable_reg = PCA9450_REG_BUCK5CTRL,
  928. .enable_mask = BUCK5_ENMODE_MASK,
  929. .enable_val = BUCK_ENMODE_ONREQ,
  930. .owner = THIS_MODULE,
  931. .of_map_mode = pca9450_map_mode,
  932. },
  933. .dvs = {
  934. .mode_reg = PCA9450_REG_BUCK5CTRL,
  935. .mode_mask = BUCK5_FPWM,
  936. },
  937. },
  938. {
  939. .desc = {
  940. .name = "buck6",
  941. .supply_name = "inb26",
  942. .of_match = of_match_ptr("BUCK6"),
  943. .regulators_node = of_match_ptr("regulators"),
  944. .id = PCA9450_BUCK6,
  945. .ops = &pca9450_buck_regulator_ops,
  946. .type = REGULATOR_VOLTAGE,
  947. .n_voltages = PCA9450_BUCK6_VOLTAGE_NUM,
  948. .linear_ranges = pca9450_buck_volts,
  949. .n_linear_ranges = ARRAY_SIZE(pca9450_buck_volts),
  950. .vsel_reg = PCA9450_REG_BUCK6OUT,
  951. .vsel_mask = BUCK6OUT_MASK,
  952. .enable_reg = PCA9450_REG_BUCK6CTRL,
  953. .enable_mask = BUCK6_ENMODE_MASK,
  954. .enable_val = BUCK_ENMODE_ONREQ,
  955. .owner = THIS_MODULE,
  956. .of_map_mode = pca9450_map_mode,
  957. },
  958. .dvs = {
  959. .mode_reg = PCA9450_REG_BUCK6CTRL,
  960. .mode_mask = BUCK6_FPWM,
  961. },
  962. },
  963. {
  964. .desc = {
  965. .name = "ldo1",
  966. .supply_name = "inl1",
  967. .of_match = of_match_ptr("LDO1"),
  968. .regulators_node = of_match_ptr("regulators"),
  969. .id = PCA9450_LDO1,
  970. .ops = &pca9450_ldo_regulator_ops,
  971. .type = REGULATOR_VOLTAGE,
  972. .n_voltages = PCA9450_LDO1_VOLTAGE_NUM,
  973. .linear_ranges = pca9450_ldo1_volts,
  974. .n_linear_ranges = ARRAY_SIZE(pca9450_ldo1_volts),
  975. .vsel_reg = PCA9450_REG_LDO1CTRL,
  976. .vsel_mask = LDO1OUT_MASK,
  977. .enable_reg = PCA9450_REG_LDO1CTRL,
  978. .enable_mask = LDO1_EN_MASK,
  979. .owner = THIS_MODULE,
  980. },
  981. },
  982. {
  983. .desc = {
  984. .name = "ldo3",
  985. .supply_name = "inl1",
  986. .of_match = of_match_ptr("LDO3"),
  987. .regulators_node = of_match_ptr("regulators"),
  988. .id = PCA9450_LDO3,
  989. .ops = &pca9450_ldo_regulator_ops,
  990. .type = REGULATOR_VOLTAGE,
  991. .n_voltages = PCA9450_LDO3_VOLTAGE_NUM,
  992. .linear_ranges = pca9450_ldo34_volts,
  993. .n_linear_ranges = ARRAY_SIZE(pca9450_ldo34_volts),
  994. .vsel_reg = PCA9450_REG_LDO3CTRL,
  995. .vsel_mask = LDO3OUT_MASK,
  996. .enable_reg = PCA9450_REG_LDO3CTRL,
  997. .enable_mask = LDO3_EN_MASK,
  998. .owner = THIS_MODULE,
  999. },
  1000. },
  1001. {
  1002. .desc = {
  1003. .name = "ldo4",
  1004. .supply_name = "inl1",
  1005. .of_match = of_match_ptr("LDO4"),
  1006. .regulators_node = of_match_ptr("regulators"),
  1007. .id = PCA9450_LDO4,
  1008. .ops = &pca9450_ldo_regulator_ops,
  1009. .type = REGULATOR_VOLTAGE,
  1010. .n_voltages = PCA9450_LDO4_VOLTAGE_NUM,
  1011. .linear_ranges = pca9450_ldo34_volts,
  1012. .n_linear_ranges = ARRAY_SIZE(pca9450_ldo34_volts),
  1013. .vsel_reg = PCA9450_REG_LDO4CTRL,
  1014. .vsel_mask = LDO4OUT_MASK,
  1015. .enable_reg = PCA9450_REG_LDO4CTRL,
  1016. .enable_mask = LDO4_EN_MASK,
  1017. .owner = THIS_MODULE,
  1018. },
  1019. },
  1020. {
  1021. .desc = {
  1022. .name = "ldo5",
  1023. .supply_name = "inl1",
  1024. .of_match = of_match_ptr("LDO5"),
  1025. .regulators_node = of_match_ptr("regulators"),
  1026. .id = PCA9450_LDO5,
  1027. .ops = &pca9450_ldo5_regulator_ops,
  1028. .type = REGULATOR_VOLTAGE,
  1029. .n_voltages = PCA9450_LDO5_VOLTAGE_NUM,
  1030. .linear_ranges = pca9450_ldo5_volts,
  1031. .n_linear_ranges = ARRAY_SIZE(pca9450_ldo5_volts),
  1032. .vsel_reg = PCA9450_REG_LDO5CTRL_H,
  1033. .vsel_mask = LDO5HOUT_MASK,
  1034. .enable_reg = PCA9450_REG_LDO5CTRL_L,
  1035. .enable_mask = LDO5H_EN_MASK,
  1036. .owner = THIS_MODULE,
  1037. },
  1038. },
  1039. };
  1040. static irqreturn_t pca9450_irq_handler(int irq, void *data)
  1041. {
  1042. struct pca9450 *pca9450 = data;
  1043. struct regmap *regmap = pca9450->regmap;
  1044. unsigned int status;
  1045. int ret;
  1046. ret = regmap_read(regmap, PCA9450_REG_INT1, &status);
  1047. if (ret < 0) {
  1048. dev_err(pca9450->dev,
  1049. "Failed to read INT1(%d)\n", ret);
  1050. return IRQ_NONE;
  1051. }
  1052. if (status & IRQ_PWRON)
  1053. dev_warn(pca9450->dev, "PWRON interrupt.\n");
  1054. if (status & IRQ_WDOGB)
  1055. dev_warn(pca9450->dev, "WDOGB interrupt.\n");
  1056. if (status & IRQ_VR_FLT1)
  1057. dev_warn(pca9450->dev, "VRFLT1 interrupt.\n");
  1058. if (status & IRQ_VR_FLT2)
  1059. dev_warn(pca9450->dev, "VRFLT2 interrupt.\n");
  1060. if (status & IRQ_LOWVSYS)
  1061. dev_warn(pca9450->dev, "LOWVSYS interrupt.\n");
  1062. if (status & IRQ_THERM_105)
  1063. dev_warn(pca9450->dev, "IRQ_THERM_105 interrupt.\n");
  1064. if (status & IRQ_THERM_125)
  1065. dev_warn(pca9450->dev, "IRQ_THERM_125 interrupt.\n");
  1066. return IRQ_HANDLED;
  1067. }
  1068. static int pca9450_i2c_restart_handler(struct sys_off_data *data)
  1069. {
  1070. struct pca9450 *pca9450 = data->cb_data;
  1071. struct i2c_client *i2c = container_of(pca9450->dev, struct i2c_client, dev);
  1072. dev_dbg(&i2c->dev, "Restarting device..\n");
  1073. if (i2c_smbus_write_byte_data(i2c, PCA9450_REG_SWRST, SW_RST_COMMAND) == 0) {
  1074. /* tRESTART is 250ms, so 300 should be enough to make sure it happened */
  1075. mdelay(300);
  1076. /* When we get here, the PMIC didn't power cycle for some reason. so warn.*/
  1077. dev_warn(&i2c->dev, "Device didn't respond to restart command\n");
  1078. } else {
  1079. dev_err(&i2c->dev, "Restart command failed\n");
  1080. }
  1081. return 0;
  1082. }
  1083. static int pca9450_of_init(struct pca9450 *pca9450)
  1084. {
  1085. struct i2c_client *i2c = container_of(pca9450->dev, struct i2c_client, dev);
  1086. int ret;
  1087. unsigned int val;
  1088. unsigned int reset_ctrl;
  1089. unsigned int rstb_deb_ctrl;
  1090. unsigned int t_on_deb, t_off_deb;
  1091. unsigned int t_on_step, t_off_step;
  1092. unsigned int t_restart;
  1093. if (of_property_read_bool(i2c->dev.of_node, "nxp,wdog_b-warm-reset"))
  1094. reset_ctrl = WDOG_B_CFG_WARM;
  1095. else
  1096. reset_ctrl = WDOG_B_CFG_COLD_LDO12;
  1097. /* Set reset behavior on assertion of WDOG_B signal */
  1098. ret = regmap_update_bits(pca9450->regmap, PCA9450_REG_RESET_CTRL,
  1099. WDOG_B_CFG_MASK, reset_ctrl);
  1100. if (ret)
  1101. return dev_err_probe(&i2c->dev, ret, "Failed to set WDOG_B reset behavior\n");
  1102. ret = of_property_read_u32(i2c->dev.of_node, "npx,pmic-rst-b-debounce-ms", &val);
  1103. if (ret == -EINVAL)
  1104. rstb_deb_ctrl = T_PMIC_RST_DEB_50MS;
  1105. else if (ret)
  1106. return ret;
  1107. else {
  1108. switch (val) {
  1109. case 10: rstb_deb_ctrl = T_PMIC_RST_DEB_10MS; break;
  1110. case 50: rstb_deb_ctrl = T_PMIC_RST_DEB_50MS; break;
  1111. case 100: rstb_deb_ctrl = T_PMIC_RST_DEB_100MS; break;
  1112. case 500: rstb_deb_ctrl = T_PMIC_RST_DEB_500MS; break;
  1113. case 1000: rstb_deb_ctrl = T_PMIC_RST_DEB_1S; break;
  1114. case 2000: rstb_deb_ctrl = T_PMIC_RST_DEB_2S; break;
  1115. case 4000: rstb_deb_ctrl = T_PMIC_RST_DEB_4S; break;
  1116. case 8000: rstb_deb_ctrl = T_PMIC_RST_DEB_8S; break;
  1117. default: return -EINVAL;
  1118. }
  1119. }
  1120. ret = regmap_update_bits(pca9450->regmap, PCA9450_REG_RESET_CTRL,
  1121. T_PMIC_RST_DEB_MASK, rstb_deb_ctrl);
  1122. if (ret)
  1123. return dev_err_probe(&i2c->dev, ret, "Failed to set PMIC_RST_B debounce time\n");
  1124. ret = of_property_read_u32(i2c->dev.of_node, "nxp,pmic-on-req-on-debounce-us", &val);
  1125. if (ret == -EINVAL)
  1126. t_on_deb = T_ON_DEB_20MS;
  1127. else if (ret)
  1128. return ret;
  1129. else {
  1130. switch (val) {
  1131. case 120: t_on_deb = T_ON_DEB_120US; break;
  1132. case 20000: t_on_deb = T_ON_DEB_20MS; break;
  1133. case 100000: t_on_deb = T_ON_DEB_100MS; break;
  1134. case 750000: t_on_deb = T_ON_DEB_750MS; break;
  1135. default: return -EINVAL;
  1136. }
  1137. }
  1138. ret = of_property_read_u32(i2c->dev.of_node, "nxp,pmic-on-req-off-debounce-us", &val);
  1139. if (ret == -EINVAL)
  1140. t_off_deb = T_OFF_DEB_120US;
  1141. else if (ret)
  1142. return ret;
  1143. else {
  1144. switch (val) {
  1145. case 120: t_off_deb = T_OFF_DEB_120US; break;
  1146. case 2000: t_off_deb = T_OFF_DEB_2MS; break;
  1147. default: return -EINVAL;
  1148. }
  1149. }
  1150. ret = of_property_read_u32(i2c->dev.of_node, "nxp,power-on-step-ms", &val);
  1151. if (ret == -EINVAL)
  1152. t_on_step = T_ON_STEP_2MS;
  1153. else if (ret)
  1154. return ret;
  1155. else {
  1156. switch (val) {
  1157. case 1: t_on_step = T_ON_STEP_1MS; break;
  1158. case 2: t_on_step = T_ON_STEP_2MS; break;
  1159. case 4: t_on_step = T_ON_STEP_4MS; break;
  1160. case 8: t_on_step = T_ON_STEP_8MS; break;
  1161. default: return -EINVAL;
  1162. }
  1163. }
  1164. ret = of_property_read_u32(i2c->dev.of_node, "nxp,power-down-step-ms", &val);
  1165. if (ret == -EINVAL)
  1166. t_off_step = T_OFF_STEP_8MS;
  1167. else if (ret)
  1168. return ret;
  1169. else {
  1170. switch (val) {
  1171. case 2: t_off_step = T_OFF_STEP_2MS; break;
  1172. case 4: t_off_step = T_OFF_STEP_4MS; break;
  1173. case 8: t_off_step = T_OFF_STEP_8MS; break;
  1174. case 16: t_off_step = T_OFF_STEP_16MS; break;
  1175. default: return -EINVAL;
  1176. }
  1177. }
  1178. ret = of_property_read_u32(i2c->dev.of_node, "nxp,restart-ms", &val);
  1179. if (ret == -EINVAL)
  1180. t_restart = T_RESTART_250MS;
  1181. else if (ret)
  1182. return ret;
  1183. else {
  1184. switch (val) {
  1185. case 250: t_restart = T_RESTART_250MS; break;
  1186. case 500: t_restart = T_RESTART_500MS; break;
  1187. default: return -EINVAL;
  1188. }
  1189. }
  1190. ret = regmap_update_bits(pca9450->regmap, PCA9450_REG_PWRCTRL,
  1191. T_ON_DEB_MASK | T_OFF_DEB_MASK | T_ON_STEP_MASK |
  1192. T_OFF_STEP_MASK | T_RESTART_MASK,
  1193. t_on_deb | t_off_deb | t_on_step |
  1194. t_off_step | t_restart);
  1195. if (ret)
  1196. return dev_err_probe(&i2c->dev, ret,
  1197. "Failed to set PWR_CTRL debounce configuration\n");
  1198. if (of_property_read_bool(i2c->dev.of_node, "nxp,i2c-lt-enable")) {
  1199. /* Enable I2C Level Translator */
  1200. ret = regmap_update_bits(pca9450->regmap, PCA9450_REG_CONFIG2,
  1201. I2C_LT_MASK, I2C_LT_ON_STANDBY_RUN);
  1202. if (ret)
  1203. return dev_err_probe(&i2c->dev, ret,
  1204. "Failed to enable I2C level translator\n");
  1205. }
  1206. return 0;
  1207. }
  1208. static int pca9450_i2c_probe(struct i2c_client *i2c)
  1209. {
  1210. enum pca9450_chip_type type = (unsigned int)(uintptr_t)
  1211. of_device_get_match_data(&i2c->dev);
  1212. const struct pca9450_regulator_desc *regulator_desc;
  1213. struct regulator_config config = { };
  1214. struct regulator_dev *ldo5;
  1215. struct pca9450 *pca9450;
  1216. unsigned int device_id, i;
  1217. const char *type_name;
  1218. int ret;
  1219. pca9450 = devm_kzalloc(&i2c->dev, sizeof(struct pca9450), GFP_KERNEL);
  1220. if (!pca9450)
  1221. return -ENOMEM;
  1222. switch (type) {
  1223. case PCA9450_TYPE_PCA9450A:
  1224. regulator_desc = pca9450a_regulators;
  1225. pca9450->rcnt = ARRAY_SIZE(pca9450a_regulators);
  1226. type_name = "pca9450a";
  1227. break;
  1228. case PCA9450_TYPE_PCA9450BC:
  1229. regulator_desc = pca9450bc_regulators;
  1230. pca9450->rcnt = ARRAY_SIZE(pca9450bc_regulators);
  1231. type_name = "pca9450bc";
  1232. break;
  1233. case PCA9450_TYPE_PCA9451A:
  1234. regulator_desc = pca9451a_regulators;
  1235. pca9450->rcnt = ARRAY_SIZE(pca9451a_regulators);
  1236. type_name = "pca9451a";
  1237. break;
  1238. case PCA9450_TYPE_PCA9452:
  1239. regulator_desc = pca9451a_regulators;
  1240. pca9450->rcnt = ARRAY_SIZE(pca9451a_regulators);
  1241. type_name = "pca9452";
  1242. break;
  1243. default:
  1244. dev_err(&i2c->dev, "Unknown device type");
  1245. return -EINVAL;
  1246. }
  1247. pca9450->irq = i2c->irq;
  1248. pca9450->type = type;
  1249. pca9450->dev = &i2c->dev;
  1250. dev_set_drvdata(&i2c->dev, pca9450);
  1251. pca9450->regmap = devm_regmap_init_i2c(i2c,
  1252. &pca9450_regmap_config);
  1253. if (IS_ERR(pca9450->regmap))
  1254. return dev_err_probe(&i2c->dev, PTR_ERR(pca9450->regmap),
  1255. "regmap initialization failed\n");
  1256. ret = regmap_read(pca9450->regmap, PCA9450_REG_DEV_ID, &device_id);
  1257. if (ret)
  1258. return dev_err_probe(&i2c->dev, ret, "Read device id error\n");
  1259. /* Check your board and dts for match the right pmic */
  1260. if (((device_id >> 4) != 0x1 && type == PCA9450_TYPE_PCA9450A) ||
  1261. ((device_id >> 4) != 0x3 && type == PCA9450_TYPE_PCA9450BC) ||
  1262. ((device_id >> 4) != 0x9 && type == PCA9450_TYPE_PCA9451A) ||
  1263. ((device_id >> 4) != 0x9 && type == PCA9450_TYPE_PCA9452))
  1264. return dev_err_probe(&i2c->dev, -EINVAL,
  1265. "Device id(%x) mismatched\n", device_id >> 4);
  1266. for (i = 0; i < pca9450->rcnt; i++) {
  1267. const struct regulator_desc *desc;
  1268. struct regulator_dev *rdev;
  1269. const struct pca9450_regulator_desc *r;
  1270. r = &regulator_desc[i];
  1271. desc = &r->desc;
  1272. if (type == PCA9450_TYPE_PCA9451A && !strcmp(desc->name, "ldo3"))
  1273. continue;
  1274. config.regmap = pca9450->regmap;
  1275. config.dev = pca9450->dev;
  1276. config.driver_data = pca9450;
  1277. rdev = devm_regulator_register(pca9450->dev, desc, &config);
  1278. if (IS_ERR(rdev))
  1279. return dev_err_probe(pca9450->dev, PTR_ERR(rdev),
  1280. "Failed to register regulator(%s)\n", desc->name);
  1281. if (!strcmp(desc->name, "ldo5"))
  1282. ldo5 = rdev;
  1283. }
  1284. if (pca9450->irq) {
  1285. ret = devm_request_threaded_irq(pca9450->dev, pca9450->irq, NULL,
  1286. pca9450_irq_handler,
  1287. (IRQF_TRIGGER_LOW | IRQF_ONESHOT),
  1288. "pca9450-irq", pca9450);
  1289. if (ret != 0)
  1290. return dev_err_probe(pca9450->dev, ret, "Failed to request IRQ: %d\n",
  1291. pca9450->irq);
  1292. /* Unmask all interrupt except PWRON/WDOG/RSVD */
  1293. ret = regmap_update_bits(pca9450->regmap, PCA9450_REG_INT1_MSK,
  1294. IRQ_VR_FLT1 | IRQ_VR_FLT2 | IRQ_LOWVSYS |
  1295. IRQ_THERM_105 | IRQ_THERM_125,
  1296. IRQ_PWRON | IRQ_WDOGB | IRQ_RSVD);
  1297. if (ret)
  1298. return dev_err_probe(&i2c->dev, ret, "Unmask irq error\n");
  1299. }
  1300. /* Clear PRESET_EN bit in BUCK123_DVS to use DVS registers */
  1301. ret = regmap_clear_bits(pca9450->regmap, PCA9450_REG_BUCK123_DVS,
  1302. BUCK123_PRESET_EN);
  1303. if (ret)
  1304. return dev_err_probe(&i2c->dev, ret, "Failed to clear PRESET_EN bit\n");
  1305. ret = pca9450_of_init(pca9450);
  1306. if (ret)
  1307. return dev_err_probe(&i2c->dev, ret, "Unable to parse OF data\n");
  1308. /*
  1309. * For LDO5 we need to be able to check the status of the SD_VSEL input in
  1310. * order to know which control register is used. Most boards connect SD_VSEL
  1311. * to the VSELECT signal, so we can use the GPIO that is internally routed
  1312. * to this signal (if SION bit is set in IOMUX).
  1313. */
  1314. pca9450->sd_vsel_gpio = gpiod_get_optional(&ldo5->dev, "sd-vsel", GPIOD_IN);
  1315. if (IS_ERR(pca9450->sd_vsel_gpio))
  1316. return dev_err_probe(&i2c->dev, PTR_ERR(pca9450->sd_vsel_gpio),
  1317. "Failed to get SD_VSEL GPIO\n");
  1318. pca9450->sd_vsel_fixed_low =
  1319. of_property_read_bool(ldo5->dev.of_node, "nxp,sd-vsel-fixed-low");
  1320. if (devm_register_sys_off_handler(&i2c->dev, SYS_OFF_MODE_RESTART,
  1321. PCA9450_RESTART_HANDLER_PRIORITY,
  1322. pca9450_i2c_restart_handler, pca9450))
  1323. dev_warn(&i2c->dev, "Failed to register restart handler\n");
  1324. dev_info(&i2c->dev, "%s probed.\n", type_name);
  1325. return 0;
  1326. }
  1327. static const struct of_device_id pca9450_of_match[] = {
  1328. {
  1329. .compatible = "nxp,pca9450a",
  1330. .data = (void *)PCA9450_TYPE_PCA9450A,
  1331. },
  1332. {
  1333. .compatible = "nxp,pca9450b",
  1334. .data = (void *)PCA9450_TYPE_PCA9450BC,
  1335. },
  1336. {
  1337. .compatible = "nxp,pca9450c",
  1338. .data = (void *)PCA9450_TYPE_PCA9450BC,
  1339. },
  1340. {
  1341. .compatible = "nxp,pca9451a",
  1342. .data = (void *)PCA9450_TYPE_PCA9451A,
  1343. },
  1344. {
  1345. .compatible = "nxp,pca9452",
  1346. .data = (void *)PCA9450_TYPE_PCA9452,
  1347. },
  1348. { }
  1349. };
  1350. MODULE_DEVICE_TABLE(of, pca9450_of_match);
  1351. static struct i2c_driver pca9450_i2c_driver = {
  1352. .driver = {
  1353. .name = "nxp-pca9450",
  1354. .probe_type = PROBE_PREFER_ASYNCHRONOUS,
  1355. .of_match_table = pca9450_of_match,
  1356. },
  1357. .probe = pca9450_i2c_probe,
  1358. };
  1359. module_i2c_driver(pca9450_i2c_driver);
  1360. MODULE_AUTHOR("Robin Gong <yibin.gong@nxp.com>");
  1361. MODULE_DESCRIPTION("NXP PCA9450 Power Management IC driver");
  1362. MODULE_LICENSE("GPL");