aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Boyd <sboyd@codeaurora.org>2014-03-29 15:34:14 -0400
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2014-03-30 16:25:18 -0400
commita5dde0c72ccbb0f66b3491ee83f4c579aea0651d (patch)
tree4af3666fae0e5c146560fdd1d7e8cd226bd5a0e8
parentc7f6ee264b511d8a35063e9821cf36ad18e4e4fd (diff)
Input: pmic8xxx-keypad - migrate to regmap APIs
Use the regmap APIs for this driver instead of custom pm8xxx APIs. This breaks this driver's dependency on the pm8xxx APIs and allows us to easily port it to other bus protocols in the future. Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
-rw-r--r--drivers/input/keyboard/pmic8xxx-keypad.c81
1 files changed, 29 insertions, 52 deletions
diff --git a/drivers/input/keyboard/pmic8xxx-keypad.c b/drivers/input/keyboard/pmic8xxx-keypad.c
index bec53ebde7b2..0efd11e16b7e 100644
--- a/drivers/input/keyboard/pmic8xxx-keypad.c
+++ b/drivers/input/keyboard/pmic8xxx-keypad.c
@@ -19,8 +19,8 @@
19#include <linux/bitops.h> 19#include <linux/bitops.h>
20#include <linux/delay.h> 20#include <linux/delay.h>
21#include <linux/mutex.h> 21#include <linux/mutex.h>
22#include <linux/regmap.h>
22 23
23#include <linux/mfd/pm8xxx/core.h>
24#include <linux/input/pmic8xxx-keypad.h> 24#include <linux/input/pmic8xxx-keypad.h>
25 25
26#define PM8XXX_MAX_ROWS 18 26#define PM8XXX_MAX_ROWS 18
@@ -86,6 +86,7 @@
86 * struct pmic8xxx_kp - internal keypad data structure 86 * struct pmic8xxx_kp - internal keypad data structure
87 * @pdata - keypad platform data pointer 87 * @pdata - keypad platform data pointer
88 * @input - input device pointer for keypad 88 * @input - input device pointer for keypad
89 * @regmap - regmap handle
89 * @key_sense_irq - key press/release irq number 90 * @key_sense_irq - key press/release irq number
90 * @key_stuck_irq - key stuck notification irq number 91 * @key_stuck_irq - key stuck notification irq number
91 * @keycodes - array to hold the key codes 92 * @keycodes - array to hold the key codes
@@ -97,6 +98,7 @@
97struct pmic8xxx_kp { 98struct pmic8xxx_kp {
98 const struct pm8xxx_keypad_platform_data *pdata; 99 const struct pm8xxx_keypad_platform_data *pdata;
99 struct input_dev *input; 100 struct input_dev *input;
101 struct regmap *regmap;
100 int key_sense_irq; 102 int key_sense_irq;
101 int key_stuck_irq; 103 int key_stuck_irq;
102 104
@@ -109,33 +111,6 @@ struct pmic8xxx_kp {
109 u8 ctrl_reg; 111 u8 ctrl_reg;
110}; 112};
111 113
112static int pmic8xxx_kp_write_u8(struct pmic8xxx_kp *kp,
113 u8 data, u16 reg)
114{
115 int rc;
116
117 rc = pm8xxx_writeb(kp->dev->parent, reg, data);
118 return rc;
119}
120
121static int pmic8xxx_kp_read(struct pmic8xxx_kp *kp,
122 u8 *data, u16 reg, unsigned num_bytes)
123{
124 int rc;
125
126 rc = pm8xxx_read_buf(kp->dev->parent, reg, data, num_bytes);
127 return rc;
128}
129
130static int pmic8xxx_kp_read_u8(struct pmic8xxx_kp *kp,
131 u8 *data, u16 reg)
132{
133 int rc;
134
135 rc = pmic8xxx_kp_read(kp, data, reg, 1);
136 return rc;
137}
138
139static u8 pmic8xxx_col_state(struct pmic8xxx_kp *kp, u8 col) 114static u8 pmic8xxx_col_state(struct pmic8xxx_kp *kp, u8 col)
140{ 115{
141 /* all keys pressed on that particular row? */ 116 /* all keys pressed on that particular row? */
@@ -160,9 +135,9 @@ static u8 pmic8xxx_col_state(struct pmic8xxx_kp *kp, u8 col)
160static int pmic8xxx_chk_sync_read(struct pmic8xxx_kp *kp) 135static int pmic8xxx_chk_sync_read(struct pmic8xxx_kp *kp)
161{ 136{
162 int rc; 137 int rc;
163 u8 scan_val; 138 unsigned int scan_val;
164 139
165 rc = pmic8xxx_kp_read_u8(kp, &scan_val, KEYP_SCAN); 140 rc = regmap_read(kp->regmap, KEYP_SCAN, &scan_val);
166 if (rc < 0) { 141 if (rc < 0) {
167 dev_err(kp->dev, "Error reading KEYP_SCAN reg, rc=%d\n", rc); 142 dev_err(kp->dev, "Error reading KEYP_SCAN reg, rc=%d\n", rc);
168 return rc; 143 return rc;
@@ -170,7 +145,7 @@ static int pmic8xxx_chk_sync_read(struct pmic8xxx_kp *kp)
170 145
171 scan_val |= 0x1; 146 scan_val |= 0x1;
172 147
173 rc = pmic8xxx_kp_write_u8(kp, scan_val, KEYP_SCAN); 148 rc = regmap_write(kp->regmap, KEYP_SCAN, scan_val);
174 if (rc < 0) { 149 if (rc < 0) {
175 dev_err(kp->dev, "Error writing KEYP_SCAN reg, rc=%d\n", rc); 150 dev_err(kp->dev, "Error writing KEYP_SCAN reg, rc=%d\n", rc);
176 return rc; 151 return rc;
@@ -186,26 +161,24 @@ static int pmic8xxx_kp_read_data(struct pmic8xxx_kp *kp, u16 *state,
186 u16 data_reg, int read_rows) 161 u16 data_reg, int read_rows)
187{ 162{
188 int rc, row; 163 int rc, row;
189 u8 new_data[PM8XXX_MAX_ROWS]; 164 unsigned int val;
190 165
191 rc = pmic8xxx_kp_read(kp, new_data, data_reg, read_rows); 166 for (row = 0; row < read_rows; row++) {
192 if (rc) 167 rc = regmap_read(kp->regmap, data_reg, &val);
193 return rc; 168 if (rc)
194 169 return rc;
195 for (row = 0; row < kp->pdata->num_rows; row++) { 170 dev_dbg(kp->dev, "%d = %d\n", row, val);
196 dev_dbg(kp->dev, "new_data[%d] = %d\n", row, 171 state[row] = pmic8xxx_col_state(kp, val);
197 new_data[row]);
198 state[row] = pmic8xxx_col_state(kp, new_data[row]);
199 } 172 }
200 173
201 return rc; 174 return 0;
202} 175}
203 176
204static int pmic8xxx_kp_read_matrix(struct pmic8xxx_kp *kp, u16 *new_state, 177static int pmic8xxx_kp_read_matrix(struct pmic8xxx_kp *kp, u16 *new_state,
205 u16 *old_state) 178 u16 *old_state)
206{ 179{
207 int rc, read_rows; 180 int rc, read_rows;
208 u8 scan_val; 181 unsigned int scan_val;
209 182
210 if (kp->pdata->num_rows < PM8XXX_MIN_ROWS) 183 if (kp->pdata->num_rows < PM8XXX_MIN_ROWS)
211 read_rows = PM8XXX_MIN_ROWS; 184 read_rows = PM8XXX_MIN_ROWS;
@@ -235,14 +208,14 @@ static int pmic8xxx_kp_read_matrix(struct pmic8xxx_kp *kp, u16 *new_state,
235 /* 4 * 32KHz clocks */ 208 /* 4 * 32KHz clocks */
236 udelay((4 * DIV_ROUND_UP(USEC_PER_SEC, KEYP_CLOCK_FREQ)) + 1); 209 udelay((4 * DIV_ROUND_UP(USEC_PER_SEC, KEYP_CLOCK_FREQ)) + 1);
237 210
238 rc = pmic8xxx_kp_read_u8(kp, &scan_val, KEYP_SCAN); 211 rc = regmap_read(kp->regmap, KEYP_SCAN, &scan_val);
239 if (rc < 0) { 212 if (rc < 0) {
240 dev_err(kp->dev, "Error reading KEYP_SCAN reg, rc=%d\n", rc); 213 dev_err(kp->dev, "Error reading KEYP_SCAN reg, rc=%d\n", rc);
241 return rc; 214 return rc;
242 } 215 }
243 216
244 scan_val &= 0xFE; 217 scan_val &= 0xFE;
245 rc = pmic8xxx_kp_write_u8(kp, scan_val, KEYP_SCAN); 218 rc = regmap_write(kp->regmap, KEYP_SCAN, scan_val);
246 if (rc < 0) 219 if (rc < 0)
247 dev_err(kp->dev, "Error writing KEYP_SCAN reg, rc=%d\n", rc); 220 dev_err(kp->dev, "Error writing KEYP_SCAN reg, rc=%d\n", rc);
248 221
@@ -378,10 +351,10 @@ static irqreturn_t pmic8xxx_kp_stuck_irq(int irq, void *data)
378static irqreturn_t pmic8xxx_kp_irq(int irq, void *data) 351static irqreturn_t pmic8xxx_kp_irq(int irq, void *data)
379{ 352{
380 struct pmic8xxx_kp *kp = data; 353 struct pmic8xxx_kp *kp = data;
381 u8 ctrl_val, events; 354 unsigned int ctrl_val, events;
382 int rc; 355 int rc;
383 356
384 rc = pmic8xxx_kp_read(kp, &ctrl_val, KEYP_CTRL, 1); 357 rc = regmap_read(kp->regmap, KEYP_CTRL, &ctrl_val);
385 if (rc < 0) { 358 if (rc < 0) {
386 dev_err(kp->dev, "failed to read keyp_ctrl register\n"); 359 dev_err(kp->dev, "failed to read keyp_ctrl register\n");
387 return IRQ_HANDLED; 360 return IRQ_HANDLED;
@@ -420,7 +393,7 @@ static int pmic8xxx_kpd_init(struct pmic8xxx_kp *kp)
420 393
421 ctrl_val |= (bits << KEYP_CTRL_SCAN_ROWS_SHIFT); 394 ctrl_val |= (bits << KEYP_CTRL_SCAN_ROWS_SHIFT);
422 395
423 rc = pmic8xxx_kp_write_u8(kp, ctrl_val, KEYP_CTRL); 396 rc = regmap_write(kp->regmap, KEYP_CTRL, ctrl_val);
424 if (rc < 0) { 397 if (rc < 0) {
425 dev_err(kp->dev, "Error writing KEYP_CTRL reg, rc=%d\n", rc); 398 dev_err(kp->dev, "Error writing KEYP_CTRL reg, rc=%d\n", rc);
426 return rc; 399 return rc;
@@ -438,7 +411,7 @@ static int pmic8xxx_kpd_init(struct pmic8xxx_kp *kp)
438 411
439 scan_val |= (cycles << KEYP_SCAN_ROW_HOLD_SHIFT); 412 scan_val |= (cycles << KEYP_SCAN_ROW_HOLD_SHIFT);
440 413
441 rc = pmic8xxx_kp_write_u8(kp, scan_val, KEYP_SCAN); 414 rc = regmap_write(kp->regmap, KEYP_SCAN, scan_val);
442 if (rc) 415 if (rc)
443 dev_err(kp->dev, "Error writing KEYP_SCAN reg, rc=%d\n", rc); 416 dev_err(kp->dev, "Error writing KEYP_SCAN reg, rc=%d\n", rc);
444 417
@@ -452,7 +425,7 @@ static int pmic8xxx_kp_enable(struct pmic8xxx_kp *kp)
452 425
453 kp->ctrl_reg |= KEYP_CTRL_KEYP_EN; 426 kp->ctrl_reg |= KEYP_CTRL_KEYP_EN;
454 427
455 rc = pmic8xxx_kp_write_u8(kp, kp->ctrl_reg, KEYP_CTRL); 428 rc = regmap_write(kp->regmap, KEYP_CTRL, kp->ctrl_reg);
456 if (rc < 0) 429 if (rc < 0)
457 dev_err(kp->dev, "Error writing KEYP_CTRL reg, rc=%d\n", rc); 430 dev_err(kp->dev, "Error writing KEYP_CTRL reg, rc=%d\n", rc);
458 431
@@ -465,7 +438,7 @@ static int pmic8xxx_kp_disable(struct pmic8xxx_kp *kp)
465 438
466 kp->ctrl_reg &= ~KEYP_CTRL_KEYP_EN; 439 kp->ctrl_reg &= ~KEYP_CTRL_KEYP_EN;
467 440
468 rc = pmic8xxx_kp_write_u8(kp, kp->ctrl_reg, KEYP_CTRL); 441 rc = regmap_write(kp->regmap, KEYP_CTRL, kp->ctrl_reg);
469 if (rc < 0) 442 if (rc < 0)
470 return rc; 443 return rc;
471 444
@@ -503,7 +476,7 @@ static int pmic8xxx_kp_probe(struct platform_device *pdev)
503 const struct matrix_keymap_data *keymap_data; 476 const struct matrix_keymap_data *keymap_data;
504 struct pmic8xxx_kp *kp; 477 struct pmic8xxx_kp *kp;
505 int rc; 478 int rc;
506 u8 ctrl_val; 479 unsigned int ctrl_val;
507 480
508 if (!pdata || !pdata->num_cols || !pdata->num_rows || 481 if (!pdata || !pdata->num_cols || !pdata->num_rows ||
509 pdata->num_cols > PM8XXX_MAX_COLS || 482 pdata->num_cols > PM8XXX_MAX_COLS ||
@@ -547,6 +520,10 @@ static int pmic8xxx_kp_probe(struct platform_device *pdev)
547 if (!kp) 520 if (!kp)
548 return -ENOMEM; 521 return -ENOMEM;
549 522
523 kp->regmap = dev_get_regmap(pdev->dev.parent, NULL);
524 if (!kp->regmap)
525 return -ENODEV;
526
550 platform_set_drvdata(pdev, kp); 527 platform_set_drvdata(pdev, kp);
551 528
552 kp->pdata = pdata; 529 kp->pdata = pdata;
@@ -621,7 +598,7 @@ static int pmic8xxx_kp_probe(struct platform_device *pdev)
621 return rc; 598 return rc;
622 } 599 }
623 600
624 rc = pmic8xxx_kp_read_u8(kp, &ctrl_val, KEYP_CTRL); 601 rc = regmap_read(kp->regmap, KEYP_CTRL, &ctrl_val);
625 if (rc < 0) { 602 if (rc < 0) {
626 dev_err(&pdev->dev, "failed to read KEYP_CTRL register\n"); 603 dev_err(&pdev->dev, "failed to read KEYP_CTRL register\n");
627 return rc; 604 return rc;