pinctrl-samsung.c 36 KB

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