int do_spi (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { char *cp = 0; uchar tmp; int j; /* * We use the last specified parameters, unless new ones are * entered. */ if ((flag & CMD_FLAG_REPEAT) == 0) { if (argc >= 2) { mode = CONFIG_DEFAULT_SPI_MODE; bus = simple_strtoul(argv[1], &cp, 10); if (*cp == ':') { cs = simple_strtoul(cp+1, &cp, 10); } else { cs = bus; bus = CONFIG_DEFAULT_SPI_BUS; } if (*cp == '.') mode = simple_strtoul(cp+1, NULL, 10); } if (argc >= 3) bitlen = simple_strtoul(argv[2], NULL, 10); if (argc >= 4) { cp = argv[3]; for(j = 0; *cp; j++, cp++) { tmp = *cp - '0'; if(tmp > 9) tmp -= ('A' - '0') - 10; if(tmp > 15) tmp -= ('a' - 'A'); if(tmp > 15) { printf("Hex conversion error on %c\n", *cp); return 1; } if((j % 2) == 0) dout[j / 2] = (tmp << 4); else dout[j / 2] |= tmp; } } } if ((bitlen < 0) || (bitlen > (MAX_SPI_BYTES * 8))) { printf("Invalid bitlen %d\n", bitlen); return 1; } if (do_spi_xfer(bus, cs)) return 1; return 0; }
static int spi_ctrlr_xfer(const struct spi_slave *slave, const void *dout, size_t bytesout, void *din, size_t bytesin) { unsigned int in_sz, out_sz; int ret; if (!slave) { printk(BIOS_ERR, "%s: Error: slave was not set up.\n", __func__); return -SPIM_API_NOT_INITIALISED; } if (!dout && !din) { printk(BIOS_ERR, "%s: Error: both buffers are NULL.\n", __func__); return -SPIM_INVALID_TRANSFER_DESC; } while (bytesin || bytesout) { in_sz = min(IMGTEC_SPI_MAX_TRANSFER_SIZE, bytesin); out_sz = min(IMGTEC_SPI_MAX_TRANSFER_SIZE, bytesout); ret = do_spi_xfer(slave, dout, out_sz, din, in_sz); if (ret) return ret; bytesin -= in_sz; bytesout -= out_sz; if (bytesin) din += in_sz; else din = NULL; if (bytesout) dout += out_sz; else dout = NULL; } return SPIM_OK; }