forked from mirrors/linux
		
	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
					
				
					 2 changed files with 65 additions and 38 deletions
				
			
		|  | @ -191,19 +191,6 @@ struct acpi_video_device_cap { | |||
| 	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 { | ||||
| 	unsigned long device_id; | ||||
| 	struct acpi_video_device_flags flags; | ||||
|  | @ -325,7 +312,7 @@ static const struct thermal_cooling_device_ops video_cooling_ops = { | |||
|  */ | ||||
| 
 | ||||
| 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) | ||||
| { | ||||
| 	int status; | ||||
|  | @ -335,7 +322,7 @@ acpi_video_device_lcd_query_levels(struct acpi_video_device *device, | |||
| 
 | ||||
| 	*levels = NULL; | ||||
| 
 | ||||
| 	status = acpi_evaluate_object(device->dev->handle, "_BCL", NULL, &buffer); | ||||
| 	status = acpi_evaluate_object(handle, "_BCL", NULL, &buffer); | ||||
| 	if (!ACPI_SUCCESS(status)) | ||||
| 		return status; | ||||
| 	obj = (union acpi_object *)buffer.pointer; | ||||
|  | @ -766,36 +753,28 @@ static int acpi_video_bqc_quirk(struct acpi_video_device *device, | |||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
|  *  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 acpi_video_get_levels(struct acpi_device *device, | ||||
| 			  struct acpi_video_device_brightness **dev_br) | ||||
| { | ||||
| 	union acpi_object *obj = NULL; | ||||
| 	int i, max_level = 0, count = 0, level_ac_battery = 0; | ||||
| 	unsigned long long level, level_old; | ||||
| 	union acpi_object *o; | ||||
| 	struct acpi_video_device_brightness *br = NULL; | ||||
| 	int result = -EINVAL; | ||||
| 	int result = 0; | ||||
| 	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 " | ||||
| 						"LCD brightness level\n")); | ||||
| 		result = -ENODEV; | ||||
| 		goto out; | ||||
| 	} | ||||
| 
 | ||||
| 	if (obj->package.count < 2) | ||||
| 	if (obj->package.count < 2) { | ||||
| 		result = -EINVAL; | ||||
| 		goto out; | ||||
| 	} | ||||
| 
 | ||||
| 	br = kzalloc(sizeof(*br), GFP_KERNEL); | ||||
| 	if (!br) { | ||||
|  | @ -861,6 +840,38 @@ acpi_video_init_brightness(struct acpi_video_device *device) | |||
| 			    "Found unordered _BCL package")); | ||||
| 
 | ||||
| 	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; | ||||
| 
 | ||||
| 	/* _BQC uses INDEX while _BCL uses VALUE in some laptops */ | ||||
|  | @ -903,17 +914,13 @@ acpi_video_init_brightness(struct acpi_video_device *device) | |||
| 		goto out_free_levels; | ||||
| 
 | ||||
| 	ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||||
| 			  "found %d brightness levels\n", count - 2)); | ||||
| 	kfree(obj); | ||||
| 	return result; | ||||
| 			  "found %d brightness levels\n", br->count - 2)); | ||||
| 	return 0; | ||||
| 
 | ||||
| out_free_levels: | ||||
| 	kfree(br->levels); | ||||
| out_free: | ||||
| 	kfree(br); | ||||
| out: | ||||
| 	device->brightness = NULL; | ||||
| 	kfree(obj); | ||||
| 	return result; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -4,6 +4,19 @@ | |||
| #include <linux/errno.h> /* for ENODEV */ | ||||
| #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; | ||||
| 
 | ||||
| #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. | ||||
|  */ | ||||
| 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 | ||||
| static inline int acpi_video_register(void) { return 0; } | ||||
| static inline void acpi_video_unregister(void) { return; } | ||||
|  | @ -56,6 +71,11 @@ static inline bool acpi_video_handles_brightness_key_presses(void) | |||
| { | ||||
| 	return false; | ||||
| } | ||||
| static int acpi_video_get_levels(struct acpi_device *device, | ||||
| 			struct acpi_video_device_brightness **dev_br) | ||||
| { | ||||
| 	return -ENODEV; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Aaron Lu
						Aaron Lu