aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <m.chehab@samsung.com>2014-01-13 01:34:23 -0500
committerMauro Carvalho Chehab <m.chehab@samsung.com>2014-01-14 11:39:52 -0500
commita02b9c238b408f69fc78d528b549b85001df98b8 (patch)
treeac3fadaf4a4c826a7fd9c44716f60a3311876a23 /drivers/media
parentebbfbc2006700f0b5701fb3efa44b55a09fba5d1 (diff)
[media] em28xx: adjust period size at runtime
While the current hardcoded period is ok for the current values, we may latter change the driver to work with different bit rates or with different latencies than 64ms. So, adust the period size at runtime. Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/usb/em28xx/em28xx-audio.c8
-rw-r--r--drivers/media/usb/em28xx/em28xx.h2
2 files changed, 10 insertions, 0 deletions
diff --git a/drivers/media/usb/em28xx/em28xx-audio.c b/drivers/media/usb/em28xx/em28xx-audio.c
index 26cf431b1a46..74575e0ed41b 100644
--- a/drivers/media/usb/em28xx/em28xx-audio.c
+++ b/drivers/media/usb/em28xx/em28xx-audio.c
@@ -293,7 +293,12 @@ static int snd_em28xx_capture_open(struct snd_pcm_substream *substream)
293 mutex_unlock(&dev->lock); 293 mutex_unlock(&dev->lock);
294 } 294 }
295 295
296 /* Dynamically adjust the period size */
296 snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); 297 snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
298 snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
299 dev->adev.period * 95 / 100,
300 dev->adev.period * 105 / 100);
301
297 dev->adev.capture_pcm_substream = substream; 302 dev->adev.capture_pcm_substream = substream;
298 303
299 return 0; 304 return 0;
@@ -803,6 +808,9 @@ static int em28xx_audio_urb_init(struct em28xx *dev)
803 em28xx_info("Number of URBs: %d, with %d packets and %d size", 808 em28xx_info("Number of URBs: %d, with %d packets and %d size",
804 num_urb, npackets, urb_size); 809 num_urb, npackets, urb_size);
805 810
811 /* Estimate the bytes per period */
812 dev->adev.period = urb_size * npackets;
813
806 /* Allocate space to store the number of URBs to be used */ 814 /* Allocate space to store the number of URBs to be used */
807 815
808 dev->adev.transfer_buffer = kcalloc(num_urb, 816 dev->adev.transfer_buffer = kcalloc(num_urb,
diff --git a/drivers/media/usb/em28xx/em28xx.h b/drivers/media/usb/em28xx/em28xx.h
index 5d5d1b6f0294..10b817245f7e 100644
--- a/drivers/media/usb/em28xx/em28xx.h
+++ b/drivers/media/usb/em28xx/em28xx.h
@@ -505,6 +505,8 @@ struct em28xx_audio {
505 unsigned int hwptr_done_capture; 505 unsigned int hwptr_done_capture;
506 struct snd_card *sndcard; 506 struct snd_card *sndcard;
507 507
508 size_t period;
509
508 int users; 510 int users;
509 spinlock_t slock; 511 spinlock_t slock;
510}; 512};