pinctrl-max77620.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * MAX77620 pin control driver.
  4. *
  5. * Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
  6. *
  7. * Author:
  8. * Chaitanya Bandi <[email protected]>
  9. * Laxman Dewangan <[email protected]>
  10. */
  11. #include <linux/mfd/max77620.h>
  12. #include <linux/mod_devicetable.h>
  13. #include <linux/module.h>
  14. #include <linux/platform_device.h>
  15. #include <linux/property.h>
  16. #include <linux/regmap.h>
  17. #include <linux/pinctrl/pinctrl.h>
  18. #include <linux/pinctrl/pinconf-generic.h>
  19. #include <linux/pinctrl/pinconf.h>
  20. #include <linux/pinctrl/pinmux.h>
  21. #include "core.h"
  22. #include "pinconf.h"
  23. #include "pinctrl-utils.h"
  24. #define MAX77620_PIN_NUM 8
  25. enum max77620_pin_ppdrv {
  26. MAX77620_PIN_UNCONFIG_DRV,
  27. MAX77620_PIN_OD_DRV,
  28. MAX77620_PIN_PP_DRV,
  29. };
  30. #define MAX77620_ACTIVE_FPS_SOURCE (PIN_CONFIG_END + 1)
  31. #define MAX77620_ACTIVE_FPS_POWER_ON_SLOTS (PIN_CONFIG_END + 2)
  32. #define MAX77620_ACTIVE_FPS_POWER_DOWN_SLOTS (PIN_CONFIG_END + 3)
  33. #define MAX77620_SUSPEND_FPS_SOURCE (PIN_CONFIG_END + 4)
  34. #define MAX77620_SUSPEND_FPS_POWER_ON_SLOTS (PIN_CONFIG_END + 5)
  35. #define MAX77620_SUSPEND_FPS_POWER_DOWN_SLOTS (PIN_CONFIG_END + 6)
  36. struct max77620_pin_function {
  37. const char *name;
  38. const char * const *groups;
  39. unsigned int ngroups;
  40. int mux_option;
  41. };
  42. static const struct pinconf_generic_params max77620_cfg_params[] = {
  43. {
  44. .property = "maxim,active-fps-source",
  45. .param = MAX77620_ACTIVE_FPS_SOURCE,
  46. }, {
  47. .property = "maxim,active-fps-power-up-slot",
  48. .param = MAX77620_ACTIVE_FPS_POWER_ON_SLOTS,
  49. }, {
  50. .property = "maxim,active-fps-power-down-slot",
  51. .param = MAX77620_ACTIVE_FPS_POWER_DOWN_SLOTS,
  52. }, {
  53. .property = "maxim,suspend-fps-source",
  54. .param = MAX77620_SUSPEND_FPS_SOURCE,
  55. }, {
  56. .property = "maxim,suspend-fps-power-up-slot",
  57. .param = MAX77620_SUSPEND_FPS_POWER_ON_SLOTS,
  58. }, {
  59. .property = "maxim,suspend-fps-power-down-slot",
  60. .param = MAX77620_SUSPEND_FPS_POWER_DOWN_SLOTS,
  61. },
  62. };
  63. enum max77620_alternate_pinmux_option {
  64. MAX77620_PINMUX_GPIO = 0,
  65. MAX77620_PINMUX_LOW_POWER_MODE_CONTROL_IN = 1,
  66. MAX77620_PINMUX_FLEXIBLE_POWER_SEQUENCER_OUT = 2,
  67. MAX77620_PINMUX_32K_OUT1 = 3,
  68. MAX77620_PINMUX_SD0_DYNAMIC_VOLTAGE_SCALING_IN = 4,
  69. MAX77620_PINMUX_SD1_DYNAMIC_VOLTAGE_SCALING_IN = 5,
  70. MAX77620_PINMUX_REFERENCE_OUT = 6,
  71. };
  72. struct max77620_pingroup {
  73. const char *name;
  74. const unsigned int pins[1];
  75. unsigned int npins;
  76. enum max77620_alternate_pinmux_option alt_option;
  77. };
  78. struct max77620_pin_info {
  79. enum max77620_pin_ppdrv drv_type;
  80. int pull_config;
  81. };
  82. struct max77620_fps_config {
  83. int active_fps_src;
  84. int active_power_up_slots;
  85. int active_power_down_slots;
  86. int suspend_fps_src;
  87. int suspend_power_up_slots;
  88. int suspend_power_down_slots;
  89. };
  90. struct max77620_pctrl_info {
  91. struct device *dev;
  92. struct pinctrl_dev *pctl;
  93. struct regmap *rmap;
  94. int pins_current_opt[MAX77620_GPIO_NR];
  95. const struct max77620_pin_function *functions;
  96. unsigned int num_functions;
  97. const struct max77620_pingroup *pin_groups;
  98. int num_pin_groups;
  99. const struct pinctrl_pin_desc *pins;
  100. unsigned int num_pins;
  101. struct max77620_pin_info pin_info[MAX77620_PIN_NUM];
  102. struct max77620_fps_config fps_config[MAX77620_PIN_NUM];
  103. };
  104. static const struct pinctrl_pin_desc max77620_pins_desc[] = {
  105. PINCTRL_PIN(MAX77620_GPIO0, "gpio0"),
  106. PINCTRL_PIN(MAX77620_GPIO1, "gpio1"),
  107. PINCTRL_PIN(MAX77620_GPIO2, "gpio2"),
  108. PINCTRL_PIN(MAX77620_GPIO3, "gpio3"),
  109. PINCTRL_PIN(MAX77620_GPIO4, "gpio4"),
  110. PINCTRL_PIN(MAX77620_GPIO5, "gpio5"),
  111. PINCTRL_PIN(MAX77620_GPIO6, "gpio6"),
  112. PINCTRL_PIN(MAX77620_GPIO7, "gpio7"),
  113. };
  114. static const char * const gpio_groups[] = {
  115. "gpio0",
  116. "gpio1",
  117. "gpio2",
  118. "gpio3",
  119. "gpio4",
  120. "gpio5",
  121. "gpio6",
  122. "gpio7",
  123. };
  124. #define FUNCTION_GROUP(fname, mux) \
  125. { \
  126. .name = fname, \
  127. .groups = gpio_groups, \
  128. .ngroups = ARRAY_SIZE(gpio_groups), \
  129. .mux_option = MAX77620_PINMUX_##mux, \
  130. }
  131. static const struct max77620_pin_function max77620_pin_function[] = {
  132. FUNCTION_GROUP("gpio", GPIO),
  133. FUNCTION_GROUP("lpm-control-in", LOW_POWER_MODE_CONTROL_IN),
  134. FUNCTION_GROUP("fps-out", FLEXIBLE_POWER_SEQUENCER_OUT),
  135. FUNCTION_GROUP("32k-out1", 32K_OUT1),
  136. FUNCTION_GROUP("sd0-dvs-in", SD0_DYNAMIC_VOLTAGE_SCALING_IN),
  137. FUNCTION_GROUP("sd1-dvs-in", SD1_DYNAMIC_VOLTAGE_SCALING_IN),
  138. FUNCTION_GROUP("reference-out", REFERENCE_OUT),
  139. };
  140. #define MAX77620_PINGROUP(pg_name, pin_id, option) \
  141. { \
  142. .name = #pg_name, \
  143. .pins = {MAX77620_##pin_id}, \
  144. .npins = 1, \
  145. .alt_option = MAX77620_PINMUX_##option, \
  146. }
  147. static const struct max77620_pingroup max77620_pingroups[] = {
  148. MAX77620_PINGROUP(gpio0, GPIO0, LOW_POWER_MODE_CONTROL_IN),
  149. MAX77620_PINGROUP(gpio1, GPIO1, FLEXIBLE_POWER_SEQUENCER_OUT),
  150. MAX77620_PINGROUP(gpio2, GPIO2, FLEXIBLE_POWER_SEQUENCER_OUT),
  151. MAX77620_PINGROUP(gpio3, GPIO3, FLEXIBLE_POWER_SEQUENCER_OUT),
  152. MAX77620_PINGROUP(gpio4, GPIO4, 32K_OUT1),
  153. MAX77620_PINGROUP(gpio5, GPIO5, SD0_DYNAMIC_VOLTAGE_SCALING_IN),
  154. MAX77620_PINGROUP(gpio6, GPIO6, SD1_DYNAMIC_VOLTAGE_SCALING_IN),
  155. MAX77620_PINGROUP(gpio7, GPIO7, REFERENCE_OUT),
  156. };
  157. static int max77620_pinctrl_get_groups_count(struct pinctrl_dev *pctldev)
  158. {
  159. struct max77620_pctrl_info *mpci = pinctrl_dev_get_drvdata(pctldev);
  160. return mpci->num_pin_groups;
  161. }
  162. static const char *max77620_pinctrl_get_group_name(
  163. struct pinctrl_dev *pctldev, unsigned int group)
  164. {
  165. struct max77620_pctrl_info *mpci = pinctrl_dev_get_drvdata(pctldev);
  166. return mpci->pin_groups[group].name;
  167. }
  168. static int max77620_pinctrl_get_group_pins(
  169. struct pinctrl_dev *pctldev, unsigned int group,
  170. const unsigned int **pins, unsigned int *num_pins)
  171. {
  172. struct max77620_pctrl_info *mpci = pinctrl_dev_get_drvdata(pctldev);
  173. *pins = mpci->pin_groups[group].pins;
  174. *num_pins = mpci->pin_groups[group].npins;
  175. return 0;
  176. }
  177. static const struct pinctrl_ops max77620_pinctrl_ops = {
  178. .get_groups_count = max77620_pinctrl_get_groups_count,
  179. .get_group_name = max77620_pinctrl_get_group_name,
  180. .get_group_pins = max77620_pinctrl_get_group_pins,
  181. .dt_node_to_map = pinconf_generic_dt_node_to_map_pin,
  182. .dt_free_map = pinctrl_utils_free_map,
  183. };
  184. static int max77620_pinctrl_get_funcs_count(struct pinctrl_dev *pctldev)
  185. {
  186. struct max77620_pctrl_info *mpci = pinctrl_dev_get_drvdata(pctldev);
  187. return mpci->num_functions;
  188. }
  189. static const char *max77620_pinctrl_get_func_name(struct pinctrl_dev *pctldev,
  190. unsigned int function)
  191. {
  192. struct max77620_pctrl_info *mpci = pinctrl_dev_get_drvdata(pctldev);
  193. return mpci->functions[function].name;
  194. }
  195. static int max77620_pinctrl_get_func_groups(struct pinctrl_dev *pctldev,
  196. unsigned int function,
  197. const char * const **groups,
  198. unsigned int * const num_groups)
  199. {
  200. struct max77620_pctrl_info *mpci = pinctrl_dev_get_drvdata(pctldev);
  201. *groups = mpci->functions[function].groups;
  202. *num_groups = mpci->functions[function].ngroups;
  203. return 0;
  204. }
  205. static int max77620_pinctrl_enable(struct pinctrl_dev *pctldev,
  206. unsigned int function, unsigned int group)
  207. {
  208. struct max77620_pctrl_info *mpci = pinctrl_dev_get_drvdata(pctldev);
  209. u8 val;
  210. int ret;
  211. if (function == MAX77620_PINMUX_GPIO) {
  212. val = 0;
  213. } else if (function == mpci->pin_groups[group].alt_option) {
  214. val = 1 << group;
  215. } else {
  216. dev_err(mpci->dev, "GPIO %u doesn't have function %u\n",
  217. group, function);
  218. return -EINVAL;
  219. }
  220. ret = regmap_update_bits(mpci->rmap, MAX77620_REG_AME_GPIO,
  221. BIT(group), val);
  222. if (ret < 0)
  223. dev_err(mpci->dev, "REG AME GPIO update failed: %d\n", ret);
  224. return ret;
  225. }
  226. static const struct pinmux_ops max77620_pinmux_ops = {
  227. .get_functions_count = max77620_pinctrl_get_funcs_count,
  228. .get_function_name = max77620_pinctrl_get_func_name,
  229. .get_function_groups = max77620_pinctrl_get_func_groups,
  230. .set_mux = max77620_pinctrl_enable,
  231. };
  232. static int max77620_pinconf_get(struct pinctrl_dev *pctldev,
  233. unsigned int pin, unsigned long *config)
  234. {
  235. struct max77620_pctrl_info *mpci = pinctrl_dev_get_drvdata(pctldev);
  236. struct device *dev = mpci->dev;
  237. enum pin_config_param param = pinconf_to_config_param(*config);
  238. unsigned int val;
  239. int arg = 0;
  240. int ret;
  241. switch (param) {
  242. case PIN_CONFIG_DRIVE_OPEN_DRAIN:
  243. if (mpci->pin_info[pin].drv_type == MAX77620_PIN_OD_DRV)
  244. arg = 1;
  245. break;
  246. case PIN_CONFIG_DRIVE_PUSH_PULL:
  247. if (mpci->pin_info[pin].drv_type == MAX77620_PIN_PP_DRV)
  248. arg = 1;
  249. break;
  250. case PIN_CONFIG_BIAS_PULL_UP:
  251. ret = regmap_read(mpci->rmap, MAX77620_REG_PUE_GPIO, &val);
  252. if (ret < 0) {
  253. dev_err(dev, "Reg PUE_GPIO read failed: %d\n", ret);
  254. return ret;
  255. }
  256. if (val & BIT(pin))
  257. arg = 1;
  258. break;
  259. case PIN_CONFIG_BIAS_PULL_DOWN:
  260. ret = regmap_read(mpci->rmap, MAX77620_REG_PDE_GPIO, &val);
  261. if (ret < 0) {
  262. dev_err(dev, "Reg PDE_GPIO read failed: %d\n", ret);
  263. return ret;
  264. }
  265. if (val & BIT(pin))
  266. arg = 1;
  267. break;
  268. default:
  269. dev_err(dev, "Properties not supported\n");
  270. return -ENOTSUPP;
  271. }
  272. *config = pinconf_to_config_packed(param, (u16)arg);
  273. return 0;
  274. }
  275. static int max77620_get_default_fps(struct max77620_pctrl_info *mpci,
  276. int addr, int *fps)
  277. {
  278. unsigned int val;
  279. int ret;
  280. ret = regmap_read(mpci->rmap, addr, &val);
  281. if (ret < 0) {
  282. dev_err(mpci->dev, "Reg PUE_GPIO read failed: %d\n", ret);
  283. return ret;
  284. }
  285. *fps = (val & MAX77620_FPS_SRC_MASK) >> MAX77620_FPS_SRC_SHIFT;
  286. return 0;
  287. }
  288. static int max77620_set_fps_param(struct max77620_pctrl_info *mpci,
  289. int pin, int param)
  290. {
  291. struct max77620_fps_config *fps_config = &mpci->fps_config[pin];
  292. int addr, ret;
  293. int param_val;
  294. int mask, shift;
  295. if ((pin < MAX77620_GPIO1) || (pin > MAX77620_GPIO3))
  296. return 0;
  297. addr = MAX77620_REG_FPS_GPIO1 + pin - 1;
  298. switch (param) {
  299. case MAX77620_ACTIVE_FPS_SOURCE:
  300. case MAX77620_SUSPEND_FPS_SOURCE:
  301. mask = MAX77620_FPS_SRC_MASK;
  302. shift = MAX77620_FPS_SRC_SHIFT;
  303. param_val = fps_config->active_fps_src;
  304. if (param == MAX77620_SUSPEND_FPS_SOURCE)
  305. param_val = fps_config->suspend_fps_src;
  306. break;
  307. case MAX77620_ACTIVE_FPS_POWER_ON_SLOTS:
  308. case MAX77620_SUSPEND_FPS_POWER_ON_SLOTS:
  309. mask = MAX77620_FPS_PU_PERIOD_MASK;
  310. shift = MAX77620_FPS_PU_PERIOD_SHIFT;
  311. param_val = fps_config->active_power_up_slots;
  312. if (param == MAX77620_SUSPEND_FPS_POWER_ON_SLOTS)
  313. param_val = fps_config->suspend_power_up_slots;
  314. break;
  315. case MAX77620_ACTIVE_FPS_POWER_DOWN_SLOTS:
  316. case MAX77620_SUSPEND_FPS_POWER_DOWN_SLOTS:
  317. mask = MAX77620_FPS_PD_PERIOD_MASK;
  318. shift = MAX77620_FPS_PD_PERIOD_SHIFT;
  319. param_val = fps_config->active_power_down_slots;
  320. if (param == MAX77620_SUSPEND_FPS_POWER_DOWN_SLOTS)
  321. param_val = fps_config->suspend_power_down_slots;
  322. break;
  323. default:
  324. dev_err(mpci->dev, "Invalid parameter %d for pin %d\n",
  325. param, pin);
  326. return -EINVAL;
  327. }
  328. if (param_val < 0)
  329. return 0;
  330. ret = regmap_update_bits(mpci->rmap, addr, mask, param_val << shift);
  331. if (ret < 0)
  332. dev_err(mpci->dev, "Reg 0x%02x update failed %d\n", addr, ret);
  333. return ret;
  334. }
  335. static int max77620_pinconf_set(struct pinctrl_dev *pctldev,
  336. unsigned int pin, unsigned long *configs,
  337. unsigned int num_configs)
  338. {
  339. struct max77620_pctrl_info *mpci = pinctrl_dev_get_drvdata(pctldev);
  340. struct device *dev = mpci->dev;
  341. struct max77620_fps_config *fps_config;
  342. int param;
  343. u32 param_val;
  344. unsigned int val;
  345. unsigned int pu_val;
  346. unsigned int pd_val;
  347. int addr, ret;
  348. int i;
  349. for (i = 0; i < num_configs; i++) {
  350. param = pinconf_to_config_param(configs[i]);
  351. param_val = pinconf_to_config_argument(configs[i]);
  352. switch (param) {
  353. case PIN_CONFIG_DRIVE_OPEN_DRAIN:
  354. val = param_val ? 0 : 1;
  355. ret = regmap_update_bits(mpci->rmap,
  356. MAX77620_REG_GPIO0 + pin,
  357. MAX77620_CNFG_GPIO_DRV_MASK,
  358. val);
  359. if (ret)
  360. goto report_update_failure;
  361. mpci->pin_info[pin].drv_type = val ?
  362. MAX77620_PIN_PP_DRV : MAX77620_PIN_OD_DRV;
  363. break;
  364. case PIN_CONFIG_DRIVE_PUSH_PULL:
  365. val = param_val ? 1 : 0;
  366. ret = regmap_update_bits(mpci->rmap,
  367. MAX77620_REG_GPIO0 + pin,
  368. MAX77620_CNFG_GPIO_DRV_MASK,
  369. val);
  370. if (ret)
  371. goto report_update_failure;
  372. mpci->pin_info[pin].drv_type = val ?
  373. MAX77620_PIN_PP_DRV : MAX77620_PIN_OD_DRV;
  374. break;
  375. case MAX77620_ACTIVE_FPS_SOURCE:
  376. case MAX77620_ACTIVE_FPS_POWER_ON_SLOTS:
  377. case MAX77620_ACTIVE_FPS_POWER_DOWN_SLOTS:
  378. if ((pin < MAX77620_GPIO1) || (pin > MAX77620_GPIO3))
  379. return -EINVAL;
  380. fps_config = &mpci->fps_config[pin];
  381. if ((param == MAX77620_ACTIVE_FPS_SOURCE) &&
  382. (param_val == MAX77620_FPS_SRC_DEF)) {
  383. addr = MAX77620_REG_FPS_GPIO1 + pin - 1;
  384. ret = max77620_get_default_fps(
  385. mpci, addr,
  386. &fps_config->active_fps_src);
  387. if (ret < 0)
  388. return ret;
  389. break;
  390. }
  391. if (param == MAX77620_ACTIVE_FPS_SOURCE)
  392. fps_config->active_fps_src = param_val;
  393. else if (param == MAX77620_ACTIVE_FPS_POWER_ON_SLOTS)
  394. fps_config->active_power_up_slots = param_val;
  395. else
  396. fps_config->active_power_down_slots = param_val;
  397. ret = max77620_set_fps_param(mpci, pin, param);
  398. if (ret < 0)
  399. return ret;
  400. break;
  401. case MAX77620_SUSPEND_FPS_SOURCE:
  402. case MAX77620_SUSPEND_FPS_POWER_ON_SLOTS:
  403. case MAX77620_SUSPEND_FPS_POWER_DOWN_SLOTS:
  404. if ((pin < MAX77620_GPIO1) || (pin > MAX77620_GPIO3))
  405. return -EINVAL;
  406. fps_config = &mpci->fps_config[pin];
  407. if ((param == MAX77620_SUSPEND_FPS_SOURCE) &&
  408. (param_val == MAX77620_FPS_SRC_DEF)) {
  409. addr = MAX77620_REG_FPS_GPIO1 + pin - 1;
  410. ret = max77620_get_default_fps(
  411. mpci, addr,
  412. &fps_config->suspend_fps_src);
  413. if (ret < 0)
  414. return ret;
  415. break;
  416. }
  417. if (param == MAX77620_SUSPEND_FPS_SOURCE)
  418. fps_config->suspend_fps_src = param_val;
  419. else if (param == MAX77620_SUSPEND_FPS_POWER_ON_SLOTS)
  420. fps_config->suspend_power_up_slots = param_val;
  421. else
  422. fps_config->suspend_power_down_slots =
  423. param_val;
  424. break;
  425. case PIN_CONFIG_BIAS_PULL_UP:
  426. case PIN_CONFIG_BIAS_PULL_DOWN:
  427. pu_val = (param == PIN_CONFIG_BIAS_PULL_UP) ?
  428. BIT(pin) : 0;
  429. pd_val = (param == PIN_CONFIG_BIAS_PULL_DOWN) ?
  430. BIT(pin) : 0;
  431. ret = regmap_update_bits(mpci->rmap,
  432. MAX77620_REG_PUE_GPIO,
  433. BIT(pin), pu_val);
  434. if (ret < 0) {
  435. dev_err(dev, "PUE_GPIO update failed: %d\n",
  436. ret);
  437. return ret;
  438. }
  439. ret = regmap_update_bits(mpci->rmap,
  440. MAX77620_REG_PDE_GPIO,
  441. BIT(pin), pd_val);
  442. if (ret < 0) {
  443. dev_err(dev, "PDE_GPIO update failed: %d\n",
  444. ret);
  445. return ret;
  446. }
  447. break;
  448. default:
  449. dev_err(dev, "Properties not supported\n");
  450. return -ENOTSUPP;
  451. }
  452. }
  453. return 0;
  454. report_update_failure:
  455. dev_err(dev, "Reg 0x%02x update failed %d\n",
  456. MAX77620_REG_GPIO0 + pin, ret);
  457. return ret;
  458. }
  459. static const struct pinconf_ops max77620_pinconf_ops = {
  460. .pin_config_get = max77620_pinconf_get,
  461. .pin_config_set = max77620_pinconf_set,
  462. };
  463. static struct pinctrl_desc max77620_pinctrl_desc = {
  464. .pctlops = &max77620_pinctrl_ops,
  465. .pmxops = &max77620_pinmux_ops,
  466. .confops = &max77620_pinconf_ops,
  467. };
  468. static int max77620_pinctrl_probe(struct platform_device *pdev)
  469. {
  470. struct max77620_chip *max77620 = dev_get_drvdata(pdev->dev.parent);
  471. struct max77620_pctrl_info *mpci;
  472. int i;
  473. device_set_node(&pdev->dev, dev_fwnode(pdev->dev.parent));
  474. mpci = devm_kzalloc(&pdev->dev, sizeof(*mpci), GFP_KERNEL);
  475. if (!mpci)
  476. return -ENOMEM;
  477. mpci->dev = &pdev->dev;
  478. mpci->rmap = max77620->rmap;
  479. mpci->pins = max77620_pins_desc;
  480. mpci->num_pins = ARRAY_SIZE(max77620_pins_desc);
  481. mpci->functions = max77620_pin_function;
  482. mpci->num_functions = ARRAY_SIZE(max77620_pin_function);
  483. mpci->pin_groups = max77620_pingroups;
  484. mpci->num_pin_groups = ARRAY_SIZE(max77620_pingroups);
  485. platform_set_drvdata(pdev, mpci);
  486. max77620_pinctrl_desc.name = dev_name(&pdev->dev);
  487. max77620_pinctrl_desc.pins = max77620_pins_desc;
  488. max77620_pinctrl_desc.npins = ARRAY_SIZE(max77620_pins_desc);
  489. max77620_pinctrl_desc.num_custom_params =
  490. ARRAY_SIZE(max77620_cfg_params);
  491. max77620_pinctrl_desc.custom_params = max77620_cfg_params;
  492. for (i = 0; i < MAX77620_PIN_NUM; ++i) {
  493. mpci->fps_config[i].active_fps_src = -1;
  494. mpci->fps_config[i].active_power_up_slots = -1;
  495. mpci->fps_config[i].active_power_down_slots = -1;
  496. mpci->fps_config[i].suspend_fps_src = -1;
  497. mpci->fps_config[i].suspend_power_up_slots = -1;
  498. mpci->fps_config[i].suspend_power_down_slots = -1;
  499. }
  500. mpci->pctl = devm_pinctrl_register(&pdev->dev, &max77620_pinctrl_desc,
  501. mpci);
  502. if (IS_ERR(mpci->pctl)) {
  503. dev_err(&pdev->dev, "Couldn't register pinctrl driver\n");
  504. return PTR_ERR(mpci->pctl);
  505. }
  506. return 0;
  507. }
  508. #ifdef CONFIG_PM_SLEEP
  509. static int max77620_suspend_fps_param[] = {
  510. MAX77620_SUSPEND_FPS_SOURCE,
  511. MAX77620_SUSPEND_FPS_POWER_ON_SLOTS,
  512. MAX77620_SUSPEND_FPS_POWER_DOWN_SLOTS,
  513. };
  514. static int max77620_active_fps_param[] = {
  515. MAX77620_ACTIVE_FPS_SOURCE,
  516. MAX77620_ACTIVE_FPS_POWER_ON_SLOTS,
  517. MAX77620_ACTIVE_FPS_POWER_DOWN_SLOTS,
  518. };
  519. static int max77620_pinctrl_suspend(struct device *dev)
  520. {
  521. struct max77620_pctrl_info *mpci = dev_get_drvdata(dev);
  522. int pin, p;
  523. for (pin = 0; pin < MAX77620_PIN_NUM; ++pin) {
  524. if ((pin < MAX77620_GPIO1) || (pin > MAX77620_GPIO3))
  525. continue;
  526. for (p = 0; p < 3; ++p)
  527. max77620_set_fps_param(
  528. mpci, pin, max77620_suspend_fps_param[p]);
  529. }
  530. return 0;
  531. };
  532. static int max77620_pinctrl_resume(struct device *dev)
  533. {
  534. struct max77620_pctrl_info *mpci = dev_get_drvdata(dev);
  535. int pin, p;
  536. for (pin = 0; pin < MAX77620_PIN_NUM; ++pin) {
  537. if ((pin < MAX77620_GPIO1) || (pin > MAX77620_GPIO3))
  538. continue;
  539. for (p = 0; p < 3; ++p)
  540. max77620_set_fps_param(
  541. mpci, pin, max77620_active_fps_param[p]);
  542. }
  543. return 0;
  544. }
  545. #endif
  546. static const struct dev_pm_ops max77620_pinctrl_pm_ops = {
  547. SET_SYSTEM_SLEEP_PM_OPS(
  548. max77620_pinctrl_suspend, max77620_pinctrl_resume)
  549. };
  550. static const struct platform_device_id max77620_pinctrl_devtype[] = {
  551. { .name = "max77620-pinctrl", },
  552. { .name = "max20024-pinctrl", },
  553. {},
  554. };
  555. MODULE_DEVICE_TABLE(platform, max77620_pinctrl_devtype);
  556. static struct platform_driver max77620_pinctrl_driver = {
  557. .driver = {
  558. .name = "max77620-pinctrl",
  559. .pm = &max77620_pinctrl_pm_ops,
  560. },
  561. .probe = max77620_pinctrl_probe,
  562. .id_table = max77620_pinctrl_devtype,
  563. };
  564. module_platform_driver(max77620_pinctrl_driver);
  565. MODULE_DESCRIPTION("MAX77620/MAX20024 pin control driver");
  566. MODULE_AUTHOR("Chaitanya Bandi<[email protected]>");
  567. MODULE_AUTHOR("Laxman Dewangan<[email protected]>");
  568. MODULE_LICENSE("GPL v2");