aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/radio/radio-zoltrix.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/radio/radio-zoltrix.c')
-rw-r--r--drivers/media/radio/radio-zoltrix.c182
1 files changed, 124 insertions, 58 deletions
diff --git a/drivers/media/radio/radio-zoltrix.c b/drivers/media/radio/radio-zoltrix.c
index 432c3e2222d0..671fe1b1e5bc 100644
--- a/drivers/media/radio/radio-zoltrix.c
+++ b/drivers/media/radio/radio-zoltrix.c
@@ -24,6 +24,9 @@
24 * - Added unmute function 24 * - Added unmute function
25 * - Reworked ioctl functions 25 * - Reworked ioctl functions
26 * 2002-07-15 - Fix Stereo typo 26 * 2002-07-15 - Fix Stereo typo
27 *
28 * 2006-07-24 - Converted to V4L2 API
29 * by Mauro Carvalho Chehab <mchehab@infradead.org>
27 */ 30 */
28 31
29#include <linux/module.h> /* Modules */ 32#include <linux/module.h> /* Modules */
@@ -32,9 +35,31 @@
32#include <linux/delay.h> /* udelay, msleep */ 35#include <linux/delay.h> /* udelay, msleep */
33#include <asm/io.h> /* outb, outb_p */ 36#include <asm/io.h> /* outb, outb_p */
34#include <asm/uaccess.h> /* copy to/from user */ 37#include <asm/uaccess.h> /* copy to/from user */
35#include <linux/videodev.h> /* kernel radio structs */ 38#include <linux/videodev2.h> /* kernel radio structs */
36#include <media/v4l2-common.h> 39#include <media/v4l2-common.h>
37 40
41#include <linux/version.h> /* for KERNEL_VERSION MACRO */
42#define RADIO_VERSION KERNEL_VERSION(0,0,2)
43
44static struct v4l2_queryctrl radio_qctrl[] = {
45 {
46 .id = V4L2_CID_AUDIO_MUTE,
47 .name = "Mute",
48 .minimum = 0,
49 .maximum = 1,
50 .default_value = 1,
51 .type = V4L2_CTRL_TYPE_BOOLEAN,
52 },{
53 .id = V4L2_CID_AUDIO_VOLUME,
54 .name = "Volume",
55 .minimum = 0,
56 .maximum = 65535,
57 .step = 4096,
58 .default_value = 0xff,
59 .type = V4L2_CTRL_TYPE_INTEGER,
60 }
61};
62
38#ifndef CONFIG_RADIO_ZOLTRIX_PORT 63#ifndef CONFIG_RADIO_ZOLTRIX_PORT
39#define CONFIG_RADIO_ZOLTRIX_PORT -1 64#define CONFIG_RADIO_ZOLTRIX_PORT -1
40#endif 65#endif
@@ -212,78 +237,116 @@ static int zol_do_ioctl(struct inode *inode, struct file *file,
212 struct zol_device *zol = dev->priv; 237 struct zol_device *zol = dev->priv;
213 238
214 switch (cmd) { 239 switch (cmd) {
215 case VIDIOCGCAP: 240 case VIDIOC_QUERYCAP:
216 { 241 {
217 struct video_capability *v = arg; 242 struct v4l2_capability *v = arg;
218
219 memset(v,0,sizeof(*v)); 243 memset(v,0,sizeof(*v));
220 v->type = VID_TYPE_TUNER; 244 strlcpy(v->driver, "radio-zoltrix", sizeof (v->driver));
221 v->channels = 1 + zol->stereo; 245 strlcpy(v->card, "Zoltrix Radio", sizeof (v->card));
222 v->audios = 1; 246 sprintf(v->bus_info,"ISA");
223 strcpy(v->name, "Zoltrix Radio"); 247 v->version = RADIO_VERSION;
248 v->capabilities = V4L2_CAP_TUNER;
249
224 return 0; 250 return 0;
225 } 251 }
226 case VIDIOCGTUNER: 252 case VIDIOC_G_TUNER:
227 { 253 {
228 struct video_tuner *v = arg; 254 struct v4l2_tuner *v = arg;
229 if (v->tuner) 255
256 if (v->index > 0)
230 return -EINVAL; 257 return -EINVAL;
258
259 memset(v,0,sizeof(*v));
231 strcpy(v->name, "FM"); 260 strcpy(v->name, "FM");
232 v->rangelow = (int) (88.0 * 16000); 261 v->type = V4L2_TUNER_RADIO;
233 v->rangehigh = (int) (108.0 * 16000); 262
234 v->flags = zol_is_stereo(zol) 263 v->rangelow=(88*16000);
235 ? VIDEO_TUNER_STEREO_ON : 0; 264 v->rangehigh=(108*16000);
236 v->flags |= VIDEO_TUNER_LOW; 265 v->rxsubchans =V4L2_TUNER_SUB_MONO|V4L2_TUNER_SUB_STEREO;
237 v->mode = VIDEO_MODE_AUTO; 266 v->capability=V4L2_TUNER_CAP_LOW;
238 v->signal = 0xFFFF * zol_getsigstr(zol); 267 if(zol_is_stereo(zol))
268 v->audmode = V4L2_TUNER_MODE_STEREO;
269 else
270 v->audmode = V4L2_TUNER_MODE_MONO;
271 v->signal=0xFFFF*zol_getsigstr(zol);
272
239 return 0; 273 return 0;
240 } 274 }
241 case VIDIOCSTUNER: 275 case VIDIOC_S_TUNER:
242 { 276 {
243 struct video_tuner *v = arg; 277 struct v4l2_tuner *v = arg;
244 if (v->tuner != 0) 278
279 if (v->index > 0)
245 return -EINVAL; 280 return -EINVAL;
246 /* Only 1 tuner so no setting needed ! */ 281
247 return 0; 282 return 0;
248 } 283 }
249 case VIDIOCGFREQ: 284 case VIDIOC_S_FREQUENCY:
250 {
251 unsigned long *freq = arg;
252 *freq = zol->curfreq;
253 return 0;
254 }
255 case VIDIOCSFREQ:
256 {
257 unsigned long *freq = arg;
258 zol->curfreq = *freq;
259 zol_setfreq(zol, zol->curfreq);
260 return 0;
261 }
262 case VIDIOCGAUDIO:
263 { 285 {
264 struct video_audio *v = arg; 286 struct v4l2_frequency *f = arg;
265 memset(v, 0, sizeof(*v)); 287
266 v->flags |= VIDEO_AUDIO_MUTABLE | VIDEO_AUDIO_VOLUME; 288 zol->curfreq = f->frequency;
267 v->mode |= zol_is_stereo(zol) 289 zol_setfreq(zol, zol->curfreq);
268 ? VIDEO_SOUND_STEREO : VIDEO_SOUND_MONO;
269 v->volume = zol->curvol * 4096;
270 v->step = 4096;
271 strcpy(v->name, "Zoltrix Radio");
272 return 0; 290 return 0;
273 } 291 }
274 case VIDIOCSAUDIO: 292 case VIDIOC_G_FREQUENCY:
275 { 293 {
276 struct video_audio *v = arg; 294 struct v4l2_frequency *f = arg;
277 if (v->audio)
278 return -EINVAL;
279 295
280 if (v->flags & VIDEO_AUDIO_MUTE) 296 f->type = V4L2_TUNER_RADIO;
281 zol_mute(zol); 297 f->frequency = zol->curfreq;
282 else {
283 zol_unmute(zol);
284 zol_setvol(zol, v->volume / 4096);
285 }
286 298
299 return 0;
300 }
301 case VIDIOC_QUERYCTRL:
302 {
303 struct v4l2_queryctrl *qc = arg;
304 int i;
305
306 for (i = 0; i < ARRAY_SIZE(radio_qctrl); i++) {
307 if (qc->id && qc->id == radio_qctrl[i].id) {
308 memcpy(qc, &(radio_qctrl[i]),
309 sizeof(*qc));
310 return (0);
311 }
312 }
313 return -EINVAL;
314 }
315 case VIDIOC_G_CTRL:
316 {
317 struct v4l2_control *ctrl= arg;
318
319 switch (ctrl->id) {
320 case V4L2_CID_AUDIO_MUTE:
321 ctrl->value=zol->muted;
322 return (0);
323 case V4L2_CID_AUDIO_VOLUME:
324 ctrl->value=zol->curvol * 4096;
325 return (0);
326 }
327 return -EINVAL;
328 }
329 case VIDIOC_S_CTRL:
330 {
331 struct v4l2_control *ctrl= arg;
332
333 switch (ctrl->id) {
334 case V4L2_CID_AUDIO_MUTE:
335 if (ctrl->value) {
336 zol_mute(zol);
337 } else {
338 zol_unmute(zol);
339 zol_setvol(zol,zol->curvol);
340 }
341 return (0);
342 case V4L2_CID_AUDIO_VOLUME:
343 zol_setvol(zol,ctrl->value/4096);
344 return (0);
345 }
346 zol->stereo = 1;
347 zol_setfreq(zol, zol->curfreq);
348#if 0
349/* FIXME: Implement stereo/mono switch on V4L2 */
287 if (v->mode & VIDEO_SOUND_STEREO) { 350 if (v->mode & VIDEO_SOUND_STEREO) {
288 zol->stereo = 1; 351 zol->stereo = 1;
289 zol_setfreq(zol, zol->curfreq); 352 zol_setfreq(zol, zol->curfreq);
@@ -292,10 +355,13 @@ static int zol_do_ioctl(struct inode *inode, struct file *file,
292 zol->stereo = 0; 355 zol->stereo = 0;
293 zol_setfreq(zol, zol->curfreq); 356 zol_setfreq(zol, zol->curfreq);
294 } 357 }
295 return 0; 358#endif
359 return -EINVAL;
296 } 360 }
297 default: 361
298 return -ENOIOCTLCMD; 362 default:
363 return v4l_compat_translate_ioctl(inode,file,cmd,arg,
364 zol_do_ioctl);
299 } 365 }
300} 366}
301 367
@@ -322,7 +388,7 @@ static struct video_device zoltrix_radio =
322 .owner = THIS_MODULE, 388 .owner = THIS_MODULE,
323 .name = "Zoltrix Radio Plus", 389 .name = "Zoltrix Radio Plus",
324 .type = VID_TYPE_TUNER, 390 .type = VID_TYPE_TUNER,
325 .hardware = VID_HARDWARE_ZOLTRIX, 391 .hardware = 0,
326 .fops = &zoltrix_fops, 392 .fops = &zoltrix_fops,
327}; 393};
328 394