diff options
| author | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
| commit | 1ac731c529cd4d6adbce134754b51ff7d822b145 (patch) | |
| tree | 143ab3f35ca5f3b69f583c84e6964b17139c2ec1 /drivers/pwm/core.c | |
| parent | 07b4c950f27bef0362dc6ad7ee713aab61d58149 (diff) | |
| parent | 54116d442e001e1b6bd482122043b1870998a1f3 (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 6.6 merge window.
Diffstat (limited to 'drivers/pwm/core.c')
| -rw-r--r-- | drivers/pwm/core.c | 83 | 
1 files changed, 13 insertions, 70 deletions
diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c index e01147f66e15..3dacceaef4a9 100644 --- a/drivers/pwm/core.c +++ b/drivers/pwm/core.c @@ -28,17 +28,11 @@  static DEFINE_MUTEX(pwm_lookup_lock);  static LIST_HEAD(pwm_lookup_list); -/* protects access to pwm_chips, allocated_pwms, and pwm_tree */ +/* protects access to pwm_chips and allocated_pwms */  static DEFINE_MUTEX(pwm_lock);  static LIST_HEAD(pwm_chips);  static DECLARE_BITMAP(allocated_pwms, MAX_PWMS); -static RADIX_TREE(pwm_tree, GFP_KERNEL); - -static struct pwm_device *pwm_to_device(unsigned int pwm) -{ -	return radix_tree_lookup(&pwm_tree, pwm); -}  /* Called with pwm_lock held */  static int alloc_pwms(unsigned int count) @@ -59,14 +53,6 @@ static int alloc_pwms(unsigned int count)  /* Called with pwm_lock held */  static void free_pwms(struct pwm_chip *chip)  { -	unsigned int i; - -	for (i = 0; i < chip->npwm; i++) { -		struct pwm_device *pwm = &chip->pwms[i]; - -		radix_tree_delete(&pwm_tree, pwm->pwm); -	} -  	bitmap_clear(allocated_pwms, chip->base, chip->npwm);  	kfree(chip->pwms); @@ -115,7 +101,14 @@ static int pwm_device_request(struct pwm_device *pwm, const char *label)  	}  	if (pwm->chip->ops->get_state) { -		struct pwm_state state; +		/* +		 * Zero-initialize state because most drivers are unaware of +		 * .usage_power. The other members of state are supposed to be +		 * set by lowlevel drivers. We still initialize the whole +		 * structure for simplicity even though this might paper over +		 * faulty implementations of .get_state(). +		 */ +		struct pwm_state state = { 0, };  		err = pwm->chip->ops->get_state(pwm->chip, pwm, &state);  		trace_pwm_get(pwm, &state, err); @@ -300,8 +293,6 @@ int pwmchip_add(struct pwm_chip *chip)  		pwm->chip = chip;  		pwm->pwm = chip->base + i;  		pwm->hwpwm = i; - -		radix_tree_insert(&pwm_tree, pwm->pwm, pwm);  	}  	list_add(&chip->list, &pwm_chips); @@ -363,43 +354,6 @@ int devm_pwmchip_add(struct device *dev, struct pwm_chip *chip)  EXPORT_SYMBOL_GPL(devm_pwmchip_add);  /** - * pwm_request() - request a PWM device - * @pwm: global PWM device index - * @label: PWM device label - * - * This function is deprecated, use pwm_get() instead. - * - * Returns: A pointer to a PWM device or an ERR_PTR()-encoded error code on - * failure. - */ -struct pwm_device *pwm_request(int pwm, const char *label) -{ -	struct pwm_device *dev; -	int err; - -	if (pwm < 0 || pwm >= MAX_PWMS) -		return ERR_PTR(-EINVAL); - -	mutex_lock(&pwm_lock); - -	dev = pwm_to_device(pwm); -	if (!dev) { -		dev = ERR_PTR(-EPROBE_DEFER); -		goto out; -	} - -	err = pwm_device_request(dev, label); -	if (err < 0) -		dev = ERR_PTR(err); - -out: -	mutex_unlock(&pwm_lock); - -	return dev; -} -EXPORT_SYMBOL_GPL(pwm_request); - -/**   * pwm_request_from_chip() - request a PWM device relative to a PWM chip   * @chip: PWM chip   * @index: per-chip index of the PWM to request @@ -431,24 +385,12 @@ struct pwm_device *pwm_request_from_chip(struct pwm_chip *chip,  }  EXPORT_SYMBOL_GPL(pwm_request_from_chip); -/** - * pwm_free() - free a PWM device - * @pwm: PWM device - * - * This function is deprecated, use pwm_put() instead. - */ -void pwm_free(struct pwm_device *pwm) -{ -	pwm_put(pwm); -} -EXPORT_SYMBOL_GPL(pwm_free); -  static void pwm_apply_state_debug(struct pwm_device *pwm,  				  const struct pwm_state *state)  {  	struct pwm_state *last = &pwm->last;  	struct pwm_chip *chip = pwm->chip; -	struct pwm_state s1, s2; +	struct pwm_state s1 = { 0 }, s2 = { 0 };  	int err;  	if (!IS_ENABLED(CONFIG_PWM_DEBUG)) @@ -530,6 +472,7 @@ static void pwm_apply_state_debug(struct pwm_device *pwm,  		return;  	} +	*last = (struct pwm_state){ 0 };  	err = chip->ops->get_state(chip, pwm, last);  	trace_pwm_get(pwm, last, err);  	if (err) @@ -782,7 +725,7 @@ static struct pwm_device *of_pwm_get(struct device *dev, struct device_node *np,  	dl = pwm_device_link_add(dev, pwm);  	if (IS_ERR(dl)) {  		/* of_xlate ended up calling pwm_request_from_chip() */ -		pwm_free(pwm); +		pwm_put(pwm);  		pwm = ERR_CAST(dl);  		goto put;  	} @@ -1006,7 +949,7 @@ struct pwm_device *pwm_get(struct device *dev, const char *con_id)  	dl = pwm_device_link_add(dev, pwm);  	if (IS_ERR(dl)) { -		pwm_free(pwm); +		pwm_put(pwm);  		return ERR_CAST(dl);  	}  |