Commit 48445159 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for_linus' of git://cavan.codon.org.uk/platform-drivers-x86

Pull x86 platform driver updates from Matthew Garrett:
 "Some significant improvements for the Sony driver on newer machines,
  but other than that mostly just minor fixes and a patch to remove the
  broken rfkill code from the Dell driver."

* 'for_linus' of git://cavan.codon.org.uk/platform-drivers-x86: (35 commits)
  apple-gmux: Fix up the suspend/resume patch
  dell-laptop: Remove rfkill code
  toshiba_acpi: Fix mis-merge
  dell-laptop: Add touchpad led support for Dell V3450
  acer-wmi: add 3 laptops to video backlight vendor mode quirk table
  sony-laptop: add touchpad enable/disable function
  sony-laptop: add missing Fn key combos for 0x100 handlers
  sony-laptop: add support for more WWAN modems
  sony-laptop: new keyboard backlight handle
  sony-laptop: add high speed battery charging function
  sony-laptop: support automatic resume on lid open
  sony-laptop: adjust error handling in finding SNC handles
  sony-laptop: add thermal profiles support
  sony-laptop: support battery care functions
  sony-laptop: additional debug statements
  sony-laptop: improve SNC initialization and acpi notify callback code
  sony-laptop: use kstrtoul to parse sysfs values
  sony-laptop: generalise ACPI calls into SNC functions
  sony-laptop: fix return path when no ACPI buffer is allocated
  sony-laptop: use soft rfkill status stored in hw
  ...
parents af4f8ba3 a2f01a89
...@@ -523,6 +523,30 @@ static const struct dmi_system_id video_vendor_dmi_table[] = { ...@@ -523,6 +523,30 @@ static const struct dmi_system_id video_vendor_dmi_table[] = {
DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 4750"), DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 4750"),
}, },
}, },
{
.callback = video_set_backlight_video_vendor,
.ident = "Acer Extensa 5235",
.matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
DMI_MATCH(DMI_PRODUCT_NAME, "Extensa 5235"),
},
},
{
.callback = video_set_backlight_video_vendor,
.ident = "Acer TravelMate 5760",
.matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 5760"),
},
},
{
.callback = video_set_backlight_video_vendor,
.ident = "Acer Aspire 5750",
.matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5750"),
},
},
{} {}
}; };
......
...@@ -87,6 +87,9 @@ static int gmux_update_status(struct backlight_device *bd) ...@@ -87,6 +87,9 @@ static int gmux_update_status(struct backlight_device *bd)
struct apple_gmux_data *gmux_data = bl_get_data(bd); struct apple_gmux_data *gmux_data = bl_get_data(bd);
u32 brightness = bd->props.brightness; u32 brightness = bd->props.brightness;
if (bd->props.state & BL_CORE_SUSPENDED)
return 0;
/* /*
* Older gmux versions require writing out lower bytes first then * Older gmux versions require writing out lower bytes first then
* setting the upper byte to 0 to flush the values. Newer versions * setting the upper byte to 0 to flush the values. Newer versions
...@@ -102,6 +105,7 @@ static int gmux_update_status(struct backlight_device *bd) ...@@ -102,6 +105,7 @@ static int gmux_update_status(struct backlight_device *bd)
} }
static const struct backlight_ops gmux_bl_ops = { static const struct backlight_ops gmux_bl_ops = {
.options = BL_CORE_SUSPENDRESUME,
.get_brightness = gmux_get_brightness, .get_brightness = gmux_get_brightness,
.update_status = gmux_update_status, .update_status = gmux_update_status,
}; };
......
This diff is collapsed.
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
* 59 Temple Place Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place Suite 330, Boston, MA 02111-1307, USA.
*/ */
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -34,7 +36,8 @@ ...@@ -34,7 +36,8 @@
#define ACPI_FUJITSU_CLASS "fujitsu" #define ACPI_FUJITSU_CLASS "fujitsu"
#define INVERT_TABLET_MODE_BIT 0x01 #define INVERT_TABLET_MODE_BIT 0x01
#define FORCE_TABLET_MODE_IF_UNDOCK 0x02 #define INVERT_DOCK_STATE_BIT 0x02
#define FORCE_TABLET_MODE_IF_UNDOCK 0x04
#define KEYMAP_LEN 16 #define KEYMAP_LEN 16
...@@ -161,6 +164,8 @@ static void fujitsu_send_state(void) ...@@ -161,6 +164,8 @@ static void fujitsu_send_state(void)
state = fujitsu_read_register(0xdd); state = fujitsu_read_register(0xdd);
dock = state & 0x02; dock = state & 0x02;
if (fujitsu.config.quirks & INVERT_DOCK_STATE_BIT)
dock = !dock;
if ((fujitsu.config.quirks & FORCE_TABLET_MODE_IF_UNDOCK) && (!dock)) { if ((fujitsu.config.quirks & FORCE_TABLET_MODE_IF_UNDOCK) && (!dock)) {
tablet_mode = 1; tablet_mode = 1;
...@@ -221,9 +226,6 @@ static int __devinit input_fujitsu_setup(struct device *parent, ...@@ -221,9 +226,6 @@ static int __devinit input_fujitsu_setup(struct device *parent,
input_set_capability(idev, EV_SW, SW_DOCK); input_set_capability(idev, EV_SW, SW_DOCK);
input_set_capability(idev, EV_SW, SW_TABLET_MODE); input_set_capability(idev, EV_SW, SW_TABLET_MODE);
input_set_capability(idev, EV_SW, SW_DOCK);
input_set_capability(idev, EV_SW, SW_TABLET_MODE);
error = input_register_device(idev); error = input_register_device(idev);
if (error) { if (error) {
input_free_device(idev); input_free_device(idev);
...@@ -275,25 +277,31 @@ static irqreturn_t fujitsu_interrupt(int irq, void *dev_id) ...@@ -275,25 +277,31 @@ static irqreturn_t fujitsu_interrupt(int irq, void *dev_id)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int __devinit fujitsu_dmi_default(const struct dmi_system_id *dmi) static void __devinit fujitsu_dmi_common(const struct dmi_system_id *dmi)
{ {
printk(KERN_INFO MODULENAME ": %s\n", dmi->ident); pr_info("%s\n", dmi->ident);
memcpy(fujitsu.config.keymap, dmi->driver_data, memcpy(fujitsu.config.keymap, dmi->driver_data,
sizeof(fujitsu.config.keymap)); sizeof(fujitsu.config.keymap));
}
static int __devinit fujitsu_dmi_lifebook(const struct dmi_system_id *dmi)
{
fujitsu_dmi_common(dmi);
fujitsu.config.quirks |= INVERT_TABLET_MODE_BIT;
return 1; return 1;
} }
static int __devinit fujitsu_dmi_stylistic(const struct dmi_system_id *dmi) static int __devinit fujitsu_dmi_stylistic(const struct dmi_system_id *dmi)
{ {
fujitsu_dmi_default(dmi); fujitsu_dmi_common(dmi);
fujitsu.config.quirks |= FORCE_TABLET_MODE_IF_UNDOCK; fujitsu.config.quirks |= FORCE_TABLET_MODE_IF_UNDOCK;
fujitsu.config.quirks |= INVERT_TABLET_MODE_BIT; fujitsu.config.quirks |= INVERT_DOCK_STATE_BIT;
return 1; return 1;
} }
static struct dmi_system_id dmi_ids[] __initconst = { static struct dmi_system_id dmi_ids[] __initconst = {
{ {
.callback = fujitsu_dmi_default, .callback = fujitsu_dmi_lifebook,
.ident = "Fujitsu Siemens P/T Series", .ident = "Fujitsu Siemens P/T Series",
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
...@@ -302,7 +310,7 @@ static struct dmi_system_id dmi_ids[] __initconst = { ...@@ -302,7 +310,7 @@ static struct dmi_system_id dmi_ids[] __initconst = {
.driver_data = keymap_Lifebook_Tseries .driver_data = keymap_Lifebook_Tseries
}, },
{ {
.callback = fujitsu_dmi_default, .callback = fujitsu_dmi_lifebook,
.ident = "Fujitsu Lifebook T Series", .ident = "Fujitsu Lifebook T Series",
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
...@@ -320,7 +328,7 @@ static struct dmi_system_id dmi_ids[] __initconst = { ...@@ -320,7 +328,7 @@ static struct dmi_system_id dmi_ids[] __initconst = {
.driver_data = keymap_Stylistic_Tseries .driver_data = keymap_Stylistic_Tseries
}, },
{ {
.callback = fujitsu_dmi_default, .callback = fujitsu_dmi_lifebook,
.ident = "Fujitsu LifeBook U810", .ident = "Fujitsu LifeBook U810",
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
...@@ -347,7 +355,7 @@ static struct dmi_system_id dmi_ids[] __initconst = { ...@@ -347,7 +355,7 @@ static struct dmi_system_id dmi_ids[] __initconst = {
.driver_data = keymap_Stylistic_ST5xxx .driver_data = keymap_Stylistic_ST5xxx
}, },
{ {
.callback = fujitsu_dmi_default, .callback = fujitsu_dmi_lifebook,
.ident = "Unknown (using defaults)", .ident = "Unknown (using defaults)",
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, ""), DMI_MATCH(DMI_SYS_VENDOR, ""),
...@@ -473,6 +481,6 @@ module_exit(fujitsu_module_exit); ...@@ -473,6 +481,6 @@ module_exit(fujitsu_module_exit);
MODULE_AUTHOR("Robert Gerlach <khnz@gmx.de>"); MODULE_AUTHOR("Robert Gerlach <khnz@gmx.de>");
MODULE_DESCRIPTION("Fujitsu tablet pc extras driver"); MODULE_DESCRIPTION("Fujitsu tablet pc extras driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_VERSION("2.4"); MODULE_VERSION("2.5");
MODULE_DEVICE_TABLE(acpi, fujitsu_ids); MODULE_DEVICE_TABLE(acpi, fujitsu_ids);
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* hdaps.c - driver for IBM's Hard Drive Active Protection System * hdaps.c - driver for IBM's Hard Drive Active Protection System
* *
* Copyright (C) 2005 Robert Love <rml@novell.com> * Copyright (C) 2005 Robert Love <rml@novell.com>
* Copyright (C) 2005 Jesper Juhl <jesper.juhl@gmail.com> * Copyright (C) 2005 Jesper Juhl <jj@chaosbits.net>
* *
* The HardDisk Active Protection System (hdaps) is present in IBM ThinkPads * The HardDisk Active Protection System (hdaps) is present in IBM ThinkPads
* starting with the R40, T41, and X40. It provides a basic two-axis * starting with the R40, T41, and X40. It provides a basic two-axis
......
...@@ -634,6 +634,8 @@ static int __devinit hp_wmi_rfkill_setup(struct platform_device *device) ...@@ -634,6 +634,8 @@ static int __devinit hp_wmi_rfkill_setup(struct platform_device *device)
RFKILL_TYPE_WLAN, RFKILL_TYPE_WLAN,
&hp_wmi_rfkill_ops, &hp_wmi_rfkill_ops,
(void *) HPWMI_WIFI); (void *) HPWMI_WIFI);
if (!wifi_rfkill)
return -ENOMEM;
rfkill_init_sw_state(wifi_rfkill, rfkill_init_sw_state(wifi_rfkill,
hp_wmi_get_sw_state(HPWMI_WIFI)); hp_wmi_get_sw_state(HPWMI_WIFI));
rfkill_set_hw_state(wifi_rfkill, rfkill_set_hw_state(wifi_rfkill,
...@@ -648,6 +650,10 @@ static int __devinit hp_wmi_rfkill_setup(struct platform_device *device) ...@@ -648,6 +650,10 @@ static int __devinit hp_wmi_rfkill_setup(struct platform_device *device)
RFKILL_TYPE_BLUETOOTH, RFKILL_TYPE_BLUETOOTH,
&hp_wmi_rfkill_ops, &hp_wmi_rfkill_ops,
(void *) HPWMI_BLUETOOTH); (void *) HPWMI_BLUETOOTH);
if (!bluetooth_rfkill) {
err = -ENOMEM;
goto register_wifi_error;
}
rfkill_init_sw_state(bluetooth_rfkill, rfkill_init_sw_state(bluetooth_rfkill,
hp_wmi_get_sw_state(HPWMI_BLUETOOTH)); hp_wmi_get_sw_state(HPWMI_BLUETOOTH));
rfkill_set_hw_state(bluetooth_rfkill, rfkill_set_hw_state(bluetooth_rfkill,
...@@ -662,6 +668,10 @@ static int __devinit hp_wmi_rfkill_setup(struct platform_device *device) ...@@ -662,6 +668,10 @@ static int __devinit hp_wmi_rfkill_setup(struct platform_device *device)
RFKILL_TYPE_WWAN, RFKILL_TYPE_WWAN,
&hp_wmi_rfkill_ops, &hp_wmi_rfkill_ops,
(void *) HPWMI_WWAN); (void *) HPWMI_WWAN);
if (!wwan_rfkill) {
err = -ENOMEM;
goto register_bluetooth_error;
}
rfkill_init_sw_state(wwan_rfkill, rfkill_init_sw_state(wwan_rfkill,
hp_wmi_get_sw_state(HPWMI_WWAN)); hp_wmi_get_sw_state(HPWMI_WWAN));
rfkill_set_hw_state(wwan_rfkill, rfkill_set_hw_state(wwan_rfkill,
......
...@@ -194,7 +194,6 @@ static int write_ec_cmd(acpi_handle handle, int cmd, unsigned long data) ...@@ -194,7 +194,6 @@ static int write_ec_cmd(acpi_handle handle, int cmd, unsigned long data)
/* /*
* debugfs * debugfs
*/ */
#define DEBUGFS_EVENT_LEN (4096)
static int debugfs_status_show(struct seq_file *s, void *data) static int debugfs_status_show(struct seq_file *s, void *data)
{ {
unsigned long value; unsigned long value;
...@@ -315,7 +314,7 @@ static int __devinit ideapad_debugfs_init(struct ideapad_private *priv) ...@@ -315,7 +314,7 @@ static int __devinit ideapad_debugfs_init(struct ideapad_private *priv)
node = debugfs_create_file("status", S_IRUGO, priv->debug, NULL, node = debugfs_create_file("status", S_IRUGO, priv->debug, NULL,
&debugfs_status_fops); &debugfs_status_fops);
if (!node) { if (!node) {
pr_err("failed to create event in debugfs"); pr_err("failed to create status in debugfs");
goto errout; goto errout;
} }
...@@ -785,6 +784,10 @@ static void ideapad_acpi_notify(struct acpi_device *adevice, u32 event) ...@@ -785,6 +784,10 @@ static void ideapad_acpi_notify(struct acpi_device *adevice, u32 event)
case 9: case 9:
ideapad_sync_rfk_state(priv); ideapad_sync_rfk_state(priv);
break; break;
case 13:
case 6:
ideapad_input_report(priv, vpc_bit);
break;
case 4: case 4:
ideapad_backlight_notify_brightness(priv); ideapad_backlight_notify_brightness(priv);
break; break;
...@@ -795,7 +798,7 @@ static void ideapad_acpi_notify(struct acpi_device *adevice, u32 event) ...@@ -795,7 +798,7 @@ static void ideapad_acpi_notify(struct acpi_device *adevice, u32 event)
ideapad_backlight_notify_power(priv); ideapad_backlight_notify_power(priv);
break; break;
default: default:
ideapad_input_report(priv, vpc_bit); pr_info("Unknown event: %lu\n", vpc_bit);
} }
} }
} }
......
This diff is collapsed.
...@@ -3402,7 +3402,7 @@ static int __init hotkey_init(struct ibm_init_struct *iibm) ...@@ -3402,7 +3402,7 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)
/* Do not issue duplicate brightness change events to /* Do not issue duplicate brightness change events to
* userspace. tpacpi_detect_brightness_capabilities() must have * userspace. tpacpi_detect_brightness_capabilities() must have
* been called before this point */ * been called before this point */
if (tp_features.bright_acpimode && acpi_video_backlight_support()) { if (acpi_video_backlight_support()) {
pr_info("This ThinkPad has standard ACPI backlight " pr_info("This ThinkPad has standard ACPI backlight "
"brightness control, supported by the ACPI " "brightness control, supported by the ACPI "
"video driver\n"); "video driver\n");
......
...@@ -95,6 +95,7 @@ MODULE_LICENSE("GPL"); ...@@ -95,6 +95,7 @@ MODULE_LICENSE("GPL");
/* registers */ /* registers */
#define HCI_FAN 0x0004 #define HCI_FAN 0x0004
#define HCI_TR_BACKLIGHT 0x0005
#define HCI_SYSTEM_EVENT 0x0016 #define HCI_SYSTEM_EVENT 0x0016
#define HCI_VIDEO_OUT 0x001c #define HCI_VIDEO_OUT 0x001c
#define HCI_HOTKEY_EVENT 0x001e #define HCI_HOTKEY_EVENT 0x001e
...@@ -134,6 +135,7 @@ struct toshiba_acpi_dev { ...@@ -134,6 +135,7 @@ struct toshiba_acpi_dev {
unsigned int system_event_supported:1; unsigned int system_event_supported:1;
unsigned int ntfy_supported:1; unsigned int ntfy_supported:1;
unsigned int info_supported:1; unsigned int info_supported:1;
unsigned int tr_backlight_supported:1;
struct mutex mutex; struct mutex mutex;
}; };
...@@ -478,34 +480,70 @@ static const struct rfkill_ops toshiba_rfk_ops = { ...@@ -478,34 +480,70 @@ static const struct rfkill_ops toshiba_rfk_ops = {
.poll = bt_rfkill_poll, .poll = bt_rfkill_poll,
}; };
static int get_tr_backlight_status(struct toshiba_acpi_dev *dev, bool *enabled)
{
u32 hci_result;
u32 status;
hci_read1(dev, HCI_TR_BACKLIGHT, &status, &hci_result);
*enabled = !status;
return hci_result == HCI_SUCCESS ? 0 : -EIO;
}
static int set_tr_backlight_status(struct toshiba_acpi_dev *dev, bool enable)
{
u32 hci_result;
u32 value = !enable;
hci_write1(dev, HCI_TR_BACKLIGHT, value, &hci_result);
return hci_result == HCI_SUCCESS ? 0 : -EIO;
}
static struct proc_dir_entry *toshiba_proc_dir /*= 0*/ ; static struct proc_dir_entry *toshiba_proc_dir /*= 0*/ ;
static int get_lcd(struct backlight_device *bd) static int __get_lcd_brightness(struct toshiba_acpi_dev *dev)
{ {
struct toshiba_acpi_dev *dev = bl_get_data(bd);
u32 hci_result; u32 hci_result;
u32 value; u32 value;
int brightness = 0;
if (dev->tr_backlight_supported) {
bool enabled;
int ret = get_tr_backlight_status(dev, &enabled);
if (ret)
return ret;
if (enabled)
return 0;
brightness++;
}
hci_read1(dev, HCI_LCD_BRIGHTNESS, &value, &hci_result); hci_read1(dev, HCI_LCD_BRIGHTNESS, &value, &hci_result);
if (hci_result == HCI_SUCCESS) if (hci_result == HCI_SUCCESS)
return (value >> HCI_LCD_BRIGHTNESS_SHIFT); return brightness + (value >> HCI_LCD_BRIGHTNESS_SHIFT);
return -EIO; return -EIO;
} }
static int get_lcd_brightness(struct backlight_device *bd)
{
struct toshiba_acpi_dev *dev = bl_get_data(bd);
return __get_lcd_brightness(dev);
}
static int lcd_proc_show(struct seq_file *m, void *v) static int lcd_proc_show(struct seq_file *m, void *v)
{ {
struct toshiba_acpi_dev *dev = m->private; struct toshiba_acpi_dev *dev = m->private;
int value; int value;
int levels;
if (!dev->backlight_dev) if (!dev->backlight_dev)
return -ENODEV; return -ENODEV;
value = get_lcd(dev->backlight_dev); levels = dev->backlight_dev->props.max_brightness + 1;
value = get_lcd_brightness(dev->backlight_dev);
if (value >= 0) { if (value >= 0) {
seq_printf(m, "brightness: %d\n", value); seq_printf(m, "brightness: %d\n", value);
seq_printf(m, "brightness_levels: %d\n", seq_printf(m, "brightness_levels: %d\n", levels);
HCI_LCD_BRIGHTNESS_LEVELS);
return 0; return 0;
} }
...@@ -518,10 +556,19 @@ static int lcd_proc_open(struct inode *inode, struct file *file) ...@@ -518,10 +556,19 @@ static int lcd_proc_open(struct inode *inode, struct file *file)
return single_open(file, lcd_proc_show, PDE(inode)->data); return single_open(file, lcd_proc_show, PDE(inode)->data);
} }
static int set_lcd(struct toshiba_acpi_dev *dev, int value) static int set_lcd_brightness(struct toshiba_acpi_dev *dev, int value)
{ {
u32 hci_result; u32 hci_result;
if (dev->tr_backlight_supported) {
bool enable = !value;
int ret = set_tr_backlight_status(dev, enable);
if (ret)
return ret;
if (value)
value--;
}
value = value << HCI_LCD_BRIGHTNESS_SHIFT; value = value << HCI_LCD_BRIGHTNESS_SHIFT;
hci_write1(dev, HCI_LCD_BRIGHTNESS, value, &hci_result); hci_write1(dev, HCI_LCD_BRIGHTNESS, value, &hci_result);
return hci_result == HCI_SUCCESS ? 0 : -EIO; return hci_result == HCI_SUCCESS ? 0 : -EIO;
...@@ -530,7 +577,7 @@ static int set_lcd(struct toshiba_acpi_dev *dev, int value) ...@@ -530,7 +577,7 @@ static int set_lcd(struct toshiba_acpi_dev *dev, int value)
static int set_lcd_status(struct backlight_device *bd) static int set_lcd_status(struct backlight_device *bd)
{ {
struct toshiba_acpi_dev *dev = bl_get_data(bd); struct toshiba_acpi_dev *dev = bl_get_data(bd);
return set_lcd(dev, bd->props.brightness); return set_lcd_brightness(dev, bd->props.brightness);
} }
static ssize_t lcd_proc_write(struct file *file, const char __user *buf, static ssize_t lcd_proc_write(struct file *file, const char __user *buf,
...@@ -541,6 +588,7 @@ static ssize_t lcd_proc_write(struct file *file, const char __user *buf, ...@@ -541,6 +588,7 @@ static ssize_t lcd_proc_write(struct file *file, const char __user *buf,
size_t len; size_t len;
int value; int value;
int ret; int ret;
int levels = dev->backlight_dev->props.max_brightness + 1;
len = min(count, sizeof(cmd) - 1); len = min(count, sizeof(cmd) - 1);
if (copy_from_user(cmd, buf, len)) if (copy_from_user(cmd, buf, len))
...@@ -548,8 +596,8 @@ static ssize_t lcd_proc_write(struct file *file, const char __user *buf, ...@@ -548,8 +596,8 @@ static ssize_t lcd_proc_write(struct file *file, const char __user *buf,
cmd[len] = '\0'; cmd[len] = '\0';
if (sscanf(cmd, " brightness : %i", &value) == 1 && if (sscanf(cmd, " brightness : %i", &value) == 1 &&
value >= 0 && value < HCI_LCD_BRIGHTNESS_LEVELS) { value >= 0 && value < levels) {
ret = set_lcd(dev, value); ret = set_lcd_brightness(dev, value);
if (ret == 0) if (ret == 0)
ret = count; ret = count;
} else { } else {
...@@ -860,8 +908,9 @@ static void remove_toshiba_proc_entries(struct toshiba_acpi_dev *dev) ...@@ -860,8 +908,9 @@ static void remove_toshiba_proc_entries(struct toshiba_acpi_dev *dev)
} }
static const struct backlight_ops toshiba_backlight_data = { static const struct backlight_ops toshiba_backlight_data = {
.get_brightness = get_lcd, .options = BL_CORE_SUSPENDRESUME,
.update_status = set_lcd_status, .get_brightness = get_lcd_brightness,
.update_status = set_lcd_status,
}; };
static bool toshiba_acpi_i8042_filter(unsigned char data, unsigned char str, static bool toshiba_acpi_i8042_filter(unsigned char data, unsigned char str,
...@@ -1020,6 +1069,56 @@ static int __devinit toshiba_acpi_setup_keyboard(struct toshiba_acpi_dev *dev) ...@@ -1020,6 +1069,56 @@ static int __devinit toshiba_acpi_setup_keyboard(struct toshiba_acpi_dev *dev)
return error; return error;
} }
static int __devinit toshiba_acpi_setup_backlight(struct toshiba_acpi_dev *dev)
{
struct backlight_properties props;
int brightness;
int ret;
bool enabled;
/*
* Some machines don't support the backlight methods at all, and
* others support it read-only. Either of these is pretty useless,
* so only register the backlight device if the backlight method
* supports both reads and writes.
*/
brightness = __get_lcd_brightness(dev);
if (brightness < 0)
return 0;
ret = set_lcd_brightness(dev, brightness);
if (ret) {
pr_debug("Backlight method is read-only, disabling backlight support\n");
return 0;
}
/* Determine whether or not BIOS supports transflective backlight */
ret = get_tr_backlight_status(dev, &enabled);
dev->tr_backlight_supported = !ret;
memset(&props, 0, sizeof(props));
props.type = BACKLIGHT_PLATFORM;
props.max_brightness = HCI_LCD_BRIGHTNESS_LEVELS - 1;
/* adding an extra level and having 0 change to transflective mode */
if (dev->tr_backlight_supported)
props.max_brightness++;
dev->backlight_dev = backlight_device_register("toshiba",
&dev->acpi_dev->dev,
dev,
&toshiba_backlight_data,
&props);
if (IS_ERR(dev->backlight_dev)) {
ret = PTR_ERR(dev->backlight_dev);
pr_err("Could not register toshiba backlight device\n");
dev->backlight_dev = NULL;
return ret;
}
dev->backlight_dev->props.brightness = brightness;
return 0;
}
static int toshiba_acpi_remove(struct acpi_device *acpi_dev, int type) static int toshiba_acpi_remove(struct acpi_device *acpi_dev, int type)
{ {
struct toshiba_acpi_dev *dev = acpi_driver_data(acpi_dev); struct toshiba_acpi_dev *dev = acpi_driver_data(acpi_dev);
...@@ -1078,7 +1177,6 @@ static int __devinit toshiba_acpi_add(struct acpi_device *acpi_dev) ...@@ -1078,7 +1177,6 @@ static int __devinit toshiba_acpi_add(struct acpi_device *acpi_dev)
u32 dummy; u32 dummy;
bool bt_present; bool bt_present;
int ret = 0; int ret = 0;
struct backlight_properties props;
if (toshiba_acpi) if (toshiba_acpi)
return -EBUSY; return -EBUSY;
...@@ -1104,22 +1202,9 @@ static int __devinit toshiba_acpi_add(struct acpi_device *acpi_dev) ...@@ -1104,22 +1202,9 @@ static int __devinit toshiba_acpi_add(struct acpi_device *acpi_dev)
mutex_init(&dev->mutex); mutex_init(&dev->mutex);
memset(&props, 0, sizeof(props)); ret = toshiba_acpi_setup_backlight(dev);
props.type = BACKLIGHT_PLATFORM; if (ret)
props.max_brightness = HCI_LCD_BRIGHTNESS_LEVELS - 1;
dev->backlight_dev = backlight_device_register("toshiba",
&acpi_dev->dev,
dev,
&toshiba_backlight_data,
&props);
if (IS_ERR(dev->backlight_dev)) {
ret = PTR_ERR(dev->backlight_dev);
pr_err("Could not register toshiba backlight device\n");
dev->backlight_dev = NULL;
goto error; goto error;
}
dev->backlight_dev->props.brightness = get_lcd(dev->backlight_dev);
/* Register rfkill switch for Bluetooth */ /* Register rfkill switch for Bluetooth */
if (hci_get_bt_present(dev, &bt_present) == HCI_SUCCESS && bt_present) { if (hci_get_bt_present(dev, &bt_present) == HCI_SUCCESS && bt_present) {
......
...@@ -15,15 +15,26 @@ ...@@ -15,15 +15,26 @@
#include <asm/olpc.h> #include <asm/olpc.h>
static bool card_blocked;
static int rfkill_set_block(void *data, bool blocked) static int rfkill_set_block(void *data, bool blocked)
{ {
unsigned char cmd; unsigned char cmd;
int r;
if (blocked == card_blocked)
return 0;
if (blocked) if (blocked)
cmd = EC_WLAN_ENTER_RESET; cmd = EC_WLAN_ENTER_RESET;
else else
cmd = EC_WLAN_LEAVE_RESET; cmd = EC_WLAN_LEAVE_RESET;
return olpc_ec_cmd(cmd, NULL, 0, NULL, 0); r = olpc_ec_cmd(cmd, NULL, 0, NULL, 0);
if (r == 0)
card_blocked = blocked;
return r;
} }
static const struct rfkill_ops rfkill_ops = { static const struct rfkill_ops rfkill_ops = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment