From patchwork Mon Jun 18 14:35:47 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vinod Koul X-Patchwork-Id: 138978 Delivered-To: patch@linaro.org Received: by 2002:a2e:970d:0:0:0:0:0 with SMTP id r13-v6csp4029746lji; Mon, 18 Jun 2018 07:36:23 -0700 (PDT) X-Google-Smtp-Source: ADUXVKKSKI1z0fGa9z68Cz+DTMBkKTOOy2eInft3YnLvFY60Ecv8oOHWzBaRlZKa9fEbwoih+IBz X-Received: by 2002:a63:931c:: with SMTP id b28-v6mr11398341pge.167.1529332583033; Mon, 18 Jun 2018 07:36:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1529332583; cv=none; d=google.com; s=arc-20160816; b=R+GDOXwX3E6bLYlhL1Doecv+1Mgs116i0Jnz8HMPHM8GrMiGiOMrAl9kDY9XAqdbC6 04OkryTK/D5Gtn3YwSez/CVgkACCUVisXZrkhI3HRKfjlcXku7OsaBhaHcZ4p/GqHcIy pNuqhcn/eFk7q+ngkbihrd3FHXstnjoPaQQWqX9mpNtYetYL4nolDqnDUl+PInA/Gc9G eQUSuGDUl5XfWW6O0yeG0WxzcJPKy5bu59N/tB4OKNQibq1vGFJbXw/xUp0JCnLTkisq GDlEmRpqi4FKkmjfD/RNNk6iA/+AzSJAp2i+2KT6ut2UHDo1rgok13e4kJCKsuq1zTeW ouvw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=oYSIsCwO8SWQrz0fOiEPMtefubDM77N/TEx3ExOnd04=; b=FpuRzW6W253PVmUoWkmVNf0kNebw4nsqQFsH4MTMejsY9d+L53wVKjsrd4SGTL+fF/ G5mWTgHJVED6NVnB7DPuy5U5Iq0GV0e16s99zFWfCdR8hLA6koDypQ4YHbrG8wn8cKtn miCfEiHuimQog+uNkMberRSY9WqG1Vpw83dCHHC+BxFjVhUypgL9nefRtlBWdAOLC50O rLvTmPf7p8l1WD282GgL9p/DtseyskQj20gLhYDFbVC8Ar1FWl41cc6N0M31iplSnRZN sc6CAPP8q7L9sLQmCpBV2Nd4oHo1lODIcbUfYEcfR6AqWDkgx8pGLldBdDDng1dFWrQW AuCg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=Vb7j1L1M; spf=pass (google.com: best guess record for domain of linux-arm-msm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-arm-msm-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d2-v6si15409058plo.42.2018.06.18.07.36.22; Mon, 18 Jun 2018 07:36:23 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-arm-msm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=Vb7j1L1M; spf=pass (google.com: best guess record for domain of linux-arm-msm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-arm-msm-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934731AbeFROgV (ORCPT + 13 others); Mon, 18 Jun 2018 10:36:21 -0400 Received: from mail-pg0-f65.google.com ([74.125.83.65]:46472 "EHLO mail-pg0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934556AbeFROgT (ORCPT ); Mon, 18 Jun 2018 10:36:19 -0400 Received: by mail-pg0-f65.google.com with SMTP id d2-v6so7616632pga.13 for ; Mon, 18 Jun 2018 07:36:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=EPkZc+nDD8WorWc97gJveY1wE318d7gWEoVEFw/ZLJE=; b=Vb7j1L1M6RtU5KrBqAdFI2yZznJqVKph5RW6XLHo4P37y7sPW2hCfR71ZXdeydst0J QjOXvHWQvOZH+myVLgj52R44nZvH4E1vpA8Ht0X7hl4nSJ2j2RY/w8iBwWqgeQW3mXtq oJshjU3sZYmRv4gAyYquawdCF7F/ZEH2OZnW8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=EPkZc+nDD8WorWc97gJveY1wE318d7gWEoVEFw/ZLJE=; b=EDnmXattCVlEz/V6eGcBG37qNZvx3XPISTyW9Z2MpZU4Nkj/Jxo1/jANkZaOFnhFgz SoLN9HHQXyp1X/hlIDbi7+h/uK8p73Rud/kCUMi7LaLYCXC9BwHYQv0G0lBqZzebCQOO WU/tUcMdYuq5z8V0qK9KyngNBk6h0tCyvOVg2ZUxnbtLpbFKAAcd9T1cpOElfneMQwBa km6ODnzzkMn1Ym+8PCP8IeGEz5wN8tK05U4r/jwXjIMkt4RIFrqvoftAzPQpw4QJ76tk U/7NkapX3LcbEAzacxcqJcwEyQB83fQHf2JHym3808+fgtOqxERBXxTuxDi6ay7Xs2vN jKMw== X-Gm-Message-State: APt69E2vjvaMVi3QktrZZPUsCkbXuTR4G8kyZnnPMG9eUWbbo+7f0OZS EyK9fWfZy39m1fQvpH5jnr6TTA== X-Received: by 2002:a65:4545:: with SMTP id x5-v6mr11250411pgr.4.1529332579234; Mon, 18 Jun 2018 07:36:19 -0700 (PDT) Received: from localhost.localdomain ([27.59.118.133]) by smtp.gmail.com with ESMTPSA id n10-v6sm28163604pfb.27.2018.06.18.07.36.16 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 18 Jun 2018 07:36:18 -0700 (PDT) From: Vinod Koul X-Google-Original-From: Vinod Koul To: linux-input@vger.kernel.org, linux-pm@vger.kernel.org Cc: Dmitry Torokhov , Rob Herring , Sebastian Reichel , devicetree@vger.kernel.org, linux-arm-msm@vger.kernel.org, Vinod Koul Subject: [PATCH 4/5] input: pm8941-pwrkey: Abstract register offsets and event code Date: Mon, 18 Jun 2018 20:05:47 +0530 Message-Id: <20180618143548.29900-5-vkoul@kernel.org> X-Mailer: git-send-email 2.14.4 In-Reply-To: <20180618143548.29900-1-vkoul@kernel.org> References: <20180618143548.29900-1-vkoul@kernel.org> Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org In order to support resin thru the pwrkey driver (they are very similar in nature) we need to abstract the handling in this driver. First we abstract pull_up_bit and status_bit along in driver data. The event code sent for key events is quiried from DT. Since the device can be child of pon lookup regmap and reg from parent if lookup fails (we are child). Signed-off-by: Vinod Koul --- drivers/input/misc/pm8941-pwrkey.c | 56 +++++++++++++++++++++++++++++++------- 1 file changed, 46 insertions(+), 10 deletions(-) -- 2.14.4 -- To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/input/misc/pm8941-pwrkey.c b/drivers/input/misc/pm8941-pwrkey.c index 18ad956454f1..aedb6ea2b50a 100644 --- a/drivers/input/misc/pm8941-pwrkey.c +++ b/drivers/input/misc/pm8941-pwrkey.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -42,6 +43,10 @@ #define PON_DBC_CTL 0x71 #define PON_DBC_DELAY_MASK 0x7 +struct pm8941_data { + unsigned int pull_up_bit; + unsigned int status_bit; +}; struct pm8941_pwrkey { struct device *dev; @@ -52,6 +57,9 @@ struct pm8941_pwrkey { unsigned int revision; struct notifier_block reboot_notifier; + + unsigned int code; + const struct pm8941_data *data; }; static int pm8941_reboot_notify(struct notifier_block *nb, @@ -124,7 +132,8 @@ static irqreturn_t pm8941_pwrkey_irq(int irq, void *_data) if (error) return IRQ_HANDLED; - input_report_key(pwrkey->input, KEY_POWER, !!(sts & PON_KPDPWR_N_SET)); + input_report_key(pwrkey->input, pwrkey->code, + !!(sts & pwrkey->data->status_bit)); input_sync(pwrkey->input); return IRQ_HANDLED; @@ -157,6 +166,7 @@ static int pm8941_pwrkey_probe(struct platform_device *pdev) { struct pm8941_pwrkey *pwrkey; bool pull_up; + struct device *parent; u32 req_delay; int error; @@ -175,11 +185,20 @@ static int pm8941_pwrkey_probe(struct platform_device *pdev) return -ENOMEM; pwrkey->dev = &pdev->dev; + pwrkey->data = of_device_get_match_data(&pdev->dev); - pwrkey->regmap = dev_get_regmap(pdev->dev.parent, NULL); + parent = pdev->dev.parent; + pwrkey->regmap = dev_get_regmap(parent, NULL); if (!pwrkey->regmap) { - dev_err(&pdev->dev, "failed to locate regmap\n"); - return -ENODEV; + /* + * we failed to get regmap for parent, check if + * parent->parent has it (device would be child of pon) + */ + pwrkey->regmap = dev_get_regmap(parent->parent, NULL); + if (!pwrkey->regmap) { + dev_err(&pdev->dev, "failed to locate regmap\n"); + return -ENODEV; + } } pwrkey->irq = platform_get_irq(pdev, 0); @@ -190,8 +209,13 @@ static int pm8941_pwrkey_probe(struct platform_device *pdev) error = of_property_read_u32(pdev->dev.of_node, "reg", &pwrkey->baseaddr); - if (error) - return error; + if (error) { + /* check if parent has reg before bailing */ + error = of_property_read_u32(pdev->dev.parent->of_node, + "reg", &pwrkey->baseaddr); + if (error) + return error; + } error = regmap_read(pwrkey->regmap, pwrkey->baseaddr + PON_REV2, &pwrkey->revision); @@ -200,13 +224,20 @@ static int pm8941_pwrkey_probe(struct platform_device *pdev) return error; } + error = of_property_read_u32(pdev->dev.of_node, "linux,code", + &pwrkey->code); + if (error) { + dev_err(&pdev->dev, "no linux,code assuming power%d\n", error); + pwrkey->code = KEY_POWER; + } + pwrkey->input = devm_input_allocate_device(&pdev->dev); if (!pwrkey->input) { dev_dbg(&pdev->dev, "unable to allocate input device\n"); return -ENOMEM; } - input_set_capability(pwrkey->input, EV_KEY, KEY_POWER); + input_set_capability(pwrkey->input, EV_KEY, pwrkey->code); pwrkey->input->name = "pm8941_pwrkey"; pwrkey->input->phys = "pm8941_pwrkey/input0"; @@ -225,8 +256,8 @@ static int pm8941_pwrkey_probe(struct platform_device *pdev) error = regmap_update_bits(pwrkey->regmap, pwrkey->baseaddr + PON_PULL_CTL, - PON_KPDPWR_PULL_UP, - pull_up ? PON_KPDPWR_PULL_UP : 0); + pwrkey->data->pull_up_bit, + pull_up ? pwrkey->data->pull_up_bit : 0); if (error) { dev_err(&pdev->dev, "failed to set pull: %d\n", error); return error; @@ -271,8 +302,13 @@ static int pm8941_pwrkey_remove(struct platform_device *pdev) return 0; } +static const struct pm8941_data pwrkey_data = { + .pull_up_bit = PON_KPDPWR_PULL_UP, + .status_bit = PON_KPDPWR_N_SET, +}; + static const struct of_device_id pm8941_pwr_key_id_table[] = { - { .compatible = "qcom,pm8941-pwrkey" }, + { .compatible = "qcom,pm8941-pwrkey", .data = &pwrkey_data }, { } }; MODULE_DEVICE_TABLE(of, pm8941_pwr_key_id_table);