Commit d4e7ee36 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

V4L/DVB (5411): Use v4l_printk_ioctl for debug

Using v4l_printk_ioctl saves a lot of code duplication. Also moved a few
ioctl cases to another function, improving the ioctl grouping.
Signed-off-by: default avatarHans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent d46c17d7
...@@ -632,7 +632,7 @@ static int ivtv_try_or_set_fmt(struct ivtv *itv, int streamtype, ...@@ -632,7 +632,7 @@ static int ivtv_try_or_set_fmt(struct ivtv *itv, int streamtype,
return 0; return 0;
} }
static int ivtv_internal_ioctls(struct file *filp, unsigned int cmd, void *arg) static int ivtv_debug_ioctls(struct file *filp, unsigned int cmd, void *arg)
{ {
struct ivtv_open_id *id = (struct ivtv_open_id *)filp->private_data; struct ivtv_open_id *id = (struct ivtv_open_id *)filp->private_data;
struct ivtv *itv = id->itv; struct ivtv *itv = id->itv;
...@@ -641,7 +641,6 @@ static int ivtv_internal_ioctls(struct file *filp, unsigned int cmd, void *arg) ...@@ -641,7 +641,6 @@ static int ivtv_internal_ioctls(struct file *filp, unsigned int cmd, void *arg)
switch (cmd) { switch (cmd) {
/* ioctls to allow direct access to the encoder registers for testing */ /* ioctls to allow direct access to the encoder registers for testing */
case VIDIOC_DBG_G_REGISTER: case VIDIOC_DBG_G_REGISTER:
IVTV_DEBUG_IOCTL("VIDIOC_DBG_G_REGISTER\n");
if (v4l2_chip_match_host(reg->match_type, reg->match_chip)) if (v4l2_chip_match_host(reg->match_type, reg->match_chip))
return ivtv_itvc(itv, cmd, arg); return ivtv_itvc(itv, cmd, arg);
if (reg->match_type == V4L2_CHIP_MATCH_I2C_DRIVER) if (reg->match_type == V4L2_CHIP_MATCH_I2C_DRIVER)
...@@ -649,7 +648,6 @@ static int ivtv_internal_ioctls(struct file *filp, unsigned int cmd, void *arg) ...@@ -649,7 +648,6 @@ static int ivtv_internal_ioctls(struct file *filp, unsigned int cmd, void *arg)
return ivtv_call_i2c_client(itv, reg->match_chip, cmd, arg); return ivtv_call_i2c_client(itv, reg->match_chip, cmd, arg);
case VIDIOC_DBG_S_REGISTER: case VIDIOC_DBG_S_REGISTER:
IVTV_DEBUG_IOCTL("VIDIOC_DBG_S_REGISTER\n");
if (v4l2_chip_match_host(reg->match_type, reg->match_chip)) if (v4l2_chip_match_host(reg->match_type, reg->match_chip))
return ivtv_itvc(itv, cmd, arg); return ivtv_itvc(itv, cmd, arg);
if (reg->match_type == V4L2_CHIP_MATCH_I2C_DRIVER) if (reg->match_type == V4L2_CHIP_MATCH_I2C_DRIVER)
...@@ -659,7 +657,6 @@ static int ivtv_internal_ioctls(struct file *filp, unsigned int cmd, void *arg) ...@@ -659,7 +657,6 @@ static int ivtv_internal_ioctls(struct file *filp, unsigned int cmd, void *arg)
case VIDIOC_G_CHIP_IDENT: { case VIDIOC_G_CHIP_IDENT: {
struct v4l2_chip_ident *chip = arg; struct v4l2_chip_ident *chip = arg;
IVTV_DEBUG_IOCTL("VIDIOC_G_CHIP_IDENT\n");
chip->ident = V4L2_IDENT_NONE; chip->ident = V4L2_IDENT_NONE;
chip->revision = 0; chip->revision = 0;
if (reg->match_type == V4L2_CHIP_MATCH_HOST) { if (reg->match_type == V4L2_CHIP_MATCH_HOST) {
...@@ -680,13 +677,11 @@ static int ivtv_internal_ioctls(struct file *filp, unsigned int cmd, void *arg) ...@@ -680,13 +677,11 @@ static int ivtv_internal_ioctls(struct file *filp, unsigned int cmd, void *arg)
case VIDIOC_INT_S_AUDIO_ROUTING: { case VIDIOC_INT_S_AUDIO_ROUTING: {
struct v4l2_routing *route = arg; struct v4l2_routing *route = arg;
IVTV_DEBUG_IOCTL("VIDIOC_INT_S_AUDIO_ROUTING\n");
ivtv_audio_set_route(itv, route); ivtv_audio_set_route(itv, route);
break; break;
} }
case VIDIOC_INT_RESET: case VIDIOC_INT_RESET:
IVTV_DEBUG_IOCTL("VIDIOC_INT_RESET\n");
ivtv_reset_ir_gpio(itv); ivtv_reset_ir_gpio(itv);
break; break;
...@@ -721,8 +716,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void ...@@ -721,8 +716,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
case VIDIOC_QUERYCAP:{ case VIDIOC_QUERYCAP:{
struct v4l2_capability *vcap = arg; struct v4l2_capability *vcap = arg;
IVTV_DEBUG_IOCTL("VIDIOC_QUERYCAP\n");
memset(vcap, 0, sizeof(*vcap)); memset(vcap, 0, sizeof(*vcap));
strcpy(vcap->driver, IVTV_DRIVER_NAME); /* driver name */ strcpy(vcap->driver, IVTV_DRIVER_NAME); /* driver name */
strcpy(vcap->card, itv->card_name); /* card type */ strcpy(vcap->card, itv->card_name); /* card type */
...@@ -739,15 +732,12 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void ...@@ -739,15 +732,12 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
case VIDIOC_ENUMAUDIO:{ case VIDIOC_ENUMAUDIO:{
struct v4l2_audio *vin = arg; struct v4l2_audio *vin = arg;
IVTV_DEBUG_IOCTL("VIDIOC_ENUMAUDIO\n");
return ivtv_get_audio_input(itv, vin->index, vin); return ivtv_get_audio_input(itv, vin->index, vin);
} }
case VIDIOC_G_AUDIO:{ case VIDIOC_G_AUDIO:{
struct v4l2_audio *vin = arg; struct v4l2_audio *vin = arg;
IVTV_DEBUG_IOCTL("VIDIOC_G_AUDIO\n");
vin->index = itv->audio_input; vin->index = itv->audio_input;
return ivtv_get_audio_input(itv, vin->index, vin); return ivtv_get_audio_input(itv, vin->index, vin);
} }
...@@ -755,8 +745,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void ...@@ -755,8 +745,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
case VIDIOC_S_AUDIO:{ case VIDIOC_S_AUDIO:{
struct v4l2_audio *vout = arg; struct v4l2_audio *vout = arg;
IVTV_DEBUG_IOCTL("VIDIOC_S_AUDIO\n");
if (vout->index >= itv->nof_audio_inputs) if (vout->index >= itv->nof_audio_inputs)
return -EINVAL; return -EINVAL;
itv->audio_input = vout->index; itv->audio_input = vout->index;
...@@ -767,8 +755,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void ...@@ -767,8 +755,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
case VIDIOC_ENUMAUDOUT:{ case VIDIOC_ENUMAUDOUT:{
struct v4l2_audioout *vin = arg; struct v4l2_audioout *vin = arg;
IVTV_DEBUG_IOCTL("VIDIOC_ENUMAUDOUT\n");
/* set it to defaults from our table */ /* set it to defaults from our table */
return ivtv_get_audio_output(itv, vin->index, vin); return ivtv_get_audio_output(itv, vin->index, vin);
} }
...@@ -776,7 +762,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void ...@@ -776,7 +762,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
case VIDIOC_G_AUDOUT:{ case VIDIOC_G_AUDOUT:{
struct v4l2_audioout *vin = arg; struct v4l2_audioout *vin = arg;
IVTV_DEBUG_IOCTL("VIDIOC_G_AUDOUT\n");
vin->index = 0; vin->index = 0;
return ivtv_get_audio_output(itv, vin->index, vin); return ivtv_get_audio_output(itv, vin->index, vin);
} }
...@@ -784,16 +769,12 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void ...@@ -784,16 +769,12 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
case VIDIOC_S_AUDOUT:{ case VIDIOC_S_AUDOUT:{
struct v4l2_audioout *vout = arg; struct v4l2_audioout *vout = arg;
IVTV_DEBUG_IOCTL("VIDIOC_S_AUDOUT\n");
return ivtv_get_audio_output(itv, vout->index, vout); return ivtv_get_audio_output(itv, vout->index, vout);
} }
case VIDIOC_ENUMINPUT:{ case VIDIOC_ENUMINPUT:{
struct v4l2_input *vin = arg; struct v4l2_input *vin = arg;
IVTV_DEBUG_IOCTL("VIDIOC_ENUMINPUT\n");
/* set it to defaults from our table */ /* set it to defaults from our table */
return ivtv_get_input(itv, vin->index, vin); return ivtv_get_input(itv, vin->index, vin);
} }
...@@ -801,8 +782,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void ...@@ -801,8 +782,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
case VIDIOC_ENUMOUTPUT:{ case VIDIOC_ENUMOUTPUT:{
struct v4l2_output *vout = arg; struct v4l2_output *vout = arg;
IVTV_DEBUG_IOCTL("VIDIOC_ENUMOUTPUT\n");
return ivtv_get_output(itv, vout->index, vout); return ivtv_get_output(itv, vout->index, vout);
} }
...@@ -810,11 +789,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void ...@@ -810,11 +789,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
case VIDIOC_S_FMT: { case VIDIOC_S_FMT: {
struct v4l2_format *fmt = arg; struct v4l2_format *fmt = arg;
if (cmd == VIDIOC_S_FMT) {
IVTV_DEBUG_IOCTL("VIDIOC_S_FMT\n");
} else {
IVTV_DEBUG_IOCTL("VIDIOC_TRY_FMT\n");
}
return ivtv_try_or_set_fmt(itv, id->type, fmt, cmd == VIDIOC_S_FMT); return ivtv_try_or_set_fmt(itv, id->type, fmt, cmd == VIDIOC_S_FMT);
} }
...@@ -822,7 +796,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void ...@@ -822,7 +796,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
struct v4l2_format *fmt = arg; struct v4l2_format *fmt = arg;
int type = fmt->type; int type = fmt->type;
IVTV_DEBUG_IOCTL("VIDIOC_G_FMT\n");
memset(fmt, 0, sizeof(*fmt)); memset(fmt, 0, sizeof(*fmt));
fmt->type = type; fmt->type = type;
return ivtv_get_fmt(itv, id->type, fmt); return ivtv_get_fmt(itv, id->type, fmt);
...@@ -831,7 +804,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void ...@@ -831,7 +804,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
case VIDIOC_S_CROP: { case VIDIOC_S_CROP: {
struct v4l2_crop *crop = arg; struct v4l2_crop *crop = arg;
IVTV_DEBUG_IOCTL("VIDIOC_S_CROP\n");
if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
return -EINVAL; return -EINVAL;
return itv->video_dec_func(itv, VIDIOC_S_CROP, arg); return itv->video_dec_func(itv, VIDIOC_S_CROP, arg);
...@@ -840,7 +812,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void ...@@ -840,7 +812,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
case VIDIOC_G_CROP: { case VIDIOC_G_CROP: {
struct v4l2_crop *crop = arg; struct v4l2_crop *crop = arg;
IVTV_DEBUG_IOCTL("VIDIOC_G_CROP\n");
if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
return -EINVAL; return -EINVAL;
return itv->video_dec_func(itv, VIDIOC_G_CROP, arg); return itv->video_dec_func(itv, VIDIOC_G_CROP, arg);
...@@ -878,8 +849,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void ...@@ -878,8 +849,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
} }
case VIDIOC_G_INPUT:{ case VIDIOC_G_INPUT:{
IVTV_DEBUG_IOCTL("VIDIOC_G_INPUT\n");
*(int *)arg = itv->active_input; *(int *)arg = itv->active_input;
break; break;
} }
...@@ -887,8 +856,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void ...@@ -887,8 +856,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
case VIDIOC_S_INPUT:{ case VIDIOC_S_INPUT:{
int inp = *(int *)arg; int inp = *(int *)arg;
IVTV_DEBUG_IOCTL("VIDIOC_S_INPUT\n");
if (inp < 0 || inp >= itv->nof_inputs) if (inp < 0 || inp >= itv->nof_inputs)
return -EINVAL; return -EINVAL;
...@@ -914,8 +881,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void ...@@ -914,8 +881,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
} }
case VIDIOC_G_OUTPUT:{ case VIDIOC_G_OUTPUT:{
IVTV_DEBUG_IOCTL("VIDIOC_G_OUTPUT\n");
if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
return -EINVAL; return -EINVAL;
*(int *)arg = itv->active_output; *(int *)arg = itv->active_output;
...@@ -926,8 +891,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void ...@@ -926,8 +891,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
int outp = *(int *)arg; int outp = *(int *)arg;
struct v4l2_routing route; struct v4l2_routing route;
IVTV_DEBUG_IOCTL("VIDIOC_S_OUTPUT\n");
if (outp >= itv->card->nof_outputs) if (outp >= itv->card->nof_outputs)
return -EINVAL; return -EINVAL;
...@@ -948,8 +911,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void ...@@ -948,8 +911,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
case VIDIOC_G_FREQUENCY:{ case VIDIOC_G_FREQUENCY:{
struct v4l2_frequency *vf = arg; struct v4l2_frequency *vf = arg;
IVTV_DEBUG_IOCTL("VIDIOC_G_FREQUENCY\n");
if (vf->tuner != 0) if (vf->tuner != 0)
return -EINVAL; return -EINVAL;
ivtv_call_i2c_clients(itv, cmd, arg); ivtv_call_i2c_clients(itv, cmd, arg);
...@@ -959,8 +920,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void ...@@ -959,8 +920,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
case VIDIOC_S_FREQUENCY:{ case VIDIOC_S_FREQUENCY:{
struct v4l2_frequency vf = *(struct v4l2_frequency *)arg; struct v4l2_frequency vf = *(struct v4l2_frequency *)arg;
IVTV_DEBUG_IOCTL("VIDIOC_S_FREQUENCY\n");
if (vf.tuner != 0) if (vf.tuner != 0)
return -EINVAL; return -EINVAL;
...@@ -975,8 +934,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void ...@@ -975,8 +934,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
struct v4l2_standard *vs = arg; struct v4l2_standard *vs = arg;
int idx = vs->index; int idx = vs->index;
IVTV_DEBUG_IOCTL("VIDIOC_ENUMSTD\n");
if (idx < 0 || idx >= ARRAY_SIZE(enum_stds)) if (idx < 0 || idx >= ARRAY_SIZE(enum_stds))
return -EINVAL; return -EINVAL;
...@@ -989,7 +946,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void ...@@ -989,7 +946,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
} }
case VIDIOC_G_STD:{ case VIDIOC_G_STD:{
IVTV_DEBUG_IOCTL("VIDIOC_G_STD\n");
*(v4l2_std_id *) arg = itv->std; *(v4l2_std_id *) arg = itv->std;
break; break;
} }
...@@ -997,8 +953,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void ...@@ -997,8 +953,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
case VIDIOC_S_STD: { case VIDIOC_S_STD: {
v4l2_std_id std = *(v4l2_std_id *) arg; v4l2_std_id std = *(v4l2_std_id *) arg;
IVTV_DEBUG_IOCTL("VIDIOC_S_STD\n");
if ((std & V4L2_STD_ALL) == 0) if ((std & V4L2_STD_ALL) == 0)
return -EINVAL; return -EINVAL;
...@@ -1049,8 +1003,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void ...@@ -1049,8 +1003,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
case VIDIOC_S_TUNER: { /* Setting tuner can only set audio mode */ case VIDIOC_S_TUNER: { /* Setting tuner can only set audio mode */
struct v4l2_tuner *vt = arg; struct v4l2_tuner *vt = arg;
IVTV_DEBUG_IOCTL("VIDIOC_S_TUNER\n");
if (vt->index != 0) if (vt->index != 0)
return -EINVAL; return -EINVAL;
...@@ -1061,8 +1013,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void ...@@ -1061,8 +1013,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
case VIDIOC_G_TUNER: { case VIDIOC_G_TUNER: {
struct v4l2_tuner *vt = arg; struct v4l2_tuner *vt = arg;
IVTV_DEBUG_IOCTL("VIDIOC_G_TUNER\n");
if (vt->index != 0) if (vt->index != 0)
return -EINVAL; return -EINVAL;
...@@ -1085,7 +1035,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void ...@@ -1085,7 +1035,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
int f, l; int f, l;
enum v4l2_buf_type type = cap->type; enum v4l2_buf_type type = cap->type;
IVTV_DEBUG_IOCTL("VIDIOC_G_SLICED_VBI_CAP\n");
memset(cap, 0, sizeof(*cap)); memset(cap, 0, sizeof(*cap));
cap->type = type; cap->type = type;
if (type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE) { if (type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE) {
...@@ -1113,6 +1062,89 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void ...@@ -1113,6 +1062,89 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
return -EINVAL; return -EINVAL;
} }
case VIDIOC_G_ENC_INDEX: {
struct v4l2_enc_idx *idx = arg;
int i;
idx->entries = (itv->pgm_info_write_idx + IVTV_MAX_PGM_INDEX - itv->pgm_info_read_idx) %
IVTV_MAX_PGM_INDEX;
if (idx->entries > V4L2_ENC_IDX_ENTRIES)
idx->entries = V4L2_ENC_IDX_ENTRIES;
for (i = 0; i < idx->entries; i++) {
idx->entry[i] = itv->pgm_info[(itv->pgm_info_read_idx + i) % IVTV_MAX_PGM_INDEX];
}
itv->pgm_info_read_idx = (itv->pgm_info_read_idx + idx->entries) % IVTV_MAX_PGM_INDEX;
break;
}
case VIDIOC_ENCODER_CMD:
case VIDIOC_TRY_ENCODER_CMD: {
struct v4l2_encoder_cmd *enc = arg;
int try = cmd == VIDIOC_TRY_ENCODER_CMD;
switch (enc->cmd) {
case V4L2_ENC_CMD_START:
return ivtv_start_capture(id);
case V4L2_ENC_CMD_STOP:
ivtv_stop_capture(id, enc->flags & V4L2_ENC_CMD_STOP_AT_GOP_END);
return 0;
case V4L2_ENC_CMD_PAUSE:
if (!atomic_read(&itv->capturing))
return -EPERM;
if (test_and_set_bit(IVTV_F_I_ENC_PAUSED, &itv->i_flags))
return 0;
ivtv_mute(itv);
ivtv_vapi(itv, CX2341X_ENC_PAUSE_ENCODER, 1, 0);
break;
case V4L2_ENC_CMD_RESUME:
if (!atomic_read(&itv->capturing))
return -EPERM;
if (!test_and_clear_bit(IVTV_F_I_ENC_PAUSED, &itv->i_flags))
return 0;
ivtv_vapi(itv, CX2341X_ENC_PAUSE_ENCODER, 1, 1);
ivtv_unmute(itv);
break;
}
break;
}
case VIDIOC_G_FBUF: {
struct v4l2_framebuffer *fb = arg;
memset(fb, 0, sizeof(*fb));
if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
break;
fb->capability = V4L2_FBUF_CAP_EXTERNOVERLAY | V4L2_FBUF_CAP_CHROMAKEY |
V4L2_FBUF_CAP_LOCAL_ALPHA | V4L2_FBUF_CAP_GLOBAL_ALPHA;
fb->fmt.pixelformat = itv->osd_pixelformat;
fb->fmt.width = itv->osd_rect.width;
fb->fmt.height = itv->osd_rect.height;
fb->fmt.left = itv->osd_rect.left;
fb->fmt.top = itv->osd_rect.top;
fb->base = (void *)itv->osd_video_pbase;
if (itv->osd_global_alpha_state)
fb->flags |= V4L2_FBUF_FLAG_GLOBAL_ALPHA;
if (itv->osd_local_alpha_state)
fb->flags |= V4L2_FBUF_FLAG_LOCAL_ALPHA;
if (itv->osd_color_key_state)
fb->flags |= V4L2_FBUF_FLAG_CHROMAKEY;
break;
}
case VIDIOC_S_FBUF: {
struct v4l2_framebuffer *fb = arg;
if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
break;
itv->osd_global_alpha_state = (fb->flags & V4L2_FBUF_FLAG_GLOBAL_ALPHA) != 0;
itv->osd_local_alpha_state = (fb->flags & V4L2_FBUF_FLAG_LOCAL_ALPHA) != 0;
itv->osd_color_key_state = (fb->flags & V4L2_FBUF_FLAG_CHROMAKEY) != 0;
break;
}
case VIDIOC_LOG_STATUS: case VIDIOC_LOG_STATUS:
{ {
int has_output = itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT; int has_output = itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT;
...@@ -1175,7 +1207,7 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void ...@@ -1175,7 +1207,7 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
return 0; return 0;
} }
static int ivtv_ivtv_ioctls(struct file *filp, unsigned int cmd, void *arg) static int ivtv_decoder_ioctls(struct file *filp, unsigned int cmd, void *arg)
{ {
struct ivtv_open_id *id = (struct ivtv_open_id *)filp->private_data; struct ivtv_open_id *id = (struct ivtv_open_id *)filp->private_data;
struct ivtv *itv = id->itv; struct ivtv *itv = id->itv;
...@@ -1355,96 +1387,6 @@ static int ivtv_ivtv_ioctls(struct file *filp, unsigned int cmd, void *arg) ...@@ -1355,96 +1387,6 @@ static int ivtv_ivtv_ioctls(struct file *filp, unsigned int cmd, void *arg)
break; break;
} }
case VIDIOC_G_ENC_INDEX: {
struct v4l2_enc_idx *idx = arg;
int i;
IVTV_DEBUG_IOCTL("VIDIOC_G_ENC_INDEX\n");
idx->entries = (itv->pgm_info_write_idx + IVTV_MAX_PGM_INDEX - itv->pgm_info_read_idx) %
IVTV_MAX_PGM_INDEX;
if (idx->entries > V4L2_ENC_IDX_ENTRIES)
idx->entries = V4L2_ENC_IDX_ENTRIES;
for (i = 0; i < idx->entries; i++) {
idx->entry[i] = itv->pgm_info[(itv->pgm_info_read_idx + i) % IVTV_MAX_PGM_INDEX];
}
itv->pgm_info_read_idx = (itv->pgm_info_read_idx + idx->entries) % IVTV_MAX_PGM_INDEX;
break;
}
case VIDIOC_ENCODER_CMD:
case VIDIOC_TRY_ENCODER_CMD: {
struct v4l2_encoder_cmd *enc = arg;
int try = cmd == VIDIOC_TRY_ENCODER_CMD;
if (try)
IVTV_DEBUG_IOCTL("VIDIOC_TRY_ENCODER_CMD\n");
else
IVTV_DEBUG_IOCTL("VIDIOC_ENCODER_CMD\n");
switch (enc->cmd) {
case V4L2_ENC_CMD_START:
return ivtv_start_capture(id);
case V4L2_ENC_CMD_STOP:
ivtv_stop_capture(id, enc->flags & V4L2_ENC_CMD_STOP_AT_GOP_END);
return 0;
case V4L2_ENC_CMD_PAUSE:
if (!atomic_read(&itv->capturing))
return -EPERM;
if (test_and_set_bit(IVTV_F_I_ENC_PAUSED, &itv->i_flags))
return 0;
ivtv_mute(itv);
ivtv_vapi(itv, CX2341X_ENC_PAUSE_ENCODER, 1, 0);
break;
case V4L2_ENC_CMD_RESUME:
if (!atomic_read(&itv->capturing))
return -EPERM;
if (!test_and_clear_bit(IVTV_F_I_ENC_PAUSED, &itv->i_flags))
return 0;
ivtv_vapi(itv, CX2341X_ENC_PAUSE_ENCODER, 1, 1);
ivtv_unmute(itv);
break;
}
break;
}
case VIDIOC_G_FBUF: {
struct v4l2_framebuffer *fb = arg;
IVTV_DEBUG_IOCTL("VIDIOC_G_FBUF\n");
memset(fb, 0, sizeof(*fb));
if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
break;
fb->capability = V4L2_FBUF_CAP_EXTERNOVERLAY | V4L2_FBUF_CAP_CHROMAKEY |
V4L2_FBUF_CAP_LOCAL_ALPHA | V4L2_FBUF_CAP_GLOBAL_ALPHA;
fb->fmt.pixelformat = itv->osd_pixelformat;
fb->fmt.width = itv->osd_rect.width;
fb->fmt.height = itv->osd_rect.height;
fb->fmt.left = itv->osd_rect.left;
fb->fmt.top = itv->osd_rect.top;
fb->base = (void *)itv->osd_video_pbase;
if (itv->osd_global_alpha_state)
fb->flags |= V4L2_FBUF_FLAG_GLOBAL_ALPHA;
if (itv->osd_local_alpha_state)
fb->flags |= V4L2_FBUF_FLAG_LOCAL_ALPHA;
if (itv->osd_color_key_state)
fb->flags |= V4L2_FBUF_FLAG_CHROMAKEY;
break;
}
case VIDIOC_S_FBUF: {
struct v4l2_framebuffer *fb = arg;
IVTV_DEBUG_IOCTL("VIDIOC_S_FBUF\n");
if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
break;
itv->osd_global_alpha_state = (fb->flags & V4L2_FBUF_FLAG_GLOBAL_ALPHA) != 0;
itv->osd_local_alpha_state = (fb->flags & V4L2_FBUF_FLAG_LOCAL_ALPHA) != 0;
itv->osd_color_key_state = (fb->flags & V4L2_FBUF_FLAG_CHROMAKEY) != 0;
break;
}
default: default:
return -EINVAL; return -EINVAL;
} }
...@@ -1458,8 +1400,6 @@ static int ivtv_v4l2_do_ioctl(struct inode *inode, struct file *filp, ...@@ -1458,8 +1400,6 @@ static int ivtv_v4l2_do_ioctl(struct inode *inode, struct file *filp,
struct ivtv *itv = id->itv; struct ivtv *itv = id->itv;
int ret; int ret;
IVTV_DEBUG_IOCTL("v4l2 ioctl 0x%08x\n", cmd);
/* check priority */ /* check priority */
switch (cmd) { switch (cmd) {
case VIDIOC_S_CTRL: case VIDIOC_S_CTRL:
...@@ -1485,7 +1425,11 @@ static int ivtv_v4l2_do_ioctl(struct inode *inode, struct file *filp, ...@@ -1485,7 +1425,11 @@ static int ivtv_v4l2_do_ioctl(struct inode *inode, struct file *filp,
case VIDIOC_G_CHIP_IDENT: case VIDIOC_G_CHIP_IDENT:
case VIDIOC_INT_S_AUDIO_ROUTING: case VIDIOC_INT_S_AUDIO_ROUTING:
case VIDIOC_INT_RESET: case VIDIOC_INT_RESET:
return ivtv_internal_ioctls(filp, cmd, arg); if (ivtv_debug & IVTV_DBGFLG_IOCTL) {
printk(KERN_INFO "ivtv%d ioctl: ", itv->num);
v4l_printk_ioctl(cmd);
}
return ivtv_debug_ioctls(filp, cmd, arg);
case VIDIOC_G_PRIORITY: case VIDIOC_G_PRIORITY:
case VIDIOC_S_PRIORITY: case VIDIOC_S_PRIORITY:
...@@ -1517,6 +1461,15 @@ static int ivtv_v4l2_do_ioctl(struct inode *inode, struct file *filp, ...@@ -1517,6 +1461,15 @@ static int ivtv_v4l2_do_ioctl(struct inode *inode, struct file *filp,
case VIDIOC_G_AUDOUT: case VIDIOC_G_AUDOUT:
case VIDIOC_G_SLICED_VBI_CAP: case VIDIOC_G_SLICED_VBI_CAP:
case VIDIOC_LOG_STATUS: case VIDIOC_LOG_STATUS:
case VIDIOC_G_ENC_INDEX:
case VIDIOC_ENCODER_CMD:
case VIDIOC_TRY_ENCODER_CMD:
case VIDIOC_G_FBUF:
case VIDIOC_S_FBUF:
if (ivtv_debug & IVTV_DBGFLG_IOCTL) {
printk(KERN_INFO "ivtv%d ioctl: ", itv->num);
v4l_printk_ioctl(cmd);
}
return ivtv_v4l2_ioctls(itv, filp, cmd, arg); return ivtv_v4l2_ioctls(itv, filp, cmd, arg);
case VIDIOC_QUERYMENU: case VIDIOC_QUERYMENU:
...@@ -1526,6 +1479,10 @@ static int ivtv_v4l2_do_ioctl(struct inode *inode, struct file *filp, ...@@ -1526,6 +1479,10 @@ static int ivtv_v4l2_do_ioctl(struct inode *inode, struct file *filp,
case VIDIOC_S_EXT_CTRLS: case VIDIOC_S_EXT_CTRLS:
case VIDIOC_G_EXT_CTRLS: case VIDIOC_G_EXT_CTRLS:
case VIDIOC_TRY_EXT_CTRLS: case VIDIOC_TRY_EXT_CTRLS:
if (ivtv_debug & IVTV_DBGFLG_IOCTL) {
printk(KERN_INFO "ivtv%d ioctl: ", itv->num);
v4l_printk_ioctl(cmd);
}
return ivtv_control_ioctls(itv, cmd, arg); return ivtv_control_ioctls(itv, cmd, arg);
case IVTV_IOC_DMA_FRAME: case IVTV_IOC_DMA_FRAME:
...@@ -1538,12 +1495,7 @@ static int ivtv_v4l2_do_ioctl(struct inode *inode, struct file *filp, ...@@ -1538,12 +1495,7 @@ static int ivtv_v4l2_do_ioctl(struct inode *inode, struct file *filp,
case VIDEO_CONTINUE: case VIDEO_CONTINUE:
case VIDEO_COMMAND: case VIDEO_COMMAND:
case VIDEO_TRY_COMMAND: case VIDEO_TRY_COMMAND:
case VIDIOC_G_ENC_INDEX: return ivtv_decoder_ioctls(filp, cmd, arg);
case VIDIOC_ENCODER_CMD:
case VIDIOC_TRY_ENCODER_CMD:
case VIDIOC_G_FBUF:
case VIDIOC_S_FBUF:
return ivtv_ivtv_ioctls(filp, cmd, arg);
case 0x00005401: /* Handle isatty() calls */ case 0x00005401: /* Handle isatty() calls */
return -EINVAL; return -EINVAL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment