11465d055SJagannadha Sutradharudu Teki /* 286e99b98SJagan Teki * (C) Copyright 2013 Xilinx, Inc. 3b1c82da2SJagan Teki * (C) Copyright 2015 Jagan Teki <jteki@openedev.com> 41465d055SJagannadha Sutradharudu Teki * 51465d055SJagannadha Sutradharudu Teki * Xilinx Zynq PS SPI controller driver (master mode only) 61465d055SJagannadha Sutradharudu Teki * 71465d055SJagannadha Sutradharudu Teki * SPDX-License-Identifier: GPL-2.0+ 81465d055SJagannadha Sutradharudu Teki */ 91465d055SJagannadha Sutradharudu Teki 101465d055SJagannadha Sutradharudu Teki #include <common.h> 11b1c82da2SJagan Teki #include <dm.h> 121465d055SJagannadha Sutradharudu Teki #include <malloc.h> 131465d055SJagannadha Sutradharudu Teki #include <spi.h> 141465d055SJagannadha Sutradharudu Teki #include <asm/io.h> 151465d055SJagannadha Sutradharudu Teki 16cdc9dd07SJagan Teki DECLARE_GLOBAL_DATA_PTR; 17cdc9dd07SJagan Teki 181465d055SJagannadha Sutradharudu Teki /* zynq spi register bit masks ZYNQ_SPI_<REG>_<BIT>_MASK */ 19736b4df1SJagan Teki #define ZYNQ_SPI_CR_MSA_MASK BIT(15) /* Manual start enb */ 20736b4df1SJagan Teki #define ZYNQ_SPI_CR_MCS_MASK BIT(14) /* Manual chip select */ 219cf2ffb3SJagan Teki #define ZYNQ_SPI_CR_CS_MASK GENMASK(13, 10) /* Chip select */ 229cf2ffb3SJagan Teki #define ZYNQ_SPI_CR_BAUD_MASK GENMASK(5, 3) /* Baud rate div */ 23736b4df1SJagan Teki #define ZYNQ_SPI_CR_CPHA_MASK BIT(2) /* Clock phase */ 24736b4df1SJagan Teki #define ZYNQ_SPI_CR_CPOL_MASK BIT(1) /* Clock polarity */ 25736b4df1SJagan Teki #define ZYNQ_SPI_CR_MSTREN_MASK BIT(0) /* Mode select */ 26736b4df1SJagan Teki #define ZYNQ_SPI_IXR_RXNEMPTY_MASK BIT(4) /* RX_FIFO_not_empty */ 27736b4df1SJagan Teki #define ZYNQ_SPI_IXR_TXOW_MASK BIT(2) /* TX_FIFO_not_full */ 289cf2ffb3SJagan Teki #define ZYNQ_SPI_IXR_ALL_MASK GENMASK(6, 0) /* All IXR bits */ 29736b4df1SJagan Teki #define ZYNQ_SPI_ENR_SPI_EN_MASK BIT(0) /* SPI Enable */ 301465d055SJagannadha Sutradharudu Teki 3146ab8a6aSJagan Teki #define ZYNQ_SPI_CR_BAUD_MAX 8 /* Baud rate divisor max val */ 3246ab8a6aSJagan Teki #define ZYNQ_SPI_CR_BAUD_SHIFT 3 /* Baud rate divisor shift */ 3346ab8a6aSJagan Teki #define ZYNQ_SPI_CR_SS_SHIFT 10 /* Slave select shift */ 3446ab8a6aSJagan Teki 351465d055SJagannadha Sutradharudu Teki #define ZYNQ_SPI_FIFO_DEPTH 128 361465d055SJagannadha Sutradharudu Teki #ifndef CONFIG_SYS_ZYNQ_SPI_WAIT 371465d055SJagannadha Sutradharudu Teki #define CONFIG_SYS_ZYNQ_SPI_WAIT (CONFIG_SYS_HZ/100) /* 10 ms */ 381465d055SJagannadha Sutradharudu Teki #endif 391465d055SJagannadha Sutradharudu Teki 401465d055SJagannadha Sutradharudu Teki /* zynq spi register set */ 411465d055SJagannadha Sutradharudu Teki struct zynq_spi_regs { 421465d055SJagannadha Sutradharudu Teki u32 cr; /* 0x00 */ 431465d055SJagannadha Sutradharudu Teki u32 isr; /* 0x04 */ 441465d055SJagannadha Sutradharudu Teki u32 ier; /* 0x08 */ 451465d055SJagannadha Sutradharudu Teki u32 idr; /* 0x0C */ 461465d055SJagannadha Sutradharudu Teki u32 imr; /* 0x10 */ 471465d055SJagannadha Sutradharudu Teki u32 enr; /* 0x14 */ 481465d055SJagannadha Sutradharudu Teki u32 dr; /* 0x18 */ 491465d055SJagannadha Sutradharudu Teki u32 txdr; /* 0x1C */ 501465d055SJagannadha Sutradharudu Teki u32 rxdr; /* 0x20 */ 511465d055SJagannadha Sutradharudu Teki }; 521465d055SJagannadha Sutradharudu Teki 53b1c82da2SJagan Teki 54b1c82da2SJagan Teki /* zynq spi platform data */ 55b1c82da2SJagan Teki struct zynq_spi_platdata { 56b1c82da2SJagan Teki struct zynq_spi_regs *regs; 57b1c82da2SJagan Teki u32 frequency; /* input frequency */ 581465d055SJagannadha Sutradharudu Teki u32 speed_hz; 591465d055SJagannadha Sutradharudu Teki }; 601465d055SJagannadha Sutradharudu Teki 61b1c82da2SJagan Teki /* zynq spi priv */ 62b1c82da2SJagan Teki struct zynq_spi_priv { 63b1c82da2SJagan Teki struct zynq_spi_regs *regs; 6419126998SJagan Teki u8 cs; 65b1c82da2SJagan Teki u8 mode; 66b1c82da2SJagan Teki u8 fifo_depth; 67b1c82da2SJagan Teki u32 freq; /* required frequency */ 68b1c82da2SJagan Teki }; 691465d055SJagannadha Sutradharudu Teki 70b1c82da2SJagan Teki static int zynq_spi_ofdata_to_platdata(struct udevice *bus) 711465d055SJagannadha Sutradharudu Teki { 72b1c82da2SJagan Teki struct zynq_spi_platdata *plat = bus->platdata; 73cdc9dd07SJagan Teki const void *blob = gd->fdt_blob; 74cdc9dd07SJagan Teki int node = bus->of_offset; 75b1c82da2SJagan Teki 764e9838c1SSimon Glass plat->regs = (struct zynq_spi_regs *)dev_get_addr(bus); 77cdc9dd07SJagan Teki 78cdc9dd07SJagan Teki /* FIXME: Use 250MHz as a suitable default */ 79cdc9dd07SJagan Teki plat->frequency = fdtdec_get_int(blob, node, "spi-max-frequency", 80cdc9dd07SJagan Teki 250000000); 81b1c82da2SJagan Teki plat->speed_hz = plat->frequency / 2; 82b1c82da2SJagan Teki 8380fd9792SMichal Simek debug("%s: regs=%p max-frequency=%d\n", __func__, 84cdc9dd07SJagan Teki plat->regs, plat->frequency); 85cdc9dd07SJagan Teki 86b1c82da2SJagan Teki return 0; 87b1c82da2SJagan Teki } 88b1c82da2SJagan Teki 89b1c82da2SJagan Teki static void zynq_spi_init_hw(struct zynq_spi_priv *priv) 90b1c82da2SJagan Teki { 91b1c82da2SJagan Teki struct zynq_spi_regs *regs = priv->regs; 921465d055SJagannadha Sutradharudu Teki u32 confr; 931465d055SJagannadha Sutradharudu Teki 941465d055SJagannadha Sutradharudu Teki /* Disable SPI */ 95b1c82da2SJagan Teki writel(~ZYNQ_SPI_ENR_SPI_EN_MASK, ®s->enr); 961465d055SJagannadha Sutradharudu Teki 971465d055SJagannadha Sutradharudu Teki /* Disable Interrupts */ 98b1c82da2SJagan Teki writel(ZYNQ_SPI_IXR_ALL_MASK, ®s->idr); 991465d055SJagannadha Sutradharudu Teki 1001465d055SJagannadha Sutradharudu Teki /* Clear RX FIFO */ 101b1c82da2SJagan Teki while (readl(®s->isr) & 1021465d055SJagannadha Sutradharudu Teki ZYNQ_SPI_IXR_RXNEMPTY_MASK) 103b1c82da2SJagan Teki readl(®s->rxdr); 1041465d055SJagannadha Sutradharudu Teki 1051465d055SJagannadha Sutradharudu Teki /* Clear Interrupts */ 106b1c82da2SJagan Teki writel(ZYNQ_SPI_IXR_ALL_MASK, ®s->isr); 1071465d055SJagannadha Sutradharudu Teki 1081465d055SJagannadha Sutradharudu Teki /* Manual slave select and Auto start */ 1091465d055SJagannadha Sutradharudu Teki confr = ZYNQ_SPI_CR_MCS_MASK | ZYNQ_SPI_CR_CS_MASK | 1101465d055SJagannadha Sutradharudu Teki ZYNQ_SPI_CR_MSTREN_MASK; 1111465d055SJagannadha Sutradharudu Teki confr &= ~ZYNQ_SPI_CR_MSA_MASK; 112b1c82da2SJagan Teki writel(confr, ®s->cr); 1131465d055SJagannadha Sutradharudu Teki 1141465d055SJagannadha Sutradharudu Teki /* Enable SPI */ 115b1c82da2SJagan Teki writel(ZYNQ_SPI_ENR_SPI_EN_MASK, ®s->enr); 1161465d055SJagannadha Sutradharudu Teki } 1171465d055SJagannadha Sutradharudu Teki 118b1c82da2SJagan Teki static int zynq_spi_probe(struct udevice *bus) 1191465d055SJagannadha Sutradharudu Teki { 120b1c82da2SJagan Teki struct zynq_spi_platdata *plat = dev_get_platdata(bus); 121b1c82da2SJagan Teki struct zynq_spi_priv *priv = dev_get_priv(bus); 122b1c82da2SJagan Teki 123b1c82da2SJagan Teki priv->regs = plat->regs; 124b1c82da2SJagan Teki priv->fifo_depth = ZYNQ_SPI_FIFO_DEPTH; 125b1c82da2SJagan Teki 126b1c82da2SJagan Teki /* init the zynq spi hw */ 127b1c82da2SJagan Teki zynq_spi_init_hw(priv); 128b1c82da2SJagan Teki 129b1c82da2SJagan Teki return 0; 1301465d055SJagannadha Sutradharudu Teki } 1311465d055SJagannadha Sutradharudu Teki 13219126998SJagan Teki static void spi_cs_activate(struct udevice *dev) 1331465d055SJagannadha Sutradharudu Teki { 134b1c82da2SJagan Teki struct udevice *bus = dev->parent; 135b1c82da2SJagan Teki struct zynq_spi_priv *priv = dev_get_priv(bus); 136b1c82da2SJagan Teki struct zynq_spi_regs *regs = priv->regs; 1371465d055SJagannadha Sutradharudu Teki u32 cr; 1381465d055SJagannadha Sutradharudu Teki 139b1c82da2SJagan Teki clrbits_le32(®s->cr, ZYNQ_SPI_CR_CS_MASK); 140b1c82da2SJagan Teki cr = readl(®s->cr); 1411465d055SJagannadha Sutradharudu Teki /* 1421465d055SJagannadha Sutradharudu Teki * CS cal logic: CS[13:10] 1431465d055SJagannadha Sutradharudu Teki * xxx0 - cs0 1441465d055SJagannadha Sutradharudu Teki * xx01 - cs1 1451465d055SJagannadha Sutradharudu Teki * x011 - cs2 1461465d055SJagannadha Sutradharudu Teki */ 14719126998SJagan Teki cr |= (~(1 << priv->cs) << ZYNQ_SPI_CR_SS_SHIFT) & ZYNQ_SPI_CR_CS_MASK; 148b1c82da2SJagan Teki writel(cr, ®s->cr); 1491465d055SJagannadha Sutradharudu Teki } 1501465d055SJagannadha Sutradharudu Teki 151b1c82da2SJagan Teki static void spi_cs_deactivate(struct udevice *dev) 1521465d055SJagannadha Sutradharudu Teki { 153b1c82da2SJagan Teki struct udevice *bus = dev->parent; 154b1c82da2SJagan Teki struct zynq_spi_priv *priv = dev_get_priv(bus); 155b1c82da2SJagan Teki struct zynq_spi_regs *regs = priv->regs; 1561465d055SJagannadha Sutradharudu Teki 157b1c82da2SJagan Teki setbits_le32(®s->cr, ZYNQ_SPI_CR_CS_MASK); 1581465d055SJagannadha Sutradharudu Teki } 1591465d055SJagannadha Sutradharudu Teki 160b1c82da2SJagan Teki static int zynq_spi_claim_bus(struct udevice *dev) 1611465d055SJagannadha Sutradharudu Teki { 162b1c82da2SJagan Teki struct udevice *bus = dev->parent; 163b1c82da2SJagan Teki struct zynq_spi_priv *priv = dev_get_priv(bus); 164b1c82da2SJagan Teki struct zynq_spi_regs *regs = priv->regs; 1651465d055SJagannadha Sutradharudu Teki 166b1c82da2SJagan Teki writel(ZYNQ_SPI_ENR_SPI_EN_MASK, ®s->enr); 1671465d055SJagannadha Sutradharudu Teki 1681465d055SJagannadha Sutradharudu Teki return 0; 1691465d055SJagannadha Sutradharudu Teki } 1701465d055SJagannadha Sutradharudu Teki 171b1c82da2SJagan Teki static int zynq_spi_release_bus(struct udevice *dev) 1721465d055SJagannadha Sutradharudu Teki { 173b1c82da2SJagan Teki struct udevice *bus = dev->parent; 174b1c82da2SJagan Teki struct zynq_spi_priv *priv = dev_get_priv(bus); 175b1c82da2SJagan Teki struct zynq_spi_regs *regs = priv->regs; 1761465d055SJagannadha Sutradharudu Teki 177b1c82da2SJagan Teki writel(~ZYNQ_SPI_ENR_SPI_EN_MASK, ®s->enr); 178b1c82da2SJagan Teki 179b1c82da2SJagan Teki return 0; 1801465d055SJagannadha Sutradharudu Teki } 1811465d055SJagannadha Sutradharudu Teki 182b1c82da2SJagan Teki static int zynq_spi_xfer(struct udevice *dev, unsigned int bitlen, 183b1c82da2SJagan Teki const void *dout, void *din, unsigned long flags) 1841465d055SJagannadha Sutradharudu Teki { 185b1c82da2SJagan Teki struct udevice *bus = dev->parent; 186b1c82da2SJagan Teki struct zynq_spi_priv *priv = dev_get_priv(bus); 187b1c82da2SJagan Teki struct zynq_spi_regs *regs = priv->regs; 188b1c82da2SJagan Teki struct dm_spi_slave_platdata *slave_plat = dev_get_parent_platdata(dev); 1891465d055SJagannadha Sutradharudu Teki u32 len = bitlen / 8; 1901465d055SJagannadha Sutradharudu Teki u32 tx_len = len, rx_len = len, tx_tvl; 1911465d055SJagannadha Sutradharudu Teki const u8 *tx_buf = dout; 1921465d055SJagannadha Sutradharudu Teki u8 *rx_buf = din, buf; 1931465d055SJagannadha Sutradharudu Teki u32 ts, status; 1941465d055SJagannadha Sutradharudu Teki 1951465d055SJagannadha Sutradharudu Teki debug("spi_xfer: bus:%i cs:%i bitlen:%i len:%i flags:%lx\n", 196b1c82da2SJagan Teki bus->seq, slave_plat->cs, bitlen, len, flags); 1971465d055SJagannadha Sutradharudu Teki 1981465d055SJagannadha Sutradharudu Teki if (bitlen % 8) { 1991465d055SJagannadha Sutradharudu Teki debug("spi_xfer: Non byte aligned SPI transfer\n"); 2001465d055SJagannadha Sutradharudu Teki return -1; 2011465d055SJagannadha Sutradharudu Teki } 2021465d055SJagannadha Sutradharudu Teki 20319126998SJagan Teki priv->cs = slave_plat->cs; 2041465d055SJagannadha Sutradharudu Teki if (flags & SPI_XFER_BEGIN) 20519126998SJagan Teki spi_cs_activate(dev); 2061465d055SJagannadha Sutradharudu Teki 2071465d055SJagannadha Sutradharudu Teki while (rx_len > 0) { 2081465d055SJagannadha Sutradharudu Teki /* Write the data into TX FIFO - tx threshold is fifo_depth */ 2091465d055SJagannadha Sutradharudu Teki tx_tvl = 0; 210b1c82da2SJagan Teki while ((tx_tvl < priv->fifo_depth) && tx_len) { 2111465d055SJagannadha Sutradharudu Teki if (tx_buf) 2121465d055SJagannadha Sutradharudu Teki buf = *tx_buf++; 2131465d055SJagannadha Sutradharudu Teki else 2141465d055SJagannadha Sutradharudu Teki buf = 0; 215b1c82da2SJagan Teki writel(buf, ®s->txdr); 2161465d055SJagannadha Sutradharudu Teki tx_len--; 2171465d055SJagannadha Sutradharudu Teki tx_tvl++; 2181465d055SJagannadha Sutradharudu Teki } 2191465d055SJagannadha Sutradharudu Teki 2201465d055SJagannadha Sutradharudu Teki /* Check TX FIFO completion */ 2211465d055SJagannadha Sutradharudu Teki ts = get_timer(0); 222b1c82da2SJagan Teki status = readl(®s->isr); 2231465d055SJagannadha Sutradharudu Teki while (!(status & ZYNQ_SPI_IXR_TXOW_MASK)) { 2241465d055SJagannadha Sutradharudu Teki if (get_timer(ts) > CONFIG_SYS_ZYNQ_SPI_WAIT) { 2251465d055SJagannadha Sutradharudu Teki printf("spi_xfer: Timeout! TX FIFO not full\n"); 2261465d055SJagannadha Sutradharudu Teki return -1; 2271465d055SJagannadha Sutradharudu Teki } 228b1c82da2SJagan Teki status = readl(®s->isr); 2291465d055SJagannadha Sutradharudu Teki } 2301465d055SJagannadha Sutradharudu Teki 2311465d055SJagannadha Sutradharudu Teki /* Read the data from RX FIFO */ 232b1c82da2SJagan Teki status = readl(®s->isr); 233*d2998286SLad, Prabhakar while ((status & ZYNQ_SPI_IXR_RXNEMPTY_MASK) && rx_len) { 234b1c82da2SJagan Teki buf = readl(®s->rxdr); 2351465d055SJagannadha Sutradharudu Teki if (rx_buf) 2361465d055SJagannadha Sutradharudu Teki *rx_buf++ = buf; 237b1c82da2SJagan Teki status = readl(®s->isr); 2381465d055SJagannadha Sutradharudu Teki rx_len--; 2391465d055SJagannadha Sutradharudu Teki } 2401465d055SJagannadha Sutradharudu Teki } 2411465d055SJagannadha Sutradharudu Teki 2421465d055SJagannadha Sutradharudu Teki if (flags & SPI_XFER_END) 243b1c82da2SJagan Teki spi_cs_deactivate(dev); 2441465d055SJagannadha Sutradharudu Teki 2451465d055SJagannadha Sutradharudu Teki return 0; 2461465d055SJagannadha Sutradharudu Teki } 247b1c82da2SJagan Teki 248b1c82da2SJagan Teki static int zynq_spi_set_speed(struct udevice *bus, uint speed) 249b1c82da2SJagan Teki { 250b1c82da2SJagan Teki struct zynq_spi_platdata *plat = bus->platdata; 251b1c82da2SJagan Teki struct zynq_spi_priv *priv = dev_get_priv(bus); 252b1c82da2SJagan Teki struct zynq_spi_regs *regs = priv->regs; 253b1c82da2SJagan Teki uint32_t confr; 254b1c82da2SJagan Teki u8 baud_rate_val = 0; 255b1c82da2SJagan Teki 256b1c82da2SJagan Teki if (speed > plat->frequency) 257b1c82da2SJagan Teki speed = plat->frequency; 258b1c82da2SJagan Teki 259b1c82da2SJagan Teki /* Set the clock frequency */ 260b1c82da2SJagan Teki confr = readl(®s->cr); 261b1c82da2SJagan Teki if (speed == 0) { 262b1c82da2SJagan Teki /* Set baudrate x8, if the freq is 0 */ 263b1c82da2SJagan Teki baud_rate_val = 0x2; 264b1c82da2SJagan Teki } else if (plat->speed_hz != speed) { 26546ab8a6aSJagan Teki while ((baud_rate_val < ZYNQ_SPI_CR_BAUD_MAX) && 266b1c82da2SJagan Teki ((plat->frequency / 267b1c82da2SJagan Teki (2 << baud_rate_val)) > speed)) 268b1c82da2SJagan Teki baud_rate_val++; 269b1c82da2SJagan Teki plat->speed_hz = speed / (2 << baud_rate_val); 270b1c82da2SJagan Teki } 271dda6241aSJagan Teki confr &= ~ZYNQ_SPI_CR_BAUD_MASK; 27246ab8a6aSJagan Teki confr |= (baud_rate_val << ZYNQ_SPI_CR_BAUD_SHIFT); 273b1c82da2SJagan Teki 274b1c82da2SJagan Teki writel(confr, ®s->cr); 275b1c82da2SJagan Teki priv->freq = speed; 276b1c82da2SJagan Teki 277a22bba81SJagan Teki debug("zynq_spi_set_speed: regs=%p, speed=%d\n", 278a22bba81SJagan Teki priv->regs, priv->freq); 279b1c82da2SJagan Teki 280b1c82da2SJagan Teki return 0; 281b1c82da2SJagan Teki } 282b1c82da2SJagan Teki 283b1c82da2SJagan Teki static int zynq_spi_set_mode(struct udevice *bus, uint mode) 284b1c82da2SJagan Teki { 285b1c82da2SJagan Teki struct zynq_spi_priv *priv = dev_get_priv(bus); 286b1c82da2SJagan Teki struct zynq_spi_regs *regs = priv->regs; 287b1c82da2SJagan Teki uint32_t confr; 288b1c82da2SJagan Teki 289b1c82da2SJagan Teki /* Set the SPI Clock phase and polarities */ 290b1c82da2SJagan Teki confr = readl(®s->cr); 291b1c82da2SJagan Teki confr &= ~(ZYNQ_SPI_CR_CPHA_MASK | ZYNQ_SPI_CR_CPOL_MASK); 292b1c82da2SJagan Teki 293a22bba81SJagan Teki if (mode & SPI_CPHA) 294b1c82da2SJagan Teki confr |= ZYNQ_SPI_CR_CPHA_MASK; 295a22bba81SJagan Teki if (mode & SPI_CPOL) 296b1c82da2SJagan Teki confr |= ZYNQ_SPI_CR_CPOL_MASK; 297b1c82da2SJagan Teki 298b1c82da2SJagan Teki writel(confr, ®s->cr); 299b1c82da2SJagan Teki priv->mode = mode; 300b1c82da2SJagan Teki 301b1c82da2SJagan Teki debug("zynq_spi_set_mode: regs=%p, mode=%d\n", priv->regs, priv->mode); 302b1c82da2SJagan Teki 303b1c82da2SJagan Teki return 0; 304b1c82da2SJagan Teki } 305b1c82da2SJagan Teki 306b1c82da2SJagan Teki static const struct dm_spi_ops zynq_spi_ops = { 307b1c82da2SJagan Teki .claim_bus = zynq_spi_claim_bus, 308b1c82da2SJagan Teki .release_bus = zynq_spi_release_bus, 309b1c82da2SJagan Teki .xfer = zynq_spi_xfer, 310b1c82da2SJagan Teki .set_speed = zynq_spi_set_speed, 311b1c82da2SJagan Teki .set_mode = zynq_spi_set_mode, 312b1c82da2SJagan Teki }; 313b1c82da2SJagan Teki 314b1c82da2SJagan Teki static const struct udevice_id zynq_spi_ids[] = { 31540b383faSMichal Simek { .compatible = "xlnx,zynq-spi-r1p6" }, 31623ef5aeaSMichal Simek { .compatible = "cdns,spi-r1p6" }, 317b1c82da2SJagan Teki { } 318b1c82da2SJagan Teki }; 319b1c82da2SJagan Teki 320b1c82da2SJagan Teki U_BOOT_DRIVER(zynq_spi) = { 321b1c82da2SJagan Teki .name = "zynq_spi", 322b1c82da2SJagan Teki .id = UCLASS_SPI, 323b1c82da2SJagan Teki .of_match = zynq_spi_ids, 324b1c82da2SJagan Teki .ops = &zynq_spi_ops, 325b1c82da2SJagan Teki .ofdata_to_platdata = zynq_spi_ofdata_to_platdata, 326b1c82da2SJagan Teki .platdata_auto_alloc_size = sizeof(struct zynq_spi_platdata), 327b1c82da2SJagan Teki .priv_auto_alloc_size = sizeof(struct zynq_spi_priv), 328b1c82da2SJagan Teki .probe = zynq_spi_probe, 329b1c82da2SJagan Teki }; 330