Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 26 Dec 2007 11:17:18 GMT
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 131685 for review
Message-ID:  <200712261117.lBQBHIJv087633@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=131685

Change 131685 by hselasky@hselasky_laptop001 on 2007/12/26 11:17:04

	
	Add proper shutdown method to the AT91 UDP.

Affected files ...

.. //depot/projects/usb/src/sys/arm/at91/at91_udp.c#3 edit
.. //depot/projects/usb/src/sys/dev/usb/at9100_dci.c#6 edit

Differences ...

==== //depot/projects/usb/src/sys/arm/at91/at91_udp.c#3 (text+ko) ====

@@ -60,6 +60,7 @@
 static device_probe_t at91_udp_probe;
 static device_attach_t at91_udp_attach;
 static device_detach_t at91_udp_detach;
+static device_shutdown_t at91_udp_shutdown;
 
 struct at91_udp_softc {
 	struct at9100_dci_softc sc_dci;	/* must be first */
@@ -236,7 +237,6 @@
 		sc->sc_vbus_intr_hdl = NULL;
 		goto error;
 	}
-
 	err = at9100_dci_init(&(sc->sc_dci));
 	if (!err) {
 		err = device_probe_and_attach(sc->sc_dci.sc_bus.bdev);
@@ -321,12 +321,27 @@
 	return (0);
 }
 
+static int
+at91_udp_shutdown(device_t dev)
+{
+	struct at91_udp_softc *sc = device_get_softc(dev);
+	int err;
+
+	err = bus_generic_shutdown(dev);
+	if (err)
+		return (err);
+
+	at9100_dci_uninit(&(sc->sc_dci));
+
+	return (0);
+}
+
 static device_method_t at91_udp_methods[] = {
 	/* Device interface */
 	DEVMETHOD(device_probe, at91_udp_probe),
 	DEVMETHOD(device_attach, at91_udp_attach),
 	DEVMETHOD(device_detach, at91_udp_detach),
-	DEVMETHOD(device_shutdown, bus_generic_shutdown),
+	DEVMETHOD(device_shutdown, at91_udp_shutdown),
 
 	/* Bus interface */
 	DEVMETHOD(bus_print_child, bus_generic_print_child),

==== //depot/projects/usb/src/sys/dev/usb/at9100_dci.c#6 (text+ko) ====

@@ -1418,9 +1418,6 @@
 	/* wait a little for things to stabilise */
 	DELAY(1000);
 
-	/* enable Transceiver */
-	AT91_UDP_WRITE_4(sc, AT91_UDP_TXVC, 0);
-
 	/* disable and clear all interrupts */
 	AT91_UDP_WRITE_4(sc, AT91_UDP_IDR, 0xFFFFFFFF);
 	AT91_UDP_WRITE_4(sc, AT91_UDP_ICR, 0xFFFFFFFF);
@@ -1460,6 +1457,23 @@
 void
 at9100_dci_uninit(struct at9100_dci_softc *sc)
 {
+	mtx_lock(&(sc->sc_bus.mtx));
+
+	/* disable and clear all interrupts */
+	AT91_UDP_WRITE_4(sc, AT91_UDP_IDR, 0xFFFFFFFF);
+	AT91_UDP_WRITE_4(sc, AT91_UDP_ICR, 0xFFFFFFFF);
+
+	sc->sc_flags.port_powered = 0;
+	sc->sc_flags.status_vbus = 0;
+	sc->sc_flags.status_bus_reset = 0;
+	sc->sc_flags.status_suspend = 0;
+	sc->sc_flags.change_suspend = 0;
+	sc->sc_flags.change_connect = 1;
+
+	at9100_dci_pull_down(sc);
+	at9100_dci_clocks_off(sc);
+	mtx_unlock(&(sc->sc_bus.mtx));
+
 	return;
 }
 



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