|
@@ -508,90 +508,10 @@ resubmit:
|
|
|
* File Operations Interface
|
|
|
**************************************************************************/
|
|
|
|
|
|
-/*
|
|
|
- * si470x_fops_read - read RDS data
|
|
|
- */
|
|
|
-static ssize_t si470x_fops_read(struct file *file, char __user *buf,
|
|
|
- size_t count, loff_t *ppos)
|
|
|
-{
|
|
|
- struct si470x_device *radio = video_drvdata(file);
|
|
|
- int retval = 0;
|
|
|
- unsigned int block_count = 0;
|
|
|
-
|
|
|
- /* switch on rds reception */
|
|
|
- if ((radio->registers[SYSCONFIG1] & SYSCONFIG1_RDS) == 0)
|
|
|
- si470x_rds_on(radio);
|
|
|
-
|
|
|
- /* block if no new data available */
|
|
|
- while (radio->wr_index == radio->rd_index) {
|
|
|
- if (file->f_flags & O_NONBLOCK) {
|
|
|
- retval = -EWOULDBLOCK;
|
|
|
- goto done;
|
|
|
- }
|
|
|
- if (wait_event_interruptible(radio->read_queue,
|
|
|
- radio->wr_index != radio->rd_index) < 0) {
|
|
|
- retval = -EINTR;
|
|
|
- goto done;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /* calculate block count from byte count */
|
|
|
- count /= 3;
|
|
|
-
|
|
|
- /* copy RDS block out of internal buffer and to user buffer */
|
|
|
- mutex_lock(&radio->lock);
|
|
|
- while (block_count < count) {
|
|
|
- if (radio->rd_index == radio->wr_index)
|
|
|
- break;
|
|
|
-
|
|
|
- /* always transfer rds complete blocks */
|
|
|
- if (copy_to_user(buf, &radio->buffer[radio->rd_index], 3))
|
|
|
- /* retval = -EFAULT; */
|
|
|
- break;
|
|
|
-
|
|
|
- /* increment and wrap read pointer */
|
|
|
- radio->rd_index += 3;
|
|
|
- if (radio->rd_index >= radio->buf_size)
|
|
|
- radio->rd_index = 0;
|
|
|
-
|
|
|
- /* increment counters */
|
|
|
- block_count++;
|
|
|
- buf += 3;
|
|
|
- retval += 3;
|
|
|
- }
|
|
|
- mutex_unlock(&radio->lock);
|
|
|
-
|
|
|
-done:
|
|
|
- return retval;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-/*
|
|
|
- * si470x_fops_poll - poll RDS data
|
|
|
- */
|
|
|
-static unsigned int si470x_fops_poll(struct file *file,
|
|
|
- struct poll_table_struct *pts)
|
|
|
-{
|
|
|
- struct si470x_device *radio = video_drvdata(file);
|
|
|
- int retval = 0;
|
|
|
-
|
|
|
- /* switch on rds reception */
|
|
|
- if ((radio->registers[SYSCONFIG1] & SYSCONFIG1_RDS) == 0)
|
|
|
- si470x_rds_on(radio);
|
|
|
-
|
|
|
- poll_wait(file, &radio->read_queue, pts);
|
|
|
-
|
|
|
- if (radio->rd_index != radio->wr_index)
|
|
|
- retval = POLLIN | POLLRDNORM;
|
|
|
-
|
|
|
- return retval;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
/*
|
|
|
* si470x_fops_open - file open
|
|
|
*/
|
|
|
-static int si470x_fops_open(struct file *file)
|
|
|
+int si470x_fops_open(struct file *file)
|
|
|
{
|
|
|
struct si470x_device *radio = video_drvdata(file);
|
|
|
int retval;
|
|
@@ -645,7 +565,7 @@ done:
|
|
|
/*
|
|
|
* si470x_fops_release - file release
|
|
|
*/
|
|
|
-static int si470x_fops_release(struct file *file)
|
|
|
+int si470x_fops_release(struct file *file)
|
|
|
{
|
|
|
struct si470x_device *radio = video_drvdata(file);
|
|
|
int retval = 0;
|
|
@@ -688,19 +608,6 @@ done:
|
|
|
}
|
|
|
|
|
|
|
|
|
-/*
|
|
|
- * si470x_fops - file operations interface
|
|
|
- */
|
|
|
-const struct v4l2_file_operations si470x_fops = {
|
|
|
- .owner = THIS_MODULE,
|
|
|
- .read = si470x_fops_read,
|
|
|
- .poll = si470x_fops_poll,
|
|
|
- .ioctl = video_ioctl2,
|
|
|
- .open = si470x_fops_open,
|
|
|
- .release = si470x_fops_release,
|
|
|
-};
|
|
|
-
|
|
|
-
|
|
|
|
|
|
/**************************************************************************
|
|
|
* Video4Linux Interface
|