Linux-2.6.12-rc2
[linux-flexiantxendom0-natty.git] / drivers / media / video / zr36120_i2c.c
1 /*
2     zr36120_i2c.c - Zoran 36120/36125 based framegrabbers
3
4     Copyright (C) 1998-1999 Pauline Middelink <middelin@polyware.nl>
5
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
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with this program; if not, write to the Free Software
18     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 */
20
21 #include <linux/types.h>
22 #include <linux/delay.h>
23 #include <asm/io.h>
24
25 #include <linux/video_decoder.h>
26 #include <asm/uaccess.h>
27
28 #include "tuner.h"
29 #include "zr36120.h"
30
31 /* ----------------------------------------------------------------------- */
32 /* I2C functions                                                           */
33 /* ----------------------------------------------------------------------- */
34
35 /* software I2C functions */
36
37 #define I2C_DELAY   10
38
39 static void i2c_setlines(struct i2c_bus *bus,int ctrl,int data)
40 {
41         struct zoran *ztv = (struct zoran*)bus->data;
42         unsigned int b = 0;
43         if (data) b |= ztv->card->swapi2c ? ZORAN_I2C_SCL : ZORAN_I2C_SDA;
44         if (ctrl) b |= ztv->card->swapi2c ? ZORAN_I2C_SDA : ZORAN_I2C_SCL;
45         zrwrite(b, ZORAN_I2C);
46         udelay(I2C_DELAY);
47 }
48
49 static int i2c_getdataline(struct i2c_bus *bus)
50 {
51         struct zoran *ztv = (struct zoran*)bus->data;
52         if (ztv->card->swapi2c)
53                 return zrread(ZORAN_I2C) & ZORAN_I2C_SCL;
54         return zrread(ZORAN_I2C) & ZORAN_I2C_SDA;
55 }
56
57 static
58 void attach_inform(struct i2c_bus *bus, int id)
59 {
60         struct zoran *ztv = (struct zoran*)bus->data;
61         struct video_decoder_capability dc;
62         int rv;
63
64         switch (id) {
65          case I2C_DRIVERID_VIDEODECODER:
66                 DEBUG(printk(CARD_INFO "decoder attached\n",CARD));
67
68                 /* fetch the capabilites of the decoder */
69                 rv = i2c_control_device(&ztv->i2c, I2C_DRIVERID_VIDEODECODER, DECODER_GET_CAPABILITIES, &dc);
70                 if (rv) {
71                         DEBUG(printk(CARD_DEBUG "decoder is not V4L aware!\n",CARD));
72                         break;
73                 }
74                 DEBUG(printk(CARD_DEBUG "capabilities %d %d %d\n",CARD,dc.flags,dc.inputs,dc.outputs));
75
76                 /* Test if the decoder can de VBI transfers */
77                 if (dc.flags & 16 /*VIDEO_DECODER_VBI*/)
78                         ztv->have_decoder = 2;
79                 else
80                         ztv->have_decoder = 1;
81                 break;
82          case I2C_DRIVERID_TUNER:
83                 ztv->have_tuner = 1;
84                 DEBUG(printk(CARD_INFO "tuner attached\n",CARD));
85                 if (ztv->tuner_type >= 0)
86                 {
87                         if (i2c_control_device(&ztv->i2c,I2C_DRIVERID_TUNER,TUNER_SET_TYPE,&ztv->tuner_type)<0)
88                         DEBUG(printk(CARD_INFO "attach_inform; tuner won't be set to type %d\n",CARD,ztv->tuner_type));
89                 }
90                 break;
91          default:
92                 DEBUG(printk(CARD_INFO "attach_inform; unknown device id=%d\n",CARD,id));
93                 break;
94         }
95 }
96
97 static
98 void detach_inform(struct i2c_bus *bus, int id)
99 {
100         struct zoran *ztv = (struct zoran*)bus->data;
101
102         switch (id) {
103          case I2C_DRIVERID_VIDEODECODER:
104                 ztv->have_decoder = 0;
105                 DEBUG(printk(CARD_INFO "decoder detached\n",CARD));
106                 break;
107          case I2C_DRIVERID_TUNER:
108                 ztv->have_tuner = 0;
109                 DEBUG(printk(CARD_INFO "tuner detached\n",CARD));
110                 break;
111          default:
112                 DEBUG(printk(CARD_INFO "detach_inform; unknown device id=%d\n",CARD,id));
113                 break;
114         }
115 }
116
117 struct i2c_bus zoran_i2c_bus_template =
118 {
119         "ZR36120",
120         I2C_BUSID_ZORAN,
121         NULL,
122
123         SPIN_LOCK_UNLOCKED,
124
125         attach_inform,
126         detach_inform,
127
128         i2c_setlines,
129         i2c_getdataline,
130         NULL,
131         NULL
132 };