All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] platform/chrome: cros_ec_typec: Use workqueue for port update
@ 2020-06-27  4:58 Prashant Malani
  2020-06-27  4:58 ` [PATCH 2/2] platform/chrome: cros_ec_typec: Add PM support Prashant Malani
  0 siblings, 1 reply; 4+ messages in thread
From: Prashant Malani @ 2020-06-27  4:58 UTC (permalink / raw)
  To: linux-kernel
  Cc: heikki.krogerus, Prashant Malani, Benson Leung,
	Enric Balletbo i Serra, Guenter Roeck

Use a work queue to call the port update routines, instead of doing it
directly in the PD notifier callback. This will prevent other drivers
with PD notifier callbacks from being blocked on the port update routine
completing.

Signed-off-by: Prashant Malani <pmalani@chromium.org>
---
 drivers/platform/chrome/cros_ec_typec.c | 28 ++++++++++++++++++++-----
 1 file changed, 23 insertions(+), 5 deletions(-)

diff --git a/drivers/platform/chrome/cros_ec_typec.c b/drivers/platform/chrome/cros_ec_typec.c
index 0c041b79cbba..630170fb2cbe 100644
--- a/drivers/platform/chrome/cros_ec_typec.c
+++ b/drivers/platform/chrome/cros_ec_typec.c
@@ -58,6 +58,7 @@ struct cros_typec_data {
 	/* Array of ports, indexed by port number. */
 	struct cros_typec_port *ports[EC_USB_PD_MAX_PORTS];
 	struct notifier_block nb;
+	struct work_struct port_work;
 };
 
 static int cros_typec_parse_port_props(struct typec_capability *cap,
@@ -619,18 +620,29 @@ static int cros_typec_get_cmd_version(struct cros_typec_data *typec)
 	return 0;
 }
 
-static int cros_ec_typec_event(struct notifier_block *nb,
-			       unsigned long host_event, void *_notify)
+static void cros_typec_port_work(struct work_struct *work)
 {
-	struct cros_typec_data *typec = container_of(nb, struct cros_typec_data,
-						     nb);
-	int ret, i;
+	struct cros_typec_data *typec = container_of(work,
+						     struct cros_typec_data,
+						     port_work);
+	int ret;
+	int i;
 
 	for (i = 0; i < typec->num_ports; i++) {
 		ret = cros_typec_port_update(typec, i);
 		if (ret < 0)
 			dev_warn(typec->dev, "Update failed for port: %d\n", i);
 	}
+}
+
+
+static int cros_ec_typec_event(struct notifier_block *nb,
+			       unsigned long host_event, void *_notify)
+{
+	struct cros_typec_data *typec = container_of(nb, struct cros_typec_data,
+						     nb);
+
+	schedule_work(&typec->port_work);
 
 	return NOTIFY_OK;
 }
@@ -689,6 +701,12 @@ static int cros_typec_probe(struct platform_device *pdev)
 	if (ret < 0)
 		return ret;
 
+	INIT_WORK(&typec->port_work, cros_typec_port_work);
+
+	/*
+	 * Safe to call port update here, since we haven't registered the
+	 * PD notifier yet.
+	 */
 	for (i = 0; i < typec->num_ports; i++) {
 		ret = cros_typec_port_update(typec, i);
 		if (ret < 0)
-- 
2.27.0.212.ge8ba1cc988-goog


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] platform/chrome: cros_ec_typec: Add PM support
  2020-06-27  4:58 [PATCH 1/2] platform/chrome: cros_ec_typec: Use workqueue for port update Prashant Malani
@ 2020-06-27  4:58 ` Prashant Malani
  2020-06-29 10:51   ` Enric Balletbo i Serra
  0 siblings, 1 reply; 4+ messages in thread
From: Prashant Malani @ 2020-06-27  4:58 UTC (permalink / raw)
  To: linux-kernel
  Cc: heikki.krogerus, Prashant Malani, Benson Leung,
	Enric Balletbo i Serra, Guenter Roeck

Define basic suspend resume functions for cros-ec-typec. On suspend, we
simply ensure that any pending port update work is completed, and on
resume, we re-poll the port state to account for any
changes/disconnections that might have occurred during suspend.

Signed-off-by: Prashant Malani <pmalani@chromium.org>
---
 drivers/platform/chrome/cros_ec_typec.c | 34 +++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

diff --git a/drivers/platform/chrome/cros_ec_typec.c b/drivers/platform/chrome/cros_ec_typec.c
index 630170fb2cbe..68f15a47450c 100644
--- a/drivers/platform/chrome/cros_ec_typec.c
+++ b/drivers/platform/chrome/cros_ec_typec.c
@@ -725,11 +725,45 @@ static int cros_typec_probe(struct platform_device *pdev)
 	return ret;
 }
 
+#ifdef CONFIG_PM_SLEEP
+
+static int cros_typec_suspend(struct device *dev)
+{
+	struct cros_typec_data *typec = dev_get_drvdata(dev);
+
+	cancel_work_sync(&typec->port_work);
+
+	return 0;
+}
+
+static int cros_typec_resume(struct device *dev)
+{
+	struct cros_typec_data *typec = dev_get_drvdata(dev);
+
+	/* Refresh port state. */
+	schedule_work(&typec->port_work);
+
+	return 0;
+}
+
+static const struct dev_pm_ops cros_typec_pm_ops = {
+	SET_SYSTEM_SLEEP_PM_OPS(cros_typec_suspend, cros_typec_resume)
+};
+
+#define DEV_PM_OPS	(&cros_typec_pm_ops)
+
+#else
+
+#define DEV_PM_OPS	NULL
+
+#endif /* CONFIG_PM_SLEEP */
+
 static struct platform_driver cros_typec_driver = {
 	.driver	= {
 		.name = DRV_NAME,
 		.acpi_match_table = ACPI_PTR(cros_typec_acpi_id),
 		.of_match_table = of_match_ptr(cros_typec_of_match),
+		.pm = DEV_PM_OPS,
 	},
 	.probe = cros_typec_probe,
 };
-- 
2.27.0.212.ge8ba1cc988-goog


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 2/2] platform/chrome: cros_ec_typec: Add PM support
  2020-06-27  4:58 ` [PATCH 2/2] platform/chrome: cros_ec_typec: Add PM support Prashant Malani
@ 2020-06-29 10:51   ` Enric Balletbo i Serra
  2020-06-29 16:08     ` Prashant Malani
  0 siblings, 1 reply; 4+ messages in thread
From: Enric Balletbo i Serra @ 2020-06-29 10:51 UTC (permalink / raw)
  To: Prashant Malani, linux-kernel
  Cc: heikki.krogerus, Benson Leung, Guenter Roeck

Hi Prashant,

Thank you for the patch.

On 27/6/20 6:58, Prashant Malani wrote:
> Define basic suspend resume functions for cros-ec-typec. On suspend, we
> simply ensure that any pending port update work is completed, and on
> resume, we re-poll the port state to account for any
> changes/disconnections that might have occurred during suspend.
> 
> Signed-off-by: Prashant Malani <pmalani@chromium.org>
> ---
>  drivers/platform/chrome/cros_ec_typec.c | 34 +++++++++++++++++++++++++
>  1 file changed, 34 insertions(+)
> 
> diff --git a/drivers/platform/chrome/cros_ec_typec.c b/drivers/platform/chrome/cros_ec_typec.c
> index 630170fb2cbe..68f15a47450c 100644
> --- a/drivers/platform/chrome/cros_ec_typec.c
> +++ b/drivers/platform/chrome/cros_ec_typec.c
> @@ -725,11 +725,45 @@ static int cros_typec_probe(struct platform_device *pdev)
>  	return ret;
>  }
>  
> +#ifdef CONFIG_PM_SLEEP
> +
> +static int cros_typec_suspend(struct device *dev)

I'd prefer if you can mark these function as __maybe_unused (to avoid the
compiler warning) rather than wrapping it in a preprocessor conditional, it
makes the code a bit more simple.

> +{
> +	struct cros_typec_data *typec = dev_get_drvdata(dev);
> +
> +	cancel_work_sync(&typec->port_work);
> +
> +	return 0;
> +}
> +
> +static int cros_typec_resume(struct device *dev)

__maybe_unused ?

> +{
> +	struct cros_typec_data *typec = dev_get_drvdata(dev);
> +
> +	/* Refresh port state. */
> +	schedule_work(&typec->port_work);
> +
> +	return 0;
> +}
> +
> +static const struct dev_pm_ops cros_typec_pm_ops = {
> +	SET_SYSTEM_SLEEP_PM_OPS(cros_typec_suspend, cros_typec_resume)
> +};
> +
> +#define DEV_PM_OPS	(&cros_typec_pm_ops)
> +
> +#else
> +
> +#define DEV_PM_OPS	NULL
> +
> +#endif /* CONFIG_PM_SLEEP */

and remove the ifdefy

> +
>  static struct platform_driver cros_typec_driver = {
>  	.driver	= {
>  		.name = DRV_NAME,
>  		.acpi_match_table = ACPI_PTR(cros_typec_acpi_id),
>  		.of_match_table = of_match_ptr(cros_typec_of_match),
> +		.pm = DEV_PM_OPS,

		.pm = &cros_typec_pm_ops,

>  	},
>  	.probe = cros_typec_probe,
>  };
> 

Thanks,
 Enric

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 2/2] platform/chrome: cros_ec_typec: Add PM support
  2020-06-29 10:51   ` Enric Balletbo i Serra
@ 2020-06-29 16:08     ` Prashant Malani
  0 siblings, 0 replies; 4+ messages in thread
From: Prashant Malani @ 2020-06-29 16:08 UTC (permalink / raw)
  To: Enric Balletbo i Serra
  Cc: Linux Kernel Mailing List, Heikki Krogerus, Benson Leung, Guenter Roeck

Hi Enric,

Thanks for reviewing the patch.

On Mon, Jun 29, 2020 at 3:51 AM Enric Balletbo i Serra
<enric.balletbo@collabora.com> wrote:
>
> Hi Prashant,
>
> Thank you for the patch.
>
> On 27/6/20 6:58, Prashant Malani wrote:
> > Define basic suspend resume functions for cros-ec-typec. On suspend, we
> > simply ensure that any pending port update work is completed, and on
> > resume, we re-poll the port state to account for any
> > changes/disconnections that might have occurred during suspend.
> >
> > Signed-off-by: Prashant Malani <pmalani@chromium.org>
> > ---
> >  drivers/platform/chrome/cros_ec_typec.c | 34 +++++++++++++++++++++++++
> >  1 file changed, 34 insertions(+)
> >
> > diff --git a/drivers/platform/chrome/cros_ec_typec.c b/drivers/platform/chrome/cros_ec_typec.c
> > index 630170fb2cbe..68f15a47450c 100644
> > --- a/drivers/platform/chrome/cros_ec_typec.c
> > +++ b/drivers/platform/chrome/cros_ec_typec.c
> > @@ -725,11 +725,45 @@ static int cros_typec_probe(struct platform_device *pdev)
> >       return ret;
> >  }
> >
> > +#ifdef CONFIG_PM_SLEEP
> > +
> > +static int cros_typec_suspend(struct device *dev)
>
> I'd prefer if you can mark these function as __maybe_unused (to avoid the
> compiler warning) rather than wrapping it in a preprocessor conditional, it
> makes the code a bit more simple.

Done.

>
> > +{
> > +     struct cros_typec_data *typec = dev_get_drvdata(dev);
> > +
> > +     cancel_work_sync(&typec->port_work);
> > +
> > +     return 0;
> > +}
> > +
> > +static int cros_typec_resume(struct device *dev)
>
> __maybe_unused ?

Done.

>
> > +{
> > +     struct cros_typec_data *typec = dev_get_drvdata(dev);
> > +
> > +     /* Refresh port state. */
> > +     schedule_work(&typec->port_work);
> > +
> > +     return 0;
> > +}
> > +
> > +static const struct dev_pm_ops cros_typec_pm_ops = {
> > +     SET_SYSTEM_SLEEP_PM_OPS(cros_typec_suspend, cros_typec_resume)
> > +};
> > +
> > +#define DEV_PM_OPS   (&cros_typec_pm_ops)
> > +
> > +#else
> > +
> > +#define DEV_PM_OPS   NULL
> > +
> > +#endif /* CONFIG_PM_SLEEP */
>
> and remove the ifdefy
>

Done.

> > +
> >  static struct platform_driver cros_typec_driver = {
> >       .driver = {
> >               .name = DRV_NAME,
> >               .acpi_match_table = ACPI_PTR(cros_typec_acpi_id),
> >               .of_match_table = of_match_ptr(cros_typec_of_match),
> > +             .pm = DEV_PM_OPS,
>
>                 .pm = &cros_typec_pm_ops,
>
> >       },
> >       .probe = cros_typec_probe,
> >  };
> >
>
> Thanks,
>  Enric

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2020-06-29 21:43 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-27  4:58 [PATCH 1/2] platform/chrome: cros_ec_typec: Use workqueue for port update Prashant Malani
2020-06-27  4:58 ` [PATCH 2/2] platform/chrome: cros_ec_typec: Add PM support Prashant Malani
2020-06-29 10:51   ` Enric Balletbo i Serra
2020-06-29 16:08     ` Prashant Malani

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.