struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs, unsigned int max_hz, unsigned int spi_mode) { struct spi_slave *spi; struct spi_flash *flash; int ret; u8 idcode[5]; spi = spi_setup_slave(bus, cs, max_hz, spi_mode); if (!spi) { debug("SF: Failed to set up slave\n"); return NULL; } ret = spi_claim_bus(spi); if (ret) { debug("SF: Failed to claim SPI bus: %d\n", ret); goto err_claim_bus; } /* Read the ID codes */ ret = spi_flash_cmd(spi, CMD_READ_ID, &idcode, sizeof(idcode)); if (ret) goto err_read_id; debug("SF: Got idcode %02x %02x %02x %02x %02x\n", idcode[0], idcode[1], idcode[2], idcode[3], idcode[4]); switch (idcode[0]) { #ifdef CONFIG_SPI_FLASH_SPANSION case 0x01: flash = spi_flash_probe_spansion(spi, idcode); break; #endif #ifdef CONFIG_SPI_FLASH_ATMEL case 0x1F: flash = spi_flash_probe_atmel(spi, idcode); break; #endif #ifdef CONFIG_SPI_FLASH_ESMT case 0x8c: flash = spi_flash_probe_esmt(spi, idcode); break; #endif #ifdef CONFIG_SPI_FLASH_MACRONIX case 0xc2: flash = spi_flash_probe_macronix(spi, idcode); break; #endif #ifdef CONFIG_SPI_FLASH_WINBOND case 0xef: flash = spi_flash_probe_winbond(spi, idcode); break; #endif #ifdef CONFIG_SPI_FLASH_GIGABYTE case 0xc8: flash = spi_flash_probe_gigabyte(spi, idcode); break; #endif #ifdef CONFIG_SPI_FLASH_STMICRO case 0x20: flash = spi_flash_probe_stmicro(spi, idcode); break; #endif #ifdef CONFIG_SPI_FLASH_SST case 0xBF: flash = spi_flash_probe_sst(spi, idcode); break; #endif default: debug("SF: Unsupported manufacturer %02X\n", idcode[0]); flash = NULL; break; } if (!flash) goto err_manufacturer_probe; spi_release_bus(spi); return flash; err_manufacturer_probe: err_read_id: spi_release_bus(spi); err_claim_bus: spi_free_slave(spi); return NULL; }
struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs, unsigned int max_hz, unsigned int spi_mode) { struct spi_slave *spi; struct spi_flash *flash; int ret; u8 idcode[3]; spi = spi_setup_slave(bus, cs, max_hz, spi_mode); if (!spi) { debug("SF: Failed to set up slave\n"); return NULL; } ret = spi_claim_bus(spi); if (ret) { debug("SF: Failed to claim SPI bus: %d\n", ret); goto err_claim_bus; } /* Read the ID codes */ ret=spi_flash_cmd(spi,1<<SPI_FLASH_RDID,&idcode, sizeof(idcode)); if (ret) goto err_read_id; debug("SF: Got idcode %02x %02x %02x\n", idcode[0], idcode[1], idcode[2]); switch (idcode[0]) { #ifdef CONFIG_SPI_FLASH_ESMT case 0x8c: flash = spi_flash_probe_esmt(spi, idcode); break; #endif #ifdef CONFIG_SPI_FLASH_MACRONIX case 0xc2: flash=spi_flash_probe_mxic(spi,idcode); break; #endif #ifdef CONFIG_SPI_FLASH_SST case 0xbf: flash=spi_flash_probe_sst(spi,idcode); break; #endif #ifdef CONFIG_SPI_FLASH_SPANSION case 0x01: flash = spi_flash_probe_spansion(spi, idcode); break; #endif #ifdef CONFIG_SPI_FLASH_ATMEL case 0x1F: flash = spi_flash_probe_atmel(spi, idcode); break; #endif #ifdef CONFIG_SPI_FLASH_WINBOND case 0xef: flash = spi_flash_probe_winbond(spi, idcode); break; #endif #ifdef CONFIG_SPI_FLASH_STMICRO case 0x20: flash = spi_flash_probe_stmicro(spi, idcode); break; #endif #ifdef CONFIG_SPI_FLASH_EON: case 0x1c: flash = spi_flash_probe_eon(spi, idcode); break; #endif default: debug("SF: Unsupported manufacturer %02X\n", idcode[0]); flash = NULL; break; } if (!flash) goto err_manufacturer_probe; #ifdef SPI_WRITE_PROTECT if(spi_check_write_protect()) printf("\nSPI NOR Flash have write protect!!!\n"); else{ printf("\nSPI NOR Flash NO write protect!!!, So I will enable it...\n"); spi_enable_write_protect(); } #endif spi_release_bus(spi); return flash; err_manufacturer_probe: err_read_id: spi_release_bus(spi); err_claim_bus: spi_free_slave(spi); return NULL; }