Path: blob/master/drivers/media/video/bt8xx/bttv-audio-hook.c
10785 views
/*1* Handlers for board audio hooks, splitted from bttv-cards2*3* Copyright (c) 2006 Mauro Carvalho Chehab ([email protected])4* This code is placed under the terms of the GNU General Public License5*/67#include "bttv-audio-hook.h"89#include <linux/delay.h>1011/* ----------------------------------------------------------------------- */12/* winview */1314void winview_volume(struct bttv *btv, __u16 volume)15{16/* PT2254A programming Jon Tombs, [email protected] */17int bits_out, loops, vol, data;1819/* 32 levels logarithmic */20vol = 32 - ((volume>>11));21/* units */22bits_out = (PT2254_DBS_IN_2>>(vol%5));23/* tens */24bits_out |= (PT2254_DBS_IN_10>>(vol/5));25bits_out |= PT2254_L_CHANNEL | PT2254_R_CHANNEL;26data = gpio_read();27data &= ~(WINVIEW_PT2254_CLK| WINVIEW_PT2254_DATA|28WINVIEW_PT2254_STROBE);29for (loops = 17; loops >= 0 ; loops--) {30if (bits_out & (1<<loops))31data |= WINVIEW_PT2254_DATA;32else33data &= ~WINVIEW_PT2254_DATA;34gpio_write(data);35udelay(5);36data |= WINVIEW_PT2254_CLK;37gpio_write(data);38udelay(5);39data &= ~WINVIEW_PT2254_CLK;40gpio_write(data);41}42data |= WINVIEW_PT2254_STROBE;43data &= ~WINVIEW_PT2254_DATA;44gpio_write(data);45udelay(10);46data &= ~WINVIEW_PT2254_STROBE;47gpio_write(data);48}4950/* ----------------------------------------------------------------------- */51/* mono/stereo control for various cards (which don't use i2c chips but */52/* connect something to the GPIO pins */5354void gvbctv3pci_audio(struct bttv *btv, struct v4l2_tuner *t, int set)55{56unsigned int con = 0;5758if (set) {59gpio_inout(0x300, 0x300);60if (t->audmode & V4L2_TUNER_MODE_LANG1)61con = 0x000;62if (t->audmode & V4L2_TUNER_MODE_LANG2)63con = 0x300;64if (t->audmode & V4L2_TUNER_MODE_STEREO)65con = 0x200;66/* if (t->audmode & V4L2_TUNER_MODE_MONO)67* con = 0x100; */68gpio_bits(0x300, con);69} else {70t->audmode = V4L2_TUNER_MODE_STEREO |71V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;72}73}7475void gvbctv5pci_audio(struct bttv *btv, struct v4l2_tuner *t, int set)76{77unsigned int val, con;7879if (btv->radio_user)80return;8182val = gpio_read();83if (set) {84con = 0x000;85if (t->audmode & V4L2_TUNER_MODE_LANG2) {86if (t->audmode & V4L2_TUNER_MODE_LANG1) {87/* LANG1 + LANG2 */88con = 0x100;89}90else {91/* LANG2 */92con = 0x300;93}94}95if (con != (val & 0x300)) {96gpio_bits(0x300, con);97if (bttv_gpio)98bttv_gpio_tracking(btv,"gvbctv5pci");99}100} else {101switch (val & 0x70) {102case 0x10:103t->rxsubchans = V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2;104break;105case 0x30:106t->rxsubchans = V4L2_TUNER_SUB_LANG2;107break;108case 0x50:109t->rxsubchans = V4L2_TUNER_SUB_LANG1;110break;111case 0x60:112t->rxsubchans = V4L2_TUNER_SUB_STEREO;113break;114case 0x70:115t->rxsubchans = V4L2_TUNER_SUB_MONO;116break;117default:118t->rxsubchans = V4L2_TUNER_SUB_MONO |119V4L2_TUNER_SUB_STEREO |120V4L2_TUNER_SUB_LANG1 |121V4L2_TUNER_SUB_LANG2;122}123t->audmode = V4L2_TUNER_MODE_STEREO |124V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;125}126}127128/*129* Mario Medina Nussbaum <[email protected]>130* I discover that on BT848_GPIO_DATA address a byte 0xcce enable stereo,131* 0xdde enables mono and 0xccd enables sap132*133* Petr Vandrovec <[email protected]>134* P.S.: At least mask in line above is wrong - GPIO pins 3,2 select135* input/output sound connection, so both must be set for output mode.136*137* Looks like it's needed only for the "tvphone", the "tvphone 98"138* handles this with a tda9840139*140*/141142void avermedia_tvphone_audio(struct bttv *btv, struct v4l2_tuner *t, int set)143{144int val = 0;145146if (set) {147if (t->audmode & V4L2_TUNER_MODE_LANG2) /* SAP */148val = 0x02;149if (t->audmode & V4L2_TUNER_MODE_STEREO)150val = 0x01;151if (val) {152gpio_bits(0x03,val);153if (bttv_gpio)154bttv_gpio_tracking(btv,"avermedia");155}156} else {157t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |158V4L2_TUNER_MODE_LANG1;159return;160}161}162163164void avermedia_tv_stereo_audio(struct bttv *btv, struct v4l2_tuner *t, int set)165{166int val = 0;167168if (set) {169if (t->audmode & V4L2_TUNER_MODE_LANG2) /* SAP */170val = 0x01;171if (t->audmode & V4L2_TUNER_MODE_STEREO) /* STEREO */172val = 0x02;173btaor(val, ~0x03, BT848_GPIO_DATA);174if (bttv_gpio)175bttv_gpio_tracking(btv,"avermedia");176} else {177t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |178V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;179return;180}181}182183/* Lifetec 9415 handling */184185void lt9415_audio(struct bttv *btv, struct v4l2_tuner *t, int set)186{187int val = 0;188189if (gpio_read() & 0x4000) {190t->audmode = V4L2_TUNER_MODE_MONO;191return;192}193194if (set) {195if (t->audmode & V4L2_TUNER_MODE_LANG2) /* A2 SAP */196val = 0x0080;197if (t->audmode & V4L2_TUNER_MODE_STEREO) /* A2 stereo */198val = 0x0880;199if ((t->audmode & V4L2_TUNER_MODE_LANG1) ||200(t->audmode & V4L2_TUNER_MODE_MONO))201val = 0;202gpio_bits(0x0880, val);203if (bttv_gpio)204bttv_gpio_tracking(btv,"lt9415");205} else {206/* autodetect doesn't work with this card :-( */207t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |208V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;209return;210}211}212213/* TDA9821 on TerraTV+ Bt848, Bt878 */214void terratv_audio(struct bttv *btv, struct v4l2_tuner *t, int set)215{216unsigned int con = 0;217218if (set) {219gpio_inout(0x180000,0x180000);220if (t->audmode & V4L2_TUNER_MODE_LANG2)221con = 0x080000;222if (t->audmode & V4L2_TUNER_MODE_STEREO)223con = 0x180000;224gpio_bits(0x180000, con);225if (bttv_gpio)226bttv_gpio_tracking(btv,"terratv");227} else {228t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |229V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;230}231}232233234void winfast2000_audio(struct bttv *btv, struct v4l2_tuner *t, int set)235{236unsigned long val = 0;237238if (set) {239/*btor (0xc32000, BT848_GPIO_OUT_EN);*/240if (t->audmode & V4L2_TUNER_MODE_MONO) /* Mono */241val = 0x420000;242if (t->audmode & V4L2_TUNER_MODE_LANG1) /* Mono */243val = 0x420000;244if (t->audmode & V4L2_TUNER_MODE_LANG2) /* SAP */245val = 0x410000;246if (t->audmode & V4L2_TUNER_MODE_STEREO) /* Stereo */247val = 0x020000;248if (val) {249gpio_bits(0x430000, val);250if (bttv_gpio)251bttv_gpio_tracking(btv,"winfast2000");252}253} else {254t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |255V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;256}257}258259/*260* Dariusz Kowalewski <[email protected]>261* sound control for Prolink PV-BT878P+9B (PixelView PlayTV Pro FM+NICAM262* revision 9B has on-board TDA9874A sound decoder).263*264* Note: There are card variants without tda9874a. Forcing the "stereo sound route"265* will mute this cards.266*/267void pvbt878p9b_audio(struct bttv *btv, struct v4l2_tuner *t, int set)268{269unsigned int val = 0;270271if (btv->radio_user)272return;273274if (set) {275if (t->audmode & V4L2_TUNER_MODE_MONO) {276val = 0x01;277}278if ((t->audmode & (V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2))279|| (t->audmode & V4L2_TUNER_MODE_STEREO)) {280val = 0x02;281}282if (val) {283gpio_bits(0x03,val);284if (bttv_gpio)285bttv_gpio_tracking(btv,"pvbt878p9b");286}287} else {288t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |289V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;290}291}292293/*294* Dariusz Kowalewski <[email protected]>295* sound control for FlyVideo 2000S (with tda9874 decoder)296* based on pvbt878p9b_audio() - this is not tested, please fix!!!297*/298void fv2000s_audio(struct bttv *btv, struct v4l2_tuner *t, int set)299{300unsigned int val = 0xffff;301302if (btv->radio_user)303return;304305if (set) {306if (t->audmode & V4L2_TUNER_MODE_MONO) {307val = 0x0000;308}309if ((t->audmode & (V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2))310|| (t->audmode & V4L2_TUNER_MODE_STEREO)) {311val = 0x1080; /*-dk-???: 0x0880, 0x0080, 0x1800 ... */312}313if (val != 0xffff) {314gpio_bits(0x1800, val);315if (bttv_gpio)316bttv_gpio_tracking(btv,"fv2000s");317}318} else {319t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |320V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;321}322}323324/*325* sound control for Canopus WinDVR PCI326* Masaki Suzuki <[email protected]>327*/328void windvr_audio(struct bttv *btv, struct v4l2_tuner *t, int set)329{330unsigned long val = 0;331332if (set) {333if (t->audmode & V4L2_TUNER_MODE_MONO)334val = 0x040000;335if (t->audmode & V4L2_TUNER_MODE_LANG1)336val = 0;337if (t->audmode & V4L2_TUNER_MODE_LANG2)338val = 0x100000;339if (t->audmode & V4L2_TUNER_MODE_STEREO)340val = 0;341if (val) {342gpio_bits(0x140000, val);343if (bttv_gpio)344bttv_gpio_tracking(btv,"windvr");345}346} else {347t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |348V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;349}350}351352/*353* sound control for AD-TVK503354* Hiroshi Takekawa <[email protected]>355*/356void adtvk503_audio(struct bttv *btv, struct v4l2_tuner *t, int set)357{358unsigned int con = 0xffffff;359360/* btaor(0x1e0000, ~0x1e0000, BT848_GPIO_OUT_EN); */361362if (set) {363/* btor(***, BT848_GPIO_OUT_EN); */364if (t->audmode & V4L2_TUNER_MODE_LANG1)365con = 0x00000000;366if (t->audmode & V4L2_TUNER_MODE_LANG2)367con = 0x00180000;368if (t->audmode & V4L2_TUNER_MODE_STEREO)369con = 0x00000000;370if (t->audmode & V4L2_TUNER_MODE_MONO)371con = 0x00060000;372if (con != 0xffffff) {373gpio_bits(0x1e0000,con);374if (bttv_gpio)375bttv_gpio_tracking(btv, "adtvk503");376}377} else {378t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |379V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;380}381}382383384