pwm: cros-ec: Make use of devm_pwmchip_alloc() function
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Wed, 14 Feb 2024 09:31:18 +0000 (10:31 +0100)
committerUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Thu, 15 Feb 2024 11:59:21 +0000 (12:59 +0100)
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.

Reviewed-by: Tzung-Bi Shih <tzungbi@kernel.org>
Link: https://lore.kernel.org/r/b0afe9e25340f0a274ff3806687cf37a6cc31557.1707900770.git.u.kleine-koenig@pengutronix.de
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
drivers/pwm/pwm-cros-ec.c

index 968e300e9f06fc9dc7b50634b65df32780787faa..606ccfdaf4cc28457cd2a07fcabef1d66dd83c44 100644 (file)
  * struct cros_ec_pwm_device - Driver data for EC PWM
  *
  * @ec: Pointer to EC device
- * @chip: PWM controller chip
  * @use_pwm_type: Use PWM types instead of generic channels
  * @channel: array with per-channel data
  */
 struct cros_ec_pwm_device {
        struct cros_ec_device *ec;
-       struct pwm_chip chip;
        bool use_pwm_type;
        struct cros_ec_pwm *channel;
 };
@@ -40,7 +38,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_get_drvdata(chip);
 }
 
 static int cros_ec_dt_type_to_pwm_type(u8 dt_index, u8 *pwm_type)
@@ -264,34 +262,35 @@ 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 int 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;
-       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;
-
-       if (ec_pwm->use_pwm_type) {
-               chip->npwm = CROS_EC_PWM_DT_COUNT;
+       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);
                if (ret < 0)
                        return dev_err_probe(dev, ret, "Couldn't find PWMs\n");
-               chip->npwm = ret;
+               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;
+
+       /* PWM chip */
+       chip->ops = &cros_ec_pwm_ops;
+       chip->of_xlate = cros_ec_pwm_xlate;
+
        ec_pwm->channel = devm_kcalloc(dev, chip->npwm, sizeof(*ec_pwm->channel),
                                        GFP_KERNEL);
        if (!ec_pwm->channel)