Skip to content

Commit

Permalink
V4L/DVB (9299): cx18: Don't mask many real init error codes by mappin…
Browse files Browse the repository at this point in the history
…g them to ENOMEM

Changes to let error return codes bubble up to the user visible
error message on card initialization.  A number of them were being remapped to
ENOMEM when no memory or array resource shortage existed.  That hampered
diagnosis of user trouble reports.

Signed-off-by: Andy Walls <awalls@radix.net>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
  • Loading branch information
Andy Walls authored and Mauro Carvalho Chehab committed Oct 21, 2008
1 parent 0686971 commit 9b4a7c8
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 15 deletions.
3 changes: 2 additions & 1 deletion drivers/media/video/cx18/cx18-driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -699,7 +699,8 @@ static int __devinit cx18_probe(struct pci_dev *dev,

/* active i2c */
CX18_DEBUG_INFO("activating i2c...\n");
if (init_cx18_i2c(cx)) {
retval = init_cx18_i2c(cx);
if (retval) {
CX18_ERR("Could not initialize i2c\n");
goto free_map;
}
Expand Down
36 changes: 22 additions & 14 deletions drivers/media/video/cx18/cx18-streams.c
Original file line number Diff line number Diff line change
Expand Up @@ -200,31 +200,33 @@ static int cx18_prep_dev(struct cx18 *cx, int type)
/* Initialize v4l2 variables and register v4l2 devices */
int cx18_streams_setup(struct cx18 *cx)
{
int type;
int type, ret;

/* Setup V4L2 Devices */
for (type = 0; type < CX18_MAX_STREAMS; type++) {
/* Prepare device */
if (cx18_prep_dev(cx, type))
ret = cx18_prep_dev(cx, type);
if (ret < 0)
break;

/* Allocate Stream */
if (cx18_stream_alloc(&cx->streams[type]))
ret = cx18_stream_alloc(&cx->streams[type]);
if (ret < 0)
break;
}
if (type == CX18_MAX_STREAMS)
return 0;

/* One or more streams could not be initialized. Clean 'em all up. */
cx18_streams_cleanup(cx, 0);
return -ENOMEM;
return ret;
}

static int cx18_reg_dev(struct cx18 *cx, int type)
{
struct cx18_stream *s = &cx->streams[type];
int vfl_type = cx18_stream_info[type].vfl_type;
int num;
int num, ret;

/* TODO: Shouldn't this be a VFL_TYPE_TRANSPORT or something?
* We need a VFL_TYPE_TS defined.
Expand All @@ -233,9 +235,10 @@ static int cx18_reg_dev(struct cx18 *cx, int type)
/* just return if no DVB is supported */
if ((cx->card->hw_all & CX18_HW_DVB) == 0)
return 0;
if (cx18_dvb_register(s) < 0) {
ret = cx18_dvb_register(s);
if (ret < 0) {
CX18_ERR("DVB failed to register\n");
return -EINVAL;
return ret;
}
}

Expand All @@ -252,12 +255,13 @@ static int cx18_reg_dev(struct cx18 *cx, int type)
}

/* Register device. First try the desired minor, then any free one. */
if (video_register_device(s->v4l2dev, vfl_type, num)) {
ret = video_register_device(s->v4l2dev, vfl_type, num);
if (ret < 0) {
CX18_ERR("Couldn't register v4l2 device for %s kernel number %d\n",
s->name, num);
video_device_release(s->v4l2dev);
s->v4l2dev = NULL;
return -ENOMEM;
return ret;
}
num = s->v4l2dev->num;

Expand Down Expand Up @@ -290,18 +294,22 @@ static int cx18_reg_dev(struct cx18 *cx, int type)
int cx18_streams_register(struct cx18 *cx)
{
int type;
int err = 0;
int err;
int ret = 0;

/* Register V4L2 devices */
for (type = 0; type < CX18_MAX_STREAMS; type++)
err |= cx18_reg_dev(cx, type);
for (type = 0; type < CX18_MAX_STREAMS; type++) {
err = cx18_reg_dev(cx, type);
if (err && ret == 0)
ret = err;
}

if (err == 0)
if (ret == 0)
return 0;

/* One or more streams could not be initialized. Clean 'em all up. */
cx18_streams_cleanup(cx, 1);
return -ENOMEM;
return ret;
}

/* Unregister v4l2 devices */
Expand Down

0 comments on commit 9b4a7c8

Please sign in to comment.