···3333 nodes. If unspecified, a single SPI device without a chip3434 select can be used.35353636+- dmas: Two DMA channel specifiers following the convention outlined3737+ in bindings/dma/dma.txt3838+- dma-names: Names for the dma channels, if present. There must be at3939+ least one channel named "tx" for transmit and named "rx" for4040+ receive.36413742SPI slave nodes must be children of the SPI master node and can contain3843properties described in Documentation/devicetree/bindings/spi/spi-bus.txt···55505651 clocks = <&gcc GCC_BLSP2_QUP2_SPI_APPS_CLK>, <&gcc GCC_BLSP2_AHB_CLK>;5752 clock-names = "core", "iface";5353+5454+ dmas = <&blsp1_bam 13>, <&blsp1_bam 12>;5555+ dma-names = "rx", "tx";58565957 pinctrl-names = "default";6058 pinctrl-0 = <&spi8_default>;
···2424- dmas: DMA specifiers for tx and rx dma. See the DMA client binding,2525 Documentation/devicetree/bindings/dma/dma.txt2626- dma-names: DMA request names should include "tx" and "rx" if present.2727+- rx-sample-delay-ns: nanoseconds to delay after the SCLK edge before sampling2828+ Rx data (may need to be fine tuned for high capacitance lines).2929+ No delay (0) by default.273028312932Example:···3633 reg = <0xff110000 0x1000>;3734 dmas = <&pdma1 11>, <&pdma1 12>;3835 dma-names = "tx", "rx";3636+ rx-sample-delay-ns = <10>;3937 #address-cells = <1>;4038 #size-cells = <0>;4139 interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
+304-32
drivers/spi/spi-qup.c
···2222#include <linux/platform_device.h>2323#include <linux/pm_runtime.h>2424#include <linux/spi/spi.h>2525+#include <linux/dmaengine.h>2626+#include <linux/dma-mapping.h>25272628#define QUP_CONFIG 0x00002729#define QUP_STATE 0x0004···118116119117#define SPI_NUM_CHIPSELECTS 4120118119119+#define SPI_MAX_DMA_XFER (SZ_64K - 64)120120+121121/* high speed mode is when bus rate is greater then 26MHz */122122#define SPI_HS_MIN_RATE 26000000123123#define SPI_MAX_RATE 50000000···144140 struct completion done;145141 int error;146142 int w_size; /* bytes per SPI word */143143+ int n_words;147144 int tx_bytes;148145 int rx_bytes;149146 int qup_v1;147147+148148+ int use_dma;149149+ struct dma_slave_config rx_conf;150150+ struct dma_slave_config tx_conf;150151};151152152153···206197207198 return 0;208199}209209-210200211201static void spi_qup_fifo_read(struct spi_qup *controller,212202 struct spi_transfer *xfer)···274266 }275267}276268269269+static void spi_qup_dma_done(void *data)270270+{271271+ struct spi_qup *qup = data;272272+273273+ complete(&qup->done);274274+}275275+276276+static int spi_qup_prep_sg(struct spi_master *master, struct spi_transfer *xfer,277277+ enum dma_transfer_direction dir,278278+ dma_async_tx_callback callback)279279+{280280+ struct spi_qup *qup = spi_master_get_devdata(master);281281+ unsigned long flags = DMA_PREP_INTERRUPT | DMA_PREP_FENCE;282282+ struct dma_async_tx_descriptor *desc;283283+ struct scatterlist *sgl;284284+ struct dma_chan *chan;285285+ dma_cookie_t cookie;286286+ unsigned int nents;287287+288288+ if (dir == DMA_MEM_TO_DEV) {289289+ chan = master->dma_tx;290290+ nents = xfer->tx_sg.nents;291291+ sgl = xfer->tx_sg.sgl;292292+ } else {293293+ chan = master->dma_rx;294294+ nents = xfer->rx_sg.nents;295295+ sgl = xfer->rx_sg.sgl;296296+ }297297+298298+ desc = dmaengine_prep_slave_sg(chan, sgl, nents, dir, flags);299299+ if (!desc)300300+ return -EINVAL;301301+302302+ desc->callback = callback;303303+ desc->callback_param = qup;304304+305305+ cookie = dmaengine_submit(desc);306306+307307+ return dma_submit_error(cookie);308308+}309309+310310+static void spi_qup_dma_terminate(struct spi_master *master,311311+ struct spi_transfer *xfer)312312+{313313+ if (xfer->tx_buf)314314+ dmaengine_terminate_all(master->dma_tx);315315+ if (xfer->rx_buf)316316+ dmaengine_terminate_all(master->dma_rx);317317+}318318+319319+static int spi_qup_do_dma(struct spi_master *master, struct spi_transfer *xfer)320320+{321321+ dma_async_tx_callback rx_done = NULL, tx_done = NULL;322322+ int ret;323323+324324+ if (xfer->rx_buf)325325+ rx_done = spi_qup_dma_done;326326+ else if (xfer->tx_buf)327327+ tx_done = spi_qup_dma_done;328328+329329+ if (xfer->rx_buf) {330330+ ret = spi_qup_prep_sg(master, xfer, DMA_DEV_TO_MEM, rx_done);331331+ if (ret)332332+ return ret;333333+334334+ dma_async_issue_pending(master->dma_rx);335335+ }336336+337337+ if (xfer->tx_buf) {338338+ ret = spi_qup_prep_sg(master, xfer, DMA_MEM_TO_DEV, tx_done);339339+ if (ret)340340+ return ret;341341+342342+ dma_async_issue_pending(master->dma_tx);343343+ }344344+345345+ return 0;346346+}347347+348348+static int spi_qup_do_pio(struct spi_master *master, struct spi_transfer *xfer)349349+{350350+ struct spi_qup *qup = spi_master_get_devdata(master);351351+ int ret;352352+353353+ ret = spi_qup_set_state(qup, QUP_STATE_RUN);354354+ if (ret) {355355+ dev_warn(qup->dev, "cannot set RUN state\n");356356+ return ret;357357+ }358358+359359+ ret = spi_qup_set_state(qup, QUP_STATE_PAUSE);360360+ if (ret) {361361+ dev_warn(qup->dev, "cannot set PAUSE state\n");362362+ return ret;363363+ }364364+365365+ spi_qup_fifo_write(qup, xfer);366366+367367+ return 0;368368+}369369+277370static irqreturn_t spi_qup_qup_irq(int irq, void *dev_id)278371{279372 struct spi_qup *controller = dev_id;···424315 error = -EIO;425316 }426317427427- if (opflags & QUP_OP_IN_SERVICE_FLAG)428428- spi_qup_fifo_read(controller, xfer);318318+ if (!controller->use_dma) {319319+ if (opflags & QUP_OP_IN_SERVICE_FLAG)320320+ spi_qup_fifo_read(controller, xfer);429321430430- if (opflags & QUP_OP_OUT_SERVICE_FLAG)431431- spi_qup_fifo_write(controller, xfer);322322+ if (opflags & QUP_OP_OUT_SERVICE_FLAG)323323+ spi_qup_fifo_write(controller, xfer);324324+ }432325433326 spin_lock_irqsave(&controller->lock, flags);434327 controller->error = error;···443332 return IRQ_HANDLED;444333}445334335335+static u32336336+spi_qup_get_mode(struct spi_master *master, struct spi_transfer *xfer)337337+{338338+ struct spi_qup *qup = spi_master_get_devdata(master);339339+ u32 mode;340340+341341+ qup->w_size = 4;342342+343343+ if (xfer->bits_per_word <= 8)344344+ qup->w_size = 1;345345+ else if (xfer->bits_per_word <= 16)346346+ qup->w_size = 2;347347+348348+ qup->n_words = xfer->len / qup->w_size;349349+350350+ if (qup->n_words <= (qup->in_fifo_sz / sizeof(u32)))351351+ mode = QUP_IO_M_MODE_FIFO;352352+ else353353+ mode = QUP_IO_M_MODE_BLOCK;354354+355355+ return mode;356356+}446357447358/* set clock freq ... bits per word */448359static int spi_qup_io_config(struct spi_device *spi, struct spi_transfer *xfer)449360{450361 struct spi_qup *controller = spi_master_get_devdata(spi->master);451362 u32 config, iomode, mode, control;452452- int ret, n_words, w_size;363363+ int ret, n_words;453364454365 if (spi->mode & SPI_LOOP && xfer->len > controller->in_fifo_sz) {455366 dev_err(controller->dev, "too big size for loopback %d > %d\n",···491358 return -EIO;492359 }493360494494- w_size = 4;495495- if (xfer->bits_per_word <= 8)496496- w_size = 1;497497- else if (xfer->bits_per_word <= 16)498498- w_size = 2;361361+ mode = spi_qup_get_mode(spi->master, xfer);362362+ n_words = controller->n_words;499363500500- n_words = xfer->len / w_size;501501- controller->w_size = w_size;502502-503503- if (n_words <= (controller->in_fifo_sz / sizeof(u32))) {504504- mode = QUP_IO_M_MODE_FIFO;364364+ if (mode == QUP_IO_M_MODE_FIFO) {505365 writel_relaxed(n_words, controller->base + QUP_MX_READ_CNT);506366 writel_relaxed(n_words, controller->base + QUP_MX_WRITE_CNT);507367 /* must be zero for FIFO */508368 writel_relaxed(0, controller->base + QUP_MX_INPUT_CNT);509369 writel_relaxed(0, controller->base + QUP_MX_OUTPUT_CNT);510510- } else {511511- mode = QUP_IO_M_MODE_BLOCK;370370+ } else if (!controller->use_dma) {512371 writel_relaxed(n_words, controller->base + QUP_MX_INPUT_CNT);513372 writel_relaxed(n_words, controller->base + QUP_MX_OUTPUT_CNT);514373 /* must be zero for BLOCK and BAM */515374 writel_relaxed(0, controller->base + QUP_MX_READ_CNT);516375 writel_relaxed(0, controller->base + QUP_MX_WRITE_CNT);376376+ } else {377377+ mode = QUP_IO_M_MODE_BAM;378378+ writel_relaxed(0, controller->base + QUP_MX_READ_CNT);379379+ writel_relaxed(0, controller->base + QUP_MX_WRITE_CNT);380380+381381+ if (!controller->qup_v1) {382382+ void __iomem *input_cnt;383383+384384+ input_cnt = controller->base + QUP_MX_INPUT_CNT;385385+ /*386386+ * for DMA transfers, both QUP_MX_INPUT_CNT and387387+ * QUP_MX_OUTPUT_CNT must be zero to all cases but one.388388+ * That case is a non-balanced transfer when there is389389+ * only a rx_buf.390390+ */391391+ if (xfer->tx_buf)392392+ writel_relaxed(0, input_cnt);393393+ else394394+ writel_relaxed(n_words, input_cnt);395395+396396+ writel_relaxed(0, controller->base + QUP_MX_OUTPUT_CNT);397397+ }517398 }518399519400 iomode = readl_relaxed(controller->base + QUP_IO_M_MODES);520401 /* Set input and output transfer mode */521402 iomode &= ~(QUP_IO_M_INPUT_MODE_MASK | QUP_IO_M_OUTPUT_MODE_MASK);522522- iomode &= ~(QUP_IO_M_PACK_EN | QUP_IO_M_UNPACK_EN);403403+404404+ if (!controller->use_dma)405405+ iomode &= ~(QUP_IO_M_PACK_EN | QUP_IO_M_UNPACK_EN);406406+ else407407+ iomode |= QUP_IO_M_PACK_EN | QUP_IO_M_UNPACK_EN;408408+523409 iomode |= (mode << QUP_IO_M_OUTPUT_MODE_MASK_SHIFT);524410 iomode |= (mode << QUP_IO_M_INPUT_MODE_MASK_SHIFT);525411···580428 config &= ~(QUP_CONFIG_NO_INPUT | QUP_CONFIG_NO_OUTPUT | QUP_CONFIG_N);581429 config |= xfer->bits_per_word - 1;582430 config |= QUP_CONFIG_SPI_MODE;431431+432432+ if (controller->use_dma) {433433+ if (!xfer->tx_buf)434434+ config |= QUP_CONFIG_NO_OUTPUT;435435+ if (!xfer->rx_buf)436436+ config |= QUP_CONFIG_NO_INPUT;437437+ }438438+583439 writel_relaxed(config, controller->base + QUP_CONFIG);584440585441 /* only write to OPERATIONAL_MASK when register is present */586586- if (!controller->qup_v1)587587- writel_relaxed(0, controller->base + QUP_OPERATIONAL_MASK);442442+ if (!controller->qup_v1) {443443+ u32 mask = 0;444444+445445+ /*446446+ * mask INPUT and OUTPUT service flags to prevent IRQs on FIFO447447+ * status change in BAM mode448448+ */449449+450450+ if (mode == QUP_IO_M_MODE_BAM)451451+ mask = QUP_OP_IN_SERVICE_FLAG | QUP_OP_OUT_SERVICE_FLAG;452452+453453+ writel_relaxed(mask, controller->base + QUP_OPERATIONAL_MASK);454454+ }455455+588456 return 0;589457}590458···633461 controller->tx_bytes = 0;634462 spin_unlock_irqrestore(&controller->lock, flags);635463636636- if (spi_qup_set_state(controller, QUP_STATE_RUN)) {637637- dev_warn(controller->dev, "cannot set RUN state\n");638638- goto exit;639639- }464464+ if (controller->use_dma)465465+ ret = spi_qup_do_dma(master, xfer);466466+ else467467+ ret = spi_qup_do_pio(master, xfer);640468641641- if (spi_qup_set_state(controller, QUP_STATE_PAUSE)) {642642- dev_warn(controller->dev, "cannot set PAUSE state\n");469469+ if (ret)643470 goto exit;644644- }645645-646646- spi_qup_fifo_write(controller, xfer);647471648472 if (spi_qup_set_state(controller, QUP_STATE_RUN)) {649473 dev_warn(controller->dev, "cannot set EXECUTE state\n");···648480649481 if (!wait_for_completion_timeout(&controller->done, timeout))650482 ret = -ETIMEDOUT;483483+651484exit:652485 spi_qup_set_state(controller, QUP_STATE_RESET);653486 spin_lock_irqsave(&controller->lock, flags);···656487 if (!ret)657488 ret = controller->error;658489 spin_unlock_irqrestore(&controller->lock, flags);490490+491491+ if (ret && controller->use_dma)492492+ spi_qup_dma_terminate(master, xfer);493493+494494+ return ret;495495+}496496+497497+static bool spi_qup_can_dma(struct spi_master *master, struct spi_device *spi,498498+ struct spi_transfer *xfer)499499+{500500+ struct spi_qup *qup = spi_master_get_devdata(master);501501+ size_t dma_align = dma_get_cache_alignment();502502+ u32 mode;503503+504504+ qup->use_dma = 0;505505+506506+ if (xfer->rx_buf && (xfer->len % qup->in_blk_sz ||507507+ IS_ERR_OR_NULL(master->dma_rx) ||508508+ !IS_ALIGNED((size_t)xfer->rx_buf, dma_align)))509509+ return false;510510+511511+ if (xfer->tx_buf && (xfer->len % qup->out_blk_sz ||512512+ IS_ERR_OR_NULL(master->dma_tx) ||513513+ !IS_ALIGNED((size_t)xfer->tx_buf, dma_align)))514514+ return false;515515+516516+ mode = spi_qup_get_mode(master, xfer);517517+ if (mode == QUP_IO_M_MODE_FIFO)518518+ return false;519519+520520+ qup->use_dma = 1;521521+522522+ return true;523523+}524524+525525+static void spi_qup_release_dma(struct spi_master *master)526526+{527527+ if (!IS_ERR_OR_NULL(master->dma_rx))528528+ dma_release_channel(master->dma_rx);529529+ if (!IS_ERR_OR_NULL(master->dma_tx))530530+ dma_release_channel(master->dma_tx);531531+}532532+533533+static int spi_qup_init_dma(struct spi_master *master, resource_size_t base)534534+{535535+ struct spi_qup *spi = spi_master_get_devdata(master);536536+ struct dma_slave_config *rx_conf = &spi->rx_conf,537537+ *tx_conf = &spi->tx_conf;538538+ struct device *dev = spi->dev;539539+ int ret;540540+541541+ /* allocate dma resources, if available */542542+ master->dma_rx = dma_request_slave_channel_reason(dev, "rx");543543+ if (IS_ERR(master->dma_rx))544544+ return PTR_ERR(master->dma_rx);545545+546546+ master->dma_tx = dma_request_slave_channel_reason(dev, "tx");547547+ if (IS_ERR(master->dma_tx)) {548548+ ret = PTR_ERR(master->dma_tx);549549+ goto err_tx;550550+ }551551+552552+ /* set DMA parameters */553553+ rx_conf->direction = DMA_DEV_TO_MEM;554554+ rx_conf->device_fc = 1;555555+ rx_conf->src_addr = base + QUP_INPUT_FIFO;556556+ rx_conf->src_maxburst = spi->in_blk_sz;557557+558558+ tx_conf->direction = DMA_MEM_TO_DEV;559559+ tx_conf->device_fc = 1;560560+ tx_conf->dst_addr = base + QUP_OUTPUT_FIFO;561561+ tx_conf->dst_maxburst = spi->out_blk_sz;562562+563563+ ret = dmaengine_slave_config(master->dma_rx, rx_conf);564564+ if (ret) {565565+ dev_err(dev, "failed to configure RX channel\n");566566+ goto err;567567+ }568568+569569+ ret = dmaengine_slave_config(master->dma_tx, tx_conf);570570+ if (ret) {571571+ dev_err(dev, "failed to configure TX channel\n");572572+ goto err;573573+ }574574+575575+ return 0;576576+577577+err:578578+ dma_release_channel(master->dma_tx);579579+err_tx:580580+ dma_release_channel(master->dma_rx);659581 return ret;660582}661583···823563 master->transfer_one = spi_qup_transfer_one;824564 master->dev.of_node = pdev->dev.of_node;825565 master->auto_runtime_pm = true;566566+ master->dma_alignment = dma_get_cache_alignment();567567+ master->max_dma_len = SPI_MAX_DMA_XFER;826568827569 platform_set_drvdata(pdev, master);828570···835573 controller->iclk = iclk;836574 controller->cclk = cclk;837575 controller->irq = irq;576576+577577+ ret = spi_qup_init_dma(master, res->start);578578+ if (ret == -EPROBE_DEFER)579579+ goto error;580580+ else if (!ret)581581+ master->can_dma = spi_qup_can_dma;838582839583 /* set v1 flag if device is version 1 */840584 if (of_device_is_compatible(dev->of_node, "qcom,spi-qup-v1.1.1"))···878610 ret = spi_qup_set_state(controller, QUP_STATE_RESET);879611 if (ret) {880612 dev_err(dev, "cannot set RESET state\n");881881- goto error;613613+ goto error_dma;882614 }883615884616 writel_relaxed(0, base + QUP_OPERATIONAL);···902634 ret = devm_request_irq(dev, irq, spi_qup_qup_irq,903635 IRQF_TRIGGER_HIGH, pdev->name, controller);904636 if (ret)905905- goto error;637637+ goto error_dma;906638907639 pm_runtime_set_autosuspend_delay(dev, MSEC_PER_SEC);908640 pm_runtime_use_autosuspend(dev);···917649918650disable_pm:919651 pm_runtime_disable(&pdev->dev);652652+error_dma:653653+ spi_qup_release_dma(master);920654error:921655 clk_disable_unprepare(cclk);922656 clk_disable_unprepare(iclk);···1009739 ret = spi_qup_set_state(controller, QUP_STATE_RESET);1010740 if (ret)1011741 return ret;742742+743743+ spi_qup_release_dma(master);10127441013745 clk_disable_unprepare(controller->cclk);1014746 clk_disable_unprepare(controller->iclk);
+32-4
drivers/spi/spi-rockchip.c
···179179 u8 tmode;180180 u8 bpw;181181 u8 n_bytes;182182+ u8 rsd_nsecs;182183 unsigned len;183184 u32 speed;184185···303302 return 0;304303}305304306306-static int rockchip_spi_unprepare_message(struct spi_master *master,307307- struct spi_message *msg)305305+static void rockchip_spi_handle_err(struct spi_master *master,306306+ struct spi_message *msg)308307{309308 unsigned long flags;310309 struct rockchip_spi *rs = spi_master_get_devdata(master);···314313 /*315314 * For DMA mode, we need terminate DMA channel and flush316315 * fifo for the next transfer if DMA thansfer timeout.317317- * unprepare_message() was called by core if transfer complete318318- * or timeout. Maybe it is reasonable for error handling here.316316+ * handle_err() was called by core if transfer failed.317317+ * Maybe it is reasonable for error handling here.319318 */320319 if (rs->use_dma) {321320 if (rs->state & RXBUSY) {···328327 }329328330329 spin_unlock_irqrestore(&rs->lock, flags);330330+}331331+332332+static int rockchip_spi_unprepare_message(struct spi_master *master,333333+ struct spi_message *msg)334334+{335335+ struct rockchip_spi *rs = spi_master_get_devdata(master);331336332337 spi_enable_chip(rs, 0);333338···500493{501494 u32 div = 0;502495 u32 dmacr = 0;496496+ int rsd = 0;503497504498 u32 cr0 = (CR0_BHT_8BIT << CR0_BHT_OFFSET)505499 | (CR0_SSD_ONE << CR0_SSD_OFFSET);···529521 /* div doesn't support odd number */530522 div = DIV_ROUND_UP(rs->max_freq, rs->speed);531523 div = (div + 1) & 0xfffe;524524+525525+ /* Rx sample delay is expressed in parent clock cycles (max 3) */526526+ rsd = DIV_ROUND_CLOSEST(rs->rsd_nsecs * (rs->max_freq >> 8),527527+ 1000000000 >> 8);528528+ if (!rsd && rs->rsd_nsecs) {529529+ pr_warn_once("rockchip-spi: %u Hz are too slow to express %u ns delay\n",530530+ rs->max_freq, rs->rsd_nsecs);531531+ } else if (rsd > 3) {532532+ rsd = 3;533533+ pr_warn_once("rockchip-spi: %u Hz are too fast to express %u ns delay, clamping at %u ns\n",534534+ rs->max_freq, rs->rsd_nsecs,535535+ rsd * 1000000000U / rs->max_freq);536536+ }537537+ cr0 |= rsd << CR0_RSD_OFFSET;532538533539 writel_relaxed(cr0, rs->regs + ROCKCHIP_SPI_CTRLR0);534540···636614 struct rockchip_spi *rs;637615 struct spi_master *master;638616 struct resource *mem;617617+ u32 rsd_nsecs;639618640619 master = spi_alloc_master(&pdev->dev, sizeof(struct rockchip_spi));641620 if (!master)···688665 rs->dev = &pdev->dev;689666 rs->max_freq = clk_get_rate(rs->spiclk);690667668668+ if (!of_property_read_u32(pdev->dev.of_node, "rx-sample-delay-ns",669669+ &rsd_nsecs))670670+ rs->rsd_nsecs = rsd_nsecs;671671+691672 rs->fifo_len = get_fifo_len(rs);692673 if (!rs->fifo_len) {693674 dev_err(&pdev->dev, "Failed to get fifo length\n");···715688 master->prepare_message = rockchip_spi_prepare_message;716689 master->unprepare_message = rockchip_spi_unprepare_message;717690 master->transfer_one = rockchip_spi_transfer_one;691691+ master->handle_err = rockchip_spi_handle_err;718692719693 rs->dma_tx.ch = dma_request_slave_channel(rs->dev, "tx");720694 if (!rs->dma_tx.ch)
+118-8
drivers/spi/spi-rspi.c
···177177#define SPBFCR_RXRST 0x40 /* Receive Buffer Data Reset */178178#define SPBFCR_TXTRG_MASK 0x30 /* Transmit Buffer Data Triggering Number */179179#define SPBFCR_RXTRG_MASK 0x07 /* Receive Buffer Data Triggering Number */180180+/* QSPI on R-Car Gen2 */181181+#define SPBFCR_TXTRG_1B 0x00 /* 31 bytes (1 byte available) */182182+#define SPBFCR_TXTRG_32B 0x30 /* 0 byte (32 bytes available) */183183+#define SPBFCR_RXTRG_1B 0x00 /* 1 byte (31 bytes available) */184184+#define SPBFCR_RXTRG_32B 0x07 /* 32 bytes (0 byte available) */185185+186186+#define QSPI_BUFFER_SIZE 32u180187181188struct rspi_data {182189 void __iomem *addr;···371364 rspi_write8(rspi, SPCR_SPE | SPCR_MSTR, RSPI_SPCR);372365373366 return 0;367367+}368368+369369+static void qspi_update(const struct rspi_data *rspi, u8 mask, u8 val, u8 reg)370370+{371371+ u8 data;372372+373373+ data = rspi_read8(rspi, reg);374374+ data &= ~mask;375375+ data |= (val & mask);376376+ rspi_write8(rspi, data, reg);377377+}378378+379379+static int qspi_set_send_trigger(struct rspi_data *rspi, unsigned int len)380380+{381381+ unsigned int n;382382+383383+ n = min(len, QSPI_BUFFER_SIZE);384384+385385+ if (len >= QSPI_BUFFER_SIZE) {386386+ /* sets triggering number to 32 bytes */387387+ qspi_update(rspi, SPBFCR_TXTRG_MASK,388388+ SPBFCR_TXTRG_32B, QSPI_SPBFCR);389389+ } else {390390+ /* sets triggering number to 1 byte */391391+ qspi_update(rspi, SPBFCR_TXTRG_MASK,392392+ SPBFCR_TXTRG_1B, QSPI_SPBFCR);393393+ }394394+395395+ return n;396396+}397397+398398+static void qspi_set_receive_trigger(struct rspi_data *rspi, unsigned int len)399399+{400400+ unsigned int n;401401+402402+ n = min(len, QSPI_BUFFER_SIZE);403403+404404+ if (len >= QSPI_BUFFER_SIZE) {405405+ /* sets triggering number to 32 bytes */406406+ qspi_update(rspi, SPBFCR_RXTRG_MASK,407407+ SPBFCR_RXTRG_32B, QSPI_SPBFCR);408408+ } else {409409+ /* sets triggering number to 1 byte */410410+ qspi_update(rspi, SPBFCR_RXTRG_MASK,411411+ SPBFCR_RXTRG_1B, QSPI_SPBFCR);412412+ }374413}375414376415#define set_config_register(spi, n) spi->ops->set_config_register(spi, n)···662609 return __rspi_can_dma(rspi, xfer);663610}664611612612+static int rspi_dma_check_then_transfer(struct rspi_data *rspi,613613+ struct spi_transfer *xfer)614614+{615615+ if (rspi->master->can_dma && __rspi_can_dma(rspi, xfer)) {616616+ /* rx_buf can be NULL on RSPI on SH in TX-only Mode */617617+ int ret = rspi_dma_transfer(rspi, &xfer->tx_sg,618618+ xfer->rx_buf ? &xfer->rx_sg : NULL);619619+ if (ret != -EAGAIN)620620+ return 0;621621+ }622622+623623+ return -EAGAIN;624624+}625625+665626static int rspi_common_transfer(struct rspi_data *rspi,666627 struct spi_transfer *xfer)667628{668629 int ret;669630670670- if (rspi->master->can_dma && __rspi_can_dma(rspi, xfer)) {671671- /* rx_buf can be NULL on RSPI on SH in TX-only Mode */672672- ret = rspi_dma_transfer(rspi, &xfer->tx_sg,673673- xfer->rx_buf ? &xfer->rx_sg : NULL);674674- if (ret != -EAGAIN)675675- return ret;676676- }631631+ ret = rspi_dma_check_then_transfer(rspi, xfer);632632+ if (ret != -EAGAIN)633633+ return ret;677634678635 ret = rspi_pio_transfer(rspi, xfer->tx_buf, xfer->rx_buf, xfer->len);679636 if (ret < 0)···724661 return rspi_common_transfer(rspi, xfer);725662}726663664664+static int qspi_trigger_transfer_out_int(struct rspi_data *rspi, const u8 *tx,665665+ u8 *rx, unsigned int len)666666+{667667+ int i, n, ret;668668+ int error;669669+670670+ while (len > 0) {671671+ n = qspi_set_send_trigger(rspi, len);672672+ qspi_set_receive_trigger(rspi, len);673673+ if (n == QSPI_BUFFER_SIZE) {674674+ error = rspi_wait_for_tx_empty(rspi);675675+ if (error < 0) {676676+ dev_err(&rspi->master->dev, "transmit timeout\n");677677+ return error;678678+ }679679+ for (i = 0; i < n; i++)680680+ rspi_write_data(rspi, *tx++);681681+682682+ error = rspi_wait_for_rx_full(rspi);683683+ if (error < 0) {684684+ dev_err(&rspi->master->dev, "receive timeout\n");685685+ return error;686686+ }687687+ for (i = 0; i < n; i++)688688+ *rx++ = rspi_read_data(rspi);689689+ } else {690690+ ret = rspi_pio_transfer(rspi, tx, rx, n);691691+ if (ret < 0)692692+ return ret;693693+ }694694+ len -= n;695695+ }696696+697697+ return 0;698698+}699699+727700static int qspi_transfer_out_in(struct rspi_data *rspi,728701 struct spi_transfer *xfer)729702{703703+ int ret;704704+730705 qspi_receive_init(rspi);731706732732- return rspi_common_transfer(rspi, xfer);707707+ ret = rspi_dma_check_then_transfer(rspi, xfer);708708+ if (ret != -EAGAIN)709709+ return ret;710710+711711+ ret = qspi_trigger_transfer_out_int(rspi, xfer->tx_buf,712712+ xfer->rx_buf, xfer->len);713713+ if (ret < 0)714714+ return ret;715715+716716+ return 0;733717}734718735719static int qspi_transfer_out(struct rspi_data *rspi, struct spi_transfer *xfer)
+2-2
drivers/spi/spi-s3c64xx.c
···324324325325 /* Acquire DMA channels */326326 sdd->rx_dma.ch = dma_request_slave_channel_compat(mask, filter,327327- (void *)sdd->rx_dma.dmach, dev, "rx");327327+ (void *)(long)sdd->rx_dma.dmach, dev, "rx");328328 if (!sdd->rx_dma.ch) {329329 dev_err(dev, "Failed to get RX DMA channel\n");330330 ret = -EBUSY;···333333 spi->dma_rx = sdd->rx_dma.ch;334334335335 sdd->tx_dma.ch = dma_request_slave_channel_compat(mask, filter,336336- (void *)sdd->tx_dma.dmach, dev, "tx");336336+ (void *)(long)sdd->tx_dma.dmach, dev, "tx");337337 if (!sdd->tx_dma.ch) {338338 dev_err(dev, "Failed to get TX DMA channel\n");339339 ret = -EBUSY;