ACPI/video: export acpi_video_get_levels
The acpi_video_get_levels is useful for other drivers, i.e. the to-be-added int3406 thermal driver, so export it. Signed-off-by: Aaron Lu <aaron.lu@intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
		
							parent
							
								
									01c3664de6
								
							
						
					
					
						commit
						059500940d
					
				| @ -191,19 +191,6 @@ struct acpi_video_device_cap { | |||||||
| 	u8 _DDC:1;		/* Return the EDID for this device */ | 	u8 _DDC:1;		/* Return the EDID for this device */ | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct acpi_video_brightness_flags { |  | ||||||
| 	u8 _BCL_no_ac_battery_levels:1;	/* no AC/Battery levels in _BCL */ |  | ||||||
| 	u8 _BCL_reversed:1;		/* _BCL package is in a reversed order */ |  | ||||||
| 	u8 _BQC_use_index:1;		/* _BQC returns an index value */ |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| struct acpi_video_device_brightness { |  | ||||||
| 	int curr; |  | ||||||
| 	int count; |  | ||||||
| 	int *levels; |  | ||||||
| 	struct acpi_video_brightness_flags flags; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| struct acpi_video_device { | struct acpi_video_device { | ||||||
| 	unsigned long device_id; | 	unsigned long device_id; | ||||||
| 	struct acpi_video_device_flags flags; | 	struct acpi_video_device_flags flags; | ||||||
| @ -325,7 +312,7 @@ static const struct thermal_cooling_device_ops video_cooling_ops = { | |||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| static int | static int | ||||||
| acpi_video_device_lcd_query_levels(struct acpi_video_device *device, | acpi_video_device_lcd_query_levels(acpi_handle handle, | ||||||
| 				   union acpi_object **levels) | 				   union acpi_object **levels) | ||||||
| { | { | ||||||
| 	int status; | 	int status; | ||||||
| @ -335,7 +322,7 @@ acpi_video_device_lcd_query_levels(struct acpi_video_device *device, | |||||||
| 
 | 
 | ||||||
| 	*levels = NULL; | 	*levels = NULL; | ||||||
| 
 | 
 | ||||||
| 	status = acpi_evaluate_object(device->dev->handle, "_BCL", NULL, &buffer); | 	status = acpi_evaluate_object(handle, "_BCL", NULL, &buffer); | ||||||
| 	if (!ACPI_SUCCESS(status)) | 	if (!ACPI_SUCCESS(status)) | ||||||
| 		return status; | 		return status; | ||||||
| 	obj = (union acpi_object *)buffer.pointer; | 	obj = (union acpi_object *)buffer.pointer; | ||||||
| @ -766,36 +753,28 @@ static int acpi_video_bqc_quirk(struct acpi_video_device *device, | |||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | int acpi_video_get_levels(struct acpi_device *device, | ||||||
| /*
 | 			  struct acpi_video_device_brightness **dev_br) | ||||||
|  *  Arg: |  | ||||||
|  *	device	: video output device (LCD, CRT, ..) |  | ||||||
|  * |  | ||||||
|  *  Return Value: |  | ||||||
|  *	Maximum brightness level |  | ||||||
|  * |  | ||||||
|  *  Allocate and initialize device->brightness. |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| static int |  | ||||||
| acpi_video_init_brightness(struct acpi_video_device *device) |  | ||||||
| { | { | ||||||
| 	union acpi_object *obj = NULL; | 	union acpi_object *obj = NULL; | ||||||
| 	int i, max_level = 0, count = 0, level_ac_battery = 0; | 	int i, max_level = 0, count = 0, level_ac_battery = 0; | ||||||
| 	unsigned long long level, level_old; |  | ||||||
| 	union acpi_object *o; | 	union acpi_object *o; | ||||||
| 	struct acpi_video_device_brightness *br = NULL; | 	struct acpi_video_device_brightness *br = NULL; | ||||||
| 	int result = -EINVAL; | 	int result = 0; | ||||||
| 	u32 value; | 	u32 value; | ||||||
| 
 | 
 | ||||||
| 	if (!ACPI_SUCCESS(acpi_video_device_lcd_query_levels(device, &obj))) { | 	if (!ACPI_SUCCESS(acpi_video_device_lcd_query_levels(device->handle, | ||||||
|  | 								&obj))) { | ||||||
| 		ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Could not query available " | 		ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Could not query available " | ||||||
| 						"LCD brightness level\n")); | 						"LCD brightness level\n")); | ||||||
|  | 		result = -ENODEV; | ||||||
| 		goto out; | 		goto out; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (obj->package.count < 2) | 	if (obj->package.count < 2) { | ||||||
|  | 		result = -EINVAL; | ||||||
| 		goto out; | 		goto out; | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	br = kzalloc(sizeof(*br), GFP_KERNEL); | 	br = kzalloc(sizeof(*br), GFP_KERNEL); | ||||||
| 	if (!br) { | 	if (!br) { | ||||||
| @ -861,6 +840,38 @@ acpi_video_init_brightness(struct acpi_video_device *device) | |||||||
| 			    "Found unordered _BCL package")); | 			    "Found unordered _BCL package")); | ||||||
| 
 | 
 | ||||||
| 	br->count = count; | 	br->count = count; | ||||||
|  | 	*dev_br = br; | ||||||
|  | 
 | ||||||
|  | out: | ||||||
|  | 	kfree(obj); | ||||||
|  | 	return result; | ||||||
|  | out_free: | ||||||
|  | 	kfree(br); | ||||||
|  | 	goto out; | ||||||
|  | } | ||||||
|  | EXPORT_SYMBOL(acpi_video_get_levels); | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  *  Arg: | ||||||
|  |  *	device	: video output device (LCD, CRT, ..) | ||||||
|  |  * | ||||||
|  |  *  Return Value: | ||||||
|  |  *	Maximum brightness level | ||||||
|  |  * | ||||||
|  |  *  Allocate and initialize device->brightness. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | static int | ||||||
|  | acpi_video_init_brightness(struct acpi_video_device *device) | ||||||
|  | { | ||||||
|  | 	int i, max_level = 0; | ||||||
|  | 	unsigned long long level, level_old; | ||||||
|  | 	struct acpi_video_device_brightness *br = NULL; | ||||||
|  | 	int result = -EINVAL; | ||||||
|  | 
 | ||||||
|  | 	result = acpi_video_get_levels(device->dev, &br); | ||||||
|  | 	if (result) | ||||||
|  | 		return result; | ||||||
| 	device->brightness = br; | 	device->brightness = br; | ||||||
| 
 | 
 | ||||||
| 	/* _BQC uses INDEX while _BCL uses VALUE in some laptops */ | 	/* _BQC uses INDEX while _BCL uses VALUE in some laptops */ | ||||||
| @ -903,17 +914,13 @@ set_level: | |||||||
| 		goto out_free_levels; | 		goto out_free_levels; | ||||||
| 
 | 
 | ||||||
| 	ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 	ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||||||
| 			  "found %d brightness levels\n", count - 2)); | 			  "found %d brightness levels\n", br->count - 2)); | ||||||
| 	kfree(obj); | 	return 0; | ||||||
| 	return result; |  | ||||||
| 
 | 
 | ||||||
| out_free_levels: | out_free_levels: | ||||||
| 	kfree(br->levels); | 	kfree(br->levels); | ||||||
| out_free: |  | ||||||
| 	kfree(br); | 	kfree(br); | ||||||
| out: |  | ||||||
| 	device->brightness = NULL; | 	device->brightness = NULL; | ||||||
| 	kfree(obj); |  | ||||||
| 	return result; | 	return result; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -4,6 +4,19 @@ | |||||||
| #include <linux/errno.h> /* for ENODEV */ | #include <linux/errno.h> /* for ENODEV */ | ||||||
| #include <linux/types.h> /* for bool */ | #include <linux/types.h> /* for bool */ | ||||||
| 
 | 
 | ||||||
|  | struct acpi_video_brightness_flags { | ||||||
|  | 	u8 _BCL_no_ac_battery_levels:1;	/* no AC/Battery levels in _BCL */ | ||||||
|  | 	u8 _BCL_reversed:1;		/* _BCL package is in a reversed order */ | ||||||
|  | 	u8 _BQC_use_index:1;		/* _BQC returns an index value */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct acpi_video_device_brightness { | ||||||
|  | 	int curr; | ||||||
|  | 	int count; | ||||||
|  | 	int *levels; | ||||||
|  | 	struct acpi_video_brightness_flags flags; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| struct acpi_device; | struct acpi_device; | ||||||
| 
 | 
 | ||||||
| #define ACPI_VIDEO_CLASS	"video" | #define ACPI_VIDEO_CLASS	"video" | ||||||
| @ -37,6 +50,8 @@ extern void acpi_video_set_dmi_backlight_type(enum acpi_backlight_type type); | |||||||
|  * may change over time and should not be cached. |  * may change over time and should not be cached. | ||||||
|  */ |  */ | ||||||
| extern bool acpi_video_handles_brightness_key_presses(void); | extern bool acpi_video_handles_brightness_key_presses(void); | ||||||
|  | extern int acpi_video_get_levels(struct acpi_device *device, | ||||||
|  | 				 struct acpi_video_device_brightness **dev_br); | ||||||
| #else | #else | ||||||
| static inline int acpi_video_register(void) { return 0; } | static inline int acpi_video_register(void) { return 0; } | ||||||
| static inline void acpi_video_unregister(void) { return; } | static inline void acpi_video_unregister(void) { return; } | ||||||
| @ -56,6 +71,11 @@ static inline bool acpi_video_handles_brightness_key_presses(void) | |||||||
| { | { | ||||||
| 	return false; | 	return false; | ||||||
| } | } | ||||||
|  | static int acpi_video_get_levels(struct acpi_device *device, | ||||||
|  | 			struct acpi_video_device_brightness **dev_br) | ||||||
|  | { | ||||||
|  | 	return -ENODEV; | ||||||
|  | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user