cx231xx-avcore.c 92 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289
  1. /*
  2. cx231xx_avcore.c - driver for Conexant Cx23100/101/102 USB video capture devices
  3. Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
  4. This program contains the specific code to control the avdecoder chip and
  5. other related usb control functions for cx231xx based chipset.
  6. This program is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2 of the License, or
  9. (at your option) any later version.
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU General Public License for more details.
  14. You should have received a copy of the GNU General Public License
  15. along with this program; if not, write to the Free Software
  16. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. */
  18. #include <linux/init.h>
  19. #include <linux/list.h>
  20. #include <linux/module.h>
  21. #include <linux/kernel.h>
  22. #include <linux/bitmap.h>
  23. #include <linux/usb.h>
  24. #include <linux/i2c.h>
  25. #include <linux/version.h>
  26. #include <linux/mm.h>
  27. #include <linux/mutex.h>
  28. #include <media/v4l2-common.h>
  29. #include <media/v4l2-ioctl.h>
  30. #include <media/v4l2-chip-ident.h>
  31. #include "cx231xx.h"
  32. /*************************************************************************************
  33. * C O L I B R I - B L O C K C O N T R O L functions *
  34. *************************************************************************************/
  35. int cx231xx_colibri_init_super_block(struct cx231xx *dev, u32 ref_count)
  36. {
  37. int status = 0;
  38. u8 temp = 0;
  39. u32 colibri_power_status = 0;
  40. int i = 0;
  41. /* super block initialize */
  42. temp = (u8)(ref_count & 0xff);
  43. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, SUP_BLK_TUNE2, 2, temp, 1);
  44. status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS, SUP_BLK_TUNE2, 2, &colibri_power_status, 1);
  45. temp = (u8)((ref_count & 0x300) >> 8);
  46. temp |= 0x40;
  47. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, SUP_BLK_TUNE1, 2, temp, 1);
  48. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, SUP_BLK_PLL2, 2, 0x0f, 1);
  49. /* enable pll */
  50. while(colibri_power_status != 0x18)
  51. {
  52. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, SUP_BLK_PWRDN, 2, 0x18, 1);
  53. status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS, SUP_BLK_PWRDN, 2, &colibri_power_status, 1);
  54. colibri_power_status &= 0xff;
  55. if(status < 0) {
  56. cx231xx_info(": Init Super Block failed in sending/receiving cmds\n");
  57. break;
  58. }
  59. i++;
  60. if( i == 10) {
  61. cx231xx_info(": Init Super Block force break in loop !!!!\n");
  62. status = -1;
  63. break;
  64. }
  65. }
  66. if(status < 0 )
  67. return status;
  68. /* start tuning filter */
  69. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, SUP_BLK_TUNE3, 2, 0x40, 1);
  70. msleep(5);
  71. /* exit tuning */
  72. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, SUP_BLK_TUNE3, 2, 0x00, 1);
  73. return status;
  74. }
  75. int cx231xx_colibri_init_channels(struct cx231xx *dev)
  76. {
  77. int status = 0;
  78. /* power up all 3 channels, clear pd_buffer */
  79. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_PWRDN_CLAMP_CH1, 2, 0x00, 1);
  80. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_PWRDN_CLAMP_CH2, 2, 0x00, 1);
  81. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_PWRDN_CLAMP_CH3, 2, 0x00, 1);
  82. /* Enable quantizer calibration */
  83. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_COM_QUANT, 2, 0x02, 1);
  84. /* channel initialize, force modulator (fb) reset */
  85. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_FB_FRCRST_CH1, 2, 0x17, 1);
  86. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_FB_FRCRST_CH2, 2, 0x17, 1);
  87. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_FB_FRCRST_CH3, 2, 0x17, 1);
  88. /* start quantilizer calibration */
  89. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_CAL_ATEST_CH1, 2, 0x10, 1);
  90. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_CAL_ATEST_CH2, 2, 0x10, 1);
  91. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_CAL_ATEST_CH3, 2, 0x10, 1);
  92. msleep(5);
  93. /* exit modulator (fb) reset */
  94. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_FB_FRCRST_CH1, 2, 0x07, 1);
  95. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_FB_FRCRST_CH2, 2, 0x07, 1);
  96. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_FB_FRCRST_CH3, 2, 0x07, 1);
  97. /* enable the pre_clamp in each channel for single-ended input */
  98. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_NTF_PRECLMP_EN_CH1, 2, 0xf0, 1);
  99. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_NTF_PRECLMP_EN_CH2, 2, 0xf0, 1);
  100. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_NTF_PRECLMP_EN_CH3, 2, 0xf0, 1);
  101. /* use diode instead of resistor, so set term_en to 0, res_en to 0 */
  102. status = cx231xx_reg_mask_write(dev, Colibri_DEVICE_ADDRESS, 8, ADC_QGAIN_RES_TRM_CH1, 3, 7, 0x00);
  103. status = cx231xx_reg_mask_write(dev, Colibri_DEVICE_ADDRESS, 8, ADC_QGAIN_RES_TRM_CH2, 3, 7, 0x00);
  104. status = cx231xx_reg_mask_write(dev, Colibri_DEVICE_ADDRESS, 8, ADC_QGAIN_RES_TRM_CH3, 3, 7, 0x00);
  105. /* dynamic element matching off */
  106. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_DCSERVO_DEM_CH1, 2, 0x03, 1);
  107. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_DCSERVO_DEM_CH2, 2, 0x03, 1);
  108. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_DCSERVO_DEM_CH3, 2, 0x03, 1);
  109. return status;
  110. }
  111. int cx231xx_colibri_setup_AFE_for_baseband(struct cx231xx *dev)
  112. {
  113. u32 c_value = 0;
  114. int status = 0;
  115. status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_PWRDN_CLAMP_CH2, 2, &c_value, 1);
  116. c_value &= (~(0x50));
  117. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_PWRDN_CLAMP_CH2, 2, c_value, 1);
  118. return status;
  119. }
  120. /*
  121. we have 3 channel
  122. channel 1 ----- pin 1 to pin4(in reg is 1-4)
  123. channel 2 ----- pin 5 to pin8(in reg is 5-8)
  124. channel 3 ----- pin 9 to pin 12(in reg is 9-11)
  125. */
  126. int cx231xx_colibri_set_input_mux(struct cx231xx *dev, u32 input_mux)
  127. {
  128. u8 ch1_setting = (u8)input_mux;
  129. u8 ch2_setting = (u8)(input_mux >> 8);
  130. u8 ch3_setting = (u8)(input_mux >> 16);
  131. int status = 0;
  132. u32 value = 0;
  133. if(ch1_setting != 0)
  134. {
  135. status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_INPUT_CH1, 2, &value, 1);
  136. value &= (!INPUT_SEL_MASK);
  137. value |= (ch1_setting-1)<<4;
  138. value &= 0xff;
  139. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_INPUT_CH1, 2, value, 1);
  140. }
  141. if(ch2_setting != 0)
  142. {
  143. status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_INPUT_CH2, 2, &value, 1);
  144. value &= (!INPUT_SEL_MASK);
  145. value |= (ch2_setting-1)<<4;
  146. value &= 0xff;
  147. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_INPUT_CH2, 2, value, 1);
  148. }
  149. /* For ch3_setting, the value to put in the register is 7 less than the input number */
  150. if(ch3_setting != 0)
  151. {
  152. status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_INPUT_CH3, 2, &value, 1);
  153. value &= (!INPUT_SEL_MASK);
  154. value |= (ch3_setting-1)<<4;
  155. value &= 0xff;
  156. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_INPUT_CH3, 2, value, 1);
  157. }
  158. return status;
  159. }
  160. int cx231xx_colibri_set_mode(struct cx231xx *dev, enum AFE_MODE mode)
  161. {
  162. int status = 0;
  163. switch(mode) {
  164. case AFE_MODE_LOW_IF:
  165. /* SetupAFEforLowIF(); */
  166. break;
  167. case AFE_MODE_BASEBAND:
  168. status = cx231xx_colibri_setup_AFE_for_baseband(dev);
  169. break;
  170. case AFE_MODE_EU_HI_IF:
  171. /* SetupAFEforEuHiIF(); */
  172. break;
  173. case AFE_MODE_US_HI_IF:
  174. /* SetupAFEforUsHiIF(); */
  175. break;
  176. case AFE_MODE_JAPAN_HI_IF:
  177. /* SetupAFEforJapanHiIF(); */
  178. break;
  179. }
  180. if((mode != dev->colibri_mode) && (dev->video_input == CX231XX_VMUX_TELEVISION)) {
  181. status = cx231xx_colibri_adjust_ref_count(dev, CX231XX_VMUX_TELEVISION);
  182. }
  183. dev->colibri_mode = mode;
  184. return status;
  185. }
  186. /* For power saving in the EVK */
  187. int cx231xx_colibri_update_power_control(struct cx231xx *dev, AV_MODE avmode)
  188. {
  189. u32 colibri_power_status = 0;
  190. int status = 0;
  191. switch (dev->model) {
  192. case CX231XX_BOARD_CNXT_RDE_250:
  193. case CX231XX_BOARD_CNXT_RDU_250:
  194. if(avmode==POLARIS_AVMODE_ANALOGT_TV)
  195. {
  196. while(colibri_power_status != 0x18) {
  197. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  198. SUP_BLK_PWRDN, 2, 0x18, 1);
  199. status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  200. SUP_BLK_PWRDN, 2, &colibri_power_status, 1);
  201. if(status < 0 )
  202. break;
  203. }
  204. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  205. ADC_PWRDN_CLAMP_CH1, 2, 0x00, 1);
  206. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  207. ADC_PWRDN_CLAMP_CH2, 2, 0x00, 1);
  208. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  209. ADC_PWRDN_CLAMP_CH3, 2, 0x00, 1);
  210. }
  211. else if(avmode==POLARIS_AVMODE_DIGITAL) {
  212. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  213. ADC_PWRDN_CLAMP_CH1, 2, 0x70, 1);
  214. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  215. ADC_PWRDN_CLAMP_CH2, 2, 0x70, 1);
  216. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  217. ADC_PWRDN_CLAMP_CH3, 2, 0x70, 1);
  218. status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  219. SUP_BLK_PWRDN, 2, &colibri_power_status, 1);
  220. colibri_power_status |=0x07;
  221. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  222. SUP_BLK_PWRDN, 2, colibri_power_status, 1);
  223. }
  224. else if(avmode==POLARIS_AVMODE_ENXTERNAL_AV) {
  225. while(colibri_power_status != 0x18) {
  226. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  227. SUP_BLK_PWRDN, 2, 0x18, 1);
  228. status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  229. SUP_BLK_PWRDN, 2, &colibri_power_status, 1);
  230. if(status < 0 )
  231. break;
  232. }
  233. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  234. ADC_PWRDN_CLAMP_CH1, 2, 0x00, 1);
  235. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  236. ADC_PWRDN_CLAMP_CH2, 2, 0x00, 1);
  237. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  238. ADC_PWRDN_CLAMP_CH3, 2, 0x00, 1);
  239. }
  240. else {
  241. cx231xx_info("Invalid AV mode input\n");
  242. status = -1;
  243. }
  244. break;
  245. default:
  246. if(avmode==POLARIS_AVMODE_ANALOGT_TV)
  247. {
  248. while(colibri_power_status != 0x18) {
  249. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  250. SUP_BLK_PWRDN, 2, 0x18, 1);
  251. status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  252. SUP_BLK_PWRDN, 2, &colibri_power_status, 1);
  253. if(status < 0 )
  254. break;
  255. }
  256. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  257. ADC_PWRDN_CLAMP_CH1, 2, 0x40, 1);
  258. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  259. ADC_PWRDN_CLAMP_CH2, 2, 0x40, 1);
  260. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  261. ADC_PWRDN_CLAMP_CH3, 2, 0x00, 1);
  262. }
  263. else if(avmode==POLARIS_AVMODE_DIGITAL) {
  264. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  265. ADC_PWRDN_CLAMP_CH1, 2, 0x70, 1);
  266. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  267. ADC_PWRDN_CLAMP_CH2, 2, 0x70, 1);
  268. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  269. ADC_PWRDN_CLAMP_CH3, 2, 0x70, 1);
  270. status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  271. SUP_BLK_PWRDN, 2, &colibri_power_status, 1);
  272. colibri_power_status |=0x07;
  273. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  274. SUP_BLK_PWRDN, 2, colibri_power_status, 1);
  275. }
  276. else if(avmode==POLARIS_AVMODE_ENXTERNAL_AV) {
  277. while(colibri_power_status != 0x18) {
  278. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  279. SUP_BLK_PWRDN, 2, 0x18, 1);
  280. status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  281. SUP_BLK_PWRDN, 2, &colibri_power_status, 1);
  282. if(status < 0 )
  283. break;
  284. }
  285. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  286. ADC_PWRDN_CLAMP_CH1, 2, 0x00, 1);
  287. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  288. ADC_PWRDN_CLAMP_CH2, 2, 0x00, 1);
  289. status = cx231xx_write_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  290. ADC_PWRDN_CLAMP_CH3, 2, 0x40, 1);
  291. }
  292. else {
  293. cx231xx_info("Invalid AV mode input\n");
  294. status = -1;
  295. }
  296. } /* switch */
  297. return status;
  298. }
  299. int cx231xx_colibri_adjust_ref_count(struct cx231xx *dev, u32 video_input)
  300. {
  301. u32 input_mode = 0;
  302. u32 ntf_mode = 0;
  303. int status = 0;
  304. dev->video_input = video_input;
  305. if(video_input == CX231XX_VMUX_TELEVISION) {
  306. status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_INPUT_CH3, 2, &input_mode, 1);
  307. status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  308. ADC_NTF_PRECLMP_EN_CH3, 2, &ntf_mode, 1);
  309. }
  310. else {
  311. status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS, ADC_INPUT_CH1, 2, &input_mode, 1);
  312. status = cx231xx_read_i2c_data(dev, Colibri_DEVICE_ADDRESS,
  313. ADC_NTF_PRECLMP_EN_CH1, 2, &ntf_mode, 1);
  314. }
  315. input_mode = (ntf_mode & 0x3) | ((input_mode & 0x6) << 1);
  316. switch(input_mode)
  317. {
  318. case SINGLE_ENDED:
  319. dev->colibri_ref_count = 0x23C;
  320. break;
  321. case LOW_IF:
  322. dev->colibri_ref_count = 0x24C;
  323. break;
  324. case EU_IF:
  325. dev->colibri_ref_count = 0x258;
  326. break;
  327. case US_IF:
  328. dev->colibri_ref_count = 0x260;
  329. break;
  330. default:
  331. break;
  332. }
  333. status = cx231xx_colibri_init_super_block(dev, dev->colibri_ref_count);
  334. return status;
  335. }
  336. /*************************************************************************************
  337. * V I D E O / A U D I O D E C O D E R C O N T R O L functions *
  338. *************************************************************************************/
  339. int cx231xx_set_video_input_mux(struct cx231xx *dev, u8 input)
  340. {
  341. int status = 0;
  342. switch(INPUT(input)->type) {
  343. case CX231XX_VMUX_COMPOSITE1:
  344. case CX231XX_VMUX_SVIDEO:
  345. if((dev->current_pcb_config.type == USB_BUS_POWER) &&
  346. (dev->power_mode != POLARIS_AVMODE_ENXTERNAL_AV)) {
  347. status = cx231xx_set_power_mode(dev, POLARIS_AVMODE_ENXTERNAL_AV); /* External AV */
  348. if (status < 0) {
  349. cx231xx_errdev("%s: cx231xx_set_power_mode : Failed to set Power - errCode [%d]!\n",
  350. __func__, status);
  351. return status;
  352. }
  353. }
  354. status = cx231xx_set_decoder_video_input(dev, INPUT(input)->type, INPUT(input)->vmux);
  355. break;
  356. case CX231XX_VMUX_TELEVISION:
  357. case CX231XX_VMUX_CABLE:
  358. if((dev->current_pcb_config.type == USB_BUS_POWER) &&
  359. (dev->power_mode != POLARIS_AVMODE_ANALOGT_TV)) {
  360. status = cx231xx_set_power_mode(dev, POLARIS_AVMODE_ANALOGT_TV); /* Tuner */
  361. if (status < 0) {
  362. cx231xx_errdev("%s: cx231xx_set_power_mode : Failed to set Power - errCode [%d]!\n",
  363. __func__, status);
  364. return status;
  365. }
  366. }
  367. status = cx231xx_set_decoder_video_input(dev, CX231XX_VMUX_COMPOSITE1, INPUT(input)->vmux);
  368. break;
  369. default:
  370. cx231xx_errdev("%s: cx231xx_set_power_mode : Unknown Input %d !\n",
  371. __func__, INPUT(input)->type);
  372. break;
  373. }
  374. /* save the selection */
  375. dev->video_input = input;
  376. return status;
  377. }
  378. int cx231xx_set_decoder_video_input(struct cx231xx *dev, u8 pin_type, u8 input)
  379. {
  380. int status = 0;
  381. u32 value = 0;
  382. if(pin_type != dev->video_input) {
  383. status = cx231xx_colibri_adjust_ref_count(dev, pin_type);
  384. if(status < 0 ) {
  385. cx231xx_errdev("%s: cx231xx_colibri_adjust_ref_count :Failed to set Colibri input mux - errCode [%d]!\n",
  386. __func__, status);
  387. return status;
  388. }
  389. }
  390. /* call colibri block to set video inputs */
  391. status = cx231xx_colibri_set_input_mux(dev, input);
  392. if(status < 0 ) {
  393. cx231xx_errdev("%s: cx231xx_colibri_set_input_mux :Failed to set Colibri input mux - errCode [%d]!\n",
  394. __func__, status);
  395. return status;
  396. }
  397. switch(pin_type) {
  398. case CX231XX_VMUX_COMPOSITE1:
  399. {
  400. status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AFE_CTRL, 2, &value, 4);
  401. value |= (0<<13)|(1<<4);
  402. value &= ~(1<<5);
  403. value &= (~(0x1FF8000)); /* set [24:23] [22:15] to 0 */
  404. value |= 0x1000000; /* set FUNC_MODE[24:23] = 2 IF_MOD[22:15] = 0 */
  405. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AFE_CTRL, 2, value, 4);
  406. status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, OUT_CTRL1, 2, &value, 4);
  407. value |= (1<<7);
  408. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, OUT_CTRL1, 2, value, 4);
  409. /* Set vip 1.1 output mode */
  410. status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
  411. OUT_CTRL1, FLD_OUT_MODE, OUT_MODE_VIP11);
  412. /* Tell DIF object to go to baseband mode */
  413. status = cx231xx_dif_set_standard(dev, DIF_USE_BASEBAND);
  414. if (status < 0) {
  415. cx231xx_errdev("%s: cx231xx_dif set to By pass mode - errCode [%d]!\n",
  416. __func__, status);
  417. return status;
  418. }
  419. /* Read the DFE_CTRL1 register */
  420. status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DFE_CTRL1, 2, &value, 4);
  421. /* enable the VBI_GATE_EN */
  422. value |= FLD_VBI_GATE_EN;
  423. /* Enable the auto-VGA enable */
  424. value |= FLD_VGA_AUTO_EN;
  425. /* Write it back */
  426. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DFE_CTRL1, 2, value, 4);
  427. /* Disable auto config of registers */
  428. status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
  429. MODE_CTRL, FLD_ACFG_DIS, cx231xx_set_field(FLD_ACFG_DIS, 1));
  430. /* Set CVBS input mode */
  431. status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
  432. MODE_CTRL, FLD_INPUT_MODE,
  433. cx231xx_set_field(FLD_INPUT_MODE, INPUT_MODE_CVBS_0));
  434. }
  435. break;
  436. case CX231XX_VMUX_SVIDEO:
  437. {
  438. /* Disable the use of DIF */
  439. status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AFE_CTRL, 2, &value, 4);
  440. value &= (~(0x1FF8000)); /* set [24:23] [22:15] to 0 */
  441. value |= 0x1000010; /* set FUNC_MODE[24:23] = 2
  442. IF_MOD[22:15] = 0 DCR_BYP_CH2[4:4] = 1; */
  443. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AFE_CTRL, 2, value, 4);
  444. /* Tell DIF object to go to baseband mode */
  445. status = cx231xx_dif_set_standard(dev, DIF_USE_BASEBAND);
  446. if (status < 0) {
  447. cx231xx_errdev("%s: cx231xx_dif set to By pass mode - errCode [%d]!\n",
  448. __func__, status);
  449. return status;
  450. }
  451. /* Read the DFE_CTRL1 register */
  452. status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DFE_CTRL1, 2, &value, 4);
  453. /* enable the VBI_GATE_EN */
  454. value |= FLD_VBI_GATE_EN;
  455. /* Enable the auto-VGA enable */
  456. value |= FLD_VGA_AUTO_EN;
  457. /* Write it back */
  458. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DFE_CTRL1, 2, value, 4);
  459. /* Disable auto config of registers */
  460. status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
  461. MODE_CTRL, FLD_ACFG_DIS, cx231xx_set_field(FLD_ACFG_DIS, 1));
  462. /* Set YC input mode */
  463. status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
  464. MODE_CTRL, FLD_INPUT_MODE,
  465. cx231xx_set_field(FLD_INPUT_MODE, INPUT_MODE_YC_1));
  466. /* Chroma to ADC2 */
  467. status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AFE_CTRL, 2, &value, 4);
  468. value |= FLD_CHROMA_IN_SEL; /* set the chroma in select */
  469. /* Clear VGA_SEL_CH2 and VGA_SEL_CH3 (bits 7 and 8) This sets them to use video
  470. rather than audio. Only one of the two will be in use. */
  471. value &= ~(FLD_VGA_SEL_CH2 | FLD_VGA_SEL_CH3);
  472. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AFE_CTRL, 2, value, 4);
  473. status = cx231xx_colibri_set_mode(dev, AFE_MODE_BASEBAND);
  474. }
  475. break;
  476. case CX231XX_VMUX_TELEVISION:
  477. case CX231XX_VMUX_CABLE:
  478. default:
  479. {
  480. switch(dev->model) {
  481. case CX231XX_BOARD_CNXT_RDE_250:
  482. case CX231XX_BOARD_CNXT_RDU_250:
  483. {
  484. /* Disable the use of DIF */
  485. status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AFE_CTRL, 2, &value, 4);
  486. value |= (0<<13)|(1<<4);
  487. value &= ~(1<<5);
  488. value &= (~(0x1FF8000)); /* set [24:23] [22:15] to 0 */
  489. value |= 0x1000000; /* set FUNC_MODE[24:23] = 2 IF_MOD[22:15] = 0 */
  490. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AFE_CTRL, 2, value, 4);
  491. status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, OUT_CTRL1, 2, &value, 4);
  492. value |= (1<<7);
  493. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, OUT_CTRL1, 2, value, 4);
  494. /* Set vip 1.1 output mode */
  495. status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
  496. OUT_CTRL1, FLD_OUT_MODE, OUT_MODE_VIP11);
  497. /* Tell DIF object to go to baseband mode */
  498. status = cx231xx_dif_set_standard(dev, DIF_USE_BASEBAND);
  499. if (status < 0) {
  500. cx231xx_errdev("%s: cx231xx_dif set to By pass mode - errCode [%d]!\n",
  501. __func__, status);
  502. return status;
  503. }
  504. /* Read the DFE_CTRL1 register */
  505. status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DFE_CTRL1, 2, &value, 4);
  506. /* enable the VBI_GATE_EN */
  507. value |= FLD_VBI_GATE_EN;
  508. /* Enable the auto-VGA enable */
  509. value |= FLD_VGA_AUTO_EN;
  510. /* Write it back */
  511. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DFE_CTRL1, 2, value, 4);
  512. /* Disable auto config of registers */
  513. status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
  514. MODE_CTRL, FLD_ACFG_DIS, cx231xx_set_field(FLD_ACFG_DIS, 1));
  515. /* Set CVBS input mode */
  516. status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
  517. MODE_CTRL, FLD_INPUT_MODE,
  518. cx231xx_set_field(FLD_INPUT_MODE, INPUT_MODE_CVBS_0));
  519. }
  520. break;
  521. default:
  522. {
  523. /* Enable the DIF for the tuner */
  524. /* Reinitialize the DIF */
  525. status = cx231xx_dif_set_standard(dev, dev->norm);
  526. if (status < 0) {
  527. cx231xx_errdev("%s: cx231xx_dif set to By pass mode - errCode [%d]!\n",
  528. __func__, status);
  529. return status;
  530. }
  531. /* Make sure bypass is cleared */
  532. status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_MISC_CTRL, 2, &value, 4);
  533. /* Clear the bypass bit */
  534. value &= ~FLD_DIF_DIF_BYPASS;
  535. /* Enable the use of the DIF block */
  536. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_MISC_CTRL, 2, value, 4);
  537. /* Read the DFE_CTRL1 register */
  538. status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DFE_CTRL1, 2, &value, 4);
  539. /* Disable the VBI_GATE_EN */
  540. value &= ~FLD_VBI_GATE_EN;
  541. /* Enable the auto-VGA enable, AGC, and set the skip count to 2 */
  542. value |= FLD_VGA_AUTO_EN | FLD_AGC_AUTO_EN | 0x00200000;
  543. /* Write it back */
  544. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DFE_CTRL1, 2, value, 4);
  545. /* Wait 15 ms */
  546. msleep(1);
  547. /* Disable the auto-VGA enable AGC */
  548. value &= ~(FLD_VGA_AUTO_EN);
  549. /* Write it back */
  550. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DFE_CTRL1, 2, value, 4);
  551. /* Enable Polaris B0 AGC output */
  552. status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, PIN_CTRL, 2, &value, 4);
  553. value |=(FLD_OEF_AGC_RF)|(FLD_OEF_AGC_IFVGA)|(FLD_OEF_AGC_IF);
  554. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, PIN_CTRL, 2, value, 4);
  555. /* Set vip 1.1 output mode */
  556. status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
  557. OUT_CTRL1, FLD_OUT_MODE, OUT_MODE_VIP11);
  558. /* Disable auto config of registers */
  559. status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
  560. MODE_CTRL, FLD_ACFG_DIS, cx231xx_set_field(FLD_ACFG_DIS, 1));
  561. /* Set CVBS input mode */
  562. status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
  563. MODE_CTRL, FLD_INPUT_MODE,
  564. cx231xx_set_field(FLD_INPUT_MODE, INPUT_MODE_CVBS_0));
  565. /* Set some bits in AFE_CTRL so that channel 2 or 3 is ready to receive audio */
  566. /* Clear clamp for channels 2 and 3 (bit 16-17) */
  567. /* Clear droop comp (bit 19-20) */
  568. /* Set VGA_SEL (for audio control) (bit 7-8) */
  569. status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AFE_CTRL, 2, &value, 4);
  570. value |= FLD_VGA_SEL_CH3 | FLD_VGA_SEL_CH2;
  571. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AFE_CTRL, 2, value, 4);
  572. }
  573. break;
  574. }
  575. }
  576. break;
  577. }
  578. /* Set raw VBI mode */
  579. status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
  580. OUT_CTRL1, FLD_VBIHACTRAW_EN,
  581. cx231xx_set_field(FLD_VBIHACTRAW_EN, 1));
  582. status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, OUT_CTRL1, 2, &value, 4);
  583. if(value & 0x02) {
  584. value |=(1<<19);
  585. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, OUT_CTRL1, 2, value, 4);
  586. }
  587. return status;
  588. }
  589. /*
  590. * Handle any video-mode specific overrides that are different on a per video standards
  591. * basis after touching the MODE_CTRL register which resets many values for autodetect
  592. */
  593. int cx231xx_do_mode_ctrl_overrides(struct cx231xx *dev)
  594. {
  595. int status = 0;
  596. cx231xx_info("do_mode_ctrl_overrides : 0x%x\n", (unsigned int)dev->norm);
  597. /* Change the DFE_CTRL3 bp_percent to fix flagging */
  598. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DFE_CTRL3, 2, 0xCD3F0280, 4);
  599. if( dev->norm & (V4L2_STD_NTSC_M | V4L2_STD_NTSC_M_JP | V4L2_STD_PAL_M) ) {
  600. cx231xx_info("do_mode_ctrl_overrides NTSC\n");
  601. /* Move the close caption lines out of active video, adjust the active video start point */
  602. status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
  603. VERT_TIM_CTRL, FLD_VBLANK_CNT,0x18);
  604. status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
  605. VERT_TIM_CTRL, FLD_VACTIVE_CNT,0x1E6000);
  606. status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
  607. VERT_TIM_CTRL, FLD_V656BLANK_CNT,0x1E000000);
  608. status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
  609. HORIZ_TIM_CTRL, FLD_HBLANK_CNT,
  610. cx231xx_set_field(FLD_HBLANK_CNT, 0x79));
  611. } else if ( dev->norm & ( V4L2_STD_PAL_B | V4L2_STD_PAL_G | V4L2_STD_PAL_D |
  612. V4L2_STD_PAL_I | V4L2_STD_PAL_N | V4L2_STD_PAL_Nc) ) {
  613. cx231xx_info("do_mode_ctrl_overrides PAL\n");
  614. status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
  615. VERT_TIM_CTRL, FLD_VBLANK_CNT,0x24);
  616. /* Adjust the active video horizontal start point */
  617. status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
  618. HORIZ_TIM_CTRL, FLD_HBLANK_CNT,
  619. cx231xx_set_field(FLD_HBLANK_CNT, 0x85));
  620. } else if (dev->norm & ( V4L2_STD_SECAM_B | V4L2_STD_SECAM_D | V4L2_STD_SECAM_G |
  621. V4L2_STD_SECAM_K | V4L2_STD_SECAM_K1 | V4L2_STD_SECAM_L |
  622. V4L2_STD_SECAM_LC) ) {
  623. cx231xx_info("do_mode_ctrl_overrides SECAM\n");
  624. status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
  625. VERT_TIM_CTRL, FLD_VBLANK_CNT,0x24);
  626. /* Adjust the active video horizontal start point */
  627. status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
  628. HORIZ_TIM_CTRL, FLD_HBLANK_CNT,
  629. cx231xx_set_field(FLD_HBLANK_CNT, 0x85));
  630. }
  631. return status;
  632. }
  633. int cx231xx_set_audio_input(struct cx231xx *dev, u8 input)
  634. {
  635. int status = 0;
  636. enum AUDIO_INPUT ainput = AUDIO_INPUT_LINE;
  637. switch(INPUT(input)->amux) {
  638. case CX231XX_AMUX_VIDEO:
  639. ainput = AUDIO_INPUT_TUNER_TV;
  640. break;
  641. case CX231XX_AMUX_LINE_IN:
  642. status = cx231xx_flatiron_set_audio_input(dev, input);
  643. ainput = AUDIO_INPUT_LINE;
  644. break;
  645. default:
  646. break;
  647. }
  648. status = cx231xx_set_audio_decoder_input(dev, ainput);
  649. return status;
  650. }
  651. int cx231xx_set_audio_decoder_input(struct cx231xx *dev, enum AUDIO_INPUT audio_input)
  652. {
  653. u32 dwval;
  654. int status;
  655. u32 gen_ctrl;
  656. u32 value = 0;
  657. /* Put it in soft reset */
  658. status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, GENERAL_CTL, 2, &gen_ctrl, 1);
  659. gen_ctrl |= 1;
  660. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, GENERAL_CTL, 2, gen_ctrl, 1);
  661. switch(audio_input)
  662. {
  663. case AUDIO_INPUT_LINE:
  664. /* setup AUD_IO control from Merlin paralle output */
  665. value = cx231xx_set_field(FLD_AUD_CHAN1_SRC, AUD_CHAN_SRC_PARALLEL);
  666. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AUD_IO_CTRL, 2, value, 4);
  667. /* setup input to Merlin, SRC2 connect to AC97
  668. bypass upsample-by-2, slave mode, sony mode, left justify
  669. adr 091c, dat 01000000 */
  670. status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AC97_CTL, 2, &dwval, 4);
  671. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AC97_CTL, 2, (dwval | FLD_AC97_UP2X_BYPASS), 4);
  672. /* select the parallel1 and SRC3 */
  673. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, BAND_OUT_SEL, 2,
  674. cx231xx_set_field(FLD_SRC3_IN_SEL, 0x0)|
  675. cx231xx_set_field(FLD_SRC3_CLK_SEL, 0x0)|
  676. cx231xx_set_field(FLD_PARALLEL1_SRC_SEL, 0x0), 4);
  677. /* unmute all, AC97 in, independence mode
  678. adr 08d0, data 0x00063073 */
  679. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, PATH1_CTL1, 2, 0x00063073, 4);
  680. /* set AVC maximum threshold, adr 08d4, dat ffff0024 */
  681. status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, PATH1_VOL_CTL, 2, &dwval, 4);
  682. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, PATH1_VOL_CTL, 2,
  683. (dwval | FLD_PATH1_AVC_THRESHOLD), 4);
  684. /* set SC maximum threshold, adr 08ec, dat ffffb3a3 */
  685. status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, PATH1_SC_CTL, 2, &dwval, 4);
  686. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, PATH1_SC_CTL, 2,
  687. (dwval | FLD_PATH1_SC_THRESHOLD), 4);
  688. break;
  689. case AUDIO_INPUT_TUNER_TV:
  690. default:
  691. /* Setup SRC sources and clocks */
  692. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, BAND_OUT_SEL, 2,
  693. cx231xx_set_field(FLD_SRC6_IN_SEL, 0x00)|
  694. cx231xx_set_field(FLD_SRC6_CLK_SEL, 0x01)|
  695. cx231xx_set_field(FLD_SRC5_IN_SEL, 0x00)|
  696. cx231xx_set_field(FLD_SRC5_CLK_SEL, 0x02)|
  697. cx231xx_set_field(FLD_SRC4_IN_SEL, 0x02)|
  698. cx231xx_set_field(FLD_SRC4_CLK_SEL, 0x03)|
  699. cx231xx_set_field(FLD_SRC3_IN_SEL, 0x00)|
  700. cx231xx_set_field(FLD_SRC3_CLK_SEL, 0x00)|
  701. cx231xx_set_field(FLD_BASEBAND_BYPASS_CTL, 0x00)|
  702. cx231xx_set_field(FLD_AC97_SRC_SEL, 0x03)|
  703. cx231xx_set_field(FLD_I2S_SRC_SEL, 0x00)|
  704. cx231xx_set_field(FLD_PARALLEL2_SRC_SEL, 0x02)|
  705. cx231xx_set_field(FLD_PARALLEL1_SRC_SEL, 0x01) , 4);
  706. /* Setup the AUD_IO control */
  707. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, AUD_IO_CTRL, 2,
  708. cx231xx_set_field(FLD_I2S_PORT_DIR, 0x00)|
  709. cx231xx_set_field(FLD_I2S_OUT_SRC, 0x00)|
  710. cx231xx_set_field(FLD_AUD_CHAN3_SRC,0x00)|
  711. cx231xx_set_field(FLD_AUD_CHAN2_SRC, 0x00)|
  712. cx231xx_set_field(FLD_AUD_CHAN1_SRC,0x03 ), 4);
  713. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, PATH1_CTL1, 2, 0x1F063870, 4);
  714. /* setAudioStandard(_audio_standard); */
  715. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, PATH1_CTL1, 2, 0x00063870, 4);
  716. switch(dev->model)
  717. {
  718. case CX231XX_BOARD_CNXT_RDE_250:
  719. case CX231XX_BOARD_CNXT_RDU_250:
  720. status = cx231xx_read_modify_write_i2c_dword(dev, HAMMERHEAD_I2C_ADDRESS,
  721. CHIP_CTRL, FLD_SIF_EN,
  722. cx231xx_set_field(FLD_SIF_EN, 1));
  723. break;
  724. default:
  725. break;
  726. }
  727. break;
  728. case AUDIO_INPUT_TUNER_FM:
  729. /* use SIF for FM radio
  730. setupFM();
  731. setAudioStandard(_audio_standard);
  732. */
  733. break;
  734. case AUDIO_INPUT_MUTE:
  735. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, PATH1_CTL1, 2, 0x1F011012, 4);
  736. break;
  737. }
  738. /* Take it out of soft reset */
  739. status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, GENERAL_CTL, 2, &gen_ctrl, 1);
  740. gen_ctrl &= ~1;
  741. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, GENERAL_CTL, 2, gen_ctrl, 1);
  742. return status;
  743. }
  744. /* Set resolution of the video */
  745. int cx231xx_resolution_set(struct cx231xx *dev)
  746. {
  747. int width, height;
  748. u32 hscale, vscale;
  749. int status = 0;
  750. width = dev->width;
  751. height = dev->height;
  752. get_scale(dev,width, height,&hscale, &vscale);
  753. /* set horzontal scale */
  754. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, HSCALE_CTRL, 2, hscale, 4);
  755. /* set vertical scale */
  756. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, VSCALE_CTRL, 2, vscale, 4);
  757. return status;
  758. }
  759. /*************************************************************************************
  760. * C H I P Specific C O N T R O L functions *
  761. *************************************************************************************/
  762. int cx231xx_init_ctrl_pin_status(struct cx231xx *dev)
  763. {
  764. u32 value;
  765. int status = 0;
  766. status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, PIN_CTRL, 2, &value, 4);
  767. value |=(~dev->board.ctl_pin_status_mask);
  768. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, PIN_CTRL, 2, value, 4);
  769. return status;
  770. }
  771. int cx231xx_set_agc_analog_digital_mux_select(struct cx231xx *dev, u8 analog_or_digital)
  772. {
  773. int status = 0;
  774. /* first set the direction to output */
  775. status = cx231xx_set_gpio_direction(dev, dev->board.agc_analog_digital_select_gpio, 1);
  776. /* 0 - demod ; 1 - Analog mode */
  777. status = cx231xx_set_gpio_value(dev, dev->board.agc_analog_digital_select_gpio,
  778. analog_or_digital);
  779. return status;
  780. }
  781. int cx231xx_enable_i2c_for_tuner(struct cx231xx *dev, u8 I2CIndex)
  782. {
  783. u8 value[4] ={0,0,0,0};
  784. int status = 0;
  785. cx231xx_info("Changing the i2c port for tuner to %d\n",I2CIndex);
  786. status = cx231xx_read_ctrl_reg(dev,VRT_GET_REGISTER, PWR_CTL_EN, value, 4);
  787. if(status < 0)
  788. return status;
  789. if(I2CIndex==I2C_1) {
  790. if(value[0] & I2C_DEMOD_EN) {
  791. value[0] &= ~I2C_DEMOD_EN;
  792. status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
  793. }
  794. } else {
  795. if(!(value[0] & I2C_DEMOD_EN)) {
  796. value[0] |= I2C_DEMOD_EN;
  797. status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
  798. }
  799. }
  800. return status;
  801. }
  802. /*************************************************************************************
  803. * D I F - B L O C K C O N T R O L functions *
  804. *************************************************************************************/
  805. int cx231xx_dif_configure_C2HH_for_low_IF(struct cx231xx *dev, u32 mode,
  806. u32 function_mode, u32 standard)
  807. {
  808. int status = 0;
  809. if(mode == V4L2_TUNER_RADIO) {
  810. /* C2HH */
  811. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
  812. AFE_CTRL_C2HH_SRC_CTRL, 30, 31, 0x1); /* lo if big signal */
  813. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
  814. AFE_CTRL_C2HH_SRC_CTRL, 23, 24, function_mode); /* FUNC_MODE = DIF */
  815. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
  816. AFE_CTRL_C2HH_SRC_CTRL, 15, 22, 0xFF); /* IF_MODE */
  817. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
  818. AFE_CTRL_C2HH_SRC_CTRL, 9, 9, 0x1); /* no inv */
  819. }
  820. else {
  821. switch(standard) {
  822. case V4L2_STD_NTSC_M: /* 75 IRE Setup */
  823. case V4L2_STD_NTSC_M_JP: /* Japan, 0 IRE Setup */
  824. case V4L2_STD_PAL_M:
  825. case V4L2_STD_PAL_N:
  826. case V4L2_STD_PAL_Nc:
  827. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
  828. AFE_CTRL_C2HH_SRC_CTRL, 30, 31, 0x1); /* lo if big signal */
  829. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
  830. AFE_CTRL_C2HH_SRC_CTRL, 23, 24, function_mode); /* FUNC_MODE = DIF */
  831. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
  832. AFE_CTRL_C2HH_SRC_CTRL, 15, 22, 0xb); /* IF_MODE */
  833. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
  834. AFE_CTRL_C2HH_SRC_CTRL, 9, 9, 0x1); /* no inv */
  835. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
  836. AUD_IO_CTRL, 0, 31, 0x00000003); /* 0x124, AUD_CHAN1_SRC = 0x3 */
  837. break;
  838. case V4L2_STD_PAL_B:
  839. case V4L2_STD_PAL_G:
  840. /* C2HH setup */
  841. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
  842. AFE_CTRL_C2HH_SRC_CTRL, 30, 31, 0x1); /* lo if big signal */
  843. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
  844. AFE_CTRL_C2HH_SRC_CTRL, 23, 24, function_mode); /* FUNC_MODE = DIF */
  845. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
  846. AFE_CTRL_C2HH_SRC_CTRL, 15, 22, 0xE); /* IF_MODE */
  847. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
  848. AFE_CTRL_C2HH_SRC_CTRL, 9, 9, 0x1); /* no inv */
  849. break;
  850. case V4L2_STD_PAL_D:
  851. case V4L2_STD_PAL_I:
  852. case V4L2_STD_SECAM_L:
  853. case V4L2_STD_SECAM_LC:
  854. case V4L2_STD_SECAM_B:
  855. case V4L2_STD_SECAM_D:
  856. case V4L2_STD_SECAM_G:
  857. case V4L2_STD_SECAM_K:
  858. case V4L2_STD_SECAM_K1:
  859. /* C2HH setup */
  860. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
  861. AFE_CTRL_C2HH_SRC_CTRL, 30, 31, 0x1); /* lo if big signal */
  862. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
  863. AFE_CTRL_C2HH_SRC_CTRL, 23, 24, function_mode); /* FUNC_MODE = DIF */
  864. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
  865. AFE_CTRL_C2HH_SRC_CTRL, 15, 22, 0xF); /* IF_MODE */
  866. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32,
  867. AFE_CTRL_C2HH_SRC_CTRL, 9, 9, 0x1); /* no inv */
  868. break;
  869. case DIF_USE_BASEBAND:
  870. default:
  871. /* do nothing to config C2HH for baseband */
  872. break;
  873. }
  874. }
  875. return status;
  876. }
  877. int cx231xx_dif_set_standard(struct cx231xx *dev, u32 standard)
  878. {
  879. int status = 0;
  880. u32 dif_misc_ctrl_value = 0;
  881. u32 func_mode = 0;
  882. cx231xx_info("%s: setStandard to %x\n",__func__,standard);
  883. status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
  884. DIF_MISC_CTRL, 2, &dif_misc_ctrl_value, 4);
  885. if(standard != DIF_USE_BASEBAND )
  886. dev->norm = standard;
  887. switch (dev->model) {
  888. case CX231XX_BOARD_CNXT_RDE_250:
  889. case CX231XX_BOARD_CNXT_RDU_250:
  890. func_mode=0x03;
  891. break;
  892. default:
  893. func_mode=0x01;
  894. }
  895. status = cx231xx_dif_configure_C2HH_for_low_IF(dev, dev->active_mode, func_mode, standard);
  896. if(standard == DIF_USE_BASEBAND ) { /* base band */
  897. /* There is a different SRC_PHASE_INC value for baseband vs. DIF */
  898. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
  899. DIF_SRC_PHASE_INC, 2, 0xDF7DF83, 4);
  900. status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
  901. DIF_MISC_CTRL, 2, &dif_misc_ctrl_value, 4);
  902. dif_misc_ctrl_value |= FLD_DIF_DIF_BYPASS;
  903. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
  904. DIF_MISC_CTRL, 2, dif_misc_ctrl_value, 4);
  905. } else if ( standard & (V4L2_STD_PAL_B | V4L2_STD_PAL_G) ) {
  906. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
  907. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
  908. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
  909. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL3, 0, 31, 0x00008800);
  910. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_IF_REF, 0, 31, 0x444C1380);
  911. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_IF, 0, 31, 0xDA302600);
  912. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_INT, 0, 31, 0xDA261700);
  913. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_RF, 0, 31, 0xDA262600);
  914. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_IF_INT_CURRENT, 0, 31, 0x26001700);
  915. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_RF_CURRENT, 0, 31, 0x00002660);
  916. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_VIDEO_AGC_CTRL, 0, 31, 0x72500800);
  917. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_VID_AUD_OVERRIDE, 0, 31, 0x27000100);
  918. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AV_SEP_CTRL, 0, 31, 0x3F3530EC);
  919. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_COMP_FLT_CTRL, 0, 31, 0x00A653A8);
  920. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_SRC_PHASE_INC, 0, 31, 0x1befbf06);
  921. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_SRC_GAIN_CONTROL, 0, 31, 0x000035e8);
  922. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_RPT_VARIANCE, 0, 31, 0x00000000);
  923. /* Save the Spec Inversion value */
  924. dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
  925. dif_misc_ctrl_value |=0x3a013F11;
  926. } else if( standard & V4L2_STD_PAL_D ) {
  927. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
  928. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
  929. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
  930. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL3, 0, 31, 0x00008800);
  931. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_IF_REF, 0, 31, 0x444C1380);
  932. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_IF, 0, 31, 0xDA302600);
  933. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_INT, 0, 31, 0xDA261700);
  934. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_RF, 0, 31, 0xDA262600);
  935. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_IF_INT_CURRENT, 0, 31, 0x26001700);
  936. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_RF_CURRENT, 0, 31, 0x00002660);
  937. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_VIDEO_AGC_CTRL, 0, 31, 0x72500800);
  938. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_VID_AUD_OVERRIDE, 0, 31, 0x27000100);
  939. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AV_SEP_CTRL, 0, 31, 0x3F3934EA);
  940. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_COMP_FLT_CTRL, 0, 31, 0x00000000);
  941. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_SRC_PHASE_INC, 0, 31, 0x1befbf06);
  942. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_SRC_GAIN_CONTROL, 0, 31, 0x000035e8);
  943. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_RPT_VARIANCE, 0, 31, 0x00000000);
  944. /* Save the Spec Inversion value */
  945. dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
  946. dif_misc_ctrl_value |=0x3a023F11;
  947. } else if( standard & V4L2_STD_PAL_I ) {
  948. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
  949. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
  950. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
  951. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL3, 0, 31, 0x00008800);
  952. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_IF_REF, 0, 31, 0x444C1380);
  953. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_IF, 0, 31, 0xDA302600);
  954. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_INT, 0, 31, 0xDA261700);
  955. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_RF, 0, 31, 0xDA262600);
  956. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_IF_INT_CURRENT, 0, 31, 0x26001700);
  957. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_RF_CURRENT, 0, 31, 0x00002660);
  958. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_VIDEO_AGC_CTRL, 0, 31, 0x72500800);
  959. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_VID_AUD_OVERRIDE, 0, 31, 0x27000100);
  960. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AV_SEP_CTRL, 0, 31, 0x5F39A934);
  961. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_COMP_FLT_CTRL, 0, 31, 0x00000000);
  962. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_SRC_PHASE_INC, 0, 31, 0x1befbf06);
  963. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_SRC_GAIN_CONTROL, 0, 31, 0x000035e8);
  964. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_RPT_VARIANCE, 0, 31, 0x00000000);
  965. /* Save the Spec Inversion value */
  966. dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
  967. dif_misc_ctrl_value |=0x3a033F11;
  968. } else if( standard & V4L2_STD_PAL_M ) {
  969. /* improved Low Frequency Phase Noise */
  970. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
  971. DIF_PLL_CTRL, 2, 0xFF01FF0C, 4);
  972. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
  973. DIF_PLL_CTRL1, 2, 0xbd038c85, 4);
  974. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
  975. DIF_PLL_CTRL2, 2, 0x1db4640a, 4);
  976. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
  977. DIF_PLL_CTRL3, 2, 0x00008800, 4);
  978. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
  979. DIF_AGC_IF_REF, 2, 0x444C1380, 4);
  980. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
  981. DIF_AGC_IF_INT_CURRENT, 2, 0x26001700, 4);
  982. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
  983. DIF_AGC_RF_CURRENT, 2, 0x00002660, 4);
  984. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
  985. DIF_VIDEO_AGC_CTRL, 2, 0x72500800, 4);
  986. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
  987. DIF_VID_AUD_OVERRIDE, 2, 0x27000100, 4);
  988. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
  989. DIF_AV_SEP_CTRL, 2, 0x012c405d, 4);
  990. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
  991. DIF_COMP_FLT_CTRL, 2, 0x009f50c1, 4);
  992. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
  993. DIF_SRC_PHASE_INC, 2, 0x1befbf06, 4);
  994. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
  995. DIF_SRC_GAIN_CONTROL, 2, 0x000035e8, 4);
  996. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
  997. DIF_SOFT_RST_CTRL_REVB, 2, 0x00000000, 4);
  998. /* Save the Spec Inversion value */
  999. dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
  1000. dif_misc_ctrl_value |= 0x3A0A3F10;
  1001. } else if( standard & (V4L2_STD_PAL_N | V4L2_STD_PAL_Nc) ) {
  1002. /* improved Low Frequency Phase Noise */
  1003. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_PLL_CTRL, 2, 0xFF01FF0C, 4);
  1004. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_PLL_CTRL1, 2, 0xbd038c85, 4);
  1005. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_PLL_CTRL2, 2, 0x1db4640a, 4);
  1006. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_PLL_CTRL3, 2, 0x00008800, 4);
  1007. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_AGC_IF_REF, 2, 0x444C1380, 4);
  1008. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_AGC_IF_INT_CURRENT, 2, 0x26001700, 4);
  1009. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_AGC_RF_CURRENT, 2, 0x00002660, 4);
  1010. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_VIDEO_AGC_CTRL, 2, 0x72500800, 4);
  1011. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_VID_AUD_OVERRIDE, 2, 0x27000100, 4);
  1012. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_AV_SEP_CTRL, 2, 0x012c405d, 4);
  1013. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_COMP_FLT_CTRL, 2, 0x009f50c1, 4);
  1014. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_SRC_PHASE_INC, 2, 0x1befbf06, 4);
  1015. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_SRC_GAIN_CONTROL, 2, 0x000035e8, 4);
  1016. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_SOFT_RST_CTRL_REVB, 2, 0x00000000, 4);
  1017. /* Save the Spec Inversion value */
  1018. dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
  1019. dif_misc_ctrl_value = 0x3A093F10;
  1020. } else if( standard & ( V4L2_STD_SECAM_B | V4L2_STD_SECAM_D | V4L2_STD_SECAM_G |
  1021. V4L2_STD_SECAM_K | V4L2_STD_SECAM_K1) ) {
  1022. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
  1023. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
  1024. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
  1025. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL3, 0, 31, 0x00008800);
  1026. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_IF_REF, 0, 31, 0x888C0380);
  1027. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_IF, 0, 31, 0xe0262600);
  1028. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_INT, 0, 31, 0xc2171700);
  1029. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_RF, 0, 31, 0xc2262600);
  1030. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_IF_INT_CURRENT, 0, 31, 0x26001700);
  1031. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_RF_CURRENT, 0, 31, 0x00002660);
  1032. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_VID_AUD_OVERRIDE, 0, 31, 0x27000100);
  1033. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AV_SEP_CTRL, 0, 31, 0x3F3530ec);
  1034. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_COMP_FLT_CTRL, 0, 31, 0x00000000);
  1035. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_SRC_PHASE_INC, 0, 31, 0x1befbf06);
  1036. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_SRC_GAIN_CONTROL, 0, 31, 0x000035e8);
  1037. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_RPT_VARIANCE, 0, 31, 0x00000000);
  1038. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_VIDEO_AGC_CTRL, 0, 31, 0xf4000000);
  1039. /* Save the Spec Inversion value */
  1040. dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
  1041. dif_misc_ctrl_value |=0x3a023F11;
  1042. } else if( standard & (V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC) ) {
  1043. /* Is it SECAM_L1? */
  1044. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
  1045. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
  1046. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
  1047. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_PLL_CTRL3, 0, 31, 0x00008800);
  1048. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_IF_REF, 0, 31, 0x888C0380);
  1049. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_IF, 0, 31, 0xe0262600);
  1050. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_INT, 0, 31, 0xc2171700);
  1051. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_CTRL_RF, 0, 31, 0xc2262600);
  1052. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_IF_INT_CURRENT, 0, 31, 0x26001700);
  1053. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AGC_RF_CURRENT, 0, 31, 0x00002660);
  1054. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_VID_AUD_OVERRIDE, 0, 31, 0x27000100);
  1055. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_AV_SEP_CTRL, 0, 31, 0x3F3530ec);
  1056. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_COMP_FLT_CTRL, 0, 31, 0x00000000);
  1057. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_SRC_PHASE_INC, 0, 31, 0x1befbf06);
  1058. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_SRC_GAIN_CONTROL, 0, 31, 0x000035e8);
  1059. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_RPT_VARIANCE, 0, 31, 0x00000000);
  1060. status = cx231xx_reg_mask_write(dev, HAMMERHEAD_I2C_ADDRESS, 32, DIF_VIDEO_AGC_CTRL, 0, 31, 0xf2560000);
  1061. /* Save the Spec Inversion value */
  1062. dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
  1063. dif_misc_ctrl_value |=0x3a023F11;
  1064. } else { /* V4L2_STD_NTSC_M (75 IRE Setup) Or V4L2_STD_NTSC_M_JP (Japan, 0 IRE Setup) */
  1065. /* For NTSC the centre frequency of video coming out of sidewinder is
  1066. around 7.1MHz or 3.6MHz depending on the spectral inversion.
  1067. so for a non spectrally inverted channel the pll freq word is 0x03420c49
  1068. */
  1069. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_PLL_CTRL, 2, 0x6503BC0C, 4);
  1070. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_PLL_CTRL1, 2, 0xBD038C85, 4);
  1071. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_PLL_CTRL2, 2, 0x1DB4640A, 4);
  1072. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_PLL_CTRL3, 2, 0x00008800, 4);
  1073. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_AGC_IF_REF, 2, 0x444C0380, 4);
  1074. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_AGC_IF_INT_CURRENT, 2, 0x26001700, 4);
  1075. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_AGC_RF_CURRENT, 2, 0x00002660, 4);
  1076. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_VIDEO_AGC_CTRL, 2, 0x04000800, 4);
  1077. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_VID_AUD_OVERRIDE, 2, 0x27000100, 4);
  1078. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_AV_SEP_CTRL, 2, 0x01296e1f, 4);
  1079. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_COMP_FLT_CTRL, 2, 0x009f50c1, 4);
  1080. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_SRC_PHASE_INC, 2, 0x1befbf06, 4);
  1081. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_SRC_GAIN_CONTROL, 2, 0x000035e8, 4);
  1082. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_AGC_CTRL_IF, 2, 0xC2262600, 4);
  1083. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_AGC_CTRL_INT, 2, 0xC2262600, 4);
  1084. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_AGC_CTRL_RF, 2, 0xC2262600, 4);
  1085. /* Save the Spec Inversion value */
  1086. dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
  1087. dif_misc_ctrl_value |= 0x3a003F10;
  1088. }
  1089. /* The AGC values should be the same for all standards,
  1090. AUD_SRC_SEL[19] should always be disabled */
  1091. dif_misc_ctrl_value &= ~FLD_DIF_AUD_SRC_SEL;
  1092. /* It is still possible to get Set Standard calls even when we are in FM mode
  1093. This is done to override the value for FM. */
  1094. if (dev->active_mode == V4L2_TUNER_RADIO)
  1095. dif_misc_ctrl_value = 0x7a080000;
  1096. /* Write the calculated value for misc ontrol register */
  1097. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS, DIF_MISC_CTRL, 2, dif_misc_ctrl_value, 4);
  1098. return status;
  1099. }
  1100. int cx231xx_tuner_pre_channel_change(struct cx231xx *dev)
  1101. {
  1102. int status = 0;
  1103. u32 dwval;
  1104. /* Set the RF and IF k_agc values to 3 */
  1105. status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
  1106. DIF_AGC_IF_REF, 2, &dwval, 4);
  1107. dwval &= ~(FLD_DIF_K_AGC_RF | FLD_DIF_K_AGC_IF);
  1108. dwval |= 0x33000000;
  1109. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
  1110. DIF_AGC_IF_REF, 2, dwval, 4);
  1111. return status;
  1112. }
  1113. int cx231xx_tuner_post_channel_change(struct cx231xx *dev)
  1114. {
  1115. int status = 0;
  1116. u32 dwval;
  1117. /* Set the RF and IF k_agc values to 4 for PAL/NTSC and 8 for SECAM */
  1118. status = cx231xx_read_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
  1119. DIF_AGC_IF_REF, 2, &dwval, 4);
  1120. dwval &= ~(FLD_DIF_K_AGC_RF | FLD_DIF_K_AGC_IF);
  1121. if(dev->norm & ( V4L2_STD_SECAM_L | V4L2_STD_SECAM_B | V4L2_STD_SECAM_D) ) {
  1122. dwval |= 0x88000000;
  1123. } else {
  1124. dwval |= 0x44000000;
  1125. }
  1126. status = cx231xx_write_i2c_data(dev, HAMMERHEAD_I2C_ADDRESS,
  1127. DIF_AGC_IF_REF, 2, dwval, 4);
  1128. return status;
  1129. }
  1130. /*************************************************************************************
  1131. * F L A T I R O N - B L O C K C O N T R O L functions *
  1132. *************************************************************************************/
  1133. int cx231xx_flatiron_initialize(struct cx231xx *dev)
  1134. {
  1135. int status = 0;
  1136. u32 value;
  1137. status = cx231xx_read_i2c_data(dev, Flatrion_DEVICE_ADDRESS, CH_PWR_CTRL1, 1, &value, 1);
  1138. /* enables clock to delta-sigma and decimation filter */
  1139. value |= 0x80;
  1140. status = cx231xx_write_i2c_data(dev, Flatrion_DEVICE_ADDRESS,
  1141. CH_PWR_CTRL1, 1, value, 1);
  1142. /* power up all channel */
  1143. status = cx231xx_write_i2c_data(dev, Flatrion_DEVICE_ADDRESS,
  1144. CH_PWR_CTRL2, 1, 0x00, 1);
  1145. return status;
  1146. }
  1147. int cx231xx_flatiron_update_power_control(struct cx231xx *dev, AV_MODE avmode)
  1148. {
  1149. int status = 0;
  1150. u32 value=0;
  1151. if(avmode!=POLARIS_AVMODE_ENXTERNAL_AV) {
  1152. status = cx231xx_read_i2c_data(dev, Flatrion_DEVICE_ADDRESS, CH_PWR_CTRL2, 1, &value, 1);
  1153. value |= 0xfe;
  1154. status = cx231xx_write_i2c_data(dev, Flatrion_DEVICE_ADDRESS,
  1155. CH_PWR_CTRL2, 1, value, 1);
  1156. }
  1157. else {
  1158. status = cx231xx_write_i2c_data(dev, Flatrion_DEVICE_ADDRESS,
  1159. CH_PWR_CTRL2, 1, 0x00, 1);
  1160. }
  1161. return status;
  1162. }
  1163. /* set flatiron for audio input types */
  1164. int cx231xx_flatiron_set_audio_input(struct cx231xx *dev, u8 audio_input)
  1165. {
  1166. int status = 0;
  1167. switch(audio_input) {
  1168. case CX231XX_AMUX_LINE_IN:
  1169. status = cx231xx_write_i2c_data(dev, Flatrion_DEVICE_ADDRESS,
  1170. CH_PWR_CTRL2, 1, 0x00, 1);
  1171. status = cx231xx_write_i2c_data(dev, Flatrion_DEVICE_ADDRESS,
  1172. CH_PWR_CTRL1, 1, 0x80, 1);
  1173. break;
  1174. case CX231XX_AMUX_VIDEO:
  1175. default:
  1176. break;
  1177. }
  1178. dev->ctl_ainput = audio_input;
  1179. return status;
  1180. }
  1181. /*************************************************************************************
  1182. * P O W E R C O N T R O L functions *
  1183. *************************************************************************************/
  1184. int cx231xx_set_power_mode(struct cx231xx *dev, AV_MODE mode)
  1185. {
  1186. u8 value[4] ={0,0,0,0};
  1187. u32 tmp = 0;
  1188. int status = 0;
  1189. if(dev->power_mode != mode)
  1190. dev->power_mode = mode;
  1191. else {
  1192. cx231xx_info(" setPowerMode::mode = %d, No Change req.\n",mode);
  1193. return 0;
  1194. }
  1195. cx231xx_info(" setPowerMode::mode = %d\n",mode);
  1196. status = cx231xx_read_ctrl_reg(dev,VRT_GET_REGISTER, PWR_CTL_EN, value, 4);
  1197. if(status < 0)
  1198. return status;
  1199. tmp = *((u32 *)value);
  1200. switch(mode) {
  1201. case POLARIS_AVMODE_ENXTERNAL_AV:
  1202. tmp &= (~PWR_MODE_MASK);
  1203. tmp |= PWR_AV_EN;
  1204. value[0]=(u8)tmp;
  1205. value[1]=(u8)(tmp>>8);
  1206. value[2]=(u8)(tmp>>16);
  1207. value[3]=(u8)(tmp>>24);
  1208. status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
  1209. msleep(PWR_SLEEP_INTERVAL);
  1210. tmp |= PWR_ISO_EN;
  1211. value[0]=(u8)tmp;
  1212. value[1]=(u8)(tmp>>8);
  1213. value[2]=(u8)(tmp>>16);
  1214. value[3]=(u8)(tmp>>24);
  1215. status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
  1216. msleep(PWR_SLEEP_INTERVAL);
  1217. tmp |=POLARIS_AVMODE_ENXTERNAL_AV;
  1218. value[0]=(u8)tmp;
  1219. value[1]=(u8)(tmp>>8);
  1220. value[2]=(u8)(tmp>>16);
  1221. value[3]=(u8)(tmp>>24);
  1222. status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
  1223. dev->xc_fw_load_done = 0; /* reset state of xceive tuner */
  1224. break;
  1225. case POLARIS_AVMODE_ANALOGT_TV:
  1226. tmp &= (~PWR_DEMOD_EN);
  1227. tmp |= (I2C_DEMOD_EN);
  1228. value[0]=(u8)tmp;
  1229. value[1]=(u8)(tmp>>8);
  1230. value[2]=(u8)(tmp>>16);
  1231. value[3]=(u8)(tmp>>24);
  1232. status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
  1233. msleep(PWR_SLEEP_INTERVAL);
  1234. if(!(tmp & PWR_TUNER_EN)) {
  1235. tmp |= (PWR_TUNER_EN);
  1236. value[0]=(u8)tmp;
  1237. value[1]=(u8)(tmp>>8);
  1238. value[2]=(u8)(tmp>>16);
  1239. value[3]=(u8)(tmp>>24);
  1240. status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
  1241. msleep(PWR_SLEEP_INTERVAL);
  1242. }
  1243. if(!(tmp & PWR_AV_EN)) {
  1244. tmp |= PWR_AV_EN;
  1245. value[0]=(u8)tmp;
  1246. value[1]=(u8)(tmp>>8);
  1247. value[2]=(u8)(tmp>>16);
  1248. value[3]=(u8)(tmp>>24);
  1249. status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
  1250. msleep(PWR_SLEEP_INTERVAL);
  1251. }
  1252. if(!(tmp & PWR_ISO_EN )) {
  1253. tmp |= PWR_ISO_EN;
  1254. value[0]=(u8)tmp;
  1255. value[1]=(u8)(tmp>>8);
  1256. value[2]=(u8)(tmp>>16);
  1257. value[3]=(u8)(tmp>>24);
  1258. status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
  1259. msleep(PWR_SLEEP_INTERVAL);
  1260. }
  1261. if(!(tmp & POLARIS_AVMODE_ANALOGT_TV )) {
  1262. tmp |= POLARIS_AVMODE_ANALOGT_TV;
  1263. value[0]=(u8)tmp;
  1264. value[1]=(u8)(tmp>>8);
  1265. value[2]=(u8)(tmp>>16);
  1266. value[3]=(u8)(tmp>>24);
  1267. status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
  1268. msleep(PWR_SLEEP_INTERVAL);
  1269. }
  1270. if( (dev->model == CX231XX_BOARD_CNXT_RDE_250) ||
  1271. (dev->model == CX231XX_BOARD_CNXT_RDU_250)) {
  1272. /* tuner path to channel 1 from port 3 */
  1273. cx231xx_enable_i2c_for_tuner(dev, I2C_3);
  1274. if(dev->cx231xx_reset_analog_tuner)
  1275. dev->cx231xx_reset_analog_tuner(dev);
  1276. }
  1277. break;
  1278. case POLARIS_AVMODE_DIGITAL:
  1279. if(!(tmp & PWR_TUNER_EN)) {
  1280. tmp |= (PWR_TUNER_EN);
  1281. value[0]=(u8)tmp;
  1282. value[1]=(u8)(tmp>>8);
  1283. value[2]=(u8)(tmp>>16);
  1284. value[3]=(u8)(tmp>>24);
  1285. status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
  1286. msleep(PWR_SLEEP_INTERVAL);
  1287. }
  1288. if(!(tmp & PWR_AV_EN)) {
  1289. tmp |= PWR_AV_EN;
  1290. value[0]=(u8)tmp;
  1291. value[1]=(u8)(tmp>>8);
  1292. value[2]=(u8)(tmp>>16);
  1293. value[3]=(u8)(tmp>>24);
  1294. status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
  1295. msleep(PWR_SLEEP_INTERVAL);
  1296. }
  1297. if(!(tmp & PWR_ISO_EN)) {
  1298. tmp |= PWR_ISO_EN;
  1299. value[0]=(u8)tmp;
  1300. value[1]=(u8)(tmp>>8);
  1301. value[2]=(u8)(tmp>>16);
  1302. value[3]=(u8)(tmp>>24);
  1303. status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
  1304. msleep(PWR_SLEEP_INTERVAL);
  1305. }
  1306. tmp |= POLARIS_AVMODE_DIGITAL|I2C_DEMOD_EN;
  1307. value[0]=(u8)tmp;
  1308. value[1]=(u8)(tmp>>8);
  1309. value[2]=(u8)(tmp>>16);
  1310. value[3]=(u8)(tmp>>24);
  1311. status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
  1312. msleep(PWR_SLEEP_INTERVAL);
  1313. if(!(tmp & PWR_DEMOD_EN)) {
  1314. tmp |= PWR_DEMOD_EN;
  1315. value[0]=(u8)tmp;
  1316. value[1]=(u8)(tmp>>8);
  1317. value[2]=(u8)(tmp>>16);
  1318. value[3]=(u8)(tmp>>24);
  1319. status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
  1320. msleep(PWR_SLEEP_INTERVAL);
  1321. }
  1322. if( (dev->model == CX231XX_BOARD_CNXT_RDE_250) ||
  1323. (dev->model == CX231XX_BOARD_CNXT_RDU_250)) {
  1324. /* tuner path to channel 1 from port 3 */
  1325. cx231xx_enable_i2c_for_tuner(dev, I2C_3);
  1326. if(dev->cx231xx_reset_analog_tuner)
  1327. dev->cx231xx_reset_analog_tuner(dev);
  1328. }
  1329. break;
  1330. default:
  1331. break;
  1332. }
  1333. msleep(PWR_SLEEP_INTERVAL);
  1334. /* For power saving, only enable Pwr_resetout_n when digital TV is selected. */
  1335. if(mode == POLARIS_AVMODE_DIGITAL) {
  1336. tmp |= PWR_RESETOUT_EN;
  1337. value[0]=(u8)tmp;
  1338. value[1]=(u8)(tmp>>8);
  1339. value[2]=(u8)(tmp>>16);
  1340. value[3]=(u8)(tmp>>24);
  1341. status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
  1342. msleep(PWR_SLEEP_INTERVAL);
  1343. }
  1344. /* update power control for colibri */
  1345. status = cx231xx_colibri_update_power_control(dev, mode);
  1346. /* update power control for flatiron */
  1347. status = cx231xx_flatiron_update_power_control(dev, mode);
  1348. status = cx231xx_read_ctrl_reg(dev,VRT_GET_REGISTER, PWR_CTL_EN, value, 4);
  1349. cx231xx_info(" The data of PWR_CTL_EN register 0x74=0x%0x,0x%0x,0x%0x,0x%0x\n",value[0],value[1],value[2],value[3]);
  1350. return status;
  1351. }
  1352. int cx231xx_power_suspend(struct cx231xx *dev)
  1353. {
  1354. u8 value[4] ={0,0,0,0};
  1355. u32 tmp = 0;
  1356. int status = 0;
  1357. status = cx231xx_read_ctrl_reg(dev,VRT_GET_REGISTER, PWR_CTL_EN, value, 4);
  1358. if(status > 0)
  1359. return status;
  1360. tmp = *((u32 *)value);
  1361. tmp &= (~PWR_MODE_MASK);
  1362. value[0]=(u8)tmp;
  1363. value[1]=(u8)(tmp>>8);
  1364. value[2]=(u8)(tmp>>16);
  1365. value[3]=(u8)(tmp>>24);
  1366. status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, PWR_CTL_EN,value,4);
  1367. return status;
  1368. }
  1369. /*************************************************************************************
  1370. * S T R E A M C O N T R O L functions *
  1371. *************************************************************************************/
  1372. int cx231xx_start_stream(struct cx231xx *dev, u32 ep_mask)
  1373. {
  1374. u8 value[4] = {0x0, 0x0, 0x0, 0x0};
  1375. u32 tmp =0;
  1376. int status = 0;
  1377. cx231xx_info("cx231xx_start_stream():: ep_mask = %x\n", ep_mask);
  1378. status = cx231xx_read_ctrl_reg(dev,VRT_GET_REGISTER, EP_MODE_SET,value,4);
  1379. if(status < 0)
  1380. return status;
  1381. tmp = *((u32 *)value);
  1382. tmp |= ep_mask;
  1383. value[0]=(u8) tmp;
  1384. value[1]=(u8)(tmp>>8);
  1385. value[2]=(u8)(tmp>>16);
  1386. value[3]=(u8)(tmp>>24);
  1387. status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, EP_MODE_SET,value,4);
  1388. return status;
  1389. }
  1390. int cx231xx_stop_stream(struct cx231xx *dev, u32 ep_mask)
  1391. {
  1392. u8 value[4] = {0x0, 0x0, 0x0, 0x0};
  1393. u32 tmp =0;
  1394. int status = 0;
  1395. cx231xx_info("cx231xx_stop_stream():: ep_mask = %x\n", ep_mask);
  1396. status = cx231xx_read_ctrl_reg(dev,VRT_GET_REGISTER, EP_MODE_SET,value,4);
  1397. if(status < 0)
  1398. return status;
  1399. tmp = *((u32 *)value);
  1400. tmp&= (~ep_mask);
  1401. value[0]=(u8) tmp;
  1402. value[1]=(u8)(tmp>>8);
  1403. value[2]=(u8)(tmp>>16);
  1404. value[3]=(u8)(tmp>>24);
  1405. status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, EP_MODE_SET,value,4);
  1406. return status;
  1407. }
  1408. int cx231xx_initialize_stream_xfer(struct cx231xx *dev, u32 media_type)
  1409. {
  1410. int status = 0;
  1411. if(dev->udev->speed == USB_SPEED_HIGH)
  1412. {
  1413. switch(media_type)
  1414. {
  1415. case 81: /* audio */
  1416. cx231xx_info("%s: Audio enter HANC\n",__func__);
  1417. status = cx231xx_mode_register(dev, TS_MODE_REG, 0x9300);
  1418. break;
  1419. case 2: /* vbi */
  1420. cx231xx_info("%s: set vanc registers\n",__func__);
  1421. status = cx231xx_mode_register(dev, TS_MODE_REG, 0x300);
  1422. break;
  1423. case 3: /* sliced cc */
  1424. cx231xx_info("%s: set hanc registers\n",__func__);
  1425. status = cx231xx_mode_register(dev, TS_MODE_REG, 0x1300);
  1426. break;
  1427. case 0: /* video */
  1428. cx231xx_info("%s: set video registers\n",__func__);
  1429. status = cx231xx_mode_register(dev, TS_MODE_REG, 0x100);
  1430. break;
  1431. case 4: /* ts1 */
  1432. cx231xx_info("%s: set ts1 registers\n",__func__);
  1433. status = cx231xx_mode_register(dev, TS_MODE_REG, 0x101);
  1434. status = cx231xx_mode_register(dev, TS1_CFG_REG, 0x400);
  1435. break;
  1436. case 6: /* ts1 parallel mode */
  1437. cx231xx_info("%s: set ts1 parrallel mode registers\n",__func__);
  1438. status = cx231xx_mode_register(dev, TS_MODE_REG, 0x100);
  1439. status = cx231xx_mode_register(dev, TS1_CFG_REG, 0x400);
  1440. break;
  1441. }
  1442. }
  1443. else
  1444. {
  1445. status = cx231xx_mode_register(dev, TS_MODE_REG, 0x101);
  1446. }
  1447. return status;
  1448. }
  1449. int cx231xx_capture_start(struct cx231xx *dev, int start, u8 media_type)
  1450. {
  1451. int rc;
  1452. u32 ep_mask = -1;
  1453. PPCB_CONFIG pcb_config;
  1454. /* get EP for media type */
  1455. pcb_config = &dev->current_pcb_config;
  1456. if(pcb_config->config_num==1)
  1457. {
  1458. switch (media_type)
  1459. {
  1460. case 0: /* Video */
  1461. ep_mask =ENABLE_EP4; /* ep4 [00:1000] */
  1462. break;
  1463. case 1: /* Audio */
  1464. ep_mask =ENABLE_EP3; /* ep3 [00:0100] */
  1465. break;
  1466. case 2: /* Vbi */
  1467. ep_mask = ENABLE_EP5; /* ep5 [01:0000] */
  1468. break;
  1469. case 3: /* Sliced_cc */
  1470. ep_mask = ENABLE_EP6; /* ep6 [10:0000] */
  1471. break;
  1472. case 4: /* ts1 */
  1473. case 6: /* ts1 parallel mode */
  1474. ep_mask = ENABLE_EP1; /* ep1 [00:0001] */
  1475. break;
  1476. case 5: /* ts2 */
  1477. ep_mask = ENABLE_EP2; /* ep2 [00:0010] */
  1478. break;
  1479. }
  1480. }
  1481. else if(pcb_config->config_num>1)
  1482. {
  1483. switch (media_type)
  1484. {
  1485. case 0: /* Video */
  1486. ep_mask = ENABLE_EP4; /* ep4 [00:1000] */
  1487. break;
  1488. case 1: /* Audio */
  1489. ep_mask = ENABLE_EP3; /* ep3 [00:0100] */
  1490. break;
  1491. case 2: /* Vbi */
  1492. ep_mask = ENABLE_EP5; /* ep5 [01:0000] */
  1493. break;
  1494. case 3: /* Sliced_cc */
  1495. ep_mask = ENABLE_EP6; /* ep6 [10:0000] */
  1496. break;
  1497. case 4: /* ts1 */
  1498. case 6: /* ts1 parallel mode */
  1499. ep_mask = ENABLE_EP1; /* ep1 [00:0001] */
  1500. break;
  1501. case 5: /* ts2 */
  1502. ep_mask = ENABLE_EP2; /* ep2 [00:0010] */
  1503. break;
  1504. }
  1505. }
  1506. if(start) {
  1507. rc = cx231xx_initialize_stream_xfer(dev, media_type);
  1508. if(rc < 0) {
  1509. return rc;
  1510. }
  1511. /* enable video capture */
  1512. if(ep_mask > 0 )
  1513. rc = cx231xx_start_stream(dev, ep_mask);
  1514. }
  1515. else {
  1516. /* disable video capture */
  1517. if(ep_mask > 0 )
  1518. rc = cx231xx_stop_stream(dev, ep_mask);
  1519. }
  1520. if (dev->mode == CX231XX_ANALOG_MODE){
  1521. /* do any in Analog mode */
  1522. }
  1523. else {
  1524. /* do any in digital mode */
  1525. }
  1526. return rc;
  1527. }
  1528. EXPORT_SYMBOL_GPL(cx231xx_capture_start);
  1529. /************************************************************************************
  1530. * G P I O B I T control functions *
  1531. *************************************************************************************/
  1532. int cx231xx_set_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u8* gpio_val)
  1533. {
  1534. int status = 0;
  1535. status = cx231xx_send_gpio_cmd(dev, gpio_bit, gpio_val, 4, 0, 0);
  1536. return status;
  1537. }
  1538. int cx231xx_get_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u8* gpio_val)
  1539. {
  1540. int status = 0;
  1541. status = cx231xx_send_gpio_cmd(dev, gpio_bit, gpio_val, 4, 0, 1);
  1542. return status;
  1543. }
  1544. /*
  1545. * cx231xx_set_gpio_direction
  1546. * Sets the direction of the GPIO pin to input or output
  1547. *
  1548. * Parameters :
  1549. * pin_number : The GPIO Pin number to program the direction for
  1550. * from 0 to 31
  1551. * pin_value : The Direction of the GPIO Pin under reference.
  1552. * 0 = Input direction
  1553. * 1 = Output direction
  1554. */
  1555. int cx231xx_set_gpio_direction(struct cx231xx *dev,
  1556. int pin_number,
  1557. int pin_value)
  1558. {
  1559. int status = 0;
  1560. u32 value = 0;
  1561. /* Check for valid pin_number - if 32 , bail out */
  1562. if (pin_number >= 32) {
  1563. return -EINVAL;
  1564. }
  1565. if (pin_value == 0) { /* input */
  1566. value = dev->gpio_dir &(~(1<<pin_number)) ; /* clear */
  1567. } else {
  1568. value = dev->gpio_dir | (1<<pin_number) ;
  1569. }
  1570. status = cx231xx_set_gpio_bit(dev, value, (u8*) & dev->gpio_val);
  1571. /* cache the value for future */
  1572. dev->gpio_dir = value;
  1573. return status;
  1574. }
  1575. /*
  1576. * SetGpioPinLogicValue
  1577. * Sets the value of the GPIO pin to Logic high or low. The Pin under
  1578. * reference should ALREADY BE SET IN OUTPUT MODE !!!!!!!!!
  1579. *
  1580. * Parameters :
  1581. * pin_number : The GPIO Pin number to program the direction for
  1582. * pin_value : The value of the GPIO Pin under reference.
  1583. * 0 = set it to 0
  1584. * 1 = set it to 1
  1585. */
  1586. int cx231xx_set_gpio_value(struct cx231xx *dev,
  1587. int pin_number,
  1588. int pin_value)
  1589. {
  1590. int status = 0;
  1591. u32 value = 0;
  1592. /* Check for valid pin_number - if 0xFF , bail out */
  1593. if (pin_number >= 32)
  1594. return -EINVAL;
  1595. /* first do a sanity check - if the Pin is not output, make it output */
  1596. if ((dev->gpio_dir & (1<<pin_number)) == 0x00)
  1597. {
  1598. /* It was in input mode */
  1599. value = dev->gpio_dir | (1<<pin_number) ;
  1600. dev->gpio_dir = value;
  1601. status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1602. value = 0;
  1603. }
  1604. if (pin_value == 0) {
  1605. value = dev->gpio_val & (~(1<<pin_number));
  1606. } else {
  1607. value = dev->gpio_val | (1<<pin_number);
  1608. }
  1609. /* store the value */
  1610. dev->gpio_val=value;
  1611. /* toggle bit0 of GP_IO */
  1612. status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1613. return status;
  1614. }
  1615. /************************************************************************************
  1616. * G P I O I2C related functions *
  1617. *************************************************************************************/
  1618. int cx231xx_gpio_i2c_start(struct cx231xx *dev)
  1619. {
  1620. int status = 0;
  1621. /* set SCL to output 1 ; set SDA to output 1 */
  1622. dev->gpio_dir |= 1<< dev->board.tuner_scl_gpio;
  1623. dev->gpio_dir |= 1<<dev->board.tuner_sda_gpio;
  1624. dev->gpio_val |= 1<<dev->board.tuner_scl_gpio;
  1625. dev->gpio_val |= 1<<dev->board.tuner_sda_gpio;
  1626. status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1627. if(status < 0){
  1628. return -EINVAL;
  1629. }
  1630. /* set SCL to output 1; set SDA to output 0 */
  1631. dev->gpio_val |= 1<<dev->board.tuner_scl_gpio;
  1632. dev->gpio_val &= ~(1<<dev->board.tuner_sda_gpio);
  1633. status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1634. if(status < 0){
  1635. return -EINVAL;
  1636. }
  1637. /* set SCL to output 0; set SDA to output 0 */
  1638. dev->gpio_val &= ~(1<<dev->board.tuner_scl_gpio);
  1639. dev->gpio_val &= ~(1<<dev->board.tuner_sda_gpio);
  1640. status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1641. if(status < 0){
  1642. return -EINVAL;
  1643. }
  1644. return status;
  1645. }
  1646. int cx231xx_gpio_i2c_end(struct cx231xx *dev)
  1647. {
  1648. int status = 0;
  1649. /* set SCL to output 0; set SDA to output 0 */
  1650. dev->gpio_dir |= 1<<dev->board.tuner_scl_gpio;
  1651. dev->gpio_dir |= 1<<dev->board.tuner_sda_gpio;
  1652. dev->gpio_val &= ~(1<<dev->board.tuner_scl_gpio);
  1653. dev->gpio_val &= ~(1<<dev->board.tuner_sda_gpio);
  1654. status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1655. if(status < 0){
  1656. return -EINVAL;
  1657. }
  1658. /* set SCL to output 1; set SDA to output 0 */
  1659. dev->gpio_val |= 1<<dev->board.tuner_scl_gpio;
  1660. dev->gpio_val &= ~(1<<dev->board.tuner_sda_gpio);
  1661. status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1662. if(status < 0){
  1663. return -EINVAL;
  1664. }
  1665. /* set SCL to input ,release SCL cable control
  1666. set SDA to input ,release SDA cable control */
  1667. dev->gpio_dir &= ~(1<<dev->board.tuner_scl_gpio);
  1668. dev->gpio_dir &= ~(1<<dev->board.tuner_sda_gpio);
  1669. status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1670. if(status < 0){
  1671. return -EINVAL;
  1672. }
  1673. return status;
  1674. }
  1675. int cx231xx_gpio_i2c_write_byte(struct cx231xx *dev, u8 data)
  1676. {
  1677. int status = 0;
  1678. u8 i;
  1679. /* set SCL to output ; set SDA to output */
  1680. dev->gpio_dir |= 1<<dev->board.tuner_scl_gpio;
  1681. dev->gpio_dir |= 1<<dev->board.tuner_sda_gpio;
  1682. for(i = 0;i<8;i++) {
  1683. if(((data<<i) & 0x80) == 0) {
  1684. /* set SCL to output 0; set SDA to output 0 */
  1685. dev->gpio_val &= ~(1<<dev->board.tuner_scl_gpio);
  1686. dev->gpio_val &= ~(1<<dev->board.tuner_sda_gpio);
  1687. status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1688. /* set SCL to output 1; set SDA to output 0 */
  1689. dev->gpio_val |= 1<<dev->board.tuner_scl_gpio;
  1690. status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1691. /* set SCL to output 0; set SDA to output 0 */
  1692. dev->gpio_val &= ~(1<<dev->board.tuner_scl_gpio);
  1693. status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1694. } else {
  1695. /* set SCL to output 0; set SDA to output 1 */
  1696. dev->gpio_val &= ~(1<<dev->board.tuner_scl_gpio);
  1697. dev->gpio_val |= 1<<dev->board.tuner_sda_gpio;
  1698. status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1699. /* set SCL to output 1; set SDA to output 1 */
  1700. dev->gpio_val |= 1<<dev->board.tuner_scl_gpio;
  1701. status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1702. /* set SCL to output 0; set SDA to output 1 */
  1703. dev->gpio_val &= ~(1<<dev->board.tuner_scl_gpio);
  1704. status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1705. }
  1706. }
  1707. return status;
  1708. }
  1709. int cx231xx_gpio_i2c_read_byte(struct cx231xx *dev, u8 *buf)
  1710. {
  1711. u8 value = 0;
  1712. int status = 0;
  1713. u32 gpio_logic_value =0;
  1714. u8 i;
  1715. /* read byte */
  1716. for(i=0;i<8;i++) { /* send write I2c addr */
  1717. /* set SCL to output 0; set SDA to input */
  1718. dev->gpio_val &= ~(1<<dev->board.tuner_scl_gpio);
  1719. status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1720. /* set SCL to output 1; set SDA to input */
  1721. dev->gpio_val |= 1<<dev->board.tuner_scl_gpio;
  1722. status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1723. /* get SDA data bit */
  1724. gpio_logic_value = dev->gpio_val;
  1725. status = cx231xx_get_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1726. if((dev->gpio_val & (1<<dev->board.tuner_sda_gpio)) != 0) {
  1727. value |= (1<<(8-i-1));
  1728. }
  1729. dev->gpio_val = gpio_logic_value;
  1730. }
  1731. /* set SCL to output 0,finish the read latest SCL signal.
  1732. !!!set SDA to input,never to modify SDA direction at the same times */
  1733. dev->gpio_val &= ~(1<<dev->board.tuner_scl_gpio);
  1734. status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1735. /* store the value */
  1736. *buf = value & 0xff;
  1737. return status;
  1738. }
  1739. int cx231xx_gpio_i2c_read_ack(struct cx231xx *dev)
  1740. {
  1741. int status = 0;
  1742. u32 gpio_logic_value = 0;
  1743. int nCnt=10;
  1744. int nInit=nCnt;
  1745. /* clock stretch; set SCL to input; set SDA to input; get SCL value till SCL = 1 */
  1746. dev->gpio_dir &= ~(1<<dev->board.tuner_sda_gpio);
  1747. dev->gpio_dir &= ~(1<<dev->board.tuner_scl_gpio);
  1748. gpio_logic_value = dev->gpio_val;
  1749. status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1750. do{
  1751. msleep(2);
  1752. status = cx231xx_get_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1753. nCnt--;
  1754. }while(((dev->gpio_val & (1<<dev->board.tuner_scl_gpio)) == 0) && (nCnt>0));
  1755. if(nCnt==0) {
  1756. cx231xx_info("No ACK after %d msec for clock stretch. GPIO I2C operation failed!",nInit*10);
  1757. }
  1758. /* readAck
  1759. throuth clock stretch ,slave has given a SCL signal,so the SDA data can be directly read. */
  1760. status = cx231xx_get_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1761. if((dev->gpio_val & 1<< dev->board.tuner_sda_gpio) == 0){
  1762. dev->gpio_val = gpio_logic_value;
  1763. dev->gpio_val &= ~(1<< dev->board.tuner_sda_gpio);
  1764. status = 0;
  1765. } else {
  1766. dev->gpio_val = gpio_logic_value;
  1767. dev->gpio_val |= (1<< dev->board.tuner_sda_gpio);
  1768. }
  1769. /* read SDA end, set the SCL to output 0, after this operation, SDA direction can be changed. */
  1770. dev->gpio_val = gpio_logic_value;
  1771. dev->gpio_dir |= (1<<dev->board.tuner_scl_gpio);
  1772. dev->gpio_val &= ~(1<<dev->board.tuner_scl_gpio);
  1773. status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1774. return status;
  1775. }
  1776. int cx231xx_gpio_i2c_write_ack(struct cx231xx *dev)
  1777. {
  1778. int status = 0;
  1779. /* set SDA to ouput */
  1780. dev->gpio_dir |= 1<<dev->board.tuner_sda_gpio;
  1781. status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1782. /* set SCL = 0 (output); set SDA = 0 (output) */
  1783. dev->gpio_val &= ~(1<<dev->board.tuner_sda_gpio);
  1784. dev->gpio_val &= ~(1<<dev->board.tuner_scl_gpio);
  1785. status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1786. /* set SCL = 1 (output); set SDA = 0 (output) */
  1787. dev->gpio_val |= 1<<dev->board.tuner_scl_gpio;
  1788. status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1789. /* set SCL = 0 (output); set SDA = 0 (output) */
  1790. dev->gpio_val &= ~(1<<dev->board.tuner_scl_gpio);
  1791. status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1792. /* set SDA to input,and then the slave will read data from SDA. */
  1793. dev->gpio_dir &= ~(1<<dev->board.tuner_sda_gpio);
  1794. status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1795. return status;
  1796. }
  1797. int cx231xx_gpio_i2c_write_nak(struct cx231xx *dev)
  1798. {
  1799. int status = 0;
  1800. /* set scl to output ; set sda to input */
  1801. dev->gpio_dir |= 1<<dev->board.tuner_scl_gpio;
  1802. dev->gpio_dir &= ~(1<<dev->board.tuner_sda_gpio);
  1803. status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1804. /* set scl to output 0; set sda to input */
  1805. dev->gpio_val &= ~(1<<dev->board.tuner_scl_gpio);
  1806. status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1807. /* set scl to output 1; set sda to input */
  1808. dev->gpio_val |= 1<<dev->board.tuner_scl_gpio;
  1809. status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8*) &dev->gpio_val);
  1810. return status;
  1811. }
  1812. /************************************************************************************
  1813. * G P I O I2C related functions *
  1814. *************************************************************************************/
  1815. /* cx231xx_gpio_i2c_read
  1816. * Function to read data from gpio based I2C interface
  1817. */
  1818. int cx231xx_gpio_i2c_read(struct cx231xx *dev, u8 dev_addr, u8 *buf ,u8 len)
  1819. {
  1820. int status = 0;
  1821. int i = 0;
  1822. /* get the lock */
  1823. mutex_lock(&dev->gpio_i2c_lock);
  1824. /* start */
  1825. status = cx231xx_gpio_i2c_start(dev);
  1826. /* write dev_addr */
  1827. status = cx231xx_gpio_i2c_write_byte(dev, (dev_addr << 1) +1);
  1828. /* readAck */
  1829. status = cx231xx_gpio_i2c_read_ack(dev);
  1830. /* read data */
  1831. for(i = 0; i < len; i++ ) {
  1832. /* read data */
  1833. buf[i] = 0;
  1834. status = cx231xx_gpio_i2c_read_byte(dev, & buf[i]);
  1835. if( (i+1) != len) {
  1836. /* only do write ack if we more length */
  1837. status = cx231xx_gpio_i2c_write_ack(dev);
  1838. }
  1839. }
  1840. /* write NAK - inform reads are complete */
  1841. status = cx231xx_gpio_i2c_write_nak(dev);
  1842. /* write end */
  1843. status = cx231xx_gpio_i2c_end(dev);
  1844. /* release the lock */
  1845. mutex_unlock(&dev->gpio_i2c_lock);
  1846. return status;
  1847. }
  1848. /* cx231xx_gpio_i2c_write
  1849. * Function to write data to gpio based I2C interface
  1850. */
  1851. int cx231xx_gpio_i2c_write(struct cx231xx *dev, u8 dev_addr, u8 *buf ,u8 len)
  1852. {
  1853. int status = 0;
  1854. int i=0;
  1855. /* get the lock */
  1856. mutex_lock(&dev->gpio_i2c_lock);
  1857. /* start */
  1858. status = cx231xx_gpio_i2c_start(dev);
  1859. /* write dev_addr */
  1860. status = cx231xx_gpio_i2c_write_byte(dev, dev_addr << 1);
  1861. /* read Ack */
  1862. status = cx231xx_gpio_i2c_read_ack(dev);
  1863. for(i = 0; i < len; i++ ) {
  1864. /* Write data */
  1865. status = cx231xx_gpio_i2c_write_byte(dev, buf[i]);
  1866. /* read Ack */
  1867. status = cx231xx_gpio_i2c_read_ack(dev);
  1868. }
  1869. /* write End */
  1870. status = cx231xx_gpio_i2c_end(dev);
  1871. /* release the lock */
  1872. mutex_unlock(&dev->gpio_i2c_lock);
  1873. return 0;
  1874. }