SPI bug fixes on top of v3.4-rc2

Miscellaneous driver bug fixes.  No major changes in this branch.
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1.4.11 (GNU/Linux)
 
 iQIcBAABAgAGBQJPiG0NAAoJEEFnBt12D9kBUekP/R1qIWR2kvwNKWqv+7f1HMda
 cF0/evfraqNoEM2qGeq06fyF/7ows3NyWLvLqdut3+7rmbhl62vekYOt44efrYLA
 J6KQGcIvo5C02wSiwK2McyjzkijvQ4hxiPGGeUwI7Pc1nj4JmrT3bXUJvlvwOh/4
 lYeHMwEhhmg/yN0qMMqA9D+aRItMqXuxZXRAXfAQTm/o5Yg8EjjDMfMyo+SPUen+
 BpF9qSU+vg33e/5l/sT0eXC5C0xDhEZx/p9gO1De0oqpWIRhusbDI74ZUVHK+8+G
 OIJaMReuULdJcbJJl3Eyt9Mm/776w8+yoHNDTFlchtyzMplpybsWraJTKjeYjuGR
 vzORvpY+mwX08XmOWTt3QJQdUg9cSjrNmtboDhggEeokGFDYjpk17WscsmQjxWUi
 owgoSXMnft6c6CzF2hmvwKFKeE0ljogZhMLdp71hf9zEzr4JiGyTV1hzabWK1af7
 DvqZ6/GNxgWnlso+DTT2EogC5n9f92k65gCaYuU29iQNKeNNPDychLK2KiETqowN
 d0RHsH+sIFo6JdotacTNoH5QMqW6AM9emT6OSGmSWu2zlxg8tY9JO5U7HFIbEHsH
 iak5K/DfWGMfgREXmX4srcfMZ7fQzdwpbaXLKkE6VwQDa5VSlgt6ezVDMOC4lh4P
 3dSv07cV/Eo1My0YBGyJ
 =tw/j
 -----END PGP SIGNATURE-----

Merge tag 'spi-for-linus' of git://git.secretlab.ca/git/linux-2.6

Pull SPI bug fixes from Grant Likely:
 "Miscellaneous driver bug fixes.  No major changes in this branch."

* tag 'spi-for-linus' of git://git.secretlab.ca/git/linux-2.6:
  spi/imx: prevent NULL pointer dereference in spi_imx_probe()
  spi/imx: mark base member in spi_imx_data as __iomem
  spi/mpc83xx: fix NULL pdata dereference bug
  spi/davinci: Fix DMA API usage in davinci
  spi/pL022: include types.h to remove compilation warnings
This commit is contained in:
Linus Torvalds 2012-04-13 12:17:45 -07:00
Родитель 4166fb6459 39ec0d3814
Коммит cf7d8a5550
4 изменённых файлов: 16 добавлений и 8 удалений

Просмотреть файл

@ -653,7 +653,7 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t)
dev_dbg(sdev, "Couldn't DMA map a %d bytes RX buffer\n", dev_dbg(sdev, "Couldn't DMA map a %d bytes RX buffer\n",
rx_buf_count); rx_buf_count);
if (t->tx_buf) if (t->tx_buf)
dma_unmap_single(NULL, t->tx_dma, t->len, dma_unmap_single(&spi->dev, t->tx_dma, t->len,
DMA_TO_DEVICE); DMA_TO_DEVICE);
return -ENOMEM; return -ENOMEM;
} }
@ -692,10 +692,10 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t)
if (spicfg->io_type == SPI_IO_TYPE_DMA) { if (spicfg->io_type == SPI_IO_TYPE_DMA) {
if (t->tx_buf) if (t->tx_buf)
dma_unmap_single(NULL, t->tx_dma, t->len, dma_unmap_single(&spi->dev, t->tx_dma, t->len,
DMA_TO_DEVICE); DMA_TO_DEVICE);
dma_unmap_single(NULL, t->rx_dma, rx_buf_count, dma_unmap_single(&spi->dev, t->rx_dma, rx_buf_count,
DMA_FROM_DEVICE); DMA_FROM_DEVICE);
clear_io_bits(dspi->base + SPIINT, SPIINT_DMA_REQ_EN); clear_io_bits(dspi->base + SPIINT, SPIINT_DMA_REQ_EN);

Просмотреть файл

@ -139,10 +139,12 @@ static void fsl_spi_change_mode(struct spi_device *spi)
static void fsl_spi_chipselect(struct spi_device *spi, int value) static void fsl_spi_chipselect(struct spi_device *spi, int value)
{ {
struct mpc8xxx_spi *mpc8xxx_spi = spi_master_get_devdata(spi->master); struct mpc8xxx_spi *mpc8xxx_spi = spi_master_get_devdata(spi->master);
struct fsl_spi_platform_data *pdata = spi->dev.parent->platform_data; struct fsl_spi_platform_data *pdata;
bool pol = spi->mode & SPI_CS_HIGH; bool pol = spi->mode & SPI_CS_HIGH;
struct spi_mpc8xxx_cs *cs = spi->controller_state; struct spi_mpc8xxx_cs *cs = spi->controller_state;
pdata = spi->dev.parent->parent->platform_data;
if (value == BITBANG_CS_INACTIVE) { if (value == BITBANG_CS_INACTIVE) {
if (pdata->cs_control) if (pdata->cs_control)
pdata->cs_control(spi, !pol); pdata->cs_control(spi, !pol);

Просмотреть файл

@ -83,7 +83,7 @@ struct spi_imx_data {
struct spi_bitbang bitbang; struct spi_bitbang bitbang;
struct completion xfer_done; struct completion xfer_done;
void *base; void __iomem *base;
int irq; int irq;
struct clk *clk; struct clk *clk;
unsigned long spi_clk; unsigned long spi_clk;
@ -766,8 +766,12 @@ static int __devinit spi_imx_probe(struct platform_device *pdev)
} }
ret = of_property_read_u32(np, "fsl,spi-num-chipselects", &num_cs); ret = of_property_read_u32(np, "fsl,spi-num-chipselects", &num_cs);
if (ret < 0) if (ret < 0) {
num_cs = mxc_platform_info->num_chipselect; if (mxc_platform_info)
num_cs = mxc_platform_info->num_chipselect;
else
return ret;
}
master = spi_alloc_master(&pdev->dev, master = spi_alloc_master(&pdev->dev,
sizeof(struct spi_imx_data) + sizeof(int) * num_cs); sizeof(struct spi_imx_data) + sizeof(int) * num_cs);
@ -784,7 +788,7 @@ static int __devinit spi_imx_probe(struct platform_device *pdev)
for (i = 0; i < master->num_chipselect; i++) { for (i = 0; i < master->num_chipselect; i++) {
int cs_gpio = of_get_named_gpio(np, "cs-gpios", i); int cs_gpio = of_get_named_gpio(np, "cs-gpios", i);
if (cs_gpio < 0) if (cs_gpio < 0 && mxc_platform_info)
cs_gpio = mxc_platform_info->chipselect[i]; cs_gpio = mxc_platform_info->chipselect[i];
spi_imx->chipselect[i] = cs_gpio; spi_imx->chipselect[i] = cs_gpio;

Просмотреть файл

@ -25,6 +25,8 @@
#ifndef _SSP_PL022_H #ifndef _SSP_PL022_H
#define _SSP_PL022_H #define _SSP_PL022_H
#include <linux/types.h>
/** /**
* whether SSP is in loopback mode or not * whether SSP is in loopback mode or not
*/ */