tuner-simple.c 26 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031
  1. /*
  2. *
  3. * i2c tv tuner chip device driver
  4. * controls all those simple 4-control-bytes style tuners.
  5. */
  6. #include <linux/delay.h>
  7. #include <linux/i2c.h>
  8. #include <linux/videodev.h>
  9. #include <media/tuner.h>
  10. /* ---------------------------------------------------------------------- */
  11. /* tv standard selection for Temic 4046 FM5
  12. this value takes the low bits of control byte 2
  13. from datasheet Rev.01, Feb.00
  14. standard BG I L L2 D
  15. picture IF 38.9 38.9 38.9 33.95 38.9
  16. sound 1 33.4 32.9 32.4 40.45 32.4
  17. sound 2 33.16
  18. NICAM 33.05 32.348 33.05 33.05
  19. */
  20. #define TEMIC_SET_PAL_I 0x05
  21. #define TEMIC_SET_PAL_DK 0x09
  22. #define TEMIC_SET_PAL_L 0x0a // SECAM ?
  23. #define TEMIC_SET_PAL_L2 0x0b // change IF !
  24. #define TEMIC_SET_PAL_BG 0x0c
  25. /* tv tuner system standard selection for Philips FQ1216ME
  26. this value takes the low bits of control byte 2
  27. from datasheet "1999 Nov 16" (supersedes "1999 Mar 23")
  28. standard BG DK I L L`
  29. picture carrier 38.90 38.90 38.90 38.90 33.95
  30. colour 34.47 34.47 34.47 34.47 38.38
  31. sound 1 33.40 32.40 32.90 32.40 40.45
  32. sound 2 33.16 - - - -
  33. NICAM 33.05 33.05 32.35 33.05 39.80
  34. */
  35. #define PHILIPS_SET_PAL_I 0x01 /* Bit 2 always zero !*/
  36. #define PHILIPS_SET_PAL_BGDK 0x09
  37. #define PHILIPS_SET_PAL_L2 0x0a
  38. #define PHILIPS_SET_PAL_L 0x0b
  39. /* system switching for Philips FI1216MF MK2
  40. from datasheet "1996 Jul 09",
  41. standard BG L L'
  42. picture carrier 38.90 38.90 33.95
  43. colour 34.47 34.37 38.38
  44. sound 1 33.40 32.40 40.45
  45. sound 2 33.16 - -
  46. NICAM 33.05 33.05 39.80
  47. */
  48. #define PHILIPS_MF_SET_BG 0x01 /* Bit 2 must be zero, Bit 3 is system output */
  49. #define PHILIPS_MF_SET_PAL_L 0x03 // France
  50. #define PHILIPS_MF_SET_PAL_L2 0x02 // L'
  51. /* Control byte */
  52. #define TUNER_RATIO_MASK 0x06 /* Bit cb1:cb2 */
  53. #define TUNER_RATIO_SELECT_50 0x00
  54. #define TUNER_RATIO_SELECT_32 0x02
  55. #define TUNER_RATIO_SELECT_166 0x04
  56. #define TUNER_RATIO_SELECT_62 0x06
  57. #define TUNER_CHARGE_PUMP 0x40 /* Bit cb6 */
  58. /* Status byte */
  59. #define TUNER_POR 0x80
  60. #define TUNER_FL 0x40
  61. #define TUNER_MODE 0x38
  62. #define TUNER_AFC 0x07
  63. #define TUNER_SIGNAL 0x07
  64. #define TUNER_STEREO 0x10
  65. #define TUNER_PLL_LOCKED 0x40
  66. #define TUNER_STEREO_MK3 0x04
  67. /* ---------------------------------------------------------------------- */
  68. struct tunertype
  69. {
  70. char *name;
  71. unsigned short thresh1; /* band switch VHF_LO <=> VHF_HI */
  72. unsigned short thresh2; /* band switch VHF_HI <=> UHF */
  73. unsigned char VHF_L;
  74. unsigned char VHF_H;
  75. unsigned char UHF;
  76. unsigned char config;
  77. };
  78. /*
  79. * The floats in the tuner struct are computed at compile time
  80. * by gcc and cast back to integers. Thus we don't violate the
  81. * "no float in kernel" rule.
  82. */
  83. static struct tunertype tuners[] = {
  84. /* 0-9 */
  85. [TUNER_TEMIC_PAL] = { /* TEMIC PAL */
  86. .name = "Temic PAL (4002 FH5)",
  87. .thresh1= 16 * 140.25 /*MHz*/,
  88. .thresh2= 16 * 463.25 /*MHz*/,
  89. .VHF_L = 0x02,
  90. .VHF_H = 0x04,
  91. .UHF = 0x01,
  92. .config = 0x8e,
  93. },
  94. [TUNER_PHILIPS_PAL_I] = { /* Philips PAL_I */
  95. .name = "Philips PAL_I (FI1246 and compatibles)",
  96. .thresh1= 16 * 140.25 /*MHz*/,
  97. .thresh2= 16 * 463.25 /*MHz*/,
  98. .VHF_L = 0xa0,
  99. .VHF_H = 0x90,
  100. .UHF = 0x30,
  101. .config = 0x8e,
  102. },
  103. [TUNER_PHILIPS_NTSC] = { /* Philips NTSC */
  104. .name = "Philips NTSC (FI1236,FM1236 and compatibles)",
  105. .thresh1= 16 * 157.25 /*MHz*/,
  106. .thresh2= 16 * 451.25 /*MHz*/,
  107. .VHF_L = 0xa0,
  108. .VHF_H = 0x90,
  109. .UHF = 0x30,
  110. .config = 0x8e,
  111. },
  112. [TUNER_PHILIPS_SECAM] = { /* Philips SECAM */
  113. .name = "Philips (SECAM+PAL_BG) (FI1216MF, FM1216MF, FR1216MF)",
  114. .thresh1= 16 * 168.25 /*MHz*/,
  115. .thresh2= 16 * 447.25 /*MHz*/,
  116. .VHF_L = 0xa7,
  117. .VHF_H = 0x97,
  118. .UHF = 0x37,
  119. .config = 0x8e,
  120. },
  121. [TUNER_ABSENT] = { /* Tuner Absent */
  122. .name = "NoTuner",
  123. .thresh1= 0 /*MHz*/,
  124. .thresh2= 0 /*MHz*/,
  125. .VHF_L = 0x00,
  126. .VHF_H = 0x00,
  127. .UHF = 0x00,
  128. .config = 0x00,
  129. },
  130. [TUNER_PHILIPS_PAL] = { /* Philips PAL */
  131. .name = "Philips PAL_BG (FI1216 and compatibles)",
  132. .thresh1= 16 * 168.25 /*MHz*/,
  133. .thresh2= 16 * 447.25 /*MHz*/,
  134. .VHF_L = 0xa0,
  135. .VHF_H = 0x90,
  136. .UHF = 0x30,
  137. .config = 0x8e,
  138. },
  139. [TUNER_TEMIC_NTSC] = { /* TEMIC NTSC */
  140. .name = "Temic NTSC (4032 FY5)",
  141. .thresh1= 16 * 157.25 /*MHz*/,
  142. .thresh2= 16 * 463.25 /*MHz*/,
  143. .VHF_L = 0x02,
  144. .VHF_H = 0x04,
  145. .UHF = 0x01,
  146. .config = 0x8e,
  147. },
  148. [TUNER_TEMIC_PAL_I] = { /* TEMIC PAL_I */
  149. .name = "Temic PAL_I (4062 FY5)",
  150. .thresh1= 16 * 170.00 /*MHz*/,
  151. .thresh2= 16 * 450.00 /*MHz*/,
  152. .VHF_L = 0x02,
  153. .VHF_H = 0x04,
  154. .UHF = 0x01,
  155. .config = 0x8e,
  156. },
  157. [TUNER_TEMIC_4036FY5_NTSC] = { /* TEMIC NTSC */
  158. .name = "Temic NTSC (4036 FY5)",
  159. .thresh1= 16 * 157.25 /*MHz*/,
  160. .thresh2= 16 * 463.25 /*MHz*/,
  161. .VHF_L = 0xa0,
  162. .VHF_H = 0x90,
  163. .UHF = 0x30,
  164. .config = 0x8e,
  165. },
  166. [TUNER_ALPS_TSBH1_NTSC] = { /* TEMIC NTSC */
  167. .name = "Alps HSBH1",
  168. .thresh1= 16 * 137.25 /*MHz*/,
  169. .thresh2= 16 * 385.25 /*MHz*/,
  170. .VHF_L = 0x01,
  171. .VHF_H = 0x02,
  172. .UHF = 0x08,
  173. .config = 0x8e,
  174. },
  175. /* 10-19 */
  176. [TUNER_ALPS_TSBE1_PAL] = { /* TEMIC PAL */
  177. .name = "Alps TSBE1",
  178. .thresh1= 16 * 137.25 /*MHz*/,
  179. .thresh2= 16 * 385.25 /*MHz*/,
  180. .VHF_L = 0x01,
  181. .VHF_H = 0x02,
  182. .UHF = 0x08,
  183. .config = 0x8e,
  184. },
  185. [TUNER_ALPS_TSBB5_PAL_I] = { /* Alps PAL_I */
  186. .name = "Alps TSBB5",
  187. .thresh1= 16 * 133.25 /*MHz*/,
  188. .thresh2= 16 * 351.25 /*MHz*/,
  189. .VHF_L = 0x01,
  190. .VHF_H = 0x02,
  191. .UHF = 0x08,
  192. .config = 0x8e,
  193. },
  194. [TUNER_ALPS_TSBE5_PAL] = { /* Alps PAL */
  195. .name = "Alps TSBE5",
  196. .thresh1= 16 * 133.25 /*MHz*/,
  197. .thresh2= 16 * 351.25 /*MHz*/,
  198. .VHF_L = 0x01,
  199. .VHF_H = 0x02,
  200. .UHF = 0x08,
  201. .config = 0x8e,
  202. },
  203. [TUNER_ALPS_TSBC5_PAL] = { /* Alps PAL */
  204. .name = "Alps TSBC5",
  205. .thresh1= 16 * 133.25 /*MHz*/,
  206. .thresh2= 16 * 351.25 /*MHz*/,
  207. .VHF_L = 0x01,
  208. .VHF_H = 0x02,
  209. .UHF = 0x08,
  210. .config = 0x8e,
  211. },
  212. [TUNER_TEMIC_4006FH5_PAL] = { /* TEMIC PAL */
  213. .name = "Temic PAL_BG (4006FH5)",
  214. .thresh1= 16 * 170.00 /*MHz*/,
  215. .thresh2= 16 * 450.00 /*MHz*/,
  216. .VHF_L = 0xa0,
  217. .VHF_H = 0x90,
  218. .UHF = 0x30,
  219. .config = 0x8e,
  220. },
  221. [TUNER_ALPS_TSHC6_NTSC] = { /* Alps NTSC */
  222. .name = "Alps TSCH6",
  223. .thresh1= 16 * 137.25 /*MHz*/,
  224. .thresh2= 16 * 385.25 /*MHz*/,
  225. .VHF_L = 0x14,
  226. .VHF_H = 0x12,
  227. .UHF = 0x11,
  228. .config = 0x8e,
  229. },
  230. [TUNER_TEMIC_PAL_DK] = { /* TEMIC PAL */
  231. .name = "Temic PAL_DK (4016 FY5)",
  232. .thresh1= 16 * 168.25 /*MHz*/,
  233. .thresh2= 16 * 456.25 /*MHz*/,
  234. .VHF_L = 0xa0,
  235. .VHF_H = 0x90,
  236. .UHF = 0x30,
  237. .config = 0x8e,
  238. },
  239. [TUNER_PHILIPS_NTSC_M] = { /* Philips NTSC */
  240. .name = "Philips NTSC_M (MK2)",
  241. .thresh1= 16 * 160.00 /*MHz*/,
  242. .thresh2= 16 * 454.00 /*MHz*/,
  243. .VHF_L = 0xa0,
  244. .VHF_H = 0x90,
  245. .UHF = 0x30,
  246. .config = 0x8e,
  247. },
  248. [TUNER_TEMIC_4066FY5_PAL_I] = { /* TEMIC PAL_I */
  249. .name = "Temic PAL_I (4066 FY5)",
  250. .thresh1= 16 * 169.00 /*MHz*/,
  251. .thresh2= 16 * 454.00 /*MHz*/,
  252. .VHF_L = 0xa0,
  253. .VHF_H = 0x90,
  254. .UHF = 0x30,
  255. .config = 0x8e,
  256. },
  257. [TUNER_TEMIC_4006FN5_MULTI_PAL] = { /* TEMIC PAL */
  258. .name = "Temic PAL* auto (4006 FN5)",
  259. .thresh1= 16 * 169.00 /*MHz*/,
  260. .thresh2= 16 * 454.00 /*MHz*/,
  261. .VHF_L = 0xa0,
  262. .VHF_H = 0x90,
  263. .UHF = 0x30,
  264. .config = 0x8e,
  265. },
  266. /* 20-29 */
  267. [TUNER_TEMIC_4009FR5_PAL] = { /* TEMIC PAL */
  268. .name = "Temic PAL_BG (4009 FR5) or PAL_I (4069 FR5)",
  269. .thresh1= 16 * 141.00 /*MHz*/,
  270. .thresh2= 16 * 464.00 /*MHz*/,
  271. .VHF_L = 0xa0,
  272. .VHF_H = 0x90,
  273. .UHF = 0x30,
  274. .config = 0x8e,
  275. },
  276. [TUNER_TEMIC_4039FR5_NTSC] = { /* TEMIC NTSC */
  277. .name = "Temic NTSC (4039 FR5)",
  278. .thresh1= 16 * 158.00 /*MHz*/,
  279. .thresh2= 16 * 453.00 /*MHz*/,
  280. .VHF_L = 0xa0,
  281. .VHF_H = 0x90,
  282. .UHF = 0x30,
  283. .config = 0x8e,
  284. },
  285. [TUNER_TEMIC_4046FM5] = { /* TEMIC PAL */
  286. .name = "Temic PAL/SECAM multi (4046 FM5)",
  287. .thresh1= 16 * 169.00 /*MHz*/,
  288. .thresh2= 16 * 454.00 /*MHz*/,
  289. .VHF_L = 0xa0,
  290. .VHF_H = 0x90,
  291. .UHF = 0x30,
  292. .config = 0x8e,
  293. },
  294. [TUNER_PHILIPS_PAL_DK] = { /* Philips PAL */
  295. .name = "Philips PAL_DK (FI1256 and compatibles)",
  296. .thresh1= 16 * 170.00 /*MHz*/,
  297. .thresh2= 16 * 450.00 /*MHz*/,
  298. .VHF_L = 0xa0,
  299. .VHF_H = 0x90,
  300. .UHF = 0x30,
  301. .config = 0x8e,
  302. },
  303. [TUNER_PHILIPS_FQ1216ME] = { /* Philips PAL */
  304. .name = "Philips PAL/SECAM multi (FQ1216ME)",
  305. .thresh1= 16 * 170.00 /*MHz*/,
  306. .thresh2= 16 * 450.00 /*MHz*/,
  307. .VHF_L = 0xa0,
  308. .VHF_H = 0x90,
  309. .UHF = 0x30,
  310. .config = 0x8e,
  311. },
  312. [TUNER_LG_PAL_I_FM] = { /* LGINNOTEK PAL_I */
  313. .name = "LG PAL_I+FM (TAPC-I001D)",
  314. .thresh1= 16 * 170.00 /*MHz*/,
  315. .thresh2= 16 * 450.00 /*MHz*/,
  316. .VHF_L = 0xa0,
  317. .VHF_H = 0x90,
  318. .UHF = 0x30,
  319. .config = 0x8e,
  320. },
  321. [TUNER_LG_PAL_I] = { /* LGINNOTEK PAL_I */
  322. .name = "LG PAL_I (TAPC-I701D)",
  323. .thresh1= 16 * 170.00 /*MHz*/,
  324. .thresh2= 16 * 450.00 /*MHz*/,
  325. .VHF_L = 0xa0,
  326. .VHF_H = 0x90,
  327. .UHF = 0x30,
  328. .config = 0x8e,
  329. },
  330. [TUNER_LG_NTSC_FM] = { /* LGINNOTEK NTSC */
  331. .name = "LG NTSC+FM (TPI8NSR01F)",
  332. .thresh1= 16 * 210.00 /*MHz*/,
  333. .thresh2= 16 * 497.00 /*MHz*/,
  334. .VHF_L = 0xa0,
  335. .VHF_H = 0x90,
  336. .UHF = 0x30,
  337. .config = 0x8e,
  338. },
  339. [TUNER_LG_PAL_FM] = { /* LGINNOTEK PAL */
  340. .name = "LG PAL_BG+FM (TPI8PSB01D)",
  341. .thresh1= 16 * 170.00 /*MHz*/,
  342. .thresh2= 16 * 450.00 /*MHz*/,
  343. .VHF_L = 0xa0,
  344. .VHF_H = 0x90,
  345. .UHF = 0x30,
  346. .config = 0x8e,
  347. },
  348. [TUNER_LG_PAL] = { /* LGINNOTEK PAL */
  349. .name = "LG PAL_BG (TPI8PSB11D)",
  350. .thresh1= 16 * 170.00 /*MHz*/,
  351. .thresh2= 16 * 450.00 /*MHz*/,
  352. .VHF_L = 0xa0,
  353. .VHF_H = 0x90,
  354. .UHF = 0x30,
  355. .config = 0x8e,
  356. },
  357. /* 30-39 */
  358. [TUNER_TEMIC_4009FN5_MULTI_PAL_FM] = { /* TEMIC PAL */
  359. .name = "Temic PAL* auto + FM (4009 FN5)",
  360. .thresh1= 16 * 141.00 /*MHz*/,
  361. .thresh2= 16 * 464.00 /*MHz*/,
  362. .VHF_L = 0xa0,
  363. .VHF_H = 0x90,
  364. .UHF = 0x30,
  365. .config = 0x8e,
  366. },
  367. [TUNER_SHARP_2U5JF5540_NTSC] = { /* SHARP NTSC */
  368. .name = "SHARP NTSC_JP (2U5JF5540)",
  369. .thresh1= 16 * 137.25 /*MHz*/,
  370. .thresh2= 16 * 317.25 /*MHz*/,
  371. .VHF_L = 0x01,
  372. .VHF_H = 0x02,
  373. .UHF = 0x08,
  374. .config = 0x8e,
  375. },
  376. [TUNER_Samsung_PAL_TCPM9091PD27] = { /* Samsung PAL */
  377. .name = "Samsung PAL TCPM9091PD27",
  378. .thresh1= 16 * 169 /*MHz*/,
  379. .thresh2= 16 * 464 /*MHz*/,
  380. .VHF_L = 0xa0,
  381. .VHF_H = 0x90,
  382. .UHF = 0x30,
  383. .config = 0x8e,
  384. },
  385. [TUNER_MT2032] = { /* Microtune PAL|NTSC */
  386. .name = "MT20xx universal",
  387. /* see mt20xx.c for details */ },
  388. [TUNER_TEMIC_4106FH5] = { /* TEMIC PAL */
  389. .name = "Temic PAL_BG (4106 FH5)",
  390. .thresh1= 16 * 141.00 /*MHz*/,
  391. .thresh2= 16 * 464.00 /*MHz*/,
  392. .VHF_L = 0xa0,
  393. .VHF_H = 0x90,
  394. .UHF = 0x30,
  395. .config = 0x8e,
  396. },
  397. [TUNER_TEMIC_4012FY5] = { /* TEMIC PAL */
  398. .name = "Temic PAL_DK/SECAM_L (4012 FY5)",
  399. .thresh1= 16 * 140.25 /*MHz*/,
  400. .thresh2= 16 * 463.25 /*MHz*/,
  401. .VHF_L = 0x02,
  402. .VHF_H = 0x04,
  403. .UHF = 0x01,
  404. .config = 0x8e,
  405. },
  406. [TUNER_TEMIC_4136FY5] = { /* TEMIC NTSC */
  407. .name = "Temic NTSC (4136 FY5)",
  408. .thresh1= 16 * 158.00 /*MHz*/,
  409. .thresh2= 16 * 453.00 /*MHz*/,
  410. .VHF_L = 0xa0,
  411. .VHF_H = 0x90,
  412. .UHF = 0x30,
  413. .config = 0x8e,
  414. },
  415. [TUNER_LG_PAL_NEW_TAPC] = { /* LGINNOTEK PAL */
  416. .name = "LG PAL (newer TAPC series)",
  417. .thresh1= 16 * 170.00 /*MHz*/,
  418. .thresh2= 16 * 450.00 /*MHz*/,
  419. .VHF_L = 0x01,
  420. .VHF_H = 0x02,
  421. .UHF = 0x08,
  422. .config = 0x8e,
  423. },
  424. [TUNER_PHILIPS_FM1216ME_MK3] = { /* Philips PAL */
  425. .name = "Philips PAL/SECAM multi (FM1216ME MK3)",
  426. .thresh1= 16 * 158.00 /*MHz*/,
  427. .thresh2= 16 * 442.00 /*MHz*/,
  428. .VHF_L = 0x01,
  429. .VHF_H = 0x02,
  430. .UHF = 0x04,
  431. .config = 0x8e,
  432. },
  433. [TUNER_LG_NTSC_NEW_TAPC] = { /* LGINNOTEK NTSC */
  434. .name = "LG NTSC (newer TAPC series)",
  435. .thresh1= 16 * 170.00 /*MHz*/,
  436. .thresh2= 16 * 450.00 /*MHz*/,
  437. .VHF_L = 0x01,
  438. .VHF_H = 0x02,
  439. .UHF = 0x08,
  440. .config = 0x8e,
  441. },
  442. /* 40-49 */
  443. [TUNER_HITACHI_NTSC] = { /* HITACHI NTSC */
  444. .name = "HITACHI V7-J180AT",
  445. .thresh1= 16 * 170.00 /*MHz*/,
  446. .thresh2= 16 * 450.00 /*MHz*/,
  447. .VHF_L = 0x01,
  448. .VHF_H = 0x02,
  449. .UHF = 0x08,
  450. .config = 0x8e,
  451. },
  452. [TUNER_PHILIPS_PAL_MK] = { /* Philips PAL */
  453. .name = "Philips PAL_MK (FI1216 MK)",
  454. .thresh1= 16 * 140.25 /*MHz*/,
  455. .thresh2= 16 * 463.25 /*MHz*/,
  456. .VHF_L = 0x01,
  457. .VHF_H = 0xc2,
  458. .UHF = 0xcf,
  459. .config = 0x8e,
  460. },
  461. [TUNER_PHILIPS_ATSC] = { /* Philips ATSC */
  462. .name = "Philips 1236D ATSC/NTSC daul in",
  463. .thresh1= 16 * 157.25 /*MHz*/,
  464. .thresh2= 16 * 454.00 /*MHz*/,
  465. .VHF_L = 0xa0,
  466. .VHF_H = 0x90,
  467. .UHF = 0x30,
  468. .config = 0x8e,
  469. },
  470. [TUNER_PHILIPS_FM1236_MK3] = { /* Philips NTSC */
  471. .name = "Philips NTSC MK3 (FM1236MK3 or FM1236/F)",
  472. .thresh1= 16 * 160.00 /*MHz*/,
  473. .thresh2= 16 * 442.00 /*MHz*/,
  474. .VHF_L = 0x01,
  475. .VHF_H = 0x02,
  476. .UHF = 0x04,
  477. .config = 0x8e,
  478. },
  479. [TUNER_PHILIPS_4IN1] = { /* Philips NTSC */
  480. .name = "Philips 4 in 1 (ATI TV Wonder Pro/Conexant)",
  481. .thresh1= 16 * 160.00 /*MHz*/,
  482. .thresh2= 16 * 442.00 /*MHz*/,
  483. .VHF_L = 0x01,
  484. .VHF_H = 0x02,
  485. .UHF = 0x04,
  486. .config = 0x8e,
  487. },
  488. [TUNER_MICROTUNE_4049FM5] = { /* Microtune PAL */
  489. .name = "Microtune 4049 FM5",
  490. .thresh1= 16 * 141.00 /*MHz*/,
  491. .thresh2= 16 * 464.00 /*MHz*/,
  492. .VHF_L = 0xa0,
  493. .VHF_H = 0x90,
  494. .UHF = 0x30,
  495. .config = 0x8e,
  496. },
  497. [TUNER_MICROTUNE_4042_FI5] = { /* Panasonic NTSC */
  498. .name = "Panasonic VP27s/ENGE4324D",
  499. .thresh1= 16 * 160.00 /*MHz*/,
  500. .thresh2= 16 * 454.00 /*MHz*/,
  501. .VHF_L = 0x01,
  502. .VHF_H = 0x02,
  503. .UHF = 0x08,
  504. .config = 0xce,
  505. },
  506. [TUNER_LG_NTSC_TAPE] = { /* LGINNOTEK NTSC */
  507. .name = "LG NTSC (TAPE series)",
  508. .thresh1= 16 * 160.00 /*MHz*/,
  509. .thresh2= 16 * 442.00 /*MHz*/,
  510. .VHF_L = 0x01,
  511. .VHF_H = 0x02,
  512. .UHF = 0x04,
  513. .config = 0x8e,
  514. },
  515. [TUNER_TNF_8831BGFF] = { /* Philips PAL */
  516. .name = "Tenna TNF 8831 BGFF)",
  517. .thresh1= 16 * 161.25 /*MHz*/,
  518. .thresh2= 16 * 463.25 /*MHz*/,
  519. .VHF_L = 0xa0,
  520. .VHF_H = 0x90,
  521. .UHF = 0x30,
  522. .config = 0x8e,
  523. },
  524. [TUNER_MICROTUNE_4042FI5] = { /* Microtune NTSC */
  525. .name = "Microtune 4042 FI5 ATSC/NTSC dual in",
  526. .thresh1= 16 * 162.00 /*MHz*/,
  527. .thresh2= 16 * 457.00 /*MHz*/,
  528. .VHF_L = 0xa2,
  529. .VHF_H = 0x94,
  530. .UHF = 0x31,
  531. .config = 0x8e,
  532. },
  533. /* 50-59 */
  534. [TUNER_TCL_2002N] = { /* TCL NTSC */
  535. .name = "TCL 2002N",
  536. .thresh1= 16 * 172.00 /*MHz*/,
  537. .thresh2= 16 * 448.00 /*MHz*/,
  538. .VHF_L = 0x01,
  539. .VHF_H = 0x02,
  540. .UHF = 0x08,
  541. .config = 0x8e,
  542. },
  543. [TUNER_PHILIPS_FM1256_IH3] = { /* Philips PAL */
  544. .name = "Philips PAL/SECAM_D (FM 1256 I-H3)",
  545. .thresh1= 16 * 160.00 /*MHz*/,
  546. .thresh2= 16 * 442.00 /*MHz*/,
  547. .VHF_L = 0x01,
  548. .VHF_H = 0x02,
  549. .UHF = 0x04,
  550. .config = 0x8e,
  551. },
  552. [TUNER_THOMSON_DTT7610] = { /* THOMSON ATSC */
  553. .name = "Thomson DDT 7610 (ATSC/NTSC)",
  554. .thresh1= 16 * 157.25 /*MHz*/,
  555. .thresh2= 16 * 454.00 /*MHz*/,
  556. .VHF_L = 0x39,
  557. .VHF_H = 0x3a,
  558. .UHF = 0x3c,
  559. .config = 0x8e,
  560. },
  561. [TUNER_PHILIPS_FQ1286] = { /* Philips NTSC */
  562. .name = "Philips FQ1286",
  563. .thresh1= 16 * 160.00 /*MHz*/,
  564. .thresh2= 16 * 454.00 /*MHz*/,
  565. .VHF_L = 0x41,
  566. .VHF_H = 0x42,
  567. .UHF = 0x04,
  568. .config = 0x8e,
  569. },
  570. [TUNER_PHILIPS_TDA8290] = { /* Philips PAL|NTSC */
  571. .name = "tda8290+75",
  572. /* see tda8290.c for details */ },
  573. [TUNER_TCL_2002MB] = { /* TCL PAL */
  574. .name = "TCL 2002MB",
  575. .thresh1= 16 * 170.00 /*MHz*/,
  576. .thresh2= 16 * 450.00 /*MHz*/,
  577. .VHF_L = 0x01,
  578. .VHF_H = 0x02,
  579. .UHF = 0x08,
  580. .config = 0xce,
  581. },
  582. [TUNER_PHILIPS_FQ1216AME_MK4] = { /* Philips PAL */
  583. .name = "Philips PAL/SECAM multi (FQ1216AME MK4)",
  584. .thresh1= 16 * 160.00 /*MHz*/,
  585. .thresh2= 16 * 442.00 /*MHz*/,
  586. .VHF_L = 0x01,
  587. .VHF_H = 0x02,
  588. .UHF = 0x04,
  589. .config = 0xce,
  590. },
  591. [TUNER_PHILIPS_FQ1236A_MK4] = { /* Philips NTSC */
  592. .name = "Philips FQ1236A MK4",
  593. .thresh1= 16 * 160.00 /*MHz*/,
  594. .thresh2= 16 * 442.00 /*MHz*/,
  595. .VHF_L = 0x01,
  596. .VHF_H = 0x02,
  597. .UHF = 0x04,
  598. .config = 0x8e,
  599. },
  600. [TUNER_YMEC_TVF_8531MF] = { /* Philips NTSC */
  601. .name = "Ymec TVision TVF-8531MF/8831MF/8731MF",
  602. .thresh1= 16 * 160.00 /*MHz*/,
  603. .thresh2= 16 * 454.00 /*MHz*/,
  604. .VHF_L = 0xa0,
  605. .VHF_H = 0x90,
  606. .UHF = 0x30,
  607. .config = 0x8e,
  608. },
  609. [TUNER_YMEC_TVF_5533MF] = { /* Philips NTSC */
  610. .name = "Ymec TVision TVF-5533MF",
  611. .thresh1= 16 * 160.00 /*MHz*/,
  612. .thresh2= 16 * 454.00 /*MHz*/,
  613. .VHF_L = 0x01,
  614. .VHF_H = 0x02,
  615. .UHF = 0x04,
  616. .config = 0x8e,
  617. },
  618. /* 60-69 */
  619. [TUNER_THOMSON_DTT7611] = { /* THOMSON ATSC */
  620. .name = "Thomson DDT 7611 (ATSC/NTSC)",
  621. .thresh1= 16 * 157.25 /*MHz*/,
  622. .thresh2= 16 * 454.00 /*MHz*/,
  623. .VHF_L = 0x39,
  624. .VHF_H = 0x3a,
  625. .UHF = 0x3c,
  626. .config = 0x8e,
  627. },
  628. [TUNER_TENA_9533_DI] = { /* Philips PAL */
  629. .name = "Tena TNF9533-D/IF/TNF9533-B/DF",
  630. .thresh1= 16 * 160.25 /*MHz*/,
  631. .thresh2= 16 * 464.25 /*MHz*/,
  632. .VHF_L = 0x01,
  633. .VHF_H = 0x02,
  634. .UHF = 0x04,
  635. .config = 0x8e,
  636. },
  637. [TUNER_TEA5767] = { /* Philips RADIO */
  638. .name = "Philips TEA5767HN FM Radio",
  639. /* see tea5767.c for details */},
  640. [TUNER_PHILIPS_FMD1216ME_MK3] = { /* Philips PAL */
  641. .name = "Philips FMD1216ME MK3 Hybrid Tuner",
  642. .thresh1= 16 * 160.00 /*MHz*/,
  643. .thresh2= 16 * 442.00 /*MHz*/,
  644. .VHF_L = 0x51,
  645. .VHF_H = 0x52,
  646. .UHF = 0x54,
  647. .config = 0x86,
  648. },
  649. [TUNER_LG_TDVS_H062F] = { /* LGINNOTEK ATSC */
  650. .name = "LG TDVS-H062F/TUA6034",
  651. .thresh1= 16 * 160.00 /*MHz*/,
  652. .thresh2= 16 * 455.00 /*MHz*/,
  653. .VHF_L = 0x01,
  654. .VHF_H = 0x02,
  655. .UHF = 0x04,
  656. .config = 0x8e,
  657. },
  658. [TUNER_YMEC_TVF66T5_B_DFF] = { /* Philips PAL */
  659. .name = "Ymec TVF66T5-B/DFF",
  660. .thresh1= 16 * 160.25 /*MHz*/,
  661. .thresh2= 16 * 464.25 /*MHz*/,
  662. .VHF_L = 0x01,
  663. .VHF_H = 0x02,
  664. .UHF = 0x08,
  665. .config = 0x8e,
  666. },
  667. [TUNER_LG_NTSC_TALN_MINI] = { /* LGINNOTEK NTSC */
  668. .name = "LG NTSC (TALN mini series)",
  669. .thresh1= 16 * 137.25 /*MHz*/,
  670. .thresh2= 16 * 373.25 /*MHz*/,
  671. .VHF_L = 0x01,
  672. .VHF_H = 0x02,
  673. .UHF = 0x08,
  674. .config = 0x8e,
  675. },
  676. [TUNER_PHILIPS_TD1316] = { /* Philips PAL */
  677. .name = "Philips TD1316 Hybrid Tuner",
  678. .thresh1= 16 * 160.00 /*MHz*/,
  679. .thresh2= 16 * 442.00 /*MHz*/,
  680. .VHF_L = 0xa1,
  681. .VHF_H = 0xa2,
  682. .UHF = 0xa4,
  683. .config = 0xc8,
  684. },
  685. [TUNER_PHILIPS_TUV1236D] = { /* Philips ATSC */
  686. .name = "Philips TUV1236D ATSC/NTSC dual in",
  687. .thresh1= 16 * 157.25 /*MHz*/,
  688. .thresh2= 16 * 454.00 /*MHz*/,
  689. .VHF_L = 0x01,
  690. .VHF_H = 0x02,
  691. .UHF = 0x04,
  692. .config = 0xce,
  693. },
  694. [TUNER_TNF_5335MF] = { /* Philips NTSC */
  695. .name = "Tena TNF 5335 MF",
  696. .thresh1= 16 * 157.25 /*MHz*/,
  697. .thresh2= 16 * 454.00 /*MHz*/,
  698. .VHF_L = 0x01,
  699. .VHF_H = 0x02,
  700. .UHF = 0x04,
  701. .config = 0x8e,
  702. },
  703. };
  704. unsigned const int tuner_count = ARRAY_SIZE(tuners);
  705. /* ---------------------------------------------------------------------- */
  706. static int tuner_getstatus(struct i2c_client *c)
  707. {
  708. unsigned char byte;
  709. if (1 != i2c_master_recv(c,&byte,1))
  710. return 0;
  711. return byte;
  712. }
  713. static int tuner_signal(struct i2c_client *c)
  714. {
  715. return (tuner_getstatus(c) & TUNER_SIGNAL) << 13;
  716. }
  717. static int tuner_stereo(struct i2c_client *c)
  718. {
  719. int stereo, status;
  720. struct tuner *t = i2c_get_clientdata(c);
  721. status = tuner_getstatus (c);
  722. switch (t->type) {
  723. case TUNER_PHILIPS_FM1216ME_MK3:
  724. case TUNER_PHILIPS_FM1236_MK3:
  725. case TUNER_PHILIPS_FM1256_IH3:
  726. stereo = ((status & TUNER_SIGNAL) == TUNER_STEREO_MK3);
  727. break;
  728. default:
  729. stereo = status & TUNER_STEREO;
  730. }
  731. return stereo;
  732. }
  733. /* ---------------------------------------------------------------------- */
  734. static void default_set_tv_freq(struct i2c_client *c, unsigned int freq)
  735. {
  736. struct tuner *t = i2c_get_clientdata(c);
  737. u8 config, tuneraddr;
  738. u16 div;
  739. struct tunertype *tun;
  740. unsigned char buffer[4];
  741. int rc, IFPCoff;
  742. tun = &tuners[t->type];
  743. if (freq < tun->thresh1) {
  744. config = tun->VHF_L;
  745. tuner_dbg("tv: VHF lowrange\n");
  746. } else if (freq < tun->thresh2) {
  747. config = tun->VHF_H;
  748. tuner_dbg("tv: VHF high range\n");
  749. } else {
  750. config = tun->UHF;
  751. tuner_dbg("tv: UHF range\n");
  752. }
  753. /* tv norm specific stuff for multi-norm tuners */
  754. switch (t->type) {
  755. case TUNER_PHILIPS_SECAM: // FI1216MF
  756. /* 0x01 -> ??? no change ??? */
  757. /* 0x02 -> PAL BDGHI / SECAM L */
  758. /* 0x04 -> ??? PAL others / SECAM others ??? */
  759. config &= ~0x02;
  760. if (t->std & V4L2_STD_SECAM)
  761. config |= 0x02;
  762. break;
  763. case TUNER_TEMIC_4046FM5:
  764. config &= ~0x0f;
  765. if (t->std & V4L2_STD_PAL_BG) {
  766. config |= TEMIC_SET_PAL_BG;
  767. } else if (t->std & V4L2_STD_PAL_I) {
  768. config |= TEMIC_SET_PAL_I;
  769. } else if (t->std & V4L2_STD_PAL_DK) {
  770. config |= TEMIC_SET_PAL_DK;
  771. } else if (t->std & V4L2_STD_SECAM_L) {
  772. config |= TEMIC_SET_PAL_L;
  773. }
  774. break;
  775. case TUNER_PHILIPS_FQ1216ME:
  776. config &= ~0x0f;
  777. if (t->std & (V4L2_STD_PAL_BG|V4L2_STD_PAL_DK)) {
  778. config |= PHILIPS_SET_PAL_BGDK;
  779. } else if (t->std & V4L2_STD_PAL_I) {
  780. config |= PHILIPS_SET_PAL_I;
  781. } else if (t->std & V4L2_STD_SECAM_L) {
  782. config |= PHILIPS_SET_PAL_L;
  783. }
  784. break;
  785. case TUNER_PHILIPS_ATSC:
  786. /* 0x00 -> ATSC antenna input 1 */
  787. /* 0x01 -> ATSC antenna input 2 */
  788. /* 0x02 -> NTSC antenna input 1 */
  789. /* 0x03 -> NTSC antenna input 2 */
  790. config &= ~0x03;
  791. if (!(t->std & V4L2_STD_ATSC))
  792. config |= 2;
  793. /* FIXME: input */
  794. break;
  795. case TUNER_MICROTUNE_4042FI5:
  796. /* Set the charge pump for fast tuning */
  797. tun->config |= TUNER_CHARGE_PUMP;
  798. break;
  799. case TUNER_PHILIPS_TUV1236D:
  800. /* 0x40 -> ATSC antenna input 1 */
  801. /* 0x48 -> ATSC antenna input 2 */
  802. /* 0x00 -> NTSC antenna input 1 */
  803. /* 0x08 -> NTSC antenna input 2 */
  804. buffer[0] = 0x14;
  805. buffer[1] = 0x00;
  806. buffer[2] = 0x17;
  807. buffer[3] = 0x00;
  808. config &= ~0x40;
  809. if (t->std & V4L2_STD_ATSC) {
  810. config |= 0x40;
  811. buffer[1] = 0x04;
  812. }
  813. /* set to the correct mode (analog or digital) */
  814. tuneraddr = c->addr;
  815. c->addr = 0x0a;
  816. if (2 != (rc = i2c_master_send(c,&buffer[0],2)))
  817. tuner_warn("i2c i/o error: rc == %d (should be 2)\n",rc);
  818. if (2 != (rc = i2c_master_send(c,&buffer[2],2)))
  819. tuner_warn("i2c i/o error: rc == %d (should be 2)\n",rc);
  820. c->addr = tuneraddr;
  821. /* FIXME: input */
  822. break;
  823. }
  824. /*
  825. * Philips FI1216MK2 remark from specification :
  826. * for channel selection involving band switching, and to ensure
  827. * smooth tuning to the desired channel without causing
  828. * unnecessary charge pump action, it is recommended to consider
  829. * the difference between wanted channel frequency and the
  830. * current channel frequency. Unnecessary charge pump action
  831. * will result in very low tuning voltage which may drive the
  832. * oscillator to extreme conditions.
  833. *
  834. * Progfou: specification says to send config data before
  835. * frequency in case (wanted frequency < current frequency).
  836. */
  837. /* IFPCoff = Video Intermediate Frequency - Vif:
  838. 940 =16*58.75 NTSC/J (Japan)
  839. 732 =16*45.75 M/N STD
  840. 704 =16*44 ATSC (at DVB code)
  841. 632 =16*39.50 I U.K.
  842. 622.4=16*38.90 B/G D/K I, L STD
  843. 592 =16*37.00 D China
  844. 590 =16.36.875 B Australia
  845. 543.2=16*33.95 L' STD
  846. 171.2=16*10.70 FM Radio (at set_radio_freq)
  847. */
  848. if (t->std & V4L2_STD_NTSC_M_JP) {
  849. IFPCoff = 940;
  850. } else if (t->std & V4L2_STD_MN) {
  851. IFPCoff = 732;
  852. } else if (t->std & V4L2_STD_SECAM_LC) {
  853. IFPCoff = 543;
  854. } else {
  855. IFPCoff = 623;
  856. }
  857. div=freq + IFPCoff;
  858. if (t->type == TUNER_PHILIPS_SECAM && freq < t->freq) {
  859. buffer[0] = tun->config;
  860. buffer[1] = config;
  861. buffer[2] = (div>>8) & 0x7f;
  862. buffer[3] = div & 0xff;
  863. } else {
  864. buffer[0] = (div>>8) & 0x7f;
  865. buffer[1] = div & 0xff;
  866. buffer[2] = tun->config;
  867. buffer[3] = config;
  868. }
  869. tuner_dbg("tv 0x%02x 0x%02x 0x%02x 0x%02x\n",
  870. buffer[0],buffer[1],buffer[2],buffer[3]);
  871. if (4 != (rc = i2c_master_send(c,buffer,4)))
  872. tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc);
  873. if (t->type == TUNER_MICROTUNE_4042FI5) {
  874. // FIXME - this may also work for other tuners
  875. unsigned long timeout = jiffies + msecs_to_jiffies(1);
  876. u8 status_byte = 0;
  877. /* Wait until the PLL locks */
  878. for (;;) {
  879. if (time_after(jiffies,timeout))
  880. return;
  881. if (1 != (rc = i2c_master_recv(c,&status_byte,1))) {
  882. tuner_warn("i2c i/o read error: rc == %d (should be 1)\n",rc);
  883. break;
  884. }
  885. if (status_byte & TUNER_PLL_LOCKED)
  886. break;
  887. udelay(10);
  888. }
  889. /* Set the charge pump for optimized phase noise figure */
  890. tun->config &= ~TUNER_CHARGE_PUMP;
  891. buffer[0] = (div>>8) & 0x7f;
  892. buffer[1] = div & 0xff;
  893. buffer[2] = tun->config;
  894. buffer[3] = config;
  895. tuner_dbg("tv 0x%02x 0x%02x 0x%02x 0x%02x\n",
  896. buffer[0],buffer[1],buffer[2],buffer[3]);
  897. if (4 != (rc = i2c_master_send(c,buffer,4)))
  898. tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc);
  899. }
  900. }
  901. static void default_set_radio_freq(struct i2c_client *c, unsigned int freq)
  902. {
  903. struct tunertype *tun;
  904. struct tuner *t = i2c_get_clientdata(c);
  905. unsigned char buffer[4];
  906. unsigned div;
  907. int rc;
  908. tun = &tuners[t->type];
  909. div = (20 * freq / 16000) + (int)(20*10.7); /* IF 10.7 MHz */
  910. buffer[2] = (tun->config & ~TUNER_RATIO_MASK) | TUNER_RATIO_SELECT_50; /* 50 kHz step */
  911. switch (t->type) {
  912. case TUNER_TENA_9533_DI:
  913. case TUNER_YMEC_TVF_5533MF:
  914. tuner_dbg ("This tuner doesn't have FM. Most cards has a TEA5767 for FM\n");
  915. return;
  916. case TUNER_PHILIPS_FM1216ME_MK3:
  917. case TUNER_PHILIPS_FM1236_MK3:
  918. case TUNER_PHILIPS_FMD1216ME_MK3:
  919. buffer[3] = 0x19;
  920. break;
  921. case TUNER_PHILIPS_FM1256_IH3:
  922. div = (20 * freq) / 16000 + (int)(33.3 * 20); /* IF 33.3 MHz */
  923. buffer[3] = 0x19;
  924. break;
  925. case TUNER_LG_PAL_FM:
  926. buffer[3] = 0xa5;
  927. break;
  928. case TUNER_MICROTUNE_4049FM5:
  929. div = (20 * freq) / 16000 + (int)(33.3 * 20); /* IF 33.3 MHz */
  930. buffer[3] = 0xa4;
  931. break;
  932. default:
  933. buffer[3] = 0xa4;
  934. break;
  935. }
  936. buffer[0] = (div>>8) & 0x7f;
  937. buffer[1] = div & 0xff;
  938. tuner_dbg("radio 0x%02x 0x%02x 0x%02x 0x%02x\n",
  939. buffer[0],buffer[1],buffer[2],buffer[3]);
  940. if (4 != (rc = i2c_master_send(c,buffer,4)))
  941. tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc);
  942. }
  943. int default_tuner_init(struct i2c_client *c)
  944. {
  945. struct tuner *t = i2c_get_clientdata(c);
  946. tuner_info("type set to %d (%s)\n",
  947. t->type, tuners[t->type].name);
  948. strlcpy(c->name, tuners[t->type].name, sizeof(c->name));
  949. t->tv_freq = default_set_tv_freq;
  950. t->radio_freq = default_set_radio_freq;
  951. t->has_signal = tuner_signal;
  952. t->is_stereo = tuner_stereo;
  953. t->standby = NULL;
  954. return 0;
  955. }
  956. /*
  957. * Overrides for Emacs so that we follow Linus's tabbing style.
  958. * ---------------------------------------------------------------------------
  959. * Local variables:
  960. * c-basic-offset: 8
  961. * End:
  962. */