Hi,

good patch. This saves quite some code in the I2C part of the driver...

Acked-by: Tobias Lorenz <tobias.lor...@gmx.net>

Bye,
Toby

Am Donnerstag 03 Dezember 2009 13:57:22 schrieb Joonyoung Shim:
> The read and poll file operations of the si470x usb driver can be used
> also equally on the si470x i2c driver, so they go to the common file.
> 
> Signed-off-by: Joonyoung Shim <jy0922.s...@samsung.com>
> ---
>  drivers/media/radio/si470x/radio-si470x-common.c |   98 
> ++++++++++++++++++++++
>  drivers/media/radio/si470x/radio-si470x-i2c.c    |   15 +---
>  drivers/media/radio/si470x/radio-si470x-usb.c    |   97 
> +---------------------
>  drivers/media/radio/si470x/radio-si470x.h        |    3 +-
>  4 files changed, 104 insertions(+), 109 deletions(-)
> 
> diff --git a/drivers/media/radio/si470x/radio-si470x-common.c 
> b/drivers/media/radio/si470x/radio-si470x-common.c
> index 7296cf4..f4645d4 100644
> --- a/drivers/media/radio/si470x/radio-si470x-common.c
> +++ b/drivers/media/radio/si470x/radio-si470x-common.c
> @@ -426,6 +426,104 @@ int si470x_rds_on(struct si470x_device *radio)
>  
>  
>  /**************************************************************************
> + * 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 - file operations interface
> + */
> +static 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
>   **************************************************************************/
>  
> diff --git a/drivers/media/radio/si470x/radio-si470x-i2c.c 
> b/drivers/media/radio/si470x/radio-si470x-i2c.c
> index 2d53b6a..4816a6d 100644
> --- a/drivers/media/radio/si470x/radio-si470x-i2c.c
> +++ b/drivers/media/radio/si470x/radio-si470x-i2c.c
> @@ -173,7 +173,7 @@ int si470x_disconnect_check(struct si470x_device *radio)
>  /*
>   * 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 = 0;
> @@ -194,7 +194,7 @@ static int si470x_fops_open(struct file *file)
>  /*
>   * 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;
> @@ -215,17 +215,6 @@ static int si470x_fops_release(struct file *file)
>  }
>  
>  
> -/*
> - * si470x_fops - file operations interface
> - */
> -const struct v4l2_file_operations si470x_fops = {
> -     .owner          = THIS_MODULE,
> -     .ioctl          = video_ioctl2,
> -     .open           = si470x_fops_open,
> -     .release        = si470x_fops_release,
> -};
> -
> -
>  
>  /**************************************************************************
>   * Video4Linux Interface
> diff --git a/drivers/media/radio/si470x/radio-si470x-usb.c 
> b/drivers/media/radio/si470x/radio-si470x-usb.c
> index f2d0e1d..a96e1b9 100644
> --- a/drivers/media/radio/si470x/radio-si470x-usb.c
> +++ b/drivers/media/radio/si470x/radio-si470x-usb.c
> @@ -509,89 +509,9 @@ resubmit:
>   **************************************************************************/
>  
>  /*
> - * 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
> diff --git a/drivers/media/radio/si470x/radio-si470x.h 
> b/drivers/media/radio/si470x/radio-si470x.h
> index d0af194..f646f79 100644
> --- a/drivers/media/radio/si470x/radio-si470x.h
> +++ b/drivers/media/radio/si470x/radio-si470x.h
> @@ -212,7 +212,6 @@ struct si470x_device {
>  /**************************************************************************
>   * Common Functions
>   **************************************************************************/
> -extern const struct v4l2_file_operations si470x_fops;
>  extern struct video_device si470x_viddev_template;
>  int si470x_get_register(struct si470x_device *radio, int regnr);
>  int si470x_set_register(struct si470x_device *radio, int regnr);
> @@ -221,5 +220,7 @@ int si470x_set_freq(struct si470x_device *radio, unsigned 
> int freq);
>  int si470x_start(struct si470x_device *radio);
>  int si470x_stop(struct si470x_device *radio);
>  int si470x_rds_on(struct si470x_device *radio);
> +int si470x_fops_open(struct file *file);
> +int si470x_fops_release(struct file *file);
>  int si470x_vidioc_querycap(struct file *file, void *priv,
>               struct v4l2_capability *capability);
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to