Merge branches 'for-3.8/upstream-fixes', 'for-3.9/hid-sensor', 'for-3.9/hidraw' and...
authorJiri Kosina <jkosina@suse.cz>
Thu, 21 Feb 2013 09:42:39 +0000 (10:42 +0100)
committerJiri Kosina <jkosina@suse.cz>
Thu, 21 Feb 2013 09:42:39 +0000 (10:42 +0100)
Conflicts:
drivers/hid/i2c-hid/i2c-hid.c

1  2  3  4 
drivers/hid/i2c-hid/i2c-hid.c

    #include <linux/kernel.h>
    #include <linux/hid.h>
    #include <linux/mutex.h>
+++ #include <linux/acpi.h>
    
    #include <linux/i2c/i2c-hid.h>
    
@@@@@ -139,6 -139,6 -139,6 -140,8 +140,8 @@@@@ struct i2c_hid 
        unsigned long           flags;          /* device flags */
    
        wait_queue_head_t       wait;           /* For waiting the interrupt */
+++ 
+++     struct i2c_hid_platform_data pdata;
    };
    
    static int __i2c_hid_command(struct i2c_client *client,
@@@@@ -540,24 -540,24 -540,24 -543,13 +543,24 @@@@@ static int i2c_hid_output_raw_report(st
    {
        struct i2c_client *client = hid->driver_data;
        int report_id = buf[0];
   +    int ret;
    
        if (report_type == HID_INPUT_REPORT)
                return -EINVAL;
    
   -    return i2c_hid_set_report(client,
   +    if (report_id) {
   +            buf++;
   +            count--;
   +    }
   +
   +    ret = i2c_hid_set_report(client,
                                report_type == HID_FEATURE_REPORT ? 0x03 : 0x02,
                                report_id, buf, count);
   +
   +    if (report_id && ret >= 0)
   +            ret++; /* add report_id to the number of transfered bytes */
   +
   +    return ret;
    }
    
    static int i2c_hid_parse(struct hid_device *hid)
@@@@@ -742,7 -742,7 -742,7 -734,7 +745,7 @@@@@ static struct hid_ll_driver i2c_hid_ll_
        .hidinput_input_event = i2c_hid_hidinput_input_event,
    };
    
-  -static int __devinit i2c_hid_init_irq(struct i2c_client *client)
+  +static int i2c_hid_init_irq(struct i2c_client *client)
    {
        struct i2c_hid *ihid = i2c_get_clientdata(client);
        int ret;
        return 0;
    }
    
-  -static int __devinit i2c_hid_fetch_hid_descriptor(struct i2c_hid *ihid)
+  +static int i2c_hid_fetch_hid_descriptor(struct i2c_hid *ihid)
    {
        struct i2c_client *client = ihid->client;
        struct i2c_hid_desc *hdesc = &ihid->hdesc;
        return 0;
    }
    
-   static int __devinit i2c_hid_probe(struct i2c_client *client,
-               const struct i2c_device_id *dev_id)
+++ #ifdef CONFIG_ACPI
+++ static int i2c_hid_acpi_pdata(struct i2c_client *client,
+++             struct i2c_hid_platform_data *pdata)
+++ {
+++     static u8 i2c_hid_guid[] = {
+++             0xF7, 0xF6, 0xDF, 0x3C, 0x67, 0x42, 0x55, 0x45,
+++             0xAD, 0x05, 0xB3, 0x0A, 0x3D, 0x89, 0x38, 0xDE,
+++     };
+++     struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER, NULL };
+++     union acpi_object params[4], *obj;
+++     struct acpi_object_list input;
+++     struct acpi_device *adev;
+++     acpi_handle handle;
+++ 
+++     handle = ACPI_HANDLE(&client->dev);
+++     if (!handle || acpi_bus_get_device(handle, &adev))
+++             return -ENODEV;
+++ 
+++     input.count = ARRAY_SIZE(params);
+++     input.pointer = params;
+++ 
+++     params[0].type = ACPI_TYPE_BUFFER;
+++     params[0].buffer.length = sizeof(i2c_hid_guid);
+++     params[0].buffer.pointer = i2c_hid_guid;
+++     params[1].type = ACPI_TYPE_INTEGER;
+++     params[1].integer.value = 1;
+++     params[2].type = ACPI_TYPE_INTEGER;
+++     params[2].integer.value = 1; /* HID function */
+++     params[3].type = ACPI_TYPE_INTEGER;
+++     params[3].integer.value = 0;
+++ 
+++     if (ACPI_FAILURE(acpi_evaluate_object(handle, "_DSM", &input, &buf))) {
+++             dev_err(&client->dev, "device _DSM execution failed\n");
+++             return -ENODEV;
+++     }
+++ 
+++     obj = (union acpi_object *)buf.pointer;
+++     if (obj->type != ACPI_TYPE_INTEGER) {
+++             dev_err(&client->dev, "device _DSM returned invalid type: %d\n",
+++                     obj->type);
+++             kfree(buf.pointer);
+++             return -EINVAL;
+++     }
+++ 
+++     pdata->hid_descriptor_address = obj->integer.value;
+++ 
+++     kfree(buf.pointer);
+++     return 0;
+++ }
+++ 
+++ static const struct acpi_device_id i2c_hid_acpi_match[] = {
+++     {"ACPI0C50", 0 },
+++     {"PNP0C50", 0 },
+++     { },
+++ };
+++ MODULE_DEVICE_TABLE(acpi, i2c_hid_acpi_match);
+++ #else
+++ static inline int i2c_hid_acpi_pdata(struct i2c_client *client,
+++             struct i2c_hid_platform_data *pdata)
+++ {
+++     return -ENODEV;
+++ }
+++ #endif
+++ 
   -static int __devinit i2c_hid_probe(struct i2c_client *client,
   -            const struct i2c_device_id *dev_id)
+  +static int i2c_hid_probe(struct i2c_client *client,
+  +                     const struct i2c_device_id *dev_id)
    {
        int ret;
        struct i2c_hid *ihid;
    
        dbg_hid("HID probe called for i2c 0x%02x\n", client->addr);
    
---     if (!platform_data) {
---             dev_err(&client->dev, "HID register address not provided\n");
---             return -EINVAL;
---     }
--- 
        if (!client->irq) {
                dev_err(&client->dev,
                        "HID over i2c has not been provided an Int IRQ\n");
        if (!ihid)
                return -ENOMEM;
    
+++     if (!platform_data) {
+++             ret = i2c_hid_acpi_pdata(client, &ihid->pdata);
+++             if (ret) {
+++                     dev_err(&client->dev,
+++                             "HID register address not provided\n");
+++                     goto err;
+++             }
+++     } else {
+++             ihid->pdata = *platform_data;
+++     }
+++ 
        i2c_set_clientdata(client, ihid);
    
        ihid->client = client;
    
---     hidRegister = platform_data->hid_descriptor_address;
+++     hidRegister = ihid->pdata.hid_descriptor_address;
        ihid->wHIDDescRegister = cpu_to_le16(hidRegister);
    
        init_waitqueue_head(&ihid->wait);
        hid->hid_get_raw_report = i2c_hid_get_raw_report;
        hid->hid_output_raw_report = i2c_hid_output_raw_report;
        hid->dev.parent = &client->dev;
+++     ACPI_HANDLE_SET(&hid->dev, ACPI_HANDLE(&client->dev));
        hid->bus = BUS_I2C;
        hid->version = le16_to_cpu(ihid->hdesc.bcdVersion);
        hid->vendor = le16_to_cpu(ihid->hdesc.wVendorID);
@@@@@ -913,7 -913,7 -913,7 -976,7 +987,7 @@@@@ err
        return ret;
    }
    
-  -static int __devexit i2c_hid_remove(struct i2c_client *client)
+  +static int i2c_hid_remove(struct i2c_client *client)
    {
        struct i2c_hid *ihid = i2c_get_clientdata(client);
        struct hid_device *hid;
@@@@@ -975,10 -975,10 -975,10 -1038,11 +1049,11 @@@@@ static struct i2c_driver i2c_hid_drive
                .name   = "i2c_hid",
                .owner  = THIS_MODULE,
                .pm     = &i2c_hid_pm,
+++             .acpi_match_table = ACPI_PTR(i2c_hid_acpi_match),
        },
    
        .probe          = i2c_hid_probe,
-  -    .remove         = __devexit_p(i2c_hid_remove),
+  +    .remove         = i2c_hid_remove,
    
        .id_table       = i2c_hid_id_table,
    };