svn commit: r274412 - head/sys/arm/freescale/imx

Ian Lepore ian at FreeBSD.org
Wed Nov 12 02:37:28 UTC 2014


Author: ian
Date: Wed Nov 12 02:37:27 2014
New Revision: 274412
URL: https://svnweb.freebsd.org/changeset/base/274412

Log:
  Bugfixes for the imx5/imx6 iomux fdt_pinctrl driver.
  
  I originally overlooked a couple flag bits defined in the fdt binding docs.
  One flag suppresses the pad configuration (pullup/pulldown/etc).  The other
  one requires that the SION (set input on) flag be set in the mux register.
  
  Also, it appears from the data involved that if the input register
  address in the config tuple is zero, there is no input configuration.  The
  old code was writing to register zero, which contains a collection of misc
  control bits (having nothing to do with input configuration) that probably
  shouldn't get overwritten arbitrarily.  The bindings doc doesn't explictly
  mention this.

Modified:
  head/sys/arm/freescale/imx/imx_iomux.c

Modified: head/sys/arm/freescale/imx/imx_iomux.c
==============================================================================
--- head/sys/arm/freescale/imx/imx_iomux.c	Wed Nov 12 01:28:28 2014	(r274411)
+++ head/sys/arm/freescale/imx/imx_iomux.c	Wed Nov 12 02:37:27 2014	(r274412)
@@ -99,6 +99,10 @@ struct pincfg {
 	uint32_t padconf_val;
 };
 
+#define	PADCONF_NONE	(1U << 31)	/* Do not configure pad. */
+#define	PADCONF_SION	(1U << 30)	/* Force SION bit in mux register. */
+#define	PADMUX_SION	(1U <<  4)	/* The SION bit in the mux register. */
+
 static inline uint32_t
 RD4(struct iomux_softc *sc, bus_size_t off)
 {
@@ -120,6 +124,7 @@ iomux_configure_pins(device_t dev, phand
 	struct pincfg *cfgtuples, *cfg;
 	phandle_t cfgnode;
 	int i, ntuples;
+	uint32_t sion;
 
 	sc = device_get_softc(dev);
 	cfgnode = OF_node_from_xref(cfgxref);
@@ -130,9 +135,22 @@ iomux_configure_pins(device_t dev, phand
 	if (ntuples == 0)
 		return (0); /* Empty property is not an error. */
 	for (i = 0, cfg = cfgtuples; i < ntuples; i++, cfg++) {
-		WR4(sc, cfg->mux_reg, cfg->mux_val);
-		WR4(sc, cfg->input_reg, cfg->input_val);
-		WR4(sc, cfg->padconf_reg, cfg->padconf_val);
+		sion = (cfg->padconf_val & PADCONF_SION) ? PADMUX_SION : 0;
+		WR4(sc, cfg->mux_reg, cfg->mux_val | sion);
+		if (cfg->input_reg != 0)
+			WR4(sc, cfg->input_reg, cfg->input_val);
+		if ((cfg->padconf_val & PADCONF_NONE) != 0)
+			WR4(sc, cfg->padconf_reg, cfg->padconf_val);
+		if (bootverbose) {
+			char name[32]; 
+			OF_getprop(cfgnode, "name", &name, sizeof(name));
+			printf("%16s: muxreg 0x%04x muxval 0x%02x "
+			    "inpreg 0x%04x inpval 0x%02x "
+			    "padreg 0x%04x padval 0x%08x\n",
+			    name, cfg->mux_reg, cfg->mux_val | sion,
+			    cfg->input_reg, cfg->input_val,
+			    cfg->padconf_reg, cfg->padconf_val);
+		}
 	}
 	free(cfgtuples, M_OFWPROP);
 	return (0);


More information about the svn-src-all mailing list