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);
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to