Module Name:    src
Committed By:   tsutsui
Date:           Wed Jan 25 15:58:11 UTC 2012

Modified Files:
        src/sys/arch/zaurus/dev: zaudio.c zrc.c ztp.c

Log Message:
Defer device initializations which implicitly depend on scoop or ioexp
via config_finalize_register(9).


To generate a diff of this commit:
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/zaurus/dev/zaudio.c
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/zaurus/dev/zrc.c
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/zaurus/dev/ztp.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/zaurus/dev/zaudio.c
diff -u src/sys/arch/zaurus/dev/zaudio.c:1.17 src/sys/arch/zaurus/dev/zaudio.c:1.18
--- src/sys/arch/zaurus/dev/zaudio.c:1.17	Sat Jan 21 18:56:51 2012
+++ src/sys/arch/zaurus/dev/zaudio.c	Wed Jan 25 15:58:10 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: zaudio.c,v 1.17 2012/01/21 18:56:51 nonaka Exp $	*/
+/*	$NetBSD: zaudio.c,v 1.18 2012/01/25 15:58:10 tsutsui Exp $	*/
 /*	$OpenBSD: zaurus_audio.c,v 1.8 2005/08/18 13:23:02 robert Exp $	*/
 
 /*
@@ -50,7 +50,7 @@
 #include "opt_zaudio.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: zaudio.c,v 1.17 2012/01/21 18:56:51 nonaka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: zaudio.c,v 1.18 2012/01/25 15:58:10 tsutsui Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -132,6 +132,7 @@ static void	zaudio_attach(device_t, devi
 CFATTACH_DECL_NEW(zaudio, sizeof(struct zaudio_softc), 
     zaudio_match, zaudio_attach, NULL, NULL);
 
+static int	zaudio_finalize(device_t);
 static bool	zaudio_suspend(device_t, const pmf_qual_t *);
 static bool	zaudio_resume(device_t, const pmf_qual_t *);
 static void	zaudio_volume_up(device_t);
@@ -381,7 +382,8 @@ zaudio_attach(device_t parent, device_t 
 	(void) pxa2x0_gpio_intr_establish(GPIO_HP_IN_C3000, IST_EDGE_BOTH,
 	    IPL_BIO, zaudio_jack_intr, sc);
 
-	zaudio_init(sc);
+	/* zaudio_init() implicitly depends on ioexp or scoop */
+	config_finalize_register(self, zaudio_finalize);
 
 	audio_attach_mi(&wm8750_hw_if, sc, self);
 
@@ -405,6 +407,15 @@ fail_i2s:
 	pmf_device_deregister(self);
 }
 
+static int
+zaudio_finalize(device_t dv)
+{
+	struct zaudio_softc *sc = device_private(dv);
+
+	zaudio_init(sc);
+	return 0;
+}
+
 static bool
 zaudio_suspend(device_t dv, const pmf_qual_t *qual)
 {

Index: src/sys/arch/zaurus/dev/zrc.c
diff -u src/sys/arch/zaurus/dev/zrc.c:1.7 src/sys/arch/zaurus/dev/zrc.c:1.8
--- src/sys/arch/zaurus/dev/zrc.c:1.7	Sun Jun 19 16:20:09 2011
+++ src/sys/arch/zaurus/dev/zrc.c	Wed Jan 25 15:58:10 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: zrc.c,v 1.7 2011/06/19 16:20:09 nonaka Exp $	*/
+/*	$NetBSD: zrc.c,v 1.8 2012/01/25 15:58:10 tsutsui Exp $	*/
 /*	$OpenBSD: zaurus_remote.c,v 1.1 2005/11/17 05:26:31 uwe Exp $	*/
 
 /*
@@ -18,7 +18,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: zrc.c,v 1.7 2011/06/19 16:20:09 nonaka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: zrc.c,v 1.8 2012/01/25 15:58:10 tsutsui Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -101,6 +101,7 @@ static void	zrc_attach(struct device *, 
 CFATTACH_DECL_NEW(zrc, sizeof(struct zrc_softc), 
     zrc_match, zrc_attach, NULL, NULL);
 
+static int	zrc_finalize(device_t);
 static int	zrc_intr(void *);
 static void	zrc_timeout(void *);
 static int	zrc_scan(void);
@@ -190,11 +191,8 @@ zrc_attach(device_t parent, device_t sel
 		return;
 	}
 
-	/* Enable the pullup while waiting for an interrupt. */
-	if (ZAURUS_ISC1000)
-		ioexp_akin_pullup(1);
-	else
-		scoop_akin_pullup(1);
+	/* defer enabling pullup until ioexp or scoop is attached */
+	config_finalize_register(self, zrc_finalize);
 
 	sc->sc_keydown = KEY_RELEASE;
 
@@ -207,6 +205,19 @@ zrc_attach(device_t parent, device_t sel
 }
 
 static int
+zrc_finalize(device_t dv)
+{
+
+	/* Enable the pullup while waiting for an interrupt. */
+	if (ZAURUS_ISC1000)
+		ioexp_akin_pullup(1);
+	else
+		scoop_akin_pullup(1);
+
+	return 0;
+}
+
+static int
 zrc_intr(void *v)
 {
 	struct zrc_softc *sc = v;

Index: src/sys/arch/zaurus/dev/ztp.c
diff -u src/sys/arch/zaurus/dev/ztp.c:1.10 src/sys/arch/zaurus/dev/ztp.c:1.11
--- src/sys/arch/zaurus/dev/ztp.c:1.10	Wed Feb 24 22:37:56 2010
+++ src/sys/arch/zaurus/dev/ztp.c	Wed Jan 25 15:58:10 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: ztp.c,v 1.10 2010/02/24 22:37:56 dyoung Exp $	*/
+/*	$NetBSD: ztp.c,v 1.11 2012/01/25 15:58:10 tsutsui Exp $	*/
 /* $OpenBSD: zts.c,v 1.9 2005/04/24 18:55:49 uwe Exp $ */
 
 /*
@@ -18,7 +18,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ztp.c,v 1.10 2010/02/24 22:37:56 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ztp.c,v 1.11 2012/01/25 15:58:10 tsutsui Exp $");
 
 #include "lcd.h"
 
@@ -114,6 +114,7 @@ static void	ztp_attach(device_t, device_
 CFATTACH_DECL_NEW(ztp, sizeof(struct ztp_softc),
 	ztp_match, ztp_attach, NULL, NULL);
 
+static int	ztp_finalize(device_t);
 static int	ztp_enable(void *);
 static void	ztp_disable(void *);
 static bool	ztp_suspend(device_t dv, const pmf_qual_t *);
@@ -149,19 +150,8 @@ ztp_attach(device_t parent, device_t sel
 	callout_init(&sc->sc_tp_poll, 0);
 	callout_setfunc(&sc->sc_tp_poll, ztp_poll, sc);
 
-	/* Initialize ADS7846 Difference Reference mode */
-	(void)zssp_ic_send(ZSSP_IC_ADS7846,
-	    (1<<ADSCTRL_ADR_SH) | (1<<ADSCTRL_STS_SH));
-	delay(5000);
-	(void)zssp_ic_send(ZSSP_IC_ADS7846,
-	    (3<<ADSCTRL_ADR_SH) | (1<<ADSCTRL_STS_SH));
-	delay(5000);
-	(void)zssp_ic_send(ZSSP_IC_ADS7846,
-	    (4<<ADSCTRL_ADR_SH) | (1<<ADSCTRL_STS_SH));
-	delay(5000);
-	(void)zssp_ic_send(ZSSP_IC_ADS7846,
-	    (5<<ADSCTRL_ADR_SH) | (1<<ADSCTRL_STS_SH));
-	delay(5000);
+	/* defer initialization until all other devices are attached */
+	config_finalize_register(self, ztp_finalize);
 
 	a.accessops = &ztp_accessops;
 	a.accesscookie = sc;
@@ -183,6 +173,27 @@ ztp_attach(device_t parent, device_t sel
 }
 
 static int
+ztp_finalize(device_t dv)
+{
+
+	/* Initialize ADS7846 Difference Reference mode */
+	(void)zssp_ic_send(ZSSP_IC_ADS7846,
+	    (1<<ADSCTRL_ADR_SH) | (1<<ADSCTRL_STS_SH));
+	delay(5000);
+	(void)zssp_ic_send(ZSSP_IC_ADS7846,
+	    (3<<ADSCTRL_ADR_SH) | (1<<ADSCTRL_STS_SH));
+	delay(5000);
+	(void)zssp_ic_send(ZSSP_IC_ADS7846,
+	    (4<<ADSCTRL_ADR_SH) | (1<<ADSCTRL_STS_SH));
+	delay(5000);
+	(void)zssp_ic_send(ZSSP_IC_ADS7846,
+	    (5<<ADSCTRL_ADR_SH) | (1<<ADSCTRL_STS_SH));
+	delay(5000);
+
+	return 0;
+}
+
+static int
 ztp_enable(void *v)
 {
 	struct ztp_softc *sc = (struct ztp_softc *)v;

Reply via email to