aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/sony_acpi.c
diff options
context:
space:
mode:
authorAlessandro Guido <alessandro.guido@gmail.com>2007-01-13 17:04:34 -0500
committerLen Brown <len.brown@intel.com>2007-02-13 03:05:35 -0500
commit50f62afb114ffcf052cf07d4b49b2d148b749955 (patch)
treee0db235d30af047359a2219faa21e24e91f098ba /drivers/acpi/sony_acpi.c
parentfac3506100c19391bc5474084dd838f0fb87bf26 (diff)
sony_acpi: Add backlight support to the sony_acpi
Make the sony_acpi use the backlight subsystem to adjust brightness value instead of using the /proc/sony/brightness file. (Other settings will still have a /proc/sony/... entry) Signed-off-by: Alessandro Guido <alessandro.guido@gmail.com> Cc: Stelian Pop <stelian@popies.net> Cc: Richard Purdie <rpurdie@rpsys.net> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Mattia Dongili <malattia@linux.it> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/sony_acpi.c')
-rw-r--r--drivers/acpi/sony_acpi.c59
1 files changed, 47 insertions, 12 deletions
diff --git a/drivers/acpi/sony_acpi.c b/drivers/acpi/sony_acpi.c
index f323c2c40a11..d509468a58a2 100644
--- a/drivers/acpi/sony_acpi.c
+++ b/drivers/acpi/sony_acpi.c
@@ -27,13 +27,19 @@
27#include <linux/moduleparam.h> 27#include <linux/moduleparam.h>
28#include <linux/init.h> 28#include <linux/init.h>
29#include <linux/types.h> 29#include <linux/types.h>
30#include <linux/backlight.h>
31#include <linux/err.h>
30#include <acpi/acpi_drivers.h> 32#include <acpi/acpi_drivers.h>
31#include <acpi/acpi_bus.h> 33#include <acpi/acpi_bus.h>
32#include <asm/uaccess.h> 34#include <asm/uaccess.h>
33 35
34#define ACPI_SNC_CLASS "sony" 36#define ACPI_SNC_CLASS "sony"
35#define ACPI_SNC_HID "SNY5001" 37#define ACPI_SNC_HID "SNY5001"
36#define ACPI_SNC_DRIVER_NAME "ACPI Sony Notebook Control Driver v0.2" 38#define ACPI_SNC_DRIVER_NAME "ACPI Sony Notebook Control Driver v0.3"
39
40/* the device uses 1-based values, while the backlight subsystem uses
41 0-based values */
42#define SONY_MAX_BRIGHTNESS 8
37 43
38#define LOG_PFX KERN_WARNING "sony_acpi: " 44#define LOG_PFX KERN_WARNING "sony_acpi: "
39 45
@@ -49,6 +55,16 @@ MODULE_PARM_DESC(debug, "set this to 1 (and RTFM) if you want to help "
49static acpi_handle sony_acpi_handle; 55static acpi_handle sony_acpi_handle;
50static struct proc_dir_entry *sony_acpi_dir; 56static struct proc_dir_entry *sony_acpi_dir;
51 57
58static int sony_backlight_update_status(struct backlight_device *bd);
59static int sony_backlight_get_brightness(struct backlight_device *bd);
60static struct backlight_device *sony_backlight_device;
61static struct backlight_properties sony_backlight_properties = {
62 .owner = THIS_MODULE,
63 .update_status = sony_backlight_update_status,
64 .get_brightness = sony_backlight_get_brightness,
65 .max_brightness = SONY_MAX_BRIGHTNESS - 1,
66};
67
52static struct sony_acpi_value { 68static struct sony_acpi_value {
53 char *name; /* name of the entry */ 69 char *name; /* name of the entry */
54 struct proc_dir_entry *proc; /* /proc entry */ 70 struct proc_dir_entry *proc; /* /proc entry */
@@ -61,19 +77,11 @@ static struct sony_acpi_value {
61 int debug; /* active only in debug mode ? */ 77 int debug; /* active only in debug mode ? */
62} sony_acpi_values[] = { 78} sony_acpi_values[] = {
63 { 79 {
64 .name = "brightness",
65 .acpiget = "GBRT",
66 .acpiset = "SBRT",
67 .min = 1,
68 .max = 8,
69 .debug = 0,
70 },
71 {
72 .name = "brightness_default", 80 .name = "brightness_default",
73 .acpiget = "GPBR", 81 .acpiget = "GPBR",
74 .acpiset = "SPBR", 82 .acpiset = "SPBR",
75 .min = 1, 83 .min = 1,
76 .max = 8, 84 .max = SONY_MAX_BRIGHTNESS,
77 .debug = 0, 85 .debug = 0,
78 }, 86 },
79 { 87 {
@@ -276,6 +284,7 @@ static int sony_acpi_add(struct acpi_device *device)
276{ 284{
277 acpi_status status; 285 acpi_status status;
278 int result; 286 int result;
287 acpi_handle handle;
279 struct sony_acpi_value *item; 288 struct sony_acpi_value *item;
280 289
281 sony_acpi_handle = device->handle; 290 sony_acpi_handle = device->handle;
@@ -303,9 +312,15 @@ static int sony_acpi_add(struct acpi_device *device)
303 } 312 }
304 } 313 }
305 314
306 for (item = sony_acpi_values; item->name; ++item) { 315 if (ACPI_SUCCESS(acpi_get_handle(sony_acpi_handle, "GBRT", &handle))) {
307 acpi_handle handle; 316 sony_backlight_device = backlight_device_register("sony", NULL,
317 &sony_backlight_properties);
318 if (IS_ERR(sony_backlight_device)) {
319 printk(LOG_PFX "unable to register backlight device\n");
320 }
321 }
308 322
323 for (item = sony_acpi_values; item->name; ++item) {
309 if (!debug && item->debug) 324 if (!debug && item->debug)
310 continue; 325 continue;
311 326
@@ -358,6 +373,9 @@ static int sony_acpi_remove(struct acpi_device *device, int type)
358 acpi_status status; 373 acpi_status status;
359 struct sony_acpi_value *item; 374 struct sony_acpi_value *item;
360 375
376 if (sony_backlight_device)
377 backlight_device_unregister(sony_backlight_device);
378
361 if (debug) { 379 if (debug) {
362 status = acpi_remove_notify_handler(sony_acpi_handle, 380 status = acpi_remove_notify_handler(sony_acpi_handle,
363 ACPI_DEVICE_NOTIFY, 381 ACPI_DEVICE_NOTIFY,
@@ -375,6 +393,23 @@ static int sony_acpi_remove(struct acpi_device *device, int type)
375 return 0; 393 return 0;
376} 394}
377 395
396static int sony_backlight_update_status(struct backlight_device *bd)
397{
398 return acpi_callsetfunc(sony_acpi_handle, "SBRT",
399 bd->props->brightness + 1,
400 NULL);
401}
402
403static int sony_backlight_get_brightness(struct backlight_device *bd)
404{
405 int value;
406
407 if (acpi_callgetfunc(sony_acpi_handle, "GBRT", &value))
408 return 0;
409 /* brightness levels are 1-based, while backlight ones are 0-based */
410 return value - 1;
411}
412
378static struct acpi_driver sony_acpi_driver = { 413static struct acpi_driver sony_acpi_driver = {
379 .name = ACPI_SNC_DRIVER_NAME, 414 .name = ACPI_SNC_DRIVER_NAME,
380 .class = ACPI_SNC_CLASS, 415 .class = ACPI_SNC_CLASS,