V4L/DVB: cx25840/ivtv: replace ugly priv control with s_config
authorHans Verkuil <hverkuil@xs4all.nl>
Fri, 6 Aug 2010 13:53:19 +0000 (10:53 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 9 Aug 2010 02:43:05 +0000 (23:43 -0300)
The cx25840 used a private control CX25840_CID_ENABLE_PVR150_WORKAROUND
to be told whether to enable a workaround for certain pvr150 cards.

This is really config data that it needs to get at load time.

Implemented this in cx25840 and ivtv.

Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/cx25840/cx25840-core.c
drivers/media/video/cx25840/cx25840-core.h
drivers/media/video/ivtv/ivtv-driver.c
drivers/media/video/ivtv/ivtv-i2c.c
include/media/cx25840.h

index 9fab0b1..6976372 100644 (file)
@@ -1127,11 +1127,6 @@ static int cx25840_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
        struct i2c_client *client = v4l2_get_subdevdata(sd);
 
        switch (ctrl->id) {
-       case CX25840_CID_ENABLE_PVR150_WORKAROUND:
-               state->pvr150_workaround = ctrl->value;
-               set_input(client, state->vid_input, state->aud_input);
-               break;
-
        case V4L2_CID_BRIGHTNESS:
                if (ctrl->value < 0 || ctrl->value > 255) {
                        v4l_err(client, "invalid brightness setting %d\n",
@@ -1194,9 +1189,6 @@ static int cx25840_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
        struct i2c_client *client = v4l2_get_subdevdata(sd);
 
        switch (ctrl->id) {
-       case CX25840_CID_ENABLE_PVR150_WORKAROUND:
-               ctrl->value = state->pvr150_workaround;
-               break;
        case V4L2_CID_BRIGHTNESS:
                ctrl->value = (s8)cx25840_read(client, 0x414) + 128;
                break;
@@ -1792,6 +1784,20 @@ static int cx25840_log_status(struct v4l2_subdev *sd)
        return 0;
 }
 
+static int cx25840_s_config(struct v4l2_subdev *sd, int irq, void *platform_data)
+{
+       struct cx25840_state *state = to_state(sd);
+       struct i2c_client *client = v4l2_get_subdevdata(sd);
+
+       if (platform_data) {
+               struct cx25840_platform_data *pdata = platform_data;
+
+               state->pvr150_workaround = pdata->pvr150_workaround;
+               set_input(client, state->vid_input, state->aud_input);
+       }
+       return 0;
+}
+
 static int cx23885_irq_handler(struct v4l2_subdev *sd, u32 status,
                               bool *handled)
 {
@@ -1879,6 +1885,7 @@ static int cx25840_irq_handler(struct v4l2_subdev *sd, u32 status,
 
 static const struct v4l2_subdev_core_ops cx25840_core_ops = {
        .log_status = cx25840_log_status,
+       .s_config = cx25840_s_config,
        .g_chip_ident = cx25840_g_chip_ident,
        .g_ctrl = cx25840_g_ctrl,
        .s_ctrl = cx25840_s_ctrl,
index 8f47322..8ac57a1 100644 (file)
 #include <media/v4l2-chip-ident.h>
 #include <linux/i2c.h>
 
-/* ENABLE_PVR150_WORKAROUND activates a workaround for a hardware bug that is
-   present in Hauppauge PVR-150 (and possibly PVR-500) cards that have
-   certain NTSC tuners (tveeprom tuner model numbers 85, 99 and 112). The
-   audio autodetect fails on some channels for these models and the workaround
-   is to select the audio standard explicitly. Many thanks to Hauppauge for
-   providing this information. */
-#define CX25840_CID_ENABLE_PVR150_WORKAROUND (V4L2_CID_PRIVATE_BASE+0)
-
 struct cx25840_ir_state;
 
 struct cx25840_state {
index 07c5c18..f72e9d1 100644 (file)
@@ -1269,15 +1269,8 @@ int ivtv_init_on_first_open(struct ivtv *itv)
        IVTV_DEBUG_INFO("Getting firmware version..\n");
        ivtv_firmware_versions(itv);
 
-       if (itv->card->hw_all & IVTV_HW_CX25840) {
-               struct v4l2_control ctrl;
-
+       if (itv->card->hw_all & IVTV_HW_CX25840)
                v4l2_subdev_call(itv->sd_video, core, load_fw);
-               /* CX25840_CID_ENABLE_PVR150_WORKAROUND */
-               ctrl.id = V4L2_CID_PRIVATE_BASE;
-               ctrl.value = itv->pvr150_workaround;
-               v4l2_subdev_call(itv->sd_video, core, s_ctrl, &ctrl);
-       }
 
        vf.tuner = 0;
        vf.type = V4L2_TUNER_ANALOG_TV;
index a5b92d1..d391bbd 100644 (file)
@@ -63,6 +63,7 @@
 #include "ivtv-cards.h"
 #include "ivtv-gpio.h"
 #include "ivtv-i2c.h"
+#include <media/cx25840.h>
 
 /* i2c implementation for cx23415/6 chip, ivtv project.
  * Author: Kevin Thayer (nufan_wfk at yahoo.com)
@@ -292,6 +293,12 @@ int ivtv_i2c_register(struct ivtv *itv, unsigned idx)
        if (hw == IVTV_HW_UPD64031A || hw == IVTV_HW_UPD6408X) {
                sd = v4l2_i2c_new_subdev(&itv->v4l2_dev,
                                adap, mod, type, 0, I2C_ADDRS(hw_addrs[idx]));
+       } else if (hw == IVTV_HW_CX25840) {
+               struct cx25840_platform_data pdata;
+
+               pdata.pvr150_workaround = itv->pvr150_workaround;
+               sd = v4l2_i2c_new_subdev_cfg(&itv->v4l2_dev,
+                               adap, mod, type, 0, &pdata, hw_addrs[idx], NULL);
        } else {
                sd = v4l2_i2c_new_subdev(&itv->v4l2_dev,
                                adap, mod, type, hw_addrs[idx], NULL);
index 1bba39e..46d1a14 100644 (file)
@@ -172,4 +172,16 @@ enum cx23885_io_pad {
        CX23885_PAD_IRQ_N,
        CX23885_PAD_GPIO16,
 };
+
+/* pvr150_workaround activates a workaround for a hardware bug that is
+   present in Hauppauge PVR-150 (and possibly PVR-500) cards that have
+   certain NTSC tuners (tveeprom tuner model numbers 85, 99 and 112). The
+   audio autodetect fails on some channels for these models and the workaround
+   is to select the audio standard explicitly. Many thanks to Hauppauge for
+   providing this information.
+   This platform data only needs to be supplied by the ivtv driver. */
+struct cx25840_platform_data {
+       int pvr150_workaround;
+};
+
 #endif