pinctrl-k230.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651
  1. // SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
  2. /*
  3. * Copyright (C) 2024 Canaan Bright Sight Co. Ltd
  4. * Copyright (C) 2024 Ze Huang <18771902331@163.com>
  5. */
  6. #include <linux/module.h>
  7. #include <linux/device.h>
  8. #include <linux/of.h>
  9. #include <linux/of_address.h>
  10. #include <linux/of_device.h>
  11. #include <linux/platform_device.h>
  12. #include <linux/pinctrl/pinctrl.h>
  13. #include <linux/pinctrl/pinmux.h>
  14. #include <linux/pinctrl/pinconf.h>
  15. #include <linux/pinctrl/pinconf-generic.h>
  16. #include <linux/regmap.h>
  17. #include <linux/seq_file.h>
  18. #include "core.h"
  19. #include "pinconf.h"
  20. #define K230_NPINS 64
  21. #define K230_SHIFT_ST (0)
  22. #define K230_SHIFT_DS (1)
  23. #define K230_SHIFT_BIAS (5)
  24. #define K230_SHIFT_PD (5)
  25. #define K230_SHIFT_PU (6)
  26. #define K230_SHIFT_OE (7)
  27. #define K230_SHIFT_IE (8)
  28. #define K230_SHIFT_MSC (9)
  29. #define K230_SHIFT_SL (10)
  30. #define K230_SHIFT_SEL (11)
  31. #define K230_PC_ST BIT(0)
  32. #define K230_PC_DS GENMASK(4, 1)
  33. #define K230_PC_PD BIT(5)
  34. #define K230_PC_PU BIT(6)
  35. #define K230_PC_BIAS GENMASK(6, 5)
  36. #define K230_PC_OE BIT(7)
  37. #define K230_PC_IE BIT(8)
  38. #define K230_PC_MSC BIT(9)
  39. #define K230_PC_SL BIT(10)
  40. #define K230_PC_SEL GENMASK(13, 11)
  41. struct k230_pin_conf {
  42. unsigned int func;
  43. unsigned long *configs;
  44. unsigned int nconfigs;
  45. };
  46. struct k230_pin_group {
  47. const char *name;
  48. unsigned int *pins;
  49. unsigned int num_pins;
  50. struct k230_pin_conf *data;
  51. };
  52. struct k230_pmx_func {
  53. const char *name;
  54. const char **groups;
  55. unsigned int *group_idx;
  56. unsigned int ngroups;
  57. };
  58. struct k230_pinctrl {
  59. struct device *dev;
  60. struct pinctrl_desc pctl;
  61. struct pinctrl_dev *pctl_dev;
  62. struct regmap *regmap_base;
  63. void __iomem *base;
  64. struct k230_pin_group *groups;
  65. unsigned int ngroups;
  66. struct k230_pmx_func *functions;
  67. unsigned int nfunctions;
  68. };
  69. static const struct regmap_config k230_regmap_config = {
  70. .name = "canaan,pinctrl",
  71. .reg_bits = 32,
  72. .val_bits = 32,
  73. .max_register = 0x100,
  74. .reg_stride = 4,
  75. };
  76. static int k230_get_groups_count(struct pinctrl_dev *pctldev)
  77. {
  78. struct k230_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
  79. return info->ngroups;
  80. }
  81. static const char *k230_get_group_name(struct pinctrl_dev *pctldev,
  82. unsigned int selector)
  83. {
  84. struct k230_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
  85. return info->groups[selector].name;
  86. }
  87. static int k230_get_group_pins(struct pinctrl_dev *pctldev,
  88. unsigned int selector,
  89. const unsigned int **pins,
  90. unsigned int *num_pins)
  91. {
  92. struct k230_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
  93. if (selector >= info->ngroups)
  94. return -EINVAL;
  95. *pins = info->groups[selector].pins;
  96. *num_pins = info->groups[selector].num_pins;
  97. return 0;
  98. }
  99. static inline const struct k230_pmx_func *k230_name_to_funtion(
  100. const struct k230_pinctrl *info, const char *name)
  101. {
  102. unsigned int i;
  103. for (i = 0; i < info->nfunctions; i++) {
  104. if (!strcmp(info->functions[i].name, name))
  105. return &info->functions[i];
  106. }
  107. return NULL;
  108. }
  109. static struct pinctrl_pin_desc k230_pins[] = {
  110. PINCTRL_PIN(0, "IO0"), PINCTRL_PIN(1, "IO1"), PINCTRL_PIN(2, "IO2"),
  111. PINCTRL_PIN(3, "IO3"), PINCTRL_PIN(4, "IO4"), PINCTRL_PIN(5, "IO5"),
  112. PINCTRL_PIN(6, "IO6"), PINCTRL_PIN(7, "IO7"), PINCTRL_PIN(8, "IO8"),
  113. PINCTRL_PIN(9, "IO9"), PINCTRL_PIN(10, "IO10"), PINCTRL_PIN(11, "IO11"),
  114. PINCTRL_PIN(12, "IO12"), PINCTRL_PIN(13, "IO13"), PINCTRL_PIN(14, "IO14"),
  115. PINCTRL_PIN(15, "IO15"), PINCTRL_PIN(16, "IO16"), PINCTRL_PIN(17, "IO17"),
  116. PINCTRL_PIN(18, "IO18"), PINCTRL_PIN(19, "IO19"), PINCTRL_PIN(20, "IO20"),
  117. PINCTRL_PIN(21, "IO21"), PINCTRL_PIN(22, "IO22"), PINCTRL_PIN(23, "IO23"),
  118. PINCTRL_PIN(24, "IO24"), PINCTRL_PIN(25, "IO25"), PINCTRL_PIN(26, "IO26"),
  119. PINCTRL_PIN(27, "IO27"), PINCTRL_PIN(28, "IO28"), PINCTRL_PIN(29, "IO29"),
  120. PINCTRL_PIN(30, "IO30"), PINCTRL_PIN(31, "IO31"), PINCTRL_PIN(32, "IO32"),
  121. PINCTRL_PIN(33, "IO33"), PINCTRL_PIN(34, "IO34"), PINCTRL_PIN(35, "IO35"),
  122. PINCTRL_PIN(36, "IO36"), PINCTRL_PIN(37, "IO37"), PINCTRL_PIN(38, "IO38"),
  123. PINCTRL_PIN(39, "IO39"), PINCTRL_PIN(40, "IO40"), PINCTRL_PIN(41, "IO41"),
  124. PINCTRL_PIN(42, "IO42"), PINCTRL_PIN(43, "IO43"), PINCTRL_PIN(44, "IO44"),
  125. PINCTRL_PIN(45, "IO45"), PINCTRL_PIN(46, "IO46"), PINCTRL_PIN(47, "IO47"),
  126. PINCTRL_PIN(48, "IO48"), PINCTRL_PIN(49, "IO49"), PINCTRL_PIN(50, "IO50"),
  127. PINCTRL_PIN(51, "IO51"), PINCTRL_PIN(52, "IO52"), PINCTRL_PIN(53, "IO53"),
  128. PINCTRL_PIN(54, "IO54"), PINCTRL_PIN(55, "IO55"), PINCTRL_PIN(56, "IO56"),
  129. PINCTRL_PIN(57, "IO57"), PINCTRL_PIN(58, "IO58"), PINCTRL_PIN(59, "IO59"),
  130. PINCTRL_PIN(60, "IO60"), PINCTRL_PIN(61, "IO61"), PINCTRL_PIN(62, "IO62"),
  131. PINCTRL_PIN(63, "IO63")
  132. };
  133. static void k230_pinctrl_pin_dbg_show(struct pinctrl_dev *pctldev,
  134. struct seq_file *s, unsigned int offset)
  135. {
  136. struct k230_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
  137. u32 val, bias, drive, input, slew, schmitt, power;
  138. struct k230_pin_group *grp = k230_pins[offset].drv_data;
  139. static const char * const biasing[] = {
  140. "pull none", "pull down", "pull up", "" };
  141. static const char * const enable[] = {
  142. "disable", "enable" };
  143. static const char * const power_source[] = {
  144. "3V3", "1V8" };
  145. regmap_read(info->regmap_base, offset * 4, &val);
  146. drive = (val & K230_PC_DS) >> K230_SHIFT_DS;
  147. bias = (val & K230_PC_BIAS) >> K230_SHIFT_BIAS;
  148. input = (val & K230_PC_IE) >> K230_SHIFT_IE;
  149. slew = (val & K230_PC_SL) >> K230_SHIFT_SL;
  150. schmitt = (val & K230_PC_ST) >> K230_SHIFT_ST;
  151. power = (val & K230_PC_MSC) >> K230_SHIFT_MSC;
  152. seq_printf(s, "%s - strength %d - %s - %s - slewrate %s - schmitt %s - %s",
  153. grp ? grp->name : "unknown",
  154. drive,
  155. biasing[bias],
  156. input ? "input" : "output",
  157. enable[slew],
  158. enable[schmitt],
  159. power_source[power]);
  160. }
  161. static int k230_dt_node_to_map(struct pinctrl_dev *pctldev,
  162. struct device_node *np_config,
  163. struct pinctrl_map **map,
  164. unsigned int *num_maps)
  165. {
  166. struct k230_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
  167. struct device *dev = info->pctl_dev->dev;
  168. const struct k230_pmx_func *func;
  169. const struct k230_pin_group *grp;
  170. struct pinctrl_map *new_map;
  171. int map_num, i, j, idx;
  172. unsigned int grp_id;
  173. func = k230_name_to_funtion(info, np_config->name);
  174. if (!func) {
  175. dev_err(dev, "function %s not found\n", np_config->name);
  176. return -EINVAL;
  177. }
  178. map_num = 0;
  179. for (i = 0; i < func->ngroups; ++i) {
  180. grp_id = func->group_idx[i];
  181. /* npins of config map plus a mux map */
  182. map_num += info->groups[grp_id].num_pins + 1;
  183. }
  184. new_map = kzalloc_objs(*new_map, map_num);
  185. if (!new_map)
  186. return -ENOMEM;
  187. *map = new_map;
  188. *num_maps = map_num;
  189. idx = 0;
  190. for (i = 0; i < func->ngroups; ++i) {
  191. grp_id = func->group_idx[i];
  192. grp = &info->groups[grp_id];
  193. new_map[idx].type = PIN_MAP_TYPE_MUX_GROUP;
  194. new_map[idx].data.mux.group = grp->name;
  195. new_map[idx].data.mux.function = np_config->name;
  196. idx++;
  197. for (j = 0; j < grp->num_pins; ++j) {
  198. new_map[idx].type = PIN_MAP_TYPE_CONFIGS_PIN;
  199. new_map[idx].data.configs.group_or_pin =
  200. pin_get_name(pctldev, grp->pins[j]);
  201. new_map[idx].data.configs.configs =
  202. grp->data[j].configs;
  203. new_map[idx].data.configs.num_configs =
  204. grp->data[j].nconfigs;
  205. idx++;
  206. }
  207. }
  208. return 0;
  209. }
  210. static void k230_dt_free_map(struct pinctrl_dev *pctldev,
  211. struct pinctrl_map *map, unsigned int num_maps)
  212. {
  213. kfree(map);
  214. }
  215. static const struct pinctrl_ops k230_pctrl_ops = {
  216. .get_groups_count = k230_get_groups_count,
  217. .get_group_name = k230_get_group_name,
  218. .get_group_pins = k230_get_group_pins,
  219. .pin_dbg_show = k230_pinctrl_pin_dbg_show,
  220. .dt_node_to_map = k230_dt_node_to_map,
  221. .dt_free_map = k230_dt_free_map,
  222. };
  223. static int k230_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,
  224. unsigned long *config)
  225. {
  226. struct k230_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
  227. enum pin_config_param param = pinconf_to_config_param(*config);
  228. unsigned int val, arg;
  229. regmap_read(info->regmap_base, pin * 4, &val);
  230. switch (param) {
  231. case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
  232. arg = (val & K230_PC_ST) ? 1 : 0;
  233. break;
  234. case PIN_CONFIG_DRIVE_STRENGTH:
  235. arg = (val & K230_PC_DS) >> K230_SHIFT_DS;
  236. break;
  237. case PIN_CONFIG_BIAS_DISABLE:
  238. arg = (val & K230_PC_BIAS) ? 0 : 1;
  239. break;
  240. case PIN_CONFIG_BIAS_PULL_DOWN:
  241. arg = (val & K230_PC_PD) ? 1 : 0;
  242. break;
  243. case PIN_CONFIG_BIAS_PULL_UP:
  244. arg = (val & K230_PC_PU) ? 1 : 0;
  245. break;
  246. case PIN_CONFIG_OUTPUT_ENABLE:
  247. arg = (val & K230_PC_OE) ? 1 : 0;
  248. break;
  249. case PIN_CONFIG_INPUT_ENABLE:
  250. arg = (val & K230_PC_IE) ? 1 : 0;
  251. break;
  252. case PIN_CONFIG_POWER_SOURCE:
  253. arg = (val & K230_PC_MSC) ? 1 : 0;
  254. break;
  255. case PIN_CONFIG_SLEW_RATE:
  256. arg = (val & K230_PC_SL) ? 1 : 0;
  257. break;
  258. default:
  259. return -EINVAL;
  260. }
  261. *config = pinconf_to_config_packed(param, arg);
  262. return 0;
  263. }
  264. static int k230_pinconf_set_param(struct pinctrl_dev *pctldev, unsigned int pin,
  265. enum pin_config_param param, unsigned int arg)
  266. {
  267. struct k230_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
  268. unsigned int val;
  269. regmap_read(info->regmap_base, pin * 4, &val);
  270. switch (param) {
  271. case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
  272. if (arg)
  273. val |= K230_PC_ST;
  274. else
  275. val &= ~K230_PC_ST;
  276. break;
  277. case PIN_CONFIG_DRIVE_STRENGTH:
  278. val &= ~K230_PC_DS;
  279. val |= (arg << K230_SHIFT_DS) & K230_PC_DS;
  280. break;
  281. case PIN_CONFIG_BIAS_DISABLE:
  282. val &= ~K230_PC_BIAS;
  283. break;
  284. case PIN_CONFIG_BIAS_PULL_DOWN:
  285. if (!arg)
  286. return -EINVAL;
  287. val |= K230_PC_PD;
  288. break;
  289. case PIN_CONFIG_BIAS_PULL_UP:
  290. if (!arg)
  291. return -EINVAL;
  292. val |= K230_PC_PU;
  293. break;
  294. case PIN_CONFIG_OUTPUT_ENABLE:
  295. if (!arg)
  296. return -EINVAL;
  297. val |= K230_PC_OE;
  298. break;
  299. case PIN_CONFIG_INPUT_ENABLE:
  300. if (!arg)
  301. return -EINVAL;
  302. val |= K230_PC_IE;
  303. break;
  304. case PIN_CONFIG_POWER_SOURCE:
  305. if (arg)
  306. val |= K230_PC_MSC;
  307. else
  308. val &= ~K230_PC_MSC;
  309. break;
  310. case PIN_CONFIG_SLEW_RATE:
  311. if (arg)
  312. val |= K230_PC_SL;
  313. else
  314. val &= ~K230_PC_SL;
  315. break;
  316. default:
  317. return -EINVAL;
  318. }
  319. regmap_write(info->regmap_base, pin * 4, val);
  320. return 0;
  321. }
  322. static int k230_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
  323. unsigned long *configs, unsigned int num_configs)
  324. {
  325. struct k230_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
  326. struct device *dev = info->pctl_dev->dev;
  327. enum pin_config_param param;
  328. unsigned int arg, i;
  329. int ret;
  330. if (pin >= K230_NPINS) {
  331. dev_err(dev, "pin number out of range\n");
  332. return -EINVAL;
  333. }
  334. for (i = 0; i < num_configs; i++) {
  335. param = pinconf_to_config_param(configs[i]);
  336. arg = pinconf_to_config_argument(configs[i]);
  337. ret = k230_pinconf_set_param(pctldev, pin, param, arg);
  338. if (ret)
  339. return ret;
  340. }
  341. return 0;
  342. }
  343. static void k230_pconf_dbg_show(struct pinctrl_dev *pctldev,
  344. struct seq_file *s, unsigned int pin)
  345. {
  346. struct k230_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
  347. unsigned int val;
  348. regmap_read(info->regmap_base, pin * 4, &val);
  349. seq_printf(s, " 0x%08x", val);
  350. }
  351. static const struct pinconf_ops k230_pinconf_ops = {
  352. .is_generic = true,
  353. .pin_config_get = k230_pinconf_get,
  354. .pin_config_set = k230_pinconf_set,
  355. .pin_config_dbg_show = k230_pconf_dbg_show,
  356. };
  357. static int k230_get_functions_count(struct pinctrl_dev *pctldev)
  358. {
  359. struct k230_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
  360. return info->nfunctions;
  361. }
  362. static const char *k230_get_fname(struct pinctrl_dev *pctldev,
  363. unsigned int selector)
  364. {
  365. struct k230_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
  366. return info->functions[selector].name;
  367. }
  368. static int k230_get_groups(struct pinctrl_dev *pctldev, unsigned int selector,
  369. const char * const **groups, unsigned int *num_groups)
  370. {
  371. struct k230_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
  372. *groups = info->functions[selector].groups;
  373. *num_groups = info->functions[selector].ngroups;
  374. return 0;
  375. }
  376. static int k230_set_mux(struct pinctrl_dev *pctldev, unsigned int selector,
  377. unsigned int group)
  378. {
  379. struct k230_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
  380. const struct k230_pin_conf *data = info->groups[group].data;
  381. struct k230_pin_group *grp = &info->groups[group];
  382. const unsigned int *pins = grp->pins;
  383. struct regmap *regmap;
  384. unsigned int value, mask;
  385. int cnt, reg;
  386. regmap = info->regmap_base;
  387. for (cnt = 0; cnt < grp->num_pins; cnt++) {
  388. reg = pins[cnt] * 4;
  389. value = data[cnt].func << K230_SHIFT_SEL;
  390. mask = K230_PC_SEL;
  391. regmap_update_bits(regmap, reg, mask, value);
  392. k230_pins[pins[cnt]].drv_data = grp;
  393. }
  394. return 0;
  395. }
  396. static const struct pinmux_ops k230_pmxops = {
  397. .get_functions_count = k230_get_functions_count,
  398. .get_function_name = k230_get_fname,
  399. .get_function_groups = k230_get_groups,
  400. .set_mux = k230_set_mux,
  401. .strict = true,
  402. };
  403. static int k230_pinctrl_parse_groups(struct device_node *np,
  404. struct k230_pin_group *grp,
  405. struct k230_pinctrl *info,
  406. unsigned int index)
  407. {
  408. struct device *dev = info->dev;
  409. const __be32 *list;
  410. int size, i, ret;
  411. grp->name = np->name;
  412. list = of_get_property(np, "pinmux", &size);
  413. if (!list) {
  414. dev_err(dev, "failed to get pinmux property\n");
  415. return -EINVAL;
  416. }
  417. size /= sizeof(*list);
  418. grp->num_pins = size;
  419. grp->pins = devm_kcalloc(dev, grp->num_pins, sizeof(*grp->pins),
  420. GFP_KERNEL);
  421. grp->data = devm_kcalloc(dev, grp->num_pins, sizeof(*grp->data),
  422. GFP_KERNEL);
  423. if (!grp->pins || !grp->data)
  424. return -ENOMEM;
  425. for (i = 0; i < size; i++) {
  426. unsigned int mux_data = be32_to_cpu(*list++);
  427. grp->pins[i] = (mux_data >> 8);
  428. grp->data[i].func = (mux_data & 0xff);
  429. ret = pinconf_generic_parse_dt_config(np, NULL,
  430. &grp->data[i].configs,
  431. &grp->data[i].nconfigs);
  432. if (ret)
  433. return ret;
  434. }
  435. return 0;
  436. }
  437. static int k230_pinctrl_parse_functions(struct device_node *np,
  438. struct k230_pinctrl *info,
  439. unsigned int index)
  440. {
  441. struct device *dev = info->dev;
  442. struct k230_pmx_func *func;
  443. struct k230_pin_group *grp;
  444. static unsigned int idx, i;
  445. int ret;
  446. func = &info->functions[index];
  447. func->name = np->name;
  448. func->ngroups = of_get_child_count(np);
  449. if (func->ngroups <= 0)
  450. return 0;
  451. func->groups = devm_kcalloc(dev, func->ngroups,
  452. sizeof(*func->groups), GFP_KERNEL);
  453. func->group_idx = devm_kcalloc(dev, func->ngroups,
  454. sizeof(*func->group_idx), GFP_KERNEL);
  455. if (!func->groups || !func->group_idx)
  456. return -ENOMEM;
  457. i = 0;
  458. for_each_child_of_node_scoped(np, child) {
  459. func->groups[i] = child->name;
  460. func->group_idx[i] = idx;
  461. grp = &info->groups[idx];
  462. idx++;
  463. ret = k230_pinctrl_parse_groups(child, grp, info, i++);
  464. if (ret)
  465. return ret;
  466. }
  467. return 0;
  468. }
  469. static void k230_pinctrl_child_count(struct k230_pinctrl *info,
  470. struct device_node *np)
  471. {
  472. for_each_child_of_node_scoped(np, child) {
  473. info->nfunctions++;
  474. info->ngroups += of_get_child_count(child);
  475. }
  476. }
  477. static int k230_pinctrl_parse_dt(struct platform_device *pdev,
  478. struct k230_pinctrl *info)
  479. {
  480. struct device *dev = &pdev->dev;
  481. struct device_node *np = dev->of_node;
  482. unsigned int i;
  483. int ret;
  484. k230_pinctrl_child_count(info, np);
  485. info->functions = devm_kcalloc(dev, info->nfunctions,
  486. sizeof(*info->functions), GFP_KERNEL);
  487. info->groups = devm_kcalloc(dev, info->ngroups,
  488. sizeof(*info->groups), GFP_KERNEL);
  489. if (!info->functions || !info->groups)
  490. return -ENOMEM;
  491. i = 0;
  492. for_each_child_of_node_scoped(np, child) {
  493. ret = k230_pinctrl_parse_functions(child, info, i++);
  494. if (ret) {
  495. dev_err(dev, "failed to parse function\n");
  496. return ret;
  497. }
  498. }
  499. return 0;
  500. }
  501. static int k230_pinctrl_probe(struct platform_device *pdev)
  502. {
  503. struct device *dev = &pdev->dev;
  504. struct k230_pinctrl *info;
  505. struct pinctrl_desc *pctl;
  506. int ret;
  507. info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);
  508. if (!info)
  509. return -ENOMEM;
  510. info->dev = dev;
  511. pctl = &info->pctl;
  512. pctl->name = "k230-pinctrl";
  513. pctl->owner = THIS_MODULE;
  514. pctl->pins = k230_pins;
  515. pctl->npins = ARRAY_SIZE(k230_pins);
  516. pctl->pctlops = &k230_pctrl_ops;
  517. pctl->pmxops = &k230_pmxops;
  518. pctl->confops = &k230_pinconf_ops;
  519. info->base = devm_platform_ioremap_resource(pdev, 0);
  520. if (IS_ERR(info->base))
  521. return PTR_ERR(info->base);
  522. info->regmap_base = devm_regmap_init_mmio(dev, info->base,
  523. &k230_regmap_config);
  524. if (IS_ERR(info->regmap_base))
  525. return dev_err_probe(dev, PTR_ERR(info->regmap_base),
  526. "failed to init regmap\n");
  527. ret = k230_pinctrl_parse_dt(pdev, info);
  528. if (ret)
  529. return ret;
  530. info->pctl_dev = devm_pinctrl_register(dev, pctl, info);
  531. if (IS_ERR(info->pctl_dev))
  532. return dev_err_probe(dev, PTR_ERR(info->pctl_dev),
  533. "devm_pinctrl_register failed\n");
  534. return 0;
  535. }
  536. static const struct of_device_id k230_dt_ids[] = {
  537. { .compatible = "canaan,k230-pinctrl", },
  538. { /* sentinel */ }
  539. };
  540. MODULE_DEVICE_TABLE(of, k230_dt_ids);
  541. static struct platform_driver k230_pinctrl_driver = {
  542. .probe = k230_pinctrl_probe,
  543. .driver = {
  544. .name = "k230-pinctrl",
  545. .of_match_table = k230_dt_ids,
  546. },
  547. };
  548. module_platform_driver(k230_pinctrl_driver);
  549. MODULE_LICENSE("GPL");
  550. MODULE_AUTHOR("Ze Huang <18771902331@163.com>");
  551. MODULE_DESCRIPTION("Canaan K230 pinctrl driver");