-
- ddata = (struct rkxx_remotectl_drvdata *)dev_id;
- switch (ddata->remote_pwm_id) {
- case 0: {
- val = readl_relaxed(ddata->base + PWM0_REG_INTSTS);
- if (val & PWM_CH0_INT) {
- if ((val & PWM_CH0_POL) == 0) {
- val = readl_relaxed(ddata->base + PWM_REG_HPR);
- ddata->period = val;
- tasklet_hi_schedule(&ddata->remote_tasklet);
- DBG("hpr=0x%x\n", val);
- } else {
- val = readl_relaxed(ddata->base + PWM_REG_LPR);
- DBG("lpr=0x%x\n", val);
- }
- writel_relaxed(PWM_CH0_INT, ddata->base + PWM0_REG_INTSTS);
- if (ddata->state == RMC_PRELOAD)
- wake_lock_timeout(&ddata->remotectl_wake_lock, HZ);
- return IRQ_HANDLED;
- }
- }
- break;
- case 1: {
- val = readl_relaxed(ddata->base + PWM1_REG_INTSTS);
- if (val & PWM_CH1_INT) {
- if ((val & PWM_CH1_POL) == 0) {
- val = readl_relaxed(ddata->base + PWM_REG_HPR);
- ddata->period = val;
- tasklet_hi_schedule(&ddata->remote_tasklet);
- DBG("hpr=0x%x\n", val);
- } else {
- val = readl_relaxed(ddata->base + PWM_REG_LPR);
- DBG("lpr=0x%x\n", val);
- }
- writel_relaxed(PWM_CH1_INT, ddata->base + PWM1_REG_INTSTS);
- if (ddata->state == RMC_PRELOAD)
- wake_lock_timeout(&ddata->remotectl_wake_lock, HZ);
- return IRQ_HANDLED;
- }
- }
- break;
- case 2: {
- val = readl_relaxed(ddata->base + PWM2_REG_INTSTS);
- if (val & PWM_CH2_INT) {
- if ((val & PWM_CH2_POL) == 0) {
- val = readl_relaxed(ddata->base + PWM_REG_HPR);
- ddata->period = val;
- tasklet_hi_schedule(&ddata->remote_tasklet);
- DBG("hpr=0x%x\n", val);
- } else {
- val = readl_relaxed(ddata->base + PWM_REG_LPR);
- DBG("lpr=0x%x\n", val);
- }
- writel_relaxed(PWM_CH2_INT, ddata->base + PWM2_REG_INTSTS);
- if (ddata->state == RMC_PRELOAD)
- wake_lock_timeout(&ddata->remotectl_wake_lock, HZ);
- return IRQ_HANDLED;
- }
- }
- break;
- case 3: {
- val = readl_relaxed(ddata->base + PWM3_REG_INTSTS);
- if (val & PWM_CH3_INT) {
- if ((val & PWM_CH3_POL) == 0) {
- val = readl_relaxed(ddata->base + PWM_REG_HPR);
- ddata->period = val;
- tasklet_hi_schedule(&ddata->remote_tasklet);
- DBG("hpr=0x%x\n", val);
- } else {
- val = readl_relaxed(ddata->base + PWM_REG_LPR);
- DBG("lpr=0x%x\n", val);
- }
- writel_relaxed(PWM_CH3_INT, ddata->base + PWM3_REG_INTSTS);
- if (ddata->state == RMC_PRELOAD)
- wake_lock_timeout(&ddata->remotectl_wake_lock, HZ);
- return IRQ_HANDLED;
+ int temp_hpr;
+ int temp_lpr;
+ int temp_period;
+ unsigned int id = ddata->remote_pwm_id;
+
+ if (id > 3)
+ return IRQ_NONE;
+ val = readl_relaxed(ddata->base + PWM_REG_INTSTS(id));
+ if ((val & PWM_CH_INT(id)) == 0)
+ return IRQ_NONE;
+ if ((val & PWM_CH_POL(id)) == 0) {
+ temp_hpr = readl_relaxed(ddata->base + PWM_REG_HPR);
+ DBG("hpr=%d\n", temp_hpr);
+ temp_lpr = readl_relaxed(ddata->base + PWM_REG_LPR);
+ DBG("lpr=%d\n", temp_lpr);
+ temp_period = ddata->pwm_freq_nstime * temp_lpr / 1000;
+ if (temp_period > RK_PWM_TIME_BIT0_MIN) {
+ ddata->period = ddata->temp_period
+ + ddata->pwm_freq_nstime * temp_hpr / 1000;
+ tasklet_hi_schedule(&ddata->remote_tasklet);
+ ddata->temp_period = 0;
+ DBG("period+ =%ld\n", ddata->period);
+ } else {
+ ddata->temp_period += ddata->pwm_freq_nstime
+ * (temp_hpr + temp_lpr) / 1000;