pinctrl-pef2256.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * PEF2256 also known as FALC56 driver
  4. *
  5. * Copyright 2023 CS GROUP France
  6. *
  7. * Author: Herve Codina <herve.codina@bootlin.com>
  8. */
  9. #include <linux/bitfield.h>
  10. #include <linux/framer/pef2256.h>
  11. #include <linux/module.h>
  12. #include <linux/of.h>
  13. #include <linux/pinctrl/pinctrl.h>
  14. #include <linux/pinctrl/pinconf-generic.h>
  15. #include <linux/pinctrl/pinmux.h>
  16. #include <linux/platform_device.h>
  17. #include <linux/regmap.h>
  18. #include <linux/slab.h>
  19. /* Port Configuration 1..4 */
  20. #define PEF2256_PC1 0x80
  21. #define PEF2256_PC2 0x81
  22. #define PEF2256_PC3 0x82
  23. #define PEF2256_PC4 0x83
  24. #define PEF2256_12_PC_RPC_MASK GENMASK(6, 4)
  25. #define PEF2256_12_PC_RPC_SYPR FIELD_PREP_CONST(PEF2256_12_PC_RPC_MASK, 0x0)
  26. #define PEF2256_12_PC_RPC_RFM FIELD_PREP_CONST(PEF2256_12_PC_RPC_MASK, 0x1)
  27. #define PEF2256_12_PC_RPC_RFMB FIELD_PREP_CONST(PEF2256_12_PC_RPC_MASK, 0x2)
  28. #define PEF2256_12_PC_RPC_RSIGM FIELD_PREP_CONST(PEF2256_12_PC_RPC_MASK, 0x3)
  29. #define PEF2256_12_PC_RPC_RSIG FIELD_PREP_CONST(PEF2256_12_PC_RPC_MASK, 0x4)
  30. #define PEF2256_12_PC_RPC_DLR FIELD_PREP_CONST(PEF2256_12_PC_RPC_MASK, 0x5)
  31. #define PEF2256_12_PC_RPC_FREEZE FIELD_PREP_CONST(PEF2256_12_PC_RPC_MASK, 0x6)
  32. #define PEF2256_12_PC_RPC_RFSP FIELD_PREP_CONST(PEF2256_12_PC_RPC_MASK, 0x7)
  33. #define PEF2256_12_PC_XPC_MASK GENMASK(4, 0)
  34. #define PEF2256_12_PC_XPC_SYPX FIELD_PREP_CONST(PEF2256_12_PC_XPC_MASK, 0x0)
  35. #define PEF2256_12_PC_XPC_XFMS FIELD_PREP_CONST(PEF2256_12_PC_XPC_MASK, 0x1)
  36. #define PEF2256_12_PC_XPC_XSIG FIELD_PREP_CONST(PEF2256_12_PC_XPC_MASK, 0x2)
  37. #define PEF2256_12_PC_XPC_TCLK FIELD_PREP_CONST(PEF2256_12_PC_XPC_MASK, 0x3)
  38. #define PEF2256_12_PC_XPC_XMFB FIELD_PREP_CONST(PEF2256_12_PC_XPC_MASK, 0x4)
  39. #define PEF2256_12_PC_XPC_XSIGM FIELD_PREP_CONST(PEF2256_12_PC_XPC_MASK, 0x5)
  40. #define PEF2256_12_PC_XPC_DLX FIELD_PREP_CONST(PEF2256_12_PC_XPC_MASK, 0x6)
  41. #define PEF2256_12_PC_XPC_XCLK FIELD_PREP_CONST(PEF2256_12_PC_XPC_MASK, 0x7)
  42. #define PEF2256_12_PC_XPC_XLT FIELD_PREP_CONST(PEF2256_12_PC_XPC_MASK, 0x8)
  43. #define PEF2256_2X_PC_RPC_MASK GENMASK(7, 4)
  44. #define PEF2256_2X_PC_RPC_SYPR FIELD_PREP_CONST(PEF2256_2X_PC_RPC_MASK, 0x0)
  45. #define PEF2256_2X_PC_RPC_RFM FIELD_PREP_CONST(PEF2256_2X_PC_RPC_MASK, 0x1)
  46. #define PEF2256_2X_PC_RPC_RFMB FIELD_PREP_CONST(PEF2256_2X_PC_RPC_MASK, 0x2)
  47. #define PEF2256_2X_PC_RPC_RSIGM FIELD_PREP_CONST(PEF2256_2X_PC_RPC_MASK, 0x3)
  48. #define PEF2256_2X_PC_RPC_RSIG FIELD_PREP_CONST(PEF2256_2X_PC_RPC_MASK, 0x4)
  49. #define PEF2256_2X_PC_RPC_DLR FIELD_PREP_CONST(PEF2256_2X_PC_RPC_MASK, 0x5)
  50. #define PEF2256_2X_PC_RPC_FREEZE FIELD_PREP_CONST(PEF2256_2X_PC_RPC_MASK, 0x6)
  51. #define PEF2256_2X_PC_RPC_RFSP FIELD_PREP_CONST(PEF2256_2X_PC_RPC_MASK, 0x7)
  52. #define PEF2256_2X_PC_RPC_GPI FIELD_PREP_CONST(PEF2256_2X_PC_RPC_MASK, 0x9)
  53. #define PEF2256_2X_PC_RPC_GPOH FIELD_PREP_CONST(PEF2256_2X_PC_RPC_MASK, 0xa)
  54. #define PEF2256_2X_PC_RPC_GPOL FIELD_PREP_CONST(PEF2256_2X_PC_RPC_MASK, 0xb)
  55. #define PEF2256_2X_PC_RPC_LOS FIELD_PREP_CONST(PEF2256_2X_PC_RPC_MASK, 0xc)
  56. #define PEF2256_2X_PC_XPC_MASK GENMASK(3, 0)
  57. #define PEF2256_2X_PC_XPC_SYPX FIELD_PREP_CONST(PEF2256_2X_PC_XPC_MASK, 0x0)
  58. #define PEF2256_2X_PC_XPC_XFMS FIELD_PREP_CONST(PEF2256_2X_PC_XPC_MASK, 0x1)
  59. #define PEF2256_2X_PC_XPC_XSIG FIELD_PREP_CONST(PEF2256_2X_PC_XPC_MASK, 0x2)
  60. #define PEF2256_2X_PC_XPC_TCLK FIELD_PREP_CONST(PEF2256_2X_PC_XPC_MASK, 0x3)
  61. #define PEF2256_2X_PC_XPC_XMFB FIELD_PREP_CONST(PEF2256_2X_PC_XPC_MASK, 0x4)
  62. #define PEF2256_2X_PC_XPC_XSIGM FIELD_PREP_CONST(PEF2256_2X_PC_XPC_MASK, 0x5)
  63. #define PEF2256_2X_PC_XPC_DLX FIELD_PREP_CONST(PEF2256_2X_PC_XPC_MASK, 0x6)
  64. #define PEF2256_2X_PC_XPC_XCLK FIELD_PREP_CONST(PEF2256_2X_PC_XPC_MASK, 0x7)
  65. #define PEF2256_2X_PC_XPC_XLT FIELD_PREP_CONST(PEF2256_2X_PC_XPC_MASK, 0x8)
  66. #define PEF2256_2X_PC_XPC_GPI FIELD_PREP_CONST(PEF2256_2X_PC_XPC_MASK, 0x9)
  67. #define PEF2256_2X_PC_XPC_GPOH FIELD_PREP_CONST(PEF2256_2X_PC_XPC_MASK, 0xa)
  68. #define PEF2256_2X_PC_XPC_GPOL FIELD_PREP_CONST(PEF2256_2X_PC_XPC_MASK, 0xb)
  69. struct pef2256_pinreg_desc {
  70. int offset;
  71. u8 mask;
  72. };
  73. struct pef2256_function_desc {
  74. const char *name;
  75. const char * const*groups;
  76. unsigned int ngroups;
  77. u8 func_val;
  78. };
  79. struct pef2256_pinctrl {
  80. struct device *dev;
  81. struct regmap *regmap;
  82. enum pef2256_version version;
  83. struct pinctrl_desc pctrl_desc;
  84. const struct pef2256_function_desc *functions;
  85. unsigned int nfunctions;
  86. };
  87. static int pef2256_get_groups_count(struct pinctrl_dev *pctldev)
  88. {
  89. struct pef2256_pinctrl *pef2256 = pinctrl_dev_get_drvdata(pctldev);
  90. /* We map 1 group <-> 1 pin */
  91. return pef2256->pctrl_desc.npins;
  92. }
  93. static const char *pef2256_get_group_name(struct pinctrl_dev *pctldev,
  94. unsigned int selector)
  95. {
  96. struct pef2256_pinctrl *pef2256 = pinctrl_dev_get_drvdata(pctldev);
  97. /* We map 1 group <-> 1 pin */
  98. return pef2256->pctrl_desc.pins[selector].name;
  99. }
  100. static int pef2256_get_group_pins(struct pinctrl_dev *pctldev, unsigned int selector,
  101. const unsigned int **pins,
  102. unsigned int *num_pins)
  103. {
  104. struct pef2256_pinctrl *pef2256 = pinctrl_dev_get_drvdata(pctldev);
  105. /* We map 1 group <-> 1 pin */
  106. *pins = &pef2256->pctrl_desc.pins[selector].number;
  107. *num_pins = 1;
  108. return 0;
  109. }
  110. static const struct pinctrl_ops pef2256_pctlops = {
  111. .get_groups_count = pef2256_get_groups_count,
  112. .get_group_name = pef2256_get_group_name,
  113. .get_group_pins = pef2256_get_group_pins,
  114. .dt_node_to_map = pinconf_generic_dt_node_to_map_pin,
  115. .dt_free_map = pinconf_generic_dt_free_map,
  116. };
  117. static int pef2256_get_functions_count(struct pinctrl_dev *pctldev)
  118. {
  119. struct pef2256_pinctrl *pef2256 = pinctrl_dev_get_drvdata(pctldev);
  120. return pef2256->nfunctions;
  121. }
  122. static const char *pef2256_get_function_name(struct pinctrl_dev *pctldev,
  123. unsigned int selector)
  124. {
  125. struct pef2256_pinctrl *pef2256 = pinctrl_dev_get_drvdata(pctldev);
  126. return pef2256->functions[selector].name;
  127. }
  128. static int pef2256_get_function_groups(struct pinctrl_dev *pctldev, unsigned int selector,
  129. const char * const **groups,
  130. unsigned * const num_groups)
  131. {
  132. struct pef2256_pinctrl *pef2256 = pinctrl_dev_get_drvdata(pctldev);
  133. *groups = pef2256->functions[selector].groups;
  134. *num_groups = pef2256->functions[selector].ngroups;
  135. return 0;
  136. }
  137. static int pef2256_set_mux(struct pinctrl_dev *pctldev, unsigned int func_selector,
  138. unsigned int group_selector)
  139. {
  140. struct pef2256_pinctrl *pef2256 = pinctrl_dev_get_drvdata(pctldev);
  141. const struct pef2256_pinreg_desc *pinreg_desc;
  142. u8 func_val;
  143. /* We map 1 group <-> 1 pin */
  144. pinreg_desc = pef2256->pctrl_desc.pins[group_selector].drv_data;
  145. func_val = pef2256->functions[func_selector].func_val;
  146. return regmap_update_bits(pef2256->regmap, pinreg_desc->offset,
  147. pinreg_desc->mask, func_val);
  148. }
  149. static const struct pinmux_ops pef2256_pmxops = {
  150. .get_functions_count = pef2256_get_functions_count,
  151. .get_function_name = pef2256_get_function_name,
  152. .get_function_groups = pef2256_get_function_groups,
  153. .set_mux = pef2256_set_mux,
  154. };
  155. #define PEF2256_PINCTRL_PIN(_number, _name, _offset, _mask) { \
  156. .number = _number, \
  157. .name = _name, \
  158. .drv_data = &(struct pef2256_pinreg_desc) { \
  159. .offset = _offset, \
  160. .mask = _mask, \
  161. }, \
  162. }
  163. static const struct pinctrl_pin_desc pef2256_v12_pins[] = {
  164. PEF2256_PINCTRL_PIN(0, "RPA", PEF2256_PC1, PEF2256_12_PC_RPC_MASK),
  165. PEF2256_PINCTRL_PIN(1, "RPB", PEF2256_PC2, PEF2256_12_PC_RPC_MASK),
  166. PEF2256_PINCTRL_PIN(2, "RPC", PEF2256_PC3, PEF2256_12_PC_RPC_MASK),
  167. PEF2256_PINCTRL_PIN(3, "RPD", PEF2256_PC4, PEF2256_12_PC_RPC_MASK),
  168. PEF2256_PINCTRL_PIN(4, "XPA", PEF2256_PC1, PEF2256_12_PC_XPC_MASK),
  169. PEF2256_PINCTRL_PIN(5, "XPB", PEF2256_PC2, PEF2256_12_PC_XPC_MASK),
  170. PEF2256_PINCTRL_PIN(6, "XPC", PEF2256_PC3, PEF2256_12_PC_XPC_MASK),
  171. PEF2256_PINCTRL_PIN(7, "XPD", PEF2256_PC4, PEF2256_12_PC_XPC_MASK),
  172. };
  173. static const struct pinctrl_pin_desc pef2256_v2x_pins[] = {
  174. PEF2256_PINCTRL_PIN(0, "RPA", PEF2256_PC1, PEF2256_2X_PC_RPC_MASK),
  175. PEF2256_PINCTRL_PIN(1, "RPB", PEF2256_PC2, PEF2256_2X_PC_RPC_MASK),
  176. PEF2256_PINCTRL_PIN(2, "RPC", PEF2256_PC3, PEF2256_2X_PC_RPC_MASK),
  177. PEF2256_PINCTRL_PIN(3, "RPD", PEF2256_PC4, PEF2256_2X_PC_RPC_MASK),
  178. PEF2256_PINCTRL_PIN(4, "XPA", PEF2256_PC1, PEF2256_2X_PC_XPC_MASK),
  179. PEF2256_PINCTRL_PIN(5, "XPB", PEF2256_PC2, PEF2256_2X_PC_XPC_MASK),
  180. PEF2256_PINCTRL_PIN(6, "XPC", PEF2256_PC3, PEF2256_2X_PC_XPC_MASK),
  181. PEF2256_PINCTRL_PIN(7, "XPD", PEF2256_PC4, PEF2256_2X_PC_XPC_MASK),
  182. };
  183. static const char *const pef2256_rp_groups[] = { "RPA", "RPB", "RPC", "RPD" };
  184. static const char *const pef2256_xp_groups[] = { "XPA", "XPB", "XPC", "XPD" };
  185. static const char *const pef2256_all_groups[] = { "RPA", "RPB", "RPC", "RPD",
  186. "XPA", "XPB", "XPC", "XPD" };
  187. #define PEF2256_FUNCTION(_name, _func_val, _groups) { \
  188. .name = _name, \
  189. .groups = _groups, \
  190. .ngroups = ARRAY_SIZE(_groups), \
  191. .func_val = _func_val, \
  192. }
  193. static const struct pef2256_function_desc pef2256_v2x_functions[] = {
  194. PEF2256_FUNCTION("SYPR", PEF2256_2X_PC_RPC_SYPR, pef2256_rp_groups),
  195. PEF2256_FUNCTION("RFM", PEF2256_2X_PC_RPC_RFM, pef2256_rp_groups),
  196. PEF2256_FUNCTION("RFMB", PEF2256_2X_PC_RPC_RFMB, pef2256_rp_groups),
  197. PEF2256_FUNCTION("RSIGM", PEF2256_2X_PC_RPC_RSIGM, pef2256_rp_groups),
  198. PEF2256_FUNCTION("RSIG", PEF2256_2X_PC_RPC_RSIG, pef2256_rp_groups),
  199. PEF2256_FUNCTION("DLR", PEF2256_2X_PC_RPC_DLR, pef2256_rp_groups),
  200. PEF2256_FUNCTION("FREEZE", PEF2256_2X_PC_RPC_FREEZE, pef2256_rp_groups),
  201. PEF2256_FUNCTION("RFSP", PEF2256_2X_PC_RPC_RFSP, pef2256_rp_groups),
  202. PEF2256_FUNCTION("LOS", PEF2256_2X_PC_RPC_LOS, pef2256_rp_groups),
  203. PEF2256_FUNCTION("SYPX", PEF2256_2X_PC_XPC_SYPX, pef2256_xp_groups),
  204. PEF2256_FUNCTION("XFMS", PEF2256_2X_PC_XPC_XFMS, pef2256_xp_groups),
  205. PEF2256_FUNCTION("XSIG", PEF2256_2X_PC_XPC_XSIG, pef2256_xp_groups),
  206. PEF2256_FUNCTION("TCLK", PEF2256_2X_PC_XPC_TCLK, pef2256_xp_groups),
  207. PEF2256_FUNCTION("XMFB", PEF2256_2X_PC_XPC_XMFB, pef2256_xp_groups),
  208. PEF2256_FUNCTION("XSIGM", PEF2256_2X_PC_XPC_XSIGM, pef2256_xp_groups),
  209. PEF2256_FUNCTION("DLX", PEF2256_2X_PC_XPC_DLX, pef2256_xp_groups),
  210. PEF2256_FUNCTION("XCLK", PEF2256_2X_PC_XPC_XCLK, pef2256_xp_groups),
  211. PEF2256_FUNCTION("XLT", PEF2256_2X_PC_XPC_XLT, pef2256_xp_groups),
  212. PEF2256_FUNCTION("GPI", PEF2256_2X_PC_RPC_GPI | PEF2256_2X_PC_XPC_GPI,
  213. pef2256_all_groups),
  214. PEF2256_FUNCTION("GPOH", PEF2256_2X_PC_RPC_GPOH | PEF2256_2X_PC_XPC_GPOH,
  215. pef2256_all_groups),
  216. PEF2256_FUNCTION("GPOL", PEF2256_2X_PC_RPC_GPOL | PEF2256_2X_PC_XPC_GPOL,
  217. pef2256_all_groups),
  218. };
  219. static const struct pef2256_function_desc pef2256_v12_functions[] = {
  220. PEF2256_FUNCTION("SYPR", PEF2256_12_PC_RPC_SYPR, pef2256_rp_groups),
  221. PEF2256_FUNCTION("RFM", PEF2256_12_PC_RPC_RFM, pef2256_rp_groups),
  222. PEF2256_FUNCTION("RFMB", PEF2256_12_PC_RPC_RFMB, pef2256_rp_groups),
  223. PEF2256_FUNCTION("RSIGM", PEF2256_12_PC_RPC_RSIGM, pef2256_rp_groups),
  224. PEF2256_FUNCTION("RSIG", PEF2256_12_PC_RPC_RSIG, pef2256_rp_groups),
  225. PEF2256_FUNCTION("DLR", PEF2256_12_PC_RPC_DLR, pef2256_rp_groups),
  226. PEF2256_FUNCTION("FREEZE", PEF2256_12_PC_RPC_FREEZE, pef2256_rp_groups),
  227. PEF2256_FUNCTION("RFSP", PEF2256_12_PC_RPC_RFSP, pef2256_rp_groups),
  228. PEF2256_FUNCTION("SYPX", PEF2256_12_PC_XPC_SYPX, pef2256_xp_groups),
  229. PEF2256_FUNCTION("XFMS", PEF2256_12_PC_XPC_XFMS, pef2256_xp_groups),
  230. PEF2256_FUNCTION("XSIG", PEF2256_12_PC_XPC_XSIG, pef2256_xp_groups),
  231. PEF2256_FUNCTION("TCLK", PEF2256_12_PC_XPC_TCLK, pef2256_xp_groups),
  232. PEF2256_FUNCTION("XMFB", PEF2256_12_PC_XPC_XMFB, pef2256_xp_groups),
  233. PEF2256_FUNCTION("XSIGM", PEF2256_12_PC_XPC_XSIGM, pef2256_xp_groups),
  234. PEF2256_FUNCTION("DLX", PEF2256_12_PC_XPC_DLX, pef2256_xp_groups),
  235. PEF2256_FUNCTION("XCLK", PEF2256_12_PC_XPC_XCLK, pef2256_xp_groups),
  236. PEF2256_FUNCTION("XLT", PEF2256_12_PC_XPC_XLT, pef2256_xp_groups),
  237. };
  238. static int pef2256_register_pinctrl(struct pef2256_pinctrl *pef2256)
  239. {
  240. struct pinctrl_dev *pctrl;
  241. pef2256->pctrl_desc.name = dev_name(pef2256->dev);
  242. pef2256->pctrl_desc.owner = THIS_MODULE;
  243. pef2256->pctrl_desc.pctlops = &pef2256_pctlops;
  244. pef2256->pctrl_desc.pmxops = &pef2256_pmxops;
  245. if (pef2256->version == PEF2256_VERSION_1_2) {
  246. pef2256->pctrl_desc.pins = pef2256_v12_pins;
  247. pef2256->pctrl_desc.npins = ARRAY_SIZE(pef2256_v12_pins);
  248. pef2256->functions = pef2256_v12_functions;
  249. pef2256->nfunctions = ARRAY_SIZE(pef2256_v12_functions);
  250. } else {
  251. pef2256->pctrl_desc.pins = pef2256_v2x_pins;
  252. pef2256->pctrl_desc.npins = ARRAY_SIZE(pef2256_v2x_pins);
  253. pef2256->functions = pef2256_v2x_functions;
  254. pef2256->nfunctions = ARRAY_SIZE(pef2256_v2x_functions);
  255. }
  256. pctrl = devm_pinctrl_register(pef2256->dev, &pef2256->pctrl_desc, pef2256);
  257. if (IS_ERR(pctrl))
  258. return dev_err_probe(pef2256->dev, PTR_ERR(pctrl),
  259. "pinctrl driver registration failed\n");
  260. return 0;
  261. }
  262. static void pef2256_reset_pinmux(struct pef2256_pinctrl *pef2256)
  263. {
  264. u8 val;
  265. /*
  266. * Reset values cannot be used.
  267. * They define the SYPR/SYPX pin mux for all the RPx and XPx pins and
  268. * Only one pin can be muxed to SYPR and one pin can be muxed to SYPX.
  269. * Choose here an other reset value.
  270. */
  271. if (pef2256->version == PEF2256_VERSION_1_2)
  272. val = PEF2256_12_PC_XPC_XCLK | PEF2256_12_PC_RPC_RFSP;
  273. else
  274. val = PEF2256_2X_PC_XPC_GPI | PEF2256_2X_PC_RPC_GPI;
  275. regmap_write(pef2256->regmap, PEF2256_PC1, val);
  276. regmap_write(pef2256->regmap, PEF2256_PC2, val);
  277. regmap_write(pef2256->regmap, PEF2256_PC3, val);
  278. regmap_write(pef2256->regmap, PEF2256_PC4, val);
  279. }
  280. static int pef2256_pinctrl_probe(struct platform_device *pdev)
  281. {
  282. struct pef2256_pinctrl *pef2256_pinctrl;
  283. struct pef2256 *pef2256;
  284. int ret;
  285. pef2256_pinctrl = devm_kzalloc(&pdev->dev, sizeof(*pef2256_pinctrl), GFP_KERNEL);
  286. if (!pef2256_pinctrl)
  287. return -ENOMEM;
  288. device_set_node(&pdev->dev, dev_fwnode(pdev->dev.parent));
  289. pef2256 = dev_get_drvdata(pdev->dev.parent);
  290. pef2256_pinctrl->dev = &pdev->dev;
  291. pef2256_pinctrl->regmap = pef2256_get_regmap(pef2256);
  292. pef2256_pinctrl->version = pef2256_get_version(pef2256);
  293. platform_set_drvdata(pdev, pef2256_pinctrl);
  294. pef2256_reset_pinmux(pef2256_pinctrl);
  295. ret = pef2256_register_pinctrl(pef2256_pinctrl);
  296. if (ret)
  297. return ret;
  298. return 0;
  299. }
  300. static struct platform_driver pef2256_pinctrl_driver = {
  301. .driver = {
  302. .name = "lantiq-pef2256-pinctrl",
  303. },
  304. .probe = pef2256_pinctrl_probe,
  305. };
  306. module_platform_driver(pef2256_pinctrl_driver);
  307. MODULE_AUTHOR("Herve Codina <herve.codina@bootlin.com>");
  308. MODULE_DESCRIPTION("PEF2256 pin controller driver");
  309. MODULE_LICENSE("GPL");