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 | 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 | 346 | * subsys_find_device_by_id - find a device with a specific enumeration number |
| 371 | 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 | 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 | 3366 | int device_match_of_node(struct device *dev, const void *np) |
| 3361 | 3367 | { |
| 3362 | 3368 | return dev->of_node == np; |
| @@ -89,13 +89,6 @@ static struct class stm_class = { · 88 unmodified lines | ||
| 89 | 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 | 93 | * stm_find_device() - find stm device by name |
| 101 | 94 | * @buf: character buffer containing the name |
| @@ -116,7 +109,7 @@ struct stm_device *stm_find_device(const char *buf) · 14 unmodified lines | ||
| 116 | 109 | if (!stm_core_up) |
| 117 | 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 | 113 | if (!dev) |
| 121 | 114 | return NULL; |
| 122 | 115 | |
| @@ -213,13 +213,6 @@ static int led_resume(struct device *dev) · 212 unmodified lines | ||
| 213 | 213 | |
| 214 | 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 | 216 | static int led_classdev_next_name(const char *init_name, char *name, |
| 224 | 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 | 223 | strlcpy(name, init_name, len); |
| 231 | 224 | |
| 232 | 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 | 227 | put_device(dev); |
| 235 | 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 | 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 | 666 | struct rtc_device *rtc_class_open(const char *name) |
| 676 | 667 | { |
| 677 | 668 | struct device *dev; |
| 678 | 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 | 672 | if (dev) |
| 682 | 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 | 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 | 612 | * get_ccwgroupdev_by_busid() - obtain device from a bus id |
| 620 | 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 | 625 | struct device *dev; |
| 633 | 626 | |
| 634 | − dev = driver_find_device(&gdrv->driver, NULL, bus_id, | |
| 635 | − __ccwgroupdev_check_busid); | |
| 627 | + dev = driver_find_device_by_name(&gdrv->driver, bus_id); | |
| 636 | 628 | |
| 637 | 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 | 1695 | EXPORT_SYMBOL_GPL(ccw_device_force_console); |
| 1696 | 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 | 1699 | * get_ccwdev_by_busid() - obtain device from a bus id |
| 1712 | 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 | 1712 | struct device *dev; |
| 1725 | 1713 | |
| 1726 | − dev = driver_find_device(&cdrv->driver, NULL, (void *)bus_id, | |
| 1727 | − __ccwdev_check_busid); | |
| 1714 | + dev = driver_find_device_by_name(&cdrv->driver, bus_id); | |
| 1728 | 1715 | |
| 1729 | 1716 | return dev ? to_ccwdev(dev) : NULL; |
| 1730 | 1717 | } |
| @@ -133,12 +133,6 @@ struct zcdn_device { · 132 unmodified lines | ||
| 133 | 133 | static int zcdn_create(const char *name); |
| 134 | 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 | 136 | /* helper function, matches the devt value for find_zcdndev_by_devt() */ |
| 143 | 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 | 147 | static inline struct zcdn_device *find_zcdndev_by_name(const char *name) |
| 154 | 148 | { |
| 155 | − struct device *dev = | |
| 156 | − class_find_device(zcrypt_class, NULL, | |
| 157 | − (void *) name, | |
| 158 | − __match_zcdn_name); | |
| 149 | + struct device *dev = class_find_device_by_name(zcrypt_class, name); | |
| 159 | 150 | |
| 160 | 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 | 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 | 93 | static void *usb_role_switch_match(struct device_connection *con, int ep, |
| 99 | 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 | 102 | dev = class_find_device(role_class, NULL, con->fwnode, |
| 108 | 103 | switch_fwnode_match); |
| 109 | 104 | } else { |
| 110 | − dev = class_find_device(role_class, NULL, con->endpoint[ep], | |
| 111 | − switch_name_match); | |
| 105 | + dev = class_find_device_by_name(role_class, con->endpoint[ep]); | |
| 112 | 106 | } |
| 113 | 107 | |
| 114 | 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 | 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 | 213 | static void *typec_port_match(struct device_connection *con, int ep, void *data) |
| 219 | 214 | { |
| 220 | 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 | 222 | return class_find_device(typec_class, NULL, con->fwnode, |
| 228 | 223 | typec_port_fwnode_match); |
| 229 | 224 | |
| 230 | − dev = class_find_device(typec_class, NULL, con->endpoint[ep], | |
| 231 | − typec_port_name_match); | |
| 225 | + dev = class_find_device_by_name(typec_class, con->endpoint[ep]); | |
| 232 | 226 | |
| 233 | 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 | 164 | struct device *subsys_dev_iter_next(struct subsys_dev_iter *iter); |
| 165 | 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 | 168 | int device_match_of_node(struct device *dev, const void *np); |
| 168 | 169 | |
| 169 | 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 | 172 | struct device *bus_find_device(struct bus_type *bus, struct device *start, |
| 172 | 173 | const void *data, |
| 173 | 174 | int (*match)(struct device *dev, const void *data)); |
| 174 | −struct device *bus_find_device_by_name(struct bus_type *bus, | |
| 175 | − struct device *start, | |
| 176 | − const char *name); | |
| 175 | +/** | |
| 176 | + * bus_find_device_by_name - device iterator for locating a particular device | |
| 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 | 189 | struct device *subsys_find_device_by_id(struct bus_type *bus, unsigned int id, |
| 178 | 190 | struct device *hint); |
| 179 | 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 | 354 | struct device *start, const void *data, |
| 343 | 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 | 369 | void driver_deferred_probe_add(struct device *dev); |
| 346 | 370 | int driver_deferred_probe_check_state(struct device *dev); |
| 347 | 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 | 495 | struct device *start, const void *data, |
| 472 | 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 | 510 | struct class_attribute { |
| 475 | 511 | struct attribute attr; |
| 476 | 512 | ssize_t (*show)(struct class *class, struct class_attribute *attr, |
| @@ -23,11 +23,6 @@ · 22 unmodified lines | ||
| 23 | 23 | LIST_HEAD(cfg802154_rdev_list); |
| 24 | 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 | 26 | struct wpan_phy *wpan_phy_find(const char *str) |
| 32 | 27 | { |
| 33 | 28 | struct device *dev; |
| @@ -35,7 +30,7 @@ struct wpan_phy *wpan_phy_find(const char *str) · 1 unmodified line | ||
| 35 | 30 | if (WARN_ON(!str)) |
| 36 | 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 | 34 | if (!dev) |
| 40 | 35 | return NULL; |
| 41 | 36 | |