|
104 | 104 | #define SVC_I3C_MDATACTRL_TXTRIG_FIFO_NOT_FULL GENMASK(5, 4)
|
105 | 105 | #define SVC_I3C_MDATACTRL_RXTRIG_FIFO_NOT_EMPTY 0
|
106 | 106 | #define SVC_I3C_MDATACTRL_RXCOUNT(x) FIELD_GET(GENMASK(28, 24), (x))
|
| 107 | +#define SVC_I3C_MDATACTRL_TXCOUNT(x) FIELD_GET(GENMASK(20, 16), (x)) |
107 | 108 | #define SVC_I3C_MDATACTRL_TXFULL BIT(30)
|
108 | 109 | #define SVC_I3C_MDATACTRL_RXEMPTY BIT(31)
|
109 | 110 |
|
@@ -1304,14 +1305,19 @@ static int svc_i3c_master_xfer(struct svc_i3c_master *master,
|
1304 | 1305 | * FIFO start filling as soon as possible after EmitStartAddr.
|
1305 | 1306 | */
|
1306 | 1307 | if (svc_has_quirk(master, SVC_I3C_QUIRK_FIFO_EMPTY) && !rnw && xfer_len) {
|
1307 |
| - u32 end = xfer_len > SVC_I3C_FIFO_SIZE ? 0 : SVC_I3C_MWDATAB_END; |
1308 |
| - u32 len = min_t(u32, xfer_len, SVC_I3C_FIFO_SIZE); |
1309 |
| - |
1310 |
| - writesb(master->regs + SVC_I3C_MWDATAB1, out, len - 1); |
1311 |
| - /* Mark END bit if this is the last byte */ |
1312 |
| - writel(out[len - 1] | end, master->regs + SVC_I3C_MWDATAB); |
1313 |
| - xfer_len -= len; |
1314 |
| - out += len; |
| 1308 | + u32 space, end, len; |
| 1309 | + |
| 1310 | + reg = readl(master->regs + SVC_I3C_MDATACTRL); |
| 1311 | + space = SVC_I3C_FIFO_SIZE - SVC_I3C_MDATACTRL_TXCOUNT(reg); |
| 1312 | + if (space) { |
| 1313 | + end = xfer_len > space ? 0 : SVC_I3C_MWDATAB_END; |
| 1314 | + len = min_t(u32, xfer_len, space); |
| 1315 | + writesb(master->regs + SVC_I3C_MWDATAB1, out, len - 1); |
| 1316 | + /* Mark END bit if this is the last byte */ |
| 1317 | + writel(out[len - 1] | end, master->regs + SVC_I3C_MWDATAB); |
| 1318 | + xfer_len -= len; |
| 1319 | + out += len; |
| 1320 | + } |
1315 | 1321 | }
|
1316 | 1322 |
|
1317 | 1323 | ret = readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg,
|
|
0 commit comments