Following on from kettenis' pinctrl changes in imx here is a diff to
pull the pad configuration data from fdt for am335x.

Initially I had this as a different driver that attached to the pinmux
child of the scm node in the fdt but that prevented the manual table
driven gpio pad configuration.  So this adds the pinmux offset (0x800)
to the SCM base addr when using the register values from fdt.

Index: omap/if_cpsw.c
===================================================================
RCS file: /cvs/src/sys/arch/armv7/omap/if_cpsw.c,v
retrieving revision 1.36
diff -u -p -r1.36 if_cpsw.c
--- omap/if_cpsw.c      9 Jul 2016 04:25:44 -0000       1.36
+++ omap/if_cpsw.c      16 Jul 2016 04:55:41 -0000
@@ -84,6 +84,7 @@
 
 #include <arch/armv7/armv7/armv7var.h>
 #include <arch/armv7/omap/if_cpswreg.h>
+#include <arch/armv7/omap/sitara_cm.h>
 
 #include <dev/ofw/openfirm.h>
 
@@ -334,9 +335,11 @@ cpsw_attach(struct device *parent, struc
        struct ifnet * const ifp = &ac->ac_if;
        u_int32_t idver;
        int error;
+       int node;
        u_int i;
        uint32_t intr[4];
        uint32_t memsize;
+       char name[32];
 
        if (faa->fa_nreg < 2 || (faa->fa_nintr != 4 && faa->fa_nintr != 12))
                return;
@@ -354,6 +357,19 @@ cpsw_attach(struct device *parent, struc
         * we map a size that is a superset of both
         */
        memsize = 0x4000;
+
+       sitara_cm_pinctrlbyname(faa->fa_node, "default");
+
+       for (node = OF_child(faa->fa_node); node; node = OF_peer(node)) {
+               memset(name, 0, sizeof(name));
+
+               if (OF_getprop(node, "compatible", name, sizeof(name)) == -1)
+                       continue;
+
+               if (strcmp(name, "ti,davinci_mdio") != 0)
+                       continue;
+               sitara_cm_pinctrlbyname(node, "default");
+       }
 
        timeout_set(&sc->sc_tick, cpsw_tick, sc);
 
Index: omap/omap_com.c
===================================================================
RCS file: /cvs/src/sys/arch/armv7/omap/omap_com.c,v
retrieving revision 1.5
diff -u -p -r1.5 omap_com.c
--- omap/omap_com.c     19 Jun 2016 14:38:13 -0000      1.5
+++ omap/omap_com.c     16 Jul 2016 04:55:42 -0000
@@ -51,6 +51,7 @@
 
 #include <armv7/armv7/armv7var.h>
 #include <armv7/armv7/armv7_machdep.h>
+#include <armv7/omap/sitara_cm.h>
 
 #include <dev/ofw/fdt.h>
 #include <dev/ofw/openfirm.h>
@@ -121,6 +122,8 @@ omapuart_attach(struct device *parent, s
                printf("%s: bus_space_map failed\n", __func__);
                return;
        }
+
+       sitara_cm_pinctrlbyname(faa->fa_node, "default");
 
        com_attach_subr(sc);
 
Index: omap/ommmc.c
===================================================================
RCS file: /cvs/src/sys/arch/armv7/omap/ommmc.c,v
retrieving revision 1.25
diff -u -p -r1.25 ommmc.c
--- omap/ommmc.c        15 Jul 2016 22:28:25 -0000      1.25
+++ omap/ommmc.c        16 Jul 2016 04:55:42 -0000
@@ -34,6 +34,7 @@
 
 #include <armv7/armv7/armv7var.h>
 #include <armv7/omap/prcmvar.h>
+#include <armv7/omap/sitara_cm.h>
 
 #include <dev/ofw/openfirm.h>
 
@@ -333,6 +334,8 @@ ommmc_attach(struct device *parent, stru
                panic("%s: bus_space_map failed!", __func__);
 
        printf("\n");
+
+       sitara_cm_pinctrlbyname(faa->fa_node, "default");
 
        /* Enable ICLKEN, FCLKEN? */
        prcm_enablemodule(PRCM_MMC0 + unit);
Index: omap/sitara_cm.c
===================================================================
RCS file: /cvs/src/sys/arch/armv7/omap/sitara_cm.c,v
retrieving revision 1.2
diff -u -p -r1.2 sitara_cm.c
--- omap/sitara_cm.c    6 Nov 2013 19:03:07 -0000       1.2
+++ omap/sitara_cm.c    16 Jul 2016 04:55:42 -0000
@@ -52,6 +52,7 @@
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/kernel.h>
+#include <sys/malloc.h>
 #include <sys/device.h>
 #include <sys/conf.h>
 #include <sys/proc.h>
@@ -61,7 +62,10 @@
 #include <armv7/omap/sitara_cm.h>
 #include <armv7/omap/sitara_cmreg.h>
 
+#include <dev/ofw/openfirm.h>
+
 void sitara_cm_attach(struct device *parent, struct device *self, void *aux);
+int sitara_cm_pinctrl(uint32_t);
 
 struct sitara_cm_softc {
         struct device          sc_dev;
@@ -391,4 +395,95 @@ sitara_cm_attach(struct device *parent, 
                panic("sitara_cm_attach: read revision");
        printf(": control module, rev %d.%d\n",
            SCM_REVISION_MAJOR(rev), SCM_REVISION_MINOR(rev));
+}
+
+int
+sitara_cm_pinctrlbyid(int node, int id)
+{
+       char pinctrl[32];
+       uint32_t *phandles;
+       int len, i;
+
+       if (!sitara_cm_sc)
+               return -1;
+
+       snprintf(pinctrl, sizeof(pinctrl), "pinctrl-%d", id);
+       len = OF_getproplen(node, pinctrl);
+       if (len <= 0)
+               return -1;
+
+       phandles = malloc(len, M_TEMP, M_WAITOK);
+       OF_getpropintarray(node, pinctrl, phandles, len);
+       for (i = 0; i < len / sizeof(uint32_t); i++)
+               sitara_cm_pinctrl(phandles[i]);
+       free(phandles, M_TEMP, len);
+       return 0;
+}
+
+int
+sitara_cm_pinctrlbyname(int node, const char *config)
+{
+       char *names;
+       char *name;
+       char *end;
+       int id = 0;
+       int len;
+
+       if (!sitara_cm_sc)
+               return -1;
+
+       len = OF_getproplen(node, "pinctrl-names");
+       if (len <= 0)
+               printf("no pinctrl-names\n");
+
+       names = malloc(len, M_TEMP, M_WAITOK);
+       OF_getprop(node, "pinctrl-names", names, len);
+       end = names + len;
+       name = names;
+       while (name < end) {
+               if (strcmp(name, config) == 0) {
+                       free(names, M_TEMP, len);
+                       return sitara_cm_pinctrlbyid(node, id);
+               }
+               name += strlen(name) + 1;
+               id++;
+       }
+       free(names, M_TEMP, len);
+       return -1;
+}
+
+int
+sitara_cm_pinctrl(uint32_t phandle)
+{
+       struct sitara_cm_softc *sc = sitara_cm_sc;
+       uint32_t *pins;
+       int npins;
+       int node;
+       int len;
+       int i, j;
+
+       if (sc == NULL)
+               return -1;
+
+       node = OF_getnodebyphandle(phandle);
+       if (node == 0)
+               return -1;
+
+       len = OF_getproplen(node, "pinctrl-single,pins");
+       if (len <= 0)
+               return -1;
+
+       pins = malloc(len, M_TEMP, M_WAITOK);
+       OF_getpropintarray(node, "pinctrl-single,pins", pins, len);
+       npins = len / (2 * sizeof(uint32_t));
+
+       for (i = 0, j = 0; i < npins; i++, j += 2) {
+               uint32_t conf_reg = SCM_PINMUX + pins[2 * i + 0];
+               uint32_t conf_val = pins[2 * i + 1];
+
+               bus_space_write_4(sc->sc_iot, sc->sc_ioh, conf_reg, conf_val);
+       }
+
+       free(pins, M_TEMP, len);
+       return 0;
 }
Index: omap/sitara_cm.h
===================================================================
RCS file: /cvs/src/sys/arch/armv7/omap/sitara_cm.h,v
retrieving revision 1.1
diff -u -p -r1.1 sitara_cm.h
--- omap/sitara_cm.h    4 Sep 2013 14:38:32 -0000       1.1
+++ omap/sitara_cm.h    16 Jul 2016 04:55:42 -0000
@@ -74,5 +74,7 @@ int sitara_cm_padconf_set_gpioflags(uint
 void sitara_cm_padconf_get_gpioflags(uint32_t gpio, uint32_t *flags);
 int sitara_cm_reg_read_4(uint32_t reg, uint32_t *val);
 int sitara_cm_reg_write_4(uint32_t reg, uint32_t val);
+int sitara_cm_pinctrlbyid(int node, int id);
+int sitara_cm_pinctrlbyname(int node, const char *);
 
 #endif /* _OMAP_SCM_H_ */
Index: omap/sitara_cmreg.h
===================================================================
RCS file: /cvs/src/sys/arch/armv7/omap/sitara_cmreg.h,v
retrieving revision 1.1
diff -u -p -r1.1 sitara_cmreg.h
--- omap/sitara_cmreg.h 4 Sep 2013 14:38:32 -0000       1.1
+++ omap/sitara_cmreg.h 16 Jul 2016 04:55:42 -0000
@@ -40,6 +40,8 @@
 #define SCM_REVISION_CUSTOM(x) (((x) & 0x000000c0) >>  6)
 #define SCM_REVISION_MINOR(x)  (((x) & 0x0000001f) >>  0)
 
+#define SCM_PINMUX             0x800
+
 #define OMAP2SCM_MAC_ID0_LO    0x630
 #define OMAP2SCM_MAC_ID0_HI    0x634
 
Index: omap/ti_iic.c
===================================================================
RCS file: /cvs/src/sys/arch/armv7/omap/ti_iic.c,v
retrieving revision 1.5
diff -u -p -r1.5 ti_iic.c
--- omap/ti_iic.c       26 Jun 2016 07:25:05 -0000      1.5
+++ omap/ti_iic.c       16 Jul 2016 04:55:42 -0000
@@ -65,9 +65,8 @@
 
 #include <armv7/armv7/armv7var.h>
 #include <armv7/omap/prcmvar.h>
-#include <armv7/omap/sitara_cm.h>
-#include <armv7/omap/sitara_cmreg.h>
 #include <armv7/omap/ti_iicreg.h>
+#include <armv7/omap/sitara_cm.h>
 
 #include <dev/ofw/openfirm.h>
 
@@ -165,16 +164,8 @@ ti_iic_attach(struct device *parent, str
        struct fdt_attach_args *faa = aux;
        struct i2cbus_attach_args iba;
        uint16_t rev;
-       const char *mode;
-       u_int state;
        int irq, unit, len;
-       char buf[20];
        char hwmods[128];
-       char *pin;
-       /* BBB specific pin names */
-       char *pins[6] = {"I2C0_SDA", "I2C0_SCL",
-                       "SPIO_D1", "SPI0_CS0",
-                       "UART1_CTSn", "UART1_RTSn"};
 
        if (faa->fa_nreg != 2 || (faa->fa_nintr != 1 && faa->fa_nintr != 3))
                return;
@@ -203,34 +194,12 @@ ti_iic_attach(struct device *parent, str
            faa->fa_reg[1], 0, &sc->sc_ioh))
                panic("%s: bus_space_map failed!", DEVNAME(sc));
 
+       sitara_cm_pinctrlbyname(faa->fa_node, "default");
+
        sc->sc_ih = arm_intr_establish(irq, IPL_NET,
            ti_iic_intr, sc, DEVNAME(sc));
 
        prcm_enablemodule(PRCM_I2C0 + unit);
-
-       if (board_id == BOARD_ID_AM335X_BEAGLEBONE) {
-               pin = pins[unit * 2];
-               snprintf(buf, sizeof buf, "I2C%d_SDA", unit);
-               if (sitara_cm_padconf_set(pin, buf,
-                   (0x01 << 4) | (0x01 << 5) | (0x01 << 6)) != 0) {
-                       printf(": can't switch %s pad\n", buf);
-                       return;
-               }
-               if (sitara_cm_padconf_get(pin, &mode, &state) == 0) {
-                       printf(": %s state %d ", mode, state);
-               }
-
-               pin = pins[unit * 2 + 1];
-               snprintf(buf, sizeof buf, "I2C%d_SCL", unit);
-               if (sitara_cm_padconf_set(pin, buf,
-                   (0x01 << 4) | (0x01 << 5) | (0x01 << 6)) != 0) {
-                       printf(": can't switch %s pad\n", buf);
-                       return;
-               }
-               if (sitara_cm_padconf_get(pin, &mode, &state) == 0) {
-                       printf(": %s state %d ", mode, state);
-               }
-       }
 
        rev = I2C_READ_REG(sc, AM335X_I2C_REVNB_LO);
        printf(" rev %d.%d\n",

Reply via email to