forked from Minki/linux
59018b6d2a
Once upon a time, the MTD repository was using CVS. This patch therefore removes all usages of the no longer updated CVS keywords from the MTD code. This also includes code that printed them to the user. Signed-off-by: Adrian Bunk <bunk@kernel.org> Signed-off-by: David Woodhouse <dwmw2@infradead.org>
106 lines
3.9 KiB
C
106 lines
3.9 KiB
C
/*
|
|
* Copyright (c) 2001, 2003 Maciej W. Rozycki
|
|
*
|
|
* DEC MS02-NV (54-20948-01) battery backed-up NVRAM module for
|
|
* DECstation/DECsystem 5000/2x0 and DECsystem 5900 and 5900/260
|
|
* systems.
|
|
*
|
|
* 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/ioport.h>
|
|
#include <linux/mtd/mtd.h>
|
|
|
|
/*
|
|
* Addresses are decoded as follows:
|
|
*
|
|
* 0x000000 - 0x3fffff SRAM
|
|
* 0x400000 - 0x7fffff CSR
|
|
*
|
|
* Within the SRAM area the following ranges are forced by the system
|
|
* firmware:
|
|
*
|
|
* 0x000000 - 0x0003ff diagnostic area, destroyed upon a reboot
|
|
* 0x000400 - ENDofRAM storage area, available to operating systems
|
|
*
|
|
* but we can't really use the available area right from 0x000400 as
|
|
* the first word is used by the firmware as a status flag passed
|
|
* from an operating system. If anything but the valid data magic
|
|
* ID value is found, the firmware considers the SRAM clean, i.e.
|
|
* containing no valid data, and disables the battery resulting in
|
|
* data being erased as soon as power is switched off. So the choice
|
|
* for the start address of the user-available is 0x001000 which is
|
|
* nicely page aligned. The area between 0x000404 and 0x000fff may
|
|
* be used by the driver for own needs.
|
|
*
|
|
* The diagnostic area defines two status words to be read by an
|
|
* operating system, a magic ID to distinguish a MS02-NV board from
|
|
* anything else and a status information providing results of tests
|
|
* as well as the size of SRAM available, which can be 1MiB or 2MiB
|
|
* (that's what the firmware handles; no idea if 2MiB modules ever
|
|
* existed).
|
|
*
|
|
* The firmware only handles the MS02-NV board if installed in the
|
|
* last (15th) slot, so for any other location the status information
|
|
* stored in the SRAM cannot be relied upon. But from the hardware
|
|
* point of view there is no problem using up to 14 such boards in a
|
|
* system -- only the 1st slot needs to be filled with a DRAM module.
|
|
* The MS02-NV board is ECC-protected, like other MS02 memory boards.
|
|
*
|
|
* The state of the battery as provided by the CSR is reflected on
|
|
* the two onboard LEDs. When facing the battery side of the board,
|
|
* with the LEDs at the top left and the battery at the bottom right
|
|
* (i.e. looking from the back side of the system box), their meaning
|
|
* is as follows (the system has to be powered on):
|
|
*
|
|
* left LED battery disable status: lit = enabled
|
|
* right LED battery condition status: lit = OK
|
|
*/
|
|
|
|
/* MS02-NV iomem register offsets. */
|
|
#define MS02NV_CSR 0x400000 /* control & status register */
|
|
|
|
/* MS02-NV CSR status bits. */
|
|
#define MS02NV_CSR_BATT_OK 0x01 /* battery OK */
|
|
#define MS02NV_CSR_BATT_OFF 0x02 /* battery disabled */
|
|
|
|
|
|
/* MS02-NV memory offsets. */
|
|
#define MS02NV_DIAG 0x0003f8 /* diagnostic status */
|
|
#define MS02NV_MAGIC 0x0003fc /* MS02-NV magic ID */
|
|
#define MS02NV_VALID 0x000400 /* valid data magic ID */
|
|
#define MS02NV_RAM 0x001000 /* user-exposed RAM start */
|
|
|
|
/* MS02-NV diagnostic status bits. */
|
|
#define MS02NV_DIAG_TEST 0x01 /* SRAM test done (?) */
|
|
#define MS02NV_DIAG_RO 0x02 /* SRAM r/o test done */
|
|
#define MS02NV_DIAG_RW 0x04 /* SRAM r/w test done */
|
|
#define MS02NV_DIAG_FAIL 0x08 /* SRAM test failed */
|
|
#define MS02NV_DIAG_SIZE_MASK 0xf0 /* SRAM size mask */
|
|
#define MS02NV_DIAG_SIZE_SHIFT 0x10 /* SRAM size shift (left) */
|
|
|
|
/* MS02-NV general constants. */
|
|
#define MS02NV_ID 0x03021966 /* MS02-NV magic ID value */
|
|
#define MS02NV_VALID_ID 0xbd100248 /* valid data magic ID value */
|
|
#define MS02NV_SLOT_SIZE 0x800000 /* size of the address space
|
|
decoded by the module */
|
|
|
|
|
|
typedef volatile u32 ms02nv_uint;
|
|
|
|
struct ms02nv_private {
|
|
struct mtd_info *next;
|
|
struct {
|
|
struct resource *module;
|
|
struct resource *diag_ram;
|
|
struct resource *user_ram;
|
|
struct resource *csr;
|
|
} resource;
|
|
u_char *addr;
|
|
size_t size;
|
|
u_char *uaddr;
|
|
};
|