|
@@ -41,23 +41,35 @@ static unsigned int fmax = 515633;
|
|
|
* @clkreg: default value for MCICLOCK register
|
|
|
* @clkreg_enable: enable value for MMCICLOCK register
|
|
|
* @datalength_bits: number of bits in the MMCIDATALENGTH register
|
|
|
+ * @fifosize: number of bytes that can be written when MMCI_TXFIFOEMPTY
|
|
|
+ * is asserted (likewise for RX)
|
|
|
+ * @fifohalfsize: number of bytes that can be written when MCI_TXFIFOHALFEMPTY
|
|
|
+ * is asserted (likewise for RX)
|
|
|
*/
|
|
|
struct variant_data {
|
|
|
unsigned int clkreg;
|
|
|
unsigned int clkreg_enable;
|
|
|
unsigned int datalength_bits;
|
|
|
+ unsigned int fifosize;
|
|
|
+ unsigned int fifohalfsize;
|
|
|
};
|
|
|
|
|
|
static struct variant_data variant_arm = {
|
|
|
+ .fifosize = 16 * 4,
|
|
|
+ .fifohalfsize = 8 * 4,
|
|
|
.datalength_bits = 16,
|
|
|
};
|
|
|
|
|
|
static struct variant_data variant_u300 = {
|
|
|
+ .fifosize = 16 * 4,
|
|
|
+ .fifohalfsize = 8 * 4,
|
|
|
.clkreg_enable = 1 << 13, /* HWFCEN */
|
|
|
.datalength_bits = 16,
|
|
|
};
|
|
|
|
|
|
static struct variant_data variant_ux500 = {
|
|
|
+ .fifosize = 30 * 4,
|
|
|
+ .fifohalfsize = 8 * 4,
|
|
|
.clkreg = MCI_CLK_ENABLE,
|
|
|
.clkreg_enable = 1 << 14, /* HWFCEN */
|
|
|
.datalength_bits = 24,
|
|
@@ -138,6 +150,7 @@ static void mmci_init_sg(struct mmci_host *host, struct mmc_data *data)
|
|
|
|
|
|
static void mmci_start_data(struct mmci_host *host, struct mmc_data *data)
|
|
|
{
|
|
|
+ struct variant_data *variant = host->variant;
|
|
|
unsigned int datactrl, timeout, irqmask;
|
|
|
unsigned long long clks;
|
|
|
void __iomem *base;
|
|
@@ -173,7 +186,7 @@ static void mmci_start_data(struct mmci_host *host, struct mmc_data *data)
|
|
|
* If we have less than a FIFOSIZE of bytes to transfer,
|
|
|
* trigger a PIO interrupt as soon as any data is available.
|
|
|
*/
|
|
|
- if (host->size < MCI_FIFOSIZE)
|
|
|
+ if (host->size < variant->fifosize)
|
|
|
irqmask |= MCI_RXDATAAVLBLMASK;
|
|
|
} else {
|
|
|
/*
|
|
@@ -332,13 +345,15 @@ static int mmci_pio_read(struct mmci_host *host, char *buffer, unsigned int rema
|
|
|
|
|
|
static int mmci_pio_write(struct mmci_host *host, char *buffer, unsigned int remain, u32 status)
|
|
|
{
|
|
|
+ struct variant_data *variant = host->variant;
|
|
|
void __iomem *base = host->base;
|
|
|
char *ptr = buffer;
|
|
|
|
|
|
do {
|
|
|
unsigned int count, maxcnt;
|
|
|
|
|
|
- maxcnt = status & MCI_TXFIFOEMPTY ? MCI_FIFOSIZE : MCI_FIFOHALFSIZE;
|
|
|
+ maxcnt = status & MCI_TXFIFOEMPTY ?
|
|
|
+ variant->fifosize : variant->fifohalfsize;
|
|
|
count = min(remain, maxcnt);
|
|
|
|
|
|
writesl(base + MMCIFIFO, ptr, count >> 2);
|
|
@@ -362,6 +377,7 @@ static irqreturn_t mmci_pio_irq(int irq, void *dev_id)
|
|
|
{
|
|
|
struct mmci_host *host = dev_id;
|
|
|
struct sg_mapping_iter *sg_miter = &host->sg_miter;
|
|
|
+ struct variant_data *variant = host->variant;
|
|
|
void __iomem *base = host->base;
|
|
|
unsigned long flags;
|
|
|
u32 status;
|
|
@@ -420,7 +436,7 @@ static irqreturn_t mmci_pio_irq(int irq, void *dev_id)
|
|
|
* If we're nearing the end of the read, switch to
|
|
|
* "any data available" mode.
|
|
|
*/
|
|
|
- if (status & MCI_RXACTIVE && host->size < MCI_FIFOSIZE)
|
|
|
+ if (status & MCI_RXACTIVE && host->size < variant->fifosize)
|
|
|
writel(MCI_RXDATAAVLBLMASK, base + MMCIMASK1);
|
|
|
|
|
|
/*
|