diff options
Diffstat (limited to 'drivers/pwm/core.c')
| -rw-r--r-- | drivers/pwm/core.c | 38 | 
1 files changed, 34 insertions, 4 deletions
diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c index 7d6081879c1..32221cb0cbe 100644 --- a/drivers/pwm/core.c +++ b/drivers/pwm/core.c @@ -473,7 +473,7 @@ static struct pwm_chip *of_node_to_pwmchip(struct device_node *np)  }  /** - * of_pwm_request() - request a PWM via the PWM framework + * of_pwm_get() - request a PWM via the PWM framework   * @np: device node to get the PWM from   * @con_id: consumer name   * @@ -488,8 +488,7 @@ static struct pwm_chip *of_node_to_pwmchip(struct device_node *np)   * becomes mandatory for devices that look up the PWM device via the con_id   * parameter.   */ -static struct pwm_device *of_pwm_request(struct device_node *np, -					 const char *con_id) +struct pwm_device *of_pwm_get(struct device_node *np, const char *con_id)  {  	struct pwm_device *pwm = NULL;  	struct of_phandle_args args; @@ -547,6 +546,7 @@ put:  	return pwm;  } +EXPORT_SYMBOL_GPL(of_pwm_get);  /**   * pwm_add_table() - register PWM device consumers @@ -589,7 +589,7 @@ struct pwm_device *pwm_get(struct device *dev, const char *con_id)  	/* look up via DT first */  	if (IS_ENABLED(CONFIG_OF) && dev && dev->of_node) -		return of_pwm_request(dev->of_node, con_id); +		return of_pwm_get(dev->of_node, con_id);  	/*  	 * We look up the provider in the static table typically provided by @@ -710,6 +710,36 @@ struct pwm_device *devm_pwm_get(struct device *dev, const char *con_id)  }  EXPORT_SYMBOL_GPL(devm_pwm_get); +/** + * devm_of_pwm_get() - resource managed of_pwm_get() + * @dev: device for PWM consumer + * @np: device node to get the PWM from + * @con_id: consumer name + * + * This function performs like of_pwm_get() but the acquired PWM device will + * automatically be released on driver detach. + */ +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); + +	pwm = of_pwm_get(np, con_id); +	if (!IS_ERR(pwm)) { +		*ptr = pwm; +		devres_add(dev, ptr); +	} else { +		devres_free(ptr); +	} + +	return pwm; +} +EXPORT_SYMBOL_GPL(devm_of_pwm_get); +  static int devm_pwm_match(struct device *dev, void *res, void *data)  {  	struct pwm_device **p = res;  |