pinctrl-sprd.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119
  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_putc(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_kcalloc(sprd_pctl->dev,
  763. grp->npins, sizeof(unsigned int),
  764. GFP_KERNEL);
  765. if (!grp->pins)
  766. return -ENOMEM;
  767. of_property_for_each_string(np, "pins", prop, pin_name) {
  768. ret = sprd_pinctrl_get_id_by_name(sprd_pctl, pin_name);
  769. if (ret >= 0)
  770. grp->pins[i++] = ret;
  771. }
  772. for (i = 0; i < grp->npins; i++) {
  773. dev_dbg(sprd_pctl->dev,
  774. "Group[%s] contains [%d] pins: id = %d\n",
  775. grp->name, grp->npins, grp->pins[i]);
  776. }
  777. return 0;
  778. }
  779. static unsigned int sprd_pinctrl_get_groups(struct device_node *np)
  780. {
  781. struct device_node *child;
  782. unsigned int group_cnt, cnt;
  783. group_cnt = of_get_child_count(np);
  784. for_each_child_of_node(np, child) {
  785. cnt = of_get_child_count(child);
  786. if (cnt > 0)
  787. group_cnt += cnt;
  788. }
  789. return group_cnt;
  790. }
  791. static int sprd_pinctrl_parse_dt(struct sprd_pinctrl *sprd_pctl)
  792. {
  793. struct sprd_pinctrl_soc_info *info = sprd_pctl->info;
  794. struct device_node *np = sprd_pctl->dev->of_node;
  795. struct device_node *child, *sub_child;
  796. struct sprd_pin_group *grp;
  797. const char **temp;
  798. int ret;
  799. if (!np)
  800. return -ENODEV;
  801. info->ngroups = sprd_pinctrl_get_groups(np);
  802. if (!info->ngroups)
  803. return 0;
  804. info->groups = devm_kcalloc(sprd_pctl->dev,
  805. info->ngroups,
  806. sizeof(struct sprd_pin_group),
  807. GFP_KERNEL);
  808. if (!info->groups)
  809. return -ENOMEM;
  810. info->grp_names = devm_kcalloc(sprd_pctl->dev,
  811. info->ngroups, sizeof(char *),
  812. GFP_KERNEL);
  813. if (!info->grp_names)
  814. return -ENOMEM;
  815. temp = info->grp_names;
  816. grp = info->groups;
  817. for_each_child_of_node(np, child) {
  818. ret = sprd_pinctrl_parse_groups(child, sprd_pctl, grp);
  819. if (ret)
  820. return ret;
  821. *temp++ = grp->name;
  822. grp++;
  823. if (of_get_child_count(child) > 0) {
  824. for_each_child_of_node(child, sub_child) {
  825. ret = sprd_pinctrl_parse_groups(sub_child,
  826. sprd_pctl, grp);
  827. if (ret)
  828. return ret;
  829. *temp++ = grp->name;
  830. grp++;
  831. }
  832. }
  833. }
  834. return 0;
  835. }
  836. static int sprd_pinctrl_add_pins(struct sprd_pinctrl *sprd_pctl,
  837. struct sprd_pins_info *sprd_soc_pin_info,
  838. int pins_cnt)
  839. {
  840. struct sprd_pinctrl_soc_info *info = sprd_pctl->info;
  841. unsigned int ctrl_pin = 0, com_pin = 0;
  842. struct sprd_pin *pin;
  843. int i;
  844. info->npins = pins_cnt;
  845. info->pins = devm_kcalloc(sprd_pctl->dev,
  846. info->npins, sizeof(struct sprd_pin),
  847. GFP_KERNEL);
  848. if (!info->pins)
  849. return -ENOMEM;
  850. for (i = 0, pin = info->pins; i < info->npins; i++, pin++) {
  851. unsigned int reg;
  852. pin->name = sprd_soc_pin_info[i].name;
  853. pin->type = sprd_soc_pin_info[i].type;
  854. pin->number = sprd_soc_pin_info[i].num;
  855. reg = sprd_soc_pin_info[i].reg;
  856. if (pin->type == GLOBAL_CTRL_PIN) {
  857. pin->reg = (unsigned long)sprd_pctl->base +
  858. PINCTRL_REG_LEN * reg;
  859. pin->bit_offset = sprd_soc_pin_info[i].bit_offset;
  860. pin->bit_width = sprd_soc_pin_info[i].bit_width;
  861. ctrl_pin++;
  862. } else if (pin->type == COMMON_PIN) {
  863. pin->reg = (unsigned long)sprd_pctl->base +
  864. PINCTRL_REG_OFFSET + PINCTRL_REG_LEN *
  865. (i - ctrl_pin);
  866. com_pin++;
  867. } else if (pin->type == MISC_PIN) {
  868. pin->reg = (unsigned long)sprd_pctl->base +
  869. PINCTRL_REG_MISC_OFFSET + PINCTRL_REG_LEN *
  870. (i - ctrl_pin - com_pin);
  871. }
  872. }
  873. for (i = 0, pin = info->pins; i < info->npins; pin++, i++) {
  874. dev_dbg(sprd_pctl->dev, "pin name[%s-%d], type = %d, "
  875. "bit offset = %ld, bit width = %ld, reg = 0x%lx\n",
  876. pin->name, pin->number, pin->type,
  877. pin->bit_offset, pin->bit_width, pin->reg);
  878. }
  879. return 0;
  880. }
  881. int sprd_pinctrl_core_probe(struct platform_device *pdev,
  882. struct sprd_pins_info *sprd_soc_pin_info,
  883. int pins_cnt)
  884. {
  885. struct sprd_pinctrl *sprd_pctl;
  886. struct sprd_pinctrl_soc_info *pinctrl_info;
  887. struct pinctrl_pin_desc *pin_desc;
  888. struct resource *res;
  889. int ret, i;
  890. sprd_pctl = devm_kzalloc(&pdev->dev, sizeof(struct sprd_pinctrl),
  891. GFP_KERNEL);
  892. if (!sprd_pctl)
  893. return -ENOMEM;
  894. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  895. sprd_pctl->base = devm_ioremap_resource(&pdev->dev, res);
  896. if (IS_ERR(sprd_pctl->base))
  897. return PTR_ERR(sprd_pctl->base);
  898. pinctrl_info = devm_kzalloc(&pdev->dev,
  899. sizeof(struct sprd_pinctrl_soc_info),
  900. GFP_KERNEL);
  901. if (!pinctrl_info)
  902. return -ENOMEM;
  903. sprd_pctl->info = pinctrl_info;
  904. sprd_pctl->dev = &pdev->dev;
  905. platform_set_drvdata(pdev, sprd_pctl);
  906. ret = sprd_pinctrl_add_pins(sprd_pctl, sprd_soc_pin_info, pins_cnt);
  907. if (ret) {
  908. dev_err(&pdev->dev, "fail to add pins information\n");
  909. return ret;
  910. }
  911. ret = sprd_pinctrl_parse_dt(sprd_pctl);
  912. if (ret) {
  913. dev_err(&pdev->dev, "fail to parse dt properties\n");
  914. return ret;
  915. }
  916. pin_desc = devm_kcalloc(&pdev->dev,
  917. pinctrl_info->npins,
  918. sizeof(struct pinctrl_pin_desc),
  919. GFP_KERNEL);
  920. if (!pin_desc)
  921. return -ENOMEM;
  922. for (i = 0; i < pinctrl_info->npins; i++) {
  923. pin_desc[i].number = pinctrl_info->pins[i].number;
  924. pin_desc[i].name = pinctrl_info->pins[i].name;
  925. pin_desc[i].drv_data = pinctrl_info;
  926. }
  927. sprd_pinctrl_desc.pins = pin_desc;
  928. sprd_pinctrl_desc.name = dev_name(&pdev->dev);
  929. sprd_pinctrl_desc.npins = pinctrl_info->npins;
  930. sprd_pctl->pctl = pinctrl_register(&sprd_pinctrl_desc,
  931. &pdev->dev, (void *)sprd_pctl);
  932. if (IS_ERR(sprd_pctl->pctl)) {
  933. dev_err(&pdev->dev, "could not register pinctrl driver\n");
  934. return PTR_ERR(sprd_pctl->pctl);
  935. }
  936. return 0;
  937. }
  938. int sprd_pinctrl_remove(struct platform_device *pdev)
  939. {
  940. struct sprd_pinctrl *sprd_pctl = platform_get_drvdata(pdev);
  941. pinctrl_unregister(sprd_pctl->pctl);
  942. return 0;
  943. }
  944. void sprd_pinctrl_shutdown(struct platform_device *pdev)
  945. {
  946. struct pinctrl *pinctl;
  947. struct pinctrl_state *state;
  948. pinctl = devm_pinctrl_get(&pdev->dev);
  949. if (IS_ERR(pinctl))
  950. return;
  951. state = pinctrl_lookup_state(pinctl, "shutdown");
  952. if (IS_ERR(state))
  953. return;
  954. pinctrl_select_state(pinctl, state);
  955. }
  956. MODULE_DESCRIPTION("SPREADTRUM Pin Controller Driver");
  957. MODULE_AUTHOR("Baolin Wang <baolin.wang@spreadtrum.com>");
  958. MODULE_LICENSE("GPL v2");