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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * drivers/pcmcia/sa1100_graphicsclient.c
  3.  *
  4.  * PCMCIA implementation routines for Graphics Client Plus
  5.  *
  6.  * 9/12/01   Woojung
  7.  *    Turn power OFF at startup
  8.  * 1/31/2001 Woojung Huh
  9.  *    Fix for GC Plus PCMCIA Reset Problem
  10.  * 2/27/2001 Woojung Huh [whuh@applieddata.net]
  11.  *    Fix
  12.  *
  13.  */
  14. #include <linux/kernel.h>
  15. #include <linux/sched.h>
  16. #include <linux/delay.h>
  17. #include <asm/hardware.h>
  18. #include <asm/irq.h>
  19. #include "sa1100_generic.h"
  20. #error This is broken!
  21. #define S0_CD_IRQ 60 // Socket 0 Card Detect IRQ
  22. #define S0_STS_IRQ 55 // Socket 0 PCMCIA IRQ
  23. static volatile unsigned long *PCMCIA_Status = 
  24. ((volatile unsigned long *) ADS_p2v(_ADS_CS_STATUS));
  25. static volatile unsigned long *PCMCIA_Power = 
  26. ((volatile unsigned long *) ADS_p2v(_ADS_CS_PR));
  27. static int gcplus_pcmcia_init(struct pcmcia_init *init)
  28. {
  29.   int irq, res;
  30.   // Reset PCMCIA
  31.   // Reset Timing for CPLD(U2) version 8001E or later
  32.   *PCMCIA_Power &= ~ ADS_CS_PR_A_RESET;
  33.   udelay(12); // 12 uSec
  34.   *PCMCIA_Power |= ADS_CS_PR_A_RESET;
  35.   mdelay(30); // 30 mSec
  36.   // Turn off 5V
  37.   *PCMCIA_Power &= ~0x03;
  38.   /* Register interrupts */
  39.   irq = S0_CD_IRQ;
  40.   res = request_irq(irq, init->handler, SA_INTERRUPT, "PCMCIA 0 CD", NULL);
  41.   if (res < 0) {
  42.   printk(KERN_ERR "%s: Request for IRQ %lu failedn", __FUNCTION__, irq);
  43.   return -1;
  44.   }
  45.   return 1; // 1 PCMCIA Slot
  46. }
  47. static int gcplus_pcmcia_shutdown(void)
  48. {
  49.   /* disable IRQs */
  50.   free_irq( S0_CD_IRQ, NULL);
  51.   
  52.   /* Shutdown PCMCIA power */
  53.   mdelay(2); // 2msec
  54.   *PCMCIA_Power &= ~0x03;
  55.   return 0;
  56. }
  57. static int gcplus_pcmcia_socket_state(struct pcmcia_state_array
  58.        *state_array){
  59.   unsigned long levels;
  60.   if(state_array->size<1) return -1;
  61.   memset(state_array->state, 0, 
  62.  (state_array->size)*sizeof(struct pcmcia_state));
  63.   levels=*PCMCIA_Status;
  64.   state_array->state[0].detect=(levels & ADS_CS_ST_A_CD)?1:0;
  65.   state_array->state[0].ready=(levels & ADS_CS_ST_A_READY)?1:0;
  66.   state_array->state[0].bvd1= 0;
  67.   state_array->state[0].bvd2= 0;
  68.   state_array->state[0].wrprot=0;
  69.   state_array->state[0].vs_3v=0;
  70.   state_array->state[0].vs_Xv=0;
  71.   return 1;
  72. }
  73. static int gcplus_pcmcia_get_irq_info(struct pcmcia_irq_info *info)
  74. {
  75. if (info->sock > 1)
  76. return -1;
  77. if (info->sock == 0)
  78. info->irq = S0_STS_IRQ;
  79.    return 0;
  80. }
  81. static int gcplus_pcmcia_configure_socket(const struct pcmcia_configure
  82.    *configure)
  83. {
  84.   unsigned long flags;
  85.   if(configure->sock>1) return -1;
  86.   save_flags_cli(flags);
  87.   switch (configure->vcc) {
  88.   case 0:
  89.   *PCMCIA_Power &= ~(ADS_CS_PR_A_3V_POWER | ADS_CS_PR_A_5V_POWER);
  90.     break;
  91.   case 50:
  92.   *PCMCIA_Power &= ~(ADS_CS_PR_A_3V_POWER | ADS_CS_PR_A_5V_POWER);
  93.   *PCMCIA_Power |= ADS_CS_PR_A_5V_POWER;
  94. break;
  95.   case 33:
  96.   *PCMCIA_Power &= ~(ADS_CS_PR_A_3V_POWER | ADS_CS_PR_A_5V_POWER);
  97.   *PCMCIA_Power |= ADS_CS_PR_A_3V_POWER;
  98.     break;
  99.   default:
  100.     printk(KERN_ERR "%s(): unrecognized Vcc %un", __FUNCTION__,
  101.    configure->vcc);
  102.     restore_flags(flags);
  103.     return -1;
  104.   }
  105.   /* Silently ignore Vpp, output enable, speaker enable. */
  106.   // Reset PCMCIA
  107.   *PCMCIA_Power &= ~ ADS_CS_PR_A_RESET;
  108.   udelay(12);
  109.   *PCMCIA_Power |= ADS_CS_PR_A_RESET;
  110.   mdelay(30);
  111.   restore_flags(flags);
  112.   return 0;
  113. }
  114. static int gcplus_pcmcia_socket_init(int sock)
  115. {
  116.   return 0;
  117. }
  118. static int gcplus_pcmcia_socket_suspend(int sock)
  119. {
  120.   return 0;
  121. }
  122. struct pcmcia_low_level gcplus_pcmcia_ops = { 
  123.   init: gcplus_pcmcia_init,
  124.   shutdown: gcplus_pcmcia_shutdown,
  125.   socket_state: gcplus_pcmcia_socket_state,
  126.   get_irq_info: gcplus_pcmcia_get_irq_info,
  127.   configure_socket: gcplus_pcmcia_configure_socket,
  128.   socket_init: gcplus_pcmcia_socket_init,
  129.   socket_suspend: gcplus_pcmcia_socket_suspend,
  130. };