mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
Merge branch 'pl022' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-stericsson into spi-next
This commit is contained in:
commit
9e9fd65d1f
9293 changed files with 541761 additions and 330566 deletions
|
|
@ -311,7 +311,7 @@ config SPI_S3C24XX_FIQ
|
|||
|
||||
config SPI_S3C64XX
|
||||
tristate "Samsung S3C64XX series type SPI"
|
||||
depends on (ARCH_S3C64XX || ARCH_S5P64X0 || ARCH_EXYNOS)
|
||||
depends on (ARCH_S3C24XX || ARCH_S3C64XX || ARCH_S5P64X0 || ARCH_EXYNOS)
|
||||
select S3C64XX_DMA if ARCH_S3C64XX
|
||||
help
|
||||
SPI driver for Samsung S3C64XX and newer SoCs.
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@
|
|||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_gpio.h>
|
||||
#include <linux/pinctrl/consumer.h>
|
||||
|
||||
#include <mach/spi.h>
|
||||
|
||||
|
|
@ -85,7 +86,8 @@ struct spi_imx_data {
|
|||
struct completion xfer_done;
|
||||
void __iomem *base;
|
||||
int irq;
|
||||
struct clk *clk;
|
||||
struct clk *clk_per;
|
||||
struct clk *clk_ipg;
|
||||
unsigned long spi_clk;
|
||||
|
||||
unsigned int count;
|
||||
|
|
@ -758,6 +760,7 @@ static int __devinit spi_imx_probe(struct platform_device *pdev)
|
|||
struct spi_master *master;
|
||||
struct spi_imx_data *spi_imx;
|
||||
struct resource *res;
|
||||
struct pinctrl *pinctrl;
|
||||
int i, ret, num_cs;
|
||||
|
||||
if (!np && !mxc_platform_info) {
|
||||
|
|
@ -845,15 +848,28 @@ static int __devinit spi_imx_probe(struct platform_device *pdev)
|
|||
goto out_iounmap;
|
||||
}
|
||||
|
||||
spi_imx->clk = clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(spi_imx->clk)) {
|
||||
dev_err(&pdev->dev, "unable to get clock\n");
|
||||
ret = PTR_ERR(spi_imx->clk);
|
||||
pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
|
||||
if (IS_ERR(pinctrl)) {
|
||||
ret = PTR_ERR(pinctrl);
|
||||
goto out_free_irq;
|
||||
}
|
||||
|
||||
clk_enable(spi_imx->clk);
|
||||
spi_imx->spi_clk = clk_get_rate(spi_imx->clk);
|
||||
spi_imx->clk_ipg = devm_clk_get(&pdev->dev, "ipg");
|
||||
if (IS_ERR(spi_imx->clk_ipg)) {
|
||||
ret = PTR_ERR(spi_imx->clk_ipg);
|
||||
goto out_free_irq;
|
||||
}
|
||||
|
||||
spi_imx->clk_per = devm_clk_get(&pdev->dev, "per");
|
||||
if (IS_ERR(spi_imx->clk_per)) {
|
||||
ret = PTR_ERR(spi_imx->clk_per);
|
||||
goto out_free_irq;
|
||||
}
|
||||
|
||||
clk_prepare_enable(spi_imx->clk_per);
|
||||
clk_prepare_enable(spi_imx->clk_ipg);
|
||||
|
||||
spi_imx->spi_clk = clk_get_rate(spi_imx->clk_per);
|
||||
|
||||
spi_imx->devtype_data->reset(spi_imx);
|
||||
|
||||
|
|
@ -871,8 +887,8 @@ static int __devinit spi_imx_probe(struct platform_device *pdev)
|
|||
return ret;
|
||||
|
||||
out_clk_put:
|
||||
clk_disable(spi_imx->clk);
|
||||
clk_put(spi_imx->clk);
|
||||
clk_disable_unprepare(spi_imx->clk_per);
|
||||
clk_disable_unprepare(spi_imx->clk_ipg);
|
||||
out_free_irq:
|
||||
free_irq(spi_imx->irq, spi_imx);
|
||||
out_iounmap:
|
||||
|
|
@ -900,8 +916,8 @@ static int __devexit spi_imx_remove(struct platform_device *pdev)
|
|||
spi_bitbang_stop(&spi_imx->bitbang);
|
||||
|
||||
writel(0, spi_imx->base + MXC_CSPICTRL);
|
||||
clk_disable(spi_imx->clk);
|
||||
clk_put(spi_imx->clk);
|
||||
clk_disable_unprepare(spi_imx->clk_per);
|
||||
clk_disable_unprepare(spi_imx->clk_ipg);
|
||||
free_irq(spi_imx->irq, spi_imx);
|
||||
iounmap(spi_imx->base);
|
||||
|
||||
|
|
|
|||
|
|
@ -801,7 +801,7 @@ static int omap2_mcspi_setup(struct spi_device *spi)
|
|||
mcspi_dma = &mcspi->dma_channels[spi->chip_select];
|
||||
|
||||
if (!cs) {
|
||||
cs = devm_kzalloc(&spi->dev , sizeof *cs, GFP_KERNEL);
|
||||
cs = kzalloc(sizeof *cs, GFP_KERNEL);
|
||||
if (!cs)
|
||||
return -ENOMEM;
|
||||
cs->base = mcspi->base + spi->chip_select * 0x14;
|
||||
|
|
@ -842,6 +842,7 @@ static void omap2_mcspi_cleanup(struct spi_device *spi)
|
|||
cs = spi->controller_state;
|
||||
list_del(&cs->node);
|
||||
|
||||
kfree(cs);
|
||||
}
|
||||
|
||||
if (spi->chip_select < spi->master->num_chipselect) {
|
||||
|
|
|
|||
|
|
@ -16,8 +16,8 @@
|
|||
#include <linux/err.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/orion_spi.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/clk.h>
|
||||
#include <asm/unaligned.h>
|
||||
|
||||
#define DRIVER_NAME "orion_spi"
|
||||
|
|
@ -46,6 +46,7 @@ struct orion_spi {
|
|||
unsigned int max_speed;
|
||||
unsigned int min_speed;
|
||||
struct orion_spi_info *spi_info;
|
||||
struct clk *clk;
|
||||
};
|
||||
|
||||
static struct workqueue_struct *orion_spi_wq;
|
||||
|
|
@ -104,7 +105,7 @@ static int orion_spi_baudrate_set(struct spi_device *spi, unsigned int speed)
|
|||
|
||||
orion_spi = spi_master_get_devdata(spi->master);
|
||||
|
||||
tclk_hz = orion_spi->spi_info->tclk;
|
||||
tclk_hz = clk_get_rate(orion_spi->clk);
|
||||
|
||||
/*
|
||||
* the supported rates are: 4,6,8...30
|
||||
|
|
@ -450,6 +451,7 @@ static int __init orion_spi_probe(struct platform_device *pdev)
|
|||
struct orion_spi *spi;
|
||||
struct resource *r;
|
||||
struct orion_spi_info *spi_info;
|
||||
unsigned long tclk_hz;
|
||||
int status = 0;
|
||||
|
||||
spi_info = pdev->dev.platform_data;
|
||||
|
|
@ -476,19 +478,28 @@ static int __init orion_spi_probe(struct platform_device *pdev)
|
|||
spi->master = master;
|
||||
spi->spi_info = spi_info;
|
||||
|
||||
spi->max_speed = DIV_ROUND_UP(spi_info->tclk, 4);
|
||||
spi->min_speed = DIV_ROUND_UP(spi_info->tclk, 30);
|
||||
spi->clk = clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(spi->clk)) {
|
||||
status = PTR_ERR(spi->clk);
|
||||
goto out;
|
||||
}
|
||||
|
||||
clk_prepare(spi->clk);
|
||||
clk_enable(spi->clk);
|
||||
tclk_hz = clk_get_rate(spi->clk);
|
||||
spi->max_speed = DIV_ROUND_UP(tclk_hz, 4);
|
||||
spi->min_speed = DIV_ROUND_UP(tclk_hz, 30);
|
||||
|
||||
r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (r == NULL) {
|
||||
status = -ENODEV;
|
||||
goto out;
|
||||
goto out_rel_clk;
|
||||
}
|
||||
|
||||
if (!request_mem_region(r->start, resource_size(r),
|
||||
dev_name(&pdev->dev))) {
|
||||
status = -EBUSY;
|
||||
goto out;
|
||||
goto out_rel_clk;
|
||||
}
|
||||
spi->base = ioremap(r->start, SZ_1K);
|
||||
|
||||
|
|
@ -508,7 +519,9 @@ static int __init orion_spi_probe(struct platform_device *pdev)
|
|||
|
||||
out_rel_mem:
|
||||
release_mem_region(r->start, resource_size(r));
|
||||
|
||||
out_rel_clk:
|
||||
clk_disable_unprepare(spi->clk);
|
||||
clk_put(spi->clk);
|
||||
out:
|
||||
spi_master_put(master);
|
||||
return status;
|
||||
|
|
@ -526,6 +539,9 @@ static int __exit orion_spi_remove(struct platform_device *pdev)
|
|||
|
||||
cancel_work_sync(&spi->work);
|
||||
|
||||
clk_disable_unprepare(spi->clk);
|
||||
clk_put(spi->clk);
|
||||
|
||||
r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
release_mem_region(r->start, resource_size(r));
|
||||
|
||||
|
|
|
|||
|
|
@ -489,6 +489,11 @@ static void giveback(struct pl022 *pl022)
|
|||
pl022->cur_transfer = NULL;
|
||||
pl022->cur_chip = NULL;
|
||||
spi_finalize_current_message(pl022->master);
|
||||
|
||||
/* disable the SPI/SSP operation */
|
||||
writew((readw(SSP_CR1(pl022->virtbase)) &
|
||||
(~SSP_CR1_MASK_SSE)), SSP_CR1(pl022->virtbase));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -2048,6 +2053,9 @@ pl022_probe(struct amba_device *adev, const struct amba_id *id)
|
|||
printk(KERN_INFO "pl022: mapped registers from 0x%08x to %p\n",
|
||||
adev->res.start, pl022->virtbase);
|
||||
|
||||
pm_runtime_enable(dev);
|
||||
pm_runtime_resume(dev);
|
||||
|
||||
pl022->clk = clk_get(&adev->dev, NULL);
|
||||
if (IS_ERR(pl022->clk)) {
|
||||
status = PTR_ERR(pl022->clk);
|
||||
|
|
@ -2158,6 +2166,7 @@ pl022_remove(struct amba_device *adev)
|
|||
clk_disable(pl022->clk);
|
||||
clk_unprepare(pl022->clk);
|
||||
clk_put(pl022->clk);
|
||||
pm_runtime_disable(&adev->dev);
|
||||
iounmap(pl022->virtbase);
|
||||
amba_release_regions(adev);
|
||||
tasklet_disable(&pl022->pump_transfers);
|
||||
|
|
@ -2251,15 +2260,6 @@ static struct vendor_data vendor_st_pl023 = {
|
|||
.loopback = false,
|
||||
};
|
||||
|
||||
static struct vendor_data vendor_db5500_pl023 = {
|
||||
.fifodepth = 32,
|
||||
.max_bpw = 32,
|
||||
.unidir = false,
|
||||
.extended_cr = true,
|
||||
.pl023 = true,
|
||||
.loopback = true,
|
||||
};
|
||||
|
||||
static struct amba_id pl022_ids[] = {
|
||||
{
|
||||
/*
|
||||
|
|
@ -2291,11 +2291,6 @@ static struct amba_id pl022_ids[] = {
|
|||
.mask = 0xffffffff,
|
||||
.data = &vendor_st_pl023,
|
||||
},
|
||||
{
|
||||
.id = 0x10080023,
|
||||
.mask = 0xffffffff,
|
||||
.data = &vendor_db5500_pl023,
|
||||
},
|
||||
{ 0, 0 },
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue