pinctrl-rtd.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Realtek DHC pin controller driver
  4. *
  5. * Copyright (c) 2023 Realtek Semiconductor Corp.
  6. */
  7. #include <linux/bitops.h>
  8. #include <linux/io.h>
  9. #include <linux/module.h>
  10. #include <linux/of.h>
  11. #include <linux/of_address.h>
  12. #include <linux/pinctrl/machine.h>
  13. #include <linux/pinctrl/pinconf.h>
  14. #include <linux/pinctrl/pinconf-generic.h>
  15. #include <linux/pinctrl/pinctrl.h>
  16. #include <linux/pinctrl/pinmux.h>
  17. #include <linux/platform_device.h>
  18. #include <linux/seq_file.h>
  19. #include <linux/regmap.h>
  20. #include <linux/slab.h>
  21. #include "../core.h"
  22. #include "../pinctrl-utils.h"
  23. #include "pinctrl-rtd.h"
  24. struct rtd_pinctrl {
  25. struct device *dev;
  26. struct pinctrl_dev *pcdev;
  27. void __iomem *base;
  28. struct pinctrl_desc desc;
  29. const struct rtd_pinctrl_desc *info;
  30. struct regmap *regmap_pinctrl;
  31. };
  32. /* custom pinconf parameters */
  33. #define RTD_DRIVE_STRENGH_P (PIN_CONFIG_END + 1)
  34. #define RTD_DRIVE_STRENGH_N (PIN_CONFIG_END + 2)
  35. #define RTD_DUTY_CYCLE (PIN_CONFIG_END + 3)
  36. static const struct pinconf_generic_params rtd_custom_bindings[] = {
  37. {"realtek,drive-strength-p", RTD_DRIVE_STRENGH_P, 0},
  38. {"realtek,drive-strength-n", RTD_DRIVE_STRENGH_N, 0},
  39. {"realtek,duty-cycle", RTD_DUTY_CYCLE, 0},
  40. };
  41. static int rtd_pinctrl_get_groups_count(struct pinctrl_dev *pcdev)
  42. {
  43. struct rtd_pinctrl *data = pinctrl_dev_get_drvdata(pcdev);
  44. return data->info->num_groups;
  45. }
  46. static const char *rtd_pinctrl_get_group_name(struct pinctrl_dev *pcdev,
  47. unsigned int selector)
  48. {
  49. struct rtd_pinctrl *data = pinctrl_dev_get_drvdata(pcdev);
  50. return data->info->groups[selector].name;
  51. }
  52. static int rtd_pinctrl_get_group_pins(struct pinctrl_dev *pcdev,
  53. unsigned int selector,
  54. const unsigned int **pins,
  55. unsigned int *num_pins)
  56. {
  57. struct rtd_pinctrl *data = pinctrl_dev_get_drvdata(pcdev);
  58. *pins = data->info->groups[selector].pins;
  59. *num_pins = data->info->groups[selector].num_pins;
  60. return 0;
  61. }
  62. static void rtd_pinctrl_dbg_show(struct pinctrl_dev *pcdev,
  63. struct seq_file *s,
  64. unsigned int offset)
  65. {
  66. struct rtd_pinctrl *data = pinctrl_dev_get_drvdata(pcdev);
  67. const struct rtd_pin_desc *mux = &data->info->muxes[offset];
  68. const struct rtd_pin_mux_desc *func;
  69. u32 val;
  70. u32 mask;
  71. u32 pin_val;
  72. int is_map;
  73. if (!mux->name) {
  74. seq_puts(s, "[not defined]");
  75. return;
  76. }
  77. val = readl_relaxed(data->base + mux->mux_offset);
  78. mask = mux->mux_mask;
  79. pin_val = val & mask;
  80. is_map = 0;
  81. func = &mux->functions[0];
  82. seq_puts(s, "function: ");
  83. while (func->name) {
  84. if (func->mux_value == pin_val) {
  85. is_map = 1;
  86. seq_printf(s, "[%s] ", func->name);
  87. } else {
  88. seq_printf(s, "%s ", func->name);
  89. }
  90. func++;
  91. }
  92. if (!is_map)
  93. seq_puts(s, "[not defined]");
  94. }
  95. static const struct pinctrl_ops rtd_pinctrl_ops = {
  96. .dt_node_to_map = pinconf_generic_dt_node_to_map_all,
  97. .dt_free_map = pinctrl_utils_free_map,
  98. .get_groups_count = rtd_pinctrl_get_groups_count,
  99. .get_group_name = rtd_pinctrl_get_group_name,
  100. .get_group_pins = rtd_pinctrl_get_group_pins,
  101. .pin_dbg_show = rtd_pinctrl_dbg_show,
  102. };
  103. static int rtd_pinctrl_get_functions_count(struct pinctrl_dev *pcdev)
  104. {
  105. struct rtd_pinctrl *data = pinctrl_dev_get_drvdata(pcdev);
  106. return data->info->num_functions;
  107. }
  108. static const char *rtd_pinctrl_get_function_name(struct pinctrl_dev *pcdev,
  109. unsigned int selector)
  110. {
  111. struct rtd_pinctrl *data = pinctrl_dev_get_drvdata(pcdev);
  112. return data->info->functions[selector].name;
  113. }
  114. static int rtd_pinctrl_get_function_groups(struct pinctrl_dev *pcdev,
  115. unsigned int selector,
  116. const char * const **groups,
  117. unsigned int * const num_groups)
  118. {
  119. struct rtd_pinctrl *data = pinctrl_dev_get_drvdata(pcdev);
  120. *groups = data->info->functions[selector].groups;
  121. *num_groups = data->info->functions[selector].num_groups;
  122. return 0;
  123. }
  124. static const struct rtd_pin_desc *rtd_pinctrl_find_mux(struct rtd_pinctrl *data, unsigned int pin)
  125. {
  126. if (data->info->muxes[pin].name)
  127. return &data->info->muxes[pin];
  128. return NULL;
  129. }
  130. static int rtd_pinctrl_set_one_mux(struct pinctrl_dev *pcdev,
  131. unsigned int pin, const char *func_name)
  132. {
  133. struct rtd_pinctrl *data = pinctrl_dev_get_drvdata(pcdev);
  134. const struct rtd_pin_desc *mux;
  135. int ret = 0;
  136. int i;
  137. mux = rtd_pinctrl_find_mux(data, pin);
  138. if (!mux)
  139. return 0;
  140. if (!mux->functions) {
  141. if (!mux->name)
  142. dev_err(pcdev->dev, "NULL pin has no functions\n");
  143. else
  144. dev_err(pcdev->dev, "No functions available for pin %s\n", mux->name);
  145. return -ENOTSUPP;
  146. }
  147. for (i = 0; mux->functions[i].name; i++) {
  148. if (strcmp(mux->functions[i].name, func_name) != 0)
  149. continue;
  150. ret = regmap_update_bits(data->regmap_pinctrl, mux->mux_offset, mux->mux_mask,
  151. mux->functions[i].mux_value);
  152. return ret;
  153. }
  154. if (!mux->name) {
  155. dev_err(pcdev->dev, "NULL pin provided for function %s\n", func_name);
  156. return -EINVAL;
  157. }
  158. dev_err(pcdev->dev, "No function %s available for pin %s\n", func_name, mux->name);
  159. return -EINVAL;
  160. }
  161. static int rtd_pinctrl_set_mux(struct pinctrl_dev *pcdev,
  162. unsigned int function, unsigned int group)
  163. {
  164. struct rtd_pinctrl *data = pinctrl_dev_get_drvdata(pcdev);
  165. const unsigned int *pins;
  166. unsigned int num_pins;
  167. const char *func_name;
  168. const char *group_name;
  169. int i, ret;
  170. func_name = data->info->functions[function].name;
  171. group_name = data->info->groups[group].name;
  172. ret = rtd_pinctrl_get_group_pins(pcdev, group, &pins, &num_pins);
  173. if (ret) {
  174. dev_err(pcdev->dev, "Getting pins for group %s failed\n", group_name);
  175. return ret;
  176. }
  177. for (i = 0; i < num_pins; i++) {
  178. ret = rtd_pinctrl_set_one_mux(pcdev, pins[i], func_name);
  179. if (ret)
  180. return ret;
  181. }
  182. return 0;
  183. }
  184. static int rtd_pinctrl_gpio_request_enable(struct pinctrl_dev *pcdev,
  185. struct pinctrl_gpio_range *range,
  186. unsigned int offset)
  187. {
  188. return rtd_pinctrl_set_one_mux(pcdev, offset, "gpio");
  189. }
  190. static const struct pinmux_ops rtd_pinmux_ops = {
  191. .get_functions_count = rtd_pinctrl_get_functions_count,
  192. .get_function_name = rtd_pinctrl_get_function_name,
  193. .get_function_groups = rtd_pinctrl_get_function_groups,
  194. .set_mux = rtd_pinctrl_set_mux,
  195. .gpio_request_enable = rtd_pinctrl_gpio_request_enable,
  196. };
  197. static const struct pinctrl_pin_desc
  198. *rtd_pinctrl_get_pin_by_number(struct rtd_pinctrl *data, int number)
  199. {
  200. int i;
  201. for (i = 0; i < data->info->num_pins; i++) {
  202. if (data->info->pins[i].number == number)
  203. return &data->info->pins[i];
  204. }
  205. return NULL;
  206. }
  207. static const struct rtd_pin_config_desc
  208. *rtd_pinctrl_find_config(struct rtd_pinctrl *data, unsigned int pin)
  209. {
  210. if (data->info->configs[pin].name)
  211. return &data->info->configs[pin];
  212. return NULL;
  213. }
  214. static const struct rtd_pin_sconfig_desc *rtd_pinctrl_find_sconfig(struct rtd_pinctrl *data,
  215. unsigned int pin)
  216. {
  217. int i;
  218. const struct pinctrl_pin_desc *pin_desc;
  219. const char *pin_name;
  220. pin_desc = rtd_pinctrl_get_pin_by_number(data, pin);
  221. if (!pin_desc)
  222. return NULL;
  223. pin_name = pin_desc->name;
  224. for (i = 0; i < data->info->num_sconfigs; i++) {
  225. if (strcmp(data->info->sconfigs[i].name, pin_name) == 0)
  226. return &data->info->sconfigs[i];
  227. }
  228. return NULL;
  229. }
  230. static int rtd_pconf_parse_conf(struct rtd_pinctrl *data,
  231. unsigned int pinnr,
  232. enum pin_config_param param,
  233. enum pin_config_param arg)
  234. {
  235. const struct rtd_pin_config_desc *config_desc;
  236. const struct rtd_pin_sconfig_desc *sconfig_desc;
  237. u8 set_val = 0;
  238. u16 strength;
  239. u32 val;
  240. u32 mask;
  241. u32 pulsel_off, pulen_off, smt_off, curr_off, pow_off, reg_off, p_off, n_off;
  242. const char *name = data->info->pins[pinnr].name;
  243. int ret = 0;
  244. config_desc = rtd_pinctrl_find_config(data, pinnr);
  245. if (!config_desc) {
  246. dev_err(data->dev, "Not support pin config for pin: %s\n", name);
  247. return -ENOTSUPP;
  248. }
  249. switch ((u32)param) {
  250. case PIN_CONFIG_INPUT_SCHMITT:
  251. case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
  252. if (config_desc->smt_offset == NA) {
  253. dev_err(data->dev, "Not support input schmitt for pin: %s\n", name);
  254. return -ENOTSUPP;
  255. }
  256. smt_off = config_desc->base_bit + config_desc->smt_offset;
  257. reg_off = config_desc->reg_offset;
  258. set_val = arg;
  259. mask = BIT(smt_off);
  260. val = set_val ? BIT(smt_off) : 0;
  261. break;
  262. case PIN_CONFIG_DRIVE_PUSH_PULL:
  263. if (config_desc->pud_en_offset == NA) {
  264. dev_err(data->dev, "Not support push pull for pin: %s\n", name);
  265. return -ENOTSUPP;
  266. }
  267. pulen_off = config_desc->base_bit + config_desc->pud_en_offset;
  268. reg_off = config_desc->reg_offset;
  269. mask = BIT(pulen_off);
  270. val = 0;
  271. break;
  272. case PIN_CONFIG_BIAS_DISABLE:
  273. if (config_desc->pud_en_offset == NA) {
  274. dev_err(data->dev, "Not support bias disable for pin: %s\n", name);
  275. return -ENOTSUPP;
  276. }
  277. pulen_off = config_desc->base_bit + config_desc->pud_en_offset;
  278. reg_off = config_desc->reg_offset;
  279. mask = BIT(pulen_off);
  280. val = 0;
  281. break;
  282. case PIN_CONFIG_BIAS_PULL_UP:
  283. if (config_desc->pud_en_offset == NA) {
  284. dev_err(data->dev, "Not support bias pull up for pin:%s\n", name);
  285. return -ENOTSUPP;
  286. }
  287. pulen_off = config_desc->base_bit + config_desc->pud_en_offset;
  288. pulsel_off = config_desc->base_bit + config_desc->pud_sel_offset;
  289. reg_off = config_desc->reg_offset;
  290. mask = BIT(pulen_off) | BIT(pulsel_off);
  291. val = mask;
  292. break;
  293. case PIN_CONFIG_BIAS_PULL_DOWN:
  294. if (config_desc->pud_en_offset == NA) {
  295. dev_err(data->dev, "Not support bias pull down for pin: %s\n", name);
  296. return -ENOTSUPP;
  297. }
  298. pulen_off = config_desc->base_bit + config_desc->pud_en_offset;
  299. pulsel_off = config_desc->base_bit + config_desc->pud_sel_offset;
  300. reg_off = config_desc->reg_offset;
  301. mask = BIT(pulen_off) | BIT(pulsel_off);
  302. val = BIT(pulen_off);
  303. break;
  304. case PIN_CONFIG_DRIVE_STRENGTH:
  305. curr_off = config_desc->base_bit + config_desc->curr_offset;
  306. reg_off = config_desc->reg_offset;
  307. strength = arg;
  308. val = 0;
  309. switch (config_desc->curr_type) {
  310. case PADDRI_4_8:
  311. if (strength == 4)
  312. val = 0;
  313. else if (strength == 8)
  314. val = BIT(curr_off);
  315. else
  316. return -EINVAL;
  317. break;
  318. case PADDRI_2_4:
  319. if (strength == 2)
  320. val = 0;
  321. else if (strength == 4)
  322. val = BIT(curr_off);
  323. else
  324. return -EINVAL;
  325. break;
  326. case NA:
  327. dev_err(data->dev, "Not support drive strength for pin: %s\n", name);
  328. return -ENOTSUPP;
  329. default:
  330. return -EINVAL;
  331. }
  332. mask = BIT(curr_off);
  333. break;
  334. case PIN_CONFIG_POWER_SOURCE:
  335. if (config_desc->power_offset == NA) {
  336. dev_err(data->dev, "Not support power source for pin: %s\n", name);
  337. return -ENOTSUPP;
  338. }
  339. reg_off = config_desc->reg_offset;
  340. pow_off = config_desc->base_bit + config_desc->power_offset;
  341. if (pow_off >= 32) {
  342. reg_off += 0x4;
  343. pow_off -= 32;
  344. }
  345. set_val = arg;
  346. mask = BIT(pow_off);
  347. val = set_val ? mask : 0;
  348. break;
  349. case RTD_DRIVE_STRENGH_P:
  350. sconfig_desc = rtd_pinctrl_find_sconfig(data, pinnr);
  351. if (!sconfig_desc) {
  352. dev_err(data->dev, "Not support P driving for pin: %s\n", name);
  353. return -ENOTSUPP;
  354. }
  355. set_val = arg;
  356. reg_off = sconfig_desc->reg_offset;
  357. p_off = sconfig_desc->pdrive_offset;
  358. if (p_off >= 32) {
  359. reg_off += 0x4;
  360. p_off -= 32;
  361. }
  362. mask = GENMASK(p_off + sconfig_desc->pdrive_maskbits - 1, p_off);
  363. val = set_val << p_off;
  364. break;
  365. case RTD_DRIVE_STRENGH_N:
  366. sconfig_desc = rtd_pinctrl_find_sconfig(data, pinnr);
  367. if (!sconfig_desc) {
  368. dev_err(data->dev, "Not support N driving for pin: %s\n", name);
  369. return -ENOTSUPP;
  370. }
  371. set_val = arg;
  372. reg_off = sconfig_desc->reg_offset;
  373. n_off = sconfig_desc->ndrive_offset;
  374. if (n_off >= 32) {
  375. reg_off += 0x4;
  376. n_off -= 32;
  377. }
  378. mask = GENMASK(n_off + sconfig_desc->ndrive_maskbits - 1, n_off);
  379. val = set_val << n_off;
  380. break;
  381. case RTD_DUTY_CYCLE:
  382. sconfig_desc = rtd_pinctrl_find_sconfig(data, pinnr);
  383. if (!sconfig_desc || sconfig_desc->dcycle_offset == NA) {
  384. dev_err(data->dev, "Not support duty cycle for pin: %s\n", name);
  385. return -ENOTSUPP;
  386. }
  387. set_val = arg;
  388. reg_off = config_desc->reg_offset;
  389. mask = GENMASK(sconfig_desc->dcycle_offset +
  390. sconfig_desc->dcycle_maskbits - 1, sconfig_desc->dcycle_offset);
  391. val = set_val << sconfig_desc->dcycle_offset;
  392. break;
  393. default:
  394. dev_err(data->dev, "unsupported pinconf: %d\n", (u32)param);
  395. return -EINVAL;
  396. }
  397. ret = regmap_update_bits(data->regmap_pinctrl, reg_off, mask, val);
  398. if (ret)
  399. dev_err(data->dev, "could not update pinconf(%d) for pin(%s)\n", (u32)param, name);
  400. return ret;
  401. }
  402. static int rtd_pin_config_get(struct pinctrl_dev *pcdev, unsigned int pinnr,
  403. unsigned long *config)
  404. {
  405. unsigned int param = pinconf_to_config_param(*config);
  406. unsigned int arg = 0;
  407. switch (param) {
  408. default:
  409. return -ENOTSUPP;
  410. }
  411. *config = pinconf_to_config_packed(param, arg);
  412. return 0;
  413. }
  414. static int rtd_pin_config_set(struct pinctrl_dev *pcdev, unsigned int pinnr,
  415. unsigned long *configs, unsigned int num_configs)
  416. {
  417. struct rtd_pinctrl *data = pinctrl_dev_get_drvdata(pcdev);
  418. int i;
  419. int ret = 0;
  420. for (i = 0; i < num_configs; i++) {
  421. ret = rtd_pconf_parse_conf(data, pinnr,
  422. pinconf_to_config_param(configs[i]),
  423. pinconf_to_config_argument(configs[i]));
  424. if (ret < 0)
  425. return ret;
  426. }
  427. return 0;
  428. }
  429. static int rtd_pin_config_group_set(struct pinctrl_dev *pcdev, unsigned int group,
  430. unsigned long *configs, unsigned int num_configs)
  431. {
  432. struct rtd_pinctrl *data = pinctrl_dev_get_drvdata(pcdev);
  433. const unsigned int *pins;
  434. unsigned int num_pins;
  435. const char *group_name;
  436. int i, ret;
  437. group_name = data->info->groups[group].name;
  438. ret = rtd_pinctrl_get_group_pins(pcdev, group, &pins, &num_pins);
  439. if (ret) {
  440. dev_err(pcdev->dev, "Getting pins for group %s failed\n", group_name);
  441. return ret;
  442. }
  443. for (i = 0; i < num_pins; i++) {
  444. ret = rtd_pin_config_set(pcdev, pins[i], configs, num_configs);
  445. if (ret)
  446. return ret;
  447. }
  448. return 0;
  449. }
  450. static const struct pinconf_ops rtd_pinconf_ops = {
  451. .is_generic = true,
  452. .pin_config_get = rtd_pin_config_get,
  453. .pin_config_set = rtd_pin_config_set,
  454. .pin_config_group_set = rtd_pin_config_group_set,
  455. };
  456. static const struct regmap_config rtd_pinctrl_regmap_config = {
  457. .reg_bits = 32,
  458. .val_bits = 32,
  459. .reg_stride = 4,
  460. .use_relaxed_mmio = true,
  461. };
  462. int rtd_pinctrl_probe(struct platform_device *pdev, const struct rtd_pinctrl_desc *desc)
  463. {
  464. struct rtd_pinctrl *data;
  465. int ret;
  466. data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
  467. if (!data)
  468. return -ENOMEM;
  469. data->base = of_iomap(pdev->dev.of_node, 0);
  470. if (!data->base)
  471. return -ENOMEM;
  472. data->dev = &pdev->dev;
  473. data->info = desc;
  474. data->desc.name = dev_name(&pdev->dev);
  475. data->desc.pins = data->info->pins;
  476. data->desc.npins = data->info->num_pins;
  477. data->desc.pctlops = &rtd_pinctrl_ops;
  478. data->desc.pmxops = &rtd_pinmux_ops;
  479. data->desc.confops = &rtd_pinconf_ops;
  480. data->desc.custom_params = rtd_custom_bindings;
  481. data->desc.num_custom_params = ARRAY_SIZE(rtd_custom_bindings);
  482. data->desc.owner = THIS_MODULE;
  483. data->regmap_pinctrl = devm_regmap_init_mmio(data->dev, data->base,
  484. &rtd_pinctrl_regmap_config);
  485. if (IS_ERR(data->regmap_pinctrl)) {
  486. dev_err(data->dev, "failed to init regmap: %ld\n",
  487. PTR_ERR(data->regmap_pinctrl));
  488. ret = PTR_ERR(data->regmap_pinctrl);
  489. goto unmap;
  490. }
  491. data->pcdev = pinctrl_register(&data->desc, &pdev->dev, data);
  492. if (IS_ERR(data->pcdev)) {
  493. ret = PTR_ERR(data->pcdev);
  494. goto unmap;
  495. }
  496. platform_set_drvdata(pdev, data);
  497. dev_dbg(&pdev->dev, "probed\n");
  498. return 0;
  499. unmap:
  500. iounmap(data->base);
  501. return ret;
  502. }
  503. EXPORT_SYMBOL(rtd_pinctrl_probe);
  504. MODULE_DESCRIPTION("Realtek DHC SoC pinctrl driver");
  505. MODULE_LICENSE("GPL v2");