From: Florian Fainelli Date: Thu, 24 May 2007 23:30:35 +0000 (+0000) Subject: add generic GPIO to MIPS boards, use it for au1000 and for the MTX-1 led driver as... X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fsvn-archive%2Farchive.git;a=commitdiff_plain;h=dbfa0f3608a4c9f613f0bdd739d85350a90cdec8 add generic GPIO to MIPS boards, use it for au1000 and for the MTX-1 led driver as well SVN-Revision: 7334 --- diff --git a/target/linux/au1000-2.6/config/default b/target/linux/au1000-2.6/config/default index 7953251f68..09afbd9cbd 100644 --- a/target/linux/au1000-2.6/config/default +++ b/target/linux/au1000-2.6/config/default @@ -2,10 +2,13 @@ CONFIG_32BIT=y # CONFIG_64BIT is not set CONFIG_64BIT_PHYS_ADDR=y # CONFIG_8139TOO is not set +# CONFIG_ARCH_HAS_ILOG2_U32 is not set +# CONFIG_ARCH_HAS_ILOG2_U64 is not set # CONFIG_ATM is not set # CONFIG_B44 is not set CONFIG_BASE_SMALL=0 -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set +CONFIG_BITREVERSE=y +# CONFIG_BROADCOM_PHY is not set CONFIG_CHR_DEV_SG=m CONFIG_CMDLINE="root=/dev/mtdblock0 rootfstype=jffs2 init=/etc/preinit" # CONFIG_CPU_BIG_ENDIAN is not set @@ -45,12 +48,15 @@ CONFIG_DMA_NONCOHERENT=y CONFIG_DUMMY=m CONFIG_ELF_CORE=y # CONFIG_ENABLE_MUST_CHECK is not set -# CONFIG_FIRMWARE_EDID is not set # CONFIG_FIXED_PHY is not set CONFIG_FS_POSIX_ACL=y CONFIG_GENERIC_FIND_NEXT_BIT=y +CONFIG_GENERIC_GPIO=y +# CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ is not set # CONFIG_GEN_RTC is not set # CONFIG_HAMRADIO is not set +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y CONFIG_HW_HAS_PCI=y CONFIG_HW_RANDOM=y CONFIG_HZ=250 @@ -64,44 +70,17 @@ CONFIG_I2C=m CONFIG_I2C_ALGOBIT=m CONFIG_I2C_ALGOPCA=m CONFIG_I2C_ALGOPCF=m -# CONFIG_I2C_ALI1535 is not set -# CONFIG_I2C_ALI1563 is not set -# CONFIG_I2C_ALI15X3 is not set -# CONFIG_I2C_AMD756 is not set -# CONFIG_I2C_AMD8111 is not set CONFIG_I2C_AU1X00GPIO=m CONFIG_I2C_CHARDEV=m -# CONFIG_I2C_DEBUG_ALGO is not set -# CONFIG_I2C_DEBUG_BUS is not set -# CONFIG_I2C_DEBUG_CHIP is not set -# CONFIG_I2C_DEBUG_CORE is not set -# CONFIG_I2C_I801 is not set -# CONFIG_I2C_I810 is not set -# CONFIG_I2C_NFORCE2 is not set -# CONFIG_I2C_OCORES is not set -# CONFIG_I2C_PARPORT_LIGHT is not set -# CONFIG_I2C_PCA_ISA is not set -# CONFIG_I2C_PIIX4 is not set -# CONFIG_I2C_PROSAVAGE is not set -# CONFIG_I2C_SAVAGE4 is not set -# CONFIG_I2C_SIS5595 is not set -# CONFIG_I2C_SIS630 is not set -# CONFIG_I2C_SIS96X is not set -# CONFIG_I2C_STUB is not set -# CONFIG_I2C_VIA is not set -# CONFIG_I2C_VIAPRO is not set -# CONFIG_I2C_VOODOO3 is not set # CONFIG_IDE is not set CONFIG_INITRAMFS_SOURCE="" CONFIG_JFFS2_FS_DEBUG=0 -# CONFIG_LAN_SAA9730 is not set CONFIG_LEDS_MTX1=y # CONFIG_LEDS_TRIGGERS is not set # CONFIG_MACH_DECSTATION is not set # CONFIG_MACH_JAZZ is not set # CONFIG_MACH_VR41XX is not set CONFIG_MAGIC_SYSRQ=y -CONFIG_MINI_FO=y CONFIG_MIPS=y # CONFIG_MIPS_ATLAS is not set CONFIG_MIPS_AU1X00_ENET=y @@ -138,6 +117,7 @@ CONFIG_MODULE_FORCE_UNLOAD=y CONFIG_MTD=y # CONFIG_MTD_ABSENT is not set # CONFIG_MTD_ALCHEMY is not set +CONFIG_MTD_BLKDEVS=y CONFIG_MTD_BLOCK=y # CONFIG_MTD_BLOCK2MTD is not set CONFIG_MTD_CFI=y @@ -182,33 +162,38 @@ CONFIG_MTD_PARTITIONS=y CONFIG_MTX1_WATCHDOG=y # CONFIG_NATSEMI is not set # CONFIG_NE2K_PCI is not set +CONFIG_NET_SCH_FIFO=y # CONFIG_NET_VENDOR_3COM is not set +CONFIG_NF_CONNTRACK=y +CONFIG_NF_CONNTRACK_MARK=y +CONFIG_NF_CT_ACCT=y +# CONFIG_NF_NAT_AMANDA is not set +CONFIG_NF_NAT_FTP=m +CONFIG_NF_NAT_H323=m +CONFIG_NF_NAT_IRC=m +CONFIG_NF_NAT_NEEDED=y +# CONFIG_NF_NAT_PPTP is not set +CONFIG_NF_NAT_SIP=m +# CONFIG_NF_NAT_TFTP is not set # CONFIG_PAGE_SIZE_16KB is not set CONFIG_PAGE_SIZE_4KB=y # CONFIG_PAGE_SIZE_64KB is not set # CONFIG_PAGE_SIZE_8KB is not set -# CONFIG_PCCARD is not set # CONFIG_PCIPCWATCHDOG is not set CONFIG_PHYLIB=y -# CONFIG_PM is not set # CONFIG_PMC_YOSEMITE is not set +# CONFIG_PNPACPI is not set # CONFIG_PNX8550_JBS is not set -# CONFIG_PNX8550_V2PCI is not set +# CONFIG_PNX8550_STB810 is not set # CONFIG_PPP_MPPE is not set # CONFIG_PREVENT_FIRMWARE_BUILD is not set # CONFIG_QSEMI_PHY is not set +CONFIG_RESOURCES_64BIT=y # CONFIG_RTC is not set CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y CONFIG_SCSI_CONSTANTS=y # CONFIG_SCSI_PROC_FS is not set -# CONFIG_SENSORS_DS1337 is not set -# CONFIG_SENSORS_DS1374 is not set -# CONFIG_SENSORS_EEPROM is not set -# CONFIG_SENSORS_MAX6875 is not set -# CONFIG_SENSORS_PCA9539 is not set -# CONFIG_SENSORS_PCF8574 is not set -# CONFIG_SENSORS_PCF8591 is not set CONFIG_SERIAL_8250_AU1X00=y # CONFIG_SERIAL_8250_EXTENDED is not set CONFIG_SERIAL_8250_NR_UARTS=4 @@ -235,10 +220,12 @@ CONFIG_SOFT_WATCHDOG=m # CONFIG_SPARSEMEM_STATIC is not set # CONFIG_STANDALONE is not set CONFIG_STRIP=m -CONFIG_SYN_COOKIES=y +CONFIG_SYSVIPC_SYSCTL=y CONFIG_SYS_HAS_CPU_MIPS32_R1=y CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y +CONFIG_SYS_SUPPORTS_APM_EMULATION=y CONFIG_SYS_SUPPORTS_ARBIT_HZ=y +CONFIG_SYS_SUPPORTS_KGDB=y CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y # CONFIG_TMD_HERMES is not set # CONFIG_TOSHIBA_JMR3927 is not set @@ -247,10 +234,15 @@ CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y CONFIG_TRAD_SIGNALS=y # CONFIG_UNUSED_SYMBOLS is not set # CONFIG_USBPCWATCHDOG is not set +# CONFIG_USB_EHCI_BIG_ENDIAN_MMIO is not set CONFIG_USB_EHCI_HCD=m # CONFIG_USB_EHCI_ROOT_HUB_TT is not set # CONFIG_USB_EHCI_SPLIT_ISO is not set # CONFIG_USB_EHCI_TT_NEWSCHED is not set +# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set +# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set CONFIG_USB_OHCI_HCD=m CONFIG_USB_UHCI_HCD=m # CONFIG_VIA_RHINE is not set +CONFIG_ZONE_DMA=y +CONFIG_ZONE_DMA_FLAG=1 diff --git a/target/linux/au1000-2.6/files/drivers/leds/leds-mtx1.c b/target/linux/au1000-2.6/files/drivers/leds/leds-mtx1.c index 86615f46b4..4c2ab55fc3 100644 --- a/target/linux/au1000-2.6/files/drivers/leds/leds-mtx1.c +++ b/target/linux/au1000-2.6/files/drivers/leds/leds-mtx1.c @@ -14,41 +14,26 @@ #include #include #include -#include +#include static struct platform_device *pdev; -static void mtx1_green_led_set(struct led_classdev *led_cdev, enum led_brightness brightness) +static void mtx1_led_set(struct led_classdev *led_cdev, enum led_brightness brightness) { - /* The power LED cannot be controlled the same way as for the Status LED */ - if (brightness) { - au_writel( 0x18000800, GPIO2_OUTPUT ); - } else { - au_writel( 0x18000000, GPIO2_OUTPUT); - } -} - -static void mtx1_red_led_set(struct led_classdev *led_cdev, enum led_brightness brightness) -{ - /* We store GPIO address (originally address - 200) in the "flags" field*/ - unsigned long pinmask = 1 << led_cdev->flags; - if (brightness) { - au_writel((pinmask << 16) | pinmask, GPIO2_OUTPUT); - } else { - au_writel((pinmask << 16) | 0, GPIO2_OUTPUT); - } + if (!strcmp("mtx1:green", led_cdev->name)) + gpio_set_value(211, brightness ? 1 : 0); + else + gpio_set_value(212, brightness ? 1 : 0); } static struct led_classdev mtx1_green_led = { .name = "mtx1:green", - .brightness_set = mtx1_green_led_set, + .brightness_set = mtx1_led_set, }; static struct led_classdev mtx1_red_led = { .name = "mtx1:red", - .flags = 12, - .brightness_set = mtx1_red_led_set, - .default_trigger = "ide-disk", + .brightness_set = mtx1_led_set, }; static int mtx1_leds_probe(struct platform_device *pdev) diff --git a/target/linux/au1000-2.6/patches/001-au1x00_gpio.patch b/target/linux/au1000-2.6/patches/001-au1x00_gpio.patch new file mode 100644 index 0000000000..d4339aec46 --- /dev/null +++ b/target/linux/au1000-2.6/patches/001-au1x00_gpio.patch @@ -0,0 +1,294 @@ +diff -urN linux-2.6.21.1/arch/mips/au1000/common/gpio.c linux-2.6.21.1.new/arch/mips/au1000/common/gpio.c +--- linux-2.6.21.1/arch/mips/au1000/common/gpio.c 2007-04-27 23:49:26.000000000 +0200 ++++ linux-2.6.21.1.new/arch/mips/au1000/common/gpio.c 2007-05-22 21:41:55.000000000 +0200 +@@ -1,4 +1,7 @@ + /* ++ * Copyright (C) 2007, OpenWrt.org, Florian Fainelli ++ * Architecture specific GPIO support ++ * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your +@@ -18,101 +21,133 @@ + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 675 Mass Ave, Cambridge, MA 02139, USA. ++ * ++ * Notes : ++ * au1000 SoC have only one GPIO line : GPIO1 ++ * others have a second one : GPIO2 + */ ++ ++#include ++#include ++#include + #include +-#include +-#include ++ ++#include ++#include ++ ++#include ++#include + + #define gpio1 sys + #if !defined(CONFIG_SOC_AU1000) + static AU1X00_GPIO2 * const gpio2 = (AU1X00_GPIO2 *)GPIO2_BASE; ++#define GPIO2_OUTPUT_ENABLE_MASK 0x00010000 + +-#define GPIO2_OUTPUT_ENABLE_MASK 0x00010000 +- +-int au1xxx_gpio2_read(int signal) ++static int au1xxx_gpio2_read(unsigned gpio) + { +- signal -= 200; +-/* gpio2->dir &= ~(0x01 << signal); //Set GPIO to input */ +- return ((gpio2->pinstate >> signal) & 0x01); ++ gpio -= AU1XXX_GPIO_BASE; ++ return ((gpio2->pinstate >> gpio) & 0x01); + } + +-void au1xxx_gpio2_write(int signal, int value) ++static void au1xxx_gpio2_write(unsigned gpio, int value) + { +- signal -= 200; ++ gpio -= AU1XXX_GPIO_BASE; + +- gpio2->output = (GPIO2_OUTPUT_ENABLE_MASK << signal) | +- (value << signal); ++ gpio2->output = (GPIO2_OUTPUT_ENABLE_MASK << gpio) | ++ (value << gpio); + } + +-void au1xxx_gpio2_tristate(int signal) ++static int au1xxx_gpio2_direction_input(unsigned gpio) + { +- signal -= 200; +- gpio2->dir &= ~(0x01 << signal); /* Set GPIO to input */ ++ gpio -= AU1XXX_GPIO_BASE; ++ gpio2->dir &= ~(0x01 << gpio); ++ return 0; + } +-#endif + +-int au1xxx_gpio1_read(int signal) ++static int au1xxx_gpio2_direction_output(unsigned gpio, int value) ++{ ++ gpio -= AU1XXX_GPIO_BASE; ++ gpio2->dir = (0x01 << gpio) | (value << gpio); ++ return 0; ++} ++ ++#endif /* !defined(CONFIG_SOC_AU1000) */ ++ ++static int au1xxx_gpio1_read(unsigned gpio) + { +-/* gpio1->trioutclr |= (0x01 << signal); */ +- return ((gpio1->pinstaterd >> signal) & 0x01); ++ return ((gpio1->pinstaterd >> gpio) & 0x01); + } + +-void au1xxx_gpio1_write(int signal, int value) ++static void au1xxx_gpio1_write(unsigned gpio, int value) + { + if(value) +- gpio1->outputset = (0x01 << signal); ++ gpio1->outputset = (0x01 << gpio); + else +- gpio1->outputclr = (0x01 << signal); /* Output a Zero */ ++ /* Output a zero */ ++ gpio1->outputclr = (0x01 << gpio); + } + +-void au1xxx_gpio1_tristate(int signal) ++static int au1xxx_gpio1_direction_input(unsigned gpio) + { +- gpio1->trioutclr = (0x01 << signal); /* Tristate signal */ ++ gpio1->pininputen = (0x01 << gpio); ++ return 0; + } + ++static int au1xxx_gpio1_direction_output(unsigned gpio, int value) ++{ ++ gpio1->trioutclr = (0x01 & gpio); ++ return 0; ++} + +-int au1xxx_gpio_read(int signal) ++int au1xxx_gpio_get_value(unsigned gpio) + { +- if(signal >= 200) ++ if(gpio >= AU1XXX_GPIO_BASE) + #if defined(CONFIG_SOC_AU1000) + return 0; + #else +- return au1xxx_gpio2_read(signal); ++ return au1xxx_gpio2_read(gpio); + #endif + else +- return au1xxx_gpio1_read(signal); ++ return au1xxx_gpio1_read(gpio); + } + +-void au1xxx_gpio_write(int signal, int value) ++void au1xxx_gpio_set_value(unsigned gpio, int value) + { +- if(signal >= 200) ++ if(gpio >= AU1XXX_GPIO_BASE) + #if defined(CONFIG_SOC_AU1000) + ; + #else +- au1xxx_gpio2_write(signal, value); ++ au1xxx_gpio2_write(gpio, value); + #endif + else +- au1xxx_gpio1_write(signal, value); ++ au1xxx_gpio1_write(gpio, value); + } + +-void au1xxx_gpio_tristate(int signal) ++int au1xxx_gpio_direction_input(unsigned gpio) + { +- if(signal >= 200) ++ if (gpio >= AU1XXX_GPIO_BASE) + #if defined(CONFIG_SOC_AU1000) + ; + #else +- au1xxx_gpio2_tristate(signal); ++ return au1xxx_gpio2_direction_input(gpio); + #endif + else +- au1xxx_gpio1_tristate(signal); ++ return au1xxx_gpio1_direction_input(gpio); + } + +-void au1xxx_gpio1_set_inputs(void) ++int au1xxx_gpio_direction_output(unsigned gpio, int value) + { +- gpio1->pininputen = 0; ++ if (gpio >= AU1XXX_GPIO_BASE) ++#if defined(CONFIG_SOC_AU1000) ++ ; ++#else ++ return au1xxx_gpio2_direction_output(gpio, value); ++#endif ++ else ++ return au1xxx_gpio1_direction_output(gpio, value); + } + +-EXPORT_SYMBOL(au1xxx_gpio1_set_inputs); +-EXPORT_SYMBOL(au1xxx_gpio_tristate); +-EXPORT_SYMBOL(au1xxx_gpio_write); +-EXPORT_SYMBOL(au1xxx_gpio_read); ++EXPORT_SYMBOL(au1xxx_gpio_direction_output); ++EXPORT_SYMBOL(au1xxx_gpio_direction_input); ++EXPORT_SYMBOL(au1xxx_gpio_get_value); ++EXPORT_SYMBOL(au1xxx_gpio_set_value); +--- linux-2.6.21.1/arch/mips/Kconfig 2007-04-27 23:49:26.000000000 +0200 ++++ linux-2.6.21.1.new/arch/mips/Kconfig 2007-05-21 08:04:42.000000000 +0200 +@@ -1044,6 +1044,7 @@ + select SYS_SUPPORTS_32BIT_KERNEL + select SYS_SUPPORTS_APM_EMULATION + select SYS_SUPPORTS_KGDB ++ select GENERIC_GPIO + + config PNX8550 + bool +diff -urN linux-2.6.21.1/include/asm-mips/mach-au1x00/au1xxx_gpio.h linux-2.6.21.1.new/include/asm-mips/mach-au1x00/au1xxx_gpio.h +--- linux-2.6.21.1/include/asm-mips/mach-au1x00/au1xxx_gpio.h 2007-04-27 23:49:26.000000000 +0200 ++++ linux-2.6.21.1.new/include/asm-mips/mach-au1x00/au1xxx_gpio.h 1970-01-01 01:00:00.000000000 +0100 +@@ -1,20 +0,0 @@ +-#ifndef __AU1XXX_GPIO_H +-#define __AU1XXX_GPIO_H +- +-void au1xxx_gpio1_set_inputs(void); +-void au1xxx_gpio_tristate(int signal); +-void au1xxx_gpio_write(int signal, int value); +-int au1xxx_gpio_read(int signal); +- +-typedef volatile struct +-{ +- u32 dir; +- u32 reserved; +- u32 output; +- u32 pinstate; +- u32 inten; +- u32 enable; +- +-} AU1X00_GPIO2; +- +-#endif //__AU1XXX_GPIO_H +diff -urN linux-2.6.21.1/include/asm-mips/mach-au1x00/gpio.h linux-2.6.21.1.new/include/asm-mips/mach-au1x00/gpio.h +--- linux-2.6.21.1/include/asm-mips/mach-au1x00/gpio.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.21.1.new/include/asm-mips/mach-au1x00/gpio.h 2007-05-21 01:10:22.000000000 +0200 +@@ -0,0 +1,69 @@ ++#ifndef _AU1XXX_GPIO_H_ ++#define _AU1XXX_GPIO_H_ ++ ++#define AU1XXX_GPIO_BASE 200 ++ ++typedef volatile struct ++{ ++ u32 dir; ++ u32 reserved; ++ u32 output; ++ u32 pinstate; ++ u32 inten; ++ u32 enable; ++ ++} AU1X00_GPIO2; ++ ++extern int au1xxx_gpio_get_value(unsigned gpio); ++extern void au1xxx_gpio_set_value(unsigned gpio, int value); ++extern int au1xxx_gpio_direction_input(unsigned gpio); ++extern int au1xxx_gpio_direction_output(unsigned gpio, int value); ++ ++ ++/* Wrappers for the arch-neutral GPIO API */ ++ ++static inline int gpio_request(unsigned gpio, const char *label) ++{ ++ /* Not yet implemented */ ++ return 0; ++} ++ ++static inline void gpio_free(unsigned gpio) ++{ ++ /* Not yet implemented */ ++} ++ ++static inline int gpio_direction_input(unsigned gpio) ++{ ++ return au1xxx_gpio_direction_input(gpio); ++} ++ ++static inline int gpio_direction_output(unsigned gpio, int value) ++{ ++ return au1xxx_gpio_direction_output(gpio, value); ++} ++ ++static inline int gpio_get_value(unsigned gpio) ++{ ++ return au1xxx_gpio_get_value(gpio); ++} ++ ++static inline void gpio_set_value(unsigned gpio, int value) ++{ ++ au1xxx_gpio_set_value(gpio, value); ++} ++ ++static inline int gpio_to_irq(unsigned gpio) ++{ ++ return gpio; ++} ++ ++static inline int irq_to_gpio(unsigned irq) ++{ ++ return irq; ++} ++ ++/* For cansleep */ ++#include ++ ++#endif /* _AU1XXX_GPIO_H_ */ diff --git a/target/linux/generic-2.6/patches/013-mips_generic_gpio_support.patch b/target/linux/generic-2.6/patches/013-mips_generic_gpio_support.patch new file mode 100644 index 0000000000..5e0ae2e708 --- /dev/null +++ b/target/linux/generic-2.6/patches/013-mips_generic_gpio_support.patch @@ -0,0 +1,32 @@ +--- linux-2.6.21.1/arch/mips/Kconfig 2007-04-27 23:49:26.000000000 +0200 ++++ linux-2.6.21.1-owrt/arch/mips/Kconfig 2007-05-24 13:51:13.000000000 +0200 +@@ -869,6 +869,10 @@ + bool + default y + ++config GENERIC_GPIO ++ bool ++ default n ++ + config SCHED_NO_NO_OMIT_FRAME_POINTER + bool + default y +--- linux-2.6.21.1/include/asm-mips/gpio.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.21.1-owrt/include/asm-mips/gpio.h 2007-05-24 13:51:13.000000000 +0200 +@@ -0,0 +1,6 @@ ++#ifndef _ASM_MIPS_GPIO_H ++#define _ASM_MIPS_GPIO_H ++ ++#include ++ ++#endif /* _ASM_MIPS_GPIO_H */ +--- linux-2.6.21.1/arch/mips/defconfig 2007-04-27 23:49:26.000000000 +0200 ++++ linux-2.6.21.1-owrt/arch/mips/defconfig 2007-05-24 14:37:52.000000000 +0200 +@@ -71,6 +71,7 @@ + CONFIG_GENERIC_HWEIGHT=y + CONFIG_GENERIC_CALIBRATE_DELAY=y + CONFIG_GENERIC_TIME=y ++CONFIG_GENERIC_GPIO=n + CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y + # CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ is not set + CONFIG_ARC=y