Add a helper to match the device name for device lookup. Also reuse this generic exported helper for the existing bus_find_device_by_name(). and add similar variants for driver/class.
Unified · Split
| @@ -342,30 +342,6 @@ struct device *bus_find_device(struct bus_type *bus, · 341 unmodified lines | |||
| 342 | } | 342 | } |
| 343 | EXPORT_SYMBOL_GPL(bus_find_device); | 343 | EXPORT_SYMBOL_GPL(bus_find_device); |
| 344 | 344 | ||
| 345 | static int match_name(struct device *dev, const void *data) | ||
| 346 | { | ||
| 347 | const char *name = data; | ||
| 348 | |||
| 349 | return sysfs_streq(name, dev_name(dev)); | ||
| 350 | } | ||
| 351 | |||
| 352 | /** | ||
| 353 | * bus_find_device_by_name - device iterator for locating a particular device of a specific name | ||
| 354 | * @bus: bus type | ||
| 355 | * @start: Device to begin with | ||
| 356 | * @name: name of the device to match | ||
| 357 | * | ||
| 358 | * This is similar to the bus_find_device() function above, but it handles | ||
| 359 | * searching by a name automatically, no need to write another strcmp matching | ||
| 360 | * function. | ||
| 361 | */ | ||
| 362 | struct device *bus_find_device_by_name(struct bus_type *bus, | ||
| 363 | struct device *start, const char *name) | ||
| 364 | { | ||
| 365 | return bus_find_device(bus, start, (void *)name, match_name); | ||
| 366 | } | ||
| 367 | EXPORT_SYMBOL_GPL(bus_find_device_by_name); | ||
| 368 | |||
| 369 | /** | 345 | /** |
| 370 | * subsys_find_device_by_id - find a device with a specific enumeration number | 346 | * subsys_find_device_by_id - find a device with a specific enumeration number |
| 371 | * @subsys: subsystem | 347 | * @subsys: subsystem |
| @@ -3357,6 +3357,12 @@ void device_set_of_node_from_dev(struct device *dev, const struct device *dev2) · 3356 unmodified lines | |||
| 3357 | } | 3357 | } |
| 3358 | EXPORT_SYMBOL_GPL(device_set_of_node_from_dev); | 3358 | EXPORT_SYMBOL_GPL(device_set_of_node_from_dev); |
| 3359 | 3359 | ||
| 3360 | int device_match_name(struct device *dev, const void *name) | ||
| 3361 | { | ||
| 3362 | return sysfs_streq(dev_name(dev), name); | ||
| 3363 | } | ||
| 3364 | EXPORT_SYMBOL_GPL(device_match_name); | ||
| 3365 | |||
| 3360 | int device_match_of_node(struct device *dev, const void *np) | 3366 | int device_match_of_node(struct device *dev, const void *np) |
| 3361 | { | 3367 | { |
| 3362 | return dev->of_node == np; | 3368 | return dev->of_node == np; |
| @@ -89,13 +89,6 @@ static struct class stm_class = { · 88 unmodified lines | |||
| 89 | .dev_groups = stm_groups, | 89 | .dev_groups = stm_groups, |
| 90 | }; | 90 | }; |
| 91 | 91 | ||
| 92 | static int stm_dev_match(struct device *dev, const void *data) | ||
| 93 | { | ||
| 94 | const char *name = data; | ||
| 95 | |||
| 96 | return sysfs_streq(name, dev_name(dev)); | ||
| 97 | } | ||
| 98 | |||
| 99 | /** | 92 | /** |
| 100 | * stm_find_device() - find stm device by name | 93 | * stm_find_device() - find stm device by name |
| 101 | * @buf: character buffer containing the name | 94 | * @buf: character buffer containing the name |
| @@ -116,7 +109,7 @@ struct stm_device *stm_find_device(const char *buf) · 14 unmodified lines | |||
| 116 | if (!stm_core_up) | 109 | if (!stm_core_up) |
| 117 | return NULL; | 110 | return NULL; |
| 118 | 111 | ||
| 119 | dev = class_find_device(&stm_class, NULL, buf, stm_dev_match); | 112 | dev = class_find_device_by_name(&stm_class, buf); |
| 120 | if (!dev) | 113 | if (!dev) |
| 121 | return NULL; | 114 | return NULL; |
| 122 | 115 | ||
| @@ -213,13 +213,6 @@ static int led_resume(struct device *dev) · 212 unmodified lines | |||
| 213 | 213 | ||
| 214 | static SIMPLE_DEV_PM_OPS(leds_class_dev_pm_ops, led_suspend, led_resume); | 214 | static SIMPLE_DEV_PM_OPS(leds_class_dev_pm_ops, led_suspend, led_resume); |
| 215 | 215 | ||
| 216 | static int match_name(struct device *dev, const void *data) | ||
| 217 | { | ||
| 218 | if (!dev_name(dev)) | ||
| 219 | return 0; | ||
| 220 | return !strcmp(dev_name(dev), (char *)data); | ||
| 221 | } | ||
| 222 | |||
| 223 | static int led_classdev_next_name(const char *init_name, char *name, | 216 | static int led_classdev_next_name(const char *init_name, char *name, |
| 224 | size_t len) | 217 | size_t len) |
| 225 | { | 218 | { |
| @@ -230,7 +223,7 @@ static int led_classdev_next_name(const char *init_name, char *name, · 4 unmodified lines | |||
| 230 | strlcpy(name, init_name, len); | 223 | strlcpy(name, init_name, len); |
| 231 | 224 | ||
| 232 | while ((ret < len) && | 225 | while ((ret < len) && |
| 233 | (dev = class_find_device(leds_class, NULL, name, match_name))) { | 226 | (dev = class_find_device_by_name(leds_class, name))) { |
| 234 | put_device(dev); | 227 | put_device(dev); |
| 235 | ret = snprintf(name, len, "%s_%u", init_name, ++i); | 228 | ret = snprintf(name, len, "%s_%u", init_name, ++i); |
| 236 | } | 229 | } |
| @@ -663,21 +663,12 @@ void rtc_update_irq(struct rtc_device *rtc, · 662 unmodified lines | |||
| 663 | } | 663 | } |
| 664 | EXPORT_SYMBOL_GPL(rtc_update_irq); | 664 | EXPORT_SYMBOL_GPL(rtc_update_irq); |
| 665 | 665 | ||
| 666 | static int __rtc_match(struct device *dev, const void *data) | ||
| 667 | { | ||
| 668 | const char *name = data; | ||
| 669 | |||
| 670 | if (strcmp(dev_name(dev), name) == 0) | ||
| 671 | return 1; | ||
| 672 | return 0; | ||
| 673 | } | ||
| 674 | |||
| 675 | struct rtc_device *rtc_class_open(const char *name) | 666 | struct rtc_device *rtc_class_open(const char *name) |
| 676 | { | 667 | { |
| 677 | struct device *dev; | 668 | struct device *dev; |
| 678 | struct rtc_device *rtc = NULL; | 669 | struct rtc_device *rtc = NULL; |
| 679 | 670 | ||
| 680 | dev = class_find_device(rtc_class, NULL, name, __rtc_match); | 671 | dev = class_find_device_by_name(rtc_class, name); |
| 681 | if (dev) | 672 | if (dev) |
| 682 | rtc = to_rtc_device(dev); | 673 | rtc = to_rtc_device(dev); |
| 683 | 674 | ||
| @@ -608,13 +608,6 @@ void ccwgroup_driver_unregister(struct ccwgroup_driver *cdriver) · 607 unmodified lines | |||
| 608 | } | 608 | } |
| 609 | EXPORT_SYMBOL(ccwgroup_driver_unregister); | 609 | EXPORT_SYMBOL(ccwgroup_driver_unregister); |
| 610 | 610 | ||
| 611 | static int __ccwgroupdev_check_busid(struct device *dev, const void *id) | ||
| 612 | { | ||
| 613 | const char *bus_id = id; | ||
| 614 | |||
| 615 | return (strcmp(bus_id, dev_name(dev)) == 0); | ||
| 616 | } | ||
| 617 | |||
| 618 | /** | 611 | /** |
| 619 | * get_ccwgroupdev_by_busid() - obtain device from a bus id | 612 | * get_ccwgroupdev_by_busid() - obtain device from a bus id |
| 620 | * @gdrv: driver the device is owned by | 613 | * @gdrv: driver the device is owned by |
| @@ -631,8 +624,7 @@ struct ccwgroup_device *get_ccwgroupdev_by_busid(struct ccwgroup_driver *gdrv, · 10 unmodified lines | |||
| 631 | { | 624 | { |
| 632 | struct device *dev; | 625 | struct device *dev; |
| 633 | 626 | ||
| 634 | dev = driver_find_device(&gdrv->driver, NULL, bus_id, | 627 | dev = driver_find_device_by_name(&gdrv->driver, bus_id); |
| 635 | __ccwgroupdev_check_busid); | ||
| 636 | 628 | ||
| 637 | return dev ? to_ccwgroupdev(dev) : NULL; | 629 | return dev ? to_ccwgroupdev(dev) : NULL; |
| 638 | } | 630 | } |
| @@ -1695,18 +1695,6 @@ int ccw_device_force_console(struct ccw_device *cdev) · 1694 unmodified lines | |||
| 1695 | EXPORT_SYMBOL_GPL(ccw_device_force_console); | 1695 | EXPORT_SYMBOL_GPL(ccw_device_force_console); |
| 1696 | #endif | 1696 | #endif |
| 1697 | 1697 | ||
| 1698 | /* | ||
| 1699 | * get ccw_device matching the busid, but only if owned by cdrv | ||
| 1700 | */ | ||
| 1701 | static int | ||
| 1702 | __ccwdev_check_busid(struct device *dev, const void *id) | ||
| 1703 | { | ||
| 1704 | const char *bus_id = id; | ||
| 1705 | |||
| 1706 | return (strcmp(bus_id, dev_name(dev)) == 0); | ||
| 1707 | } | ||
| 1708 | |||
| 1709 | |||
| 1710 | /** | 1698 | /** |
| 1711 | * get_ccwdev_by_busid() - obtain device from a bus id | 1699 | * get_ccwdev_by_busid() - obtain device from a bus id |
| 1712 | * @cdrv: driver the device is owned by | 1700 | * @cdrv: driver the device is owned by |
| @@ -1723,8 +1711,7 @@ struct ccw_device *get_ccwdev_by_busid(struct ccw_driver *cdrv, · 10 unmodified lines | |||
| 1723 | { | 1711 | { |
| 1724 | struct device *dev; | 1712 | struct device *dev; |
| 1725 | 1713 | ||
| 1726 | dev = driver_find_device(&cdrv->driver, NULL, (void *)bus_id, | 1714 | dev = driver_find_device_by_name(&cdrv->driver, bus_id); |
| 1727 | __ccwdev_check_busid); | ||
| 1728 | 1715 | ||
| 1729 | return dev ? to_ccwdev(dev) : NULL; | 1716 | return dev ? to_ccwdev(dev) : NULL; |
| 1730 | } | 1717 | } |
| @@ -133,12 +133,6 @@ struct zcdn_device { · 132 unmodified lines | |||
| 133 | static int zcdn_create(const char *name); | 133 | static int zcdn_create(const char *name); |
| 134 | static int zcdn_destroy(const char *name); | 134 | static int zcdn_destroy(const char *name); |
| 135 | 135 | ||
| 136 | /* helper function, matches the name for find_zcdndev_by_name() */ | ||
| 137 | static int __match_zcdn_name(struct device *dev, const void *data) | ||
| 138 | { | ||
| 139 | return strcmp(dev_name(dev), (const char *)data) == 0; | ||
| 140 | } | ||
| 141 | |||
| 142 | /* helper function, matches the devt value for find_zcdndev_by_devt() */ | 136 | /* helper function, matches the devt value for find_zcdndev_by_devt() */ |
| 143 | static int __match_zcdn_devt(struct device *dev, const void *data) | 137 | static int __match_zcdn_devt(struct device *dev, const void *data) |
| 144 | { | 138 | { |
| @@ -152,10 +146,7 @@ static int __match_zcdn_devt(struct device *dev, const void *data) · 7 unmodified lines | |||
| 152 | */ | 146 | */ |
| 153 | static inline struct zcdn_device *find_zcdndev_by_name(const char *name) | 147 | static inline struct zcdn_device *find_zcdndev_by_name(const char *name) |
| 154 | { | 148 | { |
| 155 | struct device *dev = | 149 | struct device *dev = class_find_device_by_name(zcrypt_class, name); |
| 156 | class_find_device(zcrypt_class, NULL, | ||
| 157 | (void *) name, | ||
| 158 | __match_zcdn_name); | ||
| 159 | 150 | ||
| 160 | return dev ? to_zcdn_dev(dev) : NULL; | 151 | return dev ? to_zcdn_dev(dev) : NULL; |
| 161 | } | 152 | } |
| @@ -90,11 +90,6 @@ static int switch_fwnode_match(struct device *dev, const void *fwnode) · 89 unmodified lines | |||
| 90 | return dev_fwnode(dev) == fwnode; | 90 | return dev_fwnode(dev) == fwnode; |
| 91 | } | 91 | } |
| 92 | 92 | ||
| 93 | static int switch_name_match(struct device *dev, const void *name) | ||
| 94 | { | ||
| 95 | return !strcmp((const char *)name, dev_name(dev)); | ||
| 96 | } | ||
| 97 | |||
| 98 | static void *usb_role_switch_match(struct device_connection *con, int ep, | 93 | static void *usb_role_switch_match(struct device_connection *con, int ep, |
| 99 | void *data) | 94 | void *data) |
| 100 | { | 95 | { |
| @@ -107,8 +102,7 @@ static void *usb_role_switch_match(struct device_connection *con, int ep, · 6 unmodified lines | |||
| 107 | dev = class_find_device(role_class, NULL, con->fwnode, | 102 | dev = class_find_device(role_class, NULL, con->fwnode, |
| 108 | switch_fwnode_match); | 103 | switch_fwnode_match); |
| 109 | } else { | 104 | } else { |
| 110 | dev = class_find_device(role_class, NULL, con->endpoint[ep], | 105 | dev = class_find_device_by_name(role_class, con->endpoint[ep]); |
| 111 | switch_name_match); | ||
| 112 | } | 106 | } |
| 113 | 107 | ||
| 114 | return dev ? to_role_switch(dev) : ERR_PTR(-EPROBE_DEFER); | 108 | return dev ? to_role_switch(dev) : ERR_PTR(-EPROBE_DEFER); |
| @@ -210,11 +210,6 @@ static int typec_port_fwnode_match(struct device *dev, const void *fwnode) · 209 unmodified lines | |||
| 210 | return dev_fwnode(dev) == fwnode; | 210 | return dev_fwnode(dev) == fwnode; |
| 211 | } | 211 | } |
| 212 | 212 | ||
| 213 | static int typec_port_name_match(struct device *dev, const void *name) | ||
| 214 | { | ||
| 215 | return !strcmp((const char *)name, dev_name(dev)); | ||
| 216 | } | ||
| 217 | |||
| 218 | static void *typec_port_match(struct device_connection *con, int ep, void *data) | 213 | static void *typec_port_match(struct device_connection *con, int ep, void *data) |
| 219 | { | 214 | { |
| 220 | struct device *dev; | 215 | struct device *dev; |
| @@ -227,8 +222,7 @@ static void *typec_port_match(struct device_connection *con, int ep, void *data) · 6 unmodified lines | |||
| 227 | return class_find_device(typec_class, NULL, con->fwnode, | 222 | return class_find_device(typec_class, NULL, con->fwnode, |
| 228 | typec_port_fwnode_match); | 223 | typec_port_fwnode_match); |
| 229 | 224 | ||
| 230 | dev = class_find_device(typec_class, NULL, con->endpoint[ep], | 225 | dev = class_find_device_by_name(typec_class, con->endpoint[ep]); |
| 231 | typec_port_name_match); | ||
| 232 | 226 | ||
| 233 | return dev ? dev : ERR_PTR(-EPROBE_DEFER); | 227 | return dev ? dev : ERR_PTR(-EPROBE_DEFER); |
| 234 | } | 228 | } |
| @@ -164,6 +164,7 @@ void subsys_dev_iter_init(struct subsys_dev_iter *iter, · 163 unmodified lines | |||
| 164 | struct device *subsys_dev_iter_next(struct subsys_dev_iter *iter); | 164 | struct device *subsys_dev_iter_next(struct subsys_dev_iter *iter); |
| 165 | void subsys_dev_iter_exit(struct subsys_dev_iter *iter); | 165 | void subsys_dev_iter_exit(struct subsys_dev_iter *iter); |
| 166 | 166 | ||
| 167 | int device_match_name(struct device *dev, const void *name); | ||
| 167 | int device_match_of_node(struct device *dev, const void *np); | 168 | int device_match_of_node(struct device *dev, const void *np); |
| 168 | 169 | ||
| 169 | int bus_for_each_dev(struct bus_type *bus, struct device *start, void *data, | 170 | int bus_for_each_dev(struct bus_type *bus, struct device *start, void *data, |
| @@ -171,9 +172,20 @@ int bus_for_each_dev(struct bus_type *bus, struct device *start, void *data, · 1 unmodified line | |||
| 171 | struct device *bus_find_device(struct bus_type *bus, struct device *start, | 172 | struct device *bus_find_device(struct bus_type *bus, struct device *start, |
| 172 | const void *data, | 173 | const void *data, |
| 173 | int (*match)(struct device *dev, const void *data)); | 174 | int (*match)(struct device *dev, const void *data)); |
| 174 | struct device *bus_find_device_by_name(struct bus_type *bus, | 175 | /** |
| 175 | struct device *start, | 176 | * bus_find_device_by_name - device iterator for locating a particular device |
| 176 | const char *name); | 177 | * of a specific name. |
| 178 | * @bus: bus type | ||
| 179 | * @start: Device to begin with | ||
| 180 | * @name: name of the device to match | ||
| 181 | */ | ||
| 182 | static inline struct device *bus_find_device_by_name(struct bus_type *bus, | ||
| 183 | struct device *start, | ||
| 184 | const char *name) | ||
| 185 | { | ||
| 186 | return bus_find_device(bus, start, name, device_match_name); | ||
| 187 | } | ||
| 188 | |||
| 177 | struct device *subsys_find_device_by_id(struct bus_type *bus, unsigned int id, | 189 | struct device *subsys_find_device_by_id(struct bus_type *bus, unsigned int id, |
| 178 | struct device *hint); | 190 | struct device *hint); |
| 179 | int bus_for_each_drv(struct bus_type *bus, struct device_driver *start, | 191 | int bus_for_each_drv(struct bus_type *bus, struct device_driver *start, |
| @@ -342,6 +354,18 @@ struct device *driver_find_device(struct device_driver *drv, · 162 unmodified lines | |||
| 342 | struct device *start, const void *data, | 354 | struct device *start, const void *data, |
| 343 | int (*match)(struct device *dev, const void *data)); | 355 | int (*match)(struct device *dev, const void *data)); |
| 344 | 356 | ||
| 357 | /** | ||
| 358 | * driver_find_device_by_name - device iterator for locating a particular device | ||
| 359 | * of a specific name. | ||
| 360 | * @driver: the driver we're iterating | ||
| 361 | * @name: name of the device to match | ||
| 362 | */ | ||
| 363 | static inline struct device *driver_find_device_by_name(struct device_driver *drv, | ||
| 364 | const char *name) | ||
| 365 | { | ||
| 366 | return driver_find_device(drv, NULL, name, device_match_name); | ||
| 367 | } | ||
| 368 | |||
| 345 | void driver_deferred_probe_add(struct device *dev); | 369 | void driver_deferred_probe_add(struct device *dev); |
| 346 | int driver_deferred_probe_check_state(struct device *dev); | 370 | int driver_deferred_probe_check_state(struct device *dev); |
| 347 | int driver_deferred_probe_check_state_continue(struct device *dev); | 371 | int driver_deferred_probe_check_state_continue(struct device *dev); |
| @@ -471,6 +495,18 @@ extern struct device *class_find_device(struct class *class, · 123 unmodified lines | |||
| 471 | struct device *start, const void *data, | 495 | struct device *start, const void *data, |
| 472 | int (*match)(struct device *, const void *)); | 496 | int (*match)(struct device *, const void *)); |
| 473 | 497 | ||
| 498 | /** | ||
| 499 | * class_find_device_by_name - device iterator for locating a particular device | ||
| 500 | * of a specific name. | ||
| 501 | * @class: class type | ||
| 502 | * @name: name of the device to match | ||
| 503 | */ | ||
| 504 | static inline struct device *class_find_device_by_name(struct class *class, | ||
| 505 | const char *name) | ||
| 506 | { | ||
| 507 | return class_find_device(class, NULL, name, device_match_name); | ||
| 508 | } | ||
| 509 | |||
| 474 | struct class_attribute { | 510 | struct class_attribute { |
| 475 | struct attribute attr; | 511 | struct attribute attr; |
| 476 | ssize_t (*show)(struct class *class, struct class_attribute *attr, | 512 | ssize_t (*show)(struct class *class, struct class_attribute *attr, |
| @@ -23,11 +23,6 @@ · 22 unmodified lines | |||
| 23 | LIST_HEAD(cfg802154_rdev_list); | 23 | LIST_HEAD(cfg802154_rdev_list); |
| 24 | int cfg802154_rdev_list_generation; | 24 | int cfg802154_rdev_list_generation; |
| 25 | 25 | ||
| 26 | static int wpan_phy_match(struct device *dev, const void *data) | ||
| 27 | { | ||
| 28 | return !strcmp(dev_name(dev), (const char *)data); | ||
| 29 | } | ||
| 30 | |||
| 31 | struct wpan_phy *wpan_phy_find(const char *str) | 26 | struct wpan_phy *wpan_phy_find(const char *str) |
| 32 | { | 27 | { |
| 33 | struct device *dev; | 28 | struct device *dev; |
| @@ -35,7 +30,7 @@ struct wpan_phy *wpan_phy_find(const char *str) · 1 unmodified line | |||
| 35 | if (WARN_ON(!str)) | 30 | if (WARN_ON(!str)) |
| 36 | return NULL; | 31 | return NULL; |
| 37 | 32 | ||
| 38 | dev = class_find_device(&wpan_phy_class, NULL, str, wpan_phy_match); | 33 | dev = class_find_device_by_name(&wpan_phy_class, str); |
| 39 | if (!dev) | 34 | if (!dev) |
| 40 | return NULL; | 35 | return NULL; |
| 41 | 36 | ||