mirror of https://gitee.com/openkylin/linux.git
V4L/DVB: cx25840/ivtv: replace ugly priv control with s_config
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>
This commit is contained in:
parent
59b8311a9b
commit
72c851b00f
|
@ -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);
|
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||||
|
|
||||||
switch (ctrl->id) {
|
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:
|
case V4L2_CID_BRIGHTNESS:
|
||||||
if (ctrl->value < 0 || ctrl->value > 255) {
|
if (ctrl->value < 0 || ctrl->value > 255) {
|
||||||
v4l_err(client, "invalid brightness setting %d\n",
|
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);
|
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||||
|
|
||||||
switch (ctrl->id) {
|
switch (ctrl->id) {
|
||||||
case CX25840_CID_ENABLE_PVR150_WORKAROUND:
|
|
||||||
ctrl->value = state->pvr150_workaround;
|
|
||||||
break;
|
|
||||||
case V4L2_CID_BRIGHTNESS:
|
case V4L2_CID_BRIGHTNESS:
|
||||||
ctrl->value = (s8)cx25840_read(client, 0x414) + 128;
|
ctrl->value = (s8)cx25840_read(client, 0x414) + 128;
|
||||||
break;
|
break;
|
||||||
|
@ -1792,6 +1784,20 @@ static int cx25840_log_status(struct v4l2_subdev *sd)
|
||||||
return 0;
|
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,
|
static int cx23885_irq_handler(struct v4l2_subdev *sd, u32 status,
|
||||||
bool *handled)
|
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 = {
|
static const struct v4l2_subdev_core_ops cx25840_core_ops = {
|
||||||
.log_status = cx25840_log_status,
|
.log_status = cx25840_log_status,
|
||||||
|
.s_config = cx25840_s_config,
|
||||||
.g_chip_ident = cx25840_g_chip_ident,
|
.g_chip_ident = cx25840_g_chip_ident,
|
||||||
.g_ctrl = cx25840_g_ctrl,
|
.g_ctrl = cx25840_g_ctrl,
|
||||||
.s_ctrl = cx25840_s_ctrl,
|
.s_ctrl = cx25840_s_ctrl,
|
||||||
|
|
|
@ -26,14 +26,6 @@
|
||||||
#include <media/v4l2-chip-ident.h>
|
#include <media/v4l2-chip-ident.h>
|
||||||
#include <linux/i2c.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_ir_state;
|
||||||
|
|
||||||
struct cx25840_state {
|
struct cx25840_state {
|
||||||
|
|
|
@ -1269,15 +1269,8 @@ int ivtv_init_on_first_open(struct ivtv *itv)
|
||||||
IVTV_DEBUG_INFO("Getting firmware version..\n");
|
IVTV_DEBUG_INFO("Getting firmware version..\n");
|
||||||
ivtv_firmware_versions(itv);
|
ivtv_firmware_versions(itv);
|
||||||
|
|
||||||
if (itv->card->hw_all & IVTV_HW_CX25840) {
|
if (itv->card->hw_all & IVTV_HW_CX25840)
|
||||||
struct v4l2_control ctrl;
|
|
||||||
|
|
||||||
v4l2_subdev_call(itv->sd_video, core, load_fw);
|
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.tuner = 0;
|
||||||
vf.type = V4L2_TUNER_ANALOG_TV;
|
vf.type = V4L2_TUNER_ANALOG_TV;
|
||||||
|
|
|
@ -63,6 +63,7 @@
|
||||||
#include "ivtv-cards.h"
|
#include "ivtv-cards.h"
|
||||||
#include "ivtv-gpio.h"
|
#include "ivtv-gpio.h"
|
||||||
#include "ivtv-i2c.h"
|
#include "ivtv-i2c.h"
|
||||||
|
#include <media/cx25840.h>
|
||||||
|
|
||||||
/* i2c implementation for cx23415/6 chip, ivtv project.
|
/* i2c implementation for cx23415/6 chip, ivtv project.
|
||||||
* Author: Kevin Thayer (nufan_wfk at yahoo.com)
|
* 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) {
|
if (hw == IVTV_HW_UPD64031A || hw == IVTV_HW_UPD6408X) {
|
||||||
sd = v4l2_i2c_new_subdev(&itv->v4l2_dev,
|
sd = v4l2_i2c_new_subdev(&itv->v4l2_dev,
|
||||||
adap, mod, type, 0, I2C_ADDRS(hw_addrs[idx]));
|
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 {
|
} else {
|
||||||
sd = v4l2_i2c_new_subdev(&itv->v4l2_dev,
|
sd = v4l2_i2c_new_subdev(&itv->v4l2_dev,
|
||||||
adap, mod, type, hw_addrs[idx], NULL);
|
adap, mod, type, hw_addrs[idx], NULL);
|
||||||
|
|
|
@ -172,4 +172,16 @@ enum cx23885_io_pad {
|
||||||
CX23885_PAD_IRQ_N,
|
CX23885_PAD_IRQ_N,
|
||||||
CX23885_PAD_GPIO16,
|
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
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue