xref: /openbmc/linux/drivers/spi/spi-rockchip.c (revision 64e36824b32b061a9537dc2e026977806f75846f)
1*64e36824Saddy ke /*
2*64e36824Saddy ke  * Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd
3*64e36824Saddy ke  * Author: addy ke <addy.ke@rock-chips.com>
4*64e36824Saddy ke  *
5*64e36824Saddy ke  * This program is free software; you can redistribute it and/or modify it
6*64e36824Saddy ke  * under the terms and conditions of the GNU General Public License,
7*64e36824Saddy ke  * version 2, as published by the Free Software Foundation.
8*64e36824Saddy ke  *
9*64e36824Saddy ke  * This program is distributed in the hope it will be useful, but WITHOUT
10*64e36824Saddy ke  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11*64e36824Saddy ke  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
12*64e36824Saddy ke  * more details.
13*64e36824Saddy ke  *
14*64e36824Saddy ke  */
15*64e36824Saddy ke 
16*64e36824Saddy ke #include <linux/init.h>
17*64e36824Saddy ke #include <linux/module.h>
18*64e36824Saddy ke #include <linux/clk.h>
19*64e36824Saddy ke #include <linux/err.h>
20*64e36824Saddy ke #include <linux/delay.h>
21*64e36824Saddy ke #include <linux/interrupt.h>
22*64e36824Saddy ke #include <linux/platform_device.h>
23*64e36824Saddy ke #include <linux/slab.h>
24*64e36824Saddy ke #include <linux/spi/spi.h>
25*64e36824Saddy ke #include <linux/scatterlist.h>
26*64e36824Saddy ke #include <linux/of.h>
27*64e36824Saddy ke #include <linux/pm_runtime.h>
28*64e36824Saddy ke #include <linux/io.h>
29*64e36824Saddy ke #include <linux/scatterlist.h>
30*64e36824Saddy ke #include <linux/dmaengine.h>
31*64e36824Saddy ke 
32*64e36824Saddy ke #define DRIVER_NAME "rockchip-spi"
33*64e36824Saddy ke 
34*64e36824Saddy ke /* SPI register offsets */
35*64e36824Saddy ke #define ROCKCHIP_SPI_CTRLR0			0x0000
36*64e36824Saddy ke #define ROCKCHIP_SPI_CTRLR1			0x0004
37*64e36824Saddy ke #define ROCKCHIP_SPI_SSIENR			0x0008
38*64e36824Saddy ke #define ROCKCHIP_SPI_SER			0x000c
39*64e36824Saddy ke #define ROCKCHIP_SPI_BAUDR			0x0010
40*64e36824Saddy ke #define ROCKCHIP_SPI_TXFTLR			0x0014
41*64e36824Saddy ke #define ROCKCHIP_SPI_RXFTLR			0x0018
42*64e36824Saddy ke #define ROCKCHIP_SPI_TXFLR			0x001c
43*64e36824Saddy ke #define ROCKCHIP_SPI_RXFLR			0x0020
44*64e36824Saddy ke #define ROCKCHIP_SPI_SR				0x0024
45*64e36824Saddy ke #define ROCKCHIP_SPI_IPR			0x0028
46*64e36824Saddy ke #define ROCKCHIP_SPI_IMR			0x002c
47*64e36824Saddy ke #define ROCKCHIP_SPI_ISR			0x0030
48*64e36824Saddy ke #define ROCKCHIP_SPI_RISR			0x0034
49*64e36824Saddy ke #define ROCKCHIP_SPI_ICR			0x0038
50*64e36824Saddy ke #define ROCKCHIP_SPI_DMACR			0x003c
51*64e36824Saddy ke #define ROCKCHIP_SPI_DMATDLR		0x0040
52*64e36824Saddy ke #define ROCKCHIP_SPI_DMARDLR		0x0044
53*64e36824Saddy ke #define ROCKCHIP_SPI_TXDR			0x0400
54*64e36824Saddy ke #define ROCKCHIP_SPI_RXDR			0x0800
55*64e36824Saddy ke 
56*64e36824Saddy ke /* Bit fields in CTRLR0 */
57*64e36824Saddy ke #define CR0_DFS_OFFSET				0
58*64e36824Saddy ke 
59*64e36824Saddy ke #define CR0_CFS_OFFSET				2
60*64e36824Saddy ke 
61*64e36824Saddy ke #define CR0_SCPH_OFFSET				6
62*64e36824Saddy ke 
63*64e36824Saddy ke #define CR0_SCPOL_OFFSET			7
64*64e36824Saddy ke 
65*64e36824Saddy ke #define CR0_CSM_OFFSET				8
66*64e36824Saddy ke #define CR0_CSM_KEEP				0x0
67*64e36824Saddy ke /* ss_n be high for half sclk_out cycles */
68*64e36824Saddy ke #define CR0_CSM_HALF				0X1
69*64e36824Saddy ke /* ss_n be high for one sclk_out cycle */
70*64e36824Saddy ke #define CR0_CSM_ONE					0x2
71*64e36824Saddy ke 
72*64e36824Saddy ke /* ss_n to sclk_out delay */
73*64e36824Saddy ke #define CR0_SSD_OFFSET				10
74*64e36824Saddy ke /*
75*64e36824Saddy ke  * The period between ss_n active and
76*64e36824Saddy ke  * sclk_out active is half sclk_out cycles
77*64e36824Saddy ke  */
78*64e36824Saddy ke #define CR0_SSD_HALF				0x0
79*64e36824Saddy ke /*
80*64e36824Saddy ke  * The period between ss_n active and
81*64e36824Saddy ke  * sclk_out active is one sclk_out cycle
82*64e36824Saddy ke  */
83*64e36824Saddy ke #define CR0_SSD_ONE					0x1
84*64e36824Saddy ke 
85*64e36824Saddy ke #define CR0_EM_OFFSET				11
86*64e36824Saddy ke #define CR0_EM_LITTLE				0x0
87*64e36824Saddy ke #define CR0_EM_BIG					0x1
88*64e36824Saddy ke 
89*64e36824Saddy ke #define CR0_FBM_OFFSET				12
90*64e36824Saddy ke #define CR0_FBM_MSB					0x0
91*64e36824Saddy ke #define CR0_FBM_LSB					0x1
92*64e36824Saddy ke 
93*64e36824Saddy ke #define CR0_BHT_OFFSET				13
94*64e36824Saddy ke #define CR0_BHT_16BIT				0x0
95*64e36824Saddy ke #define CR0_BHT_8BIT				0x1
96*64e36824Saddy ke 
97*64e36824Saddy ke #define CR0_RSD_OFFSET				14
98*64e36824Saddy ke 
99*64e36824Saddy ke #define CR0_FRF_OFFSET				16
100*64e36824Saddy ke #define CR0_FRF_SPI					0x0
101*64e36824Saddy ke #define CR0_FRF_SSP					0x1
102*64e36824Saddy ke #define CR0_FRF_MICROWIRE			0x2
103*64e36824Saddy ke 
104*64e36824Saddy ke #define CR0_XFM_OFFSET				18
105*64e36824Saddy ke #define CR0_XFM_MASK				(0x03 << SPI_XFM_OFFSET)
106*64e36824Saddy ke #define CR0_XFM_TR					0x0
107*64e36824Saddy ke #define CR0_XFM_TO					0x1
108*64e36824Saddy ke #define CR0_XFM_RO					0x2
109*64e36824Saddy ke 
110*64e36824Saddy ke #define CR0_OPM_OFFSET				20
111*64e36824Saddy ke #define CR0_OPM_MASTER				0x0
112*64e36824Saddy ke #define CR0_OPM_SLAVE				0x1
113*64e36824Saddy ke 
114*64e36824Saddy ke #define CR0_MTM_OFFSET				0x21
115*64e36824Saddy ke 
116*64e36824Saddy ke /* Bit fields in SER, 2bit */
117*64e36824Saddy ke #define SER_MASK					0x3
118*64e36824Saddy ke 
119*64e36824Saddy ke /* Bit fields in SR, 5bit */
120*64e36824Saddy ke #define SR_MASK						0x1f
121*64e36824Saddy ke #define SR_BUSY						(1 << 0)
122*64e36824Saddy ke #define SR_TF_FULL					(1 << 1)
123*64e36824Saddy ke #define SR_TF_EMPTY					(1 << 2)
124*64e36824Saddy ke #define SR_RF_EMPTY					(1 << 3)
125*64e36824Saddy ke #define SR_RF_FULL					(1 << 4)
126*64e36824Saddy ke 
127*64e36824Saddy ke /* Bit fields in ISR, IMR, ISR, RISR, 5bit */
128*64e36824Saddy ke #define INT_MASK					0x1f
129*64e36824Saddy ke #define INT_TF_EMPTY				(1 << 0)
130*64e36824Saddy ke #define INT_TF_OVERFLOW				(1 << 1)
131*64e36824Saddy ke #define INT_RF_UNDERFLOW			(1 << 2)
132*64e36824Saddy ke #define INT_RF_OVERFLOW				(1 << 3)
133*64e36824Saddy ke #define INT_RF_FULL					(1 << 4)
134*64e36824Saddy ke 
135*64e36824Saddy ke /* Bit fields in ICR, 4bit */
136*64e36824Saddy ke #define ICR_MASK					0x0f
137*64e36824Saddy ke #define ICR_ALL						(1 << 0)
138*64e36824Saddy ke #define ICR_RF_UNDERFLOW			(1 << 1)
139*64e36824Saddy ke #define ICR_RF_OVERFLOW				(1 << 2)
140*64e36824Saddy ke #define ICR_TF_OVERFLOW				(1 << 3)
141*64e36824Saddy ke 
142*64e36824Saddy ke /* Bit fields in DMACR */
143*64e36824Saddy ke #define RF_DMA_EN					(1 << 0)
144*64e36824Saddy ke #define TF_DMA_EN					(1 << 1)
145*64e36824Saddy ke 
146*64e36824Saddy ke #define RXBUSY						(1 << 0)
147*64e36824Saddy ke #define TXBUSY						(1 << 1)
148*64e36824Saddy ke 
149*64e36824Saddy ke enum rockchip_ssi_type {
150*64e36824Saddy ke 	SSI_MOTO_SPI = 0,
151*64e36824Saddy ke 	SSI_TI_SSP,
152*64e36824Saddy ke 	SSI_NS_MICROWIRE,
153*64e36824Saddy ke };
154*64e36824Saddy ke 
155*64e36824Saddy ke struct rockchip_spi_dma_data {
156*64e36824Saddy ke 	struct dma_chan *ch;
157*64e36824Saddy ke 	enum dma_transfer_direction direction;
158*64e36824Saddy ke 	dma_addr_t addr;
159*64e36824Saddy ke };
160*64e36824Saddy ke 
161*64e36824Saddy ke struct rockchip_spi {
162*64e36824Saddy ke 	struct device *dev;
163*64e36824Saddy ke 	struct spi_master *master;
164*64e36824Saddy ke 
165*64e36824Saddy ke 	struct clk *spiclk;
166*64e36824Saddy ke 	struct clk *apb_pclk;
167*64e36824Saddy ke 
168*64e36824Saddy ke 	void __iomem *regs;
169*64e36824Saddy ke 	/*depth of the FIFO buffer */
170*64e36824Saddy ke 	u32 fifo_len;
171*64e36824Saddy ke 	/* max bus freq supported */
172*64e36824Saddy ke 	u32 max_freq;
173*64e36824Saddy ke 	/* supported slave numbers */
174*64e36824Saddy ke 	enum rockchip_ssi_type type;
175*64e36824Saddy ke 
176*64e36824Saddy ke 	u16 mode;
177*64e36824Saddy ke 	u8 tmode;
178*64e36824Saddy ke 	u8 bpw;
179*64e36824Saddy ke 	u8 n_bytes;
180*64e36824Saddy ke 	unsigned len;
181*64e36824Saddy ke 	u32 speed;
182*64e36824Saddy ke 
183*64e36824Saddy ke 	const void *tx;
184*64e36824Saddy ke 	const void *tx_end;
185*64e36824Saddy ke 	void *rx;
186*64e36824Saddy ke 	void *rx_end;
187*64e36824Saddy ke 
188*64e36824Saddy ke 	u32 state;
189*64e36824Saddy ke 
190*64e36824Saddy ke 	spinlock_t lock;
191*64e36824Saddy ke 
192*64e36824Saddy ke 	struct completion xfer_completion;
193*64e36824Saddy ke 
194*64e36824Saddy ke 	u32 use_dma;
195*64e36824Saddy ke 	struct sg_table tx_sg;
196*64e36824Saddy ke 	struct sg_table rx_sg;
197*64e36824Saddy ke 	struct rockchip_spi_dma_data dma_rx;
198*64e36824Saddy ke 	struct rockchip_spi_dma_data dma_tx;
199*64e36824Saddy ke };
200*64e36824Saddy ke 
201*64e36824Saddy ke static inline void spi_enable_chip(struct rockchip_spi *rs, int enable)
202*64e36824Saddy ke {
203*64e36824Saddy ke 	writel_relaxed((enable ? 1 : 0), rs->regs + ROCKCHIP_SPI_SSIENR);
204*64e36824Saddy ke }
205*64e36824Saddy ke 
206*64e36824Saddy ke static inline void spi_set_clk(struct rockchip_spi *rs, u16 div)
207*64e36824Saddy ke {
208*64e36824Saddy ke 	writel_relaxed(div, rs->regs + ROCKCHIP_SPI_BAUDR);
209*64e36824Saddy ke }
210*64e36824Saddy ke 
211*64e36824Saddy ke static inline void flush_fifo(struct rockchip_spi *rs)
212*64e36824Saddy ke {
213*64e36824Saddy ke 	while (readl_relaxed(rs->regs + ROCKCHIP_SPI_RXFLR))
214*64e36824Saddy ke 		readl_relaxed(rs->regs + ROCKCHIP_SPI_RXDR);
215*64e36824Saddy ke }
216*64e36824Saddy ke 
217*64e36824Saddy ke static u32 get_fifo_len(struct rockchip_spi *rs)
218*64e36824Saddy ke {
219*64e36824Saddy ke 	u32 fifo;
220*64e36824Saddy ke 
221*64e36824Saddy ke 	for (fifo = 2; fifo < 32; fifo++) {
222*64e36824Saddy ke 		writel_relaxed(fifo, rs->regs + ROCKCHIP_SPI_TXFTLR);
223*64e36824Saddy ke 		if (fifo != readl_relaxed(rs->regs + ROCKCHIP_SPI_TXFTLR))
224*64e36824Saddy ke 			break;
225*64e36824Saddy ke 	}
226*64e36824Saddy ke 
227*64e36824Saddy ke 	writel_relaxed(0, rs->regs + ROCKCHIP_SPI_TXFTLR);
228*64e36824Saddy ke 
229*64e36824Saddy ke 	return (fifo == 31) ? 0 : fifo;
230*64e36824Saddy ke }
231*64e36824Saddy ke 
232*64e36824Saddy ke static inline u32 tx_max(struct rockchip_spi *rs)
233*64e36824Saddy ke {
234*64e36824Saddy ke 	u32 tx_left, tx_room;
235*64e36824Saddy ke 
236*64e36824Saddy ke 	tx_left = (rs->tx_end - rs->tx) / rs->n_bytes;
237*64e36824Saddy ke 	tx_room = rs->fifo_len - readl_relaxed(rs->regs + ROCKCHIP_SPI_TXFLR);
238*64e36824Saddy ke 
239*64e36824Saddy ke 	return min(tx_left, tx_room);
240*64e36824Saddy ke }
241*64e36824Saddy ke 
242*64e36824Saddy ke static inline u32 rx_max(struct rockchip_spi *rs)
243*64e36824Saddy ke {
244*64e36824Saddy ke 	u32 rx_left = (rs->rx_end - rs->rx) / rs->n_bytes;
245*64e36824Saddy ke 	u32 rx_room = (u32)readl_relaxed(rs->regs + ROCKCHIP_SPI_RXFLR);
246*64e36824Saddy ke 
247*64e36824Saddy ke 	return min(rx_left, rx_room);
248*64e36824Saddy ke }
249*64e36824Saddy ke 
250*64e36824Saddy ke static void rockchip_spi_set_cs(struct spi_device *spi, bool enable)
251*64e36824Saddy ke {
252*64e36824Saddy ke 	u32 ser;
253*64e36824Saddy ke 	struct rockchip_spi *rs = spi_master_get_devdata(spi->master);
254*64e36824Saddy ke 
255*64e36824Saddy ke 	ser = readl_relaxed(rs->regs + ROCKCHIP_SPI_SER) & SER_MASK;
256*64e36824Saddy ke 
257*64e36824Saddy ke 	/*
258*64e36824Saddy ke 	 * drivers/spi/spi.c:
259*64e36824Saddy ke 	 * static void spi_set_cs(struct spi_device *spi, bool enable)
260*64e36824Saddy ke 	 * {
261*64e36824Saddy ke 	 *		if (spi->mode & SPI_CS_HIGH)
262*64e36824Saddy ke 	 *			enable = !enable;
263*64e36824Saddy ke 	 *
264*64e36824Saddy ke 	 *		if (spi->cs_gpio >= 0)
265*64e36824Saddy ke 	 *			gpio_set_value(spi->cs_gpio, !enable);
266*64e36824Saddy ke 	 *		else if (spi->master->set_cs)
267*64e36824Saddy ke 	 *		spi->master->set_cs(spi, !enable);
268*64e36824Saddy ke 	 * }
269*64e36824Saddy ke 	 *
270*64e36824Saddy ke 	 * Note: enable(rockchip_spi_set_cs) = !enable(spi_set_cs)
271*64e36824Saddy ke 	 */
272*64e36824Saddy ke 	if (!enable)
273*64e36824Saddy ke 		ser |= 1 << spi->chip_select;
274*64e36824Saddy ke 	else
275*64e36824Saddy ke 		ser &= ~(1 << spi->chip_select);
276*64e36824Saddy ke 
277*64e36824Saddy ke 	writel_relaxed(ser, rs->regs + ROCKCHIP_SPI_SER);
278*64e36824Saddy ke }
279*64e36824Saddy ke 
280*64e36824Saddy ke static int rockchip_spi_prepare_message(struct spi_master *master,
281*64e36824Saddy ke 		struct spi_message *msg)
282*64e36824Saddy ke {
283*64e36824Saddy ke 	struct rockchip_spi *rs = spi_master_get_devdata(master);
284*64e36824Saddy ke 	struct spi_device *spi = msg->spi;
285*64e36824Saddy ke 
286*64e36824Saddy ke 	if (spi->mode & SPI_CS_HIGH) {
287*64e36824Saddy ke 		dev_err(rs->dev, "spi_cs_hign: not support\n");
288*64e36824Saddy ke 		return -EINVAL;
289*64e36824Saddy ke 	}
290*64e36824Saddy ke 
291*64e36824Saddy ke 	rs->mode = spi->mode;
292*64e36824Saddy ke 
293*64e36824Saddy ke 	return 0;
294*64e36824Saddy ke }
295*64e36824Saddy ke 
296*64e36824Saddy ke static int rockchip_spi_unprepare_message(struct spi_master *master,
297*64e36824Saddy ke 		struct spi_message *msg)
298*64e36824Saddy ke {
299*64e36824Saddy ke 	unsigned long flags;
300*64e36824Saddy ke 	struct rockchip_spi *rs = spi_master_get_devdata(master);
301*64e36824Saddy ke 
302*64e36824Saddy ke 	spin_lock_irqsave(&rs->lock, flags);
303*64e36824Saddy ke 
304*64e36824Saddy ke 	if (rs->use_dma) {
305*64e36824Saddy ke 		if (rs->state & RXBUSY) {
306*64e36824Saddy ke 			dmaengine_terminate_all(rs->dma_rx.ch);
307*64e36824Saddy ke 			flush_fifo(rs);
308*64e36824Saddy ke 		}
309*64e36824Saddy ke 
310*64e36824Saddy ke 		if (rs->state & TXBUSY)
311*64e36824Saddy ke 			dmaengine_terminate_all(rs->dma_tx.ch);
312*64e36824Saddy ke 	}
313*64e36824Saddy ke 
314*64e36824Saddy ke 	spin_unlock_irqrestore(&rs->lock, flags);
315*64e36824Saddy ke 
316*64e36824Saddy ke 	return 0;
317*64e36824Saddy ke }
318*64e36824Saddy ke 
319*64e36824Saddy ke static void rockchip_spi_pio_writer(struct rockchip_spi *rs)
320*64e36824Saddy ke {
321*64e36824Saddy ke 	u32 max = tx_max(rs);
322*64e36824Saddy ke 	u32 txw = 0;
323*64e36824Saddy ke 
324*64e36824Saddy ke 	while (max--) {
325*64e36824Saddy ke 		if (rs->n_bytes == 1)
326*64e36824Saddy ke 			txw = *(u8 *)(rs->tx);
327*64e36824Saddy ke 		else
328*64e36824Saddy ke 			txw = *(u16 *)(rs->tx);
329*64e36824Saddy ke 
330*64e36824Saddy ke 		writel_relaxed(txw, rs->regs + ROCKCHIP_SPI_TXDR);
331*64e36824Saddy ke 		rs->tx += rs->n_bytes;
332*64e36824Saddy ke 	}
333*64e36824Saddy ke }
334*64e36824Saddy ke 
335*64e36824Saddy ke static void rockchip_spi_pio_reader(struct rockchip_spi *rs)
336*64e36824Saddy ke {
337*64e36824Saddy ke 	u32 max = rx_max(rs);
338*64e36824Saddy ke 	u32 rxw;
339*64e36824Saddy ke 
340*64e36824Saddy ke 	while (max--) {
341*64e36824Saddy ke 		rxw = readl_relaxed(rs->regs + ROCKCHIP_SPI_RXDR);
342*64e36824Saddy ke 		if (rs->n_bytes == 1)
343*64e36824Saddy ke 			*(u8 *)(rs->rx) = (u8)rxw;
344*64e36824Saddy ke 		else
345*64e36824Saddy ke 			*(u16 *)(rs->rx) = (u16)rxw;
346*64e36824Saddy ke 		rs->rx += rs->n_bytes;
347*64e36824Saddy ke 	};
348*64e36824Saddy ke }
349*64e36824Saddy ke 
350*64e36824Saddy ke static int rockchip_spi_pio_transfer(struct rockchip_spi *rs)
351*64e36824Saddy ke {
352*64e36824Saddy ke 	int remain = 0;
353*64e36824Saddy ke 
354*64e36824Saddy ke 	do {
355*64e36824Saddy ke 		if (rs->tx) {
356*64e36824Saddy ke 			remain = rs->tx_end - rs->tx;
357*64e36824Saddy ke 			rockchip_spi_pio_writer(rs);
358*64e36824Saddy ke 		}
359*64e36824Saddy ke 
360*64e36824Saddy ke 		if (rs->rx) {
361*64e36824Saddy ke 			remain = rs->rx_end - rs->rx;
362*64e36824Saddy ke 			rockchip_spi_pio_reader(rs);
363*64e36824Saddy ke 		}
364*64e36824Saddy ke 
365*64e36824Saddy ke 		cpu_relax();
366*64e36824Saddy ke 	} while (remain);
367*64e36824Saddy ke 
368*64e36824Saddy ke 	return 0;
369*64e36824Saddy ke }
370*64e36824Saddy ke 
371*64e36824Saddy ke static void rockchip_spi_dma_rxcb(void *data)
372*64e36824Saddy ke {
373*64e36824Saddy ke 	unsigned long flags;
374*64e36824Saddy ke 	struct rockchip_spi *rs = data;
375*64e36824Saddy ke 
376*64e36824Saddy ke 	spin_lock_irqsave(&rs->lock, flags);
377*64e36824Saddy ke 
378*64e36824Saddy ke 	rs->state &= ~RXBUSY;
379*64e36824Saddy ke 	if (!(rs->state & TXBUSY))
380*64e36824Saddy ke 		spi_finalize_current_transfer(rs->master);
381*64e36824Saddy ke 
382*64e36824Saddy ke 	spin_unlock_irqrestore(&rs->lock, flags);
383*64e36824Saddy ke }
384*64e36824Saddy ke 
385*64e36824Saddy ke static void rockchip_spi_dma_txcb(void *data)
386*64e36824Saddy ke {
387*64e36824Saddy ke 	unsigned long flags;
388*64e36824Saddy ke 	struct rockchip_spi *rs = data;
389*64e36824Saddy ke 
390*64e36824Saddy ke 	spin_lock_irqsave(&rs->lock, flags);
391*64e36824Saddy ke 
392*64e36824Saddy ke 	rs->state &= ~TXBUSY;
393*64e36824Saddy ke 	if (!(rs->state & RXBUSY))
394*64e36824Saddy ke 		spi_finalize_current_transfer(rs->master);
395*64e36824Saddy ke 
396*64e36824Saddy ke 	spin_unlock_irqrestore(&rs->lock, flags);
397*64e36824Saddy ke }
398*64e36824Saddy ke 
399*64e36824Saddy ke static int rockchip_spi_dma_transfer(struct rockchip_spi *rs)
400*64e36824Saddy ke {
401*64e36824Saddy ke 	unsigned long flags;
402*64e36824Saddy ke 	struct dma_slave_config rxconf, txconf;
403*64e36824Saddy ke 	struct dma_async_tx_descriptor *rxdesc, *txdesc;
404*64e36824Saddy ke 
405*64e36824Saddy ke 	spin_lock_irqsave(&rs->lock, flags);
406*64e36824Saddy ke 	rs->state &= ~RXBUSY;
407*64e36824Saddy ke 	rs->state &= ~TXBUSY;
408*64e36824Saddy ke 	spin_unlock_irqrestore(&rs->lock, flags);
409*64e36824Saddy ke 
410*64e36824Saddy ke 	if (rs->rx) {
411*64e36824Saddy ke 		rxconf.direction = rs->dma_rx.direction;
412*64e36824Saddy ke 		rxconf.src_addr = rs->dma_rx.addr;
413*64e36824Saddy ke 		rxconf.src_addr_width = rs->n_bytes;
414*64e36824Saddy ke 		rxconf.src_maxburst = rs->n_bytes;
415*64e36824Saddy ke 		dmaengine_slave_config(rs->dma_rx.ch, &rxconf);
416*64e36824Saddy ke 
417*64e36824Saddy ke 		rxdesc = dmaengine_prep_slave_sg(rs->dma_rx.ch,
418*64e36824Saddy ke 				rs->rx_sg.sgl, rs->rx_sg.nents,
419*64e36824Saddy ke 				rs->dma_rx.direction, DMA_PREP_INTERRUPT);
420*64e36824Saddy ke 
421*64e36824Saddy ke 		rxdesc->callback = rockchip_spi_dma_rxcb;
422*64e36824Saddy ke 		rxdesc->callback_param = rs;
423*64e36824Saddy ke 	}
424*64e36824Saddy ke 
425*64e36824Saddy ke 	if (rs->tx) {
426*64e36824Saddy ke 		txconf.direction = rs->dma_tx.direction;
427*64e36824Saddy ke 		txconf.dst_addr = rs->dma_tx.addr;
428*64e36824Saddy ke 		txconf.dst_addr_width = rs->n_bytes;
429*64e36824Saddy ke 		txconf.dst_maxburst = rs->n_bytes;
430*64e36824Saddy ke 		dmaengine_slave_config(rs->dma_tx.ch, &txconf);
431*64e36824Saddy ke 
432*64e36824Saddy ke 		txdesc = dmaengine_prep_slave_sg(rs->dma_tx.ch,
433*64e36824Saddy ke 				rs->tx_sg.sgl, rs->tx_sg.nents,
434*64e36824Saddy ke 				rs->dma_tx.direction, DMA_PREP_INTERRUPT);
435*64e36824Saddy ke 
436*64e36824Saddy ke 		txdesc->callback = rockchip_spi_dma_txcb;
437*64e36824Saddy ke 		txdesc->callback_param = rs;
438*64e36824Saddy ke 	}
439*64e36824Saddy ke 
440*64e36824Saddy ke 	/* rx must be started before tx due to spi instinct */
441*64e36824Saddy ke 	if (rs->rx) {
442*64e36824Saddy ke 		spin_lock_irqsave(&rs->lock, flags);
443*64e36824Saddy ke 		rs->state |= RXBUSY;
444*64e36824Saddy ke 		spin_unlock_irqrestore(&rs->lock, flags);
445*64e36824Saddy ke 		dmaengine_submit(rxdesc);
446*64e36824Saddy ke 		dma_async_issue_pending(rs->dma_rx.ch);
447*64e36824Saddy ke 	}
448*64e36824Saddy ke 
449*64e36824Saddy ke 	if (rs->tx) {
450*64e36824Saddy ke 		spin_lock_irqsave(&rs->lock, flags);
451*64e36824Saddy ke 		rs->state |= TXBUSY;
452*64e36824Saddy ke 		spin_unlock_irqrestore(&rs->lock, flags);
453*64e36824Saddy ke 		dmaengine_submit(txdesc);
454*64e36824Saddy ke 		dma_async_issue_pending(rs->dma_tx.ch);
455*64e36824Saddy ke 	}
456*64e36824Saddy ke 
457*64e36824Saddy ke 	return 1;
458*64e36824Saddy ke }
459*64e36824Saddy ke 
460*64e36824Saddy ke static void rockchip_spi_config(struct rockchip_spi *rs)
461*64e36824Saddy ke {
462*64e36824Saddy ke 	u32 div = 0;
463*64e36824Saddy ke 	u32 dmacr = 0;
464*64e36824Saddy ke 
465*64e36824Saddy ke 	u32 cr0 = (CR0_BHT_8BIT << CR0_BHT_OFFSET)
466*64e36824Saddy ke 		| (CR0_SSD_ONE << CR0_SSD_OFFSET);
467*64e36824Saddy ke 
468*64e36824Saddy ke 	cr0 |= (rs->n_bytes << CR0_DFS_OFFSET);
469*64e36824Saddy ke 	cr0 |= ((rs->mode & 0x3) << CR0_SCPH_OFFSET);
470*64e36824Saddy ke 	cr0 |= (rs->tmode << CR0_XFM_OFFSET);
471*64e36824Saddy ke 	cr0 |= (rs->type << CR0_FRF_OFFSET);
472*64e36824Saddy ke 
473*64e36824Saddy ke 	if (rs->use_dma) {
474*64e36824Saddy ke 		if (rs->tx)
475*64e36824Saddy ke 			dmacr |= TF_DMA_EN;
476*64e36824Saddy ke 		if (rs->rx)
477*64e36824Saddy ke 			dmacr |= RF_DMA_EN;
478*64e36824Saddy ke 	}
479*64e36824Saddy ke 
480*64e36824Saddy ke 	/* div doesn't support odd number */
481*64e36824Saddy ke 	div = rs->max_freq / rs->speed;
482*64e36824Saddy ke 	div = (div + 1) & 0xfffe;
483*64e36824Saddy ke 
484*64e36824Saddy ke 	spi_enable_chip(rs, 0);
485*64e36824Saddy ke 
486*64e36824Saddy ke 	writel_relaxed(cr0, rs->regs + ROCKCHIP_SPI_CTRLR0);
487*64e36824Saddy ke 
488*64e36824Saddy ke 	writel_relaxed(rs->len - 1, rs->regs + ROCKCHIP_SPI_CTRLR1);
489*64e36824Saddy ke 	writel_relaxed(rs->fifo_len / 2 - 1, rs->regs + ROCKCHIP_SPI_TXFTLR);
490*64e36824Saddy ke 	writel_relaxed(rs->fifo_len / 2 - 1, rs->regs + ROCKCHIP_SPI_RXFTLR);
491*64e36824Saddy ke 
492*64e36824Saddy ke 	writel_relaxed(0, rs->regs + ROCKCHIP_SPI_DMATDLR);
493*64e36824Saddy ke 	writel_relaxed(0, rs->regs + ROCKCHIP_SPI_DMARDLR);
494*64e36824Saddy ke 	writel_relaxed(dmacr, rs->regs + ROCKCHIP_SPI_DMACR);
495*64e36824Saddy ke 
496*64e36824Saddy ke 	spi_set_clk(rs, div);
497*64e36824Saddy ke 
498*64e36824Saddy ke 	dev_dbg(rs->dev, "cr0 0x%x, div %d\n",
499*64e36824Saddy ke 			cr0, div);
500*64e36824Saddy ke 
501*64e36824Saddy ke 	spi_enable_chip(rs, 1);
502*64e36824Saddy ke }
503*64e36824Saddy ke 
504*64e36824Saddy ke static int rockchip_spi_transfer_one(struct spi_master *master,
505*64e36824Saddy ke 		struct spi_device *spi,
506*64e36824Saddy ke 		struct spi_transfer *xfer)
507*64e36824Saddy ke {
508*64e36824Saddy ke 	int ret = 0;
509*64e36824Saddy ke 	struct rockchip_spi *rs = spi_master_get_devdata(master);
510*64e36824Saddy ke 
511*64e36824Saddy ke 	WARN_ON((readl_relaxed(rs->regs + ROCKCHIP_SPI_SR) & SR_BUSY));
512*64e36824Saddy ke 
513*64e36824Saddy ke 	if (!xfer->tx_buf && !xfer->rx_buf) {
514*64e36824Saddy ke 		dev_err(rs->dev, "No buffer for transfer\n");
515*64e36824Saddy ke 		return -EINVAL;
516*64e36824Saddy ke 	}
517*64e36824Saddy ke 
518*64e36824Saddy ke 	rs->speed = xfer->speed_hz;
519*64e36824Saddy ke 	rs->bpw = xfer->bits_per_word;
520*64e36824Saddy ke 	rs->n_bytes = rs->bpw >> 3;
521*64e36824Saddy ke 
522*64e36824Saddy ke 	rs->tx = xfer->tx_buf;
523*64e36824Saddy ke 	rs->tx_end = rs->tx + xfer->len;
524*64e36824Saddy ke 	rs->rx = xfer->rx_buf;
525*64e36824Saddy ke 	rs->rx_end = rs->rx + xfer->len;
526*64e36824Saddy ke 	rs->len = xfer->len;
527*64e36824Saddy ke 
528*64e36824Saddy ke 	rs->tx_sg = xfer->tx_sg;
529*64e36824Saddy ke 	rs->rx_sg = xfer->rx_sg;
530*64e36824Saddy ke 
531*64e36824Saddy ke 	/* Delay until the FIFO data completely */
532*64e36824Saddy ke 	if (xfer->tx_buf)
533*64e36824Saddy ke 		xfer->delay_usecs
534*64e36824Saddy ke 			= rs->fifo_len * rs->bpw * 1000000 / rs->speed;
535*64e36824Saddy ke 
536*64e36824Saddy ke 	if (rs->tx && rs->rx)
537*64e36824Saddy ke 		rs->tmode = CR0_XFM_TR;
538*64e36824Saddy ke 	else if (rs->tx)
539*64e36824Saddy ke 		rs->tmode = CR0_XFM_TO;
540*64e36824Saddy ke 	else if (rs->rx)
541*64e36824Saddy ke 		rs->tmode = CR0_XFM_RO;
542*64e36824Saddy ke 
543*64e36824Saddy ke 	if (master->can_dma && master->can_dma(master, spi, xfer))
544*64e36824Saddy ke 		rs->use_dma = 1;
545*64e36824Saddy ke 	else
546*64e36824Saddy ke 		rs->use_dma = 0;
547*64e36824Saddy ke 
548*64e36824Saddy ke 	rockchip_spi_config(rs);
549*64e36824Saddy ke 
550*64e36824Saddy ke 	if (rs->use_dma)
551*64e36824Saddy ke 		ret = rockchip_spi_dma_transfer(rs);
552*64e36824Saddy ke 	else
553*64e36824Saddy ke 		ret = rockchip_spi_pio_transfer(rs);
554*64e36824Saddy ke 
555*64e36824Saddy ke 	return ret;
556*64e36824Saddy ke }
557*64e36824Saddy ke 
558*64e36824Saddy ke static bool rockchip_spi_can_dma(struct spi_master *master,
559*64e36824Saddy ke 		struct spi_device *spi,
560*64e36824Saddy ke 		struct spi_transfer *xfer)
561*64e36824Saddy ke {
562*64e36824Saddy ke 	struct rockchip_spi *rs = spi_master_get_devdata(master);
563*64e36824Saddy ke 
564*64e36824Saddy ke 	return (xfer->len > rs->fifo_len);
565*64e36824Saddy ke }
566*64e36824Saddy ke 
567*64e36824Saddy ke static int rockchip_spi_probe(struct platform_device *pdev)
568*64e36824Saddy ke {
569*64e36824Saddy ke 	int ret = 0;
570*64e36824Saddy ke 	struct rockchip_spi *rs;
571*64e36824Saddy ke 	struct spi_master *master;
572*64e36824Saddy ke 	struct resource *mem;
573*64e36824Saddy ke 
574*64e36824Saddy ke 	master = spi_alloc_master(&pdev->dev, sizeof(struct rockchip_spi));
575*64e36824Saddy ke 	if (!master) {
576*64e36824Saddy ke 		dev_err(&pdev->dev, "No memory for spi_master\n");
577*64e36824Saddy ke 		return -ENOMEM;
578*64e36824Saddy ke 	}
579*64e36824Saddy ke 	platform_set_drvdata(pdev, master);
580*64e36824Saddy ke 
581*64e36824Saddy ke 	rs = spi_master_get_devdata(master);
582*64e36824Saddy ke 	memset(rs, 0, sizeof(struct rockchip_spi));
583*64e36824Saddy ke 
584*64e36824Saddy ke 	/* Get basic io resource and map it */
585*64e36824Saddy ke 	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
586*64e36824Saddy ke 	rs->regs = devm_ioremap_resource(&pdev->dev, mem);
587*64e36824Saddy ke 	if (IS_ERR(rs->regs)) {
588*64e36824Saddy ke 		dev_err(&pdev->dev, "Failed to map SPI region\n");
589*64e36824Saddy ke 		ret =  PTR_ERR(rs->regs);
590*64e36824Saddy ke 		goto err_ioremap_resource;
591*64e36824Saddy ke 	}
592*64e36824Saddy ke 
593*64e36824Saddy ke 	rs->apb_pclk = devm_clk_get(&pdev->dev, "apb_pclk");
594*64e36824Saddy ke 	if (IS_ERR(rs->apb_pclk)) {
595*64e36824Saddy ke 		dev_err(&pdev->dev, "Failed to get apb_pclk\n");
596*64e36824Saddy ke 		ret = PTR_ERR(rs->apb_pclk);
597*64e36824Saddy ke 		goto err_ioremap_resource;
598*64e36824Saddy ke 	}
599*64e36824Saddy ke 
600*64e36824Saddy ke 	rs->spiclk = devm_clk_get(&pdev->dev, "spiclk");
601*64e36824Saddy ke 	if (IS_ERR(rs->spiclk)) {
602*64e36824Saddy ke 		dev_err(&pdev->dev, "Failed to get spi_pclk\n");
603*64e36824Saddy ke 		ret = PTR_ERR(rs->spiclk);
604*64e36824Saddy ke 		goto err_ioremap_resource;
605*64e36824Saddy ke 	}
606*64e36824Saddy ke 
607*64e36824Saddy ke 	ret = clk_prepare_enable(rs->apb_pclk);
608*64e36824Saddy ke 	if (ret) {
609*64e36824Saddy ke 		dev_err(&pdev->dev, "Failed to enable apb_pclk\n");
610*64e36824Saddy ke 		goto err_ioremap_resource;
611*64e36824Saddy ke 	}
612*64e36824Saddy ke 
613*64e36824Saddy ke 	ret = clk_prepare_enable(rs->spiclk);
614*64e36824Saddy ke 	if (ret) {
615*64e36824Saddy ke 		dev_err(&pdev->dev, "Failed to enable spi_clk\n");
616*64e36824Saddy ke 		goto err_spiclk_enable;
617*64e36824Saddy ke 	}
618*64e36824Saddy ke 
619*64e36824Saddy ke 	spi_enable_chip(rs, 0);
620*64e36824Saddy ke 
621*64e36824Saddy ke 	rs->type = SSI_MOTO_SPI;
622*64e36824Saddy ke 	rs->master = master;
623*64e36824Saddy ke 	rs->dev = &pdev->dev;
624*64e36824Saddy ke 	rs->max_freq = clk_get_rate(rs->spiclk);
625*64e36824Saddy ke 
626*64e36824Saddy ke 	rs->fifo_len = get_fifo_len(rs);
627*64e36824Saddy ke 	if (!rs->fifo_len) {
628*64e36824Saddy ke 		dev_err(&pdev->dev, "Failed to get fifo length\n");
629*64e36824Saddy ke 		goto err_get_fifo_len;
630*64e36824Saddy ke 	}
631*64e36824Saddy ke 
632*64e36824Saddy ke 	spin_lock_init(&rs->lock);
633*64e36824Saddy ke 
634*64e36824Saddy ke 	pm_runtime_set_active(&pdev->dev);
635*64e36824Saddy ke 	pm_runtime_enable(&pdev->dev);
636*64e36824Saddy ke 
637*64e36824Saddy ke 	master->auto_runtime_pm = true;
638*64e36824Saddy ke 	master->bus_num = pdev->id;
639*64e36824Saddy ke 	master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH | SPI_LOOP;
640*64e36824Saddy ke 	master->num_chipselect = 2;
641*64e36824Saddy ke 	master->dev.of_node = pdev->dev.of_node;
642*64e36824Saddy ke 	master->bits_per_word_mask = SPI_BPW_MASK(16) | SPI_BPW_MASK(8);
643*64e36824Saddy ke 
644*64e36824Saddy ke 	master->set_cs = rockchip_spi_set_cs;
645*64e36824Saddy ke 	master->prepare_message = rockchip_spi_prepare_message;
646*64e36824Saddy ke 	master->unprepare_message = rockchip_spi_unprepare_message;
647*64e36824Saddy ke 	master->transfer_one = rockchip_spi_transfer_one;
648*64e36824Saddy ke 
649*64e36824Saddy ke 	rs->dma_tx.ch = dma_request_slave_channel(rs->dev, "tx");
650*64e36824Saddy ke 	if (!rs->dma_tx.ch)
651*64e36824Saddy ke 		dev_warn(rs->dev, "Failed to request TX DMA channel\n");
652*64e36824Saddy ke 
653*64e36824Saddy ke 	rs->dma_rx.ch = dma_request_slave_channel(rs->dev, "rx");
654*64e36824Saddy ke 	if (!rs->dma_rx.ch) {
655*64e36824Saddy ke 		if (rs->dma_tx.ch) {
656*64e36824Saddy ke 			dma_release_channel(rs->dma_tx.ch);
657*64e36824Saddy ke 			rs->dma_tx.ch = NULL;
658*64e36824Saddy ke 		}
659*64e36824Saddy ke 		dev_warn(rs->dev, "Failed to request RX DMA channel\n");
660*64e36824Saddy ke 	}
661*64e36824Saddy ke 
662*64e36824Saddy ke 	if (rs->dma_tx.ch && rs->dma_rx.ch) {
663*64e36824Saddy ke 		rs->dma_tx.addr = (dma_addr_t)(mem->start + ROCKCHIP_SPI_TXDR);
664*64e36824Saddy ke 		rs->dma_rx.addr = (dma_addr_t)(mem->start + ROCKCHIP_SPI_RXDR);
665*64e36824Saddy ke 		rs->dma_tx.direction = DMA_MEM_TO_DEV;
666*64e36824Saddy ke 		rs->dma_tx.direction = DMA_DEV_TO_MEM;
667*64e36824Saddy ke 
668*64e36824Saddy ke 		master->can_dma = rockchip_spi_can_dma;
669*64e36824Saddy ke 		master->dma_tx = rs->dma_tx.ch;
670*64e36824Saddy ke 		master->dma_rx = rs->dma_rx.ch;
671*64e36824Saddy ke 	}
672*64e36824Saddy ke 
673*64e36824Saddy ke 	ret = devm_spi_register_master(&pdev->dev, master);
674*64e36824Saddy ke 	if (ret) {
675*64e36824Saddy ke 		dev_err(&pdev->dev, "Failed to register master\n");
676*64e36824Saddy ke 		goto err_register_master;
677*64e36824Saddy ke 	}
678*64e36824Saddy ke 
679*64e36824Saddy ke 	dev_info(&pdev->dev, "Rockchip SPI controller initialized\n");
680*64e36824Saddy ke 
681*64e36824Saddy ke 	return 0;
682*64e36824Saddy ke 
683*64e36824Saddy ke err_register_master:
684*64e36824Saddy ke 	if (rs->dma_tx.ch)
685*64e36824Saddy ke 		dma_release_channel(rs->dma_tx.ch);
686*64e36824Saddy ke 	if (rs->dma_rx.ch)
687*64e36824Saddy ke 		dma_release_channel(rs->dma_rx.ch);
688*64e36824Saddy ke err_get_fifo_len:
689*64e36824Saddy ke 	clk_disable_unprepare(rs->spiclk);
690*64e36824Saddy ke err_spiclk_enable:
691*64e36824Saddy ke 	clk_disable_unprepare(rs->apb_pclk);
692*64e36824Saddy ke err_ioremap_resource:
693*64e36824Saddy ke 	spi_master_put(master);
694*64e36824Saddy ke 
695*64e36824Saddy ke 	return ret;
696*64e36824Saddy ke }
697*64e36824Saddy ke 
698*64e36824Saddy ke static int rockchip_spi_remove(struct platform_device *pdev)
699*64e36824Saddy ke {
700*64e36824Saddy ke 	struct spi_master *master = spi_master_get(platform_get_drvdata(pdev));
701*64e36824Saddy ke 	struct rockchip_spi *rs = spi_master_get_devdata(master);
702*64e36824Saddy ke 
703*64e36824Saddy ke 	pm_runtime_disable(&pdev->dev);
704*64e36824Saddy ke 
705*64e36824Saddy ke 	clk_disable_unprepare(rs->spiclk);
706*64e36824Saddy ke 	clk_disable_unprepare(rs->apb_pclk);
707*64e36824Saddy ke 
708*64e36824Saddy ke 	if (rs->dma_tx.ch)
709*64e36824Saddy ke 		dma_release_channel(rs->dma_tx.ch);
710*64e36824Saddy ke 	if (rs->dma_rx.ch)
711*64e36824Saddy ke 		dma_release_channel(rs->dma_rx.ch);
712*64e36824Saddy ke 
713*64e36824Saddy ke 	spi_master_put(master);
714*64e36824Saddy ke 
715*64e36824Saddy ke 	return 0;
716*64e36824Saddy ke }
717*64e36824Saddy ke 
718*64e36824Saddy ke #ifdef CONFIG_PM_SLEEP
719*64e36824Saddy ke static int rockchip_spi_suspend(struct device *dev)
720*64e36824Saddy ke {
721*64e36824Saddy ke 	int ret = 0;
722*64e36824Saddy ke 	struct spi_master *master = dev_get_drvdata(dev);
723*64e36824Saddy ke 	struct rockchip_spi *rs = spi_master_get_devdata(master);
724*64e36824Saddy ke 
725*64e36824Saddy ke 	ret = spi_master_suspend(rs->master);
726*64e36824Saddy ke 	if (ret)
727*64e36824Saddy ke 		return ret;
728*64e36824Saddy ke 
729*64e36824Saddy ke 	if (!pm_runtime_suspended(dev)) {
730*64e36824Saddy ke 		clk_disable_unprepare(rs->spiclk);
731*64e36824Saddy ke 		clk_disable_unprepare(rs->apb_pclk);
732*64e36824Saddy ke 	}
733*64e36824Saddy ke 
734*64e36824Saddy ke 	return ret;
735*64e36824Saddy ke }
736*64e36824Saddy ke 
737*64e36824Saddy ke static int rockchip_spi_resume(struct device *dev)
738*64e36824Saddy ke {
739*64e36824Saddy ke 	int ret = 0;
740*64e36824Saddy ke 	struct spi_master *master = dev_get_drvdata(dev);
741*64e36824Saddy ke 	struct rockchip_spi *rs = spi_master_get_devdata(master);
742*64e36824Saddy ke 
743*64e36824Saddy ke 	if (!pm_runtime_suspended(dev)) {
744*64e36824Saddy ke 		ret = clk_prepare_enable(rs->apb_pclk);
745*64e36824Saddy ke 		if (ret < 0)
746*64e36824Saddy ke 			return ret;
747*64e36824Saddy ke 
748*64e36824Saddy ke 		ret = clk_prepare_enable(rs->spiclk);
749*64e36824Saddy ke 		if (ret < 0) {
750*64e36824Saddy ke 			clk_disable_unprepare(rs->apb_pclk);
751*64e36824Saddy ke 			return ret;
752*64e36824Saddy ke 		}
753*64e36824Saddy ke 	}
754*64e36824Saddy ke 
755*64e36824Saddy ke 	ret = spi_master_resume(rs->master);
756*64e36824Saddy ke 	if (ret < 0) {
757*64e36824Saddy ke 		clk_disable_unprepare(rs->spiclk);
758*64e36824Saddy ke 		clk_disable_unprepare(rs->apb_pclk);
759*64e36824Saddy ke 	}
760*64e36824Saddy ke 
761*64e36824Saddy ke 	return ret;
762*64e36824Saddy ke }
763*64e36824Saddy ke #endif /* CONFIG_PM_SLEEP */
764*64e36824Saddy ke 
765*64e36824Saddy ke #ifdef CONFIG_PM_RUNTIME
766*64e36824Saddy ke static int rockchip_spi_runtime_suspend(struct device *dev)
767*64e36824Saddy ke {
768*64e36824Saddy ke 	struct spi_master *master = dev_get_drvdata(dev);
769*64e36824Saddy ke 	struct rockchip_spi *rs = spi_master_get_devdata(master);
770*64e36824Saddy ke 
771*64e36824Saddy ke 	clk_disable_unprepare(rs->spiclk);
772*64e36824Saddy ke 	clk_disable_unprepare(rs->apb_pclk);
773*64e36824Saddy ke 
774*64e36824Saddy ke 	return 0;
775*64e36824Saddy ke }
776*64e36824Saddy ke 
777*64e36824Saddy ke static int rockchip_spi_runtime_resume(struct device *dev)
778*64e36824Saddy ke {
779*64e36824Saddy ke 	int ret;
780*64e36824Saddy ke 	struct spi_master *master = dev_get_drvdata(dev);
781*64e36824Saddy ke 	struct rockchip_spi *rs = spi_master_get_devdata(master);
782*64e36824Saddy ke 
783*64e36824Saddy ke 	ret = clk_prepare_enable(rs->apb_pclk);
784*64e36824Saddy ke 	if (ret)
785*64e36824Saddy ke 		return ret;
786*64e36824Saddy ke 
787*64e36824Saddy ke 	ret = clk_prepare_enable(rs->spiclk);
788*64e36824Saddy ke 	if (ret)
789*64e36824Saddy ke 		clk_disable_unprepare(rs->apb_pclk);
790*64e36824Saddy ke 
791*64e36824Saddy ke 	return ret;
792*64e36824Saddy ke }
793*64e36824Saddy ke #endif /* CONFIG_PM_RUNTIME */
794*64e36824Saddy ke 
795*64e36824Saddy ke static const struct dev_pm_ops rockchip_spi_pm = {
796*64e36824Saddy ke 	SET_SYSTEM_SLEEP_PM_OPS(rockchip_spi_suspend, rockchip_spi_resume)
797*64e36824Saddy ke 	SET_RUNTIME_PM_OPS(rockchip_spi_runtime_suspend,
798*64e36824Saddy ke 			   rockchip_spi_runtime_resume, NULL)
799*64e36824Saddy ke };
800*64e36824Saddy ke 
801*64e36824Saddy ke static const struct of_device_id rockchip_spi_dt_match[] = {
802*64e36824Saddy ke 	{ .compatible = "rockchip,rk3066-spi", },
803*64e36824Saddy ke 	{ },
804*64e36824Saddy ke };
805*64e36824Saddy ke MODULE_DEVICE_TABLE(of, rockchip_spi_dt_match);
806*64e36824Saddy ke 
807*64e36824Saddy ke static struct platform_driver rockchip_spi_driver = {
808*64e36824Saddy ke 	.driver = {
809*64e36824Saddy ke 		.name	= DRIVER_NAME,
810*64e36824Saddy ke 		.owner = THIS_MODULE,
811*64e36824Saddy ke 		.pm = &rockchip_spi_pm,
812*64e36824Saddy ke 		.of_match_table = of_match_ptr(rockchip_spi_dt_match),
813*64e36824Saddy ke 	},
814*64e36824Saddy ke 	.probe = rockchip_spi_probe,
815*64e36824Saddy ke 	.remove = rockchip_spi_remove,
816*64e36824Saddy ke };
817*64e36824Saddy ke 
818*64e36824Saddy ke module_platform_driver(rockchip_spi_driver);
819*64e36824Saddy ke 
820*64e36824Saddy ke MODULE_AUTHOR("addy ke <addy.ke@rock-chips.com>");
821*64e36824Saddy ke MODULE_DESCRIPTION("ROCKCHIP SPI Controller Driver");
822*64e36824Saddy ke MODULE_LICENSE("GPL v2");
823