mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 20:22:09 +00:00
Merge branch 'for-5.7' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi into spi-5.8
This commit is contained in:
commit
f13242d2c5
@ -489,22 +489,6 @@ static int spi_engine_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
spin_lock_init(&spi_engine->lock);
|
spin_lock_init(&spi_engine->lock);
|
||||||
|
|
||||||
spi_engine->base = devm_platform_ioremap_resource(pdev, 0);
|
|
||||||
if (IS_ERR(spi_engine->base)) {
|
|
||||||
ret = PTR_ERR(spi_engine->base);
|
|
||||||
goto err_put_master;
|
|
||||||
}
|
|
||||||
|
|
||||||
version = readl(spi_engine->base + SPI_ENGINE_REG_VERSION);
|
|
||||||
if (SPI_ENGINE_VERSION_MAJOR(version) != 1) {
|
|
||||||
dev_err(&pdev->dev, "Unsupported peripheral version %u.%u.%c\n",
|
|
||||||
SPI_ENGINE_VERSION_MAJOR(version),
|
|
||||||
SPI_ENGINE_VERSION_MINOR(version),
|
|
||||||
SPI_ENGINE_VERSION_PATCH(version));
|
|
||||||
ret = -ENODEV;
|
|
||||||
goto err_put_master;
|
|
||||||
}
|
|
||||||
|
|
||||||
spi_engine->clk = devm_clk_get(&pdev->dev, "s_axi_aclk");
|
spi_engine->clk = devm_clk_get(&pdev->dev, "s_axi_aclk");
|
||||||
if (IS_ERR(spi_engine->clk)) {
|
if (IS_ERR(spi_engine->clk)) {
|
||||||
ret = PTR_ERR(spi_engine->clk);
|
ret = PTR_ERR(spi_engine->clk);
|
||||||
@ -525,6 +509,22 @@ static int spi_engine_probe(struct platform_device *pdev)
|
|||||||
if (ret)
|
if (ret)
|
||||||
goto err_clk_disable;
|
goto err_clk_disable;
|
||||||
|
|
||||||
|
spi_engine->base = devm_platform_ioremap_resource(pdev, 0);
|
||||||
|
if (IS_ERR(spi_engine->base)) {
|
||||||
|
ret = PTR_ERR(spi_engine->base);
|
||||||
|
goto err_ref_clk_disable;
|
||||||
|
}
|
||||||
|
|
||||||
|
version = readl(spi_engine->base + SPI_ENGINE_REG_VERSION);
|
||||||
|
if (SPI_ENGINE_VERSION_MAJOR(version) != 1) {
|
||||||
|
dev_err(&pdev->dev, "Unsupported peripheral version %u.%u.%c\n",
|
||||||
|
SPI_ENGINE_VERSION_MAJOR(version),
|
||||||
|
SPI_ENGINE_VERSION_MINOR(version),
|
||||||
|
SPI_ENGINE_VERSION_PATCH(version));
|
||||||
|
ret = -ENODEV;
|
||||||
|
goto err_ref_clk_disable;
|
||||||
|
}
|
||||||
|
|
||||||
writel_relaxed(0x00, spi_engine->base + SPI_ENGINE_REG_RESET);
|
writel_relaxed(0x00, spi_engine->base + SPI_ENGINE_REG_RESET);
|
||||||
writel_relaxed(0xff, spi_engine->base + SPI_ENGINE_REG_INT_PENDING);
|
writel_relaxed(0xff, spi_engine->base + SPI_ENGINE_REG_INT_PENDING);
|
||||||
writel_relaxed(0x00, spi_engine->base + SPI_ENGINE_REG_INT_ENABLE);
|
writel_relaxed(0x00, spi_engine->base + SPI_ENGINE_REG_INT_ENABLE);
|
||||||
|
@ -677,19 +677,15 @@ static int update_qspi_trans_byte_count(struct bcm_qspi *qspi,
|
|||||||
if (qt->trans->cs_change &&
|
if (qt->trans->cs_change &&
|
||||||
(flags & TRANS_STATUS_BREAK_CS_CHANGE))
|
(flags & TRANS_STATUS_BREAK_CS_CHANGE))
|
||||||
ret |= TRANS_STATUS_BREAK_CS_CHANGE;
|
ret |= TRANS_STATUS_BREAK_CS_CHANGE;
|
||||||
if (ret)
|
|
||||||
goto done;
|
|
||||||
|
|
||||||
dev_dbg(&qspi->pdev->dev, "advance msg exit\n");
|
|
||||||
if (bcm_qspi_mspi_transfer_is_last(qspi, qt))
|
if (bcm_qspi_mspi_transfer_is_last(qspi, qt))
|
||||||
ret = TRANS_STATUS_BREAK_EOM;
|
ret |= TRANS_STATUS_BREAK_EOM;
|
||||||
else
|
else
|
||||||
ret = TRANS_STATUS_BREAK_NO_BYTES;
|
ret |= TRANS_STATUS_BREAK_NO_BYTES;
|
||||||
|
|
||||||
qt->trans = NULL;
|
qt->trans = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
|
||||||
dev_dbg(&qspi->pdev->dev, "trans %p len %d byte %d ret %x\n",
|
dev_dbg(&qspi->pdev->dev, "trans %p len %d byte %d ret %x\n",
|
||||||
qt->trans, qt->trans ? qt->trans->len : 0, qt->byte, ret);
|
qt->trans, qt->trans ? qt->trans->len : 0, qt->byte, ret);
|
||||||
return ret;
|
return ret;
|
||||||
@ -735,7 +731,7 @@ static void read_from_hw(struct bcm_qspi *qspi, int slots)
|
|||||||
if (buf)
|
if (buf)
|
||||||
buf[tp.byte] = read_rxram_slot_u8(qspi, slot);
|
buf[tp.byte] = read_rxram_slot_u8(qspi, slot);
|
||||||
dev_dbg(&qspi->pdev->dev, "RD %02x\n",
|
dev_dbg(&qspi->pdev->dev, "RD %02x\n",
|
||||||
buf ? buf[tp.byte] : 0xff);
|
buf ? buf[tp.byte] : 0x0);
|
||||||
} else {
|
} else {
|
||||||
u16 *buf = tp.trans->rx_buf;
|
u16 *buf = tp.trans->rx_buf;
|
||||||
|
|
||||||
@ -743,7 +739,7 @@ static void read_from_hw(struct bcm_qspi *qspi, int slots)
|
|||||||
buf[tp.byte / 2] = read_rxram_slot_u16(qspi,
|
buf[tp.byte / 2] = read_rxram_slot_u16(qspi,
|
||||||
slot);
|
slot);
|
||||||
dev_dbg(&qspi->pdev->dev, "RD %04x\n",
|
dev_dbg(&qspi->pdev->dev, "RD %04x\n",
|
||||||
buf ? buf[tp.byte] : 0xffff);
|
buf ? buf[tp.byte / 2] : 0x0);
|
||||||
}
|
}
|
||||||
|
|
||||||
update_qspi_trans_byte_count(qspi, &tp,
|
update_qspi_trans_byte_count(qspi, &tp,
|
||||||
@ -798,13 +794,13 @@ static int write_to_hw(struct bcm_qspi *qspi, struct spi_device *spi)
|
|||||||
while (!tstatus && slot < MSPI_NUM_CDRAM) {
|
while (!tstatus && slot < MSPI_NUM_CDRAM) {
|
||||||
if (tp.trans->bits_per_word <= 8) {
|
if (tp.trans->bits_per_word <= 8) {
|
||||||
const u8 *buf = tp.trans->tx_buf;
|
const u8 *buf = tp.trans->tx_buf;
|
||||||
u8 val = buf ? buf[tp.byte] : 0xff;
|
u8 val = buf ? buf[tp.byte] : 0x00;
|
||||||
|
|
||||||
write_txram_slot_u8(qspi, slot, val);
|
write_txram_slot_u8(qspi, slot, val);
|
||||||
dev_dbg(&qspi->pdev->dev, "WR %02x\n", val);
|
dev_dbg(&qspi->pdev->dev, "WR %02x\n", val);
|
||||||
} else {
|
} else {
|
||||||
const u16 *buf = tp.trans->tx_buf;
|
const u16 *buf = tp.trans->tx_buf;
|
||||||
u16 val = buf ? buf[tp.byte / 2] : 0xffff;
|
u16 val = buf ? buf[tp.byte / 2] : 0x0000;
|
||||||
|
|
||||||
write_txram_slot_u16(qspi, slot, val);
|
write_txram_slot_u16(qspi, slot, val);
|
||||||
dev_dbg(&qspi->pdev->dev, "WR %04x\n", val);
|
dev_dbg(&qspi->pdev->dev, "WR %04x\n", val);
|
||||||
@ -836,7 +832,16 @@ static int write_to_hw(struct bcm_qspi *qspi, struct spi_device *spi)
|
|||||||
bcm_qspi_write(qspi, MSPI, MSPI_NEWQP, 0);
|
bcm_qspi_write(qspi, MSPI, MSPI_NEWQP, 0);
|
||||||
bcm_qspi_write(qspi, MSPI, MSPI_ENDQP, slot - 1);
|
bcm_qspi_write(qspi, MSPI, MSPI_ENDQP, slot - 1);
|
||||||
|
|
||||||
if (tstatus & TRANS_STATUS_BREAK_DESELECT) {
|
/*
|
||||||
|
* case 1) EOM =1, cs_change =0: SSb inactive
|
||||||
|
* case 2) EOM =1, cs_change =1: SSb stay active
|
||||||
|
* case 3) EOM =0, cs_change =0: SSb stay active
|
||||||
|
* case 4) EOM =0, cs_change =1: SSb inactive
|
||||||
|
*/
|
||||||
|
if (((tstatus & TRANS_STATUS_BREAK_DESELECT)
|
||||||
|
== TRANS_STATUS_BREAK_CS_CHANGE) ||
|
||||||
|
((tstatus & TRANS_STATUS_BREAK_DESELECT)
|
||||||
|
== TRANS_STATUS_BREAK_EOM)) {
|
||||||
mspi_cdram = read_cdram_slot(qspi, slot - 1) &
|
mspi_cdram = read_cdram_slot(qspi, slot - 1) &
|
||||||
~MSPI_CDRAM_CONT_BIT;
|
~MSPI_CDRAM_CONT_BIT;
|
||||||
write_cdram_slot(qspi, slot - 1, mspi_cdram);
|
write_cdram_slot(qspi, slot - 1, mspi_cdram);
|
||||||
@ -1336,6 +1341,11 @@ int bcm_qspi_probe(struct platform_device *pdev,
|
|||||||
}
|
}
|
||||||
|
|
||||||
qspi = spi_master_get_devdata(master);
|
qspi = spi_master_get_devdata(master);
|
||||||
|
|
||||||
|
qspi->clk = devm_clk_get_optional(&pdev->dev, NULL);
|
||||||
|
if (IS_ERR(qspi->clk))
|
||||||
|
return PTR_ERR(qspi->clk);
|
||||||
|
|
||||||
qspi->pdev = pdev;
|
qspi->pdev = pdev;
|
||||||
qspi->trans_pos.trans = NULL;
|
qspi->trans_pos.trans = NULL;
|
||||||
qspi->trans_pos.byte = 0;
|
qspi->trans_pos.byte = 0;
|
||||||
@ -1449,13 +1459,6 @@ int bcm_qspi_probe(struct platform_device *pdev,
|
|||||||
qspi->soc_intc = NULL;
|
qspi->soc_intc = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
qspi->clk = devm_clk_get(&pdev->dev, NULL);
|
|
||||||
if (IS_ERR(qspi->clk)) {
|
|
||||||
dev_warn(dev, "unable to get clock\n");
|
|
||||||
ret = PTR_ERR(qspi->clk);
|
|
||||||
goto qspi_probe_err;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = clk_prepare_enable(qspi->clk);
|
ret = clk_prepare_enable(qspi->clk);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(dev, "failed to prepare clock\n");
|
dev_err(dev, "failed to prepare clock\n");
|
||||||
@ -1532,7 +1535,7 @@ static int __maybe_unused bcm_qspi_suspend(struct device *dev)
|
|||||||
bcm_qspi_read(qspi, BSPI, BSPI_STRAP_OVERRIDE_CTRL);
|
bcm_qspi_read(qspi, BSPI, BSPI_STRAP_OVERRIDE_CTRL);
|
||||||
|
|
||||||
spi_master_suspend(qspi->master);
|
spi_master_suspend(qspi->master);
|
||||||
clk_disable(qspi->clk);
|
clk_disable_unprepare(qspi->clk);
|
||||||
bcm_qspi_hw_uninit(qspi);
|
bcm_qspi_hw_uninit(qspi);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -1550,7 +1553,7 @@ static int __maybe_unused bcm_qspi_resume(struct device *dev)
|
|||||||
qspi->soc_intc->bcm_qspi_int_set(qspi->soc_intc, MSPI_DONE,
|
qspi->soc_intc->bcm_qspi_int_set(qspi->soc_intc, MSPI_DONE,
|
||||||
true);
|
true);
|
||||||
|
|
||||||
ret = clk_enable(qspi->clk);
|
ret = clk_prepare_enable(qspi->clk);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
spi_master_resume(qspi->master);
|
spi_master_resume(qspi->master);
|
||||||
|
|
||||||
|
@ -31,7 +31,8 @@
|
|||||||
#include <linux/platform_data/spi-ep93xx.h>
|
#include <linux/platform_data/spi-ep93xx.h>
|
||||||
|
|
||||||
#define SSPCR0 0x0000
|
#define SSPCR0 0x0000
|
||||||
#define SSPCR0_MODE_SHIFT 6
|
#define SSPCR0_SPO BIT(6)
|
||||||
|
#define SSPCR0_SPH BIT(7)
|
||||||
#define SSPCR0_SCR_SHIFT 8
|
#define SSPCR0_SCR_SHIFT 8
|
||||||
|
|
||||||
#define SSPCR1 0x0004
|
#define SSPCR1 0x0004
|
||||||
@ -159,7 +160,10 @@ static int ep93xx_spi_chip_setup(struct spi_master *master,
|
|||||||
return err;
|
return err;
|
||||||
|
|
||||||
cr0 = div_scr << SSPCR0_SCR_SHIFT;
|
cr0 = div_scr << SSPCR0_SCR_SHIFT;
|
||||||
cr0 |= (spi->mode & (SPI_CPHA | SPI_CPOL)) << SSPCR0_MODE_SHIFT;
|
if (spi->mode & SPI_CPOL)
|
||||||
|
cr0 |= SSPCR0_SPO;
|
||||||
|
if (spi->mode & SPI_CPHA)
|
||||||
|
cr0 |= SSPCR0_SPH;
|
||||||
cr0 |= dss;
|
cr0 |= dss;
|
||||||
|
|
||||||
dev_dbg(&master->dev, "setup: mode %d, cpsr %d, scr %d, dss %d\n",
|
dev_dbg(&master->dev, "setup: mode %d, cpsr %d, scr %d, dss %d\n",
|
||||||
|
@ -345,6 +345,6 @@ static struct i2c_driver sc18is602_driver = {
|
|||||||
|
|
||||||
module_i2c_driver(sc18is602_driver);
|
module_i2c_driver(sc18is602_driver);
|
||||||
|
|
||||||
MODULE_DESCRIPTION("SC18IC602/603 SPI Master Driver");
|
MODULE_DESCRIPTION("SC18IS602/603 SPI Master Driver");
|
||||||
MODULE_AUTHOR("Guenter Roeck");
|
MODULE_AUTHOR("Guenter Roeck");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
|
@ -2111,6 +2111,7 @@ static int acpi_spi_add_resource(struct acpi_resource *ares, void *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
lookup->max_speed_hz = sb->connection_speed;
|
lookup->max_speed_hz = sb->connection_speed;
|
||||||
|
lookup->bits_per_word = sb->data_bit_length;
|
||||||
|
|
||||||
if (sb->clock_phase == ACPI_SPI_SECOND_PHASE)
|
if (sb->clock_phase == ACPI_SPI_SECOND_PHASE)
|
||||||
lookup->mode |= SPI_CPHA;
|
lookup->mode |= SPI_CPHA;
|
||||||
|
Loading…
Reference in New Issue
Block a user