tvp5150.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830
  1. /*
  2. * tvp5150 - Texas Instruments TVP5150A(M) video decoder driver
  3. *
  4. * Copyright (c) 2005 Mauro Carvalho Chehab (mchehab@brturbo.com.br)
  5. * This code is placed under the terms of the GNU General Public License
  6. */
  7. #include <linux/videodev.h>
  8. #include <linux/i2c.h>
  9. #include <linux/videodev.h>
  10. #include <linux/delay.h>
  11. #include <linux/video_decoder.h>
  12. #include "tvp5150_reg.h"
  13. MODULE_DESCRIPTION("Texas Instruments TVP5150A video decoder driver"); /* standard i2c insmod options */
  14. MODULE_AUTHOR("Mauro Carvalho Chehab");
  15. MODULE_LICENSE("GPL");
  16. static unsigned short normal_i2c[] = {
  17. 0xb8 >> 1,
  18. 0xba >> 1,
  19. I2C_CLIENT_END
  20. };
  21. I2C_CLIENT_INSMOD;
  22. static int debug = 0;
  23. module_param(debug, int, 0);
  24. MODULE_PARM_DESC(debug, "Debug level (0-1)");
  25. #define dprintk(num, format, args...) \
  26. do { \
  27. if (debug >= num) \
  28. printk(format , ##args); \
  29. } while (0)
  30. /* supported controls */
  31. static struct v4l2_queryctrl tvp5150_qctrl[] = {
  32. {
  33. .id = V4L2_CID_BRIGHTNESS,
  34. .type = V4L2_CTRL_TYPE_INTEGER,
  35. .name = "Brightness",
  36. .minimum = 0,
  37. .maximum = 255,
  38. .step = 1,
  39. .default_value = 0,
  40. .flags = 0,
  41. }, {
  42. .id = V4L2_CID_CONTRAST,
  43. .type = V4L2_CTRL_TYPE_INTEGER,
  44. .name = "Contrast",
  45. .minimum = 0,
  46. .maximum = 255,
  47. .step = 0x1,
  48. .default_value = 0x10,
  49. .flags = 0,
  50. }, {
  51. .id = V4L2_CID_SATURATION,
  52. .type = V4L2_CTRL_TYPE_INTEGER,
  53. .name = "Saturation",
  54. .minimum = 0,
  55. .maximum = 255,
  56. .step = 0x1,
  57. .default_value = 0x10,
  58. .flags = 0,
  59. }, {
  60. .id = V4L2_CID_HUE,
  61. .type = V4L2_CTRL_TYPE_INTEGER,
  62. .name = "Hue",
  63. .minimum = -128,
  64. .maximum = 127,
  65. .step = 0x1,
  66. .default_value = 0x10,
  67. .flags = 0,
  68. }
  69. };
  70. struct tvp5150 {
  71. struct i2c_client *client;
  72. int norm;
  73. int input;
  74. int enable;
  75. int bright;
  76. int contrast;
  77. int hue;
  78. int sat;
  79. };
  80. static inline int tvp5150_read(struct i2c_client *c, unsigned char addr)
  81. {
  82. unsigned char buffer[1];
  83. int rc;
  84. buffer[0] = addr;
  85. if (1 != (rc = i2c_master_send(c, buffer, 1)))
  86. dprintk(0, "i2c i/o error: rc == %d (should be 1)\n", rc);
  87. msleep(10);
  88. if (1 != (rc = i2c_master_recv(c, buffer, 1)))
  89. dprintk(0, "i2c i/o error: rc == %d (should be 1)\n", rc);
  90. return (buffer[0]);
  91. }
  92. static inline void tvp5150_write(struct i2c_client *c, unsigned char addr,
  93. unsigned char value)
  94. {
  95. unsigned char buffer[2];
  96. int rc;
  97. /* struct tvp5150 *core = i2c_get_clientdata(c); */
  98. buffer[0] = addr;
  99. buffer[1] = value;
  100. dprintk(1, "tvp5150: writing 0x%02x 0x%02x\n", buffer[0], buffer[1]);
  101. if (2 != (rc = i2c_master_send(c, buffer, 2)))
  102. dprintk(0, "i2c i/o error: rc == %d (should be 2)\n", rc);
  103. }
  104. static void dump_reg(struct i2c_client *c)
  105. {
  106. printk("tvp5150: Video input source selection #1 = 0x%02x\n",
  107. tvp5150_read(c, TVP5150_VD_IN_SRC_SEL_1));
  108. printk("tvp5150: Analog channel controls = 0x%02x\n",
  109. tvp5150_read(c, TVP5150_ANAL_CHL_CTL));
  110. printk("tvp5150: Operation mode controls = 0x%02x\n",
  111. tvp5150_read(c, TVP5150_OP_MODE_CTL));
  112. printk("tvp5150: Miscellaneous controls = 0x%02x\n",
  113. tvp5150_read(c, TVP5150_MISC_CTL));
  114. printk("tvp5150: Autoswitch mask: TVP5150A / TVP5150AM = 0x%02x\n",
  115. tvp5150_read(c, TVP5150_AUTOSW_MSK));
  116. printk("tvp5150: Color killer threshold control = 0x%02x\n",
  117. tvp5150_read(c, TVP5150_COLOR_KIL_THSH_CTL));
  118. printk("tvp5150: Luminance processing control #1 = 0x%02x\n",
  119. tvp5150_read(c, TVP5150_LUMA_PROC_CTL_1));
  120. printk("tvp5150: Luminance processing control #2 = 0x%02x\n",
  121. tvp5150_read(c, TVP5150_LUMA_PROC_CTL_2));
  122. printk("tvp5150: Brightness control = 0x%02x\n",
  123. tvp5150_read(c, TVP5150_BRIGHT_CTL));
  124. printk("tvp5150: Color saturation control = 0x%02x\n",
  125. tvp5150_read(c, TVP5150_SATURATION_CTL));
  126. printk("tvp5150: Hue control = 0x%02x\n",
  127. tvp5150_read(c, TVP5150_HUE_CTL));
  128. printk("tvp5150: Contrast control = 0x%02x\n",
  129. tvp5150_read(c, TVP5150_CONTRAST_CTL));
  130. printk("tvp5150: Outputs and data rates select = 0x%02x\n",
  131. tvp5150_read(c, TVP5150_DATA_RATE_SEL));
  132. printk("tvp5150: Luminance processing control #3 = 0x%02x\n",
  133. tvp5150_read(c, TVP5150_LUMA_PROC_CTL_3));
  134. printk("tvp5150: Configuration shared pins = 0x%02x\n",
  135. tvp5150_read(c, TVP5150_CONF_SHARED_PIN));
  136. printk("tvp5150: Active video cropping start MSB = 0x%02x\n",
  137. tvp5150_read(c, TVP5150_ACT_VD_CROP_ST_MSB));
  138. printk("tvp5150: Active video cropping start LSB = 0x%02x\n",
  139. tvp5150_read(c, TVP5150_ACT_VD_CROP_ST_LSB));
  140. printk("tvp5150: Active video cropping stop MSB = 0x%02x\n",
  141. tvp5150_read(c, TVP5150_ACT_VD_CROP_STP_MSB));
  142. printk("tvp5150: Active video cropping stop LSB = 0x%02x\n",
  143. tvp5150_read(c, TVP5150_ACT_VD_CROP_STP_LSB));
  144. printk("tvp5150: Genlock/RTC = 0x%02x\n",
  145. tvp5150_read(c, TVP5150_GENLOCK));
  146. printk("tvp5150: Horizontal sync start = 0x%02x\n",
  147. tvp5150_read(c, TVP5150_HORIZ_SYNC_START));
  148. printk("tvp5150: Vertical blanking start = 0x%02x\n",
  149. tvp5150_read(c, TVP5150_VERT_BLANKING_START));
  150. printk("tvp5150: Vertical blanking stop = 0x%02x\n",
  151. tvp5150_read(c, TVP5150_VERT_BLANKING_STOP));
  152. printk("tvp5150: Chrominance processing control #1 = 0x%02x\n",
  153. tvp5150_read(c, TVP5150_CHROMA_PROC_CTL_1));
  154. printk("tvp5150: Chrominance processing control #2 = 0x%02x\n",
  155. tvp5150_read(c, TVP5150_CHROMA_PROC_CTL_2));
  156. printk("tvp5150: Interrupt reset register B = 0x%02x\n",
  157. tvp5150_read(c, TVP5150_INT_RESET_REG_B));
  158. printk("tvp5150: Interrupt enable register B = 0x%02x\n",
  159. tvp5150_read(c, TVP5150_INT_ENABLE_REG_B));
  160. printk("tvp5150: Interrupt configuration register B = 0x%02x\n",
  161. tvp5150_read(c, TVP5150_INTT_CONFIG_REG_B));
  162. printk("tvp5150: Video standard = 0x%02x\n",
  163. tvp5150_read(c, TVP5150_VIDEO_STD));
  164. printk("tvp5150: Cb gain factor = 0x%02x\n",
  165. tvp5150_read(c, TVP5150_CB_GAIN_FACT));
  166. printk("tvp5150: Cr gain factor = 0x%02x\n",
  167. tvp5150_read(c, TVP5150_CR_GAIN_FACTOR));
  168. printk("tvp5150: Macrovision on counter = 0x%02x\n",
  169. tvp5150_read(c, TVP5150_MACROVISION_ON_CTR));
  170. printk("tvp5150: Macrovision off counter = 0x%02x\n",
  171. tvp5150_read(c, TVP5150_MACROVISION_OFF_CTR));
  172. printk("tvp5150: revision select (TVP5150AM1 only) = 0x%02x\n",
  173. tvp5150_read(c, TVP5150_REV_SELECT));
  174. printk("tvp5150: MSB of device ID = 0x%02x\n",
  175. tvp5150_read(c, TVP5150_MSB_DEV_ID));
  176. printk("tvp5150: LSB of device ID = 0x%02x\n",
  177. tvp5150_read(c, TVP5150_LSB_DEV_ID));
  178. printk("tvp5150: ROM major version = 0x%02x\n",
  179. tvp5150_read(c, TVP5150_ROM_MAJOR_VER));
  180. printk("tvp5150: ROM minor version = 0x%02x\n",
  181. tvp5150_read(c, TVP5150_ROM_MINOR_VER));
  182. printk("tvp5150: Vertical line count MSB = 0x%02x\n",
  183. tvp5150_read(c, TVP5150_VERT_LN_COUNT_MSB));
  184. printk("tvp5150: Vertical line count LSB = 0x%02x\n",
  185. tvp5150_read(c, TVP5150_VERT_LN_COUNT_LSB));
  186. printk("tvp5150: Interrupt status register B = 0x%02x\n",
  187. tvp5150_read(c, TVP5150_INT_STATUS_REG_B));
  188. printk("tvp5150: Interrupt active register B = 0x%02x\n",
  189. tvp5150_read(c, TVP5150_INT_ACTIVE_REG_B));
  190. printk("tvp5150: Status register #1 = 0x%02x\n",
  191. tvp5150_read(c, TVP5150_STATUS_REG_1));
  192. printk("tvp5150: Status register #2 = 0x%02x\n",
  193. tvp5150_read(c, TVP5150_STATUS_REG_2));
  194. printk("tvp5150: Status register #3 = 0x%02x\n",
  195. tvp5150_read(c, TVP5150_STATUS_REG_3));
  196. printk("tvp5150: Status register #4 = 0x%02x\n",
  197. tvp5150_read(c, TVP5150_STATUS_REG_4));
  198. printk("tvp5150: Status register #5 = 0x%02x\n",
  199. tvp5150_read(c, TVP5150_STATUS_REG_5));
  200. printk("tvp5150: Closed caption data registers = 0x%02x\n",
  201. tvp5150_read(c, TVP5150_CC_DATA_REG1));
  202. printk("tvp5150: Closed caption data registers = 0x%02x\n",
  203. tvp5150_read(c, TVP5150_CC_DATA_REG2));
  204. printk("tvp5150: Closed caption data registers = 0x%02x\n",
  205. tvp5150_read(c, TVP5150_CC_DATA_REG3));
  206. printk("tvp5150: Closed caption data registers = 0x%02x\n",
  207. tvp5150_read(c, TVP5150_CC_DATA_REG4));
  208. printk("tvp5150: WSS data registers = 0x%02x\n",
  209. tvp5150_read(c, TVP5150_WSS_DATA_REG1));
  210. printk("tvp5150: WSS data registers = 0x%02x\n",
  211. tvp5150_read(c, TVP5150_WSS_DATA_REG2));
  212. printk("tvp5150: WSS data registers = 0x%02x\n",
  213. tvp5150_read(c, TVP5150_WSS_DATA_REG3));
  214. printk("tvp5150: WSS data registers = 0x%02x\n",
  215. tvp5150_read(c, TVP5150_WSS_DATA_REG4));
  216. printk("tvp5150: WSS data registers = 0x%02x\n",
  217. tvp5150_read(c, TVP5150_WSS_DATA_REG5));
  218. printk("tvp5150: WSS data registers = 0x%02x\n",
  219. tvp5150_read(c, TVP5150_WSS_DATA_REG6));
  220. printk("tvp5150: VPS data registers = 0x%02x\n",
  221. tvp5150_read(c, TVP5150_VPS_DATA_REG1));
  222. printk("tvp5150: VPS data registers = 0x%02x\n",
  223. tvp5150_read(c, TVP5150_VPS_DATA_REG2));
  224. printk("tvp5150: VPS data registers = 0x%02x\n",
  225. tvp5150_read(c, TVP5150_VPS_DATA_REG3));
  226. printk("tvp5150: VPS data registers = 0x%02x\n",
  227. tvp5150_read(c, TVP5150_VPS_DATA_REG4));
  228. printk("tvp5150: VPS data registers = 0x%02x\n",
  229. tvp5150_read(c, TVP5150_VPS_DATA_REG5));
  230. printk("tvp5150: VPS data registers = 0x%02x\n",
  231. tvp5150_read(c, TVP5150_VPS_DATA_REG6));
  232. printk("tvp5150: VPS data registers = 0x%02x\n",
  233. tvp5150_read(c, TVP5150_VPS_DATA_REG7));
  234. printk("tvp5150: VPS data registers = 0x%02x\n",
  235. tvp5150_read(c, TVP5150_VPS_DATA_REG8));
  236. printk("tvp5150: VPS data registers = 0x%02x\n",
  237. tvp5150_read(c, TVP5150_VPS_DATA_REG9));
  238. printk("tvp5150: VPS data registers = 0x%02x\n",
  239. tvp5150_read(c, TVP5150_VPS_DATA_REG10));
  240. printk("tvp5150: VPS data registers = 0x%02x\n",
  241. tvp5150_read(c, TVP5150_VPS_DATA_REG11));
  242. printk("tvp5150: VPS data registers = 0x%02x\n",
  243. tvp5150_read(c, TVP5150_VPS_DATA_REG12));
  244. printk("tvp5150: VPS data registers = 0x%02x\n",
  245. tvp5150_read(c, TVP5150_VPS_DATA_REG13));
  246. printk("tvp5150: VITC data registers = 0x%02x\n",
  247. tvp5150_read(c, TVP5150_VITC_DATA_REG1));
  248. printk("tvp5150: VITC data registers = 0x%02x\n",
  249. tvp5150_read(c, TVP5150_VITC_DATA_REG2));
  250. printk("tvp5150: VITC data registers = 0x%02x\n",
  251. tvp5150_read(c, TVP5150_VITC_DATA_REG3));
  252. printk("tvp5150: VITC data registers = 0x%02x\n",
  253. tvp5150_read(c, TVP5150_VITC_DATA_REG4));
  254. printk("tvp5150: VITC data registers = 0x%02x\n",
  255. tvp5150_read(c, TVP5150_VITC_DATA_REG5));
  256. printk("tvp5150: VITC data registers = 0x%02x\n",
  257. tvp5150_read(c, TVP5150_VITC_DATA_REG6));
  258. printk("tvp5150: VITC data registers = 0x%02x\n",
  259. tvp5150_read(c, TVP5150_VITC_DATA_REG7));
  260. printk("tvp5150: VITC data registers = 0x%02x\n",
  261. tvp5150_read(c, TVP5150_VITC_DATA_REG8));
  262. printk("tvp5150: VITC data registers = 0x%02x\n",
  263. tvp5150_read(c, TVP5150_VITC_DATA_REG9));
  264. printk("tvp5150: VBI FIFO read data = 0x%02x\n",
  265. tvp5150_read(c, TVP5150_VBI_FIFO_READ_DATA));
  266. printk("tvp5150: Teletext filter 1 = 0x%02x\n",
  267. tvp5150_read(c, TVP5150_TELETEXT_FIL_1_1));
  268. printk("tvp5150: Teletext filter 1 = 0x%02x\n",
  269. tvp5150_read(c, TVP5150_TELETEXT_FIL_1_2));
  270. printk("tvp5150: Teletext filter 1 = 0x%02x\n",
  271. tvp5150_read(c, TVP5150_TELETEXT_FIL_1_3));
  272. printk("tvp5150: Teletext filter 1 = 0x%02x\n",
  273. tvp5150_read(c, TVP5150_TELETEXT_FIL_1_4));
  274. printk("tvp5150: Teletext filter 1 = 0x%02x\n",
  275. tvp5150_read(c, TVP5150_TELETEXT_FIL_1_5));
  276. printk("tvp5150: Teletext filter 2 = 0x%02x\n",
  277. tvp5150_read(c, TVP5150_TELETEXT_FIL_2_1));
  278. printk("tvp5150: Teletext filter 2 = 0x%02x\n",
  279. tvp5150_read(c, TVP5150_TELETEXT_FIL_2_2));
  280. printk("tvp5150: Teletext filter 2 = 0x%02x\n",
  281. tvp5150_read(c, TVP5150_TELETEXT_FIL_2_3));
  282. printk("tvp5150: Teletext filter 2 = 0x%02x\n",
  283. tvp5150_read(c, TVP5150_TELETEXT_FIL_2_4));
  284. printk("tvp5150: Teletext filter 2 = 0x%02x\n",
  285. tvp5150_read(c, TVP5150_TELETEXT_FIL_2_5));
  286. printk("tvp5150: Teletext filter enable = 0x%02x\n",
  287. tvp5150_read(c, TVP5150_TELETEXT_FIL_ENA));
  288. printk("tvp5150: Interrupt status register A = 0x%02x\n",
  289. tvp5150_read(c, TVP5150_INT_STATUS_REG_A));
  290. printk("tvp5150: Interrupt enable register A = 0x%02x\n",
  291. tvp5150_read(c, TVP5150_INT_ENABLE_REG_A));
  292. printk("tvp5150: Interrupt configuration = 0x%02x\n",
  293. tvp5150_read(c, TVP5150_INT_CONF));
  294. printk("tvp5150: VDP configuration RAM data = 0x%02x\n",
  295. tvp5150_read(c, TVP5150_VDP_CONF_RAM_DATA));
  296. printk("tvp5150: Configuration RAM address low byte = 0x%02x\n",
  297. tvp5150_read(c, TVP5150_CONF_RAM_ADDR_LOW));
  298. printk("tvp5150: Configuration RAM address high byte = 0x%02x\n",
  299. tvp5150_read(c, TVP5150_CONF_RAM_ADDR_HIGH));
  300. printk("tvp5150: VDP status register = 0x%02x\n",
  301. tvp5150_read(c, TVP5150_VDP_STATUS_REG));
  302. printk("tvp5150: FIFO word count = 0x%02x\n",
  303. tvp5150_read(c, TVP5150_FIFO_WORD_COUNT));
  304. printk("tvp5150: FIFO interrupt threshold = 0x%02x\n",
  305. tvp5150_read(c, TVP5150_FIFO_INT_THRESHOLD));
  306. printk("tvp5150: FIFO reset = 0x%02x\n",
  307. tvp5150_read(c, TVP5150_FIFO_RESET));
  308. printk("tvp5150: Line number interrupt = 0x%02x\n",
  309. tvp5150_read(c, TVP5150_LINE_NUMBER_INT));
  310. printk("tvp5150: Pixel alignment register low byte = 0x%02x\n",
  311. tvp5150_read(c, TVP5150_PIX_ALIGN_REG_LOW));
  312. printk("tvp5150: Pixel alignment register high byte = 0x%02x\n",
  313. tvp5150_read(c, TVP5150_PIX_ALIGN_REG_HIGH));
  314. printk("tvp5150: FIFO output control = 0x%02x\n",
  315. tvp5150_read(c, TVP5150_FIFO_OUT_CTRL));
  316. printk("tvp5150: Full field enable 1 = 0x%02x\n",
  317. tvp5150_read(c, TVP5150_FULL_FIELD_ENA_1));
  318. printk("tvp5150: Full field enable 2 = 0x%02x\n",
  319. tvp5150_read(c, TVP5150_FULL_FIELD_ENA_2));
  320. printk("tvp5150: Line mode registers = 0x%02x\n",
  321. tvp5150_read(c, TVP5150_LINE_MODE_REG_1));
  322. printk("tvp5150: Line mode registers = 0x%02x\n",
  323. tvp5150_read(c, TVP5150_LINE_MODE_REG_2));
  324. printk("tvp5150: Line mode registers = 0x%02x\n",
  325. tvp5150_read(c, TVP5150_LINE_MODE_REG_3));
  326. printk("tvp5150: Line mode registers = 0x%02x\n",
  327. tvp5150_read(c, TVP5150_LINE_MODE_REG_4));
  328. printk("tvp5150: Line mode registers = 0x%02x\n",
  329. tvp5150_read(c, TVP5150_LINE_MODE_REG_5));
  330. printk("tvp5150: Line mode registers = 0x%02x\n",
  331. tvp5150_read(c, TVP5150_LINE_MODE_REG_6));
  332. printk("tvp5150: Line mode registers = 0x%02x\n",
  333. tvp5150_read(c, TVP5150_LINE_MODE_REG_7));
  334. printk("tvp5150: Line mode registers = 0x%02x\n",
  335. tvp5150_read(c, TVP5150_LINE_MODE_REG_8));
  336. printk("tvp5150: Line mode registers = 0x%02x\n",
  337. tvp5150_read(c, TVP5150_LINE_MODE_REG_9));
  338. printk("tvp5150: Line mode registers = 0x%02x\n",
  339. tvp5150_read(c, TVP5150_LINE_MODE_REG_10));
  340. printk("tvp5150: Line mode registers = 0x%02x\n",
  341. tvp5150_read(c, TVP5150_LINE_MODE_REG_11));
  342. printk("tvp5150: Line mode registers = 0x%02x\n",
  343. tvp5150_read(c, TVP5150_LINE_MODE_REG_12));
  344. printk("tvp5150: Line mode registers = 0x%02x\n",
  345. tvp5150_read(c, TVP5150_LINE_MODE_REG_13));
  346. printk("tvp5150: Line mode registers = 0x%02x\n",
  347. tvp5150_read(c, TVP5150_LINE_MODE_REG_14));
  348. printk("tvp5150: Line mode registers = 0x%02x\n",
  349. tvp5150_read(c, TVP5150_LINE_MODE_REG_15));
  350. printk("tvp5150: Line mode registers = 0x%02x\n",
  351. tvp5150_read(c, TVP5150_LINE_MODE_REG_16));
  352. printk("tvp5150: Line mode registers = 0x%02x\n",
  353. tvp5150_read(c, TVP5150_LINE_MODE_REG_17));
  354. printk("tvp5150: Line mode registers = 0x%02x\n",
  355. tvp5150_read(c, TVP5150_LINE_MODE_REG_18));
  356. printk("tvp5150: Line mode registers = 0x%02x\n",
  357. tvp5150_read(c, TVP5150_LINE_MODE_REG_19));
  358. printk("tvp5150: Line mode registers = 0x%02x\n",
  359. tvp5150_read(c, TVP5150_LINE_MODE_REG_20));
  360. printk("tvp5150: Line mode registers = 0x%02x\n",
  361. tvp5150_read(c, TVP5150_LINE_MODE_REG_21));
  362. printk("tvp5150: Line mode registers = 0x%02x\n",
  363. tvp5150_read(c, TVP5150_LINE_MODE_REG_22));
  364. printk("tvp5150: Line mode registers = 0x%02x\n",
  365. tvp5150_read(c, TVP5150_LINE_MODE_REG_23));
  366. printk("tvp5150: Line mode registers = 0x%02x\n",
  367. tvp5150_read(c, TVP5150_LINE_MODE_REG_24));
  368. printk("tvp5150: Line mode registers = 0x%02x\n",
  369. tvp5150_read(c, TVP5150_LINE_MODE_REG_25));
  370. printk("tvp5150: Line mode registers = 0x%02x\n",
  371. tvp5150_read(c, TVP5150_LINE_MODE_REG_27));
  372. printk("tvp5150: Line mode registers = 0x%02x\n",
  373. tvp5150_read(c, TVP5150_LINE_MODE_REG_28));
  374. printk("tvp5150: Line mode registers = 0x%02x\n",
  375. tvp5150_read(c, TVP5150_LINE_MODE_REG_29));
  376. printk("tvp5150: Line mode registers = 0x%02x\n",
  377. tvp5150_read(c, TVP5150_LINE_MODE_REG_30));
  378. printk("tvp5150: Line mode registers = 0x%02x\n",
  379. tvp5150_read(c, TVP5150_LINE_MODE_REG_31));
  380. printk("tvp5150: Line mode registers = 0x%02x\n",
  381. tvp5150_read(c, TVP5150_LINE_MODE_REG_32));
  382. printk("tvp5150: Line mode registers = 0x%02x\n",
  383. tvp5150_read(c, TVP5150_LINE_MODE_REG_33));
  384. printk("tvp5150: Line mode registers = 0x%02x\n",
  385. tvp5150_read(c, TVP5150_LINE_MODE_REG_34));
  386. printk("tvp5150: Line mode registers = 0x%02x\n",
  387. tvp5150_read(c, TVP5150_LINE_MODE_REG_35));
  388. printk("tvp5150: Line mode registers = 0x%02x\n",
  389. tvp5150_read(c, TVP5150_LINE_MODE_REG_36));
  390. printk("tvp5150: Line mode registers = 0x%02x\n",
  391. tvp5150_read(c, TVP5150_LINE_MODE_REG_37));
  392. printk("tvp5150: Line mode registers = 0x%02x\n",
  393. tvp5150_read(c, TVP5150_LINE_MODE_REG_38));
  394. printk("tvp5150: Line mode registers = 0x%02x\n",
  395. tvp5150_read(c, TVP5150_LINE_MODE_REG_39));
  396. printk("tvp5150: Line mode registers = 0x%02x\n",
  397. tvp5150_read(c, TVP5150_LINE_MODE_REG_40));
  398. printk("tvp5150: Line mode registers = 0x%02x\n",
  399. tvp5150_read(c, TVP5150_LINE_MODE_REG_41));
  400. printk("tvp5150: Line mode registers = 0x%02x\n",
  401. tvp5150_read(c, TVP5150_LINE_MODE_REG_42));
  402. printk("tvp5150: Line mode registers = 0x%02x\n",
  403. tvp5150_read(c, TVP5150_LINE_MODE_REG_43));
  404. printk("tvp5150: Line mode registers = 0x%02x\n",
  405. tvp5150_read(c, TVP5150_LINE_MODE_REG_44));
  406. printk("tvp5150: Full field mode register = 0x%02x\n",
  407. tvp5150_read(c, TVP5150_FULL_FIELD_MODE_REG));
  408. }
  409. /****************************************************************************
  410. Basic functions
  411. ****************************************************************************/
  412. enum tvp5150_input {
  413. TVP5150_ANALOG_CH0 = 0,
  414. TVP5150_SVIDEO = 1,
  415. TVP5150_ANALOG_CH1 = 2,
  416. TVP5150_BLACK_SCREEN = 8
  417. };
  418. static inline void tvp5150_selmux(struct i2c_client *c,
  419. enum tvp5150_input input)
  420. {
  421. struct tvp5150 *decoder = i2c_get_clientdata(c);
  422. if (!decoder->enable)
  423. input |= TVP5150_BLACK_SCREEN;
  424. tvp5150_write(c, TVP5150_VD_IN_SRC_SEL_1, input);
  425. };
  426. static inline void tvp5150_reset(struct i2c_client *c)
  427. {
  428. struct tvp5150 *decoder = i2c_get_clientdata(c);
  429. tvp5150_write(c, TVP5150_CONF_SHARED_PIN, 2);
  430. /* Automatic offset and AGC enabled */
  431. tvp5150_write(c, TVP5150_ANAL_CHL_CTL, 0x15);
  432. /* Normal Operation */
  433. // tvp5150_write(c, TVP5150_OP_MODE_CTL, 0x00);
  434. /* Activate YCrCb output 0x9 or 0xd ? */
  435. tvp5150_write(c, TVP5150_MISC_CTL, 0x6f);
  436. /* Activates video std autodetection for all standards */
  437. tvp5150_write(c, TVP5150_AUTOSW_MSK, 0x0);
  438. /* Default format: 0x47, 4:2:2: 0x40 */
  439. tvp5150_write(c, TVP5150_DATA_RATE_SEL, 0x47);
  440. tvp5150_selmux(c, decoder->input);
  441. tvp5150_write(c, TVP5150_CHROMA_PROC_CTL_1, 0x0c);
  442. tvp5150_write(c, TVP5150_CHROMA_PROC_CTL_2, 0x54);
  443. tvp5150_write(c, 0x27, 0x20); /* ?????????? */
  444. tvp5150_write(c, TVP5150_VIDEO_STD, 0x0); /* Auto switch */
  445. tvp5150_write(c, TVP5150_BRIGHT_CTL, decoder->bright >> 8);
  446. tvp5150_write(c, TVP5150_CONTRAST_CTL, decoder->contrast >> 8);
  447. tvp5150_write(c, TVP5150_SATURATION_CTL, decoder->contrast >> 8);
  448. tvp5150_write(c, TVP5150_HUE_CTL, (decoder->hue - 32768) >> 8);
  449. };
  450. static int tvp5150_get_ctrl(struct i2c_client *c, struct v4l2_control *ctrl)
  451. {
  452. /* struct tvp5150 *decoder = i2c_get_clientdata(c); */
  453. switch (ctrl->id) {
  454. case V4L2_CID_BRIGHTNESS:
  455. ctrl->value = tvp5150_read(c, TVP5150_BRIGHT_CTL);
  456. return 0;
  457. case V4L2_CID_CONTRAST:
  458. ctrl->value = tvp5150_read(c, TVP5150_CONTRAST_CTL);
  459. return 0;
  460. case V4L2_CID_SATURATION:
  461. ctrl->value = tvp5150_read(c, TVP5150_SATURATION_CTL);
  462. return 0;
  463. case V4L2_CID_HUE:
  464. ctrl->value = tvp5150_read(c, TVP5150_HUE_CTL);
  465. return 0;
  466. default:
  467. return -EINVAL;
  468. }
  469. }
  470. static int tvp5150_set_ctrl(struct i2c_client *c, struct v4l2_control *ctrl)
  471. {
  472. /* struct tvp5150 *decoder = i2c_get_clientdata(c); */
  473. switch (ctrl->id) {
  474. case V4L2_CID_BRIGHTNESS:
  475. tvp5150_write(c, TVP5150_BRIGHT_CTL, ctrl->value);
  476. return 0;
  477. case V4L2_CID_CONTRAST:
  478. tvp5150_write(c, TVP5150_CONTRAST_CTL, ctrl->value);
  479. return 0;
  480. case V4L2_CID_SATURATION:
  481. tvp5150_write(c, TVP5150_SATURATION_CTL, ctrl->value);
  482. return 0;
  483. case V4L2_CID_HUE:
  484. tvp5150_write(c, TVP5150_HUE_CTL, ctrl->value);
  485. return 0;
  486. default:
  487. return -EINVAL;
  488. }
  489. }
  490. /****************************************************************************
  491. I2C Command
  492. ****************************************************************************/
  493. static int tvp5150_command(struct i2c_client *client,
  494. unsigned int cmd, void *arg)
  495. {
  496. struct tvp5150 *decoder = i2c_get_clientdata(client);
  497. switch (cmd) {
  498. case 0:
  499. case DECODER_INIT:
  500. tvp5150_reset(client);
  501. break;
  502. case DECODER_DUMP:
  503. dump_reg(client);
  504. break;
  505. case DECODER_GET_CAPABILITIES:
  506. {
  507. struct video_decoder_capability *cap = arg;
  508. cap->flags = VIDEO_DECODER_PAL |
  509. VIDEO_DECODER_NTSC |
  510. VIDEO_DECODER_SECAM |
  511. VIDEO_DECODER_AUTO | VIDEO_DECODER_CCIR;
  512. cap->inputs = 3;
  513. cap->outputs = 1;
  514. break;
  515. }
  516. case DECODER_GET_STATUS:
  517. {
  518. break;
  519. }
  520. case DECODER_SET_GPIO:
  521. break;
  522. case DECODER_SET_VBI_BYPASS:
  523. break;
  524. case DECODER_SET_NORM:
  525. {
  526. int *iarg = arg;
  527. switch (*iarg) {
  528. case VIDEO_MODE_NTSC:
  529. break;
  530. case VIDEO_MODE_PAL:
  531. break;
  532. case VIDEO_MODE_SECAM:
  533. break;
  534. case VIDEO_MODE_AUTO:
  535. break;
  536. default:
  537. return -EINVAL;
  538. }
  539. decoder->norm = *iarg;
  540. break;
  541. }
  542. case DECODER_SET_INPUT:
  543. {
  544. int *iarg = arg;
  545. if (*iarg < 0 || *iarg > 3) {
  546. return -EINVAL;
  547. }
  548. decoder->input = *iarg;
  549. tvp5150_selmux(client, decoder->input);
  550. break;
  551. }
  552. case DECODER_SET_OUTPUT:
  553. {
  554. int *iarg = arg;
  555. /* not much choice of outputs */
  556. if (*iarg != 0) {
  557. return -EINVAL;
  558. }
  559. break;
  560. }
  561. case DECODER_ENABLE_OUTPUT:
  562. {
  563. int *iarg = arg;
  564. decoder->enable = (*iarg != 0);
  565. tvp5150_selmux(client, decoder->input);
  566. break;
  567. }
  568. case VIDIOC_QUERYCTRL:
  569. {
  570. struct v4l2_queryctrl *qc = arg;
  571. u8 i, n;
  572. dprintk(1, KERN_DEBUG "VIDIOC_QUERYCTRL");
  573. n = sizeof(tvp5150_qctrl) / sizeof(tvp5150_qctrl[0]);
  574. for (i = 0; i < n; i++)
  575. if (qc->id && qc->id == tvp5150_qctrl[i].id) {
  576. memcpy(qc, &(tvp5150_qctrl[i]),
  577. sizeof(*qc));
  578. return 0;
  579. }
  580. return -EINVAL;
  581. }
  582. case VIDIOC_G_CTRL:
  583. {
  584. struct v4l2_control *ctrl = arg;
  585. dprintk(1, KERN_DEBUG "VIDIOC_G_CTRL");
  586. return tvp5150_get_ctrl(client, ctrl);
  587. }
  588. case VIDIOC_S_CTRL_OLD: /* ??? */
  589. case VIDIOC_S_CTRL:
  590. {
  591. struct v4l2_control *ctrl = arg;
  592. u8 i, n;
  593. dprintk(1, KERN_DEBUG "VIDIOC_S_CTRL");
  594. n = sizeof(tvp5150_qctrl) / sizeof(tvp5150_qctrl[0]);
  595. for (i = 0; i < n; i++)
  596. if (ctrl->id == tvp5150_qctrl[i].id) {
  597. if (ctrl->value <
  598. tvp5150_qctrl[i].minimum
  599. || ctrl->value >
  600. tvp5150_qctrl[i].maximum)
  601. return -ERANGE;
  602. dprintk(1,
  603. KERN_DEBUG
  604. "VIDIOC_S_CTRL: id=%d, value=%d",
  605. ctrl->id, ctrl->value);
  606. return tvp5150_set_ctrl(client, ctrl);
  607. }
  608. return -EINVAL;
  609. }
  610. case DECODER_SET_PICTURE:
  611. {
  612. struct video_picture *pic = arg;
  613. if (decoder->bright != pic->brightness) {
  614. /* We want 0 to 255 we get 0-65535 */
  615. decoder->bright = pic->brightness;
  616. tvp5150_write(client, TVP5150_BRIGHT_CTL,
  617. decoder->bright >> 8);
  618. }
  619. if (decoder->contrast != pic->contrast) {
  620. /* We want 0 to 255 we get 0-65535 */
  621. decoder->contrast = pic->contrast;
  622. tvp5150_write(client, TVP5150_CONTRAST_CTL,
  623. decoder->contrast >> 8);
  624. }
  625. if (decoder->sat != pic->colour) {
  626. /* We want 0 to 255 we get 0-65535 */
  627. decoder->sat = pic->colour;
  628. tvp5150_write(client, TVP5150_SATURATION_CTL,
  629. decoder->contrast >> 8);
  630. }
  631. if (decoder->hue != pic->hue) {
  632. /* We want -128 to 127 we get 0-65535 */
  633. decoder->hue = pic->hue;
  634. tvp5150_write(client, TVP5150_HUE_CTL,
  635. (decoder->hue - 32768) >> 8);
  636. }
  637. break;
  638. }
  639. default:
  640. return -EINVAL;
  641. }
  642. return 0;
  643. }
  644. /****************************************************************************
  645. I2C Client & Driver
  646. ****************************************************************************/
  647. static struct i2c_driver driver;
  648. static struct i2c_client client_template = {
  649. .name = "(unset)",
  650. .flags = I2C_CLIENT_ALLOW_USE,
  651. .driver = &driver,
  652. };
  653. static int tvp5150_detect_client(struct i2c_adapter *adapter,
  654. int address, int kind)
  655. {
  656. struct i2c_client *client;
  657. struct tvp5150 *core;
  658. int rv;
  659. dprintk(1,
  660. KERN_INFO
  661. "tvp5150.c: detecting tvp5150 client on address 0x%x\n",
  662. address << 1);
  663. client_template.adapter = adapter;
  664. client_template.addr = address;
  665. /* Check if the adapter supports the needed features */
  666. if (!i2c_check_functionality
  667. (adapter,
  668. I2C_FUNC_SMBUS_READ_BYTE | I2C_FUNC_SMBUS_WRITE_BYTE_DATA))
  669. return 0;
  670. client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL);
  671. if (client == 0)
  672. return -ENOMEM;
  673. memcpy(client, &client_template, sizeof(struct i2c_client));
  674. core = kmalloc(sizeof(struct tvp5150), GFP_KERNEL);
  675. if (core == 0) {
  676. kfree(client);
  677. return -ENOMEM;
  678. }
  679. memset(core, 0, sizeof(struct tvp5150));
  680. i2c_set_clientdata(client, core);
  681. rv = i2c_attach_client(client);
  682. core->norm = VIDEO_MODE_AUTO;
  683. core->input = 2;
  684. core->enable = 1;
  685. core->bright = 32768;
  686. core->contrast = 32768;
  687. core->hue = 32768;
  688. core->sat = 32768;
  689. if (rv) {
  690. kfree(client);
  691. kfree(core);
  692. return rv;
  693. }
  694. if (debug > 1)
  695. dump_reg(client);
  696. return 0;
  697. }
  698. static int tvp5150_attach_adapter(struct i2c_adapter *adapter)
  699. {
  700. dprintk(1,
  701. KERN_INFO
  702. "tvp5150.c: starting probe for adapter %s (0x%x)\n",
  703. adapter->name, adapter->id);
  704. return i2c_probe(adapter, &addr_data, &tvp5150_detect_client);
  705. }
  706. static int tvp5150_detach_client(struct i2c_client *client)
  707. {
  708. struct tvp5150 *decoder = i2c_get_clientdata(client);
  709. int err;
  710. err = i2c_detach_client(client);
  711. if (err) {
  712. return err;
  713. }
  714. kfree(decoder);
  715. kfree(client);
  716. return 0;
  717. }
  718. /* ----------------------------------------------------------------------- */
  719. static struct i2c_driver driver = {
  720. .owner = THIS_MODULE,
  721. .name = "tvp5150",
  722. /* FIXME */
  723. .id = I2C_DRIVERID_SAA7110,
  724. .flags = I2C_DF_NOTIFY,
  725. .attach_adapter = tvp5150_attach_adapter,
  726. .detach_client = tvp5150_detach_client,
  727. .command = tvp5150_command,
  728. };
  729. static int __init tvp5150_init(void)
  730. {
  731. return i2c_add_driver(&driver);
  732. }
  733. static void __exit tvp5150_exit(void)
  734. {
  735. i2c_del_driver(&driver);
  736. }
  737. module_init(tvp5150_init);
  738. module_exit(tvp5150_exit);