mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	ACPI / utils: Introduce acpi_dev_get_first_match_dev() helper
The acpi_dev_get_first_match_name() is missing put_device() call and thus keeping reference counting unbalanced. In order to fix the issue introduce a new helper to convert existing users one-by-one to a better API. Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Reviewed-by: Hans de Goede <hdegoede@redhat.com> Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com> Acked-by: Mark Brown <broonie@kernel.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
		
							parent
							
								
									79a3aaa7b8
								
							
						
					
					
						commit
						817b4d64da
					
				
					 3 changed files with 31 additions and 2 deletions
				
			
		| 
						 | 
					@ -739,6 +739,7 @@ EXPORT_SYMBOL(acpi_dev_found);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct acpi_dev_match_info {
 | 
					struct acpi_dev_match_info {
 | 
				
			||||||
	const char *dev_name;
 | 
						const char *dev_name;
 | 
				
			||||||
 | 
						struct acpi_device *adev;
 | 
				
			||||||
	struct acpi_device_id hid[2];
 | 
						struct acpi_device_id hid[2];
 | 
				
			||||||
	const char *uid;
 | 
						const char *uid;
 | 
				
			||||||
	s64 hrv;
 | 
						s64 hrv;
 | 
				
			||||||
| 
						 | 
					@ -759,6 +760,7 @@ static int acpi_dev_match_cb(struct device *dev, void *data)
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	match->dev_name = acpi_dev_name(adev);
 | 
						match->dev_name = acpi_dev_name(adev);
 | 
				
			||||||
 | 
						match->adev = adev;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (match->hrv == -1)
 | 
						if (match->hrv == -1)
 | 
				
			||||||
		return 1;
 | 
							return 1;
 | 
				
			||||||
| 
						 | 
					@ -806,16 +808,34 @@ bool acpi_dev_present(const char *hid, const char *uid, s64 hrv)
 | 
				
			||||||
EXPORT_SYMBOL(acpi_dev_present);
 | 
					EXPORT_SYMBOL(acpi_dev_present);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * acpi_dev_get_first_match_name - Return name of first match of ACPI device
 | 
					 * acpi_dev_get_first_match_dev - Return the first match of ACPI device
 | 
				
			||||||
 * @hid: Hardware ID of the device.
 | 
					 * @hid: Hardware ID of the device.
 | 
				
			||||||
 * @uid: Unique ID of the device, pass NULL to not check _UID
 | 
					 * @uid: Unique ID of the device, pass NULL to not check _UID
 | 
				
			||||||
 * @hrv: Hardware Revision of the device, pass -1 to not check _HRV
 | 
					 * @hrv: Hardware Revision of the device, pass -1 to not check _HRV
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Return device name if a matching device was present
 | 
					 * Return the first match of ACPI device if a matching device was present
 | 
				
			||||||
 * at the moment of invocation, or NULL otherwise.
 | 
					 * at the moment of invocation, or NULL otherwise.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 | 
					 * The caller is responsible to call put_device() on the returned device.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 * See additional information in acpi_dev_present() as well.
 | 
					 * See additional information in acpi_dev_present() as well.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					struct acpi_device *
 | 
				
			||||||
 | 
					acpi_dev_get_first_match_dev(const char *hid, const char *uid, s64 hrv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct acpi_dev_match_info match = {};
 | 
				
			||||||
 | 
						struct device *dev;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						strlcpy(match.hid[0].id, hid, sizeof(match.hid[0].id));
 | 
				
			||||||
 | 
						match.uid = uid;
 | 
				
			||||||
 | 
						match.hrv = hrv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dev = bus_find_device(&acpi_bus_type, NULL, &match, acpi_dev_match_cb);
 | 
				
			||||||
 | 
						return dev ? match.adev : NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					EXPORT_SYMBOL(acpi_dev_get_first_match_dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* DEPRECATED, use acpi_dev_get_first_match_dev() instead */
 | 
				
			||||||
const char *
 | 
					const char *
 | 
				
			||||||
acpi_dev_get_first_match_name(const char *hid, const char *uid, s64 hrv)
 | 
					acpi_dev_get_first_match_name(const char *hid, const char *uid, s64 hrv)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -91,6 +91,9 @@ acpi_evaluate_dsm_typed(acpi_handle handle, const guid_t *guid, u64 rev,
 | 
				
			||||||
bool acpi_dev_found(const char *hid);
 | 
					bool acpi_dev_found(const char *hid);
 | 
				
			||||||
bool acpi_dev_present(const char *hid, const char *uid, s64 hrv);
 | 
					bool acpi_dev_present(const char *hid, const char *uid, s64 hrv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct acpi_device *
 | 
				
			||||||
 | 
					acpi_dev_get_first_match_dev(const char *hid, const char *uid, s64 hrv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const char *
 | 
					const char *
 | 
				
			||||||
acpi_dev_get_first_match_name(const char *hid, const char *uid, s64 hrv);
 | 
					acpi_dev_get_first_match_name(const char *hid, const char *uid, s64 hrv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -669,6 +669,12 @@ static inline bool acpi_dev_present(const char *hid, const char *uid, s64 hrv)
 | 
				
			||||||
	return false;
 | 
						return false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline struct acpi_device *
 | 
				
			||||||
 | 
					acpi_dev_get_first_match_dev(const char *hid, const char *uid, s64 hrv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline const char *
 | 
					static inline const char *
 | 
				
			||||||
acpi_dev_get_first_match_name(const char *hid, const char *uid, s64 hrv)
 | 
					acpi_dev_get_first_match_name(const char *hid, const char *uid, s64 hrv)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue