[linux-yocto] [PATCH 14/29] spi/pxa2xx-pci: Add support for Intel BYT SPI
Kamble, Nitin A
nitin.a.kamble at intel.com
Wed Apr 9 16:29:56 PDT 2014
On 4/7/2014 8:18 AM, rebecca.swee.fun.chang at intel.com wrote:
> From: "Chew, Chiau Ee" <chiau.ee.chew at intel.com>
>
> The pxa2xx pci glue layer only support CE4100 SPI port
> by default. To add BYT SPI port support, we make it a
> generic PCI glue layer by renaming ce4100_xxx to
> pxa2xx_spi_xxx.
>
> This commit is created in reference to Mika's commit
> during kernel-3.5 development, as below:
>
> spi/pxa2xx-pci: convert to use pxa2xx-spi core
> spi/pxa2xx-pci: add support for different PCI port types
> spi/pxa2xx-pci: add support for ValleyView2 SPI
For upstreaming keeping commits small and concise helps a lot.
As a suggestion, for the upstreaming effort this commit can be broken
down into these 3 separate commits again.
Nitin
>
> Signed-off-by: Chew, Chiau Ee <chiau.ee.chew at intel.com>
> Signed-off-by: Maurice Petallo <mauricex.r.petallo at intel.com>
> ---
> drivers/spi/Kconfig | 5 ++-
> drivers/spi/spi-pxa2xx-pci.c | 85 ++++++++++++++++++++++++++++++++++--------
> 2 files changed, 74 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig
> index 92775c5..f3fecc4 100644
> --- a/drivers/spi/Kconfig
> +++ b/drivers/spi/Kconfig
> @@ -337,7 +337,10 @@ config SPI_PXA2XX
> additional documentation can be found a Documentation/spi/pxa2xx.
>
> config SPI_PXA2XX_PCI
> - def_tristate SPI_PXA2XX && PCI
> + tristate "PCI glue for PXA2xx SSP SPI master"
> + depends on SPI_PXA2XX && PCI
> + help
> + This enables using PXA2xx SPI controller via PCI interface.
>
> config SPI_RSPI
> tristate "Renesas RSPI controller"
> diff --git a/drivers/spi/spi-pxa2xx-pci.c b/drivers/spi/spi-pxa2xx-pci.c
> index 74bc187..974d4fe 100644
> --- a/drivers/spi/spi-pxa2xx-pci.c
> +++ b/drivers/spi/spi-pxa2xx-pci.c
> @@ -7,10 +7,48 @@
> #include <linux/of_device.h>
> #include <linux/module.h>
> #include <linux/spi/pxa2xx_spi.h>
> +#include <linux/clk.h>
>
> -static int ce4100_spi_probe(struct pci_dev *dev,
> +enum {
> + PORT_CE4100,
> + PORT_BYT,
> +};
> +
> +struct pxa2xx_spi_pci_config {
> + enum pxa_ssp_type type;
> + int num_cs;
> + int bus_num;
> + int tx_slave_id;
> + int tx_chan_id;
> + int rx_slave_id;
> + int rx_chan_id;
> +};
> +
> +static struct pxa2xx_spi_pci_config spi_pci_configs[] = {
> + [PORT_CE4100] = {
> + .type = PXA25x_SSP,
> + .num_cs = -1,
> + .bus_num = -1,
> + .tx_slave_id = -1,
> + .tx_chan_id = -1,
> + .rx_slave_id = -1,
> + .rx_chan_id = -1,
> + },
> + [PORT_BYT] = {
> + .type = LPSS_SSP,
> + .num_cs = 1,
> + .bus_num = 0,
> + .tx_slave_id = 0,
> + .tx_chan_id = 0,
> + .rx_slave_id = 1,
> + .rx_chan_id = 1,
> + },
> +};
> +
> +static int pxa2xx_spi_probe(struct pci_dev *dev,
> const struct pci_device_id *ent)
> {
> + struct pxa2xx_spi_pci_config *c;
> struct platform_device_info pi;
> int ret;
> struct platform_device *pdev;
> @@ -25,8 +63,16 @@ static int ce4100_spi_probe(struct pci_dev *dev,
> if (ret)
> return ret;
>
> +
> + c = &spi_pci_configs[ent->driver_data];
> +
> memset(&spi_pdata, 0, sizeof(spi_pdata));
> - spi_pdata.num_chipselect = dev->devfn;
> + spi_pdata.num_chipselect = (c->num_cs >= 0) ? c->num_cs : dev->devfn;
> + spi_pdata.tx_slave_id = c->tx_slave_id;
> + spi_pdata.tx_chan_id = c->tx_chan_id;
> + spi_pdata.rx_slave_id = c->rx_slave_id;
> + spi_pdata.rx_chan_id = c->rx_chan_id;
> + spi_pdata.enable_dma = c->rx_slave_id >= 0 && c->tx_slave_id >= 0;
>
> ssp = &spi_pdata.ssp;
> ssp->phys_base = pci_resource_start(dev, 0);
> @@ -35,9 +81,15 @@ static int ce4100_spi_probe(struct pci_dev *dev,
> dev_err(&dev->dev, "failed to ioremap() registers\n");
> return -EIO;
> }
> + ssp->clk = devm_clk_get(&dev->dev, NULL);
> + if (IS_ERR(ssp->clk)) {
> + dev_err(&dev->dev, "failed to get clock\n");
> + return PTR_ERR(ssp->clk);
> + }
> +
> ssp->irq = dev->irq;
> - ssp->port_id = dev->devfn;
> - ssp->type = PXA25x_SSP;
> + ssp->port_id = (c->bus_num >= 0) ? c->bus_num : dev->devfn;
> + ssp->type = c->type;
>
> memset(&pi, 0, sizeof(pi));
> pi.parent = &dev->dev;
> @@ -55,28 +107,31 @@ static int ce4100_spi_probe(struct pci_dev *dev,
> return 0;
> }
>
> -static void ce4100_spi_remove(struct pci_dev *dev)
> +static void pxa2xx_spi_remove(struct pci_dev *dev)
> {
> struct platform_device *pdev = pci_get_drvdata(dev);
>
> platform_device_unregister(pdev);
> }
>
> -static DEFINE_PCI_DEVICE_TABLE(ce4100_spi_devices) = {
> - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2e6a) },
> +static DEFINE_PCI_DEVICE_TABLE(pxa2xx_spi_devices) = {
> + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2e6a),
> + .driver_data = PORT_CE4100 },
> + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x0f0e),
> + .driver_data = PORT_BYT },
> { },
> };
> -MODULE_DEVICE_TABLE(pci, ce4100_spi_devices);
> +MODULE_DEVICE_TABLE(pci, pxa2xx_spi_devices);
>
> -static struct pci_driver ce4100_spi_driver = {
> - .name = "ce4100_spi",
> - .id_table = ce4100_spi_devices,
> - .probe = ce4100_spi_probe,
> - .remove = ce4100_spi_remove,
> +static struct pci_driver pxa2xx_spi_driver = {
> + .name = "pxa2xx_spi",
> + .id_table = pxa2xx_spi_devices,
> + .probe = pxa2xx_spi_probe,
> + .remove = pxa2xx_spi_remove,
> };
>
> -module_pci_driver(ce4100_spi_driver);
> +module_pci_driver(pxa2xx_spi_driver);
>
> -MODULE_DESCRIPTION("CE4100 PCI-SPI glue code for PXA's driver");
> +MODULE_DESCRIPTION("PCI-SPI glue code for PXA's driver");
> MODULE_LICENSE("GPL v2");
> MODULE_AUTHOR("Sebastian Andrzej Siewior <bigeasy at linutronix.de>");
More information about the linux-yocto
mailing list