mbox series

[v6,0/3] input: pm8941-pwrkey: Add support for reboot reason

Message ID 20180731044807.16878-1-vkoul@kernel.org
Headers show
Series input: pm8941-pwrkey: Add support for reboot reason | expand

Message

Vinod Koul July 31, 2018, 4:48 a.m. UTC
To add support for reboot reason there have been some attempts [1], [2]
in past. Based on these discussions we added a new pon driver and made
pwrkey and resin as child nodes to pon.

Since the pwrkey and resin are similar, abstract pwrkey driver
and then add support for resin in the same driver.

[1]: https://patchwork.kernel.org/patch/9751627/
[2]: https://patchwork.kernel.org/patch/10381801/

Changes in v6:
 - Drop power changes merged thru reset tree
 - Rebase on input-next

Changes in v5:
 - Make pon driver tristate

Changes in v4:
 - Add Rob's ack
 - Fix typo and description in pon binding
 - Separate out resin binding to an independent patch

Changes in v3:
 - Add Bjorn's ack
 - Make variable for event code u32

Changes in v2:
 - Add Bjorn's ack
 - Fix power binding by removing reg property
 - Use single block for parent check in pm8941-pwrkey as suggested by
   Dimitry

Vinod Koul (3):
  dt-bindings: Input: Add additional property to qcom pwrkey
  input: pm8941-pwrkey: Abstract register offsets and event code
  input: pm8941-pwrkey: Add resin entry

 .../bindings/input/qcom,pm8941-pwrkey.txt          |  9 +++
 drivers/input/misc/pm8941-pwrkey.c                 | 69 ++++++++++++++++++----
 2 files changed, 65 insertions(+), 13 deletions(-)

Comments

Dmitry Torokhov July 31, 2018, 6:13 a.m. UTC | #1
Hi Vinod,

On Tue, Jul 31, 2018 at 10:18:07AM +0530, Vinod Koul wrote:
> Since handling is abstracted in this driver, we need to add resin entry
> in id table along with pwrkey_data.
> 
> Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
> Signed-off-by: Vinod Koul <vkoul@kernel.org>

I added "qcom,pm8941-resin" to the binding doc and applied. Thank you.

> ---
>  drivers/input/misc/pm8941-pwrkey.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/drivers/input/misc/pm8941-pwrkey.c b/drivers/input/misc/pm8941-pwrkey.c
> index 2047e34c0982..6547a57f5222 100644
> --- a/drivers/input/misc/pm8941-pwrkey.c
> +++ b/drivers/input/misc/pm8941-pwrkey.c
> @@ -29,6 +29,7 @@
>  
>  #define PON_RT_STS			0x10
>  #define  PON_KPDPWR_N_SET		BIT(0)
> +#define  PON_RESIN_N_SET		BIT(1)
>  
>  #define PON_PS_HOLD_RST_CTL		0x5a
>  #define PON_PS_HOLD_RST_CTL2		0x5b
> @@ -39,6 +40,7 @@
>  
>  #define PON_PULL_CTL			0x70
>  #define  PON_KPDPWR_PULL_UP		BIT(1)
> +#define  PON_RESIN_PULL_UP		BIT(0)
>  
>  #define PON_DBC_CTL			0x71
>  #define  PON_DBC_DELAY_MASK		0x7
> @@ -306,8 +308,14 @@ static const struct pm8941_data pwrkey_data = {
>  	.status_bit = PON_KPDPWR_N_SET,
>  };
>  
> +static const struct pm8941_data resin_data = {
> +	.pull_up_bit = PON_RESIN_PULL_UP,
> +	.status_bit = PON_RESIN_N_SET,
> +};
> +
>  static const struct of_device_id pm8941_pwr_key_id_table[] = {
>  	{ .compatible = "qcom,pm8941-pwrkey", .data = &pwrkey_data },
> +	{ .compatible = "qcom,pm8941-resin", .data = &resin_data },
>  	{ }
>  };
>  MODULE_DEVICE_TABLE(of, pm8941_pwr_key_id_table);
> -- 
> 2.14.4
>
Dmitry Torokhov July 31, 2018, 6:14 a.m. UTC | #2
On Tue, Jul 31, 2018 at 10:18:06AM +0530, Vinod Koul wrote:
> 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).
> 
> Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
> Signed-off-by: Vinod Koul <vkoul@kernel.org>
> ---
>  drivers/input/misc/pm8941-pwrkey.c | 61 ++++++++++++++++++++++++++++++--------
>  1 file changed, 48 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/input/misc/pm8941-pwrkey.c b/drivers/input/misc/pm8941-pwrkey.c
> index 18ad956454f1..2047e34c0982 100644
> --- a/drivers/input/misc/pm8941-pwrkey.c
> +++ b/drivers/input/misc/pm8941-pwrkey.c
> @@ -20,6 +20,7 @@
>  #include <linux/log2.h>
>  #include <linux/module.h>
>  #include <linux/of.h>
> +#include <linux/of_device.h>
>  #include <linux/platform_device.h>
>  #include <linux/reboot.h>
>  #include <linux/regmap.h>
> @@ -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;
> +
> +	u32 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,12 +185,30 @@ 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 we are child on pon and read regmap and reg from
> +		 * parent
> +		 */
> +		pwrkey->regmap = dev_get_regmap(parent->parent, NULL);
> +		if (!pwrkey->regmap) {
> +			dev_err(&pdev->dev, "failed to locate regmap\n");
> +			return -ENODEV;
> +		}
> +
> +		error = of_property_read_u32(parent->of_node,
> +					     "reg", &pwrkey->baseaddr);
> +	} else {
> +		error = of_property_read_u32(pdev->dev.of_node, "reg",
> +					     &pwrkey->baseaddr);
>  	}
> +	if (error)
> +		return error;
>  
>  	pwrkey->irq = platform_get_irq(pdev, 0);
>  	if (pwrkey->irq < 0) {
> @@ -188,11 +216,6 @@ static int pm8941_pwrkey_probe(struct platform_device *pdev)
>  		return pwrkey->irq;
>  	}
>  
> -	error = of_property_read_u32(pdev->dev.of_node, "reg",
> -				     &pwrkey->baseaddr);
> -	if (error)
> -		return error;
> -
>  	error = regmap_read(pwrkey->regmap, pwrkey->baseaddr + PON_REV2,
>  			    &pwrkey->revision);
>  	if (error) {
> @@ -200,13 +223,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_info(&pdev->dev, "no linux,code assuming power%d\n", error);

I changed this to dev_dbg() and applied, thank you.

> +		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 +255,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 +301,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);
> -- 
> 2.14.4
>
Vinod Koul July 31, 2018, 6:27 a.m. UTC | #3
On 30-07-18, 23:14, Dmitry Torokhov wrote:
> > +	error = of_property_read_u32(pdev->dev.of_node, "linux,code",
> > +				     &pwrkey->code);
> > +	if (error) {
> > +		dev_info(&pdev->dev, "no linux,code assuming power%d\n", error);
> 
> I changed this to dev_dbg() and applied, thank you.

Okay sound fine to me, thanks
Vinod Koul July 31, 2018, 6:28 a.m. UTC | #4
On 30-07-18, 23:13, Dmitry Torokhov wrote:
> Hi Vinod,
> 
> On Tue, Jul 31, 2018 at 10:18:07AM +0530, Vinod Koul wrote:
> > Since handling is abstracted in this driver, we need to add resin entry
> > in id table along with pwrkey_data.
> > 
> > Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
> > Signed-off-by: Vinod Koul <vkoul@kernel.org>
> 
> I added "qcom,pm8941-resin" to the binding doc and applied. Thank you.

That is also fine, I wasn't sure of the preference and sent as separate
ones. Thanks for applying