pinctrl-tangier.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Intel Tangier pinctrl driver
  4. *
  5. * Copyright (C) 2016, 2023 Intel Corporation
  6. *
  7. * Authors: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
  8. * Raag Jadav <raag.jadav@intel.com>
  9. */
  10. #include <linux/bits.h>
  11. #include <linux/cleanup.h>
  12. #include <linux/device.h>
  13. #include <linux/err.h>
  14. #include <linux/errno.h>
  15. #include <linux/export.h>
  16. #include <linux/io.h>
  17. #include <linux/module.h>
  18. #include <linux/overflow.h>
  19. #include <linux/platform_device.h>
  20. #include <linux/property.h>
  21. #include <linux/seq_file.h>
  22. #include <linux/spinlock.h>
  23. #include <linux/types.h>
  24. #include <linux/pinctrl/pinconf-generic.h>
  25. #include <linux/pinctrl/pinconf.h>
  26. #include <linux/pinctrl/pinctrl.h>
  27. #include <linux/pinctrl/pinmux.h>
  28. #include "../core.h"
  29. #include "pinctrl-intel.h"
  30. #include "pinctrl-tangier.h"
  31. #define SLEW_OFFSET 0x000
  32. #define BUFCFG_OFFSET 0x100
  33. #define MISC_OFFSET 0x300
  34. #define BUFCFG_PINMODE_SHIFT 0
  35. #define BUFCFG_PINMODE_MASK GENMASK(2, 0)
  36. #define BUFCFG_PINMODE_GPIO 0
  37. #define BUFCFG_PUPD_VAL_SHIFT 4
  38. #define BUFCFG_PUPD_VAL_MASK GENMASK(5, 4)
  39. #define BUFCFG_PUPD_VAL_2K 0
  40. #define BUFCFG_PUPD_VAL_20K 1
  41. #define BUFCFG_PUPD_VAL_50K 2
  42. #define BUFCFG_PUPD_VAL_910 3
  43. #define BUFCFG_PU_EN BIT(8)
  44. #define BUFCFG_PD_EN BIT(9)
  45. #define BUFCFG_Px_EN_MASK GENMASK(9, 8)
  46. #define BUFCFG_SLEWSEL BIT(10)
  47. #define BUFCFG_OVINEN BIT(12)
  48. #define BUFCFG_OVINEN_EN BIT(13)
  49. #define BUFCFG_OVINEN_MASK GENMASK(13, 12)
  50. #define BUFCFG_OVOUTEN BIT(14)
  51. #define BUFCFG_OVOUTEN_EN BIT(15)
  52. #define BUFCFG_OVOUTEN_MASK GENMASK(15, 14)
  53. #define BUFCFG_INDATAOV_VAL BIT(16)
  54. #define BUFCFG_INDATAOV_EN BIT(17)
  55. #define BUFCFG_INDATAOV_MASK GENMASK(17, 16)
  56. #define BUFCFG_OUTDATAOV_VAL BIT(18)
  57. #define BUFCFG_OUTDATAOV_EN BIT(19)
  58. #define BUFCFG_OUTDATAOV_MASK GENMASK(19, 18)
  59. #define BUFCFG_OD_EN BIT(21)
  60. #define pin_to_bufno(f, p) ((p) - (f)->pin_base)
  61. static const struct tng_family *tng_get_family(struct tng_pinctrl *tp,
  62. unsigned int pin)
  63. {
  64. const struct tng_family *family;
  65. unsigned int i;
  66. for (i = 0; i < tp->nfamilies; i++) {
  67. family = &tp->families[i];
  68. if (pin >= family->pin_base &&
  69. pin < family->pin_base + family->npins)
  70. return family;
  71. }
  72. dev_warn(tp->dev, "failed to find family for pin %u\n", pin);
  73. return NULL;
  74. }
  75. static bool tng_buf_available(struct tng_pinctrl *tp, unsigned int pin)
  76. {
  77. const struct tng_family *family;
  78. family = tng_get_family(tp, pin);
  79. if (!family)
  80. return false;
  81. return !family->protected;
  82. }
  83. static void __iomem *tng_get_bufcfg(struct tng_pinctrl *tp, unsigned int pin)
  84. {
  85. const struct tng_family *family;
  86. unsigned int bufno;
  87. family = tng_get_family(tp, pin);
  88. if (!family)
  89. return NULL;
  90. bufno = pin_to_bufno(family, pin);
  91. return family->regs + BUFCFG_OFFSET + bufno * 4;
  92. }
  93. static int tng_read_bufcfg(struct tng_pinctrl *tp, unsigned int pin, u32 *value)
  94. {
  95. void __iomem *bufcfg;
  96. if (!tng_buf_available(tp, pin))
  97. return -EBUSY;
  98. bufcfg = tng_get_bufcfg(tp, pin);
  99. *value = readl(bufcfg);
  100. return 0;
  101. }
  102. static void tng_update_bufcfg(struct tng_pinctrl *tp, unsigned int pin,
  103. u32 bits, u32 mask)
  104. {
  105. void __iomem *bufcfg;
  106. u32 value;
  107. bufcfg = tng_get_bufcfg(tp, pin);
  108. value = readl(bufcfg);
  109. value = (value & ~mask) | (bits & mask);
  110. writel(value, bufcfg);
  111. }
  112. static int tng_get_groups_count(struct pinctrl_dev *pctldev)
  113. {
  114. struct tng_pinctrl *tp = pinctrl_dev_get_drvdata(pctldev);
  115. return tp->ngroups;
  116. }
  117. static const char *tng_get_group_name(struct pinctrl_dev *pctldev,
  118. unsigned int group)
  119. {
  120. struct tng_pinctrl *tp = pinctrl_dev_get_drvdata(pctldev);
  121. return tp->groups[group].grp.name;
  122. }
  123. static int tng_get_group_pins(struct pinctrl_dev *pctldev, unsigned int group,
  124. const unsigned int **pins, unsigned int *npins)
  125. {
  126. struct tng_pinctrl *tp = pinctrl_dev_get_drvdata(pctldev);
  127. *pins = tp->groups[group].grp.pins;
  128. *npins = tp->groups[group].grp.npins;
  129. return 0;
  130. }
  131. static void tng_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s,
  132. unsigned int pin)
  133. {
  134. struct tng_pinctrl *tp = pinctrl_dev_get_drvdata(pctldev);
  135. u32 value, mode;
  136. int ret;
  137. ret = tng_read_bufcfg(tp, pin, &value);
  138. if (ret) {
  139. seq_puts(s, "not available");
  140. return;
  141. }
  142. mode = (value & BUFCFG_PINMODE_MASK) >> BUFCFG_PINMODE_SHIFT;
  143. if (mode == BUFCFG_PINMODE_GPIO)
  144. seq_puts(s, "GPIO ");
  145. else
  146. seq_printf(s, "mode %d ", mode);
  147. seq_printf(s, "0x%08x", value);
  148. }
  149. static const struct pinctrl_ops tng_pinctrl_ops = {
  150. .get_groups_count = tng_get_groups_count,
  151. .get_group_name = tng_get_group_name,
  152. .get_group_pins = tng_get_group_pins,
  153. .pin_dbg_show = tng_pin_dbg_show,
  154. };
  155. static int tng_get_functions_count(struct pinctrl_dev *pctldev)
  156. {
  157. struct tng_pinctrl *tp = pinctrl_dev_get_drvdata(pctldev);
  158. return tp->nfunctions;
  159. }
  160. static const char *tng_get_function_name(struct pinctrl_dev *pctldev,
  161. unsigned int function)
  162. {
  163. struct tng_pinctrl *tp = pinctrl_dev_get_drvdata(pctldev);
  164. return tp->functions[function].func.name;
  165. }
  166. static int tng_get_function_groups(struct pinctrl_dev *pctldev,
  167. unsigned int function,
  168. const char * const **groups,
  169. unsigned int * const ngroups)
  170. {
  171. struct tng_pinctrl *tp = pinctrl_dev_get_drvdata(pctldev);
  172. *groups = tp->functions[function].func.groups;
  173. *ngroups = tp->functions[function].func.ngroups;
  174. return 0;
  175. }
  176. static int tng_pinmux_set_mux(struct pinctrl_dev *pctldev,
  177. unsigned int function,
  178. unsigned int group)
  179. {
  180. struct tng_pinctrl *tp = pinctrl_dev_get_drvdata(pctldev);
  181. const struct intel_pingroup *grp = &tp->groups[group];
  182. u32 bits = grp->mode << BUFCFG_PINMODE_SHIFT;
  183. u32 mask = BUFCFG_PINMODE_MASK;
  184. unsigned int i;
  185. /*
  186. * All pins in the groups needs to be accessible and writable
  187. * before we can enable the mux for this group.
  188. */
  189. for (i = 0; i < grp->grp.npins; i++) {
  190. if (!tng_buf_available(tp, grp->grp.pins[i]))
  191. return -EBUSY;
  192. }
  193. guard(raw_spinlock_irqsave)(&tp->lock);
  194. /* Now enable the mux setting for each pin in the group */
  195. for (i = 0; i < grp->grp.npins; i++)
  196. tng_update_bufcfg(tp, grp->grp.pins[i], bits, mask);
  197. return 0;
  198. }
  199. static int tng_gpio_request_enable(struct pinctrl_dev *pctldev,
  200. struct pinctrl_gpio_range *range,
  201. unsigned int pin)
  202. {
  203. struct tng_pinctrl *tp = pinctrl_dev_get_drvdata(pctldev);
  204. u32 bits = BUFCFG_PINMODE_GPIO << BUFCFG_PINMODE_SHIFT;
  205. u32 mask = BUFCFG_PINMODE_MASK;
  206. if (!tng_buf_available(tp, pin))
  207. return -EBUSY;
  208. guard(raw_spinlock_irqsave)(&tp->lock);
  209. tng_update_bufcfg(tp, pin, bits, mask);
  210. return 0;
  211. }
  212. static const struct pinmux_ops tng_pinmux_ops = {
  213. .get_functions_count = tng_get_functions_count,
  214. .get_function_name = tng_get_function_name,
  215. .get_function_groups = tng_get_function_groups,
  216. .set_mux = tng_pinmux_set_mux,
  217. .gpio_request_enable = tng_gpio_request_enable,
  218. };
  219. static int tng_config_get(struct pinctrl_dev *pctldev, unsigned int pin,
  220. unsigned long *config)
  221. {
  222. struct tng_pinctrl *tp = pinctrl_dev_get_drvdata(pctldev);
  223. enum pin_config_param param = pinconf_to_config_param(*config);
  224. u32 value, term;
  225. u16 arg = 0;
  226. int ret;
  227. ret = tng_read_bufcfg(tp, pin, &value);
  228. if (ret)
  229. return -ENOTSUPP;
  230. term = (value & BUFCFG_PUPD_VAL_MASK) >> BUFCFG_PUPD_VAL_SHIFT;
  231. switch (param) {
  232. case PIN_CONFIG_BIAS_DISABLE:
  233. if (value & BUFCFG_Px_EN_MASK)
  234. return -EINVAL;
  235. break;
  236. case PIN_CONFIG_BIAS_PULL_UP:
  237. if ((value & BUFCFG_Px_EN_MASK) != BUFCFG_PU_EN)
  238. return -EINVAL;
  239. switch (term) {
  240. case BUFCFG_PUPD_VAL_910:
  241. arg = 910;
  242. break;
  243. case BUFCFG_PUPD_VAL_2K:
  244. arg = 2000;
  245. break;
  246. case BUFCFG_PUPD_VAL_20K:
  247. arg = 20000;
  248. break;
  249. case BUFCFG_PUPD_VAL_50K:
  250. arg = 50000;
  251. break;
  252. }
  253. break;
  254. case PIN_CONFIG_BIAS_PULL_DOWN:
  255. if ((value & BUFCFG_Px_EN_MASK) != BUFCFG_PD_EN)
  256. return -EINVAL;
  257. switch (term) {
  258. case BUFCFG_PUPD_VAL_910:
  259. arg = 910;
  260. break;
  261. case BUFCFG_PUPD_VAL_2K:
  262. arg = 2000;
  263. break;
  264. case BUFCFG_PUPD_VAL_20K:
  265. arg = 20000;
  266. break;
  267. case BUFCFG_PUPD_VAL_50K:
  268. arg = 50000;
  269. break;
  270. }
  271. break;
  272. case PIN_CONFIG_DRIVE_PUSH_PULL:
  273. if (value & BUFCFG_OD_EN)
  274. return -EINVAL;
  275. break;
  276. case PIN_CONFIG_DRIVE_OPEN_DRAIN:
  277. if (!(value & BUFCFG_OD_EN))
  278. return -EINVAL;
  279. break;
  280. case PIN_CONFIG_SLEW_RATE:
  281. if (value & BUFCFG_SLEWSEL)
  282. arg = 1;
  283. break;
  284. default:
  285. return -ENOTSUPP;
  286. }
  287. *config = pinconf_to_config_packed(param, arg);
  288. return 0;
  289. }
  290. static int tng_config_set_pin(struct tng_pinctrl *tp, unsigned int pin,
  291. unsigned long config)
  292. {
  293. unsigned int param = pinconf_to_config_param(config);
  294. unsigned int arg = pinconf_to_config_argument(config);
  295. u32 mask, term, value = 0;
  296. switch (param) {
  297. case PIN_CONFIG_BIAS_DISABLE:
  298. mask = BUFCFG_Px_EN_MASK | BUFCFG_PUPD_VAL_MASK;
  299. break;
  300. case PIN_CONFIG_BIAS_PULL_UP:
  301. switch (arg) {
  302. case 50000:
  303. term = BUFCFG_PUPD_VAL_50K;
  304. break;
  305. case 1: /* Set default strength value in case none is given */
  306. case 20000:
  307. term = BUFCFG_PUPD_VAL_20K;
  308. break;
  309. case 2000:
  310. term = BUFCFG_PUPD_VAL_2K;
  311. break;
  312. case 910:
  313. term = BUFCFG_PUPD_VAL_910;
  314. break;
  315. default:
  316. return -EINVAL;
  317. }
  318. mask = BUFCFG_Px_EN_MASK | BUFCFG_PUPD_VAL_MASK;
  319. value = BUFCFG_PU_EN | (term << BUFCFG_PUPD_VAL_SHIFT);
  320. break;
  321. case PIN_CONFIG_BIAS_PULL_DOWN:
  322. switch (arg) {
  323. case 50000:
  324. term = BUFCFG_PUPD_VAL_50K;
  325. break;
  326. case 1: /* Set default strength value in case none is given */
  327. case 20000:
  328. term = BUFCFG_PUPD_VAL_20K;
  329. break;
  330. case 2000:
  331. term = BUFCFG_PUPD_VAL_2K;
  332. break;
  333. case 910:
  334. term = BUFCFG_PUPD_VAL_910;
  335. break;
  336. default:
  337. return -EINVAL;
  338. }
  339. mask = BUFCFG_Px_EN_MASK | BUFCFG_PUPD_VAL_MASK;
  340. value = BUFCFG_PD_EN | (term << BUFCFG_PUPD_VAL_SHIFT);
  341. break;
  342. case PIN_CONFIG_DRIVE_PUSH_PULL:
  343. mask = BUFCFG_OD_EN;
  344. break;
  345. case PIN_CONFIG_DRIVE_OPEN_DRAIN:
  346. mask = BUFCFG_OD_EN;
  347. value = BUFCFG_OD_EN;
  348. break;
  349. case PIN_CONFIG_SLEW_RATE:
  350. mask = BUFCFG_SLEWSEL;
  351. if (arg)
  352. value = BUFCFG_SLEWSEL;
  353. break;
  354. default:
  355. return -EINVAL;
  356. }
  357. guard(raw_spinlock_irqsave)(&tp->lock);
  358. tng_update_bufcfg(tp, pin, value, mask);
  359. return 0;
  360. }
  361. static int tng_config_set(struct pinctrl_dev *pctldev, unsigned int pin,
  362. unsigned long *configs, unsigned int nconfigs)
  363. {
  364. struct tng_pinctrl *tp = pinctrl_dev_get_drvdata(pctldev);
  365. unsigned int i;
  366. int ret;
  367. if (!tng_buf_available(tp, pin))
  368. return -ENOTSUPP;
  369. for (i = 0; i < nconfigs; i++) {
  370. switch (pinconf_to_config_param(configs[i])) {
  371. case PIN_CONFIG_BIAS_DISABLE:
  372. case PIN_CONFIG_BIAS_PULL_UP:
  373. case PIN_CONFIG_BIAS_PULL_DOWN:
  374. case PIN_CONFIG_DRIVE_PUSH_PULL:
  375. case PIN_CONFIG_DRIVE_OPEN_DRAIN:
  376. case PIN_CONFIG_SLEW_RATE:
  377. ret = tng_config_set_pin(tp, pin, configs[i]);
  378. if (ret)
  379. return ret;
  380. break;
  381. default:
  382. return -ENOTSUPP;
  383. }
  384. }
  385. return 0;
  386. }
  387. static int tng_config_group_get(struct pinctrl_dev *pctldev,
  388. unsigned int group, unsigned long *config)
  389. {
  390. const unsigned int *pins;
  391. unsigned int npins;
  392. int ret;
  393. ret = tng_get_group_pins(pctldev, group, &pins, &npins);
  394. if (ret)
  395. return ret;
  396. return tng_config_get(pctldev, pins[0], config);
  397. }
  398. static int tng_config_group_set(struct pinctrl_dev *pctldev,
  399. unsigned int group, unsigned long *configs,
  400. unsigned int num_configs)
  401. {
  402. const unsigned int *pins;
  403. unsigned int npins;
  404. int i, ret;
  405. ret = tng_get_group_pins(pctldev, group, &pins, &npins);
  406. if (ret)
  407. return ret;
  408. for (i = 0; i < npins; i++) {
  409. ret = tng_config_set(pctldev, pins[i], configs, num_configs);
  410. if (ret)
  411. return ret;
  412. }
  413. return 0;
  414. }
  415. static const struct pinconf_ops tng_pinconf_ops = {
  416. .is_generic = true,
  417. .pin_config_get = tng_config_get,
  418. .pin_config_set = tng_config_set,
  419. .pin_config_group_get = tng_config_group_get,
  420. .pin_config_group_set = tng_config_group_set,
  421. };
  422. static const struct pinctrl_desc tng_pinctrl_desc = {
  423. .pctlops = &tng_pinctrl_ops,
  424. .pmxops = &tng_pinmux_ops,
  425. .confops = &tng_pinconf_ops,
  426. .owner = THIS_MODULE,
  427. };
  428. static int tng_pinctrl_probe(struct platform_device *pdev,
  429. const struct tng_pinctrl *data)
  430. {
  431. struct device *dev = &pdev->dev;
  432. struct tng_family *families;
  433. struct tng_pinctrl *tp;
  434. size_t families_len;
  435. void __iomem *regs;
  436. unsigned int i;
  437. tp = devm_kmemdup(dev, data, sizeof(*data), GFP_KERNEL);
  438. if (!tp)
  439. return -ENOMEM;
  440. tp->dev = dev;
  441. raw_spin_lock_init(&tp->lock);
  442. regs = devm_platform_ioremap_resource(pdev, 0);
  443. if (IS_ERR(regs))
  444. return PTR_ERR(regs);
  445. /*
  446. * Make a copy of the families which we can use to hold pointers
  447. * to the registers.
  448. */
  449. families_len = size_mul(sizeof(*families), tp->nfamilies);
  450. families = devm_kmemdup(dev, tp->families, families_len, GFP_KERNEL);
  451. if (!families)
  452. return -ENOMEM;
  453. /* Splice memory resource by chunk per family */
  454. for (i = 0; i < tp->nfamilies; i++) {
  455. struct tng_family *family = &families[i];
  456. family->regs = regs + family->barno * TNG_FAMILY_LEN;
  457. }
  458. tp->families = families;
  459. tp->pctldesc = tng_pinctrl_desc;
  460. tp->pctldesc.name = dev_name(dev);
  461. tp->pctldesc.pins = tp->pins;
  462. tp->pctldesc.npins = tp->npins;
  463. tp->pctldev = devm_pinctrl_register(dev, &tp->pctldesc, tp);
  464. if (IS_ERR(tp->pctldev))
  465. return dev_err_probe(dev, PTR_ERR(tp->pctldev),
  466. "failed to register pinctrl driver\n");
  467. return 0;
  468. }
  469. int devm_tng_pinctrl_probe(struct platform_device *pdev)
  470. {
  471. const struct tng_pinctrl *data;
  472. data = device_get_match_data(&pdev->dev);
  473. if (!data)
  474. return -ENODATA;
  475. return tng_pinctrl_probe(pdev, data);
  476. }
  477. EXPORT_SYMBOL_NS_GPL(devm_tng_pinctrl_probe, PINCTRL_TANGIER);
  478. MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");
  479. MODULE_AUTHOR("Raag Jadav <raag.jadav@intel.com>");
  480. MODULE_DESCRIPTION("Intel Tangier pinctrl driver");
  481. MODULE_LICENSE("GPL");