bttv-audio-hook.c 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. /*
  2. * Handlers for board audio hooks, splitted from bttv-cards
  3. *
  4. * Copyright (c) 2006 Mauro Carvalho Chehab (mchehab@infradead.org)
  5. * This code is placed under the terms of the GNU General Public License
  6. */
  7. #include "bttv-audio-hook.h"
  8. #include <linux/delay.h>
  9. /* ----------------------------------------------------------------------- */
  10. /* winview */
  11. void winview_volume(struct bttv *btv, __u16 volume)
  12. {
  13. /* PT2254A programming Jon Tombs, jon@gte.esi.us.es */
  14. int bits_out, loops, vol, data;
  15. /* 32 levels logarithmic */
  16. vol = 32 - ((volume>>11));
  17. /* units */
  18. bits_out = (PT2254_DBS_IN_2>>(vol%5));
  19. /* tens */
  20. bits_out |= (PT2254_DBS_IN_10>>(vol/5));
  21. bits_out |= PT2254_L_CHANNEL | PT2254_R_CHANNEL;
  22. data = gpio_read();
  23. data &= ~(WINVIEW_PT2254_CLK| WINVIEW_PT2254_DATA|
  24. WINVIEW_PT2254_STROBE);
  25. for (loops = 17; loops >= 0 ; loops--) {
  26. if (bits_out & (1<<loops))
  27. data |= WINVIEW_PT2254_DATA;
  28. else
  29. data &= ~WINVIEW_PT2254_DATA;
  30. gpio_write(data);
  31. udelay(5);
  32. data |= WINVIEW_PT2254_CLK;
  33. gpio_write(data);
  34. udelay(5);
  35. data &= ~WINVIEW_PT2254_CLK;
  36. gpio_write(data);
  37. }
  38. data |= WINVIEW_PT2254_STROBE;
  39. data &= ~WINVIEW_PT2254_DATA;
  40. gpio_write(data);
  41. udelay(10);
  42. data &= ~WINVIEW_PT2254_STROBE;
  43. gpio_write(data);
  44. }
  45. /* ----------------------------------------------------------------------- */
  46. /* mono/stereo control for various cards (which don't use i2c chips but */
  47. /* connect something to the GPIO pins */
  48. void gvbctv3pci_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
  49. {
  50. unsigned int con = 0;
  51. if (set) {
  52. gpio_inout(0x300, 0x300);
  53. if (t->audmode & V4L2_TUNER_MODE_LANG1)
  54. con = 0x000;
  55. if (t->audmode & V4L2_TUNER_MODE_LANG2)
  56. con = 0x300;
  57. if (t->audmode & V4L2_TUNER_MODE_STEREO)
  58. con = 0x200;
  59. /* if (t->audmode & V4L2_TUNER_MODE_MONO)
  60. * con = 0x100; */
  61. gpio_bits(0x300, con);
  62. } else {
  63. t->audmode = V4L2_TUNER_MODE_STEREO |
  64. V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;
  65. }
  66. }
  67. void gvbctv5pci_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
  68. {
  69. unsigned int val, con;
  70. if (btv->radio_user)
  71. return;
  72. val = gpio_read();
  73. if (set) {
  74. con = 0x000;
  75. if (t->audmode & V4L2_TUNER_MODE_LANG2) {
  76. if (t->audmode & V4L2_TUNER_MODE_LANG1) {
  77. /* LANG1 + LANG2 */
  78. con = 0x100;
  79. }
  80. else {
  81. /* LANG2 */
  82. con = 0x300;
  83. }
  84. }
  85. if (con != (val & 0x300)) {
  86. gpio_bits(0x300, con);
  87. if (bttv_gpio)
  88. bttv_gpio_tracking(btv,"gvbctv5pci");
  89. }
  90. } else {
  91. switch (val & 0x70) {
  92. case 0x10:
  93. t->audmode = V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;
  94. break;
  95. case 0x30:
  96. t->audmode = V4L2_TUNER_MODE_LANG2;
  97. break;
  98. case 0x50:
  99. t->audmode = V4L2_TUNER_MODE_LANG1;
  100. break;
  101. case 0x60:
  102. t->audmode = V4L2_TUNER_MODE_STEREO;
  103. break;
  104. case 0x70:
  105. t->audmode = V4L2_TUNER_MODE_MONO;
  106. break;
  107. default:
  108. t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |
  109. V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;
  110. }
  111. }
  112. }
  113. /*
  114. * Mario Medina Nussbaum <medisoft@alohabbs.org.mx>
  115. * I discover that on BT848_GPIO_DATA address a byte 0xcce enable stereo,
  116. * 0xdde enables mono and 0xccd enables sap
  117. *
  118. * Petr Vandrovec <VANDROVE@vc.cvut.cz>
  119. * P.S.: At least mask in line above is wrong - GPIO pins 3,2 select
  120. * input/output sound connection, so both must be set for output mode.
  121. *
  122. * Looks like it's needed only for the "tvphone", the "tvphone 98"
  123. * handles this with a tda9840
  124. *
  125. */
  126. void avermedia_tvphone_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
  127. {
  128. int val = 0;
  129. if (set) {
  130. if (t->audmode & V4L2_TUNER_MODE_LANG2) /* SAP */
  131. val = 0x02;
  132. if (t->audmode & V4L2_TUNER_MODE_STEREO)
  133. val = 0x01;
  134. if (val) {
  135. gpio_bits(0x03,val);
  136. if (bttv_gpio)
  137. bttv_gpio_tracking(btv,"avermedia");
  138. }
  139. } else {
  140. t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |
  141. V4L2_TUNER_MODE_LANG1;
  142. return;
  143. }
  144. }
  145. void avermedia_tv_stereo_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
  146. {
  147. int val = 0;
  148. if (set) {
  149. if (t->audmode & V4L2_TUNER_MODE_LANG2) /* SAP */
  150. val = 0x01;
  151. if (t->audmode & V4L2_TUNER_MODE_STEREO) /* STEREO */
  152. val = 0x02;
  153. btaor(val, ~0x03, BT848_GPIO_DATA);
  154. if (bttv_gpio)
  155. bttv_gpio_tracking(btv,"avermedia");
  156. } else {
  157. t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |
  158. V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;
  159. return;
  160. }
  161. }
  162. /* Lifetec 9415 handling */
  163. void lt9415_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
  164. {
  165. int val = 0;
  166. if (gpio_read() & 0x4000) {
  167. t->audmode = V4L2_TUNER_MODE_MONO;
  168. return;
  169. }
  170. if (set) {
  171. if (t->audmode & V4L2_TUNER_MODE_LANG2) /* A2 SAP */
  172. val = 0x0080;
  173. if (t->audmode & V4L2_TUNER_MODE_STEREO) /* A2 stereo */
  174. val = 0x0880;
  175. if ((t->audmode & V4L2_TUNER_MODE_LANG1) ||
  176. (t->audmode & V4L2_TUNER_MODE_MONO))
  177. val = 0;
  178. gpio_bits(0x0880, val);
  179. if (bttv_gpio)
  180. bttv_gpio_tracking(btv,"lt9415");
  181. } else {
  182. /* autodetect doesn't work with this card :-( */
  183. t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |
  184. V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;
  185. return;
  186. }
  187. }
  188. /* TDA9821 on TerraTV+ Bt848, Bt878 */
  189. void terratv_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
  190. {
  191. unsigned int con = 0;
  192. if (set) {
  193. gpio_inout(0x180000,0x180000);
  194. if (t->audmode & V4L2_TUNER_MODE_LANG2)
  195. con = 0x080000;
  196. if (t->audmode & V4L2_TUNER_MODE_STEREO)
  197. con = 0x180000;
  198. gpio_bits(0x180000, con);
  199. if (bttv_gpio)
  200. bttv_gpio_tracking(btv,"terratv");
  201. } else {
  202. t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |
  203. V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;
  204. }
  205. }
  206. void winfast2000_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
  207. {
  208. unsigned long val = 0;
  209. if (set) {
  210. /*btor (0xc32000, BT848_GPIO_OUT_EN);*/
  211. if (t->audmode & V4L2_TUNER_MODE_MONO) /* Mono */
  212. val = 0x420000;
  213. if (t->audmode & V4L2_TUNER_MODE_LANG1) /* Mono */
  214. val = 0x420000;
  215. if (t->audmode & V4L2_TUNER_MODE_LANG2) /* SAP */
  216. val = 0x410000;
  217. if (t->audmode & V4L2_TUNER_MODE_STEREO) /* Stereo */
  218. val = 0x020000;
  219. if (val) {
  220. gpio_bits(0x430000, val);
  221. if (bttv_gpio)
  222. bttv_gpio_tracking(btv,"winfast2000");
  223. }
  224. } else {
  225. t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |
  226. V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;
  227. }
  228. }
  229. /*
  230. * Dariusz Kowalewski <darekk@automex.pl>
  231. * sound control for Prolink PV-BT878P+9B (PixelView PlayTV Pro FM+NICAM
  232. * revision 9B has on-board TDA9874A sound decoder).
  233. *
  234. * Note: There are card variants without tda9874a. Forcing the "stereo sound route"
  235. * will mute this cards.
  236. */
  237. void pvbt878p9b_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
  238. {
  239. unsigned int val = 0;
  240. if (btv->radio_user)
  241. return;
  242. if (set) {
  243. if (t->audmode & V4L2_TUNER_MODE_MONO) {
  244. val = 0x01;
  245. }
  246. if ((t->audmode & (V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2))
  247. || (t->audmode & V4L2_TUNER_MODE_STEREO)) {
  248. val = 0x02;
  249. }
  250. if (val) {
  251. gpio_bits(0x03,val);
  252. if (bttv_gpio)
  253. bttv_gpio_tracking(btv,"pvbt878p9b");
  254. }
  255. } else {
  256. t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |
  257. V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;
  258. }
  259. }
  260. /*
  261. * Dariusz Kowalewski <darekk@automex.pl>
  262. * sound control for FlyVideo 2000S (with tda9874 decoder)
  263. * based on pvbt878p9b_audio() - this is not tested, please fix!!!
  264. */
  265. void fv2000s_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
  266. {
  267. unsigned int val = 0xffff;
  268. if (btv->radio_user)
  269. return;
  270. if (set) {
  271. if (t->audmode & V4L2_TUNER_MODE_MONO) {
  272. val = 0x0000;
  273. }
  274. if ((t->audmode & (V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2))
  275. || (t->audmode & V4L2_TUNER_MODE_STEREO)) {
  276. val = 0x1080; /*-dk-???: 0x0880, 0x0080, 0x1800 ... */
  277. }
  278. if (val != 0xffff) {
  279. gpio_bits(0x1800, val);
  280. if (bttv_gpio)
  281. bttv_gpio_tracking(btv,"fv2000s");
  282. }
  283. } else {
  284. t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |
  285. V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;
  286. }
  287. }
  288. /*
  289. * sound control for Canopus WinDVR PCI
  290. * Masaki Suzuki <masaki@btree.org>
  291. */
  292. void windvr_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
  293. {
  294. unsigned long val = 0;
  295. if (set) {
  296. if (t->audmode & V4L2_TUNER_MODE_MONO)
  297. val = 0x040000;
  298. if (t->audmode & V4L2_TUNER_MODE_LANG1)
  299. val = 0;
  300. if (t->audmode & V4L2_TUNER_MODE_LANG2)
  301. val = 0x100000;
  302. if (t->audmode & V4L2_TUNER_MODE_STEREO)
  303. val = 0;
  304. if (val) {
  305. gpio_bits(0x140000, val);
  306. if (bttv_gpio)
  307. bttv_gpio_tracking(btv,"windvr");
  308. }
  309. } else {
  310. t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |
  311. V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;
  312. }
  313. }
  314. /*
  315. * sound control for AD-TVK503
  316. * Hiroshi Takekawa <sian@big.or.jp>
  317. */
  318. void adtvk503_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
  319. {
  320. unsigned int con = 0xffffff;
  321. /* btaor(0x1e0000, ~0x1e0000, BT848_GPIO_OUT_EN); */
  322. if (set) {
  323. /* btor(***, BT848_GPIO_OUT_EN); */
  324. if (t->audmode & V4L2_TUNER_MODE_LANG1)
  325. con = 0x00000000;
  326. if (t->audmode & V4L2_TUNER_MODE_LANG2)
  327. con = 0x00180000;
  328. if (t->audmode & V4L2_TUNER_MODE_STEREO)
  329. con = 0x00000000;
  330. if (t->audmode & V4L2_TUNER_MODE_MONO)
  331. con = 0x00060000;
  332. if (con != 0xffffff) {
  333. gpio_bits(0x1e0000,con);
  334. if (bttv_gpio)
  335. bttv_gpio_tracking(btv, "adtvk503");
  336. }
  337. } else {
  338. t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |
  339. V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;
  340. }
  341. }