dib0700_devices.c 70 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553
  1. /* Linux driver for devices based on the DiBcom DiB0700 USB bridge
  2. *
  3. * This program is free software; you can redistribute it and/or modify it
  4. * under the terms of the GNU General Public License as published by the Free
  5. * Software Foundation, version 2.
  6. *
  7. * Copyright (C) 2005-9 DiBcom, SA et al
  8. */
  9. #include "dib0700.h"
  10. #include "dib3000mc.h"
  11. #include "dib7000m.h"
  12. #include "dib7000p.h"
  13. #include "dib8000.h"
  14. #include "mt2060.h"
  15. #include "mt2266.h"
  16. #include "tuner-xc2028.h"
  17. #include "xc5000.h"
  18. #include "s5h1411.h"
  19. #include "dib0070.h"
  20. #include "lgdt3305.h"
  21. #include "mxl5007t.h"
  22. static int force_lna_activation;
  23. module_param(force_lna_activation, int, 0644);
  24. MODULE_PARM_DESC(force_lna_activation, "force the activation of Low-Noise-Amplifyer(s) (LNA), "
  25. "if applicable for the device (default: 0=automatic/off).");
  26. struct dib0700_adapter_state {
  27. int (*set_param_save) (struct dvb_frontend *, struct dvb_frontend_parameters *);
  28. };
  29. /* Hauppauge Nova-T 500 (aka Bristol)
  30. * has a LNA on GPIO0 which is enabled by setting 1 */
  31. static struct mt2060_config bristol_mt2060_config[2] = {
  32. {
  33. .i2c_address = 0x60,
  34. .clock_out = 3,
  35. }, {
  36. .i2c_address = 0x61,
  37. }
  38. };
  39. static struct dibx000_agc_config bristol_dib3000p_mt2060_agc_config = {
  40. .band_caps = BAND_VHF | BAND_UHF,
  41. .setup = (1 << 8) | (5 << 5) | (0 << 4) | (0 << 3) | (0 << 2) | (2 << 0),
  42. .agc1_max = 42598,
  43. .agc1_min = 17694,
  44. .agc2_max = 45875,
  45. .agc2_min = 0,
  46. .agc1_pt1 = 0,
  47. .agc1_pt2 = 59,
  48. .agc1_slope1 = 0,
  49. .agc1_slope2 = 69,
  50. .agc2_pt1 = 0,
  51. .agc2_pt2 = 59,
  52. .agc2_slope1 = 111,
  53. .agc2_slope2 = 28,
  54. };
  55. static struct dib3000mc_config bristol_dib3000mc_config[2] = {
  56. { .agc = &bristol_dib3000p_mt2060_agc_config,
  57. .max_time = 0x196,
  58. .ln_adc_level = 0x1cc7,
  59. .output_mpeg2_in_188_bytes = 1,
  60. },
  61. { .agc = &bristol_dib3000p_mt2060_agc_config,
  62. .max_time = 0x196,
  63. .ln_adc_level = 0x1cc7,
  64. .output_mpeg2_in_188_bytes = 1,
  65. }
  66. };
  67. static int bristol_frontend_attach(struct dvb_usb_adapter *adap)
  68. {
  69. struct dib0700_state *st = adap->dev->priv;
  70. if (adap->id == 0) {
  71. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(10);
  72. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); msleep(10);
  73. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); msleep(10);
  74. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); msleep(10);
  75. if (force_lna_activation)
  76. dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
  77. else
  78. dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 0);
  79. if (dib3000mc_i2c_enumeration(&adap->dev->i2c_adap, 2, DEFAULT_DIB3000P_I2C_ADDRESS, bristol_dib3000mc_config) != 0) {
  80. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(10);
  81. return -ENODEV;
  82. }
  83. }
  84. st->mt2060_if1[adap->id] = 1220;
  85. return (adap->fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap,
  86. (10 + adap->id) << 1, &bristol_dib3000mc_config[adap->id])) == NULL ? -ENODEV : 0;
  87. }
  88. static int eeprom_read(struct i2c_adapter *adap,u8 adrs,u8 *pval)
  89. {
  90. struct i2c_msg msg[2] = {
  91. { .addr = 0x50, .flags = 0, .buf = &adrs, .len = 1 },
  92. { .addr = 0x50, .flags = I2C_M_RD, .buf = pval, .len = 1 },
  93. };
  94. if (i2c_transfer(adap, msg, 2) != 2) return -EREMOTEIO;
  95. return 0;
  96. }
  97. static int bristol_tuner_attach(struct dvb_usb_adapter *adap)
  98. {
  99. struct i2c_adapter *prim_i2c = &adap->dev->i2c_adap;
  100. struct i2c_adapter *tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe, 1);
  101. s8 a;
  102. int if1=1220;
  103. if (adap->dev->udev->descriptor.idVendor == cpu_to_le16(USB_VID_HAUPPAUGE) &&
  104. adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_500_2)) {
  105. if (!eeprom_read(prim_i2c,0x59 + adap->id,&a)) if1=1220+a;
  106. }
  107. return dvb_attach(mt2060_attach,adap->fe, tun_i2c,&bristol_mt2060_config[adap->id],
  108. if1) == NULL ? -ENODEV : 0;
  109. }
  110. /* STK7700D: Pinnacle/Terratec/Hauppauge Dual DVB-T Diversity */
  111. /* MT226x */
  112. static struct dibx000_agc_config stk7700d_7000p_mt2266_agc_config[2] = {
  113. {
  114. BAND_UHF, // band_caps
  115. /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1, P_agc_inv_pwm1=1, P_agc_inv_pwm2=1,
  116. * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */
  117. (0 << 15) | (0 << 14) | (1 << 11) | (1 << 10) | (1 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0), // setup
  118. 1130, // inv_gain
  119. 21, // time_stabiliz
  120. 0, // alpha_level
  121. 118, // thlock
  122. 0, // wbd_inv
  123. 3530, // wbd_ref
  124. 1, // wbd_sel
  125. 0, // wbd_alpha
  126. 65535, // agc1_max
  127. 33770, // agc1_min
  128. 65535, // agc2_max
  129. 23592, // agc2_min
  130. 0, // agc1_pt1
  131. 62, // agc1_pt2
  132. 255, // agc1_pt3
  133. 64, // agc1_slope1
  134. 64, // agc1_slope2
  135. 132, // agc2_pt1
  136. 192, // agc2_pt2
  137. 80, // agc2_slope1
  138. 80, // agc2_slope2
  139. 17, // alpha_mant
  140. 27, // alpha_exp
  141. 23, // beta_mant
  142. 51, // beta_exp
  143. 1, // perform_agc_softsplit
  144. }, {
  145. BAND_VHF | BAND_LBAND, // band_caps
  146. /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1, P_agc_inv_pwm1=1, P_agc_inv_pwm2=1,
  147. * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */
  148. (0 << 15) | (0 << 14) | (1 << 11) | (1 << 10) | (1 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), // setup
  149. 2372, // inv_gain
  150. 21, // time_stabiliz
  151. 0, // alpha_level
  152. 118, // thlock
  153. 0, // wbd_inv
  154. 3530, // wbd_ref
  155. 1, // wbd_sel
  156. 0, // wbd_alpha
  157. 65535, // agc1_max
  158. 0, // agc1_min
  159. 65535, // agc2_max
  160. 23592, // agc2_min
  161. 0, // agc1_pt1
  162. 128, // agc1_pt2
  163. 128, // agc1_pt3
  164. 128, // agc1_slope1
  165. 0, // agc1_slope2
  166. 128, // agc2_pt1
  167. 253, // agc2_pt2
  168. 81, // agc2_slope1
  169. 0, // agc2_slope2
  170. 17, // alpha_mant
  171. 27, // alpha_exp
  172. 23, // beta_mant
  173. 51, // beta_exp
  174. 1, // perform_agc_softsplit
  175. }
  176. };
  177. static struct dibx000_bandwidth_config stk7700d_mt2266_pll_config = {
  178. 60000, 30000, // internal, sampling
  179. 1, 8, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass
  180. 0, 0, 1, 1, 2, // misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, modulo
  181. (3 << 14) | (1 << 12) | (524 << 0), // sad_cfg: refsel, sel, freq_15k
  182. 0, // ifreq
  183. 20452225, // timf
  184. };
  185. static struct dib7000p_config stk7700d_dib7000p_mt2266_config[] = {
  186. { .output_mpeg2_in_188_bytes = 1,
  187. .hostbus_diversity = 1,
  188. .tuner_is_baseband = 1,
  189. .agc_config_count = 2,
  190. .agc = stk7700d_7000p_mt2266_agc_config,
  191. .bw = &stk7700d_mt2266_pll_config,
  192. .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
  193. .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
  194. .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
  195. },
  196. { .output_mpeg2_in_188_bytes = 1,
  197. .hostbus_diversity = 1,
  198. .tuner_is_baseband = 1,
  199. .agc_config_count = 2,
  200. .agc = stk7700d_7000p_mt2266_agc_config,
  201. .bw = &stk7700d_mt2266_pll_config,
  202. .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
  203. .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
  204. .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
  205. }
  206. };
  207. static struct mt2266_config stk7700d_mt2266_config[2] = {
  208. { .i2c_address = 0x60
  209. },
  210. { .i2c_address = 0x60
  211. }
  212. };
  213. static int stk7700P2_frontend_attach(struct dvb_usb_adapter *adap)
  214. {
  215. if (adap->id == 0) {
  216. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
  217. msleep(10);
  218. dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
  219. dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
  220. dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
  221. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
  222. msleep(10);
  223. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
  224. msleep(10);
  225. if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
  226. stk7700d_dib7000p_mt2266_config)
  227. != 0) {
  228. err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n", __func__);
  229. return -ENODEV;
  230. }
  231. }
  232. adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap,0x80+(adap->id << 1),
  233. &stk7700d_dib7000p_mt2266_config[adap->id]);
  234. return adap->fe == NULL ? -ENODEV : 0;
  235. }
  236. static int stk7700d_frontend_attach(struct dvb_usb_adapter *adap)
  237. {
  238. if (adap->id == 0) {
  239. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
  240. msleep(10);
  241. dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
  242. dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
  243. dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
  244. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
  245. msleep(10);
  246. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
  247. msleep(10);
  248. dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
  249. if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 2, 18,
  250. stk7700d_dib7000p_mt2266_config)
  251. != 0) {
  252. err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n", __func__);
  253. return -ENODEV;
  254. }
  255. }
  256. adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap,0x80+(adap->id << 1),
  257. &stk7700d_dib7000p_mt2266_config[adap->id]);
  258. return adap->fe == NULL ? -ENODEV : 0;
  259. }
  260. static int stk7700d_tuner_attach(struct dvb_usb_adapter *adap)
  261. {
  262. struct i2c_adapter *tun_i2c;
  263. tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
  264. return dvb_attach(mt2266_attach, adap->fe, tun_i2c,
  265. &stk7700d_mt2266_config[adap->id]) == NULL ? -ENODEV : 0;
  266. }
  267. /* STK7700-PH: Digital/Analog Hybrid Tuner, e.h. Cinergy HT USB HE */
  268. static struct dibx000_agc_config xc3028_agc_config = {
  269. BAND_VHF | BAND_UHF, /* band_caps */
  270. /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=0,
  271. * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
  272. * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */
  273. (0 << 15) | (0 << 14) | (0 << 11) | (0 << 10) | (0 << 9) | (0 << 8) |
  274. (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), /* setup */
  275. 712, /* inv_gain */
  276. 21, /* time_stabiliz */
  277. 0, /* alpha_level */
  278. 118, /* thlock */
  279. 0, /* wbd_inv */
  280. 2867, /* wbd_ref */
  281. 0, /* wbd_sel */
  282. 2, /* wbd_alpha */
  283. 0, /* agc1_max */
  284. 0, /* agc1_min */
  285. 39718, /* agc2_max */
  286. 9930, /* agc2_min */
  287. 0, /* agc1_pt1 */
  288. 0, /* agc1_pt2 */
  289. 0, /* agc1_pt3 */
  290. 0, /* agc1_slope1 */
  291. 0, /* agc1_slope2 */
  292. 0, /* agc2_pt1 */
  293. 128, /* agc2_pt2 */
  294. 29, /* agc2_slope1 */
  295. 29, /* agc2_slope2 */
  296. 17, /* alpha_mant */
  297. 27, /* alpha_exp */
  298. 23, /* beta_mant */
  299. 51, /* beta_exp */
  300. 1, /* perform_agc_softsplit */
  301. };
  302. /* PLL Configuration for COFDM BW_MHz = 8.00 with external clock = 30.00 */
  303. static struct dibx000_bandwidth_config xc3028_bw_config = {
  304. 60000, 30000, /* internal, sampling */
  305. 1, 8, 3, 1, 0, /* pll_cfg: prediv, ratio, range, reset, bypass */
  306. 0, 0, 1, 1, 0, /* misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc,
  307. modulo */
  308. (3 << 14) | (1 << 12) | (524 << 0), /* sad_cfg: refsel, sel, freq_15k */
  309. (1 << 25) | 5816102, /* ifreq = 5.200000 MHz */
  310. 20452225, /* timf */
  311. 30000000, /* xtal_hz */
  312. };
  313. static struct dib7000p_config stk7700ph_dib7700_xc3028_config = {
  314. .output_mpeg2_in_188_bytes = 1,
  315. .tuner_is_baseband = 1,
  316. .agc_config_count = 1,
  317. .agc = &xc3028_agc_config,
  318. .bw = &xc3028_bw_config,
  319. .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
  320. .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
  321. .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
  322. };
  323. static int stk7700ph_xc3028_callback(void *ptr, int component,
  324. int command, int arg)
  325. {
  326. struct dvb_usb_adapter *adap = ptr;
  327. switch (command) {
  328. case XC2028_TUNER_RESET:
  329. /* Send the tuner in then out of reset */
  330. dib7000p_set_gpio(adap->fe, 8, 0, 0); msleep(10);
  331. dib7000p_set_gpio(adap->fe, 8, 0, 1);
  332. break;
  333. case XC2028_RESET_CLK:
  334. break;
  335. default:
  336. err("%s: unknown command %d, arg %d\n", __func__,
  337. command, arg);
  338. return -EINVAL;
  339. }
  340. return 0;
  341. }
  342. static struct xc2028_ctrl stk7700ph_xc3028_ctrl = {
  343. .fname = XC2028_DEFAULT_FIRMWARE,
  344. .max_len = 64,
  345. .demod = XC3028_FE_DIBCOM52,
  346. };
  347. static struct xc2028_config stk7700ph_xc3028_config = {
  348. .i2c_addr = 0x61,
  349. .ctrl = &stk7700ph_xc3028_ctrl,
  350. };
  351. static int stk7700ph_frontend_attach(struct dvb_usb_adapter *adap)
  352. {
  353. struct usb_device_descriptor *desc = &adap->dev->udev->descriptor;
  354. if (desc->idVendor == cpu_to_le16(USB_VID_PINNACLE) &&
  355. desc->idProduct == cpu_to_le16(USB_PID_PINNACLE_EXPRESSCARD_320CX))
  356. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
  357. else
  358. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
  359. msleep(20);
  360. dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
  361. dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
  362. dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
  363. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
  364. msleep(10);
  365. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
  366. msleep(20);
  367. dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
  368. msleep(10);
  369. if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
  370. &stk7700ph_dib7700_xc3028_config) != 0) {
  371. err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n",
  372. __func__);
  373. return -ENODEV;
  374. }
  375. adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
  376. &stk7700ph_dib7700_xc3028_config);
  377. return adap->fe == NULL ? -ENODEV : 0;
  378. }
  379. static int stk7700ph_tuner_attach(struct dvb_usb_adapter *adap)
  380. {
  381. struct i2c_adapter *tun_i2c;
  382. tun_i2c = dib7000p_get_i2c_master(adap->fe,
  383. DIBX000_I2C_INTERFACE_TUNER, 1);
  384. stk7700ph_xc3028_config.i2c_adap = tun_i2c;
  385. /* FIXME: generalize & move to common area */
  386. adap->fe->callback = stk7700ph_xc3028_callback;
  387. return dvb_attach(xc2028_attach, adap->fe, &stk7700ph_xc3028_config)
  388. == NULL ? -ENODEV : 0;
  389. }
  390. #define DEFAULT_RC_INTERVAL 50
  391. static u8 rc_request[] = { REQUEST_POLL_RC, 0 };
  392. /* Number of keypresses to ignore before start repeating */
  393. #define RC_REPEAT_DELAY 6
  394. #define RC_REPEAT_DELAY_V1_20 10
  395. /* Used by firmware versions < 1.20 (deprecated) */
  396. static int dib0700_rc_query_legacy(struct dvb_usb_device *d, u32 *event,
  397. int *state)
  398. {
  399. u8 key[4];
  400. int i;
  401. struct dvb_usb_rc_key *keymap = d->props.rc_key_map;
  402. struct dib0700_state *st = d->priv;
  403. *event = 0;
  404. *state = REMOTE_NO_KEY_PRESSED;
  405. i=dib0700_ctrl_rd(d,rc_request,2,key,4);
  406. if (i<=0) {
  407. err("RC Query Failed");
  408. return -1;
  409. }
  410. /* losing half of KEY_0 events from Philipps rc5 remotes.. */
  411. if (key[0]==0 && key[1]==0 && key[2]==0 && key[3]==0) return 0;
  412. /* info("%d: %2X %2X %2X %2X",dvb_usb_dib0700_ir_proto,(int)key[3-2],(int)key[3-3],(int)key[3-1],(int)key[3]); */
  413. dib0700_rc_setup(d); /* reset ir sensor data to prevent false events */
  414. switch (dvb_usb_dib0700_ir_proto) {
  415. case 0: {
  416. /* NEC protocol sends repeat code as 0 0 0 FF */
  417. if ((key[3-2] == 0x00) && (key[3-3] == 0x00) &&
  418. (key[3] == 0xFF)) {
  419. st->rc_counter++;
  420. if (st->rc_counter > RC_REPEAT_DELAY) {
  421. *event = d->last_event;
  422. *state = REMOTE_KEY_PRESSED;
  423. st->rc_counter = RC_REPEAT_DELAY;
  424. }
  425. return 0;
  426. }
  427. for (i=0;i<d->props.rc_key_map_size; i++) {
  428. if (rc5_custom(&keymap[i]) == key[3-2] &&
  429. rc5_data(&keymap[i]) == key[3-3]) {
  430. st->rc_counter = 0;
  431. *event = keymap[i].event;
  432. *state = REMOTE_KEY_PRESSED;
  433. d->last_event = keymap[i].event;
  434. return 0;
  435. }
  436. }
  437. break;
  438. }
  439. default: {
  440. /* RC-5 protocol changes toggle bit on new keypress */
  441. for (i = 0; i < d->props.rc_key_map_size; i++) {
  442. if (rc5_custom(&keymap[i]) == key[3-2] &&
  443. rc5_data(&keymap[i]) == key[3-3]) {
  444. if (d->last_event == keymap[i].event &&
  445. key[3-1] == st->rc_toggle) {
  446. st->rc_counter++;
  447. /* prevents unwanted double hits */
  448. if (st->rc_counter > RC_REPEAT_DELAY) {
  449. *event = d->last_event;
  450. *state = REMOTE_KEY_PRESSED;
  451. st->rc_counter = RC_REPEAT_DELAY;
  452. }
  453. return 0;
  454. }
  455. st->rc_counter = 0;
  456. *event = keymap[i].event;
  457. *state = REMOTE_KEY_PRESSED;
  458. st->rc_toggle = key[3-1];
  459. d->last_event = keymap[i].event;
  460. return 0;
  461. }
  462. }
  463. break;
  464. }
  465. }
  466. err("Unknown remote controller key: %2X %2X %2X %2X", (int) key[3-2], (int) key[3-3], (int) key[3-1], (int) key[3]);
  467. d->last_event = 0;
  468. return 0;
  469. }
  470. /* This is the structure of the RC response packet starting in firmware 1.20 */
  471. struct dib0700_rc_response {
  472. u8 report_id;
  473. u8 data_state;
  474. u16 system;
  475. u8 data;
  476. u8 not_data;
  477. };
  478. /* This supports the new IR response format for firmware v1.20 */
  479. static int dib0700_rc_query_v1_20(struct dvb_usb_device *d, u32 *event,
  480. int *state)
  481. {
  482. struct dvb_usb_rc_key *keymap = d->props.rc_key_map;
  483. struct dib0700_state *st = d->priv;
  484. struct dib0700_rc_response poll_reply;
  485. u8 buf[6];
  486. int i;
  487. int status;
  488. int actlen;
  489. int found = 0;
  490. /* Set initial results in case we exit the function early */
  491. *event = 0;
  492. *state = REMOTE_NO_KEY_PRESSED;
  493. /* Firmware v1.20 provides RC data via bulk endpoint 1 */
  494. status = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev, 1), buf,
  495. sizeof(buf), &actlen, 50);
  496. if (status < 0) {
  497. /* No data available (meaning no key press) */
  498. return 0;
  499. }
  500. switch (dvb_usb_dib0700_ir_proto) {
  501. case 0:
  502. poll_reply.report_id = 0;
  503. poll_reply.data_state = 1;
  504. poll_reply.system = buf[2];
  505. poll_reply.data = buf[4];
  506. poll_reply.not_data = buf[5];
  507. /* NEC protocol sends repeat code as 0 0 0 FF */
  508. if ((poll_reply.system == 0x00) && (poll_reply.data == 0x00)
  509. && (poll_reply.not_data == 0xff)) {
  510. poll_reply.data_state = 2;
  511. break;
  512. }
  513. break;
  514. default:
  515. if (actlen != sizeof(buf)) {
  516. /* We didn't get back the 6 byte message we expected */
  517. err("Unexpected RC response size [%d]", actlen);
  518. return -1;
  519. }
  520. poll_reply.report_id = buf[0];
  521. poll_reply.data_state = buf[1];
  522. poll_reply.system = (buf[2] << 8) | buf[3];
  523. poll_reply.data = buf[4];
  524. poll_reply.not_data = buf[5];
  525. break;
  526. }
  527. if ((poll_reply.data + poll_reply.not_data) != 0xff) {
  528. /* Key failed integrity check */
  529. err("key failed integrity check: %04x %02x %02x",
  530. poll_reply.system,
  531. poll_reply.data, poll_reply.not_data);
  532. return -1;
  533. }
  534. /* Find the key in the map */
  535. for (i = 0; i < d->props.rc_key_map_size; i++) {
  536. if (rc5_custom(&keymap[i]) == (poll_reply.system & 0xff) &&
  537. rc5_data(&keymap[i]) == poll_reply.data) {
  538. *event = keymap[i].event;
  539. found = 1;
  540. break;
  541. }
  542. }
  543. if (found == 0) {
  544. err("Unknown remote controller key: %04x %02x %02x",
  545. poll_reply.system,
  546. poll_reply.data, poll_reply.not_data);
  547. d->last_event = 0;
  548. return 0;
  549. }
  550. if (poll_reply.data_state == 1) {
  551. /* New key hit */
  552. st->rc_counter = 0;
  553. *event = keymap[i].event;
  554. *state = REMOTE_KEY_PRESSED;
  555. d->last_event = keymap[i].event;
  556. } else if (poll_reply.data_state == 2) {
  557. /* Key repeated */
  558. st->rc_counter++;
  559. /* prevents unwanted double hits */
  560. if (st->rc_counter > RC_REPEAT_DELAY_V1_20) {
  561. *event = d->last_event;
  562. *state = REMOTE_KEY_PRESSED;
  563. st->rc_counter = RC_REPEAT_DELAY_V1_20;
  564. }
  565. } else {
  566. err("Unknown data state [%d]", poll_reply.data_state);
  567. }
  568. return 0;
  569. }
  570. static int dib0700_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
  571. {
  572. struct dib0700_state *st = d->priv;
  573. /* Because some people may have improperly named firmware files,
  574. let's figure out whether to use the new firmware call or the legacy
  575. call based on the firmware version embedded in the file */
  576. if (st->rc_func_version == 0) {
  577. u32 hwver, romver, ramver, fwtype;
  578. int ret = dib0700_get_version(d, &hwver, &romver, &ramver,
  579. &fwtype);
  580. if (ret < 0) {
  581. err("Could not determine version info");
  582. return -1;
  583. }
  584. if (ramver < 0x10200)
  585. st->rc_func_version = 1;
  586. else
  587. st->rc_func_version = 2;
  588. }
  589. if (st->rc_func_version == 2)
  590. return dib0700_rc_query_v1_20(d, event, state);
  591. else
  592. return dib0700_rc_query_legacy(d, event, state);
  593. }
  594. static struct dvb_usb_rc_key dib0700_rc_keys[] = {
  595. /* Key codes for the tiny Pinnacle remote*/
  596. { 0x0700, KEY_MUTE },
  597. { 0x0701, KEY_MENU }, /* Pinnacle logo */
  598. { 0x0739, KEY_POWER },
  599. { 0x0703, KEY_VOLUMEUP },
  600. { 0x0709, KEY_VOLUMEDOWN },
  601. { 0x0706, KEY_CHANNELUP },
  602. { 0x070c, KEY_CHANNELDOWN },
  603. { 0x070f, KEY_1 },
  604. { 0x0715, KEY_2 },
  605. { 0x0710, KEY_3 },
  606. { 0x0718, KEY_4 },
  607. { 0x071b, KEY_5 },
  608. { 0x071e, KEY_6 },
  609. { 0x0711, KEY_7 },
  610. { 0x0721, KEY_8 },
  611. { 0x0712, KEY_9 },
  612. { 0x0727, KEY_0 },
  613. { 0x0724, KEY_SCREEN }, /* 'Square' key */
  614. { 0x072a, KEY_TEXT }, /* 'T' key */
  615. { 0x072d, KEY_REWIND },
  616. { 0x0730, KEY_PLAY },
  617. { 0x0733, KEY_FASTFORWARD },
  618. { 0x0736, KEY_RECORD },
  619. { 0x073c, KEY_STOP },
  620. { 0x073f, KEY_CANCEL }, /* '?' key */
  621. /* Key codes for the Terratec Cinergy DT XS Diversity, similar to cinergyT2.c */
  622. { 0xeb01, KEY_POWER },
  623. { 0xeb02, KEY_1 },
  624. { 0xeb03, KEY_2 },
  625. { 0xeb04, KEY_3 },
  626. { 0xeb05, KEY_4 },
  627. { 0xeb06, KEY_5 },
  628. { 0xeb07, KEY_6 },
  629. { 0xeb08, KEY_7 },
  630. { 0xeb09, KEY_8 },
  631. { 0xeb0a, KEY_9 },
  632. { 0xeb0b, KEY_VIDEO },
  633. { 0xeb0c, KEY_0 },
  634. { 0xeb0d, KEY_REFRESH },
  635. { 0xeb0f, KEY_EPG },
  636. { 0xeb10, KEY_UP },
  637. { 0xeb11, KEY_LEFT },
  638. { 0xeb12, KEY_OK },
  639. { 0xeb13, KEY_RIGHT },
  640. { 0xeb14, KEY_DOWN },
  641. { 0xeb16, KEY_INFO },
  642. { 0xeb17, KEY_RED },
  643. { 0xeb18, KEY_GREEN },
  644. { 0xeb19, KEY_YELLOW },
  645. { 0xeb1a, KEY_BLUE },
  646. { 0xeb1b, KEY_CHANNELUP },
  647. { 0xeb1c, KEY_VOLUMEUP },
  648. { 0xeb1d, KEY_MUTE },
  649. { 0xeb1e, KEY_VOLUMEDOWN },
  650. { 0xeb1f, KEY_CHANNELDOWN },
  651. { 0xeb40, KEY_PAUSE },
  652. { 0xeb41, KEY_HOME },
  653. { 0xeb42, KEY_MENU }, /* DVD Menu */
  654. { 0xeb43, KEY_SUBTITLE },
  655. { 0xeb44, KEY_TEXT }, /* Teletext */
  656. { 0xeb45, KEY_DELETE },
  657. { 0xeb46, KEY_TV },
  658. { 0xeb47, KEY_DVD },
  659. { 0xeb48, KEY_STOP },
  660. { 0xeb49, KEY_VIDEO },
  661. { 0xeb4a, KEY_AUDIO }, /* Music */
  662. { 0xeb4b, KEY_SCREEN }, /* Pic */
  663. { 0xeb4c, KEY_PLAY },
  664. { 0xeb4d, KEY_BACK },
  665. { 0xeb4e, KEY_REWIND },
  666. { 0xeb4f, KEY_FASTFORWARD },
  667. { 0xeb54, KEY_PREVIOUS },
  668. { 0xeb58, KEY_RECORD },
  669. { 0xeb5c, KEY_NEXT },
  670. /* Key codes for the Haupauge WinTV Nova-TD, copied from nova-t-usb2.c (Nova-T USB2) */
  671. { 0x1e00, KEY_0 },
  672. { 0x1e01, KEY_1 },
  673. { 0x1e02, KEY_2 },
  674. { 0x1e03, KEY_3 },
  675. { 0x1e04, KEY_4 },
  676. { 0x1e05, KEY_5 },
  677. { 0x1e06, KEY_6 },
  678. { 0x1e07, KEY_7 },
  679. { 0x1e08, KEY_8 },
  680. { 0x1e09, KEY_9 },
  681. { 0x1e0a, KEY_KPASTERISK },
  682. { 0x1e0b, KEY_RED },
  683. { 0x1e0c, KEY_RADIO },
  684. { 0x1e0d, KEY_MENU },
  685. { 0x1e0e, KEY_GRAVE }, /* # */
  686. { 0x1e0f, KEY_MUTE },
  687. { 0x1e10, KEY_VOLUMEUP },
  688. { 0x1e11, KEY_VOLUMEDOWN },
  689. { 0x1e12, KEY_CHANNEL },
  690. { 0x1e14, KEY_UP },
  691. { 0x1e15, KEY_DOWN },
  692. { 0x1e16, KEY_LEFT },
  693. { 0x1e17, KEY_RIGHT },
  694. { 0x1e18, KEY_VIDEO },
  695. { 0x1e19, KEY_AUDIO },
  696. { 0x1e1a, KEY_MEDIA },
  697. { 0x1e1b, KEY_EPG },
  698. { 0x1e1c, KEY_TV },
  699. { 0x1e1e, KEY_NEXT },
  700. { 0x1e1f, KEY_BACK },
  701. { 0x1e20, KEY_CHANNELUP },
  702. { 0x1e21, KEY_CHANNELDOWN },
  703. { 0x1e24, KEY_LAST }, /* Skip backwards */
  704. { 0x1e25, KEY_OK },
  705. { 0x1e29, KEY_BLUE},
  706. { 0x1e2e, KEY_GREEN },
  707. { 0x1e30, KEY_PAUSE },
  708. { 0x1e32, KEY_REWIND },
  709. { 0x1e34, KEY_FASTFORWARD },
  710. { 0x1e35, KEY_PLAY },
  711. { 0x1e36, KEY_STOP },
  712. { 0x1e37, KEY_RECORD },
  713. { 0x1e38, KEY_YELLOW },
  714. { 0x1e3b, KEY_GOTO },
  715. { 0x1e3d, KEY_POWER },
  716. /* Key codes for the Leadtek Winfast DTV Dongle */
  717. { 0x0042, KEY_POWER },
  718. { 0x077c, KEY_TUNER },
  719. { 0x0f4e, KEY_PRINT }, /* PREVIEW */
  720. { 0x0840, KEY_SCREEN }, /* full screen toggle*/
  721. { 0x0f71, KEY_DOT }, /* frequency */
  722. { 0x0743, KEY_0 },
  723. { 0x0c41, KEY_1 },
  724. { 0x0443, KEY_2 },
  725. { 0x0b7f, KEY_3 },
  726. { 0x0e41, KEY_4 },
  727. { 0x0643, KEY_5 },
  728. { 0x097f, KEY_6 },
  729. { 0x0d7e, KEY_7 },
  730. { 0x057c, KEY_8 },
  731. { 0x0a40, KEY_9 },
  732. { 0x0e4e, KEY_CLEAR },
  733. { 0x047c, KEY_CHANNEL }, /* show channel number */
  734. { 0x0f41, KEY_LAST }, /* recall */
  735. { 0x0342, KEY_MUTE },
  736. { 0x064c, KEY_RESERVED }, /* PIP button*/
  737. { 0x0172, KEY_SHUFFLE }, /* SNAPSHOT */
  738. { 0x0c4e, KEY_PLAYPAUSE }, /* TIMESHIFT */
  739. { 0x0b70, KEY_RECORD },
  740. { 0x037d, KEY_VOLUMEUP },
  741. { 0x017d, KEY_VOLUMEDOWN },
  742. { 0x0242, KEY_CHANNELUP },
  743. { 0x007d, KEY_CHANNELDOWN },
  744. /* Key codes for Nova-TD "credit card" remote control. */
  745. { 0x1d00, KEY_0 },
  746. { 0x1d01, KEY_1 },
  747. { 0x1d02, KEY_2 },
  748. { 0x1d03, KEY_3 },
  749. { 0x1d04, KEY_4 },
  750. { 0x1d05, KEY_5 },
  751. { 0x1d06, KEY_6 },
  752. { 0x1d07, KEY_7 },
  753. { 0x1d08, KEY_8 },
  754. { 0x1d09, KEY_9 },
  755. { 0x1d0a, KEY_TEXT },
  756. { 0x1d0d, KEY_MENU },
  757. { 0x1d0f, KEY_MUTE },
  758. { 0x1d10, KEY_VOLUMEUP },
  759. { 0x1d11, KEY_VOLUMEDOWN },
  760. { 0x1d12, KEY_CHANNEL },
  761. { 0x1d14, KEY_UP },
  762. { 0x1d15, KEY_DOWN },
  763. { 0x1d16, KEY_LEFT },
  764. { 0x1d17, KEY_RIGHT },
  765. { 0x1d1c, KEY_TV },
  766. { 0x1d1e, KEY_NEXT },
  767. { 0x1d1f, KEY_BACK },
  768. { 0x1d20, KEY_CHANNELUP },
  769. { 0x1d21, KEY_CHANNELDOWN },
  770. { 0x1d24, KEY_LAST },
  771. { 0x1d25, KEY_OK },
  772. { 0x1d30, KEY_PAUSE },
  773. { 0x1d32, KEY_REWIND },
  774. { 0x1d34, KEY_FASTFORWARD },
  775. { 0x1d35, KEY_PLAY },
  776. { 0x1d36, KEY_STOP },
  777. { 0x1d37, KEY_RECORD },
  778. { 0x1d3b, KEY_GOTO },
  779. { 0x1d3d, KEY_POWER },
  780. /* Key codes for the Pixelview SBTVD remote (proto NEC) */
  781. { 0x8613, KEY_MUTE },
  782. { 0x8612, KEY_POWER },
  783. { 0x8601, KEY_1 },
  784. { 0x8602, KEY_2 },
  785. { 0x8603, KEY_3 },
  786. { 0x8604, KEY_4 },
  787. { 0x8605, KEY_5 },
  788. { 0x8606, KEY_6 },
  789. { 0x8607, KEY_7 },
  790. { 0x8608, KEY_8 },
  791. { 0x8609, KEY_9 },
  792. { 0x8600, KEY_0 },
  793. { 0x860d, KEY_CHANNELUP },
  794. { 0x8619, KEY_CHANNELDOWN },
  795. { 0x8610, KEY_VOLUMEUP },
  796. { 0x860c, KEY_VOLUMEDOWN },
  797. { 0x860a, KEY_CAMERA },
  798. { 0x860b, KEY_ZOOM },
  799. { 0x861b, KEY_BACKSPACE },
  800. { 0x8615, KEY_ENTER },
  801. { 0x861d, KEY_UP },
  802. { 0x861e, KEY_DOWN },
  803. { 0x860e, KEY_LEFT },
  804. { 0x860f, KEY_RIGHT },
  805. { 0x8618, KEY_RECORD },
  806. { 0x861a, KEY_STOP },
  807. /* Key codes for the EvolutePC TVWay+ remote (proto NEC) */
  808. { 0x7a00, KEY_MENU },
  809. { 0x7a01, KEY_RECORD },
  810. { 0x7a02, KEY_PLAY },
  811. { 0x7a03, KEY_STOP },
  812. { 0x7a10, KEY_CHANNELUP },
  813. { 0x7a11, KEY_CHANNELDOWN },
  814. { 0x7a12, KEY_VOLUMEUP },
  815. { 0x7a13, KEY_VOLUMEDOWN },
  816. { 0x7a40, KEY_POWER },
  817. { 0x7a41, KEY_MUTE },
  818. };
  819. /* STK7700P: Hauppauge Nova-T Stick, AVerMedia Volar */
  820. static struct dibx000_agc_config stk7700p_7000m_mt2060_agc_config = {
  821. BAND_UHF | BAND_VHF, // band_caps
  822. /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0,
  823. * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */
  824. (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), // setup
  825. 712, // inv_gain
  826. 41, // time_stabiliz
  827. 0, // alpha_level
  828. 118, // thlock
  829. 0, // wbd_inv
  830. 4095, // wbd_ref
  831. 0, // wbd_sel
  832. 0, // wbd_alpha
  833. 42598, // agc1_max
  834. 17694, // agc1_min
  835. 45875, // agc2_max
  836. 2621, // agc2_min
  837. 0, // agc1_pt1
  838. 76, // agc1_pt2
  839. 139, // agc1_pt3
  840. 52, // agc1_slope1
  841. 59, // agc1_slope2
  842. 107, // agc2_pt1
  843. 172, // agc2_pt2
  844. 57, // agc2_slope1
  845. 70, // agc2_slope2
  846. 21, // alpha_mant
  847. 25, // alpha_exp
  848. 28, // beta_mant
  849. 48, // beta_exp
  850. 1, // perform_agc_softsplit
  851. { 0, // split_min
  852. 107, // split_max
  853. 51800, // global_split_min
  854. 24700 // global_split_max
  855. },
  856. };
  857. static struct dibx000_agc_config stk7700p_7000p_mt2060_agc_config = {
  858. BAND_UHF | BAND_VHF,
  859. /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0,
  860. * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */
  861. (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), // setup
  862. 712, // inv_gain
  863. 41, // time_stabiliz
  864. 0, // alpha_level
  865. 118, // thlock
  866. 0, // wbd_inv
  867. 4095, // wbd_ref
  868. 0, // wbd_sel
  869. 0, // wbd_alpha
  870. 42598, // agc1_max
  871. 16384, // agc1_min
  872. 42598, // agc2_max
  873. 0, // agc2_min
  874. 0, // agc1_pt1
  875. 137, // agc1_pt2
  876. 255, // agc1_pt3
  877. 0, // agc1_slope1
  878. 255, // agc1_slope2
  879. 0, // agc2_pt1
  880. 0, // agc2_pt2
  881. 0, // agc2_slope1
  882. 41, // agc2_slope2
  883. 15, // alpha_mant
  884. 25, // alpha_exp
  885. 28, // beta_mant
  886. 48, // beta_exp
  887. 0, // perform_agc_softsplit
  888. };
  889. static struct dibx000_bandwidth_config stk7700p_pll_config = {
  890. 60000, 30000, // internal, sampling
  891. 1, 8, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass
  892. 0, 0, 1, 1, 0, // misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, modulo
  893. (3 << 14) | (1 << 12) | (524 << 0), // sad_cfg: refsel, sel, freq_15k
  894. 60258167, // ifreq
  895. 20452225, // timf
  896. 30000000, // xtal
  897. };
  898. static struct dib7000m_config stk7700p_dib7000m_config = {
  899. .dvbt_mode = 1,
  900. .output_mpeg2_in_188_bytes = 1,
  901. .quartz_direct = 1,
  902. .agc_config_count = 1,
  903. .agc = &stk7700p_7000m_mt2060_agc_config,
  904. .bw = &stk7700p_pll_config,
  905. .gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS,
  906. .gpio_val = DIB7000M_GPIO_DEFAULT_VALUES,
  907. .gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS,
  908. };
  909. static struct dib7000p_config stk7700p_dib7000p_config = {
  910. .output_mpeg2_in_188_bytes = 1,
  911. .agc_config_count = 1,
  912. .agc = &stk7700p_7000p_mt2060_agc_config,
  913. .bw = &stk7700p_pll_config,
  914. .gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS,
  915. .gpio_val = DIB7000M_GPIO_DEFAULT_VALUES,
  916. .gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS,
  917. };
  918. static int stk7700p_frontend_attach(struct dvb_usb_adapter *adap)
  919. {
  920. struct dib0700_state *st = adap->dev->priv;
  921. /* unless there is no real power management in DVB - we leave the device on GPIO6 */
  922. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
  923. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(50);
  924. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); msleep(10);
  925. dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
  926. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); msleep(10);
  927. dib0700_ctrl_clock(adap->dev, 72, 1);
  928. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); msleep(100);
  929. dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
  930. st->mt2060_if1[0] = 1220;
  931. if (dib7000pc_detection(&adap->dev->i2c_adap)) {
  932. adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000p_config);
  933. st->is_dib7000pc = 1;
  934. } else
  935. adap->fe = dvb_attach(dib7000m_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000m_config);
  936. return adap->fe == NULL ? -ENODEV : 0;
  937. }
  938. static struct mt2060_config stk7700p_mt2060_config = {
  939. 0x60
  940. };
  941. static int stk7700p_tuner_attach(struct dvb_usb_adapter *adap)
  942. {
  943. struct i2c_adapter *prim_i2c = &adap->dev->i2c_adap;
  944. struct dib0700_state *st = adap->dev->priv;
  945. struct i2c_adapter *tun_i2c;
  946. s8 a;
  947. int if1=1220;
  948. if (adap->dev->udev->descriptor.idVendor == cpu_to_le16(USB_VID_HAUPPAUGE) &&
  949. adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_STICK)) {
  950. if (!eeprom_read(prim_i2c,0x58,&a)) if1=1220+a;
  951. }
  952. if (st->is_dib7000pc)
  953. tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
  954. else
  955. tun_i2c = dib7000m_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
  956. return dvb_attach(mt2060_attach, adap->fe, tun_i2c, &stk7700p_mt2060_config,
  957. if1) == NULL ? -ENODEV : 0;
  958. }
  959. /* DIB7070 generic */
  960. static struct dibx000_agc_config dib7070_agc_config = {
  961. BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND,
  962. /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0,
  963. * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */
  964. (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0), // setup
  965. 600, // inv_gain
  966. 10, // time_stabiliz
  967. 0, // alpha_level
  968. 118, // thlock
  969. 0, // wbd_inv
  970. 3530, // wbd_ref
  971. 1, // wbd_sel
  972. 5, // wbd_alpha
  973. 65535, // agc1_max
  974. 0, // agc1_min
  975. 65535, // agc2_max
  976. 0, // agc2_min
  977. 0, // agc1_pt1
  978. 40, // agc1_pt2
  979. 183, // agc1_pt3
  980. 206, // agc1_slope1
  981. 255, // agc1_slope2
  982. 72, // agc2_pt1
  983. 152, // agc2_pt2
  984. 88, // agc2_slope1
  985. 90, // agc2_slope2
  986. 17, // alpha_mant
  987. 27, // alpha_exp
  988. 23, // beta_mant
  989. 51, // beta_exp
  990. 0, // perform_agc_softsplit
  991. };
  992. static int dib7070_tuner_reset(struct dvb_frontend *fe, int onoff)
  993. {
  994. deb_info("reset: %d", onoff);
  995. return dib7000p_set_gpio(fe, 8, 0, !onoff);
  996. }
  997. static int dib7070_tuner_sleep(struct dvb_frontend *fe, int onoff)
  998. {
  999. deb_info("sleep: %d", onoff);
  1000. return dib7000p_set_gpio(fe, 9, 0, onoff);
  1001. }
  1002. static struct dib0070_config dib7070p_dib0070_config[2] = {
  1003. {
  1004. .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
  1005. .reset = dib7070_tuner_reset,
  1006. .sleep = dib7070_tuner_sleep,
  1007. .clock_khz = 12000,
  1008. .clock_pad_drive = 4,
  1009. .charge_pump = 2,
  1010. }, {
  1011. .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
  1012. .reset = dib7070_tuner_reset,
  1013. .sleep = dib7070_tuner_sleep,
  1014. .clock_khz = 12000,
  1015. .charge_pump = 2,
  1016. }
  1017. };
  1018. static struct dib0070_config dib7770p_dib0070_config = {
  1019. .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
  1020. .reset = dib7070_tuner_reset,
  1021. .sleep = dib7070_tuner_sleep,
  1022. .clock_khz = 12000,
  1023. .clock_pad_drive = 0,
  1024. .flip_chip = 1,
  1025. .charge_pump = 2,
  1026. };
  1027. static int dib7070_set_param_override(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep)
  1028. {
  1029. struct dvb_usb_adapter *adap = fe->dvb->priv;
  1030. struct dib0700_adapter_state *state = adap->priv;
  1031. u16 offset;
  1032. u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
  1033. switch (band) {
  1034. case BAND_VHF: offset = 950; break;
  1035. case BAND_UHF:
  1036. default: offset = 550; break;
  1037. }
  1038. deb_info("WBD for DiB7000P: %d\n", offset + dib0070_wbd_offset(fe));
  1039. dib7000p_set_wbd_ref(fe, offset + dib0070_wbd_offset(fe));
  1040. return state->set_param_save(fe, fep);
  1041. }
  1042. static int dib7770_set_param_override(struct dvb_frontend *fe,
  1043. struct dvb_frontend_parameters *fep)
  1044. {
  1045. struct dvb_usb_adapter *adap = fe->dvb->priv;
  1046. struct dib0700_adapter_state *state = adap->priv;
  1047. u16 offset;
  1048. u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
  1049. switch (band) {
  1050. case BAND_VHF:
  1051. dib7000p_set_gpio(fe, 0, 0, 1);
  1052. offset = 850;
  1053. break;
  1054. case BAND_UHF:
  1055. default:
  1056. dib7000p_set_gpio(fe, 0, 0, 0);
  1057. offset = 250;
  1058. break;
  1059. }
  1060. deb_info("WBD for DiB7000P: %d\n", offset + dib0070_wbd_offset(fe));
  1061. dib7000p_set_wbd_ref(fe, offset + dib0070_wbd_offset(fe));
  1062. return state->set_param_save(fe, fep);
  1063. }
  1064. static int dib7770p_tuner_attach(struct dvb_usb_adapter *adap)
  1065. {
  1066. struct dib0700_adapter_state *st = adap->priv;
  1067. struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe,
  1068. DIBX000_I2C_INTERFACE_TUNER, 1);
  1069. if (dvb_attach(dib0070_attach, adap->fe, tun_i2c,
  1070. &dib7770p_dib0070_config) == NULL)
  1071. return -ENODEV;
  1072. st->set_param_save = adap->fe->ops.tuner_ops.set_params;
  1073. adap->fe->ops.tuner_ops.set_params = dib7770_set_param_override;
  1074. return 0;
  1075. }
  1076. static int dib7070p_tuner_attach(struct dvb_usb_adapter *adap)
  1077. {
  1078. struct dib0700_adapter_state *st = adap->priv;
  1079. struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
  1080. if (adap->id == 0) {
  1081. if (dvb_attach(dib0070_attach, adap->fe, tun_i2c, &dib7070p_dib0070_config[0]) == NULL)
  1082. return -ENODEV;
  1083. } else {
  1084. if (dvb_attach(dib0070_attach, adap->fe, tun_i2c, &dib7070p_dib0070_config[1]) == NULL)
  1085. return -ENODEV;
  1086. }
  1087. st->set_param_save = adap->fe->ops.tuner_ops.set_params;
  1088. adap->fe->ops.tuner_ops.set_params = dib7070_set_param_override;
  1089. return 0;
  1090. }
  1091. static int stk70x0p_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
  1092. {
  1093. return dib7000p_pid_filter(adapter->fe, index, pid, onoff);
  1094. }
  1095. static int stk70x0p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
  1096. {
  1097. return dib7000p_pid_filter_ctrl(adapter->fe, onoff);
  1098. }
  1099. static struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = {
  1100. 60000, 15000, // internal, sampling
  1101. 1, 20, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass
  1102. 0, 0, 1, 1, 2, // misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, modulo
  1103. (3 << 14) | (1 << 12) | (524 << 0), // sad_cfg: refsel, sel, freq_15k
  1104. (0 << 25) | 0, // ifreq = 0.000000 MHz
  1105. 20452225, // timf
  1106. 12000000, // xtal_hz
  1107. };
  1108. static struct dib7000p_config dib7070p_dib7000p_config = {
  1109. .output_mpeg2_in_188_bytes = 1,
  1110. .agc_config_count = 1,
  1111. .agc = &dib7070_agc_config,
  1112. .bw = &dib7070_bw_config_12_mhz,
  1113. .tuner_is_baseband = 1,
  1114. .spur_protect = 1,
  1115. .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
  1116. .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
  1117. .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
  1118. .hostbus_diversity = 1,
  1119. };
  1120. /* STK7070P */
  1121. static int stk7070p_frontend_attach(struct dvb_usb_adapter *adap)
  1122. {
  1123. struct usb_device_descriptor *p = &adap->dev->udev->descriptor;
  1124. if (p->idVendor == cpu_to_le16(USB_VID_PINNACLE) &&
  1125. p->idProduct == cpu_to_le16(USB_PID_PINNACLE_PCTV72E))
  1126. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
  1127. else
  1128. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
  1129. msleep(10);
  1130. dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
  1131. dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
  1132. dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
  1133. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
  1134. dib0700_ctrl_clock(adap->dev, 72, 1);
  1135. msleep(10);
  1136. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
  1137. msleep(10);
  1138. dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
  1139. if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
  1140. &dib7070p_dib7000p_config) != 0) {
  1141. err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n",
  1142. __func__);
  1143. return -ENODEV;
  1144. }
  1145. adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
  1146. &dib7070p_dib7000p_config);
  1147. return adap->fe == NULL ? -ENODEV : 0;
  1148. }
  1149. /* DIB807x generic */
  1150. static struct dibx000_agc_config dib807x_agc_config[2] = {
  1151. {
  1152. BAND_VHF,
  1153. /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0,
  1154. * P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0,
  1155. * P_agc_inv_pwm2=0,P_agc_inh_dc_rv_est=0,
  1156. * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5,
  1157. * P_agc_write=0 */
  1158. (0 << 15) | (0 << 14) | (7 << 11) | (0 << 10) | (0 << 9) |
  1159. (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) |
  1160. (0 << 0), /* setup*/
  1161. 600, /* inv_gain*/
  1162. 10, /* time_stabiliz*/
  1163. 0, /* alpha_level*/
  1164. 118, /* thlock*/
  1165. 0, /* wbd_inv*/
  1166. 3530, /* wbd_ref*/
  1167. 1, /* wbd_sel*/
  1168. 5, /* wbd_alpha*/
  1169. 65535, /* agc1_max*/
  1170. 0, /* agc1_min*/
  1171. 65535, /* agc2_max*/
  1172. 0, /* agc2_min*/
  1173. 0, /* agc1_pt1*/
  1174. 40, /* agc1_pt2*/
  1175. 183, /* agc1_pt3*/
  1176. 206, /* agc1_slope1*/
  1177. 255, /* agc1_slope2*/
  1178. 72, /* agc2_pt1*/
  1179. 152, /* agc2_pt2*/
  1180. 88, /* agc2_slope1*/
  1181. 90, /* agc2_slope2*/
  1182. 17, /* alpha_mant*/
  1183. 27, /* alpha_exp*/
  1184. 23, /* beta_mant*/
  1185. 51, /* beta_exp*/
  1186. 0, /* perform_agc_softsplit*/
  1187. }, {
  1188. BAND_UHF,
  1189. /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0,
  1190. * P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0,
  1191. * P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
  1192. * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5,
  1193. * P_agc_write=0 */
  1194. (0 << 15) | (0 << 14) | (1 << 11) | (0 << 10) | (0 << 9) |
  1195. (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) |
  1196. (0 << 0), /* setup */
  1197. 600, /* inv_gain*/
  1198. 10, /* time_stabiliz*/
  1199. 0, /* alpha_level*/
  1200. 118, /* thlock*/
  1201. 0, /* wbd_inv*/
  1202. 3530, /* wbd_ref*/
  1203. 1, /* wbd_sel*/
  1204. 5, /* wbd_alpha*/
  1205. 65535, /* agc1_max*/
  1206. 0, /* agc1_min*/
  1207. 65535, /* agc2_max*/
  1208. 0, /* agc2_min*/
  1209. 0, /* agc1_pt1*/
  1210. 40, /* agc1_pt2*/
  1211. 183, /* agc1_pt3*/
  1212. 206, /* agc1_slope1*/
  1213. 255, /* agc1_slope2*/
  1214. 72, /* agc2_pt1*/
  1215. 152, /* agc2_pt2*/
  1216. 88, /* agc2_slope1*/
  1217. 90, /* agc2_slope2*/
  1218. 17, /* alpha_mant*/
  1219. 27, /* alpha_exp*/
  1220. 23, /* beta_mant*/
  1221. 51, /* beta_exp*/
  1222. 0, /* perform_agc_softsplit*/
  1223. }
  1224. };
  1225. static struct dibx000_bandwidth_config dib807x_bw_config_12_mhz = {
  1226. 60000, 15000, /* internal, sampling*/
  1227. 1, 20, 3, 1, 0, /* pll_cfg: prediv, ratio, range, reset, bypass*/
  1228. 0, 0, 1, 1, 2, /* misc: refdiv, bypclk_div, IO_CLK_en_core,
  1229. ADClkSrc, modulo */
  1230. (3 << 14) | (1 << 12) | (599 << 0), /* sad_cfg: refsel, sel, freq_15k*/
  1231. (0 << 25) | 0, /* ifreq = 0.000000 MHz*/
  1232. 18179755, /* timf*/
  1233. 12000000, /* xtal_hz*/
  1234. };
  1235. static struct dib8000_config dib807x_dib8000_config[2] = {
  1236. {
  1237. .output_mpeg2_in_188_bytes = 1,
  1238. .agc_config_count = 2,
  1239. .agc = dib807x_agc_config,
  1240. .pll = &dib807x_bw_config_12_mhz,
  1241. .tuner_is_baseband = 1,
  1242. .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
  1243. .gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
  1244. .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
  1245. .hostbus_diversity = 1,
  1246. .div_cfg = 1,
  1247. .agc_control = &dib0070_ctrl_agc_filter,
  1248. .output_mode = OUTMODE_MPEG2_FIFO,
  1249. .drives = 0x2d98,
  1250. }, {
  1251. .output_mpeg2_in_188_bytes = 1,
  1252. .agc_config_count = 2,
  1253. .agc = dib807x_agc_config,
  1254. .pll = &dib807x_bw_config_12_mhz,
  1255. .tuner_is_baseband = 1,
  1256. .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
  1257. .gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
  1258. .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
  1259. .hostbus_diversity = 1,
  1260. .agc_control = &dib0070_ctrl_agc_filter,
  1261. .output_mode = OUTMODE_MPEG2_FIFO,
  1262. .drives = 0x2d98,
  1263. }
  1264. };
  1265. static int dib807x_tuner_reset(struct dvb_frontend *fe, int onoff)
  1266. {
  1267. return dib8000_set_gpio(fe, 5, 0, !onoff);
  1268. }
  1269. static int dib807x_tuner_sleep(struct dvb_frontend *fe, int onoff)
  1270. {
  1271. return dib8000_set_gpio(fe, 0, 0, onoff);
  1272. }
  1273. static const struct dib0070_wbd_gain_cfg dib8070_wbd_gain_cfg[] = {
  1274. { 240, 7},
  1275. { 0xffff, 6},
  1276. };
  1277. static struct dib0070_config dib807x_dib0070_config[2] = {
  1278. {
  1279. .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
  1280. .reset = dib807x_tuner_reset,
  1281. .sleep = dib807x_tuner_sleep,
  1282. .clock_khz = 12000,
  1283. .clock_pad_drive = 4,
  1284. .vga_filter = 1,
  1285. .force_crystal_mode = 1,
  1286. .enable_third_order_filter = 1,
  1287. .charge_pump = 0,
  1288. .wbd_gain = dib8070_wbd_gain_cfg,
  1289. .osc_buffer_state = 0,
  1290. .freq_offset_khz_uhf = -100,
  1291. .freq_offset_khz_vhf = -100,
  1292. }, {
  1293. .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
  1294. .reset = dib807x_tuner_reset,
  1295. .sleep = dib807x_tuner_sleep,
  1296. .clock_khz = 12000,
  1297. .clock_pad_drive = 2,
  1298. .vga_filter = 1,
  1299. .force_crystal_mode = 1,
  1300. .enable_third_order_filter = 1,
  1301. .charge_pump = 0,
  1302. .wbd_gain = dib8070_wbd_gain_cfg,
  1303. .osc_buffer_state = 0,
  1304. .freq_offset_khz_uhf = -25,
  1305. .freq_offset_khz_vhf = -25,
  1306. }
  1307. };
  1308. static int dib807x_set_param_override(struct dvb_frontend *fe,
  1309. struct dvb_frontend_parameters *fep)
  1310. {
  1311. struct dvb_usb_adapter *adap = fe->dvb->priv;
  1312. struct dib0700_adapter_state *state = adap->priv;
  1313. u16 offset = dib0070_wbd_offset(fe);
  1314. u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
  1315. switch (band) {
  1316. case BAND_VHF:
  1317. offset += 750;
  1318. break;
  1319. case BAND_UHF: /* fall-thru wanted */
  1320. default:
  1321. offset += 250; break;
  1322. }
  1323. deb_info("WBD for DiB8000: %d\n", offset);
  1324. dib8000_set_wbd_ref(fe, offset);
  1325. return state->set_param_save(fe, fep);
  1326. }
  1327. static int dib807x_tuner_attach(struct dvb_usb_adapter *adap)
  1328. {
  1329. struct dib0700_adapter_state *st = adap->priv;
  1330. struct i2c_adapter *tun_i2c = dib8000_get_i2c_master(adap->fe,
  1331. DIBX000_I2C_INTERFACE_TUNER, 1);
  1332. if (adap->id == 0) {
  1333. if (dvb_attach(dib0070_attach, adap->fe, tun_i2c,
  1334. &dib807x_dib0070_config[0]) == NULL)
  1335. return -ENODEV;
  1336. } else {
  1337. if (dvb_attach(dib0070_attach, adap->fe, tun_i2c,
  1338. &dib807x_dib0070_config[1]) == NULL)
  1339. return -ENODEV;
  1340. }
  1341. st->set_param_save = adap->fe->ops.tuner_ops.set_params;
  1342. adap->fe->ops.tuner_ops.set_params = dib807x_set_param_override;
  1343. return 0;
  1344. }
  1345. static int stk807x_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
  1346. {
  1347. return dib8000_pid_filter(adapter->fe, index, pid, onoff);
  1348. }
  1349. static int stk807x_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
  1350. {
  1351. return dib8000_pid_filter_ctrl(adapter->fe, onoff);
  1352. }
  1353. /* STK807x */
  1354. static int stk807x_frontend_attach(struct dvb_usb_adapter *adap)
  1355. {
  1356. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
  1357. msleep(10);
  1358. dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
  1359. dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
  1360. dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
  1361. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
  1362. dib0700_ctrl_clock(adap->dev, 72, 1);
  1363. msleep(10);
  1364. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
  1365. msleep(10);
  1366. dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
  1367. dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
  1368. 0x80);
  1369. adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80,
  1370. &dib807x_dib8000_config[0]);
  1371. return adap->fe == NULL ? -ENODEV : 0;
  1372. }
  1373. /* STK807xPVR */
  1374. static int stk807xpvr_frontend_attach0(struct dvb_usb_adapter *adap)
  1375. {
  1376. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
  1377. msleep(30);
  1378. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
  1379. msleep(500);
  1380. dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
  1381. dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
  1382. dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
  1383. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
  1384. dib0700_ctrl_clock(adap->dev, 72, 1);
  1385. msleep(10);
  1386. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
  1387. msleep(10);
  1388. dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
  1389. /* initialize IC 0 */
  1390. dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x12, 0x80);
  1391. adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80,
  1392. &dib807x_dib8000_config[0]);
  1393. return adap->fe == NULL ? -ENODEV : 0;
  1394. }
  1395. static int stk807xpvr_frontend_attach1(struct dvb_usb_adapter *adap)
  1396. {
  1397. /* initialize IC 1 */
  1398. dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x22, 0x82);
  1399. adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x82,
  1400. &dib807x_dib8000_config[1]);
  1401. return adap->fe == NULL ? -ENODEV : 0;
  1402. }
  1403. /* STK7070PD */
  1404. static struct dib7000p_config stk7070pd_dib7000p_config[2] = {
  1405. {
  1406. .output_mpeg2_in_188_bytes = 1,
  1407. .agc_config_count = 1,
  1408. .agc = &dib7070_agc_config,
  1409. .bw = &dib7070_bw_config_12_mhz,
  1410. .tuner_is_baseband = 1,
  1411. .spur_protect = 1,
  1412. .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
  1413. .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
  1414. .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
  1415. .hostbus_diversity = 1,
  1416. }, {
  1417. .output_mpeg2_in_188_bytes = 1,
  1418. .agc_config_count = 1,
  1419. .agc = &dib7070_agc_config,
  1420. .bw = &dib7070_bw_config_12_mhz,
  1421. .tuner_is_baseband = 1,
  1422. .spur_protect = 1,
  1423. .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
  1424. .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
  1425. .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
  1426. .hostbus_diversity = 1,
  1427. }
  1428. };
  1429. static int stk7070pd_frontend_attach0(struct dvb_usb_adapter *adap)
  1430. {
  1431. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
  1432. msleep(10);
  1433. dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
  1434. dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
  1435. dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
  1436. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
  1437. dib0700_ctrl_clock(adap->dev, 72, 1);
  1438. msleep(10);
  1439. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
  1440. msleep(10);
  1441. dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
  1442. if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 2, 18,
  1443. stk7070pd_dib7000p_config) != 0) {
  1444. err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n",
  1445. __func__);
  1446. return -ENODEV;
  1447. }
  1448. adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &stk7070pd_dib7000p_config[0]);
  1449. return adap->fe == NULL ? -ENODEV : 0;
  1450. }
  1451. static int stk7070pd_frontend_attach1(struct dvb_usb_adapter *adap)
  1452. {
  1453. adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x82, &stk7070pd_dib7000p_config[1]);
  1454. return adap->fe == NULL ? -ENODEV : 0;
  1455. }
  1456. /* S5H1411 */
  1457. static struct s5h1411_config pinnacle_801e_config = {
  1458. .output_mode = S5H1411_PARALLEL_OUTPUT,
  1459. .gpio = S5H1411_GPIO_OFF,
  1460. .mpeg_timing = S5H1411_MPEGTIMING_NONCONTINOUS_NONINVERTING_CLOCK,
  1461. .qam_if = S5H1411_IF_44000,
  1462. .vsb_if = S5H1411_IF_44000,
  1463. .inversion = S5H1411_INVERSION_OFF,
  1464. .status_mode = S5H1411_DEMODLOCKING
  1465. };
  1466. /* Pinnacle PCTV HD Pro 801e GPIOs map:
  1467. GPIO0 - currently unknown
  1468. GPIO1 - xc5000 tuner reset
  1469. GPIO2 - CX25843 sleep
  1470. GPIO3 - currently unknown
  1471. GPIO4 - currently unknown
  1472. GPIO6 - currently unknown
  1473. GPIO7 - currently unknown
  1474. GPIO9 - currently unknown
  1475. GPIO10 - CX25843 reset
  1476. */
  1477. static int s5h1411_frontend_attach(struct dvb_usb_adapter *adap)
  1478. {
  1479. struct dib0700_state *st = adap->dev->priv;
  1480. /* Make use of the new i2c functions from FW 1.20 */
  1481. st->fw_use_new_i2c_api = 1;
  1482. /* The s5h1411 requires the dib0700 to not be in master mode */
  1483. st->disable_streaming_master_mode = 1;
  1484. /* All msleep values taken from Windows USB trace */
  1485. dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 0);
  1486. dib0700_set_gpio(adap->dev, GPIO3, GPIO_OUT, 0);
  1487. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
  1488. msleep(400);
  1489. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
  1490. msleep(60);
  1491. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
  1492. msleep(30);
  1493. dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
  1494. dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
  1495. dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
  1496. dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
  1497. dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 0);
  1498. msleep(30);
  1499. /* Put the CX25843 to sleep for now since we're in digital mode */
  1500. dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 1);
  1501. /* GPIOs are initialized, do the attach */
  1502. adap->fe = dvb_attach(s5h1411_attach, &pinnacle_801e_config,
  1503. &adap->dev->i2c_adap);
  1504. return adap->fe == NULL ? -ENODEV : 0;
  1505. }
  1506. static int dib0700_xc5000_tuner_callback(void *priv, int component,
  1507. int command, int arg)
  1508. {
  1509. struct dvb_usb_adapter *adap = priv;
  1510. if (command == XC5000_TUNER_RESET) {
  1511. /* Reset the tuner */
  1512. dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 0);
  1513. msleep(10);
  1514. dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 1);
  1515. msleep(10);
  1516. } else {
  1517. err("xc5000: unknown tuner callback command: %d\n", command);
  1518. return -EINVAL;
  1519. }
  1520. return 0;
  1521. }
  1522. static struct xc5000_config s5h1411_xc5000_tunerconfig = {
  1523. .i2c_address = 0x64,
  1524. .if_khz = 5380,
  1525. };
  1526. static int xc5000_tuner_attach(struct dvb_usb_adapter *adap)
  1527. {
  1528. /* FIXME: generalize & move to common area */
  1529. adap->fe->callback = dib0700_xc5000_tuner_callback;
  1530. return dvb_attach(xc5000_attach, adap->fe, &adap->dev->i2c_adap,
  1531. &s5h1411_xc5000_tunerconfig)
  1532. == NULL ? -ENODEV : 0;
  1533. }
  1534. static struct lgdt3305_config hcw_lgdt3305_config = {
  1535. .i2c_addr = 0x0e,
  1536. .mpeg_mode = LGDT3305_MPEG_PARALLEL,
  1537. .tpclk_edge = LGDT3305_TPCLK_FALLING_EDGE,
  1538. .tpvalid_polarity = LGDT3305_TP_VALID_LOW,
  1539. .deny_i2c_rptr = 0,
  1540. .spectral_inversion = 1,
  1541. .qam_if_khz = 6000,
  1542. .vsb_if_khz = 6000,
  1543. .usref_8vsb = 0x0500,
  1544. };
  1545. static struct mxl5007t_config hcw_mxl5007t_config = {
  1546. .xtal_freq_hz = MxL_XTAL_25_MHZ,
  1547. .if_freq_hz = MxL_IF_6_MHZ,
  1548. .invert_if = 1,
  1549. };
  1550. /* TIGER-ATSC map:
  1551. GPIO0 - LNA_CTR (H: LNA power enabled, L: LNA power disabled)
  1552. GPIO1 - ANT_SEL (H: VPA, L: MCX)
  1553. GPIO4 - SCL2
  1554. GPIO6 - EN_TUNER
  1555. GPIO7 - SDA2
  1556. GPIO10 - DEM_RST
  1557. MXL is behind LG's i2c repeater. LG is on SCL2/SDA2 gpios on the DIB
  1558. */
  1559. static int lgdt3305_frontend_attach(struct dvb_usb_adapter *adap)
  1560. {
  1561. struct dib0700_state *st = adap->dev->priv;
  1562. /* Make use of the new i2c functions from FW 1.20 */
  1563. st->fw_use_new_i2c_api = 1;
  1564. st->disable_streaming_master_mode = 1;
  1565. /* fe power enable */
  1566. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
  1567. msleep(30);
  1568. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
  1569. msleep(30);
  1570. /* demod reset */
  1571. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
  1572. msleep(30);
  1573. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
  1574. msleep(30);
  1575. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
  1576. msleep(30);
  1577. adap->fe = dvb_attach(lgdt3305_attach,
  1578. &hcw_lgdt3305_config,
  1579. &adap->dev->i2c_adap);
  1580. return adap->fe == NULL ? -ENODEV : 0;
  1581. }
  1582. static int mxl5007t_tuner_attach(struct dvb_usb_adapter *adap)
  1583. {
  1584. return dvb_attach(mxl5007t_attach, adap->fe,
  1585. &adap->dev->i2c_adap, 0x60,
  1586. &hcw_mxl5007t_config) == NULL ? -ENODEV : 0;
  1587. }
  1588. /* DVB-USB and USB stuff follows */
  1589. struct usb_device_id dib0700_usb_id_table[] = {
  1590. /* 0 */ { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P) },
  1591. { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P_PC) },
  1592. { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500) },
  1593. { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_2) },
  1594. { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK) },
  1595. /* 5 */ { USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR) },
  1596. { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500) },
  1597. { USB_DEVICE(USB_VID_UNIWILL, USB_PID_UNIWILL_STK7700P) },
  1598. { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_STK7700P) },
  1599. { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_2) },
  1600. /* 10 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_2) },
  1601. { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV2000E) },
  1602. { USB_DEVICE(USB_VID_TERRATEC,
  1603. USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY) },
  1604. { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK) },
  1605. { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700D) },
  1606. /* 15 */{ USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7070P) },
  1607. { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV_DVB_T_FLASH) },
  1608. { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7070PD) },
  1609. { USB_DEVICE(USB_VID_PINNACLE,
  1610. USB_PID_PINNACLE_PCTV_DUAL_DIVERSITY_DVB_T) },
  1611. { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500_PC) },
  1612. /* 20 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_EXPRESS) },
  1613. { USB_DEVICE(USB_VID_GIGABYTE, USB_PID_GIGABYTE_U7000) },
  1614. { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ARTEC_T14BR) },
  1615. { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3000) },
  1616. { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3100) },
  1617. /* 25 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_3) },
  1618. { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_MYTV_T) },
  1619. { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_HT_USB_XE) },
  1620. { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_EXPRESSCARD_320CX) },
  1621. { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV72E) },
  1622. /* 30 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73E) },
  1623. { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_EC372S) },
  1624. { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_HT_EXPRESS) },
  1625. { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_XXS) },
  1626. { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_STK7700P_2) },
  1627. /* 35 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK_52009) },
  1628. { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_3) },
  1629. { USB_DEVICE(USB_VID_GIGABYTE, USB_PID_GIGABYTE_U8000) },
  1630. { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700PH) },
  1631. { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3000H) },
  1632. /* 40 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV801E) },
  1633. { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV801E_SE) },
  1634. { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_EXPRESS) },
  1635. { USB_DEVICE(USB_VID_TERRATEC,
  1636. USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY_2) },
  1637. { USB_DEVICE(USB_VID_SONY, USB_PID_SONY_PLAYTV) },
  1638. /* 45 */{ USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_PD378S) },
  1639. { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC) },
  1640. { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC_B210) },
  1641. { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_MC770) },
  1642. { USB_DEVICE(USB_VID_ELGATO, USB_PID_ELGATO_EYETV_DTT) },
  1643. /* 50 */{ USB_DEVICE(USB_VID_ELGATO, USB_PID_ELGATO_EYETV_DTT_Dlx) },
  1644. { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_H) },
  1645. { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_T3) },
  1646. { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_T5) },
  1647. { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700D) },
  1648. /* 55 */{ USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700D_2) },
  1649. { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73A) },
  1650. { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73ESE) },
  1651. { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV282E) },
  1652. { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7770P) },
  1653. /* 60 */{ USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_XXS_2) },
  1654. { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XPVR) },
  1655. { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XP) },
  1656. { USB_DEVICE(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD) },
  1657. { USB_DEVICE(USB_VID_EVOLUTEPC, USB_PID_TVWAY_PLUS) },
  1658. { 0 } /* Terminating entry */
  1659. };
  1660. MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table);
  1661. #define DIB0700_DEFAULT_DEVICE_PROPERTIES \
  1662. .caps = DVB_USB_IS_AN_I2C_ADAPTER, \
  1663. .usb_ctrl = DEVICE_SPECIFIC, \
  1664. .firmware = "dvb-usb-dib0700-1.20.fw", \
  1665. .download_firmware = dib0700_download_firmware, \
  1666. .no_reconnect = 1, \
  1667. .size_of_priv = sizeof(struct dib0700_state), \
  1668. .i2c_algo = &dib0700_i2c_algo, \
  1669. .identify_state = dib0700_identify_state
  1670. #define DIB0700_DEFAULT_STREAMING_CONFIG(ep) \
  1671. .streaming_ctrl = dib0700_streaming_ctrl, \
  1672. .stream = { \
  1673. .type = USB_BULK, \
  1674. .count = 4, \
  1675. .endpoint = ep, \
  1676. .u = { \
  1677. .bulk = { \
  1678. .buffersize = 39480, \
  1679. } \
  1680. } \
  1681. }
  1682. struct dvb_usb_device_properties dib0700_devices[] = {
  1683. {
  1684. DIB0700_DEFAULT_DEVICE_PROPERTIES,
  1685. .num_adapters = 1,
  1686. .adapter = {
  1687. {
  1688. .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
  1689. .pid_filter_count = 32,
  1690. .pid_filter = stk70x0p_pid_filter,
  1691. .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
  1692. .frontend_attach = stk7700p_frontend_attach,
  1693. .tuner_attach = stk7700p_tuner_attach,
  1694. DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
  1695. },
  1696. },
  1697. .num_device_descs = 8,
  1698. .devices = {
  1699. { "DiBcom STK7700P reference design",
  1700. { &dib0700_usb_id_table[0], &dib0700_usb_id_table[1] },
  1701. { NULL },
  1702. },
  1703. { "Hauppauge Nova-T Stick",
  1704. { &dib0700_usb_id_table[4], &dib0700_usb_id_table[9], NULL },
  1705. { NULL },
  1706. },
  1707. { "AVerMedia AVerTV DVB-T Volar",
  1708. { &dib0700_usb_id_table[5], &dib0700_usb_id_table[10] },
  1709. { NULL },
  1710. },
  1711. { "Compro Videomate U500",
  1712. { &dib0700_usb_id_table[6], &dib0700_usb_id_table[19] },
  1713. { NULL },
  1714. },
  1715. { "Uniwill STK7700P based (Hama and others)",
  1716. { &dib0700_usb_id_table[7], NULL },
  1717. { NULL },
  1718. },
  1719. { "Leadtek Winfast DTV Dongle (STK7700P based)",
  1720. { &dib0700_usb_id_table[8], &dib0700_usb_id_table[34] },
  1721. { NULL },
  1722. },
  1723. { "AVerMedia AVerTV DVB-T Express",
  1724. { &dib0700_usb_id_table[20] },
  1725. { NULL },
  1726. },
  1727. { "Gigabyte U7000",
  1728. { &dib0700_usb_id_table[21], NULL },
  1729. { NULL },
  1730. }
  1731. },
  1732. .rc_interval = DEFAULT_RC_INTERVAL,
  1733. .rc_key_map = dib0700_rc_keys,
  1734. .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
  1735. .rc_query = dib0700_rc_query
  1736. }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
  1737. .num_adapters = 2,
  1738. .adapter = {
  1739. {
  1740. .frontend_attach = bristol_frontend_attach,
  1741. .tuner_attach = bristol_tuner_attach,
  1742. DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
  1743. }, {
  1744. .frontend_attach = bristol_frontend_attach,
  1745. .tuner_attach = bristol_tuner_attach,
  1746. DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
  1747. }
  1748. },
  1749. .num_device_descs = 1,
  1750. .devices = {
  1751. { "Hauppauge Nova-T 500 Dual DVB-T",
  1752. { &dib0700_usb_id_table[2], &dib0700_usb_id_table[3], NULL },
  1753. { NULL },
  1754. },
  1755. },
  1756. .rc_interval = DEFAULT_RC_INTERVAL,
  1757. .rc_key_map = dib0700_rc_keys,
  1758. .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
  1759. .rc_query = dib0700_rc_query
  1760. }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
  1761. .num_adapters = 2,
  1762. .adapter = {
  1763. {
  1764. .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
  1765. .pid_filter_count = 32,
  1766. .pid_filter = stk70x0p_pid_filter,
  1767. .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
  1768. .frontend_attach = stk7700d_frontend_attach,
  1769. .tuner_attach = stk7700d_tuner_attach,
  1770. DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
  1771. }, {
  1772. .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
  1773. .pid_filter_count = 32,
  1774. .pid_filter = stk70x0p_pid_filter,
  1775. .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
  1776. .frontend_attach = stk7700d_frontend_attach,
  1777. .tuner_attach = stk7700d_tuner_attach,
  1778. DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
  1779. }
  1780. },
  1781. .num_device_descs = 5,
  1782. .devices = {
  1783. { "Pinnacle PCTV 2000e",
  1784. { &dib0700_usb_id_table[11], NULL },
  1785. { NULL },
  1786. },
  1787. { "Terratec Cinergy DT XS Diversity",
  1788. { &dib0700_usb_id_table[12], NULL },
  1789. { NULL },
  1790. },
  1791. { "Hauppauge Nova-TD Stick/Elgato Eye-TV Diversity",
  1792. { &dib0700_usb_id_table[13], NULL },
  1793. { NULL },
  1794. },
  1795. { "DiBcom STK7700D reference design",
  1796. { &dib0700_usb_id_table[14], NULL },
  1797. { NULL },
  1798. },
  1799. { "YUAN High-Tech DiBcom STK7700D",
  1800. { &dib0700_usb_id_table[55], NULL },
  1801. { NULL },
  1802. },
  1803. },
  1804. .rc_interval = DEFAULT_RC_INTERVAL,
  1805. .rc_key_map = dib0700_rc_keys,
  1806. .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
  1807. .rc_query = dib0700_rc_query
  1808. }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
  1809. .num_adapters = 1,
  1810. .adapter = {
  1811. {
  1812. .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
  1813. .pid_filter_count = 32,
  1814. .pid_filter = stk70x0p_pid_filter,
  1815. .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
  1816. .frontend_attach = stk7700P2_frontend_attach,
  1817. .tuner_attach = stk7700d_tuner_attach,
  1818. DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
  1819. },
  1820. },
  1821. .num_device_descs = 3,
  1822. .devices = {
  1823. { "ASUS My Cinema U3000 Mini DVBT Tuner",
  1824. { &dib0700_usb_id_table[23], NULL },
  1825. { NULL },
  1826. },
  1827. { "Yuan EC372S",
  1828. { &dib0700_usb_id_table[31], NULL },
  1829. { NULL },
  1830. },
  1831. { "Terratec Cinergy T Express",
  1832. { &dib0700_usb_id_table[42], NULL },
  1833. { NULL },
  1834. }
  1835. },
  1836. .rc_interval = DEFAULT_RC_INTERVAL,
  1837. .rc_key_map = dib0700_rc_keys,
  1838. .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
  1839. .rc_query = dib0700_rc_query
  1840. }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
  1841. .num_adapters = 1,
  1842. .adapter = {
  1843. {
  1844. .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
  1845. .pid_filter_count = 32,
  1846. .pid_filter = stk70x0p_pid_filter,
  1847. .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
  1848. .frontend_attach = stk7070p_frontend_attach,
  1849. .tuner_attach = dib7070p_tuner_attach,
  1850. DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
  1851. .size_of_priv = sizeof(struct dib0700_adapter_state),
  1852. },
  1853. },
  1854. .num_device_descs = 11,
  1855. .devices = {
  1856. { "DiBcom STK7070P reference design",
  1857. { &dib0700_usb_id_table[15], NULL },
  1858. { NULL },
  1859. },
  1860. { "Pinnacle PCTV DVB-T Flash Stick",
  1861. { &dib0700_usb_id_table[16], NULL },
  1862. { NULL },
  1863. },
  1864. { "Artec T14BR DVB-T",
  1865. { &dib0700_usb_id_table[22], NULL },
  1866. { NULL },
  1867. },
  1868. { "ASUS My Cinema U3100 Mini DVBT Tuner",
  1869. { &dib0700_usb_id_table[24], NULL },
  1870. { NULL },
  1871. },
  1872. { "Hauppauge Nova-T Stick",
  1873. { &dib0700_usb_id_table[25], NULL },
  1874. { NULL },
  1875. },
  1876. { "Hauppauge Nova-T MyTV.t",
  1877. { &dib0700_usb_id_table[26], NULL },
  1878. { NULL },
  1879. },
  1880. { "Pinnacle PCTV 72e",
  1881. { &dib0700_usb_id_table[29], NULL },
  1882. { NULL },
  1883. },
  1884. { "Pinnacle PCTV 73e",
  1885. { &dib0700_usb_id_table[30], NULL },
  1886. { NULL },
  1887. },
  1888. { "Elgato EyeTV DTT",
  1889. { &dib0700_usb_id_table[49], NULL },
  1890. { NULL },
  1891. },
  1892. { "Yuan PD378S",
  1893. { &dib0700_usb_id_table[45], NULL },
  1894. { NULL },
  1895. },
  1896. { "Elgato EyeTV Dtt Dlx PD378S",
  1897. { &dib0700_usb_id_table[50], NULL },
  1898. { NULL },
  1899. },
  1900. },
  1901. .rc_interval = DEFAULT_RC_INTERVAL,
  1902. .rc_key_map = dib0700_rc_keys,
  1903. .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
  1904. .rc_query = dib0700_rc_query
  1905. }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
  1906. .num_adapters = 1,
  1907. .adapter = {
  1908. {
  1909. .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
  1910. .pid_filter_count = 32,
  1911. .pid_filter = stk70x0p_pid_filter,
  1912. .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
  1913. .frontend_attach = stk7070p_frontend_attach,
  1914. .tuner_attach = dib7070p_tuner_attach,
  1915. DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
  1916. .size_of_priv = sizeof(struct dib0700_adapter_state),
  1917. },
  1918. },
  1919. .num_device_descs = 3,
  1920. .devices = {
  1921. { "Pinnacle PCTV 73A",
  1922. { &dib0700_usb_id_table[56], NULL },
  1923. { NULL },
  1924. },
  1925. { "Pinnacle PCTV 73e SE",
  1926. { &dib0700_usb_id_table[57], NULL },
  1927. { NULL },
  1928. },
  1929. { "Pinnacle PCTV 282e",
  1930. { &dib0700_usb_id_table[58], NULL },
  1931. { NULL },
  1932. },
  1933. },
  1934. .rc_interval = DEFAULT_RC_INTERVAL,
  1935. .rc_key_map = dib0700_rc_keys,
  1936. .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
  1937. .rc_query = dib0700_rc_query
  1938. }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
  1939. .num_adapters = 2,
  1940. .adapter = {
  1941. {
  1942. .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
  1943. .pid_filter_count = 32,
  1944. .pid_filter = stk70x0p_pid_filter,
  1945. .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
  1946. .frontend_attach = stk7070pd_frontend_attach0,
  1947. .tuner_attach = dib7070p_tuner_attach,
  1948. DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
  1949. .size_of_priv = sizeof(struct dib0700_adapter_state),
  1950. }, {
  1951. .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
  1952. .pid_filter_count = 32,
  1953. .pid_filter = stk70x0p_pid_filter,
  1954. .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
  1955. .frontend_attach = stk7070pd_frontend_attach1,
  1956. .tuner_attach = dib7070p_tuner_attach,
  1957. DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
  1958. .size_of_priv = sizeof(struct dib0700_adapter_state),
  1959. }
  1960. },
  1961. .num_device_descs = 6,
  1962. .devices = {
  1963. { "DiBcom STK7070PD reference design",
  1964. { &dib0700_usb_id_table[17], NULL },
  1965. { NULL },
  1966. },
  1967. { "Pinnacle PCTV Dual DVB-T Diversity Stick",
  1968. { &dib0700_usb_id_table[18], NULL },
  1969. { NULL },
  1970. },
  1971. { "Hauppauge Nova-TD Stick (52009)",
  1972. { &dib0700_usb_id_table[35], NULL },
  1973. { NULL },
  1974. },
  1975. { "Hauppauge Nova-TD-500 (84xxx)",
  1976. { &dib0700_usb_id_table[36], NULL },
  1977. { NULL },
  1978. },
  1979. { "Terratec Cinergy DT USB XS Diversity/ T5",
  1980. { &dib0700_usb_id_table[43],
  1981. &dib0700_usb_id_table[53], NULL},
  1982. { NULL },
  1983. },
  1984. { "Sony PlayTV",
  1985. { &dib0700_usb_id_table[44], NULL },
  1986. { NULL },
  1987. }
  1988. },
  1989. .rc_interval = DEFAULT_RC_INTERVAL,
  1990. .rc_key_map = dib0700_rc_keys,
  1991. .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
  1992. .rc_query = dib0700_rc_query
  1993. }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
  1994. .num_adapters = 1,
  1995. .adapter = {
  1996. {
  1997. .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
  1998. .pid_filter_count = 32,
  1999. .pid_filter = stk70x0p_pid_filter,
  2000. .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
  2001. .frontend_attach = stk7700ph_frontend_attach,
  2002. .tuner_attach = stk7700ph_tuner_attach,
  2003. DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
  2004. .size_of_priv = sizeof(struct
  2005. dib0700_adapter_state),
  2006. },
  2007. },
  2008. .num_device_descs = 9,
  2009. .devices = {
  2010. { "Terratec Cinergy HT USB XE",
  2011. { &dib0700_usb_id_table[27], NULL },
  2012. { NULL },
  2013. },
  2014. { "Pinnacle Expresscard 320cx",
  2015. { &dib0700_usb_id_table[28], NULL },
  2016. { NULL },
  2017. },
  2018. { "Terratec Cinergy HT Express",
  2019. { &dib0700_usb_id_table[32], NULL },
  2020. { NULL },
  2021. },
  2022. { "Gigabyte U8000-RH",
  2023. { &dib0700_usb_id_table[37], NULL },
  2024. { NULL },
  2025. },
  2026. { "YUAN High-Tech STK7700PH",
  2027. { &dib0700_usb_id_table[38], NULL },
  2028. { NULL },
  2029. },
  2030. { "Asus My Cinema-U3000Hybrid",
  2031. { &dib0700_usb_id_table[39], NULL },
  2032. { NULL },
  2033. },
  2034. { "YUAN High-Tech MC770",
  2035. { &dib0700_usb_id_table[48], NULL },
  2036. { NULL },
  2037. },
  2038. { "Leadtek WinFast DTV Dongle H",
  2039. { &dib0700_usb_id_table[51], NULL },
  2040. { NULL },
  2041. },
  2042. { "YUAN High-Tech STK7700D",
  2043. { &dib0700_usb_id_table[54], NULL },
  2044. { NULL },
  2045. },
  2046. },
  2047. .rc_interval = DEFAULT_RC_INTERVAL,
  2048. .rc_key_map = dib0700_rc_keys,
  2049. .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
  2050. .rc_query = dib0700_rc_query
  2051. }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
  2052. .num_adapters = 1,
  2053. .adapter = {
  2054. {
  2055. .frontend_attach = s5h1411_frontend_attach,
  2056. .tuner_attach = xc5000_tuner_attach,
  2057. DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
  2058. .size_of_priv = sizeof(struct
  2059. dib0700_adapter_state),
  2060. },
  2061. },
  2062. .num_device_descs = 2,
  2063. .devices = {
  2064. { "Pinnacle PCTV HD Pro USB Stick",
  2065. { &dib0700_usb_id_table[40], NULL },
  2066. { NULL },
  2067. },
  2068. { "Pinnacle PCTV HD USB Stick",
  2069. { &dib0700_usb_id_table[41], NULL },
  2070. { NULL },
  2071. },
  2072. },
  2073. .rc_interval = DEFAULT_RC_INTERVAL,
  2074. .rc_key_map = dib0700_rc_keys,
  2075. .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
  2076. .rc_query = dib0700_rc_query
  2077. }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
  2078. .num_adapters = 1,
  2079. .adapter = {
  2080. {
  2081. .frontend_attach = lgdt3305_frontend_attach,
  2082. .tuner_attach = mxl5007t_tuner_attach,
  2083. DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
  2084. .size_of_priv = sizeof(struct
  2085. dib0700_adapter_state),
  2086. },
  2087. },
  2088. .num_device_descs = 2,
  2089. .devices = {
  2090. { "Hauppauge ATSC MiniCard (B200)",
  2091. { &dib0700_usb_id_table[46], NULL },
  2092. { NULL },
  2093. },
  2094. { "Hauppauge ATSC MiniCard (B210)",
  2095. { &dib0700_usb_id_table[47], NULL },
  2096. { NULL },
  2097. },
  2098. },
  2099. }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
  2100. .num_adapters = 1,
  2101. .adapter = {
  2102. {
  2103. .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
  2104. .pid_filter_count = 32,
  2105. .pid_filter = stk70x0p_pid_filter,
  2106. .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
  2107. .frontend_attach = stk7070p_frontend_attach,
  2108. .tuner_attach = dib7770p_tuner_attach,
  2109. DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
  2110. .size_of_priv =
  2111. sizeof(struct dib0700_adapter_state),
  2112. },
  2113. },
  2114. .num_device_descs = 2,
  2115. .devices = {
  2116. { "DiBcom STK7770P reference design",
  2117. { &dib0700_usb_id_table[59], NULL },
  2118. { NULL },
  2119. },
  2120. { "Terratec Cinergy T USB XXS (HD)/ T3",
  2121. { &dib0700_usb_id_table[33],
  2122. &dib0700_usb_id_table[52],
  2123. &dib0700_usb_id_table[60], NULL},
  2124. { NULL },
  2125. },
  2126. },
  2127. .rc_interval = DEFAULT_RC_INTERVAL,
  2128. .rc_key_map = dib0700_rc_keys,
  2129. .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
  2130. .rc_query = dib0700_rc_query
  2131. }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
  2132. .num_adapters = 1,
  2133. .adapter = {
  2134. {
  2135. .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
  2136. .pid_filter_count = 32,
  2137. .pid_filter = stk807x_pid_filter,
  2138. .pid_filter_ctrl = stk807x_pid_filter_ctrl,
  2139. .frontend_attach = stk807x_frontend_attach,
  2140. .tuner_attach = dib807x_tuner_attach,
  2141. DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
  2142. .size_of_priv =
  2143. sizeof(struct dib0700_adapter_state),
  2144. },
  2145. },
  2146. .num_device_descs = 3,
  2147. .devices = {
  2148. { "DiBcom STK807xP reference design",
  2149. { &dib0700_usb_id_table[62], NULL },
  2150. { NULL },
  2151. },
  2152. { "Prolink Pixelview SBTVD",
  2153. { &dib0700_usb_id_table[63], NULL },
  2154. { NULL },
  2155. },
  2156. { "EvolutePC TVWay+",
  2157. { &dib0700_usb_id_table[64], NULL },
  2158. { NULL },
  2159. },
  2160. },
  2161. .rc_interval = DEFAULT_RC_INTERVAL,
  2162. .rc_key_map = dib0700_rc_keys,
  2163. .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
  2164. .rc_query = dib0700_rc_query
  2165. }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
  2166. .num_adapters = 2,
  2167. .adapter = {
  2168. {
  2169. .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
  2170. .pid_filter_count = 32,
  2171. .pid_filter = stk807x_pid_filter,
  2172. .pid_filter_ctrl = stk807x_pid_filter_ctrl,
  2173. .frontend_attach = stk807xpvr_frontend_attach0,
  2174. .tuner_attach = dib807x_tuner_attach,
  2175. DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
  2176. .size_of_priv =
  2177. sizeof(struct dib0700_adapter_state),
  2178. },
  2179. {
  2180. .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
  2181. .pid_filter_count = 32,
  2182. .pid_filter = stk807x_pid_filter,
  2183. .pid_filter_ctrl = stk807x_pid_filter_ctrl,
  2184. .frontend_attach = stk807xpvr_frontend_attach1,
  2185. .tuner_attach = dib807x_tuner_attach,
  2186. DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
  2187. .size_of_priv =
  2188. sizeof(struct dib0700_adapter_state),
  2189. },
  2190. },
  2191. .num_device_descs = 1,
  2192. .devices = {
  2193. { "DiBcom STK807xPVR reference design",
  2194. { &dib0700_usb_id_table[61], NULL },
  2195. { NULL },
  2196. },
  2197. },
  2198. .rc_interval = DEFAULT_RC_INTERVAL,
  2199. .rc_key_map = dib0700_rc_keys,
  2200. .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
  2201. .rc_query = dib0700_rc_query
  2202. },
  2203. };
  2204. int dib0700_device_count = ARRAY_SIZE(dib0700_devices);