1*49dec7f7SSheetal Tigadoli /* 2*49dec7f7SSheetal Tigadoli * Copyright (c) 2019-2020, Broadcom 3*49dec7f7SSheetal Tigadoli * 4*49dec7f7SSheetal Tigadoli * SPDX-License-Identifier: BSD-3-Clause 5*49dec7f7SSheetal Tigadoli */ 6*49dec7f7SSheetal Tigadoli 7*49dec7f7SSheetal Tigadoli #ifndef SF_H 8*49dec7f7SSheetal Tigadoli #define SF_H 9*49dec7f7SSheetal Tigadoli 10*49dec7f7SSheetal Tigadoli #include <stdint.h> 11*49dec7f7SSheetal Tigadoli #include <stddef.h> 12*49dec7f7SSheetal Tigadoli 13*49dec7f7SSheetal Tigadoli #ifdef SPI_DEBUG 14*49dec7f7SSheetal Tigadoli #define SPI_DEBUG(fmt, ...) INFO(fmt, ##__VA_ARGS__) 15*49dec7f7SSheetal Tigadoli #else 16*49dec7f7SSheetal Tigadoli #define SPI_DEBUG(fmt, ...) 17*49dec7f7SSheetal Tigadoli #endif 18*49dec7f7SSheetal Tigadoli 19*49dec7f7SSheetal Tigadoli #define SPI_FLASH_MAX_ID_LEN 6 20*49dec7f7SSheetal Tigadoli 21*49dec7f7SSheetal Tigadoli #define CMD_WRSR 0x01 /* Write status register */ 22*49dec7f7SSheetal Tigadoli #define CMD_PAGE_PROGRAM 0x02 23*49dec7f7SSheetal Tigadoli #define CMD_READ_NORMAL 0x03 24*49dec7f7SSheetal Tigadoli #define CMD_RDSR 0x05 25*49dec7f7SSheetal Tigadoli #define CMD_WRITE_ENABLE 0x06 26*49dec7f7SSheetal Tigadoli #define CMD_RDFSR 0x70 27*49dec7f7SSheetal Tigadoli #define CMD_READ_ID 0x9f 28*49dec7f7SSheetal Tigadoli #define CMD_ERASE_4K 0x20 29*49dec7f7SSheetal Tigadoli #define CMD_ERASE_64K 0xd8 30*49dec7f7SSheetal Tigadoli #define ERASE_SIZE_64K (64 * 1024) 31*49dec7f7SSheetal Tigadoli 32*49dec7f7SSheetal Tigadoli /* Common status */ 33*49dec7f7SSheetal Tigadoli #define STATUS_WIP BIT(0) 34*49dec7f7SSheetal Tigadoli 35*49dec7f7SSheetal Tigadoli struct spi_flash { 36*49dec7f7SSheetal Tigadoli struct spi_slave *spi; 37*49dec7f7SSheetal Tigadoli uint32_t size; 38*49dec7f7SSheetal Tigadoli uint32_t page_size; 39*49dec7f7SSheetal Tigadoli uint32_t sector_size; 40*49dec7f7SSheetal Tigadoli uint32_t erase_size; 41*49dec7f7SSheetal Tigadoli uint8_t erase_cmd; 42*49dec7f7SSheetal Tigadoli uint8_t read_cmd; 43*49dec7f7SSheetal Tigadoli uint8_t write_cmd; 44*49dec7f7SSheetal Tigadoli uint8_t flags; 45*49dec7f7SSheetal Tigadoli }; 46*49dec7f7SSheetal Tigadoli 47*49dec7f7SSheetal Tigadoli struct spi_flash_info { 48*49dec7f7SSheetal Tigadoli const char *name; 49*49dec7f7SSheetal Tigadoli 50*49dec7f7SSheetal Tigadoli /* 51*49dec7f7SSheetal Tigadoli * This array stores the ID bytes. 52*49dec7f7SSheetal Tigadoli * The first three bytes are the JEDIC ID. 53*49dec7f7SSheetal Tigadoli * JEDEC ID zero means "no ID" (mostly older chips). 54*49dec7f7SSheetal Tigadoli */ 55*49dec7f7SSheetal Tigadoli uint8_t id[SPI_FLASH_MAX_ID_LEN]; 56*49dec7f7SSheetal Tigadoli uint8_t id_len; 57*49dec7f7SSheetal Tigadoli 58*49dec7f7SSheetal Tigadoli uint32_t sector_size; 59*49dec7f7SSheetal Tigadoli uint32_t n_sectors; 60*49dec7f7SSheetal Tigadoli uint16_t page_size; 61*49dec7f7SSheetal Tigadoli 62*49dec7f7SSheetal Tigadoli uint8_t flags; 63*49dec7f7SSheetal Tigadoli }; 64*49dec7f7SSheetal Tigadoli 65*49dec7f7SSheetal Tigadoli /* Enum list - Full read commands */ 66*49dec7f7SSheetal Tigadoli enum spi_read_cmds { 67*49dec7f7SSheetal Tigadoli ARRAY_SLOW = BIT(0), 68*49dec7f7SSheetal Tigadoli ARRAY_FAST = BIT(1), 69*49dec7f7SSheetal Tigadoli DUAL_OUTPUT_FAST = BIT(2), 70*49dec7f7SSheetal Tigadoli DUAL_IO_FAST = BIT(3), 71*49dec7f7SSheetal Tigadoli QUAD_OUTPUT_FAST = BIT(4), 72*49dec7f7SSheetal Tigadoli QUAD_IO_FAST = BIT(5), 73*49dec7f7SSheetal Tigadoli }; 74*49dec7f7SSheetal Tigadoli 75*49dec7f7SSheetal Tigadoli /* sf param flags */ 76*49dec7f7SSheetal Tigadoli enum spi_param_flag { 77*49dec7f7SSheetal Tigadoli SECT_4K = BIT(0), 78*49dec7f7SSheetal Tigadoli SECT_32K = BIT(1), 79*49dec7f7SSheetal Tigadoli E_FSR = BIT(2), 80*49dec7f7SSheetal Tigadoli SST_BP = BIT(3), 81*49dec7f7SSheetal Tigadoli SST_WP = BIT(4), 82*49dec7f7SSheetal Tigadoli WR_QPP = BIT(5), 83*49dec7f7SSheetal Tigadoli }; 84*49dec7f7SSheetal Tigadoli 85*49dec7f7SSheetal Tigadoli int spi_flash_cmd_read(const uint8_t *cmd, size_t cmd_len, 86*49dec7f7SSheetal Tigadoli void *data, size_t data_len); 87*49dec7f7SSheetal Tigadoli int spi_flash_cmd(uint8_t cmd, void *response, size_t len); 88*49dec7f7SSheetal Tigadoli int spi_flash_cmd_write(const uint8_t *cmd, size_t cmd_len, 89*49dec7f7SSheetal Tigadoli const void *data, size_t data_len); 90*49dec7f7SSheetal Tigadoli #endif 91