pinctrl-paris.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * MediaTek Pinctrl Paris Driver, which implement the vendor per-pin
  4. * bindings for MediaTek SoC.
  5. *
  6. * Copyright (C) 2018 MediaTek Inc.
  7. * Author: Sean Wang <sean.wang@mediatek.com>
  8. * Zhiyong Tao <zhiyong.tao@mediatek.com>
  9. * Hongzhou.Yang <hongzhou.yang@mediatek.com>
  10. */
  11. #include <linux/gpio/driver.h>
  12. #include <dt-bindings/pinctrl/mt65xx.h>
  13. #include "pinctrl-paris.h"
  14. #define PINCTRL_PINCTRL_DEV KBUILD_MODNAME
  15. /* Custom pinconf parameters */
  16. #define MTK_PIN_CONFIG_TDSEL (PIN_CONFIG_END + 1)
  17. #define MTK_PIN_CONFIG_RDSEL (PIN_CONFIG_END + 2)
  18. #define MTK_PIN_CONFIG_PU_ADV (PIN_CONFIG_END + 3)
  19. #define MTK_PIN_CONFIG_PD_ADV (PIN_CONFIG_END + 4)
  20. static const struct pinconf_generic_params mtk_custom_bindings[] = {
  21. {"mediatek,tdsel", MTK_PIN_CONFIG_TDSEL, 0},
  22. {"mediatek,rdsel", MTK_PIN_CONFIG_RDSEL, 0},
  23. {"mediatek,pull-up-adv", MTK_PIN_CONFIG_PU_ADV, 1},
  24. {"mediatek,pull-down-adv", MTK_PIN_CONFIG_PD_ADV, 1},
  25. };
  26. #ifdef CONFIG_DEBUG_FS
  27. static const struct pin_config_item mtk_conf_items[] = {
  28. PCONFDUMP(MTK_PIN_CONFIG_TDSEL, "tdsel", NULL, true),
  29. PCONFDUMP(MTK_PIN_CONFIG_RDSEL, "rdsel", NULL, true),
  30. PCONFDUMP(MTK_PIN_CONFIG_PU_ADV, "pu-adv", NULL, true),
  31. PCONFDUMP(MTK_PIN_CONFIG_PD_ADV, "pd-adv", NULL, true),
  32. };
  33. #endif
  34. static const char * const mtk_gpio_functions[] = {
  35. "func0", "func1", "func2", "func3",
  36. "func4", "func5", "func6", "func7",
  37. "func8", "func9", "func10", "func11",
  38. "func12", "func13", "func14", "func15",
  39. };
  40. static int mtk_pinmux_gpio_request_enable(struct pinctrl_dev *pctldev,
  41. struct pinctrl_gpio_range *range,
  42. unsigned int pin)
  43. {
  44. struct mtk_pinctrl *hw = pinctrl_dev_get_drvdata(pctldev);
  45. const struct mtk_pin_desc *desc;
  46. desc = (const struct mtk_pin_desc *)&hw->soc->pins[pin];
  47. return mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_MODE,
  48. hw->soc->gpio_m);
  49. }
  50. static int mtk_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev,
  51. struct pinctrl_gpio_range *range,
  52. unsigned int pin, bool input)
  53. {
  54. struct mtk_pinctrl *hw = pinctrl_dev_get_drvdata(pctldev);
  55. const struct mtk_pin_desc *desc;
  56. desc = (const struct mtk_pin_desc *)&hw->soc->pins[pin];
  57. /* hardware would take 0 as input direction */
  58. return mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_DIR, !input);
  59. }
  60. static int mtk_pinconf_get(struct pinctrl_dev *pctldev,
  61. unsigned int pin, unsigned long *config)
  62. {
  63. struct mtk_pinctrl *hw = pinctrl_dev_get_drvdata(pctldev);
  64. u32 param = pinconf_to_config_param(*config);
  65. int val, val2, err, reg, ret = 1;
  66. const struct mtk_pin_desc *desc;
  67. desc = (const struct mtk_pin_desc *)&hw->soc->pins[pin];
  68. switch (param) {
  69. case PIN_CONFIG_BIAS_DISABLE:
  70. if (hw->soc->bias_disable_get) {
  71. err = hw->soc->bias_disable_get(hw, desc, &ret);
  72. if (err)
  73. return err;
  74. } else {
  75. return -ENOTSUPP;
  76. }
  77. break;
  78. case PIN_CONFIG_BIAS_PULL_UP:
  79. if (hw->soc->bias_get) {
  80. err = hw->soc->bias_get(hw, desc, 1, &ret);
  81. if (err)
  82. return err;
  83. } else {
  84. return -ENOTSUPP;
  85. }
  86. break;
  87. case PIN_CONFIG_BIAS_PULL_DOWN:
  88. if (hw->soc->bias_get) {
  89. err = hw->soc->bias_get(hw, desc, 0, &ret);
  90. if (err)
  91. return err;
  92. } else {
  93. return -ENOTSUPP;
  94. }
  95. break;
  96. case PIN_CONFIG_SLEW_RATE:
  97. err = mtk_hw_get_value(hw, desc, PINCTRL_PIN_REG_SR, &val);
  98. if (err)
  99. return err;
  100. if (!val)
  101. return -EINVAL;
  102. break;
  103. case PIN_CONFIG_INPUT_ENABLE:
  104. case PIN_CONFIG_OUTPUT_ENABLE:
  105. err = mtk_hw_get_value(hw, desc, PINCTRL_PIN_REG_DIR, &val);
  106. if (err)
  107. return err;
  108. /* HW takes input mode as zero; output mode as non-zero */
  109. if ((val && param == PIN_CONFIG_INPUT_ENABLE) ||
  110. (!val && param == PIN_CONFIG_OUTPUT_ENABLE))
  111. return -EINVAL;
  112. break;
  113. case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
  114. err = mtk_hw_get_value(hw, desc, PINCTRL_PIN_REG_DIR, &val);
  115. if (err)
  116. return err;
  117. err = mtk_hw_get_value(hw, desc, PINCTRL_PIN_REG_SMT, &val2);
  118. if (err)
  119. return err;
  120. if (val || !val2)
  121. return -EINVAL;
  122. break;
  123. case PIN_CONFIG_DRIVE_STRENGTH:
  124. if (hw->soc->drive_get) {
  125. err = hw->soc->drive_get(hw, desc, &ret);
  126. if (err)
  127. return err;
  128. } else {
  129. err = -ENOTSUPP;
  130. }
  131. break;
  132. case MTK_PIN_CONFIG_TDSEL:
  133. case MTK_PIN_CONFIG_RDSEL:
  134. reg = (param == MTK_PIN_CONFIG_TDSEL) ?
  135. PINCTRL_PIN_REG_TDSEL : PINCTRL_PIN_REG_RDSEL;
  136. err = mtk_hw_get_value(hw, desc, reg, &val);
  137. if (err)
  138. return err;
  139. ret = val;
  140. break;
  141. case MTK_PIN_CONFIG_PU_ADV:
  142. case MTK_PIN_CONFIG_PD_ADV:
  143. if (hw->soc->adv_pull_get) {
  144. bool pullup;
  145. pullup = param == MTK_PIN_CONFIG_PU_ADV;
  146. err = hw->soc->adv_pull_get(hw, desc, pullup, &ret);
  147. if (err)
  148. return err;
  149. } else {
  150. return -ENOTSUPP;
  151. }
  152. break;
  153. default:
  154. return -ENOTSUPP;
  155. }
  156. *config = pinconf_to_config_packed(param, ret);
  157. return 0;
  158. }
  159. static int mtk_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
  160. enum pin_config_param param,
  161. enum pin_config_param arg)
  162. {
  163. struct mtk_pinctrl *hw = pinctrl_dev_get_drvdata(pctldev);
  164. const struct mtk_pin_desc *desc;
  165. int err = 0;
  166. u32 reg;
  167. desc = (const struct mtk_pin_desc *)&hw->soc->pins[pin];
  168. switch ((u32)param) {
  169. case PIN_CONFIG_BIAS_DISABLE:
  170. if (hw->soc->bias_disable_set) {
  171. err = hw->soc->bias_disable_set(hw, desc);
  172. if (err)
  173. return err;
  174. } else {
  175. return -ENOTSUPP;
  176. }
  177. break;
  178. case PIN_CONFIG_BIAS_PULL_UP:
  179. if (hw->soc->bias_set) {
  180. err = hw->soc->bias_set(hw, desc, 1);
  181. if (err)
  182. return err;
  183. } else {
  184. return -ENOTSUPP;
  185. }
  186. break;
  187. case PIN_CONFIG_BIAS_PULL_DOWN:
  188. if (hw->soc->bias_set) {
  189. err = hw->soc->bias_set(hw, desc, 0);
  190. if (err)
  191. return err;
  192. } else {
  193. return -ENOTSUPP;
  194. }
  195. break;
  196. case PIN_CONFIG_OUTPUT_ENABLE:
  197. err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_SMT,
  198. MTK_DISABLE);
  199. if (err)
  200. goto err;
  201. err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_DIR,
  202. MTK_OUTPUT);
  203. if (err)
  204. goto err;
  205. break;
  206. case PIN_CONFIG_INPUT_ENABLE:
  207. if (hw->soc->ies_present) {
  208. mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_IES,
  209. MTK_ENABLE);
  210. }
  211. err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_DIR,
  212. MTK_INPUT);
  213. if (err)
  214. goto err;
  215. break;
  216. case PIN_CONFIG_SLEW_RATE:
  217. err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_SR,
  218. arg);
  219. if (err)
  220. goto err;
  221. break;
  222. case PIN_CONFIG_OUTPUT:
  223. err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_DIR,
  224. MTK_OUTPUT);
  225. if (err)
  226. goto err;
  227. err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_DO,
  228. arg);
  229. if (err)
  230. goto err;
  231. break;
  232. case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
  233. /* arg = 1: Input mode & SMT enable ;
  234. * arg = 0: Output mode & SMT disable
  235. */
  236. arg = arg ? 2 : 1;
  237. err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_DIR,
  238. arg & 1);
  239. if (err)
  240. goto err;
  241. err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_SMT,
  242. !!(arg & 2));
  243. if (err)
  244. goto err;
  245. break;
  246. case PIN_CONFIG_DRIVE_STRENGTH:
  247. if (hw->soc->drive_set) {
  248. err = hw->soc->drive_set(hw, desc, arg);
  249. if (err)
  250. return err;
  251. } else {
  252. return -ENOTSUPP;
  253. }
  254. break;
  255. case MTK_PIN_CONFIG_TDSEL:
  256. case MTK_PIN_CONFIG_RDSEL:
  257. reg = (param == MTK_PIN_CONFIG_TDSEL) ?
  258. PINCTRL_PIN_REG_TDSEL : PINCTRL_PIN_REG_RDSEL;
  259. err = mtk_hw_set_value(hw, desc, reg, arg);
  260. if (err)
  261. goto err;
  262. break;
  263. case MTK_PIN_CONFIG_PU_ADV:
  264. case MTK_PIN_CONFIG_PD_ADV:
  265. if (hw->soc->adv_pull_set) {
  266. bool pullup;
  267. pullup = param == MTK_PIN_CONFIG_PU_ADV;
  268. err = hw->soc->adv_pull_set(hw, desc, pullup,
  269. arg);
  270. if (err)
  271. return err;
  272. } else {
  273. return -ENOTSUPP;
  274. }
  275. break;
  276. default:
  277. err = -ENOTSUPP;
  278. }
  279. err:
  280. return err;
  281. }
  282. static struct mtk_pinctrl_group *
  283. mtk_pctrl_find_group_by_pin(struct mtk_pinctrl *hw, u32 pin)
  284. {
  285. int i;
  286. for (i = 0; i < hw->soc->ngrps; i++) {
  287. struct mtk_pinctrl_group *grp = hw->groups + i;
  288. if (grp->pin == pin)
  289. return grp;
  290. }
  291. return NULL;
  292. }
  293. static const struct mtk_func_desc *
  294. mtk_pctrl_find_function_by_pin(struct mtk_pinctrl *hw, u32 pin_num, u32 fnum)
  295. {
  296. const struct mtk_pin_desc *pin = hw->soc->pins + pin_num;
  297. const struct mtk_func_desc *func = pin->funcs;
  298. while (func && func->name) {
  299. if (func->muxval == fnum)
  300. return func;
  301. func++;
  302. }
  303. return NULL;
  304. }
  305. static bool mtk_pctrl_is_function_valid(struct mtk_pinctrl *hw, u32 pin_num,
  306. u32 fnum)
  307. {
  308. int i;
  309. for (i = 0; i < hw->soc->npins; i++) {
  310. const struct mtk_pin_desc *pin = hw->soc->pins + i;
  311. if (pin->number == pin_num) {
  312. const struct mtk_func_desc *func = pin->funcs;
  313. while (func && func->name) {
  314. if (func->muxval == fnum)
  315. return true;
  316. func++;
  317. }
  318. break;
  319. }
  320. }
  321. return false;
  322. }
  323. static int mtk_pctrl_dt_node_to_map_func(struct mtk_pinctrl *pctl,
  324. u32 pin, u32 fnum,
  325. struct mtk_pinctrl_group *grp,
  326. struct pinctrl_map **map,
  327. unsigned *reserved_maps,
  328. unsigned *num_maps)
  329. {
  330. bool ret;
  331. if (*num_maps == *reserved_maps)
  332. return -ENOSPC;
  333. (*map)[*num_maps].type = PIN_MAP_TYPE_MUX_GROUP;
  334. (*map)[*num_maps].data.mux.group = grp->name;
  335. ret = mtk_pctrl_is_function_valid(pctl, pin, fnum);
  336. if (!ret) {
  337. dev_err(pctl->dev, "invalid function %d on pin %d .\n",
  338. fnum, pin);
  339. return -EINVAL;
  340. }
  341. (*map)[*num_maps].data.mux.function = mtk_gpio_functions[fnum];
  342. (*num_maps)++;
  343. return 0;
  344. }
  345. static int mtk_pctrl_dt_subnode_to_map(struct pinctrl_dev *pctldev,
  346. struct device_node *node,
  347. struct pinctrl_map **map,
  348. unsigned *reserved_maps,
  349. unsigned *num_maps)
  350. {
  351. struct mtk_pinctrl *hw = pinctrl_dev_get_drvdata(pctldev);
  352. int num_pins, num_funcs, maps_per_pin, i, err;
  353. struct mtk_pinctrl_group *grp;
  354. unsigned int num_configs;
  355. bool has_config = false;
  356. unsigned long *configs;
  357. u32 pinfunc, pin, func;
  358. struct property *pins;
  359. unsigned reserve = 0;
  360. pins = of_find_property(node, "pinmux", NULL);
  361. if (!pins) {
  362. dev_err(hw->dev, "missing pins property in node %s .\n",
  363. node->name);
  364. return -EINVAL;
  365. }
  366. err = pinconf_generic_parse_dt_config(node, pctldev, &configs,
  367. &num_configs);
  368. if (err)
  369. return err;
  370. if (num_configs)
  371. has_config = true;
  372. num_pins = pins->length / sizeof(u32);
  373. num_funcs = num_pins;
  374. maps_per_pin = 0;
  375. if (num_funcs)
  376. maps_per_pin++;
  377. if (has_config && num_pins >= 1)
  378. maps_per_pin++;
  379. if (!num_pins || !maps_per_pin) {
  380. err = -EINVAL;
  381. goto exit;
  382. }
  383. reserve = num_pins * maps_per_pin;
  384. err = pinctrl_utils_reserve_map(pctldev, map, reserved_maps, num_maps,
  385. reserve);
  386. if (err < 0)
  387. goto exit;
  388. for (i = 0; i < num_pins; i++) {
  389. err = of_property_read_u32_index(node, "pinmux", i, &pinfunc);
  390. if (err)
  391. goto exit;
  392. pin = MTK_GET_PIN_NO(pinfunc);
  393. func = MTK_GET_PIN_FUNC(pinfunc);
  394. if (pin >= hw->soc->npins ||
  395. func >= ARRAY_SIZE(mtk_gpio_functions)) {
  396. dev_err(hw->dev, "invalid pins value.\n");
  397. err = -EINVAL;
  398. goto exit;
  399. }
  400. grp = mtk_pctrl_find_group_by_pin(hw, pin);
  401. if (!grp) {
  402. dev_err(hw->dev, "unable to match pin %d to group\n",
  403. pin);
  404. err = -EINVAL;
  405. goto exit;
  406. }
  407. err = mtk_pctrl_dt_node_to_map_func(hw, pin, func, grp, map,
  408. reserved_maps, num_maps);
  409. if (err < 0)
  410. goto exit;
  411. if (has_config) {
  412. err = pinctrl_utils_add_map_configs(pctldev, map,
  413. reserved_maps,
  414. num_maps,
  415. grp->name,
  416. configs,
  417. num_configs,
  418. PIN_MAP_TYPE_CONFIGS_GROUP);
  419. if (err < 0)
  420. goto exit;
  421. }
  422. }
  423. err = 0;
  424. exit:
  425. kfree(configs);
  426. return err;
  427. }
  428. static int mtk_pctrl_dt_node_to_map(struct pinctrl_dev *pctldev,
  429. struct device_node *np_config,
  430. struct pinctrl_map **map,
  431. unsigned *num_maps)
  432. {
  433. struct device_node *np;
  434. unsigned reserved_maps;
  435. int ret;
  436. *map = NULL;
  437. *num_maps = 0;
  438. reserved_maps = 0;
  439. for_each_child_of_node(np_config, np) {
  440. ret = mtk_pctrl_dt_subnode_to_map(pctldev, np, map,
  441. &reserved_maps,
  442. num_maps);
  443. if (ret < 0) {
  444. pinctrl_utils_free_map(pctldev, *map, *num_maps);
  445. of_node_put(np);
  446. return ret;
  447. }
  448. }
  449. return 0;
  450. }
  451. static int mtk_pctrl_get_groups_count(struct pinctrl_dev *pctldev)
  452. {
  453. struct mtk_pinctrl *hw = pinctrl_dev_get_drvdata(pctldev);
  454. return hw->soc->ngrps;
  455. }
  456. static const char *mtk_pctrl_get_group_name(struct pinctrl_dev *pctldev,
  457. unsigned group)
  458. {
  459. struct mtk_pinctrl *hw = pinctrl_dev_get_drvdata(pctldev);
  460. return hw->groups[group].name;
  461. }
  462. static int mtk_pctrl_get_group_pins(struct pinctrl_dev *pctldev,
  463. unsigned group, const unsigned **pins,
  464. unsigned *num_pins)
  465. {
  466. struct mtk_pinctrl *hw = pinctrl_dev_get_drvdata(pctldev);
  467. *pins = (unsigned *)&hw->groups[group].pin;
  468. *num_pins = 1;
  469. return 0;
  470. }
  471. static const struct pinctrl_ops mtk_pctlops = {
  472. .dt_node_to_map = mtk_pctrl_dt_node_to_map,
  473. .dt_free_map = pinctrl_utils_free_map,
  474. .get_groups_count = mtk_pctrl_get_groups_count,
  475. .get_group_name = mtk_pctrl_get_group_name,
  476. .get_group_pins = mtk_pctrl_get_group_pins,
  477. };
  478. static int mtk_pmx_get_funcs_cnt(struct pinctrl_dev *pctldev)
  479. {
  480. return ARRAY_SIZE(mtk_gpio_functions);
  481. }
  482. static const char *mtk_pmx_get_func_name(struct pinctrl_dev *pctldev,
  483. unsigned selector)
  484. {
  485. return mtk_gpio_functions[selector];
  486. }
  487. static int mtk_pmx_get_func_groups(struct pinctrl_dev *pctldev,
  488. unsigned function,
  489. const char * const **groups,
  490. unsigned * const num_groups)
  491. {
  492. struct mtk_pinctrl *hw = pinctrl_dev_get_drvdata(pctldev);
  493. *groups = hw->grp_names;
  494. *num_groups = hw->soc->ngrps;
  495. return 0;
  496. }
  497. static int mtk_pmx_set_mux(struct pinctrl_dev *pctldev,
  498. unsigned function,
  499. unsigned group)
  500. {
  501. struct mtk_pinctrl *hw = pinctrl_dev_get_drvdata(pctldev);
  502. struct mtk_pinctrl_group *grp = hw->groups + group;
  503. const struct mtk_func_desc *desc_func;
  504. const struct mtk_pin_desc *desc;
  505. bool ret;
  506. ret = mtk_pctrl_is_function_valid(hw, grp->pin, function);
  507. if (!ret) {
  508. dev_err(hw->dev, "invalid function %d on group %d .\n",
  509. function, group);
  510. return -EINVAL;
  511. }
  512. desc_func = mtk_pctrl_find_function_by_pin(hw, grp->pin, function);
  513. if (!desc_func)
  514. return -EINVAL;
  515. desc = (const struct mtk_pin_desc *)&hw->soc->pins[grp->pin];
  516. mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_MODE, desc_func->muxval);
  517. return 0;
  518. }
  519. static const struct pinmux_ops mtk_pmxops = {
  520. .get_functions_count = mtk_pmx_get_funcs_cnt,
  521. .get_function_name = mtk_pmx_get_func_name,
  522. .get_function_groups = mtk_pmx_get_func_groups,
  523. .set_mux = mtk_pmx_set_mux,
  524. .gpio_set_direction = mtk_pinmux_gpio_set_direction,
  525. .gpio_request_enable = mtk_pinmux_gpio_request_enable,
  526. };
  527. static int mtk_pconf_group_get(struct pinctrl_dev *pctldev, unsigned group,
  528. unsigned long *config)
  529. {
  530. struct mtk_pinctrl *hw = pinctrl_dev_get_drvdata(pctldev);
  531. *config = hw->groups[group].config;
  532. return 0;
  533. }
  534. static int mtk_pconf_group_set(struct pinctrl_dev *pctldev, unsigned group,
  535. unsigned long *configs, unsigned num_configs)
  536. {
  537. struct mtk_pinctrl *hw = pinctrl_dev_get_drvdata(pctldev);
  538. struct mtk_pinctrl_group *grp = &hw->groups[group];
  539. int i, ret;
  540. for (i = 0; i < num_configs; i++) {
  541. ret = mtk_pinconf_set(pctldev, grp->pin,
  542. pinconf_to_config_param(configs[i]),
  543. pinconf_to_config_argument(configs[i]));
  544. if (ret < 0)
  545. return ret;
  546. grp->config = configs[i];
  547. }
  548. return 0;
  549. }
  550. static const struct pinconf_ops mtk_confops = {
  551. .pin_config_get = mtk_pinconf_get,
  552. .pin_config_group_get = mtk_pconf_group_get,
  553. .pin_config_group_set = mtk_pconf_group_set,
  554. };
  555. static struct pinctrl_desc mtk_desc = {
  556. .name = PINCTRL_PINCTRL_DEV,
  557. .pctlops = &mtk_pctlops,
  558. .pmxops = &mtk_pmxops,
  559. .confops = &mtk_confops,
  560. .owner = THIS_MODULE,
  561. };
  562. static int mtk_gpio_get_direction(struct gpio_chip *chip, unsigned int gpio)
  563. {
  564. struct mtk_pinctrl *hw = gpiochip_get_data(chip);
  565. const struct mtk_pin_desc *desc;
  566. int value, err;
  567. desc = (const struct mtk_pin_desc *)&hw->soc->pins[gpio];
  568. err = mtk_hw_get_value(hw, desc, PINCTRL_PIN_REG_DIR, &value);
  569. if (err)
  570. return err;
  571. return !value;
  572. }
  573. static int mtk_gpio_get(struct gpio_chip *chip, unsigned int gpio)
  574. {
  575. struct mtk_pinctrl *hw = gpiochip_get_data(chip);
  576. const struct mtk_pin_desc *desc;
  577. int value, err;
  578. desc = (const struct mtk_pin_desc *)&hw->soc->pins[gpio];
  579. err = mtk_hw_get_value(hw, desc, PINCTRL_PIN_REG_DI, &value);
  580. if (err)
  581. return err;
  582. return !!value;
  583. }
  584. static void mtk_gpio_set(struct gpio_chip *chip, unsigned int gpio, int value)
  585. {
  586. struct mtk_pinctrl *hw = gpiochip_get_data(chip);
  587. const struct mtk_pin_desc *desc;
  588. desc = (const struct mtk_pin_desc *)&hw->soc->pins[gpio];
  589. mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_DO, !!value);
  590. }
  591. static int mtk_gpio_direction_input(struct gpio_chip *chip, unsigned int gpio)
  592. {
  593. return pinctrl_gpio_direction_input(chip->base + gpio);
  594. }
  595. static int mtk_gpio_direction_output(struct gpio_chip *chip, unsigned int gpio,
  596. int value)
  597. {
  598. mtk_gpio_set(chip, gpio, value);
  599. return pinctrl_gpio_direction_output(chip->base + gpio);
  600. }
  601. static int mtk_gpio_to_irq(struct gpio_chip *chip, unsigned int offset)
  602. {
  603. struct mtk_pinctrl *hw = gpiochip_get_data(chip);
  604. const struct mtk_pin_desc *desc;
  605. if (!hw->eint)
  606. return -ENOTSUPP;
  607. desc = (const struct mtk_pin_desc *)&hw->soc->pins[offset];
  608. if (desc->eint.eint_n == EINT_NA)
  609. return -ENOTSUPP;
  610. return mtk_eint_find_irq(hw->eint, desc->eint.eint_n);
  611. }
  612. static int mtk_gpio_set_config(struct gpio_chip *chip, unsigned int offset,
  613. unsigned long config)
  614. {
  615. struct mtk_pinctrl *hw = gpiochip_get_data(chip);
  616. const struct mtk_pin_desc *desc;
  617. u32 debounce;
  618. desc = (const struct mtk_pin_desc *)&hw->soc->pins[offset];
  619. if (!hw->eint ||
  620. pinconf_to_config_param(config) != PIN_CONFIG_INPUT_DEBOUNCE ||
  621. desc->eint.eint_n == EINT_NA)
  622. return -ENOTSUPP;
  623. debounce = pinconf_to_config_argument(config);
  624. return mtk_eint_set_debounce(hw->eint, desc->eint.eint_n, debounce);
  625. }
  626. static int mtk_build_gpiochip(struct mtk_pinctrl *hw, struct device_node *np)
  627. {
  628. struct gpio_chip *chip = &hw->chip;
  629. int ret;
  630. chip->label = PINCTRL_PINCTRL_DEV;
  631. chip->parent = hw->dev;
  632. chip->request = gpiochip_generic_request;
  633. chip->free = gpiochip_generic_free;
  634. chip->get_direction = mtk_gpio_get_direction;
  635. chip->direction_input = mtk_gpio_direction_input;
  636. chip->direction_output = mtk_gpio_direction_output;
  637. chip->get = mtk_gpio_get;
  638. chip->set = mtk_gpio_set;
  639. chip->to_irq = mtk_gpio_to_irq,
  640. chip->set_config = mtk_gpio_set_config,
  641. chip->base = -1;
  642. chip->ngpio = hw->soc->npins;
  643. chip->of_node = np;
  644. chip->of_gpio_n_cells = 2;
  645. ret = gpiochip_add_data(chip, hw);
  646. if (ret < 0)
  647. return ret;
  648. return 0;
  649. }
  650. static int mtk_pctrl_build_state(struct platform_device *pdev)
  651. {
  652. struct mtk_pinctrl *hw = platform_get_drvdata(pdev);
  653. int i;
  654. /* Allocate groups */
  655. hw->groups = devm_kmalloc_array(&pdev->dev, hw->soc->ngrps,
  656. sizeof(*hw->groups), GFP_KERNEL);
  657. if (!hw->groups)
  658. return -ENOMEM;
  659. /* We assume that one pin is one group, use pin name as group name. */
  660. hw->grp_names = devm_kmalloc_array(&pdev->dev, hw->soc->ngrps,
  661. sizeof(*hw->grp_names), GFP_KERNEL);
  662. if (!hw->grp_names)
  663. return -ENOMEM;
  664. for (i = 0; i < hw->soc->npins; i++) {
  665. const struct mtk_pin_desc *pin = hw->soc->pins + i;
  666. struct mtk_pinctrl_group *group = hw->groups + i;
  667. group->name = pin->name;
  668. group->pin = pin->number;
  669. hw->grp_names[i] = pin->name;
  670. }
  671. return 0;
  672. }
  673. int mtk_paris_pinctrl_probe(struct platform_device *pdev,
  674. const struct mtk_pin_soc *soc)
  675. {
  676. struct pinctrl_pin_desc *pins;
  677. struct mtk_pinctrl *hw;
  678. struct resource *res;
  679. int err, i;
  680. hw = devm_kzalloc(&pdev->dev, sizeof(*hw), GFP_KERNEL);
  681. if (!hw)
  682. return -ENOMEM;
  683. platform_set_drvdata(pdev, hw);
  684. hw->soc = soc;
  685. hw->dev = &pdev->dev;
  686. if (!hw->soc->nbase_names) {
  687. dev_err(&pdev->dev,
  688. "SoC should be assigned at least one register base\n");
  689. return -EINVAL;
  690. }
  691. hw->base = devm_kmalloc_array(&pdev->dev, hw->soc->nbase_names,
  692. sizeof(*hw->base), GFP_KERNEL);
  693. if (!hw->base)
  694. return -ENOMEM;
  695. for (i = 0; i < hw->soc->nbase_names; i++) {
  696. res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
  697. hw->soc->base_names[i]);
  698. if (!res) {
  699. dev_err(&pdev->dev, "missing IO resource\n");
  700. return -ENXIO;
  701. }
  702. hw->base[i] = devm_ioremap_resource(&pdev->dev, res);
  703. if (IS_ERR(hw->base[i]))
  704. return PTR_ERR(hw->base[i]);
  705. }
  706. hw->nbase = hw->soc->nbase_names;
  707. err = mtk_pctrl_build_state(pdev);
  708. if (err) {
  709. dev_err(&pdev->dev, "build state failed: %d\n", err);
  710. return -EINVAL;
  711. }
  712. /* Copy from internal struct mtk_pin_desc to register to the core */
  713. pins = devm_kmalloc_array(&pdev->dev, hw->soc->npins, sizeof(*pins),
  714. GFP_KERNEL);
  715. if (!pins)
  716. return -ENOMEM;
  717. for (i = 0; i < hw->soc->npins; i++) {
  718. pins[i].number = hw->soc->pins[i].number;
  719. pins[i].name = hw->soc->pins[i].name;
  720. }
  721. /* Setup pins descriptions per SoC types */
  722. mtk_desc.pins = (const struct pinctrl_pin_desc *)pins;
  723. mtk_desc.npins = hw->soc->npins;
  724. mtk_desc.num_custom_params = ARRAY_SIZE(mtk_custom_bindings);
  725. mtk_desc.custom_params = mtk_custom_bindings;
  726. #ifdef CONFIG_DEBUG_FS
  727. mtk_desc.custom_conf_items = mtk_conf_items;
  728. #endif
  729. err = devm_pinctrl_register_and_init(&pdev->dev, &mtk_desc, hw,
  730. &hw->pctrl);
  731. if (err)
  732. return err;
  733. err = pinctrl_enable(hw->pctrl);
  734. if (err)
  735. return err;
  736. err = mtk_build_eint(hw, pdev);
  737. if (err)
  738. dev_warn(&pdev->dev,
  739. "Failed to add EINT, but pinctrl still can work\n");
  740. /* Build gpiochip should be after pinctrl_enable is done */
  741. err = mtk_build_gpiochip(hw, pdev->dev.of_node);
  742. if (err) {
  743. dev_err(&pdev->dev, "Failed to add gpio_chip\n");
  744. return err;
  745. }
  746. platform_set_drvdata(pdev, hw);
  747. return 0;
  748. }