lpc18xx_pwm_writel(lpc18xx_pwm, LPC18XX_PWM_LIMIT,
                           BIT(lpc18xx_pwm->period_event));
 
-       ret = pwmchip_add(&lpc18xx_pwm->chip);
-       if (ret < 0) {
-               dev_err(&pdev->dev, "pwmchip_add failed: %d\n", ret);
-               goto disable_pwmclk;
-       }
-
        for (i = 0; i < lpc18xx_pwm->chip.npwm; i++) {
                struct lpc18xx_pwm_data *data;
 
                                    GFP_KERNEL);
                if (!data) {
                        ret = -ENOMEM;
-                       goto remove_pwmchip;
+                       goto disable_pwmclk;
                }
 
                pwm_set_chip_data(pwm, data);
        }
 
-       platform_set_drvdata(pdev, lpc18xx_pwm);
-
        val = lpc18xx_pwm_readl(lpc18xx_pwm, LPC18XX_PWM_CTRL);
        val &= ~LPC18XX_PWM_BIDIR;
        val &= ~LPC18XX_PWM_CTRL_HALT;
        val |= LPC18XX_PWM_PRE(0);
        lpc18xx_pwm_writel(lpc18xx_pwm, LPC18XX_PWM_CTRL, val);
 
+       ret = pwmchip_add(&lpc18xx_pwm->chip);
+       if (ret < 0) {
+               dev_err(&pdev->dev, "pwmchip_add failed: %d\n", ret);
+               goto disable_pwmclk;
+       }
+
+       platform_set_drvdata(pdev, lpc18xx_pwm);
+
        return 0;
 
-remove_pwmchip:
-       pwmchip_remove(&lpc18xx_pwm->chip);
 disable_pwmclk:
        clk_disable_unprepare(lpc18xx_pwm->pwm_clk);
        return ret;