pinctrl-tegra.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Driver for the NVIDIA Tegra pinmux
  4. *
  5. * Copyright (c) 2011-2012, NVIDIA CORPORATION. All rights reserved.
  6. *
  7. * Derived from code:
  8. * Copyright (C) 2010 Google, Inc.
  9. * Copyright (C) 2010 NVIDIA Corporation
  10. * Copyright (C) 2009-2011 ST-Ericsson AB
  11. */
  12. #include <linux/err.h>
  13. #include <linux/init.h>
  14. #include <linux/io.h>
  15. #include <linux/of.h>
  16. #include <linux/platform_device.h>
  17. #include <linux/seq_file.h>
  18. #include <linux/slab.h>
  19. #include <linux/pinctrl/machine.h>
  20. #include <linux/pinctrl/pinconf.h>
  21. #include <linux/pinctrl/pinctrl.h>
  22. #include <linux/pinctrl/pinmux.h>
  23. #include "../core.h"
  24. #include "../pinctrl-utils.h"
  25. #include "pinctrl-tegra.h"
  26. static inline u32 pmx_readl(struct tegra_pmx *pmx, u32 bank, u32 reg)
  27. {
  28. return readl(pmx->regs[bank] + reg);
  29. }
  30. static inline void pmx_writel(struct tegra_pmx *pmx, u32 val, u32 bank, u32 reg)
  31. {
  32. writel_relaxed(val, pmx->regs[bank] + reg);
  33. /* make sure pinmux register write completed */
  34. pmx_readl(pmx, bank, reg);
  35. }
  36. static int tegra_pinctrl_get_groups_count(struct pinctrl_dev *pctldev)
  37. {
  38. struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
  39. return pmx->soc->ngroups;
  40. }
  41. static const char *tegra_pinctrl_get_group_name(struct pinctrl_dev *pctldev,
  42. unsigned group)
  43. {
  44. struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
  45. return pmx->soc->groups[group].name;
  46. }
  47. static int tegra_pinctrl_get_group_pins(struct pinctrl_dev *pctldev,
  48. unsigned group,
  49. const unsigned **pins,
  50. unsigned *num_pins)
  51. {
  52. struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
  53. *pins = pmx->soc->groups[group].pins;
  54. *num_pins = pmx->soc->groups[group].npins;
  55. return 0;
  56. }
  57. #ifdef CONFIG_DEBUG_FS
  58. static void tegra_pinctrl_pin_dbg_show(struct pinctrl_dev *pctldev,
  59. struct seq_file *s,
  60. unsigned offset)
  61. {
  62. seq_printf(s, " %s", dev_name(pctldev->dev));
  63. }
  64. #endif
  65. static const struct cfg_param {
  66. const char *property;
  67. enum tegra_pinconf_param param;
  68. } cfg_params[] = {
  69. {"nvidia,pull", TEGRA_PINCONF_PARAM_PULL},
  70. {"nvidia,tristate", TEGRA_PINCONF_PARAM_TRISTATE},
  71. {"nvidia,enable-input", TEGRA_PINCONF_PARAM_ENABLE_INPUT},
  72. {"nvidia,open-drain", TEGRA_PINCONF_PARAM_OPEN_DRAIN},
  73. {"nvidia,lock", TEGRA_PINCONF_PARAM_LOCK},
  74. {"nvidia,io-reset", TEGRA_PINCONF_PARAM_IORESET},
  75. {"nvidia,rcv-sel", TEGRA_PINCONF_PARAM_RCV_SEL},
  76. {"nvidia,io-hv", TEGRA_PINCONF_PARAM_RCV_SEL},
  77. {"nvidia,high-speed-mode", TEGRA_PINCONF_PARAM_HIGH_SPEED_MODE},
  78. {"nvidia,schmitt", TEGRA_PINCONF_PARAM_SCHMITT},
  79. {"nvidia,low-power-mode", TEGRA_PINCONF_PARAM_LOW_POWER_MODE},
  80. {"nvidia,pull-down-strength", TEGRA_PINCONF_PARAM_DRIVE_DOWN_STRENGTH},
  81. {"nvidia,pull-up-strength", TEGRA_PINCONF_PARAM_DRIVE_UP_STRENGTH},
  82. {"nvidia,slew-rate-falling", TEGRA_PINCONF_PARAM_SLEW_RATE_FALLING},
  83. {"nvidia,slew-rate-rising", TEGRA_PINCONF_PARAM_SLEW_RATE_RISING},
  84. {"nvidia,drive-type", TEGRA_PINCONF_PARAM_DRIVE_TYPE},
  85. };
  86. static int tegra_pinctrl_dt_subnode_to_map(struct pinctrl_dev *pctldev,
  87. struct device_node *np,
  88. struct pinctrl_map **map,
  89. unsigned *reserved_maps,
  90. unsigned *num_maps)
  91. {
  92. struct device *dev = pctldev->dev;
  93. int ret, i;
  94. const char *function;
  95. u32 val;
  96. unsigned long config;
  97. unsigned long *configs = NULL;
  98. unsigned num_configs = 0;
  99. unsigned reserve;
  100. struct property *prop;
  101. const char *group;
  102. ret = of_property_read_string(np, "nvidia,function", &function);
  103. if (ret < 0) {
  104. /* EINVAL=missing, which is fine since it's optional */
  105. if (ret != -EINVAL)
  106. dev_err(dev,
  107. "%pOF: could not parse property nvidia,function\n", np);
  108. function = NULL;
  109. }
  110. for (i = 0; i < ARRAY_SIZE(cfg_params); i++) {
  111. ret = of_property_read_u32(np, cfg_params[i].property, &val);
  112. if (!ret) {
  113. config = TEGRA_PINCONF_PACK(cfg_params[i].param, val);
  114. ret = pinctrl_utils_add_config(pctldev, &configs,
  115. &num_configs, config);
  116. if (ret < 0)
  117. goto exit;
  118. /* EINVAL=missing, which is fine since it's optional */
  119. } else if (ret != -EINVAL) {
  120. dev_err(dev, "%pOF: could not parse property %s\n",
  121. np, cfg_params[i].property);
  122. }
  123. }
  124. reserve = 0;
  125. if (function != NULL)
  126. reserve++;
  127. if (num_configs)
  128. reserve++;
  129. ret = of_property_count_strings(np, "nvidia,pins");
  130. if (ret < 0) {
  131. dev_err(dev, "%pOF: could not parse property nvidia,pins\n", np);
  132. goto exit;
  133. }
  134. reserve *= ret;
  135. ret = pinctrl_utils_reserve_map(pctldev, map, reserved_maps,
  136. num_maps, reserve);
  137. if (ret < 0)
  138. goto exit;
  139. of_property_for_each_string(np, "nvidia,pins", prop, group) {
  140. if (function) {
  141. ret = pinctrl_utils_add_map_mux(pctldev, map,
  142. reserved_maps, num_maps, group,
  143. function);
  144. if (ret < 0)
  145. goto exit;
  146. }
  147. if (num_configs) {
  148. ret = pinctrl_utils_add_map_configs(pctldev, map,
  149. reserved_maps, num_maps, group,
  150. configs, num_configs,
  151. PIN_MAP_TYPE_CONFIGS_GROUP);
  152. if (ret < 0)
  153. goto exit;
  154. }
  155. }
  156. ret = 0;
  157. exit:
  158. kfree(configs);
  159. return ret;
  160. }
  161. static int tegra_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev,
  162. struct device_node *np_config,
  163. struct pinctrl_map **map,
  164. unsigned *num_maps)
  165. {
  166. unsigned reserved_maps;
  167. int ret;
  168. reserved_maps = 0;
  169. *map = NULL;
  170. *num_maps = 0;
  171. for_each_child_of_node_scoped(np_config, np) {
  172. ret = tegra_pinctrl_dt_subnode_to_map(pctldev, np, map,
  173. &reserved_maps, num_maps);
  174. if (ret < 0) {
  175. pinctrl_utils_free_map(pctldev, *map,
  176. *num_maps);
  177. return ret;
  178. }
  179. }
  180. return 0;
  181. }
  182. static const struct pinctrl_ops tegra_pinctrl_ops = {
  183. .get_groups_count = tegra_pinctrl_get_groups_count,
  184. .get_group_name = tegra_pinctrl_get_group_name,
  185. .get_group_pins = tegra_pinctrl_get_group_pins,
  186. #ifdef CONFIG_DEBUG_FS
  187. .pin_dbg_show = tegra_pinctrl_pin_dbg_show,
  188. #endif
  189. .dt_node_to_map = tegra_pinctrl_dt_node_to_map,
  190. .dt_free_map = pinctrl_utils_free_map,
  191. };
  192. static int tegra_pinctrl_get_funcs_count(struct pinctrl_dev *pctldev)
  193. {
  194. struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
  195. return pmx->soc->nfunctions;
  196. }
  197. static const char *tegra_pinctrl_get_func_name(struct pinctrl_dev *pctldev,
  198. unsigned function)
  199. {
  200. struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
  201. return pmx->functions[function].name;
  202. }
  203. static int tegra_pinctrl_get_func_groups(struct pinctrl_dev *pctldev,
  204. unsigned function,
  205. const char * const **groups,
  206. unsigned * const num_groups)
  207. {
  208. struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
  209. *groups = pmx->functions[function].groups;
  210. *num_groups = pmx->functions[function].ngroups;
  211. return 0;
  212. }
  213. static int tegra_pinctrl_set_mux(struct pinctrl_dev *pctldev,
  214. unsigned function,
  215. unsigned group)
  216. {
  217. struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
  218. const struct tegra_pingroup *g;
  219. int i;
  220. u32 val;
  221. g = &pmx->soc->groups[group];
  222. if (WARN_ON(g->mux_reg < 0))
  223. return -EINVAL;
  224. for (i = 0; i < ARRAY_SIZE(g->funcs); i++) {
  225. if (g->funcs[i] == function)
  226. break;
  227. }
  228. if (WARN_ON(i == ARRAY_SIZE(g->funcs)))
  229. return -EINVAL;
  230. val = pmx_readl(pmx, g->mux_bank, g->mux_reg);
  231. val &= ~(0x3 << g->mux_bit);
  232. val |= i << g->mux_bit;
  233. /* Set the SFIO/GPIO selection to SFIO when under pinmux control*/
  234. if (pmx->soc->sfsel_in_mux)
  235. val |= (1 << g->sfsel_bit);
  236. pmx_writel(pmx, val, g->mux_bank, g->mux_reg);
  237. return 0;
  238. }
  239. static int tegra_pinctrl_get_group_index(struct pinctrl_dev *pctldev,
  240. unsigned int offset)
  241. {
  242. struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
  243. unsigned int group, num_pins, j;
  244. const unsigned int *pins;
  245. int ret;
  246. for (group = 0; group < pmx->soc->ngroups; ++group) {
  247. ret = tegra_pinctrl_get_group_pins(pctldev, group, &pins, &num_pins);
  248. if (ret < 0)
  249. continue;
  250. for (j = 0; j < num_pins; j++) {
  251. if (offset == pins[j])
  252. return group;
  253. }
  254. }
  255. return -EINVAL;
  256. }
  257. static const struct tegra_pingroup *tegra_pinctrl_get_group(struct pinctrl_dev *pctldev,
  258. unsigned int offset,
  259. int group_index)
  260. {
  261. struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
  262. if (group_index < 0 || group_index >= pmx->soc->ngroups)
  263. return NULL;
  264. return &pmx->soc->groups[group_index];
  265. }
  266. static struct tegra_pingroup_config *tegra_pinctrl_get_group_config(struct pinctrl_dev *pctldev,
  267. unsigned int offset,
  268. int group_index)
  269. {
  270. struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
  271. if (group_index < 0)
  272. return NULL;
  273. return &pmx->pingroup_configs[group_index];
  274. }
  275. static int tegra_pinctrl_gpio_request_enable(struct pinctrl_dev *pctldev,
  276. struct pinctrl_gpio_range *range,
  277. unsigned int offset)
  278. {
  279. struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
  280. const struct tegra_pingroup *group;
  281. struct tegra_pingroup_config *config;
  282. int group_index;
  283. u32 value;
  284. if (!pmx->soc->sfsel_in_mux)
  285. return 0;
  286. group_index = tegra_pinctrl_get_group_index(pctldev, offset);
  287. group = tegra_pinctrl_get_group(pctldev, offset, group_index);
  288. if (!group)
  289. return -EINVAL;
  290. if (group->mux_reg < 0 || group->sfsel_bit < 0)
  291. return -EINVAL;
  292. config = tegra_pinctrl_get_group_config(pctldev, offset, group_index);
  293. if (!config)
  294. return -EINVAL;
  295. value = pmx_readl(pmx, group->mux_bank, group->mux_reg);
  296. config->is_sfsel = (value & BIT(group->sfsel_bit)) != 0;
  297. value &= ~BIT(group->sfsel_bit);
  298. pmx_writel(pmx, value, group->mux_bank, group->mux_reg);
  299. return 0;
  300. }
  301. static void tegra_pinctrl_gpio_disable_free(struct pinctrl_dev *pctldev,
  302. struct pinctrl_gpio_range *range,
  303. unsigned int offset)
  304. {
  305. struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
  306. const struct tegra_pingroup *group;
  307. struct tegra_pingroup_config *config;
  308. int group_index;
  309. u32 value;
  310. if (!pmx->soc->sfsel_in_mux)
  311. return;
  312. group_index = tegra_pinctrl_get_group_index(pctldev, offset);
  313. group = tegra_pinctrl_get_group(pctldev, offset, group_index);
  314. if (!group)
  315. return;
  316. if (group->mux_reg < 0 || group->sfsel_bit < 0)
  317. return;
  318. config = tegra_pinctrl_get_group_config(pctldev, offset, group_index);
  319. if (!config)
  320. return;
  321. value = pmx_readl(pmx, group->mux_bank, group->mux_reg);
  322. if (config->is_sfsel)
  323. value |= BIT(group->sfsel_bit);
  324. pmx_writel(pmx, value, group->mux_bank, group->mux_reg);
  325. }
  326. static const struct pinmux_ops tegra_pinmux_ops = {
  327. .get_functions_count = tegra_pinctrl_get_funcs_count,
  328. .get_function_name = tegra_pinctrl_get_func_name,
  329. .get_function_groups = tegra_pinctrl_get_func_groups,
  330. .set_mux = tegra_pinctrl_set_mux,
  331. .gpio_request_enable = tegra_pinctrl_gpio_request_enable,
  332. .gpio_disable_free = tegra_pinctrl_gpio_disable_free,
  333. };
  334. static int tegra_pinconf_reg(struct tegra_pmx *pmx,
  335. const struct tegra_pingroup *g,
  336. enum tegra_pinconf_param param,
  337. bool report_err,
  338. s8 *bank, s32 *reg, s8 *bit, s8 *width)
  339. {
  340. switch (param) {
  341. case TEGRA_PINCONF_PARAM_PULL:
  342. *bank = g->pupd_bank;
  343. *reg = g->pupd_reg;
  344. *bit = g->pupd_bit;
  345. *width = 2;
  346. break;
  347. case TEGRA_PINCONF_PARAM_TRISTATE:
  348. *bank = g->tri_bank;
  349. *reg = g->tri_reg;
  350. *bit = g->tri_bit;
  351. *width = 1;
  352. break;
  353. case TEGRA_PINCONF_PARAM_ENABLE_INPUT:
  354. *bank = g->mux_bank;
  355. *reg = g->mux_reg;
  356. *bit = g->einput_bit;
  357. *width = 1;
  358. break;
  359. case TEGRA_PINCONF_PARAM_OPEN_DRAIN:
  360. *bank = g->mux_bank;
  361. *reg = g->mux_reg;
  362. *bit = g->odrain_bit;
  363. *width = 1;
  364. break;
  365. case TEGRA_PINCONF_PARAM_LOCK:
  366. *bank = g->mux_bank;
  367. *reg = g->mux_reg;
  368. *bit = g->lock_bit;
  369. *width = 1;
  370. break;
  371. case TEGRA_PINCONF_PARAM_IORESET:
  372. *bank = g->mux_bank;
  373. *reg = g->mux_reg;
  374. *bit = g->ioreset_bit;
  375. *width = 1;
  376. break;
  377. case TEGRA_PINCONF_PARAM_RCV_SEL:
  378. *bank = g->mux_bank;
  379. *reg = g->mux_reg;
  380. *bit = g->rcv_sel_bit;
  381. *width = 1;
  382. break;
  383. case TEGRA_PINCONF_PARAM_HIGH_SPEED_MODE:
  384. if (pmx->soc->hsm_in_mux) {
  385. *bank = g->mux_bank;
  386. *reg = g->mux_reg;
  387. } else {
  388. *bank = g->drv_bank;
  389. *reg = g->drv_reg;
  390. }
  391. *bit = g->hsm_bit;
  392. *width = 1;
  393. break;
  394. case TEGRA_PINCONF_PARAM_SCHMITT:
  395. if (pmx->soc->schmitt_in_mux) {
  396. *bank = g->mux_bank;
  397. *reg = g->mux_reg;
  398. } else {
  399. *bank = g->drv_bank;
  400. *reg = g->drv_reg;
  401. }
  402. *bit = g->schmitt_bit;
  403. *width = 1;
  404. break;
  405. case TEGRA_PINCONF_PARAM_LOW_POWER_MODE:
  406. *bank = g->drv_bank;
  407. *reg = g->drv_reg;
  408. *bit = g->lpmd_bit;
  409. *width = 2;
  410. break;
  411. case TEGRA_PINCONF_PARAM_DRIVE_DOWN_STRENGTH:
  412. *bank = g->drv_bank;
  413. *reg = g->drv_reg;
  414. *bit = g->drvdn_bit;
  415. *width = g->drvdn_width;
  416. break;
  417. case TEGRA_PINCONF_PARAM_DRIVE_UP_STRENGTH:
  418. *bank = g->drv_bank;
  419. *reg = g->drv_reg;
  420. *bit = g->drvup_bit;
  421. *width = g->drvup_width;
  422. break;
  423. case TEGRA_PINCONF_PARAM_SLEW_RATE_FALLING:
  424. *bank = g->drv_bank;
  425. *reg = g->drv_reg;
  426. *bit = g->slwf_bit;
  427. *width = g->slwf_width;
  428. break;
  429. case TEGRA_PINCONF_PARAM_SLEW_RATE_RISING:
  430. *bank = g->drv_bank;
  431. *reg = g->drv_reg;
  432. *bit = g->slwr_bit;
  433. *width = g->slwr_width;
  434. break;
  435. case TEGRA_PINCONF_PARAM_DRIVE_TYPE:
  436. if (pmx->soc->drvtype_in_mux) {
  437. *bank = g->mux_bank;
  438. *reg = g->mux_reg;
  439. } else {
  440. *bank = g->drv_bank;
  441. *reg = g->drv_reg;
  442. }
  443. *bit = g->drvtype_bit;
  444. *width = 2;
  445. break;
  446. default:
  447. dev_err(pmx->dev, "Invalid config param %04x\n", param);
  448. return -ENOTSUPP;
  449. }
  450. if (*reg < 0 || *bit < 0) {
  451. if (report_err) {
  452. const char *prop = "unknown";
  453. int i;
  454. for (i = 0; i < ARRAY_SIZE(cfg_params); i++) {
  455. if (cfg_params[i].param == param) {
  456. prop = cfg_params[i].property;
  457. break;
  458. }
  459. }
  460. dev_err(pmx->dev,
  461. "Config param %04x (%s) not supported on group %s\n",
  462. param, prop, g->name);
  463. }
  464. return -ENOTSUPP;
  465. }
  466. return 0;
  467. }
  468. static int tegra_pinconf_get(struct pinctrl_dev *pctldev,
  469. unsigned pin, unsigned long *config)
  470. {
  471. dev_err(pctldev->dev, "pin_config_get op not supported\n");
  472. return -ENOTSUPP;
  473. }
  474. static int tegra_pinconf_set(struct pinctrl_dev *pctldev,
  475. unsigned pin, unsigned long *configs,
  476. unsigned num_configs)
  477. {
  478. dev_err(pctldev->dev, "pin_config_set op not supported\n");
  479. return -ENOTSUPP;
  480. }
  481. static int tegra_pinconf_group_get(struct pinctrl_dev *pctldev,
  482. unsigned group, unsigned long *config)
  483. {
  484. struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
  485. enum tegra_pinconf_param param = TEGRA_PINCONF_UNPACK_PARAM(*config);
  486. u16 arg;
  487. const struct tegra_pingroup *g;
  488. int ret;
  489. s8 bank, bit, width;
  490. s32 reg;
  491. u32 val, mask;
  492. g = &pmx->soc->groups[group];
  493. ret = tegra_pinconf_reg(pmx, g, param, true, &bank, &reg, &bit,
  494. &width);
  495. if (ret < 0)
  496. return ret;
  497. val = pmx_readl(pmx, bank, reg);
  498. mask = (1 << width) - 1;
  499. arg = (val >> bit) & mask;
  500. *config = TEGRA_PINCONF_PACK(param, arg);
  501. return 0;
  502. }
  503. static int tegra_pinconf_group_set(struct pinctrl_dev *pctldev,
  504. unsigned group, unsigned long *configs,
  505. unsigned num_configs)
  506. {
  507. struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
  508. enum tegra_pinconf_param param;
  509. u16 arg;
  510. const struct tegra_pingroup *g;
  511. int ret, i;
  512. s8 bank, bit, width;
  513. s32 reg;
  514. u32 val, mask;
  515. g = &pmx->soc->groups[group];
  516. for (i = 0; i < num_configs; i++) {
  517. param = TEGRA_PINCONF_UNPACK_PARAM(configs[i]);
  518. arg = TEGRA_PINCONF_UNPACK_ARG(configs[i]);
  519. ret = tegra_pinconf_reg(pmx, g, param, true, &bank, &reg, &bit,
  520. &width);
  521. if (ret < 0)
  522. return ret;
  523. val = pmx_readl(pmx, bank, reg);
  524. /* LOCK can't be cleared */
  525. if (param == TEGRA_PINCONF_PARAM_LOCK) {
  526. if ((val & BIT(bit)) && !arg) {
  527. dev_err(pctldev->dev, "LOCK bit cannot be cleared\n");
  528. return -EINVAL;
  529. }
  530. }
  531. /* Special-case Boolean values; allow any non-zero as true */
  532. if (width == 1)
  533. arg = !!arg;
  534. /* Range-check user-supplied value */
  535. mask = (1 << width) - 1;
  536. if (arg & ~mask) {
  537. dev_err(pctldev->dev,
  538. "config %lx: %x too big for %d bit register\n",
  539. configs[i], arg, width);
  540. return -EINVAL;
  541. }
  542. /* Update register */
  543. val &= ~(mask << bit);
  544. val |= arg << bit;
  545. pmx_writel(pmx, val, bank, reg);
  546. } /* for each config */
  547. return 0;
  548. }
  549. #ifdef CONFIG_DEBUG_FS
  550. static void tegra_pinconf_dbg_show(struct pinctrl_dev *pctldev,
  551. struct seq_file *s, unsigned offset)
  552. {
  553. }
  554. static const char *strip_prefix(const char *s)
  555. {
  556. const char *comma = strchr(s, ',');
  557. if (!comma)
  558. return s;
  559. return comma + 1;
  560. }
  561. static void tegra_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
  562. struct seq_file *s, unsigned group)
  563. {
  564. struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
  565. const struct tegra_pingroup *g;
  566. int i, ret;
  567. s8 bank, bit, width;
  568. s32 reg;
  569. u32 val;
  570. g = &pmx->soc->groups[group];
  571. for (i = 0; i < ARRAY_SIZE(cfg_params); i++) {
  572. ret = tegra_pinconf_reg(pmx, g, cfg_params[i].param, false,
  573. &bank, &reg, &bit, &width);
  574. if (ret < 0)
  575. continue;
  576. val = pmx_readl(pmx, bank, reg);
  577. val >>= bit;
  578. val &= (1 << width) - 1;
  579. seq_printf(s, "\n\t%s=%u",
  580. strip_prefix(cfg_params[i].property), val);
  581. }
  582. if (g->mux_reg >= 0) {
  583. /* read pinmux function and dump to seq_file */
  584. val = pmx_readl(pmx, g->mux_bank, g->mux_reg);
  585. val = g->funcs[(val >> g->mux_bit) & 0x3];
  586. seq_printf(s, "\n\tfunction=%s", pmx->functions[val].name);
  587. }
  588. }
  589. static void tegra_pinconf_config_dbg_show(struct pinctrl_dev *pctldev,
  590. struct seq_file *s,
  591. unsigned long config)
  592. {
  593. enum tegra_pinconf_param param = TEGRA_PINCONF_UNPACK_PARAM(config);
  594. u16 arg = TEGRA_PINCONF_UNPACK_ARG(config);
  595. const char *pname = "unknown";
  596. int i;
  597. for (i = 0; i < ARRAY_SIZE(cfg_params); i++) {
  598. if (cfg_params[i].param == param) {
  599. pname = cfg_params[i].property;
  600. break;
  601. }
  602. }
  603. seq_printf(s, "%s=%d", strip_prefix(pname), arg);
  604. }
  605. #endif
  606. static const struct pinconf_ops tegra_pinconf_ops = {
  607. .pin_config_get = tegra_pinconf_get,
  608. .pin_config_set = tegra_pinconf_set,
  609. .pin_config_group_get = tegra_pinconf_group_get,
  610. .pin_config_group_set = tegra_pinconf_group_set,
  611. #ifdef CONFIG_DEBUG_FS
  612. .pin_config_dbg_show = tegra_pinconf_dbg_show,
  613. .pin_config_group_dbg_show = tegra_pinconf_group_dbg_show,
  614. .pin_config_config_dbg_show = tegra_pinconf_config_dbg_show,
  615. #endif
  616. };
  617. static void tegra_pinctrl_clear_parked_bits(struct tegra_pmx *pmx)
  618. {
  619. int i = 0;
  620. const struct tegra_pingroup *g;
  621. u32 val;
  622. for (i = 0; i < pmx->soc->ngroups; ++i) {
  623. g = &pmx->soc->groups[i];
  624. if (g->parked_bitmask > 0) {
  625. unsigned int bank, reg;
  626. if (g->mux_reg != -1) {
  627. bank = g->mux_bank;
  628. reg = g->mux_reg;
  629. } else {
  630. bank = g->drv_bank;
  631. reg = g->drv_reg;
  632. }
  633. val = pmx_readl(pmx, bank, reg);
  634. val &= ~g->parked_bitmask;
  635. pmx_writel(pmx, val, bank, reg);
  636. }
  637. }
  638. }
  639. static size_t tegra_pinctrl_get_bank_size(struct device *dev,
  640. unsigned int bank_id)
  641. {
  642. struct platform_device *pdev = to_platform_device(dev);
  643. struct resource *res;
  644. res = platform_get_resource(pdev, IORESOURCE_MEM, bank_id);
  645. return resource_size(res) / 4;
  646. }
  647. static int tegra_pinctrl_suspend(struct device *dev)
  648. {
  649. struct tegra_pmx *pmx = dev_get_drvdata(dev);
  650. u32 *backup_regs = pmx->backup_regs;
  651. u32 __iomem *regs;
  652. size_t bank_size;
  653. unsigned int i, k;
  654. for (i = 0; i < pmx->nbanks; i++) {
  655. bank_size = tegra_pinctrl_get_bank_size(dev, i);
  656. regs = pmx->regs[i];
  657. for (k = 0; k < bank_size; k++)
  658. *backup_regs++ = readl_relaxed(regs++);
  659. }
  660. return pinctrl_force_sleep(pmx->pctl);
  661. }
  662. static int tegra_pinctrl_resume(struct device *dev)
  663. {
  664. struct tegra_pmx *pmx = dev_get_drvdata(dev);
  665. u32 *backup_regs = pmx->backup_regs;
  666. u32 __iomem *regs;
  667. size_t bank_size;
  668. unsigned int i, k;
  669. for (i = 0; i < pmx->nbanks; i++) {
  670. bank_size = tegra_pinctrl_get_bank_size(dev, i);
  671. regs = pmx->regs[i];
  672. for (k = 0; k < bank_size; k++)
  673. writel_relaxed(*backup_regs++, regs++);
  674. }
  675. /* flush all the prior writes */
  676. readl_relaxed(pmx->regs[0]);
  677. /* wait for pinctrl register read to complete */
  678. rmb();
  679. return 0;
  680. }
  681. DEFINE_NOIRQ_DEV_PM_OPS(tegra_pinctrl_pm, tegra_pinctrl_suspend, tegra_pinctrl_resume);
  682. static bool tegra_pinctrl_gpio_node_has_range(struct tegra_pmx *pmx)
  683. {
  684. struct device_node *np;
  685. bool has_prop = false;
  686. np = of_find_compatible_node(NULL, NULL, pmx->soc->gpio_compatible);
  687. if (!np)
  688. return has_prop;
  689. has_prop = of_find_property(np, "gpio-ranges", NULL);
  690. of_node_put(np);
  691. return has_prop;
  692. }
  693. int tegra_pinctrl_probe(struct platform_device *pdev,
  694. const struct tegra_pinctrl_soc_data *soc_data)
  695. {
  696. struct tegra_pmx *pmx;
  697. struct resource *res;
  698. int i;
  699. const char **group_pins;
  700. int fn, gn, gfn;
  701. unsigned long backup_regs_size = 0;
  702. pmx = devm_kzalloc(&pdev->dev, sizeof(*pmx), GFP_KERNEL);
  703. if (!pmx)
  704. return -ENOMEM;
  705. pmx->dev = &pdev->dev;
  706. pmx->soc = soc_data;
  707. pmx->pingroup_configs = devm_kcalloc(&pdev->dev,
  708. pmx->soc->ngroups, sizeof(*pmx->pingroup_configs),
  709. GFP_KERNEL);
  710. if (!pmx->pingroup_configs)
  711. return -ENOMEM;
  712. /*
  713. * Each mux group will appear in 4 functions' list of groups.
  714. * This over-allocates slightly, since not all groups are mux groups.
  715. */
  716. pmx->group_pins = devm_kcalloc(&pdev->dev, pmx->soc->ngroups * 4,
  717. sizeof(*pmx->group_pins), GFP_KERNEL);
  718. if (!pmx->group_pins)
  719. return -ENOMEM;
  720. pmx->functions = devm_kcalloc(&pdev->dev, pmx->soc->nfunctions,
  721. sizeof(*pmx->functions), GFP_KERNEL);
  722. if (!pmx->functions)
  723. return -ENOMEM;
  724. group_pins = pmx->group_pins;
  725. for (fn = 0; fn < pmx->soc->nfunctions; fn++) {
  726. struct tegra_function *func = &pmx->functions[fn];
  727. func->name = pmx->soc->functions[fn];
  728. func->groups = group_pins;
  729. for (gn = 0; gn < pmx->soc->ngroups; gn++) {
  730. const struct tegra_pingroup *g = &pmx->soc->groups[gn];
  731. if (g->mux_reg == -1)
  732. continue;
  733. for (gfn = 0; gfn < 4; gfn++)
  734. if (g->funcs[gfn] == fn)
  735. break;
  736. if (gfn == 4)
  737. continue;
  738. BUG_ON(group_pins - pmx->group_pins >=
  739. pmx->soc->ngroups * 4);
  740. *group_pins++ = g->name;
  741. func->ngroups++;
  742. }
  743. }
  744. pmx->gpio_range.name = "Tegra GPIOs";
  745. pmx->gpio_range.id = 0;
  746. pmx->gpio_range.base = 0;
  747. pmx->gpio_range.npins = pmx->soc->ngpios;
  748. pmx->desc.pctlops = &tegra_pinctrl_ops;
  749. pmx->desc.pmxops = &tegra_pinmux_ops;
  750. pmx->desc.confops = &tegra_pinconf_ops;
  751. pmx->desc.owner = THIS_MODULE;
  752. pmx->desc.name = dev_name(&pdev->dev);
  753. pmx->desc.pins = pmx->soc->pins;
  754. pmx->desc.npins = pmx->soc->npins;
  755. for (i = 0; ; i++) {
  756. res = platform_get_resource(pdev, IORESOURCE_MEM, i);
  757. if (!res)
  758. break;
  759. backup_regs_size += resource_size(res);
  760. }
  761. pmx->nbanks = i;
  762. pmx->regs = devm_kcalloc(&pdev->dev, pmx->nbanks, sizeof(*pmx->regs),
  763. GFP_KERNEL);
  764. if (!pmx->regs)
  765. return -ENOMEM;
  766. pmx->backup_regs = devm_kzalloc(&pdev->dev, backup_regs_size,
  767. GFP_KERNEL);
  768. if (!pmx->backup_regs)
  769. return -ENOMEM;
  770. for (i = 0; i < pmx->nbanks; i++) {
  771. pmx->regs[i] = devm_platform_ioremap_resource(pdev, i);
  772. if (IS_ERR(pmx->regs[i]))
  773. return PTR_ERR(pmx->regs[i]);
  774. }
  775. pmx->pctl = devm_pinctrl_register(&pdev->dev, &pmx->desc, pmx);
  776. if (IS_ERR(pmx->pctl)) {
  777. dev_err(&pdev->dev, "Couldn't register pinctrl driver\n");
  778. return PTR_ERR(pmx->pctl);
  779. }
  780. tegra_pinctrl_clear_parked_bits(pmx);
  781. if (pmx->soc->ngpios > 0 && !tegra_pinctrl_gpio_node_has_range(pmx))
  782. pinctrl_add_gpio_range(pmx->pctl, &pmx->gpio_range);
  783. platform_set_drvdata(pdev, pmx);
  784. dev_dbg(&pdev->dev, "Probed Tegra pinctrl driver\n");
  785. return 0;
  786. }