[PATCH] acpi: brightness: use /sys/class/backlight interface (LP: #1250517)

Colin King colin.king at canonical.com
Tue Nov 12 15:31:05 UTC 2013


From: Colin Ian King <colin.king at canonical.com>

Use /sys/class/backlight and fall back to use the older
/sys/devices/virtual/backlight if the former is not available for
older releases.

Signed-off-by: Colin Ian King <colin.king at canonical.com>
---
 src/acpi/brightness/brightness.c | 62 +++++++++++++++++++++++-----------------
 1 file changed, 36 insertions(+), 26 deletions(-)

diff --git a/src/acpi/brightness/brightness.c b/src/acpi/brightness/brightness.c
index 8853979..fd333d5 100644
--- a/src/acpi/brightness/brightness.c
+++ b/src/acpi/brightness/brightness.c
@@ -29,28 +29,41 @@
 #include <limits.h>
 #include <dirent.h>
 
-static DIR *brightnessdir;
+static DIR *brightness_dir;
+static char *brightness_path;
 
 static int skip_tests = 0;
 
-#define BRIGHTNESS_PATH	"/sys/devices/virtual/backlight"
-
 static int brightness_init(fwts_framework *fw)
 {
-	if (!(brightnessdir = opendir(BRIGHTNESS_PATH))) {
-		fwts_failed(fw, LOG_LEVEL_LOW, "BacklightNoPath", "No %s directory available: cannot test.", BRIGHTNESS_PATH);
-		return FWTS_ERROR;
+	int i;
+	static char *sys_path[] = {
+		"/sys/class/backlight",
+		"/sys/devices/virtual/backlight",
+		NULL
+	};
+
+	brightness_path = NULL;
+	brightness_dir = NULL;
+
+	for (i = 0; sys_path[i]; i++) {
+		brightness_dir = opendir(sys_path[i]);
+		if (brightness_dir) {
+			brightness_path = sys_path[i];
+			return FWTS_OK;
+		}
 	}
 
-	return FWTS_OK;
+	fwts_failed(fw, LOG_LEVEL_LOW, "BacklightNoPath", "No sysfs backlight directory available: cannot test.");
+	return FWTS_ERROR;
 }
 
 static int brightness_deinit(fwts_framework *fw)
 {
 	FWTS_UNUSED(fw);
 
-	if (brightnessdir)
-		closedir(brightnessdir);
+	if (brightness_dir)
+		closedir(brightness_dir);
 
 	return FWTS_OK;
 }
@@ -60,7 +73,7 @@ static int get_setting(char *entry_name, char *setting, int *value)
 	char path[PATH_MAX];
 	FILE *fp;
 
-	snprintf(path, sizeof(path), BRIGHTNESS_PATH "/%s/%s", entry_name, setting);
+	snprintf(path, sizeof(path), "%s/%s/%s", brightness_path, entry_name, setting);
 	if ((fp = fopen(path, "r")) == NULL)
 		return -1;
 
@@ -79,7 +92,7 @@ static int set_setting(char *entry_name, char *setting, int value)
 	char path[PATH_MAX];
 	FILE *fp;
 
-	snprintf(path, sizeof(path), BRIGHTNESS_PATH "/%s/%s", entry_name, setting);
+	snprintf(path, sizeof(path), "%s/%s/%s", brightness_path, entry_name, setting);
 	if ((fp = fopen(path, "w")) == NULL)
 		return -1;
 
@@ -101,9 +114,9 @@ static int brightness_test1(fwts_framework *fw)
 
 	skip_tests = 1;
 
-	rewinddir(brightnessdir);
+	rewinddir(brightness_dir);
 	do {
-		entry = readdir(brightnessdir);
+		entry = readdir(brightness_dir);
 		if (entry && strlen(entry->d_name)>2) {
 			if (get_setting(entry->d_name, "max_brightness", &max_brightness) == FWTS_OK) {
 				if (max_brightness <= 0)
@@ -142,16 +155,15 @@ static int brightness_test2(fwts_framework *fw)
 		return FWTS_SKIP;
 	}
 
-	rewinddir(brightnessdir);
+	rewinddir(brightness_dir);
 	do {
-		entry = readdir(brightnessdir);
+		entry = readdir(brightness_dir);
 		if (entry && strlen(entry->d_name)>2) {
 			if (get_setting(entry->d_name, "max_brightness", &max_brightness) == FWTS_OK) {
 				if (max_brightness <= 0) {
 					fwts_failed(fw, LOG_LEVEL_HIGH, "BrightnessMaxTest2", "Maximum brightness for %s is %d and should be > 0.", entry->d_name, max_brightness);
 					continue;
 				}
-				
 				if (get_setting(entry->d_name, "actual_brightness", &saved_brightness) == FWTS_OK) {
 					int i;
 					int failed = 0;
@@ -194,16 +206,15 @@ static int brightness_test3(fwts_framework *fw)
 		return FWTS_SKIP;
 	}
 
-	rewinddir(brightnessdir);
+	rewinddir(brightness_dir);
 	do {
-		entry = readdir(brightnessdir);
+		entry = readdir(brightness_dir);
 		if (entry && strlen(entry->d_name)>2) {
 			if (get_setting(entry->d_name, "max_brightness", &max_brightness) == FWTS_OK) {
 				if (max_brightness <= 0) {
 					fwts_failed(fw, LOG_LEVEL_HIGH, "BrightnessMaxTest3", "Maximum brightness for %s is %d and should be > 0.", entry->d_name, max_brightness);
 					continue;
 				}
-				
 				if (get_setting(entry->d_name, "actual_brightness", &saved_brightness) == FWTS_OK) {
 					int ch;
 
@@ -246,9 +257,9 @@ static int brightness_test4(fwts_framework *fw)
 		return FWTS_SKIP;
 	}
 
-	rewinddir(brightnessdir);
+	rewinddir(brightness_dir);
 	do {
-		entry = readdir(brightnessdir);
+		entry = readdir(brightness_dir);
 		if (entry && strlen(entry->d_name)>2) {
 			if (get_setting(entry->d_name, "max_brightness", &max_brightness) == FWTS_OK) {
 				int i;
@@ -262,7 +273,7 @@ static int brightness_test4(fwts_framework *fw)
 				if (get_setting(entry->d_name, "actual_brightness", &saved_brightness) == FWTS_OK) {
 					long delay = 5000000/max_brightness;
 					int ch;
-		
+
 					if (delay > 1000000)
 						delay = 1000000;
 
@@ -301,7 +312,7 @@ static int brightness_wait_event(fwts_framework *fw)
 		fwts_log_error(fw, "Cannot connect to acpid.");
 		return FWTS_ERROR;
 	}
-	
+
 	for (i=0;i<=20;i++) {
 		if ((buffer = fwts_acpi_event_read(fd, &len, 1)) != NULL)
 			if (strstr(buffer, "video")) {
@@ -323,9 +334,9 @@ static int brightness_test5(fwts_framework *fw)
 	struct dirent *entry;
 	int saved_brightness;
 
-	rewinddir(brightnessdir);
+	rewinddir(brightness_dir);
 	do {
-		entry = readdir(brightnessdir);
+		entry = readdir(brightness_dir);
 		if (entry && strlen(entry->d_name)>2) {
 			if (get_setting(entry->d_name, "actual_brightness", &saved_brightness) != FWTS_OK) {
 				fwts_failed(fw, LOG_LEVEL_HIGH, "BrightnessNotExist", "Actual brightness could not be accessed for %s.", entry->d_name);
@@ -350,7 +361,6 @@ static int brightness_test5(fwts_framework *fw)
 				}
 
 				tmp = (saved_brightness > 0) ? saved_brightness : 1;
-					
 				set_setting(entry->d_name, "brightness", tmp);
 				fwts_printf(fw, "==== Press the brightness DOWN hotkey for %s ====\n", entry->d_name);
 
-- 
1.8.3.2




More information about the fwts-devel mailing list