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

Commit 1a6f11e0 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab
Browse files

V4L/DVB (6950): Lindent em28xx-audio.c

parent a52932b4
Loading
Loading
Loading
Loading
+197 −176
Original line number Diff line number Diff line
@@ -46,8 +46,8 @@
static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
static int em28xx_cmd(struct em28xx *dev, int cmd, int arg);


static int snd_pcm_alloc_vmalloc_buffer(struct snd_pcm_substream *subs, size_t size)
static int snd_pcm_alloc_vmalloc_buffer(struct snd_pcm_substream *subs,
					size_t size)
{
	struct snd_pcm_runtime *runtime = subs->runtime;
	if (runtime->dma_area) {
@@ -63,7 +63,9 @@ static int snd_pcm_alloc_vmalloc_buffer(struct snd_pcm_substream *subs, size_t s
}

static struct snd_pcm_hardware snd_em28xx_hw_capture = {
	.info = SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED  | SNDRV_PCM_INFO_MMAP_VALID,
	.info =
	    SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_MMAP |
	    SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_MMAP_VALID,
	.formats = SNDRV_PCM_FMTBIT_S16_LE,
	.rates = SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_KNOT,
	.rate_min = 48000,
@@ -101,7 +103,8 @@ static int snd_em28xx_capture_open(struct snd_pcm_substream *substream)
			tuner.type = V4L2_TUNER_RADIO;

			/* enable GPIO for analog TV */
				dev->em28xx_gpio_control(dev,  EM28XX_MODE, (void*)mode);
			dev->em28xx_gpio_control(dev, EM28XX_MODE,
						 (void *)mode);
			dev->mode = mode;
			/* upload firmware */
			tuner_run_cmd(dev->tobj, TUNER_CMD_INIT, (void *)mode);
@@ -131,7 +134,8 @@ static int snd_em28xx_capture_open(struct snd_pcm_substream *substream)
		break;
	case TUNER_STUB_RADIO:
		/* check current mode and put a hard lock onto it */
			printk("em28xx-audio: device is currently in analogue FM mode\n");
		printk
		    ("em28xx-audio: device is currently in analogue FM mode\n");
		/* unmute by default here */
		dev->em28xx_write_regs(dev, 0x0f, "\x87", 1);
		ret = dev->em28xx_acquire(dev, EM28XX_RADIO, 1);
@@ -187,11 +191,14 @@ static int snd_em28xx_pcm_close(struct snd_pcm_substream *substream)
	return 0;
}

static int snd_em28xx_hw_capture_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *hw_params)
static int snd_em28xx_hw_capture_params(struct snd_pcm_substream *substream,
					struct snd_pcm_hw_params *hw_params)
{
	unsigned int channels, rate, format;
	int ret;
	ret = snd_pcm_alloc_vmalloc_buffer(substream, params_buffer_bytes(hw_params));
	ret =
	    snd_pcm_alloc_vmalloc_buffer(substream,
					 params_buffer_bytes(hw_params));
	format = params_format(hw_params);
	rate = params_rate(hw_params);
	channels = params_channels(hw_params);
@@ -214,7 +221,8 @@ static int snd_em28xx_prepare(struct snd_pcm_substream *substream)
	return 0;
}

static int snd_em28xx_capture_trigger(struct snd_pcm_substream *substream, int cmd)
static int snd_em28xx_capture_trigger(struct snd_pcm_substream *substream,
				      int cmd)
{
	struct em28xx *dev = snd_pcm_substream_chip(substream);
	switch (cmd) {
@@ -247,8 +255,10 @@ static void em28xx_audio_isocirq(struct urb *urb)

		stride = runtime->frame_bits >> 3;
		for (i = 0; i < urb->number_of_packets; i++) {
			int length=urb->iso_frame_desc[i].actual_length/stride;
			cp=(unsigned char *) urb->transfer_buffer + urb->iso_frame_desc[i].offset;
			int length =
			    urb->iso_frame_desc[i].actual_length / stride;
			cp = (unsigned char *)urb->transfer_buffer +
			    urb->iso_frame_desc[i].offset;

			if (!length)
				continue;
@@ -256,22 +266,30 @@ static void em28xx_audio_isocirq(struct urb *urb)
			spin_lock_irqsave(&dev->adev->slock, flags);
			oldptr = dev->adev->hwptr_done_capture;
			dev->adev->hwptr_done_capture += length;
			if(dev->adev->hwptr_done_capture >= runtime->buffer_size)
				dev->adev->hwptr_done_capture -= runtime->buffer_size;
			if (dev->adev->hwptr_done_capture >=
			    runtime->buffer_size)
				dev->adev->hwptr_done_capture -=
				    runtime->buffer_size;

			dev->adev->capture_transfer_done += length;
			if(dev->adev->capture_transfer_done >= runtime->period_size){
				dev->adev->capture_transfer_done -= runtime->period_size;
			if (dev->adev->capture_transfer_done >=
			    runtime->period_size) {
				dev->adev->capture_transfer_done -=
				    runtime->period_size;
				period_elapsed = 1;
			}
			spin_unlock_irqrestore(&dev->adev->slock, flags);

			if (oldptr + length >= runtime->buffer_size) {
				unsigned int cnt = runtime->buffer_size-oldptr-1;
				memcpy(runtime->dma_area+oldptr*stride, cp , cnt*stride);
				memcpy(runtime->dma_area, cp + cnt, length*stride - cnt*stride);
				unsigned int cnt =
				    runtime->buffer_size - oldptr - 1;
				memcpy(runtime->dma_area + oldptr * stride, cp,
				       cnt * stride);
				memcpy(runtime->dma_area, cp + cnt,
				       length * stride - cnt * stride);
			} else {
				memcpy(runtime->dma_area+oldptr*stride, cp, length*stride);
				memcpy(runtime->dma_area + oldptr * stride, cp,
				       length * stride);
			}
		}
		if (period_elapsed) {
@@ -284,7 +302,8 @@ static void em28xx_audio_isocirq(struct urb *urb)
		return;

	if ((status = usb_submit_urb(urb, GFP_ATOMIC))) {
		em28xx_errdev("resubmit of audio urb failed (error=%i)\n", status);
		em28xx_errdev("resubmit of audio urb failed (error=%i)\n",
			      status);
	}
	return;
}
@@ -304,8 +323,8 @@ static int em28xx_init_audio_isoc(struct em28xx *dev)
{
	int i;
	int errCode;
	const int sb_size=EM28XX_NUM_AUDIO_PACKETS * EM28XX_AUDIO_MAX_PACKET_SIZE;

	const int sb_size =
	    EM28XX_NUM_AUDIO_PACKETS * EM28XX_AUDIO_MAX_PACKET_SIZE;

	for (i = 0; i < EM28XX_AUDIO_BUFS; i++) {
		struct urb *urb;
@@ -326,9 +345,11 @@ static int em28xx_init_audio_isoc(struct em28xx *dev)
			urb->complete = em28xx_audio_isocirq;
			urb->number_of_packets = EM28XX_NUM_AUDIO_PACKETS;
			urb->transfer_buffer_length = sb_size;
			for(j=k=0; j<EM28XX_NUM_AUDIO_PACKETS;j++,k+=EM28XX_AUDIO_MAX_PACKET_SIZE){
			for (j = k = 0; j < EM28XX_NUM_AUDIO_PACKETS;
			     j++, k += EM28XX_AUDIO_MAX_PACKET_SIZE) {
				urb->iso_frame_desc[j].offset = k;
				urb->iso_frame_desc[j].length=EM28XX_AUDIO_MAX_PACKET_SIZE;
				urb->iso_frame_desc[j].length =
				    EM28XX_AUDIO_MAX_PACKET_SIZE;
			}
			dev->adev->urb[i] = urb;
		} else {
@@ -345,7 +366,6 @@ static int em28xx_init_audio_isoc(struct em28xx *dev)
	return 0;
}


static int em28xx_cmd(struct em28xx *dev, int cmd, int arg)
{
	switch (cmd) {
@@ -357,7 +377,8 @@ static int em28xx_cmd(struct em28xx *dev, int cmd,int arg)
			dev->adev->capture_stream = STREAM_OFF;
			em28xx_isoc_audio_deinit(dev);
		} else {
				printk("An underrun occured very likely... ignoring it\n");
			printk
			    ("An underrun occured very likely... ignoring it\n");
		}
		return 0;
	default:
@@ -365,7 +386,8 @@ static int em28xx_cmd(struct em28xx *dev, int cmd,int arg)
	}
}

static snd_pcm_uframes_t snd_em28xx_capture_pointer(struct snd_pcm_substream *substream)
static snd_pcm_uframes_t snd_em28xx_capture_pointer(struct snd_pcm_substream
						    *substream)
{
	struct em28xx *dev;
	snd_pcm_uframes_t hwptr_done;
@@ -393,7 +415,6 @@ static struct snd_pcm_ops snd_em28xx_pcm_capture = {
	.page = snd_pcm_get_vmalloc_page,
};


static int em28xx_audio_init(struct em28xx *dev)
{
	struct em28xx_audio *adev;