Commit 023cea0e authored by Shridhar Rasal's avatar Shridhar Rasal Committed by Dmitry Torokhov

Input: tegra-kbc - allow skipping setting up some of GPIO pins

Allow marking some of GPIO pins as ignored to to avoid continuously
generating KBC input events.
Signed-off-by: default avatarShridhar Rasal <srasal@nvidia.com>
Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent 8491ee10
...@@ -31,8 +31,14 @@ ...@@ -31,8 +31,14 @@
#define KBC_MAX_COL 8 #define KBC_MAX_COL 8
#define KBC_MAX_KEY (KBC_MAX_ROW * KBC_MAX_COL) #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 { struct tegra_kbc_pin_cfg {
bool is_row; enum tegra_pin_type type;
unsigned char num; unsigned char num;
}; };
......
...@@ -468,10 +468,18 @@ static void tegra_kbc_config_pins(struct tegra_kbc *kbc) ...@@ -468,10 +468,18 @@ static void tegra_kbc_config_pins(struct tegra_kbc *kbc)
row_cfg &= ~r_mask; row_cfg &= ~r_mask;
col_cfg &= ~c_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; 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; 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(row_cfg, kbc->mmio + r_offs);
writel(col_cfg, kbc->mmio + c_offs); writel(col_cfg, kbc->mmio + c_offs);
...@@ -576,7 +584,8 @@ tegra_kbc_check_pin_cfg(const struct tegra_kbc_platform_data *pdata, ...@@ -576,7 +584,8 @@ tegra_kbc_check_pin_cfg(const struct tegra_kbc_platform_data *pdata,
for (i = 0; i < KBC_MAX_GPIO; i++) { for (i = 0; i < KBC_MAX_GPIO; i++) {
const struct tegra_kbc_pin_cfg *pin_cfg = &pdata->pin_cfg[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) { if (pin_cfg->num >= KBC_MAX_ROW) {
dev_err(dev, dev_err(dev,
"pin_cfg[%d]: invalid row number %d\n", "pin_cfg[%d]: invalid row number %d\n",
...@@ -584,13 +593,25 @@ tegra_kbc_check_pin_cfg(const struct tegra_kbc_platform_data *pdata, ...@@ -584,13 +593,25 @@ tegra_kbc_check_pin_cfg(const struct tegra_kbc_platform_data *pdata,
return false; return false;
} }
(*num_rows)++; (*num_rows)++;
} else { break;
case PIN_CFG_COL:
if (pin_cfg->num >= KBC_MAX_COL) { if (pin_cfg->num >= KBC_MAX_COL) {
dev_err(dev, dev_err(dev,
"pin_cfg[%d]: invalid column number %d\n", "pin_cfg[%d]: invalid column number %d\n",
i, pin_cfg->num); i, pin_cfg->num);
return false; 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;
} }
} }
...@@ -607,7 +628,6 @@ tegra_kbc_dt_parse_pdata(struct platform_device *pdev) ...@@ -607,7 +628,6 @@ tegra_kbc_dt_parse_pdata(struct platform_device *pdev)
if (!np) if (!np)
return NULL; return NULL;
pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
if (!pdata) if (!pdata)
return NULL; return NULL;
...@@ -629,12 +649,12 @@ tegra_kbc_dt_parse_pdata(struct platform_device *pdev) ...@@ -629,12 +649,12 @@ tegra_kbc_dt_parse_pdata(struct platform_device *pdev)
*/ */
for (i = 0; i < KBC_MAX_ROW; i++) { for (i = 0; i < KBC_MAX_ROW; i++) {
pdata->pin_cfg[i].num = 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++) { for (i = 0; i < KBC_MAX_COL; i++) {
pdata->pin_cfg[KBC_MAX_ROW + i].num = 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; return pdata;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment