Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6a2cf8ee authored by Jiri Slaby's avatar Jiri Slaby Committed by Linus Torvalds
Browse files

[PATCH] media-radio: Maestro radio Lindent



Maestro radio Lindent + some handwork

Signed-off-by: default avatarJiri Slaby <jirislaby@gmail.com>
Cc: Greg KH <greg@kroah.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 89dad8f0
Loading
Loading
Loading
Loading
+105 −103
Original line number Diff line number Diff line
@@ -92,8 +92,7 @@ static struct file_operations maestro_fops = {
	.llseek         = no_llseek,
};

static struct video_device maestro_radio=
{
static struct video_device maestro_radio = {
	.owner		= THIS_MODULE,
	.name		= "Maestro radio",
	.type		= VID_TYPE_TUNER,
@@ -101,8 +100,7 @@ static struct video_device maestro_radio=
	.fops		= &maestro_fops,
};

struct radio_device
{
struct radio_device {
	__u16	io,	/* base of Maestro card radio io (GPIO_DATA)*/
		muted,	/* VIDEO_AUDIO_MUTE */
		stereo,	/* VIDEO_TUNER_STEREO_ON */	
@@ -115,6 +113,7 @@ static __u32 radio_bits_get(struct radio_device *dev)
	register __u16 io=dev->io, l, rdata;
	register __u32 data=0;
	__u16 omask;

	omask = inw(io + IO_MASK);
	outw(~(STR_CLK | STR_WREN), io + IO_MASK);
	outw(0, io);
@@ -137,10 +136,13 @@ static __u32 radio_bits_get(struct radio_device *dev)
				data++;
		udelay(2);
	}

	if(dev->muted)
		outw(STR_WREN, io);

	udelay(4);
	outw(omask, io + IO_MASK);

	return data & 0x3ffe;
}

@@ -148,6 +150,7 @@ static void radio_bits_set(struct radio_device *dev, __u32 data)
{
	register __u16 io=dev->io, l, bits;
	__u16 omask, odir;

	omask = inw(io + IO_MASK);
	odir  = (inw(io + IO_DIR) & ~STR_DATA) | (STR_CLK | STR_WREN);
	outw(odir | STR_DATA, io + IO_DIR);
@@ -163,8 +166,10 @@ static void radio_bits_set(struct radio_device *dev, __u32 data)
		outw(bits, io);			/* LO level */
		udelay(4);
	}

	if(!dev->muted)
		outw(0, io);

	udelay(4);
	outw(omask, io + IO_MASK);
	outw(odir, io + IO_DIR);
@@ -185,8 +190,7 @@ static inline int radio_function(struct inode *inode, struct file *file,
		v->type = VID_TYPE_TUNER;
		v->channels = v->audios = 1;
		return 0;
		}
		case VIDIOCGTUNER: {
	} case VIDIOCGTUNER: {
		struct video_tuner *v = arg;
		if (v->tuner)
			return -EINVAL;
@@ -198,34 +202,29 @@ static inline int radio_function(struct inode *inode, struct file *file,
		v->rangehigh = FREQ_HI;
		v->mode = VIDEO_MODE_AUTO;
		return 0;
		}
		case VIDIOCSTUNER: {
	} case VIDIOCSTUNER: {
		struct video_tuner *v = arg;
		if (v->tuner != 0)
			return -EINVAL;
		return 0;
		}
		case VIDIOCGFREQ: {
	} case VIDIOCGFREQ: {
		unsigned long *freq = arg;
		*freq = BITS2FREQ(radio_bits_get(card));
		return 0;
		}
		case VIDIOCSFREQ: {
	} case VIDIOCSFREQ: {
		unsigned long *freq = arg;
		if (*freq < FREQ_LO || *freq > FREQ_HI)
			return -EINVAL;
		radio_bits_set(card, FREQ2BITS(*freq));
		return 0;
		}
		case VIDIOCGAUDIO: {	
	} case VIDIOCGAUDIO: {
		struct video_audio *v = arg;
		memset(v, 0, sizeof(*v));
		strcpy(v->name, "Radio");
		v->flags = VIDEO_AUDIO_MUTABLE | card->muted;
		v->mode = VIDEO_SOUND_STEREO;
		return 0;
		}
		case VIDIOCSAUDIO: {
	} case VIDIOCSAUDIO: {
		struct video_audio *v = arg;
		if (v->audio)
			return -EINVAL;
@@ -233,15 +232,14 @@ static inline int radio_function(struct inode *inode, struct file *file,
			register __u16 io = card->io;
			register __u16 omask = inw(io + IO_MASK);
			outw(~STR_WREN, io + IO_MASK);
				outw((card->muted = v->flags & VIDEO_AUDIO_MUTE)
				     ? STR_WREN : 0, io);
			outw((card->muted = v->flags & VIDEO_AUDIO_MUTE) ?
				STR_WREN : 0, io);
			udelay(4);
			outw(omask, io + IO_MASK);
			msleep(125);
			return 0;
		}
		}
		case VIDIOCGUNIT: {
	} case VIDIOCGUNIT: {
		struct video_unit *v = arg;
		v->video = VIDEO_NO_UNIT;
		v->vbi = VIDEO_NO_UNIT;
@@ -249,8 +247,8 @@ static inline int radio_function(struct inode *inode, struct file *file,
		v->audio = 0;
		v->teletext = VIDEO_NO_UNIT;
		return 0;
		}
		default: return -ENOIOCTLCMD;
	} default:
		return -ENOIOCTLCMD;
	}
}

@@ -264,6 +262,7 @@ static int radio_ioctl(struct inode *inode, struct file *file,
	down(&card->lock);
	ret = video_usercopy(inode, file, cmd, arg, radio_function);
	up(&card->lock);

	return ret;
}

@@ -272,6 +271,7 @@ static __u16 __devinit radio_power_on(struct radio_device *dev)
	register __u16 io = dev->io;
	register __u32 ofreq;
	__u16 omask, odir;

	omask = inw(io + IO_MASK);
	odir = (inw(io + IO_DIR) & ~STR_DATA) | (STR_CLK | STR_WREN);
	outw(odir & ~STR_WREN, io + IO_DIR);
@@ -282,9 +282,11 @@ static __u16 __devinit radio_power_on(struct radio_device *dev)
	udelay(16);
	outw(omask, io + IO_MASK);
	ofreq = radio_bits_get(dev);

	if ((ofreq < FREQ2BITS(FREQ_LO)) || (ofreq > FREQ2BITS(FREQ_HI)))
		ofreq = FREQ2BITS(FREQ_LO);
	radio_bits_set(dev, ofreq);

	return (ofreq == radio_bits_get(dev));
}

@@ -357,10 +359,6 @@ static void __devexit maestro_remove(struct pci_dev *pdev)
	video_unregister_device(vdev);
}

MODULE_AUTHOR("Adam Tlalka, atlka@pg.gda.pl");
MODULE_DESCRIPTION("Radio driver for the Maestro PCI sound card radio.");
MODULE_LICENSE("GPL");

static int __init maestro_radio_init(void)
{
	int retval = pci_register_driver(&maestro_r_driver);
@@ -378,3 +376,7 @@ static void __exit maestro_radio_exit(void)

module_init(maestro_radio_init);
module_exit(maestro_radio_exit);

MODULE_AUTHOR("Adam Tlalka, atlka@pg.gda.pl");
MODULE_DESCRIPTION("Radio driver for the Maestro PCI sound card radio.");
MODULE_LICENSE("GPL");