diff options
Diffstat (limited to 'drivers/media/video/saa7134')
-rw-r--r-- | drivers/media/video/saa7134/Kconfig | 2 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134-alsa.c | 16 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134-cards.c | 41 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134-dvb.c | 169 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134-empress.c | 8 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134-input.c | 20 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134-tvaudio.c | 42 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134.h | 6 |
8 files changed, 99 insertions, 205 deletions
diff --git a/drivers/media/video/saa7134/Kconfig b/drivers/media/video/saa7134/Kconfig index 309dca368f4a..9f1417a4f7d2 100644 --- a/drivers/media/video/saa7134/Kconfig +++ b/drivers/media/video/saa7134/Kconfig | |||
@@ -40,7 +40,7 @@ config VIDEO_SAA7134_DVB | |||
40 | depends on VIDEO_SAA7134 && DVB_CORE | 40 | depends on VIDEO_SAA7134 && DVB_CORE |
41 | select VIDEO_BUF_DVB | 41 | select VIDEO_BUF_DVB |
42 | select FW_LOADER | 42 | select FW_LOADER |
43 | select DVB_PLL | 43 | select DVB_PLL if !DVB_FE_CUSTOMISE |
44 | select DVB_MT352 if !DVB_FE_CUSTOMISE | 44 | select DVB_MT352 if !DVB_FE_CUSTOMISE |
45 | select DVB_TDA1004X if !DVB_FE_CUSTOMISE | 45 | select DVB_TDA1004X if !DVB_FE_CUSTOMISE |
46 | select DVB_NXT200X if !DVB_FE_CUSTOMISE | 46 | select DVB_NXT200X if !DVB_FE_CUSTOMISE |
diff --git a/drivers/media/video/saa7134/saa7134-alsa.c b/drivers/media/video/saa7134/saa7134-alsa.c index ffb0f647a86d..3c0fc9027ad0 100644 --- a/drivers/media/video/saa7134/saa7134-alsa.c +++ b/drivers/media/video/saa7134/saa7134-alsa.c | |||
@@ -75,7 +75,8 @@ typedef struct snd_card_saa7134 { | |||
75 | struct saa7134_dev *dev; | 75 | struct saa7134_dev *dev; |
76 | 76 | ||
77 | unsigned long iobase; | 77 | unsigned long iobase; |
78 | int irq; | 78 | s16 irq; |
79 | u16 mute_was_on; | ||
79 | 80 | ||
80 | spinlock_t lock; | 81 | spinlock_t lock; |
81 | } snd_card_saa7134_t; | 82 | } snd_card_saa7134_t; |
@@ -589,8 +590,10 @@ static int snd_card_saa7134_capture_close(struct snd_pcm_substream * substream) | |||
589 | snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream); | 590 | snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream); |
590 | struct saa7134_dev *dev = saa7134->dev; | 591 | struct saa7134_dev *dev = saa7134->dev; |
591 | 592 | ||
592 | dev->ctl_mute = 1; | 593 | if (saa7134->mute_was_on) { |
593 | saa7134_tvaudio_setmute(dev); | 594 | dev->ctl_mute = 1; |
595 | saa7134_tvaudio_setmute(dev); | ||
596 | } | ||
594 | return 0; | 597 | return 0; |
595 | } | 598 | } |
596 | 599 | ||
@@ -637,8 +640,11 @@ static int snd_card_saa7134_capture_open(struct snd_pcm_substream * substream) | |||
637 | runtime->private_free = snd_card_saa7134_runtime_free; | 640 | runtime->private_free = snd_card_saa7134_runtime_free; |
638 | runtime->hw = snd_card_saa7134_capture; | 641 | runtime->hw = snd_card_saa7134_capture; |
639 | 642 | ||
640 | dev->ctl_mute = 0; | 643 | if (dev->ctl_mute != 0) { |
641 | saa7134_tvaudio_setmute(dev); | 644 | saa7134->mute_was_on = 1; |
645 | dev->ctl_mute = 0; | ||
646 | saa7134_tvaudio_setmute(dev); | ||
647 | } | ||
642 | 648 | ||
643 | if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0) | 649 | if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0) |
644 | return err; | 650 | return err; |
diff --git a/drivers/media/video/saa7134/saa7134-cards.c b/drivers/media/video/saa7134/saa7134-cards.c index 50f15adfa7c8..8ec83bd70094 100644 --- a/drivers/media/video/saa7134/saa7134-cards.c +++ b/drivers/media/video/saa7134/saa7134-cards.c | |||
@@ -400,7 +400,7 @@ struct saa7134_board saa7134_boards[] = { | |||
400 | .inputs = {{ | 400 | .inputs = {{ |
401 | .name = name_tv, | 401 | .name = name_tv, |
402 | .vmux = 1, | 402 | .vmux = 1, |
403 | .amux = LINE2, | 403 | .amux = TV, |
404 | .tv = 1, | 404 | .tv = 1, |
405 | .gpio = 0x20000, | 405 | .gpio = 0x20000, |
406 | },{ | 406 | },{ |
@@ -3502,6 +3502,38 @@ struct saa7134_board saa7134_boards[] = { | |||
3502 | .amux = TV, | 3502 | .amux = TV, |
3503 | }, | 3503 | }, |
3504 | }, | 3504 | }, |
3505 | [SAA7134_BOARD_10MOONSTVMASTER3] = { | ||
3506 | /* Tony Wan <aloha_cn@hotmail.com> */ | ||
3507 | .name = "10MOONS TM300 TV Card", | ||
3508 | .audio_clock = 0x00200000, | ||
3509 | .tuner_type = TUNER_LG_PAL_NEW_TAPC, | ||
3510 | .radio_type = UNSET, | ||
3511 | .tuner_addr = ADDR_UNSET, | ||
3512 | .radio_addr = ADDR_UNSET, | ||
3513 | .gpiomask = 0x7000, | ||
3514 | .inputs = {{ | ||
3515 | .name = name_tv, | ||
3516 | .vmux = 1, | ||
3517 | .amux = LINE2, | ||
3518 | .gpio = 0x0000, | ||
3519 | .tv = 1, | ||
3520 | },{ | ||
3521 | .name = name_comp1, | ||
3522 | .vmux = 3, | ||
3523 | .amux = LINE1, | ||
3524 | .gpio = 0x2000, | ||
3525 | },{ | ||
3526 | .name = name_svideo, | ||
3527 | .vmux = 8, | ||
3528 | .amux = LINE1, | ||
3529 | .gpio = 0x2000, | ||
3530 | }}, | ||
3531 | .mute = { | ||
3532 | .name = name_mute, | ||
3533 | .amux = LINE2, | ||
3534 | .gpio = 0x3000, | ||
3535 | }, | ||
3536 | }, | ||
3505 | }; | 3537 | }; |
3506 | 3538 | ||
3507 | const unsigned int saa7134_bcount = ARRAY_SIZE(saa7134_boards); | 3539 | const unsigned int saa7134_bcount = ARRAY_SIZE(saa7134_boards); |
@@ -4219,6 +4251,12 @@ struct pci_device_id saa7134_pci_tbl[] = { | |||
4219 | .subdevice = 0x2003, /* OEM cardbus */ | 4251 | .subdevice = 0x2003, /* OEM cardbus */ |
4220 | .driver_data = SAA7134_BOARD_SABRENT_TV_PCB05, | 4252 | .driver_data = SAA7134_BOARD_SABRENT_TV_PCB05, |
4221 | },{ | 4253 | },{ |
4254 | .vendor = PCI_VENDOR_ID_PHILIPS, | ||
4255 | .device = PCI_DEVICE_ID_PHILIPS_SAA7130, | ||
4256 | .subvendor = PCI_VENDOR_ID_PHILIPS, | ||
4257 | .subdevice = 0x2304, | ||
4258 | .driver_data = SAA7134_BOARD_10MOONSTVMASTER3, | ||
4259 | },{ | ||
4222 | /* --- boards without eeprom + subsystem ID --- */ | 4260 | /* --- boards without eeprom + subsystem ID --- */ |
4223 | .vendor = PCI_VENDOR_ID_PHILIPS, | 4261 | .vendor = PCI_VENDOR_ID_PHILIPS, |
4224 | .device = PCI_DEVICE_ID_PHILIPS_SAA7134, | 4262 | .device = PCI_DEVICE_ID_PHILIPS_SAA7134, |
@@ -4330,6 +4368,7 @@ int saa7134_board_init1(struct saa7134_dev *dev) | |||
4330 | case SAA7134_BOARD_AVERMEDIA_A16AR: | 4368 | case SAA7134_BOARD_AVERMEDIA_A16AR: |
4331 | case SAA7134_BOARD_ENCORE_ENLTV: | 4369 | case SAA7134_BOARD_ENCORE_ENLTV: |
4332 | case SAA7134_BOARD_ENCORE_ENLTV_FM: | 4370 | case SAA7134_BOARD_ENCORE_ENLTV_FM: |
4371 | case SAA7134_BOARD_10MOONSTVMASTER3: | ||
4333 | dev->has_remote = SAA7134_REMOTE_GPIO; | 4372 | dev->has_remote = SAA7134_REMOTE_GPIO; |
4334 | break; | 4373 | break; |
4335 | case SAA7134_BOARD_FLYDVBS_LR300: | 4374 | case SAA7134_BOARD_FLYDVBS_LR300: |
diff --git a/drivers/media/video/saa7134/saa7134-dvb.c b/drivers/media/video/saa7134/saa7134-dvb.c index e0eec80088c7..1f6bd3300715 100644 --- a/drivers/media/video/saa7134/saa7134-dvb.c +++ b/drivers/media/video/saa7134/saa7134-dvb.c | |||
@@ -175,18 +175,6 @@ static int mt352_pinnacle_tuner_set_params(struct dvb_frontend* fe, | |||
175 | return mt352_pinnacle_init(fe); | 175 | return mt352_pinnacle_init(fe); |
176 | } | 176 | } |
177 | 177 | ||
178 | static int mt352_aver777_tuner_calc_regs(struct dvb_frontend *fe, struct dvb_frontend_parameters *params, u8* pllbuf, int buf_len) | ||
179 | { | ||
180 | if (buf_len < 5) | ||
181 | return -EINVAL; | ||
182 | |||
183 | pllbuf[0] = 0x61; | ||
184 | dvb_pll_configure(&dvb_pll_philips_td1316, pllbuf+1, | ||
185 | params->frequency, | ||
186 | params->u.ofdm.bandwidth); | ||
187 | return 5; | ||
188 | } | ||
189 | |||
190 | static struct mt352_config pinnacle_300i = { | 178 | static struct mt352_config pinnacle_300i = { |
191 | .demod_address = 0x3c >> 1, | 179 | .demod_address = 0x3c >> 1, |
192 | .adc_clock = 20333, | 180 | .adc_clock = 20333, |
@@ -444,135 +432,6 @@ static struct tda1004x_config philips_europa_config = { | |||
444 | 432 | ||
445 | /* ------------------------------------------------------------------ */ | 433 | /* ------------------------------------------------------------------ */ |
446 | 434 | ||
447 | static int philips_fmd1216_tuner_init(struct dvb_frontend *fe) | ||
448 | { | ||
449 | struct saa7134_dev *dev = fe->dvb->priv; | ||
450 | struct tda1004x_state *state = fe->demodulator_priv; | ||
451 | u8 addr = state->config->tuner_address; | ||
452 | /* this message is to set up ATC and ALC */ | ||
453 | static u8 fmd1216_init[] = { 0x0b, 0xdc, 0x9c, 0xa0 }; | ||
454 | struct i2c_msg tuner_msg = {.addr = addr,.flags = 0,.buf = fmd1216_init,.len = sizeof(fmd1216_init) }; | ||
455 | |||
456 | if (fe->ops.i2c_gate_ctrl) | ||
457 | fe->ops.i2c_gate_ctrl(fe, 1); | ||
458 | if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1) | ||
459 | return -EIO; | ||
460 | msleep(1); | ||
461 | |||
462 | return 0; | ||
463 | } | ||
464 | |||
465 | static int philips_fmd1216_tuner_sleep(struct dvb_frontend *fe) | ||
466 | { | ||
467 | struct saa7134_dev *dev = fe->dvb->priv; | ||
468 | struct tda1004x_state *state = fe->demodulator_priv; | ||
469 | u8 addr = state->config->tuner_address; | ||
470 | /* this message actually turns the tuner back to analog mode */ | ||
471 | u8 fmd1216_init[] = { 0x0b, 0xdc, 0x9c, 0x60 }; | ||
472 | struct i2c_msg tuner_msg = {.addr = addr,.flags = 0,.buf = fmd1216_init,.len = sizeof(fmd1216_init) }; | ||
473 | |||
474 | if (fe->ops.i2c_gate_ctrl) | ||
475 | fe->ops.i2c_gate_ctrl(fe, 1); | ||
476 | i2c_transfer(&dev->i2c_adap, &tuner_msg, 1); | ||
477 | msleep(1); | ||
478 | fmd1216_init[2] = 0x86; | ||
479 | fmd1216_init[3] = 0x54; | ||
480 | if (fe->ops.i2c_gate_ctrl) | ||
481 | fe->ops.i2c_gate_ctrl(fe, 1); | ||
482 | i2c_transfer(&dev->i2c_adap, &tuner_msg, 1); | ||
483 | msleep(1); | ||
484 | return 0; | ||
485 | } | ||
486 | |||
487 | static int philips_fmd1216_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) | ||
488 | { | ||
489 | struct saa7134_dev *dev = fe->dvb->priv; | ||
490 | struct tda1004x_state *state = fe->demodulator_priv; | ||
491 | u8 addr = state->config->tuner_address; | ||
492 | u8 tuner_buf[4]; | ||
493 | struct i2c_msg tuner_msg = {.addr = addr,.flags = 0,.buf = tuner_buf,.len = | ||
494 | sizeof(tuner_buf) }; | ||
495 | int tuner_frequency = 0; | ||
496 | int divider = 0; | ||
497 | u8 band, mode, cp; | ||
498 | |||
499 | /* determine charge pump */ | ||
500 | tuner_frequency = params->frequency + 36130000; | ||
501 | if (tuner_frequency < 87000000) | ||
502 | return -EINVAL; | ||
503 | /* low band */ | ||
504 | else if (tuner_frequency < 180000000) { | ||
505 | band = 1; | ||
506 | mode = 7; | ||
507 | cp = 0; | ||
508 | } else if (tuner_frequency < 195000000) { | ||
509 | band = 1; | ||
510 | mode = 6; | ||
511 | cp = 1; | ||
512 | /* mid band */ | ||
513 | } else if (tuner_frequency < 366000000) { | ||
514 | if (params->u.ofdm.bandwidth == BANDWIDTH_8_MHZ) { | ||
515 | band = 10; | ||
516 | } else { | ||
517 | band = 2; | ||
518 | } | ||
519 | mode = 7; | ||
520 | cp = 0; | ||
521 | } else if (tuner_frequency < 478000000) { | ||
522 | if (params->u.ofdm.bandwidth == BANDWIDTH_8_MHZ) { | ||
523 | band = 10; | ||
524 | } else { | ||
525 | band = 2; | ||
526 | } | ||
527 | mode = 6; | ||
528 | cp = 1; | ||
529 | /* high band */ | ||
530 | } else if (tuner_frequency < 662000000) { | ||
531 | if (params->u.ofdm.bandwidth == BANDWIDTH_8_MHZ) { | ||
532 | band = 12; | ||
533 | } else { | ||
534 | band = 4; | ||
535 | } | ||
536 | mode = 7; | ||
537 | cp = 0; | ||
538 | } else if (tuner_frequency < 840000000) { | ||
539 | if (params->u.ofdm.bandwidth == BANDWIDTH_8_MHZ) { | ||
540 | band = 12; | ||
541 | } else { | ||
542 | band = 4; | ||
543 | } | ||
544 | mode = 6; | ||
545 | cp = 1; | ||
546 | } else { | ||
547 | if (params->u.ofdm.bandwidth == BANDWIDTH_8_MHZ) { | ||
548 | band = 12; | ||
549 | } else { | ||
550 | band = 4; | ||
551 | } | ||
552 | mode = 7; | ||
553 | cp = 1; | ||
554 | |||
555 | } | ||
556 | /* calculate divisor */ | ||
557 | /* ((36166000 + Finput) / 166666) rounded! */ | ||
558 | divider = (tuner_frequency + 83333) / 166667; | ||
559 | |||
560 | /* setup tuner buffer */ | ||
561 | tuner_buf[0] = (divider >> 8) & 0x7f; | ||
562 | tuner_buf[1] = divider & 0xff; | ||
563 | tuner_buf[2] = 0x80 | (cp << 6) | (mode << 3) | 4; | ||
564 | tuner_buf[3] = 0x40 | band; | ||
565 | |||
566 | if (fe->ops.i2c_gate_ctrl) | ||
567 | fe->ops.i2c_gate_ctrl(fe, 1); | ||
568 | if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1) { | ||
569 | wprintk("could not write to tuner at addr: 0x%02x\n", | ||
570 | addr << 1); | ||
571 | return -EIO; | ||
572 | } | ||
573 | return 0; | ||
574 | } | ||
575 | |||
576 | static struct tda1004x_config medion_cardbus = { | 435 | static struct tda1004x_config medion_cardbus = { |
577 | .demod_address = 0x08, | 436 | .demod_address = 0x08, |
578 | .invert = 1, | 437 | .invert = 1, |
@@ -958,18 +817,8 @@ static struct nxt200x_config avertvhda180 = { | |||
958 | .demod_address = 0x0a, | 817 | .demod_address = 0x0a, |
959 | }; | 818 | }; |
960 | 819 | ||
961 | static int nxt200x_set_pll_input(u8 *buf, int input) | ||
962 | { | ||
963 | if (input) | ||
964 | buf[3] |= 0x08; | ||
965 | else | ||
966 | buf[3] &= ~0x08; | ||
967 | return 0; | ||
968 | } | ||
969 | |||
970 | static struct nxt200x_config kworldatsc110 = { | 820 | static struct nxt200x_config kworldatsc110 = { |
971 | .demod_address = 0x0a, | 821 | .demod_address = 0x0a, |
972 | .set_pll_input = nxt200x_set_pll_input, | ||
973 | }; | 822 | }; |
974 | 823 | ||
975 | /* ================================================================== | 824 | /* ================================================================== |
@@ -1005,7 +854,8 @@ static int dvb_init(struct saa7134_dev *dev) | |||
1005 | dev->dvb.frontend = dvb_attach(mt352_attach, &avermedia_777, | 854 | dev->dvb.frontend = dvb_attach(mt352_attach, &avermedia_777, |
1006 | &dev->i2c_adap); | 855 | &dev->i2c_adap); |
1007 | if (dev->dvb.frontend) { | 856 | if (dev->dvb.frontend) { |
1008 | dev->dvb.frontend->ops.tuner_ops.calc_regs = mt352_aver777_tuner_calc_regs; | 857 | dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x61, |
858 | NULL, DVB_PLL_PHILIPS_TD1316); | ||
1009 | } | 859 | } |
1010 | break; | 860 | break; |
1011 | case SAA7134_BOARD_MD7134: | 861 | case SAA7134_BOARD_MD7134: |
@@ -1013,9 +863,8 @@ static int dvb_init(struct saa7134_dev *dev) | |||
1013 | &medion_cardbus, | 863 | &medion_cardbus, |
1014 | &dev->i2c_adap); | 864 | &dev->i2c_adap); |
1015 | if (dev->dvb.frontend) { | 865 | if (dev->dvb.frontend) { |
1016 | dev->dvb.frontend->ops.tuner_ops.init = philips_fmd1216_tuner_init; | 866 | dvb_attach(dvb_pll_attach, dev->dvb.frontend, medion_cardbus.tuner_address, |
1017 | dev->dvb.frontend->ops.tuner_ops.sleep = philips_fmd1216_tuner_sleep; | 867 | &dev->i2c_adap, DVB_PLL_FMD1216ME); |
1018 | dev->dvb.frontend->ops.tuner_ops.set_params = philips_fmd1216_tuner_set_params; | ||
1019 | } | 868 | } |
1020 | break; | 869 | break; |
1021 | case SAA7134_BOARD_PHILIPS_TOUGH: | 870 | case SAA7134_BOARD_PHILIPS_TOUGH: |
@@ -1113,7 +962,7 @@ static int dvb_init(struct saa7134_dev *dev) | |||
1113 | &dev->i2c_adap); | 962 | &dev->i2c_adap); |
1114 | if (dev->dvb.frontend) { | 963 | if (dev->dvb.frontend) { |
1115 | dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x61, | 964 | dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x61, |
1116 | NULL, &dvb_pll_tdhu2); | 965 | NULL, DVB_PLL_TDHU2); |
1117 | } | 966 | } |
1118 | break; | 967 | break; |
1119 | case SAA7134_BOARD_KWORLD_ATSC110: | 968 | case SAA7134_BOARD_KWORLD_ATSC110: |
@@ -1121,7 +970,7 @@ static int dvb_init(struct saa7134_dev *dev) | |||
1121 | &dev->i2c_adap); | 970 | &dev->i2c_adap); |
1122 | if (dev->dvb.frontend) { | 971 | if (dev->dvb.frontend) { |
1123 | dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x61, | 972 | dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x61, |
1124 | NULL, &dvb_pll_tuv1236d); | 973 | NULL, DVB_PLL_TUV1236D); |
1125 | } | 974 | } |
1126 | break; | 975 | break; |
1127 | case SAA7134_BOARD_FLYDVBS_LR300: | 976 | case SAA7134_BOARD_FLYDVBS_LR300: |
@@ -1144,9 +993,9 @@ static int dvb_init(struct saa7134_dev *dev) | |||
1144 | if (dev->dvb.frontend) { | 993 | if (dev->dvb.frontend) { |
1145 | dev->original_demod_sleep = dev->dvb.frontend->ops.sleep; | 994 | dev->original_demod_sleep = dev->dvb.frontend->ops.sleep; |
1146 | dev->dvb.frontend->ops.sleep = philips_europa_demod_sleep; | 995 | dev->dvb.frontend->ops.sleep = philips_europa_demod_sleep; |
1147 | dev->dvb.frontend->ops.tuner_ops.init = philips_fmd1216_tuner_init; | 996 | |
1148 | dev->dvb.frontend->ops.tuner_ops.sleep = philips_fmd1216_tuner_sleep; | 997 | dvb_attach(dvb_pll_attach, dev->dvb.frontend, medion_cardbus.tuner_address, |
1149 | dev->dvb.frontend->ops.tuner_ops.set_params = philips_fmd1216_tuner_set_params; | 998 | &dev->i2c_adap, DVB_PLL_FMD1216ME); |
1150 | } | 999 | } |
1151 | break; | 1000 | break; |
1152 | case SAA7134_BOARD_VIDEOMATE_DVBT_200A: | 1001 | case SAA7134_BOARD_VIDEOMATE_DVBT_200A: |
diff --git a/drivers/media/video/saa7134/saa7134-empress.c b/drivers/media/video/saa7134/saa7134-empress.c index f521603482ca..fc260ec8fdc2 100644 --- a/drivers/media/video/saa7134/saa7134-empress.c +++ b/drivers/media/video/saa7134/saa7134-empress.c | |||
@@ -96,6 +96,10 @@ static int ts_open(struct inode *inode, struct file *file) | |||
96 | if (dev->empress_users) | 96 | if (dev->empress_users) |
97 | goto done_up; | 97 | goto done_up; |
98 | 98 | ||
99 | /* Unmute audio */ | ||
100 | saa_writeb(SAA7134_AUDIO_MUTE_CTRL, | ||
101 | saa_readb(SAA7134_AUDIO_MUTE_CTRL) & ~(1 << 6)); | ||
102 | |||
99 | dev->empress_users++; | 103 | dev->empress_users++; |
100 | file->private_data = dev; | 104 | file->private_data = dev; |
101 | err = 0; | 105 | err = 0; |
@@ -121,6 +125,10 @@ static int ts_release(struct inode *inode, struct file *file) | |||
121 | /* stop the encoder */ | 125 | /* stop the encoder */ |
122 | ts_reset_encoder(dev); | 126 | ts_reset_encoder(dev); |
123 | 127 | ||
128 | /* Mute audio */ | ||
129 | saa_writeb(SAA7134_AUDIO_MUTE_CTRL, | ||
130 | saa_readb(SAA7134_AUDIO_MUTE_CTRL) | (1 << 6)); | ||
131 | |||
124 | mutex_unlock(&dev->empress_tsq.lock); | 132 | mutex_unlock(&dev->empress_tsq.lock); |
125 | return 0; | 133 | return 0; |
126 | } | 134 | } |
diff --git a/drivers/media/video/saa7134/saa7134-input.c b/drivers/media/video/saa7134/saa7134-input.c index c0de37e3f5c6..1b6dfd801cc1 100644 --- a/drivers/media/video/saa7134/saa7134-input.c +++ b/drivers/media/video/saa7134/saa7134-input.c | |||
@@ -153,21 +153,18 @@ void saa7134_input_irq(struct saa7134_dev *dev) | |||
153 | 153 | ||
154 | static void saa7134_input_timer(unsigned long data) | 154 | static void saa7134_input_timer(unsigned long data) |
155 | { | 155 | { |
156 | struct saa7134_dev *dev = (struct saa7134_dev*)data; | 156 | struct saa7134_dev *dev = (struct saa7134_dev *)data; |
157 | struct card_ir *ir = dev->remote; | 157 | struct card_ir *ir = dev->remote; |
158 | unsigned long timeout; | ||
159 | 158 | ||
160 | build_key(dev); | 159 | build_key(dev); |
161 | timeout = jiffies + (ir->polling * HZ / 1000); | 160 | mod_timer(&ir->timer, jiffies + msecs_to_jiffies(ir->polling)); |
162 | mod_timer(&ir->timer, timeout); | ||
163 | } | 161 | } |
164 | 162 | ||
165 | static void saa7134_ir_start(struct saa7134_dev *dev, struct card_ir *ir) | 163 | static void saa7134_ir_start(struct saa7134_dev *dev, struct card_ir *ir) |
166 | { | 164 | { |
167 | if (ir->polling) { | 165 | if (ir->polling) { |
168 | init_timer(&ir->timer); | 166 | setup_timer(&ir->timer, saa7134_input_timer, |
169 | ir->timer.function = saa7134_input_timer; | 167 | (unsigned long)dev); |
170 | ir->timer.data = (unsigned long)dev; | ||
171 | ir->timer.expires = jiffies + HZ; | 168 | ir->timer.expires = jiffies + HZ; |
172 | add_timer(&ir->timer); | 169 | add_timer(&ir->timer); |
173 | } else if (ir->rc5_gpio) { | 170 | } else if (ir->rc5_gpio) { |
@@ -314,6 +311,7 @@ int saa7134_input_init1(struct saa7134_dev *dev) | |||
314 | mask_keycode = 0x003F00; | 311 | mask_keycode = 0x003F00; |
315 | mask_keyup = 0x040000; | 312 | mask_keyup = 0x040000; |
316 | break; | 313 | break; |
314 | case SAA7134_BOARD_FLYDVBS_LR300: | ||
317 | case SAA7134_BOARD_FLYDVBT_LR301: | 315 | case SAA7134_BOARD_FLYDVBT_LR301: |
318 | case SAA7134_BOARD_FLYDVBTDUO: | 316 | case SAA7134_BOARD_FLYDVBTDUO: |
319 | ir_codes = ir_codes_flydvb; | 317 | ir_codes = ir_codes_flydvb; |
@@ -333,6 +331,12 @@ int saa7134_input_init1(struct saa7134_dev *dev) | |||
333 | mask_keyup = 0x040000; | 331 | mask_keyup = 0x040000; |
334 | polling = 50; // ms | 332 | polling = 50; // ms |
335 | break; | 333 | break; |
334 | case SAA7134_BOARD_10MOONSTVMASTER3: | ||
335 | ir_codes = ir_codes_encore_enltv; | ||
336 | mask_keycode = 0x5f80000; | ||
337 | mask_keyup = 0x8000000; | ||
338 | polling = 50; //ms | ||
339 | break; | ||
336 | } | 340 | } |
337 | if (NULL == ir_codes) { | 341 | if (NULL == ir_codes) { |
338 | printk("%s: Oops: IR config error [card=%d]\n", | 342 | printk("%s: Oops: IR config error [card=%d]\n", |
@@ -374,7 +378,7 @@ int saa7134_input_init1(struct saa7134_dev *dev) | |||
374 | input_dev->id.vendor = dev->pci->vendor; | 378 | input_dev->id.vendor = dev->pci->vendor; |
375 | input_dev->id.product = dev->pci->device; | 379 | input_dev->id.product = dev->pci->device; |
376 | } | 380 | } |
377 | input_dev->cdev.dev = &dev->pci->dev; | 381 | input_dev->dev.parent = &dev->pci->dev; |
378 | 382 | ||
379 | dev->remote = ir; | 383 | dev->remote = ir; |
380 | saa7134_ir_start(dev, ir); | 384 | saa7134_ir_start(dev, ir); |
diff --git a/drivers/media/video/saa7134/saa7134-tvaudio.c b/drivers/media/video/saa7134/saa7134-tvaudio.c index 30395d6b5f14..18b4817b4aac 100644 --- a/drivers/media/video/saa7134/saa7134-tvaudio.c +++ b/drivers/media/video/saa7134/saa7134-tvaudio.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/module.h> | 25 | #include <linux/module.h> |
26 | #include <linux/moduleparam.h> | 26 | #include <linux/moduleparam.h> |
27 | #include <linux/kernel.h> | 27 | #include <linux/kernel.h> |
28 | #include <linux/kthread.h> | ||
28 | #include <linux/slab.h> | 29 | #include <linux/slab.h> |
29 | #include <linux/delay.h> | 30 | #include <linux/delay.h> |
30 | #include <asm/div64.h> | 31 | #include <asm/div64.h> |
@@ -341,10 +342,8 @@ static void tvaudio_setmode(struct saa7134_dev *dev, | |||
341 | 342 | ||
342 | static int tvaudio_sleep(struct saa7134_dev *dev, int timeout) | 343 | static int tvaudio_sleep(struct saa7134_dev *dev, int timeout) |
343 | { | 344 | { |
344 | DECLARE_WAITQUEUE(wait, current); | 345 | if (dev->thread.scan1 == dev->thread.scan2 && |
345 | 346 | !kthread_should_stop()) { | |
346 | add_wait_queue(&dev->thread.wq, &wait); | ||
347 | if (dev->thread.scan1 == dev->thread.scan2 && !dev->thread.shutdown) { | ||
348 | if (timeout < 0) { | 347 | if (timeout < 0) { |
349 | set_current_state(TASK_INTERRUPTIBLE); | 348 | set_current_state(TASK_INTERRUPTIBLE); |
350 | schedule(); | 349 | schedule(); |
@@ -353,7 +352,6 @@ static int tvaudio_sleep(struct saa7134_dev *dev, int timeout) | |||
353 | (msecs_to_jiffies(timeout)); | 352 | (msecs_to_jiffies(timeout)); |
354 | } | 353 | } |
355 | } | 354 | } |
356 | remove_wait_queue(&dev->thread.wq, &wait); | ||
357 | return dev->thread.scan1 != dev->thread.scan2; | 355 | return dev->thread.scan1 != dev->thread.scan2; |
358 | } | 356 | } |
359 | 357 | ||
@@ -505,11 +503,10 @@ static int tvaudio_thread(void *data) | |||
505 | unsigned int i, audio, nscan; | 503 | unsigned int i, audio, nscan; |
506 | int max1,max2,carrier,rx,mode,lastmode,default_carrier; | 504 | int max1,max2,carrier,rx,mode,lastmode,default_carrier; |
507 | 505 | ||
508 | daemonize("%s", dev->name); | ||
509 | allow_signal(SIGTERM); | 506 | allow_signal(SIGTERM); |
510 | for (;;) { | 507 | for (;;) { |
511 | tvaudio_sleep(dev,-1); | 508 | tvaudio_sleep(dev,-1); |
512 | if (dev->thread.shutdown || signal_pending(current)) | 509 | if (kthread_should_stop() || signal_pending(current)) |
513 | goto done; | 510 | goto done; |
514 | 511 | ||
515 | restart: | 512 | restart: |
@@ -618,7 +615,7 @@ static int tvaudio_thread(void *data) | |||
618 | for (;;) { | 615 | for (;;) { |
619 | if (tvaudio_sleep(dev,5000)) | 616 | if (tvaudio_sleep(dev,5000)) |
620 | goto restart; | 617 | goto restart; |
621 | if (dev->thread.shutdown || signal_pending(current)) | 618 | if (kthread_should_stop() || signal_pending(current)) |
622 | break; | 619 | break; |
623 | if (UNSET == dev->thread.mode) { | 620 | if (UNSET == dev->thread.mode) { |
624 | rx = tvaudio_getstereo(dev,&tvaudio[i]); | 621 | rx = tvaudio_getstereo(dev,&tvaudio[i]); |
@@ -634,7 +631,6 @@ static int tvaudio_thread(void *data) | |||
634 | } | 631 | } |
635 | 632 | ||
636 | done: | 633 | done: |
637 | complete_and_exit(&dev->thread.exit, 0); | ||
638 | return 0; | 634 | return 0; |
639 | } | 635 | } |
640 | 636 | ||
@@ -782,7 +778,6 @@ static int tvaudio_thread_ddep(void *data) | |||
782 | struct saa7134_dev *dev = data; | 778 | struct saa7134_dev *dev = data; |
783 | u32 value, norms, clock; | 779 | u32 value, norms, clock; |
784 | 780 | ||
785 | daemonize("%s", dev->name); | ||
786 | allow_signal(SIGTERM); | 781 | allow_signal(SIGTERM); |
787 | 782 | ||
788 | clock = saa7134_boards[dev->board].audio_clock; | 783 | clock = saa7134_boards[dev->board].audio_clock; |
@@ -796,7 +791,7 @@ static int tvaudio_thread_ddep(void *data) | |||
796 | 791 | ||
797 | for (;;) { | 792 | for (;;) { |
798 | tvaudio_sleep(dev,-1); | 793 | tvaudio_sleep(dev,-1); |
799 | if (dev->thread.shutdown || signal_pending(current)) | 794 | if (kthread_should_stop() || signal_pending(current)) |
800 | goto done; | 795 | goto done; |
801 | 796 | ||
802 | restart: | 797 | restart: |
@@ -876,7 +871,6 @@ static int tvaudio_thread_ddep(void *data) | |||
876 | } | 871 | } |
877 | 872 | ||
878 | done: | 873 | done: |
879 | complete_and_exit(&dev->thread.exit, 0); | ||
880 | return 0; | 874 | return 0; |
881 | } | 875 | } |
882 | 876 | ||
@@ -973,7 +967,6 @@ int saa7134_tvaudio_getstereo(struct saa7134_dev *dev) | |||
973 | 967 | ||
974 | int saa7134_tvaudio_init2(struct saa7134_dev *dev) | 968 | int saa7134_tvaudio_init2(struct saa7134_dev *dev) |
975 | { | 969 | { |
976 | DECLARE_MUTEX_LOCKED(sem); | ||
977 | int (*my_thread)(void *data) = NULL; | 970 | int (*my_thread)(void *data) = NULL; |
978 | 971 | ||
979 | switch (dev->pci->device) { | 972 | switch (dev->pci->device) { |
@@ -986,15 +979,15 @@ int saa7134_tvaudio_init2(struct saa7134_dev *dev) | |||
986 | break; | 979 | break; |
987 | } | 980 | } |
988 | 981 | ||
989 | dev->thread.pid = -1; | 982 | dev->thread.thread = NULL; |
990 | if (my_thread) { | 983 | if (my_thread) { |
991 | /* start tvaudio thread */ | 984 | /* start tvaudio thread */ |
992 | init_waitqueue_head(&dev->thread.wq); | 985 | dev->thread.thread = kthread_run(my_thread, dev, "%s", dev->name); |
993 | init_completion(&dev->thread.exit); | 986 | if (IS_ERR(dev->thread.thread)) { |
994 | dev->thread.pid = kernel_thread(my_thread,dev,0); | ||
995 | if (dev->thread.pid < 0) | ||
996 | printk(KERN_WARNING "%s: kernel_thread() failed\n", | 987 | printk(KERN_WARNING "%s: kernel_thread() failed\n", |
997 | dev->name); | 988 | dev->name); |
989 | /* XXX: missing error handling here */ | ||
990 | } | ||
998 | saa7134_tvaudio_do_scan(dev); | 991 | saa7134_tvaudio_do_scan(dev); |
999 | } | 992 | } |
1000 | 993 | ||
@@ -1005,11 +998,9 @@ int saa7134_tvaudio_init2(struct saa7134_dev *dev) | |||
1005 | int saa7134_tvaudio_fini(struct saa7134_dev *dev) | 998 | int saa7134_tvaudio_fini(struct saa7134_dev *dev) |
1006 | { | 999 | { |
1007 | /* shutdown tvaudio thread */ | 1000 | /* shutdown tvaudio thread */ |
1008 | if (dev->thread.pid > 0) { | 1001 | if (dev->thread.thread) |
1009 | dev->thread.shutdown = 1; | 1002 | kthread_stop(dev->thread.thread); |
1010 | wake_up_interruptible(&dev->thread.wq); | 1003 | |
1011 | wait_for_completion(&dev->thread.exit); | ||
1012 | } | ||
1013 | saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x07, 0x00); /* LINE1 */ | 1004 | saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x07, 0x00); /* LINE1 */ |
1014 | return 0; | 1005 | return 0; |
1015 | } | 1006 | } |
@@ -1020,10 +1011,10 @@ int saa7134_tvaudio_do_scan(struct saa7134_dev *dev) | |||
1020 | dprintk("sound IF not in use, skipping scan\n"); | 1011 | dprintk("sound IF not in use, skipping scan\n"); |
1021 | dev->automute = 0; | 1012 | dev->automute = 0; |
1022 | saa7134_tvaudio_setmute(dev); | 1013 | saa7134_tvaudio_setmute(dev); |
1023 | } else if (dev->thread.pid >= 0) { | 1014 | } else if (dev->thread.thread) { |
1024 | dev->thread.mode = UNSET; | 1015 | dev->thread.mode = UNSET; |
1025 | dev->thread.scan2++; | 1016 | dev->thread.scan2++; |
1026 | wake_up_interruptible(&dev->thread.wq); | 1017 | wake_up_process(dev->thread.thread); |
1027 | } else { | 1018 | } else { |
1028 | dev->automute = 0; | 1019 | dev->automute = 0; |
1029 | saa7134_tvaudio_setmute(dev); | 1020 | saa7134_tvaudio_setmute(dev); |
@@ -1040,4 +1031,3 @@ EXPORT_SYMBOL(saa7134_tvaudio_setmute); | |||
1040 | * c-basic-offset: 8 | 1031 | * c-basic-offset: 8 |
1041 | * End: | 1032 | * End: |
1042 | */ | 1033 | */ |
1043 | |||
diff --git a/drivers/media/video/saa7134/saa7134.h b/drivers/media/video/saa7134/saa7134.h index 15623b27ad2e..d32a856192d7 100644 --- a/drivers/media/video/saa7134/saa7134.h +++ b/drivers/media/video/saa7134/saa7134.h | |||
@@ -238,6 +238,7 @@ struct saa7134_format { | |||
238 | #define SAA7134_BOARD_ECS_TVP3XP_4CB6 113 | 238 | #define SAA7134_BOARD_ECS_TVP3XP_4CB6 113 |
239 | #define SAA7134_BOARD_KWORLD_DVBT_210 114 | 239 | #define SAA7134_BOARD_KWORLD_DVBT_210 114 |
240 | #define SAA7134_BOARD_SABRENT_TV_PCB05 115 | 240 | #define SAA7134_BOARD_SABRENT_TV_PCB05 115 |
241 | #define SAA7134_BOARD_10MOONSTVMASTER3 116 | ||
241 | 242 | ||
242 | #define SAA7134_MAXBOARDS 8 | 243 | #define SAA7134_MAXBOARDS 8 |
243 | #define SAA7134_INPUT_MAX 8 | 244 | #define SAA7134_INPUT_MAX 8 |
@@ -327,10 +328,7 @@ struct saa7134_pgtable { | |||
327 | 328 | ||
328 | /* tvaudio thread status */ | 329 | /* tvaudio thread status */ |
329 | struct saa7134_thread { | 330 | struct saa7134_thread { |
330 | pid_t pid; | 331 | struct task_struct *thread; |
331 | struct completion exit; | ||
332 | wait_queue_head_t wq; | ||
333 | unsigned int shutdown; | ||
334 | unsigned int scan1; | 332 | unsigned int scan1; |
335 | unsigned int scan2; | 333 | unsigned int scan2; |
336 | unsigned int mode; | 334 | unsigned int mode; |