mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
Merge git://git.marvell.com/orion into devel
This commit is contained in:
commit
72aaf09fda
294 changed files with 5979 additions and 2409 deletions
|
|
@ -369,10 +369,23 @@ static int au1550_spi_dma_txrxb(struct spi_device *spi, struct spi_transfer *t)
|
|||
dma_rx_addr = t->rx_dma;
|
||||
|
||||
/*
|
||||
* check if buffers are already dma mapped, map them otherwise
|
||||
* check if buffers are already dma mapped, map them otherwise:
|
||||
* - first map the TX buffer, so cache data gets written to memory
|
||||
* - then map the RX buffer, so that cache entries (with
|
||||
* soon-to-be-stale data) get removed
|
||||
* use rx buffer in place of tx if tx buffer was not provided
|
||||
* use temp rx buffer (preallocated or realloc to fit) for rx dma
|
||||
*/
|
||||
if (t->tx_buf) {
|
||||
if (t->tx_dma == 0) { /* if DMA_ADDR_INVALID, map it */
|
||||
dma_tx_addr = dma_map_single(hw->dev,
|
||||
(void *)t->tx_buf,
|
||||
t->len, DMA_TO_DEVICE);
|
||||
if (dma_mapping_error(hw->dev, dma_tx_addr))
|
||||
dev_err(hw->dev, "tx dma map error\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (t->rx_buf) {
|
||||
if (t->rx_dma == 0) { /* if DMA_ADDR_INVALID, map it */
|
||||
dma_rx_addr = dma_map_single(hw->dev,
|
||||
|
|
@ -396,15 +409,8 @@ static int au1550_spi_dma_txrxb(struct spi_device *spi, struct spi_transfer *t)
|
|||
dma_sync_single_for_device(hw->dev, dma_rx_addr,
|
||||
t->len, DMA_FROM_DEVICE);
|
||||
}
|
||||
if (t->tx_buf) {
|
||||
if (t->tx_dma == 0) { /* if DMA_ADDR_INVALID, map it */
|
||||
dma_tx_addr = dma_map_single(hw->dev,
|
||||
(void *)t->tx_buf,
|
||||
t->len, DMA_TO_DEVICE);
|
||||
if (dma_mapping_error(hw->dev, dma_tx_addr))
|
||||
dev_err(hw->dev, "tx dma map error\n");
|
||||
}
|
||||
} else {
|
||||
|
||||
if (!t->tx_buf) {
|
||||
dma_sync_single_for_device(hw->dev, dma_rx_addr,
|
||||
t->len, DMA_BIDIRECTIONAL);
|
||||
hw->tx = hw->rx;
|
||||
|
|
|
|||
|
|
@ -142,6 +142,7 @@ static int mpc52xx_psc_spi_transfer_rxtx(struct spi_device *spi,
|
|||
unsigned rfalarm;
|
||||
unsigned send_at_once = MPC52xx_PSC_BUFSIZE;
|
||||
unsigned recv_at_once;
|
||||
int last_block = 0;
|
||||
|
||||
if (!t->tx_buf && !t->rx_buf && t->len)
|
||||
return -EINVAL;
|
||||
|
|
@ -151,15 +152,17 @@ static int mpc52xx_psc_spi_transfer_rxtx(struct spi_device *spi,
|
|||
while (rb < t->len) {
|
||||
if (t->len - rb > MPC52xx_PSC_BUFSIZE) {
|
||||
rfalarm = MPC52xx_PSC_RFALARM;
|
||||
last_block = 0;
|
||||
} else {
|
||||
send_at_once = t->len - sb;
|
||||
rfalarm = MPC52xx_PSC_BUFSIZE - (t->len - rb);
|
||||
last_block = 1;
|
||||
}
|
||||
|
||||
dev_dbg(&spi->dev, "send %d bytes...\n", send_at_once);
|
||||
for (; send_at_once; sb++, send_at_once--) {
|
||||
/* set EOF flag before the last word is sent */
|
||||
if (send_at_once == 1)
|
||||
if (send_at_once == 1 && last_block)
|
||||
out_8(&psc->ircr2, 0x01);
|
||||
|
||||
if (tx_buf)
|
||||
|
|
|
|||
|
|
@ -1456,7 +1456,7 @@ static int __init spi_imx_probe(struct platform_device *pdev)
|
|||
struct device *dev = &pdev->dev;
|
||||
struct spi_imx_master *platform_info;
|
||||
struct spi_master *master;
|
||||
struct driver_data *drv_data = NULL;
|
||||
struct driver_data *drv_data;
|
||||
struct resource *res;
|
||||
int irq, status = 0;
|
||||
|
||||
|
|
@ -1467,14 +1467,6 @@ static int __init spi_imx_probe(struct platform_device *pdev)
|
|||
goto err_no_pdata;
|
||||
}
|
||||
|
||||
drv_data->clk = clk_get(&pdev->dev, "perclk2");
|
||||
if (IS_ERR(drv_data->clk)) {
|
||||
dev_err(&pdev->dev, "probe - cannot get get\n");
|
||||
status = PTR_ERR(drv_data->clk);
|
||||
goto err_no_clk;
|
||||
}
|
||||
clk_enable(drv_data->clk);
|
||||
|
||||
/* Allocate master with space for drv_data */
|
||||
master = spi_alloc_master(dev, sizeof(struct driver_data));
|
||||
if (!master) {
|
||||
|
|
@ -1495,6 +1487,14 @@ static int __init spi_imx_probe(struct platform_device *pdev)
|
|||
|
||||
drv_data->dummy_dma_buf = SPI_DUMMY_u32;
|
||||
|
||||
drv_data->clk = clk_get(&pdev->dev, "perclk2");
|
||||
if (IS_ERR(drv_data->clk)) {
|
||||
dev_err(&pdev->dev, "probe - cannot get clock\n");
|
||||
status = PTR_ERR(drv_data->clk);
|
||||
goto err_no_clk;
|
||||
}
|
||||
clk_enable(drv_data->clk);
|
||||
|
||||
/* Find and map resources */
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!res) {
|
||||
|
|
@ -1630,12 +1630,13 @@ err_no_iomap:
|
|||
kfree(drv_data->ioarea);
|
||||
|
||||
err_no_iores:
|
||||
clk_disable(drv_data->clk);
|
||||
clk_put(drv_data->clk);
|
||||
|
||||
err_no_clk:
|
||||
spi_master_put(master);
|
||||
|
||||
err_no_pdata:
|
||||
clk_disable(drv_data->clk);
|
||||
clk_put(drv_data->clk);
|
||||
err_no_clk:
|
||||
err_no_mem:
|
||||
return status;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ struct s3c2410_spigpio {
|
|||
|
||||
static inline struct s3c2410_spigpio *spidev_to_sg(struct spi_device *spi)
|
||||
{
|
||||
return spi->controller_data;
|
||||
return spi_master_get_devdata(spi->master);
|
||||
}
|
||||
|
||||
static inline void setsck(struct spi_device *dev, int on)
|
||||
|
|
@ -118,6 +118,7 @@ static int s3c2410_spigpio_probe(struct platform_device *dev)
|
|||
/* setup spi bitbang adaptor */
|
||||
sp->bitbang.master = spi_master_get(master);
|
||||
sp->bitbang.master->bus_num = info->bus_num;
|
||||
sp->bitbang.master->num_chipselect = info->num_chipselect;
|
||||
sp->bitbang.chipselect = s3c2410_spigpio_chipselect;
|
||||
|
||||
sp->bitbang.txrx_word[SPI_MODE_0] = s3c2410_spigpio_txrx_mode0;
|
||||
|
|
|
|||
|
|
@ -597,7 +597,9 @@ static int spidev_probe(struct spi_device *spi)
|
|||
}
|
||||
mutex_unlock(&device_list_lock);
|
||||
|
||||
if (status != 0)
|
||||
if (status == 0)
|
||||
spi_set_drvdata(spi, spidev);
|
||||
else
|
||||
kfree(spidev);
|
||||
|
||||
return status;
|
||||
|
|
|
|||
Loading…
Reference in a new issue