brintos

brintos / linux-shallow public Read only

0
0
Text · 3.4 KiB · 0bb6516 Raw
128 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/* netsc520.c -- MTD map driver for AMD NetSc520 Demonstration Board3 *4 * Copyright (C) 2001 Mark Langsdorf (mark.langsdorf@amd.com)5 *	based on sc520cdp.c by Sysgo Real-Time Solutions GmbH6 *7 * The NetSc520 is a demonstration board for the Elan Sc520 processor available8 * from AMD.  It has a single back of 16 megs of 32-bit Flash ROM and another9 * 16 megs of SDRAM.10 */11 12#include <linux/module.h>13#include <linux/types.h>14#include <linux/kernel.h>15#include <linux/init.h>16#include <asm/io.h>17#include <linux/mtd/mtd.h>18#include <linux/mtd/map.h>19#include <linux/mtd/partitions.h>20 21 22/*23** The single, 16 megabyte flash bank is divided into four virtual24** partitions.  The first partition is 768 KiB and is intended to25** store the kernel image loaded by the bootstrap loader.  The second26** partition is 256 KiB and holds the BIOS image.  The third27** partition is 14.5 MiB and is intended for the flash file system28** image.  The last partition is 512 KiB and contains another copy29** of the BIOS image and the reset vector.30**31** Only the third partition should be mounted.  The first partition32** should not be mounted, but it can erased and written to using the33** MTD character routines.  The second and fourth partitions should34** not be touched - it is possible to corrupt the BIOS image by35** mounting these partitions, and potentially the board will not be36** recoverable afterwards.37*/38 39/* partition_info gives details on the logical partitions that the split the40 * single flash device into. If the size if zero we use up to the end of the41 * device. */42static const struct mtd_partition partition_info[] = {43    {44	    .name = "NetSc520 boot kernel",45	    .offset = 0,46	    .size = 0xc000047    },48    {49	    .name = "NetSc520 Low BIOS",50	    .offset = 0xc0000,51	    .size = 0x4000052    },53    {54	    .name = "NetSc520 file system",55	    .offset = 0x100000,56	    .size = 0xe8000057    },58    {59	    .name = "NetSc520 High BIOS",60	    .offset = 0xf80000,61	    .size = 0x8000062    },63};64#define NUM_PARTITIONS ARRAY_SIZE(partition_info)65 66#define WINDOW_SIZE	0x0010000067#define WINDOW_ADDR	0x0020000068 69static struct map_info netsc520_map = {70	.name = "netsc520 Flash Bank",71	.size = WINDOW_SIZE,72	.bankwidth = 4,73	.phys = WINDOW_ADDR,74};75 76#define NUM_FLASH_BANKS	ARRAY_SIZE(netsc520_map)77 78static struct mtd_info *mymtd;79 80static int __init init_netsc520(void)81{82	printk(KERN_NOTICE "NetSc520 flash device: 0x%Lx at 0x%Lx\n",83			(unsigned long long)netsc520_map.size,84			(unsigned long long)netsc520_map.phys);85	netsc520_map.virt = ioremap(netsc520_map.phys, netsc520_map.size);86 87	if (!netsc520_map.virt) {88		printk("Failed to ioremap\n");89		return -EIO;90	}91 92	simple_map_init(&netsc520_map);93 94	mymtd = do_map_probe("cfi_probe", &netsc520_map);95	if(!mymtd)96		mymtd = do_map_probe("map_ram", &netsc520_map);97	if(!mymtd)98		mymtd = do_map_probe("map_rom", &netsc520_map);99 100	if (!mymtd) {101		iounmap(netsc520_map.virt);102		return -ENXIO;103	}104 105	mymtd->owner = THIS_MODULE;106	mtd_device_register(mymtd, partition_info, NUM_PARTITIONS);107	return 0;108}109 110static void __exit cleanup_netsc520(void)111{112	if (mymtd) {113		mtd_device_unregister(mymtd);114		map_destroy(mymtd);115	}116	if (netsc520_map.virt) {117		iounmap(netsc520_map.virt);118		netsc520_map.virt = NULL;119	}120}121 122module_init(init_netsc520);123module_exit(cleanup_netsc520);124 125MODULE_LICENSE("GPL");126MODULE_AUTHOR("Mark Langsdorf <mark.langsdorf@amd.com>");127MODULE_DESCRIPTION("MTD map driver for AMD NetSc520 Demonstration Board");128