pinctrl-sprd.c 26 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117
  1. /*
  2. * Spreadtrum pin controller driver
  3. * Copyright (C) 2017 Spreadtrum - http://www.spreadtrum.com
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License
  7. * version 2 as published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful, but
  10. * WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * General Public License for more details.
  13. */
  14. #include <linux/debugfs.h>
  15. #include <linux/err.h>
  16. #include <linux/init.h>
  17. #include <linux/io.h>
  18. #include <linux/kernel.h>
  19. #include <linux/module.h>
  20. #include <linux/of.h>
  21. #include <linux/of_device.h>
  22. #include <linux/platform_device.h>
  23. #include <linux/pinctrl/machine.h>
  24. #include <linux/pinctrl/pinconf.h>
  25. #include <linux/pinctrl/pinconf-generic.h>
  26. #include <linux/pinctrl/pinctrl.h>
  27. #include <linux/pinctrl/pinmux.h>
  28. #include <linux/slab.h>
  29. #include "../core.h"
  30. #include "../pinmux.h"
  31. #include "../pinconf.h"
  32. #include "../pinctrl-utils.h"
  33. #include "pinctrl-sprd.h"
  34. #define PINCTRL_BIT_MASK(width) (~(~0UL << (width)))
  35. #define PINCTRL_REG_OFFSET 0x20
  36. #define PINCTRL_REG_MISC_OFFSET 0x4020
  37. #define PINCTRL_REG_LEN 0x4
  38. #define PIN_FUNC_MASK (BIT(4) | BIT(5))
  39. #define PIN_FUNC_SEL_1 ~PIN_FUNC_MASK
  40. #define PIN_FUNC_SEL_2 BIT(4)
  41. #define PIN_FUNC_SEL_3 BIT(5)
  42. #define PIN_FUNC_SEL_4 PIN_FUNC_MASK
  43. #define AP_SLEEP_MODE BIT(13)
  44. #define PUBCP_SLEEP_MODE BIT(14)
  45. #define TGLDSP_SLEEP_MODE BIT(15)
  46. #define AGDSP_SLEEP_MODE BIT(16)
  47. #define SLEEP_MODE_MASK GENMASK(3, 0)
  48. #define SLEEP_MODE_SHIFT 13
  49. #define SLEEP_INPUT BIT(1)
  50. #define SLEEP_INPUT_MASK 0x1
  51. #define SLEEP_INPUT_SHIFT 1
  52. #define SLEEP_OUTPUT BIT(0)
  53. #define SLEEP_OUTPUT_MASK 0x1
  54. #define SLEEP_OUTPUT_SHIFT 0
  55. #define DRIVE_STRENGTH_MASK GENMASK(3, 0)
  56. #define DRIVE_STRENGTH_SHIFT 19
  57. #define SLEEP_PULL_DOWN BIT(2)
  58. #define SLEEP_PULL_DOWN_MASK 0x1
  59. #define SLEEP_PULL_DOWN_SHIFT 2
  60. #define PULL_DOWN BIT(6)
  61. #define PULL_DOWN_MASK 0x1
  62. #define PULL_DOWN_SHIFT 6
  63. #define SLEEP_PULL_UP BIT(3)
  64. #define SLEEP_PULL_UP_MASK 0x1
  65. #define SLEEP_PULL_UP_SHIFT 3
  66. #define PULL_UP_20K (BIT(12) | BIT(7))
  67. #define PULL_UP_4_7K BIT(12)
  68. #define PULL_UP_MASK 0x21
  69. #define PULL_UP_SHIFT 7
  70. #define INPUT_SCHMITT BIT(11)
  71. #define INPUT_SCHMITT_MASK 0x1
  72. #define INPUT_SCHMITT_SHIFT 11
  73. enum pin_sleep_mode {
  74. AP_SLEEP = BIT(0),
  75. PUBCP_SLEEP = BIT(1),
  76. TGLDSP_SLEEP = BIT(2),
  77. AGDSP_SLEEP = BIT(3),
  78. };
  79. enum pin_func_sel {
  80. PIN_FUNC_1,
  81. PIN_FUNC_2,
  82. PIN_FUNC_3,
  83. PIN_FUNC_4,
  84. PIN_FUNC_MAX,
  85. };
  86. /**
  87. * struct sprd_pin: represent one pin's description
  88. * @name: pin name
  89. * @number: pin number
  90. * @type: pin type, can be GLOBAL_CTRL_PIN/COMMON_PIN/MISC_PIN
  91. * @reg: pin register address
  92. * @bit_offset: bit offset in pin register
  93. * @bit_width: bit width in pin register
  94. */
  95. struct sprd_pin {
  96. const char *name;
  97. unsigned int number;
  98. enum pin_type type;
  99. unsigned long reg;
  100. unsigned long bit_offset;
  101. unsigned long bit_width;
  102. };
  103. /**
  104. * struct sprd_pin_group: represent one group's description
  105. * @name: group name
  106. * @npins: pin numbers of this group
  107. * @pins: pointer to pins array
  108. */
  109. struct sprd_pin_group {
  110. const char *name;
  111. unsigned int npins;
  112. unsigned int *pins;
  113. };
  114. /**
  115. * struct sprd_pinctrl_soc_info: represent the SoC's pins description
  116. * @groups: pointer to groups of pins
  117. * @ngroups: group numbers of the whole SoC
  118. * @pins: pointer to pins description
  119. * @npins: pin numbers of the whole SoC
  120. * @grp_names: pointer to group names array
  121. */
  122. struct sprd_pinctrl_soc_info {
  123. struct sprd_pin_group *groups;
  124. unsigned int ngroups;
  125. struct sprd_pin *pins;
  126. unsigned int npins;
  127. const char **grp_names;
  128. };
  129. /**
  130. * struct sprd_pinctrl: represent the pin controller device
  131. * @dev: pointer to the device structure
  132. * @pctl: pointer to the pinctrl handle
  133. * @base: base address of the controller
  134. * @info: pointer to SoC's pins description information
  135. */
  136. struct sprd_pinctrl {
  137. struct device *dev;
  138. struct pinctrl_dev *pctl;
  139. void __iomem *base;
  140. struct sprd_pinctrl_soc_info *info;
  141. };
  142. enum sprd_pinconf_params {
  143. SPRD_PIN_CONFIG_CONTROL = PIN_CONFIG_END + 1,
  144. SPRD_PIN_CONFIG_SLEEP_MODE = PIN_CONFIG_END + 2,
  145. };
  146. static int sprd_pinctrl_get_id_by_name(struct sprd_pinctrl *sprd_pctl,
  147. const char *name)
  148. {
  149. struct sprd_pinctrl_soc_info *info = sprd_pctl->info;
  150. int i;
  151. for (i = 0; i < info->npins; i++) {
  152. if (!strcmp(info->pins[i].name, name))
  153. return info->pins[i].number;
  154. }
  155. return -ENODEV;
  156. }
  157. static struct sprd_pin *
  158. sprd_pinctrl_get_pin_by_id(struct sprd_pinctrl *sprd_pctl, unsigned int id)
  159. {
  160. struct sprd_pinctrl_soc_info *info = sprd_pctl->info;
  161. struct sprd_pin *pin = NULL;
  162. int i;
  163. for (i = 0; i < info->npins; i++) {
  164. if (info->pins[i].number == id) {
  165. pin = &info->pins[i];
  166. break;
  167. }
  168. }
  169. return pin;
  170. }
  171. static const struct sprd_pin_group *
  172. sprd_pinctrl_find_group_by_name(struct sprd_pinctrl *sprd_pctl,
  173. const char *name)
  174. {
  175. struct sprd_pinctrl_soc_info *info = sprd_pctl->info;
  176. const struct sprd_pin_group *grp = NULL;
  177. int i;
  178. for (i = 0; i < info->ngroups; i++) {
  179. if (!strcmp(info->groups[i].name, name)) {
  180. grp = &info->groups[i];
  181. break;
  182. }
  183. }
  184. return grp;
  185. }
  186. static int sprd_pctrl_group_count(struct pinctrl_dev *pctldev)
  187. {
  188. struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  189. struct sprd_pinctrl_soc_info *info = pctl->info;
  190. return info->ngroups;
  191. }
  192. static const char *sprd_pctrl_group_name(struct pinctrl_dev *pctldev,
  193. unsigned int selector)
  194. {
  195. struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  196. struct sprd_pinctrl_soc_info *info = pctl->info;
  197. return info->groups[selector].name;
  198. }
  199. static int sprd_pctrl_group_pins(struct pinctrl_dev *pctldev,
  200. unsigned int selector,
  201. const unsigned int **pins,
  202. unsigned int *npins)
  203. {
  204. struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  205. struct sprd_pinctrl_soc_info *info = pctl->info;
  206. if (selector >= info->ngroups)
  207. return -EINVAL;
  208. *pins = info->groups[selector].pins;
  209. *npins = info->groups[selector].npins;
  210. return 0;
  211. }
  212. static int sprd_dt_node_to_map(struct pinctrl_dev *pctldev,
  213. struct device_node *np,
  214. struct pinctrl_map **map,
  215. unsigned int *num_maps)
  216. {
  217. struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  218. const struct sprd_pin_group *grp;
  219. unsigned long *configs = NULL;
  220. unsigned int num_configs = 0;
  221. unsigned int reserved_maps = 0;
  222. unsigned int reserve = 0;
  223. const char *function;
  224. enum pinctrl_map_type type;
  225. int ret;
  226. grp = sprd_pinctrl_find_group_by_name(pctl, np->name);
  227. if (!grp) {
  228. dev_err(pctl->dev, "unable to find group for node %s\n",
  229. of_node_full_name(np));
  230. return -EINVAL;
  231. }
  232. ret = of_property_count_strings(np, "pins");
  233. if (ret < 0)
  234. return ret;
  235. if (ret == 1)
  236. type = PIN_MAP_TYPE_CONFIGS_PIN;
  237. else
  238. type = PIN_MAP_TYPE_CONFIGS_GROUP;
  239. ret = of_property_read_string(np, "function", &function);
  240. if (ret < 0) {
  241. if (ret != -EINVAL)
  242. dev_err(pctl->dev,
  243. "%s: could not parse property function\n",
  244. of_node_full_name(np));
  245. function = NULL;
  246. }
  247. ret = pinconf_generic_parse_dt_config(np, pctldev, &configs,
  248. &num_configs);
  249. if (ret < 0) {
  250. dev_err(pctl->dev, "%s: could not parse node property\n",
  251. of_node_full_name(np));
  252. return ret;
  253. }
  254. *map = NULL;
  255. *num_maps = 0;
  256. if (function != NULL)
  257. reserve++;
  258. if (num_configs)
  259. reserve++;
  260. ret = pinctrl_utils_reserve_map(pctldev, map, &reserved_maps,
  261. num_maps, reserve);
  262. if (ret < 0)
  263. goto out;
  264. if (function) {
  265. ret = pinctrl_utils_add_map_mux(pctldev, map,
  266. &reserved_maps, num_maps,
  267. grp->name, function);
  268. if (ret < 0)
  269. goto out;
  270. }
  271. if (num_configs) {
  272. const char *group_or_pin;
  273. unsigned int pin_id;
  274. if (type == PIN_MAP_TYPE_CONFIGS_PIN) {
  275. pin_id = grp->pins[0];
  276. group_or_pin = pin_get_name(pctldev, pin_id);
  277. } else {
  278. group_or_pin = grp->name;
  279. }
  280. ret = pinctrl_utils_add_map_configs(pctldev, map,
  281. &reserved_maps, num_maps,
  282. group_or_pin, configs,
  283. num_configs, type);
  284. }
  285. out:
  286. kfree(configs);
  287. return ret;
  288. }
  289. static void sprd_pctrl_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s,
  290. unsigned int offset)
  291. {
  292. seq_printf(s, "%s", dev_name(pctldev->dev));
  293. }
  294. static const struct pinctrl_ops sprd_pctrl_ops = {
  295. .get_groups_count = sprd_pctrl_group_count,
  296. .get_group_name = sprd_pctrl_group_name,
  297. .get_group_pins = sprd_pctrl_group_pins,
  298. .pin_dbg_show = sprd_pctrl_dbg_show,
  299. .dt_node_to_map = sprd_dt_node_to_map,
  300. .dt_free_map = pinctrl_utils_free_map,
  301. };
  302. static int sprd_pmx_get_function_count(struct pinctrl_dev *pctldev)
  303. {
  304. return PIN_FUNC_MAX;
  305. }
  306. static const char *sprd_pmx_get_function_name(struct pinctrl_dev *pctldev,
  307. unsigned int selector)
  308. {
  309. switch (selector) {
  310. case PIN_FUNC_1:
  311. return "func1";
  312. case PIN_FUNC_2:
  313. return "func2";
  314. case PIN_FUNC_3:
  315. return "func3";
  316. case PIN_FUNC_4:
  317. return "func4";
  318. default:
  319. return "null";
  320. }
  321. }
  322. static int sprd_pmx_get_function_groups(struct pinctrl_dev *pctldev,
  323. unsigned int selector,
  324. const char * const **groups,
  325. unsigned int * const num_groups)
  326. {
  327. struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  328. struct sprd_pinctrl_soc_info *info = pctl->info;
  329. *groups = info->grp_names;
  330. *num_groups = info->ngroups;
  331. return 0;
  332. }
  333. static int sprd_pmx_set_mux(struct pinctrl_dev *pctldev,
  334. unsigned int func_selector,
  335. unsigned int group_selector)
  336. {
  337. struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  338. struct sprd_pinctrl_soc_info *info = pctl->info;
  339. struct sprd_pin_group *grp = &info->groups[group_selector];
  340. unsigned int i, grp_pins = grp->npins;
  341. unsigned long reg;
  342. unsigned int val = 0;
  343. if (group_selector >= info->ngroups)
  344. return -EINVAL;
  345. switch (func_selector) {
  346. case PIN_FUNC_1:
  347. val &= PIN_FUNC_SEL_1;
  348. break;
  349. case PIN_FUNC_2:
  350. val |= PIN_FUNC_SEL_2;
  351. break;
  352. case PIN_FUNC_3:
  353. val |= PIN_FUNC_SEL_3;
  354. break;
  355. case PIN_FUNC_4:
  356. val |= PIN_FUNC_SEL_4;
  357. break;
  358. default:
  359. break;
  360. }
  361. for (i = 0; i < grp_pins; i++) {
  362. unsigned int pin_id = grp->pins[i];
  363. struct sprd_pin *pin = sprd_pinctrl_get_pin_by_id(pctl, pin_id);
  364. if (!pin || pin->type != COMMON_PIN)
  365. continue;
  366. reg = readl((void __iomem *)pin->reg);
  367. reg &= ~PIN_FUNC_MASK;
  368. reg |= val;
  369. writel(reg, (void __iomem *)pin->reg);
  370. }
  371. return 0;
  372. }
  373. static const struct pinmux_ops sprd_pmx_ops = {
  374. .get_functions_count = sprd_pmx_get_function_count,
  375. .get_function_name = sprd_pmx_get_function_name,
  376. .get_function_groups = sprd_pmx_get_function_groups,
  377. .set_mux = sprd_pmx_set_mux,
  378. };
  379. static int sprd_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin_id,
  380. unsigned long *config)
  381. {
  382. struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  383. struct sprd_pin *pin = sprd_pinctrl_get_pin_by_id(pctl, pin_id);
  384. unsigned int param = pinconf_to_config_param(*config);
  385. unsigned int reg, arg;
  386. if (!pin)
  387. return -EINVAL;
  388. if (pin->type == GLOBAL_CTRL_PIN) {
  389. reg = (readl((void __iomem *)pin->reg) >>
  390. pin->bit_offset) & PINCTRL_BIT_MASK(pin->bit_width);
  391. } else {
  392. reg = readl((void __iomem *)pin->reg);
  393. }
  394. if (pin->type == GLOBAL_CTRL_PIN &&
  395. param == SPRD_PIN_CONFIG_CONTROL) {
  396. arg = reg;
  397. } else if (pin->type == COMMON_PIN) {
  398. switch (param) {
  399. case SPRD_PIN_CONFIG_SLEEP_MODE:
  400. arg = (reg >> SLEEP_MODE_SHIFT) & SLEEP_MODE_MASK;
  401. break;
  402. case PIN_CONFIG_INPUT_ENABLE:
  403. arg = (reg >> SLEEP_INPUT_SHIFT) & SLEEP_INPUT_MASK;
  404. break;
  405. case PIN_CONFIG_OUTPUT:
  406. arg = reg & SLEEP_OUTPUT_MASK;
  407. break;
  408. case PIN_CONFIG_SLEEP_HARDWARE_STATE:
  409. arg = 0;
  410. break;
  411. default:
  412. return -ENOTSUPP;
  413. }
  414. } else if (pin->type == MISC_PIN) {
  415. switch (param) {
  416. case PIN_CONFIG_DRIVE_STRENGTH:
  417. arg = (reg >> DRIVE_STRENGTH_SHIFT) &
  418. DRIVE_STRENGTH_MASK;
  419. break;
  420. case PIN_CONFIG_BIAS_PULL_DOWN:
  421. /* combine sleep pull down and pull down config */
  422. arg = ((reg >> SLEEP_PULL_DOWN_SHIFT) &
  423. SLEEP_PULL_DOWN_MASK) << 16;
  424. arg |= (reg >> PULL_DOWN_SHIFT) & PULL_DOWN_MASK;
  425. break;
  426. case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
  427. arg = (reg >> INPUT_SCHMITT_SHIFT) & INPUT_SCHMITT_MASK;
  428. break;
  429. case PIN_CONFIG_BIAS_PULL_UP:
  430. /* combine sleep pull up and pull up config */
  431. arg = ((reg >> SLEEP_PULL_UP_SHIFT) &
  432. SLEEP_PULL_UP_MASK) << 16;
  433. arg |= (reg >> PULL_UP_SHIFT) & PULL_UP_MASK;
  434. break;
  435. case PIN_CONFIG_SLEEP_HARDWARE_STATE:
  436. arg = 0;
  437. break;
  438. default:
  439. return -ENOTSUPP;
  440. }
  441. } else {
  442. return -ENOTSUPP;
  443. }
  444. *config = pinconf_to_config_packed(param, arg);
  445. return 0;
  446. }
  447. static unsigned int sprd_pinconf_drive(unsigned int mA)
  448. {
  449. unsigned int val = 0;
  450. switch (mA) {
  451. case 2:
  452. break;
  453. case 4:
  454. val |= BIT(19);
  455. break;
  456. case 6:
  457. val |= BIT(20);
  458. break;
  459. case 8:
  460. val |= BIT(19) | BIT(20);
  461. break;
  462. case 10:
  463. val |= BIT(21);
  464. break;
  465. case 12:
  466. val |= BIT(21) | BIT(19);
  467. break;
  468. case 14:
  469. val |= BIT(21) | BIT(20);
  470. break;
  471. case 16:
  472. val |= BIT(19) | BIT(20) | BIT(21);
  473. break;
  474. case 20:
  475. val |= BIT(22);
  476. break;
  477. case 21:
  478. val |= BIT(22) | BIT(19);
  479. break;
  480. case 24:
  481. val |= BIT(22) | BIT(20);
  482. break;
  483. case 25:
  484. val |= BIT(22) | BIT(20) | BIT(19);
  485. break;
  486. case 27:
  487. val |= BIT(22) | BIT(21);
  488. break;
  489. case 29:
  490. val |= BIT(22) | BIT(21) | BIT(19);
  491. break;
  492. case 31:
  493. val |= BIT(22) | BIT(21) | BIT(20);
  494. break;
  495. case 33:
  496. val |= BIT(22) | BIT(21) | BIT(20) | BIT(19);
  497. break;
  498. default:
  499. break;
  500. }
  501. return val;
  502. }
  503. static bool sprd_pinctrl_check_sleep_config(unsigned long *configs,
  504. unsigned int num_configs)
  505. {
  506. unsigned int param;
  507. int i;
  508. for (i = 0; i < num_configs; i++) {
  509. param = pinconf_to_config_param(configs[i]);
  510. if (param == PIN_CONFIG_SLEEP_HARDWARE_STATE)
  511. return true;
  512. }
  513. return false;
  514. }
  515. static int sprd_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin_id,
  516. unsigned long *configs, unsigned int num_configs)
  517. {
  518. struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  519. struct sprd_pin *pin = sprd_pinctrl_get_pin_by_id(pctl, pin_id);
  520. bool is_sleep_config;
  521. unsigned long reg;
  522. int i;
  523. if (!pin)
  524. return -EINVAL;
  525. is_sleep_config = sprd_pinctrl_check_sleep_config(configs, num_configs);
  526. for (i = 0; i < num_configs; i++) {
  527. unsigned int param, arg, shift, mask, val;
  528. param = pinconf_to_config_param(configs[i]);
  529. arg = pinconf_to_config_argument(configs[i]);
  530. val = 0;
  531. shift = 0;
  532. mask = 0;
  533. if (pin->type == GLOBAL_CTRL_PIN &&
  534. param == SPRD_PIN_CONFIG_CONTROL) {
  535. val = arg;
  536. } else if (pin->type == COMMON_PIN) {
  537. switch (param) {
  538. case SPRD_PIN_CONFIG_SLEEP_MODE:
  539. if (arg & AP_SLEEP)
  540. val |= AP_SLEEP_MODE;
  541. if (arg & PUBCP_SLEEP)
  542. val |= PUBCP_SLEEP_MODE;
  543. if (arg & TGLDSP_SLEEP)
  544. val |= TGLDSP_SLEEP_MODE;
  545. if (arg & AGDSP_SLEEP)
  546. val |= AGDSP_SLEEP_MODE;
  547. mask = SLEEP_MODE_MASK;
  548. shift = SLEEP_MODE_SHIFT;
  549. break;
  550. case PIN_CONFIG_INPUT_ENABLE:
  551. if (is_sleep_config == true) {
  552. if (arg > 0)
  553. val |= SLEEP_INPUT;
  554. else
  555. val &= ~SLEEP_INPUT;
  556. mask = SLEEP_INPUT_MASK;
  557. shift = SLEEP_INPUT_SHIFT;
  558. }
  559. break;
  560. case PIN_CONFIG_OUTPUT:
  561. if (is_sleep_config == true) {
  562. val |= SLEEP_OUTPUT;
  563. mask = SLEEP_OUTPUT_MASK;
  564. shift = SLEEP_OUTPUT_SHIFT;
  565. }
  566. break;
  567. case PIN_CONFIG_SLEEP_HARDWARE_STATE:
  568. continue;
  569. default:
  570. return -ENOTSUPP;
  571. }
  572. } else if (pin->type == MISC_PIN) {
  573. switch (param) {
  574. case PIN_CONFIG_DRIVE_STRENGTH:
  575. if (arg < 2 || arg > 60)
  576. return -EINVAL;
  577. val = sprd_pinconf_drive(arg);
  578. mask = DRIVE_STRENGTH_MASK;
  579. shift = DRIVE_STRENGTH_SHIFT;
  580. break;
  581. case PIN_CONFIG_BIAS_PULL_DOWN:
  582. if (is_sleep_config == true) {
  583. val |= SLEEP_PULL_DOWN;
  584. mask = SLEEP_PULL_DOWN_MASK;
  585. shift = SLEEP_PULL_DOWN_SHIFT;
  586. } else {
  587. val |= PULL_DOWN;
  588. mask = PULL_DOWN_MASK;
  589. shift = PULL_DOWN_SHIFT;
  590. }
  591. break;
  592. case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
  593. if (arg > 0)
  594. val |= INPUT_SCHMITT;
  595. else
  596. val &= ~INPUT_SCHMITT;
  597. mask = INPUT_SCHMITT_MASK;
  598. shift = INPUT_SCHMITT_SHIFT;
  599. break;
  600. case PIN_CONFIG_BIAS_PULL_UP:
  601. if (is_sleep_config == true) {
  602. val |= SLEEP_PULL_UP;
  603. mask = SLEEP_PULL_UP_MASK;
  604. shift = SLEEP_PULL_UP_SHIFT;
  605. } else {
  606. if (arg == 20000)
  607. val |= PULL_UP_20K;
  608. else if (arg == 4700)
  609. val |= PULL_UP_4_7K;
  610. mask = PULL_UP_MASK;
  611. shift = PULL_UP_SHIFT;
  612. }
  613. break;
  614. case PIN_CONFIG_SLEEP_HARDWARE_STATE:
  615. continue;
  616. default:
  617. return -ENOTSUPP;
  618. }
  619. } else {
  620. return -ENOTSUPP;
  621. }
  622. if (pin->type == GLOBAL_CTRL_PIN) {
  623. reg = readl((void __iomem *)pin->reg);
  624. reg &= ~(PINCTRL_BIT_MASK(pin->bit_width)
  625. << pin->bit_offset);
  626. reg |= (val & PINCTRL_BIT_MASK(pin->bit_width))
  627. << pin->bit_offset;
  628. writel(reg, (void __iomem *)pin->reg);
  629. } else {
  630. reg = readl((void __iomem *)pin->reg);
  631. reg &= ~(mask << shift);
  632. reg |= val;
  633. writel(reg, (void __iomem *)pin->reg);
  634. }
  635. }
  636. return 0;
  637. }
  638. static int sprd_pinconf_group_get(struct pinctrl_dev *pctldev,
  639. unsigned int selector, unsigned long *config)
  640. {
  641. struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  642. struct sprd_pinctrl_soc_info *info = pctl->info;
  643. struct sprd_pin_group *grp;
  644. unsigned int pin_id;
  645. if (selector >= info->ngroups)
  646. return -EINVAL;
  647. grp = &info->groups[selector];
  648. pin_id = grp->pins[0];
  649. return sprd_pinconf_get(pctldev, pin_id, config);
  650. }
  651. static int sprd_pinconf_group_set(struct pinctrl_dev *pctldev,
  652. unsigned int selector,
  653. unsigned long *configs,
  654. unsigned int num_configs)
  655. {
  656. struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  657. struct sprd_pinctrl_soc_info *info = pctl->info;
  658. struct sprd_pin_group *grp;
  659. int ret, i;
  660. if (selector >= info->ngroups)
  661. return -EINVAL;
  662. grp = &info->groups[selector];
  663. for (i = 0; i < grp->npins; i++) {
  664. unsigned int pin_id = grp->pins[i];
  665. ret = sprd_pinconf_set(pctldev, pin_id, configs, num_configs);
  666. if (ret)
  667. return ret;
  668. }
  669. return 0;
  670. }
  671. static int sprd_pinconf_get_config(struct pinctrl_dev *pctldev,
  672. unsigned int pin_id,
  673. unsigned long *config)
  674. {
  675. struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  676. struct sprd_pin *pin = sprd_pinctrl_get_pin_by_id(pctl, pin_id);
  677. if (!pin)
  678. return -EINVAL;
  679. if (pin->type == GLOBAL_CTRL_PIN) {
  680. *config = (readl((void __iomem *)pin->reg) >>
  681. pin->bit_offset) & PINCTRL_BIT_MASK(pin->bit_width);
  682. } else {
  683. *config = readl((void __iomem *)pin->reg);
  684. }
  685. return 0;
  686. }
  687. static void sprd_pinconf_dbg_show(struct pinctrl_dev *pctldev,
  688. struct seq_file *s, unsigned int pin_id)
  689. {
  690. unsigned long config;
  691. int ret;
  692. ret = sprd_pinconf_get_config(pctldev, pin_id, &config);
  693. if (ret)
  694. return;
  695. seq_printf(s, "0x%lx", config);
  696. }
  697. static void sprd_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
  698. struct seq_file *s,
  699. unsigned int selector)
  700. {
  701. struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  702. struct sprd_pinctrl_soc_info *info = pctl->info;
  703. struct sprd_pin_group *grp;
  704. unsigned long config;
  705. const char *name;
  706. int i, ret;
  707. if (selector >= info->ngroups)
  708. return;
  709. grp = &info->groups[selector];
  710. seq_printf(s, "\n");
  711. for (i = 0; i < grp->npins; i++, config++) {
  712. unsigned int pin_id = grp->pins[i];
  713. name = pin_get_name(pctldev, pin_id);
  714. ret = sprd_pinconf_get_config(pctldev, pin_id, &config);
  715. if (ret)
  716. return;
  717. seq_printf(s, "%s: 0x%lx ", name, config);
  718. }
  719. }
  720. static const struct pinconf_ops sprd_pinconf_ops = {
  721. .is_generic = true,
  722. .pin_config_get = sprd_pinconf_get,
  723. .pin_config_set = sprd_pinconf_set,
  724. .pin_config_group_get = sprd_pinconf_group_get,
  725. .pin_config_group_set = sprd_pinconf_group_set,
  726. .pin_config_dbg_show = sprd_pinconf_dbg_show,
  727. .pin_config_group_dbg_show = sprd_pinconf_group_dbg_show,
  728. };
  729. static const struct pinconf_generic_params sprd_dt_params[] = {
  730. {"sprd,control", SPRD_PIN_CONFIG_CONTROL, 0},
  731. {"sprd,sleep-mode", SPRD_PIN_CONFIG_SLEEP_MODE, 0},
  732. };
  733. #ifdef CONFIG_DEBUG_FS
  734. static const struct pin_config_item sprd_conf_items[] = {
  735. PCONFDUMP(SPRD_PIN_CONFIG_CONTROL, "global control", NULL, true),
  736. PCONFDUMP(SPRD_PIN_CONFIG_SLEEP_MODE, "sleep mode", NULL, true),
  737. };
  738. #endif
  739. static struct pinctrl_desc sprd_pinctrl_desc = {
  740. .pctlops = &sprd_pctrl_ops,
  741. .pmxops = &sprd_pmx_ops,
  742. .confops = &sprd_pinconf_ops,
  743. .num_custom_params = ARRAY_SIZE(sprd_dt_params),
  744. .custom_params = sprd_dt_params,
  745. #ifdef CONFIG_DEBUG_FS
  746. .custom_conf_items = sprd_conf_items,
  747. #endif
  748. .owner = THIS_MODULE,
  749. };
  750. static int sprd_pinctrl_parse_groups(struct device_node *np,
  751. struct sprd_pinctrl *sprd_pctl,
  752. struct sprd_pin_group *grp)
  753. {
  754. struct property *prop;
  755. const char *pin_name;
  756. int ret, i = 0;
  757. ret = of_property_count_strings(np, "pins");
  758. if (ret < 0)
  759. return ret;
  760. grp->name = np->name;
  761. grp->npins = ret;
  762. grp->pins = devm_kzalloc(sprd_pctl->dev, grp->npins *
  763. sizeof(unsigned int), GFP_KERNEL);
  764. if (!grp->pins)
  765. return -ENOMEM;
  766. of_property_for_each_string(np, "pins", prop, pin_name) {
  767. ret = sprd_pinctrl_get_id_by_name(sprd_pctl, pin_name);
  768. if (ret >= 0)
  769. grp->pins[i++] = ret;
  770. }
  771. for (i = 0; i < grp->npins; i++) {
  772. dev_dbg(sprd_pctl->dev,
  773. "Group[%s] contains [%d] pins: id = %d\n",
  774. grp->name, grp->npins, grp->pins[i]);
  775. }
  776. return 0;
  777. }
  778. static unsigned int sprd_pinctrl_get_groups(struct device_node *np)
  779. {
  780. struct device_node *child;
  781. unsigned int group_cnt, cnt;
  782. group_cnt = of_get_child_count(np);
  783. for_each_child_of_node(np, child) {
  784. cnt = of_get_child_count(child);
  785. if (cnt > 0)
  786. group_cnt += cnt;
  787. }
  788. return group_cnt;
  789. }
  790. static int sprd_pinctrl_parse_dt(struct sprd_pinctrl *sprd_pctl)
  791. {
  792. struct sprd_pinctrl_soc_info *info = sprd_pctl->info;
  793. struct device_node *np = sprd_pctl->dev->of_node;
  794. struct device_node *child, *sub_child;
  795. struct sprd_pin_group *grp;
  796. const char **temp;
  797. int ret;
  798. if (!np)
  799. return -ENODEV;
  800. info->ngroups = sprd_pinctrl_get_groups(np);
  801. if (!info->ngroups)
  802. return 0;
  803. info->groups = devm_kzalloc(sprd_pctl->dev, info->ngroups *
  804. sizeof(struct sprd_pin_group),
  805. GFP_KERNEL);
  806. if (!info->groups)
  807. return -ENOMEM;
  808. info->grp_names = devm_kzalloc(sprd_pctl->dev,
  809. info->ngroups * sizeof(char *),
  810. GFP_KERNEL);
  811. if (!info->grp_names)
  812. return -ENOMEM;
  813. temp = info->grp_names;
  814. grp = info->groups;
  815. for_each_child_of_node(np, child) {
  816. ret = sprd_pinctrl_parse_groups(child, sprd_pctl, grp);
  817. if (ret)
  818. return ret;
  819. *temp++ = grp->name;
  820. grp++;
  821. if (of_get_child_count(child) > 0) {
  822. for_each_child_of_node(child, sub_child) {
  823. ret = sprd_pinctrl_parse_groups(sub_child,
  824. sprd_pctl, grp);
  825. if (ret)
  826. return ret;
  827. *temp++ = grp->name;
  828. grp++;
  829. }
  830. }
  831. }
  832. return 0;
  833. }
  834. static int sprd_pinctrl_add_pins(struct sprd_pinctrl *sprd_pctl,
  835. struct sprd_pins_info *sprd_soc_pin_info,
  836. int pins_cnt)
  837. {
  838. struct sprd_pinctrl_soc_info *info = sprd_pctl->info;
  839. unsigned int ctrl_pin = 0, com_pin = 0;
  840. struct sprd_pin *pin;
  841. int i;
  842. info->npins = pins_cnt;
  843. info->pins = devm_kzalloc(sprd_pctl->dev,
  844. info->npins * sizeof(struct sprd_pin),
  845. GFP_KERNEL);
  846. if (!info->pins)
  847. return -ENOMEM;
  848. for (i = 0, pin = info->pins; i < info->npins; i++, pin++) {
  849. unsigned int reg;
  850. pin->name = sprd_soc_pin_info[i].name;
  851. pin->type = sprd_soc_pin_info[i].type;
  852. pin->number = sprd_soc_pin_info[i].num;
  853. reg = sprd_soc_pin_info[i].reg;
  854. if (pin->type == GLOBAL_CTRL_PIN) {
  855. pin->reg = (unsigned long)sprd_pctl->base +
  856. PINCTRL_REG_LEN * reg;
  857. pin->bit_offset = sprd_soc_pin_info[i].bit_offset;
  858. pin->bit_width = sprd_soc_pin_info[i].bit_width;
  859. ctrl_pin++;
  860. } else if (pin->type == COMMON_PIN) {
  861. pin->reg = (unsigned long)sprd_pctl->base +
  862. PINCTRL_REG_OFFSET + PINCTRL_REG_LEN *
  863. (i - ctrl_pin);
  864. com_pin++;
  865. } else if (pin->type == MISC_PIN) {
  866. pin->reg = (unsigned long)sprd_pctl->base +
  867. PINCTRL_REG_MISC_OFFSET + PINCTRL_REG_LEN *
  868. (i - ctrl_pin - com_pin);
  869. }
  870. }
  871. for (i = 0, pin = info->pins; i < info->npins; pin++, i++) {
  872. dev_dbg(sprd_pctl->dev, "pin name[%s-%d], type = %d, "
  873. "bit offset = %ld, bit width = %ld, reg = 0x%lx\n",
  874. pin->name, pin->number, pin->type,
  875. pin->bit_offset, pin->bit_width, pin->reg);
  876. }
  877. return 0;
  878. }
  879. int sprd_pinctrl_core_probe(struct platform_device *pdev,
  880. struct sprd_pins_info *sprd_soc_pin_info,
  881. int pins_cnt)
  882. {
  883. struct sprd_pinctrl *sprd_pctl;
  884. struct sprd_pinctrl_soc_info *pinctrl_info;
  885. struct pinctrl_pin_desc *pin_desc;
  886. struct resource *res;
  887. int ret, i;
  888. sprd_pctl = devm_kzalloc(&pdev->dev, sizeof(struct sprd_pinctrl),
  889. GFP_KERNEL);
  890. if (!sprd_pctl)
  891. return -ENOMEM;
  892. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  893. sprd_pctl->base = devm_ioremap_resource(&pdev->dev, res);
  894. if (IS_ERR(sprd_pctl->base))
  895. return PTR_ERR(sprd_pctl->base);
  896. pinctrl_info = devm_kzalloc(&pdev->dev,
  897. sizeof(struct sprd_pinctrl_soc_info),
  898. GFP_KERNEL);
  899. if (!pinctrl_info)
  900. return -ENOMEM;
  901. sprd_pctl->info = pinctrl_info;
  902. sprd_pctl->dev = &pdev->dev;
  903. platform_set_drvdata(pdev, sprd_pctl);
  904. ret = sprd_pinctrl_add_pins(sprd_pctl, sprd_soc_pin_info, pins_cnt);
  905. if (ret) {
  906. dev_err(&pdev->dev, "fail to add pins information\n");
  907. return ret;
  908. }
  909. pin_desc = devm_kzalloc(&pdev->dev, pinctrl_info->npins *
  910. sizeof(struct pinctrl_pin_desc),
  911. GFP_KERNEL);
  912. if (!pin_desc)
  913. return -ENOMEM;
  914. for (i = 0; i < pinctrl_info->npins; i++) {
  915. pin_desc[i].number = pinctrl_info->pins[i].number;
  916. pin_desc[i].name = pinctrl_info->pins[i].name;
  917. pin_desc[i].drv_data = pinctrl_info;
  918. }
  919. sprd_pinctrl_desc.pins = pin_desc;
  920. sprd_pinctrl_desc.name = dev_name(&pdev->dev);
  921. sprd_pinctrl_desc.npins = pinctrl_info->npins;
  922. sprd_pctl->pctl = pinctrl_register(&sprd_pinctrl_desc,
  923. &pdev->dev, (void *)sprd_pctl);
  924. if (IS_ERR(sprd_pctl->pctl)) {
  925. dev_err(&pdev->dev, "could not register pinctrl driver\n");
  926. return PTR_ERR(sprd_pctl->pctl);
  927. }
  928. ret = sprd_pinctrl_parse_dt(sprd_pctl);
  929. if (ret) {
  930. dev_err(&pdev->dev, "fail to parse dt properties\n");
  931. pinctrl_unregister(sprd_pctl->pctl);
  932. return ret;
  933. }
  934. return 0;
  935. }
  936. int sprd_pinctrl_remove(struct platform_device *pdev)
  937. {
  938. struct sprd_pinctrl *sprd_pctl = platform_get_drvdata(pdev);
  939. pinctrl_unregister(sprd_pctl->pctl);
  940. return 0;
  941. }
  942. void sprd_pinctrl_shutdown(struct platform_device *pdev)
  943. {
  944. struct pinctrl *pinctl;
  945. struct pinctrl_state *state;
  946. pinctl = devm_pinctrl_get(&pdev->dev);
  947. if (IS_ERR(pinctl))
  948. return;
  949. state = pinctrl_lookup_state(pinctl, "shutdown");
  950. if (IS_ERR(state))
  951. return;
  952. pinctrl_select_state(pinctl, state);
  953. }
  954. MODULE_DESCRIPTION("SPREADTRUM Pin Controller Driver");
  955. MODULE_AUTHOR("Baolin Wang <baolin.wang@spreadtrum.com>");
  956. MODULE_LICENSE("GPL v2");