wm831x-dcdc.c 26 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045
  1. /*
  2. * wm831x-dcdc.c -- DC-DC buck convertor driver for the WM831x series
  3. *
  4. * Copyright 2009 Wolfson Microelectronics PLC.
  5. *
  6. * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
  7. *
  8. * This program is free software; you can redistribute it and/or modify it
  9. * under the terms of the GNU General Public License as published by the
  10. * Free Software Foundation; either version 2 of the License, or (at your
  11. * option) any later version.
  12. */
  13. #include <linux/module.h>
  14. #include <linux/moduleparam.h>
  15. #include <linux/init.h>
  16. #include <linux/bitops.h>
  17. #include <linux/err.h>
  18. #include <linux/i2c.h>
  19. #include <linux/platform_device.h>
  20. #include <linux/regulator/driver.h>
  21. #include <linux/regulator/machine.h>
  22. #include <linux/gpio.h>
  23. #include <linux/mfd/wm831x/core.h>
  24. #include <linux/mfd/wm831x/regulator.h>
  25. #include <linux/mfd/wm831x/pdata.h>
  26. #define WM831X_BUCKV_MAX_SELECTOR 0x68
  27. #define WM831X_BUCKP_MAX_SELECTOR 0x66
  28. #define WM831X_DCDC_MODE_FAST 0
  29. #define WM831X_DCDC_MODE_NORMAL 1
  30. #define WM831X_DCDC_MODE_IDLE 2
  31. #define WM831X_DCDC_MODE_STANDBY 3
  32. #define WM831X_DCDC_MAX_NAME 6
  33. /* Register offsets in control block */
  34. #define WM831X_DCDC_CONTROL_1 0
  35. #define WM831X_DCDC_CONTROL_2 1
  36. #define WM831X_DCDC_ON_CONFIG 2
  37. #define WM831X_DCDC_SLEEP_CONTROL 3
  38. #define WM831X_DCDC_DVS_CONTROL 4
  39. /*
  40. * Shared
  41. */
  42. struct wm831x_dcdc {
  43. char name[WM831X_DCDC_MAX_NAME];
  44. struct regulator_desc desc;
  45. int base;
  46. struct wm831x *wm831x;
  47. struct regulator_dev *regulator;
  48. int dvs_gpio;
  49. int dvs_gpio_state;
  50. int on_vsel;
  51. int dvs_vsel;
  52. };
  53. static int wm831x_dcdc_is_enabled(struct regulator_dev *rdev)
  54. {
  55. struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
  56. struct wm831x *wm831x = dcdc->wm831x;
  57. int mask = 1 << rdev_get_id(rdev);
  58. int reg;
  59. reg = wm831x_reg_read(wm831x, WM831X_DCDC_ENABLE);
  60. if (reg < 0)
  61. return reg;
  62. if (reg & mask)
  63. return 1;
  64. else
  65. return 0;
  66. }
  67. static int wm831x_dcdc_enable(struct regulator_dev *rdev)
  68. {
  69. struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
  70. struct wm831x *wm831x = dcdc->wm831x;
  71. int mask = 1 << rdev_get_id(rdev);
  72. return wm831x_set_bits(wm831x, WM831X_DCDC_ENABLE, mask, mask);
  73. }
  74. static int wm831x_dcdc_disable(struct regulator_dev *rdev)
  75. {
  76. struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
  77. struct wm831x *wm831x = dcdc->wm831x;
  78. int mask = 1 << rdev_get_id(rdev);
  79. return wm831x_set_bits(wm831x, WM831X_DCDC_ENABLE, mask, 0);
  80. }
  81. static unsigned int wm831x_dcdc_get_mode(struct regulator_dev *rdev)
  82. {
  83. struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
  84. struct wm831x *wm831x = dcdc->wm831x;
  85. u16 reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
  86. int val;
  87. val = wm831x_reg_read(wm831x, reg);
  88. if (val < 0)
  89. return val;
  90. val = (val & WM831X_DC1_ON_MODE_MASK) >> WM831X_DC1_ON_MODE_SHIFT;
  91. switch (val) {
  92. case WM831X_DCDC_MODE_FAST:
  93. return REGULATOR_MODE_FAST;
  94. case WM831X_DCDC_MODE_NORMAL:
  95. return REGULATOR_MODE_NORMAL;
  96. case WM831X_DCDC_MODE_STANDBY:
  97. return REGULATOR_MODE_STANDBY;
  98. case WM831X_DCDC_MODE_IDLE:
  99. return REGULATOR_MODE_IDLE;
  100. default:
  101. BUG();
  102. }
  103. }
  104. static int wm831x_dcdc_set_mode_int(struct wm831x *wm831x, int reg,
  105. unsigned int mode)
  106. {
  107. int val;
  108. switch (mode) {
  109. case REGULATOR_MODE_FAST:
  110. val = WM831X_DCDC_MODE_FAST;
  111. break;
  112. case REGULATOR_MODE_NORMAL:
  113. val = WM831X_DCDC_MODE_NORMAL;
  114. break;
  115. case REGULATOR_MODE_STANDBY:
  116. val = WM831X_DCDC_MODE_STANDBY;
  117. break;
  118. case REGULATOR_MODE_IDLE:
  119. val = WM831X_DCDC_MODE_IDLE;
  120. break;
  121. default:
  122. return -EINVAL;
  123. }
  124. return wm831x_set_bits(wm831x, reg, WM831X_DC1_ON_MODE_MASK,
  125. val << WM831X_DC1_ON_MODE_SHIFT);
  126. }
  127. static int wm831x_dcdc_set_mode(struct regulator_dev *rdev, unsigned int mode)
  128. {
  129. struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
  130. struct wm831x *wm831x = dcdc->wm831x;
  131. u16 reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
  132. return wm831x_dcdc_set_mode_int(wm831x, reg, mode);
  133. }
  134. static int wm831x_dcdc_set_suspend_mode(struct regulator_dev *rdev,
  135. unsigned int mode)
  136. {
  137. struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
  138. struct wm831x *wm831x = dcdc->wm831x;
  139. u16 reg = dcdc->base + WM831X_DCDC_SLEEP_CONTROL;
  140. return wm831x_dcdc_set_mode_int(wm831x, reg, mode);
  141. }
  142. static int wm831x_dcdc_get_status(struct regulator_dev *rdev)
  143. {
  144. struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
  145. struct wm831x *wm831x = dcdc->wm831x;
  146. int ret;
  147. /* First, check for errors */
  148. ret = wm831x_reg_read(wm831x, WM831X_DCDC_UV_STATUS);
  149. if (ret < 0)
  150. return ret;
  151. if (ret & (1 << rdev_get_id(rdev))) {
  152. dev_dbg(wm831x->dev, "DCDC%d under voltage\n",
  153. rdev_get_id(rdev) + 1);
  154. return REGULATOR_STATUS_ERROR;
  155. }
  156. /* DCDC1 and DCDC2 can additionally detect high voltage/current */
  157. if (rdev_get_id(rdev) < 2) {
  158. if (ret & (WM831X_DC1_OV_STS << rdev_get_id(rdev))) {
  159. dev_dbg(wm831x->dev, "DCDC%d over voltage\n",
  160. rdev_get_id(rdev) + 1);
  161. return REGULATOR_STATUS_ERROR;
  162. }
  163. if (ret & (WM831X_DC1_HC_STS << rdev_get_id(rdev))) {
  164. dev_dbg(wm831x->dev, "DCDC%d over current\n",
  165. rdev_get_id(rdev) + 1);
  166. return REGULATOR_STATUS_ERROR;
  167. }
  168. }
  169. /* Is the regulator on? */
  170. ret = wm831x_reg_read(wm831x, WM831X_DCDC_STATUS);
  171. if (ret < 0)
  172. return ret;
  173. if (!(ret & (1 << rdev_get_id(rdev))))
  174. return REGULATOR_STATUS_OFF;
  175. /* TODO: When we handle hardware control modes so we can report the
  176. * current mode. */
  177. return REGULATOR_STATUS_ON;
  178. }
  179. static irqreturn_t wm831x_dcdc_uv_irq(int irq, void *data)
  180. {
  181. struct wm831x_dcdc *dcdc = data;
  182. regulator_notifier_call_chain(dcdc->regulator,
  183. REGULATOR_EVENT_UNDER_VOLTAGE,
  184. NULL);
  185. return IRQ_HANDLED;
  186. }
  187. static irqreturn_t wm831x_dcdc_oc_irq(int irq, void *data)
  188. {
  189. struct wm831x_dcdc *dcdc = data;
  190. regulator_notifier_call_chain(dcdc->regulator,
  191. REGULATOR_EVENT_OVER_CURRENT,
  192. NULL);
  193. return IRQ_HANDLED;
  194. }
  195. /*
  196. * BUCKV specifics
  197. */
  198. static int wm831x_buckv_list_voltage(struct regulator_dev *rdev,
  199. unsigned selector)
  200. {
  201. if (selector <= 0x8)
  202. return 600000;
  203. if (selector <= WM831X_BUCKV_MAX_SELECTOR)
  204. return 600000 + ((selector - 0x8) * 12500);
  205. return -EINVAL;
  206. }
  207. static int wm831x_buckv_select_min_voltage(struct regulator_dev *rdev,
  208. int min_uV, int max_uV)
  209. {
  210. u16 vsel;
  211. if (min_uV < 600000)
  212. vsel = 0;
  213. else if (min_uV <= 1800000)
  214. vsel = ((min_uV - 600000) / 12500) + 8;
  215. else
  216. return -EINVAL;
  217. if (wm831x_buckv_list_voltage(rdev, vsel) > max_uV)
  218. return -EINVAL;
  219. return vsel;
  220. }
  221. static int wm831x_buckv_select_max_voltage(struct regulator_dev *rdev,
  222. int min_uV, int max_uV)
  223. {
  224. u16 vsel;
  225. if (max_uV < 600000 || max_uV > 1800000)
  226. return -EINVAL;
  227. vsel = ((max_uV - 600000) / 12500) + 8;
  228. if (wm831x_buckv_list_voltage(rdev, vsel) < min_uV ||
  229. wm831x_buckv_list_voltage(rdev, vsel) < max_uV)
  230. return -EINVAL;
  231. return vsel;
  232. }
  233. static int wm831x_buckv_set_dvs(struct regulator_dev *rdev, int state)
  234. {
  235. struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
  236. if (state == dcdc->dvs_gpio_state)
  237. return 0;
  238. dcdc->dvs_gpio_state = state;
  239. gpio_set_value(dcdc->dvs_gpio, state);
  240. /* Should wait for DVS state change to be asserted if we have
  241. * a GPIO for it, for now assume the device is configured
  242. * for the fastest possible transition.
  243. */
  244. return 0;
  245. }
  246. static int wm831x_buckv_set_voltage(struct regulator_dev *rdev,
  247. int min_uV, int max_uV)
  248. {
  249. struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
  250. struct wm831x *wm831x = dcdc->wm831x;
  251. int on_reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
  252. int dvs_reg = dcdc->base + WM831X_DCDC_DVS_CONTROL;
  253. int vsel, ret;
  254. vsel = wm831x_buckv_select_min_voltage(rdev, min_uV, max_uV);
  255. if (vsel < 0)
  256. return vsel;
  257. /* If this value is already set then do a GPIO update if we can */
  258. if (dcdc->dvs_gpio && dcdc->on_vsel == vsel)
  259. return wm831x_buckv_set_dvs(rdev, 0);
  260. if (dcdc->dvs_gpio && dcdc->dvs_vsel == vsel)
  261. return wm831x_buckv_set_dvs(rdev, 1);
  262. /* Always set the ON status to the minimum voltage */
  263. ret = wm831x_set_bits(wm831x, on_reg, WM831X_DC1_ON_VSEL_MASK, vsel);
  264. if (ret < 0)
  265. return ret;
  266. dcdc->on_vsel = vsel;
  267. if (!dcdc->dvs_gpio)
  268. return ret;
  269. /* Kick the voltage transition now */
  270. ret = wm831x_buckv_set_dvs(rdev, 0);
  271. if (ret < 0)
  272. return ret;
  273. /* Set the high voltage as the DVS voltage. This is optimised
  274. * for CPUfreq usage, most processors will keep the maximum
  275. * voltage constant and lower the minimum with the frequency. */
  276. vsel = wm831x_buckv_select_max_voltage(rdev, min_uV, max_uV);
  277. if (vsel < 0) {
  278. /* This should never happen - at worst the same vsel
  279. * should be chosen */
  280. WARN_ON(vsel < 0);
  281. return 0;
  282. }
  283. /* Don't bother if it's the same VSEL we're already using */
  284. if (vsel == dcdc->on_vsel)
  285. return 0;
  286. ret = wm831x_set_bits(wm831x, dvs_reg, WM831X_DC1_DVS_VSEL_MASK, vsel);
  287. if (ret == 0)
  288. dcdc->dvs_vsel = vsel;
  289. else
  290. dev_warn(wm831x->dev, "Failed to set DCDC DVS VSEL: %d\n",
  291. ret);
  292. return 0;
  293. }
  294. static int wm831x_buckv_set_suspend_voltage(struct regulator_dev *rdev,
  295. int uV)
  296. {
  297. struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
  298. struct wm831x *wm831x = dcdc->wm831x;
  299. u16 reg = dcdc->base + WM831X_DCDC_SLEEP_CONTROL;
  300. int vsel;
  301. vsel = wm831x_buckv_select_min_voltage(rdev, uV, uV);
  302. if (vsel < 0)
  303. return vsel;
  304. return wm831x_set_bits(wm831x, reg, WM831X_DC1_SLP_VSEL_MASK, vsel);
  305. }
  306. static int wm831x_buckv_get_voltage(struct regulator_dev *rdev)
  307. {
  308. struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
  309. if (dcdc->dvs_gpio && dcdc->dvs_gpio_state)
  310. return wm831x_buckv_list_voltage(rdev, dcdc->dvs_vsel);
  311. else
  312. return wm831x_buckv_list_voltage(rdev, dcdc->on_vsel);
  313. }
  314. /* Current limit options */
  315. static u16 wm831x_dcdc_ilim[] = {
  316. 125, 250, 375, 500, 625, 750, 875, 1000
  317. };
  318. static int wm831x_buckv_set_current_limit(struct regulator_dev *rdev,
  319. int min_uA, int max_uA)
  320. {
  321. struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
  322. struct wm831x *wm831x = dcdc->wm831x;
  323. u16 reg = dcdc->base + WM831X_DCDC_CONTROL_2;
  324. int i;
  325. for (i = 0; i < ARRAY_SIZE(wm831x_dcdc_ilim); i++) {
  326. if (max_uA <= wm831x_dcdc_ilim[i])
  327. break;
  328. }
  329. if (i == ARRAY_SIZE(wm831x_dcdc_ilim))
  330. return -EINVAL;
  331. return wm831x_set_bits(wm831x, reg, WM831X_DC1_HC_THR_MASK, i);
  332. }
  333. static int wm831x_buckv_get_current_limit(struct regulator_dev *rdev)
  334. {
  335. struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
  336. struct wm831x *wm831x = dcdc->wm831x;
  337. u16 reg = dcdc->base + WM831X_DCDC_CONTROL_2;
  338. int val;
  339. val = wm831x_reg_read(wm831x, reg);
  340. if (val < 0)
  341. return val;
  342. return wm831x_dcdc_ilim[val & WM831X_DC1_HC_THR_MASK];
  343. }
  344. static struct regulator_ops wm831x_buckv_ops = {
  345. .set_voltage = wm831x_buckv_set_voltage,
  346. .get_voltage = wm831x_buckv_get_voltage,
  347. .list_voltage = wm831x_buckv_list_voltage,
  348. .set_suspend_voltage = wm831x_buckv_set_suspend_voltage,
  349. .set_current_limit = wm831x_buckv_set_current_limit,
  350. .get_current_limit = wm831x_buckv_get_current_limit,
  351. .is_enabled = wm831x_dcdc_is_enabled,
  352. .enable = wm831x_dcdc_enable,
  353. .disable = wm831x_dcdc_disable,
  354. .get_status = wm831x_dcdc_get_status,
  355. .get_mode = wm831x_dcdc_get_mode,
  356. .set_mode = wm831x_dcdc_set_mode,
  357. .set_suspend_mode = wm831x_dcdc_set_suspend_mode,
  358. };
  359. /*
  360. * Set up DVS control. We just log errors since we can still run
  361. * (with reduced performance) if we fail.
  362. */
  363. static __devinit void wm831x_buckv_dvs_init(struct wm831x_dcdc *dcdc,
  364. struct wm831x_buckv_pdata *pdata)
  365. {
  366. struct wm831x *wm831x = dcdc->wm831x;
  367. int ret;
  368. u16 ctrl;
  369. if (!pdata || !pdata->dvs_gpio)
  370. return;
  371. switch (pdata->dvs_control_src) {
  372. case 1:
  373. ctrl = 2 << WM831X_DC1_DVS_SRC_SHIFT;
  374. break;
  375. case 2:
  376. ctrl = 3 << WM831X_DC1_DVS_SRC_SHIFT;
  377. break;
  378. default:
  379. dev_err(wm831x->dev, "Invalid DVS control source %d for %s\n",
  380. pdata->dvs_control_src, dcdc->name);
  381. return;
  382. }
  383. ret = wm831x_set_bits(wm831x, dcdc->base + WM831X_DCDC_DVS_CONTROL,
  384. WM831X_DC1_DVS_SRC_MASK, ctrl);
  385. if (ret < 0) {
  386. dev_err(wm831x->dev, "Failed to set %s DVS source: %d\n",
  387. dcdc->name, ret);
  388. return;
  389. }
  390. ret = gpio_request(pdata->dvs_gpio, "DCDC DVS");
  391. if (ret < 0) {
  392. dev_err(wm831x->dev, "Failed to get %s DVS GPIO: %d\n",
  393. dcdc->name, ret);
  394. return;
  395. }
  396. /* gpiolib won't let us read the GPIO status so pick the higher
  397. * of the two existing voltages so we take it as platform data.
  398. */
  399. dcdc->dvs_gpio_state = pdata->dvs_init_state;
  400. ret = gpio_direction_output(pdata->dvs_gpio, dcdc->dvs_gpio_state);
  401. if (ret < 0) {
  402. dev_err(wm831x->dev, "Failed to enable %s DVS GPIO: %d\n",
  403. dcdc->name, ret);
  404. gpio_free(pdata->dvs_gpio);
  405. return;
  406. }
  407. dcdc->dvs_gpio = pdata->dvs_gpio;
  408. }
  409. static __devinit int wm831x_buckv_probe(struct platform_device *pdev)
  410. {
  411. struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
  412. struct wm831x_pdata *pdata = wm831x->dev->platform_data;
  413. int id = pdev->id % ARRAY_SIZE(pdata->dcdc);
  414. struct wm831x_dcdc *dcdc;
  415. struct resource *res;
  416. int ret, irq;
  417. dev_dbg(&pdev->dev, "Probing DCDC%d\n", id + 1);
  418. if (pdata == NULL || pdata->dcdc[id] == NULL)
  419. return -ENODEV;
  420. dcdc = kzalloc(sizeof(struct wm831x_dcdc), GFP_KERNEL);
  421. if (dcdc == NULL) {
  422. dev_err(&pdev->dev, "Unable to allocate private data\n");
  423. return -ENOMEM;
  424. }
  425. dcdc->wm831x = wm831x;
  426. res = platform_get_resource(pdev, IORESOURCE_IO, 0);
  427. if (res == NULL) {
  428. dev_err(&pdev->dev, "No I/O resource\n");
  429. ret = -EINVAL;
  430. goto err;
  431. }
  432. dcdc->base = res->start;
  433. snprintf(dcdc->name, sizeof(dcdc->name), "DCDC%d", id + 1);
  434. dcdc->desc.name = dcdc->name;
  435. dcdc->desc.id = id;
  436. dcdc->desc.type = REGULATOR_VOLTAGE;
  437. dcdc->desc.n_voltages = WM831X_BUCKV_MAX_SELECTOR + 1;
  438. dcdc->desc.ops = &wm831x_buckv_ops;
  439. dcdc->desc.owner = THIS_MODULE;
  440. ret = wm831x_reg_read(wm831x, dcdc->base + WM831X_DCDC_ON_CONFIG);
  441. if (ret < 0) {
  442. dev_err(wm831x->dev, "Failed to read ON VSEL: %d\n", ret);
  443. goto err;
  444. }
  445. dcdc->on_vsel = ret & WM831X_DC1_ON_VSEL_MASK;
  446. ret = wm831x_reg_read(wm831x, dcdc->base + WM831X_DCDC_ON_CONFIG);
  447. if (ret < 0) {
  448. dev_err(wm831x->dev, "Failed to read DVS VSEL: %d\n", ret);
  449. goto err;
  450. }
  451. dcdc->dvs_vsel = ret & WM831X_DC1_DVS_VSEL_MASK;
  452. if (pdata->dcdc[id])
  453. wm831x_buckv_dvs_init(dcdc, pdata->dcdc[id]->driver_data);
  454. dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev,
  455. pdata->dcdc[id], dcdc);
  456. if (IS_ERR(dcdc->regulator)) {
  457. ret = PTR_ERR(dcdc->regulator);
  458. dev_err(wm831x->dev, "Failed to register DCDC%d: %d\n",
  459. id + 1, ret);
  460. goto err;
  461. }
  462. irq = platform_get_irq_byname(pdev, "UV");
  463. ret = wm831x_request_irq(wm831x, irq, wm831x_dcdc_uv_irq,
  464. IRQF_TRIGGER_RISING, dcdc->name,
  465. dcdc);
  466. if (ret != 0) {
  467. dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
  468. irq, ret);
  469. goto err_regulator;
  470. }
  471. irq = platform_get_irq_byname(pdev, "HC");
  472. ret = wm831x_request_irq(wm831x, irq, wm831x_dcdc_oc_irq,
  473. IRQF_TRIGGER_RISING, dcdc->name,
  474. dcdc);
  475. if (ret != 0) {
  476. dev_err(&pdev->dev, "Failed to request HC IRQ %d: %d\n",
  477. irq, ret);
  478. goto err_uv;
  479. }
  480. platform_set_drvdata(pdev, dcdc);
  481. return 0;
  482. err_uv:
  483. wm831x_free_irq(wm831x, platform_get_irq_byname(pdev, "UV"), dcdc);
  484. err_regulator:
  485. regulator_unregister(dcdc->regulator);
  486. err:
  487. if (dcdc->dvs_gpio)
  488. gpio_free(dcdc->dvs_gpio);
  489. kfree(dcdc);
  490. return ret;
  491. }
  492. static __devexit int wm831x_buckv_remove(struct platform_device *pdev)
  493. {
  494. struct wm831x_dcdc *dcdc = platform_get_drvdata(pdev);
  495. struct wm831x *wm831x = dcdc->wm831x;
  496. platform_set_drvdata(pdev, NULL);
  497. wm831x_free_irq(wm831x, platform_get_irq_byname(pdev, "HC"), dcdc);
  498. wm831x_free_irq(wm831x, platform_get_irq_byname(pdev, "UV"), dcdc);
  499. regulator_unregister(dcdc->regulator);
  500. if (dcdc->dvs_gpio)
  501. gpio_free(dcdc->dvs_gpio);
  502. kfree(dcdc);
  503. return 0;
  504. }
  505. static struct platform_driver wm831x_buckv_driver = {
  506. .probe = wm831x_buckv_probe,
  507. .remove = __devexit_p(wm831x_buckv_remove),
  508. .driver = {
  509. .name = "wm831x-buckv",
  510. .owner = THIS_MODULE,
  511. },
  512. };
  513. /*
  514. * BUCKP specifics
  515. */
  516. static int wm831x_buckp_list_voltage(struct regulator_dev *rdev,
  517. unsigned selector)
  518. {
  519. if (selector <= WM831X_BUCKP_MAX_SELECTOR)
  520. return 850000 + (selector * 25000);
  521. else
  522. return -EINVAL;
  523. }
  524. static int wm831x_buckp_set_voltage_int(struct regulator_dev *rdev, int reg,
  525. int min_uV, int max_uV)
  526. {
  527. struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
  528. struct wm831x *wm831x = dcdc->wm831x;
  529. u16 vsel;
  530. if (min_uV <= 34000000)
  531. vsel = (min_uV - 850000) / 25000;
  532. else
  533. return -EINVAL;
  534. if (wm831x_buckp_list_voltage(rdev, vsel) > max_uV)
  535. return -EINVAL;
  536. return wm831x_set_bits(wm831x, reg, WM831X_DC3_ON_VSEL_MASK, vsel);
  537. }
  538. static int wm831x_buckp_set_voltage(struct regulator_dev *rdev,
  539. int min_uV, int max_uV)
  540. {
  541. struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
  542. u16 reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
  543. return wm831x_buckp_set_voltage_int(rdev, reg, min_uV, max_uV);
  544. }
  545. static int wm831x_buckp_set_suspend_voltage(struct regulator_dev *rdev,
  546. int uV)
  547. {
  548. struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
  549. u16 reg = dcdc->base + WM831X_DCDC_SLEEP_CONTROL;
  550. return wm831x_buckp_set_voltage_int(rdev, reg, uV, uV);
  551. }
  552. static int wm831x_buckp_get_voltage(struct regulator_dev *rdev)
  553. {
  554. struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
  555. struct wm831x *wm831x = dcdc->wm831x;
  556. u16 reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
  557. int val;
  558. val = wm831x_reg_read(wm831x, reg);
  559. if (val < 0)
  560. return val;
  561. return wm831x_buckp_list_voltage(rdev, val & WM831X_DC3_ON_VSEL_MASK);
  562. }
  563. static struct regulator_ops wm831x_buckp_ops = {
  564. .set_voltage = wm831x_buckp_set_voltage,
  565. .get_voltage = wm831x_buckp_get_voltage,
  566. .list_voltage = wm831x_buckp_list_voltage,
  567. .set_suspend_voltage = wm831x_buckp_set_suspend_voltage,
  568. .is_enabled = wm831x_dcdc_is_enabled,
  569. .enable = wm831x_dcdc_enable,
  570. .disable = wm831x_dcdc_disable,
  571. .get_status = wm831x_dcdc_get_status,
  572. .get_mode = wm831x_dcdc_get_mode,
  573. .set_mode = wm831x_dcdc_set_mode,
  574. .set_suspend_mode = wm831x_dcdc_set_suspend_mode,
  575. };
  576. static __devinit int wm831x_buckp_probe(struct platform_device *pdev)
  577. {
  578. struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
  579. struct wm831x_pdata *pdata = wm831x->dev->platform_data;
  580. int id = pdev->id % ARRAY_SIZE(pdata->dcdc);
  581. struct wm831x_dcdc *dcdc;
  582. struct resource *res;
  583. int ret, irq;
  584. dev_dbg(&pdev->dev, "Probing DCDC%d\n", id + 1);
  585. if (pdata == NULL || pdata->dcdc[id] == NULL)
  586. return -ENODEV;
  587. dcdc = kzalloc(sizeof(struct wm831x_dcdc), GFP_KERNEL);
  588. if (dcdc == NULL) {
  589. dev_err(&pdev->dev, "Unable to allocate private data\n");
  590. return -ENOMEM;
  591. }
  592. dcdc->wm831x = wm831x;
  593. res = platform_get_resource(pdev, IORESOURCE_IO, 0);
  594. if (res == NULL) {
  595. dev_err(&pdev->dev, "No I/O resource\n");
  596. ret = -EINVAL;
  597. goto err;
  598. }
  599. dcdc->base = res->start;
  600. snprintf(dcdc->name, sizeof(dcdc->name), "DCDC%d", id + 1);
  601. dcdc->desc.name = dcdc->name;
  602. dcdc->desc.id = id;
  603. dcdc->desc.type = REGULATOR_VOLTAGE;
  604. dcdc->desc.n_voltages = WM831X_BUCKP_MAX_SELECTOR + 1;
  605. dcdc->desc.ops = &wm831x_buckp_ops;
  606. dcdc->desc.owner = THIS_MODULE;
  607. dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev,
  608. pdata->dcdc[id], dcdc);
  609. if (IS_ERR(dcdc->regulator)) {
  610. ret = PTR_ERR(dcdc->regulator);
  611. dev_err(wm831x->dev, "Failed to register DCDC%d: %d\n",
  612. id + 1, ret);
  613. goto err;
  614. }
  615. irq = platform_get_irq_byname(pdev, "UV");
  616. ret = wm831x_request_irq(wm831x, irq, wm831x_dcdc_uv_irq,
  617. IRQF_TRIGGER_RISING, dcdc->name,
  618. dcdc);
  619. if (ret != 0) {
  620. dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
  621. irq, ret);
  622. goto err_regulator;
  623. }
  624. platform_set_drvdata(pdev, dcdc);
  625. return 0;
  626. err_regulator:
  627. regulator_unregister(dcdc->regulator);
  628. err:
  629. kfree(dcdc);
  630. return ret;
  631. }
  632. static __devexit int wm831x_buckp_remove(struct platform_device *pdev)
  633. {
  634. struct wm831x_dcdc *dcdc = platform_get_drvdata(pdev);
  635. struct wm831x *wm831x = dcdc->wm831x;
  636. platform_set_drvdata(pdev, NULL);
  637. wm831x_free_irq(wm831x, platform_get_irq_byname(pdev, "UV"), dcdc);
  638. regulator_unregister(dcdc->regulator);
  639. kfree(dcdc);
  640. return 0;
  641. }
  642. static struct platform_driver wm831x_buckp_driver = {
  643. .probe = wm831x_buckp_probe,
  644. .remove = __devexit_p(wm831x_buckp_remove),
  645. .driver = {
  646. .name = "wm831x-buckp",
  647. .owner = THIS_MODULE,
  648. },
  649. };
  650. /*
  651. * DCDC boost convertors
  652. */
  653. static int wm831x_boostp_get_status(struct regulator_dev *rdev)
  654. {
  655. struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
  656. struct wm831x *wm831x = dcdc->wm831x;
  657. int ret;
  658. /* First, check for errors */
  659. ret = wm831x_reg_read(wm831x, WM831X_DCDC_UV_STATUS);
  660. if (ret < 0)
  661. return ret;
  662. if (ret & (1 << rdev_get_id(rdev))) {
  663. dev_dbg(wm831x->dev, "DCDC%d under voltage\n",
  664. rdev_get_id(rdev) + 1);
  665. return REGULATOR_STATUS_ERROR;
  666. }
  667. /* Is the regulator on? */
  668. ret = wm831x_reg_read(wm831x, WM831X_DCDC_STATUS);
  669. if (ret < 0)
  670. return ret;
  671. if (ret & (1 << rdev_get_id(rdev)))
  672. return REGULATOR_STATUS_ON;
  673. else
  674. return REGULATOR_STATUS_OFF;
  675. }
  676. static struct regulator_ops wm831x_boostp_ops = {
  677. .get_status = wm831x_boostp_get_status,
  678. .is_enabled = wm831x_dcdc_is_enabled,
  679. .enable = wm831x_dcdc_enable,
  680. .disable = wm831x_dcdc_disable,
  681. };
  682. static __devinit int wm831x_boostp_probe(struct platform_device *pdev)
  683. {
  684. struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
  685. struct wm831x_pdata *pdata = wm831x->dev->platform_data;
  686. int id = pdev->id % ARRAY_SIZE(pdata->dcdc);
  687. struct wm831x_dcdc *dcdc;
  688. struct resource *res;
  689. int ret, irq;
  690. dev_dbg(&pdev->dev, "Probing DCDC%d\n", id + 1);
  691. if (pdata == NULL || pdata->dcdc[id] == NULL)
  692. return -ENODEV;
  693. dcdc = kzalloc(sizeof(struct wm831x_dcdc), GFP_KERNEL);
  694. if (dcdc == NULL) {
  695. dev_err(&pdev->dev, "Unable to allocate private data\n");
  696. return -ENOMEM;
  697. }
  698. dcdc->wm831x = wm831x;
  699. res = platform_get_resource(pdev, IORESOURCE_IO, 0);
  700. if (res == NULL) {
  701. dev_err(&pdev->dev, "No I/O resource\n");
  702. ret = -EINVAL;
  703. goto err;
  704. }
  705. dcdc->base = res->start;
  706. snprintf(dcdc->name, sizeof(dcdc->name), "DCDC%d", id + 1);
  707. dcdc->desc.name = dcdc->name;
  708. dcdc->desc.id = id;
  709. dcdc->desc.type = REGULATOR_VOLTAGE;
  710. dcdc->desc.ops = &wm831x_boostp_ops;
  711. dcdc->desc.owner = THIS_MODULE;
  712. dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev,
  713. pdata->dcdc[id], dcdc);
  714. if (IS_ERR(dcdc->regulator)) {
  715. ret = PTR_ERR(dcdc->regulator);
  716. dev_err(wm831x->dev, "Failed to register DCDC%d: %d\n",
  717. id + 1, ret);
  718. goto err;
  719. }
  720. irq = platform_get_irq_byname(pdev, "UV");
  721. ret = wm831x_request_irq(wm831x, irq, wm831x_dcdc_uv_irq,
  722. IRQF_TRIGGER_RISING, dcdc->name,
  723. dcdc);
  724. if (ret != 0) {
  725. dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
  726. irq, ret);
  727. goto err_regulator;
  728. }
  729. platform_set_drvdata(pdev, dcdc);
  730. return 0;
  731. err_regulator:
  732. regulator_unregister(dcdc->regulator);
  733. err:
  734. kfree(dcdc);
  735. return ret;
  736. }
  737. static __devexit int wm831x_boostp_remove(struct platform_device *pdev)
  738. {
  739. struct wm831x_dcdc *dcdc = platform_get_drvdata(pdev);
  740. struct wm831x *wm831x = dcdc->wm831x;
  741. platform_set_drvdata(pdev, NULL);
  742. wm831x_free_irq(wm831x, platform_get_irq_byname(pdev, "UV"), dcdc);
  743. regulator_unregister(dcdc->regulator);
  744. kfree(dcdc);
  745. return 0;
  746. }
  747. static struct platform_driver wm831x_boostp_driver = {
  748. .probe = wm831x_boostp_probe,
  749. .remove = __devexit_p(wm831x_boostp_remove),
  750. .driver = {
  751. .name = "wm831x-boostp",
  752. .owner = THIS_MODULE,
  753. },
  754. };
  755. /*
  756. * External Power Enable
  757. *
  758. * These aren't actually DCDCs but look like them in hardware so share
  759. * code.
  760. */
  761. #define WM831X_EPE_BASE 6
  762. static struct regulator_ops wm831x_epe_ops = {
  763. .is_enabled = wm831x_dcdc_is_enabled,
  764. .enable = wm831x_dcdc_enable,
  765. .disable = wm831x_dcdc_disable,
  766. .get_status = wm831x_dcdc_get_status,
  767. };
  768. static __devinit int wm831x_epe_probe(struct platform_device *pdev)
  769. {
  770. struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
  771. struct wm831x_pdata *pdata = wm831x->dev->platform_data;
  772. int id = pdev->id % ARRAY_SIZE(pdata->epe);
  773. struct wm831x_dcdc *dcdc;
  774. int ret;
  775. dev_dbg(&pdev->dev, "Probing EPE%d\n", id + 1);
  776. if (pdata == NULL || pdata->epe[id] == NULL)
  777. return -ENODEV;
  778. dcdc = kzalloc(sizeof(struct wm831x_dcdc), GFP_KERNEL);
  779. if (dcdc == NULL) {
  780. dev_err(&pdev->dev, "Unable to allocate private data\n");
  781. return -ENOMEM;
  782. }
  783. dcdc->wm831x = wm831x;
  784. /* For current parts this is correct; probably need to revisit
  785. * in future.
  786. */
  787. snprintf(dcdc->name, sizeof(dcdc->name), "EPE%d", id + 1);
  788. dcdc->desc.name = dcdc->name;
  789. dcdc->desc.id = id + WM831X_EPE_BASE; /* Offset in DCDC registers */
  790. dcdc->desc.ops = &wm831x_epe_ops;
  791. dcdc->desc.type = REGULATOR_VOLTAGE;
  792. dcdc->desc.owner = THIS_MODULE;
  793. dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev,
  794. pdata->epe[id], dcdc);
  795. if (IS_ERR(dcdc->regulator)) {
  796. ret = PTR_ERR(dcdc->regulator);
  797. dev_err(wm831x->dev, "Failed to register EPE%d: %d\n",
  798. id + 1, ret);
  799. goto err;
  800. }
  801. platform_set_drvdata(pdev, dcdc);
  802. return 0;
  803. err:
  804. kfree(dcdc);
  805. return ret;
  806. }
  807. static __devexit int wm831x_epe_remove(struct platform_device *pdev)
  808. {
  809. struct wm831x_dcdc *dcdc = platform_get_drvdata(pdev);
  810. platform_set_drvdata(pdev, NULL);
  811. regulator_unregister(dcdc->regulator);
  812. kfree(dcdc);
  813. return 0;
  814. }
  815. static struct platform_driver wm831x_epe_driver = {
  816. .probe = wm831x_epe_probe,
  817. .remove = __devexit_p(wm831x_epe_remove),
  818. .driver = {
  819. .name = "wm831x-epe",
  820. .owner = THIS_MODULE,
  821. },
  822. };
  823. static int __init wm831x_dcdc_init(void)
  824. {
  825. int ret;
  826. ret = platform_driver_register(&wm831x_buckv_driver);
  827. if (ret != 0)
  828. pr_err("Failed to register WM831x BUCKV driver: %d\n", ret);
  829. ret = platform_driver_register(&wm831x_buckp_driver);
  830. if (ret != 0)
  831. pr_err("Failed to register WM831x BUCKP driver: %d\n", ret);
  832. ret = platform_driver_register(&wm831x_boostp_driver);
  833. if (ret != 0)
  834. pr_err("Failed to register WM831x BOOST driver: %d\n", ret);
  835. ret = platform_driver_register(&wm831x_epe_driver);
  836. if (ret != 0)
  837. pr_err("Failed to register WM831x EPE driver: %d\n", ret);
  838. return 0;
  839. }
  840. subsys_initcall(wm831x_dcdc_init);
  841. static void __exit wm831x_dcdc_exit(void)
  842. {
  843. platform_driver_unregister(&wm831x_epe_driver);
  844. platform_driver_unregister(&wm831x_boostp_driver);
  845. platform_driver_unregister(&wm831x_buckp_driver);
  846. platform_driver_unregister(&wm831x_buckv_driver);
  847. }
  848. module_exit(wm831x_dcdc_exit);
  849. /* Module information */
  850. MODULE_AUTHOR("Mark Brown");
  851. MODULE_DESCRIPTION("WM831x DC-DC convertor driver");
  852. MODULE_LICENSE("GPL");
  853. MODULE_ALIAS("platform:wm831x-buckv");
  854. MODULE_ALIAS("platform:wm831x-buckp");