Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+23 −50
Original line number Original line Diff line number Diff line
@@ -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);


	if (status < 0)
		goto msg_done;

	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);
	status = orion_spi_setup_transfer(spi, t);
	if (status < 0)
	if (status < 0)
				break;
		return status;
			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:
static int orion_spi_setup(struct spi_device *spi)
	if (cs_active)
{
		orion_spi_set_cs(orion_spi, 0);
	return orion_spi_setup_transfer(spi, NULL);

	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;