Merge branch 'rotary-encoder' into next
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Fri, 4 Mar 2016 19:32:40 +0000 (11:32 -0800)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Fri, 4 Mar 2016 19:32:40 +0000 (11:32 -0800)
Bring in updates to roraty encoder driver switching it away from legacy
platform data and over to generic device properties and adding support
for encoders using more than 2 GPIOs.

1  2 
drivers/gpio/gpiolib.c
drivers/input/touchscreen/atmel_mxt_ts.c

diff --combined drivers/gpio/gpiolib.c
@@@ -1279,7 -1279,13 +1279,13 @@@ static int _gpiod_get_raw_value(const s
        chip = desc->chip;
        offset = gpio_chip_hwgpio(desc);
        value = chip->get ? chip->get(chip, offset) : -EIO;
-       value = value < 0 ? value : !!value;
+       /*
+        * FIXME: fix all drivers to clamp to [0,1] or return negative,
+        * then change this to:
+        * value = value < 0 ? value : !!value;
+        * so we can properly propagate error codes.
+        */
+       value = !!value;
        trace_gpio_value(desc_to_gpio(desc), 1, value);
        return value;
  }
@@@ -1868,9 -1874,6 +1874,9 @@@ static struct gpio_desc *acpi_find_gpio
  
        /* Then from plain _CRS GPIOs */
        if (IS_ERR(desc)) {
 +              if (!acpi_can_fallback_to_crs(adev, con_id))
 +                      return ERR_PTR(-ENOENT);
 +
                desc = acpi_get_gpiod_by_index(adev, NULL, idx, &info);
                if (IS_ERR(desc))
                        return desc;
@@@ -113,8 -113,8 +113,8 @@@ struct t7_config 
  #define MXT_T9_DETECT         (1 << 7)
  
  struct t9_range {
 -      u16 x;
 -      u16 y;
 +      __le16 x;
 +      __le16 y;
  } __packed;
  
  /* MXT_TOUCH_MULTI_T9 orient */
@@@ -216,7 -216,6 +216,7 @@@ struct mxt_data 
        unsigned int irq;
        unsigned int max_x;
        unsigned int max_y;
 +      bool xy_switch;
        bool in_bootloader;
        u16 mem_size;
        u8 t100_aux_ampl;
@@@ -1666,8 -1665,8 +1666,8 @@@ static int mxt_read_t9_resolution(struc
        if (error)
                return error;
  
 -      le16_to_cpus(&range.x);
 -      le16_to_cpus(&range.y);
 +      data->max_x = get_unaligned_le16(&range.x);
 +      data->max_y = get_unaligned_le16(&range.y);
  
        error =  __mxt_read_reg(client,
                                object->start_address + MXT_T9_ORIENT,
        if (error)
                return error;
  
 -      /* Handle default values */
 -      if (range.x == 0)
 -              range.x = 1023;
 -
 -      if (range.y == 0)
 -              range.y = 1023;
 -
 -      if (orient & MXT_T9_ORIENT_SWITCH) {
 -              data->max_x = range.y;
 -              data->max_y = range.x;
 -      } else {
 -              data->max_x = range.x;
 -              data->max_y = range.y;
 -      }
 -
 -      dev_dbg(&client->dev,
 -              "Touchscreen size X%uY%u\n", data->max_x, data->max_y);
 +      data->xy_switch = orient & MXT_T9_ORIENT_SWITCH;
  
        return 0;
  }
@@@ -1693,14 -1708,13 +1693,14 @@@ static int mxt_read_t100_config(struct 
        if (!object)
                return -EINVAL;
  
 +      /* read touchscreen dimensions */
        error = __mxt_read_reg(client,
                               object->start_address + MXT_T100_XRANGE,
                               sizeof(range_x), &range_x);
        if (error)
                return error;
  
 -      le16_to_cpus(&range_x);
 +      data->max_x = get_unaligned_le16(&range_x);
  
        error = __mxt_read_reg(client,
                               object->start_address + MXT_T100_YRANGE,
        if (error)
                return error;
  
 -      le16_to_cpus(&range_y);
 +      data->max_y = get_unaligned_le16(&range_y);
  
 +      /* read orientation config */
        error =  __mxt_read_reg(client,
                                object->start_address + MXT_T100_CFG1,
                                1, &cfg);
        if (error)
                return error;
  
 +      data->xy_switch = cfg & MXT_T100_CFG_SWITCHXY;
 +
 +      /* allocate aux bytes */
        error =  __mxt_read_reg(client,
                                object->start_address + MXT_T100_TCHAUX,
                                1, &tchaux);
        if (error)
                return error;
  
 -      /* Handle default values */
 -      if (range_x == 0)
 -              range_x = 1023;
 -
 -      if (range_y == 0)
 -              range_y = 1023;
 -
 -      if (cfg & MXT_T100_CFG_SWITCHXY) {
 -              data->max_x = range_y;
 -              data->max_y = range_x;
 -      } else {
 -              data->max_x = range_x;
 -              data->max_y = range_y;
 -      }
 -
 -      /* allocate aux bytes */
        aux = 6;
  
        if (tchaux & MXT_T100_TCHAUX_VECT)
                "T100 aux mappings vect:%u ampl:%u area:%u\n",
                data->t100_aux_vect, data->t100_aux_ampl, data->t100_aux_area);
  
 -      dev_info(&client->dev,
 -               "T100 Touchscreen size X%uY%u\n", data->max_x, data->max_y);
 -
        return 0;
  }
  
@@@ -1799,19 -1828,6 +1799,19 @@@ static int mxt_initialize_input_device(
                return -EINVAL;
        }
  
 +      /* Handle default values and orientation switch */
 +      if (data->max_x == 0)
 +              data->max_x = 1023;
 +
 +      if (data->max_y == 0)
 +              data->max_y = 1023;
 +
 +      if (data->xy_switch)
 +              swap(data->max_x, data->max_y);
 +
 +      dev_info(dev, "Touchscreen size X%uY%u\n", data->max_x, data->max_y);
 +
 +      /* Register input device */
        input_dev = input_allocate_device();
        if (!input_dev) {
                dev_err(dev, "Failed to allocate memory\n");
@@@ -2471,6 -2487,31 +2471,31 @@@ static struct mxt_acpi_platform_data sa
        { }
  };
  
+ static unsigned int chromebook_tp_buttons[] = {
+       KEY_RESERVED,
+       KEY_RESERVED,
+       KEY_RESERVED,
+       KEY_RESERVED,
+       KEY_RESERVED,
+       BTN_LEFT
+ };
+ static struct mxt_acpi_platform_data chromebook_platform_data[] = {
+       {
+               /* Touchpad */
+               .hid    = "ATML0000",
+               .pdata  = {
+                       .t19_num_keys   = ARRAY_SIZE(chromebook_tp_buttons),
+                       .t19_keymap     = chromebook_tp_buttons,
+               },
+       },
+       {
+               /* Touchscreen */
+               .hid    = "ATML0001",
+       },
+       { }
+ };
  static const struct dmi_system_id mxt_dmi_table[] = {
        {
                /* 2015 Google Pixel */
                },
                .driver_data = samus_platform_data,
        },
+       {
+               /* Other Google Chromebooks */
+               .ident = "Chromebook",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "GOOGLE"),
+               },
+               .driver_data = chromebook_platform_data,
+       },
        { }
  };
  
@@@ -2685,6 -2734,7 +2718,7 @@@ static const struct i2c_device_id mxt_i
        { "qt602240_ts", 0 },
        { "atmel_mxt_ts", 0 },
        { "atmel_mxt_tp", 0 },
+       { "maxtouch", 0 },
        { "mXT224", 0 },
        { }
  };