svn commit: r342091 - head/sys/arm/allwinner
Emmanuel Vadot
manu at FreeBSD.org
Fri Dec 14 18:39:21 UTC 2018
Author: manu
Date: Fri Dec 14 18:39:17 2018
New Revision: 342091
URL: https://svnweb.freebsd.org/changeset/base/342091
Log:
allwinner: aw_pwm: Read value at attach
The booloaded might have configured the pwm controller so read the values.
Modified:
head/sys/arm/allwinner/aw_pwm.c
Modified: head/sys/arm/allwinner/aw_pwm.c
==============================================================================
--- head/sys/arm/allwinner/aw_pwm.c Fri Dec 14 18:39:06 2018 (r342090)
+++ head/sys/arm/allwinner/aw_pwm.c Fri Dec 14 18:39:17 2018 (r342091)
@@ -136,7 +136,8 @@ static int
aw_pwm_attach(device_t dev)
{
struct aw_pwm_softc *sc;
- /* uint32_t reg; */
+ uint64_t clk_freq;
+ uint32_t reg;
int error;
sc = device_get_softc(dev);
@@ -160,6 +161,26 @@ aw_pwm_attach(device_t dev)
if ((sc->busdev = pwmbus_attach_bus(dev)) == NULL)
device_printf(dev, "Cannot attach pwm bus\n");
+ /* Read the configuration left by U-Boot */
+ reg = AW_PWM_READ(sc, AW_PWM_CTRL);
+ if (reg & (AW_PWM_CTRL_GATE | AW_PWM_CTRL_EN))
+ sc->enabled = true;
+
+ reg = AW_PWM_READ(sc, AW_PWM_CTRL);
+ reg &= AW_PWM_CTRL_PRESCALE_MASK;
+ if (reg > nitems(aw_pwm_clk_prescaler)) {
+ device_printf(dev, "Bad prescaler %x, cannot guess current settings\n", reg);
+ goto out;
+ }
+ clk_freq = sc->clk_freq / aw_pwm_clk_prescaler[reg];
+
+ reg = AW_PWM_READ(sc, AW_PWM_PERIOD);
+ sc->period = NS_PER_SEC /
+ (clk_freq / ((reg >> AW_PWM_PERIOD_TOTAL_SHIFT) & AW_PWM_PERIOD_TOTAL_MASK));
+ sc->duty = NS_PER_SEC /
+ (clk_freq / ((reg >> AW_PWM_PERIOD_ACTIVE_SHIFT) & AW_PWM_PERIOD_ACTIVE_MASK));
+
+out:
return (0);
fail:
More information about the svn-src-head
mailing list