diff options
| author | Christer Weinigel <christer@weinigel.se> | 2002-10-04 20:13:10 -0700 |
|---|---|---|
| committer | Russell King <rmk@flint.arm.linux.org.uk> | 2002-10-04 20:13:10 -0700 |
| commit | 3900abd5bb7557e1f8463f6aa6981b1475ec89d2 (patch) | |
| tree | 0282c728a6db2f8c50305fb6007f3c0961f3fd70 /include/linux | |
| parent | 10d033f728db071b9f8566a2618abdaa8640a9f6 (diff) | |
[PATCH] Updated NatSemi SCx200 patches for Linux-2.5
This patch adds support for the National Semiconductor SCx200
processor family to Linux 2.5.
The patch consists of the following drivers:
arch/i386/kernel/scx200.c -- give kernel access to the GPIO pins
drivers/chars/scx200_gpio.c -- give userspace access to the GPIO pins
drivers/chars/scx200_wdt.c -- watchdog timer driver
drivers/i2c/scx200_i2c.c -- use any two GPIO pins as an I2C bus
drivers/i2c/scx200_acb.c -- driver for the Access.BUS hardware
drivers/mtd/maps/scx200_docflash.c -- driver for a CFI flash connected
to the DOCCS pin
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/pci_ids.h | 6 | ||||
| -rw-r--r-- | include/linux/scx200.h | 56 | ||||
| -rw-r--r-- | include/linux/scx200_gpio.h | 98 |
3 files changed, 160 insertions, 0 deletions
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index be4d21956fc5..a652bbf6682d 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h @@ -288,6 +288,12 @@ #define PCI_DEVICE_ID_NS_87560_USB 0x0012 #define PCI_DEVICE_ID_NS_83815 0x0020 #define PCI_DEVICE_ID_NS_83820 0x0022 +#define PCI_DEVICE_ID_NS_SCx200_BRIDGE 0x0500 +#define PCI_DEVICE_ID_NS_SCx200_SMI 0x0501 +#define PCI_DEVICE_ID_NS_SCx200_IDE 0x0502 +#define PCI_DEVICE_ID_NS_SCx200_AUDIO 0x0503 +#define PCI_DEVICE_ID_NS_SCx200_VIDEO 0x0504 +#define PCI_DEVICE_ID_NS_SCx200_XBUS 0x0505 #define PCI_DEVICE_ID_NS_87410 0xd001 #define PCI_VENDOR_ID_TSENG 0x100c diff --git a/include/linux/scx200.h b/include/linux/scx200.h new file mode 100644 index 000000000000..af7d53acad99 --- /dev/null +++ b/include/linux/scx200.h @@ -0,0 +1,56 @@ +/* linux/include/linux/scx200.h + + Copyright (c) 2001,2002 Christer Weinigel <wingel@nano-system.com> + + Defines for the National Semiconductor SCx200 Processors +*/ + +/* Interesting stuff for the National Semiconductor SCx200 CPU */ + +/* F0 PCI Header/Bridge Configuration Registers */ +#define SCx200_DOCCS_BASE 0x78 /* DOCCS Base Address Register */ +#define SCx200_DOCCS_CTRL 0x7c /* DOCCS Control Register */ + +/* GPIO Register Block */ +#define SCx200_GPIO_SIZE 0x2c /* Size of GPIO register block */ + +/* General Configuration Block */ +#define SCx200_CB_BASE 0x9000 /* Base fixed at 0x9000 according to errata */ + +/* Watchdog Timer */ +#define SCx200_WDT_OFFSET 0x00 /* offset within configuration block */ +#define SCx200_WDT_SIZE 0x05 /* size */ + +#define SCx200_WDT_WDTO 0x00 /* Time-Out Register */ +#define SCx200_WDT_WDCNFG 0x02 /* Configuration Register */ +#define SCx200_WDT_WDSTS 0x04 /* Status Register */ +#define SCx200_WDT_WDSTS_WDOVF (1<<0) /* Overflow bit */ + +/* High Resolution Timer */ +#define SCx200_TIMER_OFFSET 0x08 +#define SCx200_TIMER_SIZE 0x05 + +/* Clock Generators */ +#define SCx200_CLOCKGEN_OFFSET 0x10 +#define SCx200_CLOCKGEN_SIZE 0x10 + +/* Pin Multiplexing and Miscellaneous Configuration Registers */ +#define SCx200_MISC_OFFSET 0x30 +#define SCx200_MISC_SIZE 0x10 + +#define SCx200_PMR 0x30 /* Pin Multiplexing Register */ +#define SCx200_MCR 0x34 /* Miscellaneous Configuration Register */ +#define SCx200_INTSEL 0x38 /* Interrupt Selection Register */ +#define SCx200_IID 0x3c /* IA On a Chip Identification Number Reg */ +#define SCx200_REV 0x3d /* Revision Register */ +#define SCx200_CBA 0x3e /* Configuration Base Address Register */ + +/* Verify that the configuration block really is there */ +#define scx200_cb_probe(base) (inw((base) + SCx200_CBA) == (base)) + +/* + Local variables: + compile-command: "make -C ../.. bzImage modules" + c-basic-offset: 8 + End: +*/ diff --git a/include/linux/scx200_gpio.h b/include/linux/scx200_gpio.h new file mode 100644 index 000000000000..2c6d739706b6 --- /dev/null +++ b/include/linux/scx200_gpio.h @@ -0,0 +1,98 @@ +#include <linux/spinlock.h> + +u32 scx200_gpio_configure(int index, u32 set, u32 clear); +void scx200_gpio_dump(unsigned index); + +extern unsigned scx200_gpio_base; +extern spinlock_t scx200_gpio_lock; +extern long scx200_gpio_shadow[2]; + +#define scx200_gpio_present() (scx200_gpio_base!=0) + +/* Definitions to make sure I do the same thing in all functions */ +#define __SCx200_GPIO_BANK unsigned bank = index>>5 +#define __SCx200_GPIO_IOADDR unsigned short ioaddr = scx200_gpio_base+0x10*bank +#define __SCx200_GPIO_SHADOW long *shadow = scx200_gpio_shadow+bank +#define __SCx200_GPIO_INDEX index &= 31 + +#define __SCx200_GPIO_OUT __asm__ __volatile__("outsl":"=mS" (shadow):"d" (ioaddr), "0" (shadow)) + +/* returns the value of the GPIO pin */ + +static inline int scx200_gpio_get(int index) { + __SCx200_GPIO_BANK; + __SCx200_GPIO_IOADDR + 0x04; + __SCx200_GPIO_INDEX; + + return (inl(ioaddr) & (1<<index)) ? 1 : 0; +} + +/* return the value driven on the GPIO signal (the value that will be + driven if the GPIO is configured as an output, it might not be the + state of the GPIO right now if the GPIO is configured as an input) */ + +static inline int scx200_gpio_current(int index) { + __SCx200_GPIO_BANK; + __SCx200_GPIO_INDEX; + + return (scx200_gpio_shadow[bank] & (1<<index)) ? 1 : 0; +} + +/* drive the GPIO signal high */ + +static inline void scx200_gpio_set_high(int index) { + __SCx200_GPIO_BANK; + __SCx200_GPIO_IOADDR; + __SCx200_GPIO_SHADOW; + __SCx200_GPIO_INDEX; + set_bit(index, shadow); + __SCx200_GPIO_OUT; +} + +/* drive the GPIO signal low */ + +static inline void scx200_gpio_set_low(int index) { + __SCx200_GPIO_BANK; + __SCx200_GPIO_IOADDR; + __SCx200_GPIO_SHADOW; + __SCx200_GPIO_INDEX; + clear_bit(index, shadow); + __SCx200_GPIO_OUT; +} + +/* drive the GPIO signal to state */ + +static inline void scx200_gpio_set(int index, int state) { + __SCx200_GPIO_BANK; + __SCx200_GPIO_IOADDR; + __SCx200_GPIO_SHADOW; + __SCx200_GPIO_INDEX; + if (state) + set_bit(index, shadow); + else + clear_bit(index, shadow); + __SCx200_GPIO_OUT; +} + +/* toggle the GPIO signal */ +static inline void scx200_gpio_change(int index) { + __SCx200_GPIO_BANK; + __SCx200_GPIO_IOADDR; + __SCx200_GPIO_SHADOW; + __SCx200_GPIO_INDEX; + change_bit(index, shadow); + __SCx200_GPIO_OUT; +} + +#undef __SCx200_GPIO_BANK +#undef __SCx200_GPIO_IOADDR +#undef __SCx200_GPIO_SHADOW +#undef __SCx200_GPIO_INDEX +#undef __SCx200_GPIO_OUT + +/* + Local variables: + compile-command: "make -C ../.. bzImage modules" + c-basic-offset: 8 + End: +*/ |
