Skip to content

Commit 8f9cf02

Browse files
Cyril-Jeanbroonie
authored andcommitted
spi: microchip-core-qspi: Add regular transfers
The driver for CoreQSPI only supports memory operations at present, so add support for regular transfers so that the SD card slot and ADC on the BeagleV Fire can be used. Signed-off-by: Cyril Jean <cyril.jean@microchip.com> Co-developed-by: Conor Dooley <conor.dooley@microchip.com> Signed-off-by: Conor Dooley <conor.dooley@microchip.com> Link: https://patch.msgid.link/20250620-splice-shelter-310771564886@spud Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 75ca45c commit 8f9cf02

1 file changed

Lines changed: 199 additions & 18 deletions

File tree

drivers/spi/spi-microchip-core-qspi.c

Lines changed: 199 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,87 @@ static inline void mchp_coreqspi_write_op(struct mchp_coreqspi *qspi)
222222
}
223223
}
224224

225+
static inline void mchp_coreqspi_write_read_op(struct mchp_coreqspi *qspi)
226+
{
227+
u32 control, data;
228+
229+
qspi->rx_len = qspi->tx_len;
230+
231+
control = readl_relaxed(qspi->regs + REG_CONTROL);
232+
control |= CONTROL_FLAGSX4;
233+
writel_relaxed(control, qspi->regs + REG_CONTROL);
234+
235+
while (qspi->tx_len >= 4) {
236+
while (readl_relaxed(qspi->regs + REG_STATUS) & STATUS_TXFIFOFULL)
237+
;
238+
239+
data = qspi->txbuf ? *((u32 *)qspi->txbuf) : 0xaa;
240+
if (qspi->txbuf)
241+
qspi->txbuf += 4;
242+
qspi->tx_len -= 4;
243+
writel_relaxed(data, qspi->regs + REG_X4_TX_DATA);
244+
245+
/*
246+
* The rx FIFO is twice the size of the tx FIFO, so there is
247+
* no requirement to block transmission if receive data is not
248+
* ready, and it is fine to let the tx FIFO completely fill
249+
* without reading anything from the rx FIFO. Once the tx FIFO
250+
* has been filled and becomes non-full due to a transmission
251+
* occurring there will always be something to receive.
252+
* IOW, this is safe as TX_FIFO_SIZE + 4 < 2 * TX_FIFO_SIZE
253+
*/
254+
if (qspi->rx_len >= 4) {
255+
if (readl_relaxed(qspi->regs + REG_STATUS) & STATUS_RXAVAILABLE) {
256+
data = readl_relaxed(qspi->regs + REG_X4_RX_DATA);
257+
*(u32 *)qspi->rxbuf = data;
258+
qspi->rxbuf += 4;
259+
qspi->rx_len -= 4;
260+
}
261+
}
262+
}
263+
264+
/*
265+
* Since transmission is not being blocked by clearing the rx FIFO,
266+
* loop here until all received data "leaked" by the loop above has
267+
* been dealt with.
268+
*/
269+
while (qspi->rx_len >= 4) {
270+
while (readl_relaxed(qspi->regs + REG_STATUS) & STATUS_RXFIFOEMPTY)
271+
;
272+
data = readl_relaxed(qspi->regs + REG_X4_RX_DATA);
273+
*(u32 *)qspi->rxbuf = data;
274+
qspi->rxbuf += 4;
275+
qspi->rx_len -= 4;
276+
}
277+
278+
/*
279+
* Since rx_len and tx_len must be < 4 bytes at this point, there's no
280+
* concern about overflowing the rx or tx FIFOs any longer. It's
281+
* therefore safe to loop over the remainder of the transmit data before
282+
* handling the remaining receive data.
283+
*/
284+
if (!qspi->tx_len)
285+
return;
286+
287+
control &= ~CONTROL_FLAGSX4;
288+
writel_relaxed(control, qspi->regs + REG_CONTROL);
289+
290+
while (qspi->tx_len--) {
291+
while (readl_relaxed(qspi->regs + REG_STATUS) & STATUS_TXFIFOFULL)
292+
;
293+
data = qspi->txbuf ? *qspi->txbuf : 0xaa;
294+
qspi->txbuf++;
295+
writel_relaxed(data, qspi->regs + REG_TX_DATA);
296+
}
297+
298+
while (qspi->rx_len--) {
299+
while (readl_relaxed(qspi->regs + REG_STATUS) & STATUS_RXFIFOEMPTY)
300+
;
301+
data = readl_relaxed(qspi->regs + REG_RX_DATA);
302+
*qspi->rxbuf++ = (data & 0xFF);
303+
}
304+
}
305+
225306
static void mchp_coreqspi_enable_ints(struct mchp_coreqspi *qspi)
226307
{
227308
u32 mask = IEN_TXDONE |
@@ -266,7 +347,7 @@ static irqreturn_t mchp_coreqspi_isr(int irq, void *dev_id)
266347
}
267348

268349
static int mchp_coreqspi_setup_clock(struct mchp_coreqspi *qspi, struct spi_device *spi,
269-
const struct spi_mem_op *op)
350+
u32 max_freq)
270351
{
271352
unsigned long clk_hz;
272353
u32 control, baud_rate_val = 0;
@@ -275,11 +356,11 @@ static int mchp_coreqspi_setup_clock(struct mchp_coreqspi *qspi, struct spi_devi
275356
if (!clk_hz)
276357
return -EINVAL;
277358

278-
baud_rate_val = DIV_ROUND_UP(clk_hz, 2 * op->max_freq);
359+
baud_rate_val = DIV_ROUND_UP(clk_hz, 2 * max_freq);
279360
if (baud_rate_val > MAX_DIVIDER || baud_rate_val < MIN_DIVIDER) {
280361
dev_err(&spi->dev,
281362
"could not configure the clock for spi clock %d Hz & system clock %ld Hz\n",
282-
op->max_freq, clk_hz);
363+
max_freq, clk_hz);
283364
return -EINVAL;
284365
}
285366

@@ -367,23 +448,13 @@ static inline void mchp_coreqspi_config_op(struct mchp_coreqspi *qspi, const str
367448
writel_relaxed(frames, qspi->regs + REG_FRAMES);
368449
}
369450

370-
static int mchp_qspi_wait_for_ready(struct spi_mem *mem)
451+
static int mchp_coreqspi_wait_for_ready(struct mchp_coreqspi *qspi)
371452
{
372-
struct mchp_coreqspi *qspi = spi_controller_get_devdata
373-
(mem->spi->controller);
374453
u32 status;
375-
int ret;
376454

377-
ret = readl_poll_timeout(qspi->regs + REG_STATUS, status,
455+
return readl_poll_timeout(qspi->regs + REG_STATUS, status,
378456
(status & STATUS_READY), 0,
379457
TIMEOUT_MS);
380-
if (ret) {
381-
dev_err(&mem->spi->dev,
382-
"Timeout waiting on QSPI ready.\n");
383-
return -ETIMEDOUT;
384-
}
385-
386-
return ret;
387458
}
388459

389460
static int mchp_coreqspi_exec_op(struct spi_mem *mem, const struct spi_mem_op *op)
@@ -396,11 +467,13 @@ static int mchp_coreqspi_exec_op(struct spi_mem *mem, const struct spi_mem_op *o
396467
int err, i;
397468

398469
mutex_lock(&qspi->op_lock);
399-
err = mchp_qspi_wait_for_ready(mem);
400-
if (err)
470+
err = mchp_coreqspi_wait_for_ready(qspi);
471+
if (err) {
472+
dev_err(&mem->spi->dev, "Timeout waiting on QSPI ready.\n");
401473
goto error;
474+
}
402475

403-
err = mchp_coreqspi_setup_clock(qspi, mem->spi, op);
476+
err = mchp_coreqspi_setup_clock(qspi, mem->spi, op->max_freq);
404477
if (err)
405478
goto error;
406479

@@ -515,6 +588,109 @@ static const struct spi_controller_mem_caps mchp_coreqspi_mem_caps = {
515588
.per_op_freq = true,
516589
};
517590

591+
static int mchp_coreqspi_unprepare_message(struct spi_controller *ctlr, struct spi_message *m)
592+
{
593+
struct mchp_coreqspi *qspi = spi_controller_get_devdata(ctlr);
594+
595+
/*
596+
* This delay is required for the driver to function correctly,
597+
* but no explanation has been determined for why it is required.
598+
*/
599+
udelay(750);
600+
601+
mutex_unlock(&qspi->op_lock);
602+
603+
return 0;
604+
}
605+
606+
static int mchp_coreqspi_prepare_message(struct spi_controller *ctlr, struct spi_message *m)
607+
{
608+
struct mchp_coreqspi *qspi = spi_controller_get_devdata(ctlr);
609+
struct spi_transfer *t = NULL;
610+
u32 control, frames;
611+
u32 total_bytes = 0, cmd_bytes = 0, idle_cycles = 0;
612+
int ret;
613+
bool quad = false, dual = false;
614+
615+
mutex_lock(&qspi->op_lock);
616+
ret = mchp_coreqspi_wait_for_ready(qspi);
617+
if (ret) {
618+
mutex_unlock(&qspi->op_lock);
619+
dev_err(&ctlr->dev, "Timeout waiting on QSPI ready.\n");
620+
return ret;
621+
}
622+
623+
ret = mchp_coreqspi_setup_clock(qspi, m->spi, m->spi->max_speed_hz);
624+
if (ret) {
625+
mutex_unlock(&qspi->op_lock);
626+
return ret;
627+
}
628+
629+
control = readl_relaxed(qspi->regs + REG_CONTROL);
630+
control &= ~(CONTROL_MODE12_MASK | CONTROL_MODE0);
631+
writel_relaxed(control, qspi->regs + REG_CONTROL);
632+
633+
reinit_completion(&qspi->data_completion);
634+
635+
list_for_each_entry(t, &m->transfers, transfer_list) {
636+
total_bytes += t->len;
637+
if (!cmd_bytes && !(t->tx_buf && t->rx_buf))
638+
cmd_bytes = t->len;
639+
if (!t->rx_buf)
640+
cmd_bytes = total_bytes;
641+
if (t->tx_nbits == SPI_NBITS_QUAD || t->rx_nbits == SPI_NBITS_QUAD)
642+
quad = true;
643+
else if (t->tx_nbits == SPI_NBITS_DUAL || t->rx_nbits == SPI_NBITS_DUAL)
644+
dual = true;
645+
}
646+
647+
control = readl_relaxed(qspi->regs + REG_CONTROL);
648+
if (quad) {
649+
control |= (CONTROL_MODE0 | CONTROL_MODE12_EX_RW);
650+
} else if (dual) {
651+
control &= ~CONTROL_MODE0;
652+
control |= CONTROL_MODE12_FULL;
653+
} else {
654+
control &= ~(CONTROL_MODE12_MASK | CONTROL_MODE0);
655+
}
656+
writel_relaxed(control, qspi->regs + REG_CONTROL);
657+
658+
frames = total_bytes & BYTESUPPER_MASK;
659+
writel_relaxed(frames, qspi->regs + REG_FRAMESUP);
660+
frames = total_bytes & BYTESLOWER_MASK;
661+
frames |= cmd_bytes << FRAMES_CMDBYTES_SHIFT;
662+
frames |= idle_cycles << FRAMES_IDLE_SHIFT;
663+
control = readl_relaxed(qspi->regs + REG_CONTROL);
664+
if (control & CONTROL_MODE12_MASK)
665+
frames |= (1 << FRAMES_SHIFT);
666+
667+
frames |= FRAMES_FLAGWORD;
668+
writel_relaxed(frames, qspi->regs + REG_FRAMES);
669+
670+
return 0;
671+
};
672+
673+
static int mchp_coreqspi_transfer_one(struct spi_controller *ctlr, struct spi_device *spi,
674+
struct spi_transfer *t)
675+
{
676+
struct mchp_coreqspi *qspi = spi_controller_get_devdata(ctlr);
677+
678+
qspi->tx_len = t->len;
679+
680+
if (t->tx_buf)
681+
qspi->txbuf = (u8 *)t->tx_buf;
682+
683+
if (!t->rx_buf) {
684+
mchp_coreqspi_write_op(qspi);
685+
} else {
686+
qspi->rxbuf = (u8 *)t->rx_buf;
687+
qspi->rx_len = t->len;
688+
mchp_coreqspi_write_read_op(qspi);
689+
}
690+
691+
return 0;
692+
}
693+
518694
static int mchp_coreqspi_probe(struct platform_device *pdev)
519695
{
520696
struct spi_controller *ctlr;
@@ -563,6 +739,11 @@ static int mchp_coreqspi_probe(struct platform_device *pdev)
563739
SPI_TX_DUAL | SPI_TX_QUAD;
564740
ctlr->dev.of_node = np;
565741
ctlr->min_speed_hz = clk_get_rate(qspi->clk) / 30;
742+
ctlr->prepare_message = mchp_coreqspi_prepare_message;
743+
ctlr->unprepare_message = mchp_coreqspi_unprepare_message;
744+
ctlr->transfer_one = mchp_coreqspi_transfer_one;
745+
ctlr->num_chipselect = 2;
746+
ctlr->use_gpio_descriptors = true;
566747

567748
ret = devm_spi_register_controller(&pdev->dev, ctlr);
568749
if (ret)

0 commit comments

Comments
 (0)