linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 1/6] docs: firmware-guide: ACPI: Add a PWM example
@ 2021-06-07 12:24 Andy Shevchenko
  2021-06-07 12:24 ` [PATCH v3 2/6] pwm: core: Convert to use fwnode for matching Andy Shevchenko
                   ` (5 more replies)
  0 siblings, 6 replies; 9+ messages in thread
From: Andy Shevchenko @ 2021-06-07 12:24 UTC (permalink / raw)
  To: Thierry Reding, Uwe Kleine-König, Andy Shevchenko,
	Flavio Suligoi, linux-doc, linux-kernel, linux-pwm, linux-acpi
  Cc: Jonathan Corbet, Lee Jones, Rafael J. Wysocki, Len Brown

When PWM support for ACPI has been added into the kernel, it missed
the documentation update. Hence update documentation here.

Fixes: 4a6ef8e37c4d ("pwm: Add support referencing PWMs from ACPI")
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
v3: despite flags being optional, don't alter it in the documentation
v2: updated example to use 600 ms instead of 600 us (looks saner)
 .../firmware-guide/acpi/enumeration.rst       | 32 +++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/Documentation/firmware-guide/acpi/enumeration.rst b/Documentation/firmware-guide/acpi/enumeration.rst
index 9f0d5c854fa4..f588663ba906 100644
--- a/Documentation/firmware-guide/acpi/enumeration.rst
+++ b/Documentation/firmware-guide/acpi/enumeration.rst
@@ -258,6 +258,38 @@ input driver::
 		.id_table	= mpu3050_ids,
 	};
 
+Reference to PWM device
+=======================
+
+Sometimes a device can be a consumer of PWM channel. Obviously OS would like
+to know which one. To provide this mapping the special property has been
+introduced, i.e.::
+
+    Device (DEV)
+    {
+        Name (_DSD, Package ()
+        {
+            ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+            Package () {
+                Package () { "compatible", Package () { "pwm-leds" } },
+                Package () { "label", "alarm-led" },
+                Package () { "pwms",
+                    Package () {
+                        "\\_SB.PCI0.PWM",  // <PWM device reference>
+                        0,                 // <PWM index>
+                        600000000,         // <PWM period>
+                        0,                 // <PWM flags>
+                    }
+                }
+            }
+
+        })
+        ...
+
+In the above example the PWM-based LED driver references to the PWM channel 0
+of \_SB.PCI0.PWM device with initial period setting equal to 600 ms (note that
+value is given in nanoseconds).
+
 GPIO support
 ============
 
-- 
2.30.2


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

* [PATCH v3 2/6] pwm: core: Convert to use fwnode for matching
  2021-06-07 12:24 [PATCH v3 1/6] docs: firmware-guide: ACPI: Add a PWM example Andy Shevchenko
@ 2021-06-07 12:24 ` Andy Shevchenko
  2021-06-07 12:24 ` [PATCH v3 3/6] pwm: core: Reuse fwnode_to_pwmchip() in ACPI case Andy Shevchenko
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 9+ messages in thread
From: Andy Shevchenko @ 2021-06-07 12:24 UTC (permalink / raw)
  To: Thierry Reding, Uwe Kleine-König, Andy Shevchenko,
	Flavio Suligoi, linux-doc, linux-kernel, linux-pwm, linux-acpi
  Cc: Jonathan Corbet, Lee Jones, Rafael J. Wysocki, Len Brown

When we traverse the list of the registered PWM controllers,
use fwnode to match. This will help for further cleanup.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
v3: no change
v2: no change

 drivers/pwm/core.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c
index a42999f877d2..f26da1a6a376 100644
--- a/drivers/pwm/core.c
+++ b/drivers/pwm/core.c
@@ -692,14 +692,14 @@ int pwm_adjust_config(struct pwm_device *pwm)
 }
 EXPORT_SYMBOL_GPL(pwm_adjust_config);
 
-static struct pwm_chip *of_node_to_pwmchip(struct device_node *np)
+static struct pwm_chip *fwnode_to_pwmchip(struct fwnode_handle *fwnode)
 {
 	struct pwm_chip *chip;
 
 	mutex_lock(&pwm_lock);
 
 	list_for_each_entry(chip, &pwm_chips, list)
-		if (chip->dev && chip->dev->of_node == np) {
+		if (chip->dev && dev_fwnode(chip->dev) == fwnode) {
 			mutex_unlock(&pwm_lock);
 			return chip;
 		}
@@ -778,7 +778,7 @@ struct pwm_device *of_pwm_get(struct device *dev, struct device_node *np,
 		return ERR_PTR(err);
 	}
 
-	pc = of_node_to_pwmchip(args.np);
+	pc = fwnode_to_pwmchip(of_fwnode_handle(args.np));
 	if (IS_ERR(pc)) {
 		if (PTR_ERR(pc) != -EPROBE_DEFER)
 			pr_err("%s(): PWM chip not found\n", __func__);
-- 
2.30.2


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

* [PATCH v3 3/6] pwm: core: Reuse fwnode_to_pwmchip() in ACPI case
  2021-06-07 12:24 [PATCH v3 1/6] docs: firmware-guide: ACPI: Add a PWM example Andy Shevchenko
  2021-06-07 12:24 ` [PATCH v3 2/6] pwm: core: Convert to use fwnode for matching Andy Shevchenko
@ 2021-06-07 12:24 ` Andy Shevchenko
  2021-06-07 12:38   ` Rafael J. Wysocki
  2021-06-07 12:24 ` [PATCH v3 4/6] pwm: core: Unify fwnode checks in the module Andy Shevchenko
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 9+ messages in thread
From: Andy Shevchenko @ 2021-06-07 12:24 UTC (permalink / raw)
  To: Thierry Reding, Uwe Kleine-König, Andy Shevchenko,
	Flavio Suligoi, linux-doc, linux-kernel, linux-pwm, linux-acpi
  Cc: Jonathan Corbet, Lee Jones, Rafael J. Wysocki, Len Brown

In ACPI case we may use matching by fwnode as provided via
fwnode_to_pwmchip(). This makes device_to_pwmchip() not needed
anymore.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
v3: rebased on the tree without dropped patch 2/7
v2: no change
 drivers/pwm/core.c | 31 +------------------------------
 1 file changed, 1 insertion(+), 30 deletions(-)

diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c
index f26da1a6a376..c63626c5266c 100644
--- a/drivers/pwm/core.c
+++ b/drivers/pwm/core.c
@@ -820,28 +820,6 @@ struct pwm_device *of_pwm_get(struct device *dev, struct device_node *np,
 }
 EXPORT_SYMBOL_GPL(of_pwm_get);
 
-#if IS_ENABLED(CONFIG_ACPI)
-static struct pwm_chip *device_to_pwmchip(struct device *dev)
-{
-	struct pwm_chip *chip;
-
-	mutex_lock(&pwm_lock);
-
-	list_for_each_entry(chip, &pwm_chips, list) {
-		struct acpi_device *adev = ACPI_COMPANION(chip->dev);
-
-		if ((chip->dev == dev) || (adev && &adev->dev == dev)) {
-			mutex_unlock(&pwm_lock);
-			return chip;
-		}
-	}
-
-	mutex_unlock(&pwm_lock);
-
-	return ERR_PTR(-EPROBE_DEFER);
-}
-#endif
-
 /**
  * acpi_pwm_get() - request a PWM via parsing "pwms" property in ACPI
  * @fwnode: firmware node to get the "pwm" property from
@@ -862,9 +840,7 @@ static struct pwm_chip *device_to_pwmchip(struct device *dev)
 static struct pwm_device *acpi_pwm_get(struct fwnode_handle *fwnode)
 {
 	struct pwm_device *pwm = ERR_PTR(-ENODEV);
-#if IS_ENABLED(CONFIG_ACPI)
 	struct fwnode_reference_args args;
-	struct acpi_device *acpi;
 	struct pwm_chip *chip;
 	int ret;
 
@@ -874,14 +850,10 @@ static struct pwm_device *acpi_pwm_get(struct fwnode_handle *fwnode)
 	if (ret < 0)
 		return ERR_PTR(ret);
 
-	acpi = to_acpi_device_node(args.fwnode);
-	if (!acpi)
-		return ERR_PTR(-EINVAL);
-
 	if (args.nargs < 2)
 		return ERR_PTR(-EPROTO);
 
-	chip = device_to_pwmchip(&acpi->dev);
+	chip = fwnode_to_pwmchip(args.fwnode);
 	if (IS_ERR(chip))
 		return ERR_CAST(chip);
 
@@ -894,7 +866,6 @@ static struct pwm_device *acpi_pwm_get(struct fwnode_handle *fwnode)
 
 	if (args.nargs > 2 && args.args[2] & PWM_POLARITY_INVERTED)
 		pwm->args.polarity = PWM_POLARITY_INVERSED;
-#endif
 
 	return pwm;
 }
-- 
2.30.2


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

* [PATCH v3 4/6] pwm: core: Unify fwnode checks in the module
  2021-06-07 12:24 [PATCH v3 1/6] docs: firmware-guide: ACPI: Add a PWM example Andy Shevchenko
  2021-06-07 12:24 ` [PATCH v3 2/6] pwm: core: Convert to use fwnode for matching Andy Shevchenko
  2021-06-07 12:24 ` [PATCH v3 3/6] pwm: core: Reuse fwnode_to_pwmchip() in ACPI case Andy Shevchenko
@ 2021-06-07 12:24 ` Andy Shevchenko
  2021-06-07 12:24 ` [PATCH v3 5/6] pwm: core: Remove unused devm_pwm_put() Andy Shevchenko
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 9+ messages in thread
From: Andy Shevchenko @ 2021-06-07 12:24 UTC (permalink / raw)
  To: Thierry Reding, Uwe Kleine-König, Andy Shevchenko,
	Flavio Suligoi, linux-doc, linux-kernel, linux-pwm, linux-acpi
  Cc: Jonathan Corbet, Lee Jones, Rafael J. Wysocki, Len Brown

Historically we have two different approaches on how to check type of fwnode.
Unify them using the latest and greatest fwnode related APIs.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
v3: no change
v2: corrected property name in kernel doc

 drivers/pwm/core.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c
index c63626c5266c..05a86060d430 100644
--- a/drivers/pwm/core.c
+++ b/drivers/pwm/core.c
@@ -822,7 +822,7 @@ EXPORT_SYMBOL_GPL(of_pwm_get);
 
 /**
  * acpi_pwm_get() - request a PWM via parsing "pwms" property in ACPI
- * @fwnode: firmware node to get the "pwm" property from
+ * @fwnode: firmware node to get the "pwms" property from
  *
  * Returns the PWM device parsed from the fwnode and index specified in the
  * "pwms" property or a negative error-code on failure.
@@ -837,7 +837,7 @@ EXPORT_SYMBOL_GPL(of_pwm_get);
  * Returns: A pointer to the requested PWM device or an ERR_PTR()-encoded
  * error code on failure.
  */
-static struct pwm_device *acpi_pwm_get(struct fwnode_handle *fwnode)
+static struct pwm_device *acpi_pwm_get(const struct fwnode_handle *fwnode)
 {
 	struct pwm_device *pwm = ERR_PTR(-ENODEV);
 	struct fwnode_reference_args args;
@@ -921,6 +921,7 @@ void pwm_remove_table(struct pwm_lookup *table, size_t num)
  */
 struct pwm_device *pwm_get(struct device *dev, const char *con_id)
 {
+	const struct fwnode_handle *fwnode = dev ? dev_fwnode(dev) : NULL;
 	const char *dev_id = dev ? dev_name(dev) : NULL;
 	struct pwm_device *pwm;
 	struct pwm_chip *chip;
@@ -931,12 +932,12 @@ struct pwm_device *pwm_get(struct device *dev, const char *con_id)
 	int err;
 
 	/* look up via DT first */
-	if (IS_ENABLED(CONFIG_OF) && dev && dev->of_node)
-		return of_pwm_get(dev, dev->of_node, con_id);
+	if (is_of_node(fwnode))
+		return of_pwm_get(dev, to_of_node(fwnode), con_id);
 
 	/* then lookup via ACPI */
-	if (dev && is_acpi_node(dev->fwnode)) {
-		pwm = acpi_pwm_get(dev->fwnode);
+	if (is_acpi_node(fwnode)) {
+		pwm = acpi_pwm_get(fwnode);
 		if (!IS_ERR(pwm) || PTR_ERR(pwm) != -ENOENT)
 			return pwm;
 	}
-- 
2.30.2


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

* [PATCH v3 5/6] pwm: core: Remove unused devm_pwm_put()
  2021-06-07 12:24 [PATCH v3 1/6] docs: firmware-guide: ACPI: Add a PWM example Andy Shevchenko
                   ` (2 preceding siblings ...)
  2021-06-07 12:24 ` [PATCH v3 4/6] pwm: core: Unify fwnode checks in the module Andy Shevchenko
@ 2021-06-07 12:24 ` Andy Shevchenko
  2021-06-07 12:24 ` [PATCH v3 6/6] pwm: core: Simplify some devm_*pwm*() functions Andy Shevchenko
  2021-06-07 12:38 ` [PATCH v3 1/6] docs: firmware-guide: ACPI: Add a PWM example Rafael J. Wysocki
  5 siblings, 0 replies; 9+ messages in thread
From: Andy Shevchenko @ 2021-06-07 12:24 UTC (permalink / raw)
  To: Thierry Reding, Uwe Kleine-König, Andy Shevchenko,
	Flavio Suligoi, linux-doc, linux-kernel, linux-pwm, linux-acpi
  Cc: Jonathan Corbet, Lee Jones, Rafael J. Wysocki, Len Brown

There are no users and seems no will come of the devm_pwm_put().
Remove the function.

While at it, slightly update documentation.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
v3: added Rb tag (Uwe)
v2: new patch

 .../driver-api/driver-model/devres.rst        |  3 ++-
 Documentation/driver-api/pwm.rst              |  3 ++-
 drivers/pwm/core.c                            | 25 -------------------
 include/linux/pwm.h                           |  5 ----
 4 files changed, 4 insertions(+), 32 deletions(-)

diff --git a/Documentation/driver-api/driver-model/devres.rst b/Documentation/driver-api/driver-model/devres.rst
index e7e209232246..d2948139411e 100644
--- a/Documentation/driver-api/driver-model/devres.rst
+++ b/Documentation/driver-api/driver-model/devres.rst
@@ -409,7 +409,8 @@ POWER
 
 PWM
   devm_pwm_get()
-  devm_pwm_put()
+  devm_of_pwm_get()
+  devm_fwnode_pwm_get()
 
 REGULATOR
   devm_regulator_bulk_get()
diff --git a/Documentation/driver-api/pwm.rst b/Documentation/driver-api/pwm.rst
index 750734a7f874..ccb06e485756 100644
--- a/Documentation/driver-api/pwm.rst
+++ b/Documentation/driver-api/pwm.rst
@@ -40,7 +40,8 @@ after usage with pwm_free().
 
 New users should use the pwm_get() function and pass to it the consumer
 device or a consumer name. pwm_put() is used to free the PWM device. Managed
-variants of these functions, devm_pwm_get() and devm_pwm_put(), also exist.
+variants of the getter, devm_pwm_get(), devm_of_pwm_get(),
+devm_fwnode_pwm_get(), also exist.
 
 After being requested, a PWM has to be configured using::
 
diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c
index 05a86060d430..4133abb74798 100644
--- a/drivers/pwm/core.c
+++ b/drivers/pwm/core.c
@@ -1165,31 +1165,6 @@ struct pwm_device *devm_fwnode_pwm_get(struct device *dev,
 }
 EXPORT_SYMBOL_GPL(devm_fwnode_pwm_get);
 
-static int devm_pwm_match(struct device *dev, void *res, void *data)
-{
-	struct pwm_device **p = res;
-
-	if (WARN_ON(!p || !*p))
-		return 0;
-
-	return *p == data;
-}
-
-/**
- * devm_pwm_put() - resource managed pwm_put()
- * @dev: device for PWM consumer
- * @pwm: PWM device
- *
- * Release a PWM previously allocated using devm_pwm_get(). Calling this
- * function is usually not needed because devm-allocated resources are
- * automatically released on driver detach.
- */
-void devm_pwm_put(struct device *dev, struct pwm_device *pwm)
-{
-	WARN_ON(devres_release(dev, devm_pwm_release, devm_pwm_match, pwm));
-}
-EXPORT_SYMBOL_GPL(devm_pwm_put);
-
 #ifdef CONFIG_DEBUG_FS
 static void pwm_dbg_show(struct pwm_chip *chip, struct seq_file *s)
 {
diff --git a/include/linux/pwm.h b/include/linux/pwm.h
index 5a73251d28e3..91af518d5037 100644
--- a/include/linux/pwm.h
+++ b/include/linux/pwm.h
@@ -423,7 +423,6 @@ struct pwm_device *devm_of_pwm_get(struct device *dev, struct device_node *np,
 struct pwm_device *devm_fwnode_pwm_get(struct device *dev,
 				       struct fwnode_handle *fwnode,
 				       const char *con_id);
-void devm_pwm_put(struct device *dev, struct pwm_device *pwm);
 #else
 static inline struct pwm_device *pwm_request(int pwm_id, const char *label)
 {
@@ -530,10 +529,6 @@ devm_fwnode_pwm_get(struct device *dev, struct fwnode_handle *fwnode,
 {
 	return ERR_PTR(-ENODEV);
 }
-
-static inline void devm_pwm_put(struct device *dev, struct pwm_device *pwm)
-{
-}
 #endif
 
 static inline void pwm_apply_args(struct pwm_device *pwm)
-- 
2.30.2


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

* [PATCH v3 6/6] pwm: core: Simplify some devm_*pwm*() functions
  2021-06-07 12:24 [PATCH v3 1/6] docs: firmware-guide: ACPI: Add a PWM example Andy Shevchenko
                   ` (3 preceding siblings ...)
  2021-06-07 12:24 ` [PATCH v3 5/6] pwm: core: Remove unused devm_pwm_put() Andy Shevchenko
@ 2021-06-07 12:24 ` Andy Shevchenko
  2021-06-07 12:38 ` [PATCH v3 1/6] docs: firmware-guide: ACPI: Add a PWM example Rafael J. Wysocki
  5 siblings, 0 replies; 9+ messages in thread
From: Andy Shevchenko @ 2021-06-07 12:24 UTC (permalink / raw)
  To: Thierry Reding, Uwe Kleine-König, Andy Shevchenko,
	Flavio Suligoi, linux-doc, linux-kernel, linux-pwm, linux-acpi
  Cc: Jonathan Corbet, Lee Jones, Rafael J. Wysocki, Len Brown

Use devm_add_action_or_reset() instead of devres_alloc() and
devres_add(), which works the same. This will simplify the
code. There is no functional changes.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
v3: added Rb tag (Uwe)
v2: new patch

 drivers/pwm/core.c | 60 +++++++++++++++++++---------------------------
 1 file changed, 25 insertions(+), 35 deletions(-)

diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c
index 4133abb74798..f74c2f7cd46c 100644
--- a/drivers/pwm/core.c
+++ b/drivers/pwm/core.c
@@ -1058,9 +1058,9 @@ void pwm_put(struct pwm_device *pwm)
 }
 EXPORT_SYMBOL_GPL(pwm_put);
 
-static void devm_pwm_release(struct device *dev, void *res)
+static void devm_pwm_release(void *pwm)
 {
-	pwm_put(*(struct pwm_device **)res);
+	pwm_put(pwm);
 }
 
 /**
@@ -1076,19 +1076,16 @@ static void devm_pwm_release(struct device *dev, void *res)
  */
 struct pwm_device *devm_pwm_get(struct device *dev, const char *con_id)
 {
-	struct pwm_device **ptr, *pwm;
-
-	ptr = devres_alloc(devm_pwm_release, sizeof(*ptr), GFP_KERNEL);
-	if (!ptr)
-		return ERR_PTR(-ENOMEM);
+	struct pwm_device *pwm;
+	int ret;
 
 	pwm = pwm_get(dev, con_id);
-	if (!IS_ERR(pwm)) {
-		*ptr = pwm;
-		devres_add(dev, ptr);
-	} else {
-		devres_free(ptr);
-	}
+	if (IS_ERR(pwm))
+		return pwm;
+
+	ret = devm_add_action_or_reset(dev, devm_pwm_release, pwm);
+	if (ret)
+		return ERR_PTR(ret);
 
 	return pwm;
 }
@@ -1109,19 +1106,16 @@ EXPORT_SYMBOL_GPL(devm_pwm_get);
 struct pwm_device *devm_of_pwm_get(struct device *dev, struct device_node *np,
 				   const char *con_id)
 {
-	struct pwm_device **ptr, *pwm;
-
-	ptr = devres_alloc(devm_pwm_release, sizeof(*ptr), GFP_KERNEL);
-	if (!ptr)
-		return ERR_PTR(-ENOMEM);
+	struct pwm_device *pwm;
+	int ret;
 
 	pwm = of_pwm_get(dev, np, con_id);
-	if (!IS_ERR(pwm)) {
-		*ptr = pwm;
-		devres_add(dev, ptr);
-	} else {
-		devres_free(ptr);
-	}
+	if (IS_ERR(pwm))
+		return pwm;
+
+	ret = devm_add_action_or_reset(dev, devm_pwm_release, pwm);
+	if (ret)
+		return ERR_PTR(ret);
 
 	return pwm;
 }
@@ -1143,23 +1137,19 @@ struct pwm_device *devm_fwnode_pwm_get(struct device *dev,
 				       struct fwnode_handle *fwnode,
 				       const char *con_id)
 {
-	struct pwm_device **ptr, *pwm = ERR_PTR(-ENODEV);
-
-	ptr = devres_alloc(devm_pwm_release, sizeof(*ptr), GFP_KERNEL);
-	if (!ptr)
-		return ERR_PTR(-ENOMEM);
+	struct pwm_device *pwm = ERR_PTR(-ENODEV);
+	int ret;
 
 	if (is_of_node(fwnode))
 		pwm = of_pwm_get(dev, to_of_node(fwnode), con_id);
 	else if (is_acpi_node(fwnode))
 		pwm = acpi_pwm_get(fwnode);
+	if (IS_ERR(pwm))
+		return pwm;
 
-	if (!IS_ERR(pwm)) {
-		*ptr = pwm;
-		devres_add(dev, ptr);
-	} else {
-		devres_free(ptr);
-	}
+	ret = devm_add_action_or_reset(dev, devm_pwm_release, pwm);
+	if (ret)
+		return ERR_PTR(ret);
 
 	return pwm;
 }
-- 
2.30.2


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

* Re: [PATCH v3 1/6] docs: firmware-guide: ACPI: Add a PWM example
  2021-06-07 12:24 [PATCH v3 1/6] docs: firmware-guide: ACPI: Add a PWM example Andy Shevchenko
                   ` (4 preceding siblings ...)
  2021-06-07 12:24 ` [PATCH v3 6/6] pwm: core: Simplify some devm_*pwm*() functions Andy Shevchenko
@ 2021-06-07 12:38 ` Rafael J. Wysocki
  2021-06-07 14:36   ` Andy Shevchenko
  5 siblings, 1 reply; 9+ messages in thread
From: Rafael J. Wysocki @ 2021-06-07 12:38 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Thierry Reding, Uwe Kleine-König, Flavio Suligoi,
	open list:DOCUMENTATION, Linux Kernel Mailing List,
	Linux PWM List, ACPI Devel Maling List, Jonathan Corbet,
	Lee Jones, Rafael J. Wysocki, Len Brown

On Mon, Jun 7, 2021 at 2:24 PM Andy Shevchenko
<andriy.shevchenko@linux.intel.com> wrote:
>
> When PWM support for ACPI has been added into the kernel, it missed
> the documentation update. Hence update documentation here.
>
> Fixes: 4a6ef8e37c4d ("pwm: Add support referencing PWMs from ACPI")
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

and I'm assuming this to go in via PWM.

> ---
> v3: despite flags being optional, don't alter it in the documentation
> v2: updated example to use 600 ms instead of 600 us (looks saner)
>  .../firmware-guide/acpi/enumeration.rst       | 32 +++++++++++++++++++
>  1 file changed, 32 insertions(+)
>
> diff --git a/Documentation/firmware-guide/acpi/enumeration.rst b/Documentation/firmware-guide/acpi/enumeration.rst
> index 9f0d5c854fa4..f588663ba906 100644
> --- a/Documentation/firmware-guide/acpi/enumeration.rst
> +++ b/Documentation/firmware-guide/acpi/enumeration.rst
> @@ -258,6 +258,38 @@ input driver::
>                 .id_table       = mpu3050_ids,
>         };
>
> +Reference to PWM device
> +=======================
> +
> +Sometimes a device can be a consumer of PWM channel. Obviously OS would like
> +to know which one. To provide this mapping the special property has been
> +introduced, i.e.::
> +
> +    Device (DEV)
> +    {
> +        Name (_DSD, Package ()
> +        {
> +            ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
> +            Package () {
> +                Package () { "compatible", Package () { "pwm-leds" } },
> +                Package () { "label", "alarm-led" },
> +                Package () { "pwms",
> +                    Package () {
> +                        "\\_SB.PCI0.PWM",  // <PWM device reference>
> +                        0,                 // <PWM index>
> +                        600000000,         // <PWM period>
> +                        0,                 // <PWM flags>
> +                    }
> +                }
> +            }
> +
> +        })
> +        ...
> +
> +In the above example the PWM-based LED driver references to the PWM channel 0
> +of \_SB.PCI0.PWM device with initial period setting equal to 600 ms (note that
> +value is given in nanoseconds).
> +
>  GPIO support
>  ============
>
> --
> 2.30.2
>

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

* Re: [PATCH v3 3/6] pwm: core: Reuse fwnode_to_pwmchip() in ACPI case
  2021-06-07 12:24 ` [PATCH v3 3/6] pwm: core: Reuse fwnode_to_pwmchip() in ACPI case Andy Shevchenko
@ 2021-06-07 12:38   ` Rafael J. Wysocki
  0 siblings, 0 replies; 9+ messages in thread
From: Rafael J. Wysocki @ 2021-06-07 12:38 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Thierry Reding, Uwe Kleine-König, Flavio Suligoi,
	open list:DOCUMENTATION, Linux Kernel Mailing List,
	Linux PWM List, ACPI Devel Maling List, Jonathan Corbet,
	Lee Jones, Rafael J. Wysocki, Len Brown

On Mon, Jun 7, 2021 at 2:24 PM Andy Shevchenko
<andriy.shevchenko@linux.intel.com> wrote:
>
> In ACPI case we may use matching by fwnode as provided via
> fwnode_to_pwmchip(). This makes device_to_pwmchip() not needed
> anymore.
>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

> ---
> v3: rebased on the tree without dropped patch 2/7
> v2: no change
>  drivers/pwm/core.c | 31 +------------------------------
>  1 file changed, 1 insertion(+), 30 deletions(-)
>
> diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c
> index f26da1a6a376..c63626c5266c 100644
> --- a/drivers/pwm/core.c
> +++ b/drivers/pwm/core.c
> @@ -820,28 +820,6 @@ struct pwm_device *of_pwm_get(struct device *dev, struct device_node *np,
>  }
>  EXPORT_SYMBOL_GPL(of_pwm_get);
>
> -#if IS_ENABLED(CONFIG_ACPI)
> -static struct pwm_chip *device_to_pwmchip(struct device *dev)
> -{
> -       struct pwm_chip *chip;
> -
> -       mutex_lock(&pwm_lock);
> -
> -       list_for_each_entry(chip, &pwm_chips, list) {
> -               struct acpi_device *adev = ACPI_COMPANION(chip->dev);
> -
> -               if ((chip->dev == dev) || (adev && &adev->dev == dev)) {
> -                       mutex_unlock(&pwm_lock);
> -                       return chip;
> -               }
> -       }
> -
> -       mutex_unlock(&pwm_lock);
> -
> -       return ERR_PTR(-EPROBE_DEFER);
> -}
> -#endif
> -
>  /**
>   * acpi_pwm_get() - request a PWM via parsing "pwms" property in ACPI
>   * @fwnode: firmware node to get the "pwm" property from
> @@ -862,9 +840,7 @@ static struct pwm_chip *device_to_pwmchip(struct device *dev)
>  static struct pwm_device *acpi_pwm_get(struct fwnode_handle *fwnode)
>  {
>         struct pwm_device *pwm = ERR_PTR(-ENODEV);
> -#if IS_ENABLED(CONFIG_ACPI)
>         struct fwnode_reference_args args;
> -       struct acpi_device *acpi;
>         struct pwm_chip *chip;
>         int ret;
>
> @@ -874,14 +850,10 @@ static struct pwm_device *acpi_pwm_get(struct fwnode_handle *fwnode)
>         if (ret < 0)
>                 return ERR_PTR(ret);
>
> -       acpi = to_acpi_device_node(args.fwnode);
> -       if (!acpi)
> -               return ERR_PTR(-EINVAL);
> -
>         if (args.nargs < 2)
>                 return ERR_PTR(-EPROTO);
>
> -       chip = device_to_pwmchip(&acpi->dev);
> +       chip = fwnode_to_pwmchip(args.fwnode);
>         if (IS_ERR(chip))
>                 return ERR_CAST(chip);
>
> @@ -894,7 +866,6 @@ static struct pwm_device *acpi_pwm_get(struct fwnode_handle *fwnode)
>
>         if (args.nargs > 2 && args.args[2] & PWM_POLARITY_INVERTED)
>                 pwm->args.polarity = PWM_POLARITY_INVERSED;
> -#endif
>
>         return pwm;
>  }
> --
> 2.30.2
>

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

* Re: [PATCH v3 1/6] docs: firmware-guide: ACPI: Add a PWM example
  2021-06-07 12:38 ` [PATCH v3 1/6] docs: firmware-guide: ACPI: Add a PWM example Rafael J. Wysocki
@ 2021-06-07 14:36   ` Andy Shevchenko
  0 siblings, 0 replies; 9+ messages in thread
From: Andy Shevchenko @ 2021-06-07 14:36 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Thierry Reding, Uwe Kleine-König, Flavio Suligoi,
	open list:DOCUMENTATION, Linux Kernel Mailing List,
	Linux PWM List, ACPI Devel Maling List, Jonathan Corbet,
	Lee Jones, Rafael J. Wysocki, Len Brown

On Mon, Jun 07, 2021 at 02:38:26PM +0200, Rafael J. Wysocki wrote:
> On Mon, Jun 7, 2021 at 2:24 PM Andy Shevchenko
> <andriy.shevchenko@linux.intel.com> wrote:
> >
> > When PWM support for ACPI has been added into the kernel, it missed
> > the documentation update. Hence update documentation here.
> >
> > Fixes: 4a6ef8e37c4d ("pwm: Add support referencing PWMs from ACPI")
> > Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> 
> Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> 
> and I'm assuming this to go in via PWM.

Yes, thanks for your tags!

-- 
With Best Regards,
Andy Shevchenko



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

end of thread, other threads:[~2021-06-07 14:36 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-07 12:24 [PATCH v3 1/6] docs: firmware-guide: ACPI: Add a PWM example Andy Shevchenko
2021-06-07 12:24 ` [PATCH v3 2/6] pwm: core: Convert to use fwnode for matching Andy Shevchenko
2021-06-07 12:24 ` [PATCH v3 3/6] pwm: core: Reuse fwnode_to_pwmchip() in ACPI case Andy Shevchenko
2021-06-07 12:38   ` Rafael J. Wysocki
2021-06-07 12:24 ` [PATCH v3 4/6] pwm: core: Unify fwnode checks in the module Andy Shevchenko
2021-06-07 12:24 ` [PATCH v3 5/6] pwm: core: Remove unused devm_pwm_put() Andy Shevchenko
2021-06-07 12:24 ` [PATCH v3 6/6] pwm: core: Simplify some devm_*pwm*() functions Andy Shevchenko
2021-06-07 12:38 ` [PATCH v3 1/6] docs: firmware-guide: ACPI: Add a PWM example Rafael J. Wysocki
2021-06-07 14:36   ` Andy Shevchenko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).