]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
counter: microchip-tcb-capture: Fix undefined counter channel state on probe
authorWilliam Breathitt Gray <wbg@kernel.org>
Wed, 5 Mar 2025 10:01:19 +0000 (19:01 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 7 Apr 2025 08:05:45 +0000 (10:05 +0200)
commit c0c9c73434666dc99ee156b25e7e722150bee001 upstream.

Hardware initialize of the timer counter channel does not occur on probe
thus leaving the Count in an undefined state until the first
function_write() callback is executed. Fix this by performing the proper
hardware initialization during probe.

Fixes: 106b104137fd ("counter: Add microchip TCB capture counter")
Reported-by: Csókás Bence <csokas.bence@prolan.hu>
Closes: https://lore.kernel.org/all/bfa70e78-3cc3-4295-820b-3925c26135cb@prolan.hu/
Link: https://lore.kernel.org/r/20250305-preset-capture-mode-microchip-tcb-capture-v1-1-632c95c6421e@kernel.org
Signed-off-by: William Breathitt Gray <wbg@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/counter/microchip-tcb-capture.c

index c7af13aca36cfdfd623adb210b4ebd8cdff7a59e..2f631729a870bb22ea0bbb926217682ab957ed3a 100644 (file)
@@ -369,6 +369,25 @@ static int mchp_tc_probe(struct platform_device *pdev)
                        channel);
        }
 
+       /* Disable Quadrature Decoder and position measure */
+       ret = regmap_update_bits(regmap, ATMEL_TC_BMR, ATMEL_TC_QDEN | ATMEL_TC_POSEN, 0);
+       if (ret)
+               return ret;
+
+       /* Setup the period capture mode */
+       ret = regmap_update_bits(regmap, ATMEL_TC_REG(priv->channel[0], CMR),
+                                ATMEL_TC_WAVE | ATMEL_TC_ABETRG | ATMEL_TC_CMR_MASK |
+                                ATMEL_TC_TCCLKS,
+                                ATMEL_TC_CMR_MASK);
+       if (ret)
+               return ret;
+
+       /* Enable clock and trigger counter */
+       ret = regmap_write(regmap, ATMEL_TC_REG(priv->channel[0], CCR),
+                          ATMEL_TC_CLKEN | ATMEL_TC_SWTRG);
+       if (ret)
+               return ret;
+
        priv->tc_cfg = tcb_config;
        priv->regmap = regmap;
        counter->name = dev_name(&pdev->dev);