diff options
Diffstat (limited to 'drivers/media/video/tvp5150.c')
-rw-r--r-- | drivers/media/video/tvp5150.c | 378 |
1 files changed, 378 insertions, 0 deletions
diff --git a/drivers/media/video/tvp5150.c b/drivers/media/video/tvp5150.c new file mode 100644 index 000000000000..e575877f8269 --- /dev/null +++ b/drivers/media/video/tvp5150.c | |||
@@ -0,0 +1,378 @@ | |||
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 | |||
8 | #include <linux/videodev.h> | ||
9 | #include <linux/i2c.h> | ||
10 | #include <linux/videodev.h> | ||
11 | #include <linux/delay.h> | ||
12 | |||
13 | #include "tvp5150_reg.h" | ||
14 | |||
15 | MODULE_DESCRIPTION("Texas Instruments TVP5150A video decoder driver");/* standard i2c insmod options */ | ||
16 | MODULE_AUTHOR("Mauro Carvalho Chehab"); | ||
17 | MODULE_LICENSE("GPL"); | ||
18 | |||
19 | static unsigned short normal_i2c[] = { | ||
20 | 0xb8 >>1, | ||
21 | 0xba >>1, | ||
22 | I2C_CLIENT_END | ||
23 | }; | ||
24 | |||
25 | I2C_CLIENT_INSMOD; | ||
26 | |||
27 | static int debug = 0; | ||
28 | module_param(debug, int, 0); | ||
29 | MODULE_PARM_DESC(debug, "Debug level (0-1)"); | ||
30 | |||
31 | #define dprintk(num, format, args...) \ | ||
32 | do { \ | ||
33 | if (debug >= num) \ | ||
34 | printk(format , ##args); \ | ||
35 | } while (0) | ||
36 | |||
37 | struct tvp5150 { | ||
38 | struct i2c_client *client; | ||
39 | }; | ||
40 | |||
41 | static inline int tvp5150_read(struct i2c_client *c,unsigned char addr) | ||
42 | { | ||
43 | unsigned char buffer[1]; | ||
44 | int rc; | ||
45 | /* struct tvp5150 *core = i2c_get_clientdata(c); */ | ||
46 | |||
47 | buffer[0] = addr; | ||
48 | if (1 != (rc = i2c_master_send(c, buffer, 1))) | ||
49 | dprintk(0,"i2c i/o error: rc == %d (should be 1)\n", rc); | ||
50 | |||
51 | msleep(10); | ||
52 | |||
53 | if (1 != (rc = i2c_master_recv(c, buffer, 1))) | ||
54 | dprintk(0,"i2c i/o error: rc == %d (should be 1)\n", rc); | ||
55 | |||
56 | return (buffer[0]); | ||
57 | } | ||
58 | |||
59 | static inline void tvp5150_write(struct i2c_client *c,unsigned char addr, unsigned char value) | ||
60 | { | ||
61 | unsigned char buffer[2]; | ||
62 | int rc; | ||
63 | /* struct tvp5150 *core = i2c_get_clientdata(c); */ | ||
64 | |||
65 | buffer[0] = addr; | ||
66 | buffer[2] = addr; | ||
67 | if (2 != (rc = i2c_master_send(c, buffer, 2))) | ||
68 | dprintk(0,"i2c i/o error: rc == %d (should be 2)\n", rc); | ||
69 | } | ||
70 | |||
71 | static void dump_reg (struct i2c_client *c) | ||
72 | { | ||
73 | dprintk (2, "tvp5150: Video input source selection #1 = 0x%02x\n", tvp5150_read(c,TVP5150_VD_IN_SRC_SEL_1)); | ||
74 | dprintk (2, "tvp5150: Analog channel controls = 0x%02x\n", tvp5150_read(c,TVP5150_ANAL_CHL_CTL)); | ||
75 | dprintk (2, "tvp5150: Operation mode controls = 0x%02x\n", tvp5150_read(c,TVP5150_OP_MODE_CTL)); | ||
76 | dprintk (2, "tvp5150: Miscellaneous controls = 0x%02x\n", tvp5150_read(c,TVP5150_MISC_CTL)); | ||
77 | dprintk (2, "tvp5150: Autoswitch mask: TVP5150A / TVP5150AM = 0x%02x\n", tvp5150_read(c,TVP5150_AUTOSW_MSK)); | ||
78 | dprintk (2, "tvp5150: Color killer threshold control = 0x%02x\n", tvp5150_read(c,TVP5150_COLOR_KIL_THSH_CTL)); | ||
79 | dprintk (2, "tvp5150: Luminance processing control #1 = 0x%02x\n", tvp5150_read(c,TVP5150_LUMA_PROC_CTL_1)); | ||
80 | dprintk (2, "tvp5150: Luminance processing control #2 = 0x%02x\n", tvp5150_read(c,TVP5150_LUMA_PROC_CTL_2)); | ||
81 | dprintk (2, "tvp5150: Brightness control = 0x%02x\n", tvp5150_read(c,TVP5150_BRIGHT_CTL)); | ||
82 | dprintk (2, "tvp5150: Color saturation control = 0x%02x\n", tvp5150_read(c,TVP5150_SATURATION_CTL)); | ||
83 | dprintk (2, "tvp5150: Hue control = 0x%02x\n", tvp5150_read(c,TVP5150_HUE_CTL)); | ||
84 | dprintk (2, "tvp5150: Contrast control = 0x%02x\n", tvp5150_read(c,TVP5150_CONTRAST_CTL)); | ||
85 | dprintk (2, "tvp5150: Outputs and data rates select = 0x%02x\n", tvp5150_read(c,TVP5150_DATA_RATE_SEL)); | ||
86 | dprintk (2, "tvp5150: Luminance processing control #3 = 0x%02x\n", tvp5150_read(c,TVP5150_LUMA_PROC_CTL_3)); | ||
87 | dprintk (2, "tvp5150: Configuration shared pins = 0x%02x\n", tvp5150_read(c,TVP5150_CONF_SHARED_PIN)); | ||
88 | dprintk (2, "tvp5150: Active video cropping start MSB = 0x%02x\n", tvp5150_read(c,TVP5150_ACT_VD_CROP_ST_MSB)); | ||
89 | dprintk (2, "tvp5150: Active video cropping start LSB = 0x%02x\n", tvp5150_read(c,TVP5150_ACT_VD_CROP_ST_LSB)); | ||
90 | dprintk (2, "tvp5150: Active video cropping stop MSB = 0x%02x\n", tvp5150_read(c,TVP5150_ACT_VD_CROP_STP_MSB)); | ||
91 | dprintk (2, "tvp5150: Active video cropping stop LSB = 0x%02x\n", tvp5150_read(c,TVP5150_ACT_VD_CROP_STP_LSB)); | ||
92 | dprintk (2, "tvp5150: Genlock/RTC = 0x%02x\n", tvp5150_read(c,TVP5150_GENLOCK)); | ||
93 | dprintk (2, "tvp5150: Horizontal sync start = 0x%02x\n", tvp5150_read(c,TVP5150_HORIZ_SYNC_START)); | ||
94 | dprintk (2, "tvp5150: Vertical blanking start = 0x%02x\n", tvp5150_read(c,TVP5150_VERT_BLANKING_START)); | ||
95 | dprintk (2, "tvp5150: Vertical blanking stop = 0x%02x\n", tvp5150_read(c,TVP5150_VERT_BLANKING_STOP)); | ||
96 | dprintk (2, "tvp5150: Chrominance processing control #1 = 0x%02x\n", tvp5150_read(c,TVP5150_CHROMA_PROC_CTL_1)); | ||
97 | dprintk (2, "tvp5150: Chrominance processing control #2 = 0x%02x\n", tvp5150_read(c,TVP5150_CHROMA_PROC_CTL_2)); | ||
98 | dprintk (2, "tvp5150: Interrupt reset register B = 0x%02x\n", tvp5150_read(c,TVP5150_INT_RESET_REG_B)); | ||
99 | dprintk (2, "tvp5150: Interrupt enable register B = 0x%02x\n", tvp5150_read(c,TVP5150_INT_ENABLE_REG_B)); | ||
100 | dprintk (2, "tvp5150: Interrupt configuration register B = 0x%02x\n", tvp5150_read(c,TVP5150_INTT_CONFIG_REG_B)); | ||
101 | dprintk (2, "tvp5150: Video standard = 0x%02x\n", tvp5150_read(c,TVP5150_VIDEO_STD)); | ||
102 | dprintk (2, "tvp5150: Cb gain factor = 0x%02x\n", tvp5150_read(c,TVP5150_CB_GAIN_FACT)); | ||
103 | dprintk (2, "tvp5150: Cr gain factor = 0x%02x\n", tvp5150_read(c,TVP5150_CR_GAIN_FACTOR)); | ||
104 | dprintk (2, "tvp5150: Macrovision on counter = 0x%02x\n", tvp5150_read(c,TVP5150_MACROVISION_ON_CTR)); | ||
105 | dprintk (2, "tvp5150: Macrovision off counter = 0x%02x\n", tvp5150_read(c,TVP5150_MACROVISION_OFF_CTR)); | ||
106 | dprintk (2, "tvp5150: revision select (TVP5150AM1 only) = 0x%02x\n", tvp5150_read(c,TVP5150_REV_SELECT)); | ||
107 | dprintk (2, "tvp5150: MSB of device ID = 0x%02x\n", tvp5150_read(c,TVP5150_MSB_DEV_ID)); | ||
108 | dprintk (2, "tvp5150: LSB of device ID = 0x%02x\n", tvp5150_read(c,TVP5150_LSB_DEV_ID)); | ||
109 | dprintk (2, "tvp5150: ROM major version = 0x%02x\n", tvp5150_read(c,TVP5150_ROM_MAJOR_VER)); | ||
110 | dprintk (2, "tvp5150: ROM minor version = 0x%02x\n", tvp5150_read(c,TVP5150_ROM_MINOR_VER)); | ||
111 | dprintk (2, "tvp5150: Vertical line count MSB = 0x%02x\n", tvp5150_read(c,TVP5150_VERT_LN_COUNT_MSB)); | ||
112 | dprintk (2, "tvp5150: Vertical line count LSB = 0x%02x\n", tvp5150_read(c,TVP5150_VERT_LN_COUNT_LSB)); | ||
113 | dprintk (2, "tvp5150: Interrupt status register B = 0x%02x\n", tvp5150_read(c,TVP5150_INT_STATUS_REG_B)); | ||
114 | dprintk (2, "tvp5150: Interrupt active register B = 0x%02x\n", tvp5150_read(c,TVP5150_INT_ACTIVE_REG_B)); | ||
115 | dprintk (2, "tvp5150: Status register #1 = 0x%02x\n", tvp5150_read(c,TVP5150_STATUS_REG_1)); | ||
116 | dprintk (2, "tvp5150: Status register #2 = 0x%02x\n", tvp5150_read(c,TVP5150_STATUS_REG_2)); | ||
117 | dprintk (2, "tvp5150: Status register #3 = 0x%02x\n", tvp5150_read(c,TVP5150_STATUS_REG_3)); | ||
118 | dprintk (2, "tvp5150: Status register #4 = 0x%02x\n", tvp5150_read(c,TVP5150_STATUS_REG_4)); | ||
119 | dprintk (2, "tvp5150: Status register #5 = 0x%02x\n", tvp5150_read(c,TVP5150_STATUS_REG_5)); | ||
120 | dprintk (2, "tvp5150: Closed caption data registers = 0x%02x\n", tvp5150_read(c,TVP5150_CC_DATA_REG1)); | ||
121 | dprintk (2, "tvp5150: Closed caption data registers = 0x%02x\n", tvp5150_read(c,TVP5150_CC_DATA_REG2)); | ||
122 | dprintk (2, "tvp5150: Closed caption data registers = 0x%02x\n", tvp5150_read(c,TVP5150_CC_DATA_REG3)); | ||
123 | dprintk (2, "tvp5150: Closed caption data registers = 0x%02x\n", tvp5150_read(c,TVP5150_CC_DATA_REG4)); | ||
124 | dprintk (2, "tvp5150: WSS data registers = 0x%02x\n", tvp5150_read(c,TVP5150_WSS_DATA_REG1)); | ||
125 | dprintk (2, "tvp5150: WSS data registers = 0x%02x\n", tvp5150_read(c,TVP5150_WSS_DATA_REG2)); | ||
126 | dprintk (2, "tvp5150: WSS data registers = 0x%02x\n", tvp5150_read(c,TVP5150_WSS_DATA_REG3)); | ||
127 | dprintk (2, "tvp5150: WSS data registers = 0x%02x\n", tvp5150_read(c,TVP5150_WSS_DATA_REG4)); | ||
128 | dprintk (2, "tvp5150: WSS data registers = 0x%02x\n", tvp5150_read(c,TVP5150_WSS_DATA_REG5)); | ||
129 | dprintk (2, "tvp5150: WSS data registers = 0x%02x\n", tvp5150_read(c,TVP5150_WSS_DATA_REG6)); | ||
130 | dprintk (2, "tvp5150: VPS data registers = 0x%02x\n", tvp5150_read(c,TVP5150_VPS_DATA_REG1)); | ||
131 | dprintk (2, "tvp5150: VPS data registers = 0x%02x\n", tvp5150_read(c,TVP5150_VPS_DATA_REG2)); | ||
132 | dprintk (2, "tvp5150: VPS data registers = 0x%02x\n", tvp5150_read(c,TVP5150_VPS_DATA_REG3)); | ||
133 | dprintk (2, "tvp5150: VPS data registers = 0x%02x\n", tvp5150_read(c,TVP5150_VPS_DATA_REG4)); | ||
134 | dprintk (2, "tvp5150: VPS data registers = 0x%02x\n", tvp5150_read(c,TVP5150_VPS_DATA_REG5)); | ||
135 | dprintk (2, "tvp5150: VPS data registers = 0x%02x\n", tvp5150_read(c,TVP5150_VPS_DATA_REG6)); | ||
136 | dprintk (2, "tvp5150: VPS data registers = 0x%02x\n", tvp5150_read(c,TVP5150_VPS_DATA_REG7)); | ||
137 | dprintk (2, "tvp5150: VPS data registers = 0x%02x\n", tvp5150_read(c,TVP5150_VPS_DATA_REG8)); | ||
138 | dprintk (2, "tvp5150: VPS data registers = 0x%02x\n", tvp5150_read(c,TVP5150_VPS_DATA_REG9)); | ||
139 | dprintk (2, "tvp5150: VPS data registers = 0x%02x\n", tvp5150_read(c,TVP5150_VPS_DATA_REG10)); | ||
140 | dprintk (2, "tvp5150: VPS data registers = 0x%02x\n", tvp5150_read(c,TVP5150_VPS_DATA_REG11)); | ||
141 | dprintk (2, "tvp5150: VPS data registers = 0x%02x\n", tvp5150_read(c,TVP5150_VPS_DATA_REG12)); | ||
142 | dprintk (2, "tvp5150: VPS data registers = 0x%02x\n", tvp5150_read(c,TVP5150_VPS_DATA_REG13)); | ||
143 | dprintk (2, "tvp5150: VITC data registers = 0x%02x\n", tvp5150_read(c,TVP5150_VITC_DATA_REG1)); | ||
144 | dprintk (2, "tvp5150: VITC data registers = 0x%02x\n", tvp5150_read(c,TVP5150_VITC_DATA_REG2)); | ||
145 | dprintk (2, "tvp5150: VITC data registers = 0x%02x\n", tvp5150_read(c,TVP5150_VITC_DATA_REG3)); | ||
146 | dprintk (2, "tvp5150: VITC data registers = 0x%02x\n", tvp5150_read(c,TVP5150_VITC_DATA_REG4)); | ||
147 | dprintk (2, "tvp5150: VITC data registers = 0x%02x\n", tvp5150_read(c,TVP5150_VITC_DATA_REG5)); | ||
148 | dprintk (2, "tvp5150: VITC data registers = 0x%02x\n", tvp5150_read(c,TVP5150_VITC_DATA_REG6)); | ||
149 | dprintk (2, "tvp5150: VITC data registers = 0x%02x\n", tvp5150_read(c,TVP5150_VITC_DATA_REG7)); | ||
150 | dprintk (2, "tvp5150: VITC data registers = 0x%02x\n", tvp5150_read(c,TVP5150_VITC_DATA_REG8)); | ||
151 | dprintk (2, "tvp5150: VITC data registers = 0x%02x\n", tvp5150_read(c,TVP5150_VITC_DATA_REG9)); | ||
152 | dprintk (2, "tvp5150: VBI FIFO read data = 0x%02x\n", tvp5150_read(c,TVP5150_VBI_FIFO_READ_DATA)); | ||
153 | dprintk (2, "tvp5150: Teletext filter 1 = 0x%02x\n", tvp5150_read(c,TVP5150_TELETEXT_FIL_1_1)); | ||
154 | dprintk (2, "tvp5150: Teletext filter 1 = 0x%02x\n", tvp5150_read(c,TVP5150_TELETEXT_FIL_1_2)); | ||
155 | dprintk (2, "tvp5150: Teletext filter 1 = 0x%02x\n", tvp5150_read(c,TVP5150_TELETEXT_FIL_1_3)); | ||
156 | dprintk (2, "tvp5150: Teletext filter 1 = 0x%02x\n", tvp5150_read(c,TVP5150_TELETEXT_FIL_1_4)); | ||
157 | dprintk (2, "tvp5150: Teletext filter 1 = 0x%02x\n", tvp5150_read(c,TVP5150_TELETEXT_FIL_1_5)); | ||
158 | dprintk (2, "tvp5150: Teletext filter 2 = 0x%02x\n", tvp5150_read(c,TVP5150_TELETEXT_FIL_2_1)); | ||
159 | dprintk (2, "tvp5150: Teletext filter 2 = 0x%02x\n", tvp5150_read(c,TVP5150_TELETEXT_FIL_2_2)); | ||
160 | dprintk (2, "tvp5150: Teletext filter 2 = 0x%02x\n", tvp5150_read(c,TVP5150_TELETEXT_FIL_2_3)); | ||
161 | dprintk (2, "tvp5150: Teletext filter 2 = 0x%02x\n", tvp5150_read(c,TVP5150_TELETEXT_FIL_2_4)); | ||
162 | dprintk (2, "tvp5150: Teletext filter 2 = 0x%02x\n", tvp5150_read(c,TVP5150_TELETEXT_FIL_2_5)); | ||
163 | dprintk (2, "tvp5150: Teletext filter enable = 0x%02x\n", tvp5150_read(c,TVP5150_TELETEXT_FIL_ENA)); | ||
164 | dprintk (2, "tvp5150: Interrupt status register A = 0x%02x\n", tvp5150_read(c,TVP5150_INT_STATUS_REG_A)); | ||
165 | dprintk (2, "tvp5150: Interrupt enable register A = 0x%02x\n", tvp5150_read(c,TVP5150_INT_ENABLE_REG_A)); | ||
166 | dprintk (2, "tvp5150: Interrupt configuration = 0x%02x\n", tvp5150_read(c,TVP5150_INT_CONF)); | ||
167 | dprintk (2, "tvp5150: VDP configuration RAM data = 0x%02x\n", tvp5150_read(c,TVP5150_VDP_CONF_RAM_DATA)); | ||
168 | dprintk (2, "tvp5150: Configuration RAM address low byte = 0x%02x\n", tvp5150_read(c,TVP5150_CONF_RAM_ADDR_LOW)); | ||
169 | dprintk (2, "tvp5150: Configuration RAM address high byte = 0x%02x\n", tvp5150_read(c,TVP5150_CONF_RAM_ADDR_HIGH)); | ||
170 | dprintk (2, "tvp5150: VDP status register = 0x%02x\n", tvp5150_read(c,TVP5150_VDP_STATUS_REG)); | ||
171 | dprintk (2, "tvp5150: FIFO word count = 0x%02x\n", tvp5150_read(c,TVP5150_FIFO_WORD_COUNT)); | ||
172 | dprintk (2, "tvp5150: FIFO interrupt threshold = 0x%02x\n", tvp5150_read(c,TVP5150_FIFO_INT_THRESHOLD)); | ||
173 | dprintk (2, "tvp5150: FIFO reset = 0x%02x\n", tvp5150_read(c,TVP5150_FIFO_RESET)); | ||
174 | dprintk (2, "tvp5150: Line number interrupt = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_NUMBER_INT)); | ||
175 | dprintk (2, "tvp5150: Pixel alignment register low byte = 0x%02x\n", tvp5150_read(c,TVP5150_PIX_ALIGN_REG_LOW)); | ||
176 | dprintk (2, "tvp5150: Pixel alignment register high byte = 0x%02x\n", tvp5150_read(c,TVP5150_PIX_ALIGN_REG_HIGH)); | ||
177 | dprintk (2, "tvp5150: FIFO output control = 0x%02x\n", tvp5150_read(c,TVP5150_FIFO_OUT_CTRL)); | ||
178 | dprintk (2, "tvp5150: Full field enable 1 = 0x%02x\n", tvp5150_read(c,TVP5150_FULL_FIELD_ENA_1)); | ||
179 | dprintk (2, "tvp5150: Full field enable 2 = 0x%02x\n", tvp5150_read(c,TVP5150_FULL_FIELD_ENA_2)); | ||
180 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_1)); | ||
181 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_2)); | ||
182 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_3)); | ||
183 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_4)); | ||
184 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_5)); | ||
185 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_6)); | ||
186 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_7)); | ||
187 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_8)); | ||
188 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_9)); | ||
189 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_10)); | ||
190 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_11)); | ||
191 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_12)); | ||
192 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_13)); | ||
193 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_14)); | ||
194 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_15)); | ||
195 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_16)); | ||
196 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_17)); | ||
197 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_18)); | ||
198 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_19)); | ||
199 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_20)); | ||
200 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_21)); | ||
201 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_22)); | ||
202 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_23)); | ||
203 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_24)); | ||
204 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_25)); | ||
205 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_27)); | ||
206 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_28)); | ||
207 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_29)); | ||
208 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_30)); | ||
209 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_31)); | ||
210 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_32)); | ||
211 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_33)); | ||
212 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_34)); | ||
213 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_35)); | ||
214 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_36)); | ||
215 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_37)); | ||
216 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_38)); | ||
217 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_39)); | ||
218 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_40)); | ||
219 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_41)); | ||
220 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_42)); | ||
221 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_43)); | ||
222 | dprintk (2, "tvp5150: Line mode registers = 0x%02x\n", tvp5150_read(c,TVP5150_LINE_MODE_REG_44)); | ||
223 | dprintk (2, "tvp5150: Full field mode register = 0x%02x\n", tvp5150_read(c,TVP5150_FULL_FIELD_MODE_REG)); | ||
224 | } | ||
225 | |||
226 | /**************************************************************************** | ||
227 | Basic functions | ||
228 | ****************************************************************************/ | ||
229 | enum tvp5150_input { | ||
230 | TVP5150_ANALOG_CH0 = 0, | ||
231 | TVP5150_SVIDEO = 1, | ||
232 | TVP5150_ANALOG_CH1 = 2, | ||
233 | TVP5150_BLACK_SCREEN = 8 | ||
234 | }; | ||
235 | |||
236 | static inline void tvp5150_selmux(struct i2c_client *c, enum tvp5150_input input) | ||
237 | { | ||
238 | tvp5150_write(c,TVP5150_VD_IN_SRC_SEL_1,input); | ||
239 | }; | ||
240 | |||
241 | static inline void tvp5150_reset(struct i2c_client *c) | ||
242 | { | ||
243 | /* Automatic offset and AGC enabled*/ | ||
244 | tvp5150_write(c,TVP5150_ANAL_CHL_CTL,0x15); | ||
245 | |||
246 | /* Normal Operation */ | ||
247 | tvp5150_write(c,TVP5150_OP_MODE_CTL,0x00); | ||
248 | |||
249 | /* Activate YCrCb output 0x9 or 0xd ? */ | ||
250 | tvp5150_write(c,TVP5150_MISC_CTL,0x09); | ||
251 | |||
252 | /* Activates video std autodetection for PAL/M and PAL/N */ | ||
253 | tvp5150_write(c,TVP5150_AUTOSW_MSK,0xf0); | ||
254 | |||
255 | /* Default format: 0x47, 4:2:2: 0x40 */ | ||
256 | tvp5150_write(c,TVP5150_DATA_RATE_SEL,0x47); | ||
257 | |||
258 | tvp5150_selmux(c,TVP5150_ANALOG_CH0); | ||
259 | }; | ||
260 | |||
261 | |||
262 | /**************************************************************************** | ||
263 | I2C Client & Driver | ||
264 | ****************************************************************************/ | ||
265 | static struct i2c_driver driver; | ||
266 | |||
267 | static struct i2c_client client_template = | ||
268 | { | ||
269 | .name = "(unset)", | ||
270 | .flags = I2C_CLIENT_ALLOW_USE, | ||
271 | .driver = &driver, | ||
272 | }; | ||
273 | |||
274 | static int | ||
275 | tvp5150_detect_client (struct i2c_adapter *adapter, | ||
276 | int address, | ||
277 | int kind) | ||
278 | { | ||
279 | struct i2c_client *client; | ||
280 | struct tvp5150 *core; | ||
281 | int rv; | ||
282 | |||
283 | dprintk(1, | ||
284 | KERN_INFO | ||
285 | "tvp5150.c: detecting tvp5150 client on address 0x%x\n", | ||
286 | address << 1); | ||
287 | |||
288 | client_template.adapter = adapter; | ||
289 | client_template.addr = address; | ||
290 | |||
291 | /* Check if the adapter supports the needed features */ | ||
292 | if (!i2c_check_functionality | ||
293 | (adapter, | ||
294 | I2C_FUNC_SMBUS_READ_BYTE | I2C_FUNC_SMBUS_WRITE_BYTE_DATA)) | ||
295 | return 0; | ||
296 | |||
297 | client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL); | ||
298 | if (client == 0) | ||
299 | return -ENOMEM; | ||
300 | memcpy(client,&client_template,sizeof(struct i2c_client)); | ||
301 | |||
302 | core = kmalloc(sizeof(struct tvp5150), GFP_KERNEL); | ||
303 | if (core == 0) { | ||
304 | kfree(client); | ||
305 | return -ENOMEM; | ||
306 | } | ||
307 | memset(core, 0, sizeof(struct tvp5150)); | ||
308 | i2c_set_clientdata(client, core); | ||
309 | |||
310 | rv = i2c_attach_client(client); | ||
311 | |||
312 | if (rv) { | ||
313 | kfree(client); | ||
314 | kfree(core); | ||
315 | return rv; | ||
316 | } | ||
317 | |||
318 | tvp5150_reset(client); | ||
319 | dump_reg (client); | ||
320 | |||
321 | return 0; | ||
322 | } | ||
323 | |||
324 | static int | ||
325 | tvp5150_attach_adapter (struct i2c_adapter *adapter) | ||
326 | { | ||
327 | dprintk(1, | ||
328 | KERN_INFO | ||
329 | "tvp5150.c: starting probe for adapter %s (0x%x)\n", | ||
330 | adapter->name, adapter->id); | ||
331 | return i2c_probe(adapter, &addr_data, &tvp5150_detect_client); | ||
332 | } | ||
333 | |||
334 | static int | ||
335 | tvp5150_detach_client (struct i2c_client *client) | ||
336 | { | ||
337 | struct tvp5150 *decoder = i2c_get_clientdata(client); | ||
338 | int err; | ||
339 | |||
340 | err = i2c_detach_client(client); | ||
341 | if (err) { | ||
342 | return err; | ||
343 | } | ||
344 | |||
345 | kfree(decoder); | ||
346 | kfree(client); | ||
347 | |||
348 | return 0; | ||
349 | } | ||
350 | |||
351 | /* ----------------------------------------------------------------------- */ | ||
352 | |||
353 | static struct i2c_driver driver = { | ||
354 | .owner = THIS_MODULE, | ||
355 | .name = "tvp5150", | ||
356 | |||
357 | /* FIXME */ | ||
358 | .id = I2C_DRIVERID_SAA7110, | ||
359 | .flags = I2C_DF_NOTIFY, | ||
360 | |||
361 | .attach_adapter = tvp5150_attach_adapter, | ||
362 | .detach_client = tvp5150_detach_client, | ||
363 | }; | ||
364 | |||
365 | static int __init | ||
366 | tvp5150_init (void) | ||
367 | { | ||
368 | return i2c_add_driver(&driver); | ||
369 | } | ||
370 | |||
371 | static void __exit | ||
372 | tvp5150_exit (void) | ||
373 | { | ||
374 | i2c_del_driver(&driver); | ||
375 | } | ||
376 | |||
377 | module_init(tvp5150_init); | ||
378 | module_exit(tvp5150_exit); | ||