Loading MAINTAINERS +1 −0 Original line number Diff line number Diff line Loading @@ -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 Loading drivers/spi/Kconfig +2 −2 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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" Loading drivers/spi/spi-bitbang.c +14 −13 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading drivers/spi/spi-gpio.c +20 −3 Original line number Diff line number Diff line Loading @@ -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) { Loading drivers/spi/spi-omap2-mcspi.c +26 −8 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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); Loading Loading @@ -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 Loading
MAINTAINERS +1 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
drivers/spi/Kconfig +2 −2 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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" Loading
drivers/spi/spi-bitbang.c +14 −13 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading
drivers/spi/spi-gpio.c +20 −3 Original line number Diff line number Diff line Loading @@ -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) { Loading
drivers/spi/spi-omap2-mcspi.c +26 −8 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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); Loading Loading @@ -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