pinctrl-madera-core.c 26 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Pinctrl for Cirrus Logic Madera codecs
  4. *
  5. * Copyright (C) 2016-2018 Cirrus Logic
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by the
  9. * Free Software Foundation; version 2.
  10. */
  11. #include <linux/err.h>
  12. #include <linux/module.h>
  13. #include <linux/platform_device.h>
  14. #include <linux/regmap.h>
  15. #include <linux/slab.h>
  16. #include <linux/pinctrl/pinctrl.h>
  17. #include <linux/pinctrl/pinmux.h>
  18. #include <linux/pinctrl/pinconf.h>
  19. #include <linux/pinctrl/pinconf-generic.h>
  20. #include <linux/mfd/madera/core.h>
  21. #include <linux/mfd/madera/registers.h>
  22. #include "../pinctrl-utils.h"
  23. #include "pinctrl-madera.h"
  24. /*
  25. * Use pin GPIO names for consistency
  26. * NOTE: IDs are zero-indexed for coding convenience
  27. */
  28. static const struct pinctrl_pin_desc madera_pins[] = {
  29. PINCTRL_PIN(0, "gpio1"),
  30. PINCTRL_PIN(1, "gpio2"),
  31. PINCTRL_PIN(2, "gpio3"),
  32. PINCTRL_PIN(3, "gpio4"),
  33. PINCTRL_PIN(4, "gpio5"),
  34. PINCTRL_PIN(5, "gpio6"),
  35. PINCTRL_PIN(6, "gpio7"),
  36. PINCTRL_PIN(7, "gpio8"),
  37. PINCTRL_PIN(8, "gpio9"),
  38. PINCTRL_PIN(9, "gpio10"),
  39. PINCTRL_PIN(10, "gpio11"),
  40. PINCTRL_PIN(11, "gpio12"),
  41. PINCTRL_PIN(12, "gpio13"),
  42. PINCTRL_PIN(13, "gpio14"),
  43. PINCTRL_PIN(14, "gpio15"),
  44. PINCTRL_PIN(15, "gpio16"),
  45. PINCTRL_PIN(16, "gpio17"),
  46. PINCTRL_PIN(17, "gpio18"),
  47. PINCTRL_PIN(18, "gpio19"),
  48. PINCTRL_PIN(19, "gpio20"),
  49. PINCTRL_PIN(20, "gpio21"),
  50. PINCTRL_PIN(21, "gpio22"),
  51. PINCTRL_PIN(22, "gpio23"),
  52. PINCTRL_PIN(23, "gpio24"),
  53. PINCTRL_PIN(24, "gpio25"),
  54. PINCTRL_PIN(25, "gpio26"),
  55. PINCTRL_PIN(26, "gpio27"),
  56. PINCTRL_PIN(27, "gpio28"),
  57. PINCTRL_PIN(28, "gpio29"),
  58. PINCTRL_PIN(29, "gpio30"),
  59. PINCTRL_PIN(30, "gpio31"),
  60. PINCTRL_PIN(31, "gpio32"),
  61. PINCTRL_PIN(32, "gpio33"),
  62. PINCTRL_PIN(33, "gpio34"),
  63. PINCTRL_PIN(34, "gpio35"),
  64. PINCTRL_PIN(35, "gpio36"),
  65. PINCTRL_PIN(36, "gpio37"),
  66. PINCTRL_PIN(37, "gpio38"),
  67. PINCTRL_PIN(38, "gpio39"),
  68. PINCTRL_PIN(39, "gpio40"),
  69. };
  70. /*
  71. * All single-pin functions can be mapped to any GPIO, however pinmux applies
  72. * functions to pin groups and only those groups declared as supporting that
  73. * function. To make this work we must put each pin in its own dummy group so
  74. * that the functions can be described as applying to all pins.
  75. * Since these do not correspond to anything in the actual hardware - they are
  76. * merely an adaptation to pinctrl's view of the world - we use the same name
  77. * as the pin to avoid confusion when comparing with datasheet instructions
  78. */
  79. static const char * const madera_pin_single_group_names[] = {
  80. "gpio1", "gpio2", "gpio3", "gpio4", "gpio5", "gpio6", "gpio7",
  81. "gpio8", "gpio9", "gpio10", "gpio11", "gpio12", "gpio13", "gpio14",
  82. "gpio15", "gpio16", "gpio17", "gpio18", "gpio19", "gpio20", "gpio21",
  83. "gpio22", "gpio23", "gpio24", "gpio25", "gpio26", "gpio27", "gpio28",
  84. "gpio29", "gpio30", "gpio31", "gpio32", "gpio33", "gpio34", "gpio35",
  85. "gpio36", "gpio37", "gpio38", "gpio39", "gpio40",
  86. };
  87. /* set of pin numbers for single-pin groups, zero-indexed */
  88. static const unsigned int madera_pin_single_group_pins[] = {
  89. 0, 1, 2, 3, 4, 5, 6,
  90. 7, 8, 9, 10, 11, 12, 13,
  91. 14, 15, 16, 17, 18, 19, 20,
  92. 21, 22, 23, 24, 25, 26, 27,
  93. 28, 29, 30, 31, 32, 33, 34,
  94. 35, 36, 37, 38, 39,
  95. };
  96. static const char * const madera_aif1_group_names[] = { "aif1" };
  97. static const char * const madera_aif2_group_names[] = { "aif2" };
  98. static const char * const madera_aif3_group_names[] = { "aif3" };
  99. static const char * const madera_aif4_group_names[] = { "aif4" };
  100. static const char * const madera_mif1_group_names[] = { "mif1" };
  101. static const char * const madera_mif2_group_names[] = { "mif2" };
  102. static const char * const madera_mif3_group_names[] = { "mif3" };
  103. static const char * const madera_dmic3_group_names[] = { "dmic3" };
  104. static const char * const madera_dmic4_group_names[] = { "dmic4" };
  105. static const char * const madera_dmic5_group_names[] = { "dmic5" };
  106. static const char * const madera_dmic6_group_names[] = { "dmic6" };
  107. static const char * const madera_spk1_group_names[] = { "pdmspk1" };
  108. static const char * const madera_spk2_group_names[] = { "pdmspk2" };
  109. /*
  110. * alt-functions always apply to a single pin group, other functions always
  111. * apply to all pins
  112. */
  113. static const struct {
  114. const char *name;
  115. const char * const *group_names;
  116. u32 func;
  117. } madera_mux_funcs[] = {
  118. {
  119. .name = "aif1",
  120. .group_names = madera_aif1_group_names,
  121. .func = 0x000
  122. },
  123. {
  124. .name = "aif2",
  125. .group_names = madera_aif2_group_names,
  126. .func = 0x000
  127. },
  128. {
  129. .name = "aif3",
  130. .group_names = madera_aif3_group_names,
  131. .func = 0x000
  132. },
  133. {
  134. .name = "aif4",
  135. .group_names = madera_aif4_group_names,
  136. .func = 0x000
  137. },
  138. {
  139. .name = "mif1",
  140. .group_names = madera_mif1_group_names,
  141. .func = 0x000
  142. },
  143. {
  144. .name = "mif2",
  145. .group_names = madera_mif2_group_names,
  146. .func = 0x000
  147. },
  148. {
  149. .name = "mif3",
  150. .group_names = madera_mif3_group_names,
  151. .func = 0x000
  152. },
  153. {
  154. .name = "dmic3",
  155. .group_names = madera_dmic3_group_names,
  156. .func = 0x000
  157. },
  158. {
  159. .name = "dmic4",
  160. .group_names = madera_dmic4_group_names,
  161. .func = 0x000
  162. },
  163. {
  164. .name = "dmic5",
  165. .group_names = madera_dmic5_group_names,
  166. .func = 0x000
  167. },
  168. {
  169. .name = "dmic6",
  170. .group_names = madera_dmic6_group_names,
  171. .func = 0x000
  172. },
  173. {
  174. .name = "pdmspk1",
  175. .group_names = madera_spk1_group_names,
  176. .func = 0x000
  177. },
  178. {
  179. .name = "pdmspk2",
  180. .group_names = madera_spk2_group_names,
  181. .func = 0x000
  182. },
  183. {
  184. .name = "io",
  185. .group_names = madera_pin_single_group_names,
  186. .func = 0x001
  187. },
  188. {
  189. .name = "dsp-gpio",
  190. .group_names = madera_pin_single_group_names,
  191. .func = 0x002
  192. },
  193. {
  194. .name = "irq1",
  195. .group_names = madera_pin_single_group_names,
  196. .func = 0x003
  197. },
  198. {
  199. .name = "irq2",
  200. .group_names = madera_pin_single_group_names,
  201. .func = 0x004
  202. },
  203. {
  204. .name = "fll1-clk",
  205. .group_names = madera_pin_single_group_names,
  206. .func = 0x010
  207. },
  208. {
  209. .name = "fll2-clk",
  210. .group_names = madera_pin_single_group_names,
  211. .func = 0x011
  212. },
  213. {
  214. .name = "fll3-clk",
  215. .group_names = madera_pin_single_group_names,
  216. .func = 0x012
  217. },
  218. {
  219. .name = "fllao-clk",
  220. .group_names = madera_pin_single_group_names,
  221. .func = 0x013
  222. },
  223. {
  224. .name = "fll1-lock",
  225. .group_names = madera_pin_single_group_names,
  226. .func = 0x018
  227. },
  228. {
  229. .name = "fll2-lock",
  230. .group_names = madera_pin_single_group_names,
  231. .func = 0x019
  232. },
  233. {
  234. .name = "fll3-lock",
  235. .group_names = madera_pin_single_group_names,
  236. .func = 0x01a
  237. },
  238. {
  239. .name = "fllao-lock",
  240. .group_names = madera_pin_single_group_names,
  241. .func = 0x01b
  242. },
  243. {
  244. .name = "opclk",
  245. .group_names = madera_pin_single_group_names,
  246. .func = 0x040
  247. },
  248. {
  249. .name = "opclk-async",
  250. .group_names = madera_pin_single_group_names,
  251. .func = 0x041
  252. },
  253. {
  254. .name = "pwm1",
  255. .group_names = madera_pin_single_group_names,
  256. .func = 0x048
  257. },
  258. {
  259. .name = "pwm2",
  260. .group_names = madera_pin_single_group_names,
  261. .func = 0x049
  262. },
  263. {
  264. .name = "spdif",
  265. .group_names = madera_pin_single_group_names,
  266. .func = 0x04c
  267. },
  268. {
  269. .name = "asrc1-in1-lock",
  270. .group_names = madera_pin_single_group_names,
  271. .func = 0x088
  272. },
  273. {
  274. .name = "asrc1-in2-lock",
  275. .group_names = madera_pin_single_group_names,
  276. .func = 0x089
  277. },
  278. {
  279. .name = "asrc2-in1-lock",
  280. .group_names = madera_pin_single_group_names,
  281. .func = 0x08a
  282. },
  283. {
  284. .name = "asrc2-in2-lock",
  285. .group_names = madera_pin_single_group_names,
  286. .func = 0x08b
  287. },
  288. {
  289. .name = "spkl-short-circuit",
  290. .group_names = madera_pin_single_group_names,
  291. .func = 0x0b6
  292. },
  293. {
  294. .name = "spkr-short-circuit",
  295. .group_names = madera_pin_single_group_names,
  296. .func = 0x0b7
  297. },
  298. {
  299. .name = "spk-shutdown",
  300. .group_names = madera_pin_single_group_names,
  301. .func = 0x0e0
  302. },
  303. {
  304. .name = "spk-overheat-shutdown",
  305. .group_names = madera_pin_single_group_names,
  306. .func = 0x0e1
  307. },
  308. {
  309. .name = "spk-overheat-warn",
  310. .group_names = madera_pin_single_group_names,
  311. .func = 0x0e2
  312. },
  313. {
  314. .name = "timer1-sts",
  315. .group_names = madera_pin_single_group_names,
  316. .func = 0x140
  317. },
  318. {
  319. .name = "timer2-sts",
  320. .group_names = madera_pin_single_group_names,
  321. .func = 0x141
  322. },
  323. {
  324. .name = "timer3-sts",
  325. .group_names = madera_pin_single_group_names,
  326. .func = 0x142
  327. },
  328. {
  329. .name = "timer4-sts",
  330. .group_names = madera_pin_single_group_names,
  331. .func = 0x143
  332. },
  333. {
  334. .name = "timer5-sts",
  335. .group_names = madera_pin_single_group_names,
  336. .func = 0x144
  337. },
  338. {
  339. .name = "timer6-sts",
  340. .group_names = madera_pin_single_group_names,
  341. .func = 0x145
  342. },
  343. {
  344. .name = "timer7-sts",
  345. .group_names = madera_pin_single_group_names,
  346. .func = 0x146
  347. },
  348. {
  349. .name = "timer8-sts",
  350. .group_names = madera_pin_single_group_names,
  351. .func = 0x147
  352. },
  353. {
  354. .name = "log1-fifo-ne",
  355. .group_names = madera_pin_single_group_names,
  356. .func = 0x150
  357. },
  358. {
  359. .name = "log2-fifo-ne",
  360. .group_names = madera_pin_single_group_names,
  361. .func = 0x151
  362. },
  363. {
  364. .name = "log3-fifo-ne",
  365. .group_names = madera_pin_single_group_names,
  366. .func = 0x152
  367. },
  368. {
  369. .name = "log4-fifo-ne",
  370. .group_names = madera_pin_single_group_names,
  371. .func = 0x153
  372. },
  373. {
  374. .name = "log5-fifo-ne",
  375. .group_names = madera_pin_single_group_names,
  376. .func = 0x154
  377. },
  378. {
  379. .name = "log6-fifo-ne",
  380. .group_names = madera_pin_single_group_names,
  381. .func = 0x155
  382. },
  383. {
  384. .name = "log7-fifo-ne",
  385. .group_names = madera_pin_single_group_names,
  386. .func = 0x156
  387. },
  388. {
  389. .name = "log8-fifo-ne",
  390. .group_names = madera_pin_single_group_names,
  391. .func = 0x157
  392. },
  393. };
  394. static u16 madera_pin_make_drv_str(struct madera_pin_private *priv,
  395. unsigned int milliamps)
  396. {
  397. switch (milliamps) {
  398. case 4:
  399. return 0;
  400. case 8:
  401. return 2 << MADERA_GP1_DRV_STR_SHIFT;
  402. default:
  403. break;
  404. }
  405. dev_warn(priv->dev, "%u mA not a valid drive strength", milliamps);
  406. return 0;
  407. }
  408. static unsigned int madera_pin_unmake_drv_str(struct madera_pin_private *priv,
  409. u16 regval)
  410. {
  411. regval = (regval & MADERA_GP1_DRV_STR_MASK) >> MADERA_GP1_DRV_STR_SHIFT;
  412. switch (regval) {
  413. case 0:
  414. return 4;
  415. case 2:
  416. return 8;
  417. default:
  418. return 0;
  419. }
  420. }
  421. static int madera_get_groups_count(struct pinctrl_dev *pctldev)
  422. {
  423. struct madera_pin_private *priv = pinctrl_dev_get_drvdata(pctldev);
  424. /* Number of alt function groups plus number of single-pin groups */
  425. return priv->chip->n_pin_groups + priv->chip->n_pins;
  426. }
  427. static const char *madera_get_group_name(struct pinctrl_dev *pctldev,
  428. unsigned int selector)
  429. {
  430. struct madera_pin_private *priv = pinctrl_dev_get_drvdata(pctldev);
  431. if (selector < priv->chip->n_pin_groups)
  432. return priv->chip->pin_groups[selector].name;
  433. selector -= priv->chip->n_pin_groups;
  434. return madera_pin_single_group_names[selector];
  435. }
  436. static int madera_get_group_pins(struct pinctrl_dev *pctldev,
  437. unsigned int selector,
  438. const unsigned int **pins,
  439. unsigned int *num_pins)
  440. {
  441. struct madera_pin_private *priv = pinctrl_dev_get_drvdata(pctldev);
  442. if (selector < priv->chip->n_pin_groups) {
  443. *pins = priv->chip->pin_groups[selector].pins;
  444. *num_pins = priv->chip->pin_groups[selector].n_pins;
  445. } else {
  446. /* return the dummy group for a single pin */
  447. selector -= priv->chip->n_pin_groups;
  448. *pins = &madera_pin_single_group_pins[selector];
  449. *num_pins = 1;
  450. }
  451. return 0;
  452. }
  453. static void madera_pin_dbg_show_fn(struct madera_pin_private *priv,
  454. struct seq_file *s,
  455. unsigned int pin, unsigned int fn)
  456. {
  457. const struct madera_pin_chip *chip = priv->chip;
  458. int i, g_pin;
  459. if (fn != 0) {
  460. for (i = 0; i < ARRAY_SIZE(madera_mux_funcs); ++i) {
  461. if (madera_mux_funcs[i].func == fn) {
  462. seq_printf(s, " FN=%s",
  463. madera_mux_funcs[i].name);
  464. return;
  465. }
  466. }
  467. return; /* ignore unknown function values */
  468. }
  469. /* alt function */
  470. for (i = 0; i < chip->n_pin_groups; ++i) {
  471. for (g_pin = 0; g_pin < chip->pin_groups[i].n_pins; ++g_pin) {
  472. if (chip->pin_groups[i].pins[g_pin] == pin) {
  473. seq_printf(s, " FN=%s",
  474. chip->pin_groups[i].name);
  475. return;
  476. }
  477. }
  478. }
  479. }
  480. static void __maybe_unused madera_pin_dbg_show(struct pinctrl_dev *pctldev,
  481. struct seq_file *s,
  482. unsigned int pin)
  483. {
  484. struct madera_pin_private *priv = pinctrl_dev_get_drvdata(pctldev);
  485. unsigned int conf[2];
  486. unsigned int reg = MADERA_GPIO1_CTRL_1 + (2 * pin);
  487. unsigned int fn;
  488. int ret;
  489. ret = regmap_read(priv->madera->regmap, reg, &conf[0]);
  490. if (ret)
  491. return;
  492. ret = regmap_read(priv->madera->regmap, reg + 1, &conf[1]);
  493. if (ret)
  494. return;
  495. seq_printf(s, "%04x:%04x", conf[0], conf[1]);
  496. fn = (conf[0] & MADERA_GP1_FN_MASK) >> MADERA_GP1_FN_SHIFT;
  497. madera_pin_dbg_show_fn(priv, s, pin, fn);
  498. /* State of direction bit is only relevant if function==1 */
  499. if (fn == 1) {
  500. if (conf[1] & MADERA_GP1_DIR_MASK)
  501. seq_puts(s, " IN");
  502. else
  503. seq_puts(s, " OUT");
  504. }
  505. if (conf[1] & MADERA_GP1_PU_MASK)
  506. seq_puts(s, " PU");
  507. if (conf[1] & MADERA_GP1_PD_MASK)
  508. seq_puts(s, " PD");
  509. if (conf[0] & MADERA_GP1_DB_MASK)
  510. seq_puts(s, " DB");
  511. if (conf[0] & MADERA_GP1_OP_CFG_MASK)
  512. seq_puts(s, " OD");
  513. else
  514. seq_puts(s, " CMOS");
  515. seq_printf(s, " DRV=%umA", madera_pin_unmake_drv_str(priv, conf[1]));
  516. if (conf[0] & MADERA_GP1_IP_CFG_MASK)
  517. seq_puts(s, "SCHMITT");
  518. }
  519. static const struct pinctrl_ops madera_pin_group_ops = {
  520. .get_groups_count = madera_get_groups_count,
  521. .get_group_name = madera_get_group_name,
  522. .get_group_pins = madera_get_group_pins,
  523. #if IS_ENABLED(CONFIG_OF)
  524. .dt_node_to_map = pinconf_generic_dt_node_to_map_all,
  525. .dt_free_map = pinctrl_utils_free_map,
  526. #endif
  527. #if IS_ENABLED(CONFIG_DEBUG_FS)
  528. .pin_dbg_show = madera_pin_dbg_show,
  529. #endif
  530. };
  531. static int madera_mux_get_funcs_count(struct pinctrl_dev *pctldev)
  532. {
  533. return ARRAY_SIZE(madera_mux_funcs);
  534. }
  535. static const char *madera_mux_get_func_name(struct pinctrl_dev *pctldev,
  536. unsigned int selector)
  537. {
  538. return madera_mux_funcs[selector].name;
  539. }
  540. static int madera_mux_get_groups(struct pinctrl_dev *pctldev,
  541. unsigned int selector,
  542. const char * const **groups,
  543. unsigned int * const num_groups)
  544. {
  545. struct madera_pin_private *priv = pinctrl_dev_get_drvdata(pctldev);
  546. *groups = madera_mux_funcs[selector].group_names;
  547. if (madera_mux_funcs[selector].func == 0) {
  548. /* alt func always maps to a single group */
  549. *num_groups = 1;
  550. } else {
  551. /* other funcs map to all available gpio pins */
  552. *num_groups = priv->chip->n_pins;
  553. }
  554. return 0;
  555. }
  556. static int madera_mux_set_mux(struct pinctrl_dev *pctldev,
  557. unsigned int selector,
  558. unsigned int group)
  559. {
  560. struct madera_pin_private *priv = pinctrl_dev_get_drvdata(pctldev);
  561. struct madera *madera = priv->madera;
  562. const struct madera_pin_groups *pin_group = priv->chip->pin_groups;
  563. unsigned int n_chip_groups = priv->chip->n_pin_groups;
  564. const char *func_name = madera_mux_funcs[selector].name;
  565. unsigned int reg;
  566. int i, ret = 0;
  567. dev_dbg(priv->dev, "%s selecting %u (%s) for group %u (%s)\n",
  568. __func__, selector, func_name, group,
  569. madera_get_group_name(pctldev, group));
  570. if (madera_mux_funcs[selector].func == 0) {
  571. /* alt func pin assignments are codec-specific */
  572. for (i = 0; i < n_chip_groups; ++i) {
  573. if (strcmp(func_name, pin_group->name) == 0)
  574. break;
  575. ++pin_group;
  576. }
  577. if (i == n_chip_groups)
  578. return -EINVAL;
  579. for (i = 0; i < pin_group->n_pins; ++i) {
  580. reg = MADERA_GPIO1_CTRL_1 + (2 * pin_group->pins[i]);
  581. dev_dbg(priv->dev, "%s setting 0x%x func bits to 0\n",
  582. __func__, reg);
  583. ret = regmap_update_bits(madera->regmap, reg,
  584. MADERA_GP1_FN_MASK, 0);
  585. if (ret)
  586. break;
  587. }
  588. } else {
  589. /*
  590. * for other funcs the group will be the gpio number and will
  591. * be offset by the number of chip-specific functions at the
  592. * start of the group list
  593. */
  594. group -= n_chip_groups;
  595. reg = MADERA_GPIO1_CTRL_1 + (2 * group);
  596. dev_dbg(priv->dev, "%s setting 0x%x func bits to 0x%x\n",
  597. __func__, reg, madera_mux_funcs[selector].func);
  598. ret = regmap_update_bits(madera->regmap,
  599. reg,
  600. MADERA_GP1_FN_MASK,
  601. madera_mux_funcs[selector].func);
  602. }
  603. if (ret)
  604. dev_err(priv->dev, "Failed to write to 0x%x (%d)\n", reg, ret);
  605. return ret;
  606. }
  607. static int madera_gpio_set_direction(struct pinctrl_dev *pctldev,
  608. struct pinctrl_gpio_range *range,
  609. unsigned int offset,
  610. bool input)
  611. {
  612. struct madera_pin_private *priv = pinctrl_dev_get_drvdata(pctldev);
  613. struct madera *madera = priv->madera;
  614. unsigned int reg = MADERA_GPIO1_CTRL_2 + (2 * offset);
  615. unsigned int val;
  616. int ret;
  617. if (input)
  618. val = MADERA_GP1_DIR;
  619. else
  620. val = 0;
  621. ret = regmap_update_bits(madera->regmap, reg, MADERA_GP1_DIR_MASK, val);
  622. if (ret)
  623. dev_err(priv->dev, "Failed to write to 0x%x (%d)\n", reg, ret);
  624. return ret;
  625. }
  626. static int madera_gpio_request_enable(struct pinctrl_dev *pctldev,
  627. struct pinctrl_gpio_range *range,
  628. unsigned int offset)
  629. {
  630. struct madera_pin_private *priv = pinctrl_dev_get_drvdata(pctldev);
  631. struct madera *madera = priv->madera;
  632. unsigned int reg = MADERA_GPIO1_CTRL_1 + (2 * offset);
  633. int ret;
  634. /* put the pin into GPIO mode */
  635. ret = regmap_update_bits(madera->regmap, reg, MADERA_GP1_FN_MASK, 1);
  636. if (ret)
  637. dev_err(priv->dev, "Failed to write to 0x%x (%d)\n", reg, ret);
  638. return ret;
  639. }
  640. static void madera_gpio_disable_free(struct pinctrl_dev *pctldev,
  641. struct pinctrl_gpio_range *range,
  642. unsigned int offset)
  643. {
  644. struct madera_pin_private *priv = pinctrl_dev_get_drvdata(pctldev);
  645. struct madera *madera = priv->madera;
  646. unsigned int reg = MADERA_GPIO1_CTRL_1 + (2 * offset);
  647. int ret;
  648. /* disable GPIO by setting to GPIO IN */
  649. madera_gpio_set_direction(pctldev, range, offset, true);
  650. ret = regmap_update_bits(madera->regmap, reg, MADERA_GP1_FN_MASK, 1);
  651. if (ret)
  652. dev_err(priv->dev, "Failed to write to 0x%x (%d)\n", reg, ret);
  653. }
  654. static const struct pinmux_ops madera_pin_mux_ops = {
  655. .get_functions_count = madera_mux_get_funcs_count,
  656. .get_function_name = madera_mux_get_func_name,
  657. .get_function_groups = madera_mux_get_groups,
  658. .set_mux = madera_mux_set_mux,
  659. .gpio_request_enable = madera_gpio_request_enable,
  660. .gpio_disable_free = madera_gpio_disable_free,
  661. .gpio_set_direction = madera_gpio_set_direction,
  662. .strict = true, /* GPIO and other functions are exclusive */
  663. };
  664. static int madera_pin_conf_get(struct pinctrl_dev *pctldev, unsigned int pin,
  665. unsigned long *config)
  666. {
  667. struct madera_pin_private *priv = pinctrl_dev_get_drvdata(pctldev);
  668. unsigned int param = pinconf_to_config_param(*config);
  669. unsigned int result = 0;
  670. unsigned int reg = MADERA_GPIO1_CTRL_1 + (2 * pin);
  671. unsigned int conf[2];
  672. int ret;
  673. ret = regmap_read(priv->madera->regmap, reg, &conf[0]);
  674. if (!ret)
  675. ret = regmap_read(priv->madera->regmap, reg + 1, &conf[1]);
  676. if (ret) {
  677. dev_err(priv->dev, "Failed to read GP%d conf (%d)\n",
  678. pin + 1, ret);
  679. return ret;
  680. }
  681. switch (param) {
  682. case PIN_CONFIG_BIAS_BUS_HOLD:
  683. conf[1] &= MADERA_GP1_PU_MASK | MADERA_GP1_PD_MASK;
  684. if (conf[1] == (MADERA_GP1_PU | MADERA_GP1_PD))
  685. result = 1;
  686. break;
  687. case PIN_CONFIG_BIAS_DISABLE:
  688. conf[1] &= MADERA_GP1_PU_MASK | MADERA_GP1_PD_MASK;
  689. if (!conf[1])
  690. result = 1;
  691. break;
  692. case PIN_CONFIG_BIAS_PULL_DOWN:
  693. conf[1] &= MADERA_GP1_PU_MASK | MADERA_GP1_PD_MASK;
  694. if (conf[1] == MADERA_GP1_PD_MASK)
  695. result = 1;
  696. break;
  697. case PIN_CONFIG_BIAS_PULL_UP:
  698. conf[1] &= MADERA_GP1_PU_MASK | MADERA_GP1_PD_MASK;
  699. if (conf[1] == MADERA_GP1_PU_MASK)
  700. result = 1;
  701. break;
  702. case PIN_CONFIG_DRIVE_OPEN_DRAIN:
  703. if (conf[0] & MADERA_GP1_OP_CFG_MASK)
  704. result = 1;
  705. break;
  706. case PIN_CONFIG_DRIVE_PUSH_PULL:
  707. if (!(conf[0] & MADERA_GP1_OP_CFG_MASK))
  708. result = 1;
  709. break;
  710. case PIN_CONFIG_DRIVE_STRENGTH:
  711. result = madera_pin_unmake_drv_str(priv, conf[1]);
  712. break;
  713. case PIN_CONFIG_INPUT_DEBOUNCE:
  714. if (conf[0] & MADERA_GP1_DB_MASK)
  715. result = 1;
  716. break;
  717. case PIN_CONFIG_INPUT_ENABLE:
  718. if (conf[0] & MADERA_GP1_DIR_MASK)
  719. result = 1;
  720. break;
  721. case PIN_CONFIG_INPUT_SCHMITT:
  722. case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
  723. if (conf[0] & MADERA_GP1_IP_CFG_MASK)
  724. result = 1;
  725. break;
  726. case PIN_CONFIG_OUTPUT:
  727. if ((conf[1] & MADERA_GP1_DIR_MASK) &&
  728. (conf[0] & MADERA_GP1_LVL_MASK))
  729. result = 1;
  730. break;
  731. default:
  732. break;
  733. }
  734. *config = pinconf_to_config_packed(param, result);
  735. return 0;
  736. }
  737. static int madera_pin_conf_set(struct pinctrl_dev *pctldev, unsigned int pin,
  738. unsigned long *configs, unsigned int num_configs)
  739. {
  740. struct madera_pin_private *priv = pinctrl_dev_get_drvdata(pctldev);
  741. u16 conf[2] = {0, 0};
  742. u16 mask[2] = {0, 0};
  743. unsigned int reg = MADERA_GPIO1_CTRL_1 + (2 * pin);
  744. unsigned int val;
  745. int ret;
  746. while (num_configs) {
  747. dev_dbg(priv->dev, "%s config 0x%lx\n", __func__, *configs);
  748. switch (pinconf_to_config_param(*configs)) {
  749. case PIN_CONFIG_BIAS_BUS_HOLD:
  750. mask[1] |= MADERA_GP1_PU_MASK | MADERA_GP1_PD_MASK;
  751. conf[1] |= MADERA_GP1_PU | MADERA_GP1_PD;
  752. break;
  753. case PIN_CONFIG_BIAS_DISABLE:
  754. mask[1] |= MADERA_GP1_PU_MASK | MADERA_GP1_PD_MASK;
  755. conf[1] &= ~(MADERA_GP1_PU | MADERA_GP1_PD);
  756. break;
  757. case PIN_CONFIG_BIAS_PULL_DOWN:
  758. mask[1] |= MADERA_GP1_PU_MASK | MADERA_GP1_PD_MASK;
  759. conf[1] |= MADERA_GP1_PD;
  760. conf[1] &= ~MADERA_GP1_PU;
  761. break;
  762. case PIN_CONFIG_BIAS_PULL_UP:
  763. mask[1] |= MADERA_GP1_PU_MASK | MADERA_GP1_PD_MASK;
  764. conf[1] |= MADERA_GP1_PU;
  765. conf[1] &= ~MADERA_GP1_PD;
  766. break;
  767. case PIN_CONFIG_DRIVE_OPEN_DRAIN:
  768. mask[0] |= MADERA_GP1_OP_CFG_MASK;
  769. conf[0] |= MADERA_GP1_OP_CFG;
  770. break;
  771. case PIN_CONFIG_DRIVE_PUSH_PULL:
  772. mask[0] |= MADERA_GP1_OP_CFG_MASK;
  773. conf[0] &= ~MADERA_GP1_OP_CFG;
  774. break;
  775. case PIN_CONFIG_DRIVE_STRENGTH:
  776. val = pinconf_to_config_argument(*configs);
  777. mask[1] |= MADERA_GP1_DRV_STR_MASK;
  778. conf[1] &= ~MADERA_GP1_DRV_STR_MASK;
  779. conf[1] |= madera_pin_make_drv_str(priv, val);
  780. break;
  781. case PIN_CONFIG_INPUT_DEBOUNCE:
  782. mask[0] |= MADERA_GP1_DB_MASK;
  783. /*
  784. * we can't configure debounce time per-pin so value
  785. * is just a flag
  786. */
  787. val = pinconf_to_config_argument(*configs);
  788. if (val)
  789. conf[0] |= MADERA_GP1_DB;
  790. else
  791. conf[0] &= ~MADERA_GP1_DB;
  792. break;
  793. case PIN_CONFIG_INPUT_ENABLE:
  794. val = pinconf_to_config_argument(*configs);
  795. mask[1] |= MADERA_GP1_DIR_MASK;
  796. if (val)
  797. conf[1] |= MADERA_GP1_DIR;
  798. else
  799. conf[1] &= ~MADERA_GP1_DIR;
  800. break;
  801. case PIN_CONFIG_INPUT_SCHMITT:
  802. val = pinconf_to_config_argument(*configs);
  803. mask[0] |= MADERA_GP1_IP_CFG;
  804. if (val)
  805. conf[0] |= MADERA_GP1_IP_CFG;
  806. else
  807. conf[0] &= ~MADERA_GP1_IP_CFG;
  808. mask[1] |= MADERA_GP1_DIR_MASK;
  809. conf[1] |= MADERA_GP1_DIR;
  810. break;
  811. case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
  812. mask[0] |= MADERA_GP1_IP_CFG;
  813. conf[0] |= MADERA_GP1_IP_CFG;
  814. mask[1] |= MADERA_GP1_DIR_MASK;
  815. conf[1] |= MADERA_GP1_DIR;
  816. break;
  817. case PIN_CONFIG_OUTPUT:
  818. val = pinconf_to_config_argument(*configs);
  819. mask[0] |= MADERA_GP1_LVL_MASK;
  820. if (val)
  821. conf[0] |= MADERA_GP1_LVL;
  822. else
  823. conf[0] &= ~MADERA_GP1_LVL;
  824. mask[1] |= MADERA_GP1_DIR_MASK;
  825. conf[1] &= ~MADERA_GP1_DIR;
  826. break;
  827. default:
  828. break;
  829. }
  830. ++configs;
  831. --num_configs;
  832. }
  833. dev_dbg(priv->dev,
  834. "%s gpio%d 0x%x:0x%x 0x%x:0x%x\n",
  835. __func__, pin + 1, reg, conf[0], reg + 1, conf[1]);
  836. ret = regmap_update_bits(priv->madera->regmap, reg, mask[0], conf[0]);
  837. if (ret)
  838. goto err;
  839. ++reg;
  840. ret = regmap_update_bits(priv->madera->regmap, reg, mask[1], conf[1]);
  841. if (ret)
  842. goto err;
  843. return 0;
  844. err:
  845. dev_err(priv->dev,
  846. "Failed to write GPIO%d conf (%d) reg 0x%x\n",
  847. pin + 1, ret, reg);
  848. return ret;
  849. }
  850. static int madera_pin_conf_group_set(struct pinctrl_dev *pctldev,
  851. unsigned int selector,
  852. unsigned long *configs,
  853. unsigned int num_configs)
  854. {
  855. struct madera_pin_private *priv = pinctrl_dev_get_drvdata(pctldev);
  856. const struct madera_pin_groups *pin_group;
  857. unsigned int n_groups = priv->chip->n_pin_groups;
  858. int i, ret;
  859. dev_dbg(priv->dev, "%s setting group %s\n", __func__,
  860. madera_get_group_name(pctldev, selector));
  861. if (selector >= n_groups) {
  862. /* group is a single pin, convert to pin number and set */
  863. return madera_pin_conf_set(pctldev,
  864. selector - n_groups,
  865. configs,
  866. num_configs);
  867. } else {
  868. pin_group = &priv->chip->pin_groups[selector];
  869. for (i = 0; i < pin_group->n_pins; ++i) {
  870. ret = madera_pin_conf_set(pctldev,
  871. pin_group->pins[i],
  872. configs,
  873. num_configs);
  874. if (ret)
  875. return ret;
  876. }
  877. }
  878. return 0;
  879. }
  880. static const struct pinconf_ops madera_pin_conf_ops = {
  881. .pin_config_get = madera_pin_conf_get,
  882. .pin_config_set = madera_pin_conf_set,
  883. .pin_config_group_set = madera_pin_conf_group_set,
  884. };
  885. static struct pinctrl_desc madera_pin_desc = {
  886. .name = "madera-pinctrl",
  887. .pins = madera_pins,
  888. .pctlops = &madera_pin_group_ops,
  889. .pmxops = &madera_pin_mux_ops,
  890. .confops = &madera_pin_conf_ops,
  891. .owner = THIS_MODULE,
  892. };
  893. static int madera_pin_probe(struct platform_device *pdev)
  894. {
  895. struct madera *madera = dev_get_drvdata(pdev->dev.parent);
  896. const struct madera_pdata *pdata = dev_get_platdata(madera->dev);
  897. struct madera_pin_private *priv;
  898. int ret;
  899. BUILD_BUG_ON(ARRAY_SIZE(madera_pin_single_group_names) !=
  900. ARRAY_SIZE(madera_pin_single_group_pins));
  901. dev_dbg(&pdev->dev, "%s\n", __func__);
  902. priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
  903. if (!priv)
  904. return -ENOMEM;
  905. priv->dev = &pdev->dev;
  906. priv->madera = madera;
  907. pdev->dev.of_node = madera->dev->of_node;
  908. switch (madera->type) {
  909. case CS47L35:
  910. if (IS_ENABLED(CONFIG_PINCTRL_CS47L35))
  911. priv->chip = &cs47l35_pin_chip;
  912. break;
  913. case CS47L85:
  914. case WM1840:
  915. if (IS_ENABLED(CONFIG_PINCTRL_CS47L85))
  916. priv->chip = &cs47l85_pin_chip;
  917. break;
  918. case CS47L90:
  919. case CS47L91:
  920. if (IS_ENABLED(CONFIG_PINCTRL_CS47L90))
  921. priv->chip = &cs47l90_pin_chip;
  922. break;
  923. default:
  924. break;
  925. }
  926. if (!priv->chip)
  927. return -ENODEV;
  928. madera_pin_desc.npins = priv->chip->n_pins;
  929. ret = devm_pinctrl_register_and_init(&pdev->dev,
  930. &madera_pin_desc,
  931. priv,
  932. &priv->pctl);
  933. if (ret) {
  934. dev_err(priv->dev, "Failed pinctrl register (%d)\n", ret);
  935. return ret;
  936. }
  937. /* if the configuration is provided through pdata, apply it */
  938. if (pdata && pdata->gpio_configs) {
  939. ret = pinctrl_register_mappings(pdata->gpio_configs,
  940. pdata->n_gpio_configs);
  941. if (ret) {
  942. dev_err(priv->dev,
  943. "Failed to register pdata mappings (%d)\n",
  944. ret);
  945. return ret;
  946. }
  947. }
  948. ret = pinctrl_enable(priv->pctl);
  949. if (ret) {
  950. dev_err(priv->dev, "Failed to enable pinctrl (%d)\n", ret);
  951. return ret;
  952. }
  953. dev_dbg(priv->dev, "pinctrl probed ok\n");
  954. return 0;
  955. }
  956. static struct platform_driver madera_pin_driver = {
  957. .probe = madera_pin_probe,
  958. .driver = {
  959. .name = "madera-pinctrl",
  960. },
  961. };
  962. module_platform_driver(madera_pin_driver);
  963. MODULE_DESCRIPTION("Madera pinctrl driver");
  964. MODULE_AUTHOR("Richard Fitzgerald <rf@opensource.cirrus.com>");
  965. MODULE_LICENSE("GPL v2");