From: Nikolaus Voss <nv@vosn.de>
To: Dan Murphy <dmurphy@ti.com>
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>,
Len Brown <lenb@kernel.org>,
Robert Moore <robert.moore@intel.com>,
Erik Schmauss <erik.schmauss@intel.com>,
Jacek Anaszewski <jacek.anaszewski@gmail.com>,
Pavel Machek <pavel@ucw.cz>,
Thierry Reding <thierry.reding@gmail.com>,
"linux-acpi@vger.kernel.org" <linux-acpi@vger.kernel.org>,
"devel@acpica.org" <devel@acpica.org>,
"linux-leds@vger.kernel.org" <linux-leds@vger.kernel.org>,
"linux-pwm@vger.kernel.org" <linux-pwm@vger.kernel.org>
Subject: Re: [PATCH 2/3] PWM framework: add support referencing PWMs from ACPI
Date: Mon, 3 Jun 2019 11:27:36 +0200 (CEST) [thread overview]
Message-ID: <alpine.DEB.2.20.1906031120001.63281@fox.voss.local> (raw)
In-Reply-To: <d4e035b7-7419-cb69-9e22-6103d53d5aaf@ti.com>
Dan,
On Thu, 30 May 2019, Dan Murphy wrote:
> Nikolaus
>
> On 5/29/19 7:18 AM, Nikolaus Voss wrote:
>> In analogy to referencing a GPIO using the "gpios" property from ACPI,
>> support referencing a PWM using the "pwms" property.
>>
>> ACPI entries must look like
>> Package () {"pwms", Package ()
>> { <PWM device reference>, <PWM index>, <PWM period> [, <PWM flags>]}}
>>
>> In contrast to the DT implementation, only _one_ PWM entry in the "pwms"
>> property is supported. As a consequence "pwm-names"-property and
>> con_id lookup aren't supported.
>>
>> Support for ACPI is added via the firmware-node framework which is an
>> abstraction layer on top of ACPI/DT. To keep this patch clean, DT and
>> ACPI paths are kept separate. The firmware-node framework could be used
>> to unify both paths in a future patch.
>>
>> To support leds-pwm driver, an additional method devm_fwnode_pwm_get()
>> which supports both ACPI and DT configuration is exported.
>>
>> Signed-off-by: Nikolaus Voss <nikolaus.voss@loewensteinmedical.de>
>> ---
>> drivers/pwm/core.c | 112 ++++++++++++++++++++++++++++++++++++++++++++
>> include/linux/pwm.h | 9 ++++
>> 2 files changed, 121 insertions(+)
>>
>> diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c
>> index 275b5f399a1a..1d788c05193e 100644
>> --- a/drivers/pwm/core.c
>> +++ b/drivers/pwm/core.c
>> @@ -6,6 +6,7 @@
>> * Copyright (C) 2011-2012 Avionic Design GmbH
>> */
>>
>> +#include <linux/acpi.h>
>> #include <linux/module.h>
>> #include <linux/pwm.h>
>> #include <linux/radix-tree.h>
>> @@ -700,6 +701,75 @@ struct pwm_device *of_pwm_get(struct device_node *np, const char *con_id)
>> }
>> EXPORT_SYMBOL_GPL(of_pwm_get);
>>
>> +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);
>> +}
>> +
>> +/**
>> + * acpi_pwm_get() - request a PWM via parsing "pwms" property in ACPI
>> + * @fwnode: firmware node to get the "pwm" property from
>> + *
>> + * Returns the PWM device parsed from the fwnode and index specified in the
>> + * "pwms" property or a negative error-code on failure.
>> + * Values parsed from the device tree are stored in the returned PWM device
>> + * object.
>> + *
>> + * This is analogous to of_pwm_get() except con_id is not yet supported.
>> + * ACPI entries must look like
>> + * Package () {"pwms", Package ()
>> + * { <PWM device reference>, <PWM index>, <PWM period> [, <PWM flags>]}}
>> + *
>> + * Returns: A pointer to the requested PWM device or an ERR_PTR()-encoded
>> + * error code on failure.
>> + */
>> +struct pwm_device *acpi_pwm_get(struct fwnode_handle *fwnode)
> static?
yes, changed.
>> +{
>> + struct fwnode_reference_args args;
>> + struct pwm_chip *chip;
>> + struct pwm_device *pwm = ERR_PTR(-ENODEV);
>> + int ret;
>> +
>> + memset(&args, 0, sizeof(args));
>
> args should be zero'd out when initialized on the stack so this is
> necessary.
>
>> + ret = __acpi_node_get_property_reference(fwnode, "pwms", 0, 3, &args);
>> +
>> + if (!to_acpi_device_node(args.fwnode))
>> + return ERR_PTR(-EINVAL);
> Add new line
ok
>> + if (args.nargs < 2)
>> + return ERR_PTR(-EPROTO);
>> +
>> + chip = device_to_pwmchip(&to_acpi_device_node(args.fwnode)->dev);
>> + if (IS_ERR(chip))
>> + return ERR_CAST(chip);
>> +
>> + pwm = pwm_request_from_chip(chip, args.args[0], NULL);
>> + if (IS_ERR(pwm))
>> + return pwm;
>> +
>> + pwm->args.period = args.args[1];
>> + pwm->args.polarity = PWM_POLARITY_NORMAL;
>> +
>> + if (args.nargs > 2 && args.args[2] & PWM_POLARITY_INVERTED)
>> + pwm->args.polarity = PWM_POLARITY_INVERSED;
>> +
>> + return pwm;
>> +}
>> +
>> /**
>> * pwm_add_table() - register PWM device consumers
>> * @table: array of consumers to register
>> @@ -763,6 +833,10 @@ struct pwm_device *pwm_get(struct device *dev, const char *con_id)
>> if (IS_ENABLED(CONFIG_OF) && dev && dev->of_node)
>> return of_pwm_get(dev->of_node, con_id);
>>
>> + /* then lookup via ACPI */
>> + if (dev && is_acpi_node(dev->fwnode))
>> + return acpi_pwm_get(dev->fwnode);
>> +
>> /*
>> * We look up the provider in the static table typically provided by
>> * board setup code. We first try to lookup the consumer device by
>> @@ -942,6 +1016,44 @@ struct pwm_device *devm_of_pwm_get(struct device *dev, struct device_node *np,
>> }
>> EXPORT_SYMBOL_GPL(devm_of_pwm_get);
>>
>> +/**
>> + * devm_fwnode_pwm_get() - request a resource managed PWM from firmware node
>> + * @dev: device for PWM consumer
>> + * @fwnode: firmware node to get the PWM from
>> + * @con_id: consumer name
>> + *
>> + * Returns the PWM device parsed from the firmware node. See of_pwm_get() and
>> + * acpi_pwm_get() for a detailed description.
>> + *
>> + * Returns: A pointer to the requested PWM device or an ERR_PTR()-encoded
>> + * error code on failure.
>> + */
>> +struct pwm_device *devm_fwnode_pwm_get(struct device *dev,
>> + struct fwnode_handle *fwnode,
>> + const char *con_id)
>
> I am wondering if it would be better just to convert the existing of_
> calls to device_property calls and make it more generic.
With this first patch I wanted to keep DT and ACPI paths separate. Merging
the two paths as far as possible is reasonable but should be done in a
second step.
Nikolaus
next prev parent reply other threads:[~2019-06-03 9:27 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-29 12:18 [PATCH 0/3] PWM framework: add support referencing PWMs from ACPI Nikolaus Voss
2019-05-29 12:18 ` [PATCH 1/3] ACPI: Resolve objects on host-directed table loads Nikolaus Voss
2019-05-30 14:42 ` Dan Murphy
2019-05-31 12:23 ` Pavel Machek
2019-05-31 12:45 ` Dan Murphy
2019-05-31 12:46 ` Dan Murphy
2019-06-03 9:12 ` Nikolaus Voss
2019-08-14 18:50 ` Andy Shevchenko
2019-08-14 20:27 ` Schmauss, Erik
2019-08-16 11:57 ` Nikolaus Voss
2019-08-30 14:53 ` Shevchenko, Andriy
2019-09-04 7:20 ` Nikolaus Voss
2019-09-06 17:46 ` Shevchenko, Andriy
2019-09-12 8:05 ` Nikolaus Voss
2019-09-12 8:07 ` [PATCH] ACPICA: make acpi_load_table() return table index Nikolaus Voss
2019-09-12 14:19 ` Moore, Robert
2019-09-12 19:36 ` Ferry Toth
2019-09-25 18:13 ` Schmauss, Erik
2019-09-26 8:09 ` Shevchenko, Andriy
2019-09-13 7:44 ` Nikolaus Voss
2019-09-13 14:20 ` Moore, Robert
2019-09-13 15:12 ` Shevchenko, Andriy
2019-09-13 16:48 ` Ferry Toth
2019-09-13 16:48 ` Ferry Toth
2019-09-13 17:40 ` Moore, Robert
2019-09-13 19:56 ` Rafael J. Wysocki
2019-09-16 9:46 ` Nikolaus Voss
2019-09-18 14:13 ` Moore, Robert
2019-09-18 14:31 ` Nikolaus Voss
2019-09-19 17:05 ` Moore, Robert
2019-09-23 9:05 ` Nikolaus Voss
2019-09-24 19:41 ` Moore, Robert
2019-09-25 10:18 ` Nikolaus Voss
2019-09-25 10:53 ` Shevchenko, Andriy
2019-09-19 8:13 ` Rafael J. Wysocki
2019-09-23 9:08 ` Nikolaus Voss
2019-09-23 9:47 ` [PATCH] ACPICA: Introduce acpi_load_table_with_index() Nikolaus Voss
2019-09-24 12:07 ` Shevchenko, Andriy
2019-09-24 12:08 ` Shevchenko, Andriy
2019-09-25 10:20 ` Nikolaus Voss
2019-09-24 15:11 ` Andy Shevchenko
2019-09-25 10:22 ` Nikolaus Voss
2019-09-26 16:09 ` [PATCH] ACPICA: make acpi_load_table() return table index Schmauss, Erik
2019-09-26 16:35 ` Shevchenko, Andriy
2019-09-26 16:51 ` Schmauss, Erik
2019-09-26 17:47 ` Shevchenko, Andriy
2019-09-26 18:44 ` Nikolaus Voss
2019-09-26 19:26 ` Rafael J. Wysocki
2019-09-26 19:41 ` Schmauss, Erik
2019-09-26 18:43 ` Nikolaus Voss
2019-05-29 12:18 ` [PATCH 2/3] PWM framework: add support referencing PWMs from ACPI Nikolaus Voss
2019-05-30 14:54 ` Dan Murphy
2019-05-31 12:24 ` Pavel Machek
2019-06-03 9:27 ` Nikolaus Voss [this message]
2019-05-29 12:18 ` [PATCH 3/3] leds-pwm.c: support ACPI via firmware-node framework Nikolaus Voss
2019-05-30 15:14 ` Dan Murphy
2019-06-03 9:44 ` Nikolaus Voss
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=alpine.DEB.2.20.1906031120001.63281@fox.voss.local \
--to=nv@vosn.de \
--cc=devel@acpica.org \
--cc=dmurphy@ti.com \
--cc=erik.schmauss@intel.com \
--cc=jacek.anaszewski@gmail.com \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-leds@vger.kernel.org \
--cc=linux-pwm@vger.kernel.org \
--cc=pavel@ucw.cz \
--cc=rjw@rjwysocki.net \
--cc=robert.moore@intel.com \
--cc=thierry.reding@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).