Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
authorLinus Torvalds <torvalds@linux-foundation.org>
Sun, 18 Dec 2016 00:45:00 +0000 (16:45 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sun, 18 Dec 2016 00:45:00 +0000 (16:45 -0800)
Pull input subsystem updates from Dmitry Torokhov:

 - updated support for Synaptics RMI4 devices, including support for
   SMBus controllers, firmware update support, sensor tuning, and PS/2
   guest support

 - ALPS driver now supports tracksticks on SS5 controllers

 - i8042 now uses chassis info to skip selftest on Asus laptops as list
   of individual models became too unwieldy

 - miscellaneous fixes to other drivers

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: (67 commits)
  Input: imx6ul_tsc - generalize the averaging property
  Input: drv260x - use generic device properties
  Input: drv260x - use temporary for &client->dev
  Input: drv260x - fix input device's parent assignment
  Input: synaptics-rmi4 - add support for F34 V7 bootloader
  Input: drv260x - fix initializing overdrive voltage
  Input: ALPS - fix protcol -> protocol
  Input: i8042 - comment #else/#endif of CONFIG_PNP
  Input: lpc32xx-keys - fix invalid error handling of a requested irq
  Input: synaptics-rmi4 - fix debug for sensor clip
  Input: synaptics-rmi4 - store the attn data in the driver
  Input: synaptics-rmi4 - allow to add attention data
  Input: synaptics-rmi4 - f03 - grab data passed by transport device
  Input: synaptics-rmi4 - add support for F03
  Input: imx6ul_tsc - convert int to u32
  Input: imx6ul_tsc - add mask when set REG_ADC_CFG
  Input: synaptics-rmi4 - have only one struct platform data
  Input: synaptics-rmi4 - remove EXPORT_SYMBOL_GPL for internal functions
  Input: synaptics-rmi4 - remove mutex calls while updating the firmware
  Input: drv2667 - fix misuse of regmap_update_bits
  ...

1  2 
drivers/input/rmi4/rmi_bus.c
drivers/input/rmi4/rmi_driver.c
drivers/input/rmi4/rmi_f01.c
drivers/input/rmi4/rmi_f11.c

index ef8c747c35e76f0c77eaf86300f724e30cf6e0ff,df97d8679badbf29b7dcdfa78b657ff9021193ea..1c40d94ca506cceb776798cb8db1444e36824ffc
@@@ -9,6 -9,7 +9,6 @@@
  
  #include <linux/kernel.h>
  #include <linux/device.h>
 -#include <linux/kconfig.h>
  #include <linux/list.h>
  #include <linux/pm.h>
  #include <linux/rmi.h>
@@@ -230,6 -231,9 +230,9 @@@ err_put_device
  
  void rmi_unregister_function(struct rmi_function *fn)
  {
+       rmi_dbg(RMI_DEBUG_CORE, &fn->dev, "Unregistering F%02X.\n",
+                       fn->fd.function_number);
        device_del(&fn->dev);
        of_node_put(fn->dev.of_node);
        put_device(&fn->dev);
@@@ -302,6 -306,9 +305,9 @@@ struct bus_type rmi_bus_type = 
  
  static struct rmi_function_handler *fn_handlers[] = {
        &rmi_f01_handler,
+ #ifdef CONFIG_RMI4_F03
+       &rmi_f03_handler,
+ #endif
  #ifdef CONFIG_RMI4_F11
        &rmi_f11_handler,
  #endif
  #ifdef CONFIG_RMI4_F30
        &rmi_f30_handler,
  #endif
+ #ifdef CONFIG_RMI4_F34
+       &rmi_f34_handler,
+ #endif
  #ifdef CONFIG_RMI4_F54
        &rmi_f54_handler,
  #endif
+ #ifdef CONFIG_RMI4_F55
+       &rmi_f55_handler,
+ #endif
  };
  
  static void __rmi_unregister_function_handlers(int start_idx)
index 4a88312fbd25405051f9ef422b4a71d95059c7a2,cb6efe6933022f1fa3141f4cb6bce366e1141617..11447ab1055cd4beadf7eca752bdf9494d76cef1
@@@ -17,6 -17,8 +17,7 @@@
  #include <linux/bitmap.h>
  #include <linux/delay.h>
  #include <linux/fs.h>
 -#include <linux/kconfig.h>
+ #include <linux/irq.h>
  #include <linux/pm.h>
  #include <linux/slab.h>
  #include <linux/of.h>
  #define RMI_DEVICE_RESET_CMD  0x01
  #define DEFAULT_RESET_DELAY_MS        100
  
static void rmi_free_function_list(struct rmi_device *rmi_dev)
+ void rmi_free_function_list(struct rmi_device *rmi_dev)
  {
        struct rmi_function *fn, *tmp;
        struct rmi_driver_data *data = dev_get_drvdata(&rmi_dev->dev);
  
+       rmi_dbg(RMI_DEBUG_CORE, &rmi_dev->dev, "Freeing function list\n");
+       devm_kfree(&rmi_dev->dev, data->irq_memory);
+       data->irq_memory = NULL;
+       data->irq_status = NULL;
+       data->fn_irq_bits = NULL;
+       data->current_irq_mask = NULL;
+       data->new_irq_mask = NULL;
        data->f01_container = NULL;
+       data->f34_container = NULL;
  
        /* Doing it in the reverse order so F01 will be removed last */
        list_for_each_entry_safe_reverse(fn, tmp,
@@@ -133,7 -145,7 +144,7 @@@ static void process_one_interrupt(struc
        }
  }
  
- int rmi_process_interrupt_requests(struct rmi_device *rmi_dev)
static int rmi_process_interrupt_requests(struct rmi_device *rmi_dev)
  {
        struct rmi_driver_data *data = dev_get_drvdata(&rmi_dev->dev);
        struct device *dev = &rmi_dev->dev;
        if (!data)
                return 0;
  
-       if (!rmi_dev->xport->attn_data) {
+       if (!data->attn_data.data) {
                error = rmi_read_block(rmi_dev,
                                data->f01_container->fd.data_base_addr + 1,
                                data->irq_status, data->num_of_irq_regs);
  
        return 0;
  }
- EXPORT_SYMBOL_GPL(rmi_process_interrupt_requests);
+ void rmi_set_attn_data(struct rmi_device *rmi_dev, unsigned long irq_status,
+                      void *data, size_t size)
+ {
+       struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev);
+       struct rmi4_attn_data attn_data;
+       void *fifo_data;
+       if (!drvdata->enabled)
+               return;
+       fifo_data = kmemdup(data, size, GFP_ATOMIC);
+       if (!fifo_data)
+               return;
+       attn_data.irq_status = irq_status;
+       attn_data.size = size;
+       attn_data.data = fifo_data;
+       kfifo_put(&drvdata->attn_fifo, attn_data);
+ }
+ EXPORT_SYMBOL_GPL(rmi_set_attn_data);
+ static irqreturn_t rmi_irq_fn(int irq, void *dev_id)
+ {
+       struct rmi_device *rmi_dev = dev_id;
+       struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev);
+       struct rmi4_attn_data attn_data = {0};
+       int ret, count;
+       count = kfifo_get(&drvdata->attn_fifo, &attn_data);
+       if (count) {
+               *(drvdata->irq_status) = attn_data.irq_status;
+               drvdata->attn_data = attn_data;
+       }
+       ret = rmi_process_interrupt_requests(rmi_dev);
+       if (ret)
+               rmi_dbg(RMI_DEBUG_CORE, &rmi_dev->dev,
+                       "Failed to process interrupt request: %d\n", ret);
+       if (count)
+               kfree(attn_data.data);
+       if (!kfifo_is_empty(&drvdata->attn_fifo))
+               return rmi_irq_fn(irq, dev_id);
+       return IRQ_HANDLED;
+ }
+ static int rmi_irq_init(struct rmi_device *rmi_dev)
+ {
+       struct rmi_device_platform_data *pdata = rmi_get_platform_data(rmi_dev);
+       struct rmi_driver_data *data = dev_get_drvdata(&rmi_dev->dev);
+       int irq_flags = irq_get_trigger_type(pdata->irq);
+       int ret;
+       if (!irq_flags)
+               irq_flags = IRQF_TRIGGER_LOW;
+       ret = devm_request_threaded_irq(&rmi_dev->dev, pdata->irq, NULL,
+                                       rmi_irq_fn, irq_flags | IRQF_ONESHOT,
+                                       dev_name(rmi_dev->xport->dev),
+                                       rmi_dev);
+       if (ret < 0) {
+               dev_err(&rmi_dev->dev, "Failed to register interrupt %d\n",
+                       pdata->irq);
+               return ret;
+       }
+       data->enabled = true;
+       return 0;
+ }
  
  static int suspend_one_function(struct rmi_function *fn)
  {
@@@ -248,7 -334,7 +333,7 @@@ static int rmi_resume_functions(struct 
        return 0;
  }
  
static int enable_sensor(struct rmi_device *rmi_dev)
int rmi_enable_sensor(struct rmi_device *rmi_dev)
  {
        int retval = 0;
  
@@@ -379,8 -465,8 +464,8 @@@ static int rmi_driver_reset_handler(str
        return 0;
  }
  
int rmi_read_pdt_entry(struct rmi_device *rmi_dev, struct pdt_entry *entry,
-                       u16 pdt_address)
static int rmi_read_pdt_entry(struct rmi_device *rmi_dev,
+                             struct pdt_entry *entry, u16 pdt_address)
  {
        u8 buf[RMI_PDT_ENTRY_SIZE];
        int error;
  
        return 0;
  }
- EXPORT_SYMBOL_GPL(rmi_read_pdt_entry);
  
  static void rmi_driver_copy_pdt_to_fd(const struct pdt_entry *pdt,
                                      struct rmi_function_descriptor *fd)
  
  static int rmi_scan_pdt_page(struct rmi_device *rmi_dev,
                             int page,
+                            int *empty_pages,
                             void *ctx,
                             int (*callback)(struct rmi_device *rmi_dev,
                                             void *ctx,
                        return retval;
        }
  
-       return (data->f01_bootloader_mode || addr == pdt_start) ?
+       /*
+        * Count number of empty PDT pages. If a gap of two pages
+        * or more is found, stop scanning.
+        */
+       if (addr == pdt_start)
+               ++*empty_pages;
+       else
+               *empty_pages = 0;
+       return (data->bootloader_mode || *empty_pages >= 2) ?
                                        RMI_SCAN_DONE : RMI_SCAN_CONTINUE;
  }
  
- static int rmi_scan_pdt(struct rmi_device *rmi_dev, void *ctx,
-                       int (*callback)(struct rmi_device *rmi_dev,
-                                       void *ctx,
-                                       const struct pdt_entry *entry))
+ int rmi_scan_pdt(struct rmi_device *rmi_dev, void *ctx,
+                int (*callback)(struct rmi_device *rmi_dev,
+                void *ctx, const struct pdt_entry *entry))
  {
        int page;
+       int empty_pages = 0;
        int retval = RMI_SCAN_DONE;
  
        for (page = 0; page <= RMI4_MAX_PAGE; page++) {
-               retval = rmi_scan_pdt_page(rmi_dev, page, ctx, callback);
+               retval = rmi_scan_pdt_page(rmi_dev, page, &empty_pages,
+                                          ctx, callback);
                if (retval != RMI_SCAN_CONTINUE)
                        break;
        }
@@@ -600,7 -696,6 +695,6 @@@ free_struct_buff
        kfree(struct_buf);
        return ret;
  }
- EXPORT_SYMBOL_GPL(rmi_read_register_desc);
  
  const struct rmi_register_desc_item *rmi_get_register_desc_item(
                                struct rmi_register_descriptor *rdesc, u16 reg)
  
        return NULL;
  }
- EXPORT_SYMBOL_GPL(rmi_get_register_desc_item);
  
  size_t rmi_register_desc_calc_size(struct rmi_register_descriptor *rdesc)
  {
        }
        return size;
  }
- EXPORT_SYMBOL_GPL(rmi_register_desc_calc_size);
  
  /* Compute the register offset relative to the base address */
  int rmi_register_desc_calc_reg_offset(
        }
        return -1;
  }
- EXPORT_SYMBOL_GPL(rmi_register_desc_calc_reg_offset);
  
  bool rmi_register_desc_has_subpacket(const struct rmi_register_desc_item *item,
        u8 subpacket)
                                subpacket) == subpacket;
  }
  
- /* Indicates that flash programming is enabled (bootloader mode). */
- #define RMI_F01_STATUS_BOOTLOADER(status)     (!!((status) & 0x40))
- /*
-  * Given the PDT entry for F01, read the device status register to determine
-  * if we're stuck in bootloader mode or not.
-  *
-  */
  static int rmi_check_bootloader_mode(struct rmi_device *rmi_dev,
                                     const struct pdt_entry *pdt)
  {
-       int error;
-       u8 device_status;
+       struct rmi_driver_data *data = dev_get_drvdata(&rmi_dev->dev);
+       int ret;
+       u8 status;
  
-       error = rmi_read(rmi_dev, pdt->data_base_addr + pdt->page_start,
-                        &device_status);
-       if (error) {
-               dev_err(&rmi_dev->dev,
-                       "Failed to read device status: %d.\n", error);
-               return error;
+       if (pdt->function_number == 0x34 && pdt->function_version > 1) {
+               ret = rmi_read(rmi_dev, pdt->data_base_addr, &status);
+               if (ret) {
+                       dev_err(&rmi_dev->dev,
+                               "Failed to read F34 status: %d.\n", ret);
+                       return ret;
+               }
+               if (status & BIT(7))
+                       data->bootloader_mode = true;
+       } else if (pdt->function_number == 0x01) {
+               ret = rmi_read(rmi_dev, pdt->data_base_addr, &status);
+               if (ret) {
+                       dev_err(&rmi_dev->dev,
+                               "Failed to read F01 status: %d.\n", ret);
+                       return ret;
+               }
+               if (status & BIT(6))
+                       data->bootloader_mode = true;
        }
  
-       return RMI_F01_STATUS_BOOTLOADER(device_status);
+       return 0;
  }
  
  static int rmi_count_irqs(struct rmi_device *rmi_dev,
                         void *ctx, const struct pdt_entry *pdt)
  {
-       struct rmi_driver_data *data = dev_get_drvdata(&rmi_dev->dev);
        int *irq_count = ctx;
+       int ret;
  
        *irq_count += pdt->interrupt_source_count;
-       if (pdt->function_number == 0x01) {
-               data->f01_bootloader_mode =
-                       rmi_check_bootloader_mode(rmi_dev, pdt);
-               if (data->f01_bootloader_mode)
-                       dev_warn(&rmi_dev->dev,
-                               "WARNING: RMI4 device is in bootloader mode!\n");
-       }
+       ret = rmi_check_bootloader_mode(rmi_dev, pdt);
+       if (ret < 0)
+               return ret;
  
        return RMI_SCAN_CONTINUE;
  }
  
static int rmi_initial_reset(struct rmi_device *rmi_dev,
-                            void *ctx, const struct pdt_entry *pdt)
int rmi_initial_reset(struct rmi_device *rmi_dev, void *ctx,
+                     const struct pdt_entry *pdt)
  {
        int error;
  
                        return RMI_SCAN_DONE;
                }
  
+               rmi_dbg(RMI_DEBUG_CORE, &rmi_dev->dev, "Sending reset\n");
                error = rmi_write_block(rmi_dev, cmd_addr, &cmd_buf, 1);
                if (error) {
                        dev_err(&rmi_dev->dev,
@@@ -776,6 -873,8 +872,8 @@@ static int rmi_create_function(struct r
  
        if (pdt->function_number == 0x01)
                data->f01_container = fn;
+       else if (pdt->function_number == 0x34)
+               data->f34_container = fn;
  
        list_add_tail(&fn->node, &data->function_list);
  
@@@ -786,23 -885,95 +884,95 @@@ err_put_fn
        return error;
  }
  
int rmi_driver_suspend(struct rmi_device *rmi_dev)
void rmi_enable_irq(struct rmi_device *rmi_dev, bool clear_wake)
  {
-       int retval = 0;
+       struct rmi_device_platform_data *pdata = rmi_get_platform_data(rmi_dev);
+       struct rmi_driver_data *data = dev_get_drvdata(&rmi_dev->dev);
+       int irq = pdata->irq;
+       int irq_flags;
+       int retval;
+       mutex_lock(&data->enabled_mutex);
+       if (data->enabled)
+               goto out;
+       enable_irq(irq);
+       data->enabled = true;
+       if (clear_wake && device_may_wakeup(rmi_dev->xport->dev)) {
+               retval = disable_irq_wake(irq);
+               if (!retval)
+                       dev_warn(&rmi_dev->dev,
+                                "Failed to disable irq for wake: %d\n",
+                                retval);
+       }
+       /*
+        * Call rmi_process_interrupt_requests() after enabling irq,
+        * otherwise we may lose interrupt on edge-triggered systems.
+        */
+       irq_flags = irq_get_trigger_type(pdata->irq);
+       if (irq_flags & IRQ_TYPE_EDGE_BOTH)
+               rmi_process_interrupt_requests(rmi_dev);
+ out:
+       mutex_unlock(&data->enabled_mutex);
+ }
+ void rmi_disable_irq(struct rmi_device *rmi_dev, bool enable_wake)
+ {
+       struct rmi_device_platform_data *pdata = rmi_get_platform_data(rmi_dev);
+       struct rmi_driver_data *data = dev_get_drvdata(&rmi_dev->dev);
+       struct rmi4_attn_data attn_data = {0};
+       int irq = pdata->irq;
+       int retval, count;
+       mutex_lock(&data->enabled_mutex);
+       if (!data->enabled)
+               goto out;
+       data->enabled = false;
+       disable_irq(irq);
+       if (enable_wake && device_may_wakeup(rmi_dev->xport->dev)) {
+               retval = enable_irq_wake(irq);
+               if (!retval)
+                       dev_warn(&rmi_dev->dev,
+                                "Failed to enable irq for wake: %d\n",
+                                retval);
+       }
+       /* make sure the fifo is clean */
+       while (!kfifo_is_empty(&data->attn_fifo)) {
+               count = kfifo_get(&data->attn_fifo, &attn_data);
+               if (count)
+                       kfree(attn_data.data);
+       }
+ out:
+       mutex_unlock(&data->enabled_mutex);
+ }
+ int rmi_driver_suspend(struct rmi_device *rmi_dev, bool enable_wake)
+ {
+       int retval;
  
        retval = rmi_suspend_functions(rmi_dev);
        if (retval)
                dev_warn(&rmi_dev->dev, "Failed to suspend functions: %d\n",
                        retval);
  
+       rmi_disable_irq(rmi_dev, enable_wake);
        return retval;
  }
  EXPORT_SYMBOL_GPL(rmi_driver_suspend);
  
- int rmi_driver_resume(struct rmi_device *rmi_dev)
+ int rmi_driver_resume(struct rmi_device *rmi_dev, bool clear_wake)
  {
        int retval;
  
+       rmi_enable_irq(rmi_dev, clear_wake);
        retval = rmi_resume_functions(rmi_dev);
        if (retval)
                dev_warn(&rmi_dev->dev, "Failed to suspend functions: %d\n",
@@@ -816,6 -987,9 +986,9 @@@ static int rmi_driver_remove(struct dev
  {
        struct rmi_device *rmi_dev = to_rmi_device(dev);
  
+       rmi_disable_irq(rmi_dev, false);
+       rmi_f34_remove_sysfs(rmi_dev);
        rmi_free_function_list(rmi_dev);
  
        return 0;
@@@ -842,15 -1016,95 +1015,95 @@@ static inline int rmi_driver_of_probe(s
  }
  #endif
  
+ int rmi_probe_interrupts(struct rmi_driver_data *data)
+ {
+       struct rmi_device *rmi_dev = data->rmi_dev;
+       struct device *dev = &rmi_dev->dev;
+       int irq_count;
+       size_t size;
+       int retval;
+       /*
+        * We need to count the IRQs and allocate their storage before scanning
+        * the PDT and creating the function entries, because adding a new
+        * function can trigger events that result in the IRQ related storage
+        * being accessed.
+        */
+       rmi_dbg(RMI_DEBUG_CORE, dev, "%s: Counting IRQs.\n", __func__);
+       irq_count = 0;
+       data->bootloader_mode = false;
+       retval = rmi_scan_pdt(rmi_dev, &irq_count, rmi_count_irqs);
+       if (retval < 0) {
+               dev_err(dev, "IRQ counting failed with code %d.\n", retval);
+               return retval;
+       }
+       if (data->bootloader_mode)
+               dev_warn(&rmi_dev->dev, "Device in bootloader mode.\n");
+       data->irq_count = irq_count;
+       data->num_of_irq_regs = (data->irq_count + 7) / 8;
+       size = BITS_TO_LONGS(data->irq_count) * sizeof(unsigned long);
+       data->irq_memory = devm_kzalloc(dev, size * 4, GFP_KERNEL);
+       if (!data->irq_memory) {
+               dev_err(dev, "Failed to allocate memory for irq masks.\n");
+               return retval;
+       }
+       data->irq_status        = data->irq_memory + size * 0;
+       data->fn_irq_bits       = data->irq_memory + size * 1;
+       data->current_irq_mask  = data->irq_memory + size * 2;
+       data->new_irq_mask      = data->irq_memory + size * 3;
+       return retval;
+ }
+ int rmi_init_functions(struct rmi_driver_data *data)
+ {
+       struct rmi_device *rmi_dev = data->rmi_dev;
+       struct device *dev = &rmi_dev->dev;
+       int irq_count;
+       int retval;
+       irq_count = 0;
+       rmi_dbg(RMI_DEBUG_CORE, dev, "%s: Creating functions.\n", __func__);
+       retval = rmi_scan_pdt(rmi_dev, &irq_count, rmi_create_function);
+       if (retval < 0) {
+               dev_err(dev, "Function creation failed with code %d.\n",
+                       retval);
+               goto err_destroy_functions;
+       }
+       if (!data->f01_container) {
+               dev_err(dev, "Missing F01 container!\n");
+               retval = -EINVAL;
+               goto err_destroy_functions;
+       }
+       retval = rmi_read_block(rmi_dev,
+                               data->f01_container->fd.control_base_addr + 1,
+                               data->current_irq_mask, data->num_of_irq_regs);
+       if (retval < 0) {
+               dev_err(dev, "%s: Failed to read current IRQ mask.\n",
+                       __func__);
+               goto err_destroy_functions;
+       }
+       return 0;
+ err_destroy_functions:
+       rmi_free_function_list(rmi_dev);
+       return retval;
+ }
  static int rmi_driver_probe(struct device *dev)
  {
        struct rmi_driver *rmi_driver;
        struct rmi_driver_data *data;
        struct rmi_device_platform_data *pdata;
        struct rmi_device *rmi_dev;
-       size_t size;
-       void *irq_memory;
-       int irq_count;
        int retval;
  
        rmi_dbg(RMI_DEBUG_CORE, dev, "%s: Starting probe.\n",
                         PDT_PROPERTIES_LOCATION, retval);
        }
  
-       /*
-        * We need to count the IRQs and allocate their storage before scanning
-        * the PDT and creating the function entries, because adding a new
-        * function can trigger events that result in the IRQ related storage
-        * being accessed.
-        */
-       rmi_dbg(RMI_DEBUG_CORE, dev, "Counting IRQs.\n");
-       irq_count = 0;
-       retval = rmi_scan_pdt(rmi_dev, &irq_count, rmi_count_irqs);
-       if (retval < 0) {
-               dev_err(dev, "IRQ counting failed with code %d.\n", retval);
-               goto err;
-       }
-       data->irq_count = irq_count;
-       data->num_of_irq_regs = (data->irq_count + 7) / 8;
        mutex_init(&data->irq_mutex);
+       mutex_init(&data->enabled_mutex);
  
-       size = BITS_TO_LONGS(data->irq_count) * sizeof(unsigned long);
-       irq_memory = devm_kzalloc(dev, size * 4, GFP_KERNEL);
-       if (!irq_memory) {
-               dev_err(dev, "Failed to allocate memory for irq masks.\n");
+       retval = rmi_probe_interrupts(data);
+       if (retval)
                goto err;
-       }
-       data->irq_status        = irq_memory + size * 0;
-       data->fn_irq_bits       = irq_memory + size * 1;
-       data->current_irq_mask  = irq_memory + size * 2;
-       data->new_irq_mask      = irq_memory + size * 3;
  
        if (rmi_dev->xport->input) {
                /*
                        dev_err(dev, "%s: Failed to allocate input device.\n",
                                __func__);
                        retval = -ENOMEM;
-                       goto err_destroy_functions;
+                       goto err;
                }
                rmi_driver_set_input_params(rmi_dev, data->input);
                data->input->phys = devm_kasprintf(dev, GFP_KERNEL,
                                                "%s/input0", dev_name(dev));
        }
  
-       irq_count = 0;
-       rmi_dbg(RMI_DEBUG_CORE, dev, "Creating functions.");
-       retval = rmi_scan_pdt(rmi_dev, &irq_count, rmi_create_function);
-       if (retval < 0) {
-               dev_err(dev, "Function creation failed with code %d.\n",
-                       retval);
-               goto err_destroy_functions;
-       }
-       if (!data->f01_container) {
-               dev_err(dev, "Missing F01 container!\n");
-               retval = -EINVAL;
-               goto err_destroy_functions;
-       }
+       retval = rmi_init_functions(data);
+       if (retval)
+               goto err;
  
-       retval = rmi_read_block(rmi_dev,
-                               data->f01_container->fd.control_base_addr + 1,
-                               data->current_irq_mask, data->num_of_irq_regs);
-       if (retval < 0) {
-               dev_err(dev, "%s: Failed to read current IRQ mask.\n",
-                       __func__);
-               goto err_destroy_functions;
-       }
+       retval = rmi_f34_create_sysfs(rmi_dev);
+       if (retval)
+               goto err;
  
        if (data->input) {
                rmi_driver_set_input_name(rmi_dev, data->input);
                }
        }
  
+       retval = rmi_irq_init(rmi_dev);
+       if (retval < 0)
+               goto err_destroy_functions;
        if (data->f01_container->dev.driver)
                /* Driver already bound, so enable ATTN now. */
-               return enable_sensor(rmi_dev);
+               return rmi_enable_sensor(rmi_dev);
  
        return 0;
  
index b5d2dfc23bad9fc7d5a626762518817713adbefa,cae35c6cde31e272542fc15ce2261680e9ea2cb0..18baf4ceb9407e6cad636ec9d41f638b9aba2131
@@@ -8,6 -8,7 +8,6 @@@
   */
  
  #include <linux/kernel.h>
 -#include <linux/kconfig.h>
  #include <linux/rmi.h>
  #include <linux/slab.h>
  #include <linux/uaccess.h>
@@@ -62,6 -63,8 +62,8 @@@ struct f01_basic_properties 
  #define RMI_F01_STATUS_CODE(status)           ((status) & 0x0f)
  /* The device has lost its configuration for some reason. */
  #define RMI_F01_STATUS_UNCONFIGURED(status)   (!!((status) & 0x80))
+ /* The device is in bootloader mode */
+ #define RMI_F01_STATUS_BOOTLOADER(status)     ((status) & 0x40)
  
  /* Control register bits */
  
@@@ -326,12 -329,12 +328,12 @@@ static int rmi_f01_probe(struct rmi_fun
        }
  
        switch (pdata->power_management.nosleep) {
-       case RMI_F01_NOSLEEP_DEFAULT:
+       case RMI_REG_STATE_DEFAULT:
                break;
-       case RMI_F01_NOSLEEP_OFF:
+       case RMI_REG_STATE_OFF:
                f01->device_control.ctrl0 &= ~RMI_F01_CTRL0_NOSLEEP_BIT;
                break;
-       case RMI_F01_NOSLEEP_ON:
+       case RMI_REG_STATE_ON:
                f01->device_control.ctrl0 |= RMI_F01_CTRL0_NOSLEEP_BIT;
                break;
        }
@@@ -593,6 -596,10 +595,10 @@@ static int rmi_f01_attention(struct rmi
                return error;
        }
  
+       if (RMI_F01_STATUS_BOOTLOADER(device_status))
+               dev_warn(&fn->dev,
+                        "Device in bootloader mode, please update firmware\n");
        if (RMI_F01_STATUS_UNCONFIGURED(device_status)) {
                dev_warn(&fn->dev, "Device reset detected.\n");
                error = rmi_dev->driver->reset_handler(rmi_dev);
index f798f427a46fde82f9580fa964c41452963c3260,68279f3c513054ba40f170ef46a203d440a085e2..bc5e37f30ac1cf4022ac5a8a17f63fb1793d2ce0
@@@ -12,6 -12,7 +12,6 @@@
  #include <linux/device.h>
  #include <linux/input.h>
  #include <linux/input/mt.h>
 -#include <linux/kconfig.h>
  #include <linux/rmi.h>
  #include <linux/slab.h>
  #include <linux/of.h>
@@@ -571,31 -572,48 +571,48 @@@ static inline u8 rmi_f11_parse_finger_s
  
  static void rmi_f11_finger_handler(struct f11_data *f11,
                                   struct rmi_2d_sensor *sensor,
-                                  unsigned long *irq_bits, int num_irq_regs)
+                                  unsigned long *irq_bits, int num_irq_regs,
+                                  int size)
  {
        const u8 *f_state = f11->data.f_state;
        u8 finger_state;
        u8 i;
+       int abs_fingers;
+       int rel_fingers;
+       int abs_size = sensor->nbr_fingers * RMI_F11_ABS_BYTES;
  
        int abs_bits = bitmap_and(f11->result_bits, irq_bits, f11->abs_mask,
                                  num_irq_regs * 8);
        int rel_bits = bitmap_and(f11->result_bits, irq_bits, f11->rel_mask,
                                  num_irq_regs * 8);
  
-       for (i = 0; i < sensor->nbr_fingers; i++) {
-               /* Possible of having 4 fingers per f_statet register */
-               finger_state = rmi_f11_parse_finger_state(f_state, i);
-               if (finger_state == F11_RESERVED) {
-                       pr_err("Invalid finger state[%d]: 0x%02x", i,
-                               finger_state);
-                       continue;
-               }
+       if (abs_bits) {
+               if (abs_size > size)
+                       abs_fingers = size / RMI_F11_ABS_BYTES;
+               else
+                       abs_fingers = sensor->nbr_fingers;
+               for (i = 0; i < abs_fingers; i++) {
+                       /* Possible of having 4 fingers per f_state register */
+                       finger_state = rmi_f11_parse_finger_state(f_state, i);
+                       if (finger_state == F11_RESERVED) {
+                               pr_err("Invalid finger state[%d]: 0x%02x", i,
+                                       finger_state);
+                               continue;
+                       }
  
-               if (abs_bits)
                        rmi_f11_abs_pos_process(f11, sensor, &sensor->objs[i],
                                                        finger_state, i);
+               }
+       }
+       if (rel_bits) {
+               if ((abs_size + sensor->nbr_fingers * RMI_F11_REL_BYTES) > size)
+                       rel_fingers = (size - abs_size) / RMI_F11_REL_BYTES;
+               else
+                       rel_fingers = sensor->nbr_fingers;
  
-               if (rel_bits)
+               for (i = 0; i < rel_fingers; i++)
                        rmi_f11_rel_pos_report(f11, i);
        }
  
                                              sensor->nbr_fingers,
                                              sensor->dmax);
  
-               for (i = 0; i < sensor->nbr_fingers; i++) {
+               for (i = 0; i < abs_fingers; i++) {
                        finger_state = rmi_f11_parse_finger_state(f_state, i);
                        if (finger_state == F11_RESERVED)
                                /* no need to send twice the error */
@@@ -1062,8 -1080,8 +1079,8 @@@ static int rmi_f11_initialize(struct rm
                rc = rmi_2d_sensor_of_probe(&fn->dev, &f11->sensor_pdata);
                if (rc)
                        return rc;
-       } else if (pdata->sensor_pdata) {
-               f11->sensor_pdata = *pdata->sensor_pdata;
+       } else {
+               f11->sensor_pdata = pdata->sensor_pdata;
        }
  
        f11->rezero_wait_ms = f11->sensor_pdata.rezero_wait;
        sensor->topbuttonpad = f11->sensor_pdata.topbuttonpad;
        sensor->kernel_tracking = f11->sensor_pdata.kernel_tracking;
        sensor->dmax = f11->sensor_pdata.dmax;
+       sensor->dribble = f11->sensor_pdata.dribble;
+       sensor->palm_detect = f11->sensor_pdata.palm_detect;
  
        if (f11->sens_query.has_physical_props) {
                sensor->x_mm = f11->sens_query.x_sensor_size_mm;
                ctrl->ctrl0_11[RMI_F11_DELTA_Y_THRESHOLD] =
                        sensor->axis_align.delta_y_threshold;
  
-       if (f11->sens_query.has_dribble)
-               ctrl->ctrl0_11[0] = ctrl->ctrl0_11[0] & ~BIT(6);
+       if (f11->sens_query.has_dribble) {
+               switch (sensor->dribble) {
+               case RMI_REG_STATE_OFF:
+                       ctrl->ctrl0_11[0] &= ~BIT(6);
+                       break;
+               case RMI_REG_STATE_ON:
+                       ctrl->ctrl0_11[0] |= BIT(6);
+                       break;
+               case RMI_REG_STATE_DEFAULT:
+               default:
+                       break;
+               }
+       }
  
-       if (f11->sens_query.has_palm_det)
-               ctrl->ctrl0_11[11] = ctrl->ctrl0_11[11] & ~BIT(0);
+       if (f11->sens_query.has_palm_det) {
+               switch (sensor->palm_detect) {
+               case RMI_REG_STATE_OFF:
+                       ctrl->ctrl0_11[11] &= ~BIT(0);
+                       break;
+               case RMI_REG_STATE_ON:
+                       ctrl->ctrl0_11[11] |= BIT(0);
+                       break;
+               case RMI_REG_STATE_DEFAULT:
+               default:
+                       break;
+               }
+       }
  
        rc = f11_write_control_regs(fn, &f11->sens_query,
                           &f11->dev_controls, fn->fd.query_base_addr);
@@@ -1241,12 -1283,21 +1282,21 @@@ static int rmi_f11_attention(struct rmi
        struct f11_data *f11 = dev_get_drvdata(&fn->dev);
        u16 data_base_addr = fn->fd.data_base_addr;
        int error;
+       int valid_bytes = f11->sensor.pkt_size;
  
-       if (rmi_dev->xport->attn_data) {
-               memcpy(f11->sensor.data_pkt, rmi_dev->xport->attn_data,
-                       f11->sensor.attn_size);
-               rmi_dev->xport->attn_data += f11->sensor.attn_size;
-               rmi_dev->xport->attn_size -= f11->sensor.attn_size;
+       if (drvdata->attn_data.data) {
+               /*
+                * The valid data in the attention report is less then
+                * expected. Only process the complete fingers.
+                */
+               if (f11->sensor.attn_size > drvdata->attn_data.size)
+                       valid_bytes = drvdata->attn_data.size;
+               else
+                       valid_bytes = f11->sensor.attn_size;
+               memcpy(f11->sensor.data_pkt, drvdata->attn_data.data,
+                       valid_bytes);
+               drvdata->attn_data.data += f11->sensor.attn_size;
+               drvdata->attn_data.size -= f11->sensor.attn_size;
        } else {
                error = rmi_read_block(rmi_dev,
                                data_base_addr, f11->sensor.data_pkt,
        }
  
        rmi_f11_finger_handler(f11, &f11->sensor, irq_bits,
-                               drvdata->num_of_irq_regs);
+                               drvdata->num_of_irq_regs, valid_bytes);
  
        return 0;
  }