2018-08-22 06:02:17 +08:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0 */
|
2011-03-23 19:42:44 +08:00
|
|
|
/*
|
2017-05-10 17:25:25 +08:00
|
|
|
* Driver for the MMC / SD / SDIO cell found in:
|
|
|
|
*
|
|
|
|
* TC6393XB TC6391XB TC6387XB T7L66XB ASIC3
|
2011-03-23 19:42:44 +08:00
|
|
|
*
|
2019-03-15 06:54:41 +08:00
|
|
|
* Copyright (C) 2015-19 Renesas Electronics Corporation
|
|
|
|
* Copyright (C) 2016-19 Sang Engineering, Wolfram Sang
|
2017-05-30 20:50:52 +08:00
|
|
|
* Copyright (C) 2016-17 Horms Solutions, Simon Horman
|
2011-03-23 19:42:44 +08:00
|
|
|
* Copyright (C) 2007 Ian Molton
|
|
|
|
* Copyright (C) 2004 Ian Molton
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef TMIO_MMC_H
|
|
|
|
#define TMIO_MMC_H
|
|
|
|
|
2015-01-13 12:59:14 +08:00
|
|
|
#include <linux/dmaengine.h>
|
2011-03-23 19:42:44 +08:00
|
|
|
#include <linux/highmem.h>
|
2011-07-14 18:12:38 +08:00
|
|
|
#include <linux/mutex.h>
|
2011-03-23 19:42:44 +08:00
|
|
|
#include <linux/pagemap.h>
|
2011-07-27 02:50:23 +08:00
|
|
|
#include <linux/scatterlist.h>
|
2012-01-06 20:06:51 +08:00
|
|
|
#include <linux/spinlock.h>
|
2016-12-30 20:47:23 +08:00
|
|
|
#include <linux/interrupt.h>
|
2011-03-23 19:42:44 +08:00
|
|
|
|
2016-04-26 23:55:26 +08:00
|
|
|
#define CTL_SD_CMD 0x00
|
|
|
|
#define CTL_ARG_REG 0x04
|
|
|
|
#define CTL_STOP_INTERNAL_ACTION 0x08
|
|
|
|
#define CTL_XFER_BLK_COUNT 0xa
|
|
|
|
#define CTL_RESPONSE 0x0c
|
2016-04-28 00:51:27 +08:00
|
|
|
/* driver merges STATUS and following STATUS2 */
|
2016-04-26 23:55:26 +08:00
|
|
|
#define CTL_STATUS 0x1c
|
2016-04-28 00:51:27 +08:00
|
|
|
/* driver merges IRQ_MASK and following IRQ_MASK2 */
|
2016-04-26 23:55:26 +08:00
|
|
|
#define CTL_IRQ_MASK 0x20
|
|
|
|
#define CTL_SD_CARD_CLK_CTL 0x24
|
|
|
|
#define CTL_SD_XFER_LEN 0x26
|
|
|
|
#define CTL_SD_MEM_CARD_OPT 0x28
|
|
|
|
#define CTL_SD_ERROR_DETAIL_STATUS 0x2c
|
|
|
|
#define CTL_SD_DATA_PORT 0x30
|
|
|
|
#define CTL_TRANSACTION_CTL 0x34
|
|
|
|
#define CTL_SDIO_STATUS 0x36
|
|
|
|
#define CTL_SDIO_IRQ_MASK 0x38
|
|
|
|
#define CTL_DMA_ENABLE 0xd8
|
|
|
|
#define CTL_RESET_SD 0xe0
|
|
|
|
#define CTL_VERSION 0xe2
|
2018-06-18 20:57:50 +08:00
|
|
|
#define CTL_SDIF_MODE 0xe6
|
2016-04-26 23:55:26 +08:00
|
|
|
|
2017-03-14 18:09:16 +08:00
|
|
|
/* Definitions for values the CTL_STOP_INTERNAL_ACTION register can take */
|
|
|
|
#define TMIO_STOP_STP BIT(0)
|
|
|
|
#define TMIO_STOP_SEC BIT(8)
|
|
|
|
|
2017-03-14 18:09:17 +08:00
|
|
|
/* Definitions for values the CTL_STATUS register can take */
|
2016-04-28 00:51:24 +08:00
|
|
|
#define TMIO_STAT_CMDRESPEND BIT(0)
|
|
|
|
#define TMIO_STAT_DATAEND BIT(2)
|
|
|
|
#define TMIO_STAT_CARD_REMOVE BIT(3)
|
|
|
|
#define TMIO_STAT_CARD_INSERT BIT(4)
|
|
|
|
#define TMIO_STAT_SIGSTATE BIT(5)
|
|
|
|
#define TMIO_STAT_WRPROTECT BIT(7)
|
|
|
|
#define TMIO_STAT_CARD_REMOVE_A BIT(8)
|
|
|
|
#define TMIO_STAT_CARD_INSERT_A BIT(9)
|
|
|
|
#define TMIO_STAT_SIGSTATE_A BIT(10)
|
|
|
|
|
2017-03-14 18:09:17 +08:00
|
|
|
/* These belong technically to CTL_STATUS2, but the driver merges them */
|
2016-04-28 00:51:24 +08:00
|
|
|
#define TMIO_STAT_CMD_IDX_ERR BIT(16)
|
|
|
|
#define TMIO_STAT_CRCFAIL BIT(17)
|
|
|
|
#define TMIO_STAT_STOPBIT_ERR BIT(18)
|
|
|
|
#define TMIO_STAT_DATATIMEOUT BIT(19)
|
|
|
|
#define TMIO_STAT_RXOVERFLOW BIT(20)
|
|
|
|
#define TMIO_STAT_TXUNDERRUN BIT(21)
|
|
|
|
#define TMIO_STAT_CMDTIMEOUT BIT(22)
|
2016-04-28 00:51:25 +08:00
|
|
|
#define TMIO_STAT_DAT0 BIT(23) /* only known on R-Car so far */
|
2016-04-28 00:51:24 +08:00
|
|
|
#define TMIO_STAT_RXRDY BIT(24)
|
|
|
|
#define TMIO_STAT_TXRQ BIT(25)
|
2018-11-19 21:13:57 +08:00
|
|
|
#define TMIO_STAT_ALWAYS_SET_27 BIT(27) /* only known on R-Car 2+ so far */
|
2016-04-28 00:51:26 +08:00
|
|
|
#define TMIO_STAT_ILL_FUNC BIT(29) /* only when !TMIO_MMC_HAS_IDLE_WAIT */
|
|
|
|
#define TMIO_STAT_SCLKDIVEN BIT(29) /* only when TMIO_MMC_HAS_IDLE_WAIT */
|
2016-04-28 00:51:24 +08:00
|
|
|
#define TMIO_STAT_CMD_BUSY BIT(30)
|
|
|
|
#define TMIO_STAT_ILL_ACCESS BIT(31)
|
2016-04-26 23:55:26 +08:00
|
|
|
|
2017-06-30 18:56:47 +08:00
|
|
|
/* Definitions for values the CTL_SD_CARD_CLK_CTL register can take */
|
2016-04-26 23:55:26 +08:00
|
|
|
#define CLK_CTL_DIV_MASK 0xff
|
|
|
|
#define CLK_CTL_SCLKEN BIT(8)
|
|
|
|
|
2017-06-30 18:56:47 +08:00
|
|
|
/* Definitions for values the CTL_SD_MEM_CARD_OPT register can take */
|
2016-09-20 04:57:48 +08:00
|
|
|
#define CARD_OPT_WIDTH8 BIT(13)
|
|
|
|
#define CARD_OPT_WIDTH BIT(15)
|
|
|
|
|
2017-03-14 18:09:17 +08:00
|
|
|
/* Definitions for values the CTL_SDIO_STATUS register can take */
|
2011-03-24 16:48:36 +08:00
|
|
|
#define TMIO_SDIO_STAT_IOIRQ 0x0001
|
2011-03-23 19:42:44 +08:00
|
|
|
#define TMIO_SDIO_STAT_EXPUB52 0x4000
|
2011-03-24 16:48:36 +08:00
|
|
|
#define TMIO_SDIO_STAT_EXWT 0x8000
|
|
|
|
#define TMIO_SDIO_MASK_ALL 0xc007
|
2011-03-23 19:42:44 +08:00
|
|
|
|
2017-01-20 04:07:18 +08:00
|
|
|
#define TMIO_SDIO_SETBITS_MASK 0x0006
|
|
|
|
|
2017-06-30 18:56:48 +08:00
|
|
|
/* Definitions for values the CTL_DMA_ENABLE register can take */
|
|
|
|
#define DMA_ENABLE_DMASDRW BIT(1)
|
|
|
|
|
2011-03-23 19:42:44 +08:00
|
|
|
/* Define some IRQ masks */
|
|
|
|
/* This is the mask used at reset by the chip */
|
2018-11-27 01:02:47 +08:00
|
|
|
#define TMIO_MASK_INIT_RCAR2 0x8b7f031d /* Initial value for R-Car Gen2+ */
|
2011-03-23 19:42:44 +08:00
|
|
|
#define TMIO_MASK_ALL 0x837f031d
|
|
|
|
#define TMIO_MASK_READOP (TMIO_STAT_RXRDY | TMIO_STAT_DATAEND)
|
|
|
|
#define TMIO_MASK_WRITEOP (TMIO_STAT_TXRQ | TMIO_STAT_DATAEND)
|
|
|
|
#define TMIO_MASK_CMD (TMIO_STAT_CMDRESPEND | TMIO_STAT_CMDTIMEOUT | \
|
|
|
|
TMIO_STAT_CARD_REMOVE | TMIO_STAT_CARD_INSERT)
|
|
|
|
#define TMIO_MASK_IRQ (TMIO_MASK_READOP | TMIO_MASK_WRITEOP | TMIO_MASK_CMD)
|
|
|
|
|
2019-03-15 06:31:29 +08:00
|
|
|
#define TMIO_MAX_BLK_SIZE 512
|
|
|
|
|
2011-03-23 19:42:44 +08:00
|
|
|
struct tmio_mmc_data;
|
2015-01-13 12:59:05 +08:00
|
|
|
struct tmio_mmc_host;
|
2011-03-23 19:42:44 +08:00
|
|
|
|
2017-05-10 17:25:26 +08:00
|
|
|
struct tmio_mmc_dma_ops {
|
|
|
|
void (*start)(struct tmio_mmc_host *host, struct mmc_data *data);
|
|
|
|
void (*enable)(struct tmio_mmc_host *host, bool enable);
|
|
|
|
void (*request)(struct tmio_mmc_host *host,
|
|
|
|
struct tmio_mmc_data *pdata);
|
|
|
|
void (*release)(struct tmio_mmc_host *host);
|
|
|
|
void (*abort)(struct tmio_mmc_host *host);
|
2017-06-21 22:00:28 +08:00
|
|
|
void (*dataend)(struct tmio_mmc_host *host);
|
2017-05-10 17:25:26 +08:00
|
|
|
};
|
|
|
|
|
2011-03-23 19:42:44 +08:00
|
|
|
struct tmio_mmc_host {
|
|
|
|
void __iomem *ctl;
|
|
|
|
struct mmc_command *cmd;
|
|
|
|
struct mmc_request *mrq;
|
|
|
|
struct mmc_data *data;
|
|
|
|
struct mmc_host *mmc;
|
2017-11-25 00:24:41 +08:00
|
|
|
struct mmc_host_ops ops;
|
2011-03-23 19:42:44 +08:00
|
|
|
|
|
|
|
/* Callbacks for clock / power control */
|
|
|
|
void (*set_pwr)(struct platform_device *host, int state);
|
|
|
|
|
|
|
|
/* pio related stuff */
|
|
|
|
struct scatterlist *sg_ptr;
|
|
|
|
struct scatterlist *sg_orig;
|
|
|
|
unsigned int sg_len;
|
|
|
|
unsigned int sg_off;
|
2017-11-25 00:24:50 +08:00
|
|
|
unsigned int bus_shift;
|
2011-03-23 19:42:44 +08:00
|
|
|
|
|
|
|
struct platform_device *pdev;
|
|
|
|
struct tmio_mmc_data *pdata;
|
|
|
|
|
|
|
|
/* DMA support */
|
2018-10-12 23:03:08 +08:00
|
|
|
bool dma_on;
|
2011-03-23 19:42:44 +08:00
|
|
|
struct dma_chan *chan_rx;
|
|
|
|
struct dma_chan *chan_tx;
|
|
|
|
struct tasklet_struct dma_issue;
|
|
|
|
struct scatterlist bounce_sg;
|
|
|
|
u8 *bounce_buf;
|
|
|
|
|
|
|
|
/* Track lost interrupts */
|
|
|
|
struct delayed_work delayed_reset_work;
|
2011-07-14 18:12:38 +08:00
|
|
|
struct work_struct done;
|
|
|
|
|
2013-10-30 07:16:17 +08:00
|
|
|
/* Cache */
|
2011-08-25 09:27:25 +08:00
|
|
|
u32 sdcard_irq_mask;
|
|
|
|
u32 sdio_irq_mask;
|
2013-10-30 07:16:17 +08:00
|
|
|
unsigned int clk_cache;
|
2018-11-19 21:13:57 +08:00
|
|
|
u32 sdcard_irq_setbit_mask;
|
2011-08-25 09:27:25 +08:00
|
|
|
|
2011-07-14 18:12:38 +08:00
|
|
|
spinlock_t lock; /* protect host private data */
|
2011-03-23 19:42:44 +08:00
|
|
|
unsigned long last_req_ts;
|
2011-07-14 18:12:38 +08:00
|
|
|
struct mutex ios_lock; /* protect set_ios() context */
|
2012-02-10 05:57:08 +08:00
|
|
|
bool native_hotplug;
|
mmc: tmio: Fixup runtime PM management during probe
The tmio_mmc_host_probe() calls pm_runtime_set_active() to update the
runtime PM status of the device, as to make it reflect the current status
of the HW. This works fine for most cases, but unfortunate not for all.
Especially, there is a generic problem when the device has a genpd attached
and that genpd have the ->start|stop() callbacks assigned.
More precisely, if the driver calls pm_runtime_set_active() during
->probe(), genpd does not get to invoke the ->start() callback for it,
which means the HW isn't really fully powered on. Furthermore, in the next
phase, when the device becomes runtime suspended, genpd will invoke the
->stop() callback for it, potentially leading to usage count imbalance
problems, depending on what's implemented behind the callbacks of course.
To fix this problem, convert to call pm_runtime_get_sync() from
tmio_mmc_host_probe() rather than pm_runtime_set_active(). Additionally, to
avoid bumping usage counters and unnecessary re-initializing the HW the
first time the tmio driver's ->runtime_resume() callback is called,
introduce a state flag to keeping track of this.
Cc: stable@vger.kernel.org
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Geert Uytterhoeven <geert@linux-m68k.org>
2019-09-13 17:19:26 +08:00
|
|
|
bool runtime_synced;
|
2013-10-24 21:58:45 +08:00
|
|
|
bool sdio_irq_enabled;
|
2015-01-13 12:57:42 +08:00
|
|
|
|
2016-11-03 22:16:01 +08:00
|
|
|
/* Mandatory callback */
|
2016-04-01 23:44:31 +08:00
|
|
|
int (*clk_enable)(struct tmio_mmc_host *host);
|
2018-08-23 12:44:16 +08:00
|
|
|
void (*set_clock)(struct tmio_mmc_host *host, unsigned int clock);
|
2016-11-03 22:16:01 +08:00
|
|
|
|
|
|
|
/* Optional callbacks */
|
2016-04-01 23:44:31 +08:00
|
|
|
void (*clk_disable)(struct tmio_mmc_host *host);
|
2015-01-13 12:58:10 +08:00
|
|
|
int (*multi_io_quirk)(struct mmc_card *card,
|
|
|
|
unsigned int direction, int blk_size);
|
2016-11-03 22:16:01 +08:00
|
|
|
int (*write16_hook)(struct tmio_mmc_host *host, int addr);
|
2018-10-10 11:51:31 +08:00
|
|
|
void (*reset)(struct tmio_mmc_host *host);
|
2016-11-03 22:16:02 +08:00
|
|
|
void (*hw_reset)(struct tmio_mmc_host *host);
|
2016-11-03 22:16:03 +08:00
|
|
|
void (*prepare_tuning)(struct tmio_mmc_host *host, unsigned long tap);
|
|
|
|
bool (*check_scc_error)(struct tmio_mmc_host *host);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Mandatory callback for tuning to occur which is optional for SDR50
|
|
|
|
* and mandatory for SDR104.
|
|
|
|
*/
|
|
|
|
unsigned int (*init_tuning)(struct tmio_mmc_host *host);
|
|
|
|
int (*select_tuning)(struct tmio_mmc_host *host);
|
|
|
|
|
|
|
|
/* Tuning values: 1 for success, 0 for failure */
|
|
|
|
DECLARE_BITMAP(taps, BITS_PER_BYTE * sizeof(long));
|
|
|
|
unsigned int tap_num;
|
2018-06-18 20:57:50 +08:00
|
|
|
unsigned long tap_set;
|
|
|
|
|
|
|
|
void (*prepare_hs400_tuning)(struct tmio_mmc_host *host);
|
|
|
|
void (*hs400_downgrade)(struct tmio_mmc_host *host);
|
|
|
|
void (*hs400_complete)(struct tmio_mmc_host *host);
|
2017-05-10 17:25:26 +08:00
|
|
|
|
|
|
|
const struct tmio_mmc_dma_ops *dma_ops;
|
2011-03-23 19:42:44 +08:00
|
|
|
};
|
|
|
|
|
2018-01-18 00:28:02 +08:00
|
|
|
struct tmio_mmc_host *tmio_mmc_host_alloc(struct platform_device *pdev,
|
|
|
|
struct tmio_mmc_data *pdata);
|
2015-01-13 12:57:22 +08:00
|
|
|
void tmio_mmc_host_free(struct tmio_mmc_host *host);
|
2018-01-18 00:28:04 +08:00
|
|
|
int tmio_mmc_host_probe(struct tmio_mmc_host *host);
|
2011-03-23 19:42:44 +08:00
|
|
|
void tmio_mmc_host_remove(struct tmio_mmc_host *host);
|
|
|
|
void tmio_mmc_do_data_irq(struct tmio_mmc_host *host);
|
|
|
|
|
|
|
|
void tmio_mmc_enable_mmc_irqs(struct tmio_mmc_host *host, u32 i);
|
|
|
|
void tmio_mmc_disable_mmc_irqs(struct tmio_mmc_host *host, u32 i);
|
2011-05-06 19:02:33 +08:00
|
|
|
irqreturn_t tmio_mmc_irq(int irq, void *devid);
|
2011-03-23 19:42:44 +08:00
|
|
|
|
|
|
|
static inline char *tmio_mmc_kmap_atomic(struct scatterlist *sg,
|
|
|
|
unsigned long *flags)
|
|
|
|
{
|
|
|
|
local_irq_save(*flags);
|
2011-11-27 13:27:00 +08:00
|
|
|
return kmap_atomic(sg_page(sg)) + sg->offset;
|
2011-03-23 19:42:44 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static inline void tmio_mmc_kunmap_atomic(struct scatterlist *sg,
|
|
|
|
unsigned long *flags, void *virt)
|
|
|
|
{
|
2011-11-27 13:27:00 +08:00
|
|
|
kunmap_atomic(virt - sg->offset);
|
2011-03-23 19:42:44 +08:00
|
|
|
local_irq_restore(*flags);
|
|
|
|
}
|
|
|
|
|
2014-08-25 18:03:20 +08:00
|
|
|
#ifdef CONFIG_PM
|
2011-05-12 00:51:11 +08:00
|
|
|
int tmio_mmc_host_runtime_suspend(struct device *dev);
|
|
|
|
int tmio_mmc_host_runtime_resume(struct device *dev);
|
2013-10-23 20:55:07 +08:00
|
|
|
#endif
|
2011-05-12 00:51:11 +08:00
|
|
|
|
2011-06-21 07:00:09 +08:00
|
|
|
static inline u16 sd_ctrl_read16(struct tmio_mmc_host *host, int addr)
|
|
|
|
{
|
2017-12-19 21:34:03 +08:00
|
|
|
return ioread16(host->ctl + (addr << host->bus_shift));
|
2011-06-21 07:00:09 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static inline void sd_ctrl_read16_rep(struct tmio_mmc_host *host, int addr,
|
2017-06-17 00:11:03 +08:00
|
|
|
u16 *buf, int count)
|
2011-06-21 07:00:09 +08:00
|
|
|
{
|
2017-12-18 08:00:21 +08:00
|
|
|
ioread16_rep(host->ctl + (addr << host->bus_shift), buf, count);
|
2011-06-21 07:00:09 +08:00
|
|
|
}
|
|
|
|
|
2017-06-17 00:11:03 +08:00
|
|
|
static inline u32 sd_ctrl_read16_and_16_as_32(struct tmio_mmc_host *host,
|
|
|
|
int addr)
|
2011-06-21 07:00:09 +08:00
|
|
|
{
|
2017-12-19 21:34:03 +08:00
|
|
|
return ioread16(host->ctl + (addr << host->bus_shift)) |
|
|
|
|
ioread16(host->ctl + ((addr + 2) << host->bus_shift)) << 16;
|
2011-06-21 07:00:09 +08:00
|
|
|
}
|
|
|
|
|
2016-09-12 22:15:06 +08:00
|
|
|
static inline void sd_ctrl_read32_rep(struct tmio_mmc_host *host, int addr,
|
2017-06-17 00:11:03 +08:00
|
|
|
u32 *buf, int count)
|
2016-09-12 22:15:06 +08:00
|
|
|
{
|
2017-12-18 08:00:21 +08:00
|
|
|
ioread32_rep(host->ctl + (addr << host->bus_shift), buf, count);
|
2016-09-12 22:15:06 +08:00
|
|
|
}
|
|
|
|
|
2017-06-17 00:11:03 +08:00
|
|
|
static inline void sd_ctrl_write16(struct tmio_mmc_host *host, int addr,
|
|
|
|
u16 val)
|
2011-06-21 07:00:09 +08:00
|
|
|
{
|
2011-06-21 07:00:10 +08:00
|
|
|
/* If there is a hook and it returns non-zero then there
|
|
|
|
* is an error and the write should be skipped
|
|
|
|
*/
|
2015-01-13 12:57:42 +08:00
|
|
|
if (host->write16_hook && host->write16_hook(host, addr))
|
2011-06-21 07:00:10 +08:00
|
|
|
return;
|
2017-12-19 21:34:03 +08:00
|
|
|
iowrite16(val, host->ctl + (addr << host->bus_shift));
|
2011-06-21 07:00:09 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static inline void sd_ctrl_write16_rep(struct tmio_mmc_host *host, int addr,
|
2017-06-17 00:11:03 +08:00
|
|
|
u16 *buf, int count)
|
2011-06-21 07:00:09 +08:00
|
|
|
{
|
2017-12-18 08:00:21 +08:00
|
|
|
iowrite16_rep(host->ctl + (addr << host->bus_shift), buf, count);
|
2011-06-21 07:00:09 +08:00
|
|
|
}
|
|
|
|
|
2017-06-17 00:11:03 +08:00
|
|
|
static inline void sd_ctrl_write32_as_16_and_16(struct tmio_mmc_host *host,
|
|
|
|
int addr, u32 val)
|
2011-06-21 07:00:09 +08:00
|
|
|
{
|
2018-11-19 21:13:57 +08:00
|
|
|
if (addr == CTL_IRQ_MASK || addr == CTL_STATUS)
|
|
|
|
val |= host->sdcard_irq_setbit_mask;
|
|
|
|
|
2017-12-19 21:34:03 +08:00
|
|
|
iowrite16(val & 0xffff, host->ctl + (addr << host->bus_shift));
|
|
|
|
iowrite16(val >> 16, host->ctl + ((addr + 2) << host->bus_shift));
|
2011-06-21 07:00:09 +08:00
|
|
|
}
|
|
|
|
|
mmc: tmio: fix access width of Block Count Register
In R-Car Gen2 or later, the maximum number of transfer blocks are
changed from 0xFFFF to 0xFFFFFFFF. Therefore, Block Count Register
should use iowrite32().
If another system (U-boot, Hypervisor OS, etc) uses bit[31:16], this
value will not be cleared. So, SD/MMC card initialization fails.
So, check for the bigger register and use apropriate write. Also, mark
the register as extended on Gen2.
Signed-off-by: Takeshi Saito <takeshi.saito.xv@renesas.com>
[wsa: use max_blk_count in if(), add Gen2, update commit message]
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Cc: stable@kernel.org
Reviewed-by: Simon Horman <horms+renesas@verge.net.au>
[Ulf: Fixed build error]
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
2019-02-22 03:38:05 +08:00
|
|
|
static inline void sd_ctrl_write32(struct tmio_mmc_host *host, int addr, u32 val)
|
|
|
|
{
|
|
|
|
iowrite32(val, host->ctl + (addr << host->bus_shift));
|
|
|
|
}
|
|
|
|
|
2016-09-12 22:15:06 +08:00
|
|
|
static inline void sd_ctrl_write32_rep(struct tmio_mmc_host *host, int addr,
|
2017-06-17 00:11:03 +08:00
|
|
|
const u32 *buf, int count)
|
2016-09-12 22:15:06 +08:00
|
|
|
{
|
2017-12-18 08:00:21 +08:00
|
|
|
iowrite32_rep(host->ctl + (addr << host->bus_shift), buf, count);
|
2016-09-12 22:15:06 +08:00
|
|
|
}
|
|
|
|
|
2011-03-23 19:42:44 +08:00
|
|
|
#endif
|