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-all mailing list