{
        struct dwc_pwm *dwc = to_dwc_pwm(chip);
        u64 duty, period;
+       u32 ctrl, ld, ld2;
 
        pm_runtime_get_sync(chip->dev);
 
-       state->enabled = !!(dwc_pwm_readl(dwc,
-                               DWC_TIM_CTRL(pwm->hwpwm)) & DWC_TIM_CTRL_EN);
+       ctrl = dwc_pwm_readl(dwc, DWC_TIM_CTRL(pwm->hwpwm));
+       ld = dwc_pwm_readl(dwc, DWC_TIM_LD_CNT(pwm->hwpwm));
+       ld2 = dwc_pwm_readl(dwc, DWC_TIM_LD_CNT2(pwm->hwpwm));
 
-       duty = dwc_pwm_readl(dwc, DWC_TIM_LD_CNT(pwm->hwpwm));
-       duty += 1;
-       duty *= dwc->clk_ns;
-       state->duty_cycle = duty;
+       state->enabled = !!(ctrl & DWC_TIM_CTRL_EN);
 
-       period = dwc_pwm_readl(dwc, DWC_TIM_LD_CNT2(pwm->hwpwm));
-       period += 1;
-       period *= dwc->clk_ns;
-       period += duty;
-       state->period = period;
+       /*
+        * If we're not in PWM, technically the output is a 50-50
+        * based on the timer load-count only.
+        */
+       if (ctrl & DWC_TIM_CTRL_PWM) {
+               duty = (ld + 1) * dwc->clk_ns;
+               period = (ld2 + 1)  * dwc->clk_ns;
+               period += duty;
+       } else {
+               duty = (ld + 1) * dwc->clk_ns;
+               period = duty * 2;
+       }
 
        state->polarity = PWM_POLARITY_INVERSED;
+       state->period = period;
+       state->duty_cycle = duty;
 
        pm_runtime_put_sync(chip->dev);