Commit 87ae1d2d authored by Lubomir Rintel's avatar Lubomir Rintel Committed by Mark Brown

spi: pxa2xx: Add devicetree support

The MMP2 platform, that uses device tree, has this controller. Let's add
devicetree alongside platform & PCI.
Signed-off-by: default avatarLubomir Rintel <lkundrak@v3.sk>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 55ef8262
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/of_device.h>
#include "spi-pxa2xx.h" #include "spi-pxa2xx.h"
...@@ -1335,9 +1336,6 @@ static void cleanup(struct spi_device *spi) ...@@ -1335,9 +1336,6 @@ static void cleanup(struct spi_device *spi)
kfree(chip); kfree(chip);
} }
#ifdef CONFIG_PCI
#ifdef CONFIG_ACPI
static const struct acpi_device_id pxa2xx_spi_acpi_match[] = { static const struct acpi_device_id pxa2xx_spi_acpi_match[] = {
{ "INT33C0", LPSS_LPT_SSP }, { "INT33C0", LPSS_LPT_SSP },
{ "INT33C1", LPSS_LPT_SSP }, { "INT33C1", LPSS_LPT_SSP },
...@@ -1349,23 +1347,6 @@ static const struct acpi_device_id pxa2xx_spi_acpi_match[] = { ...@@ -1349,23 +1347,6 @@ static const struct acpi_device_id pxa2xx_spi_acpi_match[] = {
}; };
MODULE_DEVICE_TABLE(acpi, pxa2xx_spi_acpi_match); MODULE_DEVICE_TABLE(acpi, pxa2xx_spi_acpi_match);
static int pxa2xx_spi_get_port_id(struct acpi_device *adev)
{
unsigned int devid;
int port_id = -1;
if (adev && adev->pnp.unique_id &&
!kstrtouint(adev->pnp.unique_id, 0, &devid))
port_id = devid;
return port_id;
}
#else /* !CONFIG_ACPI */
static int pxa2xx_spi_get_port_id(struct acpi_device *adev)
{
return -1;
}
#endif
/* /*
* PCI IDs of compound devices that integrate both host controller and private * PCI IDs of compound devices that integrate both host controller and private
* integrated DMA engine. Please note these are not used in module * integrated DMA engine. Please note these are not used in module
...@@ -1412,6 +1393,37 @@ static const struct pci_device_id pxa2xx_spi_pci_compound_match[] = { ...@@ -1412,6 +1393,37 @@ static const struct pci_device_id pxa2xx_spi_pci_compound_match[] = {
{ }, { },
}; };
static const struct of_device_id pxa2xx_spi_of_match[] = {
{ .compatible = "marvell,mmp2-ssp", .data = (void *)MMP2_SSP },
{},
};
MODULE_DEVICE_TABLE(of, pxa2xx_spi_of_match);
#ifdef CONFIG_ACPI
static int pxa2xx_spi_get_port_id(struct acpi_device *adev)
{
unsigned int devid;
int port_id = -1;
if (adev && adev->pnp.unique_id &&
!kstrtouint(adev->pnp.unique_id, 0, &devid))
port_id = devid;
return port_id;
}
#else /* !CONFIG_ACPI */
static int pxa2xx_spi_get_port_id(struct acpi_device *adev)
{
return -1;
}
#endif /* CONFIG_ACPI */
#ifdef CONFIG_PCI
static bool pxa2xx_spi_idma_filter(struct dma_chan *chan, void *param) static bool pxa2xx_spi_idma_filter(struct dma_chan *chan, void *param)
{ {
struct device *dev = param; struct device *dev = param;
...@@ -1422,6 +1434,8 @@ static bool pxa2xx_spi_idma_filter(struct dma_chan *chan, void *param) ...@@ -1422,6 +1434,8 @@ static bool pxa2xx_spi_idma_filter(struct dma_chan *chan, void *param)
return true; return true;
} }
#endif /* CONFIG_PCI */
static struct pxa2xx_spi_master * static struct pxa2xx_spi_master *
pxa2xx_spi_init_pdata(struct platform_device *pdev) pxa2xx_spi_init_pdata(struct platform_device *pdev)
{ {
...@@ -1431,11 +1445,15 @@ pxa2xx_spi_init_pdata(struct platform_device *pdev) ...@@ -1431,11 +1445,15 @@ pxa2xx_spi_init_pdata(struct platform_device *pdev)
struct resource *res; struct resource *res;
const struct acpi_device_id *adev_id = NULL; const struct acpi_device_id *adev_id = NULL;
const struct pci_device_id *pcidev_id = NULL; const struct pci_device_id *pcidev_id = NULL;
const struct of_device_id *of_id = NULL;
enum pxa_ssp_type type; enum pxa_ssp_type type;
adev = ACPI_COMPANION(&pdev->dev); adev = ACPI_COMPANION(&pdev->dev);
if (dev_is_pci(pdev->dev.parent)) if (pdev->dev.of_node)
of_id = of_match_device(pdev->dev.driver->of_match_table,
&pdev->dev);
else if (dev_is_pci(pdev->dev.parent))
pcidev_id = pci_match_id(pxa2xx_spi_pci_compound_match, pcidev_id = pci_match_id(pxa2xx_spi_pci_compound_match,
to_pci_dev(pdev->dev.parent)); to_pci_dev(pdev->dev.parent));
else if (adev) else if (adev)
...@@ -1448,6 +1466,8 @@ pxa2xx_spi_init_pdata(struct platform_device *pdev) ...@@ -1448,6 +1466,8 @@ pxa2xx_spi_init_pdata(struct platform_device *pdev)
type = (enum pxa_ssp_type)adev_id->driver_data; type = (enum pxa_ssp_type)adev_id->driver_data;
else if (pcidev_id) else if (pcidev_id)
type = (enum pxa_ssp_type)pcidev_id->driver_data; type = (enum pxa_ssp_type)pcidev_id->driver_data;
else if (of_id)
type = (enum pxa_ssp_type)of_id->data;
else else
return NULL; return NULL;
...@@ -1466,11 +1486,13 @@ pxa2xx_spi_init_pdata(struct platform_device *pdev) ...@@ -1466,11 +1486,13 @@ pxa2xx_spi_init_pdata(struct platform_device *pdev)
if (IS_ERR(ssp->mmio_base)) if (IS_ERR(ssp->mmio_base))
return NULL; return NULL;
#ifdef CONFIG_PCI
if (pcidev_id) { if (pcidev_id) {
pdata->tx_param = pdev->dev.parent; pdata->tx_param = pdev->dev.parent;
pdata->rx_param = pdev->dev.parent; pdata->rx_param = pdev->dev.parent;
pdata->dma_filter = pxa2xx_spi_idma_filter; pdata->dma_filter = pxa2xx_spi_idma_filter;
} }
#endif
ssp->clk = devm_clk_get(&pdev->dev, NULL); ssp->clk = devm_clk_get(&pdev->dev, NULL);
ssp->irq = platform_get_irq(pdev, 0); ssp->irq = platform_get_irq(pdev, 0);
...@@ -1484,14 +1506,6 @@ pxa2xx_spi_init_pdata(struct platform_device *pdev) ...@@ -1484,14 +1506,6 @@ pxa2xx_spi_init_pdata(struct platform_device *pdev)
return pdata; return pdata;
} }
#else /* !CONFIG_PCI */
static inline struct pxa2xx_spi_master *
pxa2xx_spi_init_pdata(struct platform_device *pdev)
{
return NULL;
}
#endif
static int pxa2xx_spi_fw_translate_cs(struct spi_controller *master, static int pxa2xx_spi_fw_translate_cs(struct spi_controller *master,
unsigned int cs) unsigned int cs)
{ {
...@@ -1836,6 +1850,7 @@ static struct platform_driver driver = { ...@@ -1836,6 +1850,7 @@ static struct platform_driver driver = {
.name = "pxa2xx-spi", .name = "pxa2xx-spi",
.pm = &pxa2xx_spi_pm_ops, .pm = &pxa2xx_spi_pm_ops,
.acpi_match_table = ACPI_PTR(pxa2xx_spi_acpi_match), .acpi_match_table = ACPI_PTR(pxa2xx_spi_acpi_match),
.of_match_table = of_match_ptr(pxa2xx_spi_of_match),
}, },
.probe = pxa2xx_spi_probe, .probe = pxa2xx_spi_probe,
.remove = pxa2xx_spi_remove, .remove = pxa2xx_spi_remove,
......
...@@ -196,6 +196,7 @@ enum pxa_ssp_type { ...@@ -196,6 +196,7 @@ enum pxa_ssp_type {
PXA27x_SSP, PXA27x_SSP,
PXA3xx_SSP, PXA3xx_SSP,
PXA168_SSP, PXA168_SSP,
MMP2_SSP,
PXA910_SSP, PXA910_SSP,
CE4100_SSP, CE4100_SSP,
QUARK_X1000_SSP, QUARK_X1000_SSP,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment