adp5589-keys.c 29 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Description: keypad driver for ADP5589, ADP5585
  4. * I2C QWERTY Keypad and IO Expander
  5. * Bugs: Enter bugs at http://blackfin.uclinux.org/
  6. *
  7. * Copyright (C) 2010-2011 Analog Devices Inc.
  8. */
  9. #include <linux/bitops.h>
  10. #include <linux/module.h>
  11. #include <linux/interrupt.h>
  12. #include <linux/irq.h>
  13. #include <linux/workqueue.h>
  14. #include <linux/errno.h>
  15. #include <linux/pm.h>
  16. #include <linux/pm_wakeirq.h>
  17. #include <linux/platform_device.h>
  18. #include <linux/input.h>
  19. #include <linux/i2c.h>
  20. #include <linux/gpio/driver.h>
  21. #include <linux/slab.h>
  22. #include <linux/input/adp5589.h>
  23. /* ADP5589/ADP5585 Common Registers */
  24. #define ADP5589_5_ID 0x00
  25. #define ADP5589_5_INT_STATUS 0x01
  26. #define ADP5589_5_STATUS 0x02
  27. #define ADP5589_5_FIFO_1 0x03
  28. #define ADP5589_5_FIFO_2 0x04
  29. #define ADP5589_5_FIFO_3 0x05
  30. #define ADP5589_5_FIFO_4 0x06
  31. #define ADP5589_5_FIFO_5 0x07
  32. #define ADP5589_5_FIFO_6 0x08
  33. #define ADP5589_5_FIFO_7 0x09
  34. #define ADP5589_5_FIFO_8 0x0A
  35. #define ADP5589_5_FIFO_9 0x0B
  36. #define ADP5589_5_FIFO_10 0x0C
  37. #define ADP5589_5_FIFO_11 0x0D
  38. #define ADP5589_5_FIFO_12 0x0E
  39. #define ADP5589_5_FIFO_13 0x0F
  40. #define ADP5589_5_FIFO_14 0x10
  41. #define ADP5589_5_FIFO_15 0x11
  42. #define ADP5589_5_FIFO_16 0x12
  43. #define ADP5589_5_GPI_INT_STAT_A 0x13
  44. #define ADP5589_5_GPI_INT_STAT_B 0x14
  45. /* ADP5589 Registers */
  46. #define ADP5589_GPI_INT_STAT_C 0x15
  47. #define ADP5589_GPI_STATUS_A 0x16
  48. #define ADP5589_GPI_STATUS_B 0x17
  49. #define ADP5589_GPI_STATUS_C 0x18
  50. #define ADP5589_RPULL_CONFIG_A 0x19
  51. #define ADP5589_RPULL_CONFIG_B 0x1A
  52. #define ADP5589_RPULL_CONFIG_C 0x1B
  53. #define ADP5589_RPULL_CONFIG_D 0x1C
  54. #define ADP5589_RPULL_CONFIG_E 0x1D
  55. #define ADP5589_GPI_INT_LEVEL_A 0x1E
  56. #define ADP5589_GPI_INT_LEVEL_B 0x1F
  57. #define ADP5589_GPI_INT_LEVEL_C 0x20
  58. #define ADP5589_GPI_EVENT_EN_A 0x21
  59. #define ADP5589_GPI_EVENT_EN_B 0x22
  60. #define ADP5589_GPI_EVENT_EN_C 0x23
  61. #define ADP5589_GPI_INTERRUPT_EN_A 0x24
  62. #define ADP5589_GPI_INTERRUPT_EN_B 0x25
  63. #define ADP5589_GPI_INTERRUPT_EN_C 0x26
  64. #define ADP5589_DEBOUNCE_DIS_A 0x27
  65. #define ADP5589_DEBOUNCE_DIS_B 0x28
  66. #define ADP5589_DEBOUNCE_DIS_C 0x29
  67. #define ADP5589_GPO_DATA_OUT_A 0x2A
  68. #define ADP5589_GPO_DATA_OUT_B 0x2B
  69. #define ADP5589_GPO_DATA_OUT_C 0x2C
  70. #define ADP5589_GPO_OUT_MODE_A 0x2D
  71. #define ADP5589_GPO_OUT_MODE_B 0x2E
  72. #define ADP5589_GPO_OUT_MODE_C 0x2F
  73. #define ADP5589_GPIO_DIRECTION_A 0x30
  74. #define ADP5589_GPIO_DIRECTION_B 0x31
  75. #define ADP5589_GPIO_DIRECTION_C 0x32
  76. #define ADP5589_UNLOCK1 0x33
  77. #define ADP5589_UNLOCK2 0x34
  78. #define ADP5589_EXT_LOCK_EVENT 0x35
  79. #define ADP5589_UNLOCK_TIMERS 0x36
  80. #define ADP5589_LOCK_CFG 0x37
  81. #define ADP5589_RESET1_EVENT_A 0x38
  82. #define ADP5589_RESET1_EVENT_B 0x39
  83. #define ADP5589_RESET1_EVENT_C 0x3A
  84. #define ADP5589_RESET2_EVENT_A 0x3B
  85. #define ADP5589_RESET2_EVENT_B 0x3C
  86. #define ADP5589_RESET_CFG 0x3D
  87. #define ADP5589_PWM_OFFT_LOW 0x3E
  88. #define ADP5589_PWM_OFFT_HIGH 0x3F
  89. #define ADP5589_PWM_ONT_LOW 0x40
  90. #define ADP5589_PWM_ONT_HIGH 0x41
  91. #define ADP5589_PWM_CFG 0x42
  92. #define ADP5589_CLOCK_DIV_CFG 0x43
  93. #define ADP5589_LOGIC_1_CFG 0x44
  94. #define ADP5589_LOGIC_2_CFG 0x45
  95. #define ADP5589_LOGIC_FF_CFG 0x46
  96. #define ADP5589_LOGIC_INT_EVENT_EN 0x47
  97. #define ADP5589_POLL_PTIME_CFG 0x48
  98. #define ADP5589_PIN_CONFIG_A 0x49
  99. #define ADP5589_PIN_CONFIG_B 0x4A
  100. #define ADP5589_PIN_CONFIG_C 0x4B
  101. #define ADP5589_PIN_CONFIG_D 0x4C
  102. #define ADP5589_GENERAL_CFG 0x4D
  103. #define ADP5589_INT_EN 0x4E
  104. /* ADP5585 Registers */
  105. #define ADP5585_GPI_STATUS_A 0x15
  106. #define ADP5585_GPI_STATUS_B 0x16
  107. #define ADP5585_RPULL_CONFIG_A 0x17
  108. #define ADP5585_RPULL_CONFIG_B 0x18
  109. #define ADP5585_RPULL_CONFIG_C 0x19
  110. #define ADP5585_RPULL_CONFIG_D 0x1A
  111. #define ADP5585_GPI_INT_LEVEL_A 0x1B
  112. #define ADP5585_GPI_INT_LEVEL_B 0x1C
  113. #define ADP5585_GPI_EVENT_EN_A 0x1D
  114. #define ADP5585_GPI_EVENT_EN_B 0x1E
  115. #define ADP5585_GPI_INTERRUPT_EN_A 0x1F
  116. #define ADP5585_GPI_INTERRUPT_EN_B 0x20
  117. #define ADP5585_DEBOUNCE_DIS_A 0x21
  118. #define ADP5585_DEBOUNCE_DIS_B 0x22
  119. #define ADP5585_GPO_DATA_OUT_A 0x23
  120. #define ADP5585_GPO_DATA_OUT_B 0x24
  121. #define ADP5585_GPO_OUT_MODE_A 0x25
  122. #define ADP5585_GPO_OUT_MODE_B 0x26
  123. #define ADP5585_GPIO_DIRECTION_A 0x27
  124. #define ADP5585_GPIO_DIRECTION_B 0x28
  125. #define ADP5585_RESET1_EVENT_A 0x29
  126. #define ADP5585_RESET1_EVENT_B 0x2A
  127. #define ADP5585_RESET1_EVENT_C 0x2B
  128. #define ADP5585_RESET2_EVENT_A 0x2C
  129. #define ADP5585_RESET2_EVENT_B 0x2D
  130. #define ADP5585_RESET_CFG 0x2E
  131. #define ADP5585_PWM_OFFT_LOW 0x2F
  132. #define ADP5585_PWM_OFFT_HIGH 0x30
  133. #define ADP5585_PWM_ONT_LOW 0x31
  134. #define ADP5585_PWM_ONT_HIGH 0x32
  135. #define ADP5585_PWM_CFG 0x33
  136. #define ADP5585_LOGIC_CFG 0x34
  137. #define ADP5585_LOGIC_FF_CFG 0x35
  138. #define ADP5585_LOGIC_INT_EVENT_EN 0x36
  139. #define ADP5585_POLL_PTIME_CFG 0x37
  140. #define ADP5585_PIN_CONFIG_A 0x38
  141. #define ADP5585_PIN_CONFIG_B 0x39
  142. #define ADP5585_PIN_CONFIG_D 0x3A
  143. #define ADP5585_GENERAL_CFG 0x3B
  144. #define ADP5585_INT_EN 0x3C
  145. /* ID Register */
  146. #define ADP5589_5_DEVICE_ID_MASK 0xF
  147. #define ADP5589_5_MAN_ID_MASK 0xF
  148. #define ADP5589_5_MAN_ID_SHIFT 4
  149. #define ADP5589_5_MAN_ID 0x02
  150. /* GENERAL_CFG Register */
  151. #define OSC_EN BIT(7)
  152. #define CORE_CLK(x) (((x) & 0x3) << 5)
  153. #define LCK_TRK_LOGIC BIT(4) /* ADP5589 only */
  154. #define LCK_TRK_GPI BIT(3) /* ADP5589 only */
  155. #define INT_CFG BIT(1)
  156. #define RST_CFG BIT(0)
  157. /* INT_EN Register */
  158. #define LOGIC2_IEN BIT(5) /* ADP5589 only */
  159. #define LOGIC1_IEN BIT(4)
  160. #define LOCK_IEN BIT(3) /* ADP5589 only */
  161. #define OVRFLOW_IEN BIT(2)
  162. #define GPI_IEN BIT(1)
  163. #define EVENT_IEN BIT(0)
  164. /* Interrupt Status Register */
  165. #define LOGIC2_INT BIT(5) /* ADP5589 only */
  166. #define LOGIC1_INT BIT(4)
  167. #define LOCK_INT BIT(3) /* ADP5589 only */
  168. #define OVRFLOW_INT BIT(2)
  169. #define GPI_INT BIT(1)
  170. #define EVENT_INT BIT(0)
  171. /* STATUS Register */
  172. #define LOGIC2_STAT BIT(7) /* ADP5589 only */
  173. #define LOGIC1_STAT BIT(6)
  174. #define LOCK_STAT BIT(5) /* ADP5589 only */
  175. #define KEC 0x1F
  176. /* PIN_CONFIG_D Register */
  177. #define C4_EXTEND_CFG BIT(6) /* RESET2 */
  178. #define R4_EXTEND_CFG BIT(5) /* RESET1 */
  179. /* LOCK_CFG */
  180. #define LOCK_EN BIT(0)
  181. #define PTIME_MASK 0x3
  182. #define LTIME_MASK 0x3 /* ADP5589 only */
  183. /* Key Event Register xy */
  184. #define KEY_EV_PRESSED BIT(7)
  185. #define KEY_EV_MASK 0x7F
  186. #define KEYP_MAX_EVENT 16
  187. #define ADP5589_MAXGPIO 19
  188. #define ADP5585_MAXGPIO 11 /* 10 on the ADP5585-01, 11 on ADP5585-02 */
  189. enum {
  190. ADP5589,
  191. ADP5585_01,
  192. ADP5585_02
  193. };
  194. struct adp_constants {
  195. u8 maxgpio;
  196. u8 keymapsize;
  197. u8 gpi_pin_row_base;
  198. u8 gpi_pin_row_end;
  199. u8 gpi_pin_col_base;
  200. u8 gpi_pin_base;
  201. u8 gpi_pin_end;
  202. u8 gpimapsize_max;
  203. u8 max_row_num;
  204. u8 max_col_num;
  205. u8 row_mask;
  206. u8 col_mask;
  207. u8 col_shift;
  208. u8 c4_extend_cfg;
  209. u8 (*bank) (u8 offset);
  210. u8 (*bit) (u8 offset);
  211. u8 (*reg) (u8 reg);
  212. };
  213. struct adp5589_kpad {
  214. struct i2c_client *client;
  215. struct input_dev *input;
  216. const struct adp_constants *var;
  217. unsigned short keycode[ADP5589_KEYMAPSIZE];
  218. const struct adp5589_gpi_map *gpimap;
  219. unsigned short gpimapsize;
  220. unsigned extend_cfg;
  221. bool is_adp5585;
  222. bool support_row5;
  223. #ifdef CONFIG_GPIOLIB
  224. unsigned char gpiomap[ADP5589_MAXGPIO];
  225. struct gpio_chip gc;
  226. struct mutex gpio_lock; /* Protect cached dir, dat_out */
  227. u8 dat_out[3];
  228. u8 dir[3];
  229. #endif
  230. };
  231. /*
  232. * ADP5589 / ADP5585 derivative / variant handling
  233. */
  234. /* ADP5589 */
  235. static unsigned char adp5589_bank(unsigned char offset)
  236. {
  237. return offset >> 3;
  238. }
  239. static unsigned char adp5589_bit(unsigned char offset)
  240. {
  241. return 1u << (offset & 0x7);
  242. }
  243. static unsigned char adp5589_reg(unsigned char reg)
  244. {
  245. return reg;
  246. }
  247. static const struct adp_constants const_adp5589 = {
  248. .maxgpio = ADP5589_MAXGPIO,
  249. .keymapsize = ADP5589_KEYMAPSIZE,
  250. .gpi_pin_row_base = ADP5589_GPI_PIN_ROW_BASE,
  251. .gpi_pin_row_end = ADP5589_GPI_PIN_ROW_END,
  252. .gpi_pin_col_base = ADP5589_GPI_PIN_COL_BASE,
  253. .gpi_pin_base = ADP5589_GPI_PIN_BASE,
  254. .gpi_pin_end = ADP5589_GPI_PIN_END,
  255. .gpimapsize_max = ADP5589_GPIMAPSIZE_MAX,
  256. .c4_extend_cfg = 12,
  257. .max_row_num = ADP5589_MAX_ROW_NUM,
  258. .max_col_num = ADP5589_MAX_COL_NUM,
  259. .row_mask = ADP5589_ROW_MASK,
  260. .col_mask = ADP5589_COL_MASK,
  261. .col_shift = ADP5589_COL_SHIFT,
  262. .bank = adp5589_bank,
  263. .bit = adp5589_bit,
  264. .reg = adp5589_reg,
  265. };
  266. /* ADP5585 */
  267. static unsigned char adp5585_bank(unsigned char offset)
  268. {
  269. return offset > ADP5585_MAX_ROW_NUM;
  270. }
  271. static unsigned char adp5585_bit(unsigned char offset)
  272. {
  273. return (offset > ADP5585_MAX_ROW_NUM) ?
  274. 1u << (offset - ADP5585_COL_SHIFT) : 1u << offset;
  275. }
  276. static const unsigned char adp5585_reg_lut[] = {
  277. [ADP5589_GPI_STATUS_A] = ADP5585_GPI_STATUS_A,
  278. [ADP5589_GPI_STATUS_B] = ADP5585_GPI_STATUS_B,
  279. [ADP5589_RPULL_CONFIG_A] = ADP5585_RPULL_CONFIG_A,
  280. [ADP5589_RPULL_CONFIG_B] = ADP5585_RPULL_CONFIG_B,
  281. [ADP5589_RPULL_CONFIG_C] = ADP5585_RPULL_CONFIG_C,
  282. [ADP5589_RPULL_CONFIG_D] = ADP5585_RPULL_CONFIG_D,
  283. [ADP5589_GPI_INT_LEVEL_A] = ADP5585_GPI_INT_LEVEL_A,
  284. [ADP5589_GPI_INT_LEVEL_B] = ADP5585_GPI_INT_LEVEL_B,
  285. [ADP5589_GPI_EVENT_EN_A] = ADP5585_GPI_EVENT_EN_A,
  286. [ADP5589_GPI_EVENT_EN_B] = ADP5585_GPI_EVENT_EN_B,
  287. [ADP5589_GPI_INTERRUPT_EN_A] = ADP5585_GPI_INTERRUPT_EN_A,
  288. [ADP5589_GPI_INTERRUPT_EN_B] = ADP5585_GPI_INTERRUPT_EN_B,
  289. [ADP5589_DEBOUNCE_DIS_A] = ADP5585_DEBOUNCE_DIS_A,
  290. [ADP5589_DEBOUNCE_DIS_B] = ADP5585_DEBOUNCE_DIS_B,
  291. [ADP5589_GPO_DATA_OUT_A] = ADP5585_GPO_DATA_OUT_A,
  292. [ADP5589_GPO_DATA_OUT_B] = ADP5585_GPO_DATA_OUT_B,
  293. [ADP5589_GPO_OUT_MODE_A] = ADP5585_GPO_OUT_MODE_A,
  294. [ADP5589_GPO_OUT_MODE_B] = ADP5585_GPO_OUT_MODE_B,
  295. [ADP5589_GPIO_DIRECTION_A] = ADP5585_GPIO_DIRECTION_A,
  296. [ADP5589_GPIO_DIRECTION_B] = ADP5585_GPIO_DIRECTION_B,
  297. [ADP5589_RESET1_EVENT_A] = ADP5585_RESET1_EVENT_A,
  298. [ADP5589_RESET1_EVENT_B] = ADP5585_RESET1_EVENT_B,
  299. [ADP5589_RESET1_EVENT_C] = ADP5585_RESET1_EVENT_C,
  300. [ADP5589_RESET2_EVENT_A] = ADP5585_RESET2_EVENT_A,
  301. [ADP5589_RESET2_EVENT_B] = ADP5585_RESET2_EVENT_B,
  302. [ADP5589_RESET_CFG] = ADP5585_RESET_CFG,
  303. [ADP5589_PWM_OFFT_LOW] = ADP5585_PWM_OFFT_LOW,
  304. [ADP5589_PWM_OFFT_HIGH] = ADP5585_PWM_OFFT_HIGH,
  305. [ADP5589_PWM_ONT_LOW] = ADP5585_PWM_ONT_LOW,
  306. [ADP5589_PWM_ONT_HIGH] = ADP5585_PWM_ONT_HIGH,
  307. [ADP5589_PWM_CFG] = ADP5585_PWM_CFG,
  308. [ADP5589_LOGIC_1_CFG] = ADP5585_LOGIC_CFG,
  309. [ADP5589_LOGIC_FF_CFG] = ADP5585_LOGIC_FF_CFG,
  310. [ADP5589_LOGIC_INT_EVENT_EN] = ADP5585_LOGIC_INT_EVENT_EN,
  311. [ADP5589_POLL_PTIME_CFG] = ADP5585_POLL_PTIME_CFG,
  312. [ADP5589_PIN_CONFIG_A] = ADP5585_PIN_CONFIG_A,
  313. [ADP5589_PIN_CONFIG_B] = ADP5585_PIN_CONFIG_B,
  314. [ADP5589_PIN_CONFIG_D] = ADP5585_PIN_CONFIG_D,
  315. [ADP5589_GENERAL_CFG] = ADP5585_GENERAL_CFG,
  316. [ADP5589_INT_EN] = ADP5585_INT_EN,
  317. };
  318. static unsigned char adp5585_reg(unsigned char reg)
  319. {
  320. return adp5585_reg_lut[reg];
  321. }
  322. static const struct adp_constants const_adp5585 = {
  323. .maxgpio = ADP5585_MAXGPIO,
  324. .keymapsize = ADP5585_KEYMAPSIZE,
  325. .gpi_pin_row_base = ADP5585_GPI_PIN_ROW_BASE,
  326. .gpi_pin_row_end = ADP5585_GPI_PIN_ROW_END,
  327. .gpi_pin_col_base = ADP5585_GPI_PIN_COL_BASE,
  328. .gpi_pin_base = ADP5585_GPI_PIN_BASE,
  329. .gpi_pin_end = ADP5585_GPI_PIN_END,
  330. .gpimapsize_max = ADP5585_GPIMAPSIZE_MAX,
  331. .c4_extend_cfg = 10,
  332. .max_row_num = ADP5585_MAX_ROW_NUM,
  333. .max_col_num = ADP5585_MAX_COL_NUM,
  334. .row_mask = ADP5585_ROW_MASK,
  335. .col_mask = ADP5585_COL_MASK,
  336. .col_shift = ADP5585_COL_SHIFT,
  337. .bank = adp5585_bank,
  338. .bit = adp5585_bit,
  339. .reg = adp5585_reg,
  340. };
  341. static int adp5589_read(struct i2c_client *client, u8 reg)
  342. {
  343. int ret = i2c_smbus_read_byte_data(client, reg);
  344. if (ret < 0)
  345. dev_err(&client->dev, "Read Error\n");
  346. return ret;
  347. }
  348. static int adp5589_write(struct i2c_client *client, u8 reg, u8 val)
  349. {
  350. return i2c_smbus_write_byte_data(client, reg, val);
  351. }
  352. #ifdef CONFIG_GPIOLIB
  353. static int adp5589_gpio_get_value(struct gpio_chip *chip, unsigned off)
  354. {
  355. struct adp5589_kpad *kpad = gpiochip_get_data(chip);
  356. unsigned int bank = kpad->var->bank(kpad->gpiomap[off]);
  357. unsigned int bit = kpad->var->bit(kpad->gpiomap[off]);
  358. int val;
  359. mutex_lock(&kpad->gpio_lock);
  360. if (kpad->dir[bank] & bit)
  361. val = kpad->dat_out[bank];
  362. else
  363. val = adp5589_read(kpad->client,
  364. kpad->var->reg(ADP5589_GPI_STATUS_A) + bank);
  365. mutex_unlock(&kpad->gpio_lock);
  366. return !!(val & bit);
  367. }
  368. static void adp5589_gpio_set_value(struct gpio_chip *chip,
  369. unsigned off, int val)
  370. {
  371. struct adp5589_kpad *kpad = gpiochip_get_data(chip);
  372. unsigned int bank = kpad->var->bank(kpad->gpiomap[off]);
  373. unsigned int bit = kpad->var->bit(kpad->gpiomap[off]);
  374. mutex_lock(&kpad->gpio_lock);
  375. if (val)
  376. kpad->dat_out[bank] |= bit;
  377. else
  378. kpad->dat_out[bank] &= ~bit;
  379. adp5589_write(kpad->client, kpad->var->reg(ADP5589_GPO_DATA_OUT_A) +
  380. bank, kpad->dat_out[bank]);
  381. mutex_unlock(&kpad->gpio_lock);
  382. }
  383. static int adp5589_gpio_direction_input(struct gpio_chip *chip, unsigned off)
  384. {
  385. struct adp5589_kpad *kpad = gpiochip_get_data(chip);
  386. unsigned int bank = kpad->var->bank(kpad->gpiomap[off]);
  387. unsigned int bit = kpad->var->bit(kpad->gpiomap[off]);
  388. int ret;
  389. mutex_lock(&kpad->gpio_lock);
  390. kpad->dir[bank] &= ~bit;
  391. ret = adp5589_write(kpad->client,
  392. kpad->var->reg(ADP5589_GPIO_DIRECTION_A) + bank,
  393. kpad->dir[bank]);
  394. mutex_unlock(&kpad->gpio_lock);
  395. return ret;
  396. }
  397. static int adp5589_gpio_direction_output(struct gpio_chip *chip,
  398. unsigned off, int val)
  399. {
  400. struct adp5589_kpad *kpad = gpiochip_get_data(chip);
  401. unsigned int bank = kpad->var->bank(kpad->gpiomap[off]);
  402. unsigned int bit = kpad->var->bit(kpad->gpiomap[off]);
  403. int ret;
  404. mutex_lock(&kpad->gpio_lock);
  405. kpad->dir[bank] |= bit;
  406. if (val)
  407. kpad->dat_out[bank] |= bit;
  408. else
  409. kpad->dat_out[bank] &= ~bit;
  410. ret = adp5589_write(kpad->client, kpad->var->reg(ADP5589_GPO_DATA_OUT_A)
  411. + bank, kpad->dat_out[bank]);
  412. ret |= adp5589_write(kpad->client,
  413. kpad->var->reg(ADP5589_GPIO_DIRECTION_A) + bank,
  414. kpad->dir[bank]);
  415. mutex_unlock(&kpad->gpio_lock);
  416. return ret;
  417. }
  418. static int adp5589_build_gpiomap(struct adp5589_kpad *kpad,
  419. const struct adp5589_kpad_platform_data *pdata)
  420. {
  421. bool pin_used[ADP5589_MAXGPIO];
  422. int n_unused = 0;
  423. int i;
  424. memset(pin_used, false, sizeof(pin_used));
  425. for (i = 0; i < kpad->var->maxgpio; i++)
  426. if (pdata->keypad_en_mask & BIT(i))
  427. pin_used[i] = true;
  428. for (i = 0; i < kpad->gpimapsize; i++)
  429. pin_used[kpad->gpimap[i].pin - kpad->var->gpi_pin_base] = true;
  430. if (kpad->extend_cfg & R4_EXTEND_CFG)
  431. pin_used[4] = true;
  432. if (kpad->extend_cfg & C4_EXTEND_CFG)
  433. pin_used[kpad->var->c4_extend_cfg] = true;
  434. if (!kpad->support_row5)
  435. pin_used[5] = true;
  436. for (i = 0; i < kpad->var->maxgpio; i++)
  437. if (!pin_used[i])
  438. kpad->gpiomap[n_unused++] = i;
  439. return n_unused;
  440. }
  441. static int adp5589_gpio_add(struct adp5589_kpad *kpad)
  442. {
  443. struct device *dev = &kpad->client->dev;
  444. const struct adp5589_kpad_platform_data *pdata = dev_get_platdata(dev);
  445. const struct adp5589_gpio_platform_data *gpio_data = pdata->gpio_data;
  446. int i, error;
  447. if (!gpio_data)
  448. return 0;
  449. kpad->gc.parent = dev;
  450. kpad->gc.ngpio = adp5589_build_gpiomap(kpad, pdata);
  451. if (kpad->gc.ngpio == 0) {
  452. dev_info(dev, "No unused gpios left to export\n");
  453. return 0;
  454. }
  455. kpad->gc.direction_input = adp5589_gpio_direction_input;
  456. kpad->gc.direction_output = adp5589_gpio_direction_output;
  457. kpad->gc.get = adp5589_gpio_get_value;
  458. kpad->gc.set = adp5589_gpio_set_value;
  459. kpad->gc.can_sleep = 1;
  460. kpad->gc.base = gpio_data->gpio_start;
  461. kpad->gc.label = kpad->client->name;
  462. kpad->gc.owner = THIS_MODULE;
  463. mutex_init(&kpad->gpio_lock);
  464. error = devm_gpiochip_add_data(dev, &kpad->gc, kpad);
  465. if (error)
  466. return error;
  467. for (i = 0; i <= kpad->var->bank(kpad->var->maxgpio); i++) {
  468. kpad->dat_out[i] = adp5589_read(kpad->client, kpad->var->reg(
  469. ADP5589_GPO_DATA_OUT_A) + i);
  470. kpad->dir[i] = adp5589_read(kpad->client, kpad->var->reg(
  471. ADP5589_GPIO_DIRECTION_A) + i);
  472. }
  473. return 0;
  474. }
  475. #else
  476. static inline int adp5589_gpio_add(struct adp5589_kpad *kpad)
  477. {
  478. return 0;
  479. }
  480. #endif
  481. static void adp5589_report_switches(struct adp5589_kpad *kpad,
  482. int key, int key_val)
  483. {
  484. int i;
  485. for (i = 0; i < kpad->gpimapsize; i++) {
  486. if (key_val == kpad->gpimap[i].pin) {
  487. input_report_switch(kpad->input,
  488. kpad->gpimap[i].sw_evt,
  489. key & KEY_EV_PRESSED);
  490. break;
  491. }
  492. }
  493. }
  494. static void adp5589_report_events(struct adp5589_kpad *kpad, int ev_cnt)
  495. {
  496. int i;
  497. for (i = 0; i < ev_cnt; i++) {
  498. int key = adp5589_read(kpad->client, ADP5589_5_FIFO_1 + i);
  499. int key_val = key & KEY_EV_MASK;
  500. if (key_val >= kpad->var->gpi_pin_base &&
  501. key_val <= kpad->var->gpi_pin_end) {
  502. adp5589_report_switches(kpad, key, key_val);
  503. } else {
  504. input_report_key(kpad->input,
  505. kpad->keycode[key_val - 1],
  506. key & KEY_EV_PRESSED);
  507. }
  508. }
  509. }
  510. static irqreturn_t adp5589_irq(int irq, void *handle)
  511. {
  512. struct adp5589_kpad *kpad = handle;
  513. struct i2c_client *client = kpad->client;
  514. int status, ev_cnt;
  515. status = adp5589_read(client, ADP5589_5_INT_STATUS);
  516. if (status & OVRFLOW_INT) /* Unlikely and should never happen */
  517. dev_err(&client->dev, "Event Overflow Error\n");
  518. if (status & EVENT_INT) {
  519. ev_cnt = adp5589_read(client, ADP5589_5_STATUS) & KEC;
  520. if (ev_cnt) {
  521. adp5589_report_events(kpad, ev_cnt);
  522. input_sync(kpad->input);
  523. }
  524. }
  525. adp5589_write(client, ADP5589_5_INT_STATUS, status); /* Status is W1C */
  526. return IRQ_HANDLED;
  527. }
  528. static int adp5589_get_evcode(struct adp5589_kpad *kpad, unsigned short key)
  529. {
  530. int i;
  531. for (i = 0; i < kpad->var->keymapsize; i++)
  532. if (key == kpad->keycode[i])
  533. return (i + 1) | KEY_EV_PRESSED;
  534. dev_err(&kpad->client->dev, "RESET/UNLOCK key not in keycode map\n");
  535. return -EINVAL;
  536. }
  537. static int adp5589_setup(struct adp5589_kpad *kpad)
  538. {
  539. struct i2c_client *client = kpad->client;
  540. const struct adp5589_kpad_platform_data *pdata =
  541. dev_get_platdata(&client->dev);
  542. u8 (*reg) (u8) = kpad->var->reg;
  543. unsigned char evt_mode1 = 0, evt_mode2 = 0, evt_mode3 = 0;
  544. unsigned char pull_mask = 0;
  545. int i, ret;
  546. ret = adp5589_write(client, reg(ADP5589_PIN_CONFIG_A),
  547. pdata->keypad_en_mask & kpad->var->row_mask);
  548. ret |= adp5589_write(client, reg(ADP5589_PIN_CONFIG_B),
  549. (pdata->keypad_en_mask >> kpad->var->col_shift) &
  550. kpad->var->col_mask);
  551. if (!kpad->is_adp5585)
  552. ret |= adp5589_write(client, ADP5589_PIN_CONFIG_C,
  553. (pdata->keypad_en_mask >> 16) & 0xFF);
  554. if (!kpad->is_adp5585 && pdata->en_keylock) {
  555. ret |= adp5589_write(client, ADP5589_UNLOCK1,
  556. pdata->unlock_key1);
  557. ret |= adp5589_write(client, ADP5589_UNLOCK2,
  558. pdata->unlock_key2);
  559. ret |= adp5589_write(client, ADP5589_UNLOCK_TIMERS,
  560. pdata->unlock_timer & LTIME_MASK);
  561. ret |= adp5589_write(client, ADP5589_LOCK_CFG, LOCK_EN);
  562. }
  563. for (i = 0; i < KEYP_MAX_EVENT; i++)
  564. ret |= adp5589_read(client, ADP5589_5_FIFO_1 + i);
  565. for (i = 0; i < pdata->gpimapsize; i++) {
  566. unsigned short pin = pdata->gpimap[i].pin;
  567. if (pin <= kpad->var->gpi_pin_row_end) {
  568. evt_mode1 |= BIT(pin - kpad->var->gpi_pin_row_base);
  569. } else {
  570. evt_mode2 |=
  571. BIT(pin - kpad->var->gpi_pin_col_base) & 0xFF;
  572. if (!kpad->is_adp5585)
  573. evt_mode3 |=
  574. BIT(pin - kpad->var->gpi_pin_col_base) >> 8;
  575. }
  576. }
  577. if (pdata->gpimapsize) {
  578. ret |= adp5589_write(client, reg(ADP5589_GPI_EVENT_EN_A),
  579. evt_mode1);
  580. ret |= adp5589_write(client, reg(ADP5589_GPI_EVENT_EN_B),
  581. evt_mode2);
  582. if (!kpad->is_adp5585)
  583. ret |= adp5589_write(client,
  584. reg(ADP5589_GPI_EVENT_EN_C),
  585. evt_mode3);
  586. }
  587. if (pdata->pull_dis_mask & pdata->pullup_en_100k &
  588. pdata->pullup_en_300k & pdata->pulldown_en_300k)
  589. dev_warn(&client->dev, "Conflicting pull resistor config\n");
  590. for (i = 0; i <= kpad->var->max_row_num; i++) {
  591. unsigned int val = 0, bit = BIT(i);
  592. if (pdata->pullup_en_300k & bit)
  593. val = 0;
  594. else if (pdata->pulldown_en_300k & bit)
  595. val = 1;
  596. else if (pdata->pullup_en_100k & bit)
  597. val = 2;
  598. else if (pdata->pull_dis_mask & bit)
  599. val = 3;
  600. pull_mask |= val << (2 * (i & 0x3));
  601. if (i % 4 == 3 || i == kpad->var->max_row_num) {
  602. ret |= adp5589_write(client, reg(ADP5585_RPULL_CONFIG_A)
  603. + (i >> 2), pull_mask);
  604. pull_mask = 0;
  605. }
  606. }
  607. for (i = 0; i <= kpad->var->max_col_num; i++) {
  608. unsigned int val = 0, bit = BIT(i + kpad->var->col_shift);
  609. if (pdata->pullup_en_300k & bit)
  610. val = 0;
  611. else if (pdata->pulldown_en_300k & bit)
  612. val = 1;
  613. else if (pdata->pullup_en_100k & bit)
  614. val = 2;
  615. else if (pdata->pull_dis_mask & bit)
  616. val = 3;
  617. pull_mask |= val << (2 * (i & 0x3));
  618. if (i % 4 == 3 || i == kpad->var->max_col_num) {
  619. ret |= adp5589_write(client,
  620. reg(ADP5585_RPULL_CONFIG_C) +
  621. (i >> 2), pull_mask);
  622. pull_mask = 0;
  623. }
  624. }
  625. if (pdata->reset1_key_1 && pdata->reset1_key_2 && pdata->reset1_key_3) {
  626. ret |= adp5589_write(client, reg(ADP5589_RESET1_EVENT_A),
  627. adp5589_get_evcode(kpad,
  628. pdata->reset1_key_1));
  629. ret |= adp5589_write(client, reg(ADP5589_RESET1_EVENT_B),
  630. adp5589_get_evcode(kpad,
  631. pdata->reset1_key_2));
  632. ret |= adp5589_write(client, reg(ADP5589_RESET1_EVENT_C),
  633. adp5589_get_evcode(kpad,
  634. pdata->reset1_key_3));
  635. kpad->extend_cfg |= R4_EXTEND_CFG;
  636. }
  637. if (pdata->reset2_key_1 && pdata->reset2_key_2) {
  638. ret |= adp5589_write(client, reg(ADP5589_RESET2_EVENT_A),
  639. adp5589_get_evcode(kpad,
  640. pdata->reset2_key_1));
  641. ret |= adp5589_write(client, reg(ADP5589_RESET2_EVENT_B),
  642. adp5589_get_evcode(kpad,
  643. pdata->reset2_key_2));
  644. kpad->extend_cfg |= C4_EXTEND_CFG;
  645. }
  646. if (kpad->extend_cfg) {
  647. ret |= adp5589_write(client, reg(ADP5589_RESET_CFG),
  648. pdata->reset_cfg);
  649. ret |= adp5589_write(client, reg(ADP5589_PIN_CONFIG_D),
  650. kpad->extend_cfg);
  651. }
  652. ret |= adp5589_write(client, reg(ADP5589_DEBOUNCE_DIS_A),
  653. pdata->debounce_dis_mask & kpad->var->row_mask);
  654. ret |= adp5589_write(client, reg(ADP5589_DEBOUNCE_DIS_B),
  655. (pdata->debounce_dis_mask >> kpad->var->col_shift)
  656. & kpad->var->col_mask);
  657. if (!kpad->is_adp5585)
  658. ret |= adp5589_write(client, reg(ADP5589_DEBOUNCE_DIS_C),
  659. (pdata->debounce_dis_mask >> 16) & 0xFF);
  660. ret |= adp5589_write(client, reg(ADP5589_POLL_PTIME_CFG),
  661. pdata->scan_cycle_time & PTIME_MASK);
  662. ret |= adp5589_write(client, ADP5589_5_INT_STATUS,
  663. (kpad->is_adp5585 ? 0 : LOGIC2_INT) |
  664. LOGIC1_INT | OVRFLOW_INT |
  665. (kpad->is_adp5585 ? 0 : LOCK_INT) |
  666. GPI_INT | EVENT_INT); /* Status is W1C */
  667. ret |= adp5589_write(client, reg(ADP5589_GENERAL_CFG),
  668. INT_CFG | OSC_EN | CORE_CLK(3));
  669. ret |= adp5589_write(client, reg(ADP5589_INT_EN),
  670. OVRFLOW_IEN | GPI_IEN | EVENT_IEN);
  671. if (ret < 0) {
  672. dev_err(&client->dev, "Write Error\n");
  673. return ret;
  674. }
  675. return 0;
  676. }
  677. static void adp5589_report_switch_state(struct adp5589_kpad *kpad)
  678. {
  679. int gpi_stat_tmp, pin_loc;
  680. int i;
  681. int gpi_stat1 = adp5589_read(kpad->client,
  682. kpad->var->reg(ADP5589_GPI_STATUS_A));
  683. int gpi_stat2 = adp5589_read(kpad->client,
  684. kpad->var->reg(ADP5589_GPI_STATUS_B));
  685. int gpi_stat3 = !kpad->is_adp5585 ?
  686. adp5589_read(kpad->client, ADP5589_GPI_STATUS_C) : 0;
  687. for (i = 0; i < kpad->gpimapsize; i++) {
  688. unsigned short pin = kpad->gpimap[i].pin;
  689. if (pin <= kpad->var->gpi_pin_row_end) {
  690. gpi_stat_tmp = gpi_stat1;
  691. pin_loc = pin - kpad->var->gpi_pin_row_base;
  692. } else if ((pin - kpad->var->gpi_pin_col_base) < 8) {
  693. gpi_stat_tmp = gpi_stat2;
  694. pin_loc = pin - kpad->var->gpi_pin_col_base;
  695. } else {
  696. gpi_stat_tmp = gpi_stat3;
  697. pin_loc = pin - kpad->var->gpi_pin_col_base - 8;
  698. }
  699. if (gpi_stat_tmp < 0) {
  700. dev_err(&kpad->client->dev,
  701. "Can't read GPIO_DAT_STAT switch %d, default to OFF\n",
  702. pin);
  703. gpi_stat_tmp = 0;
  704. }
  705. input_report_switch(kpad->input,
  706. kpad->gpimap[i].sw_evt,
  707. !(gpi_stat_tmp & BIT(pin_loc)));
  708. }
  709. input_sync(kpad->input);
  710. }
  711. static int adp5589_keypad_add(struct adp5589_kpad *kpad, unsigned int revid)
  712. {
  713. struct i2c_client *client = kpad->client;
  714. const struct adp5589_kpad_platform_data *pdata =
  715. dev_get_platdata(&client->dev);
  716. struct input_dev *input;
  717. unsigned int i;
  718. int error;
  719. if (!((pdata->keypad_en_mask & kpad->var->row_mask) &&
  720. (pdata->keypad_en_mask >> kpad->var->col_shift)) ||
  721. !pdata->keymap) {
  722. dev_err(&client->dev, "no rows, cols or keymap from pdata\n");
  723. return -EINVAL;
  724. }
  725. if (pdata->keymapsize != kpad->var->keymapsize) {
  726. dev_err(&client->dev, "invalid keymapsize\n");
  727. return -EINVAL;
  728. }
  729. if (!pdata->gpimap && pdata->gpimapsize) {
  730. dev_err(&client->dev, "invalid gpimap from pdata\n");
  731. return -EINVAL;
  732. }
  733. if (pdata->gpimapsize > kpad->var->gpimapsize_max) {
  734. dev_err(&client->dev, "invalid gpimapsize\n");
  735. return -EINVAL;
  736. }
  737. for (i = 0; i < pdata->gpimapsize; i++) {
  738. unsigned short pin = pdata->gpimap[i].pin;
  739. if (pin < kpad->var->gpi_pin_base ||
  740. pin > kpad->var->gpi_pin_end) {
  741. dev_err(&client->dev, "invalid gpi pin data\n");
  742. return -EINVAL;
  743. }
  744. if (BIT(pin - kpad->var->gpi_pin_row_base) &
  745. pdata->keypad_en_mask) {
  746. dev_err(&client->dev, "invalid gpi row/col data\n");
  747. return -EINVAL;
  748. }
  749. }
  750. if (!client->irq) {
  751. dev_err(&client->dev, "no IRQ?\n");
  752. return -EINVAL;
  753. }
  754. input = devm_input_allocate_device(&client->dev);
  755. if (!input)
  756. return -ENOMEM;
  757. kpad->input = input;
  758. input->name = client->name;
  759. input->phys = "adp5589-keys/input0";
  760. input->dev.parent = &client->dev;
  761. input_set_drvdata(input, kpad);
  762. input->id.bustype = BUS_I2C;
  763. input->id.vendor = 0x0001;
  764. input->id.product = 0x0001;
  765. input->id.version = revid;
  766. input->keycodesize = sizeof(kpad->keycode[0]);
  767. input->keycodemax = pdata->keymapsize;
  768. input->keycode = kpad->keycode;
  769. memcpy(kpad->keycode, pdata->keymap,
  770. pdata->keymapsize * input->keycodesize);
  771. kpad->gpimap = pdata->gpimap;
  772. kpad->gpimapsize = pdata->gpimapsize;
  773. /* setup input device */
  774. __set_bit(EV_KEY, input->evbit);
  775. if (pdata->repeat)
  776. __set_bit(EV_REP, input->evbit);
  777. for (i = 0; i < input->keycodemax; i++)
  778. if (kpad->keycode[i] <= KEY_MAX)
  779. __set_bit(kpad->keycode[i], input->keybit);
  780. __clear_bit(KEY_RESERVED, input->keybit);
  781. if (kpad->gpimapsize)
  782. __set_bit(EV_SW, input->evbit);
  783. for (i = 0; i < kpad->gpimapsize; i++)
  784. __set_bit(kpad->gpimap[i].sw_evt, input->swbit);
  785. error = input_register_device(input);
  786. if (error) {
  787. dev_err(&client->dev, "unable to register input device\n");
  788. return error;
  789. }
  790. error = devm_request_threaded_irq(&client->dev, client->irq,
  791. NULL, adp5589_irq,
  792. IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
  793. client->dev.driver->name, kpad);
  794. if (error) {
  795. dev_err(&client->dev, "unable to request irq %d\n", client->irq);
  796. return error;
  797. }
  798. return 0;
  799. }
  800. static void adp5589_clear_config(void *data)
  801. {
  802. struct adp5589_kpad *kpad = data;
  803. adp5589_write(kpad->client, kpad->var->reg(ADP5589_GENERAL_CFG), 0);
  804. }
  805. static int adp5589_probe(struct i2c_client *client)
  806. {
  807. const struct i2c_device_id *id = i2c_client_get_device_id(client);
  808. struct adp5589_kpad *kpad;
  809. const struct adp5589_kpad_platform_data *pdata =
  810. dev_get_platdata(&client->dev);
  811. unsigned int revid;
  812. int error, ret;
  813. if (!i2c_check_functionality(client->adapter,
  814. I2C_FUNC_SMBUS_BYTE_DATA)) {
  815. dev_err(&client->dev, "SMBUS Byte Data not Supported\n");
  816. return -EIO;
  817. }
  818. if (!pdata) {
  819. dev_err(&client->dev, "no platform data?\n");
  820. return -EINVAL;
  821. }
  822. kpad = devm_kzalloc(&client->dev, sizeof(*kpad), GFP_KERNEL);
  823. if (!kpad)
  824. return -ENOMEM;
  825. kpad->client = client;
  826. switch (id->driver_data) {
  827. case ADP5585_02:
  828. kpad->support_row5 = true;
  829. fallthrough;
  830. case ADP5585_01:
  831. kpad->is_adp5585 = true;
  832. kpad->var = &const_adp5585;
  833. break;
  834. case ADP5589:
  835. kpad->support_row5 = true;
  836. kpad->var = &const_adp5589;
  837. break;
  838. }
  839. error = devm_add_action_or_reset(&client->dev, adp5589_clear_config,
  840. kpad);
  841. if (error)
  842. return error;
  843. ret = adp5589_read(client, ADP5589_5_ID);
  844. if (ret < 0)
  845. return ret;
  846. revid = (u8) ret & ADP5589_5_DEVICE_ID_MASK;
  847. if (pdata->keymapsize) {
  848. error = adp5589_keypad_add(kpad, revid);
  849. if (error)
  850. return error;
  851. }
  852. error = adp5589_setup(kpad);
  853. if (error)
  854. return error;
  855. if (kpad->gpimapsize)
  856. adp5589_report_switch_state(kpad);
  857. error = adp5589_gpio_add(kpad);
  858. if (error)
  859. return error;
  860. dev_info(&client->dev, "Rev.%d keypad, irq %d\n", revid, client->irq);
  861. return 0;
  862. }
  863. static int adp5589_suspend(struct device *dev)
  864. {
  865. struct i2c_client *client = to_i2c_client(dev);
  866. struct adp5589_kpad *kpad = i2c_get_clientdata(client);
  867. if (kpad->input)
  868. disable_irq(client->irq);
  869. return 0;
  870. }
  871. static int adp5589_resume(struct device *dev)
  872. {
  873. struct i2c_client *client = to_i2c_client(dev);
  874. struct adp5589_kpad *kpad = i2c_get_clientdata(client);
  875. if (kpad->input)
  876. enable_irq(client->irq);
  877. return 0;
  878. }
  879. static DEFINE_SIMPLE_DEV_PM_OPS(adp5589_dev_pm_ops, adp5589_suspend, adp5589_resume);
  880. static const struct i2c_device_id adp5589_id[] = {
  881. {"adp5589-keys", ADP5589},
  882. {"adp5585-keys", ADP5585_01},
  883. {"adp5585-02-keys", ADP5585_02}, /* Adds ROW5 to ADP5585 */
  884. {}
  885. };
  886. MODULE_DEVICE_TABLE(i2c, adp5589_id);
  887. static struct i2c_driver adp5589_driver = {
  888. .driver = {
  889. .name = KBUILD_MODNAME,
  890. .pm = pm_sleep_ptr(&adp5589_dev_pm_ops),
  891. },
  892. .probe = adp5589_probe,
  893. .id_table = adp5589_id,
  894. };
  895. module_i2c_driver(adp5589_driver);
  896. MODULE_LICENSE("GPL");
  897. MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
  898. MODULE_DESCRIPTION("ADP5589/ADP5585 Keypad driver");