int ion_system_contig_heap_cache_ops(struct ion_heap *heap, struct ion_buffer *buffer, void *vaddr, unsigned int offset, unsigned int length, unsigned int cmd) { unsigned long vstart, pstart; pstart = virt_to_phys(buffer->priv_virt) + offset; if (!pstart) { WARN(1, "Could not do virt to phys translation on %p\n", buffer->priv_virt); return -EINVAL; } vstart = (unsigned long) vaddr; switch (cmd) { case ION_IOC_CLEAN_CACHES: clean_caches(vstart, length, pstart); break; case ION_IOC_INV_CACHES: invalidate_caches(vstart, length, pstart); break; case ION_IOC_CLEAN_INV_CACHES: clean_and_invalidate_caches(vstart, length, pstart); break; default: return -EINVAL; } return 0; }
int ion_cp_cache_ops(struct ion_heap *heap, struct ion_buffer *buffer, void *vaddr, unsigned int offset, unsigned int length, unsigned int cmd) { unsigned long vstart, pstart; pstart = buffer->priv_phys + offset; vstart = (unsigned long)vaddr; switch (cmd) { case ION_IOC_CLEAN_CACHES: clean_caches(vstart, length, pstart); break; case ION_IOC_INV_CACHES: invalidate_caches(vstart, length, pstart); break; case ION_IOC_CLEAN_INV_CACHES: clean_and_invalidate_caches(vstart, length, pstart); break; default: return -EINVAL; } return 0; }
int qpic_flush_buffer_bam(u32 cmd, u32 len, u32 *param, u32 is_cmd) { int ret = 0; u32 phys_addr, cfg2, block_len , flags; if (is_cmd) { memcpy((u8 *)qpic_res->cmd_buf_virt, param, len); invalidate_caches((unsigned long)qpic_res->cmd_buf_virt, len, (unsigned long)qpic_res->cmd_buf_phys); phys_addr = qpic_res->cmd_buf_phys; } else { phys_addr = (u32)param; } cfg2 = QPIC_INP(QPIC_REG_QPIC_LCDC_CFG2); cfg2 &= ~0xFF; cfg2 |= cmd; QPIC_OUTP(QPIC_REG_QPIC_LCDC_CFG2, cfg2); block_len = 0x7FF0; while (len > 0) { if (len <= 0x7FF0) { flags = SPS_IOVEC_FLAG_EOT; block_len = len; } else { flags = 0; } ret = sps_transfer_one(qpic_res->qpic_endpt.handle, phys_addr, block_len, NULL, flags); if (ret) pr_err("failed to submit command %x ret %d\n", cmd, ret); phys_addr += block_len; len -= block_len; } ret = wait_for_completion_interruptible_timeout( &qpic_res->qpic_endpt.completion, msecs_to_jiffies(100 * 4)); if (ret <= 0) pr_err("%s timeout %x", __func__, ret); else ret = 0; return ret; }
rtems_device_driver video_control( rtems_device_major_number major, rtems_device_minor_number minor, void *arg ) { rtems_libio_ioctl_args_t *args = arg; unsigned int *a = (unsigned int *)args->buffer; rtems_status_code sc; switch (args->command) { case VIDEO_BUFFER_LOCK: if (last_buffer == -1) { *a = 0; } else { bsp_interrupt_vector_disable(MM_IRQ_VIDEOIN); if(*a) invalidate_caches(); *a = (unsigned int)buffers[last_buffer]; buffers_locked[last_buffer] = true; bsp_interrupt_vector_enable(MM_IRQ_VIDEOIN); } sc = RTEMS_SUCCESSFUL; break; case VIDEO_BUFFER_UNLOCK: { int i; for(i=0;i<N_BUFFERS;i++) { if ((unsigned int)buffers[i] == (unsigned int)a) { buffers_locked[i] = false; break; } } sc = RTEMS_SUCCESSFUL; break; } case VIDEO_SET_BRIGHTNESS: write_reg(0x0a, (unsigned int)a); sc = RTEMS_SUCCESSFUL; break; case VIDEO_GET_BRIGHTNESS: *a = read_reg(0x0a); sc = RTEMS_SUCCESSFUL; break; case VIDEO_SET_CONTRAST: write_reg(0x08, (unsigned int)a); sc = RTEMS_SUCCESSFUL; break; case VIDEO_GET_CONTRAST: *a = read_reg(0x08); sc = RTEMS_SUCCESSFUL; break; case VIDEO_SET_HUE: write_reg(0x0b, (unsigned int)a); sc = RTEMS_SUCCESSFUL; break; case VIDEO_GET_HUE: *a = read_reg(0x0b); sc = RTEMS_SUCCESSFUL; break; case VIDEO_GET_SIGNAL: *a = read_reg(0x10); sc = RTEMS_SUCCESSFUL; break; case VIDEO_SET_REGISTER: write_reg(((unsigned int)a & 0xffff0000) >> 16, (unsigned int)a & 0x0000ffff); sc = RTEMS_SUCCESSFUL; break; case VIDEO_GET_REGISTER: *a = read_reg(*a); sc = RTEMS_SUCCESSFUL; break; case VIDEO_SET_FORMAT: set_format((int)a); sc = RTEMS_SUCCESSFUL; break; default: sc = RTEMS_UNSATISFIED; break; } if (sc == RTEMS_SUCCESSFUL) args->ioctl_return = 0; else args->ioctl_return = -1; return sc; }