All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] cx23885: Add radio support for MyGica x8507
@ 2013-10-18 20:47 Nicolás Sugino
  2013-10-20 18:11 ` Alfredo Jesús Delaiti
  0 siblings, 1 reply; 3+ messages in thread
From: Nicolás Sugino @ 2013-10-18 20:47 UTC (permalink / raw)
  To: linux-media

 From: Sugino Nicolas
 Date: Fri, 18 Oct 2013 17:37:00 -0300
 Subject: [PATCH] cx23885: Add radio support for MyGica x8507

This patch allows radio capture for the cx23885 driver with the MyGica
x8507 card

diff -rcNP a/drivers/media/pci/cx23885/cx23885-cards.c
b/drivers/media/pci/cx23885/cx23885-cards.c
*** a/drivers/media/pci/cx23885/cx23885-cards.c 2013-10-18
17:17:43.257083061 -0300
--- b/drivers/media/pci/cx23885/cx23885-cards.c 2013-10-18
16:10:04.124085546 -0300
***************
*** 531,536 ****
--- 541,548 ----
  .name = "Mygica X8502/X8507 ISDB-T",
  .tuner_type = TUNER_XC5000,
  .tuner_addr = 0x61,
+ .radio_type = TUNER_XC5000,
+ .radio_addr = 0x61,
  .tuner_bus = 1,
  .porta = CX23885_ANALOG_VIDEO,
  .portb = CX23885_MPEG_DVB,
***************
*** 559,564 ****
--- 571,580 ----
  CX25840_VIN7_CH3,
  .amux   = CX25840_AUDIO7,
  },
+ {
+ .type   = CX23885_RADIO,
+ .amux= CX25840_AUDIO8,
+ },
  },
  },
  [CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL] = {
diff -rcNP a/drivers/media/pci/cx23885/cx23885-dvb.c
b/drivers/media/pci/cx23885/cx23885-dvb.c
*** a/drivers/media/pci/cx23885/cx23885-dvb.c 2013-10-18
17:17:43.281083064 -0300
--- b/drivers/media/pci/cx23885/cx23885-dvb.c 2013-10-18
16:01:10.171036171 -0300
***************
*** 500,505 ****
--- 505,511 ----
  static struct xc5000_config mygica_x8507_xc5000_config = {
  .i2c_address = 0x61,
  .if_khz = 4000,
+ .radio_input = XC5000_RADIO_FM1,
  };

  static struct stv090x_config prof_8000_stv090x_config = {
diff -rcNP a/drivers/media/pci/cx23885/cx23885-video.c
b/drivers/media/pci/cx23885/cx23885-video.c
*** a/drivers/media/pci/cx23885/cx23885-video.c 2013-10-18
17:17:43.288083064 -0300
--- b/drivers/media/pci/cx23885/cx23885-video.c 2013-10-18
17:01:53.787051023 -0300
***************
*** 904,909 ****
--- 904,916 ----
  sizeof(struct cx23885_buffer),
  fh, NULL);

+ if(dev->board == CX23885_BOARD_MYGICA_X8507) {
+ if (fh->radio) {
+ dprintk(1,"video_open: setting radio device\n");
+ call_all(dev, tuner, s_radio);
+ }
+ }

  dprintk(1, "post videobuf_queue_init()\n");

***************
*** 1634,1639 ****
--- 1641,1746 ----
  }


+ static int radio_querycap (struct file *file, void  *priv,
+ struct v4l2_capability *cap)
+ {
+ struct cx23885_dev *dev  = ((struct cx23885_fh *)priv)->dev;
+
+ strcpy(cap->driver, "cx23885");
+ strlcpy(cap->card, cx23885_boards[dev->board].name, sizeof(cap->card));
+ sprintf(cap->bus_info,"PCIe:%s", pci_name(dev->pci));
+ cap->capabilities = V4L2_CAP_TUNER;
+ return 0;
+ }
+
+ static int radio_g_tuner (struct file *file, void *priv,
+ struct v4l2_tuner *t)
+ {
+ struct cx23885_dev *dev  = ((struct cx23885_fh *)priv)->dev;
+
+ if (unlikely(t->index > 0))
+ return -EINVAL;
+
+ strcpy(t->name, "Radio");
+ t->type = V4L2_TUNER_RADIO;
+
+ call_all(dev, tuner, g_tuner, t);
+ return 0;
+ }
+
+ static int radio_enum_input (struct file *file, void *priv,
+ struct v4l2_input *i)
+ {
+ if (i->index != 0)
+ return -EINVAL;
+ strcpy(i->name,"Radio");
+ i->type = V4L2_INPUT_TYPE_TUNER;
+
+ return 0;
+ }
+
+ static int radio_g_audio (struct file *file, void *priv, struct v4l2_audio *a)
+ {
+ if (unlikely(a->index))
+ return -EINVAL;
+
+ strcpy(a->name,"Radio");
+ return 0;
+ }
+
+ /* FIXME: Should add a standard for radio */
+ static int radio_s_tuner (struct file *file, void *priv,
+ struct v4l2_tuner *t)
+ {
+ struct cx23885_dev *dev  = ((struct cx23885_fh *)priv)->dev;
+
+ if (0 != t->index)
+ return -EINVAL;
+
+ call_all(dev, tuner, s_tuner, t);
+
+ return 0;
+ }
+
+ static int radio_s_audio (struct file *file, void *fh,
+  struct v4l2_audio *a)
+ {
+ return 0;
+ }
+
+ static int radio_s_input (struct file *file, void *fh, unsigned int i)
+ {
+ return 0;
+ }
+
+ static int radio_queryctrl (struct file *file, void *priv,
+    struct v4l2_queryctrl *c)
+ {
+ int i;
+
+ if (c->id < V4L2_CID_BASE ||
+ c->id >= V4L2_CID_LASTP1)
+ return -EINVAL;
+ if (c->id == V4L2_CID_AUDIO_MUTE ||
+ c->id == V4L2_CID_AUDIO_VOLUME ||
+ c->id == V4L2_CID_AUDIO_BALANCE) {
+ for (i = 0; i < CX23885_CTLS; i++) {
+ if (cx23885_ctls[i].v.id == c->id)
+ break;
+ }
+ if (i == CX23885_CTLS) {
+ *c = no_ctl;
+ return 0;
+ }
+ *c = cx23885_ctls[i].v;
+ } else
+ *c = no_ctl;
+ return 0;
+ }
+
+ /* ----------------------------------------------------------- */

  static void cx23885_vid_timeout(unsigned long data)
  {
***************
*** 1774,1779 ****
--- 1881,1906 ----
  .tvnorms              = CX23885_NORMS,
  };

+ static const struct v4l2_ioctl_ops radio_ioctl_ops = {
+ .vidioc_querycap      = radio_querycap,
+ .vidioc_g_tuner       = radio_g_tuner,
+ .vidioc_enum_input    = radio_enum_input,
+ .vidioc_g_audio       = radio_g_audio,
+ .vidioc_s_tuner       = radio_s_tuner,
+ .vidioc_s_audio       = radio_s_audio,
+ .vidioc_s_input       = radio_s_input,
+ .vidioc_queryctrl     = radio_queryctrl,
+ .vidioc_g_ctrl        = vidioc_g_ctrl,
+ .vidioc_s_ctrl        = vidioc_s_ctrl,
+ .vidioc_g_frequency   = vidioc_g_frequency,
+ .vidioc_s_frequency   = vidioc_s_frequency,
+ #ifdef CONFIG_VIDEO_ADV_DEBUG
+ .vidioc_g_register    = cx23885_g_register,
+ .vidioc_s_register    = cx23885_s_register,
+ #endif
+ };
+
  static const struct v4l2_file_operations radio_fops = {
  .owner         = THIS_MODULE,
  .open          = video_open,
***************
*** 1781,1792 ****
--- 1908,1932 ----
  .ioctl         = video_ioctl2,
  };

+ static struct video_device cx23885_radio_template = {
+ .name                 = "cx23885-radio",
+ .fops                 = &radio_fops,
+ .ioctl_ops            = &radio_ioctl_ops,
+ };
+

  void cx23885_video_unregister(struct cx23885_dev *dev)
  {
  dprintk(1, "%s()\n", __func__);
  cx23885_irq_remove(dev, 0x01);

+ if (dev->radio_dev) {
+ if (video_is_registered(dev->radio_dev))
+ video_unregister_device(dev->radio_dev);
+ else
+ video_device_release(dev->radio_dev);
+ dev->radio_dev = NULL;
+ }
  if (dev->vbi_dev) {
  if (video_is_registered(dev->vbi_dev))
  video_unregister_device(dev->vbi_dev);
***************
*** 1858,1864 ****
  struct tuner_setup tun_setup;

  memset(&tun_setup, 0, sizeof(tun_setup));
! tun_setup.mode_mask = T_ANALOG_TV;
  tun_setup.type = dev->tuner_type;
  tun_setup.addr = v4l2_i2c_subdev_addr(sd);
  tun_setup.tuner_callback = cx23885_tuner_callback;
--- 1998,2004 ----
  struct tuner_setup tun_setup;

  memset(&tun_setup, 0, sizeof(tun_setup));
! tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;
  tun_setup.type = dev->tuner_type;
  tun_setup.addr = v4l2_i2c_subdev_addr(sd);
  tun_setup.tuner_callback = cx23885_tuner_callback;
***************
*** 1917,1922 ****
--- 2057,2075 ----
  printk(KERN_INFO "%s: registered device %s\n",
        dev->name, video_device_node_name(dev->vbi_dev));

+ dev->radio_dev = cx23885_vdev_init(dev, dev->pci,
+ &cx23885_radio_template, "radio");
+ err = video_register_device(dev->radio_dev, VFL_TYPE_RADIO,
+    radio_nr[dev->nr]);
+ if (err < 0) {
+ printk(KERN_INFO "%s: can't register radio device\n",
+ dev->name);
+ goto fail_unreg;
+ }
+ printk(KERN_INFO "%s: registered device %s\n",
+       dev->name, video_device_node_name(dev->radio_dev));
+
+
  /* Register ALSA audio device */
  dev->audio_dev = cx23885_audio_register(dev);


Regards,

Nicolas

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] cx23885: Add radio support for MyGica x8507
  2013-10-18 20:47 [PATCH] cx23885: Add radio support for MyGica x8507 Nicolás Sugino
@ 2013-10-20 18:11 ` Alfredo Jesús Delaiti
  2013-10-21  0:49   ` Nicolas Sugino
  0 siblings, 1 reply; 3+ messages in thread
From: Alfredo Jesús Delaiti @ 2013-10-20 18:11 UTC (permalink / raw)
  To: Nicolás Sugino, linux-media

Hi Nicolás

El 18/10/13 17:47, Nicolás Sugino escribió:
>   From: Sugino Nicolas
>   Date: Fri, 18 Oct 2013 17:37:00 -0300
>   Subject: [PATCH] cx23885: Add radio support for MyGica x8507
>
> This patch allows radio capture for the cx23885 driver with the MyGica
> x8507 card
>
> diff -rcNP a/drivers/media/pci/cx23885/cx23885-cards.c
> b/drivers/media/pci/cx23885/cx23885-cards.c
> *** a/drivers/media/pci/cx23885/cx23885-cards.c 2013-10-18
> 17:17:43.257083061 -0300
> --- b/drivers/media/pci/cx23885/cx23885-cards.c 2013-10-18
> 16:10:04.124085546 -0300
> ***************
> *** 531,536 ****
> --- 541,548 ----
>    .name = "Mygica X8502/X8507 ISDB-T",
>    .tuner_type = TUNER_XC5000,
>    .tuner_addr = 0x61,
> + .radio_type = TUNER_XC5000,
> + .radio_addr = 0x61,
>    .tuner_bus = 1,
>    .porta = CX23885_ANALOG_VIDEO,
>    .portb = CX23885_MPEG_DVB,
> ***************
> *** 559,564 ****
> --- 571,580 ----
>    CX25840_VIN7_CH3,
>    .amux   = CX25840_AUDIO7,
>    },
> + {
> + .type   = CX23885_RADIO,
> + .amux= CX25840_AUDIO8,
> + },
>    },
>    },
>    [CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL] = {
> diff -rcNP a/drivers/media/pci/cx23885/cx23885-dvb.c
> b/drivers/media/pci/cx23885/cx23885-dvb.c
> *** a/drivers/media/pci/cx23885/cx23885-dvb.c 2013-10-18
> 17:17:43.281083064 -0300
> --- b/drivers/media/pci/cx23885/cx23885-dvb.c 2013-10-18
> 16:01:10.171036171 -0300
> ***************
> *** 500,505 ****
> --- 505,511 ----
>    static struct xc5000_config mygica_x8507_xc5000_config = {
>    .i2c_address = 0x61,
>    .if_khz = 4000,
> + .radio_input = XC5000_RADIO_FM1,
>    };
>
>    static struct stv090x_config prof_8000_stv090x_config = {
> diff -rcNP a/drivers/media/pci/cx23885/cx23885-video.c
> b/drivers/media/pci/cx23885/cx23885-video.c
> *** a/drivers/media/pci/cx23885/cx23885-video.c 2013-10-18
> 17:17:43.288083064 -0300
> --- b/drivers/media/pci/cx23885/cx23885-video.c 2013-10-18
> 17:01:53.787051023 -0300
> ***************
> *** 904,909 ****
> --- 904,916 ----
>    sizeof(struct cx23885_buffer),
>    fh, NULL);
>
> + if(dev->board == CX23885_BOARD_MYGICA_X8507) {
> + if (fh->radio) {
> + dprintk(1,"video_open: setting radio device\n");
> + call_all(dev, tuner, s_radio);
> + }
> + }
>
>    dprintk(1, "post videobuf_queue_init()\n");
>
> ***************
> *** 1634,1639 ****
> --- 1641,1746 ----
>    }
>
>
> + static int radio_querycap (struct file *file, void  *priv,
> + struct v4l2_capability *cap)
> + {
> + struct cx23885_dev *dev  = ((struct cx23885_fh *)priv)->dev;
> +
> + strcpy(cap->driver, "cx23885");
> + strlcpy(cap->card, cx23885_boards[dev->board].name, sizeof(cap->card));
> + sprintf(cap->bus_info,"PCIe:%s", pci_name(dev->pci));
> + cap->capabilities = V4L2_CAP_TUNER;
> + return 0;
> + }
> +
> + static int radio_g_tuner (struct file *file, void *priv,
> + struct v4l2_tuner *t)
> + {
> + struct cx23885_dev *dev  = ((struct cx23885_fh *)priv)->dev;
> +
> + if (unlikely(t->index > 0))
> + return -EINVAL;
> +
> + strcpy(t->name, "Radio");
> + t->type = V4L2_TUNER_RADIO;
> +
> + call_all(dev, tuner, g_tuner, t);
> + return 0;
> + }
> +
> + static int radio_enum_input (struct file *file, void *priv,
> + struct v4l2_input *i)
> + {
> + if (i->index != 0)
> + return -EINVAL;
> + strcpy(i->name,"Radio");
> + i->type = V4L2_INPUT_TYPE_TUNER;
> +
> + return 0;
> + }
> +
> + static int radio_g_audio (struct file *file, void *priv, struct v4l2_audio *a)
> + {
> + if (unlikely(a->index))
> + return -EINVAL;
> +
> + strcpy(a->name,"Radio");
> + return 0;
> + }
> +
> + /* FIXME: Should add a standard for radio */
> + static int radio_s_tuner (struct file *file, void *priv,
> + struct v4l2_tuner *t)
> + {
> + struct cx23885_dev *dev  = ((struct cx23885_fh *)priv)->dev;
> +
> + if (0 != t->index)
> + return -EINVAL;
> +
> + call_all(dev, tuner, s_tuner, t);
> +
> + return 0;
> + }
> +
> + static int radio_s_audio (struct file *file, void *fh,
> +  struct v4l2_audio *a)
> + {
> + return 0;
> + }
> +
> + static int radio_s_input (struct file *file, void *fh, unsigned int i)
> + {
> + return 0;
> + }
> +
> + static int radio_queryctrl (struct file *file, void *priv,
> +    struct v4l2_queryctrl *c)
> + {
> + int i;
> +
> + if (c->id < V4L2_CID_BASE ||
> + c->id >= V4L2_CID_LASTP1)
> + return -EINVAL;
> + if (c->id == V4L2_CID_AUDIO_MUTE ||
> + c->id == V4L2_CID_AUDIO_VOLUME ||
> + c->id == V4L2_CID_AUDIO_BALANCE) {
> + for (i = 0; i < CX23885_CTLS; i++) {
> + if (cx23885_ctls[i].v.id == c->id)
> + break;
> + }
> + if (i == CX23885_CTLS) {
> + *c = no_ctl;
> + return 0;
> + }
> + *c = cx23885_ctls[i].v;
> + } else
> + *c = no_ctl;
> + return 0;
> + }
> +
> + /* ----------------------------------------------------------- */
>
>    static void cx23885_vid_timeout(unsigned long data)
>    {
> ***************
> *** 1774,1779 ****
> --- 1881,1906 ----
>    .tvnorms              = CX23885_NORMS,
>    };
>
> + static const struct v4l2_ioctl_ops radio_ioctl_ops = {
> + .vidioc_querycap      = radio_querycap,
> + .vidioc_g_tuner       = radio_g_tuner,
> + .vidioc_enum_input    = radio_enum_input,
> + .vidioc_g_audio       = radio_g_audio,
> + .vidioc_s_tuner       = radio_s_tuner,
> + .vidioc_s_audio       = radio_s_audio,
> + .vidioc_s_input       = radio_s_input,
> + .vidioc_queryctrl     = radio_queryctrl,
> + .vidioc_g_ctrl        = vidioc_g_ctrl,
> + .vidioc_s_ctrl        = vidioc_s_ctrl,
> + .vidioc_g_frequency   = vidioc_g_frequency,
> + .vidioc_s_frequency   = vidioc_s_frequency,
> + #ifdef CONFIG_VIDEO_ADV_DEBUG
> + .vidioc_g_register    = cx23885_g_register,
> + .vidioc_s_register    = cx23885_s_register,
> + #endif
> + };
> +
>    static const struct v4l2_file_operations radio_fops = {
>    .owner         = THIS_MODULE,
>    .open          = video_open,
> ***************
> *** 1781,1792 ****
> --- 1908,1932 ----
>    .ioctl         = video_ioctl2,
>    };
>
> + static struct video_device cx23885_radio_template = {
> + .name                 = "cx23885-radio",
> + .fops                 = &radio_fops,
> + .ioctl_ops            = &radio_ioctl_ops,
> + };
> +
>
>    void cx23885_video_unregister(struct cx23885_dev *dev)
>    {
>    dprintk(1, "%s()\n", __func__);
>    cx23885_irq_remove(dev, 0x01);
>
> + if (dev->radio_dev) {
> + if (video_is_registered(dev->radio_dev))
> + video_unregister_device(dev->radio_dev);
> + else
> + video_device_release(dev->radio_dev);
> + dev->radio_dev = NULL;
> + }
>    if (dev->vbi_dev) {
>    if (video_is_registered(dev->vbi_dev))
>    video_unregister_device(dev->vbi_dev);
> ***************
> *** 1858,1864 ****
>    struct tuner_setup tun_setup;
>
>    memset(&tun_setup, 0, sizeof(tun_setup));
> ! tun_setup.mode_mask = T_ANALOG_TV;
>    tun_setup.type = dev->tuner_type;
>    tun_setup.addr = v4l2_i2c_subdev_addr(sd);
>    tun_setup.tuner_callback = cx23885_tuner_callback;
> --- 1998,2004 ----
>    struct tuner_setup tun_setup;
>
>    memset(&tun_setup, 0, sizeof(tun_setup));
> ! tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;
>    tun_setup.type = dev->tuner_type;
>    tun_setup.addr = v4l2_i2c_subdev_addr(sd);
>    tun_setup.tuner_callback = cx23885_tuner_callback;
> ***************
> *** 1917,1922 ****
> --- 2057,2075 ----
>    printk(KERN_INFO "%s: registered device %s\n",
>          dev->name, video_device_node_name(dev->vbi_dev));
>
> + dev->radio_dev = cx23885_vdev_init(dev, dev->pci,
> + &cx23885_radio_template, "radio");
> + err = video_register_device(dev->radio_dev, VFL_TYPE_RADIO,
> +    radio_nr[dev->nr]);
> + if (err < 0) {
> + printk(KERN_INFO "%s: can't register radio device\n",
> + dev->name);
> + goto fail_unreg;
> + }
> + printk(KERN_INFO "%s: registered device %s\n",
> +       dev->name, video_device_node_name(dev->radio_dev));
> +
> +
>    /* Register ALSA audio device */
>    dev->audio_dev = cx23885_audio_register(dev);
>
>
> Regards,
>
> Nicolas
>

The patch has sent broken spaces, so that it becomes difficult to 
understand.

For the lines that I have seen, these lines of code are the same as 
Miroslav Slugen wrote in "CX23885: Add basic support analog Radio" and 
the answer that I've done (https://linuxtv.org/patch/20329 /).
What are the differences between the patches sent by Miroslav Slugen and 
me? Does it solve the problems I have raised for this board in particular?

Regards

Alfredo

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] cx23885: Add radio support for MyGica x8507
  2013-10-20 18:11 ` Alfredo Jesús Delaiti
@ 2013-10-21  0:49   ` Nicolas Sugino
  0 siblings, 0 replies; 3+ messages in thread
From: Nicolas Sugino @ 2013-10-21  0:49 UTC (permalink / raw)
  To: Alfredo Jesús Delaiti; +Cc: linux-media

Hi,


2013/10/20 Alfredo Jesús Delaiti <alfredodelaiti@netscape.net>
>
> Hi Nicolás
>
> El 18/10/13 17:47, Nicolás Sugino escribió:
>
>>   From: Sugino Nicolas
>>   Date: Fri, 18 Oct 2013 17:37:00 -0300
>>   Subject: [PATCH] cx23885: Add radio support for MyGica x8507
>>
>> This patch allows radio capture for the cx23885 driver with the MyGica
>> x8507 card
>>
>> diff -rcNP a/drivers/media/pci/cx23885/cx23885-cards.c
>> b/drivers/media/pci/cx23885/cx23885-cards.c
>> *** a/drivers/media/pci/cx23885/cx23885-cards.c 2013-10-18
>> 17:17:43.257083061 -0300
>> --- b/drivers/media/pci/cx23885/cx23885-cards.c 2013-10-18
>> 16:10:04.124085546 -0300
>> ***************
>> *** 531,536 ****
>> --- 541,548 ----
>>    .name = "Mygica X8502/X8507 ISDB-T",
>>    .tuner_type = TUNER_XC5000,
>>    .tuner_addr = 0x61,
>> + .radio_type = TUNER_XC5000,
>> + .radio_addr = 0x61,
>>    .tuner_bus = 1,
>>    .porta = CX23885_ANALOG_VIDEO,
>>    .portb = CX23885_MPEG_DVB,
>> ***************
>> *** 559,564 ****
>> --- 571,580 ----
>>    CX25840_VIN7_CH3,
>>    .amux   = CX25840_AUDIO7,
>>    },
>> + {
>> + .type   = CX23885_RADIO,
>> + .amux= CX25840_AUDIO8,
>> + },
>>    },
>>    },
>>    [CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL] = {
>> diff -rcNP a/drivers/media/pci/cx23885/cx23885-dvb.c
>> b/drivers/media/pci/cx23885/cx23885-dvb.c
>> *** a/drivers/media/pci/cx23885/cx23885-dvb.c 2013-10-18
>> 17:17:43.281083064 -0300
>> --- b/drivers/media/pci/cx23885/cx23885-dvb.c 2013-10-18
>> 16:01:10.171036171 -0300
>> ***************
>> *** 500,505 ****
>> --- 505,511 ----
>>    static struct xc5000_config mygica_x8507_xc5000_config = {
>>    .i2c_address = 0x61,
>>    .if_khz = 4000,
>> + .radio_input = XC5000_RADIO_FM1,
>>    };
>>
>>    static struct stv090x_config prof_8000_stv090x_config = {
>> diff -rcNP a/drivers/media/pci/cx23885/cx23885-video.c
>> b/drivers/media/pci/cx23885/cx23885-video.c
>> *** a/drivers/media/pci/cx23885/cx23885-video.c 2013-10-18
>> 17:17:43.288083064 -0300
>> --- b/drivers/media/pci/cx23885/cx23885-video.c 2013-10-18
>> 17:01:53.787051023 -0300
>> ***************
>> *** 904,909 ****
>> --- 904,916 ----
>>    sizeof(struct cx23885_buffer),
>>    fh, NULL);
>>
>> + if(dev->board == CX23885_BOARD_MYGICA_X8507) {
>> + if (fh->radio) {
>> + dprintk(1,"video_open: setting radio device\n");
>> + call_all(dev, tuner, s_radio);
>> + }
>> + }
>>
>>    dprintk(1, "post videobuf_queue_init()\n");
>>
>> ***************
>> *** 1634,1639 ****
>> --- 1641,1746 ----
>>    }
>>
>>
>> + static int radio_querycap (struct file *file, void  *priv,
>> + struct v4l2_capability *cap)
>> + {
>> + struct cx23885_dev *dev  = ((struct cx23885_fh *)priv)->dev;
>> +
>> + strcpy(cap->driver, "cx23885");
>> + strlcpy(cap->card, cx23885_boards[dev->board].name, sizeof(cap->card));
>> + sprintf(cap->bus_info,"PCIe:%s", pci_name(dev->pci));
>> + cap->capabilities = V4L2_CAP_TUNER;
>> + return 0;
>> + }
>> +
>> + static int radio_g_tuner (struct file *file, void *priv,
>> + struct v4l2_tuner *t)
>> + {
>> + struct cx23885_dev *dev  = ((struct cx23885_fh *)priv)->dev;
>> +
>> + if (unlikely(t->index > 0))
>> + return -EINVAL;
>> +
>> + strcpy(t->name, "Radio");
>> + t->type = V4L2_TUNER_RADIO;
>> +
>> + call_all(dev, tuner, g_tuner, t);
>> + return 0;
>> + }
>> +
>> + static int radio_enum_input (struct file *file, void *priv,
>> + struct v4l2_input *i)
>> + {
>> + if (i->index != 0)
>> + return -EINVAL;
>> + strcpy(i->name,"Radio");
>> + i->type = V4L2_INPUT_TYPE_TUNER;
>> +
>> + return 0;
>> + }
>> +
>> + static int radio_g_audio (struct file *file, void *priv, struct v4l2_audio *a)
>> + {
>> + if (unlikely(a->index))
>> + return -EINVAL;
>> +
>> + strcpy(a->name,"Radio");
>> + return 0;
>> + }
>> +
>> + /* FIXME: Should add a standard for radio */
>> + static int radio_s_tuner (struct file *file, void *priv,
>> + struct v4l2_tuner *t)
>> + {
>> + struct cx23885_dev *dev  = ((struct cx23885_fh *)priv)->dev;
>> +
>> + if (0 != t->index)
>> + return -EINVAL;
>> +
>> + call_all(dev, tuner, s_tuner, t);
>> +
>> + return 0;
>> + }
>> +
>> + static int radio_s_audio (struct file *file, void *fh,
>> +  struct v4l2_audio *a)
>> + {
>> + return 0;
>> + }
>> +
>> + static int radio_s_input (struct file *file, void *fh, unsigned int i)
>> + {
>> + return 0;
>> + }
>> +
>> + static int radio_queryctrl (struct file *file, void *priv,
>> +    struct v4l2_queryctrl *c)
>> + {
>> + int i;
>> +
>> + if (c->id < V4L2_CID_BASE ||
>> + c->id >= V4L2_CID_LASTP1)
>> + return -EINVAL;
>> + if (c->id == V4L2_CID_AUDIO_MUTE ||
>> + c->id == V4L2_CID_AUDIO_VOLUME ||
>> + c->id == V4L2_CID_AUDIO_BALANCE) {
>> + for (i = 0; i < CX23885_CTLS; i++) {
>> + if (cx23885_ctls[i].v.id == c->id)
>> + break;
>> + }
>> + if (i == CX23885_CTLS) {
>> + *c = no_ctl;
>> + return 0;
>> + }
>> + *c = cx23885_ctls[i].v;
>> + } else
>> + *c = no_ctl;
>> + return 0;
>> + }
>> +
>> + /* ----------------------------------------------------------- */
>>
>>    static void cx23885_vid_timeout(unsigned long data)
>>    {
>> ***************
>> *** 1774,1779 ****
>> --- 1881,1906 ----
>>    .tvnorms              = CX23885_NORMS,
>>    };
>>
>> + static const struct v4l2_ioctl_ops radio_ioctl_ops = {
>> + .vidioc_querycap      = radio_querycap,
>> + .vidioc_g_tuner       = radio_g_tuner,
>> + .vidioc_enum_input    = radio_enum_input,
>> + .vidioc_g_audio       = radio_g_audio,
>> + .vidioc_s_tuner       = radio_s_tuner,
>> + .vidioc_s_audio       = radio_s_audio,
>> + .vidioc_s_input       = radio_s_input,
>> + .vidioc_queryctrl     = radio_queryctrl,
>> + .vidioc_g_ctrl        = vidioc_g_ctrl,
>> + .vidioc_s_ctrl        = vidioc_s_ctrl,
>> + .vidioc_g_frequency   = vidioc_g_frequency,
>> + .vidioc_s_frequency   = vidioc_s_frequency,
>> + #ifdef CONFIG_VIDEO_ADV_DEBUG
>> + .vidioc_g_register    = cx23885_g_register,
>> + .vidioc_s_register    = cx23885_s_register,
>> + #endif
>> + };
>> +
>>    static const struct v4l2_file_operations radio_fops = {
>>    .owner         = THIS_MODULE,
>>    .open          = video_open,
>> ***************
>> *** 1781,1792 ****
>> --- 1908,1932 ----
>>    .ioctl         = video_ioctl2,
>>    };
>>
>> + static struct video_device cx23885_radio_template = {
>> + .name                 = "cx23885-radio",
>> + .fops                 = &radio_fops,
>> + .ioctl_ops            = &radio_ioctl_ops,
>> + };
>> +
>>
>>    void cx23885_video_unregister(struct cx23885_dev *dev)
>>    {
>>    dprintk(1, "%s()\n", __func__);
>>    cx23885_irq_remove(dev, 0x01);
>>
>> + if (dev->radio_dev) {
>> + if (video_is_registered(dev->radio_dev))
>> + video_unregister_device(dev->radio_dev);
>> + else
>> + video_device_release(dev->radio_dev);
>> + dev->radio_dev = NULL;
>> + }
>>    if (dev->vbi_dev) {
>>    if (video_is_registered(dev->vbi_dev))
>>    video_unregister_device(dev->vbi_dev);
>> ***************
>> *** 1858,1864 ****
>>    struct tuner_setup tun_setup;
>>
>>    memset(&tun_setup, 0, sizeof(tun_setup));
>> ! tun_setup.mode_mask = T_ANALOG_TV;
>>    tun_setup.type = dev->tuner_type;
>>    tun_setup.addr = v4l2_i2c_subdev_addr(sd);
>>    tun_setup.tuner_callback = cx23885_tuner_callback;
>> --- 1998,2004 ----
>>    struct tuner_setup tun_setup;
>>
>>    memset(&tun_setup, 0, sizeof(tun_setup));
>> ! tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;
>>    tun_setup.type = dev->tuner_type;
>>    tun_setup.addr = v4l2_i2c_subdev_addr(sd);
>>    tun_setup.tuner_callback = cx23885_tuner_callback;
>> ***************
>> *** 1917,1922 ****
>> --- 2057,2075 ----
>>    printk(KERN_INFO "%s: registered device %s\n",
>>          dev->name, video_device_node_name(dev->vbi_dev));
>>
>> + dev->radio_dev = cx23885_vdev_init(dev, dev->pci,
>> + &cx23885_radio_template, "radio");
>> + err = video_register_device(dev->radio_dev, VFL_TYPE_RADIO,
>> +    radio_nr[dev->nr]);
>> + if (err < 0) {
>> + printk(KERN_INFO "%s: can't register radio device\n",
>> + dev->name);
>> + goto fail_unreg;
>> + }
>> + printk(KERN_INFO "%s: registered device %s\n",
>> +       dev->name, video_device_node_name(dev->radio_dev));
>> +
>> +
>>    /* Register ALSA audio device */
>>    dev->audio_dev = cx23885_audio_register(dev);
>>
>>
>> Regards,
>>
>> Nicolas
>>
>
> The patch has sent broken spaces, so that it becomes difficult to understand.
>
> For the lines that I have seen, these lines of code are the same as Miroslav Slugen wrote in "CX23885: Add basic support analog Radio" and the answer that I've done (https://linuxtv.org/patch/20329 /).
> What are the differences between the patches sent by Miroslav Slugen and me? Does it solve the problems I have raised for this board in particular?
>
> Regards
>
> Alfredo


I am quite new to v4l, and even more to the capture card drivers. I
saw both patches you mentioned, tried to apply them but I couldn't. If
I remember correctly one problem was the .radio member in the struct
cx23885_board, perhaps the kernel version I was trying to use is
old... so I added the radio as an input (perhaps this is also wrong,
please explain me why if it is). And the rest is the diff I had when I
applied Miroslav's one, with very few changes.

Rigth now I am not in the pc where I tested this and I don't have the
card in hand, but if I see any other difference I will try to point
them out.

I think I should've said first that I tried to apply both your
patches, as I said before I am new to v4l and linuxtv-media mailing
list, so I apologise if I did something wrong. I just submitted the
diff that made my card work, but afterwards I also realised that I had
problems with the analog TV capture, so there might be something wrong
also.

Regards,

Nicolas

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2013-10-21  0:49 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-10-18 20:47 [PATCH] cx23885: Add radio support for MyGica x8507 Nicolás Sugino
2013-10-20 18:11 ` Alfredo Jesús Delaiti
2013-10-21  0:49   ` Nicolas Sugino

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.