static void sossi_read_data(void *data, unsigned int len) { clk_enable(sossi.fck); set_timing(RD_ACCESS); _set_bits_per_cycle(sossi.bus_pick_count, sossi.bus_pick_width); /* CMD#/DATA */ sossi_set_bits(SOSSI_INIT1_REG, 1 << 18); set_cycles(len); sossi_start_transfer(); while (len >= 4) { *(u32 *) data = sossi_read_reg(SOSSI_FIFO_REG); len -= 4; data += 4; } while (len >= 2) { *(u16 *) data = sossi_read_reg16(SOSSI_FIFO_REG); len -= 2; data += 2; } while (len) { *(u8 *) data = sossi_read_reg8(SOSSI_FIFO_REG); len--; data++; } sossi_stop_transfer(); clk_disable(sossi.fck); }
static void sossi_read_data(void *data, unsigned int len) { set_timing(RD_ACCESS); /* CMD#/DATA */ sossi_set_bits(SOSSI_INIT1_REG, 1 << 18); set_cycles(len); sossi_start_transfer(); while (len >= 4) { *(u32 *) data = sossi_read_reg(SOSSI_FIFO_REG); len -= 4; data += 4; } while (len >= 2) { *(u16 *) data = sossi_read_reg16(SOSSI_FIFO_REG); len -= 2; data += 2; } while (len) { *(u8 *) data = sossi_read_reg8(SOSSI_FIFO_REG); len--; data++; } sossi_stop_transfer(); }