mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-27 11:55:53 +00:00
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: Ken Wilson <ken.wilson@opengear.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
97bf6af1f9
commit
75872ebe96
@ -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 @@ out:
|
|||||||
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 (t->len)
|
||||||
if (par_override || t->speed_hz || t->bits_per_word) {
|
orion_spi_write_read(spi, t);
|
||||||
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) {
|
return status;
|
||||||
orion_spi_set_cs(orion_spi, 1);
|
}
|
||||||
cs_active = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (t->len)
|
static int orion_spi_setup(struct spi_device *spi)
|
||||||
m->actual_length += orion_spi_write_read(spi, t);
|
{
|
||||||
|
return orion_spi_setup_transfer(spi, NULL);
|
||||||
if (t->delay_usecs)
|
|
||||||
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_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)
|
|||||||
|
|
||||||
/* 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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user