176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifdef CONFIG_PCMCIA 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * i82365.c 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Support for i82365 and similar ISA-to-PCMCIA bridges 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Taken from Linux kernel sources, distributed under GPL2 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Software distributed under the License is distributed on an "AS 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * implied. See the License for the specific language governing 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * rights and limitations under the License. 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * The initial developer of the original code is David A. Hinds 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Ported by: Anselm Martin Hoffmeister, Stockholm Projekt Computer-Service, Sankt Augustin/Bonn, GERMANY 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * ****************************** 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * PLEASE DO NOT YET WORK ON THIS 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * ****************************** 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * I'm still fixing it up on every end, so we most probably would interfere 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * at some point. If there's anything obvious or better, not-so-obvious, 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * please contact me by e-mail: anselm (AT) hoffmeister (DOT) be *THANKS* 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "../include/pcmcia.h" 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "../include/pcmcia-opts.h" 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "../include/i82365.h" 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef CONFIG_ISA 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#error PCMCIA_I82365 only works with ISA defined - set CONFIG_ISA 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef enum pcic_id { 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman IS_I82365A, IS_I82365B, IS_I82365DF, 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman IS_IBM, IS_RF5Cx96, IS_VLSI, IS_VG468, IS_VG469, 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman IS_PD6710, IS_PD672X, IS_VT83C469, 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} pcic_id; 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Flags for classifying groups of controllers */ 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IS_VADEM 0x0001 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IS_CIRRUS 0x0002 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IS_TI 0x0004 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IS_O2MICRO 0x0008 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IS_VIA 0x0010 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IS_TOPIC 0x0020 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IS_RICOH 0x0040 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IS_UNKNOWN 0x0400 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IS_VG_PWR 0x0800 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IS_DF_PWR 0x1000 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IS_PCI 0x2000 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IS_ALIVE 0x8000 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct pcic_t { 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman char *name; 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u_short flags; 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} pcic_t; 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic pcic_t pcic[] = { 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { "Intel i82365sl A step", 0 }, 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { "Intel i82365sl B step", 0 }, 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { "Intel i82365sl DF", IS_DF_PWR }, 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { "IBM Clone", 0 }, 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { "Ricoh RF5C296/396", 0 }, 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { "VLSI 82C146", 0 }, 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { "Vadem VG-468", IS_VADEM }, 7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { "Vadem VG-469", IS_VADEM|IS_VG_PWR }, 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { "Cirrus PD6710", IS_CIRRUS }, 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { "Cirrus PD672x", IS_CIRRUS }, 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { "VIA VT83C469", IS_CIRRUS|IS_VIA }, 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct cirrus_state_t { 8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u_char misc1, misc2; 8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u_char timer[6]; 8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} cirrus_state_t; 8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct vg46x_state_t { 8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u_char ctl, ema; 8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} vg46x_state_t; 8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct socket_info_t { 8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u_short type, flags; 9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman socket_cap_t cap; 9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ioaddr_t ioaddr; 9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u_short psock; 9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u_char cs_irq, intr; 9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman void (*handler)(void *info, u_int events); 9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman void *info; 9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union { 9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cirrus_state_t cirrus; 9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman vg46x_state_t vg46x; 9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } state; 10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} socket_info_t; 10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//static socket_info_t socket[8]; 10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint i365_base = 0x3e0; // Default in Linux kernel 10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint cycle_time = 120; // External clock time in ns, 120ns =~ 8.33 MHz 10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint mydriverid = 0; 10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid phex ( unsigned char c ); 10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*static int to_cycles(int ns) 11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return ns/cycle_time; 11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*static int to_ns(int cycles) 11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return cycle_time*cycles; 11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic u_char i365_get(u_short sock, u_short reg) 12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman //unsigned long flags; 12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman //spin_lock_irqsave(&bus_lock,flags); 12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ioaddr_t port = pccsock[sock].ioaddr; 12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u_char val; 12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman reg = I365_REG(pccsock[sock].internalid, reg); 12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman outb(reg, port); val = inb(port+1); 12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman //spin_unlock_irqrestore(&bus_lock,flags); 13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return val; 13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic void i365_set(u_short sock, u_short reg, u_char data) 13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman //unsigned long flags; 13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman //spin_lock_irqsave(&bus_lock,flags); 13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ioaddr_t port = pccsock[sock].ioaddr; 14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u_char val = I365_REG(pccsock[sock].internalid, reg); 14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman outb(val, port); outb(data, port+1); 14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman //spin_unlock_irqrestore(&bus_lock,flags); 14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid add_socket_i365(u_short port, int psock, int type) { 14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pccsock[pccsocks].ioaddr = port; 14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pccsock[pccsocks].internalid = psock; 14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pccsock[pccsocks].type = type; 15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pccsock[pccsocks].flags = pcic[type].flags; 15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pccsock[pccsocks].drivernum = mydriverid; 15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pccsock[pccsocks].configoffset = -1; 15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // Find out if a card in inside that socket 15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pccsock[pccsocks].status = (( 12 == (i365_get(pccsocks,I365_STATUS)&12) ) ? HASCARD : EMPTY ); 15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // *TODO* check if that's all 15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( 0 == (psock & 1) ) { 15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf ( "Found a PCMCIA controller (i82365) at io %x, type '%s'\n", port, pcic[type].name ); 15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // pccsock[pccsocks].status == HASCARD? "holds card":"empty" ); 15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pccsocks++; 16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 16476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid i365_bset(u_short sock, u_short reg, u_char mask) { 16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u_char d = i365_get(sock, reg); 16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman d |= mask; 16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sock, reg, d); 16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid i365_bclr(u_short sock, u_short reg, u_char mask) { 17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u_char d = i365_get(sock, reg); 17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman d &= ~mask; 17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sock, reg, d); 17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*static void i365_bflip(u_short sock, u_short reg, u_char mask, int b) 17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u_char d = i365_get(sock, reg); 18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (b) 18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman d |= mask; 18276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else 18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman d &= ~mask; 18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sock, reg, d); 18576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 18676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 18776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 18876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 18976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic u_short i365_get_pair(u_short sock, u_short reg) 19076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 19176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u_short a, b; 19276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman a = i365_get(sock, reg); 19376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman b = i365_get(sock, reg+1); 19476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return (a + (b<<8)); 19576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 19676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 19776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 19876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 19976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic void i365_set_pair(u_short sock, u_short reg, u_short data) 20076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 20176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sock, reg, data & 0xff); 20276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sock, reg+1, data >> 8); 20376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 20476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 20576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint identify_i365 ( u_short port, u_short sock ) { 20676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u_char val; 20776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int type = -1; 20876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Use the next free entry in the socket table */ 20976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pccsock[pccsocks].ioaddr = port; 21076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pccsock[pccsocks].internalid = sock; 21176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // *TODO* wakeup a sleepy cirrus controller? 21276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 21376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ((val = i365_get(pccsocks, I365_IDENT)) & 0x70) 21476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return -1; 21576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch (val) { 21676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 0x82: 21776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman type = IS_I82365A; break; 21876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 0x83: 21976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman type = IS_I82365B; break; 22076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 0x84: 22176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman type = IS_I82365DF; break; 22276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 0x88: case 0x89: case 0x8a: 22376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman type = IS_IBM; break; 22476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 22576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Check for Vadem VG-468 chips */ 22676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman outb(0x0e, port); 22776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman outb(0x37, port); 22876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_bset(pccsocks, VG468_MISC, VG468_MISC_VADEMREV); 22976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman val = i365_get(pccsocks, I365_IDENT); 23076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (val & I365_IDENT_VADEM) { 23176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_bclr(pccsocks, VG468_MISC, VG468_MISC_VADEMREV); 23276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman type = ((val & 7) >= 4) ? IS_VG469 : IS_VG468; 23376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 23476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 23576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Check for Ricoh chips */ 23676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman val = i365_get(pccsocks, RF5C_CHIP_ID); 23776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ((val == RF5C_CHIP_RF5C296) || (val == RF5C_CHIP_RF5C396)) type = IS_RF5Cx96; 23876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 23976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Check for Cirrus CL-PD67xx chips */ 24076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(pccsocks, PD67_CHIP_INFO, 0); 24176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman val = i365_get(pccsocks, PD67_CHIP_INFO); 24276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ((val & PD67_INFO_CHIP_ID) == PD67_INFO_CHIP_ID) { 24376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman val = i365_get(pccsocks, PD67_CHIP_INFO); 24476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ((val & PD67_INFO_CHIP_ID) == 0) { 24576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman type = (val & PD67_INFO_SLOTS) ? IS_PD672X : IS_PD6710; 24676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(pccsocks, PD67_EXT_INDEX, 0xe5); 24776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (i365_get(pccsocks, PD67_EXT_INDEX) != 0xe5) type = IS_VT83C469; 24876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 24976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 25076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return type; 25176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 25276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 25376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint init_i82365(void) { 25476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int i, j, sock, k, ns, id; 25576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman //unsigned int ui,uj; 25676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman //unsigned char * upc; 25776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ioaddr_t port; 25876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int i82365s = 0; 25976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // Change from kernel: No irq init, no check_region, no isapnp support 26076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // No ignore socket, no extra sockets to check (so it's easier here :-/) 26176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // Probably we don't need any of them; in case YOU do, SHOUT AT ME! 26276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman id = identify_i365(i365_base, 0); 26376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ((id == IS_I82365DF) && (identify_i365(i365_base, 1) != id)) { 26476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i = 0; i < 4; i++) { 26576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman port = i365_base + ((i & 1) << 2) + ((i & 2) << 1); 26676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sock = (i & 1) << 1; 26776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (identify_i365(port, sock) == IS_I82365DF) { 26876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman add_socket_i365(port, sock, IS_VLSI); 26976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 27076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 27176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else { 27276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i = 0; i < 4; i += 2) { 27376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman port = i365_base + 2*(i>>2); 27476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sock = (i & 3); 27576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman id = identify_i365(port, sock); 27676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (id < 0) continue; 27776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 27876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (j = ns = 0; j < 2; j++) { 27976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Does the socket exist? */ 28076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (identify_i365(port, sock+j) < 0) continue; 28176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Check for bad socket decode */ 28276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (k = 0; k <= i82365s; k++) 28376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(k, I365_MEM(0)+I365_W_OFF, k); 28476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (k = 0; k <= i82365s; k++) 28576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (i365_get(k, I365_MEM(0)+I365_W_OFF) != k) 28676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 28776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (k <= i82365s) break; 28876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman add_socket_i365(port, sock+j, id); ns++; 28976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 29076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 29176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 29276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; 29376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 29476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 29576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 29676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 29776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 29876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 29976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 30076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* printf ( "Selecting config 1: io 0x300 @byte 87*2.." ); 30176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman upc[(2*87)] = 2; 30276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_bclr(1, I365_ADDRWIN, 1 ); 30376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(1,I365_INTCTL, 0x65 ); //no-reset, memory-card 30476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(1, I365_IO(0)+0, 0x20 ); 30576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(1, I365_IO(0)+1, 0x03 ); 30676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(1, I365_IO(0)+2, 0x3f ); 30776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(1, I365_IO(0)+3, 0x03 ); 30876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(1, 0x3a, 0x05 ); 30976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(1, 0x3b, 0x05 ); 31076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(1, 0x3c, 0x05 ); 31176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(1, 0x3d, 0x05 ); 31276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(1, 0x3e, 0x05 ); 31376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(1, 0x3f, 0x05 ); 31476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(1, 0x07, 0x0a ); 31576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(1, I365_ADDRWIN, 0x40 ); // 0x40 31676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf ( "!\n" ); getchar(); 31776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf ( "\n" ); 31876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; */ 31976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 32076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 32176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid phex ( unsigned char c ) { 32276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman unsigned char a = 0, b = 0; 32376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman b = ( c & 0xf ); 32476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( b > 9 ) b += ('a'-'9'-1); 32576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman b += '0'; 32676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman a = ( c & 0xf0 ) >> 4; 32776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( a > 9 ) a += ('a'-'9'-1); 32876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman a += '0'; 32976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf ( "%c%c ", a, b ); 33076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 33176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 33276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 33376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint deinit_i82365(void) { 33476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf("Deinitializing i82365\n" ); 33576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; 33676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 33776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 33876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*static int i365_get_status(u_short sock, u_int *value) 33976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 34076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u_int status; 34176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 34276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman status = i365_get(sock, I365_STATUS); 34376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *value = ((status & I365_CS_DETECT) == I365_CS_DETECT) 34476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ? SS_DETECT : 0; 34576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 34676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (i365_get(sock, I365_INTCTL) & I365_PC_IOCARD) 34776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *value |= (status & I365_CS_STSCHG) ? 0 : SS_STSCHG; 34876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { 34976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *value |= (status & I365_CS_BVD1) ? 0 : SS_BATDEAD; 35076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *value |= (status & I365_CS_BVD2) ? 0 : SS_BATWARN; 35176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 35276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *value |= (status & I365_CS_WRPROT) ? SS_WRPROT : 0; 35376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *value |= (status & I365_CS_READY) ? SS_READY : 0; 35476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *value |= (status & I365_CS_POWERON) ? SS_POWERON : 0; 35576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 35676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifdef CONFIG_ISA 35776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (pccsock[sock].type == IS_VG469) { 35876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman status = i365_get(sock, VG469_VSENSE); 35976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (pccsock[sock].internalid & 1) { 36076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *value |= (status & VG469_VSENSE_B_VS1) ? 0 : SS_3VCARD; 36176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *value |= (status & VG469_VSENSE_B_VS2) ? 0 : SS_XVCARD; 36276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else { 36376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *value |= (status & VG469_VSENSE_A_VS1) ? 0 : SS_3VCARD; 36476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *value |= (status & VG469_VSENSE_A_VS2) ? 0 : SS_XVCARD; 36576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 36676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 36776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 36876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 36976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf("i82365: GetStatus(%d) = %#4.4x\n", sock, *value); 37076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; 37176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} //i365_get_status 37276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 37376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 37476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*static int i365_set_socket(u_short sock, socket_state_t *state) 37576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 37676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman socket_info_t *t = &socket[sock]; 37776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u_char reg; 37876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 37976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf("i82365: SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, " 38076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "io_irq %d, csc_mask %#2.2x)\n", sock, state->flags, 38176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman state->Vcc, state->Vpp, state->io_irq, state->csc_mask); 38276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanprintf ("\nERROR:UNIMPLEMENTED\n" ); 38376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanreturn 0; 38476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // First set global controller options 38576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // set_bridge_state(sock); *TODO* check: need this here? 38676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 38776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // IO card, RESET flag, IO interrupt 38876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman reg = t->intr; 38976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (state->io_irq != t->cap.pci_irq) reg |= state->io_irq; 39076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman reg |= (state->flags & SS_RESET) ? 0 : I365_PC_RESET; 39176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman reg |= (state->flags & SS_IOCARD) ? I365_PC_IOCARD : 0; 39276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sock, I365_INTCTL, reg); 39376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 39476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman reg = I365_PWR_NORESET; 39576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (state->flags & SS_PWR_AUTO) reg |= I365_PWR_AUTO; 39676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (state->flags & SS_OUTPUT_ENA) reg |= I365_PWR_OUT; 39776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 39876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (t->flags & IS_CIRRUS) { 39976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (state->Vpp != 0) { 40076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (state->Vpp == 120) 40176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman reg |= I365_VPP1_12V; 40276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else if (state->Vpp == state->Vcc) 40376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman reg |= I365_VPP1_5V; 40476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else return -EINVAL; 40576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 40676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (state->Vcc != 0) { 40776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman reg |= I365_VCC_5V; 40876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (state->Vcc == 33) 40976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_bset(sock, PD67_MISC_CTL_1, PD67_MC1_VCC_3V); 41076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else if (state->Vcc == 50) 41176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_bclr(sock, PD67_MISC_CTL_1, PD67_MC1_VCC_3V); 41276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else return -EINVAL; 41376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 41476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else if (t->flags & IS_VG_PWR) { 41576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (state->Vpp != 0) { 41676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (state->Vpp == 120) 41776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman reg |= I365_VPP1_12V; 41876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else if (state->Vpp == state->Vcc) 41976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman reg |= I365_VPP1_5V; 42076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else return -EINVAL; 42176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 42276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (state->Vcc != 0) { 42376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman reg |= I365_VCC_5V; 42476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (state->Vcc == 33) 42576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_bset(sock, VG469_VSELECT, VG469_VSEL_VCC); 42676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else if (state->Vcc == 50) 42776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_bclr(sock, VG469_VSELECT, VG469_VSEL_VCC); 42876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else return -EINVAL; 42976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 43076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else if (t->flags & IS_DF_PWR) { 43176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch (state->Vcc) { 43276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 0: break; 43376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 33: reg |= I365_VCC_3V; break; 43476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 50: reg |= I365_VCC_5V; break; 43576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman default: return -EINVAL; 43676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 43776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch (state->Vpp) { 43876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 0: break; 43976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 50: reg |= I365_VPP1_5V; break; 44076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 120: reg |= I365_VPP1_12V; break; 44176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman default: return -EINVAL; 44276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 44376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else { 44476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch (state->Vcc) { 44576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 0: break; 44676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 50: reg |= I365_VCC_5V; break; 44776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman default: return -EINVAL; 44876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 44976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch (state->Vpp) { 45076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 0: break; 45176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 50: reg |= I365_VPP1_5V | I365_VPP2_5V; break; 45276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 120: reg |= I365_VPP1_12V | I365_VPP2_12V; break; 45376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman default: return -EINVAL; 45476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 45576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 45676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 45776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (reg != i365_get(sock, I365_POWER)) 45876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sock, I365_POWER, reg); 45976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 46076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // Chipset-specific functions 46176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (t->flags & IS_CIRRUS) { 46276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // Speaker control 46376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_bflip(sock, PD67_MISC_CTL_1, PD67_MC1_SPKR_ENA, 46476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman state->flags & SS_SPKR_ENA); 46576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 46676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 46776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // Card status change interrupt mask 46876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman reg = t->cs_irq << 4; 46976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (state->csc_mask & SS_DETECT) reg |= I365_CSC_DETECT; 47076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (state->flags & SS_IOCARD) { 47176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (state->csc_mask & SS_STSCHG) reg |= I365_CSC_STSCHG; 47276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else { 47376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (state->csc_mask & SS_BATDEAD) reg |= I365_CSC_BVD1; 47476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (state->csc_mask & SS_BATWARN) reg |= I365_CSC_BVD2; 47576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (state->csc_mask & SS_READY) reg |= I365_CSC_READY; 47676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 47776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sock, I365_CSCINT, reg); 47876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_get(sock, I365_CSC); 47976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 48076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; 48176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} // i365_set_socket 48276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 48376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 48476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*static int i365_get_io_map(u_short sock, struct pccard_io_map *io) 48576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 48676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u_char map, ioctl, addr; 48776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf ( "GETIOMAP unimplemented\n" ); return 0; 48876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman map = io->map; 48976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (map > 1) return -EINVAL; 49076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman io->start = i365_get_pair(sock, I365_IO(map)+I365_W_START); 49176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman io->stop = i365_get_pair(sock, I365_IO(map)+I365_W_STOP); 49276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ioctl = i365_get(sock, I365_IOCTL); 49376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman addr = i365_get(sock, I365_ADDRWIN); 49476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman io->speed = to_ns(ioctl & I365_IOCTL_WAIT(map)) ? 1 : 0; 49576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman io->flags = (addr & I365_ENA_IO(map)) ? MAP_ACTIVE : 0; 49676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman io->flags |= (ioctl & I365_IOCTL_0WS(map)) ? MAP_0WS : 0; 49776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman io->flags |= (ioctl & I365_IOCTL_16BIT(map)) ? MAP_16BIT : 0; 49876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman io->flags |= (ioctl & I365_IOCTL_IOCS16(map)) ? MAP_AUTOSZ : 0; 49976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf("i82365: GetIOMap(%d, %d) = %#2.2x, %d ns, " 50076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "%#4.4x-%#4.4x\n", sock, map, io->flags, io->speed, 50176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman io->start, io->stop); 50276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; 50376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} // i365_get_io_map 50476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 50576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 50676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*====================================================================*/ 50776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 50876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*static int i365_set_io_map(u_short sock, struct pccard_io_map *io) 50976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 51076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u_char map, ioctl; 51176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 51276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf("i82365: SetIOMap(%d, %d, %#2.2x, %d ns, " 51376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "%#4.4x-%#4.4x)\n", sock, io->map, io->flags, 51476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman io->speed, io->start, io->stop); 51576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanprintf ( "UNIMPLEMENTED\n" ); 51676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; 51776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman map = io->map; 51876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman //if ((map > 1) || (io->start > 0xffff) || (io->stop > 0xffff) || 51976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ((map > 1) || 52076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman (io->stop < io->start)) return -EINVAL; 52176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // Turn off the window before changing anything 52276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (i365_get(sock, I365_ADDRWIN) & I365_ENA_IO(map)) 52376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_bclr(sock, I365_ADDRWIN, I365_ENA_IO(map)); 52476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set_pair(sock, I365_IO(map)+I365_W_START, io->start); 52576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set_pair(sock, I365_IO(map)+I365_W_STOP, io->stop); 52676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ioctl = i365_get(sock, I365_IOCTL) & ~I365_IOCTL_MASK(map); 52776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (io->speed) ioctl |= I365_IOCTL_WAIT(map); 52876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (io->flags & MAP_0WS) ioctl |= I365_IOCTL_0WS(map); 52976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (io->flags & MAP_16BIT) ioctl |= I365_IOCTL_16BIT(map); 53076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (io->flags & MAP_AUTOSZ) ioctl |= I365_IOCTL_IOCS16(map); 53176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sock, I365_IOCTL, ioctl); 53276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // Turn on the window if necessary 53376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (io->flags & MAP_ACTIVE) 53476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_bset(sock, I365_ADDRWIN, I365_ENA_IO(map)); 53576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; 53676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} // i365_set_io_map 53776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 53876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 53976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 54076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int i365_set_mem_map(u_short sock, struct pccard_mem_map *mem) 54176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 54276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u_short base, i; 54376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u_char map; 54476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 54576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf("i82365: SetMemMap(%d, %d, %#2.2x, %d ns, %#5.5lx-%#5.5" 54676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "lx, %#5.5x)\n", sock, mem->map, mem->flags, mem->speed, 54776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mem->sys_start, mem->sys_stop, mem->card_start); 54876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 54976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanprintf ( "UNIMPLEMENTED\n" ); 55076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; 55176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman map = mem->map; 55276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ((map > 4) || (mem->card_start > 0x3ffffff) || 55376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman (mem->sys_start > mem->sys_stop) || (mem->speed > 1000)) 55476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return -EINVAL; 55576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!(socket[sock].flags & IS_PCI) && 55676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ((mem->sys_start > 0xffffff) || (mem->sys_stop > 0xffffff))) 55776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return -EINVAL; 55876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 55976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // Turn off the window before changing anything 56076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (i365_get(sock, I365_ADDRWIN) & I365_ENA_MEM(map)) 56176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_bclr(sock, I365_ADDRWIN, I365_ENA_MEM(map)); 56276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 56376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman base = I365_MEM(map); 56476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i = (mem->sys_start >> 12) & 0x0fff; 56576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (mem->flags & MAP_16BIT) i |= I365_MEM_16BIT; 56676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (mem->flags & MAP_0WS) i |= I365_MEM_0WS; 56776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set_pair(sock, base+I365_W_START, i); 56876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 56976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i = (mem->sys_stop >> 12) & 0x0fff; 57076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch (to_cycles(mem->speed)) { 57176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 0: break; 57276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 1: i |= I365_MEM_WS0; break; 57376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 2: i |= I365_MEM_WS1; break; 57476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman default: i |= I365_MEM_WS1 | I365_MEM_WS0; break; 57576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 57676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set_pair(sock, base+I365_W_STOP, i); 57776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 57876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i = ((mem->card_start - mem->sys_start) >> 12) & 0x3fff; 57976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (mem->flags & MAP_WRPROT) i |= I365_MEM_WRPROT; 58076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (mem->flags & MAP_ATTRIB) i |= I365_MEM_REG; 58176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set_pair(sock, base+I365_W_OFF, i); 58276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 58376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // Turn on the window if necessary 58476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (mem->flags & MAP_ACTIVE) 58576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_bset(sock, I365_ADDRWIN, I365_ENA_MEM(map)); 58676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; 58776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} // i365_set_mem_map 58876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 58976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 59076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 59176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint i82365_interfacer ( interface_func_t func, int sockno, int par1, int par2, void* par3 ) { 59276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman //int i, j, k; 59376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman //u_int ui; 59476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u_char *upc; 59576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct pcc_config_t * pccc; 59676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch ( func ) { 59776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case INIT: 59876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mydriverid = par1; 59976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return init_i82365(); 60076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case SHUTDOWN: 60176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sockno, I365_ADDRWIN, i365_get(sockno, I365_ADDRWIN) & 0x20 ); 60276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sockno, I365_INTCTL, 0x05 ); 60376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sleepticks(2); 60476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sockno,I365_INTCTL, 0x45 ); //no-reset, memory-card 60576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 60676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case MAPATTRMEM: 60776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sockno,I365_POWER, 0xb1 ); 60876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sockno, I365_INTCTL, 0x05 ); 60976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sleepticks(2); 61076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sockno,I365_INTCTL, 0x45 ); //no-reset, memory-card 61176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sockno, I365_ADDRWIN, i365_get(sockno, I365_ADDRWIN) & 0x20 ); 61276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman //i365_bclr(sockno, I365_ADDRWIN, 1 ); 61376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sockno, I365_MEM(0)+0, ( par1 >> 12 )& 0xff ); //start 61476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sockno, I365_MEM(0)+1, ( par1 >> 20 ) & 0x0f ); 61576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sockno, I365_MEM(0)+2, ((par1 + par2 - 1 ) >> 12 ) & 0xff ); //end 61676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sockno, I365_MEM(0)+3, (( par1 + par2 - 1 ) >> 20 ) & 0x0f ); 61776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sockno, I365_MEM(0)+4, ((0x4000000 - par1) >> 12) & 0xff ); //offset low 61876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sockno, I365_MEM(0)+5, 0x40 | (((0x40000000 - par1) >> 12) & 0x3f)); 61976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_bset(sockno, I365_ADDRWIN, 1 ); 62076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( ! ( 1 & i365_get ( sockno, I365_ADDRWIN ) ) ) return 1; 62176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 62276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case UNMAPATTRMEM: 62376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sockno, I365_ADDRWIN, i365_get(sockno, I365_ADDRWIN) & 0x20 ); 62476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sockno,I365_INTCTL, 0x45 ); //no-reset, memory-card 62576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 62676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case SELECTCONFIG: // Params: par1: config number; par3 config pointer pointer 62776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( 0 > pccsock[sockno].configoffset ) return 1; 62876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( NULL == (pccc = par3 ) ) return 2; 62976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // write config number to 63076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman upc = ioremap ( MAP_ATTRMEM_TO, MAP_ATTRMEM_LEN ); 63176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( pccsock[sockno].configoffset > MAP_ATTRMEM_LEN ) return 3; 63276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( ( par1 & 0x7fffffc0 ) ) return 4; 63376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( pccc->index != par1 ) return 5; 63476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman upc[pccsock[sockno].configoffset] = ( upc[pccsock[sockno].configoffset] & 0xc0 ) | ( par1 & 0x3f ); 63576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sockno, I365_IOCTL, (i365_get(sockno, I365_IOCTL) & 0xfe) | 0x20 ); // 16bit autosize 63676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sockno, I365_IO(0)+0, pccc->iowin & 0xff); 63776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sockno, I365_IO(0)+1, (pccc->iowin >> 8) & 0xff); 63876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sockno, I365_IO(0)+2, (pccc->iowin+pccc->iolen - 1) & 0xff); 63976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sockno, I365_IO(0)+3, ((pccc->iowin+pccc->iolen- 1) >> 8) & 0xff); 64076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // Disable mem mapping 64176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_bclr(sockno, I365_ADDRWIN, 1); 64276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_set(sockno, I365_INTCTL, 0x65); 64376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i365_bset(sockno, I365_ADDRWIN,0x40); 64476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 64576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman default: 64676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return -1; // ERROR: Unknown function called 64776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 64876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; 64976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 65076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 65176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// get_mem_map[1320] 65276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// cirrus_get_state/set/opts... 65376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// vg46x_get_state/... 65476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// get_bridge_state/... 65576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 65676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* CONFIG_PCMCIA */ 657