Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 13 Sep 2014 19:59:16 +0000 (UTC)
From:      Ian Lepore <ian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r271548 - head/sys/arm/at91
Message-ID:  <201409131959.s8DJxGND013873@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ian
Date: Sat Sep 13 19:59:16 2014
New Revision: 271548
URL: http://svnweb.freebsd.org/changeset/base/271548

Log:
  Convert the at91_pinctrl driver to use the new fdt_pinctrl interface.

Modified:
  head/sys/arm/at91/at91_pinctrl.c
  head/sys/arm/at91/files.at91

Modified: head/sys/arm/at91/at91_pinctrl.c
==============================================================================
--- head/sys/arm/at91/at91_pinctrl.c	Sat Sep 13 19:37:11 2014	(r271547)
+++ head/sys/arm/at91/at91_pinctrl.c	Sat Sep 13 19:59:16 2014	(r271548)
@@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$");
 #include <arm/at91/at91_piovar.h>
 
 #include <dev/fdt/fdt_common.h>
+#include <dev/fdt/fdt_pinctrl.h>
 #include <dev/ofw/openfirm.h>
 #include <dev/ofw/ofw_bus.h>
 #include <dev/ofw/ofw_bus_subr.h>
@@ -250,6 +251,8 @@ at91_pinctrl_attach(device_t dev)
 		device_set_ivars(cdev, di);
 	}
 
+	fdt_pinctrl_register(dev, "atmel,pins");
+
 	return (bus_generic_attach(dev));
 }
 
@@ -370,93 +373,70 @@ pinctrl_print_child(device_t bus, device
 
 const char *periphs[] = {"gpio", "periph A", "periph B", "periph C", "periph D", "periph E" };
 
-static void
-pinctrl_walk_tree(device_t bus, phandle_t node)
+struct pincfg {
+	uint32_t unit;
+	uint32_t pin;
+	uint32_t periph;
+	uint32_t flags;
+};
+
+static int
+pinctrl_configure_pins(device_t bus, phandle_t cfgxref)
 {
 	struct pinctrl_softc *sc;
-	char status[10];
+	struct pincfg *cfg, *cfgdata;
 	char name[32];
-	phandle_t pinctrl[32], pins[32 * 4], scratch;
-	ssize_t len, npins;
-	int i, j;
+	phandle_t node;
+	ssize_t npins;
+	int i;
 
 	sc = device_get_softc(bus);
-	for (node = OF_child(node); node > 0; node = OF_peer(node)) {
-		pinctrl_walk_tree(bus, node);
-		memset(status, 0, sizeof(status));
-		memset(name, 0, sizeof(name));
-		OF_getprop(node, "status", status, sizeof(status));
-		OF_getprop(node, "name", name, sizeof(name));
-		if (strcmp(status, "okay") != 0) {
-//			printf("pinctrl: skipping node %s status %s\n", name,
-//			    status);
-			continue;
-		}
-		len = OF_getencprop(node, "pinctrl-0", pinctrl, sizeof(pinctrl));
-		if (len <= 0) {
-//			printf("pinctrl: skipping node %s no pinctrl-0\n",
-//			    name, status);
-			continue;
-		}
-		len /= sizeof(phandle_t);
-		printf("pinctrl: Found active node %s\n", name);
-		for (i = 0; i < len; i++) {
-			scratch = OF_node_from_xref(pinctrl[i]);
-			npins = OF_getencprop(scratch, "atmel,pins", pins,
-			    sizeof(pins));
-			if (npins <= 0) {
-				printf("We're doing it wrong %s\n", name);
-				continue;
-			}
-			memset(name, 0, sizeof(name));
-			OF_getprop(scratch, "name", name, sizeof(name));
-			npins /= (4 * 4);
-			printf("----> need to cope with %d more pins for %s\n",
-			    npins, name);
-			for (j = 0; j < npins; j++) {
-				uint32_t unit = pins[j * 4];
-				uint32_t pin = pins[j * 4 + 1];
-				uint32_t periph = pins[j * 4 + 2];
-				uint32_t flags = pins[j * 4 + 3];
-				uint32_t pio;
-
-				pio = (0xfffffff & sc->ranges[0].bus) +
-				    0x200 * unit;
-				printf("P%c%d %s %#x\n", unit + 'A', pin,
-				    periphs[periph], flags);
-				switch (periph) {
-				case 0:
-					at91_pio_use_gpio(pio, 1u << pin);
-					at91_pio_gpio_pullup(pio, 1u << pin,
-					    !!(flags & 1));
-					at91_pio_gpio_high_z(pio, 1u << pin,
-					    !!(flags & 2));
-					at91_pio_gpio_set_deglitch(pio,
-					    1u << pin, !!(flags & 4));
-//					at91_pio_gpio_pulldown(pio, 1u << pin,
-//					    !!(flags & 8));
-//					at91_pio_gpio_dis_schmidt(pio,
-//					    1u << pin, !!(flags & 16));
-					break;
-				case 1:
-					at91_pio_use_periph_a(pio, 1u << pin,
-					    flags);
-					break;
-				case 2:
-					at91_pio_use_periph_b(pio, 1u << pin,
-					    flags);
-					break;
-				}
-			}
+	node = OF_node_from_xref(cfgxref);
+	memset(name, 0, sizeof(name));
+	OF_getprop(node, "name", name, sizeof(name));
+	npins = OF_getencprop_alloc(node, "atmel,pins", sizeof(*cfgdata),
+	    (void **)&cfgdata);
+	if (npins < 0) {
+		printf("We're doing it wrong %s\n", name);
+		return (ENXIO);
+	}
+	if (npins == 0)
+		return (0);
+	for (i = 0, cfg = cfgdata; i < npins; i++, cfg++) {
+		uint32_t pio;
+		pio = (0xfffffff & sc->ranges[0].bus) + 0x200 * cfg->unit;
+		printf("P%c%d %s %#x\n", cfg->unit + 'A', cfg->pin,
+		    periphs[cfg->periph], cfg->flags);
+		switch (cfg->periph) {
+		case 0:
+			at91_pio_use_gpio(pio, 1u << cfg->pin);
+			at91_pio_gpio_pullup(pio, 1u << cfg->pin,
+			    !!(cfg->flags & 1));
+			at91_pio_gpio_high_z(pio, 1u << cfg->pin,
+			    !!(cfg->flags & 2));
+			at91_pio_gpio_set_deglitch(pio,
+			    1u << cfg->pin, !!(cfg->flags & 4));
+//			at91_pio_gpio_pulldown(pio, 1u << cfg->pin,
+//			    !!(cfg->flags & 8));
+//			at91_pio_gpio_dis_schmidt(pio,
+//			    1u << cfg->pin, !!(cfg->flags & 16));
+			break;
+		case 1:
+			at91_pio_use_periph_a(pio, 1u << cfg->pin, cfg->flags);
+			break;
+		case 2:
+			at91_pio_use_periph_b(pio, 1u << cfg->pin, cfg->flags);
+			break;
 		}
 	}
+	free(cfgdata, M_OFWPROP);
+	return (0);
 }
 
 static void
 pinctrl_new_pass(device_t bus)
 {
 	struct pinctrl_softc *sc;
-	phandle_t node;
 
 	sc = device_get_softc(bus);
 
@@ -466,10 +446,7 @@ pinctrl_new_pass(device_t bus)
 		return;
 	sc->done_pinmux++;
 
-	node = OF_peer(0);
-	if (node == -1)
-		return;
-	pinctrl_walk_tree(bus, node);
+	fdt_pinctrl_configure_tree(bus);
 }
 
 static device_method_t at91_pinctrl_methods[] = {
@@ -496,6 +473,8 @@ static device_method_t at91_pinctrl_meth
 	DEVMETHOD(ofw_bus_get_node,	ofw_bus_gen_get_node),
 	DEVMETHOD(ofw_bus_get_type,	ofw_bus_gen_get_type),
 
+        /* fdt_pintrl interface */
+	DEVMETHOD(fdt_pinctrl_configure,pinctrl_configure_pins),
 	DEVMETHOD_END
 };
 

Modified: head/sys/arm/at91/files.at91
==============================================================================
--- head/sys/arm/at91/files.at91	Sat Sep 13 19:37:11 2014	(r271547)
+++ head/sys/arm/at91/files.at91	Sat Sep 13 19:59:16 2014	(r271548)
@@ -10,7 +10,7 @@ arm/at91/at91_smc.c		standard
 arm/at91/at91_cfata.c		optional	at91_cfata
 arm/at91/at91_common.c		optional	fdt
 arm/at91/at91_mci.c		optional	at91_mci
-arm/at91/at91_pinctrl.c		optional	fdt
+arm/at91/at91_pinctrl.c		optional	fdt fdt_pinctrl
 arm/at91/at91_pit.c		optional	at91sam9
 arm/at91/at91_reset.S		optional	at91sam9
 arm/at91/at91_rst.c		optional	at91sam9



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201409131959.s8DJxGND013873>