pinctrl-mtk-common-v2.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2018 MediaTek Inc.
  4. *
  5. * Author: Sean Wang <sean.wang@mediatek.com>
  6. *
  7. */
  8. #include <linux/device.h>
  9. #include <linux/err.h>
  10. #include <linux/gpio/driver.h>
  11. #include <linux/platform_device.h>
  12. #include <linux/io.h>
  13. #include <linux/of_irq.h>
  14. #include "mtk-eint.h"
  15. #include "pinctrl-mtk-common-v2.h"
  16. /**
  17. * struct mtk_drive_desc - the structure that holds the information
  18. * of the driving current
  19. * @min: the minimum current of this group
  20. * @max: the maximum current of this group
  21. * @step: the step current of this group
  22. * @scal: the weight factor
  23. *
  24. * formula: output = ((input) / step - 1) * scal
  25. */
  26. struct mtk_drive_desc {
  27. u8 min;
  28. u8 max;
  29. u8 step;
  30. u8 scal;
  31. };
  32. /* The groups of drive strength */
  33. static const struct mtk_drive_desc mtk_drive[] = {
  34. [DRV_GRP0] = { 4, 16, 4, 1 },
  35. [DRV_GRP1] = { 4, 16, 4, 2 },
  36. [DRV_GRP2] = { 2, 8, 2, 1 },
  37. [DRV_GRP3] = { 2, 8, 2, 2 },
  38. [DRV_GRP4] = { 2, 16, 2, 1 },
  39. };
  40. static void mtk_w32(struct mtk_pinctrl *pctl, u8 i, u32 reg, u32 val)
  41. {
  42. writel_relaxed(val, pctl->base[i] + reg);
  43. }
  44. static u32 mtk_r32(struct mtk_pinctrl *pctl, u8 i, u32 reg)
  45. {
  46. return readl_relaxed(pctl->base[i] + reg);
  47. }
  48. void mtk_rmw(struct mtk_pinctrl *pctl, u8 i, u32 reg, u32 mask, u32 set)
  49. {
  50. u32 val;
  51. val = mtk_r32(pctl, i, reg);
  52. val &= ~mask;
  53. val |= set;
  54. mtk_w32(pctl, i, reg, val);
  55. }
  56. static int mtk_hw_pin_field_lookup(struct mtk_pinctrl *hw,
  57. const struct mtk_pin_desc *desc,
  58. int field, struct mtk_pin_field *pfd)
  59. {
  60. const struct mtk_pin_field_calc *c, *e;
  61. const struct mtk_pin_reg_calc *rc;
  62. u32 bits;
  63. if (hw->soc->reg_cal && hw->soc->reg_cal[field].range) {
  64. rc = &hw->soc->reg_cal[field];
  65. } else {
  66. dev_dbg(hw->dev,
  67. "Not support field %d for pin %d (%s)\n",
  68. field, desc->number, desc->name);
  69. return -ENOTSUPP;
  70. }
  71. c = rc->range;
  72. e = c + rc->nranges;
  73. while (c < e) {
  74. if (desc->number >= c->s_pin && desc->number <= c->e_pin)
  75. break;
  76. c++;
  77. }
  78. if (c >= e) {
  79. dev_dbg(hw->dev, "Not support field %d for pin = %d (%s)\n",
  80. field, desc->number, desc->name);
  81. return -ENOTSUPP;
  82. }
  83. if (c->i_base > hw->nbase - 1) {
  84. dev_err(hw->dev,
  85. "Invalid base for field %d for pin = %d (%s)\n",
  86. field, desc->number, desc->name);
  87. return -EINVAL;
  88. }
  89. /* Calculated bits as the overall offset the pin is located at,
  90. * if c->fixed is held, that determines the all the pins in the
  91. * range use the same field with the s_pin.
  92. */
  93. bits = c->fixed ? c->s_bit : c->s_bit +
  94. (desc->number - c->s_pin) * (c->x_bits);
  95. /* Fill pfd from bits. For example 32-bit register applied is assumed
  96. * when c->sz_reg is equal to 32.
  97. */
  98. pfd->index = c->i_base;
  99. pfd->offset = c->s_addr + c->x_addrs * (bits / c->sz_reg);
  100. pfd->bitpos = bits % c->sz_reg;
  101. pfd->mask = (1 << c->x_bits) - 1;
  102. /* pfd->next is used for indicating that bit wrapping-around happens
  103. * which requires the manipulation for bit 0 starting in the next
  104. * register to form the complete field read/write.
  105. */
  106. pfd->next = pfd->bitpos + c->x_bits > c->sz_reg ? c->x_addrs : 0;
  107. return 0;
  108. }
  109. static int mtk_hw_pin_field_get(struct mtk_pinctrl *hw,
  110. const struct mtk_pin_desc *desc,
  111. int field, struct mtk_pin_field *pfd)
  112. {
  113. if (field < 0 || field >= PINCTRL_PIN_REG_MAX) {
  114. dev_err(hw->dev, "Invalid Field %d\n", field);
  115. return -EINVAL;
  116. }
  117. return mtk_hw_pin_field_lookup(hw, desc, field, pfd);
  118. }
  119. static void mtk_hw_bits_part(struct mtk_pin_field *pf, int *h, int *l)
  120. {
  121. *l = 32 - pf->bitpos;
  122. *h = get_count_order(pf->mask) - *l;
  123. }
  124. static void mtk_hw_write_cross_field(struct mtk_pinctrl *hw,
  125. struct mtk_pin_field *pf, int value)
  126. {
  127. int nbits_l, nbits_h;
  128. mtk_hw_bits_part(pf, &nbits_h, &nbits_l);
  129. mtk_rmw(hw, pf->index, pf->offset, pf->mask << pf->bitpos,
  130. (value & pf->mask) << pf->bitpos);
  131. mtk_rmw(hw, pf->index, pf->offset + pf->next, BIT(nbits_h) - 1,
  132. (value & pf->mask) >> nbits_l);
  133. }
  134. static void mtk_hw_read_cross_field(struct mtk_pinctrl *hw,
  135. struct mtk_pin_field *pf, int *value)
  136. {
  137. int nbits_l, nbits_h, h, l;
  138. mtk_hw_bits_part(pf, &nbits_h, &nbits_l);
  139. l = (mtk_r32(hw, pf->index, pf->offset)
  140. >> pf->bitpos) & (BIT(nbits_l) - 1);
  141. h = (mtk_r32(hw, pf->index, pf->offset + pf->next))
  142. & (BIT(nbits_h) - 1);
  143. *value = (h << nbits_l) | l;
  144. }
  145. int mtk_hw_set_value(struct mtk_pinctrl *hw, const struct mtk_pin_desc *desc,
  146. int field, int value)
  147. {
  148. struct mtk_pin_field pf;
  149. int err;
  150. err = mtk_hw_pin_field_get(hw, desc, field, &pf);
  151. if (err)
  152. return err;
  153. if (!pf.next)
  154. mtk_rmw(hw, pf.index, pf.offset, pf.mask << pf.bitpos,
  155. (value & pf.mask) << pf.bitpos);
  156. else
  157. mtk_hw_write_cross_field(hw, &pf, value);
  158. return 0;
  159. }
  160. int mtk_hw_get_value(struct mtk_pinctrl *hw, const struct mtk_pin_desc *desc,
  161. int field, int *value)
  162. {
  163. struct mtk_pin_field pf;
  164. int err;
  165. err = mtk_hw_pin_field_get(hw, desc, field, &pf);
  166. if (err)
  167. return err;
  168. if (!pf.next)
  169. *value = (mtk_r32(hw, pf.index, pf.offset)
  170. >> pf.bitpos) & pf.mask;
  171. else
  172. mtk_hw_read_cross_field(hw, &pf, value);
  173. return 0;
  174. }
  175. static int mtk_xt_find_eint_num(struct mtk_pinctrl *hw, unsigned long eint_n)
  176. {
  177. const struct mtk_pin_desc *desc;
  178. int i = 0;
  179. desc = (const struct mtk_pin_desc *)hw->soc->pins;
  180. while (i < hw->soc->npins) {
  181. if (desc[i].eint.eint_n == eint_n)
  182. return desc[i].number;
  183. i++;
  184. }
  185. return EINT_NA;
  186. }
  187. static int mtk_xt_get_gpio_n(void *data, unsigned long eint_n,
  188. unsigned int *gpio_n,
  189. struct gpio_chip **gpio_chip)
  190. {
  191. struct mtk_pinctrl *hw = (struct mtk_pinctrl *)data;
  192. const struct mtk_pin_desc *desc;
  193. desc = (const struct mtk_pin_desc *)hw->soc->pins;
  194. *gpio_chip = &hw->chip;
  195. /* Be greedy to guess first gpio_n is equal to eint_n */
  196. if (desc[eint_n].eint.eint_n == eint_n)
  197. *gpio_n = eint_n;
  198. else
  199. *gpio_n = mtk_xt_find_eint_num(hw, eint_n);
  200. return *gpio_n == EINT_NA ? -EINVAL : 0;
  201. }
  202. static int mtk_xt_get_gpio_state(void *data, unsigned long eint_n)
  203. {
  204. struct mtk_pinctrl *hw = (struct mtk_pinctrl *)data;
  205. const struct mtk_pin_desc *desc;
  206. struct gpio_chip *gpio_chip;
  207. unsigned int gpio_n;
  208. int value, err;
  209. err = mtk_xt_get_gpio_n(hw, eint_n, &gpio_n, &gpio_chip);
  210. if (err)
  211. return err;
  212. desc = (const struct mtk_pin_desc *)&hw->soc->pins[gpio_n];
  213. err = mtk_hw_get_value(hw, desc, PINCTRL_PIN_REG_DI, &value);
  214. if (err)
  215. return err;
  216. return !!value;
  217. }
  218. static int mtk_xt_set_gpio_as_eint(void *data, unsigned long eint_n)
  219. {
  220. struct mtk_pinctrl *hw = (struct mtk_pinctrl *)data;
  221. const struct mtk_pin_desc *desc;
  222. struct gpio_chip *gpio_chip;
  223. unsigned int gpio_n;
  224. int err;
  225. err = mtk_xt_get_gpio_n(hw, eint_n, &gpio_n, &gpio_chip);
  226. if (err)
  227. return err;
  228. desc = (const struct mtk_pin_desc *)&hw->soc->pins[gpio_n];
  229. err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_MODE,
  230. desc->eint.eint_m);
  231. if (err)
  232. return err;
  233. err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_DIR, MTK_INPUT);
  234. if (err)
  235. return err;
  236. err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_SMT, MTK_ENABLE);
  237. if (err)
  238. return err;
  239. return 0;
  240. }
  241. static const struct mtk_eint_xt mtk_eint_xt = {
  242. .get_gpio_n = mtk_xt_get_gpio_n,
  243. .get_gpio_state = mtk_xt_get_gpio_state,
  244. .set_gpio_as_eint = mtk_xt_set_gpio_as_eint,
  245. };
  246. int mtk_build_eint(struct mtk_pinctrl *hw, struct platform_device *pdev)
  247. {
  248. struct device_node *np = pdev->dev.of_node;
  249. struct resource *res;
  250. if (!IS_ENABLED(CONFIG_EINT_MTK))
  251. return 0;
  252. if (!of_property_read_bool(np, "interrupt-controller"))
  253. return -ENODEV;
  254. hw->eint = devm_kzalloc(hw->dev, sizeof(*hw->eint), GFP_KERNEL);
  255. if (!hw->eint)
  256. return -ENOMEM;
  257. res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "eint");
  258. if (!res) {
  259. dev_err(&pdev->dev, "Unable to get eint resource\n");
  260. return -ENODEV;
  261. }
  262. hw->eint->base = devm_ioremap_resource(&pdev->dev, res);
  263. if (IS_ERR(hw->eint->base))
  264. return PTR_ERR(hw->eint->base);
  265. hw->eint->irq = irq_of_parse_and_map(np, 0);
  266. if (!hw->eint->irq)
  267. return -EINVAL;
  268. if (!hw->soc->eint_hw)
  269. return -ENODEV;
  270. hw->eint->dev = &pdev->dev;
  271. hw->eint->hw = hw->soc->eint_hw;
  272. hw->eint->pctl = hw;
  273. hw->eint->gpio_xlate = &mtk_eint_xt;
  274. return mtk_eint_do_init(hw->eint);
  275. }
  276. /* Revision 0 */
  277. int mtk_pinconf_bias_disable_set(struct mtk_pinctrl *hw,
  278. const struct mtk_pin_desc *desc)
  279. {
  280. int err;
  281. err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_PU,
  282. MTK_DISABLE);
  283. if (err)
  284. return err;
  285. err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_PD,
  286. MTK_DISABLE);
  287. if (err)
  288. return err;
  289. return 0;
  290. }
  291. int mtk_pinconf_bias_disable_get(struct mtk_pinctrl *hw,
  292. const struct mtk_pin_desc *desc, int *res)
  293. {
  294. int v, v2;
  295. int err;
  296. err = mtk_hw_get_value(hw, desc, PINCTRL_PIN_REG_PU, &v);
  297. if (err)
  298. return err;
  299. err = mtk_hw_get_value(hw, desc, PINCTRL_PIN_REG_PD, &v2);
  300. if (err)
  301. return err;
  302. if (v == MTK_ENABLE || v2 == MTK_ENABLE)
  303. return -EINVAL;
  304. *res = 1;
  305. return 0;
  306. }
  307. int mtk_pinconf_bias_set(struct mtk_pinctrl *hw,
  308. const struct mtk_pin_desc *desc, bool pullup)
  309. {
  310. int err, arg;
  311. arg = pullup ? 1 : 2;
  312. err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_PU, arg & 1);
  313. if (err)
  314. return err;
  315. err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_PD,
  316. !!(arg & 2));
  317. if (err)
  318. return err;
  319. return 0;
  320. }
  321. int mtk_pinconf_bias_get(struct mtk_pinctrl *hw,
  322. const struct mtk_pin_desc *desc, bool pullup, int *res)
  323. {
  324. int reg, err, v;
  325. reg = pullup ? PINCTRL_PIN_REG_PU : PINCTRL_PIN_REG_PD;
  326. err = mtk_hw_get_value(hw, desc, reg, &v);
  327. if (err)
  328. return err;
  329. if (!v)
  330. return -EINVAL;
  331. *res = 1;
  332. return 0;
  333. }
  334. /* Revision 1 */
  335. int mtk_pinconf_bias_disable_set_rev1(struct mtk_pinctrl *hw,
  336. const struct mtk_pin_desc *desc)
  337. {
  338. int err;
  339. err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_PULLEN,
  340. MTK_DISABLE);
  341. if (err)
  342. return err;
  343. return 0;
  344. }
  345. int mtk_pinconf_bias_disable_get_rev1(struct mtk_pinctrl *hw,
  346. const struct mtk_pin_desc *desc, int *res)
  347. {
  348. int v, err;
  349. err = mtk_hw_get_value(hw, desc, PINCTRL_PIN_REG_PULLEN, &v);
  350. if (err)
  351. return err;
  352. if (v == MTK_ENABLE)
  353. return -EINVAL;
  354. *res = 1;
  355. return 0;
  356. }
  357. int mtk_pinconf_bias_set_rev1(struct mtk_pinctrl *hw,
  358. const struct mtk_pin_desc *desc, bool pullup)
  359. {
  360. int err, arg;
  361. arg = pullup ? MTK_PULLUP : MTK_PULLDOWN;
  362. err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_PULLEN,
  363. MTK_ENABLE);
  364. if (err)
  365. return err;
  366. err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_PULLSEL, arg);
  367. if (err)
  368. return err;
  369. return 0;
  370. }
  371. int mtk_pinconf_bias_get_rev1(struct mtk_pinctrl *hw,
  372. const struct mtk_pin_desc *desc, bool pullup,
  373. int *res)
  374. {
  375. int err, v;
  376. err = mtk_hw_get_value(hw, desc, PINCTRL_PIN_REG_PULLEN, &v);
  377. if (err)
  378. return err;
  379. if (v == MTK_DISABLE)
  380. return -EINVAL;
  381. err = mtk_hw_get_value(hw, desc, PINCTRL_PIN_REG_PULLSEL, &v);
  382. if (err)
  383. return err;
  384. if (pullup ^ (v == MTK_PULLUP))
  385. return -EINVAL;
  386. *res = 1;
  387. return 0;
  388. }
  389. /* Revision 0 */
  390. int mtk_pinconf_drive_set(struct mtk_pinctrl *hw,
  391. const struct mtk_pin_desc *desc, u32 arg)
  392. {
  393. const struct mtk_drive_desc *tb;
  394. int err = -ENOTSUPP;
  395. tb = &mtk_drive[desc->drv_n];
  396. /* 4mA when (e8, e4) = (0, 0)
  397. * 8mA when (e8, e4) = (0, 1)
  398. * 12mA when (e8, e4) = (1, 0)
  399. * 16mA when (e8, e4) = (1, 1)
  400. */
  401. if ((arg >= tb->min && arg <= tb->max) && !(arg % tb->step)) {
  402. arg = (arg / tb->step - 1) * tb->scal;
  403. err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_E4,
  404. arg & 0x1);
  405. if (err)
  406. return err;
  407. err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_E8,
  408. (arg & 0x2) >> 1);
  409. if (err)
  410. return err;
  411. }
  412. return err;
  413. }
  414. int mtk_pinconf_drive_get(struct mtk_pinctrl *hw,
  415. const struct mtk_pin_desc *desc, int *val)
  416. {
  417. const struct mtk_drive_desc *tb;
  418. int err, val1, val2;
  419. tb = &mtk_drive[desc->drv_n];
  420. err = mtk_hw_get_value(hw, desc, PINCTRL_PIN_REG_E4, &val1);
  421. if (err)
  422. return err;
  423. err = mtk_hw_get_value(hw, desc, PINCTRL_PIN_REG_E8, &val2);
  424. if (err)
  425. return err;
  426. /* 4mA when (e8, e4) = (0, 0); 8mA when (e8, e4) = (0, 1)
  427. * 12mA when (e8, e4) = (1, 0); 16mA when (e8, e4) = (1, 1)
  428. */
  429. *val = (((val2 << 1) + val1) / tb->scal + 1) * tb->step;
  430. return 0;
  431. }
  432. /* Revision 1 */
  433. int mtk_pinconf_drive_set_rev1(struct mtk_pinctrl *hw,
  434. const struct mtk_pin_desc *desc, u32 arg)
  435. {
  436. const struct mtk_drive_desc *tb;
  437. int err = -ENOTSUPP;
  438. tb = &mtk_drive[desc->drv_n];
  439. if ((arg >= tb->min && arg <= tb->max) && !(arg % tb->step)) {
  440. arg = (arg / tb->step - 1) * tb->scal;
  441. err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_DRV,
  442. arg);
  443. if (err)
  444. return err;
  445. }
  446. return err;
  447. }
  448. int mtk_pinconf_drive_get_rev1(struct mtk_pinctrl *hw,
  449. const struct mtk_pin_desc *desc, int *val)
  450. {
  451. const struct mtk_drive_desc *tb;
  452. int err, val1;
  453. tb = &mtk_drive[desc->drv_n];
  454. err = mtk_hw_get_value(hw, desc, PINCTRL_PIN_REG_DRV, &val1);
  455. if (err)
  456. return err;
  457. *val = ((val1 & 0x7) / tb->scal + 1) * tb->step;
  458. return 0;
  459. }
  460. int mtk_pinconf_adv_pull_set(struct mtk_pinctrl *hw,
  461. const struct mtk_pin_desc *desc, bool pullup,
  462. u32 arg)
  463. {
  464. int err;
  465. /* 10K off & 50K (75K) off, when (R0, R1) = (0, 0);
  466. * 10K off & 50K (75K) on, when (R0, R1) = (0, 1);
  467. * 10K on & 50K (75K) off, when (R0, R1) = (1, 0);
  468. * 10K on & 50K (75K) on, when (R0, R1) = (1, 1)
  469. */
  470. err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_R0, arg & 1);
  471. if (err)
  472. return 0;
  473. err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_R1,
  474. !!(arg & 2));
  475. if (err)
  476. return 0;
  477. arg = pullup ? 0 : 1;
  478. err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_PUPD, arg);
  479. /* If PUPD register is not supported for that pin, let's fallback to
  480. * general bias control.
  481. */
  482. if (err == -ENOTSUPP) {
  483. if (hw->soc->bias_set) {
  484. err = hw->soc->bias_set(hw, desc, pullup);
  485. if (err)
  486. return err;
  487. } else {
  488. return -ENOTSUPP;
  489. }
  490. }
  491. return err;
  492. }
  493. int mtk_pinconf_adv_pull_get(struct mtk_pinctrl *hw,
  494. const struct mtk_pin_desc *desc, bool pullup,
  495. u32 *val)
  496. {
  497. u32 t, t2;
  498. int err;
  499. err = mtk_hw_get_value(hw, desc, PINCTRL_PIN_REG_PUPD, &t);
  500. /* If PUPD register is not supported for that pin, let's fallback to
  501. * general bias control.
  502. */
  503. if (err == -ENOTSUPP) {
  504. if (hw->soc->bias_get) {
  505. err = hw->soc->bias_get(hw, desc, pullup, val);
  506. if (err)
  507. return err;
  508. } else {
  509. return -ENOTSUPP;
  510. }
  511. } else {
  512. /* t == 0 supposes PULLUP for the customized PULL setup */
  513. if (err)
  514. return err;
  515. if (pullup ^ !t)
  516. return -EINVAL;
  517. }
  518. err = mtk_hw_get_value(hw, desc, PINCTRL_PIN_REG_R0, &t);
  519. if (err)
  520. return err;
  521. err = mtk_hw_get_value(hw, desc, PINCTRL_PIN_REG_R1, &t2);
  522. if (err)
  523. return err;
  524. *val = (t | t2 << 1) & 0x7;
  525. return 0;
  526. }