1*898e76c9SJagannadha Sutradharudu Teki /* 2*898e76c9SJagannadha Sutradharudu Teki * SPI flash interface 3*898e76c9SJagannadha Sutradharudu Teki * 4*898e76c9SJagannadha Sutradharudu Teki * Copyright (C) 2008 Atmel Corporation 5*898e76c9SJagannadha Sutradharudu Teki * Copyright (C) 2010 Reinhard Meyer, EMK Elektronik 6*898e76c9SJagannadha Sutradharudu Teki * 7*898e76c9SJagannadha Sutradharudu Teki * Licensed under the GPL-2 or later. 8*898e76c9SJagannadha Sutradharudu Teki */ 9*898e76c9SJagannadha Sutradharudu Teki 10*898e76c9SJagannadha Sutradharudu Teki #include <common.h> 11*898e76c9SJagannadha Sutradharudu Teki #include <spi.h> 12*898e76c9SJagannadha Sutradharudu Teki 13*898e76c9SJagannadha Sutradharudu Teki static int spi_flash_read_write(struct spi_slave *spi, 14*898e76c9SJagannadha Sutradharudu Teki const u8 *cmd, size_t cmd_len, 15*898e76c9SJagannadha Sutradharudu Teki const u8 *data_out, u8 *data_in, 16*898e76c9SJagannadha Sutradharudu Teki size_t data_len) 17*898e76c9SJagannadha Sutradharudu Teki { 18*898e76c9SJagannadha Sutradharudu Teki unsigned long flags = SPI_XFER_BEGIN; 19*898e76c9SJagannadha Sutradharudu Teki int ret; 20*898e76c9SJagannadha Sutradharudu Teki 21*898e76c9SJagannadha Sutradharudu Teki if (data_len == 0) 22*898e76c9SJagannadha Sutradharudu Teki flags |= SPI_XFER_END; 23*898e76c9SJagannadha Sutradharudu Teki 24*898e76c9SJagannadha Sutradharudu Teki ret = spi_xfer(spi, cmd_len * 8, cmd, NULL, flags); 25*898e76c9SJagannadha Sutradharudu Teki if (ret) { 26*898e76c9SJagannadha Sutradharudu Teki debug("SF: Failed to send command (%zu bytes): %d\n", 27*898e76c9SJagannadha Sutradharudu Teki cmd_len, ret); 28*898e76c9SJagannadha Sutradharudu Teki } else if (data_len != 0) { 29*898e76c9SJagannadha Sutradharudu Teki ret = spi_xfer(spi, data_len * 8, data_out, data_in, 30*898e76c9SJagannadha Sutradharudu Teki SPI_XFER_END); 31*898e76c9SJagannadha Sutradharudu Teki if (ret) 32*898e76c9SJagannadha Sutradharudu Teki debug("SF: Failed to transfer %zu bytes of data: %d\n", 33*898e76c9SJagannadha Sutradharudu Teki data_len, ret); 34*898e76c9SJagannadha Sutradharudu Teki } 35*898e76c9SJagannadha Sutradharudu Teki 36*898e76c9SJagannadha Sutradharudu Teki return ret; 37*898e76c9SJagannadha Sutradharudu Teki } 38*898e76c9SJagannadha Sutradharudu Teki 39*898e76c9SJagannadha Sutradharudu Teki int spi_flash_cmd_read(struct spi_slave *spi, const u8 *cmd, 40*898e76c9SJagannadha Sutradharudu Teki size_t cmd_len, void *data, size_t data_len) 41*898e76c9SJagannadha Sutradharudu Teki { 42*898e76c9SJagannadha Sutradharudu Teki return spi_flash_read_write(spi, cmd, cmd_len, NULL, data, data_len); 43*898e76c9SJagannadha Sutradharudu Teki } 44*898e76c9SJagannadha Sutradharudu Teki 45*898e76c9SJagannadha Sutradharudu Teki int spi_flash_cmd(struct spi_slave *spi, u8 cmd, void *response, size_t len) 46*898e76c9SJagannadha Sutradharudu Teki { 47*898e76c9SJagannadha Sutradharudu Teki return spi_flash_cmd_read(spi, &cmd, 1, response, len); 48*898e76c9SJagannadha Sutradharudu Teki } 49*898e76c9SJagannadha Sutradharudu Teki 50*898e76c9SJagannadha Sutradharudu Teki int spi_flash_cmd_write(struct spi_slave *spi, const u8 *cmd, size_t cmd_len, 51*898e76c9SJagannadha Sutradharudu Teki const void *data, size_t data_len) 52*898e76c9SJagannadha Sutradharudu Teki { 53*898e76c9SJagannadha Sutradharudu Teki return spi_flash_read_write(spi, cmd, cmd_len, data, NULL, data_len); 54*898e76c9SJagannadha Sutradharudu Teki } 55