[U-Boot] [PATCH v10 03/27] mtd: add SPI-NOR core support

Vignesh R
2018-01-03T08:49:29Z

On Thursday 28 December 2017 11:42 AM, Jagan Teki wrote:
[...]
> +static const struct mtd_ops spi_nor_mtd_ops = {
> + .read = spi_nor_mread,
> + .erase = spi_nor_merase,
> +};
> +

Wondering why spi_nor_mwrite is not hooked up here?

> +U_BOOT_DRIVER(spinor_mtd) = {
> + .name = "spinor_mtd",
> + .id = UCLASS_MTD,
> + .ops = &spi_nor_mtd_ops,
> + .probe = spi_nor_mtd_probe,
> +};
> +
> +U_BOOT_DRIVER(spinor) = {
> + .name = "spinor",
> + .id = UCLASS_SPI_NOR,
> +};
> +
> +UCLASS_DRIVER(spinor) = {
> + .id = UCLASS_SPI_NOR,
> + .name = "spinor",
> + .flags = DM_UC_FLAG_SEQ_ALIAS,
> + .per_device_auto_alloc_size = sizeof(struct spi_nor_uclass_priv),
> +};

[...]

> diff --git a/include/linux/mtd/spi-nor.h b/include/linux/mtd/spi-nor.h
> new file mode 100644
> index 0000000..e1688e2
> --- /dev/null
> +++ b/include/linux/mtd/spi-nor.h
> @@ -0,0 +1,217 @@
[...]
> +struct spi_nor {
> + struct udevice *dev;
> + const char *name;
> + u8 init_done;
> + u32 page_size;
> + u8 addr_width;
> + u8 erase_opcode;
> + u8 read_opcode;
> + u8 read_dummy;
> + u8 program_opcode;
> + u32 max_write_size;
> + u32 flags;
> + u8 mode;

> + u8 read_mode;

Where is this field used? Shouldn't this field carry single/dual/quad
mode information?

> + u8 cmd_buf[SNOR_MAX_CMD_SIZE];
> +
> + void *memory_map;
> +};
> +
> +struct spi_nor_ops {
> + int (*read_reg)(struct udevice *dev, u8 cmd, u8 *val, int len);
> + int (*write_reg)(struct udevice *dev, u8 cmd, u8 *data, int len);
> +
> + int (*read)(struct udevice *dev, loff_t from, size_t len,
> + u_char *buf);
> + int (*write)(struct udevice *dev, loff_t to, size_t len,
> + const u_char *buf);
> +};
> +
> +#define spi_nor_get_ops(dev) ((struct spi_nor_ops *)(dev)->driver->ops)
> +
> +int spi_nor_merase(struct udevice *dev, struct erase_info *instr);
> +int spi_nor_mread(struct udevice *dev, loff_t from, size_t len,
> + size_t *retlen, u_char *buf);
> +
> +int spi_nor_scan(struct spi_nor *nor);
> +int spi_nor_bind(struct udevice *dev, struct spi_nor *nor);
> +
> +struct spi_nor *find_spi_nor_device(int dev_num);
> +int get_spi_nor_num(void);
> +struct spi_nor *spi_nor_get_spi_nor_dev(struct udevice *dev);
> +struct mtd_info *spi_nor_get_mtd_info(struct spi_nor *nor);
> +
> +#endif /* __MTD_SPI_NOR_H */
>

--
Regards
Vignesh