cx23885-cards.c 71 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Driver for the Conexant CX23885 PCIe bridge
  4. *
  5. * Copyright (c) 2006 Steven Toth <[email protected]>
  6. */
  7. #include "cx23885.h"
  8. #include <linux/init.h>
  9. #include <linux/module.h>
  10. #include <linux/pci.h>
  11. #include <linux/delay.h>
  12. #include <media/drv-intf/cx25840.h>
  13. #include <linux/firmware.h>
  14. #include <misc/altera.h>
  15. #include "xc2028.h"
  16. #include "netup-eeprom.h"
  17. #include "netup-init.h"
  18. #include "altera-ci.h"
  19. #include "xc4000.h"
  20. #include "xc5000.h"
  21. #include "cx23888-ir.h"
  22. static unsigned int netup_card_rev = 4;
  23. module_param(netup_card_rev, int, 0644);
  24. MODULE_PARM_DESC(netup_card_rev,
  25. "NetUP Dual DVB-T/C CI card revision");
  26. static unsigned int enable_885_ir;
  27. module_param(enable_885_ir, int, 0644);
  28. MODULE_PARM_DESC(enable_885_ir,
  29. "Enable integrated IR controller for supported\n"
  30. "\t\t CX2388[57] boards that are wired for it:\n"
  31. "\t\t\tHVR-1250 (reported safe)\n"
  32. "\t\t\tTerraTec Cinergy T PCIe Dual (not well tested, appears to be safe)\n"
  33. "\t\t\tTeVii S470 (reported unsafe)\n"
  34. "\t\t This can cause an interrupt storm with some cards.\n"
  35. "\t\t Default: 0 [Disabled]");
  36. /* ------------------------------------------------------------------ */
  37. /* board config info */
  38. struct cx23885_board cx23885_boards[] = {
  39. [CX23885_BOARD_UNKNOWN] = {
  40. .name = "UNKNOWN/GENERIC",
  41. /* Ensure safe default for unknown boards */
  42. .clk_freq = 0,
  43. .input = {{
  44. .type = CX23885_VMUX_COMPOSITE1,
  45. .vmux = 0,
  46. }, {
  47. .type = CX23885_VMUX_COMPOSITE2,
  48. .vmux = 1,
  49. }, {
  50. .type = CX23885_VMUX_COMPOSITE3,
  51. .vmux = 2,
  52. }, {
  53. .type = CX23885_VMUX_COMPOSITE4,
  54. .vmux = 3,
  55. } },
  56. },
  57. [CX23885_BOARD_HAUPPAUGE_HVR1800lp] = {
  58. .name = "Hauppauge WinTV-HVR1800lp",
  59. .portc = CX23885_MPEG_DVB,
  60. .input = {{
  61. .type = CX23885_VMUX_TELEVISION,
  62. .vmux = 0,
  63. .gpio0 = 0xff00,
  64. }, {
  65. .type = CX23885_VMUX_DEBUG,
  66. .vmux = 0,
  67. .gpio0 = 0xff01,
  68. }, {
  69. .type = CX23885_VMUX_COMPOSITE1,
  70. .vmux = 1,
  71. .gpio0 = 0xff02,
  72. }, {
  73. .type = CX23885_VMUX_SVIDEO,
  74. .vmux = 2,
  75. .gpio0 = 0xff02,
  76. } },
  77. },
  78. [CX23885_BOARD_HAUPPAUGE_HVR1800] = {
  79. .name = "Hauppauge WinTV-HVR1800",
  80. .porta = CX23885_ANALOG_VIDEO,
  81. .portb = CX23885_MPEG_ENCODER,
  82. .portc = CX23885_MPEG_DVB,
  83. .tuner_type = TUNER_PHILIPS_TDA8290,
  84. .tuner_addr = 0x42, /* 0x84 >> 1 */
  85. .tuner_bus = 1,
  86. .input = {{
  87. .type = CX23885_VMUX_TELEVISION,
  88. .vmux = CX25840_VIN7_CH3 |
  89. CX25840_VIN5_CH2 |
  90. CX25840_VIN2_CH1,
  91. .amux = CX25840_AUDIO8,
  92. .gpio0 = 0,
  93. }, {
  94. .type = CX23885_VMUX_COMPOSITE1,
  95. .vmux = CX25840_VIN7_CH3 |
  96. CX25840_VIN4_CH2 |
  97. CX25840_VIN6_CH1,
  98. .amux = CX25840_AUDIO7,
  99. .gpio0 = 0,
  100. }, {
  101. .type = CX23885_VMUX_SVIDEO,
  102. .vmux = CX25840_VIN7_CH3 |
  103. CX25840_VIN4_CH2 |
  104. CX25840_VIN8_CH1 |
  105. CX25840_SVIDEO_ON,
  106. .amux = CX25840_AUDIO7,
  107. .gpio0 = 0,
  108. } },
  109. },
  110. [CX23885_BOARD_HAUPPAUGE_HVR1250] = {
  111. .name = "Hauppauge WinTV-HVR1250",
  112. .porta = CX23885_ANALOG_VIDEO,
  113. .portc = CX23885_MPEG_DVB,
  114. #ifdef MT2131_NO_ANALOG_SUPPORT_YET
  115. .tuner_type = TUNER_PHILIPS_TDA8290,
  116. .tuner_addr = 0x42, /* 0x84 >> 1 */
  117. .tuner_bus = 1,
  118. #endif
  119. .force_bff = 1,
  120. .input = {{
  121. #ifdef MT2131_NO_ANALOG_SUPPORT_YET
  122. .type = CX23885_VMUX_TELEVISION,
  123. .vmux = CX25840_VIN7_CH3 |
  124. CX25840_VIN5_CH2 |
  125. CX25840_VIN2_CH1,
  126. .amux = CX25840_AUDIO8,
  127. .gpio0 = 0xff00,
  128. }, {
  129. #endif
  130. .type = CX23885_VMUX_COMPOSITE1,
  131. .vmux = CX25840_VIN7_CH3 |
  132. CX25840_VIN4_CH2 |
  133. CX25840_VIN6_CH1,
  134. .amux = CX25840_AUDIO7,
  135. .gpio0 = 0xff02,
  136. }, {
  137. .type = CX23885_VMUX_SVIDEO,
  138. .vmux = CX25840_VIN7_CH3 |
  139. CX25840_VIN4_CH2 |
  140. CX25840_VIN8_CH1 |
  141. CX25840_SVIDEO_ON,
  142. .amux = CX25840_AUDIO7,
  143. .gpio0 = 0xff02,
  144. } },
  145. },
  146. [CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP] = {
  147. .name = "DViCO FusionHDTV5 Express",
  148. .portb = CX23885_MPEG_DVB,
  149. },
  150. [CX23885_BOARD_HAUPPAUGE_HVR1500Q] = {
  151. .name = "Hauppauge WinTV-HVR1500Q",
  152. .portc = CX23885_MPEG_DVB,
  153. },
  154. [CX23885_BOARD_HAUPPAUGE_HVR1500] = {
  155. .name = "Hauppauge WinTV-HVR1500",
  156. .porta = CX23885_ANALOG_VIDEO,
  157. .portc = CX23885_MPEG_DVB,
  158. .tuner_type = TUNER_XC2028,
  159. .tuner_addr = 0x61, /* 0xc2 >> 1 */
  160. .input = {{
  161. .type = CX23885_VMUX_TELEVISION,
  162. .vmux = CX25840_VIN7_CH3 |
  163. CX25840_VIN5_CH2 |
  164. CX25840_VIN2_CH1,
  165. .gpio0 = 0,
  166. }, {
  167. .type = CX23885_VMUX_COMPOSITE1,
  168. .vmux = CX25840_VIN7_CH3 |
  169. CX25840_VIN4_CH2 |
  170. CX25840_VIN6_CH1,
  171. .gpio0 = 0,
  172. }, {
  173. .type = CX23885_VMUX_SVIDEO,
  174. .vmux = CX25840_VIN7_CH3 |
  175. CX25840_VIN4_CH2 |
  176. CX25840_VIN8_CH1 |
  177. CX25840_SVIDEO_ON,
  178. .gpio0 = 0,
  179. } },
  180. },
  181. [CX23885_BOARD_HAUPPAUGE_HVR1200] = {
  182. .name = "Hauppauge WinTV-HVR1200",
  183. .portc = CX23885_MPEG_DVB,
  184. },
  185. [CX23885_BOARD_HAUPPAUGE_HVR1700] = {
  186. .name = "Hauppauge WinTV-HVR1700",
  187. .portc = CX23885_MPEG_DVB,
  188. },
  189. [CX23885_BOARD_HAUPPAUGE_HVR1400] = {
  190. .name = "Hauppauge WinTV-HVR1400",
  191. .portc = CX23885_MPEG_DVB,
  192. },
  193. [CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP] = {
  194. .name = "DViCO FusionHDTV7 Dual Express",
  195. .portb = CX23885_MPEG_DVB,
  196. .portc = CX23885_MPEG_DVB,
  197. },
  198. [CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP] = {
  199. .name = "DViCO FusionHDTV DVB-T Dual Express",
  200. .portb = CX23885_MPEG_DVB,
  201. .portc = CX23885_MPEG_DVB,
  202. },
  203. [CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H] = {
  204. .name = "Leadtek Winfast PxDVR3200 H",
  205. .portc = CX23885_MPEG_DVB,
  206. },
  207. [CX23885_BOARD_LEADTEK_WINFAST_PXPVR2200] = {
  208. .name = "Leadtek Winfast PxPVR2200",
  209. .porta = CX23885_ANALOG_VIDEO,
  210. .tuner_type = TUNER_XC2028,
  211. .tuner_addr = 0x61,
  212. .tuner_bus = 1,
  213. .input = {{
  214. .type = CX23885_VMUX_TELEVISION,
  215. .vmux = CX25840_VIN2_CH1 |
  216. CX25840_VIN5_CH2,
  217. .amux = CX25840_AUDIO8,
  218. .gpio0 = 0x704040,
  219. }, {
  220. .type = CX23885_VMUX_COMPOSITE1,
  221. .vmux = CX25840_COMPOSITE1,
  222. .amux = CX25840_AUDIO7,
  223. .gpio0 = 0x704040,
  224. }, {
  225. .type = CX23885_VMUX_SVIDEO,
  226. .vmux = CX25840_SVIDEO_LUMA3 |
  227. CX25840_SVIDEO_CHROMA4,
  228. .amux = CX25840_AUDIO7,
  229. .gpio0 = 0x704040,
  230. }, {
  231. .type = CX23885_VMUX_COMPONENT,
  232. .vmux = CX25840_VIN7_CH1 |
  233. CX25840_VIN6_CH2 |
  234. CX25840_VIN8_CH3 |
  235. CX25840_COMPONENT_ON,
  236. .amux = CX25840_AUDIO7,
  237. .gpio0 = 0x704040,
  238. } },
  239. },
  240. [CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H_XC4000] = {
  241. .name = "Leadtek Winfast PxDVR3200 H XC4000",
  242. .porta = CX23885_ANALOG_VIDEO,
  243. .portc = CX23885_MPEG_DVB,
  244. .tuner_type = TUNER_XC4000,
  245. .tuner_addr = 0x61,
  246. .radio_type = UNSET,
  247. .radio_addr = ADDR_UNSET,
  248. .input = {{
  249. .type = CX23885_VMUX_TELEVISION,
  250. .vmux = CX25840_VIN2_CH1 |
  251. CX25840_VIN5_CH2 |
  252. CX25840_NONE0_CH3,
  253. }, {
  254. .type = CX23885_VMUX_COMPOSITE1,
  255. .vmux = CX25840_COMPOSITE1,
  256. }, {
  257. .type = CX23885_VMUX_SVIDEO,
  258. .vmux = CX25840_SVIDEO_LUMA3 |
  259. CX25840_SVIDEO_CHROMA4,
  260. }, {
  261. .type = CX23885_VMUX_COMPONENT,
  262. .vmux = CX25840_VIN7_CH1 |
  263. CX25840_VIN6_CH2 |
  264. CX25840_VIN8_CH3 |
  265. CX25840_COMPONENT_ON,
  266. } },
  267. },
  268. [CX23885_BOARD_COMPRO_VIDEOMATE_E650F] = {
  269. .name = "Compro VideoMate E650F",
  270. .portc = CX23885_MPEG_DVB,
  271. },
  272. [CX23885_BOARD_TBS_6920] = {
  273. .name = "TurboSight TBS 6920",
  274. .portb = CX23885_MPEG_DVB,
  275. },
  276. [CX23885_BOARD_TBS_6980] = {
  277. .name = "TurboSight TBS 6980",
  278. .portb = CX23885_MPEG_DVB,
  279. .portc = CX23885_MPEG_DVB,
  280. },
  281. [CX23885_BOARD_TBS_6981] = {
  282. .name = "TurboSight TBS 6981",
  283. .portb = CX23885_MPEG_DVB,
  284. .portc = CX23885_MPEG_DVB,
  285. },
  286. [CX23885_BOARD_TEVII_S470] = {
  287. .name = "TeVii S470",
  288. .portb = CX23885_MPEG_DVB,
  289. },
  290. [CX23885_BOARD_DVBWORLD_2005] = {
  291. .name = "DVBWorld DVB-S2 2005",
  292. .portb = CX23885_MPEG_DVB,
  293. },
  294. [CX23885_BOARD_NETUP_DUAL_DVBS2_CI] = {
  295. .ci_type = 1,
  296. .name = "NetUP Dual DVB-S2 CI",
  297. .portb = CX23885_MPEG_DVB,
  298. .portc = CX23885_MPEG_DVB,
  299. },
  300. [CX23885_BOARD_HAUPPAUGE_HVR1270] = {
  301. .name = "Hauppauge WinTV-HVR1270",
  302. .portc = CX23885_MPEG_DVB,
  303. },
  304. [CX23885_BOARD_HAUPPAUGE_HVR1275] = {
  305. .name = "Hauppauge WinTV-HVR1275",
  306. .portc = CX23885_MPEG_DVB,
  307. },
  308. [CX23885_BOARD_HAUPPAUGE_HVR1255] = {
  309. .name = "Hauppauge WinTV-HVR1255",
  310. .porta = CX23885_ANALOG_VIDEO,
  311. .portc = CX23885_MPEG_DVB,
  312. .tuner_type = TUNER_ABSENT,
  313. .tuner_addr = 0x42, /* 0x84 >> 1 */
  314. .force_bff = 1,
  315. .input = {{
  316. .type = CX23885_VMUX_TELEVISION,
  317. .vmux = CX25840_VIN7_CH3 |
  318. CX25840_VIN5_CH2 |
  319. CX25840_VIN2_CH1 |
  320. CX25840_DIF_ON,
  321. .amux = CX25840_AUDIO8,
  322. }, {
  323. .type = CX23885_VMUX_COMPOSITE1,
  324. .vmux = CX25840_VIN7_CH3 |
  325. CX25840_VIN4_CH2 |
  326. CX25840_VIN6_CH1,
  327. .amux = CX25840_AUDIO7,
  328. }, {
  329. .type = CX23885_VMUX_SVIDEO,
  330. .vmux = CX25840_VIN7_CH3 |
  331. CX25840_VIN4_CH2 |
  332. CX25840_VIN8_CH1 |
  333. CX25840_SVIDEO_ON,
  334. .amux = CX25840_AUDIO7,
  335. } },
  336. },
  337. [CX23885_BOARD_HAUPPAUGE_HVR1255_22111] = {
  338. .name = "Hauppauge WinTV-HVR1255",
  339. .porta = CX23885_ANALOG_VIDEO,
  340. .portc = CX23885_MPEG_DVB,
  341. .tuner_type = TUNER_ABSENT,
  342. .tuner_addr = 0x42, /* 0x84 >> 1 */
  343. .force_bff = 1,
  344. .input = {{
  345. .type = CX23885_VMUX_TELEVISION,
  346. .vmux = CX25840_VIN7_CH3 |
  347. CX25840_VIN5_CH2 |
  348. CX25840_VIN2_CH1 |
  349. CX25840_DIF_ON,
  350. .amux = CX25840_AUDIO8,
  351. }, {
  352. .type = CX23885_VMUX_SVIDEO,
  353. .vmux = CX25840_VIN7_CH3 |
  354. CX25840_VIN4_CH2 |
  355. CX25840_VIN8_CH1 |
  356. CX25840_SVIDEO_ON,
  357. .amux = CX25840_AUDIO7,
  358. } },
  359. },
  360. [CX23885_BOARD_HAUPPAUGE_HVR1210] = {
  361. .name = "Hauppauge WinTV-HVR1210",
  362. .portc = CX23885_MPEG_DVB,
  363. },
  364. [CX23885_BOARD_MYGICA_X8506] = {
  365. .name = "Mygica X8506 DMB-TH",
  366. .tuner_type = TUNER_XC5000,
  367. .tuner_addr = 0x61,
  368. .tuner_bus = 1,
  369. .porta = CX23885_ANALOG_VIDEO,
  370. .portb = CX23885_MPEG_DVB,
  371. .input = {
  372. {
  373. .type = CX23885_VMUX_TELEVISION,
  374. .vmux = CX25840_COMPOSITE2,
  375. },
  376. {
  377. .type = CX23885_VMUX_COMPOSITE1,
  378. .vmux = CX25840_COMPOSITE8,
  379. },
  380. {
  381. .type = CX23885_VMUX_SVIDEO,
  382. .vmux = CX25840_SVIDEO_LUMA3 |
  383. CX25840_SVIDEO_CHROMA4,
  384. },
  385. {
  386. .type = CX23885_VMUX_COMPONENT,
  387. .vmux = CX25840_COMPONENT_ON |
  388. CX25840_VIN1_CH1 |
  389. CX25840_VIN6_CH2 |
  390. CX25840_VIN7_CH3,
  391. },
  392. },
  393. },
  394. [CX23885_BOARD_MAGICPRO_PROHDTVE2] = {
  395. .name = "Magic-Pro ProHDTV Extreme 2",
  396. .tuner_type = TUNER_XC5000,
  397. .tuner_addr = 0x61,
  398. .tuner_bus = 1,
  399. .porta = CX23885_ANALOG_VIDEO,
  400. .portb = CX23885_MPEG_DVB,
  401. .input = {
  402. {
  403. .type = CX23885_VMUX_TELEVISION,
  404. .vmux = CX25840_COMPOSITE2,
  405. },
  406. {
  407. .type = CX23885_VMUX_COMPOSITE1,
  408. .vmux = CX25840_COMPOSITE8,
  409. },
  410. {
  411. .type = CX23885_VMUX_SVIDEO,
  412. .vmux = CX25840_SVIDEO_LUMA3 |
  413. CX25840_SVIDEO_CHROMA4,
  414. },
  415. {
  416. .type = CX23885_VMUX_COMPONENT,
  417. .vmux = CX25840_COMPONENT_ON |
  418. CX25840_VIN1_CH1 |
  419. CX25840_VIN6_CH2 |
  420. CX25840_VIN7_CH3,
  421. },
  422. },
  423. },
  424. [CX23885_BOARD_HAUPPAUGE_HVR1850] = {
  425. .name = "Hauppauge WinTV-HVR1850",
  426. .porta = CX23885_ANALOG_VIDEO,
  427. .portb = CX23885_MPEG_ENCODER,
  428. .portc = CX23885_MPEG_DVB,
  429. .tuner_type = TUNER_ABSENT,
  430. .tuner_addr = 0x42, /* 0x84 >> 1 */
  431. .force_bff = 1,
  432. .input = {{
  433. .type = CX23885_VMUX_TELEVISION,
  434. .vmux = CX25840_VIN7_CH3 |
  435. CX25840_VIN5_CH2 |
  436. CX25840_VIN2_CH1 |
  437. CX25840_DIF_ON,
  438. .amux = CX25840_AUDIO8,
  439. }, {
  440. .type = CX23885_VMUX_COMPOSITE1,
  441. .vmux = CX25840_VIN7_CH3 |
  442. CX25840_VIN4_CH2 |
  443. CX25840_VIN6_CH1,
  444. .amux = CX25840_AUDIO7,
  445. }, {
  446. .type = CX23885_VMUX_SVIDEO,
  447. .vmux = CX25840_VIN7_CH3 |
  448. CX25840_VIN4_CH2 |
  449. CX25840_VIN8_CH1 |
  450. CX25840_SVIDEO_ON,
  451. .amux = CX25840_AUDIO7,
  452. } },
  453. },
  454. [CX23885_BOARD_COMPRO_VIDEOMATE_E800] = {
  455. .name = "Compro VideoMate E800",
  456. .portc = CX23885_MPEG_DVB,
  457. },
  458. [CX23885_BOARD_HAUPPAUGE_HVR1290] = {
  459. .name = "Hauppauge WinTV-HVR1290",
  460. .portc = CX23885_MPEG_DVB,
  461. },
  462. [CX23885_BOARD_MYGICA_X8558PRO] = {
  463. .name = "Mygica X8558 PRO DMB-TH",
  464. .portb = CX23885_MPEG_DVB,
  465. .portc = CX23885_MPEG_DVB,
  466. },
  467. [CX23885_BOARD_LEADTEK_WINFAST_PXTV1200] = {
  468. .name = "LEADTEK WinFast PxTV1200",
  469. .porta = CX23885_ANALOG_VIDEO,
  470. .tuner_type = TUNER_XC2028,
  471. .tuner_addr = 0x61,
  472. .tuner_bus = 1,
  473. .input = {{
  474. .type = CX23885_VMUX_TELEVISION,
  475. .vmux = CX25840_VIN2_CH1 |
  476. CX25840_VIN5_CH2 |
  477. CX25840_NONE0_CH3,
  478. }, {
  479. .type = CX23885_VMUX_COMPOSITE1,
  480. .vmux = CX25840_COMPOSITE1,
  481. }, {
  482. .type = CX23885_VMUX_SVIDEO,
  483. .vmux = CX25840_SVIDEO_LUMA3 |
  484. CX25840_SVIDEO_CHROMA4,
  485. }, {
  486. .type = CX23885_VMUX_COMPONENT,
  487. .vmux = CX25840_VIN7_CH1 |
  488. CX25840_VIN6_CH2 |
  489. CX25840_VIN8_CH3 |
  490. CX25840_COMPONENT_ON,
  491. } },
  492. },
  493. [CX23885_BOARD_GOTVIEW_X5_3D_HYBRID] = {
  494. .name = "GoTView X5 3D Hybrid",
  495. .tuner_type = TUNER_XC5000,
  496. .tuner_addr = 0x64,
  497. .tuner_bus = 1,
  498. .porta = CX23885_ANALOG_VIDEO,
  499. .portb = CX23885_MPEG_DVB,
  500. .input = {{
  501. .type = CX23885_VMUX_TELEVISION,
  502. .vmux = CX25840_VIN2_CH1 |
  503. CX25840_VIN5_CH2,
  504. .gpio0 = 0x02,
  505. }, {
  506. .type = CX23885_VMUX_COMPOSITE1,
  507. .vmux = CX23885_VMUX_COMPOSITE1,
  508. }, {
  509. .type = CX23885_VMUX_SVIDEO,
  510. .vmux = CX25840_SVIDEO_LUMA3 |
  511. CX25840_SVIDEO_CHROMA4,
  512. } },
  513. },
  514. [CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF] = {
  515. .ci_type = 2,
  516. .name = "NetUP Dual DVB-T/C-CI RF",
  517. .porta = CX23885_ANALOG_VIDEO,
  518. .portb = CX23885_MPEG_DVB,
  519. .portc = CX23885_MPEG_DVB,
  520. .num_fds_portb = 2,
  521. .num_fds_portc = 2,
  522. .tuner_type = TUNER_XC5000,
  523. .tuner_addr = 0x64,
  524. .input = { {
  525. .type = CX23885_VMUX_TELEVISION,
  526. .vmux = CX25840_COMPOSITE1,
  527. } },
  528. },
  529. [CX23885_BOARD_MPX885] = {
  530. .name = "MPX-885",
  531. .porta = CX23885_ANALOG_VIDEO,
  532. .input = {{
  533. .type = CX23885_VMUX_COMPOSITE1,
  534. .vmux = CX25840_COMPOSITE1,
  535. .amux = CX25840_AUDIO6,
  536. .gpio0 = 0,
  537. }, {
  538. .type = CX23885_VMUX_COMPOSITE2,
  539. .vmux = CX25840_COMPOSITE2,
  540. .amux = CX25840_AUDIO6,
  541. .gpio0 = 0,
  542. }, {
  543. .type = CX23885_VMUX_COMPOSITE3,
  544. .vmux = CX25840_COMPOSITE3,
  545. .amux = CX25840_AUDIO7,
  546. .gpio0 = 0,
  547. }, {
  548. .type = CX23885_VMUX_COMPOSITE4,
  549. .vmux = CX25840_COMPOSITE4,
  550. .amux = CX25840_AUDIO7,
  551. .gpio0 = 0,
  552. } },
  553. },
  554. [CX23885_BOARD_MYGICA_X8507] = {
  555. .name = "Mygica X8502/X8507 ISDB-T",
  556. .tuner_type = TUNER_XC5000,
  557. .tuner_addr = 0x61,
  558. .tuner_bus = 1,
  559. .porta = CX23885_ANALOG_VIDEO,
  560. .portb = CX23885_MPEG_DVB,
  561. .input = {
  562. {
  563. .type = CX23885_VMUX_TELEVISION,
  564. .vmux = CX25840_COMPOSITE2,
  565. .amux = CX25840_AUDIO8,
  566. },
  567. {
  568. .type = CX23885_VMUX_COMPOSITE1,
  569. .vmux = CX25840_COMPOSITE8,
  570. .amux = CX25840_AUDIO7,
  571. },
  572. {
  573. .type = CX23885_VMUX_SVIDEO,
  574. .vmux = CX25840_SVIDEO_LUMA3 |
  575. CX25840_SVIDEO_CHROMA4,
  576. .amux = CX25840_AUDIO7,
  577. },
  578. {
  579. .type = CX23885_VMUX_COMPONENT,
  580. .vmux = CX25840_COMPONENT_ON |
  581. CX25840_VIN1_CH1 |
  582. CX25840_VIN6_CH2 |
  583. CX25840_VIN7_CH3,
  584. .amux = CX25840_AUDIO7,
  585. },
  586. },
  587. },
  588. [CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL] = {
  589. .name = "TerraTec Cinergy T PCIe Dual",
  590. .portb = CX23885_MPEG_DVB,
  591. .portc = CX23885_MPEG_DVB,
  592. },
  593. [CX23885_BOARD_TEVII_S471] = {
  594. .name = "TeVii S471",
  595. .portb = CX23885_MPEG_DVB,
  596. },
  597. [CX23885_BOARD_PROF_8000] = {
  598. .name = "Prof Revolution DVB-S2 8000",
  599. .portb = CX23885_MPEG_DVB,
  600. },
  601. [CX23885_BOARD_HAUPPAUGE_HVR4400] = {
  602. .name = "Hauppauge WinTV-HVR4400/HVR5500",
  603. .porta = CX23885_ANALOG_VIDEO,
  604. .portb = CX23885_MPEG_DVB,
  605. .portc = CX23885_MPEG_DVB,
  606. .tuner_type = TUNER_NXP_TDA18271,
  607. .tuner_addr = 0x60, /* 0xc0 >> 1 */
  608. .tuner_bus = 1,
  609. },
  610. [CX23885_BOARD_HAUPPAUGE_STARBURST] = {
  611. .name = "Hauppauge WinTV Starburst",
  612. .portb = CX23885_MPEG_DVB,
  613. },
  614. [CX23885_BOARD_AVERMEDIA_HC81R] = {
  615. .name = "AVerTV Hybrid Express Slim HC81R",
  616. .tuner_type = TUNER_XC2028,
  617. .tuner_addr = 0x61, /* 0xc2 >> 1 */
  618. .tuner_bus = 1,
  619. .porta = CX23885_ANALOG_VIDEO,
  620. .input = {{
  621. .type = CX23885_VMUX_TELEVISION,
  622. .vmux = CX25840_VIN2_CH1 |
  623. CX25840_VIN5_CH2 |
  624. CX25840_NONE0_CH3 |
  625. CX25840_NONE1_CH3,
  626. .amux = CX25840_AUDIO8,
  627. }, {
  628. .type = CX23885_VMUX_SVIDEO,
  629. .vmux = CX25840_VIN8_CH1 |
  630. CX25840_NONE_CH2 |
  631. CX25840_VIN7_CH3 |
  632. CX25840_SVIDEO_ON,
  633. .amux = CX25840_AUDIO6,
  634. }, {
  635. .type = CX23885_VMUX_COMPONENT,
  636. .vmux = CX25840_VIN1_CH1 |
  637. CX25840_NONE_CH2 |
  638. CX25840_NONE0_CH3 |
  639. CX25840_NONE1_CH3,
  640. .amux = CX25840_AUDIO6,
  641. } },
  642. },
  643. [CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP2] = {
  644. .name = "DViCO FusionHDTV DVB-T Dual Express2",
  645. .portb = CX23885_MPEG_DVB,
  646. .portc = CX23885_MPEG_DVB,
  647. },
  648. [CX23885_BOARD_HAUPPAUGE_IMPACTVCBE] = {
  649. .name = "Hauppauge ImpactVCB-e",
  650. .tuner_type = TUNER_ABSENT,
  651. .porta = CX23885_ANALOG_VIDEO,
  652. .input = {{
  653. .type = CX23885_VMUX_COMPOSITE1,
  654. .vmux = CX25840_VIN6_CH1,
  655. .amux = CX25840_AUDIO7,
  656. }, {
  657. .type = CX23885_VMUX_SVIDEO,
  658. .vmux = CX25840_VIN4_CH2 |
  659. CX25840_VIN8_CH1 |
  660. CX25840_SVIDEO_ON,
  661. .amux = CX25840_AUDIO7,
  662. } },
  663. },
  664. [CX23885_BOARD_DVBSKY_T9580] = {
  665. .name = "DVBSky T9580",
  666. .portb = CX23885_MPEG_DVB,
  667. .portc = CX23885_MPEG_DVB,
  668. },
  669. [CX23885_BOARD_DVBSKY_T980C] = {
  670. .name = "DVBSky T980C",
  671. .portb = CX23885_MPEG_DVB,
  672. },
  673. [CX23885_BOARD_DVBSKY_S950C] = {
  674. .name = "DVBSky S950C",
  675. .portb = CX23885_MPEG_DVB,
  676. },
  677. [CX23885_BOARD_TT_CT2_4500_CI] = {
  678. .name = "Technotrend TT-budget CT2-4500 CI",
  679. .portb = CX23885_MPEG_DVB,
  680. },
  681. [CX23885_BOARD_DVBSKY_S950] = {
  682. .name = "DVBSky S950",
  683. .portb = CX23885_MPEG_DVB,
  684. },
  685. [CX23885_BOARD_DVBSKY_S952] = {
  686. .name = "DVBSky S952",
  687. .portb = CX23885_MPEG_DVB,
  688. .portc = CX23885_MPEG_DVB,
  689. },
  690. [CX23885_BOARD_DVBSKY_T982] = {
  691. .name = "DVBSky T982",
  692. .portb = CX23885_MPEG_DVB,
  693. .portc = CX23885_MPEG_DVB,
  694. },
  695. [CX23885_BOARD_HAUPPAUGE_HVR5525] = {
  696. .name = "Hauppauge WinTV-HVR5525",
  697. .porta = CX23885_ANALOG_VIDEO,
  698. .portb = CX23885_MPEG_DVB,
  699. .portc = CX23885_MPEG_DVB,
  700. .tuner_type = TUNER_ABSENT,
  701. .force_bff = 1,
  702. .input = {{
  703. .type = CX23885_VMUX_TELEVISION,
  704. .vmux = CX25840_VIN7_CH3 |
  705. CX25840_VIN5_CH2 |
  706. CX25840_VIN2_CH1 |
  707. CX25840_DIF_ON,
  708. .amux = CX25840_AUDIO8,
  709. }, {
  710. .type = CX23885_VMUX_COMPOSITE1,
  711. .vmux = CX25840_VIN6_CH1,
  712. .amux = CX25840_AUDIO7,
  713. }, {
  714. .type = CX23885_VMUX_SVIDEO,
  715. .vmux = CX25840_VIN7_CH3 |
  716. CX25840_VIN8_CH1 |
  717. CX25840_SVIDEO_ON,
  718. .amux = CX25840_AUDIO7,
  719. } },
  720. },
  721. [CX23885_BOARD_VIEWCAST_260E] = {
  722. .name = "ViewCast 260e",
  723. .porta = CX23885_ANALOG_VIDEO,
  724. .force_bff = 1,
  725. .input = {{
  726. .type = CX23885_VMUX_COMPOSITE1,
  727. .vmux = CX25840_VIN6_CH1,
  728. .amux = CX25840_AUDIO7,
  729. }, {
  730. .type = CX23885_VMUX_SVIDEO,
  731. .vmux = CX25840_VIN7_CH3 |
  732. CX25840_VIN5_CH1 |
  733. CX25840_SVIDEO_ON,
  734. .amux = CX25840_AUDIO7,
  735. }, {
  736. .type = CX23885_VMUX_COMPONENT,
  737. .vmux = CX25840_VIN7_CH3 |
  738. CX25840_VIN6_CH2 |
  739. CX25840_VIN5_CH1 |
  740. CX25840_COMPONENT_ON,
  741. .amux = CX25840_AUDIO7,
  742. } },
  743. },
  744. [CX23885_BOARD_VIEWCAST_460E] = {
  745. .name = "ViewCast 460e",
  746. .porta = CX23885_ANALOG_VIDEO,
  747. .force_bff = 1,
  748. .input = {{
  749. .type = CX23885_VMUX_COMPOSITE1,
  750. .vmux = CX25840_VIN4_CH1,
  751. .amux = CX25840_AUDIO7,
  752. }, {
  753. .type = CX23885_VMUX_SVIDEO,
  754. .vmux = CX25840_VIN7_CH3 |
  755. CX25840_VIN6_CH1 |
  756. CX25840_SVIDEO_ON,
  757. .amux = CX25840_AUDIO7,
  758. }, {
  759. .type = CX23885_VMUX_COMPONENT,
  760. .vmux = CX25840_VIN7_CH3 |
  761. CX25840_VIN6_CH1 |
  762. CX25840_VIN5_CH2 |
  763. CX25840_COMPONENT_ON,
  764. .amux = CX25840_AUDIO7,
  765. }, {
  766. .type = CX23885_VMUX_COMPOSITE2,
  767. .vmux = CX25840_VIN6_CH1,
  768. .amux = CX25840_AUDIO7,
  769. } },
  770. },
  771. [CX23885_BOARD_HAUPPAUGE_QUADHD_DVB] = {
  772. .name = "Hauppauge WinTV-QuadHD-DVB",
  773. .porta = CX23885_ANALOG_VIDEO,
  774. .portb = CX23885_MPEG_DVB,
  775. .portc = CX23885_MPEG_DVB,
  776. .tuner_type = TUNER_ABSENT,
  777. .force_bff = 1,
  778. .input = {{
  779. .type = CX23885_VMUX_TELEVISION,
  780. .vmux = CX25840_VIN7_CH3 |
  781. CX25840_VIN5_CH2 |
  782. CX25840_VIN2_CH1 |
  783. CX25840_DIF_ON,
  784. .amux = CX25840_AUDIO8,
  785. } },
  786. },
  787. [CX23885_BOARD_HAUPPAUGE_QUADHD_DVB_885] = {
  788. .name = "Hauppauge WinTV-QuadHD-DVB(885)",
  789. .portb = CX23885_MPEG_DVB,
  790. .portc = CX23885_MPEG_DVB,
  791. .tuner_type = TUNER_ABSENT,
  792. },
  793. [CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC] = {
  794. .name = "Hauppauge WinTV-QuadHD-ATSC",
  795. .porta = CX23885_ANALOG_VIDEO,
  796. .portb = CX23885_MPEG_DVB,
  797. .portc = CX23885_MPEG_DVB,
  798. .tuner_type = TUNER_ABSENT,
  799. .input = {{
  800. .type = CX23885_VMUX_TELEVISION,
  801. .vmux = CX25840_VIN7_CH3 |
  802. CX25840_VIN5_CH2 |
  803. CX25840_VIN2_CH1 |
  804. CX25840_DIF_ON,
  805. .amux = CX25840_AUDIO8,
  806. } },
  807. },
  808. [CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC_885] = {
  809. .name = "Hauppauge WinTV-QuadHD-ATSC(885)",
  810. .portb = CX23885_MPEG_DVB,
  811. .portc = CX23885_MPEG_DVB,
  812. .tuner_type = TUNER_ABSENT,
  813. },
  814. [CX23885_BOARD_HAUPPAUGE_HVR1265_K4] = {
  815. .name = "Hauppauge WinTV-HVR-1265(161111)",
  816. .porta = CX23885_ANALOG_VIDEO,
  817. .portc = CX23885_MPEG_DVB,
  818. .tuner_type = TUNER_ABSENT,
  819. .input = {{
  820. .type = CX23885_VMUX_TELEVISION,
  821. .vmux = CX25840_VIN7_CH3 |
  822. CX25840_VIN5_CH2 |
  823. CX25840_VIN2_CH1 |
  824. CX25840_DIF_ON,
  825. .amux = CX25840_AUDIO8,
  826. }, {
  827. .type = CX23885_VMUX_SVIDEO,
  828. .vmux = CX25840_VIN4_CH2 |
  829. CX25840_VIN6_CH1 |
  830. CX25840_SVIDEO_ON,
  831. .amux = CX25840_AUDIO7,
  832. } },
  833. },
  834. [CX23885_BOARD_HAUPPAUGE_STARBURST2] = {
  835. .name = "Hauppauge WinTV-Starburst2",
  836. .portb = CX23885_MPEG_DVB,
  837. },
  838. [CX23885_BOARD_AVERMEDIA_CE310B] = {
  839. .name = "AVerMedia CE310B",
  840. .porta = CX23885_ANALOG_VIDEO,
  841. .force_bff = 1,
  842. .input = {{
  843. .type = CX23885_VMUX_COMPOSITE1,
  844. .vmux = CX25840_VIN1_CH1 |
  845. CX25840_NONE_CH2 |
  846. CX25840_NONE0_CH3,
  847. .amux = CX25840_AUDIO7,
  848. }, {
  849. .type = CX23885_VMUX_SVIDEO,
  850. .vmux = CX25840_VIN8_CH1 |
  851. CX25840_NONE_CH2 |
  852. CX25840_VIN7_CH3 |
  853. CX25840_SVIDEO_ON,
  854. .amux = CX25840_AUDIO7,
  855. } },
  856. },
  857. };
  858. const unsigned int cx23885_bcount = ARRAY_SIZE(cx23885_boards);
  859. /* ------------------------------------------------------------------ */
  860. /* PCI subsystem IDs */
  861. struct cx23885_subid cx23885_subids[] = {
  862. {
  863. .subvendor = 0x0070,
  864. .subdevice = 0x3400,
  865. .card = CX23885_BOARD_UNKNOWN,
  866. }, {
  867. .subvendor = 0x0070,
  868. .subdevice = 0x7600,
  869. .card = CX23885_BOARD_HAUPPAUGE_HVR1800lp,
  870. }, {
  871. .subvendor = 0x0070,
  872. .subdevice = 0x7800,
  873. .card = CX23885_BOARD_HAUPPAUGE_HVR1800,
  874. }, {
  875. .subvendor = 0x0070,
  876. .subdevice = 0x7801,
  877. .card = CX23885_BOARD_HAUPPAUGE_HVR1800,
  878. }, {
  879. .subvendor = 0x0070,
  880. .subdevice = 0x7809,
  881. .card = CX23885_BOARD_HAUPPAUGE_HVR1800,
  882. }, {
  883. .subvendor = 0x0070,
  884. .subdevice = 0x7911,
  885. .card = CX23885_BOARD_HAUPPAUGE_HVR1250,
  886. }, {
  887. .subvendor = 0x18ac,
  888. .subdevice = 0xd500,
  889. .card = CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP,
  890. }, {
  891. .subvendor = 0x0070,
  892. .subdevice = 0x7790,
  893. .card = CX23885_BOARD_HAUPPAUGE_HVR1500Q,
  894. }, {
  895. .subvendor = 0x0070,
  896. .subdevice = 0x7797,
  897. .card = CX23885_BOARD_HAUPPAUGE_HVR1500Q,
  898. }, {
  899. .subvendor = 0x0070,
  900. .subdevice = 0x7710,
  901. .card = CX23885_BOARD_HAUPPAUGE_HVR1500,
  902. }, {
  903. .subvendor = 0x0070,
  904. .subdevice = 0x7717,
  905. .card = CX23885_BOARD_HAUPPAUGE_HVR1500,
  906. }, {
  907. .subvendor = 0x0070,
  908. .subdevice = 0x71d1,
  909. .card = CX23885_BOARD_HAUPPAUGE_HVR1200,
  910. }, {
  911. .subvendor = 0x0070,
  912. .subdevice = 0x71d3,
  913. .card = CX23885_BOARD_HAUPPAUGE_HVR1200,
  914. }, {
  915. .subvendor = 0x0070,
  916. .subdevice = 0x8101,
  917. .card = CX23885_BOARD_HAUPPAUGE_HVR1700,
  918. }, {
  919. .subvendor = 0x0070,
  920. .subdevice = 0x8010,
  921. .card = CX23885_BOARD_HAUPPAUGE_HVR1400,
  922. }, {
  923. .subvendor = 0x18ac,
  924. .subdevice = 0xd618,
  925. .card = CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP,
  926. }, {
  927. .subvendor = 0x18ac,
  928. .subdevice = 0xdb78,
  929. .card = CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP,
  930. }, {
  931. .subvendor = 0x107d,
  932. .subdevice = 0x6681,
  933. .card = CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H,
  934. }, {
  935. .subvendor = 0x107d,
  936. .subdevice = 0x6f21,
  937. .card = CX23885_BOARD_LEADTEK_WINFAST_PXPVR2200,
  938. }, {
  939. .subvendor = 0x107d,
  940. .subdevice = 0x6f39,
  941. .card = CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H_XC4000,
  942. }, {
  943. .subvendor = 0x185b,
  944. .subdevice = 0xe800,
  945. .card = CX23885_BOARD_COMPRO_VIDEOMATE_E650F,
  946. }, {
  947. .subvendor = 0x6920,
  948. .subdevice = 0x8888,
  949. .card = CX23885_BOARD_TBS_6920,
  950. }, {
  951. .subvendor = 0x6980,
  952. .subdevice = 0x8888,
  953. .card = CX23885_BOARD_TBS_6980,
  954. }, {
  955. .subvendor = 0x6981,
  956. .subdevice = 0x8888,
  957. .card = CX23885_BOARD_TBS_6981,
  958. }, {
  959. .subvendor = 0xd470,
  960. .subdevice = 0x9022,
  961. .card = CX23885_BOARD_TEVII_S470,
  962. }, {
  963. .subvendor = 0x0001,
  964. .subdevice = 0x2005,
  965. .card = CX23885_BOARD_DVBWORLD_2005,
  966. }, {
  967. .subvendor = 0x1b55,
  968. .subdevice = 0x2a2c,
  969. .card = CX23885_BOARD_NETUP_DUAL_DVBS2_CI,
  970. }, {
  971. .subvendor = 0x0070,
  972. .subdevice = 0x2211,
  973. .card = CX23885_BOARD_HAUPPAUGE_HVR1270,
  974. }, {
  975. .subvendor = 0x0070,
  976. .subdevice = 0x2215,
  977. .card = CX23885_BOARD_HAUPPAUGE_HVR1275,
  978. }, {
  979. .subvendor = 0x0070,
  980. .subdevice = 0x221d,
  981. .card = CX23885_BOARD_HAUPPAUGE_HVR1275,
  982. }, {
  983. .subvendor = 0x0070,
  984. .subdevice = 0x2251,
  985. .card = CX23885_BOARD_HAUPPAUGE_HVR1255,
  986. }, {
  987. .subvendor = 0x0070,
  988. .subdevice = 0x2259,
  989. .card = CX23885_BOARD_HAUPPAUGE_HVR1255_22111,
  990. }, {
  991. .subvendor = 0x0070,
  992. .subdevice = 0x2291,
  993. .card = CX23885_BOARD_HAUPPAUGE_HVR1210,
  994. }, {
  995. .subvendor = 0x0070,
  996. .subdevice = 0x2295,
  997. .card = CX23885_BOARD_HAUPPAUGE_HVR1210,
  998. }, {
  999. .subvendor = 0x0070,
  1000. .subdevice = 0x2299,
  1001. .card = CX23885_BOARD_HAUPPAUGE_HVR1210,
  1002. }, {
  1003. .subvendor = 0x0070,
  1004. .subdevice = 0x229d,
  1005. .card = CX23885_BOARD_HAUPPAUGE_HVR1210, /* HVR1215 */
  1006. }, {
  1007. .subvendor = 0x0070,
  1008. .subdevice = 0x22f0,
  1009. .card = CX23885_BOARD_HAUPPAUGE_HVR1210,
  1010. }, {
  1011. .subvendor = 0x0070,
  1012. .subdevice = 0x22f1,
  1013. .card = CX23885_BOARD_HAUPPAUGE_HVR1255,
  1014. }, {
  1015. .subvendor = 0x0070,
  1016. .subdevice = 0x22f2,
  1017. .card = CX23885_BOARD_HAUPPAUGE_HVR1275,
  1018. }, {
  1019. .subvendor = 0x0070,
  1020. .subdevice = 0x22f3,
  1021. .card = CX23885_BOARD_HAUPPAUGE_HVR1210, /* HVR1215 */
  1022. }, {
  1023. .subvendor = 0x0070,
  1024. .subdevice = 0x22f4,
  1025. .card = CX23885_BOARD_HAUPPAUGE_HVR1210,
  1026. }, {
  1027. .subvendor = 0x0070,
  1028. .subdevice = 0x22f5,
  1029. .card = CX23885_BOARD_HAUPPAUGE_HVR1210, /* HVR1215 */
  1030. }, {
  1031. .subvendor = 0x14f1,
  1032. .subdevice = 0x8651,
  1033. .card = CX23885_BOARD_MYGICA_X8506,
  1034. }, {
  1035. .subvendor = 0x14f1,
  1036. .subdevice = 0x8657,
  1037. .card = CX23885_BOARD_MAGICPRO_PROHDTVE2,
  1038. }, {
  1039. .subvendor = 0x0070,
  1040. .subdevice = 0x8541,
  1041. .card = CX23885_BOARD_HAUPPAUGE_HVR1850,
  1042. }, {
  1043. .subvendor = 0x1858,
  1044. .subdevice = 0xe800,
  1045. .card = CX23885_BOARD_COMPRO_VIDEOMATE_E800,
  1046. }, {
  1047. .subvendor = 0x0070,
  1048. .subdevice = 0x8551,
  1049. .card = CX23885_BOARD_HAUPPAUGE_HVR1290,
  1050. }, {
  1051. .subvendor = 0x14f1,
  1052. .subdevice = 0x8578,
  1053. .card = CX23885_BOARD_MYGICA_X8558PRO,
  1054. }, {
  1055. .subvendor = 0x107d,
  1056. .subdevice = 0x6f22,
  1057. .card = CX23885_BOARD_LEADTEK_WINFAST_PXTV1200,
  1058. }, {
  1059. .subvendor = 0x5654,
  1060. .subdevice = 0x2390,
  1061. .card = CX23885_BOARD_GOTVIEW_X5_3D_HYBRID,
  1062. }, {
  1063. .subvendor = 0x1b55,
  1064. .subdevice = 0xe2e4,
  1065. .card = CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF,
  1066. }, {
  1067. .subvendor = 0x14f1,
  1068. .subdevice = 0x8502,
  1069. .card = CX23885_BOARD_MYGICA_X8507,
  1070. }, {
  1071. .subvendor = 0x153b,
  1072. .subdevice = 0x117e,
  1073. .card = CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL,
  1074. }, {
  1075. .subvendor = 0xd471,
  1076. .subdevice = 0x9022,
  1077. .card = CX23885_BOARD_TEVII_S471,
  1078. }, {
  1079. .subvendor = 0x8000,
  1080. .subdevice = 0x3034,
  1081. .card = CX23885_BOARD_PROF_8000,
  1082. }, {
  1083. .subvendor = 0x0070,
  1084. .subdevice = 0xc108,
  1085. .card = CX23885_BOARD_HAUPPAUGE_HVR4400, /* Hauppauge WinTV HVR-4400 (Model 121xxx, Hybrid DVB-T/S2, IR) */
  1086. }, {
  1087. .subvendor = 0x0070,
  1088. .subdevice = 0xc138,
  1089. .card = CX23885_BOARD_HAUPPAUGE_HVR4400, /* Hauppauge WinTV HVR-5500 (Model 121xxx, Hybrid DVB-T/C/S2, IR) */
  1090. }, {
  1091. .subvendor = 0x0070,
  1092. .subdevice = 0xc12a,
  1093. .card = CX23885_BOARD_HAUPPAUGE_STARBURST, /* Hauppauge WinTV Starburst (Model 121x00, DVB-S2, IR) */
  1094. }, {
  1095. .subvendor = 0x0070,
  1096. .subdevice = 0xc1f8,
  1097. .card = CX23885_BOARD_HAUPPAUGE_HVR4400, /* Hauppauge WinTV HVR-5500 (Model 121xxx, Hybrid DVB-T/C/S2, IR) */
  1098. }, {
  1099. .subvendor = 0x1461,
  1100. .subdevice = 0xd939,
  1101. .card = CX23885_BOARD_AVERMEDIA_HC81R,
  1102. }, {
  1103. .subvendor = 0x0070,
  1104. .subdevice = 0x7133,
  1105. .card = CX23885_BOARD_HAUPPAUGE_IMPACTVCBE,
  1106. }, {
  1107. .subvendor = 0x0070,
  1108. .subdevice = 0x7137,
  1109. .card = CX23885_BOARD_HAUPPAUGE_IMPACTVCBE,
  1110. }, {
  1111. .subvendor = 0x18ac,
  1112. .subdevice = 0xdb98,
  1113. .card = CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP2,
  1114. }, {
  1115. .subvendor = 0x4254,
  1116. .subdevice = 0x9580,
  1117. .card = CX23885_BOARD_DVBSKY_T9580,
  1118. }, {
  1119. .subvendor = 0x4254,
  1120. .subdevice = 0x980c,
  1121. .card = CX23885_BOARD_DVBSKY_T980C,
  1122. }, {
  1123. .subvendor = 0x4254,
  1124. .subdevice = 0x950c,
  1125. .card = CX23885_BOARD_DVBSKY_S950C,
  1126. }, {
  1127. .subvendor = 0x13c2,
  1128. .subdevice = 0x3013,
  1129. .card = CX23885_BOARD_TT_CT2_4500_CI,
  1130. }, {
  1131. .subvendor = 0x4254,
  1132. .subdevice = 0x0950,
  1133. .card = CX23885_BOARD_DVBSKY_S950,
  1134. }, {
  1135. .subvendor = 0x4254,
  1136. .subdevice = 0x0952,
  1137. .card = CX23885_BOARD_DVBSKY_S952,
  1138. }, {
  1139. .subvendor = 0x4254,
  1140. .subdevice = 0x0982,
  1141. .card = CX23885_BOARD_DVBSKY_T982,
  1142. }, {
  1143. .subvendor = 0x0070,
  1144. .subdevice = 0xf038,
  1145. .card = CX23885_BOARD_HAUPPAUGE_HVR5525,
  1146. }, {
  1147. .subvendor = 0x1576,
  1148. .subdevice = 0x0260,
  1149. .card = CX23885_BOARD_VIEWCAST_260E,
  1150. }, {
  1151. .subvendor = 0x1576,
  1152. .subdevice = 0x0460,
  1153. .card = CX23885_BOARD_VIEWCAST_460E,
  1154. }, {
  1155. .subvendor = 0x0070,
  1156. .subdevice = 0x6a28,
  1157. .card = CX23885_BOARD_HAUPPAUGE_QUADHD_DVB, /* Tuner Pair 1 */
  1158. }, {
  1159. .subvendor = 0x0070,
  1160. .subdevice = 0x6b28,
  1161. .card = CX23885_BOARD_HAUPPAUGE_QUADHD_DVB, /* Tuner Pair 2 */
  1162. }, {
  1163. .subvendor = 0x0070,
  1164. .subdevice = 0x6a18,
  1165. .card = CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC, /* Tuner Pair 1 */
  1166. }, {
  1167. .subvendor = 0x0070,
  1168. .subdevice = 0x6b18,
  1169. .card = CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC, /* Tuner Pair 2 */
  1170. }, {
  1171. .subvendor = 0x0070,
  1172. .subdevice = 0x2a18,
  1173. .card = CX23885_BOARD_HAUPPAUGE_HVR1265_K4, /* Hauppauge WinTV HVR-1265 (Model 161xx1, Hybrid ATSC/QAM-B) */
  1174. }, {
  1175. .subvendor = 0x0070,
  1176. .subdevice = 0xf02a,
  1177. .card = CX23885_BOARD_HAUPPAUGE_STARBURST2,
  1178. }, {
  1179. .subvendor = 0x1461,
  1180. .subdevice = 0x3100,
  1181. .card = CX23885_BOARD_AVERMEDIA_CE310B,
  1182. },
  1183. };
  1184. const unsigned int cx23885_idcount = ARRAY_SIZE(cx23885_subids);
  1185. void cx23885_card_list(struct cx23885_dev *dev)
  1186. {
  1187. int i;
  1188. if (0 == dev->pci->subsystem_vendor &&
  1189. 0 == dev->pci->subsystem_device) {
  1190. pr_info("%s: Board has no valid PCIe Subsystem ID and can't\n"
  1191. "%s: be autodetected. Pass card=<n> insmod option\n"
  1192. "%s: to workaround that. Redirect complaints to the\n"
  1193. "%s: vendor of the TV card. Best regards,\n"
  1194. "%s: -- tux\n",
  1195. dev->name, dev->name, dev->name, dev->name, dev->name);
  1196. } else {
  1197. pr_info("%s: Your board isn't known (yet) to the driver.\n"
  1198. "%s: Try to pick one of the existing card configs via\n"
  1199. "%s: card=<n> insmod option. Updating to the latest\n"
  1200. "%s: version might help as well.\n",
  1201. dev->name, dev->name, dev->name, dev->name);
  1202. }
  1203. pr_info("%s: Here is a list of valid choices for the card=<n> insmod option:\n",
  1204. dev->name);
  1205. for (i = 0; i < cx23885_bcount; i++)
  1206. pr_info("%s: card=%d -> %s\n",
  1207. dev->name, i, cx23885_boards[i].name);
  1208. }
  1209. static void viewcast_eeprom(struct cx23885_dev *dev, u8 *eeprom_data)
  1210. {
  1211. u32 sn;
  1212. /* The serial number record begins with tag 0x59 */
  1213. if (*(eeprom_data + 0x00) != 0x59) {
  1214. pr_info("%s() eeprom records are undefined, no serial number\n",
  1215. __func__);
  1216. return;
  1217. }
  1218. sn = (*(eeprom_data + 0x06) << 24) |
  1219. (*(eeprom_data + 0x05) << 16) |
  1220. (*(eeprom_data + 0x04) << 8) |
  1221. (*(eeprom_data + 0x03));
  1222. pr_info("%s: card '%s' sn# MM%d\n",
  1223. dev->name,
  1224. cx23885_boards[dev->board].name,
  1225. sn);
  1226. }
  1227. static void hauppauge_eeprom(struct cx23885_dev *dev, u8 *eeprom_data)
  1228. {
  1229. struct tveeprom tv;
  1230. tveeprom_hauppauge_analog(&tv, eeprom_data);
  1231. /* Make sure we support the board model */
  1232. switch (tv.model) {
  1233. case 22001:
  1234. /* WinTV-HVR1270 (PCIe, Retail, half height)
  1235. * ATSC/QAM and basic analog, IR Blast */
  1236. case 22009:
  1237. /* WinTV-HVR1210 (PCIe, Retail, half height)
  1238. * DVB-T and basic analog, IR Blast */
  1239. case 22011:
  1240. /* WinTV-HVR1270 (PCIe, Retail, half height)
  1241. * ATSC/QAM and basic analog, IR Recv */
  1242. case 22019:
  1243. /* WinTV-HVR1210 (PCIe, Retail, half height)
  1244. * DVB-T and basic analog, IR Recv */
  1245. case 22021:
  1246. /* WinTV-HVR1275 (PCIe, Retail, half height)
  1247. * ATSC/QAM and basic analog, IR Recv */
  1248. case 22029:
  1249. /* WinTV-HVR1210 (PCIe, Retail, half height)
  1250. * DVB-T and basic analog, IR Recv */
  1251. case 22101:
  1252. /* WinTV-HVR1270 (PCIe, Retail, full height)
  1253. * ATSC/QAM and basic analog, IR Blast */
  1254. case 22109:
  1255. /* WinTV-HVR1210 (PCIe, Retail, full height)
  1256. * DVB-T and basic analog, IR Blast */
  1257. case 22111:
  1258. /* WinTV-HVR1270 (PCIe, Retail, full height)
  1259. * ATSC/QAM and basic analog, IR Recv */
  1260. case 22119:
  1261. /* WinTV-HVR1210 (PCIe, Retail, full height)
  1262. * DVB-T and basic analog, IR Recv */
  1263. case 22121:
  1264. /* WinTV-HVR1275 (PCIe, Retail, full height)
  1265. * ATSC/QAM and basic analog, IR Recv */
  1266. case 22129:
  1267. /* WinTV-HVR1210 (PCIe, Retail, full height)
  1268. * DVB-T and basic analog, IR Recv */
  1269. case 71009:
  1270. /* WinTV-HVR1200 (PCIe, Retail, full height)
  1271. * DVB-T and basic analog */
  1272. case 71100:
  1273. /* WinTV-ImpactVCB-e (PCIe, Retail, half height)
  1274. * Basic analog */
  1275. case 71359:
  1276. /* WinTV-HVR1200 (PCIe, OEM, half height)
  1277. * DVB-T and basic analog */
  1278. case 71439:
  1279. /* WinTV-HVR1200 (PCIe, OEM, half height)
  1280. * DVB-T and basic analog */
  1281. case 71449:
  1282. /* WinTV-HVR1200 (PCIe, OEM, full height)
  1283. * DVB-T and basic analog */
  1284. case 71939:
  1285. /* WinTV-HVR1200 (PCIe, OEM, half height)
  1286. * DVB-T and basic analog */
  1287. case 71949:
  1288. /* WinTV-HVR1200 (PCIe, OEM, full height)
  1289. * DVB-T and basic analog */
  1290. case 71959:
  1291. /* WinTV-HVR1200 (PCIe, OEM, full height)
  1292. * DVB-T and basic analog */
  1293. case 71979:
  1294. /* WinTV-HVR1200 (PCIe, OEM, half height)
  1295. * DVB-T and basic analog */
  1296. case 71999:
  1297. /* WinTV-HVR1200 (PCIe, OEM, full height)
  1298. * DVB-T and basic analog */
  1299. case 76601:
  1300. /* WinTV-HVR1800lp (PCIe, Retail, No IR, Dual
  1301. channel ATSC and MPEG2 HW Encoder */
  1302. case 77001:
  1303. /* WinTV-HVR1500 (Express Card, OEM, No IR, ATSC
  1304. and Basic analog */
  1305. case 77011:
  1306. /* WinTV-HVR1500 (Express Card, Retail, No IR, ATSC
  1307. and Basic analog */
  1308. case 77041:
  1309. /* WinTV-HVR1500Q (Express Card, OEM, No IR, ATSC/QAM
  1310. and Basic analog */
  1311. case 77051:
  1312. /* WinTV-HVR1500Q (Express Card, Retail, No IR, ATSC/QAM
  1313. and Basic analog */
  1314. case 78011:
  1315. /* WinTV-HVR1800 (PCIe, Retail, 3.5mm in, IR, No FM,
  1316. Dual channel ATSC and MPEG2 HW Encoder */
  1317. case 78501:
  1318. /* WinTV-HVR1800 (PCIe, OEM, RCA in, No IR, FM,
  1319. Dual channel ATSC and MPEG2 HW Encoder */
  1320. case 78521:
  1321. /* WinTV-HVR1800 (PCIe, OEM, RCA in, No IR, FM,
  1322. Dual channel ATSC and MPEG2 HW Encoder */
  1323. case 78531:
  1324. /* WinTV-HVR1800 (PCIe, OEM, RCA in, No IR, No FM,
  1325. Dual channel ATSC and MPEG2 HW Encoder */
  1326. case 78631:
  1327. /* WinTV-HVR1800 (PCIe, OEM, No IR, No FM,
  1328. Dual channel ATSC and MPEG2 HW Encoder */
  1329. case 79001:
  1330. /* WinTV-HVR1250 (PCIe, Retail, IR, full height,
  1331. ATSC and Basic analog */
  1332. case 79101:
  1333. /* WinTV-HVR1250 (PCIe, Retail, IR, half height,
  1334. ATSC and Basic analog */
  1335. case 79501:
  1336. /* WinTV-HVR1250 (PCIe, No IR, half height,
  1337. ATSC [at least] and Basic analog) */
  1338. case 79561:
  1339. /* WinTV-HVR1250 (PCIe, OEM, No IR, half height,
  1340. ATSC and Basic analog */
  1341. case 79571:
  1342. /* WinTV-HVR1250 (PCIe, OEM, No IR, full height,
  1343. ATSC and Basic analog */
  1344. case 79671:
  1345. /* WinTV-HVR1250 (PCIe, OEM, No IR, half height,
  1346. ATSC and Basic analog */
  1347. case 80019:
  1348. /* WinTV-HVR1400 (Express Card, Retail, IR,
  1349. * DVB-T and Basic analog */
  1350. case 81509:
  1351. /* WinTV-HVR1700 (PCIe, OEM, No IR, half height)
  1352. * DVB-T and MPEG2 HW Encoder */
  1353. case 81519:
  1354. /* WinTV-HVR1700 (PCIe, OEM, No IR, full height)
  1355. * DVB-T and MPEG2 HW Encoder */
  1356. break;
  1357. case 85021:
  1358. /* WinTV-HVR1850 (PCIe, Retail, 3.5mm in, IR, FM,
  1359. Dual channel ATSC and MPEG2 HW Encoder */
  1360. break;
  1361. case 85721:
  1362. /* WinTV-HVR1290 (PCIe, OEM, RCA in, IR,
  1363. Dual channel ATSC and Basic analog */
  1364. case 121019:
  1365. /* WinTV-HVR4400 (PCIe, DVB-S2, DVB-C/T) */
  1366. break;
  1367. case 121029:
  1368. /* WinTV-HVR5500 (PCIe, DVB-S2, DVB-C/T) */
  1369. break;
  1370. case 150329:
  1371. /* WinTV-HVR5525 (PCIe, DVB-S/S2, DVB-T/T2/C) */
  1372. break;
  1373. case 161111:
  1374. /* WinTV-HVR-1265 K4 (PCIe, Analog/ATSC/QAM-B) */
  1375. break;
  1376. case 166100: /* 888 version, hybrid */
  1377. case 166200: /* 885 version, DVB only */
  1378. /* WinTV-QuadHD (DVB) Tuner Pair 1 (PCIe, IR, half height,
  1379. DVB-T/T2/C, DVB-T/T2/C */
  1380. break;
  1381. case 166101: /* 888 version, hybrid */
  1382. case 166201: /* 885 version, DVB only */
  1383. /* WinTV-QuadHD (DVB) Tuner Pair 2 (PCIe, IR, half height,
  1384. DVB-T/T2/C, DVB-T/T2/C */
  1385. break;
  1386. case 165100: /* 888 version, hybrid */
  1387. case 165200: /* 885 version, digital only */
  1388. /* WinTV-QuadHD (ATSC) Tuner Pair 1 (PCIe, IR, half height,
  1389. * ATSC/QAM-B, ATSC/QAM-B */
  1390. break;
  1391. case 165101: /* 888 version, hybrid */
  1392. case 165201: /* 885 version, digital only */
  1393. /* WinTV-QuadHD (ATSC) Tuner Pair 2 (PCIe, IR, half height,
  1394. * ATSC/QAM-B, ATSC/QAM-B */
  1395. break;
  1396. default:
  1397. pr_warn("%s: warning: unknown hauppauge model #%d\n",
  1398. dev->name, tv.model);
  1399. break;
  1400. }
  1401. pr_info("%s: hauppauge eeprom: model=%d\n",
  1402. dev->name, tv.model);
  1403. }
  1404. /* Some TBS cards require initing a chip using a bitbanged SPI attached
  1405. to the cx23885 gpio's. If this chip doesn't get init'ed the demod
  1406. doesn't respond to any command. */
  1407. static void tbs_card_init(struct cx23885_dev *dev)
  1408. {
  1409. int i;
  1410. static const u8 buf[] = {
  1411. 0xe0, 0x06, 0x66, 0x33, 0x65,
  1412. 0x01, 0x17, 0x06, 0xde};
  1413. switch (dev->board) {
  1414. case CX23885_BOARD_TBS_6980:
  1415. case CX23885_BOARD_TBS_6981:
  1416. cx_set(GP0_IO, 0x00070007);
  1417. usleep_range(1000, 10000);
  1418. cx_clear(GP0_IO, 2);
  1419. usleep_range(1000, 10000);
  1420. for (i = 0; i < 9 * 8; i++) {
  1421. cx_clear(GP0_IO, 7);
  1422. usleep_range(1000, 10000);
  1423. cx_set(GP0_IO,
  1424. ((buf[i >> 3] >> (7 - (i & 7))) & 1) | 4);
  1425. usleep_range(1000, 10000);
  1426. }
  1427. cx_set(GP0_IO, 7);
  1428. break;
  1429. }
  1430. }
  1431. int cx23885_tuner_callback(void *priv, int component, int command, int arg)
  1432. {
  1433. struct cx23885_tsport *port = priv;
  1434. struct cx23885_dev *dev = port->dev;
  1435. u32 bitmask = 0;
  1436. if ((command == XC2028_RESET_CLK) || (command == XC2028_I2C_FLUSH))
  1437. return 0;
  1438. if (command != 0) {
  1439. pr_err("%s(): Unknown command 0x%x.\n",
  1440. __func__, command);
  1441. return -EINVAL;
  1442. }
  1443. switch (dev->board) {
  1444. case CX23885_BOARD_HAUPPAUGE_HVR1400:
  1445. case CX23885_BOARD_HAUPPAUGE_HVR1500:
  1446. case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
  1447. case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H:
  1448. case CX23885_BOARD_LEADTEK_WINFAST_PXPVR2200:
  1449. case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H_XC4000:
  1450. case CX23885_BOARD_COMPRO_VIDEOMATE_E650F:
  1451. case CX23885_BOARD_COMPRO_VIDEOMATE_E800:
  1452. case CX23885_BOARD_LEADTEK_WINFAST_PXTV1200:
  1453. /* Tuner Reset Command */
  1454. bitmask = 0x04;
  1455. break;
  1456. case CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP:
  1457. case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP:
  1458. case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP2:
  1459. /* Two identical tuners on two different i2c buses,
  1460. * we need to reset the correct gpio. */
  1461. if (port->nr == 1)
  1462. bitmask = 0x01;
  1463. else if (port->nr == 2)
  1464. bitmask = 0x04;
  1465. break;
  1466. case CX23885_BOARD_GOTVIEW_X5_3D_HYBRID:
  1467. /* Tuner Reset Command */
  1468. bitmask = 0x02;
  1469. break;
  1470. case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF:
  1471. altera_ci_tuner_reset(dev, port->nr);
  1472. break;
  1473. case CX23885_BOARD_AVERMEDIA_HC81R:
  1474. /* XC3028L Reset Command */
  1475. bitmask = 1 << 2;
  1476. break;
  1477. }
  1478. if (bitmask) {
  1479. /* Drive the tuner into reset and back out */
  1480. cx_clear(GP0_IO, bitmask);
  1481. mdelay(200);
  1482. cx_set(GP0_IO, bitmask);
  1483. }
  1484. return 0;
  1485. }
  1486. void cx23885_gpio_setup(struct cx23885_dev *dev)
  1487. {
  1488. switch (dev->board) {
  1489. case CX23885_BOARD_HAUPPAUGE_HVR1250:
  1490. /* GPIO-0 cx24227 demodulator reset */
  1491. cx_set(GP0_IO, 0x00010001); /* Bring the part out of reset */
  1492. break;
  1493. case CX23885_BOARD_HAUPPAUGE_HVR1500:
  1494. /* GPIO-0 cx24227 demodulator */
  1495. /* GPIO-2 xc3028 tuner */
  1496. /* Put the parts into reset */
  1497. cx_set(GP0_IO, 0x00050000);
  1498. cx_clear(GP0_IO, 0x00000005);
  1499. msleep(5);
  1500. /* Bring the parts out of reset */
  1501. cx_set(GP0_IO, 0x00050005);
  1502. break;
  1503. case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
  1504. /* GPIO-0 cx24227 demodulator reset */
  1505. /* GPIO-2 xc5000 tuner reset */
  1506. cx_set(GP0_IO, 0x00050005); /* Bring the part out of reset */
  1507. break;
  1508. case CX23885_BOARD_HAUPPAUGE_HVR1800:
  1509. /* GPIO-0 656_CLK */
  1510. /* GPIO-1 656_D0 */
  1511. /* GPIO-2 8295A Reset */
  1512. /* GPIO-3-10 cx23417 data0-7 */
  1513. /* GPIO-11-14 cx23417 addr0-3 */
  1514. /* GPIO-15-18 cx23417 READY, CS, RD, WR */
  1515. /* GPIO-19 IR_RX */
  1516. /* CX23417 GPIO's */
  1517. /* EIO15 Zilog Reset */
  1518. /* EIO14 S5H1409/CX24227 Reset */
  1519. mc417_gpio_enable(dev, GPIO_15 | GPIO_14, 1);
  1520. /* Put the demod into reset and protect the eeprom */
  1521. mc417_gpio_clear(dev, GPIO_15 | GPIO_14);
  1522. msleep(100);
  1523. /* Bring the demod and blaster out of reset */
  1524. mc417_gpio_set(dev, GPIO_15 | GPIO_14);
  1525. msleep(100);
  1526. /* Force the TDA8295A into reset and back */
  1527. cx23885_gpio_enable(dev, GPIO_2, 1);
  1528. cx23885_gpio_set(dev, GPIO_2);
  1529. msleep(20);
  1530. cx23885_gpio_clear(dev, GPIO_2);
  1531. msleep(20);
  1532. cx23885_gpio_set(dev, GPIO_2);
  1533. msleep(20);
  1534. break;
  1535. case CX23885_BOARD_HAUPPAUGE_HVR1200:
  1536. /* GPIO-0 tda10048 demodulator reset */
  1537. /* GPIO-2 tda18271 tuner reset */
  1538. /* Put the parts into reset and back */
  1539. cx_set(GP0_IO, 0x00050000);
  1540. msleep(20);
  1541. cx_clear(GP0_IO, 0x00000005);
  1542. msleep(20);
  1543. cx_set(GP0_IO, 0x00050005);
  1544. break;
  1545. case CX23885_BOARD_HAUPPAUGE_HVR1700:
  1546. /* GPIO-0 TDA10048 demodulator reset */
  1547. /* GPIO-2 TDA8295A Reset */
  1548. /* GPIO-3-10 cx23417 data0-7 */
  1549. /* GPIO-11-14 cx23417 addr0-3 */
  1550. /* GPIO-15-18 cx23417 READY, CS, RD, WR */
  1551. /* The following GPIO's are on the interna AVCore (cx25840) */
  1552. /* GPIO-19 IR_RX */
  1553. /* GPIO-20 IR_TX 416/DVBT Select */
  1554. /* GPIO-21 IIS DAT */
  1555. /* GPIO-22 IIS WCLK */
  1556. /* GPIO-23 IIS BCLK */
  1557. /* Put the parts into reset and back */
  1558. cx_set(GP0_IO, 0x00050000);
  1559. msleep(20);
  1560. cx_clear(GP0_IO, 0x00000005);
  1561. msleep(20);
  1562. cx_set(GP0_IO, 0x00050005);
  1563. break;
  1564. case CX23885_BOARD_HAUPPAUGE_HVR1400:
  1565. /* GPIO-0 Dibcom7000p demodulator reset */
  1566. /* GPIO-2 xc3028L tuner reset */
  1567. /* GPIO-13 LED */
  1568. /* Put the parts into reset and back */
  1569. cx_set(GP0_IO, 0x00050000);
  1570. msleep(20);
  1571. cx_clear(GP0_IO, 0x00000005);
  1572. msleep(20);
  1573. cx_set(GP0_IO, 0x00050005);
  1574. break;
  1575. case CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP:
  1576. /* GPIO-0 xc5000 tuner reset i2c bus 0 */
  1577. /* GPIO-1 s5h1409 demod reset i2c bus 0 */
  1578. /* GPIO-2 xc5000 tuner reset i2c bus 1 */
  1579. /* GPIO-3 s5h1409 demod reset i2c bus 0 */
  1580. /* Put the parts into reset and back */
  1581. cx_set(GP0_IO, 0x000f0000);
  1582. msleep(20);
  1583. cx_clear(GP0_IO, 0x0000000f);
  1584. msleep(20);
  1585. cx_set(GP0_IO, 0x000f000f);
  1586. break;
  1587. case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP:
  1588. case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP2:
  1589. /* GPIO-0 portb xc3028 reset */
  1590. /* GPIO-1 portb zl10353 reset */
  1591. /* GPIO-2 portc xc3028 reset */
  1592. /* GPIO-3 portc zl10353 reset */
  1593. /* Put the parts into reset and back */
  1594. cx_set(GP0_IO, 0x000f0000);
  1595. msleep(20);
  1596. cx_clear(GP0_IO, 0x0000000f);
  1597. msleep(20);
  1598. cx_set(GP0_IO, 0x000f000f);
  1599. break;
  1600. case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H:
  1601. case CX23885_BOARD_LEADTEK_WINFAST_PXPVR2200:
  1602. case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H_XC4000:
  1603. case CX23885_BOARD_COMPRO_VIDEOMATE_E650F:
  1604. case CX23885_BOARD_COMPRO_VIDEOMATE_E800:
  1605. case CX23885_BOARD_LEADTEK_WINFAST_PXTV1200:
  1606. /* GPIO-2 xc3028 tuner reset */
  1607. /* The following GPIO's are on the internal AVCore (cx25840) */
  1608. /* GPIO-? zl10353 demod reset */
  1609. /* Put the parts into reset and back */
  1610. cx_set(GP0_IO, 0x00040000);
  1611. msleep(20);
  1612. cx_clear(GP0_IO, 0x00000004);
  1613. msleep(20);
  1614. cx_set(GP0_IO, 0x00040004);
  1615. break;
  1616. case CX23885_BOARD_TBS_6920:
  1617. case CX23885_BOARD_TBS_6980:
  1618. case CX23885_BOARD_TBS_6981:
  1619. case CX23885_BOARD_PROF_8000:
  1620. cx_write(MC417_CTL, 0x00000036);
  1621. cx_write(MC417_OEN, 0x00001000);
  1622. cx_set(MC417_RWD, 0x00000002);
  1623. msleep(200);
  1624. cx_clear(MC417_RWD, 0x00000800);
  1625. msleep(200);
  1626. cx_set(MC417_RWD, 0x00000800);
  1627. msleep(200);
  1628. break;
  1629. case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
  1630. /* GPIO-0 INTA from CiMax1
  1631. GPIO-1 INTB from CiMax2
  1632. GPIO-2 reset chips
  1633. GPIO-3 to GPIO-10 data/addr for CA
  1634. GPIO-11 ~CS0 to CiMax1
  1635. GPIO-12 ~CS1 to CiMax2
  1636. GPIO-13 ADL0 load LSB addr
  1637. GPIO-14 ADL1 load MSB addr
  1638. GPIO-15 ~RDY from CiMax
  1639. GPIO-17 ~RD to CiMax
  1640. GPIO-18 ~WR to CiMax
  1641. */
  1642. cx_set(GP0_IO, 0x00040000); /* GPIO as out */
  1643. /* GPIO1 and GPIO2 as INTA and INTB from CiMaxes, reset low */
  1644. cx_clear(GP0_IO, 0x00030004);
  1645. msleep(100);/* reset delay */
  1646. cx_set(GP0_IO, 0x00040004); /* GPIO as out, reset high */
  1647. cx_write(MC417_CTL, 0x00000037);/* enable GPIO3-18 pins */
  1648. /* GPIO-15 IN as ~ACK, rest as OUT */
  1649. cx_write(MC417_OEN, 0x00001000);
  1650. /* ~RD, ~WR high; ADL0, ADL1 low; ~CS0, ~CS1 high */
  1651. cx_write(MC417_RWD, 0x0000c300);
  1652. /* enable irq */
  1653. cx_write(GPIO_ISM, 0x00000000);/* INTERRUPTS active low*/
  1654. break;
  1655. case CX23885_BOARD_HAUPPAUGE_HVR1270:
  1656. case CX23885_BOARD_HAUPPAUGE_HVR1275:
  1657. case CX23885_BOARD_HAUPPAUGE_HVR1255:
  1658. case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
  1659. case CX23885_BOARD_HAUPPAUGE_HVR1210:
  1660. /* GPIO-5 RF Control: 0 = RF1 Terrestrial, 1 = RF2 Cable */
  1661. /* GPIO-6 I2C Gate which can isolate the demod from the bus */
  1662. /* GPIO-9 Demod reset */
  1663. /* Put the parts into reset and back */
  1664. cx23885_gpio_enable(dev, GPIO_9 | GPIO_6 | GPIO_5, 1);
  1665. cx23885_gpio_set(dev, GPIO_9 | GPIO_6 | GPIO_5);
  1666. cx23885_gpio_clear(dev, GPIO_9);
  1667. msleep(20);
  1668. cx23885_gpio_set(dev, GPIO_9);
  1669. break;
  1670. case CX23885_BOARD_MYGICA_X8506:
  1671. case CX23885_BOARD_MAGICPRO_PROHDTVE2:
  1672. case CX23885_BOARD_MYGICA_X8507:
  1673. /* GPIO-0 (0)Analog / (1)Digital TV */
  1674. /* GPIO-1 reset XC5000 */
  1675. /* GPIO-2 demod reset */
  1676. cx23885_gpio_enable(dev, GPIO_0 | GPIO_1 | GPIO_2, 1);
  1677. cx23885_gpio_clear(dev, GPIO_1 | GPIO_2);
  1678. msleep(100);
  1679. cx23885_gpio_set(dev, GPIO_0 | GPIO_1 | GPIO_2);
  1680. msleep(100);
  1681. break;
  1682. case CX23885_BOARD_MYGICA_X8558PRO:
  1683. /* GPIO-0 reset first ATBM8830 */
  1684. /* GPIO-1 reset second ATBM8830 */
  1685. cx23885_gpio_enable(dev, GPIO_0 | GPIO_1, 1);
  1686. cx23885_gpio_clear(dev, GPIO_0 | GPIO_1);
  1687. msleep(100);
  1688. cx23885_gpio_set(dev, GPIO_0 | GPIO_1);
  1689. msleep(100);
  1690. break;
  1691. case CX23885_BOARD_HAUPPAUGE_HVR1850:
  1692. case CX23885_BOARD_HAUPPAUGE_HVR1290:
  1693. /* GPIO-0 656_CLK */
  1694. /* GPIO-1 656_D0 */
  1695. /* GPIO-2 Wake# */
  1696. /* GPIO-3-10 cx23417 data0-7 */
  1697. /* GPIO-11-14 cx23417 addr0-3 */
  1698. /* GPIO-15-18 cx23417 READY, CS, RD, WR */
  1699. /* GPIO-19 IR_RX */
  1700. /* GPIO-20 C_IR_TX */
  1701. /* GPIO-21 I2S DAT */
  1702. /* GPIO-22 I2S WCLK */
  1703. /* GPIO-23 I2S BCLK */
  1704. /* ALT GPIO: EXP GPIO LATCH */
  1705. /* CX23417 GPIO's */
  1706. /* GPIO-14 S5H1411/CX24228 Reset */
  1707. /* GPIO-13 EEPROM write protect */
  1708. mc417_gpio_enable(dev, GPIO_14 | GPIO_13, 1);
  1709. /* Put the demod into reset and protect the eeprom */
  1710. mc417_gpio_clear(dev, GPIO_14 | GPIO_13);
  1711. msleep(100);
  1712. /* Bring the demod out of reset */
  1713. mc417_gpio_set(dev, GPIO_14);
  1714. msleep(100);
  1715. /* CX24228 GPIO */
  1716. /* Connected to IF / Mux */
  1717. break;
  1718. case CX23885_BOARD_GOTVIEW_X5_3D_HYBRID:
  1719. cx_set(GP0_IO, 0x00010001); /* Bring the part out of reset */
  1720. break;
  1721. case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF:
  1722. /* GPIO-0 ~INT in
  1723. GPIO-1 TMS out
  1724. GPIO-2 ~reset chips out
  1725. GPIO-3 to GPIO-10 data/addr for CA in/out
  1726. GPIO-11 ~CS out
  1727. GPIO-12 ADDR out
  1728. GPIO-13 ~WR out
  1729. GPIO-14 ~RD out
  1730. GPIO-15 ~RDY in
  1731. GPIO-16 TCK out
  1732. GPIO-17 TDO in
  1733. GPIO-18 TDI out
  1734. */
  1735. cx_set(GP0_IO, 0x00060000); /* GPIO-1,2 as out */
  1736. /* GPIO-0 as INT, reset & TMS low */
  1737. cx_clear(GP0_IO, 0x00010006);
  1738. msleep(100);/* reset delay */
  1739. cx_set(GP0_IO, 0x00000004); /* reset high */
  1740. cx_write(MC417_CTL, 0x00000037);/* enable GPIO-3..18 pins */
  1741. /* GPIO-17 is TDO in, GPIO-15 is ~RDY in, rest is out */
  1742. cx_write(MC417_OEN, 0x00005000);
  1743. /* ~RD, ~WR high; ADDR low; ~CS high */
  1744. cx_write(MC417_RWD, 0x00000d00);
  1745. /* enable irq */
  1746. cx_write(GPIO_ISM, 0x00000000);/* INTERRUPTS active low*/
  1747. break;
  1748. case CX23885_BOARD_HAUPPAUGE_HVR4400:
  1749. case CX23885_BOARD_HAUPPAUGE_STARBURST:
  1750. /* GPIO-8 tda10071 demod reset */
  1751. /* GPIO-9 si2165 demod reset (only HVR4400/HVR5500)*/
  1752. /* Put the parts into reset and back */
  1753. cx23885_gpio_enable(dev, GPIO_8 | GPIO_9, 1);
  1754. cx23885_gpio_clear(dev, GPIO_8 | GPIO_9);
  1755. msleep(100);
  1756. cx23885_gpio_set(dev, GPIO_8 | GPIO_9);
  1757. msleep(100);
  1758. break;
  1759. case CX23885_BOARD_AVERMEDIA_HC81R:
  1760. cx_clear(MC417_CTL, 1);
  1761. /* GPIO-0,1,2 setup direction as output */
  1762. cx_set(GP0_IO, 0x00070000);
  1763. usleep_range(10000, 11000);
  1764. /* AF9013 demod reset */
  1765. cx_set(GP0_IO, 0x00010001);
  1766. usleep_range(10000, 11000);
  1767. cx_clear(GP0_IO, 0x00010001);
  1768. usleep_range(10000, 11000);
  1769. cx_set(GP0_IO, 0x00010001);
  1770. usleep_range(10000, 11000);
  1771. /* demod tune? */
  1772. cx_clear(GP0_IO, 0x00030003);
  1773. usleep_range(10000, 11000);
  1774. cx_set(GP0_IO, 0x00020002);
  1775. usleep_range(10000, 11000);
  1776. cx_set(GP0_IO, 0x00010001);
  1777. usleep_range(10000, 11000);
  1778. cx_clear(GP0_IO, 0x00020002);
  1779. /* XC3028L tuner reset */
  1780. cx_set(GP0_IO, 0x00040004);
  1781. cx_clear(GP0_IO, 0x00040004);
  1782. cx_set(GP0_IO, 0x00040004);
  1783. msleep(60);
  1784. break;
  1785. case CX23885_BOARD_DVBSKY_T9580:
  1786. case CX23885_BOARD_DVBSKY_S952:
  1787. case CX23885_BOARD_DVBSKY_T982:
  1788. /* enable GPIO3-18 pins */
  1789. cx_write(MC417_CTL, 0x00000037);
  1790. cx23885_gpio_enable(dev, GPIO_2 | GPIO_11, 1);
  1791. cx23885_gpio_clear(dev, GPIO_2 | GPIO_11);
  1792. msleep(100);
  1793. cx23885_gpio_set(dev, GPIO_2 | GPIO_11);
  1794. break;
  1795. case CX23885_BOARD_DVBSKY_T980C:
  1796. case CX23885_BOARD_DVBSKY_S950C:
  1797. case CX23885_BOARD_TT_CT2_4500_CI:
  1798. /*
  1799. * GPIO-0 INTA from CiMax, input
  1800. * GPIO-1 reset CiMax, output, high active
  1801. * GPIO-2 reset demod, output, low active
  1802. * GPIO-3 to GPIO-10 data/addr for CAM
  1803. * GPIO-11 ~CS0 to CiMax1
  1804. * GPIO-12 ~CS1 to CiMax2
  1805. * GPIO-13 ADL0 load LSB addr
  1806. * GPIO-14 ADL1 load MSB addr
  1807. * GPIO-15 ~RDY from CiMax
  1808. * GPIO-17 ~RD to CiMax
  1809. * GPIO-18 ~WR to CiMax
  1810. */
  1811. cx_set(GP0_IO, 0x00060002); /* GPIO 1/2 as output */
  1812. cx_clear(GP0_IO, 0x00010004); /* GPIO 0 as input */
  1813. msleep(100); /* reset delay */
  1814. cx_set(GP0_IO, 0x00060004); /* GPIO as out, reset high */
  1815. cx_clear(GP0_IO, 0x00010002);
  1816. cx_write(MC417_CTL, 0x00000037); /* enable GPIO3-18 pins */
  1817. /* GPIO-15 IN as ~ACK, rest as OUT */
  1818. cx_write(MC417_OEN, 0x00001000);
  1819. /* ~RD, ~WR high; ADL0, ADL1 low; ~CS0, ~CS1 high */
  1820. cx_write(MC417_RWD, 0x0000c300);
  1821. /* enable irq */
  1822. cx_write(GPIO_ISM, 0x00000000); /* INTERRUPTS active low */
  1823. break;
  1824. case CX23885_BOARD_DVBSKY_S950:
  1825. cx23885_gpio_enable(dev, GPIO_2, 1);
  1826. cx23885_gpio_clear(dev, GPIO_2);
  1827. msleep(100);
  1828. cx23885_gpio_set(dev, GPIO_2);
  1829. break;
  1830. case CX23885_BOARD_HAUPPAUGE_HVR5525:
  1831. case CX23885_BOARD_HAUPPAUGE_STARBURST2:
  1832. /*
  1833. * HVR5525 GPIO Details:
  1834. * GPIO-00 IR_WIDE
  1835. * GPIO-02 wake#
  1836. * GPIO-03 VAUX Pres.
  1837. * GPIO-07 PROG#
  1838. * GPIO-08 SAT_RESN
  1839. * GPIO-09 TER_RESN
  1840. * GPIO-10 B2_SENSE
  1841. * GPIO-11 B1_SENSE
  1842. * GPIO-15 IR_LED_STATUS
  1843. * GPIO-19 IR_NARROW
  1844. * GPIO-20 Blauster1
  1845. * ALTGPIO VAUX_SWITCH
  1846. * AUX_PLL_CLK : Blaster2
  1847. */
  1848. /* Put the parts into reset and back */
  1849. cx23885_gpio_enable(dev, GPIO_8 | GPIO_9, 1);
  1850. cx23885_gpio_clear(dev, GPIO_8 | GPIO_9);
  1851. msleep(100);
  1852. cx23885_gpio_set(dev, GPIO_8 | GPIO_9);
  1853. msleep(100);
  1854. break;
  1855. case CX23885_BOARD_VIEWCAST_260E:
  1856. case CX23885_BOARD_VIEWCAST_460E:
  1857. /* For documentation purposes, it's worth noting that this
  1858. * card does not have any GPIO's connected to subcomponents.
  1859. */
  1860. break;
  1861. case CX23885_BOARD_HAUPPAUGE_HVR1265_K4:
  1862. case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB:
  1863. case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB_885:
  1864. case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC:
  1865. case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC_885:
  1866. /*
  1867. * GPIO-08 TER1_RESN
  1868. * GPIO-09 TER2_RESN
  1869. */
  1870. /* Put the parts into reset and back */
  1871. cx23885_gpio_enable(dev, GPIO_8 | GPIO_9, 1);
  1872. cx23885_gpio_clear(dev, GPIO_8 | GPIO_9);
  1873. msleep(100);
  1874. cx23885_gpio_set(dev, GPIO_8 | GPIO_9);
  1875. msleep(100);
  1876. break;
  1877. }
  1878. }
  1879. int cx23885_ir_init(struct cx23885_dev *dev)
  1880. {
  1881. static struct v4l2_subdev_io_pin_config ir_rxtx_pin_cfg[] = {
  1882. {
  1883. .flags = BIT(V4L2_SUBDEV_IO_PIN_INPUT),
  1884. .pin = CX23885_PIN_IR_RX_GPIO19,
  1885. .function = CX23885_PAD_IR_RX,
  1886. .value = 0,
  1887. .strength = CX25840_PIN_DRIVE_MEDIUM,
  1888. }, {
  1889. .flags = BIT(V4L2_SUBDEV_IO_PIN_OUTPUT),
  1890. .pin = CX23885_PIN_IR_TX_GPIO20,
  1891. .function = CX23885_PAD_IR_TX,
  1892. .value = 0,
  1893. .strength = CX25840_PIN_DRIVE_MEDIUM,
  1894. }
  1895. };
  1896. const size_t ir_rxtx_pin_cfg_count = ARRAY_SIZE(ir_rxtx_pin_cfg);
  1897. static struct v4l2_subdev_io_pin_config ir_rx_pin_cfg[] = {
  1898. {
  1899. .flags = BIT(V4L2_SUBDEV_IO_PIN_INPUT),
  1900. .pin = CX23885_PIN_IR_RX_GPIO19,
  1901. .function = CX23885_PAD_IR_RX,
  1902. .value = 0,
  1903. .strength = CX25840_PIN_DRIVE_MEDIUM,
  1904. }
  1905. };
  1906. const size_t ir_rx_pin_cfg_count = ARRAY_SIZE(ir_rx_pin_cfg);
  1907. struct v4l2_subdev_ir_parameters params;
  1908. int ret = 0;
  1909. switch (dev->board) {
  1910. case CX23885_BOARD_HAUPPAUGE_HVR1500:
  1911. case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
  1912. case CX23885_BOARD_HAUPPAUGE_HVR1800:
  1913. case CX23885_BOARD_HAUPPAUGE_HVR1200:
  1914. case CX23885_BOARD_HAUPPAUGE_HVR1400:
  1915. case CX23885_BOARD_HAUPPAUGE_HVR1275:
  1916. case CX23885_BOARD_HAUPPAUGE_HVR1255:
  1917. case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
  1918. case CX23885_BOARD_HAUPPAUGE_HVR1210:
  1919. case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB:
  1920. case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC:
  1921. /* FIXME: Implement me */
  1922. break;
  1923. case CX23885_BOARD_HAUPPAUGE_HVR1270:
  1924. ret = cx23888_ir_probe(dev);
  1925. if (ret)
  1926. break;
  1927. dev->sd_ir = cx23885_find_hw(dev, CX23885_HW_888_IR);
  1928. v4l2_subdev_call(dev->sd_cx25840, core, s_io_pin_config,
  1929. ir_rx_pin_cfg_count, ir_rx_pin_cfg);
  1930. break;
  1931. case CX23885_BOARD_HAUPPAUGE_HVR1850:
  1932. case CX23885_BOARD_HAUPPAUGE_HVR1290:
  1933. ret = cx23888_ir_probe(dev);
  1934. if (ret)
  1935. break;
  1936. dev->sd_ir = cx23885_find_hw(dev, CX23885_HW_888_IR);
  1937. v4l2_subdev_call(dev->sd_cx25840, core, s_io_pin_config,
  1938. ir_rxtx_pin_cfg_count, ir_rxtx_pin_cfg);
  1939. /*
  1940. * For these boards we need to invert the Tx output via the
  1941. * IR controller to have the LED off while idle
  1942. */
  1943. v4l2_subdev_call(dev->sd_ir, ir, tx_g_parameters, &params);
  1944. params.enable = false;
  1945. params.shutdown = false;
  1946. params.invert_level = true;
  1947. v4l2_subdev_call(dev->sd_ir, ir, tx_s_parameters, &params);
  1948. params.shutdown = true;
  1949. v4l2_subdev_call(dev->sd_ir, ir, tx_s_parameters, &params);
  1950. break;
  1951. case CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL:
  1952. case CX23885_BOARD_TEVII_S470:
  1953. case CX23885_BOARD_MYGICA_X8507:
  1954. case CX23885_BOARD_TBS_6980:
  1955. case CX23885_BOARD_TBS_6981:
  1956. case CX23885_BOARD_DVBSKY_T9580:
  1957. case CX23885_BOARD_DVBSKY_T980C:
  1958. case CX23885_BOARD_DVBSKY_S950C:
  1959. case CX23885_BOARD_TT_CT2_4500_CI:
  1960. case CX23885_BOARD_DVBSKY_S950:
  1961. case CX23885_BOARD_DVBSKY_S952:
  1962. case CX23885_BOARD_DVBSKY_T982:
  1963. if (!enable_885_ir)
  1964. break;
  1965. dev->sd_ir = cx23885_find_hw(dev, CX23885_HW_AV_CORE);
  1966. if (dev->sd_ir == NULL) {
  1967. ret = -ENODEV;
  1968. break;
  1969. }
  1970. v4l2_subdev_call(dev->sd_cx25840, core, s_io_pin_config,
  1971. ir_rx_pin_cfg_count, ir_rx_pin_cfg);
  1972. break;
  1973. case CX23885_BOARD_HAUPPAUGE_HVR1250:
  1974. if (!enable_885_ir)
  1975. break;
  1976. dev->sd_ir = cx23885_find_hw(dev, CX23885_HW_AV_CORE);
  1977. if (dev->sd_ir == NULL) {
  1978. ret = -ENODEV;
  1979. break;
  1980. }
  1981. v4l2_subdev_call(dev->sd_cx25840, core, s_io_pin_config,
  1982. ir_rxtx_pin_cfg_count, ir_rxtx_pin_cfg);
  1983. break;
  1984. case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP:
  1985. case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP2:
  1986. request_module("ir-kbd-i2c");
  1987. break;
  1988. }
  1989. return ret;
  1990. }
  1991. void cx23885_ir_fini(struct cx23885_dev *dev)
  1992. {
  1993. switch (dev->board) {
  1994. case CX23885_BOARD_HAUPPAUGE_HVR1270:
  1995. case CX23885_BOARD_HAUPPAUGE_HVR1850:
  1996. case CX23885_BOARD_HAUPPAUGE_HVR1290:
  1997. cx23885_irq_remove(dev, PCI_MSK_IR);
  1998. cx23888_ir_remove(dev);
  1999. dev->sd_ir = NULL;
  2000. break;
  2001. case CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL:
  2002. case CX23885_BOARD_TEVII_S470:
  2003. case CX23885_BOARD_HAUPPAUGE_HVR1250:
  2004. case CX23885_BOARD_MYGICA_X8507:
  2005. case CX23885_BOARD_TBS_6980:
  2006. case CX23885_BOARD_TBS_6981:
  2007. case CX23885_BOARD_DVBSKY_T9580:
  2008. case CX23885_BOARD_DVBSKY_T980C:
  2009. case CX23885_BOARD_DVBSKY_S950C:
  2010. case CX23885_BOARD_TT_CT2_4500_CI:
  2011. case CX23885_BOARD_DVBSKY_S950:
  2012. case CX23885_BOARD_DVBSKY_S952:
  2013. case CX23885_BOARD_DVBSKY_T982:
  2014. cx23885_irq_remove(dev, PCI_MSK_AV_CORE);
  2015. /* sd_ir is a duplicate pointer to the AV Core, just clear it */
  2016. dev->sd_ir = NULL;
  2017. break;
  2018. }
  2019. }
  2020. static int netup_jtag_io(void *device, int tms, int tdi, int read_tdo)
  2021. {
  2022. int data;
  2023. int tdo = 0;
  2024. struct cx23885_dev *dev = (struct cx23885_dev *)device;
  2025. /*TMS*/
  2026. data = ((cx_read(GP0_IO)) & (~0x00000002));
  2027. data |= (tms ? 0x00020002 : 0x00020000);
  2028. cx_write(GP0_IO, data);
  2029. /*TDI*/
  2030. data = ((cx_read(MC417_RWD)) & (~0x0000a000));
  2031. data |= (tdi ? 0x00008000 : 0);
  2032. cx_write(MC417_RWD, data);
  2033. if (read_tdo)
  2034. tdo = (data & 0x00004000) ? 1 : 0; /*TDO*/
  2035. cx_write(MC417_RWD, data | 0x00002000);
  2036. udelay(1);
  2037. /*TCK*/
  2038. cx_write(MC417_RWD, data);
  2039. return tdo;
  2040. }
  2041. void cx23885_ir_pci_int_enable(struct cx23885_dev *dev)
  2042. {
  2043. switch (dev->board) {
  2044. case CX23885_BOARD_HAUPPAUGE_HVR1270:
  2045. case CX23885_BOARD_HAUPPAUGE_HVR1850:
  2046. case CX23885_BOARD_HAUPPAUGE_HVR1290:
  2047. if (dev->sd_ir)
  2048. cx23885_irq_add_enable(dev, PCI_MSK_IR);
  2049. break;
  2050. case CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL:
  2051. case CX23885_BOARD_TEVII_S470:
  2052. case CX23885_BOARD_HAUPPAUGE_HVR1250:
  2053. case CX23885_BOARD_MYGICA_X8507:
  2054. case CX23885_BOARD_TBS_6980:
  2055. case CX23885_BOARD_TBS_6981:
  2056. case CX23885_BOARD_DVBSKY_T9580:
  2057. case CX23885_BOARD_DVBSKY_T980C:
  2058. case CX23885_BOARD_DVBSKY_S950C:
  2059. case CX23885_BOARD_TT_CT2_4500_CI:
  2060. case CX23885_BOARD_DVBSKY_S950:
  2061. case CX23885_BOARD_DVBSKY_S952:
  2062. case CX23885_BOARD_DVBSKY_T982:
  2063. if (dev->sd_ir)
  2064. cx23885_irq_add_enable(dev, PCI_MSK_AV_CORE);
  2065. break;
  2066. }
  2067. }
  2068. void cx23885_card_setup(struct cx23885_dev *dev)
  2069. {
  2070. struct cx23885_tsport *ts1 = &dev->ts1;
  2071. struct cx23885_tsport *ts2 = &dev->ts2;
  2072. static u8 eeprom[256];
  2073. if (dev->i2c_bus[0].i2c_rc == 0) {
  2074. dev->i2c_bus[0].i2c_client.addr = 0xa0 >> 1;
  2075. tveeprom_read(&dev->i2c_bus[0].i2c_client,
  2076. eeprom, sizeof(eeprom));
  2077. }
  2078. switch (dev->board) {
  2079. case CX23885_BOARD_HAUPPAUGE_HVR1250:
  2080. if (dev->i2c_bus[0].i2c_rc == 0) {
  2081. if (eeprom[0x80] != 0x84)
  2082. hauppauge_eeprom(dev, eeprom+0xc0);
  2083. else
  2084. hauppauge_eeprom(dev, eeprom+0x80);
  2085. }
  2086. break;
  2087. case CX23885_BOARD_HAUPPAUGE_HVR1500:
  2088. case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
  2089. case CX23885_BOARD_HAUPPAUGE_HVR1400:
  2090. if (dev->i2c_bus[0].i2c_rc == 0)
  2091. hauppauge_eeprom(dev, eeprom+0x80);
  2092. break;
  2093. case CX23885_BOARD_HAUPPAUGE_HVR1800:
  2094. case CX23885_BOARD_HAUPPAUGE_HVR1800lp:
  2095. case CX23885_BOARD_HAUPPAUGE_HVR1200:
  2096. case CX23885_BOARD_HAUPPAUGE_HVR1700:
  2097. case CX23885_BOARD_HAUPPAUGE_HVR1270:
  2098. case CX23885_BOARD_HAUPPAUGE_HVR1275:
  2099. case CX23885_BOARD_HAUPPAUGE_HVR1255:
  2100. case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
  2101. case CX23885_BOARD_HAUPPAUGE_HVR1210:
  2102. case CX23885_BOARD_HAUPPAUGE_HVR1850:
  2103. case CX23885_BOARD_HAUPPAUGE_HVR1290:
  2104. case CX23885_BOARD_HAUPPAUGE_HVR4400:
  2105. case CX23885_BOARD_HAUPPAUGE_STARBURST:
  2106. case CX23885_BOARD_HAUPPAUGE_IMPACTVCBE:
  2107. case CX23885_BOARD_HAUPPAUGE_HVR5525:
  2108. case CX23885_BOARD_HAUPPAUGE_HVR1265_K4:
  2109. case CX23885_BOARD_HAUPPAUGE_STARBURST2:
  2110. case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB:
  2111. case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB_885:
  2112. case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC:
  2113. case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC_885:
  2114. if (dev->i2c_bus[0].i2c_rc == 0)
  2115. hauppauge_eeprom(dev, eeprom+0xc0);
  2116. break;
  2117. case CX23885_BOARD_VIEWCAST_260E:
  2118. case CX23885_BOARD_VIEWCAST_460E:
  2119. dev->i2c_bus[1].i2c_client.addr = 0xa0 >> 1;
  2120. tveeprom_read(&dev->i2c_bus[1].i2c_client,
  2121. eeprom, sizeof(eeprom));
  2122. if (dev->i2c_bus[0].i2c_rc == 0)
  2123. viewcast_eeprom(dev, eeprom);
  2124. break;
  2125. }
  2126. switch (dev->board) {
  2127. case CX23885_BOARD_AVERMEDIA_HC81R:
  2128. /* Defaults for VID B */
  2129. ts1->gen_ctrl_val = 0x4; /* Parallel */
  2130. ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
  2131. ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
  2132. /* Defaults for VID C */
  2133. /* DREQ_POL, SMODE, PUNC_CLK, MCLK_POL Serial bus + punc clk */
  2134. ts2->gen_ctrl_val = 0x10e;
  2135. ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
  2136. ts2->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
  2137. break;
  2138. case CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP:
  2139. case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP:
  2140. case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP2:
  2141. ts2->gen_ctrl_val = 0xc; /* Serial bus + punctured clock */
  2142. ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
  2143. ts2->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
  2144. fallthrough;
  2145. case CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP:
  2146. ts1->gen_ctrl_val = 0xc; /* Serial bus + punctured clock */
  2147. ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
  2148. ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
  2149. break;
  2150. case CX23885_BOARD_HAUPPAUGE_HVR1850:
  2151. case CX23885_BOARD_HAUPPAUGE_HVR1800:
  2152. /* Defaults for VID B - Analog encoder */
  2153. /* DREQ_POL, SMODE, PUNC_CLK, MCLK_POL Serial bus + punc clk */
  2154. ts1->gen_ctrl_val = 0x10e;
  2155. ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
  2156. ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
  2157. /* APB_TSVALERR_POL (active low)*/
  2158. ts1->vld_misc_val = 0x2000;
  2159. ts1->hw_sop_ctrl_val = (0x47 << 16 | 188 << 4 | 0xc);
  2160. cx_write(0x130184, 0xc);
  2161. /* Defaults for VID C */
  2162. ts2->gen_ctrl_val = 0xc; /* Serial bus + punctured clock */
  2163. ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
  2164. ts2->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
  2165. break;
  2166. case CX23885_BOARD_TBS_6920:
  2167. ts1->gen_ctrl_val = 0x4; /* Parallel */
  2168. ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
  2169. ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
  2170. break;
  2171. case CX23885_BOARD_TEVII_S470:
  2172. case CX23885_BOARD_TEVII_S471:
  2173. case CX23885_BOARD_DVBWORLD_2005:
  2174. case CX23885_BOARD_PROF_8000:
  2175. case CX23885_BOARD_DVBSKY_T980C:
  2176. case CX23885_BOARD_DVBSKY_S950C:
  2177. case CX23885_BOARD_TT_CT2_4500_CI:
  2178. case CX23885_BOARD_DVBSKY_S950:
  2179. ts1->gen_ctrl_val = 0x5; /* Parallel */
  2180. ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
  2181. ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
  2182. break;
  2183. case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
  2184. case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF:
  2185. case CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL:
  2186. ts1->gen_ctrl_val = 0xc; /* Serial bus + punctured clock */
  2187. ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
  2188. ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
  2189. ts2->gen_ctrl_val = 0xc; /* Serial bus + punctured clock */
  2190. ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
  2191. ts2->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
  2192. break;
  2193. case CX23885_BOARD_TBS_6980:
  2194. case CX23885_BOARD_TBS_6981:
  2195. ts1->gen_ctrl_val = 0xc; /* Serial bus + punctured clock */
  2196. ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
  2197. ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
  2198. ts2->gen_ctrl_val = 0xc; /* Serial bus + punctured clock */
  2199. ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
  2200. ts2->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
  2201. tbs_card_init(dev);
  2202. break;
  2203. case CX23885_BOARD_MYGICA_X8506:
  2204. case CX23885_BOARD_MAGICPRO_PROHDTVE2:
  2205. case CX23885_BOARD_MYGICA_X8507:
  2206. ts1->gen_ctrl_val = 0x5; /* Parallel */
  2207. ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
  2208. ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
  2209. break;
  2210. case CX23885_BOARD_MYGICA_X8558PRO:
  2211. ts1->gen_ctrl_val = 0x5; /* Parallel */
  2212. ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
  2213. ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
  2214. ts2->gen_ctrl_val = 0xc; /* Serial bus + punctured clock */
  2215. ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
  2216. ts2->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
  2217. break;
  2218. case CX23885_BOARD_HAUPPAUGE_HVR4400:
  2219. ts1->gen_ctrl_val = 0xc; /* Serial bus + punctured clock */
  2220. ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
  2221. ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
  2222. ts2->gen_ctrl_val = 0xc; /* Serial bus + punctured clock */
  2223. ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
  2224. ts2->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
  2225. break;
  2226. case CX23885_BOARD_HAUPPAUGE_STARBURST:
  2227. ts1->gen_ctrl_val = 0xc; /* Serial bus + punctured clock */
  2228. ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
  2229. ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
  2230. break;
  2231. case CX23885_BOARD_DVBSKY_T9580:
  2232. case CX23885_BOARD_DVBSKY_T982:
  2233. ts1->gen_ctrl_val = 0x5; /* Parallel */
  2234. ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
  2235. ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
  2236. ts2->gen_ctrl_val = 0x8; /* Serial bus */
  2237. ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
  2238. ts2->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
  2239. break;
  2240. case CX23885_BOARD_DVBSKY_S952:
  2241. ts1->gen_ctrl_val = 0x5; /* Parallel */
  2242. ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
  2243. ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
  2244. ts2->gen_ctrl_val = 0xe; /* Serial bus */
  2245. ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
  2246. ts2->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
  2247. break;
  2248. case CX23885_BOARD_HAUPPAUGE_HVR5525:
  2249. case CX23885_BOARD_HAUPPAUGE_STARBURST2:
  2250. ts1->gen_ctrl_val = 0x5; /* Parallel */
  2251. ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
  2252. ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
  2253. ts2->gen_ctrl_val = 0xc; /* Serial bus + punctured clock */
  2254. ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
  2255. ts2->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
  2256. break;
  2257. case CX23885_BOARD_HAUPPAUGE_HVR1265_K4:
  2258. case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB:
  2259. case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB_885:
  2260. case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC:
  2261. case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC_885:
  2262. ts1->gen_ctrl_val = 0xc; /* Serial bus + punctured clock */
  2263. ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
  2264. ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
  2265. ts2->gen_ctrl_val = 0xc; /* Serial bus + punctured clock */
  2266. ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
  2267. ts2->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
  2268. break;
  2269. case CX23885_BOARD_HAUPPAUGE_HVR1250:
  2270. case CX23885_BOARD_HAUPPAUGE_HVR1500:
  2271. case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
  2272. case CX23885_BOARD_HAUPPAUGE_HVR1800lp:
  2273. case CX23885_BOARD_HAUPPAUGE_HVR1200:
  2274. case CX23885_BOARD_HAUPPAUGE_HVR1700:
  2275. case CX23885_BOARD_HAUPPAUGE_HVR1400:
  2276. case CX23885_BOARD_HAUPPAUGE_IMPACTVCBE:
  2277. case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H:
  2278. case CX23885_BOARD_LEADTEK_WINFAST_PXPVR2200:
  2279. case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H_XC4000:
  2280. case CX23885_BOARD_COMPRO_VIDEOMATE_E650F:
  2281. case CX23885_BOARD_HAUPPAUGE_HVR1270:
  2282. case CX23885_BOARD_HAUPPAUGE_HVR1275:
  2283. case CX23885_BOARD_HAUPPAUGE_HVR1255:
  2284. case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
  2285. case CX23885_BOARD_HAUPPAUGE_HVR1210:
  2286. case CX23885_BOARD_COMPRO_VIDEOMATE_E800:
  2287. case CX23885_BOARD_HAUPPAUGE_HVR1290:
  2288. case CX23885_BOARD_GOTVIEW_X5_3D_HYBRID:
  2289. default:
  2290. ts2->gen_ctrl_val = 0xc; /* Serial bus + punctured clock */
  2291. ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
  2292. ts2->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
  2293. }
  2294. /* Certain boards support analog, or require the avcore to be
  2295. * loaded, ensure this happens.
  2296. */
  2297. switch (dev->board) {
  2298. case CX23885_BOARD_TEVII_S470:
  2299. /* Currently only enabled for the integrated IR controller */
  2300. if (!enable_885_ir)
  2301. break;
  2302. fallthrough;
  2303. case CX23885_BOARD_HAUPPAUGE_HVR1250:
  2304. case CX23885_BOARD_HAUPPAUGE_HVR1800:
  2305. case CX23885_BOARD_HAUPPAUGE_IMPACTVCBE:
  2306. case CX23885_BOARD_HAUPPAUGE_HVR1800lp:
  2307. case CX23885_BOARD_HAUPPAUGE_HVR1700:
  2308. case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H:
  2309. case CX23885_BOARD_LEADTEK_WINFAST_PXPVR2200:
  2310. case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H_XC4000:
  2311. case CX23885_BOARD_COMPRO_VIDEOMATE_E650F:
  2312. case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
  2313. case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF:
  2314. case CX23885_BOARD_COMPRO_VIDEOMATE_E800:
  2315. case CX23885_BOARD_HAUPPAUGE_HVR1255:
  2316. case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
  2317. case CX23885_BOARD_HAUPPAUGE_HVR1265_K4:
  2318. case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB:
  2319. case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC:
  2320. case CX23885_BOARD_HAUPPAUGE_HVR1270:
  2321. case CX23885_BOARD_HAUPPAUGE_HVR1850:
  2322. case CX23885_BOARD_HAUPPAUGE_HVR5525:
  2323. case CX23885_BOARD_MYGICA_X8506:
  2324. case CX23885_BOARD_MAGICPRO_PROHDTVE2:
  2325. case CX23885_BOARD_HAUPPAUGE_HVR1290:
  2326. case CX23885_BOARD_LEADTEK_WINFAST_PXTV1200:
  2327. case CX23885_BOARD_GOTVIEW_X5_3D_HYBRID:
  2328. case CX23885_BOARD_HAUPPAUGE_HVR1500:
  2329. case CX23885_BOARD_MPX885:
  2330. case CX23885_BOARD_MYGICA_X8507:
  2331. case CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL:
  2332. case CX23885_BOARD_AVERMEDIA_HC81R:
  2333. case CX23885_BOARD_TBS_6980:
  2334. case CX23885_BOARD_TBS_6981:
  2335. case CX23885_BOARD_DVBSKY_T9580:
  2336. case CX23885_BOARD_DVBSKY_T980C:
  2337. case CX23885_BOARD_DVBSKY_S950C:
  2338. case CX23885_BOARD_TT_CT2_4500_CI:
  2339. case CX23885_BOARD_DVBSKY_S950:
  2340. case CX23885_BOARD_DVBSKY_S952:
  2341. case CX23885_BOARD_DVBSKY_T982:
  2342. case CX23885_BOARD_VIEWCAST_260E:
  2343. case CX23885_BOARD_VIEWCAST_460E:
  2344. case CX23885_BOARD_AVERMEDIA_CE310B:
  2345. dev->sd_cx25840 = v4l2_i2c_new_subdev(&dev->v4l2_dev,
  2346. &dev->i2c_bus[2].i2c_adap,
  2347. "cx25840", 0x88 >> 1, NULL);
  2348. if (dev->sd_cx25840) {
  2349. /* set host data for clk_freq configuration */
  2350. v4l2_set_subdev_hostdata(dev->sd_cx25840,
  2351. &dev->clk_freq);
  2352. dev->sd_cx25840->grp_id = CX23885_HW_AV_CORE;
  2353. v4l2_subdev_call(dev->sd_cx25840, core, load_fw);
  2354. }
  2355. break;
  2356. }
  2357. switch (dev->board) {
  2358. case CX23885_BOARD_VIEWCAST_260E:
  2359. v4l2_i2c_new_subdev(&dev->v4l2_dev,
  2360. &dev->i2c_bus[0].i2c_adap,
  2361. "cs3308", 0x82 >> 1, NULL);
  2362. break;
  2363. case CX23885_BOARD_VIEWCAST_460E:
  2364. /* This cs3308 controls the audio from the breakout cable */
  2365. v4l2_i2c_new_subdev(&dev->v4l2_dev,
  2366. &dev->i2c_bus[0].i2c_adap,
  2367. "cs3308", 0x80 >> 1, NULL);
  2368. /* This cs3308 controls the audio from the onboard header */
  2369. v4l2_i2c_new_subdev(&dev->v4l2_dev,
  2370. &dev->i2c_bus[0].i2c_adap,
  2371. "cs3308", 0x82 >> 1, NULL);
  2372. break;
  2373. }
  2374. /* AUX-PLL 27MHz CLK */
  2375. switch (dev->board) {
  2376. case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
  2377. netup_initialize(dev);
  2378. break;
  2379. case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF: {
  2380. int ret;
  2381. const struct firmware *fw;
  2382. const char *filename = "dvb-netup-altera-01.fw";
  2383. char *action = "configure";
  2384. static struct netup_card_info cinfo;
  2385. struct altera_config netup_config = {
  2386. .dev = dev,
  2387. .action = action,
  2388. .jtag_io = netup_jtag_io,
  2389. };
  2390. netup_initialize(dev);
  2391. netup_get_card_info(&dev->i2c_bus[0].i2c_adap, &cinfo);
  2392. if (netup_card_rev)
  2393. cinfo.rev = netup_card_rev;
  2394. switch (cinfo.rev) {
  2395. case 0x4:
  2396. filename = "dvb-netup-altera-04.fw";
  2397. break;
  2398. default:
  2399. filename = "dvb-netup-altera-01.fw";
  2400. break;
  2401. }
  2402. pr_info("NetUP card rev=0x%x fw_filename=%s\n",
  2403. cinfo.rev, filename);
  2404. ret = request_firmware(&fw, filename, &dev->pci->dev);
  2405. if (ret != 0)
  2406. pr_err("did not find the firmware file '%s'. You can use <kernel_dir>/scripts/get_dvb_firmware to get the firmware.",
  2407. filename);
  2408. else
  2409. altera_init(&netup_config, fw);
  2410. release_firmware(fw);
  2411. break;
  2412. }
  2413. }
  2414. }