diff options
Diffstat (limited to 'drivers/media/video/bttv-cards.c')
-rw-r--r-- | drivers/media/video/bttv-cards.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/drivers/media/video/bttv-cards.c b/drivers/media/video/bttv-cards.c index 6334122704ae..ca7c993fecb7 100644 --- a/drivers/media/video/bttv-cards.c +++ b/drivers/media/video/bttv-cards.c | |||
@@ -51,6 +51,7 @@ static void avermedia_eeprom(struct bttv *btv); | |||
51 | static void osprey_eeprom(struct bttv *btv); | 51 | static void osprey_eeprom(struct bttv *btv); |
52 | static void modtec_eeprom(struct bttv *btv); | 52 | static void modtec_eeprom(struct bttv *btv); |
53 | static void init_PXC200(struct bttv *btv); | 53 | static void init_PXC200(struct bttv *btv); |
54 | static void init_RTV24(struct bttv *btv); | ||
54 | 55 | ||
55 | static void winview_audio(struct bttv *btv, struct video_audio *v, int set); | 56 | static void winview_audio(struct bttv *btv, struct video_audio *v, int set); |
56 | static void lt9415_audio(struct bttv *btv, struct video_audio *v, int set); | 57 | static void lt9415_audio(struct bttv *btv, struct video_audio *v, int set); |
@@ -2251,6 +2252,19 @@ struct tvcard bttv_tvcards[] = { | |||
2251 | .no_tda7432 = 1, | 2252 | .no_tda7432 = 1, |
2252 | .no_tda9875 = 1, | 2253 | .no_tda9875 = 1, |
2253 | .muxsel_hook = kodicom4400r_muxsel, | 2254 | .muxsel_hook = kodicom4400r_muxsel, |
2255 | }, | ||
2256 | { | ||
2257 | /* ---- card 0x86---------------------------------- */ | ||
2258 | /* Michael Henson <mhenson@clarityvi.com> */ | ||
2259 | /* Adlink RTV24 with special unlock codes */ | ||
2260 | .name = "Adlink RTV24", | ||
2261 | .video_inputs = 4, | ||
2262 | .audio_inputs = 1, | ||
2263 | .tuner = 0, | ||
2264 | .svhs = 2, | ||
2265 | .muxsel = { 2, 3, 1, 0}, | ||
2266 | .tuner_type = -1, | ||
2267 | .pll = PLL_28, | ||
2254 | }}; | 2268 | }}; |
2255 | 2269 | ||
2256 | static const unsigned int bttv_num_tvcards = ARRAY_SIZE(bttv_tvcards); | 2270 | static const unsigned int bttv_num_tvcards = ARRAY_SIZE(bttv_tvcards); |
@@ -2748,6 +2762,9 @@ void __devinit bttv_init_card2(struct bttv *btv) | |||
2748 | case BTTV_KODICOM_4400R: | 2762 | case BTTV_KODICOM_4400R: |
2749 | kodicom4400r_init(btv); | 2763 | kodicom4400r_init(btv); |
2750 | break; | 2764 | break; |
2765 | case BTTV_ADLINK_RTV24: | ||
2766 | init_RTV24(btv); | ||
2767 | break; | ||
2751 | } | 2768 | } |
2752 | 2769 | ||
2753 | /* pll configuration */ | 2770 | /* pll configuration */ |
@@ -3303,6 +3320,76 @@ static void __devinit init_PXC200(struct bttv *btv) | |||
3303 | printk(KERN_INFO "PXC200 Initialised.\n"); | 3320 | printk(KERN_INFO "PXC200 Initialised.\n"); |
3304 | } | 3321 | } |
3305 | 3322 | ||
3323 | /* ----------------------------------------------------------------------- */ | ||
3324 | /* | ||
3325 | * The Adlink RTV-24 (aka Angelo) has some special initialisation to unlock | ||
3326 | * it. This apparently involves the following procedure for each 878 chip: | ||
3327 | * | ||
3328 | * 1) write 0x00C3FEFF to the GPIO_OUT_EN register | ||
3329 | * | ||
3330 | * 2) write to GPIO_DATA | ||
3331 | * - 0x0E | ||
3332 | * - sleep 1ms | ||
3333 | * - 0x10 + 0x0E | ||
3334 | * - sleep 10ms | ||
3335 | * - 0x0E | ||
3336 | * read from GPIO_DATA into buf (uint_32) | ||
3337 | * - if ( data>>18 & 0x01 != 0) || ( buf>>19 & 0x01 != 1 ) | ||
3338 | * error. ERROR_CPLD_Check_Failed stop. | ||
3339 | * | ||
3340 | * 3) write to GPIO_DATA | ||
3341 | * - write 0x4400 + 0x0E | ||
3342 | * - sleep 10ms | ||
3343 | * - write 0x4410 + 0x0E | ||
3344 | * - sleep 1ms | ||
3345 | * - write 0x0E | ||
3346 | * read from GPIO_DATA into buf (uint_32) | ||
3347 | * - if ( buf>>18 & 0x01 ) || ( buf>>19 && 0x01 != 0 ) | ||
3348 | * error. ERROR_CPLD_Check_Failed. | ||
3349 | */ | ||
3350 | /* ----------------------------------------------------------------------- */ | ||
3351 | void init_RTV24(struct bttv *btv) | ||
3352 | { | ||
3353 | u32 dataread; | ||
3354 | const long watchdog_value = 0x0E; | ||
3355 | |||
3356 | printk(KERN_INFO "bttv%d: Adlink RTV-24 initialisation in progress\n", | ||
3357 | btv->c.nr); | ||
3358 | |||
3359 | btwrite(0x00c3feff, BT848_GPIO_OUT_EN); | ||
3360 | |||
3361 | btwrite(0 + watchdog_value, BT848_GPIO_DATA); | ||
3362 | msleep(1); | ||
3363 | btwrite(0x10 + watchdog_value, BT848_GPIO_DATA); | ||
3364 | msleep( 10 ); | ||
3365 | btwrite(0 + watchdog_value, BT848_GPIO_DATA); | ||
3366 | |||
3367 | dataread = btread(BT848_GPIO_DATA); | ||
3368 | |||
3369 | if (((dataread >> 18) & 0x01) != 0 || ((dataread >> 19) & 0x01) != 1) { | ||
3370 | printk(KERN_INFO "bttv%d: Adlink RTV-24 initialisation(1) " | ||
3371 | "ERROR_CPLD_Check_Failed (read %d)\n", | ||
3372 | btv->c.nr, dataread); | ||
3373 | } | ||
3374 | |||
3375 | btwrite(0x4400 + watchdog_value, BT848_GPIO_DATA); | ||
3376 | msleep(10); | ||
3377 | btwrite(0x4410 + watchdog_value, BT848_GPIO_DATA); | ||
3378 | msleep(1); | ||
3379 | btwrite(watchdog_value, BT848_GPIO_DATA); | ||
3380 | msleep(1); | ||
3381 | dataread = btread(BT848_GPIO_DATA); | ||
3382 | |||
3383 | if (((dataread >> 18) & 0x01) != 0 || ((dataread >> 19) & 0x01) != 0) { | ||
3384 | printk(KERN_INFO "bttv%d: Adlink RTV-24 initialisation(2) " | ||
3385 | "ERROR_CPLD_Check_Failed (read %d)\n", | ||
3386 | btv->c.nr, dataread); | ||
3387 | return; | ||
3388 | } | ||
3389 | |||
3390 | printk(KERN_INFO "bttv%d: Adlink RTV-24 initialisation complete.\n", | ||
3391 | btv->c.nr); | ||
3392 | } | ||
3306 | 3393 | ||
3307 | /* ----------------------------------------------------------------------- */ | 3394 | /* ----------------------------------------------------------------------- */ |
3308 | /* Miro Pro radio stuff -- the tea5757 is connected to some GPIO ports */ | 3395 | /* Miro Pro radio stuff -- the tea5757 is connected to some GPIO ports */ |