|
@@ -41,8 +41,6 @@ MODULE_DESCRIPTION("PXA2xx SSP SPI Controller");
|
|
|
MODULE_LICENSE("GPL");
|
|
|
MODULE_ALIAS("platform:pxa2xx-spi");
|
|
|
|
|
|
-#define MAX_BUSES 3
|
|
|
-
|
|
|
#define TIMOUT_DFLT 1000
|
|
|
|
|
|
/*
|
|
@@ -158,7 +156,6 @@ pxa2xx_spi_get_rx_default_thre(const struct driver_data *drv_data)
|
|
|
|
|
|
static bool pxa2xx_spi_txfifo_full(const struct driver_data *drv_data)
|
|
|
{
|
|
|
- void __iomem *reg = drv_data->ioaddr;
|
|
|
u32 mask;
|
|
|
|
|
|
switch (drv_data->ssp_type) {
|
|
@@ -170,7 +167,7 @@ static bool pxa2xx_spi_txfifo_full(const struct driver_data *drv_data)
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- return (read_SSSR(reg) & mask) == mask;
|
|
|
+ return (pxa2xx_spi_read(drv_data, SSSR) & mask) == mask;
|
|
|
}
|
|
|
|
|
|
static void pxa2xx_spi_clear_rx_thre(const struct driver_data *drv_data,
|
|
@@ -249,9 +246,6 @@ static void lpss_ssp_setup(struct driver_data *drv_data)
|
|
|
unsigned offset = 0x400;
|
|
|
u32 value, orig;
|
|
|
|
|
|
- if (!is_lpss_ssp(drv_data))
|
|
|
- return;
|
|
|
-
|
|
|
/*
|
|
|
* Perform auto-detection of the LPSS SSP private registers. They
|
|
|
* can be either at 1k or 2k offset from the base address.
|
|
@@ -300,9 +294,6 @@ static void lpss_ssp_cs_control(struct driver_data *drv_data, bool enable)
|
|
|
{
|
|
|
u32 value;
|
|
|
|
|
|
- if (!is_lpss_ssp(drv_data))
|
|
|
- return;
|
|
|
-
|
|
|
value = __lpss_ssp_read_priv(drv_data, SPI_CS_CONTROL);
|
|
|
if (enable)
|
|
|
value &= ~SPI_CS_CONTROL_CS_HIGH;
|
|
@@ -316,7 +307,7 @@ static void cs_assert(struct driver_data *drv_data)
|
|
|
struct chip_data *chip = drv_data->cur_chip;
|
|
|
|
|
|
if (drv_data->ssp_type == CE4100_SSP) {
|
|
|
- write_SSSR(drv_data->cur_chip->frm, drv_data->ioaddr);
|
|
|
+ pxa2xx_spi_write(drv_data, SSSR, drv_data->cur_chip->frm);
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -330,7 +321,8 @@ static void cs_assert(struct driver_data *drv_data)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- lpss_ssp_cs_control(drv_data, true);
|
|
|
+ if (is_lpss_ssp(drv_data))
|
|
|
+ lpss_ssp_cs_control(drv_data, true);
|
|
|
}
|
|
|
|
|
|
static void cs_deassert(struct driver_data *drv_data)
|
|
@@ -350,20 +342,18 @@ static void cs_deassert(struct driver_data *drv_data)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- lpss_ssp_cs_control(drv_data, false);
|
|
|
+ if (is_lpss_ssp(drv_data))
|
|
|
+ lpss_ssp_cs_control(drv_data, false);
|
|
|
}
|
|
|
|
|
|
int pxa2xx_spi_flush(struct driver_data *drv_data)
|
|
|
{
|
|
|
unsigned long limit = loops_per_jiffy << 1;
|
|
|
|
|
|
- void __iomem *reg = drv_data->ioaddr;
|
|
|
-
|
|
|
do {
|
|
|
- while (read_SSSR(reg) & SSSR_RNE) {
|
|
|
- read_SSDR(reg);
|
|
|
- }
|
|
|
- } while ((read_SSSR(reg) & SSSR_BSY) && --limit);
|
|
|
+ while (pxa2xx_spi_read(drv_data, SSSR) & SSSR_RNE)
|
|
|
+ pxa2xx_spi_read(drv_data, SSDR);
|
|
|
+ } while ((pxa2xx_spi_read(drv_data, SSSR) & SSSR_BSY) && --limit);
|
|
|
write_SSSR_CS(drv_data, SSSR_ROR);
|
|
|
|
|
|
return limit;
|
|
@@ -371,14 +361,13 @@ int pxa2xx_spi_flush(struct driver_data *drv_data)
|
|
|
|
|
|
static int null_writer(struct driver_data *drv_data)
|
|
|
{
|
|
|
- void __iomem *reg = drv_data->ioaddr;
|
|
|
u8 n_bytes = drv_data->n_bytes;
|
|
|
|
|
|
if (pxa2xx_spi_txfifo_full(drv_data)
|
|
|
|| (drv_data->tx == drv_data->tx_end))
|
|
|
return 0;
|
|
|
|
|
|
- write_SSDR(0, reg);
|
|
|
+ pxa2xx_spi_write(drv_data, SSDR, 0);
|
|
|
drv_data->tx += n_bytes;
|
|
|
|
|
|
return 1;
|
|
@@ -386,12 +375,11 @@ static int null_writer(struct driver_data *drv_data)
|
|
|
|
|
|
static int null_reader(struct driver_data *drv_data)
|
|
|
{
|
|
|
- void __iomem *reg = drv_data->ioaddr;
|
|
|
u8 n_bytes = drv_data->n_bytes;
|
|
|
|
|
|
- while ((read_SSSR(reg) & SSSR_RNE)
|
|
|
- && (drv_data->rx < drv_data->rx_end)) {
|
|
|
- read_SSDR(reg);
|
|
|
+ while ((pxa2xx_spi_read(drv_data, SSSR) & SSSR_RNE)
|
|
|
+ && (drv_data->rx < drv_data->rx_end)) {
|
|
|
+ pxa2xx_spi_read(drv_data, SSDR);
|
|
|
drv_data->rx += n_bytes;
|
|
|
}
|
|
|
|
|
@@ -400,13 +388,11 @@ static int null_reader(struct driver_data *drv_data)
|
|
|
|
|
|
static int u8_writer(struct driver_data *drv_data)
|
|
|
{
|
|
|
- void __iomem *reg = drv_data->ioaddr;
|
|
|
-
|
|
|
if (pxa2xx_spi_txfifo_full(drv_data)
|
|
|
|| (drv_data->tx == drv_data->tx_end))
|
|
|
return 0;
|
|
|
|
|
|
- write_SSDR(*(u8 *)(drv_data->tx), reg);
|
|
|
+ pxa2xx_spi_write(drv_data, SSDR, *(u8 *)(drv_data->tx));
|
|
|
++drv_data->tx;
|
|
|
|
|
|
return 1;
|
|
@@ -414,11 +400,9 @@ static int u8_writer(struct driver_data *drv_data)
|
|
|
|
|
|
static int u8_reader(struct driver_data *drv_data)
|
|
|
{
|
|
|
- void __iomem *reg = drv_data->ioaddr;
|
|
|
-
|
|
|
- while ((read_SSSR(reg) & SSSR_RNE)
|
|
|
- && (drv_data->rx < drv_data->rx_end)) {
|
|
|
- *(u8 *)(drv_data->rx) = read_SSDR(reg);
|
|
|
+ while ((pxa2xx_spi_read(drv_data, SSSR) & SSSR_RNE)
|
|
|
+ && (drv_data->rx < drv_data->rx_end)) {
|
|
|
+ *(u8 *)(drv_data->rx) = pxa2xx_spi_read(drv_data, SSDR);
|
|
|
++drv_data->rx;
|
|
|
}
|
|
|
|
|
@@ -427,13 +411,11 @@ static int u8_reader(struct driver_data *drv_data)
|
|
|
|
|
|
static int u16_writer(struct driver_data *drv_data)
|
|
|
{
|
|
|
- void __iomem *reg = drv_data->ioaddr;
|
|
|
-
|
|
|
if (pxa2xx_spi_txfifo_full(drv_data)
|
|
|
|| (drv_data->tx == drv_data->tx_end))
|
|
|
return 0;
|
|
|
|
|
|
- write_SSDR(*(u16 *)(drv_data->tx), reg);
|
|
|
+ pxa2xx_spi_write(drv_data, SSDR, *(u16 *)(drv_data->tx));
|
|
|
drv_data->tx += 2;
|
|
|
|
|
|
return 1;
|
|
@@ -441,11 +423,9 @@ static int u16_writer(struct driver_data *drv_data)
|
|
|
|
|
|
static int u16_reader(struct driver_data *drv_data)
|
|
|
{
|
|
|
- void __iomem *reg = drv_data->ioaddr;
|
|
|
-
|
|
|
- while ((read_SSSR(reg) & SSSR_RNE)
|
|
|
- && (drv_data->rx < drv_data->rx_end)) {
|
|
|
- *(u16 *)(drv_data->rx) = read_SSDR(reg);
|
|
|
+ while ((pxa2xx_spi_read(drv_data, SSSR) & SSSR_RNE)
|
|
|
+ && (drv_data->rx < drv_data->rx_end)) {
|
|
|
+ *(u16 *)(drv_data->rx) = pxa2xx_spi_read(drv_data, SSDR);
|
|
|
drv_data->rx += 2;
|
|
|
}
|
|
|
|
|
@@ -454,13 +434,11 @@ static int u16_reader(struct driver_data *drv_data)
|
|
|
|
|
|
static int u32_writer(struct driver_data *drv_data)
|
|
|
{
|
|
|
- void __iomem *reg = drv_data->ioaddr;
|
|
|
-
|
|
|
if (pxa2xx_spi_txfifo_full(drv_data)
|
|
|
|| (drv_data->tx == drv_data->tx_end))
|
|
|
return 0;
|
|
|
|
|
|
- write_SSDR(*(u32 *)(drv_data->tx), reg);
|
|
|
+ pxa2xx_spi_write(drv_data, SSDR, *(u32 *)(drv_data->tx));
|
|
|
drv_data->tx += 4;
|
|
|
|
|
|
return 1;
|
|
@@ -468,11 +446,9 @@ static int u32_writer(struct driver_data *drv_data)
|
|
|
|
|
|
static int u32_reader(struct driver_data *drv_data)
|
|
|
{
|
|
|
- void __iomem *reg = drv_data->ioaddr;
|
|
|
-
|
|
|
- while ((read_SSSR(reg) & SSSR_RNE)
|
|
|
- && (drv_data->rx < drv_data->rx_end)) {
|
|
|
- *(u32 *)(drv_data->rx) = read_SSDR(reg);
|
|
|
+ while ((pxa2xx_spi_read(drv_data, SSSR) & SSSR_RNE)
|
|
|
+ && (drv_data->rx < drv_data->rx_end)) {
|
|
|
+ *(u32 *)(drv_data->rx) = pxa2xx_spi_read(drv_data, SSDR);
|
|
|
drv_data->rx += 4;
|
|
|
}
|
|
|
|
|
@@ -548,27 +524,25 @@ static void giveback(struct driver_data *drv_data)
|
|
|
|
|
|
static void reset_sccr1(struct driver_data *drv_data)
|
|
|
{
|
|
|
- void __iomem *reg = drv_data->ioaddr;
|
|
|
struct chip_data *chip = drv_data->cur_chip;
|
|
|
u32 sccr1_reg;
|
|
|
|
|
|
- sccr1_reg = read_SSCR1(reg) & ~drv_data->int_cr1;
|
|
|
+ sccr1_reg = pxa2xx_spi_read(drv_data, SSCR1) & ~drv_data->int_cr1;
|
|
|
sccr1_reg &= ~SSCR1_RFT;
|
|
|
sccr1_reg |= chip->threshold;
|
|
|
- write_SSCR1(sccr1_reg, reg);
|
|
|
+ pxa2xx_spi_write(drv_data, SSCR1, sccr1_reg);
|
|
|
}
|
|
|
|
|
|
static void int_error_stop(struct driver_data *drv_data, const char* msg)
|
|
|
{
|
|
|
- void __iomem *reg = drv_data->ioaddr;
|
|
|
-
|
|
|
/* Stop and reset SSP */
|
|
|
write_SSSR_CS(drv_data, drv_data->clear_sr);
|
|
|
reset_sccr1(drv_data);
|
|
|
if (!pxa25x_ssp_comp(drv_data))
|
|
|
- write_SSTO(0, reg);
|
|
|
+ pxa2xx_spi_write(drv_data, SSTO, 0);
|
|
|
pxa2xx_spi_flush(drv_data);
|
|
|
- write_SSCR0(read_SSCR0(reg) & ~SSCR0_SSE, reg);
|
|
|
+ pxa2xx_spi_write(drv_data, SSCR0,
|
|
|
+ pxa2xx_spi_read(drv_data, SSCR0) & ~SSCR0_SSE);
|
|
|
|
|
|
dev_err(&drv_data->pdev->dev, "%s\n", msg);
|
|
|
|
|
@@ -578,13 +552,11 @@ static void int_error_stop(struct driver_data *drv_data, const char* msg)
|
|
|
|
|
|
static void int_transfer_complete(struct driver_data *drv_data)
|
|
|
{
|
|
|
- void __iomem *reg = drv_data->ioaddr;
|
|
|
-
|
|
|
/* Stop SSP */
|
|
|
write_SSSR_CS(drv_data, drv_data->clear_sr);
|
|
|
reset_sccr1(drv_data);
|
|
|
if (!pxa25x_ssp_comp(drv_data))
|
|
|
- write_SSTO(0, reg);
|
|
|
+ pxa2xx_spi_write(drv_data, SSTO, 0);
|
|
|
|
|
|
/* Update total byte transferred return count actual bytes read */
|
|
|
drv_data->cur_msg->actual_length += drv_data->len -
|
|
@@ -603,12 +575,10 @@ static void int_transfer_complete(struct driver_data *drv_data)
|
|
|
|
|
|
static irqreturn_t interrupt_transfer(struct driver_data *drv_data)
|
|
|
{
|
|
|
- void __iomem *reg = drv_data->ioaddr;
|
|
|
+ u32 irq_mask = (pxa2xx_spi_read(drv_data, SSCR1) & SSCR1_TIE) ?
|
|
|
+ drv_data->mask_sr : drv_data->mask_sr & ~SSSR_TFS;
|
|
|
|
|
|
- u32 irq_mask = (read_SSCR1(reg) & SSCR1_TIE) ?
|
|
|
- drv_data->mask_sr : drv_data->mask_sr & ~SSSR_TFS;
|
|
|
-
|
|
|
- u32 irq_status = read_SSSR(reg) & irq_mask;
|
|
|
+ u32 irq_status = pxa2xx_spi_read(drv_data, SSSR) & irq_mask;
|
|
|
|
|
|
if (irq_status & SSSR_ROR) {
|
|
|
int_error_stop(drv_data, "interrupt_transfer: fifo overrun");
|
|
@@ -616,7 +586,7 @@ static irqreturn_t interrupt_transfer(struct driver_data *drv_data)
|
|
|
}
|
|
|
|
|
|
if (irq_status & SSSR_TINT) {
|
|
|
- write_SSSR(SSSR_TINT, reg);
|
|
|
+ pxa2xx_spi_write(drv_data, SSSR, SSSR_TINT);
|
|
|
if (drv_data->read(drv_data)) {
|
|
|
int_transfer_complete(drv_data);
|
|
|
return IRQ_HANDLED;
|
|
@@ -640,7 +610,7 @@ static irqreturn_t interrupt_transfer(struct driver_data *drv_data)
|
|
|
u32 bytes_left;
|
|
|
u32 sccr1_reg;
|
|
|
|
|
|
- sccr1_reg = read_SSCR1(reg);
|
|
|
+ sccr1_reg = pxa2xx_spi_read(drv_data, SSCR1);
|
|
|
sccr1_reg &= ~SSCR1_TIE;
|
|
|
|
|
|
/*
|
|
@@ -666,7 +636,7 @@ static irqreturn_t interrupt_transfer(struct driver_data *drv_data)
|
|
|
|
|
|
pxa2xx_spi_set_rx_thre(drv_data, &sccr1_reg, rx_thre);
|
|
|
}
|
|
|
- write_SSCR1(sccr1_reg, reg);
|
|
|
+ pxa2xx_spi_write(drv_data, SSCR1, sccr1_reg);
|
|
|
}
|
|
|
|
|
|
/* We did something */
|
|
@@ -676,7 +646,6 @@ static irqreturn_t interrupt_transfer(struct driver_data *drv_data)
|
|
|
static irqreturn_t ssp_int(int irq, void *dev_id)
|
|
|
{
|
|
|
struct driver_data *drv_data = dev_id;
|
|
|
- void __iomem *reg = drv_data->ioaddr;
|
|
|
u32 sccr1_reg;
|
|
|
u32 mask = drv_data->mask_sr;
|
|
|
u32 status;
|
|
@@ -696,11 +665,11 @@ static irqreturn_t ssp_int(int irq, void *dev_id)
|
|
|
* are all set to one. That means that the device is already
|
|
|
* powered off.
|
|
|
*/
|
|
|
- status = read_SSSR(reg);
|
|
|
+ status = pxa2xx_spi_read(drv_data, SSSR);
|
|
|
if (status == ~0)
|
|
|
return IRQ_NONE;
|
|
|
|
|
|
- sccr1_reg = read_SSCR1(reg);
|
|
|
+ sccr1_reg = pxa2xx_spi_read(drv_data, SSCR1);
|
|
|
|
|
|
/* Ignore possible writes if we don't need to write */
|
|
|
if (!(sccr1_reg & SSCR1_TIE))
|
|
@@ -711,10 +680,14 @@ static irqreturn_t ssp_int(int irq, void *dev_id)
|
|
|
|
|
|
if (!drv_data->cur_msg) {
|
|
|
|
|
|
- write_SSCR0(read_SSCR0(reg) & ~SSCR0_SSE, reg);
|
|
|
- write_SSCR1(read_SSCR1(reg) & ~drv_data->int_cr1, reg);
|
|
|
+ pxa2xx_spi_write(drv_data, SSCR0,
|
|
|
+ pxa2xx_spi_read(drv_data, SSCR0)
|
|
|
+ & ~SSCR0_SSE);
|
|
|
+ pxa2xx_spi_write(drv_data, SSCR1,
|
|
|
+ pxa2xx_spi_read(drv_data, SSCR1)
|
|
|
+ & ~drv_data->int_cr1);
|
|
|
if (!pxa25x_ssp_comp(drv_data))
|
|
|
- write_SSTO(0, reg);
|
|
|
+ pxa2xx_spi_write(drv_data, SSTO, 0);
|
|
|
write_SSSR_CS(drv_data, drv_data->clear_sr);
|
|
|
|
|
|
dev_err(&drv_data->pdev->dev,
|
|
@@ -783,7 +756,6 @@ static void pump_transfers(unsigned long data)
|
|
|
struct spi_transfer *transfer = NULL;
|
|
|
struct spi_transfer *previous = NULL;
|
|
|
struct chip_data *chip = NULL;
|
|
|
- void __iomem *reg = drv_data->ioaddr;
|
|
|
u32 clk_div = 0;
|
|
|
u8 bits = 0;
|
|
|
u32 speed = 0;
|
|
@@ -927,7 +899,7 @@ static void pump_transfers(unsigned long data)
|
|
|
|
|
|
/* Clear status and start DMA engine */
|
|
|
cr1 = chip->cr1 | dma_thresh | drv_data->dma_cr1;
|
|
|
- write_SSSR(drv_data->clear_sr, reg);
|
|
|
+ pxa2xx_spi_write(drv_data, SSSR, drv_data->clear_sr);
|
|
|
|
|
|
pxa2xx_spi_dma_start(drv_data);
|
|
|
} else {
|
|
@@ -940,39 +912,43 @@ static void pump_transfers(unsigned long data)
|
|
|
}
|
|
|
|
|
|
if (is_lpss_ssp(drv_data)) {
|
|
|
- if ((read_SSIRF(reg) & 0xff) != chip->lpss_rx_threshold)
|
|
|
- write_SSIRF(chip->lpss_rx_threshold, reg);
|
|
|
- if ((read_SSITF(reg) & 0xffff) != chip->lpss_tx_threshold)
|
|
|
- write_SSITF(chip->lpss_tx_threshold, reg);
|
|
|
+ if ((pxa2xx_spi_read(drv_data, SSIRF) & 0xff)
|
|
|
+ != chip->lpss_rx_threshold)
|
|
|
+ pxa2xx_spi_write(drv_data, SSIRF,
|
|
|
+ chip->lpss_rx_threshold);
|
|
|
+ if ((pxa2xx_spi_read(drv_data, SSITF) & 0xffff)
|
|
|
+ != chip->lpss_tx_threshold)
|
|
|
+ pxa2xx_spi_write(drv_data, SSITF,
|
|
|
+ chip->lpss_tx_threshold);
|
|
|
}
|
|
|
|
|
|
if (is_quark_x1000_ssp(drv_data) &&
|
|
|
- (read_DDS_RATE(reg) != chip->dds_rate))
|
|
|
- write_DDS_RATE(chip->dds_rate, reg);
|
|
|
+ (pxa2xx_spi_read(drv_data, DDS_RATE) != chip->dds_rate))
|
|
|
+ pxa2xx_spi_write(drv_data, DDS_RATE, chip->dds_rate);
|
|
|
|
|
|
/* see if we need to reload the config registers */
|
|
|
- if ((read_SSCR0(reg) != cr0) ||
|
|
|
- (read_SSCR1(reg) & change_mask) != (cr1 & change_mask)) {
|
|
|
-
|
|
|
+ if ((pxa2xx_spi_read(drv_data, SSCR0) != cr0)
|
|
|
+ || (pxa2xx_spi_read(drv_data, SSCR1) & change_mask)
|
|
|
+ != (cr1 & change_mask)) {
|
|
|
/* stop the SSP, and update the other bits */
|
|
|
- write_SSCR0(cr0 & ~SSCR0_SSE, reg);
|
|
|
+ pxa2xx_spi_write(drv_data, SSCR0, cr0 & ~SSCR0_SSE);
|
|
|
if (!pxa25x_ssp_comp(drv_data))
|
|
|
- write_SSTO(chip->timeout, reg);
|
|
|
+ pxa2xx_spi_write(drv_data, SSTO, chip->timeout);
|
|
|
/* first set CR1 without interrupt and service enables */
|
|
|
- write_SSCR1(cr1 & change_mask, reg);
|
|
|
+ pxa2xx_spi_write(drv_data, SSCR1, cr1 & change_mask);
|
|
|
/* restart the SSP */
|
|
|
- write_SSCR0(cr0, reg);
|
|
|
+ pxa2xx_spi_write(drv_data, SSCR0, cr0);
|
|
|
|
|
|
} else {
|
|
|
if (!pxa25x_ssp_comp(drv_data))
|
|
|
- write_SSTO(chip->timeout, reg);
|
|
|
+ pxa2xx_spi_write(drv_data, SSTO, chip->timeout);
|
|
|
}
|
|
|
|
|
|
cs_assert(drv_data);
|
|
|
|
|
|
/* after chip select, release the data by enabling service
|
|
|
* requests and interrupts, without changing any mode bits */
|
|
|
- write_SSCR1(cr1, reg);
|
|
|
+ pxa2xx_spi_write(drv_data, SSCR1, cr1);
|
|
|
}
|
|
|
|
|
|
static int pxa2xx_spi_transfer_one_message(struct spi_master *master,
|
|
@@ -1001,8 +977,8 @@ static int pxa2xx_spi_unprepare_transfer(struct spi_master *master)
|
|
|
struct driver_data *drv_data = spi_master_get_devdata(master);
|
|
|
|
|
|
/* Disable the SSP now */
|
|
|
- write_SSCR0(read_SSCR0(drv_data->ioaddr) & ~SSCR0_SSE,
|
|
|
- drv_data->ioaddr);
|
|
|
+ pxa2xx_spi_write(drv_data, SSCR0,
|
|
|
+ pxa2xx_spi_read(drv_data, SSCR0) & ~SSCR0_SSE);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -1285,6 +1261,7 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
|
|
|
struct driver_data *drv_data;
|
|
|
struct ssp_device *ssp;
|
|
|
int status;
|
|
|
+ u32 tmp;
|
|
|
|
|
|
platform_info = dev_get_platdata(dev);
|
|
|
if (!platform_info) {
|
|
@@ -1382,38 +1359,35 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
|
|
|
drv_data->max_clk_rate = clk_get_rate(ssp->clk);
|
|
|
|
|
|
/* Load default SSP configuration */
|
|
|
- write_SSCR0(0, drv_data->ioaddr);
|
|
|
+ pxa2xx_spi_write(drv_data, SSCR0, 0);
|
|
|
switch (drv_data->ssp_type) {
|
|
|
case QUARK_X1000_SSP:
|
|
|
- write_SSCR1(QUARK_X1000_SSCR1_RxTresh(
|
|
|
- RX_THRESH_QUARK_X1000_DFLT) |
|
|
|
- QUARK_X1000_SSCR1_TxTresh(
|
|
|
- TX_THRESH_QUARK_X1000_DFLT),
|
|
|
- drv_data->ioaddr);
|
|
|
+ tmp = QUARK_X1000_SSCR1_RxTresh(RX_THRESH_QUARK_X1000_DFLT)
|
|
|
+ | QUARK_X1000_SSCR1_TxTresh(TX_THRESH_QUARK_X1000_DFLT);
|
|
|
+ pxa2xx_spi_write(drv_data, SSCR1, tmp);
|
|
|
|
|
|
/* using the Motorola SPI protocol and use 8 bit frame */
|
|
|
- write_SSCR0(QUARK_X1000_SSCR0_Motorola
|
|
|
- | QUARK_X1000_SSCR0_DataSize(8),
|
|
|
- drv_data->ioaddr);
|
|
|
+ pxa2xx_spi_write(drv_data, SSCR0,
|
|
|
+ QUARK_X1000_SSCR0_Motorola
|
|
|
+ | QUARK_X1000_SSCR0_DataSize(8));
|
|
|
break;
|
|
|
default:
|
|
|
- write_SSCR1(SSCR1_RxTresh(RX_THRESH_DFLT) |
|
|
|
- SSCR1_TxTresh(TX_THRESH_DFLT),
|
|
|
- drv_data->ioaddr);
|
|
|
- write_SSCR0(SSCR0_SCR(2)
|
|
|
- | SSCR0_Motorola
|
|
|
- | SSCR0_DataSize(8),
|
|
|
- drv_data->ioaddr);
|
|
|
+ tmp = SSCR1_RxTresh(RX_THRESH_DFLT) |
|
|
|
+ SSCR1_TxTresh(TX_THRESH_DFLT);
|
|
|
+ pxa2xx_spi_write(drv_data, SSCR1, tmp);
|
|
|
+ tmp = SSCR0_SCR(2) | SSCR0_Motorola | SSCR0_DataSize(8);
|
|
|
+ pxa2xx_spi_write(drv_data, SSCR0, tmp);
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
if (!pxa25x_ssp_comp(drv_data))
|
|
|
- write_SSTO(0, drv_data->ioaddr);
|
|
|
+ pxa2xx_spi_write(drv_data, SSTO, 0);
|
|
|
|
|
|
if (!is_quark_x1000_ssp(drv_data))
|
|
|
- write_SSPSP(0, drv_data->ioaddr);
|
|
|
+ pxa2xx_spi_write(drv_data, SSPSP, 0);
|
|
|
|
|
|
- lpss_ssp_setup(drv_data);
|
|
|
+ if (is_lpss_ssp(drv_data))
|
|
|
+ lpss_ssp_setup(drv_data);
|
|
|
|
|
|
tasklet_init(&drv_data->pump_transfers, pump_transfers,
|
|
|
(unsigned long)drv_data);
|
|
@@ -1456,7 +1430,7 @@ static int pxa2xx_spi_remove(struct platform_device *pdev)
|
|
|
pm_runtime_get_sync(&pdev->dev);
|
|
|
|
|
|
/* Disable the SSP at the peripheral and SOC level */
|
|
|
- write_SSCR0(0, drv_data->ioaddr);
|
|
|
+ pxa2xx_spi_write(drv_data, SSCR0, 0);
|
|
|
clk_disable_unprepare(ssp->clk);
|
|
|
|
|
|
/* Release DMA */
|
|
@@ -1493,7 +1467,7 @@ static int pxa2xx_spi_suspend(struct device *dev)
|
|
|
status = spi_master_suspend(drv_data->master);
|
|
|
if (status != 0)
|
|
|
return status;
|
|
|
- write_SSCR0(0, drv_data->ioaddr);
|
|
|
+ pxa2xx_spi_write(drv_data, SSCR0, 0);
|
|
|
|
|
|
if (!pm_runtime_suspended(dev))
|
|
|
clk_disable_unprepare(ssp->clk);
|
|
@@ -1514,7 +1488,8 @@ static int pxa2xx_spi_resume(struct device *dev)
|
|
|
clk_prepare_enable(ssp->clk);
|
|
|
|
|
|
/* Restore LPSS private register bits */
|
|
|
- lpss_ssp_setup(drv_data);
|
|
|
+ if (is_lpss_ssp(drv_data))
|
|
|
+ lpss_ssp_setup(drv_data);
|
|
|
|
|
|
/* Start the queue running */
|
|
|
status = spi_master_resume(drv_data->master);
|