]> Git Repo - J-linux.git/blobdiff - drivers/pwm/pwm-stm32.c
Merge tag 'amd-drm-next-6.5-2023-06-09' of https://gitlab.freedesktop.org/agd5f/linux...
[J-linux.git] / drivers / pwm / pwm-stm32.c
index 794ca5b029681f6668f13c23d2865105ab2dfbdc..62e397aeb9aa3ff59c19ea1d0a6d89e8f7fbbcce 100644 (file)
@@ -115,14 +115,14 @@ static int stm32_pwm_raw_capture(struct stm32_pwm *priv, struct pwm_device *pwm,
        int ret;
 
        /* Ensure registers have been updated, enable counter and capture */
-       regmap_update_bits(priv->regmap, TIM_EGR, TIM_EGR_UG, TIM_EGR_UG);
-       regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN, TIM_CR1_CEN);
+       regmap_set_bits(priv->regmap, TIM_EGR, TIM_EGR_UG);
+       regmap_set_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN);
 
        /* Use cc1 or cc3 DMA resp for PWM input channels 1 & 2 or 3 & 4 */
        dma_id = pwm->hwpwm < 2 ? STM32_TIMERS_DMA_CH1 : STM32_TIMERS_DMA_CH3;
        ccen = pwm->hwpwm < 2 ? TIM_CCER_CC12E : TIM_CCER_CC34E;
        ccr = pwm->hwpwm < 2 ? TIM_CCR1 : TIM_CCR3;
-       regmap_update_bits(priv->regmap, TIM_CCER, ccen, ccen);
+       regmap_set_bits(priv->regmap, TIM_CCER, ccen);
 
        /*
         * Timer DMA burst mode. Request 2 registers, 2 bursts, to get both
@@ -160,8 +160,8 @@ static int stm32_pwm_raw_capture(struct stm32_pwm *priv, struct pwm_device *pwm,
        }
 
 stop:
-       regmap_update_bits(priv->regmap, TIM_CCER, ccen, 0);
-       regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN, 0);
+       regmap_clear_bits(priv->regmap, TIM_CCER, ccen);
+       regmap_clear_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN);
 
        return ret;
 }
@@ -207,6 +207,10 @@ static int stm32_pwm_capture(struct pwm_chip *chip, struct pwm_device *pwm,
        regmap_write(priv->regmap, TIM_ARR, priv->max_arr);
        regmap_write(priv->regmap, TIM_PSC, psc);
 
+       /* Reset input selector to its default input and disable slave mode */
+       regmap_write(priv->regmap, TIM_TISEL, 0x0);
+       regmap_write(priv->regmap, TIM_SMCR, 0x0);
+
        /* Map TI1 or TI2 PWM input to IC1 & IC2 (or TI3/4 to IC3 & IC4) */
        regmap_update_bits(priv->regmap,
                           pwm->hwpwm < 2 ? TIM_CCMR1 : TIM_CCMR2,
@@ -359,7 +363,7 @@ static int stm32_pwm_config(struct stm32_pwm *priv, int ch,
 
        regmap_write(priv->regmap, TIM_PSC, prescaler);
        regmap_write(priv->regmap, TIM_ARR, prd - 1);
-       regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE, TIM_CR1_ARPE);
+       regmap_set_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE);
 
        /* Calculate the duty cycles */
        dty = prd * duty_ns;
@@ -377,7 +381,7 @@ static int stm32_pwm_config(struct stm32_pwm *priv, int ch,
        else
                regmap_update_bits(priv->regmap, TIM_CCMR2, mask, ccmr);
 
-       regmap_update_bits(priv->regmap, TIM_BDTR, TIM_BDTR_MOE, TIM_BDTR_MOE);
+       regmap_set_bits(priv->regmap, TIM_BDTR, TIM_BDTR_MOE);
 
        return 0;
 }
@@ -411,13 +415,13 @@ static int stm32_pwm_enable(struct stm32_pwm *priv, int ch)
        if (priv->have_complementary_output)
                mask |= TIM_CCER_CC1NE << (ch * 4);
 
-       regmap_update_bits(priv->regmap, TIM_CCER, mask, mask);
+       regmap_set_bits(priv->regmap, TIM_CCER, mask);
 
        /* Make sure that registers are updated */
-       regmap_update_bits(priv->regmap, TIM_EGR, TIM_EGR_UG, TIM_EGR_UG);
+       regmap_set_bits(priv->regmap, TIM_EGR, TIM_EGR_UG);
 
        /* Enable controller */
-       regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN, TIM_CR1_CEN);
+       regmap_set_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN);
 
        return 0;
 }
@@ -431,11 +435,11 @@ static void stm32_pwm_disable(struct stm32_pwm *priv, int ch)
        if (priv->have_complementary_output)
                mask |= TIM_CCER_CC1NE << (ch * 4);
 
-       regmap_update_bits(priv->regmap, TIM_CCER, mask, 0);
+       regmap_clear_bits(priv->regmap, TIM_CCER, mask);
 
        /* When all channels are disabled, we can disable the controller */
        if (!active_channels(priv))
-               regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN, 0);
+               regmap_clear_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN);
 
        clk_disable(priv->clk);
 }
@@ -568,10 +572,9 @@ static void stm32_pwm_detect_complementary(struct stm32_pwm *priv)
         * If complementary bit doesn't exist writing 1 will have no
         * effect so we can detect it.
         */
-       regmap_update_bits(priv->regmap,
-                          TIM_CCER, TIM_CCER_CC1NE, TIM_CCER_CC1NE);
+       regmap_set_bits(priv->regmap, TIM_CCER, TIM_CCER_CC1NE);
        regmap_read(priv->regmap, TIM_CCER, &ccer);
-       regmap_update_bits(priv->regmap, TIM_CCER, TIM_CCER_CC1NE, 0);
+       regmap_clear_bits(priv->regmap, TIM_CCER, TIM_CCER_CC1NE);
 
        priv->have_complementary_output = (ccer != 0);
 }
@@ -585,10 +588,9 @@ static int stm32_pwm_detect_channels(struct stm32_pwm *priv)
         * If channels enable bits don't exist writing 1 will have no
         * effect so we can detect and count them.
         */
-       regmap_update_bits(priv->regmap,
-                          TIM_CCER, TIM_CCER_CCXE, TIM_CCER_CCXE);
+       regmap_set_bits(priv->regmap, TIM_CCER, TIM_CCER_CCXE);
        regmap_read(priv->regmap, TIM_CCER, &ccer);
-       regmap_update_bits(priv->regmap, TIM_CCER, TIM_CCER_CCXE, 0);
+       regmap_clear_bits(priv->regmap, TIM_CCER, TIM_CCER_CCXE);
 
        if (ccer & TIM_CCER_CC1E)
                npwm++;
@@ -644,7 +646,7 @@ static int stm32_pwm_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int stm32_pwm_remove(struct platform_device *pdev)
+static void stm32_pwm_remove(struct platform_device *pdev)
 {
        struct stm32_pwm *priv = platform_get_drvdata(pdev);
        unsigned int i;
@@ -653,8 +655,6 @@ static int stm32_pwm_remove(struct platform_device *pdev)
                pwm_disable(&priv->chip.pwms[i]);
 
        pwmchip_remove(&priv->chip);
-
-       return 0;
 }
 
 static int __maybe_unused stm32_pwm_suspend(struct device *dev)
@@ -701,7 +701,7 @@ MODULE_DEVICE_TABLE(of, stm32_pwm_of_match);
 
 static struct platform_driver stm32_pwm_driver = {
        .probe  = stm32_pwm_probe,
-       .remove = stm32_pwm_remove,
+       .remove_new = stm32_pwm_remove,
        .driver = {
                .name = "stm32-pwm",
                .of_match_table = stm32_pwm_of_match,
This page took 0.032666 seconds and 4 git commands to generate.