sa1100_pangolin.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:4k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * drivers/pcmcia/sa1100_pangolin.c
  3.  *
  4.  * PCMCIA implementation routines for Pangolin
  5.  *
  6.  */
  7. #include <linux/kernel.h>
  8. #include <linux/sched.h>
  9. #include <asm/hardware.h>
  10. #include <asm/irq.h>
  11. #include "sa1100_generic.h"
  12. static int pangolin_pcmcia_init(struct pcmcia_init *init){
  13.   int irq, res;
  14. #ifndef CONFIG_SA1100_PANGOLIN_PCMCIA_IDE
  15.   /* Enable PCMCIA bus: */
  16.   GPCR = GPIO_PCMCIA_BUS_ON;
  17. #endif
  18.   /* Set transition detect */
  19.   set_GPIO_IRQ_edge( GPIO_PCMCIA_CD, GPIO_BOTH_EDGES );
  20.   set_GPIO_IRQ_edge( GPIO_PCMCIA_IRQ, GPIO_FALLING_EDGE );
  21.   /* Register interrupts */
  22.   irq = IRQ_PCMCIA_CD;
  23.   res = request_irq( irq, init->handler, SA_INTERRUPT, "PCMCIA_CD", NULL );
  24.   if( res < 0 ) goto irq_err;
  25.   /* There's only one slot, but it's "Slot 1": */
  26.   return 2;
  27. irq_err:
  28.   printk( KERN_ERR "%s: Request for IRQ %lu failedn", __FUNCTION__, irq );
  29.   return -1;
  30. }
  31. static int pangolin_pcmcia_shutdown(void)
  32. {
  33.   /* disable IRQs */
  34.   free_irq( IRQ_PCMCIA_CD, NULL );
  35. #ifndef CONFIG_SA1100_PANGOLIN_PCMCIA_IDE
  36.     /* Disable PCMCIA bus: */
  37.     GPSR = GPIO_PCMCIA_BUS_ON;
  38. #endif
  39.   return 0;
  40. }
  41. static int pangolin_pcmcia_socket_state(struct pcmcia_state_array
  42.        *state_array){
  43.   unsigned long levels;
  44.   if(state_array->size<2) return -1;
  45.   memset(state_array->state, 0, 
  46.  (state_array->size)*sizeof(struct pcmcia_state));
  47.   levels=GPLR;
  48. #ifndef CONFIG_SA1100_PANGOLIN_PCMCIA_IDE
  49.   state_array->state[1].detect=((levels & GPIO_PCMCIA_CD)==0)?1:0;
  50.   state_array->state[1].ready=(levels & GPIO_PCMCIA_IRQ)?1:0;
  51.   state_array->state[1].bvd1=1; /* Not available on Pangolin. */
  52.   state_array->state[1].bvd2=1; /* Not available on Pangolin. */
  53.   state_array->state[1].wrprot=0; /* Not available on Pangolin. */
  54.   state_array->state[1].vs_3v=1;  /* Can only apply 3.3V on Pangolin. */
  55.   state_array->state[1].vs_Xv=0;
  56. #else
  57.   state_array->state[0].detect=((levels & GPIO_PCMCIA_CD)==0)?1:0;
  58.   state_array->state[0].ready=(levels & GPIO_PCMCIA_IRQ)?1:0;
  59.   state_array->state[0].bvd1=1; /* Not available on Pangolin. */
  60.   state_array->state[0].bvd2=1; /* Not available on Pangolin. */
  61.   state_array->state[0].wrprot=0; /* Not available on Pangolin. */
  62.   state_array->state[0].vs_3v=0;  /* voltage level is determined by jumper setting */
  63.   state_array->state[0].vs_Xv=0;
  64. #endif
  65.   return 1;
  66. }
  67. static int pangolin_pcmcia_get_irq_info(struct pcmcia_irq_info *info){
  68.   if(info->sock>1) return -1;
  69. #ifndef CONFIG_SA1100_PANGOLIN_PCMCIA_IDE
  70.   if(info->sock==1)
  71. info->irq=IRQ_PCMCIA_IRQ;
  72. #else
  73.   if(info->sock==0)
  74.         info->irq=IRQ_PCMCIA_IRQ;
  75. #endif
  76.   return 0;
  77. }
  78. static int pangolin_pcmcia_configure_socket(const struct pcmcia_configure
  79.    *configure)
  80. {
  81.   unsigned long value, flags;
  82.   if(configure->sock>1) return -1;
  83. #ifndef CONFIG_SA1100_PANGOLIN_PCMCIA_IDE
  84.   if(configure->sock==0) return 0;
  85. #endif
  86.   save_flags_cli(flags);
  87.   /* Murphy: BUS_ON different from POWER ? */
  88.   switch(configure->vcc){
  89.   case 0:
  90.     break;
  91. #ifndef CONFIG_SA1100_PANGOLIN_PCMCIA_IDE
  92.   case 50:
  93.     printk(KERN_WARNING "%s(): CS asked for 5V, applying 3.3V...n",
  94.    __FUNCTION__);
  95.   case 33:  /* Can only apply 3.3V to the CF slot. */
  96.     break;
  97. #else
  98.   case 50:
  99.     printk(KERN_WARNING "%s(): CS asked for 5V, determinded by jumper setting...n", __FUNCTION__);
  100.     break;
  101.   case 33:
  102.     printk(KERN_WARNING "%s(): CS asked for 3.3V, determined by jumper setting...n", __FUNCTION__);
  103.     break;
  104. #endif
  105.   default:
  106.     printk(KERN_ERR "%s(): unrecognized Vcc %un", __FUNCTION__,
  107.    configure->vcc);
  108.     restore_flags(flags);
  109.     return -1;
  110.   }
  111. #ifdef CONFIG_SA1100_PANGOLIN_PCMCIA_IDE
  112.   /* reset & unreset request */
  113.   if(configure->sock==0) {
  114. if(configure->reset) {
  115. GPSR |= GPIO_PCMCIA_RESET;
  116. } else {
  117. GPCR |= GPIO_PCMCIA_RESET;
  118. }
  119.   }
  120. #endif
  121.   /* Silently ignore Vpp, output enable, speaker enable. */
  122.   restore_flags(flags);
  123.   return 0;
  124. }
  125. static int pangolin_pcmcia_socket_init(int sock)
  126. {
  127.   /* enable card status IRQs - see sa1100_assabet.c for details  */
  128.   return -1;
  129. }
  130. static int pangolin_pcmcia_socket_suspend(int sock)
  131. {
  132.   /* disable card status IRQs - see sa1100_assabet.c for details */
  133.   return -1;
  134. }
  135. struct pcmcia_low_level pangolin_pcmcia_ops = { 
  136.   init: pangolin_pcmcia_init,
  137.   shutdown: pangolin_pcmcia_shutdown,
  138.   socket_state: pangolin_pcmcia_socket_state,
  139.   get_irq_info: pangolin_pcmcia_get_irq_info,
  140.   configure_socket: pangolin_pcmcia_configure_socket,
  141.   socket_init: pangolin_pcmcia_socket_init,
  142.   socket_suspend, pangolin_pcmcia_socket_suspend,
  143. };