172a525cbSRafał Miłecki /* 272a525cbSRafał Miłecki * Sonics Silicon Backplane 372a525cbSRafał Miłecki * ChipCommon serial flash interface 472a525cbSRafał Miłecki * 572a525cbSRafał Miłecki * Licensed under the GNU/GPL. See COPYING for details. 672a525cbSRafał Miłecki */ 772a525cbSRafał Miłecki 872a525cbSRafał Miłecki #include <linux/ssb/ssb.h> 972a525cbSRafał Miłecki 1072a525cbSRafał Miłecki #include "ssb_private.h" 1172a525cbSRafał Miłecki 12*59015278SRafał Miłecki struct ssb_sflash_tbl_e { 13*59015278SRafał Miłecki char *name; 14*59015278SRafał Miłecki u32 id; 15*59015278SRafał Miłecki u32 blocksize; 16*59015278SRafał Miłecki u16 numblocks; 17*59015278SRafał Miłecki }; 18*59015278SRafał Miłecki 19*59015278SRafał Miłecki static struct ssb_sflash_tbl_e ssb_sflash_st_tbl[] = { 20*59015278SRafał Miłecki { "M25P20", 0x11, 0x10000, 4, }, 21*59015278SRafał Miłecki { "M25P40", 0x12, 0x10000, 8, }, 22*59015278SRafał Miłecki 23*59015278SRafał Miłecki { "M25P16", 0x14, 0x10000, 32, }, 24*59015278SRafał Miłecki { "M25P32", 0x15, 0x10000, 64, }, 25*59015278SRafał Miłecki { "M25P64", 0x16, 0x10000, 128, }, 26*59015278SRafał Miłecki { "M25FL128", 0x17, 0x10000, 256, }, 27*59015278SRafał Miłecki { 0 }, 28*59015278SRafał Miłecki }; 29*59015278SRafał Miłecki 30*59015278SRafał Miłecki static struct ssb_sflash_tbl_e ssb_sflash_sst_tbl[] = { 31*59015278SRafał Miłecki { "SST25WF512", 1, 0x1000, 16, }, 32*59015278SRafał Miłecki { "SST25VF512", 0x48, 0x1000, 16, }, 33*59015278SRafał Miłecki { "SST25WF010", 2, 0x1000, 32, }, 34*59015278SRafał Miłecki { "SST25VF010", 0x49, 0x1000, 32, }, 35*59015278SRafał Miłecki { "SST25WF020", 3, 0x1000, 64, }, 36*59015278SRafał Miłecki { "SST25VF020", 0x43, 0x1000, 64, }, 37*59015278SRafał Miłecki { "SST25WF040", 4, 0x1000, 128, }, 38*59015278SRafał Miłecki { "SST25VF040", 0x44, 0x1000, 128, }, 39*59015278SRafał Miłecki { "SST25VF040B", 0x8d, 0x1000, 128, }, 40*59015278SRafał Miłecki { "SST25WF080", 5, 0x1000, 256, }, 41*59015278SRafał Miłecki { "SST25VF080B", 0x8e, 0x1000, 256, }, 42*59015278SRafał Miłecki { "SST25VF016", 0x41, 0x1000, 512, }, 43*59015278SRafał Miłecki { "SST25VF032", 0x4a, 0x1000, 1024, }, 44*59015278SRafał Miłecki { "SST25VF064", 0x4b, 0x1000, 2048, }, 45*59015278SRafał Miłecki { 0 }, 46*59015278SRafał Miłecki }; 47*59015278SRafał Miłecki 48*59015278SRafał Miłecki static struct ssb_sflash_tbl_e ssb_sflash_at_tbl[] = { 49*59015278SRafał Miłecki { "AT45DB011", 0xc, 256, 512, }, 50*59015278SRafał Miłecki { "AT45DB021", 0x14, 256, 1024, }, 51*59015278SRafał Miłecki { "AT45DB041", 0x1c, 256, 2048, }, 52*59015278SRafał Miłecki { "AT45DB081", 0x24, 256, 4096, }, 53*59015278SRafał Miłecki { "AT45DB161", 0x2c, 512, 4096, }, 54*59015278SRafał Miłecki { "AT45DB321", 0x34, 512, 8192, }, 55*59015278SRafał Miłecki { "AT45DB642", 0x3c, 1024, 8192, }, 56*59015278SRafał Miłecki { 0 }, 57*59015278SRafał Miłecki }; 58*59015278SRafał Miłecki 59*59015278SRafał Miłecki static void ssb_sflash_cmd(struct ssb_chipcommon *cc, u32 opcode) 60*59015278SRafał Miłecki { 61*59015278SRafał Miłecki int i; 62*59015278SRafał Miłecki chipco_write32(cc, SSB_CHIPCO_FLASHCTL, 63*59015278SRafał Miłecki SSB_CHIPCO_FLASHCTL_START | opcode); 64*59015278SRafał Miłecki for (i = 0; i < 1000; i++) { 65*59015278SRafał Miłecki if (!(chipco_read32(cc, SSB_CHIPCO_FLASHCTL) & 66*59015278SRafał Miłecki SSB_CHIPCO_FLASHCTL_BUSY)) 67*59015278SRafał Miłecki return; 68*59015278SRafał Miłecki cpu_relax(); 69*59015278SRafał Miłecki } 70*59015278SRafał Miłecki pr_err("SFLASH control command failed (timeout)!\n"); 71*59015278SRafał Miłecki } 72*59015278SRafał Miłecki 7372a525cbSRafał Miłecki /* Initialize serial flash access */ 7472a525cbSRafał Miłecki int ssb_sflash_init(struct ssb_chipcommon *cc) 7572a525cbSRafał Miłecki { 76*59015278SRafał Miłecki struct ssb_sflash_tbl_e *e; 77*59015278SRafał Miłecki u32 id, id2; 78*59015278SRafał Miłecki 79*59015278SRafał Miłecki switch (cc->capabilities & SSB_CHIPCO_CAP_FLASHT) { 80*59015278SRafał Miłecki case SSB_CHIPCO_FLASHT_STSER: 81*59015278SRafał Miłecki ssb_sflash_cmd(cc, SSB_CHIPCO_FLASHCTL_ST_DP); 82*59015278SRafał Miłecki 83*59015278SRafał Miłecki chipco_write32(cc, SSB_CHIPCO_FLASHADDR, 0); 84*59015278SRafał Miłecki ssb_sflash_cmd(cc, SSB_CHIPCO_FLASHCTL_ST_RES); 85*59015278SRafał Miłecki id = chipco_read32(cc, SSB_CHIPCO_FLASHDATA); 86*59015278SRafał Miłecki 87*59015278SRafał Miłecki chipco_write32(cc, SSB_CHIPCO_FLASHADDR, 1); 88*59015278SRafał Miłecki ssb_sflash_cmd(cc, SSB_CHIPCO_FLASHCTL_ST_RES); 89*59015278SRafał Miłecki id2 = chipco_read32(cc, SSB_CHIPCO_FLASHDATA); 90*59015278SRafał Miłecki 91*59015278SRafał Miłecki switch (id) { 92*59015278SRafał Miłecki case 0xbf: 93*59015278SRafał Miłecki for (e = ssb_sflash_sst_tbl; e->name; e++) { 94*59015278SRafał Miłecki if (e->id == id2) 95*59015278SRafał Miłecki break; 96*59015278SRafał Miłecki } 97*59015278SRafał Miłecki break; 98*59015278SRafał Miłecki case 0x13: 99*59015278SRafał Miłecki return -ENOTSUPP; 100*59015278SRafał Miłecki default: 101*59015278SRafał Miłecki for (e = ssb_sflash_st_tbl; e->name; e++) { 102*59015278SRafał Miłecki if (e->id == id) 103*59015278SRafał Miłecki break; 104*59015278SRafał Miłecki } 105*59015278SRafał Miłecki break; 106*59015278SRafał Miłecki } 107*59015278SRafał Miłecki if (!e->name) { 108*59015278SRafał Miłecki pr_err("Unsupported ST serial flash (id: 0x%X, id2: 0x%X)\n", 109*59015278SRafał Miłecki id, id2); 110*59015278SRafał Miłecki return -ENOTSUPP; 111*59015278SRafał Miłecki } 112*59015278SRafał Miłecki 113*59015278SRafał Miłecki break; 114*59015278SRafał Miłecki case SSB_CHIPCO_FLASHT_ATSER: 115*59015278SRafał Miłecki ssb_sflash_cmd(cc, SSB_CHIPCO_FLASHCTL_AT_STATUS); 116*59015278SRafał Miłecki id = chipco_read32(cc, SSB_CHIPCO_FLASHDATA) & 0x3c; 117*59015278SRafał Miłecki 118*59015278SRafał Miłecki for (e = ssb_sflash_at_tbl; e->name; e++) { 119*59015278SRafał Miłecki if (e->id == id) 120*59015278SRafał Miłecki break; 121*59015278SRafał Miłecki } 122*59015278SRafał Miłecki if (!e->name) { 123*59015278SRafał Miłecki pr_err("Unsupported Atmel serial flash (id: 0x%X)\n", 124*59015278SRafał Miłecki id); 125*59015278SRafał Miłecki return -ENOTSUPP; 126*59015278SRafał Miłecki } 127*59015278SRafał Miłecki 128*59015278SRafał Miłecki break; 129*59015278SRafał Miłecki default: 130*59015278SRafał Miłecki pr_err("Unsupported flash type\n"); 131*59015278SRafał Miłecki return -ENOTSUPP; 132*59015278SRafał Miłecki } 133*59015278SRafał Miłecki 134*59015278SRafał Miłecki pr_info("Found %s serial flash (blocksize: 0x%X, blocks: %d)\n", 135*59015278SRafał Miłecki e->name, e->blocksize, e->numblocks); 136*59015278SRafał Miłecki 13772a525cbSRafał Miłecki pr_err("Serial flash support is not implemented yet!\n"); 13872a525cbSRafał Miłecki 13972a525cbSRafał Miłecki return -ENOTSUPP; 14072a525cbSRafał Miłecki } 141