Lines Matching +full:cs +full:- +full:out

1 // SPDX-License-Identifier: GPL-2.0-only
6 * Copyright (C) 2007-2008 Marvell Ltd.
62 #define ORION_SPI_CS(cs) ((cs << ORION_SPI_CS_SHIFT) & \ argument
74 * have both is for managing the armada-370-spi case with old
105 return orion_spi->base + reg; in spi_reg()
139 orion_spi = spi_master_get_devdata(spi->master); in orion_spi_baudrate_set()
140 devdata = orion_spi->devdata; in orion_spi_baudrate_set()
142 tclk_hz = clk_get_rate(orion_spi->clk); in orion_spi_baudrate_set()
144 if (devdata->typ == ARMADA_SPI) { in orion_spi_baudrate_set()
172 sppr = fls(divider) - 4; in orion_spi_baudrate_set()
179 divider = (divider + two_pow_sppr - 1) & -two_pow_sppr; in orion_spi_baudrate_set()
188 sppr = fls(divider) - 4; in orion_spi_baudrate_set()
197 return -EINVAL; in orion_spi_baudrate_set()
211 return -EINVAL; in orion_spi_baudrate_set()
221 reg = ((reg & ~devdata->prescale_mask) | prescale); in orion_spi_baudrate_set()
233 orion_spi = spi_master_get_devdata(spi->master); in orion_spi_mode_set()
237 if (spi->mode & SPI_CPOL) in orion_spi_mode_set()
239 if (spi->mode & SPI_CPHA) in orion_spi_mode_set()
241 if (spi->mode & SPI_LSB_FIRST) in orion_spi_mode_set()
255 orion_spi = spi_master_get_devdata(spi->master); in orion_spi_50mhz_ac_timing_erratum()
258 * Erratum description: (Erratum NO. FE-9144572) The device in orion_spi_50mhz_ac_timing_erratum()
274 if (clk_get_rate(orion_spi->clk) == 250000000 && in orion_spi_50mhz_ac_timing_erratum()
275 speed == 50000000 && spi->mode & SPI_CPOL && in orion_spi_50mhz_ac_timing_erratum()
276 spi->mode & SPI_CPHA) in orion_spi_50mhz_ac_timing_erratum()
291 unsigned int speed = spi->max_speed_hz; in orion_spi_setup_transfer()
292 unsigned int bits_per_word = spi->bits_per_word; in orion_spi_setup_transfer()
295 orion_spi = spi_master_get_devdata(spi->master); in orion_spi_setup_transfer()
297 if ((t != NULL) && t->speed_hz) in orion_spi_setup_transfer()
298 speed = t->speed_hz; in orion_spi_setup_transfer()
300 if ((t != NULL) && t->bits_per_word) in orion_spi_setup_transfer()
301 bits_per_word = t->bits_per_word; in orion_spi_setup_transfer()
305 if (orion_spi->devdata->is_errata_50mhz_ac) in orion_spi_setup_transfer()
326 orion_spi = spi_master_get_devdata(spi->master); in orion_spi_set_cs()
331 * chip select. The CS we activate will not have any elecrical effect, in orion_spi_set_cs()
337 ORION_SPI_CS(spi->chip_select)); in orion_spi_set_cs()
343 * cases we are dealing with an unused native CS anyways so the polarity in orion_spi_set_cs()
363 return -1; in orion_spi_wait_till_ready()
373 orion_spi = spi_master_get_devdata(spi->master); in orion_spi_write_read_8bit()
387 dev_err(&spi->dev, "TXS timed out\n"); in orion_spi_write_read_8bit()
388 return -1; in orion_spi_write_read_8bit()
404 orion_spi = spi_master_get_devdata(spi->master); in orion_spi_write_read_16bit()
418 dev_err(&spi->dev, "TXS timed out\n"); in orion_spi_write_read_16bit()
419 return -1; in orion_spi_write_read_16bit()
434 int cs = spi->chip_select; in orion_spi_write_read() local
437 word_len = spi->bits_per_word; in orion_spi_write_read()
438 count = xfer->len; in orion_spi_write_read()
440 orion_spi = spi_master_get_devdata(spi->master); in orion_spi_write_read()
446 vaddr = orion_spi->child[cs].direct_access.vaddr; in orion_spi_write_read()
448 if (vaddr && xfer->tx_buf && word_len == 8) { in orion_spi_write_read()
453 * Send the TX-data to the SPI device via the direct in orion_spi_write_read()
456 iowrite32_rep(vaddr, xfer->tx_buf, cnt); in orion_spi_write_read()
458 u32 *buf = (u32 *)xfer->tx_buf; in orion_spi_write_read()
467 const u8 *tx = xfer->tx_buf; in orion_spi_write_read()
468 u8 *rx = xfer->rx_buf; in orion_spi_write_read()
472 goto out; in orion_spi_write_read()
473 count--; in orion_spi_write_read()
474 spi_delay_exec(&xfer->word_delay, xfer); in orion_spi_write_read()
477 const u16 *tx = xfer->tx_buf; in orion_spi_write_read()
478 u16 *rx = xfer->rx_buf; in orion_spi_write_read()
482 goto out; in orion_spi_write_read()
483 count -= 2; in orion_spi_write_read()
484 spi_delay_exec(&xfer->word_delay, xfer); in orion_spi_write_read()
488 out: in orion_spi_write_read()
489 return xfer->len - count; in orion_spi_write_read()
502 if (t->len) in orion_spi_transfer_one()
515 /* Verify that the CS is deasserted */ in orion_spi_reset()
518 /* Don't deassert CS between the direct mapped SPI transfers */ in orion_spi_reset()
563 .compatible = "marvell,orion-spi",
567 .compatible = "marvell,armada-370-spi",
571 .compatible = "marvell,armada-375-spi",
575 .compatible = "marvell,armada-380-spi",
579 .compatible = "marvell,armada-390-spi",
583 .compatible = "marvell,armada-xp-spi",
602 master = spi_alloc_master(&pdev->dev, sizeof(*spi)); in orion_spi_probe()
604 dev_dbg(&pdev->dev, "master allocation failed\n"); in orion_spi_probe()
605 return -ENOMEM; in orion_spi_probe()
608 if (pdev->id != -1) in orion_spi_probe()
609 master->bus_num = pdev->id; in orion_spi_probe()
610 if (pdev->dev.of_node) { in orion_spi_probe()
613 if (!of_property_read_u32(pdev->dev.of_node, "cell-index", in orion_spi_probe()
615 master->bus_num = cell_index; in orion_spi_probe()
619 master->mode_bits = SPI_CPHA | SPI_CPOL | SPI_LSB_FIRST; in orion_spi_probe()
620 master->set_cs = orion_spi_set_cs; in orion_spi_probe()
621 master->transfer_one = orion_spi_transfer_one; in orion_spi_probe()
622 master->num_chipselect = ORION_NUM_CHIPSELECTS; in orion_spi_probe()
623 master->setup = orion_spi_setup; in orion_spi_probe()
624 master->bits_per_word_mask = SPI_BPW_MASK(8) | SPI_BPW_MASK(16); in orion_spi_probe()
625 master->auto_runtime_pm = true; in orion_spi_probe()
626 master->use_gpio_descriptors = true; in orion_spi_probe()
627 master->flags = SPI_MASTER_GPIO_SS; in orion_spi_probe()
632 spi->master = master; in orion_spi_probe()
634 of_id = of_match_device(orion_spi_of_match_table, &pdev->dev); in orion_spi_probe()
635 devdata = (of_id) ? of_id->data : &orion_spi_dev_data; in orion_spi_probe()
636 spi->devdata = devdata; in orion_spi_probe()
638 spi->clk = devm_clk_get(&pdev->dev, NULL); in orion_spi_probe()
639 if (IS_ERR(spi->clk)) { in orion_spi_probe()
640 status = PTR_ERR(spi->clk); in orion_spi_probe()
641 goto out; in orion_spi_probe()
644 status = clk_prepare_enable(spi->clk); in orion_spi_probe()
646 goto out; in orion_spi_probe()
649 spi->axi_clk = devm_clk_get(&pdev->dev, "axi"); in orion_spi_probe()
650 if (PTR_ERR(spi->axi_clk) == -EPROBE_DEFER) { in orion_spi_probe()
651 status = -EPROBE_DEFER; in orion_spi_probe()
654 if (!IS_ERR(spi->axi_clk)) in orion_spi_probe()
655 clk_prepare_enable(spi->axi_clk); in orion_spi_probe()
657 tclk_hz = clk_get_rate(spi->clk); in orion_spi_probe()
660 * With old device tree, armada-370-spi could be used with in orion_spi_probe()
666 if (of_device_is_compatible(pdev->dev.of_node, in orion_spi_probe()
667 "marvell,armada-370-spi")) in orion_spi_probe()
668 master->max_speed_hz = min(devdata->max_hz, in orion_spi_probe()
669 DIV_ROUND_UP(tclk_hz, devdata->min_divisor)); in orion_spi_probe()
670 else if (devdata->min_divisor) in orion_spi_probe()
671 master->max_speed_hz = in orion_spi_probe()
672 DIV_ROUND_UP(tclk_hz, devdata->min_divisor); in orion_spi_probe()
674 master->max_speed_hz = devdata->max_hz; in orion_spi_probe()
675 master->min_speed_hz = DIV_ROUND_UP(tclk_hz, devdata->max_divisor); in orion_spi_probe()
678 spi->base = devm_ioremap_resource(&pdev->dev, r); in orion_spi_probe()
679 if (IS_ERR(spi->base)) { in orion_spi_probe()
680 status = PTR_ERR(spi->base); in orion_spi_probe()
684 for_each_available_child_of_node(pdev->dev.of_node, np) { in orion_spi_probe()
686 u32 cs; in orion_spi_probe() local
688 /* Get chip-select number from the "reg" property */ in orion_spi_probe()
689 status = of_property_read_u32(np, "reg", &cs); in orion_spi_probe()
691 dev_err(&pdev->dev, in orion_spi_probe()
704 status = of_address_to_resource(pdev->dev.of_node, cs + 1, r); in orion_spi_probe()
714 dir_acc = &spi->child[cs].direct_access; in orion_spi_probe()
715 dir_acc->vaddr = devm_ioremap(&pdev->dev, r->start, PAGE_SIZE); in orion_spi_probe()
716 if (!dir_acc->vaddr) { in orion_spi_probe()
717 status = -ENOMEM; in orion_spi_probe()
720 dir_acc->size = PAGE_SIZE; in orion_spi_probe()
722 dev_info(&pdev->dev, "CS%d configured for direct access\n", cs); in orion_spi_probe()
725 pm_runtime_set_active(&pdev->dev); in orion_spi_probe()
726 pm_runtime_use_autosuspend(&pdev->dev); in orion_spi_probe()
727 pm_runtime_set_autosuspend_delay(&pdev->dev, SPI_AUTOSUSPEND_TIMEOUT); in orion_spi_probe()
728 pm_runtime_enable(&pdev->dev); in orion_spi_probe()
734 master->dev.of_node = pdev->dev.of_node; in orion_spi_probe()
742 pm_runtime_disable(&pdev->dev); in orion_spi_probe()
744 clk_disable_unprepare(spi->axi_clk); in orion_spi_probe()
746 clk_disable_unprepare(spi->clk); in orion_spi_probe()
747 out: in orion_spi_probe()
758 pm_runtime_get_sync(&pdev->dev); in orion_spi_remove()
759 clk_disable_unprepare(spi->axi_clk); in orion_spi_remove()
760 clk_disable_unprepare(spi->clk); in orion_spi_remove()
763 pm_runtime_disable(&pdev->dev); in orion_spi_remove()
776 clk_disable_unprepare(spi->axi_clk); in orion_spi_runtime_suspend()
777 clk_disable_unprepare(spi->clk); in orion_spi_runtime_suspend()
786 if (!IS_ERR(spi->axi_clk)) in orion_spi_runtime_resume()
787 clk_prepare_enable(spi->axi_clk); in orion_spi_runtime_resume()
788 return clk_prepare_enable(spi->clk); in orion_spi_runtime_resume()