From 843da210a85bbe821e8156ebceb0458444242a3f Mon Sep 17 00:00:00 2001 From: haojl2 Date: Thu, 14 May 2020 00:38:12 +0800 Subject: [PATCH] touchscreen_mmi: Add default pinctrl methord If ts_mmi_on_state or ts_mmi_off_state pinctrl states is defined, and vendor method not defined it's pinctrl callback function. Add default pinctrl function for this situation. Change-Id: I5873980ee6425b22af1af416228481af1abe360d Signed-off-by: haojl2 Reviewed-on: https://gerrit.mot.com/1553615 SLTApproved: Slta Waiver SME-Granted: SME Approvals Granted Tested-by: Jira Key Reviewed-by: Reviewed-by: Jianqi Yang Submit-Approved: Jira Key --- .../touchscreen_mmi/touchscreen_mmi_class.c | 36 +++++++++++++++++++ include/linux/touchscreen_mmi.h | 3 ++ 2 files changed, 39 insertions(+) diff --git a/drivers/input/touchscreen/touchscreen_mmi/touchscreen_mmi_class.c b/drivers/input/touchscreen/touchscreen_mmi/touchscreen_mmi_class.c index fefeaddc2365..84298fe891c5 100644 --- a/drivers/input/touchscreen/touchscreen_mmi/touchscreen_mmi_class.c +++ b/drivers/input/touchscreen/touchscreen_mmi/touchscreen_mmi_class.c @@ -27,6 +27,7 @@ #include #include #include +#include #define FMT_STRING "%s" #define FMT_INTEGER "%d" @@ -493,6 +494,28 @@ static int get_class_fname_handler(struct device *parent, const char **pfname) return 0; } +static int ts_mmi_default_pinctrl(struct device *parent, int on) +{ + struct ts_mmi_dev *touch_cdev = ts_mmi_dev_to_cdev(parent); + + if (!touch_cdev) + return -ENODEV; + + dev_info(DEV_TS, "%s: %s\n", __func__, on ? "ACTIVE" : "SUSPEND"); + + if (on) { + if (!IS_ERR_OR_NULL(touch_cdev->pinctrl_on_state)) + pinctrl_select_state(touch_cdev->pinctrl_node, + touch_cdev->pinctrl_on_state); + } else { + if (!IS_ERR_OR_NULL(touch_cdev->pinctrl_off_state)) + pinctrl_select_state(touch_cdev->pinctrl_node, + touch_cdev->pinctrl_off_state); + } + + return 0; +} + /** * ts_mmi_dev_register - register a new object of ts_mmi_dev class. * @parent: The device to register. @@ -525,6 +548,19 @@ int ts_mmi_dev_register(struct device *parent, goto PANEL_PARSE_DT_FAILED; } + touch_cdev->pinctrl_node = devm_pinctrl_get(DEV_TS); + if (IS_ERR_OR_NULL(touch_cdev->pinctrl_node)) { + dev_info(DEV_TS, "%s: No pinctrl defined\n", __func__); + } else if (!touch_cdev->mdata->pinctrl) { + touch_cdev->pinctrl_on_state = pinctrl_lookup_state(touch_cdev->pinctrl_node, "ts_mmi_on_state"); + touch_cdev->pinctrl_off_state = pinctrl_lookup_state(touch_cdev->pinctrl_node, "ts_mmi_off_state"); + if (!IS_ERR_OR_NULL(touch_cdev->pinctrl_on_state) || + !IS_ERR_OR_NULL(touch_cdev->pinctrl_off_state)) { + dev_info(DEV_TS, "%s: No pinctrl method add default\n", __func__); + touch_cdev->mdata->pinctrl = ts_mmi_default_pinctrl; + } + } + ts_mmi_get_vendor_info(touch_cdev); ret = input_get_new_minor(-1, 1, true); diff --git a/include/linux/touchscreen_mmi.h b/include/linux/touchscreen_mmi.h index aae64bd3e698..c8e216143b3a 100644 --- a/include/linux/touchscreen_mmi.h +++ b/include/linux/touchscreen_mmi.h @@ -266,6 +266,9 @@ struct ts_mmi_dev { struct notifier_block panel_nb; struct mutex extif_mutex; struct mutex method_mutex; + struct pinctrl *pinctrl_node; + struct pinctrl_state *pinctrl_on_state; + struct pinctrl_state *pinctrl_off_state; atomic_t touch_stopped; enum ts_mmi_pm_mode pm_mode;