summaryrefslogtreecommitdiffstats
path: root/abs/core/lirc/lirc_mod_mce.patch
blob: 1dc66442b73c08f311235f9d5e51ac244ec40a72 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
diff -Naru lirc_mod_mce/lirc_mod_mce.c lirc_mod_mce_new/lirc_mod_mce.c
--- lirc_mod_mce/lirc_mod_mce.c	2008-04-18 02:12:28.000000000 +0930
+++ lirc_mod_mce_new/lirc_mod_mce.c	2009-11-22 18:45:24.000000000 +1030
@@ -171,17 +171,76 @@
 #define VENDOR_TATUNG           0x1460
 #define VENDOR_GATEWAY          0x107b
 #define VENDOR_SHUTTLE          0x1308
+#define VENDOR_PHILIPS          0x0471
+#define VENDOR_SMK              0x0609
+#define VENDOR_TATUNG           0x1460
+#define VENDOR_GATEWAY          0x107b
+#define VENDOR_SHUTTLE          0x1308
+#define VENDOR_SHUTTLE2         0x051c
+#define VENDOR_MITSUMI          0x03ee
+#define VENDOR_TOPSEED          0x1784
+#define VENDOR_RICAVISION       0x179d
+#define VENDOR_ITRON            0x195d
+#define VENDOR_FIC              0x1509
+#define VENDOR_LG               0x043e
+#define VENDOR_MICROSOFT        0x045e
+#define VENDOR_FORMOSA          0x147a
+#define VENDOR_FINTEK           0x1934
 #define VENDOR_PINNACLE         0x2304
 
-
 static struct usb_device_id usb_remote_table [] = {
-    { USB_DEVICE(VENDOR_PHILIPS, 0x0815) },  /* Philips eHome Infrared Transciever */
-    { USB_DEVICE(VENDOR_SMK, 0x031d) },      /* SMK/Toshiba G83C0004D410 */
-    { USB_DEVICE(VENDOR_TATUNG, 0x9150) },   /* Tatung eHome Infrared Transceiver */
-    { USB_DEVICE(VENDOR_SHUTTLE, 0xc001) },  /* Shuttle eHome Infrared Transceiver */
-    { USB_DEVICE(VENDOR_GATEWAY, 0x3009) },  /* Gateway eHome Infrared Transceiver */
-    { USB_DEVICE(VENDOR_PINNACLE, 0x0225) }, /* Pinnacle Remote USB RC6 */
-    { }                                      /* Terminating entry */
+    /* Philips eHome Infrared Transciever */
+    { USB_DEVICE(VENDOR_PHILIPS, 0x0815) },
+    /* Philips Infrared Transciever - HP branded */
+    { USB_DEVICE(VENDOR_PHILIPS, 0x060c) },
+    /* Philips SRM5100 */
+    { USB_DEVICE(VENDOR_PHILIPS, 0x060d) },
+    /* SMK/Toshiba G83C0004D410 */
+    { USB_DEVICE(VENDOR_SMK, 0x031d) },
+    /* SMK eHome Infrared Transceiver (Sony VAIO) */
+    { USB_DEVICE(VENDOR_SMK, 0x0322) },
+    /* bundled with Hauppauge PVR-150 */
+    { USB_DEVICE(VENDOR_SMK, 0x0334) },
+    /* Tatung eHome Infrared Transceiver */
+    { USB_DEVICE(VENDOR_TATUNG, 0x9150) },
+    /* Shuttle eHome Infrared Transceiver */
+    { USB_DEVICE(VENDOR_SHUTTLE, 0xc001) },
+    /* Shuttle eHome Infrared Transceiver */
+    { USB_DEVICE(VENDOR_SHUTTLE2, 0xc001) },
+    /* Gateway eHome Infrared Transceiver */
+    { USB_DEVICE(VENDOR_GATEWAY, 0x3009) },
+    /* Mitsumi */
+    { USB_DEVICE(VENDOR_MITSUMI, 0x2501) },
+    /* Topseed eHome Infrared Transceiver */
+    { USB_DEVICE(VENDOR_TOPSEED, 0x0001) },
+    /* Topseed HP eHome Infrared Transceiver */
+    { USB_DEVICE(VENDOR_TOPSEED, 0x0006) },
+    /* Topseed eHome Infrared Transceiver */
+    { USB_DEVICE(VENDOR_TOPSEED, 0x0007) },
+    /* Topseed eHome Infrared Transceiver */
+    { USB_DEVICE(VENDOR_TOPSEED, 0x0008) },
+    /* Ricavision internal Infrared Transceiver */
+    { USB_DEVICE(VENDOR_RICAVISION, 0x0010) },
+    /* Itron ione Libra Q-11 */
+    { USB_DEVICE(VENDOR_ITRON, 0x7002) },
+    /* FIC eHome Infrared Transceiver */
+    { USB_DEVICE(VENDOR_FIC, 0x9242) },
+    /* LG eHome Infrared Transceiver */
+    { USB_DEVICE(VENDOR_LG, 0x9803) },
+    /* Microsoft MCE Infrared Transceiver */
+    { USB_DEVICE(VENDOR_MICROSOFT, 0x00a0) },
+    /* Formosa eHome Infrared Transceiver */
+    { USB_DEVICE(VENDOR_FORMOSA, 0xe015) },
+    /* Formosa aim / Trust MCE Infrared Receiver */
+    { USB_DEVICE(VENDOR_FORMOSA, 0xe017) },
+    /* Formosa Industrial Computing / Beanbag Emulation Device */
+    { USB_DEVICE(VENDOR_FORMOSA, 0xe018) },
+    /* Fintek eHome Infrared Transceiver */
+    { USB_DEVICE(VENDOR_FINTEK, 0x0602) },
+    /* Pinnacle Remote USB RC6 */
+    { USB_DEVICE(VENDOR_PINNACLE, 0x0225) },
+    /* Terminating entry */
+    { }
 };
 
 static unsigned char usb_kbd_keycode[256] = {
@@ -252,6 +311,8 @@
     struct semaphore lock;
     char name[NAME_BUFSIZE];
     char phys[NAME_BUFSIZE];
+
+    unsigned int carrier_freq;
 };
 
 /* init strings */
@@ -889,6 +950,51 @@
     }
 }
 
+/* Sets the send carrier frequency */
+static int set_send_carrier(struct irctl *ir, int carrier)
+{
+    	int clk = 10000000;
+	int prescaler = 0, divisor = 0;
+	unsigned char cmdbuf[] = { 0x9F, 0x06, 0x01, 0x80 };
+
+	/* Carrier is changed */
+	if (ir->carrier_freq != carrier) {
+
+		if (carrier <= 0) {
+			ir->carrier_freq = carrier;
+			dprintk(DRIVER_NAME "[%d]: SET_CARRIER disabling "
+				"carrier modulation\n", ir->devnum);
+			request_packet_async(ir, ir->usb_ep_out,
+					     cmdbuf, sizeof(cmdbuf),
+					     PHILUSB_OUTBOUND);
+			return carrier;
+		}
+
+		for (prescaler = 0; prescaler < 4; ++prescaler) {
+			divisor = (clk >> (2 * prescaler)) / carrier;
+			if (divisor <= 0xFF) {
+				ir->carrier_freq = carrier;
+				cmdbuf[2] = prescaler;
+				cmdbuf[3] = divisor;
+				dprintk(DRIVER_NAME "[%d]: SET_CARRIER "
+					"requesting %d Hz\n",
+					ir->devnum, carrier);
+
+				/* Transmit new carrier to mce device */
+				request_packet_async(ir, ir->usb_ep_out,
+						     cmdbuf, sizeof(cmdbuf),
+						     PHILUSB_OUTBOUND);
+				return carrier;
+			}
+		}
+
+		return -EINVAL;
+
+	}
+
+	return carrier;
+}
+
 static int input_open(struct input_dev *id)
 {
     return 0;
@@ -945,6 +1051,18 @@
         if(lvalue!=(LIRC_MODE_PULSE&LIRC_CAN_SEND_MASK)) return -EINVAL;
         break;
 
+    case LIRC_SET_SEND_CARRIER:
+        /* Retrieve lirc_plugin data for the device */
+        ir=lirc_get_pdata(filep);
+        if (!ir && !ir->usb_ep_out) return -EFAULT;
+
+	result = get_user(ivalue, (unsigned int *) arg);
+	if (result)
+	    return result;
+
+	set_send_carrier(ir, ivalue);
+	break;
+
     default:
         return -ENOIOCTLCMD;
     }
@@ -1047,7 +1165,8 @@
             plugin->minor = -1;
             plugin->features = LIRC_CAN_SEND_PULSE |
                                 LIRC_CAN_SET_TRANSMITTER_MASK |
-                                LIRC_CAN_REC_MODE2;
+                                LIRC_CAN_REC_MODE2 |
+                                LIRC_CAN_SET_SEND_CARRIER;
             plugin->data = ir;
             plugin->rbuf = rbuf;
             plugin->set_use_inc = &set_use_inc;
@@ -1108,7 +1227,7 @@
     input_dev->name = ir->name;
     input_dev->phys = ir->phys;
     usb_to_input_id(dev, &input_dev->id);
-    input_dev->cdev.dev = &dev->dev;
+    input_dev->dev.parent = &dev->dev;
     input_dev->evbit[BIT_WORD(EV_KEY)] |= BIT_MASK(EV_KEY);
     input_dev->evbit[BIT_WORD(EV_REL)] |= BIT_MASK(EV_REL);
     input_dev->relbit[BIT_WORD(REL_X)] |= BIT_MASK(REL_X);