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