dib0700_devices.c 69 KB

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