diff options
author | Jiri Kosina <jkosina@suse.cz> | 2011-07-11 08:15:48 -0400 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2011-07-11 08:15:55 -0400 |
commit | b7e9c223be8ce335e30f2cf6ba588e6a4092275c (patch) | |
tree | 2d1e3b75606abc18df7ad65e51ac3f90cd68b38d /drivers/media/rc | |
parent | c172d82500a6cf3c32d1e650722a1055d72ce858 (diff) | |
parent | e3bbfa78bab125f58b831b5f7f45b5a305091d72 (diff) |
Merge branch 'master' into for-next
Sync with Linus' tree to be able to apply pending patches that
are based on newer code already present upstream.
Diffstat (limited to 'drivers/media/rc')
-rw-r--r-- | drivers/media/rc/fintek-cir.c | 5 | ||||
-rw-r--r-- | drivers/media/rc/imon.c | 19 | ||||
-rw-r--r-- | drivers/media/rc/ir-raw.c | 4 | ||||
-rw-r--r-- | drivers/media/rc/ite-cir.c | 12 | ||||
-rw-r--r-- | drivers/media/rc/ite-cir.h | 3 | ||||
-rw-r--r-- | drivers/media/rc/keymaps/rc-pinnacle-pctv-hd.c | 58 | ||||
-rw-r--r-- | drivers/media/rc/lirc_dev.c | 37 | ||||
-rw-r--r-- | drivers/media/rc/mceusb.c | 80 | ||||
-rw-r--r-- | drivers/media/rc/nuvoton-cir.c | 2 | ||||
-rw-r--r-- | drivers/media/rc/nuvoton-cir.h | 1 | ||||
-rw-r--r-- | drivers/media/rc/rc-main.c | 48 |
11 files changed, 154 insertions, 115 deletions
diff --git a/drivers/media/rc/fintek-cir.c b/drivers/media/rc/fintek-cir.c index 8fa539dde1b4..7f7079b12f23 100644 --- a/drivers/media/rc/fintek-cir.c +++ b/drivers/media/rc/fintek-cir.c | |||
@@ -597,12 +597,17 @@ static void __devexit fintek_remove(struct pnp_dev *pdev) | |||
597 | static int fintek_suspend(struct pnp_dev *pdev, pm_message_t state) | 597 | static int fintek_suspend(struct pnp_dev *pdev, pm_message_t state) |
598 | { | 598 | { |
599 | struct fintek_dev *fintek = pnp_get_drvdata(pdev); | 599 | struct fintek_dev *fintek = pnp_get_drvdata(pdev); |
600 | unsigned long flags; | ||
600 | 601 | ||
601 | fit_dbg("%s called", __func__); | 602 | fit_dbg("%s called", __func__); |
602 | 603 | ||
604 | spin_lock_irqsave(&fintek->fintek_lock, flags); | ||
605 | |||
603 | /* disable all CIR interrupts */ | 606 | /* disable all CIR interrupts */ |
604 | fintek_cir_reg_write(fintek, CIR_STATUS_IRQ_MASK, CIR_STATUS); | 607 | fintek_cir_reg_write(fintek, CIR_STATUS_IRQ_MASK, CIR_STATUS); |
605 | 608 | ||
609 | spin_unlock_irqrestore(&fintek->fintek_lock, flags); | ||
610 | |||
606 | fintek_config_mode_enable(fintek); | 611 | fintek_config_mode_enable(fintek); |
607 | 612 | ||
608 | /* disable cir logical dev */ | 613 | /* disable cir logical dev */ |
diff --git a/drivers/media/rc/imon.c b/drivers/media/rc/imon.c index 3f3c70716268..6bc35eeb653b 100644 --- a/drivers/media/rc/imon.c +++ b/drivers/media/rc/imon.c | |||
@@ -307,6 +307,14 @@ static const struct { | |||
307 | /* 0xffdc iMON MCE VFD */ | 307 | /* 0xffdc iMON MCE VFD */ |
308 | { 0x00010000ffffffeell, KEY_VOLUMEUP }, | 308 | { 0x00010000ffffffeell, KEY_VOLUMEUP }, |
309 | { 0x01000000ffffffeell, KEY_VOLUMEDOWN }, | 309 | { 0x01000000ffffffeell, KEY_VOLUMEDOWN }, |
310 | { 0x00000001ffffffeell, KEY_MUTE }, | ||
311 | { 0x0000000fffffffeell, KEY_MEDIA }, | ||
312 | { 0x00000012ffffffeell, KEY_UP }, | ||
313 | { 0x00000013ffffffeell, KEY_DOWN }, | ||
314 | { 0x00000014ffffffeell, KEY_LEFT }, | ||
315 | { 0x00000015ffffffeell, KEY_RIGHT }, | ||
316 | { 0x00000016ffffffeell, KEY_ENTER }, | ||
317 | { 0x00000017ffffffeell, KEY_ESC }, | ||
310 | /* iMON Knob values */ | 318 | /* iMON Knob values */ |
311 | { 0x000100ffffffffeell, KEY_VOLUMEUP }, | 319 | { 0x000100ffffffffeell, KEY_VOLUMEUP }, |
312 | { 0x010000ffffffffeell, KEY_VOLUMEDOWN }, | 320 | { 0x010000ffffffffeell, KEY_VOLUMEDOWN }, |
@@ -1582,16 +1590,16 @@ static void imon_incoming_packet(struct imon_context *ictx, | |||
1582 | /* Only panel type events left to process now */ | 1590 | /* Only panel type events left to process now */ |
1583 | spin_lock_irqsave(&ictx->kc_lock, flags); | 1591 | spin_lock_irqsave(&ictx->kc_lock, flags); |
1584 | 1592 | ||
1593 | do_gettimeofday(&t); | ||
1585 | /* KEY_MUTE repeats from knob need to be suppressed */ | 1594 | /* KEY_MUTE repeats from knob need to be suppressed */ |
1586 | if (ictx->kc == KEY_MUTE && ictx->kc == ictx->last_keycode) { | 1595 | if (ictx->kc == KEY_MUTE && ictx->kc == ictx->last_keycode) { |
1587 | do_gettimeofday(&t); | ||
1588 | msec = tv2int(&t, &prev_time); | 1596 | msec = tv2int(&t, &prev_time); |
1589 | prev_time = t; | ||
1590 | if (msec < ictx->idev->rep[REP_DELAY]) { | 1597 | if (msec < ictx->idev->rep[REP_DELAY]) { |
1591 | spin_unlock_irqrestore(&ictx->kc_lock, flags); | 1598 | spin_unlock_irqrestore(&ictx->kc_lock, flags); |
1592 | return; | 1599 | return; |
1593 | } | 1600 | } |
1594 | } | 1601 | } |
1602 | prev_time = t; | ||
1595 | kc = ictx->kc; | 1603 | kc = ictx->kc; |
1596 | 1604 | ||
1597 | spin_unlock_irqrestore(&ictx->kc_lock, flags); | 1605 | spin_unlock_irqrestore(&ictx->kc_lock, flags); |
@@ -1603,7 +1611,9 @@ static void imon_incoming_packet(struct imon_context *ictx, | |||
1603 | input_report_key(ictx->idev, kc, 0); | 1611 | input_report_key(ictx->idev, kc, 0); |
1604 | input_sync(ictx->idev); | 1612 | input_sync(ictx->idev); |
1605 | 1613 | ||
1614 | spin_lock_irqsave(&ictx->kc_lock, flags); | ||
1606 | ictx->last_keycode = kc; | 1615 | ictx->last_keycode = kc; |
1616 | spin_unlock_irqrestore(&ictx->kc_lock, flags); | ||
1607 | 1617 | ||
1608 | return; | 1618 | return; |
1609 | 1619 | ||
@@ -1740,6 +1750,8 @@ static void imon_get_ffdc_type(struct imon_context *ictx) | |||
1740 | detected_display_type = IMON_DISPLAY_TYPE_VFD; | 1750 | detected_display_type = IMON_DISPLAY_TYPE_VFD; |
1741 | break; | 1751 | break; |
1742 | /* iMON VFD, MCE IR */ | 1752 | /* iMON VFD, MCE IR */ |
1753 | case 0x46: | ||
1754 | case 0x7e: | ||
1743 | case 0x9e: | 1755 | case 0x9e: |
1744 | dev_info(ictx->dev, "0xffdc iMON VFD, MCE IR"); | 1756 | dev_info(ictx->dev, "0xffdc iMON VFD, MCE IR"); |
1745 | detected_display_type = IMON_DISPLAY_TYPE_VFD; | 1757 | detected_display_type = IMON_DISPLAY_TYPE_VFD; |
@@ -1755,6 +1767,9 @@ static void imon_get_ffdc_type(struct imon_context *ictx) | |||
1755 | dev_info(ictx->dev, "Unknown 0xffdc device, " | 1767 | dev_info(ictx->dev, "Unknown 0xffdc device, " |
1756 | "defaulting to VFD and iMON IR"); | 1768 | "defaulting to VFD and iMON IR"); |
1757 | detected_display_type = IMON_DISPLAY_TYPE_VFD; | 1769 | detected_display_type = IMON_DISPLAY_TYPE_VFD; |
1770 | /* We don't know which one it is, allow user to set the | ||
1771 | * RC6 one from userspace if OTHER wasn't correct. */ | ||
1772 | allowed_protos |= RC_TYPE_RC6; | ||
1758 | break; | 1773 | break; |
1759 | } | 1774 | } |
1760 | 1775 | ||
diff --git a/drivers/media/rc/ir-raw.c b/drivers/media/rc/ir-raw.c index 11c19d8d0ee0..423ed45d6c55 100644 --- a/drivers/media/rc/ir-raw.c +++ b/drivers/media/rc/ir-raw.c | |||
@@ -114,18 +114,20 @@ int ir_raw_event_store_edge(struct rc_dev *dev, enum raw_event_type type) | |||
114 | s64 delta; /* ns */ | 114 | s64 delta; /* ns */ |
115 | DEFINE_IR_RAW_EVENT(ev); | 115 | DEFINE_IR_RAW_EVENT(ev); |
116 | int rc = 0; | 116 | int rc = 0; |
117 | int delay; | ||
117 | 118 | ||
118 | if (!dev->raw) | 119 | if (!dev->raw) |
119 | return -EINVAL; | 120 | return -EINVAL; |
120 | 121 | ||
121 | now = ktime_get(); | 122 | now = ktime_get(); |
122 | delta = ktime_to_ns(ktime_sub(now, dev->raw->last_event)); | 123 | delta = ktime_to_ns(ktime_sub(now, dev->raw->last_event)); |
124 | delay = MS_TO_NS(dev->input_dev->rep[REP_DELAY]); | ||
123 | 125 | ||
124 | /* Check for a long duration since last event or if we're | 126 | /* Check for a long duration since last event or if we're |
125 | * being called for the first time, note that delta can't | 127 | * being called for the first time, note that delta can't |
126 | * possibly be negative. | 128 | * possibly be negative. |
127 | */ | 129 | */ |
128 | if (delta > IR_MAX_DURATION || !dev->raw->last_type) | 130 | if (delta > delay || !dev->raw->last_type) |
129 | type |= IR_START_EVENT; | 131 | type |= IR_START_EVENT; |
130 | else | 132 | else |
131 | ev.duration = delta; | 133 | ev.duration = delta; |
diff --git a/drivers/media/rc/ite-cir.c b/drivers/media/rc/ite-cir.c index cd0c44e398e3..d20168fe4c40 100644 --- a/drivers/media/rc/ite-cir.c +++ b/drivers/media/rc/ite-cir.c | |||
@@ -1346,6 +1346,7 @@ static const struct ite_dev_params ite_dev_descs[] = { | |||
1346 | { /* 0: ITE8704 */ | 1346 | { /* 0: ITE8704 */ |
1347 | .model = "ITE8704 CIR transceiver", | 1347 | .model = "ITE8704 CIR transceiver", |
1348 | .io_region_size = IT87_IOREG_LENGTH, | 1348 | .io_region_size = IT87_IOREG_LENGTH, |
1349 | .io_rsrc_no = 0, | ||
1349 | .hw_tx_capable = true, | 1350 | .hw_tx_capable = true, |
1350 | .sample_period = (u32) (1000000000ULL / 115200), | 1351 | .sample_period = (u32) (1000000000ULL / 115200), |
1351 | .tx_carrier_freq = 38000, | 1352 | .tx_carrier_freq = 38000, |
@@ -1370,6 +1371,7 @@ static const struct ite_dev_params ite_dev_descs[] = { | |||
1370 | { /* 1: ITE8713 */ | 1371 | { /* 1: ITE8713 */ |
1371 | .model = "ITE8713 CIR transceiver", | 1372 | .model = "ITE8713 CIR transceiver", |
1372 | .io_region_size = IT87_IOREG_LENGTH, | 1373 | .io_region_size = IT87_IOREG_LENGTH, |
1374 | .io_rsrc_no = 0, | ||
1373 | .hw_tx_capable = true, | 1375 | .hw_tx_capable = true, |
1374 | .sample_period = (u32) (1000000000ULL / 115200), | 1376 | .sample_period = (u32) (1000000000ULL / 115200), |
1375 | .tx_carrier_freq = 38000, | 1377 | .tx_carrier_freq = 38000, |
@@ -1394,6 +1396,7 @@ static const struct ite_dev_params ite_dev_descs[] = { | |||
1394 | { /* 2: ITE8708 */ | 1396 | { /* 2: ITE8708 */ |
1395 | .model = "ITE8708 CIR transceiver", | 1397 | .model = "ITE8708 CIR transceiver", |
1396 | .io_region_size = IT8708_IOREG_LENGTH, | 1398 | .io_region_size = IT8708_IOREG_LENGTH, |
1399 | .io_rsrc_no = 0, | ||
1397 | .hw_tx_capable = true, | 1400 | .hw_tx_capable = true, |
1398 | .sample_period = (u32) (1000000000ULL / 115200), | 1401 | .sample_period = (u32) (1000000000ULL / 115200), |
1399 | .tx_carrier_freq = 38000, | 1402 | .tx_carrier_freq = 38000, |
@@ -1419,6 +1422,7 @@ static const struct ite_dev_params ite_dev_descs[] = { | |||
1419 | { /* 3: ITE8709 */ | 1422 | { /* 3: ITE8709 */ |
1420 | .model = "ITE8709 CIR transceiver", | 1423 | .model = "ITE8709 CIR transceiver", |
1421 | .io_region_size = IT8709_IOREG_LENGTH, | 1424 | .io_region_size = IT8709_IOREG_LENGTH, |
1425 | .io_rsrc_no = 2, | ||
1422 | .hw_tx_capable = true, | 1426 | .hw_tx_capable = true, |
1423 | .sample_period = (u32) (1000000000ULL / 115200), | 1427 | .sample_period = (u32) (1000000000ULL / 115200), |
1424 | .tx_carrier_freq = 38000, | 1428 | .tx_carrier_freq = 38000, |
@@ -1460,6 +1464,7 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id | |||
1460 | struct rc_dev *rdev = NULL; | 1464 | struct rc_dev *rdev = NULL; |
1461 | int ret = -ENOMEM; | 1465 | int ret = -ENOMEM; |
1462 | int model_no; | 1466 | int model_no; |
1467 | int io_rsrc_no; | ||
1463 | 1468 | ||
1464 | ite_dbg("%s called", __func__); | 1469 | ite_dbg("%s called", __func__); |
1465 | 1470 | ||
@@ -1489,10 +1494,11 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id | |||
1489 | 1494 | ||
1490 | /* get the description for the device */ | 1495 | /* get the description for the device */ |
1491 | dev_desc = &ite_dev_descs[model_no]; | 1496 | dev_desc = &ite_dev_descs[model_no]; |
1497 | io_rsrc_no = dev_desc->io_rsrc_no; | ||
1492 | 1498 | ||
1493 | /* validate pnp resources */ | 1499 | /* validate pnp resources */ |
1494 | if (!pnp_port_valid(pdev, 0) || | 1500 | if (!pnp_port_valid(pdev, io_rsrc_no) || |
1495 | pnp_port_len(pdev, 0) != dev_desc->io_region_size) { | 1501 | pnp_port_len(pdev, io_rsrc_no) != dev_desc->io_region_size) { |
1496 | dev_err(&pdev->dev, "IR PNP Port not valid!\n"); | 1502 | dev_err(&pdev->dev, "IR PNP Port not valid!\n"); |
1497 | goto failure; | 1503 | goto failure; |
1498 | } | 1504 | } |
@@ -1503,7 +1509,7 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id | |||
1503 | } | 1509 | } |
1504 | 1510 | ||
1505 | /* store resource values */ | 1511 | /* store resource values */ |
1506 | itdev->cir_addr = pnp_port_start(pdev, 0); | 1512 | itdev->cir_addr = pnp_port_start(pdev, io_rsrc_no); |
1507 | itdev->cir_irq = pnp_irq(pdev, 0); | 1513 | itdev->cir_irq = pnp_irq(pdev, 0); |
1508 | 1514 | ||
1509 | /* initialize spinlocks */ | 1515 | /* initialize spinlocks */ |
diff --git a/drivers/media/rc/ite-cir.h b/drivers/media/rc/ite-cir.h index 16a19f5fd718..aa899a0b9750 100644 --- a/drivers/media/rc/ite-cir.h +++ b/drivers/media/rc/ite-cir.h | |||
@@ -57,6 +57,9 @@ struct ite_dev_params { | |||
57 | /* size of the I/O region */ | 57 | /* size of the I/O region */ |
58 | int io_region_size; | 58 | int io_region_size; |
59 | 59 | ||
60 | /* IR pnp I/O resource number */ | ||
61 | int io_rsrc_no; | ||
62 | |||
60 | /* true if the hardware supports transmission */ | 63 | /* true if the hardware supports transmission */ |
61 | bool hw_tx_capable; | 64 | bool hw_tx_capable; |
62 | 65 | ||
diff --git a/drivers/media/rc/keymaps/rc-pinnacle-pctv-hd.c b/drivers/media/rc/keymaps/rc-pinnacle-pctv-hd.c index bb10ffe086b4..8d558ae63456 100644 --- a/drivers/media/rc/keymaps/rc-pinnacle-pctv-hd.c +++ b/drivers/media/rc/keymaps/rc-pinnacle-pctv-hd.c | |||
@@ -15,43 +15,39 @@ | |||
15 | /* Pinnacle PCTV HD 800i mini remote */ | 15 | /* Pinnacle PCTV HD 800i mini remote */ |
16 | 16 | ||
17 | static struct rc_map_table pinnacle_pctv_hd[] = { | 17 | static struct rc_map_table pinnacle_pctv_hd[] = { |
18 | 18 | /* Key codes for the tiny Pinnacle remote*/ | |
19 | { 0x0f, KEY_1 }, | 19 | { 0x0700, KEY_MUTE }, |
20 | { 0x15, KEY_2 }, | 20 | { 0x0701, KEY_MENU }, /* Pinnacle logo */ |
21 | { 0x10, KEY_3 }, | 21 | { 0x0739, KEY_POWER }, |
22 | { 0x18, KEY_4 }, | 22 | { 0x0703, KEY_VOLUMEUP }, |
23 | { 0x1b, KEY_5 }, | 23 | { 0x0709, KEY_VOLUMEDOWN }, |
24 | { 0x1e, KEY_6 }, | 24 | { 0x0706, KEY_CHANNELUP }, |
25 | { 0x11, KEY_7 }, | 25 | { 0x070c, KEY_CHANNELDOWN }, |
26 | { 0x21, KEY_8 }, | 26 | { 0x070f, KEY_1 }, |
27 | { 0x12, KEY_9 }, | 27 | { 0x0715, KEY_2 }, |
28 | { 0x27, KEY_0 }, | 28 | { 0x0710, KEY_3 }, |
29 | 29 | { 0x0718, KEY_4 }, | |
30 | { 0x24, KEY_ZOOM }, | 30 | { 0x071b, KEY_5 }, |
31 | { 0x2a, KEY_SUBTITLE }, | 31 | { 0x071e, KEY_6 }, |
32 | 32 | { 0x0711, KEY_7 }, | |
33 | { 0x00, KEY_MUTE }, | 33 | { 0x0721, KEY_8 }, |
34 | { 0x01, KEY_ENTER }, /* Pinnacle Logo */ | 34 | { 0x0712, KEY_9 }, |
35 | { 0x39, KEY_POWER }, | 35 | { 0x0727, KEY_0 }, |
36 | 36 | { 0x0724, KEY_ZOOM }, /* 'Square' key */ | |
37 | { 0x03, KEY_VOLUMEUP }, | 37 | { 0x072a, KEY_SUBTITLE }, /* 'T' key */ |
38 | { 0x09, KEY_VOLUMEDOWN }, | 38 | { 0x072d, KEY_REWIND }, |
39 | { 0x06, KEY_CHANNELUP }, | 39 | { 0x0730, KEY_PLAYPAUSE }, |
40 | { 0x0c, KEY_CHANNELDOWN }, | 40 | { 0x0733, KEY_FASTFORWARD }, |
41 | 41 | { 0x0736, KEY_RECORD }, | |
42 | { 0x2d, KEY_REWIND }, | 42 | { 0x073c, KEY_STOP }, |
43 | { 0x30, KEY_PLAYPAUSE }, | 43 | { 0x073f, KEY_HELP }, /* '?' key */ |
44 | { 0x33, KEY_FASTFORWARD }, | ||
45 | { 0x3c, KEY_STOP }, | ||
46 | { 0x36, KEY_RECORD }, | ||
47 | { 0x3f, KEY_EPG }, /* Labeled "?" */ | ||
48 | }; | 44 | }; |
49 | 45 | ||
50 | static struct rc_map_list pinnacle_pctv_hd_map = { | 46 | static struct rc_map_list pinnacle_pctv_hd_map = { |
51 | .map = { | 47 | .map = { |
52 | .scan = pinnacle_pctv_hd, | 48 | .scan = pinnacle_pctv_hd, |
53 | .size = ARRAY_SIZE(pinnacle_pctv_hd), | 49 | .size = ARRAY_SIZE(pinnacle_pctv_hd), |
54 | .rc_type = RC_TYPE_UNKNOWN, /* Legacy IR type */ | 50 | .rc_type = RC_TYPE_RC5, |
55 | .name = RC_MAP_PINNACLE_PCTV_HD, | 51 | .name = RC_MAP_PINNACLE_PCTV_HD, |
56 | } | 52 | } |
57 | }; | 53 | }; |
diff --git a/drivers/media/rc/lirc_dev.c b/drivers/media/rc/lirc_dev.c index fd237ab120bb..27997a9ceb0d 100644 --- a/drivers/media/rc/lirc_dev.c +++ b/drivers/media/rc/lirc_dev.c | |||
@@ -55,6 +55,8 @@ struct irctl { | |||
55 | struct lirc_buffer *buf; | 55 | struct lirc_buffer *buf; |
56 | unsigned int chunk_size; | 56 | unsigned int chunk_size; |
57 | 57 | ||
58 | struct cdev *cdev; | ||
59 | |||
58 | struct task_struct *task; | 60 | struct task_struct *task; |
59 | long jiffies_to_wait; | 61 | long jiffies_to_wait; |
60 | }; | 62 | }; |
@@ -62,7 +64,6 @@ struct irctl { | |||
62 | static DEFINE_MUTEX(lirc_dev_lock); | 64 | static DEFINE_MUTEX(lirc_dev_lock); |
63 | 65 | ||
64 | static struct irctl *irctls[MAX_IRCTL_DEVICES]; | 66 | static struct irctl *irctls[MAX_IRCTL_DEVICES]; |
65 | static struct cdev cdevs[MAX_IRCTL_DEVICES]; | ||
66 | 67 | ||
67 | /* Only used for sysfs but defined to void otherwise */ | 68 | /* Only used for sysfs but defined to void otherwise */ |
68 | static struct class *lirc_class; | 69 | static struct class *lirc_class; |
@@ -167,9 +168,13 @@ static struct file_operations lirc_dev_fops = { | |||
167 | 168 | ||
168 | static int lirc_cdev_add(struct irctl *ir) | 169 | static int lirc_cdev_add(struct irctl *ir) |
169 | { | 170 | { |
170 | int retval; | 171 | int retval = -ENOMEM; |
171 | struct lirc_driver *d = &ir->d; | 172 | struct lirc_driver *d = &ir->d; |
172 | struct cdev *cdev = &cdevs[d->minor]; | 173 | struct cdev *cdev; |
174 | |||
175 | cdev = kzalloc(sizeof(*cdev), GFP_KERNEL); | ||
176 | if (!cdev) | ||
177 | goto err_out; | ||
173 | 178 | ||
174 | if (d->fops) { | 179 | if (d->fops) { |
175 | cdev_init(cdev, d->fops); | 180 | cdev_init(cdev, d->fops); |
@@ -180,12 +185,20 @@ static int lirc_cdev_add(struct irctl *ir) | |||
180 | } | 185 | } |
181 | retval = kobject_set_name(&cdev->kobj, "lirc%d", d->minor); | 186 | retval = kobject_set_name(&cdev->kobj, "lirc%d", d->minor); |
182 | if (retval) | 187 | if (retval) |
183 | return retval; | 188 | goto err_out; |
184 | 189 | ||
185 | retval = cdev_add(cdev, MKDEV(MAJOR(lirc_base_dev), d->minor), 1); | 190 | retval = cdev_add(cdev, MKDEV(MAJOR(lirc_base_dev), d->minor), 1); |
186 | if (retval) | 191 | if (retval) { |
187 | kobject_put(&cdev->kobj); | 192 | kobject_put(&cdev->kobj); |
193 | goto err_out; | ||
194 | } | ||
195 | |||
196 | ir->cdev = cdev; | ||
197 | |||
198 | return 0; | ||
188 | 199 | ||
200 | err_out: | ||
201 | kfree(cdev); | ||
189 | return retval; | 202 | return retval; |
190 | } | 203 | } |
191 | 204 | ||
@@ -214,7 +227,7 @@ int lirc_register_driver(struct lirc_driver *d) | |||
214 | if (MAX_IRCTL_DEVICES <= d->minor) { | 227 | if (MAX_IRCTL_DEVICES <= d->minor) { |
215 | dev_err(d->dev, "lirc_dev: lirc_register_driver: " | 228 | dev_err(d->dev, "lirc_dev: lirc_register_driver: " |
216 | "\"minor\" must be between 0 and %d (%d)!\n", | 229 | "\"minor\" must be between 0 and %d (%d)!\n", |
217 | MAX_IRCTL_DEVICES-1, d->minor); | 230 | MAX_IRCTL_DEVICES - 1, d->minor); |
218 | err = -EBADRQC; | 231 | err = -EBADRQC; |
219 | goto out; | 232 | goto out; |
220 | } | 233 | } |
@@ -369,7 +382,7 @@ int lirc_unregister_driver(int minor) | |||
369 | 382 | ||
370 | if (minor < 0 || minor >= MAX_IRCTL_DEVICES) { | 383 | if (minor < 0 || minor >= MAX_IRCTL_DEVICES) { |
371 | printk(KERN_ERR "lirc_dev: %s: minor (%d) must be between " | 384 | printk(KERN_ERR "lirc_dev: %s: minor (%d) must be between " |
372 | "0 and %d!\n", __func__, minor, MAX_IRCTL_DEVICES-1); | 385 | "0 and %d!\n", __func__, minor, MAX_IRCTL_DEVICES - 1); |
373 | return -EBADRQC; | 386 | return -EBADRQC; |
374 | } | 387 | } |
375 | 388 | ||
@@ -380,7 +393,7 @@ int lirc_unregister_driver(int minor) | |||
380 | return -ENOENT; | 393 | return -ENOENT; |
381 | } | 394 | } |
382 | 395 | ||
383 | cdev = &cdevs[minor]; | 396 | cdev = ir->cdev; |
384 | 397 | ||
385 | mutex_lock(&lirc_dev_lock); | 398 | mutex_lock(&lirc_dev_lock); |
386 | 399 | ||
@@ -410,6 +423,7 @@ int lirc_unregister_driver(int minor) | |||
410 | } else { | 423 | } else { |
411 | lirc_irctl_cleanup(ir); | 424 | lirc_irctl_cleanup(ir); |
412 | cdev_del(cdev); | 425 | cdev_del(cdev); |
426 | kfree(cdev); | ||
413 | kfree(ir); | 427 | kfree(ir); |
414 | irctls[minor] = NULL; | 428 | irctls[minor] = NULL; |
415 | } | 429 | } |
@@ -453,7 +467,7 @@ int lirc_dev_fop_open(struct inode *inode, struct file *file) | |||
453 | goto error; | 467 | goto error; |
454 | } | 468 | } |
455 | 469 | ||
456 | cdev = &cdevs[iminor(inode)]; | 470 | cdev = ir->cdev; |
457 | if (try_module_get(cdev->owner)) { | 471 | if (try_module_get(cdev->owner)) { |
458 | ir->open++; | 472 | ir->open++; |
459 | retval = ir->d.set_use_inc(ir->d.data); | 473 | retval = ir->d.set_use_inc(ir->d.data); |
@@ -484,13 +498,15 @@ EXPORT_SYMBOL(lirc_dev_fop_open); | |||
484 | int lirc_dev_fop_close(struct inode *inode, struct file *file) | 498 | int lirc_dev_fop_close(struct inode *inode, struct file *file) |
485 | { | 499 | { |
486 | struct irctl *ir = irctls[iminor(inode)]; | 500 | struct irctl *ir = irctls[iminor(inode)]; |
487 | struct cdev *cdev = &cdevs[iminor(inode)]; | 501 | struct cdev *cdev; |
488 | 502 | ||
489 | if (!ir) { | 503 | if (!ir) { |
490 | printk(KERN_ERR "%s: called with invalid irctl\n", __func__); | 504 | printk(KERN_ERR "%s: called with invalid irctl\n", __func__); |
491 | return -EINVAL; | 505 | return -EINVAL; |
492 | } | 506 | } |
493 | 507 | ||
508 | cdev = ir->cdev; | ||
509 | |||
494 | dev_dbg(ir->d.dev, LOGHEAD "close called\n", ir->d.name, ir->d.minor); | 510 | dev_dbg(ir->d.dev, LOGHEAD "close called\n", ir->d.name, ir->d.minor); |
495 | 511 | ||
496 | WARN_ON(mutex_lock_killable(&lirc_dev_lock)); | 512 | WARN_ON(mutex_lock_killable(&lirc_dev_lock)); |
@@ -503,6 +519,7 @@ int lirc_dev_fop_close(struct inode *inode, struct file *file) | |||
503 | lirc_irctl_cleanup(ir); | 519 | lirc_irctl_cleanup(ir); |
504 | cdev_del(cdev); | 520 | cdev_del(cdev); |
505 | irctls[ir->d.minor] = NULL; | 521 | irctls[ir->d.minor] = NULL; |
522 | kfree(cdev); | ||
506 | kfree(ir); | 523 | kfree(ir); |
507 | } | 524 | } |
508 | 525 | ||
diff --git a/drivers/media/rc/mceusb.c b/drivers/media/rc/mceusb.c index ad927fcaa020..06dfe0957b5e 100644 --- a/drivers/media/rc/mceusb.c +++ b/drivers/media/rc/mceusb.c | |||
@@ -108,6 +108,12 @@ static int debug = 1; | |||
108 | static int debug; | 108 | static int debug; |
109 | #endif | 109 | #endif |
110 | 110 | ||
111 | #define mce_dbg(dev, fmt, ...) \ | ||
112 | do { \ | ||
113 | if (debug) \ | ||
114 | dev_info(dev, fmt, ## __VA_ARGS__); \ | ||
115 | } while (0) | ||
116 | |||
111 | /* general constants */ | 117 | /* general constants */ |
112 | #define SEND_FLAG_IN_PROGRESS 1 | 118 | #define SEND_FLAG_IN_PROGRESS 1 |
113 | #define SEND_FLAG_COMPLETE 2 | 119 | #define SEND_FLAG_COMPLETE 2 |
@@ -246,6 +252,9 @@ static struct usb_device_id mceusb_dev_table[] = { | |||
246 | .driver_info = MCE_GEN2_TX_INV }, | 252 | .driver_info = MCE_GEN2_TX_INV }, |
247 | /* SMK eHome Infrared Transceiver */ | 253 | /* SMK eHome Infrared Transceiver */ |
248 | { USB_DEVICE(VENDOR_SMK, 0x0338) }, | 254 | { USB_DEVICE(VENDOR_SMK, 0x0338) }, |
255 | /* SMK/I-O Data GV-MC7/RCKIT Receiver */ | ||
256 | { USB_DEVICE(VENDOR_SMK, 0x0353), | ||
257 | .driver_info = MCE_GEN2_NO_TX }, | ||
249 | /* Tatung eHome Infrared Transceiver */ | 258 | /* Tatung eHome Infrared Transceiver */ |
250 | { USB_DEVICE(VENDOR_TATUNG, 0x9150) }, | 259 | { USB_DEVICE(VENDOR_TATUNG, 0x9150) }, |
251 | /* Shuttle eHome Infrared Transceiver */ | 260 | /* Shuttle eHome Infrared Transceiver */ |
@@ -606,12 +615,15 @@ static void mce_async_callback(struct urb *urb, struct pt_regs *regs) | |||
606 | if (ir) { | 615 | if (ir) { |
607 | len = urb->actual_length; | 616 | len = urb->actual_length; |
608 | 617 | ||
609 | dev_dbg(ir->dev, "callback called (status=%d len=%d)\n", | 618 | mce_dbg(ir->dev, "callback called (status=%d len=%d)\n", |
610 | urb->status, len); | 619 | urb->status, len); |
611 | 620 | ||
612 | mceusb_dev_printdata(ir, urb->transfer_buffer, 0, len, true); | 621 | mceusb_dev_printdata(ir, urb->transfer_buffer, 0, len, true); |
613 | } | 622 | } |
614 | 623 | ||
624 | /* the transfer buffer and urb were allocated in mce_request_packet */ | ||
625 | kfree(urb->transfer_buffer); | ||
626 | usb_free_urb(urb); | ||
615 | } | 627 | } |
616 | 628 | ||
617 | /* request incoming or send outgoing usb packet - used to initialize remote */ | 629 | /* request incoming or send outgoing usb packet - used to initialize remote */ |
@@ -655,17 +667,17 @@ static void mce_request_packet(struct mceusb_dev *ir, unsigned char *data, | |||
655 | return; | 667 | return; |
656 | } | 668 | } |
657 | 669 | ||
658 | dev_dbg(dev, "receive request called (size=%#x)\n", size); | 670 | mce_dbg(dev, "receive request called (size=%#x)\n", size); |
659 | 671 | ||
660 | async_urb->transfer_buffer_length = size; | 672 | async_urb->transfer_buffer_length = size; |
661 | async_urb->dev = ir->usbdev; | 673 | async_urb->dev = ir->usbdev; |
662 | 674 | ||
663 | res = usb_submit_urb(async_urb, GFP_ATOMIC); | 675 | res = usb_submit_urb(async_urb, GFP_ATOMIC); |
664 | if (res) { | 676 | if (res) { |
665 | dev_dbg(dev, "receive request FAILED! (res=%d)\n", res); | 677 | mce_dbg(dev, "receive request FAILED! (res=%d)\n", res); |
666 | return; | 678 | return; |
667 | } | 679 | } |
668 | dev_dbg(dev, "receive request complete (res=%d)\n", res); | 680 | mce_dbg(dev, "receive request complete (res=%d)\n", res); |
669 | } | 681 | } |
670 | 682 | ||
671 | static void mce_async_out(struct mceusb_dev *ir, unsigned char *data, int size) | 683 | static void mce_async_out(struct mceusb_dev *ir, unsigned char *data, int size) |
@@ -673,9 +685,9 @@ static void mce_async_out(struct mceusb_dev *ir, unsigned char *data, int size) | |||
673 | mce_request_packet(ir, data, size, MCEUSB_TX); | 685 | mce_request_packet(ir, data, size, MCEUSB_TX); |
674 | } | 686 | } |
675 | 687 | ||
676 | static void mce_sync_in(struct mceusb_dev *ir, unsigned char *data, int size) | 688 | static void mce_flush_rx_buffer(struct mceusb_dev *ir, int size) |
677 | { | 689 | { |
678 | mce_request_packet(ir, data, size, MCEUSB_RX); | 690 | mce_request_packet(ir, NULL, size, MCEUSB_RX); |
679 | } | 691 | } |
680 | 692 | ||
681 | /* Send data out the IR blaster port(s) */ | 693 | /* Send data out the IR blaster port(s) */ |
@@ -794,7 +806,7 @@ static int mceusb_set_tx_carrier(struct rc_dev *dev, u32 carrier) | |||
794 | ir->carrier = carrier; | 806 | ir->carrier = carrier; |
795 | cmdbuf[2] = MCE_CMD_SIG_END; | 807 | cmdbuf[2] = MCE_CMD_SIG_END; |
796 | cmdbuf[3] = MCE_IRDATA_TRAILER; | 808 | cmdbuf[3] = MCE_IRDATA_TRAILER; |
797 | dev_dbg(ir->dev, "%s: disabling carrier " | 809 | mce_dbg(ir->dev, "%s: disabling carrier " |
798 | "modulation\n", __func__); | 810 | "modulation\n", __func__); |
799 | mce_async_out(ir, cmdbuf, sizeof(cmdbuf)); | 811 | mce_async_out(ir, cmdbuf, sizeof(cmdbuf)); |
800 | return carrier; | 812 | return carrier; |
@@ -806,7 +818,7 @@ static int mceusb_set_tx_carrier(struct rc_dev *dev, u32 carrier) | |||
806 | ir->carrier = carrier; | 818 | ir->carrier = carrier; |
807 | cmdbuf[2] = prescaler; | 819 | cmdbuf[2] = prescaler; |
808 | cmdbuf[3] = divisor; | 820 | cmdbuf[3] = divisor; |
809 | dev_dbg(ir->dev, "%s: requesting %u HZ " | 821 | mce_dbg(ir->dev, "%s: requesting %u HZ " |
810 | "carrier\n", __func__, carrier); | 822 | "carrier\n", __func__, carrier); |
811 | 823 | ||
812 | /* Transmit new carrier to mce device */ | 824 | /* Transmit new carrier to mce device */ |
@@ -879,7 +891,7 @@ static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len) | |||
879 | rawir.duration = (ir->buf_in[i] & MCE_PULSE_MASK) | 891 | rawir.duration = (ir->buf_in[i] & MCE_PULSE_MASK) |
880 | * US_TO_NS(MCE_TIME_UNIT); | 892 | * US_TO_NS(MCE_TIME_UNIT); |
881 | 893 | ||
882 | dev_dbg(ir->dev, "Storing %s with duration %d\n", | 894 | mce_dbg(ir->dev, "Storing %s with duration %d\n", |
883 | rawir.pulse ? "pulse" : "space", | 895 | rawir.pulse ? "pulse" : "space", |
884 | rawir.duration); | 896 | rawir.duration); |
885 | 897 | ||
@@ -911,7 +923,7 @@ static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len) | |||
911 | if (ir->parser_state != CMD_HEADER && !ir->rem) | 923 | if (ir->parser_state != CMD_HEADER && !ir->rem) |
912 | ir->parser_state = CMD_HEADER; | 924 | ir->parser_state = CMD_HEADER; |
913 | } | 925 | } |
914 | dev_dbg(ir->dev, "processed IR data, calling ir_raw_event_handle\n"); | 926 | mce_dbg(ir->dev, "processed IR data, calling ir_raw_event_handle\n"); |
915 | ir_raw_event_handle(ir->rc); | 927 | ir_raw_event_handle(ir->rc); |
916 | } | 928 | } |
917 | 929 | ||
@@ -933,7 +945,7 @@ static void mceusb_dev_recv(struct urb *urb, struct pt_regs *regs) | |||
933 | 945 | ||
934 | if (ir->send_flags == RECV_FLAG_IN_PROGRESS) { | 946 | if (ir->send_flags == RECV_FLAG_IN_PROGRESS) { |
935 | ir->send_flags = SEND_FLAG_COMPLETE; | 947 | ir->send_flags = SEND_FLAG_COMPLETE; |
936 | dev_dbg(ir->dev, "setup answer received %d bytes\n", | 948 | mce_dbg(ir->dev, "setup answer received %d bytes\n", |
937 | buf_len); | 949 | buf_len); |
938 | } | 950 | } |
939 | 951 | ||
@@ -951,7 +963,7 @@ static void mceusb_dev_recv(struct urb *urb, struct pt_regs *regs) | |||
951 | 963 | ||
952 | case -EPIPE: | 964 | case -EPIPE: |
953 | default: | 965 | default: |
954 | dev_dbg(ir->dev, "Error: urb status = %d\n", urb->status); | 966 | mce_dbg(ir->dev, "Error: urb status = %d\n", urb->status); |
955 | break; | 967 | break; |
956 | } | 968 | } |
957 | 969 | ||
@@ -961,7 +973,6 @@ static void mceusb_dev_recv(struct urb *urb, struct pt_regs *regs) | |||
961 | static void mceusb_gen1_init(struct mceusb_dev *ir) | 973 | static void mceusb_gen1_init(struct mceusb_dev *ir) |
962 | { | 974 | { |
963 | int ret; | 975 | int ret; |
964 | int maxp = ir->len_in; | ||
965 | struct device *dev = ir->dev; | 976 | struct device *dev = ir->dev; |
966 | char *data; | 977 | char *data; |
967 | 978 | ||
@@ -978,8 +989,8 @@ static void mceusb_gen1_init(struct mceusb_dev *ir) | |||
978 | ret = usb_control_msg(ir->usbdev, usb_rcvctrlpipe(ir->usbdev, 0), | 989 | ret = usb_control_msg(ir->usbdev, usb_rcvctrlpipe(ir->usbdev, 0), |
979 | USB_REQ_SET_ADDRESS, USB_TYPE_VENDOR, 0, 0, | 990 | USB_REQ_SET_ADDRESS, USB_TYPE_VENDOR, 0, 0, |
980 | data, USB_CTRL_MSG_SZ, HZ * 3); | 991 | data, USB_CTRL_MSG_SZ, HZ * 3); |
981 | dev_dbg(dev, "%s - ret = %d\n", __func__, ret); | 992 | mce_dbg(dev, "%s - ret = %d\n", __func__, ret); |
982 | dev_dbg(dev, "%s - data[0] = %d, data[1] = %d\n", | 993 | mce_dbg(dev, "%s - data[0] = %d, data[1] = %d\n", |
983 | __func__, data[0], data[1]); | 994 | __func__, data[0], data[1]); |
984 | 995 | ||
985 | /* set feature: bit rate 38400 bps */ | 996 | /* set feature: bit rate 38400 bps */ |
@@ -987,71 +998,56 @@ static void mceusb_gen1_init(struct mceusb_dev *ir) | |||
987 | USB_REQ_SET_FEATURE, USB_TYPE_VENDOR, | 998 | USB_REQ_SET_FEATURE, USB_TYPE_VENDOR, |
988 | 0xc04e, 0x0000, NULL, 0, HZ * 3); | 999 | 0xc04e, 0x0000, NULL, 0, HZ * 3); |
989 | 1000 | ||
990 | dev_dbg(dev, "%s - ret = %d\n", __func__, ret); | 1001 | mce_dbg(dev, "%s - ret = %d\n", __func__, ret); |
991 | 1002 | ||
992 | /* bRequest 4: set char length to 8 bits */ | 1003 | /* bRequest 4: set char length to 8 bits */ |
993 | ret = usb_control_msg(ir->usbdev, usb_sndctrlpipe(ir->usbdev, 0), | 1004 | ret = usb_control_msg(ir->usbdev, usb_sndctrlpipe(ir->usbdev, 0), |
994 | 4, USB_TYPE_VENDOR, | 1005 | 4, USB_TYPE_VENDOR, |
995 | 0x0808, 0x0000, NULL, 0, HZ * 3); | 1006 | 0x0808, 0x0000, NULL, 0, HZ * 3); |
996 | dev_dbg(dev, "%s - retB = %d\n", __func__, ret); | 1007 | mce_dbg(dev, "%s - retB = %d\n", __func__, ret); |
997 | 1008 | ||
998 | /* bRequest 2: set handshaking to use DTR/DSR */ | 1009 | /* bRequest 2: set handshaking to use DTR/DSR */ |
999 | ret = usb_control_msg(ir->usbdev, usb_sndctrlpipe(ir->usbdev, 0), | 1010 | ret = usb_control_msg(ir->usbdev, usb_sndctrlpipe(ir->usbdev, 0), |
1000 | 2, USB_TYPE_VENDOR, | 1011 | 2, USB_TYPE_VENDOR, |
1001 | 0x0000, 0x0100, NULL, 0, HZ * 3); | 1012 | 0x0000, 0x0100, NULL, 0, HZ * 3); |
1002 | dev_dbg(dev, "%s - retC = %d\n", __func__, ret); | 1013 | mce_dbg(dev, "%s - retC = %d\n", __func__, ret); |
1003 | 1014 | ||
1004 | /* device reset */ | 1015 | /* device reset */ |
1005 | mce_async_out(ir, DEVICE_RESET, sizeof(DEVICE_RESET)); | 1016 | mce_async_out(ir, DEVICE_RESET, sizeof(DEVICE_RESET)); |
1006 | mce_sync_in(ir, NULL, maxp); | ||
1007 | 1017 | ||
1008 | /* get hw/sw revision? */ | 1018 | /* get hw/sw revision? */ |
1009 | mce_async_out(ir, GET_REVISION, sizeof(GET_REVISION)); | 1019 | mce_async_out(ir, GET_REVISION, sizeof(GET_REVISION)); |
1010 | mce_sync_in(ir, NULL, maxp); | ||
1011 | 1020 | ||
1012 | kfree(data); | 1021 | kfree(data); |
1013 | }; | 1022 | }; |
1014 | 1023 | ||
1015 | static void mceusb_gen2_init(struct mceusb_dev *ir) | 1024 | static void mceusb_gen2_init(struct mceusb_dev *ir) |
1016 | { | 1025 | { |
1017 | int maxp = ir->len_in; | ||
1018 | |||
1019 | /* device reset */ | 1026 | /* device reset */ |
1020 | mce_async_out(ir, DEVICE_RESET, sizeof(DEVICE_RESET)); | 1027 | mce_async_out(ir, DEVICE_RESET, sizeof(DEVICE_RESET)); |
1021 | mce_sync_in(ir, NULL, maxp); | ||
1022 | 1028 | ||
1023 | /* get hw/sw revision? */ | 1029 | /* get hw/sw revision? */ |
1024 | mce_async_out(ir, GET_REVISION, sizeof(GET_REVISION)); | 1030 | mce_async_out(ir, GET_REVISION, sizeof(GET_REVISION)); |
1025 | mce_sync_in(ir, NULL, maxp); | ||
1026 | 1031 | ||
1027 | /* unknown what the next two actually return... */ | 1032 | /* unknown what the next two actually return... */ |
1028 | mce_async_out(ir, GET_UNKNOWN, sizeof(GET_UNKNOWN)); | 1033 | mce_async_out(ir, GET_UNKNOWN, sizeof(GET_UNKNOWN)); |
1029 | mce_sync_in(ir, NULL, maxp); | ||
1030 | mce_async_out(ir, GET_UNKNOWN2, sizeof(GET_UNKNOWN2)); | 1034 | mce_async_out(ir, GET_UNKNOWN2, sizeof(GET_UNKNOWN2)); |
1031 | mce_sync_in(ir, NULL, maxp); | ||
1032 | } | 1035 | } |
1033 | 1036 | ||
1034 | static void mceusb_get_parameters(struct mceusb_dev *ir) | 1037 | static void mceusb_get_parameters(struct mceusb_dev *ir) |
1035 | { | 1038 | { |
1036 | int maxp = ir->len_in; | ||
1037 | |||
1038 | /* get the carrier and frequency */ | 1039 | /* get the carrier and frequency */ |
1039 | mce_async_out(ir, GET_CARRIER_FREQ, sizeof(GET_CARRIER_FREQ)); | 1040 | mce_async_out(ir, GET_CARRIER_FREQ, sizeof(GET_CARRIER_FREQ)); |
1040 | mce_sync_in(ir, NULL, maxp); | ||
1041 | 1041 | ||
1042 | if (!ir->flags.no_tx) { | 1042 | if (!ir->flags.no_tx) |
1043 | /* get the transmitter bitmask */ | 1043 | /* get the transmitter bitmask */ |
1044 | mce_async_out(ir, GET_TX_BITMASK, sizeof(GET_TX_BITMASK)); | 1044 | mce_async_out(ir, GET_TX_BITMASK, sizeof(GET_TX_BITMASK)); |
1045 | mce_sync_in(ir, NULL, maxp); | ||
1046 | } | ||
1047 | 1045 | ||
1048 | /* get receiver timeout value */ | 1046 | /* get receiver timeout value */ |
1049 | mce_async_out(ir, GET_RX_TIMEOUT, sizeof(GET_RX_TIMEOUT)); | 1047 | mce_async_out(ir, GET_RX_TIMEOUT, sizeof(GET_RX_TIMEOUT)); |
1050 | mce_sync_in(ir, NULL, maxp); | ||
1051 | 1048 | ||
1052 | /* get receiver sensor setting */ | 1049 | /* get receiver sensor setting */ |
1053 | mce_async_out(ir, GET_RX_SENSOR, sizeof(GET_RX_SENSOR)); | 1050 | mce_async_out(ir, GET_RX_SENSOR, sizeof(GET_RX_SENSOR)); |
1054 | mce_sync_in(ir, NULL, maxp); | ||
1055 | } | 1051 | } |
1056 | 1052 | ||
1057 | static struct rc_dev *mceusb_init_rc_dev(struct mceusb_dev *ir) | 1053 | static struct rc_dev *mceusb_init_rc_dev(struct mceusb_dev *ir) |
@@ -1122,7 +1118,7 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf, | |||
1122 | bool tx_mask_normal; | 1118 | bool tx_mask_normal; |
1123 | int ir_intfnum; | 1119 | int ir_intfnum; |
1124 | 1120 | ||
1125 | dev_dbg(&intf->dev, "%s called\n", __func__); | 1121 | mce_dbg(&intf->dev, "%s called\n", __func__); |
1126 | 1122 | ||
1127 | idesc = intf->cur_altsetting; | 1123 | idesc = intf->cur_altsetting; |
1128 | 1124 | ||
@@ -1150,7 +1146,7 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf, | |||
1150 | ep_in = ep; | 1146 | ep_in = ep; |
1151 | ep_in->bmAttributes = USB_ENDPOINT_XFER_INT; | 1147 | ep_in->bmAttributes = USB_ENDPOINT_XFER_INT; |
1152 | ep_in->bInterval = 1; | 1148 | ep_in->bInterval = 1; |
1153 | dev_dbg(&intf->dev, "acceptable inbound endpoint " | 1149 | mce_dbg(&intf->dev, "acceptable inbound endpoint " |
1154 | "found\n"); | 1150 | "found\n"); |
1155 | } | 1151 | } |
1156 | 1152 | ||
@@ -1165,12 +1161,12 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf, | |||
1165 | ep_out = ep; | 1161 | ep_out = ep; |
1166 | ep_out->bmAttributes = USB_ENDPOINT_XFER_INT; | 1162 | ep_out->bmAttributes = USB_ENDPOINT_XFER_INT; |
1167 | ep_out->bInterval = 1; | 1163 | ep_out->bInterval = 1; |
1168 | dev_dbg(&intf->dev, "acceptable outbound endpoint " | 1164 | mce_dbg(&intf->dev, "acceptable outbound endpoint " |
1169 | "found\n"); | 1165 | "found\n"); |
1170 | } | 1166 | } |
1171 | } | 1167 | } |
1172 | if (ep_in == NULL) { | 1168 | if (ep_in == NULL) { |
1173 | dev_dbg(&intf->dev, "inbound and/or endpoint not found\n"); | 1169 | mce_dbg(&intf->dev, "inbound and/or endpoint not found\n"); |
1174 | return -ENODEV; | 1170 | return -ENODEV; |
1175 | } | 1171 | } |
1176 | 1172 | ||
@@ -1215,16 +1211,16 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf, | |||
1215 | if (!ir->rc) | 1211 | if (!ir->rc) |
1216 | goto rc_dev_fail; | 1212 | goto rc_dev_fail; |
1217 | 1213 | ||
1218 | /* flush buffers on the device */ | ||
1219 | mce_sync_in(ir, NULL, maxp); | ||
1220 | mce_sync_in(ir, NULL, maxp); | ||
1221 | |||
1222 | /* wire up inbound data handler */ | 1214 | /* wire up inbound data handler */ |
1223 | usb_fill_int_urb(ir->urb_in, dev, pipe, ir->buf_in, | 1215 | usb_fill_int_urb(ir->urb_in, dev, pipe, ir->buf_in, |
1224 | maxp, (usb_complete_t) mceusb_dev_recv, ir, ep_in->bInterval); | 1216 | maxp, (usb_complete_t) mceusb_dev_recv, ir, ep_in->bInterval); |
1225 | ir->urb_in->transfer_dma = ir->dma_in; | 1217 | ir->urb_in->transfer_dma = ir->dma_in; |
1226 | ir->urb_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; | 1218 | ir->urb_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; |
1227 | 1219 | ||
1220 | /* flush buffers on the device */ | ||
1221 | mce_dbg(&intf->dev, "Flushing receive buffers\n"); | ||
1222 | mce_flush_rx_buffer(ir, maxp); | ||
1223 | |||
1228 | /* initialize device */ | 1224 | /* initialize device */ |
1229 | if (ir->flags.microsoft_gen1) | 1225 | if (ir->flags.microsoft_gen1) |
1230 | mceusb_gen1_init(ir); | 1226 | mceusb_gen1_init(ir); |
diff --git a/drivers/media/rc/nuvoton-cir.c b/drivers/media/rc/nuvoton-cir.c index bf3060ea6107..565f24c20d77 100644 --- a/drivers/media/rc/nuvoton-cir.c +++ b/drivers/media/rc/nuvoton-cir.c | |||
@@ -991,7 +991,6 @@ static int nvt_open(struct rc_dev *dev) | |||
991 | unsigned long flags; | 991 | unsigned long flags; |
992 | 992 | ||
993 | spin_lock_irqsave(&nvt->nvt_lock, flags); | 993 | spin_lock_irqsave(&nvt->nvt_lock, flags); |
994 | nvt->in_use = true; | ||
995 | nvt_enable_cir(nvt); | 994 | nvt_enable_cir(nvt); |
996 | spin_unlock_irqrestore(&nvt->nvt_lock, flags); | 995 | spin_unlock_irqrestore(&nvt->nvt_lock, flags); |
997 | 996 | ||
@@ -1004,7 +1003,6 @@ static void nvt_close(struct rc_dev *dev) | |||
1004 | unsigned long flags; | 1003 | unsigned long flags; |
1005 | 1004 | ||
1006 | spin_lock_irqsave(&nvt->nvt_lock, flags); | 1005 | spin_lock_irqsave(&nvt->nvt_lock, flags); |
1007 | nvt->in_use = false; | ||
1008 | nvt_disable_cir(nvt); | 1006 | nvt_disable_cir(nvt); |
1009 | spin_unlock_irqrestore(&nvt->nvt_lock, flags); | 1007 | spin_unlock_irqrestore(&nvt->nvt_lock, flags); |
1010 | } | 1008 | } |
diff --git a/drivers/media/rc/nuvoton-cir.h b/drivers/media/rc/nuvoton-cir.h index 379795d61ea7..1241fc89a36c 100644 --- a/drivers/media/rc/nuvoton-cir.h +++ b/drivers/media/rc/nuvoton-cir.h | |||
@@ -70,7 +70,6 @@ struct nvt_dev { | |||
70 | struct ir_raw_event rawir; | 70 | struct ir_raw_event rawir; |
71 | 71 | ||
72 | spinlock_t nvt_lock; | 72 | spinlock_t nvt_lock; |
73 | bool in_use; | ||
74 | 73 | ||
75 | /* for rx */ | 74 | /* for rx */ |
76 | u8 buf[RX_BUF_LEN]; | 75 | u8 buf[RX_BUF_LEN]; |
diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c index f57cd5677ac2..3186ac7c2c10 100644 --- a/drivers/media/rc/rc-main.c +++ b/drivers/media/rc/rc-main.c | |||
@@ -522,18 +522,20 @@ EXPORT_SYMBOL_GPL(rc_g_keycode_from_table); | |||
522 | /** | 522 | /** |
523 | * ir_do_keyup() - internal function to signal the release of a keypress | 523 | * ir_do_keyup() - internal function to signal the release of a keypress |
524 | * @dev: the struct rc_dev descriptor of the device | 524 | * @dev: the struct rc_dev descriptor of the device |
525 | * @sync: whether or not to call input_sync | ||
525 | * | 526 | * |
526 | * This function is used internally to release a keypress, it must be | 527 | * This function is used internally to release a keypress, it must be |
527 | * called with keylock held. | 528 | * called with keylock held. |
528 | */ | 529 | */ |
529 | static void ir_do_keyup(struct rc_dev *dev) | 530 | static void ir_do_keyup(struct rc_dev *dev, bool sync) |
530 | { | 531 | { |
531 | if (!dev->keypressed) | 532 | if (!dev->keypressed) |
532 | return; | 533 | return; |
533 | 534 | ||
534 | IR_dprintk(1, "keyup key 0x%04x\n", dev->last_keycode); | 535 | IR_dprintk(1, "keyup key 0x%04x\n", dev->last_keycode); |
535 | input_report_key(dev->input_dev, dev->last_keycode, 0); | 536 | input_report_key(dev->input_dev, dev->last_keycode, 0); |
536 | input_sync(dev->input_dev); | 537 | if (sync) |
538 | input_sync(dev->input_dev); | ||
537 | dev->keypressed = false; | 539 | dev->keypressed = false; |
538 | } | 540 | } |
539 | 541 | ||
@@ -549,7 +551,7 @@ void rc_keyup(struct rc_dev *dev) | |||
549 | unsigned long flags; | 551 | unsigned long flags; |
550 | 552 | ||
551 | spin_lock_irqsave(&dev->keylock, flags); | 553 | spin_lock_irqsave(&dev->keylock, flags); |
552 | ir_do_keyup(dev); | 554 | ir_do_keyup(dev, true); |
553 | spin_unlock_irqrestore(&dev->keylock, flags); | 555 | spin_unlock_irqrestore(&dev->keylock, flags); |
554 | } | 556 | } |
555 | EXPORT_SYMBOL_GPL(rc_keyup); | 557 | EXPORT_SYMBOL_GPL(rc_keyup); |
@@ -578,7 +580,7 @@ static void ir_timer_keyup(unsigned long cookie) | |||
578 | */ | 580 | */ |
579 | spin_lock_irqsave(&dev->keylock, flags); | 581 | spin_lock_irqsave(&dev->keylock, flags); |
580 | if (time_is_before_eq_jiffies(dev->keyup_jiffies)) | 582 | if (time_is_before_eq_jiffies(dev->keyup_jiffies)) |
581 | ir_do_keyup(dev); | 583 | ir_do_keyup(dev, true); |
582 | spin_unlock_irqrestore(&dev->keylock, flags); | 584 | spin_unlock_irqrestore(&dev->keylock, flags); |
583 | } | 585 | } |
584 | 586 | ||
@@ -597,6 +599,7 @@ void rc_repeat(struct rc_dev *dev) | |||
597 | spin_lock_irqsave(&dev->keylock, flags); | 599 | spin_lock_irqsave(&dev->keylock, flags); |
598 | 600 | ||
599 | input_event(dev->input_dev, EV_MSC, MSC_SCAN, dev->last_scancode); | 601 | input_event(dev->input_dev, EV_MSC, MSC_SCAN, dev->last_scancode); |
602 | input_sync(dev->input_dev); | ||
600 | 603 | ||
601 | if (!dev->keypressed) | 604 | if (!dev->keypressed) |
602 | goto out; | 605 | goto out; |
@@ -622,29 +625,28 @@ EXPORT_SYMBOL_GPL(rc_repeat); | |||
622 | static void ir_do_keydown(struct rc_dev *dev, int scancode, | 625 | static void ir_do_keydown(struct rc_dev *dev, int scancode, |
623 | u32 keycode, u8 toggle) | 626 | u32 keycode, u8 toggle) |
624 | { | 627 | { |
625 | input_event(dev->input_dev, EV_MSC, MSC_SCAN, scancode); | 628 | bool new_event = !dev->keypressed || |
626 | 629 | dev->last_scancode != scancode || | |
627 | /* Repeat event? */ | 630 | dev->last_toggle != toggle; |
628 | if (dev->keypressed && | ||
629 | dev->last_scancode == scancode && | ||
630 | dev->last_toggle == toggle) | ||
631 | return; | ||
632 | 631 | ||
633 | /* Release old keypress */ | 632 | if (new_event && dev->keypressed) |
634 | ir_do_keyup(dev); | 633 | ir_do_keyup(dev, false); |
635 | 634 | ||
636 | dev->last_scancode = scancode; | 635 | input_event(dev->input_dev, EV_MSC, MSC_SCAN, scancode); |
637 | dev->last_toggle = toggle; | ||
638 | dev->last_keycode = keycode; | ||
639 | 636 | ||
640 | if (keycode == KEY_RESERVED) | 637 | if (new_event && keycode != KEY_RESERVED) { |
641 | return; | 638 | /* Register a keypress */ |
639 | dev->keypressed = true; | ||
640 | dev->last_scancode = scancode; | ||
641 | dev->last_toggle = toggle; | ||
642 | dev->last_keycode = keycode; | ||
643 | |||
644 | IR_dprintk(1, "%s: key down event, " | ||
645 | "key 0x%04x, scancode 0x%04x\n", | ||
646 | dev->input_name, keycode, scancode); | ||
647 | input_report_key(dev->input_dev, keycode, 1); | ||
648 | } | ||
642 | 649 | ||
643 | /* Register a keypress */ | ||
644 | dev->keypressed = true; | ||
645 | IR_dprintk(1, "%s: key down event, key 0x%04x, scancode 0x%04x\n", | ||
646 | dev->input_name, keycode, scancode); | ||
647 | input_report_key(dev->input_dev, dev->last_keycode, 1); | ||
648 | input_sync(dev->input_dev); | 650 | input_sync(dev->input_dev); |
649 | } | 651 | } |
650 | 652 | ||