diff options
author | James Bottomley <jejb@titanic.(none)> | 2005-11-10 09:29:07 -0500 |
---|---|---|
committer | James Bottomley <jejb@titanic.(none)> | 2005-11-10 09:29:07 -0500 |
commit | 8a87a0b6313109d2fea87b1271d497c954ce2ca8 (patch) | |
tree | 1b7ae51ff681e27118590e9cab4bf0ce38f5d80e /drivers/media/video/saa7134 | |
parent | e6a04466ba965875a6132700fabb2f2c0249c41a (diff) | |
parent | 3b44f137b9a846c5452d9e6e1271b79b1dbcc942 (diff) |
Merge by hand (whitespace conflicts in libata.h)
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/media/video/saa7134')
-rw-r--r-- | drivers/media/video/saa7134/Kconfig | 68 | ||||
-rw-r--r-- | drivers/media/video/saa7134/Makefile | 9 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa6752hs.c | 187 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134-alsa.c | 1047 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134-cards.c | 587 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134-core.c | 120 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134-dvb.c | 370 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134-empress.c | 6 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134-i2c.c | 28 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134-input.c | 403 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134-oss.c | 375 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134-reg.h | 27 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134-ts.c | 29 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134-tvaudio.c | 23 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134-video.c | 185 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134.h | 62 |
16 files changed, 3013 insertions, 513 deletions
diff --git a/drivers/media/video/saa7134/Kconfig b/drivers/media/video/saa7134/Kconfig new file mode 100644 index 000000000000..624e8808a517 --- /dev/null +++ b/drivers/media/video/saa7134/Kconfig | |||
@@ -0,0 +1,68 @@ | |||
1 | config VIDEO_SAA7134 | ||
2 | tristate "Philips SAA7134 support" | ||
3 | depends on VIDEO_DEV && PCI && I2C && SOUND | ||
4 | select VIDEO_BUF | ||
5 | select VIDEO_IR | ||
6 | select VIDEO_TUNER | ||
7 | select CRC32 | ||
8 | ---help--- | ||
9 | This is a video4linux driver for Philips SAA713x based | ||
10 | TV cards. | ||
11 | |||
12 | To compile this driver as a module, choose M here: the | ||
13 | module will be called saa7134. | ||
14 | |||
15 | config VIDEO_SAA7134_DVB | ||
16 | tristate "DVB/ATSC Support for saa7134 based TV cards" | ||
17 | depends on VIDEO_SAA7134 && DVB_CORE | ||
18 | select VIDEO_BUF_DVB | ||
19 | ---help--- | ||
20 | This adds support for DVB cards based on the | ||
21 | Philips saa7134 chip. | ||
22 | |||
23 | To compile this driver as a module, choose M here: the | ||
24 | module will be called saa7134-dvb. | ||
25 | |||
26 | You must also select one or more DVB demodulators. | ||
27 | If you are unsure which you need, choose all of them. | ||
28 | |||
29 | config VIDEO_SAA7134_DVB_ALL_FRONTENDS | ||
30 | bool "Build all supported frontends for saa7134 based TV cards" | ||
31 | default y | ||
32 | depends on VIDEO_SAA7134_DVB | ||
33 | select DVB_MT352 | ||
34 | select DVB_TDA1004X | ||
35 | select DVB_NXT200X | ||
36 | ---help--- | ||
37 | This builds saa7134-dvb with all currently supported frontend | ||
38 | demodulators. If you wish to tweak your configuration, and | ||
39 | only include support for the hardware that you need, choose N here. | ||
40 | |||
41 | If you are unsure, choose Y. | ||
42 | |||
43 | config VIDEO_SAA7134_DVB_MT352 | ||
44 | tristate "Zarlink MT352 DVB-T Support" | ||
45 | default m | ||
46 | depends on VIDEO_SAA7134_DVB && !VIDEO_SAA7134_DVB_ALL_FRONTENDS | ||
47 | select DVB_MT352 | ||
48 | ---help--- | ||
49 | This adds DVB-T support for cards based on the | ||
50 | Philips saa7134 chip and the MT352 demodulator. | ||
51 | |||
52 | config VIDEO_SAA7134_DVB_TDA1004X | ||
53 | tristate "Phillips TDA10045H/TDA10046H DVB-T Support" | ||
54 | default m | ||
55 | depends on VIDEO_SAA7134_DVB && !VIDEO_SAA7134_DVB_ALL_FRONTENDS | ||
56 | select DVB_TDA1004X | ||
57 | ---help--- | ||
58 | This adds DVB-T support for cards based on the | ||
59 | Philips saa7134 chip and the TDA10045H/TDA10046H demodulator. | ||
60 | |||
61 | config VIDEO_SAA7134_DVB_NXT200X | ||
62 | tristate "NXT2002/NXT2004 ATSC Support" | ||
63 | default m | ||
64 | depends on VIDEO_SAA7134_DVB && !VIDEO_SAA7134_DVB_ALL_FRONTENDS | ||
65 | select DVB_NXT200X | ||
66 | ---help--- | ||
67 | This adds ATSC 8VSB and QAM64/256 support for cards based on the | ||
68 | Philips saa7134 chip and the NXT2002/NXT2004 demodulator. | ||
diff --git a/drivers/media/video/saa7134/Makefile b/drivers/media/video/saa7134/Makefile index b778ffd94e65..e0b28f0533af 100644 --- a/drivers/media/video/saa7134/Makefile +++ b/drivers/media/video/saa7134/Makefile | |||
@@ -3,15 +3,22 @@ saa7134-objs := saa7134-cards.o saa7134-core.o saa7134-i2c.o \ | |||
3 | saa7134-oss.o saa7134-ts.o saa7134-tvaudio.o \ | 3 | saa7134-oss.o saa7134-ts.o saa7134-tvaudio.o \ |
4 | saa7134-vbi.o saa7134-video.o saa7134-input.o | 4 | saa7134-vbi.o saa7134-video.o saa7134-input.o |
5 | 5 | ||
6 | obj-$(CONFIG_VIDEO_SAA7134) += saa7134.o saa7134-empress.o saa6752hs.o | 6 | obj-$(CONFIG_VIDEO_SAA7134) += saa7134.o saa7134-empress.o \ |
7 | saa6752hs.o saa7134-alsa.o | ||
7 | obj-$(CONFIG_VIDEO_SAA7134_DVB) += saa7134-dvb.o | 8 | obj-$(CONFIG_VIDEO_SAA7134_DVB) += saa7134-dvb.o |
8 | 9 | ||
9 | EXTRA_CFLAGS += -I$(src)/.. | 10 | EXTRA_CFLAGS += -I$(src)/.. |
10 | EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/dvb-core | 11 | EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/dvb-core |
11 | EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/frontends | 12 | EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/frontends |
13 | ifneq ($(CONFIG_VIDEO_BUF_DVB),n) | ||
14 | EXTRA_CFLAGS += -DHAVE_VIDEO_BUF_DVB=1 | ||
15 | endif | ||
12 | ifneq ($(CONFIG_DVB_MT352),n) | 16 | ifneq ($(CONFIG_DVB_MT352),n) |
13 | EXTRA_CFLAGS += -DHAVE_MT352=1 | 17 | EXTRA_CFLAGS += -DHAVE_MT352=1 |
14 | endif | 18 | endif |
15 | ifneq ($(CONFIG_DVB_TDA1004X),n) | 19 | ifneq ($(CONFIG_DVB_TDA1004X),n) |
16 | EXTRA_CFLAGS += -DHAVE_TDA1004X=1 | 20 | EXTRA_CFLAGS += -DHAVE_TDA1004X=1 |
17 | endif | 21 | endif |
22 | ifneq ($(CONFIG_DVB_NXT200X),n) | ||
23 | EXTRA_CFLAGS += -DHAVE_NXT200X=1 | ||
24 | endif | ||
diff --git a/drivers/media/video/saa7134/saa6752hs.c b/drivers/media/video/saa7134/saa6752hs.c index 382911c6ef22..cdd1ed9c8065 100644 --- a/drivers/media/video/saa7134/saa6752hs.c +++ b/drivers/media/video/saa7134/saa6752hs.c | |||
@@ -13,7 +13,6 @@ | |||
13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
14 | #include <linux/crc32.h> | 14 | #include <linux/crc32.h> |
15 | 15 | ||
16 | #include <media/id.h> | ||
17 | 16 | ||
18 | #define MPEG_VIDEO_TARGET_BITRATE_MAX 27000 | 17 | #define MPEG_VIDEO_TARGET_BITRATE_MAX 27000 |
19 | #define MPEG_VIDEO_MAX_BITRATE_MAX 27000 | 18 | #define MPEG_VIDEO_MAX_BITRATE_MAX 27000 |
@@ -57,6 +56,7 @@ struct saa6752hs_state { | |||
57 | struct i2c_client client; | 56 | struct i2c_client client; |
58 | struct v4l2_mpeg_compression params; | 57 | struct v4l2_mpeg_compression params; |
59 | enum saa6752hs_videoformat video_format; | 58 | enum saa6752hs_videoformat video_format; |
59 | v4l2_std_id standard; | ||
60 | }; | 60 | }; |
61 | 61 | ||
62 | enum saa6752hs_command { | 62 | enum saa6752hs_command { |
@@ -74,58 +74,58 @@ enum saa6752hs_command { | |||
74 | /* ---------------------------------------------------------------------- */ | 74 | /* ---------------------------------------------------------------------- */ |
75 | 75 | ||
76 | static u8 PAT[] = { | 76 | static u8 PAT[] = { |
77 | 0xc2, // i2c register | 77 | 0xc2, /* i2c register */ |
78 | 0x00, // table number for encoder | 78 | 0x00, /* table number for encoder */ |
79 | 79 | ||
80 | 0x47, // sync | 80 | 0x47, /* sync */ |
81 | 0x40, 0x00, // transport_error_indicator(0), payload_unit_start(1), transport_priority(0), pid(0) | 81 | 0x40, 0x00, /* transport_error_indicator(0), payload_unit_start(1), transport_priority(0), pid(0) */ |
82 | 0x10, // transport_scrambling_control(00), adaptation_field_control(01), continuity_counter(0) | 82 | 0x10, /* transport_scrambling_control(00), adaptation_field_control(01), continuity_counter(0) */ |
83 | 83 | ||
84 | 0x00, // PSI pointer to start of table | 84 | 0x00, /* PSI pointer to start of table */ |
85 | 85 | ||
86 | 0x00, // tid(0) | 86 | 0x00, /* tid(0) */ |
87 | 0xb0, 0x0d, // section_syntax_indicator(1), section_length(13) | 87 | 0xb0, 0x0d, /* section_syntax_indicator(1), section_length(13) */ |
88 | 88 | ||
89 | 0x00, 0x01, // transport_stream_id(1) | 89 | 0x00, 0x01, /* transport_stream_id(1) */ |
90 | 90 | ||
91 | 0xc1, // version_number(0), current_next_indicator(1) | 91 | 0xc1, /* version_number(0), current_next_indicator(1) */ |
92 | 92 | ||
93 | 0x00, 0x00, // section_number(0), last_section_number(0) | 93 | 0x00, 0x00, /* section_number(0), last_section_number(0) */ |
94 | 94 | ||
95 | 0x00, 0x01, // program_number(1) | 95 | 0x00, 0x01, /* program_number(1) */ |
96 | 96 | ||
97 | 0xe0, 0x00, // PMT PID | 97 | 0xe0, 0x00, /* PMT PID */ |
98 | 98 | ||
99 | 0x00, 0x00, 0x00, 0x00 // CRC32 | 99 | 0x00, 0x00, 0x00, 0x00 /* CRC32 */ |
100 | }; | 100 | }; |
101 | 101 | ||
102 | static u8 PMT[] = { | 102 | static u8 PMT[] = { |
103 | 0xc2, // i2c register | 103 | 0xc2, /* i2c register */ |
104 | 0x01, // table number for encoder | 104 | 0x01, /* table number for encoder */ |
105 | 105 | ||
106 | 0x47, // sync | 106 | 0x47, /* sync */ |
107 | 0x40, 0x00, // transport_error_indicator(0), payload_unit_start(1), transport_priority(0), pid | 107 | 0x40, 0x00, /* transport_error_indicator(0), payload_unit_start(1), transport_priority(0), pid */ |
108 | 0x10, // transport_scrambling_control(00), adaptation_field_control(01), continuity_counter(0) | 108 | 0x10, /* transport_scrambling_control(00), adaptation_field_control(01), continuity_counter(0) */ |
109 | 109 | ||
110 | 0x00, // PSI pointer to start of table | 110 | 0x00, /* PSI pointer to start of table */ |
111 | 111 | ||
112 | 0x02, // tid(2) | 112 | 0x02, /* tid(2) */ |
113 | 0xb0, 0x17, // section_syntax_indicator(1), section_length(23) | 113 | 0xb0, 0x17, /* section_syntax_indicator(1), section_length(23) */ |
114 | 114 | ||
115 | 0x00, 0x01, // program_number(1) | 115 | 0x00, 0x01, /* program_number(1) */ |
116 | 116 | ||
117 | 0xc1, // version_number(0), current_next_indicator(1) | 117 | 0xc1, /* version_number(0), current_next_indicator(1) */ |
118 | 118 | ||
119 | 0x00, 0x00, // section_number(0), last_section_number(0) | 119 | 0x00, 0x00, /* section_number(0), last_section_number(0) */ |
120 | 120 | ||
121 | 0xe0, 0x00, // PCR_PID | 121 | 0xe0, 0x00, /* PCR_PID */ |
122 | 122 | ||
123 | 0xf0, 0x00, // program_info_length(0) | 123 | 0xf0, 0x00, /* program_info_length(0) */ |
124 | 124 | ||
125 | 0x02, 0xe0, 0x00, 0xf0, 0x00, // video stream type(2), pid | 125 | 0x02, 0xe0, 0x00, 0xf0, 0x00, /* video stream type(2), pid */ |
126 | 0x04, 0xe0, 0x00, 0xf0, 0x00, // audio stream type(4), pid | 126 | 0x04, 0xe0, 0x00, 0xf0, 0x00, /* audio stream type(4), pid */ |
127 | 127 | ||
128 | 0x00, 0x00, 0x00, 0x00 // CRC32 | 128 | 0x00, 0x00, 0x00, 0x00 /* CRC32 */ |
129 | }; | 129 | }; |
130 | 130 | ||
131 | static struct v4l2_mpeg_compression param_defaults = | 131 | static struct v4l2_mpeg_compression param_defaults = |
@@ -166,33 +166,33 @@ static int saa6752hs_chip_command(struct i2c_client* client, | |||
166 | unsigned long timeout; | 166 | unsigned long timeout; |
167 | int status = 0; | 167 | int status = 0; |
168 | 168 | ||
169 | // execute the command | 169 | /* execute the command */ |
170 | switch(command) { | 170 | switch(command) { |
171 | case SAA6752HS_COMMAND_RESET: | 171 | case SAA6752HS_COMMAND_RESET: |
172 | buf[0] = 0x00; | 172 | buf[0] = 0x00; |
173 | break; | 173 | break; |
174 | 174 | ||
175 | case SAA6752HS_COMMAND_STOP: | 175 | case SAA6752HS_COMMAND_STOP: |
176 | buf[0] = 0x03; | 176 | buf[0] = 0x03; |
177 | break; | 177 | break; |
178 | 178 | ||
179 | case SAA6752HS_COMMAND_START: | 179 | case SAA6752HS_COMMAND_START: |
180 | buf[0] = 0x02; | 180 | buf[0] = 0x02; |
181 | break; | 181 | break; |
182 | 182 | ||
183 | case SAA6752HS_COMMAND_PAUSE: | 183 | case SAA6752HS_COMMAND_PAUSE: |
184 | buf[0] = 0x04; | 184 | buf[0] = 0x04; |
185 | break; | 185 | break; |
186 | 186 | ||
187 | case SAA6752HS_COMMAND_RECONFIGURE: | 187 | case SAA6752HS_COMMAND_RECONFIGURE: |
188 | buf[0] = 0x05; | 188 | buf[0] = 0x05; |
189 | break; | 189 | break; |
190 | 190 | ||
191 | case SAA6752HS_COMMAND_SLEEP: | 191 | case SAA6752HS_COMMAND_SLEEP: |
192 | buf[0] = 0x06; | 192 | buf[0] = 0x06; |
193 | break; | 193 | break; |
194 | 194 | ||
195 | case SAA6752HS_COMMAND_RECONFIGURE_FORCE: | 195 | case SAA6752HS_COMMAND_RECONFIGURE_FORCE: |
196 | buf[0] = 0x07; | 196 | buf[0] = 0x07; |
197 | break; | 197 | break; |
198 | 198 | ||
@@ -200,13 +200,13 @@ static int saa6752hs_chip_command(struct i2c_client* client, | |||
200 | return -EINVAL; | 200 | return -EINVAL; |
201 | } | 201 | } |
202 | 202 | ||
203 | // set it and wait for it to be so | 203 | /* set it and wait for it to be so */ |
204 | i2c_master_send(client, buf, 1); | 204 | i2c_master_send(client, buf, 1); |
205 | timeout = jiffies + HZ * 3; | 205 | timeout = jiffies + HZ * 3; |
206 | for (;;) { | 206 | for (;;) { |
207 | // get the current status | 207 | /* get the current status */ |
208 | buf[0] = 0x10; | 208 | buf[0] = 0x10; |
209 | i2c_master_send(client, buf, 1); | 209 | i2c_master_send(client, buf, 1); |
210 | i2c_master_recv(client, buf, 1); | 210 | i2c_master_recv(client, buf, 1); |
211 | 211 | ||
212 | if (!(buf[0] & 0x20)) | 212 | if (!(buf[0] & 0x20)) |
@@ -216,61 +216,58 @@ static int saa6752hs_chip_command(struct i2c_client* client, | |||
216 | break; | 216 | break; |
217 | } | 217 | } |
218 | 218 | ||
219 | // wait a bit | ||
220 | msleep(10); | 219 | msleep(10); |
221 | } | 220 | } |
222 | 221 | ||
223 | // delay a bit to let encoder settle | 222 | /* delay a bit to let encoder settle */ |
224 | msleep(50); | 223 | msleep(50); |
225 | 224 | ||
226 | // done | 225 | return status; |
227 | return status; | ||
228 | } | 226 | } |
229 | 227 | ||
230 | 228 | ||
231 | static int saa6752hs_set_bitrate(struct i2c_client* client, | 229 | static int saa6752hs_set_bitrate(struct i2c_client* client, |
232 | struct v4l2_mpeg_compression* params) | 230 | struct v4l2_mpeg_compression* params) |
233 | { | 231 | { |
234 | u8 buf[3]; | 232 | u8 buf[3]; |
235 | 233 | ||
236 | // set the bitrate mode | 234 | /* set the bitrate mode */ |
237 | buf[0] = 0x71; | 235 | buf[0] = 0x71; |
238 | buf[1] = (params->vi_bitrate.mode == V4L2_BITRATE_VBR) ? 0 : 1; | 236 | buf[1] = (params->vi_bitrate.mode == V4L2_BITRATE_VBR) ? 0 : 1; |
239 | i2c_master_send(client, buf, 2); | 237 | i2c_master_send(client, buf, 2); |
240 | 238 | ||
241 | // set the video bitrate | 239 | /* set the video bitrate */ |
242 | if (params->vi_bitrate.mode == V4L2_BITRATE_VBR) { | 240 | if (params->vi_bitrate.mode == V4L2_BITRATE_VBR) { |
243 | // set the target bitrate | 241 | /* set the target bitrate */ |
244 | buf[0] = 0x80; | 242 | buf[0] = 0x80; |
245 | buf[1] = params->vi_bitrate.target >> 8; | 243 | buf[1] = params->vi_bitrate.target >> 8; |
246 | buf[2] = params->vi_bitrate.target & 0xff; | 244 | buf[2] = params->vi_bitrate.target & 0xff; |
247 | i2c_master_send(client, buf, 3); | 245 | i2c_master_send(client, buf, 3); |
248 | 246 | ||
249 | // set the max bitrate | 247 | /* set the max bitrate */ |
250 | buf[0] = 0x81; | 248 | buf[0] = 0x81; |
251 | buf[1] = params->vi_bitrate.max >> 8; | 249 | buf[1] = params->vi_bitrate.max >> 8; |
252 | buf[2] = params->vi_bitrate.max & 0xff; | 250 | buf[2] = params->vi_bitrate.max & 0xff; |
253 | i2c_master_send(client, buf, 3); | 251 | i2c_master_send(client, buf, 3); |
254 | } else { | 252 | } else { |
255 | // set the target bitrate (no max bitrate for CBR) | 253 | /* set the target bitrate (no max bitrate for CBR) */ |
256 | buf[0] = 0x81; | 254 | buf[0] = 0x81; |
257 | buf[1] = params->vi_bitrate.target >> 8; | 255 | buf[1] = params->vi_bitrate.target >> 8; |
258 | buf[2] = params->vi_bitrate.target & 0xff; | 256 | buf[2] = params->vi_bitrate.target & 0xff; |
259 | i2c_master_send(client, buf, 3); | 257 | i2c_master_send(client, buf, 3); |
260 | } | 258 | } |
261 | 259 | ||
262 | // set the audio bitrate | 260 | /* set the audio bitrate */ |
263 | buf[0] = 0x94; | 261 | buf[0] = 0x94; |
264 | buf[1] = (256 == params->au_bitrate.target) ? 0 : 1; | 262 | buf[1] = (256 == params->au_bitrate.target) ? 0 : 1; |
265 | i2c_master_send(client, buf, 2); | 263 | i2c_master_send(client, buf, 2); |
266 | 264 | ||
267 | // set the total bitrate | 265 | /* set the total bitrate */ |
268 | buf[0] = 0xb1; | 266 | buf[0] = 0xb1; |
269 | buf[1] = params->st_bitrate.target >> 8; | 267 | buf[1] = params->st_bitrate.target >> 8; |
270 | buf[2] = params->st_bitrate.target & 0xff; | 268 | buf[2] = params->st_bitrate.target & 0xff; |
271 | i2c_master_send(client, buf, 3); | 269 | i2c_master_send(client, buf, 3); |
272 | 270 | ||
273 | // return success | ||
274 | return 0; | 271 | return 0; |
275 | } | 272 | } |
276 | 273 | ||
@@ -376,36 +373,43 @@ static int saa6752hs_init(struct i2c_client* client) | |||
376 | 373 | ||
377 | h = i2c_get_clientdata(client); | 374 | h = i2c_get_clientdata(client); |
378 | 375 | ||
379 | // Set video format - must be done first as it resets other settings | 376 | /* Set video format - must be done first as it resets other settings */ |
380 | buf[0] = 0x41; | 377 | buf[0] = 0x41; |
381 | buf[1] = h->video_format; | 378 | buf[1] = h->video_format; |
382 | i2c_master_send(client, buf, 2); | 379 | i2c_master_send(client, buf, 2); |
383 | 380 | ||
384 | // set bitrate | 381 | /* Set number of lines in input signal */ |
385 | saa6752hs_set_bitrate(client, &h->params); | 382 | buf[0] = 0x40; |
383 | buf[1] = 0x00; | ||
384 | if (h->standard & V4L2_STD_525_60) | ||
385 | buf[1] = 0x01; | ||
386 | i2c_master_send(client, buf, 2); | ||
387 | |||
388 | /* set bitrate */ | ||
389 | saa6752hs_set_bitrate(client, &h->params); | ||
386 | 390 | ||
387 | // Set GOP structure {3, 13} | 391 | /* Set GOP structure {3, 13} */ |
388 | buf[0] = 0x72; | 392 | buf[0] = 0x72; |
389 | buf[1] = 0x03; | 393 | buf[1] = 0x03; |
390 | buf[2] = 0x0D; | 394 | buf[2] = 0x0D; |
391 | i2c_master_send(client,buf,3); | 395 | i2c_master_send(client,buf,3); |
392 | 396 | ||
393 | // Set minimum Q-scale {4} | 397 | /* Set minimum Q-scale {4} */ |
394 | buf[0] = 0x82; | 398 | buf[0] = 0x82; |
395 | buf[1] = 0x04; | 399 | buf[1] = 0x04; |
396 | i2c_master_send(client,buf,2); | 400 | i2c_master_send(client,buf,2); |
397 | 401 | ||
398 | // Set maximum Q-scale {12} | 402 | /* Set maximum Q-scale {12} */ |
399 | buf[0] = 0x83; | 403 | buf[0] = 0x83; |
400 | buf[1] = 0x0C; | 404 | buf[1] = 0x0C; |
401 | i2c_master_send(client,buf,2); | 405 | i2c_master_send(client,buf,2); |
402 | 406 | ||
403 | // Set Output Protocol | 407 | /* Set Output Protocol */ |
404 | buf[0] = 0xD0; | 408 | buf[0] = 0xD0; |
405 | buf[1] = 0x81; | 409 | buf[1] = 0x81; |
406 | i2c_master_send(client,buf,2); | 410 | i2c_master_send(client,buf,2); |
407 | 411 | ||
408 | // Set video output stream format {TS} | 412 | /* Set video output stream format {TS} */ |
409 | buf[0] = 0xB0; | 413 | buf[0] = 0xB0; |
410 | buf[1] = 0x05; | 414 | buf[1] = 0x05; |
411 | i2c_master_send(client,buf,2); | 415 | i2c_master_send(client,buf,2); |
@@ -421,9 +425,9 @@ static int saa6752hs_init(struct i2c_client* client) | |||
421 | localPAT[sizeof(PAT) - 1] = crc & 0xFF; | 425 | localPAT[sizeof(PAT) - 1] = crc & 0xFF; |
422 | 426 | ||
423 | /* compute PMT */ | 427 | /* compute PMT */ |
424 | memcpy(localPMT, PMT, sizeof(PMT)); | 428 | memcpy(localPMT, PMT, sizeof(PMT)); |
425 | localPMT[3] = 0x40 | ((h->params.ts_pid_pmt >> 8) & 0x0f); | 429 | localPMT[3] = 0x40 | ((h->params.ts_pid_pmt >> 8) & 0x0f); |
426 | localPMT[4] = h->params.ts_pid_pmt & 0xff; | 430 | localPMT[4] = h->params.ts_pid_pmt & 0xff; |
427 | localPMT[15] = 0xE0 | ((h->params.ts_pid_pcr >> 8) & 0x0F); | 431 | localPMT[15] = 0xE0 | ((h->params.ts_pid_pcr >> 8) & 0x0F); |
428 | localPMT[16] = h->params.ts_pid_pcr & 0xFF; | 432 | localPMT[16] = h->params.ts_pid_pcr & 0xFF; |
429 | localPMT[20] = 0xE0 | ((h->params.ts_pid_video >> 8) & 0x0F); | 433 | localPMT[20] = 0xE0 | ((h->params.ts_pid_video >> 8) & 0x0F); |
@@ -436,39 +440,39 @@ static int saa6752hs_init(struct i2c_client* client) | |||
436 | localPMT[sizeof(PMT) - 2] = (crc >> 8) & 0xFF; | 440 | localPMT[sizeof(PMT) - 2] = (crc >> 8) & 0xFF; |
437 | localPMT[sizeof(PMT) - 1] = crc & 0xFF; | 441 | localPMT[sizeof(PMT) - 1] = crc & 0xFF; |
438 | 442 | ||
439 | // Set Audio PID | 443 | /* Set Audio PID */ |
440 | buf[0] = 0xC1; | 444 | buf[0] = 0xC1; |
441 | buf[1] = (h->params.ts_pid_audio >> 8) & 0xFF; | 445 | buf[1] = (h->params.ts_pid_audio >> 8) & 0xFF; |
442 | buf[2] = h->params.ts_pid_audio & 0xFF; | 446 | buf[2] = h->params.ts_pid_audio & 0xFF; |
443 | i2c_master_send(client,buf,3); | 447 | i2c_master_send(client,buf,3); |
444 | 448 | ||
445 | // Set Video PID | 449 | /* Set Video PID */ |
446 | buf[0] = 0xC0; | 450 | buf[0] = 0xC0; |
447 | buf[1] = (h->params.ts_pid_video >> 8) & 0xFF; | 451 | buf[1] = (h->params.ts_pid_video >> 8) & 0xFF; |
448 | buf[2] = h->params.ts_pid_video & 0xFF; | 452 | buf[2] = h->params.ts_pid_video & 0xFF; |
449 | i2c_master_send(client,buf,3); | 453 | i2c_master_send(client,buf,3); |
450 | 454 | ||
451 | // Set PCR PID | 455 | /* Set PCR PID */ |
452 | buf[0] = 0xC4; | 456 | buf[0] = 0xC4; |
453 | buf[1] = (h->params.ts_pid_pcr >> 8) & 0xFF; | 457 | buf[1] = (h->params.ts_pid_pcr >> 8) & 0xFF; |
454 | buf[2] = h->params.ts_pid_pcr & 0xFF; | 458 | buf[2] = h->params.ts_pid_pcr & 0xFF; |
455 | i2c_master_send(client,buf,3); | 459 | i2c_master_send(client,buf,3); |
456 | 460 | ||
457 | // Send SI tables | 461 | /* Send SI tables */ |
458 | i2c_master_send(client,localPAT,sizeof(PAT)); | 462 | i2c_master_send(client,localPAT,sizeof(PAT)); |
459 | i2c_master_send(client,localPMT,sizeof(PMT)); | 463 | i2c_master_send(client,localPMT,sizeof(PMT)); |
460 | 464 | ||
461 | // mute then unmute audio. This removes buzzing artefacts | 465 | /* mute then unmute audio. This removes buzzing artefacts */ |
462 | buf[0] = 0xa4; | 466 | buf[0] = 0xa4; |
463 | buf[1] = 1; | 467 | buf[1] = 1; |
464 | i2c_master_send(client, buf, 2); | 468 | i2c_master_send(client, buf, 2); |
465 | buf[1] = 0; | 469 | buf[1] = 0; |
466 | i2c_master_send(client, buf, 2); | 470 | i2c_master_send(client, buf, 2); |
467 | 471 | ||
468 | // start it going | 472 | /* start it going */ |
469 | saa6752hs_chip_command(client, SAA6752HS_COMMAND_START); | 473 | saa6752hs_chip_command(client, SAA6752HS_COMMAND_START); |
470 | 474 | ||
471 | // readout current state | 475 | /* readout current state */ |
472 | buf[0] = 0xE1; | 476 | buf[0] = 0xE1; |
473 | buf[1] = 0xA7; | 477 | buf[1] = 0xA7; |
474 | buf[2] = 0xFE; | 478 | buf[2] = 0xFE; |
@@ -477,7 +481,7 @@ static int saa6752hs_init(struct i2c_client* client) | |||
477 | i2c_master_send(client, buf, 5); | 481 | i2c_master_send(client, buf, 5); |
478 | i2c_master_recv(client, buf2, 4); | 482 | i2c_master_recv(client, buf2, 4); |
479 | 483 | ||
480 | // change aspect ratio | 484 | /* change aspect ratio */ |
481 | buf[0] = 0xE0; | 485 | buf[0] = 0xE0; |
482 | buf[1] = 0xA7; | 486 | buf[1] = 0xA7; |
483 | buf[2] = 0xFE; | 487 | buf[2] = 0xFE; |
@@ -498,7 +502,6 @@ static int saa6752hs_init(struct i2c_client* client) | |||
498 | buf[8] = buf2[3]; | 502 | buf[8] = buf2[3]; |
499 | i2c_master_send(client, buf, 9); | 503 | i2c_master_send(client, buf, 9); |
500 | 504 | ||
501 | // return success | ||
502 | return 0; | 505 | return 0; |
503 | } | 506 | } |
504 | 507 | ||
@@ -506,16 +509,19 @@ static int saa6752hs_attach(struct i2c_adapter *adap, int addr, int kind) | |||
506 | { | 509 | { |
507 | struct saa6752hs_state *h; | 510 | struct saa6752hs_state *h; |
508 | 511 | ||
509 | printk("saa6752hs: chip found @ 0x%x\n", addr<<1); | 512 | printk("saa6752hs: chip found @ 0x%x\n", addr<<1); |
510 | 513 | ||
511 | if (NULL == (h = kmalloc(sizeof(*h), GFP_KERNEL))) | 514 | if (NULL == (h = kmalloc(sizeof(*h), GFP_KERNEL))) |
512 | return -ENOMEM; | 515 | return -ENOMEM; |
513 | memset(h,0,sizeof(*h)); | 516 | memset(h,0,sizeof(*h)); |
514 | h->client = client_template; | 517 | h->client = client_template; |
515 | h->params = param_defaults; | 518 | h->params = param_defaults; |
516 | h->client.adapter = adap; | 519 | h->client.adapter = adap; |
517 | h->client.addr = addr; | 520 | h->client.addr = addr; |
518 | 521 | ||
522 | /* Assume 625 input lines */ | ||
523 | h->standard = 0; | ||
524 | |||
519 | i2c_set_clientdata(&h->client, h); | 525 | i2c_set_clientdata(&h->client, h); |
520 | i2c_attach_client(&h->client); | 526 | i2c_attach_client(&h->client); |
521 | return 0; | 527 | return 0; |
@@ -545,7 +551,7 @@ saa6752hs_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
545 | struct v4l2_mpeg_compression *params = arg; | 551 | struct v4l2_mpeg_compression *params = arg; |
546 | int err = 0; | 552 | int err = 0; |
547 | 553 | ||
548 | switch (cmd) { | 554 | switch (cmd) { |
549 | case VIDIOC_S_MPEGCOMP: | 555 | case VIDIOC_S_MPEGCOMP: |
550 | if (NULL == params) { | 556 | if (NULL == params) { |
551 | /* apply settings and start encoder */ | 557 | /* apply settings and start encoder */ |
@@ -559,7 +565,7 @@ saa6752hs_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
559 | break; | 565 | break; |
560 | case VIDIOC_G_FMT: | 566 | case VIDIOC_G_FMT: |
561 | { | 567 | { |
562 | struct v4l2_format *f = arg; | 568 | struct v4l2_format *f = arg; |
563 | 569 | ||
564 | if (h->video_format == SAA6752HS_VF_UNKNOWN) | 570 | if (h->video_format == SAA6752HS_VF_UNKNOWN) |
565 | h->video_format = SAA6752HS_VF_D1; | 571 | h->video_format = SAA6752HS_VF_D1; |
@@ -576,6 +582,9 @@ saa6752hs_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
576 | saa6752hs_set_subsampling(client, f); | 582 | saa6752hs_set_subsampling(client, f); |
577 | break; | 583 | break; |
578 | } | 584 | } |
585 | case VIDIOC_S_STD: | ||
586 | h->standard = *((v4l2_std_id *) arg); | ||
587 | break; | ||
579 | default: | 588 | default: |
580 | /* nothing */ | 589 | /* nothing */ |
581 | break; | 590 | break; |
diff --git a/drivers/media/video/saa7134/saa7134-alsa.c b/drivers/media/video/saa7134/saa7134-alsa.c new file mode 100644 index 000000000000..4f3c42354329 --- /dev/null +++ b/drivers/media/video/saa7134/saa7134-alsa.c | |||
@@ -0,0 +1,1047 @@ | |||
1 | /* | ||
2 | * SAA713x ALSA support for V4L | ||
3 | * | ||
4 | * | ||
5 | * Caveats: | ||
6 | * - Volume doesn't work (it's always at max) | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License as published by | ||
10 | * the Free Software Foundation, version 2 | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | * | ||
21 | */ | ||
22 | |||
23 | #include <sound/driver.h> | ||
24 | #include <linux/init.h> | ||
25 | #include <linux/slab.h> | ||
26 | #include <linux/time.h> | ||
27 | #include <linux/wait.h> | ||
28 | #include <linux/moduleparam.h> | ||
29 | #include <linux/module.h> | ||
30 | #include <sound/core.h> | ||
31 | #include <sound/control.h> | ||
32 | #include <sound/pcm.h> | ||
33 | #include <sound/initval.h> | ||
34 | |||
35 | #include "saa7134.h" | ||
36 | #include "saa7134-reg.h" | ||
37 | |||
38 | static unsigned int debug = 0; | ||
39 | module_param(debug, int, 0644); | ||
40 | MODULE_PARM_DESC(debug,"enable debug messages [alsa]"); | ||
41 | |||
42 | /* | ||
43 | * Configuration macros | ||
44 | */ | ||
45 | |||
46 | /* defaults */ | ||
47 | #define MIXER_ADDR_TVTUNER 0 | ||
48 | #define MIXER_ADDR_LINE1 1 | ||
49 | #define MIXER_ADDR_LINE2 2 | ||
50 | #define MIXER_ADDR_LAST 2 | ||
51 | |||
52 | static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */ | ||
53 | static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ | ||
54 | static int enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 0}; | ||
55 | |||
56 | module_param_array(index, int, NULL, 0444); | ||
57 | MODULE_PARM_DESC(index, "Index value for SAA7134 capture interface(s)."); | ||
58 | |||
59 | #define dprintk(fmt, arg...) if (debug) \ | ||
60 | printk(KERN_DEBUG "%s/alsa: " fmt, dev->name , ## arg) | ||
61 | |||
62 | /* | ||
63 | * Main chip structure | ||
64 | */ | ||
65 | typedef struct snd_card_saa7134 { | ||
66 | snd_card_t *card; | ||
67 | spinlock_t mixer_lock; | ||
68 | int mixer_volume[MIXER_ADDR_LAST+1][2]; | ||
69 | int capture_source[MIXER_ADDR_LAST+1][2]; | ||
70 | struct pci_dev *pci; | ||
71 | struct saa7134_dev *saadev; | ||
72 | |||
73 | unsigned long iobase; | ||
74 | int irq; | ||
75 | |||
76 | spinlock_t lock; | ||
77 | } snd_card_saa7134_t; | ||
78 | |||
79 | |||
80 | |||
81 | /* | ||
82 | * PCM structure | ||
83 | */ | ||
84 | |||
85 | typedef struct snd_card_saa7134_pcm { | ||
86 | struct saa7134_dev *saadev; | ||
87 | |||
88 | spinlock_t lock; | ||
89 | unsigned int pcm_size; /* buffer size */ | ||
90 | unsigned int pcm_count; /* bytes per period */ | ||
91 | unsigned int pcm_bps; /* bytes per second */ | ||
92 | snd_pcm_substream_t *substream; | ||
93 | } snd_card_saa7134_pcm_t; | ||
94 | |||
95 | static snd_card_t *snd_saa7134_cards[SNDRV_CARDS]; | ||
96 | |||
97 | |||
98 | /* | ||
99 | * saa7134 DMA audio stop | ||
100 | * | ||
101 | * Called when the capture device is released or the buffer overflows | ||
102 | * | ||
103 | * - Copied verbatim from saa7134-oss's dsp_dma_stop. Can be dropped | ||
104 | * if we just share dsp_dma_stop and use it here | ||
105 | * | ||
106 | */ | ||
107 | |||
108 | static void saa7134_dma_stop(struct saa7134_dev *dev) | ||
109 | |||
110 | { | ||
111 | dev->dmasound.dma_blk = -1; | ||
112 | dev->dmasound.dma_running = 0; | ||
113 | saa7134_set_dmabits(dev); | ||
114 | } | ||
115 | |||
116 | /* | ||
117 | * saa7134 DMA audio start | ||
118 | * | ||
119 | * Called when preparing the capture device for use | ||
120 | * | ||
121 | * - Copied verbatim from saa7134-oss's dsp_dma_start. Can be dropped | ||
122 | * if we just share dsp_dma_start and use it here | ||
123 | * | ||
124 | */ | ||
125 | |||
126 | static void saa7134_dma_start(struct saa7134_dev *dev) | ||
127 | { | ||
128 | dev->dmasound.dma_blk = 0; | ||
129 | dev->dmasound.dma_running = 1; | ||
130 | saa7134_set_dmabits(dev); | ||
131 | } | ||
132 | |||
133 | /* | ||
134 | * saa7134 audio DMA IRQ handler | ||
135 | * | ||
136 | * Called whenever we get an SAA7134_IRQ_REPORT_DONE_RA3 interrupt | ||
137 | * Handles shifting between the 2 buffers, manages the read counters, | ||
138 | * and notifies ALSA when periods elapse | ||
139 | * | ||
140 | * - Mostly copied from saa7134-oss's saa7134_irq_oss_done. | ||
141 | * | ||
142 | */ | ||
143 | |||
144 | void saa7134_irq_alsa_done(struct saa7134_dev *dev, unsigned long status) | ||
145 | { | ||
146 | int next_blk, reg = 0; | ||
147 | |||
148 | spin_lock(&dev->slock); | ||
149 | if (UNSET == dev->dmasound.dma_blk) { | ||
150 | dprintk("irq: recording stopped\n"); | ||
151 | goto done; | ||
152 | } | ||
153 | if (0 != (status & 0x0f000000)) | ||
154 | dprintk("irq: lost %ld\n", (status >> 24) & 0x0f); | ||
155 | if (0 == (status & 0x10000000)) { | ||
156 | /* odd */ | ||
157 | if (0 == (dev->dmasound.dma_blk & 0x01)) | ||
158 | reg = SAA7134_RS_BA1(6); | ||
159 | } else { | ||
160 | /* even */ | ||
161 | if (1 == (dev->dmasound.dma_blk & 0x01)) | ||
162 | reg = SAA7134_RS_BA2(6); | ||
163 | } | ||
164 | if (0 == reg) { | ||
165 | dprintk("irq: field oops [%s]\n", | ||
166 | (status & 0x10000000) ? "even" : "odd"); | ||
167 | goto done; | ||
168 | } | ||
169 | |||
170 | if (dev->dmasound.read_count >= dev->dmasound.blksize * (dev->dmasound.blocks-2)) { | ||
171 | dprintk("irq: overrun [full=%d/%d] - Blocks in %d\n",dev->dmasound.read_count, | ||
172 | dev->dmasound.bufsize, dev->dmasound.blocks); | ||
173 | snd_pcm_stop(dev->dmasound.substream,SNDRV_PCM_STATE_XRUN); | ||
174 | saa7134_dma_stop(dev); | ||
175 | goto done; | ||
176 | } | ||
177 | |||
178 | /* next block addr */ | ||
179 | next_blk = (dev->dmasound.dma_blk + 2) % dev->dmasound.blocks; | ||
180 | saa_writel(reg,next_blk * dev->dmasound.blksize); | ||
181 | if (debug > 2) | ||
182 | dprintk("irq: ok, %s, next_blk=%d, addr=%x, blocks=%u, size=%u, read=%u\n", | ||
183 | (status & 0x10000000) ? "even" : "odd ", next_blk, | ||
184 | next_blk * dev->dmasound.blksize, dev->dmasound.blocks, dev->dmasound.blksize, dev->dmasound.read_count); | ||
185 | |||
186 | /* update status & wake waiting readers */ | ||
187 | dev->dmasound.dma_blk = (dev->dmasound.dma_blk + 1) % dev->dmasound.blocks; | ||
188 | dev->dmasound.read_count += dev->dmasound.blksize; | ||
189 | |||
190 | dev->dmasound.recording_on = reg; | ||
191 | |||
192 | if (dev->dmasound.read_count >= snd_pcm_lib_period_bytes(dev->dmasound.substream)) { | ||
193 | spin_unlock(&dev->slock); | ||
194 | snd_pcm_period_elapsed(dev->dmasound.substream); | ||
195 | spin_lock(&dev->slock); | ||
196 | } | ||
197 | done: | ||
198 | spin_unlock(&dev->slock); | ||
199 | |||
200 | } | ||
201 | |||
202 | /* | ||
203 | * IRQ request handler | ||
204 | * | ||
205 | * Runs along with saa7134's IRQ handler, discards anything that isn't | ||
206 | * DMA sound | ||
207 | * | ||
208 | */ | ||
209 | |||
210 | static irqreturn_t saa7134_alsa_irq(int irq, void *dev_id, struct pt_regs *regs) | ||
211 | { | ||
212 | struct saa7134_dev *dev = (struct saa7134_dev*) dev_id; | ||
213 | unsigned long report, status; | ||
214 | int loop, handled = 0; | ||
215 | |||
216 | for (loop = 0; loop < 10; loop++) { | ||
217 | report = saa_readl(SAA7134_IRQ_REPORT); | ||
218 | status = saa_readl(SAA7134_IRQ_STATUS); | ||
219 | |||
220 | if (report & SAA7134_IRQ_REPORT_DONE_RA3) { | ||
221 | handled = 1; | ||
222 | saa_writel(SAA7134_IRQ_REPORT,report); | ||
223 | saa7134_irq_alsa_done(dev, status); | ||
224 | } else { | ||
225 | goto out; | ||
226 | } | ||
227 | } | ||
228 | |||
229 | if (loop == 10) { | ||
230 | dprintk("error! looping IRQ!"); | ||
231 | } | ||
232 | |||
233 | out: | ||
234 | return IRQ_RETVAL(handled); | ||
235 | } | ||
236 | |||
237 | /* | ||
238 | * ALSA capture trigger | ||
239 | * | ||
240 | * - One of the ALSA capture callbacks. | ||
241 | * | ||
242 | * Called whenever a capture is started or stopped. Must be defined, | ||
243 | * but there's nothing we want to do here | ||
244 | * | ||
245 | */ | ||
246 | |||
247 | static int snd_card_saa7134_capture_trigger(snd_pcm_substream_t * substream, | ||
248 | int cmd) | ||
249 | { | ||
250 | snd_pcm_runtime_t *runtime = substream->runtime; | ||
251 | snd_card_saa7134_pcm_t *saapcm = runtime->private_data; | ||
252 | struct saa7134_dev *dev=saapcm->saadev; | ||
253 | int err = 0; | ||
254 | |||
255 | spin_lock_irq(&dev->slock); | ||
256 | if (cmd == SNDRV_PCM_TRIGGER_START) { | ||
257 | /* start dma */ | ||
258 | saa7134_dma_start(dev); | ||
259 | } else if (cmd == SNDRV_PCM_TRIGGER_STOP) { | ||
260 | /* stop dma */ | ||
261 | saa7134_dma_stop(dev); | ||
262 | } else { | ||
263 | err = -EINVAL; | ||
264 | } | ||
265 | spin_unlock_irq(&dev->slock); | ||
266 | |||
267 | return err; | ||
268 | } | ||
269 | |||
270 | /* | ||
271 | * DMA buffer config | ||
272 | * | ||
273 | * Sets the values that will later be used as the size of the buffer, | ||
274 | * size of the fragments, and total number of fragments. | ||
275 | * Must be called during the preparation stage, before memory is | ||
276 | * allocated | ||
277 | * | ||
278 | * - Copied verbatim from saa7134-oss. Can be dropped | ||
279 | * if we just share dsp_buffer_conf from OSS. | ||
280 | */ | ||
281 | |||
282 | static int dsp_buffer_conf(struct saa7134_dev *dev, int blksize, int blocks) | ||
283 | { | ||
284 | if (blksize < 0x100) | ||
285 | blksize = 0x100; | ||
286 | if (blksize > 0x10000) | ||
287 | blksize = 0x10000; | ||
288 | |||
289 | if (blocks < 2) | ||
290 | blocks = 2; | ||
291 | if ((blksize * blocks) > 1024*1024) | ||
292 | blocks = 1024*1024 / blksize; | ||
293 | |||
294 | dev->dmasound.blocks = blocks; | ||
295 | dev->dmasound.blksize = blksize; | ||
296 | dev->dmasound.bufsize = blksize * blocks; | ||
297 | |||
298 | dprintk("buffer config: %d blocks / %d bytes, %d kB total\n", | ||
299 | blocks,blksize,blksize * blocks / 1024); | ||
300 | return 0; | ||
301 | } | ||
302 | |||
303 | /* | ||
304 | * DMA buffer initialization | ||
305 | * | ||
306 | * Uses V4L functions to initialize the DMA. Shouldn't be necessary in | ||
307 | * ALSA, but I was unable to use ALSA's own DMA, and had to force the | ||
308 | * usage of V4L's | ||
309 | * | ||
310 | * - Copied verbatim from saa7134-oss. Can be dropped | ||
311 | * if we just share dsp_buffer_init from OSS. | ||
312 | */ | ||
313 | |||
314 | static int dsp_buffer_init(struct saa7134_dev *dev) | ||
315 | { | ||
316 | int err; | ||
317 | |||
318 | if (!dev->dmasound.bufsize) | ||
319 | BUG(); | ||
320 | videobuf_dma_init(&dev->dmasound.dma); | ||
321 | err = videobuf_dma_init_kernel(&dev->dmasound.dma, PCI_DMA_FROMDEVICE, | ||
322 | (dev->dmasound.bufsize + PAGE_SIZE) >> PAGE_SHIFT); | ||
323 | if (0 != err) | ||
324 | return err; | ||
325 | return 0; | ||
326 | } | ||
327 | |||
328 | /* | ||
329 | * ALSA PCM preparation | ||
330 | * | ||
331 | * - One of the ALSA capture callbacks. | ||
332 | * | ||
333 | * Called right after the capture device is opened, this function configures | ||
334 | * the buffer using the previously defined functions, allocates the memory, | ||
335 | * sets up the hardware registers, and then starts the DMA. When this function | ||
336 | * returns, the audio should be flowing. | ||
337 | * | ||
338 | */ | ||
339 | |||
340 | static int snd_card_saa7134_capture_prepare(snd_pcm_substream_t * substream) | ||
341 | { | ||
342 | snd_pcm_runtime_t *runtime = substream->runtime; | ||
343 | int err, bswap, sign; | ||
344 | u32 fmt, control; | ||
345 | snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream); | ||
346 | struct saa7134_dev *dev; | ||
347 | snd_card_saa7134_pcm_t *saapcm = runtime->private_data; | ||
348 | unsigned int bps; | ||
349 | unsigned long size; | ||
350 | unsigned count; | ||
351 | |||
352 | size = snd_pcm_lib_buffer_bytes(substream); | ||
353 | count = snd_pcm_lib_period_bytes(substream); | ||
354 | |||
355 | saapcm->saadev->dmasound.substream = substream; | ||
356 | bps = runtime->rate * runtime->channels; | ||
357 | bps *= snd_pcm_format_width(runtime->format); | ||
358 | bps /= 8; | ||
359 | if (bps <= 0) | ||
360 | return -EINVAL; | ||
361 | saapcm->pcm_bps = bps; | ||
362 | saapcm->pcm_size = snd_pcm_lib_buffer_bytes(substream); | ||
363 | saapcm->pcm_count = snd_pcm_lib_period_bytes(substream); | ||
364 | |||
365 | |||
366 | dev=saa7134->saadev; | ||
367 | |||
368 | dsp_buffer_conf(dev,saapcm->pcm_count,(saapcm->pcm_size/saapcm->pcm_count)); | ||
369 | |||
370 | err = dsp_buffer_init(dev); | ||
371 | if (0 != err) | ||
372 | goto fail2; | ||
373 | |||
374 | /* prepare buffer */ | ||
375 | if (0 != (err = videobuf_dma_pci_map(dev->pci,&dev->dmasound.dma))) | ||
376 | return err; | ||
377 | if (0 != (err = saa7134_pgtable_alloc(dev->pci,&dev->dmasound.pt))) | ||
378 | goto fail1; | ||
379 | if (0 != (err = saa7134_pgtable_build(dev->pci,&dev->dmasound.pt, | ||
380 | dev->dmasound.dma.sglist, | ||
381 | dev->dmasound.dma.sglen, | ||
382 | 0))) | ||
383 | goto fail2; | ||
384 | |||
385 | |||
386 | |||
387 | switch (runtime->format) { | ||
388 | case SNDRV_PCM_FORMAT_U8: | ||
389 | case SNDRV_PCM_FORMAT_S8: | ||
390 | fmt = 0x00; | ||
391 | break; | ||
392 | case SNDRV_PCM_FORMAT_U16_LE: | ||
393 | case SNDRV_PCM_FORMAT_U16_BE: | ||
394 | case SNDRV_PCM_FORMAT_S16_LE: | ||
395 | case SNDRV_PCM_FORMAT_S16_BE: | ||
396 | fmt = 0x01; | ||
397 | break; | ||
398 | default: | ||
399 | err = -EINVAL; | ||
400 | return 1; | ||
401 | } | ||
402 | |||
403 | switch (runtime->format) { | ||
404 | case SNDRV_PCM_FORMAT_S8: | ||
405 | case SNDRV_PCM_FORMAT_S16_LE: | ||
406 | case SNDRV_PCM_FORMAT_S16_BE: | ||
407 | sign = 1; | ||
408 | break; | ||
409 | default: | ||
410 | sign = 0; | ||
411 | break; | ||
412 | } | ||
413 | |||
414 | switch (runtime->format) { | ||
415 | case SNDRV_PCM_FORMAT_U16_BE: | ||
416 | case SNDRV_PCM_FORMAT_S16_BE: | ||
417 | bswap = 1; break; | ||
418 | default: | ||
419 | bswap = 0; break; | ||
420 | } | ||
421 | |||
422 | switch (dev->pci->device) { | ||
423 | case PCI_DEVICE_ID_PHILIPS_SAA7134: | ||
424 | if (1 == runtime->channels) | ||
425 | fmt |= (1 << 3); | ||
426 | if (2 == runtime->channels) | ||
427 | fmt |= (3 << 3); | ||
428 | if (sign) | ||
429 | fmt |= 0x04; | ||
430 | |||
431 | fmt |= (MIXER_ADDR_TVTUNER == dev->dmasound.input) ? 0xc0 : 0x80; | ||
432 | saa_writeb(SAA7134_NUM_SAMPLES0, ((dev->dmasound.blksize - 1) & 0x0000ff)); | ||
433 | saa_writeb(SAA7134_NUM_SAMPLES1, ((dev->dmasound.blksize - 1) & 0x00ff00) >> 8); | ||
434 | saa_writeb(SAA7134_NUM_SAMPLES2, ((dev->dmasound.blksize - 1) & 0xff0000) >> 16); | ||
435 | saa_writeb(SAA7134_AUDIO_FORMAT_CTRL, fmt); | ||
436 | |||
437 | break; | ||
438 | case PCI_DEVICE_ID_PHILIPS_SAA7133: | ||
439 | case PCI_DEVICE_ID_PHILIPS_SAA7135: | ||
440 | if (1 == runtime->channels) | ||
441 | fmt |= (1 << 4); | ||
442 | if (2 == runtime->channels) | ||
443 | fmt |= (2 << 4); | ||
444 | if (!sign) | ||
445 | fmt |= 0x04; | ||
446 | saa_writel(SAA7133_NUM_SAMPLES, dev->dmasound.blksize -1); | ||
447 | saa_writel(SAA7133_AUDIO_CHANNEL, 0x543210 | (fmt << 24)); | ||
448 | //saa_writel(SAA7133_AUDIO_CHANNEL, 0x543210); | ||
449 | break; | ||
450 | } | ||
451 | |||
452 | dprintk("rec_start: afmt=%d ch=%d => fmt=0x%x swap=%c\n", | ||
453 | runtime->format, runtime->channels, fmt, | ||
454 | bswap ? 'b' : '-'); | ||
455 | /* dma: setup channel 6 (= AUDIO) */ | ||
456 | control = SAA7134_RS_CONTROL_BURST_16 | | ||
457 | SAA7134_RS_CONTROL_ME | | ||
458 | (dev->dmasound.pt.dma >> 12); | ||
459 | if (bswap) | ||
460 | control |= SAA7134_RS_CONTROL_BSWAP; | ||
461 | |||
462 | /* I should be able to use runtime->dma_addr in the control | ||
463 | byte, but it doesn't work. So I allocate the DMA using the | ||
464 | V4L functions, and force ALSA to use that as the DMA area */ | ||
465 | |||
466 | runtime->dma_area = dev->dmasound.dma.vmalloc; | ||
467 | |||
468 | saa_writel(SAA7134_RS_BA1(6),0); | ||
469 | saa_writel(SAA7134_RS_BA2(6),dev->dmasound.blksize); | ||
470 | saa_writel(SAA7134_RS_PITCH(6),0); | ||
471 | saa_writel(SAA7134_RS_CONTROL(6),control); | ||
472 | |||
473 | dev->dmasound.rate = runtime->rate; | ||
474 | |||
475 | return 0; | ||
476 | fail2: | ||
477 | saa7134_pgtable_free(dev->pci,&dev->dmasound.pt); | ||
478 | fail1: | ||
479 | videobuf_dma_pci_unmap(dev->pci,&dev->dmasound.dma); | ||
480 | return err; | ||
481 | |||
482 | |||
483 | } | ||
484 | |||
485 | /* | ||
486 | * ALSA pointer fetching | ||
487 | * | ||
488 | * - One of the ALSA capture callbacks. | ||
489 | * | ||
490 | * Called whenever a period elapses, it must return the current hardware | ||
491 | * position of the buffer. | ||
492 | * Also resets the read counter used to prevent overruns | ||
493 | * | ||
494 | */ | ||
495 | |||
496 | static snd_pcm_uframes_t snd_card_saa7134_capture_pointer(snd_pcm_substream_t * substream) | ||
497 | { | ||
498 | snd_pcm_runtime_t *runtime = substream->runtime; | ||
499 | snd_card_saa7134_pcm_t *saapcm = runtime->private_data; | ||
500 | struct saa7134_dev *dev=saapcm->saadev; | ||
501 | |||
502 | |||
503 | |||
504 | if (dev->dmasound.read_count) { | ||
505 | dev->dmasound.read_count -= snd_pcm_lib_period_bytes(substream); | ||
506 | dev->dmasound.read_offset += snd_pcm_lib_period_bytes(substream); | ||
507 | if (dev->dmasound.read_offset == dev->dmasound.bufsize) | ||
508 | dev->dmasound.read_offset = 0; | ||
509 | } | ||
510 | |||
511 | return bytes_to_frames(runtime, dev->dmasound.read_offset); | ||
512 | } | ||
513 | |||
514 | /* | ||
515 | * ALSA hardware capabilities definition | ||
516 | */ | ||
517 | |||
518 | static snd_pcm_hardware_t snd_card_saa7134_capture = | ||
519 | { | ||
520 | .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | | ||
521 | SNDRV_PCM_INFO_BLOCK_TRANSFER | | ||
522 | SNDRV_PCM_INFO_MMAP_VALID), | ||
523 | .formats = SNDRV_PCM_FMTBIT_S16_LE | \ | ||
524 | SNDRV_PCM_FMTBIT_S16_BE | \ | ||
525 | SNDRV_PCM_FMTBIT_S8 | \ | ||
526 | SNDRV_PCM_FMTBIT_U8 | \ | ||
527 | SNDRV_PCM_FMTBIT_U16_LE | \ | ||
528 | SNDRV_PCM_FMTBIT_U16_BE, | ||
529 | .rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000, | ||
530 | .rate_min = 32000, | ||
531 | .rate_max = 48000, | ||
532 | .channels_min = 1, | ||
533 | .channels_max = 2, | ||
534 | .buffer_bytes_max = (256*1024), | ||
535 | .period_bytes_min = 64, | ||
536 | .period_bytes_max = (256*1024), | ||
537 | .periods_min = 2, | ||
538 | .periods_max = 1024, | ||
539 | }; | ||
540 | |||
541 | static void snd_card_saa7134_runtime_free(snd_pcm_runtime_t *runtime) | ||
542 | { | ||
543 | snd_card_saa7134_pcm_t *saapcm = runtime->private_data; | ||
544 | |||
545 | kfree(saapcm); | ||
546 | } | ||
547 | |||
548 | |||
549 | /* | ||
550 | * ALSA hardware params | ||
551 | * | ||
552 | * - One of the ALSA capture callbacks. | ||
553 | * | ||
554 | * Called on initialization, right before the PCM preparation | ||
555 | * Usually used in ALSA to allocate the DMA, but since we don't use the | ||
556 | * ALSA DMA it does nothing | ||
557 | * | ||
558 | */ | ||
559 | |||
560 | static int snd_card_saa7134_hw_params(snd_pcm_substream_t * substream, | ||
561 | snd_pcm_hw_params_t * hw_params) | ||
562 | { | ||
563 | |||
564 | return 0; | ||
565 | |||
566 | |||
567 | } | ||
568 | |||
569 | /* | ||
570 | * ALSA hardware release | ||
571 | * | ||
572 | * - One of the ALSA capture callbacks. | ||
573 | * | ||
574 | * Called after closing the device, but before snd_card_saa7134_capture_close | ||
575 | * Usually used in ALSA to free the DMA, but since we don't use the | ||
576 | * ALSA DMA I'm almost sure this isn't necessary. | ||
577 | * | ||
578 | */ | ||
579 | |||
580 | static int snd_card_saa7134_hw_free(snd_pcm_substream_t * substream) | ||
581 | { | ||
582 | return 0; | ||
583 | } | ||
584 | |||
585 | /* | ||
586 | * DMA buffer release | ||
587 | * | ||
588 | * Called after closing the device, during snd_card_saa7134_capture_close | ||
589 | * | ||
590 | */ | ||
591 | |||
592 | static int dsp_buffer_free(struct saa7134_dev *dev) | ||
593 | { | ||
594 | if (!dev->dmasound.blksize) | ||
595 | BUG(); | ||
596 | |||
597 | videobuf_dma_free(&dev->dmasound.dma); | ||
598 | |||
599 | dev->dmasound.blocks = 0; | ||
600 | dev->dmasound.blksize = 0; | ||
601 | dev->dmasound.bufsize = 0; | ||
602 | |||
603 | return 0; | ||
604 | } | ||
605 | |||
606 | /* | ||
607 | * ALSA capture finish | ||
608 | * | ||
609 | * - One of the ALSA capture callbacks. | ||
610 | * | ||
611 | * Called after closing the device. It stops the DMA audio and releases | ||
612 | * the buffers | ||
613 | * | ||
614 | */ | ||
615 | |||
616 | static int snd_card_saa7134_capture_close(snd_pcm_substream_t * substream) | ||
617 | { | ||
618 | snd_card_saa7134_t *chip = snd_pcm_substream_chip(substream); | ||
619 | struct saa7134_dev *dev = chip->saadev; | ||
620 | |||
621 | /* unlock buffer */ | ||
622 | saa7134_pgtable_free(dev->pci,&dev->dmasound.pt); | ||
623 | videobuf_dma_pci_unmap(dev->pci,&dev->dmasound.dma); | ||
624 | |||
625 | dsp_buffer_free(dev); | ||
626 | return 0; | ||
627 | } | ||
628 | |||
629 | /* | ||
630 | * ALSA capture start | ||
631 | * | ||
632 | * - One of the ALSA capture callbacks. | ||
633 | * | ||
634 | * Called when opening the device. It creates and populates the PCM | ||
635 | * structure | ||
636 | * | ||
637 | */ | ||
638 | |||
639 | static int snd_card_saa7134_capture_open(snd_pcm_substream_t * substream) | ||
640 | { | ||
641 | snd_pcm_runtime_t *runtime = substream->runtime; | ||
642 | snd_card_saa7134_pcm_t *saapcm; | ||
643 | snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream); | ||
644 | struct saa7134_dev *dev = saa7134->saadev; | ||
645 | int err; | ||
646 | |||
647 | down(&dev->dmasound.lock); | ||
648 | |||
649 | dev->dmasound.afmt = SNDRV_PCM_FORMAT_U8; | ||
650 | dev->dmasound.channels = 2; | ||
651 | dev->dmasound.read_count = 0; | ||
652 | dev->dmasound.read_offset = 0; | ||
653 | |||
654 | up(&dev->dmasound.lock); | ||
655 | |||
656 | saapcm = kzalloc(sizeof(*saapcm), GFP_KERNEL); | ||
657 | if (saapcm == NULL) | ||
658 | return -ENOMEM; | ||
659 | saapcm->saadev=saa7134->saadev; | ||
660 | |||
661 | spin_lock_init(&saapcm->lock); | ||
662 | |||
663 | saapcm->substream = substream; | ||
664 | runtime->private_data = saapcm; | ||
665 | runtime->private_free = snd_card_saa7134_runtime_free; | ||
666 | runtime->hw = snd_card_saa7134_capture; | ||
667 | |||
668 | if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0) | ||
669 | return err; | ||
670 | |||
671 | return 0; | ||
672 | } | ||
673 | |||
674 | /* | ||
675 | * ALSA capture callbacks definition | ||
676 | */ | ||
677 | |||
678 | static snd_pcm_ops_t snd_card_saa7134_capture_ops = { | ||
679 | .open = snd_card_saa7134_capture_open, | ||
680 | .close = snd_card_saa7134_capture_close, | ||
681 | .ioctl = snd_pcm_lib_ioctl, | ||
682 | .hw_params = snd_card_saa7134_hw_params, | ||
683 | .hw_free = snd_card_saa7134_hw_free, | ||
684 | .prepare = snd_card_saa7134_capture_prepare, | ||
685 | .trigger = snd_card_saa7134_capture_trigger, | ||
686 | .pointer = snd_card_saa7134_capture_pointer, | ||
687 | }; | ||
688 | |||
689 | /* | ||
690 | * ALSA PCM setup | ||
691 | * | ||
692 | * Called when initializing the board. Sets up the name and hooks up | ||
693 | * the callbacks | ||
694 | * | ||
695 | */ | ||
696 | |||
697 | static int snd_card_saa7134_pcm(snd_card_saa7134_t *saa7134, int device) | ||
698 | { | ||
699 | snd_pcm_t *pcm; | ||
700 | int err; | ||
701 | |||
702 | if ((err = snd_pcm_new(saa7134->card, "SAA7134 PCM", device, 0, 1, &pcm)) < 0) | ||
703 | return err; | ||
704 | snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_card_saa7134_capture_ops); | ||
705 | pcm->private_data = saa7134; | ||
706 | pcm->info_flags = 0; | ||
707 | strcpy(pcm->name, "SAA7134 PCM"); | ||
708 | return 0; | ||
709 | } | ||
710 | |||
711 | #define SAA713x_VOLUME(xname, xindex, addr) \ | ||
712 | { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \ | ||
713 | .info = snd_saa7134_volume_info, \ | ||
714 | .get = snd_saa7134_volume_get, .put = snd_saa7134_volume_put, \ | ||
715 | .private_value = addr } | ||
716 | |||
717 | static int snd_saa7134_volume_info(snd_kcontrol_t * kcontrol, snd_ctl_elem_info_t * uinfo) | ||
718 | { | ||
719 | uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; | ||
720 | uinfo->count = 2; | ||
721 | uinfo->value.integer.min = 0; | ||
722 | uinfo->value.integer.max = 20; | ||
723 | return 0; | ||
724 | } | ||
725 | |||
726 | static int snd_saa7134_volume_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol) | ||
727 | { | ||
728 | snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol); | ||
729 | int addr = kcontrol->private_value; | ||
730 | |||
731 | ucontrol->value.integer.value[0] = chip->mixer_volume[addr][0]; | ||
732 | ucontrol->value.integer.value[1] = chip->mixer_volume[addr][1]; | ||
733 | return 0; | ||
734 | } | ||
735 | |||
736 | static int snd_saa7134_volume_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol) | ||
737 | { | ||
738 | snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol); | ||
739 | unsigned long flags; | ||
740 | int change, addr = kcontrol->private_value; | ||
741 | int left, right; | ||
742 | |||
743 | left = ucontrol->value.integer.value[0]; | ||
744 | if (left < 0) | ||
745 | left = 0; | ||
746 | if (left > 20) | ||
747 | left = 20; | ||
748 | right = ucontrol->value.integer.value[1]; | ||
749 | if (right < 0) | ||
750 | right = 0; | ||
751 | if (right > 20) | ||
752 | right = 20; | ||
753 | spin_lock_irqsave(&chip->mixer_lock, flags); | ||
754 | change = chip->mixer_volume[addr][0] != left || | ||
755 | chip->mixer_volume[addr][1] != right; | ||
756 | chip->mixer_volume[addr][0] = left; | ||
757 | chip->mixer_volume[addr][1] = right; | ||
758 | spin_unlock_irqrestore(&chip->mixer_lock, flags); | ||
759 | return change; | ||
760 | } | ||
761 | |||
762 | #define SAA713x_CAPSRC(xname, xindex, addr) \ | ||
763 | { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \ | ||
764 | .info = snd_saa7134_capsrc_info, \ | ||
765 | .get = snd_saa7134_capsrc_get, .put = snd_saa7134_capsrc_put, \ | ||
766 | .private_value = addr } | ||
767 | |||
768 | static int snd_saa7134_capsrc_info(snd_kcontrol_t * kcontrol, snd_ctl_elem_info_t * uinfo) | ||
769 | { | ||
770 | uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; | ||
771 | uinfo->count = 2; | ||
772 | uinfo->value.integer.min = 0; | ||
773 | uinfo->value.integer.max = 1; | ||
774 | return 0; | ||
775 | } | ||
776 | |||
777 | static int snd_saa7134_capsrc_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol) | ||
778 | { | ||
779 | snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol); | ||
780 | unsigned long flags; | ||
781 | int addr = kcontrol->private_value; | ||
782 | |||
783 | spin_lock_irqsave(&chip->mixer_lock, flags); | ||
784 | ucontrol->value.integer.value[0] = chip->capture_source[addr][0]; | ||
785 | ucontrol->value.integer.value[1] = chip->capture_source[addr][1]; | ||
786 | spin_unlock_irqrestore(&chip->mixer_lock, flags); | ||
787 | return 0; | ||
788 | } | ||
789 | |||
790 | static int snd_saa7134_capsrc_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol) | ||
791 | { | ||
792 | snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol); | ||
793 | unsigned long flags; | ||
794 | int change, addr = kcontrol->private_value; | ||
795 | int left, right; | ||
796 | u32 anabar, xbarin; | ||
797 | int analog_io, rate; | ||
798 | struct saa7134_dev *dev; | ||
799 | |||
800 | dev = chip->saadev; | ||
801 | |||
802 | left = ucontrol->value.integer.value[0] & 1; | ||
803 | right = ucontrol->value.integer.value[1] & 1; | ||
804 | spin_lock_irqsave(&chip->mixer_lock, flags); | ||
805 | |||
806 | change = chip->capture_source[addr][0] != left || | ||
807 | chip->capture_source[addr][1] != right; | ||
808 | chip->capture_source[addr][0] = left; | ||
809 | chip->capture_source[addr][1] = right; | ||
810 | dev->dmasound.input=addr; | ||
811 | spin_unlock_irqrestore(&chip->mixer_lock, flags); | ||
812 | |||
813 | |||
814 | if (change) { | ||
815 | switch (dev->pci->device) { | ||
816 | |||
817 | case PCI_DEVICE_ID_PHILIPS_SAA7134: | ||
818 | switch (addr) { | ||
819 | case MIXER_ADDR_TVTUNER: | ||
820 | saa_andorb(SAA7134_AUDIO_FORMAT_CTRL, 0xc0, 0xc0); | ||
821 | saa_andorb(SAA7134_SIF_SAMPLE_FREQ, 0x03, 0x00); | ||
822 | break; | ||
823 | case MIXER_ADDR_LINE1: | ||
824 | case MIXER_ADDR_LINE2: | ||
825 | analog_io = (MIXER_ADDR_LINE1 == addr) ? 0x00 : 0x08; | ||
826 | rate = (32000 == dev->dmasound.rate) ? 0x01 : 0x03; | ||
827 | saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x08, analog_io); | ||
828 | saa_andorb(SAA7134_AUDIO_FORMAT_CTRL, 0xc0, 0x80); | ||
829 | saa_andorb(SAA7134_SIF_SAMPLE_FREQ, 0x03, rate); | ||
830 | break; | ||
831 | } | ||
832 | |||
833 | break; | ||
834 | case PCI_DEVICE_ID_PHILIPS_SAA7133: | ||
835 | case PCI_DEVICE_ID_PHILIPS_SAA7135: | ||
836 | xbarin = 0x03; // adc | ||
837 | anabar = 0; | ||
838 | switch (addr) { | ||
839 | case MIXER_ADDR_TVTUNER: | ||
840 | xbarin = 0; // Demodulator | ||
841 | anabar = 2; // DACs | ||
842 | break; | ||
843 | case MIXER_ADDR_LINE1: | ||
844 | anabar = 0; // aux1, aux1 | ||
845 | break; | ||
846 | case MIXER_ADDR_LINE2: | ||
847 | anabar = 9; // aux2, aux2 | ||
848 | break; | ||
849 | } | ||
850 | |||
851 | /* output xbar always main channel */ | ||
852 | saa_dsp_writel(dev, SAA7133_DIGITAL_OUTPUT_SEL1, 0xbbbb10); | ||
853 | |||
854 | if (left || right) { // We've got data, turn the input on | ||
855 | saa_dsp_writel(dev, SAA7133_DIGITAL_INPUT_XBAR1, xbarin); | ||
856 | saa_writel(SAA7133_ANALOG_IO_SELECT, anabar); | ||
857 | } else { | ||
858 | saa_dsp_writel(dev, SAA7133_DIGITAL_INPUT_XBAR1, 0); | ||
859 | saa_writel(SAA7133_ANALOG_IO_SELECT, 0); | ||
860 | } | ||
861 | break; | ||
862 | } | ||
863 | } | ||
864 | |||
865 | return change; | ||
866 | } | ||
867 | |||
868 | static snd_kcontrol_new_t snd_saa7134_controls[] = { | ||
869 | SAA713x_VOLUME("Video Volume", 0, MIXER_ADDR_TVTUNER), | ||
870 | SAA713x_CAPSRC("Video Capture Switch", 0, MIXER_ADDR_TVTUNER), | ||
871 | SAA713x_VOLUME("Line Volume", 1, MIXER_ADDR_LINE1), | ||
872 | SAA713x_CAPSRC("Line Capture Switch", 1, MIXER_ADDR_LINE1), | ||
873 | SAA713x_VOLUME("Line Volume", 2, MIXER_ADDR_LINE2), | ||
874 | SAA713x_CAPSRC("Line Capture Switch", 2, MIXER_ADDR_LINE2), | ||
875 | }; | ||
876 | |||
877 | /* | ||
878 | * ALSA mixer setup | ||
879 | * | ||
880 | * Called when initializing the board. Sets up the name and hooks up | ||
881 | * the callbacks | ||
882 | * | ||
883 | */ | ||
884 | |||
885 | static int snd_card_saa7134_new_mixer(snd_card_saa7134_t * chip) | ||
886 | { | ||
887 | snd_card_t *card = chip->card; | ||
888 | unsigned int idx; | ||
889 | int err; | ||
890 | |||
891 | snd_assert(chip != NULL, return -EINVAL); | ||
892 | strcpy(card->mixername, "SAA7134 Mixer"); | ||
893 | |||
894 | for (idx = 0; idx < ARRAY_SIZE(snd_saa7134_controls); idx++) { | ||
895 | if ((err = snd_ctl_add(card, snd_ctl_new1(&snd_saa7134_controls[idx], chip))) < 0) | ||
896 | return err; | ||
897 | } | ||
898 | return 0; | ||
899 | } | ||
900 | |||
901 | static int snd_saa7134_free(snd_card_saa7134_t *chip) | ||
902 | { | ||
903 | return 0; | ||
904 | } | ||
905 | |||
906 | static int snd_saa7134_dev_free(snd_device_t *device) | ||
907 | { | ||
908 | snd_card_saa7134_t *chip = device->device_data; | ||
909 | return snd_saa7134_free(chip); | ||
910 | } | ||
911 | |||
912 | /* | ||
913 | * ALSA initialization | ||
914 | * | ||
915 | * Called by saa7134-core, it creates the basic structures and registers | ||
916 | * the ALSA devices | ||
917 | * | ||
918 | */ | ||
919 | |||
920 | int alsa_card_saa7134_create (struct saa7134_dev *saadev) | ||
921 | { | ||
922 | static int dev; | ||
923 | |||
924 | snd_card_t *card; | ||
925 | snd_card_saa7134_t *chip; | ||
926 | int err; | ||
927 | static snd_device_ops_t ops = { | ||
928 | .dev_free = snd_saa7134_dev_free, | ||
929 | }; | ||
930 | |||
931 | |||
932 | if (dev >= SNDRV_CARDS) | ||
933 | return -ENODEV; | ||
934 | if (!enable[dev]) | ||
935 | return -ENODEV; | ||
936 | |||
937 | card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); | ||
938 | |||
939 | if (card == NULL) | ||
940 | return -ENOMEM; | ||
941 | |||
942 | strcpy(card->driver, "SAA7134"); | ||
943 | |||
944 | /* Card "creation" */ | ||
945 | |||
946 | chip = kcalloc(1, sizeof(*chip), GFP_KERNEL); | ||
947 | if (chip == NULL) { | ||
948 | return -ENOMEM; | ||
949 | } | ||
950 | |||
951 | spin_lock_init(&chip->lock); | ||
952 | spin_lock_init(&chip->mixer_lock); | ||
953 | |||
954 | chip->saadev = saadev; | ||
955 | |||
956 | chip->card = card; | ||
957 | |||
958 | chip->pci = saadev->pci; | ||
959 | chip->irq = saadev->pci->irq; | ||
960 | chip->iobase = pci_resource_start(saadev->pci, 0); | ||
961 | |||
962 | err = request_irq(saadev->pci->irq, saa7134_alsa_irq, | ||
963 | SA_SHIRQ | SA_INTERRUPT, saadev->name, saadev); | ||
964 | |||
965 | if (err < 0) { | ||
966 | printk(KERN_ERR "%s: can't get IRQ %d for ALSA\n", | ||
967 | saadev->name, saadev->pci->irq); | ||
968 | goto __nodev; | ||
969 | } | ||
970 | |||
971 | if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) { | ||
972 | goto __nodev; | ||
973 | } | ||
974 | |||
975 | if ((err = snd_card_saa7134_new_mixer(chip)) < 0) | ||
976 | goto __nodev; | ||
977 | |||
978 | if ((err = snd_card_saa7134_pcm(chip, 0)) < 0) | ||
979 | goto __nodev; | ||
980 | |||
981 | snd_card_set_dev(card, &chip->pci->dev); | ||
982 | |||
983 | /* End of "creation" */ | ||
984 | |||
985 | strcpy(card->shortname, "SAA7134"); | ||
986 | sprintf(card->longname, "%s at 0x%lx irq %d", | ||
987 | chip->saadev->name, chip->iobase, chip->irq); | ||
988 | |||
989 | if ((err = snd_card_register(card)) == 0) { | ||
990 | snd_saa7134_cards[dev] = card; | ||
991 | return 0; | ||
992 | } | ||
993 | |||
994 | __nodev: | ||
995 | snd_card_free(card); | ||
996 | kfree(chip); | ||
997 | return err; | ||
998 | } | ||
999 | |||
1000 | /* | ||
1001 | * Module initializer | ||
1002 | * | ||
1003 | * Loops through present saa7134 cards, and assigns an ALSA device | ||
1004 | * to each one | ||
1005 | * | ||
1006 | */ | ||
1007 | |||
1008 | static int saa7134_alsa_init(void) | ||
1009 | { | ||
1010 | struct saa7134_dev *saadev = NULL; | ||
1011 | struct list_head *list; | ||
1012 | |||
1013 | printk(KERN_INFO "saa7134 ALSA driver for DMA sound loaded\n"); | ||
1014 | |||
1015 | list_for_each(list,&saa7134_devlist) { | ||
1016 | saadev = list_entry(list, struct saa7134_dev, devlist); | ||
1017 | alsa_card_saa7134_create(saadev); | ||
1018 | } | ||
1019 | |||
1020 | if (saadev == NULL) | ||
1021 | printk(KERN_INFO "saa7134 ALSA: no saa7134 cards found\n"); | ||
1022 | |||
1023 | return 0; | ||
1024 | |||
1025 | } | ||
1026 | |||
1027 | /* | ||
1028 | * Module destructor | ||
1029 | */ | ||
1030 | |||
1031 | void saa7134_alsa_exit(void) | ||
1032 | { | ||
1033 | int idx; | ||
1034 | |||
1035 | for (idx = 0; idx < SNDRV_CARDS; idx++) { | ||
1036 | snd_card_free(snd_saa7134_cards[idx]); | ||
1037 | } | ||
1038 | |||
1039 | printk(KERN_INFO "saa7134 ALSA driver for DMA sound unloaded\n"); | ||
1040 | |||
1041 | return; | ||
1042 | } | ||
1043 | |||
1044 | module_init(saa7134_alsa_init); | ||
1045 | module_exit(saa7134_alsa_exit); | ||
1046 | MODULE_LICENSE("GPL"); | ||
1047 | MODULE_AUTHOR("Ricardo Cerqueira"); | ||
diff --git a/drivers/media/video/saa7134/saa7134-cards.c b/drivers/media/video/saa7134/saa7134-cards.c index acc7a4335e23..663d03e5bc67 100644 --- a/drivers/media/video/saa7134/saa7134-cards.c +++ b/drivers/media/video/saa7134/saa7134-cards.c | |||
@@ -191,10 +191,14 @@ struct saa7134_board saa7134_boards[] = { | |||
191 | .amux = TV, | 191 | .amux = TV, |
192 | .tv = 1, | 192 | .tv = 1, |
193 | },{ | 193 | },{ |
194 | .name = name_comp1, | 194 | .name = name_comp1, /* Composite signal on S-Video input */ |
195 | .vmux = 0, | 195 | .vmux = 0, |
196 | .amux = LINE2, | 196 | .amux = LINE2, |
197 | },{ | 197 | },{ |
198 | .name = name_comp2, /* Composite input */ | ||
199 | .vmux = 3, | ||
200 | .amux = LINE2, | ||
201 | },{ | ||
198 | .name = name_svideo, | 202 | .name = name_svideo, |
199 | .vmux = 8, | 203 | .vmux = 8, |
200 | .amux = LINE2, | 204 | .amux = LINE2, |
@@ -2109,8 +2113,423 @@ struct saa7134_board saa7134_boards[] = { | |||
2109 | .gpio = 0x01, | 2113 | .gpio = 0x01, |
2110 | }, | 2114 | }, |
2111 | }, | 2115 | }, |
2112 | }; | 2116 | [SAA7134_BOARD_BEHOLD_409FM] = { |
2117 | /* <http://tuner.beholder.ru>, Sergey <skiv@orel.ru> */ | ||
2118 | .name = "Beholder BeholdTV 409 FM", | ||
2119 | .audio_clock = 0x00187de7, | ||
2120 | .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, | ||
2121 | .radio_type = UNSET, | ||
2122 | .tuner_addr = ADDR_UNSET, | ||
2123 | .radio_addr = ADDR_UNSET, | ||
2124 | .tda9887_conf = TDA9887_PRESENT, | ||
2125 | .inputs = {{ | ||
2126 | .name = name_tv, | ||
2127 | .vmux = 3, | ||
2128 | .amux = TV, | ||
2129 | .tv = 1, | ||
2130 | },{ | ||
2131 | .name = name_comp1, | ||
2132 | .vmux = 1, | ||
2133 | .amux = LINE1, | ||
2134 | },{ | ||
2135 | .name = name_svideo, | ||
2136 | .vmux = 8, | ||
2137 | .amux = LINE1, | ||
2138 | }}, | ||
2139 | .radio = { | ||
2140 | .name = name_radio, | ||
2141 | .amux = LINE2, | ||
2142 | }, | ||
2143 | }, | ||
2144 | [SAA7134_BOARD_GOTVIEW_7135] = { | ||
2145 | /* Mike Baikov <mike@baikov.com> */ | ||
2146 | /* Andrey Cvetcov <ays14@yandex.ru> */ | ||
2147 | .name = "GoTView 7135 PCI", | ||
2148 | .audio_clock = 0x00187de7, | ||
2149 | .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, | ||
2150 | .radio_type = UNSET, | ||
2151 | .tuner_addr = ADDR_UNSET, | ||
2152 | .radio_addr = ADDR_UNSET, | ||
2153 | .tda9887_conf = TDA9887_PRESENT, | ||
2154 | .gpiomask = 0x00200003, | ||
2155 | .inputs = {{ | ||
2156 | .name = name_tv, | ||
2157 | .vmux = 1, | ||
2158 | .amux = TV, | ||
2159 | .tv = 1, | ||
2160 | .gpio = 0x00200003, | ||
2161 | },{ | ||
2162 | .name = name_tv_mono, | ||
2163 | .vmux = 1, | ||
2164 | .amux = LINE2, | ||
2165 | .gpio = 0x00200003, | ||
2166 | },{ | ||
2167 | .name = name_comp1, | ||
2168 | .vmux = 3, | ||
2169 | .amux = LINE1, | ||
2170 | .gpio = 0x00200003, | ||
2171 | },{ | ||
2172 | .name = name_svideo, | ||
2173 | .vmux = 8, | ||
2174 | .amux = LINE1, | ||
2175 | .gpio = 0x00200003, | ||
2176 | }}, | ||
2177 | .radio = { | ||
2178 | .name = name_radio, | ||
2179 | .amux = LINE2, | ||
2180 | .gpio = 0x00200003, | ||
2181 | }, | ||
2182 | .mute = { | ||
2183 | .name = name_mute, | ||
2184 | .amux = TV, | ||
2185 | .gpio = 0x00200003, | ||
2186 | }, | ||
2187 | }, | ||
2188 | [SAA7134_BOARD_PHILIPS_EUROPA] = { | ||
2189 | .name = "Philips EUROPA V3 reference design", | ||
2190 | .audio_clock = 0x00187de7, | ||
2191 | .tuner_type = TUNER_PHILIPS_TD1316, | ||
2192 | .radio_type = UNSET, | ||
2193 | .tuner_addr = 0x61, | ||
2194 | .radio_addr = ADDR_UNSET, | ||
2195 | .tda9887_conf = TDA9887_PRESENT, | ||
2196 | .mpeg = SAA7134_MPEG_DVB, | ||
2197 | .inputs = {{ | ||
2198 | .name = name_tv, | ||
2199 | .vmux = 3, | ||
2200 | .amux = TV, | ||
2201 | .tv = 1, | ||
2202 | },{ | ||
2203 | .name = name_comp1, | ||
2204 | .vmux = 0, | ||
2205 | .amux = LINE2, | ||
2206 | },{ | ||
2207 | .name = name_svideo, | ||
2208 | .vmux = 8, | ||
2209 | .amux = LINE2, | ||
2210 | }}, | ||
2211 | }, | ||
2212 | [SAA7134_BOARD_VIDEOMATE_DVBT_300] = { | ||
2213 | .name = "Compro Videomate DVB-T300", | ||
2214 | .audio_clock = 0x00187de7, | ||
2215 | .tuner_type = TUNER_PHILIPS_TD1316, | ||
2216 | .radio_type = UNSET, | ||
2217 | .tuner_addr = 0x61, | ||
2218 | .radio_addr = ADDR_UNSET, | ||
2219 | .tda9887_conf = TDA9887_PRESENT, | ||
2220 | .mpeg = SAA7134_MPEG_DVB, | ||
2221 | .inputs = {{ | ||
2222 | .name = name_tv, | ||
2223 | .vmux = 3, | ||
2224 | .amux = TV, | ||
2225 | .tv = 1, | ||
2226 | },{ | ||
2227 | .name = name_comp1, | ||
2228 | .vmux = 1, | ||
2229 | .amux = LINE2, | ||
2230 | },{ | ||
2231 | .name = name_svideo, | ||
2232 | .vmux = 8, | ||
2233 | .amux = LINE2, | ||
2234 | }}, | ||
2235 | }, | ||
2236 | [SAA7134_BOARD_VIDEOMATE_DVBT_200] = { | ||
2237 | .name = "Compro Videomate DVB-T200", | ||
2238 | .tuner_type = TUNER_ABSENT, | ||
2239 | .audio_clock = 0x00187de7, | ||
2240 | .radio_type = UNSET, | ||
2241 | .tuner_addr = ADDR_UNSET, | ||
2242 | .radio_addr = ADDR_UNSET, | ||
2243 | .mpeg = SAA7134_MPEG_DVB, | ||
2244 | .inputs = {{ | ||
2245 | .name = name_comp1, | ||
2246 | .vmux = 0, | ||
2247 | .amux = LINE1, | ||
2248 | },{ | ||
2249 | .name = name_svideo, | ||
2250 | .vmux = 8, | ||
2251 | .amux = LINE1, | ||
2252 | }}, | ||
2253 | }, | ||
2254 | [SAA7134_BOARD_RTD_VFG7350] = { | ||
2255 | .name = "RTD Embedded Technologies VFG7350", | ||
2256 | .audio_clock = 0x00200000, | ||
2257 | .tuner_type = TUNER_ABSENT, | ||
2258 | .radio_type = UNSET, | ||
2259 | .tuner_addr = ADDR_UNSET, | ||
2260 | .radio_addr = ADDR_UNSET, | ||
2261 | .inputs = {{ | ||
2262 | .name = "Composite 0", | ||
2263 | .vmux = 0, | ||
2264 | .amux = LINE1, | ||
2265 | },{ | ||
2266 | .name = "Composite 1", | ||
2267 | .vmux = 1, | ||
2268 | .amux = LINE2, | ||
2269 | },{ | ||
2270 | .name = "Composite 2", | ||
2271 | .vmux = 2, | ||
2272 | .amux = LINE1, | ||
2273 | },{ | ||
2274 | .name = "Composite 3", | ||
2275 | .vmux = 3, | ||
2276 | .amux = LINE2, | ||
2277 | },{ | ||
2278 | .name = "S-Video 0", | ||
2279 | .vmux = 8, | ||
2280 | .amux = LINE1, | ||
2281 | },{ | ||
2282 | .name = "S-Video 1", | ||
2283 | .vmux = 9, | ||
2284 | .amux = LINE2, | ||
2285 | }}, | ||
2286 | .mpeg = SAA7134_MPEG_EMPRESS, | ||
2287 | .video_out = CCIR656, | ||
2288 | .vid_port_opts = ( SET_T_CODE_POLARITY_NON_INVERTED | | ||
2289 | SET_CLOCK_NOT_DELAYED | | ||
2290 | SET_CLOCK_INVERTED | | ||
2291 | SET_VSYNC_OFF ), | ||
2292 | }, | ||
2293 | [SAA7134_BOARD_RTD_VFG7330] = { | ||
2294 | .name = "RTD Embedded Technologies VFG7330", | ||
2295 | .audio_clock = 0x00200000, | ||
2296 | .tuner_type = TUNER_ABSENT, | ||
2297 | .radio_type = UNSET, | ||
2298 | .tuner_addr = ADDR_UNSET, | ||
2299 | .radio_addr = ADDR_UNSET, | ||
2300 | .inputs = {{ | ||
2301 | .name = "Composite 0", | ||
2302 | .vmux = 0, | ||
2303 | .amux = LINE1, | ||
2304 | },{ | ||
2305 | .name = "Composite 1", | ||
2306 | .vmux = 1, | ||
2307 | .amux = LINE2, | ||
2308 | },{ | ||
2309 | .name = "Composite 2", | ||
2310 | .vmux = 2, | ||
2311 | .amux = LINE1, | ||
2312 | },{ | ||
2313 | .name = "Composite 3", | ||
2314 | .vmux = 3, | ||
2315 | .amux = LINE2, | ||
2316 | },{ | ||
2317 | .name = "S-Video 0", | ||
2318 | .vmux = 8, | ||
2319 | .amux = LINE1, | ||
2320 | },{ | ||
2321 | .name = "S-Video 1", | ||
2322 | .vmux = 9, | ||
2323 | .amux = LINE2, | ||
2324 | }}, | ||
2325 | }, | ||
2326 | [SAA7134_BOARD_FLYTVPLATINUM_MINI2] = { | ||
2327 | .name = "LifeView FlyTV Platinum Mini2", | ||
2328 | .audio_clock = 0x00200000, | ||
2329 | .tuner_type = TUNER_PHILIPS_TDA8290, | ||
2330 | .radio_type = UNSET, | ||
2331 | .tuner_addr = ADDR_UNSET, | ||
2332 | .radio_addr = ADDR_UNSET, | ||
2113 | 2333 | ||
2334 | .inputs = {{ | ||
2335 | .name = name_tv, | ||
2336 | .vmux = 1, | ||
2337 | .amux = TV, | ||
2338 | .tv = 1, | ||
2339 | },{ | ||
2340 | .name = name_comp1, /* Composite signal on S-Video input */ | ||
2341 | .vmux = 0, | ||
2342 | .amux = LINE2, | ||
2343 | },{ | ||
2344 | .name = name_comp2, /* Composite input */ | ||
2345 | .vmux = 3, | ||
2346 | .amux = LINE2, | ||
2347 | },{ | ||
2348 | .name = name_svideo, | ||
2349 | .vmux = 8, | ||
2350 | .amux = LINE2, | ||
2351 | }}, | ||
2352 | }, | ||
2353 | [SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180] = { | ||
2354 | /* Michael Krufky <mkrufky@m1k.net> | ||
2355 | * Uses Alps Electric TDHU2, containing NXT2004 ATSC Decoder | ||
2356 | * AFAIK, there is no analog demod, thus, | ||
2357 | * no support for analog television. | ||
2358 | */ | ||
2359 | .name = "AVerMedia AVerTVHD MCE A180", | ||
2360 | .audio_clock = 0x00187de7, | ||
2361 | .tuner_type = TUNER_ABSENT, | ||
2362 | .radio_type = UNSET, | ||
2363 | .tuner_addr = ADDR_UNSET, | ||
2364 | .radio_addr = ADDR_UNSET, | ||
2365 | .mpeg = SAA7134_MPEG_DVB, | ||
2366 | .inputs = {{ | ||
2367 | .name = name_comp1, | ||
2368 | .vmux = 3, | ||
2369 | .amux = LINE2, | ||
2370 | },{ | ||
2371 | .name = name_svideo, | ||
2372 | .vmux = 8, | ||
2373 | .amux = LINE2, | ||
2374 | }}, | ||
2375 | }, | ||
2376 | [SAA7134_BOARD_MONSTERTV_MOBILE] = { | ||
2377 | .name = "SKNet MonsterTV Mobile", | ||
2378 | .audio_clock = 0x00187de7, | ||
2379 | .tuner_type = TUNER_PHILIPS_TDA8290, | ||
2380 | .radio_type = UNSET, | ||
2381 | .tuner_addr = ADDR_UNSET, | ||
2382 | .radio_addr = ADDR_UNSET, | ||
2383 | |||
2384 | .inputs = {{ | ||
2385 | .name = name_tv, | ||
2386 | .vmux = 1, | ||
2387 | .amux = TV, | ||
2388 | .tv = 1, | ||
2389 | },{ | ||
2390 | .name = name_comp1, | ||
2391 | .vmux = 3, | ||
2392 | .amux = LINE1, | ||
2393 | },{ | ||
2394 | .name = name_svideo, | ||
2395 | .vmux = 6, | ||
2396 | .amux = LINE1, | ||
2397 | }}, | ||
2398 | }, | ||
2399 | [SAA7134_BOARD_PINNACLE_PCTV_110i] = { | ||
2400 | .name = "Pinnacle PCTV 110i (saa7133)", | ||
2401 | .audio_clock = 0x00187de7, | ||
2402 | .tuner_type = TUNER_PHILIPS_TDA8290, | ||
2403 | .radio_type = UNSET, | ||
2404 | .tuner_addr = ADDR_UNSET, | ||
2405 | .radio_addr = ADDR_UNSET, | ||
2406 | .gpiomask = 0x080200000, | ||
2407 | .inputs = {{ | ||
2408 | .name = name_tv, | ||
2409 | .vmux = 4, | ||
2410 | .amux = TV, | ||
2411 | .tv = 1, | ||
2412 | },{ | ||
2413 | .name = name_comp1, | ||
2414 | .vmux = 1, | ||
2415 | .amux = LINE2, | ||
2416 | },{ | ||
2417 | .name = name_svideo, | ||
2418 | .vmux = 8, | ||
2419 | .amux = LINE2, | ||
2420 | }}, | ||
2421 | .radio = { | ||
2422 | .name = name_radio, | ||
2423 | .amux = LINE1, | ||
2424 | }, | ||
2425 | }, | ||
2426 | [SAA7134_BOARD_ASUSTeK_P7131_DUAL] = { | ||
2427 | .name = "ASUSTeK P7131 Dual", | ||
2428 | .audio_clock = 0x00187de7, | ||
2429 | .tuner_type = TUNER_PHILIPS_TDA8290, | ||
2430 | .radio_type = UNSET, | ||
2431 | .tuner_addr = ADDR_UNSET, | ||
2432 | .radio_addr = ADDR_UNSET, | ||
2433 | .gpiomask = 1 << 21, | ||
2434 | .mpeg = SAA7134_MPEG_DVB, | ||
2435 | .inputs = {{ | ||
2436 | .name = name_tv, | ||
2437 | .vmux = 1, | ||
2438 | .amux = TV, | ||
2439 | .tv = 1, | ||
2440 | },{ | ||
2441 | .name = name_comp1, | ||
2442 | .vmux = 3, | ||
2443 | .amux = LINE2, | ||
2444 | },{ | ||
2445 | .name = name_svideo, | ||
2446 | .vmux = 8, | ||
2447 | .amux = LINE2, | ||
2448 | }}, | ||
2449 | .radio = { | ||
2450 | .name = name_radio, | ||
2451 | .amux = TV, | ||
2452 | .gpio = 0x0200000, | ||
2453 | }, | ||
2454 | }, | ||
2455 | [SAA7134_BOARD_SEDNA_PC_TV_CARDBUS] = { | ||
2456 | /* Paul Tom Zalac <pzalac@gmail.com> */ | ||
2457 | /* Pavel Mihaylov <bin@bash.info> */ | ||
2458 | .name = "Sedna/MuchTV PC TV Cardbus TV/Radio (ITO25 Rev:2B)", | ||
2459 | /* Sedna/MuchTV (OEM) Cardbus TV Tuner */ | ||
2460 | .audio_clock = 0x00187de7, | ||
2461 | .tuner_type = TUNER_PHILIPS_TDA8290, | ||
2462 | .radio_type = UNSET, | ||
2463 | .tuner_addr = ADDR_UNSET, | ||
2464 | .radio_addr = ADDR_UNSET, | ||
2465 | .gpiomask = 0xe880c0, | ||
2466 | .inputs = {{ | ||
2467 | .name = name_tv, | ||
2468 | .vmux = 3, | ||
2469 | .amux = TV, | ||
2470 | .tv = 1, | ||
2471 | },{ | ||
2472 | .name = name_comp1, | ||
2473 | .vmux = 1, | ||
2474 | .amux = LINE1, | ||
2475 | },{ | ||
2476 | .name = name_svideo, | ||
2477 | .vmux = 6, | ||
2478 | .amux = LINE1, | ||
2479 | }}, | ||
2480 | .radio = { | ||
2481 | .name = name_radio, | ||
2482 | .amux = LINE2, | ||
2483 | }, | ||
2484 | }, | ||
2485 | [SAA7134_BOARD_ASUSTEK_DIGIMATRIX_TV] = { | ||
2486 | /* "Cyril Lacoux (Yack)" <clacoux@ifeelgood.org> */ | ||
2487 | .name = "ASUS Digimatrix TV", | ||
2488 | .audio_clock = 0x00200000, | ||
2489 | .tuner_type = TUNER_PHILIPS_FQ1216ME, | ||
2490 | .tda9887_conf = TDA9887_PRESENT, | ||
2491 | .radio_type = UNSET, | ||
2492 | .tuner_addr = ADDR_UNSET, | ||
2493 | .radio_addr = ADDR_UNSET, | ||
2494 | .inputs = {{ | ||
2495 | .name = name_tv, | ||
2496 | .vmux = 1, | ||
2497 | .amux = TV, | ||
2498 | .tv = 1, | ||
2499 | },{ | ||
2500 | .name = name_comp1, | ||
2501 | .vmux = 3, | ||
2502 | .amux = LINE1, | ||
2503 | },{ | ||
2504 | .name = name_svideo, | ||
2505 | .vmux = 8, | ||
2506 | .amux = LINE1, | ||
2507 | }}, | ||
2508 | }, | ||
2509 | [SAA7134_BOARD_PHILIPS_TIGER] = { | ||
2510 | .name = "Philips Tiger reference design", | ||
2511 | .audio_clock = 0x00187de7, | ||
2512 | .tuner_type = TUNER_PHILIPS_TDA8290, | ||
2513 | .radio_type = UNSET, | ||
2514 | .tuner_addr = ADDR_UNSET, | ||
2515 | .radio_addr = ADDR_UNSET, | ||
2516 | .mpeg = SAA7134_MPEG_DVB, | ||
2517 | .inputs = {{ | ||
2518 | .name = name_tv, | ||
2519 | .vmux = 1, | ||
2520 | .amux = TV, | ||
2521 | .tv = 1, | ||
2522 | },{ | ||
2523 | .name = name_comp1, | ||
2524 | .vmux = 3, | ||
2525 | .amux = LINE1, | ||
2526 | },{ | ||
2527 | .name = name_svideo, | ||
2528 | .vmux = 8, | ||
2529 | .amux = LINE1, | ||
2530 | }}, | ||
2531 | }, | ||
2532 | }; | ||
2114 | 2533 | ||
2115 | const unsigned int saa7134_bcount = ARRAY_SIZE(saa7134_boards); | 2534 | const unsigned int saa7134_bcount = ARRAY_SIZE(saa7134_boards); |
2116 | 2535 | ||
@@ -2145,19 +2564,19 @@ struct pci_device_id saa7134_pci_tbl[] = { | |||
2145 | },{ | 2564 | },{ |
2146 | .vendor = PCI_VENDOR_ID_PHILIPS, | 2565 | .vendor = PCI_VENDOR_ID_PHILIPS, |
2147 | .device = PCI_DEVICE_ID_PHILIPS_SAA7134, | 2566 | .device = PCI_DEVICE_ID_PHILIPS_SAA7134, |
2148 | .subvendor = 0x153B, | 2567 | .subvendor = 0x153b, |
2149 | .subdevice = 0x1142, | 2568 | .subdevice = 0x1142, |
2150 | .driver_data = SAA7134_BOARD_CINERGY400, | 2569 | .driver_data = SAA7134_BOARD_CINERGY400, |
2151 | },{ | 2570 | },{ |
2152 | .vendor = PCI_VENDOR_ID_PHILIPS, | 2571 | .vendor = PCI_VENDOR_ID_PHILIPS, |
2153 | .device = PCI_DEVICE_ID_PHILIPS_SAA7134, | 2572 | .device = PCI_DEVICE_ID_PHILIPS_SAA7134, |
2154 | .subvendor = 0x153B, | 2573 | .subvendor = 0x153b, |
2155 | .subdevice = 0x1143, | 2574 | .subdevice = 0x1143, |
2156 | .driver_data = SAA7134_BOARD_CINERGY600, | 2575 | .driver_data = SAA7134_BOARD_CINERGY600, |
2157 | },{ | 2576 | },{ |
2158 | .vendor = PCI_VENDOR_ID_PHILIPS, | 2577 | .vendor = PCI_VENDOR_ID_PHILIPS, |
2159 | .device = PCI_DEVICE_ID_PHILIPS_SAA7134, | 2578 | .device = PCI_DEVICE_ID_PHILIPS_SAA7134, |
2160 | .subvendor = 0x153B, | 2579 | .subvendor = 0x153b, |
2161 | .subdevice = 0x1158, | 2580 | .subdevice = 0x1158, |
2162 | .driver_data = SAA7134_BOARD_CINERGY600_MK3, | 2581 | .driver_data = SAA7134_BOARD_CINERGY600_MK3, |
2163 | },{ | 2582 | },{ |
@@ -2193,6 +2612,18 @@ struct pci_device_id saa7134_pci_tbl[] = { | |||
2193 | },{ | 2612 | },{ |
2194 | .vendor = PCI_VENDOR_ID_PHILIPS, | 2613 | .vendor = PCI_VENDOR_ID_PHILIPS, |
2195 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, | 2614 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, |
2615 | .subvendor = 0x14c0, | ||
2616 | .subdevice = 0x1212, /* minipci, LR1212 */ | ||
2617 | .driver_data = SAA7134_BOARD_FLYTVPLATINUM_MINI2, | ||
2618 | },{ | ||
2619 | .vendor = PCI_VENDOR_ID_PHILIPS, | ||
2620 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, | ||
2621 | .subvendor = 0x4e42, | ||
2622 | .subdevice = 0x0212, /* OEM minipci, LR212 */ | ||
2623 | .driver_data = SAA7134_BOARD_FLYTVPLATINUM_MINI, | ||
2624 | },{ | ||
2625 | .vendor = PCI_VENDOR_ID_PHILIPS, | ||
2626 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, | ||
2196 | .subvendor = 0x5168, /* Animation Technologies (LifeView) */ | 2627 | .subvendor = 0x5168, /* Animation Technologies (LifeView) */ |
2197 | .subdevice = 0x0214, /* Standard PCI, LR214WF */ | 2628 | .subdevice = 0x0214, /* Standard PCI, LR214WF */ |
2198 | .driver_data = SAA7134_BOARD_FLYTVPLATINUM_FM, | 2629 | .driver_data = SAA7134_BOARD_FLYTVPLATINUM_FM, |
@@ -2369,7 +2800,7 @@ struct pci_device_id saa7134_pci_tbl[] = { | |||
2369 | },{ | 2800 | },{ |
2370 | .vendor = PCI_VENDOR_ID_PHILIPS, | 2801 | .vendor = PCI_VENDOR_ID_PHILIPS, |
2371 | .device = PCI_DEVICE_ID_PHILIPS_SAA7130, | 2802 | .device = PCI_DEVICE_ID_PHILIPS_SAA7130, |
2372 | .subvendor = 0x153B, | 2803 | .subvendor = 0x153b, |
2373 | .subdevice = 0x1152, | 2804 | .subdevice = 0x1152, |
2374 | .driver_data = SAA7134_BOARD_CINERGY200, | 2805 | .driver_data = SAA7134_BOARD_CINERGY200, |
2375 | },{ | 2806 | },{ |
@@ -2434,13 +2865,18 @@ struct pci_device_id saa7134_pci_tbl[] = { | |||
2434 | .subvendor = 0x1421, | 2865 | .subvendor = 0x1421, |
2435 | .subdevice = 0x0350, /* PCI version */ | 2866 | .subdevice = 0x0350, /* PCI version */ |
2436 | .driver_data = SAA7134_BOARD_ADS_INSTANT_TV, | 2867 | .driver_data = SAA7134_BOARD_ADS_INSTANT_TV, |
2437 | |||
2438 | },{ | 2868 | },{ |
2439 | .vendor = PCI_VENDOR_ID_PHILIPS, | 2869 | .vendor = PCI_VENDOR_ID_PHILIPS, |
2440 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, | 2870 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, |
2441 | .subvendor = 0x1421, | 2871 | .subvendor = 0x1421, |
2442 | .subdevice = 0x0370, /* cardbus version */ | 2872 | .subdevice = 0x0370, /* cardbus version */ |
2443 | .driver_data = SAA7134_BOARD_ADS_INSTANT_TV, | 2873 | .driver_data = SAA7134_BOARD_ADS_INSTANT_TV, |
2874 | },{ | ||
2875 | .vendor = PCI_VENDOR_ID_PHILIPS, | ||
2876 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, | ||
2877 | .subvendor = 0x1421, | ||
2878 | .subdevice = 0x1370, /* cardbus version */ | ||
2879 | .driver_data = SAA7134_BOARD_ADS_INSTANT_TV, | ||
2444 | 2880 | ||
2445 | },{ /* Typhoon DVB-T Duo Digital/Analog Cardbus */ | 2881 | },{ /* Typhoon DVB-T Duo Digital/Analog Cardbus */ |
2446 | .vendor = PCI_VENDOR_ID_PHILIPS, | 2882 | .vendor = PCI_VENDOR_ID_PHILIPS, |
@@ -2459,9 +2895,81 @@ struct pci_device_id saa7134_pci_tbl[] = { | |||
2459 | .device = PCI_DEVICE_ID_PHILIPS_SAA7134, | 2895 | .device = PCI_DEVICE_ID_PHILIPS_SAA7134, |
2460 | .subvendor = 0x1043, | 2896 | .subvendor = 0x1043, |
2461 | .subdevice = 0x0210, /* mini pci PAL/SECAM version */ | 2897 | .subdevice = 0x0210, /* mini pci PAL/SECAM version */ |
2462 | .driver_data = SAA7134_BOARD_FLYTV_DIGIMATRIX, | 2898 | .driver_data = SAA7134_BOARD_ASUSTEK_DIGIMATRIX_TV, |
2463 | 2899 | ||
2464 | },{ | 2900 | },{ |
2901 | .vendor = PCI_VENDOR_ID_PHILIPS, | ||
2902 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, | ||
2903 | .subvendor = 0x0000, /* It shouldn't break anything, since subdevice id seems unique */ | ||
2904 | .subdevice = 0x4091, | ||
2905 | .driver_data = SAA7134_BOARD_BEHOLD_409FM, | ||
2906 | },{ | ||
2907 | .vendor = PCI_VENDOR_ID_PHILIPS, | ||
2908 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, | ||
2909 | .subvendor = 0x5456, /* GoTView */ | ||
2910 | .subdevice = 0x7135, | ||
2911 | .driver_data = SAA7134_BOARD_GOTVIEW_7135, | ||
2912 | },{ | ||
2913 | .vendor = PCI_VENDOR_ID_PHILIPS, | ||
2914 | .device = PCI_DEVICE_ID_PHILIPS_SAA7134, | ||
2915 | .subvendor = PCI_VENDOR_ID_PHILIPS, | ||
2916 | .subdevice = 0x2004, | ||
2917 | .driver_data = SAA7134_BOARD_PHILIPS_EUROPA, | ||
2918 | },{ | ||
2919 | .vendor = PCI_VENDOR_ID_PHILIPS, | ||
2920 | .device = PCI_DEVICE_ID_PHILIPS_SAA7134, | ||
2921 | .subvendor = 0x185b, | ||
2922 | .subdevice = 0xc900, | ||
2923 | .driver_data = SAA7134_BOARD_VIDEOMATE_DVBT_300, | ||
2924 | },{ | ||
2925 | .vendor = PCI_VENDOR_ID_PHILIPS, | ||
2926 | .device = PCI_DEVICE_ID_PHILIPS_SAA7130, | ||
2927 | .subvendor = 0x185b, | ||
2928 | .subdevice = 0xc901, | ||
2929 | .driver_data = SAA7134_BOARD_VIDEOMATE_DVBT_200, | ||
2930 | },{ | ||
2931 | .vendor = PCI_VENDOR_ID_PHILIPS, | ||
2932 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, | ||
2933 | .subvendor = 0x1435, | ||
2934 | .subdevice = 0x7350, | ||
2935 | .driver_data = SAA7134_BOARD_RTD_VFG7350, | ||
2936 | },{ | ||
2937 | .vendor = PCI_VENDOR_ID_PHILIPS, | ||
2938 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, | ||
2939 | .subvendor = 0x1435, | ||
2940 | .subdevice = 0x7330, | ||
2941 | .driver_data = SAA7134_BOARD_RTD_VFG7330, | ||
2942 | },{ | ||
2943 | .vendor = PCI_VENDOR_ID_PHILIPS, | ||
2944 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, | ||
2945 | .subvendor = 0x1461, | ||
2946 | .subdevice = 0x1044, | ||
2947 | .driver_data = SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180, | ||
2948 | },{ | ||
2949 | .vendor = PCI_VENDOR_ID_PHILIPS, | ||
2950 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, | ||
2951 | .subvendor = 0x1131, | ||
2952 | .subdevice = 0x4ee9, | ||
2953 | .driver_data = SAA7134_BOARD_MONSTERTV_MOBILE, | ||
2954 | },{ | ||
2955 | .vendor = PCI_VENDOR_ID_PHILIPS, | ||
2956 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, | ||
2957 | .subvendor = 0x11bd, | ||
2958 | .subdevice = 0x002e, | ||
2959 | .driver_data = SAA7134_BOARD_PINNACLE_PCTV_110i, | ||
2960 | },{ | ||
2961 | .vendor = PCI_VENDOR_ID_PHILIPS, | ||
2962 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, | ||
2963 | .subvendor = 0x1043, | ||
2964 | .subdevice = 0x4862, | ||
2965 | .driver_data = SAA7134_BOARD_ASUSTeK_P7131_DUAL, | ||
2966 | },{ | ||
2967 | .vendor = PCI_VENDOR_ID_PHILIPS, | ||
2968 | .device = PCI_DEVICE_ID_PHILIPS_SAA7133, | ||
2969 | .subvendor = PCI_VENDOR_ID_PHILIPS, | ||
2970 | .subdevice = 0x2018, | ||
2971 | .driver_data = SAA7134_BOARD_PHILIPS_TIGER, | ||
2972 | },{ | ||
2465 | /* --- boards without eeprom + subsystem ID --- */ | 2973 | /* --- boards without eeprom + subsystem ID --- */ |
2466 | .vendor = PCI_VENDOR_ID_PHILIPS, | 2974 | .vendor = PCI_VENDOR_ID_PHILIPS, |
2467 | .device = PCI_DEVICE_ID_PHILIPS_SAA7134, | 2975 | .device = PCI_DEVICE_ID_PHILIPS_SAA7134, |
@@ -2530,9 +3038,10 @@ int saa7134_board_init1(struct saa7134_dev *dev) | |||
2530 | switch (dev->board) { | 3038 | switch (dev->board) { |
2531 | case SAA7134_BOARD_FLYVIDEO2000: | 3039 | case SAA7134_BOARD_FLYVIDEO2000: |
2532 | case SAA7134_BOARD_FLYVIDEO3000: | 3040 | case SAA7134_BOARD_FLYVIDEO3000: |
2533 | dev->has_remote = 1; | 3041 | dev->has_remote = SAA7134_REMOTE_GPIO; |
2534 | board_flyvideo(dev); | 3042 | board_flyvideo(dev); |
2535 | break; | 3043 | break; |
3044 | case SAA7134_BOARD_FLYTVPLATINUM_MINI2: | ||
2536 | case SAA7134_BOARD_FLYTVPLATINUM_FM: | 3045 | case SAA7134_BOARD_FLYTVPLATINUM_FM: |
2537 | case SAA7134_BOARD_CINERGY400: | 3046 | case SAA7134_BOARD_CINERGY400: |
2538 | case SAA7134_BOARD_CINERGY600: | 3047 | case SAA7134_BOARD_CINERGY600: |
@@ -2550,10 +3059,16 @@ int saa7134_board_init1(struct saa7134_dev *dev) | |||
2550 | /* case SAA7134_BOARD_SABRENT_SBTTVFM: */ /* not finished yet */ | 3059 | /* case SAA7134_BOARD_SABRENT_SBTTVFM: */ /* not finished yet */ |
2551 | case SAA7134_BOARD_VIDEOMATE_TV_PVR: | 3060 | case SAA7134_BOARD_VIDEOMATE_TV_PVR: |
2552 | case SAA7134_BOARD_VIDEOMATE_TV_GOLD_PLUSII: | 3061 | case SAA7134_BOARD_VIDEOMATE_TV_GOLD_PLUSII: |
3062 | case SAA7134_BOARD_VIDEOMATE_DVBT_300: | ||
3063 | case SAA7134_BOARD_VIDEOMATE_DVBT_200: | ||
2553 | case SAA7134_BOARD_MANLI_MTV001: | 3064 | case SAA7134_BOARD_MANLI_MTV001: |
2554 | case SAA7134_BOARD_MANLI_MTV002: | 3065 | case SAA7134_BOARD_MANLI_MTV002: |
3066 | case SAA7134_BOARD_BEHOLD_409FM: | ||
2555 | case SAA7134_BOARD_AVACSSMARTTV: | 3067 | case SAA7134_BOARD_AVACSSMARTTV: |
2556 | dev->has_remote = 1; | 3068 | case SAA7134_BOARD_GOTVIEW_7135: |
3069 | case SAA7134_BOARD_KWORLD_TERMINATOR: | ||
3070 | case SAA7134_BOARD_SEDNA_PC_TV_CARDBUS: | ||
3071 | dev->has_remote = SAA7134_REMOTE_GPIO; | ||
2557 | break; | 3072 | break; |
2558 | case SAA7134_BOARD_MD5044: | 3073 | case SAA7134_BOARD_MD5044: |
2559 | printk("%s: seems there are two different versions of the MD5044\n" | 3074 | printk("%s: seems there are two different versions of the MD5044\n" |
@@ -2565,11 +3080,14 @@ int saa7134_board_init1(struct saa7134_dev *dev) | |||
2565 | /* power-up tuner chip */ | 3080 | /* power-up tuner chip */ |
2566 | saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x00040000, 0x00040000); | 3081 | saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x00040000, 0x00040000); |
2567 | saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x00040000, 0x00000000); | 3082 | saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x00040000, 0x00000000); |
2568 | msleep(1); | 3083 | case SAA7134_BOARD_MONSTERTV_MOBILE: |
3084 | /* power-up tuner chip */ | ||
3085 | saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x00040000, 0x00040000); | ||
3086 | saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x00040000, 0x00000004); | ||
2569 | break; | 3087 | break; |
2570 | case SAA7134_BOARD_FLYDVBTDUO: | 3088 | case SAA7134_BOARD_FLYDVBTDUO: |
2571 | case SAA7134_BOARD_THYPHOON_DVBT_DUO_CARDBUS: | 3089 | case SAA7134_BOARD_THYPHOON_DVBT_DUO_CARDBUS: |
2572 | /* turn the fan on Hac: static for the time being */ | 3090 | /* turn the fan on */ |
2573 | saa_writeb(SAA7134_GPIO_GPMODE3, 0x08); | 3091 | saa_writeb(SAA7134_GPIO_GPMODE3, 0x08); |
2574 | saa_writeb(SAA7134_GPIO_GPSTATUS3, 0x06); | 3092 | saa_writeb(SAA7134_GPIO_GPSTATUS3, 0x06); |
2575 | break; | 3093 | break; |
@@ -2579,6 +3097,22 @@ int saa7134_board_init1(struct saa7134_dev *dev) | |||
2579 | saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0xffffffff, 0xffffffff); | 3097 | saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0xffffffff, 0xffffffff); |
2580 | msleep(1); | 3098 | msleep(1); |
2581 | break; | 3099 | break; |
3100 | case SAA7134_BOARD_RTD_VFG7350: | ||
3101 | |||
3102 | /* | ||
3103 | * Make sure Production Test Register at offset 0x1D1 is cleared | ||
3104 | * to take chip out of test mode. Clearing bit 4 (TST_EN_AOUT) | ||
3105 | * prevents pin 105 from remaining low; keeping pin 105 low | ||
3106 | * continually resets the SAA6752 chip. | ||
3107 | */ | ||
3108 | |||
3109 | saa_writeb (SAA7134_PRODUCTION_TEST_MODE, 0x00); | ||
3110 | break; | ||
3111 | /* i2c remotes */ | ||
3112 | case SAA7134_BOARD_PINNACLE_PCTV_110i: | ||
3113 | case SAA7134_BOARD_UPMOST_PURPLE_TV: | ||
3114 | dev->has_remote = SAA7134_REMOTE_I2C; | ||
3115 | break; | ||
2582 | } | 3116 | } |
2583 | return 0; | 3117 | return 0; |
2584 | } | 3118 | } |
@@ -2613,7 +3147,7 @@ int saa7134_board_init2(struct saa7134_dev *dev) | |||
2613 | saa7134_i2c_call_clients (dev, TUNER_SET_TYPE_ADDR, &tun_setup); | 3147 | saa7134_i2c_call_clients (dev, TUNER_SET_TYPE_ADDR, &tun_setup); |
2614 | } | 3148 | } |
2615 | break; | 3149 | break; |
2616 | case SAA7134_BOARD_MD7134: | 3150 | case SAA7134_BOARD_MD7134: |
2617 | { | 3151 | { |
2618 | struct tuner_setup tun_setup; | 3152 | struct tuner_setup tun_setup; |
2619 | u8 subaddr; | 3153 | u8 subaddr; |
@@ -2680,6 +3214,33 @@ case SAA7134_BOARD_MD7134: | |||
2680 | saa7134_i2c_call_clients (dev, TUNER_SET_TYPE_ADDR,&tun_setup); | 3214 | saa7134_i2c_call_clients (dev, TUNER_SET_TYPE_ADDR,&tun_setup); |
2681 | } | 3215 | } |
2682 | break; | 3216 | break; |
3217 | case SAA7134_BOARD_PHILIPS_EUROPA: | ||
3218 | case SAA7134_BOARD_VIDEOMATE_DVBT_300: | ||
3219 | /* The Philips EUROPA based hybrid boards have the tuner connected through | ||
3220 | * the channel decoder. We have to make it transparent to find it | ||
3221 | */ | ||
3222 | { | ||
3223 | struct tuner_setup tun_setup; | ||
3224 | u8 data[] = { 0x07, 0x02}; | ||
3225 | struct i2c_msg msg = {.addr=0x08, .flags=0, .buf=data, .len = sizeof(data)}; | ||
3226 | i2c_transfer(&dev->i2c_adap, &msg, 1); | ||
3227 | |||
3228 | tun_setup.mode_mask = T_ANALOG_TV | T_DIGITAL_TV; | ||
3229 | tun_setup.type = dev->tuner_type; | ||
3230 | tun_setup.addr = dev->tuner_addr; | ||
3231 | |||
3232 | saa7134_i2c_call_clients (dev, TUNER_SET_TYPE_ADDR,&tun_setup); | ||
3233 | } | ||
3234 | break; | ||
3235 | case SAA7134_BOARD_PHILIPS_TIGER: | ||
3236 | case SAA7134_BOARD_ASUSTeK_P7131_DUAL: | ||
3237 | /* this is a hybrid board, initialize to analog mode */ | ||
3238 | { | ||
3239 | u8 data[] = { 0x3c, 0x33, 0x68}; | ||
3240 | struct i2c_msg msg = {.addr=0x08, .flags=0, .buf=data, .len = sizeof(data)}; | ||
3241 | i2c_transfer(&dev->i2c_adap, &msg, 1); | ||
3242 | } | ||
3243 | break; | ||
2683 | } | 3244 | } |
2684 | return 0; | 3245 | return 0; |
2685 | } | 3246 | } |
diff --git a/drivers/media/video/saa7134/saa7134-core.c b/drivers/media/video/saa7134/saa7134-core.c index e5e36f3c6250..19b88744fb31 100644 --- a/drivers/media/video/saa7134/saa7134-core.c +++ b/drivers/media/video/saa7134/saa7134-core.c | |||
@@ -57,6 +57,10 @@ static unsigned int oss = 0; | |||
57 | module_param(oss, int, 0444); | 57 | module_param(oss, int, 0444); |
58 | MODULE_PARM_DESC(oss,"register oss devices (default: no)"); | 58 | MODULE_PARM_DESC(oss,"register oss devices (default: no)"); |
59 | 59 | ||
60 | static unsigned int alsa = 0; | ||
61 | module_param(alsa, int, 0444); | ||
62 | MODULE_PARM_DESC(alsa,"register alsa devices (default: no)"); | ||
63 | |||
60 | static unsigned int latency = UNSET; | 64 | static unsigned int latency = UNSET; |
61 | module_param(latency, int, 0444); | 65 | module_param(latency, int, 0444); |
62 | MODULE_PARM_DESC(latency,"pci latency timer"); | 66 | MODULE_PARM_DESC(latency,"pci latency timer"); |
@@ -190,6 +194,7 @@ void saa7134_track_gpio(struct saa7134_dev *dev, char *msg) | |||
190 | 194 | ||
191 | static int need_empress; | 195 | static int need_empress; |
192 | static int need_dvb; | 196 | static int need_dvb; |
197 | static int need_alsa; | ||
193 | 198 | ||
194 | static int pending_call(struct notifier_block *self, unsigned long state, | 199 | static int pending_call(struct notifier_block *self, unsigned long state, |
195 | void *module) | 200 | void *module) |
@@ -197,10 +202,12 @@ static int pending_call(struct notifier_block *self, unsigned long state, | |||
197 | if (module != THIS_MODULE || state != MODULE_STATE_LIVE) | 202 | if (module != THIS_MODULE || state != MODULE_STATE_LIVE) |
198 | return NOTIFY_DONE; | 203 | return NOTIFY_DONE; |
199 | 204 | ||
200 | if (need_empress) | 205 | if (need_empress) |
201 | request_module("saa7134-empress"); | 206 | request_module("saa7134-empress"); |
202 | if (need_dvb) | 207 | if (need_dvb) |
203 | request_module("saa7134-dvb"); | 208 | request_module("saa7134-dvb"); |
209 | if (need_alsa) | ||
210 | request_module("saa7134-alsa"); | ||
204 | return NOTIFY_DONE; | 211 | return NOTIFY_DONE; |
205 | } | 212 | } |
206 | 213 | ||
@@ -275,8 +282,8 @@ unsigned long saa7134_buffer_base(struct saa7134_buf *buf) | |||
275 | 282 | ||
276 | int saa7134_pgtable_alloc(struct pci_dev *pci, struct saa7134_pgtable *pt) | 283 | int saa7134_pgtable_alloc(struct pci_dev *pci, struct saa7134_pgtable *pt) |
277 | { | 284 | { |
278 | __le32 *cpu; | 285 | __le32 *cpu; |
279 | dma_addr_t dma_addr; | 286 | dma_addr_t dma_addr; |
280 | 287 | ||
281 | cpu = pci_alloc_consistent(pci, SAA7134_PGTABLE_SIZE, &dma_addr); | 288 | cpu = pci_alloc_consistent(pci, SAA7134_PGTABLE_SIZE, &dma_addr); |
282 | if (NULL == cpu) | 289 | if (NULL == cpu) |
@@ -436,7 +443,7 @@ int saa7134_set_dmabits(struct saa7134_dev *dev) | |||
436 | ctrl |= SAA7134_MAIN_CTRL_TE0; | 443 | ctrl |= SAA7134_MAIN_CTRL_TE0; |
437 | irq |= SAA7134_IRQ1_INTE_RA0_1 | | 444 | irq |= SAA7134_IRQ1_INTE_RA0_1 | |
438 | SAA7134_IRQ1_INTE_RA0_0; | 445 | SAA7134_IRQ1_INTE_RA0_0; |
439 | cap = dev->video_q.curr->vb.field; | 446 | cap = dev->video_q.curr->vb.field; |
440 | } | 447 | } |
441 | 448 | ||
442 | /* video capture -- dma 1+2 (planar modes) */ | 449 | /* video capture -- dma 1+2 (planar modes) */ |
@@ -465,7 +472,7 @@ int saa7134_set_dmabits(struct saa7134_dev *dev) | |||
465 | } | 472 | } |
466 | 473 | ||
467 | /* audio capture -- dma 3 */ | 474 | /* audio capture -- dma 3 */ |
468 | if (dev->oss.dma_running) { | 475 | if (dev->dmasound.dma_running) { |
469 | ctrl |= SAA7134_MAIN_CTRL_TE6; | 476 | ctrl |= SAA7134_MAIN_CTRL_TE6; |
470 | irq |= SAA7134_IRQ1_INTE_RA3_1 | | 477 | irq |= SAA7134_IRQ1_INTE_RA3_1 | |
471 | SAA7134_IRQ1_INTE_RA3_0; | 478 | SAA7134_IRQ1_INTE_RA3_0; |
@@ -570,6 +577,17 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id, struct pt_regs *regs) | |||
570 | dev->name); | 577 | dev->name); |
571 | goto out; | 578 | goto out; |
572 | } | 579 | } |
580 | |||
581 | /* If alsa support is active and we get a sound report, exit | ||
582 | and let the saa7134-alsa module deal with it */ | ||
583 | |||
584 | if ((report & SAA7134_IRQ_REPORT_DONE_RA3) && alsa) { | ||
585 | if (irq_debug > 1) | ||
586 | printk(KERN_DEBUG "%s/irq: ignoring interrupt for ALSA\n", | ||
587 | dev->name); | ||
588 | goto out; | ||
589 | } | ||
590 | |||
573 | handled = 1; | 591 | handled = 1; |
574 | saa_writel(SAA7134_IRQ_REPORT,report); | 592 | saa_writel(SAA7134_IRQ_REPORT,report); |
575 | if (irq_debug) | 593 | if (irq_debug) |
@@ -591,13 +609,17 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id, struct pt_regs *regs) | |||
591 | card_has_mpeg(dev)) | 609 | card_has_mpeg(dev)) |
592 | saa7134_irq_ts_done(dev,status); | 610 | saa7134_irq_ts_done(dev,status); |
593 | 611 | ||
594 | if ((report & SAA7134_IRQ_REPORT_DONE_RA3)) | 612 | if ((report & SAA7134_IRQ_REPORT_DONE_RA3)) { |
595 | saa7134_irq_oss_done(dev,status); | 613 | if (oss) { |
614 | saa7134_irq_oss_done(dev,status); | ||
615 | } | ||
616 | } | ||
596 | 617 | ||
597 | if ((report & (SAA7134_IRQ_REPORT_GPIO16 | | 618 | if ((report & (SAA7134_IRQ_REPORT_GPIO16 | |
598 | SAA7134_IRQ_REPORT_GPIO18)) && | 619 | SAA7134_IRQ_REPORT_GPIO18)) && |
599 | dev->remote) | 620 | dev->remote) |
600 | saa7134_input_irq(dev); | 621 | saa7134_input_irq(dev); |
622 | |||
601 | } | 623 | } |
602 | 624 | ||
603 | if (10 == loop) { | 625 | if (10 == loop) { |
@@ -636,7 +658,7 @@ static int saa7134_hwinit1(struct saa7134_dev *dev) | |||
636 | 658 | ||
637 | saa_writel(SAA7134_IRQ1, 0); | 659 | saa_writel(SAA7134_IRQ1, 0); |
638 | saa_writel(SAA7134_IRQ2, 0); | 660 | saa_writel(SAA7134_IRQ2, 0); |
639 | init_MUTEX(&dev->lock); | 661 | init_MUTEX(&dev->lock); |
640 | spin_lock_init(&dev->slock); | 662 | spin_lock_init(&dev->slock); |
641 | 663 | ||
642 | saa7134_track_gpio(dev,"pre-init"); | 664 | saa7134_track_gpio(dev,"pre-init"); |
@@ -646,14 +668,6 @@ static int saa7134_hwinit1(struct saa7134_dev *dev) | |||
646 | saa7134_ts_init1(dev); | 668 | saa7134_ts_init1(dev); |
647 | saa7134_input_init1(dev); | 669 | saa7134_input_init1(dev); |
648 | 670 | ||
649 | switch (dev->pci->device) { | ||
650 | case PCI_DEVICE_ID_PHILIPS_SAA7134: | ||
651 | case PCI_DEVICE_ID_PHILIPS_SAA7133: | ||
652 | case PCI_DEVICE_ID_PHILIPS_SAA7135: | ||
653 | saa7134_oss_init1(dev); | ||
654 | break; | ||
655 | } | ||
656 | |||
657 | /* RAM FIFO config */ | 671 | /* RAM FIFO config */ |
658 | saa_writel(SAA7134_FIFO_SIZE, 0x08070503); | 672 | saa_writel(SAA7134_FIFO_SIZE, 0x08070503); |
659 | saa_writel(SAA7134_THRESHOULD,0x02020202); | 673 | saa_writel(SAA7134_THRESHOULD,0x02020202); |
@@ -668,6 +682,21 @@ static int saa7134_hwinit1(struct saa7134_dev *dev) | |||
668 | SAA7134_MAIN_CTRL_ESFE | | 682 | SAA7134_MAIN_CTRL_ESFE | |
669 | SAA7134_MAIN_CTRL_EBDAC); | 683 | SAA7134_MAIN_CTRL_EBDAC); |
670 | 684 | ||
685 | /* | ||
686 | * Initialize OSS _after_ enabling audio clock PLL and audio processing. | ||
687 | * OSS initialization writes to registers via the audio DSP; these | ||
688 | * writes will fail unless the audio clock has been started. At worst, | ||
689 | * audio will not work. | ||
690 | */ | ||
691 | |||
692 | switch (dev->pci->device) { | ||
693 | case PCI_DEVICE_ID_PHILIPS_SAA7134: | ||
694 | case PCI_DEVICE_ID_PHILIPS_SAA7133: | ||
695 | case PCI_DEVICE_ID_PHILIPS_SAA7135: | ||
696 | saa7134_oss_init1(dev); | ||
697 | break; | ||
698 | } | ||
699 | |||
671 | /* enable peripheral devices */ | 700 | /* enable peripheral devices */ |
672 | saa_writeb(SAA7134_SPECIAL_MODE, 0x01); | 701 | saa_writeb(SAA7134_SPECIAL_MODE, 0x01); |
673 | 702 | ||
@@ -687,7 +716,7 @@ static int saa7134_hwinit2(struct saa7134_dev *dev) | |||
687 | saa7134_tvaudio_init2(dev); | 716 | saa7134_tvaudio_init2(dev); |
688 | 717 | ||
689 | /* enable IRQ's */ | 718 | /* enable IRQ's */ |
690 | irq2_mask = | 719 | irq2_mask = |
691 | SAA7134_IRQ2_INTE_DEC3 | | 720 | SAA7134_IRQ2_INTE_DEC3 | |
692 | SAA7134_IRQ2_INTE_DEC2 | | 721 | SAA7134_IRQ2_INTE_DEC2 | |
693 | SAA7134_IRQ2_INTE_DEC1 | | 722 | SAA7134_IRQ2_INTE_DEC1 | |
@@ -695,10 +724,12 @@ static int saa7134_hwinit2(struct saa7134_dev *dev) | |||
695 | SAA7134_IRQ2_INTE_PE | | 724 | SAA7134_IRQ2_INTE_PE | |
696 | SAA7134_IRQ2_INTE_AR; | 725 | SAA7134_IRQ2_INTE_AR; |
697 | 726 | ||
698 | if (dev->has_remote) | 727 | if (dev->has_remote == SAA7134_REMOTE_GPIO) |
699 | irq2_mask |= (SAA7134_IRQ2_INTE_GPIO18 | | 728 | irq2_mask |= (SAA7134_IRQ2_INTE_GPIO18 | |
700 | SAA7134_IRQ2_INTE_GPIO18A | | 729 | SAA7134_IRQ2_INTE_GPIO18A | |
701 | SAA7134_IRQ2_INTE_GPIO16 ); | 730 | SAA7134_IRQ2_INTE_GPIO16 ); |
731 | else if (dev->has_remote == SAA7134_REMOTE_I2C) | ||
732 | request_module("ir-kbd-i2c"); | ||
702 | 733 | ||
703 | saa_writel(SAA7134_IRQ1, 0); | 734 | saa_writel(SAA7134_IRQ1, 0); |
704 | saa_writel(SAA7134_IRQ2, irq2_mask); | 735 | saa_writel(SAA7134_IRQ2, irq2_mask); |
@@ -872,8 +903,8 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, | |||
872 | 903 | ||
873 | /* print pci info */ | 904 | /* print pci info */ |
874 | pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &dev->pci_rev); | 905 | pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &dev->pci_rev); |
875 | pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER, &dev->pci_lat); | 906 | pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER, &dev->pci_lat); |
876 | printk(KERN_INFO "%s: found at %s, rev: %d, irq: %d, " | 907 | printk(KERN_INFO "%s: found at %s, rev: %d, irq: %d, " |
877 | "latency: %d, mmio: 0x%lx\n", dev->name, | 908 | "latency: %d, mmio: 0x%lx\n", dev->name, |
878 | pci_name(pci_dev), dev->pci_rev, pci_dev->irq, | 909 | pci_name(pci_dev), dev->pci_rev, pci_dev->irq, |
879 | dev->pci_lat,pci_resource_start(pci_dev,0)); | 910 | dev->pci_lat,pci_resource_start(pci_dev,0)); |
@@ -897,7 +928,7 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, | |||
897 | dev->tda9887_conf = saa7134_boards[dev->board].tda9887_conf; | 928 | dev->tda9887_conf = saa7134_boards[dev->board].tda9887_conf; |
898 | if (UNSET != tuner[dev->nr]) | 929 | if (UNSET != tuner[dev->nr]) |
899 | dev->tuner_type = tuner[dev->nr]; | 930 | dev->tuner_type = tuner[dev->nr]; |
900 | printk(KERN_INFO "%s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n", | 931 | printk(KERN_INFO "%s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n", |
901 | dev->name,pci_dev->subsystem_vendor, | 932 | dev->name,pci_dev->subsystem_vendor, |
902 | pci_dev->subsystem_device,saa7134_boards[dev->board].name, | 933 | pci_dev->subsystem_device,saa7134_boards[dev->board].name, |
903 | dev->board, card[dev->nr] == dev->board ? | 934 | dev->board, card[dev->nr] == dev->board ? |
@@ -947,14 +978,20 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, | |||
947 | request_module("tuner"); | 978 | request_module("tuner"); |
948 | if (dev->tda9887_conf) | 979 | if (dev->tda9887_conf) |
949 | request_module("tda9887"); | 980 | request_module("tda9887"); |
950 | if (card_is_empress(dev)) { | 981 | if (card_is_empress(dev)) { |
951 | request_module("saa6752hs"); | 982 | request_module("saa6752hs"); |
952 | request_module_depend("saa7134-empress",&need_empress); | 983 | request_module_depend("saa7134-empress",&need_empress); |
953 | } | 984 | } |
954 | 985 | ||
955 | if (card_is_dvb(dev)) | 986 | if (card_is_dvb(dev)) |
956 | request_module_depend("saa7134-dvb",&need_dvb); | 987 | request_module_depend("saa7134-dvb",&need_dvb); |
957 | 988 | ||
989 | if (!oss && alsa) { | ||
990 | dprintk("Requesting ALSA module\n"); | ||
991 | request_module_depend("saa7134-alsa",&need_alsa); | ||
992 | } | ||
993 | |||
994 | |||
958 | v4l2_prio_init(&dev->prio); | 995 | v4l2_prio_init(&dev->prio); |
959 | 996 | ||
960 | /* register v4l devices */ | 997 | /* register v4l devices */ |
@@ -993,22 +1030,22 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, | |||
993 | case PCI_DEVICE_ID_PHILIPS_SAA7133: | 1030 | case PCI_DEVICE_ID_PHILIPS_SAA7133: |
994 | case PCI_DEVICE_ID_PHILIPS_SAA7135: | 1031 | case PCI_DEVICE_ID_PHILIPS_SAA7135: |
995 | if (oss) { | 1032 | if (oss) { |
996 | err = dev->oss.minor_dsp = | 1033 | err = dev->dmasound.minor_dsp = |
997 | register_sound_dsp(&saa7134_dsp_fops, | 1034 | register_sound_dsp(&saa7134_dsp_fops, |
998 | dsp_nr[dev->nr]); | 1035 | dsp_nr[dev->nr]); |
999 | if (err < 0) { | 1036 | if (err < 0) { |
1000 | goto fail4; | 1037 | goto fail4; |
1001 | } | 1038 | } |
1002 | printk(KERN_INFO "%s: registered device dsp%d\n", | 1039 | printk(KERN_INFO "%s: registered device dsp%d\n", |
1003 | dev->name,dev->oss.minor_dsp >> 4); | 1040 | dev->name,dev->dmasound.minor_dsp >> 4); |
1004 | 1041 | ||
1005 | err = dev->oss.minor_mixer = | 1042 | err = dev->dmasound.minor_mixer = |
1006 | register_sound_mixer(&saa7134_mixer_fops, | 1043 | register_sound_mixer(&saa7134_mixer_fops, |
1007 | mixer_nr[dev->nr]); | 1044 | mixer_nr[dev->nr]); |
1008 | if (err < 0) | 1045 | if (err < 0) |
1009 | goto fail5; | 1046 | goto fail5; |
1010 | printk(KERN_INFO "%s: registered device mixer%d\n", | 1047 | printk(KERN_INFO "%s: registered device mixer%d\n", |
1011 | dev->name,dev->oss.minor_mixer >> 4); | 1048 | dev->name,dev->dmasound.minor_mixer >> 4); |
1012 | } | 1049 | } |
1013 | break; | 1050 | break; |
1014 | } | 1051 | } |
@@ -1035,7 +1072,7 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, | |||
1035 | case PCI_DEVICE_ID_PHILIPS_SAA7133: | 1072 | case PCI_DEVICE_ID_PHILIPS_SAA7133: |
1036 | case PCI_DEVICE_ID_PHILIPS_SAA7135: | 1073 | case PCI_DEVICE_ID_PHILIPS_SAA7135: |
1037 | if (oss) | 1074 | if (oss) |
1038 | unregister_sound_dsp(dev->oss.minor_dsp); | 1075 | unregister_sound_dsp(dev->dmasound.minor_dsp); |
1039 | break; | 1076 | break; |
1040 | } | 1077 | } |
1041 | fail4: | 1078 | fail4: |
@@ -1055,7 +1092,7 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, | |||
1055 | 1092 | ||
1056 | static void __devexit saa7134_finidev(struct pci_dev *pci_dev) | 1093 | static void __devexit saa7134_finidev(struct pci_dev *pci_dev) |
1057 | { | 1094 | { |
1058 | struct saa7134_dev *dev = pci_get_drvdata(pci_dev); | 1095 | struct saa7134_dev *dev = pci_get_drvdata(pci_dev); |
1059 | struct list_head *item; | 1096 | struct list_head *item; |
1060 | struct saa7134_mpeg_ops *mops; | 1097 | struct saa7134_mpeg_ops *mops; |
1061 | 1098 | ||
@@ -1093,8 +1130,8 @@ static void __devexit saa7134_finidev(struct pci_dev *pci_dev) | |||
1093 | case PCI_DEVICE_ID_PHILIPS_SAA7133: | 1130 | case PCI_DEVICE_ID_PHILIPS_SAA7133: |
1094 | case PCI_DEVICE_ID_PHILIPS_SAA7135: | 1131 | case PCI_DEVICE_ID_PHILIPS_SAA7135: |
1095 | if (oss) { | 1132 | if (oss) { |
1096 | unregister_sound_mixer(dev->oss.minor_mixer); | 1133 | unregister_sound_mixer(dev->dmasound.minor_mixer); |
1097 | unregister_sound_dsp(dev->oss.minor_dsp); | 1134 | unregister_sound_dsp(dev->dmasound.minor_dsp); |
1098 | } | 1135 | } |
1099 | break; | 1136 | break; |
1100 | } | 1137 | } |
@@ -1149,10 +1186,10 @@ EXPORT_SYMBOL(saa7134_ts_unregister); | |||
1149 | /* ----------------------------------------------------------- */ | 1186 | /* ----------------------------------------------------------- */ |
1150 | 1187 | ||
1151 | static struct pci_driver saa7134_pci_driver = { | 1188 | static struct pci_driver saa7134_pci_driver = { |
1152 | .name = "saa7134", | 1189 | .name = "saa7134", |
1153 | .id_table = saa7134_pci_tbl, | 1190 | .id_table = saa7134_pci_tbl, |
1154 | .probe = saa7134_initdev, | 1191 | .probe = saa7134_initdev, |
1155 | .remove = __devexit_p(saa7134_finidev), | 1192 | .remove = __devexit_p(saa7134_finidev), |
1156 | }; | 1193 | }; |
1157 | 1194 | ||
1158 | static int saa7134_init(void) | 1195 | static int saa7134_init(void) |
@@ -1188,6 +1225,13 @@ EXPORT_SYMBOL(saa7134_i2c_call_clients); | |||
1188 | EXPORT_SYMBOL(saa7134_devlist); | 1225 | EXPORT_SYMBOL(saa7134_devlist); |
1189 | EXPORT_SYMBOL(saa7134_boards); | 1226 | EXPORT_SYMBOL(saa7134_boards); |
1190 | 1227 | ||
1228 | /* ----------------- For ALSA -------------------------------- */ | ||
1229 | |||
1230 | EXPORT_SYMBOL(saa7134_pgtable_free); | ||
1231 | EXPORT_SYMBOL(saa7134_pgtable_build); | ||
1232 | EXPORT_SYMBOL(saa7134_pgtable_alloc); | ||
1233 | EXPORT_SYMBOL(saa7134_set_dmabits); | ||
1234 | |||
1191 | /* ----------------------------------------------------------- */ | 1235 | /* ----------------------------------------------------------- */ |
1192 | /* | 1236 | /* |
1193 | * Local variables: | 1237 | * Local variables: |
diff --git a/drivers/media/video/saa7134/saa7134-dvb.c b/drivers/media/video/saa7134/saa7134-dvb.c index 639ae51a052d..e016480c3468 100644 --- a/drivers/media/video/saa7134/saa7134-dvb.c +++ b/drivers/media/video/saa7134/saa7134-dvb.c | |||
@@ -29,7 +29,6 @@ | |||
29 | #include <linux/kthread.h> | 29 | #include <linux/kthread.h> |
30 | #include <linux/suspend.h> | 30 | #include <linux/suspend.h> |
31 | 31 | ||
32 | |||
33 | #include "saa7134-reg.h" | 32 | #include "saa7134-reg.h" |
34 | #include "saa7134.h" | 33 | #include "saa7134.h" |
35 | 34 | ||
@@ -40,6 +39,10 @@ | |||
40 | #ifdef HAVE_TDA1004X | 39 | #ifdef HAVE_TDA1004X |
41 | # include "tda1004x.h" | 40 | # include "tda1004x.h" |
42 | #endif | 41 | #endif |
42 | #ifdef HAVE_NXT200X | ||
43 | # include "nxt200x.h" | ||
44 | # include "dvb-pll.h" | ||
45 | #endif | ||
43 | 46 | ||
44 | MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]"); | 47 | MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]"); |
45 | MODULE_LICENSE("GPL"); | 48 | MODULE_LICENSE("GPL"); |
@@ -151,25 +154,12 @@ static struct mt352_config pinnacle_300i = { | |||
151 | /* ------------------------------------------------------------------ */ | 154 | /* ------------------------------------------------------------------ */ |
152 | 155 | ||
153 | #ifdef HAVE_TDA1004X | 156 | #ifdef HAVE_TDA1004X |
154 | static int philips_tu1216_pll_init(struct dvb_frontend *fe) | ||
155 | { | ||
156 | struct saa7134_dev *dev = fe->dvb->priv; | ||
157 | static u8 tu1216_init[] = { 0x0b, 0xf5, 0x85, 0xab }; | ||
158 | struct i2c_msg tuner_msg = {.addr = 0x60,.flags = 0,.buf = tu1216_init,.len = sizeof(tu1216_init) }; | ||
159 | |||
160 | /* setup PLL configuration */ | ||
161 | if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1) | ||
162 | return -EIO; | ||
163 | msleep(1); | ||
164 | 157 | ||
165 | return 0; | 158 | static int philips_tda6651_pll_set(u8 addr, struct dvb_frontend *fe, struct dvb_frontend_parameters *params) |
166 | } | ||
167 | |||
168 | static int philips_tu1216_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) | ||
169 | { | 159 | { |
170 | struct saa7134_dev *dev = fe->dvb->priv; | 160 | struct saa7134_dev *dev = fe->dvb->priv; |
171 | u8 tuner_buf[4]; | 161 | u8 tuner_buf[4]; |
172 | struct i2c_msg tuner_msg = {.addr = 0x60,.flags = 0,.buf = tuner_buf,.len = | 162 | struct i2c_msg tuner_msg = {.addr = addr,.flags = 0,.buf = tuner_buf,.len = |
173 | sizeof(tuner_buf) }; | 163 | sizeof(tuner_buf) }; |
174 | int tuner_frequency = 0; | 164 | int tuner_frequency = 0; |
175 | u8 band, cp, filter; | 165 | u8 band, cp, filter; |
@@ -242,11 +232,36 @@ static int philips_tu1216_pll_set(struct dvb_frontend *fe, struct dvb_frontend_p | |||
242 | 232 | ||
243 | if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1) | 233 | if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1) |
244 | return -EIO; | 234 | return -EIO; |
235 | msleep(1); | ||
236 | return 0; | ||
237 | } | ||
245 | 238 | ||
239 | static int philips_tda6651_pll_init(u8 addr, struct dvb_frontend *fe) | ||
240 | { | ||
241 | struct saa7134_dev *dev = fe->dvb->priv; | ||
242 | static u8 tu1216_init[] = { 0x0b, 0xf5, 0x85, 0xab }; | ||
243 | struct i2c_msg tuner_msg = {.addr = addr,.flags = 0,.buf = tu1216_init,.len = sizeof(tu1216_init) }; | ||
244 | |||
245 | /* setup PLL configuration */ | ||
246 | if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1) | ||
247 | return -EIO; | ||
246 | msleep(1); | 248 | msleep(1); |
249 | |||
247 | return 0; | 250 | return 0; |
248 | } | 251 | } |
249 | 252 | ||
253 | /* ------------------------------------------------------------------ */ | ||
254 | |||
255 | static int philips_tu1216_pll_60_init(struct dvb_frontend *fe) | ||
256 | { | ||
257 | return philips_tda6651_pll_init(0x60, fe); | ||
258 | } | ||
259 | |||
260 | static int philips_tu1216_pll_60_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) | ||
261 | { | ||
262 | return philips_tda6651_pll_set(0x60, fe, params); | ||
263 | } | ||
264 | |||
250 | static int philips_tu1216_request_firmware(struct dvb_frontend *fe, | 265 | static int philips_tu1216_request_firmware(struct dvb_frontend *fe, |
251 | const struct firmware **fw, char *name) | 266 | const struct firmware **fw, char *name) |
252 | { | 267 | { |
@@ -254,22 +269,108 @@ static int philips_tu1216_request_firmware(struct dvb_frontend *fe, | |||
254 | return request_firmware(fw, name, &dev->pci->dev); | 269 | return request_firmware(fw, name, &dev->pci->dev); |
255 | } | 270 | } |
256 | 271 | ||
257 | static struct tda1004x_config philips_tu1216_config = { | 272 | static struct tda1004x_config philips_tu1216_60_config = { |
273 | |||
274 | .demod_address = 0x8, | ||
275 | .invert = 1, | ||
276 | .invert_oclk = 0, | ||
277 | .xtal_freq = TDA10046_XTAL_4M, | ||
278 | .agc_config = TDA10046_AGC_DEFAULT, | ||
279 | .if_freq = TDA10046_FREQ_3617, | ||
280 | .pll_init = philips_tu1216_pll_60_init, | ||
281 | .pll_set = philips_tu1216_pll_60_set, | ||
282 | .pll_sleep = NULL, | ||
283 | .request_firmware = philips_tu1216_request_firmware, | ||
284 | }; | ||
285 | |||
286 | /* ------------------------------------------------------------------ */ | ||
287 | |||
288 | static int philips_tu1216_pll_61_init(struct dvb_frontend *fe) | ||
289 | { | ||
290 | return philips_tda6651_pll_init(0x61, fe); | ||
291 | } | ||
292 | |||
293 | static int philips_tu1216_pll_61_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) | ||
294 | { | ||
295 | return philips_tda6651_pll_set(0x61, fe, params); | ||
296 | } | ||
297 | |||
298 | static struct tda1004x_config philips_tu1216_61_config = { | ||
258 | 299 | ||
259 | .demod_address = 0x8, | 300 | .demod_address = 0x8, |
260 | .invert = 1, | 301 | .invert = 1, |
261 | .invert_oclk = 1, | 302 | .invert_oclk = 0, |
262 | .xtal_freq = TDA10046_XTAL_4M, | 303 | .xtal_freq = TDA10046_XTAL_4M, |
263 | .agc_config = TDA10046_AGC_DEFAULT, | 304 | .agc_config = TDA10046_AGC_DEFAULT, |
264 | .if_freq = TDA10046_FREQ_3617, | 305 | .if_freq = TDA10046_FREQ_3617, |
265 | .pll_init = philips_tu1216_pll_init, | 306 | .pll_init = philips_tu1216_pll_61_init, |
266 | .pll_set = philips_tu1216_pll_set, | 307 | .pll_set = philips_tu1216_pll_61_set, |
267 | .pll_sleep = NULL, | 308 | .pll_sleep = NULL, |
268 | .request_firmware = philips_tu1216_request_firmware, | 309 | .request_firmware = philips_tu1216_request_firmware, |
269 | }; | 310 | }; |
270 | 311 | ||
271 | /* ------------------------------------------------------------------ */ | 312 | /* ------------------------------------------------------------------ */ |
272 | 313 | ||
314 | static int philips_europa_pll_init(struct dvb_frontend *fe) | ||
315 | { | ||
316 | struct saa7134_dev *dev = fe->dvb->priv; | ||
317 | static u8 msg[] = { 0x0b, 0xf5, 0x86, 0xab }; | ||
318 | struct i2c_msg init_msg = {.addr = 0x61,.flags = 0,.buf = msg,.len = sizeof(msg) }; | ||
319 | |||
320 | /* setup PLL configuration */ | ||
321 | if (i2c_transfer(&dev->i2c_adap, &init_msg, 1) != 1) | ||
322 | return -EIO; | ||
323 | msleep(1); | ||
324 | |||
325 | /* switch the board to dvb mode */ | ||
326 | init_msg.addr = 0x43; | ||
327 | init_msg.len = 0x02; | ||
328 | msg[0] = 0x00; | ||
329 | msg[1] = 0x40; | ||
330 | if (i2c_transfer(&dev->i2c_adap, &init_msg, 1) != 1) | ||
331 | return -EIO; | ||
332 | |||
333 | return 0; | ||
334 | } | ||
335 | |||
336 | static int philips_td1316_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) | ||
337 | { | ||
338 | return philips_tda6651_pll_set(0x61, fe, params); | ||
339 | } | ||
340 | |||
341 | static void philips_europa_analog(struct dvb_frontend *fe) | ||
342 | { | ||
343 | struct saa7134_dev *dev = fe->dvb->priv; | ||
344 | /* this message actually turns the tuner back to analog mode */ | ||
345 | static u8 msg[] = { 0x0b, 0xdc, 0x86, 0xa4 }; | ||
346 | struct i2c_msg analog_msg = {.addr = 0x61,.flags = 0,.buf = msg,.len = sizeof(msg) }; | ||
347 | |||
348 | i2c_transfer(&dev->i2c_adap, &analog_msg, 1); | ||
349 | msleep(1); | ||
350 | |||
351 | /* switch the board to analog mode */ | ||
352 | analog_msg.addr = 0x43; | ||
353 | analog_msg.len = 0x02; | ||
354 | msg[0] = 0x00; | ||
355 | msg[1] = 0x14; | ||
356 | i2c_transfer(&dev->i2c_adap, &analog_msg, 1); | ||
357 | } | ||
358 | |||
359 | static struct tda1004x_config philips_europa_config = { | ||
360 | |||
361 | .demod_address = 0x8, | ||
362 | .invert = 0, | ||
363 | .invert_oclk = 0, | ||
364 | .xtal_freq = TDA10046_XTAL_4M, | ||
365 | .agc_config = TDA10046_AGC_IFO_AUTO_POS, | ||
366 | .if_freq = TDA10046_FREQ_052, | ||
367 | .pll_init = philips_europa_pll_init, | ||
368 | .pll_set = philips_td1316_pll_set, | ||
369 | .pll_sleep = philips_europa_analog, | ||
370 | .request_firmware = NULL, | ||
371 | }; | ||
372 | |||
373 | /* ------------------------------------------------------------------ */ | ||
273 | 374 | ||
274 | static int philips_fmd1216_pll_init(struct dvb_frontend *fe) | 375 | static int philips_fmd1216_pll_init(struct dvb_frontend *fe) |
275 | { | 376 | { |
@@ -382,7 +483,6 @@ static int philips_fmd1216_pll_set(struct dvb_frontend *fe, struct dvb_frontend_ | |||
382 | return 0; | 483 | return 0; |
383 | } | 484 | } |
384 | 485 | ||
385 | #ifdef HAVE_TDA1004X | ||
386 | static struct tda1004x_config medion_cardbus = { | 486 | static struct tda1004x_config medion_cardbus = { |
387 | .demod_address = 0x08, | 487 | .demod_address = 0x08, |
388 | .invert = 1, | 488 | .invert = 1, |
@@ -395,7 +495,6 @@ static struct tda1004x_config medion_cardbus = { | |||
395 | .pll_sleep = philips_fmd1216_analog, | 495 | .pll_sleep = philips_fmd1216_analog, |
396 | .request_firmware = NULL, | 496 | .request_firmware = NULL, |
397 | }; | 497 | }; |
398 | #endif | ||
399 | 498 | ||
400 | /* ------------------------------------------------------------------ */ | 499 | /* ------------------------------------------------------------------ */ |
401 | 500 | ||
@@ -452,7 +551,7 @@ static int philips_tda827x_pll_set(struct dvb_frontend *fe, struct dvb_frontend_ | |||
452 | u8 tuner_buf[14]; | 551 | u8 tuner_buf[14]; |
453 | 552 | ||
454 | struct i2c_msg tuner_msg = {.addr = 0x60,.flags = 0,.buf = tuner_buf, | 553 | struct i2c_msg tuner_msg = {.addr = 0x60,.flags = 0,.buf = tuner_buf, |
455 | .len = sizeof(tuner_buf) }; | 554 | .len = sizeof(tuner_buf) }; |
456 | int i, tuner_freq, if_freq; | 555 | int i, tuner_freq, if_freq; |
457 | u32 N; | 556 | u32 N; |
458 | switch (params->u.ofdm.bandwidth) { | 557 | switch (params->u.ofdm.bandwidth) { |
@@ -511,7 +610,7 @@ static void philips_tda827x_pll_sleep(struct dvb_frontend *fe) | |||
511 | struct saa7134_dev *dev = fe->dvb->priv; | 610 | struct saa7134_dev *dev = fe->dvb->priv; |
512 | static u8 tda827x_sleep[] = { 0x30, 0xd0}; | 611 | static u8 tda827x_sleep[] = { 0x30, 0xd0}; |
513 | struct i2c_msg tuner_msg = {.addr = 0x60,.flags = 0,.buf = tda827x_sleep, | 612 | struct i2c_msg tuner_msg = {.addr = 0x60,.flags = 0,.buf = tda827x_sleep, |
514 | .len = sizeof(tda827x_sleep) }; | 613 | .len = sizeof(tda827x_sleep) }; |
515 | i2c_transfer(&dev->i2c_adap, &tuner_msg, 1); | 614 | i2c_transfer(&dev->i2c_adap, &tuner_msg, 1); |
516 | } | 615 | } |
517 | 616 | ||
@@ -527,6 +626,202 @@ static struct tda1004x_config tda827x_lifeview_config = { | |||
527 | .pll_sleep = philips_tda827x_pll_sleep, | 626 | .pll_sleep = philips_tda827x_pll_sleep, |
528 | .request_firmware = NULL, | 627 | .request_firmware = NULL, |
529 | }; | 628 | }; |
629 | |||
630 | /* ------------------------------------------------------------------ */ | ||
631 | |||
632 | struct tda827xa_data { | ||
633 | u32 lomax; | ||
634 | u8 svco; | ||
635 | u8 spd; | ||
636 | u8 scr; | ||
637 | u8 sbs; | ||
638 | u8 gc3; | ||
639 | }; | ||
640 | |||
641 | static struct tda827xa_data tda827xa_dvbt[] = { | ||
642 | { .lomax = 56875000, .svco = 3, .spd = 4, .scr = 0, .sbs = 0, .gc3 = 1}, | ||
643 | { .lomax = 67250000, .svco = 0, .spd = 3, .scr = 0, .sbs = 0, .gc3 = 1}, | ||
644 | { .lomax = 81250000, .svco = 1, .spd = 3, .scr = 0, .sbs = 0, .gc3 = 1}, | ||
645 | { .lomax = 97500000, .svco = 2, .spd = 3, .scr = 0, .sbs = 0, .gc3 = 1}, | ||
646 | { .lomax = 113750000, .svco = 3, .spd = 3, .scr = 0, .sbs = 1, .gc3 = 1}, | ||
647 | { .lomax = 134500000, .svco = 0, .spd = 2, .scr = 0, .sbs = 1, .gc3 = 1}, | ||
648 | { .lomax = 154000000, .svco = 1, .spd = 2, .scr = 0, .sbs = 1, .gc3 = 1}, | ||
649 | { .lomax = 162500000, .svco = 1, .spd = 2, .scr = 0, .sbs = 1, .gc3 = 1}, | ||
650 | { .lomax = 183000000, .svco = 2, .spd = 2, .scr = 0, .sbs = 1, .gc3 = 1}, | ||
651 | { .lomax = 195000000, .svco = 2, .spd = 2, .scr = 0, .sbs = 2, .gc3 = 1}, | ||
652 | { .lomax = 227500000, .svco = 3, .spd = 2, .scr = 0, .sbs = 2, .gc3 = 1}, | ||
653 | { .lomax = 269000000, .svco = 0, .spd = 1, .scr = 0, .sbs = 2, .gc3 = 1}, | ||
654 | { .lomax = 290000000, .svco = 1, .spd = 1, .scr = 0, .sbs = 2, .gc3 = 1}, | ||
655 | { .lomax = 325000000, .svco = 1, .spd = 1, .scr = 0, .sbs = 3, .gc3 = 1}, | ||
656 | { .lomax = 390000000, .svco = 2, .spd = 1, .scr = 0, .sbs = 3, .gc3 = 1}, | ||
657 | { .lomax = 455000000, .svco = 3, .spd = 1, .scr = 0, .sbs = 3, .gc3 = 1}, | ||
658 | { .lomax = 520000000, .svco = 0, .spd = 0, .scr = 0, .sbs = 3, .gc3 = 1}, | ||
659 | { .lomax = 538000000, .svco = 0, .spd = 0, .scr = 1, .sbs = 3, .gc3 = 1}, | ||
660 | { .lomax = 550000000, .svco = 1, .spd = 0, .scr = 0, .sbs = 3, .gc3 = 1}, | ||
661 | { .lomax = 620000000, .svco = 1, .spd = 0, .scr = 0, .sbs = 4, .gc3 = 0}, | ||
662 | { .lomax = 650000000, .svco = 1, .spd = 0, .scr = 1, .sbs = 4, .gc3 = 0}, | ||
663 | { .lomax = 700000000, .svco = 2, .spd = 0, .scr = 0, .sbs = 4, .gc3 = 0}, | ||
664 | { .lomax = 780000000, .svco = 2, .spd = 0, .scr = 1, .sbs = 4, .gc3 = 0}, | ||
665 | { .lomax = 820000000, .svco = 3, .spd = 0, .scr = 0, .sbs = 4, .gc3 = 0}, | ||
666 | { .lomax = 870000000, .svco = 3, .spd = 0, .scr = 1, .sbs = 4, .gc3 = 0}, | ||
667 | { .lomax = 911000000, .svco = 3, .spd = 0, .scr = 2, .sbs = 4, .gc3 = 0}, | ||
668 | { .lomax = 0, .svco = 0, .spd = 0, .scr = 0, .sbs = 0, .gc3 = 0}}; | ||
669 | |||
670 | |||
671 | static int philips_tda827xa_pll_set(u8 addr, struct dvb_frontend *fe, struct dvb_frontend_parameters *params) | ||
672 | { | ||
673 | struct saa7134_dev *dev = fe->dvb->priv; | ||
674 | u8 tuner_buf[14]; | ||
675 | unsigned char reg2[2]; | ||
676 | |||
677 | struct i2c_msg msg = {.addr = addr,.flags = 0,.buf = tuner_buf}; | ||
678 | int i, tuner_freq, if_freq; | ||
679 | u32 N; | ||
680 | |||
681 | switch (params->u.ofdm.bandwidth) { | ||
682 | case BANDWIDTH_6_MHZ: | ||
683 | if_freq = 4000000; | ||
684 | break; | ||
685 | case BANDWIDTH_7_MHZ: | ||
686 | if_freq = 4500000; | ||
687 | break; | ||
688 | default: /* 8 MHz or Auto */ | ||
689 | if_freq = 5000000; | ||
690 | break; | ||
691 | } | ||
692 | tuner_freq = params->frequency + if_freq; | ||
693 | |||
694 | i = 0; | ||
695 | while (tda827xa_dvbt[i].lomax < tuner_freq) { | ||
696 | if(tda827xa_dvbt[i + 1].lomax == 0) | ||
697 | break; | ||
698 | i++; | ||
699 | } | ||
700 | |||
701 | N = ((tuner_freq + 31250) / 62500) << tda827xa_dvbt[i].spd; | ||
702 | tuner_buf[0] = 0; // subaddress | ||
703 | tuner_buf[1] = N >> 8; | ||
704 | tuner_buf[2] = N & 0xff; | ||
705 | tuner_buf[3] = 0; | ||
706 | tuner_buf[4] = 0x16; | ||
707 | tuner_buf[5] = (tda827xa_dvbt[i].spd << 5) + (tda827xa_dvbt[i].svco << 3) + | ||
708 | tda827xa_dvbt[i].sbs; | ||
709 | tuner_buf[6] = 0x4b + (tda827xa_dvbt[i].gc3 << 4); | ||
710 | tuner_buf[7] = 0x0c; | ||
711 | tuner_buf[8] = 0x06; | ||
712 | tuner_buf[9] = 0x24; | ||
713 | tuner_buf[10] = 0xff; | ||
714 | tuner_buf[11] = 0x60; | ||
715 | tuner_buf[12] = 0x00; | ||
716 | tuner_buf[13] = 0x39; // lpsel | ||
717 | msg.len = 14; | ||
718 | if (i2c_transfer(&dev->i2c_adap, &msg, 1) != 1) | ||
719 | return -EIO; | ||
720 | |||
721 | msg.buf= reg2; | ||
722 | msg.len = 2; | ||
723 | reg2[0] = 0x60; | ||
724 | reg2[1] = 0x3c; | ||
725 | i2c_transfer(&dev->i2c_adap, &msg, 1); | ||
726 | |||
727 | reg2[0] = 0xa0; | ||
728 | reg2[1] = 0x40; | ||
729 | i2c_transfer(&dev->i2c_adap, &msg, 1); | ||
730 | |||
731 | msleep(2); | ||
732 | /* correct CP value */ | ||
733 | reg2[0] = 0x30; | ||
734 | reg2[1] = 0x10 + tda827xa_dvbt[i].scr; | ||
735 | msg.len = 2; | ||
736 | i2c_transfer(&dev->i2c_adap, &msg, 1); | ||
737 | |||
738 | msleep(550); | ||
739 | reg2[0] = 0x50; | ||
740 | reg2[1] = 0x4f + (tda827xa_dvbt[i].gc3 << 4); | ||
741 | i2c_transfer(&dev->i2c_adap, &msg, 1); | ||
742 | |||
743 | return 0; | ||
744 | |||
745 | } | ||
746 | |||
747 | static void philips_tda827xa_pll_sleep(u8 addr, struct dvb_frontend *fe) | ||
748 | { | ||
749 | struct saa7134_dev *dev = fe->dvb->priv; | ||
750 | static u8 tda827xa_sleep[] = { 0x30, 0x90}; | ||
751 | struct i2c_msg tuner_msg = {.addr = addr,.flags = 0,.buf = tda827xa_sleep, | ||
752 | .len = sizeof(tda827xa_sleep) }; | ||
753 | i2c_transfer(&dev->i2c_adap, &tuner_msg, 1); | ||
754 | |||
755 | } | ||
756 | |||
757 | /* ------------------------------------------------------------------ */ | ||
758 | |||
759 | static int philips_tiger_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) | ||
760 | { | ||
761 | int ret; | ||
762 | struct saa7134_dev *dev = fe->dvb->priv; | ||
763 | static u8 tda8290_close[] = { 0x21, 0xc0}; | ||
764 | static u8 tda8290_open[] = { 0x21, 0x80}; | ||
765 | struct i2c_msg tda8290_msg = {.addr = 0x4b,.flags = 0, .len = 2}; | ||
766 | /* close tda8290 i2c bridge */ | ||
767 | tda8290_msg.buf = tda8290_close; | ||
768 | ret = i2c_transfer(&dev->i2c_adap, &tda8290_msg, 1); | ||
769 | if (ret != 1) | ||
770 | return -EIO; | ||
771 | msleep(20); | ||
772 | ret = philips_tda827xa_pll_set(0x61, fe, params); | ||
773 | if (ret != 0) | ||
774 | return ret; | ||
775 | /* open tda8290 i2c bridge */ | ||
776 | tda8290_msg.buf = tda8290_open; | ||
777 | i2c_transfer(&dev->i2c_adap, &tda8290_msg, 1); | ||
778 | return ret; | ||
779 | }; | ||
780 | |||
781 | static int philips_tiger_dvb_mode(struct dvb_frontend *fe) | ||
782 | { | ||
783 | struct saa7134_dev *dev = fe->dvb->priv; | ||
784 | static u8 data[] = { 0x3c, 0x33, 0x6a}; | ||
785 | struct i2c_msg msg = {.addr=0x08, .flags=0, .buf=data, .len = sizeof(data)}; | ||
786 | |||
787 | if (i2c_transfer(&dev->i2c_adap, &msg, 1) != 1) | ||
788 | return -EIO; | ||
789 | return 0; | ||
790 | } | ||
791 | |||
792 | static void philips_tiger_analog_mode(struct dvb_frontend *fe) | ||
793 | { | ||
794 | struct saa7134_dev *dev = fe->dvb->priv; | ||
795 | static u8 data[] = { 0x3c, 0x33, 0x68}; | ||
796 | struct i2c_msg msg = {.addr=0x08, .flags=0, .buf=data, .len = sizeof(data)}; | ||
797 | |||
798 | i2c_transfer(&dev->i2c_adap, &msg, 1); | ||
799 | philips_tda827xa_pll_sleep( 0x61, fe); | ||
800 | } | ||
801 | |||
802 | static struct tda1004x_config philips_tiger_config = { | ||
803 | .demod_address = 0x08, | ||
804 | .invert = 1, | ||
805 | .invert_oclk = 0, | ||
806 | .xtal_freq = TDA10046_XTAL_16M, | ||
807 | .agc_config = TDA10046_AGC_TDA827X, | ||
808 | .if_freq = TDA10046_FREQ_045, | ||
809 | .pll_init = philips_tiger_dvb_mode, | ||
810 | .pll_set = philips_tiger_pll_set, | ||
811 | .pll_sleep = philips_tiger_analog_mode, | ||
812 | .request_firmware = NULL, | ||
813 | }; | ||
814 | |||
815 | #endif | ||
816 | |||
817 | /* ------------------------------------------------------------------ */ | ||
818 | |||
819 | #ifdef HAVE_NXT200X | ||
820 | static struct nxt200x_config avertvhda180 = { | ||
821 | .demod_address = 0x0a, | ||
822 | .pll_address = 0x61, | ||
823 | .pll_desc = &dvb_pll_tdhu2, | ||
824 | }; | ||
530 | #endif | 825 | #endif |
531 | 826 | ||
532 | /* ------------------------------------------------------------------ */ | 827 | /* ------------------------------------------------------------------ */ |
@@ -558,7 +853,7 @@ static int dvb_init(struct saa7134_dev *dev) | |||
558 | &dev->i2c_adap); | 853 | &dev->i2c_adap); |
559 | break; | 854 | break; |
560 | case SAA7134_BOARD_PHILIPS_TOUGH: | 855 | case SAA7134_BOARD_PHILIPS_TOUGH: |
561 | dev->dvb.frontend = tda10046_attach(&philips_tu1216_config, | 856 | dev->dvb.frontend = tda10046_attach(&philips_tu1216_60_config, |
562 | &dev->i2c_adap); | 857 | &dev->i2c_adap); |
563 | break; | 858 | break; |
564 | case SAA7134_BOARD_FLYDVBTDUO: | 859 | case SAA7134_BOARD_FLYDVBTDUO: |
@@ -569,6 +864,31 @@ static int dvb_init(struct saa7134_dev *dev) | |||
569 | dev->dvb.frontend = tda10046_attach(&tda827x_lifeview_config, | 864 | dev->dvb.frontend = tda10046_attach(&tda827x_lifeview_config, |
570 | &dev->i2c_adap); | 865 | &dev->i2c_adap); |
571 | break; | 866 | break; |
867 | case SAA7134_BOARD_PHILIPS_EUROPA: | ||
868 | dev->dvb.frontend = tda10046_attach(&philips_europa_config, | ||
869 | &dev->i2c_adap); | ||
870 | break; | ||
871 | case SAA7134_BOARD_VIDEOMATE_DVBT_300: | ||
872 | dev->dvb.frontend = tda10046_attach(&philips_europa_config, | ||
873 | &dev->i2c_adap); | ||
874 | break; | ||
875 | case SAA7134_BOARD_VIDEOMATE_DVBT_200: | ||
876 | dev->dvb.frontend = tda10046_attach(&philips_tu1216_61_config, | ||
877 | &dev->i2c_adap); | ||
878 | break; | ||
879 | case SAA7134_BOARD_PHILIPS_TIGER: | ||
880 | dev->dvb.frontend = tda10046_attach(&philips_tiger_config, | ||
881 | &dev->i2c_adap); | ||
882 | break; | ||
883 | case SAA7134_BOARD_ASUSTeK_P7131_DUAL: | ||
884 | dev->dvb.frontend = tda10046_attach(&philips_tiger_config, | ||
885 | &dev->i2c_adap); | ||
886 | break; | ||
887 | #endif | ||
888 | #ifdef HAVE_NXT200X | ||
889 | case SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180: | ||
890 | dev->dvb.frontend = nxt200x_attach(&avertvhda180, &dev->i2c_adap); | ||
891 | break; | ||
572 | #endif | 892 | #endif |
573 | default: | 893 | default: |
574 | printk("%s: Huh? unknown DVB card?\n",dev->name); | 894 | printk("%s: Huh? unknown DVB card?\n",dev->name); |
diff --git a/drivers/media/video/saa7134/saa7134-empress.c b/drivers/media/video/saa7134/saa7134-empress.c index 77b627eb6483..e9ec69efb4c9 100644 --- a/drivers/media/video/saa7134/saa7134-empress.c +++ b/drivers/media/video/saa7134/saa7134-empress.c | |||
@@ -55,7 +55,7 @@ static void ts_reset_encoder(struct saa7134_dev* dev) | |||
55 | 55 | ||
56 | saa_writeb(SAA7134_SPECIAL_MODE, 0x00); | 56 | saa_writeb(SAA7134_SPECIAL_MODE, 0x00); |
57 | msleep(10); | 57 | msleep(10); |
58 | saa_writeb(SAA7134_SPECIAL_MODE, 0x01); | 58 | saa_writeb(SAA7134_SPECIAL_MODE, 0x01); |
59 | msleep(100); | 59 | msleep(100); |
60 | dev->empress_started = 0; | 60 | dev->empress_started = 0; |
61 | } | 61 | } |
@@ -65,7 +65,7 @@ static int ts_init_encoder(struct saa7134_dev* dev) | |||
65 | ts_reset_encoder(dev); | 65 | ts_reset_encoder(dev); |
66 | saa7134_i2c_call_clients(dev, VIDIOC_S_MPEGCOMP, NULL); | 66 | saa7134_i2c_call_clients(dev, VIDIOC_S_MPEGCOMP, NULL); |
67 | dev->empress_started = 1; | 67 | dev->empress_started = 1; |
68 | return 0; | 68 | return 0; |
69 | } | 69 | } |
70 | 70 | ||
71 | /* ------------------------------------------------------------------ */ | 71 | /* ------------------------------------------------------------------ */ |
@@ -169,7 +169,7 @@ static int ts_do_ioctl(struct inode *inode, struct file *file, | |||
169 | struct v4l2_capability *cap = arg; | 169 | struct v4l2_capability *cap = arg; |
170 | 170 | ||
171 | memset(cap,0,sizeof(*cap)); | 171 | memset(cap,0,sizeof(*cap)); |
172 | strcpy(cap->driver, "saa7134"); | 172 | strcpy(cap->driver, "saa7134"); |
173 | strlcpy(cap->card, saa7134_boards[dev->board].name, | 173 | strlcpy(cap->card, saa7134_boards[dev->board].name, |
174 | sizeof(cap->card)); | 174 | sizeof(cap->card)); |
175 | sprintf(cap->bus_info,"PCI:%s",pci_name(dev->pci)); | 175 | sprintf(cap->bus_info,"PCI:%s",pci_name(dev->pci)); |
diff --git a/drivers/media/video/saa7134/saa7134-i2c.c b/drivers/media/video/saa7134/saa7134-i2c.c index 711aa8e85fac..7575043f0874 100644 --- a/drivers/media/video/saa7134/saa7134-i2c.c +++ b/drivers/media/video/saa7134/saa7134-i2c.c | |||
@@ -239,7 +239,7 @@ static int saa7134_i2c_xfer(struct i2c_adapter *i2c_adap, | |||
239 | unsigned char data; | 239 | unsigned char data; |
240 | int addr,rc,i,byte; | 240 | int addr,rc,i,byte; |
241 | 241 | ||
242 | status = i2c_get_status(dev); | 242 | status = i2c_get_status(dev); |
243 | if (!i2c_is_idle(status)) | 243 | if (!i2c_is_idle(status)) |
244 | if (!i2c_reset(dev)) | 244 | if (!i2c_reset(dev)) |
245 | return -EIO; | 245 | return -EIO; |
@@ -296,7 +296,7 @@ static int saa7134_i2c_xfer(struct i2c_adapter *i2c_adap, | |||
296 | rc = -EIO; | 296 | rc = -EIO; |
297 | if (!i2c_is_busy_wait(dev)) | 297 | if (!i2c_is_busy_wait(dev)) |
298 | goto err; | 298 | goto err; |
299 | status = i2c_get_status(dev); | 299 | status = i2c_get_status(dev); |
300 | if (i2c_is_error(status)) | 300 | if (i2c_is_error(status)) |
301 | goto err; | 301 | goto err; |
302 | /* ensure that the bus is idle for at least one bit slot */ | 302 | /* ensure that the bus is idle for at least one bit slot */ |
@@ -335,6 +335,20 @@ static int attach_inform(struct i2c_client *client) | |||
335 | d1printk( "%s i2c attach [addr=0x%x,client=%s]\n", | 335 | d1printk( "%s i2c attach [addr=0x%x,client=%s]\n", |
336 | client->driver->name, client->addr, client->name); | 336 | client->driver->name, client->addr, client->name); |
337 | 337 | ||
338 | /* Am I an i2c remote control? */ | ||
339 | |||
340 | switch (client->addr) { | ||
341 | case 0x7a: | ||
342 | case 0x47: | ||
343 | { | ||
344 | struct IR_i2c *ir = i2c_get_clientdata(client); | ||
345 | d1printk("%s i2c IR detected (%s).\n", | ||
346 | client->driver->name,ir->phys); | ||
347 | saa7134_set_i2c_ir(dev,ir); | ||
348 | break; | ||
349 | } | ||
350 | } | ||
351 | |||
338 | if (!client->driver->command) | 352 | if (!client->driver->command) |
339 | return 0; | 353 | return 0; |
340 | 354 | ||
@@ -348,12 +362,12 @@ static int attach_inform(struct i2c_client *client) | |||
348 | 362 | ||
349 | client->driver->command(client, TUNER_SET_TYPE_ADDR, &tun_setup); | 363 | client->driver->command(client, TUNER_SET_TYPE_ADDR, &tun_setup); |
350 | } | 364 | } |
351 | } | 365 | } |
352 | 366 | ||
353 | if (tuner != UNSET) { | 367 | if (tuner != UNSET) { |
354 | 368 | ||
355 | tun_setup.type = tuner; | 369 | tun_setup.type = tuner; |
356 | tun_setup.addr = saa7134_boards[dev->board].tuner_addr; | 370 | tun_setup.addr = saa7134_boards[dev->board].tuner_addr; |
357 | 371 | ||
358 | if ((tun_setup.addr == ADDR_UNSET)||(tun_setup.addr == client->addr)) { | 372 | if ((tun_setup.addr == ADDR_UNSET)||(tun_setup.addr == client->addr)) { |
359 | 373 | ||
@@ -361,11 +375,11 @@ static int attach_inform(struct i2c_client *client) | |||
361 | 375 | ||
362 | client->driver->command(client,TUNER_SET_TYPE_ADDR, &tun_setup); | 376 | client->driver->command(client,TUNER_SET_TYPE_ADDR, &tun_setup); |
363 | } | 377 | } |
364 | } | 378 | } |
365 | 379 | ||
366 | client->driver->command(client, TDA9887_SET_CONFIG, &conf); | 380 | client->driver->command(client, TDA9887_SET_CONFIG, &conf); |
367 | 381 | ||
368 | return 0; | 382 | return 0; |
369 | } | 383 | } |
370 | 384 | ||
371 | static struct i2c_algorithm saa7134_algo = { | 385 | static struct i2c_algorithm saa7134_algo = { |
diff --git a/drivers/media/video/saa7134/saa7134-input.c b/drivers/media/video/saa7134/saa7134-input.c index 242cb235cf92..329accda6d45 100644 --- a/drivers/media/video/saa7134/saa7134-input.c +++ b/drivers/media/video/saa7134/saa7134-input.c | |||
@@ -39,6 +39,8 @@ MODULE_PARM_DESC(ir_debug,"enable debug messages [IR]"); | |||
39 | 39 | ||
40 | #define dprintk(fmt, arg...) if (ir_debug) \ | 40 | #define dprintk(fmt, arg...) if (ir_debug) \ |
41 | printk(KERN_DEBUG "%s/ir: " fmt, dev->name , ## arg) | 41 | printk(KERN_DEBUG "%s/ir: " fmt, dev->name , ## arg) |
42 | #define i2cdprintk(fmt, arg...) if (ir_debug) \ | ||
43 | printk(KERN_DEBUG "%s/ir: " fmt, ir->c.name , ## arg) | ||
42 | 44 | ||
43 | /* ---------------------------------------------------------------------- */ | 45 | /* ---------------------------------------------------------------------- */ |
44 | 46 | ||
@@ -114,24 +116,24 @@ static IR_KEYTAB_TYPE cinergy_codes[IR_KEYTAB_SIZE] = { | |||
114 | /* Alfons Geser <a.geser@cox.net> | 116 | /* Alfons Geser <a.geser@cox.net> |
115 | * updates from Job D. R. Borges <jobdrb@ig.com.br> */ | 117 | * updates from Job D. R. Borges <jobdrb@ig.com.br> */ |
116 | static IR_KEYTAB_TYPE eztv_codes[IR_KEYTAB_SIZE] = { | 118 | static IR_KEYTAB_TYPE eztv_codes[IR_KEYTAB_SIZE] = { |
117 | [ 18 ] = KEY_POWER, | 119 | [ 18 ] = KEY_POWER, |
118 | [ 1 ] = KEY_TV, // DVR | 120 | [ 1 ] = KEY_TV, // DVR |
119 | [ 21 ] = KEY_DVD, // DVD | 121 | [ 21 ] = KEY_DVD, // DVD |
120 | [ 23 ] = KEY_AUDIO, // music | 122 | [ 23 ] = KEY_AUDIO, // music |
121 | // DVR mode / DVD mode / music mode | 123 | // DVR mode / DVD mode / music mode |
122 | 124 | ||
123 | [ 27 ] = KEY_MUTE, // mute | 125 | [ 27 ] = KEY_MUTE, // mute |
124 | [ 2 ] = KEY_LANGUAGE, // MTS/SAP / audio / autoseek | 126 | [ 2 ] = KEY_LANGUAGE, // MTS/SAP / audio / autoseek |
125 | [ 30 ] = KEY_SUBTITLE, // closed captioning / subtitle / seek | 127 | [ 30 ] = KEY_SUBTITLE, // closed captioning / subtitle / seek |
126 | [ 22 ] = KEY_ZOOM, // full screen | 128 | [ 22 ] = KEY_ZOOM, // full screen |
127 | [ 28 ] = KEY_VIDEO, // video source / eject / delall | 129 | [ 28 ] = KEY_VIDEO, // video source / eject / delall |
128 | [ 29 ] = KEY_RESTART, // playback / angle / del | 130 | [ 29 ] = KEY_RESTART, // playback / angle / del |
129 | [ 47 ] = KEY_SEARCH, // scan / menu / playlist | 131 | [ 47 ] = KEY_SEARCH, // scan / menu / playlist |
130 | [ 48 ] = KEY_CHANNEL, // CH surfing / bookmark / memo | 132 | [ 48 ] = KEY_CHANNEL, // CH surfing / bookmark / memo |
131 | 133 | ||
132 | [ 49 ] = KEY_HELP, // help | 134 | [ 49 ] = KEY_HELP, // help |
133 | [ 50 ] = KEY_MODE, // num/memo | 135 | [ 50 ] = KEY_MODE, // num/memo |
134 | [ 51 ] = KEY_ESC, // cancel | 136 | [ 51 ] = KEY_ESC, // cancel |
135 | 137 | ||
136 | [ 12 ] = KEY_UP, // up | 138 | [ 12 ] = KEY_UP, // up |
137 | [ 16 ] = KEY_DOWN, // down | 139 | [ 16 ] = KEY_DOWN, // down |
@@ -148,24 +150,24 @@ static IR_KEYTAB_TYPE eztv_codes[IR_KEYTAB_SIZE] = { | |||
148 | [ 45 ] = KEY_PLAY, // play | 150 | [ 45 ] = KEY_PLAY, // play |
149 | [ 46 ] = KEY_SHUFFLE, // snapshot / shuffle | 151 | [ 46 ] = KEY_SHUFFLE, // snapshot / shuffle |
150 | 152 | ||
151 | [ 0 ] = KEY_KP0, | 153 | [ 0 ] = KEY_KP0, |
152 | [ 5 ] = KEY_KP1, | 154 | [ 5 ] = KEY_KP1, |
153 | [ 6 ] = KEY_KP2, | 155 | [ 6 ] = KEY_KP2, |
154 | [ 7 ] = KEY_KP3, | 156 | [ 7 ] = KEY_KP3, |
155 | [ 9 ] = KEY_KP4, | 157 | [ 9 ] = KEY_KP4, |
156 | [ 10 ] = KEY_KP5, | 158 | [ 10 ] = KEY_KP5, |
157 | [ 11 ] = KEY_KP6, | 159 | [ 11 ] = KEY_KP6, |
158 | [ 13 ] = KEY_KP7, | 160 | [ 13 ] = KEY_KP7, |
159 | [ 14 ] = KEY_KP8, | 161 | [ 14 ] = KEY_KP8, |
160 | [ 15 ] = KEY_KP9, | 162 | [ 15 ] = KEY_KP9, |
161 | 163 | ||
162 | [ 42 ] = KEY_VOLUMEUP, | 164 | [ 42 ] = KEY_VOLUMEUP, |
163 | [ 17 ] = KEY_VOLUMEDOWN, | 165 | [ 17 ] = KEY_VOLUMEDOWN, |
164 | [ 24 ] = KEY_CHANNELUP, // CH.tracking up | 166 | [ 24 ] = KEY_CHANNELUP, // CH.tracking up |
165 | [ 25 ] = KEY_CHANNELDOWN, // CH.tracking down | 167 | [ 25 ] = KEY_CHANNELDOWN, // CH.tracking down |
166 | 168 | ||
167 | [ 19 ] = KEY_KPENTER, // enter | 169 | [ 19 ] = KEY_KPENTER, // enter |
168 | [ 33 ] = KEY_KPDOT, // . (decimal dot) | 170 | [ 33 ] = KEY_KPDOT, // . (decimal dot) |
169 | }; | 171 | }; |
170 | 172 | ||
171 | static IR_KEYTAB_TYPE avacssmart_codes[IR_KEYTAB_SIZE] = { | 173 | static IR_KEYTAB_TYPE avacssmart_codes[IR_KEYTAB_SIZE] = { |
@@ -401,7 +403,183 @@ static IR_KEYTAB_TYPE manli_codes[IR_KEYTAB_SIZE] = { | |||
401 | 403 | ||
402 | // 0x1d unused ? | 404 | // 0x1d unused ? |
403 | }; | 405 | }; |
404 | /* ---------------------------------------------------------------------- */ | 406 | |
407 | |||
408 | /* Mike Baikov <mike@baikov.com> */ | ||
409 | static IR_KEYTAB_TYPE gotview7135_codes[IR_KEYTAB_SIZE] = { | ||
410 | |||
411 | [ 33 ] = KEY_POWER, | ||
412 | [ 105] = KEY_TV, | ||
413 | [ 51 ] = KEY_KP0, | ||
414 | [ 81 ] = KEY_KP1, | ||
415 | [ 49 ] = KEY_KP2, | ||
416 | [ 113] = KEY_KP3, | ||
417 | [ 59 ] = KEY_KP4, | ||
418 | [ 88 ] = KEY_KP5, | ||
419 | [ 65 ] = KEY_KP6, | ||
420 | [ 72 ] = KEY_KP7, | ||
421 | [ 48 ] = KEY_KP8, | ||
422 | [ 83 ] = KEY_KP9, | ||
423 | [ 115] = KEY_AGAIN, /* LOOP */ | ||
424 | [ 10 ] = KEY_AUDIO, | ||
425 | [ 97 ] = KEY_PRINT, /* PREVIEW */ | ||
426 | [ 122] = KEY_VIDEO, | ||
427 | [ 32 ] = KEY_CHANNELUP, | ||
428 | [ 64 ] = KEY_CHANNELDOWN, | ||
429 | [ 24 ] = KEY_VOLUMEDOWN, | ||
430 | [ 80 ] = KEY_VOLUMEUP, | ||
431 | [ 16 ] = KEY_MUTE, | ||
432 | [ 74 ] = KEY_SEARCH, | ||
433 | [ 123] = KEY_SHUFFLE, /* SNAPSHOT */ | ||
434 | [ 34 ] = KEY_RECORD, | ||
435 | [ 98 ] = KEY_STOP, | ||
436 | [ 120] = KEY_PLAY, | ||
437 | [ 57 ] = KEY_REWIND, | ||
438 | [ 89 ] = KEY_PAUSE, | ||
439 | [ 25 ] = KEY_FORWARD, | ||
440 | [ 9 ] = KEY_ZOOM, | ||
441 | |||
442 | [ 82 ] = KEY_F21, /* LIVE TIMESHIFT */ | ||
443 | [ 26 ] = KEY_F22, /* MIN TIMESHIFT */ | ||
444 | [ 58 ] = KEY_F23, /* TIMESHIFT */ | ||
445 | [ 112] = KEY_F24, /* NORMAL TIMESHIFT */ | ||
446 | }; | ||
447 | |||
448 | static IR_KEYTAB_TYPE ir_codes_purpletv[IR_KEYTAB_SIZE] = { | ||
449 | [ 0x3 ] = KEY_POWER, | ||
450 | [ 0x6f ] = KEY_MUTE, | ||
451 | [ 0x10 ] = KEY_BACKSPACE, /* Recall */ | ||
452 | |||
453 | [ 0x11 ] = KEY_KP0, | ||
454 | [ 0x4 ] = KEY_KP1, | ||
455 | [ 0x5 ] = KEY_KP2, | ||
456 | [ 0x6 ] = KEY_KP3, | ||
457 | [ 0x8 ] = KEY_KP4, | ||
458 | [ 0x9 ] = KEY_KP5, | ||
459 | [ 0xa ] = KEY_KP6, | ||
460 | [ 0xc ] = KEY_KP7, | ||
461 | [ 0xd ] = KEY_KP8, | ||
462 | [ 0xe ] = KEY_KP9, | ||
463 | [ 0x12 ] = KEY_KPDOT, /* 100+ */ | ||
464 | |||
465 | [ 0x7 ] = KEY_VOLUMEUP, | ||
466 | [ 0xb ] = KEY_VOLUMEDOWN, | ||
467 | [ 0x1a ] = KEY_KPPLUS, | ||
468 | [ 0x18 ] = KEY_KPMINUS, | ||
469 | [ 0x15 ] = KEY_UP, | ||
470 | [ 0x1d ] = KEY_DOWN, | ||
471 | [ 0xf ] = KEY_CHANNELUP, | ||
472 | [ 0x13 ] = KEY_CHANNELDOWN, | ||
473 | [ 0x48 ] = KEY_ZOOM, | ||
474 | |||
475 | [ 0x1b ] = KEY_VIDEO, /* Video source */ | ||
476 | [ 0x49 ] = KEY_LANGUAGE, /* MTS Select */ | ||
477 | [ 0x19 ] = KEY_SEARCH, /* Auto Scan */ | ||
478 | |||
479 | [ 0x4b ] = KEY_RECORD, | ||
480 | [ 0x46 ] = KEY_PLAY, | ||
481 | [ 0x45 ] = KEY_PAUSE, /* Pause */ | ||
482 | [ 0x44 ] = KEY_STOP, | ||
483 | [ 0x40 ] = KEY_FORWARD, /* Forward ? */ | ||
484 | [ 0x42 ] = KEY_REWIND, /* Backward ? */ | ||
485 | |||
486 | }; | ||
487 | |||
488 | static IR_KEYTAB_TYPE ir_codes_pinnacle[IR_KEYTAB_SIZE] = { | ||
489 | [ 0x59 ] = KEY_MUTE, | ||
490 | [ 0x4a ] = KEY_POWER, | ||
491 | |||
492 | [ 0x18 ] = KEY_TEXT, | ||
493 | [ 0x26 ] = KEY_TV, | ||
494 | [ 0x3d ] = KEY_PRINT, | ||
495 | |||
496 | [ 0x48 ] = KEY_RED, | ||
497 | [ 0x04 ] = KEY_GREEN, | ||
498 | [ 0x11 ] = KEY_YELLOW, | ||
499 | [ 0x00 ] = KEY_BLUE, | ||
500 | |||
501 | [ 0x2d ] = KEY_VOLUMEUP, | ||
502 | [ 0x1e ] = KEY_VOLUMEDOWN, | ||
503 | |||
504 | [ 0x49 ] = KEY_MENU, | ||
505 | |||
506 | [ 0x16 ] = KEY_CHANNELUP, | ||
507 | [ 0x17 ] = KEY_CHANNELDOWN, | ||
508 | |||
509 | [ 0x20 ] = KEY_UP, | ||
510 | [ 0x21 ] = KEY_DOWN, | ||
511 | [ 0x22 ] = KEY_LEFT, | ||
512 | [ 0x23 ] = KEY_RIGHT, | ||
513 | [ 0x0d ] = KEY_SELECT, | ||
514 | |||
515 | |||
516 | |||
517 | [ 0x08 ] = KEY_BACK, | ||
518 | [ 0x07 ] = KEY_REFRESH, | ||
519 | |||
520 | [ 0x2f ] = KEY_ZOOM, | ||
521 | [ 0x29 ] = KEY_RECORD, | ||
522 | |||
523 | [ 0x4b ] = KEY_PAUSE, | ||
524 | [ 0x4d ] = KEY_REWIND, | ||
525 | [ 0x2e ] = KEY_PLAY, | ||
526 | [ 0x4e ] = KEY_FORWARD, | ||
527 | [ 0x53 ] = KEY_PREVIOUS, | ||
528 | [ 0x4c ] = KEY_STOP, | ||
529 | [ 0x54 ] = KEY_NEXT, | ||
530 | |||
531 | [ 0x69 ] = KEY_KP0, | ||
532 | [ 0x6a ] = KEY_KP1, | ||
533 | [ 0x6b ] = KEY_KP2, | ||
534 | [ 0x6c ] = KEY_KP3, | ||
535 | [ 0x6d ] = KEY_KP4, | ||
536 | [ 0x6e ] = KEY_KP5, | ||
537 | [ 0x6f ] = KEY_KP6, | ||
538 | [ 0x70 ] = KEY_KP7, | ||
539 | [ 0x71 ] = KEY_KP8, | ||
540 | [ 0x72 ] = KEY_KP9, | ||
541 | |||
542 | [ 0x74 ] = KEY_CHANNEL, | ||
543 | [ 0x0a ] = KEY_BACKSPACE, | ||
544 | }; | ||
545 | |||
546 | /* Mapping for the 28 key remote control as seen at | ||
547 | http://www.sednacomputer.com/photo/cardbus-tv.jpg | ||
548 | Pavel Mihaylov <bin@bash.info> */ | ||
549 | static IR_KEYTAB_TYPE pctv_sedna_codes[IR_KEYTAB_SIZE] = { | ||
550 | [ 0 ] = KEY_KP0, | ||
551 | [ 1 ] = KEY_KP1, | ||
552 | [ 2 ] = KEY_KP2, | ||
553 | [ 3 ] = KEY_KP3, | ||
554 | [ 4 ] = KEY_KP4, | ||
555 | [ 5 ] = KEY_KP5, | ||
556 | [ 6 ] = KEY_KP6, | ||
557 | [ 7 ] = KEY_KP7, | ||
558 | [ 8 ] = KEY_KP8, | ||
559 | [ 9 ] = KEY_KP9, | ||
560 | |||
561 | [ 0x0a ] = KEY_AGAIN, /* Recall */ | ||
562 | [ 0x0b ] = KEY_CHANNELUP, | ||
563 | [ 0x0c ] = KEY_VOLUMEUP, | ||
564 | [ 0x0d ] = KEY_MODE, /* Stereo */ | ||
565 | [ 0x0e ] = KEY_STOP, | ||
566 | [ 0x0f ] = KEY_PREVIOUSSONG, | ||
567 | [ 0x10 ] = KEY_ZOOM, | ||
568 | [ 0x11 ] = KEY_TUNER, /* Source */ | ||
569 | [ 0x12 ] = KEY_POWER, | ||
570 | [ 0x13 ] = KEY_MUTE, | ||
571 | [ 0x15 ] = KEY_CHANNELDOWN, | ||
572 | [ 0x18 ] = KEY_VOLUMEDOWN, | ||
573 | [ 0x19 ] = KEY_SHUFFLE, /* Snapshot */ | ||
574 | [ 0x1a ] = KEY_NEXTSONG, | ||
575 | [ 0x1b ] = KEY_TEXT, /* Time Shift */ | ||
576 | [ 0x1c ] = KEY_RADIO, /* FM Radio */ | ||
577 | [ 0x1d ] = KEY_RECORD, | ||
578 | [ 0x1e ] = KEY_PAUSE, | ||
579 | }; | ||
580 | |||
581 | |||
582 | /* -------------------- GPIO generic keycode builder -------------------- */ | ||
405 | 583 | ||
406 | static int build_key(struct saa7134_dev *dev) | 584 | static int build_key(struct saa7134_dev *dev) |
407 | { | 585 | { |
@@ -413,13 +591,13 @@ static int build_key(struct saa7134_dev *dev) | |||
413 | saa_setb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN); | 591 | saa_setb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN); |
414 | 592 | ||
415 | gpio = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2); | 593 | gpio = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2); |
416 | if (ir->polling) { | 594 | if (ir->polling) { |
417 | if (ir->last_gpio == gpio) | 595 | if (ir->last_gpio == gpio) |
418 | return 0; | 596 | return 0; |
419 | ir->last_gpio = gpio; | 597 | ir->last_gpio = gpio; |
420 | } | 598 | } |
421 | 599 | ||
422 | data = ir_extract_bits(gpio, ir->mask_keycode); | 600 | data = ir_extract_bits(gpio, ir->mask_keycode); |
423 | dprintk("build_key gpio=0x%x mask=0x%x data=%d\n", | 601 | dprintk("build_key gpio=0x%x mask=0x%x data=%d\n", |
424 | gpio, ir->mask_keycode, data); | 602 | gpio, ir->mask_keycode, data); |
425 | 603 | ||
@@ -432,13 +610,87 @@ static int build_key(struct saa7134_dev *dev) | |||
432 | return 0; | 610 | return 0; |
433 | } | 611 | } |
434 | 612 | ||
435 | /* ---------------------------------------------------------------------- */ | 613 | /* --------------------- Chip specific I2C key builders ----------------- */ |
614 | |||
615 | static int get_key_purpletv(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) | ||
616 | { | ||
617 | unsigned char b; | ||
618 | |||
619 | /* poll IR chip */ | ||
620 | if (1 != i2c_master_recv(&ir->c,&b,1)) { | ||
621 | i2cdprintk("read error\n"); | ||
622 | return -EIO; | ||
623 | } | ||
624 | |||
625 | /* no button press */ | ||
626 | if (b==0) | ||
627 | return 0; | ||
628 | |||
629 | /* repeating */ | ||
630 | if (b & 0x80) | ||
631 | return 1; | ||
632 | |||
633 | *ir_key = b; | ||
634 | *ir_raw = b; | ||
635 | return 1; | ||
636 | } | ||
637 | |||
638 | /* The new pinnacle PCTV remote (with the colored buttons) | ||
639 | * | ||
640 | * Ricardo Cerqueira <v4l@cerqueira.org> | ||
641 | */ | ||
642 | |||
643 | static int get_key_pinnacle(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) | ||
644 | { | ||
645 | unsigned char b[4]; | ||
646 | unsigned int start = 0,parity = 0,code = 0; | ||
647 | |||
648 | /* poll IR chip */ | ||
649 | if (4 != i2c_master_recv(&ir->c,b,4)) { | ||
650 | i2cdprintk("read error\n"); | ||
651 | return -EIO; | ||
652 | } | ||
653 | |||
654 | for (start = 0; start<4; start++) { | ||
655 | if (b[start] == 0x80) { | ||
656 | code=b[(start+3)%4]; | ||
657 | parity=b[(start+2)%4]; | ||
658 | } | ||
659 | } | ||
660 | |||
661 | /* Empty Request */ | ||
662 | if (parity==0) | ||
663 | return 0; | ||
664 | |||
665 | /* Repeating... */ | ||
666 | if (ir->old == parity) | ||
667 | return 0; | ||
668 | |||
669 | |||
670 | ir->old = parity; | ||
671 | |||
672 | /* Reduce code value to fit inside IR_KEYTAB_SIZE | ||
673 | * | ||
674 | * this is the only value that results in 42 unique | ||
675 | * codes < 128 | ||
676 | */ | ||
677 | |||
678 | code %= 0x88; | ||
679 | |||
680 | *ir_raw = code; | ||
681 | *ir_key = code; | ||
682 | |||
683 | i2cdprintk("Pinnacle PCTV key %02x\n", code); | ||
684 | |||
685 | return 1; | ||
686 | } | ||
687 | |||
436 | 688 | ||
437 | void saa7134_input_irq(struct saa7134_dev *dev) | 689 | void saa7134_input_irq(struct saa7134_dev *dev) |
438 | { | 690 | { |
439 | struct saa7134_ir *ir = dev->remote; | 691 | struct saa7134_ir *ir = dev->remote; |
440 | 692 | ||
441 | if (!ir->polling) | 693 | if (!ir->polling) |
442 | build_key(dev); | 694 | build_key(dev); |
443 | } | 695 | } |
444 | 696 | ||
@@ -464,7 +716,7 @@ int saa7134_input_init1(struct saa7134_dev *dev) | |||
464 | int polling = 0; | 716 | int polling = 0; |
465 | int ir_type = IR_TYPE_OTHER; | 717 | int ir_type = IR_TYPE_OTHER; |
466 | 718 | ||
467 | if (!dev->has_remote) | 719 | if (dev->has_remote != SAA7134_REMOTE_GPIO) |
468 | return -ENODEV; | 720 | return -ENODEV; |
469 | if (disable_ir) | 721 | if (disable_ir) |
470 | return -ENODEV; | 722 | return -ENODEV; |
@@ -473,7 +725,8 @@ int saa7134_input_init1(struct saa7134_dev *dev) | |||
473 | switch (dev->board) { | 725 | switch (dev->board) { |
474 | case SAA7134_BOARD_FLYVIDEO2000: | 726 | case SAA7134_BOARD_FLYVIDEO2000: |
475 | case SAA7134_BOARD_FLYVIDEO3000: | 727 | case SAA7134_BOARD_FLYVIDEO3000: |
476 | case SAA7134_BOARD_FLYTVPLATINUM_FM: | 728 | case SAA7134_BOARD_FLYTVPLATINUM_FM: |
729 | case SAA7134_BOARD_FLYTVPLATINUM_MINI2: | ||
477 | ir_codes = flyvideo_codes; | 730 | ir_codes = flyvideo_codes; |
478 | mask_keycode = 0xEC00000; | 731 | mask_keycode = 0xEC00000; |
479 | mask_keydown = 0x0040000; | 732 | mask_keydown = 0x0040000; |
@@ -514,14 +767,33 @@ int saa7134_input_init1(struct saa7134_dev *dev) | |||
514 | saa_setb(SAA7134_GPIO_GPMODE0, 0x4); | 767 | saa_setb(SAA7134_GPIO_GPMODE0, 0x4); |
515 | saa_setb(SAA7134_GPIO_GPSTATUS0, 0x4); | 768 | saa_setb(SAA7134_GPIO_GPSTATUS0, 0x4); |
516 | break; | 769 | break; |
770 | case SAA7134_BOARD_KWORLD_TERMINATOR: | ||
771 | ir_codes = avacssmart_codes; | ||
772 | mask_keycode = 0x00001f; | ||
773 | mask_keyup = 0x000060; | ||
774 | polling = 50; // ms | ||
775 | break; | ||
517 | case SAA7134_BOARD_MANLI_MTV001: | 776 | case SAA7134_BOARD_MANLI_MTV001: |
518 | case SAA7134_BOARD_MANLI_MTV002: | 777 | case SAA7134_BOARD_MANLI_MTV002: |
778 | case SAA7134_BOARD_BEHOLD_409FM: | ||
519 | ir_codes = manli_codes; | 779 | ir_codes = manli_codes; |
520 | mask_keycode = 0x001f00; | 780 | mask_keycode = 0x001f00; |
521 | mask_keyup = 0x004000; | 781 | mask_keyup = 0x004000; |
522 | mask_keydown = 0x002000; | ||
523 | polling = 50; // ms | 782 | polling = 50; // ms |
524 | break; | 783 | break; |
784 | case SAA7134_BOARD_SEDNA_PC_TV_CARDBUS: | ||
785 | ir_codes = pctv_sedna_codes; | ||
786 | mask_keycode = 0x001f00; | ||
787 | mask_keyup = 0x004000; | ||
788 | polling = 50; // ms | ||
789 | break; | ||
790 | case SAA7134_BOARD_GOTVIEW_7135: | ||
791 | ir_codes = gotview7135_codes; | ||
792 | mask_keycode = 0x0003EC; | ||
793 | mask_keyup = 0x008000; | ||
794 | mask_keydown = 0x000010; | ||
795 | polling = 50; // ms | ||
796 | break; | ||
525 | case SAA7134_BOARD_VIDEOMATE_TV_PVR: | 797 | case SAA7134_BOARD_VIDEOMATE_TV_PVR: |
526 | case SAA7134_BOARD_VIDEOMATE_TV_GOLD_PLUSII: | 798 | case SAA7134_BOARD_VIDEOMATE_TV_GOLD_PLUSII: |
527 | ir_codes = videomate_tv_pvr_codes; | 799 | ir_codes = videomate_tv_pvr_codes; |
@@ -529,6 +801,12 @@ int saa7134_input_init1(struct saa7134_dev *dev) | |||
529 | mask_keyup = 0x400000; | 801 | mask_keyup = 0x400000; |
530 | polling = 50; // ms | 802 | polling = 50; // ms |
531 | break; | 803 | break; |
804 | case SAA7134_BOARD_VIDEOMATE_DVBT_300: | ||
805 | case SAA7134_BOARD_VIDEOMATE_DVBT_200: | ||
806 | ir_codes = videomate_tv_pvr_codes; | ||
807 | mask_keycode = 0x003F00; | ||
808 | mask_keyup = 0x040000; | ||
809 | break; | ||
532 | } | 810 | } |
533 | if (NULL == ir_codes) { | 811 | if (NULL == ir_codes) { |
534 | printk("%s: Oops: IR config error [card=%d]\n", | 812 | printk("%s: Oops: IR config error [card=%d]\n", |
@@ -548,7 +826,7 @@ int saa7134_input_init1(struct saa7134_dev *dev) | |||
548 | ir->mask_keycode = mask_keycode; | 826 | ir->mask_keycode = mask_keycode; |
549 | ir->mask_keydown = mask_keydown; | 827 | ir->mask_keydown = mask_keydown; |
550 | ir->mask_keyup = mask_keyup; | 828 | ir->mask_keyup = mask_keyup; |
551 | ir->polling = polling; | 829 | ir->polling = polling; |
552 | 830 | ||
553 | /* init input device */ | 831 | /* init input device */ |
554 | snprintf(ir->name, sizeof(ir->name), "saa7134 IR (%s)", | 832 | snprintf(ir->name, sizeof(ir->name), "saa7134 IR (%s)", |
@@ -596,6 +874,31 @@ void saa7134_input_fini(struct saa7134_dev *dev) | |||
596 | dev->remote = NULL; | 874 | dev->remote = NULL; |
597 | } | 875 | } |
598 | 876 | ||
877 | void saa7134_set_i2c_ir(struct saa7134_dev *dev, struct IR_i2c *ir) | ||
878 | { | ||
879 | if (disable_ir) { | ||
880 | dprintk("Found supported i2c remote, but IR has been disabled\n"); | ||
881 | ir->get_key=NULL; | ||
882 | return; | ||
883 | } | ||
884 | |||
885 | switch (dev->board) { | ||
886 | case SAA7134_BOARD_PINNACLE_PCTV_110i: | ||
887 | snprintf(ir->c.name, sizeof(ir->c.name), "Pinnacle PCTV"); | ||
888 | ir->get_key = get_key_pinnacle; | ||
889 | ir->ir_codes = ir_codes_pinnacle; | ||
890 | break; | ||
891 | case SAA7134_BOARD_UPMOST_PURPLE_TV: | ||
892 | snprintf(ir->c.name, sizeof(ir->c.name), "Purple TV"); | ||
893 | ir->get_key = get_key_purpletv; | ||
894 | ir->ir_codes = ir_codes_purpletv; | ||
895 | break; | ||
896 | default: | ||
897 | dprintk("Shouldn't get here: Unknown board %x for I2C IR?\n",dev->board); | ||
898 | break; | ||
899 | } | ||
900 | |||
901 | } | ||
599 | /* ---------------------------------------------------------------------- | 902 | /* ---------------------------------------------------------------------- |
600 | * Local variables: | 903 | * Local variables: |
601 | * c-basic-offset: 8 | 904 | * c-basic-offset: 8 |
diff --git a/drivers/media/video/saa7134/saa7134-oss.c b/drivers/media/video/saa7134/saa7134-oss.c index c20630c82f1c..fd53dfcc1644 100644 --- a/drivers/media/video/saa7134/saa7134-oss.c +++ b/drivers/media/video/saa7134/saa7134-oss.c | |||
@@ -44,6 +44,7 @@ MODULE_PARM_DESC(oss_rate,"sample rate (valid are: 32000,48000)"); | |||
44 | #define dprintk(fmt, arg...) if (oss_debug) \ | 44 | #define dprintk(fmt, arg...) if (oss_debug) \ |
45 | printk(KERN_DEBUG "%s/oss: " fmt, dev->name , ## arg) | 45 | printk(KERN_DEBUG "%s/oss: " fmt, dev->name , ## arg) |
46 | 46 | ||
47 | |||
47 | /* ------------------------------------------------------------------ */ | 48 | /* ------------------------------------------------------------------ */ |
48 | 49 | ||
49 | static int dsp_buffer_conf(struct saa7134_dev *dev, int blksize, int blocks) | 50 | static int dsp_buffer_conf(struct saa7134_dev *dev, int blksize, int blocks) |
@@ -58,12 +59,12 @@ static int dsp_buffer_conf(struct saa7134_dev *dev, int blksize, int blocks) | |||
58 | if ((blksize * blocks) > 1024*1024) | 59 | if ((blksize * blocks) > 1024*1024) |
59 | blocks = 1024*1024 / blksize; | 60 | blocks = 1024*1024 / blksize; |
60 | 61 | ||
61 | dev->oss.blocks = blocks; | 62 | dev->dmasound.blocks = blocks; |
62 | dev->oss.blksize = blksize; | 63 | dev->dmasound.blksize = blksize; |
63 | dev->oss.bufsize = blksize * blocks; | 64 | dev->dmasound.bufsize = blksize * blocks; |
64 | 65 | ||
65 | dprintk("buffer config: %d blocks / %d bytes, %d kB total\n", | 66 | dprintk("buffer config: %d blocks / %d bytes, %d kB total\n", |
66 | blocks,blksize,blksize * blocks / 1024); | 67 | blocks,blksize,blksize * blocks / 1024); |
67 | return 0; | 68 | return 0; |
68 | } | 69 | } |
69 | 70 | ||
@@ -71,11 +72,11 @@ static int dsp_buffer_init(struct saa7134_dev *dev) | |||
71 | { | 72 | { |
72 | int err; | 73 | int err; |
73 | 74 | ||
74 | if (!dev->oss.bufsize) | 75 | if (!dev->dmasound.bufsize) |
75 | BUG(); | 76 | BUG(); |
76 | videobuf_dma_init(&dev->oss.dma); | 77 | videobuf_dma_init(&dev->dmasound.dma); |
77 | err = videobuf_dma_init_kernel(&dev->oss.dma, PCI_DMA_FROMDEVICE, | 78 | err = videobuf_dma_init_kernel(&dev->dmasound.dma, PCI_DMA_FROMDEVICE, |
78 | (dev->oss.bufsize + PAGE_SIZE) >> PAGE_SHIFT); | 79 | (dev->dmasound.bufsize + PAGE_SIZE) >> PAGE_SHIFT); |
79 | if (0 != err) | 80 | if (0 != err) |
80 | return err; | 81 | return err; |
81 | return 0; | 82 | return 0; |
@@ -83,26 +84,26 @@ static int dsp_buffer_init(struct saa7134_dev *dev) | |||
83 | 84 | ||
84 | static int dsp_buffer_free(struct saa7134_dev *dev) | 85 | static int dsp_buffer_free(struct saa7134_dev *dev) |
85 | { | 86 | { |
86 | if (!dev->oss.blksize) | 87 | if (!dev->dmasound.blksize) |
87 | BUG(); | 88 | BUG(); |
88 | videobuf_dma_free(&dev->oss.dma); | 89 | videobuf_dma_free(&dev->dmasound.dma); |
89 | dev->oss.blocks = 0; | 90 | dev->dmasound.blocks = 0; |
90 | dev->oss.blksize = 0; | 91 | dev->dmasound.blksize = 0; |
91 | dev->oss.bufsize = 0; | 92 | dev->dmasound.bufsize = 0; |
92 | return 0; | 93 | return 0; |
93 | } | 94 | } |
94 | 95 | ||
95 | static void dsp_dma_start(struct saa7134_dev *dev) | 96 | static void dsp_dma_start(struct saa7134_dev *dev) |
96 | { | 97 | { |
97 | dev->oss.dma_blk = 0; | 98 | dev->dmasound.dma_blk = 0; |
98 | dev->oss.dma_running = 1; | 99 | dev->dmasound.dma_running = 1; |
99 | saa7134_set_dmabits(dev); | 100 | saa7134_set_dmabits(dev); |
100 | } | 101 | } |
101 | 102 | ||
102 | static void dsp_dma_stop(struct saa7134_dev *dev) | 103 | static void dsp_dma_stop(struct saa7134_dev *dev) |
103 | { | 104 | { |
104 | dev->oss.dma_blk = -1; | 105 | dev->dmasound.dma_blk = -1; |
105 | dev->oss.dma_running = 0; | 106 | dev->dmasound.dma_running = 0; |
106 | saa7134_set_dmabits(dev); | 107 | saa7134_set_dmabits(dev); |
107 | } | 108 | } |
108 | 109 | ||
@@ -113,18 +114,18 @@ static int dsp_rec_start(struct saa7134_dev *dev) | |||
113 | unsigned long flags; | 114 | unsigned long flags; |
114 | 115 | ||
115 | /* prepare buffer */ | 116 | /* prepare buffer */ |
116 | if (0 != (err = videobuf_dma_pci_map(dev->pci,&dev->oss.dma))) | 117 | if (0 != (err = videobuf_dma_pci_map(dev->pci,&dev->dmasound.dma))) |
117 | return err; | 118 | return err; |
118 | if (0 != (err = saa7134_pgtable_alloc(dev->pci,&dev->oss.pt))) | 119 | if (0 != (err = saa7134_pgtable_alloc(dev->pci,&dev->dmasound.pt))) |
119 | goto fail1; | 120 | goto fail1; |
120 | if (0 != (err = saa7134_pgtable_build(dev->pci,&dev->oss.pt, | 121 | if (0 != (err = saa7134_pgtable_build(dev->pci,&dev->dmasound.pt, |
121 | dev->oss.dma.sglist, | 122 | dev->dmasound.dma.sglist, |
122 | dev->oss.dma.sglen, | 123 | dev->dmasound.dma.sglen, |
123 | 0))) | 124 | 0))) |
124 | goto fail2; | 125 | goto fail2; |
125 | 126 | ||
126 | /* sample format */ | 127 | /* sample format */ |
127 | switch (dev->oss.afmt) { | 128 | switch (dev->dmasound.afmt) { |
128 | case AFMT_U8: | 129 | case AFMT_U8: |
129 | case AFMT_S8: fmt = 0x00; break; | 130 | case AFMT_S8: fmt = 0x00; break; |
130 | case AFMT_U16_LE: | 131 | case AFMT_U16_LE: |
@@ -136,14 +137,14 @@ static int dsp_rec_start(struct saa7134_dev *dev) | |||
136 | goto fail2; | 137 | goto fail2; |
137 | } | 138 | } |
138 | 139 | ||
139 | switch (dev->oss.afmt) { | 140 | switch (dev->dmasound.afmt) { |
140 | case AFMT_S8: | 141 | case AFMT_S8: |
141 | case AFMT_S16_LE: | 142 | case AFMT_S16_LE: |
142 | case AFMT_S16_BE: sign = 1; break; | 143 | case AFMT_S16_BE: sign = 1; break; |
143 | default: sign = 0; break; | 144 | default: sign = 0; break; |
144 | } | 145 | } |
145 | 146 | ||
146 | switch (dev->oss.afmt) { | 147 | switch (dev->dmasound.afmt) { |
147 | case AFMT_U16_BE: | 148 | case AFMT_U16_BE: |
148 | case AFMT_S16_BE: bswap = 1; break; | 149 | case AFMT_S16_BE: bswap = 1; break; |
149 | default: bswap = 0; break; | 150 | default: bswap = 0; break; |
@@ -151,58 +152,58 @@ static int dsp_rec_start(struct saa7134_dev *dev) | |||
151 | 152 | ||
152 | switch (dev->pci->device) { | 153 | switch (dev->pci->device) { |
153 | case PCI_DEVICE_ID_PHILIPS_SAA7134: | 154 | case PCI_DEVICE_ID_PHILIPS_SAA7134: |
154 | if (1 == dev->oss.channels) | 155 | if (1 == dev->dmasound.channels) |
155 | fmt |= (1 << 3); | 156 | fmt |= (1 << 3); |
156 | if (2 == dev->oss.channels) | 157 | if (2 == dev->dmasound.channels) |
157 | fmt |= (3 << 3); | 158 | fmt |= (3 << 3); |
158 | if (sign) | 159 | if (sign) |
159 | fmt |= 0x04; | 160 | fmt |= 0x04; |
160 | fmt |= (TV == dev->oss.input) ? 0xc0 : 0x80; | 161 | fmt |= (TV == dev->dmasound.input) ? 0xc0 : 0x80; |
161 | 162 | ||
162 | saa_writeb(SAA7134_NUM_SAMPLES0, ((dev->oss.blksize - 1) & 0x0000ff)); | 163 | saa_writeb(SAA7134_NUM_SAMPLES0, ((dev->dmasound.blksize - 1) & 0x0000ff)); |
163 | saa_writeb(SAA7134_NUM_SAMPLES1, ((dev->oss.blksize - 1) & 0x00ff00) >> 8); | 164 | saa_writeb(SAA7134_NUM_SAMPLES1, ((dev->dmasound.blksize - 1) & 0x00ff00) >> 8); |
164 | saa_writeb(SAA7134_NUM_SAMPLES2, ((dev->oss.blksize - 1) & 0xff0000) >> 16); | 165 | saa_writeb(SAA7134_NUM_SAMPLES2, ((dev->dmasound.blksize - 1) & 0xff0000) >> 16); |
165 | saa_writeb(SAA7134_AUDIO_FORMAT_CTRL, fmt); | 166 | saa_writeb(SAA7134_AUDIO_FORMAT_CTRL, fmt); |
166 | 167 | ||
167 | break; | 168 | break; |
168 | case PCI_DEVICE_ID_PHILIPS_SAA7133: | 169 | case PCI_DEVICE_ID_PHILIPS_SAA7133: |
169 | case PCI_DEVICE_ID_PHILIPS_SAA7135: | 170 | case PCI_DEVICE_ID_PHILIPS_SAA7135: |
170 | if (1 == dev->oss.channels) | 171 | if (1 == dev->dmasound.channels) |
171 | fmt |= (1 << 4); | 172 | fmt |= (1 << 4); |
172 | if (2 == dev->oss.channels) | 173 | if (2 == dev->dmasound.channels) |
173 | fmt |= (2 << 4); | 174 | fmt |= (2 << 4); |
174 | if (!sign) | 175 | if (!sign) |
175 | fmt |= 0x04; | 176 | fmt |= 0x04; |
176 | saa_writel(0x588 >> 2, dev->oss.blksize -4); | 177 | saa_writel(SAA7133_NUM_SAMPLES, dev->dmasound.blksize -4); |
177 | saa_writel(0x58c >> 2, 0x543210 | (fmt << 24)); | 178 | saa_writel(SAA7133_AUDIO_CHANNEL, 0x543210 | (fmt << 24)); |
178 | break; | 179 | break; |
179 | } | 180 | } |
180 | dprintk("rec_start: afmt=%d ch=%d => fmt=0x%x swap=%c\n", | 181 | dprintk("rec_start: afmt=%d ch=%d => fmt=0x%x swap=%c\n", |
181 | dev->oss.afmt, dev->oss.channels, fmt, | 182 | dev->dmasound.afmt, dev->dmasound.channels, fmt, |
182 | bswap ? 'b' : '-'); | 183 | bswap ? 'b' : '-'); |
183 | 184 | ||
184 | /* dma: setup channel 6 (= AUDIO) */ | 185 | /* dma: setup channel 6 (= AUDIO) */ |
185 | control = SAA7134_RS_CONTROL_BURST_16 | | 186 | control = SAA7134_RS_CONTROL_BURST_16 | |
186 | SAA7134_RS_CONTROL_ME | | 187 | SAA7134_RS_CONTROL_ME | |
187 | (dev->oss.pt.dma >> 12); | 188 | (dev->dmasound.pt.dma >> 12); |
188 | if (bswap) | 189 | if (bswap) |
189 | control |= SAA7134_RS_CONTROL_BSWAP; | 190 | control |= SAA7134_RS_CONTROL_BSWAP; |
190 | saa_writel(SAA7134_RS_BA1(6),0); | 191 | saa_writel(SAA7134_RS_BA1(6),0); |
191 | saa_writel(SAA7134_RS_BA2(6),dev->oss.blksize); | 192 | saa_writel(SAA7134_RS_BA2(6),dev->dmasound.blksize); |
192 | saa_writel(SAA7134_RS_PITCH(6),0); | 193 | saa_writel(SAA7134_RS_PITCH(6),0); |
193 | saa_writel(SAA7134_RS_CONTROL(6),control); | 194 | saa_writel(SAA7134_RS_CONTROL(6),control); |
194 | 195 | ||
195 | /* start dma */ | 196 | /* start dma */ |
196 | dev->oss.recording_on = 1; | 197 | dev->dmasound.recording_on = 1; |
197 | spin_lock_irqsave(&dev->slock,flags); | 198 | spin_lock_irqsave(&dev->slock,flags); |
198 | dsp_dma_start(dev); | 199 | dsp_dma_start(dev); |
199 | spin_unlock_irqrestore(&dev->slock,flags); | 200 | spin_unlock_irqrestore(&dev->slock,flags); |
200 | return 0; | 201 | return 0; |
201 | 202 | ||
202 | fail2: | 203 | fail2: |
203 | saa7134_pgtable_free(dev->pci,&dev->oss.pt); | 204 | saa7134_pgtable_free(dev->pci,&dev->dmasound.pt); |
204 | fail1: | 205 | fail1: |
205 | videobuf_dma_pci_unmap(dev->pci,&dev->oss.dma); | 206 | videobuf_dma_pci_unmap(dev->pci,&dev->dmasound.dma); |
206 | return err; | 207 | return err; |
207 | } | 208 | } |
208 | 209 | ||
@@ -210,17 +211,17 @@ static int dsp_rec_stop(struct saa7134_dev *dev) | |||
210 | { | 211 | { |
211 | unsigned long flags; | 212 | unsigned long flags; |
212 | 213 | ||
213 | dprintk("rec_stop dma_blk=%d\n",dev->oss.dma_blk); | 214 | dprintk("rec_stop dma_blk=%d\n",dev->dmasound.dma_blk); |
214 | 215 | ||
215 | /* stop dma */ | 216 | /* stop dma */ |
216 | dev->oss.recording_on = 0; | 217 | dev->dmasound.recording_on = 0; |
217 | spin_lock_irqsave(&dev->slock,flags); | 218 | spin_lock_irqsave(&dev->slock,flags); |
218 | dsp_dma_stop(dev); | 219 | dsp_dma_stop(dev); |
219 | spin_unlock_irqrestore(&dev->slock,flags); | 220 | spin_unlock_irqrestore(&dev->slock,flags); |
220 | 221 | ||
221 | /* unlock buffer */ | 222 | /* unlock buffer */ |
222 | saa7134_pgtable_free(dev->pci,&dev->oss.pt); | 223 | saa7134_pgtable_free(dev->pci,&dev->dmasound.pt); |
223 | videobuf_dma_pci_unmap(dev->pci,&dev->oss.dma); | 224 | videobuf_dma_pci_unmap(dev->pci,&dev->dmasound.dma); |
224 | return 0; | 225 | return 0; |
225 | } | 226 | } |
226 | 227 | ||
@@ -235,35 +236,35 @@ static int dsp_open(struct inode *inode, struct file *file) | |||
235 | 236 | ||
236 | list_for_each(list,&saa7134_devlist) { | 237 | list_for_each(list,&saa7134_devlist) { |
237 | h = list_entry(list, struct saa7134_dev, devlist); | 238 | h = list_entry(list, struct saa7134_dev, devlist); |
238 | if (h->oss.minor_dsp == minor) | 239 | if (h->dmasound.minor_dsp == minor) |
239 | dev = h; | 240 | dev = h; |
240 | } | 241 | } |
241 | if (NULL == dev) | 242 | if (NULL == dev) |
242 | return -ENODEV; | 243 | return -ENODEV; |
243 | 244 | ||
244 | down(&dev->oss.lock); | 245 | down(&dev->dmasound.lock); |
245 | err = -EBUSY; | 246 | err = -EBUSY; |
246 | if (dev->oss.users_dsp) | 247 | if (dev->dmasound.users_dsp) |
247 | goto fail1; | 248 | goto fail1; |
248 | dev->oss.users_dsp++; | 249 | dev->dmasound.users_dsp++; |
249 | file->private_data = dev; | 250 | file->private_data = dev; |
250 | 251 | ||
251 | dev->oss.afmt = AFMT_U8; | 252 | dev->dmasound.afmt = AFMT_U8; |
252 | dev->oss.channels = 1; | 253 | dev->dmasound.channels = 1; |
253 | dev->oss.read_count = 0; | 254 | dev->dmasound.read_count = 0; |
254 | dev->oss.read_offset = 0; | 255 | dev->dmasound.read_offset = 0; |
255 | dsp_buffer_conf(dev,PAGE_SIZE,64); | 256 | dsp_buffer_conf(dev,PAGE_SIZE,64); |
256 | err = dsp_buffer_init(dev); | 257 | err = dsp_buffer_init(dev); |
257 | if (0 != err) | 258 | if (0 != err) |
258 | goto fail2; | 259 | goto fail2; |
259 | 260 | ||
260 | up(&dev->oss.lock); | 261 | up(&dev->dmasound.lock); |
261 | return 0; | 262 | return 0; |
262 | 263 | ||
263 | fail2: | 264 | fail2: |
264 | dev->oss.users_dsp--; | 265 | dev->dmasound.users_dsp--; |
265 | fail1: | 266 | fail1: |
266 | up(&dev->oss.lock); | 267 | up(&dev->dmasound.lock); |
267 | return err; | 268 | return err; |
268 | } | 269 | } |
269 | 270 | ||
@@ -271,13 +272,13 @@ static int dsp_release(struct inode *inode, struct file *file) | |||
271 | { | 272 | { |
272 | struct saa7134_dev *dev = file->private_data; | 273 | struct saa7134_dev *dev = file->private_data; |
273 | 274 | ||
274 | down(&dev->oss.lock); | 275 | down(&dev->dmasound.lock); |
275 | if (dev->oss.recording_on) | 276 | if (dev->dmasound.recording_on) |
276 | dsp_rec_stop(dev); | 277 | dsp_rec_stop(dev); |
277 | dsp_buffer_free(dev); | 278 | dsp_buffer_free(dev); |
278 | dev->oss.users_dsp--; | 279 | dev->dmasound.users_dsp--; |
279 | file->private_data = NULL; | 280 | file->private_data = NULL; |
280 | up(&dev->oss.lock); | 281 | up(&dev->dmasound.lock); |
281 | return 0; | 282 | return 0; |
282 | } | 283 | } |
283 | 284 | ||
@@ -290,12 +291,12 @@ static ssize_t dsp_read(struct file *file, char __user *buffer, | |||
290 | unsigned long flags; | 291 | unsigned long flags; |
291 | int err,ret = 0; | 292 | int err,ret = 0; |
292 | 293 | ||
293 | add_wait_queue(&dev->oss.wq, &wait); | 294 | add_wait_queue(&dev->dmasound.wq, &wait); |
294 | down(&dev->oss.lock); | 295 | down(&dev->dmasound.lock); |
295 | while (count > 0) { | 296 | while (count > 0) { |
296 | /* wait for data if needed */ | 297 | /* wait for data if needed */ |
297 | if (0 == dev->oss.read_count) { | 298 | if (0 == dev->dmasound.read_count) { |
298 | if (!dev->oss.recording_on) { | 299 | if (!dev->dmasound.recording_on) { |
299 | err = dsp_rec_start(dev); | 300 | err = dsp_rec_start(dev); |
300 | if (err < 0) { | 301 | if (err < 0) { |
301 | if (0 == ret) | 302 | if (0 == ret) |
@@ -303,8 +304,8 @@ static ssize_t dsp_read(struct file *file, char __user *buffer, | |||
303 | break; | 304 | break; |
304 | } | 305 | } |
305 | } | 306 | } |
306 | if (dev->oss.recording_on && | 307 | if (dev->dmasound.recording_on && |
307 | !dev->oss.dma_running) { | 308 | !dev->dmasound.dma_running) { |
308 | /* recover from overruns */ | 309 | /* recover from overruns */ |
309 | spin_lock_irqsave(&dev->slock,flags); | 310 | spin_lock_irqsave(&dev->slock,flags); |
310 | dsp_dma_start(dev); | 311 | dsp_dma_start(dev); |
@@ -315,12 +316,12 @@ static ssize_t dsp_read(struct file *file, char __user *buffer, | |||
315 | ret = -EAGAIN; | 316 | ret = -EAGAIN; |
316 | break; | 317 | break; |
317 | } | 318 | } |
318 | up(&dev->oss.lock); | 319 | up(&dev->dmasound.lock); |
319 | set_current_state(TASK_INTERRUPTIBLE); | 320 | set_current_state(TASK_INTERRUPTIBLE); |
320 | if (0 == dev->oss.read_count) | 321 | if (0 == dev->dmasound.read_count) |
321 | schedule(); | 322 | schedule(); |
322 | set_current_state(TASK_RUNNING); | 323 | set_current_state(TASK_RUNNING); |
323 | down(&dev->oss.lock); | 324 | down(&dev->dmasound.lock); |
324 | if (signal_pending(current)) { | 325 | if (signal_pending(current)) { |
325 | if (0 == ret) | 326 | if (0 == ret) |
326 | ret = -EINTR; | 327 | ret = -EINTR; |
@@ -330,12 +331,12 @@ static ssize_t dsp_read(struct file *file, char __user *buffer, | |||
330 | 331 | ||
331 | /* copy data to userspace */ | 332 | /* copy data to userspace */ |
332 | bytes = count; | 333 | bytes = count; |
333 | if (bytes > dev->oss.read_count) | 334 | if (bytes > dev->dmasound.read_count) |
334 | bytes = dev->oss.read_count; | 335 | bytes = dev->dmasound.read_count; |
335 | if (bytes > dev->oss.bufsize - dev->oss.read_offset) | 336 | if (bytes > dev->dmasound.bufsize - dev->dmasound.read_offset) |
336 | bytes = dev->oss.bufsize - dev->oss.read_offset; | 337 | bytes = dev->dmasound.bufsize - dev->dmasound.read_offset; |
337 | if (copy_to_user(buffer + ret, | 338 | if (copy_to_user(buffer + ret, |
338 | dev->oss.dma.vmalloc + dev->oss.read_offset, | 339 | dev->dmasound.dma.vmalloc + dev->dmasound.read_offset, |
339 | bytes)) { | 340 | bytes)) { |
340 | if (0 == ret) | 341 | if (0 == ret) |
341 | ret = -EFAULT; | 342 | ret = -EFAULT; |
@@ -344,13 +345,13 @@ static ssize_t dsp_read(struct file *file, char __user *buffer, | |||
344 | 345 | ||
345 | ret += bytes; | 346 | ret += bytes; |
346 | count -= bytes; | 347 | count -= bytes; |
347 | dev->oss.read_count -= bytes; | 348 | dev->dmasound.read_count -= bytes; |
348 | dev->oss.read_offset += bytes; | 349 | dev->dmasound.read_offset += bytes; |
349 | if (dev->oss.read_offset == dev->oss.bufsize) | 350 | if (dev->dmasound.read_offset == dev->dmasound.bufsize) |
350 | dev->oss.read_offset = 0; | 351 | dev->dmasound.read_offset = 0; |
351 | } | 352 | } |
352 | up(&dev->oss.lock); | 353 | up(&dev->dmasound.lock); |
353 | remove_wait_queue(&dev->oss.wq, &wait); | 354 | remove_wait_queue(&dev->dmasound.wq, &wait); |
354 | return ret; | 355 | return ret; |
355 | } | 356 | } |
356 | 357 | ||
@@ -370,53 +371,53 @@ static int dsp_ioctl(struct inode *inode, struct file *file, | |||
370 | 371 | ||
371 | if (oss_debug > 1) | 372 | if (oss_debug > 1) |
372 | saa7134_print_ioctl(dev->name,cmd); | 373 | saa7134_print_ioctl(dev->name,cmd); |
373 | switch (cmd) { | 374 | switch (cmd) { |
374 | case OSS_GETVERSION: | 375 | case OSS_GETVERSION: |
375 | return put_user(SOUND_VERSION, p); | 376 | return put_user(SOUND_VERSION, p); |
376 | case SNDCTL_DSP_GETCAPS: | 377 | case SNDCTL_DSP_GETCAPS: |
377 | return 0; | 378 | return 0; |
378 | 379 | ||
379 | case SNDCTL_DSP_SPEED: | 380 | case SNDCTL_DSP_SPEED: |
380 | if (get_user(val, p)) | 381 | if (get_user(val, p)) |
381 | return -EFAULT; | 382 | return -EFAULT; |
382 | /* fall through */ | 383 | /* fall through */ |
383 | case SOUND_PCM_READ_RATE: | 384 | case SOUND_PCM_READ_RATE: |
384 | return put_user(dev->oss.rate, p); | 385 | return put_user(dev->dmasound.rate, p); |
385 | 386 | ||
386 | case SNDCTL_DSP_STEREO: | 387 | case SNDCTL_DSP_STEREO: |
387 | if (get_user(val, p)) | 388 | if (get_user(val, p)) |
388 | return -EFAULT; | 389 | return -EFAULT; |
389 | down(&dev->oss.lock); | 390 | down(&dev->dmasound.lock); |
390 | dev->oss.channels = val ? 2 : 1; | 391 | dev->dmasound.channels = val ? 2 : 1; |
391 | if (dev->oss.recording_on) { | 392 | if (dev->dmasound.recording_on) { |
392 | dsp_rec_stop(dev); | 393 | dsp_rec_stop(dev); |
393 | dsp_rec_start(dev); | 394 | dsp_rec_start(dev); |
394 | } | 395 | } |
395 | up(&dev->oss.lock); | 396 | up(&dev->dmasound.lock); |
396 | return put_user(dev->oss.channels-1, p); | 397 | return put_user(dev->dmasound.channels-1, p); |
397 | 398 | ||
398 | case SNDCTL_DSP_CHANNELS: | 399 | case SNDCTL_DSP_CHANNELS: |
399 | if (get_user(val, p)) | 400 | if (get_user(val, p)) |
400 | return -EFAULT; | 401 | return -EFAULT; |
401 | if (val != 1 && val != 2) | 402 | if (val != 1 && val != 2) |
402 | return -EINVAL; | 403 | return -EINVAL; |
403 | down(&dev->oss.lock); | 404 | down(&dev->dmasound.lock); |
404 | dev->oss.channels = val; | 405 | dev->dmasound.channels = val; |
405 | if (dev->oss.recording_on) { | 406 | if (dev->dmasound.recording_on) { |
406 | dsp_rec_stop(dev); | 407 | dsp_rec_stop(dev); |
407 | dsp_rec_start(dev); | 408 | dsp_rec_start(dev); |
408 | } | 409 | } |
409 | up(&dev->oss.lock); | 410 | up(&dev->dmasound.lock); |
410 | /* fall through */ | 411 | /* fall through */ |
411 | case SOUND_PCM_READ_CHANNELS: | 412 | case SOUND_PCM_READ_CHANNELS: |
412 | return put_user(dev->oss.channels, p); | 413 | return put_user(dev->dmasound.channels, p); |
413 | 414 | ||
414 | case SNDCTL_DSP_GETFMTS: /* Returns a mask */ | 415 | case SNDCTL_DSP_GETFMTS: /* Returns a mask */ |
415 | return put_user(AFMT_U8 | AFMT_S8 | | 416 | return put_user(AFMT_U8 | AFMT_S8 | |
416 | AFMT_U16_LE | AFMT_U16_BE | | 417 | AFMT_U16_LE | AFMT_U16_BE | |
417 | AFMT_S16_LE | AFMT_S16_BE, p); | 418 | AFMT_S16_LE | AFMT_S16_BE, p); |
418 | 419 | ||
419 | case SNDCTL_DSP_SETFMT: /* Selects ONE fmt */ | 420 | case SNDCTL_DSP_SETFMT: /* Selects ONE fmt */ |
420 | if (get_user(val, p)) | 421 | if (get_user(val, p)) |
421 | return -EFAULT; | 422 | return -EFAULT; |
422 | switch (val) { | 423 | switch (val) { |
@@ -429,20 +430,20 @@ static int dsp_ioctl(struct inode *inode, struct file *file, | |||
429 | case AFMT_U16_BE: | 430 | case AFMT_U16_BE: |
430 | case AFMT_S16_LE: | 431 | case AFMT_S16_LE: |
431 | case AFMT_S16_BE: | 432 | case AFMT_S16_BE: |
432 | down(&dev->oss.lock); | 433 | down(&dev->dmasound.lock); |
433 | dev->oss.afmt = val; | 434 | dev->dmasound.afmt = val; |
434 | if (dev->oss.recording_on) { | 435 | if (dev->dmasound.recording_on) { |
435 | dsp_rec_stop(dev); | 436 | dsp_rec_stop(dev); |
436 | dsp_rec_start(dev); | 437 | dsp_rec_start(dev); |
437 | } | 438 | } |
438 | up(&dev->oss.lock); | 439 | up(&dev->dmasound.lock); |
439 | return put_user(dev->oss.afmt, p); | 440 | return put_user(dev->dmasound.afmt, p); |
440 | default: | 441 | default: |
441 | return -EINVAL; | 442 | return -EINVAL; |
442 | } | 443 | } |
443 | 444 | ||
444 | case SOUND_PCM_READ_BITS: | 445 | case SOUND_PCM_READ_BITS: |
445 | switch (dev->oss.afmt) { | 446 | switch (dev->dmasound.afmt) { |
446 | case AFMT_U8: | 447 | case AFMT_U8: |
447 | case AFMT_S8: | 448 | case AFMT_S8: |
448 | return put_user(8, p); | 449 | return put_user(8, p); |
@@ -455,23 +456,23 @@ static int dsp_ioctl(struct inode *inode, struct file *file, | |||
455 | return -EINVAL; | 456 | return -EINVAL; |
456 | } | 457 | } |
457 | 458 | ||
458 | case SNDCTL_DSP_NONBLOCK: | 459 | case SNDCTL_DSP_NONBLOCK: |
459 | file->f_flags |= O_NONBLOCK; | 460 | file->f_flags |= O_NONBLOCK; |
460 | return 0; | 461 | return 0; |
461 | 462 | ||
462 | case SNDCTL_DSP_RESET: | 463 | case SNDCTL_DSP_RESET: |
463 | down(&dev->oss.lock); | 464 | down(&dev->dmasound.lock); |
464 | if (dev->oss.recording_on) | 465 | if (dev->dmasound.recording_on) |
465 | dsp_rec_stop(dev); | 466 | dsp_rec_stop(dev); |
466 | up(&dev->oss.lock); | 467 | up(&dev->dmasound.lock); |
467 | return 0; | 468 | return 0; |
468 | case SNDCTL_DSP_GETBLKSIZE: | 469 | case SNDCTL_DSP_GETBLKSIZE: |
469 | return put_user(dev->oss.blksize, p); | 470 | return put_user(dev->dmasound.blksize, p); |
470 | 471 | ||
471 | case SNDCTL_DSP_SETFRAGMENT: | 472 | case SNDCTL_DSP_SETFRAGMENT: |
472 | if (get_user(val, p)) | 473 | if (get_user(val, p)) |
473 | return -EFAULT; | 474 | return -EFAULT; |
474 | if (dev->oss.recording_on) | 475 | if (dev->dmasound.recording_on) |
475 | return -EBUSY; | 476 | return -EBUSY; |
476 | dsp_buffer_free(dev); | 477 | dsp_buffer_free(dev); |
477 | /* used to be arg >> 16 instead of val >> 16; fixed */ | 478 | /* used to be arg >> 16 instead of val >> 16; fixed */ |
@@ -479,16 +480,16 @@ static int dsp_ioctl(struct inode *inode, struct file *file, | |||
479 | dsp_buffer_init(dev); | 480 | dsp_buffer_init(dev); |
480 | return 0; | 481 | return 0; |
481 | 482 | ||
482 | case SNDCTL_DSP_SYNC: | 483 | case SNDCTL_DSP_SYNC: |
483 | /* NOP */ | 484 | /* NOP */ |
484 | return 0; | 485 | return 0; |
485 | 486 | ||
486 | case SNDCTL_DSP_GETISPACE: | 487 | case SNDCTL_DSP_GETISPACE: |
487 | { | 488 | { |
488 | audio_buf_info info; | 489 | audio_buf_info info; |
489 | info.fragsize = dev->oss.blksize; | 490 | info.fragsize = dev->dmasound.blksize; |
490 | info.fragstotal = dev->oss.blocks; | 491 | info.fragstotal = dev->dmasound.blocks; |
491 | info.bytes = dev->oss.read_count; | 492 | info.bytes = dev->dmasound.read_count; |
492 | info.fragments = info.bytes / info.fragsize; | 493 | info.fragments = info.bytes / info.fragsize; |
493 | if (copy_to_user(argp, &info, sizeof(info))) | 494 | if (copy_to_user(argp, &info, sizeof(info))) |
494 | return -EFAULT; | 495 | return -EFAULT; |
@@ -504,13 +505,13 @@ static unsigned int dsp_poll(struct file *file, struct poll_table_struct *wait) | |||
504 | struct saa7134_dev *dev = file->private_data; | 505 | struct saa7134_dev *dev = file->private_data; |
505 | unsigned int mask = 0; | 506 | unsigned int mask = 0; |
506 | 507 | ||
507 | poll_wait(file, &dev->oss.wq, wait); | 508 | poll_wait(file, &dev->dmasound.wq, wait); |
508 | 509 | ||
509 | if (0 == dev->oss.read_count) { | 510 | if (0 == dev->dmasound.read_count) { |
510 | down(&dev->oss.lock); | 511 | down(&dev->dmasound.lock); |
511 | if (!dev->oss.recording_on) | 512 | if (!dev->dmasound.recording_on) |
512 | dsp_rec_start(dev); | 513 | dsp_rec_start(dev); |
513 | up(&dev->oss.lock); | 514 | up(&dev->dmasound.lock); |
514 | } else | 515 | } else |
515 | mask |= (POLLIN | POLLRDNORM); | 516 | mask |= (POLLIN | POLLRDNORM); |
516 | return mask; | 517 | return mask; |
@@ -534,7 +535,7 @@ mixer_recsrc_7134(struct saa7134_dev *dev) | |||
534 | { | 535 | { |
535 | int analog_io,rate; | 536 | int analog_io,rate; |
536 | 537 | ||
537 | switch (dev->oss.input) { | 538 | switch (dev->dmasound.input) { |
538 | case TV: | 539 | case TV: |
539 | saa_andorb(SAA7134_AUDIO_FORMAT_CTRL, 0xc0, 0xc0); | 540 | saa_andorb(SAA7134_AUDIO_FORMAT_CTRL, 0xc0, 0xc0); |
540 | saa_andorb(SAA7134_SIF_SAMPLE_FREQ, 0x03, 0x00); | 541 | saa_andorb(SAA7134_SIF_SAMPLE_FREQ, 0x03, 0x00); |
@@ -542,8 +543,8 @@ mixer_recsrc_7134(struct saa7134_dev *dev) | |||
542 | case LINE1: | 543 | case LINE1: |
543 | case LINE2: | 544 | case LINE2: |
544 | case LINE2_LEFT: | 545 | case LINE2_LEFT: |
545 | analog_io = (LINE1 == dev->oss.input) ? 0x00 : 0x08; | 546 | analog_io = (LINE1 == dev->dmasound.input) ? 0x00 : 0x08; |
546 | rate = (32000 == dev->oss.rate) ? 0x01 : 0x03; | 547 | rate = (32000 == dev->dmasound.rate) ? 0x01 : 0x03; |
547 | saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x08, analog_io); | 548 | saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x08, analog_io); |
548 | saa_andorb(SAA7134_AUDIO_FORMAT_CTRL, 0xc0, 0x80); | 549 | saa_andorb(SAA7134_AUDIO_FORMAT_CTRL, 0xc0, 0x80); |
549 | saa_andorb(SAA7134_SIF_SAMPLE_FREQ, 0x03, rate); | 550 | saa_andorb(SAA7134_SIF_SAMPLE_FREQ, 0x03, rate); |
@@ -559,10 +560,10 @@ mixer_recsrc_7133(struct saa7134_dev *dev) | |||
559 | 560 | ||
560 | xbarin = 0x03; // adc | 561 | xbarin = 0x03; // adc |
561 | anabar = 0; | 562 | anabar = 0; |
562 | switch (dev->oss.input) { | 563 | switch (dev->dmasound.input) { |
563 | case TV: | 564 | case TV: |
564 | xbarin = 0; // Demodulator | 565 | xbarin = 0; // Demodulator |
565 | anabar = 2; // DACs | 566 | anabar = 2; // DACs |
566 | break; | 567 | break; |
567 | case LINE1: | 568 | case LINE1: |
568 | anabar = 0; // aux1, aux1 | 569 | anabar = 0; // aux1, aux1 |
@@ -585,9 +586,9 @@ mixer_recsrc(struct saa7134_dev *dev, enum saa7134_audio_in src) | |||
585 | { | 586 | { |
586 | static const char *iname[] = { "Oops", "TV", "LINE1", "LINE2" }; | 587 | static const char *iname[] = { "Oops", "TV", "LINE1", "LINE2" }; |
587 | 588 | ||
588 | dev->oss.count++; | 589 | dev->dmasound.count++; |
589 | dev->oss.input = src; | 590 | dev->dmasound.input = src; |
590 | dprintk("mixer input = %s\n",iname[dev->oss.input]); | 591 | dprintk("mixer input = %s\n",iname[dev->dmasound.input]); |
591 | 592 | ||
592 | switch (dev->pci->device) { | 593 | switch (dev->pci->device) { |
593 | case PCI_DEVICE_ID_PHILIPS_SAA7134: | 594 | case PCI_DEVICE_ID_PHILIPS_SAA7134: |
@@ -639,7 +640,7 @@ static int mixer_open(struct inode *inode, struct file *file) | |||
639 | 640 | ||
640 | list_for_each(list,&saa7134_devlist) { | 641 | list_for_each(list,&saa7134_devlist) { |
641 | h = list_entry(list, struct saa7134_dev, devlist); | 642 | h = list_entry(list, struct saa7134_dev, devlist); |
642 | if (h->oss.minor_mixer == minor) | 643 | if (h->dmasound.minor_mixer == minor) |
643 | dev = h; | 644 | dev = h; |
644 | } | 645 | } |
645 | if (NULL == dev) | 646 | if (NULL == dev) |
@@ -666,28 +667,28 @@ static int mixer_ioctl(struct inode *inode, struct file *file, | |||
666 | 667 | ||
667 | if (oss_debug > 1) | 668 | if (oss_debug > 1) |
668 | saa7134_print_ioctl(dev->name,cmd); | 669 | saa7134_print_ioctl(dev->name,cmd); |
669 | switch (cmd) { | 670 | switch (cmd) { |
670 | case OSS_GETVERSION: | 671 | case OSS_GETVERSION: |
671 | return put_user(SOUND_VERSION, p); | 672 | return put_user(SOUND_VERSION, p); |
672 | case SOUND_MIXER_INFO: | 673 | case SOUND_MIXER_INFO: |
673 | { | 674 | { |
674 | mixer_info info; | 675 | mixer_info info; |
675 | memset(&info,0,sizeof(info)); | 676 | memset(&info,0,sizeof(info)); |
676 | strlcpy(info.id, "TV audio", sizeof(info.id)); | 677 | strlcpy(info.id, "TV audio", sizeof(info.id)); |
677 | strlcpy(info.name, dev->name, sizeof(info.name)); | 678 | strlcpy(info.name, dev->name, sizeof(info.name)); |
678 | info.modify_counter = dev->oss.count; | 679 | info.modify_counter = dev->dmasound.count; |
679 | if (copy_to_user(argp, &info, sizeof(info))) | 680 | if (copy_to_user(argp, &info, sizeof(info))) |
680 | return -EFAULT; | 681 | return -EFAULT; |
681 | return 0; | 682 | return 0; |
682 | } | 683 | } |
683 | case SOUND_OLD_MIXER_INFO: | 684 | case SOUND_OLD_MIXER_INFO: |
684 | { | 685 | { |
685 | _old_mixer_info info; | 686 | _old_mixer_info info; |
686 | memset(&info,0,sizeof(info)); | 687 | memset(&info,0,sizeof(info)); |
687 | strlcpy(info.id, "TV audio", sizeof(info.id)); | 688 | strlcpy(info.id, "TV audio", sizeof(info.id)); |
688 | strlcpy(info.name, dev->name, sizeof(info.name)); | 689 | strlcpy(info.name, dev->name, sizeof(info.name)); |
689 | if (copy_to_user(argp, &info, sizeof(info))) | 690 | if (copy_to_user(argp, &info, sizeof(info))) |
690 | return -EFAULT; | 691 | return -EFAULT; |
691 | return 0; | 692 | return 0; |
692 | } | 693 | } |
693 | case MIXER_READ(SOUND_MIXER_CAPS): | 694 | case MIXER_READ(SOUND_MIXER_CAPS): |
@@ -697,26 +698,26 @@ static int mixer_ioctl(struct inode *inode, struct file *file, | |||
697 | case MIXER_READ(SOUND_MIXER_RECMASK): | 698 | case MIXER_READ(SOUND_MIXER_RECMASK): |
698 | case MIXER_READ(SOUND_MIXER_DEVMASK): | 699 | case MIXER_READ(SOUND_MIXER_DEVMASK): |
699 | val = SOUND_MASK_LINE1 | SOUND_MASK_LINE2; | 700 | val = SOUND_MASK_LINE1 | SOUND_MASK_LINE2; |
700 | if (32000 == dev->oss.rate) | 701 | if (32000 == dev->dmasound.rate) |
701 | val |= SOUND_MASK_VIDEO; | 702 | val |= SOUND_MASK_VIDEO; |
702 | return put_user(val, p); | 703 | return put_user(val, p); |
703 | 704 | ||
704 | case MIXER_WRITE(SOUND_MIXER_RECSRC): | 705 | case MIXER_WRITE(SOUND_MIXER_RECSRC): |
705 | if (get_user(val, p)) | 706 | if (get_user(val, p)) |
706 | return -EFAULT; | 707 | return -EFAULT; |
707 | input = dev->oss.input; | 708 | input = dev->dmasound.input; |
708 | if (32000 == dev->oss.rate && | 709 | if (32000 == dev->dmasound.rate && |
709 | val & SOUND_MASK_VIDEO && dev->oss.input != TV) | 710 | val & SOUND_MASK_VIDEO && dev->dmasound.input != TV) |
710 | input = TV; | 711 | input = TV; |
711 | if (val & SOUND_MASK_LINE1 && dev->oss.input != LINE1) | 712 | if (val & SOUND_MASK_LINE1 && dev->dmasound.input != LINE1) |
712 | input = LINE1; | 713 | input = LINE1; |
713 | if (val & SOUND_MASK_LINE2 && dev->oss.input != LINE2) | 714 | if (val & SOUND_MASK_LINE2 && dev->dmasound.input != LINE2) |
714 | input = LINE2; | 715 | input = LINE2; |
715 | if (input != dev->oss.input) | 716 | if (input != dev->dmasound.input) |
716 | mixer_recsrc(dev,input); | 717 | mixer_recsrc(dev,input); |
717 | /* fall throuth */ | 718 | /* fall throuth */ |
718 | case MIXER_READ(SOUND_MIXER_RECSRC): | 719 | case MIXER_READ(SOUND_MIXER_RECSRC): |
719 | switch (dev->oss.input) { | 720 | switch (dev->dmasound.input) { |
720 | case TV: ret = SOUND_MASK_VIDEO; break; | 721 | case TV: ret = SOUND_MASK_VIDEO; break; |
721 | case LINE1: ret = SOUND_MASK_LINE1; break; | 722 | case LINE1: ret = SOUND_MASK_LINE1; break; |
722 | case LINE2: ret = SOUND_MASK_LINE2; break; | 723 | case LINE2: ret = SOUND_MASK_LINE2; break; |
@@ -726,7 +727,7 @@ static int mixer_ioctl(struct inode *inode, struct file *file, | |||
726 | 727 | ||
727 | case MIXER_WRITE(SOUND_MIXER_VIDEO): | 728 | case MIXER_WRITE(SOUND_MIXER_VIDEO): |
728 | case MIXER_READ(SOUND_MIXER_VIDEO): | 729 | case MIXER_READ(SOUND_MIXER_VIDEO): |
729 | if (32000 != dev->oss.rate) | 730 | if (32000 != dev->dmasound.rate) |
730 | return -EINVAL; | 731 | return -EINVAL; |
731 | return put_user(100 | 100 << 8, p); | 732 | return put_user(100 | 100 << 8, p); |
732 | 733 | ||
@@ -735,22 +736,22 @@ static int mixer_ioctl(struct inode *inode, struct file *file, | |||
735 | return -EFAULT; | 736 | return -EFAULT; |
736 | val &= 0xff; | 737 | val &= 0xff; |
737 | val = (val <= 50) ? 50 : 100; | 738 | val = (val <= 50) ? 50 : 100; |
738 | dev->oss.line1 = val; | 739 | dev->dmasound.line1 = val; |
739 | mixer_level(dev,LINE1,dev->oss.line1); | 740 | mixer_level(dev,LINE1,dev->dmasound.line1); |
740 | /* fall throuth */ | 741 | /* fall throuth */ |
741 | case MIXER_READ(SOUND_MIXER_LINE1): | 742 | case MIXER_READ(SOUND_MIXER_LINE1): |
742 | return put_user(dev->oss.line1 | dev->oss.line1 << 8, p); | 743 | return put_user(dev->dmasound.line1 | dev->dmasound.line1 << 8, p); |
743 | 744 | ||
744 | case MIXER_WRITE(SOUND_MIXER_LINE2): | 745 | case MIXER_WRITE(SOUND_MIXER_LINE2): |
745 | if (get_user(val, p)) | 746 | if (get_user(val, p)) |
746 | return -EFAULT; | 747 | return -EFAULT; |
747 | val &= 0xff; | 748 | val &= 0xff; |
748 | val = (val <= 50) ? 50 : 100; | 749 | val = (val <= 50) ? 50 : 100; |
749 | dev->oss.line2 = val; | 750 | dev->dmasound.line2 = val; |
750 | mixer_level(dev,LINE2,dev->oss.line2); | 751 | mixer_level(dev,LINE2,dev->dmasound.line2); |
751 | /* fall throuth */ | 752 | /* fall throuth */ |
752 | case MIXER_READ(SOUND_MIXER_LINE2): | 753 | case MIXER_READ(SOUND_MIXER_LINE2): |
753 | return put_user(dev->oss.line2 | dev->oss.line2 << 8, p); | 754 | return put_user(dev->dmasound.line2 | dev->dmasound.line2 << 8, p); |
754 | 755 | ||
755 | default: | 756 | default: |
756 | return -EINVAL; | 757 | return -EINVAL; |
@@ -770,8 +771,8 @@ struct file_operations saa7134_mixer_fops = { | |||
770 | int saa7134_oss_init1(struct saa7134_dev *dev) | 771 | int saa7134_oss_init1(struct saa7134_dev *dev) |
771 | { | 772 | { |
772 | /* general */ | 773 | /* general */ |
773 | init_MUTEX(&dev->oss.lock); | 774 | init_MUTEX(&dev->dmasound.lock); |
774 | init_waitqueue_head(&dev->oss.wq); | 775 | init_waitqueue_head(&dev->dmasound.wq); |
775 | 776 | ||
776 | switch (dev->pci->device) { | 777 | switch (dev->pci->device) { |
777 | case PCI_DEVICE_ID_PHILIPS_SAA7133: | 778 | case PCI_DEVICE_ID_PHILIPS_SAA7133: |
@@ -783,17 +784,17 @@ int saa7134_oss_init1(struct saa7134_dev *dev) | |||
783 | } | 784 | } |
784 | 785 | ||
785 | /* dsp */ | 786 | /* dsp */ |
786 | dev->oss.rate = 32000; | 787 | dev->dmasound.rate = 32000; |
787 | if (oss_rate) | 788 | if (oss_rate) |
788 | dev->oss.rate = oss_rate; | 789 | dev->dmasound.rate = oss_rate; |
789 | dev->oss.rate = (dev->oss.rate > 40000) ? 48000 : 32000; | 790 | dev->dmasound.rate = (dev->dmasound.rate > 40000) ? 48000 : 32000; |
790 | 791 | ||
791 | /* mixer */ | 792 | /* mixer */ |
792 | dev->oss.line1 = 50; | 793 | dev->dmasound.line1 = 50; |
793 | dev->oss.line2 = 50; | 794 | dev->dmasound.line2 = 50; |
794 | mixer_level(dev,LINE1,dev->oss.line1); | 795 | mixer_level(dev,LINE1,dev->dmasound.line1); |
795 | mixer_level(dev,LINE2,dev->oss.line2); | 796 | mixer_level(dev,LINE2,dev->dmasound.line2); |
796 | mixer_recsrc(dev, (dev->oss.rate == 32000) ? TV : LINE2); | 797 | mixer_recsrc(dev, (dev->dmasound.rate == 32000) ? TV : LINE2); |
797 | 798 | ||
798 | return 0; | 799 | return 0; |
799 | } | 800 | } |
@@ -809,7 +810,7 @@ void saa7134_irq_oss_done(struct saa7134_dev *dev, unsigned long status) | |||
809 | int next_blk, reg = 0; | 810 | int next_blk, reg = 0; |
810 | 811 | ||
811 | spin_lock(&dev->slock); | 812 | spin_lock(&dev->slock); |
812 | if (UNSET == dev->oss.dma_blk) { | 813 | if (UNSET == dev->dmasound.dma_blk) { |
813 | dprintk("irq: recording stopped\n"); | 814 | dprintk("irq: recording stopped\n"); |
814 | goto done; | 815 | goto done; |
815 | } | 816 | } |
@@ -817,11 +818,11 @@ void saa7134_irq_oss_done(struct saa7134_dev *dev, unsigned long status) | |||
817 | dprintk("irq: lost %ld\n", (status >> 24) & 0x0f); | 818 | dprintk("irq: lost %ld\n", (status >> 24) & 0x0f); |
818 | if (0 == (status & 0x10000000)) { | 819 | if (0 == (status & 0x10000000)) { |
819 | /* odd */ | 820 | /* odd */ |
820 | if (0 == (dev->oss.dma_blk & 0x01)) | 821 | if (0 == (dev->dmasound.dma_blk & 0x01)) |
821 | reg = SAA7134_RS_BA1(6); | 822 | reg = SAA7134_RS_BA1(6); |
822 | } else { | 823 | } else { |
823 | /* even */ | 824 | /* even */ |
824 | if (1 == (dev->oss.dma_blk & 0x01)) | 825 | if (1 == (dev->dmasound.dma_blk & 0x01)) |
825 | reg = SAA7134_RS_BA2(6); | 826 | reg = SAA7134_RS_BA2(6); |
826 | } | 827 | } |
827 | if (0 == reg) { | 828 | if (0 == reg) { |
@@ -829,25 +830,25 @@ void saa7134_irq_oss_done(struct saa7134_dev *dev, unsigned long status) | |||
829 | (status & 0x10000000) ? "even" : "odd"); | 830 | (status & 0x10000000) ? "even" : "odd"); |
830 | goto done; | 831 | goto done; |
831 | } | 832 | } |
832 | if (dev->oss.read_count >= dev->oss.blksize * (dev->oss.blocks-2)) { | 833 | if (dev->dmasound.read_count >= dev->dmasound.blksize * (dev->dmasound.blocks-2)) { |
833 | dprintk("irq: overrun [full=%d/%d]\n",dev->oss.read_count, | 834 | dprintk("irq: overrun [full=%d/%d]\n",dev->dmasound.read_count, |
834 | dev->oss.bufsize); | 835 | dev->dmasound.bufsize); |
835 | dsp_dma_stop(dev); | 836 | dsp_dma_stop(dev); |
836 | goto done; | 837 | goto done; |
837 | } | 838 | } |
838 | 839 | ||
839 | /* next block addr */ | 840 | /* next block addr */ |
840 | next_blk = (dev->oss.dma_blk + 2) % dev->oss.blocks; | 841 | next_blk = (dev->dmasound.dma_blk + 2) % dev->dmasound.blocks; |
841 | saa_writel(reg,next_blk * dev->oss.blksize); | 842 | saa_writel(reg,next_blk * dev->dmasound.blksize); |
842 | if (oss_debug > 2) | 843 | if (oss_debug > 2) |
843 | dprintk("irq: ok, %s, next_blk=%d, addr=%x\n", | 844 | dprintk("irq: ok, %s, next_blk=%d, addr=%x\n", |
844 | (status & 0x10000000) ? "even" : "odd ", next_blk, | 845 | (status & 0x10000000) ? "even" : "odd ", next_blk, |
845 | next_blk * dev->oss.blksize); | 846 | next_blk * dev->dmasound.blksize); |
846 | 847 | ||
847 | /* update status & wake waiting readers */ | 848 | /* update status & wake waiting readers */ |
848 | dev->oss.dma_blk = (dev->oss.dma_blk + 1) % dev->oss.blocks; | 849 | dev->dmasound.dma_blk = (dev->dmasound.dma_blk + 1) % dev->dmasound.blocks; |
849 | dev->oss.read_count += dev->oss.blksize; | 850 | dev->dmasound.read_count += dev->dmasound.blksize; |
850 | wake_up(&dev->oss.wq); | 851 | wake_up(&dev->dmasound.wq); |
851 | 852 | ||
852 | done: | 853 | done: |
853 | spin_unlock(&dev->slock); | 854 | spin_unlock(&dev->slock); |
diff --git a/drivers/media/video/saa7134/saa7134-reg.h b/drivers/media/video/saa7134/saa7134-reg.h index ae0c7a165390..ac6431ba4fc3 100644 --- a/drivers/media/video/saa7134/saa7134-reg.h +++ b/drivers/media/video/saa7134/saa7134-reg.h | |||
@@ -27,7 +27,7 @@ | |||
27 | 27 | ||
28 | /* DMA channels, n = 0 ... 6 */ | 28 | /* DMA channels, n = 0 ... 6 */ |
29 | #define SAA7134_RS_BA1(n) ((0x200 >> 2) + 4*n) | 29 | #define SAA7134_RS_BA1(n) ((0x200 >> 2) + 4*n) |
30 | #define SAA7134_RS_BA2(n) ((0x204 >> 2) + 4*n) | 30 | #define SAA7134_RS_BA2(n) ((0x204 >> 2) + 4*n) |
31 | #define SAA7134_RS_PITCH(n) ((0x208 >> 2) + 4*n) | 31 | #define SAA7134_RS_PITCH(n) ((0x208 >> 2) + 4*n) |
32 | #define SAA7134_RS_CONTROL(n) ((0x20c >> 2) + 4*n) | 32 | #define SAA7134_RS_CONTROL(n) ((0x20c >> 2) + 4*n) |
33 | #define SAA7134_RS_CONTROL_WSWAP (0x01 << 25) | 33 | #define SAA7134_RS_CONTROL_WSWAP (0x01 << 25) |
@@ -43,16 +43,24 @@ | |||
43 | #define SAA7134_FIFO_SIZE (0x2a0 >> 2) | 43 | #define SAA7134_FIFO_SIZE (0x2a0 >> 2) |
44 | #define SAA7134_THRESHOULD (0x2a4 >> 2) | 44 | #define SAA7134_THRESHOULD (0x2a4 >> 2) |
45 | 45 | ||
46 | #define SAA7133_NUM_SAMPLES (0x588 >> 2) | ||
47 | #define SAA7133_AUDIO_CHANNEL (0x58c >> 2) | ||
48 | #define SAA7133_AUDIO_FORMAT (0x58f >> 2) | ||
49 | #define SAA7133_DIGITAL_OUTPUT_SEL1 (0x46c >> 2) | ||
50 | #define SAA7133_DIGITAL_OUTPUT_SEL2 (0x470 >> 2) | ||
51 | #define SAA7133_DIGITAL_INPUT_XBAR1 (0x464 >> 2) | ||
52 | #define SAA7133_ANALOG_IO_SELECT (0x594 >> 2) | ||
53 | |||
46 | /* main control */ | 54 | /* main control */ |
47 | #define SAA7134_MAIN_CTRL (0x2a8 >> 2) | 55 | #define SAA7134_MAIN_CTRL (0x2a8 >> 2) |
48 | #define SAA7134_MAIN_CTRL_VPLLE (1 << 15) | 56 | #define SAA7134_MAIN_CTRL_VPLLE (1 << 15) |
49 | #define SAA7134_MAIN_CTRL_APLLE (1 << 14) | 57 | #define SAA7134_MAIN_CTRL_APLLE (1 << 14) |
50 | #define SAA7134_MAIN_CTRL_EXOSC (1 << 13) | 58 | #define SAA7134_MAIN_CTRL_EXOSC (1 << 13) |
51 | #define SAA7134_MAIN_CTRL_EVFE1 (1 << 12) | 59 | #define SAA7134_MAIN_CTRL_EVFE1 (1 << 12) |
52 | #define SAA7134_MAIN_CTRL_EVFE2 (1 << 11) | 60 | #define SAA7134_MAIN_CTRL_EVFE2 (1 << 11) |
53 | #define SAA7134_MAIN_CTRL_ESFE (1 << 10) | 61 | #define SAA7134_MAIN_CTRL_ESFE (1 << 10) |
54 | #define SAA7134_MAIN_CTRL_EBADC (1 << 9) | 62 | #define SAA7134_MAIN_CTRL_EBADC (1 << 9) |
55 | #define SAA7134_MAIN_CTRL_EBDAC (1 << 8) | 63 | #define SAA7134_MAIN_CTRL_EBDAC (1 << 8) |
56 | #define SAA7134_MAIN_CTRL_TE6 (1 << 6) | 64 | #define SAA7134_MAIN_CTRL_TE6 (1 << 6) |
57 | #define SAA7134_MAIN_CTRL_TE5 (1 << 5) | 65 | #define SAA7134_MAIN_CTRL_TE5 (1 << 5) |
58 | #define SAA7134_MAIN_CTRL_TE4 (1 << 4) | 66 | #define SAA7134_MAIN_CTRL_TE4 (1 << 4) |
@@ -348,6 +356,7 @@ | |||
348 | 356 | ||
349 | /* test modes */ | 357 | /* test modes */ |
350 | #define SAA7134_SPECIAL_MODE 0x1d0 | 358 | #define SAA7134_SPECIAL_MODE 0x1d0 |
359 | #define SAA7134_PRODUCTION_TEST_MODE 0x1d1 | ||
351 | 360 | ||
352 | /* audio -- saa7133 + saa7135 only */ | 361 | /* audio -- saa7133 + saa7135 only */ |
353 | #define SAA7135_DSP_RWSTATE 0x580 | 362 | #define SAA7135_DSP_RWSTATE 0x580 |
diff --git a/drivers/media/video/saa7134/saa7134-ts.c b/drivers/media/video/saa7134/saa7134-ts.c index 463885601ab4..470903e2f5e5 100644 --- a/drivers/media/video/saa7134/saa7134-ts.c +++ b/drivers/media/video/saa7134/saa7134-ts.c | |||
@@ -46,17 +46,11 @@ static int buffer_activate(struct saa7134_dev *dev, | |||
46 | struct saa7134_buf *buf, | 46 | struct saa7134_buf *buf, |
47 | struct saa7134_buf *next) | 47 | struct saa7134_buf *next) |
48 | { | 48 | { |
49 | u32 control; | ||
50 | 49 | ||
51 | dprintk("buffer_activate [%p]",buf); | 50 | dprintk("buffer_activate [%p]",buf); |
52 | buf->vb.state = STATE_ACTIVE; | 51 | buf->vb.state = STATE_ACTIVE; |
53 | buf->top_seen = 0; | 52 | buf->top_seen = 0; |
54 | 53 | ||
55 | /* dma: setup channel 5 (= TS) */ | ||
56 | control = SAA7134_RS_CONTROL_BURST_16 | | ||
57 | SAA7134_RS_CONTROL_ME | | ||
58 | (buf->pt->dma >> 12); | ||
59 | |||
60 | if (NULL == next) | 54 | if (NULL == next) |
61 | next = buf; | 55 | next = buf; |
62 | if (V4L2_FIELD_TOP == buf->vb.field) { | 56 | if (V4L2_FIELD_TOP == buf->vb.field) { |
@@ -68,8 +62,6 @@ static int buffer_activate(struct saa7134_dev *dev, | |||
68 | saa_writel(SAA7134_RS_BA1(5),saa7134_buffer_base(next)); | 62 | saa_writel(SAA7134_RS_BA1(5),saa7134_buffer_base(next)); |
69 | saa_writel(SAA7134_RS_BA2(5),saa7134_buffer_base(buf)); | 63 | saa_writel(SAA7134_RS_BA2(5),saa7134_buffer_base(buf)); |
70 | } | 64 | } |
71 | saa_writel(SAA7134_RS_PITCH(5),TS_PACKET_SIZE); | ||
72 | saa_writel(SAA7134_RS_CONTROL(5),control); | ||
73 | 65 | ||
74 | /* start DMA */ | 66 | /* start DMA */ |
75 | saa7134_set_dmabits(dev); | 67 | saa7134_set_dmabits(dev); |
@@ -84,6 +76,7 @@ static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb, | |||
84 | struct saa7134_dev *dev = q->priv_data; | 76 | struct saa7134_dev *dev = q->priv_data; |
85 | struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb); | 77 | struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb); |
86 | unsigned int lines, llength, size; | 78 | unsigned int lines, llength, size; |
79 | u32 control; | ||
87 | int err; | 80 | int err; |
88 | 81 | ||
89 | dprintk("buffer_prepare [%p,%s]\n",buf,v4l2_field_names[field]); | 82 | dprintk("buffer_prepare [%p,%s]\n",buf,v4l2_field_names[field]); |
@@ -115,6 +108,18 @@ static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb, | |||
115 | if (err) | 108 | if (err) |
116 | goto oops; | 109 | goto oops; |
117 | } | 110 | } |
111 | |||
112 | /* dma: setup channel 5 (= TS) */ | ||
113 | control = SAA7134_RS_CONTROL_BURST_16 | | ||
114 | SAA7134_RS_CONTROL_ME | | ||
115 | (buf->pt->dma >> 12); | ||
116 | |||
117 | saa_writeb(SAA7134_TS_DMA0, ((lines-1)&0xff)); | ||
118 | saa_writeb(SAA7134_TS_DMA1, (((lines-1)>>8)&0xff)); | ||
119 | saa_writeb(SAA7134_TS_DMA2, ((((lines-1)>>16)&0x3f) | 0x00)); /* TSNOPIT=0, TSCOLAP=0 */ | ||
120 | saa_writel(SAA7134_RS_PITCH(5),TS_PACKET_SIZE); | ||
121 | saa_writel(SAA7134_RS_CONTROL(5),control); | ||
122 | |||
118 | buf->vb.state = STATE_PREPARED; | 123 | buf->vb.state = STATE_PREPARED; |
119 | buf->activate = buffer_activate; | 124 | buf->activate = buffer_activate; |
120 | buf->vb.field = field; | 125 | buf->vb.field = field; |
@@ -164,11 +169,11 @@ EXPORT_SYMBOL_GPL(saa7134_ts_qops); | |||
164 | /* ----------------------------------------------------------- */ | 169 | /* ----------------------------------------------------------- */ |
165 | /* exported stuff */ | 170 | /* exported stuff */ |
166 | 171 | ||
167 | static unsigned int tsbufs = 4; | 172 | static unsigned int tsbufs = 8; |
168 | module_param(tsbufs, int, 0444); | 173 | module_param(tsbufs, int, 0444); |
169 | MODULE_PARM_DESC(tsbufs,"number of ts buffers, range 2-32"); | 174 | MODULE_PARM_DESC(tsbufs,"number of ts buffers, range 2-32"); |
170 | 175 | ||
171 | static unsigned int ts_nr_packets = 30; | 176 | static unsigned int ts_nr_packets = 64; |
172 | module_param(ts_nr_packets, int, 0444); | 177 | module_param(ts_nr_packets, int, 0444); |
173 | MODULE_PARM_DESC(ts_nr_packets,"size of a ts buffers (in ts packets)"); | 178 | MODULE_PARM_DESC(ts_nr_packets,"size of a ts buffers (in ts packets)"); |
174 | 179 | ||
@@ -220,10 +225,10 @@ void saa7134_irq_ts_done(struct saa7134_dev *dev, unsigned long status) | |||
220 | if (dev->ts_q.curr) { | 225 | if (dev->ts_q.curr) { |
221 | field = dev->ts_q.curr->vb.field; | 226 | field = dev->ts_q.curr->vb.field; |
222 | if (field == V4L2_FIELD_TOP) { | 227 | if (field == V4L2_FIELD_TOP) { |
223 | if ((status & 0x100000) != 0x100000) | 228 | if ((status & 0x100000) != 0x000000) |
224 | goto done; | 229 | goto done; |
225 | } else { | 230 | } else { |
226 | if ((status & 0x100000) != 0x000000) | 231 | if ((status & 0x100000) != 0x100000) |
227 | goto done; | 232 | goto done; |
228 | } | 233 | } |
229 | saa7134_buffer_finish(dev,&dev->ts_q,STATE_DONE); | 234 | saa7134_buffer_finish(dev,&dev->ts_q,STATE_DONE); |
diff --git a/drivers/media/video/saa7134/saa7134-tvaudio.c b/drivers/media/video/saa7134/saa7134-tvaudio.c index 61a2d6b50eef..93268427750d 100644 --- a/drivers/media/video/saa7134/saa7134-tvaudio.c +++ b/drivers/media/video/saa7134/saa7134-tvaudio.c | |||
@@ -207,6 +207,10 @@ static void tvaudio_setcarrier(struct saa7134_dev *dev, | |||
207 | saa_writel(SAA7134_CARRIER2_FREQ0 >> 2, tvaudio_carr2reg(secondary)); | 207 | saa_writel(SAA7134_CARRIER2_FREQ0 >> 2, tvaudio_carr2reg(secondary)); |
208 | } | 208 | } |
209 | 209 | ||
210 | #define SAA7134_MUTE_MASK 0xbb | ||
211 | #define SAA7134_MUTE_ANALOG 0x04 | ||
212 | #define SAA7134_MUTE_I2S 0x40 | ||
213 | |||
210 | static void mute_input_7134(struct saa7134_dev *dev) | 214 | static void mute_input_7134(struct saa7134_dev *dev) |
211 | { | 215 | { |
212 | unsigned int mute; | 216 | unsigned int mute; |
@@ -241,7 +245,11 @@ static void mute_input_7134(struct saa7134_dev *dev) | |||
241 | 245 | ||
242 | if (PCI_DEVICE_ID_PHILIPS_SAA7134 == dev->pci->device) | 246 | if (PCI_DEVICE_ID_PHILIPS_SAA7134 == dev->pci->device) |
243 | /* 7134 mute */ | 247 | /* 7134 mute */ |
244 | saa_writeb(SAA7134_AUDIO_MUTE_CTRL, mute ? 0xbf : 0xbb); | 248 | saa_writeb(SAA7134_AUDIO_MUTE_CTRL, mute ? |
249 | SAA7134_MUTE_MASK | | ||
250 | SAA7134_MUTE_ANALOG | | ||
251 | SAA7134_MUTE_I2S : | ||
252 | SAA7134_MUTE_MASK); | ||
245 | 253 | ||
246 | /* switch internal audio mux */ | 254 | /* switch internal audio mux */ |
247 | switch (in->amux) { | 255 | switch (in->amux) { |
@@ -753,17 +761,17 @@ static int mute_input_7133(struct saa7134_dev *dev) | |||
753 | 761 | ||
754 | 762 | ||
755 | /* switch gpio-connected external audio mux */ | 763 | /* switch gpio-connected external audio mux */ |
756 | if (0 != card(dev).gpiomask) { | 764 | if (0 != card(dev).gpiomask) { |
757 | mask = card(dev).gpiomask; | 765 | mask = card(dev).gpiomask; |
758 | 766 | ||
759 | if (card(dev).mute.name && dev->ctl_mute) | 767 | if (card(dev).mute.name && dev->ctl_mute) |
760 | in = &card(dev).mute; | 768 | in = &card(dev).mute; |
761 | else | 769 | else |
762 | in = dev->input; | 770 | in = dev->input; |
763 | 771 | ||
764 | saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, mask, mask); | 772 | saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, mask, mask); |
765 | saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, mask, in->gpio); | 773 | saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, mask, in->gpio); |
766 | saa7134_track_gpio(dev,in->name); | 774 | saa7134_track_gpio(dev,in->name); |
767 | } | 775 | } |
768 | 776 | ||
769 | return 0; | 777 | return 0; |
@@ -1016,9 +1024,12 @@ int saa7134_tvaudio_do_scan(struct saa7134_dev *dev) | |||
1016 | return 0; | 1024 | return 0; |
1017 | } | 1025 | } |
1018 | 1026 | ||
1027 | EXPORT_SYMBOL(saa_dsp_writel); | ||
1028 | |||
1019 | /* ----------------------------------------------------------- */ | 1029 | /* ----------------------------------------------------------- */ |
1020 | /* | 1030 | /* |
1021 | * Local variables: | 1031 | * Local variables: |
1022 | * c-basic-offset: 8 | 1032 | * c-basic-offset: 8 |
1023 | * End: | 1033 | * End: |
1024 | */ | 1034 | */ |
1035 | |||
diff --git a/drivers/media/video/saa7134/saa7134-video.c b/drivers/media/video/saa7134/saa7134-video.c index 35e5e85f669a..45c852df13ed 100644 --- a/drivers/media/video/saa7134/saa7134-video.c +++ b/drivers/media/video/saa7134/saa7134-video.c | |||
@@ -30,6 +30,9 @@ | |||
30 | #include "saa7134-reg.h" | 30 | #include "saa7134-reg.h" |
31 | #include "saa7134.h" | 31 | #include "saa7134.h" |
32 | 32 | ||
33 | /* Include V4L1 specific functions. Should be removed soon */ | ||
34 | #include <linux/videodev.h> | ||
35 | |||
33 | /* ------------------------------------------------------------------ */ | 36 | /* ------------------------------------------------------------------ */ |
34 | 37 | ||
35 | static unsigned int video_debug = 0; | 38 | static unsigned int video_debug = 0; |
@@ -48,6 +51,43 @@ MODULE_PARM_DESC(noninterlaced,"video input is noninterlaced"); | |||
48 | printk(KERN_DEBUG "%s/video: " fmt, dev->name , ## arg) | 51 | printk(KERN_DEBUG "%s/video: " fmt, dev->name , ## arg) |
49 | 52 | ||
50 | /* ------------------------------------------------------------------ */ | 53 | /* ------------------------------------------------------------------ */ |
54 | /* Defines for Video Output Port Register at address 0x191 */ | ||
55 | |||
56 | /* Bit 0: VIP code T bit polarity */ | ||
57 | |||
58 | #define VP_T_CODE_P_NON_INVERTED 0x00 | ||
59 | #define VP_T_CODE_P_INVERTED 0x01 | ||
60 | |||
61 | /* ------------------------------------------------------------------ */ | ||
62 | /* Defines for Video Output Port Register at address 0x195 */ | ||
63 | |||
64 | /* Bit 2: Video output clock delay control */ | ||
65 | |||
66 | #define VP_CLK_CTRL2_NOT_DELAYED 0x00 | ||
67 | #define VP_CLK_CTRL2_DELAYED 0x04 | ||
68 | |||
69 | /* Bit 1: Video output clock invert control */ | ||
70 | |||
71 | #define VP_CLK_CTRL1_NON_INVERTED 0x00 | ||
72 | #define VP_CLK_CTRL1_INVERTED 0x02 | ||
73 | |||
74 | /* ------------------------------------------------------------------ */ | ||
75 | /* Defines for Video Output Port Register at address 0x196 */ | ||
76 | |||
77 | /* Bits 2 to 0: VSYNC pin video vertical sync type */ | ||
78 | |||
79 | #define VP_VS_TYPE_MASK 0x07 | ||
80 | |||
81 | #define VP_VS_TYPE_OFF 0x00 | ||
82 | #define VP_VS_TYPE_V123 0x01 | ||
83 | #define VP_VS_TYPE_V_ITU 0x02 | ||
84 | #define VP_VS_TYPE_VGATE_L 0x03 | ||
85 | #define VP_VS_TYPE_RESERVED1 0x04 | ||
86 | #define VP_VS_TYPE_RESERVED2 0x05 | ||
87 | #define VP_VS_TYPE_F_ITU 0x06 | ||
88 | #define VP_VS_TYPE_SC_FID 0x07 | ||
89 | |||
90 | /* ------------------------------------------------------------------ */ | ||
51 | /* data structs for video */ | 91 | /* data structs for video */ |
52 | 92 | ||
53 | static int video_out[][9] = { | 93 | static int video_out[][9] = { |
@@ -273,12 +313,12 @@ static struct saa7134_tvnorm tvnorms[] = { | |||
273 | 313 | ||
274 | .h_start = 0, | 314 | .h_start = 0, |
275 | .h_stop = 719, | 315 | .h_stop = 719, |
276 | .video_v_start = 23, | 316 | .video_v_start = 23, |
277 | .video_v_stop = 262, | 317 | .video_v_stop = 262, |
278 | .vbi_v_start_0 = 10, | 318 | .vbi_v_start_0 = 10, |
279 | .vbi_v_stop_0 = 21, | 319 | .vbi_v_stop_0 = 21, |
280 | .vbi_v_start_1 = 273, | 320 | .vbi_v_start_1 = 273, |
281 | .src_timing = 7, | 321 | .src_timing = 7, |
282 | 322 | ||
283 | .sync_control = 0x18, | 323 | .sync_control = 0x18, |
284 | .luma_control = 0x40, | 324 | .luma_control = 0x40, |
@@ -622,7 +662,7 @@ static void set_size(struct saa7134_dev *dev, int task, | |||
622 | prescale = 1; | 662 | prescale = 1; |
623 | xscale = 1024 * dev->crop_current.width / prescale / width; | 663 | xscale = 1024 * dev->crop_current.width / prescale / width; |
624 | yscale = 512 * div * dev->crop_current.height / height; | 664 | yscale = 512 * div * dev->crop_current.height / height; |
625 | dprintk("prescale=%d xscale=%d yscale=%d\n",prescale,xscale,yscale); | 665 | dprintk("prescale=%d xscale=%d yscale=%d\n",prescale,xscale,yscale); |
626 | set_h_prescale(dev,task,prescale); | 666 | set_h_prescale(dev,task,prescale); |
627 | saa_writeb(SAA7134_H_SCALE_INC1(task), xscale & 0xff); | 667 | saa_writeb(SAA7134_H_SCALE_INC1(task), xscale & 0xff); |
628 | saa_writeb(SAA7134_H_SCALE_INC2(task), xscale >> 8); | 668 | saa_writeb(SAA7134_H_SCALE_INC2(task), xscale >> 8); |
@@ -752,20 +792,20 @@ static int verify_preview(struct saa7134_dev *dev, struct v4l2_window *win) | |||
752 | maxh = dev->crop_current.height; | 792 | maxh = dev->crop_current.height; |
753 | 793 | ||
754 | if (V4L2_FIELD_ANY == field) { | 794 | if (V4L2_FIELD_ANY == field) { |
755 | field = (win->w.height > maxh/2) | 795 | field = (win->w.height > maxh/2) |
756 | ? V4L2_FIELD_INTERLACED | 796 | ? V4L2_FIELD_INTERLACED |
757 | : V4L2_FIELD_TOP; | 797 | : V4L2_FIELD_TOP; |
758 | } | 798 | } |
759 | switch (field) { | 799 | switch (field) { |
760 | case V4L2_FIELD_TOP: | 800 | case V4L2_FIELD_TOP: |
761 | case V4L2_FIELD_BOTTOM: | 801 | case V4L2_FIELD_BOTTOM: |
762 | maxh = maxh / 2; | 802 | maxh = maxh / 2; |
763 | break; | 803 | break; |
764 | case V4L2_FIELD_INTERLACED: | 804 | case V4L2_FIELD_INTERLACED: |
765 | break; | 805 | break; |
766 | default: | 806 | default: |
767 | return -EINVAL; | 807 | return -EINVAL; |
768 | } | 808 | } |
769 | 809 | ||
770 | win->field = field; | 810 | win->field = field; |
771 | if (win->w.width > maxw) | 811 | if (win->w.width > maxw) |
@@ -1306,13 +1346,13 @@ video_poll(struct file *file, struct poll_table_struct *wait) | |||
1306 | if (res_locked(fh->dev,RESOURCE_VIDEO)) { | 1346 | if (res_locked(fh->dev,RESOURCE_VIDEO)) { |
1307 | up(&fh->cap.lock); | 1347 | up(&fh->cap.lock); |
1308 | return POLLERR; | 1348 | return POLLERR; |
1309 | } | 1349 | } |
1310 | if (0 != fh->cap.ops->buf_prepare(&fh->cap,fh->cap.read_buf,fh->cap.field)) { | 1350 | if (0 != fh->cap.ops->buf_prepare(&fh->cap,fh->cap.read_buf,fh->cap.field)) { |
1311 | up(&fh->cap.lock); | 1351 | up(&fh->cap.lock); |
1312 | return POLLERR; | 1352 | return POLLERR; |
1313 | } | 1353 | } |
1314 | fh->cap.ops->buf_queue(&fh->cap,fh->cap.read_buf); | 1354 | fh->cap.ops->buf_queue(&fh->cap,fh->cap.read_buf); |
1315 | fh->cap.read_off = 0; | 1355 | fh->cap.read_off = 0; |
1316 | } | 1356 | } |
1317 | up(&fh->cap.lock); | 1357 | up(&fh->cap.lock); |
1318 | buf = fh->cap.read_buf; | 1358 | buf = fh->cap.read_buf; |
@@ -1666,9 +1706,10 @@ static int video_do_ioctl(struct inode *inode, struct file *file, | |||
1666 | case VIDIOC_QUERYCAP: | 1706 | case VIDIOC_QUERYCAP: |
1667 | { | 1707 | { |
1668 | struct v4l2_capability *cap = arg; | 1708 | struct v4l2_capability *cap = arg; |
1709 | unsigned int tuner_type = dev->tuner_type; | ||
1669 | 1710 | ||
1670 | memset(cap,0,sizeof(*cap)); | 1711 | memset(cap,0,sizeof(*cap)); |
1671 | strcpy(cap->driver, "saa7134"); | 1712 | strcpy(cap->driver, "saa7134"); |
1672 | strlcpy(cap->card, saa7134_boards[dev->board].name, | 1713 | strlcpy(cap->card, saa7134_boards[dev->board].name, |
1673 | sizeof(cap->card)); | 1714 | sizeof(cap->card)); |
1674 | sprintf(cap->bus_info,"PCI:%s",pci_name(dev->pci)); | 1715 | sprintf(cap->bus_info,"PCI:%s",pci_name(dev->pci)); |
@@ -1677,9 +1718,13 @@ static int video_do_ioctl(struct inode *inode, struct file *file, | |||
1677 | V4L2_CAP_VIDEO_CAPTURE | | 1718 | V4L2_CAP_VIDEO_CAPTURE | |
1678 | V4L2_CAP_VIDEO_OVERLAY | | 1719 | V4L2_CAP_VIDEO_OVERLAY | |
1679 | V4L2_CAP_VBI_CAPTURE | | 1720 | V4L2_CAP_VBI_CAPTURE | |
1680 | V4L2_CAP_TUNER | | ||
1681 | V4L2_CAP_READWRITE | | 1721 | V4L2_CAP_READWRITE | |
1682 | V4L2_CAP_STREAMING; | 1722 | V4L2_CAP_STREAMING | |
1723 | V4L2_CAP_TUNER; | ||
1724 | |||
1725 | if ((tuner_type == TUNER_ABSENT) || (tuner_type == UNSET)) | ||
1726 | cap->capabilities &= ~V4L2_CAP_TUNER; | ||
1727 | |||
1683 | return 0; | 1728 | return 0; |
1684 | } | 1729 | } |
1685 | 1730 | ||
@@ -1793,9 +1838,9 @@ static int video_do_ioctl(struct inode *inode, struct file *file, | |||
1793 | crop->c.height = b->top - crop->c.top + b->height; | 1838 | crop->c.height = b->top - crop->c.top + b->height; |
1794 | 1839 | ||
1795 | if (crop->c.left < b->left) | 1840 | if (crop->c.left < b->left) |
1796 | crop->c.top = b->left; | 1841 | crop->c.left = b->left; |
1797 | if (crop->c.left > b->left + b->width) | 1842 | if (crop->c.left > b->left + b->width) |
1798 | crop->c.top = b->left + b->width; | 1843 | crop->c.left = b->left + b->width; |
1799 | if (crop->c.width > b->left - crop->c.left + b->width) | 1844 | if (crop->c.width > b->left - crop->c.left + b->width) |
1800 | crop->c.width = b->left - crop->c.left + b->width; | 1845 | crop->c.width = b->left - crop->c.left + b->width; |
1801 | 1846 | ||
@@ -1817,6 +1862,7 @@ static int video_do_ioctl(struct inode *inode, struct file *file, | |||
1817 | break; | 1862 | break; |
1818 | if (NULL != card_in(dev,n).name) { | 1863 | if (NULL != card_in(dev,n).name) { |
1819 | strcpy(t->name, "Television"); | 1864 | strcpy(t->name, "Television"); |
1865 | t->type = V4L2_TUNER_ANALOG_TV; | ||
1820 | t->capability = V4L2_TUNER_CAP_NORM | | 1866 | t->capability = V4L2_TUNER_CAP_NORM | |
1821 | V4L2_TUNER_CAP_STEREO | | 1867 | V4L2_TUNER_CAP_STEREO | |
1822 | V4L2_TUNER_CAP_LANG1 | | 1868 | V4L2_TUNER_CAP_LANG1 | |
@@ -1892,26 +1938,26 @@ static int video_do_ioctl(struct inode *inode, struct file *file, | |||
1892 | } | 1938 | } |
1893 | case VIDIOC_S_AUDIO: | 1939 | case VIDIOC_S_AUDIO: |
1894 | return 0; | 1940 | return 0; |
1895 | case VIDIOC_G_PARM: | 1941 | case VIDIOC_G_PARM: |
1896 | { | 1942 | { |
1897 | struct v4l2_captureparm *parm = arg; | 1943 | struct v4l2_captureparm *parm = arg; |
1898 | memset(parm,0,sizeof(*parm)); | 1944 | memset(parm,0,sizeof(*parm)); |
1899 | return 0; | 1945 | return 0; |
1900 | } | 1946 | } |
1901 | 1947 | ||
1902 | case VIDIOC_G_PRIORITY: | 1948 | case VIDIOC_G_PRIORITY: |
1903 | { | 1949 | { |
1904 | enum v4l2_priority *p = arg; | 1950 | enum v4l2_priority *p = arg; |
1905 | 1951 | ||
1906 | *p = v4l2_prio_max(&dev->prio); | 1952 | *p = v4l2_prio_max(&dev->prio); |
1907 | return 0; | 1953 | return 0; |
1908 | } | 1954 | } |
1909 | case VIDIOC_S_PRIORITY: | 1955 | case VIDIOC_S_PRIORITY: |
1910 | { | 1956 | { |
1911 | enum v4l2_priority *prio = arg; | 1957 | enum v4l2_priority *prio = arg; |
1912 | 1958 | ||
1913 | return v4l2_prio_change(&dev->prio, &fh->prio, *prio); | 1959 | return v4l2_prio_change(&dev->prio, &fh->prio, *prio); |
1914 | } | 1960 | } |
1915 | 1961 | ||
1916 | /* --- preview ioctls ---------------------------------------- */ | 1962 | /* --- preview ioctls ---------------------------------------- */ |
1917 | case VIDIOC_ENUM_FMT: | 1963 | case VIDIOC_ENUM_FMT: |
@@ -2018,7 +2064,7 @@ static int video_do_ioctl(struct inode *inode, struct file *file, | |||
2018 | struct v4l2_format *f = arg; | 2064 | struct v4l2_format *f = arg; |
2019 | return saa7134_try_fmt(dev,fh,f); | 2065 | return saa7134_try_fmt(dev,fh,f); |
2020 | } | 2066 | } |
2021 | 2067 | #ifdef HAVE_V4L1 | |
2022 | case VIDIOCGMBUF: | 2068 | case VIDIOCGMBUF: |
2023 | { | 2069 | { |
2024 | struct video_mbuf *mbuf = arg; | 2070 | struct video_mbuf *mbuf = arg; |
@@ -2043,6 +2089,7 @@ static int video_do_ioctl(struct inode *inode, struct file *file, | |||
2043 | } | 2089 | } |
2044 | return 0; | 2090 | return 0; |
2045 | } | 2091 | } |
2092 | #endif | ||
2046 | case VIDIOC_REQBUFS: | 2093 | case VIDIOC_REQBUFS: |
2047 | return videobuf_reqbufs(saa7134_queue(fh),arg); | 2094 | return videobuf_reqbufs(saa7134_queue(fh),arg); |
2048 | 2095 | ||
@@ -2060,7 +2107,7 @@ static int video_do_ioctl(struct inode *inode, struct file *file, | |||
2060 | { | 2107 | { |
2061 | int res = saa7134_resource(fh); | 2108 | int res = saa7134_resource(fh); |
2062 | 2109 | ||
2063 | if (!res_get(dev,fh,res)) | 2110 | if (!res_get(dev,fh,res)) |
2064 | return -EBUSY; | 2111 | return -EBUSY; |
2065 | return videobuf_streamon(saa7134_queue(fh)); | 2112 | return videobuf_streamon(saa7134_queue(fh)); |
2066 | } | 2113 | } |
@@ -2102,7 +2149,7 @@ static int radio_do_ioctl(struct inode *inode, struct file *file, | |||
2102 | struct v4l2_capability *cap = arg; | 2149 | struct v4l2_capability *cap = arg; |
2103 | 2150 | ||
2104 | memset(cap,0,sizeof(*cap)); | 2151 | memset(cap,0,sizeof(*cap)); |
2105 | strcpy(cap->driver, "saa7134"); | 2152 | strcpy(cap->driver, "saa7134"); |
2106 | strlcpy(cap->card, saa7134_boards[dev->board].name, | 2153 | strlcpy(cap->card, saa7134_boards[dev->board].name, |
2107 | sizeof(cap->card)); | 2154 | sizeof(cap->card)); |
2108 | sprintf(cap->bus_info,"PCI:%s",pci_name(dev->pci)); | 2155 | sprintf(cap->bus_info,"PCI:%s",pci_name(dev->pci)); |
@@ -2119,6 +2166,7 @@ static int radio_do_ioctl(struct inode *inode, struct file *file, | |||
2119 | 2166 | ||
2120 | memset(t,0,sizeof(*t)); | 2167 | memset(t,0,sizeof(*t)); |
2121 | strcpy(t->name, "Radio"); | 2168 | strcpy(t->name, "Radio"); |
2169 | t->type = V4L2_TUNER_RADIO; | ||
2122 | 2170 | ||
2123 | saa7134_i2c_call_clients(dev, VIDIOC_G_TUNER, t); | 2171 | saa7134_i2c_call_clients(dev, VIDIOC_G_TUNER, t); |
2124 | 2172 | ||
@@ -2233,7 +2281,7 @@ struct video_device saa7134_video_template = | |||
2233 | { | 2281 | { |
2234 | .name = "saa7134-video", | 2282 | .name = "saa7134-video", |
2235 | .type = VID_TYPE_CAPTURE|VID_TYPE_TUNER|VID_TYPE_OVERLAY| | 2283 | .type = VID_TYPE_CAPTURE|VID_TYPE_TUNER|VID_TYPE_OVERLAY| |
2236 | VID_TYPE_CLIPPING|VID_TYPE_SCALES, | 2284 | VID_TYPE_CLIPPING|VID_TYPE_SCALES, |
2237 | .hardware = 0, | 2285 | .hardware = 0, |
2238 | .fops = &video_fops, | 2286 | .fops = &video_fops, |
2239 | .minor = -1, | 2287 | .minor = -1, |
@@ -2280,7 +2328,7 @@ int saa7134_video_init1(struct saa7134_dev *dev) | |||
2280 | dev->tda9887_conf |= TDA9887_AUTOMUTE; | 2328 | dev->tda9887_conf |= TDA9887_AUTOMUTE; |
2281 | dev->automute = 0; | 2329 | dev->automute = 0; |
2282 | 2330 | ||
2283 | INIT_LIST_HEAD(&dev->video_q.queue); | 2331 | INIT_LIST_HEAD(&dev->video_q.queue); |
2284 | init_timer(&dev->video_q.timeout); | 2332 | init_timer(&dev->video_q.timeout); |
2285 | dev->video_q.timeout.function = saa7134_buffer_timeout; | 2333 | dev->video_q.timeout.function = saa7134_buffer_timeout; |
2286 | dev->video_q.timeout.data = (unsigned long)(&dev->video_q); | 2334 | dev->video_q.timeout.data = (unsigned long)(&dev->video_q); |
@@ -2289,13 +2337,28 @@ int saa7134_video_init1(struct saa7134_dev *dev) | |||
2289 | if (saa7134_boards[dev->board].video_out) { | 2337 | if (saa7134_boards[dev->board].video_out) { |
2290 | /* enable video output */ | 2338 | /* enable video output */ |
2291 | int vo = saa7134_boards[dev->board].video_out; | 2339 | int vo = saa7134_boards[dev->board].video_out; |
2340 | int video_reg; | ||
2341 | unsigned int vid_port_opts = saa7134_boards[dev->board].vid_port_opts; | ||
2292 | saa_writeb(SAA7134_VIDEO_PORT_CTRL0, video_out[vo][0]); | 2342 | saa_writeb(SAA7134_VIDEO_PORT_CTRL0, video_out[vo][0]); |
2293 | saa_writeb(SAA7134_VIDEO_PORT_CTRL1, video_out[vo][1]); | 2343 | video_reg = video_out[vo][1]; |
2344 | if (vid_port_opts & SET_T_CODE_POLARITY_NON_INVERTED) | ||
2345 | video_reg &= ~VP_T_CODE_P_INVERTED; | ||
2346 | saa_writeb(SAA7134_VIDEO_PORT_CTRL1, video_reg); | ||
2294 | saa_writeb(SAA7134_VIDEO_PORT_CTRL2, video_out[vo][2]); | 2347 | saa_writeb(SAA7134_VIDEO_PORT_CTRL2, video_out[vo][2]); |
2295 | saa_writeb(SAA7134_VIDEO_PORT_CTRL3, video_out[vo][3]); | 2348 | saa_writeb(SAA7134_VIDEO_PORT_CTRL3, video_out[vo][3]); |
2296 | saa_writeb(SAA7134_VIDEO_PORT_CTRL4, video_out[vo][4]); | 2349 | saa_writeb(SAA7134_VIDEO_PORT_CTRL4, video_out[vo][4]); |
2297 | saa_writeb(SAA7134_VIDEO_PORT_CTRL5, video_out[vo][5]); | 2350 | video_reg = video_out[vo][5]; |
2298 | saa_writeb(SAA7134_VIDEO_PORT_CTRL6, video_out[vo][6]); | 2351 | if (vid_port_opts & SET_CLOCK_NOT_DELAYED) |
2352 | video_reg &= ~VP_CLK_CTRL2_DELAYED; | ||
2353 | if (vid_port_opts & SET_CLOCK_INVERTED) | ||
2354 | video_reg |= VP_CLK_CTRL1_INVERTED; | ||
2355 | saa_writeb(SAA7134_VIDEO_PORT_CTRL5, video_reg); | ||
2356 | video_reg = video_out[vo][6]; | ||
2357 | if (vid_port_opts & SET_VSYNC_OFF) { | ||
2358 | video_reg &= ~VP_VS_TYPE_MASK; | ||
2359 | video_reg |= VP_VS_TYPE_OFF; | ||
2360 | } | ||
2361 | saa_writeb(SAA7134_VIDEO_PORT_CTRL6, video_reg); | ||
2299 | saa_writeb(SAA7134_VIDEO_PORT_CTRL7, video_out[vo][7]); | 2362 | saa_writeb(SAA7134_VIDEO_PORT_CTRL7, video_out[vo][7]); |
2300 | saa_writeb(SAA7134_VIDEO_PORT_CTRL8, video_out[vo][8]); | 2363 | saa_writeb(SAA7134_VIDEO_PORT_CTRL8, video_out[vo][8]); |
2301 | } | 2364 | } |
diff --git a/drivers/media/video/saa7134/saa7134.h b/drivers/media/video/saa7134/saa7134.h index 860b89530e2a..fb9727471661 100644 --- a/drivers/media/video/saa7134/saa7134.h +++ b/drivers/media/video/saa7134/saa7134.h | |||
@@ -24,16 +24,18 @@ | |||
24 | 24 | ||
25 | #include <linux/pci.h> | 25 | #include <linux/pci.h> |
26 | #include <linux/i2c.h> | 26 | #include <linux/i2c.h> |
27 | #include <linux/videodev.h> | 27 | #include <linux/videodev2.h> |
28 | #include <linux/kdev_t.h> | 28 | #include <linux/kdev_t.h> |
29 | #include <linux/input.h> | 29 | #include <linux/input.h> |
30 | #include <linux/notifier.h> | ||
31 | #include <linux/delay.h> | ||
30 | 32 | ||
31 | #include <asm/io.h> | 33 | #include <asm/io.h> |
32 | 34 | ||
33 | #include <media/tuner.h> | 35 | #include <media/tuner.h> |
34 | #include <media/audiochip.h> | 36 | #include <media/audiochip.h> |
35 | #include <media/id.h> | ||
36 | #include <media/ir-common.h> | 37 | #include <media/ir-common.h> |
38 | #include <media/ir-kbd-i2c.h> | ||
37 | #include <media/video-buf.h> | 39 | #include <media/video-buf.h> |
38 | #include <media/video-buf-dvb.h> | 40 | #include <media/video-buf-dvb.h> |
39 | 41 | ||
@@ -45,6 +47,10 @@ | |||
45 | #endif | 47 | #endif |
46 | #define UNSET (-1U) | 48 | #define UNSET (-1U) |
47 | 49 | ||
50 | #include <sound/driver.h> | ||
51 | #include <sound/core.h> | ||
52 | #include <sound/pcm.h> | ||
53 | |||
48 | /* ----------------------------------------------------------- */ | 54 | /* ----------------------------------------------------------- */ |
49 | /* enums */ | 55 | /* enums */ |
50 | 56 | ||
@@ -187,10 +193,39 @@ struct saa7134_format { | |||
187 | #define SAA7134_BOARD_FLYTV_DIGIMATRIX 64 | 193 | #define SAA7134_BOARD_FLYTV_DIGIMATRIX 64 |
188 | #define SAA7134_BOARD_KWORLD_TERMINATOR 65 | 194 | #define SAA7134_BOARD_KWORLD_TERMINATOR 65 |
189 | #define SAA7134_BOARD_YUAN_TUN900 66 | 195 | #define SAA7134_BOARD_YUAN_TUN900 66 |
196 | #define SAA7134_BOARD_BEHOLD_409FM 67 | ||
197 | #define SAA7134_BOARD_GOTVIEW_7135 68 | ||
198 | #define SAA7134_BOARD_PHILIPS_EUROPA 69 | ||
199 | #define SAA7134_BOARD_VIDEOMATE_DVBT_300 70 | ||
200 | #define SAA7134_BOARD_VIDEOMATE_DVBT_200 71 | ||
201 | #define SAA7134_BOARD_RTD_VFG7350 72 | ||
202 | #define SAA7134_BOARD_RTD_VFG7330 73 | ||
203 | #define SAA7134_BOARD_FLYTVPLATINUM_MINI2 74 | ||
204 | #define SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180 75 | ||
205 | #define SAA7134_BOARD_MONSTERTV_MOBILE 76 | ||
206 | #define SAA7134_BOARD_PINNACLE_PCTV_110i 77 | ||
207 | #define SAA7134_BOARD_ASUSTeK_P7131_DUAL 78 | ||
208 | #define SAA7134_BOARD_SEDNA_PC_TV_CARDBUS 79 | ||
209 | #define SAA7134_BOARD_ASUSTEK_DIGIMATRIX_TV 80 | ||
210 | #define SAA7134_BOARD_PHILIPS_TIGER 81 | ||
190 | 211 | ||
191 | #define SAA7134_MAXBOARDS 8 | 212 | #define SAA7134_MAXBOARDS 8 |
192 | #define SAA7134_INPUT_MAX 8 | 213 | #define SAA7134_INPUT_MAX 8 |
193 | 214 | ||
215 | /* ----------------------------------------------------------- */ | ||
216 | /* Since we support 2 remote types, lets tell them apart */ | ||
217 | |||
218 | #define SAA7134_REMOTE_GPIO 1 | ||
219 | #define SAA7134_REMOTE_I2C 2 | ||
220 | |||
221 | /* ----------------------------------------------------------- */ | ||
222 | /* Video Output Port Register Initialization Options */ | ||
223 | |||
224 | #define SET_T_CODE_POLARITY_NON_INVERTED (1 << 0) | ||
225 | #define SET_CLOCK_NOT_DELAYED (1 << 1) | ||
226 | #define SET_CLOCK_INVERTED (1 << 2) | ||
227 | #define SET_VSYNC_OFF (1 << 3) | ||
228 | |||
194 | struct saa7134_input { | 229 | struct saa7134_input { |
195 | char *name; | 230 | char *name; |
196 | unsigned int vmux; | 231 | unsigned int vmux; |
@@ -226,6 +261,7 @@ struct saa7134_board { | |||
226 | /* peripheral I/O */ | 261 | /* peripheral I/O */ |
227 | enum saa7134_video_out video_out; | 262 | enum saa7134_video_out video_out; |
228 | enum saa7134_mpeg_type mpeg; | 263 | enum saa7134_mpeg_type mpeg; |
264 | unsigned int vid_port_opts; | ||
229 | }; | 265 | }; |
230 | 266 | ||
231 | #define card_has_radio(dev) (NULL != saa7134_boards[dev->board].radio.name) | 267 | #define card_has_radio(dev) (NULL != saa7134_boards[dev->board].radio.name) |
@@ -319,9 +355,9 @@ struct saa7134_fh { | |||
319 | struct saa7134_pgtable pt_vbi; | 355 | struct saa7134_pgtable pt_vbi; |
320 | }; | 356 | }; |
321 | 357 | ||
322 | /* oss dsp status */ | 358 | /* dmasound dsp status */ |
323 | struct saa7134_oss { | 359 | struct saa7134_dmasound { |
324 | struct semaphore lock; | 360 | struct semaphore lock; |
325 | int minor_mixer; | 361 | int minor_mixer; |
326 | int minor_dsp; | 362 | int minor_dsp; |
327 | unsigned int users_dsp; | 363 | unsigned int users_dsp; |
@@ -347,6 +383,7 @@ struct saa7134_oss { | |||
347 | unsigned int dma_blk; | 383 | unsigned int dma_blk; |
348 | unsigned int read_offset; | 384 | unsigned int read_offset; |
349 | unsigned int read_count; | 385 | unsigned int read_count; |
386 | snd_pcm_substream_t *substream; | ||
350 | }; | 387 | }; |
351 | 388 | ||
352 | /* IR input */ | 389 | /* IR input */ |
@@ -358,9 +395,9 @@ struct saa7134_ir { | |||
358 | u32 mask_keycode; | 395 | u32 mask_keycode; |
359 | u32 mask_keydown; | 396 | u32 mask_keydown; |
360 | u32 mask_keyup; | 397 | u32 mask_keyup; |
361 | int polling; | 398 | int polling; |
362 | u32 last_gpio; | 399 | u32 last_gpio; |
363 | struct timer_list timer; | 400 | struct timer_list timer; |
364 | }; | 401 | }; |
365 | 402 | ||
366 | /* ts/mpeg status */ | 403 | /* ts/mpeg status */ |
@@ -383,8 +420,8 @@ struct saa7134_mpeg_ops { | |||
383 | /* global device status */ | 420 | /* global device status */ |
384 | struct saa7134_dev { | 421 | struct saa7134_dev { |
385 | struct list_head devlist; | 422 | struct list_head devlist; |
386 | struct semaphore lock; | 423 | struct semaphore lock; |
387 | spinlock_t slock; | 424 | spinlock_t slock; |
388 | #ifdef VIDIOC_G_PRIORITY | 425 | #ifdef VIDIOC_G_PRIORITY |
389 | struct v4l2_prio_state prio; | 426 | struct v4l2_prio_state prio; |
390 | #endif | 427 | #endif |
@@ -394,7 +431,7 @@ struct saa7134_dev { | |||
394 | struct video_device *video_dev; | 431 | struct video_device *video_dev; |
395 | struct video_device *radio_dev; | 432 | struct video_device *radio_dev; |
396 | struct video_device *vbi_dev; | 433 | struct video_device *vbi_dev; |
397 | struct saa7134_oss oss; | 434 | struct saa7134_dmasound dmasound; |
398 | 435 | ||
399 | /* infrared remote */ | 436 | /* infrared remote */ |
400 | int has_remote; | 437 | int has_remote; |
@@ -421,7 +458,7 @@ struct saa7134_dev { | |||
421 | /* i2c i/o */ | 458 | /* i2c i/o */ |
422 | struct i2c_adapter i2c_adap; | 459 | struct i2c_adapter i2c_adap; |
423 | struct i2c_client i2c_client; | 460 | struct i2c_client i2c_client; |
424 | unsigned char eedata[64]; | 461 | unsigned char eedata[128]; |
425 | 462 | ||
426 | /* video overlay */ | 463 | /* video overlay */ |
427 | struct v4l2_framebuffer ovbuf; | 464 | struct v4l2_framebuffer ovbuf; |
@@ -626,6 +663,7 @@ void saa7134_irq_oss_done(struct saa7134_dev *dev, unsigned long status); | |||
626 | int saa7134_input_init1(struct saa7134_dev *dev); | 663 | int saa7134_input_init1(struct saa7134_dev *dev); |
627 | void saa7134_input_fini(struct saa7134_dev *dev); | 664 | void saa7134_input_fini(struct saa7134_dev *dev); |
628 | void saa7134_input_irq(struct saa7134_dev *dev); | 665 | void saa7134_input_irq(struct saa7134_dev *dev); |
666 | void saa7134_set_i2c_ir(struct saa7134_dev *dev, struct IR_i2c *ir); | ||
629 | 667 | ||
630 | /* | 668 | /* |
631 | * Local variables: | 669 | * Local variables: |