spia.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:5k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  drivers/mtd/nand/spia.c
  3.  *
  4.  *  Copyright (C) 2000 Steven J. Hill (sjhill@cotw.com)
  5.  *
  6.  *
  7.  * 10-29-2001 TG change to support hardwarespecific access
  8.  * to controllines (due to change in nand.c)
  9.  * page_cache added
  10.  *
  11.  * $Id: spia.c,v 1.16 2002/03/05 13:50:47 dwmw2 Exp $
  12.  *
  13.  * This program is free software; you can redistribute it and/or modify
  14.  * it under the terms of the GNU General Public License version 2 as
  15.  * published by the Free Software Foundation.
  16.  *
  17.  *  Overview:
  18.  *   This is a device driver for the NAND flash device found on the
  19.  *   SPIA board which utilizes the Toshiba TC58V64AFT part. This is
  20.  *   a 64Mibit (8MiB x 8 bits) NAND flash device.
  21.  */
  22. #include <linux/slab.h>
  23. #include <linux/module.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. /*
  29.  * MTD structure for SPIA board
  30.  */
  31. static struct mtd_info *spia_mtd = NULL;
  32. /*
  33.  * Values specific to the SPIA board (used with EP7212 processor)
  34.  */
  35. #define SPIA_IO_ADDR = 0xd0000000 /* Start of EP7212 IO address space */
  36. #define SPIA_FIO_ADDR = 0xf0000000 /* Address where flash is mapped */
  37. #define SPIA_PEDR = 0x0080 /*
  38.  * IO offset to Port E data register
  39.  * where the CLE, ALE and NCE pins
  40.  * are wired to.
  41.  */
  42. #define SPIA_PEDDR = 0x00c0 /*
  43.  * IO offset to Port E data direction
  44.  * register so we can control the IO
  45.  * lines.
  46.  */
  47. /*
  48.  * Module stuff
  49.  */
  50. static int spia_io_base = SPIA_IO_BASE;
  51. static int spia_fio_base = SPIA_FIO_BASE;
  52. static int spia_pedr = SPIA_PEDR;
  53. static int spia_peddr = SPIA_PEDDR;
  54. MODULE_PARM(spia_io_base, "i");
  55. MODULE_PARM(spia_fio_base, "i");
  56. MODULE_PARM(spia_pedr, "i");
  57. MODULE_PARM(spia_peddr, "i");
  58. __setup("spia_io_base=",spia_io_base);
  59. __setup("spia_fio_base=",spia_fio_base);
  60. __setup("spia_pedr=",spia_pedr);
  61. __setup("spia_peddr=",spia_peddr);
  62. /*
  63.  * Define partitions for flash device
  64.  */
  65. const static struct mtd_partition partition_info[] = {
  66. { name: "SPIA flash partition 1",
  67.   offset: 0,
  68.   size: 2*1024*1024 },
  69. { name: "SPIA flash partition 2",
  70.   offset: 2*1024*1024,
  71.   size: 6*1024*1024 }
  72. };
  73. #define NUM_PARTITIONS 2
  74. /* 
  75.  * hardware specific access to control-lines
  76. */
  77. void spia_hwcontrol(int cmd){
  78.     switch(cmd){
  79. case NAND_CTL_SETCLE: (*(volatile unsigned char *) (spia_io_base + spia_pedr)) |=  0x01; break;
  80. case NAND_CTL_CLRCLE: (*(volatile unsigned char *) (spia_io_base + spia_pedr)) &= ~0x01; break;
  81. case NAND_CTL_SETALE: (*(volatile unsigned char *) (spia_io_base + spia_pedr)) |=  0x02; break;
  82. case NAND_CTL_CLRALE: (*(volatile unsigned char *) (spia_io_base + spia_pedr)) &= ~0x02; break;
  83. case NAND_CTL_SETNCE: (*(volatile unsigned char *) (spia_io_base + spia_pedr)) &= ~0x04; break;
  84. case NAND_CTL_CLRNCE: (*(volatile unsigned char *) (spia_io_base + spia_pedr)) |=  0x04; break;
  85.     }
  86. }
  87. /*
  88.  * Main initialization routine
  89.  */
  90. int __init spia_init (void)
  91. {
  92. struct nand_chip *this;
  93. /* Allocate memory for MTD device structure and private data */
  94. spia_mtd = kmalloc (sizeof(struct mtd_info) + sizeof (struct nand_chip),
  95. GFP_KERNEL);
  96. if (!spia_mtd) {
  97. printk ("Unable to allocate SPIA NAND MTD device structure.n");
  98. return -ENOMEM;
  99. }
  100. /* Get pointer to private data */
  101. this = (struct nand_chip *) (&spia_mtd[1]);
  102. /* Initialize structures */
  103. memset((char *) spia_mtd, 0, sizeof(struct mtd_info));
  104. memset((char *) this, 0, sizeof(struct nand_chip));
  105. /* Link the private data with the MTD structure */
  106. spia_mtd->priv = this;
  107. /*
  108.  * Set GPIO Port E control register so that the pins are configured
  109.  * to be outputs for controlling the NAND flash.
  110.  */
  111. (*(volatile unsigned char *) (spia_io_base + spia_peddr)) = 0x07;
  112. /* Set address of NAND IO lines */
  113. this->IO_ADDR_R = spia_fio_base;
  114. this->IO_ADDR_W = spia_fio_base;
  115. /* Set address of hardware control function */
  116. this->hwcontrol = spia_hwcontrol;
  117. /* 15 us command delay time */
  118. this->chip_delay = 15;
  119. /* Scan to find existence of the device */
  120. if (nand_scan (spia_mtd)) {
  121. kfree (spia_mtd);
  122. return -ENXIO;
  123. }
  124. /* Allocate memory for internal data buffer */
  125. this->data_buf = kmalloc (sizeof(u_char) * (spia_mtd->oobblock + spia_mtd->oobsize), GFP_KERNEL);
  126. if (!this->data_buf) {
  127. printk ("Unable to allocate NAND data buffer for SPIA.n");
  128. kfree (spia_mtd);
  129. return -ENOMEM;
  130. }
  131. /* Allocate memory for internal data buffer */
  132. this->data_cache = kmalloc (sizeof(u_char) * (spia_mtd->oobblock + spia_mtd->oobsize), GFP_KERNEL);
  133. if (!this->data_cache) {
  134. printk ("Unable to allocate NAND data cache for SPIA.n");
  135. kfree (this->data_buf);
  136. kfree (spia_mtd);
  137. return = -ENOMEM;
  138. }
  139. this->cache_page = -1;
  140. /* Register the partitions */
  141. add_mtd_partitions(spia_mtd, partition_info, NUM_PARTITIONS);
  142. /* Return happy */
  143. return 0;
  144. }
  145. module_init(spia_init);
  146. /*
  147.  * Clean up routine
  148.  */
  149. #ifdef MODULE
  150. static void __exit spia_cleanup (void)
  151. {
  152. struct nand_chip *this = (struct nand_chip *) &spia_mtd[1];
  153. /* Unregister the device */
  154. del_mtd_device (spia_mtd);
  155. /* Free internal data buffer */
  156. kfree (this->data_buf);
  157. kfree (this->page_cache);
  158. /* Free the MTD device structure */
  159. kfree (spia_mtd);
  160. }
  161. module_exit(spia_cleanup);
  162. #endif
  163. MODULE_LICENSE("GPL");
  164. MODULE_AUTHOR("Steven J. Hill <sjhill@cotw.com");
  165. MODULE_DESCRIPTION("Board-specific glue layer for NAND flash on SPIA board");