diff options
Diffstat (limited to 'drivers/media/pci/cx25821/cx25821-audio-upstream.c')
-rw-r--r-- | drivers/media/pci/cx25821/cx25821-audio-upstream.c | 83 |
1 files changed, 25 insertions, 58 deletions
diff --git a/drivers/media/pci/cx25821/cx25821-audio-upstream.c b/drivers/media/pci/cx25821/cx25821-audio-upstream.c index 87491ca05ee5..d930f308e94e 100644 --- a/drivers/media/pci/cx25821/cx25821-audio-upstream.c +++ b/drivers/media/pci/cx25821/cx25821-audio-upstream.c | |||
@@ -259,79 +259,46 @@ void cx25821_free_mem_upstream_audio(struct cx25821_dev *dev) | |||
259 | static int cx25821_get_audio_data(struct cx25821_dev *dev, | 259 | static int cx25821_get_audio_data(struct cx25821_dev *dev, |
260 | struct sram_channel *sram_ch) | 260 | struct sram_channel *sram_ch) |
261 | { | 261 | { |
262 | struct file *myfile; | 262 | struct file *file; |
263 | int frame_index_temp = dev->_audioframe_index; | 263 | int frame_index_temp = dev->_audioframe_index; |
264 | int i = 0; | 264 | int i = 0; |
265 | int line_size = AUDIO_LINE_SIZE; | ||
266 | int frame_size = AUDIO_DATA_BUF_SZ; | 265 | int frame_size = AUDIO_DATA_BUF_SZ; |
267 | int frame_offset = frame_size * frame_index_temp; | 266 | int frame_offset = frame_size * frame_index_temp; |
268 | ssize_t vfs_read_retval = 0; | 267 | char mybuf[AUDIO_LINE_SIZE]; |
269 | char mybuf[line_size]; | ||
270 | loff_t file_offset = dev->_audioframe_count * frame_size; | 268 | loff_t file_offset = dev->_audioframe_count * frame_size; |
271 | loff_t pos; | 269 | char *p = NULL; |
272 | mm_segment_t old_fs; | ||
273 | 270 | ||
274 | if (dev->_audiofile_status == END_OF_FILE) | 271 | if (dev->_audiofile_status == END_OF_FILE) |
275 | return 0; | 272 | return 0; |
276 | 273 | ||
277 | myfile = filp_open(dev->_audiofilename, O_RDONLY | O_LARGEFILE, 0); | 274 | file = filp_open(dev->_audiofilename, O_RDONLY | O_LARGEFILE, 0); |
275 | if (IS_ERR(file)) { | ||
276 | pr_err("%s(): ERROR opening file(%s) with errno = %ld!\n", | ||
277 | __func__, dev->_audiofilename, -PTR_ERR(file)); | ||
278 | return PTR_ERR(file); | ||
279 | } | ||
278 | 280 | ||
279 | if (IS_ERR(myfile)) { | 281 | if (dev->_audiodata_buf_virt_addr) |
280 | const int open_errno = -PTR_ERR(myfile); | 282 | p = (char *)dev->_audiodata_buf_virt_addr + frame_offset; |
281 | pr_err("%s(): ERROR opening file(%s) with errno = %d!\n", | ||
282 | __func__, dev->_audiofilename, open_errno); | ||
283 | return PTR_ERR(myfile); | ||
284 | } else { | ||
285 | if (!(myfile->f_op)) { | ||
286 | pr_err("%s(): File has no file operations registered!\n", | ||
287 | __func__); | ||
288 | filp_close(myfile, NULL); | ||
289 | return -EIO; | ||
290 | } | ||
291 | 283 | ||
292 | if (!myfile->f_op->read) { | 284 | for (i = 0; i < dev->_audio_lines_count; i++) { |
293 | pr_err("%s(): File has no READ operations registered!\n", | 285 | int n = kernel_read(file, file_offset, mybuf, AUDIO_LINE_SIZE); |
286 | if (n < AUDIO_LINE_SIZE) { | ||
287 | pr_info("Done: exit %s() since no more bytes to read from Audio file\n", | ||
294 | __func__); | 288 | __func__); |
295 | filp_close(myfile, NULL); | 289 | dev->_audiofile_status = END_OF_FILE; |
296 | return -EIO; | 290 | fput(file); |
291 | return 0; | ||
297 | } | 292 | } |
298 | 293 | dev->_audiofile_status = IN_PROGRESS; | |
299 | pos = myfile->f_pos; | 294 | if (p) { |
300 | old_fs = get_fs(); | 295 | memcpy(p, mybuf, n); |
301 | set_fs(KERNEL_DS); | 296 | p += n; |
302 | |||
303 | for (i = 0; i < dev->_audio_lines_count; i++) { | ||
304 | pos = file_offset; | ||
305 | |||
306 | vfs_read_retval = vfs_read(myfile, mybuf, line_size, | ||
307 | &pos); | ||
308 | |||
309 | if (vfs_read_retval > 0 && vfs_read_retval == line_size | ||
310 | && dev->_audiodata_buf_virt_addr != NULL) { | ||
311 | memcpy((void *)(dev->_audiodata_buf_virt_addr + | ||
312 | frame_offset / 4), mybuf, | ||
313 | vfs_read_retval); | ||
314 | } | ||
315 | |||
316 | file_offset += vfs_read_retval; | ||
317 | frame_offset += vfs_read_retval; | ||
318 | |||
319 | if (vfs_read_retval < line_size) { | ||
320 | pr_info("Done: exit %s() since no more bytes to read from Audio file\n", | ||
321 | __func__); | ||
322 | break; | ||
323 | } | ||
324 | } | 297 | } |
325 | 298 | file_offset += n; | |
326 | if (i > 0) | ||
327 | dev->_audioframe_count++; | ||
328 | |||
329 | dev->_audiofile_status = (vfs_read_retval == line_size) ? | ||
330 | IN_PROGRESS : END_OF_FILE; | ||
331 | |||
332 | set_fs(old_fs); | ||
333 | filp_close(myfile, NULL); | ||
334 | } | 299 | } |
300 | dev->_audioframe_count++; | ||
301 | fput(file); | ||
335 | 302 | ||
336 | return 0; | 303 | return 0; |
337 | } | 304 | } |