]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge branch 'upstream-fixes' into for-next
authorJiri Kosina <jkosina@suse.cz>
Sun, 4 Jan 2009 00:04:09 +0000 (01:04 +0100)
committerJiri Kosina <jkosina@suse.cz>
Sun, 4 Jan 2009 00:04:09 +0000 (01:04 +0100)
Conflicts:

drivers/hid/hid-ids.h

1  2 
drivers/hid/hid-core.c
drivers/hid/hid-ids.h
drivers/hid/hidraw.c

diff --combined drivers/hid/hid-core.c
index 58a706dc74967c5c7e10e5b0323d043f11e2ad38,0ac2b668616b96ede26023da7dc2281b56a9d28d..5d7640e49dc5a8c126902954d716896058f70bcc
@@@ -1256,16 -1256,19 +1256,16 @@@ static const struct hid_device_id hid_b
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) },
        { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_BRIGHT, USB_DEVICE_ID_BRIGHT_ABNT2) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_W7658) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_SK8115) },
        { HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_GENERIC_13BA, USB_DEVICE_ID_GENERIC_13BA_KBD_MOUSE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR) },
        { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR) },
        { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0003) },
 +      { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0012) },
        { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_2) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_DESKTOP) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_EDGE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_MINI) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_KBD) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_ELITE_KBD) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_EXTREME_3D) },
        { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_USB) },
        { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0) },
        { HID_USB_DEVICE(USB_VENDOR_ID_MONTEREY, USB_DEVICE_ID_GENIUS_KB29E) },
 +      { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN) },
        { HID_USB_DEVICE(USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SUNPLUS, USB_DEVICE_ID_SUNPLUS_WDESKTOP) },
 +      { HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED, USB_DEVICE_ID_TOPSEED_CYBERLINK) },
  
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, 0x030c) },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT) },
        { }
  };
  
 +struct hid_dynid {
 +      struct list_head list;
 +      struct hid_device_id id;
 +};
 +
 +/**
 + * store_new_id - add a new HID device ID to this driver and re-probe devices
 + * @driver: target device driver
 + * @buf: buffer for scanning device ID data
 + * @count: input size
 + *
 + * Adds a new dynamic hid device ID to this driver,
 + * and causes the driver to probe for all devices again.
 + */
 +static ssize_t store_new_id(struct device_driver *drv, const char *buf,
 +              size_t count)
 +{
 +      struct hid_driver *hdrv = container_of(drv, struct hid_driver, driver);
 +      struct hid_dynid *dynid;
 +      __u32 bus, vendor, product;
 +      unsigned long driver_data = 0;
 +      int ret;
 +
 +      ret = sscanf(buf, "%x %x %x %lx",
 +                      &bus, &vendor, &product, &driver_data);
 +      if (ret < 3)
 +              return -EINVAL;
 +
 +      dynid = kzalloc(sizeof(*dynid), GFP_KERNEL);
 +      if (!dynid)
 +              return -ENOMEM;
 +
 +      dynid->id.bus = bus;
 +      dynid->id.vendor = vendor;
 +      dynid->id.product = product;
 +      dynid->id.driver_data = driver_data;
 +
 +      spin_lock(&hdrv->dyn_lock);
 +      list_add_tail(&dynid->list, &hdrv->dyn_list);
 +      spin_unlock(&hdrv->dyn_lock);
 +
 +      ret = 0;
 +      if (get_driver(&hdrv->driver)) {
 +              ret = driver_attach(&hdrv->driver);
 +              put_driver(&hdrv->driver);
 +      }
 +
 +      return ret ? : count;
 +}
 +static DRIVER_ATTR(new_id, S_IWUSR, NULL, store_new_id);
 +
 +static void hid_free_dynids(struct hid_driver *hdrv)
 +{
 +      struct hid_dynid *dynid, *n;
 +
 +      spin_lock(&hdrv->dyn_lock);
 +      list_for_each_entry_safe(dynid, n, &hdrv->dyn_list, list) {
 +              list_del(&dynid->list);
 +              kfree(dynid);
 +      }
 +      spin_unlock(&hdrv->dyn_lock);
 +}
 +
 +static const struct hid_device_id *hid_match_device(struct hid_device *hdev,
 +              struct hid_driver *hdrv)
 +{
 +      struct hid_dynid *dynid;
 +
 +      spin_lock(&hdrv->dyn_lock);
 +      list_for_each_entry(dynid, &hdrv->dyn_list, list) {
 +              if (hid_match_one_id(hdev, &dynid->id)) {
 +                      spin_unlock(&hdrv->dyn_lock);
 +                      return &dynid->id;
 +              }
 +      }
 +      spin_unlock(&hdrv->dyn_lock);
 +
 +      return hid_match_id(hdev, hdrv->id_table);
 +}
 +
  static int hid_bus_match(struct device *dev, struct device_driver *drv)
  {
        struct hid_driver *hdrv = container_of(drv, struct hid_driver, driver);
        struct hid_device *hdev = container_of(dev, struct hid_device, dev);
  
 -      if (!hid_match_id(hdev, hdrv->id_table))
 +      if (!hid_match_device(hdev, hdrv))
                return 0;
  
        /* generic wants all non-blacklisted */
@@@ -1410,7 -1332,7 +1410,7 @@@ static int hid_device_probe(struct devi
        int ret = 0;
  
        if (!hdev->driver) {
 -              id = hid_match_id(hdev, hdrv->id_table);
 +              id = hid_match_device(hdev, hdrv);
                if (id == NULL)
                        return -ENODEV;
  
@@@ -1498,6 -1420,7 +1498,7 @@@ static const struct hid_device_id hid_i
        { HID_USB_DEVICE(USB_VENDOR_ID_CMEDIA, USB_DEVICE_ID_CM109) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_HIDCOM) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_ULTRAMOUSE) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_DEALEXTREAME, USB_DEVICE_ID_DEALEXTREAME_RADIO_SI4701) },
        { HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EARTHMATE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ESSENTIAL_REALITY, USB_DEVICE_ID_ESSENTIAL_REALITY_P5) },
@@@ -1655,9 -1578,6 +1656,9 @@@ static const struct hid_device_id hid_m
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS) },
 +      { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI) },
 +      { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO) },
 +      { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) },
        { }
@@@ -1699,10 -1619,9 +1700,10 @@@ int hid_add_device(struct hid_device *h
        if (hid_ignore(hdev))
                return -ENODEV;
  
 -      /* XXX hack, any other cleaner solution < 20 bus_id bytes? */
 -      sprintf(hdev->dev.bus_id, "%04X:%04X:%04X.%04X", hdev->bus,
 -                      hdev->vendor, hdev->product, atomic_inc_return(&id));
 +      /* XXX hack, any other cleaner solution after the driver core
 +       * is converted to allow more than 20 bytes as the device name? */
 +      dev_set_name(&hdev->dev, "%04X:%04X:%04X.%04X", hdev->bus,
 +                   hdev->vendor, hdev->product, atomic_inc_return(&id));
  
        ret = device_add(&hdev->dev);
        if (!ret)
@@@ -1777,33 -1696,18 +1778,33 @@@ EXPORT_SYMBOL_GPL(hid_destroy_device)
  int __hid_register_driver(struct hid_driver *hdrv, struct module *owner,
                const char *mod_name)
  {
 +      int ret;
 +
        hdrv->driver.name = hdrv->name;
        hdrv->driver.bus = &hid_bus_type;
        hdrv->driver.owner = owner;
        hdrv->driver.mod_name = mod_name;
  
 -      return driver_register(&hdrv->driver);
 +      INIT_LIST_HEAD(&hdrv->dyn_list);
 +      spin_lock_init(&hdrv->dyn_lock);
 +
 +      ret = driver_register(&hdrv->driver);
 +      if (ret)
 +              return ret;
 +
 +      ret = driver_create_file(&hdrv->driver, &driver_attr_new_id);
 +      if (ret)
 +              driver_unregister(&hdrv->driver);
 +
 +      return ret;
  }
  EXPORT_SYMBOL_GPL(__hid_register_driver);
  
  void hid_unregister_driver(struct hid_driver *hdrv)
  {
 +      driver_remove_file(&hdrv->driver, &driver_attr_new_id);
        driver_unregister(&hdrv->driver);
 +      hid_free_dynids(hdrv);
  }
  EXPORT_SYMBOL_GPL(hid_unregister_driver);
  
diff --combined drivers/hid/hid-ids.h
index daced0bf9d4938fc91f8b6e80e508596c5be4ee3,63aaa0ff3971714f2c7de934eec2ed7189322e42..acc1abc834a471e1cf61789950a027b8c6c1e7ab
  #define USB_VENDOR_ID_BELKIN           0x050d
  #define USB_DEVICE_ID_FLIP_KVM         0x3201
  
 -#define USB_VENDOR_ID_BRIGHT          0x1241
 -#define USB_DEVICE_ID_BRIGHT_ABNT2    0x1503
 -
  #define USB_VENDOR_ID_BERKSHIRE               0x0c98
  #define USB_DEVICE_ID_BERKSHIRE_PCWD  0x1140
  
  #define USB_DEVICE_ID_CYPRESS_BARCODE_1       0xde61
  #define USB_DEVICE_ID_CYPRESS_BARCODE_2       0xde64
  
 -#define USB_VENDOR_ID_DELL            0x413c
 -#define USB_DEVICE_ID_DELL_W7658      0x2005
 -#define USB_DEVICE_ID_DELL_SK8115     0x2105
 -
+ #define USB_VENDOR_ID_DEALEXTREAME    0x10c5
+ #define USB_DEVICE_ID_DEALEXTREAME_RADIO_SI4701       0x819a
  #define USB_VENDOR_ID_DELORME         0x1163
  #define USB_DEVICE_ID_DELORME_EARTHMATE 0x0100
  #define USB_DEVICE_ID_DELORME_EM_LT20 0x0200
  
  #define USB_VENDOR_ID_GENERAL_TOUCH   0x0dfc
  
 -#define USB_VENDOR_ID_GENERIC_13BA    0x13ba
 -#define USB_DEVICE_ID_GENERIC_13BA_KBD_MOUSE  0x0017
 -
  #define USB_VENDOR_ID_GLAB            0x06c2
  #define USB_DEVICE_ID_4_PHIDGETSERVO_30       0x0038
  #define USB_DEVICE_ID_1_PHIDGETSERVO_30       0x0039
  #define USB_DEVICE_ID_LOGITECH_WHEEL  0xc294
  #define USB_DEVICE_ID_LOGITECH_MOMO_WHEEL     0xc295
  #define USB_DEVICE_ID_LOGITECH_ELITE_KBD      0xc30a
 -#define USB_DEVICE_ID_LOGITECH_KBD    0xc311
  #define USB_DEVICE_ID_S510_RECEIVER   0xc50c
  #define USB_DEVICE_ID_S510_RECEIVER_2 0xc517
  #define USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500 0xc512
  #define USB_VENDOR_ID_NEC             0x073e
  #define USB_DEVICE_ID_NEC_USB_GAME_PAD        0x0301
  
 +#define USB_VENDOR_ID_NTRIG                0x1b96
 +#define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN   0x0001
 +
  #define USB_VENDOR_ID_ONTRAK          0x0a07
  #define USB_DEVICE_ID_ONTRAK_ADU100   0x0064
  
  #define USB_VENDOR_ID_TOPMAX          0x0663
  #define USB_DEVICE_ID_TOPMAX_COBRAPAD 0x0103
  
 +#define USB_VENDOR_ID_TOPSEED         0x0766
 +#define USB_DEVICE_ID_TOPSEED_CYBERLINK       0x0204
 +
  #define USB_VENDOR_ID_TURBOX          0x062a
  #define USB_DEVICE_ID_TURBOX_KEYBOARD 0x0201
  
+ #define USB_VENDOR_ID_UCLOGIC         0x5543
+ #define USB_DEVICE_ID_UCLOGIC_TABLET_PF1209   0x0042
  #define USB_VENDOR_ID_VERNIER         0x08f7
  #define USB_DEVICE_ID_VERNIER_LABPRO  0x0001
  #define USB_DEVICE_ID_VERNIER_GOTEMP  0x0002
diff --combined drivers/hid/hidraw.c
index aab5911c4e330421697d7893321d39d87d9c4f5d,96ec1bacbbf38449e9d95696b7797b8e81844862..732449628971185d7603728aaa4c764266342274
@@@ -208,7 -208,7 +208,7 @@@ static int hidraw_release(struct inode 
  
        list_del(&list->node);
        dev = hidraw_table[minor];
-       if (!dev->open--) {
+       if (!--dev->open) {
                if (list->hidraw->exist)
                        dev->hid->ll_driver->close(dev->hid);
                else
@@@ -265,34 -265,6 +265,34 @@@ static long hidraw_ioctl(struct file *f
                                break;
                        }
                default:
 +                      {
 +                              struct hid_device *hid = dev->hid;
 +                              if (_IOC_TYPE(cmd) != 'H' || _IOC_DIR(cmd) != _IOC_READ)
 +                                      return -EINVAL;
 +
 +                              if (_IOC_NR(cmd) == _IOC_NR(HIDIOCGRAWNAME(0))) {
 +                                      int len;
 +                                      if (!hid->name)
 +                                              return 0;
 +                                      len = strlen(hid->name) + 1;
 +                                      if (len > _IOC_SIZE(cmd))
 +                                              len = _IOC_SIZE(cmd);
 +                                      return copy_to_user(user_arg, hid->name, len) ?
 +                                              -EFAULT : len;
 +                              }
 +
 +                              if (_IOC_NR(cmd) == _IOC_NR(HIDIOCGRAWPHYS(0))) {
 +                                      int len;
 +                                      if (!hid->phys)
 +                                              return 0;
 +                                      len = strlen(hid->phys) + 1;
 +                                      if (len > _IOC_SIZE(cmd))
 +                                              len = _IOC_SIZE(cmd);
 +                                      return copy_to_user(user_arg, hid->phys, len) ?
 +                                              -EFAULT : len;
 +                              }
 +                }
 +
                        ret = -ENOTTY;
        }
        unlock_kernel();
@@@ -357,7 -329,7 +357,7 @@@ int hidraw_connect(struct hid_device *h
                goto out;
        }
  
 -      dev->dev = device_create(hidraw_class, NULL, MKDEV(hidraw_major, minor),
 +      dev->dev = device_create(hidraw_class, &hid->dev, MKDEV(hidraw_major, minor),
                                 NULL, "%s%d", "hidraw", minor);
  
        if (IS_ERR(dev->dev)) {