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

spi-mxic.c (21481B)


      1// SPDX-License-Identifier: GPL-2.0
      2//
      3// Copyright (C) 2018 Macronix International Co., Ltd.
      4//
      5// Authors:
      6//	Mason Yang <masonccyang@mxic.com.tw>
      7//	zhengxunli <zhengxunli@mxic.com.tw>
      8//	Boris Brezillon <boris.brezillon@bootlin.com>
      9//
     10
     11#include <linux/clk.h>
     12#include <linux/io.h>
     13#include <linux/iopoll.h>
     14#include <linux/module.h>
     15#include <linux/mtd/nand.h>
     16#include <linux/mtd/nand-ecc-mxic.h>
     17#include <linux/platform_device.h>
     18#include <linux/pm_runtime.h>
     19#include <linux/spi/spi.h>
     20#include <linux/spi/spi-mem.h>
     21
     22#define HC_CFG			0x0
     23#define HC_CFG_IF_CFG(x)	((x) << 27)
     24#define HC_CFG_DUAL_SLAVE	BIT(31)
     25#define HC_CFG_INDIVIDUAL	BIT(30)
     26#define HC_CFG_NIO(x)		(((x) / 4) << 27)
     27#define HC_CFG_TYPE(s, t)	((t) << (23 + ((s) * 2)))
     28#define HC_CFG_TYPE_SPI_NOR	0
     29#define HC_CFG_TYPE_SPI_NAND	1
     30#define HC_CFG_TYPE_SPI_RAM	2
     31#define HC_CFG_TYPE_RAW_NAND	3
     32#define HC_CFG_SLV_ACT(x)	((x) << 21)
     33#define HC_CFG_CLK_PH_EN	BIT(20)
     34#define HC_CFG_CLK_POL_INV	BIT(19)
     35#define HC_CFG_BIG_ENDIAN	BIT(18)
     36#define HC_CFG_DATA_PASS	BIT(17)
     37#define HC_CFG_IDLE_SIO_LVL(x)	((x) << 16)
     38#define HC_CFG_MAN_START_EN	BIT(3)
     39#define HC_CFG_MAN_START	BIT(2)
     40#define HC_CFG_MAN_CS_EN	BIT(1)
     41#define HC_CFG_MAN_CS_ASSERT	BIT(0)
     42
     43#define INT_STS			0x4
     44#define INT_STS_EN		0x8
     45#define INT_SIG_EN		0xc
     46#define INT_STS_ALL		GENMASK(31, 0)
     47#define INT_RDY_PIN		BIT(26)
     48#define INT_RDY_SR		BIT(25)
     49#define INT_LNR_SUSP		BIT(24)
     50#define INT_ECC_ERR		BIT(17)
     51#define INT_CRC_ERR		BIT(16)
     52#define INT_LWR_DIS		BIT(12)
     53#define INT_LRD_DIS		BIT(11)
     54#define INT_SDMA_INT		BIT(10)
     55#define INT_DMA_FINISH		BIT(9)
     56#define INT_RX_NOT_FULL		BIT(3)
     57#define INT_RX_NOT_EMPTY	BIT(2)
     58#define INT_TX_NOT_FULL		BIT(1)
     59#define INT_TX_EMPTY		BIT(0)
     60
     61#define HC_EN			0x10
     62#define HC_EN_BIT		BIT(0)
     63
     64#define TXD(x)			(0x14 + ((x) * 4))
     65#define RXD			0x24
     66
     67#define SS_CTRL(s)		(0x30 + ((s) * 4))
     68#define LRD_CFG			0x44
     69#define LWR_CFG			0x80
     70#define RWW_CFG			0x70
     71#define OP_READ			BIT(23)
     72#define OP_DUMMY_CYC(x)		((x) << 17)
     73#define OP_ADDR_BYTES(x)	((x) << 14)
     74#define OP_CMD_BYTES(x)		(((x) - 1) << 13)
     75#define OP_OCTA_CRC_EN		BIT(12)
     76#define OP_DQS_EN		BIT(11)
     77#define OP_ENHC_EN		BIT(10)
     78#define OP_PREAMBLE_EN		BIT(9)
     79#define OP_DATA_DDR		BIT(8)
     80#define OP_DATA_BUSW(x)		((x) << 6)
     81#define OP_ADDR_DDR		BIT(5)
     82#define OP_ADDR_BUSW(x)		((x) << 3)
     83#define OP_CMD_DDR		BIT(2)
     84#define OP_CMD_BUSW(x)		(x)
     85#define OP_BUSW_1		0
     86#define OP_BUSW_2		1
     87#define OP_BUSW_4		2
     88#define OP_BUSW_8		3
     89
     90#define OCTA_CRC		0x38
     91#define OCTA_CRC_IN_EN(s)	BIT(3 + ((s) * 16))
     92#define OCTA_CRC_CHUNK(s, x)	((fls((x) / 32)) << (1 + ((s) * 16)))
     93#define OCTA_CRC_OUT_EN(s)	BIT(0 + ((s) * 16))
     94
     95#define ONFI_DIN_CNT(s)		(0x3c + (s))
     96
     97#define LRD_CTRL		0x48
     98#define RWW_CTRL		0x74
     99#define LWR_CTRL		0x84
    100#define LMODE_EN		BIT(31)
    101#define LMODE_SLV_ACT(x)	((x) << 21)
    102#define LMODE_CMD1(x)		((x) << 8)
    103#define LMODE_CMD0(x)		(x)
    104
    105#define LRD_ADDR		0x4c
    106#define LWR_ADDR		0x88
    107#define LRD_RANGE		0x50
    108#define LWR_RANGE		0x8c
    109
    110#define AXI_SLV_ADDR		0x54
    111
    112#define DMAC_RD_CFG		0x58
    113#define DMAC_WR_CFG		0x94
    114#define DMAC_CFG_PERIPH_EN	BIT(31)
    115#define DMAC_CFG_ALLFLUSH_EN	BIT(30)
    116#define DMAC_CFG_LASTFLUSH_EN	BIT(29)
    117#define DMAC_CFG_QE(x)		(((x) + 1) << 16)
    118#define DMAC_CFG_BURST_LEN(x)	(((x) + 1) << 12)
    119#define DMAC_CFG_BURST_SZ(x)	((x) << 8)
    120#define DMAC_CFG_DIR_READ	BIT(1)
    121#define DMAC_CFG_START		BIT(0)
    122
    123#define DMAC_RD_CNT		0x5c
    124#define DMAC_WR_CNT		0x98
    125
    126#define SDMA_ADDR		0x60
    127
    128#define DMAM_CFG		0x64
    129#define DMAM_CFG_START		BIT(31)
    130#define DMAM_CFG_CONT		BIT(30)
    131#define DMAM_CFG_SDMA_GAP(x)	(fls((x) / 8192) << 2)
    132#define DMAM_CFG_DIR_READ	BIT(1)
    133#define DMAM_CFG_EN		BIT(0)
    134
    135#define DMAM_CNT		0x68
    136
    137#define LNR_TIMER_TH		0x6c
    138
    139#define RDM_CFG0		0x78
    140#define RDM_CFG0_POLY(x)	(x)
    141
    142#define RDM_CFG1		0x7c
    143#define RDM_CFG1_RDM_EN		BIT(31)
    144#define RDM_CFG1_SEED(x)	(x)
    145
    146#define LWR_SUSP_CTRL		0x90
    147#define LWR_SUSP_CTRL_EN	BIT(31)
    148
    149#define DMAS_CTRL		0x9c
    150#define DMAS_CTRL_EN		BIT(31)
    151#define DMAS_CTRL_DIR_READ	BIT(30)
    152
    153#define DATA_STROB		0xa0
    154#define DATA_STROB_EDO_EN	BIT(2)
    155#define DATA_STROB_INV_POL	BIT(1)
    156#define DATA_STROB_DELAY_2CYC	BIT(0)
    157
    158#define IDLY_CODE(x)		(0xa4 + ((x) * 4))
    159#define IDLY_CODE_VAL(x, v)	((v) << (((x) % 4) * 8))
    160
    161#define GPIO			0xc4
    162#define GPIO_PT(x)		BIT(3 + ((x) * 16))
    163#define GPIO_RESET(x)		BIT(2 + ((x) * 16))
    164#define GPIO_HOLDB(x)		BIT(1 + ((x) * 16))
    165#define GPIO_WPB(x)		BIT((x) * 16)
    166
    167#define HC_VER			0xd0
    168
    169#define HW_TEST(x)		(0xe0 + ((x) * 4))
    170
    171struct mxic_spi {
    172	struct device *dev;
    173	struct clk *ps_clk;
    174	struct clk *send_clk;
    175	struct clk *send_dly_clk;
    176	void __iomem *regs;
    177	u32 cur_speed_hz;
    178	struct {
    179		void __iomem *map;
    180		dma_addr_t dma;
    181		size_t size;
    182	} linear;
    183
    184	struct {
    185		bool use_pipelined_conf;
    186		struct nand_ecc_engine *pipelined_engine;
    187		void *ctx;
    188	} ecc;
    189};
    190
    191static int mxic_spi_clk_enable(struct mxic_spi *mxic)
    192{
    193	int ret;
    194
    195	ret = clk_prepare_enable(mxic->send_clk);
    196	if (ret)
    197		return ret;
    198
    199	ret = clk_prepare_enable(mxic->send_dly_clk);
    200	if (ret)
    201		goto err_send_dly_clk;
    202
    203	return ret;
    204
    205err_send_dly_clk:
    206	clk_disable_unprepare(mxic->send_clk);
    207
    208	return ret;
    209}
    210
    211static void mxic_spi_clk_disable(struct mxic_spi *mxic)
    212{
    213	clk_disable_unprepare(mxic->send_clk);
    214	clk_disable_unprepare(mxic->send_dly_clk);
    215}
    216
    217static void mxic_spi_set_input_delay_dqs(struct mxic_spi *mxic, u8 idly_code)
    218{
    219	writel(IDLY_CODE_VAL(0, idly_code) |
    220	       IDLY_CODE_VAL(1, idly_code) |
    221	       IDLY_CODE_VAL(2, idly_code) |
    222	       IDLY_CODE_VAL(3, idly_code),
    223	       mxic->regs + IDLY_CODE(0));
    224	writel(IDLY_CODE_VAL(4, idly_code) |
    225	       IDLY_CODE_VAL(5, idly_code) |
    226	       IDLY_CODE_VAL(6, idly_code) |
    227	       IDLY_CODE_VAL(7, idly_code),
    228	       mxic->regs + IDLY_CODE(1));
    229}
    230
    231static int mxic_spi_clk_setup(struct mxic_spi *mxic, unsigned long freq)
    232{
    233	int ret;
    234
    235	ret = clk_set_rate(mxic->send_clk, freq);
    236	if (ret)
    237		return ret;
    238
    239	ret = clk_set_rate(mxic->send_dly_clk, freq);
    240	if (ret)
    241		return ret;
    242
    243	/*
    244	 * A constant delay range from 0x0 ~ 0x1F for input delay,
    245	 * the unit is 78 ps, the max input delay is 2.418 ns.
    246	 */
    247	mxic_spi_set_input_delay_dqs(mxic, 0xf);
    248
    249	/*
    250	 * Phase degree = 360 * freq * output-delay
    251	 * where output-delay is a constant value 1 ns in FPGA.
    252	 *
    253	 * Get Phase degree = 360 * freq * 1 ns
    254	 *                  = 360 * freq * 1 sec / 1000000000
    255	 *                  = 9 * freq / 25000000
    256	 */
    257	ret = clk_set_phase(mxic->send_dly_clk, 9 * freq / 25000000);
    258	if (ret)
    259		return ret;
    260
    261	return 0;
    262}
    263
    264static int mxic_spi_set_freq(struct mxic_spi *mxic, unsigned long freq)
    265{
    266	int ret;
    267
    268	if (mxic->cur_speed_hz == freq)
    269		return 0;
    270
    271	mxic_spi_clk_disable(mxic);
    272	ret = mxic_spi_clk_setup(mxic, freq);
    273	if (ret)
    274		return ret;
    275
    276	ret = mxic_spi_clk_enable(mxic);
    277	if (ret)
    278		return ret;
    279
    280	mxic->cur_speed_hz = freq;
    281
    282	return 0;
    283}
    284
    285static void mxic_spi_hw_init(struct mxic_spi *mxic)
    286{
    287	writel(0, mxic->regs + DATA_STROB);
    288	writel(INT_STS_ALL, mxic->regs + INT_STS_EN);
    289	writel(0, mxic->regs + HC_EN);
    290	writel(0, mxic->regs + LRD_CFG);
    291	writel(0, mxic->regs + LRD_CTRL);
    292	writel(HC_CFG_NIO(1) | HC_CFG_TYPE(0, HC_CFG_TYPE_SPI_NOR) |
    293	       HC_CFG_SLV_ACT(0) | HC_CFG_MAN_CS_EN | HC_CFG_IDLE_SIO_LVL(1),
    294	       mxic->regs + HC_CFG);
    295}
    296
    297static u32 mxic_spi_prep_hc_cfg(struct spi_device *spi, u32 flags)
    298{
    299	int nio = 1;
    300
    301	if (spi->mode & (SPI_TX_OCTAL | SPI_RX_OCTAL))
    302		nio = 8;
    303	else if (spi->mode & (SPI_TX_QUAD | SPI_RX_QUAD))
    304		nio = 4;
    305	else if (spi->mode & (SPI_TX_DUAL | SPI_RX_DUAL))
    306		nio = 2;
    307
    308	return flags | HC_CFG_NIO(nio) |
    309	       HC_CFG_TYPE(spi->chip_select, HC_CFG_TYPE_SPI_NOR) |
    310	       HC_CFG_SLV_ACT(spi->chip_select) | HC_CFG_IDLE_SIO_LVL(1);
    311}
    312
    313static u32 mxic_spi_mem_prep_op_cfg(const struct spi_mem_op *op,
    314				    unsigned int data_len)
    315{
    316	u32 cfg = OP_CMD_BYTES(op->cmd.nbytes) |
    317		  OP_CMD_BUSW(fls(op->cmd.buswidth) - 1) |
    318		  (op->cmd.dtr ? OP_CMD_DDR : 0);
    319
    320	if (op->addr.nbytes)
    321		cfg |= OP_ADDR_BYTES(op->addr.nbytes) |
    322		       OP_ADDR_BUSW(fls(op->addr.buswidth) - 1) |
    323		       (op->addr.dtr ? OP_ADDR_DDR : 0);
    324
    325	if (op->dummy.nbytes)
    326		cfg |= OP_DUMMY_CYC(op->dummy.nbytes);
    327
    328	/* Direct mapping data.nbytes field is not populated */
    329	if (data_len) {
    330		cfg |= OP_DATA_BUSW(fls(op->data.buswidth) - 1) |
    331		       (op->data.dtr ? OP_DATA_DDR : 0);
    332		if (op->data.dir == SPI_MEM_DATA_IN) {
    333			cfg |= OP_READ;
    334			if (op->data.dtr)
    335				cfg |= OP_DQS_EN;
    336		}
    337	}
    338
    339	return cfg;
    340}
    341
    342static int mxic_spi_data_xfer(struct mxic_spi *mxic, const void *txbuf,
    343			      void *rxbuf, unsigned int len)
    344{
    345	unsigned int pos = 0;
    346
    347	while (pos < len) {
    348		unsigned int nbytes = len - pos;
    349		u32 data = 0xffffffff;
    350		u32 sts;
    351		int ret;
    352
    353		if (nbytes > 4)
    354			nbytes = 4;
    355
    356		if (txbuf)
    357			memcpy(&data, txbuf + pos, nbytes);
    358
    359		ret = readl_poll_timeout(mxic->regs + INT_STS, sts,
    360					 sts & INT_TX_EMPTY, 0, USEC_PER_SEC);
    361		if (ret)
    362			return ret;
    363
    364		writel(data, mxic->regs + TXD(nbytes % 4));
    365
    366		ret = readl_poll_timeout(mxic->regs + INT_STS, sts,
    367					 sts & INT_TX_EMPTY, 0, USEC_PER_SEC);
    368		if (ret)
    369			return ret;
    370
    371		ret = readl_poll_timeout(mxic->regs + INT_STS, sts,
    372					 sts & INT_RX_NOT_EMPTY, 0,
    373					 USEC_PER_SEC);
    374		if (ret)
    375			return ret;
    376
    377		data = readl(mxic->regs + RXD);
    378		if (rxbuf) {
    379			data >>= (8 * (4 - nbytes));
    380			memcpy(rxbuf + pos, &data, nbytes);
    381		}
    382		WARN_ON(readl(mxic->regs + INT_STS) & INT_RX_NOT_EMPTY);
    383
    384		pos += nbytes;
    385	}
    386
    387	return 0;
    388}
    389
    390static ssize_t mxic_spi_mem_dirmap_read(struct spi_mem_dirmap_desc *desc,
    391					u64 offs, size_t len, void *buf)
    392{
    393	struct mxic_spi *mxic = spi_master_get_devdata(desc->mem->spi->master);
    394	int ret;
    395	u32 sts;
    396
    397	if (WARN_ON(offs + desc->info.offset + len > U32_MAX))
    398		return -EINVAL;
    399
    400	writel(mxic_spi_prep_hc_cfg(desc->mem->spi, 0), mxic->regs + HC_CFG);
    401
    402	writel(mxic_spi_mem_prep_op_cfg(&desc->info.op_tmpl, len),
    403	       mxic->regs + LRD_CFG);
    404	writel(desc->info.offset + offs, mxic->regs + LRD_ADDR);
    405	len = min_t(size_t, len, mxic->linear.size);
    406	writel(len, mxic->regs + LRD_RANGE);
    407	writel(LMODE_CMD0(desc->info.op_tmpl.cmd.opcode) |
    408	       LMODE_SLV_ACT(desc->mem->spi->chip_select) |
    409	       LMODE_EN,
    410	       mxic->regs + LRD_CTRL);
    411
    412	if (mxic->ecc.use_pipelined_conf && desc->info.op_tmpl.data.ecc) {
    413		ret = mxic_ecc_process_data_pipelined(mxic->ecc.pipelined_engine,
    414						      NAND_PAGE_READ,
    415						      mxic->linear.dma + offs);
    416		if (ret)
    417			return ret;
    418	} else {
    419		memcpy_fromio(buf, mxic->linear.map, len);
    420	}
    421
    422	writel(INT_LRD_DIS, mxic->regs + INT_STS);
    423	writel(0, mxic->regs + LRD_CTRL);
    424
    425	ret = readl_poll_timeout(mxic->regs + INT_STS, sts,
    426				 sts & INT_LRD_DIS, 0, USEC_PER_SEC);
    427	if (ret)
    428		return ret;
    429
    430	return len;
    431}
    432
    433static ssize_t mxic_spi_mem_dirmap_write(struct spi_mem_dirmap_desc *desc,
    434					 u64 offs, size_t len,
    435					 const void *buf)
    436{
    437	struct mxic_spi *mxic = spi_master_get_devdata(desc->mem->spi->master);
    438	u32 sts;
    439	int ret;
    440
    441	if (WARN_ON(offs + desc->info.offset + len > U32_MAX))
    442		return -EINVAL;
    443
    444	writel(mxic_spi_prep_hc_cfg(desc->mem->spi, 0), mxic->regs + HC_CFG);
    445
    446	writel(mxic_spi_mem_prep_op_cfg(&desc->info.op_tmpl, len),
    447	       mxic->regs + LWR_CFG);
    448	writel(desc->info.offset + offs, mxic->regs + LWR_ADDR);
    449	len = min_t(size_t, len, mxic->linear.size);
    450	writel(len, mxic->regs + LWR_RANGE);
    451	writel(LMODE_CMD0(desc->info.op_tmpl.cmd.opcode) |
    452	       LMODE_SLV_ACT(desc->mem->spi->chip_select) |
    453	       LMODE_EN,
    454	       mxic->regs + LWR_CTRL);
    455
    456	if (mxic->ecc.use_pipelined_conf && desc->info.op_tmpl.data.ecc) {
    457		ret = mxic_ecc_process_data_pipelined(mxic->ecc.pipelined_engine,
    458						      NAND_PAGE_WRITE,
    459						      mxic->linear.dma + offs);
    460		if (ret)
    461			return ret;
    462	} else {
    463		memcpy_toio(mxic->linear.map, buf, len);
    464	}
    465
    466	writel(INT_LWR_DIS, mxic->regs + INT_STS);
    467	writel(0, mxic->regs + LWR_CTRL);
    468
    469	ret = readl_poll_timeout(mxic->regs + INT_STS, sts,
    470				 sts & INT_LWR_DIS, 0, USEC_PER_SEC);
    471	if (ret)
    472		return ret;
    473
    474	return len;
    475}
    476
    477static bool mxic_spi_mem_supports_op(struct spi_mem *mem,
    478				     const struct spi_mem_op *op)
    479{
    480	if (op->data.buswidth > 8 || op->addr.buswidth > 8 ||
    481	    op->dummy.buswidth > 8 || op->cmd.buswidth > 8)
    482		return false;
    483
    484	if (op->data.nbytes && op->dummy.nbytes &&
    485	    op->data.buswidth != op->dummy.buswidth)
    486		return false;
    487
    488	if (op->addr.nbytes > 7)
    489		return false;
    490
    491	return spi_mem_default_supports_op(mem, op);
    492}
    493
    494static int mxic_spi_mem_dirmap_create(struct spi_mem_dirmap_desc *desc)
    495{
    496	struct mxic_spi *mxic = spi_master_get_devdata(desc->mem->spi->master);
    497
    498	if (!mxic->linear.map)
    499		return -EINVAL;
    500
    501	if (desc->info.offset + desc->info.length > U32_MAX)
    502		return -EINVAL;
    503
    504	if (!mxic_spi_mem_supports_op(desc->mem, &desc->info.op_tmpl))
    505		return -EOPNOTSUPP;
    506
    507	return 0;
    508}
    509
    510static int mxic_spi_mem_exec_op(struct spi_mem *mem,
    511				const struct spi_mem_op *op)
    512{
    513	struct mxic_spi *mxic = spi_master_get_devdata(mem->spi->master);
    514	int i, ret;
    515	u8 addr[8], cmd[2];
    516
    517	ret = mxic_spi_set_freq(mxic, mem->spi->max_speed_hz);
    518	if (ret)
    519		return ret;
    520
    521	writel(mxic_spi_prep_hc_cfg(mem->spi, HC_CFG_MAN_CS_EN),
    522	       mxic->regs + HC_CFG);
    523
    524	writel(HC_EN_BIT, mxic->regs + HC_EN);
    525
    526	writel(mxic_spi_mem_prep_op_cfg(op, op->data.nbytes),
    527	       mxic->regs + SS_CTRL(mem->spi->chip_select));
    528
    529	writel(readl(mxic->regs + HC_CFG) | HC_CFG_MAN_CS_ASSERT,
    530	       mxic->regs + HC_CFG);
    531
    532	for (i = 0; i < op->cmd.nbytes; i++)
    533		cmd[i] = op->cmd.opcode >> (8 * (op->cmd.nbytes - i - 1));
    534
    535	ret = mxic_spi_data_xfer(mxic, cmd, NULL, op->cmd.nbytes);
    536	if (ret)
    537		goto out;
    538
    539	for (i = 0; i < op->addr.nbytes; i++)
    540		addr[i] = op->addr.val >> (8 * (op->addr.nbytes - i - 1));
    541
    542	ret = mxic_spi_data_xfer(mxic, addr, NULL, op->addr.nbytes);
    543	if (ret)
    544		goto out;
    545
    546	ret = mxic_spi_data_xfer(mxic, NULL, NULL, op->dummy.nbytes);
    547	if (ret)
    548		goto out;
    549
    550	ret = mxic_spi_data_xfer(mxic,
    551				 op->data.dir == SPI_MEM_DATA_OUT ?
    552				 op->data.buf.out : NULL,
    553				 op->data.dir == SPI_MEM_DATA_IN ?
    554				 op->data.buf.in : NULL,
    555				 op->data.nbytes);
    556
    557out:
    558	writel(readl(mxic->regs + HC_CFG) & ~HC_CFG_MAN_CS_ASSERT,
    559	       mxic->regs + HC_CFG);
    560	writel(0, mxic->regs + HC_EN);
    561
    562	return ret;
    563}
    564
    565static const struct spi_controller_mem_ops mxic_spi_mem_ops = {
    566	.supports_op = mxic_spi_mem_supports_op,
    567	.exec_op = mxic_spi_mem_exec_op,
    568	.dirmap_create = mxic_spi_mem_dirmap_create,
    569	.dirmap_read = mxic_spi_mem_dirmap_read,
    570	.dirmap_write = mxic_spi_mem_dirmap_write,
    571};
    572
    573static const struct spi_controller_mem_caps mxic_spi_mem_caps = {
    574	.dtr = true,
    575	.ecc = true,
    576};
    577
    578static void mxic_spi_set_cs(struct spi_device *spi, bool lvl)
    579{
    580	struct mxic_spi *mxic = spi_master_get_devdata(spi->master);
    581
    582	if (!lvl) {
    583		writel(readl(mxic->regs + HC_CFG) | HC_CFG_MAN_CS_EN,
    584		       mxic->regs + HC_CFG);
    585		writel(HC_EN_BIT, mxic->regs + HC_EN);
    586		writel(readl(mxic->regs + HC_CFG) | HC_CFG_MAN_CS_ASSERT,
    587		       mxic->regs + HC_CFG);
    588	} else {
    589		writel(readl(mxic->regs + HC_CFG) & ~HC_CFG_MAN_CS_ASSERT,
    590		       mxic->regs + HC_CFG);
    591		writel(0, mxic->regs + HC_EN);
    592	}
    593}
    594
    595static int mxic_spi_transfer_one(struct spi_master *master,
    596				 struct spi_device *spi,
    597				 struct spi_transfer *t)
    598{
    599	struct mxic_spi *mxic = spi_master_get_devdata(master);
    600	unsigned int busw = OP_BUSW_1;
    601	int ret;
    602
    603	if (t->rx_buf && t->tx_buf) {
    604		if (((spi->mode & SPI_TX_QUAD) &&
    605		     !(spi->mode & SPI_RX_QUAD)) ||
    606		    ((spi->mode & SPI_TX_DUAL) &&
    607		     !(spi->mode & SPI_RX_DUAL)))
    608			return -ENOTSUPP;
    609	}
    610
    611	ret = mxic_spi_set_freq(mxic, t->speed_hz);
    612	if (ret)
    613		return ret;
    614
    615	if (t->tx_buf) {
    616		if (spi->mode & SPI_TX_QUAD)
    617			busw = OP_BUSW_4;
    618		else if (spi->mode & SPI_TX_DUAL)
    619			busw = OP_BUSW_2;
    620	} else if (t->rx_buf) {
    621		if (spi->mode & SPI_RX_QUAD)
    622			busw = OP_BUSW_4;
    623		else if (spi->mode & SPI_RX_DUAL)
    624			busw = OP_BUSW_2;
    625	}
    626
    627	writel(OP_CMD_BYTES(1) | OP_CMD_BUSW(busw) |
    628	       OP_DATA_BUSW(busw) | (t->rx_buf ? OP_READ : 0),
    629	       mxic->regs + SS_CTRL(0));
    630
    631	ret = mxic_spi_data_xfer(mxic, t->tx_buf, t->rx_buf, t->len);
    632	if (ret)
    633		return ret;
    634
    635	spi_finalize_current_transfer(master);
    636
    637	return 0;
    638}
    639
    640/* ECC wrapper */
    641static int mxic_spi_mem_ecc_init_ctx(struct nand_device *nand)
    642{
    643	struct nand_ecc_engine_ops *ops = mxic_ecc_get_pipelined_ops();
    644	struct mxic_spi *mxic = nand->ecc.engine->priv;
    645
    646	mxic->ecc.use_pipelined_conf = true;
    647
    648	return ops->init_ctx(nand);
    649}
    650
    651static void mxic_spi_mem_ecc_cleanup_ctx(struct nand_device *nand)
    652{
    653	struct nand_ecc_engine_ops *ops = mxic_ecc_get_pipelined_ops();
    654	struct mxic_spi *mxic = nand->ecc.engine->priv;
    655
    656	mxic->ecc.use_pipelined_conf = false;
    657
    658	ops->cleanup_ctx(nand);
    659}
    660
    661static int mxic_spi_mem_ecc_prepare_io_req(struct nand_device *nand,
    662					   struct nand_page_io_req *req)
    663{
    664	struct nand_ecc_engine_ops *ops = mxic_ecc_get_pipelined_ops();
    665
    666	return ops->prepare_io_req(nand, req);
    667}
    668
    669static int mxic_spi_mem_ecc_finish_io_req(struct nand_device *nand,
    670					  struct nand_page_io_req *req)
    671{
    672	struct nand_ecc_engine_ops *ops = mxic_ecc_get_pipelined_ops();
    673
    674	return ops->finish_io_req(nand, req);
    675}
    676
    677static struct nand_ecc_engine_ops mxic_spi_mem_ecc_engine_pipelined_ops = {
    678	.init_ctx = mxic_spi_mem_ecc_init_ctx,
    679	.cleanup_ctx = mxic_spi_mem_ecc_cleanup_ctx,
    680	.prepare_io_req = mxic_spi_mem_ecc_prepare_io_req,
    681	.finish_io_req = mxic_spi_mem_ecc_finish_io_req,
    682};
    683
    684static void mxic_spi_mem_ecc_remove(struct mxic_spi *mxic)
    685{
    686	if (mxic->ecc.pipelined_engine) {
    687		mxic_ecc_put_pipelined_engine(mxic->ecc.pipelined_engine);
    688		nand_ecc_unregister_on_host_hw_engine(mxic->ecc.pipelined_engine);
    689	}
    690}
    691
    692static int mxic_spi_mem_ecc_probe(struct platform_device *pdev,
    693				  struct mxic_spi *mxic)
    694{
    695	struct nand_ecc_engine *eng;
    696
    697	if (!mxic_ecc_get_pipelined_ops())
    698		return -EOPNOTSUPP;
    699
    700	eng = mxic_ecc_get_pipelined_engine(pdev);
    701	if (IS_ERR(eng))
    702		return PTR_ERR(eng);
    703
    704	eng->dev = &pdev->dev;
    705	eng->integration = NAND_ECC_ENGINE_INTEGRATION_PIPELINED;
    706	eng->ops = &mxic_spi_mem_ecc_engine_pipelined_ops;
    707	eng->priv = mxic;
    708	mxic->ecc.pipelined_engine = eng;
    709	nand_ecc_register_on_host_hw_engine(eng);
    710
    711	return 0;
    712}
    713
    714static int __maybe_unused mxic_spi_runtime_suspend(struct device *dev)
    715{
    716	struct spi_master *master = dev_get_drvdata(dev);
    717	struct mxic_spi *mxic = spi_master_get_devdata(master);
    718
    719	mxic_spi_clk_disable(mxic);
    720	clk_disable_unprepare(mxic->ps_clk);
    721
    722	return 0;
    723}
    724
    725static int __maybe_unused mxic_spi_runtime_resume(struct device *dev)
    726{
    727	struct spi_master *master = dev_get_drvdata(dev);
    728	struct mxic_spi *mxic = spi_master_get_devdata(master);
    729	int ret;
    730
    731	ret = clk_prepare_enable(mxic->ps_clk);
    732	if (ret) {
    733		dev_err(dev, "Cannot enable ps_clock.\n");
    734		return ret;
    735	}
    736
    737	return mxic_spi_clk_enable(mxic);
    738}
    739
    740static const struct dev_pm_ops mxic_spi_dev_pm_ops = {
    741	SET_RUNTIME_PM_OPS(mxic_spi_runtime_suspend,
    742			   mxic_spi_runtime_resume, NULL)
    743};
    744
    745static int mxic_spi_probe(struct platform_device *pdev)
    746{
    747	struct spi_master *master;
    748	struct resource *res;
    749	struct mxic_spi *mxic;
    750	int ret;
    751
    752	master = devm_spi_alloc_master(&pdev->dev, sizeof(struct mxic_spi));
    753	if (!master)
    754		return -ENOMEM;
    755
    756	platform_set_drvdata(pdev, master);
    757
    758	mxic = spi_master_get_devdata(master);
    759	mxic->dev = &pdev->dev;
    760
    761	master->dev.of_node = pdev->dev.of_node;
    762
    763	mxic->ps_clk = devm_clk_get(&pdev->dev, "ps_clk");
    764	if (IS_ERR(mxic->ps_clk))
    765		return PTR_ERR(mxic->ps_clk);
    766
    767	mxic->send_clk = devm_clk_get(&pdev->dev, "send_clk");
    768	if (IS_ERR(mxic->send_clk))
    769		return PTR_ERR(mxic->send_clk);
    770
    771	mxic->send_dly_clk = devm_clk_get(&pdev->dev, "send_dly_clk");
    772	if (IS_ERR(mxic->send_dly_clk))
    773		return PTR_ERR(mxic->send_dly_clk);
    774
    775	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs");
    776	mxic->regs = devm_ioremap_resource(&pdev->dev, res);
    777	if (IS_ERR(mxic->regs))
    778		return PTR_ERR(mxic->regs);
    779
    780	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dirmap");
    781	mxic->linear.map = devm_ioremap_resource(&pdev->dev, res);
    782	if (!IS_ERR(mxic->linear.map)) {
    783		mxic->linear.dma = res->start;
    784		mxic->linear.size = resource_size(res);
    785	} else {
    786		mxic->linear.map = NULL;
    787	}
    788
    789	pm_runtime_enable(&pdev->dev);
    790	master->auto_runtime_pm = true;
    791
    792	master->num_chipselect = 1;
    793	master->mem_ops = &mxic_spi_mem_ops;
    794	master->mem_caps = &mxic_spi_mem_caps;
    795
    796	master->set_cs = mxic_spi_set_cs;
    797	master->transfer_one = mxic_spi_transfer_one;
    798	master->bits_per_word_mask = SPI_BPW_MASK(8);
    799	master->mode_bits = SPI_CPOL | SPI_CPHA |
    800			SPI_RX_DUAL | SPI_TX_DUAL |
    801			SPI_RX_QUAD | SPI_TX_QUAD |
    802			SPI_RX_OCTAL | SPI_TX_OCTAL;
    803
    804	mxic_spi_hw_init(mxic);
    805
    806	ret = mxic_spi_mem_ecc_probe(pdev, mxic);
    807	if (ret == -EPROBE_DEFER) {
    808		pm_runtime_disable(&pdev->dev);
    809		return ret;
    810	}
    811
    812	ret = spi_register_master(master);
    813	if (ret) {
    814		dev_err(&pdev->dev, "spi_register_master failed\n");
    815		pm_runtime_disable(&pdev->dev);
    816		mxic_spi_mem_ecc_remove(mxic);
    817	}
    818
    819	return ret;
    820}
    821
    822static int mxic_spi_remove(struct platform_device *pdev)
    823{
    824	struct spi_master *master = platform_get_drvdata(pdev);
    825	struct mxic_spi *mxic = spi_master_get_devdata(master);
    826
    827	pm_runtime_disable(&pdev->dev);
    828	mxic_spi_mem_ecc_remove(mxic);
    829	spi_unregister_master(master);
    830
    831	return 0;
    832}
    833
    834static const struct of_device_id mxic_spi_of_ids[] = {
    835	{ .compatible = "mxicy,mx25f0a-spi", },
    836	{ /* sentinel */ }
    837};
    838MODULE_DEVICE_TABLE(of, mxic_spi_of_ids);
    839
    840static struct platform_driver mxic_spi_driver = {
    841	.probe = mxic_spi_probe,
    842	.remove = mxic_spi_remove,
    843	.driver = {
    844		.name = "mxic-spi",
    845		.of_match_table = mxic_spi_of_ids,
    846		.pm = &mxic_spi_dev_pm_ops,
    847	},
    848};
    849module_platform_driver(mxic_spi_driver);
    850
    851MODULE_AUTHOR("Mason Yang <masonccyang@mxic.com.tw>");
    852MODULE_DESCRIPTION("MX25F0A SPI controller driver");
    853MODULE_LICENSE("GPL v2");