aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Isely <isely@pobox.com>2007-09-08 21:18:50 -0400
committerMauro Carvalho Chehab <mchehab@infradead.org>2007-10-09 21:14:34 -0400
commit1d643a372259749ce2029e386ed5760d5d7f8b89 (patch)
tree98724b47554eb67b6405d3e98418725d58a5580e
parent4db666cc3d199a8b837174bb0ad00d6b8f6115d6 (diff)
V4L/DVB (6209): pvrusb2: Better discriminate among device types
This is a bunch of cleanup in various places to improve behavior based on actual device type being driven. While this doesn't actually affect operation with existing devices, it cleans things up so that it will be easier / more deterministic when other devices are added. Ideally we should make stuff like this table-driven, but for now this is just a series of small incremental (read: safe) improvements. Signed-off-by: Mike Isely <isely@pobox.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-hdw.c82
1 files changed, 54 insertions, 28 deletions
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/drivers/media/video/pvrusb2/pvrusb2-hdw.c
index 7172f66a6a28..c8ee379159e2 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-hdw.c
+++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.c
@@ -1143,6 +1143,13 @@ static int pvr2_upload_firmware1(struct pvr2_hdw *hdw)
1143 fw_files_24xxx, ARRAY_SIZE(fw_files_24xxx) 1143 fw_files_24xxx, ARRAY_SIZE(fw_files_24xxx)
1144 }, 1144 },
1145 }; 1145 };
1146
1147 if ((hdw->hdw_type >= ARRAY_SIZE(fw_file_defs)) ||
1148 (!fw_file_defs[hdw->hdw_type].lst)) {
1149 hdw->fw1_state = FW1_STATE_OK;
1150 return 0;
1151 }
1152
1146 hdw->fw1_state = FW1_STATE_FAILED; // default result 1153 hdw->fw1_state = FW1_STATE_FAILED; // default result
1147 1154
1148 trace_firmware("pvr2_upload_firmware1"); 1155 trace_firmware("pvr2_upload_firmware1");
@@ -1224,6 +1231,11 @@ int pvr2_upload_firmware2(struct pvr2_hdw *hdw)
1224 CX2341X_FIRM_ENC_FILENAME, 1231 CX2341X_FIRM_ENC_FILENAME,
1225 }; 1232 };
1226 1233
1234 if ((hdw->hdw_type != PVR2_HDW_TYPE_29XXX) &&
1235 (hdw->hdw_type != PVR2_HDW_TYPE_24XXX)) {
1236 return 0;
1237 }
1238
1227 trace_firmware("pvr2_upload_firmware2"); 1239 trace_firmware("pvr2_upload_firmware2");
1228 1240
1229 ret = pvr2_locate_firmware(hdw,&fw_entry,"encoder", 1241 ret = pvr2_locate_firmware(hdw,&fw_entry,"encoder",
@@ -1742,29 +1754,35 @@ static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
1742 unsigned int idx; 1754 unsigned int idx;
1743 struct pvr2_ctrl *cptr; 1755 struct pvr2_ctrl *cptr;
1744 int reloadFl = 0; 1756 int reloadFl = 0;
1745 if (!reloadFl) { 1757 if ((hdw->hdw_type == PVR2_HDW_TYPE_29XXX) ||
1746 reloadFl = (hdw->usb_intf->cur_altsetting->desc.bNumEndpoints 1758 (hdw->hdw_type == PVR2_HDW_TYPE_24XXX)) {
1747 == 0); 1759 if (!reloadFl) {
1748 if (reloadFl) { 1760 reloadFl =
1749 pvr2_trace(PVR2_TRACE_INIT, 1761 (hdw->usb_intf->cur_altsetting->desc.bNumEndpoints
1750 "USB endpoint config looks strange" 1762 == 0);
1751 "; possibly firmware needs to be loaded"); 1763 if (reloadFl) {
1764 pvr2_trace(PVR2_TRACE_INIT,
1765 "USB endpoint config looks strange"
1766 "; possibly firmware needs to be"
1767 " loaded");
1768 }
1752 } 1769 }
1753 } 1770 if (!reloadFl) {
1754 if (!reloadFl) { 1771 reloadFl = !pvr2_hdw_check_firmware(hdw);
1755 reloadFl = !pvr2_hdw_check_firmware(hdw); 1772 if (reloadFl) {
1756 if (reloadFl) { 1773 pvr2_trace(PVR2_TRACE_INIT,
1757 pvr2_trace(PVR2_TRACE_INIT, 1774 "Check for FX2 firmware failed"
1758 "Check for FX2 firmware failed" 1775 "; possibly firmware needs to be"
1759 "; possibly firmware needs to be loaded"); 1776 " loaded");
1777 }
1760 } 1778 }
1761 } 1779 if (reloadFl) {
1762 if (reloadFl) { 1780 if (pvr2_upload_firmware1(hdw) != 0) {
1763 if (pvr2_upload_firmware1(hdw) != 0) { 1781 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1764 pvr2_trace(PVR2_TRACE_ERROR_LEGS, 1782 "Failure uploading firmware1");
1765 "Failure uploading firmware1"); 1783 }
1784 return;
1766 } 1785 }
1767 return;
1768 } 1786 }
1769 hdw->fw1_state = FW1_STATE_OK; 1787 hdw->fw1_state = FW1_STATE_OK;
1770 1788
@@ -1773,17 +1791,25 @@ static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
1773 } 1791 }
1774 if (!pvr2_hdw_dev_ok(hdw)) return; 1792 if (!pvr2_hdw_dev_ok(hdw)) return;
1775 1793
1776 for (idx = 0; idx < pvr2_client_lists[hdw->hdw_type].cnt; idx++) { 1794 if (hdw->hdw_type < ARRAY_SIZE(pvr2_client_lists)) {
1777 request_module(pvr2_client_lists[hdw->hdw_type].lst[idx]); 1795 for (idx = 0;
1796 idx < pvr2_client_lists[hdw->hdw_type].cnt;
1797 idx++) {
1798 request_module(
1799 pvr2_client_lists[hdw->hdw_type].lst[idx]);
1800 }
1778 } 1801 }
1779 1802
1780 pvr2_hdw_cmd_powerup(hdw); 1803 if ((hdw->hdw_type == PVR2_HDW_TYPE_29XXX) ||
1781 if (!pvr2_hdw_dev_ok(hdw)) return; 1804 (hdw->hdw_type == PVR2_HDW_TYPE_24XXX)) {
1805 pvr2_hdw_cmd_powerup(hdw);
1806 if (!pvr2_hdw_dev_ok(hdw)) return;
1782 1807
1783 if (pvr2_upload_firmware2(hdw)){ 1808 if (pvr2_upload_firmware2(hdw)){
1784 pvr2_trace(PVR2_TRACE_ERROR_LEGS,"device unstable!!"); 1809 pvr2_trace(PVR2_TRACE_ERROR_LEGS,"device unstable!!");
1785 pvr2_hdw_render_useless(hdw); 1810 pvr2_hdw_render_useless(hdw);
1786 return; 1811 return;
1812 }
1787 } 1813 }
1788 1814
1789 // This step MUST happen after the earlier powerup step. 1815 // This step MUST happen after the earlier powerup step.