cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

alcor.c (29650B)


      1// SPDX-License-Identifier: GPL-2.0+
      2/*
      3 * Copyright (C) 2018 Oleksij Rempel <linux@rempel-privat.de>
      4 *
      5 * Driver for Alcor Micro AU6601 and AU6621 controllers
      6 */
      7
      8/* Note: this driver was created without any documentation. Based
      9 * on sniffing, testing and in some cases mimic of original driver.
     10 * As soon as some one with documentation or more experience in SD/MMC, or
     11 * reverse engineering then me, please review this driver and question every
     12 * thing what I did. 2018 Oleksij Rempel <linux@rempel-privat.de>
     13 */
     14
     15#include <linux/delay.h>
     16#include <linux/pci.h>
     17#include <linux/module.h>
     18#include <linux/io.h>
     19#include <linux/pm.h>
     20#include <linux/irq.h>
     21#include <linux/interrupt.h>
     22#include <linux/platform_device.h>
     23
     24#include <linux/mmc/host.h>
     25#include <linux/mmc/mmc.h>
     26
     27#include <linux/alcor_pci.h>
     28
     29enum alcor_cookie {
     30	COOKIE_UNMAPPED,
     31	COOKIE_PRE_MAPPED,
     32	COOKIE_MAPPED,
     33};
     34
     35struct alcor_pll_conf {
     36	unsigned int clk_src_freq;
     37	unsigned int clk_src_reg;
     38	unsigned int min_div;
     39	unsigned int max_div;
     40};
     41
     42struct alcor_sdmmc_host {
     43	struct  device *dev;
     44	struct alcor_pci_priv *alcor_pci;
     45
     46	struct mmc_request *mrq;
     47	struct mmc_command *cmd;
     48	struct mmc_data *data;
     49	unsigned int dma_on:1;
     50
     51	struct mutex cmd_mutex;
     52
     53	struct delayed_work timeout_work;
     54
     55	struct sg_mapping_iter sg_miter;	/* SG state for PIO */
     56	struct scatterlist *sg;
     57	unsigned int blocks;		/* remaining PIO blocks */
     58	int sg_count;
     59
     60	u32			irq_status_sd;
     61	unsigned char		cur_power_mode;
     62};
     63
     64static const struct alcor_pll_conf alcor_pll_cfg[] = {
     65	/* MHZ,		CLK src,		max div, min div */
     66	{ 31250000,	AU6601_CLK_31_25_MHZ,	1,	511},
     67	{ 48000000,	AU6601_CLK_48_MHZ,	1,	511},
     68	{125000000,	AU6601_CLK_125_MHZ,	1,	511},
     69	{384000000,	AU6601_CLK_384_MHZ,	1,	511},
     70};
     71
     72static inline void alcor_rmw8(struct alcor_sdmmc_host *host, unsigned int addr,
     73			       u8 clear, u8 set)
     74{
     75	struct alcor_pci_priv *priv = host->alcor_pci;
     76	u32 var;
     77
     78	var = alcor_read8(priv, addr);
     79	var &= ~clear;
     80	var |= set;
     81	alcor_write8(priv, var, addr);
     82}
     83
     84/* As soon as irqs are masked, some status updates may be missed.
     85 * Use this with care.
     86 */
     87static inline void alcor_mask_sd_irqs(struct alcor_sdmmc_host *host)
     88{
     89	struct alcor_pci_priv *priv = host->alcor_pci;
     90
     91	alcor_write32(priv, 0, AU6601_REG_INT_ENABLE);
     92}
     93
     94static inline void alcor_unmask_sd_irqs(struct alcor_sdmmc_host *host)
     95{
     96	struct alcor_pci_priv *priv = host->alcor_pci;
     97
     98	alcor_write32(priv, AU6601_INT_CMD_MASK | AU6601_INT_DATA_MASK |
     99		  AU6601_INT_CARD_INSERT | AU6601_INT_CARD_REMOVE |
    100		  AU6601_INT_OVER_CURRENT_ERR,
    101		  AU6601_REG_INT_ENABLE);
    102}
    103
    104static void alcor_reset(struct alcor_sdmmc_host *host, u8 val)
    105{
    106	struct alcor_pci_priv *priv = host->alcor_pci;
    107	int i;
    108
    109	alcor_write8(priv, val | AU6601_BUF_CTRL_RESET,
    110		      AU6601_REG_SW_RESET);
    111	for (i = 0; i < 100; i++) {
    112		if (!(alcor_read8(priv, AU6601_REG_SW_RESET) & val))
    113			return;
    114		udelay(50);
    115	}
    116	dev_err(host->dev, "%s: timeout\n", __func__);
    117}
    118
    119/*
    120 * Perform DMA I/O of a single page.
    121 */
    122static void alcor_data_set_dma(struct alcor_sdmmc_host *host)
    123{
    124	struct alcor_pci_priv *priv = host->alcor_pci;
    125	u32 addr;
    126
    127	if (!host->sg_count)
    128		return;
    129
    130	if (!host->sg) {
    131		dev_err(host->dev, "have blocks, but no SG\n");
    132		return;
    133	}
    134
    135	if (!sg_dma_len(host->sg)) {
    136		dev_err(host->dev, "DMA SG len == 0\n");
    137		return;
    138	}
    139
    140
    141	addr = (u32)sg_dma_address(host->sg);
    142
    143	alcor_write32(priv, addr, AU6601_REG_SDMA_ADDR);
    144	host->sg = sg_next(host->sg);
    145	host->sg_count--;
    146}
    147
    148static void alcor_trigger_data_transfer(struct alcor_sdmmc_host *host)
    149{
    150	struct alcor_pci_priv *priv = host->alcor_pci;
    151	struct mmc_data *data = host->data;
    152	u8 ctrl = 0;
    153
    154	if (data->flags & MMC_DATA_WRITE)
    155		ctrl |= AU6601_DATA_WRITE;
    156
    157	if (data->host_cookie == COOKIE_MAPPED) {
    158		/*
    159		 * For DMA transfers, this function is called just once,
    160		 * at the start of the operation. The hardware can only
    161		 * perform DMA I/O on a single page at a time, so here
    162		 * we kick off the transfer with the first page, and expect
    163		 * subsequent pages to be transferred upon IRQ events
    164		 * indicating that the single-page DMA was completed.
    165		 */
    166		alcor_data_set_dma(host);
    167		ctrl |= AU6601_DATA_DMA_MODE;
    168		host->dma_on = 1;
    169		alcor_write32(priv, data->sg_count * 0x1000,
    170			       AU6601_REG_BLOCK_SIZE);
    171	} else {
    172		/*
    173		 * For PIO transfers, we break down each operation
    174		 * into several sector-sized transfers. When one sector has
    175		 * complete, the IRQ handler will call this function again
    176		 * to kick off the transfer of the next sector.
    177		 */
    178		alcor_write32(priv, data->blksz, AU6601_REG_BLOCK_SIZE);
    179	}
    180
    181	alcor_write8(priv, ctrl | AU6601_DATA_START_XFER,
    182		      AU6601_DATA_XFER_CTRL);
    183}
    184
    185static void alcor_trf_block_pio(struct alcor_sdmmc_host *host, bool read)
    186{
    187	struct alcor_pci_priv *priv = host->alcor_pci;
    188	size_t blksize, len;
    189	u8 *buf;
    190
    191	if (!host->blocks)
    192		return;
    193
    194	if (host->dma_on) {
    195		dev_err(host->dev, "configured DMA but got PIO request.\n");
    196		return;
    197	}
    198
    199	if (!!(host->data->flags & MMC_DATA_READ) != read) {
    200		dev_err(host->dev, "got unexpected direction %i != %i\n",
    201			!!(host->data->flags & MMC_DATA_READ), read);
    202	}
    203
    204	if (!sg_miter_next(&host->sg_miter))
    205		return;
    206
    207	blksize = host->data->blksz;
    208	len = min(host->sg_miter.length, blksize);
    209
    210	dev_dbg(host->dev, "PIO, %s block size: 0x%zx\n",
    211		read ? "read" : "write", blksize);
    212
    213	host->sg_miter.consumed = len;
    214	host->blocks--;
    215
    216	buf = host->sg_miter.addr;
    217
    218	if (read)
    219		ioread32_rep(priv->iobase + AU6601_REG_BUFFER, buf, len >> 2);
    220	else
    221		iowrite32_rep(priv->iobase + AU6601_REG_BUFFER, buf, len >> 2);
    222
    223	sg_miter_stop(&host->sg_miter);
    224}
    225
    226static void alcor_prepare_sg_miter(struct alcor_sdmmc_host *host)
    227{
    228	unsigned int flags = SG_MITER_ATOMIC;
    229	struct mmc_data *data = host->data;
    230
    231	if (data->flags & MMC_DATA_READ)
    232		flags |= SG_MITER_TO_SG;
    233	else
    234		flags |= SG_MITER_FROM_SG;
    235	sg_miter_start(&host->sg_miter, data->sg, data->sg_len, flags);
    236}
    237
    238static void alcor_prepare_data(struct alcor_sdmmc_host *host,
    239			       struct mmc_command *cmd)
    240{
    241	struct alcor_pci_priv *priv = host->alcor_pci;
    242	struct mmc_data *data = cmd->data;
    243
    244	if (!data)
    245		return;
    246
    247
    248	host->data = data;
    249	host->data->bytes_xfered = 0;
    250	host->blocks = data->blocks;
    251	host->sg = data->sg;
    252	host->sg_count = data->sg_count;
    253	dev_dbg(host->dev, "prepare DATA: sg %i, blocks: %i\n",
    254			host->sg_count, host->blocks);
    255
    256	if (data->host_cookie != COOKIE_MAPPED)
    257		alcor_prepare_sg_miter(host);
    258
    259	alcor_write8(priv, 0, AU6601_DATA_XFER_CTRL);
    260}
    261
    262static void alcor_send_cmd(struct alcor_sdmmc_host *host,
    263			   struct mmc_command *cmd, bool set_timeout)
    264{
    265	struct alcor_pci_priv *priv = host->alcor_pci;
    266	unsigned long timeout = 0;
    267	u8 ctrl = 0;
    268
    269	host->cmd = cmd;
    270	alcor_prepare_data(host, cmd);
    271
    272	dev_dbg(host->dev, "send CMD. opcode: 0x%02x, arg; 0x%08x\n",
    273		cmd->opcode, cmd->arg);
    274	alcor_write8(priv, cmd->opcode | 0x40, AU6601_REG_CMD_OPCODE);
    275	alcor_write32be(priv, cmd->arg, AU6601_REG_CMD_ARG);
    276
    277	switch (mmc_resp_type(cmd)) {
    278	case MMC_RSP_NONE:
    279		ctrl = AU6601_CMD_NO_RESP;
    280		break;
    281	case MMC_RSP_R1:
    282		ctrl = AU6601_CMD_6_BYTE_CRC;
    283		break;
    284	case MMC_RSP_R1B:
    285		ctrl = AU6601_CMD_6_BYTE_CRC | AU6601_CMD_STOP_WAIT_RDY;
    286		break;
    287	case MMC_RSP_R2:
    288		ctrl = AU6601_CMD_17_BYTE_CRC;
    289		break;
    290	case MMC_RSP_R3:
    291		ctrl = AU6601_CMD_6_BYTE_WO_CRC;
    292		break;
    293	default:
    294		dev_err(host->dev, "%s: cmd->flag (0x%02x) is not valid\n",
    295			mmc_hostname(mmc_from_priv(host)), mmc_resp_type(cmd));
    296		break;
    297	}
    298
    299	if (set_timeout) {
    300		if (!cmd->data && cmd->busy_timeout)
    301			timeout = cmd->busy_timeout;
    302		else
    303			timeout = 10000;
    304
    305		schedule_delayed_work(&host->timeout_work,
    306				      msecs_to_jiffies(timeout));
    307	}
    308
    309	dev_dbg(host->dev, "xfer ctrl: 0x%02x; timeout: %lu\n", ctrl, timeout);
    310	alcor_write8(priv, ctrl | AU6601_CMD_START_XFER,
    311				 AU6601_CMD_XFER_CTRL);
    312}
    313
    314static void alcor_request_complete(struct alcor_sdmmc_host *host,
    315				   bool cancel_timeout)
    316{
    317	struct mmc_request *mrq;
    318
    319	/*
    320	 * If this work gets rescheduled while running, it will
    321	 * be run again afterwards but without any active request.
    322	 */
    323	if (!host->mrq)
    324		return;
    325
    326	if (cancel_timeout)
    327		cancel_delayed_work(&host->timeout_work);
    328
    329	mrq = host->mrq;
    330
    331	host->mrq = NULL;
    332	host->cmd = NULL;
    333	host->data = NULL;
    334	host->dma_on = 0;
    335
    336	mmc_request_done(mmc_from_priv(host), mrq);
    337}
    338
    339static void alcor_finish_data(struct alcor_sdmmc_host *host)
    340{
    341	struct mmc_data *data;
    342
    343	data = host->data;
    344	host->data = NULL;
    345	host->dma_on = 0;
    346
    347	/*
    348	 * The specification states that the block count register must
    349	 * be updated, but it does not specify at what point in the
    350	 * data flow. That makes the register entirely useless to read
    351	 * back so we have to assume that nothing made it to the card
    352	 * in the event of an error.
    353	 */
    354	if (data->error)
    355		data->bytes_xfered = 0;
    356	else
    357		data->bytes_xfered = data->blksz * data->blocks;
    358
    359	/*
    360	 * Need to send CMD12 if -
    361	 * a) open-ended multiblock transfer (no CMD23)
    362	 * b) error in multiblock transfer
    363	 */
    364	if (data->stop &&
    365	    (data->error ||
    366	     !host->mrq->sbc)) {
    367
    368		/*
    369		 * The controller needs a reset of internal state machines
    370		 * upon error conditions.
    371		 */
    372		if (data->error)
    373			alcor_reset(host, AU6601_RESET_CMD | AU6601_RESET_DATA);
    374
    375		alcor_unmask_sd_irqs(host);
    376		alcor_send_cmd(host, data->stop, false);
    377		return;
    378	}
    379
    380	alcor_request_complete(host, 1);
    381}
    382
    383static void alcor_err_irq(struct alcor_sdmmc_host *host, u32 intmask)
    384{
    385	dev_dbg(host->dev, "ERR IRQ %x\n", intmask);
    386
    387	if (host->cmd) {
    388		if (intmask & AU6601_INT_CMD_TIMEOUT_ERR)
    389			host->cmd->error = -ETIMEDOUT;
    390		else
    391			host->cmd->error = -EILSEQ;
    392	}
    393
    394	if (host->data) {
    395		if (intmask & AU6601_INT_DATA_TIMEOUT_ERR)
    396			host->data->error = -ETIMEDOUT;
    397		else
    398			host->data->error = -EILSEQ;
    399
    400		host->data->bytes_xfered = 0;
    401	}
    402
    403	alcor_reset(host, AU6601_RESET_CMD | AU6601_RESET_DATA);
    404	alcor_request_complete(host, 1);
    405}
    406
    407static int alcor_cmd_irq_done(struct alcor_sdmmc_host *host, u32 intmask)
    408{
    409	struct alcor_pci_priv *priv = host->alcor_pci;
    410
    411	intmask &= AU6601_INT_CMD_END;
    412
    413	if (!intmask)
    414		return true;
    415
    416	/* got CMD_END but no CMD is in progress, wake thread an process the
    417	 * error
    418	 */
    419	if (!host->cmd)
    420		return false;
    421
    422	if (host->cmd->flags & MMC_RSP_PRESENT) {
    423		struct mmc_command *cmd = host->cmd;
    424
    425		cmd->resp[0] = alcor_read32be(priv, AU6601_REG_CMD_RSP0);
    426		dev_dbg(host->dev, "RSP0: 0x%04x\n", cmd->resp[0]);
    427		if (host->cmd->flags & MMC_RSP_136) {
    428			cmd->resp[1] =
    429				alcor_read32be(priv, AU6601_REG_CMD_RSP1);
    430			cmd->resp[2] =
    431				alcor_read32be(priv, AU6601_REG_CMD_RSP2);
    432			cmd->resp[3] =
    433				alcor_read32be(priv, AU6601_REG_CMD_RSP3);
    434			dev_dbg(host->dev, "RSP1,2,3: 0x%04x 0x%04x 0x%04x\n",
    435				cmd->resp[1], cmd->resp[2], cmd->resp[3]);
    436		}
    437
    438	}
    439
    440	host->cmd->error = 0;
    441
    442	/* Processed actual command. */
    443	if (!host->data)
    444		return false;
    445
    446	alcor_trigger_data_transfer(host);
    447	host->cmd = NULL;
    448	return true;
    449}
    450
    451static void alcor_cmd_irq_thread(struct alcor_sdmmc_host *host, u32 intmask)
    452{
    453	intmask &= AU6601_INT_CMD_END;
    454
    455	if (!intmask)
    456		return;
    457
    458	if (!host->cmd && intmask & AU6601_INT_CMD_END) {
    459		dev_dbg(host->dev, "Got command interrupt 0x%08x even though no command operation was in progress.\n",
    460			intmask);
    461	}
    462
    463	/* Processed actual command. */
    464	if (!host->data)
    465		alcor_request_complete(host, 1);
    466	else
    467		alcor_trigger_data_transfer(host);
    468	host->cmd = NULL;
    469}
    470
    471static int alcor_data_irq_done(struct alcor_sdmmc_host *host, u32 intmask)
    472{
    473	u32 tmp;
    474
    475	intmask &= AU6601_INT_DATA_MASK;
    476
    477	/* nothing here to do */
    478	if (!intmask)
    479		return 1;
    480
    481	/* we was too fast and got DATA_END after it was processed?
    482	 * lets ignore it for now.
    483	 */
    484	if (!host->data && intmask == AU6601_INT_DATA_END)
    485		return 1;
    486
    487	/* looks like an error, so lets handle it. */
    488	if (!host->data)
    489		return 0;
    490
    491	tmp = intmask & (AU6601_INT_READ_BUF_RDY | AU6601_INT_WRITE_BUF_RDY
    492			 | AU6601_INT_DMA_END);
    493	switch (tmp) {
    494	case 0:
    495		break;
    496	case AU6601_INT_READ_BUF_RDY:
    497		alcor_trf_block_pio(host, true);
    498		return 1;
    499	case AU6601_INT_WRITE_BUF_RDY:
    500		alcor_trf_block_pio(host, false);
    501		return 1;
    502	case AU6601_INT_DMA_END:
    503		if (!host->sg_count)
    504			break;
    505
    506		alcor_data_set_dma(host);
    507		break;
    508	default:
    509		dev_err(host->dev, "Got READ_BUF_RDY and WRITE_BUF_RDY at same time\n");
    510		break;
    511	}
    512
    513	if (intmask & AU6601_INT_DATA_END) {
    514		if (!host->dma_on && host->blocks) {
    515			alcor_trigger_data_transfer(host);
    516			return 1;
    517		} else {
    518			return 0;
    519		}
    520	}
    521
    522	return 1;
    523}
    524
    525static void alcor_data_irq_thread(struct alcor_sdmmc_host *host, u32 intmask)
    526{
    527	intmask &= AU6601_INT_DATA_MASK;
    528
    529	if (!intmask)
    530		return;
    531
    532	if (!host->data) {
    533		dev_dbg(host->dev, "Got data interrupt 0x%08x even though no data operation was in progress.\n",
    534			intmask);
    535		alcor_reset(host, AU6601_RESET_DATA);
    536		return;
    537	}
    538
    539	if (alcor_data_irq_done(host, intmask))
    540		return;
    541
    542	if ((intmask & AU6601_INT_DATA_END) || !host->blocks ||
    543	    (host->dma_on && !host->sg_count))
    544		alcor_finish_data(host);
    545}
    546
    547static void alcor_cd_irq(struct alcor_sdmmc_host *host, u32 intmask)
    548{
    549	dev_dbg(host->dev, "card %s\n",
    550		intmask & AU6601_INT_CARD_REMOVE ? "removed" : "inserted");
    551
    552	if (host->mrq) {
    553		dev_dbg(host->dev, "cancel all pending tasks.\n");
    554
    555		if (host->data)
    556			host->data->error = -ENOMEDIUM;
    557
    558		if (host->cmd)
    559			host->cmd->error = -ENOMEDIUM;
    560		else
    561			host->mrq->cmd->error = -ENOMEDIUM;
    562
    563		alcor_request_complete(host, 1);
    564	}
    565
    566	mmc_detect_change(mmc_from_priv(host), msecs_to_jiffies(1));
    567}
    568
    569static irqreturn_t alcor_irq_thread(int irq, void *d)
    570{
    571	struct alcor_sdmmc_host *host = d;
    572	irqreturn_t ret = IRQ_HANDLED;
    573	u32 intmask, tmp;
    574
    575	mutex_lock(&host->cmd_mutex);
    576
    577	intmask = host->irq_status_sd;
    578
    579	/* some thing bad */
    580	if (unlikely(!intmask || AU6601_INT_ALL_MASK == intmask)) {
    581		dev_dbg(host->dev, "unexpected IRQ: 0x%04x\n", intmask);
    582		ret = IRQ_NONE;
    583		goto exit;
    584	}
    585
    586	tmp = intmask & (AU6601_INT_CMD_MASK | AU6601_INT_DATA_MASK);
    587	if (tmp) {
    588		if (tmp & AU6601_INT_ERROR_MASK)
    589			alcor_err_irq(host, tmp);
    590		else {
    591			alcor_cmd_irq_thread(host, tmp);
    592			alcor_data_irq_thread(host, tmp);
    593		}
    594		intmask &= ~(AU6601_INT_CMD_MASK | AU6601_INT_DATA_MASK);
    595	}
    596
    597	if (intmask & (AU6601_INT_CARD_INSERT | AU6601_INT_CARD_REMOVE)) {
    598		alcor_cd_irq(host, intmask);
    599		intmask &= ~(AU6601_INT_CARD_INSERT | AU6601_INT_CARD_REMOVE);
    600	}
    601
    602	if (intmask & AU6601_INT_OVER_CURRENT_ERR) {
    603		dev_warn(host->dev,
    604			 "warning: over current detected!\n");
    605		intmask &= ~AU6601_INT_OVER_CURRENT_ERR;
    606	}
    607
    608	if (intmask)
    609		dev_dbg(host->dev, "got not handled IRQ: 0x%04x\n", intmask);
    610
    611exit:
    612	mutex_unlock(&host->cmd_mutex);
    613	alcor_unmask_sd_irqs(host);
    614	return ret;
    615}
    616
    617
    618static irqreturn_t alcor_irq(int irq, void *d)
    619{
    620	struct alcor_sdmmc_host *host = d;
    621	struct alcor_pci_priv *priv = host->alcor_pci;
    622	u32 status, tmp;
    623	irqreturn_t ret;
    624	int cmd_done, data_done;
    625
    626	status = alcor_read32(priv, AU6601_REG_INT_STATUS);
    627	if (!status)
    628		return IRQ_NONE;
    629
    630	alcor_write32(priv, status, AU6601_REG_INT_STATUS);
    631
    632	tmp = status & (AU6601_INT_READ_BUF_RDY | AU6601_INT_WRITE_BUF_RDY
    633			| AU6601_INT_DATA_END | AU6601_INT_DMA_END
    634			| AU6601_INT_CMD_END);
    635	if (tmp == status) {
    636		cmd_done = alcor_cmd_irq_done(host, tmp);
    637		data_done = alcor_data_irq_done(host, tmp);
    638		/* use fast path for simple tasks */
    639		if (cmd_done && data_done) {
    640			ret = IRQ_HANDLED;
    641			goto alcor_irq_done;
    642		}
    643	}
    644
    645	host->irq_status_sd = status;
    646	ret = IRQ_WAKE_THREAD;
    647	alcor_mask_sd_irqs(host);
    648alcor_irq_done:
    649	return ret;
    650}
    651
    652static void alcor_set_clock(struct alcor_sdmmc_host *host, unsigned int clock)
    653{
    654	struct alcor_pci_priv *priv = host->alcor_pci;
    655	int i, diff = 0x7fffffff, tmp_clock = 0;
    656	u16 clk_src = 0;
    657	u8 clk_div = 0;
    658
    659	if (clock == 0) {
    660		alcor_write16(priv, 0, AU6601_CLK_SELECT);
    661		return;
    662	}
    663
    664	for (i = 0; i < ARRAY_SIZE(alcor_pll_cfg); i++) {
    665		unsigned int tmp_div, tmp_diff;
    666		const struct alcor_pll_conf *cfg = &alcor_pll_cfg[i];
    667
    668		tmp_div = DIV_ROUND_UP(cfg->clk_src_freq, clock);
    669		if (cfg->min_div > tmp_div || tmp_div > cfg->max_div)
    670			continue;
    671
    672		tmp_clock = DIV_ROUND_UP(cfg->clk_src_freq, tmp_div);
    673		tmp_diff = abs(clock - tmp_clock);
    674
    675		if (tmp_diff < diff) {
    676			diff = tmp_diff;
    677			clk_src = cfg->clk_src_reg;
    678			clk_div = tmp_div;
    679		}
    680	}
    681
    682	clk_src |= ((clk_div - 1) << 8);
    683	clk_src |= AU6601_CLK_ENABLE;
    684
    685	dev_dbg(host->dev, "set freq %d cal freq %d, use div %d, mod %x\n",
    686			clock, tmp_clock, clk_div, clk_src);
    687
    688	alcor_write16(priv, clk_src, AU6601_CLK_SELECT);
    689
    690}
    691
    692static void alcor_set_timing(struct mmc_host *mmc, struct mmc_ios *ios)
    693{
    694	struct alcor_sdmmc_host *host = mmc_priv(mmc);
    695
    696	if (ios->timing == MMC_TIMING_LEGACY) {
    697		alcor_rmw8(host, AU6601_CLK_DELAY,
    698			    AU6601_CLK_POSITIVE_EDGE_ALL, 0);
    699	} else {
    700		alcor_rmw8(host, AU6601_CLK_DELAY,
    701			    0, AU6601_CLK_POSITIVE_EDGE_ALL);
    702	}
    703}
    704
    705static void alcor_set_bus_width(struct mmc_host *mmc, struct mmc_ios *ios)
    706{
    707	struct alcor_sdmmc_host *host = mmc_priv(mmc);
    708	struct alcor_pci_priv *priv = host->alcor_pci;
    709
    710	if (ios->bus_width == MMC_BUS_WIDTH_1) {
    711		alcor_write8(priv, 0, AU6601_REG_BUS_CTRL);
    712	} else if (ios->bus_width == MMC_BUS_WIDTH_4) {
    713		alcor_write8(priv, AU6601_BUS_WIDTH_4BIT,
    714			      AU6601_REG_BUS_CTRL);
    715	} else
    716		dev_err(host->dev, "Unknown BUS mode\n");
    717
    718}
    719
    720static int alcor_card_busy(struct mmc_host *mmc)
    721{
    722	struct alcor_sdmmc_host *host = mmc_priv(mmc);
    723	struct alcor_pci_priv *priv = host->alcor_pci;
    724	u8 status;
    725
    726	/* Check whether dat[0:3] low */
    727	status = alcor_read8(priv, AU6601_DATA_PIN_STATE);
    728
    729	return !(status & AU6601_BUS_STAT_DAT_MASK);
    730}
    731
    732static int alcor_get_cd(struct mmc_host *mmc)
    733{
    734	struct alcor_sdmmc_host *host = mmc_priv(mmc);
    735	struct alcor_pci_priv *priv = host->alcor_pci;
    736	u8 detect;
    737
    738	detect = alcor_read8(priv, AU6601_DETECT_STATUS)
    739		& AU6601_DETECT_STATUS_M;
    740	/* check if card is present then send command and data */
    741	return (detect == AU6601_SD_DETECTED);
    742}
    743
    744static int alcor_get_ro(struct mmc_host *mmc)
    745{
    746	struct alcor_sdmmc_host *host = mmc_priv(mmc);
    747	struct alcor_pci_priv *priv = host->alcor_pci;
    748	u8 status;
    749
    750	/* get write protect pin status */
    751	status = alcor_read8(priv, AU6601_INTERFACE_MODE_CTRL);
    752
    753	return !!(status & AU6601_SD_CARD_WP);
    754}
    755
    756static void alcor_request(struct mmc_host *mmc, struct mmc_request *mrq)
    757{
    758	struct alcor_sdmmc_host *host = mmc_priv(mmc);
    759
    760	mutex_lock(&host->cmd_mutex);
    761
    762	host->mrq = mrq;
    763
    764	/* check if card is present then send command and data */
    765	if (alcor_get_cd(mmc))
    766		alcor_send_cmd(host, mrq->cmd, true);
    767	else {
    768		mrq->cmd->error = -ENOMEDIUM;
    769		alcor_request_complete(host, 1);
    770	}
    771
    772	mutex_unlock(&host->cmd_mutex);
    773}
    774
    775static void alcor_pre_req(struct mmc_host *mmc,
    776			   struct mmc_request *mrq)
    777{
    778	struct alcor_sdmmc_host *host = mmc_priv(mmc);
    779	struct mmc_data *data = mrq->data;
    780	struct mmc_command *cmd = mrq->cmd;
    781	struct scatterlist *sg;
    782	unsigned int i, sg_len;
    783
    784	if (!data || !cmd)
    785		return;
    786
    787	data->host_cookie = COOKIE_UNMAPPED;
    788
    789	/* FIXME: looks like the DMA engine works only with CMD18 */
    790	if (cmd->opcode != MMC_READ_MULTIPLE_BLOCK
    791			&& cmd->opcode != MMC_WRITE_MULTIPLE_BLOCK)
    792		return;
    793	/*
    794	 * We don't do DMA on "complex" transfers, i.e. with
    795	 * non-word-aligned buffers or lengths. A future improvement
    796	 * could be made to use temporary DMA bounce-buffers when these
    797	 * requirements are not met.
    798	 *
    799	 * Also, we don't bother with all the DMA setup overhead for
    800	 * short transfers.
    801	 */
    802	if (data->blocks * data->blksz < AU6601_MAX_DMA_BLOCK_SIZE)
    803		return;
    804
    805	if (data->blksz & 3)
    806		return;
    807
    808	for_each_sg(data->sg, sg, data->sg_len, i) {
    809		if (sg->length != AU6601_MAX_DMA_BLOCK_SIZE)
    810			return;
    811		if (sg->offset != 0)
    812			return;
    813	}
    814
    815	/* This data might be unmapped at this time */
    816
    817	sg_len = dma_map_sg(host->dev, data->sg, data->sg_len,
    818			    mmc_get_dma_dir(data));
    819	if (sg_len)
    820		data->host_cookie = COOKIE_MAPPED;
    821
    822	data->sg_count = sg_len;
    823}
    824
    825static void alcor_post_req(struct mmc_host *mmc,
    826			    struct mmc_request *mrq,
    827			    int err)
    828{
    829	struct alcor_sdmmc_host *host = mmc_priv(mmc);
    830	struct mmc_data *data = mrq->data;
    831
    832	if (!data)
    833		return;
    834
    835	if (data->host_cookie == COOKIE_MAPPED) {
    836		dma_unmap_sg(host->dev,
    837			     data->sg,
    838			     data->sg_len,
    839			     mmc_get_dma_dir(data));
    840	}
    841
    842	data->host_cookie = COOKIE_UNMAPPED;
    843}
    844
    845static void alcor_set_power_mode(struct mmc_host *mmc, struct mmc_ios *ios)
    846{
    847	struct alcor_sdmmc_host *host = mmc_priv(mmc);
    848	struct alcor_pci_priv *priv = host->alcor_pci;
    849
    850	switch (ios->power_mode) {
    851	case MMC_POWER_OFF:
    852		alcor_set_clock(host, ios->clock);
    853		/* set all pins to input */
    854		alcor_write8(priv, 0, AU6601_OUTPUT_ENABLE);
    855		/* turn of VDD */
    856		alcor_write8(priv, 0, AU6601_POWER_CONTROL);
    857		break;
    858	case MMC_POWER_UP:
    859		break;
    860	case MMC_POWER_ON:
    861		/* This is most trickiest part. The order and timings of
    862		 * instructions seems to play important role. Any changes may
    863		 * confuse internal state engine if this HW.
    864		 * FIXME: If we will ever get access to documentation, then this
    865		 * part should be reviewed again.
    866		 */
    867
    868		/* enable SD card mode */
    869		alcor_write8(priv, AU6601_SD_CARD,
    870			      AU6601_ACTIVE_CTRL);
    871		/* set signal voltage to 3.3V */
    872		alcor_write8(priv, 0, AU6601_OPT);
    873		/* no documentation about clk delay, for now just try to mimic
    874		 * original driver.
    875		 */
    876		alcor_write8(priv, 0x20, AU6601_CLK_DELAY);
    877		/* set BUS width to 1 bit */
    878		alcor_write8(priv, 0, AU6601_REG_BUS_CTRL);
    879		/* set CLK first time */
    880		alcor_set_clock(host, ios->clock);
    881		/* power on VDD */
    882		alcor_write8(priv, AU6601_SD_CARD,
    883			      AU6601_POWER_CONTROL);
    884		/* wait until the CLK will get stable */
    885		mdelay(20);
    886		/* set CLK again, mimic original driver. */
    887		alcor_set_clock(host, ios->clock);
    888
    889		/* enable output */
    890		alcor_write8(priv, AU6601_SD_CARD,
    891			      AU6601_OUTPUT_ENABLE);
    892		/* The clk will not work on au6621. We need to trigger data
    893		 * transfer.
    894		 */
    895		alcor_write8(priv, AU6601_DATA_WRITE,
    896			      AU6601_DATA_XFER_CTRL);
    897		/* configure timeout. Not clear what exactly it means. */
    898		alcor_write8(priv, 0x7d, AU6601_TIME_OUT_CTRL);
    899		mdelay(100);
    900		break;
    901	default:
    902		dev_err(host->dev, "Unknown power parameter\n");
    903	}
    904}
    905
    906static void alcor_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
    907{
    908	struct alcor_sdmmc_host *host = mmc_priv(mmc);
    909
    910	mutex_lock(&host->cmd_mutex);
    911
    912	dev_dbg(host->dev, "set ios. bus width: %x, power mode: %x\n",
    913		ios->bus_width, ios->power_mode);
    914
    915	if (ios->power_mode != host->cur_power_mode) {
    916		alcor_set_power_mode(mmc, ios);
    917		host->cur_power_mode = ios->power_mode;
    918	} else {
    919		alcor_set_timing(mmc, ios);
    920		alcor_set_bus_width(mmc, ios);
    921		alcor_set_clock(host, ios->clock);
    922	}
    923
    924	mutex_unlock(&host->cmd_mutex);
    925}
    926
    927static int alcor_signal_voltage_switch(struct mmc_host *mmc,
    928				       struct mmc_ios *ios)
    929{
    930	struct alcor_sdmmc_host *host = mmc_priv(mmc);
    931
    932	mutex_lock(&host->cmd_mutex);
    933
    934	switch (ios->signal_voltage) {
    935	case MMC_SIGNAL_VOLTAGE_330:
    936		alcor_rmw8(host, AU6601_OPT, AU6601_OPT_SD_18V, 0);
    937		break;
    938	case MMC_SIGNAL_VOLTAGE_180:
    939		alcor_rmw8(host, AU6601_OPT, 0, AU6601_OPT_SD_18V);
    940		break;
    941	default:
    942		/* No signal voltage switch required */
    943		break;
    944	}
    945
    946	mutex_unlock(&host->cmd_mutex);
    947	return 0;
    948}
    949
    950static const struct mmc_host_ops alcor_sdc_ops = {
    951	.card_busy	= alcor_card_busy,
    952	.get_cd		= alcor_get_cd,
    953	.get_ro		= alcor_get_ro,
    954	.post_req	= alcor_post_req,
    955	.pre_req	= alcor_pre_req,
    956	.request	= alcor_request,
    957	.set_ios	= alcor_set_ios,
    958	.start_signal_voltage_switch = alcor_signal_voltage_switch,
    959};
    960
    961static void alcor_timeout_timer(struct work_struct *work)
    962{
    963	struct delayed_work *d = to_delayed_work(work);
    964	struct alcor_sdmmc_host *host = container_of(d, struct alcor_sdmmc_host,
    965						timeout_work);
    966	mutex_lock(&host->cmd_mutex);
    967
    968	dev_dbg(host->dev, "triggered timeout\n");
    969	if (host->mrq) {
    970		dev_err(host->dev, "Timeout waiting for hardware interrupt.\n");
    971
    972		if (host->data) {
    973			host->data->error = -ETIMEDOUT;
    974		} else {
    975			if (host->cmd)
    976				host->cmd->error = -ETIMEDOUT;
    977			else
    978				host->mrq->cmd->error = -ETIMEDOUT;
    979		}
    980
    981		alcor_reset(host, AU6601_RESET_CMD | AU6601_RESET_DATA);
    982		alcor_request_complete(host, 0);
    983	}
    984
    985	mutex_unlock(&host->cmd_mutex);
    986}
    987
    988static void alcor_hw_init(struct alcor_sdmmc_host *host)
    989{
    990	struct alcor_pci_priv *priv = host->alcor_pci;
    991	struct alcor_dev_cfg *cfg = priv->cfg;
    992
    993	/* FIXME: This part is a mimics HW init of original driver.
    994	 * If we will ever get access to documentation, then this part
    995	 * should be reviewed again.
    996	 */
    997
    998	/* reset command state engine */
    999	alcor_reset(host, AU6601_RESET_CMD);
   1000
   1001	alcor_write8(priv, 0, AU6601_DMA_BOUNDARY);
   1002	/* enable sd card mode */
   1003	alcor_write8(priv, AU6601_SD_CARD, AU6601_ACTIVE_CTRL);
   1004
   1005	/* set BUS width to 1 bit */
   1006	alcor_write8(priv, 0, AU6601_REG_BUS_CTRL);
   1007
   1008	/* reset data state engine */
   1009	alcor_reset(host, AU6601_RESET_DATA);
   1010	/* Not sure if a voodoo with AU6601_DMA_BOUNDARY is really needed */
   1011	alcor_write8(priv, 0, AU6601_DMA_BOUNDARY);
   1012
   1013	alcor_write8(priv, 0, AU6601_INTERFACE_MODE_CTRL);
   1014	/* not clear what we are doing here. */
   1015	alcor_write8(priv, 0x44, AU6601_PAD_DRIVE0);
   1016	alcor_write8(priv, 0x44, AU6601_PAD_DRIVE1);
   1017	alcor_write8(priv, 0x00, AU6601_PAD_DRIVE2);
   1018
   1019	/* for 6601 - dma_boundary; for 6621 - dma_page_cnt
   1020	 * exact meaning of this register is not clear.
   1021	 */
   1022	alcor_write8(priv, cfg->dma, AU6601_DMA_BOUNDARY);
   1023
   1024	/* make sure all pins are set to input and VDD is off */
   1025	alcor_write8(priv, 0, AU6601_OUTPUT_ENABLE);
   1026	alcor_write8(priv, 0, AU6601_POWER_CONTROL);
   1027
   1028	alcor_write8(priv, AU6601_DETECT_EN, AU6601_DETECT_STATUS);
   1029	/* now we should be safe to enable IRQs */
   1030	alcor_unmask_sd_irqs(host);
   1031}
   1032
   1033static void alcor_hw_uninit(struct alcor_sdmmc_host *host)
   1034{
   1035	struct alcor_pci_priv *priv = host->alcor_pci;
   1036
   1037	alcor_mask_sd_irqs(host);
   1038	alcor_reset(host, AU6601_RESET_CMD | AU6601_RESET_DATA);
   1039
   1040	alcor_write8(priv, 0, AU6601_DETECT_STATUS);
   1041
   1042	alcor_write8(priv, 0, AU6601_OUTPUT_ENABLE);
   1043	alcor_write8(priv, 0, AU6601_POWER_CONTROL);
   1044
   1045	alcor_write8(priv, 0, AU6601_OPT);
   1046}
   1047
   1048static void alcor_init_mmc(struct alcor_sdmmc_host *host)
   1049{
   1050	struct mmc_host *mmc = mmc_from_priv(host);
   1051
   1052	mmc->f_min = AU6601_MIN_CLOCK;
   1053	mmc->f_max = AU6601_MAX_CLOCK;
   1054	mmc->ocr_avail = MMC_VDD_33_34;
   1055	mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_SD_HIGHSPEED
   1056		| MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 | MMC_CAP_UHS_SDR50
   1057		| MMC_CAP_UHS_SDR104 | MMC_CAP_UHS_DDR50;
   1058	mmc->caps2 = MMC_CAP2_NO_SDIO;
   1059	mmc->ops = &alcor_sdc_ops;
   1060
   1061	/* The hardware does DMA data transfer of 4096 bytes to/from a single
   1062	 * buffer address. Scatterlists are not supported at the hardware
   1063	 * level, however we can work with them at the driver level,
   1064	 * provided that each segment is exactly 4096 bytes in size.
   1065	 * Upon DMA completion of a single segment (signalled via IRQ), we
   1066	 * immediately proceed to transfer the next segment from the
   1067	 * scatterlist.
   1068	 *
   1069	 * The overall request is limited to 240 sectors, matching the
   1070	 * original vendor driver.
   1071	 */
   1072	mmc->max_segs = AU6601_MAX_DMA_SEGMENTS;
   1073	mmc->max_seg_size = AU6601_MAX_DMA_BLOCK_SIZE;
   1074	mmc->max_blk_count = 240;
   1075	mmc->max_req_size = mmc->max_blk_count * mmc->max_blk_size;
   1076	dma_set_max_seg_size(host->dev, mmc->max_seg_size);
   1077}
   1078
   1079static int alcor_pci_sdmmc_drv_probe(struct platform_device *pdev)
   1080{
   1081	struct alcor_pci_priv *priv = pdev->dev.platform_data;
   1082	struct mmc_host *mmc;
   1083	struct alcor_sdmmc_host *host;
   1084	int ret;
   1085
   1086	mmc = mmc_alloc_host(sizeof(*host), &pdev->dev);
   1087	if (!mmc) {
   1088		dev_err(&pdev->dev, "Can't allocate MMC\n");
   1089		return -ENOMEM;
   1090	}
   1091
   1092	host = mmc_priv(mmc);
   1093	host->dev = &pdev->dev;
   1094	host->cur_power_mode = MMC_POWER_UNDEFINED;
   1095	host->alcor_pci = priv;
   1096
   1097	/* make sure irqs are disabled */
   1098	alcor_write32(priv, 0, AU6601_REG_INT_ENABLE);
   1099	alcor_write32(priv, 0, AU6601_MS_INT_ENABLE);
   1100
   1101	ret = devm_request_threaded_irq(&pdev->dev, priv->irq,
   1102			alcor_irq, alcor_irq_thread, IRQF_SHARED,
   1103			DRV_NAME_ALCOR_PCI_SDMMC, host);
   1104
   1105	if (ret) {
   1106		dev_err(&pdev->dev, "Failed to get irq for data line\n");
   1107		goto free_host;
   1108	}
   1109
   1110	mutex_init(&host->cmd_mutex);
   1111	INIT_DELAYED_WORK(&host->timeout_work, alcor_timeout_timer);
   1112
   1113	alcor_init_mmc(host);
   1114	alcor_hw_init(host);
   1115
   1116	dev_set_drvdata(&pdev->dev, host);
   1117	mmc_add_host(mmc);
   1118	return 0;
   1119
   1120free_host:
   1121	mmc_free_host(mmc);
   1122	return ret;
   1123}
   1124
   1125static int alcor_pci_sdmmc_drv_remove(struct platform_device *pdev)
   1126{
   1127	struct alcor_sdmmc_host *host = dev_get_drvdata(&pdev->dev);
   1128	struct mmc_host *mmc = mmc_from_priv(host);
   1129
   1130	if (cancel_delayed_work_sync(&host->timeout_work))
   1131		alcor_request_complete(host, 0);
   1132
   1133	alcor_hw_uninit(host);
   1134	mmc_remove_host(mmc);
   1135	mmc_free_host(mmc);
   1136
   1137	return 0;
   1138}
   1139
   1140#ifdef CONFIG_PM_SLEEP
   1141static int alcor_pci_sdmmc_suspend(struct device *dev)
   1142{
   1143	struct alcor_sdmmc_host *host = dev_get_drvdata(dev);
   1144
   1145	if (cancel_delayed_work_sync(&host->timeout_work))
   1146		alcor_request_complete(host, 0);
   1147
   1148	alcor_hw_uninit(host);
   1149
   1150	return 0;
   1151}
   1152
   1153static int alcor_pci_sdmmc_resume(struct device *dev)
   1154{
   1155	struct alcor_sdmmc_host *host = dev_get_drvdata(dev);
   1156
   1157	alcor_hw_init(host);
   1158
   1159	return 0;
   1160}
   1161#endif /* CONFIG_PM_SLEEP */
   1162
   1163static SIMPLE_DEV_PM_OPS(alcor_mmc_pm_ops, alcor_pci_sdmmc_suspend,
   1164			 alcor_pci_sdmmc_resume);
   1165
   1166static const struct platform_device_id alcor_pci_sdmmc_ids[] = {
   1167	{
   1168		.name = DRV_NAME_ALCOR_PCI_SDMMC,
   1169	}, {
   1170		/* sentinel */
   1171	}
   1172};
   1173MODULE_DEVICE_TABLE(platform, alcor_pci_sdmmc_ids);
   1174
   1175static struct platform_driver alcor_pci_sdmmc_driver = {
   1176	.probe		= alcor_pci_sdmmc_drv_probe,
   1177	.remove		= alcor_pci_sdmmc_drv_remove,
   1178	.id_table	= alcor_pci_sdmmc_ids,
   1179	.driver		= {
   1180		.name	= DRV_NAME_ALCOR_PCI_SDMMC,
   1181		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
   1182		.pm	= &alcor_mmc_pm_ops
   1183	},
   1184};
   1185module_platform_driver(alcor_pci_sdmmc_driver);
   1186
   1187MODULE_AUTHOR("Oleksij Rempel <linux@rempel-privat.de>");
   1188MODULE_DESCRIPTION("PCI driver for Alcor Micro AU6601 Secure Digital Host Controller Interface");
   1189MODULE_LICENSE("GPL");