pinctrl-ssbi-mpp.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2015, Sony Mobile Communications AB.
  4. * Copyright (c) 2013, The Linux Foundation. All rights reserved.
  5. */
  6. #include <linux/module.h>
  7. #include <linux/platform_device.h>
  8. #include <linux/pinctrl/pinctrl.h>
  9. #include <linux/pinctrl/pinmux.h>
  10. #include <linux/pinctrl/pinconf.h>
  11. #include <linux/pinctrl/pinconf-generic.h>
  12. #include <linux/slab.h>
  13. #include <linux/regmap.h>
  14. #include <linux/gpio/driver.h>
  15. #include <linux/interrupt.h>
  16. #include <linux/of_device.h>
  17. #include <linux/of_irq.h>
  18. #include <dt-bindings/pinctrl/qcom,pmic-mpp.h>
  19. #include "../core.h"
  20. #include "../pinctrl-utils.h"
  21. /* MPP registers */
  22. #define SSBI_REG_ADDR_MPP_BASE 0x50
  23. #define SSBI_REG_ADDR_MPP(n) (SSBI_REG_ADDR_MPP_BASE + n)
  24. /* MPP Type: type */
  25. #define PM8XXX_MPP_TYPE_D_INPUT 0
  26. #define PM8XXX_MPP_TYPE_D_OUTPUT 1
  27. #define PM8XXX_MPP_TYPE_D_BI_DIR 2
  28. #define PM8XXX_MPP_TYPE_A_INPUT 3
  29. #define PM8XXX_MPP_TYPE_A_OUTPUT 4
  30. #define PM8XXX_MPP_TYPE_SINK 5
  31. #define PM8XXX_MPP_TYPE_DTEST_SINK 6
  32. #define PM8XXX_MPP_TYPE_DTEST_OUTPUT 7
  33. /* Digital Input: control */
  34. #define PM8XXX_MPP_DIN_TO_INT 0
  35. #define PM8XXX_MPP_DIN_TO_DBUS1 1
  36. #define PM8XXX_MPP_DIN_TO_DBUS2 2
  37. #define PM8XXX_MPP_DIN_TO_DBUS3 3
  38. /* Digital Output: control */
  39. #define PM8XXX_MPP_DOUT_CTRL_LOW 0
  40. #define PM8XXX_MPP_DOUT_CTRL_HIGH 1
  41. #define PM8XXX_MPP_DOUT_CTRL_MPP 2
  42. #define PM8XXX_MPP_DOUT_CTRL_INV_MPP 3
  43. /* Bidirectional: control */
  44. #define PM8XXX_MPP_BI_PULLUP_1KOHM 0
  45. #define PM8XXX_MPP_BI_PULLUP_OPEN 1
  46. #define PM8XXX_MPP_BI_PULLUP_10KOHM 2
  47. #define PM8XXX_MPP_BI_PULLUP_30KOHM 3
  48. /* Analog Output: control */
  49. #define PM8XXX_MPP_AOUT_CTRL_DISABLE 0
  50. #define PM8XXX_MPP_AOUT_CTRL_ENABLE 1
  51. #define PM8XXX_MPP_AOUT_CTRL_MPP_HIGH_EN 2
  52. #define PM8XXX_MPP_AOUT_CTRL_MPP_LOW_EN 3
  53. /* Current Sink: control */
  54. #define PM8XXX_MPP_CS_CTRL_DISABLE 0
  55. #define PM8XXX_MPP_CS_CTRL_ENABLE 1
  56. #define PM8XXX_MPP_CS_CTRL_MPP_HIGH_EN 2
  57. #define PM8XXX_MPP_CS_CTRL_MPP_LOW_EN 3
  58. /* DTEST Current Sink: control */
  59. #define PM8XXX_MPP_DTEST_CS_CTRL_EN1 0
  60. #define PM8XXX_MPP_DTEST_CS_CTRL_EN2 1
  61. #define PM8XXX_MPP_DTEST_CS_CTRL_EN3 2
  62. #define PM8XXX_MPP_DTEST_CS_CTRL_EN4 3
  63. /* DTEST Digital Output: control */
  64. #define PM8XXX_MPP_DTEST_DBUS1 0
  65. #define PM8XXX_MPP_DTEST_DBUS2 1
  66. #define PM8XXX_MPP_DTEST_DBUS3 2
  67. #define PM8XXX_MPP_DTEST_DBUS4 3
  68. /* custom pinconf parameters */
  69. #define PM8XXX_CONFIG_AMUX (PIN_CONFIG_END + 1)
  70. #define PM8XXX_CONFIG_DTEST_SELECTOR (PIN_CONFIG_END + 2)
  71. #define PM8XXX_CONFIG_ALEVEL (PIN_CONFIG_END + 3)
  72. #define PM8XXX_CONFIG_PAIRED (PIN_CONFIG_END + 4)
  73. /**
  74. * struct pm8xxx_pin_data - dynamic configuration for a pin
  75. * @reg: address of the control register
  76. * @mode: operating mode for the pin (digital, analog or current sink)
  77. * @input: pin is input
  78. * @output: pin is output
  79. * @high_z: pin is floating
  80. * @paired: mpp operates in paired mode
  81. * @output_value: logical output value of the mpp
  82. * @power_source: selected power source
  83. * @dtest: DTEST route selector
  84. * @amux: input muxing in analog mode
  85. * @aout_level: selector of the output in analog mode
  86. * @drive_strength: drive strength of the current sink
  87. * @pullup: pull up value, when in digital bidirectional mode
  88. */
  89. struct pm8xxx_pin_data {
  90. unsigned reg;
  91. u8 mode;
  92. bool input;
  93. bool output;
  94. bool high_z;
  95. bool paired;
  96. bool output_value;
  97. u8 power_source;
  98. u8 dtest;
  99. u8 amux;
  100. u8 aout_level;
  101. u8 drive_strength;
  102. unsigned pullup;
  103. };
  104. struct pm8xxx_mpp {
  105. struct device *dev;
  106. struct regmap *regmap;
  107. struct pinctrl_dev *pctrl;
  108. struct gpio_chip chip;
  109. struct irq_chip irq;
  110. struct pinctrl_desc desc;
  111. unsigned npins;
  112. };
  113. static const struct pinconf_generic_params pm8xxx_mpp_bindings[] = {
  114. {"qcom,amux-route", PM8XXX_CONFIG_AMUX, 0},
  115. {"qcom,analog-level", PM8XXX_CONFIG_ALEVEL, 0},
  116. {"qcom,dtest", PM8XXX_CONFIG_DTEST_SELECTOR, 0},
  117. {"qcom,paired", PM8XXX_CONFIG_PAIRED, 0},
  118. };
  119. #ifdef CONFIG_DEBUG_FS
  120. static const struct pin_config_item pm8xxx_conf_items[] = {
  121. PCONFDUMP(PM8XXX_CONFIG_AMUX, "analog mux", NULL, true),
  122. PCONFDUMP(PM8XXX_CONFIG_ALEVEL, "analog level", NULL, true),
  123. PCONFDUMP(PM8XXX_CONFIG_DTEST_SELECTOR, "dtest", NULL, true),
  124. PCONFDUMP(PM8XXX_CONFIG_PAIRED, "paired", NULL, false),
  125. };
  126. #endif
  127. #define PM8XXX_MAX_MPPS 12
  128. #define PM8XXX_MPP_PHYSICAL_OFFSET 1
  129. static const char * const pm8xxx_groups[PM8XXX_MAX_MPPS] = {
  130. "mpp1", "mpp2", "mpp3", "mpp4", "mpp5", "mpp6", "mpp7", "mpp8",
  131. "mpp9", "mpp10", "mpp11", "mpp12",
  132. };
  133. #define PM8XXX_MPP_DIGITAL 0
  134. #define PM8XXX_MPP_ANALOG 1
  135. #define PM8XXX_MPP_SINK 2
  136. static const char * const pm8xxx_mpp_functions[] = {
  137. "digital", "analog", "sink",
  138. };
  139. static int pm8xxx_mpp_update(struct pm8xxx_mpp *pctrl,
  140. struct pm8xxx_pin_data *pin)
  141. {
  142. unsigned level;
  143. unsigned ctrl;
  144. unsigned type;
  145. int ret;
  146. u8 val;
  147. switch (pin->mode) {
  148. case PM8XXX_MPP_DIGITAL:
  149. if (pin->dtest) {
  150. type = PM8XXX_MPP_TYPE_DTEST_OUTPUT;
  151. ctrl = pin->dtest - 1;
  152. } else if (pin->input && pin->output) {
  153. type = PM8XXX_MPP_TYPE_D_BI_DIR;
  154. if (pin->high_z)
  155. ctrl = PM8XXX_MPP_BI_PULLUP_OPEN;
  156. else if (pin->pullup == 600)
  157. ctrl = PM8XXX_MPP_BI_PULLUP_1KOHM;
  158. else if (pin->pullup == 10000)
  159. ctrl = PM8XXX_MPP_BI_PULLUP_10KOHM;
  160. else
  161. ctrl = PM8XXX_MPP_BI_PULLUP_30KOHM;
  162. } else if (pin->input) {
  163. type = PM8XXX_MPP_TYPE_D_INPUT;
  164. if (pin->dtest)
  165. ctrl = pin->dtest;
  166. else
  167. ctrl = PM8XXX_MPP_DIN_TO_INT;
  168. } else {
  169. type = PM8XXX_MPP_TYPE_D_OUTPUT;
  170. ctrl = !!pin->output_value;
  171. if (pin->paired)
  172. ctrl |= BIT(1);
  173. }
  174. level = pin->power_source;
  175. break;
  176. case PM8XXX_MPP_ANALOG:
  177. if (pin->output) {
  178. type = PM8XXX_MPP_TYPE_A_OUTPUT;
  179. level = pin->aout_level;
  180. ctrl = pin->output_value;
  181. if (pin->paired)
  182. ctrl |= BIT(1);
  183. } else {
  184. type = PM8XXX_MPP_TYPE_A_INPUT;
  185. level = pin->amux;
  186. ctrl = 0;
  187. }
  188. break;
  189. case PM8XXX_MPP_SINK:
  190. level = (pin->drive_strength / 5) - 1;
  191. if (pin->dtest) {
  192. type = PM8XXX_MPP_TYPE_DTEST_SINK;
  193. ctrl = pin->dtest - 1;
  194. } else {
  195. type = PM8XXX_MPP_TYPE_SINK;
  196. ctrl = pin->output_value;
  197. if (pin->paired)
  198. ctrl |= BIT(1);
  199. }
  200. break;
  201. default:
  202. return -EINVAL;
  203. }
  204. val = type << 5 | level << 2 | ctrl;
  205. ret = regmap_write(pctrl->regmap, pin->reg, val);
  206. if (ret)
  207. dev_err(pctrl->dev, "failed to write register\n");
  208. return ret;
  209. }
  210. static int pm8xxx_get_groups_count(struct pinctrl_dev *pctldev)
  211. {
  212. struct pm8xxx_mpp *pctrl = pinctrl_dev_get_drvdata(pctldev);
  213. return pctrl->npins;
  214. }
  215. static const char *pm8xxx_get_group_name(struct pinctrl_dev *pctldev,
  216. unsigned group)
  217. {
  218. return pm8xxx_groups[group];
  219. }
  220. static int pm8xxx_get_group_pins(struct pinctrl_dev *pctldev,
  221. unsigned group,
  222. const unsigned **pins,
  223. unsigned *num_pins)
  224. {
  225. struct pm8xxx_mpp *pctrl = pinctrl_dev_get_drvdata(pctldev);
  226. *pins = &pctrl->desc.pins[group].number;
  227. *num_pins = 1;
  228. return 0;
  229. }
  230. static const struct pinctrl_ops pm8xxx_pinctrl_ops = {
  231. .get_groups_count = pm8xxx_get_groups_count,
  232. .get_group_name = pm8xxx_get_group_name,
  233. .get_group_pins = pm8xxx_get_group_pins,
  234. .dt_node_to_map = pinconf_generic_dt_node_to_map_group,
  235. .dt_free_map = pinctrl_utils_free_map,
  236. };
  237. static int pm8xxx_get_functions_count(struct pinctrl_dev *pctldev)
  238. {
  239. return ARRAY_SIZE(pm8xxx_mpp_functions);
  240. }
  241. static const char *pm8xxx_get_function_name(struct pinctrl_dev *pctldev,
  242. unsigned function)
  243. {
  244. return pm8xxx_mpp_functions[function];
  245. }
  246. static int pm8xxx_get_function_groups(struct pinctrl_dev *pctldev,
  247. unsigned function,
  248. const char * const **groups,
  249. unsigned * const num_groups)
  250. {
  251. struct pm8xxx_mpp *pctrl = pinctrl_dev_get_drvdata(pctldev);
  252. *groups = pm8xxx_groups;
  253. *num_groups = pctrl->npins;
  254. return 0;
  255. }
  256. static int pm8xxx_pinmux_set_mux(struct pinctrl_dev *pctldev,
  257. unsigned function,
  258. unsigned group)
  259. {
  260. struct pm8xxx_mpp *pctrl = pinctrl_dev_get_drvdata(pctldev);
  261. struct pm8xxx_pin_data *pin = pctrl->desc.pins[group].drv_data;
  262. pin->mode = function;
  263. pm8xxx_mpp_update(pctrl, pin);
  264. return 0;
  265. }
  266. static const struct pinmux_ops pm8xxx_pinmux_ops = {
  267. .get_functions_count = pm8xxx_get_functions_count,
  268. .get_function_name = pm8xxx_get_function_name,
  269. .get_function_groups = pm8xxx_get_function_groups,
  270. .set_mux = pm8xxx_pinmux_set_mux,
  271. };
  272. static int pm8xxx_pin_config_get(struct pinctrl_dev *pctldev,
  273. unsigned int offset,
  274. unsigned long *config)
  275. {
  276. struct pm8xxx_mpp *pctrl = pinctrl_dev_get_drvdata(pctldev);
  277. struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
  278. unsigned param = pinconf_to_config_param(*config);
  279. unsigned arg;
  280. switch (param) {
  281. case PIN_CONFIG_BIAS_PULL_UP:
  282. arg = pin->pullup;
  283. break;
  284. case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
  285. arg = pin->high_z;
  286. break;
  287. case PIN_CONFIG_INPUT_ENABLE:
  288. arg = pin->input;
  289. break;
  290. case PIN_CONFIG_OUTPUT:
  291. arg = pin->output_value;
  292. break;
  293. case PIN_CONFIG_POWER_SOURCE:
  294. arg = pin->power_source;
  295. break;
  296. case PIN_CONFIG_DRIVE_STRENGTH:
  297. arg = pin->drive_strength;
  298. break;
  299. case PM8XXX_CONFIG_DTEST_SELECTOR:
  300. arg = pin->dtest;
  301. break;
  302. case PM8XXX_CONFIG_AMUX:
  303. arg = pin->amux;
  304. break;
  305. case PM8XXX_CONFIG_ALEVEL:
  306. arg = pin->aout_level;
  307. break;
  308. case PM8XXX_CONFIG_PAIRED:
  309. arg = pin->paired;
  310. break;
  311. default:
  312. return -EINVAL;
  313. }
  314. *config = pinconf_to_config_packed(param, arg);
  315. return 0;
  316. }
  317. static int pm8xxx_pin_config_set(struct pinctrl_dev *pctldev,
  318. unsigned int offset,
  319. unsigned long *configs,
  320. unsigned num_configs)
  321. {
  322. struct pm8xxx_mpp *pctrl = pinctrl_dev_get_drvdata(pctldev);
  323. struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
  324. unsigned param;
  325. unsigned arg;
  326. unsigned i;
  327. for (i = 0; i < num_configs; i++) {
  328. param = pinconf_to_config_param(configs[i]);
  329. arg = pinconf_to_config_argument(configs[i]);
  330. switch (param) {
  331. case PIN_CONFIG_BIAS_PULL_UP:
  332. pin->pullup = arg;
  333. break;
  334. case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
  335. pin->high_z = true;
  336. break;
  337. case PIN_CONFIG_INPUT_ENABLE:
  338. pin->input = true;
  339. break;
  340. case PIN_CONFIG_OUTPUT:
  341. pin->output = true;
  342. pin->output_value = !!arg;
  343. break;
  344. case PIN_CONFIG_POWER_SOURCE:
  345. pin->power_source = arg;
  346. break;
  347. case PIN_CONFIG_DRIVE_STRENGTH:
  348. pin->drive_strength = arg;
  349. break;
  350. case PM8XXX_CONFIG_DTEST_SELECTOR:
  351. pin->dtest = arg;
  352. break;
  353. case PM8XXX_CONFIG_AMUX:
  354. pin->amux = arg;
  355. break;
  356. case PM8XXX_CONFIG_ALEVEL:
  357. pin->aout_level = arg;
  358. break;
  359. case PM8XXX_CONFIG_PAIRED:
  360. pin->paired = !!arg;
  361. break;
  362. default:
  363. dev_err(pctrl->dev,
  364. "unsupported config parameter: %x\n",
  365. param);
  366. return -EINVAL;
  367. }
  368. }
  369. pm8xxx_mpp_update(pctrl, pin);
  370. return 0;
  371. }
  372. static const struct pinconf_ops pm8xxx_pinconf_ops = {
  373. .is_generic = true,
  374. .pin_config_group_get = pm8xxx_pin_config_get,
  375. .pin_config_group_set = pm8xxx_pin_config_set,
  376. };
  377. static const struct pinctrl_desc pm8xxx_pinctrl_desc = {
  378. .name = "pm8xxx_mpp",
  379. .pctlops = &pm8xxx_pinctrl_ops,
  380. .pmxops = &pm8xxx_pinmux_ops,
  381. .confops = &pm8xxx_pinconf_ops,
  382. .owner = THIS_MODULE,
  383. };
  384. static int pm8xxx_mpp_direction_input(struct gpio_chip *chip,
  385. unsigned offset)
  386. {
  387. struct pm8xxx_mpp *pctrl = gpiochip_get_data(chip);
  388. struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
  389. switch (pin->mode) {
  390. case PM8XXX_MPP_DIGITAL:
  391. pin->input = true;
  392. break;
  393. case PM8XXX_MPP_ANALOG:
  394. pin->input = true;
  395. pin->output = true;
  396. break;
  397. case PM8XXX_MPP_SINK:
  398. return -EINVAL;
  399. }
  400. pm8xxx_mpp_update(pctrl, pin);
  401. return 0;
  402. }
  403. static int pm8xxx_mpp_direction_output(struct gpio_chip *chip,
  404. unsigned offset,
  405. int value)
  406. {
  407. struct pm8xxx_mpp *pctrl = gpiochip_get_data(chip);
  408. struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
  409. switch (pin->mode) {
  410. case PM8XXX_MPP_DIGITAL:
  411. pin->output = true;
  412. break;
  413. case PM8XXX_MPP_ANALOG:
  414. pin->input = false;
  415. pin->output = true;
  416. break;
  417. case PM8XXX_MPP_SINK:
  418. pin->input = false;
  419. pin->output = true;
  420. break;
  421. }
  422. pm8xxx_mpp_update(pctrl, pin);
  423. return 0;
  424. }
  425. static int pm8xxx_mpp_get(struct gpio_chip *chip, unsigned offset)
  426. {
  427. struct pm8xxx_mpp *pctrl = gpiochip_get_data(chip);
  428. struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
  429. bool state;
  430. int ret, irq;
  431. if (!pin->input)
  432. return !!pin->output_value;
  433. irq = chip->to_irq(chip, offset);
  434. if (irq < 0)
  435. return irq;
  436. ret = irq_get_irqchip_state(irq, IRQCHIP_STATE_LINE_LEVEL, &state);
  437. if (!ret)
  438. ret = !!state;
  439. return ret;
  440. }
  441. static void pm8xxx_mpp_set(struct gpio_chip *chip, unsigned offset, int value)
  442. {
  443. struct pm8xxx_mpp *pctrl = gpiochip_get_data(chip);
  444. struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
  445. pin->output_value = !!value;
  446. pm8xxx_mpp_update(pctrl, pin);
  447. }
  448. static int pm8xxx_mpp_of_xlate(struct gpio_chip *chip,
  449. const struct of_phandle_args *gpio_desc,
  450. u32 *flags)
  451. {
  452. if (chip->of_gpio_n_cells < 2)
  453. return -EINVAL;
  454. if (flags)
  455. *flags = gpio_desc->args[1];
  456. return gpio_desc->args[0] - PM8XXX_MPP_PHYSICAL_OFFSET;
  457. }
  458. #ifdef CONFIG_DEBUG_FS
  459. #include <linux/seq_file.h>
  460. static void pm8xxx_mpp_dbg_show_one(struct seq_file *s,
  461. struct pinctrl_dev *pctldev,
  462. struct gpio_chip *chip,
  463. unsigned offset,
  464. unsigned gpio)
  465. {
  466. struct pm8xxx_mpp *pctrl = gpiochip_get_data(chip);
  467. struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
  468. static const char * const aout_lvls[] = {
  469. "1v25", "1v25_2", "0v625", "0v3125", "mpp", "abus1", "abus2",
  470. "abus3"
  471. };
  472. static const char * const amuxs[] = {
  473. "amux5", "amux6", "amux7", "amux8", "amux9", "abus1", "abus2",
  474. "abus3",
  475. };
  476. seq_printf(s, " mpp%-2d:", offset + PM8XXX_MPP_PHYSICAL_OFFSET);
  477. switch (pin->mode) {
  478. case PM8XXX_MPP_DIGITAL:
  479. seq_puts(s, " digital ");
  480. if (pin->dtest) {
  481. seq_printf(s, "dtest%d\n", pin->dtest);
  482. } else if (pin->input && pin->output) {
  483. if (pin->high_z)
  484. seq_puts(s, "bi-dir high-z");
  485. else
  486. seq_printf(s, "bi-dir %dOhm", pin->pullup);
  487. } else if (pin->input) {
  488. if (pin->dtest)
  489. seq_printf(s, "in dtest%d", pin->dtest);
  490. else
  491. seq_puts(s, "in gpio");
  492. } else if (pin->output) {
  493. seq_puts(s, "out ");
  494. if (!pin->paired) {
  495. seq_puts(s, pin->output_value ?
  496. "high" : "low");
  497. } else {
  498. seq_puts(s, pin->output_value ?
  499. "inverted" : "follow");
  500. }
  501. }
  502. break;
  503. case PM8XXX_MPP_ANALOG:
  504. seq_puts(s, " analog ");
  505. if (pin->output) {
  506. seq_printf(s, "out %s ", aout_lvls[pin->aout_level]);
  507. if (!pin->paired) {
  508. seq_puts(s, pin->output_value ?
  509. "high" : "low");
  510. } else {
  511. seq_puts(s, pin->output_value ?
  512. "inverted" : "follow");
  513. }
  514. } else {
  515. seq_printf(s, "input mux %s", amuxs[pin->amux]);
  516. }
  517. break;
  518. case PM8XXX_MPP_SINK:
  519. seq_printf(s, " sink %dmA ", pin->drive_strength);
  520. if (pin->dtest) {
  521. seq_printf(s, "dtest%d", pin->dtest);
  522. } else {
  523. if (!pin->paired) {
  524. seq_puts(s, pin->output_value ?
  525. "high" : "low");
  526. } else {
  527. seq_puts(s, pin->output_value ?
  528. "inverted" : "follow");
  529. }
  530. }
  531. break;
  532. }
  533. }
  534. static void pm8xxx_mpp_dbg_show(struct seq_file *s, struct gpio_chip *chip)
  535. {
  536. unsigned gpio = chip->base;
  537. unsigned i;
  538. for (i = 0; i < chip->ngpio; i++, gpio++) {
  539. pm8xxx_mpp_dbg_show_one(s, NULL, chip, i, gpio);
  540. seq_puts(s, "\n");
  541. }
  542. }
  543. #else
  544. #define pm8xxx_mpp_dbg_show NULL
  545. #endif
  546. static const struct gpio_chip pm8xxx_mpp_template = {
  547. .direction_input = pm8xxx_mpp_direction_input,
  548. .direction_output = pm8xxx_mpp_direction_output,
  549. .get = pm8xxx_mpp_get,
  550. .set = pm8xxx_mpp_set,
  551. .of_xlate = pm8xxx_mpp_of_xlate,
  552. .dbg_show = pm8xxx_mpp_dbg_show,
  553. .owner = THIS_MODULE,
  554. };
  555. static int pm8xxx_pin_populate(struct pm8xxx_mpp *pctrl,
  556. struct pm8xxx_pin_data *pin)
  557. {
  558. unsigned int val;
  559. unsigned level;
  560. unsigned ctrl;
  561. unsigned type;
  562. int ret;
  563. ret = regmap_read(pctrl->regmap, pin->reg, &val);
  564. if (ret) {
  565. dev_err(pctrl->dev, "failed to read register\n");
  566. return ret;
  567. }
  568. type = (val >> 5) & 7;
  569. level = (val >> 2) & 7;
  570. ctrl = (val) & 3;
  571. switch (type) {
  572. case PM8XXX_MPP_TYPE_D_INPUT:
  573. pin->mode = PM8XXX_MPP_DIGITAL;
  574. pin->input = true;
  575. pin->power_source = level;
  576. pin->dtest = ctrl;
  577. break;
  578. case PM8XXX_MPP_TYPE_D_OUTPUT:
  579. pin->mode = PM8XXX_MPP_DIGITAL;
  580. pin->output = true;
  581. pin->power_source = level;
  582. pin->output_value = !!(ctrl & BIT(0));
  583. pin->paired = !!(ctrl & BIT(1));
  584. break;
  585. case PM8XXX_MPP_TYPE_D_BI_DIR:
  586. pin->mode = PM8XXX_MPP_DIGITAL;
  587. pin->input = true;
  588. pin->output = true;
  589. pin->power_source = level;
  590. switch (ctrl) {
  591. case PM8XXX_MPP_BI_PULLUP_1KOHM:
  592. pin->pullup = 600;
  593. break;
  594. case PM8XXX_MPP_BI_PULLUP_OPEN:
  595. pin->high_z = true;
  596. break;
  597. case PM8XXX_MPP_BI_PULLUP_10KOHM:
  598. pin->pullup = 10000;
  599. break;
  600. case PM8XXX_MPP_BI_PULLUP_30KOHM:
  601. pin->pullup = 30000;
  602. break;
  603. }
  604. break;
  605. case PM8XXX_MPP_TYPE_A_INPUT:
  606. pin->mode = PM8XXX_MPP_ANALOG;
  607. pin->input = true;
  608. pin->amux = level;
  609. break;
  610. case PM8XXX_MPP_TYPE_A_OUTPUT:
  611. pin->mode = PM8XXX_MPP_ANALOG;
  612. pin->output = true;
  613. pin->aout_level = level;
  614. pin->output_value = !!(ctrl & BIT(0));
  615. pin->paired = !!(ctrl & BIT(1));
  616. break;
  617. case PM8XXX_MPP_TYPE_SINK:
  618. pin->mode = PM8XXX_MPP_SINK;
  619. pin->drive_strength = 5 * (level + 1);
  620. pin->output_value = !!(ctrl & BIT(0));
  621. pin->paired = !!(ctrl & BIT(1));
  622. break;
  623. case PM8XXX_MPP_TYPE_DTEST_SINK:
  624. pin->mode = PM8XXX_MPP_SINK;
  625. pin->dtest = ctrl + 1;
  626. pin->drive_strength = 5 * (level + 1);
  627. break;
  628. case PM8XXX_MPP_TYPE_DTEST_OUTPUT:
  629. pin->mode = PM8XXX_MPP_DIGITAL;
  630. pin->power_source = level;
  631. if (ctrl >= 1)
  632. pin->dtest = ctrl;
  633. break;
  634. }
  635. return 0;
  636. }
  637. static int pm8xxx_mpp_domain_translate(struct irq_domain *domain,
  638. struct irq_fwspec *fwspec,
  639. unsigned long *hwirq,
  640. unsigned int *type)
  641. {
  642. struct pm8xxx_mpp *pctrl = container_of(domain->host_data,
  643. struct pm8xxx_mpp, chip);
  644. if (fwspec->param_count != 2 ||
  645. fwspec->param[0] < PM8XXX_MPP_PHYSICAL_OFFSET ||
  646. fwspec->param[0] > pctrl->chip.ngpio)
  647. return -EINVAL;
  648. *hwirq = fwspec->param[0] - PM8XXX_MPP_PHYSICAL_OFFSET;
  649. *type = fwspec->param[1];
  650. return 0;
  651. }
  652. static unsigned int pm8xxx_mpp_child_offset_to_irq(struct gpio_chip *chip,
  653. unsigned int offset)
  654. {
  655. return offset + PM8XXX_MPP_PHYSICAL_OFFSET;
  656. }
  657. static int pm8821_mpp_child_to_parent_hwirq(struct gpio_chip *chip,
  658. unsigned int child_hwirq,
  659. unsigned int child_type,
  660. unsigned int *parent_hwirq,
  661. unsigned int *parent_type)
  662. {
  663. *parent_hwirq = child_hwirq + 24;
  664. *parent_type = child_type;
  665. return 0;
  666. }
  667. static int pm8xxx_mpp_child_to_parent_hwirq(struct gpio_chip *chip,
  668. unsigned int child_hwirq,
  669. unsigned int child_type,
  670. unsigned int *parent_hwirq,
  671. unsigned int *parent_type)
  672. {
  673. *parent_hwirq = child_hwirq + 0x80;
  674. *parent_type = child_type;
  675. return 0;
  676. }
  677. static const struct of_device_id pm8xxx_mpp_of_match[] = {
  678. { .compatible = "qcom,pm8018-mpp", .data = (void *) 6 },
  679. { .compatible = "qcom,pm8038-mpp", .data = (void *) 6 },
  680. { .compatible = "qcom,pm8058-mpp", .data = (void *) 12 },
  681. { .compatible = "qcom,pm8821-mpp", .data = (void *) 4 },
  682. { .compatible = "qcom,pm8917-mpp", .data = (void *) 10 },
  683. { .compatible = "qcom,pm8921-mpp", .data = (void *) 12 },
  684. { },
  685. };
  686. MODULE_DEVICE_TABLE(of, pm8xxx_mpp_of_match);
  687. static int pm8xxx_mpp_probe(struct platform_device *pdev)
  688. {
  689. struct pm8xxx_pin_data *pin_data;
  690. struct irq_domain *parent_domain;
  691. struct device_node *parent_node;
  692. struct pinctrl_pin_desc *pins;
  693. struct gpio_irq_chip *girq;
  694. struct pm8xxx_mpp *pctrl;
  695. int ret;
  696. int i;
  697. pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL);
  698. if (!pctrl)
  699. return -ENOMEM;
  700. pctrl->dev = &pdev->dev;
  701. pctrl->npins = (uintptr_t) device_get_match_data(&pdev->dev);
  702. pctrl->regmap = dev_get_regmap(pdev->dev.parent, NULL);
  703. if (!pctrl->regmap) {
  704. dev_err(&pdev->dev, "parent regmap unavailable\n");
  705. return -ENXIO;
  706. }
  707. pctrl->desc = pm8xxx_pinctrl_desc;
  708. pctrl->desc.npins = pctrl->npins;
  709. pins = devm_kcalloc(&pdev->dev,
  710. pctrl->desc.npins,
  711. sizeof(struct pinctrl_pin_desc),
  712. GFP_KERNEL);
  713. if (!pins)
  714. return -ENOMEM;
  715. pin_data = devm_kcalloc(&pdev->dev,
  716. pctrl->desc.npins,
  717. sizeof(struct pm8xxx_pin_data),
  718. GFP_KERNEL);
  719. if (!pin_data)
  720. return -ENOMEM;
  721. for (i = 0; i < pctrl->desc.npins; i++) {
  722. pin_data[i].reg = SSBI_REG_ADDR_MPP(i);
  723. ret = pm8xxx_pin_populate(pctrl, &pin_data[i]);
  724. if (ret)
  725. return ret;
  726. pins[i].number = i;
  727. pins[i].name = pm8xxx_groups[i];
  728. pins[i].drv_data = &pin_data[i];
  729. }
  730. pctrl->desc.pins = pins;
  731. pctrl->desc.num_custom_params = ARRAY_SIZE(pm8xxx_mpp_bindings);
  732. pctrl->desc.custom_params = pm8xxx_mpp_bindings;
  733. #ifdef CONFIG_DEBUG_FS
  734. pctrl->desc.custom_conf_items = pm8xxx_conf_items;
  735. #endif
  736. pctrl->pctrl = devm_pinctrl_register(&pdev->dev, &pctrl->desc, pctrl);
  737. if (IS_ERR(pctrl->pctrl)) {
  738. dev_err(&pdev->dev, "couldn't register pm8xxx mpp driver\n");
  739. return PTR_ERR(pctrl->pctrl);
  740. }
  741. pctrl->chip = pm8xxx_mpp_template;
  742. pctrl->chip.base = -1;
  743. pctrl->chip.parent = &pdev->dev;
  744. pctrl->chip.of_gpio_n_cells = 2;
  745. pctrl->chip.label = dev_name(pctrl->dev);
  746. pctrl->chip.ngpio = pctrl->npins;
  747. parent_node = of_irq_find_parent(pctrl->dev->of_node);
  748. if (!parent_node)
  749. return -ENXIO;
  750. parent_domain = irq_find_host(parent_node);
  751. of_node_put(parent_node);
  752. if (!parent_domain)
  753. return -ENXIO;
  754. pctrl->irq.name = "ssbi-mpp";
  755. pctrl->irq.irq_mask_ack = irq_chip_mask_ack_parent;
  756. pctrl->irq.irq_unmask = irq_chip_unmask_parent;
  757. pctrl->irq.irq_set_type = irq_chip_set_type_parent;
  758. pctrl->irq.flags = IRQCHIP_MASK_ON_SUSPEND | IRQCHIP_SKIP_SET_WAKE;
  759. girq = &pctrl->chip.irq;
  760. girq->chip = &pctrl->irq;
  761. girq->default_type = IRQ_TYPE_NONE;
  762. girq->handler = handle_level_irq;
  763. girq->fwnode = of_node_to_fwnode(pctrl->dev->of_node);
  764. girq->parent_domain = parent_domain;
  765. if (of_device_is_compatible(pdev->dev.of_node, "qcom,pm8821-mpp"))
  766. girq->child_to_parent_hwirq = pm8821_mpp_child_to_parent_hwirq;
  767. else
  768. girq->child_to_parent_hwirq = pm8xxx_mpp_child_to_parent_hwirq;
  769. girq->populate_parent_alloc_arg = gpiochip_populate_parent_fwspec_twocell;
  770. girq->child_offset_to_irq = pm8xxx_mpp_child_offset_to_irq;
  771. girq->child_irq_domain_ops.translate = pm8xxx_mpp_domain_translate;
  772. ret = gpiochip_add_data(&pctrl->chip, pctrl);
  773. if (ret) {
  774. dev_err(&pdev->dev, "failed register gpiochip\n");
  775. return ret;
  776. }
  777. ret = gpiochip_add_pin_range(&pctrl->chip,
  778. dev_name(pctrl->dev),
  779. 0, 0, pctrl->chip.ngpio);
  780. if (ret) {
  781. dev_err(pctrl->dev, "failed to add pin range\n");
  782. goto unregister_gpiochip;
  783. }
  784. platform_set_drvdata(pdev, pctrl);
  785. dev_dbg(&pdev->dev, "Qualcomm pm8xxx mpp driver probed\n");
  786. return 0;
  787. unregister_gpiochip:
  788. gpiochip_remove(&pctrl->chip);
  789. return ret;
  790. }
  791. static int pm8xxx_mpp_remove(struct platform_device *pdev)
  792. {
  793. struct pm8xxx_mpp *pctrl = platform_get_drvdata(pdev);
  794. gpiochip_remove(&pctrl->chip);
  795. return 0;
  796. }
  797. static struct platform_driver pm8xxx_mpp_driver = {
  798. .driver = {
  799. .name = "qcom-ssbi-mpp",
  800. .of_match_table = pm8xxx_mpp_of_match,
  801. },
  802. .probe = pm8xxx_mpp_probe,
  803. .remove = pm8xxx_mpp_remove,
  804. };
  805. module_platform_driver(pm8xxx_mpp_driver);
  806. MODULE_AUTHOR("Bjorn Andersson <[email protected]>");
  807. MODULE_DESCRIPTION("Qualcomm PM8xxx MPP driver");
  808. MODULE_LICENSE("GPL v2");