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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * drivers/pcmcia/sa1100_jornada720.c
  3.  *
  4.  * Jornada720 PCMCIA specific routines
  5.  *
  6.  */
  7. #include <linux/kernel.h>
  8. #include <linux/sched.h>
  9. #include <asm/hardware.h>
  10. #include "sa1100_generic.h"
  11. #include "sa1111_generic.h"
  12. #define SOCKET0_POWER   GPIO_GPIO0
  13. #define SOCKET0_3V      GPIO_GPIO2
  14. #define SOCKET1_POWER   (GPIO_GPIO1 | GPIO_GPIO3)
  15. #warning *** Does SOCKET1_3V actually do anything?
  16. #define SOCKET1_3V GPIO_GPIO3
  17. static int jornada720_pcmcia_init(struct pcmcia_init *init)
  18. {
  19.   /*
  20.    * What is all this crap for?
  21.    */
  22.   GRER |= 0x00000002;
  23.   /* Set GPIO_A<3:1> to be outputs for PCMCIA/CF power controller: */
  24.   PA_DDR = 0;
  25.   PA_DWR = 0;
  26.   PA_SDR = 0;
  27.   PA_SSR = 0;
  28.   PB_DDR = 0;
  29.   PB_DWR = 0x01;
  30.   PB_SDR = 0;
  31.   PB_SSR = 0;
  32.   PC_DDR = 0x88;
  33.   PC_DWR = 0x20;
  34.   PC_SDR = 0;
  35.   PC_SSR = 0;
  36.   return sa1111_pcmcia_init(init);
  37. }
  38. static int
  39. jornada720_pcmcia_configure_socket(const struct pcmcia_configure *conf)
  40. {
  41.   unsigned int pa_dwr_mask, pa_dwr_set;
  42.   int ret;
  43. printk("%s(): config socket %d vcc %d vpp %dn", __FUNCTION__,
  44.        conf->sock, conf->vcc, conf->vpp);
  45.   switch (conf->sock) {
  46.   case 0:
  47.     pa_dwr_mask = SOCKET0_POWER | SOCKET0_3V;
  48.     switch (conf->vcc) {
  49.     default:
  50.     case 0: pa_dwr_set = 0; break;
  51.     case 33: pa_dwr_set = SOCKET0_POWER | SOCKET0_3V; break;
  52.     case 50: pa_dwr_set = SOCKET0_POWER; break;
  53.     }
  54.     break;
  55.   case 1:
  56.     pa_dwr_mask = SOCKET1_POWER;
  57.     switch (conf->vcc) {
  58.     default:
  59.     case 0: pa_dwr_set = 0; break;
  60.     case 33: pa_dwr_set = SOCKET1_POWER; break;
  61.     case 50: pa_dwr_set = SOCKET1_POWER; break;
  62.     }
  63.     break;
  64.   }
  65.   if (conf->vpp != conf->vcc && conf->vpp != 0) {
  66.     printk(KERN_ERR "%s(): slot cannot support VPP %un",
  67.    __FUNCTION__, conf->vpp);
  68.     return -1;
  69.   }
  70.   ret = sa1111_pcmcia_configure_socket(conf);
  71.   if (ret == 0) {
  72.     unsigned long flags;
  73.     local_irq_save(flags);
  74.     PA_DWR = (PA_DWR & ~pa_dwr_mask) | pa_dwr_set;
  75.     locla_irq_restore(flags);
  76.   }
  77.   return ret;
  78. }
  79. struct pcmcia_low_level jornada720_pcmcia_ops = {
  80.   init: jornada720_pcmcia_init,
  81.   shutdown: sa1111_pcmcia_shutdown,
  82.   socket_state: sa1111_pcmcia_socket_state,
  83.   get_irq_info: sa1111_pcmcia_get_irq_info,
  84.   configure_socket: jornada720_pcmcia_configure_socket,
  85.   socket_init: sa1111_pcmcia_socket_init,
  86.   socket_suspend: sa1111_pcmcia_socket_suspend,
  87. };