···380380config SPI_FSL_ESPI381381 tristate "Freescale eSPI controller"382382 depends on FSL_SOC383383- select SPI_FSL_LIB384383 help385384 This enables using the Freescale eSPI controllers in master mode.386385 From MPC8536, 85xx platform uses the controller, and all P10xx,
···15151616#include <linux/clk.h>1717#include <linux/delay.h>1818+#include <linux/dmaengine.h>1919+#include <linux/dma-mapping.h>1820#include <linux/err.h>1921#include <linux/errno.h>2022#include <linux/interrupt.h>···4240#define TRAN_STATE_WORD_ODD_NUM 0x0443414442#define DSPI_FIFO_SIZE 44343+#define DSPI_DMA_BUFSIZE (DSPI_FIFO_SIZE * 1024)45444645#define SPI_MCR 0x004746#define SPI_MCR_MASTER (1 << 31)···7471#define SPI_SR_EOQF 0x100000007572#define SPI_SR_TCFQF 0x800000007673#define SPI_SR_CLEAR 0xdaad00007474+7575+#define SPI_RSER_TFFFE BIT(25)7676+#define SPI_RSER_TFFFD BIT(24)7777+#define SPI_RSER_RFDFE BIT(17)7878+#define SPI_RSER_RFDFD BIT(16)77797880#define SPI_RSER 0x307981#define SPI_RSER_EOQFE 0x10000000···117109118110#define SPI_TCR_TCNT_MAX 0x10000119111112112+#define DMA_COMPLETION_TIMEOUT msecs_to_jiffies(3000)113113+120114struct chip_data {121115 u32 mcr_val;122116 u32 ctar_val;···128118enum dspi_trans_mode {129119 DSPI_EOQ_MODE = 0,130120 DSPI_TCFQ_MODE,121121+ DSPI_DMA_MODE,131122};132123133124struct fsl_dspi_devtype_data {···137126};138127139128static const struct fsl_dspi_devtype_data vf610_data = {140140- .trans_mode = DSPI_EOQ_MODE,129129+ .trans_mode = DSPI_DMA_MODE,141130 .max_clock_factor = 2,142131};143132···149138static const struct fsl_dspi_devtype_data ls2085a_data = {150139 .trans_mode = DSPI_TCFQ_MODE,151140 .max_clock_factor = 8,141141+};142142+143143+struct fsl_dspi_dma {144144+ /* Length of transfer in words of DSPI_FIFO_SIZE */145145+ u32 curr_xfer_len;146146+147147+ u32 *tx_dma_buf;148148+ struct dma_chan *chan_tx;149149+ dma_addr_t tx_dma_phys;150150+ struct completion cmd_tx_complete;151151+ struct dma_async_tx_descriptor *tx_desc;152152+153153+ u32 *rx_dma_buf;154154+ struct dma_chan *chan_rx;155155+ dma_addr_t rx_dma_phys;156156+ struct completion cmd_rx_complete;157157+ struct dma_async_tx_descriptor *rx_desc;152158};153159154160struct fsl_dspi {···194166 u32 waitflags;195167196168 u32 spi_tcnt;169169+ struct fsl_dspi_dma *dma;197170};171171+172172+static u32 dspi_data_to_pushr(struct fsl_dspi *dspi, int tx_word);198173199174static inline int is_double_byte_mode(struct fsl_dspi *dspi)200175{···206175 regmap_read(dspi->regmap, SPI_CTAR(0), &val);207176208177 return ((val & SPI_FRAME_BITS_MASK) == SPI_FRAME_BITS(8)) ? 0 : 1;178178+}179179+180180+static void dspi_tx_dma_callback(void *arg)181181+{182182+ struct fsl_dspi *dspi = arg;183183+ struct fsl_dspi_dma *dma = dspi->dma;184184+185185+ complete(&dma->cmd_tx_complete);186186+}187187+188188+static void dspi_rx_dma_callback(void *arg)189189+{190190+ struct fsl_dspi *dspi = arg;191191+ struct fsl_dspi_dma *dma = dspi->dma;192192+ int rx_word;193193+ int i;194194+ u16 d;195195+196196+ rx_word = is_double_byte_mode(dspi);197197+198198+ if (!(dspi->dataflags & TRAN_STATE_RX_VOID)) {199199+ for (i = 0; i < dma->curr_xfer_len; i++) {200200+ d = dspi->dma->rx_dma_buf[i];201201+ rx_word ? (*(u16 *)dspi->rx = d) :202202+ (*(u8 *)dspi->rx = d);203203+ dspi->rx += rx_word + 1;204204+ }205205+ }206206+207207+ complete(&dma->cmd_rx_complete);208208+}209209+210210+static int dspi_next_xfer_dma_submit(struct fsl_dspi *dspi)211211+{212212+ struct fsl_dspi_dma *dma = dspi->dma;213213+ struct device *dev = &dspi->pdev->dev;214214+ int time_left;215215+ int tx_word;216216+ int i;217217+218218+ tx_word = is_double_byte_mode(dspi);219219+220220+ for (i = 0; i < dma->curr_xfer_len; i++) {221221+ dspi->dma->tx_dma_buf[i] = dspi_data_to_pushr(dspi, tx_word);222222+ if ((dspi->cs_change) && (!dspi->len))223223+ dspi->dma->tx_dma_buf[i] &= ~SPI_PUSHR_CONT;224224+ }225225+226226+ dma->tx_desc = dmaengine_prep_slave_single(dma->chan_tx,227227+ dma->tx_dma_phys,228228+ dma->curr_xfer_len *229229+ DMA_SLAVE_BUSWIDTH_4_BYTES,230230+ DMA_MEM_TO_DEV,231231+ DMA_PREP_INTERRUPT | DMA_CTRL_ACK);232232+ if (!dma->tx_desc) {233233+ dev_err(dev, "Not able to get desc for DMA xfer\n");234234+ return -EIO;235235+ }236236+237237+ dma->tx_desc->callback = dspi_tx_dma_callback;238238+ dma->tx_desc->callback_param = dspi;239239+ if (dma_submit_error(dmaengine_submit(dma->tx_desc))) {240240+ dev_err(dev, "DMA submit failed\n");241241+ return -EINVAL;242242+ }243243+244244+ dma->rx_desc = dmaengine_prep_slave_single(dma->chan_rx,245245+ dma->rx_dma_phys,246246+ dma->curr_xfer_len *247247+ DMA_SLAVE_BUSWIDTH_4_BYTES,248248+ DMA_DEV_TO_MEM,249249+ DMA_PREP_INTERRUPT | DMA_CTRL_ACK);250250+ if (!dma->rx_desc) {251251+ dev_err(dev, "Not able to get desc for DMA xfer\n");252252+ return -EIO;253253+ }254254+255255+ dma->rx_desc->callback = dspi_rx_dma_callback;256256+ dma->rx_desc->callback_param = dspi;257257+ if (dma_submit_error(dmaengine_submit(dma->rx_desc))) {258258+ dev_err(dev, "DMA submit failed\n");259259+ return -EINVAL;260260+ }261261+262262+ reinit_completion(&dspi->dma->cmd_rx_complete);263263+ reinit_completion(&dspi->dma->cmd_tx_complete);264264+265265+ dma_async_issue_pending(dma->chan_rx);266266+ dma_async_issue_pending(dma->chan_tx);267267+268268+ time_left = wait_for_completion_timeout(&dspi->dma->cmd_tx_complete,269269+ DMA_COMPLETION_TIMEOUT);270270+ if (time_left == 0) {271271+ dev_err(dev, "DMA tx timeout\n");272272+ dmaengine_terminate_all(dma->chan_tx);273273+ dmaengine_terminate_all(dma->chan_rx);274274+ return -ETIMEDOUT;275275+ }276276+277277+ time_left = wait_for_completion_timeout(&dspi->dma->cmd_rx_complete,278278+ DMA_COMPLETION_TIMEOUT);279279+ if (time_left == 0) {280280+ dev_err(dev, "DMA rx timeout\n");281281+ dmaengine_terminate_all(dma->chan_tx);282282+ dmaengine_terminate_all(dma->chan_rx);283283+ return -ETIMEDOUT;284284+ }285285+286286+ return 0;287287+}288288+289289+static int dspi_dma_xfer(struct fsl_dspi *dspi)290290+{291291+ struct fsl_dspi_dma *dma = dspi->dma;292292+ struct device *dev = &dspi->pdev->dev;293293+ int curr_remaining_bytes;294294+ int bytes_per_buffer;295295+ int word = 1;296296+ int ret = 0;297297+298298+ if (is_double_byte_mode(dspi))299299+ word = 2;300300+ curr_remaining_bytes = dspi->len;301301+ bytes_per_buffer = DSPI_DMA_BUFSIZE / DSPI_FIFO_SIZE;302302+ while (curr_remaining_bytes) {303303+ /* Check if current transfer fits the DMA buffer */304304+ dma->curr_xfer_len = curr_remaining_bytes / word;305305+ if (dma->curr_xfer_len > bytes_per_buffer)306306+ dma->curr_xfer_len = bytes_per_buffer;307307+308308+ ret = dspi_next_xfer_dma_submit(dspi);309309+ if (ret) {310310+ dev_err(dev, "DMA transfer failed\n");311311+ goto exit;312312+313313+ } else {314314+ curr_remaining_bytes -= dma->curr_xfer_len * word;315315+ if (curr_remaining_bytes < 0)316316+ curr_remaining_bytes = 0;317317+ }318318+ }319319+320320+exit:321321+ return ret;322322+}323323+324324+static int dspi_request_dma(struct fsl_dspi *dspi, phys_addr_t phy_addr)325325+{326326+ struct fsl_dspi_dma *dma;327327+ struct dma_slave_config cfg;328328+ struct device *dev = &dspi->pdev->dev;329329+ int ret;330330+331331+ dma = devm_kzalloc(dev, sizeof(*dma), GFP_KERNEL);332332+ if (!dma)333333+ return -ENOMEM;334334+335335+ dma->chan_rx = dma_request_slave_channel(dev, "rx");336336+ if (!dma->chan_rx) {337337+ dev_err(dev, "rx dma channel not available\n");338338+ ret = -ENODEV;339339+ return ret;340340+ }341341+342342+ dma->chan_tx = dma_request_slave_channel(dev, "tx");343343+ if (!dma->chan_tx) {344344+ dev_err(dev, "tx dma channel not available\n");345345+ ret = -ENODEV;346346+ goto err_tx_channel;347347+ }348348+349349+ dma->tx_dma_buf = dma_alloc_coherent(dev, DSPI_DMA_BUFSIZE,350350+ &dma->tx_dma_phys, GFP_KERNEL);351351+ if (!dma->tx_dma_buf) {352352+ ret = -ENOMEM;353353+ goto err_tx_dma_buf;354354+ }355355+356356+ dma->rx_dma_buf = dma_alloc_coherent(dev, DSPI_DMA_BUFSIZE,357357+ &dma->rx_dma_phys, GFP_KERNEL);358358+ if (!dma->rx_dma_buf) {359359+ ret = -ENOMEM;360360+ goto err_rx_dma_buf;361361+ }362362+363363+ cfg.src_addr = phy_addr + SPI_POPR;364364+ cfg.dst_addr = phy_addr + SPI_PUSHR;365365+ cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;366366+ cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;367367+ cfg.src_maxburst = 1;368368+ cfg.dst_maxburst = 1;369369+370370+ cfg.direction = DMA_DEV_TO_MEM;371371+ ret = dmaengine_slave_config(dma->chan_rx, &cfg);372372+ if (ret) {373373+ dev_err(dev, "can't configure rx dma channel\n");374374+ ret = -EINVAL;375375+ goto err_slave_config;376376+ }377377+378378+ cfg.direction = DMA_MEM_TO_DEV;379379+ ret = dmaengine_slave_config(dma->chan_tx, &cfg);380380+ if (ret) {381381+ dev_err(dev, "can't configure tx dma channel\n");382382+ ret = -EINVAL;383383+ goto err_slave_config;384384+ }385385+386386+ dspi->dma = dma;387387+ init_completion(&dma->cmd_tx_complete);388388+ init_completion(&dma->cmd_rx_complete);389389+390390+ return 0;391391+392392+err_slave_config:393393+ dma_free_coherent(dev, DSPI_DMA_BUFSIZE,394394+ dma->rx_dma_buf, dma->rx_dma_phys);395395+err_rx_dma_buf:396396+ dma_free_coherent(dev, DSPI_DMA_BUFSIZE,397397+ dma->tx_dma_buf, dma->tx_dma_phys);398398+err_tx_dma_buf:399399+ dma_release_channel(dma->chan_tx);400400+err_tx_channel:401401+ dma_release_channel(dma->chan_rx);402402+403403+ devm_kfree(dev, dma);404404+ dspi->dma = NULL;405405+406406+ return ret;407407+}408408+409409+static void dspi_release_dma(struct fsl_dspi *dspi)410410+{411411+ struct fsl_dspi_dma *dma = dspi->dma;412412+ struct device *dev = &dspi->pdev->dev;413413+414414+ if (dma) {415415+ if (dma->chan_tx) {416416+ dma_unmap_single(dev, dma->tx_dma_phys,417417+ DSPI_DMA_BUFSIZE, DMA_TO_DEVICE);418418+ dma_release_channel(dma->chan_tx);419419+ }420420+421421+ if (dma->chan_rx) {422422+ dma_unmap_single(dev, dma->rx_dma_phys,423423+ DSPI_DMA_BUFSIZE, DMA_FROM_DEVICE);424424+ dma_release_channel(dma->chan_rx);425425+ }426426+ }209427}210428211429static void hz_to_spi_baud(char *pbr, char *br, int speed_hz,···705425 regmap_write(dspi->regmap, SPI_RSER, SPI_RSER_TCFQE);706426 dspi_tcfq_write(dspi);707427 break;428428+ case DSPI_DMA_MODE:429429+ regmap_write(dspi->regmap, SPI_RSER,430430+ SPI_RSER_TFFFE | SPI_RSER_TFFFD |431431+ SPI_RSER_RFDFE | SPI_RSER_RFDFD);432432+ status = dspi_dma_xfer(dspi);433433+ break;708434 default:709435 dev_err(&dspi->pdev->dev, "unsupported trans_mode %u\n",710436 trans_mode);···718432 goto out;719433 }720434721721- if (wait_event_interruptible(dspi->waitq, dspi->waitflags))722722- dev_err(&dspi->pdev->dev, "wait transfer complete fail!\n");723723- dspi->waitflags = 0;435435+ if (trans_mode != DSPI_DMA_MODE) {436436+ if (wait_event_interruptible(dspi->waitq,437437+ dspi->waitflags))438438+ dev_err(&dspi->pdev->dev,439439+ "wait transfer complete fail!\n");440440+ dspi->waitflags = 0;441441+ }724442725443 if (transfer->delay_usecs)726444 udelay(transfer->delay_usecs);···1030740 if (ret)1031741 goto out_master_put;1032742743743+ if (dspi->devtype_data->trans_mode == DSPI_DMA_MODE) {744744+ if (dspi_request_dma(dspi, res->start)) {745745+ dev_err(&pdev->dev, "can't get dma channels\n");746746+ goto out_clk_put;747747+ }748748+ }749749+1033750 master->max_speed_hz =1034751 clk_get_rate(dspi->clk) / dspi->devtype_data->max_clock_factor;1035752···1065768 struct fsl_dspi *dspi = spi_master_get_devdata(master);10667691067770 /* Disconnect from the SPI framework */771771+ dspi_release_dma(dspi);1068772 clk_disable_unprepare(dspi->clk);1069773 spi_unregister_master(dspi->master);1070774
+395-339
drivers/spi/spi-fsl-espi.c
···2323#include <linux/pm_runtime.h>2424#include <sysdev/fsl_soc.h>25252626-#include "spi-fsl-lib.h"2727-2826/* eSPI Controller registers */2927#define ESPI_SPMODE 0x00 /* eSPI mode register */3028#define ESPI_SPIE 0x04 /* eSPI event register */···5254#define CSMODE_AFT(x) ((x) << 8)5355#define CSMODE_CG(x) ((x) << 3)54565757+#define FSL_ESPI_FIFO_SIZE 325858+#define FSL_ESPI_RXTHR 155959+5560/* Default mode/csmode for eSPI controller */5656-#define SPMODE_INIT_VAL (SPMODE_TXTHR(4) | SPMODE_RXTHR(3))6161+#define SPMODE_INIT_VAL (SPMODE_TXTHR(4) | SPMODE_RXTHR(FSL_ESPI_RXTHR))5762#define CSMODE_INIT_VAL (CSMODE_POL_1 | CSMODE_BEF(0) \5863 | CSMODE_AFT(0) | CSMODE_CG(1))5964···91909291#define AUTOSUSPEND_TIMEOUT 200093929494-static inline u32 fsl_espi_read_reg(struct mpc8xxx_spi *mspi, int offset)9393+struct fsl_espi {9494+ struct device *dev;9595+ void __iomem *reg_base;9696+9797+ struct list_head *m_transfers;9898+ struct spi_transfer *tx_t;9999+ unsigned int tx_pos;100100+ bool tx_done;101101+ struct spi_transfer *rx_t;102102+ unsigned int rx_pos;103103+ bool rx_done;104104+105105+ bool swab;106106+ unsigned int rxskip;107107+108108+ spinlock_t lock;109109+110110+ u32 spibrg; /* SPIBRG input clock */111111+112112+ struct completion done;113113+};114114+115115+struct fsl_espi_cs {116116+ u32 hw_mode;117117+};118118+119119+static inline u32 fsl_espi_read_reg(struct fsl_espi *espi, int offset)95120{9696- return ioread32be(mspi->reg_base + offset);121121+ return ioread32be(espi->reg_base + offset);97122}981239999-static inline u8 fsl_espi_read_reg8(struct mpc8xxx_spi *mspi, int offset)124124+static inline u16 fsl_espi_read_reg16(struct fsl_espi *espi, int offset)100125{101101- return ioread8(mspi->reg_base + offset);126126+ return ioread16be(espi->reg_base + offset);102127}103128104104-static inline void fsl_espi_write_reg(struct mpc8xxx_spi *mspi, int offset,129129+static inline u8 fsl_espi_read_reg8(struct fsl_espi *espi, int offset)130130+{131131+ return ioread8(espi->reg_base + offset);132132+}133133+134134+static inline void fsl_espi_write_reg(struct fsl_espi *espi, int offset,105135 u32 val)106136{107107- iowrite32be(val, mspi->reg_base + offset);137137+ iowrite32be(val, espi->reg_base + offset);108138}109139110110-static inline void fsl_espi_write_reg8(struct mpc8xxx_spi *mspi, int offset,140140+static inline void fsl_espi_write_reg16(struct fsl_espi *espi, int offset,141141+ u16 val)142142+{143143+ iowrite16be(val, espi->reg_base + offset);144144+}145145+146146+static inline void fsl_espi_write_reg8(struct fsl_espi *espi, int offset,111147 u8 val)112148{113113- iowrite8(val, mspi->reg_base + offset);114114-}115115-116116-static void fsl_espi_copy_to_buf(struct spi_message *m,117117- struct mpc8xxx_spi *mspi)118118-{119119- struct spi_transfer *t;120120- u8 *buf = mspi->local_buf;121121-122122- list_for_each_entry(t, &m->transfers, transfer_list) {123123- if (t->tx_buf)124124- memcpy(buf, t->tx_buf, t->len);125125- else126126- memset(buf, 0, t->len);127127- buf += t->len;128128- }129129-}130130-131131-static void fsl_espi_copy_from_buf(struct spi_message *m,132132- struct mpc8xxx_spi *mspi)133133-{134134- struct spi_transfer *t;135135- u8 *buf = mspi->local_buf;136136-137137- list_for_each_entry(t, &m->transfers, transfer_list) {138138- if (t->rx_buf)139139- memcpy(t->rx_buf, buf, t->len);140140- buf += t->len;141141- }149149+ iowrite8(val, espi->reg_base + offset);142150}143151144152static int fsl_espi_check_message(struct spi_message *m)145153{146146- struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);154154+ struct fsl_espi *espi = spi_master_get_devdata(m->spi->master);147155 struct spi_transfer *t, *first;148156149157 if (m->frame_length > SPCOM_TRANLEN_MAX) {150150- dev_err(mspi->dev, "message too long, size is %u bytes\n",158158+ dev_err(espi->dev, "message too long, size is %u bytes\n",151159 m->frame_length);152160 return -EMSGSIZE;153161 }154162155163 first = list_first_entry(&m->transfers, struct spi_transfer,156164 transfer_list);165165+157166 list_for_each_entry(t, &m->transfers, transfer_list) {158167 if (first->bits_per_word != t->bits_per_word ||159168 first->speed_hz != t->speed_hz) {160160- dev_err(mspi->dev, "bits_per_word/speed_hz should be the same for all transfers\n");169169+ dev_err(espi->dev, "bits_per_word/speed_hz should be the same for all transfers\n");161170 return -EINVAL;162171 }172172+ }173173+174174+ /* ESPI supports MSB-first transfers for word size 8 / 16 only */175175+ if (!(m->spi->mode & SPI_LSB_FIRST) && first->bits_per_word != 8 &&176176+ first->bits_per_word != 16) {177177+ dev_err(espi->dev,178178+ "MSB-first transfer not supported for wordsize %u\n",179179+ first->bits_per_word);180180+ return -EINVAL;163181 }164182165183 return 0;166184}167185168168-static void fsl_espi_change_mode(struct spi_device *spi)186186+static unsigned int fsl_espi_check_rxskip_mode(struct spi_message *m)169187{170170- struct mpc8xxx_spi *mspi = spi_master_get_devdata(spi->master);171171- struct spi_mpc8xxx_cs *cs = spi->controller_state;172172- u32 tmp;173173- unsigned long flags;188188+ struct spi_transfer *t;189189+ unsigned int i = 0, rxskip = 0;174190175175- /* Turn off IRQs locally to minimize time that SPI is disabled. */176176- local_irq_save(flags);191191+ /*192192+ * prerequisites for ESPI rxskip mode:193193+ * - message has two transfers194194+ * - first transfer is a write and second is a read195195+ *196196+ * In addition the current low-level transfer mechanism requires197197+ * that the rxskip bytes fit into the TX FIFO. Else the transfer198198+ * would hang because after the first FSL_ESPI_FIFO_SIZE bytes199199+ * the TX FIFO isn't re-filled.200200+ */201201+ list_for_each_entry(t, &m->transfers, transfer_list) {202202+ if (i == 0) {203203+ if (!t->tx_buf || t->rx_buf ||204204+ t->len > FSL_ESPI_FIFO_SIZE)205205+ return 0;206206+ rxskip = t->len;207207+ } else if (i == 1) {208208+ if (t->tx_buf || !t->rx_buf)209209+ return 0;210210+ }211211+ i++;212212+ }177213178178- /* Turn off SPI unit prior changing mode */179179- tmp = fsl_espi_read_reg(mspi, ESPI_SPMODE);180180- fsl_espi_write_reg(mspi, ESPI_SPMODE, tmp & ~SPMODE_ENABLE);181181- fsl_espi_write_reg(mspi, ESPI_SPMODEx(spi->chip_select),182182- cs->hw_mode);183183- fsl_espi_write_reg(mspi, ESPI_SPMODE, tmp);184184-185185- local_irq_restore(flags);214214+ return i == 2 ? rxskip : 0;186215}187216188188-static u32 fsl_espi_tx_buf_lsb(struct mpc8xxx_spi *mpc8xxx_spi)217217+static void fsl_espi_fill_tx_fifo(struct fsl_espi *espi, u32 events)189218{190190- u32 data;191191- u16 data_h;192192- u16 data_l;193193- const u32 *tx = mpc8xxx_spi->tx;219219+ u32 tx_fifo_avail;220220+ unsigned int tx_left;221221+ const void *tx_buf;194222195195- if (!tx)196196- return 0;223223+ /* if events is zero transfer has not started and tx fifo is empty */224224+ tx_fifo_avail = events ? SPIE_TXCNT(events) : FSL_ESPI_FIFO_SIZE;225225+start:226226+ tx_left = espi->tx_t->len - espi->tx_pos;227227+ tx_buf = espi->tx_t->tx_buf;228228+ while (tx_fifo_avail >= min(4U, tx_left) && tx_left) {229229+ if (tx_left >= 4) {230230+ if (!tx_buf)231231+ fsl_espi_write_reg(espi, ESPI_SPITF, 0);232232+ else if (espi->swab)233233+ fsl_espi_write_reg(espi, ESPI_SPITF,234234+ swahb32p(tx_buf + espi->tx_pos));235235+ else236236+ fsl_espi_write_reg(espi, ESPI_SPITF,237237+ *(u32 *)(tx_buf + espi->tx_pos));238238+ espi->tx_pos += 4;239239+ tx_left -= 4;240240+ tx_fifo_avail -= 4;241241+ } else if (tx_left >= 2 && tx_buf && espi->swab) {242242+ fsl_espi_write_reg16(espi, ESPI_SPITF,243243+ swab16p(tx_buf + espi->tx_pos));244244+ espi->tx_pos += 2;245245+ tx_left -= 2;246246+ tx_fifo_avail -= 2;247247+ } else {248248+ if (!tx_buf)249249+ fsl_espi_write_reg8(espi, ESPI_SPITF, 0);250250+ else251251+ fsl_espi_write_reg8(espi, ESPI_SPITF,252252+ *(u8 *)(tx_buf + espi->tx_pos));253253+ espi->tx_pos += 1;254254+ tx_left -= 1;255255+ tx_fifo_avail -= 1;256256+ }257257+ }197258198198- data = *tx++ << mpc8xxx_spi->tx_shift;199199- data_l = data & 0xffff;200200- data_h = (data >> 16) & 0xffff;201201- swab16s(&data_l);202202- swab16s(&data_h);203203- data = data_h | data_l;259259+ if (!tx_left) {260260+ /* Last transfer finished, in rxskip mode only one is needed */261261+ if (list_is_last(&espi->tx_t->transfer_list,262262+ espi->m_transfers) || espi->rxskip) {263263+ espi->tx_done = true;264264+ return;265265+ }266266+ espi->tx_t = list_next_entry(espi->tx_t, transfer_list);267267+ espi->tx_pos = 0;268268+ /* continue with next transfer if tx fifo is not full */269269+ if (tx_fifo_avail)270270+ goto start;271271+ }272272+}204273205205- mpc8xxx_spi->tx = tx;206206- return data;274274+static void fsl_espi_read_rx_fifo(struct fsl_espi *espi, u32 events)275275+{276276+ u32 rx_fifo_avail = SPIE_RXCNT(events);277277+ unsigned int rx_left;278278+ void *rx_buf;279279+280280+start:281281+ rx_left = espi->rx_t->len - espi->rx_pos;282282+ rx_buf = espi->rx_t->rx_buf;283283+ while (rx_fifo_avail >= min(4U, rx_left) && rx_left) {284284+ if (rx_left >= 4) {285285+ u32 val = fsl_espi_read_reg(espi, ESPI_SPIRF);286286+287287+ if (rx_buf && espi->swab)288288+ *(u32 *)(rx_buf + espi->rx_pos) = swahb32(val);289289+ else if (rx_buf)290290+ *(u32 *)(rx_buf + espi->rx_pos) = val;291291+ espi->rx_pos += 4;292292+ rx_left -= 4;293293+ rx_fifo_avail -= 4;294294+ } else if (rx_left >= 2 && rx_buf && espi->swab) {295295+ u16 val = fsl_espi_read_reg16(espi, ESPI_SPIRF);296296+297297+ *(u16 *)(rx_buf + espi->rx_pos) = swab16(val);298298+ espi->rx_pos += 2;299299+ rx_left -= 2;300300+ rx_fifo_avail -= 2;301301+ } else {302302+ u8 val = fsl_espi_read_reg8(espi, ESPI_SPIRF);303303+304304+ if (rx_buf)305305+ *(u8 *)(rx_buf + espi->rx_pos) = val;306306+ espi->rx_pos += 1;307307+ rx_left -= 1;308308+ rx_fifo_avail -= 1;309309+ }310310+ }311311+312312+ if (!rx_left) {313313+ if (list_is_last(&espi->rx_t->transfer_list,314314+ espi->m_transfers)) {315315+ espi->rx_done = true;316316+ return;317317+ }318318+ espi->rx_t = list_next_entry(espi->rx_t, transfer_list);319319+ espi->rx_pos = 0;320320+ /* continue with next transfer if rx fifo is not empty */321321+ if (rx_fifo_avail)322322+ goto start;323323+ }207324}208325209326static void fsl_espi_setup_transfer(struct spi_device *spi,210327 struct spi_transfer *t)211328{212212- struct mpc8xxx_spi *mpc8xxx_spi = spi_master_get_devdata(spi->master);329329+ struct fsl_espi *espi = spi_master_get_devdata(spi->master);213330 int bits_per_word = t ? t->bits_per_word : spi->bits_per_word;214214- u32 hz = t ? t->speed_hz : spi->max_speed_hz;215215- u8 pm;216216- struct spi_mpc8xxx_cs *cs = spi->controller_state;217217-218218- cs->rx_shift = 0;219219- cs->tx_shift = 0;220220- cs->get_rx = mpc8xxx_spi_rx_buf_u32;221221- cs->get_tx = mpc8xxx_spi_tx_buf_u32;222222- if (bits_per_word <= 8) {223223- cs->rx_shift = 8 - bits_per_word;224224- } else {225225- cs->rx_shift = 16 - bits_per_word;226226- if (spi->mode & SPI_LSB_FIRST)227227- cs->get_tx = fsl_espi_tx_buf_lsb;228228- }229229-230230- mpc8xxx_spi->rx_shift = cs->rx_shift;231231- mpc8xxx_spi->tx_shift = cs->tx_shift;232232- mpc8xxx_spi->get_rx = cs->get_rx;233233- mpc8xxx_spi->get_tx = cs->get_tx;331331+ u32 pm, hz = t ? t->speed_hz : spi->max_speed_hz;332332+ struct fsl_espi_cs *cs = spi_get_ctldata(spi);333333+ u32 hw_mode_old = cs->hw_mode;234334235335 /* mask out bits we are going to set */236336 cs->hw_mode &= ~(CSMODE_LEN(0xF) | CSMODE_DIV16 | CSMODE_PM(0xF));237337238338 cs->hw_mode |= CSMODE_LEN(bits_per_word - 1);239339240240- if ((mpc8xxx_spi->spibrg / hz) > 64) {241241- cs->hw_mode |= CSMODE_DIV16;242242- pm = DIV_ROUND_UP(mpc8xxx_spi->spibrg, hz * 16 * 4);340340+ pm = DIV_ROUND_UP(espi->spibrg, hz * 4) - 1;243341244244- WARN_ONCE(pm > 33, "%s: Requested speed is too low: %d Hz. "245245- "Will use %d Hz instead.\n", dev_name(&spi->dev),246246- hz, mpc8xxx_spi->spibrg / (4 * 16 * (32 + 1)));247247- if (pm > 33)248248- pm = 33;249249- } else {250250- pm = DIV_ROUND_UP(mpc8xxx_spi->spibrg, hz * 4);342342+ if (pm > 15) {343343+ cs->hw_mode |= CSMODE_DIV16;344344+ pm = DIV_ROUND_UP(espi->spibrg, hz * 16 * 4) - 1;251345 }252252- if (pm)253253- pm--;254254- if (pm < 2)255255- pm = 2;256346257347 cs->hw_mode |= CSMODE_PM(pm);258348259259- fsl_espi_change_mode(spi);349349+ /* don't write the mode register if the mode doesn't change */350350+ if (cs->hw_mode != hw_mode_old)351351+ fsl_espi_write_reg(espi, ESPI_SPMODEx(spi->chip_select),352352+ cs->hw_mode);260353}261354262355static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)263356{264264- struct mpc8xxx_spi *mpc8xxx_spi = spi_master_get_devdata(spi->master);265265- u32 word;357357+ struct fsl_espi *espi = spi_master_get_devdata(spi->master);358358+ unsigned int rx_len = t->len;359359+ u32 mask, spcom;266360 int ret;267361268268- mpc8xxx_spi->len = t->len;269269- mpc8xxx_spi->count = roundup(t->len, 4) / 4;270270-271271- mpc8xxx_spi->tx = t->tx_buf;272272- mpc8xxx_spi->rx = t->rx_buf;273273-274274- reinit_completion(&mpc8xxx_spi->done);362362+ reinit_completion(&espi->done);275363276364 /* Set SPCOM[CS] and SPCOM[TRANLEN] field */277277- fsl_espi_write_reg(mpc8xxx_spi, ESPI_SPCOM,278278- (SPCOM_CS(spi->chip_select) | SPCOM_TRANLEN(t->len - 1)));365365+ spcom = SPCOM_CS(spi->chip_select);366366+ spcom |= SPCOM_TRANLEN(t->len - 1);279367280280- /* enable rx ints */281281- fsl_espi_write_reg(mpc8xxx_spi, ESPI_SPIM, SPIM_RNE);368368+ /* configure RXSKIP mode */369369+ if (espi->rxskip) {370370+ spcom |= SPCOM_RXSKIP(espi->rxskip);371371+ rx_len = t->len - espi->rxskip;372372+ if (t->rx_nbits == SPI_NBITS_DUAL)373373+ spcom |= SPCOM_DO;374374+ }282375283283- /* transmit word */284284- word = mpc8xxx_spi->get_tx(mpc8xxx_spi);285285- fsl_espi_write_reg(mpc8xxx_spi, ESPI_SPITF, word);376376+ fsl_espi_write_reg(espi, ESPI_SPCOM, spcom);377377+378378+ /* enable interrupts */379379+ mask = SPIM_DON;380380+ if (rx_len > FSL_ESPI_FIFO_SIZE)381381+ mask |= SPIM_RXT;382382+ fsl_espi_write_reg(espi, ESPI_SPIM, mask);383383+384384+ /* Prevent filling the fifo from getting interrupted */385385+ spin_lock_irq(&espi->lock);386386+ fsl_espi_fill_tx_fifo(espi, 0);387387+ spin_unlock_irq(&espi->lock);286388287389 /* Won't hang up forever, SPI bus sometimes got lost interrupts... */288288- ret = wait_for_completion_timeout(&mpc8xxx_spi->done, 2 * HZ);390390+ ret = wait_for_completion_timeout(&espi->done, 2 * HZ);289391 if (ret == 0)290290- dev_err(mpc8xxx_spi->dev,291291- "Transaction hanging up (left %d bytes)\n",292292- mpc8xxx_spi->count);392392+ dev_err(espi->dev, "Transfer timed out!\n");293393294394 /* disable rx ints */295295- fsl_espi_write_reg(mpc8xxx_spi, ESPI_SPIM, 0);395395+ fsl_espi_write_reg(espi, ESPI_SPIM, 0);296396297297- return mpc8xxx_spi->count > 0 ? -EMSGSIZE : 0;397397+ return ret == 0 ? -ETIMEDOUT : 0;298398}299399300400static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans)301401{302302- struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);402402+ struct fsl_espi *espi = spi_master_get_devdata(m->spi->master);303403 struct spi_device *spi = m->spi;304404 int ret;305405306306- fsl_espi_copy_to_buf(m, mspi);406406+ /* In case of LSB-first and bits_per_word > 8 byte-swap all words */407407+ espi->swab = spi->mode & SPI_LSB_FIRST && trans->bits_per_word > 8;408408+409409+ espi->m_transfers = &m->transfers;410410+ espi->tx_t = list_first_entry(&m->transfers, struct spi_transfer,411411+ transfer_list);412412+ espi->tx_pos = 0;413413+ espi->tx_done = false;414414+ espi->rx_t = list_first_entry(&m->transfers, struct spi_transfer,415415+ transfer_list);416416+ espi->rx_pos = 0;417417+ espi->rx_done = false;418418+419419+ espi->rxskip = fsl_espi_check_rxskip_mode(m);420420+ if (trans->rx_nbits == SPI_NBITS_DUAL && !espi->rxskip) {421421+ dev_err(espi->dev, "Dual output mode requires RXSKIP mode!\n");422422+ return -EINVAL;423423+ }424424+425425+ /* In RXSKIP mode skip first transfer for reads */426426+ if (espi->rxskip)427427+ espi->rx_t = list_next_entry(espi->rx_t, transfer_list);428428+307429 fsl_espi_setup_transfer(spi, trans);308430309431 ret = fsl_espi_bufs(spi, trans);···434310 if (trans->delay_usecs)435311 udelay(trans->delay_usecs);436312437437- fsl_espi_setup_transfer(spi, NULL);438438-439439- if (!ret)440440- fsl_espi_copy_from_buf(m, mspi);441441-442313 return ret;443314}444315445316static int fsl_espi_do_one_msg(struct spi_master *master,446317 struct spi_message *m)447318{448448- struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);449449- unsigned int delay_usecs = 0;319319+ unsigned int delay_usecs = 0, rx_nbits = 0;450320 struct spi_transfer *t, trans = {};451321 int ret;452322···451333 list_for_each_entry(t, &m->transfers, transfer_list) {452334 if (t->delay_usecs > delay_usecs)453335 delay_usecs = t->delay_usecs;336336+ if (t->rx_nbits > rx_nbits)337337+ rx_nbits = t->rx_nbits;454338 }455339456340 t = list_first_entry(&m->transfers, struct spi_transfer,···462342 trans.speed_hz = t->speed_hz;463343 trans.bits_per_word = t->bits_per_word;464344 trans.delay_usecs = delay_usecs;465465- trans.tx_buf = mspi->local_buf;466466- trans.rx_buf = mspi->local_buf;345345+ trans.rx_nbits = rx_nbits;467346468347 if (trans.len)469348 ret = fsl_espi_trans(m, &trans);···479360480361static int fsl_espi_setup(struct spi_device *spi)481362{482482- struct mpc8xxx_spi *mpc8xxx_spi;363363+ struct fsl_espi *espi;483364 u32 loop_mode;484484- struct spi_mpc8xxx_cs *cs = spi_get_ctldata(spi);485485-486486- if (!spi->max_speed_hz)487487- return -EINVAL;365365+ struct fsl_espi_cs *cs = spi_get_ctldata(spi);488366489367 if (!cs) {490368 cs = kzalloc(sizeof(*cs), GFP_KERNEL);···490374 spi_set_ctldata(spi, cs);491375 }492376493493- mpc8xxx_spi = spi_master_get_devdata(spi->master);377377+ espi = spi_master_get_devdata(spi->master);494378495495- pm_runtime_get_sync(mpc8xxx_spi->dev);379379+ pm_runtime_get_sync(espi->dev);496380497497- cs->hw_mode = fsl_espi_read_reg(mpc8xxx_spi,498498- ESPI_SPMODEx(spi->chip_select));381381+ cs->hw_mode = fsl_espi_read_reg(espi, ESPI_SPMODEx(spi->chip_select));499382 /* mask out bits we are going to set */500383 cs->hw_mode &= ~(CSMODE_CP_BEGIN_EDGECLK | CSMODE_CI_INACTIVEHIGH501384 | CSMODE_REV);···507392 cs->hw_mode |= CSMODE_REV;508393509394 /* Handle the loop mode */510510- loop_mode = fsl_espi_read_reg(mpc8xxx_spi, ESPI_SPMODE);395395+ loop_mode = fsl_espi_read_reg(espi, ESPI_SPMODE);511396 loop_mode &= ~SPMODE_LOOP;512397 if (spi->mode & SPI_LOOP)513398 loop_mode |= SPMODE_LOOP;514514- fsl_espi_write_reg(mpc8xxx_spi, ESPI_SPMODE, loop_mode);399399+ fsl_espi_write_reg(espi, ESPI_SPMODE, loop_mode);515400516401 fsl_espi_setup_transfer(spi, NULL);517402518518- pm_runtime_mark_last_busy(mpc8xxx_spi->dev);519519- pm_runtime_put_autosuspend(mpc8xxx_spi->dev);403403+ pm_runtime_mark_last_busy(espi->dev);404404+ pm_runtime_put_autosuspend(espi->dev);520405521406 return 0;522407}523408524409static void fsl_espi_cleanup(struct spi_device *spi)525410{526526- struct spi_mpc8xxx_cs *cs = spi_get_ctldata(spi);411411+ struct fsl_espi_cs *cs = spi_get_ctldata(spi);527412528413 kfree(cs);529414 spi_set_ctldata(spi, NULL);530415}531416532532-static void fsl_espi_cpu_irq(struct mpc8xxx_spi *mspi, u32 events)417417+static void fsl_espi_cpu_irq(struct fsl_espi *espi, u32 events)533418{534534- /* We need handle RX first */535535- if (events & SPIE_RNE) {536536- u32 rx_data, tmp;537537- u8 rx_data_8;538538- int rx_nr_bytes = 4;539539- int ret;419419+ if (!espi->rx_done)420420+ fsl_espi_read_rx_fifo(espi, events);540421541541- /* Spin until RX is done */542542- if (SPIE_RXCNT(events) < min(4, mspi->len)) {543543- ret = spin_event_timeout(544544- !(SPIE_RXCNT(events =545545- fsl_espi_read_reg(mspi, ESPI_SPIE)) <546546- min(4, mspi->len)),547547- 10000, 0); /* 10 msec */548548- if (!ret)549549- dev_err(mspi->dev,550550- "tired waiting for SPIE_RXCNT\n");551551- }422422+ if (!espi->tx_done)423423+ fsl_espi_fill_tx_fifo(espi, events);552424553553- if (mspi->len >= 4) {554554- rx_data = fsl_espi_read_reg(mspi, ESPI_SPIRF);555555- } else if (mspi->len <= 0) {556556- dev_err(mspi->dev,557557- "unexpected RX(SPIE_RNE) interrupt occurred,\n"558558- "(local rxlen %d bytes, reg rxlen %d bytes)\n",559559- min(4, mspi->len), SPIE_RXCNT(events));560560- rx_nr_bytes = 0;561561- } else {562562- rx_nr_bytes = mspi->len;563563- tmp = mspi->len;564564- rx_data = 0;565565- while (tmp--) {566566- rx_data_8 = fsl_espi_read_reg8(mspi,567567- ESPI_SPIRF);568568- rx_data |= (rx_data_8 << (tmp * 8));569569- }425425+ if (!espi->tx_done || !espi->rx_done)426426+ return;570427571571- rx_data <<= (4 - mspi->len) * 8;572572- }428428+ /* we're done, but check for errors before returning */429429+ events = fsl_espi_read_reg(espi, ESPI_SPIE);573430574574- mspi->len -= rx_nr_bytes;431431+ if (!(events & SPIE_DON))432432+ dev_err(espi->dev,433433+ "Transfer done but SPIE_DON isn't set!\n");575434576576- if (rx_nr_bytes && mspi->rx)577577- mspi->get_rx(rx_data, mspi);578578- }435435+ if (SPIE_RXCNT(events) || SPIE_TXCNT(events) != FSL_ESPI_FIFO_SIZE)436436+ dev_err(espi->dev, "Transfer done but rx/tx fifo's aren't empty!\n");579437580580- if (!(events & SPIE_TNF)) {581581- int ret;582582-583583- /* spin until TX is done */584584- ret = spin_event_timeout(((events = fsl_espi_read_reg(585585- mspi, ESPI_SPIE)) & SPIE_TNF), 1000, 0);586586- if (!ret) {587587- dev_err(mspi->dev, "tired waiting for SPIE_TNF\n");588588- complete(&mspi->done);589589- return;590590- }591591- }592592-593593- mspi->count -= 1;594594- if (mspi->count) {595595- u32 word = mspi->get_tx(mspi);596596-597597- fsl_espi_write_reg(mspi, ESPI_SPITF, word);598598- } else {599599- complete(&mspi->done);600600- }438438+ complete(&espi->done);601439}602440603441static irqreturn_t fsl_espi_irq(s32 irq, void *context_data)604442{605605- struct mpc8xxx_spi *mspi = context_data;443443+ struct fsl_espi *espi = context_data;606444 u32 events;607445446446+ spin_lock(&espi->lock);447447+608448 /* Get interrupt events(tx/rx) */609609- events = fsl_espi_read_reg(mspi, ESPI_SPIE);610610- if (!events)449449+ events = fsl_espi_read_reg(espi, ESPI_SPIE);450450+ if (!events) {451451+ spin_unlock(&espi->lock);611452 return IRQ_NONE;453453+ }612454613613- dev_vdbg(mspi->dev, "%s: events %x\n", __func__, events);455455+ dev_vdbg(espi->dev, "%s: events %x\n", __func__, events);614456615615- fsl_espi_cpu_irq(mspi, events);457457+ fsl_espi_cpu_irq(espi, events);616458617459 /* Clear the events */618618- fsl_espi_write_reg(mspi, ESPI_SPIE, events);460460+ fsl_espi_write_reg(espi, ESPI_SPIE, events);461461+462462+ spin_unlock(&espi->lock);619463620464 return IRQ_HANDLED;621465}···583509static int fsl_espi_runtime_suspend(struct device *dev)584510{585511 struct spi_master *master = dev_get_drvdata(dev);586586- struct mpc8xxx_spi *mpc8xxx_spi = spi_master_get_devdata(master);512512+ struct fsl_espi *espi = spi_master_get_devdata(master);587513 u32 regval;588514589589- regval = fsl_espi_read_reg(mpc8xxx_spi, ESPI_SPMODE);515515+ regval = fsl_espi_read_reg(espi, ESPI_SPMODE);590516 regval &= ~SPMODE_ENABLE;591591- fsl_espi_write_reg(mpc8xxx_spi, ESPI_SPMODE, regval);517517+ fsl_espi_write_reg(espi, ESPI_SPMODE, regval);592518593519 return 0;594520}···596522static int fsl_espi_runtime_resume(struct device *dev)597523{598524 struct spi_master *master = dev_get_drvdata(dev);599599- struct mpc8xxx_spi *mpc8xxx_spi = spi_master_get_devdata(master);525525+ struct fsl_espi *espi = spi_master_get_devdata(master);600526 u32 regval;601527602602- regval = fsl_espi_read_reg(mpc8xxx_spi, ESPI_SPMODE);528528+ regval = fsl_espi_read_reg(espi, ESPI_SPMODE);603529 regval |= SPMODE_ENABLE;604604- fsl_espi_write_reg(mpc8xxx_spi, ESPI_SPMODE, regval);530530+ fsl_espi_write_reg(espi, ESPI_SPMODE, regval);605531606532 return 0;607533}···612538 return SPCOM_TRANLEN_MAX;613539}614540615615-static int fsl_espi_probe(struct device *dev, struct resource *mem,616616- unsigned int irq)541541+static void fsl_espi_init_regs(struct device *dev, bool initial)617542{618618- struct fsl_spi_platform_data *pdata = dev_get_platdata(dev);619619- struct spi_master *master;620620- struct mpc8xxx_spi *mpc8xxx_spi;543543+ struct spi_master *master = dev_get_drvdata(dev);544544+ struct fsl_espi *espi = spi_master_get_devdata(master);621545 struct device_node *nc;622622- const __be32 *prop;623623- u32 regval, csmode;624624- int i, len, ret;546546+ u32 csmode, cs, prop;547547+ int ret;625548626626- master = spi_alloc_master(dev, sizeof(struct mpc8xxx_spi));549549+ /* SPI controller initializations */550550+ fsl_espi_write_reg(espi, ESPI_SPMODE, 0);551551+ fsl_espi_write_reg(espi, ESPI_SPIM, 0);552552+ fsl_espi_write_reg(espi, ESPI_SPCOM, 0);553553+ fsl_espi_write_reg(espi, ESPI_SPIE, 0xffffffff);554554+555555+ /* Init eSPI CS mode register */556556+ for_each_available_child_of_node(master->dev.of_node, nc) {557557+ /* get chip select */558558+ ret = of_property_read_u32(nc, "reg", &cs);559559+ if (ret || cs >= master->num_chipselect)560560+ continue;561561+562562+ csmode = CSMODE_INIT_VAL;563563+564564+ /* check if CSBEF is set in device tree */565565+ ret = of_property_read_u32(nc, "fsl,csbef", &prop);566566+ if (!ret) {567567+ csmode &= ~(CSMODE_BEF(0xf));568568+ csmode |= CSMODE_BEF(prop);569569+ }570570+571571+ /* check if CSAFT is set in device tree */572572+ ret = of_property_read_u32(nc, "fsl,csaft", &prop);573573+ if (!ret) {574574+ csmode &= ~(CSMODE_AFT(0xf));575575+ csmode |= CSMODE_AFT(prop);576576+ }577577+578578+ fsl_espi_write_reg(espi, ESPI_SPMODEx(cs), csmode);579579+580580+ if (initial)581581+ dev_info(dev, "cs=%u, init_csmode=0x%x\n", cs, csmode);582582+ }583583+584584+ /* Enable SPI interface */585585+ fsl_espi_write_reg(espi, ESPI_SPMODE, SPMODE_INIT_VAL | SPMODE_ENABLE);586586+}587587+588588+static int fsl_espi_probe(struct device *dev, struct resource *mem,589589+ unsigned int irq, unsigned int num_cs)590590+{591591+ struct spi_master *master;592592+ struct fsl_espi *espi;593593+ int ret;594594+595595+ master = spi_alloc_master(dev, sizeof(struct fsl_espi));627596 if (!master)628597 return -ENOMEM;629598630599 dev_set_drvdata(dev, master);631600632632- mpc8xxx_spi_probe(dev, mem, irq);633633-601601+ master->mode_bits = SPI_RX_DUAL | SPI_CPOL | SPI_CPHA | SPI_CS_HIGH |602602+ SPI_LSB_FIRST | SPI_LOOP;603603+ master->dev.of_node = dev->of_node;634604 master->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 16);635605 master->setup = fsl_espi_setup;636606 master->cleanup = fsl_espi_cleanup;637607 master->transfer_one_message = fsl_espi_do_one_msg;638608 master->auto_runtime_pm = true;639609 master->max_message_size = fsl_espi_max_message_size;610610+ master->num_chipselect = num_cs;640611641641- mpc8xxx_spi = spi_master_get_devdata(master);612612+ espi = spi_master_get_devdata(master);613613+ spin_lock_init(&espi->lock);642614643643- mpc8xxx_spi->local_buf =644644- devm_kmalloc(dev, SPCOM_TRANLEN_MAX, GFP_KERNEL);645645- if (!mpc8xxx_spi->local_buf) {646646- ret = -ENOMEM;615615+ espi->dev = dev;616616+ espi->spibrg = fsl_get_sys_freq();617617+ if (espi->spibrg == -1) {618618+ dev_err(dev, "Can't get sys frequency!\n");619619+ ret = -EINVAL;647620 goto err_probe;648621 }622622+ /* determined by clock divider fields DIV16/PM in register SPMODEx */623623+ master->min_speed_hz = DIV_ROUND_UP(espi->spibrg, 4 * 16 * 16);624624+ master->max_speed_hz = DIV_ROUND_UP(espi->spibrg, 4);649625650650- mpc8xxx_spi->reg_base = devm_ioremap_resource(dev, mem);651651- if (IS_ERR(mpc8xxx_spi->reg_base)) {652652- ret = PTR_ERR(mpc8xxx_spi->reg_base);626626+ init_completion(&espi->done);627627+628628+ espi->reg_base = devm_ioremap_resource(dev, mem);629629+ if (IS_ERR(espi->reg_base)) {630630+ ret = PTR_ERR(espi->reg_base);653631 goto err_probe;654632 }655633656634 /* Register for SPI Interrupt */657657- ret = devm_request_irq(dev, mpc8xxx_spi->irq, fsl_espi_irq,658658- 0, "fsl_espi", mpc8xxx_spi);635635+ ret = devm_request_irq(dev, irq, fsl_espi_irq, 0, "fsl_espi", espi);659636 if (ret)660637 goto err_probe;661638662662- if (mpc8xxx_spi->flags & SPI_QE_CPU_MODE) {663663- mpc8xxx_spi->rx_shift = 16;664664- mpc8xxx_spi->tx_shift = 24;665665- }666666-667667- /* SPI controller initializations */668668- fsl_espi_write_reg(mpc8xxx_spi, ESPI_SPMODE, 0);669669- fsl_espi_write_reg(mpc8xxx_spi, ESPI_SPIM, 0);670670- fsl_espi_write_reg(mpc8xxx_spi, ESPI_SPCOM, 0);671671- fsl_espi_write_reg(mpc8xxx_spi, ESPI_SPIE, 0xffffffff);672672-673673- /* Init eSPI CS mode register */674674- for_each_available_child_of_node(master->dev.of_node, nc) {675675- /* get chip select */676676- prop = of_get_property(nc, "reg", &len);677677- if (!prop || len < sizeof(*prop))678678- continue;679679- i = be32_to_cpup(prop);680680- if (i < 0 || i >= pdata->max_chipselect)681681- continue;682682-683683- csmode = CSMODE_INIT_VAL;684684- /* check if CSBEF is set in device tree */685685- prop = of_get_property(nc, "fsl,csbef", &len);686686- if (prop && len >= sizeof(*prop)) {687687- csmode &= ~(CSMODE_BEF(0xf));688688- csmode |= CSMODE_BEF(be32_to_cpup(prop));689689- }690690- /* check if CSAFT is set in device tree */691691- prop = of_get_property(nc, "fsl,csaft", &len);692692- if (prop && len >= sizeof(*prop)) {693693- csmode &= ~(CSMODE_AFT(0xf));694694- csmode |= CSMODE_AFT(be32_to_cpup(prop));695695- }696696- fsl_espi_write_reg(mpc8xxx_spi, ESPI_SPMODEx(i), csmode);697697-698698- dev_info(dev, "cs=%d, init_csmode=0x%x\n", i, csmode);699699- }700700-701701- /* Enable SPI interface */702702- regval = pdata->initial_spmode | SPMODE_INIT_VAL | SPMODE_ENABLE;703703-704704- fsl_espi_write_reg(mpc8xxx_spi, ESPI_SPMODE, regval);639639+ fsl_espi_init_regs(dev, true);705640706641 pm_runtime_set_autosuspend_delay(dev, AUTOSUSPEND_TIMEOUT);707642 pm_runtime_use_autosuspend(dev);···722639 if (ret < 0)723640 goto err_pm;724641725725- dev_info(dev, "at 0x%p (irq = %d)\n", mpc8xxx_spi->reg_base,726726- mpc8xxx_spi->irq);642642+ dev_info(dev, "at 0x%p (irq = %u)\n", espi->reg_base, irq);727643728644 pm_runtime_mark_last_busy(dev);729645 pm_runtime_put_autosuspend(dev);···741659static int of_fsl_espi_get_chipselects(struct device *dev)742660{743661 struct device_node *np = dev->of_node;744744- struct fsl_spi_platform_data *pdata = dev_get_platdata(dev);745745- const u32 *prop;746746- int len;662662+ u32 num_cs;663663+ int ret;747664748748- prop = of_get_property(np, "fsl,espi-num-chipselects", &len);749749- if (!prop || len < sizeof(*prop)) {665665+ ret = of_property_read_u32(np, "fsl,espi-num-chipselects", &num_cs);666666+ if (ret) {750667 dev_err(dev, "No 'fsl,espi-num-chipselects' property\n");751751- return -EINVAL;668668+ return 0;752669 }753670754754- pdata->max_chipselect = *prop;755755- pdata->cs_control = NULL;756756-757757- return 0;671671+ return num_cs;758672}759673760674static int of_fsl_espi_probe(struct platform_device *ofdev)···758680 struct device *dev = &ofdev->dev;759681 struct device_node *np = ofdev->dev.of_node;760682 struct resource mem;761761- unsigned int irq;683683+ unsigned int irq, num_cs;762684 int ret;763685764764- ret = of_mpc8xxx_spi_probe(ofdev);765765- if (ret)766766- return ret;686686+ if (of_property_read_bool(np, "mode")) {687687+ dev_err(dev, "mode property is not supported on ESPI!\n");688688+ return -EINVAL;689689+ }767690768768- ret = of_fsl_espi_get_chipselects(dev);769769- if (ret)770770- return ret;691691+ num_cs = of_fsl_espi_get_chipselects(dev);692692+ if (!num_cs)693693+ return -EINVAL;771694772695 ret = of_address_to_resource(np, 0, &mem);773696 if (ret)···778699 if (!irq)779700 return -EINVAL;780701781781- return fsl_espi_probe(dev, &mem, irq);702702+ return fsl_espi_probe(dev, &mem, irq, num_cs);782703}783704784705static int of_fsl_espi_remove(struct platform_device *dev)···800721 return ret;801722 }802723803803- ret = pm_runtime_force_suspend(dev);804804- if (ret < 0)805805- return ret;806806-807807- return 0;724724+ return pm_runtime_force_suspend(dev);808725}809726810727static int of_fsl_espi_resume(struct device *dev)811728{812812- struct fsl_spi_platform_data *pdata = dev_get_platdata(dev);813729 struct spi_master *master = dev_get_drvdata(dev);814814- struct mpc8xxx_spi *mpc8xxx_spi;815815- u32 regval;816816- int i, ret;730730+ int ret;817731818818- mpc8xxx_spi = spi_master_get_devdata(master);819819-820820- /* SPI controller initializations */821821- fsl_espi_write_reg(mpc8xxx_spi, ESPI_SPMODE, 0);822822- fsl_espi_write_reg(mpc8xxx_spi, ESPI_SPIM, 0);823823- fsl_espi_write_reg(mpc8xxx_spi, ESPI_SPCOM, 0);824824- fsl_espi_write_reg(mpc8xxx_spi, ESPI_SPIE, 0xffffffff);825825-826826- /* Init eSPI CS mode register */827827- for (i = 0; i < pdata->max_chipselect; i++)828828- fsl_espi_write_reg(mpc8xxx_spi, ESPI_SPMODEx(i),829829- CSMODE_INIT_VAL);830830-831831- /* Enable SPI interface */832832- regval = pdata->initial_spmode | SPMODE_INIT_VAL | SPMODE_ENABLE;833833-834834- fsl_espi_write_reg(mpc8xxx_spi, ESPI_SPMODE, regval);732732+ fsl_espi_init_regs(dev, false);835733836734 ret = pm_runtime_force_resume(dev);837735 if (ret < 0)
-4
drivers/spi/spi-fsl-lib.h
···2828 /* rx & tx bufs from the spi_transfer */2929 const void *tx;3030 void *rx;3131-#if IS_ENABLED(CONFIG_SPI_FSL_ESPI)3232- int len;3333- u8 *local_buf;3434-#endif35313632 int subblock;3733 struct spi_pram __iomem *pram;
+8-2
drivers/spi/spi.c
···10421042 if (msg->status != -EINPROGRESS)10431043 goto out;1044104410451045- if (xfer->delay_usecs)10461046- udelay(xfer->delay_usecs);10451045+ if (xfer->delay_usecs) {10461046+ u16 us = xfer->delay_usecs;10471047+10481048+ if (us <= 10)10491049+ udelay(us);10501050+ else10511051+ usleep_range(us, us + DIV_ROUND_UP(us, 10));10521052+ }1047105310481054 if (xfer->cs_change) {10491055 if (list_is_last(&xfer->transfer_list,