[{"id":1792912,"web_url":"http://patchwork.ozlabs.org/comment/1792912/","msgid":"<1508808435.4057.1.camel@mhfsdcap03>","list_archive_url":null,"date":"2017-10-24T01:27:15","subject":"Re: [PATCH v5 5/6] input: Add MediaTek PMIC keys support","submitter":{"id":72090,"url":"http://patchwork.ozlabs.org/api/people/72090/","name":"Chen Zhong","email":"chen.zhong@mediatek.com"},"content":"Just gentle ping.\n\nOn Wed, 2017-09-27 at 18:44 +0800, Chen Zhong wrote:\n> This patch add support to handle MediaTek PMIC MT6397/MT6323 key\n> interrupts including pwrkey and homekey, also add setting for\n> long press key shutdown behavior.\n> \n> Signed-off-by: Chen Zhong <chen.zhong@mediatek.com>\n> ---\n>  drivers/input/keyboard/Kconfig         |    9 +\n>  drivers/input/keyboard/Makefile        |    1 +\n>  drivers/input/keyboard/mtk-pmic-keys.c |  341 ++++++++++++++++++++++++++++++++\n>  3 files changed, 351 insertions(+)\n>  create mode 100644 drivers/input/keyboard/mtk-pmic-keys.c\n> \n> diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig\n> index 4c4ab1c..bd4e20a 100644\n> --- a/drivers/input/keyboard/Kconfig\n> +++ b/drivers/input/keyboard/Kconfig\n> @@ -756,4 +756,13 @@ config KEYBOARD_BCM\n>  \t  To compile this driver as a module, choose M here: the\n>  \t  module will be called bcm-keypad.\n>  \n> +config KEYBOARD_MTK_PMIC\n> +\ttristate \"MediaTek PMIC keys support\"\n> +\tdepends on MFD_MT6397\n> +\thelp\n> +\t  Say Y here if you want to use the pmic keys (powerkey/homekey).\n> +\n> +\t  To compile this driver as a module, choose M here: the\n> +\t  module will be called pmic-keys.\n> +\n>  endif\n> diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile\n> index d2338ba..20c0b98 100644\n> --- a/drivers/input/keyboard/Makefile\n> +++ b/drivers/input/keyboard/Makefile\n> @@ -40,6 +40,7 @@ obj-$(CONFIG_KEYBOARD_MATRIX)\t\t+= matrix_keypad.o\n>  obj-$(CONFIG_KEYBOARD_MAX7359)\t\t+= max7359_keypad.o\n>  obj-$(CONFIG_KEYBOARD_MCS)\t\t+= mcs_touchkey.o\n>  obj-$(CONFIG_KEYBOARD_MPR121)\t\t+= mpr121_touchkey.o\n> +obj-$(CONFIG_KEYBOARD_MTK_PMIC) \t+= mtk-pmic-keys.o\n>  obj-$(CONFIG_KEYBOARD_NEWTON)\t\t+= newtonkbd.o\n>  obj-$(CONFIG_KEYBOARD_NOMADIK)\t\t+= nomadik-ske-keypad.o\n>  obj-$(CONFIG_KEYBOARD_NSPIRE)\t\t+= nspire-keypad.o\n> diff --git a/drivers/input/keyboard/mtk-pmic-keys.c b/drivers/input/keyboard/mtk-pmic-keys.c\n> new file mode 100644\n> index 0000000..529fd95\n> --- /dev/null\n> +++ b/drivers/input/keyboard/mtk-pmic-keys.c\n> @@ -0,0 +1,341 @@\n> +/*\n> + * Copyright (C) 2017 MediaTek, Inc.\n> + *\n> + * Author: Chen Zhong <chen.zhong@mediatek.com>\n> + *\n> + * This software is licensed under the terms of the GNU General Public\n> + * License version 2, as published by the Free Software Foundation, and\n> + * may be copied, distributed, and modified under those terms.\n> + *\n> + * This program is distributed in the hope that it will be useful,\n> + * but WITHOUT ANY WARRANTY; without even the implied warranty of\n> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n> + * GNU General Public License for more details.\n> + *\n> + */\n> +\n> +#include <linux/module.h>\n> +#include <linux/kernel.h>\n> +#include <linux/input.h>\n> +#include <linux/interrupt.h>\n> +#include <linux/platform_device.h>\n> +#include <linux/kernel.h>\n> +#include <linux/of.h>\n> +#include <linux/of_device.h>\n> +#include <linux/regmap.h>\n> +#include <linux/mfd/mt6323/registers.h>\n> +#include <linux/mfd/mt6397/registers.h>\n> +#include <linux/mfd/mt6397/core.h>\n> +\n> +#define MTK_PMIC_PWRKEY_RST_EN_MASK\t0x1\n> +#define MTK_PMIC_PWRKEY_RST_EN_SHIFT\t6\n> +#define MTK_PMIC_HOMEKEY_RST_EN_MASK\t0x1\n> +#define MTK_PMIC_HOMEKEY_RST_EN_SHIFT\t5\n> +#define MTK_PMIC_RST_DU_MASK\t\t0x3\n> +#define MTK_PMIC_RST_DU_SHIFT\t\t8\n> +\n> +#define MTK_PMIC_PWRKEY_RST\t\t\\\n> +\t(MTK_PMIC_PWRKEY_RST_EN_MASK << MTK_PMIC_PWRKEY_RST_EN_SHIFT)\n> +#define MTK_PMIC_HOMEKEY_RST\t\t\\\n> +\t(MTK_PMIC_HOMEKEY_RST_EN_MASK << MTK_PMIC_HOMEKEY_RST_EN_SHIFT)\n> +\n> +#define MTK_PMIC_PWRKEY_INDEX\t0\n> +#define MTK_PMIC_HOMEKEY_INDEX\t1\n> +#define MTK_PMIC_MAX_KEY_COUNT\t2\n> +\n> +struct mtk_pmic_keys_regs {\n> +\tu32 deb_reg;\n> +\tu32 deb_mask;\n> +\tu32 intsel_reg;\n> +\tu32 intsel_mask;\n> +};\n> +\n> +#define MTK_PMIC_KEYS_REGS(_deb_reg, _deb_mask,\t\t\\\n> +\t_intsel_reg, _intsel_mask)\t\t\t\\\n> +{\t\t\t\t\t\t\t\\\n> +\t.deb_reg\t\t= _deb_reg,\t\t\\\n> +\t.deb_mask\t\t= _deb_mask,\t\t\\\n> +\t.intsel_reg\t\t= _intsel_reg,\t\t\\\n> +\t.intsel_mask\t\t= _intsel_mask,\t\t\\\n> +}\n> +\n> +struct mtk_pmic_regs {\n> +\tconst struct mtk_pmic_keys_regs keys_regs[MTK_PMIC_MAX_KEY_COUNT];\n> +\tu32 pmic_rst_reg;\n> +};\n> +\n> +static const struct mtk_pmic_regs mt6397_regs = {\n> +\t.keys_regs[MTK_PMIC_PWRKEY_INDEX] =\n> +\t\tMTK_PMIC_KEYS_REGS(MT6397_CHRSTATUS,\n> +\t\t0x8, MT6397_INT_RSV, 0x10),\n> +\t.keys_regs[MTK_PMIC_HOMEKEY_INDEX] =\n> +\t\tMTK_PMIC_KEYS_REGS(MT6397_OCSTATUS2,\n> +\t\t0x10, MT6397_INT_RSV, 0x8),\n> +\t.pmic_rst_reg = MT6397_TOP_RST_MISC,\n> +};\n> +\n> +static const struct mtk_pmic_regs mt6323_regs = {\n> +\t.keys_regs[MTK_PMIC_PWRKEY_INDEX] =\n> +\t\tMTK_PMIC_KEYS_REGS(MT6323_CHRSTATUS,\n> +\t\t0x2, MT6323_INT_MISC_CON, 0x10),\n> +\t.keys_regs[MTK_PMIC_HOMEKEY_INDEX] =\n> +\t\tMTK_PMIC_KEYS_REGS(MT6323_CHRSTATUS,\n> +\t\t0x4, MT6323_INT_MISC_CON, 0x8),\n> +\t.pmic_rst_reg = MT6323_TOP_RST_MISC,\n> +};\n> +\n> +struct mtk_pmic_keys_info {\n> +\tstruct mtk_pmic_keys *keys;\n> +\tconst struct mtk_pmic_keys_regs *regs;\n> +\tunsigned int keycode;\n> +\tint irq;\n> +\tbool wakeup:1;\n> +};\n> +\n> +struct mtk_pmic_keys {\n> +\tstruct input_dev *input_dev;\n> +\tstruct device *dev;\n> +\tstruct regmap *regmap;\n> +\tstruct mtk_pmic_keys_info keys[MTK_PMIC_MAX_KEY_COUNT];\n> +};\n> +\n> +enum mtk_pmic_keys_lp_mode {\n> +\tLP_DISABLE,\n> +\tLP_ONEKEY,\n> +\tLP_TWOKEY,\n> +};\n> +\n> +static void mtk_pmic_keys_lp_reset_setup(struct mtk_pmic_keys *keys,\n> +\t\tu32 pmic_rst_reg)\n> +{\n> +\tint ret;\n> +\tu32 long_press_mode, long_press_debounce;\n> +\n> +\tret = of_property_read_u32(keys->dev->of_node,\n> +\t\t\"power-off-time-sec\", &long_press_debounce);\n> +\tif (ret)\n> +\t\tlong_press_debounce = 0;\n> +\n> +\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> +\t\t\t   MTK_PMIC_RST_DU_MASK << MTK_PMIC_RST_DU_SHIFT,\n> +\t\t\t   long_press_debounce << MTK_PMIC_RST_DU_SHIFT);\n> +\n> +\tret = of_property_read_u32(keys->dev->of_node,\n> +\t\t\"mediatek,long-press-mode\", &long_press_mode);\n> +\tif (ret)\n> +\t\tlong_press_mode = LP_DISABLE;\n> +\n> +\tswitch (long_press_mode) {\n> +\tcase LP_ONEKEY:\n> +\t\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> +\t\t\t\t   MTK_PMIC_PWRKEY_RST,\n> +\t\t\t\t   MTK_PMIC_PWRKEY_RST);\n> +\t\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> +\t\t\t\t   MTK_PMIC_HOMEKEY_RST,\n> +\t\t\t\t   0);\n> +\t\tbreak;\n> +\tcase LP_TWOKEY:\n> +\t\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> +\t\t\t\t   MTK_PMIC_PWRKEY_RST,\n> +\t\t\t\t   MTK_PMIC_PWRKEY_RST);\n> +\t\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> +\t\t\t\t   MTK_PMIC_HOMEKEY_RST,\n> +\t\t\t\t   MTK_PMIC_HOMEKEY_RST);\n> +\t\tbreak;\n> +\tcase LP_DISABLE:\n> +\t\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> +\t\t\t\t   MTK_PMIC_PWRKEY_RST,\n> +\t\t\t\t   0);\n> +\t\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> +\t\t\t\t   MTK_PMIC_HOMEKEY_RST,\n> +\t\t\t\t   0);\n> +\t\tbreak;\n> +\tdefault:\n> +\t\tbreak;\n> +\t}\n> +}\n> +\n> +static irqreturn_t mtk_pmic_keys_irq_handler_thread(int irq, void *data)\n> +{\n> +\tstruct mtk_pmic_keys_info *info = data;\n> +\tu32 key_deb, pressed;\n> +\n> +\tregmap_read(info->keys->regmap, info->regs->deb_reg, &key_deb);\n> +\n> +\tkey_deb &= info->regs->deb_mask;\n> +\n> +\tpressed = !key_deb;\n> +\n> +\tinput_report_key(info->keys->input_dev, info->keycode, pressed);\n> +\tinput_sync(info->keys->input_dev);\n> +\n> +\tdev_dbg(info->keys->dev, \"(%s) key =%d using PMIC\\n\",\n> +\t\t pressed ? \"pressed\" : \"released\", info->keycode);\n> +\n> +\treturn IRQ_HANDLED;\n> +}\n> +\n> +static int mtk_pmic_key_setup(struct mtk_pmic_keys *keys,\n> +\t\tstruct mtk_pmic_keys_info *info)\n> +{\n> +\tint ret;\n> +\n> +\tinfo->keys = keys;\n> +\n> +\tret = regmap_update_bits(keys->regmap, info->regs->intsel_reg,\n> +\t\t\t\t info->regs->intsel_mask,\n> +\t\t\t\t info->regs->intsel_mask);\n> +\tif (ret < 0)\n> +\t\treturn ret;\n> +\n> +\tret = devm_request_threaded_irq(keys->dev, info->irq, NULL,\n> +\t\t\t\t\tmtk_pmic_keys_irq_handler_thread,\n> +\t\t\t\t\tIRQF_ONESHOT | IRQF_TRIGGER_HIGH,\n> +\t\t\t\t\t\"mtk-pmic-keys\", info);\n> +\tif (ret) {\n> +\t\tdev_err(keys->dev, \"Failed to request IRQ: %d: %d\\n\",\n> +\t\t\tinfo->irq, ret);\n> +\t\treturn ret;\n> +\t}\n> +\n> +\tinput_set_capability(keys->input_dev, EV_KEY, info->keycode);\n> +\n> +\treturn 0;\n> +}\n> +\n> +#ifdef CONFIG_PM_SLEEP\n> +static int mtk_pmic_keys_suspend(struct device *dev)\n> +{\n> +\tstruct mtk_pmic_keys *keys = dev_get_drvdata(dev);\n> +\tint index;\n> +\n> +\tfor (index = 0; index < MTK_PMIC_MAX_KEY_COUNT; index++) {\n> +\t\tif (keys->keys[index].wakeup)\n> +\t\t\tenable_irq_wake(keys->keys[index].irq);\n> +\t}\n> +\n> +\treturn 0;\n> +}\n> +\n> +static int mtk_pmic_keys_resume(struct device *dev)\n> +{\n> +\tstruct mtk_pmic_keys *keys = dev_get_drvdata(dev);\n> +\tint index;\n> +\n> +\tfor (index = 0; index < MTK_PMIC_MAX_KEY_COUNT; index++) {\n> +\t\tif (keys->keys[index].wakeup)\n> +\t\t\tdisable_irq_wake(keys->keys[index].irq);\n> +\t}\n> +\n> +\treturn 0;\n> +}\n> +#endif\n> +\n> +static SIMPLE_DEV_PM_OPS(mtk_pmic_keys_pm_ops, mtk_pmic_keys_suspend,\n> +\t\t\tmtk_pmic_keys_resume);\n> +\n> +static const struct of_device_id of_mtk_pmic_keys_match_tbl[] = {\n> +\t{\n> +\t\t.compatible = \"mediatek,mt6397-keys\",\n> +\t\t.data = &mt6397_regs,\n> +\t}, {\n> +\t\t.compatible = \"mediatek,mt6323-keys\",\n> +\t\t.data = &mt6323_regs,\n> +\t}, {\n> +\t\t/* sentinel */\n> +\t}\n> +};\n> +MODULE_DEVICE_TABLE(of, of_mtk_pmic_keys_match_tbl);\n> +\n> +static int mtk_pmic_keys_probe(struct platform_device *pdev)\n> +{\n> +\tint error, index = 0;\n> +\tunsigned int keycount;\n> +\tstruct mt6397_chip *pmic_chip = dev_get_drvdata(pdev->dev.parent);\n> +\tstruct device_node *node = pdev->dev.of_node, *child;\n> +\tstruct mtk_pmic_keys *keys;\n> +\tconst struct mtk_pmic_regs *mtk_pmic_regs;\n> +\tstruct input_dev *input_dev;\n> +\tconst struct of_device_id *of_id =\n> +\t\tof_match_device(of_mtk_pmic_keys_match_tbl, &pdev->dev);\n> +\n> +\tkeys = devm_kzalloc(&pdev->dev, sizeof(*keys), GFP_KERNEL);\n> +\tif (!keys)\n> +\t\treturn -ENOMEM;\n> +\n> +\tkeys->dev = &pdev->dev;\n> +\tkeys->regmap = pmic_chip->regmap;\n> +\tmtk_pmic_regs = of_id->data;\n> +\n> +\tkeys->input_dev = input_dev = devm_input_allocate_device(keys->dev);\n> +\tif (!input_dev) {\n> +\t\tdev_err(keys->dev, \"input allocate device fail.\\n\");\n> +\t\treturn -ENOMEM;\n> +\t}\n> +\n> +\tinput_dev->name = \"mtk-pmic-keys\";\n> +\tinput_dev->id.bustype = BUS_HOST;\n> +\tinput_dev->id.vendor = 0x0001;\n> +\tinput_dev->id.product = 0x0001;\n> +\tinput_dev->id.version = 0x0001;\n> +\n> +\tkeycount = device_get_child_node_count(keys->dev);\n> +\tif (keycount > MTK_PMIC_MAX_KEY_COUNT) {\n> +\t\tdev_err(keys->dev, \"too many keys defined (%d)\\n\", keycount);\n> +\t\treturn -EINVAL;\n> +\t}\n> +\n> +\tfor_each_child_of_node(node, child) {\n> +\t\tkeys->keys[index].regs = &mtk_pmic_regs->keys_regs[index];\n> +\n> +\t\tkeys->keys[index].irq = platform_get_irq(pdev, index);\n> +\t\tif (keys->keys[index].irq < 0)\n> +\t\t\treturn keys->keys[index].irq;\n> +\n> +\t\terror = of_property_read_u32(child,\n> +\t\t\t\"linux,keycodes\", &keys->keys[index].keycode);\n> +\t\tif (error) {\n> +\t\t\tdev_err(keys->dev,\n> +\t\t\t\t\"failed to read key:%d linux,keycode property: %d\\n\",\n> +\t\t\t\tindex, error);\n> +\t\t\treturn error;\n> +\t\t}\n> +\n> +\t\tif (of_property_read_bool(child, \"wakeup-source\"))\n> +\t\t\tkeys->keys[index].wakeup = true;\n> +\n> +\t\terror = mtk_pmic_key_setup(keys, &keys->keys[index]);\n> +\t\tif (error)\n> +\t\t\treturn error;\n> +\n> +\t\tindex++;\n> +\t}\n> +\n> +\terror = input_register_device(input_dev);\n> +\tif (error) {\n> +\t\tdev_err(&pdev->dev,\n> +\t\t\t\"register input device failed (%d)\\n\", error);\n> +\t\treturn error;\n> +\t}\n> +\n> +\tmtk_pmic_keys_lp_reset_setup(keys, mtk_pmic_regs->pmic_rst_reg);\n> +\n> +\tplatform_set_drvdata(pdev, keys);\n> +\n> +\treturn 0;\n> +}\n> +\n> +static struct platform_driver pmic_keys_pdrv = {\n> +\t.probe = mtk_pmic_keys_probe,\n> +\t.driver = {\n> +\t\t   .name = \"mtk-pmic-keys\",\n> +\t\t   .of_match_table = of_mtk_pmic_keys_match_tbl,\n> +\t\t   .pm = &mtk_pmic_keys_pm_ops,\n> +\t},\n> +};\n> +\n> +module_platform_driver(pmic_keys_pdrv);\n> +\n> +MODULE_LICENSE(\"GPL v2\");\n> +MODULE_AUTHOR(\"Chen Zhong <chen.zhong@mediatek.com>\");\n> +MODULE_DESCRIPTION(\"MTK pmic-keys driver v0.1\");\n\n\n--\nTo unsubscribe from this list: send the line \"unsubscribe devicetree\" in\nthe body of a message to majordomo@vger.kernel.org\nMore majordomo info at  http://vger.kernel.org/majordomo-info.html","headers":{"Return-Path":"<devicetree-owner@vger.kernel.org>","X-Original-To":"incoming-dt@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming-dt@bilbo.ozlabs.org","Authentication-Results":"ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=devicetree-owner@vger.kernel.org; receiver=<UNKNOWN>)","Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3yLbHH2tR7z9sPm\n\tfor <incoming-dt@patchwork.ozlabs.org>;\n\tTue, 24 Oct 2017 12:27:39 +1100 (AEDT)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751271AbdJXB1h (ORCPT\n\t<rfc822;incoming-dt@patchwork.ozlabs.org>);\n\tMon, 23 Oct 2017 21:27:37 -0400","from mailgw01.mediatek.com ([210.61.82.183]:12906 \"EHLO\n\tmailgw01.mediatek.com\" rhost-flags-OK-FAIL-OK-FAIL) by\n\tvger.kernel.org with ESMTP id S1751220AbdJXB1Z (ORCPT\n\t<rfc822; devicetree@vger.kernel.org>); Mon, 23 Oct 2017 21:27:25 -0400","from mtkcas09.mediatek.inc [(172.21.101.178)] by\n\tmailgw01.mediatek.com (envelope-from <chen.zhong@mediatek.com>)\n\t(mhqrelay.mediatek.com ESMTP with TLS)\n\twith ESMTP id 2022477920; Tue, 24 Oct 2017 09:27:19 +0800","from MTKCAS32.mediatek.inc (172.27.4.184) by\n\tmtkmbs08n1.mediatek.inc\n\t(172.21.101.55) with Microsoft SMTP Server (TLS) id 15.0.1210.3;\n\tTue, 24 Oct 2017 09:27:17 +0800","from [10.17.3.153] (10.17.3.153) by MTKCAS32.mediatek.inc\n\t(172.27.4.170) with Microsoft SMTP Server id 15.0.1210.3 via Frontend\n\tTransport; Tue, 24 Oct 2017 09:27:16 +0800"],"X-UUID":"2646018a78214c21b0a467ad3d16c824-20171024","Message-ID":"<1508808435.4057.1.camel@mhfsdcap03>","Subject":"Re: [PATCH v5 5/6] input: Add MediaTek PMIC keys support","From":"Chen Zhong <chen.zhong@mediatek.com>","To":"Dmitry Torokhov <dmitry.torokhov@gmail.com>","CC":"Rob Herring <robh+dt@kernel.org>, Lee Jones <lee.jones@linaro.org>,\n\tAlexandre Belloni <alexandre.belloni@free-electrons.com>,\n\tMark Rutland <mark.rutland@arm.com>,\n\tMatthias Brugger <matthias.bgg@gmail.com>,\n\t\"Eddie Huang\" <eddie.huang@mediatek.com>,\n\tAlessandro Zummo <a.zummo@towertech.it>,\n\tLinus Walleij <linus.walleij@linaro.org>,\n\tChanwoo Choi <cw00.choi@samsung.com>,\n\tJaechul Lee <jcsing.lee@samsung.com>, \n\tAndi Shyti <andi.shyti@samsung.com>,\n\t<linux-input@vger.kernel.org>, <devicetree@vger.kernel.org>,\n\t<linux-kernel@vger.kernel.org>, <linux-arm-kernel@lists.infradead.org>,\n\t<linux-mediatek@lists.infradead.org>, <linux-rtc@vger.kernel.org>","Date":"Tue, 24 Oct 2017 09:27:15 +0800","In-Reply-To":"<1506509048-19032-6-git-send-email-chen.zhong@mediatek.com>","References":"<1506509048-19032-1-git-send-email-chen.zhong@mediatek.com>\n\t<1506509048-19032-6-git-send-email-chen.zhong@mediatek.com>","Content-Type":"text/plain; charset=\"UTF-8\"","X-Mailer":"Evolution 3.2.3-0ubuntu6 ","Content-Transfer-Encoding":"7bit","MIME-Version":"1.0","X-MTK":"N","Sender":"devicetree-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<devicetree.vger.kernel.org>","X-Mailing-List":"devicetree@vger.kernel.org"}},{"id":1792977,"web_url":"http://patchwork.ozlabs.org/comment/1792977/","msgid":"<20171024054409.6qbuzenzymkkjdth@dtor-ws>","list_archive_url":null,"date":"2017-10-24T05:44:09","subject":"Re: [PATCH v5 5/6] input: Add MediaTek PMIC keys support","submitter":{"id":695,"url":"http://patchwork.ozlabs.org/api/people/695/","name":"Dmitry Torokhov","email":"dmitry.torokhov@gmail.com"},"content":"On Wed, Sep 27, 2017 at 06:44:07PM +0800, Chen Zhong wrote:\n> This patch add support to handle MediaTek PMIC MT6397/MT6323 key\n> interrupts including pwrkey and homekey, also add setting for\n> long press key shutdown behavior.\n> \n> Signed-off-by: Chen Zhong <chen.zhong@mediatek.com>\n> ---\n>  drivers/input/keyboard/Kconfig         |    9 +\n>  drivers/input/keyboard/Makefile        |    1 +\n>  drivers/input/keyboard/mtk-pmic-keys.c |  341 ++++++++++++++++++++++++++++++++\n>  3 files changed, 351 insertions(+)\n>  create mode 100644 drivers/input/keyboard/mtk-pmic-keys.c\n> \n> diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig\n> index 4c4ab1c..bd4e20a 100644\n> --- a/drivers/input/keyboard/Kconfig\n> +++ b/drivers/input/keyboard/Kconfig\n> @@ -756,4 +756,13 @@ config KEYBOARD_BCM\n>  \t  To compile this driver as a module, choose M here: the\n>  \t  module will be called bcm-keypad.\n>  \n> +config KEYBOARD_MTK_PMIC\n> +\ttristate \"MediaTek PMIC keys support\"\n> +\tdepends on MFD_MT6397\n> +\thelp\n> +\t  Say Y here if you want to use the pmic keys (powerkey/homekey).\n> +\n> +\t  To compile this driver as a module, choose M here: the\n> +\t  module will be called pmic-keys.\n> +\n>  endif\n> diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile\n> index d2338ba..20c0b98 100644\n> --- a/drivers/input/keyboard/Makefile\n> +++ b/drivers/input/keyboard/Makefile\n> @@ -40,6 +40,7 @@ obj-$(CONFIG_KEYBOARD_MATRIX)\t\t+= matrix_keypad.o\n>  obj-$(CONFIG_KEYBOARD_MAX7359)\t\t+= max7359_keypad.o\n>  obj-$(CONFIG_KEYBOARD_MCS)\t\t+= mcs_touchkey.o\n>  obj-$(CONFIG_KEYBOARD_MPR121)\t\t+= mpr121_touchkey.o\n> +obj-$(CONFIG_KEYBOARD_MTK_PMIC) \t+= mtk-pmic-keys.o\n>  obj-$(CONFIG_KEYBOARD_NEWTON)\t\t+= newtonkbd.o\n>  obj-$(CONFIG_KEYBOARD_NOMADIK)\t\t+= nomadik-ske-keypad.o\n>  obj-$(CONFIG_KEYBOARD_NSPIRE)\t\t+= nspire-keypad.o\n> diff --git a/drivers/input/keyboard/mtk-pmic-keys.c b/drivers/input/keyboard/mtk-pmic-keys.c\n> new file mode 100644\n> index 0000000..529fd95\n> --- /dev/null\n> +++ b/drivers/input/keyboard/mtk-pmic-keys.c\n> @@ -0,0 +1,341 @@\n> +/*\n> + * Copyright (C) 2017 MediaTek, Inc.\n> + *\n> + * Author: Chen Zhong <chen.zhong@mediatek.com>\n> + *\n> + * This software is licensed under the terms of the GNU General Public\n> + * License version 2, as published by the Free Software Foundation, and\n> + * may be copied, distributed, and modified under those terms.\n> + *\n> + * This program is distributed in the hope that it will be useful,\n> + * but WITHOUT ANY WARRANTY; without even the implied warranty of\n> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n> + * GNU General Public License for more details.\n> + *\n> + */\n> +\n> +#include <linux/module.h>\n> +#include <linux/kernel.h>\n> +#include <linux/input.h>\n> +#include <linux/interrupt.h>\n> +#include <linux/platform_device.h>\n> +#include <linux/kernel.h>\n> +#include <linux/of.h>\n> +#include <linux/of_device.h>\n> +#include <linux/regmap.h>\n> +#include <linux/mfd/mt6323/registers.h>\n> +#include <linux/mfd/mt6397/registers.h>\n> +#include <linux/mfd/mt6397/core.h>\n> +\n> +#define MTK_PMIC_PWRKEY_RST_EN_MASK\t0x1\n> +#define MTK_PMIC_PWRKEY_RST_EN_SHIFT\t6\n> +#define MTK_PMIC_HOMEKEY_RST_EN_MASK\t0x1\n> +#define MTK_PMIC_HOMEKEY_RST_EN_SHIFT\t5\n> +#define MTK_PMIC_RST_DU_MASK\t\t0x3\n> +#define MTK_PMIC_RST_DU_SHIFT\t\t8\n> +\n> +#define MTK_PMIC_PWRKEY_RST\t\t\\\n> +\t(MTK_PMIC_PWRKEY_RST_EN_MASK << MTK_PMIC_PWRKEY_RST_EN_SHIFT)\n> +#define MTK_PMIC_HOMEKEY_RST\t\t\\\n> +\t(MTK_PMIC_HOMEKEY_RST_EN_MASK << MTK_PMIC_HOMEKEY_RST_EN_SHIFT)\n> +\n> +#define MTK_PMIC_PWRKEY_INDEX\t0\n> +#define MTK_PMIC_HOMEKEY_INDEX\t1\n> +#define MTK_PMIC_MAX_KEY_COUNT\t2\n> +\n> +struct mtk_pmic_keys_regs {\n> +\tu32 deb_reg;\n> +\tu32 deb_mask;\n> +\tu32 intsel_reg;\n> +\tu32 intsel_mask;\n> +};\n> +\n> +#define MTK_PMIC_KEYS_REGS(_deb_reg, _deb_mask,\t\t\\\n> +\t_intsel_reg, _intsel_mask)\t\t\t\\\n> +{\t\t\t\t\t\t\t\\\n> +\t.deb_reg\t\t= _deb_reg,\t\t\\\n> +\t.deb_mask\t\t= _deb_mask,\t\t\\\n> +\t.intsel_reg\t\t= _intsel_reg,\t\t\\\n> +\t.intsel_mask\t\t= _intsel_mask,\t\t\\\n> +}\n> +\n> +struct mtk_pmic_regs {\n> +\tconst struct mtk_pmic_keys_regs keys_regs[MTK_PMIC_MAX_KEY_COUNT];\n> +\tu32 pmic_rst_reg;\n> +};\n> +\n> +static const struct mtk_pmic_regs mt6397_regs = {\n> +\t.keys_regs[MTK_PMIC_PWRKEY_INDEX] =\n> +\t\tMTK_PMIC_KEYS_REGS(MT6397_CHRSTATUS,\n> +\t\t0x8, MT6397_INT_RSV, 0x10),\n> +\t.keys_regs[MTK_PMIC_HOMEKEY_INDEX] =\n> +\t\tMTK_PMIC_KEYS_REGS(MT6397_OCSTATUS2,\n> +\t\t0x10, MT6397_INT_RSV, 0x8),\n> +\t.pmic_rst_reg = MT6397_TOP_RST_MISC,\n> +};\n> +\n> +static const struct mtk_pmic_regs mt6323_regs = {\n> +\t.keys_regs[MTK_PMIC_PWRKEY_INDEX] =\n> +\t\tMTK_PMIC_KEYS_REGS(MT6323_CHRSTATUS,\n> +\t\t0x2, MT6323_INT_MISC_CON, 0x10),\n> +\t.keys_regs[MTK_PMIC_HOMEKEY_INDEX] =\n> +\t\tMTK_PMIC_KEYS_REGS(MT6323_CHRSTATUS,\n> +\t\t0x4, MT6323_INT_MISC_CON, 0x8),\n> +\t.pmic_rst_reg = MT6323_TOP_RST_MISC,\n> +};\n> +\n> +struct mtk_pmic_keys_info {\n> +\tstruct mtk_pmic_keys *keys;\n> +\tconst struct mtk_pmic_keys_regs *regs;\n> +\tunsigned int keycode;\n> +\tint irq;\n> +\tbool wakeup:1;\n> +};\n> +\n> +struct mtk_pmic_keys {\n> +\tstruct input_dev *input_dev;\n> +\tstruct device *dev;\n> +\tstruct regmap *regmap;\n> +\tstruct mtk_pmic_keys_info keys[MTK_PMIC_MAX_KEY_COUNT];\n> +};\n> +\n> +enum mtk_pmic_keys_lp_mode {\n> +\tLP_DISABLE,\n> +\tLP_ONEKEY,\n> +\tLP_TWOKEY,\n> +};\n> +\n> +static void mtk_pmic_keys_lp_reset_setup(struct mtk_pmic_keys *keys,\n> +\t\tu32 pmic_rst_reg)\n> +{\n> +\tint ret;\n> +\tu32 long_press_mode, long_press_debounce;\n> +\n> +\tret = of_property_read_u32(keys->dev->of_node,\n> +\t\t\"power-off-time-sec\", &long_press_debounce);\n> +\tif (ret)\n> +\t\tlong_press_debounce = 0;\n> +\n> +\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> +\t\t\t   MTK_PMIC_RST_DU_MASK << MTK_PMIC_RST_DU_SHIFT,\n> +\t\t\t   long_press_debounce << MTK_PMIC_RST_DU_SHIFT);\n> +\n> +\tret = of_property_read_u32(keys->dev->of_node,\n> +\t\t\"mediatek,long-press-mode\", &long_press_mode);\n> +\tif (ret)\n> +\t\tlong_press_mode = LP_DISABLE;\n> +\n> +\tswitch (long_press_mode) {\n> +\tcase LP_ONEKEY:\n> +\t\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> +\t\t\t\t   MTK_PMIC_PWRKEY_RST,\n> +\t\t\t\t   MTK_PMIC_PWRKEY_RST);\n> +\t\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> +\t\t\t\t   MTK_PMIC_HOMEKEY_RST,\n> +\t\t\t\t   0);\n> +\t\tbreak;\n> +\tcase LP_TWOKEY:\n> +\t\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> +\t\t\t\t   MTK_PMIC_PWRKEY_RST,\n> +\t\t\t\t   MTK_PMIC_PWRKEY_RST);\n> +\t\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> +\t\t\t\t   MTK_PMIC_HOMEKEY_RST,\n> +\t\t\t\t   MTK_PMIC_HOMEKEY_RST);\n> +\t\tbreak;\n> +\tcase LP_DISABLE:\n> +\t\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> +\t\t\t\t   MTK_PMIC_PWRKEY_RST,\n> +\t\t\t\t   0);\n> +\t\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> +\t\t\t\t   MTK_PMIC_HOMEKEY_RST,\n> +\t\t\t\t   0);\n> +\t\tbreak;\n> +\tdefault:\n> +\t\tbreak;\n> +\t}\n> +}\n> +\n> +static irqreturn_t mtk_pmic_keys_irq_handler_thread(int irq, void *data)\n> +{\n> +\tstruct mtk_pmic_keys_info *info = data;\n> +\tu32 key_deb, pressed;\n> +\n> +\tregmap_read(info->keys->regmap, info->regs->deb_reg, &key_deb);\n> +\n> +\tkey_deb &= info->regs->deb_mask;\n> +\n> +\tpressed = !key_deb;\n> +\n> +\tinput_report_key(info->keys->input_dev, info->keycode, pressed);\n> +\tinput_sync(info->keys->input_dev);\n> +\n> +\tdev_dbg(info->keys->dev, \"(%s) key =%d using PMIC\\n\",\n> +\t\t pressed ? \"pressed\" : \"released\", info->keycode);\n> +\n> +\treturn IRQ_HANDLED;\n> +}\n> +\n> +static int mtk_pmic_key_setup(struct mtk_pmic_keys *keys,\n> +\t\tstruct mtk_pmic_keys_info *info)\n> +{\n> +\tint ret;\n> +\n> +\tinfo->keys = keys;\n> +\n> +\tret = regmap_update_bits(keys->regmap, info->regs->intsel_reg,\n> +\t\t\t\t info->regs->intsel_mask,\n> +\t\t\t\t info->regs->intsel_mask);\n> +\tif (ret < 0)\n> +\t\treturn ret;\n> +\n> +\tret = devm_request_threaded_irq(keys->dev, info->irq, NULL,\n> +\t\t\t\t\tmtk_pmic_keys_irq_handler_thread,\n> +\t\t\t\t\tIRQF_ONESHOT | IRQF_TRIGGER_HIGH,\n> +\t\t\t\t\t\"mtk-pmic-keys\", info);\n> +\tif (ret) {\n> +\t\tdev_err(keys->dev, \"Failed to request IRQ: %d: %d\\n\",\n> +\t\t\tinfo->irq, ret);\n> +\t\treturn ret;\n> +\t}\n> +\n> +\tinput_set_capability(keys->input_dev, EV_KEY, info->keycode);\n> +\n> +\treturn 0;\n> +}\n> +\n> +#ifdef CONFIG_PM_SLEEP\n> +static int mtk_pmic_keys_suspend(struct device *dev)\n\nPlease use __maybe_unused annotation instead of #ifdef guard.\n\n> +{\n> +\tstruct mtk_pmic_keys *keys = dev_get_drvdata(dev);\n> +\tint index;\n> +\n> +\tfor (index = 0; index < MTK_PMIC_MAX_KEY_COUNT; index++) {\n> +\t\tif (keys->keys[index].wakeup)\n> +\t\t\tenable_irq_wake(keys->keys[index].irq);\n> +\t}\n> +\n> +\treturn 0;\n> +}\n> +\n> +static int mtk_pmic_keys_resume(struct device *dev)\n\n__maybe_unused here as well.\n\n> +{\n> +\tstruct mtk_pmic_keys *keys = dev_get_drvdata(dev);\n> +\tint index;\n> +\n> +\tfor (index = 0; index < MTK_PMIC_MAX_KEY_COUNT; index++) {\n> +\t\tif (keys->keys[index].wakeup)\n> +\t\t\tdisable_irq_wake(keys->keys[index].irq);\n> +\t}\n> +\n> +\treturn 0;\n> +}\n> +#endif\n> +\n> +static SIMPLE_DEV_PM_OPS(mtk_pmic_keys_pm_ops, mtk_pmic_keys_suspend,\n> +\t\t\tmtk_pmic_keys_resume);\n> +\n> +static const struct of_device_id of_mtk_pmic_keys_match_tbl[] = {\n> +\t{\n> +\t\t.compatible = \"mediatek,mt6397-keys\",\n> +\t\t.data = &mt6397_regs,\n> +\t}, {\n> +\t\t.compatible = \"mediatek,mt6323-keys\",\n> +\t\t.data = &mt6323_regs,\n> +\t}, {\n> +\t\t/* sentinel */\n> +\t}\n> +};\n> +MODULE_DEVICE_TABLE(of, of_mtk_pmic_keys_match_tbl);\n> +\n> +static int mtk_pmic_keys_probe(struct platform_device *pdev)\n> +{\n> +\tint error, index = 0;\n> +\tunsigned int keycount;\n> +\tstruct mt6397_chip *pmic_chip = dev_get_drvdata(pdev->dev.parent);\n> +\tstruct device_node *node = pdev->dev.of_node, *child;\n> +\tstruct mtk_pmic_keys *keys;\n> +\tconst struct mtk_pmic_regs *mtk_pmic_regs;\n> +\tstruct input_dev *input_dev;\n> +\tconst struct of_device_id *of_id =\n> +\t\tof_match_device(of_mtk_pmic_keys_match_tbl, &pdev->dev);\n> +\n> +\tkeys = devm_kzalloc(&pdev->dev, sizeof(*keys), GFP_KERNEL);\n> +\tif (!keys)\n> +\t\treturn -ENOMEM;\n> +\n> +\tkeys->dev = &pdev->dev;\n> +\tkeys->regmap = pmic_chip->regmap;\n> +\tmtk_pmic_regs = of_id->data;\n> +\n> +\tkeys->input_dev = input_dev = devm_input_allocate_device(keys->dev);\n> +\tif (!input_dev) {\n> +\t\tdev_err(keys->dev, \"input allocate device fail.\\n\");\n> +\t\treturn -ENOMEM;\n> +\t}\n> +\n> +\tinput_dev->name = \"mtk-pmic-keys\";\n> +\tinput_dev->id.bustype = BUS_HOST;\n> +\tinput_dev->id.vendor = 0x0001;\n> +\tinput_dev->id.product = 0x0001;\n> +\tinput_dev->id.version = 0x0001;\n> +\n> +\tkeycount = device_get_child_node_count(keys->dev);\n\nSince you are using of_* API everywhere else I'd rather we used\nof_get_available_child_count() here.\n\n\nOnce these 2 issues are fixed please feel free to add \n\nAcked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>\n\nI assume it will all go though MFD tree, right?\n\n> +\tif (keycount > MTK_PMIC_MAX_KEY_COUNT) {\n> +\t\tdev_err(keys->dev, \"too many keys defined (%d)\\n\", keycount);\n> +\t\treturn -EINVAL;\n> +\t}\n> +\n> +\tfor_each_child_of_node(node, child) {\n> +\t\tkeys->keys[index].regs = &mtk_pmic_regs->keys_regs[index];\n> +\n> +\t\tkeys->keys[index].irq = platform_get_irq(pdev, index);\n> +\t\tif (keys->keys[index].irq < 0)\n> +\t\t\treturn keys->keys[index].irq;\n> +\n> +\t\terror = of_property_read_u32(child,\n> +\t\t\t\"linux,keycodes\", &keys->keys[index].keycode);\n> +\t\tif (error) {\n> +\t\t\tdev_err(keys->dev,\n> +\t\t\t\t\"failed to read key:%d linux,keycode property: %d\\n\",\n> +\t\t\t\tindex, error);\n> +\t\t\treturn error;\n> +\t\t}\n> +\n> +\t\tif (of_property_read_bool(child, \"wakeup-source\"))\n> +\t\t\tkeys->keys[index].wakeup = true;\n> +\n> +\t\terror = mtk_pmic_key_setup(keys, &keys->keys[index]);\n> +\t\tif (error)\n> +\t\t\treturn error;\n> +\n> +\t\tindex++;\n> +\t}\n> +\n> +\terror = input_register_device(input_dev);\n> +\tif (error) {\n> +\t\tdev_err(&pdev->dev,\n> +\t\t\t\"register input device failed (%d)\\n\", error);\n> +\t\treturn error;\n> +\t}\n> +\n> +\tmtk_pmic_keys_lp_reset_setup(keys, mtk_pmic_regs->pmic_rst_reg);\n> +\n> +\tplatform_set_drvdata(pdev, keys);\n> +\n> +\treturn 0;\n> +}\n> +\n> +static struct platform_driver pmic_keys_pdrv = {\n> +\t.probe = mtk_pmic_keys_probe,\n> +\t.driver = {\n> +\t\t   .name = \"mtk-pmic-keys\",\n> +\t\t   .of_match_table = of_mtk_pmic_keys_match_tbl,\n> +\t\t   .pm = &mtk_pmic_keys_pm_ops,\n> +\t},\n> +};\n> +\n> +module_platform_driver(pmic_keys_pdrv);\n> +\n> +MODULE_LICENSE(\"GPL v2\");\n> +MODULE_AUTHOR(\"Chen Zhong <chen.zhong@mediatek.com>\");\n> +MODULE_DESCRIPTION(\"MTK pmic-keys driver v0.1\");\n> -- \n> 1.7.9.5\n> \n\nThanks.","headers":{"Return-Path":"<devicetree-owner@vger.kernel.org>","X-Original-To":"incoming-dt@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming-dt@bilbo.ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=devicetree-owner@vger.kernel.org; receiver=<UNKNOWN>)","ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=gmail.com header.i=@gmail.com\n\theader.b=\"j/4ee4tL\"; dkim-atps=neutral"],"Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3yLhzQ0MNfz9sBd\n\tfor <incoming-dt@patchwork.ozlabs.org>;\n\tTue, 24 Oct 2017 16:44:18 +1100 (AEDT)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751432AbdJXFoP (ORCPT\n\t<rfc822;incoming-dt@patchwork.ozlabs.org>);\n\tTue, 24 Oct 2017 01:44:15 -0400","from mail-it0-f67.google.com ([209.85.214.67]:49381 \"EHLO\n\tmail-it0-f67.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1751429AbdJXFoO (ORCPT\n\t<rfc822; devicetree@vger.kernel.org>); Tue, 24 Oct 2017 01:44:14 -0400","by mail-it0-f67.google.com with SMTP id y15so8583505ita.4;\n\tMon, 23 Oct 2017 22:44:13 -0700 (PDT)","from dtor-ws ([2620:0:1000:1611:da80:8749:c06f:9515])\n\tby smtp.gmail.com with ESMTPSA id\n\tt186sm337740ita.30.2017.10.23.22.44.11\n\t(version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256);\n\tMon, 23 Oct 2017 22:44:12 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;\n\th=date:from:to:cc:subject:message-id:references:mime-version\n\t:content-disposition:in-reply-to:user-agent;\n\tbh=UPTc5cmPMrxH6znA0a89n8Ffkys1Wx0Q10MsXzfeSWk=;\n\tb=j/4ee4tLEVk63vYiPm1MaZaqsqszyN+PwlqZ6mlJxHLGnys72cq8bM+nigA6ht66vr\n\tPhhjCRucSg6nSpz/7KOhAk5lX+RkXDLzNegUApYJBELNUiMRvspo9eWRRncpEHM6CMIK\n\tb1nR33fj7JeVVczUrwK3RNNXB0urQX96xoHiUzxBiThgtrfozz6rhBtdAHpKfrnxinDM\n\tRSs+bomtseAV5105KNp4PL/zsivc7CXLygSuyGWmlWsf023peWOle4SBIZaSxdz6Ontd\n\ta7vwWKthX8Ar1RbJJ0OB5wmqKvDMTcUq7sR8JAhUWoZT+wJnuTD6iIy9Kix/ziWuIW82\n\tuEdA==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:date:from:to:cc:subject:message-id:references\n\t:mime-version:content-disposition:in-reply-to:user-agent;\n\tbh=UPTc5cmPMrxH6znA0a89n8Ffkys1Wx0Q10MsXzfeSWk=;\n\tb=ovI/bp6O//JjKxOZzm6vPUe9RU7I/pGpG3hyZf+gEZif9XBWo5MEDS8LLdAFLjL9zz\n\tK8E532PRKyusM5nGzTLZ0Obe7k/2nEMR+P0brDX52Fd9c5NR4oJyXUBK11ZA2qStb3C7\n\tjXRuFpQ34ETK3KX/DD5BuMbUYfhA4SvWWw/RnvhRp34k5683HWw/VZUMmueNZ/2aoQDT\n\ttdVWSwDaMHfGXGzIwhLb5HPvqzAnOu4oWlKfhG+4Lj9rlejGEfWtRIYAJy3muaC3rCtX\n\toXOIKIbR3sqm67Yrzsyw/HO8OT603QnitlN+nS7xzIBhuQ9cIQeI1U43OSiNvtskViFC\n\ti6nw==","X-Gm-Message-State":"AMCzsaW8eKCbigB/6Swaa+cEpy9U3LOQzoCzI+cNDSH3zwVz4WsowB2d\n\tVdrYdQPsjYCq06pDtQ0Y3VM=","X-Google-Smtp-Source":"ABhQp+RwK5GXEWwisOA+f6rkXsAMFhVPxsbVEEjz/9VOEkIQyYcF6sPItUuMSUavkP/iQYLWR6ftag==","X-Received":"by 10.36.175.74 with SMTP id l10mr12710083iti.150.1508823853131; \n\tMon, 23 Oct 2017 22:44:13 -0700 (PDT)","Date":"Mon, 23 Oct 2017 22:44:09 -0700","From":"Dmitry Torokhov <dmitry.torokhov@gmail.com>","To":"Chen Zhong <chen.zhong@mediatek.com>","Cc":"Rob Herring <robh+dt@kernel.org>, Lee Jones <lee.jones@linaro.org>,\n\tAlexandre Belloni <alexandre.belloni@free-electrons.com>,\n\tMark Rutland <mark.rutland@arm.com>,\n\tMatthias Brugger <matthias.bgg@gmail.com>,\n\tEddie Huang <eddie.huang@mediatek.com>,\n\tAlessandro Zummo <a.zummo@towertech.it>,\n\tLinus Walleij <linus.walleij@linaro.org>,\n\tChanwoo Choi <cw00.choi@samsung.com>,\n\tJaechul Lee <jcsing.lee@samsung.com>, \n\tAndi Shyti <andi.shyti@samsung.com>,\n\tlinux-input@vger.kernel.org, devicetree@vger.kernel.org,\n\tlinux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org,\n\tlinux-mediatek@lists.infradead.org, linux-rtc@vger.kernel.org","Subject":"Re: [PATCH v5 5/6] input: Add MediaTek PMIC keys support","Message-ID":"<20171024054409.6qbuzenzymkkjdth@dtor-ws>","References":"<1506509048-19032-1-git-send-email-chen.zhong@mediatek.com>\n\t<1506509048-19032-6-git-send-email-chen.zhong@mediatek.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=us-ascii","Content-Disposition":"inline","In-Reply-To":"<1506509048-19032-6-git-send-email-chen.zhong@mediatek.com>","User-Agent":"NeoMutt/20170609 (1.8.3)","Sender":"devicetree-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<devicetree.vger.kernel.org>","X-Mailing-List":"devicetree@vger.kernel.org"}},{"id":1793087,"web_url":"http://patchwork.ozlabs.org/comment/1793087/","msgid":"<1508837852.4057.6.camel@mhfsdcap03>","list_archive_url":null,"date":"2017-10-24T09:37:32","subject":"Re: [PATCH v5 5/6] input: Add MediaTek PMIC keys support","submitter":{"id":72090,"url":"http://patchwork.ozlabs.org/api/people/72090/","name":"Chen Zhong","email":"chen.zhong@mediatek.com"},"content":"On Mon, 2017-10-23 at 22:44 -0700, Dmitry Torokhov wrote:\n> On Wed, Sep 27, 2017 at 06:44:07PM +0800, Chen Zhong wrote:\n> > This patch add support to handle MediaTek PMIC MT6397/MT6323 key\n> > interrupts including pwrkey and homekey, also add setting for\n> > long press key shutdown behavior.\n> > \n> > Signed-off-by: Chen Zhong <chen.zhong@mediatek.com>\n> > ---\n> >  drivers/input/keyboard/Kconfig         |    9 +\n> >  drivers/input/keyboard/Makefile        |    1 +\n> >  drivers/input/keyboard/mtk-pmic-keys.c |  341 ++++++++++++++++++++++++++++++++\n> >  3 files changed, 351 insertions(+)\n> >  create mode 100644 drivers/input/keyboard/mtk-pmic-keys.c\n> > \n> > diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig\n> > index 4c4ab1c..bd4e20a 100644\n> > --- a/drivers/input/keyboard/Kconfig\n> > +++ b/drivers/input/keyboard/Kconfig\n> > @@ -756,4 +756,13 @@ config KEYBOARD_BCM\n> >  \t  To compile this driver as a module, choose M here: the\n> >  \t  module will be called bcm-keypad.\n> >  \n> > +config KEYBOARD_MTK_PMIC\n> > +\ttristate \"MediaTek PMIC keys support\"\n> > +\tdepends on MFD_MT6397\n> > +\thelp\n> > +\t  Say Y here if you want to use the pmic keys (powerkey/homekey).\n> > +\n> > +\t  To compile this driver as a module, choose M here: the\n> > +\t  module will be called pmic-keys.\n> > +\n> >  endif\n> > diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile\n> > index d2338ba..20c0b98 100644\n> > --- a/drivers/input/keyboard/Makefile\n> > +++ b/drivers/input/keyboard/Makefile\n> > @@ -40,6 +40,7 @@ obj-$(CONFIG_KEYBOARD_MATRIX)\t\t+= matrix_keypad.o\n> >  obj-$(CONFIG_KEYBOARD_MAX7359)\t\t+= max7359_keypad.o\n> >  obj-$(CONFIG_KEYBOARD_MCS)\t\t+= mcs_touchkey.o\n> >  obj-$(CONFIG_KEYBOARD_MPR121)\t\t+= mpr121_touchkey.o\n> > +obj-$(CONFIG_KEYBOARD_MTK_PMIC) \t+= mtk-pmic-keys.o\n> >  obj-$(CONFIG_KEYBOARD_NEWTON)\t\t+= newtonkbd.o\n> >  obj-$(CONFIG_KEYBOARD_NOMADIK)\t\t+= nomadik-ske-keypad.o\n> >  obj-$(CONFIG_KEYBOARD_NSPIRE)\t\t+= nspire-keypad.o\n> > diff --git a/drivers/input/keyboard/mtk-pmic-keys.c b/drivers/input/keyboard/mtk-pmic-keys.c\n> > new file mode 100644\n> > index 0000000..529fd95\n> > --- /dev/null\n> > +++ b/drivers/input/keyboard/mtk-pmic-keys.c\n> > @@ -0,0 +1,341 @@\n> > +/*\n> > + * Copyright (C) 2017 MediaTek, Inc.\n> > + *\n> > + * Author: Chen Zhong <chen.zhong@mediatek.com>\n> > + *\n> > + * This software is licensed under the terms of the GNU General Public\n> > + * License version 2, as published by the Free Software Foundation, and\n> > + * may be copied, distributed, and modified under those terms.\n> > + *\n> > + * This program is distributed in the hope that it will be useful,\n> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of\n> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n> > + * GNU General Public License for more details.\n> > + *\n> > + */\n> > +\n> > +#include <linux/module.h>\n> > +#include <linux/kernel.h>\n> > +#include <linux/input.h>\n> > +#include <linux/interrupt.h>\n> > +#include <linux/platform_device.h>\n> > +#include <linux/kernel.h>\n> > +#include <linux/of.h>\n> > +#include <linux/of_device.h>\n> > +#include <linux/regmap.h>\n> > +#include <linux/mfd/mt6323/registers.h>\n> > +#include <linux/mfd/mt6397/registers.h>\n> > +#include <linux/mfd/mt6397/core.h>\n> > +\n> > +#define MTK_PMIC_PWRKEY_RST_EN_MASK\t0x1\n> > +#define MTK_PMIC_PWRKEY_RST_EN_SHIFT\t6\n> > +#define MTK_PMIC_HOMEKEY_RST_EN_MASK\t0x1\n> > +#define MTK_PMIC_HOMEKEY_RST_EN_SHIFT\t5\n> > +#define MTK_PMIC_RST_DU_MASK\t\t0x3\n> > +#define MTK_PMIC_RST_DU_SHIFT\t\t8\n> > +\n> > +#define MTK_PMIC_PWRKEY_RST\t\t\\\n> > +\t(MTK_PMIC_PWRKEY_RST_EN_MASK << MTK_PMIC_PWRKEY_RST_EN_SHIFT)\n> > +#define MTK_PMIC_HOMEKEY_RST\t\t\\\n> > +\t(MTK_PMIC_HOMEKEY_RST_EN_MASK << MTK_PMIC_HOMEKEY_RST_EN_SHIFT)\n> > +\n> > +#define MTK_PMIC_PWRKEY_INDEX\t0\n> > +#define MTK_PMIC_HOMEKEY_INDEX\t1\n> > +#define MTK_PMIC_MAX_KEY_COUNT\t2\n> > +\n> > +struct mtk_pmic_keys_regs {\n> > +\tu32 deb_reg;\n> > +\tu32 deb_mask;\n> > +\tu32 intsel_reg;\n> > +\tu32 intsel_mask;\n> > +};\n> > +\n> > +#define MTK_PMIC_KEYS_REGS(_deb_reg, _deb_mask,\t\t\\\n> > +\t_intsel_reg, _intsel_mask)\t\t\t\\\n> > +{\t\t\t\t\t\t\t\\\n> > +\t.deb_reg\t\t= _deb_reg,\t\t\\\n> > +\t.deb_mask\t\t= _deb_mask,\t\t\\\n> > +\t.intsel_reg\t\t= _intsel_reg,\t\t\\\n> > +\t.intsel_mask\t\t= _intsel_mask,\t\t\\\n> > +}\n> > +\n> > +struct mtk_pmic_regs {\n> > +\tconst struct mtk_pmic_keys_regs keys_regs[MTK_PMIC_MAX_KEY_COUNT];\n> > +\tu32 pmic_rst_reg;\n> > +};\n> > +\n> > +static const struct mtk_pmic_regs mt6397_regs = {\n> > +\t.keys_regs[MTK_PMIC_PWRKEY_INDEX] =\n> > +\t\tMTK_PMIC_KEYS_REGS(MT6397_CHRSTATUS,\n> > +\t\t0x8, MT6397_INT_RSV, 0x10),\n> > +\t.keys_regs[MTK_PMIC_HOMEKEY_INDEX] =\n> > +\t\tMTK_PMIC_KEYS_REGS(MT6397_OCSTATUS2,\n> > +\t\t0x10, MT6397_INT_RSV, 0x8),\n> > +\t.pmic_rst_reg = MT6397_TOP_RST_MISC,\n> > +};\n> > +\n> > +static const struct mtk_pmic_regs mt6323_regs = {\n> > +\t.keys_regs[MTK_PMIC_PWRKEY_INDEX] =\n> > +\t\tMTK_PMIC_KEYS_REGS(MT6323_CHRSTATUS,\n> > +\t\t0x2, MT6323_INT_MISC_CON, 0x10),\n> > +\t.keys_regs[MTK_PMIC_HOMEKEY_INDEX] =\n> > +\t\tMTK_PMIC_KEYS_REGS(MT6323_CHRSTATUS,\n> > +\t\t0x4, MT6323_INT_MISC_CON, 0x8),\n> > +\t.pmic_rst_reg = MT6323_TOP_RST_MISC,\n> > +};\n> > +\n> > +struct mtk_pmic_keys_info {\n> > +\tstruct mtk_pmic_keys *keys;\n> > +\tconst struct mtk_pmic_keys_regs *regs;\n> > +\tunsigned int keycode;\n> > +\tint irq;\n> > +\tbool wakeup:1;\n> > +};\n> > +\n> > +struct mtk_pmic_keys {\n> > +\tstruct input_dev *input_dev;\n> > +\tstruct device *dev;\n> > +\tstruct regmap *regmap;\n> > +\tstruct mtk_pmic_keys_info keys[MTK_PMIC_MAX_KEY_COUNT];\n> > +};\n> > +\n> > +enum mtk_pmic_keys_lp_mode {\n> > +\tLP_DISABLE,\n> > +\tLP_ONEKEY,\n> > +\tLP_TWOKEY,\n> > +};\n> > +\n> > +static void mtk_pmic_keys_lp_reset_setup(struct mtk_pmic_keys *keys,\n> > +\t\tu32 pmic_rst_reg)\n> > +{\n> > +\tint ret;\n> > +\tu32 long_press_mode, long_press_debounce;\n> > +\n> > +\tret = of_property_read_u32(keys->dev->of_node,\n> > +\t\t\"power-off-time-sec\", &long_press_debounce);\n> > +\tif (ret)\n> > +\t\tlong_press_debounce = 0;\n> > +\n> > +\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> > +\t\t\t   MTK_PMIC_RST_DU_MASK << MTK_PMIC_RST_DU_SHIFT,\n> > +\t\t\t   long_press_debounce << MTK_PMIC_RST_DU_SHIFT);\n> > +\n> > +\tret = of_property_read_u32(keys->dev->of_node,\n> > +\t\t\"mediatek,long-press-mode\", &long_press_mode);\n> > +\tif (ret)\n> > +\t\tlong_press_mode = LP_DISABLE;\n> > +\n> > +\tswitch (long_press_mode) {\n> > +\tcase LP_ONEKEY:\n> > +\t\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> > +\t\t\t\t   MTK_PMIC_PWRKEY_RST,\n> > +\t\t\t\t   MTK_PMIC_PWRKEY_RST);\n> > +\t\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> > +\t\t\t\t   MTK_PMIC_HOMEKEY_RST,\n> > +\t\t\t\t   0);\n> > +\t\tbreak;\n> > +\tcase LP_TWOKEY:\n> > +\t\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> > +\t\t\t\t   MTK_PMIC_PWRKEY_RST,\n> > +\t\t\t\t   MTK_PMIC_PWRKEY_RST);\n> > +\t\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> > +\t\t\t\t   MTK_PMIC_HOMEKEY_RST,\n> > +\t\t\t\t   MTK_PMIC_HOMEKEY_RST);\n> > +\t\tbreak;\n> > +\tcase LP_DISABLE:\n> > +\t\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> > +\t\t\t\t   MTK_PMIC_PWRKEY_RST,\n> > +\t\t\t\t   0);\n> > +\t\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> > +\t\t\t\t   MTK_PMIC_HOMEKEY_RST,\n> > +\t\t\t\t   0);\n> > +\t\tbreak;\n> > +\tdefault:\n> > +\t\tbreak;\n> > +\t}\n> > +}\n> > +\n> > +static irqreturn_t mtk_pmic_keys_irq_handler_thread(int irq, void *data)\n> > +{\n> > +\tstruct mtk_pmic_keys_info *info = data;\n> > +\tu32 key_deb, pressed;\n> > +\n> > +\tregmap_read(info->keys->regmap, info->regs->deb_reg, &key_deb);\n> > +\n> > +\tkey_deb &= info->regs->deb_mask;\n> > +\n> > +\tpressed = !key_deb;\n> > +\n> > +\tinput_report_key(info->keys->input_dev, info->keycode, pressed);\n> > +\tinput_sync(info->keys->input_dev);\n> > +\n> > +\tdev_dbg(info->keys->dev, \"(%s) key =%d using PMIC\\n\",\n> > +\t\t pressed ? \"pressed\" : \"released\", info->keycode);\n> > +\n> > +\treturn IRQ_HANDLED;\n> > +}\n> > +\n> > +static int mtk_pmic_key_setup(struct mtk_pmic_keys *keys,\n> > +\t\tstruct mtk_pmic_keys_info *info)\n> > +{\n> > +\tint ret;\n> > +\n> > +\tinfo->keys = keys;\n> > +\n> > +\tret = regmap_update_bits(keys->regmap, info->regs->intsel_reg,\n> > +\t\t\t\t info->regs->intsel_mask,\n> > +\t\t\t\t info->regs->intsel_mask);\n> > +\tif (ret < 0)\n> > +\t\treturn ret;\n> > +\n> > +\tret = devm_request_threaded_irq(keys->dev, info->irq, NULL,\n> > +\t\t\t\t\tmtk_pmic_keys_irq_handler_thread,\n> > +\t\t\t\t\tIRQF_ONESHOT | IRQF_TRIGGER_HIGH,\n> > +\t\t\t\t\t\"mtk-pmic-keys\", info);\n> > +\tif (ret) {\n> > +\t\tdev_err(keys->dev, \"Failed to request IRQ: %d: %d\\n\",\n> > +\t\t\tinfo->irq, ret);\n> > +\t\treturn ret;\n> > +\t}\n> > +\n> > +\tinput_set_capability(keys->input_dev, EV_KEY, info->keycode);\n> > +\n> > +\treturn 0;\n> > +}\n> > +\n> > +#ifdef CONFIG_PM_SLEEP\n> > +static int mtk_pmic_keys_suspend(struct device *dev)\n> \n> Please use __maybe_unused annotation instead of #ifdef guard.\n> \n> > +{\n> > +\tstruct mtk_pmic_keys *keys = dev_get_drvdata(dev);\n> > +\tint index;\n> > +\n> > +\tfor (index = 0; index < MTK_PMIC_MAX_KEY_COUNT; index++) {\n> > +\t\tif (keys->keys[index].wakeup)\n> > +\t\t\tenable_irq_wake(keys->keys[index].irq);\n> > +\t}\n> > +\n> > +\treturn 0;\n> > +}\n> > +\n> > +static int mtk_pmic_keys_resume(struct device *dev)\n> \n> __maybe_unused here as well.\n> \n> > +{\n> > +\tstruct mtk_pmic_keys *keys = dev_get_drvdata(dev);\n> > +\tint index;\n> > +\n> > +\tfor (index = 0; index < MTK_PMIC_MAX_KEY_COUNT; index++) {\n> > +\t\tif (keys->keys[index].wakeup)\n> > +\t\t\tdisable_irq_wake(keys->keys[index].irq);\n> > +\t}\n> > +\n> > +\treturn 0;\n> > +}\n> > +#endif\n> > +\n> > +static SIMPLE_DEV_PM_OPS(mtk_pmic_keys_pm_ops, mtk_pmic_keys_suspend,\n> > +\t\t\tmtk_pmic_keys_resume);\n> > +\n> > +static const struct of_device_id of_mtk_pmic_keys_match_tbl[] = {\n> > +\t{\n> > +\t\t.compatible = \"mediatek,mt6397-keys\",\n> > +\t\t.data = &mt6397_regs,\n> > +\t}, {\n> > +\t\t.compatible = \"mediatek,mt6323-keys\",\n> > +\t\t.data = &mt6323_regs,\n> > +\t}, {\n> > +\t\t/* sentinel */\n> > +\t}\n> > +};\n> > +MODULE_DEVICE_TABLE(of, of_mtk_pmic_keys_match_tbl);\n> > +\n> > +static int mtk_pmic_keys_probe(struct platform_device *pdev)\n> > +{\n> > +\tint error, index = 0;\n> > +\tunsigned int keycount;\n> > +\tstruct mt6397_chip *pmic_chip = dev_get_drvdata(pdev->dev.parent);\n> > +\tstruct device_node *node = pdev->dev.of_node, *child;\n> > +\tstruct mtk_pmic_keys *keys;\n> > +\tconst struct mtk_pmic_regs *mtk_pmic_regs;\n> > +\tstruct input_dev *input_dev;\n> > +\tconst struct of_device_id *of_id =\n> > +\t\tof_match_device(of_mtk_pmic_keys_match_tbl, &pdev->dev);\n> > +\n> > +\tkeys = devm_kzalloc(&pdev->dev, sizeof(*keys), GFP_KERNEL);\n> > +\tif (!keys)\n> > +\t\treturn -ENOMEM;\n> > +\n> > +\tkeys->dev = &pdev->dev;\n> > +\tkeys->regmap = pmic_chip->regmap;\n> > +\tmtk_pmic_regs = of_id->data;\n> > +\n> > +\tkeys->input_dev = input_dev = devm_input_allocate_device(keys->dev);\n> > +\tif (!input_dev) {\n> > +\t\tdev_err(keys->dev, \"input allocate device fail.\\n\");\n> > +\t\treturn -ENOMEM;\n> > +\t}\n> > +\n> > +\tinput_dev->name = \"mtk-pmic-keys\";\n> > +\tinput_dev->id.bustype = BUS_HOST;\n> > +\tinput_dev->id.vendor = 0x0001;\n> > +\tinput_dev->id.product = 0x0001;\n> > +\tinput_dev->id.version = 0x0001;\n> > +\n> > +\tkeycount = device_get_child_node_count(keys->dev);\n> \n> Since you are using of_* API everywhere else I'd rather we used\n> of_get_available_child_count() here.\n> \n> \n> Once these 2 issues are fixed please feel free to add \n> \n> Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>\n> \n> I assume it will all go though MFD tree, right?\n\nI will fix these 2 issues and send the new version.\n\nSince patch 2,3,4,5 of this series are all for input driver, could you\nhelp to merge them with the new version later?\n\nThank you.\n\n> \n> > +\tif (keycount > MTK_PMIC_MAX_KEY_COUNT) {\n> > +\t\tdev_err(keys->dev, \"too many keys defined (%d)\\n\", keycount);\n> > +\t\treturn -EINVAL;\n> > +\t}\n> > +\n> > +\tfor_each_child_of_node(node, child) {\n> > +\t\tkeys->keys[index].regs = &mtk_pmic_regs->keys_regs[index];\n> > +\n> > +\t\tkeys->keys[index].irq = platform_get_irq(pdev, index);\n> > +\t\tif (keys->keys[index].irq < 0)\n> > +\t\t\treturn keys->keys[index].irq;\n> > +\n> > +\t\terror = of_property_read_u32(child,\n> > +\t\t\t\"linux,keycodes\", &keys->keys[index].keycode);\n> > +\t\tif (error) {\n> > +\t\t\tdev_err(keys->dev,\n> > +\t\t\t\t\"failed to read key:%d linux,keycode property: %d\\n\",\n> > +\t\t\t\tindex, error);\n> > +\t\t\treturn error;\n> > +\t\t}\n> > +\n> > +\t\tif (of_property_read_bool(child, \"wakeup-source\"))\n> > +\t\t\tkeys->keys[index].wakeup = true;\n> > +\n> > +\t\terror = mtk_pmic_key_setup(keys, &keys->keys[index]);\n> > +\t\tif (error)\n> > +\t\t\treturn error;\n> > +\n> > +\t\tindex++;\n> > +\t}\n> > +\n> > +\terror = input_register_device(input_dev);\n> > +\tif (error) {\n> > +\t\tdev_err(&pdev->dev,\n> > +\t\t\t\"register input device failed (%d)\\n\", error);\n> > +\t\treturn error;\n> > +\t}\n> > +\n> > +\tmtk_pmic_keys_lp_reset_setup(keys, mtk_pmic_regs->pmic_rst_reg);\n> > +\n> > +\tplatform_set_drvdata(pdev, keys);\n> > +\n> > +\treturn 0;\n> > +}\n> > +\n> > +static struct platform_driver pmic_keys_pdrv = {\n> > +\t.probe = mtk_pmic_keys_probe,\n> > +\t.driver = {\n> > +\t\t   .name = \"mtk-pmic-keys\",\n> > +\t\t   .of_match_table = of_mtk_pmic_keys_match_tbl,\n> > +\t\t   .pm = &mtk_pmic_keys_pm_ops,\n> > +\t},\n> > +};\n> > +\n> > +module_platform_driver(pmic_keys_pdrv);\n> > +\n> > +MODULE_LICENSE(\"GPL v2\");\n> > +MODULE_AUTHOR(\"Chen Zhong <chen.zhong@mediatek.com>\");\n> > +MODULE_DESCRIPTION(\"MTK pmic-keys driver v0.1\");\n> > -- \n> > 1.7.9.5\n> > \n> \n> Thanks.\n> \n\n\n--\nTo unsubscribe from this list: send the line \"unsubscribe devicetree\" in\nthe body of a message to majordomo@vger.kernel.org\nMore majordomo info at  http://vger.kernel.org/majordomo-info.html","headers":{"Return-Path":"<devicetree-owner@vger.kernel.org>","X-Original-To":"incoming-dt@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming-dt@bilbo.ozlabs.org","Authentication-Results":"ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=devicetree-owner@vger.kernel.org; receiver=<UNKNOWN>)","Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3yLp962zXpz9sBd\n\tfor <incoming-dt@patchwork.ozlabs.org>;\n\tTue, 24 Oct 2017 20:38:02 +1100 (AEDT)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751984AbdJXJhp (ORCPT\n\t<rfc822;incoming-dt@patchwork.ozlabs.org>);\n\tTue, 24 Oct 2017 05:37:45 -0400","from mailgw01.mediatek.com ([210.61.82.183]:55806 \"EHLO\n\tmailgw01.mediatek.com\" rhost-flags-OK-FAIL-OK-FAIL) by\n\tvger.kernel.org with ESMTP id S1751935AbdJXJhn (ORCPT\n\t<rfc822; devicetree@vger.kernel.org>); Tue, 24 Oct 2017 05:37:43 -0400","from mtkcas08.mediatek.inc [(172.21.101.126)] by\n\tmailgw01.mediatek.com (envelope-from <chen.zhong@mediatek.com>)\n\t(mhqrelay.mediatek.com ESMTP with TLS)\n\twith ESMTP id 630292557; Tue, 24 Oct 2017 17:37:37 +0800","from MTKCAS32.mediatek.inc (172.27.4.184) by\n\tmtkmbs08n1.mediatek.inc\n\t(172.21.101.55) with Microsoft SMTP Server (TLS) id 15.0.1210.3;\n\tTue, 24 Oct 2017 17:37:35 +0800","from [10.17.3.153] (10.17.3.153) by MTKCAS32.mediatek.inc\n\t(172.27.4.170) with Microsoft SMTP Server id 15.0.1210.3 via Frontend\n\tTransport; Tue, 24 Oct 2017 17:37:34 +0800"],"X-UUID":"c4ff1355349940d2af4a38b5b5a2eb33-20171024","Message-ID":"<1508837852.4057.6.camel@mhfsdcap03>","Subject":"Re: [PATCH v5 5/6] input: Add MediaTek PMIC keys support","From":"Chen Zhong <chen.zhong@mediatek.com>","To":"Dmitry Torokhov <dmitry.torokhov@gmail.com>","CC":"Rob Herring <robh+dt@kernel.org>, Lee Jones <lee.jones@linaro.org>,\n\tAlexandre Belloni <alexandre.belloni@free-electrons.com>,\n\tMark Rutland <mark.rutland@arm.com>,\n\tMatthias Brugger <matthias.bgg@gmail.com>,\n\t\"Eddie Huang\" <eddie.huang@mediatek.com>,\n\tAlessandro Zummo <a.zummo@towertech.it>,\n\tLinus Walleij <linus.walleij@linaro.org>,\n\tChanwoo Choi <cw00.choi@samsung.com>,\n\tJaechul Lee <jcsing.lee@samsung.com>, \n\tAndi Shyti <andi.shyti@samsung.com>,\n\t<linux-input@vger.kernel.org>, <devicetree@vger.kernel.org>,\n\t<linux-kernel@vger.kernel.org>, <linux-arm-kernel@lists.infradead.org>,\n\t<linux-mediatek@lists.infradead.org>, <linux-rtc@vger.kernel.org>","Date":"Tue, 24 Oct 2017 17:37:32 +0800","In-Reply-To":"<20171024054409.6qbuzenzymkkjdth@dtor-ws>","References":"<1506509048-19032-1-git-send-email-chen.zhong@mediatek.com>\n\t<1506509048-19032-6-git-send-email-chen.zhong@mediatek.com>\n\t<20171024054409.6qbuzenzymkkjdth@dtor-ws>","Content-Type":"text/plain; charset=\"UTF-8\"","X-Mailer":"Evolution 3.2.3-0ubuntu6 ","Content-Transfer-Encoding":"7bit","MIME-Version":"1.0","X-MTK":"N","Sender":"devicetree-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<devicetree.vger.kernel.org>","X-Mailing-List":"devicetree@vger.kernel.org"}},{"id":1793413,"web_url":"http://patchwork.ozlabs.org/comment/1793413/","msgid":"<20171024191632.ywzv4uxm24ewuu6u@dtor-ws>","list_archive_url":null,"date":"2017-10-24T19:16:32","subject":"Re: [PATCH v5 5/6] input: Add MediaTek PMIC keys support","submitter":{"id":695,"url":"http://patchwork.ozlabs.org/api/people/695/","name":"Dmitry Torokhov","email":"dmitry.torokhov@gmail.com"},"content":"On Tue, Oct 24, 2017 at 05:37:32PM +0800, Chen Zhong wrote:\n> On Mon, 2017-10-23 at 22:44 -0700, Dmitry Torokhov wrote:\n> > On Wed, Sep 27, 2017 at 06:44:07PM +0800, Chen Zhong wrote:\n> > > This patch add support to handle MediaTek PMIC MT6397/MT6323 key\n> > > interrupts including pwrkey and homekey, also add setting for\n> > > long press key shutdown behavior.\n> > > \n> > > Signed-off-by: Chen Zhong <chen.zhong@mediatek.com>\n> > > ---\n> > >  drivers/input/keyboard/Kconfig         |    9 +\n> > >  drivers/input/keyboard/Makefile        |    1 +\n> > >  drivers/input/keyboard/mtk-pmic-keys.c |  341 ++++++++++++++++++++++++++++++++\n> > >  3 files changed, 351 insertions(+)\n> > >  create mode 100644 drivers/input/keyboard/mtk-pmic-keys.c\n> > > \n> > > diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig\n> > > index 4c4ab1c..bd4e20a 100644\n> > > --- a/drivers/input/keyboard/Kconfig\n> > > +++ b/drivers/input/keyboard/Kconfig\n> > > @@ -756,4 +756,13 @@ config KEYBOARD_BCM\n> > >  \t  To compile this driver as a module, choose M here: the\n> > >  \t  module will be called bcm-keypad.\n> > >  \n> > > +config KEYBOARD_MTK_PMIC\n> > > +\ttristate \"MediaTek PMIC keys support\"\n> > > +\tdepends on MFD_MT6397\n> > > +\thelp\n> > > +\t  Say Y here if you want to use the pmic keys (powerkey/homekey).\n> > > +\n> > > +\t  To compile this driver as a module, choose M here: the\n> > > +\t  module will be called pmic-keys.\n> > > +\n> > >  endif\n> > > diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile\n> > > index d2338ba..20c0b98 100644\n> > > --- a/drivers/input/keyboard/Makefile\n> > > +++ b/drivers/input/keyboard/Makefile\n> > > @@ -40,6 +40,7 @@ obj-$(CONFIG_KEYBOARD_MATRIX)\t\t+= matrix_keypad.o\n> > >  obj-$(CONFIG_KEYBOARD_MAX7359)\t\t+= max7359_keypad.o\n> > >  obj-$(CONFIG_KEYBOARD_MCS)\t\t+= mcs_touchkey.o\n> > >  obj-$(CONFIG_KEYBOARD_MPR121)\t\t+= mpr121_touchkey.o\n> > > +obj-$(CONFIG_KEYBOARD_MTK_PMIC) \t+= mtk-pmic-keys.o\n> > >  obj-$(CONFIG_KEYBOARD_NEWTON)\t\t+= newtonkbd.o\n> > >  obj-$(CONFIG_KEYBOARD_NOMADIK)\t\t+= nomadik-ske-keypad.o\n> > >  obj-$(CONFIG_KEYBOARD_NSPIRE)\t\t+= nspire-keypad.o\n> > > diff --git a/drivers/input/keyboard/mtk-pmic-keys.c b/drivers/input/keyboard/mtk-pmic-keys.c\n> > > new file mode 100644\n> > > index 0000000..529fd95\n> > > --- /dev/null\n> > > +++ b/drivers/input/keyboard/mtk-pmic-keys.c\n> > > @@ -0,0 +1,341 @@\n> > > +/*\n> > > + * Copyright (C) 2017 MediaTek, Inc.\n> > > + *\n> > > + * Author: Chen Zhong <chen.zhong@mediatek.com>\n> > > + *\n> > > + * This software is licensed under the terms of the GNU General Public\n> > > + * License version 2, as published by the Free Software Foundation, and\n> > > + * may be copied, distributed, and modified under those terms.\n> > > + *\n> > > + * This program is distributed in the hope that it will be useful,\n> > > + * but WITHOUT ANY WARRANTY; without even the implied warranty of\n> > > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n> > > + * GNU General Public License for more details.\n> > > + *\n> > > + */\n> > > +\n> > > +#include <linux/module.h>\n> > > +#include <linux/kernel.h>\n> > > +#include <linux/input.h>\n> > > +#include <linux/interrupt.h>\n> > > +#include <linux/platform_device.h>\n> > > +#include <linux/kernel.h>\n> > > +#include <linux/of.h>\n> > > +#include <linux/of_device.h>\n> > > +#include <linux/regmap.h>\n> > > +#include <linux/mfd/mt6323/registers.h>\n> > > +#include <linux/mfd/mt6397/registers.h>\n> > > +#include <linux/mfd/mt6397/core.h>\n> > > +\n> > > +#define MTK_PMIC_PWRKEY_RST_EN_MASK\t0x1\n> > > +#define MTK_PMIC_PWRKEY_RST_EN_SHIFT\t6\n> > > +#define MTK_PMIC_HOMEKEY_RST_EN_MASK\t0x1\n> > > +#define MTK_PMIC_HOMEKEY_RST_EN_SHIFT\t5\n> > > +#define MTK_PMIC_RST_DU_MASK\t\t0x3\n> > > +#define MTK_PMIC_RST_DU_SHIFT\t\t8\n> > > +\n> > > +#define MTK_PMIC_PWRKEY_RST\t\t\\\n> > > +\t(MTK_PMIC_PWRKEY_RST_EN_MASK << MTK_PMIC_PWRKEY_RST_EN_SHIFT)\n> > > +#define MTK_PMIC_HOMEKEY_RST\t\t\\\n> > > +\t(MTK_PMIC_HOMEKEY_RST_EN_MASK << MTK_PMIC_HOMEKEY_RST_EN_SHIFT)\n> > > +\n> > > +#define MTK_PMIC_PWRKEY_INDEX\t0\n> > > +#define MTK_PMIC_HOMEKEY_INDEX\t1\n> > > +#define MTK_PMIC_MAX_KEY_COUNT\t2\n> > > +\n> > > +struct mtk_pmic_keys_regs {\n> > > +\tu32 deb_reg;\n> > > +\tu32 deb_mask;\n> > > +\tu32 intsel_reg;\n> > > +\tu32 intsel_mask;\n> > > +};\n> > > +\n> > > +#define MTK_PMIC_KEYS_REGS(_deb_reg, _deb_mask,\t\t\\\n> > > +\t_intsel_reg, _intsel_mask)\t\t\t\\\n> > > +{\t\t\t\t\t\t\t\\\n> > > +\t.deb_reg\t\t= _deb_reg,\t\t\\\n> > > +\t.deb_mask\t\t= _deb_mask,\t\t\\\n> > > +\t.intsel_reg\t\t= _intsel_reg,\t\t\\\n> > > +\t.intsel_mask\t\t= _intsel_mask,\t\t\\\n> > > +}\n> > > +\n> > > +struct mtk_pmic_regs {\n> > > +\tconst struct mtk_pmic_keys_regs keys_regs[MTK_PMIC_MAX_KEY_COUNT];\n> > > +\tu32 pmic_rst_reg;\n> > > +};\n> > > +\n> > > +static const struct mtk_pmic_regs mt6397_regs = {\n> > > +\t.keys_regs[MTK_PMIC_PWRKEY_INDEX] =\n> > > +\t\tMTK_PMIC_KEYS_REGS(MT6397_CHRSTATUS,\n> > > +\t\t0x8, MT6397_INT_RSV, 0x10),\n> > > +\t.keys_regs[MTK_PMIC_HOMEKEY_INDEX] =\n> > > +\t\tMTK_PMIC_KEYS_REGS(MT6397_OCSTATUS2,\n> > > +\t\t0x10, MT6397_INT_RSV, 0x8),\n> > > +\t.pmic_rst_reg = MT6397_TOP_RST_MISC,\n> > > +};\n> > > +\n> > > +static const struct mtk_pmic_regs mt6323_regs = {\n> > > +\t.keys_regs[MTK_PMIC_PWRKEY_INDEX] =\n> > > +\t\tMTK_PMIC_KEYS_REGS(MT6323_CHRSTATUS,\n> > > +\t\t0x2, MT6323_INT_MISC_CON, 0x10),\n> > > +\t.keys_regs[MTK_PMIC_HOMEKEY_INDEX] =\n> > > +\t\tMTK_PMIC_KEYS_REGS(MT6323_CHRSTATUS,\n> > > +\t\t0x4, MT6323_INT_MISC_CON, 0x8),\n> > > +\t.pmic_rst_reg = MT6323_TOP_RST_MISC,\n> > > +};\n> > > +\n> > > +struct mtk_pmic_keys_info {\n> > > +\tstruct mtk_pmic_keys *keys;\n> > > +\tconst struct mtk_pmic_keys_regs *regs;\n> > > +\tunsigned int keycode;\n> > > +\tint irq;\n> > > +\tbool wakeup:1;\n> > > +};\n> > > +\n> > > +struct mtk_pmic_keys {\n> > > +\tstruct input_dev *input_dev;\n> > > +\tstruct device *dev;\n> > > +\tstruct regmap *regmap;\n> > > +\tstruct mtk_pmic_keys_info keys[MTK_PMIC_MAX_KEY_COUNT];\n> > > +};\n> > > +\n> > > +enum mtk_pmic_keys_lp_mode {\n> > > +\tLP_DISABLE,\n> > > +\tLP_ONEKEY,\n> > > +\tLP_TWOKEY,\n> > > +};\n> > > +\n> > > +static void mtk_pmic_keys_lp_reset_setup(struct mtk_pmic_keys *keys,\n> > > +\t\tu32 pmic_rst_reg)\n> > > +{\n> > > +\tint ret;\n> > > +\tu32 long_press_mode, long_press_debounce;\n> > > +\n> > > +\tret = of_property_read_u32(keys->dev->of_node,\n> > > +\t\t\"power-off-time-sec\", &long_press_debounce);\n> > > +\tif (ret)\n> > > +\t\tlong_press_debounce = 0;\n> > > +\n> > > +\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> > > +\t\t\t   MTK_PMIC_RST_DU_MASK << MTK_PMIC_RST_DU_SHIFT,\n> > > +\t\t\t   long_press_debounce << MTK_PMIC_RST_DU_SHIFT);\n> > > +\n> > > +\tret = of_property_read_u32(keys->dev->of_node,\n> > > +\t\t\"mediatek,long-press-mode\", &long_press_mode);\n> > > +\tif (ret)\n> > > +\t\tlong_press_mode = LP_DISABLE;\n> > > +\n> > > +\tswitch (long_press_mode) {\n> > > +\tcase LP_ONEKEY:\n> > > +\t\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> > > +\t\t\t\t   MTK_PMIC_PWRKEY_RST,\n> > > +\t\t\t\t   MTK_PMIC_PWRKEY_RST);\n> > > +\t\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> > > +\t\t\t\t   MTK_PMIC_HOMEKEY_RST,\n> > > +\t\t\t\t   0);\n> > > +\t\tbreak;\n> > > +\tcase LP_TWOKEY:\n> > > +\t\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> > > +\t\t\t\t   MTK_PMIC_PWRKEY_RST,\n> > > +\t\t\t\t   MTK_PMIC_PWRKEY_RST);\n> > > +\t\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> > > +\t\t\t\t   MTK_PMIC_HOMEKEY_RST,\n> > > +\t\t\t\t   MTK_PMIC_HOMEKEY_RST);\n> > > +\t\tbreak;\n> > > +\tcase LP_DISABLE:\n> > > +\t\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> > > +\t\t\t\t   MTK_PMIC_PWRKEY_RST,\n> > > +\t\t\t\t   0);\n> > > +\t\tregmap_update_bits(keys->regmap, pmic_rst_reg,\n> > > +\t\t\t\t   MTK_PMIC_HOMEKEY_RST,\n> > > +\t\t\t\t   0);\n> > > +\t\tbreak;\n> > > +\tdefault:\n> > > +\t\tbreak;\n> > > +\t}\n> > > +}\n> > > +\n> > > +static irqreturn_t mtk_pmic_keys_irq_handler_thread(int irq, void *data)\n> > > +{\n> > > +\tstruct mtk_pmic_keys_info *info = data;\n> > > +\tu32 key_deb, pressed;\n> > > +\n> > > +\tregmap_read(info->keys->regmap, info->regs->deb_reg, &key_deb);\n> > > +\n> > > +\tkey_deb &= info->regs->deb_mask;\n> > > +\n> > > +\tpressed = !key_deb;\n> > > +\n> > > +\tinput_report_key(info->keys->input_dev, info->keycode, pressed);\n> > > +\tinput_sync(info->keys->input_dev);\n> > > +\n> > > +\tdev_dbg(info->keys->dev, \"(%s) key =%d using PMIC\\n\",\n> > > +\t\t pressed ? \"pressed\" : \"released\", info->keycode);\n> > > +\n> > > +\treturn IRQ_HANDLED;\n> > > +}\n> > > +\n> > > +static int mtk_pmic_key_setup(struct mtk_pmic_keys *keys,\n> > > +\t\tstruct mtk_pmic_keys_info *info)\n> > > +{\n> > > +\tint ret;\n> > > +\n> > > +\tinfo->keys = keys;\n> > > +\n> > > +\tret = regmap_update_bits(keys->regmap, info->regs->intsel_reg,\n> > > +\t\t\t\t info->regs->intsel_mask,\n> > > +\t\t\t\t info->regs->intsel_mask);\n> > > +\tif (ret < 0)\n> > > +\t\treturn ret;\n> > > +\n> > > +\tret = devm_request_threaded_irq(keys->dev, info->irq, NULL,\n> > > +\t\t\t\t\tmtk_pmic_keys_irq_handler_thread,\n> > > +\t\t\t\t\tIRQF_ONESHOT | IRQF_TRIGGER_HIGH,\n> > > +\t\t\t\t\t\"mtk-pmic-keys\", info);\n> > > +\tif (ret) {\n> > > +\t\tdev_err(keys->dev, \"Failed to request IRQ: %d: %d\\n\",\n> > > +\t\t\tinfo->irq, ret);\n> > > +\t\treturn ret;\n> > > +\t}\n> > > +\n> > > +\tinput_set_capability(keys->input_dev, EV_KEY, info->keycode);\n> > > +\n> > > +\treturn 0;\n> > > +}\n> > > +\n> > > +#ifdef CONFIG_PM_SLEEP\n> > > +static int mtk_pmic_keys_suspend(struct device *dev)\n> > \n> > Please use __maybe_unused annotation instead of #ifdef guard.\n> > \n> > > +{\n> > > +\tstruct mtk_pmic_keys *keys = dev_get_drvdata(dev);\n> > > +\tint index;\n> > > +\n> > > +\tfor (index = 0; index < MTK_PMIC_MAX_KEY_COUNT; index++) {\n> > > +\t\tif (keys->keys[index].wakeup)\n> > > +\t\t\tenable_irq_wake(keys->keys[index].irq);\n> > > +\t}\n> > > +\n> > > +\treturn 0;\n> > > +}\n> > > +\n> > > +static int mtk_pmic_keys_resume(struct device *dev)\n> > \n> > __maybe_unused here as well.\n> > \n> > > +{\n> > > +\tstruct mtk_pmic_keys *keys = dev_get_drvdata(dev);\n> > > +\tint index;\n> > > +\n> > > +\tfor (index = 0; index < MTK_PMIC_MAX_KEY_COUNT; index++) {\n> > > +\t\tif (keys->keys[index].wakeup)\n> > > +\t\t\tdisable_irq_wake(keys->keys[index].irq);\n> > > +\t}\n> > > +\n> > > +\treturn 0;\n> > > +}\n> > > +#endif\n> > > +\n> > > +static SIMPLE_DEV_PM_OPS(mtk_pmic_keys_pm_ops, mtk_pmic_keys_suspend,\n> > > +\t\t\tmtk_pmic_keys_resume);\n> > > +\n> > > +static const struct of_device_id of_mtk_pmic_keys_match_tbl[] = {\n> > > +\t{\n> > > +\t\t.compatible = \"mediatek,mt6397-keys\",\n> > > +\t\t.data = &mt6397_regs,\n> > > +\t}, {\n> > > +\t\t.compatible = \"mediatek,mt6323-keys\",\n> > > +\t\t.data = &mt6323_regs,\n> > > +\t}, {\n> > > +\t\t/* sentinel */\n> > > +\t}\n> > > +};\n> > > +MODULE_DEVICE_TABLE(of, of_mtk_pmic_keys_match_tbl);\n> > > +\n> > > +static int mtk_pmic_keys_probe(struct platform_device *pdev)\n> > > +{\n> > > +\tint error, index = 0;\n> > > +\tunsigned int keycount;\n> > > +\tstruct mt6397_chip *pmic_chip = dev_get_drvdata(pdev->dev.parent);\n> > > +\tstruct device_node *node = pdev->dev.of_node, *child;\n> > > +\tstruct mtk_pmic_keys *keys;\n> > > +\tconst struct mtk_pmic_regs *mtk_pmic_regs;\n> > > +\tstruct input_dev *input_dev;\n> > > +\tconst struct of_device_id *of_id =\n> > > +\t\tof_match_device(of_mtk_pmic_keys_match_tbl, &pdev->dev);\n> > > +\n> > > +\tkeys = devm_kzalloc(&pdev->dev, sizeof(*keys), GFP_KERNEL);\n> > > +\tif (!keys)\n> > > +\t\treturn -ENOMEM;\n> > > +\n> > > +\tkeys->dev = &pdev->dev;\n> > > +\tkeys->regmap = pmic_chip->regmap;\n> > > +\tmtk_pmic_regs = of_id->data;\n> > > +\n> > > +\tkeys->input_dev = input_dev = devm_input_allocate_device(keys->dev);\n> > > +\tif (!input_dev) {\n> > > +\t\tdev_err(keys->dev, \"input allocate device fail.\\n\");\n> > > +\t\treturn -ENOMEM;\n> > > +\t}\n> > > +\n> > > +\tinput_dev->name = \"mtk-pmic-keys\";\n> > > +\tinput_dev->id.bustype = BUS_HOST;\n> > > +\tinput_dev->id.vendor = 0x0001;\n> > > +\tinput_dev->id.product = 0x0001;\n> > > +\tinput_dev->id.version = 0x0001;\n> > > +\n> > > +\tkeycount = device_get_child_node_count(keys->dev);\n> > \n> > Since you are using of_* API everywhere else I'd rather we used\n> > of_get_available_child_count() here.\n> > \n> > \n> > Once these 2 issues are fixed please feel free to add \n> > \n> > Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>\n> > \n> > I assume it will all go though MFD tree, right?\n> \n> I will fix these 2 issues and send the new version.\n> \n> Since patch 2,3,4,5 of this series are all for input driver, could you\n> help to merge them with the new version later?\n\nEven though they applicable to the input component they do touch MFD\ndomain... Lee, how do you want to proceed here so we do not hold up the\npatch series for too long?\n\nThanks.","headers":{"Return-Path":"<devicetree-owner@vger.kernel.org>","X-Original-To":"incoming-dt@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming-dt@bilbo.ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=devicetree-owner@vger.kernel.org; receiver=<UNKNOWN>)","ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=gmail.com header.i=@gmail.com\n\theader.b=\"Rl0bZArt\"; dkim-atps=neutral"],"Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3yM3125Fpyz9t2W\n\tfor <incoming-dt@patchwork.ozlabs.org>;\n\tWed, 25 Oct 2017 06:16:54 +1100 (AEDT)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751511AbdJXTQi (ORCPT\n\t<rfc822;incoming-dt@patchwork.ozlabs.org>);\n\tTue, 24 Oct 2017 15:16:38 -0400","from mail-io0-f196.google.com ([209.85.223.196]:47399 \"EHLO\n\tmail-io0-f196.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1751280AbdJXTQh (ORCPT\n\t<rfc822; devicetree@vger.kernel.org>); Tue, 24 Oct 2017 15:16:37 -0400","by mail-io0-f196.google.com with SMTP id h70so25046232ioi.4;\n\tTue, 24 Oct 2017 12:16:36 -0700 (PDT)","from dtor-ws ([2620:0:1000:1611:da80:8749:c06f:9515])\n\tby smtp.gmail.com with ESMTPSA id\n\t133sm461471itw.24.2017.10.24.12.16.34\n\t(version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256);\n\tTue, 24 Oct 2017 12:16:35 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;\n\th=date:from:to:cc:subject:message-id:references:mime-version\n\t:content-disposition:in-reply-to:user-agent;\n\tbh=Cen9IF7O/P4mn6WX90QN2cwnUe4Mw5amixg/Yk+MGuw=;\n\tb=Rl0bZArtIPkfD5FXZUGzzuZzX5oSEeFGAhZSNbhisXgF2WFJRuk34TCDp3FAJ9clOb\n\tBLlUljLkvTtJ9zO8S2jPwR0oXaeO5BI2w2DIobGC17Uaqfkm/OnEd3qfu9ttVJTnmcJ/\n\tbXqIekfTjLrNAzMIZjawFX04daQNrhc3vSasSak1Jy3bm6CD9wwb9dOXalD7aecb2284\n\tm42zQVFpDq4LwGbqg0FVQRdhW3kFoudF693VyKqjYcj8J+cKSUiWDKeaZyJJSve+r1hg\n\tXwrj1b8refFZNs8v+ZKBYaDH+6ZF4ZwNzXYVZTt1y8BOi4igGeGgSaE2mDkFK0uex+62\n\toNcA==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:date:from:to:cc:subject:message-id:references\n\t:mime-version:content-disposition:in-reply-to:user-agent;\n\tbh=Cen9IF7O/P4mn6WX90QN2cwnUe4Mw5amixg/Yk+MGuw=;\n\tb=BH5Wjr0GW8YKSIQOKh0fAFB6NVmchF6uXwo5i7p2soJ1CYsydjf+BwpwRyMK0YdcO+\n\tGjJkl2tRPQ3WO1juDeGe2fvK+rkgtHnGpNPm1khKRZURqpTLXaoidR18gT+dmEpX8seU\n\trA8642T0zraieL0CcoyTcFtbcY1KL+UaMDITgkDXfE3+2AsMdpJB8ReQHyXtbLyWafHq\n\tjQ7vRzxJ8VauQc/KBk0MmdJhoNQCacLtJBf/6xsIVaFy+trJ/WH9qS5hF80MG8IJ5JW3\n\t2qbI2z6vCXssJXK3dymGKcNY2ju6/FnUs3Wo3wtQpkFeCJqFDTernhAUh0H/RvjzQeF8\n\tQz6w==","X-Gm-Message-State":"AMCzsaVXMfnyd4RPkNsuqNOP2/BFY5AHWiQuJkRr1GCOLbuH0w5WI0Z8\n\tof2MMBFNwTpwP/jtit2ZsZk=","X-Google-Smtp-Source":"ABhQp+QtPoXnbHK3jyf4Jawox0uWJhwQEblRXzun7UOseA/whIrSWIXMGWEJH/3sMioUdPqm7g/g6Q==","X-Received":"by 10.107.18.170 with SMTP id 42mr23325483ios.55.1508872595967; \n\tTue, 24 Oct 2017 12:16:35 -0700 (PDT)","Date":"Tue, 24 Oct 2017 12:16:32 -0700","From":"Dmitry Torokhov <dmitry.torokhov@gmail.com>","To":"Chen Zhong <chen.zhong@mediatek.com>","Cc":"Rob Herring <robh+dt@kernel.org>, Lee Jones <lee.jones@linaro.org>,\n\tAlexandre Belloni <alexandre.belloni@free-electrons.com>,\n\tMark Rutland <mark.rutland@arm.com>,\n\tMatthias Brugger <matthias.bgg@gmail.com>,\n\tEddie Huang <eddie.huang@mediatek.com>,\n\tAlessandro Zummo <a.zummo@towertech.it>,\n\tLinus Walleij <linus.walleij@linaro.org>,\n\tChanwoo Choi <cw00.choi@samsung.com>,\n\tJaechul Lee <jcsing.lee@samsung.com>, \n\tAndi Shyti <andi.shyti@samsung.com>,\n\tlinux-input@vger.kernel.org, devicetree@vger.kernel.org,\n\tlinux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org,\n\tlinux-mediatek@lists.infradead.org, linux-rtc@vger.kernel.org","Subject":"Re: [PATCH v5 5/6] input: Add MediaTek PMIC keys support","Message-ID":"<20171024191632.ywzv4uxm24ewuu6u@dtor-ws>","References":"<1506509048-19032-1-git-send-email-chen.zhong@mediatek.com>\n\t<1506509048-19032-6-git-send-email-chen.zhong@mediatek.com>\n\t<20171024054409.6qbuzenzymkkjdth@dtor-ws>\n\t<1508837852.4057.6.camel@mhfsdcap03>","MIME-Version":"1.0","Content-Type":"text/plain; charset=us-ascii","Content-Disposition":"inline","In-Reply-To":"<1508837852.4057.6.camel@mhfsdcap03>","User-Agent":"NeoMutt/20170609 (1.8.3)","Sender":"devicetree-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<devicetree.vger.kernel.org>","X-Mailing-List":"devicetree@vger.kernel.org"}},{"id":1794100,"web_url":"http://patchwork.ozlabs.org/comment/1794100/","msgid":"<20171026082744.GA29398@gangnam>","list_archive_url":null,"date":"2017-10-26T08:27:44","subject":"Re: [PATCH v5 5/6] input: Add MediaTek PMIC keys support","submitter":{"id":68190,"url":"http://patchwork.ozlabs.org/api/people/68190/","name":"Andi Shyti","email":"andi.shyti@samsung.com"},"content":"Hi,\n\nOn Wed, Sep 27, 2017 at 06:44:07PM +0800, Chen Zhong wrote:\n> This patch add support to handle MediaTek PMIC MT6397/MT6323 key\n> interrupts including pwrkey and homekey, also add setting for\n> long press key shutdown behavior.\n> \n> Signed-off-by: Chen Zhong <chen.zhong@mediatek.com>\n\nif you want you can add:\n\nReviewed-by: Andi Shyti <andi.shyti@samsung.com>\n\nAndi\n--\nTo unsubscribe from this list: send the line \"unsubscribe devicetree\" in\nthe body of a message to majordomo@vger.kernel.org\nMore majordomo info at  http://vger.kernel.org/majordomo-info.html","headers":{"Return-Path":"<devicetree-owner@vger.kernel.org>","X-Original-To":"incoming-dt@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming-dt@bilbo.ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=devicetree-owner@vger.kernel.org; receiver=<UNKNOWN>)","ozlabs.org;\n\tdkim=fail reason=\"unknown key hash\" (0-bit key;\n\tunprotected) header.d=samsung.com header.i=@samsung.com\n\theader.b=\"Xw5dG4gr\"; dkim-atps=neutral"],"Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3yN0b63pJhz9t3Z\n\tfor <incoming-dt@patchwork.ozlabs.org>;\n\tThu, 26 Oct 2017 19:31:14 +1100 (AEDT)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S932399AbdJZIay (ORCPT <rfc822; incoming-dt@patchwork.ozlabs.org>);\n\tThu, 26 Oct 2017 04:30:54 -0400","from mailout2.samsung.com ([203.254.224.25]:27132 \"EHLO\n\tmailout2.samsung.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S932285AbdJZI1V (ORCPT\n\t<rfc822; devicetree@vger.kernel.org>); Thu, 26 Oct 2017 04:27:21 -0400","from epcas1p2.samsung.com (unknown [182.195.41.46])\n\tby mailout2.samsung.com (KnoxPortal) with ESMTP id\n\t20171026082718epoutp02975a8962a34b036c9a5e4aaf19253cc5~xEVx1LBFG1828418284epoutp02J;\n\tThu, 26 Oct 2017 08:27:18 +0000 (GMT)","from epsmges1p2.samsung.com (unknown [182.195.40.68]) by\n\tepcas1p1.samsung.com (KnoxPortal) with ESMTP id\n\t20171026082718epcas1p1726067a858c9d5797ec85ba1f22ad642~xEVxhhv_A2434524345epcas1p1h;\n\tThu, 26 Oct 2017 08:27:18 +0000 (GMT)","from epcas1p4.samsung.com ( [182.195.41.48]) by\n\tepsmges1p2.samsung.com (Symantec Messaging Gateway) with SMTP id\n\t7C.8E.04153.66C91F95; Thu, 26 Oct 2017 17:27:18 +0900 (KST)","from epsmgms2p1new.samsung.com (unknown [182.195.42.142]) by\n\tepcas1p3.samsung.com (KnoxPortal) with ESMTP id\n\t20171026082718epcas1p3b144a3dec886c8a659e1be519994c066~xEVxOyr4a0903009030epcas1p30;\n\tThu, 26 Oct 2017 08:27:18 +0000 (GMT)","from epmmp2 ( [203.254.227.17]) by epsmgms2p1new.samsung.com\n\t(Symantec Messaging Gateway) with SMTP id 83.80.04095.56C91F95;\n\tThu, 26 Oct 2017 17:27:18 +0900 (KST)","from gangnam ([10.113.62.47]) by mmp2.samsung.com (Oracle\n\tCommunications Messaging Server 7.0.5.31.0 64bit (built May 5 2014))\n\twith ESMTPA id <0OYF008398THBT40@mmp2.samsung.com>;\n\tThu, 26 Oct 2017 17:27:17 +0900 (KST)"],"DKIM-Filter":"OpenDKIM Filter v2.11.0 mailout2.samsung.com\n\t20171026082718epoutp02975a8962a34b036c9a5e4aaf19253cc5~xEVx1LBFG1828418284epoutp02J","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com;\n\ts=mail20170921; t=1509006439;\n\tbh=wf9CPVn1O8RmZiCSRDOpK2Vu/cLgHiwL+cB0g+zgjL4=;\n\th=Date:From:To:Cc:Subject:In-reply-to:References:From;\n\tb=Xw5dG4grVvzPG57afeyi63slI3mzefDEEqwE02SFeiwkHoWzfhPLaIzIOyds09qQN\n\tE/Kfzw8cIvgWRGbadS7VeqfwcF9BT2WCdYqlSMc/c0+97y+0LIlzDRK1TBuLZUNdRi\n\tGYPqj9wHlmNuTepi2VIAe0cQZxcusOTG9cLnU0HI=","X-AuditID":"b6c32a36-325ff70000001039-a0-59f19c6683c6","Date":"Thu, 26 Oct 2017 17:27:44 +0900","From":"Andi Shyti <andi.shyti@samsung.com>","To":"Chen Zhong <chen.zhong@mediatek.com>","Cc":"Dmitry Torokhov <dmitry.torokhov@gmail.com>,\n\tRob Herring <robh+dt@kernel.org>, Lee Jones <lee.jones@linaro.org>,\n\tAlexandre Belloni <alexandre.belloni@free-electrons.com>,\n\tMark Rutland <mark.rutland@arm.com>,\n\tMatthias Brugger <matthias.bgg@gmail.com>,\n\tEddie Huang <eddie.huang@mediatek.com>,\n\tAlessandro Zummo <a.zummo@towertech.it>,\n\tLinus Walleij <linus.walleij@linaro.org>,\n\tChanwoo Choi <cw00.choi@samsung.com>,\n\tJaechul Lee <jcsing.lee@samsung.com>, \n\tlinux-input@vger.kernel.org, devicetree@vger.kernel.org,\n\tlinux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org,\n\tlinux-mediatek@lists.infradead.org, linux-rtc@vger.kernel.org","Subject":"Re: [PATCH v5 5/6] input: Add MediaTek PMIC keys support","Message-id":"<20171026082744.GA29398@gangnam>","MIME-version":"1.0","Content-type":"text/plain; charset=\"us-ascii\"","Content-disposition":"inline","In-reply-to":"<1506509048-19032-6-git-send-email-chen.zhong@mediatek.com>","User-Agent":"Mutt/1.9.1 (2017-09-22)","X-Brightmail-Tracker":["H4sIAAAAAAAAA02TWUwTURSGczud6UCsDgX0BqPiGI0QqZ2yXZQajcZMIiEYXkTBOoGxJdIW\n\tO63bgyKigapExURsUNnUWHEriLhUFBCCUWJF624VjYqpiOACQYmlowlv/zn5/nPz55xLYgoX\n\tEUHmGi282cjl0USwtLE1ShWzvuJbhuqpnUa17scyVOypkaCOfQMAPfn+EUcn2rpw1Fr9CSBP\n\tT7EUfWneiyHvjzsAHf59WoKc7zw4ejbwE0fd1yoI1L3LDVD72UcEOvnELUGFRbFot6tNtljB\n\t1h2vA+x7pxuwV+2vZKzTUUKwLz03CLa+dgdb1NksZUsbHIA9cnxYwg46p6cFr+aT9TyXw5sj\n\teWO2KSfXqNPQK9K1S7XxCSomhklCiXSkkTPwGnpZSlrM8tw8fyg6chOXZ/W30jhBoOcvSjab\n\trBY+Um8SLBp6DcOolYwqUalWq5VxsVkL1PF+ZB2vbzv6HMvfiW253G4tAI0SGwgiIRUHXW9a\n\tZDYQTCqoJgAveDqlYvELwKanXsIGyADlbJ8k9i8CeOTLCSAWvQD2VRXiY6Ok1Gz4u3okMJag\n\tomDhi6GAOYyaCx/s3zjGY9QhHL5r/iMdY0KpJdBZdiXAy6l58Nz1Q7ioQ+BQ2esAg/n799vP\n\tA1FPhT1/ymVjOohi4dVrZwPecGoWdJWKESDllMFR3ydczLYMXi8pk4k6FH7uaJCJaabCh3c0\n\tIr8LwIuN3RKxKAJwpPcxIRpi4V3bTon48kTY92MfLprlsHiPQkRYOPyw+R++BD53vA5oBfUM\n\tQJePOACm2cflsY/LYx+XpxJgDjCZzxcMOl5g8tVKgTMIVqNOmW0yOEHgdKMTmkB1V0oLoEhA\n\tT5CXf+3PUODcJmGroQVAEqPD5C/Lv2Uo5Dnc1m282aQ1W/N4oQXE+3dyEIsIzzb5P4LRomXi\n\tklRxCWr/SSUxDD1FHn7Bs0pB6TgLv4Hn83nzf5+EDIooAKl1vttMqO397IXaS6dSlZXBfcmJ\n\tWTMKJoWf8oKgc6M9mZ6Qe2FAae8dTLXoBzq2bB5KGPnoTY8qra8ylxqiK3H3mTnzwravv0Gu\n\t8zasLXJM0/m2dX7omjk4cOtnauKq1Zpj0TXDJRrtzY1vM/vLHlVFvKFfrKwwxrSOFvaH+NKz\n\taKmg55hozCxwfwH20KYw0AMAAA==","H4sIAAAAAAAAA+NgFprHIsWRmVeSWpSXmKPExsVy+t9jQd20OR8jDdpuclssuXiV3aLj2mIm\n\ti+M9nxgtrn95zmox/8g5VovDi14wWlx71MFi8XZ/N7PF/a9HGS2m/FnOZLHp8TVWi5ufvrFa\n\tXN41h83icvNFRotjq6+wWSy9fpHJoqnF2KJ17xF2ByGPNfPWMHo82XSR0WPnrLvsHptWdbJ5\n\t3Lm2h81j85J6j5aT+1k8+rasYvSYPu8nk8fnTXIBXFFcNimpOZllqUX6dglcGUdm3mIuaGSu\n\t2HqstIFxG1MXIweHhICJxKZj/F2MnBxCAusYJe7s44KwXzJKXP5nAmKzCKhK/Fn0mwnEZhPQ\n\tlGi6/YMNpFVEQEPiQm8hSJhZYBqrxM1PCiC2sICjxKbJ28HKeQV0JNbunsTaxcgFNPImo8T/\n\tv6fYIBKCEj8m32OBaNaSWL/zOBOELS3x6O8MdhCbU8BDYueu1WBxUQFlib19h9gnMPLPQtI+\n\tC0n7LCTtCxiZVzFKphYU56bnFhsVGOallusVJ+YWl+al6yXn525iBMbatsNafTsY7y+JP8Qo\n\twMGoxMP74eOHSCHWxLLiytxDjBIczEoivHdmfIwU4k1JrKxKLcqPLyrNSS0+xCjNwaIkzns7\n\t71ikkEB6YklqdmpqQWoRTJaJg1OqgVHO5cCki5p3XBb21WvafT3PJVeseMrt6/SVLyZ67uzb\n\tYvdg9WuhRTxsLGdZrNrDe9dOe5HbGyuTsyl9pcWdre4xbX92f/HbuLxxjdKX9V6qeyO7jz+z\n\t2e1x+9KZB+/ty3543X5QnXlMIZyjjHVL9n3dhobi5f+P1uRWVrJbrZ0p73fcI/fxljVKLMUZ\n\tiYZazEXFiQByWSCFsQIAAA=="],"X-CMS-MailID":"20171026082718epcas1p3b144a3dec886c8a659e1be519994c066","X-Msg-Generator":"CA","CMS-TYPE":"101P","DLP-Filter":"Pass","X-CFilter-Loop":"Reflected","X-CMS-RootMailID":"20170927104421epcas2p190d03c1c6759f394debfc01b23641ece","X-RootMTR":"20170927104421epcas2p190d03c1c6759f394debfc01b23641ece","References":"<1506509048-19032-1-git-send-email-chen.zhong@mediatek.com>\n\t<CGME20170927104421epcas2p190d03c1c6759f394debfc01b23641ece@epcas2p1.samsung.com>\n\t<1506509048-19032-6-git-send-email-chen.zhong@mediatek.com>","Sender":"devicetree-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<devicetree.vger.kernel.org>","X-Mailing-List":"devicetree@vger.kernel.org"}}]