2010-11-24 12:17:14 +03:00
/*
* CE4100 ' s SPI device is more or less the same one as found on PXA
*
*/
# include <linux/pci.h>
# include <linux/platform_device.h>
# include <linux/of_device.h>
2011-07-03 23:44:29 +04:00
# include <linux/module.h>
2010-11-24 12:17:14 +03:00
# include <linux/spi/pxa2xx_spi.h>
2012-12-07 20:57:14 +04:00
static int ce4100_spi_probe ( struct pci_dev * dev ,
2010-11-24 12:17:14 +03:00
const struct pci_device_id * ent )
{
2013-01-07 14:44:32 +04:00
struct platform_device_info pi ;
2010-11-24 12:17:14 +03:00
int ret ;
struct platform_device * pdev ;
2011-02-02 22:01:21 +03:00
struct pxa2xx_spi_master spi_pdata ;
2010-11-24 12:17:14 +03:00
struct ssp_device * ssp ;
2013-01-07 14:44:32 +04:00
ret = pcim_enable_device ( dev ) ;
2010-11-24 12:17:14 +03:00
if ( ret )
return ret ;
2013-01-07 14:44:32 +04:00
ret = pcim_iomap_regions ( dev , 1 < < 0 , " PXA2xx SPI " ) ;
if ( ! ret )
2010-11-24 12:17:14 +03:00
return ret ;
2011-02-02 22:01:21 +03:00
memset ( & spi_pdata , 0 , sizeof ( spi_pdata ) ) ;
spi_pdata . num_chipselect = dev - > devfn ;
2010-11-24 12:17:14 +03:00
2013-01-07 14:44:33 +04:00
ssp = & spi_pdata . ssp ;
2010-11-24 12:17:14 +03:00
ssp - > phys_base = pci_resource_start ( dev , 0 ) ;
2013-01-07 14:44:32 +04:00
ssp - > mmio_base = pcim_iomap_table ( dev ) [ 0 ] ;
2010-11-24 12:17:14 +03:00
if ( ! ssp - > mmio_base ) {
2013-01-07 14:44:32 +04:00
dev_err ( & dev - > dev , " failed to ioremap() registers \n " ) ;
return - EIO ;
2010-11-24 12:17:14 +03:00
}
ssp - > irq = dev - > irq ;
2013-01-07 14:44:32 +04:00
ssp - > port_id = dev - > devfn ;
2010-11-24 12:17:14 +03:00
ssp - > type = PXA25x_SSP ;
2013-01-07 14:44:32 +04:00
memset ( & pi , 0 , sizeof ( pi ) ) ;
pi . parent = & dev - > dev ;
pi . name = " pxa2xx-spi " ;
pi . id = ssp - > port_id ;
pi . data = & spi_pdata ;
pi . size_data = sizeof ( spi_pdata ) ;
2010-11-24 12:17:14 +03:00
2013-01-07 14:44:32 +04:00
pdev = platform_device_register_full ( & pi ) ;
2013-01-07 14:44:33 +04:00
if ( ! pdev )
2013-01-07 14:44:32 +04:00
return - ENOMEM ;
2010-11-24 12:17:14 +03:00
2013-01-07 14:44:33 +04:00
pci_set_drvdata ( dev , pdev ) ;
2010-11-24 12:17:14 +03:00
2013-01-07 14:44:32 +04:00
return 0 ;
2010-11-24 12:17:14 +03:00
}
2012-12-07 20:57:14 +04:00
static void ce4100_spi_remove ( struct pci_dev * dev )
2010-11-24 12:17:14 +03:00
{
2013-01-07 14:44:33 +04:00
struct platform_device * pdev = pci_get_drvdata ( dev ) ;
2010-11-24 12:17:14 +03:00
2013-01-07 14:44:33 +04:00
platform_device_unregister ( pdev ) ;
2010-11-24 12:17:14 +03:00
}
2011-12-15 04:11:25 +04:00
static DEFINE_PCI_DEVICE_TABLE ( ce4100_spi_devices ) = {
2010-11-24 12:17:14 +03:00
{ PCI_DEVICE ( PCI_VENDOR_ID_INTEL , 0x2e6a ) } ,
{ } ,
} ;
MODULE_DEVICE_TABLE ( pci , ce4100_spi_devices ) ;
static struct pci_driver ce4100_spi_driver = {
. name = " ce4100_spi " ,
. id_table = ce4100_spi_devices ,
. probe = ce4100_spi_probe ,
2012-12-07 20:57:14 +04:00
. remove = ce4100_spi_remove ,
2010-11-24 12:17:14 +03:00
} ;
2012-04-04 18:29:32 +04:00
module_pci_driver ( ce4100_spi_driver ) ;
2010-11-24 12:17:14 +03:00
MODULE_DESCRIPTION ( " CE4100 PCI-SPI glue code for PXA's driver " ) ;
MODULE_LICENSE ( " GPL v2 " ) ;
MODULE_AUTHOR ( " Sebastian Andrzej Siewior <bigeasy@linutronix.de> " ) ;