diff options
Diffstat (limited to 'drivers/media/video/cx88/cx88-input.c')
-rw-r--r-- | drivers/media/video/cx88/cx88-input.c | 78 |
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 | ||
147 | static void cx88_ir_work(struct work_struct *work) | 147 | static 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 | ||
155 | void cx88_ir_start(struct cx88_core *core, struct cx88_IR *ir) | 161 | void 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 | ||