Module Name: src Committed By: pgoyette Date: Wed Feb 28 22:36:02 UTC 2018
Modified Files: src/sys/dev/pci: ichsmb.c Log Message: Teach the ichsmb(4) driver how to detach. To generate a diff of this commit: cvs rdiff -u -r1.54 -r1.55 src/sys/dev/pci/ichsmb.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/dev/pci/ichsmb.c diff -u src/sys/dev/pci/ichsmb.c:1.54 src/sys/dev/pci/ichsmb.c:1.55 --- src/sys/dev/pci/ichsmb.c:1.54 Tue Feb 27 00:18:02 2018 +++ src/sys/dev/pci/ichsmb.c Wed Feb 28 22:36:02 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: ichsmb.c,v 1.54 2018/02/27 00:18:02 pgoyette Exp $ */ +/* $NetBSD: ichsmb.c,v 1.55 2018/02/28 22:36:02 pgoyette Exp $ */ /* $OpenBSD: ichiic.c,v 1.18 2007/05/03 09:36:26 dlg Exp $ */ /* @@ -22,7 +22,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ichsmb.c,v 1.54 2018/02/27 00:18:02 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ichsmb.c,v 1.55 2018/02/28 22:36:02 pgoyette Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -56,6 +56,8 @@ struct ichsmb_softc { bus_space_tag_t sc_iot; bus_space_handle_t sc_ioh; + bus_size_t sc_size; + pci_chipset_tag_t sc_pc; void * sc_ih; int sc_poll; @@ -73,6 +75,7 @@ struct ichsmb_softc { static int ichsmb_match(device_t, cfdata_t, void *); static void ichsmb_attach(device_t, device_t, void *); +static int ichsmb_detach(device_t, int); static int ichsmb_rescan(device_t, const char *, const int *); static void ichsmb_chdet(device_t, device_t); @@ -86,7 +89,8 @@ static int ichsmb_intr(void *); #include "ioconf.h" CFATTACH_DECL3_NEW(ichsmb, sizeof(struct ichsmb_softc), - ichsmb_match, ichsmb_attach, NULL, NULL, ichsmb_rescan, ichsmb_chdet, 0); + ichsmb_match, ichsmb_attach, ichsmb_detach, NULL, ichsmb_rescan, + ichsmb_chdet, 0); static int @@ -147,13 +151,13 @@ ichsmb_attach(device_t parent, device_t struct ichsmb_softc *sc = device_private(self); struct pci_attach_args *pa = aux; pcireg_t conf; - bus_size_t iosize; pci_intr_handle_t ih; const char *intrstr = NULL; char intrbuf[PCI_INTRSTR_LEN]; int flags; sc->sc_dev = self; + sc->sc_pc = pa->pa_pc; pci_aprint_devinfo(pa, NULL); @@ -168,12 +172,13 @@ ichsmb_attach(device_t parent, device_t /* Map I/O space */ if (pci_mapreg_map(pa, LPCIB_SMB_BASE, PCI_MAPREG_TYPE_IO, 0, - &sc->sc_iot, &sc->sc_ioh, NULL, &iosize)) { + &sc->sc_iot, &sc->sc_ioh, NULL, &sc->sc_size)) { aprint_error_dev(self, "can't map I/O space\n"); goto out; } sc->sc_poll = 1; + sc->sc_ih = NULL; if (conf & LPCIB_SMB_HOSTC_SMIEN) { /* No PCI IRQ */ aprint_normal_dev(self, "interrupting at SMI\n"); @@ -229,6 +234,28 @@ ichsmb_rescan(device_t self, const char return 0; } +static int +ichsmb_detach(device_t self, int flags) +{ + struct ichsmb_softc *sc = device_private(self); + int error; + + if (sc->sc_i2c_device) { + error = config_detach(sc->sc_i2c_device, flags); + if (error) + return error; + } + + mutex_destroy(&sc->sc_i2c_mutex); + + if (sc->sc_ih) + pci_intr_disestablish(sc->sc_pc, sc->sc_ih); + + bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_size); + + return 0; +} + static void ichsmb_chdet(device_t self, device_t child) { @@ -236,7 +263,6 @@ ichsmb_chdet(device_t self, device_t chi if (sc->sc_i2c_device == child) sc->sc_i2c_device = NULL; - } static int