saa7191.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  1. /*
  2. * saa7191.c - Philips SAA7191 video decoder driver
  3. *
  4. * Copyright (C) 2003 Ladislav Michl <ladis@linux-mips.org>
  5. * Copyright (C) 2004,2005 Mikael Nousiainen <tmnousia@cc.hut.fi>
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License version 2 as
  9. * published by the Free Software Foundation.
  10. */
  11. #include <linux/delay.h>
  12. #include <linux/errno.h>
  13. #include <linux/fs.h>
  14. #include <linux/init.h>
  15. #include <linux/kernel.h>
  16. #include <linux/major.h>
  17. #include <linux/module.h>
  18. #include <linux/mm.h>
  19. #include <linux/sched.h>
  20. #include <linux/slab.h>
  21. #include <linux/videodev.h>
  22. #include <linux/video_decoder.h>
  23. #include <linux/i2c.h>
  24. #include "saa7191.h"
  25. #define SAA7191_MODULE_VERSION "0.0.3"
  26. MODULE_DESCRIPTION("Philips SAA7191 video decoder driver");
  27. MODULE_VERSION(SAA7191_MODULE_VERSION);
  28. MODULE_AUTHOR("Mikael Nousiainen <tmnousia@cc.hut.fi>");
  29. MODULE_LICENSE("GPL");
  30. struct saa7191 {
  31. struct i2c_client *client;
  32. /* the register values are stored here as the actual
  33. * I2C-registers are write-only */
  34. unsigned char reg[25];
  35. unsigned char norm;
  36. unsigned char input;
  37. };
  38. static struct i2c_driver i2c_driver_saa7191;
  39. static const unsigned char initseq[] = {
  40. 0, /* Subaddress */
  41. 0x50, /* SAA7191_REG_IDEL */
  42. 0x30, /* SAA7191_REG_HSYB */
  43. 0x00, /* SAA7191_REG_HSYS */
  44. 0xe8, /* SAA7191_REG_HCLB */
  45. 0xb6, /* SAA7191_REG_HCLS */
  46. 0xf4, /* SAA7191_REG_HPHI */
  47. 0x01, /* SAA7191_REG_LUMA - chrominance trap active (CVBS) */
  48. 0x00, /* SAA7191_REG_HUEC */
  49. 0xf8, /* SAA7191_REG_CKTQ */
  50. 0xf8, /* SAA7191_REG_CKTS */
  51. 0x90, /* SAA7191_REG_PLSE */
  52. 0x90, /* SAA7191_REG_SESE */
  53. 0x00, /* SAA7191_REG_GAIN */
  54. 0x0c, /* SAA7191_REG_STDC - not SECAM, slow time constant */
  55. 0x78, /* SAA7191_REG_IOCK - chrominance from CVBS, GPSW1 & 2 off */
  56. 0x99, /* SAA7191_REG_CTL3 - automatic field detection */
  57. 0x00, /* SAA7191_REG_CTL4 */
  58. 0x2c, /* SAA7191_REG_CHCV */
  59. 0x00, /* unused */
  60. 0x00, /* unused */
  61. 0x34, /* SAA7191_REG_HS6B */
  62. 0x0a, /* SAA7191_REG_HS6S */
  63. 0xf4, /* SAA7191_REG_HC6B */
  64. 0xce, /* SAA7191_REG_HC6S */
  65. 0xf4, /* SAA7191_REG_HP6I */
  66. };
  67. /* SAA7191 register handling */
  68. static unsigned char saa7191_read_reg(struct i2c_client *client,
  69. unsigned char reg)
  70. {
  71. return ((struct saa7191 *)i2c_get_clientdata(client))->reg[reg];
  72. }
  73. static int saa7191_read_status(struct i2c_client *client,
  74. unsigned char *value)
  75. {
  76. int ret;
  77. ret = i2c_master_recv(client, value, 1);
  78. if (ret < 0) {
  79. printk(KERN_ERR "SAA7191: saa7191_read_status(): read failed");
  80. return ret;
  81. }
  82. return 0;
  83. }
  84. static int saa7191_write_reg(struct i2c_client *client, unsigned char reg,
  85. unsigned char value)
  86. {
  87. ((struct saa7191 *)i2c_get_clientdata(client))->reg[reg] = value;
  88. return i2c_smbus_write_byte_data(client, reg, value);
  89. }
  90. /* the first byte of data must be the first subaddress number (register) */
  91. static int saa7191_write_block(struct i2c_client *client,
  92. unsigned char length, unsigned char *data)
  93. {
  94. int i;
  95. int ret;
  96. struct saa7191 *decoder = (struct saa7191 *)i2c_get_clientdata(client);
  97. for (i = 0; i < (length - 1); i++) {
  98. decoder->reg[data[0] + i] = data[i + 1];
  99. }
  100. ret = i2c_master_send(client, data, length);
  101. if (ret < 0) {
  102. printk(KERN_ERR "SAA7191: saa7191_write_block(): "
  103. "write failed");
  104. return ret;
  105. }
  106. return 0;
  107. }
  108. /* Helper functions */
  109. static int saa7191_set_input(struct i2c_client *client, int input)
  110. {
  111. unsigned char luma = saa7191_read_reg(client, SAA7191_REG_LUMA);
  112. unsigned char iock = saa7191_read_reg(client, SAA7191_REG_IOCK);
  113. int err;
  114. switch (input) {
  115. case SAA7191_INPUT_COMPOSITE: /* Set Composite input */
  116. iock &= ~(SAA7191_IOCK_CHRS | SAA7191_IOCK_GPSW1
  117. | SAA7191_IOCK_GPSW2);
  118. /* Chrominance trap active */
  119. luma &= ~SAA7191_LUMA_BYPS;
  120. break;
  121. case SAA7191_INPUT_SVIDEO: /* Set S-Video input */
  122. iock |= SAA7191_IOCK_CHRS | SAA7191_IOCK_GPSW2;
  123. /* Chrominance trap bypassed */
  124. luma |= SAA7191_LUMA_BYPS;
  125. break;
  126. default:
  127. return -EINVAL;
  128. }
  129. err = saa7191_write_reg(client, SAA7191_REG_LUMA, luma);
  130. if (err)
  131. return -EIO;
  132. err = saa7191_write_reg(client, SAA7191_REG_IOCK, iock);
  133. if (err)
  134. return -EIO;
  135. return 0;
  136. }
  137. static int saa7191_set_norm(struct i2c_client *client, int norm)
  138. {
  139. struct saa7191 *decoder = i2c_get_clientdata(client);
  140. unsigned char stdc = saa7191_read_reg(client, SAA7191_REG_STDC);
  141. unsigned char ctl3 = saa7191_read_reg(client, SAA7191_REG_CTL3);
  142. unsigned char chcv = saa7191_read_reg(client, SAA7191_REG_CHCV);
  143. int err;
  144. switch(norm) {
  145. case SAA7191_NORM_AUTO: {
  146. unsigned char status;
  147. // does status depend on current norm ?
  148. if (saa7191_read_status(client, &status))
  149. return -EIO;
  150. stdc &= ~SAA7191_STDC_SECS;
  151. ctl3 &= ~SAA7191_CTL3_FSEL;
  152. ctl3 |= SAA7191_CTL3_AUFD;
  153. chcv = (status & SAA7191_STATUS_FIDT)
  154. ? SAA7191_CHCV_NTSC : SAA7191_CHCV_PAL;
  155. break;
  156. }
  157. case SAA7191_NORM_PAL:
  158. stdc &= ~SAA7191_STDC_SECS;
  159. ctl3 &= ~(SAA7191_CTL3_AUFD | SAA7191_CTL3_FSEL);
  160. chcv = SAA7191_CHCV_PAL;
  161. break;
  162. case SAA7191_NORM_NTSC:
  163. stdc &= ~SAA7191_STDC_SECS;
  164. ctl3 &= ~SAA7191_CTL3_AUFD;
  165. ctl3 |= SAA7191_CTL3_FSEL;
  166. chcv = SAA7191_CHCV_NTSC;
  167. break;
  168. case SAA7191_NORM_SECAM:
  169. stdc |= SAA7191_STDC_SECS;
  170. ctl3 &= ~(SAA7191_CTL3_AUFD | SAA7191_CTL3_FSEL);
  171. chcv = SAA7191_CHCV_PAL;
  172. break;
  173. default:
  174. return -EINVAL;
  175. }
  176. err = saa7191_write_reg(client, SAA7191_REG_CTL3, ctl3);
  177. if (err)
  178. return -EIO;
  179. err = saa7191_write_reg(client, SAA7191_REG_STDC, stdc);
  180. if (err)
  181. return -EIO;
  182. err = saa7191_write_reg(client, SAA7191_REG_CHCV, chcv);
  183. if (err)
  184. return -EIO;
  185. decoder->norm = norm;
  186. return 0;
  187. }
  188. static int saa7191_get_controls(struct i2c_client *client,
  189. struct saa7191_control *ctrl)
  190. {
  191. unsigned char hue = saa7191_read_reg(client, SAA7191_REG_HUEC);
  192. unsigned char stdc = saa7191_read_reg(client, SAA7191_REG_STDC);
  193. if (hue < 0x80) {
  194. hue += 0x80;
  195. } else {
  196. hue -= 0x80;
  197. }
  198. ctrl->hue = hue;
  199. ctrl->vtrc = (stdc & SAA7191_STDC_VTRC)
  200. ? SAA7191_VALUE_ENABLED : SAA7191_VALUE_DISABLED;
  201. return 0;
  202. }
  203. static int saa7191_set_controls(struct i2c_client *client,
  204. struct saa7191_control *ctrl)
  205. {
  206. int err;
  207. if (ctrl->hue >= 0) {
  208. unsigned char hue = ctrl->hue & 0xff;
  209. if (hue < 0x80) {
  210. hue += 0x80;
  211. } else {
  212. hue -= 0x80;
  213. }
  214. err = saa7191_write_reg(client, SAA7191_REG_HUEC, hue);
  215. if (err)
  216. return -EIO;
  217. }
  218. if (ctrl->vtrc >= 0) {
  219. unsigned char stdc =
  220. saa7191_read_reg(client, SAA7191_REG_STDC);
  221. if (ctrl->vtrc) {
  222. stdc |= SAA7191_STDC_VTRC;
  223. } else {
  224. stdc &= ~SAA7191_STDC_VTRC;
  225. }
  226. err = saa7191_write_reg(client, SAA7191_REG_STDC, stdc);
  227. if (err)
  228. return -EIO;
  229. }
  230. return 0;
  231. }
  232. /* I2C-interface */
  233. static int saa7191_attach(struct i2c_adapter *adap, int addr, int kind)
  234. {
  235. int err = 0;
  236. struct saa7191 *decoder;
  237. struct i2c_client *client;
  238. printk(KERN_INFO "Philips SAA7191 driver version %s\n",
  239. SAA7191_MODULE_VERSION);
  240. client = kmalloc(sizeof(*client), GFP_KERNEL);
  241. if (!client)
  242. return -ENOMEM;
  243. decoder = kmalloc(sizeof(*decoder), GFP_KERNEL);
  244. if (!decoder) {
  245. err = -ENOMEM;
  246. goto out_free_client;
  247. }
  248. memset(client, 0, sizeof(struct i2c_client));
  249. memset(decoder, 0, sizeof(struct saa7191));
  250. client->addr = addr;
  251. client->adapter = adap;
  252. client->driver = &i2c_driver_saa7191;
  253. client->flags = 0;
  254. strcpy(client->name, "saa7191 client");
  255. i2c_set_clientdata(client, decoder);
  256. decoder->client = client;
  257. err = i2c_attach_client(client);
  258. if (err)
  259. goto out_free_decoder;
  260. decoder->input = SAA7191_INPUT_COMPOSITE;
  261. decoder->norm = SAA7191_NORM_AUTO;
  262. err = saa7191_write_block(client, sizeof(initseq),
  263. (unsigned char *)initseq);
  264. if (err) {
  265. printk(KERN_ERR "SAA7191 initialization failed\n");
  266. goto out_detach_client;
  267. }
  268. printk(KERN_INFO "SAA7191 initialized\n");
  269. return 0;
  270. out_detach_client:
  271. i2c_detach_client(client);
  272. out_free_decoder:
  273. kfree(decoder);
  274. out_free_client:
  275. kfree(client);
  276. return err;
  277. }
  278. static int saa7191_probe(struct i2c_adapter *adap)
  279. {
  280. /* Always connected to VINO */
  281. if (adap->id == I2C_HW_SGI_VINO)
  282. return saa7191_attach(adap, SAA7191_ADDR, 0);
  283. /* Feel free to add probe here :-) */
  284. return -ENODEV;
  285. }
  286. static int saa7191_detach(struct i2c_client *client)
  287. {
  288. struct saa7191 *decoder = i2c_get_clientdata(client);
  289. i2c_detach_client(client);
  290. kfree(decoder);
  291. kfree(client);
  292. return 0;
  293. }
  294. static int saa7191_command(struct i2c_client *client, unsigned int cmd,
  295. void *arg)
  296. {
  297. struct saa7191 *decoder = i2c_get_clientdata(client);
  298. switch (cmd) {
  299. case DECODER_GET_CAPABILITIES: {
  300. struct video_decoder_capability *cap = arg;
  301. cap->flags = VIDEO_DECODER_PAL | VIDEO_DECODER_NTSC |
  302. VIDEO_DECODER_SECAM | VIDEO_DECODER_AUTO;
  303. cap->inputs = (client->adapter->id == I2C_HW_SGI_VINO) ? 2 : 1;
  304. cap->outputs = 1;
  305. break;
  306. }
  307. case DECODER_GET_STATUS: {
  308. int *iarg = arg;
  309. unsigned char status;
  310. int res = 0;
  311. if (saa7191_read_status(client, &status)) {
  312. return -EIO;
  313. }
  314. if ((status & SAA7191_STATUS_HLCK) == 0)
  315. res |= DECODER_STATUS_GOOD;
  316. if (status & SAA7191_STATUS_CODE)
  317. res |= DECODER_STATUS_COLOR;
  318. switch (decoder->norm) {
  319. case SAA7191_NORM_NTSC:
  320. res |= DECODER_STATUS_NTSC;
  321. break;
  322. case SAA7191_NORM_PAL:
  323. res |= DECODER_STATUS_PAL;
  324. break;
  325. case SAA7191_NORM_SECAM:
  326. res |= DECODER_STATUS_SECAM;
  327. break;
  328. case SAA7191_NORM_AUTO:
  329. default:
  330. if (status & SAA7191_STATUS_FIDT)
  331. res |= DECODER_STATUS_NTSC;
  332. else
  333. res |= DECODER_STATUS_PAL;
  334. break;
  335. }
  336. *iarg = res;
  337. break;
  338. }
  339. case DECODER_SET_NORM: {
  340. int *iarg = arg;
  341. switch (*iarg) {
  342. case VIDEO_MODE_AUTO:
  343. return saa7191_set_norm(client, SAA7191_NORM_AUTO);
  344. case VIDEO_MODE_PAL:
  345. return saa7191_set_norm(client, SAA7191_NORM_PAL);
  346. case VIDEO_MODE_NTSC:
  347. return saa7191_set_norm(client, SAA7191_NORM_NTSC);
  348. case VIDEO_MODE_SECAM:
  349. return saa7191_set_norm(client, SAA7191_NORM_SECAM);
  350. default:
  351. return -EINVAL;
  352. }
  353. break;
  354. }
  355. case DECODER_SET_INPUT: {
  356. int *iarg = arg;
  357. switch (client->adapter->id) {
  358. case I2C_HW_SGI_VINO:
  359. return saa7191_set_input(client, *iarg);
  360. default:
  361. if (*iarg != 0)
  362. return -EINVAL;
  363. }
  364. break;
  365. }
  366. case DECODER_SET_OUTPUT: {
  367. int *iarg = arg;
  368. /* not much choice of outputs */
  369. if (*iarg != 0)
  370. return -EINVAL;
  371. break;
  372. }
  373. case DECODER_ENABLE_OUTPUT: {
  374. /* Always enabled */
  375. break;
  376. }
  377. case DECODER_SET_PICTURE: {
  378. struct video_picture *pic = arg;
  379. unsigned val;
  380. int err;
  381. val = (pic->hue >> 8) - 0x80;
  382. err = saa7191_write_reg(client, SAA7191_REG_HUEC, val);
  383. if (err)
  384. return -EIO;
  385. break;
  386. }
  387. case DECODER_SAA7191_GET_STATUS: {
  388. struct saa7191_status *status = arg;
  389. unsigned char status_reg;
  390. if (saa7191_read_status(client, &status_reg))
  391. return -EIO;
  392. status->signal = ((status_reg & SAA7191_STATUS_HLCK) == 0)
  393. ? SAA7191_VALUE_ENABLED : SAA7191_VALUE_DISABLED;
  394. status->ntsc = (status_reg & SAA7191_STATUS_FIDT)
  395. ? SAA7191_VALUE_ENABLED : SAA7191_VALUE_DISABLED;
  396. status->color = (status_reg & SAA7191_STATUS_CODE)
  397. ? SAA7191_VALUE_ENABLED : SAA7191_VALUE_DISABLED;
  398. status->input = decoder->input;
  399. status->norm = decoder->norm;
  400. }
  401. case DECODER_SAA7191_SET_NORM: {
  402. int *norm = arg;
  403. return saa7191_set_norm(client, *norm);
  404. }
  405. case DECODER_SAA7191_GET_CONTROLS: {
  406. struct saa7191_control *ctrl = arg;
  407. return saa7191_get_controls(client, ctrl);
  408. }
  409. case DECODER_SAA7191_SET_CONTROLS: {
  410. struct saa7191_control *ctrl = arg;
  411. return saa7191_set_controls(client, ctrl);
  412. }
  413. default:
  414. return -EINVAL;
  415. }
  416. return 0;
  417. }
  418. static struct i2c_driver i2c_driver_saa7191 = {
  419. .owner = THIS_MODULE,
  420. .name = "saa7191",
  421. .id = I2C_DRIVERID_SAA7191,
  422. .flags = I2C_DF_NOTIFY,
  423. .attach_adapter = saa7191_probe,
  424. .detach_client = saa7191_detach,
  425. .command = saa7191_command
  426. };
  427. static int saa7191_init(void)
  428. {
  429. return i2c_add_driver(&i2c_driver_saa7191);
  430. }
  431. static void saa7191_exit(void)
  432. {
  433. i2c_del_driver(&i2c_driver_saa7191);
  434. }
  435. module_init(saa7191_init);
  436. module_exit(saa7191_exit);