linux/arch/m68k/amiga/pcmcia.c
<<
>>
Prefs
   1/*
   2** asm-m68k/pcmcia.c -- Amiga Linux PCMCIA support
   3**                      most information was found by disassembling card.resource
   4**                      I'm still looking for an official doc !
   5**
   6** Copyright 1997 by Alain Malek
   7**
   8** This file is subject to the terms and conditions of the GNU General Public
   9** License.  See the file COPYING in the main directory of this archive
  10** for more details.
  11**
  12** Created: 12/10/97 by Alain Malek
  13*/
  14
  15#include <linux/types.h>
  16#include <linux/jiffies.h>
  17#include <linux/timer.h>
  18#include <linux/module.h>
  19
  20#include <asm/amigayle.h>
  21#include <asm/amipcmcia.h>
  22
  23/* gayle config byte for program voltage and access speed */
  24static unsigned char cfg_byte = GAYLE_CFG_0V|GAYLE_CFG_150NS;
  25
  26void pcmcia_reset(void)
  27{
  28        unsigned long reset_start_time = jiffies;
  29        unsigned char b;
  30
  31        gayle_reset = 0x00;
  32        while (time_before(jiffies, reset_start_time + 1*HZ/100));
  33        b = gayle_reset;
  34}
  35EXPORT_SYMBOL(pcmcia_reset);
  36
  37
  38/* copy a tuple, including tuple header. return nb bytes copied */
  39/* be careful as this may trigger a GAYLE_IRQ_WR interrupt ! */
  40
  41int pcmcia_copy_tuple(unsigned char tuple_id, void *tuple, int max_len)
  42{
  43        unsigned char id, *dest;
  44        int cnt, pos, len;
  45
  46        dest = tuple;
  47        pos = 0;
  48
  49        id = gayle_attribute[pos];
  50
  51        while((id != CISTPL_END) && (pos < 0x10000)) {
  52                len = (int)gayle_attribute[pos+2] + 2;
  53                if (id == tuple_id) {
  54                        len = (len > max_len)?max_len:len;
  55                        for (cnt = 0; cnt < len; cnt++) {
  56                                *dest++ = gayle_attribute[pos+(cnt<<1)];
  57                        }
  58
  59                        return len;
  60                }
  61                pos += len<<1;
  62                id = gayle_attribute[pos];
  63        }
  64
  65        return 0;
  66}
  67EXPORT_SYMBOL(pcmcia_copy_tuple);
  68
  69void pcmcia_program_voltage(int voltage)
  70{
  71        unsigned char v;
  72
  73        switch (voltage) {
  74        case PCMCIA_0V:
  75                v = GAYLE_CFG_0V;
  76                break;
  77        case PCMCIA_5V:
  78                v = GAYLE_CFG_5V;
  79                break;
  80        case PCMCIA_12V:
  81                v = GAYLE_CFG_12V;
  82                break;
  83        default:
  84                v = GAYLE_CFG_0V;
  85        }
  86
  87        cfg_byte = (cfg_byte & 0xfc) | v;
  88        gayle.config = cfg_byte;
  89
  90}
  91EXPORT_SYMBOL(pcmcia_program_voltage);
  92
  93void pcmcia_access_speed(int speed)
  94{
  95        unsigned char s;
  96
  97        if (speed <= PCMCIA_SPEED_100NS)
  98                s = GAYLE_CFG_100NS;
  99        else if (speed <= PCMCIA_SPEED_150NS)
 100                s = GAYLE_CFG_150NS;
 101        else if (speed <= PCMCIA_SPEED_250NS)
 102                s = GAYLE_CFG_250NS;
 103        else
 104                s = GAYLE_CFG_720NS;
 105
 106        cfg_byte = (cfg_byte & 0xf3) | s;
 107        gayle.config = cfg_byte;
 108}
 109EXPORT_SYMBOL(pcmcia_access_speed);
 110
 111void pcmcia_write_enable(void)
 112{
 113        gayle.cardstatus = GAYLE_CS_WR|GAYLE_CS_DA;
 114}
 115EXPORT_SYMBOL(pcmcia_write_enable);
 116
 117void pcmcia_write_disable(void)
 118{
 119        gayle.cardstatus = 0;
 120}
 121EXPORT_SYMBOL(pcmcia_write_disable);
 122
 123