On Wednesday, June 29, 2011 5:22:26 am Andriy Gapon wrote: > on 29/06/2011 01:32 Xin LI said the following: > > +/* > > + * Look for Winbond device. > > + */ > > +static void > > +winbondwd_identify(driver_t *driver, device_t parent) > > +{ > > + unsigned int baseport; > > + device_t dev; > > + > > + if ((dev = device_find_child(parent, driver->name, 0)) == NULL) { > > + if (resource_int_value("winbondwd", 0, "baseport", &baseport) > > != 0) { > > + baseport = winbondwd_baseport_probe(); > > + if (baseport == (unsigned int)(-1)) { > > + printf("winbondwd0: Compatible Winbond Super > > I/O not found.\n"); > > + return; > > + } > > + } > > + > > + dev = BUS_ADD_CHILD(parent, 0, driver->name, 0); > > + > > + bus_set_resource(dev, SYS_RES_IOPORT, 0, baseport, 2); > > + } > > + > > + if (dev == NULL) > > + return; > > These last two lines are redundant? > > Also, maybe I am confused, but I think that in ISA identify method you don't > actually need to parse any hints/tunables. That is, you can use standard > hints > approach like e.g.: > hint.winbondwd.0.at="isa" > hint.winbondwd.0.port="0x3F0" > and ISA will automatically add a winbondwd child with an I/O port resource at > 0x3F0. The identify method should only add a child for a > no-hints/auto-probing > case. > E.g. see boiler-plate code for the ISA case in > share/examples/drivers/make_device_driver.sh, especially the comments. > > I am not saying that your approach won't work (apparently it does) or that it > is > inherently bad. It just seems to be different from how other ISA drivers do > their identify+probe dance.
I agree, it should probably look something like this: { if (device_find_child(parent, driver->name, 0) != NULL) return; if (resource_int_value(driver->name, 0, "port", &baseport) == 0) return; baseport = winbondwd_baseport_probe(); if (baseport == -1) /* No reason to warn on every boot here. */ return; dev = BUS_ADD_CHILD(parent, 0, driver->name, 0); if (dev != NULL) bus_set_resource(dev, SYS_RES_IOPORT, 0, baseport, 2); } > > + sc->wb_bst = rman_get_bustag(sc->wb_res); > > + sc->wb_bsh = rman_get_bushandle(sc->wb_res); Please don't use these. bus_read_X(sc->wb_wres) is easier on the eyes. One other comment, several places in the code are using various magic numbers for register offsets, bit field values, etc. For example: + winbondwd_write_reg(sc, /* LDN bit 7:1 */ 0x7, /* GPIO Port 2 */ 0x8); + winbondwd_write_reg(sc, /* CR30 */ 0x30, /* Activate */ 0x1); Could you add a winbondwdreg.h header and define constants for the registers and their bitfields instead? -- John Baldwin _______________________________________________ freebsd-current@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-current To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"