spi/bfin_spi: convert read/write/duplex funcs to a dedicated ops structure
Rather than having to look up the same 3 sets of functions at the same time, just use an ops structure so we only need to set one pointer. Reported-by: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Mike Frysinger <vapier@gentoo.org>
This commit is contained in:
parent
f4f50c3ff7
commit
9c4542c7a3
1 changed files with 32 additions and 26 deletions
|
@ -42,6 +42,14 @@ MODULE_LICENSE("GPL");
|
||||||
#define DONE_STATE ((void *)2)
|
#define DONE_STATE ((void *)2)
|
||||||
#define ERROR_STATE ((void *)-1)
|
#define ERROR_STATE ((void *)-1)
|
||||||
|
|
||||||
|
struct driver_data;
|
||||||
|
|
||||||
|
struct transfer_ops {
|
||||||
|
void (*write) (struct driver_data *);
|
||||||
|
void (*read) (struct driver_data *);
|
||||||
|
void (*duplex) (struct driver_data *);
|
||||||
|
};
|
||||||
|
|
||||||
struct driver_data {
|
struct driver_data {
|
||||||
/* Driver model hookup */
|
/* Driver model hookup */
|
||||||
struct platform_device *pdev;
|
struct platform_device *pdev;
|
||||||
|
@ -94,9 +102,7 @@ struct driver_data {
|
||||||
size_t tx_map_len;
|
size_t tx_map_len;
|
||||||
u8 n_bytes;
|
u8 n_bytes;
|
||||||
int cs_change;
|
int cs_change;
|
||||||
void (*write) (struct driver_data *);
|
const struct transfer_ops *ops;
|
||||||
void (*read) (struct driver_data *);
|
|
||||||
void (*duplex) (struct driver_data *);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct chip_data {
|
struct chip_data {
|
||||||
|
@ -113,9 +119,7 @@ struct chip_data {
|
||||||
u32 cs_gpio;
|
u32 cs_gpio;
|
||||||
u16 idle_tx_val;
|
u16 idle_tx_val;
|
||||||
u8 pio_interrupt; /* use spi data irq */
|
u8 pio_interrupt; /* use spi data irq */
|
||||||
void (*write) (struct driver_data *);
|
const struct transfer_ops *ops;
|
||||||
void (*read) (struct driver_data *);
|
|
||||||
void (*duplex) (struct driver_data *);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DEFINE_SPI_REG(reg, off) \
|
#define DEFINE_SPI_REG(reg, off) \
|
||||||
|
@ -294,6 +298,12 @@ static void bfin_spi_u8_duplex(struct driver_data *drv_data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct transfer_ops bfin_transfer_ops_u8 = {
|
||||||
|
.write = bfin_spi_u8_writer,
|
||||||
|
.read = bfin_spi_u8_reader,
|
||||||
|
.duplex = bfin_spi_u8_duplex,
|
||||||
|
};
|
||||||
|
|
||||||
static void bfin_spi_u16_writer(struct driver_data *drv_data)
|
static void bfin_spi_u16_writer(struct driver_data *drv_data)
|
||||||
{
|
{
|
||||||
/* clear RXS (we check for RXS inside the loop) */
|
/* clear RXS (we check for RXS inside the loop) */
|
||||||
|
@ -342,6 +352,12 @@ static void bfin_spi_u16_duplex(struct driver_data *drv_data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct transfer_ops bfin_transfer_ops_u16 = {
|
||||||
|
.write = bfin_spi_u16_writer,
|
||||||
|
.read = bfin_spi_u16_reader,
|
||||||
|
.duplex = bfin_spi_u16_duplex,
|
||||||
|
};
|
||||||
|
|
||||||
/* test if ther is more transfer to be done */
|
/* test if ther is more transfer to be done */
|
||||||
static void *bfin_spi_next_transfer(struct driver_data *drv_data)
|
static void *bfin_spi_next_transfer(struct driver_data *drv_data)
|
||||||
{
|
{
|
||||||
|
@ -620,17 +636,13 @@ static void bfin_spi_pump_transfers(unsigned long data)
|
||||||
case 8:
|
case 8:
|
||||||
drv_data->n_bytes = 1;
|
drv_data->n_bytes = 1;
|
||||||
width = CFG_SPI_WORDSIZE8;
|
width = CFG_SPI_WORDSIZE8;
|
||||||
drv_data->read = bfin_spi_u8_reader;
|
drv_data->ops = &bfin_transfer_ops_u8;
|
||||||
drv_data->write = bfin_spi_u8_writer;
|
|
||||||
drv_data->duplex = bfin_spi_u8_duplex;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 16:
|
case 16:
|
||||||
drv_data->n_bytes = 2;
|
drv_data->n_bytes = 2;
|
||||||
width = CFG_SPI_WORDSIZE16;
|
width = CFG_SPI_WORDSIZE16;
|
||||||
drv_data->read = bfin_spi_u16_reader;
|
drv_data->ops = &bfin_transfer_ops_u16;
|
||||||
drv_data->write = bfin_spi_u16_writer;
|
|
||||||
drv_data->duplex = bfin_spi_u16_duplex;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -638,9 +650,7 @@ static void bfin_spi_pump_transfers(unsigned long data)
|
||||||
transfer->bits_per_word = chip->bits_per_word;
|
transfer->bits_per_word = chip->bits_per_word;
|
||||||
drv_data->n_bytes = chip->n_bytes;
|
drv_data->n_bytes = chip->n_bytes;
|
||||||
width = chip->width;
|
width = chip->width;
|
||||||
drv_data->write = chip->write;
|
drv_data->ops = chip->ops;
|
||||||
drv_data->read = chip->read;
|
|
||||||
drv_data->duplex = chip->duplex;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
cr = (read_CTRL(drv_data) & (~BIT_CTL_TIMOD));
|
cr = (read_CTRL(drv_data) & (~BIT_CTL_TIMOD));
|
||||||
|
@ -653,8 +663,8 @@ static void bfin_spi_pump_transfers(unsigned long data)
|
||||||
drv_data->len = transfer->len;
|
drv_data->len = transfer->len;
|
||||||
}
|
}
|
||||||
dev_dbg(&drv_data->pdev->dev,
|
dev_dbg(&drv_data->pdev->dev,
|
||||||
"transfer: drv_data->write is %p, chip->write is %p\n",
|
"transfer: drv_data->ops is %p, chip->ops is %p, u8_ops is %p\n",
|
||||||
drv_data->write, chip->write);
|
drv_data->ops, chip->ops, &bfin_transfer_ops_u8);
|
||||||
|
|
||||||
message->state = RUNNING_STATE;
|
message->state = RUNNING_STATE;
|
||||||
dma_config = 0;
|
dma_config = 0;
|
||||||
|
@ -819,7 +829,7 @@ static void bfin_spi_pump_transfers(unsigned long data)
|
||||||
dev_dbg(&drv_data->pdev->dev,
|
dev_dbg(&drv_data->pdev->dev,
|
||||||
"IO duplex: cr is 0x%x\n", cr);
|
"IO duplex: cr is 0x%x\n", cr);
|
||||||
|
|
||||||
drv_data->duplex(drv_data);
|
drv_data->ops->duplex(drv_data);
|
||||||
|
|
||||||
if (drv_data->tx != drv_data->tx_end)
|
if (drv_data->tx != drv_data->tx_end)
|
||||||
tranf_success = 0;
|
tranf_success = 0;
|
||||||
|
@ -828,7 +838,7 @@ static void bfin_spi_pump_transfers(unsigned long data)
|
||||||
dev_dbg(&drv_data->pdev->dev,
|
dev_dbg(&drv_data->pdev->dev,
|
||||||
"IO write: cr is 0x%x\n", cr);
|
"IO write: cr is 0x%x\n", cr);
|
||||||
|
|
||||||
drv_data->write(drv_data);
|
drv_data->ops->write(drv_data);
|
||||||
|
|
||||||
if (drv_data->tx != drv_data->tx_end)
|
if (drv_data->tx != drv_data->tx_end)
|
||||||
tranf_success = 0;
|
tranf_success = 0;
|
||||||
|
@ -837,7 +847,7 @@ static void bfin_spi_pump_transfers(unsigned long data)
|
||||||
dev_dbg(&drv_data->pdev->dev,
|
dev_dbg(&drv_data->pdev->dev,
|
||||||
"IO read: cr is 0x%x\n", cr);
|
"IO read: cr is 0x%x\n", cr);
|
||||||
|
|
||||||
drv_data->read(drv_data);
|
drv_data->ops->read(drv_data);
|
||||||
if (drv_data->rx != drv_data->rx_end)
|
if (drv_data->rx != drv_data->rx_end)
|
||||||
tranf_success = 0;
|
tranf_success = 0;
|
||||||
}
|
}
|
||||||
|
@ -1032,17 +1042,13 @@ static int bfin_spi_setup(struct spi_device *spi)
|
||||||
case 8:
|
case 8:
|
||||||
chip->n_bytes = 1;
|
chip->n_bytes = 1;
|
||||||
chip->width = CFG_SPI_WORDSIZE8;
|
chip->width = CFG_SPI_WORDSIZE8;
|
||||||
chip->read = bfin_spi_u8_reader;
|
chip->ops = &bfin_transfer_ops_u8;
|
||||||
chip->write = bfin_spi_u8_writer;
|
|
||||||
chip->duplex = bfin_spi_u8_duplex;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 16:
|
case 16:
|
||||||
chip->n_bytes = 2;
|
chip->n_bytes = 2;
|
||||||
chip->width = CFG_SPI_WORDSIZE16;
|
chip->width = CFG_SPI_WORDSIZE16;
|
||||||
chip->read = bfin_spi_u16_reader;
|
chip->ops = &bfin_transfer_ops_u16;
|
||||||
chip->write = bfin_spi_u16_writer;
|
|
||||||
chip->duplex = bfin_spi_u16_duplex;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Add table
Reference in a new issue