Hi, On Sat, Jul 26, 2014 at 01:35:23AM +0800, Wang YanQing wrote: > + It support 2 GPIOs on PL2303HX currently, "supports" > +static u8 gpio_dir_mask[GPIO_NUM] = {0x10, 0x20}; > +static u8 gpio_value_mask[GPIO_NUM] = {0x40, 0x80}; Those two should better be static const, too (sorry). You're at v5 already (wow, what endurance!), but if there ever will be a v6... :) > +static int pl2303_gpio_startup(struct usb_serial *serial) > +{ > + struct pl2303_serial_private *spriv = usb_get_serial_data(serial); > + char *label; > + int ret; > + int minor; > + > + if (spriv->type != &pl2303_type_data[TYPE_HX]) > + return 0; Hmm, that's some structurally inverted check code. The pl2303_gpio_startup() function in its entirety is specific to the GPIO-supporting type TYPE_HX, thus we shouldn't even *call* a type-specific sub handler if we know that we're a different chip type. And in fact pl2303_startup() already has everything in place for a direct type check. Yeah, that might be "less reliable" than a type check planted within pl2303_gpio_startup() (someone might bogusly call pl2303_gpio_startup() for a different-type chip), but such an unrelated (external!) type check dependency shouldn't be interwoven with a type-specific setup helper which is to be concerned with inner-layer setup handling only. A probably(!) even better idea here might be to add some function pointers to spriv->type struct def, to be able to do != NULL ptr checks and in such cases call such chip-specific setup functions (i.e., call the HX type helper which internally knows that it needs to do GPIO setup). Such a change might be able to get rid of several #ifdef:s, too... (plus, provide long-lasting generic infrastructure for future chip types). Andreas Mohr -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html