transfer_list);
}
---------- len -= prepend_len;
----------
init_completion(&bs->done);
/* Fill in the Message control register */
if (!timeout)
return -ETIMEDOUT;
-- -------- /* read out all data */
-- -------- rx_tail = bcm_spi_readb(bs, SPI_RX_TAIL);
-- --------
-- -------- if (do_rx && rx_tail != len)
-- -------- return -EIO;
-- --------
-- -------- if (!rx_tail)
++ ++++++++ if (!do_rx)
return 0;
len = 0;
irq = platform_get_irq(pdev, 0);
if (irq < 0) {
dev_err(dev, "no irq\n");
-- -------- ret = -ENXIO;
-- -------- goto out;
++ ++++++++ return -ENXIO;
}
-- -------- clk = clk_get(dev, "spi");
++ ++++++++ clk = devm_clk_get(dev, "spi");
if (IS_ERR(clk)) {
dev_err(dev, "no clock for device\n");
-- -------- ret = PTR_ERR(clk);
-- -------- goto out;
++ ++++++++ return PTR_ERR(clk);
}
master = spi_alloc_master(dev, sizeof(*bs));
if (!master) {
dev_err(dev, "out of memory\n");
-- -------- ret = -ENOMEM;
-- -------- goto out_clk;
++ ++++++++ return -ENOMEM;
}
bs = spi_master_get_devdata(master);
}
/* Initialize hardware */
-- -------- clk_prepare_enable(bs->clk);
++ ++++++++ ret = clk_prepare_enable(bs->clk);
++ ++++++++ if (ret)
++ ++++++++ goto out_err;
++ ++++++++
bcm_spi_writeb(bs, SPI_INTR_CLEAR_ALL, SPI_INT_STATUS);
/* register and we are done */
clk_disable_unprepare(clk);
out_err:
spi_master_put(master);
-- --------out_clk:
-- -------- clk_put(clk);
-- --------out:
return ret;
}
static int bcm63xx_spi_remove(struct platform_device *pdev)
{
--- --- - struct spi_master *master = spi_master_get(platform_get_drvdata(pdev));
+++ +++ + struct spi_master *master = platform_get_drvdata(pdev);
struct bcm63xx_spi *bs = spi_master_get_devdata(master);
/* reset spi block */
/* HW shutdown */
clk_disable_unprepare(bs->clk);
-- -------- clk_put(bs->clk);
return 0;
}
-- --------#ifdef CONFIG_PM
++ ++++++++#ifdef CONFIG_PM_SLEEP
static int bcm63xx_spi_suspend(struct device *dev)
{
struct spi_master *master = dev_get_drvdata(dev);
{
struct spi_master *master = dev_get_drvdata(dev);
struct bcm63xx_spi *bs = spi_master_get_devdata(master);
++ ++++++++ int ret;
-- -------- clk_prepare_enable(bs->clk);
++ ++++++++ ret = clk_prepare_enable(bs->clk);
++ ++++++++ if (ret)
++ ++++++++ return ret;
spi_master_resume(master);
return 0;
}
++ ++++++++#endif
static const struct dev_pm_ops bcm63xx_spi_pm_ops = {
-- -------- .suspend = bcm63xx_spi_suspend,
-- -------- .resume = bcm63xx_spi_resume,
++ ++++++++ SET_SYSTEM_SLEEP_PM_OPS(bcm63xx_spi_suspend, bcm63xx_spi_resume)
};
-- --------#define BCM63XX_SPI_PM_OPS (&bcm63xx_spi_pm_ops)
-- --------#else
-- --------#define BCM63XX_SPI_PM_OPS NULL
-- --------#endif
-- --------
static struct platform_driver bcm63xx_spi_driver = {
.driver = {
.name = "bcm63xx-spi",
.owner = THIS_MODULE,
-- -------- .pm = BCM63XX_SPI_PM_OPS,
++ ++++++++ .pm = &bcm63xx_spi_pm_ops,
},
.probe = bcm63xx_spi_probe,
.remove = bcm63xx_spi_remove,
dspi = spi_master_get_devdata(spi->master);
pdata = &dspi->pdata;
----- ----- /* if bits per word length is zero then set it default 8 */
----- ----- if (!spi->bits_per_word)
----- ----- spi->bits_per_word = 8;
----- -----
if (!(spi->mode & SPI_NO_CS)) {
if ((pdata->chip_sel == NULL) ||
(pdata->chip_sel[spi->chip_select] == SPI_INTERN_CS))
struct spi_master *master;
struct davinci_spi *dspi;
struct davinci_spi_platform_data *pdata;
-------- -- struct resource *r, *mem;
++++++++ ++ struct resource *r;
resource_size_t dma_rx_chan = SPI_NO_RESOURCE;
resource_size_t dma_tx_chan = SPI_NO_RESOURCE;
int i = 0, ret = 0;
dspi->pbase = r->start;
-------- -- mem = request_mem_region(r->start, resource_size(r), pdev->name);
-------- -- if (mem == NULL) {
-------- -- ret = -EBUSY;
++++++++ ++ dspi->base = devm_ioremap_resource(&pdev->dev, r);
++++++++ ++ if (IS_ERR(dspi->base)) {
++++++++ ++ ret = PTR_ERR(dspi->base);
goto free_master;
}
-------- -- dspi->base = ioremap(r->start, resource_size(r));
-------- -- if (dspi->base == NULL) {
-------- -- ret = -ENOMEM;
-------- -- goto release_region;
-------- -- }
-------- --
dspi->irq = platform_get_irq(pdev, 0);
if (dspi->irq <= 0) {
ret = -EINVAL;
-------- -- goto unmap_io;
++++++++ ++ goto free_master;
}
-------- -- ret = request_threaded_irq(dspi->irq, davinci_spi_irq, dummy_thread_fn,
-------- -- 0, dev_name(&pdev->dev), dspi);
++++++++ ++ ret = devm_request_threaded_irq(&pdev->dev, dspi->irq, davinci_spi_irq,
++++++++ ++ dummy_thread_fn, 0, dev_name(&pdev->dev), dspi);
if (ret)
-------- -- goto unmap_io;
++++++++ ++ goto free_master;
dspi->bitbang.master = master;
if (dspi->bitbang.master == NULL) {
ret = -ENODEV;
-------- -- goto irq_free;
++++++++ ++ goto free_master;
}
-------- -- dspi->clk = clk_get(&pdev->dev, NULL);
++++++++ ++ dspi->clk = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(dspi->clk)) {
ret = -ENODEV;
-------- -- goto irq_free;
++++++++ ++ goto free_master;
}
clk_prepare_enable(dspi->clk);
goto free_clk;
dev_info(&pdev->dev, "DMA: supported\n");
-------- -- dev_info(&pdev->dev, "DMA: RX channel: %d, TX channel: %d, "
-------- -- "event queue: %d\n", dma_rx_chan, dma_tx_chan,
++++++++ ++ dev_info(&pdev->dev, "DMA: RX channel: %pa, TX channel: %pa, "
++++++++ ++ "event queue: %d\n", &dma_rx_chan, &dma_tx_chan,
pdata->dma_event_q);
}
dma_release_channel(dspi->dma_tx);
free_clk:
clk_disable_unprepare(dspi->clk);
-------- -- clk_put(dspi->clk);
-------- --irq_free:
-------- -- free_irq(dspi->irq, dspi);
-------- --unmap_io:
-------- -- iounmap(dspi->base);
-------- --release_region:
-------- -- release_mem_region(dspi->pbase, resource_size(r));
free_master:
spi_master_put(master);
err:
{
struct davinci_spi *dspi;
struct spi_master *master;
-------- -- struct resource *r;
master = platform_get_drvdata(pdev);
dspi = spi_master_get_devdata(master);
spi_bitbang_stop(&dspi->bitbang);
clk_disable_unprepare(dspi->clk);
-------- -- clk_put(dspi->clk);
-------- -- free_irq(dspi->irq, dspi);
-------- -- iounmap(dspi->base);
-------- -- r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-------- -- release_mem_region(dspi->pbase, resource_size(r));
spi_master_put(master);
return 0;