[U-Boot] [PATCH] mtd: sf: Zap ramtron driver
Jagan Teki
jagannadh.teki at gmail.com
Thu Dec 18 13:52:53 CET 2014
On 6 November 2014 at 16:05, Jagannadha Sutradharudu Teki
<jagannadh.teki at gmail.com> wrote:
> Removed ramtron driver since the EMK boards are
> no longer been active, and these are the only boards
> used this flash driver.
>
> Commit details for EMK zap:
> "ppc/arm: zap EMK boards"
> (sha1: d58a9451e7339ed4cf2b2627e534611f427fb791)
>
> Signed-off-by: Jagannadha Sutradharudu Teki <jagannadh.teki at gmail.com>
> Cc: Reinhard Meyer <reinhard.meyer at emk-elektronik.de>
> ---
> drivers/mtd/spi/Makefile | 1 -
> drivers/mtd/spi/ramtron.c | 404 ----------------------------------------------
> 2 files changed, 405 deletions(-)
> delete mode 100644 drivers/mtd/spi/ramtron.c
>
> diff --git a/drivers/mtd/spi/Makefile b/drivers/mtd/spi/Makefile
> index 15789a0..c61b784 100644
> --- a/drivers/mtd/spi/Makefile
> +++ b/drivers/mtd/spi/Makefile
> @@ -17,6 +17,5 @@ obj-$(CONFIG_SPI_FLASH) += sf_probe.o
> #endif
> obj-$(CONFIG_CMD_SF) += sf.o
> obj-$(CONFIG_SPI_FLASH) += sf_ops.o sf_params.o
> -obj-$(CONFIG_SPI_FRAM_RAMTRON) += ramtron.o
> obj-$(CONFIG_SPI_FLASH_SANDBOX) += sandbox.o
> obj-$(CONFIG_SPI_M95XXX) += eeprom_m95xxx.o
> diff --git a/drivers/mtd/spi/ramtron.c b/drivers/mtd/spi/ramtron.c
> deleted file mode 100644
> index a23032c..0000000
> --- a/drivers/mtd/spi/ramtron.c
> +++ /dev/null
> @@ -1,404 +0,0 @@
> -/*
> - * (C) Copyright 2010
> - * Reinhard Meyer, EMK Elektronik, reinhard.meyer at emk-elektronik.de
> - *
> - * SPDX-License-Identifier: GPL-2.0+
> - */
> -
> -/*
> - * Note: RAMTRON SPI FRAMs are ferroelectric, nonvolatile RAMs
> - * with an interface identical to SPI flash devices.
> - * However since they behave like RAM there are no delays or
> - * busy polls required. They can sustain read or write at the
> - * allowed SPI bus speed, which can be 40 MHz for some devices.
> - *
> - * Unfortunately some RAMTRON devices do not have a means of
> - * identifying them. They will leave the SO line undriven when
> - * the READ-ID command is issued. It is therefore mandatory
> - * that the MISO line has a proper pull-up, so that READ-ID
> - * will return a row of 0xff. This 0xff pseudo-id will cause
> - * probes by all vendor specific functions that are designed
> - * to handle it. If the MISO line is not pulled up, READ-ID
> - * could return any random noise, even mimicking another
> - * device.
> - *
> - * We use CONFIG_SPI_FRAM_RAMTRON_NON_JEDEC
> - * to define which device will be assumed after a simple status
> - * register verify. This method is prone to false positive
> - * detection and should therefore be the last to be tried.
> - * Enter it in the last position in the table in spi_flash.c!
> - *
> - * The define CONFIG_SPI_FRAM_RAMTRON_NON_JEDEC both activates
> - * compilation of the special handler and defines the device
> - * to assume.
> - */
> -
> -#include <common.h>
> -#include <malloc.h>
> -#include <spi.h>
> -#include <spi_flash.h>
> -#include "sf_internal.h"
> -
> -/*
> - * Properties of supported FRAMs
> - * Note: speed is currently not used because we have no method to deliver that
> - * value to the upper layers
> - */
> -struct ramtron_spi_fram_params {
> - u32 size; /* size in bytes */
> - u8 addr_len; /* number of address bytes */
> - u8 merge_cmd; /* some address bits are in the command byte */
> - u8 id1; /* device ID 1 (family, density) */
> - u8 id2; /* device ID 2 (sub, rev, rsvd) */
> - u32 speed; /* max. SPI clock in Hz */
> - const char *name; /* name for display and/or matching */
> -};
> -
> -struct ramtron_spi_fram {
> - struct spi_flash flash;
> - const struct ramtron_spi_fram_params *params;
> -};
> -
> -static inline struct ramtron_spi_fram *to_ramtron_spi_fram(struct spi_flash
> - *flash)
> -{
> - return container_of(flash, struct ramtron_spi_fram, flash);
> -}
> -
> -/*
> - * table describing supported FRAM chips:
> - * chips without RDID command must have the values 0xff for id1 and id2
> - */
> -static const struct ramtron_spi_fram_params ramtron_spi_fram_table[] = {
> - {
> - .size = 32*1024,
> - .addr_len = 2,
> - .merge_cmd = 0,
> - .id1 = 0x22,
> - .id2 = 0x00,
> - .speed = 40000000,
> - .name = "FM25V02",
> - },
> - {
> - .size = 32*1024,
> - .addr_len = 2,
> - .merge_cmd = 0,
> - .id1 = 0x22,
> - .id2 = 0x01,
> - .speed = 40000000,
> - .name = "FM25VN02",
> - },
> - {
> - .size = 64*1024,
> - .addr_len = 2,
> - .merge_cmd = 0,
> - .id1 = 0x23,
> - .id2 = 0x00,
> - .speed = 40000000,
> - .name = "FM25V05",
> - },
> - {
> - .size = 64*1024,
> - .addr_len = 2,
> - .merge_cmd = 0,
> - .id1 = 0x23,
> - .id2 = 0x01,
> - .speed = 40000000,
> - .name = "FM25VN05",
> - },
> - {
> - .size = 128*1024,
> - .addr_len = 3,
> - .merge_cmd = 0,
> - .id1 = 0x24,
> - .id2 = 0x00,
> - .speed = 40000000,
> - .name = "FM25V10",
> - },
> - {
> - .size = 128*1024,
> - .addr_len = 3,
> - .merge_cmd = 0,
> - .id1 = 0x24,
> - .id2 = 0x01,
> - .speed = 40000000,
> - .name = "FM25VN10",
> - },
> -#ifdef CONFIG_SPI_FRAM_RAMTRON_NON_JEDEC
> - {
> - .size = 256*1024,
> - .addr_len = 3,
> - .merge_cmd = 0,
> - .id1 = 0xff,
> - .id2 = 0xff,
> - .speed = 40000000,
> - .name = "FM25H20",
> - },
> -#endif
> -};
> -
> -static int ramtron_common(struct spi_flash *flash,
> - u32 offset, size_t len, void *buf, u8 command)
> -{
> - struct ramtron_spi_fram *sn = to_ramtron_spi_fram(flash);
> - u8 cmd[4];
> - int cmd_len;
> - int ret;
> -
> - if (sn->params->addr_len == 3 && sn->params->merge_cmd == 0) {
> - cmd[0] = command;
> - cmd[1] = offset >> 16;
> - cmd[2] = offset >> 8;
> - cmd[3] = offset;
> - cmd_len = 4;
> - } else if (sn->params->addr_len == 2 && sn->params->merge_cmd == 0) {
> - cmd[0] = command;
> - cmd[1] = offset >> 8;
> - cmd[2] = offset;
> - cmd_len = 3;
> - } else {
> - printf("SF: unsupported addr_len or merge_cmd\n");
> - return -1;
> - }
> -
> - /* claim the bus */
> - ret = spi_claim_bus(flash->spi);
> - if (ret) {
> - debug("SF: Unable to claim SPI bus\n");
> - return ret;
> - }
> -
> - if (command == CMD_PAGE_PROGRAM) {
> - /* send WREN */
> - ret = spi_flash_cmd_write_enable(flash);
> - if (ret < 0) {
> - debug("SF: Enabling Write failed\n");
> - goto releasebus;
> - }
> - }
> -
> - /* do the transaction */
> - if (command == CMD_PAGE_PROGRAM)
> - ret = spi_flash_cmd_write(flash->spi, cmd, cmd_len, buf, len);
> - else
> - ret = spi_flash_cmd_read(flash->spi, cmd, cmd_len, buf, len);
> - if (ret < 0)
> - debug("SF: Transaction failed\n");
> -
> -releasebus:
> - /* release the bus */
> - spi_release_bus(flash->spi);
> - return ret;
> -}
> -
> -static int ramtron_read(struct spi_flash *flash,
> - u32 offset, size_t len, void *buf)
> -{
> - return ramtron_common(flash, offset, len, buf,
> - CMD_READ_ARRAY_SLOW);
> -}
> -
> -static int ramtron_write(struct spi_flash *flash,
> - u32 offset, size_t len, const void *buf)
> -{
> - return ramtron_common(flash, offset, len, (void *)buf,
> - CMD_PAGE_PROGRAM);
> -}
> -
> -static int ramtron_erase(struct spi_flash *flash, u32 offset, size_t len)
> -{
> - debug("SF: Erase of RAMTRON FRAMs is pointless\n");
> - return -1;
> -}
> -
> -/*
> - * nore: we are called here with idcode pointing to the first non-0x7f byte
> - * already!
> - */
> -static struct spi_flash *spi_fram_probe_ramtron(struct spi_slave *spi,
> - u8 *idcode)
> -{
> - const struct ramtron_spi_fram_params *params;
> - struct ramtron_spi_fram *sn;
> - unsigned int i;
> -#ifdef CONFIG_SPI_FRAM_RAMTRON_NON_JEDEC
> - int ret;
> - u8 sr;
> -#endif
> -
> - /* NOTE: the bus has been claimed before this function is called! */
> - switch (idcode[0]) {
> - case 0xc2:
> - /* JEDEC conformant RAMTRON id */
> - for (i = 0; i < ARRAY_SIZE(ramtron_spi_fram_table); i++) {
> - params = &ramtron_spi_fram_table[i];
> - if (idcode[1] == params->id1 &&
> - idcode[2] == params->id2)
> - goto found;
> - }
> - break;
> -#ifdef CONFIG_SPI_FRAM_RAMTRON_NON_JEDEC
> - case 0xff:
> - /*
> - * probably open MISO line, pulled up.
> - * We COULD have a non JEDEC conformant FRAM here,
> - * read the status register to verify
> - */
> - ret = spi_flash_cmd(spi, CMD_READ_STATUS, &sr, 1);
> - if (ret)
> - return NULL;
> -
> - /* Bits 5,4,0 are fixed 0 for all devices */
> - if ((sr & 0x31) != 0x00)
> - return NULL;
> - /* now find the device */
> - for (i = 0; i < ARRAY_SIZE(ramtron_spi_fram_table); i++) {
> - params = &ramtron_spi_fram_table[i];
> - if (!strcmp(params->name,
> - CONFIG_SPI_FRAM_RAMTRON_NON_JEDEC))
> - goto found;
> - }
> - debug("SF: Unsupported non-JEDEC RAMTRON device "
> - CONFIG_SPI_FRAM_RAMTRON_NON_JEDEC "\n");
> - break;
> -#endif
> - default:
> - break;
> - }
> -
> - /* arriving here means no method has found a device we can handle */
> - debug("SF/ramtron: unsupported device id0=%02x id1=%02x id2=%02x\n",
> - idcode[0], idcode[1], idcode[2]);
> - return NULL;
> -
> -found:
> - sn = malloc(sizeof(*sn));
> - if (!sn) {
> - debug("SF: Failed to allocate memory\n");
> - return NULL;
> - }
> -
> - sn->params = params;
> -
> - sn->flash.write = ramtron_write;
> - sn->flash.read = ramtron_read;
> - sn->flash.erase = ramtron_erase;
> - sn->flash.size = params->size;
> -
> - return &sn->flash;
> -}
> -
> -/*
> - * The following table holds all device probe functions
> - * (All flashes are removed and implemented a common probe at
> - * spi_flash_probe.c)
> - *
> - * shift: number of continuation bytes before the ID
> - * idcode: the expected IDCODE or 0xff for non JEDEC devices
> - * probe: the function to call
> - *
> - * Non JEDEC devices should be ordered in the table such that
> - * the probe functions with best detection algorithms come first.
> - *
> - * Several matching entries are permitted, they will be tried
> - * in sequence until a probe function returns non NULL.
> - *
> - * IDCODE_CONT_LEN may be redefined if a device needs to declare a
> - * larger "shift" value. IDCODE_PART_LEN generally shouldn't be
> - * changed. This is the max number of bytes probe functions may
> - * examine when looking up part-specific identification info.
> - *
> - * Probe functions will be given the idcode buffer starting at their
> - * manu id byte (the "idcode" in the table below). In other words,
> - * all of the continuation bytes will be skipped (the "shift" below).
> - */
> -#define IDCODE_CONT_LEN 0
> -#define IDCODE_PART_LEN 5
> -static const struct {
> - const u8 shift;
> - const u8 idcode;
> - struct spi_flash *(*probe) (struct spi_slave *spi, u8 *idcode);
> -} flashes[] = {
> - /* Keep it sorted by define name */
> -#ifdef CONFIG_SPI_FRAM_RAMTRON
> - { 6, 0xc2, spi_fram_probe_ramtron, },
> -# undef IDCODE_CONT_LEN
> -# define IDCODE_CONT_LEN 6
> -#endif
> -#ifdef CONFIG_SPI_FRAM_RAMTRON_NON_JEDEC
> - { 0, 0xff, spi_fram_probe_ramtron, },
> -#endif
> -};
> -#define IDCODE_LEN (IDCODE_CONT_LEN + IDCODE_PART_LEN)
> -
> -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 = NULL;
> - int ret, i, shift;
> - u8 idcode[IDCODE_LEN], *idp;
> -
> - spi = spi_setup_slave(bus, cs, max_hz, spi_mode);
> - if (!spi) {
> - printf("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;
> -
> -#ifdef DEBUG
> - printf("SF: Got idcodes\n");
> - print_buffer(0, idcode, 1, sizeof(idcode), 0);
> -#endif
> -
> - /* count the number of continuation bytes */
> - for (shift = 0, idp = idcode;
> - shift < IDCODE_CONT_LEN && *idp == 0x7f;
> - ++shift, ++idp)
> - continue;
> -
> - /* search the table for matches in shift and id */
> - for (i = 0; i < ARRAY_SIZE(flashes); ++i)
> - if (flashes[i].shift == shift && flashes[i].idcode == *idp) {
> - /* we have a match, call probe */
> - flash = flashes[i].probe(spi, idp);
> - if (flash)
> - break;
> - }
> -
> - if (!flash) {
> - printf("SF: Unsupported manufacturer %02x\n", *idp);
> - goto err_manufacturer_probe;
> - }
> -
> - printf("SF: Detected %s with total size ", flash->name);
> - print_size(flash->size, "");
> - puts("\n");
> -
> - 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;
> -}
> -
> -void spi_flash_free(struct spi_flash *flash)
> -{
> - spi_free_slave(flash->spi);
> - free(flash);
> -}
> --
> 1.9.1
>
Applied to u-boot-spi/master
thanks!
--
Jagan.
More information about the U-Boot
mailing list