2 * Copyright (c) 2010 -2014 Espressif System.
4 * spi serial i/f driver
5 * - sdio device control routines
6 * - sync/async DMA/PIO read/write
11 #include <linux/module.h>
12 #include <net/mac80211.h>
13 #include <linux/time.h>
15 #include <linux/spi/spi.h>
16 #include <linux/interrupt.h>
17 #include <linux/kthread.h>
23 #include "esp_debug.h"
24 #include "slc_host_register.h"
25 #include "esp_version.h"
30 #endif /* USE_EXT_GPIO */
32 static int /*__init */ esp_spi_init(void);
33 static void /* __exit */ esp_spi_exit(void);
36 extern u8 *esp_get_lspi_buf(void);
37 extern void esp_put_lspi_buf(u8 **p);
40 #define SPI_BLOCK_SIZE (512)
42 #define MAX_BUF_SIZE (48*1024)
44 static unsigned char *buf_addr = NULL;
45 static unsigned char *tx_cmd;
46 static unsigned char *rx_cmd;
47 static unsigned char *check_buf = NULL;
48 static unsigned char *ff_buf = NULL;
50 unsigned int crc_ta_8[256]={
51 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
52 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
53 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
54 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
55 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
56 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
57 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
58 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
59 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
60 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
61 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
62 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
63 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
64 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
65 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
66 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
67 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
68 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
69 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
70 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
71 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
72 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
73 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
74 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
75 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
76 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
77 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
78 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
79 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
80 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
81 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
82 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
86 unsigned int crc_cal_by_byte(unsigned char* ptr, int len)
88 unsigned short crc = 0;
92 unsigned int high = (unsigned int)(crc >> 8);
94 crc ^= crc_ta_8[high^*ptr];
101 struct task_struct *sif_irq_thread;
103 #define ESP_DMA_IBUFSZ 2048
105 //unsigned int esp_msg_level = 0;
106 unsigned int esp_msg_level = ESP_DBG_ERROR | ESP_SHOW;
108 static struct semaphore esp_powerup_sem;
110 static enum esp_sdio_state sif_sdio_state;
111 struct esp_spi_ctrl *sif_sctrl = NULL;
112 static struct esp_spi_resp spi_resp;
114 #ifdef ESP_ANDROID_LOGGER
115 bool log_off = false;
116 #endif /* ESP_ANDROID_LOGGER */
118 #ifdef REQUEST_RTC_IRQ
119 extern int request_rtc_irq(void);
122 #include "spi_stub.c"
124 struct esp_spi_resp *sif_get_spi_resp(void)
129 void sif_lock_bus(struct esp_pub *epub)
131 EPUB_FUNC_CHECK(epub, _exit);
133 spi_bus_lock(EPUB_TO_FUNC(epub)->master);
138 void sif_unlock_bus(struct esp_pub *epub)
140 EPUB_FUNC_CHECK(epub, _exit);
142 spi_bus_unlock(EPUB_TO_FUNC(epub)->master);
147 int sif_spi_write_then_read(struct spi_device *spi, unsigned char* bufwrite, int sizesend, unsigned char* bufread, int sizeread)
151 error = spi_write_then_read(spi, bufwrite,sizesend, bufread, sizeread);
154 esp_dbg(ESP_DBG_ERROR, "%s: failed, error: %d\n",
162 int sif_spi_write_async_read(struct spi_device *spi, unsigned char* bufwrite,unsigned char* bufread,int size)
164 struct spi_transfer xfer = {
169 .speed_hz = SPI_FREQ,
171 struct spi_message msg;
174 spi_message_init(&msg);
175 spi_message_add_tail(&xfer, &msg);
177 error = spi_sync_locked(spi, &msg);
179 esp_dbg(ESP_DBG_ERROR, "spierr %s: failed, error: %d\n",
187 int sif_spi_write_raw(struct spi_device *spi, unsigned char* buf, int size)
190 struct spi_transfer xfer = {
194 .speed_hz = SPI_FREQ,
196 struct spi_message msg;
198 spi_message_init(&msg);
199 spi_message_add_tail(&xfer, &msg);
201 err = spi_sync_locked(spi, &msg);
204 esp_dbg(ESP_DBG_ERROR, "%s: failed, error: %d\n",
212 int sif_spi_read_raw(struct spi_device *spi, unsigned char* buf, int size)
214 memset(buf,0xff,size);
215 return sif_spi_write_async_read(spi,buf,buf,size);
218 int sif_spi_write_bytes(struct spi_device *spi, unsigned int addr, unsigned char *src,int count, int dummymode)
222 unsigned char *tx_data = (unsigned char*)src;
225 spi_resp.data_resp_size_w = ((((((count>>5)+1) *75)) +44)>>3) +1;
241 if( addr >= (1<<17) )
249 tx_cmd[1]=0x90|0x04|(addr>>15); //0x94;
254 tx_cmd[3]=( addr<<1|0x0 );
255 tx_cmd[4]= 0x00; //0x08;
259 tx_cmd[3]=( addr<<1|(count>>8 & 0x01) );
260 tx_cmd[4]= count & 0xff; //0x08;
268 memset(tx_cmd+pos,0xff,CMD_RESP_SIZE);
269 pos =pos+ CMD_RESP_SIZE;
276 memcpy(tx_cmd+pos,tx_data,count);
280 memset(tx_cmd+pos,0xff,spi_resp.data_resp_size_w);
281 pos = pos+ spi_resp.data_resp_size_w ;
287 memset(tx_cmd+pos,0xff,len);
294 memset(tx_cmd+pos,0xff,len);
300 sif_spi_write_async_read(spi, tx_cmd,tx_cmd,pos+len);
303 for(i=0;i<CMD_RESP_SIZE;i++)
305 if(tx_cmd[pos+i] == 0x00 && tx_cmd[pos+i-1] == 0xff)
307 if(tx_cmd[pos+i+1] == 0x00 && tx_cmd[pos+i+2] == 0xff)
312 if(i>spi_resp.max_cmd_resp_size)
314 spi_resp.max_cmd_resp_size = i;
319 esp_dbg(ESP_DBG_ERROR, "byte write cmd resp 0x00 no recv\n");
324 pos = pos+CMD_RESP_SIZE+count+1;
325 for(i=0;i<spi_resp.data_resp_size_w;i++)
327 if(tx_cmd[pos+i] == 0xE5)
329 //esp_dbg(ESP_DBG_ERROR, "0xE5 pos:%d",i);
330 for(i++;i<spi_resp.data_resp_size_w ;i++)
332 if( tx_cmd[pos+i] == 0xFF)
334 // esp_dbg(ESP_DBG_ERROR, "find ff pos = %d,i = %d\n",pos+i,i);
336 if(i>spi_resp.max_dataW_resp_size)
338 spi_resp.max_dataW_resp_size = i;
339 // printk(KERN_ERR "new data write MAX 0xFF pos:%d",spi_resp.max_dataW_resp_size);
342 //esp_dbg(ESP_DBG_ERROR, "0xFF pos:%d",i);
349 if(i>=spi_resp.data_resp_size_w)
352 esp_dbg(ESP_DBG, "normal byte write data no-busy wait byte 0xff no recv at the first time\n");
357 //memset(check_buf,0x00,256);
359 sif_spi_read_raw(spi, check_buf, 256);
360 } while( memcmp(check_buf,ff_buf,256) != 0 && timeout >0 ) ;
364 esp_dbg(ESP_DBG_ERROR, "spierr byte write data no-busy wait byte 0xff no recv \n");
374 int sif_spi_write_blocks(struct spi_device *spi, unsigned int addr,unsigned char *src, int count)
380 unsigned char *tx_data = (unsigned char*)src;
398 if( addr >= (1<<17) )
405 tx_cmd[1]=0x90|0x0C|(addr>>15);
410 tx_cmd[3]=( addr<<1|0x0 );
415 tx_cmd[3]=( addr<<1|(count>>8 & 0x01) );
416 tx_cmd[4]= count & 0xff ;
423 memset(tx_cmd+pos,0xff,CMD_RESP_SIZE);
424 pos =pos+ CMD_RESP_SIZE;
433 memcpy(tx_cmd+pos,tx_data+j*SPI_BLOCK_SIZE, SPI_BLOCK_SIZE);
434 pos = pos+SPI_BLOCK_SIZE;
438 memset(tx_cmd+pos , 0xff , spi_resp.block_w_data_resp_size_final);
439 pos = pos+ spi_resp.block_w_data_resp_size_final;
442 memset(tx_cmd+pos , 0xff , BLOCK_W_DATA_RESP_SIZE_EACH);
443 pos = pos+ BLOCK_W_DATA_RESP_SIZE_EACH;
449 memset(tx_cmd+pos,0xff,len);
454 sif_spi_write_async_read(spi, tx_cmd,tx_cmd,pos+len);
456 //Judge Write cmd resp, and 1st block data resp.
458 for(i=0;i<CMD_RESP_SIZE;i++)
460 if(tx_cmd[pos+i] == 0x00 && tx_cmd[pos+i-1] == 0xff)
462 if(tx_cmd[pos+i+1] == 0x00 && tx_cmd[pos+i+2] == 0xff)
468 if(i>spi_resp.max_cmd_resp_size)
470 spi_resp.max_cmd_resp_size = i;
475 esp_dbg(ESP_DBG_ERROR, "spierr 1st block write cmd resp 0x00 no recv, %d\n", count);
480 pos = pos+CMD_RESP_SIZE;
485 //Judge block data resp
487 pos = pos+SPI_BLOCK_SIZE;
490 n = spi_resp.block_w_data_resp_size_final;
492 n= BLOCK_W_DATA_RESP_SIZE_EACH;
496 if((tx_cmd[pos+i] & 0x0F) == 0x05)
505 if(memcmp(tx_cmd+pos+n-4,ff_buf,4) != 0)
508 esp_dbg(ESP_DBG, "block write sleep 1\n");
514 //memset(check_buf,0x00,256);
516 sif_spi_read_raw(spi, check_buf, 256);
517 } while( memcmp(check_buf,ff_buf,256) != 0 && timeout >0 ) ;
522 esp_dbg(ESP_DBG_ERROR, "spierr block write data no-busy wait byte 0xff no recv \n");
529 esp_dbg(ESP_DBG_ERROR, "spierr %s block%d write data not-busy wait error, %d\n", __func__, j+1, count);
537 esp_dbg(ESP_DBG_ERROR, "spierr %s block%d write data no data res error, %d\n", __func__, j+1, count);
553 memcpy(tx_cmd+pos,tx_data+j*SPI_BLOCK_SIZE, SPI_BLOCK_SIZE);
554 pos = pos+SPI_BLOCK_SIZE;
556 memset(tx_cmd+pos , 0xff , BLOCK_W_DATA_RESP_SIZE_EACH);
557 pos = pos+ BLOCK_W_DATA_RESP_SIZE_EACH;
563 memset(tx_cmd+pos,0xff,len);
568 sif_spi_write_async_read(spi, tx_cmd,tx_cmd,pos+len);
570 //Judge Write cmd resp, and 1st block data resp.
572 for(i=0;i<CMD_RESP_SIZE;i++)
574 if(tx_cmd[pos+i] == 0x00 && tx_cmd[pos+i-1] == 0xff)
576 if(tx_cmd[pos+i+1] == 0x00 && tx_cmd[pos+i+2] == 0xff)
582 if(i>spi_resp.max_cmd_resp_size)
584 spi_resp.max_cmd_resp_size = i;
589 esp_dbg(ESP_DBG_ERROR, "spierr 1st block write cmd resp 0x00 no recv, %d\n", count);
594 pos = pos+CMD_RESP_SIZE;
599 //Judge block data resp
601 pos = pos+SPI_BLOCK_SIZE;
603 n = BLOCK_W_DATA_RESP_SIZE_EACH;
607 if((tx_cmd[pos+i] & 0x0F) == 0x05)
616 if(memcmp(tx_cmd+pos+n-4,ff_buf,4) != 0 )
618 esp_dbg(ESP_DBG, "block write data during sleep \n");
626 sif_spi_read_raw(spi, check_buf, 256);
627 } while( memcmp(check_buf,ff_buf,256) != 0 && timeout >0 ) ;
632 esp_dbg(ESP_DBG_ERROR, "spierr block write data no-busy wait byte 0xff no recv \n");
639 esp_dbg(ESP_DBG_ERROR, "spierr %s block%d write data not-busy wait error, %d\n", __func__, j+1, count);
647 esp_dbg(ESP_DBG_ERROR, "spierr %s block%d write data no data res error, %d\n", __func__, j+1, count);
662 memcpy(tx_cmd+pos,tx_data+j*SPI_BLOCK_SIZE, SPI_BLOCK_SIZE);
663 pos = pos+SPI_BLOCK_SIZE;
667 memset(tx_cmd+pos , 0xff ,spi_resp.block_w_data_resp_size_final);
668 pos = pos+spi_resp.block_w_data_resp_size_final;
671 memset(tx_cmd+pos , 0xff , BLOCK_W_DATA_RESP_SIZE_EACH);
672 pos = pos+ BLOCK_W_DATA_RESP_SIZE_EACH;
678 memset(tx_cmd+pos,0xff,len);
683 sif_spi_write_async_read(spi, tx_cmd,tx_cmd,pos+len);
689 //Judge block data resp
691 pos = pos+SPI_BLOCK_SIZE;
694 n = spi_resp.block_w_data_resp_size_final;
696 n= BLOCK_W_DATA_RESP_SIZE_EACH;
700 if((tx_cmd[pos+i] & 0x0F) == 0x05)
709 if(memcmp(tx_cmd+pos+n-4,ff_buf,4) != 0)
712 esp_dbg(ESP_DBG_ERROR, "spierr %s block%d write data not-busy wait error, %d\n", __func__, j+1, count);
719 esp_dbg(ESP_DBG_ERROR, "spierr %s block%d write data no data res error, %d\n", __func__, j+1, count);
732 int sif_spi_write_mix_nosync(struct spi_device *spi, unsigned int addr, unsigned char *buf, int len, int dummymode)
738 blk_cnt = len/SPI_BLOCK_SIZE;
739 remain_len = len%SPI_BLOCK_SIZE;
742 err = sif_spi_write_blocks(spi, addr, buf, blk_cnt);
747 if (remain_len > 0) {
748 err = sif_spi_write_bytes(spi, addr, (buf + (blk_cnt*SPI_BLOCK_SIZE)), remain_len, dummymode);
757 int sif_spi_write_mix_sync(struct spi_device *spi, unsigned int addr, unsigned char *buf, int len, int dummymode)
761 spi_bus_lock(spi->master);
762 err = sif_spi_write_mix_nosync(spi, addr, buf, len, dummymode);
763 spi_bus_unlock(spi->master);
768 int sif_spi_epub_write_mix_nosync(struct esp_pub *epub, unsigned int addr, unsigned char *buf,int len, int dummymode)
770 struct esp_spi_ctrl *sctrl = NULL;
771 struct spi_device *spi = NULL;
777 sctrl = (struct esp_spi_ctrl *)epub->sif;
784 return sif_spi_write_mix_nosync(spi, addr, buf, len, dummymode);
787 int sif_spi_epub_write_mix_sync(struct esp_pub *epub, unsigned int addr, unsigned char *buf,int len, int dummymode)
789 struct esp_spi_ctrl *sctrl = NULL;
790 struct spi_device *spi = NULL;
796 sctrl = (struct esp_spi_ctrl *)epub->sif;
803 return sif_spi_write_mix_sync(spi, addr, buf, len, dummymode);
806 int sif_spi_read_bytes(struct spi_device *spi, unsigned int addr,unsigned char *dst, int count, int dummymode)
808 int pos,total_num,len;
810 unsigned char *rx_data = (unsigned char *)dst;
812 unsigned short crc = 0;
817 int find_start_token = 0;
818 spi_resp.data_resp_size_r = ((((((count>>2)+1) *25)>>5)*21+16)>>3) +1 ;
834 if( addr >= (1<<17) )
841 rx_cmd[1]=0x10|0x04|(addr>>15); //0x94;
846 rx_cmd[3]=( addr<<1|0x0 );
847 rx_cmd[4]= 0x00; //0x08;
851 rx_cmd[3]=( addr<<1|(count>>8 & 0x01) );
852 rx_cmd[4]= count & 0xff; //0x08;
858 total_num = CMD_RESP_SIZE+spi_resp.data_resp_size_r+count+2;
859 memset(rx_cmd+6 , 0xFF ,total_num);
863 len =128 -6 -total_num;
864 memset(rx_cmd+6+total_num,0xff,len);
869 if( (6+total_num)%8 )
871 len = (8 - (6+total_num)%8);
872 memset(rx_cmd+6+total_num,0xff,len);
879 sif_spi_write_async_read(spi, rx_cmd,rx_cmd,6+total_num+len);
882 for(i=0;i<CMD_RESP_SIZE;i++)
884 if(rx_cmd[pos+i] == 0x00 && rx_cmd[pos+i-1] == 0xff)
886 if(rx_cmd[pos+i+1] == 0x00 && rx_cmd[pos+i+2] == 0xff)
891 if(i>spi_resp.max_cmd_resp_size)
893 spi_resp.max_cmd_resp_size = i;
894 //printk(KERN_ERR "new cmd write MAX 0xFF pos:%d",spi_resp.max_cmd_resp_size);
900 esp_dbg(ESP_DBG_ERROR, "spierr byte read cmd resp 0x00 no recv\n");
901 /***********error info************************/
904 while ( t < pos+32) {
905 printk(KERN_ERR "rx:[0x%02x] ", rx_cmd[t]);
908 printk(KERN_ERR "\n");
914 //esp_dbg(ESP_DBG_ERROR, "0x00 pos:%d",pos+i);
917 for(i=0;i<spi_resp.data_resp_size_r;i++)
919 if(rx_cmd[pos+i]==0xFE)
922 find_start_token = 1;
923 if(i>spi_resp.max_dataR_resp_size)
925 spi_resp.max_dataR_resp_size = i;
926 //printk(KERN_ERR "new data read MAX 0xFE pos:%d",spi_resp.max_dataR_resp_size);
930 else if(rx_cmd[pos+i] != 0xff)
934 esp_dbg(ESP_DBG, " 1 normal byte read not 0xFF or 0xFE at the first time,count = %d,addr =%x \n",count,addr);
938 if(find_start_token == 0)
941 esp_dbg(ESP_DBG, " normal byte read start token 0xFE not recv at the first time,count = %d,addr =%x \n",count,addr);
943 pos = pos +spi_resp.data_resp_size_r;
945 for(i=0;i< 6+total_num+len-pos;i++)
947 if(rx_cmd[pos+i]==0xFE)
949 sif_spi_read_raw(spi,rx_cmd,((count+4)>256)?(count+4):256);
950 // sif_spi_read_raw(spi, check_buf, 256);
951 find_start_token = 1;
955 else if(rx_cmd[pos+i] !=0xff)
959 esp_dbg(ESP_DBG, "2 normal byte read not 0xFF or 0xFE at the first time,count = %d,addr =%x \n",count,addr);
968 sif_spi_read_raw(spi, check_buf, 256);
971 if(check_buf[i] ==0xFE)
973 find_start_token = 1;
974 sif_spi_read_raw(spi,rx_cmd,((count+4)>256)?(count+4):256);
979 } while( find_start_token != 1 && timeout >0 ) ;
983 esp_dbg(ESP_DBG_ERROR, "spierr byte read start token 0xFE no recv ,count = %d,addr =%x \n",count,addr);
990 //esp_dbg(ESP_DBG_ERROR, "0xFE pos:%d",pos+i);
992 memcpy(rx_data,rx_cmd+pos,count);
994 crc = crc_cal_by_byte(rx_data,count);
996 test_crc[0] = crc & 0xff;
997 test_crc[1] = (crc >>8) &0xff ;
999 if(test_crc[1] != rx_cmd[pos+count] || test_crc[0] != rx_cmd[pos+count+1] )
1001 esp_dbg(ESP_DBG, "crc test_crc0 %x\n",test_crc[0]);
1002 esp_dbg(ESP_DBG, "crc test_crc1 %x\n",test_crc[1]);
1003 esp_dbg(ESP_DBG, "crc rx_data-2 %x\n",rx_cmd[pos+count]);
1004 esp_dbg(ESP_DBG, "crc rx_data-1 %x\n",rx_cmd[pos+count+1] );
1006 esp_dbg(ESP_DBG, "crc err\n");
1008 esp_dbg(ESP_DBG_ERROR, "spierr crc count = %d,addr =%x \n",count,addr);
1020 int sif_spi_read_blocks(struct spi_device *spi, unsigned int addr, unsigned char *dst, int count)
1025 unsigned char *rx_data = (unsigned char *)dst;
1028 int find_start_token = 0;
1029 unsigned short crc = 0;
1045 if( addr >= (1<<17) )
1052 rx_cmd[1]=0x10|0x0C|(addr>>15);
1057 rx_cmd[3]=( addr<<1|0x0 );
1062 rx_cmd[3]=( addr<<1|(count>>8 & 0x01) );
1063 rx_cmd[4]= count & 0xff;
1067 total_num = CMD_RESP_SIZE+spi_resp.block_r_data_resp_size_final+SPI_BLOCK_SIZE+ 2 + (count-1)*(BLOCK_R_DATA_RESP_SIZE_EACH+SPI_BLOCK_SIZE+2);
1068 memset(rx_cmd+6, 0xFF ,total_num);
1070 if( (6+total_num)%8 )
1072 len = (8 - (6+total_num)%8);
1073 memset(rx_cmd+6+total_num,0xff,len);
1078 sif_spi_write_async_read(spi, rx_cmd,rx_cmd,6+total_num+len );
1081 for(i=0;i<CMD_RESP_SIZE;i++)
1083 if(rx_cmd[pos+i] == 0x00 && rx_cmd[pos+i-1] == 0xff)
1085 if(rx_cmd[pos+i+1] == 0x00 && rx_cmd[pos+i+2] == 0xff)
1090 if(i>spi_resp.max_cmd_resp_size)
1092 spi_resp.max_cmd_resp_size = i;
1093 //printk(KERN_ERR "new cmd write MAX 0xFF pos:%d",spi_resp.max_cmd_resp_size);
1096 if(i>=CMD_RESP_SIZE)
1098 esp_dbg(ESP_DBG_ERROR, "spierr block read cmd resp 0x00 no recv\n");
1106 for(i=0;i<spi_resp.block_r_data_resp_size_final;i++)
1108 if(rx_cmd[pos+i]==0xFE)
1110 //esp_dbg(ESP_DBG_ERROR, "0xFE pos:%d",i);
1111 find_start_token = 1;
1112 if(i>spi_resp.max_block_dataR_resp_size)
1114 spi_resp.max_block_dataR_resp_size = i;
1115 //printk(KERN_ERR "new block data read MAX 0xFE pos:%d\n",spi_resp.max_block_dataR_resp_size);
1122 if( find_start_token == 0)
1124 esp_dbg(ESP_DBG, "1st block read data resp 0xFE no recv,count = %d\n",count);
1125 pos = pos +spi_resp.block_r_data_resp_size_final;
1126 for(i=0;i< 6+total_num+len-pos;i++)
1128 if(rx_cmd[pos+i]==0xFE)
1130 sif_spi_read_raw(spi, check_buf, total_num+len);
1131 find_start_token = 1;
1139 esp_dbg(ESP_DBG_ERROR, "block read sleep ,count = %d\n",count);
1141 sif_spi_read_raw(spi, check_buf, 256);
1144 if(check_buf[i] ==0xFE)
1146 find_start_token= 1;
1147 sif_spi_read_raw(spi, rx_cmd, total_num+len);
1151 } while( find_start_token != 1 && timeout >0 ) ;
1155 esp_dbg(ESP_DBG_ERROR, "spierr block read start token 0xFE no recv\n");
1165 memcpy(rx_data,rx_cmd+pos,SPI_BLOCK_SIZE);
1167 crc = crc_cal_by_byte(rx_data,512);
1169 test_crc[0] = crc & 0xff;
1170 test_crc[1] = (crc >>8) &0xff ;
1172 if(test_crc[1] != rx_cmd[pos+SPI_BLOCK_SIZE] || test_crc[0] != rx_cmd[pos+SPI_BLOCK_SIZE+1] )
1174 esp_dbg(ESP_DBG, "crc test_crc0 %x\n",test_crc[0]);
1175 esp_dbg(ESP_DBG, "crc test_crc1 %x\n",test_crc[1]);
1176 esp_dbg(ESP_DBG, "crc rx_data-2 %x\n",rx_cmd[pos+SPI_BLOCK_SIZE]);
1177 esp_dbg(ESP_DBG, "crc rx_data-1 %x\n",rx_cmd[pos+SPI_BLOCK_SIZE+1] );
1179 esp_dbg(ESP_DBG_ERROR, "spierr crc err block = 1,count = %d\n",count);
1186 pos = pos +SPI_BLOCK_SIZE + 2;
1188 for(j=1;j<count;j++)
1191 for(i=0;i<BLOCK_R_DATA_RESP_SIZE_EACH;i++)
1193 if(rx_cmd[pos+i]==0xFE)
1195 //esp_dbg(ESP_DBG_ERROR, "0xFE pos:%d",i);
1196 if(i>spi_resp.max_block_dataR_resp_size)
1198 spi_resp.max_block_dataR_resp_size = i;
1199 //printk(KERN_ERR "new block data read MAX 0xFE pos:%d",spi_resp.max_block_dataR_resp_size);
1205 if(i>=BLOCK_R_DATA_RESP_SIZE_EACH)
1207 esp_dbg(ESP_DBG_ERROR, "spierr block%d read data token 0xFE no recv,total:%d\n",j+1,count);
1214 memcpy(rx_data+j*SPI_BLOCK_SIZE,rx_cmd+pos,SPI_BLOCK_SIZE);
1216 crc = crc_cal_by_byte(rx_data+j*SPI_BLOCK_SIZE ,512);
1218 test_crc[0] = crc & 0xff;
1219 test_crc[1] = (crc >>8) &0xff ;
1221 if(test_crc[1] != rx_cmd[pos+SPI_BLOCK_SIZE] || test_crc[0] != rx_cmd[pos+SPI_BLOCK_SIZE+1] )
1223 esp_dbg(ESP_DBG, "crc test_crc0 %x\n",test_crc[0]);
1224 esp_dbg(ESP_DBG, "crc test_crc1 %x\n",test_crc[1]);
1225 esp_dbg(ESP_DBG, "crc rx_data-2 %x\n",rx_cmd[pos+SPI_BLOCK_SIZE]);
1226 esp_dbg(ESP_DBG, "crc rx_data-1 %x\n",rx_cmd[pos+SPI_BLOCK_SIZE+1] );
1228 esp_dbg(ESP_DBG_ERROR, "spierr crc err,count = %d,block =%d\n",count,j+1);
1234 pos = pos +SPI_BLOCK_SIZE + 2;
1242 int sif_spi_read_mix_nosync(struct spi_device *spi, unsigned int addr, unsigned char *buf, int len, int dummymode)
1250 blk_cnt = len/SPI_BLOCK_SIZE;
1251 remain_len = len%SPI_BLOCK_SIZE;
1260 check_buf[0] = 1<<2;
1261 err = sif_spi_read_blocks(spi, addr, buf, blk_cnt);
1264 sif_spi_write_bytes(spi,SLC_HOST_CONF_W4 + 2,check_buf,1,0);
1265 } else if(err == -4 ||err == -5 ||err == -6||err == -7 ||err == -8)
1267 struct esp_spi_ctrl *sctrl = spi_get_drvdata(spi);
1269 sif_ack_target_read_err(sctrl->epub);
1271 } else if(err == -3)
1279 }while(retry > 0 && err != 0);
1280 if(err != 0 && retry == 0)
1281 esp_dbg(ESP_DBG_ERROR, "spierr 20 times retry block read fail\n");
1287 if (remain_len > 0) {
1295 err = sif_spi_read_bytes(spi, addr, (buf + (blk_cnt*SPI_BLOCK_SIZE)), remain_len, dummymode);
1296 }while(retry >0 && err != 0);
1298 if(err != 0 && retry == 0)
1299 esp_dbg(ESP_DBG_ERROR, "spierr 20 times retry byte read fail\n");
1303 err = sif_spi_read_bytes(spi, addr, (buf + (blk_cnt*SPI_BLOCK_SIZE)), remain_len, dummymode);
1312 int sif_spi_read_mix_sync(struct spi_device *spi, unsigned int addr, unsigned char *buf, int len, int dummymode)
1316 spi_bus_lock(spi->master);
1317 err = sif_spi_read_mix_nosync(spi, addr, buf, len, dummymode);
1318 spi_bus_unlock(spi->master);
1323 int sif_spi_epub_read_mix_nosync(struct esp_pub *epub, unsigned int addr, unsigned char *buf,int len, int dummymode)
1325 struct esp_spi_ctrl *sctrl = NULL;
1326 struct spi_device *spi = NULL;
1332 sctrl = (struct esp_spi_ctrl *)epub->sif;
1339 return sif_spi_read_mix_nosync(spi, addr, buf, len, dummymode);
1342 int sif_spi_epub_read_mix_sync(struct esp_pub *epub, unsigned int addr, unsigned char *buf,int len, int dummymode)
1344 struct esp_spi_ctrl *sctrl = NULL;
1345 struct spi_device *spi = NULL;
1351 sctrl = (struct esp_spi_ctrl *)epub->sif;
1358 return sif_spi_read_mix_sync(spi, addr, buf, len, dummymode);
1361 int sif_spi_read_sync(struct esp_pub *epub, unsigned char *buf, int len, int dummymode)
1363 struct esp_spi_ctrl *sctrl = NULL;
1364 struct spi_device *spi = NULL;
1367 if (epub == NULL || buf == NULL) {
1371 sctrl = (struct esp_spi_ctrl *)epub->sif;
1378 switch(sctrl->target_id) {
1383 read_len = roundup(len, sctrl->slc_blk_sz);
1390 return sif_spi_read_mix_sync(spi, sctrl->slc_window_end_addr - 2 - (len), buf, read_len, dummymode);
1393 int sif_spi_write_sync(struct esp_pub *epub, unsigned char *buf, int len, int dummymode)
1395 struct esp_spi_ctrl *sctrl = NULL;
1396 struct spi_device *spi = NULL;
1399 if (epub == NULL || buf == NULL) {
1403 sctrl = (struct esp_spi_ctrl *)epub->sif;
1410 switch(sctrl->target_id) {
1415 write_len = roundup(len, sctrl->slc_blk_sz);
1421 return sif_spi_write_mix_sync(spi, sctrl->slc_window_end_addr - (len), buf, write_len, dummymode);
1424 int sif_spi_read_nosync(struct esp_pub *epub, unsigned char *buf, int len, int dummymode, bool noround)
1426 struct esp_spi_ctrl *sctrl = NULL;
1427 struct spi_device *spi = NULL;
1430 if (epub == NULL || buf == NULL) {
1434 sctrl = (struct esp_spi_ctrl *)epub->sif;
1441 switch(sctrl->target_id) {
1447 read_len = roundup(len, sctrl->slc_blk_sz);
1456 return sif_spi_read_mix_nosync(spi, sctrl->slc_window_end_addr - 2 - (len), buf, read_len, dummymode);
1459 int sif_spi_write_nosync(struct esp_pub *epub, unsigned char *buf, int len, int dummymode)
1461 struct esp_spi_ctrl *sctrl = NULL;
1462 struct spi_device *spi = NULL;
1465 if (epub == NULL || buf == NULL) {
1469 sctrl = (struct esp_spi_ctrl *)epub->sif;
1476 switch(sctrl->target_id) {
1481 write_len = roundup(len, sctrl->slc_blk_sz);
1487 return sif_spi_write_mix_nosync(spi, sctrl->slc_window_end_addr - (len), buf, write_len, dummymode);
1490 int sif_spi_protocol_init(struct spi_device *spi)
1492 unsigned char spi_proto_ini_status = 0;
1493 unsigned char rx_buf1[10];
1494 unsigned char tx_buf1[10];
1495 unsigned char dummy_tx_buf[10];
1496 memset(dummy_tx_buf,0xff,sizeof(dummy_tx_buf));
1499 if( spi_proto_ini_status == 0 )
1510 //printf("CMD0 \n");
1511 sif_spi_write_raw(spi, tx_buf1, 6);
1512 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1513 // esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1514 // ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1516 if(fail_count++ > 10)
1518 }while( rx_buf1[2] != 0x01 );
1521 else if( spi_proto_ini_status == 1 )
1525 tx_buf1[2]=0x20; //0x04;
1529 //spi_err("CMD 5 1st\n");
1530 sif_spi_write_raw(spi, tx_buf1, 6);
1531 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1532 // esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1533 // ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1535 else if( spi_proto_ini_status == 2 )
1543 //spi_err("CMD5 2nd\n");
1544 sif_spi_write_raw(spi, tx_buf1, 6);
1545 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1546 // esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1547 // ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1549 else if( spi_proto_ini_status == 3 ) //CMD 52 addr 0x2, data 0x02;
1557 //spi_err("CMD52 Write addr 02 \n");
1558 sif_spi_write_raw(spi, tx_buf1, 6);
1559 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1560 // esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1561 // ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1563 else if( spi_proto_ini_status == 4 )
1571 //spi_err("CMD52 Write addr 04 \n");
1572 sif_spi_write_raw(spi, tx_buf1, 6);
1573 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1574 // esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1575 // ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1577 else if( spi_proto_ini_status == 5 )
1585 //spi_err("CMD52 Read addr 0x2 \n");
1586 sif_spi_write_raw(spi, tx_buf1, 6);
1587 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1588 // esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1589 // ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1592 else if( spi_proto_ini_status == 6 )
1600 //spi_err("CMD52 Read addr 0x4 \n");
1601 sif_spi_write_raw(spi, tx_buf1, 6);
1602 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1603 // esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1604 // ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1606 else if (spi_proto_ini_status>6 && spi_proto_ini_status<15)
1611 tx_buf1[3]=0xF0+2*(spi_proto_ini_status-7);
1614 sif_spi_write_raw(spi, tx_buf1, 6);
1615 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1616 // esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1617 // ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1619 else if (spi_proto_ini_status==15)
1621 //spi_err("CMD52 Write Reg addr 0x110 \n");
1623 tx_buf1[1]=0x80; //func0 should be
1626 tx_buf1[4]=(unsigned char)(SPI_BLOCK_SIZE & 0xff); //0x02;
1628 sif_spi_write_raw(spi, tx_buf1, 6);
1629 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1630 // esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1631 // ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1633 //spi_err("CMD52 Write Reg addr 0x111 \n");
1638 tx_buf1[4]=(unsigned char)(SPI_BLOCK_SIZE>>8); //0x00;
1640 sif_spi_write_raw(spi, tx_buf1, 6);
1641 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1642 // esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1643 // ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1645 //spi_err("CMD52 Write Reg addr 0x111 \n"); /* set boot mode */
1650 tx_buf1[4]=0x01; //0x00;
1652 sif_spi_write_raw(spi, tx_buf1, 6);
1653 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1654 esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1655 ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1658 else if (spi_proto_ini_status==16)
1661 //printf("CMD52 Write Reg addr 0x40 \n");
1666 tx_buf1[4]=0x91; //0x02;
1668 sif_spi_write_raw(spi, tx_buf1, 6);
1669 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1670 esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1671 ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1673 //sif_spi_read_bytes( 0x0c,rx_buf1, 4);
1675 //printf("CMD52 Write Reg addr 0x3c \n");
1682 sif_spi_write_raw(spi, tx_buf1, 6);
1683 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1684 esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1685 ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1687 //printf("CMD52 Write Reg addr 0x3d \n");
1692 tx_buf1[4]=0x34; //0x02;
1694 sif_spi_write_raw(spi, tx_buf1, 6);
1695 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1696 esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1697 ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1699 // printf("CMD52 Write Reg addr 0x3e \n");
1704 tx_buf1[4]=0xfe; //0x02;
1706 sif_spi_write_raw(spi, tx_buf1, 6);
1707 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1708 esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1709 ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1711 //printf("CMD52 Write Reg addr 0x3f \n");
1716 tx_buf1[4]=0x00; //0x02;
1718 sif_spi_write_raw(spi, tx_buf1, 6);
1719 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1720 esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1721 ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1723 //printf("CMD52 Write Reg addr 0x40 \n");
1728 tx_buf1[4]=0xd1; //0x02;
1730 sif_spi_write_raw(spi, tx_buf1, 6);
1731 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1732 esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1733 ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1739 tx_buf1[4]=0x30; //0x02;
1741 sif_spi_write_raw(spi, tx_buf1, 6);
1742 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1743 esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1744 ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1753 spi_proto_ini_status++;
1758 static int spi_irq_thread(void *data)
1760 struct spi_device *spi = (struct spi_device *)data;
1765 set_current_state(TASK_INTERRUPTIBLE);
1766 sif_platform_irq_mask(0);
1768 if (!kthread_should_stop())
1771 set_current_state(TASK_RUNNING);
1773 } while (!kthread_should_stop());
1777 int sif_setup_irq_thread(struct spi_device *spi)
1779 sif_irq_thread = kthread_run(spi_irq_thread, spi, "kspiirqd/eagle");
1780 if (IS_ERR(sif_irq_thread)) {
1781 esp_dbg(ESP_DBG_ERROR, "setup irq thread error!\n");
1787 static irqreturn_t sif_irq_handler(int irq, void *dev_id)
1789 sif_platform_irq_mask(1);
1791 if (sif_platform_is_irq_occur()) {
1792 wake_up_process(sif_irq_thread);
1794 sif_platform_irq_mask(0);
1801 void sif_enable_irq(struct esp_pub *epub)
1804 struct esp_spi_ctrl *sctrl = NULL;
1805 struct spi_device *spi = NULL;
1811 sctrl = (struct esp_spi_ctrl *)epub->sif;
1820 sif_platform_irq_init();
1821 err = sif_setup_irq_thread(spi);
1823 esp_dbg(ESP_DBG_ERROR, "%s setup sif irq failed\n", __func__);
1827 /******************compat with other device in some shared irq system ********************/
1829 #ifdef REQUEST_IRQ_SHARED
1830 #if defined(REQUEST_IRQ_RISING)
1831 err = request_irq(sif_platform_get_irq_no(), sif_irq_handler, IRQF_TRIGGER_RISING | IRQF_SHARED, "esp_spi_irq", spi);
1832 #elif defined(REQUEST_IRQ_FALLING)
1833 err = request_irq(sif_platform_get_irq_no(), sif_irq_handler, IRQF_TRIGGER_FALLING | IRQF_SHARED, "esp_spi_irq", spi);
1834 #elif defined(REQUEST_IRQ_LOWLEVEL)
1835 err = request_irq(sif_platform_get_irq_no(), sif_irq_handler, IRQF_TRIGGER_LOW | IRQF_SHARED, "esp_spi_irq", spi);
1836 #elif defined(REQUEST_IRQ_HIGHLEVEL)
1837 err = request_irq(sif_platform_get_irq_no(), sif_irq_handler, IRQF_TRIGGER_HIGH | IRQF_SHARED, "esp_spi_irq", spi);
1839 err = request_irq(sif_platform_get_irq_no(), sif_irq_handler, IRQF_TRIGGER_LOW | IRQF_SHARED, "esp_spi_irq", spi);
1840 #endif /* TRIGGER MODE */
1842 err = request_irq(sif_platform_get_irq_no(), sif_irq_handler, IRQF_TRIGGER_LOW, "esp_spi_irq", spi);
1843 #endif /* ESP_IRQ_SHARED */
1846 esp_dbg(ESP_DBG_ERROR, "sif %s failed\n", __func__);
1849 #ifdef IRQ_WAKE_HOST
1850 enable_irq_wake(sif_platform_get_irq_no());
1852 atomic_set(&sctrl->irq_installed, 1);
1855 void sif_disable_irq(struct esp_pub *epub)
1858 struct esp_spi_ctrl *sctrl = NULL;
1859 struct spi_device *spi = NULL;
1865 sctrl = (struct esp_spi_ctrl *)epub->sif;
1872 if (atomic_read(&sctrl->irq_installed) == 0)
1875 while (atomic_read(&sctrl->irq_handling)) {
1876 schedule_timeout(HZ / 100);
1878 esp_dbg(ESP_DBG_ERROR, "%s force to stop irq\n", __func__);
1883 free_irq(sif_platform_get_irq_no(), spi);
1884 kthread_stop(sif_irq_thread);
1886 sif_platform_irq_deinit();
1888 atomic_set(&sctrl->irq_installed, 0);
1892 int esp_setup_spi(struct spi_device *spi)
1894 #ifndef ESP_PREALLOC
1897 /**** alloc buffer for spi io */
1898 if (sif_sdio_state == ESP_SDIO_STATE_FIRST_INIT) {
1900 if ((buf_addr = esp_get_lspi_buf()) == NULL)
1903 while ((buf_addr = (unsigned char *)kmalloc (MAX_BUF_SIZE, GFP_KERNEL)) == NULL) {
1908 if ((check_buf = (unsigned char *)kmalloc (256, GFP_KERNEL)) == NULL)
1909 goto _err_check_buf;
1911 if ((ff_buf = (unsigned char *)kmalloc (256, GFP_KERNEL)) == NULL)
1914 memset(ff_buf,0xff,256);
1919 spi_resp.max_dataW_resp_size = 0;
1920 spi_resp.max_dataR_resp_size = 0;
1921 spi_resp.max_block_dataW_resp_size = 0;
1922 spi_resp.max_block_dataR_resp_size = 0;
1923 spi_resp.max_cmd_resp_size = 0;
1924 if( sif_get_ate_config() != 5)
1926 spi_resp.data_resp_size_w = DATA_RESP_SIZE_W;
1927 spi_resp.data_resp_size_r = DATA_RESP_SIZE_R;
1928 spi_resp.block_w_data_resp_size_final = BLOCK_W_DATA_RESP_SIZE_FINAL;
1929 spi_resp.block_r_data_resp_size_final = BLOCK_R_DATA_RESP_SIZE_1ST;
1931 spi_resp.data_resp_size_w = 1000;
1932 spi_resp.data_resp_size_r = 1000;
1933 spi_resp.block_w_data_resp_size_final = 1000;
1934 spi_resp.block_r_data_resp_size_final = 1000;
1947 esp_put_lspi_buf(&buf_addr);
1958 static int esp_spi_probe(struct spi_device *spi);
1959 static int esp_spi_remove(struct spi_device *spi);
1961 static int esp_spi_probe(struct spi_device *spi)
1964 struct esp_pub *epub;
1965 struct esp_spi_ctrl *sctrl;
1967 esp_dbg(ESP_DBG_ERROR, "%s enter\n", __func__);
1969 err = esp_setup_spi(spi);
1971 esp_dbg(ESP_DBG_ERROR, "%s setup_spi error[%d]\n", __func__, err);
1972 if(sif_sdio_state == ESP_SDIO_STATE_FIRST_INIT)
1975 goto _err_second_init;
1977 esp_dbg(ESP_DBG_ERROR, "%s init_protocol\n", __func__);
1978 err = sif_spi_protocol_init(spi);
1980 if(sif_sdio_state == ESP_SDIO_STATE_FIRST_INIT)
1983 goto _err_second_init;
1986 if(sif_sdio_state == ESP_SDIO_STATE_FIRST_INIT){
1987 sctrl = kzalloc(sizeof(struct esp_spi_ctrl), GFP_KERNEL);
1989 if (sctrl == NULL) {
1994 /* temp buffer reserved for un-dma-able request */
1995 sctrl->dma_buffer = kzalloc(ESP_DMA_IBUFSZ, GFP_KERNEL);
1997 if (sctrl->dma_buffer == NULL) {
2002 sctrl->slc_blk_sz = SIF_SLC_BLOCK_SIZE;
2004 epub = esp_pub_alloc_mac80211(&spi->dev);
2007 esp_dbg(ESP_DBG_ERROR, "no mem for epub \n");
2011 epub->sif = (void *)sctrl;
2015 if (sif_get_ate_config() == 0) {
2016 err = ext_gpio_init(epub);
2018 esp_dbg(ESP_DBG_ERROR, "ext_irq_work_init failed %d\n", err);
2027 SET_IEEE80211_DEV(epub->hw, &spi->dev);
2028 epub->dev = &spi->dev;
2031 epub->sdio_state = sif_sdio_state;
2034 spi_set_drvdata(spi, sctrl);
2037 if(sif_sdio_state == ESP_SDIO_STATE_FIRST_INIT)
2040 goto _err_second_init;
2042 check_target_id(epub);
2044 err = esp_pub_init_all(epub);
2047 esp_dbg(ESP_DBG_ERROR, "esp_init_all failed: %d\n", err);
2048 if(sif_sdio_state == ESP_SDIO_STATE_FIRST_INIT){
2050 goto _err_first_init;
2052 if(sif_sdio_state == ESP_SDIO_STATE_SECOND_INIT)
2053 goto _err_second_init;
2056 esp_dbg(ESP_DBG_TRACE, " %s return %d\n", __func__, err);
2057 if(sif_sdio_state == ESP_SDIO_STATE_FIRST_INIT){
2058 esp_dbg(ESP_DBG_ERROR, "first normal exit\n");
2059 sif_sdio_state = ESP_SDIO_STATE_FIRST_NORMAL_EXIT;
2060 up(&esp_powerup_sem);
2066 if (sif_get_ate_config() == 0)
2070 esp_pub_dealloc_mac80211(epub);
2072 kfree(sctrl->dma_buffer);
2078 esp_put_lspi_buf(&buf_addr);
2096 if(sif_sdio_state == ESP_SDIO_STATE_FIRST_INIT){
2097 esp_dbg(ESP_DBG_ERROR, "first error exit\n");
2098 sif_sdio_state = ESP_SDIO_STATE_FIRST_ERROR_EXIT;
2099 up(&esp_powerup_sem);
2103 sif_sdio_state = ESP_SDIO_STATE_SECOND_ERROR_EXIT;
2104 esp_spi_remove(spi);
2108 static int esp_spi_remove(struct spi_device *spi)
2110 struct esp_spi_ctrl *sctrl = NULL;
2112 esp_dbg(ESP_SHOW, "%s \n", __func__);
2114 sctrl = spi_get_drvdata(spi);
2116 if (sctrl == NULL) {
2117 esp_dbg(ESP_DBG_ERROR, "%s no sctrl\n", __func__);
2122 if (sctrl->epub == NULL) {
2123 esp_dbg(ESP_DBG_ERROR, "%s epub null\n", __func__);
2126 sctrl->epub->sdio_state = sif_sdio_state;
2127 if(sif_sdio_state != ESP_SDIO_STATE_FIRST_NORMAL_EXIT){
2128 if (sctrl->epub->sip) {
2129 sip_detach(sctrl->epub->sip);
2130 sctrl->epub->sip = NULL;
2131 esp_dbg(ESP_DBG_TRACE, "%s sip detached \n", __func__);
2134 if (sif_get_ate_config() == 0)
2138 //sif_disable_target_interrupt(sctrl->epub);
2139 atomic_set(&sctrl->epub->sip->state, SIP_STOP);
2140 sif_disable_irq(sctrl->epub);
2144 test_exit_netlink();
2145 #endif /* TEST_MODE */
2146 if(sif_sdio_state != ESP_SDIO_STATE_FIRST_NORMAL_EXIT){
2147 esp_pub_dealloc_mac80211(sctrl->epub);
2148 esp_dbg(ESP_DBG_TRACE, "%s dealloc mac80211 \n", __func__);
2150 if (sctrl->dma_buffer) {
2151 kfree(sctrl->dma_buffer);
2152 sctrl->dma_buffer = NULL;
2153 esp_dbg(ESP_DBG_TRACE, "%s free dma_buffer \n", __func__);
2160 esp_put_lspi_buf(&buf_addr);
2183 spi_set_drvdata(spi,NULL);
2185 esp_dbg(ESP_DBG_TRACE, "eagle spi remove complete\n");
2190 static int esp_spi_suspend(struct device *dev)
2192 struct spi_device *spi = to_spi_device(dev);
2193 struct esp_spi_ctrl *sctrl = spi_get_drvdata(spi);
2194 struct esp_pub *epub = sctrl->epub;
2196 printk("%s", __func__);
2198 sip_send_suspend_config(epub, 1);
2200 atomic_set(&epub->ps.state, ESP_PM_ON);
2204 static int esp_spi_resume(struct device *dev)
2206 esp_dbg(ESP_DBG_ERROR, "%s", __func__);
2211 static const struct dev_pm_ops esp_spi_pm_ops = {
2212 .suspend= esp_spi_suspend,
2213 .resume= esp_spi_resume,
2216 extern struct spi_device_id esp_spi_id[];
2218 struct spi_driver esp_spi_driver = {
2219 .id_table = esp_spi_id,
2222 .bus = &spi_bus_type,
2223 .owner = THIS_MODULE,
2224 .pm = &esp_spi_pm_ops,
2226 .probe = esp_spi_probe,
2227 .remove = esp_spi_remove,
2230 static int esp_spi_dummy_probe(struct spi_device *spi)
2232 esp_dbg(ESP_DBG_ERROR, "%s enter\n", __func__);
2234 up(&esp_powerup_sem);
2239 static int esp_spi_dummy_remove(struct spi_device *spi)
2244 struct spi_driver esp_spi_dummy_driver = {
2245 .id_table = esp_spi_id,
2247 .name = "eagle_dummy",
2248 .bus = &spi_bus_type,
2249 .owner = THIS_MODULE,
2251 .probe = esp_spi_dummy_probe,
2252 .remove = esp_spi_dummy_remove,
2255 static int __init esp_spi_init(void)
2257 #define ESP_WAIT_UP_TIME_MS 11000
2261 bool powerup = false;
2264 esp_dbg(ESP_DBG_TRACE, "%s \n", __func__);
2266 #ifdef REGISTER_SPI_BOARD_INFO
2267 sif_platform_register_board_info();
2272 esp_dbg(ESP_SHOW, "\n*****%s %s EAGLE DRIVER VER:%llx*****\n\n", __DATE__, __TIME__, ver);
2274 edf_ret = esp_debugfs_init();
2276 request_init_conf();
2278 esp_wakelock_init();
2282 sema_init(&esp_powerup_sem, 0);
2284 sif_platform_target_poweron();
2286 err = spi_register_driver(&esp_spi_dummy_driver);
2288 esp_dbg(ESP_DBG_ERROR, "eagle spi driver registration failed, error code: %d\n", err);
2292 if (down_timeout(&esp_powerup_sem,
2293 msecs_to_jiffies(ESP_WAIT_UP_TIME_MS)) == 0)
2301 esp_dbg(ESP_SHOW, "%s ------ RETRY ------ \n", __func__);
2303 sif_record_retry_config();
2305 spi_unregister_driver(&esp_spi_dummy_driver);
2307 sif_platform_target_poweroff();
2312 esp_dbg(ESP_DBG_ERROR, "eagle spi can not power up!\n");
2318 esp_dbg(ESP_SHOW, "%s power up OK\n", __func__);
2320 spi_unregister_driver(&esp_spi_dummy_driver);
2322 sif_sdio_state = ESP_SDIO_STATE_FIRST_INIT;
2323 sema_init(&esp_powerup_sem, 0);
2325 spi_register_driver(&esp_spi_driver);
2327 if (down_timeout(&esp_powerup_sem,
2328 msecs_to_jiffies(ESP_WAIT_UP_TIME_MS)) == 0 && sif_get_ate_config() == 0) {
2329 if(sif_sdio_state == ESP_SDIO_STATE_FIRST_NORMAL_EXIT){
2330 spi_unregister_driver(&esp_spi_driver);
2334 sif_sdio_state = ESP_SDIO_STATE_SECOND_INIT;
2336 spi_register_driver(&esp_spi_driver);
2341 esp_register_early_suspend();
2343 #ifdef REQUEST_RTC_IRQ
2350 esp_wakelock_destroy();
2355 static void __exit esp_spi_exit(void)
2357 esp_dbg(ESP_SHOW, "%s \n", __func__);
2361 esp_unregister_early_suspend();
2363 spi_unregister_driver(&esp_spi_driver);
2366 sif_platform_target_poweroff();
2367 #endif /* !FPGA_DEBUG */
2369 esp_wakelock_destroy();
2372 MODULE_AUTHOR("Espressif System");
2373 MODULE_DESCRIPTION("Driver for SPI interconnected eagle low-power WLAN devices");
2374 MODULE_LICENSE("GPL");
2375 #endif /* ESP_USE_SPI */