aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/cx88/cx88-input.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/cx88/cx88-input.c')
-rw-r--r--drivers/media/video/cx88/cx88-input.c78
1 files changed, 44 insertions, 34 deletions
diff --git a/drivers/media/video/cx88/cx88-input.c b/drivers/media/video/cx88/cx88-input.c
index d91f5c51206d..78b3635178af 100644
--- a/drivers/media/video/cx88/cx88-input.c
+++ b/drivers/media/video/cx88/cx88-input.c
@@ -23,7 +23,7 @@
23 */ 23 */
24 24
25#include <linux/init.h> 25#include <linux/init.h>
26#include <linux/delay.h> 26#include <linux/hrtimer.h>
27#include <linux/input.h> 27#include <linux/input.h>
28#include <linux/pci.h> 28#include <linux/pci.h>
29#include <linux/module.h> 29#include <linux/module.h>
@@ -48,7 +48,7 @@ struct cx88_IR {
48 48
49 /* poll external decoder */ 49 /* poll external decoder */
50 int polling; 50 int polling;
51 struct delayed_work work; 51 struct hrtimer timer;
52 u32 gpio_addr; 52 u32 gpio_addr;
53 u32 last_gpio; 53 u32 last_gpio;
54 u32 mask_keycode; 54 u32 mask_keycode;
@@ -144,19 +144,28 @@ static void cx88_ir_handle_key(struct cx88_IR *ir)
144 } 144 }
145} 145}
146 146
147static void cx88_ir_work(struct work_struct *work) 147static enum hrtimer_restart cx88_ir_work(struct hrtimer *timer)
148{ 148{
149 struct cx88_IR *ir = container_of(work, struct cx88_IR, work.work); 149 unsigned long missed;
150 struct cx88_IR *ir = container_of(timer, struct cx88_IR, timer);
150 151
151 cx88_ir_handle_key(ir); 152 cx88_ir_handle_key(ir);
152 schedule_delayed_work(&ir->work, msecs_to_jiffies(ir->polling)); 153 missed = hrtimer_forward_now(&ir->timer,
154 ktime_set(0, ir->polling * 1000000));
155 if (missed > 1)
156 ir_dprintk("Missed ticks %ld\n", missed - 1);
157
158 return HRTIMER_RESTART;
153} 159}
154 160
155void cx88_ir_start(struct cx88_core *core, struct cx88_IR *ir) 161void cx88_ir_start(struct cx88_core *core, struct cx88_IR *ir)
156{ 162{
157 if (ir->polling) { 163 if (ir->polling) {
158 INIT_DELAYED_WORK(&ir->work, cx88_ir_work); 164 hrtimer_init(&ir->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
159 schedule_delayed_work(&ir->work, 0); 165 ir->timer.function = cx88_ir_work;
166 hrtimer_start(&ir->timer,
167 ktime_set(0, ir->polling * 1000000),
168 HRTIMER_MODE_REL);
160 } 169 }
161 if (ir->sampling) { 170 if (ir->sampling) {
162 core->pci_irqmask |= PCI_INT_IR_SMPINT; 171 core->pci_irqmask |= PCI_INT_IR_SMPINT;
@@ -173,7 +182,7 @@ void cx88_ir_stop(struct cx88_core *core, struct cx88_IR *ir)
173 } 182 }
174 183
175 if (ir->polling) 184 if (ir->polling)
176 cancel_delayed_work_sync(&ir->work); 185 hrtimer_cancel(&ir->timer);
177} 186}
178 187
179/* ---------------------------------------------------------------------- */ 188/* ---------------------------------------------------------------------- */
@@ -182,7 +191,7 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci)
182{ 191{
183 struct cx88_IR *ir; 192 struct cx88_IR *ir;
184 struct input_dev *input_dev; 193 struct input_dev *input_dev;
185 IR_KEYTAB_TYPE *ir_codes = NULL; 194 struct ir_scancode_table *ir_codes = NULL;
186 int ir_type = IR_TYPE_OTHER; 195 int ir_type = IR_TYPE_OTHER;
187 int err = -ENOMEM; 196 int err = -ENOMEM;
188 197
@@ -198,14 +207,14 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci)
198 case CX88_BOARD_DNTV_LIVE_DVB_T: 207 case CX88_BOARD_DNTV_LIVE_DVB_T:
199 case CX88_BOARD_KWORLD_DVB_T: 208 case CX88_BOARD_KWORLD_DVB_T:
200 case CX88_BOARD_KWORLD_DVB_T_CX22702: 209 case CX88_BOARD_KWORLD_DVB_T_CX22702:
201 ir_codes = ir_codes_dntv_live_dvb_t; 210 ir_codes = &ir_codes_dntv_live_dvb_t_table;
202 ir->gpio_addr = MO_GP1_IO; 211 ir->gpio_addr = MO_GP1_IO;
203 ir->mask_keycode = 0x1f; 212 ir->mask_keycode = 0x1f;
204 ir->mask_keyup = 0x60; 213 ir->mask_keyup = 0x60;
205 ir->polling = 50; /* ms */ 214 ir->polling = 50; /* ms */
206 break; 215 break;
207 case CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1: 216 case CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1:
208 ir_codes = ir_codes_cinergy_1400; 217 ir_codes = &ir_codes_cinergy_1400_table;
209 ir_type = IR_TYPE_PD; 218 ir_type = IR_TYPE_PD;
210 ir->sampling = 0xeb04; /* address */ 219 ir->sampling = 0xeb04; /* address */
211 break; 220 break;
@@ -220,13 +229,14 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci)
220 case CX88_BOARD_PCHDTV_HD3000: 229 case CX88_BOARD_PCHDTV_HD3000:
221 case CX88_BOARD_PCHDTV_HD5500: 230 case CX88_BOARD_PCHDTV_HD5500:
222 case CX88_BOARD_HAUPPAUGE_IRONLY: 231 case CX88_BOARD_HAUPPAUGE_IRONLY:
223 ir_codes = ir_codes_hauppauge_new; 232 ir_codes = &ir_codes_hauppauge_new_table;
224 ir_type = IR_TYPE_RC5; 233 ir_type = IR_TYPE_RC5;
225 ir->sampling = 1; 234 ir->sampling = 1;
226 break; 235 break;
227 case CX88_BOARD_WINFAST_DTV2000H: 236 case CX88_BOARD_WINFAST_DTV2000H:
237 case CX88_BOARD_WINFAST_DTV2000H_J:
228 case CX88_BOARD_WINFAST_DTV1800H: 238 case CX88_BOARD_WINFAST_DTV1800H:
229 ir_codes = ir_codes_winfast; 239 ir_codes = &ir_codes_winfast_table;
230 ir->gpio_addr = MO_GP0_IO; 240 ir->gpio_addr = MO_GP0_IO;
231 ir->mask_keycode = 0x8f8; 241 ir->mask_keycode = 0x8f8;
232 ir->mask_keyup = 0x100; 242 ir->mask_keyup = 0x100;
@@ -235,14 +245,14 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci)
235 case CX88_BOARD_WINFAST2000XP_EXPERT: 245 case CX88_BOARD_WINFAST2000XP_EXPERT:
236 case CX88_BOARD_WINFAST_DTV1000: 246 case CX88_BOARD_WINFAST_DTV1000:
237 case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL: 247 case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
238 ir_codes = ir_codes_winfast; 248 ir_codes = &ir_codes_winfast_table;
239 ir->gpio_addr = MO_GP0_IO; 249 ir->gpio_addr = MO_GP0_IO;
240 ir->mask_keycode = 0x8f8; 250 ir->mask_keycode = 0x8f8;
241 ir->mask_keyup = 0x100; 251 ir->mask_keyup = 0x100;
242 ir->polling = 1; /* ms */ 252 ir->polling = 1; /* ms */
243 break; 253 break;
244 case CX88_BOARD_IODATA_GVBCTV7E: 254 case CX88_BOARD_IODATA_GVBCTV7E:
245 ir_codes = ir_codes_iodata_bctv7e; 255 ir_codes = &ir_codes_iodata_bctv7e_table;
246 ir->gpio_addr = MO_GP0_IO; 256 ir->gpio_addr = MO_GP0_IO;
247 ir->mask_keycode = 0xfd; 257 ir->mask_keycode = 0xfd;
248 ir->mask_keydown = 0x02; 258 ir->mask_keydown = 0x02;
@@ -250,7 +260,7 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci)
250 break; 260 break;
251 case CX88_BOARD_PROLINK_PLAYTVPVR: 261 case CX88_BOARD_PROLINK_PLAYTVPVR:
252 case CX88_BOARD_PIXELVIEW_PLAYTV_ULTRA_PRO: 262 case CX88_BOARD_PIXELVIEW_PLAYTV_ULTRA_PRO:
253 ir_codes = ir_codes_pixelview; 263 ir_codes = &ir_codes_pixelview_table;
254 ir->gpio_addr = MO_GP1_IO; 264 ir->gpio_addr = MO_GP1_IO;
255 ir->mask_keycode = 0x1f; 265 ir->mask_keycode = 0x1f;
256 ir->mask_keyup = 0x80; 266 ir->mask_keyup = 0x80;
@@ -258,28 +268,28 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci)
258 break; 268 break;
259 case CX88_BOARD_PROLINK_PV_8000GT: 269 case CX88_BOARD_PROLINK_PV_8000GT:
260 case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME: 270 case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:
261 ir_codes = ir_codes_pixelview_new; 271 ir_codes = &ir_codes_pixelview_new_table;
262 ir->gpio_addr = MO_GP1_IO; 272 ir->gpio_addr = MO_GP1_IO;
263 ir->mask_keycode = 0x3f; 273 ir->mask_keycode = 0x3f;
264 ir->mask_keyup = 0x80; 274 ir->mask_keyup = 0x80;
265 ir->polling = 1; /* ms */ 275 ir->polling = 1; /* ms */
266 break; 276 break;
267 case CX88_BOARD_KWORLD_LTV883: 277 case CX88_BOARD_KWORLD_LTV883:
268 ir_codes = ir_codes_pixelview; 278 ir_codes = &ir_codes_pixelview_table;
269 ir->gpio_addr = MO_GP1_IO; 279 ir->gpio_addr = MO_GP1_IO;
270 ir->mask_keycode = 0x1f; 280 ir->mask_keycode = 0x1f;
271 ir->mask_keyup = 0x60; 281 ir->mask_keyup = 0x60;
272 ir->polling = 1; /* ms */ 282 ir->polling = 1; /* ms */
273 break; 283 break;
274 case CX88_BOARD_ADSTECH_DVB_T_PCI: 284 case CX88_BOARD_ADSTECH_DVB_T_PCI:
275 ir_codes = ir_codes_adstech_dvb_t_pci; 285 ir_codes = &ir_codes_adstech_dvb_t_pci_table;
276 ir->gpio_addr = MO_GP1_IO; 286 ir->gpio_addr = MO_GP1_IO;
277 ir->mask_keycode = 0xbf; 287 ir->mask_keycode = 0xbf;
278 ir->mask_keyup = 0x40; 288 ir->mask_keyup = 0x40;
279 ir->polling = 50; /* ms */ 289 ir->polling = 50; /* ms */
280 break; 290 break;
281 case CX88_BOARD_MSI_TVANYWHERE_MASTER: 291 case CX88_BOARD_MSI_TVANYWHERE_MASTER:
282 ir_codes = ir_codes_msi_tvanywhere; 292 ir_codes = &ir_codes_msi_tvanywhere_table;
283 ir->gpio_addr = MO_GP1_IO; 293 ir->gpio_addr = MO_GP1_IO;
284 ir->mask_keycode = 0x1f; 294 ir->mask_keycode = 0x1f;
285 ir->mask_keyup = 0x40; 295 ir->mask_keyup = 0x40;
@@ -287,40 +297,40 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci)
287 break; 297 break;
288 case CX88_BOARD_AVERTV_303: 298 case CX88_BOARD_AVERTV_303:
289 case CX88_BOARD_AVERTV_STUDIO_303: 299 case CX88_BOARD_AVERTV_STUDIO_303:
290 ir_codes = ir_codes_avertv_303; 300 ir_codes = &ir_codes_avertv_303_table;
291 ir->gpio_addr = MO_GP2_IO; 301 ir->gpio_addr = MO_GP2_IO;
292 ir->mask_keycode = 0xfb; 302 ir->mask_keycode = 0xfb;
293 ir->mask_keydown = 0x02; 303 ir->mask_keydown = 0x02;
294 ir->polling = 50; /* ms */ 304 ir->polling = 50; /* ms */
295 break; 305 break;
296 case CX88_BOARD_DNTV_LIVE_DVB_T_PRO: 306 case CX88_BOARD_DNTV_LIVE_DVB_T_PRO:
297 ir_codes = ir_codes_dntv_live_dvbt_pro; 307 ir_codes = &ir_codes_dntv_live_dvbt_pro_table;
298 ir_type = IR_TYPE_PD; 308 ir_type = IR_TYPE_PD;
299 ir->sampling = 0xff00; /* address */ 309 ir->sampling = 0xff00; /* address */
300 break; 310 break;
301 case CX88_BOARD_NORWOOD_MICRO: 311 case CX88_BOARD_NORWOOD_MICRO:
302 ir_codes = ir_codes_norwood; 312 ir_codes = &ir_codes_norwood_table;
303 ir->gpio_addr = MO_GP1_IO; 313 ir->gpio_addr = MO_GP1_IO;
304 ir->mask_keycode = 0x0e; 314 ir->mask_keycode = 0x0e;
305 ir->mask_keyup = 0x80; 315 ir->mask_keyup = 0x80;
306 ir->polling = 50; /* ms */ 316 ir->polling = 50; /* ms */
307 break; 317 break;
308 case CX88_BOARD_NPGTECH_REALTV_TOP10FM: 318 case CX88_BOARD_NPGTECH_REALTV_TOP10FM:
309 ir_codes = ir_codes_npgtech; 319 ir_codes = &ir_codes_npgtech_table;
310 ir->gpio_addr = MO_GP0_IO; 320 ir->gpio_addr = MO_GP0_IO;
311 ir->mask_keycode = 0xfa; 321 ir->mask_keycode = 0xfa;
312 ir->polling = 50; /* ms */ 322 ir->polling = 50; /* ms */
313 break; 323 break;
314 case CX88_BOARD_PINNACLE_PCTV_HD_800i: 324 case CX88_BOARD_PINNACLE_PCTV_HD_800i:
315 ir_codes = ir_codes_pinnacle_pctv_hd; 325 ir_codes = &ir_codes_pinnacle_pctv_hd_table;
316 ir_type = IR_TYPE_RC5; 326 ir_type = IR_TYPE_RC5;
317 ir->sampling = 1; 327 ir->sampling = 1;
318 break; 328 break;
319 case CX88_BOARD_POWERCOLOR_REAL_ANGEL: 329 case CX88_BOARD_POWERCOLOR_REAL_ANGEL:
320 ir_codes = ir_codes_powercolor_real_angel; 330 ir_codes = &ir_codes_powercolor_real_angel_table;
321 ir->gpio_addr = MO_GP2_IO; 331 ir->gpio_addr = MO_GP2_IO;
322 ir->mask_keycode = 0x7e; 332 ir->mask_keycode = 0x7e;
323 ir->polling = 100; /* ms */ 333 ir->polling = 100; /* ms */
324 break; 334 break;
325 } 335 }
326 336