···145145146146static struct xspi_platform_data timberdale_xspi_platform_data = {147147 .num_chipselect = 3,148148- .little_endian = true,149148 /* bits per word and devices will be filled in runtime depending150149 * on the HW config151150 */
+21-9
drivers/spi/spi-xilinx.c
···3030 */3131#define XSPI_CR_OFFSET 0x60 /* Control Register */32323333+#define XSPI_CR_LOOP 0x013334#define XSPI_CR_ENABLE 0x023435#define XSPI_CR_MASTER_MODE 0x043536#define XSPI_CR_CPOL 0x08···341340MODULE_DEVICE_TABLE(of, xilinx_spi_of_match);342341343342struct spi_master *xilinx_spi_init(struct device *dev, struct resource *mem,344344- u32 irq, s16 bus_num, int num_cs, int little_endian, int bits_per_word)343343+ u32 irq, s16 bus_num, int num_cs, int bits_per_word)345344{346345 struct spi_master *master;347346 struct xilinx_spi *xspi;348347 int ret;348348+ u32 tmp;349349350350 master = spi_alloc_master(dev, sizeof(struct xilinx_spi));351351 if (!master)···378376379377 xspi->mem = *mem;380378 xspi->irq = irq;381381- if (little_endian) {382382- xspi->read_fn = xspi_read32;383383- xspi->write_fn = xspi_write32;384384- } else {379379+380380+ /*381381+ * Detect endianess on the IP via loop bit in CR. Detection382382+ * must be done before reset is sent because incorrect reset383383+ * value generates error interrupt.384384+ * Setup little endian helper functions first and try to use them385385+ * and check if bit was correctly setup or not.386386+ */387387+ xspi->read_fn = xspi_read32;388388+ xspi->write_fn = xspi_write32;389389+390390+ xspi->write_fn(XSPI_CR_LOOP, xspi->regs + XSPI_CR_OFFSET);391391+ tmp = xspi->read_fn(xspi->regs + XSPI_CR_OFFSET);392392+ tmp &= XSPI_CR_LOOP;393393+ if (tmp != XSPI_CR_LOOP) {385394 xspi->read_fn = xspi_read32_be;386395 xspi->write_fn = xspi_write32_be;387396 }397397+388398 xspi->bits_per_word = bits_per_word;389399 if (xspi->bits_per_word == 8) {390400 xspi->tx_fn = xspi_tx8;···460446{461447 struct xspi_platform_data *pdata;462448 struct resource *r;463463- int irq, num_cs = 0, little_endian = 0, bits_per_word = 8;449449+ int irq, num_cs = 0, bits_per_word = 8;464450 struct spi_master *master;465451 u8 i;466452467453 pdata = dev->dev.platform_data;468454 if (pdata) {469455 num_cs = pdata->num_chipselect;470470- little_endian = pdata->little_endian;471456 bits_per_word = pdata->bits_per_word;472457 }473458···498485 return -ENXIO;499486500487 master = xilinx_spi_init(&dev->dev, r, irq, dev->id, num_cs,501501- little_endian, bits_per_word);488488+ bits_per_word);502489 if (!master)503490 return -ENODEV;504491···514501static int xilinx_spi_remove(struct platform_device *dev)515502{516503 xilinx_spi_deinit(platform_get_drvdata(dev));517517- platform_set_drvdata(dev, 0);518504519505 return 0;520506}