OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [mtd/] [nand/] [edb7312.c] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 *  drivers/mtd/nand/edb7312.c
3
 *
4
 *  Copyright (C) 2002 Marius Gröger (mag@sysgo.de)
5
 *
6
 *  Derived from drivers/mtd/nand/autcpu12.c
7
 *       Copyright (c) 2001 Thomas Gleixner (gleixner@autronix.de)
8
 *
9
 * $Id: edb7312.c,v 1.12 2005/11/07 11:14:30 gleixner Exp $
10
 *
11
 * This program is free software; you can redistribute it and/or modify
12
 * it under the terms of the GNU General Public License version 2 as
13
 * published by the Free Software Foundation.
14
 *
15
 *  Overview:
16
 *   This is a device driver for the NAND flash device found on the
17
 *   CLEP7312 board which utilizes the Toshiba TC58V64AFT part. This is
18
 *   a 64Mibit (8MiB x 8 bits) NAND flash device.
19
 */
20
 
21
#include <linux/slab.h>
22
#include <linux/module.h>
23
#include <linux/init.h>
24
#include <linux/mtd/mtd.h>
25
#include <linux/mtd/nand.h>
26
#include <linux/mtd/partitions.h>
27
#include <asm/io.h>
28
#include <asm/arch/hardware.h>  /* for CLPS7111_VIRT_BASE */
29
#include <asm/sizes.h>
30
#include <asm/hardware/clps7111.h>
31
 
32
/*
33
 * MTD structure for EDB7312 board
34
 */
35
static struct mtd_info *ep7312_mtd = NULL;
36
 
37
/*
38
 * Values specific to the EDB7312 board (used with EP7312 processor)
39
 */
40
#define EP7312_FIO_PBASE 0x10000000     /* Phys address of flash */
41
#define EP7312_PXDR     0x0001  /*
42
                                 * IO offset to Port B data register
43
                                 * where the CLE, ALE and NCE pins
44
                                 * are wired to.
45
                                 */
46
#define EP7312_PXDDR    0x0041  /*
47
                                 * IO offset to Port B data direction
48
                                 * register so we can control the IO
49
                                 * lines.
50
                                 */
51
 
52
/*
53
 * Module stuff
54
 */
55
 
56
static unsigned long ep7312_fio_pbase = EP7312_FIO_PBASE;
57
static void __iomem *ep7312_pxdr = (void __iomem *)EP7312_PXDR;
58
static void __iomem *ep7312_pxddr = (void __iomem *)EP7312_PXDDR;
59
 
60
#ifdef CONFIG_MTD_PARTITIONS
61
/*
62
 * Define static partitions for flash device
63
 */
64
static struct mtd_partition partition_info[] = {
65
        {.name = "EP7312 Nand Flash",
66
         .offset = 0,
67
         .size = 8 * 1024 * 1024}
68
};
69
 
70
#define NUM_PARTITIONS 1
71
 
72
#endif
73
 
74
/*
75
 *      hardware specific access to control-lines
76
 *
77
 *      NAND_NCE: bit 0 -> bit 6 (bit 7 = 1)
78
 *      NAND_CLE: bit 1 -> bit 4
79
 *      NAND_ALE: bit 2 -> bit 5
80
 */
81
static void ep7312_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
82
{
83
        struct nand_chip *chip = mtd->priv;
84
 
85
        if (ctrl & NAND_CTRL_CHANGE) {
86
                unsigned char bits = 0x80;
87
 
88
                bits |= (ctrl & (NAND_CLE | NAND_ALE)) << 3;
89
                bits |= (ctrl & NAND_NCE) ? 0x00 : 0x40;
90
 
91
                clps_writeb((clps_readb(ep7312_pxdr)  & 0xF0) | bits,
92
                            ep7312_pxdr);
93
        }
94
        if (cmd != NAND_CMD_NONE)
95
                writeb(cmd, chip->IO_ADDR_W);
96
}
97
 
98
/*
99
 *      read device ready pin
100
 */
101
static int ep7312_device_ready(struct mtd_info *mtd)
102
{
103
        return 1;
104
}
105
 
106
#ifdef CONFIG_MTD_PARTITIONS
107
const char *part_probes[] = { "cmdlinepart", NULL };
108
#endif
109
 
110
/*
111
 * Main initialization routine
112
 */
113
static int __init ep7312_init(void)
114
{
115
        struct nand_chip *this;
116
        const char *part_type = 0;
117
        int mtd_parts_nb = 0;
118
        struct mtd_partition *mtd_parts = 0;
119
        void __iomem *ep7312_fio_base;
120
 
121
        /* Allocate memory for MTD device structure and private data */
122
        ep7312_mtd = kmalloc(sizeof(struct mtd_info) + sizeof(struct nand_chip), GFP_KERNEL);
123
        if (!ep7312_mtd) {
124
                printk("Unable to allocate EDB7312 NAND MTD device structure.\n");
125
                return -ENOMEM;
126
        }
127
 
128
        /* map physical adress */
129
        ep7312_fio_base = ioremap(ep7312_fio_pbase, SZ_1K);
130
        if (!ep7312_fio_base) {
131
                printk("ioremap EDB7312 NAND flash failed\n");
132
                kfree(ep7312_mtd);
133
                return -EIO;
134
        }
135
 
136
        /* Get pointer to private data */
137
        this = (struct nand_chip *)(&ep7312_mtd[1]);
138
 
139
        /* Initialize structures */
140
        memset(ep7312_mtd, 0, sizeof(struct mtd_info));
141
        memset(this, 0, sizeof(struct nand_chip));
142
 
143
        /* Link the private data with the MTD structure */
144
        ep7312_mtd->priv = this;
145
        ep7312_mtd->owner = THIS_MODULE;
146
 
147
        /*
148
         * Set GPIO Port B control register so that the pins are configured
149
         * to be outputs for controlling the NAND flash.
150
         */
151
        clps_writeb(0xf0, ep7312_pxddr);
152
 
153
        /* insert callbacks */
154
        this->IO_ADDR_R = ep7312_fio_base;
155
        this->IO_ADDR_W = ep7312_fio_base;
156
        this->cmd_ctrl = ep7312_hwcontrol;
157
        this->dev_ready = ep7312_device_ready;
158
        /* 15 us command delay time */
159
        this->chip_delay = 15;
160
 
161
        /* Scan to find existence of the device */
162
        if (nand_scan(ep7312_mtd, 1)) {
163
                iounmap((void *)ep7312_fio_base);
164
                kfree(ep7312_mtd);
165
                return -ENXIO;
166
        }
167
#ifdef CONFIG_MTD_PARTITIONS
168
        ep7312_mtd->name = "edb7312-nand";
169
        mtd_parts_nb = parse_mtd_partitions(ep7312_mtd, part_probes, &mtd_parts, 0);
170
        if (mtd_parts_nb > 0)
171
                part_type = "command line";
172
        else
173
                mtd_parts_nb = 0;
174
#endif
175
        if (mtd_parts_nb == 0) {
176
                mtd_parts = partition_info;
177
                mtd_parts_nb = NUM_PARTITIONS;
178
                part_type = "static";
179
        }
180
 
181
        /* Register the partitions */
182
        printk(KERN_NOTICE "Using %s partition definition\n", part_type);
183
        add_mtd_partitions(ep7312_mtd, mtd_parts, mtd_parts_nb);
184
 
185
        /* Return happy */
186
        return 0;
187
}
188
 
189
module_init(ep7312_init);
190
 
191
/*
192
 * Clean up routine
193
 */
194
static void __exit ep7312_cleanup(void)
195
{
196
        struct nand_chip *this = (struct nand_chip *)&ep7312_mtd[1];
197
 
198
        /* Release resources, unregister device */
199
        nand_release(ap7312_mtd);
200
 
201
        /* Release io resource */
202
        iounmap(this->IO_ADDR_R);
203
 
204
        /* Free the MTD device structure */
205
        kfree(ep7312_mtd);
206
}
207
 
208
module_exit(ep7312_cleanup);
209
 
210
MODULE_LICENSE("GPL");
211
MODULE_AUTHOR("Marius Groeger <mag@sysgo.de>");
212
MODULE_DESCRIPTION("MTD map driver for Cogent EDB7312 board");

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.