pinctrl-cs42l43.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604
  1. // SPDX-License-Identifier: GPL-2.0
  2. //
  3. // CS42L43 Pinctrl and GPIO driver
  4. //
  5. // Copyright (c) 2023 Cirrus Logic, Inc. and
  6. // Cirrus Logic International Semiconductor Ltd.
  7. #include <linux/array_size.h>
  8. #include <linux/bits.h>
  9. #include <linux/build_bug.h>
  10. #include <linux/err.h>
  11. #include <linux/gpio/driver.h>
  12. #include <linux/mfd/cs42l43.h>
  13. #include <linux/mfd/cs42l43-regs.h>
  14. #include <linux/module.h>
  15. #include <linux/of.h>
  16. #include <linux/platform_device.h>
  17. #include <linux/pm_runtime.h>
  18. #include <linux/regmap.h>
  19. #include <linux/string_choices.h>
  20. #include <linux/pinctrl/consumer.h>
  21. #include <linux/pinctrl/pinctrl.h>
  22. #include <linux/pinctrl/pinconf.h>
  23. #include <linux/pinctrl/pinconf-generic.h>
  24. #include <linux/pinctrl/pinmux.h>
  25. #include "../pinctrl-utils.h"
  26. #define CS42L43_NUM_GPIOS 3
  27. struct cs42l43_pin {
  28. struct gpio_chip gpio_chip;
  29. struct device *dev;
  30. struct regmap *regmap;
  31. bool shutters_locked;
  32. };
  33. struct cs42l43_pin_data {
  34. unsigned int reg;
  35. unsigned int shift;
  36. unsigned int mask;
  37. };
  38. #define CS42L43_PIN(_number, _name, _reg, _field) { \
  39. .number = _number, .name = _name, \
  40. .drv_data = &((struct cs42l43_pin_data){ \
  41. .reg = CS42L43_##_reg, \
  42. .shift = CS42L43_##_field##_DRV_SHIFT, \
  43. .mask = CS42L43_##_field##_DRV_MASK, \
  44. }), \
  45. }
  46. static const struct pinctrl_pin_desc cs42l43_pin_pins[] = {
  47. CS42L43_PIN(0, "gpio1", DRV_CTRL4, GPIO1),
  48. CS42L43_PIN(1, "gpio2", DRV_CTRL4, GPIO2),
  49. CS42L43_PIN(2, "gpio3", DRV_CTRL4, GPIO3),
  50. CS42L43_PIN(3, "asp_dout", DRV_CTRL1, ASP_DOUT),
  51. CS42L43_PIN(4, "asp_fsync", DRV_CTRL1, ASP_FSYNC),
  52. CS42L43_PIN(5, "asp_bclk", DRV_CTRL1, ASP_BCLK),
  53. CS42L43_PIN(6, "pdmout2_clk", DRV_CTRL3, PDMOUT2_CLK),
  54. CS42L43_PIN(7, "pdmout2_data", DRV_CTRL3, PDMOUT2_DATA),
  55. CS42L43_PIN(8, "pdmout1_clk", DRV_CTRL3, PDMOUT1_CLK),
  56. CS42L43_PIN(9, "pdmout1_data", DRV_CTRL3, PDMOUT1_DATA),
  57. CS42L43_PIN(10, "i2c_sda", DRV_CTRL3, I2C_SDA),
  58. CS42L43_PIN(11, "i2c_scl", DRV_CTRL_5, I2C_SCL),
  59. CS42L43_PIN(12, "spi_miso", DRV_CTRL3, SPI_MISO),
  60. CS42L43_PIN(13, "spi_sck", DRV_CTRL_5, SPI_SCK),
  61. CS42L43_PIN(14, "spi_ssb", DRV_CTRL_5, SPI_SSB),
  62. };
  63. static const unsigned int cs42l43_pin_gpio1_pins[] = { 0 };
  64. static const unsigned int cs42l43_pin_gpio2_pins[] = { 1 };
  65. static const unsigned int cs42l43_pin_gpio3_pins[] = { 2 };
  66. static const unsigned int cs42l43_pin_asp_pins[] = { 3, 4, 5 };
  67. static const unsigned int cs42l43_pin_pdmout2_pins[] = { 6, 7 };
  68. static const unsigned int cs42l43_pin_pdmout1_pins[] = { 8, 9 };
  69. static const unsigned int cs42l43_pin_i2c_pins[] = { 10, 11 };
  70. static const unsigned int cs42l43_pin_spi_pins[] = { 12, 13, 14 };
  71. #define CS42L43_PINGROUP(_name) \
  72. PINCTRL_PINGROUP(#_name, cs42l43_pin_##_name##_pins, \
  73. ARRAY_SIZE(cs42l43_pin_##_name##_pins))
  74. static const struct pingroup cs42l43_pin_groups[] = {
  75. CS42L43_PINGROUP(gpio1),
  76. CS42L43_PINGROUP(gpio2),
  77. CS42L43_PINGROUP(gpio3),
  78. CS42L43_PINGROUP(asp),
  79. CS42L43_PINGROUP(pdmout2),
  80. CS42L43_PINGROUP(pdmout1),
  81. CS42L43_PINGROUP(i2c),
  82. CS42L43_PINGROUP(spi),
  83. };
  84. static int cs42l43_pin_get_groups_count(struct pinctrl_dev *pctldev)
  85. {
  86. return ARRAY_SIZE(cs42l43_pin_groups);
  87. }
  88. static const char *cs42l43_pin_get_group_name(struct pinctrl_dev *pctldev,
  89. unsigned int group_idx)
  90. {
  91. return cs42l43_pin_groups[group_idx].name;
  92. }
  93. static int cs42l43_pin_get_group_pins(struct pinctrl_dev *pctldev,
  94. unsigned int group_idx,
  95. const unsigned int **pins,
  96. unsigned int *num_pins)
  97. {
  98. *pins = cs42l43_pin_groups[group_idx].pins;
  99. *num_pins = cs42l43_pin_groups[group_idx].npins;
  100. return 0;
  101. }
  102. static const struct pinctrl_ops cs42l43_pin_group_ops = {
  103. .get_groups_count = cs42l43_pin_get_groups_count,
  104. .get_group_name = cs42l43_pin_get_group_name,
  105. .get_group_pins = cs42l43_pin_get_group_pins,
  106. #if IS_ENABLED(CONFIG_OF)
  107. .dt_node_to_map = pinconf_generic_dt_node_to_map_all,
  108. .dt_free_map = pinconf_generic_dt_free_map,
  109. #endif
  110. };
  111. enum cs42l43_pin_funcs {
  112. CS42L43_FUNC_GPIO,
  113. CS42L43_FUNC_SPDIF,
  114. CS42L43_FUNC_IRQ,
  115. CS42L43_FUNC_MIC_SHT,
  116. CS42L43_FUNC_SPK_SHT,
  117. CS42L43_FUNC_MAX
  118. };
  119. static const char * const cs42l43_pin_funcs[] = {
  120. "gpio", "spdif", "irq", "mic-shutter", "spk-shutter",
  121. };
  122. static const char * const cs42l43_pin_gpio_groups[] = { "gpio1", "gpio3" };
  123. static const char * const cs42l43_pin_spdif_groups[] = { "gpio3" };
  124. static const char * const cs42l43_pin_irq_groups[] = { "gpio1" };
  125. static const char * const cs42l43_pin_shutter_groups[] = { "gpio1", "gpio2", "gpio3" };
  126. static const struct pinfunction cs42l43_pin_func_groups[] = {
  127. PINCTRL_PINFUNCTION("gpio", cs42l43_pin_gpio_groups,
  128. ARRAY_SIZE(cs42l43_pin_gpio_groups)),
  129. PINCTRL_PINFUNCTION("spdif", cs42l43_pin_spdif_groups,
  130. ARRAY_SIZE(cs42l43_pin_spdif_groups)),
  131. PINCTRL_PINFUNCTION("irq", cs42l43_pin_irq_groups,
  132. ARRAY_SIZE(cs42l43_pin_irq_groups)),
  133. PINCTRL_PINFUNCTION("mic-shutter", cs42l43_pin_shutter_groups,
  134. ARRAY_SIZE(cs42l43_pin_shutter_groups)),
  135. PINCTRL_PINFUNCTION("spk-shutter", cs42l43_pin_shutter_groups,
  136. ARRAY_SIZE(cs42l43_pin_shutter_groups)),
  137. };
  138. static_assert(ARRAY_SIZE(cs42l43_pin_funcs) == CS42L43_FUNC_MAX);
  139. static_assert(ARRAY_SIZE(cs42l43_pin_func_groups) == CS42L43_FUNC_MAX);
  140. static int cs42l43_pin_get_func_count(struct pinctrl_dev *pctldev)
  141. {
  142. return ARRAY_SIZE(cs42l43_pin_funcs);
  143. }
  144. static const char *cs42l43_pin_get_func_name(struct pinctrl_dev *pctldev,
  145. unsigned int func_idx)
  146. {
  147. return cs42l43_pin_funcs[func_idx];
  148. }
  149. static int cs42l43_pin_get_func_groups(struct pinctrl_dev *pctldev,
  150. unsigned int func_idx,
  151. const char * const **groups,
  152. unsigned int * const num_groups)
  153. {
  154. *groups = cs42l43_pin_func_groups[func_idx].groups;
  155. *num_groups = cs42l43_pin_func_groups[func_idx].ngroups;
  156. return 0;
  157. }
  158. static int cs42l43_pin_set_mux(struct pinctrl_dev *pctldev,
  159. unsigned int func_idx, unsigned int group_idx)
  160. {
  161. struct cs42l43_pin *priv = pinctrl_dev_get_drvdata(pctldev);
  162. unsigned int reg, mask, val;
  163. dev_dbg(priv->dev, "Setting %s to %s\n",
  164. cs42l43_pin_groups[group_idx].name, cs42l43_pin_funcs[func_idx]);
  165. switch (func_idx) {
  166. case CS42L43_FUNC_MIC_SHT:
  167. reg = CS42L43_SHUTTER_CONTROL;
  168. mask = CS42L43_MIC_SHUTTER_CFG_MASK;
  169. val = 0x2 << (group_idx + CS42L43_MIC_SHUTTER_CFG_SHIFT);
  170. break;
  171. case CS42L43_FUNC_SPK_SHT:
  172. reg = CS42L43_SHUTTER_CONTROL;
  173. mask = CS42L43_SPK_SHUTTER_CFG_MASK;
  174. val = 0x2 << (group_idx + CS42L43_SPK_SHUTTER_CFG_SHIFT);
  175. break;
  176. default:
  177. reg = CS42L43_GPIO_FN_SEL;
  178. mask = BIT(group_idx + CS42L43_GPIO1_FN_SEL_SHIFT);
  179. val = (func_idx == CS42L43_FUNC_GPIO) ?
  180. (0x1 << (group_idx + CS42L43_GPIO1_FN_SEL_SHIFT)) : 0;
  181. break;
  182. }
  183. if (priv->shutters_locked && reg == CS42L43_SHUTTER_CONTROL) {
  184. dev_err(priv->dev, "Shutter configuration not available\n");
  185. return -EPERM;
  186. }
  187. return regmap_update_bits(priv->regmap, reg, mask, val);
  188. }
  189. static int cs42l43_gpio_set_direction(struct pinctrl_dev *pctldev,
  190. struct pinctrl_gpio_range *range,
  191. unsigned int offset, bool input)
  192. {
  193. struct cs42l43_pin *priv = pinctrl_dev_get_drvdata(pctldev);
  194. unsigned int shift = offset + CS42L43_GPIO1_DIR_SHIFT;
  195. int ret;
  196. dev_dbg(priv->dev, "Setting gpio%d to %s\n",
  197. offset + 1, input ? "input" : "output");
  198. ret = pm_runtime_resume_and_get(priv->dev);
  199. if (ret) {
  200. dev_err(priv->dev, "Failed to resume for direction: %d\n", ret);
  201. return ret;
  202. }
  203. ret = regmap_update_bits(priv->regmap, CS42L43_GPIO_CTRL1,
  204. BIT(shift), !!input << shift);
  205. if (ret)
  206. dev_err(priv->dev, "Failed to set gpio%d direction: %d\n",
  207. offset + 1, ret);
  208. pm_runtime_put(priv->dev);
  209. return ret;
  210. }
  211. static int cs42l43_gpio_request_enable(struct pinctrl_dev *pctldev,
  212. struct pinctrl_gpio_range *range,
  213. unsigned int offset)
  214. {
  215. return cs42l43_pin_set_mux(pctldev, 0, offset);
  216. }
  217. static void cs42l43_gpio_disable_free(struct pinctrl_dev *pctldev,
  218. struct pinctrl_gpio_range *range,
  219. unsigned int offset)
  220. {
  221. cs42l43_gpio_set_direction(pctldev, range, offset, true);
  222. }
  223. static const struct pinmux_ops cs42l43_pin_mux_ops = {
  224. .get_functions_count = cs42l43_pin_get_func_count,
  225. .get_function_name = cs42l43_pin_get_func_name,
  226. .get_function_groups = cs42l43_pin_get_func_groups,
  227. .set_mux = cs42l43_pin_set_mux,
  228. .gpio_request_enable = cs42l43_gpio_request_enable,
  229. .gpio_disable_free = cs42l43_gpio_disable_free,
  230. .gpio_set_direction = cs42l43_gpio_set_direction,
  231. .strict = true,
  232. };
  233. static const unsigned int cs42l43_pin_drv_str_ma[] = { 1, 2, 4, 8, 9, 10, 12, 16 };
  234. static int cs42l43_pin_get_drv_str(struct cs42l43_pin *priv, unsigned int pin)
  235. {
  236. const struct cs42l43_pin_data *pdat = cs42l43_pin_pins[pin].drv_data;
  237. unsigned int val;
  238. int ret;
  239. ret = regmap_read(priv->regmap, pdat->reg, &val);
  240. if (ret)
  241. return ret;
  242. return cs42l43_pin_drv_str_ma[(val & pdat->mask) >> pdat->shift];
  243. }
  244. static int cs42l43_pin_set_drv_str(struct cs42l43_pin *priv, unsigned int pin,
  245. unsigned int ma)
  246. {
  247. const struct cs42l43_pin_data *pdat = cs42l43_pin_pins[pin].drv_data;
  248. int i;
  249. for (i = 0; i < ARRAY_SIZE(cs42l43_pin_drv_str_ma); i++) {
  250. if (ma == cs42l43_pin_drv_str_ma[i]) {
  251. if ((i << pdat->shift) > pdat->mask)
  252. goto err;
  253. dev_dbg(priv->dev, "Set drive strength for %s to %d mA\n",
  254. cs42l43_pin_pins[pin].name, ma);
  255. return regmap_update_bits(priv->regmap, pdat->reg,
  256. pdat->mask, i << pdat->shift);
  257. }
  258. }
  259. err:
  260. dev_err(priv->dev, "Invalid drive strength for %s: %d mA\n",
  261. cs42l43_pin_pins[pin].name, ma);
  262. return -EINVAL;
  263. }
  264. static int cs42l43_pin_get_db(struct cs42l43_pin *priv, unsigned int pin)
  265. {
  266. unsigned int val;
  267. int ret;
  268. if (pin >= CS42L43_NUM_GPIOS)
  269. return -ENOTSUPP;
  270. ret = regmap_read(priv->regmap, CS42L43_GPIO_CTRL2, &val);
  271. if (ret)
  272. return ret;
  273. if (val & (CS42L43_GPIO1_DEGLITCH_BYP_MASK << pin))
  274. return 0;
  275. return 85; // Debounce is roughly 85uS
  276. }
  277. static int cs42l43_pin_set_db(struct cs42l43_pin *priv, unsigned int pin,
  278. unsigned int us)
  279. {
  280. if (pin >= CS42L43_NUM_GPIOS)
  281. return -ENOTSUPP;
  282. dev_dbg(priv->dev, "Set debounce %s for %s\n",
  283. str_on_off(us), cs42l43_pin_pins[pin].name);
  284. return regmap_update_bits(priv->regmap, CS42L43_GPIO_CTRL2,
  285. CS42L43_GPIO1_DEGLITCH_BYP_MASK << pin,
  286. !!us << pin);
  287. }
  288. static int cs42l43_pin_config_get(struct pinctrl_dev *pctldev,
  289. unsigned int pin, unsigned long *config)
  290. {
  291. struct cs42l43_pin *priv = pinctrl_dev_get_drvdata(pctldev);
  292. unsigned int param = pinconf_to_config_param(*config);
  293. int ret;
  294. switch (param) {
  295. case PIN_CONFIG_DRIVE_STRENGTH:
  296. ret = cs42l43_pin_get_drv_str(priv, pin);
  297. if (ret < 0)
  298. return ret;
  299. break;
  300. case PIN_CONFIG_INPUT_DEBOUNCE:
  301. ret = cs42l43_pin_get_db(priv, pin);
  302. if (ret < 0)
  303. return ret;
  304. break;
  305. default:
  306. return -ENOTSUPP;
  307. }
  308. *config = pinconf_to_config_packed(param, ret);
  309. return 0;
  310. }
  311. static int cs42l43_pin_config_set(struct pinctrl_dev *pctldev, unsigned int pin,
  312. unsigned long *configs, unsigned int num_configs)
  313. {
  314. struct cs42l43_pin *priv = pinctrl_dev_get_drvdata(pctldev);
  315. unsigned int val;
  316. int ret;
  317. while (num_configs) {
  318. val = pinconf_to_config_argument(*configs);
  319. switch (pinconf_to_config_param(*configs)) {
  320. case PIN_CONFIG_DRIVE_STRENGTH:
  321. ret = cs42l43_pin_set_drv_str(priv, pin, val);
  322. if (ret)
  323. return ret;
  324. break;
  325. case PIN_CONFIG_INPUT_DEBOUNCE:
  326. ret = cs42l43_pin_set_db(priv, pin, val);
  327. if (ret)
  328. return ret;
  329. break;
  330. default:
  331. return -ENOTSUPP;
  332. }
  333. configs++;
  334. num_configs--;
  335. }
  336. return 0;
  337. }
  338. static int cs42l43_pin_config_group_get(struct pinctrl_dev *pctldev,
  339. unsigned int selector, unsigned long *config)
  340. {
  341. int i, ret;
  342. for (i = 0; i < cs42l43_pin_groups[selector].npins; ++i) {
  343. ret = cs42l43_pin_config_get(pctldev,
  344. cs42l43_pin_groups[selector].pins[i],
  345. config);
  346. if (ret)
  347. return ret;
  348. }
  349. return 0;
  350. }
  351. static int cs42l43_pin_config_group_set(struct pinctrl_dev *pctldev,
  352. unsigned int selector,
  353. unsigned long *configs,
  354. unsigned int num_configs)
  355. {
  356. int i, ret;
  357. for (i = 0; i < cs42l43_pin_groups[selector].npins; ++i) {
  358. ret = cs42l43_pin_config_set(pctldev,
  359. cs42l43_pin_groups[selector].pins[i],
  360. configs, num_configs);
  361. if (ret)
  362. return ret;
  363. }
  364. return 0;
  365. }
  366. static const struct pinconf_ops cs42l43_pin_conf_ops = {
  367. .is_generic = true,
  368. .pin_config_get = cs42l43_pin_config_get,
  369. .pin_config_set = cs42l43_pin_config_set,
  370. .pin_config_group_get = cs42l43_pin_config_group_get,
  371. .pin_config_group_set = cs42l43_pin_config_group_set,
  372. };
  373. static struct pinctrl_desc cs42l43_pin_desc = {
  374. .name = "cs42l43-pinctrl",
  375. .owner = THIS_MODULE,
  376. .pins = cs42l43_pin_pins,
  377. .npins = ARRAY_SIZE(cs42l43_pin_pins),
  378. .pctlops = &cs42l43_pin_group_ops,
  379. .pmxops = &cs42l43_pin_mux_ops,
  380. .confops = &cs42l43_pin_conf_ops,
  381. };
  382. static int cs42l43_gpio_get(struct gpio_chip *chip, unsigned int offset)
  383. {
  384. struct cs42l43_pin *priv = gpiochip_get_data(chip);
  385. unsigned int val;
  386. int ret;
  387. ret = pm_runtime_resume_and_get(priv->dev);
  388. if (ret) {
  389. dev_err(priv->dev, "Failed to resume for get: %d\n", ret);
  390. return ret;
  391. }
  392. ret = regmap_read(priv->regmap, CS42L43_GPIO_STS, &val);
  393. if (ret)
  394. dev_err(priv->dev, "Failed to get gpio%d: %d\n", offset + 1, ret);
  395. else
  396. ret = !!(val & BIT(offset + CS42L43_GPIO1_STS_SHIFT));
  397. pm_runtime_put(priv->dev);
  398. return ret;
  399. }
  400. static void cs42l43_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
  401. {
  402. struct cs42l43_pin *priv = gpiochip_get_data(chip);
  403. unsigned int shift = offset + CS42L43_GPIO1_LVL_SHIFT;
  404. int ret;
  405. dev_dbg(priv->dev, "Setting gpio%d to %s\n",
  406. offset + 1, str_high_low(value));
  407. ret = pm_runtime_resume_and_get(priv->dev);
  408. if (ret) {
  409. dev_err(priv->dev, "Failed to resume for set: %d\n", ret);
  410. return;
  411. }
  412. ret = regmap_update_bits(priv->regmap, CS42L43_GPIO_CTRL1,
  413. BIT(shift), value << shift);
  414. if (ret)
  415. dev_err(priv->dev, "Failed to set gpio%d: %d\n", offset + 1, ret);
  416. pm_runtime_put(priv->dev);
  417. }
  418. static int cs42l43_gpio_direction_out(struct gpio_chip *chip,
  419. unsigned int offset, int value)
  420. {
  421. cs42l43_gpio_set(chip, offset, value);
  422. return pinctrl_gpio_direction_output(chip, offset);
  423. }
  424. static int cs42l43_gpio_add_pin_ranges(struct gpio_chip *chip)
  425. {
  426. struct cs42l43_pin *priv = gpiochip_get_data(chip);
  427. int ret;
  428. ret = gpiochip_add_pin_range(&priv->gpio_chip, priv->gpio_chip.label,
  429. 0, 0, CS42L43_NUM_GPIOS);
  430. if (ret)
  431. dev_err(priv->dev, "Failed to add GPIO pin range: %d\n", ret);
  432. return ret;
  433. }
  434. static int cs42l43_pin_probe(struct platform_device *pdev)
  435. {
  436. struct cs42l43 *cs42l43 = dev_get_drvdata(pdev->dev.parent);
  437. struct cs42l43_pin *priv;
  438. struct pinctrl_dev *pctldev;
  439. struct fwnode_handle *fwnode = dev_fwnode(cs42l43->dev);
  440. int ret;
  441. priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
  442. if (!priv)
  443. return -ENOMEM;
  444. priv->dev = &pdev->dev;
  445. priv->regmap = cs42l43->regmap;
  446. priv->shutters_locked = cs42l43->hw_lock;
  447. priv->gpio_chip.request = gpiochip_generic_request;
  448. priv->gpio_chip.free = gpiochip_generic_free;
  449. priv->gpio_chip.direction_input = pinctrl_gpio_direction_input;
  450. priv->gpio_chip.direction_output = cs42l43_gpio_direction_out;
  451. priv->gpio_chip.add_pin_ranges = cs42l43_gpio_add_pin_ranges;
  452. priv->gpio_chip.get = cs42l43_gpio_get;
  453. priv->gpio_chip.set = cs42l43_gpio_set;
  454. priv->gpio_chip.label = dev_name(priv->dev);
  455. priv->gpio_chip.parent = priv->dev;
  456. priv->gpio_chip.can_sleep = true;
  457. priv->gpio_chip.base = -1;
  458. priv->gpio_chip.ngpio = CS42L43_NUM_GPIOS;
  459. if (is_of_node(fwnode)) {
  460. fwnode = fwnode_get_named_child_node(fwnode, "pinctrl");
  461. if (fwnode && !fwnode->dev)
  462. fwnode->dev = priv->dev;
  463. }
  464. priv->gpio_chip.fwnode = fwnode;
  465. device_set_node(priv->dev, fwnode);
  466. devm_pm_runtime_enable(priv->dev);
  467. pm_runtime_idle(priv->dev);
  468. pctldev = devm_pinctrl_register(priv->dev, &cs42l43_pin_desc, priv);
  469. if (IS_ERR(pctldev))
  470. return dev_err_probe(priv->dev, PTR_ERR(pctldev),
  471. "Failed to register pinctrl\n");
  472. ret = devm_gpiochip_add_data(priv->dev, &priv->gpio_chip, priv);
  473. if (ret)
  474. return dev_err_probe(priv->dev, ret,
  475. "Failed to register gpiochip\n");
  476. return 0;
  477. }
  478. static const struct platform_device_id cs42l43_pin_id_table[] = {
  479. { "cs42l43-pinctrl", },
  480. {}
  481. };
  482. MODULE_DEVICE_TABLE(platform, cs42l43_pin_id_table);
  483. static struct platform_driver cs42l43_pin_driver = {
  484. .driver = {
  485. .name = "cs42l43-pinctrl",
  486. },
  487. .probe = cs42l43_pin_probe,
  488. .id_table = cs42l43_pin_id_table,
  489. };
  490. module_platform_driver(cs42l43_pin_driver);
  491. MODULE_DESCRIPTION("CS42L43 Pinctrl Driver");
  492. MODULE_AUTHOR("Charles Keepax <ckeepax@opensource.cirrus.com>");
  493. MODULE_LICENSE("GPL");