pinctrl-samsung.c 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279
  1. /*
  2. * pin-controller/pin-mux/pin-config/gpio-driver for Samsung's SoC's.
  3. *
  4. * Copyright (c) 2012 Samsung Electronics Co., Ltd.
  5. * http://www.samsung.com
  6. * Copyright (c) 2012 Linaro Ltd
  7. * http://www.linaro.org
  8. *
  9. * Author: Thomas Abraham <thomas.ab@samsung.com>
  10. *
  11. * This program is free software; you can redistribute it and/or modify
  12. * it under the terms of the GNU General Public License as published by
  13. * the Free Software Foundation; either version 2 of the License, or
  14. * (at your option) any later version.
  15. *
  16. * This driver implements the Samsung pinctrl driver. It supports setting up of
  17. * pinmux and pinconf configurations. The gpiolib interface is also included.
  18. * External interrupt (gpio and wakeup) support are not included in this driver
  19. * but provides extensions to which platform specific implementation of the gpio
  20. * and wakeup interrupts can be hooked to.
  21. */
  22. #include <linux/module.h>
  23. #include <linux/platform_device.h>
  24. #include <linux/io.h>
  25. #include <linux/slab.h>
  26. #include <linux/err.h>
  27. #include <linux/gpio.h>
  28. #include <linux/irqdomain.h>
  29. #include <linux/spinlock.h>
  30. #include <linux/syscore_ops.h>
  31. #include "../core.h"
  32. #include "pinctrl-samsung.h"
  33. #define GROUP_SUFFIX "-grp"
  34. #define GSUFFIX_LEN sizeof(GROUP_SUFFIX)
  35. #define FUNCTION_SUFFIX "-mux"
  36. #define FSUFFIX_LEN sizeof(FUNCTION_SUFFIX)
  37. /* list of all possible config options supported */
  38. static struct pin_config {
  39. const char *property;
  40. enum pincfg_type param;
  41. } cfg_params[] = {
  42. { "samsung,pin-pud", PINCFG_TYPE_PUD },
  43. { "samsung,pin-drv", PINCFG_TYPE_DRV },
  44. { "samsung,pin-con-pdn", PINCFG_TYPE_CON_PDN },
  45. { "samsung,pin-pud-pdn", PINCFG_TYPE_PUD_PDN },
  46. { "samsung,pin-val", PINCFG_TYPE_DAT },
  47. };
  48. /* Global list of devices (struct samsung_pinctrl_drv_data) */
  49. static LIST_HEAD(drvdata_list);
  50. static unsigned int pin_base;
  51. static inline struct samsung_pin_bank *gc_to_pin_bank(struct gpio_chip *gc)
  52. {
  53. return container_of(gc, struct samsung_pin_bank, gpio_chip);
  54. }
  55. static int samsung_get_group_count(struct pinctrl_dev *pctldev)
  56. {
  57. struct samsung_pinctrl_drv_data *pmx = pinctrl_dev_get_drvdata(pctldev);
  58. return pmx->nr_groups;
  59. }
  60. static const char *samsung_get_group_name(struct pinctrl_dev *pctldev,
  61. unsigned group)
  62. {
  63. struct samsung_pinctrl_drv_data *pmx = pinctrl_dev_get_drvdata(pctldev);
  64. return pmx->pin_groups[group].name;
  65. }
  66. static int samsung_get_group_pins(struct pinctrl_dev *pctldev,
  67. unsigned group,
  68. const unsigned **pins,
  69. unsigned *num_pins)
  70. {
  71. struct samsung_pinctrl_drv_data *pmx = pinctrl_dev_get_drvdata(pctldev);
  72. *pins = pmx->pin_groups[group].pins;
  73. *num_pins = pmx->pin_groups[group].num_pins;
  74. return 0;
  75. }
  76. static int reserve_map(struct device *dev, struct pinctrl_map **map,
  77. unsigned *reserved_maps, unsigned *num_maps,
  78. unsigned reserve)
  79. {
  80. unsigned old_num = *reserved_maps;
  81. unsigned new_num = *num_maps + reserve;
  82. struct pinctrl_map *new_map;
  83. if (old_num >= new_num)
  84. return 0;
  85. new_map = krealloc(*map, sizeof(*new_map) * new_num, GFP_KERNEL);
  86. if (!new_map) {
  87. dev_err(dev, "krealloc(map) failed\n");
  88. return -ENOMEM;
  89. }
  90. memset(new_map + old_num, 0, (new_num - old_num) * sizeof(*new_map));
  91. *map = new_map;
  92. *reserved_maps = new_num;
  93. return 0;
  94. }
  95. static int add_map_mux(struct pinctrl_map **map, unsigned *reserved_maps,
  96. unsigned *num_maps, const char *group,
  97. const char *function)
  98. {
  99. if (WARN_ON(*num_maps == *reserved_maps))
  100. return -ENOSPC;
  101. (*map)[*num_maps].type = PIN_MAP_TYPE_MUX_GROUP;
  102. (*map)[*num_maps].data.mux.group = group;
  103. (*map)[*num_maps].data.mux.function = function;
  104. (*num_maps)++;
  105. return 0;
  106. }
  107. static int add_map_configs(struct device *dev, struct pinctrl_map **map,
  108. unsigned *reserved_maps, unsigned *num_maps,
  109. const char *group, unsigned long *configs,
  110. unsigned num_configs)
  111. {
  112. unsigned long *dup_configs;
  113. if (WARN_ON(*num_maps == *reserved_maps))
  114. return -ENOSPC;
  115. dup_configs = kmemdup(configs, num_configs * sizeof(*dup_configs),
  116. GFP_KERNEL);
  117. if (!dup_configs) {
  118. dev_err(dev, "kmemdup(configs) failed\n");
  119. return -ENOMEM;
  120. }
  121. (*map)[*num_maps].type = PIN_MAP_TYPE_CONFIGS_GROUP;
  122. (*map)[*num_maps].data.configs.group_or_pin = group;
  123. (*map)[*num_maps].data.configs.configs = dup_configs;
  124. (*map)[*num_maps].data.configs.num_configs = num_configs;
  125. (*num_maps)++;
  126. return 0;
  127. }
  128. static int add_config(struct device *dev, unsigned long **configs,
  129. unsigned *num_configs, unsigned long config)
  130. {
  131. unsigned old_num = *num_configs;
  132. unsigned new_num = old_num + 1;
  133. unsigned long *new_configs;
  134. new_configs = krealloc(*configs, sizeof(*new_configs) * new_num,
  135. GFP_KERNEL);
  136. if (!new_configs) {
  137. dev_err(dev, "krealloc(configs) failed\n");
  138. return -ENOMEM;
  139. }
  140. new_configs[old_num] = config;
  141. *configs = new_configs;
  142. *num_configs = new_num;
  143. return 0;
  144. }
  145. static void samsung_dt_free_map(struct pinctrl_dev *pctldev,
  146. struct pinctrl_map *map,
  147. unsigned num_maps)
  148. {
  149. int i;
  150. for (i = 0; i < num_maps; i++)
  151. if (map[i].type == PIN_MAP_TYPE_CONFIGS_GROUP)
  152. kfree(map[i].data.configs.configs);
  153. kfree(map);
  154. }
  155. static int samsung_dt_subnode_to_map(struct samsung_pinctrl_drv_data *drvdata,
  156. struct device *dev,
  157. struct device_node *np,
  158. struct pinctrl_map **map,
  159. unsigned *reserved_maps,
  160. unsigned *num_maps)
  161. {
  162. int ret, i;
  163. u32 val;
  164. unsigned long config;
  165. unsigned long *configs = NULL;
  166. unsigned num_configs = 0;
  167. unsigned reserve;
  168. struct property *prop;
  169. const char *group;
  170. bool has_func = false;
  171. ret = of_property_read_u32(np, "samsung,pin-function", &val);
  172. if (!ret)
  173. has_func = true;
  174. for (i = 0; i < ARRAY_SIZE(cfg_params); i++) {
  175. ret = of_property_read_u32(np, cfg_params[i].property, &val);
  176. if (!ret) {
  177. config = PINCFG_PACK(cfg_params[i].param, val);
  178. ret = add_config(dev, &configs, &num_configs, config);
  179. if (ret < 0)
  180. goto exit;
  181. /* EINVAL=missing, which is fine since it's optional */
  182. } else if (ret != -EINVAL) {
  183. dev_err(dev, "could not parse property %s\n",
  184. cfg_params[i].property);
  185. }
  186. }
  187. reserve = 0;
  188. if (has_func)
  189. reserve++;
  190. if (num_configs)
  191. reserve++;
  192. ret = of_property_count_strings(np, "samsung,pins");
  193. if (ret < 0) {
  194. dev_err(dev, "could not parse property samsung,pins\n");
  195. goto exit;
  196. }
  197. reserve *= ret;
  198. ret = reserve_map(dev, map, reserved_maps, num_maps, reserve);
  199. if (ret < 0)
  200. goto exit;
  201. of_property_for_each_string(np, "samsung,pins", prop, group) {
  202. if (has_func) {
  203. ret = add_map_mux(map, reserved_maps,
  204. num_maps, group, np->full_name);
  205. if (ret < 0)
  206. goto exit;
  207. }
  208. if (num_configs) {
  209. ret = add_map_configs(dev, map, reserved_maps,
  210. num_maps, group, configs,
  211. num_configs);
  212. if (ret < 0)
  213. goto exit;
  214. }
  215. }
  216. ret = 0;
  217. exit:
  218. kfree(configs);
  219. return ret;
  220. }
  221. static int samsung_dt_node_to_map(struct pinctrl_dev *pctldev,
  222. struct device_node *np_config,
  223. struct pinctrl_map **map,
  224. unsigned *num_maps)
  225. {
  226. struct samsung_pinctrl_drv_data *drvdata;
  227. unsigned reserved_maps;
  228. struct device_node *np;
  229. int ret;
  230. drvdata = pinctrl_dev_get_drvdata(pctldev);
  231. reserved_maps = 0;
  232. *map = NULL;
  233. *num_maps = 0;
  234. if (!of_get_child_count(np_config))
  235. return samsung_dt_subnode_to_map(drvdata, pctldev->dev,
  236. np_config, map,
  237. &reserved_maps,
  238. num_maps);
  239. for_each_child_of_node(np_config, np) {
  240. ret = samsung_dt_subnode_to_map(drvdata, pctldev->dev, np, map,
  241. &reserved_maps, num_maps);
  242. if (ret < 0) {
  243. samsung_dt_free_map(pctldev, *map, *num_maps);
  244. return ret;
  245. }
  246. }
  247. return 0;
  248. }
  249. /* list of pinctrl callbacks for the pinctrl core */
  250. static const struct pinctrl_ops samsung_pctrl_ops = {
  251. .get_groups_count = samsung_get_group_count,
  252. .get_group_name = samsung_get_group_name,
  253. .get_group_pins = samsung_get_group_pins,
  254. .dt_node_to_map = samsung_dt_node_to_map,
  255. .dt_free_map = samsung_dt_free_map,
  256. };
  257. /* check if the selector is a valid pin function selector */
  258. static int samsung_get_functions_count(struct pinctrl_dev *pctldev)
  259. {
  260. struct samsung_pinctrl_drv_data *drvdata;
  261. drvdata = pinctrl_dev_get_drvdata(pctldev);
  262. return drvdata->nr_functions;
  263. }
  264. /* return the name of the pin function specified */
  265. static const char *samsung_pinmux_get_fname(struct pinctrl_dev *pctldev,
  266. unsigned selector)
  267. {
  268. struct samsung_pinctrl_drv_data *drvdata;
  269. drvdata = pinctrl_dev_get_drvdata(pctldev);
  270. return drvdata->pmx_functions[selector].name;
  271. }
  272. /* return the groups associated for the specified function selector */
  273. static int samsung_pinmux_get_groups(struct pinctrl_dev *pctldev,
  274. unsigned selector, const char * const **groups,
  275. unsigned * const num_groups)
  276. {
  277. struct samsung_pinctrl_drv_data *drvdata;
  278. drvdata = pinctrl_dev_get_drvdata(pctldev);
  279. *groups = drvdata->pmx_functions[selector].groups;
  280. *num_groups = drvdata->pmx_functions[selector].num_groups;
  281. return 0;
  282. }
  283. /*
  284. * given a pin number that is local to a pin controller, find out the pin bank
  285. * and the register base of the pin bank.
  286. */
  287. static void pin_to_reg_bank(struct samsung_pinctrl_drv_data *drvdata,
  288. unsigned pin, void __iomem **reg, u32 *offset,
  289. struct samsung_pin_bank **bank)
  290. {
  291. struct samsung_pin_bank *b;
  292. b = drvdata->ctrl->pin_banks;
  293. while ((pin >= b->pin_base) &&
  294. ((b->pin_base + b->nr_pins - 1) < pin))
  295. b++;
  296. *reg = drvdata->virt_base + b->pctl_offset;
  297. *offset = pin - b->pin_base;
  298. if (bank)
  299. *bank = b;
  300. }
  301. /* enable or disable a pinmux function */
  302. static void samsung_pinmux_setup(struct pinctrl_dev *pctldev, unsigned selector,
  303. unsigned group, bool enable)
  304. {
  305. struct samsung_pinctrl_drv_data *drvdata;
  306. struct samsung_pin_bank_type *type;
  307. struct samsung_pin_bank *bank;
  308. void __iomem *reg;
  309. u32 mask, shift, data, pin_offset;
  310. unsigned long flags;
  311. const struct samsung_pmx_func *func;
  312. const struct samsung_pin_group *grp;
  313. drvdata = pinctrl_dev_get_drvdata(pctldev);
  314. func = &drvdata->pmx_functions[selector];
  315. grp = &drvdata->pin_groups[group];
  316. pin_to_reg_bank(drvdata, grp->pins[0] - drvdata->ctrl->base,
  317. &reg, &pin_offset, &bank);
  318. type = bank->type;
  319. mask = (1 << type->fld_width[PINCFG_TYPE_FUNC]) - 1;
  320. shift = pin_offset * type->fld_width[PINCFG_TYPE_FUNC];
  321. if (shift >= 32) {
  322. /* Some banks have two config registers */
  323. shift -= 32;
  324. reg += 4;
  325. }
  326. spin_lock_irqsave(&bank->slock, flags);
  327. data = readl(reg + type->reg_offset[PINCFG_TYPE_FUNC]);
  328. data &= ~(mask << shift);
  329. if (enable)
  330. data |= func->val << shift;
  331. writel(data, reg + type->reg_offset[PINCFG_TYPE_FUNC]);
  332. spin_unlock_irqrestore(&bank->slock, flags);
  333. }
  334. /* enable a specified pinmux by writing to registers */
  335. static int samsung_pinmux_set_mux(struct pinctrl_dev *pctldev,
  336. unsigned selector,
  337. unsigned group)
  338. {
  339. samsung_pinmux_setup(pctldev, selector, group, true);
  340. return 0;
  341. }
  342. /* list of pinmux callbacks for the pinmux vertical in pinctrl core */
  343. static const struct pinmux_ops samsung_pinmux_ops = {
  344. .get_functions_count = samsung_get_functions_count,
  345. .get_function_name = samsung_pinmux_get_fname,
  346. .get_function_groups = samsung_pinmux_get_groups,
  347. .set_mux = samsung_pinmux_set_mux,
  348. };
  349. /* set or get the pin config settings for a specified pin */
  350. static int samsung_pinconf_rw(struct pinctrl_dev *pctldev, unsigned int pin,
  351. unsigned long *config, bool set)
  352. {
  353. struct samsung_pinctrl_drv_data *drvdata;
  354. struct samsung_pin_bank_type *type;
  355. struct samsung_pin_bank *bank;
  356. void __iomem *reg_base;
  357. enum pincfg_type cfg_type = PINCFG_UNPACK_TYPE(*config);
  358. u32 data, width, pin_offset, mask, shift;
  359. u32 cfg_value, cfg_reg;
  360. unsigned long flags;
  361. drvdata = pinctrl_dev_get_drvdata(pctldev);
  362. pin_to_reg_bank(drvdata, pin - drvdata->ctrl->base, &reg_base,
  363. &pin_offset, &bank);
  364. type = bank->type;
  365. if (cfg_type >= PINCFG_TYPE_NUM || !type->fld_width[cfg_type])
  366. return -EINVAL;
  367. width = type->fld_width[cfg_type];
  368. cfg_reg = type->reg_offset[cfg_type];
  369. spin_lock_irqsave(&bank->slock, flags);
  370. mask = (1 << width) - 1;
  371. shift = pin_offset * width;
  372. data = readl(reg_base + cfg_reg);
  373. if (set) {
  374. cfg_value = PINCFG_UNPACK_VALUE(*config);
  375. data &= ~(mask << shift);
  376. data |= (cfg_value << shift);
  377. writel(data, reg_base + cfg_reg);
  378. } else {
  379. data >>= shift;
  380. data &= mask;
  381. *config = PINCFG_PACK(cfg_type, data);
  382. }
  383. spin_unlock_irqrestore(&bank->slock, flags);
  384. return 0;
  385. }
  386. /* set the pin config settings for a specified pin */
  387. static int samsung_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
  388. unsigned long *configs, unsigned num_configs)
  389. {
  390. int i, ret;
  391. for (i = 0; i < num_configs; i++) {
  392. ret = samsung_pinconf_rw(pctldev, pin, &configs[i], true);
  393. if (ret < 0)
  394. return ret;
  395. } /* for each config */
  396. return 0;
  397. }
  398. /* get the pin config settings for a specified pin */
  399. static int samsung_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,
  400. unsigned long *config)
  401. {
  402. return samsung_pinconf_rw(pctldev, pin, config, false);
  403. }
  404. /* set the pin config settings for a specified pin group */
  405. static int samsung_pinconf_group_set(struct pinctrl_dev *pctldev,
  406. unsigned group, unsigned long *configs,
  407. unsigned num_configs)
  408. {
  409. struct samsung_pinctrl_drv_data *drvdata;
  410. const unsigned int *pins;
  411. unsigned int cnt;
  412. drvdata = pinctrl_dev_get_drvdata(pctldev);
  413. pins = drvdata->pin_groups[group].pins;
  414. for (cnt = 0; cnt < drvdata->pin_groups[group].num_pins; cnt++)
  415. samsung_pinconf_set(pctldev, pins[cnt], configs, num_configs);
  416. return 0;
  417. }
  418. /* get the pin config settings for a specified pin group */
  419. static int samsung_pinconf_group_get(struct pinctrl_dev *pctldev,
  420. unsigned int group, unsigned long *config)
  421. {
  422. struct samsung_pinctrl_drv_data *drvdata;
  423. const unsigned int *pins;
  424. drvdata = pinctrl_dev_get_drvdata(pctldev);
  425. pins = drvdata->pin_groups[group].pins;
  426. samsung_pinconf_get(pctldev, pins[0], config);
  427. return 0;
  428. }
  429. /* list of pinconfig callbacks for pinconfig vertical in the pinctrl code */
  430. static const struct pinconf_ops samsung_pinconf_ops = {
  431. .pin_config_get = samsung_pinconf_get,
  432. .pin_config_set = samsung_pinconf_set,
  433. .pin_config_group_get = samsung_pinconf_group_get,
  434. .pin_config_group_set = samsung_pinconf_group_set,
  435. };
  436. /* gpiolib gpio_set callback function */
  437. static void samsung_gpio_set(struct gpio_chip *gc, unsigned offset, int value)
  438. {
  439. struct samsung_pin_bank *bank = gc_to_pin_bank(gc);
  440. struct samsung_pin_bank_type *type = bank->type;
  441. unsigned long flags;
  442. void __iomem *reg;
  443. u32 data;
  444. reg = bank->drvdata->virt_base + bank->pctl_offset;
  445. spin_lock_irqsave(&bank->slock, flags);
  446. data = readl(reg + type->reg_offset[PINCFG_TYPE_DAT]);
  447. data &= ~(1 << offset);
  448. if (value)
  449. data |= 1 << offset;
  450. writel(data, reg + type->reg_offset[PINCFG_TYPE_DAT]);
  451. spin_unlock_irqrestore(&bank->slock, flags);
  452. }
  453. /* gpiolib gpio_get callback function */
  454. static int samsung_gpio_get(struct gpio_chip *gc, unsigned offset)
  455. {
  456. void __iomem *reg;
  457. u32 data;
  458. struct samsung_pin_bank *bank = gc_to_pin_bank(gc);
  459. struct samsung_pin_bank_type *type = bank->type;
  460. reg = bank->drvdata->virt_base + bank->pctl_offset;
  461. data = readl(reg + type->reg_offset[PINCFG_TYPE_DAT]);
  462. data >>= offset;
  463. data &= 1;
  464. return data;
  465. }
  466. /*
  467. * The calls to gpio_direction_output() and gpio_direction_input()
  468. * leads to this function call.
  469. */
  470. static int samsung_gpio_set_direction(struct gpio_chip *gc,
  471. unsigned offset, bool input)
  472. {
  473. struct samsung_pin_bank_type *type;
  474. struct samsung_pin_bank *bank;
  475. struct samsung_pinctrl_drv_data *drvdata;
  476. void __iomem *reg;
  477. u32 data, mask, shift;
  478. unsigned long flags;
  479. bank = gc_to_pin_bank(gc);
  480. type = bank->type;
  481. drvdata = bank->drvdata;
  482. reg = drvdata->virt_base + bank->pctl_offset +
  483. type->reg_offset[PINCFG_TYPE_FUNC];
  484. mask = (1 << type->fld_width[PINCFG_TYPE_FUNC]) - 1;
  485. shift = offset * type->fld_width[PINCFG_TYPE_FUNC];
  486. if (shift >= 32) {
  487. /* Some banks have two config registers */
  488. shift -= 32;
  489. reg += 4;
  490. }
  491. spin_lock_irqsave(&bank->slock, flags);
  492. data = readl(reg);
  493. data &= ~(mask << shift);
  494. if (!input)
  495. data |= FUNC_OUTPUT << shift;
  496. writel(data, reg);
  497. spin_unlock_irqrestore(&bank->slock, flags);
  498. return 0;
  499. }
  500. /* gpiolib gpio_direction_input callback function. */
  501. static int samsung_gpio_direction_input(struct gpio_chip *gc, unsigned offset)
  502. {
  503. return samsung_gpio_set_direction(gc, offset, true);
  504. }
  505. /* gpiolib gpio_direction_output callback function. */
  506. static int samsung_gpio_direction_output(struct gpio_chip *gc, unsigned offset,
  507. int value)
  508. {
  509. samsung_gpio_set(gc, offset, value);
  510. return samsung_gpio_set_direction(gc, offset, false);
  511. }
  512. /*
  513. * gpiolib gpio_to_irq callback function. Creates a mapping between a GPIO pin
  514. * and a virtual IRQ, if not already present.
  515. */
  516. static int samsung_gpio_to_irq(struct gpio_chip *gc, unsigned offset)
  517. {
  518. struct samsung_pin_bank *bank = gc_to_pin_bank(gc);
  519. unsigned int virq;
  520. if (!bank->irq_domain)
  521. return -ENXIO;
  522. virq = irq_create_mapping(bank->irq_domain, offset);
  523. return (virq) ? : -ENXIO;
  524. }
  525. static struct samsung_pin_group *samsung_pinctrl_create_groups(
  526. struct device *dev,
  527. struct samsung_pinctrl_drv_data *drvdata,
  528. unsigned int *cnt)
  529. {
  530. struct pinctrl_desc *ctrldesc = &drvdata->pctl;
  531. struct samsung_pin_group *groups, *grp;
  532. const struct pinctrl_pin_desc *pdesc;
  533. int i;
  534. groups = devm_kzalloc(dev, ctrldesc->npins * sizeof(*groups),
  535. GFP_KERNEL);
  536. if (!groups)
  537. return ERR_PTR(-EINVAL);
  538. grp = groups;
  539. pdesc = ctrldesc->pins;
  540. for (i = 0; i < ctrldesc->npins; ++i, ++pdesc, ++grp) {
  541. grp->name = pdesc->name;
  542. grp->pins = &pdesc->number;
  543. grp->num_pins = 1;
  544. }
  545. *cnt = ctrldesc->npins;
  546. return groups;
  547. }
  548. static int samsung_pinctrl_create_function(struct device *dev,
  549. struct samsung_pinctrl_drv_data *drvdata,
  550. struct device_node *func_np,
  551. struct samsung_pmx_func *func)
  552. {
  553. int npins;
  554. int ret;
  555. int i;
  556. if (of_property_read_u32(func_np, "samsung,pin-function", &func->val))
  557. return 0;
  558. npins = of_property_count_strings(func_np, "samsung,pins");
  559. if (npins < 1) {
  560. dev_err(dev, "invalid pin list in %s node", func_np->name);
  561. return -EINVAL;
  562. }
  563. func->name = func_np->full_name;
  564. func->groups = devm_kzalloc(dev, npins * sizeof(char *), GFP_KERNEL);
  565. if (!func->groups)
  566. return -ENOMEM;
  567. for (i = 0; i < npins; ++i) {
  568. const char *gname;
  569. ret = of_property_read_string_index(func_np, "samsung,pins",
  570. i, &gname);
  571. if (ret) {
  572. dev_err(dev,
  573. "failed to read pin name %d from %s node\n",
  574. i, func_np->name);
  575. return ret;
  576. }
  577. func->groups[i] = gname;
  578. }
  579. func->num_groups = npins;
  580. return 1;
  581. }
  582. static struct samsung_pmx_func *samsung_pinctrl_create_functions(
  583. struct device *dev,
  584. struct samsung_pinctrl_drv_data *drvdata,
  585. unsigned int *cnt)
  586. {
  587. struct samsung_pmx_func *functions, *func;
  588. struct device_node *dev_np = dev->of_node;
  589. struct device_node *cfg_np;
  590. unsigned int func_cnt = 0;
  591. int ret;
  592. /*
  593. * Iterate over all the child nodes of the pin controller node
  594. * and create pin groups and pin function lists.
  595. */
  596. for_each_child_of_node(dev_np, cfg_np) {
  597. struct device_node *func_np;
  598. if (!of_get_child_count(cfg_np)) {
  599. if (!of_find_property(cfg_np,
  600. "samsung,pin-function", NULL))
  601. continue;
  602. ++func_cnt;
  603. continue;
  604. }
  605. for_each_child_of_node(cfg_np, func_np) {
  606. if (!of_find_property(func_np,
  607. "samsung,pin-function", NULL))
  608. continue;
  609. ++func_cnt;
  610. }
  611. }
  612. functions = devm_kzalloc(dev, func_cnt * sizeof(*functions),
  613. GFP_KERNEL);
  614. if (!functions) {
  615. dev_err(dev, "failed to allocate memory for function list\n");
  616. return ERR_PTR(-EINVAL);
  617. }
  618. func = functions;
  619. /*
  620. * Iterate over all the child nodes of the pin controller node
  621. * and create pin groups and pin function lists.
  622. */
  623. func_cnt = 0;
  624. for_each_child_of_node(dev_np, cfg_np) {
  625. struct device_node *func_np;
  626. if (!of_get_child_count(cfg_np)) {
  627. ret = samsung_pinctrl_create_function(dev, drvdata,
  628. cfg_np, func);
  629. if (ret < 0)
  630. return ERR_PTR(ret);
  631. if (ret > 0) {
  632. ++func;
  633. ++func_cnt;
  634. }
  635. continue;
  636. }
  637. for_each_child_of_node(cfg_np, func_np) {
  638. ret = samsung_pinctrl_create_function(dev, drvdata,
  639. func_np, func);
  640. if (ret < 0)
  641. return ERR_PTR(ret);
  642. if (ret > 0) {
  643. ++func;
  644. ++func_cnt;
  645. }
  646. }
  647. }
  648. *cnt = func_cnt;
  649. return functions;
  650. }
  651. /*
  652. * Parse the information about all the available pin groups and pin functions
  653. * from device node of the pin-controller. A pin group is formed with all
  654. * the pins listed in the "samsung,pins" property.
  655. */
  656. static int samsung_pinctrl_parse_dt(struct platform_device *pdev,
  657. struct samsung_pinctrl_drv_data *drvdata)
  658. {
  659. struct device *dev = &pdev->dev;
  660. struct samsung_pin_group *groups;
  661. struct samsung_pmx_func *functions;
  662. unsigned int grp_cnt = 0, func_cnt = 0;
  663. groups = samsung_pinctrl_create_groups(dev, drvdata, &grp_cnt);
  664. if (IS_ERR(groups)) {
  665. dev_err(dev, "failed to parse pin groups\n");
  666. return PTR_ERR(groups);
  667. }
  668. functions = samsung_pinctrl_create_functions(dev, drvdata, &func_cnt);
  669. if (IS_ERR(functions)) {
  670. dev_err(dev, "failed to parse pin functions\n");
  671. return PTR_ERR(groups);
  672. }
  673. drvdata->pin_groups = groups;
  674. drvdata->nr_groups = grp_cnt;
  675. drvdata->pmx_functions = functions;
  676. drvdata->nr_functions = func_cnt;
  677. return 0;
  678. }
  679. /* register the pinctrl interface with the pinctrl subsystem */
  680. static int samsung_pinctrl_register(struct platform_device *pdev,
  681. struct samsung_pinctrl_drv_data *drvdata)
  682. {
  683. struct pinctrl_desc *ctrldesc = &drvdata->pctl;
  684. struct pinctrl_pin_desc *pindesc, *pdesc;
  685. struct samsung_pin_bank *pin_bank;
  686. char *pin_names;
  687. int pin, bank, ret;
  688. ctrldesc->name = "samsung-pinctrl";
  689. ctrldesc->owner = THIS_MODULE;
  690. ctrldesc->pctlops = &samsung_pctrl_ops;
  691. ctrldesc->pmxops = &samsung_pinmux_ops;
  692. ctrldesc->confops = &samsung_pinconf_ops;
  693. pindesc = devm_kzalloc(&pdev->dev, sizeof(*pindesc) *
  694. drvdata->ctrl->nr_pins, GFP_KERNEL);
  695. if (!pindesc) {
  696. dev_err(&pdev->dev, "mem alloc for pin descriptors failed\n");
  697. return -ENOMEM;
  698. }
  699. ctrldesc->pins = pindesc;
  700. ctrldesc->npins = drvdata->ctrl->nr_pins;
  701. /* dynamically populate the pin number and pin name for pindesc */
  702. for (pin = 0, pdesc = pindesc; pin < ctrldesc->npins; pin++, pdesc++)
  703. pdesc->number = pin + drvdata->ctrl->base;
  704. /*
  705. * allocate space for storing the dynamically generated names for all
  706. * the pins which belong to this pin-controller.
  707. */
  708. pin_names = devm_kzalloc(&pdev->dev, sizeof(char) * PIN_NAME_LENGTH *
  709. drvdata->ctrl->nr_pins, GFP_KERNEL);
  710. if (!pin_names) {
  711. dev_err(&pdev->dev, "mem alloc for pin names failed\n");
  712. return -ENOMEM;
  713. }
  714. /* for each pin, the name of the pin is pin-bank name + pin number */
  715. for (bank = 0; bank < drvdata->ctrl->nr_banks; bank++) {
  716. pin_bank = &drvdata->ctrl->pin_banks[bank];
  717. for (pin = 0; pin < pin_bank->nr_pins; pin++) {
  718. sprintf(pin_names, "%s-%d", pin_bank->name, pin);
  719. pdesc = pindesc + pin_bank->pin_base + pin;
  720. pdesc->name = pin_names;
  721. pin_names += PIN_NAME_LENGTH;
  722. }
  723. }
  724. ret = samsung_pinctrl_parse_dt(pdev, drvdata);
  725. if (ret)
  726. return ret;
  727. drvdata->pctl_dev = pinctrl_register(ctrldesc, &pdev->dev, drvdata);
  728. if (!drvdata->pctl_dev) {
  729. dev_err(&pdev->dev, "could not register pinctrl driver\n");
  730. return -EINVAL;
  731. }
  732. for (bank = 0; bank < drvdata->ctrl->nr_banks; ++bank) {
  733. pin_bank = &drvdata->ctrl->pin_banks[bank];
  734. pin_bank->grange.name = pin_bank->name;
  735. pin_bank->grange.id = bank;
  736. pin_bank->grange.pin_base = drvdata->ctrl->base
  737. + pin_bank->pin_base;
  738. pin_bank->grange.base = pin_bank->gpio_chip.base;
  739. pin_bank->grange.npins = pin_bank->gpio_chip.ngpio;
  740. pin_bank->grange.gc = &pin_bank->gpio_chip;
  741. pinctrl_add_gpio_range(drvdata->pctl_dev, &pin_bank->grange);
  742. }
  743. return 0;
  744. }
  745. static int samsung_gpio_request(struct gpio_chip *chip, unsigned offset)
  746. {
  747. return pinctrl_request_gpio(chip->base + offset);
  748. }
  749. static void samsung_gpio_free(struct gpio_chip *chip, unsigned offset)
  750. {
  751. pinctrl_free_gpio(chip->base + offset);
  752. }
  753. static const struct gpio_chip samsung_gpiolib_chip = {
  754. .request = samsung_gpio_request,
  755. .free = samsung_gpio_free,
  756. .set = samsung_gpio_set,
  757. .get = samsung_gpio_get,
  758. .direction_input = samsung_gpio_direction_input,
  759. .direction_output = samsung_gpio_direction_output,
  760. .to_irq = samsung_gpio_to_irq,
  761. .owner = THIS_MODULE,
  762. };
  763. /* register the gpiolib interface with the gpiolib subsystem */
  764. static int samsung_gpiolib_register(struct platform_device *pdev,
  765. struct samsung_pinctrl_drv_data *drvdata)
  766. {
  767. struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
  768. struct samsung_pin_bank *bank = ctrl->pin_banks;
  769. struct gpio_chip *gc;
  770. int ret;
  771. int i;
  772. for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
  773. bank->gpio_chip = samsung_gpiolib_chip;
  774. gc = &bank->gpio_chip;
  775. gc->base = ctrl->base + bank->pin_base;
  776. gc->ngpio = bank->nr_pins;
  777. gc->dev = &pdev->dev;
  778. gc->of_node = bank->of_node;
  779. gc->label = bank->name;
  780. ret = gpiochip_add(gc);
  781. if (ret) {
  782. dev_err(&pdev->dev, "failed to register gpio_chip %s, error code: %d\n",
  783. gc->label, ret);
  784. goto fail;
  785. }
  786. }
  787. return 0;
  788. fail:
  789. for (--i, --bank; i >= 0; --i, --bank)
  790. gpiochip_remove(&bank->gpio_chip);
  791. return ret;
  792. }
  793. /* unregister the gpiolib interface with the gpiolib subsystem */
  794. static int samsung_gpiolib_unregister(struct platform_device *pdev,
  795. struct samsung_pinctrl_drv_data *drvdata)
  796. {
  797. struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
  798. struct samsung_pin_bank *bank = ctrl->pin_banks;
  799. int i;
  800. for (i = 0; i < ctrl->nr_banks; ++i, ++bank)
  801. gpiochip_remove(&bank->gpio_chip);
  802. return 0;
  803. }
  804. static const struct of_device_id samsung_pinctrl_dt_match[];
  805. /* retrieve the soc specific data */
  806. static struct samsung_pin_ctrl *samsung_pinctrl_get_soc_data(
  807. struct samsung_pinctrl_drv_data *d,
  808. struct platform_device *pdev)
  809. {
  810. int id;
  811. const struct of_device_id *match;
  812. struct device_node *node = pdev->dev.of_node;
  813. struct device_node *np;
  814. struct samsung_pin_ctrl *ctrl;
  815. struct samsung_pin_bank *bank;
  816. int i;
  817. id = of_alias_get_id(node, "pinctrl");
  818. if (id < 0) {
  819. dev_err(&pdev->dev, "failed to get alias id\n");
  820. return NULL;
  821. }
  822. match = of_match_node(samsung_pinctrl_dt_match, node);
  823. ctrl = (struct samsung_pin_ctrl *)match->data + id;
  824. bank = ctrl->pin_banks;
  825. for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
  826. spin_lock_init(&bank->slock);
  827. bank->drvdata = d;
  828. bank->pin_base = ctrl->nr_pins;
  829. ctrl->nr_pins += bank->nr_pins;
  830. }
  831. for_each_child_of_node(node, np) {
  832. if (!of_find_property(np, "gpio-controller", NULL))
  833. continue;
  834. bank = ctrl->pin_banks;
  835. for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
  836. if (!strcmp(bank->name, np->name)) {
  837. bank->of_node = np;
  838. break;
  839. }
  840. }
  841. }
  842. ctrl->base = pin_base;
  843. pin_base += ctrl->nr_pins;
  844. return ctrl;
  845. }
  846. static int samsung_pinctrl_probe(struct platform_device *pdev)
  847. {
  848. struct samsung_pinctrl_drv_data *drvdata;
  849. struct device *dev = &pdev->dev;
  850. struct samsung_pin_ctrl *ctrl;
  851. struct resource *res;
  852. int ret;
  853. if (!dev->of_node) {
  854. dev_err(dev, "device tree node not found\n");
  855. return -ENODEV;
  856. }
  857. drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
  858. if (!drvdata) {
  859. dev_err(dev, "failed to allocate memory for driver's "
  860. "private data\n");
  861. return -ENOMEM;
  862. }
  863. ctrl = samsung_pinctrl_get_soc_data(drvdata, pdev);
  864. if (!ctrl) {
  865. dev_err(&pdev->dev, "driver data not available\n");
  866. return -EINVAL;
  867. }
  868. drvdata->ctrl = ctrl;
  869. drvdata->dev = dev;
  870. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  871. drvdata->virt_base = devm_ioremap_resource(&pdev->dev, res);
  872. if (IS_ERR(drvdata->virt_base))
  873. return PTR_ERR(drvdata->virt_base);
  874. res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
  875. if (res)
  876. drvdata->irq = res->start;
  877. ret = samsung_gpiolib_register(pdev, drvdata);
  878. if (ret)
  879. return ret;
  880. ret = samsung_pinctrl_register(pdev, drvdata);
  881. if (ret) {
  882. samsung_gpiolib_unregister(pdev, drvdata);
  883. return ret;
  884. }
  885. if (ctrl->eint_gpio_init)
  886. ctrl->eint_gpio_init(drvdata);
  887. if (ctrl->eint_wkup_init)
  888. ctrl->eint_wkup_init(drvdata);
  889. platform_set_drvdata(pdev, drvdata);
  890. /* Add to the global list */
  891. list_add_tail(&drvdata->node, &drvdata_list);
  892. return 0;
  893. }
  894. #ifdef CONFIG_PM
  895. /**
  896. * samsung_pinctrl_suspend_dev - save pinctrl state for suspend for a device
  897. *
  898. * Save data for all banks handled by this device.
  899. */
  900. static void samsung_pinctrl_suspend_dev(
  901. struct samsung_pinctrl_drv_data *drvdata)
  902. {
  903. struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
  904. void __iomem *virt_base = drvdata->virt_base;
  905. int i;
  906. for (i = 0; i < ctrl->nr_banks; i++) {
  907. struct samsung_pin_bank *bank = &ctrl->pin_banks[i];
  908. void __iomem *reg = virt_base + bank->pctl_offset;
  909. u8 *offs = bank->type->reg_offset;
  910. u8 *widths = bank->type->fld_width;
  911. enum pincfg_type type;
  912. /* Registers without a powerdown config aren't lost */
  913. if (!widths[PINCFG_TYPE_CON_PDN])
  914. continue;
  915. for (type = 0; type < PINCFG_TYPE_NUM; type++)
  916. if (widths[type])
  917. bank->pm_save[type] = readl(reg + offs[type]);
  918. if (widths[PINCFG_TYPE_FUNC] * bank->nr_pins > 32) {
  919. /* Some banks have two config registers */
  920. bank->pm_save[PINCFG_TYPE_NUM] =
  921. readl(reg + offs[PINCFG_TYPE_FUNC] + 4);
  922. pr_debug("Save %s @ %p (con %#010x %08x)\n",
  923. bank->name, reg,
  924. bank->pm_save[PINCFG_TYPE_FUNC],
  925. bank->pm_save[PINCFG_TYPE_NUM]);
  926. } else {
  927. pr_debug("Save %s @ %p (con %#010x)\n", bank->name,
  928. reg, bank->pm_save[PINCFG_TYPE_FUNC]);
  929. }
  930. }
  931. if (ctrl->suspend)
  932. ctrl->suspend(drvdata);
  933. }
  934. /**
  935. * samsung_pinctrl_resume_dev - restore pinctrl state from suspend for a device
  936. *
  937. * Restore one of the banks that was saved during suspend.
  938. *
  939. * We don't bother doing anything complicated to avoid glitching lines since
  940. * we're called before pad retention is turned off.
  941. */
  942. static void samsung_pinctrl_resume_dev(struct samsung_pinctrl_drv_data *drvdata)
  943. {
  944. struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
  945. void __iomem *virt_base = drvdata->virt_base;
  946. int i;
  947. if (ctrl->resume)
  948. ctrl->resume(drvdata);
  949. for (i = 0; i < ctrl->nr_banks; i++) {
  950. struct samsung_pin_bank *bank = &ctrl->pin_banks[i];
  951. void __iomem *reg = virt_base + bank->pctl_offset;
  952. u8 *offs = bank->type->reg_offset;
  953. u8 *widths = bank->type->fld_width;
  954. enum pincfg_type type;
  955. /* Registers without a powerdown config aren't lost */
  956. if (!widths[PINCFG_TYPE_CON_PDN])
  957. continue;
  958. if (widths[PINCFG_TYPE_FUNC] * bank->nr_pins > 32) {
  959. /* Some banks have two config registers */
  960. pr_debug("%s @ %p (con %#010x %08x => %#010x %08x)\n",
  961. bank->name, reg,
  962. readl(reg + offs[PINCFG_TYPE_FUNC]),
  963. readl(reg + offs[PINCFG_TYPE_FUNC] + 4),
  964. bank->pm_save[PINCFG_TYPE_FUNC],
  965. bank->pm_save[PINCFG_TYPE_NUM]);
  966. writel(bank->pm_save[PINCFG_TYPE_NUM],
  967. reg + offs[PINCFG_TYPE_FUNC] + 4);
  968. } else {
  969. pr_debug("%s @ %p (con %#010x => %#010x)\n", bank->name,
  970. reg, readl(reg + offs[PINCFG_TYPE_FUNC]),
  971. bank->pm_save[PINCFG_TYPE_FUNC]);
  972. }
  973. for (type = 0; type < PINCFG_TYPE_NUM; type++)
  974. if (widths[type])
  975. writel(bank->pm_save[type], reg + offs[type]);
  976. }
  977. }
  978. /**
  979. * samsung_pinctrl_suspend - save pinctrl state for suspend
  980. *
  981. * Save data for all banks across all devices.
  982. */
  983. static int samsung_pinctrl_suspend(void)
  984. {
  985. struct samsung_pinctrl_drv_data *drvdata;
  986. list_for_each_entry(drvdata, &drvdata_list, node) {
  987. samsung_pinctrl_suspend_dev(drvdata);
  988. }
  989. return 0;
  990. }
  991. /**
  992. * samsung_pinctrl_resume - restore pinctrl state for suspend
  993. *
  994. * Restore data for all banks across all devices.
  995. */
  996. static void samsung_pinctrl_resume(void)
  997. {
  998. struct samsung_pinctrl_drv_data *drvdata;
  999. list_for_each_entry_reverse(drvdata, &drvdata_list, node) {
  1000. samsung_pinctrl_resume_dev(drvdata);
  1001. }
  1002. }
  1003. #else
  1004. #define samsung_pinctrl_suspend NULL
  1005. #define samsung_pinctrl_resume NULL
  1006. #endif
  1007. static struct syscore_ops samsung_pinctrl_syscore_ops = {
  1008. .suspend = samsung_pinctrl_suspend,
  1009. .resume = samsung_pinctrl_resume,
  1010. };
  1011. static const struct of_device_id samsung_pinctrl_dt_match[] = {
  1012. #ifdef CONFIG_PINCTRL_EXYNOS
  1013. { .compatible = "samsung,exynos3250-pinctrl",
  1014. .data = (void *)exynos3250_pin_ctrl },
  1015. { .compatible = "samsung,exynos4210-pinctrl",
  1016. .data = (void *)exynos4210_pin_ctrl },
  1017. { .compatible = "samsung,exynos4x12-pinctrl",
  1018. .data = (void *)exynos4x12_pin_ctrl },
  1019. { .compatible = "samsung,exynos5250-pinctrl",
  1020. .data = (void *)exynos5250_pin_ctrl },
  1021. { .compatible = "samsung,exynos5260-pinctrl",
  1022. .data = (void *)exynos5260_pin_ctrl },
  1023. { .compatible = "samsung,exynos5420-pinctrl",
  1024. .data = (void *)exynos5420_pin_ctrl },
  1025. { .compatible = "samsung,s5pv210-pinctrl",
  1026. .data = (void *)s5pv210_pin_ctrl },
  1027. #endif
  1028. #ifdef CONFIG_PINCTRL_S3C64XX
  1029. { .compatible = "samsung,s3c64xx-pinctrl",
  1030. .data = s3c64xx_pin_ctrl },
  1031. #endif
  1032. #ifdef CONFIG_PINCTRL_S3C24XX
  1033. { .compatible = "samsung,s3c2412-pinctrl",
  1034. .data = s3c2412_pin_ctrl },
  1035. { .compatible = "samsung,s3c2416-pinctrl",
  1036. .data = s3c2416_pin_ctrl },
  1037. { .compatible = "samsung,s3c2440-pinctrl",
  1038. .data = s3c2440_pin_ctrl },
  1039. { .compatible = "samsung,s3c2450-pinctrl",
  1040. .data = s3c2450_pin_ctrl },
  1041. #endif
  1042. {},
  1043. };
  1044. MODULE_DEVICE_TABLE(of, samsung_pinctrl_dt_match);
  1045. static struct platform_driver samsung_pinctrl_driver = {
  1046. .probe = samsung_pinctrl_probe,
  1047. .driver = {
  1048. .name = "samsung-pinctrl",
  1049. .owner = THIS_MODULE,
  1050. .of_match_table = samsung_pinctrl_dt_match,
  1051. },
  1052. };
  1053. static int __init samsung_pinctrl_drv_register(void)
  1054. {
  1055. /*
  1056. * Register syscore ops for save/restore of registers across suspend.
  1057. * It's important to ensure that this driver is running at an earlier
  1058. * initcall level than any arch-specific init calls that install syscore
  1059. * ops that turn off pad retention (like exynos_pm_resume).
  1060. */
  1061. register_syscore_ops(&samsung_pinctrl_syscore_ops);
  1062. return platform_driver_register(&samsung_pinctrl_driver);
  1063. }
  1064. postcore_initcall(samsung_pinctrl_drv_register);
  1065. static void __exit samsung_pinctrl_drv_unregister(void)
  1066. {
  1067. platform_driver_unregister(&samsung_pinctrl_driver);
  1068. }
  1069. module_exit(samsung_pinctrl_drv_unregister);
  1070. MODULE_AUTHOR("Thomas Abraham <thomas.ab@samsung.com>");
  1071. MODULE_DESCRIPTION("Samsung pinctrl driver");
  1072. MODULE_LICENSE("GPL v2");