aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi-rspi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/spi/spi-rspi.c')
-rw-r--r--drivers/spi/spi-rspi.c273
1 files changed, 232 insertions, 41 deletions
diff --git a/drivers/spi/spi-rspi.c b/drivers/spi/spi-rspi.c
index 8719206a03a0..9e829cee7357 100644
--- a/drivers/spi/spi-rspi.c
+++ b/drivers/spi/spi-rspi.c
@@ -59,6 +59,14 @@
59#define RSPI_SPCMD6 0x1c 59#define RSPI_SPCMD6 0x1c
60#define RSPI_SPCMD7 0x1e 60#define RSPI_SPCMD7 0x1e
61 61
62/*qspi only */
63#define QSPI_SPBFCR 0x18
64#define QSPI_SPBDCR 0x1a
65#define QSPI_SPBMUL0 0x1c
66#define QSPI_SPBMUL1 0x20
67#define QSPI_SPBMUL2 0x24
68#define QSPI_SPBMUL3 0x28
69
62/* SPCR */ 70/* SPCR */
63#define SPCR_SPRIE 0x80 71#define SPCR_SPRIE 0x80
64#define SPCR_SPE 0x40 72#define SPCR_SPE 0x40
@@ -126,6 +134,8 @@
126#define SPCMD_LSBF 0x1000 134#define SPCMD_LSBF 0x1000
127#define SPCMD_SPB_MASK 0x0f00 135#define SPCMD_SPB_MASK 0x0f00
128#define SPCMD_SPB_8_TO_16(bit) (((bit - 1) << 8) & SPCMD_SPB_MASK) 136#define SPCMD_SPB_8_TO_16(bit) (((bit - 1) << 8) & SPCMD_SPB_MASK)
137#define SPCMD_SPB_8BIT 0x0000 /* qspi only */
138#define SPCMD_SPB_16BIT 0x0100
129#define SPCMD_SPB_20BIT 0x0000 139#define SPCMD_SPB_20BIT 0x0000
130#define SPCMD_SPB_24BIT 0x0100 140#define SPCMD_SPB_24BIT 0x0100
131#define SPCMD_SPB_32BIT 0x0200 141#define SPCMD_SPB_32BIT 0x0200
@@ -135,6 +145,10 @@
135#define SPCMD_CPOL 0x0002 145#define SPCMD_CPOL 0x0002
136#define SPCMD_CPHA 0x0001 146#define SPCMD_CPHA 0x0001
137 147
148/* SPBFCR */
149#define SPBFCR_TXRST 0x80 /* qspi only */
150#define SPBFCR_RXRST 0x40 /* qspi only */
151
138struct rspi_data { 152struct rspi_data {
139 void __iomem *addr; 153 void __iomem *addr;
140 u32 max_speed_hz; 154 u32 max_speed_hz;
@@ -145,6 +159,7 @@ struct rspi_data {
145 spinlock_t lock; 159 spinlock_t lock;
146 struct clk *clk; 160 struct clk *clk;
147 unsigned char spsr; 161 unsigned char spsr;
162 const struct spi_ops *ops;
148 163
149 /* for dmaengine */ 164 /* for dmaengine */
150 struct dma_chan *chan_tx; 165 struct dma_chan *chan_tx;
@@ -165,6 +180,11 @@ static void rspi_write16(struct rspi_data *rspi, u16 data, u16 offset)
165 iowrite16(data, rspi->addr + offset); 180 iowrite16(data, rspi->addr + offset);
166} 181}
167 182
183static void rspi_write32(struct rspi_data *rspi, u32 data, u16 offset)
184{
185 iowrite32(data, rspi->addr + offset);
186}
187
168static u8 rspi_read8(struct rspi_data *rspi, u16 offset) 188static u8 rspi_read8(struct rspi_data *rspi, u16 offset)
169{ 189{
170 return ioread8(rspi->addr + offset); 190 return ioread8(rspi->addr + offset);
@@ -175,17 +195,103 @@ static u16 rspi_read16(struct rspi_data *rspi, u16 offset)
175 return ioread16(rspi->addr + offset); 195 return ioread16(rspi->addr + offset);
176} 196}
177 197
178static unsigned char rspi_calc_spbr(struct rspi_data *rspi) 198/* optional functions */
199struct spi_ops {
200 int (*set_config_register)(struct rspi_data *rspi, int access_size);
201 int (*send_pio)(struct rspi_data *rspi, struct spi_message *mesg,
202 struct spi_transfer *t);
203 int (*receive_pio)(struct rspi_data *rspi, struct spi_message *mesg,
204 struct spi_transfer *t);
205
206};
207
208/*
209 * functions for RSPI
210 */
211static int rspi_set_config_register(struct rspi_data *rspi, int access_size)
212{
213 int spbr;
214
215 /* Sets output mode(CMOS) and MOSI signal(from previous transfer) */
216 rspi_write8(rspi, 0x00, RSPI_SPPCR);
217
218 /* Sets transfer bit rate */
219 spbr = clk_get_rate(rspi->clk) / (2 * rspi->max_speed_hz) - 1;
220 rspi_write8(rspi, clamp(spbr, 0, 255), RSPI_SPBR);
221
222 /* Sets number of frames to be used: 1 frame */
223 rspi_write8(rspi, 0x00, RSPI_SPDCR);
224
225 /* Sets RSPCK, SSL, next-access delay value */
226 rspi_write8(rspi, 0x00, RSPI_SPCKD);
227 rspi_write8(rspi, 0x00, RSPI_SSLND);
228 rspi_write8(rspi, 0x00, RSPI_SPND);
229
230 /* Sets parity, interrupt mask */
231 rspi_write8(rspi, 0x00, RSPI_SPCR2);
232
233 /* Sets SPCMD */
234 rspi_write16(rspi, SPCMD_SPB_8_TO_16(access_size) | SPCMD_SSLKP,
235 RSPI_SPCMD0);
236
237 /* Sets RSPI mode */
238 rspi_write8(rspi, SPCR_MSTR, RSPI_SPCR);
239
240 return 0;
241}
242
243/*
244 * functions for QSPI
245 */
246static int qspi_set_config_register(struct rspi_data *rspi, int access_size)
179{ 247{
180 int tmp; 248 u16 spcmd;
181 unsigned char spbr; 249 int spbr;
250
251 /* Sets output mode(CMOS) and MOSI signal(from previous transfer) */
252 rspi_write8(rspi, 0x00, RSPI_SPPCR);
253
254 /* Sets transfer bit rate */
255 spbr = clk_get_rate(rspi->clk) / (2 * rspi->max_speed_hz);
256 rspi_write8(rspi, clamp(spbr, 0, 255), RSPI_SPBR);
257
258 /* Sets number of frames to be used: 1 frame */
259 rspi_write8(rspi, 0x00, RSPI_SPDCR);
260
261 /* Sets RSPCK, SSL, next-access delay value */
262 rspi_write8(rspi, 0x00, RSPI_SPCKD);
263 rspi_write8(rspi, 0x00, RSPI_SSLND);
264 rspi_write8(rspi, 0x00, RSPI_SPND);
265
266 /* Data Length Setting */
267 if (access_size == 8)
268 spcmd = SPCMD_SPB_8BIT;
269 else if (access_size == 16)
270 spcmd = SPCMD_SPB_16BIT;
271 else if (access_size == 32)
272 spcmd = SPCMD_SPB_32BIT;
273
274 spcmd |= SPCMD_SCKDEN | SPCMD_SLNDEN | SPCMD_SSLKP | SPCMD_SPNDEN;
275
276 /* Resets transfer data length */
277 rspi_write32(rspi, 0, QSPI_SPBMUL0);
278
279 /* Resets transmit and receive buffer */
280 rspi_write8(rspi, SPBFCR_TXRST | SPBFCR_RXRST, QSPI_SPBFCR);
281 /* Sets buffer to allow normal operation */
282 rspi_write8(rspi, 0x00, QSPI_SPBFCR);
283
284 /* Sets SPCMD */
285 rspi_write16(rspi, spcmd, RSPI_SPCMD0);
182 286
183 tmp = clk_get_rate(rspi->clk) / (2 * rspi->max_speed_hz) - 1; 287 /* Enables SPI function in a master mode */
184 spbr = clamp(tmp, 0, 255); 288 rspi_write8(rspi, SPCR_SPE | SPCR_MSTR, RSPI_SPCR);
185 289
186 return spbr; 290 return 0;
187} 291}
188 292
293#define set_config_register(spi, n) spi->ops->set_config_register(spi, n)
294
189static void rspi_enable_irq(struct rspi_data *rspi, u8 enable) 295static void rspi_enable_irq(struct rspi_data *rspi, u8 enable)
190{ 296{
191 rspi_write8(rspi, rspi_read8(rspi, RSPI_SPCR) | enable, RSPI_SPCR); 297 rspi_write8(rspi, rspi_read8(rspi, RSPI_SPCR) | enable, RSPI_SPCR);
@@ -220,54 +326,60 @@ static void rspi_negate_ssl(struct rspi_data *rspi)
220 rspi_write8(rspi, rspi_read8(rspi, RSPI_SPCR) & ~SPCR_SPE, RSPI_SPCR); 326 rspi_write8(rspi, rspi_read8(rspi, RSPI_SPCR) & ~SPCR_SPE, RSPI_SPCR);
221} 327}
222 328
223static int rspi_set_config_register(struct rspi_data *rspi, int access_size) 329static int rspi_send_pio(struct rspi_data *rspi, struct spi_message *mesg,
330 struct spi_transfer *t)
224{ 331{
225 /* Sets output mode(CMOS) and MOSI signal(from previous transfer) */ 332 int remain = t->len;
226 rspi_write8(rspi, 0x00, RSPI_SPPCR); 333 u8 *data;
227
228 /* Sets transfer bit rate */
229 rspi_write8(rspi, rspi_calc_spbr(rspi), RSPI_SPBR);
230
231 /* Sets number of frames to be used: 1 frame */
232 rspi_write8(rspi, 0x00, RSPI_SPDCR);
233 334
234 /* Sets RSPCK, SSL, next-access delay value */ 335 data = (u8 *)t->tx_buf;
235 rspi_write8(rspi, 0x00, RSPI_SPCKD); 336 while (remain > 0) {
236 rspi_write8(rspi, 0x00, RSPI_SSLND); 337 rspi_write8(rspi, rspi_read8(rspi, RSPI_SPCR) | SPCR_TXMD,
237 rspi_write8(rspi, 0x00, RSPI_SPND); 338 RSPI_SPCR);
238 339
239 /* Sets parity, interrupt mask */ 340 if (rspi_wait_for_interrupt(rspi, SPSR_SPTEF, SPCR_SPTIE) < 0) {
240 rspi_write8(rspi, 0x00, RSPI_SPCR2); 341 dev_err(&rspi->master->dev,
342 "%s: tx empty timeout\n", __func__);
343 return -ETIMEDOUT;
344 }
241 345
242 /* Sets SPCMD */ 346 rspi_write16(rspi, *data, RSPI_SPDR);
243 rspi_write16(rspi, SPCMD_SPB_8_TO_16(access_size) | SPCMD_SSLKP, 347 data++;
244 RSPI_SPCMD0); 348 remain--;
349 }
245 350
246 /* Sets RSPI mode */ 351 /* Waiting for the last transmition */
247 rspi_write8(rspi, SPCR_MSTR, RSPI_SPCR); 352 rspi_wait_for_interrupt(rspi, SPSR_SPTEF, SPCR_SPTIE);
248 353
249 return 0; 354 return 0;
250} 355}
251 356
252static int rspi_send_pio(struct rspi_data *rspi, struct spi_message *mesg, 357static int qspi_send_pio(struct rspi_data *rspi, struct spi_message *mesg,
253 struct spi_transfer *t) 358 struct spi_transfer *t)
254{ 359{
255 int remain = t->len; 360 int remain = t->len;
256 u8 *data; 361 u8 *data;
257 362
363 rspi_write8(rspi, SPBFCR_TXRST, QSPI_SPBFCR);
364 rspi_write8(rspi, 0x00, QSPI_SPBFCR);
365
258 data = (u8 *)t->tx_buf; 366 data = (u8 *)t->tx_buf;
259 while (remain > 0) { 367 while (remain > 0) {
260 rspi_write8(rspi, rspi_read8(rspi, RSPI_SPCR) | SPCR_TXMD,
261 RSPI_SPCR);
262 368
263 if (rspi_wait_for_interrupt(rspi, SPSR_SPTEF, SPCR_SPTIE) < 0) { 369 if (rspi_wait_for_interrupt(rspi, SPSR_SPTEF, SPCR_SPTIE) < 0) {
264 dev_err(&rspi->master->dev, 370 dev_err(&rspi->master->dev,
265 "%s: tx empty timeout\n", __func__); 371 "%s: tx empty timeout\n", __func__);
266 return -ETIMEDOUT; 372 return -ETIMEDOUT;
267 } 373 }
374 rspi_write8(rspi, *data++, RSPI_SPDR);
375
376 if (rspi_wait_for_interrupt(rspi, SPSR_SPRF, SPCR_SPRIE) < 0) {
377 dev_err(&rspi->master->dev,
378 "%s: receive timeout\n", __func__);
379 return -ETIMEDOUT;
380 }
381 rspi_read8(rspi, RSPI_SPDR);
268 382
269 rspi_write16(rspi, *data, RSPI_SPDR);
270 data++;
271 remain--; 383 remain--;
272 } 384 }
273 385
@@ -277,6 +389,8 @@ static int rspi_send_pio(struct rspi_data *rspi, struct spi_message *mesg,
277 return 0; 389 return 0;
278} 390}
279 391
392#define send_pio(spi, mesg, t) spi->ops->send_pio(spi, mesg, t)
393
280static void rspi_dma_complete(void *arg) 394static void rspi_dma_complete(void *arg)
281{ 395{
282 struct rspi_data *rspi = arg; 396 struct rspi_data *rspi = arg;
@@ -442,6 +556,51 @@ static int rspi_receive_pio(struct rspi_data *rspi, struct spi_message *mesg,
442 return 0; 556 return 0;
443} 557}
444 558
559static void qspi_receive_init(struct rspi_data *rspi)
560{
561 unsigned char spsr;
562
563 spsr = rspi_read8(rspi, RSPI_SPSR);
564 if (spsr & SPSR_SPRF)
565 rspi_read8(rspi, RSPI_SPDR); /* dummy read */
566 rspi_write8(rspi, SPBFCR_TXRST | SPBFCR_RXRST, QSPI_SPBFCR);
567 rspi_write8(rspi, 0x00, QSPI_SPBFCR);
568}
569
570static int qspi_receive_pio(struct rspi_data *rspi, struct spi_message *mesg,
571 struct spi_transfer *t)
572{
573 int remain = t->len;
574 u8 *data;
575
576 qspi_receive_init(rspi);
577
578 data = (u8 *)t->rx_buf;
579 while (remain > 0) {
580
581 if (rspi_wait_for_interrupt(rspi, SPSR_SPTEF, SPCR_SPTIE) < 0) {
582 dev_err(&rspi->master->dev,
583 "%s: tx empty timeout\n", __func__);
584 return -ETIMEDOUT;
585 }
586 /* dummy write for generate clock */
587 rspi_write8(rspi, 0x00, RSPI_SPDR);
588
589 if (rspi_wait_for_interrupt(rspi, SPSR_SPRF, SPCR_SPRIE) < 0) {
590 dev_err(&rspi->master->dev,
591 "%s: receive timeout\n", __func__);
592 return -ETIMEDOUT;
593 }
594 /* SPDR allows 8, 16 or 32-bit access */
595 *data++ = rspi_read8(rspi, RSPI_SPDR);
596 remain--;
597 }
598
599 return 0;
600}
601
602#define receive_pio(spi, mesg, t) spi->ops->receive_pio(spi, mesg, t)
603
445static int rspi_receive_dma(struct rspi_data *rspi, struct spi_transfer *t) 604static int rspi_receive_dma(struct rspi_data *rspi, struct spi_transfer *t)
446{ 605{
447 struct scatterlist sg, sg_dummy; 606 struct scatterlist sg, sg_dummy;
@@ -581,7 +740,7 @@ static void rspi_work(struct work_struct *work)
581 if (rspi_is_dma(rspi, t)) 740 if (rspi_is_dma(rspi, t))
582 ret = rspi_send_dma(rspi, t); 741 ret = rspi_send_dma(rspi, t);
583 else 742 else
584 ret = rspi_send_pio(rspi, mesg, t); 743 ret = send_pio(rspi, mesg, t);
585 if (ret < 0) 744 if (ret < 0)
586 goto error; 745 goto error;
587 } 746 }
@@ -589,7 +748,7 @@ static void rspi_work(struct work_struct *work)
589 if (rspi_is_dma(rspi, t)) 748 if (rspi_is_dma(rspi, t))
590 ret = rspi_receive_dma(rspi, t); 749 ret = rspi_receive_dma(rspi, t);
591 else 750 else
592 ret = rspi_receive_pio(rspi, mesg, t); 751 ret = receive_pio(rspi, mesg, t);
593 if (ret < 0) 752 if (ret < 0)
594 goto error; 753 goto error;
595 } 754 }
@@ -616,7 +775,7 @@ static int rspi_setup(struct spi_device *spi)
616 spi->bits_per_word = 8; 775 spi->bits_per_word = 8;
617 rspi->max_speed_hz = spi->max_speed_hz; 776 rspi->max_speed_hz = spi->max_speed_hz;
618 777
619 rspi_set_config_register(rspi, 8); 778 set_config_register(rspi, 8);
620 779
621 return 0; 780 return 0;
622} 781}
@@ -726,14 +885,13 @@ static void rspi_release_dma(struct rspi_data *rspi)
726 885
727static int rspi_remove(struct platform_device *pdev) 886static int rspi_remove(struct platform_device *pdev)
728{ 887{
729 struct rspi_data *rspi = spi_master_get(platform_get_drvdata(pdev)); 888 struct rspi_data *rspi = platform_get_drvdata(pdev);
730 889
731 spi_unregister_master(rspi->master); 890 spi_unregister_master(rspi->master);
732 rspi_release_dma(rspi); 891 rspi_release_dma(rspi);
733 free_irq(platform_get_irq(pdev, 0), rspi); 892 free_irq(platform_get_irq(pdev, 0), rspi);
734 clk_put(rspi->clk); 893 clk_put(rspi->clk);
735 iounmap(rspi->addr); 894 iounmap(rspi->addr);
736 spi_master_put(rspi->master);
737 895
738 return 0; 896 return 0;
739} 897}
@@ -745,7 +903,16 @@ static int rspi_probe(struct platform_device *pdev)
745 struct rspi_data *rspi; 903 struct rspi_data *rspi;
746 int ret, irq; 904 int ret, irq;
747 char clk_name[16]; 905 char clk_name[16];
748 906 struct rspi_plat_data *rspi_pd = pdev->dev.platform_data;
907 const struct spi_ops *ops;
908 const struct platform_device_id *id_entry = pdev->id_entry;
909
910 ops = (struct spi_ops *)id_entry->driver_data;
911 /* ops parameter check */
912 if (!ops->set_config_register) {
913 dev_err(&pdev->dev, "there is no set_config_register\n");
914 return -ENODEV;
915 }
749 /* get base addr */ 916 /* get base addr */
750 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 917 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
751 if (unlikely(res == NULL)) { 918 if (unlikely(res == NULL)) {
@@ -767,7 +934,7 @@ static int rspi_probe(struct platform_device *pdev)
767 934
768 rspi = spi_master_get_devdata(master); 935 rspi = spi_master_get_devdata(master);
769 platform_set_drvdata(pdev, rspi); 936 platform_set_drvdata(pdev, rspi);
770 937 rspi->ops = ops;
771 rspi->master = master; 938 rspi->master = master;
772 rspi->addr = ioremap(res->start, resource_size(res)); 939 rspi->addr = ioremap(res->start, resource_size(res));
773 if (rspi->addr == NULL) { 940 if (rspi->addr == NULL) {
@@ -776,7 +943,7 @@ static int rspi_probe(struct platform_device *pdev)
776 goto error1; 943 goto error1;
777 } 944 }
778 945
779 snprintf(clk_name, sizeof(clk_name), "rspi%d", pdev->id); 946 snprintf(clk_name, sizeof(clk_name), "%s%d", id_entry->name, pdev->id);
780 rspi->clk = clk_get(&pdev->dev, clk_name); 947 rspi->clk = clk_get(&pdev->dev, clk_name);
781 if (IS_ERR(rspi->clk)) { 948 if (IS_ERR(rspi->clk)) {
782 dev_err(&pdev->dev, "cannot get clock\n"); 949 dev_err(&pdev->dev, "cannot get clock\n");
@@ -790,7 +957,10 @@ static int rspi_probe(struct platform_device *pdev)
790 INIT_WORK(&rspi->ws, rspi_work); 957 INIT_WORK(&rspi->ws, rspi_work);
791 init_waitqueue_head(&rspi->wait); 958 init_waitqueue_head(&rspi->wait);
792 959
793 master->num_chipselect = 2; 960 master->num_chipselect = rspi_pd->num_chipselect;
961 if (!master->num_chipselect)
962 master->num_chipselect = 2; /* default */
963
794 master->bus_num = pdev->id; 964 master->bus_num = pdev->id;
795 master->setup = rspi_setup; 965 master->setup = rspi_setup;
796 master->transfer = rspi_transfer; 966 master->transfer = rspi_transfer;
@@ -832,11 +1002,32 @@ error1:
832 return ret; 1002 return ret;
833} 1003}
834 1004
1005static struct spi_ops rspi_ops = {
1006 .set_config_register = rspi_set_config_register,
1007 .send_pio = rspi_send_pio,
1008 .receive_pio = rspi_receive_pio,
1009};
1010
1011static struct spi_ops qspi_ops = {
1012 .set_config_register = qspi_set_config_register,
1013 .send_pio = qspi_send_pio,
1014 .receive_pio = qspi_receive_pio,
1015};
1016
1017static struct platform_device_id spi_driver_ids[] = {
1018 { "rspi", (kernel_ulong_t)&rspi_ops },
1019 { "qspi", (kernel_ulong_t)&qspi_ops },
1020 {},
1021};
1022
1023MODULE_DEVICE_TABLE(platform, spi_driver_ids);
1024
835static struct platform_driver rspi_driver = { 1025static struct platform_driver rspi_driver = {
836 .probe = rspi_probe, 1026 .probe = rspi_probe,
837 .remove = rspi_remove, 1027 .remove = rspi_remove,
1028 .id_table = spi_driver_ids,
838 .driver = { 1029 .driver = {
839 .name = "rspi", 1030 .name = "renesas_spi",
840 .owner = THIS_MODULE, 1031 .owner = THIS_MODULE,
841 }, 1032 },
842}; 1033};