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