summaryrefslogtreecommitdiff
path: root/linux/drivers
diff options
context:
space:
mode:
authorMike Isely <isely@pobox.com>2009-03-06 21:24:24 -0600
committerMike Isely <isely@pobox.com>2009-03-06 21:24:24 -0600
commit11cad91bcc776256090cbc0c1690256e4a429976 (patch)
tree5cfb2d1baf860efda78a8ba648ecb0a7138272ea /linux/drivers
parentf46785b14c231ff3999ad3923be2d18cce941e5c (diff)
downloadmediapointer-dvb-s2-11cad91bcc776256090cbc0c1690256e4a429976.tar.gz
mediapointer-dvb-s2-11cad91bcc776256090cbc0c1690256e4a429976.tar.bz2
pvrusb2: Cause overall initialization to fail if sub-driver(s) fail
From: Mike Isely <isely@pobox.com> Priority: normal Signed-off-by: Mike Isely <isely@pobox.com>
Diffstat (limited to 'linux/drivers')
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-hdw.c32
1 files changed, 17 insertions, 15 deletions
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/linux/drivers/media/video/pvrusb2/pvrusb2-hdw.c
index ce7d272a5..75aea30c3 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-hdw.c
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-hdw.c
@@ -1991,8 +1991,8 @@ static unsigned int pvr2_copy_i2c_addr_list(
}
-static void pvr2_hdw_load_subdev(struct pvr2_hdw *hdw,
- const struct pvr2_device_client_desc *cd)
+static int pvr2_hdw_load_subdev(struct pvr2_hdw *hdw,
+ const struct pvr2_device_client_desc *cd)
{
const char *fname;
unsigned char mid;
@@ -2006,11 +2006,10 @@ static void pvr2_hdw_load_subdev(struct pvr2_hdw *hdw,
fname = (mid < ARRAY_SIZE(module_names)) ? module_names[mid] : NULL;
if (!fname) {
pvr2_trace(PVR2_TRACE_ERROR_LEGS,
- "Module ID %u for device %s is unknown"
- " (this is probably a bad thing...)",
+ "Module ID %u for device %s has no name",
mid,
hdw->hdw_desc->description);
- return;
+ return -EINVAL;
}
i2ccnt = pvr2_copy_i2c_addr_list(i2caddr, cd->i2c_address_list,
@@ -2024,11 +2023,10 @@ static void pvr2_hdw_load_subdev(struct pvr2_hdw *hdw,
if (!i2ccnt) {
pvr2_trace(PVR2_TRACE_ERROR_LEGS,
- "Module ID %u for device %s:"
- " No i2c addresses"
- " (this is probably a bad thing...)",
- mid, hdw->hdw_desc->description);
- return;
+ "Module ID %u (%s) for device %s:"
+ " No i2c addresses",
+ mid, fname, hdw->hdw_desc->description);
+ return -EINVAL;
}
/* Note how the 2nd and 3rd arguments are the same for both
@@ -2050,10 +2048,9 @@ static void pvr2_hdw_load_subdev(struct pvr2_hdw *hdw,
if (!sd) {
pvr2_trace(PVR2_TRACE_ERROR_LEGS,
- "Module ID %u for device %s failed to load"
- " (this is probably a bad thing...)",
- mid, hdw->hdw_desc->description);
- return;
+ "Module ID %u (%s) for device %s failed to load",
+ mid, fname, hdw->hdw_desc->description);
+ return -EIO;
}
/* Tag this sub-device instance with the module ID we know about.
@@ -2097,6 +2094,8 @@ static void pvr2_hdw_load_subdev(struct pvr2_hdw *hdw,
break;
default: break;
}
+
+ return 0;
}
@@ -2105,6 +2104,7 @@ static void pvr2_hdw_load_modules(struct pvr2_hdw *hdw)
unsigned int idx;
const struct pvr2_string_table *cm;
const struct pvr2_device_client_table *ct;
+ int okFl = !0;
cm = &hdw->hdw_desc->client_modules;
for (idx = 0; idx < cm->cnt; idx++) {
@@ -2113,8 +2113,9 @@ static void pvr2_hdw_load_modules(struct pvr2_hdw *hdw)
ct = &hdw->hdw_desc->client_table;
for (idx = 0; idx < ct->cnt; idx++) {
- pvr2_hdw_load_subdev(hdw,&ct->lst[idx]);
+ if (!pvr2_hdw_load_subdev(hdw, &ct->lst[idx])) okFl = 0;
}
+ if (!okFl) pvr2_hdw_render_useless(hdw);
}
@@ -2176,6 +2177,7 @@ static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
if (!pvr2_hdw_dev_ok(hdw)) return;
pvr2_hdw_load_modules(hdw);
+ if (!pvr2_hdw_dev_ok(hdw)) return;
for (idx = 0; idx < CTRLDEF_COUNT; idx++) {
cptr = hdw->controls + idx;