int qpic_flush_buffer_sw(u32 cmd, u32 len, u32 *param, u32 is_cmd) { u32 bytes_left, space, data, cfg2, time_end; int i, ret = 0; if ((len <= (sizeof(u32) * 4)) && (is_cmd)) { len >>= 2;/* len in dwords */ data = 0; for (i = 0; i < len; i++) data |= param[i] << (8 * i); QPIC_OUTP(QPIC_REG_QPIC_LCDC_CMD_DATA_CYCLE_CNT, len); QPIC_OUTP(QPIC_REG_LCD_DEVICE_CMD0 + (4 * cmd), data); return 0; }
static irqreturn_t qpic_irq_handler(int irq, void *ptr) { u32 data; data = QPIC_INP(QPIC_REG_QPIC_LCDC_IRQ_STTS); QPIC_OUTP(QPIC_REG_QPIC_LCDC_IRQ_CLR, 0xff); return 0; }
void qpic_interrupt_en(u32 en) { QPIC_OUTP(QPIC_REG_QPIC_LCDC_IRQ_CLR, 0xff); if (en) { if (!qpic_res->irq_ena) { qpic_res->irq_ena = true; enable_irq(qpic_res->irq); QPIC_OUTP(QPIC_REG_QPIC_LCDC_IRQ_EN, (1 << 0) | (1 << 2)); } } else { QPIC_OUTP(QPIC_REG_QPIC_LCDC_IRQ_EN, 0); disable_irq(qpic_res->irq); qpic_res->irq_ena = false; } }
void mdss_qpic_reset(void) { u32 time_end; QPIC_OUTP(QPIC_REG_QPIC_LCDC_RESET, 1 << 0); /* wait 100 us after reset as suggested by hw */ usleep(100); time_end = (u32)ktime_to_ms(ktime_get()) + QPIC_MAX_VSYNC_WAIT_TIME; while (((QPIC_INP(QPIC_REG_QPIC_LCDC_STTS) & (1 << 8)) == 0)) { if ((u32)ktime_to_ms(ktime_get()) > time_end) { pr_err("%s reset not finished", __func__); break; } /* yield 100 us for next polling by experiment*/ usleep(100); } }
void mdss_qpic_reset(void) { u32 time_end; QPIC_OUTP(QPIC_REG_QPIC_LCDC_RESET, 1 << 0); /* */ usleep(100); time_end = (u32)ktime_to_ms(ktime_get()) + QPIC_MAX_VSYNC_WAIT_TIME; while (((QPIC_INP(QPIC_REG_QPIC_LCDC_STTS) & (1 << 8)) == 0)) { if ((u32)ktime_to_ms(ktime_get()) > time_end) { pr_err("%s reset not finished", __func__); break; } /* */ usleep(100); } }
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; }