aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/radio/Kconfig2
-rw-r--r--drivers/media/radio/radio-rtrack2.c162
2 files changed, 116 insertions, 48 deletions
diff --git a/drivers/media/radio/Kconfig b/drivers/media/radio/Kconfig
index a74c91577d3..4bb443f7255 100644
--- a/drivers/media/radio/Kconfig
+++ b/drivers/media/radio/Kconfig
@@ -59,7 +59,7 @@ config RADIO_RTRACK_PORT
59 59
60config RADIO_RTRACK2 60config RADIO_RTRACK2
61 tristate "AIMSlab RadioTrack II support" 61 tristate "AIMSlab RadioTrack II support"
62 depends on ISA && VIDEO_V4L1 62 depends on ISA && VIDEO_V4L2
63 ---help--- 63 ---help---
64 Choose Y here if you have this FM radio card, and then fill in the 64 Choose Y here if you have this FM radio card, and then fill in the
65 port address below. 65 port address below.
diff --git a/drivers/media/radio/radio-rtrack2.c b/drivers/media/radio/radio-rtrack2.c
index e5e9d41e4bd..b9e98483e58 100644
--- a/drivers/media/radio/radio-rtrack2.c
+++ b/drivers/media/radio/radio-rtrack2.c
@@ -6,6 +6,7 @@
6 * 6 *
7 * TODO: Allow for more than one of these foolish entities :-) 7 * TODO: Allow for more than one of these foolish entities :-)
8 * 8 *
9 * Converted to V4L2 API by Mauro Carvalho Chehab <mchehab@infradead.org>
9 */ 10 */
10 11
11#include <linux/module.h> /* Modules */ 12#include <linux/module.h> /* Modules */
@@ -14,10 +15,32 @@
14#include <linux/delay.h> /* udelay */ 15#include <linux/delay.h> /* udelay */
15#include <asm/io.h> /* outb, outb_p */ 16#include <asm/io.h> /* outb, outb_p */
16#include <asm/uaccess.h> /* copy to/from user */ 17#include <asm/uaccess.h> /* copy to/from user */
17#include <linux/videodev.h> /* kernel radio structs */ 18#include <linux/videodev2.h> /* kernel radio structs */
18#include <media/v4l2-common.h> 19#include <media/v4l2-common.h>
19#include <linux/spinlock.h> 20#include <linux/spinlock.h>
20 21
22#include <linux/version.h> /* for KERNEL_VERSION MACRO */
23#define RADIO_VERSION KERNEL_VERSION(0,0,2)
24
25static struct v4l2_queryctrl radio_qctrl[] = {
26 {
27 .id = V4L2_CID_AUDIO_MUTE,
28 .name = "Mute",
29 .minimum = 0,
30 .maximum = 1,
31 .default_value = 1,
32 .type = V4L2_CTRL_TYPE_BOOLEAN,
33 },{
34 .id = V4L2_CID_AUDIO_VOLUME,
35 .name = "Volume",
36 .minimum = 0,
37 .maximum = 65535,
38 .step = 65535,
39 .default_value = 0xff,
40 .type = V4L2_CTRL_TYPE_INTEGER,
41 }
42};
43
21#ifndef CONFIG_RADIO_RTRACK2_PORT 44#ifndef CONFIG_RADIO_RTRACK2_PORT
22#define CONFIG_RADIO_RTRACK2_PORT -1 45#define CONFIG_RADIO_RTRACK2_PORT -1
23#endif 46#endif
@@ -114,75 +137,120 @@ static int rt_do_ioctl(struct inode *inode, struct file *file,
114 137
115 switch(cmd) 138 switch(cmd)
116 { 139 {
117 case VIDIOCGCAP: 140 case VIDIOC_QUERYCAP:
118 { 141 {
119 struct video_capability *v = arg; 142 struct v4l2_capability *v = arg;
120 memset(v,0,sizeof(*v)); 143 memset(v,0,sizeof(*v));
121 v->type=VID_TYPE_TUNER; 144 strlcpy(v->driver, "radio-rtrack2", sizeof (v->driver));
122 v->channels=1; 145 strlcpy(v->card, "RadioTrack II", sizeof (v->card));
123 v->audios=1; 146 sprintf(v->bus_info,"ISA");
124 strcpy(v->name, "RadioTrack II"); 147 v->version = RADIO_VERSION;
148 v->capabilities = V4L2_CAP_TUNER;
149
125 return 0; 150 return 0;
126 } 151 }
127 case VIDIOCGTUNER: 152 case VIDIOC_G_TUNER:
128 { 153 {
129 struct video_tuner *v = arg; 154 struct v4l2_tuner *v = arg;
130 if(v->tuner) /* Only 1 tuner */ 155
156 if (v->index > 0)
131 return -EINVAL; 157 return -EINVAL;
132 v->rangelow=88*16000; 158
133 v->rangehigh=108*16000; 159 memset(v,0,sizeof(*v));
134 v->flags=VIDEO_TUNER_LOW;
135 v->mode=VIDEO_MODE_AUTO;
136 v->signal=0xFFFF*rt_getsigstr(rt);
137 strcpy(v->name, "FM"); 160 strcpy(v->name, "FM");
161 v->type = V4L2_TUNER_RADIO;
162
163 v->rangelow=(88*16000);
164 v->rangehigh=(108*16000);
165 v->rxsubchans =V4L2_TUNER_SUB_MONO;
166 v->capability=V4L2_TUNER_CAP_LOW;
167 v->audmode = V4L2_TUNER_MODE_MONO;
168 v->signal=0xFFFF*rt_getsigstr(rt);
169
138 return 0; 170 return 0;
139 } 171 }
140 case VIDIOCSTUNER: 172 case VIDIOC_S_TUNER:
141 { 173 {
142 struct video_tuner *v = arg; 174 struct v4l2_tuner *v = arg;
143 if(v->tuner!=0) 175
176 if (v->index > 0)
144 return -EINVAL; 177 return -EINVAL;
145 /* Only 1 tuner so no setting needed ! */ 178
146 return 0; 179 return 0;
147 } 180 }
148 case VIDIOCGFREQ: 181 case VIDIOC_S_FREQUENCY:
149 { 182 {
150 unsigned long *freq = arg; 183 struct v4l2_frequency *f = arg;
151 *freq = rt->curfreq; 184
185 rt->curfreq = f->frequency;
186 rt_setfreq(rt, rt->curfreq);
152 return 0; 187 return 0;
153 } 188 }
154 case VIDIOCSFREQ: 189 case VIDIOC_G_FREQUENCY:
155 { 190 {
156 unsigned long *freq = arg; 191 struct v4l2_frequency *f = arg;
157 rt->curfreq = *freq; 192
158 rt_setfreq(rt, rt->curfreq); 193 f->type = V4L2_TUNER_RADIO;
194 f->frequency = rt->curfreq;
195
159 return 0; 196 return 0;
160 } 197 }
161 case VIDIOCGAUDIO: 198 case VIDIOC_QUERYCTRL:
162 { 199 {
163 struct video_audio *v = arg; 200 struct v4l2_queryctrl *qc = arg;
164 memset(v,0, sizeof(*v)); 201 int i;
165 v->flags|=VIDEO_AUDIO_MUTABLE; 202
166 v->volume=1; 203 for (i = 0; i < ARRAY_SIZE(radio_qctrl); i++) {
167 v->step=65535; 204 if (qc->id && qc->id == radio_qctrl[i].id) {
168 strcpy(v->name, "Radio"); 205 memcpy(qc, &(radio_qctrl[i]),
169 return 0; 206 sizeof(*qc));
207 return (0);
208 }
209 }
210 return -EINVAL;
170 } 211 }
171 case VIDIOCSAUDIO: 212 case VIDIOC_G_CTRL:
172 { 213 {
173 struct video_audio *v = arg; 214 struct v4l2_control *ctrl= arg;
174 if(v->audio) 215
175 return -EINVAL; 216 switch (ctrl->id) {
176 217 case V4L2_CID_AUDIO_MUTE:
177 if(v->flags&VIDEO_AUDIO_MUTE) 218 ctrl->value=rt->muted;
178 rt_mute(rt); 219 return (0);
179 else 220 case V4L2_CID_AUDIO_VOLUME:
180 rt_unmute(rt); 221 if (rt->muted)
181 222 ctrl->value=0;
182 return 0; 223 else
224 ctrl->value=65535;
225 return (0);
226 }
227 return -EINVAL;
228 }
229 case VIDIOC_S_CTRL:
230 {
231 struct v4l2_control *ctrl= arg;
232
233 switch (ctrl->id) {
234 case V4L2_CID_AUDIO_MUTE:
235 if (ctrl->value) {
236 rt_mute(rt);
237 } else {
238 rt_unmute(rt);
239 }
240 return (0);
241 case V4L2_CID_AUDIO_VOLUME:
242 if (ctrl->value) {
243 rt_unmute(rt);
244 } else {
245 rt_mute(rt);
246 }
247 return (0);
248 }
249 return -EINVAL;
183 } 250 }
184 default: 251 default:
185 return -ENOIOCTLCMD; 252 return v4l_compat_translate_ioctl(inode,file,cmd,arg,
253 rt_do_ioctl);
186 } 254 }
187} 255}
188 256
@@ -208,7 +276,7 @@ static struct video_device rtrack2_radio=
208 .owner = THIS_MODULE, 276 .owner = THIS_MODULE,
209 .name = "RadioTrack II radio", 277 .name = "RadioTrack II radio",
210 .type = VID_TYPE_TUNER, 278 .type = VID_TYPE_TUNER,
211 .hardware = VID_HARDWARE_RTRACK2, 279 .hardware = 0,
212 .fops = &rtrack2_fops, 280 .fops = &rtrack2_fops,
213}; 281};
214 282