These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / include / linux / mtd / spi-nor.h
index e540952..bc742da 100644 (file)
 #ifndef __LINUX_MTD_SPI_NOR_H
 #define __LINUX_MTD_SPI_NOR_H
 
+#include <linux/bitops.h>
+#include <linux/mtd/cfi.h>
+
+/*
+ * Manufacturer IDs
+ *
+ * The first byte returned from the flash after sending opcode SPINOR_OP_RDID.
+ * Sometimes these are the same as CFI IDs, but sometimes they aren't.
+ */
+#define SNOR_MFR_ATMEL         CFI_MFR_ATMEL
+#define SNOR_MFR_INTEL         CFI_MFR_INTEL
+#define SNOR_MFR_MICRON                CFI_MFR_ST /* ST Micro <--> Micron */
+#define SNOR_MFR_MACRONIX      CFI_MFR_MACRONIX
+#define SNOR_MFR_SPANSION      CFI_MFR_AMD
+#define SNOR_MFR_SST           CFI_MFR_SST
+#define SNOR_MFR_WINBOND       0xef /* Also used by some Spansion */
+
 /*
  * Note on opcode nomenclature: some opcodes have a format like
  * SPINOR_OP_FUNCTION{4,}_x_y_z. The numbers x, y, and z stand for the number
 #define SPINOR_OP_WD_EVCR      0x61    /* Write EVCR register */
 
 /* Status Register bits. */
-#define SR_WIP                 1       /* Write in progress */
-#define SR_WEL                 2       /* Write enable latch */
+#define SR_WIP                 BIT(0)  /* Write in progress */
+#define SR_WEL                 BIT(1)  /* Write enable latch */
 /* meaning of other SR_* bits may differ between vendors */
-#define SR_BP0                 4       /* Block protect 0 */
-#define SR_BP1                 8       /* Block protect 1 */
-#define SR_BP2                 0x10    /* Block protect 2 */
-#define SR_SRWD                        0x80    /* SR write protect */
+#define SR_BP0                 BIT(2)  /* Block protect 0 */
+#define SR_BP1                 BIT(3)  /* Block protect 1 */
+#define SR_BP2                 BIT(4)  /* Block protect 2 */
+#define SR_SRWD                        BIT(7)  /* SR write protect */
 
-#define SR_QUAD_EN_MX          0x40    /* Macronix Quad I/O */
+#define SR_QUAD_EN_MX          BIT(6)  /* Macronix Quad I/O */
 
 /* Enhanced Volatile Configuration Register bits */
-#define EVCR_QUAD_EN_MICRON    0x80    /* Micron Quad I/O */
+#define EVCR_QUAD_EN_MICRON    BIT(7)  /* Micron Quad I/O */
 
 /* Flag Status Register bits */
-#define FSR_READY              0x80
+#define FSR_READY              BIT(7)
 
 /* Configuration Register bits. */
-#define CR_QUAD_EN_SPAN                0x2     /* Spansion Quad I/O */
+#define CR_QUAD_EN_SPAN                BIT(1)  /* Spansion Quad I/O */
 
 enum read_mode {
        SPI_NOR_NORMAL = 0,
@@ -87,33 +104,6 @@ enum read_mode {
        SPI_NOR_QUAD,
 };
 
-/**
- * struct spi_nor_xfer_cfg - Structure for defining a Serial Flash transfer
- * @wren:              command for "Write Enable", or 0x00 for not required
- * @cmd:               command for operation
- * @cmd_pins:          number of pins to send @cmd (1, 2, 4)
- * @addr:              address for operation
- * @addr_pins:         number of pins to send @addr (1, 2, 4)
- * @addr_width:                number of address bytes
- *                     (3,4, or 0 for address not required)
- * @mode:              mode data
- * @mode_pins:         number of pins to send @mode (1, 2, 4)
- * @mode_cycles:       number of mode cycles (0 for mode not required)
- * @dummy_cycles:      number of dummy cycles (0 for dummy not required)
- */
-struct spi_nor_xfer_cfg {
-       u8              wren;
-       u8              cmd;
-       u8              cmd_pins;
-       u32             addr;
-       u8              addr_pins;
-       u8              addr_width;
-       u8              mode;
-       u8              mode_pins;
-       u8              mode_cycles;
-       u8              dummy_cycles;
-};
-
 #define SPI_NOR_MAX_CMD_SIZE   8
 enum spi_nor_ops {
        SPI_NOR_OPS_READ = 0,
@@ -127,11 +117,14 @@ enum spi_nor_option_flags {
        SNOR_F_USE_FSR          = BIT(0),
 };
 
+struct mtd_info;
+
 /**
  * struct spi_nor - Structure for defining a the SPI NOR layer
  * @mtd:               point to a mtd_info structure
  * @lock:              the lock for the read/write/erase/lock/unlock operations
  * @dev:               point to a spi device, or a spi nor controller device.
+ * @flash_node:                point to a device node describing this flash instance.
  * @page_size:         the page size of the SPI NOR
  * @addr_width:                number of address bytes
  * @erase_opcode:      the opcode for erasing a sector
@@ -141,28 +134,28 @@ enum spi_nor_option_flags {
  * @flash_read:                the mode of the read
  * @sst_write_second:  used by the SST write operation
  * @flags:             flag options for the current SPI-NOR (SNOR_F_*)
- * @cfg:               used by the read_xfer/write_xfer
  * @cmd_buf:           used by the write_reg
  * @prepare:           [OPTIONAL] do some preparations for the
  *                     read/write/erase/lock/unlock operations
  * @unprepare:         [OPTIONAL] do some post work after the
  *                     read/write/erase/lock/unlock operations
- * @read_xfer:         [OPTIONAL] the read fundamental primitive
- * @write_xfer:                [OPTIONAL] the writefundamental primitive
  * @read_reg:          [DRIVER-SPECIFIC] read out the register
  * @write_reg:         [DRIVER-SPECIFIC] write data to the register
  * @read:              [DRIVER-SPECIFIC] read data from the SPI NOR
  * @write:             [DRIVER-SPECIFIC] write data to the SPI NOR
  * @erase:             [DRIVER-SPECIFIC] erase a sector of the SPI NOR
  *                     at the offset @offs
- * @lock:              [FLASH-SPECIFIC] lock a region of the SPI NOR
- * @unlock:            [FLASH-SPECIFIC] unlock a region of the SPI NOR
+ * @flash_lock:                [FLASH-SPECIFIC] lock a region of the SPI NOR
+ * @flash_unlock:      [FLASH-SPECIFIC] unlock a region of the SPI NOR
+ * @flash_is_locked:   [FLASH-SPECIFIC] check if a region of the SPI NOR is
+ *                     completely locked
  * @priv:              the private data
  */
 struct spi_nor {
-       struct mtd_info         *mtd;
+       struct mtd_info         mtd;
        struct mutex            lock;
        struct device           *dev;
+       struct device_node      *flash_node;
        u32                     page_size;
        u8                      addr_width;
        u8                      erase_opcode;
@@ -172,18 +165,12 @@ struct spi_nor {
        enum read_mode          flash_read;
        bool                    sst_write_second;
        u32                     flags;
-       struct spi_nor_xfer_cfg cfg;
        u8                      cmd_buf[SPI_NOR_MAX_CMD_SIZE];
 
        int (*prepare)(struct spi_nor *nor, enum spi_nor_ops ops);
        void (*unprepare)(struct spi_nor *nor, enum spi_nor_ops ops);
-       int (*read_xfer)(struct spi_nor *nor, struct spi_nor_xfer_cfg *cfg,
-                        u8 *buf, size_t len);
-       int (*write_xfer)(struct spi_nor *nor, struct spi_nor_xfer_cfg *cfg,
-                         u8 *buf, size_t len);
        int (*read_reg)(struct spi_nor *nor, u8 opcode, u8 *buf, int len);
-       int (*write_reg)(struct spi_nor *nor, u8 opcode, u8 *buf, int len,
-                       int write_enable);
+       int (*write_reg)(struct spi_nor *nor, u8 opcode, u8 *buf, int len);
 
        int (*read)(struct spi_nor *nor, loff_t from,
                        size_t len, size_t *retlen, u_char *read_buf);
@@ -193,6 +180,7 @@ struct spi_nor {
 
        int (*flash_lock)(struct spi_nor *nor, loff_t ofs, uint64_t len);
        int (*flash_unlock)(struct spi_nor *nor, loff_t ofs, uint64_t len);
+       int (*flash_is_locked)(struct spi_nor *nor, loff_t ofs, uint64_t len);
 
        void *priv;
 };