diff mbox series

[v3,051/108] pwm: cros-ec: Make use of devm_pwmchip_alloc() function

Message ID 20231121134901.208535-52-u.kleine-koenig@pengutronix.de
State Superseded
Headers show
Series pwm: Fix lifetime issues for pwm_chips | expand

Commit Message

Uwe Kleine-König Nov. 21, 2023, 1:49 p.m. UTC
This prepares the pwm-cros-ec driver to further changes of the pwm core
outlined in the commit introducing devm_pwmchip_alloc(). There is no
intended semantical change and the driver should behave as before.
The probe function had to be changed a bit because the number of PWMs
must be determined before allocation of the pwm_chip and its private
data now.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
 drivers/pwm/pwm-cros-ec.c | 42 +++++++++++++++++++--------------------
 1 file changed, 21 insertions(+), 21 deletions(-)

Comments

Tzung-Bi Shih Nov. 22, 2023, 8:52 a.m. UTC | #1
On Tue, Nov 21, 2023 at 02:49:53PM +0100, Uwe Kleine-König wrote:
> @@ -41,7 +40,7 @@ struct cros_ec_pwm {
>  
>  static inline struct cros_ec_pwm_device *pwm_to_cros_ec_pwm(struct pwm_chip *chip)
>  {
> -	return container_of(chip, struct cros_ec_pwm_device, chip);
> +	return pwmchip_priv(chip);

Or just replace every `pwm_to_cros_ec_pwm` to `pwmchip_priv`.

> @@ -226,13 +225,13 @@ static const struct pwm_ops cros_ec_pwm_ops = {
>   * of PWMs it supports directly, so we have to read the pwm duty cycle for
>   * subsequent channels until we get an error.
>   */
> -static int cros_ec_num_pwms(struct cros_ec_pwm_device *ec_pwm)
> +static int cros_ec_num_pwms(struct cros_ec_device *ec, bool use_pwm_type)

As replied in previous patch, `use_pwm_type` in the path is always false.

> @@ -261,35 +260,36 @@ static int cros_ec_pwm_probe(struct platform_device *pdev)
>  	struct device_node *np = pdev->dev.of_node;
>  	struct cros_ec_pwm_device *ec_pwm;
>  	struct pwm_chip *chip;
> +	bool use_pwm_type = false;
> +	unsigned npwm;

To be neat, `unsigned int`.

[...]
> +	chip = devm_pwmchip_alloc(dev, npwm, sizeof(*ec_pwm));
> +	if (IS_ERR(chip))
> +		return PTR_ERR(chip);
> +
> +	ec_pwm = pwm_to_cros_ec_pwm(chip);

pwmchip_priv().
Uwe Kleine-König Nov. 22, 2023, 11:56 p.m. UTC | #2
Hello,

On Wed, Nov 22, 2023 at 04:52:44PM +0800, Tzung-Bi Shih wrote:
> On Tue, Nov 21, 2023 at 02:49:53PM +0100, Uwe Kleine-König wrote:
> > @@ -41,7 +40,7 @@ struct cros_ec_pwm {
> >  
> >  static inline struct cros_ec_pwm_device *pwm_to_cros_ec_pwm(struct pwm_chip *chip)
> >  {
> > -	return container_of(chip, struct cros_ec_pwm_device, chip);
> > +	return pwmchip_priv(chip);
> 
> Or just replace every `pwm_to_cros_ec_pwm` to `pwmchip_priv`.

An advantage of the pwm_to_cros_ec_pwm() wrapper is that it yields the
right type. I'd keep it for this series to keep amount of the changes
small (and also because I like to keep the wrapper).

Feel free to propose a patch replacing pwm_to_cros_ec_pwm() by
pwmchip_priv() when this code landed in the mainline.

I'll look into the other things you pointed out. Thanks for your review.

Best regards
Uwe
diff mbox series

Patch

diff --git a/drivers/pwm/pwm-cros-ec.c b/drivers/pwm/pwm-cros-ec.c
index 0ce8220646ea..290b22423804 100644
--- a/drivers/pwm/pwm-cros-ec.c
+++ b/drivers/pwm/pwm-cros-ec.c
@@ -26,7 +26,6 @@ 
  */
 struct cros_ec_pwm_device {
 	struct cros_ec_device *ec;
-	struct pwm_chip chip;
 	bool use_pwm_type;
 	struct cros_ec_pwm *channel;
 };
@@ -41,7 +40,7 @@  struct cros_ec_pwm {
 
 static inline struct cros_ec_pwm_device *pwm_to_cros_ec_pwm(struct pwm_chip *chip)
 {
-	return container_of(chip, struct cros_ec_pwm_device, chip);
+	return pwmchip_priv(chip);
 }
 
 static int cros_ec_dt_type_to_pwm_type(u8 dt_index, u8 *pwm_type)
@@ -226,13 +225,13 @@  static const struct pwm_ops cros_ec_pwm_ops = {
  * of PWMs it supports directly, so we have to read the pwm duty cycle for
  * subsequent channels until we get an error.
  */
-static int cros_ec_num_pwms(struct cros_ec_pwm_device *ec_pwm)
+static int cros_ec_num_pwms(struct cros_ec_device *ec, bool use_pwm_type)
 {
 	int i, ret;
 
 	/* The index field is only 8 bits */
 	for (i = 0; i <= U8_MAX; i++) {
-		ret = cros_ec_pwm_get_duty(ec_pwm->ec, ec_pwm->use_pwm_type, i);
+		ret = cros_ec_pwm_get_duty(ec, use_pwm_type, i);
 		/*
 		 * We look for SUCCESS, INVALID_COMMAND, or INVALID_PARAM
 		 * responses; everything else is treated as an error.
@@ -261,35 +260,36 @@  static int cros_ec_pwm_probe(struct platform_device *pdev)
 	struct device_node *np = pdev->dev.of_node;
 	struct cros_ec_pwm_device *ec_pwm;
 	struct pwm_chip *chip;
+	bool use_pwm_type = false;
+	unsigned npwm;
 	int ret;
 
 	if (!ec)
 		return dev_err_probe(dev, -EINVAL, "no parent EC device\n");
 
-	ec_pwm = devm_kzalloc(dev, sizeof(*ec_pwm), GFP_KERNEL);
-	if (!ec_pwm)
-		return -ENOMEM;
-	chip = &ec_pwm->chip;
+	if (of_device_is_compatible(np, "google,cros-ec-pwm-type")) {
+		use_pwm_type = true;
+		npwm = CROS_EC_PWM_DT_COUNT;
+	} else {
+		ret = cros_ec_num_pwms(ec, use_pwm_type);
+		if (ret < 0)
+			return dev_err_probe(dev, ret, "Couldn't find PWMs\n");
+		npwm = ret;
+	}
+
+	chip = devm_pwmchip_alloc(dev, npwm, sizeof(*ec_pwm));
+	if (IS_ERR(chip))
+		return PTR_ERR(chip);
+
+	ec_pwm = pwm_to_cros_ec_pwm(chip);
+	ec_pwm->use_pwm_type = use_pwm_type;
 	ec_pwm->ec = ec;
 
-	if (of_device_is_compatible(np, "google,cros-ec-pwm-type"))
-		ec_pwm->use_pwm_type = true;
-
 	/* PWM chip */
-	chip->dev = dev;
 	chip->ops = &cros_ec_pwm_ops;
 	chip->of_xlate = cros_ec_pwm_xlate;
 	chip->of_pwm_n_cells = 1;
 
-	if (ec_pwm->use_pwm_type) {
-		chip->npwm = CROS_EC_PWM_DT_COUNT;
-	} else {
-		ret = cros_ec_num_pwms(ec_pwm);
-		if (ret < 0)
-			return dev_err_probe(dev, ret, "Couldn't find PWMs\n");
-		chip->npwm = ret;
-	}
-
 	ec_pwm->channel = devm_kcalloc(dev, chip->npwm, sizeof(*ec_pwm->channel),
 					GFP_KERNEL);
 	if (!ec_pwm->channel)