109 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * ts5500_flash.c -- MTD map driver for Technology Systems TS-5500 board4 *5 * Copyright (C) 2004 Sean Young <sean@mess.org>6 *7 * Note:8 * - In order for detection to work, jumper 3 must be set.9 * - Drive A and B use the resident flash disk (RFD) flash translation layer.10 * - If you have created your own jffs file system and the bios overwrites11 * it during boot, try disabling Drive A: and B: in the boot order.12 */13 14#include <linux/init.h>15#include <linux/module.h>16#include <linux/kernel.h>17#include <linux/mtd/map.h>18#include <linux/mtd/mtd.h>19#include <linux/mtd/partitions.h>20#include <linux/types.h>21 22 23#define WINDOW_ADDR 0x0940000024#define WINDOW_SIZE 0x0020000025 26static struct map_info ts5500_map = {27 .name = "TS-5500 Flash",28 .size = WINDOW_SIZE,29 .bankwidth = 1,30 .phys = WINDOW_ADDR31};32 33static const struct mtd_partition ts5500_partitions[] = {34 {35 .name = "Drive A",36 .offset = 0,37 .size = 0x0e000038 },39 {40 .name = "BIOS",41 .offset = 0x0e0000,42 .size = 0x020000,43 },44 {45 .name = "Drive B",46 .offset = 0x100000,47 .size = 0x10000048 }49};50 51#define NUM_PARTITIONS ARRAY_SIZE(ts5500_partitions)52 53static struct mtd_info *mymtd;54 55static int __init init_ts5500_map(void)56{57 int rc = 0;58 59 ts5500_map.virt = ioremap(ts5500_map.phys, ts5500_map.size);60 61 if (!ts5500_map.virt) {62 printk(KERN_ERR "Failed to ioremap\n");63 rc = -EIO;64 goto err2;65 }66 67 simple_map_init(&ts5500_map);68 69 mymtd = do_map_probe("jedec_probe", &ts5500_map);70 if (!mymtd)71 mymtd = do_map_probe("map_rom", &ts5500_map);72 73 if (!mymtd) {74 rc = -ENXIO;75 goto err1;76 }77 78 mymtd->owner = THIS_MODULE;79 mtd_device_register(mymtd, ts5500_partitions, NUM_PARTITIONS);80 81 return 0;82 83err1:84 iounmap(ts5500_map.virt);85err2:86 return rc;87}88 89static void __exit cleanup_ts5500_map(void)90{91 if (mymtd) {92 mtd_device_unregister(mymtd);93 map_destroy(mymtd);94 }95 96 if (ts5500_map.virt) {97 iounmap(ts5500_map.virt);98 ts5500_map.virt = NULL;99 }100}101 102module_init(init_ts5500_map);103module_exit(cleanup_ts5500_map);104 105MODULE_LICENSE("GPL");106MODULE_AUTHOR("Sean Young <sean@mess.org>");107MODULE_DESCRIPTION("MTD map driver for Technology Systems TS-5500 board");108 109