void __iomem *base;
        struct clk *clk;
+       struct tpu_pwm_device tpd[TPU_CHANNEL_MAX];
 };
 
 #define to_tpu_device(c)       container_of(c, struct tpu_device, chip)
        if (pwm->hwpwm >= TPU_CHANNEL_MAX)
                return -EINVAL;
 
-       tpd = kzalloc(sizeof(*tpd), GFP_KERNEL);
-       if (tpd == NULL)
-               return -ENOMEM;
+       tpd = &tpu->tpd[pwm->hwpwm];
 
        tpd->tpu = tpu;
        tpd->channel = pwm->hwpwm;
 
        tpd->timer_on = false;
 
-       pwm_set_chip_data(pwm, tpd);
-
        return 0;
 }
 
 static void tpu_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm)
 {
-       struct tpu_pwm_device *tpd = pwm_get_chip_data(pwm);
+       struct tpu_device *tpu = to_tpu_device(chip);
+       struct tpu_pwm_device *tpd = &tpu->tpd[pwm->hwpwm];
 
        tpu_pwm_timer_stop(tpd);
-       kfree(tpd);
 }
 
 static int tpu_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
                          u64 duty_ns, u64 period_ns, bool enabled)
 {
-       struct tpu_pwm_device *tpd = pwm_get_chip_data(pwm);
        struct tpu_device *tpu = to_tpu_device(chip);
+       struct tpu_pwm_device *tpd = &tpu->tpd[pwm->hwpwm];
        unsigned int prescaler;
        bool duty_only = false;
        u32 clk_rate;
 static int tpu_pwm_set_polarity(struct pwm_chip *chip, struct pwm_device *pwm,
                                enum pwm_polarity polarity)
 {
-       struct tpu_pwm_device *tpd = pwm_get_chip_data(pwm);
+       struct tpu_device *tpu = to_tpu_device(chip);
+       struct tpu_pwm_device *tpd = &tpu->tpd[pwm->hwpwm];
 
        tpd->polarity = polarity;
 
 
 static int tpu_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
 {
-       struct tpu_pwm_device *tpd = pwm_get_chip_data(pwm);
+       struct tpu_device *tpu = to_tpu_device(chip);
+       struct tpu_pwm_device *tpd = &tpu->tpd[pwm->hwpwm];
        int ret;
 
        ret = tpu_pwm_timer_start(tpd);
 
 static void tpu_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
 {
-       struct tpu_pwm_device *tpd = pwm_get_chip_data(pwm);
+       struct tpu_device *tpu = to_tpu_device(chip);
+       struct tpu_pwm_device *tpd = &tpu->tpd[pwm->hwpwm];
 
        /* The timer must be running to modify the pin output configuration. */
        tpu_pwm_timer_start(tpd);