pinconf.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646
  1. /*
  2. * Core driver for the pin config portions of the pin control subsystem
  3. *
  4. * Copyright (C) 2011 ST-Ericsson SA
  5. * Written on behalf of Linaro for ST-Ericsson
  6. *
  7. * Author: Linus Walleij <linus.walleij@linaro.org>
  8. *
  9. * License terms: GNU General Public License (GPL) version 2
  10. */
  11. #define pr_fmt(fmt) "pinconfig core: " fmt
  12. #include <linux/kernel.h>
  13. #include <linux/module.h>
  14. #include <linux/init.h>
  15. #include <linux/device.h>
  16. #include <linux/slab.h>
  17. #include <linux/debugfs.h>
  18. #include <linux/seq_file.h>
  19. #include <linux/uaccess.h>
  20. #include <linux/pinctrl/machine.h>
  21. #include <linux/pinctrl/pinctrl.h>
  22. #include <linux/pinctrl/pinconf.h>
  23. #include "core.h"
  24. #include "pinconf.h"
  25. int pinconf_check_ops(struct pinctrl_dev *pctldev)
  26. {
  27. const struct pinconf_ops *ops = pctldev->desc->confops;
  28. /* We must be able to read out pin status */
  29. if (!ops->pin_config_get && !ops->pin_config_group_get) {
  30. dev_err(pctldev->dev,
  31. "pinconf must be able to read out pin status\n");
  32. return -EINVAL;
  33. }
  34. /* We have to be able to config the pins in SOME way */
  35. if (!ops->pin_config_set && !ops->pin_config_group_set) {
  36. dev_err(pctldev->dev,
  37. "pinconf has to be able to set a pins config\n");
  38. return -EINVAL;
  39. }
  40. return 0;
  41. }
  42. int pinconf_validate_map(struct pinctrl_map const *map, int i)
  43. {
  44. if (!map->data.configs.group_or_pin) {
  45. pr_err("failed to register map %s (%d): no group/pin given\n",
  46. map->name, i);
  47. return -EINVAL;
  48. }
  49. if (!map->data.configs.num_configs ||
  50. !map->data.configs.configs) {
  51. pr_err("failed to register map %s (%d): no configs given\n",
  52. map->name, i);
  53. return -EINVAL;
  54. }
  55. return 0;
  56. }
  57. int pin_config_get_for_pin(struct pinctrl_dev *pctldev, unsigned pin,
  58. unsigned long *config)
  59. {
  60. const struct pinconf_ops *ops = pctldev->desc->confops;
  61. if (!ops || !ops->pin_config_get) {
  62. dev_err(pctldev->dev, "cannot get pin configuration, missing "
  63. "pin_config_get() function in driver\n");
  64. return -EINVAL;
  65. }
  66. return ops->pin_config_get(pctldev, pin, config);
  67. }
  68. int pin_config_group_get(const char *dev_name, const char *pin_group,
  69. unsigned long *config)
  70. {
  71. struct pinctrl_dev *pctldev;
  72. const struct pinconf_ops *ops;
  73. int selector, ret;
  74. pctldev = get_pinctrl_dev_from_devname(dev_name);
  75. if (!pctldev) {
  76. ret = -EINVAL;
  77. return ret;
  78. }
  79. mutex_lock(&pctldev->mutex);
  80. ops = pctldev->desc->confops;
  81. if (!ops || !ops->pin_config_group_get) {
  82. dev_err(pctldev->dev, "cannot get configuration for pin "
  83. "group, missing group config get function in "
  84. "driver\n");
  85. ret = -EINVAL;
  86. goto unlock;
  87. }
  88. selector = pinctrl_get_group_selector(pctldev, pin_group);
  89. if (selector < 0) {
  90. ret = selector;
  91. goto unlock;
  92. }
  93. ret = ops->pin_config_group_get(pctldev, selector, config);
  94. unlock:
  95. mutex_unlock(&pctldev->mutex);
  96. return ret;
  97. }
  98. int pinconf_map_to_setting(struct pinctrl_map const *map,
  99. struct pinctrl_setting *setting)
  100. {
  101. struct pinctrl_dev *pctldev = setting->pctldev;
  102. int pin;
  103. switch (setting->type) {
  104. case PIN_MAP_TYPE_CONFIGS_PIN:
  105. pin = pin_get_from_name(pctldev,
  106. map->data.configs.group_or_pin);
  107. if (pin < 0) {
  108. dev_err(pctldev->dev, "could not map pin config for \"%s\"",
  109. map->data.configs.group_or_pin);
  110. return pin;
  111. }
  112. setting->data.configs.group_or_pin = pin;
  113. break;
  114. case PIN_MAP_TYPE_CONFIGS_GROUP:
  115. pin = pinctrl_get_group_selector(pctldev,
  116. map->data.configs.group_or_pin);
  117. if (pin < 0) {
  118. dev_err(pctldev->dev, "could not map group config for \"%s\"",
  119. map->data.configs.group_or_pin);
  120. return pin;
  121. }
  122. setting->data.configs.group_or_pin = pin;
  123. break;
  124. default:
  125. return -EINVAL;
  126. }
  127. setting->data.configs.num_configs = map->data.configs.num_configs;
  128. setting->data.configs.configs = map->data.configs.configs;
  129. return 0;
  130. }
  131. void pinconf_free_setting(struct pinctrl_setting const *setting)
  132. {
  133. }
  134. int pinconf_apply_setting(struct pinctrl_setting const *setting)
  135. {
  136. struct pinctrl_dev *pctldev = setting->pctldev;
  137. const struct pinconf_ops *ops = pctldev->desc->confops;
  138. int i, ret;
  139. if (!ops) {
  140. dev_err(pctldev->dev, "missing confops\n");
  141. return -EINVAL;
  142. }
  143. switch (setting->type) {
  144. case PIN_MAP_TYPE_CONFIGS_PIN:
  145. if (!ops->pin_config_set) {
  146. dev_err(pctldev->dev, "missing pin_config_set op\n");
  147. return -EINVAL;
  148. }
  149. for (i = 0; i < setting->data.configs.num_configs; i++) {
  150. ret = ops->pin_config_set(pctldev,
  151. setting->data.configs.group_or_pin,
  152. setting->data.configs.configs[i]);
  153. if (ret < 0) {
  154. dev_err(pctldev->dev,
  155. "pin_config_set op failed for pin %d config %08lx\n",
  156. setting->data.configs.group_or_pin,
  157. setting->data.configs.configs[i]);
  158. return ret;
  159. }
  160. }
  161. break;
  162. case PIN_MAP_TYPE_CONFIGS_GROUP:
  163. if (!ops->pin_config_group_set) {
  164. dev_err(pctldev->dev,
  165. "missing pin_config_group_set op\n");
  166. return -EINVAL;
  167. }
  168. for (i = 0; i < setting->data.configs.num_configs; i++) {
  169. ret = ops->pin_config_group_set(pctldev,
  170. setting->data.configs.group_or_pin,
  171. setting->data.configs.configs[i]);
  172. if (ret < 0) {
  173. dev_err(pctldev->dev,
  174. "pin_config_group_set op failed for group %d config %08lx\n",
  175. setting->data.configs.group_or_pin,
  176. setting->data.configs.configs[i]);
  177. return ret;
  178. }
  179. }
  180. break;
  181. default:
  182. return -EINVAL;
  183. }
  184. return 0;
  185. }
  186. #ifdef CONFIG_DEBUG_FS
  187. void pinconf_show_map(struct seq_file *s, struct pinctrl_map const *map)
  188. {
  189. struct pinctrl_dev *pctldev;
  190. const struct pinconf_ops *confops;
  191. int i;
  192. pctldev = get_pinctrl_dev_from_devname(map->ctrl_dev_name);
  193. if (pctldev)
  194. confops = pctldev->desc->confops;
  195. else
  196. confops = NULL;
  197. switch (map->type) {
  198. case PIN_MAP_TYPE_CONFIGS_PIN:
  199. seq_printf(s, "pin ");
  200. break;
  201. case PIN_MAP_TYPE_CONFIGS_GROUP:
  202. seq_printf(s, "group ");
  203. break;
  204. default:
  205. break;
  206. }
  207. seq_printf(s, "%s\n", map->data.configs.group_or_pin);
  208. for (i = 0; i < map->data.configs.num_configs; i++) {
  209. seq_printf(s, "config ");
  210. if (confops && confops->pin_config_config_dbg_show)
  211. confops->pin_config_config_dbg_show(pctldev, s,
  212. map->data.configs.configs[i]);
  213. else
  214. seq_printf(s, "%08lx", map->data.configs.configs[i]);
  215. seq_printf(s, "\n");
  216. }
  217. }
  218. void pinconf_show_setting(struct seq_file *s,
  219. struct pinctrl_setting const *setting)
  220. {
  221. struct pinctrl_dev *pctldev = setting->pctldev;
  222. const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
  223. const struct pinconf_ops *confops = pctldev->desc->confops;
  224. struct pin_desc *desc;
  225. int i;
  226. switch (setting->type) {
  227. case PIN_MAP_TYPE_CONFIGS_PIN:
  228. desc = pin_desc_get(setting->pctldev,
  229. setting->data.configs.group_or_pin);
  230. seq_printf(s, "pin %s (%d)",
  231. desc->name ? desc->name : "unnamed",
  232. setting->data.configs.group_or_pin);
  233. break;
  234. case PIN_MAP_TYPE_CONFIGS_GROUP:
  235. seq_printf(s, "group %s (%d)",
  236. pctlops->get_group_name(pctldev,
  237. setting->data.configs.group_or_pin),
  238. setting->data.configs.group_or_pin);
  239. break;
  240. default:
  241. break;
  242. }
  243. /*
  244. * FIXME: We should really get the pin controler to dump the config
  245. * values, so they can be decoded to something meaningful.
  246. */
  247. for (i = 0; i < setting->data.configs.num_configs; i++) {
  248. seq_printf(s, " ");
  249. if (confops && confops->pin_config_config_dbg_show)
  250. confops->pin_config_config_dbg_show(pctldev, s,
  251. setting->data.configs.configs[i]);
  252. else
  253. seq_printf(s, "%08lx",
  254. setting->data.configs.configs[i]);
  255. }
  256. seq_printf(s, "\n");
  257. }
  258. static void pinconf_dump_pin(struct pinctrl_dev *pctldev,
  259. struct seq_file *s, int pin)
  260. {
  261. const struct pinconf_ops *ops = pctldev->desc->confops;
  262. /* no-op when not using generic pin config */
  263. pinconf_generic_dump_pin(pctldev, s, pin);
  264. if (ops && ops->pin_config_dbg_show)
  265. ops->pin_config_dbg_show(pctldev, s, pin);
  266. }
  267. static int pinconf_pins_show(struct seq_file *s, void *what)
  268. {
  269. struct pinctrl_dev *pctldev = s->private;
  270. const struct pinconf_ops *ops = pctldev->desc->confops;
  271. unsigned i, pin;
  272. if (!ops || !ops->pin_config_get)
  273. return 0;
  274. seq_puts(s, "Pin config settings per pin\n");
  275. seq_puts(s, "Format: pin (name): configs\n");
  276. mutex_lock(&pctldev->mutex);
  277. /* The pin number can be retrived from the pin controller descriptor */
  278. for (i = 0; i < pctldev->desc->npins; i++) {
  279. struct pin_desc *desc;
  280. pin = pctldev->desc->pins[i].number;
  281. desc = pin_desc_get(pctldev, pin);
  282. /* Skip if we cannot search the pin */
  283. if (desc == NULL)
  284. continue;
  285. seq_printf(s, "pin %d (%s):", pin,
  286. desc->name ? desc->name : "unnamed");
  287. pinconf_dump_pin(pctldev, s, pin);
  288. seq_printf(s, "\n");
  289. }
  290. mutex_unlock(&pctldev->mutex);
  291. return 0;
  292. }
  293. static void pinconf_dump_group(struct pinctrl_dev *pctldev,
  294. struct seq_file *s, unsigned selector,
  295. const char *gname)
  296. {
  297. const struct pinconf_ops *ops = pctldev->desc->confops;
  298. /* no-op when not using generic pin config */
  299. pinconf_generic_dump_group(pctldev, s, gname);
  300. if (ops && ops->pin_config_group_dbg_show)
  301. ops->pin_config_group_dbg_show(pctldev, s, selector);
  302. }
  303. static int pinconf_groups_show(struct seq_file *s, void *what)
  304. {
  305. struct pinctrl_dev *pctldev = s->private;
  306. const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
  307. const struct pinconf_ops *ops = pctldev->desc->confops;
  308. unsigned ngroups = pctlops->get_groups_count(pctldev);
  309. unsigned selector = 0;
  310. if (!ops || !ops->pin_config_group_get)
  311. return 0;
  312. seq_puts(s, "Pin config settings per pin group\n");
  313. seq_puts(s, "Format: group (name): configs\n");
  314. while (selector < ngroups) {
  315. const char *gname = pctlops->get_group_name(pctldev, selector);
  316. seq_printf(s, "%u (%s):", selector, gname);
  317. pinconf_dump_group(pctldev, s, selector, gname);
  318. seq_printf(s, "\n");
  319. selector++;
  320. }
  321. return 0;
  322. }
  323. static int pinconf_pins_open(struct inode *inode, struct file *file)
  324. {
  325. return single_open(file, pinconf_pins_show, inode->i_private);
  326. }
  327. static int pinconf_groups_open(struct inode *inode, struct file *file)
  328. {
  329. return single_open(file, pinconf_groups_show, inode->i_private);
  330. }
  331. static const struct file_operations pinconf_pins_ops = {
  332. .open = pinconf_pins_open,
  333. .read = seq_read,
  334. .llseek = seq_lseek,
  335. .release = single_release,
  336. };
  337. static const struct file_operations pinconf_groups_ops = {
  338. .open = pinconf_groups_open,
  339. .read = seq_read,
  340. .llseek = seq_lseek,
  341. .release = single_release,
  342. };
  343. #define MAX_NAME_LEN 15
  344. struct dbg_cfg {
  345. enum pinctrl_map_type map_type;
  346. char dev_name[MAX_NAME_LEN+1];
  347. char state_name[MAX_NAME_LEN+1];
  348. char pin_name[MAX_NAME_LEN+1];
  349. };
  350. /*
  351. * Goal is to keep this structure as global in order to simply read the
  352. * pinconf-config file after a write to check config is as expected
  353. */
  354. static struct dbg_cfg pinconf_dbg_conf;
  355. /**
  356. * pinconf_dbg_config_print() - display the pinctrl config from the pinctrl
  357. * map, of the dev/pin/state that was last written to pinconf-config file.
  358. * @s: string filled in with config description
  359. * @d: not used
  360. */
  361. static int pinconf_dbg_config_print(struct seq_file *s, void *d)
  362. {
  363. struct pinctrl_maps *maps_node;
  364. const struct pinctrl_map *map;
  365. struct pinctrl_dev *pctldev = NULL;
  366. const struct pinconf_ops *confops = NULL;
  367. const struct pinctrl_map_configs *configs;
  368. struct dbg_cfg *dbg = &pinconf_dbg_conf;
  369. int i, j;
  370. bool found = false;
  371. unsigned long config;
  372. mutex_lock(&pinctrl_maps_mutex);
  373. /* Parse the pinctrl map and look for the elected pin/state */
  374. for_each_maps(maps_node, i, map) {
  375. if (map->type != dbg->map_type)
  376. continue;
  377. if (strcmp(map->dev_name, dbg->dev_name))
  378. continue;
  379. if (strcmp(map->name, dbg->state_name))
  380. continue;
  381. for (j = 0; j < map->data.configs.num_configs; j++) {
  382. if (!strcmp(map->data.configs.group_or_pin,
  383. dbg->pin_name)) {
  384. /*
  385. * We found the right pin / state, read the
  386. * config and he pctldev for later use
  387. */
  388. configs = &map->data.configs;
  389. pctldev = get_pinctrl_dev_from_devname
  390. (map->ctrl_dev_name);
  391. found = true;
  392. break;
  393. }
  394. }
  395. }
  396. if (!found) {
  397. seq_printf(s, "No config found for dev/state/pin, expected:\n");
  398. seq_printf(s, "Searched dev:%s\n", dbg->dev_name);
  399. seq_printf(s, "Searched state:%s\n", dbg->state_name);
  400. seq_printf(s, "Searched pin:%s\n", dbg->pin_name);
  401. seq_printf(s, "Use: modify config_pin <devname> "\
  402. "<state> <pinname> <value>\n");
  403. goto exit;
  404. }
  405. config = *(configs->configs);
  406. seq_printf(s, "Dev %s has config of %s in state %s: 0x%08lX\n",
  407. dbg->dev_name, dbg->pin_name,
  408. dbg->state_name, config);
  409. if (pctldev)
  410. confops = pctldev->desc->confops;
  411. if (confops && confops->pin_config_config_dbg_show)
  412. confops->pin_config_config_dbg_show(pctldev, s, config);
  413. exit:
  414. mutex_unlock(&pinctrl_maps_mutex);
  415. return 0;
  416. }
  417. /**
  418. * pinconf_dbg_config_write() - modify the pinctrl config in the pinctrl
  419. * map, of a dev/pin/state entry based on user entries to pinconf-config
  420. * @user_buf: contains the modification request with expected format:
  421. * modify config_pin <devicename> <state> <pinname> <newvalue>
  422. * modify is literal string, alternatives like add/delete not supported yet
  423. * config_pin is literal, alternatives like config_mux not supported yet
  424. * <devicename> <state> <pinname> are values that should match the pinctrl-maps
  425. * <newvalue> reflects the new config and is driver dependant
  426. */
  427. static int pinconf_dbg_config_write(struct file *file,
  428. const char __user *user_buf, size_t count, loff_t *ppos)
  429. {
  430. struct pinctrl_maps *maps_node;
  431. const struct pinctrl_map *map;
  432. struct pinctrl_dev *pctldev = NULL;
  433. const struct pinconf_ops *confops = NULL;
  434. struct dbg_cfg *dbg = &pinconf_dbg_conf;
  435. const struct pinctrl_map_configs *configs;
  436. char config[MAX_NAME_LEN+1];
  437. bool found = false;
  438. char buf[128];
  439. char *b = &buf[0];
  440. int buf_size;
  441. char *token;
  442. int i;
  443. /* Get userspace string and assure termination */
  444. buf_size = min(count, (sizeof(buf)-1));
  445. if (copy_from_user(buf, user_buf, buf_size))
  446. return -EFAULT;
  447. buf[buf_size] = 0;
  448. /*
  449. * need to parse entry and extract parameters:
  450. * modify configs_pin devicename state pinname newvalue
  451. */
  452. /* Get arg: 'modify' */
  453. token = strsep(&b, " ");
  454. if (!token)
  455. return -EINVAL;
  456. if (strcmp(token, "modify"))
  457. return -EINVAL;
  458. /* Get arg type: "config_pin" type supported so far */
  459. token = strsep(&b, " ");
  460. if (!token)
  461. return -EINVAL;
  462. if (strcmp(token, "config_pin"))
  463. return -EINVAL;
  464. dbg->map_type = PIN_MAP_TYPE_CONFIGS_PIN;
  465. /* get arg 'device_name' */
  466. token = strsep(&b, " ");
  467. if (token == NULL)
  468. return -EINVAL;
  469. if (strlen(token) >= MAX_NAME_LEN)
  470. return -EINVAL;
  471. strncpy(dbg->dev_name, token, MAX_NAME_LEN);
  472. /* get arg 'state_name' */
  473. token = strsep(&b, " ");
  474. if (token == NULL)
  475. return -EINVAL;
  476. if (strlen(token) >= MAX_NAME_LEN)
  477. return -EINVAL;
  478. strncpy(dbg->state_name, token, MAX_NAME_LEN);
  479. /* get arg 'pin_name' */
  480. token = strsep(&b, " ");
  481. if (token == NULL)
  482. return -EINVAL;
  483. if (strlen(token) >= MAX_NAME_LEN)
  484. return -EINVAL;
  485. strncpy(dbg->pin_name, token, MAX_NAME_LEN);
  486. /* get new_value of config' */
  487. token = strsep(&b, " ");
  488. if (token == NULL)
  489. return -EINVAL;
  490. if (strlen(token) >= MAX_NAME_LEN)
  491. return -EINVAL;
  492. strncpy(config, token, MAX_NAME_LEN);
  493. mutex_lock(&pinctrl_maps_mutex);
  494. /* Parse the pinctrl map and look for the selected dev/state/pin */
  495. for_each_maps(maps_node, i, map) {
  496. if (strcmp(map->dev_name, dbg->dev_name))
  497. continue;
  498. if (map->type != dbg->map_type)
  499. continue;
  500. if (strcmp(map->name, dbg->state_name))
  501. continue;
  502. /* we found the right pin / state, so overwrite config */
  503. if (!strcmp(map->data.configs.group_or_pin, dbg->pin_name)) {
  504. found = true;
  505. pctldev = get_pinctrl_dev_from_devname(
  506. map->ctrl_dev_name);
  507. configs = &map->data.configs;
  508. break;
  509. }
  510. }
  511. if (!found) {
  512. count = -EINVAL;
  513. goto exit;
  514. }
  515. if (pctldev)
  516. confops = pctldev->desc->confops;
  517. if (confops && confops->pin_config_dbg_parse_modify) {
  518. for (i = 0; i < configs->num_configs; i++) {
  519. confops->pin_config_dbg_parse_modify(pctldev,
  520. config,
  521. &configs->configs[i]);
  522. }
  523. }
  524. exit:
  525. mutex_unlock(&pinctrl_maps_mutex);
  526. return count;
  527. }
  528. static int pinconf_dbg_config_open(struct inode *inode, struct file *file)
  529. {
  530. return single_open(file, pinconf_dbg_config_print, inode->i_private);
  531. }
  532. static const struct file_operations pinconf_dbg_pinconfig_fops = {
  533. .open = pinconf_dbg_config_open,
  534. .write = pinconf_dbg_config_write,
  535. .read = seq_read,
  536. .llseek = seq_lseek,
  537. .release = single_release,
  538. .owner = THIS_MODULE,
  539. };
  540. void pinconf_init_device_debugfs(struct dentry *devroot,
  541. struct pinctrl_dev *pctldev)
  542. {
  543. debugfs_create_file("pinconf-pins", S_IFREG | S_IRUGO,
  544. devroot, pctldev, &pinconf_pins_ops);
  545. debugfs_create_file("pinconf-groups", S_IFREG | S_IRUGO,
  546. devroot, pctldev, &pinconf_groups_ops);
  547. debugfs_create_file("pinconf-config", (S_IRUGO | S_IWUSR | S_IWGRP),
  548. devroot, pctldev, &pinconf_dbg_pinconfig_fops);
  549. }
  550. #endif