Skip to content

Commit

Permalink
Input: mtk-pmic-keys - add support for MT6358
Browse files Browse the repository at this point in the history
MT6358 pmic keys behave differently than mt6397 and mt6323: there are
two interrupts per key: one for press, the other one for release (_r)

Signed-off-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
  • Loading branch information
makohoek authored and intel-lab-lkp committed May 12, 2021
1 parent 7dddabc commit 74aae27
Showing 1 changed file with 47 additions and 2 deletions.
49 changes: 47 additions & 2 deletions drivers/input/keyboard/mtk-pmic-keys.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include <linux/interrupt.h>
#include <linux/kernel.h>
#include <linux/mfd/mt6323/registers.h>
#include <linux/mfd/mt6358/registers.h>
#include <linux/mfd/mt6397/core.h>
#include <linux/mfd/mt6397/registers.h>
#include <linux/module.h>
Expand Down Expand Up @@ -74,11 +75,22 @@ static const struct mtk_pmic_regs mt6323_regs = {
.pmic_rst_reg = MT6323_TOP_RST_MISC,
};

static const struct mtk_pmic_regs mt6358_regs = {
.keys_regs[MTK_PMIC_PWRKEY_INDEX] =
MTK_PMIC_KEYS_REGS(MT6358_TOPSTATUS,
0x2, MT6358_PSC_TOP_INT_CON0, 0x5),
.keys_regs[MTK_PMIC_HOMEKEY_INDEX] =
MTK_PMIC_KEYS_REGS(MT6358_TOPSTATUS,
0x8, MT6358_PSC_TOP_INT_CON0, 0xa),
.pmic_rst_reg = MT6358_TOP_RST_MISC,
};

struct mtk_pmic_keys_info {
struct mtk_pmic_keys *keys;
const struct mtk_pmic_keys_regs *regs;
unsigned int keycode;
int irq;
int irq_r; /* optional: release irq if different */
bool wakeup:1;
};

Expand Down Expand Up @@ -188,6 +200,19 @@ static int mtk_pmic_key_setup(struct mtk_pmic_keys *keys,
return ret;
}

if (info->irq_r > 0) {
ret = devm_request_threaded_irq(
keys->dev, info->irq_r, NULL,
mtk_pmic_keys_irq_handler_thread,
IRQF_ONESHOT | IRQF_TRIGGER_HIGH, "mtk-pmic-keys",
info);
if (ret) {
dev_err(keys->dev, "Failed to request IRQ_r: %d: %d\n",
info->irq, ret);
return ret;
}
}

input_set_capability(keys->input_dev, EV_KEY, info->keycode);

return 0;
Expand All @@ -199,8 +224,11 @@ static int __maybe_unused mtk_pmic_keys_suspend(struct device *dev)
int index;

for (index = 0; index < MTK_PMIC_MAX_KEY_COUNT; index++) {
if (keys->keys[index].wakeup)
if (keys->keys[index].wakeup) {
enable_irq_wake(keys->keys[index].irq);
if (keys->keys[index].irq_r > 0)
enable_irq_wake(keys->keys[index].irq_r);
}
}

return 0;
Expand All @@ -212,8 +240,11 @@ static int __maybe_unused mtk_pmic_keys_resume(struct device *dev)
int index;

for (index = 0; index < MTK_PMIC_MAX_KEY_COUNT; index++) {
if (keys->keys[index].wakeup)
if (keys->keys[index].wakeup) {
disable_irq_wake(keys->keys[index].irq);
if (keys->keys[index].irq_r > 0)
disable_irq_wake(keys->keys[index].irq_r);
}
}

return 0;
Expand All @@ -229,6 +260,9 @@ static const struct of_device_id of_mtk_pmic_keys_match_tbl[] = {
}, {
.compatible = "mediatek,mt6323-keys",
.data = &mt6323_regs,
}, {
.compatible = "mediatek,mt6358-keys",
.data = &mt6358_regs,
}, {
/* sentinel */
}
Expand All @@ -242,6 +276,7 @@ static int mtk_pmic_keys_probe(struct platform_device *pdev)
struct mt6397_chip *pmic_chip = dev_get_drvdata(pdev->dev.parent);
struct device_node *node = pdev->dev.of_node, *child;
static const char *const irqnames[] = { "powerkey", "homekey" };
static const char *const irqnames_r[] = { "powerkey_r", "homekey_r" };
struct mtk_pmic_keys *keys;
const struct mtk_pmic_regs *mtk_pmic_regs;
struct input_dev *input_dev;
Expand Down Expand Up @@ -285,6 +320,16 @@ static int mtk_pmic_keys_probe(struct platform_device *pdev)
return keys->keys[index].irq;
}

if (of_device_is_compatible(node, "mediatek,mt6358-keys")) {
keys->keys[index].irq_r = platform_get_irq_byname(
pdev, irqnames_r[index]);

if (keys->keys[index].irq_r < 0) {
of_node_put(child);
return keys->keys[index].irq_r;
}
}

error = of_property_read_u32(child,
"linux,keycodes", &keys->keys[index].keycode);
if (error) {
Expand Down

0 comments on commit 74aae27

Please sign in to comment.