OSDN Git Service

usb: max-3421: Use driver data instead of maintaining a list of bound devices
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Mon, 18 Oct 2021 20:40:28 +0000 (22:40 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 21 Oct 2021 10:52:28 +0000 (12:52 +0200)
commitfc153aba3ef371d0d76eb88230ed4e0dee5b38f2
tree0ef0032c6429f25323048e3503635f228dfa48dc
parent1ad707f559f7cb12c64f3d7cb37f0b1ea27c1058
usb: max-3421: Use driver data instead of maintaining a list of bound devices

Instead of maintaining a single-linked list of devices that must be
searched linearly in .remove() just use spi_set_drvdata() to remember the
link between the spi device and the driver struct. Then the global list
and the next member can be dropped.

This simplifies the driver, reduces the memory footprint and the time to
search the list. Also it makes obvious that there is always a corresponding
driver struct for a given device in .remove(), so the error path for
!max3421_hcd can be dropped, too.

As a side effect this fixes a data inconsistency when .probe() races with
itself for a second max3421 device in manipulating max3421_hcd_list. A
similar race is fixed in .remove(), too.

Fixes: 2d53139f3162 ("Add support for using a MAX3421E chip as a host driver.")
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Link: https://lore.kernel.org/r/20211018204028.2914597-1-u.kleine-koenig@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/max3421-hcd.c