Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    2)  * SMC 37C669 initialization code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    3)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    4) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    5) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    6) #include <linux/mm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    7) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    8) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    9) #include <linux/spinlock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   10) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   11) #include <asm/hwrpb.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   12) #include <asm/io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   13) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   14) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   15) # define DBG_DEVS(args)         printk args
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   16) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   17) # define DBG_DEVS(args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   18) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   19) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   20) #define KB              1024
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   21) #define MB              (1024*KB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   22) #define GB              (1024*MB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   24) #define SMC_DEBUG   0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   25) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   26) /* File:	smcc669_def.h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   27)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   28)  * Copyright (C) 1997 by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   29)  * Digital Equipment Corporation, Maynard, Massachusetts.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   30)  * All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   31)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   32)  * This software is furnished under a license and may be used and copied
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   33)  * only  in  accordance  of  the  terms  of  such  license  and with the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   34)  * inclusion of the above copyright notice. This software or  any  other
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   35)  * copies thereof may not be provided or otherwise made available to any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   36)  * other person.  No title to and  ownership of the  software is  hereby
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   37)  * transferred.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   38)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   39)  * The information in this software is  subject to change without notice
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   40)  * and  should  not  be  construed  as a commitment by Digital Equipment
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   41)  * Corporation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   42)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   43)  * Digital assumes no responsibility for the use  or  reliability of its
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   44)  * software on equipment which is not supplied by Digital.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   45)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   46)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   47)  * Abstract:	
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   48)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   49)  *	This file contains header definitions for the SMC37c669 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   50)  *	Super I/O controller. 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   51)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   52)  * Author:	
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   53)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   54)  *	Eric Rasmussen
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   55)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   56)  * Modification History:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   57)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   58)  *	er	28-Jan-1997	Initial Entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   59)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   60) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   61) #ifndef __SMC37c669_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   62) #define __SMC37c669_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   63) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   64) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   65) ** Macros for handling device IRQs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   66) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   67) ** The mask acts as a flag used in mapping actual ISA IRQs (0 - 15) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   68) ** to device IRQs (A - H).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   69) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   70) #define SMC37c669_DEVICE_IRQ_MASK	0x80000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   71) #define SMC37c669_DEVICE_IRQ( __i )	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   72) 	((SMC37c669_DEVICE_IRQ_MASK) | (__i))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   73) #define SMC37c669_IS_DEVICE_IRQ(__i)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   74) 	(((__i) & (SMC37c669_DEVICE_IRQ_MASK)) == (SMC37c669_DEVICE_IRQ_MASK))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   75) #define SMC37c669_RAW_DEVICE_IRQ(__i)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   76) 	((__i) & ~(SMC37c669_DEVICE_IRQ_MASK))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   77) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   78) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   79) ** Macros for handling device DRQs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   80) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   81) ** The mask acts as a flag used in mapping actual ISA DMA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   82) ** channels to device DMA channels (A - C).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   83) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   84) #define SMC37c669_DEVICE_DRQ_MASK	0x80000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   85) #define SMC37c669_DEVICE_DRQ(__d)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   86) 	((SMC37c669_DEVICE_DRQ_MASK) | (__d))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   87) #define SMC37c669_IS_DEVICE_DRQ(__d)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   88) 	(((__d) & (SMC37c669_DEVICE_DRQ_MASK)) == (SMC37c669_DEVICE_DRQ_MASK))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   89) #define SMC37c669_RAW_DEVICE_DRQ(__d)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   90) 	((__d) & ~(SMC37c669_DEVICE_DRQ_MASK))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   91) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   92) #define SMC37c669_DEVICE_ID	0x3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   93) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   94) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   95) ** SMC37c669 Device Function Definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   96) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   97) #define SERIAL_0	0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   98) #define SERIAL_1	1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   99) #define PARALLEL_0	2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  100) #define FLOPPY_0	3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  101) #define IDE_0		4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  102) #define NUM_FUNCS	5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  103) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  104) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  105) ** Default Device Function Mappings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  106) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  107) #define COM1_BASE	0x3F8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  108) #define COM1_IRQ	4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  109) #define COM2_BASE	0x2F8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  110) #define COM2_IRQ	3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  111) #define PARP_BASE	0x3BC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  112) #define PARP_IRQ	7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  113) #define PARP_DRQ	3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  114) #define FDC_BASE	0x3F0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  115) #define FDC_IRQ		6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  116) #define FDC_DRQ		2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  117) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  118) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  119) ** Configuration On/Off Key Definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  120) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  121) #define SMC37c669_CONFIG_ON_KEY		0x55
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  122) #define SMC37c669_CONFIG_OFF_KEY	0xAA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  123) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  124) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  125) ** SMC 37c669 Device IRQs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  126) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  127) #define SMC37c669_DEVICE_IRQ_A	    ( SMC37c669_DEVICE_IRQ( 0x01 ) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  128) #define SMC37c669_DEVICE_IRQ_B	    ( SMC37c669_DEVICE_IRQ( 0x02 ) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  129) #define SMC37c669_DEVICE_IRQ_C	    ( SMC37c669_DEVICE_IRQ( 0x03 ) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  130) #define SMC37c669_DEVICE_IRQ_D	    ( SMC37c669_DEVICE_IRQ( 0x04 ) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  131) #define SMC37c669_DEVICE_IRQ_E	    ( SMC37c669_DEVICE_IRQ( 0x05 ) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  132) #define SMC37c669_DEVICE_IRQ_F	    ( SMC37c669_DEVICE_IRQ( 0x06 ) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  133) /*      SMC37c669_DEVICE_IRQ_G	    *** RESERVED ***/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  134) #define SMC37c669_DEVICE_IRQ_H	    ( SMC37c669_DEVICE_IRQ( 0x08 ) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  135) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  136) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  137) ** SMC 37c669 Device DMA Channel Definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  138) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  139) #define SMC37c669_DEVICE_DRQ_A		    ( SMC37c669_DEVICE_DRQ( 0x01 ) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  140) #define SMC37c669_DEVICE_DRQ_B		    ( SMC37c669_DEVICE_DRQ( 0x02 ) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  141) #define SMC37c669_DEVICE_DRQ_C		    ( SMC37c669_DEVICE_DRQ( 0x03 ) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  142) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  143) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  144) ** Configuration Register Index Definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  145) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  146) #define SMC37c669_CR00_INDEX	    0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  147) #define SMC37c669_CR01_INDEX	    0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  148) #define SMC37c669_CR02_INDEX	    0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  149) #define SMC37c669_CR03_INDEX	    0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  150) #define SMC37c669_CR04_INDEX	    0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  151) #define SMC37c669_CR05_INDEX	    0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  152) #define SMC37c669_CR06_INDEX	    0x06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  153) #define SMC37c669_CR07_INDEX	    0x07
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  154) #define SMC37c669_CR08_INDEX	    0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  155) #define SMC37c669_CR09_INDEX	    0x09
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  156) #define SMC37c669_CR0A_INDEX	    0x0A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  157) #define SMC37c669_CR0B_INDEX	    0x0B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  158) #define SMC37c669_CR0C_INDEX	    0x0C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  159) #define SMC37c669_CR0D_INDEX	    0x0D
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  160) #define SMC37c669_CR0E_INDEX	    0x0E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  161) #define SMC37c669_CR0F_INDEX	    0x0F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  162) #define SMC37c669_CR10_INDEX	    0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  163) #define SMC37c669_CR11_INDEX	    0x11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  164) #define SMC37c669_CR12_INDEX	    0x12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  165) #define SMC37c669_CR13_INDEX	    0x13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  166) #define SMC37c669_CR14_INDEX	    0x14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  167) #define SMC37c669_CR15_INDEX	    0x15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  168) #define SMC37c669_CR16_INDEX	    0x16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  169) #define SMC37c669_CR17_INDEX	    0x17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  170) #define SMC37c669_CR18_INDEX	    0x18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  171) #define SMC37c669_CR19_INDEX	    0x19
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  172) #define SMC37c669_CR1A_INDEX	    0x1A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  173) #define SMC37c669_CR1B_INDEX	    0x1B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  174) #define SMC37c669_CR1C_INDEX	    0x1C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  175) #define SMC37c669_CR1D_INDEX	    0x1D
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  176) #define SMC37c669_CR1E_INDEX	    0x1E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  177) #define SMC37c669_CR1F_INDEX	    0x1F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  178) #define SMC37c669_CR20_INDEX	    0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  179) #define SMC37c669_CR21_INDEX	    0x21
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  180) #define SMC37c669_CR22_INDEX	    0x22
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  181) #define SMC37c669_CR23_INDEX	    0x23
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  182) #define SMC37c669_CR24_INDEX	    0x24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  183) #define SMC37c669_CR25_INDEX	    0x25
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  184) #define SMC37c669_CR26_INDEX	    0x26
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  185) #define SMC37c669_CR27_INDEX	    0x27
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  186) #define SMC37c669_CR28_INDEX	    0x28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  187) #define SMC37c669_CR29_INDEX	    0x29
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  188) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  189) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  190) ** Configuration Register Alias Definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  191) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  192) #define SMC37c669_DEVICE_ID_INDEX		    SMC37c669_CR0D_INDEX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  193) #define SMC37c669_DEVICE_REVISION_INDEX		    SMC37c669_CR0E_INDEX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  194) #define SMC37c669_FDC_BASE_ADDRESS_INDEX	    SMC37c669_CR20_INDEX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  195) #define SMC37c669_IDE_BASE_ADDRESS_INDEX	    SMC37c669_CR21_INDEX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  196) #define SMC37c669_IDE_ALTERNATE_ADDRESS_INDEX	    SMC37c669_CR22_INDEX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  197) #define SMC37c669_PARALLEL0_BASE_ADDRESS_INDEX	    SMC37c669_CR23_INDEX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  198) #define SMC37c669_SERIAL0_BASE_ADDRESS_INDEX	    SMC37c669_CR24_INDEX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  199) #define SMC37c669_SERIAL1_BASE_ADDRESS_INDEX	    SMC37c669_CR25_INDEX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  200) #define SMC37c669_PARALLEL_FDC_DRQ_INDEX	    SMC37c669_CR26_INDEX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  201) #define SMC37c669_PARALLEL_FDC_IRQ_INDEX	    SMC37c669_CR27_INDEX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  202) #define SMC37c669_SERIAL_IRQ_INDEX		    SMC37c669_CR28_INDEX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  203) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  204) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  205) ** Configuration Register Definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  206) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  207) ** The INDEX (write only) and DATA (read/write) ports are effective 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  208) ** only when the chip is in the Configuration State.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  209) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  210) typedef struct _SMC37c669_CONFIG_REGS {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  211)     unsigned char index_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  212)     unsigned char data_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  213) } SMC37c669_CONFIG_REGS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  214) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  215) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  216) ** CR00 - default value 0x28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  217) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  218) **  IDE_EN (CR00<1:0>):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  219) **	0x - 30ua pull-ups on nIDEEN, nHDCS0, NHDCS1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  220) **	11 - IRQ_H available as IRQ output,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  221) **	     IRRX2, IRTX2 available as alternate IR pins
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  222) **	10 - nIDEEN, nHDCS0, nHDCS1 used to control IDE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  223) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  224) **  VALID (CR00<7>):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  225) **	A high level on this software controlled bit can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  226) **	be used to indicate that a valid configuration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  227) **	cycle has occurred.  The control software must
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  228) **	take care to set this bit at the appropriate times.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  229) **	Set to zero after power up.  This bit has no
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  230) **	effect on any other hardware in the chip.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  231) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  232) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  233) typedef union _SMC37c669_CR00 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  234)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  235)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  236)     	unsigned ide_en : 2;	    /* See note above		*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  237) 	unsigned reserved1 : 1;	    /* RAZ			*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  238) 	unsigned fdc_pwr : 1;	    /* 1 = supply power to FDC  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  239) 	unsigned reserved2 : 3;	    /* Read as 010b		*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  240) 	unsigned valid : 1;	    /* See note above		*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  241)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  242) } SMC37c669_CR00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  243) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  244) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  245) ** CR01 - default value 0x9C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  246) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  247) typedef union _SMC37c669_CR01 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  248)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  249)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  250)     	unsigned reserved1 : 2;	    /* RAZ			    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  251) 	unsigned ppt_pwr : 1;	    /* 1 = supply power to PPT	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  252) 	unsigned ppt_mode : 1;	    /* 1 = Printer mode, 0 = EPP    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  253) 	unsigned reserved2 : 1;	    /* Read as 1		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  254) 	unsigned reserved3 : 2;	    /* RAZ			    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  255) 	unsigned lock_crx: 1;	    /* Lock CR00 - CR18		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  256)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  257) } SMC37c669_CR01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  258) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  259) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  260) ** CR02 - default value 0x88
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  261) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  262) typedef union _SMC37c669_CR02 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  263)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  264)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  265)     	unsigned reserved1 : 3;	    /* RAZ			    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  266) 	unsigned uart1_pwr : 1;	    /* 1 = supply power to UART1    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  267) 	unsigned reserved2 : 3;	    /* RAZ			    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  268) 	unsigned uart2_pwr : 1;	    /* 1 = supply power to UART2    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  269)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  270) } SMC37c669_CR02;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  271) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  272) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  273) ** CR03 - default value 0x78
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  274) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  275) **  CR03<7>	CR03<2>	    Pin 94
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  276) **  -------	-------	    ------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  277) **     0	   X	    DRV2 (input)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  278) **     1	   0	    ADRX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  279) **     1	   1	    IRQ_B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  280) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  281) **  CR03<6>	CR03<5>	    Op Mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  282) **  -------	-------	    -------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  283) **     0	   0	    Model 30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  284) **     0	   1	    PS/2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  285) **     1	   0	    Reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  286) **     1	   1	    AT Mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  287) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  288) typedef union _SMC37c669_CR03 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  289)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  290)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  291)     	unsigned pwrgd_gamecs : 1;  /* 1 = PWRGD, 0 = GAMECS	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  292) 	unsigned fdc_mode2 : 1;	    /* 1 = Enhanced Mode 2	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  293) 	unsigned pin94_0 : 1;	    /* See note above		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  294) 	unsigned reserved1 : 1;	    /* RAZ			    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  295) 	unsigned drvden : 1;	    /* 1 = high, 0 - output	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  296) 	unsigned op_mode : 2;	    /* See note above		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  297) 	unsigned pin94_1 : 1;	    /* See note above		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  298)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  299) } SMC37c669_CR03;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  300) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  301) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  302) ** CR04 - default value 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  303) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  304) **  PP_EXT_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  305) **	If CR01<PP_MODE> = 0 and PP_EXT_MODE =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  306) **	    00 - Standard and Bidirectional
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  307) **	    01 - EPP mode and SPP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  308) **	    10 - ECP mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  309) **		 In this mode, 2 drives can be supported
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  310) **		 directly, 3 or 4 drives must use external
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  311) **		 4 drive support.  SPP can be selected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  312) **		 through the ECR register of ECP as mode 000.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  313) **	    11 - ECP mode and EPP mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  314) **		 In this mode, 2 drives can be supported
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  315) **		 directly, 3 or 4 drives must use external
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  316) **		 4 drive support.  SPP can be selected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  317) **		 through the ECR register of ECP as mode 000.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  318) **		 In this mode, EPP can be selected through
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  319) **		 the ECR register of ECP as mode 100.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  320) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  321) **  PP_FDC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  322) **	00 - Normal
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  323) **	01 - PPFD1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  324) **	10 - PPFD2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  325) **	11 - Reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  326) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  327) **  MIDI1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  328) **	Serial Clock Select: 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  329) **	    A low level on this bit disables MIDI support,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  330) **	    clock = divide by 13.  A high level on this 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  331) **	    bit enables MIDI support, clock = divide by 12.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  332) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  333) **	MIDI operates at 31.25 Kbps which can be derived 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  334) **	from 125 KHz (24 MHz / 12 = 2 MHz, 2 MHz / 16 = 125 KHz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  335) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  336) **  ALT_IO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  337) **	0 - Use pins IRRX, IRTX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  338) **	1 - Use pins IRRX2, IRTX2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  339) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  340) **	If this bit is set, the IR receive and transmit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  341) **	functions will not be available on pins 25 and 26
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  342) **	unless CR00<IDE_EN> = 11.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  343) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  344) typedef union _SMC37c669_CR04 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  345)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  346)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  347)     	unsigned ppt_ext_mode : 2;  /* See note above		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  348) 	unsigned ppt_fdc : 2;	    /* See note above		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  349) 	unsigned midi1 : 1;	    /* See note above		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  350) 	unsigned midi2 : 1;	    /* See note above		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  351) 	unsigned epp_type : 1;	    /* 0 = EPP 1.9, 1 = EPP 1.7	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  352) 	unsigned alt_io : 1;	    /* See note above		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  353)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  354) } SMC37c669_CR04;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  355) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  356) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  357) ** CR05 - default value 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  358) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  359) **  DEN_SEL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  360) **	00 - Densel output normal
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  361) **	01 - Reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  362) **	10 - Densel output 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  363) **	11 - Densel output 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  364) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  365) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  366) typedef union _SMC37c669_CR05 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  367)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  368)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  369)     	unsigned reserved1 : 2;	    /* RAZ					*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  370) 	unsigned fdc_dma_mode : 1;  /* 0 = burst, 1 = non-burst			*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  371) 	unsigned den_sel : 2;	    /* See note above				*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  372) 	unsigned swap_drv : 1;	    /* Swap the FDC motor selects		*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  373) 	unsigned extx4 : 1;	    /* 0 = 2 drive, 1 = external 4 drive decode	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  374) 	unsigned reserved2 : 1;	    /* RAZ					*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  375)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  376) } SMC37c669_CR05;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  377) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  378) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  379) ** CR06 - default value 0xFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  380) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  381) typedef union _SMC37c669_CR06 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  382)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  383)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  384)     	unsigned floppy_a : 2;	    /* Type of floppy drive A	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  385) 	unsigned floppy_b : 2;	    /* Type of floppy drive B	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  386) 	unsigned floppy_c : 2;	    /* Type of floppy drive C	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  387) 	unsigned floppy_d : 2;	    /* Type of floppy drive D	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  388)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  389) } SMC37c669_CR06;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  390) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  391) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  392) ** CR07 - default value 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  393) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  394) **  Auto Power Management CR07<7:4>:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  395) **	0 - Auto Powerdown disabled (default)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  396) **	1 - Auto Powerdown enabled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  397) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  398) **	This bit is reset to the default state by POR or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  399) **	a hardware reset.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  400) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  401) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  402) typedef union _SMC37c669_CR07 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  403)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  404)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  405)     	unsigned floppy_boot : 2;   /* 0 = A:, 1 = B:		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  406) 	unsigned reserved1 : 2;	    /* RAZ			    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  407) 	unsigned ppt_en : 1;	    /* See note above		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  408) 	unsigned uart1_en : 1;	    /* See note above		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  409) 	unsigned uart2_en : 1;	    /* See note above		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  410) 	unsigned fdc_en : 1;	    /* See note above		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  411)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  412) } SMC37c669_CR07;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  413) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  414) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  415) ** CR08 - default value 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  416) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  417) typedef union _SMC37c669_CR08 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  418)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  419)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  420)     	unsigned zero : 4;	    /* 0			    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  421) 	unsigned addrx7_4 : 4;	    /* ADR<7:3> for ADRx decode	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  422)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  423) } SMC37c669_CR08;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  424) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  425) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  426) ** CR09 - default value 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  427) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  428) **  ADRx_CONFIG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  429) **	00 - ADRx disabled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  430) **	01 - 1 byte decode A<3:0> = 0000b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  431) **	10 - 8 byte block decode A<3:0> = 0XXXb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  432) **	11 - 16 byte block decode A<3:0> = XXXXb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  433) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  434) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  435) typedef union _SMC37c669_CR09 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  436)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  437)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  438)     	unsigned adra8 : 3;	    /* ADR<10:8> for ADRx decode    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  439) 	unsigned reserved1 : 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  440) 	unsigned adrx_config : 2;   /* See note above		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  441)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  442) } SMC37c669_CR09;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  443) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  444) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  445) ** CR0A - default value 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  446) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  447) typedef union _SMC37c669_CR0A {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  448)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  449)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  450)     	unsigned ecp_fifo_threshold : 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  451) 	unsigned reserved1 : 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  452)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  453) } SMC37c669_CR0A;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  454) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  455) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  456) ** CR0B - default value 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  457) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  458) typedef union _SMC37c669_CR0B {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  459)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  460)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  461)     	unsigned fdd0_drtx : 2;	    /* FDD0 Data Rate Table	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  462) 	unsigned fdd1_drtx : 2;	    /* FDD1 Data Rate Table	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  463) 	unsigned fdd2_drtx : 2;	    /* FDD2 Data Rate Table	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  464) 	unsigned fdd3_drtx : 2;	    /* FDD3 Data Rate Table	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  465)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  466) } SMC37c669_CR0B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  467) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  468) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  469) ** CR0C - default value 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  470) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  471) **  UART2_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  472) **	000 - Standard (default)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  473) **	001 - IrDA (HPSIR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  474) **	010 - Amplitude Shift Keyed IR @500 KHz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  475) **	011 - Reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  476) **	1xx - Reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  477) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  478) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  479) typedef union _SMC37c669_CR0C {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  480)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  481)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  482)     	unsigned uart2_rcv_polarity : 1;    /* 1 = invert RX		*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  483) 	unsigned uart2_xmit_polarity : 1;   /* 1 = invert TX		*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  484) 	unsigned uart2_duplex : 1;	    /* 1 = full, 0 = half	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  485) 	unsigned uart2_mode : 3;	    /* See note above		*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  486) 	unsigned uart1_speed : 1;	    /* 1 = high speed enabled	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  487) 	unsigned uart2_speed : 1;	    /* 1 = high speed enabled	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  488)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  489) } SMC37c669_CR0C;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  490) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  491) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  492) ** CR0D - default value 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  493) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  494) **  Device ID Register - read only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  495) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  496) typedef union _SMC37c669_CR0D {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  497)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  498)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  499)     	unsigned device_id : 8;	    /* Returns 0x3 in this field    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  500)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  501) } SMC37c669_CR0D;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  502) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  503) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  504) ** CR0E - default value 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  505) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  506) **  Device Revision Register - read only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  507) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  508) typedef union _SMC37c669_CR0E {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  509)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  510)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  511)     	unsigned device_rev : 8;    /* Returns 0x2 in this field    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  512)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  513) } SMC37c669_CR0E;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  514) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  515) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  516) ** CR0F - default value 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  517) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  518) typedef union _SMC37c669_CR0F {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  519)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  520)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  521)     	unsigned test0 : 1;	    /* Reserved - set to 0	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  522) 	unsigned test1 : 1;	    /* Reserved - set to 0	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  523) 	unsigned test2 : 1;	    /* Reserved - set to 0	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  524) 	unsigned test3 : 1;	    /* Reserved - set t0 0	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  525) 	unsigned test4 : 1;	    /* Reserved - set to 0	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  526) 	unsigned test5 : 1;	    /* Reserved - set t0 0	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  527) 	unsigned test6 : 1;	    /* Reserved - set t0 0	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  528) 	unsigned test7 : 1;	    /* Reserved - set to 0	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  529)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  530) } SMC37c669_CR0F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  531) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  532) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  533) ** CR10 - default value 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  534) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  535) typedef union _SMC37c669_CR10 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  536)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  537)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  538)     	unsigned reserved1 : 3;	     /* RAZ			    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  539) 	unsigned pll_gain : 1;	     /* 1 = 3V, 2 = 5V operation    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  540) 	unsigned pll_stop : 1;	     /* 1 = stop PLLs		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  541) 	unsigned ace_stop : 1;	     /* 1 = stop UART clocks	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  542) 	unsigned pll_clock_ctrl : 1; /* 0 = 14.318 MHz, 1 = 24 MHz  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  543) 	unsigned ir_test : 1;	     /* Enable IR test mode	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  544)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  545) } SMC37c669_CR10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  546) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  547) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  548) ** CR11 - default value 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  549) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  550) typedef union _SMC37c669_CR11 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  551)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  552)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  553)     	unsigned ir_loopback : 1;   /* Internal IR loop back		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  554) 	unsigned test_10ms : 1;	    /* Test 10ms autopowerdown FDC timeout  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  555) 	unsigned reserved1 : 6;	    /* RAZ				    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  556)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  557) } SMC37c669_CR11;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  558) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  559) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  560) ** CR12 - CR1D are reserved registers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  561) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  562) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  563) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  564) ** CR1E - default value 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  565) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  566) **  GAMECS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  567) **	00 - GAMECS disabled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  568) **	01 - 1 byte decode ADR<3:0> = 0001b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  569) **	10 - 8 byte block decode ADR<3:0> = 0XXXb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  570) **	11 - 16 byte block decode ADR<3:0> = XXXXb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  571) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  572) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  573) typedef union _SMC37c66_CR1E {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  574)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  575)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  576)     	unsigned gamecs_config: 2;   /* See note above		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  577) 	unsigned gamecs_addr9_4 : 6; /* GAMECS Addr<9:4>	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  578)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  579) } SMC37c669_CR1E;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  580) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  581) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  582) ** CR1F - default value 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  583) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  584) **  DT0 DT1 DRVDEN0 DRVDEN1 Drive Type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  585) **  --- --- ------- ------- ----------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  586) **   0   0  DENSEL  DRATE0  4/2/1 MB 3.5"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  587) **                          2/1 MB 5.25"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  588) **                          2/1.6/1 MB 3.5" (3-mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  589) **   0   1  DRATE1  DRATE0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  590) **   1   0  nDENSEL DRATE0  PS/2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  591) **   1   1  DRATE0  DRATE1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  592) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  593) **  Note: DENSEL, DRATE1, and DRATE0 map onto two output
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  594) **	  pins - DRVDEN0 and DRVDEN1.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  595) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  596) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  597) typedef union _SMC37c669_CR1F {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  598)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  599)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  600)     	unsigned fdd0_drive_type : 2;	/* FDD0 drive type	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  601) 	unsigned fdd1_drive_type : 2;	/* FDD1 drive type	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  602) 	unsigned fdd2_drive_type : 2;	/* FDD2 drive type	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  603) 	unsigned fdd3_drive_type : 2;	/* FDD3 drive type	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  604)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  605) } SMC37c669_CR1F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  606) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  607) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  608) ** CR20 - default value 0x3C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  609) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  610) **  FDC Base Address Register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  611) **	- To disable this decode set Addr<9:8> = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  612) **	- A<10> = 0, A<3:0> = 0XXXb to access.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  613) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  614) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  615) typedef union _SMC37c669_CR20 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  616)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  617)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  618)     	unsigned zero : 2;	    /* 0			    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  619) 	unsigned addr9_4 : 6;	    /* FDC Addr<9:4>		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  620)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  621) } SMC37c669_CR20;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  622) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  623) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  624) ** CR21 - default value 0x3C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  625) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  626) **  IDE Base Address Register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  627) **	- To disable this decode set Addr<9:8> = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  628) **	- A<10> = 0, A<3:0> = 0XXXb to access.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  629) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  630) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  631) typedef union _SMC37c669_CR21 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  632)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  633)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  634)     	unsigned zero : 2;	    /* 0			    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  635) 	unsigned addr9_4 : 6;	    /* IDE Addr<9:4>		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  636)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  637) } SMC37c669_CR21;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  638) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  639) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  640) ** CR22 - default value 0x3D
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  641) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  642) **  IDE Alternate Status Base Address Register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  643) **	- To disable this decode set Addr<9:8> = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  644) **	- A<10> = 0, A<3:0> = 0110b to access.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  645) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  646) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  647) typedef union _SMC37c669_CR22 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  648)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  649)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  650)     	unsigned zero : 2;	    /* 0			    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  651) 	unsigned addr9_4 : 6;	    /* IDE Alt Status Addr<9:4>	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  652)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  653) } SMC37c669_CR22;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  654) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  655) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  656) ** CR23 - default value 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  657) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  658) **  Parallel Port Base Address Register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  659) **	- To disable this decode set Addr<9:8> = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  660) **	- A<10> = 0 to access.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  661) **	- If EPP is enabled, A<2:0> = XXXb to access.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  662) **	  If EPP is NOT enabled, A<1:0> = XXb to access
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  663) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  664) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  665) typedef union _SMC37c669_CR23 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  666)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  667)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  668) 	unsigned addr9_2 : 8;	    /* Parallel Port Addr<9:2>	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  669)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  670) } SMC37c669_CR23;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  671) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  672) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  673) ** CR24 - default value 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  674) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  675) **  UART1 Base Address Register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  676) **	- To disable this decode set Addr<9:8> = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  677) **	- A<10> = 0, A<2:0> = XXXb to access.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  678) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  679) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  680) typedef union _SMC37c669_CR24 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  681)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  682)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  683)     	unsigned zero : 1;	    /* 0			    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  684) 	unsigned addr9_3 : 7;	    /* UART1 Addr<9:3>		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  685)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  686) } SMC37c669_CR24;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  687) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  688) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  689) ** CR25 - default value 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  690) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  691) **  UART2 Base Address Register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  692) **	- To disable this decode set Addr<9:8> = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  693) **	- A<10> = 0, A<2:0> = XXXb to access.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  694) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  695) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  696) typedef union _SMC37c669_CR25 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  697)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  698)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  699)     	unsigned zero : 1;	    /* 0			    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  700) 	unsigned addr9_3 : 7;	    /* UART2 Addr<9:3>		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  701)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  702) } SMC37c669_CR25;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  703) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  704) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  705) ** CR26 - default value 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  706) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  707) **  Parallel Port / FDC DMA Select Register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  708) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  709) **  D3 - D0	  DMA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  710) **  D7 - D4	Selected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  711) **  -------	--------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  712) **   0000	 None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  713) **   0001	 DMA_A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  714) **   0010	 DMA_B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  715) **   0011	 DMA_C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  716) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  717) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  718) typedef union _SMC37c669_CR26 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  719)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  720)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  721)     	unsigned ppt_drq : 4;	    /* See note above		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  722) 	unsigned fdc_drq : 4;	    /* See note above		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  723)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  724) } SMC37c669_CR26;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  725) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  726) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  727) ** CR27 - default value 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  728) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  729) **  Parallel Port / FDC IRQ Select Register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  730) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  731) **  D3 - D0	  IRQ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  732) **  D7 - D4	Selected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  733) **  -------	--------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  734) **   0000	 None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  735) **   0001	 IRQ_A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  736) **   0010	 IRQ_B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  737) **   0011	 IRQ_C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  738) **   0100	 IRQ_D
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  739) **   0101	 IRQ_E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  740) **   0110	 IRQ_F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  741) **   0111	 Reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  742) **   1000	 IRQ_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  743) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  744) **  Any unselected IRQ REQ is in tristate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  745) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  746) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  747) typedef union _SMC37c669_CR27 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  748)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  749)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  750)     	unsigned ppt_irq : 4;	    /* See note above		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  751) 	unsigned fdc_irq : 4;	    /* See note above		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  752)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  753) } SMC37c669_CR27;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  754) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  755) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  756) ** CR28 - default value 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  757) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  758) **  UART IRQ Select Register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  759) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  760) **  D3 - D0	  IRQ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  761) **  D7 - D4	Selected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  762) **  -------	--------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  763) **   0000	 None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  764) **   0001	 IRQ_A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  765) **   0010	 IRQ_B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  766) **   0011	 IRQ_C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  767) **   0100	 IRQ_D
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  768) **   0101	 IRQ_E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  769) **   0110	 IRQ_F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  770) **   0111	 Reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  771) **   1000	 IRQ_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  772) **   1111	 share with UART1 (only for UART2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  773) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  774) **  Any unselected IRQ REQ is in tristate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  775) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  776) **  To share an IRQ between UART1 and UART2, set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  777) **  UART1 to use the desired IRQ and set UART2 to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  778) **  0xF to enable sharing mechanism.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  779) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  780) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  781) typedef union _SMC37c669_CR28 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  782)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  783)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  784)     	unsigned uart2_irq : 4;	    /* See note above		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  785) 	unsigned uart1_irq : 4;	    /* See note above		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  786)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  787) } SMC37c669_CR28;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  788) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  789) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  790) ** CR29 - default value 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  791) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  792) **  IRQIN IRQ Select Register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  793) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  794) **  D3 - D0	  IRQ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  795) **  D7 - D4	Selected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  796) **  -------	--------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  797) **   0000	 None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  798) **   0001	 IRQ_A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  799) **   0010	 IRQ_B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  800) **   0011	 IRQ_C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  801) **   0100	 IRQ_D
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  802) **   0101	 IRQ_E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  803) **   0110	 IRQ_F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  804) **   0111	 Reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  805) **   1000	 IRQ_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  806) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  807) **  Any unselected IRQ REQ is in tristate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  808) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  809) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  810) typedef union _SMC37c669_CR29 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  811)     unsigned char as_uchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  812)     struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  813)     	unsigned irqin_irq : 4;	    /* See note above		    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  814) 	unsigned reserved1 : 4;	    /* RAZ			    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  815)     }	by_field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  816) } SMC37c669_CR29;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  817) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  818) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  819) ** Aliases of Configuration Register formats (should match
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  820) ** the set of index aliases).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  821) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  822) ** Note that CR24 and CR25 have the same format and are the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  823) ** base address registers for UART1 and UART2.  Because of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  824) ** this we only define 1 alias here - for CR24 - as the serial
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  825) ** base address register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  826) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  827) ** Note that CR21 and CR22 have the same format and are the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  828) ** base address and alternate status address registers for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  829) ** the IDE controller.  Because of this we only define 1 alias
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  830) ** here - for CR21 - as the IDE address register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  831) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  832) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  833) typedef SMC37c669_CR0D SMC37c669_DEVICE_ID_REGISTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  834) typedef SMC37c669_CR0E SMC37c669_DEVICE_REVISION_REGISTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  835) typedef SMC37c669_CR20 SMC37c669_FDC_BASE_ADDRESS_REGISTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  836) typedef SMC37c669_CR21 SMC37c669_IDE_ADDRESS_REGISTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  837) typedef SMC37c669_CR23 SMC37c669_PARALLEL_BASE_ADDRESS_REGISTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  838) typedef SMC37c669_CR24 SMC37c669_SERIAL_BASE_ADDRESS_REGISTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  839) typedef SMC37c669_CR26 SMC37c669_PARALLEL_FDC_DRQ_REGISTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  840) typedef SMC37c669_CR27 SMC37c669_PARALLEL_FDC_IRQ_REGISTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  841) typedef SMC37c669_CR28 SMC37c669_SERIAL_IRQ_REGISTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  842) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  843) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  844) ** ISA/Device IRQ Translation Table Entry Definition
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  845) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  846) typedef struct _SMC37c669_IRQ_TRANSLATION_ENTRY {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  847)     int device_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  848)     int isa_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  849) } SMC37c669_IRQ_TRANSLATION_ENTRY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  850) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  851) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  852) ** ISA/Device DMA Translation Table Entry Definition
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  853) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  854) typedef struct _SMC37c669_DRQ_TRANSLATION_ENTRY {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  855)     int device_drq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  856)     int isa_drq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  857) } SMC37c669_DRQ_TRANSLATION_ENTRY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  858) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  859) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  860) ** External Interface Function Prototype Declarations
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  861) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  862) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  863) SMC37c669_CONFIG_REGS *SMC37c669_detect( 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  864)     int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  865) );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  866) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  867) unsigned int SMC37c669_enable_device( 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  868)     unsigned int func 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  869) );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  870) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  871) unsigned int SMC37c669_disable_device( 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  872)     unsigned int func 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  873) );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  874) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  875) unsigned int SMC37c669_configure_device( 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  876)     unsigned int func, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  877)     int port, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  878)     int irq, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  879)     int drq 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  880) );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  881) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  882) void SMC37c669_display_device_info( 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  883)     void 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  884) );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  885) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  886) #endif	/* __SMC37c669_H */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  887) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  888) /* file:	smcc669.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  889)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  890)  * Copyright (C) 1997 by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  891)  * Digital Equipment Corporation, Maynard, Massachusetts.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  892)  * All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  893)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  894)  * This software is furnished under a license and may be used and copied
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  895)  * only  in  accordance  of  the  terms  of  such  license  and with the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  896)  * inclusion of the above copyright notice. This software or  any  other
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  897)  * copies thereof may not be provided or otherwise made available to any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  898)  * other person.  No title to and  ownership of the  software is  hereby
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  899)  * transferred.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  900)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  901)  * The information in this software is  subject to change without notice
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  902)  * and  should  not  be  construed  as a commitment by digital equipment
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  903)  * corporation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  904)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  905)  * Digital assumes no responsibility for the use  or  reliability of its
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  906)  * software on equipment which is not supplied by digital.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  907)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  908) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  909) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  910)  *++
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  911)  *  FACILITY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  912)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  913)  *      Alpha SRM Console Firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  914)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  915)  *  MODULE DESCRIPTION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  916)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  917)  *	SMC37c669 Super I/O controller configuration routines.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  918)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  919)  *  AUTHORS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  920)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  921)  *	Eric Rasmussen
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  922)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  923)  *  CREATION DATE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  924)  *  
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  925)  *	28-Jan-1997
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  926)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  927)  *  MODIFICATION HISTORY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  928)  *	
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  929)  *	er	01-May-1997	Fixed pointer conversion errors in 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  930)  *				SMC37c669_get_device_config().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  931)  *      er	28-Jan-1997	Initial version.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  932)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  933)  *--
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  934)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  935) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  936) #ifndef TRUE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  937) #define TRUE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  938) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  939) #ifndef FALSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  940) #define FALSE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  941) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  942) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  943) #define wb( _x_, _y_ )	outb( _y_, (unsigned int)((unsigned long)_x_) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  944) #define rb( _x_ )	inb( (unsigned int)((unsigned long)_x_) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  945) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  946) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  947) ** Local storage for device configuration information.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  948) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  949) ** Since the SMC37c669 does not provide an explicit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  950) ** mechanism for enabling/disabling individual device 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  951) ** functions, other than unmapping the device, local 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  952) ** storage for device configuration information is 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  953) ** allocated here for use in implementing our own 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  954) ** function enable/disable scheme.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  955) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  956) static struct DEVICE_CONFIG {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  957)     unsigned int port1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  958)     unsigned int port2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  959)     int irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  960)     int drq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  961) } local_config [NUM_FUNCS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  962) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  963) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  964) ** List of all possible addresses for the Super I/O chip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  965) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  966) static unsigned long SMC37c669_Addresses[] __initdata =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  967)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  968) 	0x3F0UL,	    /* Primary address	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  969) 	0x370UL,	    /* Secondary address    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  970) 	0UL		    /* End of list	    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  971)     };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  972) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  973) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  974) ** Global Pointer to the Super I/O device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  975) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  976) static SMC37c669_CONFIG_REGS *SMC37c669 __initdata = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  977) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  978) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  979) ** IRQ Translation Table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  980) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  981) ** The IRQ translation table is a list of SMC37c669 device 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  982) ** and standard ISA IRQs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  983) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  984) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  985) static SMC37c669_IRQ_TRANSLATION_ENTRY *SMC37c669_irq_table __initdata; 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  986) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  987) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  988) ** The following definition is for the default IRQ 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  989) ** translation table.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  990) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  991) static SMC37c669_IRQ_TRANSLATION_ENTRY SMC37c669_default_irq_table[]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  992) __initdata = 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  993)     { 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  994) 	{ SMC37c669_DEVICE_IRQ_A, -1 }, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  995) 	{ SMC37c669_DEVICE_IRQ_B, -1 }, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  996) 	{ SMC37c669_DEVICE_IRQ_C, 7 }, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  997) 	{ SMC37c669_DEVICE_IRQ_D, 6 }, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  998) 	{ SMC37c669_DEVICE_IRQ_E, 4 }, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  999) 	{ SMC37c669_DEVICE_IRQ_F, 3 }, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) 	{ SMC37c669_DEVICE_IRQ_H, -1 }, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) 	{ -1, -1 } /* End of table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002)     };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) ** The following definition is for the MONET (XP1000) IRQ 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) ** translation table.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) static SMC37c669_IRQ_TRANSLATION_ENTRY SMC37c669_monet_irq_table[]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) __initdata = 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010)     { 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) 	{ SMC37c669_DEVICE_IRQ_A, -1 }, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) 	{ SMC37c669_DEVICE_IRQ_B, -1 }, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) 	{ SMC37c669_DEVICE_IRQ_C, 6 }, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) 	{ SMC37c669_DEVICE_IRQ_D, 7 }, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) 	{ SMC37c669_DEVICE_IRQ_E, 4 }, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) 	{ SMC37c669_DEVICE_IRQ_F, 3 }, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) 	{ SMC37c669_DEVICE_IRQ_H, -1 }, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) 	{ -1, -1 } /* End of table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019)     };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) static SMC37c669_IRQ_TRANSLATION_ENTRY *SMC37c669_irq_tables[] __initdata =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) 	SMC37c669_default_irq_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) 	SMC37c669_monet_irq_table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025)     }; 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) ** DRQ Translation Table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) ** The DRQ translation table is a list of SMC37c669 device and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) ** ISA DMA channels.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) static SMC37c669_DRQ_TRANSLATION_ENTRY *SMC37c669_drq_table __initdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) ** The following definition is the default DRQ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) ** translation table.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) static SMC37c669_DRQ_TRANSLATION_ENTRY SMC37c669_default_drq_table[]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) __initdata = 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042)     { 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) 	{ SMC37c669_DEVICE_DRQ_A, 2 }, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) 	{ SMC37c669_DEVICE_DRQ_B, 3 }, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) 	{ SMC37c669_DEVICE_DRQ_C, -1 }, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) 	{ -1, -1 } /* End of table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047)     };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) ** Local Function Prototype Declarations
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) static unsigned int SMC37c669_is_device_enabled( 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054)     unsigned int func 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) static unsigned int SMC37c669_get_device_config( 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059)     unsigned int func, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060)     int *port, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061)     int *irq, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062)     int *drq 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) static void SMC37c669_config_mode( 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067)     unsigned int enable 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) static unsigned char SMC37c669_read_config( 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071)     unsigned char index 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) static void SMC37c669_write_config( 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075)     unsigned char index, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076)     unsigned char data 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) static void SMC37c669_init_local_config( void );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) static struct DEVICE_CONFIG *SMC37c669_get_config(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082)     unsigned int func
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) static int SMC37c669_xlate_irq(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086)     int irq 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) static int SMC37c669_xlate_drq(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090)     int drq 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) static  __cacheline_aligned DEFINE_SPINLOCK(smc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) **++
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) **  FUNCTIONAL DESCRIPTION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) **      This function detects the presence of an SMC37c669 Super I/O
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) **	controller.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) **  FORMAL PARAMETERS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) **	None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) **  RETURN VALUE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) **      Returns a pointer to the device if found, otherwise,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) **	the NULL pointer is returned.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) **  SIDE EFFECTS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) **      None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) **--
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) SMC37c669_CONFIG_REGS * __init SMC37c669_detect( int index )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119)     int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120)     SMC37c669_DEVICE_ID_REGISTER id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122)     for ( i = 0;  SMC37c669_Addresses[i] != 0;  i++ ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) ** Initialize the device pointer even though we don't yet know if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) ** the controller is at this address.  The support functions access
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) ** the controller through this device pointer so we need to set it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) ** even when we are looking ...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129)     	SMC37c669 = ( SMC37c669_CONFIG_REGS * )SMC37c669_Addresses[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) ** Enter configuration mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) 	SMC37c669_config_mode( TRUE );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) ** Read the device id
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) 	id.as_uchar = SMC37c669_read_config( SMC37c669_DEVICE_ID_INDEX );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) ** Exit configuration mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) 	SMC37c669_config_mode( FALSE );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) ** Does the device id match?  If so, assume we have found an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) ** SMC37c669 controller at this address.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) 	if ( id.by_field.device_id == SMC37c669_DEVICE_ID ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) ** Initialize the IRQ and DRQ translation tables.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150)     	    SMC37c669_irq_table = SMC37c669_irq_tables[ index ];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) 	    SMC37c669_drq_table = SMC37c669_default_drq_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) ** erfix
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) ** If the platform can't use the IRQ and DRQ defaults set up in this 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) ** file, it should call a platform-specific external routine at this 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) ** point to reset the IRQ and DRQ translation table pointers to point 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) ** at the appropriate tables for the platform.  If the defaults are 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) ** acceptable, then the external routine should do nothing.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) ** Put the chip back into configuration mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) 	    SMC37c669_config_mode( TRUE );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) ** Initialize local storage for configuration information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) 	    SMC37c669_init_local_config( );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) ** Exit configuration mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) 	    SMC37c669_config_mode( FALSE );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) ** SMC37c669 controller found, break out of search loop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) 	    break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) 	else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) ** Otherwise, we did not find an SMC37c669 controller at this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) ** address so set the device pointer to NULL.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) 	    SMC37c669 = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187)     return SMC37c669;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) **++
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) **  FUNCTIONAL DESCRIPTION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) **      This function enables an SMC37c669 device function.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) **  FORMAL PARAMETERS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) **      func:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) **          Which device function to enable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) **  RETURN VALUE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) **      Returns TRUE is the device function was enabled, otherwise, FALSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) **  SIDE EFFECTS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) **      {@description or none@}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) **  DESIGN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) **      Enabling a device function in the SMC37c669 controller involves
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) **	setting all of its mappings (port, irq, drq ...).  A local 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) **	"shadow" copy of the device configuration is kept so we can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) **	just set each mapping to what the local copy says.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) **	This function ALWAYS updates the local shadow configuration of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) **	the device function being enabled, even if the device is always
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) **	enabled.  To avoid replication of code, functions such as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) **	configure_device set up the local copy and then call this 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) **	function to the update the real device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) **--
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) unsigned int __init SMC37c669_enable_device ( unsigned int func )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227)     unsigned int ret_val = FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) ** Put the device into configuration mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231)     SMC37c669_config_mode( TRUE );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232)     switch ( func ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233)     	case SERIAL_0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) 	    {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) 	    	SMC37c669_SERIAL_BASE_ADDRESS_REGISTER base_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) 		SMC37c669_SERIAL_IRQ_REGISTER irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) ** Enable the serial 1 IRQ mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) 	    	irq.as_uchar = 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) 		    SMC37c669_read_config( SMC37c669_SERIAL_IRQ_INDEX );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) 		irq.by_field.uart1_irq =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) 		    SMC37c669_RAW_DEVICE_IRQ(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) 			SMC37c669_xlate_irq( local_config[ func ].irq )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) 		    );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) 		SMC37c669_write_config( SMC37c669_SERIAL_IRQ_INDEX, irq.as_uchar );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) ** Enable the serial 1 port base address mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) 		base_addr.as_uchar = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) 		base_addr.by_field.addr9_3 = local_config[ func ].port1 >> 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) 		SMC37c669_write_config( 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) 		    SMC37c669_SERIAL0_BASE_ADDRESS_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) 		    base_addr.as_uchar
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) 		);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) 		ret_val = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) 	    }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) 	case SERIAL_1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) 	    {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) 	    	SMC37c669_SERIAL_BASE_ADDRESS_REGISTER base_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) 		SMC37c669_SERIAL_IRQ_REGISTER irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) ** Enable the serial 2 IRQ mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) 	    	irq.as_uchar = 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) 		    SMC37c669_read_config( SMC37c669_SERIAL_IRQ_INDEX );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) 		irq.by_field.uart2_irq =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) 		    SMC37c669_RAW_DEVICE_IRQ(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) 			SMC37c669_xlate_irq( local_config[ func ].irq )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) 		    );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) 		SMC37c669_write_config( SMC37c669_SERIAL_IRQ_INDEX, irq.as_uchar );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) ** Enable the serial 2 port base address mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) 		base_addr.as_uchar = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) 		base_addr.by_field.addr9_3 = local_config[ func ].port1 >> 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) 		SMC37c669_write_config( 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) 		    SMC37c669_SERIAL1_BASE_ADDRESS_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) 		    base_addr.as_uchar
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) 		);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) 		ret_val = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) 	    }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) 	case PARALLEL_0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) 	    {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) 	    	SMC37c669_PARALLEL_BASE_ADDRESS_REGISTER base_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) 		SMC37c669_PARALLEL_FDC_IRQ_REGISTER irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) 		SMC37c669_PARALLEL_FDC_DRQ_REGISTER drq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) ** Enable the parallel port DMA channel mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) 	    	drq.as_uchar =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) 		    SMC37c669_read_config( SMC37c669_PARALLEL_FDC_DRQ_INDEX );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) 		drq.by_field.ppt_drq = 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) 		    SMC37c669_RAW_DEVICE_DRQ(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) 			SMC37c669_xlate_drq( local_config[ func ].drq )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) 		    );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) 		SMC37c669_write_config(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) 		    SMC37c669_PARALLEL_FDC_DRQ_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) 		    drq.as_uchar
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) 		);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) ** Enable the parallel port IRQ mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) 		irq.as_uchar = 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) 		    SMC37c669_read_config( SMC37c669_PARALLEL_FDC_IRQ_INDEX );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) 		irq.by_field.ppt_irq =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) 		    SMC37c669_RAW_DEVICE_IRQ(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) 			SMC37c669_xlate_irq( local_config[ func ].irq )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) 		    );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) 		SMC37c669_write_config( 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) 		    SMC37c669_PARALLEL_FDC_IRQ_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) 		    irq.as_uchar
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) 		);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) ** Enable the parallel port base address mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) 		base_addr.as_uchar = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) 		base_addr.by_field.addr9_2 = local_config[ func ].port1 >> 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) 		SMC37c669_write_config(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) 		    SMC37c669_PARALLEL0_BASE_ADDRESS_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) 		    base_addr.as_uchar
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) 		);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) 		ret_val = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) 	    }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) 	case FLOPPY_0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) 	    {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) 	    	SMC37c669_FDC_BASE_ADDRESS_REGISTER base_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) 		SMC37c669_PARALLEL_FDC_IRQ_REGISTER irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) 		SMC37c669_PARALLEL_FDC_DRQ_REGISTER drq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) ** Enable the floppy controller DMA channel mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) 	    	drq.as_uchar =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) 		    SMC37c669_read_config( SMC37c669_PARALLEL_FDC_DRQ_INDEX );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) 		 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) 		drq.by_field.fdc_drq =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) 		    SMC37c669_RAW_DEVICE_DRQ(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) 			SMC37c669_xlate_drq( local_config[ func ].drq )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) 		    );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) 		 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) 		SMC37c669_write_config( 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) 		    SMC37c669_PARALLEL_FDC_DRQ_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) 		    drq.as_uchar
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) 		);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) ** Enable the floppy controller IRQ mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) 		irq.as_uchar =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) 		    SMC37c669_read_config( SMC37c669_PARALLEL_FDC_IRQ_INDEX );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) 		 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) 		irq.by_field.fdc_irq =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) 		    SMC37c669_RAW_DEVICE_IRQ(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) 			SMC37c669_xlate_irq( local_config[ func ].irq )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) 		    );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) 		 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) 		SMC37c669_write_config(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) 		    SMC37c669_PARALLEL_FDC_IRQ_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) 		    irq.as_uchar
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) 		);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) ** Enable the floppy controller base address mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) 		base_addr.as_uchar = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) 		base_addr.by_field.addr9_4 = local_config[ func ].port1 >> 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) 		 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) 		SMC37c669_write_config(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) 		    SMC37c669_FDC_BASE_ADDRESS_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) 		    base_addr.as_uchar
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) 		);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) 		ret_val = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) 	    }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) 	case IDE_0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) 	    {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) 	    	SMC37c669_IDE_ADDRESS_REGISTER ide_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) ** Enable the IDE alternate status base address mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) 	    	ide_addr.as_uchar = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) 		ide_addr.by_field.addr9_4 = local_config[ func ].port2 >> 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) 		 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) 		SMC37c669_write_config(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) 		    SMC37c669_IDE_ALTERNATE_ADDRESS_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) 		    ide_addr.as_uchar
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) 		);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) ** Enable the IDE controller base address mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) 		ide_addr.as_uchar = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) 		ide_addr.by_field.addr9_4 = local_config[ func ].port1 >> 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) 		 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) 		SMC37c669_write_config(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) 		    SMC37c669_IDE_BASE_ADDRESS_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) 		    ide_addr.as_uchar
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) 		);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) 		ret_val = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) 	    }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) ** Exit configuration mode and return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417)     SMC37c669_config_mode( FALSE );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419)     return ret_val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) **++
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) **  FUNCTIONAL DESCRIPTION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) **      This function disables a device function within the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) **	SMC37c669 Super I/O controller.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) **  FORMAL PARAMETERS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) **      func:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) **          Which function to disable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) **  RETURN VALUE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) **      Return TRUE if the device function was disabled, otherwise, FALSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) **  SIDE EFFECTS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) **      {@description or none@}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) **  DESIGN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) **      Disabling a function in the SMC37c669 device involves
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) **	disabling all the function's mappings (port, irq, drq ...).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) **	A shadow copy of the device configuration is maintained
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) **	in local storage so we won't worry aboving saving the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) **	current configuration information.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) **--
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) unsigned int __init SMC37c669_disable_device ( unsigned int func )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455)     unsigned int ret_val = FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) ** Put the device into configuration mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460)     SMC37c669_config_mode( TRUE );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461)     switch ( func ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462)     	case SERIAL_0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) 	    {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) 	    	SMC37c669_SERIAL_BASE_ADDRESS_REGISTER base_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) 		SMC37c669_SERIAL_IRQ_REGISTER irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) ** Disable the serial 1 IRQ mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) 	    	irq.as_uchar = 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) 		    SMC37c669_read_config( SMC37c669_SERIAL_IRQ_INDEX );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) 		irq.by_field.uart1_irq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) 		SMC37c669_write_config( SMC37c669_SERIAL_IRQ_INDEX, irq.as_uchar );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) ** Disable the serial 1 port base address mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) 		base_addr.as_uchar = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) 		SMC37c669_write_config( 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) 		    SMC37c669_SERIAL0_BASE_ADDRESS_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) 		    base_addr.as_uchar
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) 		);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) 		ret_val = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) 	    }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) 	case SERIAL_1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) 	    {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) 	    	SMC37c669_SERIAL_BASE_ADDRESS_REGISTER base_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) 		SMC37c669_SERIAL_IRQ_REGISTER irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) ** Disable the serial 2 IRQ mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) 	    	irq.as_uchar = 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) 		    SMC37c669_read_config( SMC37c669_SERIAL_IRQ_INDEX );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) 		irq.by_field.uart2_irq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) 		SMC37c669_write_config( SMC37c669_SERIAL_IRQ_INDEX, irq.as_uchar );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) ** Disable the serial 2 port base address mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) 		base_addr.as_uchar = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) 		SMC37c669_write_config( 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) 		    SMC37c669_SERIAL1_BASE_ADDRESS_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) 		    base_addr.as_uchar
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) 		);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) 		ret_val = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) 	    }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) 	case PARALLEL_0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) 	    {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) 	    	SMC37c669_PARALLEL_BASE_ADDRESS_REGISTER base_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) 		SMC37c669_PARALLEL_FDC_IRQ_REGISTER irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) 		SMC37c669_PARALLEL_FDC_DRQ_REGISTER drq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) ** Disable the parallel port DMA channel mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) 	    	drq.as_uchar =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) 		    SMC37c669_read_config( SMC37c669_PARALLEL_FDC_DRQ_INDEX );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) 		drq.by_field.ppt_drq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) 		SMC37c669_write_config(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) 		    SMC37c669_PARALLEL_FDC_DRQ_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) 		    drq.as_uchar
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) 		);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) ** Disable the parallel port IRQ mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) 		irq.as_uchar = 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) 		    SMC37c669_read_config( SMC37c669_PARALLEL_FDC_IRQ_INDEX );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) 		irq.by_field.ppt_irq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) 		SMC37c669_write_config( 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) 		    SMC37c669_PARALLEL_FDC_IRQ_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) 		    irq.as_uchar
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) 		);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) ** Disable the parallel port base address mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) 		base_addr.as_uchar = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) 		SMC37c669_write_config(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) 		    SMC37c669_PARALLEL0_BASE_ADDRESS_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) 		    base_addr.as_uchar
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) 		);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) 		ret_val = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) 	    }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) 	case FLOPPY_0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) 	    {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) 	    	SMC37c669_FDC_BASE_ADDRESS_REGISTER base_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) 		SMC37c669_PARALLEL_FDC_IRQ_REGISTER irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) 		SMC37c669_PARALLEL_FDC_DRQ_REGISTER drq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) ** Disable the floppy controller DMA channel mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) 	    	drq.as_uchar =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) 		    SMC37c669_read_config( SMC37c669_PARALLEL_FDC_DRQ_INDEX );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) 		 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) 		drq.by_field.fdc_drq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) 		 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) 		SMC37c669_write_config( 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) 		    SMC37c669_PARALLEL_FDC_DRQ_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) 		    drq.as_uchar
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) 		);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) ** Disable the floppy controller IRQ mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) 		irq.as_uchar =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) 		    SMC37c669_read_config( SMC37c669_PARALLEL_FDC_IRQ_INDEX );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) 		 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) 		irq.by_field.fdc_irq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) 		 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) 		SMC37c669_write_config(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) 		    SMC37c669_PARALLEL_FDC_IRQ_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) 		    irq.as_uchar
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) 		);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) ** Disable the floppy controller base address mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) 		base_addr.as_uchar = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) 		 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) 		SMC37c669_write_config(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) 		    SMC37c669_FDC_BASE_ADDRESS_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) 		    base_addr.as_uchar
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) 		);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) 		ret_val = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) 	    }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) 	case IDE_0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) 	    {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) 	    	SMC37c669_IDE_ADDRESS_REGISTER ide_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) ** Disable the IDE alternate status base address mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) 	    	ide_addr.as_uchar = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) 		 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) 		SMC37c669_write_config(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) 		    SMC37c669_IDE_ALTERNATE_ADDRESS_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) 		    ide_addr.as_uchar
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) 		);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) ** Disable the IDE controller base address mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) 		ide_addr.as_uchar = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) 		 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) 		SMC37c669_write_config(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) 		    SMC37c669_IDE_BASE_ADDRESS_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) 		    ide_addr.as_uchar
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) 		);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) 		ret_val = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) 	    }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) ** Exit configuration mode and return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621)     SMC37c669_config_mode( FALSE );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623)     return ret_val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) **++
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) **  FUNCTIONAL DESCRIPTION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) **      This function configures a device function within the 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) **	SMC37c669 Super I/O controller.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) **  FORMAL PARAMETERS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) **      func:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) **          Which device function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) **       
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) **      port:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) **          I/O port for the function to use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) **	 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) **      irq:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) **          IRQ for the device function to use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) **	 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) **      drq:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) **          DMA channel for the device function to use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) **  RETURN VALUE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) **      Returns TRUE if the device function was configured, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) **	otherwise, FALSE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) **  SIDE EFFECTS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) **      {@description or none@}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) **  DESIGN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) **	If this function returns TRUE, the local shadow copy of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) **	the configuration is also updated.  If the device function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) **	is currently disabled, only the local shadow copy is 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) **	updated and the actual device function will be updated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) **	if/when it is enabled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) **--
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) unsigned int __init SMC37c669_configure_device (
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668)     unsigned int func,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669)     int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670)     int irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671)     int drq )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673)     struct DEVICE_CONFIG *cp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) ** Check for a valid configuration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678)     if ( ( cp = SMC37c669_get_config ( func ) ) != NULL ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) ** Configuration is valid, update the local shadow copy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682)     	if ( ( drq & ~0xFF ) == 0 ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) 	    cp->drq = drq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) 	if ( ( irq & ~0xFF ) == 0 ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) 	    cp->irq = irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) 	if ( ( port & ~0xFFFF ) == 0 ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) 	    cp->port1 = port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) ** If the device function is enabled, update the actual
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) ** device configuration.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) 	if ( SMC37c669_is_device_enabled( func ) ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) 	    SMC37c669_enable_device( func );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) 	return TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700)     return FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) **++
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) **  FUNCTIONAL DESCRIPTION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) **      This function determines whether a device function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) **	within the SMC37c669 controller is enabled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) **  FORMAL PARAMETERS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) **      func:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) **          Which device function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) **  RETURN VALUE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) **      Returns TRUE if the device function is enabled, otherwise, FALSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) **  SIDE EFFECTS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) **      {@description or none@}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) **  DESIGN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) **      To check whether a device is enabled we will only look at 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) **	the port base address mapping.  According to the SMC37c669
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) **	specification, all of the port base address mappings are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) **	disabled if the addr<9:8> (bits <7:6> of the register) are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) **	zero.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) **--
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) static unsigned int __init SMC37c669_is_device_enabled ( unsigned int func )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736)     unsigned char base_addr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737)     unsigned int dev_ok = FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738)     unsigned int ret_val = FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) ** Enter configuration mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742)     SMC37c669_config_mode( TRUE );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743)      
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744)     switch ( func ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745)     	case SERIAL_0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) 	    base_addr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) 		SMC37c669_read_config( SMC37c669_SERIAL0_BASE_ADDRESS_INDEX );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) 	    dev_ok = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) 	    break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) 	case SERIAL_1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) 	    base_addr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) 		SMC37c669_read_config( SMC37c669_SERIAL1_BASE_ADDRESS_INDEX );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) 	    dev_ok = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) 	    break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) 	case PARALLEL_0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) 	    base_addr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) 		SMC37c669_read_config( SMC37c669_PARALLEL0_BASE_ADDRESS_INDEX );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) 	    dev_ok = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) 	    break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) 	case FLOPPY_0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) 	    base_addr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) 		SMC37c669_read_config( SMC37c669_FDC_BASE_ADDRESS_INDEX );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) 	    dev_ok = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) 	    break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) 	case IDE_0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) 	    base_addr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) 		SMC37c669_read_config( SMC37c669_IDE_BASE_ADDRESS_INDEX );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) 	    dev_ok = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) 	    break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) ** If we have a valid device, check base_addr<7:6> to see if the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) ** device is enabled (mapped).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775)     if ( ( dev_ok ) && ( ( base_addr & 0xC0 ) != 0 ) ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) ** The mapping is not disabled, so assume that the function is 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) ** enabled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780)     	ret_val = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) ** Exit configuration mode 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785)     SMC37c669_config_mode( FALSE );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787)     return ret_val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) **++
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) **  FUNCTIONAL DESCRIPTION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) **      This function retrieves the configuration information of a 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) **	device function within the SMC37c699 Super I/O controller.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) **  FORMAL PARAMETERS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) **      func:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) **          Which device function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) **       
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) **      port:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) **          I/O port returned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) **	 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) **      irq:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) **          IRQ returned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) **	 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) **      drq:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) **          DMA channel returned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) **  RETURN VALUE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) **      Returns TRUE if the device configuration was successfully
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) **	retrieved, otherwise, FALSE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) **  SIDE EFFECTS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) **      The data pointed to by the port, irq, and drq parameters
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) **	my be modified even if the configuration is not successfully
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) **	retrieved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) **  DESIGN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) **      The device configuration is fetched from the local shadow
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) **	copy.  Any unused parameters will be set to -1.  Any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) **	parameter which is not desired can specify the NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) **	pointer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) **--
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) static unsigned int __init SMC37c669_get_device_config (
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834)     unsigned int func,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835)     int *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836)     int *irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837)     int *drq )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839)     struct DEVICE_CONFIG *cp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840)     unsigned int ret_val = FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) ** Check for a valid device configuration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844)     if ( ( cp = SMC37c669_get_config( func ) ) != NULL ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845)     	if ( drq != NULL ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) 	    *drq = cp->drq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) 	    ret_val = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) 	if ( irq != NULL ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) 	    *irq = cp->irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) 	    ret_val = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) 	if ( port != NULL ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) 	    *port = cp->port1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) 	    ret_val = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858)     return ret_val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) **++
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) **  FUNCTIONAL DESCRIPTION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) **      This function displays the current state of the SMC37c699
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) **	Super I/O controller's device functions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) **  FORMAL PARAMETERS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) **      None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) **  RETURN VALUE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) **      None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) **  SIDE EFFECTS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) **      None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) **--
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) void __init SMC37c669_display_device_info ( void )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886)     if ( SMC37c669_is_device_enabled( SERIAL_0 ) ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887)     	printk( "  Serial 0:    Enabled [ Port 0x%x, IRQ %d ]\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) 		 local_config[ SERIAL_0 ].port1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) 		 local_config[ SERIAL_0 ].irq
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) 	);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892)     else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893)     	printk( "  Serial 0:    Disabled\n" );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896)     if ( SMC37c669_is_device_enabled( SERIAL_1 ) ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897)     	printk( "  Serial 1:    Enabled [ Port 0x%x, IRQ %d ]\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) 		 local_config[ SERIAL_1 ].port1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) 		 local_config[ SERIAL_1 ].irq
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) 	);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902)     else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903)     	printk( "  Serial 1:    Disabled\n" );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906)     if ( SMC37c669_is_device_enabled( PARALLEL_0 ) ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907)     	printk( "  Parallel:    Enabled [ Port 0x%x, IRQ %d/%d ]\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) 		 local_config[ PARALLEL_0 ].port1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) 		 local_config[ PARALLEL_0 ].irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) 		 local_config[ PARALLEL_0 ].drq
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) 	);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913)     else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914)     	printk( "  Parallel:    Disabled\n" );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917)     if ( SMC37c669_is_device_enabled( FLOPPY_0 ) ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918)     	printk( "  Floppy Ctrl: Enabled [ Port 0x%x, IRQ %d/%d ]\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) 		 local_config[ FLOPPY_0 ].port1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) 		 local_config[ FLOPPY_0 ].irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) 		 local_config[ FLOPPY_0 ].drq
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) 	);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924)     else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925)     	printk( "  Floppy Ctrl: Disabled\n" );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928)     if ( SMC37c669_is_device_enabled( IDE_0 ) ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929)     	printk( "  IDE 0:       Enabled [ Port 0x%x, IRQ %d ]\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) 		 local_config[ IDE_0 ].port1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) 		 local_config[ IDE_0 ].irq
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) 	);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934)     else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935)     	printk( "  IDE 0:       Disabled\n" );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) **++
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) **  FUNCTIONAL DESCRIPTION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) **      This function puts the SMC37c669 Super I/O controller into,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) **	and takes it out of, configuration mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) **  FORMAL PARAMETERS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) **      enable:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) **          TRUE to enter configuration mode, FALSE to exit.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) **  RETURN VALUE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) **      None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) **  SIDE EFFECTS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) **      The SMC37c669 controller may be left in configuration mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) **--
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) static void __init SMC37c669_config_mode( 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963)     unsigned int enable )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965)     if ( enable ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) ** To enter configuration mode, two writes in succession to the index
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) ** port are required.  If a write to another address or port occurs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) ** between these two writes, the chip does not enter configuration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) ** mode.  Therefore, a spinlock is placed around the two writes to 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) ** guarantee that they complete uninterrupted.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) 	spin_lock(&smc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974)     	wb( &SMC37c669->index_port, SMC37c669_CONFIG_ON_KEY );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975)     	wb( &SMC37c669->index_port, SMC37c669_CONFIG_ON_KEY );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) 	spin_unlock(&smc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978)     else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979)     	wb( &SMC37c669->index_port, SMC37c669_CONFIG_OFF_KEY );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) **++
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) **  FUNCTIONAL DESCRIPTION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) **      This function reads an SMC37c669 Super I/O controller
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) **	configuration register.  This function assumes that the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) **	device is already in configuration mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) **  FORMAL PARAMETERS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) **      index:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) **          Index value of configuration register to read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) **  RETURN VALUE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) **      Data read from configuration register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) **  SIDE EFFECTS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) **      None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) **--
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) static unsigned char __init SMC37c669_read_config( 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007)     unsigned char index )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) 	wb(&SMC37c669->index_port, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) 	return rb(&SMC37c669->data_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) **++
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) **  FUNCTIONAL DESCRIPTION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) **      This function writes an SMC37c669 Super I/O controller
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) **	configuration register.  This function assumes that the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) **	device is already in configuration mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) **  FORMAL PARAMETERS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) **      index:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) **          Index of configuration register to write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) **       
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) **      data:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) **          Data to be written
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) **  RETURN VALUE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) **      None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) **  SIDE EFFECTS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) **      None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) **--
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) static void __init SMC37c669_write_config( 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040)     unsigned char index, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041)     unsigned char data )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043)     wb( &SMC37c669->index_port, index );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044)     wb( &SMC37c669->data_port, data );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) **++
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) **  FUNCTIONAL DESCRIPTION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) **      This function initializes the local device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) **	configuration storage.  This function assumes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054) **	that the device is already in configuration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) **	mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) **  FORMAL PARAMETERS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) **      None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) **  RETURN VALUE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) **      None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) **  SIDE EFFECTS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) **      Local storage for device configuration information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) **	is initialized.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) **--
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) static void __init SMC37c669_init_local_config ( void )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074)     SMC37c669_SERIAL_BASE_ADDRESS_REGISTER uart_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075)     SMC37c669_SERIAL_IRQ_REGISTER uart_irqs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076)     SMC37c669_PARALLEL_BASE_ADDRESS_REGISTER ppt_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077)     SMC37c669_PARALLEL_FDC_IRQ_REGISTER ppt_fdc_irqs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078)     SMC37c669_PARALLEL_FDC_DRQ_REGISTER ppt_fdc_drqs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079)     SMC37c669_FDC_BASE_ADDRESS_REGISTER fdc_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080)     SMC37c669_IDE_ADDRESS_REGISTER ide_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081)     SMC37c669_IDE_ADDRESS_REGISTER ide_alt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) ** Get serial port 1 base address 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086)     uart_base.as_uchar = 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) 	SMC37c669_read_config( SMC37c669_SERIAL0_BASE_ADDRESS_INDEX );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) ** Get IRQs for serial ports 1 & 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091)     uart_irqs.as_uchar = 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) 	SMC37c669_read_config( SMC37c669_SERIAL_IRQ_INDEX );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) ** Store local configuration information for serial port 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096)     local_config[SERIAL_0].port1 = uart_base.by_field.addr9_3 << 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097)     local_config[SERIAL_0].irq = 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) 	SMC37c669_xlate_irq( 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) 	    SMC37c669_DEVICE_IRQ( uart_irqs.by_field.uart1_irq ) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) 	);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) ** Get serial port 2 base address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104)     uart_base.as_uchar = 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) 	SMC37c669_read_config( SMC37c669_SERIAL1_BASE_ADDRESS_INDEX );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) ** Store local configuration information for serial port 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109)     local_config[SERIAL_1].port1 = uart_base.by_field.addr9_3 << 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110)     local_config[SERIAL_1].irq = 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) 	SMC37c669_xlate_irq( 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) 	    SMC37c669_DEVICE_IRQ( uart_irqs.by_field.uart2_irq ) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) 	);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) ** Get parallel port base address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117)     ppt_base.as_uchar =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) 	SMC37c669_read_config( SMC37c669_PARALLEL0_BASE_ADDRESS_INDEX );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) ** Get IRQs for parallel port and floppy controller
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122)     ppt_fdc_irqs.as_uchar =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) 	SMC37c669_read_config( SMC37c669_PARALLEL_FDC_IRQ_INDEX );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) ** Get DRQs for parallel port and floppy controller
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127)     ppt_fdc_drqs.as_uchar =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) 	SMC37c669_read_config( SMC37c669_PARALLEL_FDC_DRQ_INDEX );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) ** Store local configuration information for parallel port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132)     local_config[PARALLEL_0].port1 = ppt_base.by_field.addr9_2 << 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133)     local_config[PARALLEL_0].irq =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) 	SMC37c669_xlate_irq(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) 	    SMC37c669_DEVICE_IRQ( ppt_fdc_irqs.by_field.ppt_irq )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) 	);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137)     local_config[PARALLEL_0].drq =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) 	SMC37c669_xlate_drq(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) 	    SMC37c669_DEVICE_DRQ( ppt_fdc_drqs.by_field.ppt_drq )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) 	);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) ** Get floppy controller base address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144)     fdc_base.as_uchar = 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) 	SMC37c669_read_config( SMC37c669_FDC_BASE_ADDRESS_INDEX );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) ** Store local configuration information for floppy controller
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149)     local_config[FLOPPY_0].port1 = fdc_base.by_field.addr9_4 << 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150)     local_config[FLOPPY_0].irq =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) 	SMC37c669_xlate_irq(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) 	    SMC37c669_DEVICE_IRQ( ppt_fdc_irqs.by_field.fdc_irq )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) 	);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154)     local_config[FLOPPY_0].drq =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) 	SMC37c669_xlate_drq(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) 	    SMC37c669_DEVICE_DRQ( ppt_fdc_drqs.by_field.fdc_drq )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) 	);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) ** Get IDE controller base address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161)     ide_base.as_uchar =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) 	SMC37c669_read_config( SMC37c669_IDE_BASE_ADDRESS_INDEX );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) ** Get IDE alternate status base address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166)     ide_alt.as_uchar =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) 	SMC37c669_read_config( SMC37c669_IDE_ALTERNATE_ADDRESS_INDEX );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) ** Store local configuration information for IDE controller
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171)     local_config[IDE_0].port1 = ide_base.by_field.addr9_4 << 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172)     local_config[IDE_0].port2 = ide_alt.by_field.addr9_4 << 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173)     local_config[IDE_0].irq = 14;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) **++
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) **  FUNCTIONAL DESCRIPTION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) **      This function returns a pointer to the local shadow
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) **	configuration of the requested device function.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) **  FORMAL PARAMETERS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) **      func:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) **          Which device function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) **  RETURN VALUE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) **      Returns a pointer to the DEVICE_CONFIG structure for the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) **	requested function, otherwise, NULL.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) **  SIDE EFFECTS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) **      {@description or none@}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) **--
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) static struct DEVICE_CONFIG * __init SMC37c669_get_config( unsigned int func )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202)     struct DEVICE_CONFIG *cp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204)     switch ( func ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205)     	case SERIAL_0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) 	    cp = &local_config[ SERIAL_0 ];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) 	    break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) 	case SERIAL_1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) 	    cp = &local_config[ SERIAL_1 ];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) 	    break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) 	case PARALLEL_0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) 	    cp = &local_config[ PARALLEL_0 ];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) 	    break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) 	case FLOPPY_0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) 	    cp = &local_config[ FLOPPY_0 ];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) 	    break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) 	case IDE_0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) 	    cp = &local_config[ IDE_0 ];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) 	    break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221)     return cp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) **++
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) **  FUNCTIONAL DESCRIPTION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) **      This function translates IRQs back and forth between ISA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) **	IRQs and SMC37c669 device IRQs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) **  FORMAL PARAMETERS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) **      irq:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) **          The IRQ to translate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) **  RETURN VALUE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) **      Returns the translated IRQ, otherwise, returns -1.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) **  SIDE EFFECTS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) **      {@description or none@}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) **--
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) static int __init SMC37c669_xlate_irq ( int irq )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248)     int i, translated_irq = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250)     if ( SMC37c669_IS_DEVICE_IRQ( irq ) ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) ** We are translating a device IRQ to an ISA IRQ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254)     	for ( i = 0; ( SMC37c669_irq_table[i].device_irq != -1 ) || ( SMC37c669_irq_table[i].isa_irq != -1 ); i++ ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) 	    if ( irq == SMC37c669_irq_table[i].device_irq ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) 	    	translated_irq = SMC37c669_irq_table[i].isa_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) 	    }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261)     else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) ** We are translating an ISA IRQ to a device IRQ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265)     	for ( i = 0; ( SMC37c669_irq_table[i].isa_irq != -1 ) || ( SMC37c669_irq_table[i].device_irq != -1 ); i++ ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) 	    if ( irq == SMC37c669_irq_table[i].isa_irq ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) 	    	translated_irq = SMC37c669_irq_table[i].device_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) 	    }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272)     return translated_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) **++
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) **  FUNCTIONAL DESCRIPTION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) **      This function translates DMA channels back and forth between
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) **	ISA DMA channels and SMC37c669 device DMA channels.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) **  FORMAL PARAMETERS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) **      drq:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) **          The DMA channel to translate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) **  RETURN VALUE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) **      Returns the translated DMA channel, otherwise, returns -1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) **  SIDE EFFECTS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) **      {@description or none@}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) **--
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) static int __init SMC37c669_xlate_drq ( int drq )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300)     int i, translated_drq = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302)     if ( SMC37c669_IS_DEVICE_DRQ( drq ) ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) ** We are translating a device DMA channel to an ISA DMA channel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306)     	for ( i = 0; ( SMC37c669_drq_table[i].device_drq != -1 ) || ( SMC37c669_drq_table[i].isa_drq != -1 ); i++ ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) 	    if ( drq == SMC37c669_drq_table[i].device_drq ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) 	    	translated_drq = SMC37c669_drq_table[i].isa_drq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) 	    }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313)     else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) ** We are translating an ISA DMA channel to a device DMA channel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317)     	for ( i = 0; ( SMC37c669_drq_table[i].isa_drq != -1 ) || ( SMC37c669_drq_table[i].device_drq != -1 ); i++ ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) 	    if ( drq == SMC37c669_drq_table[i].isa_drq ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) 	    	translated_drq = SMC37c669_drq_table[i].device_drq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) 	    }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324)     return translated_drq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) int __init smcc669_init ( void )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330)     struct INODE *ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332)     allocinode( smc_ddb.name, 1, &ip );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333)     ip->dva = &smc_ddb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334)     ip->attr = ATTR$M_WRITE | ATTR$M_READ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335)     ip->len[0] = 0x30;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336)     ip->misc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337)     INODE_UNLOCK( ip );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339)     return msg_success;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) int __init smcc669_open( struct FILE *fp, char *info, char *next, char *mode )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344)     struct INODE *ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) ** Allow multiple readers but only one writer.  ip->misc keeps track
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) ** of the number of writers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349)     ip = fp->ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350)     INODE_LOCK( ip );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351)     if ( fp->mode & ATTR$M_WRITE ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) 	if ( ip->misc ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) 	    INODE_UNLOCK( ip );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) 	    return msg_failure;	    /* too many writers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) 	ip->misc++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) ** Treat the information field as a byte offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361)     *fp->offset = xtoi( info );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362)     INODE_UNLOCK( ip );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364)     return msg_success;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) int __init smcc669_close( struct FILE *fp )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369)     struct INODE *ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371)     ip = fp->ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372)     if ( fp->mode & ATTR$M_WRITE ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373) 	INODE_LOCK( ip );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) 	ip->misc--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) 	INODE_UNLOCK( ip );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377)     return msg_success;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) int __init smcc669_read( struct FILE *fp, int size, int number, unsigned char *buf )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382)     int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383)     int length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384)     int nbytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385)     struct INODE *ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) ** Always access a byte at a time
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390)     ip = fp->ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391)     length = size * number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392)     nbytes = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394)     SMC37c669_config_mode( TRUE );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395)     for ( i = 0; i < length; i++ ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) 	if ( !inrange( *fp->offset, 0, ip->len[0] ) ) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) 	    break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) 	*buf++ = SMC37c669_read_config( *fp->offset );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) 	*fp->offset += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) 	nbytes++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402)     SMC37c669_config_mode( FALSE );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403)     return nbytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406) int __init smcc669_write( struct FILE *fp, int size, int number, unsigned char *buf )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408)     int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409)     int length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410)     int nbytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411)     struct INODE *ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) ** Always access a byte at a time
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415)     ip = fp->ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416)     length = size * number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417)     nbytes = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419)     SMC37c669_config_mode( TRUE );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420)     for ( i = 0; i < length; i++ ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) 	if ( !inrange( *fp->offset, 0, ip->len[0] ) ) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) 	    break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) 	SMC37c669_write_config( *fp->offset, *buf );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) 	*fp->offset += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) 	buf++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) 	nbytes++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428)     SMC37c669_config_mode( FALSE );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429)     return nbytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433) void __init
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) SMC37c669_dump_registers(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436)   int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437)   for (i = 0; i <= 0x29; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438)     printk("-- CR%02x : %02x\n", i, SMC37c669_read_config(i));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) /*+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441)  * ============================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442)  * = SMC_init - SMC37c669 Super I/O controller initialization                 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443)  * ============================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445)  * OVERVIEW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447)  *      This routine configures and enables device functions on the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448)  *      SMC37c669 Super I/O controller.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450)  * FORM OF CALL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452)  *      SMC_init( );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454)  * RETURNS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456)  *      Nothing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458)  * ARGUMENTS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460)  *      None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462)  * SIDE EFFECTS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464)  *      None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) void __init SMC669_Init ( int index )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469)     SMC37c669_CONFIG_REGS *SMC_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470)     unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472)     local_irq_save(flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473)     if ( ( SMC_base = SMC37c669_detect( index ) ) != NULL ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) #if SMC_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) 	SMC37c669_config_mode( TRUE );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) 	SMC37c669_dump_registers( );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477) 	SMC37c669_config_mode( FALSE );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478)         SMC37c669_display_device_info( );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480)         SMC37c669_disable_device( SERIAL_0 );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481)         SMC37c669_configure_device(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482)             SERIAL_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483)             COM1_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484)             COM1_IRQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485)             -1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486)         );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487)         SMC37c669_enable_device( SERIAL_0 );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489)         SMC37c669_disable_device( SERIAL_1 );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490)         SMC37c669_configure_device(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491)             SERIAL_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492)             COM2_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493)             COM2_IRQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494)             -1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495)         );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496)         SMC37c669_enable_device( SERIAL_1 );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498)         SMC37c669_disable_device( PARALLEL_0 );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499)         SMC37c669_configure_device(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500)             PARALLEL_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501)             PARP_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502)             PARP_IRQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503)             PARP_DRQ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504)         );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505)         SMC37c669_enable_device( PARALLEL_0 );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507)         SMC37c669_disable_device( FLOPPY_0 );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508)         SMC37c669_configure_device(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509)             FLOPPY_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510)             FDC_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511)             FDC_IRQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512)             FDC_DRQ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513)         );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514)         SMC37c669_enable_device( FLOPPY_0 );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515)           
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516) 	/* Wake up sometimes forgotten floppy, especially on DP264. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) 	outb(0xc, 0x3f2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519)         SMC37c669_disable_device( IDE_0 );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521) #if SMC_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522) 	SMC37c669_config_mode( TRUE );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523) 	SMC37c669_dump_registers( );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) 	SMC37c669_config_mode( FALSE );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525)         SMC37c669_display_device_info( );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) 	local_irq_restore(flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528)         printk( "SMC37c669 Super I/O Controller found @ 0x%p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) 		SMC_base );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531)     else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) 	local_irq_restore(flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533) #if SMC_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534)         printk( "No SMC37c669 Super I/O Controller found\n" );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537) }