+ if (cdns_is_hold_quirk(hold_quirk, curr_recv_count)) {
+ /* wait while fifo is full */
+ while (readl(®s->transfer_size) !=
+ (curr_recv_count - CDNS_I2C_FIFO_DEPTH))
+ ;
+ /*
+ * Check number of bytes to be received against maximum
+ * transfer size and update register accordingly.
+ */
+ if ((recv_count - CDNS_I2C_FIFO_DEPTH) >
+ CDNS_I2C_TRANSFER_SIZE) {
+ writel(CDNS_I2C_TRANSFER_SIZE,
+ ®s->transfer_size);
+ curr_recv_count = CDNS_I2C_TRANSFER_SIZE +
+ CDNS_I2C_FIFO_DEPTH;
+ } else {
+ writel(recv_count - CDNS_I2C_FIFO_DEPTH,
+ ®s->transfer_size);
+ curr_recv_count = recv_count;
+ }
+ } else if (recv_count && !hold_quirk && !curr_recv_count) {
+ writel(addr, ®s->address);
+ if (recv_count > CDNS_I2C_TRANSFER_SIZE) {
+ writel(CDNS_I2C_TRANSFER_SIZE,
+ ®s->transfer_size);
+ curr_recv_count = CDNS_I2C_TRANSFER_SIZE;
+ } else {
+ writel(recv_count, ®s->transfer_size);
+ curr_recv_count = recv_count;
+ }
+ }
+ }
+
+ /* Wait for the address and data to be sent */
+ if (!cdns_i2c_wait(regs, CDNS_I2C_INTERRUPT_COMP))
+ return -ETIMEDOUT;
+