aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/radio/radio-aztech.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/radio/radio-aztech.c')
-rw-r--r--drivers/media/radio/radio-aztech.c163
1 files changed, 113 insertions, 50 deletions
diff --git a/drivers/media/radio/radio-aztech.c b/drivers/media/radio/radio-aztech.c
index 63697ab517f9..f21d918b3f99 100644
--- a/drivers/media/radio/radio-aztech.c
+++ b/drivers/media/radio/radio-aztech.c
@@ -1,5 +1,6 @@
1/* radio-aztech.c - Aztech radio card driver for Linux 2.2 1/* radio-aztech.c - Aztech radio card driver for Linux 2.2
2 * 2 *
3 * Converted to V4L2 API by Mauro Carvalho Chehab <mchehab@infradead.org>
3 * Adapted to support the Video for Linux API by 4 * Adapted to support the Video for Linux API by
4 * Russell Kroll <rkroll@exploits.org>. Based on original tuner code by: 5 * Russell Kroll <rkroll@exploits.org>. Based on original tuner code by:
5 * 6 *
@@ -30,9 +31,31 @@
30#include <linux/delay.h> /* udelay */ 31#include <linux/delay.h> /* udelay */
31#include <asm/io.h> /* outb, outb_p */ 32#include <asm/io.h> /* outb, outb_p */
32#include <asm/uaccess.h> /* copy to/from user */ 33#include <asm/uaccess.h> /* copy to/from user */
33#include <linux/videodev.h> /* kernel radio structs */ 34#include <linux/videodev2.h> /* kernel radio structs */
34#include <media/v4l2-common.h> 35#include <media/v4l2-common.h>
35 36
37#include <linux/version.h> /* for KERNEL_VERSION MACRO */
38#define RADIO_VERSION KERNEL_VERSION(0,0,2)
39
40static struct v4l2_queryctrl radio_qctrl[] = {
41 {
42 .id = V4L2_CID_AUDIO_MUTE,
43 .name = "Mute",
44 .minimum = 0,
45 .maximum = 1,
46 .default_value = 1,
47 .type = V4L2_CTRL_TYPE_BOOLEAN,
48 },{
49 .id = V4L2_CID_AUDIO_VOLUME,
50 .name = "Volume",
51 .minimum = 0,
52 .maximum = 0xff,
53 .step = 1,
54 .default_value = 0xff,
55 .type = V4L2_CTRL_TYPE_INTEGER,
56 }
57};
58
36/* acceptable ports: 0x350 (JP3 shorted), 0x358 (JP3 open) */ 59/* acceptable ports: 0x350 (JP3 shorted), 0x358 (JP3 open) */
37 60
38#ifndef CONFIG_RADIO_AZTECH_PORT 61#ifndef CONFIG_RADIO_AZTECH_PORT
@@ -165,81 +188,121 @@ static int az_do_ioctl(struct inode *inode, struct file *file,
165 188
166 switch(cmd) 189 switch(cmd)
167 { 190 {
168 case VIDIOCGCAP: 191 case VIDIOC_QUERYCAP:
169 { 192 {
170 struct video_capability *v = arg; 193 struct v4l2_capability *v = arg;
171 memset(v,0,sizeof(*v)); 194 memset(v,0,sizeof(*v));
172 v->type=VID_TYPE_TUNER; 195 strlcpy(v->driver, "radio-aztech", sizeof (v->driver));
173 v->channels=1; 196 strlcpy(v->card, "Aztech Radio", sizeof (v->card));
174 v->audios=1; 197 sprintf(v->bus_info,"ISA");
175 strcpy(v->name, "Aztech Radio"); 198 v->version = RADIO_VERSION;
199 v->capabilities = V4L2_CAP_TUNER;
200
176 return 0; 201 return 0;
177 } 202 }
178 case VIDIOCGTUNER: 203 case VIDIOC_G_TUNER:
179 { 204 {
180 struct video_tuner *v = arg; 205 struct v4l2_tuner *v = arg;
181 if(v->tuner) /* Only 1 tuner */ 206
207 if (v->index > 0)
182 return -EINVAL; 208 return -EINVAL;
209
210 memset(v,0,sizeof(*v));
211 strcpy(v->name, "FM");
212 v->type = V4L2_TUNER_RADIO;
213
183 v->rangelow=(87*16000); 214 v->rangelow=(87*16000);
184 v->rangehigh=(108*16000); 215 v->rangehigh=(108*16000);
185 v->flags=VIDEO_TUNER_LOW; 216 v->rxsubchans =V4L2_TUNER_SUB_MONO|V4L2_TUNER_SUB_STEREO;
186 v->mode=VIDEO_MODE_AUTO; 217 v->capability=V4L2_TUNER_CAP_LOW;
187 v->signal=0xFFFF*az_getsigstr(az);
188 if(az_getstereo(az)) 218 if(az_getstereo(az))
189 v->flags|=VIDEO_TUNER_STEREO_ON; 219 v->audmode = V4L2_TUNER_MODE_STEREO;
190 strcpy(v->name, "FM"); 220 else
221 v->audmode = V4L2_TUNER_MODE_MONO;
222 v->signal=0xFFFF*az_getsigstr(az);
223
191 return 0; 224 return 0;
192 } 225 }
193 case VIDIOCSTUNER: 226 case VIDIOC_S_TUNER:
194 { 227 {
195 struct video_tuner *v = arg; 228 struct v4l2_tuner *v = arg;
196 if(v->tuner!=0) 229
230 if (v->index > 0)
197 return -EINVAL; 231 return -EINVAL;
232
198 return 0; 233 return 0;
199 } 234 }
200 case VIDIOCGFREQ: 235 case VIDIOC_S_FREQUENCY:
201 { 236 {
202 unsigned long *freq = arg; 237 struct v4l2_frequency *f = arg;
203 *freq = az->curfreq; 238
239 az->curfreq = f->frequency;
240 az_setfreq(az, az->curfreq);
204 return 0; 241 return 0;
205 } 242 }
206 case VIDIOCSFREQ: 243 case VIDIOC_G_FREQUENCY:
207 { 244 {
208 unsigned long *freq = arg; 245 struct v4l2_frequency *f = arg;
209 az->curfreq = *freq; 246
210 az_setfreq(az, az->curfreq); 247 f->type = V4L2_TUNER_RADIO;
248 f->frequency = az->curfreq;
249
211 return 0; 250 return 0;
212 } 251 }
213 case VIDIOCGAUDIO: 252
253 case VIDIOC_QUERYCTRL:
214 { 254 {
215 struct video_audio *v = arg; 255 struct v4l2_queryctrl *qc = arg;
216 memset(v,0, sizeof(*v)); 256 int i;
217 v->flags|=VIDEO_AUDIO_MUTABLE|VIDEO_AUDIO_VOLUME; 257
218 if(az->stereo) 258 for (i = 0; i < ARRAY_SIZE(radio_qctrl); i++) {
219 v->mode=VIDEO_SOUND_STEREO; 259 if (qc->id && qc->id == radio_qctrl[i].id) {
220 else 260 memcpy(qc, &(radio_qctrl[i]),
221 v->mode=VIDEO_SOUND_MONO; 261 sizeof(*qc));
222 v->volume=az->curvol; 262 return (0);
223 v->step=16384; 263 }
224 strcpy(v->name, "Radio"); 264 }
225 return 0; 265 return -EINVAL;
226 } 266 }
227 case VIDIOCSAUDIO: 267 case VIDIOC_G_CTRL:
228 { 268 {
229 struct video_audio *v = arg; 269 struct v4l2_control *ctrl= arg;
230 if(v->audio) 270
231 return -EINVAL; 271 switch (ctrl->id) {
232 az->curvol=v->volume; 272 case V4L2_CID_AUDIO_MUTE:
233 273 if (az->curvol==0)
234 az->stereo=(v->mode&VIDEO_SOUND_STEREO)?1:0; 274 ctrl->value=1;
235 if(v->flags&VIDEO_AUDIO_MUTE) 275 else
236 az_setvol(az,0); 276 ctrl->value=0;
237 else 277 return (0);
238 az_setvol(az,az->curvol); 278 case V4L2_CID_AUDIO_VOLUME:
239 return 0; 279 ctrl->value=az->curvol * 6554;
280 return (0);
281 }
282 return -EINVAL;
283 }
284 case VIDIOC_S_CTRL:
285 {
286 struct v4l2_control *ctrl= arg;
287
288 switch (ctrl->id) {
289 case V4L2_CID_AUDIO_MUTE:
290 if (ctrl->value) {
291 az_setvol(az,0);
292 } else {
293 az_setvol(az,az->curvol);
294 }
295 return (0);
296 case V4L2_CID_AUDIO_VOLUME:
297 az_setvol(az,ctrl->value);
298 return (0);
299 }
300 return -EINVAL;
240 } 301 }
302
241 default: 303 default:
242 return -ENOIOCTLCMD; 304 return v4l_compat_translate_ioctl(inode,file,cmd,arg,
305 az_do_ioctl);
243 } 306 }
244} 307}
245 308