Lines Matching +full:spi +full:- +full:lsb +full:- +full:first

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Marvell Orion SPI controller driver
6 * Copyright (C) 2007-2008 Marvell Ltd.
14 #include <linux/spi/spi.h>
76 * have both is for managing the armada-370-spi case with old
108 return orion_spi->base + reg; in spi_reg()
133 static int orion_spi_baudrate_set(struct spi_device *spi, unsigned int speed) in orion_spi_baudrate_set() argument
142 orion_spi = spi_master_get_devdata(spi->master); in orion_spi_baudrate_set()
143 devdata = orion_spi->devdata; in orion_spi_baudrate_set()
145 tclk_hz = clk_get_rate(orion_spi->clk); in orion_spi_baudrate_set()
147 if (devdata->typ == ARMADA_SPI) { in orion_spi_baudrate_set()
175 sppr = fls(divider) - 4; in orion_spi_baudrate_set()
182 divider = (divider + two_pow_sppr - 1) & -two_pow_sppr; in orion_spi_baudrate_set()
191 sppr = fls(divider) - 4; in orion_spi_baudrate_set()
200 return -EINVAL; in orion_spi_baudrate_set()
214 return -EINVAL; in orion_spi_baudrate_set()
219 /* Convert the rate to SPI clock divisor value. */ in orion_spi_baudrate_set()
224 reg = ((reg & ~devdata->prescale_mask) | prescale); in orion_spi_baudrate_set()
231 orion_spi_mode_set(struct spi_device *spi) in orion_spi_mode_set() argument
236 orion_spi = spi_master_get_devdata(spi->master); in orion_spi_mode_set()
240 if (spi->mode & SPI_CPOL) in orion_spi_mode_set()
242 if (spi->mode & SPI_CPHA) in orion_spi_mode_set()
244 if (spi->mode & SPI_LSB_FIRST) in orion_spi_mode_set()
253 orion_spi_50mhz_ac_timing_erratum(struct spi_device *spi, unsigned int speed) in orion_spi_50mhz_ac_timing_erratum() argument
258 orion_spi = spi_master_get_devdata(spi->master); in orion_spi_50mhz_ac_timing_erratum()
261 * Erratum description: (Erratum NO. FE-9144572) The device in orion_spi_50mhz_ac_timing_erratum()
262 * SPI interface supports frequencies of up to 50 MHz. in orion_spi_50mhz_ac_timing_erratum()
264 * 250 MHz and the SPI interfaces is configured for 50MHz SPI in orion_spi_50mhz_ac_timing_erratum()
266 * reads from the SPI device. in orion_spi_50mhz_ac_timing_erratum()
269 * 1. Set CPOL=CPHA=0 in "SPI Interface Configuration in orion_spi_50mhz_ac_timing_erratum()
271 * 2. Set TMISO_SAMPLE value to 0x2 in "SPI Timing Parameters 1 in orion_spi_50mhz_ac_timing_erratum()
277 if (clk_get_rate(orion_spi->clk) == 250000000 && in orion_spi_50mhz_ac_timing_erratum()
278 speed == 50000000 && spi->mode & SPI_CPOL && in orion_spi_50mhz_ac_timing_erratum()
279 spi->mode & SPI_CPHA) in orion_spi_50mhz_ac_timing_erratum()
291 orion_spi_setup_transfer(struct spi_device *spi, struct spi_transfer *t) in orion_spi_setup_transfer() argument
294 unsigned int speed = spi->max_speed_hz; in orion_spi_setup_transfer()
295 unsigned int bits_per_word = spi->bits_per_word; in orion_spi_setup_transfer()
298 orion_spi = spi_master_get_devdata(spi->master); in orion_spi_setup_transfer()
300 if ((t != NULL) && t->speed_hz) in orion_spi_setup_transfer()
301 speed = t->speed_hz; in orion_spi_setup_transfer()
303 if ((t != NULL) && t->bits_per_word) in orion_spi_setup_transfer()
304 bits_per_word = t->bits_per_word; in orion_spi_setup_transfer()
306 orion_spi_mode_set(spi); in orion_spi_setup_transfer()
308 if (orion_spi->devdata->is_errata_50mhz_ac) in orion_spi_setup_transfer()
309 orion_spi_50mhz_ac_timing_erratum(spi, speed); in orion_spi_setup_transfer()
311 rc = orion_spi_baudrate_set(spi, speed); in orion_spi_setup_transfer()
325 static void orion_spi_set_cs(struct spi_device *spi, bool enable) in orion_spi_set_cs() argument
330 orion_spi = spi_master_get_devdata(spi->master); in orion_spi_set_cs()
332 if (gpio_is_valid(spi->cs_gpio)) in orion_spi_set_cs()
333 cs = orion_spi->unused_hw_gpio; in orion_spi_set_cs()
335 cs = spi->chip_select; in orion_spi_set_cs()
359 return -1; in orion_spi_wait_till_ready()
363 orion_spi_write_read_8bit(struct spi_device *spi, in orion_spi_write_read_8bit() argument
369 orion_spi = spi_master_get_devdata(spi->master); in orion_spi_write_read_8bit()
383 dev_err(&spi->dev, "TXS timed out\n"); in orion_spi_write_read_8bit()
384 return -1; in orion_spi_write_read_8bit()
394 orion_spi_write_read_16bit(struct spi_device *spi, in orion_spi_write_read_16bit() argument
400 orion_spi = spi_master_get_devdata(spi->master); in orion_spi_write_read_16bit()
414 dev_err(&spi->dev, "TXS timed out\n"); in orion_spi_write_read_16bit()
415 return -1; in orion_spi_write_read_16bit()
425 orion_spi_write_read(struct spi_device *spi, struct spi_transfer *xfer) in orion_spi_write_read() argument
430 int cs = spi->chip_select; in orion_spi_write_read()
433 word_len = spi->bits_per_word; in orion_spi_write_read()
434 count = xfer->len; in orion_spi_write_read()
436 orion_spi = spi_master_get_devdata(spi->master); in orion_spi_write_read()
439 * Use SPI direct write mode if base address is available. Otherwise in orion_spi_write_read()
442 vaddr = orion_spi->child[cs].direct_access.vaddr; in orion_spi_write_read()
444 if (vaddr && xfer->tx_buf && word_len == 8) { in orion_spi_write_read()
449 * Send the TX-data to the SPI device via the direct in orion_spi_write_read()
452 iowrite32_rep(vaddr, xfer->tx_buf, cnt); in orion_spi_write_read()
454 u32 *buf = (u32 *)xfer->tx_buf; in orion_spi_write_read()
463 const u8 *tx = xfer->tx_buf; in orion_spi_write_read()
464 u8 *rx = xfer->rx_buf; in orion_spi_write_read()
467 if (orion_spi_write_read_8bit(spi, &tx, &rx) < 0) in orion_spi_write_read()
469 count--; in orion_spi_write_read()
470 if (xfer->word_delay_usecs) in orion_spi_write_read()
471 udelay(xfer->word_delay_usecs); in orion_spi_write_read()
474 const u16 *tx = xfer->tx_buf; in orion_spi_write_read()
475 u16 *rx = xfer->rx_buf; in orion_spi_write_read()
478 if (orion_spi_write_read_16bit(spi, &tx, &rx) < 0) in orion_spi_write_read()
480 count -= 2; in orion_spi_write_read()
481 if (xfer->word_delay_usecs) in orion_spi_write_read()
482 udelay(xfer->word_delay_usecs); in orion_spi_write_read()
487 return xfer->len - count; in orion_spi_write_read()
491 struct spi_device *spi, in orion_spi_transfer_one() argument
496 status = orion_spi_setup_transfer(spi, t); in orion_spi_transfer_one()
500 if (t->len) in orion_spi_transfer_one()
501 orion_spi_write_read(spi, t); in orion_spi_transfer_one()
506 static int orion_spi_setup(struct spi_device *spi) in orion_spi_setup() argument
508 if (gpio_is_valid(spi->cs_gpio)) { in orion_spi_setup()
509 gpio_direction_output(spi->cs_gpio, !(spi->mode & SPI_CS_HIGH)); in orion_spi_setup()
511 return orion_spi_setup_transfer(spi, NULL); in orion_spi_setup()
519 /* Don't deassert CS between the direct mapped SPI transfers */ in orion_spi_reset()
564 .compatible = "marvell,orion-spi",
568 .compatible = "marvell,armada-370-spi",
572 .compatible = "marvell,armada-375-spi",
576 .compatible = "marvell,armada-380-spi",
580 .compatible = "marvell,armada-390-spi",
584 .compatible = "marvell,armada-xp-spi",
597 struct orion_spi *spi; in orion_spi_probe() local
603 master = spi_alloc_master(&pdev->dev, sizeof(*spi)); in orion_spi_probe()
605 dev_dbg(&pdev->dev, "master allocation failed\n"); in orion_spi_probe()
606 return -ENOMEM; in orion_spi_probe()
609 if (pdev->id != -1) in orion_spi_probe()
610 master->bus_num = pdev->id; in orion_spi_probe()
611 if (pdev->dev.of_node) { in orion_spi_probe()
614 if (!of_property_read_u32(pdev->dev.of_node, "cell-index", in orion_spi_probe()
616 master->bus_num = cell_index; in orion_spi_probe()
619 /* we support all 4 SPI modes and LSB first option */ in orion_spi_probe()
620 master->mode_bits = SPI_CPHA | SPI_CPOL | SPI_LSB_FIRST; in orion_spi_probe()
621 master->set_cs = orion_spi_set_cs; in orion_spi_probe()
622 master->transfer_one = orion_spi_transfer_one; in orion_spi_probe()
623 master->num_chipselect = ORION_NUM_CHIPSELECTS; in orion_spi_probe()
624 master->setup = orion_spi_setup; in orion_spi_probe()
625 master->bits_per_word_mask = SPI_BPW_MASK(8) | SPI_BPW_MASK(16); in orion_spi_probe()
626 master->auto_runtime_pm = true; in orion_spi_probe()
627 master->flags = SPI_MASTER_GPIO_SS; in orion_spi_probe()
631 spi = spi_master_get_devdata(master); in orion_spi_probe()
632 spi->master = master; in orion_spi_probe()
633 spi->unused_hw_gpio = -1; in orion_spi_probe()
635 of_id = of_match_device(orion_spi_of_match_table, &pdev->dev); in orion_spi_probe()
636 devdata = (of_id) ? of_id->data : &orion_spi_dev_data; in orion_spi_probe()
637 spi->devdata = devdata; in orion_spi_probe()
639 spi->clk = devm_clk_get(&pdev->dev, NULL); in orion_spi_probe()
640 if (IS_ERR(spi->clk)) { in orion_spi_probe()
641 status = PTR_ERR(spi->clk); in orion_spi_probe()
645 status = clk_prepare_enable(spi->clk); in orion_spi_probe()
650 spi->axi_clk = devm_clk_get(&pdev->dev, "axi"); in orion_spi_probe()
651 if (IS_ERR(spi->axi_clk) && in orion_spi_probe()
652 PTR_ERR(spi->axi_clk) == -EPROBE_DEFER) { in orion_spi_probe()
653 status = -EPROBE_DEFER; in orion_spi_probe()
656 if (!IS_ERR(spi->axi_clk)) in orion_spi_probe()
657 clk_prepare_enable(spi->axi_clk); in orion_spi_probe()
659 tclk_hz = clk_get_rate(spi->clk); in orion_spi_probe()
662 * With old device tree, armada-370-spi could be used with in orion_spi_probe()
668 if (of_device_is_compatible(pdev->dev.of_node, in orion_spi_probe()
669 "marvell,armada-370-spi")) in orion_spi_probe()
670 master->max_speed_hz = min(devdata->max_hz, in orion_spi_probe()
671 DIV_ROUND_UP(tclk_hz, devdata->min_divisor)); in orion_spi_probe()
672 else if (devdata->min_divisor) in orion_spi_probe()
673 master->max_speed_hz = in orion_spi_probe()
674 DIV_ROUND_UP(tclk_hz, devdata->min_divisor); in orion_spi_probe()
676 master->max_speed_hz = devdata->max_hz; in orion_spi_probe()
677 master->min_speed_hz = DIV_ROUND_UP(tclk_hz, devdata->max_divisor); in orion_spi_probe()
680 spi->base = devm_ioremap_resource(&pdev->dev, r); in orion_spi_probe()
681 if (IS_ERR(spi->base)) { in orion_spi_probe()
682 status = PTR_ERR(spi->base); in orion_spi_probe()
686 for_each_available_child_of_node(pdev->dev.of_node, np) { in orion_spi_probe()
691 /* Get chip-select number from the "reg" property */ in orion_spi_probe()
694 dev_err(&pdev->dev, in orion_spi_probe()
702 * - properly request the actual GPIO signal in orion_spi_probe()
703 * - de-assert the logical signal so that all GPIO CS lines in orion_spi_probe()
705 * - find an unused physical CS which will be driven for any in orion_spi_probe()
708 cs_gpio = of_get_named_gpio(pdev->dev.of_node, "cs-gpios", cs); in orion_spi_probe()
713 if (spi->unused_hw_gpio == -1) { in orion_spi_probe()
714 dev_info(&pdev->dev, in orion_spi_probe()
717 spi->unused_hw_gpio = cs; in orion_spi_probe()
720 gpio_name = devm_kasprintf(&pdev->dev, GFP_KERNEL, in orion_spi_probe()
721 "%s-CS%d", dev_name(&pdev->dev), cs); in orion_spi_probe()
723 status = -ENOMEM; in orion_spi_probe()
727 cs_flags = of_property_read_bool(np, "spi-cs-high") ? in orion_spi_probe()
729 status = devm_gpio_request_one(&pdev->dev, cs_gpio, in orion_spi_probe()
732 dev_err(&pdev->dev, in orion_spi_probe()
739 * Check if an address is configured for this SPI device. If in orion_spi_probe()
745 status = of_address_to_resource(pdev->dev.of_node, cs + 1, r); in orion_spi_probe()
751 * simple TX transfer which only writes to the first word. in orion_spi_probe()
752 * This needs to get extended for the direct SPI-NOR / SPI-NAND in orion_spi_probe()
755 dir_acc = &spi->child[cs].direct_access; in orion_spi_probe()
756 dir_acc->vaddr = devm_ioremap(&pdev->dev, r->start, PAGE_SIZE); in orion_spi_probe()
757 if (!dir_acc->vaddr) { in orion_spi_probe()
758 status = -ENOMEM; in orion_spi_probe()
761 dir_acc->size = PAGE_SIZE; in orion_spi_probe()
763 dev_info(&pdev->dev, "CS%d configured for direct access\n", cs); in orion_spi_probe()
766 pm_runtime_set_active(&pdev->dev); in orion_spi_probe()
767 pm_runtime_use_autosuspend(&pdev->dev); in orion_spi_probe()
768 pm_runtime_set_autosuspend_delay(&pdev->dev, SPI_AUTOSUSPEND_TIMEOUT); in orion_spi_probe()
769 pm_runtime_enable(&pdev->dev); in orion_spi_probe()
771 status = orion_spi_reset(spi); in orion_spi_probe()
775 pm_runtime_mark_last_busy(&pdev->dev); in orion_spi_probe()
776 pm_runtime_put_autosuspend(&pdev->dev); in orion_spi_probe()
778 master->dev.of_node = pdev->dev.of_node; in orion_spi_probe()
786 pm_runtime_disable(&pdev->dev); in orion_spi_probe()
788 clk_disable_unprepare(spi->axi_clk); in orion_spi_probe()
790 clk_disable_unprepare(spi->clk); in orion_spi_probe()
800 struct orion_spi *spi = spi_master_get_devdata(master); in orion_spi_remove() local
802 pm_runtime_get_sync(&pdev->dev); in orion_spi_remove()
803 clk_disable_unprepare(spi->axi_clk); in orion_spi_remove()
804 clk_disable_unprepare(spi->clk); in orion_spi_remove()
807 pm_runtime_disable(&pdev->dev); in orion_spi_remove()
818 struct orion_spi *spi = spi_master_get_devdata(master); in orion_spi_runtime_suspend() local
820 clk_disable_unprepare(spi->axi_clk); in orion_spi_runtime_suspend()
821 clk_disable_unprepare(spi->clk); in orion_spi_runtime_suspend()
828 struct orion_spi *spi = spi_master_get_devdata(master); in orion_spi_runtime_resume() local
830 if (!IS_ERR(spi->axi_clk)) in orion_spi_runtime_resume()
831 clk_prepare_enable(spi->axi_clk); in orion_spi_runtime_resume()
832 return clk_prepare_enable(spi->clk); in orion_spi_runtime_resume()
854 MODULE_DESCRIPTION("Orion SPI driver");