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

Commit f305a0a8 authored by Grant Likely's avatar Grant Likely
Browse files


Minor features and bug fixes for PXA, OMAP and GPIO deivce drivers and a
cosmetic change to the bitbang driver.

Signed-off-by: default avatarGrant Likely <grant.likely@secretlab.ca>
parents 766ed704 d560040f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -7178,6 +7178,7 @@ F: drivers/clk/spear/

SPI SUBSYSTEM
M:	Grant Likely <grant.likely@secretlab.ca>
M:	Mark Brown <broonie@opensource.wolfsonmicro.com>
L:	spi-devel-general@lists.sourceforge.net
Q:	http://patchwork.kernel.org/project/spi-devel-general/list/
T:	git git://git.secretlab.ca/git/linux-2.6.git
+2 −2
Original line number Diff line number Diff line
@@ -299,7 +299,7 @@ config SPI_PPC4xx

config SPI_PXA2XX
	tristate "PXA2xx SSP SPI master"
	depends on (ARCH_PXA || (X86_32 && PCI)) && EXPERIMENTAL
	depends on ARCH_PXA || PCI
	select PXA_SSP if ARCH_PXA
	help
	  This enables using a PXA2xx or Sodaville SSP port as a SPI master
@@ -307,7 +307,7 @@ config SPI_PXA2XX
	  additional documentation can be found a Documentation/spi/pxa2xx.

config SPI_PXA2XX_PCI
	def_bool SPI_PXA2XX && X86_32 && PCI
	def_tristate SPI_PXA2XX && PCI

config SPI_RSPI
	tristate "Renesas RSPI controller"
+14 −13
Original line number Diff line number Diff line
@@ -427,40 +427,41 @@ EXPORT_SYMBOL_GPL(spi_bitbang_transfer);
 */
int spi_bitbang_start(struct spi_bitbang *bitbang)
{
	struct spi_master *master = bitbang->master;
	int status;

	if (!bitbang->master || !bitbang->chipselect)
	if (!master || !bitbang->chipselect)
		return -EINVAL;

	INIT_WORK(&bitbang->work, bitbang_work);
	spin_lock_init(&bitbang->lock);
	INIT_LIST_HEAD(&bitbang->queue);

	if (!bitbang->master->mode_bits)
		bitbang->master->mode_bits = SPI_CPOL | SPI_CPHA | bitbang->flags;
	if (!master->mode_bits)
		master->mode_bits = SPI_CPOL | SPI_CPHA | bitbang->flags;

	if (!bitbang->master->transfer)
		bitbang->master->transfer = spi_bitbang_transfer;
	if (!master->transfer)
		master->transfer = spi_bitbang_transfer;
	if (!bitbang->txrx_bufs) {
		bitbang->use_dma = 0;
		bitbang->txrx_bufs = spi_bitbang_bufs;
		if (!bitbang->master->setup) {
		if (!master->setup) {
			if (!bitbang->setup_transfer)
				bitbang->setup_transfer =
					 spi_bitbang_setup_transfer;
			bitbang->master->setup = spi_bitbang_setup;
			bitbang->master->cleanup = spi_bitbang_cleanup;
			master->setup = spi_bitbang_setup;
			master->cleanup = spi_bitbang_cleanup;
		}
	} else if (!bitbang->master->setup)
	} else if (!master->setup)
		return -EINVAL;
	if (bitbang->master->transfer == spi_bitbang_transfer &&
	if (master->transfer == spi_bitbang_transfer &&
			!bitbang->setup_transfer)
		return -EINVAL;

	/* this task is the only thing to touch the SPI bits */
	bitbang->busy = 0;
	bitbang->workqueue = create_singlethread_workqueue(
			dev_name(bitbang->master->dev.parent));
			dev_name(master->dev.parent));
	if (bitbang->workqueue == NULL) {
		status = -EBUSY;
		goto err1;
@@ -469,7 +470,7 @@ int spi_bitbang_start(struct spi_bitbang *bitbang)
	/* driver may get busy before register() returns, especially
	 * if someone registered boardinfo for devices
	 */
	status = spi_register_master(bitbang->master);
	status = spi_register_master(master);
	if (status < 0)
		goto err2;

+20 −3
Original line number Diff line number Diff line
@@ -365,9 +365,26 @@ static int spi_gpio_probe_dt(struct platform_device *pdev)
	if (!pdata)
		return -ENOMEM;

	pdata->sck = of_get_named_gpio(np, "gpio-sck", 0);
	pdata->miso = of_get_named_gpio(np, "gpio-miso", 0);
	pdata->mosi = of_get_named_gpio(np, "gpio-mosi", 0);
	ret = of_get_named_gpio(np, "gpio-sck", 0);
	if (ret < 0) {
		dev_err(&pdev->dev, "gpio-sck property not found\n");
		goto error_free;
	}
	pdata->sck = ret;

	ret = of_get_named_gpio(np, "gpio-miso", 0);
	if (ret < 0) {
		dev_info(&pdev->dev, "gpio-miso property not found, switching to no-rx mode\n");
		pdata->miso = SPI_GPIO_NO_MISO;
	} else
		pdata->miso = ret;

	ret = of_get_named_gpio(np, "gpio-mosi", 0);
	if (ret < 0) {
		dev_info(&pdev->dev, "gpio-mosi property not found, switching to no-tx mode\n");
		pdata->mosi = SPI_GPIO_NO_MOSI;
	} else
		pdata->mosi = ret;

	ret = of_property_read_u32(np, "num-chipselects", &tmp);
	if (ret < 0) {
+26 −8
Original line number Diff line number Diff line
@@ -927,6 +927,7 @@ static void omap2_mcspi_work(struct omap2_mcspi *mcspi, struct spi_message *m)

	struct spi_device		*spi;
	struct spi_transfer		*t = NULL;
	struct spi_master		*master;
	int				cs_active = 0;
	struct omap2_mcspi_cs		*cs;
	struct omap2_mcspi_device_config *cd;
@@ -935,6 +936,7 @@ static void omap2_mcspi_work(struct omap2_mcspi *mcspi, struct spi_message *m)
	u32				chconf;

	spi = m->spi;
	master = spi->master;
	cs = spi->controller_state;
	cd = spi->controller_data;

@@ -952,6 +954,14 @@ static void omap2_mcspi_work(struct omap2_mcspi *mcspi, struct spi_message *m)
			if (!t->speed_hz && !t->bits_per_word)
				par_override = 0;
		}
		if (cd && cd->cs_per_word) {
			chconf = mcspi->ctx.modulctrl;
			chconf &= ~OMAP2_MCSPI_MODULCTRL_SINGLE;
			mcspi_write_reg(master, OMAP2_MCSPI_MODULCTRL, chconf);
			mcspi->ctx.modulctrl =
				mcspi_read_cs_reg(spi, OMAP2_MCSPI_MODULCTRL);
		}


		if (!cs_active) {
			omap2_mcspi_force_cs(spi, 1);
@@ -1013,6 +1023,14 @@ static void omap2_mcspi_work(struct omap2_mcspi *mcspi, struct spi_message *m)
	if (cs_active)
		omap2_mcspi_force_cs(spi, 0);

	if (cd && cd->cs_per_word) {
		chconf = mcspi->ctx.modulctrl;
		chconf |= OMAP2_MCSPI_MODULCTRL_SINGLE;
		mcspi_write_reg(master, OMAP2_MCSPI_MODULCTRL, chconf);
		mcspi->ctx.modulctrl =
			mcspi_read_cs_reg(spi, OMAP2_MCSPI_MODULCTRL);
	}

	omap2_mcspi_set_enable(spi, 0);

	m->status = status;
Loading