From: Vitaly Bordug <vbordug@ru.mvista.com>
To: "Ruslan V. Sushko" <rsushko@ru.mvista.com>
Cc: linuxppc-embedded@ozlabs.org
Subject: Re: [PATCH 3/3] ppc32: MTD support for Yucca board
Date: Mon, 21 Nov 2005 18:02:57 +0300 [thread overview]
Message-ID: <4381E1A1.1060405@ru.mvista.com> (raw)
In-Reply-To: <1132583169.11785.44.camel@mephisto.spb.rtsoft.ru>
Guess this should come through MTD community (linux-mtd@lists.infradead.org), rebased to
the MTD tree of course.
Ruslan V. Sushko wrote:
> Following patch adds MTD support for Yucca embedded memories(Flashes,
> SRAM, FRAM).
>
>
> Signed-off-by: Ruslan V. Sushko <rsushko@ru.mvista.com>
>
>
> ------------------------------------------------------------------------
>
> diff --git a/arch/ppc/platforms/4xx/yucca.h b/arch/ppc/platforms/4xx/yucca.h
> --- a/arch/ppc/platforms/4xx/yucca.h
> +++ b/arch/ppc/platforms/4xx/yucca.h
> @@ -32,12 +32,88 @@
> /* External timer clock frequency */
> #define YUCCA_TMR_CLK 25000000
>
> +/* System Memory map (physical address, not effective address)
> + * Flash and other devices via EBC.
> + *
> + * This should be the same mapping as done by PIBS in the
> + * (not mandatory but ease code reading between two codes)
> + * xxx/boardlib/ebc.c
> + *
> + * depending of the switch setting off the board, the location of devices
> + * in the address map are not the same:
> + */
> +/* Common definitions */
> +
> +#define BOARD_SMALL_FLASH_SIZE 0x100000 /* 1M */
> +#define BOARD_FRAM_SIZE 0x8000
> +#define BOARD_SRAM_SIZE 0x100000
> +#define BOARD_OPER_FLASH_SIZE 0x400000 /* 4M */
> +
> +
> +/* Configuration 1:
> + * the small flash and sram are placed on top (CS0)
> + * the Large flash is placed below (CS2)
> + * The FPGA and FRAM at the end (CS1)
> + * xxxx----xxxx----
> + */
> +#define BOARD_CONF1_SMALL_FLASH 0x00000004FFF00000ull
> +#define BOARD_CONF1_FRAM 0x00000004FF000000ull
> +#define BOARD_CONF1_OPER_FLASH 0x00000004E7C00000ull
> +#define BOARD_CONF1_SRAM 0x00000004E7000000ull
> +
> +/* Configuration 2:
> + * the small flash and sram are placed on top (CS0)
> + * but now sram before smal flash
> + * the Large flash is placed below (no change) (CS2)
> + * The FPGA and FRAM stay in same place. (CS1)
> + * xxxx----xxxx----
> + */
> +#define BOARD_CONF2_OPER_FLASH 0x00000004FFC00000ull
> +#define BOARD_CONF2_SRAM 0x00000004FF000000ull
> +#define BOARD_CONF2_SMALL_FLASH 0x00000004E7F00000ull
> +#define BOARD_CONF2_FRAM 0x00000004E7000000ull
> +
> +/* Configuration 3:
> + * the Large flash is placed on top, (CS0)
> + * the small flash and sram are placed below. (CS2)
> + * The FPGA and FRAM stay in same place. (CS1)
> + * xxxx----xxxx----
> + */
> +#define BOARD_CONF3_SRAM 0x00000004FFF00000ull
> +#define BOARD_CONF3_OPER_FLASH 0x00000004FF000000ull
> +#define BOARD_CONF3_SMALL_FLASH 0x00000004E7F00000ull
> +#define BOARD_CONF3_FRAM 0x00000004E7000000ull
> +
> /*
> * FPGA registers
> */
> #define YUCCA_FPGA_REG_BASE 0x00000004e2000000ULL
> #define YUCCA_FPGA_REG_SIZE 0x24
>
> +#define FPGA_REG10 0x10 /* Ethernet/Reset/Boot
> + configs */
> +#define FPGA_REG10_ETH_MODE10 0x8000
> +#define FPGA_REG10_ETH_MODE100 0x4000
> +#define FPGA_REG10_ETH_MODE1000 0x2000
> +#define FPGA_REG10_ETH_FORCE_DUPLEX 0x1000
> +#define FPGA_REG10_LOG_RESET_ETHERNET 0x0800
> +#define FPGA_REG10_ETH_AUTO_NEGO 0x0400
> +#define FPGA_REG10_LOG_INT_ETH 0x0200
> +#define FPGA_REG10_LOG_RESET_HISR 0x0080
> +#define FPGA_REG10_LOG_RESET_DISPLAY 0x0040
> +#define FPGA_REG10_LOG_RESET_SDRAM 0x0020
> +#define FPGA_REG10_LOG_OPBOOT 0x0010
> +#define FPGA_REG10_LOG_SRAM_BOOT 0x0008
> +#define FPGA_REG10_LOG_BTBOOT 0x0004
> +
> +/*Boot configurations */
> +#define BOARD_CONFIG_MASK (0x001C)
> +#define BOARD_CONFIG_1 (0x0018)
> +#define BOARD_CONFIG_2 (0x000C)
> +#define BOARD_CONFIG_3 (0x0014)
> +#define BOARD_BOOT_OPER_FLASH(x) (((x) & BOARD_CONFIG_MASK) == \
> + BOARD_CONFIG_2)
> +
> #define FPGA_REG1A 0x1a
>
> #define FPGA_REG1A_PE0_GLED 0x8000
> diff --git a/drivers/mtd/maps/Kconfig b/drivers/mtd/maps/Kconfig
> --- a/drivers/mtd/maps/Kconfig
> +++ b/drivers/mtd/maps/Kconfig
> @@ -339,6 +339,14 @@ config MTD_OCOTEA
> Ocotea board. If you have one of these boards and would like to
> use the flash chips on it, say 'Y'.
>
> +config MTD_YUCCA
> + tristate "Flash devices mapped on IBM 440SPe Yucca"
> + depends on MTD_CFI && YUCCA
> + help
> + This enables access routines for the flash chips on the IBM 440SPe
> + Yucca board. If you have one of these boards and would like to
> + use the flash chips on it, say 'Y'.
> +
> config MTD_REDWOOD
> tristate "CFI Flash devices mapped on IBM Redwood"
> depends on MTD_CFI && ( REDWOOD_4 || REDWOOD_5 || REDWOOD_6 )
> diff --git a/drivers/mtd/maps/Makefile b/drivers/mtd/maps/Makefile
> --- a/drivers/mtd/maps/Makefile
> +++ b/drivers/mtd/maps/Makefile
> @@ -56,6 +56,7 @@ obj-$(CONFIG_MTD_NETtel) += nettel.o
> obj-$(CONFIG_MTD_SCB2_FLASH) += scb2_flash.o
> obj-$(CONFIG_MTD_EBONY) += ebony.o
> obj-$(CONFIG_MTD_OCOTEA) += ocotea.o
> +obj-$(CONFIG_MTD_YUCCA) += yucca_flash.o
> obj-$(CONFIG_MTD_BEECH) += beech-mtd.o
> obj-$(CONFIG_MTD_ARCTIC) += arctic-mtd.o
> obj-$(CONFIG_MTD_WALNUT) += walnut.o
> diff --git a/drivers/mtd/maps/yucca_flash.c b/drivers/mtd/maps/yucca_flash.c
> new file mode 100644
> --- /dev/null
> +++ b/drivers/mtd/maps/yucca_flash.c
> @@ -0,0 +1,297 @@
> +/*
> + * Mapping for Yucca user flash
> + *
> + * This was derived from the luan.c
> + *
> + * Ruslan Sushko <rsushko@ru.mvista.com>
> + * Matt Porter <mporter@mvista.com>
> + *
> + * Copyright (C) 2002-2005 MontaVista Software Inc.
> + * (C) Copyright IBM Corp. 2004
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> + * Free Software Foundation; either version 2 of the License, or (at your
> + * option) any later version.
> + */
> +
> +#include <linux/module.h>
> +#include <linux/types.h>
> +#include <linux/kernel.h>
> +#include <linux/init.h>
> +#include <linux/mtd/mtd.h>
> +#include <linux/mtd/map.h>
> +#include <linux/mtd/partitions.h>
> +#include <linux/config.h>
> +#include <linux/version.h>
> +#include <asm/io.h>
> +
> +static struct mtd_info *oper_flash_mtd = NULL;
> +static struct mtd_info *small_flash_mtd = NULL;
> +static struct mtd_info *fram_mtd = NULL;
> +static struct mtd_info *sram_mtd = NULL;
> +
> +static struct map_info yucca_sram_map = {
> + .name = "Yucca SRAM",
> + .size = BOARD_SRAM_SIZE,
> + .bankwidth = 2,
> +};
> +
> +static struct map_info yucca_fram_map = {
> + .name = "Yucca FRAM",
> + .size = BOARD_FRAM_SIZE,
> + .bankwidth = 1,
> +};
> +
> +static struct map_info yucca_small_map = {
> + .name = "Yucca small flash",
> + .size = BOARD_SMALL_FLASH_SIZE,
> + .bankwidth = 1,
> +};
> +
> +static struct map_info yucca_oper_map = {
> + .name = "Yucca Operational flash",
> + .size = BOARD_OPER_FLASH_SIZE,
> + .bankwidth = 2,
> +};
> +
> +static struct mtd_partition yucca_sram_partitions[] = {
> + {
> + .name = "SRAM",
> + .offset = 0x0,
> + .size = 0x100000,
> + }
> +};
> +
> +static struct mtd_partition yucca_fram_partitions[] = {
> + {
> + .name = "FRAM",
> + .offset = 0x0,
> + .size = 0x8000,
> + }
> +};
> +
> +static struct mtd_partition yucca_small_partitions[] = {
> + {
> + .name = "U-boot",
> + .offset = 0x0,
> + .size = 0x100000,
> + }
> +};
> +
> +static struct mtd_partition yucca_oper_partitions[] = {
> + {
> + .name = "Linux Kernel",
> + .offset = 0,
> + .size = 0x100000,
> + },
> + {
> + .name = "Free Area",
> + .offset = 0x100000,
> + .size = 0x300000,
> + }
> +};
> +
> +#define NB_OF(x) (sizeof(x)/sizeof(x[0]))
> +static void cleanup_yucca(void);
> +
> +
> +int __init init_yucca(void)
> +{
> + u16 fpga10_reg;
> + volatile u16 *fpga_adr;
> + unsigned long long small_flash_base, oper_flash_base;
> + unsigned long long sram_base, fram_base;
> + int memconfig = 0;
> + int err = 0;
> +
> + fpga_adr = ioremap64(YUCCA_FPGA_REG_BASE, YUCCA_FPGA_REG_SIZE);
> + if (!fpga_adr)
> + return -ENOMEM;
> +
> +
> + fpga10_reg = *((u16*)((u32)fpga_adr + FPGA_REG10));
> + iounmap(fpga_adr);
> + switch (fpga10_reg & BOARD_CONFIG_MASK) {
> + default:
> + printk("Memory config switches are invalid: "
> + "fpga10_reg= %x. Using default configuration\n",
> + fpga10_reg);
> + case BOARD_CONFIG_1:
> + memconfig = 1;
> + small_flash_base = BOARD_CONF1_SMALL_FLASH;
> + oper_flash_base = BOARD_CONF1_OPER_FLASH;
> + sram_base = BOARD_CONF1_SRAM;
> + fram_base = BOARD_CONF1_FRAM;
> + break;
> + case BOARD_CONFIG_2:
> + memconfig = 2;
> + small_flash_base = BOARD_CONF2_SMALL_FLASH;
> + oper_flash_base = BOARD_CONF2_OPER_FLASH;
> + sram_base = BOARD_CONF2_SRAM;
> + fram_base = BOARD_CONF3_FRAM;
> + break;
> + case BOARD_CONFIG_3:
> + memconfig = 3;
> + small_flash_base = BOARD_CONF3_SMALL_FLASH;
> + oper_flash_base = BOARD_CONF3_OPER_FLASH;
> + sram_base = BOARD_CONF3_SRAM;
> + fram_base = BOARD_CONF3_FRAM;
> + break;
> + }
> +
> + printk("Using EBC memory configuration #%d\n", memconfig);
> +
> + yucca_small_map.phys = small_flash_base;
> + yucca_small_map.virt = ioremap64(small_flash_base,
> + yucca_small_map.size);
> +
> + if (!yucca_small_map.virt) {
> + printk("Failed to ioremap small flash\n");
> + err = -EIO;
> + goto ret_err;
> + }
> +
> + simple_map_init(&yucca_small_map);
> +
> + small_flash_mtd = do_map_probe("map_rom", &yucca_small_map);
> + if (small_flash_mtd) {
> + small_flash_mtd->owner = THIS_MODULE;
> + add_mtd_partitions(small_flash_mtd, yucca_small_partitions,
> + NB_OF(yucca_small_partitions));
> + } else {
> + printk("map probe failed for small flash\n");
> + err = -ENXIO;
> + goto ret_err;
> + }
> +
> + yucca_oper_map.phys = oper_flash_base;
> + yucca_oper_map.virt = ioremap64(oper_flash_base,
> + yucca_oper_map.size);
> +
> + if (!yucca_oper_map.virt) {
> + printk("Failed to ioremap oper flash\n");
> + err = -EIO;
> + goto ret_err;
> + }
> +
> + simple_map_init(&yucca_oper_map);
> +
> + oper_flash_mtd = do_map_probe("cfi_probe", &yucca_oper_map);
> + if (oper_flash_mtd) {
> + oper_flash_mtd->owner = THIS_MODULE;
> + add_mtd_partitions(oper_flash_mtd, yucca_oper_partitions,
> + NB_OF(yucca_oper_partitions));
> + } else {
> + printk("map probe failed for oper flash\n");
> + err = -ENXIO;
> + goto ret_err;
> + }
> +
> + yucca_sram_map.phys = sram_base;
> + yucca_sram_map.virt = ioremap64(sram_base,
> + yucca_sram_map.size);
> +
> + if (!yucca_sram_map.virt) {
> + printk("Failed to ioremap SRAM\n");
> + err = -EIO;
> + goto ret_err;
> + }
> +
> + simple_map_init(&yucca_sram_map);
> +
> + sram_mtd = do_map_probe("map_ram", &yucca_sram_map);
> + if (sram_mtd) {
> + sram_mtd->owner = THIS_MODULE;
> + add_mtd_partitions(sram_mtd, yucca_sram_partitions,
> + NB_OF(yucca_sram_partitions));
> + } else {
> + printk("map probe failed for SRAM\n");
> + err = -ENXIO;
> + goto ret_err;
> + }
> +
> + yucca_fram_map.phys = fram_base;
> + yucca_fram_map.virt = ioremap64(fram_base,
> + yucca_fram_map.size);
> +
> + if (!yucca_fram_map.virt) {
> + printk("Failed to ioremap FRAM\n");
> + err = -EIO;
> + goto ret_err;
> + }
> +
> + simple_map_init(&yucca_fram_map);
> +
> + fram_mtd = do_map_probe("map_ram", &yucca_fram_map);
> + if (fram_mtd) {
> + fram_mtd->owner = THIS_MODULE;
> + add_mtd_partitions(fram_mtd, yucca_fram_partitions,
> + NB_OF(yucca_fram_partitions));
> + } else {
> + printk("map probe failed for FRAM\n");
> + err = -ENXIO;
> + goto ret_err;
> + }
> + return 0;
> +ret_err:
> + cleanup_yucca();
> + return err;
> +}
> +
> +static void cleanup_yucca(void)
> +{
> + if (yucca_small_map.virt) {
> + iounmap((void *)yucca_small_map.virt);
> + yucca_small_map.virt = 0;
> + }
> +
> + if (yucca_oper_map.virt) {
> + iounmap((void *)yucca_oper_map.virt);
> + yucca_oper_map.virt = 0;
> + }
> +
> + if (yucca_fram_map.virt) {
> + iounmap((void *)yucca_fram_map.virt);
> + yucca_fram_map.virt = 0;
> + }
> +
> + if (yucca_sram_map.virt) {
> + iounmap((void *)yucca_sram_map.virt);
> + yucca_sram_map.virt = 0;
> + }
> +
> + if (oper_flash_mtd) {
> + del_mtd_partitions(oper_flash_mtd);
> + map_destroy(oper_flash_mtd);
> + }
> +
> + if (small_flash_mtd) {
> + del_mtd_partitions(small_flash_mtd);
> + map_destroy(small_flash_mtd);
> + }
> +
> + if (fram_mtd) {
> + del_mtd_partitions(fram_mtd);
> + map_destroy(fram_mtd);
> + }
> +
> + if (sram_mtd) {
> + del_mtd_partitions(sram_mtd);
> + map_destroy(sram_mtd);
> + }
> +
> +}
> +
> +static void __exit rem_yucca(void)
> +{
> + cleanup_yucca();
> +}
> +
> +module_init(init_yucca);
> +module_exit(rem_yucca);
> +
> +MODULE_LICENSE("GPL");
> +MODULE_AUTHOR("Ruslan V. Sushko <rsushko@ru.mvista.com>");
> +MODULE_DESCRIPTION("MTD map and partitions for AMCC 440SPe Yucca board");
> +
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Linuxppc-embedded mailing list
> Linuxppc-embedded@ozlabs.org
> https://ozlabs.org/mailman/listinfo/linuxppc-embedded
--
Sincerely,
Vitaly
next prev parent reply other threads:[~2005-11-21 15:02 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-11-21 14:26 [PATCH 3/3] ppc32: MTD support for Yucca board Ruslan V. Sushko
2005-11-21 15:02 ` Vitaly Bordug [this message]
2005-11-21 15:57 ` Matt Porter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4381E1A1.1060405@ru.mvista.com \
--to=vbordug@ru.mvista.com \
--cc=linuxppc-embedded@ozlabs.org \
--cc=rsushko@ru.mvista.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.