static void *pwmchip_priv(struct pwm_chip *chip)
 {
-       return (void *)chip + ALIGN(sizeof(*chip), PWMCHIP_ALIGN);
+       return (void *)chip + ALIGN(struct_size(chip, pwms, chip->npwm), PWMCHIP_ALIGN);
 }
 
 /* This is the counterpart to pwmchip_alloc() */
 {
        struct pwm_chip *chip;
        size_t alloc_size;
+       unsigned int i;
 
-       alloc_size = size_add(ALIGN(sizeof(*chip), PWMCHIP_ALIGN), sizeof_priv);
+       alloc_size = size_add(ALIGN(struct_size(chip, pwms, npwm), PWMCHIP_ALIGN),
+                             sizeof_priv);
 
        chip = kzalloc(alloc_size, GFP_KERNEL);
        if (!chip)
 
        pwmchip_set_drvdata(chip, pwmchip_priv(chip));
 
+       for (i = 0; i < chip->npwm; i++) {
+               struct pwm_device *pwm = &chip->pwms[i];
+               pwm->chip = chip;
+               pwm->hwpwm = i;
+       }
+
        return chip;
 }
 EXPORT_SYMBOL_GPL(pwmchip_alloc);
  */
 int __pwmchip_add(struct pwm_chip *chip, struct module *owner)
 {
-       unsigned int i;
        int ret;
 
        if (!chip || !pwmchip_parent(chip) || !chip->ops || !chip->npwm)
 
        chip->owner = owner;
 
-       chip->pwms = kcalloc(chip->npwm, sizeof(*chip->pwms), GFP_KERNEL);
-       if (!chip->pwms)
-               return -ENOMEM;
-
        mutex_lock(&pwm_lock);
 
        ret = idr_alloc(&pwm_chips, chip, 0, 0, GFP_KERNEL);
        if (ret < 0) {
                mutex_unlock(&pwm_lock);
-               kfree(chip->pwms);
                return ret;
        }
 
        chip->id = ret;
 
-       for (i = 0; i < chip->npwm; i++) {
-               struct pwm_device *pwm = &chip->pwms[i];
-
-               pwm->chip = chip;
-               pwm->hwpwm = i;
-       }
-
        mutex_unlock(&pwm_lock);
 
        if (IS_ENABLED(CONFIG_OF))
        idr_remove(&pwm_chips, chip->id);
 
        mutex_unlock(&pwm_lock);
-
-       kfree(chip->pwms);
 }
 EXPORT_SYMBOL_GPL(pwmchip_remove);