Skip to content

Commit

Permalink
Input: tegra-kbc - allow skipping setting up some of GPIO pins
Browse files Browse the repository at this point in the history
Allow marking some of GPIO pins as ignored to to avoid continuously
generating KBC input events.

Signed-off-by: Shridhar Rasal <srasal@nvidia.com>

Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
  • Loading branch information
Shridhar Rasal authored and Dmitry Torokhov committed Feb 3, 2012
1 parent 8491ee1 commit 023cea0
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 8 deletions.
8 changes: 7 additions & 1 deletion arch/arm/mach-tegra/include/mach/kbc.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,14 @@
#define KBC_MAX_COL 8
#define KBC_MAX_KEY (KBC_MAX_ROW * KBC_MAX_COL)

enum tegra_pin_type {
PIN_CFG_IGNORE,
PIN_CFG_COL,
PIN_CFG_ROW,
};

struct tegra_kbc_pin_cfg {
bool is_row;
enum tegra_pin_type type;
unsigned char num;
};

Expand Down
34 changes: 27 additions & 7 deletions drivers/input/keyboard/tegra-kbc.c
Original file line number Diff line number Diff line change
Expand Up @@ -468,10 +468,18 @@ static void tegra_kbc_config_pins(struct tegra_kbc *kbc)
row_cfg &= ~r_mask;
col_cfg &= ~c_mask;

if (pdata->pin_cfg[i].is_row)
switch (pdata->pin_cfg[i].type) {
case PIN_CFG_ROW:
row_cfg |= ((pdata->pin_cfg[i].num << 1) | 1) << r_shft;
else
break;

case PIN_CFG_COL:
col_cfg |= ((pdata->pin_cfg[i].num << 1) | 1) << c_shft;
break;

case PIN_CFG_IGNORE:
break;
}

writel(row_cfg, kbc->mmio + r_offs);
writel(col_cfg, kbc->mmio + c_offs);
Expand Down Expand Up @@ -576,21 +584,34 @@ tegra_kbc_check_pin_cfg(const struct tegra_kbc_platform_data *pdata,
for (i = 0; i < KBC_MAX_GPIO; i++) {
const struct tegra_kbc_pin_cfg *pin_cfg = &pdata->pin_cfg[i];

if (pin_cfg->is_row) {
switch (pin_cfg->type) {
case PIN_CFG_ROW:
if (pin_cfg->num >= KBC_MAX_ROW) {
dev_err(dev,
"pin_cfg[%d]: invalid row number %d\n",
i, pin_cfg->num);
return false;
}
(*num_rows)++;
} else {
break;

case PIN_CFG_COL:
if (pin_cfg->num >= KBC_MAX_COL) {
dev_err(dev,
"pin_cfg[%d]: invalid column number %d\n",
i, pin_cfg->num);
return false;
}
break;

case PIN_CFG_IGNORE:
break;

default:
dev_err(dev,
"pin_cfg[%d]: invalid entry type %d\n",
pin_cfg->type, pin_cfg->num);
return false;
}
}

Expand All @@ -607,7 +628,6 @@ tegra_kbc_dt_parse_pdata(struct platform_device *pdev)
if (!np)
return NULL;

pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
if (!pdata)
return NULL;

Expand All @@ -629,12 +649,12 @@ tegra_kbc_dt_parse_pdata(struct platform_device *pdev)
*/
for (i = 0; i < KBC_MAX_ROW; i++) {
pdata->pin_cfg[i].num = i;
pdata->pin_cfg[i].is_row = true;
pdata->pin_cfg[i].type = PIN_CFG_ROW;
}

for (i = 0; i < KBC_MAX_COL; i++) {
pdata->pin_cfg[KBC_MAX_ROW + i].num = i;
pdata->pin_cfg[KBC_MAX_ROW + i].is_row = false;
pdata->pin_cfg[KBC_MAX_ROW + i].type = PIN_CFG_COL;
}

return pdata;
Expand Down

0 comments on commit 023cea0

Please sign in to comment.