diff options
Diffstat (limited to 'drivers/spi/spi-pxa2xx.c')
| -rw-r--r-- | drivers/spi/spi-pxa2xx.c | 100 | 
1 files changed, 51 insertions, 49 deletions
| diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c index 14f4ea59caff..612cc49db28f 100644 --- a/drivers/spi/spi-pxa2xx.c +++ b/drivers/spi/spi-pxa2xx.c @@ -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" @@ -665,9 +666,11 @@ static irqreturn_t interrupt_transfer(struct driver_data *drv_data)  			bytes_left = drv_data->rx_end - drv_data->rx;  			switch (drv_data->n_bytes) {  			case 4: -				bytes_left >>= 1; +				bytes_left >>= 2; +				break;  			case 2:  				bytes_left >>= 1; +				break;  			}  			rx_thre = pxa2xx_spi_get_rx_default_thre(drv_data); @@ -1333,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 }, @@ -1347,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 @@ -1410,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; @@ -1420,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)  { @@ -1429,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; -	int type; +	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) @@ -1443,9 +1463,11 @@ pxa2xx_spi_init_pdata(struct platform_device *pdev)  		return NULL;  	if (adev_id) -		type = (int)adev_id->driver_data; +		type = (enum pxa_ssp_type)adev_id->driver_data;  	else if (pcidev_id) -		type = (int)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  		return NULL; @@ -1464,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); @@ -1482,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)  { @@ -1764,14 +1780,6 @@ static int pxa2xx_spi_remove(struct platform_device *pdev)  	return 0;  } -static void pxa2xx_spi_shutdown(struct platform_device *pdev) -{ -	int status = 0; - -	if ((status = pxa2xx_spi_remove(pdev)) != 0) -		dev_err(&pdev->dev, "shutdown failed with %d\n", status); -} -  #ifdef CONFIG_PM_SLEEP  static int pxa2xx_spi_suspend(struct device *dev)  { @@ -1808,13 +1816,7 @@ static int pxa2xx_spi_resume(struct device *dev)  		lpss_ssp_setup(drv_data);  	/* Start the queue running */ -	status = spi_controller_resume(drv_data->master); -	if (status != 0) { -		dev_err(dev, "problem starting queue (%d)\n", status); -		return status; -	} - -	return 0; +	return spi_controller_resume(drv_data->master);  }  #endif @@ -1848,10 +1850,10 @@ 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, -	.shutdown = pxa2xx_spi_shutdown,  };  static int __init pxa2xx_spi_init(void) |