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

嵌入式Linux

开发平台:

Unix_Linux

  1. #warning "REVISIT_PFS168: Need to verify and test GPIO power encodings."
  2. /*
  3.  * drivers/pcmcia/sa1100_pfs168.c
  4.  *
  5.  * PFS168 PCMCIA specific routines
  6.  *
  7.  */
  8. #include <linux/kernel.h>
  9. #include <linux/sched.h>
  10. #include <asm/delay.h>
  11. #include <asm/hardware.h>
  12. #include <asm/irq.h>
  13. #include "sa1100_generic.h"
  14. #include "sa1111_generic.h"
  15. static int pfs168_pcmcia_init(struct pcmcia_init *init)
  16. {
  17.   /* TPS2211 to standby mode: */
  18.   PA_DWR &= ~(GPIO_GPIO0 | GPIO_GPIO1 | GPIO_GPIO2 | GPIO_GPIO3);
  19.   /* Set GPIO_A<3:0> to be outputs for PCMCIA (socket 0) power controller: */
  20.   PA_DDR &= ~(GPIO_GPIO0 | GPIO_GPIO1 | GPIO_GPIO2 | GPIO_GPIO3);
  21.   return sa1111_pcmcia_init(init);
  22. }
  23. static int
  24. pfs168_pcmcia_configure_socket(const struct pcmcia_configure *conf)
  25. {
  26.   unsigned int pa_dwr_mask = 0, pa_dwr_set = 0;
  27.   int ret;
  28.   /* PFS168 uses the Texas Instruments TPS2211 for PCMCIA (socket 0) voltage control only,
  29.    * with the following connections:
  30.    *
  31.    *   TPS2211      PFS168
  32.    *
  33.    *    -VCCD0      SA-1111 GPIO A<0>
  34.    *    -VCCD0      SA-1111 GPIO A<1>
  35.    *     VPPD0      SA-1111 GPIO A<2>
  36.    *     VPPD0      SA-1111 GPIO A<2>
  37.    *
  38.    */
  39.   switch (conf->sock) {
  40.   case 0:
  41.     pa_dwr_mask = GPIO_GPIO0 | GPIO_GPIO1 | GPIO_GPIO2 | GPIO_GPIO3;
  42.     switch (conf->vcc) {
  43.     default:
  44.     case 0: pa_dwr_set = 0; break;
  45.     case 33: pa_dwr_set = GPIO_GPIO0; break;
  46.     case 50: pa_dwr_set = GPIO_GPIO1; break;
  47.     }
  48.     switch (conf->vpp) {
  49.     case 0:
  50.       break;
  51.     case 120:
  52.       printk(KERN_ERR "%s(): PFS-168 does not support VPP %uVn",
  53.      __FUNCTION__, conf->vpp / 10);
  54.       return -1;
  55.       break;
  56.     default:
  57.       if (conf->vpp == conf->vcc)
  58.         pa_dwr_set |= GPIO_GPIO3;
  59.       else {
  60. printk(KERN_ERR "%s(): unrecognized VPP %un", __FUNCTION__,
  61.        conf->vpp);
  62. return -1;
  63.       }
  64.     }
  65.     break;
  66.   case 1:
  67.     pa_dwr_mask = 0;
  68.     pa_dwr_set = 0;
  69.     switch (conf->vcc) {
  70.     case 0:
  71.     case 33:
  72.       break;
  73.     case 50:
  74.       printk(KERN_ERR "%s(): PFS-168 CompactFlash socket does not support VCC %uVn",
  75.      __FUNCTION__, conf->vcc / 10);
  76.       return -1;
  77.     default:
  78.       printk(KERN_ERR "%s(): unrecognized VCC %un", __FUNCTION__,
  79.      conf->vcc);
  80.       return -1;
  81.     }
  82.     if (conf->vpp != conf->vcc && conf->vpp != 0) {
  83.       printk(KERN_ERR "%s(): CompactFlash socket does not support VPP %uVn"
  84.       __FUNCTION__, conf->vpp/10);
  85.       return -1;
  86.     }
  87.     break;
  88.   }
  89.   ret = sa1111_pcmcia_configure_socket(conf);
  90.   if (ret == 0) {
  91.     unsigned long flags;
  92.     local_irq_save(flags);
  93.     PA_DWR = (PA_DWR & ~pa_dwr_mask) | pa_dwr_set;
  94.     local_irq_restore(flags);
  95.   }
  96.   return 0;
  97. }
  98. struct pcmcia_low_level pfs168_pcmcia_ops = {
  99.   init: pfs168_pcmcia_init,
  100.   shutdown: sa1111_pcmcia_shutdown,
  101.   socket_state: sa1111_pcmcia_socket_state,
  102.   get_irq_info: sa1111_pcmcia_get_irq_info,
  103.   configure_socket: pfs168_pcmcia_configure_socket,
  104.   socket_init: sa1111_pcmcia_socket_init,
  105.   socket_suspend: sa1111_pcmcia_socket_suspend,
  106. };