1 /* GemTek radio card driver for Linux (C) 1998 Jonas Munsin <jmunsin@iki.fi>
2  *
3  * GemTek hasn't released any specs on the card, so the protocol had to
4  * be reverse engineered with dosemu.
5  *
6  * Besides the protocol changes, this is mostly a copy of:
7  *
8  *    RadioTrack II driver for Linux radio support (C) 1998 Ben Pfaff
9  *
10  *    Based on RadioTrack I/RadioReveal (C) 1997 M. Kirkwood
11  *    Converted to new API by Alan Cox <Alan.Cox@linux.org>
12  *    Various bugfixes and enhancements by Russell Kroll <rkroll@exploits.org>
13  *
14  * TODO: Allow for more than one of these foolish entities :-)
15  *
16  * Converted to V4L2 API by Mauro Carvalho Chehab <mchehab@infradead.org>
17  */
18 
19 #include <linux/module.h>	/* Modules 			*/
20 #include <linux/init.h>		/* Initdata			*/
21 #include <linux/ioport.h>	/* request_region		*/
22 #include <linux/delay.h>	/* udelay			*/
23 #include <asm/io.h>		/* outb, outb_p			*/
24 #include <asm/uaccess.h>	/* copy to/from user		*/
25 #include <linux/videodev2.h>	/* kernel radio structs		*/
26 #include <media/v4l2-common.h>
27 #include <linux/spinlock.h>
28 
29 #include <linux/version.h>	/* for KERNEL_VERSION MACRO	*/
30 #define RADIO_VERSION KERNEL_VERSION(0,0,3)
31 #define RADIO_BANNER "GemTek Radio card driver: v0.0.3"
32 
33 /*
34  * Module info.
35  */
36 
37 MODULE_AUTHOR("Jonas Munsin, Pekka Sepp�nen <pexu@kapsi.fi>");
38 MODULE_DESCRIPTION("A driver for the GemTek Radio card.");
39 MODULE_LICENSE("GPL");
40 
41 /*
42  * Module params.
43  */
44 
45 #ifndef CONFIG_RADIO_GEMTEK_PORT
46 #define CONFIG_RADIO_GEMTEK_PORT -1
47 #endif
48 #ifndef CONFIG_RADIO_GEMTEK_PROBE
49 #define CONFIG_RADIO_GEMTEK_PROBE 1
50 #endif
51 
52 static int io		= CONFIG_RADIO_GEMTEK_PORT;
53 static int probe	= CONFIG_RADIO_GEMTEK_PROBE;
54 static int hardmute;
55 static int shutdown	= 1;
56 static int keepmuted	= 1;
57 static int initmute	= 1;
58 static int radio_nr	= -1;
59 
60 module_param(io, int, 0444);
61 MODULE_PARM_DESC(io, "Force I/O port for the GemTek Radio card if automatic "
62 	 "probing is disabled or fails. The most common I/O ports are: 0x20c "
63 	 "0x30c, 0x24c or 0x34c (0x20c, 0x248 and 0x28c have been reported to "
64 	 "work for the combined sound/radiocard).");
65 
66 module_param(probe, bool, 0444);
67 MODULE_PARM_DESC(probe, "Enable automatic device probing. Note: only the most "
68 	"common I/O ports used by the card are probed.");
69 
70 module_param(hardmute, bool, 0644);
71 MODULE_PARM_DESC(hardmute, "Enable `hard muting' by shutting down PLL, may "
72 	 "reduce static noise.");
73 
74 module_param(shutdown, bool, 0644);
75 MODULE_PARM_DESC(shutdown, "Enable shutting down PLL and muting line when "
76 	 "module is unloaded.");
77 
78 module_param(keepmuted, bool, 0644);
79 MODULE_PARM_DESC(keepmuted, "Keep card muted even when frequency is changed.");
80 
81 module_param(initmute, bool, 0444);
82 MODULE_PARM_DESC(initmute, "Mute card when module is loaded.");
83 
84 module_param(radio_nr, int, 0444);
85 
86 /*
87  * Functions for controlling the card.
88  */
89 #define GEMTEK_LOWFREQ	(87*16000)
90 #define GEMTEK_HIGHFREQ	(108*16000)
91 
92 /*
93  * Frequency calculation constants.  Intermediate frequency 10.52 MHz (nominal
94  * value 10.7 MHz), reference divisor 6.39 kHz (nominal 6.25 kHz).
95  */
96 #define FSCALE		8
97 #define IF_OFFSET	((unsigned int)(10.52 * 16000 * (1<<FSCALE)))
98 #define REF_FREQ	((unsigned int)(6.39 * 16 * (1<<FSCALE)))
99 
100 #define GEMTEK_CK		0x01	/* Clock signal			*/
101 #define GEMTEK_DA		0x02	/* Serial data			*/
102 #define GEMTEK_CE		0x04	/* Chip enable			*/
103 #define GEMTEK_NS		0x08	/* No signal			*/
104 #define GEMTEK_MT		0x10	/* Line mute			*/
105 #define GEMTEK_STDF_3_125_KHZ	0x01	/* Standard frequency 3.125 kHz	*/
106 #define GEMTEK_PLL_OFF		0x07	/* PLL off			*/
107 
108 #define BU2614_BUS_SIZE	32	/* BU2614 / BU2614FS bus size		*/
109 
110 #define SHORT_DELAY 5		/* usec */
111 #define LONG_DELAY 75		/* usec */
112 
113 struct gemtek_device {
114 	unsigned long lastfreq;
115 	int muted;
116 	u32 bu2614data;
117 };
118 
119 #define BU2614_FREQ_BITS 	16 /* D0..D15, Frequency data		*/
120 #define BU2614_PORT_BITS	3 /* P0..P2, Output port control data	*/
121 #define BU2614_VOID_BITS	4 /* unused 				*/
122 #define BU2614_FMES_BITS	1 /* CT, Frequency measurement beginning data */
123 #define BU2614_STDF_BITS	3 /* R0..R2, Standard frequency data	*/
124 #define BU2614_SWIN_BITS	1 /* S, Switch between FMIN / AMIN	*/
125 #define BU2614_SWAL_BITS        1 /* PS, Swallow counter division (AMIN only)*/
126 #define BU2614_VOID2_BITS	1 /* unused				*/
127 #define BU2614_FMUN_BITS	1 /* GT, Frequency measurement time & unlock */
128 #define BU2614_TEST_BITS	1 /* TS, Test data is input		*/
129 
130 #define BU2614_FREQ_SHIFT 	0
131 #define BU2614_PORT_SHIFT	(BU2614_FREQ_BITS + BU2614_FREQ_SHIFT)
132 #define BU2614_VOID_SHIFT	(BU2614_PORT_BITS + BU2614_PORT_SHIFT)
133 #define BU2614_FMES_SHIFT	(BU2614_VOID_BITS + BU2614_VOID_SHIFT)
134 #define BU2614_STDF_SHIFT	(BU2614_FMES_BITS + BU2614_FMES_SHIFT)
135 #define BU2614_SWIN_SHIFT	(BU2614_STDF_BITS + BU2614_STDF_SHIFT)
136 #define BU2614_SWAL_SHIFT	(BU2614_SWIN_BITS + BU2614_SWIN_SHIFT)
137 #define BU2614_VOID2_SHIFT	(BU2614_SWAL_BITS + BU2614_SWAL_SHIFT)
138 #define BU2614_FMUN_SHIFT	(BU2614_VOID2_BITS + BU2614_VOID2_SHIFT)
139 #define BU2614_TEST_SHIFT	(BU2614_FMUN_BITS + BU2614_FMUN_SHIFT)
140 
141 #define MKMASK(field)	(((1<<BU2614_##field##_BITS) - 1) << \
142 			BU2614_##field##_SHIFT)
143 #define BU2614_PORT_MASK	MKMASK(PORT)
144 #define BU2614_FREQ_MASK	MKMASK(FREQ)
145 #define BU2614_VOID_MASK	MKMASK(VOID)
146 #define BU2614_FMES_MASK	MKMASK(FMES)
147 #define BU2614_STDF_MASK	MKMASK(STDF)
148 #define BU2614_SWIN_MASK	MKMASK(SWIN)
149 #define BU2614_SWAL_MASK	MKMASK(SWAL)
150 #define BU2614_VOID2_MASK	MKMASK(VOID2)
151 #define BU2614_FMUN_MASK	MKMASK(FMUN)
152 #define BU2614_TEST_MASK	MKMASK(TEST)
153 
154 static struct gemtek_device gemtek_unit;
155 
156 static spinlock_t lock;
157 
158 /*
159  * Set data which will be sent to BU2614FS.
160  */
161 #define gemtek_bu2614_set(dev, field, data) ((dev)->bu2614data = \
162 	((dev)->bu2614data & ~field##_MASK) | ((data) << field##_SHIFT))
163 
164 /*
165  * Transmit settings to BU2614FS over GemTek IC.
166  */
167 static void gemtek_bu2614_transmit(struct gemtek_device *dev)
168 {
169 	int i, bit, q, mute;
170 
171 	spin_lock(&lock);
172 
173 	mute = dev->muted ? GEMTEK_MT : 0x00;
174 
175 	outb_p(mute | GEMTEK_DA | GEMTEK_CK, io);
176 	udelay(SHORT_DELAY);
177 	outb_p(mute | GEMTEK_CE | GEMTEK_DA | GEMTEK_CK, io);
178 	udelay(LONG_DELAY);
179 
180 	for (i = 0, q = dev->bu2614data; i < 32; i++, q >>= 1) {
181 	    bit = (q & 1) ? GEMTEK_DA : 0;
182 	    outb_p(mute | GEMTEK_CE | bit, io);
183 	    udelay(SHORT_DELAY);
184 	    outb_p(mute | GEMTEK_CE | bit | GEMTEK_CK, io);
185 	    udelay(SHORT_DELAY);
186 	}
187 
188 	outb_p(mute | GEMTEK_DA | GEMTEK_CK, io);
189 	udelay(SHORT_DELAY);
190 	outb_p(mute | GEMTEK_CE | GEMTEK_DA | GEMTEK_CK, io);
191 	udelay(LONG_DELAY);
192 
193 	spin_unlock(&lock);
194 }
195 
196 /*
197  * Calculate divisor from FM-frequency for BU2614FS (3.125 KHz STDF expected).
198  */
199 static unsigned long gemtek_convfreq(unsigned long freq)
200 {
201 	return ((freq<<FSCALE) + IF_OFFSET + REF_FREQ/2) / REF_FREQ;
202 }
203 
204 /*
205  * Set FM-frequency.
206  */
207 static void gemtek_setfreq(struct gemtek_device *dev, unsigned long freq)
208 {
209 
210 	if (keepmuted && hardmute && dev->muted)
211 		return;
212 
213 	if (freq < GEMTEK_LOWFREQ)
214 		freq = GEMTEK_LOWFREQ;
215 	else if (freq > GEMTEK_HIGHFREQ)
216 		freq = GEMTEK_HIGHFREQ;
217 
218 	dev->lastfreq = freq;
219 	dev->muted = 0;
220 
221 	gemtek_bu2614_set(dev, BU2614_PORT, 0);
222 	gemtek_bu2614_set(dev, BU2614_FMES, 0);
223 	gemtek_bu2614_set(dev, BU2614_SWIN, 0);	/* FM-mode	*/
224 	gemtek_bu2614_set(dev, BU2614_SWAL, 0);
225 	gemtek_bu2614_set(dev, BU2614_FMUN, 1);	/* GT bit set	*/
226 	gemtek_bu2614_set(dev, BU2614_TEST, 0);
227 
228 	gemtek_bu2614_set(dev, BU2614_STDF, GEMTEK_STDF_3_125_KHZ);
229 	gemtek_bu2614_set(dev, BU2614_FREQ, gemtek_convfreq(freq));
230 
231 	gemtek_bu2614_transmit(dev);
232 }
233 
234 /*
235  * Set mute flag.
236  */
237 static void gemtek_mute(struct gemtek_device *dev)
238 {
239 	int i;
240 	dev->muted = 1;
241 
242 	if (hardmute) {
243 		/* Turn off PLL, disable data output */
244 		gemtek_bu2614_set(dev, BU2614_PORT, 0);
245 		gemtek_bu2614_set(dev, BU2614_FMES, 0);	/* CT bit off	*/
246 		gemtek_bu2614_set(dev, BU2614_SWIN, 0);	/* FM-mode	*/
247 		gemtek_bu2614_set(dev, BU2614_SWAL, 0);
248 		gemtek_bu2614_set(dev, BU2614_FMUN, 0);	/* GT bit off	*/
249 		gemtek_bu2614_set(dev, BU2614_TEST, 0);
250 		gemtek_bu2614_set(dev, BU2614_STDF, GEMTEK_PLL_OFF);
251 		gemtek_bu2614_set(dev, BU2614_FREQ, 0);
252 		gemtek_bu2614_transmit(dev);
253 	} else {
254 		spin_lock(&lock);
255 
256 		/* Read bus contents (CE, CK and DA). */
257 		i = inb_p(io);
258 		/* Write it back with mute flag set. */
259 		outb_p((i >> 5) | GEMTEK_MT, io);
260 		udelay(SHORT_DELAY);
261 
262 		spin_unlock(&lock);
263 	}
264 }
265 
266 /*
267  * Unset mute flag.
268  */
269 static void gemtek_unmute(struct gemtek_device *dev)
270 {
271 	int i;
272 	dev->muted = 0;
273 
274 	if (hardmute) {
275 		/* Turn PLL back on. */
276 		gemtek_setfreq(dev, dev->lastfreq);
277 	} else {
278 		spin_lock(&lock);
279 
280 		i = inb_p(io);
281 		outb_p(i >> 5, io);
282 		udelay(SHORT_DELAY);
283 
284 		spin_unlock(&lock);
285 	}
286 }
287 
288 /*
289  * Get signal strength (= stereo status).
290  */
291 static inline int gemtek_getsigstr(void)
292 {
293 	return inb_p(io) & GEMTEK_NS ? 0 : 1;
294 }
295 
296 /*
297  * Check if requested card acts like GemTek Radio card.
298  */
299 static int gemtek_verify(int port)
300 {
301 	static int verified = -1;
302 	int i, q;
303 
304 	if (verified == port)
305 		return 1;
306 
307 	spin_lock(&lock);
308 
309 	q = inb_p(port);	/* Read bus contents before probing. */
310 	/* Try to turn on CE, CK and DA respectively and check if card responds
311 	   properly. */
312 	for (i = 0; i < 3; ++i) {
313 		outb_p(1 << i, port);
314 		udelay(SHORT_DELAY);
315 
316 		if ((inb_p(port) & (~GEMTEK_NS)) != (0x17 | (1 << (i + 5)))) {
317 			spin_unlock(&lock);
318 			return 0;
319 		}
320 	}
321 	outb_p(q >> 5, port);	/* Write bus contents back. */
322 	udelay(SHORT_DELAY);
323 
324 	spin_unlock(&lock);
325 	verified = port;
326 
327 	return 1;
328 }
329 
330 /*
331  * Automatic probing for card.
332  */
333 static int gemtek_probe(void)
334 {
335 	int ioports[] = { 0x20c, 0x30c, 0x24c, 0x34c, 0x248, 0x28c };
336 	int i;
337 
338 	if (!probe) {
339 		printk(KERN_INFO "Automatic device probing disabled.\n");
340 		return -1;
341 	}
342 
343 	printk(KERN_INFO "Automatic device probing enabled.\n");
344 
345 	for (i = 0; i < ARRAY_SIZE(ioports); ++i) {
346 		printk(KERN_INFO "Trying I/O port 0x%x...\n", ioports[i]);
347 
348 		if (!request_region(ioports[i], 1, "gemtek-probe")) {
349 			printk(KERN_WARNING "I/O port 0x%x busy!\n",
350 			       ioports[i]);
351 			continue;
352 		}
353 
354 		if (gemtek_verify(ioports[i])) {
355 			printk(KERN_INFO "Card found from I/O port "
356 			       "0x%x!\n", ioports[i]);
357 
358 			release_region(ioports[i], 1);
359 
360 			io = ioports[i];
361 			return io;
362 		}
363 
364 		release_region(ioports[i], 1);
365 	}
366 
367 	printk(KERN_ERR "Automatic probing failed!\n");
368 
369 	return -1;
370 }
371 
372 /*
373  * Video 4 Linux stuff.
374  */
375 
376 static struct v4l2_queryctrl radio_qctrl[] = {
377 	{
378 		.id = V4L2_CID_AUDIO_MUTE,
379 		.name = "Mute",
380 		.minimum = 0,
381 		.maximum = 1,
382 		.default_value = 1,
383 		.type = V4L2_CTRL_TYPE_BOOLEAN,
384 	}, {
385 		.id = V4L2_CID_AUDIO_VOLUME,
386 		.name = "Volume",
387 		.minimum = 0,
388 		.maximum = 65535,
389 		.step = 65535,
390 		.default_value = 0xff,
391 		.type = V4L2_CTRL_TYPE_INTEGER,
392 	}
393 };
394 
395 static const struct file_operations gemtek_fops = {
396 	.owner		= THIS_MODULE,
397 	.open		= video_exclusive_open,
398 	.release	= video_exclusive_release,
399 	.ioctl		= video_ioctl2,
400 #ifdef CONFIG_COMPAT
401 	.compat_ioctl	= v4l_compat_ioctl32,
402 #endif
403 	.llseek		= no_llseek
404 };
405 
406 static int vidioc_querycap(struct file *file, void *priv,
407 			   struct v4l2_capability *v)
408 {
409 	strlcpy(v->driver, "radio-gemtek", sizeof(v->driver));
410 	strlcpy(v->card, "GemTek", sizeof(v->card));
411 	sprintf(v->bus_info, "ISA");
412 	v->version = RADIO_VERSION;
413 	v->capabilities = V4L2_CAP_TUNER;
414 	return 0;
415 }
416 
417 static int vidioc_g_tuner(struct file *file, void *priv, struct v4l2_tuner *v)
418 {
419 	if (v->index > 0)
420 		return -EINVAL;
421 
422 	strcpy(v->name, "FM");
423 	v->type = V4L2_TUNER_RADIO;
424 	v->rangelow = GEMTEK_LOWFREQ;
425 	v->rangehigh = GEMTEK_HIGHFREQ;
426 	v->capability = V4L2_TUNER_CAP_LOW | V4L2_TUNER_CAP_STEREO;
427 	v->signal = 0xffff * gemtek_getsigstr();
428 	if (v->signal) {
429 		v->audmode = V4L2_TUNER_MODE_STEREO;
430 		v->rxsubchans = V4L2_TUNER_SUB_STEREO;
431 	} else {
432 		v->audmode = V4L2_TUNER_MODE_MONO;
433 		v->rxsubchans = V4L2_TUNER_SUB_MONO;
434 	}
435 
436 	return 0;
437 }
438 
439 static int vidioc_s_tuner(struct file *file, void *priv, struct v4l2_tuner *v)
440 {
441 	if (v->index > 0)
442 		return -EINVAL;
443 	return 0;
444 }
445 
446 static int vidioc_s_frequency(struct file *file, void *priv,
447 			      struct v4l2_frequency *f)
448 {
449 	struct video_device *dev = video_devdata(file);
450 	struct gemtek_device *rt = dev->priv;
451 
452 	gemtek_setfreq(rt, f->frequency);
453 
454 	return 0;
455 }
456 
457 static int vidioc_g_frequency(struct file *file, void *priv,
458 			      struct v4l2_frequency *f)
459 {
460 	struct video_device *dev = video_devdata(file);
461 	struct gemtek_device *rt = dev->priv;
462 
463 	f->type = V4L2_TUNER_RADIO;
464 	f->frequency = rt->lastfreq;
465 	return 0;
466 }
467 
468 static int vidioc_queryctrl(struct file *file, void *priv,
469 			    struct v4l2_queryctrl *qc)
470 {
471 	int i;
472 
473 	for (i = 0; i < ARRAY_SIZE(radio_qctrl); ++i) {
474 		if (qc->id && qc->id == radio_qctrl[i].id) {
475 			memcpy(qc, &(radio_qctrl[i]), sizeof(*qc));
476 			return 0;
477 		}
478 	}
479 	return -EINVAL;
480 }
481 
482 static int vidioc_g_ctrl(struct file *file, void *priv,
483 			 struct v4l2_control *ctrl)
484 {
485 	struct video_device *dev = video_devdata(file);
486 	struct gemtek_device *rt = dev->priv;
487 
488 	switch (ctrl->id) {
489 	case V4L2_CID_AUDIO_MUTE:
490 		ctrl->value = rt->muted;
491 		return 0;
492 	case V4L2_CID_AUDIO_VOLUME:
493 		if (rt->muted)
494 			ctrl->value = 0;
495 		else
496 			ctrl->value = 65535;
497 		return 0;
498 	}
499 	return -EINVAL;
500 }
501 
502 static int vidioc_s_ctrl(struct file *file, void *priv,
503 			 struct v4l2_control *ctrl)
504 {
505 	struct video_device *dev = video_devdata(file);
506 	struct gemtek_device *rt = dev->priv;
507 
508 	switch (ctrl->id) {
509 	case V4L2_CID_AUDIO_MUTE:
510 		if (ctrl->value)
511 			gemtek_mute(rt);
512 		else
513 			gemtek_unmute(rt);
514 		return 0;
515 	case V4L2_CID_AUDIO_VOLUME:
516 		if (ctrl->value)
517 			gemtek_unmute(rt);
518 		else
519 			gemtek_mute(rt);
520 		return 0;
521 	}
522 	return -EINVAL;
523 }
524 
525 static int vidioc_g_audio(struct file *file, void *priv, struct v4l2_audio *a)
526 {
527 	if (a->index > 1)
528 		return -EINVAL;
529 
530 	strcpy(a->name, "Radio");
531 	a->capability = V4L2_AUDCAP_STEREO;
532 	return 0;
533 }
534 
535 static int vidioc_g_input(struct file *filp, void *priv, unsigned int *i)
536 {
537 	*i = 0;
538 	return 0;
539 }
540 
541 static int vidioc_s_input(struct file *filp, void *priv, unsigned int i)
542 {
543 	if (i != 0)
544 		return -EINVAL;
545 	return 0;
546 }
547 
548 static int vidioc_s_audio(struct file *file, void *priv, struct v4l2_audio *a)
549 {
550 	if (a->index != 0)
551 		return -EINVAL;
552 	return 0;
553 }
554 
555 static struct video_device gemtek_radio = {
556 	.owner			= THIS_MODULE,
557 	.name			= "GemTek Radio card",
558 	.type			= VID_TYPE_TUNER,
559 	.fops			= &gemtek_fops,
560 	.vidioc_querycap	= vidioc_querycap,
561 	.vidioc_g_tuner		= vidioc_g_tuner,
562 	.vidioc_s_tuner		= vidioc_s_tuner,
563 	.vidioc_g_audio		= vidioc_g_audio,
564 	.vidioc_s_audio		= vidioc_s_audio,
565 	.vidioc_g_input		= vidioc_g_input,
566 	.vidioc_s_input		= vidioc_s_input,
567 	.vidioc_g_frequency	= vidioc_g_frequency,
568 	.vidioc_s_frequency	= vidioc_s_frequency,
569 	.vidioc_queryctrl	= vidioc_queryctrl,
570 	.vidioc_g_ctrl		= vidioc_g_ctrl,
571 	.vidioc_s_ctrl		= vidioc_s_ctrl
572 };
573 
574 /*
575  * Initialization / cleanup related stuff.
576  */
577 
578 /*
579  * Initilize card.
580  */
581 static int __init gemtek_init(void)
582 {
583 	printk(KERN_INFO RADIO_BANNER "\n");
584 
585 	spin_lock_init(&lock);
586 
587 	gemtek_probe();
588 	if (io) {
589 		if (!request_region(io, 1, "gemtek")) {
590 			printk(KERN_ERR "I/O port 0x%x already in use.\n", io);
591 			return -EBUSY;
592 		}
593 
594 		if (!gemtek_verify(io))
595 			printk(KERN_WARNING "Card at I/O port 0x%x does not "
596 			       "respond properly, check your "
597 			       "configuration.\n", io);
598 		else
599 			printk(KERN_INFO "Using I/O port 0x%x.\n", io);
600 	} else if (probe) {
601 		printk(KERN_ERR "Automatic probing failed and no "
602 		       "fixed I/O port defined.\n");
603 		return -ENODEV;
604 	} else {
605 		printk(KERN_ERR "Automatic probing disabled but no fixed "
606 		       "I/O port defined.");
607 		return -EINVAL;
608 	}
609 
610 	gemtek_radio.priv = &gemtek_unit;
611 
612 	if (video_register_device(&gemtek_radio, VFL_TYPE_RADIO,
613 		radio_nr) == -1) {
614 		release_region(io, 1);
615 		return -EBUSY;
616 	}
617 
618 	/* Set defaults */
619 	gemtek_unit.lastfreq = GEMTEK_LOWFREQ;
620 	gemtek_unit.bu2614data = 0;
621 
622 	if (initmute)
623 		gemtek_mute(&gemtek_unit);
624 
625 	return 0;
626 }
627 
628 /*
629  * Module cleanup
630  */
631 static void __exit gemtek_exit(void)
632 {
633 	if (shutdown) {
634 		hardmute = 1;	/* Turn off PLL */
635 		gemtek_mute(&gemtek_unit);
636 	} else {
637 		printk(KERN_INFO "Module unloaded but card not muted!\n");
638 	}
639 
640 	video_unregister_device(&gemtek_radio);
641 	release_region(io, 1);
642 }
643 
644 module_init(gemtek_init);
645 module_exit(gemtek_exit);
646