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: Lubomir Rintel <lkundrak@v3.sk> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
55ef8262f2
commit
87ae1d2d70
|
@ -33,6 +33,7 @@
|
|||
#include <linux/clk.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/of_device.h>
|
||||
|
||||
#include "spi-pxa2xx.h"
|
||||
|
||||
|
@ -1335,9 +1336,6 @@ static void cleanup(struct spi_device *spi)
|
|||
kfree(chip);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
#ifdef CONFIG_ACPI
|
||||
|
||||
static const struct acpi_device_id pxa2xx_spi_acpi_match[] = {
|
||||
{ "INT33C0", LPSS_LPT_SSP },
|
||||
{ "INT33C1", LPSS_LPT_SSP },
|
||||
|
@ -1349,23 +1347,6 @@ static const struct acpi_device_id 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
|
||||
* 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[] = {
|
|||
{ },
|
||||
};
|
||||
|
||||
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)
|
||||
{
|
||||
struct device *dev = param;
|
||||
|
@ -1422,6 +1434,8 @@ static bool pxa2xx_spi_idma_filter(struct dma_chan *chan, void *param)
|
|||
return true;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_PCI */
|
||||
|
||||
static struct pxa2xx_spi_master *
|
||||
pxa2xx_spi_init_pdata(struct platform_device *pdev)
|
||||
{
|
||||
|
@ -1431,11 +1445,15 @@ pxa2xx_spi_init_pdata(struct platform_device *pdev)
|
|||
struct resource *res;
|
||||
const struct acpi_device_id *adev_id = NULL;
|
||||
const struct pci_device_id *pcidev_id = NULL;
|
||||
const struct of_device_id *of_id = NULL;
|
||||
enum pxa_ssp_type type;
|
||||
|
||||
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,
|
||||
to_pci_dev(pdev->dev.parent));
|
||||
else if (adev)
|
||||
|
@ -1448,6 +1466,8 @@ pxa2xx_spi_init_pdata(struct platform_device *pdev)
|
|||
type = (enum pxa_ssp_type)adev_id->driver_data;
|
||||
else if (pcidev_id)
|
||||
type = (enum pxa_ssp_type)pcidev_id->driver_data;
|
||||
else if (of_id)
|
||||
type = (enum pxa_ssp_type)of_id->data;
|
||||
else
|
||||
return NULL;
|
||||
|
||||
|
@ -1466,11 +1486,13 @@ pxa2xx_spi_init_pdata(struct platform_device *pdev)
|
|||
if (IS_ERR(ssp->mmio_base))
|
||||
return NULL;
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
if (pcidev_id) {
|
||||
pdata->tx_param = pdev->dev.parent;
|
||||
pdata->rx_param = pdev->dev.parent;
|
||||
pdata->dma_filter = pxa2xx_spi_idma_filter;
|
||||
}
|
||||
#endif
|
||||
|
||||
ssp->clk = devm_clk_get(&pdev->dev, NULL);
|
||||
ssp->irq = platform_get_irq(pdev, 0);
|
||||
|
@ -1484,14 +1506,6 @@ pxa2xx_spi_init_pdata(struct platform_device *pdev)
|
|||
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,
|
||||
unsigned int cs)
|
||||
{
|
||||
|
@ -1836,6 +1850,7 @@ static struct platform_driver driver = {
|
|||
.name = "pxa2xx-spi",
|
||||
.pm = &pxa2xx_spi_pm_ops,
|
||||
.acpi_match_table = ACPI_PTR(pxa2xx_spi_acpi_match),
|
||||
.of_match_table = of_match_ptr(pxa2xx_spi_of_match),
|
||||
},
|
||||
.probe = pxa2xx_spi_probe,
|
||||
.remove = pxa2xx_spi_remove,
|
||||
|
|
|
@ -196,6 +196,7 @@ enum pxa_ssp_type {
|
|||
PXA27x_SSP,
|
||||
PXA3xx_SSP,
|
||||
PXA168_SSP,
|
||||
MMP2_SSP,
|
||||
PXA910_SSP,
|
||||
CE4100_SSP,
|
||||
QUARK_X1000_SSP,
|
||||
|
|
Loading…
Reference in New Issue