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;