~ubuntu-branches/ubuntu/wily/linux-ti-omap4/wily

« back to all changes in this revision

Viewing changes to drivers/hid/hid-logitech-dj.c

  • Committer: Package Import Robot
  • Author(s): Tim Gardner, Tim Gardner, Andy Whitcroft, James M Leddy, Paolo Pisati, Stefan Bader, Upstream Kernel Changes, Wen-chien Jesse Sung, David Henningsson, Leann Ogasawara, Rob Herring, git at e4ward
  • Date: 2012-10-09 15:40:14 UTC
  • Revision ID: package-import@ubuntu.com-20121009154014-iktauc26lb0l5alw
Tags: 3.5.0-213.20
[ Tim Gardner ]

* rebased on Ubuntu-3.5.0-17.28

[ Andy Whitcroft ]

* [packaging] we already have a valid src_pkg_name
* [packaging] allow us to select which builds have uefi signed versions

[ James M Leddy ]

* SAUCE: input: fix weird issue of synaptics psmouse sync lost after
  resume
  - LP: #717970

[ Paolo Pisati ]

* SAUCE: omap3 clocks .dev_id = NULL
  - LP: #1061599
* [Config] omap: disable USB_[EHCI|OHCI]_HCD_PLATFORM
  - LP: #1061599
* [Config] omap: enforce USB_[EHCI|OHCI]_HCD_PLATFORM=n
  - LP: #1061599

[ Stefan Bader ]

* SAUCE: net/ipv4: Always flush route cache on unregister batch call
  - LP: #1021471

[ Upstream Kernel Changes ]

* Bluetooth: Add USB_VENDOR_AND_INTERFACE_INFO() for Broadcom/Foxconn
  - LP: #1030233

[ Wen-chien Jesse Sung ]

* SAUCE: Bluetooth: Remove rules for matching Broadcom vendor specific
  IDs
  - LP: #1030233

[ Andy Whitcroft ]

* [packaging] add custom upload for the kernel binary package

[ David Henningsson ]

* SAUCE: ALSA: hda - fix indices on boost volume on Conexant
  - LP: #1059523

[ Leann Ogasawara ]

* [Config] Build in CONFIG_X86_PCC_CPUFREQ=y
  - LP: #1061126

[ Rob Herring ]

* Revert "SAUCE: ahci_platform: add custom hard reset for Calxeda ahci
  ctrlr"
  - LP: #1059432
* Revert "SAUCE: net: calxedaxgmac: add write barriers around setting
  owner bit"
  - LP: #1059432
* Revert "SAUCE: ARM: highbank: use writel_relaxed variant for pwr
  requests"
  - LP: #1059432
* Revert "SAUCE: force DMA buffers to non-bufferable on highbank"
  - LP: #1059432
* Revert "SAUCE: input: add a key driver for highbank"
  - LP: #1059432
* [Config] Align highbank config with amd64-generic and add new configs
  - LP: #1059432
* SAUCE: net: calxedaxgmac: enable operate on 2nd frame mode
  - LP: #1059432
* SAUCE: net: calxedaxgmac: remove explicit rx dma buffer polling
  - LP: #1059432
* SAUCE: net: calxedaxgmac: use relaxed i/o accessors in rx and tx paths
  - LP: #1059432
* SAUCE: net: calxedaxgmac: drop some unnecessary register writes
  - LP: #1059432
* SAUCE: net: calxedaxgmac: rework transmit ring handling
  - LP: #1059432
* SAUCE: ARM: highbank: retry wfi on reset request
  - LP: #1059432

[ Tim Gardner ]

* [Config] TIDSPBRIDGE=m
  - LP: #1058022
* rebase to v3.5.5

[ Upstream Kernel Changes ]

* common: DMA-mapping: add DMA_ATTR_NO_KERNEL_MAPPING attribute
  - LP: #1059432
* common: DMA-mapping: add DMA_ATTR_SKIP_CPU_SYNC attribute
  - LP: #1059432
* ARM: dma-mapping: add support for DMA_ATTR_SKIP_CPU_SYNC attribute
  - LP: #1059432
* ARM: add coherent dma ops
  - LP: #1059432
* ARM: add coherent iommu dma ops
  - LP: #1059432
* ARM: highbank: add coherent DMA setup
  - LP: #1059432
* sata: add platform driver for Calxeda AHCI controller
  - LP: #1059432
* xhci: Rate-limit XHCI_TRUST_TX_LENGTH quirk warning.
  - LP: #1039478
* agp/intel-gtt: remove dead code
  - LP: #1011440
* drm/i915: stop using dev->agp->base
  - LP: #1011440
* agp/intel-gtt: don't require the agp bridge on setup
  - LP: #1011440
* drm/i915 + agp/intel-gtt: prep work for direct setup
  - LP: #1011440
* agp/intel-gtt: move gart base addres setup
  - LP: #1011440
* drm/i915: don't use dev->agp
  - LP: #1011440
* drm/i915: disable drm agp support for !gen3 with kms enabled
  - LP: #1011440
* agp/intel-agp: remove snb+ host bridge pciids
  - LP: #1011440
* rebase to v3.5.5
  - LP: #1000424

[ git@status.e4ward.com ]

* SAUCE: input: Cypress PS/2 Trackpad fix multi-source, double-click
  - LP: #1055788

[ Tim Gardner ]

* [Config] revert '[Config] enable CONFIG_X86_X32=y'
  - LP: #1041883

[ Upstream Kernel Changes ]

* vmwgfx: corruption in vmw_event_fence_action_create()
* drm/nvd0/disp: hopefully fix selection of 6/8bpc mode on DP outputs
  - LP: #1058088
* drm/nv50-/gpio: initialise to vbios defaults during init
  - LP: #1058088
* igb: A fix to VF TX rate limit
  - LP: #1058188
* igb: Add switch case for supported hardware to igb_ptp_remove.
  - LP: #1058188
* igb: Support the get_ts_info ethtool method.
  - LP: #1058188
* igb: Streamline RSS queue and queue pairing assignment logic.
  - LP: #1058188
* igb: Update firmware info output
  - LP: #1058188
* igb: Version bump
  - LP: #1058188
* igb: reset PHY in the link_up process to recover PHY setting after
  power down.
  - LP: #1058188
* igb: Fix for failure to init on some 82576 devices.
  - LP: #1058188
* igb: correct hardware type (i210/i211) check in igb_loopback_test()
  - LP: #1058188
* igb: don't break user visible strings over multiple lines in
  igb_ethtool.c
  - LP: #1058188
* igb: add delay to allow igb loopback test to succeed on 8086:10c9
  - LP: #1058188
* igb: fix panic while dumping packets on Tx hang with IOMMU
  - LP: #1058188
* igb: Fix register defines for all non-82575 hardware
  - LP: #1058188
* e1000e: use more informative logging macros when netdev not yet
  registered
  - LP: #1058219
* e1000e: Cleanup code logic in e1000_check_for_serdes_link_82571()
  - LP: #1058219
* e1000e: Program the correct register for ITR when using MSI-X.
  - LP: #1058219
* e1000e: advertise transmit time stamping
  - LP: #1058219
* e1000e: 82571 Tx Data Corruption during Tx hang recovery
  - LP: #1058219
* e1000e: fix panic while dumping packets on Tx hang with IOMMU
  - LP: #1058219
* e1000: Combining Bitwise OR in one expression.
  - LP: #1058221
* e1000: advertise transmit time stamping
  - LP: #1058221
* e1000: Small packets may get corrupted during padding by HW
  - LP: #1058221
* sched: Fix migration thread runtime bogosity
  - LP: #1057593
* ACER: Add support for accelerometer sensor
  - LP: #1055433
* ACER: Fix Smatch double-free issue
  - LP: #1055433

[ Wen-chien Jesse Sung ]

* SAUCE: HID: ntrig: change default value of logical/physical
  width/height to 1
  - LP: #1044248

Show diffs side-by-side

added added

removed removed

Lines of Context:
193
193
static int logi_dj_output_hidraw_report(struct hid_device *hid, u8 * buf,
194
194
                                        size_t count,
195
195
                                        unsigned char report_type);
 
196
static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev);
196
197
 
197
198
static void logi_dj_recv_destroy_djhid_device(struct dj_receiver_dev *djrcv_dev,
198
199
                                                struct dj_report *dj_report)
233
234
        if (dj_report->report_params[DEVICE_PAIRED_PARAM_SPFUNCTION] &
234
235
            SPFUNCTION_DEVICE_LIST_EMPTY) {
235
236
                dbg_hid("%s: device list is empty\n", __func__);
 
237
                djrcv_dev->querying_devices = false;
236
238
                return;
237
239
        }
238
240
 
243
245
                return;
244
246
        }
245
247
 
 
248
        if (djrcv_dev->paired_dj_devices[dj_report->device_index]) {
 
249
                /* The device is already known. No need to reallocate it. */
 
250
                dbg_hid("%s: device is already known\n", __func__);
 
251
                return;
 
252
        }
 
253
 
246
254
        dj_hiddev = hid_allocate_device();
247
255
        if (IS_ERR(dj_hiddev)) {
248
256
                dev_err(&djrcv_hdev->dev, "%s: hid_allocate_device failed\n",
306
314
        struct dj_report dj_report;
307
315
        unsigned long flags;
308
316
        int count;
 
317
        int retval;
309
318
 
310
319
        dbg_hid("%s\n", __func__);
311
320
 
338
347
                logi_dj_recv_destroy_djhid_device(djrcv_dev, &dj_report);
339
348
                break;
340
349
        default:
 
350
        /* A normal report (i. e. not belonging to a pair/unpair notification)
 
351
         * arriving here, means that the report arrived but we did not have a
 
352
         * paired dj_device associated to the report's device_index, this
 
353
         * means that the original "device paired" notification corresponding
 
354
         * to this dj_device never arrived to this driver. The reason is that
 
355
         * hid-core discards all packets coming from a device while probe() is
 
356
         * executing. */
 
357
        if (!djrcv_dev->paired_dj_devices[dj_report.device_index]) {
 
358
                /* ok, we don't know the device, just re-ask the
 
359
                 * receiver for the list of connected devices. */
 
360
                retval = logi_dj_recv_query_paired_devices(djrcv_dev);
 
361
                if (!retval) {
 
362
                        /* everything went fine, so just leave */
 
363
                        break;
 
364
                }
 
365
                dev_err(&djrcv_dev->hdev->dev,
 
366
                        "%s:logi_dj_recv_query_paired_devices "
 
367
                        "error:%d\n", __func__, retval);
 
368
                }
341
369
                dbg_hid("%s: unexpected report type\n", __func__);
342
370
        }
343
371
}
368
396
        if (!djdev) {
369
397
                dbg_hid("djrcv_dev->paired_dj_devices[dj_report->device_index]"
370
398
                        " is NULL, index %d\n", dj_report->device_index);
 
399
                kfifo_in(&djrcv_dev->notif_fifo, dj_report, sizeof(struct dj_report));
 
400
 
 
401
                if (schedule_work(&djrcv_dev->work) == 0) {
 
402
                        dbg_hid("%s: did not schedule the work item, was already "
 
403
                        "queued\n", __func__);
 
404
                }
371
405
                return;
372
406
        }
373
407
 
398
432
        if (dj_device == NULL) {
399
433
                dbg_hid("djrcv_dev->paired_dj_devices[dj_report->device_index]"
400
434
                        " is NULL, index %d\n", dj_report->device_index);
 
435
                kfifo_in(&djrcv_dev->notif_fifo, dj_report, sizeof(struct dj_report));
 
436
 
 
437
                if (schedule_work(&djrcv_dev->work) == 0) {
 
438
                        dbg_hid("%s: did not schedule the work item, was already "
 
439
                        "queued\n", __func__);
 
440
                }
401
441
                return;
402
442
        }
403
443
 
439
479
        struct dj_report *dj_report;
440
480
        int retval;
441
481
 
442
 
        dj_report = kzalloc(sizeof(dj_report), GFP_KERNEL);
 
482
        /* no need to protect djrcv_dev->querying_devices */
 
483
        if (djrcv_dev->querying_devices)
 
484
                return 0;
 
485
 
 
486
        dj_report = kzalloc(sizeof(struct dj_report), GFP_KERNEL);
443
487
        if (!dj_report)
444
488
                return -ENOMEM;
445
489
        dj_report->report_id = REPORT_ID_DJ_SHORT;
450
494
        return retval;
451
495
}
452
496
 
 
497
 
453
498
static int logi_dj_recv_switch_to_dj_mode(struct dj_receiver_dev *djrcv_dev,
454
499
                                          unsigned timeout)
455
500
{
456
501
        struct dj_report *dj_report;
457
502
        int retval;
458
503
 
459
 
        dj_report = kzalloc(sizeof(dj_report), GFP_KERNEL);
 
504
        dj_report = kzalloc(sizeof(struct dj_report), GFP_KERNEL);
460
505
        if (!dj_report)
461
506
                return -ENOMEM;
462
507
        dj_report->report_id = REPORT_ID_DJ_SHORT;