static int rk_edp_dpcd_transfer(struct rk_edp *edp, unsigned int val_addr, u8 *data, unsigned int length, enum dpcd_request request) { int val; int i, try_times; int retval = 0; u32 len = 0; while (length) { len = MIN(length, 16); for (try_times = 0; try_times < 10; try_times++) { /* Clear AUX CH data buffer */ val = BUF_CLR; write32(&edp->regs->buf_data_ctl, val); /* Select DPCD device address */ val = AUX_ADDR_7_0(val_addr); write32(&edp->regs->aux_addr_7_0, val); val = AUX_ADDR_15_8(val_addr); write32(&edp->regs->aux_addr_15_8, val); val = AUX_ADDR_19_16(val_addr); write32(&edp->regs->aux_addr_19_16, val); /* * Set DisplayPort transaction and read 1 byte * If bit 3 is 1, DisplayPort transaction. * If Bit 3 is 0, I2C transaction. */ if (request == DPCD_WRITE) { val = AUX_LENGTH(len) | AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_WRITE; for (i = 0; i < len; i++) write32(&edp->regs->buf_data[i], *data++); } else val = AUX_LENGTH(len) | AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_READ; write32(&edp->regs->aux_ch_ctl_1, val); /* Start AUX transaction */ retval = rk_edp_start_aux_transaction(edp); if (retval == 0) break; else printk(BIOS_WARNING, "read dpcd Aux Transaction fail!\n"); } if (retval) return -1; if (request == DPCD_READ) { for (i = 0; i < len; i++) *data++ = (u8)read32(&edp->regs->buf_data[i]); } length -= len; val_addr += 16; } return 0; }
static int rk_edp_dpcd_transfer(struct rk3288_edp *regs, unsigned int val_addr, u8 *in_data, unsigned int length, enum dpcd_request request) { int val; int i, try_times; u8 *data; int ret = 0; u32 len = 0; while (length) { len = min(length, 16U); for (try_times = 0; try_times < 10; try_times++) { data = in_data; /* Clear AUX CH data buffer */ writel(BUF_CLR, ®s->buf_data_ctl); /* Select DPCD device address */ writel(AUX_ADDR_7_0(val_addr), ®s->aux_addr_7_0); writel(AUX_ADDR_15_8(val_addr), ®s->aux_addr_15_8); writel(AUX_ADDR_19_16(val_addr), ®s->aux_addr_19_16); /* * Set DisplayPort transaction and read 1 byte * If bit 3 is 1, DisplayPort transaction. * If Bit 3 is 0, I2C transaction. */ if (request == DPCD_WRITE) { val = AUX_LENGTH(len) | AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_WRITE; for (i = 0; i < len; i++) writel(*data++, ®s->buf_data[i]); } else val = AUX_LENGTH(len) | AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_READ; writel(val, ®s->aux_ch_ctl_1); /* Start AUX transaction */ ret = rk_edp_start_aux_transaction(regs); if (ret == 0) break; else printf("read dpcd Aux Transaction fail!\n"); } if (ret) return ret; if (request == DPCD_READ) { for (i = 0; i < len; i++) *data++ = (u8)readl(®s->buf_data[i]); } length -= len; val_addr += len; in_data += len; } return 0; }