pxa2xx: replace spi_master with spi_controller
It's also a slave controller driver now, calling it "master" is slightly misleading. Signed-off-by: Lubomir Rintel <lkundrak@v3.sk> Acked-by: Robert Jarzmik <robert.jarzmik@free.fr> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
bfc7af6d6d
commit
51eea52d26
|
@ -21,15 +21,15 @@ Typically a SPI master is defined in the arch/.../mach-*/board-*.c as a
|
|||
"platform device". The master configuration is passed to the driver via a table
|
||||
found in include/linux/spi/pxa2xx_spi.h:
|
||||
|
||||
struct pxa2xx_spi_master {
|
||||
struct pxa2xx_spi_controller {
|
||||
u16 num_chipselect;
|
||||
u8 enable_dma;
|
||||
};
|
||||
|
||||
The "pxa2xx_spi_master.num_chipselect" field is used to determine the number of
|
||||
The "pxa2xx_spi_controller.num_chipselect" field is used to determine the number of
|
||||
slave device (chips) attached to this SPI master.
|
||||
|
||||
The "pxa2xx_spi_master.enable_dma" field informs the driver that SSP DMA should
|
||||
The "pxa2xx_spi_controller.enable_dma" field informs the driver that SSP DMA should
|
||||
be used. This caused the driver to acquire two DMA channels: rx_channel and
|
||||
tx_channel. The rx_channel has a higher DMA service priority the tx_channel.
|
||||
See the "PXA2xx Developer Manual" section "DMA Controller".
|
||||
|
@ -51,7 +51,7 @@ static struct resource pxa_spi_nssp_resources[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct pxa2xx_spi_master pxa_nssp_master_info = {
|
||||
static struct pxa2xx_spi_controller pxa_nssp_master_info = {
|
||||
.num_chipselect = 1, /* Matches the number of chips attached to NSSP */
|
||||
.enable_dma = 1, /* Enables NSSP DMA */
|
||||
};
|
||||
|
@ -206,7 +206,7 @@ DMA and PIO I/O Support
|
|||
-----------------------
|
||||
The pxa2xx_spi driver supports both DMA and interrupt driven PIO message
|
||||
transfers. The driver defaults to PIO mode and DMA transfers must be enabled
|
||||
by setting the "enable_dma" flag in the "pxa2xx_spi_master" structure. The DMA
|
||||
by setting the "enable_dma" flag in the "pxa2xx_spi_controller" structure. The DMA
|
||||
mode supports both coherent and stream based DMA mappings.
|
||||
|
||||
The following logic is used to determine the type of I/O to be used on
|
||||
|
|
|
@ -98,7 +98,7 @@ static unsigned long cmx255_pin_config[] = {
|
|||
};
|
||||
|
||||
#if defined(CONFIG_SPI_PXA2XX)
|
||||
static struct pxa2xx_spi_master pxa_ssp_master_info = {
|
||||
static struct pxa2xx_spi_controller pxa_ssp_master_info = {
|
||||
.num_chipselect = 1,
|
||||
};
|
||||
|
||||
|
|
|
@ -313,7 +313,7 @@ static inline void cmx270_init_mmc(void) {}
|
|||
#endif
|
||||
|
||||
#if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE)
|
||||
static struct pxa2xx_spi_master cm_x270_spi_info = {
|
||||
static struct pxa2xx_spi_controller cm_x270_spi_info = {
|
||||
.num_chipselect = 1,
|
||||
.enable_dma = 1,
|
||||
};
|
||||
|
|
|
@ -530,7 +530,7 @@ static struct pxa2xx_udc_mach_info udc_info __initdata = {
|
|||
};
|
||||
|
||||
#if IS_ENABLED(CONFIG_SPI_PXA2XX)
|
||||
static struct pxa2xx_spi_master corgi_spi_info = {
|
||||
static struct pxa2xx_spi_controller corgi_spi_info = {
|
||||
.num_chipselect = 3,
|
||||
};
|
||||
|
||||
|
|
|
@ -1065,7 +1065,7 @@ struct platform_device pxa93x_device_gpio = {
|
|||
|
||||
/* pxa2xx-spi platform-device ID equals respective SSP platform-device ID + 1.
|
||||
* See comment in arch/arm/mach-pxa/ssp.c::ssp_probe() */
|
||||
void __init pxa2xx_set_spi_info(unsigned id, struct pxa2xx_spi_master *info)
|
||||
void __init pxa2xx_set_spi_info(unsigned id, struct pxa2xx_spi_controller *info)
|
||||
{
|
||||
struct platform_device *pd;
|
||||
|
||||
|
|
|
@ -689,7 +689,7 @@ static inline void em_x270_init_lcd(void) {}
|
|||
#endif
|
||||
|
||||
#if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE)
|
||||
static struct pxa2xx_spi_master em_x270_spi_info = {
|
||||
static struct pxa2xx_spi_controller em_x270_spi_info = {
|
||||
.num_chipselect = 1,
|
||||
};
|
||||
|
||||
|
@ -703,7 +703,7 @@ static struct tdo24m_platform_data em_x270_tdo24m_pdata = {
|
|||
.model = TDO35S,
|
||||
};
|
||||
|
||||
static struct pxa2xx_spi_master em_x270_spi_2_info = {
|
||||
static struct pxa2xx_spi_controller em_x270_spi_2_info = {
|
||||
.num_chipselect = 1,
|
||||
.enable_dma = 1,
|
||||
};
|
||||
|
|
|
@ -629,7 +629,7 @@ static struct spi_board_info tsc2046_board_info[] __initdata = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct pxa2xx_spi_master pxa_ssp2_master_info = {
|
||||
static struct pxa2xx_spi_controller pxa_ssp2_master_info = {
|
||||
.num_chipselect = 1,
|
||||
.enable_dma = 1,
|
||||
};
|
||||
|
|
|
@ -115,12 +115,12 @@ static struct spi_board_info mcp251x_board_info[] = {
|
|||
}
|
||||
};
|
||||
|
||||
static struct pxa2xx_spi_master pxa_ssp3_spi_master_info = {
|
||||
static struct pxa2xx_spi_controller pxa_ssp3_spi_master_info = {
|
||||
.num_chipselect = 2,
|
||||
.enable_dma = 1
|
||||
};
|
||||
|
||||
static struct pxa2xx_spi_master pxa_ssp4_spi_master_info = {
|
||||
static struct pxa2xx_spi_controller pxa_ssp4_spi_master_info = {
|
||||
.num_chipselect = 2,
|
||||
.enable_dma = 1
|
||||
};
|
||||
|
|
|
@ -191,7 +191,7 @@ static inline void littleton_init_lcd(void) {};
|
|||
#endif /* CONFIG_FB_PXA || CONFIG_FB_PXA_MODULE */
|
||||
|
||||
#if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE)
|
||||
static struct pxa2xx_spi_master littleton_spi_info = {
|
||||
static struct pxa2xx_spi_controller littleton_spi_info = {
|
||||
.num_chipselect = 1,
|
||||
};
|
||||
|
||||
|
|
|
@ -197,7 +197,7 @@ static struct platform_device sa1111_device = {
|
|||
* (to J5) and poking board registers (as done below). Else it's only useful
|
||||
* for the temperature sensors.
|
||||
*/
|
||||
static struct pxa2xx_spi_master pxa_ssp_master_info = {
|
||||
static struct pxa2xx_spi_controller pxa_ssp_master_info = {
|
||||
.num_chipselect = 1,
|
||||
};
|
||||
|
||||
|
|
|
@ -932,7 +932,7 @@ struct pxa2xx_spi_chip tsc2046_chip_info = {
|
|||
.gpio_cs = GPIO14_MAGICIAN_TSC2046_CS,
|
||||
};
|
||||
|
||||
static struct pxa2xx_spi_master magician_spi_info = {
|
||||
static struct pxa2xx_spi_controller magician_spi_info = {
|
||||
.num_chipselect = 1,
|
||||
.enable_dma = 1,
|
||||
};
|
||||
|
|
|
@ -132,7 +132,7 @@ static struct platform_device smc91x_device = {
|
|||
/*
|
||||
* SPI host and devices
|
||||
*/
|
||||
static struct pxa2xx_spi_master pxa_ssp_master_info = {
|
||||
static struct pxa2xx_spi_controller pxa_ssp_master_info = {
|
||||
.num_chipselect = 1,
|
||||
};
|
||||
|
||||
|
|
|
@ -196,7 +196,7 @@ struct platform_device poodle_locomo_device = {
|
|||
EXPORT_SYMBOL(poodle_locomo_device);
|
||||
|
||||
#if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE)
|
||||
static struct pxa2xx_spi_master poodle_spi_info = {
|
||||
static struct pxa2xx_spi_controller poodle_spi_info = {
|
||||
.num_chipselect = 1,
|
||||
};
|
||||
|
||||
|
|
|
@ -572,7 +572,7 @@ static struct spi_board_info spitz_spi_devices[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct pxa2xx_spi_master spitz_spi_info = {
|
||||
static struct pxa2xx_spi_controller spitz_spi_info = {
|
||||
.num_chipselect = 3,
|
||||
};
|
||||
|
||||
|
|
|
@ -337,15 +337,15 @@ static struct platform_device stargate2_flash_device = {
|
|||
.num_resources = 1,
|
||||
};
|
||||
|
||||
static struct pxa2xx_spi_master pxa_ssp_master_0_info = {
|
||||
static struct pxa2xx_spi_controller pxa_ssp_master_0_info = {
|
||||
.num_chipselect = 1,
|
||||
};
|
||||
|
||||
static struct pxa2xx_spi_master pxa_ssp_master_1_info = {
|
||||
static struct pxa2xx_spi_controller pxa_ssp_master_1_info = {
|
||||
.num_chipselect = 1,
|
||||
};
|
||||
|
||||
static struct pxa2xx_spi_master pxa_ssp_master_2_info = {
|
||||
static struct pxa2xx_spi_controller pxa_ssp_master_2_info = {
|
||||
.num_chipselect = 1,
|
||||
};
|
||||
|
||||
|
|
|
@ -813,7 +813,7 @@ static struct platform_device tosa_bt_device = {
|
|||
.dev.platform_data = &tosa_bt_data,
|
||||
};
|
||||
|
||||
static struct pxa2xx_spi_master pxa_ssp_master_info = {
|
||||
static struct pxa2xx_spi_controller pxa_ssp_master_info = {
|
||||
.num_chipselect = 1,
|
||||
};
|
||||
|
||||
|
|
|
@ -607,12 +607,12 @@ static struct spi_board_info spi_board_info[] __initdata = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct pxa2xx_spi_master pxa_ssp1_master_info = {
|
||||
static struct pxa2xx_spi_controller pxa_ssp1_master_info = {
|
||||
.num_chipselect = 1,
|
||||
.enable_dma = 1,
|
||||
};
|
||||
|
||||
static struct pxa2xx_spi_master pxa_ssp2_master_info = {
|
||||
static struct pxa2xx_spi_controller pxa_ssp2_master_info = {
|
||||
.num_chipselect = 1,
|
||||
};
|
||||
|
||||
|
|
|
@ -391,7 +391,7 @@ static struct platform_device zeus_sram_device = {
|
|||
};
|
||||
|
||||
/* SPI interface on SSP3 */
|
||||
static struct pxa2xx_spi_master pxa2xx_spi_ssp3_master_info = {
|
||||
static struct pxa2xx_spi_controller pxa2xx_spi_ssp3_master_info = {
|
||||
.num_chipselect = 1,
|
||||
.enable_dma = 1,
|
||||
};
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
static void pxa2xx_spi_dma_transfer_complete(struct driver_data *drv_data,
|
||||
bool error)
|
||||
{
|
||||
struct spi_message *msg = drv_data->master->cur_msg;
|
||||
struct spi_message *msg = drv_data->controller->cur_msg;
|
||||
|
||||
/*
|
||||
* It is possible that one CPU is handling ROR interrupt and other
|
||||
|
@ -59,7 +59,7 @@ static void pxa2xx_spi_dma_transfer_complete(struct driver_data *drv_data,
|
|||
msg->status = -EIO;
|
||||
}
|
||||
|
||||
spi_finalize_current_transfer(drv_data->master);
|
||||
spi_finalize_current_transfer(drv_data->controller);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -74,7 +74,7 @@ pxa2xx_spi_dma_prepare_one(struct driver_data *drv_data,
|
|||
struct spi_transfer *xfer)
|
||||
{
|
||||
struct chip_data *chip =
|
||||
spi_get_ctldata(drv_data->master->cur_msg->spi);
|
||||
spi_get_ctldata(drv_data->controller->cur_msg->spi);
|
||||
enum dma_slave_buswidth width;
|
||||
struct dma_slave_config cfg;
|
||||
struct dma_chan *chan;
|
||||
|
@ -102,14 +102,14 @@ pxa2xx_spi_dma_prepare_one(struct driver_data *drv_data,
|
|||
cfg.dst_maxburst = chip->dma_burst_size;
|
||||
|
||||
sgt = &xfer->tx_sg;
|
||||
chan = drv_data->master->dma_tx;
|
||||
chan = drv_data->controller->dma_tx;
|
||||
} else {
|
||||
cfg.src_addr = drv_data->ssdr_physical;
|
||||
cfg.src_addr_width = width;
|
||||
cfg.src_maxburst = chip->dma_burst_size;
|
||||
|
||||
sgt = &xfer->rx_sg;
|
||||
chan = drv_data->master->dma_rx;
|
||||
chan = drv_data->controller->dma_rx;
|
||||
}
|
||||
|
||||
ret = dmaengine_slave_config(chan, &cfg);
|
||||
|
@ -130,8 +130,8 @@ irqreturn_t pxa2xx_spi_dma_transfer(struct driver_data *drv_data)
|
|||
if (status & SSSR_ROR) {
|
||||
dev_err(&drv_data->pdev->dev, "FIFO overrun\n");
|
||||
|
||||
dmaengine_terminate_async(drv_data->master->dma_rx);
|
||||
dmaengine_terminate_async(drv_data->master->dma_tx);
|
||||
dmaengine_terminate_async(drv_data->controller->dma_rx);
|
||||
dmaengine_terminate_async(drv_data->controller->dma_tx);
|
||||
|
||||
pxa2xx_spi_dma_transfer_complete(drv_data, true);
|
||||
return IRQ_HANDLED;
|
||||
|
@ -171,15 +171,15 @@ int pxa2xx_spi_dma_prepare(struct driver_data *drv_data,
|
|||
return 0;
|
||||
|
||||
err_rx:
|
||||
dmaengine_terminate_async(drv_data->master->dma_tx);
|
||||
dmaengine_terminate_async(drv_data->controller->dma_tx);
|
||||
err_tx:
|
||||
return err;
|
||||
}
|
||||
|
||||
void pxa2xx_spi_dma_start(struct driver_data *drv_data)
|
||||
{
|
||||
dma_async_issue_pending(drv_data->master->dma_rx);
|
||||
dma_async_issue_pending(drv_data->master->dma_tx);
|
||||
dma_async_issue_pending(drv_data->controller->dma_rx);
|
||||
dma_async_issue_pending(drv_data->controller->dma_tx);
|
||||
|
||||
atomic_set(&drv_data->dma_running, 1);
|
||||
}
|
||||
|
@ -187,30 +187,30 @@ void pxa2xx_spi_dma_start(struct driver_data *drv_data)
|
|||
void pxa2xx_spi_dma_stop(struct driver_data *drv_data)
|
||||
{
|
||||
atomic_set(&drv_data->dma_running, 0);
|
||||
dmaengine_terminate_sync(drv_data->master->dma_rx);
|
||||
dmaengine_terminate_sync(drv_data->master->dma_tx);
|
||||
dmaengine_terminate_sync(drv_data->controller->dma_rx);
|
||||
dmaengine_terminate_sync(drv_data->controller->dma_tx);
|
||||
}
|
||||
|
||||
int pxa2xx_spi_dma_setup(struct driver_data *drv_data)
|
||||
{
|
||||
struct pxa2xx_spi_master *pdata = drv_data->master_info;
|
||||
struct pxa2xx_spi_controller *pdata = drv_data->controller_info;
|
||||
struct device *dev = &drv_data->pdev->dev;
|
||||
struct spi_controller *master = drv_data->master;
|
||||
struct spi_controller *controller = drv_data->controller;
|
||||
dma_cap_mask_t mask;
|
||||
|
||||
dma_cap_zero(mask);
|
||||
dma_cap_set(DMA_SLAVE, mask);
|
||||
|
||||
master->dma_tx = dma_request_slave_channel_compat(mask,
|
||||
controller->dma_tx = dma_request_slave_channel_compat(mask,
|
||||
pdata->dma_filter, pdata->tx_param, dev, "tx");
|
||||
if (!master->dma_tx)
|
||||
if (!controller->dma_tx)
|
||||
return -ENODEV;
|
||||
|
||||
master->dma_rx = dma_request_slave_channel_compat(mask,
|
||||
controller->dma_rx = dma_request_slave_channel_compat(mask,
|
||||
pdata->dma_filter, pdata->rx_param, dev, "rx");
|
||||
if (!master->dma_rx) {
|
||||
dma_release_channel(master->dma_tx);
|
||||
master->dma_tx = NULL;
|
||||
if (!controller->dma_rx) {
|
||||
dma_release_channel(controller->dma_tx);
|
||||
controller->dma_tx = NULL;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
@ -219,17 +219,17 @@ int pxa2xx_spi_dma_setup(struct driver_data *drv_data)
|
|||
|
||||
void pxa2xx_spi_dma_release(struct driver_data *drv_data)
|
||||
{
|
||||
struct spi_controller *master = drv_data->master;
|
||||
struct spi_controller *controller = drv_data->controller;
|
||||
|
||||
if (master->dma_rx) {
|
||||
dmaengine_terminate_sync(master->dma_rx);
|
||||
dma_release_channel(master->dma_rx);
|
||||
master->dma_rx = NULL;
|
||||
if (controller->dma_rx) {
|
||||
dmaengine_terminate_sync(controller->dma_rx);
|
||||
dma_release_channel(controller->dma_rx);
|
||||
controller->dma_rx = NULL;
|
||||
}
|
||||
if (master->dma_tx) {
|
||||
dmaengine_terminate_sync(master->dma_tx);
|
||||
dma_release_channel(master->dma_tx);
|
||||
master->dma_tx = NULL;
|
||||
if (controller->dma_tx) {
|
||||
dmaengine_terminate_sync(controller->dma_tx);
|
||||
dma_release_channel(controller->dma_tx);
|
||||
controller->dma_tx = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -197,7 +197,7 @@ static int pxa2xx_spi_pci_probe(struct pci_dev *dev,
|
|||
struct platform_device_info pi;
|
||||
int ret;
|
||||
struct platform_device *pdev;
|
||||
struct pxa2xx_spi_master spi_pdata;
|
||||
struct pxa2xx_spi_controller spi_pdata;
|
||||
struct ssp_device *ssp;
|
||||
struct pxa_spi_info *c;
|
||||
char buf[40];
|
||||
|
@ -265,7 +265,7 @@ static int pxa2xx_spi_pci_probe(struct pci_dev *dev,
|
|||
static void pxa2xx_spi_pci_remove(struct pci_dev *dev)
|
||||
{
|
||||
struct platform_device *pdev = pci_get_drvdata(dev);
|
||||
struct pxa2xx_spi_master *spi_pdata;
|
||||
struct pxa2xx_spi_controller *spi_pdata;
|
||||
|
||||
spi_pdata = dev_get_platdata(&pdev->dev);
|
||||
|
||||
|
|
|
@ -328,7 +328,7 @@ static void lpss_ssp_setup(struct driver_data *drv_data)
|
|||
__lpss_ssp_write_priv(drv_data, config->reg_cs_ctrl, value);
|
||||
|
||||
/* Enable multiblock DMA transfers */
|
||||
if (drv_data->master_info->enable_dma) {
|
||||
if (drv_data->controller_info->enable_dma) {
|
||||
__lpss_ssp_write_priv(drv_data, config->reg_ssp, 1);
|
||||
|
||||
if (config->reg_general >= 0) {
|
||||
|
@ -368,7 +368,7 @@ static void lpss_ssp_select_cs(struct spi_device *spi,
|
|||
__lpss_ssp_write_priv(drv_data,
|
||||
config->reg_cs_ctrl, value);
|
||||
ndelay(1000000000 /
|
||||
(drv_data->master->max_speed_hz / 2));
|
||||
(drv_data->controller->max_speed_hz / 2));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -567,7 +567,7 @@ static int u32_reader(struct driver_data *drv_data)
|
|||
static void reset_sccr1(struct driver_data *drv_data)
|
||||
{
|
||||
struct chip_data *chip =
|
||||
spi_get_ctldata(drv_data->master->cur_msg->spi);
|
||||
spi_get_ctldata(drv_data->controller->cur_msg->spi);
|
||||
u32 sccr1_reg;
|
||||
|
||||
sccr1_reg = pxa2xx_spi_read(drv_data, SSCR1) & ~drv_data->int_cr1;
|
||||
|
@ -599,8 +599,8 @@ static void int_error_stop(struct driver_data *drv_data, const char* msg)
|
|||
|
||||
dev_err(&drv_data->pdev->dev, "%s\n", msg);
|
||||
|
||||
drv_data->master->cur_msg->status = -EIO;
|
||||
spi_finalize_current_transfer(drv_data->master);
|
||||
drv_data->controller->cur_msg->status = -EIO;
|
||||
spi_finalize_current_transfer(drv_data->controller);
|
||||
}
|
||||
|
||||
static void int_transfer_complete(struct driver_data *drv_data)
|
||||
|
@ -611,7 +611,7 @@ static void int_transfer_complete(struct driver_data *drv_data)
|
|||
if (!pxa25x_ssp_comp(drv_data))
|
||||
pxa2xx_spi_write(drv_data, SSTO, 0);
|
||||
|
||||
spi_finalize_current_transfer(drv_data->master);
|
||||
spi_finalize_current_transfer(drv_data->controller);
|
||||
}
|
||||
|
||||
static irqreturn_t interrupt_transfer(struct driver_data *drv_data)
|
||||
|
@ -747,7 +747,7 @@ static irqreturn_t ssp_int(int irq, void *dev_id)
|
|||
pxa2xx_spi_write(drv_data, SSCR1, sccr1_reg & ~drv_data->int_cr1);
|
||||
pxa2xx_spi_write(drv_data, SSCR1, sccr1_reg);
|
||||
|
||||
if (!drv_data->master->cur_msg) {
|
||||
if (!drv_data->controller->cur_msg) {
|
||||
handle_bad_msg(drv_data);
|
||||
/* Never fail */
|
||||
return IRQ_HANDLED;
|
||||
|
@ -879,7 +879,7 @@ static unsigned int quark_x1000_get_clk_div(int rate, u32 *dds)
|
|||
|
||||
static unsigned int ssp_get_clk_div(struct driver_data *drv_data, int rate)
|
||||
{
|
||||
unsigned long ssp_clk = drv_data->master->max_speed_hz;
|
||||
unsigned long ssp_clk = drv_data->controller->max_speed_hz;
|
||||
const struct ssp_device *ssp = drv_data->ssp;
|
||||
|
||||
rate = min_t(int, ssp_clk, rate);
|
||||
|
@ -894,7 +894,7 @@ static unsigned int pxa2xx_ssp_get_clk_div(struct driver_data *drv_data,
|
|||
int rate)
|
||||
{
|
||||
struct chip_data *chip =
|
||||
spi_get_ctldata(drv_data->master->cur_msg->spi);
|
||||
spi_get_ctldata(drv_data->controller->cur_msg->spi);
|
||||
unsigned int clk_div;
|
||||
|
||||
switch (drv_data->ssp_type) {
|
||||
|
@ -908,7 +908,7 @@ static unsigned int pxa2xx_ssp_get_clk_div(struct driver_data *drv_data,
|
|||
return clk_div << 8;
|
||||
}
|
||||
|
||||
static bool pxa2xx_spi_can_dma(struct spi_controller *master,
|
||||
static bool pxa2xx_spi_can_dma(struct spi_controller *controller,
|
||||
struct spi_device *spi,
|
||||
struct spi_transfer *xfer)
|
||||
{
|
||||
|
@ -919,12 +919,12 @@ static bool pxa2xx_spi_can_dma(struct spi_controller *master,
|
|||
xfer->len >= chip->dma_burst_size;
|
||||
}
|
||||
|
||||
static int pxa2xx_spi_transfer_one(struct spi_controller *master,
|
||||
static int pxa2xx_spi_transfer_one(struct spi_controller *controller,
|
||||
struct spi_device *spi,
|
||||
struct spi_transfer *transfer)
|
||||
{
|
||||
struct driver_data *drv_data = spi_controller_get_devdata(master);
|
||||
struct spi_message *message = master->cur_msg;
|
||||
struct driver_data *drv_data = spi_controller_get_devdata(controller);
|
||||
struct spi_message *message = controller->cur_msg;
|
||||
struct chip_data *chip = spi_get_ctldata(message->spi);
|
||||
u32 dma_thresh = chip->dma_threshold;
|
||||
u32 dma_burst = chip->dma_burst_size;
|
||||
|
@ -1006,9 +1006,9 @@ static int pxa2xx_spi_transfer_one(struct spi_controller *master,
|
|||
"DMA burst size reduced to match bits_per_word\n");
|
||||
}
|
||||
|
||||
dma_mapped = master->can_dma &&
|
||||
master->can_dma(master, message->spi, transfer) &&
|
||||
master->cur_msg_mapped;
|
||||
dma_mapped = controller->can_dma &&
|
||||
controller->can_dma(controller, message->spi, transfer) &&
|
||||
controller->cur_msg_mapped;
|
||||
if (dma_mapped) {
|
||||
|
||||
/* Ensure we have the correct interrupt handler */
|
||||
|
@ -1036,12 +1036,12 @@ static int pxa2xx_spi_transfer_one(struct spi_controller *master,
|
|||
cr0 = pxa2xx_configure_sscr0(drv_data, clk_div, bits);
|
||||
if (!pxa25x_ssp_comp(drv_data))
|
||||
dev_dbg(&message->spi->dev, "%u Hz actual, %s\n",
|
||||
master->max_speed_hz
|
||||
controller->max_speed_hz
|
||||
/ (1 + ((cr0 & SSCR0_SCR(0xfff)) >> 8)),
|
||||
dma_mapped ? "DMA" : "PIO");
|
||||
else
|
||||
dev_dbg(&message->spi->dev, "%u Hz actual, %s\n",
|
||||
master->max_speed_hz / 2
|
||||
controller->max_speed_hz / 2
|
||||
/ (1 + ((cr0 & SSCR0_SCR(0x0ff)) >> 8)),
|
||||
dma_mapped ? "DMA" : "PIO");
|
||||
|
||||
|
@ -1092,7 +1092,7 @@ static int pxa2xx_spi_transfer_one(struct spi_controller *master,
|
|||
}
|
||||
}
|
||||
|
||||
if (spi_controller_is_slave(master)) {
|
||||
if (spi_controller_is_slave(controller)) {
|
||||
while (drv_data->write(drv_data))
|
||||
;
|
||||
if (drv_data->gpiod_ready) {
|
||||
|
@ -1111,9 +1111,9 @@ static int pxa2xx_spi_transfer_one(struct spi_controller *master,
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int pxa2xx_spi_slave_abort(struct spi_master *master)
|
||||
static int pxa2xx_spi_slave_abort(struct spi_controller *controller)
|
||||
{
|
||||
struct driver_data *drv_data = spi_controller_get_devdata(master);
|
||||
struct driver_data *drv_data = spi_controller_get_devdata(controller);
|
||||
|
||||
/* Stop and reset SSP */
|
||||
write_SSSR_CS(drv_data, drv_data->clear_sr);
|
||||
|
@ -1126,16 +1126,16 @@ static int pxa2xx_spi_slave_abort(struct spi_master *master)
|
|||
|
||||
dev_dbg(&drv_data->pdev->dev, "transfer aborted\n");
|
||||
|
||||
drv_data->master->cur_msg->status = -EINTR;
|
||||
spi_finalize_current_transfer(drv_data->master);
|
||||
drv_data->controller->cur_msg->status = -EINTR;
|
||||
spi_finalize_current_transfer(drv_data->controller);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void pxa2xx_spi_handle_err(struct spi_controller *master,
|
||||
static void pxa2xx_spi_handle_err(struct spi_controller *controller,
|
||||
struct spi_message *msg)
|
||||
{
|
||||
struct driver_data *drv_data = spi_controller_get_devdata(master);
|
||||
struct driver_data *drv_data = spi_controller_get_devdata(controller);
|
||||
|
||||
/* Disable the SSP */
|
||||
pxa2xx_spi_write(drv_data, SSCR0,
|
||||
|
@ -1159,9 +1159,9 @@ static void pxa2xx_spi_handle_err(struct spi_controller *master,
|
|||
pxa2xx_spi_dma_stop(drv_data);
|
||||
}
|
||||
|
||||
static int pxa2xx_spi_unprepare_transfer(struct spi_controller *master)
|
||||
static int pxa2xx_spi_unprepare_transfer(struct spi_controller *controller)
|
||||
{
|
||||
struct driver_data *drv_data = spi_controller_get_devdata(master);
|
||||
struct driver_data *drv_data = spi_controller_get_devdata(controller);
|
||||
|
||||
/* Disable the SSP now */
|
||||
pxa2xx_spi_write(drv_data, SSCR0,
|
||||
|
@ -1260,7 +1260,7 @@ static int setup(struct spi_device *spi)
|
|||
break;
|
||||
default:
|
||||
tx_hi_thres = 0;
|
||||
if (spi_controller_is_slave(drv_data->master)) {
|
||||
if (spi_controller_is_slave(drv_data->controller)) {
|
||||
tx_thres = 1;
|
||||
rx_thres = 2;
|
||||
} else {
|
||||
|
@ -1287,7 +1287,7 @@ static int setup(struct spi_device *spi)
|
|||
|
||||
chip->frm = spi->chip_select;
|
||||
}
|
||||
chip->enable_dma = drv_data->master_info->enable_dma;
|
||||
chip->enable_dma = drv_data->controller_info->enable_dma;
|
||||
chip->timeout = TIMOUT_DFLT;
|
||||
}
|
||||
|
||||
|
@ -1310,7 +1310,7 @@ static int setup(struct spi_device *spi)
|
|||
if (chip_info->enable_loopback)
|
||||
chip->cr1 = SSCR1_LBM;
|
||||
}
|
||||
if (spi_controller_is_slave(drv_data->master)) {
|
||||
if (spi_controller_is_slave(drv_data->controller)) {
|
||||
chip->cr1 |= SSCR1_SCFR;
|
||||
chip->cr1 |= SSCR1_SCLKDIR;
|
||||
chip->cr1 |= SSCR1_SFRMDIR;
|
||||
|
@ -1497,10 +1497,10 @@ static bool pxa2xx_spi_idma_filter(struct dma_chan *chan, void *param)
|
|||
|
||||
#endif /* CONFIG_PCI */
|
||||
|
||||
static struct pxa2xx_spi_master *
|
||||
static struct pxa2xx_spi_controller *
|
||||
pxa2xx_spi_init_pdata(struct platform_device *pdev)
|
||||
{
|
||||
struct pxa2xx_spi_master *pdata;
|
||||
struct pxa2xx_spi_controller *pdata;
|
||||
struct acpi_device *adev;
|
||||
struct ssp_device *ssp;
|
||||
struct resource *res;
|
||||
|
@ -1568,10 +1568,10 @@ pxa2xx_spi_init_pdata(struct platform_device *pdev)
|
|||
return pdata;
|
||||
}
|
||||
|
||||
static int pxa2xx_spi_fw_translate_cs(struct spi_controller *master,
|
||||
static int pxa2xx_spi_fw_translate_cs(struct spi_controller *controller,
|
||||
unsigned int cs)
|
||||
{
|
||||
struct driver_data *drv_data = spi_controller_get_devdata(master);
|
||||
struct driver_data *drv_data = spi_controller_get_devdata(controller);
|
||||
|
||||
if (has_acpi_companion(&drv_data->pdev->dev)) {
|
||||
switch (drv_data->ssp_type) {
|
||||
|
@ -1595,8 +1595,8 @@ static int pxa2xx_spi_fw_translate_cs(struct spi_controller *master,
|
|||
static int pxa2xx_spi_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct pxa2xx_spi_master *platform_info;
|
||||
struct spi_controller *master;
|
||||
struct pxa2xx_spi_controller *platform_info;
|
||||
struct spi_controller *controller;
|
||||
struct driver_data *drv_data;
|
||||
struct ssp_device *ssp;
|
||||
const struct lpss_config *config;
|
||||
|
@ -1622,37 +1622,37 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
if (platform_info->is_slave)
|
||||
master = spi_alloc_slave(dev, sizeof(struct driver_data));
|
||||
controller = spi_alloc_slave(dev, sizeof(struct driver_data));
|
||||
else
|
||||
master = spi_alloc_master(dev, sizeof(struct driver_data));
|
||||
controller = spi_alloc_master(dev, sizeof(struct driver_data));
|
||||
|
||||
if (!master) {
|
||||
dev_err(&pdev->dev, "cannot alloc spi_master\n");
|
||||
if (!controller) {
|
||||
dev_err(&pdev->dev, "cannot alloc spi_controller\n");
|
||||
pxa_ssp_free(ssp);
|
||||
return -ENOMEM;
|
||||
}
|
||||
drv_data = spi_controller_get_devdata(master);
|
||||
drv_data->master = master;
|
||||
drv_data->master_info = platform_info;
|
||||
drv_data = spi_controller_get_devdata(controller);
|
||||
drv_data->controller = controller;
|
||||
drv_data->controller_info = platform_info;
|
||||
drv_data->pdev = pdev;
|
||||
drv_data->ssp = ssp;
|
||||
|
||||
master->dev.of_node = pdev->dev.of_node;
|
||||
controller->dev.of_node = pdev->dev.of_node;
|
||||
/* the spi->mode bits understood by this driver: */
|
||||
master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH | SPI_LOOP;
|
||||
controller->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH | SPI_LOOP;
|
||||
|
||||
master->bus_num = ssp->port_id;
|
||||
master->dma_alignment = DMA_ALIGNMENT;
|
||||
master->cleanup = cleanup;
|
||||
master->setup = setup;
|
||||
master->set_cs = pxa2xx_spi_set_cs;
|
||||
master->transfer_one = pxa2xx_spi_transfer_one;
|
||||
master->slave_abort = pxa2xx_spi_slave_abort;
|
||||
master->handle_err = pxa2xx_spi_handle_err;
|
||||
master->unprepare_transfer_hardware = pxa2xx_spi_unprepare_transfer;
|
||||
master->fw_translate_cs = pxa2xx_spi_fw_translate_cs;
|
||||
master->auto_runtime_pm = true;
|
||||
master->flags = SPI_CONTROLLER_MUST_RX | SPI_CONTROLLER_MUST_TX;
|
||||
controller->bus_num = ssp->port_id;
|
||||
controller->dma_alignment = DMA_ALIGNMENT;
|
||||
controller->cleanup = cleanup;
|
||||
controller->setup = setup;
|
||||
controller->set_cs = pxa2xx_spi_set_cs;
|
||||
controller->transfer_one = pxa2xx_spi_transfer_one;
|
||||
controller->slave_abort = pxa2xx_spi_slave_abort;
|
||||
controller->handle_err = pxa2xx_spi_handle_err;
|
||||
controller->unprepare_transfer_hardware = pxa2xx_spi_unprepare_transfer;
|
||||
controller->fw_translate_cs = pxa2xx_spi_fw_translate_cs;
|
||||
controller->auto_runtime_pm = true;
|
||||
controller->flags = SPI_CONTROLLER_MUST_RX | SPI_CONTROLLER_MUST_TX;
|
||||
|
||||
drv_data->ssp_type = ssp->type;
|
||||
|
||||
|
@ -1661,10 +1661,10 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
|
|||
if (pxa25x_ssp_comp(drv_data)) {
|
||||
switch (drv_data->ssp_type) {
|
||||
case QUARK_X1000_SSP:
|
||||
master->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 32);
|
||||
controller->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 32);
|
||||
break;
|
||||
default:
|
||||
master->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 16);
|
||||
controller->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 16);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1673,7 +1673,7 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
|
|||
drv_data->clear_sr = SSSR_ROR;
|
||||
drv_data->mask_sr = SSSR_RFS | SSSR_TFS | SSSR_ROR;
|
||||
} else {
|
||||
master->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 32);
|
||||
controller->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 32);
|
||||
drv_data->int_cr1 = SSCR1_TIE | SSCR1_RIE | SSCR1_TINTE;
|
||||
drv_data->dma_cr1 = DEFAULT_DMA_CR1;
|
||||
drv_data->clear_sr = SSSR_ROR | SSSR_TINT;
|
||||
|
@ -1685,7 +1685,7 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
|
|||
drv_data);
|
||||
if (status < 0) {
|
||||
dev_err(&pdev->dev, "cannot get IRQ %d\n", ssp->irq);
|
||||
goto out_error_master_alloc;
|
||||
goto out_error_controller_alloc;
|
||||
}
|
||||
|
||||
/* Setup DMA if requested */
|
||||
|
@ -1695,7 +1695,7 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
|
|||
dev_dbg(dev, "no DMA channels available, using PIO\n");
|
||||
platform_info->enable_dma = false;
|
||||
} else {
|
||||
master->can_dma = pxa2xx_spi_can_dma;
|
||||
controller->can_dma = pxa2xx_spi_can_dma;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1704,7 +1704,7 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
|
|||
if (status)
|
||||
goto out_error_dma_irq_alloc;
|
||||
|
||||
master->max_speed_hz = clk_get_rate(ssp->clk);
|
||||
controller->max_speed_hz = clk_get_rate(ssp->clk);
|
||||
|
||||
/* Load default SSP configuration */
|
||||
pxa2xx_spi_write(drv_data, SSCR0, 0);
|
||||
|
@ -1727,7 +1727,7 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
|
|||
break;
|
||||
default:
|
||||
|
||||
if (spi_controller_is_slave(master)) {
|
||||
if (spi_controller_is_slave(controller)) {
|
||||
tmp = SSCR1_SCFR |
|
||||
SSCR1_SCLKDIR |
|
||||
SSCR1_SFRMDIR |
|
||||
|
@ -1740,7 +1740,7 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
|
|||
}
|
||||
pxa2xx_spi_write(drv_data, SSCR1, tmp);
|
||||
tmp = SSCR0_Motorola | SSCR0_DataSize(8);
|
||||
if (!spi_controller_is_slave(master))
|
||||
if (!spi_controller_is_slave(controller))
|
||||
tmp |= SSCR0_SCR(2);
|
||||
pxa2xx_spi_write(drv_data, SSCR0, tmp);
|
||||
break;
|
||||
|
@ -1765,24 +1765,24 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
|
|||
platform_info->num_chipselect = config->cs_num;
|
||||
}
|
||||
}
|
||||
master->num_chipselect = platform_info->num_chipselect;
|
||||
controller->num_chipselect = platform_info->num_chipselect;
|
||||
|
||||
count = gpiod_count(&pdev->dev, "cs");
|
||||
if (count > 0) {
|
||||
int i;
|
||||
|
||||
master->num_chipselect = max_t(int, count,
|
||||
master->num_chipselect);
|
||||
controller->num_chipselect = max_t(int, count,
|
||||
controller->num_chipselect);
|
||||
|
||||
drv_data->cs_gpiods = devm_kcalloc(&pdev->dev,
|
||||
master->num_chipselect, sizeof(struct gpio_desc *),
|
||||
controller->num_chipselect, sizeof(struct gpio_desc *),
|
||||
GFP_KERNEL);
|
||||
if (!drv_data->cs_gpiods) {
|
||||
status = -ENOMEM;
|
||||
goto out_error_clock_enabled;
|
||||
}
|
||||
|
||||
for (i = 0; i < master->num_chipselect; i++) {
|
||||
for (i = 0; i < controller->num_chipselect; i++) {
|
||||
struct gpio_desc *gpiod;
|
||||
|
||||
gpiod = devm_gpiod_get_index(dev, "cs", i, GPIOD_ASIS);
|
||||
|
@ -1815,9 +1815,9 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
|
|||
|
||||
/* Register with the SPI framework */
|
||||
platform_set_drvdata(pdev, drv_data);
|
||||
status = devm_spi_register_controller(&pdev->dev, master);
|
||||
status = devm_spi_register_controller(&pdev->dev, controller);
|
||||
if (status != 0) {
|
||||
dev_err(&pdev->dev, "problem registering spi master\n");
|
||||
dev_err(&pdev->dev, "problem registering spi controller\n");
|
||||
goto out_error_clock_enabled;
|
||||
}
|
||||
|
||||
|
@ -1832,8 +1832,8 @@ out_error_dma_irq_alloc:
|
|||
pxa2xx_spi_dma_release(drv_data);
|
||||
free_irq(ssp->irq, drv_data);
|
||||
|
||||
out_error_master_alloc:
|
||||
spi_controller_put(master);
|
||||
out_error_controller_alloc:
|
||||
spi_controller_put(controller);
|
||||
pxa_ssp_free(ssp);
|
||||
return status;
|
||||
}
|
||||
|
@ -1854,7 +1854,7 @@ static int pxa2xx_spi_remove(struct platform_device *pdev)
|
|||
clk_disable_unprepare(ssp->clk);
|
||||
|
||||
/* Release DMA */
|
||||
if (drv_data->master_info->enable_dma)
|
||||
if (drv_data->controller_info->enable_dma)
|
||||
pxa2xx_spi_dma_release(drv_data);
|
||||
|
||||
pm_runtime_put_noidle(&pdev->dev);
|
||||
|
@ -1876,7 +1876,7 @@ static int pxa2xx_spi_suspend(struct device *dev)
|
|||
struct ssp_device *ssp = drv_data->ssp;
|
||||
int status;
|
||||
|
||||
status = spi_controller_suspend(drv_data->master);
|
||||
status = spi_controller_suspend(drv_data->controller);
|
||||
if (status != 0)
|
||||
return status;
|
||||
pxa2xx_spi_write(drv_data, SSCR0, 0);
|
||||
|
@ -1901,7 +1901,7 @@ static int pxa2xx_spi_resume(struct device *dev)
|
|||
}
|
||||
|
||||
/* Start the queue running */
|
||||
return spi_controller_resume(drv_data->master);
|
||||
return spi_controller_resume(drv_data->controller);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -31,10 +31,10 @@ struct driver_data {
|
|||
|
||||
/* SPI framework hookup */
|
||||
enum pxa_ssp_type ssp_type;
|
||||
struct spi_controller *master;
|
||||
struct spi_controller *controller;
|
||||
|
||||
/* PXA hookup */
|
||||
struct pxa2xx_spi_master *master_info;
|
||||
struct pxa2xx_spi_controller *controller_info;
|
||||
|
||||
/* SSP register addresses */
|
||||
void __iomem *ioaddr;
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
struct dma_chan;
|
||||
|
||||
/* device.platform_data for SSP controller devices */
|
||||
struct pxa2xx_spi_master {
|
||||
struct pxa2xx_spi_controller {
|
||||
u16 num_chipselect;
|
||||
u8 enable_dma;
|
||||
bool is_slave;
|
||||
|
@ -54,7 +54,7 @@ struct pxa2xx_spi_chip {
|
|||
|
||||
#include <linux/clk.h>
|
||||
|
||||
extern void pxa2xx_set_spi_info(unsigned id, struct pxa2xx_spi_master *info);
|
||||
extern void pxa2xx_set_spi_info(unsigned id, struct pxa2xx_spi_controller *info);
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue