static void solo_fillbuf(struct solo_filehandle *fh, struct videobuf_buffer *vb) { struct solo6010_dev *solo_dev = fh->solo_dev; dma_addr_t vbuf; unsigned int fdma_addr; int frame_size; int error = 1; int i; if (!(vbuf = videobuf_to_dma_contig(vb))) goto finish_buf; if (erase_off(solo_dev)) { void *p = videobuf_queue_to_vaddr(&fh->vidq, vb); int image_size = solo_image_size(solo_dev); for (i = 0; i < image_size; i += 2) { ((u8 *)p)[i] = 0x80; ((u8 *)p)[i + 1] = 0x00; } error = 0; goto finish_buf; } frame_size = SOLO_HW_BPL * solo_vlines(solo_dev); fdma_addr = SOLO_DISP_EXT_ADDR(solo_dev) + (fh->old_write * frame_size); for (i = 0; i < frame_size / SOLO_DISP_BUF_SIZE; i++) { int j; for (j = 0; j < (SOLO_DISP_BUF_SIZE / SOLO_HW_BPL); j++) { if (solo_p2m_dma_t(solo_dev, SOLO_P2M_DMA_ID_DISP, 0, vbuf, fdma_addr + (j * SOLO_HW_BPL), solo_bytesperline(solo_dev))) goto finish_buf; vbuf += solo_bytesperline(solo_dev); } fdma_addr += SOLO_DISP_BUF_SIZE; } error = 0; finish_buf: if (error) { vb->state = VIDEOBUF_ERROR; } else { vb->state = VIDEOBUF_DONE; vb->field_count++; do_gettimeofday(&vb->ts); } wake_up(&vb->done); return; }
static ssize_t sdram_offsets_show(struct device *dev, struct device_attribute *attr, char *buf) { struct solo6010_dev *solo_dev = container_of(dev, struct solo6010_dev, dev); char *out = buf; out += sprintf(out, "DISP: 0x%08x @ 0x%08x\n", SOLO_DISP_EXT_ADDR(solo_dev), SOLO_DISP_EXT_SIZE); out += sprintf(out, "EOSD: 0x%08x @ 0x%08x (0x%08x * %d)\n", SOLO_EOSD_EXT_ADDR(solo_dev), SOLO_EOSD_EXT_AREA(solo_dev), SOLO_EOSD_EXT_SIZE(solo_dev), SOLO_EOSD_EXT_AREA(solo_dev) / SOLO_EOSD_EXT_SIZE(solo_dev)); out += sprintf(out, "MOTI: 0x%08x @ 0x%08x\n", SOLO_MOTION_EXT_ADDR(solo_dev), SOLO_MOTION_EXT_SIZE); out += sprintf(out, "G723: 0x%08x @ 0x%08x\n", SOLO_G723_EXT_ADDR(solo_dev), SOLO_G723_EXT_SIZE); out += sprintf(out, "CAPT: 0x%08x @ 0x%08x (0x%08x * %d)\n", SOLO_CAP_EXT_ADDR(solo_dev), SOLO_CAP_EXT_SIZE(solo_dev), SOLO_CAP_PAGE_SIZE, SOLO_CAP_EXT_SIZE(solo_dev) / SOLO_CAP_PAGE_SIZE); out += sprintf(out, "EREF: 0x%08x @ 0x%08x (0x%08x * %d)\n", SOLO_EREF_EXT_ADDR(solo_dev), SOLO_EREF_EXT_AREA(solo_dev), SOLO_EREF_EXT_SIZE, SOLO_EREF_EXT_AREA(solo_dev) / SOLO_EREF_EXT_SIZE); out += sprintf(out, "MPEG: 0x%08x @ 0x%08x\n", SOLO_MP4E_EXT_ADDR(solo_dev), SOLO_MP4E_EXT_SIZE(solo_dev)); out += sprintf(out, "JPEG: 0x%08x @ 0x%08x\n", SOLO_JPEG_EXT_ADDR(solo_dev), SOLO_JPEG_EXT_SIZE(solo_dev)); return out - buf; }
static void solo_fillbuf(struct solo_filehandle *fh, struct videobuf_buffer *vb) { struct solo6010_dev *solo_dev = fh->solo_dev; dma_addr_t vbuf; unsigned int fdma_addr; int error = -1; int i; if (!(vbuf = videobuf_to_dma_contig(vb))) goto finish_buf; if (erase_off(solo_dev)) { void *p = videobuf_queue_to_vmalloc(&fh->vidq, vb); int image_size = solo_image_size(solo_dev); for (i = 0; i < image_size; i += 2) { ((u8 *)p)[i] = 0x80; ((u8 *)p)[i + 1] = 0x00; } error = 0; } else { fdma_addr = SOLO_DISP_EXT_ADDR(solo_dev) + (fh->old_write * (SOLO_HW_BPL * solo_vlines(solo_dev))); error = solo_p2m_dma_t(solo_dev, 0, vbuf, fdma_addr, solo_bytesperline(solo_dev), solo_vlines(solo_dev), SOLO_HW_BPL); } finish_buf: if (error) { vb->state = VIDEOBUF_ERROR; } else { vb->state = VIDEOBUF_DONE; vb->field_count++; } wake_up(&vb->done); }