aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/saa7134
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/saa7134')
-rw-r--r--drivers/media/video/saa7134/Kconfig2
-rw-r--r--drivers/media/video/saa7134/saa7134-alsa.c16
-rw-r--r--drivers/media/video/saa7134/saa7134-cards.c41
-rw-r--r--drivers/media/video/saa7134/saa7134-dvb.c169
-rw-r--r--drivers/media/video/saa7134/saa7134-empress.c8
-rw-r--r--drivers/media/video/saa7134/saa7134-input.c20
-rw-r--r--drivers/media/video/saa7134/saa7134-tvaudio.c42
-rw-r--r--drivers/media/video/saa7134/saa7134.h6
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
3507const unsigned int saa7134_bcount = ARRAY_SIZE(saa7134_boards); 3539const 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
178static 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
190static struct mt352_config pinnacle_300i = { 178static 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
447static 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
465static 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
487static 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
576static struct tda1004x_config medion_cardbus = { 435static 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
961static 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
970static struct nxt200x_config kworldatsc110 = { 820static 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
154static void saa7134_input_timer(unsigned long data) 154static 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
165static void saa7134_ir_start(struct saa7134_dev *dev, struct card_ir *ir) 163static 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
342static int tvaudio_sleep(struct saa7134_dev *dev, int timeout) 343static 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
974int saa7134_tvaudio_init2(struct saa7134_dev *dev) 968int 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)
1005int saa7134_tvaudio_fini(struct saa7134_dev *dev) 998int 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 */
329struct saa7134_thread { 330struct 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;