提交 743485ea 编写于 作者: A Andy Shevchenko 提交者: Mark Brown

spi: pxa2xx-pci: Do a specific setup in a separate function

Move LPSS specific setup to a separate function. It makes ->probe() cleaner as
well as allows extend the driver for different variation of hardware in the
future, e.g. for Intel Merrifield.
Signed-off-by: NAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: NMark Brown <broonie@kernel.org>
上级 704d2b07
...@@ -29,8 +29,11 @@ struct pxa_spi_info { ...@@ -29,8 +29,11 @@ struct pxa_spi_info {
unsigned long max_clk_rate; unsigned long max_clk_rate;
/* DMA channel request parameters */ /* DMA channel request parameters */
bool (*dma_filter)(struct dma_chan *chan, void *param);
void *tx_param; void *tx_param;
void *rx_param; void *rx_param;
int (*setup)(struct pci_dev *pdev, struct pxa_spi_info *c);
}; };
static struct dw_dma_slave byt_tx_param = { .dst_id = 0 }; static struct dw_dma_slave byt_tx_param = { .dst_id = 0 };
...@@ -57,6 +60,35 @@ static bool lpss_dma_filter(struct dma_chan *chan, void *param) ...@@ -57,6 +60,35 @@ static bool lpss_dma_filter(struct dma_chan *chan, void *param)
return true; return true;
} }
static int lpss_spi_setup(struct pci_dev *dev, struct pxa_spi_info *c)
{
struct pci_dev *dma_dev;
c->num_chipselect = 1;
c->max_clk_rate = 50000000;
dma_dev = pci_get_slot(dev->bus, PCI_DEVFN(PCI_SLOT(dev->devfn), 0));
if (c->tx_param) {
struct dw_dma_slave *slave = c->tx_param;
slave->dma_dev = &dma_dev->dev;
slave->m_master = 0;
slave->p_master = 1;
}
if (c->rx_param) {
struct dw_dma_slave *slave = c->rx_param;
slave->dma_dev = &dma_dev->dev;
slave->m_master = 0;
slave->p_master = 1;
}
c->dma_filter = lpss_dma_filter;
return 0;
}
static struct pxa_spi_info spi_info_configs[] = { static struct pxa_spi_info spi_info_configs[] = {
[PORT_CE4100] = { [PORT_CE4100] = {
.type = PXA25x_SSP, .type = PXA25x_SSP,
...@@ -67,32 +99,28 @@ static struct pxa_spi_info spi_info_configs[] = { ...@@ -67,32 +99,28 @@ static struct pxa_spi_info spi_info_configs[] = {
[PORT_BYT] = { [PORT_BYT] = {
.type = LPSS_BYT_SSP, .type = LPSS_BYT_SSP,
.port_id = 0, .port_id = 0,
.num_chipselect = 1, .setup = lpss_spi_setup,
.max_clk_rate = 50000000,
.tx_param = &byt_tx_param, .tx_param = &byt_tx_param,
.rx_param = &byt_rx_param, .rx_param = &byt_rx_param,
}, },
[PORT_BSW0] = { [PORT_BSW0] = {
.type = LPSS_BYT_SSP, .type = LPSS_BYT_SSP,
.port_id = 0, .port_id = 0,
.num_chipselect = 1, .setup = lpss_spi_setup,
.max_clk_rate = 50000000,
.tx_param = &bsw0_tx_param, .tx_param = &bsw0_tx_param,
.rx_param = &bsw0_rx_param, .rx_param = &bsw0_rx_param,
}, },
[PORT_BSW1] = { [PORT_BSW1] = {
.type = LPSS_BYT_SSP, .type = LPSS_BYT_SSP,
.port_id = 1, .port_id = 1,
.num_chipselect = 1, .setup = lpss_spi_setup,
.max_clk_rate = 50000000,
.tx_param = &bsw1_tx_param, .tx_param = &bsw1_tx_param,
.rx_param = &bsw1_rx_param, .rx_param = &bsw1_rx_param,
}, },
[PORT_BSW2] = { [PORT_BSW2] = {
.type = LPSS_BYT_SSP, .type = LPSS_BYT_SSP,
.port_id = 2, .port_id = 2,
.num_chipselect = 1, .setup = lpss_spi_setup,
.max_clk_rate = 50000000,
.tx_param = &bsw2_tx_param, .tx_param = &bsw2_tx_param,
.rx_param = &bsw2_rx_param, .rx_param = &bsw2_rx_param,
}, },
...@@ -105,8 +133,7 @@ static struct pxa_spi_info spi_info_configs[] = { ...@@ -105,8 +133,7 @@ static struct pxa_spi_info spi_info_configs[] = {
[PORT_LPT] = { [PORT_LPT] = {
.type = LPSS_LPT_SSP, .type = LPSS_LPT_SSP,
.port_id = 0, .port_id = 0,
.num_chipselect = 1, .setup = lpss_spi_setup,
.max_clk_rate = 50000000,
.tx_param = &lpt_tx_param, .tx_param = &lpt_tx_param,
.rx_param = &lpt_rx_param, .rx_param = &lpt_rx_param,
}, },
...@@ -122,7 +149,6 @@ static int pxa2xx_spi_pci_probe(struct pci_dev *dev, ...@@ -122,7 +149,6 @@ static int pxa2xx_spi_pci_probe(struct pci_dev *dev,
struct ssp_device *ssp; struct ssp_device *ssp;
struct pxa_spi_info *c; struct pxa_spi_info *c;
char buf[40]; char buf[40];
struct pci_dev *dma_dev;
ret = pcim_enable_device(dev); ret = pcim_enable_device(dev);
if (ret) if (ret)
...@@ -133,30 +159,15 @@ static int pxa2xx_spi_pci_probe(struct pci_dev *dev, ...@@ -133,30 +159,15 @@ static int pxa2xx_spi_pci_probe(struct pci_dev *dev,
return ret; return ret;
c = &spi_info_configs[ent->driver_data]; c = &spi_info_configs[ent->driver_data];
if (c->setup) {
memset(&spi_pdata, 0, sizeof(spi_pdata)); ret = c->setup(dev, c);
spi_pdata.num_chipselect = (c->num_chipselect > 0) ? if (ret)
c->num_chipselect : dev->devfn; return ret;
dma_dev = pci_get_slot(dev->bus, PCI_DEVFN(PCI_SLOT(dev->devfn), 0));
if (c->tx_param) {
struct dw_dma_slave *slave = c->tx_param;
slave->dma_dev = &dma_dev->dev;
slave->m_master = 0;
slave->p_master = 1;
}
if (c->rx_param) {
struct dw_dma_slave *slave = c->rx_param;
slave->dma_dev = &dma_dev->dev;
slave->m_master = 0;
slave->p_master = 1;
} }
spi_pdata.dma_filter = lpss_dma_filter; memset(&spi_pdata, 0, sizeof(spi_pdata));
spi_pdata.num_chipselect = (c->num_chipselect > 0) ? c->num_chipselect : dev->devfn;
spi_pdata.dma_filter = c->dma_filter;
spi_pdata.tx_param = c->tx_param; spi_pdata.tx_param = c->tx_param;
spi_pdata.rx_param = c->rx_param; spi_pdata.rx_param = c->rx_param;
spi_pdata.enable_dma = c->rx_param && c->tx_param; spi_pdata.enable_dma = c->rx_param && c->tx_param;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册