linux/drivers/pcmcia/sa1100_shannon.c
<<
>>
Prefs
   1/*
   2 * drivers/pcmcia/sa1100_shannon.c
   3 *
   4 * PCMCIA implementation routines for Shannon
   5 *
   6 */
   7#include <linux/module.h>
   8#include <linux/kernel.h>
   9#include <linux/device.h>
  10#include <linux/init.h>
  11#include <linux/io.h>
  12
  13#include <mach/hardware.h>
  14#include <asm/mach-types.h>
  15#include <mach/shannon.h>
  16#include <asm/irq.h>
  17#include "sa1100_generic.h"
  18
  19static int shannon_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
  20{
  21        /* All those are inputs */
  22        GAFR &= ~(GPIO_GPIO(SHANNON_GPIO_EJECT_0) |
  23                  GPIO_GPIO(SHANNON_GPIO_EJECT_1) |
  24                  GPIO_GPIO(SHANNON_GPIO_RDY_0) |
  25                  GPIO_GPIO(SHANNON_GPIO_RDY_1));
  26
  27        if (skt->nr == 0) {
  28                skt->stat[SOC_STAT_CD].gpio = SHANNON_GPIO_EJECT_0;
  29                skt->stat[SOC_STAT_CD].name = "PCMCIA_CD_0";
  30                skt->stat[SOC_STAT_RDY].gpio = SHANNON_GPIO_RDY_0;
  31                skt->stat[SOC_STAT_RDY].name = "PCMCIA_RDY_0";
  32        } else {
  33                skt->stat[SOC_STAT_CD].gpio = SHANNON_GPIO_EJECT_1;
  34                skt->stat[SOC_STAT_CD].name = "PCMCIA_CD_1";
  35                skt->stat[SOC_STAT_RDY].gpio = SHANNON_GPIO_RDY_1;
  36                skt->stat[SOC_STAT_RDY].name = "PCMCIA_RDY_1";
  37        }
  38
  39        return 0;
  40}
  41
  42static void
  43shannon_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
  44                            struct pcmcia_state *state)
  45{
  46        switch (skt->nr) {
  47        case 0:
  48                state->bvd1   = 1; 
  49                state->bvd2   = 1; 
  50                state->vs_3v  = 1; /* FIXME Can only apply 3.3V on Shannon. */
  51                state->vs_Xv  = 0;
  52                break;
  53
  54        case 1:
  55                state->bvd1   = 1; 
  56                state->bvd2   = 1; 
  57                state->vs_3v  = 1; /* FIXME Can only apply 3.3V on Shannon. */
  58                state->vs_Xv  = 0;
  59                break;
  60        }
  61}
  62
  63static int
  64shannon_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
  65                                const socket_state_t *state)
  66{
  67        switch (state->Vcc) {
  68        case 0: /* power off */
  69                printk(KERN_WARNING "%s(): CS asked for 0V, still applying 3.3V..\n", __func__);
  70                break;
  71        case 50:
  72                printk(KERN_WARNING "%s(): CS asked for 5V, applying 3.3V..\n", __func__);
  73        case 33:
  74                break;
  75        default:
  76                printk(KERN_ERR "%s(): unrecognized Vcc %u\n",
  77                       __func__, state->Vcc);
  78                return -1;
  79        }
  80
  81        printk(KERN_WARNING "%s(): Warning, Can't perform reset\n", __func__);
  82        
  83        /* Silently ignore Vpp, output enable, speaker enable. */
  84
  85        return 0;
  86}
  87
  88static struct pcmcia_low_level shannon_pcmcia_ops = {
  89        .owner                  = THIS_MODULE,
  90        .hw_init                = shannon_pcmcia_hw_init,
  91        .socket_state           = shannon_pcmcia_socket_state,
  92        .configure_socket       = shannon_pcmcia_configure_socket,
  93};
  94
  95int pcmcia_shannon_init(struct device *dev)
  96{
  97        int ret = -ENODEV;
  98
  99        if (machine_is_shannon())
 100                ret = sa11xx_drv_pcmcia_probe(dev, &shannon_pcmcia_ops, 0, 2);
 101
 102        return ret;
 103}
 104