We have a lot of ad-hoc bus/adapter lists. Let's replace them with device classes.
Signed-off-by: Ahmad Fatoum <a.fat...@barebox.org> --- drivers/base/bus.c | 5 ++--- drivers/i2c/i2c.c | 6 +++--- drivers/mci/mci-core.c | 14 +++++++++----- drivers/net/phy/mdio_bus.c | 6 +++--- drivers/tee/tee_core.c | 7 +++---- drivers/tee/tee_private.h | 2 -- drivers/usb/gadget/udc/core.c | 3 +++ drivers/video/backlight.c | 7 +++---- drivers/w1/w1.c | 4 ++-- include/driver.h | 5 ++--- include/i2c/i2c.h | 5 ++--- include/linux/phy.h | 6 ++---- include/video/backlight.h | 1 - 13 files changed, 34 insertions(+), 37 deletions(-) diff --git a/drivers/base/bus.c b/drivers/base/bus.c index 6a4e654b3cea..fde27dd008e8 100644 --- a/drivers/base/bus.c +++ b/drivers/base/bus.c @@ -8,8 +8,7 @@ #include <errno.h> #include <of.h> -LIST_HEAD(bus_list); -EXPORT_SYMBOL(bus_list); +DEFINE_DEV_CLASS(bus_class, "bus"); static struct bus_type *get_bus_by_name(const char *name) { @@ -41,7 +40,7 @@ int bus_register(struct bus_type *bus) INIT_LIST_HEAD(&bus->device_list); INIT_LIST_HEAD(&bus->driver_list); - list_add_tail(&bus->list, &bus_list); + class_add_device(&bus_class, &bus->dev); return 0; } diff --git a/drivers/i2c/i2c.c b/drivers/i2c/i2c.c index 49b87bb47c00..7ebd9c11e600 100644 --- a/drivers/i2c/i2c.c +++ b/drivers/i2c/i2c.c @@ -42,7 +42,7 @@ struct boardinfo { }; static LIST_HEAD(board_list); -LIST_HEAD(i2c_adapter_list); +DEFINE_DEV_CLASS(i2c_adapter_class, "i2c_adapter"); /** * i2c_transfer - execute a single or combined I2C message @@ -483,7 +483,7 @@ static void i2c_hw_rescan(struct device *dev) { struct i2c_adapter *adap; - list_for_each_entry(adap, &i2c_adapter_list, list) { + for_each_i2c_adapter(adap) { if (dev != adap->dev.parent) continue; of_i2c_register_devices(adap); @@ -742,7 +742,7 @@ int i2c_add_numbered_adapter(struct i2c_adapter *adapter) if (ret) return ret; - list_add_tail(&adapter->list, &i2c_adapter_list); + class_add_device(&i2c_adapter_class, &adapter->dev); slice_init(&adapter->slice, dev_name(&adapter->dev)); diff --git a/drivers/mci/mci-core.c b/drivers/mci/mci-core.c index 23cde58c0c5b..4ce5327a7047 100644 --- a/drivers/mci/mci-core.c +++ b/drivers/mci/mci-core.c @@ -40,7 +40,11 @@ static inline u32 unstuff_bits(const u32 *resp, int start, int size) return __res & __mask; } -LIST_HEAD(mci_list); +static DEFINE_DEV_CLASS(mmc_class, "mmc"); + +#define for_each_mci(mci) \ + class_for_each_container_of_device(&mmc_class, mci, dev) + /** * @file @@ -3033,7 +3037,7 @@ static int mci_hw_detect(struct device *dev) { struct mci *mci; - list_for_each_entry(mci, &mci_list, list) { + for_each_mci(mci) { if (dev == mci->host->hw_dev) return mci_detect_card(mci->host); } @@ -3111,7 +3115,7 @@ int mci_register(struct mci_host *host) of_register_fixup(of_broken_cd_fixup, host); } - list_add_tail(&mci->list, &mci_list); + class_add_device(&mmc_class, &mci->dev); return 0; @@ -3245,7 +3249,7 @@ struct mci *mci_get_device_by_name(const char *name) { struct mci *mci; - list_for_each_entry(mci, &mci_list, list) { + for_each_mci(mci) { if (!mci->cdevname) continue; if (!strcmp(mci->cdevname, name)) @@ -3259,7 +3263,7 @@ struct mci *mci_get_rpmb_dev(unsigned int id) { struct mci *mci; - list_for_each_entry(mci, &mci_list, list) { + for_each_mci(mci) { if (mci->host->of_id != id) continue; diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c index a6671a2680ad..a7eda3f84a11 100644 --- a/drivers/net/phy/mdio_bus.c +++ b/drivers/net/phy/mdio_bus.c @@ -28,7 +28,7 @@ #define DEFAULT_GPIO_RESET_ASSERT 1000 /* us */ #define DEFAULT_GPIO_RESET_DEASSERT 1000 /* us */ -LIST_HEAD(mii_bus_list); +DEFINE_DEV_CLASS(mii_class, "mii"); static struct phy_device *mdio_device_create(struct mii_bus *bus, int addr) { @@ -312,7 +312,7 @@ int mdiobus_register(struct mii_bus *bus) if (bus->reset) bus->reset(bus); - list_add_tail(&bus->list, &mii_bus_list); + class_add_device(&mii_class, &bus->dev); pr_info("%s: probed\n", dev_name(&bus->dev)); @@ -342,7 +342,7 @@ void mdiobus_unregister(struct mii_bus *bus) slice_exit(&bus->slice); - list_del(&bus->list); + list_del_init(&bus->dev.class_list); } EXPORT_SYMBOL(mdiobus_unregister); diff --git a/drivers/tee/tee_core.c b/drivers/tee/tee_core.c index 593e85313b0a..653b04ff06af 100644 --- a/drivers/tee/tee_core.c +++ b/drivers/tee/tee_core.c @@ -16,7 +16,7 @@ #define TEE_IOCTL_PARAM_SIZE(x) (sizeof(struct tee_param) * (x)) -static LIST_HEAD(tee_clients); +static DEFINE_DEV_CLASS(tee_client_class, "tee_client"); struct tee_context *teedev_open(struct tee_device *teedev) { @@ -591,7 +591,7 @@ int tee_device_register(struct tee_device *teedev) goto out; } - list_add_tail(&teedev->list, &tee_clients); + class_add_device(&tee_client_class, &teedev->dev); teedev->flags |= TEE_DEVICE_FLAG_REGISTERED; return 0; @@ -640,7 +640,6 @@ void tee_device_unregister(struct tee_device *teedev) if (!teedev) return; - list_del(&teedev->list); if (IS_ENABLED(CONFIG_OPTEE_DEVFS)) devfs_remove(&teedev->cdev); unregister_device(&teedev->dev); @@ -687,7 +686,7 @@ tee_client_open_context(struct tee_context *start, if (start) startdev = &start->teedev->dev; - list_for_each_entry(teedev, &tee_clients, list) { + class_for_each_container_of_device(&tee_client_class, teedev, dev) { struct device *dev = &teedev->dev; struct tee_context *ctx ; diff --git a/drivers/tee/tee_private.h b/drivers/tee/tee_private.h index 045f2df9f3b4..e349613d7868 100644 --- a/drivers/tee/tee_private.h +++ b/drivers/tee/tee_private.h @@ -19,7 +19,6 @@ struct tee_context; * struct tee_device - TEE Device representation * @name: name of device * @desc: description of device - * @id: unique id of device * @flags: represented by TEE_DEVICE_FLAG_REGISTERED above * @dev: embedded basic device structure * @cdev: embedded cdev @@ -29,7 +28,6 @@ struct tee_context; struct tee_device { char name[TEE_MAX_DEV_NAME_LEN]; const struct tee_desc *desc; - struct list_head list; unsigned int flags; struct device dev; diff --git a/drivers/usb/gadget/udc/core.c b/drivers/usb/gadget/udc/core.c index 4416902bc143..14bd5f493350 100644 --- a/drivers/usb/gadget/udc/core.c +++ b/drivers/usb/gadget/udc/core.c @@ -46,6 +46,7 @@ struct usb_udc { }; static LIST_HEAD(udc_list); +static DEFINE_DEV_CLASS(udc_class, "udc"); /* Protects udc_list, udc->driver, driver->is_bound, and related calls */ static DEFINE_MUTEX(udc_lock); @@ -1194,6 +1195,8 @@ int usb_add_gadget(struct usb_gadget *gadget) if (ret) goto err_free_id; + class_add_device(&udc_class, &udc->dev); + dev_add_param_uint32(&gadget->dev, "product", NULL, NULL, &gadget->product_id, "0x%04x", NULL); dev_add_param_uint32(&gadget->dev, "vendor", NULL, NULL, diff --git a/drivers/video/backlight.c b/drivers/video/backlight.c index 523dd7e9f324..51d245a80fdb 100644 --- a/drivers/video/backlight.c +++ b/drivers/video/backlight.c @@ -1,10 +1,9 @@ // SPDX-License-Identifier: GPL-2.0-only #include <common.h> #include <driver.h> -#include <linux/list.h> #include <video/backlight.h> -static LIST_HEAD(backlights); +static DEFINE_DEV_CLASS(backlight_class, "backlight"); int backlight_set_brightness(struct backlight_device *bl, unsigned brightness) { @@ -84,7 +83,7 @@ int backlight_register(struct backlight_device *bl) dev_add_param_uint32(&bl->dev, "slew_time_ms", NULL, NULL, &bl->slew_time_ms, "%u", NULL); - list_add_tail(&bl->list, &backlights); + class_add_device(&backlight_class, &bl->dev); return ret; } @@ -95,7 +94,7 @@ struct backlight_device *of_backlight_find(struct device_node *node) of_device_ensure_probed(node); - list_for_each_entry(bl, &backlights, list) + class_for_each_container_of_device(&backlight_class, bl, dev) if (bl->node == node) return bl; diff --git a/drivers/w1/w1.c b/drivers/w1/w1.c index 15ada42ef0ba..61f21ff446b8 100644 --- a/drivers/w1/w1.c +++ b/drivers/w1/w1.c @@ -10,7 +10,7 @@ #include "w1.h" -static LIST_HEAD(w1_buses); +static DEFINE_DEV_CLASS(w1_bus_class, "w1_bus"); static void w1_pre_write(struct w1_bus *bus); static void w1_post_write(struct w1_bus *bus); @@ -608,7 +608,7 @@ int w1_bus_register(struct w1_bus *bus) if (!bus->max_slave_count) bus->max_slave_count = 10; - list_add_tail(&bus->list, &w1_buses); + class_add_device(&w1_bus_class, &bus->dev); dev_set_name(&bus->dev, "w1_bus"); bus->dev.id = DEVICE_ID_DYNAMIC; diff --git a/include/driver.h b/include/driver.h index c6b7b37aa00f..581f59754bab 100644 --- a/include/driver.h +++ b/include/driver.h @@ -360,7 +360,6 @@ struct bus_type { struct device dev; - struct list_head list; struct list_head device_list; struct list_head driver_list; }; @@ -374,11 +373,11 @@ static inline int driver_match_device(const struct driver *drv, return drv->bus->match ? drv->bus->match(dev, drv) : true; } -extern struct list_head bus_list; +extern struct class bus_class; /* Iterate over all buses */ -#define for_each_bus(bus) list_for_each_entry(bus, &bus_list, list) +#define for_each_bus(bus) class_for_each_container_of_device(&bus_class, bus, dev) /* Iterate over all devices of a bus */ diff --git a/include/i2c/i2c.h b/include/i2c/i2c.h index 9094003b686a..5c0174b0ddc7 100644 --- a/include/i2c/i2c.h +++ b/include/i2c/i2c.h @@ -125,7 +125,6 @@ struct i2c_adapter { struct slice slice; int nr; /* bus number */ int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs, int num); - struct list_head list; int retries; void *algo_data; @@ -304,9 +303,9 @@ int of_i2c_device_enable_and_register_by_alias(const char *alias); void i2c_parse_fw_timings(struct device *dev, struct i2c_timings *t, bool use_defaults); -extern struct list_head i2c_adapter_list; +extern struct class i2c_adapter_class; #define for_each_i2c_adapter(adap) \ - list_for_each_entry(adap, &i2c_adapter_list, list) + class_for_each_container_of_device(&i2c_adapter_class, adap, dev) /* For devices that use several addresses, use i2c_new_dummy() to make * client handles for the extra addresses. diff --git a/include/linux/phy.h b/include/linux/phy.h index 5cbd21f91a50..04b82d63a51e 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -240,8 +240,6 @@ struct mii_bus { /* PHY addresses to be ignored when probing */ u32 phy_mask; - struct list_head list; - bool is_multiplexed; struct slice slice; @@ -257,12 +255,12 @@ int mdiobus_register(struct mii_bus *bus); void mdiobus_unregister(struct mii_bus *bus); struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr); -extern struct list_head mii_bus_list; +extern struct class mii_class; int mdiobus_detect(struct device *dev); #define for_each_mii_bus(mii) \ - list_for_each_entry(mii, &mii_bus_list, list) + class_for_each_container_of_device(&mii_class, mii, dev) struct mii_bus *mdiobus_get_bus(int busnum); diff --git a/include/video/backlight.h b/include/video/backlight.h index 2dd63202cd6e..dcb8e8c5e10e 100644 --- a/include/video/backlight.h +++ b/include/video/backlight.h @@ -11,7 +11,6 @@ struct backlight_device { int brightness_default; int slew_time_ms; /* time to stretch brightness changes */ int (*brightness_set)(struct backlight_device *, int brightness); - struct list_head list; struct device dev; struct device_node *node; }; -- 2.39.5