Merge branch 'ec-cleanup' into release
authorLen Brown <len.brown@intel.com>
Sun, 29 May 2011 08:40:39 +0000 (04:40 -0400)
committerLen Brown <len.brown@intel.com>
Sun, 29 May 2011 08:40:39 +0000 (04:40 -0400)
Conflicts:
drivers/platform/x86/compal-laptop.c

1  2 
drivers/acpi/ec.c
drivers/platform/x86/compal-laptop.c
drivers/platform/x86/msi-laptop.c

diff --combined drivers/acpi/ec.c
@@@ -69,7 -69,6 +69,6 @@@ enum ec_command 
  
  #define ACPI_EC_DELAY         500     /* Wait 500ms max. during EC ops */
  #define ACPI_EC_UDELAY_GLK    1000    /* Wait 1ms max. to get global lock */
- #define ACPI_EC_CDELAY                10      /* Wait 10us before polling EC */
  #define ACPI_EC_MSI_UDELAY    550     /* Wait 550us for MSI EC */
  
  #define ACPI_EC_STORM_THRESHOLD 8     /* number of false interrupts
@@@ -433,8 -432,7 +432,7 @@@ EXPORT_SYMBOL(ec_write)
  
  int ec_transaction(u8 command,
                   const u8 * wdata, unsigned wdata_len,
-                  u8 * rdata, unsigned rdata_len,
-                  int force_poll)
+                  u8 * rdata, unsigned rdata_len)
  {
        struct transaction t = {.command = command,
                                .wdata = wdata, .rdata = rdata,
@@@ -592,8 -590,6 +590,6 @@@ static void acpi_ec_gpe_query(void *ec_
        mutex_unlock(&ec->lock);
  }
  
- static void acpi_ec_gpe_query(void *ec_cxt);
  static int ec_check_sci(struct acpi_ec *ec, u8 state)
  {
        if (state & ACPI_EC_FLAG_SCI) {
@@@ -808,8 -804,6 +804,6 @@@ static int acpi_ec_add(struct acpi_devi
                        return -EINVAL;
        }
  
-       ec->handle = device->handle;
        /* Find and register all query methods */
        acpi_walk_namespace(ACPI_TYPE_METHOD, ec->handle, 1,
                            acpi_ec_register_query_methods, NULL, ec, NULL);
@@@ -938,19 -932,8 +932,19 @@@ static struct dmi_system_id __initdata 
        ec_flag_msi, "MSI hardware", {
        DMI_MATCH(DMI_CHASSIS_VENDOR, "MICRO-STAR")}, NULL},
        {
 +      ec_flag_msi, "Quanta hardware", {
 +      DMI_MATCH(DMI_SYS_VENDOR, "Quanta"),
 +      DMI_MATCH(DMI_PRODUCT_NAME, "TW8/SW8/DW8"),}, NULL},
 +      {
 +      ec_flag_msi, "Quanta hardware", {
 +      DMI_MATCH(DMI_SYS_VENDOR, "Quanta"),
 +      DMI_MATCH(DMI_PRODUCT_NAME, "TW9/SW9"),}, NULL},
 +      {
        ec_validate_ecdt, "ASUS hardware", {
        DMI_MATCH(DMI_BIOS_VENDOR, "ASUS") }, NULL},
 +      {
 +      ec_validate_ecdt, "ASUS hardware", {
 +      DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer Inc.") }, NULL},
        {},
  };
  
@@@ -200,8 -200,8 +200,8 @@@ static bool extra_features
   * watching the output of address 0x4F (do an ec_transaction writing 0x33
   * into 0x4F and read a few bytes from the output, like so:
   *    u8 writeData = 0x33;
-  *    ec_transaction(0x4F, &writeData, 1, buffer, 32, 0);
-  * That address is labelled "fan1 table information" in the service manual.
+  *    ec_transaction(0x4F, &writeData, 1, buffer, 32);
 - * That address is labled "fan1 table information" in the service manual.
++ * That address is labeled "fan1 table information" in the service manual.
   * It should be clear which value in 'buffer' changes). This seems to be
   * related to fan speed. It isn't a proper 'realtime' fan speed value
   * though, because physically stopping or speeding up the fan doesn't
@@@ -275,7 -275,7 +275,7 @@@ static int set_backlight_level(int leve
  
        ec_write(BACKLIGHT_LEVEL_ADDR, level);
  
 -      return 1;
 +      return 0;
  }
  
  static int get_backlight_level(void)
  static void set_backlight_state(bool on)
  {
        u8 data = on ? BACKLIGHT_STATE_ON_DATA : BACKLIGHT_STATE_OFF_DATA;
-       ec_transaction(BACKLIGHT_STATE_ADDR, &data, 1, NULL, 0, 0);
+       ec_transaction(BACKLIGHT_STATE_ADDR, &data, 1, NULL, 0);
  }
  
  
  static void pwm_enable_control(void)
  {
        unsigned char writeData = PWM_ENABLE_DATA;
-       ec_transaction(PWM_ENABLE_ADDR, &writeData, 1, NULL, 0, 0);
+       ec_transaction(PWM_ENABLE_ADDR, &writeData, 1, NULL, 0);
  }
  
  static void pwm_disable_control(void)
  {
        unsigned char writeData = PWM_DISABLE_DATA;
-       ec_transaction(PWM_DISABLE_ADDR, &writeData, 1, NULL, 0, 0);
+       ec_transaction(PWM_DISABLE_ADDR, &writeData, 1, NULL, 0);
  }
  
  static void set_pwm(int pwm)
  {
-       ec_transaction(PWM_ADDRESS, &pwm_lookup_table[pwm], 1, NULL, 0, 0);
+       ec_transaction(PWM_ADDRESS, &pwm_lookup_table[pwm], 1, NULL, 0);
  }
  
  static int get_fan_rpm(void)
  {
        u8 value, data = FAN_DATA;
-       ec_transaction(FAN_ADDRESS, &data, 1, &value, 1, 0);
+       ec_transaction(FAN_ADDRESS, &data, 1, &value, 1);
        return 100 * (int)value;
  }
  
@@@ -763,7 -763,7 +763,7 @@@ static int dmi_check_cb(const struct dm
        printk(KERN_INFO DRIVER_NAME": Identified laptop model '%s'\n",
                id->ident);
        extra_features = false;
 -      return 0;
 +      return 1;
  }
  
  static int dmi_check_cb_extra(const struct dmi_system_id *id)
                "enabling extra features\n",
                id->ident);
        extra_features = true;
 -      return 0;
 +      return 1;
  }
  
  static struct dmi_system_id __initdata compal_dmi_table[] = {
@@@ -970,7 -970,6 +970,7 @@@ static int __init compal_init(void
        if (!acpi_video_backlight_support()) {
                struct backlight_properties props;
                memset(&props, 0, sizeof(struct backlight_properties));
 +              props.type = BACKLIGHT_PLATFORM;
                props.max_brightness = BACKLIGHT_LEVEL_MAX;
                compalbl_device = backlight_device_register(DRIVER_NAME,
                                                            NULL, NULL,
@@@ -51,8 -51,6 +51,8 @@@
   * laptop as MSI S270. YMMV.
   */
  
 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 +
  #include <linux/module.h>
  #include <linux/kernel.h>
  #include <linux/init.h>
@@@ -62,8 -60,6 +62,8 @@@
  #include <linux/platform_device.h>
  #include <linux/rfkill.h>
  #include <linux/i8042.h>
 +#include <linux/input.h>
 +#include <linux/input/sparse-keymap.h>
  
  #define MSI_DRIVER_VERSION "0.5"
  
@@@ -82,9 -78,6 +82,9 @@@
  #define MSI_STANDARD_EC_SCM_LOAD_ADDRESS      0x2d
  #define MSI_STANDARD_EC_SCM_LOAD_MASK         (1 << 0)
  
 +#define MSI_STANDARD_EC_TOUCHPAD_ADDRESS      0xe4
 +#define MSI_STANDARD_EC_TOUCHPAD_MASK         (1 << 4)
 +
  static int msi_laptop_resume(struct platform_device *device);
  
  #define MSI_STANDARD_EC_DEVICES_EXISTS_ADDRESS        0x2f
@@@ -97,14 -90,6 +97,14 @@@ static int auto_brightness
  module_param(auto_brightness, int, 0);
  MODULE_PARM_DESC(auto_brightness, "Enable automatic brightness control (0: disabled; 1: enabled; 2: don't touch)");
  
 +static const struct key_entry msi_laptop_keymap[] = {
 +      {KE_KEY, KEY_TOUCHPAD_ON, {KEY_TOUCHPAD_ON} },  /* Touch Pad On */
 +      {KE_KEY, KEY_TOUCHPAD_OFF, {KEY_TOUCHPAD_OFF} },/* Touch Pad On */
 +      {KE_END, 0}
 +};
 +
 +static struct input_dev *msi_laptop_input_dev;
 +
  static bool old_ec_model;
  static int wlan_s, bluetooth_s, threeg_s;
  static int threeg_exists;
@@@ -135,7 -120,7 +135,7 @@@ static int set_lcd_level(int level
        buf[1] = (u8) (level*31);
  
        return ec_transaction(MSI_EC_COMMAND_LCD_LEVEL, buf, sizeof(buf),
-                             NULL, 0, 1);
+                             NULL, 0);
  }
  
  static int get_lcd_level(void)
        int result;
  
        result = ec_transaction(MSI_EC_COMMAND_LCD_LEVEL, &wdata, 1,
-                               &rdata, 1, 1);
+                               &rdata, 1);
        if (result < 0)
                return result;
  
@@@ -157,7 -142,7 +157,7 @@@ static int get_auto_brightness(void
        int result;
  
        result = ec_transaction(MSI_EC_COMMAND_LCD_LEVEL, &wdata, 1,
-                               &rdata, 1, 1);
+                               &rdata, 1);
        if (result < 0)
                return result;
  
@@@ -172,7 -157,7 +172,7 @@@ static int set_auto_brightness(int enab
        wdata[0] = 4;
  
        result = ec_transaction(MSI_EC_COMMAND_LCD_LEVEL, wdata, 1,
-                               &rdata, 1, 1);
+                               &rdata, 1);
        if (result < 0)
                return result;
  
        wdata[1] = (rdata & 0xF7) | (enable ? 8 : 0);
  
        return ec_transaction(MSI_EC_COMMAND_LCD_LEVEL, wdata, 2,
-                             NULL, 0, 1);
+                             NULL, 0);
  }
  
  static ssize_t set_device_state(const char *buf, size_t count, u8 mask)
@@@ -217,7 -202,7 +217,7 @@@ static int get_wireless_state(int *wlan
        u8 wdata = 0, rdata;
        int result;
  
-       result = ec_transaction(MSI_EC_COMMAND_WIRELESS, &wdata, 1, &rdata, 1, 1);
+       result = ec_transaction(MSI_EC_COMMAND_WIRELESS, &wdata, 1, &rdata, 1);
        if (result < 0)
                return -1;
  
@@@ -447,7 -432,8 +447,7 @@@ static struct platform_device *msipf_de
  
  static int dmi_check_cb(const struct dmi_system_id *id)
  {
 -      printk(KERN_INFO "msi-laptop: Identified laptop model '%s'.\n",
 -             id->ident);
 +      pr_info("Identified laptop model '%s'.\n", id->ident);
        return 1;
  }
  
@@@ -619,21 -605,6 +619,21 @@@ static void msi_update_rfkill(struct wo
  }
  static DECLARE_DELAYED_WORK(msi_rfkill_work, msi_update_rfkill);
  
 +static void msi_send_touchpad_key(struct work_struct *ignored)
 +{
 +      u8 rdata;
 +      int result;
 +
 +      result = ec_read(MSI_STANDARD_EC_TOUCHPAD_ADDRESS, &rdata);
 +      if (result < 0)
 +              return;
 +
 +      sparse_keymap_report_event(msi_laptop_input_dev,
 +              (rdata & MSI_STANDARD_EC_TOUCHPAD_MASK) ?
 +              KEY_TOUCHPAD_ON : KEY_TOUCHPAD_OFF, 1, true);
 +}
 +static DECLARE_DELAYED_WORK(msi_touchpad_work, msi_send_touchpad_key);
 +
  static bool msi_laptop_i8042_filter(unsigned char data, unsigned char str,
                                struct serio *port)
  {
        if (str & 0x20)
                return false;
  
 -      /* 0x54 wwan, 0x62 bluetooth, 0x76 wlan*/
 +      /* 0x54 wwan, 0x62 bluetooth, 0x76 wlan, 0xE4 touchpad toggle*/
        if (unlikely(data == 0xe0)) {
                extended = true;
                return false;
        } else if (unlikely(extended)) {
 +              extended = false;
                switch (data) {
 +              case 0xE4:
 +                      schedule_delayed_work(&msi_touchpad_work,
 +                              round_jiffies_relative(0.5 * HZ));
 +                      break;
                case 0x54:
                case 0x62:
                case 0x76:
                                round_jiffies_relative(0.5 * HZ));
                        break;
                }
 -              extended = false;
        }
  
        return false;
@@@ -764,42 -731,6 +764,42 @@@ static int msi_laptop_resume(struct pla
        return 0;
  }
  
 +static int __init msi_laptop_input_setup(void)
 +{
 +      int err;
 +
 +      msi_laptop_input_dev = input_allocate_device();
 +      if (!msi_laptop_input_dev)
 +              return -ENOMEM;
 +
 +      msi_laptop_input_dev->name = "MSI Laptop hotkeys";
 +      msi_laptop_input_dev->phys = "msi-laptop/input0";
 +      msi_laptop_input_dev->id.bustype = BUS_HOST;
 +
 +      err = sparse_keymap_setup(msi_laptop_input_dev,
 +              msi_laptop_keymap, NULL);
 +      if (err)
 +              goto err_free_dev;
 +
 +      err = input_register_device(msi_laptop_input_dev);
 +      if (err)
 +              goto err_free_keymap;
 +
 +      return 0;
 +
 +err_free_keymap:
 +      sparse_keymap_free(msi_laptop_input_dev);
 +err_free_dev:
 +      input_free_device(msi_laptop_input_dev);
 +      return err;
 +}
 +
 +static void msi_laptop_input_destroy(void)
 +{
 +      sparse_keymap_free(msi_laptop_input_dev);
 +      input_unregister_device(msi_laptop_input_dev);
 +}
 +
  static int load_scm_model_init(struct platform_device *sdev)
  {
        u8 data;
        if (result < 0)
                goto fail_rfkill;
  
 +      /* setup input device */
 +      result = msi_laptop_input_setup();
 +      if (result)
 +              goto fail_input;
 +
        result = i8042_install_filter(msi_laptop_i8042_filter);
        if (result) {
 -              printk(KERN_ERR
 -                      "msi-laptop: Unable to install key filter\n");
 +              pr_err("Unable to install key filter\n");
                goto fail_filter;
        }
  
        return 0;
  
  fail_filter:
 +      msi_laptop_input_destroy();
 +
 +fail_input:
        rfkill_cleanup();
  
  fail_rfkill:
@@@ -875,12 -799,11 +875,12 @@@ static int __init msi_init(void
        /* Register backlight stuff */
  
        if (acpi_video_backlight_support()) {
 -              printk(KERN_INFO "MSI: Brightness ignored, must be controlled "
 +              pr_info("Brightness ignored, must be controlled "
                       "by ACPI video driver\n");
        } else {
                struct backlight_properties props;
                memset(&props, 0, sizeof(struct backlight_properties));
 +              props.type = BACKLIGHT_PLATFORM;
                props.max_brightness = MSI_LCD_LEVEL_MAX - 1;
                msibl_device = backlight_device_register("msi-laptop-bl", NULL,
                                                         NULL, &msibl_ops,
        if (auto_brightness != 2)
                set_auto_brightness(auto_brightness);
  
 -      printk(KERN_INFO "msi-laptop: driver "MSI_DRIVER_VERSION" successfully loaded.\n");
 +      pr_info("driver "MSI_DRIVER_VERSION" successfully loaded.\n");
  
        return 0;
  
@@@ -962,7 -885,6 +962,7 @@@ static void __exit msi_cleanup(void
  {
        if (load_scm_model) {
                i8042_remove_filter(msi_laptop_i8042_filter);
 +              msi_laptop_input_destroy();
                cancel_delayed_work_sync(&msi_rfkill_work);
                rfkill_cleanup();
        }
        if (auto_brightness != 2)
                set_auto_brightness(1);
  
 -      printk(KERN_INFO "msi-laptop: driver unloaded.\n");
 +      pr_info("driver unloaded.\n");
  }
  
  module_init(msi_init);