提交 cd619e21 编写于 作者: L Linus Torvalds

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

Pull x86 platform updates from Matthew Garrett:
 "Nothing amazing here, almost entirely cleanups and minor bugfixes and
  one bit of hardware enablement in the amilo-rfkill driver"

* 'for_linus' of git://cavan.codon.org.uk/platform-drivers-x86:
  platform/x86: panasonic-laptop: reuse module_acpi_driver
  samsung-laptop: fix config build error
  platform: x86: remove unnecessary platform_set_drvdata()
  amilo-rfkill: Enable using amilo-rfkill with the FSC Amilo L1310.
  wmi: parse_wdg() should return kernel error codes
  hp_wmi: Fix unregister order in hp_wmi_rfkill_setup()
  platform: replace strict_strto*() with kstrto*()
  x86: irst: use module_acpi_driver to simplify the code
  x86: smartconnect: use module_acpi_driver to simplify the code
  platform samsung-q10: use ACPI instead of direct EC calls
  thinkpad_acpi: add the ability setting TPACPI_LED_NONE by quirk
  thinkpad_acpi: return -NODEV while operating uninitialized LEDs
...@@ -732,6 +732,7 @@ config SAMSUNG_LAPTOP ...@@ -732,6 +732,7 @@ config SAMSUNG_LAPTOP
tristate "Samsung Laptop driver" tristate "Samsung Laptop driver"
depends on X86 depends on X86
depends on RFKILL || RFKILL = n depends on RFKILL || RFKILL = n
depends on ACPI_VIDEO || ACPI_VIDEO = n
depends on BACKLIGHT_CLASS_DEVICE depends on BACKLIGHT_CLASS_DEVICE
select LEDS_CLASS select LEDS_CLASS
select NEW_LEDS select NEW_LEDS
...@@ -764,7 +765,7 @@ config INTEL_OAKTRAIL ...@@ -764,7 +765,7 @@ config INTEL_OAKTRAIL
config SAMSUNG_Q10 config SAMSUNG_Q10
tristate "Samsung Q10 Extras" tristate "Samsung Q10 Extras"
depends on SERIO_I8042 depends on ACPI
select BACKLIGHT_CLASS_DEVICE select BACKLIGHT_CLASS_DEVICE
---help--- ---help---
This driver provides support for backlight control on Samsung Q10 This driver provides support for backlight control on Samsung Q10
......
...@@ -82,6 +82,13 @@ static const struct dmi_system_id amilo_rfkill_id_table[] = { ...@@ -82,6 +82,13 @@ static const struct dmi_system_id amilo_rfkill_id_table[] = {
}, },
.driver_data = (void *)&amilo_a1655_rfkill_ops .driver_data = (void *)&amilo_a1655_rfkill_ops
}, },
{
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
DMI_MATCH(DMI_BOARD_NAME, "AMILO L1310"),
},
.driver_data = (void *)&amilo_a1655_rfkill_ops
},
{ {
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
......
...@@ -590,7 +590,7 @@ static ssize_t cmpc_accel_sensitivity_store(struct device *dev, ...@@ -590,7 +590,7 @@ static ssize_t cmpc_accel_sensitivity_store(struct device *dev,
inputdev = dev_get_drvdata(&acpi->dev); inputdev = dev_get_drvdata(&acpi->dev);
accel = dev_get_drvdata(&inputdev->dev); accel = dev_get_drvdata(&inputdev->dev);
r = strict_strtoul(buf, 0, &sensitivity); r = kstrtoul(buf, 0, &sensitivity);
if (r) if (r)
return r; return r;
......
...@@ -425,7 +425,8 @@ static ssize_t pwm_enable_store(struct device *dev, ...@@ -425,7 +425,8 @@ static ssize_t pwm_enable_store(struct device *dev,
struct compal_data *data = dev_get_drvdata(dev); struct compal_data *data = dev_get_drvdata(dev);
long val; long val;
int err; int err;
err = strict_strtol(buf, 10, &val);
err = kstrtol(buf, 10, &val);
if (err) if (err)
return err; return err;
if (val < 0) if (val < 0)
...@@ -463,7 +464,8 @@ static ssize_t pwm_store(struct device *dev, struct device_attribute *attr, ...@@ -463,7 +464,8 @@ static ssize_t pwm_store(struct device *dev, struct device_attribute *attr,
struct compal_data *data = dev_get_drvdata(dev); struct compal_data *data = dev_get_drvdata(dev);
long val; long val;
int err; int err;
err = strict_strtol(buf, 10, &val);
err = kstrtol(buf, 10, &val);
if (err) if (err)
return err; return err;
if (val < 0 || val > 255) if (val < 0 || val > 255)
...@@ -1081,7 +1083,6 @@ static int compal_remove(struct platform_device *pdev) ...@@ -1081,7 +1083,6 @@ static int compal_remove(struct platform_device *pdev)
hwmon_device_unregister(data->hwmon_dev); hwmon_device_unregister(data->hwmon_dev);
power_supply_unregister(&data->psy); power_supply_unregister(&data->psy);
platform_set_drvdata(pdev, NULL);
kfree(data); kfree(data);
sysfs_remove_group(&pdev->dev.kobj, &compal_attribute_group); sysfs_remove_group(&pdev->dev.kobj, &compal_attribute_group);
......
...@@ -725,7 +725,7 @@ static int hp_wmi_rfkill_setup(struct platform_device *device) ...@@ -725,7 +725,7 @@ static int hp_wmi_rfkill_setup(struct platform_device *device)
(void *) HPWMI_WWAN); (void *) HPWMI_WWAN);
if (!wwan_rfkill) { if (!wwan_rfkill) {
err = -ENOMEM; err = -ENOMEM;
goto register_gps_error; 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));
...@@ -733,7 +733,7 @@ static int hp_wmi_rfkill_setup(struct platform_device *device) ...@@ -733,7 +733,7 @@ static int hp_wmi_rfkill_setup(struct platform_device *device)
hp_wmi_get_hw_state(HPWMI_WWAN)); hp_wmi_get_hw_state(HPWMI_WWAN));
err = rfkill_register(wwan_rfkill); err = rfkill_register(wwan_rfkill);
if (err) if (err)
goto register_wwan_err; goto register_wwan_error;
} }
if (wireless & 0x8) { if (wireless & 0x8) {
...@@ -743,7 +743,7 @@ static int hp_wmi_rfkill_setup(struct platform_device *device) ...@@ -743,7 +743,7 @@ static int hp_wmi_rfkill_setup(struct platform_device *device)
(void *) HPWMI_GPS); (void *) HPWMI_GPS);
if (!gps_rfkill) { if (!gps_rfkill) {
err = -ENOMEM; err = -ENOMEM;
goto register_bluetooth_error; goto register_wwan_error;
} }
rfkill_init_sw_state(gps_rfkill, rfkill_init_sw_state(gps_rfkill,
hp_wmi_get_sw_state(HPWMI_GPS)); hp_wmi_get_sw_state(HPWMI_GPS));
...@@ -755,16 +755,16 @@ static int hp_wmi_rfkill_setup(struct platform_device *device) ...@@ -755,16 +755,16 @@ static int hp_wmi_rfkill_setup(struct platform_device *device)
} }
return 0; return 0;
register_wwan_err:
rfkill_destroy(wwan_rfkill);
wwan_rfkill = NULL;
if (gps_rfkill)
rfkill_unregister(gps_rfkill);
register_gps_error: register_gps_error:
rfkill_destroy(gps_rfkill); rfkill_destroy(gps_rfkill);
gps_rfkill = NULL; gps_rfkill = NULL;
if (bluetooth_rfkill) if (bluetooth_rfkill)
rfkill_unregister(bluetooth_rfkill); rfkill_unregister(bluetooth_rfkill);
register_wwan_error:
rfkill_destroy(wwan_rfkill);
wwan_rfkill = NULL;
if (gps_rfkill)
rfkill_unregister(gps_rfkill);
register_bluetooth_error: register_bluetooth_error:
rfkill_destroy(bluetooth_rfkill); rfkill_destroy(bluetooth_rfkill);
bluetooth_rfkill = NULL; bluetooth_rfkill = NULL;
......
...@@ -193,17 +193,6 @@ static struct acpi_driver irst_driver = { ...@@ -193,17 +193,6 @@ static struct acpi_driver irst_driver = {
}, },
}; };
static int irst_init(void) module_acpi_driver(irst_driver);
{
return acpi_bus_register_driver(&irst_driver);
}
static void irst_exit(void)
{
acpi_bus_unregister_driver(&irst_driver);
}
module_init(irst_init);
module_exit(irst_exit);
MODULE_DEVICE_TABLE(acpi, irst_ids); MODULE_DEVICE_TABLE(acpi, irst_ids);
...@@ -74,17 +74,6 @@ static struct acpi_driver smartconnect_driver = { ...@@ -74,17 +74,6 @@ static struct acpi_driver smartconnect_driver = {
}, },
}; };
static int smartconnect_init(void) module_acpi_driver(smartconnect_driver);
{
return acpi_bus_register_driver(&smartconnect_driver);
}
static void smartconnect_exit(void)
{
acpi_bus_unregister_driver(&smartconnect_driver);
}
module_init(smartconnect_init);
module_exit(smartconnect_exit);
MODULE_DEVICE_TABLE(acpi, smartconnect_ids); MODULE_DEVICE_TABLE(acpi, smartconnect_ids);
...@@ -128,7 +128,6 @@ static int mfld_pb_remove(struct platform_device *pdev) ...@@ -128,7 +128,6 @@ static int mfld_pb_remove(struct platform_device *pdev)
free_irq(irq, input); free_irq(irq, input);
input_unregister_device(input); input_unregister_device(input);
platform_set_drvdata(pdev, NULL);
return 0; return 0;
} }
......
...@@ -542,7 +542,6 @@ static int mid_thermal_remove(struct platform_device *pdev) ...@@ -542,7 +542,6 @@ static int mid_thermal_remove(struct platform_device *pdev)
} }
kfree(pinfo); kfree(pinfo);
platform_set_drvdata(pdev, NULL);
/* Stop the ADC */ /* Stop the ADC */
return configure_adc(0); return configure_adc(0);
......
...@@ -643,23 +643,6 @@ static int acpi_pcc_hotkey_add(struct acpi_device *device) ...@@ -643,23 +643,6 @@ static int acpi_pcc_hotkey_add(struct acpi_device *device)
return result; return result;
} }
static int __init acpi_pcc_init(void)
{
int result = 0;
if (acpi_disabled)
return -ENODEV;
result = acpi_bus_register_driver(&acpi_pcc_driver);
if (result < 0) {
ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
"Error registering hotkey driver\n"));
return -ENODEV;
}
return 0;
}
static int acpi_pcc_hotkey_remove(struct acpi_device *device) static int acpi_pcc_hotkey_remove(struct acpi_device *device)
{ {
struct pcc_acpi *pcc = acpi_driver_data(device); struct pcc_acpi *pcc = acpi_driver_data(device);
...@@ -679,10 +662,4 @@ static int acpi_pcc_hotkey_remove(struct acpi_device *device) ...@@ -679,10 +662,4 @@ static int acpi_pcc_hotkey_remove(struct acpi_device *device)
return 0; return 0;
} }
static void __exit acpi_pcc_exit(void) module_acpi_driver(acpi_pcc_driver);
{
acpi_bus_unregister_driver(&acpi_pcc_driver);
}
module_init(acpi_pcc_init);
module_exit(acpi_pcc_exit);
...@@ -14,16 +14,12 @@ ...@@ -14,16 +14,12 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/backlight.h> #include <linux/backlight.h>
#include <linux/i8042.h>
#include <linux/dmi.h> #include <linux/dmi.h>
#include <acpi/acpi_drivers.h>
#define SAMSUNGQ10_BL_MAX_INTENSITY 255 #define SAMSUNGQ10_BL_MAX_INTENSITY 7
#define SAMSUNGQ10_BL_DEFAULT_INTENSITY 185
#define SAMSUNGQ10_BL_8042_CMD 0xbe static acpi_handle ec_handle;
#define SAMSUNGQ10_BL_8042_DATA { 0x89, 0x91 }
static int samsungq10_bl_brightness;
static bool force; static bool force;
module_param(force, bool, 0); module_param(force, bool, 0);
...@@ -33,21 +29,26 @@ MODULE_PARM_DESC(force, ...@@ -33,21 +29,26 @@ MODULE_PARM_DESC(force,
static int samsungq10_bl_set_intensity(struct backlight_device *bd) static int samsungq10_bl_set_intensity(struct backlight_device *bd)
{ {
int brightness = bd->props.brightness; acpi_status status;
unsigned char c[3] = SAMSUNGQ10_BL_8042_DATA; int i;
c[2] = (unsigned char)brightness; for (i = 0; i < SAMSUNGQ10_BL_MAX_INTENSITY; i++) {
i8042_lock_chip(); status = acpi_evaluate_object(ec_handle, "_Q63", NULL, NULL);
i8042_command(c, (0x30 << 8) | SAMSUNGQ10_BL_8042_CMD); if (ACPI_FAILURE(status))
i8042_unlock_chip(); return -EIO;
samsungq10_bl_brightness = brightness; }
for (i = 0; i < bd->props.brightness; i++) {
status = acpi_evaluate_object(ec_handle, "_Q64", NULL, NULL);
if (ACPI_FAILURE(status))
return -EIO;
}
return 0; return 0;
} }
static int samsungq10_bl_get_intensity(struct backlight_device *bd) static int samsungq10_bl_get_intensity(struct backlight_device *bd)
{ {
return samsungq10_bl_brightness; return bd->props.brightness;
} }
static const struct backlight_ops samsungq10_bl_ops = { static const struct backlight_ops samsungq10_bl_ops = {
...@@ -55,28 +56,6 @@ static const struct backlight_ops samsungq10_bl_ops = { ...@@ -55,28 +56,6 @@ static const struct backlight_ops samsungq10_bl_ops = {
.update_status = samsungq10_bl_set_intensity, .update_status = samsungq10_bl_set_intensity,
}; };
#ifdef CONFIG_PM_SLEEP
static int samsungq10_suspend(struct device *dev)
{
return 0;
}
static int samsungq10_resume(struct device *dev)
{
struct backlight_device *bd = dev_get_drvdata(dev);
samsungq10_bl_set_intensity(bd);
return 0;
}
#else
#define samsungq10_suspend NULL
#define samsungq10_resume NULL
#endif
static SIMPLE_DEV_PM_OPS(samsungq10_pm_ops,
samsungq10_suspend, samsungq10_resume);
static int samsungq10_probe(struct platform_device *pdev) static int samsungq10_probe(struct platform_device *pdev)
{ {
...@@ -93,9 +72,6 @@ static int samsungq10_probe(struct platform_device *pdev) ...@@ -93,9 +72,6 @@ static int samsungq10_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, bd); platform_set_drvdata(pdev, bd);
bd->props.brightness = SAMSUNGQ10_BL_DEFAULT_INTENSITY;
samsungq10_bl_set_intensity(bd);
return 0; return 0;
} }
...@@ -104,9 +80,6 @@ static int samsungq10_remove(struct platform_device *pdev) ...@@ -104,9 +80,6 @@ static int samsungq10_remove(struct platform_device *pdev)
struct backlight_device *bd = platform_get_drvdata(pdev); struct backlight_device *bd = platform_get_drvdata(pdev);
bd->props.brightness = SAMSUNGQ10_BL_DEFAULT_INTENSITY;
samsungq10_bl_set_intensity(bd);
backlight_device_unregister(bd); backlight_device_unregister(bd);
return 0; return 0;
...@@ -116,7 +89,6 @@ static struct platform_driver samsungq10_driver = { ...@@ -116,7 +89,6 @@ static struct platform_driver samsungq10_driver = {
.driver = { .driver = {
.name = KBUILD_MODNAME, .name = KBUILD_MODNAME,
.owner = THIS_MODULE, .owner = THIS_MODULE,
.pm = &samsungq10_pm_ops,
}, },
.probe = samsungq10_probe, .probe = samsungq10_probe,
.remove = samsungq10_remove, .remove = samsungq10_remove,
...@@ -172,6 +144,11 @@ static int __init samsungq10_init(void) ...@@ -172,6 +144,11 @@ static int __init samsungq10_init(void)
if (!force && !dmi_check_system(samsungq10_dmi_table)) if (!force && !dmi_check_system(samsungq10_dmi_table))
return -ENODEV; return -ENODEV;
ec_handle = ec_get_handle();
if (!ec_handle)
return -ENODEV;
samsungq10_device = platform_create_bundle(&samsungq10_driver, samsungq10_device = platform_create_bundle(&samsungq10_driver,
samsungq10_probe, samsungq10_probe,
NULL, 0, NULL, 0); NULL, 0, NULL, 0);
......
...@@ -369,7 +369,7 @@ struct tpacpi_led_classdev { ...@@ -369,7 +369,7 @@ struct tpacpi_led_classdev {
struct led_classdev led_classdev; struct led_classdev led_classdev;
struct work_struct work; struct work_struct work;
enum led_status_t new_state; enum led_status_t new_state;
unsigned int led; int led;
}; };
/* brightness level capabilities */ /* brightness level capabilities */
...@@ -5296,6 +5296,16 @@ static int __init led_init(struct ibm_init_struct *iibm) ...@@ -5296,6 +5296,16 @@ static int __init led_init(struct ibm_init_struct *iibm)
led_supported = led_init_detect_mode(); led_supported = led_init_detect_mode();
if (led_supported != TPACPI_LED_NONE) {
useful_leds = tpacpi_check_quirks(led_useful_qtable,
ARRAY_SIZE(led_useful_qtable));
if (!useful_leds) {
led_handle = NULL;
led_supported = TPACPI_LED_NONE;
}
}
vdbg_printk(TPACPI_DBG_INIT, "LED commands are %s, mode %d\n", vdbg_printk(TPACPI_DBG_INIT, "LED commands are %s, mode %d\n",
str_supported(led_supported), led_supported); str_supported(led_supported), led_supported);
...@@ -5309,10 +5319,9 @@ static int __init led_init(struct ibm_init_struct *iibm) ...@@ -5309,10 +5319,9 @@ static int __init led_init(struct ibm_init_struct *iibm)
return -ENOMEM; return -ENOMEM;
} }
useful_leds = tpacpi_check_quirks(led_useful_qtable,
ARRAY_SIZE(led_useful_qtable));
for (i = 0; i < TPACPI_LED_NUMLEDS; i++) { for (i = 0; i < TPACPI_LED_NUMLEDS; i++) {
tpacpi_leds[i].led = -1;
if (!tpacpi_is_led_restricted(i) && if (!tpacpi_is_led_restricted(i) &&
test_bit(i, &useful_leds)) { test_bit(i, &useful_leds)) {
rc = tpacpi_init_led(i); rc = tpacpi_init_led(i);
...@@ -5370,9 +5379,13 @@ static int led_write(char *buf) ...@@ -5370,9 +5379,13 @@ static int led_write(char *buf)
return -ENODEV; return -ENODEV;
while ((cmd = next_cmd(&buf))) { while ((cmd = next_cmd(&buf))) {
if (sscanf(cmd, "%d", &led) != 1 || led < 0 || led > 15) if (sscanf(cmd, "%d", &led) != 1)
return -EINVAL; return -EINVAL;
if (led < 0 || led > (TPACPI_LED_NUMLEDS - 1) ||
tpacpi_leds[led].led < 0)
return -ENODEV;
if (strstr(cmd, "off")) { if (strstr(cmd, "off")) {
s = TPACPI_LED_OFF; s = TPACPI_LED_OFF;
} else if (strstr(cmd, "on")) { } else if (strstr(cmd, "on")) {
......
...@@ -780,7 +780,7 @@ static bool guid_already_parsed(const char *guid_string) ...@@ -780,7 +780,7 @@ static bool guid_already_parsed(const char *guid_string)
/* /*
* Parse the _WDG method for the GUID data blocks * Parse the _WDG method for the GUID data blocks
*/ */
static acpi_status parse_wdg(acpi_handle handle) static int parse_wdg(acpi_handle handle)
{ {
struct acpi_buffer out = {ACPI_ALLOCATE_BUFFER, NULL}; struct acpi_buffer out = {ACPI_ALLOCATE_BUFFER, NULL};
union acpi_object *obj; union acpi_object *obj;
...@@ -812,7 +812,7 @@ static acpi_status parse_wdg(acpi_handle handle) ...@@ -812,7 +812,7 @@ static acpi_status parse_wdg(acpi_handle handle)
wblock = kzalloc(sizeof(struct wmi_block), GFP_KERNEL); wblock = kzalloc(sizeof(struct wmi_block), GFP_KERNEL);
if (!wblock) if (!wblock)
return AE_NO_MEMORY; return -ENOMEM;
wblock->handle = handle; wblock->handle = handle;
wblock->gblock = gblock[i]; wblock->gblock = gblock[i];
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册