@ -8,7 +8,43 @@
# include <linux/module.h>
# include <linux/spi/pxa2xx_spi.h>
static int ce4100_spi_probe ( struct pci_dev * dev ,
enum {
PORT_CE4100 ,
PORT_BYT ,
} ;
struct pxa_spi_info {
enum pxa_ssp_type type ;
int port_id ;
int num_chipselect ;
int tx_slave_id ;
int tx_chan_id ;
int rx_slave_id ;
int rx_chan_id ;
} ;
static struct pxa_spi_info spi_info_configs [ ] = {
[ PORT_CE4100 ] = {
. type = PXA25x_SSP ,
. port_id = - 1 ,
. num_chipselect = - 1 ,
. tx_slave_id = - 1 ,
. tx_chan_id = - 1 ,
. rx_slave_id = - 1 ,
. rx_chan_id = - 1 ,
} ,
[ PORT_BYT ] = {
. type = LPSS_SSP ,
. port_id = 0 ,
. num_chipselect = 1 ,
. tx_slave_id = 0 ,
. tx_chan_id = 0 ,
. rx_slave_id = 1 ,
. rx_chan_id = 1 ,
} ,
} ;
static int pxa2xx_spi_pci_probe ( struct pci_dev * dev ,
const struct pci_device_id * ent )
{
struct platform_device_info pi ;
@ -16,6 +52,7 @@ static int ce4100_spi_probe(struct pci_dev *dev,
struct platform_device * pdev ;
struct pxa2xx_spi_master spi_pdata ;
struct ssp_device * ssp ;
struct pxa_spi_info * c ;
ret = pcim_enable_device ( dev ) ;
if ( ret )
@ -25,8 +62,16 @@ static int ce4100_spi_probe(struct pci_dev *dev,
if ( ret )
return ret ;
c = & spi_info_configs [ ent - > driver_data ] ;
memset ( & spi_pdata , 0 , sizeof ( spi_pdata ) ) ;
spi_pdata . num_chipselect = dev - > devfn ;
spi_pdata . num_chipselect = ( c - > num_chipselect > 0 ) ?
c - > num_chipselect : dev - > devfn ;
spi_pdata . tx_slave_id = c - > tx_slave_id ;
spi_pdata . tx_chan_id = c - > tx_chan_id ;
spi_pdata . rx_slave_id = c - > rx_slave_id ;
spi_pdata . rx_chan_id = c - > rx_chan_id ;
spi_pdata . enable_dma = c - > rx_slave_id > = 0 & & c - > tx_slave_id > = 0 ;
ssp = & spi_pdata . ssp ;
ssp - > phys_base = pci_resource_start ( dev , 0 ) ;
@ -36,8 +81,8 @@ static int ce4100_spi_probe(struct pci_dev *dev,
return - EIO ;
}
ssp - > irq = dev - > irq ;
ssp - > port_id = dev - > devfn ;
ssp - > type = PXA25x_SSP ;
ssp - > port_id = ( c - > port_id > = 0 ) ? c - > port_id : dev - > devfn ;
ssp - > type = c - > type ;
memset ( & pi , 0 , sizeof ( pi ) ) ;
pi . parent = & dev - > dev ;
@ -55,28 +100,29 @@ static int ce4100_spi_probe(struct pci_dev *dev,
return 0 ;
}
static void ce4100_sp i_remove( struct pci_dev * dev )
static void pxa2xx_spi_pc i_remove( struct pci_dev * dev )
{
struct platform_device * pdev = pci_get_drvdata ( dev ) ;
platform_device_unregister ( pdev ) ;
}
static const struct pci_device_id ce4100_spi_devices [ ] = {
{ PCI_DEVICE ( PCI_VENDOR_ID_INTEL , 0x2e6a ) } ,
static const struct pci_device_id pxa2xx_spi_pci_devices [ ] = {
{ PCI_VDEVICE ( INTEL , 0x2e6a ) , PORT_CE4100 } ,
{ PCI_VDEVICE ( INTEL , 0x0f0e ) , PORT_BYT } ,
{ } ,
} ;
MODULE_DEVICE_TABLE ( pci , ce4100_sp i_devices) ;
MODULE_DEVICE_TABLE ( pci , pxa2xx_spi_pc i_devices) ;
static struct pci_driver ce4100_sp i_driver = {
. name = " ce4100_sp i" ,
. id_table = ce4100_sp i_devices,
. probe = ce4100_sp i_probe,
. remove = ce4100_sp i_remove,
static struct pci_driver pxa2xx_spi_pc i_driver = {
. name = " pxa2xx_spi_pc i" ,
. id_table = pxa2xx_spi_pc i_devices,
. probe = pxa2xx_spi_pc i_probe,
. remove = pxa2xx_spi_pc i_remove,
} ;
module_pci_driver ( ce4100_sp i_driver) ;
module_pci_driver ( pxa2xx_spi_pc i_driver) ;
MODULE_DESCRIPTION ( " CE4100 PCI-SPI glue code for PXA's driver " ) ;
MODULE_DESCRIPTION ( " CE4100/LPSS PCI-SPI glue code for PXA's driver " ) ;
MODULE_LICENSE ( " GPL v2 " ) ;
MODULE_AUTHOR ( " Sebastian Andrzej Siewior <bigeasy@linutronix.de> " ) ;