Skip to content

Commit

Permalink
Input: pmic8xxx-keypad - migrate to regmap APIs
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Stephen Boyd authored and Dmitry Torokhov committed Mar 30, 2014
1 parent c7f6ee2 commit a5dde0c
Showing 1 changed file with 29 additions and 52 deletions.
81 changes: 29 additions & 52 deletions drivers/input/keyboard/pmic8xxx-keypad.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@
#include <linux/bitops.h>
#include <linux/delay.h>
#include <linux/mutex.h>
#include <linux/regmap.h>

#include <linux/mfd/pm8xxx/core.h>
#include <linux/input/pmic8xxx-keypad.h>

#define PM8XXX_MAX_ROWS 18
Expand Down Expand Up @@ -86,6 +86,7 @@
* struct pmic8xxx_kp - internal keypad data structure
* @pdata - keypad platform data pointer
* @input - input device pointer for keypad
* @regmap - regmap handle
* @key_sense_irq - key press/release irq number
* @key_stuck_irq - key stuck notification irq number
* @keycodes - array to hold the key codes
Expand All @@ -97,6 +98,7 @@
struct pmic8xxx_kp {
const struct pm8xxx_keypad_platform_data *pdata;
struct input_dev *input;
struct regmap *regmap;
int key_sense_irq;
int key_stuck_irq;

Expand All @@ -109,33 +111,6 @@ struct pmic8xxx_kp {
u8 ctrl_reg;
};

static int pmic8xxx_kp_write_u8(struct pmic8xxx_kp *kp,
u8 data, u16 reg)
{
int rc;

rc = pm8xxx_writeb(kp->dev->parent, reg, data);
return rc;
}

static int pmic8xxx_kp_read(struct pmic8xxx_kp *kp,
u8 *data, u16 reg, unsigned num_bytes)
{
int rc;

rc = pm8xxx_read_buf(kp->dev->parent, reg, data, num_bytes);
return rc;
}

static int pmic8xxx_kp_read_u8(struct pmic8xxx_kp *kp,
u8 *data, u16 reg)
{
int rc;

rc = pmic8xxx_kp_read(kp, data, reg, 1);
return rc;
}

static u8 pmic8xxx_col_state(struct pmic8xxx_kp *kp, u8 col)
{
/* all keys pressed on that particular row? */
Expand All @@ -160,17 +135,17 @@ static u8 pmic8xxx_col_state(struct pmic8xxx_kp *kp, u8 col)
static int pmic8xxx_chk_sync_read(struct pmic8xxx_kp *kp)
{
int rc;
u8 scan_val;
unsigned int scan_val;

rc = pmic8xxx_kp_read_u8(kp, &scan_val, KEYP_SCAN);
rc = regmap_read(kp->regmap, KEYP_SCAN, &scan_val);
if (rc < 0) {
dev_err(kp->dev, "Error reading KEYP_SCAN reg, rc=%d\n", rc);
return rc;
}

scan_val |= 0x1;

rc = pmic8xxx_kp_write_u8(kp, scan_val, KEYP_SCAN);
rc = regmap_write(kp->regmap, KEYP_SCAN, scan_val);
if (rc < 0) {
dev_err(kp->dev, "Error writing KEYP_SCAN reg, rc=%d\n", rc);
return rc;
Expand All @@ -186,26 +161,24 @@ static int pmic8xxx_kp_read_data(struct pmic8xxx_kp *kp, u16 *state,
u16 data_reg, int read_rows)
{
int rc, row;
u8 new_data[PM8XXX_MAX_ROWS];
unsigned int val;

rc = pmic8xxx_kp_read(kp, new_data, data_reg, read_rows);
if (rc)
return rc;

for (row = 0; row < kp->pdata->num_rows; row++) {
dev_dbg(kp->dev, "new_data[%d] = %d\n", row,
new_data[row]);
state[row] = pmic8xxx_col_state(kp, new_data[row]);
for (row = 0; row < read_rows; row++) {
rc = regmap_read(kp->regmap, data_reg, &val);
if (rc)
return rc;
dev_dbg(kp->dev, "%d = %d\n", row, val);
state[row] = pmic8xxx_col_state(kp, val);
}

return rc;
return 0;
}

static int pmic8xxx_kp_read_matrix(struct pmic8xxx_kp *kp, u16 *new_state,
u16 *old_state)
{
int rc, read_rows;
u8 scan_val;
unsigned int scan_val;

if (kp->pdata->num_rows < PM8XXX_MIN_ROWS)
read_rows = PM8XXX_MIN_ROWS;
Expand Down Expand Up @@ -235,14 +208,14 @@ static int pmic8xxx_kp_read_matrix(struct pmic8xxx_kp *kp, u16 *new_state,
/* 4 * 32KHz clocks */
udelay((4 * DIV_ROUND_UP(USEC_PER_SEC, KEYP_CLOCK_FREQ)) + 1);

rc = pmic8xxx_kp_read_u8(kp, &scan_val, KEYP_SCAN);
rc = regmap_read(kp->regmap, KEYP_SCAN, &scan_val);
if (rc < 0) {
dev_err(kp->dev, "Error reading KEYP_SCAN reg, rc=%d\n", rc);
return rc;
}

scan_val &= 0xFE;
rc = pmic8xxx_kp_write_u8(kp, scan_val, KEYP_SCAN);
rc = regmap_write(kp->regmap, KEYP_SCAN, scan_val);
if (rc < 0)
dev_err(kp->dev, "Error writing KEYP_SCAN reg, rc=%d\n", rc);

Expand Down Expand Up @@ -378,10 +351,10 @@ static irqreturn_t pmic8xxx_kp_stuck_irq(int irq, void *data)
static irqreturn_t pmic8xxx_kp_irq(int irq, void *data)
{
struct pmic8xxx_kp *kp = data;
u8 ctrl_val, events;
unsigned int ctrl_val, events;
int rc;

rc = pmic8xxx_kp_read(kp, &ctrl_val, KEYP_CTRL, 1);
rc = regmap_read(kp->regmap, KEYP_CTRL, &ctrl_val);
if (rc < 0) {
dev_err(kp->dev, "failed to read keyp_ctrl register\n");
return IRQ_HANDLED;
Expand Down Expand Up @@ -420,7 +393,7 @@ static int pmic8xxx_kpd_init(struct pmic8xxx_kp *kp)

ctrl_val |= (bits << KEYP_CTRL_SCAN_ROWS_SHIFT);

rc = pmic8xxx_kp_write_u8(kp, ctrl_val, KEYP_CTRL);
rc = regmap_write(kp->regmap, KEYP_CTRL, ctrl_val);
if (rc < 0) {
dev_err(kp->dev, "Error writing KEYP_CTRL reg, rc=%d\n", rc);
return rc;
Expand All @@ -438,7 +411,7 @@ static int pmic8xxx_kpd_init(struct pmic8xxx_kp *kp)

scan_val |= (cycles << KEYP_SCAN_ROW_HOLD_SHIFT);

rc = pmic8xxx_kp_write_u8(kp, scan_val, KEYP_SCAN);
rc = regmap_write(kp->regmap, KEYP_SCAN, scan_val);
if (rc)
dev_err(kp->dev, "Error writing KEYP_SCAN reg, rc=%d\n", rc);

Expand All @@ -452,7 +425,7 @@ static int pmic8xxx_kp_enable(struct pmic8xxx_kp *kp)

kp->ctrl_reg |= KEYP_CTRL_KEYP_EN;

rc = pmic8xxx_kp_write_u8(kp, kp->ctrl_reg, KEYP_CTRL);
rc = regmap_write(kp->regmap, KEYP_CTRL, kp->ctrl_reg);
if (rc < 0)
dev_err(kp->dev, "Error writing KEYP_CTRL reg, rc=%d\n", rc);

Expand All @@ -465,7 +438,7 @@ static int pmic8xxx_kp_disable(struct pmic8xxx_kp *kp)

kp->ctrl_reg &= ~KEYP_CTRL_KEYP_EN;

rc = pmic8xxx_kp_write_u8(kp, kp->ctrl_reg, KEYP_CTRL);
rc = regmap_write(kp->regmap, KEYP_CTRL, kp->ctrl_reg);
if (rc < 0)
return rc;

Expand Down Expand Up @@ -503,7 +476,7 @@ static int pmic8xxx_kp_probe(struct platform_device *pdev)
const struct matrix_keymap_data *keymap_data;
struct pmic8xxx_kp *kp;
int rc;
u8 ctrl_val;
unsigned int ctrl_val;

if (!pdata || !pdata->num_cols || !pdata->num_rows ||
pdata->num_cols > PM8XXX_MAX_COLS ||
Expand Down Expand Up @@ -547,6 +520,10 @@ static int pmic8xxx_kp_probe(struct platform_device *pdev)
if (!kp)
return -ENOMEM;

kp->regmap = dev_get_regmap(pdev->dev.parent, NULL);
if (!kp->regmap)
return -ENODEV;

platform_set_drvdata(pdev, kp);

kp->pdata = pdata;
Expand Down Expand Up @@ -621,7 +598,7 @@ static int pmic8xxx_kp_probe(struct platform_device *pdev)
return rc;
}

rc = pmic8xxx_kp_read_u8(kp, &ctrl_val, KEYP_CTRL);
rc = regmap_read(kp->regmap, KEYP_CTRL, &ctrl_val);
if (rc < 0) {
dev_err(&pdev->dev, "failed to read KEYP_CTRL register\n");
return rc;
Expand Down

0 comments on commit a5dde0c

Please sign in to comment.