Module Name:    src
Committed By:   jmcneill
Date:           Tue Oct  1 23:32:53 UTC 2019

Modified Files:
        src/sys/arch/arm/amlogic: meson_pinctrl.c
        src/sys/arch/arm/broadcom: bcm2835_gpio.c
        src/sys/arch/arm/nvidia: tegra_pinmux.c
        src/sys/arch/arm/rockchip: rk3328_iomux.c rk3399_iomux.c
        src/sys/arch/arm/samsung: exynos_pinctrl.c
        src/sys/arch/arm/sunxi: sunxi_gpio.c
        src/sys/dev/fdt: fdt_pinctrl.c fdtbus.c fdtvar.h
        src/sys/dev/i2c: axppmic.c

Log Message:
Add support for devices with separate "init" and "default" pinctrl states.


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/amlogic/meson_pinctrl.c
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/arm/broadcom/bcm2835_gpio.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/nvidia/tegra_pinmux.c
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/rockchip/rk3328_iomux.c
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/rockchip/rk3399_iomux.c
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/arm/samsung/exynos_pinctrl.c
cvs rdiff -u -r1.26 -r1.27 src/sys/arch/arm/sunxi/sunxi_gpio.c
cvs rdiff -u -r1.9 -r1.10 src/sys/dev/fdt/fdt_pinctrl.c
cvs rdiff -u -r1.29 -r1.30 src/sys/dev/fdt/fdtbus.c
cvs rdiff -u -r1.53 -r1.54 src/sys/dev/fdt/fdtvar.h
cvs rdiff -u -r1.25 -r1.26 src/sys/dev/i2c/axppmic.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/amlogic/meson_pinctrl.c
diff -u src/sys/arch/arm/amlogic/meson_pinctrl.c:1.5 src/sys/arch/arm/amlogic/meson_pinctrl.c:1.6
--- src/sys/arch/arm/amlogic/meson_pinctrl.c:1.5	Fri Apr 19 19:07:56 2019
+++ src/sys/arch/arm/amlogic/meson_pinctrl.c	Tue Oct  1 23:32:52 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: meson_pinctrl.c,v 1.5 2019/04/19 19:07:56 jmcneill Exp $ */
+/* $NetBSD: meson_pinctrl.c,v 1.6 2019/10/01 23:32:52 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2019 Jared D. McNeill <jmcne...@invisible.ca>
@@ -29,7 +29,7 @@
 #include "opt_soc.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: meson_pinctrl.c,v 1.5 2019/04/19 19:07:56 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: meson_pinctrl.c,v 1.6 2019/10/01 23:32:52 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -575,8 +575,6 @@ meson_pinctrl_attach(device_t parent, de
 	aprint_naive("\n");
 	aprint_normal(": %s\n", sc->sc_conf->name);
 
-	fdtbus_pinctrl_configure();
-
 	meson_pinctrl_initgpio(sc);
 }
 

Index: src/sys/arch/arm/broadcom/bcm2835_gpio.c
diff -u src/sys/arch/arm/broadcom/bcm2835_gpio.c:1.13 src/sys/arch/arm/broadcom/bcm2835_gpio.c:1.14
--- src/sys/arch/arm/broadcom/bcm2835_gpio.c:1.13	Sat Sep 28 07:24:52 2019
+++ src/sys/arch/arm/broadcom/bcm2835_gpio.c	Tue Oct  1 23:32:52 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: bcm2835_gpio.c,v 1.13 2019/09/28 07:24:52 mlelstv Exp $	*/
+/*	$NetBSD: bcm2835_gpio.c,v 1.14 2019/10/01 23:32:52 jmcneill Exp $	*/
 
 /*-
  * Copyright (c) 2013, 2014, 2017 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bcm2835_gpio.c,v 1.13 2019/09/28 07:24:52 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bcm2835_gpio.c,v 1.14 2019/10/01 23:32:52 jmcneill Exp $");
 
 /*
  * Driver for BCM2835 GPIO
@@ -360,8 +360,6 @@ bcmgpio_attach(device_t parent, device_t
 		    &bcm283x_pinctrl_funcs);
 	}
 
-	fdtbus_pinctrl_configure();
-
 	fdtbus_register_interrupt_controller(self, phandle,
 	    &bcmgpio_fdt_intrfuncs);
 

Index: src/sys/arch/arm/nvidia/tegra_pinmux.c
diff -u src/sys/arch/arm/nvidia/tegra_pinmux.c:1.3 src/sys/arch/arm/nvidia/tegra_pinmux.c:1.4
--- src/sys/arch/arm/nvidia/tegra_pinmux.c:1.3	Sat Sep 28 07:42:47 2019
+++ src/sys/arch/arm/nvidia/tegra_pinmux.c	Tue Oct  1 23:32:52 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_pinmux.c,v 1.3 2019/09/28 07:42:47 skrll Exp $ */
+/* $NetBSD: tegra_pinmux.c,v 1.4 2019/10/01 23:32:52 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015-2017 Jared McNeill <jmcne...@invisible.ca>
@@ -29,7 +29,7 @@
 #include "opt_tegra.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tegra_pinmux.c,v 1.3 2019/09/28 07:42:47 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tegra_pinmux.c,v 1.4 2019/10/01 23:32:52 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -285,8 +285,6 @@ tegra_pinmux_attach(device_t parent, dev
 
 	for (child = OF_child(phandle); child; child = OF_peer(child))
 		fdtbus_register_pinctrl_config(self, child, &tegra_pinmux_funcs);
-
-	fdtbus_pinctrl_configure();
 }
 
 CFATTACH_DECL_NEW(tegra_pinmux, sizeof(struct tegra_pinmux_softc),

Index: src/sys/arch/arm/rockchip/rk3328_iomux.c
diff -u src/sys/arch/arm/rockchip/rk3328_iomux.c:1.2 src/sys/arch/arm/rockchip/rk3328_iomux.c:1.3
--- src/sys/arch/arm/rockchip/rk3328_iomux.c:1.2	Wed Jan 23 04:21:54 2019
+++ src/sys/arch/arm/rockchip/rk3328_iomux.c	Tue Oct  1 23:32:52 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: rk3328_iomux.c,v 1.2 2019/01/23 04:21:54 thorpej Exp $ */
+/* $NetBSD: rk3328_iomux.c,v 1.3 2019/10/01 23:32:52 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2018 Jared McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rk3328_iomux.c,v 1.2 2019/01/23 04:21:54 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rk3328_iomux.c,v 1.3 2019/10/01 23:32:52 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -308,8 +308,6 @@ rk3328_iomux_attach(device_t parent, dev
 		}
 	}
 
-	fdtbus_pinctrl_configure();
-
 	for (child = OF_child(phandle); child; child = OF_peer(child)) {
 		struct fdt_attach_args cfaa = *faa;
 		cfaa.faa_phandle = child;

Index: src/sys/arch/arm/rockchip/rk3399_iomux.c
diff -u src/sys/arch/arm/rockchip/rk3399_iomux.c:1.5 src/sys/arch/arm/rockchip/rk3399_iomux.c:1.6
--- src/sys/arch/arm/rockchip/rk3399_iomux.c:1.5	Tue Aug 20 23:32:33 2019
+++ src/sys/arch/arm/rockchip/rk3399_iomux.c	Tue Oct  1 23:32:52 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: rk3399_iomux.c,v 1.5 2019/08/20 23:32:33 tnn Exp $ */
+/* $NetBSD: rk3399_iomux.c,v 1.6 2019/10/01 23:32:52 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2018 Jared McNeill <jmcne...@invisible.ca>
@@ -29,7 +29,7 @@
 //#define RK3399_IOMUX_DEBUG
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rk3399_iomux.c,v 1.5 2019/08/20 23:32:33 tnn Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rk3399_iomux.c,v 1.6 2019/10/01 23:32:52 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -512,8 +512,6 @@ rk3399_iomux_attach(device_t parent, dev
 		}
 	}
 
-	fdtbus_pinctrl_configure();
-
 	for (child = OF_child(phandle); child; child = OF_peer(child)) {
 		struct fdt_attach_args cfaa = *faa;
 		cfaa.faa_phandle = child;

Index: src/sys/arch/arm/samsung/exynos_pinctrl.c
diff -u src/sys/arch/arm/samsung/exynos_pinctrl.c:1.13 src/sys/arch/arm/samsung/exynos_pinctrl.c:1.14
--- src/sys/arch/arm/samsung/exynos_pinctrl.c:1.13	Mon Jul  2 23:54:52 2018
+++ src/sys/arch/arm/samsung/exynos_pinctrl.c	Tue Oct  1 23:32:52 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: exynos_pinctrl.c,v 1.13 2018/07/02 23:54:52 jmcneill Exp $ */
+/*	$NetBSD: exynos_pinctrl.c,v 1.14 2019/10/01 23:32:52 jmcneill Exp $ */
 
 /*-
 * Copyright (c) 2015 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
 #include "gpio.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: exynos_pinctrl.c,v 1.13 2018/07/02 23:54:52 jmcneill Exp $");
+__KERNEL_RCSID(1, "$NetBSD: exynos_pinctrl.c,v 1.14 2019/10/01 23:32:52 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -124,8 +124,6 @@ exynos_pinctrl_attach(device_t parent, d
 						       &exynos_pinctrl_controller_func);
 		}
 	}
-
-	fdtbus_pinctrl_configure();
 }
 
 static void

Index: src/sys/arch/arm/sunxi/sunxi_gpio.c
diff -u src/sys/arch/arm/sunxi/sunxi_gpio.c:1.26 src/sys/arch/arm/sunxi/sunxi_gpio.c:1.27
--- src/sys/arch/arm/sunxi/sunxi_gpio.c:1.26	Tue Jun  4 19:49:43 2019
+++ src/sys/arch/arm/sunxi/sunxi_gpio.c	Tue Oct  1 23:32:52 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: sunxi_gpio.c,v 1.26 2019/06/04 19:49:43 tnn Exp $ */
+/* $NetBSD: sunxi_gpio.c,v 1.27 2019/10/01 23:32:52 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared McNeill <jmcne...@invisible.ca>
@@ -29,7 +29,7 @@
 #include "opt_soc.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sunxi_gpio.c,v 1.26 2019/06/04 19:49:43 tnn Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sunxi_gpio.c,v 1.27 2019/10/01 23:32:52 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -1019,8 +1019,6 @@ sunxi_gpio_attach(device_t parent, devic
 		fdtbus_register_pinctrl_config(self, child, &sunxi_pinctrl_funcs);
 	}
 
-	fdtbus_pinctrl_configure();
-
 	sunxi_gpio_attach_ports(sc);
 
 	/* Disable all external interrupts */

Index: src/sys/dev/fdt/fdt_pinctrl.c
diff -u src/sys/dev/fdt/fdt_pinctrl.c:1.9 src/sys/dev/fdt/fdt_pinctrl.c:1.10
--- src/sys/dev/fdt/fdt_pinctrl.c:1.9	Fri Sep 27 20:05:53 2019
+++ src/sys/dev/fdt/fdt_pinctrl.c	Tue Oct  1 23:32:52 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: fdt_pinctrl.c,v 1.9 2019/09/27 20:05:53 jmcneill Exp $ */
+/* $NetBSD: fdt_pinctrl.c,v 1.10 2019/10/01 23:32:52 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2019 Jason R. Thorpe
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fdt_pinctrl.c,v 1.9 2019/09/27 20:05:53 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fdt_pinctrl.c,v 1.10 2019/10/01 23:32:52 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -123,42 +123,17 @@ fdtbus_pinctrl_set_config(int phandle, c
 
 	err = fdtbus_get_index(phandle, "pinctrl-names", cfgname, &index);
 	if (err != 0)
-		return -1;
+		return ENOENT;
 
 	return fdtbus_pinctrl_set_config_index(phandle, index);
 }
 
-static void
-fdtbus_pinctrl_configure_node(int phandle)
+bool
+fdtbus_pinctrl_has_config(int phandle, const char *cfgname)
 {
-	char buf[256];
-	int child, error;
-
-	for (child = OF_child(phandle); child; child = OF_peer(child)) {
-		if (!fdtbus_status_okay(child))
-			continue;
-
-		/* Configure child nodes */
-		fdtbus_pinctrl_configure_node(child);
-
-		/*
-		 * Set default configuration for this node. This may fail if the
-		 * pinctrl provider is missing; that's OK, we will re-configure
-		 * when that provider attaches.
-		 */
-		fdtbus_get_path(child, buf, sizeof(buf));
-		error = fdtbus_pinctrl_set_config(child, "default");
-		if (error == 0)
-			aprint_debug("pinctrl: set default config for %s\n", buf);
-		else if (error != ENOENT)
-			aprint_debug("pinctrl: failed to set default config for %s: %d\n", buf, error);
-	}
-}
+	u_int index;
 
-void
-fdtbus_pinctrl_configure(void)
-{
-	fdtbus_pinctrl_configure_node(OF_finddevice("/"));
+	return fdtbus_get_index(phandle, "pinctrl-names", cfgname, &index) == 0;
 }
 
 /*

Index: src/sys/dev/fdt/fdtbus.c
diff -u src/sys/dev/fdt/fdtbus.c:1.29 src/sys/dev/fdt/fdtbus.c:1.30
--- src/sys/dev/fdt/fdtbus.c:1.29	Sat May 25 19:21:34 2019
+++ src/sys/dev/fdt/fdtbus.c	Tue Oct  1 23:32:52 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: fdtbus.c,v 1.29 2019/05/25 19:21:34 jmcneill Exp $ */
+/* $NetBSD: fdtbus.c,v 1.30 2019/10/01 23:32:52 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fdtbus.c,v 1.29 2019/05/25 19:21:34 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fdtbus.c,v 1.30 2019/10/01 23:32:52 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -56,6 +56,8 @@ struct fdt_node {
 
 	u_int		n_order;
 
+	bool		n_pinctrl_init;
+
 	TAILQ_ENTRY(fdt_node) n_nodes;
 };
 
@@ -79,6 +81,8 @@ static cfdata_t	fdt_scan_best(struct fdt
 static void	fdt_scan(struct fdt_softc *, int);
 static void	fdt_add_node(struct fdt_node *);
 static u_int	fdt_get_order(int);
+static void	fdt_pre_attach(struct fdt_node *);
+static void	fdt_post_attach(struct fdt_node *);
 
 static const char * const fdtbus_compatible[] =
     { "simple-bus", NULL };
@@ -313,14 +317,20 @@ fdt_scan(struct fdt_softc *sc, int pass)
 			/*
 			 * Attach the device.
 			 */
+			fdt_pre_attach(node);
 			node->n_dev = config_attach_loc(node->n_bus, cf_pass, locs,
 			    &faa, fdtbus_print);
+			if (node->n_dev != NULL)
+				fdt_post_attach(node);
 		} else {
 			/*
 			 * Default pass.
 			 */
+			fdt_pre_attach(node);
 			node->n_dev = config_found_sm_loc(node->n_bus, "fdt", locs,
 			    &faa, fdtbus_print, fdt_scan_submatch);
+			if (node->n_dev != NULL)
+				fdt_post_attach(node);
 		}
 
 		if (node->n_dev) {
@@ -332,6 +342,40 @@ fdt_scan(struct fdt_softc *sc, int pass)
 }
 
 static void
+fdt_pre_attach(struct fdt_node *node)
+{
+	const char *cfgname;
+	int error;
+
+	node->n_pinctrl_init = fdtbus_pinctrl_has_config(node->n_phandle, "init");
+
+	cfgname = node->n_pinctrl_init ? "init" : "default";
+
+	aprint_debug_dev(node->n_bus, "set %s config for %s\n", cfgname, node->n_name);
+
+	error = fdtbus_pinctrl_set_config(node->n_phandle, cfgname);
+	if (error != 0 && error != ENOENT)
+		aprint_debug_dev(node->n_bus,
+		    "failed to set %s config on %s: %d\n",
+		    cfgname, node->n_name, error);
+}
+
+static void
+fdt_post_attach(struct fdt_node *node)
+{
+	int error;
+
+	if (node->n_pinctrl_init) {
+		aprint_debug_dev(node->n_bus, "set default config for %s\n", node->n_name);
+		error = fdtbus_pinctrl_set_config(node->n_phandle, "default");
+		if (error != 0 && error != ENOENT)
+			aprint_debug_dev(node->n_bus,
+			    "failed to set default config on %s: %d\n",
+			    node->n_name, error);
+	}
+}
+
+static void
 fdt_add_node(struct fdt_node *new_node)
 {
 	struct fdt_node *node;

Index: src/sys/dev/fdt/fdtvar.h
diff -u src/sys/dev/fdt/fdtvar.h:1.53 src/sys/dev/fdt/fdtvar.h:1.54
--- src/sys/dev/fdt/fdtvar.h:1.53	Tue Aug 13 16:46:49 2019
+++ src/sys/dev/fdt/fdtvar.h	Tue Oct  1 23:32:52 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: fdtvar.h,v 1.53 2019/08/13 16:46:49 tnn Exp $ */
+/* $NetBSD: fdtvar.h,v 1.54 2019/10/01 23:32:52 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca>
@@ -315,9 +315,9 @@ audio_dai_tag_t	fdtbus_dai_acquire(int, 
 audio_dai_tag_t	fdtbus_dai_acquire_index(int, const char *, int);
 pwm_tag_t	fdtbus_pwm_acquire(int, const char *);
 pwm_tag_t	fdtbus_pwm_acquire_index(int, const char *, int);
-void		fdtbus_pinctrl_configure(void);
 int		fdtbus_pinctrl_set_config_index(int, u_int);
 int		fdtbus_pinctrl_set_config(int, const char *);
+bool		fdtbus_pinctrl_has_config(int, const char *);
 const char *	fdtbus_pinctrl_parse_function(int);
 const void *	fdtbus_pinctrl_parse_pins(int, int *);
 const char *	fdtbus_pinctrl_parse_groups(int, int *);

Index: src/sys/dev/i2c/axppmic.c
diff -u src/sys/dev/i2c/axppmic.c:1.25 src/sys/dev/i2c/axppmic.c:1.26
--- src/sys/dev/i2c/axppmic.c:1.25	Sat Jul 27 16:02:27 2019
+++ src/sys/dev/i2c/axppmic.c	Tue Oct  1 23:32:52 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: axppmic.c,v 1.25 2019/07/27 16:02:27 thorpej Exp $ */
+/* $NetBSD: axppmic.c,v 1.26 2019/10/01 23:32:52 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2014-2018 Jared McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: axppmic.c,v 1.25 2019/07/27 16:02:27 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: axppmic.c,v 1.26 2019/10/01 23:32:52 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -992,9 +992,6 @@ axppmic_attach(device_t parent, device_t
 		}
 	}
 
-	/* Notify pinctrl drivers that regulators are available. */
-	fdtbus_pinctrl_configure();
-
 	if (c->has_battery)
 		axppmic_attach_sensors(sc);
 }

Reply via email to