aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/cx18/cx18-firmware.c
diff options
context:
space:
mode:
authorAndy Walls <awalls@radix.net>2008-11-15 23:38:19 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2008-12-30 06:38:07 -0500
commitee2d64f5ccc71b5c5191e92ea91a12b65f9ca060 (patch)
tree0f01253a1e517f9c1f705901d873ca25bb2c872f /drivers/media/video/cx18/cx18-firmware.c
parentba38ee8ebe4a42ce2213802152b0b86a95dc109f (diff)
V4L/DVB (9720): cx18: Major rewrite of interrupt handling for incoming mailbox processing
A major rewrite of interrupt handling for incoming mailbox processing, to split the timing critical steps from the the deferrable steps as the sending XPU on the CX23418 will time out and overwrite our incoming mailboxes rather quickly. Setup a pool of work "order forms" for the irq handler to send jobs to the new work handler routine which uses the kernel default work queue to do the deferrable work. Started optimizing some of the cx18-io calls as they are now the low hanging fruit for recoving microseconds back from the timeline. Future optimizations will get rid of mmio read retries, mmio stats logging, and combine smaller functions in the irq path into the larger ones to save ~2 us each. Signed-off-by: Andy Walls <awalls@radix.net> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/cx18/cx18-firmware.c')
-rw-r--r--drivers/media/video/cx18/cx18-firmware.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/media/video/cx18/cx18-firmware.c b/drivers/media/video/cx18/cx18-firmware.c
index d9c5f55ab17c..fdea4b75204d 100644
--- a/drivers/media/video/cx18/cx18-firmware.c
+++ b/drivers/media/video/cx18/cx18-firmware.c
@@ -121,6 +121,7 @@ static int load_cpu_fw_direct(const char *fn, u8 __iomem *mem, struct cx18 *cx)
121 if (cx18_raw_readl(cx, dst) != *src) { 121 if (cx18_raw_readl(cx, dst) != *src) {
122 CX18_ERR("Mismatch at offset %x\n", i); 122 CX18_ERR("Mismatch at offset %x\n", i);
123 release_firmware(fw); 123 release_firmware(fw);
124 cx18_setup_page(cx, 0);
124 return -EIO; 125 return -EIO;
125 } 126 }
126 dst++; 127 dst++;
@@ -131,6 +132,7 @@ static int load_cpu_fw_direct(const char *fn, u8 __iomem *mem, struct cx18 *cx)
131 CX18_INFO("loaded %s firmware (%zd bytes)\n", fn, fw->size); 132 CX18_INFO("loaded %s firmware (%zd bytes)\n", fn, fw->size);
132 size = fw->size; 133 size = fw->size;
133 release_firmware(fw); 134 release_firmware(fw);
135 cx18_setup_page(cx, SCB_OFFSET);
134 return size; 136 return size;
135} 137}
136 138
@@ -150,6 +152,7 @@ static int load_apu_fw_direct(const char *fn, u8 __iomem *dst, struct cx18 *cx,
150 if (request_firmware(&fw, fn, &cx->dev->dev)) { 152 if (request_firmware(&fw, fn, &cx->dev->dev)) {
151 CX18_ERR("unable to open firmware %s\n", fn); 153 CX18_ERR("unable to open firmware %s\n", fn);
152 CX18_ERR("did you put the firmware in the hotplug firmware directory?\n"); 154 CX18_ERR("did you put the firmware in the hotplug firmware directory?\n");
155 cx18_setup_page(cx, 0);
153 return -ENOMEM; 156 return -ENOMEM;
154 } 157 }
155 158
@@ -185,6 +188,7 @@ static int load_apu_fw_direct(const char *fn, u8 __iomem *dst, struct cx18 *cx,
185 CX18_ERR("Mismatch at offset %x\n", 188 CX18_ERR("Mismatch at offset %x\n",
186 offset + j); 189 offset + j);
187 release_firmware(fw); 190 release_firmware(fw);
191 cx18_setup_page(cx, 0);
188 return -EIO; 192 return -EIO;
189 } 193 }
190 } 194 }
@@ -196,6 +200,7 @@ static int load_apu_fw_direct(const char *fn, u8 __iomem *dst, struct cx18 *cx,
196 fn, apu_version, fw->size); 200 fn, apu_version, fw->size);
197 size = fw->size; 201 size = fw->size;
198 release_firmware(fw); 202 release_firmware(fw);
203 cx18_setup_page(cx, 0);
199 return size; 204 return size;
200} 205}
201 206