pinctrl-sprd.c 26 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118
  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. #define SPRD_PIN_CONFIG_CONTROL (PIN_CONFIG_END + 1)
  143. #define SPRD_PIN_CONFIG_SLEEP_MODE (PIN_CONFIG_END + 2)
  144. static int sprd_pinctrl_get_id_by_name(struct sprd_pinctrl *sprd_pctl,
  145. const char *name)
  146. {
  147. struct sprd_pinctrl_soc_info *info = sprd_pctl->info;
  148. int i;
  149. for (i = 0; i < info->npins; i++) {
  150. if (!strcmp(info->pins[i].name, name))
  151. return info->pins[i].number;
  152. }
  153. return -ENODEV;
  154. }
  155. static struct sprd_pin *
  156. sprd_pinctrl_get_pin_by_id(struct sprd_pinctrl *sprd_pctl, unsigned int id)
  157. {
  158. struct sprd_pinctrl_soc_info *info = sprd_pctl->info;
  159. struct sprd_pin *pin = NULL;
  160. int i;
  161. for (i = 0; i < info->npins; i++) {
  162. if (info->pins[i].number == id) {
  163. pin = &info->pins[i];
  164. break;
  165. }
  166. }
  167. return pin;
  168. }
  169. static const struct sprd_pin_group *
  170. sprd_pinctrl_find_group_by_name(struct sprd_pinctrl *sprd_pctl,
  171. const char *name)
  172. {
  173. struct sprd_pinctrl_soc_info *info = sprd_pctl->info;
  174. const struct sprd_pin_group *grp = NULL;
  175. int i;
  176. for (i = 0; i < info->ngroups; i++) {
  177. if (!strcmp(info->groups[i].name, name)) {
  178. grp = &info->groups[i];
  179. break;
  180. }
  181. }
  182. return grp;
  183. }
  184. static int sprd_pctrl_group_count(struct pinctrl_dev *pctldev)
  185. {
  186. struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  187. struct sprd_pinctrl_soc_info *info = pctl->info;
  188. return info->ngroups;
  189. }
  190. static const char *sprd_pctrl_group_name(struct pinctrl_dev *pctldev,
  191. unsigned int selector)
  192. {
  193. struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  194. struct sprd_pinctrl_soc_info *info = pctl->info;
  195. return info->groups[selector].name;
  196. }
  197. static int sprd_pctrl_group_pins(struct pinctrl_dev *pctldev,
  198. unsigned int selector,
  199. const unsigned int **pins,
  200. unsigned int *npins)
  201. {
  202. struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  203. struct sprd_pinctrl_soc_info *info = pctl->info;
  204. if (selector >= info->ngroups)
  205. return -EINVAL;
  206. *pins = info->groups[selector].pins;
  207. *npins = info->groups[selector].npins;
  208. return 0;
  209. }
  210. static int sprd_dt_node_to_map(struct pinctrl_dev *pctldev,
  211. struct device_node *np,
  212. struct pinctrl_map **map,
  213. unsigned int *num_maps)
  214. {
  215. struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  216. const struct sprd_pin_group *grp;
  217. unsigned long *configs = NULL;
  218. unsigned int num_configs = 0;
  219. unsigned int reserved_maps = 0;
  220. unsigned int reserve = 0;
  221. const char *function;
  222. enum pinctrl_map_type type;
  223. int ret;
  224. grp = sprd_pinctrl_find_group_by_name(pctl, np->name);
  225. if (!grp) {
  226. dev_err(pctl->dev, "unable to find group for node %s\n",
  227. of_node_full_name(np));
  228. return -EINVAL;
  229. }
  230. ret = of_property_count_strings(np, "pins");
  231. if (ret < 0)
  232. return ret;
  233. if (ret == 1)
  234. type = PIN_MAP_TYPE_CONFIGS_PIN;
  235. else
  236. type = PIN_MAP_TYPE_CONFIGS_GROUP;
  237. ret = of_property_read_string(np, "function", &function);
  238. if (ret < 0) {
  239. if (ret != -EINVAL)
  240. dev_err(pctl->dev,
  241. "%s: could not parse property function\n",
  242. of_node_full_name(np));
  243. function = NULL;
  244. }
  245. ret = pinconf_generic_parse_dt_config(np, pctldev, &configs,
  246. &num_configs);
  247. if (ret < 0) {
  248. dev_err(pctl->dev, "%s: could not parse node property\n",
  249. of_node_full_name(np));
  250. return ret;
  251. }
  252. *map = NULL;
  253. *num_maps = 0;
  254. if (function != NULL)
  255. reserve++;
  256. if (num_configs)
  257. reserve++;
  258. ret = pinctrl_utils_reserve_map(pctldev, map, &reserved_maps,
  259. num_maps, reserve);
  260. if (ret < 0)
  261. goto out;
  262. if (function) {
  263. ret = pinctrl_utils_add_map_mux(pctldev, map,
  264. &reserved_maps, num_maps,
  265. grp->name, function);
  266. if (ret < 0)
  267. goto out;
  268. }
  269. if (num_configs) {
  270. const char *group_or_pin;
  271. unsigned int pin_id;
  272. if (type == PIN_MAP_TYPE_CONFIGS_PIN) {
  273. pin_id = grp->pins[0];
  274. group_or_pin = pin_get_name(pctldev, pin_id);
  275. } else {
  276. group_or_pin = grp->name;
  277. }
  278. ret = pinctrl_utils_add_map_configs(pctldev, map,
  279. &reserved_maps, num_maps,
  280. group_or_pin, configs,
  281. num_configs, type);
  282. }
  283. out:
  284. kfree(configs);
  285. return ret;
  286. }
  287. static void sprd_pctrl_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s,
  288. unsigned int offset)
  289. {
  290. seq_printf(s, "%s", dev_name(pctldev->dev));
  291. }
  292. static const struct pinctrl_ops sprd_pctrl_ops = {
  293. .get_groups_count = sprd_pctrl_group_count,
  294. .get_group_name = sprd_pctrl_group_name,
  295. .get_group_pins = sprd_pctrl_group_pins,
  296. .pin_dbg_show = sprd_pctrl_dbg_show,
  297. .dt_node_to_map = sprd_dt_node_to_map,
  298. .dt_free_map = pinctrl_utils_free_map,
  299. };
  300. static int sprd_pmx_get_function_count(struct pinctrl_dev *pctldev)
  301. {
  302. return PIN_FUNC_MAX;
  303. }
  304. static const char *sprd_pmx_get_function_name(struct pinctrl_dev *pctldev,
  305. unsigned int selector)
  306. {
  307. switch (selector) {
  308. case PIN_FUNC_1:
  309. return "func1";
  310. case PIN_FUNC_2:
  311. return "func2";
  312. case PIN_FUNC_3:
  313. return "func3";
  314. case PIN_FUNC_4:
  315. return "func4";
  316. default:
  317. return "null";
  318. }
  319. }
  320. static int sprd_pmx_get_function_groups(struct pinctrl_dev *pctldev,
  321. unsigned int selector,
  322. const char * const **groups,
  323. unsigned int * const num_groups)
  324. {
  325. struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  326. struct sprd_pinctrl_soc_info *info = pctl->info;
  327. *groups = info->grp_names;
  328. *num_groups = info->ngroups;
  329. return 0;
  330. }
  331. static int sprd_pmx_set_mux(struct pinctrl_dev *pctldev,
  332. unsigned int func_selector,
  333. unsigned int group_selector)
  334. {
  335. struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  336. struct sprd_pinctrl_soc_info *info = pctl->info;
  337. struct sprd_pin_group *grp = &info->groups[group_selector];
  338. unsigned int i, grp_pins = grp->npins;
  339. unsigned long reg;
  340. unsigned int val = 0;
  341. if (group_selector >= info->ngroups)
  342. return -EINVAL;
  343. switch (func_selector) {
  344. case PIN_FUNC_1:
  345. val &= PIN_FUNC_SEL_1;
  346. break;
  347. case PIN_FUNC_2:
  348. val |= PIN_FUNC_SEL_2;
  349. break;
  350. case PIN_FUNC_3:
  351. val |= PIN_FUNC_SEL_3;
  352. break;
  353. case PIN_FUNC_4:
  354. val |= PIN_FUNC_SEL_4;
  355. break;
  356. default:
  357. break;
  358. }
  359. for (i = 0; i < grp_pins; i++) {
  360. unsigned int pin_id = grp->pins[i];
  361. struct sprd_pin *pin = sprd_pinctrl_get_pin_by_id(pctl, pin_id);
  362. if (!pin || pin->type != COMMON_PIN)
  363. continue;
  364. reg = readl((void __iomem *)pin->reg);
  365. reg &= ~PIN_FUNC_MASK;
  366. reg |= val;
  367. writel(reg, (void __iomem *)pin->reg);
  368. }
  369. return 0;
  370. }
  371. static const struct pinmux_ops sprd_pmx_ops = {
  372. .get_functions_count = sprd_pmx_get_function_count,
  373. .get_function_name = sprd_pmx_get_function_name,
  374. .get_function_groups = sprd_pmx_get_function_groups,
  375. .set_mux = sprd_pmx_set_mux,
  376. };
  377. static int sprd_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin_id,
  378. unsigned long *config)
  379. {
  380. struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  381. struct sprd_pin *pin = sprd_pinctrl_get_pin_by_id(pctl, pin_id);
  382. unsigned int param = pinconf_to_config_param(*config);
  383. unsigned int reg, arg;
  384. if (!pin)
  385. return -EINVAL;
  386. if (pin->type == GLOBAL_CTRL_PIN) {
  387. reg = (readl((void __iomem *)pin->reg) >>
  388. pin->bit_offset) & PINCTRL_BIT_MASK(pin->bit_width);
  389. } else {
  390. reg = readl((void __iomem *)pin->reg);
  391. }
  392. if (pin->type == GLOBAL_CTRL_PIN &&
  393. param == SPRD_PIN_CONFIG_CONTROL) {
  394. arg = reg;
  395. } else if (pin->type == COMMON_PIN) {
  396. switch (param) {
  397. case SPRD_PIN_CONFIG_SLEEP_MODE:
  398. arg = (reg >> SLEEP_MODE_SHIFT) & SLEEP_MODE_MASK;
  399. break;
  400. case PIN_CONFIG_INPUT_ENABLE:
  401. arg = (reg >> SLEEP_INPUT_SHIFT) & SLEEP_INPUT_MASK;
  402. break;
  403. case PIN_CONFIG_OUTPUT:
  404. arg = reg & SLEEP_OUTPUT_MASK;
  405. break;
  406. case PIN_CONFIG_SLEEP_HARDWARE_STATE:
  407. arg = 0;
  408. break;
  409. default:
  410. return -ENOTSUPP;
  411. }
  412. } else if (pin->type == MISC_PIN) {
  413. switch (param) {
  414. case PIN_CONFIG_DRIVE_STRENGTH:
  415. arg = (reg >> DRIVE_STRENGTH_SHIFT) &
  416. DRIVE_STRENGTH_MASK;
  417. break;
  418. case PIN_CONFIG_BIAS_PULL_DOWN:
  419. /* combine sleep pull down and pull down config */
  420. arg = ((reg >> SLEEP_PULL_DOWN_SHIFT) &
  421. SLEEP_PULL_DOWN_MASK) << 16;
  422. arg |= (reg >> PULL_DOWN_SHIFT) & PULL_DOWN_MASK;
  423. break;
  424. case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
  425. arg = (reg >> INPUT_SCHMITT_SHIFT) & INPUT_SCHMITT_MASK;
  426. break;
  427. case PIN_CONFIG_BIAS_PULL_UP:
  428. /* combine sleep pull up and pull up config */
  429. arg = ((reg >> SLEEP_PULL_UP_SHIFT) &
  430. SLEEP_PULL_UP_MASK) << 16;
  431. arg |= (reg >> PULL_UP_SHIFT) & PULL_UP_MASK;
  432. break;
  433. case PIN_CONFIG_SLEEP_HARDWARE_STATE:
  434. arg = 0;
  435. break;
  436. default:
  437. return -ENOTSUPP;
  438. }
  439. } else {
  440. return -ENOTSUPP;
  441. }
  442. *config = pinconf_to_config_packed(param, arg);
  443. return 0;
  444. }
  445. static unsigned int sprd_pinconf_drive(unsigned int mA)
  446. {
  447. unsigned int val = 0;
  448. switch (mA) {
  449. case 2:
  450. break;
  451. case 4:
  452. val |= BIT(19);
  453. break;
  454. case 6:
  455. val |= BIT(20);
  456. break;
  457. case 8:
  458. val |= BIT(19) | BIT(20);
  459. break;
  460. case 10:
  461. val |= BIT(21);
  462. break;
  463. case 12:
  464. val |= BIT(21) | BIT(19);
  465. break;
  466. case 14:
  467. val |= BIT(21) | BIT(20);
  468. break;
  469. case 16:
  470. val |= BIT(19) | BIT(20) | BIT(21);
  471. break;
  472. case 20:
  473. val |= BIT(22);
  474. break;
  475. case 21:
  476. val |= BIT(22) | BIT(19);
  477. break;
  478. case 24:
  479. val |= BIT(22) | BIT(20);
  480. break;
  481. case 25:
  482. val |= BIT(22) | BIT(20) | BIT(19);
  483. break;
  484. case 27:
  485. val |= BIT(22) | BIT(21);
  486. break;
  487. case 29:
  488. val |= BIT(22) | BIT(21) | BIT(19);
  489. break;
  490. case 31:
  491. val |= BIT(22) | BIT(21) | BIT(20);
  492. break;
  493. case 33:
  494. val |= BIT(22) | BIT(21) | BIT(20) | BIT(19);
  495. break;
  496. default:
  497. break;
  498. }
  499. return val;
  500. }
  501. static bool sprd_pinctrl_check_sleep_config(unsigned long *configs,
  502. unsigned int num_configs)
  503. {
  504. unsigned int param;
  505. int i;
  506. for (i = 0; i < num_configs; i++) {
  507. param = pinconf_to_config_param(configs[i]);
  508. if (param == PIN_CONFIG_SLEEP_HARDWARE_STATE)
  509. return true;
  510. }
  511. return false;
  512. }
  513. static int sprd_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin_id,
  514. unsigned long *configs, unsigned int num_configs)
  515. {
  516. struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  517. struct sprd_pin *pin = sprd_pinctrl_get_pin_by_id(pctl, pin_id);
  518. bool is_sleep_config;
  519. unsigned long reg;
  520. int i;
  521. if (!pin)
  522. return -EINVAL;
  523. is_sleep_config = sprd_pinctrl_check_sleep_config(configs, num_configs);
  524. for (i = 0; i < num_configs; i++) {
  525. unsigned int param, arg, shift, mask, val;
  526. param = pinconf_to_config_param(configs[i]);
  527. arg = pinconf_to_config_argument(configs[i]);
  528. val = 0;
  529. shift = 0;
  530. mask = 0;
  531. if (pin->type == GLOBAL_CTRL_PIN &&
  532. param == SPRD_PIN_CONFIG_CONTROL) {
  533. val = arg;
  534. } else if (pin->type == COMMON_PIN) {
  535. switch (param) {
  536. case SPRD_PIN_CONFIG_SLEEP_MODE:
  537. if (arg & AP_SLEEP)
  538. val |= AP_SLEEP_MODE;
  539. if (arg & PUBCP_SLEEP)
  540. val |= PUBCP_SLEEP_MODE;
  541. if (arg & TGLDSP_SLEEP)
  542. val |= TGLDSP_SLEEP_MODE;
  543. if (arg & AGDSP_SLEEP)
  544. val |= AGDSP_SLEEP_MODE;
  545. mask = SLEEP_MODE_MASK;
  546. shift = SLEEP_MODE_SHIFT;
  547. break;
  548. case PIN_CONFIG_INPUT_ENABLE:
  549. if (is_sleep_config == true) {
  550. if (arg > 0)
  551. val |= SLEEP_INPUT;
  552. else
  553. val &= ~SLEEP_INPUT;
  554. mask = SLEEP_INPUT_MASK;
  555. shift = SLEEP_INPUT_SHIFT;
  556. }
  557. break;
  558. case PIN_CONFIG_OUTPUT:
  559. if (is_sleep_config == true) {
  560. val |= SLEEP_OUTPUT;
  561. mask = SLEEP_OUTPUT_MASK;
  562. shift = SLEEP_OUTPUT_SHIFT;
  563. }
  564. break;
  565. case PIN_CONFIG_SLEEP_HARDWARE_STATE:
  566. continue;
  567. default:
  568. return -ENOTSUPP;
  569. }
  570. } else if (pin->type == MISC_PIN) {
  571. switch (param) {
  572. case PIN_CONFIG_DRIVE_STRENGTH:
  573. if (arg < 2 || arg > 60)
  574. return -EINVAL;
  575. val = sprd_pinconf_drive(arg);
  576. mask = DRIVE_STRENGTH_MASK;
  577. shift = DRIVE_STRENGTH_SHIFT;
  578. break;
  579. case PIN_CONFIG_BIAS_PULL_DOWN:
  580. if (is_sleep_config == true) {
  581. val |= SLEEP_PULL_DOWN;
  582. mask = SLEEP_PULL_DOWN_MASK;
  583. shift = SLEEP_PULL_DOWN_SHIFT;
  584. } else {
  585. val |= PULL_DOWN;
  586. mask = PULL_DOWN_MASK;
  587. shift = PULL_DOWN_SHIFT;
  588. }
  589. break;
  590. case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
  591. if (arg > 0)
  592. val |= INPUT_SCHMITT;
  593. else
  594. val &= ~INPUT_SCHMITT;
  595. mask = INPUT_SCHMITT_MASK;
  596. shift = INPUT_SCHMITT_SHIFT;
  597. break;
  598. case PIN_CONFIG_BIAS_PULL_UP:
  599. if (is_sleep_config == true) {
  600. val |= SLEEP_PULL_UP;
  601. mask = SLEEP_PULL_UP_MASK;
  602. shift = SLEEP_PULL_UP_SHIFT;
  603. } else {
  604. if (arg == 20000)
  605. val |= PULL_UP_20K;
  606. else if (arg == 4700)
  607. val |= PULL_UP_4_7K;
  608. mask = PULL_UP_MASK;
  609. shift = PULL_UP_SHIFT;
  610. }
  611. break;
  612. case PIN_CONFIG_SLEEP_HARDWARE_STATE:
  613. continue;
  614. default:
  615. return -ENOTSUPP;
  616. }
  617. } else {
  618. return -ENOTSUPP;
  619. }
  620. if (pin->type == GLOBAL_CTRL_PIN) {
  621. reg = readl((void __iomem *)pin->reg);
  622. reg &= ~(PINCTRL_BIT_MASK(pin->bit_width)
  623. << pin->bit_offset);
  624. reg |= (val & PINCTRL_BIT_MASK(pin->bit_width))
  625. << pin->bit_offset;
  626. writel(reg, (void __iomem *)pin->reg);
  627. } else {
  628. reg = readl((void __iomem *)pin->reg);
  629. reg &= ~(mask << shift);
  630. reg |= val;
  631. writel(reg, (void __iomem *)pin->reg);
  632. }
  633. }
  634. return 0;
  635. }
  636. static int sprd_pinconf_group_get(struct pinctrl_dev *pctldev,
  637. unsigned int selector, unsigned long *config)
  638. {
  639. struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  640. struct sprd_pinctrl_soc_info *info = pctl->info;
  641. struct sprd_pin_group *grp;
  642. unsigned int pin_id;
  643. if (selector >= info->ngroups)
  644. return -EINVAL;
  645. grp = &info->groups[selector];
  646. pin_id = grp->pins[0];
  647. return sprd_pinconf_get(pctldev, pin_id, config);
  648. }
  649. static int sprd_pinconf_group_set(struct pinctrl_dev *pctldev,
  650. unsigned int selector,
  651. unsigned long *configs,
  652. unsigned int num_configs)
  653. {
  654. struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  655. struct sprd_pinctrl_soc_info *info = pctl->info;
  656. struct sprd_pin_group *grp;
  657. int ret, i;
  658. if (selector >= info->ngroups)
  659. return -EINVAL;
  660. grp = &info->groups[selector];
  661. for (i = 0; i < grp->npins; i++) {
  662. unsigned int pin_id = grp->pins[i];
  663. ret = sprd_pinconf_set(pctldev, pin_id, configs, num_configs);
  664. if (ret)
  665. return ret;
  666. }
  667. return 0;
  668. }
  669. static int sprd_pinconf_get_config(struct pinctrl_dev *pctldev,
  670. unsigned int pin_id,
  671. unsigned long *config)
  672. {
  673. struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  674. struct sprd_pin *pin = sprd_pinctrl_get_pin_by_id(pctl, pin_id);
  675. if (!pin)
  676. return -EINVAL;
  677. if (pin->type == GLOBAL_CTRL_PIN) {
  678. *config = (readl((void __iomem *)pin->reg) >>
  679. pin->bit_offset) & PINCTRL_BIT_MASK(pin->bit_width);
  680. } else {
  681. *config = readl((void __iomem *)pin->reg);
  682. }
  683. return 0;
  684. }
  685. static void sprd_pinconf_dbg_show(struct pinctrl_dev *pctldev,
  686. struct seq_file *s, unsigned int pin_id)
  687. {
  688. unsigned long config;
  689. int ret;
  690. ret = sprd_pinconf_get_config(pctldev, pin_id, &config);
  691. if (ret)
  692. return;
  693. seq_printf(s, "0x%lx", config);
  694. }
  695. static void sprd_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
  696. struct seq_file *s,
  697. unsigned int selector)
  698. {
  699. struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  700. struct sprd_pinctrl_soc_info *info = pctl->info;
  701. struct sprd_pin_group *grp;
  702. unsigned long config;
  703. const char *name;
  704. int i, ret;
  705. if (selector >= info->ngroups)
  706. return;
  707. grp = &info->groups[selector];
  708. seq_putc(s, '\n');
  709. for (i = 0; i < grp->npins; i++, config++) {
  710. unsigned int pin_id = grp->pins[i];
  711. name = pin_get_name(pctldev, pin_id);
  712. ret = sprd_pinconf_get_config(pctldev, pin_id, &config);
  713. if (ret)
  714. return;
  715. seq_printf(s, "%s: 0x%lx ", name, config);
  716. }
  717. }
  718. static const struct pinconf_ops sprd_pinconf_ops = {
  719. .is_generic = true,
  720. .pin_config_get = sprd_pinconf_get,
  721. .pin_config_set = sprd_pinconf_set,
  722. .pin_config_group_get = sprd_pinconf_group_get,
  723. .pin_config_group_set = sprd_pinconf_group_set,
  724. .pin_config_dbg_show = sprd_pinconf_dbg_show,
  725. .pin_config_group_dbg_show = sprd_pinconf_group_dbg_show,
  726. };
  727. static const struct pinconf_generic_params sprd_dt_params[] = {
  728. {"sprd,control", SPRD_PIN_CONFIG_CONTROL, 0},
  729. {"sprd,sleep-mode", SPRD_PIN_CONFIG_SLEEP_MODE, 0},
  730. };
  731. #ifdef CONFIG_DEBUG_FS
  732. static const struct pin_config_item sprd_conf_items[] = {
  733. PCONFDUMP(SPRD_PIN_CONFIG_CONTROL, "global control", NULL, true),
  734. PCONFDUMP(SPRD_PIN_CONFIG_SLEEP_MODE, "sleep mode", NULL, true),
  735. };
  736. #endif
  737. static struct pinctrl_desc sprd_pinctrl_desc = {
  738. .pctlops = &sprd_pctrl_ops,
  739. .pmxops = &sprd_pmx_ops,
  740. .confops = &sprd_pinconf_ops,
  741. .num_custom_params = ARRAY_SIZE(sprd_dt_params),
  742. .custom_params = sprd_dt_params,
  743. #ifdef CONFIG_DEBUG_FS
  744. .custom_conf_items = sprd_conf_items,
  745. #endif
  746. .owner = THIS_MODULE,
  747. };
  748. static int sprd_pinctrl_parse_groups(struct device_node *np,
  749. struct sprd_pinctrl *sprd_pctl,
  750. struct sprd_pin_group *grp)
  751. {
  752. struct property *prop;
  753. const char *pin_name;
  754. int ret, i = 0;
  755. ret = of_property_count_strings(np, "pins");
  756. if (ret < 0)
  757. return ret;
  758. grp->name = np->name;
  759. grp->npins = ret;
  760. grp->pins = devm_kcalloc(sprd_pctl->dev,
  761. grp->npins, sizeof(unsigned int),
  762. GFP_KERNEL);
  763. if (!grp->pins)
  764. return -ENOMEM;
  765. of_property_for_each_string(np, "pins", prop, pin_name) {
  766. ret = sprd_pinctrl_get_id_by_name(sprd_pctl, pin_name);
  767. if (ret >= 0)
  768. grp->pins[i++] = ret;
  769. }
  770. for (i = 0; i < grp->npins; i++) {
  771. dev_dbg(sprd_pctl->dev,
  772. "Group[%s] contains [%d] pins: id = %d\n",
  773. grp->name, grp->npins, grp->pins[i]);
  774. }
  775. return 0;
  776. }
  777. static unsigned int sprd_pinctrl_get_groups(struct device_node *np)
  778. {
  779. struct device_node *child;
  780. unsigned int group_cnt, cnt;
  781. group_cnt = of_get_child_count(np);
  782. for_each_child_of_node(np, child) {
  783. cnt = of_get_child_count(child);
  784. if (cnt > 0)
  785. group_cnt += cnt;
  786. }
  787. return group_cnt;
  788. }
  789. static int sprd_pinctrl_parse_dt(struct sprd_pinctrl *sprd_pctl)
  790. {
  791. struct sprd_pinctrl_soc_info *info = sprd_pctl->info;
  792. struct device_node *np = sprd_pctl->dev->of_node;
  793. struct device_node *child, *sub_child;
  794. struct sprd_pin_group *grp;
  795. const char **temp;
  796. int ret;
  797. if (!np)
  798. return -ENODEV;
  799. info->ngroups = sprd_pinctrl_get_groups(np);
  800. if (!info->ngroups)
  801. return 0;
  802. info->groups = devm_kcalloc(sprd_pctl->dev,
  803. info->ngroups,
  804. sizeof(struct sprd_pin_group),
  805. GFP_KERNEL);
  806. if (!info->groups)
  807. return -ENOMEM;
  808. info->grp_names = devm_kcalloc(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_kcalloc(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_kcalloc(&pdev->dev,
  910. pinctrl_info->npins,
  911. sizeof(struct pinctrl_pin_desc),
  912. GFP_KERNEL);
  913. if (!pin_desc)
  914. return -ENOMEM;
  915. for (i = 0; i < pinctrl_info->npins; i++) {
  916. pin_desc[i].number = pinctrl_info->pins[i].number;
  917. pin_desc[i].name = pinctrl_info->pins[i].name;
  918. pin_desc[i].drv_data = pinctrl_info;
  919. }
  920. sprd_pinctrl_desc.pins = pin_desc;
  921. sprd_pinctrl_desc.name = dev_name(&pdev->dev);
  922. sprd_pinctrl_desc.npins = pinctrl_info->npins;
  923. sprd_pctl->pctl = pinctrl_register(&sprd_pinctrl_desc,
  924. &pdev->dev, (void *)sprd_pctl);
  925. if (IS_ERR(sprd_pctl->pctl)) {
  926. dev_err(&pdev->dev, "could not register pinctrl driver\n");
  927. return PTR_ERR(sprd_pctl->pctl);
  928. }
  929. ret = sprd_pinctrl_parse_dt(sprd_pctl);
  930. if (ret) {
  931. dev_err(&pdev->dev, "fail to parse dt properties\n");
  932. pinctrl_unregister(sprd_pctl->pctl);
  933. return ret;
  934. }
  935. return 0;
  936. }
  937. int sprd_pinctrl_remove(struct platform_device *pdev)
  938. {
  939. struct sprd_pinctrl *sprd_pctl = platform_get_drvdata(pdev);
  940. pinctrl_unregister(sprd_pctl->pctl);
  941. return 0;
  942. }
  943. void sprd_pinctrl_shutdown(struct platform_device *pdev)
  944. {
  945. struct pinctrl *pinctl;
  946. struct pinctrl_state *state;
  947. pinctl = devm_pinctrl_get(&pdev->dev);
  948. if (IS_ERR(pinctl))
  949. return;
  950. state = pinctrl_lookup_state(pinctl, "shutdown");
  951. if (IS_ERR(state))
  952. return;
  953. pinctrl_select_state(pinctl, state);
  954. }
  955. MODULE_DESCRIPTION("SPREADTRUM Pin Controller Driver");
  956. MODULE_AUTHOR("Baolin Wang <baolin.wang@spreadtrum.com>");
  957. MODULE_LICENSE("GPL v2");