diff options
Diffstat (limited to 'drivers/spi/spi-pxa2xx.c')
| -rw-r--r-- | drivers/spi/spi-pxa2xx.c | 195 | 
1 files changed, 45 insertions, 150 deletions
diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c index 2bf21c2e7a52..32cc82a89ec1 100644 --- a/drivers/spi/spi-pxa2xx.c +++ b/drivers/spi/spi-pxa2xx.c @@ -20,7 +20,6 @@  #include <linux/module.h>  #include <linux/mod_devicetable.h>  #include <linux/of.h> -#include <linux/pci.h>  #include <linux/platform_device.h>  #include <linux/pm_runtime.h>  #include <linux/property.h> @@ -1322,134 +1321,11 @@ static void cleanup(struct spi_device *spi)  	kfree(chip);  } -#ifdef CONFIG_ACPI -static const struct acpi_device_id pxa2xx_spi_acpi_match[] = { -	{ "INT33C0", LPSS_LPT_SSP }, -	{ "INT33C1", LPSS_LPT_SSP }, -	{ "INT3430", LPSS_LPT_SSP }, -	{ "INT3431", LPSS_LPT_SSP }, -	{ "80860F0E", LPSS_BYT_SSP }, -	{ "8086228E", LPSS_BSW_SSP }, -	{ }, -}; -MODULE_DEVICE_TABLE(acpi, pxa2xx_spi_acpi_match); -#endif - -/* - * PCI IDs of compound devices that integrate both host controller and private - * integrated DMA engine. Please note these are not used in module - * autoloading and probing in this module but matching the LPSS SSP type. - */ -static const struct pci_device_id pxa2xx_spi_pci_compound_match[] = { -	/* SPT-LP */ -	{ PCI_VDEVICE(INTEL, 0x9d29), LPSS_SPT_SSP }, -	{ PCI_VDEVICE(INTEL, 0x9d2a), LPSS_SPT_SSP }, -	/* SPT-H */ -	{ PCI_VDEVICE(INTEL, 0xa129), LPSS_SPT_SSP }, -	{ PCI_VDEVICE(INTEL, 0xa12a), LPSS_SPT_SSP }, -	/* KBL-H */ -	{ PCI_VDEVICE(INTEL, 0xa2a9), LPSS_SPT_SSP }, -	{ PCI_VDEVICE(INTEL, 0xa2aa), LPSS_SPT_SSP }, -	/* CML-V */ -	{ PCI_VDEVICE(INTEL, 0xa3a9), LPSS_SPT_SSP }, -	{ PCI_VDEVICE(INTEL, 0xa3aa), LPSS_SPT_SSP }, -	/* BXT A-Step */ -	{ PCI_VDEVICE(INTEL, 0x0ac2), LPSS_BXT_SSP }, -	{ PCI_VDEVICE(INTEL, 0x0ac4), LPSS_BXT_SSP }, -	{ PCI_VDEVICE(INTEL, 0x0ac6), LPSS_BXT_SSP }, -	/* BXT B-Step */ -	{ PCI_VDEVICE(INTEL, 0x1ac2), LPSS_BXT_SSP }, -	{ PCI_VDEVICE(INTEL, 0x1ac4), LPSS_BXT_SSP }, -	{ PCI_VDEVICE(INTEL, 0x1ac6), LPSS_BXT_SSP }, -	/* GLK */ -	{ PCI_VDEVICE(INTEL, 0x31c2), LPSS_BXT_SSP }, -	{ PCI_VDEVICE(INTEL, 0x31c4), LPSS_BXT_SSP }, -	{ PCI_VDEVICE(INTEL, 0x31c6), LPSS_BXT_SSP }, -	/* ICL-LP */ -	{ PCI_VDEVICE(INTEL, 0x34aa), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0x34ab), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0x34fb), LPSS_CNL_SSP }, -	/* EHL */ -	{ PCI_VDEVICE(INTEL, 0x4b2a), LPSS_BXT_SSP }, -	{ PCI_VDEVICE(INTEL, 0x4b2b), LPSS_BXT_SSP }, -	{ PCI_VDEVICE(INTEL, 0x4b37), LPSS_BXT_SSP }, -	/* JSL */ -	{ PCI_VDEVICE(INTEL, 0x4daa), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0x4dab), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0x4dfb), LPSS_CNL_SSP }, -	/* TGL-H */ -	{ PCI_VDEVICE(INTEL, 0x43aa), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0x43ab), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0x43fb), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0x43fd), LPSS_CNL_SSP }, -	/* ADL-P */ -	{ PCI_VDEVICE(INTEL, 0x51aa), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0x51ab), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0x51fb), LPSS_CNL_SSP }, -	/* ADL-M */ -	{ PCI_VDEVICE(INTEL, 0x54aa), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0x54ab), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0x54fb), LPSS_CNL_SSP }, -	/* APL */ -	{ PCI_VDEVICE(INTEL, 0x5ac2), LPSS_BXT_SSP }, -	{ PCI_VDEVICE(INTEL, 0x5ac4), LPSS_BXT_SSP }, -	{ PCI_VDEVICE(INTEL, 0x5ac6), LPSS_BXT_SSP }, -	/* RPL-S */ -	{ PCI_VDEVICE(INTEL, 0x7a2a), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0x7a2b), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0x7a79), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0x7a7b), LPSS_CNL_SSP }, -	/* ADL-S */ -	{ PCI_VDEVICE(INTEL, 0x7aaa), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0x7aab), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0x7af9), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0x7afb), LPSS_CNL_SSP }, -	/* MTL-P */ -	{ PCI_VDEVICE(INTEL, 0x7e27), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0x7e30), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0x7e46), LPSS_CNL_SSP }, -	/* CNL-LP */ -	{ PCI_VDEVICE(INTEL, 0x9daa), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0x9dab), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0x9dfb), LPSS_CNL_SSP }, -	/* CNL-H */ -	{ PCI_VDEVICE(INTEL, 0xa32a), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0xa32b), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0xa37b), LPSS_CNL_SSP }, -	/* CML-LP */ -	{ PCI_VDEVICE(INTEL, 0x02aa), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0x02ab), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0x02fb), LPSS_CNL_SSP }, -	/* CML-H */ -	{ PCI_VDEVICE(INTEL, 0x06aa), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0x06ab), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0x06fb), LPSS_CNL_SSP }, -	/* TGL-LP */ -	{ PCI_VDEVICE(INTEL, 0xa0aa), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0xa0ab), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0xa0de), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0xa0df), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0xa0fb), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0xa0fd), LPSS_CNL_SSP }, -	{ PCI_VDEVICE(INTEL, 0xa0fe), LPSS_CNL_SSP }, -	{ }, -}; - -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_PCI -  static bool pxa2xx_spi_idma_filter(struct dma_chan *chan, void *param)  {  	return param == chan->device->dev;  } -#endif /* CONFIG_PCI */ -  static struct pxa2xx_spi_controller *  pxa2xx_spi_init_pdata(struct platform_device *pdev)  { @@ -1458,46 +1334,51 @@ pxa2xx_spi_init_pdata(struct platform_device *pdev)  	struct device *parent = dev->parent;  	struct ssp_device *ssp;  	struct resource *res; -	struct pci_dev *pcidev = dev_is_pci(parent) ? to_pci_dev(parent) : NULL; -	const struct pci_device_id *pcidev_id = NULL; -	enum pxa_ssp_type type; +	enum pxa_ssp_type type = SSP_UNDEFINED;  	const void *match; +	bool is_lpss_priv;  	int status;  	u64 uid; -	if (pcidev) -		pcidev_id = pci_match_id(pxa2xx_spi_pci_compound_match, pcidev); +	is_lpss_priv = platform_get_resource_byname(pdev, IORESOURCE_MEM, "lpss_priv"); -	match = device_get_match_data(&pdev->dev); +	match = device_get_match_data(dev);  	if (match)  		type = (enum pxa_ssp_type)match; -	else if (pcidev_id) -		type = (enum pxa_ssp_type)pcidev_id->driver_data; -	else +	else if (is_lpss_priv) { +		u32 value; + +		status = device_property_read_u32(dev, "intel,spi-pxa2xx-type", &value); +		if (status) +			return ERR_PTR(status); + +		type = (enum pxa_ssp_type)value; +	} + +	/* Validate the SSP type correctness */ +	if (!(type > SSP_UNDEFINED && type < SSP_MAX))  		return ERR_PTR(-EINVAL); -	pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); +	pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);  	if (!pdata)  		return ERR_PTR(-ENOMEM);  	ssp = &pdata->ssp; -	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	ssp->mmio_base = devm_ioremap_resource(&pdev->dev, res); +	ssp->mmio_base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);  	if (IS_ERR(ssp->mmio_base))  		return ERR_CAST(ssp->mmio_base);  	ssp->phys_base = res->start; -#ifdef CONFIG_PCI -	if (pcidev_id) { +	/* Platforms with iDMA 64-bit */ +	if (is_lpss_priv) {  		pdata->tx_param = parent;  		pdata->rx_param = parent;  		pdata->dma_filter = pxa2xx_spi_idma_filter;  	} -#endif -	ssp->clk = devm_clk_get(&pdev->dev, NULL); +	ssp->clk = devm_clk_get(dev, NULL);  	if (IS_ERR(ssp->clk))  		return ERR_CAST(ssp->clk); @@ -1506,7 +1387,7 @@ pxa2xx_spi_init_pdata(struct platform_device *pdev)  		return ERR_PTR(ssp->irq);  	ssp->type = type; -	ssp->dev = &pdev->dev; +	ssp->dev = dev;  	status = acpi_dev_uid_to_integer(ACPI_COMPANION(dev), &uid);  	if (status) @@ -1514,7 +1395,7 @@ pxa2xx_spi_init_pdata(struct platform_device *pdev)  	else  		ssp->port_id = uid; -	pdata->is_slave = device_property_read_bool(&pdev->dev, "spi-slave"); +	pdata->is_slave = device_property_read_bool(dev, "spi-slave");  	pdata->num_chipselect = 1;  	pdata->enable_dma = true;  	pdata->dma_burst_size = 1; @@ -1807,7 +1688,6 @@ static int pxa2xx_spi_remove(struct platform_device *pdev)  	return 0;  } -#ifdef CONFIG_PM_SLEEP  static int pxa2xx_spi_suspend(struct device *dev)  {  	struct driver_data *drv_data = dev_get_drvdata(dev); @@ -1842,9 +1722,7 @@ static int pxa2xx_spi_resume(struct device *dev)  	/* Start the queue running */  	return spi_controller_resume(drv_data->controller);  } -#endif -#ifdef CONFIG_PM  static int pxa2xx_spi_runtime_suspend(struct device *dev)  {  	struct driver_data *drv_data = dev_get_drvdata(dev); @@ -1859,18 +1737,35 @@ static int pxa2xx_spi_runtime_resume(struct device *dev)  	return clk_prepare_enable(drv_data->ssp->clk);  } -#endif  static const struct dev_pm_ops pxa2xx_spi_pm_ops = { -	SET_SYSTEM_SLEEP_PM_OPS(pxa2xx_spi_suspend, pxa2xx_spi_resume) -	SET_RUNTIME_PM_OPS(pxa2xx_spi_runtime_suspend, -			   pxa2xx_spi_runtime_resume, NULL) +	SYSTEM_SLEEP_PM_OPS(pxa2xx_spi_suspend, pxa2xx_spi_resume) +	RUNTIME_PM_OPS(pxa2xx_spi_runtime_suspend, pxa2xx_spi_runtime_resume, NULL) +}; + +#ifdef CONFIG_ACPI +static const struct acpi_device_id pxa2xx_spi_acpi_match[] = { +	{ "80860F0E", LPSS_BYT_SSP }, +	{ "8086228E", LPSS_BSW_SSP }, +	{ "INT33C0", LPSS_LPT_SSP }, +	{ "INT33C1", LPSS_LPT_SSP }, +	{ "INT3430", LPSS_LPT_SSP }, +	{ "INT3431", LPSS_LPT_SSP }, +	{} +}; +MODULE_DEVICE_TABLE(acpi, pxa2xx_spi_acpi_match); +#endif + +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);  static struct platform_driver driver = {  	.driver = {  		.name	= "pxa2xx-spi", -		.pm	= &pxa2xx_spi_pm_ops, +		.pm	= pm_ptr(&pxa2xx_spi_pm_ops),  		.acpi_match_table = ACPI_PTR(pxa2xx_spi_acpi_match),  		.of_match_table = of_match_ptr(pxa2xx_spi_of_match),  	},  |