pinctrl.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. /*
  2. * SuperH Pin Function Controller pinmux support.
  3. *
  4. * Copyright (C) 2012 Paul Mundt
  5. *
  6. * This file is subject to the terms and conditions of the GNU General Public
  7. * License. See the file "COPYING" in the main directory of this archive
  8. * for more details.
  9. */
  10. #define DRV_NAME "sh-pfc"
  11. #define pr_fmt(fmt) KBUILD_MODNAME " pinctrl: " fmt
  12. #include <linux/device.h>
  13. #include <linux/err.h>
  14. #include <linux/init.h>
  15. #include <linux/module.h>
  16. #include <linux/pinctrl/consumer.h>
  17. #include <linux/pinctrl/pinconf.h>
  18. #include <linux/pinctrl/pinconf-generic.h>
  19. #include <linux/pinctrl/pinctrl.h>
  20. #include <linux/pinctrl/pinmux.h>
  21. #include <linux/slab.h>
  22. #include <linux/spinlock.h>
  23. #include "core.h"
  24. struct sh_pfc_pinctrl {
  25. struct pinctrl_dev *pctl;
  26. struct pinctrl_desc pctl_desc;
  27. struct pinctrl_gpio_range range;
  28. struct sh_pfc *pfc;
  29. struct pinmux_gpio **functions;
  30. unsigned int nr_functions;
  31. struct pinctrl_pin_desc *pads;
  32. unsigned int nr_pads;
  33. spinlock_t lock;
  34. };
  35. static int sh_pfc_get_groups_count(struct pinctrl_dev *pctldev)
  36. {
  37. struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  38. return pmx->nr_pads;
  39. }
  40. static const char *sh_pfc_get_group_name(struct pinctrl_dev *pctldev,
  41. unsigned selector)
  42. {
  43. struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  44. return pmx->pads[selector].name;
  45. }
  46. static int sh_pfc_get_group_pins(struct pinctrl_dev *pctldev, unsigned group,
  47. const unsigned **pins, unsigned *num_pins)
  48. {
  49. struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  50. *pins = &pmx->pads[group].number;
  51. *num_pins = 1;
  52. return 0;
  53. }
  54. static void sh_pfc_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s,
  55. unsigned offset)
  56. {
  57. seq_printf(s, "%s", DRV_NAME);
  58. }
  59. static const struct pinctrl_ops sh_pfc_pinctrl_ops = {
  60. .get_groups_count = sh_pfc_get_groups_count,
  61. .get_group_name = sh_pfc_get_group_name,
  62. .get_group_pins = sh_pfc_get_group_pins,
  63. .pin_dbg_show = sh_pfc_pin_dbg_show,
  64. };
  65. static int sh_pfc_get_functions_count(struct pinctrl_dev *pctldev)
  66. {
  67. struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  68. return pmx->nr_functions;
  69. }
  70. static const char *sh_pfc_get_function_name(struct pinctrl_dev *pctldev,
  71. unsigned selector)
  72. {
  73. struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  74. return pmx->functions[selector]->name;
  75. }
  76. static int sh_pfc_get_function_groups(struct pinctrl_dev *pctldev, unsigned func,
  77. const char * const **groups,
  78. unsigned * const num_groups)
  79. {
  80. struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  81. *groups = &pmx->functions[func]->name;
  82. *num_groups = 1;
  83. return 0;
  84. }
  85. static int sh_pfc_noop_enable(struct pinctrl_dev *pctldev, unsigned func,
  86. unsigned group)
  87. {
  88. return 0;
  89. }
  90. static void sh_pfc_noop_disable(struct pinctrl_dev *pctldev, unsigned func,
  91. unsigned group)
  92. {
  93. }
  94. static int sh_pfc_config_function(struct sh_pfc *pfc, unsigned offset)
  95. {
  96. if (sh_pfc_config_gpio(pfc, offset,
  97. PINMUX_TYPE_FUNCTION,
  98. GPIO_CFG_DRYRUN) != 0)
  99. return -EINVAL;
  100. if (sh_pfc_config_gpio(pfc, offset,
  101. PINMUX_TYPE_FUNCTION,
  102. GPIO_CFG_REQ) != 0)
  103. return -EINVAL;
  104. return 0;
  105. }
  106. static int sh_pfc_reconfig_pin(struct sh_pfc *pfc, unsigned offset,
  107. int new_type)
  108. {
  109. unsigned long flags;
  110. int pinmux_type;
  111. int ret = -EINVAL;
  112. spin_lock_irqsave(&pfc->lock, flags);
  113. pinmux_type = pfc->info->gpios[offset].flags & PINMUX_FLAG_TYPE;
  114. /*
  115. * See if the present config needs to first be de-configured.
  116. */
  117. switch (pinmux_type) {
  118. case PINMUX_TYPE_GPIO:
  119. break;
  120. case PINMUX_TYPE_OUTPUT:
  121. case PINMUX_TYPE_INPUT:
  122. case PINMUX_TYPE_INPUT_PULLUP:
  123. case PINMUX_TYPE_INPUT_PULLDOWN:
  124. sh_pfc_config_gpio(pfc, offset, pinmux_type, GPIO_CFG_FREE);
  125. break;
  126. default:
  127. goto err;
  128. }
  129. /*
  130. * Dry run
  131. */
  132. if (sh_pfc_config_gpio(pfc, offset, new_type,
  133. GPIO_CFG_DRYRUN) != 0)
  134. goto err;
  135. /*
  136. * Request
  137. */
  138. if (sh_pfc_config_gpio(pfc, offset, new_type,
  139. GPIO_CFG_REQ) != 0)
  140. goto err;
  141. pfc->info->gpios[offset].flags &= ~PINMUX_FLAG_TYPE;
  142. pfc->info->gpios[offset].flags |= new_type;
  143. ret = 0;
  144. err:
  145. spin_unlock_irqrestore(&pfc->lock, flags);
  146. return ret;
  147. }
  148. static int sh_pfc_gpio_request_enable(struct pinctrl_dev *pctldev,
  149. struct pinctrl_gpio_range *range,
  150. unsigned offset)
  151. {
  152. struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  153. struct sh_pfc *pfc = pmx->pfc;
  154. unsigned long flags;
  155. int ret, pinmux_type;
  156. spin_lock_irqsave(&pfc->lock, flags);
  157. pinmux_type = pfc->info->gpios[offset].flags & PINMUX_FLAG_TYPE;
  158. switch (pinmux_type) {
  159. case PINMUX_TYPE_FUNCTION:
  160. pr_notice_once("Use of GPIO API for function requests is "
  161. "deprecated, convert to pinctrl\n");
  162. /* handle for now */
  163. ret = sh_pfc_config_function(pfc, offset);
  164. if (unlikely(ret < 0))
  165. goto err;
  166. break;
  167. case PINMUX_TYPE_GPIO:
  168. case PINMUX_TYPE_INPUT:
  169. case PINMUX_TYPE_OUTPUT:
  170. break;
  171. default:
  172. pr_err("Unsupported mux type (%d), bailing...\n", pinmux_type);
  173. ret = -ENOTSUPP;
  174. goto err;
  175. }
  176. ret = 0;
  177. err:
  178. spin_unlock_irqrestore(&pfc->lock, flags);
  179. return ret;
  180. }
  181. static void sh_pfc_gpio_disable_free(struct pinctrl_dev *pctldev,
  182. struct pinctrl_gpio_range *range,
  183. unsigned offset)
  184. {
  185. struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  186. struct sh_pfc *pfc = pmx->pfc;
  187. unsigned long flags;
  188. int pinmux_type;
  189. spin_lock_irqsave(&pfc->lock, flags);
  190. pinmux_type = pfc->info->gpios[offset].flags & PINMUX_FLAG_TYPE;
  191. sh_pfc_config_gpio(pfc, offset, pinmux_type, GPIO_CFG_FREE);
  192. spin_unlock_irqrestore(&pfc->lock, flags);
  193. }
  194. static int sh_pfc_gpio_set_direction(struct pinctrl_dev *pctldev,
  195. struct pinctrl_gpio_range *range,
  196. unsigned offset, bool input)
  197. {
  198. struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  199. int type = input ? PINMUX_TYPE_INPUT : PINMUX_TYPE_OUTPUT;
  200. return sh_pfc_reconfig_pin(pmx->pfc, offset, type);
  201. }
  202. static const struct pinmux_ops sh_pfc_pinmux_ops = {
  203. .get_functions_count = sh_pfc_get_functions_count,
  204. .get_function_name = sh_pfc_get_function_name,
  205. .get_function_groups = sh_pfc_get_function_groups,
  206. .enable = sh_pfc_noop_enable,
  207. .disable = sh_pfc_noop_disable,
  208. .gpio_request_enable = sh_pfc_gpio_request_enable,
  209. .gpio_disable_free = sh_pfc_gpio_disable_free,
  210. .gpio_set_direction = sh_pfc_gpio_set_direction,
  211. };
  212. static int sh_pfc_pinconf_get(struct pinctrl_dev *pctldev, unsigned pin,
  213. unsigned long *config)
  214. {
  215. struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  216. struct sh_pfc *pfc = pmx->pfc;
  217. *config = pfc->info->gpios[pin].flags & PINMUX_FLAG_TYPE;
  218. return 0;
  219. }
  220. static int sh_pfc_pinconf_set(struct pinctrl_dev *pctldev, unsigned pin,
  221. unsigned long config)
  222. {
  223. struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  224. /* Validate the new type */
  225. if (config >= PINMUX_FLAG_TYPE)
  226. return -EINVAL;
  227. return sh_pfc_reconfig_pin(pmx->pfc, pin, config);
  228. }
  229. static void sh_pfc_pinconf_dbg_show(struct pinctrl_dev *pctldev,
  230. struct seq_file *s, unsigned pin)
  231. {
  232. const char *pinmux_type_str[] = {
  233. [PINMUX_TYPE_NONE] = "none",
  234. [PINMUX_TYPE_FUNCTION] = "function",
  235. [PINMUX_TYPE_GPIO] = "gpio",
  236. [PINMUX_TYPE_OUTPUT] = "output",
  237. [PINMUX_TYPE_INPUT] = "input",
  238. [PINMUX_TYPE_INPUT_PULLUP] = "input bias pull up",
  239. [PINMUX_TYPE_INPUT_PULLDOWN] = "input bias pull down",
  240. };
  241. unsigned long config;
  242. int rc;
  243. rc = sh_pfc_pinconf_get(pctldev, pin, &config);
  244. if (unlikely(rc != 0))
  245. return;
  246. seq_printf(s, " %s", pinmux_type_str[config]);
  247. }
  248. static const struct pinconf_ops sh_pfc_pinconf_ops = {
  249. .pin_config_get = sh_pfc_pinconf_get,
  250. .pin_config_set = sh_pfc_pinconf_set,
  251. .pin_config_dbg_show = sh_pfc_pinconf_dbg_show,
  252. };
  253. static void sh_pfc_map_one_gpio(struct sh_pfc *pfc, struct sh_pfc_pinctrl *pmx,
  254. struct pinmux_gpio *gpio, unsigned offset)
  255. {
  256. struct pinmux_data_reg *dummy;
  257. unsigned long flags;
  258. int bit;
  259. gpio->flags &= ~PINMUX_FLAG_TYPE;
  260. if (sh_pfc_get_data_reg(pfc, offset, &dummy, &bit) == 0)
  261. gpio->flags |= PINMUX_TYPE_GPIO;
  262. else {
  263. gpio->flags |= PINMUX_TYPE_FUNCTION;
  264. spin_lock_irqsave(&pmx->lock, flags);
  265. pmx->nr_functions++;
  266. spin_unlock_irqrestore(&pmx->lock, flags);
  267. }
  268. }
  269. /* pinmux ranges -> pinctrl pin descs */
  270. static int sh_pfc_map_gpios(struct sh_pfc *pfc, struct sh_pfc_pinctrl *pmx)
  271. {
  272. unsigned long flags;
  273. int i;
  274. pmx->nr_pads = pfc->info->last_gpio - pfc->info->first_gpio + 1;
  275. pmx->pads = devm_kzalloc(pfc->dev, sizeof(*pmx->pads) * pmx->nr_pads,
  276. GFP_KERNEL);
  277. if (unlikely(!pmx->pads)) {
  278. pmx->nr_pads = 0;
  279. return -ENOMEM;
  280. }
  281. spin_lock_irqsave(&pfc->lock, flags);
  282. /*
  283. * We don't necessarily have a 1:1 mapping between pin and linux
  284. * GPIO number, as the latter maps to the associated enum_id.
  285. * Care needs to be taken to translate back to pin space when
  286. * dealing with any pin configurations.
  287. */
  288. for (i = 0; i < pmx->nr_pads; i++) {
  289. struct pinctrl_pin_desc *pin = pmx->pads + i;
  290. struct pinmux_gpio *gpio = pfc->info->gpios + i;
  291. pin->number = pfc->info->first_gpio + i;
  292. pin->name = gpio->name;
  293. /* XXX */
  294. if (unlikely(!gpio->enum_id))
  295. continue;
  296. sh_pfc_map_one_gpio(pfc, pmx, gpio, i);
  297. }
  298. spin_unlock_irqrestore(&pfc->lock, flags);
  299. return 0;
  300. }
  301. static int sh_pfc_map_functions(struct sh_pfc *pfc, struct sh_pfc_pinctrl *pmx)
  302. {
  303. unsigned long flags;
  304. int i, fn;
  305. pmx->functions = devm_kzalloc(pfc->dev, pmx->nr_functions *
  306. sizeof(*pmx->functions), GFP_KERNEL);
  307. if (unlikely(!pmx->functions))
  308. return -ENOMEM;
  309. spin_lock_irqsave(&pmx->lock, flags);
  310. for (i = fn = 0; i < pmx->nr_pads; i++) {
  311. struct pinmux_gpio *gpio = pfc->info->gpios + i;
  312. if ((gpio->flags & PINMUX_FLAG_TYPE) == PINMUX_TYPE_FUNCTION)
  313. pmx->functions[fn++] = gpio;
  314. }
  315. spin_unlock_irqrestore(&pmx->lock, flags);
  316. return 0;
  317. }
  318. int sh_pfc_register_pinctrl(struct sh_pfc *pfc)
  319. {
  320. struct sh_pfc_pinctrl *pmx;
  321. int ret;
  322. pmx = devm_kzalloc(pfc->dev, sizeof(*pmx), GFP_KERNEL);
  323. if (unlikely(!pmx))
  324. return -ENOMEM;
  325. spin_lock_init(&pmx->lock);
  326. pmx->pfc = pfc;
  327. pfc->pinctrl = pmx;
  328. ret = sh_pfc_map_gpios(pfc, pmx);
  329. if (unlikely(ret != 0))
  330. return ret;
  331. ret = sh_pfc_map_functions(pfc, pmx);
  332. if (unlikely(ret != 0))
  333. return ret;
  334. pmx->pctl_desc.name = DRV_NAME;
  335. pmx->pctl_desc.owner = THIS_MODULE;
  336. pmx->pctl_desc.pctlops = &sh_pfc_pinctrl_ops;
  337. pmx->pctl_desc.pmxops = &sh_pfc_pinmux_ops;
  338. pmx->pctl_desc.confops = &sh_pfc_pinconf_ops;
  339. pmx->pctl_desc.pins = pmx->pads;
  340. pmx->pctl_desc.npins = pmx->nr_pads;
  341. pmx->pctl = pinctrl_register(&pmx->pctl_desc, pfc->dev, pmx);
  342. if (IS_ERR(pmx->pctl))
  343. return PTR_ERR(pmx->pctl);
  344. pmx->range.name = DRV_NAME,
  345. pmx->range.id = 0;
  346. pmx->range.npins = pfc->info->last_gpio - pfc->info->first_gpio + 1;
  347. pmx->range.base = pfc->info->first_gpio;
  348. pmx->range.pin_base = pfc->info->first_gpio;
  349. pinctrl_add_gpio_range(pmx->pctl, &pmx->range);
  350. return 0;
  351. }
  352. int sh_pfc_unregister_pinctrl(struct sh_pfc *pfc)
  353. {
  354. struct sh_pfc_pinctrl *pmx = pfc->pinctrl;
  355. pinctrl_unregister(pmx->pctl);
  356. pfc->pinctrl = NULL;
  357. return 0;
  358. }