Commit 75872ebe authored by Ken Wilson's avatar Ken Wilson Committed by Mark Brown

spi: orion: Change spi-orion to use transfer_one() semantics for SPI transfers

This commit changes spi-orion to provide setup, set_cs, and transfer_one
functions instead of transfer_one_message. This allows chip select support
for both native and GPIO chip selects to be added.
Signed-off-by: default avatarKen Wilson <ken.wilson@opengear.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 97bf6af1
...@@ -215,9 +215,14 @@ orion_spi_setup_transfer(struct spi_device *spi, struct spi_transfer *t) ...@@ -215,9 +215,14 @@ orion_spi_setup_transfer(struct spi_device *spi, struct spi_transfer *t)
return 0; return 0;
} }
static void orion_spi_set_cs(struct orion_spi *orion_spi, int enable) static void orion_spi_set_cs(struct spi_device *spi, bool enable)
{ {
if (enable) struct orion_spi *orion_spi;
orion_spi = spi_master_get_devdata(spi->master);
/* Chip select logic is inverted from spi_set_cs */
if (!enable)
orion_spi_setbits(orion_spi, ORION_SPI_IF_CTRL_REG, 0x1); orion_spi_setbits(orion_spi, ORION_SPI_IF_CTRL_REG, 0x1);
else else
orion_spi_clrbits(orion_spi, ORION_SPI_IF_CTRL_REG, 0x1); orion_spi_clrbits(orion_spi, ORION_SPI_IF_CTRL_REG, 0x1);
...@@ -332,64 +337,31 @@ orion_spi_write_read(struct spi_device *spi, struct spi_transfer *xfer) ...@@ -332,64 +337,31 @@ orion_spi_write_read(struct spi_device *spi, struct spi_transfer *xfer)
return xfer->len - count; return xfer->len - count;
} }
static int orion_spi_transfer_one_message(struct spi_master *master, static int orion_spi_transfer_one(struct spi_master *master,
struct spi_message *m) struct spi_device *spi,
struct spi_transfer *t)
{ {
struct orion_spi *orion_spi = spi_master_get_devdata(master);
struct spi_device *spi = m->spi;
struct spi_transfer *t = NULL;
int par_override = 0;
int status = 0; int status = 0;
int cs_active = 0;
/* Load defaults */
status = orion_spi_setup_transfer(spi, NULL);
status = orion_spi_setup_transfer(spi, t);
if (status < 0) if (status < 0)
goto msg_done; return status;
list_for_each_entry(t, &m->transfers, transfer_list) {
if (par_override || t->speed_hz || t->bits_per_word) {
par_override = 1;
status = orion_spi_setup_transfer(spi, t);
if (status < 0)
break;
if (!t->speed_hz && !t->bits_per_word)
par_override = 0;
}
if (!cs_active) {
orion_spi_set_cs(orion_spi, 1);
cs_active = 1;
}
if (t->len) if (t->len)
m->actual_length += orion_spi_write_read(spi, t); orion_spi_write_read(spi, t);
if (t->delay_usecs) return status;
udelay(t->delay_usecs); }
if (t->cs_change) {
orion_spi_set_cs(orion_spi, 0);
cs_active = 0;
}
}
msg_done:
if (cs_active)
orion_spi_set_cs(orion_spi, 0);
m->status = status;
spi_finalize_current_message(master);
return 0; static int orion_spi_setup(struct spi_device *spi)
{
return orion_spi_setup_transfer(spi, NULL);
} }
static int orion_spi_reset(struct orion_spi *orion_spi) static int orion_spi_reset(struct orion_spi *orion_spi)
{ {
/* Verify that the CS is deasserted */ /* Verify that the CS is deasserted */
orion_spi_set_cs(orion_spi, 0); orion_spi_clrbits(orion_spi, ORION_SPI_IF_CTRL_REG, 0x1);
return 0; return 0;
} }
...@@ -442,9 +414,10 @@ static int orion_spi_probe(struct platform_device *pdev) ...@@ -442,9 +414,10 @@ static int orion_spi_probe(struct platform_device *pdev)
/* we support only mode 0, and no options */ /* we support only mode 0, and no options */
master->mode_bits = SPI_CPHA | SPI_CPOL; master->mode_bits = SPI_CPHA | SPI_CPOL;
master->set_cs = orion_spi_set_cs;
master->transfer_one_message = orion_spi_transfer_one_message; master->transfer_one = orion_spi_transfer_one;
master->num_chipselect = ORION_NUM_CHIPSELECTS; master->num_chipselect = ORION_NUM_CHIPSELECTS;
master->setup = orion_spi_setup;
master->bits_per_word_mask = SPI_BPW_MASK(8) | SPI_BPW_MASK(16); master->bits_per_word_mask = SPI_BPW_MASK(8) | SPI_BPW_MASK(16);
master->auto_runtime_pm = true; master->auto_runtime_pm = true;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment