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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * drivers/pcmcia/sa1100_xp860.c
  3.  *
  4.  * XP860 PCMCIA specific routines
  5.  *
  6.  */
  7. #include <linux/kernel.h>
  8. #include <linux/delay.h>
  9. #include <linux/sched.h>
  10. #include <asm/hardware.h>
  11. #include <asm/irq.h>
  12. #include "sa1100_generic.h"
  13. #define NCR_A0VPP (1<<16)
  14. #define NCR_A1VPP (1<<17)
  15. static int xp860_pcmcia_init(struct pcmcia_init *init)
  16. {
  17.   /* Set GPIO_A<3:0> to be outputs for PCMCIA/CF power controller: */
  18.   PA_DDR &= ~(GPIO_GPIO0 | GPIO_GPIO1 | GPIO_GPIO2 | GPIO_GPIO3);
  19.   
  20.   /* MAX1600 to standby mode: */
  21.   PA_DWR &= ~(GPIO_GPIO0 | GPIO_GPIO1 | GPIO_GPIO2 | GPIO_GPIO3);
  22. #error Consider the following comment
  23.   /*
  24.    * 1- Please move GPDR initialisation  where it is interrupt or preemption
  25.    *    safe (like from xp860_map_io).
  26.    * 2- The GPCR line is bogus i.e. it will simply have absolutely no effect.
  27.    *    Please see its definition in the SA1110 manual.
  28.    * 3- Please do not use NCR_* values!
  29.    */
  30.   GPDR |= (NCR_A0VPP | NCR_A1VPP);
  31.   GPCR &= ~(NCR_A0VPP | NCR_A1VPP);
  32.   return sa1111_pcmcia_init(init);
  33. }
  34. static int
  35. xp860_pcmcia_configure_socket(const struct pcmcia_configure *conf)
  36. {
  37.   unsigned int gpio_mask, pa_dwr_mask;
  38.   unsigned int gpio_set, pa_dwr_set;
  39.   int ret;
  40.   /* Neponset uses the Maxim MAX1600, with the following connections:
  41. #warning ^^^ This isn't a neponset!
  42.    *
  43.    *   MAX1600      Neponset
  44.    *
  45.    *    A0VCC        SA-1111 GPIO A<1>
  46.    *    A1VCC        SA-1111 GPIO A<0>
  47.    *    A0VPP        CPLD NCR A0VPP
  48.    *    A1VPP        CPLD NCR A1VPP
  49.    *    B0VCC        SA-1111 GPIO A<2>
  50.    *    B1VCC        SA-1111 GPIO A<3>
  51.    *    B0VPP        ground (slot B is CF)
  52.    *    B1VPP        ground (slot B is CF)
  53.    *
  54.    *     VX          VCC (5V)
  55.    *     VY          VCC3_3 (3.3V)
  56.    *     12INA       12V
  57.    *     12INB       ground (slot B is CF)
  58.    *
  59.    * The MAX1600 CODE pin is tied to ground, placing the device in 
  60.    * "Standard Intel code" mode. Refer to the Maxim data sheet for
  61.    * the corresponding truth table.
  62.    */
  63.   switch (conf->sock) {
  64.   case 0:
  65.     pa_dwr_mask = GPIO_GPIO0 | GPIO_GPIO1;
  66.     gpio_mask = NCR_A0VPP | NCR_A1VPP;
  67.     switch (conf->vcc) {
  68.     default:
  69.     case 0: pa_dwr_set = 0; break;
  70.     case 33: pa_dwr_set = GPIO_GPIO1; break;
  71.     case 50: pa_dwr_set = GPIO_GPIO0; break;
  72.     }
  73.     switch (conf->vpp) {
  74.     case 0: gpio_set = 0; break;
  75.     case 120: gpio_set = NCR_A1VPP; break;
  76.     default:
  77.       if (conf->vpp == conf->vcc)
  78. gpio_set = NCR_A0VPP;
  79.       else {
  80. printk(KERN_ERR "%s(): unrecognized Vpp %un",
  81.        __FUNCTION__, conf->vpp);
  82. return -1;
  83.       }
  84.     }
  85.     break;
  86.   case 1:
  87.     pa_dwr_mask = GPIO_GPIO2 | GPIO_GPIO3;
  88.     gpio_mask = 0;
  89.     gpio_set = 0;
  90.     switch (conf->vcc) {
  91.     default:
  92.     case 0: pa_dwr_set = 0; break;
  93.     case 33: pa_dwr_set = GPIO_GPIO2; break;
  94.     case 50: pa_dwr_set = GPIO_GPIO3; break;
  95.     }
  96.     if (conf->vpp != conf->vcc && conf->vpp != 0) {
  97.       printk(KERN_ERR "%s(): CF slot cannot support Vpp %un",
  98.      __FUNCTION__, conf->vpp);
  99.       return -1;
  100.     }
  101.     break;
  102.   }
  103.   ret = sa1111_pcmcia_configure_socket(conf);
  104.   if (ret == 0) {
  105.     unsigned long flags;
  106.     local_irq_save(flags);
  107.     PA_DWR = (PA_DWR & ~pa_dwr_mask) | pa_dwr_set;
  108.     GPSR = gpio_set;
  109.     GPCR = gpio_set ^ gpio_mask;
  110.     local_irq_restore(flags);
  111.   }
  112.   return ret;
  113. }
  114. struct pcmcia_low_level xp860_pcmcia_ops = { 
  115.   init: xp860_pcmcia_init,
  116.   shutdown: sa1111_pcmcia_shutdown,
  117.   socket_state: sa1111_pcmcia_socket_state,
  118.   get_irq_info: sa1111_pcmcia_get_irq_info,
  119.   configure_socket: xp860_pcmcia_configure_socket,
  120.   socket_init: sa1111_pcmcia_socket_init,
  121.   socket_suspend: sa1111_pcmcia_socket_suspend,
  122. };