diff mbox

[v2,2/3] pwm/core: Try to get the module from pwm_get

Message ID 20170122161409.21601-3-hdegoede@redhat.com
State Accepted
Headers show

Commit Message

Hans de Goede Jan. 22, 2017, 4:14 p.m. UTC
Add a module_name string to the pwm_lookup struct and if specified
and pwmchip_find_by_name() does not find the pwmchip try calling
request_module with the specified name.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 drivers/pwm/core.c  |  4 ++++
 include/linux/pwm.h | 11 +++++++++--
 2 files changed, 13 insertions(+), 2 deletions(-)

Comments

Thierry Reding Jan. 30, 2017, 8:17 a.m. UTC | #1
On Sun, Jan 22, 2017 at 05:14:08PM +0100, Hans de Goede wrote:
> Add a module_name string to the pwm_lookup struct and if specified
> and pwmchip_find_by_name() does not find the pwmchip try calling
> request_module with the specified name.
> 
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> ---
>  drivers/pwm/core.c  |  4 ++++
>  include/linux/pwm.h | 11 +++++++++--
>  2 files changed, 13 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c
> index 0d3ef29..c418a7a 100644
> --- a/drivers/pwm/core.c
> +++ b/drivers/pwm/core.c
> @@ -823,6 +823,10 @@ struct pwm_device *pwm_get(struct device *dev, const char *con_id)
>  		return ERR_PTR(-ENODEV);
>  
>  	chip = pwmchip_find_by_name(chosen->provider);
> +	if (!chip && chosen->module_name) {
> +		request_module(chosen->module_name);

How about checking for an error code here? It's kind of pointless to try
again if the module didn't load in the first place. No need to respin, I
can make that change as I apply.

Thierry
Hans de Goede Jan. 30, 2017, 2:18 p.m. UTC | #2
Hi,

On 30-01-17 09:17, Thierry Reding wrote:
> On Sun, Jan 22, 2017 at 05:14:08PM +0100, Hans de Goede wrote:
>> Add a module_name string to the pwm_lookup struct and if specified
>> and pwmchip_find_by_name() does not find the pwmchip try calling
>> request_module with the specified name.
>>
>> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
>> ---
>>  drivers/pwm/core.c  |  4 ++++
>>  include/linux/pwm.h | 11 +++++++++--
>>  2 files changed, 13 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c
>> index 0d3ef29..c418a7a 100644
>> --- a/drivers/pwm/core.c
>> +++ b/drivers/pwm/core.c
>> @@ -823,6 +823,10 @@ struct pwm_device *pwm_get(struct device *dev, const char *con_id)
>>  		return ERR_PTR(-ENODEV);
>>
>>  	chip = pwmchip_find_by_name(chosen->provider);
>> +	if (!chip && chosen->module_name) {
>> +		request_module(chosen->module_name);
>
> How about checking for an error code here? It's kind of pointless to try
> again if the module didn't load in the first place. No need to respin, I
> can make that change as I apply.

Sure, that is fine.

Regards,

Hans
--
To unsubscribe from this list: send the line "unsubscribe linux-pwm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c
index 0d3ef29..c418a7a 100644
--- a/drivers/pwm/core.c
+++ b/drivers/pwm/core.c
@@ -823,6 +823,10 @@  struct pwm_device *pwm_get(struct device *dev, const char *con_id)
 		return ERR_PTR(-ENODEV);
 
 	chip = pwmchip_find_by_name(chosen->provider);
+	if (!chip && chosen->module_name) {
+		request_module(chosen->module_name);
+		chip = pwmchip_find_by_name(chosen->provider);
+	}
 	if (!chip)
 		return ERR_PTR(-EPROBE_DEFER);
 
diff --git a/include/linux/pwm.h b/include/linux/pwm.h
index 2c6c511..40ab8b6 100644
--- a/include/linux/pwm.h
+++ b/include/linux/pwm.h
@@ -613,18 +613,25 @@  struct pwm_lookup {
 	const char *con_id;
 	unsigned int period;
 	enum pwm_polarity polarity;
+	const char *module_name; /* Optional may be NULL */
 };
 
-#define PWM_LOOKUP(_provider, _index, _dev_id, _con_id, _period, _polarity) \
+#define PWM_LOOKUP_MODNAME(_provider, _index, _dev_id, _con_id, _period, \
+			   _polarity, _module_name) \
 	{						\
 		.provider = _provider,			\
 		.index = _index,			\
 		.dev_id = _dev_id,			\
 		.con_id = _con_id,			\
 		.period = _period,			\
-		.polarity = _polarity			\
+		.polarity = _polarity,			\
+		.module_name = _module_name		\
 	}
 
+#define PWM_LOOKUP(_provider, _index, _dev_id, _con_id, _period, _polarity) \
+	PWM_LOOKUP_MODNAME(_provider, _index, _dev_id, _con_id, _period, \
+			   _polarity, NULL)
+
 #if IS_ENABLED(CONFIG_PWM)
 void pwm_add_table(struct pwm_lookup *table, size_t num);
 void pwm_remove_table(struct pwm_lookup *table, size_t num);