Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gerg/m68knommu
Pull m68knommu tree from Greg Ungerer: "More merge and clean up of MMU and non-MMU common files, namely signal.c and dma.c. There is also a simplification of the ColdFire GPIO setup tables. Using a couple of simple macros we make the init tables really small and easy to read, and save a couple of thousand lines of code. Also a move of all the ColdFire subarch support files into the existing coldfire directory. The sub-directories just ended up duplicating Makefiles and now only contain really simple pieces of code. This saves quite a few lines of code too. As always a couple of bugs fixes thrown in too. Oh and a new defconfig for the ColdFire platforms that support having the MMU enabled." * 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gerg/m68knommu: (39 commits) m68k: add a defconfig for the M5475EVB ColdFire with MMU board m68knommu: unaligned.h fix for M68000 core m68k: merge the MMU and non-MMU versions of the arch dma code m68knommu: reorganize the no-MMU cache flushing to match m68k m68knommu: move the 54xx platform code into the common ColdFire code directory m68knommu: move the 532x platform code into the common ColdFire code directory m68knommu: move the 5407 platform code into the common ColdFire code directory m68knommu: move the 5307 platform code into the common ColdFire code directory m68knommu: move the 528x platform code into the common ColdFire code directory m68knommu: move the 527x platform code into the common ColdFire code directory m68knommu: move the 5272 platform code into the common ColdFire code directory m68knommu: move the 5249 platform code into the common ColdFire code directory m68knommu: move the 523x platform code into the common ColdFire code directory m68knommu: move the 520x platform code into the common ColdFire code directory m68knommu: move the 5206 platform code into the common ColdFire code directory m68knommu: simplify the ColdFire 5407 GPIO struct setup m68knommu: simplify the ColdFire 532x GPIO struct setup m68knommu: simplify the ColdFire 5307 GPIO struct setup m68knommu: simplify the ColdFire 528x GPIO struct setup m68knommu: simplify the ColdFire 527x GPIO struct setup ...
This commit is contained in:
commit
06930b94d1
|
@ -116,18 +116,6 @@ core-$(CONFIG_M68000) += arch/m68k/platform/68328/
|
||||||
core-$(CONFIG_M68EZ328) += arch/m68k/platform/68EZ328/
|
core-$(CONFIG_M68EZ328) += arch/m68k/platform/68EZ328/
|
||||||
core-$(CONFIG_M68VZ328) += arch/m68k/platform/68VZ328/
|
core-$(CONFIG_M68VZ328) += arch/m68k/platform/68VZ328/
|
||||||
core-$(CONFIG_COLDFIRE) += arch/m68k/platform/coldfire/
|
core-$(CONFIG_COLDFIRE) += arch/m68k/platform/coldfire/
|
||||||
core-$(CONFIG_M5206) += arch/m68k/platform/5206/
|
|
||||||
core-$(CONFIG_M5206e) += arch/m68k/platform/5206/
|
|
||||||
core-$(CONFIG_M520x) += arch/m68k/platform/520x/
|
|
||||||
core-$(CONFIG_M523x) += arch/m68k/platform/523x/
|
|
||||||
core-$(CONFIG_M5249) += arch/m68k/platform/5249/
|
|
||||||
core-$(CONFIG_M527x) += arch/m68k/platform/527x/
|
|
||||||
core-$(CONFIG_M5272) += arch/m68k/platform/5272/
|
|
||||||
core-$(CONFIG_M528x) += arch/m68k/platform/528x/
|
|
||||||
core-$(CONFIG_M5307) += arch/m68k/platform/5307/
|
|
||||||
core-$(CONFIG_M532x) += arch/m68k/platform/532x/
|
|
||||||
core-$(CONFIG_M5407) += arch/m68k/platform/5407/
|
|
||||||
core-$(CONFIG_M54xx) += arch/m68k/platform/54xx/
|
|
||||||
|
|
||||||
|
|
||||||
all: zImage
|
all: zImage
|
||||||
|
|
62
arch/m68k/configs/m5475evb_defconfig
Normal file
62
arch/m68k/configs/m5475evb_defconfig
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
CONFIG_EXPERIMENTAL=y
|
||||||
|
# CONFIG_SWAP is not set
|
||||||
|
CONFIG_LOG_BUF_SHIFT=14
|
||||||
|
CONFIG_SYSFS_DEPRECATED=y
|
||||||
|
CONFIG_SYSFS_DEPRECATED_V2=y
|
||||||
|
CONFIG_SYSCTL_SYSCALL=y
|
||||||
|
# CONFIG_KALLSYMS is not set
|
||||||
|
# CONFIG_HOTPLUG is not set
|
||||||
|
# CONFIG_FUTEX is not set
|
||||||
|
# CONFIG_EPOLL is not set
|
||||||
|
# CONFIG_SIGNALFD is not set
|
||||||
|
# CONFIG_TIMERFD is not set
|
||||||
|
# CONFIG_EVENTFD is not set
|
||||||
|
# CONFIG_SHMEM is not set
|
||||||
|
# CONFIG_AIO is not set
|
||||||
|
CONFIG_EMBEDDED=y
|
||||||
|
CONFIG_MODULES=y
|
||||||
|
# CONFIG_LBDAF is not set
|
||||||
|
# CONFIG_BLK_DEV_BSG is not set
|
||||||
|
# CONFIG_IOSCHED_DEADLINE is not set
|
||||||
|
# CONFIG_IOSCHED_CFQ is not set
|
||||||
|
CONFIG_COLDFIRE=y
|
||||||
|
CONFIG_M547x=y
|
||||||
|
CONFIG_CLOCK_SET=y
|
||||||
|
CONFIG_CLOCK_FREQ=266000000
|
||||||
|
# CONFIG_4KSTACKS is not set
|
||||||
|
CONFIG_RAMBASE=0x0
|
||||||
|
CONFIG_RAMSIZE=0x2000000
|
||||||
|
CONFIG_VECTORBASE=0x0
|
||||||
|
CONFIG_MBAR=0xff000000
|
||||||
|
CONFIG_KERNELBASE=0x20000
|
||||||
|
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
|
||||||
|
# CONFIG_FW_LOADER is not set
|
||||||
|
CONFIG_MTD=y
|
||||||
|
CONFIG_MTD_CHAR=y
|
||||||
|
CONFIG_MTD_BLOCK=y
|
||||||
|
CONFIG_MTD_CFI=y
|
||||||
|
CONFIG_MTD_JEDECPROBE=y
|
||||||
|
CONFIG_MTD_CFI_AMDSTD=y
|
||||||
|
CONFIG_MTD_RAM=y
|
||||||
|
CONFIG_MTD_PHYSMAP=y
|
||||||
|
CONFIG_MTD_UCLINUX=y
|
||||||
|
CONFIG_BLK_DEV_RAM=y
|
||||||
|
# CONFIG_INPUT is not set
|
||||||
|
# CONFIG_VT is not set
|
||||||
|
# CONFIG_UNIX98_PTYS is not set
|
||||||
|
CONFIG_SERIAL_MCF=y
|
||||||
|
CONFIG_SERIAL_MCF_CONSOLE=y
|
||||||
|
# CONFIG_HW_RANDOM is not set
|
||||||
|
# CONFIG_HWMON is not set
|
||||||
|
# CONFIG_USB_SUPPORT is not set
|
||||||
|
# CONFIG_IOMMU_SUPPORT is not set
|
||||||
|
CONFIG_EXT2_FS=y
|
||||||
|
# CONFIG_FILE_LOCKING is not set
|
||||||
|
# CONFIG_DNOTIFY is not set
|
||||||
|
# CONFIG_INOTIFY_USER is not set
|
||||||
|
# CONFIG_PROC_PAGE_MONITOR is not set
|
||||||
|
CONFIG_ROMFS_FS=y
|
||||||
|
CONFIG_ROMFS_BACKED_BY_MTD=y
|
||||||
|
# CONFIG_SCHED_DEBUG is not set
|
||||||
|
CONFIG_BOOTPARAM=y
|
||||||
|
CONFIG_BOOTPARAM_STRING="root=/dev/mtdblock0"
|
|
@ -30,11 +30,8 @@
|
||||||
|
|
||||||
void mcf_cache_push(void);
|
void mcf_cache_push(void);
|
||||||
|
|
||||||
static inline void __flush_cache_all(void)
|
static inline void __clear_cache_all(void)
|
||||||
{
|
{
|
||||||
#ifdef CACHE_PUSH
|
|
||||||
mcf_cache_push();
|
|
||||||
#endif
|
|
||||||
#ifdef CACHE_INVALIDATE
|
#ifdef CACHE_INVALIDATE
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
"movel %0, %%d0\n\t"
|
"movel %0, %%d0\n\t"
|
||||||
|
@ -44,6 +41,14 @@ static inline void __flush_cache_all(void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void __flush_cache_all(void)
|
||||||
|
{
|
||||||
|
#ifdef CACHE_PUSH
|
||||||
|
mcf_cache_push();
|
||||||
|
#endif
|
||||||
|
__clear_cache_all();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Some ColdFire parts implement separate instruction and data caches,
|
* Some ColdFire parts implement separate instruction and data caches,
|
||||||
* on those we should just flush the appropriate cache. If we don't need
|
* on those we should just flush the appropriate cache. If we don't need
|
||||||
|
@ -76,4 +81,23 @@ static inline void __flush_dcache_all(void)
|
||||||
__asm__ __volatile__ ( "nop" );
|
__asm__ __volatile__ ( "nop" );
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Push cache entries at supplied address. We want to write back any dirty
|
||||||
|
* data and the invalidate the cache lines associated with this address.
|
||||||
|
*/
|
||||||
|
static inline void cache_push(unsigned long paddr, int len)
|
||||||
|
{
|
||||||
|
__flush_cache_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Clear cache entries at supplied address (that is don't write back any
|
||||||
|
* dirty data).
|
||||||
|
*/
|
||||||
|
static inline void cache_clear(unsigned long paddr, int len)
|
||||||
|
{
|
||||||
|
__clear_cache_all();
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* _M68KNOMMU_CACHEFLUSH_H */
|
#endif /* _M68KNOMMU_CACHEFLUSH_H */
|
||||||
|
|
|
@ -11,6 +11,11 @@
|
||||||
#define flat_get_addr_from_rp(rp, relval, flags, p) get_unaligned(rp)
|
#define flat_get_addr_from_rp(rp, relval, flags, p) get_unaligned(rp)
|
||||||
#define flat_put_addr_at_rp(rp, val, relval) put_unaligned(val,rp)
|
#define flat_put_addr_at_rp(rp, val, relval) put_unaligned(val,rp)
|
||||||
#define flat_get_relocate_addr(rel) (rel)
|
#define flat_get_relocate_addr(rel) (rel)
|
||||||
#define flat_set_persistent(relval, p) 0
|
|
||||||
|
static inline int flat_set_persistent(unsigned long relval,
|
||||||
|
unsigned long *persistent)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* __M68KNOMMU_FLAT_H__ */
|
#endif /* __M68KNOMMU_FLAT_H__ */
|
||||||
|
|
|
@ -97,100 +97,81 @@
|
||||||
/*
|
/*
|
||||||
* GPIO registers
|
* GPIO registers
|
||||||
*/
|
*/
|
||||||
#define MCFGPIO_PORTA (MCF_IPSBAR + 0x00100000)
|
#define MCFGPIO_PODR_A (MCF_IPSBAR + 0x00100000)
|
||||||
#define MCFGPIO_PORTB (MCF_IPSBAR + 0x00100001)
|
#define MCFGPIO_PODR_B (MCF_IPSBAR + 0x00100001)
|
||||||
#define MCFGPIO_PORTC (MCF_IPSBAR + 0x00100002)
|
#define MCFGPIO_PODR_C (MCF_IPSBAR + 0x00100002)
|
||||||
#define MCFGPIO_PORTD (MCF_IPSBAR + 0x00100003)
|
#define MCFGPIO_PODR_D (MCF_IPSBAR + 0x00100003)
|
||||||
#define MCFGPIO_PORTE (MCF_IPSBAR + 0x00100004)
|
#define MCFGPIO_PODR_E (MCF_IPSBAR + 0x00100004)
|
||||||
#define MCFGPIO_PORTF (MCF_IPSBAR + 0x00100005)
|
#define MCFGPIO_PODR_F (MCF_IPSBAR + 0x00100005)
|
||||||
#define MCFGPIO_PORTG (MCF_IPSBAR + 0x00100006)
|
#define MCFGPIO_PODR_G (MCF_IPSBAR + 0x00100006)
|
||||||
#define MCFGPIO_PORTH (MCF_IPSBAR + 0x00100007)
|
#define MCFGPIO_PODR_H (MCF_IPSBAR + 0x00100007)
|
||||||
#define MCFGPIO_PORTJ (MCF_IPSBAR + 0x00100008)
|
#define MCFGPIO_PODR_J (MCF_IPSBAR + 0x00100008)
|
||||||
#define MCFGPIO_PORTDD (MCF_IPSBAR + 0x00100009)
|
#define MCFGPIO_PODR_DD (MCF_IPSBAR + 0x00100009)
|
||||||
#define MCFGPIO_PORTEH (MCF_IPSBAR + 0x0010000A)
|
#define MCFGPIO_PODR_EH (MCF_IPSBAR + 0x0010000A)
|
||||||
#define MCFGPIO_PORTEL (MCF_IPSBAR + 0x0010000B)
|
#define MCFGPIO_PODR_EL (MCF_IPSBAR + 0x0010000B)
|
||||||
#define MCFGPIO_PORTAS (MCF_IPSBAR + 0x0010000C)
|
#define MCFGPIO_PODR_AS (MCF_IPSBAR + 0x0010000C)
|
||||||
#define MCFGPIO_PORTQS (MCF_IPSBAR + 0x0010000D)
|
#define MCFGPIO_PODR_QS (MCF_IPSBAR + 0x0010000D)
|
||||||
#define MCFGPIO_PORTSD (MCF_IPSBAR + 0x0010000E)
|
#define MCFGPIO_PODR_SD (MCF_IPSBAR + 0x0010000E)
|
||||||
#define MCFGPIO_PORTTC (MCF_IPSBAR + 0x0010000F)
|
#define MCFGPIO_PODR_TC (MCF_IPSBAR + 0x0010000F)
|
||||||
#define MCFGPIO_PORTTD (MCF_IPSBAR + 0x00100010)
|
#define MCFGPIO_PODR_TD (MCF_IPSBAR + 0x00100010)
|
||||||
#define MCFGPIO_PORTUA (MCF_IPSBAR + 0x00100011)
|
#define MCFGPIO_PODR_UA (MCF_IPSBAR + 0x00100011)
|
||||||
|
|
||||||
#define MCFGPIO_DDRA (MCF_IPSBAR + 0x00100014)
|
#define MCFGPIO_PDDR_A (MCF_IPSBAR + 0x00100014)
|
||||||
#define MCFGPIO_DDRB (MCF_IPSBAR + 0x00100015)
|
#define MCFGPIO_PDDR_B (MCF_IPSBAR + 0x00100015)
|
||||||
#define MCFGPIO_DDRC (MCF_IPSBAR + 0x00100016)
|
#define MCFGPIO_PDDR_C (MCF_IPSBAR + 0x00100016)
|
||||||
#define MCFGPIO_DDRD (MCF_IPSBAR + 0x00100017)
|
#define MCFGPIO_PDDR_D (MCF_IPSBAR + 0x00100017)
|
||||||
#define MCFGPIO_DDRE (MCF_IPSBAR + 0x00100018)
|
#define MCFGPIO_PDDR_E (MCF_IPSBAR + 0x00100018)
|
||||||
#define MCFGPIO_DDRF (MCF_IPSBAR + 0x00100019)
|
#define MCFGPIO_PDDR_F (MCF_IPSBAR + 0x00100019)
|
||||||
#define MCFGPIO_DDRG (MCF_IPSBAR + 0x0010001A)
|
#define MCFGPIO_PDDR_G (MCF_IPSBAR + 0x0010001A)
|
||||||
#define MCFGPIO_DDRH (MCF_IPSBAR + 0x0010001B)
|
#define MCFGPIO_PDDR_H (MCF_IPSBAR + 0x0010001B)
|
||||||
#define MCFGPIO_DDRJ (MCF_IPSBAR + 0x0010001C)
|
#define MCFGPIO_PDDR_J (MCF_IPSBAR + 0x0010001C)
|
||||||
#define MCFGPIO_DDRDD (MCF_IPSBAR + 0x0010001D)
|
#define MCFGPIO_PDDR_DD (MCF_IPSBAR + 0x0010001D)
|
||||||
#define MCFGPIO_DDREH (MCF_IPSBAR + 0x0010001E)
|
#define MCFGPIO_PDDR_EH (MCF_IPSBAR + 0x0010001E)
|
||||||
#define MCFGPIO_DDREL (MCF_IPSBAR + 0x0010001F)
|
#define MCFGPIO_PDDR_EL (MCF_IPSBAR + 0x0010001F)
|
||||||
#define MCFGPIO_DDRAS (MCF_IPSBAR + 0x00100020)
|
#define MCFGPIO_PDDR_AS (MCF_IPSBAR + 0x00100020)
|
||||||
#define MCFGPIO_DDRQS (MCF_IPSBAR + 0x00100021)
|
#define MCFGPIO_PDDR_QS (MCF_IPSBAR + 0x00100021)
|
||||||
#define MCFGPIO_DDRSD (MCF_IPSBAR + 0x00100022)
|
#define MCFGPIO_PDDR_SD (MCF_IPSBAR + 0x00100022)
|
||||||
#define MCFGPIO_DDRTC (MCF_IPSBAR + 0x00100023)
|
#define MCFGPIO_PDDR_TC (MCF_IPSBAR + 0x00100023)
|
||||||
#define MCFGPIO_DDRTD (MCF_IPSBAR + 0x00100024)
|
#define MCFGPIO_PDDR_TD (MCF_IPSBAR + 0x00100024)
|
||||||
#define MCFGPIO_DDRUA (MCF_IPSBAR + 0x00100025)
|
#define MCFGPIO_PDDR_UA (MCF_IPSBAR + 0x00100025)
|
||||||
|
|
||||||
#define MCFGPIO_PORTAP (MCF_IPSBAR + 0x00100028)
|
#define MCFGPIO_PPDSDR_A (MCF_IPSBAR + 0x00100028)
|
||||||
#define MCFGPIO_PORTBP (MCF_IPSBAR + 0x00100029)
|
#define MCFGPIO_PPDSDR_B (MCF_IPSBAR + 0x00100029)
|
||||||
#define MCFGPIO_PORTCP (MCF_IPSBAR + 0x0010002A)
|
#define MCFGPIO_PPDSDR_C (MCF_IPSBAR + 0x0010002A)
|
||||||
#define MCFGPIO_PORTDP (MCF_IPSBAR + 0x0010002B)
|
#define MCFGPIO_PPDSDR_D (MCF_IPSBAR + 0x0010002B)
|
||||||
#define MCFGPIO_PORTEP (MCF_IPSBAR + 0x0010002C)
|
#define MCFGPIO_PPDSDR_E (MCF_IPSBAR + 0x0010002C)
|
||||||
#define MCFGPIO_PORTFP (MCF_IPSBAR + 0x0010002D)
|
#define MCFGPIO_PPDSDR_F (MCF_IPSBAR + 0x0010002D)
|
||||||
#define MCFGPIO_PORTGP (MCF_IPSBAR + 0x0010002E)
|
#define MCFGPIO_PPDSDR_G (MCF_IPSBAR + 0x0010002E)
|
||||||
#define MCFGPIO_PORTHP (MCF_IPSBAR + 0x0010002F)
|
#define MCFGPIO_PPDSDR_H (MCF_IPSBAR + 0x0010002F)
|
||||||
#define MCFGPIO_PORTJP (MCF_IPSBAR + 0x00100030)
|
#define MCFGPIO_PPDSDR_J (MCF_IPSBAR + 0x00100030)
|
||||||
#define MCFGPIO_PORTDDP (MCF_IPSBAR + 0x00100031)
|
#define MCFGPIO_PPDSDR_DD (MCF_IPSBAR + 0x00100031)
|
||||||
#define MCFGPIO_PORTEHP (MCF_IPSBAR + 0x00100032)
|
#define MCFGPIO_PPDSDR_EH (MCF_IPSBAR + 0x00100032)
|
||||||
#define MCFGPIO_PORTELP (MCF_IPSBAR + 0x00100033)
|
#define MCFGPIO_PPDSDR_EL (MCF_IPSBAR + 0x00100033)
|
||||||
#define MCFGPIO_PORTASP (MCF_IPSBAR + 0x00100034)
|
#define MCFGPIO_PPDSDR_AS (MCF_IPSBAR + 0x00100034)
|
||||||
#define MCFGPIO_PORTQSP (MCF_IPSBAR + 0x00100035)
|
#define MCFGPIO_PPDSDR_QS (MCF_IPSBAR + 0x00100035)
|
||||||
#define MCFGPIO_PORTSDP (MCF_IPSBAR + 0x00100036)
|
#define MCFGPIO_PPDSDR_SD (MCF_IPSBAR + 0x00100036)
|
||||||
#define MCFGPIO_PORTTCP (MCF_IPSBAR + 0x00100037)
|
#define MCFGPIO_PPDSDR_TC (MCF_IPSBAR + 0x00100037)
|
||||||
#define MCFGPIO_PORTTDP (MCF_IPSBAR + 0x00100038)
|
#define MCFGPIO_PPDSDR_TD (MCF_IPSBAR + 0x00100038)
|
||||||
#define MCFGPIO_PORTUAP (MCF_IPSBAR + 0x00100039)
|
#define MCFGPIO_PPDSDR_UA (MCF_IPSBAR + 0x00100039)
|
||||||
|
|
||||||
#define MCFGPIO_SETA (MCF_IPSBAR + 0x00100028)
|
#define MCFGPIO_PCLRR_A (MCF_IPSBAR + 0x0010003C)
|
||||||
#define MCFGPIO_SETB (MCF_IPSBAR + 0x00100029)
|
#define MCFGPIO_PCLRR_B (MCF_IPSBAR + 0x0010003D)
|
||||||
#define MCFGPIO_SETC (MCF_IPSBAR + 0x0010002A)
|
#define MCFGPIO_PCLRR_C (MCF_IPSBAR + 0x0010003E)
|
||||||
#define MCFGPIO_SETD (MCF_IPSBAR + 0x0010002B)
|
#define MCFGPIO_PCLRR_D (MCF_IPSBAR + 0x0010003F)
|
||||||
#define MCFGPIO_SETE (MCF_IPSBAR + 0x0010002C)
|
#define MCFGPIO_PCLRR_E (MCF_IPSBAR + 0x00100040)
|
||||||
#define MCFGPIO_SETF (MCF_IPSBAR + 0x0010002D)
|
#define MCFGPIO_PCLRR_F (MCF_IPSBAR + 0x00100041)
|
||||||
#define MCFGPIO_SETG (MCF_IPSBAR + 0x0010002E)
|
#define MCFGPIO_PCLRR_G (MCF_IPSBAR + 0x00100042)
|
||||||
#define MCFGPIO_SETH (MCF_IPSBAR + 0x0010002F)
|
#define MCFGPIO_PCLRR_H (MCF_IPSBAR + 0x00100043)
|
||||||
#define MCFGPIO_SETJ (MCF_IPSBAR + 0x00100030)
|
#define MCFGPIO_PCLRR_J (MCF_IPSBAR + 0x00100044)
|
||||||
#define MCFGPIO_SETDD (MCF_IPSBAR + 0x00100031)
|
#define MCFGPIO_PCLRR_DD (MCF_IPSBAR + 0x00100045)
|
||||||
#define MCFGPIO_SETEH (MCF_IPSBAR + 0x00100032)
|
#define MCFGPIO_PCLRR_EH (MCF_IPSBAR + 0x00100046)
|
||||||
#define MCFGPIO_SETEL (MCF_IPSBAR + 0x00100033)
|
#define MCFGPIO_PCLRR_EL (MCF_IPSBAR + 0x00100047)
|
||||||
#define MCFGPIO_SETAS (MCF_IPSBAR + 0x00100034)
|
#define MCFGPIO_PCLRR_AS (MCF_IPSBAR + 0x00100048)
|
||||||
#define MCFGPIO_SETQS (MCF_IPSBAR + 0x00100035)
|
#define MCFGPIO_PCLRR_QS (MCF_IPSBAR + 0x00100049)
|
||||||
#define MCFGPIO_SETSD (MCF_IPSBAR + 0x00100036)
|
#define MCFGPIO_PCLRR_SD (MCF_IPSBAR + 0x0010004A)
|
||||||
#define MCFGPIO_SETTC (MCF_IPSBAR + 0x00100037)
|
#define MCFGPIO_PCLRR_TC (MCF_IPSBAR + 0x0010004B)
|
||||||
#define MCFGPIO_SETTD (MCF_IPSBAR + 0x00100038)
|
#define MCFGPIO_PCLRR_TD (MCF_IPSBAR + 0x0010004C)
|
||||||
#define MCFGPIO_SETUA (MCF_IPSBAR + 0x00100039)
|
#define MCFGPIO_PCLRR_UA (MCF_IPSBAR + 0x0010004D)
|
||||||
|
|
||||||
#define MCFGPIO_CLRA (MCF_IPSBAR + 0x0010003C)
|
|
||||||
#define MCFGPIO_CLRB (MCF_IPSBAR + 0x0010003D)
|
|
||||||
#define MCFGPIO_CLRC (MCF_IPSBAR + 0x0010003E)
|
|
||||||
#define MCFGPIO_CLRD (MCF_IPSBAR + 0x0010003F)
|
|
||||||
#define MCFGPIO_CLRE (MCF_IPSBAR + 0x00100040)
|
|
||||||
#define MCFGPIO_CLRF (MCF_IPSBAR + 0x00100041)
|
|
||||||
#define MCFGPIO_CLRG (MCF_IPSBAR + 0x00100042)
|
|
||||||
#define MCFGPIO_CLRH (MCF_IPSBAR + 0x00100043)
|
|
||||||
#define MCFGPIO_CLRJ (MCF_IPSBAR + 0x00100044)
|
|
||||||
#define MCFGPIO_CLRDD (MCF_IPSBAR + 0x00100045)
|
|
||||||
#define MCFGPIO_CLREH (MCF_IPSBAR + 0x00100046)
|
|
||||||
#define MCFGPIO_CLREL (MCF_IPSBAR + 0x00100047)
|
|
||||||
#define MCFGPIO_CLRAS (MCF_IPSBAR + 0x00100048)
|
|
||||||
#define MCFGPIO_CLRQS (MCF_IPSBAR + 0x00100049)
|
|
||||||
#define MCFGPIO_CLRSD (MCF_IPSBAR + 0x0010004A)
|
|
||||||
#define MCFGPIO_CLRTC (MCF_IPSBAR + 0x0010004B)
|
|
||||||
#define MCFGPIO_CLRTD (MCF_IPSBAR + 0x0010004C)
|
|
||||||
#define MCFGPIO_CLRUA (MCF_IPSBAR + 0x0010004D)
|
|
||||||
|
|
||||||
#define MCFGPIO_PBCDPAR (MCF_IPSBAR + 0x00100050)
|
#define MCFGPIO_PBCDPAR (MCF_IPSBAR + 0x00100050)
|
||||||
#define MCFGPIO_PFPAR (MCF_IPSBAR + 0x00100051)
|
#define MCFGPIO_PFPAR (MCF_IPSBAR + 0x00100051)
|
||||||
|
@ -242,11 +223,11 @@
|
||||||
* definitions for generic gpio support
|
* definitions for generic gpio support
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#define MCFGPIO_PODR MCFGPIO_PORTA /* port output data */
|
#define MCFGPIO_PODR MCFGPIO_PODR_A /* port output data */
|
||||||
#define MCFGPIO_PDDR MCFGPIO_DDRA /* port data direction */
|
#define MCFGPIO_PDDR MCFGPIO_PDDR_A /* port data direction */
|
||||||
#define MCFGPIO_PPDR MCFGPIO_PORTAP /* port pin data */
|
#define MCFGPIO_PPDR MCFGPIO_PPDSDR_A/* port pin data */
|
||||||
#define MCFGPIO_SETR MCFGPIO_SETA /* set output */
|
#define MCFGPIO_SETR MCFGPIO_PPDSDR_A/* set output */
|
||||||
#define MCFGPIO_CLRR MCFGPIO_CLRA /* clr output */
|
#define MCFGPIO_CLRR MCFGPIO_PCLRR_A /* clr output */
|
||||||
|
|
||||||
#define MCFGPIO_IRQ_MAX 8
|
#define MCFGPIO_IRQ_MAX 8
|
||||||
#define MCFGPIO_IRQ_VECBASE MCFINT_VECBASE
|
#define MCFGPIO_IRQ_VECBASE MCFINT_VECBASE
|
||||||
|
|
|
@ -29,6 +29,9 @@ struct mcf_gpio_chip {
|
||||||
const u8 *gpio_to_pinmux;
|
const u8 *gpio_to_pinmux;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern struct mcf_gpio_chip mcf_gpio_chips[];
|
||||||
|
extern unsigned int mcf_gpio_chips_size;
|
||||||
|
|
||||||
int mcf_gpio_direction_input(struct gpio_chip *, unsigned);
|
int mcf_gpio_direction_input(struct gpio_chip *, unsigned);
|
||||||
int mcf_gpio_get_value(struct gpio_chip *, unsigned);
|
int mcf_gpio_get_value(struct gpio_chip *, unsigned);
|
||||||
int mcf_gpio_direction_output(struct gpio_chip *, unsigned, int);
|
int mcf_gpio_direction_output(struct gpio_chip *, unsigned, int);
|
||||||
|
@ -37,4 +40,58 @@ void mcf_gpio_set_value_fast(struct gpio_chip *, unsigned, int);
|
||||||
int mcf_gpio_request(struct gpio_chip *, unsigned);
|
int mcf_gpio_request(struct gpio_chip *, unsigned);
|
||||||
void mcf_gpio_free(struct gpio_chip *, unsigned);
|
void mcf_gpio_free(struct gpio_chip *, unsigned);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Define macros to ease the pain of setting up the GPIO tables. There
|
||||||
|
* are two cases we need to deal with here, they cover all currently
|
||||||
|
* available ColdFire GPIO hardware. There are of course minor differences
|
||||||
|
* in the layout and number of bits in each ColdFire part, but the macros
|
||||||
|
* take all that in.
|
||||||
|
*
|
||||||
|
* Firstly is the conventional GPIO registers where we toggle individual
|
||||||
|
* bits in a register, preserving the other bits in the register. For
|
||||||
|
* lack of a better term I have called this the slow method.
|
||||||
|
*/
|
||||||
|
#define MCFGPS(mlabel, mbase, mngpio, mpddr, mpodr, mppdr) \
|
||||||
|
{ \
|
||||||
|
.gpio_chip = { \
|
||||||
|
.label = #mlabel, \
|
||||||
|
.request = mcf_gpio_request, \
|
||||||
|
.free = mcf_gpio_free, \
|
||||||
|
.direction_input = mcf_gpio_direction_input, \
|
||||||
|
.direction_output = mcf_gpio_direction_output,\
|
||||||
|
.get = mcf_gpio_get_value, \
|
||||||
|
.set = mcf_gpio_set_value, \
|
||||||
|
.base = mbase, \
|
||||||
|
.ngpio = mngpio, \
|
||||||
|
}, \
|
||||||
|
.pddr = (void __iomem *) mpddr, \
|
||||||
|
.podr = (void __iomem *) mpodr, \
|
||||||
|
.ppdr = (void __iomem *) mppdr, \
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Secondly is the faster case, where we have set and clear registers
|
||||||
|
* that allow us to set or clear a bit with a single write, not having
|
||||||
|
* to worry about preserving other bits.
|
||||||
|
*/
|
||||||
|
#define MCFGPF(mlabel, mbase, mngpio) \
|
||||||
|
{ \
|
||||||
|
.gpio_chip = { \
|
||||||
|
.label = #mlabel, \
|
||||||
|
.request = mcf_gpio_request, \
|
||||||
|
.free = mcf_gpio_free, \
|
||||||
|
.direction_input = mcf_gpio_direction_input, \
|
||||||
|
.direction_output = mcf_gpio_direction_output,\
|
||||||
|
.get = mcf_gpio_get_value, \
|
||||||
|
.set = mcf_gpio_set_value_fast, \
|
||||||
|
.base = mbase, \
|
||||||
|
.ngpio = mngpio, \
|
||||||
|
}, \
|
||||||
|
.pddr = (void __iomem *) MCFGPIO_PDDR_##mlabel, \
|
||||||
|
.podr = (void __iomem *) MCFGPIO_PODR_##mlabel, \
|
||||||
|
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_##mlabel, \
|
||||||
|
.setr = (void __iomem *) MCFGPIO_PPDSDR_##mlabel, \
|
||||||
|
.clrr = (void __iomem *) MCFGPIO_PCLRR_##mlabel, \
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#define _ASM_M68K_UNALIGNED_H
|
#define _ASM_M68K_UNALIGNED_H
|
||||||
|
|
||||||
|
|
||||||
#ifdef CONFIG_COLDFIRE
|
#if defined(CONFIG_COLDFIRE) || defined(CONFIG_M68000)
|
||||||
#include <linux/unaligned/be_struct.h>
|
#include <linux/unaligned/be_struct.h>
|
||||||
#include <linux/unaligned/le_byteshift.h>
|
#include <linux/unaligned/le_byteshift.h>
|
||||||
#include <linux/unaligned/generic.h>
|
#include <linux/unaligned/generic.h>
|
||||||
|
|
|
@ -1,5 +1,164 @@
|
||||||
|
/*
|
||||||
|
* This file is subject to the terms and conditions of the GNU General Public
|
||||||
|
* License. See the file COPYING in the main directory of this archive
|
||||||
|
* for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#undef DEBUG
|
||||||
|
|
||||||
|
#include <linux/dma-mapping.h>
|
||||||
|
#include <linux/device.h>
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/scatterlist.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
|
#include <linux/vmalloc.h>
|
||||||
|
#include <linux/export.h>
|
||||||
|
|
||||||
|
#include <asm/pgalloc.h>
|
||||||
|
|
||||||
#ifdef CONFIG_MMU
|
#ifdef CONFIG_MMU
|
||||||
#include "dma_mm.c"
|
|
||||||
|
void *dma_alloc_coherent(struct device *dev, size_t size,
|
||||||
|
dma_addr_t *handle, gfp_t flag)
|
||||||
|
{
|
||||||
|
struct page *page, **map;
|
||||||
|
pgprot_t pgprot;
|
||||||
|
void *addr;
|
||||||
|
int i, order;
|
||||||
|
|
||||||
|
pr_debug("dma_alloc_coherent: %d,%x\n", size, flag);
|
||||||
|
|
||||||
|
size = PAGE_ALIGN(size);
|
||||||
|
order = get_order(size);
|
||||||
|
|
||||||
|
page = alloc_pages(flag, order);
|
||||||
|
if (!page)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
*handle = page_to_phys(page);
|
||||||
|
map = kmalloc(sizeof(struct page *) << order, flag & ~__GFP_DMA);
|
||||||
|
if (!map) {
|
||||||
|
__free_pages(page, order);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
split_page(page, order);
|
||||||
|
|
||||||
|
order = 1 << order;
|
||||||
|
size >>= PAGE_SHIFT;
|
||||||
|
map[0] = page;
|
||||||
|
for (i = 1; i < size; i++)
|
||||||
|
map[i] = page + i;
|
||||||
|
for (; i < order; i++)
|
||||||
|
__free_page(page + i);
|
||||||
|
pgprot = __pgprot(_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_DIRTY);
|
||||||
|
if (CPU_IS_040_OR_060)
|
||||||
|
pgprot_val(pgprot) |= _PAGE_GLOBAL040 | _PAGE_NOCACHE_S;
|
||||||
|
else
|
||||||
|
pgprot_val(pgprot) |= _PAGE_NOCACHE030;
|
||||||
|
addr = vmap(map, size, VM_MAP, pgprot);
|
||||||
|
kfree(map);
|
||||||
|
|
||||||
|
return addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void dma_free_coherent(struct device *dev, size_t size,
|
||||||
|
void *addr, dma_addr_t handle)
|
||||||
|
{
|
||||||
|
pr_debug("dma_free_coherent: %p, %x\n", addr, handle);
|
||||||
|
vfree(addr);
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#include "dma_no.c"
|
|
||||||
#endif
|
#include <asm/cacheflush.h>
|
||||||
|
|
||||||
|
void *dma_alloc_coherent(struct device *dev, size_t size,
|
||||||
|
dma_addr_t *dma_handle, gfp_t gfp)
|
||||||
|
{
|
||||||
|
void *ret;
|
||||||
|
/* ignore region specifiers */
|
||||||
|
gfp &= ~(__GFP_DMA | __GFP_HIGHMEM);
|
||||||
|
|
||||||
|
if (dev == NULL || (*dev->dma_mask < 0xffffffff))
|
||||||
|
gfp |= GFP_DMA;
|
||||||
|
ret = (void *)__get_free_pages(gfp, get_order(size));
|
||||||
|
|
||||||
|
if (ret != NULL) {
|
||||||
|
memset(ret, 0, size);
|
||||||
|
*dma_handle = virt_to_phys(ret);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void dma_free_coherent(struct device *dev, size_t size,
|
||||||
|
void *vaddr, dma_addr_t dma_handle)
|
||||||
|
{
|
||||||
|
free_pages((unsigned long)vaddr, get_order(size));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_MMU */
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(dma_alloc_coherent);
|
||||||
|
EXPORT_SYMBOL(dma_free_coherent);
|
||||||
|
|
||||||
|
void dma_sync_single_for_device(struct device *dev, dma_addr_t handle,
|
||||||
|
size_t size, enum dma_data_direction dir)
|
||||||
|
{
|
||||||
|
switch (dir) {
|
||||||
|
case DMA_TO_DEVICE:
|
||||||
|
cache_push(handle, size);
|
||||||
|
break;
|
||||||
|
case DMA_FROM_DEVICE:
|
||||||
|
cache_clear(handle, size);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (printk_ratelimit())
|
||||||
|
printk("dma_sync_single_for_device: unsupported dir %u\n", dir);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(dma_sync_single_for_device);
|
||||||
|
|
||||||
|
void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nents,
|
||||||
|
enum dma_data_direction dir)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < nents; sg++, i++)
|
||||||
|
dma_sync_single_for_device(dev, sg->dma_address, sg->length, dir);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(dma_sync_sg_for_device);
|
||||||
|
|
||||||
|
dma_addr_t dma_map_single(struct device *dev, void *addr, size_t size,
|
||||||
|
enum dma_data_direction dir)
|
||||||
|
{
|
||||||
|
dma_addr_t handle = virt_to_bus(addr);
|
||||||
|
|
||||||
|
dma_sync_single_for_device(dev, handle, size, dir);
|
||||||
|
return handle;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(dma_map_single);
|
||||||
|
|
||||||
|
dma_addr_t dma_map_page(struct device *dev, struct page *page,
|
||||||
|
unsigned long offset, size_t size,
|
||||||
|
enum dma_data_direction dir)
|
||||||
|
{
|
||||||
|
dma_addr_t handle = page_to_phys(page) + offset;
|
||||||
|
|
||||||
|
dma_sync_single_for_device(dev, handle, size, dir);
|
||||||
|
return handle;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(dma_map_page);
|
||||||
|
|
||||||
|
int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
|
||||||
|
enum dma_data_direction dir)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < nents; sg++, i++) {
|
||||||
|
sg->dma_address = sg_phys(sg);
|
||||||
|
dma_sync_single_for_device(dev, sg->dma_address, sg->length, dir);
|
||||||
|
}
|
||||||
|
return nents;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(dma_map_sg);
|
||||||
|
|
|
@ -1,131 +0,0 @@
|
||||||
/*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file COPYING in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#undef DEBUG
|
|
||||||
|
|
||||||
#include <linux/dma-mapping.h>
|
|
||||||
#include <linux/device.h>
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/scatterlist.h>
|
|
||||||
#include <linux/slab.h>
|
|
||||||
#include <linux/vmalloc.h>
|
|
||||||
#include <linux/export.h>
|
|
||||||
|
|
||||||
#include <asm/pgalloc.h>
|
|
||||||
|
|
||||||
void *dma_alloc_coherent(struct device *dev, size_t size,
|
|
||||||
dma_addr_t *handle, gfp_t flag)
|
|
||||||
{
|
|
||||||
struct page *page, **map;
|
|
||||||
pgprot_t pgprot;
|
|
||||||
void *addr;
|
|
||||||
int i, order;
|
|
||||||
|
|
||||||
pr_debug("dma_alloc_coherent: %d,%x\n", size, flag);
|
|
||||||
|
|
||||||
size = PAGE_ALIGN(size);
|
|
||||||
order = get_order(size);
|
|
||||||
|
|
||||||
page = alloc_pages(flag, order);
|
|
||||||
if (!page)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
*handle = page_to_phys(page);
|
|
||||||
map = kmalloc(sizeof(struct page *) << order, flag & ~__GFP_DMA);
|
|
||||||
if (!map) {
|
|
||||||
__free_pages(page, order);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
split_page(page, order);
|
|
||||||
|
|
||||||
order = 1 << order;
|
|
||||||
size >>= PAGE_SHIFT;
|
|
||||||
map[0] = page;
|
|
||||||
for (i = 1; i < size; i++)
|
|
||||||
map[i] = page + i;
|
|
||||||
for (; i < order; i++)
|
|
||||||
__free_page(page + i);
|
|
||||||
pgprot = __pgprot(_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_DIRTY);
|
|
||||||
if (CPU_IS_040_OR_060)
|
|
||||||
pgprot_val(pgprot) |= _PAGE_GLOBAL040 | _PAGE_NOCACHE_S;
|
|
||||||
else
|
|
||||||
pgprot_val(pgprot) |= _PAGE_NOCACHE030;
|
|
||||||
addr = vmap(map, size, VM_MAP, pgprot);
|
|
||||||
kfree(map);
|
|
||||||
|
|
||||||
return addr;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(dma_alloc_coherent);
|
|
||||||
|
|
||||||
void dma_free_coherent(struct device *dev, size_t size,
|
|
||||||
void *addr, dma_addr_t handle)
|
|
||||||
{
|
|
||||||
pr_debug("dma_free_coherent: %p, %x\n", addr, handle);
|
|
||||||
vfree(addr);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(dma_free_coherent);
|
|
||||||
|
|
||||||
void dma_sync_single_for_device(struct device *dev, dma_addr_t handle,
|
|
||||||
size_t size, enum dma_data_direction dir)
|
|
||||||
{
|
|
||||||
switch (dir) {
|
|
||||||
case DMA_TO_DEVICE:
|
|
||||||
cache_push(handle, size);
|
|
||||||
break;
|
|
||||||
case DMA_FROM_DEVICE:
|
|
||||||
cache_clear(handle, size);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if (printk_ratelimit())
|
|
||||||
printk("dma_sync_single_for_device: unsupported dir %u\n", dir);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(dma_sync_single_for_device);
|
|
||||||
|
|
||||||
void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nents,
|
|
||||||
enum dma_data_direction dir)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < nents; sg++, i++)
|
|
||||||
dma_sync_single_for_device(dev, sg->dma_address, sg->length, dir);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(dma_sync_sg_for_device);
|
|
||||||
|
|
||||||
dma_addr_t dma_map_single(struct device *dev, void *addr, size_t size,
|
|
||||||
enum dma_data_direction dir)
|
|
||||||
{
|
|
||||||
dma_addr_t handle = virt_to_bus(addr);
|
|
||||||
|
|
||||||
dma_sync_single_for_device(dev, handle, size, dir);
|
|
||||||
return handle;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(dma_map_single);
|
|
||||||
|
|
||||||
dma_addr_t dma_map_page(struct device *dev, struct page *page,
|
|
||||||
unsigned long offset, size_t size,
|
|
||||||
enum dma_data_direction dir)
|
|
||||||
{
|
|
||||||
dma_addr_t handle = page_to_phys(page) + offset;
|
|
||||||
|
|
||||||
dma_sync_single_for_device(dev, handle, size, dir);
|
|
||||||
return handle;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(dma_map_page);
|
|
||||||
|
|
||||||
int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
|
|
||||||
enum dma_data_direction dir)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < nents; sg++, i++) {
|
|
||||||
sg->dma_address = sg_phys(sg);
|
|
||||||
dma_sync_single_for_device(dev, sg->dma_address, sg->length, dir);
|
|
||||||
}
|
|
||||||
return nents;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(dma_map_sg);
|
|
|
@ -1,75 +0,0 @@
|
||||||
/*
|
|
||||||
* Dynamic DMA mapping support.
|
|
||||||
*
|
|
||||||
* We never have any address translations to worry about, so this
|
|
||||||
* is just alloc/free.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/types.h>
|
|
||||||
#include <linux/gfp.h>
|
|
||||||
#include <linux/mm.h>
|
|
||||||
#include <linux/device.h>
|
|
||||||
#include <linux/dma-mapping.h>
|
|
||||||
#include <linux/export.h>
|
|
||||||
#include <asm/cacheflush.h>
|
|
||||||
|
|
||||||
void *dma_alloc_coherent(struct device *dev, size_t size,
|
|
||||||
dma_addr_t *dma_handle, gfp_t gfp)
|
|
||||||
{
|
|
||||||
void *ret;
|
|
||||||
/* ignore region specifiers */
|
|
||||||
gfp &= ~(__GFP_DMA | __GFP_HIGHMEM);
|
|
||||||
|
|
||||||
if (dev == NULL || (*dev->dma_mask < 0xffffffff))
|
|
||||||
gfp |= GFP_DMA;
|
|
||||||
ret = (void *)__get_free_pages(gfp, get_order(size));
|
|
||||||
|
|
||||||
if (ret != NULL) {
|
|
||||||
memset(ret, 0, size);
|
|
||||||
*dma_handle = virt_to_phys(ret);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void dma_free_coherent(struct device *dev, size_t size,
|
|
||||||
void *vaddr, dma_addr_t dma_handle)
|
|
||||||
{
|
|
||||||
free_pages((unsigned long)vaddr, get_order(size));
|
|
||||||
}
|
|
||||||
|
|
||||||
void dma_sync_single_for_device(struct device *dev, dma_addr_t handle,
|
|
||||||
size_t size, enum dma_data_direction dir)
|
|
||||||
{
|
|
||||||
switch (dir) {
|
|
||||||
case DMA_TO_DEVICE:
|
|
||||||
flush_dcache_range(handle, size);
|
|
||||||
break;
|
|
||||||
case DMA_FROM_DEVICE:
|
|
||||||
/* Should be clear already */
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if (printk_ratelimit())
|
|
||||||
printk("dma_sync_single_for_device: unsupported dir %u\n", dir);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_SYMBOL(dma_sync_single_for_device);
|
|
||||||
dma_addr_t dma_map_single(struct device *dev, void *addr, size_t size,
|
|
||||||
enum dma_data_direction dir)
|
|
||||||
{
|
|
||||||
dma_addr_t handle = virt_to_phys(addr);
|
|
||||||
flush_dcache_range(handle, size);
|
|
||||||
return handle;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(dma_map_single);
|
|
||||||
|
|
||||||
dma_addr_t dma_map_page(struct device *dev, struct page *page,
|
|
||||||
unsigned long offset, size_t size,
|
|
||||||
enum dma_data_direction dir)
|
|
||||||
{
|
|
||||||
dma_addr_t handle = page_to_phys(page) + offset;
|
|
||||||
dma_sync_single_for_device(dev, handle, size, dir);
|
|
||||||
return handle;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(dma_map_page);
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -1,765 +0,0 @@
|
||||||
/*
|
|
||||||
* linux/arch/m68knommu/kernel/signal.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 1991, 1992 Linus Torvalds
|
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file COPYING in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Linux/m68k support by Hamish Macdonald
|
|
||||||
*
|
|
||||||
* 68060 fixes by Jesper Skov
|
|
||||||
*
|
|
||||||
* 1997-12-01 Modified for POSIX.1b signals by Andreas Schwab
|
|
||||||
*
|
|
||||||
* mathemu support by Roman Zippel
|
|
||||||
* (Note: fpstate in the signal context is completely ignored for the emulator
|
|
||||||
* and the internal floating point format is put on stack)
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ++roman (07/09/96): implemented signal stacks (specially for tosemu on
|
|
||||||
* Atari :-) Current limitation: Only one sigstack can be active at one time.
|
|
||||||
* If a second signal with SA_ONSTACK set arrives while working on a sigstack,
|
|
||||||
* SA_ONSTACK is ignored. This behaviour avoids lots of trouble with nested
|
|
||||||
* signal handlers!
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/sched.h>
|
|
||||||
#include <linux/mm.h>
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/signal.h>
|
|
||||||
#include <linux/syscalls.h>
|
|
||||||
#include <linux/errno.h>
|
|
||||||
#include <linux/wait.h>
|
|
||||||
#include <linux/ptrace.h>
|
|
||||||
#include <linux/unistd.h>
|
|
||||||
#include <linux/stddef.h>
|
|
||||||
#include <linux/highuid.h>
|
|
||||||
#include <linux/tty.h>
|
|
||||||
#include <linux/personality.h>
|
|
||||||
#include <linux/binfmts.h>
|
|
||||||
|
|
||||||
#include <asm/setup.h>
|
|
||||||
#include <asm/uaccess.h>
|
|
||||||
#include <asm/pgtable.h>
|
|
||||||
#include <asm/traps.h>
|
|
||||||
#include <asm/ucontext.h>
|
|
||||||
|
|
||||||
#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
|
|
||||||
|
|
||||||
void ret_from_user_signal(void);
|
|
||||||
void ret_from_user_rt_signal(void);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Atomically swap in the new signal mask, and wait for a signal.
|
|
||||||
*/
|
|
||||||
asmlinkage int
|
|
||||||
sys_sigsuspend(int unused0, int unused1, old_sigset_t mask)
|
|
||||||
{
|
|
||||||
mask &= _BLOCKABLE;
|
|
||||||
spin_lock_irq(¤t->sighand->siglock);
|
|
||||||
current->saved_sigmask = current->blocked;
|
|
||||||
siginitset(¤t->blocked, mask);
|
|
||||||
recalc_sigpending();
|
|
||||||
spin_unlock_irq(¤t->sighand->siglock);
|
|
||||||
|
|
||||||
current->state = TASK_INTERRUPTIBLE;
|
|
||||||
schedule();
|
|
||||||
set_restore_sigmask();
|
|
||||||
|
|
||||||
return -ERESTARTNOHAND;
|
|
||||||
}
|
|
||||||
|
|
||||||
asmlinkage int
|
|
||||||
sys_sigaction(int sig, const struct old_sigaction __user *act,
|
|
||||||
struct old_sigaction __user *oact)
|
|
||||||
{
|
|
||||||
struct k_sigaction new_ka, old_ka;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (act) {
|
|
||||||
old_sigset_t mask;
|
|
||||||
if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
|
|
||||||
__get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
|
|
||||||
__get_user(new_ka.sa.sa_restorer, &act->sa_restorer) ||
|
|
||||||
__get_user(new_ka.sa.sa_flags, &act->sa_flags) ||
|
|
||||||
__get_user(mask, &act->sa_mask))
|
|
||||||
return -EFAULT;
|
|
||||||
siginitset(&new_ka.sa.sa_mask, mask);
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
|
|
||||||
|
|
||||||
if (!ret && oact) {
|
|
||||||
if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
|
|
||||||
__put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
|
|
||||||
__put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) ||
|
|
||||||
__put_user(old_ka.sa.sa_flags, &oact->sa_flags) ||
|
|
||||||
__put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask))
|
|
||||||
return -EFAULT;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
asmlinkage int
|
|
||||||
sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss)
|
|
||||||
{
|
|
||||||
return do_sigaltstack(uss, uoss, rdusp());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Do a signal return; undo the signal stack.
|
|
||||||
*
|
|
||||||
* Keep the return code on the stack quadword aligned!
|
|
||||||
* That makes the cache flush below easier.
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct sigframe
|
|
||||||
{
|
|
||||||
char __user *pretcode;
|
|
||||||
int sig;
|
|
||||||
int code;
|
|
||||||
struct sigcontext __user *psc;
|
|
||||||
char retcode[8];
|
|
||||||
unsigned long extramask[_NSIG_WORDS-1];
|
|
||||||
struct sigcontext sc;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct rt_sigframe
|
|
||||||
{
|
|
||||||
char __user *pretcode;
|
|
||||||
int sig;
|
|
||||||
struct siginfo __user *pinfo;
|
|
||||||
void __user *puc;
|
|
||||||
char retcode[8];
|
|
||||||
struct siginfo info;
|
|
||||||
struct ucontext uc;
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef CONFIG_FPU
|
|
||||||
|
|
||||||
static unsigned char fpu_version = 0; /* version number of fpu, set by setup_frame */
|
|
||||||
|
|
||||||
static inline int restore_fpu_state(struct sigcontext *sc)
|
|
||||||
{
|
|
||||||
int err = 1;
|
|
||||||
|
|
||||||
if (FPU_IS_EMU) {
|
|
||||||
/* restore registers */
|
|
||||||
memcpy(current->thread.fpcntl, sc->sc_fpcntl, 12);
|
|
||||||
memcpy(current->thread.fp, sc->sc_fpregs, 24);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sc->sc_fpstate[0]) {
|
|
||||||
/* Verify the frame format. */
|
|
||||||
if (sc->sc_fpstate[0] != fpu_version)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
__asm__ volatile (".chip 68k/68881\n\t"
|
|
||||||
"fmovemx %0,%%fp0-%%fp1\n\t"
|
|
||||||
"fmoveml %1,%%fpcr/%%fpsr/%%fpiar\n\t"
|
|
||||||
".chip 68k"
|
|
||||||
: /* no outputs */
|
|
||||||
: "m" (*sc->sc_fpregs), "m" (*sc->sc_fpcntl));
|
|
||||||
}
|
|
||||||
__asm__ volatile (".chip 68k/68881\n\t"
|
|
||||||
"frestore %0\n\t"
|
|
||||||
".chip 68k" : : "m" (*sc->sc_fpstate));
|
|
||||||
err = 0;
|
|
||||||
|
|
||||||
out:
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define FPCONTEXT_SIZE 216
|
|
||||||
#define uc_fpstate uc_filler[0]
|
|
||||||
#define uc_formatvec uc_filler[FPCONTEXT_SIZE/4]
|
|
||||||
#define uc_extra uc_filler[FPCONTEXT_SIZE/4+1]
|
|
||||||
|
|
||||||
static inline int rt_restore_fpu_state(struct ucontext __user *uc)
|
|
||||||
{
|
|
||||||
unsigned char fpstate[FPCONTEXT_SIZE];
|
|
||||||
int context_size = 0;
|
|
||||||
fpregset_t fpregs;
|
|
||||||
int err = 1;
|
|
||||||
|
|
||||||
if (FPU_IS_EMU) {
|
|
||||||
/* restore fpu control register */
|
|
||||||
if (__copy_from_user(current->thread.fpcntl,
|
|
||||||
uc->uc_mcontext.fpregs.f_fpcntl, 12))
|
|
||||||
goto out;
|
|
||||||
/* restore all other fpu register */
|
|
||||||
if (__copy_from_user(current->thread.fp,
|
|
||||||
uc->uc_mcontext.fpregs.f_fpregs, 96))
|
|
||||||
goto out;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (__get_user(*(long *)fpstate, (long __user *)&uc->uc_fpstate))
|
|
||||||
goto out;
|
|
||||||
if (fpstate[0]) {
|
|
||||||
context_size = fpstate[1];
|
|
||||||
|
|
||||||
/* Verify the frame format. */
|
|
||||||
if (fpstate[0] != fpu_version)
|
|
||||||
goto out;
|
|
||||||
if (__copy_from_user(&fpregs, &uc->uc_mcontext.fpregs,
|
|
||||||
sizeof(fpregs)))
|
|
||||||
goto out;
|
|
||||||
__asm__ volatile (".chip 68k/68881\n\t"
|
|
||||||
"fmovemx %0,%%fp0-%%fp7\n\t"
|
|
||||||
"fmoveml %1,%%fpcr/%%fpsr/%%fpiar\n\t"
|
|
||||||
".chip 68k"
|
|
||||||
: /* no outputs */
|
|
||||||
: "m" (*fpregs.f_fpregs),
|
|
||||||
"m" (*fpregs.f_fpcntl));
|
|
||||||
}
|
|
||||||
if (context_size &&
|
|
||||||
__copy_from_user(fpstate + 4, (long __user *)&uc->uc_fpstate + 1,
|
|
||||||
context_size))
|
|
||||||
goto out;
|
|
||||||
__asm__ volatile (".chip 68k/68881\n\t"
|
|
||||||
"frestore %0\n\t"
|
|
||||||
".chip 68k" : : "m" (*fpstate));
|
|
||||||
err = 0;
|
|
||||||
|
|
||||||
out:
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *usc, void __user *fp,
|
|
||||||
int *pd0)
|
|
||||||
{
|
|
||||||
int formatvec;
|
|
||||||
struct sigcontext context;
|
|
||||||
int err = 0;
|
|
||||||
|
|
||||||
/* Always make any pending restarted system calls return -EINTR */
|
|
||||||
current_thread_info()->restart_block.fn = do_no_restart_syscall;
|
|
||||||
|
|
||||||
/* get previous context */
|
|
||||||
if (copy_from_user(&context, usc, sizeof(context)))
|
|
||||||
goto badframe;
|
|
||||||
|
|
||||||
/* restore passed registers */
|
|
||||||
regs->d1 = context.sc_d1;
|
|
||||||
regs->a0 = context.sc_a0;
|
|
||||||
regs->a1 = context.sc_a1;
|
|
||||||
((struct switch_stack *)regs - 1)->a5 = context.sc_a5;
|
|
||||||
regs->sr = (regs->sr & 0xff00) | (context.sc_sr & 0xff);
|
|
||||||
regs->pc = context.sc_pc;
|
|
||||||
regs->orig_d0 = -1; /* disable syscall checks */
|
|
||||||
wrusp(context.sc_usp);
|
|
||||||
formatvec = context.sc_formatvec;
|
|
||||||
regs->format = formatvec >> 12;
|
|
||||||
regs->vector = formatvec & 0xfff;
|
|
||||||
|
|
||||||
#ifdef CONFIG_FPU
|
|
||||||
err = restore_fpu_state(&context);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
*pd0 = context.sc_d0;
|
|
||||||
return err;
|
|
||||||
|
|
||||||
badframe:
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
rt_restore_ucontext(struct pt_regs *regs, struct switch_stack *sw,
|
|
||||||
struct ucontext __user *uc, int *pd0)
|
|
||||||
{
|
|
||||||
int temp;
|
|
||||||
greg_t __user *gregs = uc->uc_mcontext.gregs;
|
|
||||||
unsigned long usp;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
/* Always make any pending restarted system calls return -EINTR */
|
|
||||||
current_thread_info()->restart_block.fn = do_no_restart_syscall;
|
|
||||||
|
|
||||||
err = __get_user(temp, &uc->uc_mcontext.version);
|
|
||||||
if (temp != MCONTEXT_VERSION)
|
|
||||||
goto badframe;
|
|
||||||
/* restore passed registers */
|
|
||||||
err |= __get_user(regs->d0, &gregs[0]);
|
|
||||||
err |= __get_user(regs->d1, &gregs[1]);
|
|
||||||
err |= __get_user(regs->d2, &gregs[2]);
|
|
||||||
err |= __get_user(regs->d3, &gregs[3]);
|
|
||||||
err |= __get_user(regs->d4, &gregs[4]);
|
|
||||||
err |= __get_user(regs->d5, &gregs[5]);
|
|
||||||
err |= __get_user(sw->d6, &gregs[6]);
|
|
||||||
err |= __get_user(sw->d7, &gregs[7]);
|
|
||||||
err |= __get_user(regs->a0, &gregs[8]);
|
|
||||||
err |= __get_user(regs->a1, &gregs[9]);
|
|
||||||
err |= __get_user(regs->a2, &gregs[10]);
|
|
||||||
err |= __get_user(sw->a3, &gregs[11]);
|
|
||||||
err |= __get_user(sw->a4, &gregs[12]);
|
|
||||||
err |= __get_user(sw->a5, &gregs[13]);
|
|
||||||
err |= __get_user(sw->a6, &gregs[14]);
|
|
||||||
err |= __get_user(usp, &gregs[15]);
|
|
||||||
wrusp(usp);
|
|
||||||
err |= __get_user(regs->pc, &gregs[16]);
|
|
||||||
err |= __get_user(temp, &gregs[17]);
|
|
||||||
regs->sr = (regs->sr & 0xff00) | (temp & 0xff);
|
|
||||||
regs->orig_d0 = -1; /* disable syscall checks */
|
|
||||||
regs->format = temp >> 12;
|
|
||||||
regs->vector = temp & 0xfff;
|
|
||||||
|
|
||||||
if (do_sigaltstack(&uc->uc_stack, NULL, usp) == -EFAULT)
|
|
||||||
goto badframe;
|
|
||||||
|
|
||||||
*pd0 = regs->d0;
|
|
||||||
return err;
|
|
||||||
|
|
||||||
badframe:
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
asmlinkage int do_sigreturn(unsigned long __unused)
|
|
||||||
{
|
|
||||||
struct switch_stack *sw = (struct switch_stack *) &__unused;
|
|
||||||
struct pt_regs *regs = (struct pt_regs *) (sw + 1);
|
|
||||||
unsigned long usp = rdusp();
|
|
||||||
struct sigframe __user *frame = (struct sigframe __user *)(usp - 4);
|
|
||||||
sigset_t set;
|
|
||||||
int d0;
|
|
||||||
|
|
||||||
if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
|
|
||||||
goto badframe;
|
|
||||||
if (__get_user(set.sig[0], &frame->sc.sc_mask) ||
|
|
||||||
(_NSIG_WORDS > 1 &&
|
|
||||||
__copy_from_user(&set.sig[1], &frame->extramask,
|
|
||||||
sizeof(frame->extramask))))
|
|
||||||
goto badframe;
|
|
||||||
|
|
||||||
sigdelsetmask(&set, ~_BLOCKABLE);
|
|
||||||
spin_lock_irq(¤t->sighand->siglock);
|
|
||||||
current->blocked = set;
|
|
||||||
recalc_sigpending();
|
|
||||||
spin_unlock_irq(¤t->sighand->siglock);
|
|
||||||
|
|
||||||
if (restore_sigcontext(regs, &frame->sc, frame + 1, &d0))
|
|
||||||
goto badframe;
|
|
||||||
return d0;
|
|
||||||
|
|
||||||
badframe:
|
|
||||||
force_sig(SIGSEGV, current);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
asmlinkage int do_rt_sigreturn(unsigned long __unused)
|
|
||||||
{
|
|
||||||
struct switch_stack *sw = (struct switch_stack *) &__unused;
|
|
||||||
struct pt_regs *regs = (struct pt_regs *) (sw + 1);
|
|
||||||
unsigned long usp = rdusp();
|
|
||||||
struct rt_sigframe __user *frame = (struct rt_sigframe __user *)(usp - 4);
|
|
||||||
sigset_t set;
|
|
||||||
int d0;
|
|
||||||
|
|
||||||
if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
|
|
||||||
goto badframe;
|
|
||||||
if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
|
|
||||||
goto badframe;
|
|
||||||
|
|
||||||
sigdelsetmask(&set, ~_BLOCKABLE);
|
|
||||||
spin_lock_irq(¤t->sighand->siglock);
|
|
||||||
current->blocked = set;
|
|
||||||
recalc_sigpending();
|
|
||||||
spin_unlock_irq(¤t->sighand->siglock);
|
|
||||||
|
|
||||||
if (rt_restore_ucontext(regs, sw, &frame->uc, &d0))
|
|
||||||
goto badframe;
|
|
||||||
return d0;
|
|
||||||
|
|
||||||
badframe:
|
|
||||||
force_sig(SIGSEGV, current);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_FPU
|
|
||||||
/*
|
|
||||||
* Set up a signal frame.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static inline void save_fpu_state(struct sigcontext *sc, struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
if (FPU_IS_EMU) {
|
|
||||||
/* save registers */
|
|
||||||
memcpy(sc->sc_fpcntl, current->thread.fpcntl, 12);
|
|
||||||
memcpy(sc->sc_fpregs, current->thread.fp, 24);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
__asm__ volatile (".chip 68k/68881\n\t"
|
|
||||||
"fsave %0\n\t"
|
|
||||||
".chip 68k"
|
|
||||||
: : "m" (*sc->sc_fpstate) : "memory");
|
|
||||||
|
|
||||||
if (sc->sc_fpstate[0]) {
|
|
||||||
fpu_version = sc->sc_fpstate[0];
|
|
||||||
__asm__ volatile (".chip 68k/68881\n\t"
|
|
||||||
"fmovemx %%fp0-%%fp1,%0\n\t"
|
|
||||||
"fmoveml %%fpcr/%%fpsr/%%fpiar,%1\n\t"
|
|
||||||
".chip 68k"
|
|
||||||
: "=m" (*sc->sc_fpregs),
|
|
||||||
"=m" (*sc->sc_fpcntl)
|
|
||||||
: /* no inputs */
|
|
||||||
: "memory");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int rt_save_fpu_state(struct ucontext __user *uc, struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
unsigned char fpstate[FPCONTEXT_SIZE];
|
|
||||||
int context_size = 0;
|
|
||||||
int err = 0;
|
|
||||||
|
|
||||||
if (FPU_IS_EMU) {
|
|
||||||
/* save fpu control register */
|
|
||||||
err |= copy_to_user(uc->uc_mcontext.fpregs.f_pcntl,
|
|
||||||
current->thread.fpcntl, 12);
|
|
||||||
/* save all other fpu register */
|
|
||||||
err |= copy_to_user(uc->uc_mcontext.fpregs.f_fpregs,
|
|
||||||
current->thread.fp, 96);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
__asm__ volatile (".chip 68k/68881\n\t"
|
|
||||||
"fsave %0\n\t"
|
|
||||||
".chip 68k"
|
|
||||||
: : "m" (*fpstate) : "memory");
|
|
||||||
|
|
||||||
err |= __put_user(*(long *)fpstate, (long __user *)&uc->uc_fpstate);
|
|
||||||
if (fpstate[0]) {
|
|
||||||
fpregset_t fpregs;
|
|
||||||
context_size = fpstate[1];
|
|
||||||
fpu_version = fpstate[0];
|
|
||||||
__asm__ volatile (".chip 68k/68881\n\t"
|
|
||||||
"fmovemx %%fp0-%%fp7,%0\n\t"
|
|
||||||
"fmoveml %%fpcr/%%fpsr/%%fpiar,%1\n\t"
|
|
||||||
".chip 68k"
|
|
||||||
: "=m" (*fpregs.f_fpregs),
|
|
||||||
"=m" (*fpregs.f_fpcntl)
|
|
||||||
: /* no inputs */
|
|
||||||
: "memory");
|
|
||||||
err |= copy_to_user(&uc->uc_mcontext.fpregs, &fpregs,
|
|
||||||
sizeof(fpregs));
|
|
||||||
}
|
|
||||||
if (context_size)
|
|
||||||
err |= copy_to_user((long __user *)&uc->uc_fpstate + 1, fpstate + 4,
|
|
||||||
context_size);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs,
|
|
||||||
unsigned long mask)
|
|
||||||
{
|
|
||||||
sc->sc_mask = mask;
|
|
||||||
sc->sc_usp = rdusp();
|
|
||||||
sc->sc_d0 = regs->d0;
|
|
||||||
sc->sc_d1 = regs->d1;
|
|
||||||
sc->sc_a0 = regs->a0;
|
|
||||||
sc->sc_a1 = regs->a1;
|
|
||||||
sc->sc_a5 = ((struct switch_stack *)regs - 1)->a5;
|
|
||||||
sc->sc_sr = regs->sr;
|
|
||||||
sc->sc_pc = regs->pc;
|
|
||||||
sc->sc_formatvec = regs->format << 12 | regs->vector;
|
|
||||||
#ifdef CONFIG_FPU
|
|
||||||
save_fpu_state(sc, regs);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int rt_setup_ucontext(struct ucontext __user *uc, struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
struct switch_stack *sw = (struct switch_stack *)regs - 1;
|
|
||||||
greg_t __user *gregs = uc->uc_mcontext.gregs;
|
|
||||||
int err = 0;
|
|
||||||
|
|
||||||
err |= __put_user(MCONTEXT_VERSION, &uc->uc_mcontext.version);
|
|
||||||
err |= __put_user(regs->d0, &gregs[0]);
|
|
||||||
err |= __put_user(regs->d1, &gregs[1]);
|
|
||||||
err |= __put_user(regs->d2, &gregs[2]);
|
|
||||||
err |= __put_user(regs->d3, &gregs[3]);
|
|
||||||
err |= __put_user(regs->d4, &gregs[4]);
|
|
||||||
err |= __put_user(regs->d5, &gregs[5]);
|
|
||||||
err |= __put_user(sw->d6, &gregs[6]);
|
|
||||||
err |= __put_user(sw->d7, &gregs[7]);
|
|
||||||
err |= __put_user(regs->a0, &gregs[8]);
|
|
||||||
err |= __put_user(regs->a1, &gregs[9]);
|
|
||||||
err |= __put_user(regs->a2, &gregs[10]);
|
|
||||||
err |= __put_user(sw->a3, &gregs[11]);
|
|
||||||
err |= __put_user(sw->a4, &gregs[12]);
|
|
||||||
err |= __put_user(sw->a5, &gregs[13]);
|
|
||||||
err |= __put_user(sw->a6, &gregs[14]);
|
|
||||||
err |= __put_user(rdusp(), &gregs[15]);
|
|
||||||
err |= __put_user(regs->pc, &gregs[16]);
|
|
||||||
err |= __put_user(regs->sr, &gregs[17]);
|
|
||||||
#ifdef CONFIG_FPU
|
|
||||||
err |= rt_save_fpu_state(uc, regs);
|
|
||||||
#endif
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void __user *
|
|
||||||
get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size)
|
|
||||||
{
|
|
||||||
unsigned long usp;
|
|
||||||
|
|
||||||
/* Default to using normal stack. */
|
|
||||||
usp = rdusp();
|
|
||||||
|
|
||||||
/* This is the X/Open sanctioned signal stack switching. */
|
|
||||||
if (ka->sa.sa_flags & SA_ONSTACK) {
|
|
||||||
if (!sas_ss_flags(usp))
|
|
||||||
usp = current->sas_ss_sp + current->sas_ss_size;
|
|
||||||
}
|
|
||||||
return (void __user *)((usp - frame_size) & -8UL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int setup_frame (int sig, struct k_sigaction *ka,
|
|
||||||
sigset_t *set, struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
struct sigframe __user *frame;
|
|
||||||
struct sigcontext context;
|
|
||||||
int err = 0;
|
|
||||||
|
|
||||||
frame = get_sigframe(ka, regs, sizeof(*frame));
|
|
||||||
|
|
||||||
err |= __put_user((current_thread_info()->exec_domain
|
|
||||||
&& current_thread_info()->exec_domain->signal_invmap
|
|
||||||
&& sig < 32
|
|
||||||
? current_thread_info()->exec_domain->signal_invmap[sig]
|
|
||||||
: sig),
|
|
||||||
&frame->sig);
|
|
||||||
|
|
||||||
err |= __put_user(regs->vector, &frame->code);
|
|
||||||
err |= __put_user(&frame->sc, &frame->psc);
|
|
||||||
|
|
||||||
if (_NSIG_WORDS > 1)
|
|
||||||
err |= copy_to_user(frame->extramask, &set->sig[1],
|
|
||||||
sizeof(frame->extramask));
|
|
||||||
|
|
||||||
setup_sigcontext(&context, regs, set->sig[0]);
|
|
||||||
err |= copy_to_user (&frame->sc, &context, sizeof(context));
|
|
||||||
|
|
||||||
/* Set up to return from userspace. */
|
|
||||||
err |= __put_user((void *) ret_from_user_signal, &frame->pretcode);
|
|
||||||
|
|
||||||
if (err)
|
|
||||||
goto give_sigsegv;
|
|
||||||
|
|
||||||
/* Set up registers for signal handler */
|
|
||||||
wrusp ((unsigned long) frame);
|
|
||||||
regs->pc = (unsigned long) ka->sa.sa_handler;
|
|
||||||
((struct switch_stack *)regs - 1)->a5 = current->mm->start_data;
|
|
||||||
regs->format = 0x4; /*set format byte to make stack appear modulo 4
|
|
||||||
which it will be when doing the rte */
|
|
||||||
|
|
||||||
adjust_stack:
|
|
||||||
/* Prepare to skip over the extra stuff in the exception frame. */
|
|
||||||
if (regs->stkadj) {
|
|
||||||
struct pt_regs *tregs =
|
|
||||||
(struct pt_regs *)((ulong)regs + regs->stkadj);
|
|
||||||
#if defined(DEBUG)
|
|
||||||
printk(KERN_DEBUG "Performing stackadjust=%04x\n", regs->stkadj);
|
|
||||||
#endif
|
|
||||||
/* This must be copied with decreasing addresses to
|
|
||||||
handle overlaps. */
|
|
||||||
tregs->vector = 0;
|
|
||||||
tregs->format = 0;
|
|
||||||
tregs->pc = regs->pc;
|
|
||||||
tregs->sr = regs->sr;
|
|
||||||
}
|
|
||||||
return err;
|
|
||||||
|
|
||||||
give_sigsegv:
|
|
||||||
force_sigsegv(sig, current);
|
|
||||||
goto adjust_stack;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int setup_rt_frame (int sig, struct k_sigaction *ka, siginfo_t *info,
|
|
||||||
sigset_t *set, struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
struct rt_sigframe __user *frame;
|
|
||||||
int err = 0;
|
|
||||||
|
|
||||||
frame = get_sigframe(ka, regs, sizeof(*frame));
|
|
||||||
|
|
||||||
err |= __put_user((current_thread_info()->exec_domain
|
|
||||||
&& current_thread_info()->exec_domain->signal_invmap
|
|
||||||
&& sig < 32
|
|
||||||
? current_thread_info()->exec_domain->signal_invmap[sig]
|
|
||||||
: sig),
|
|
||||||
&frame->sig);
|
|
||||||
err |= __put_user(&frame->info, &frame->pinfo);
|
|
||||||
err |= __put_user(&frame->uc, &frame->puc);
|
|
||||||
err |= copy_siginfo_to_user(&frame->info, info);
|
|
||||||
|
|
||||||
/* Create the ucontext. */
|
|
||||||
err |= __put_user(0, &frame->uc.uc_flags);
|
|
||||||
err |= __put_user(NULL, &frame->uc.uc_link);
|
|
||||||
err |= __put_user((void __user *)current->sas_ss_sp,
|
|
||||||
&frame->uc.uc_stack.ss_sp);
|
|
||||||
err |= __put_user(sas_ss_flags(rdusp()),
|
|
||||||
&frame->uc.uc_stack.ss_flags);
|
|
||||||
err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
|
|
||||||
err |= rt_setup_ucontext(&frame->uc, regs);
|
|
||||||
err |= copy_to_user (&frame->uc.uc_sigmask, set, sizeof(*set));
|
|
||||||
|
|
||||||
/* Set up to return from userspace. */
|
|
||||||
err |= __put_user((void *) ret_from_user_rt_signal, &frame->pretcode);
|
|
||||||
|
|
||||||
if (err)
|
|
||||||
goto give_sigsegv;
|
|
||||||
|
|
||||||
/* Set up registers for signal handler */
|
|
||||||
wrusp ((unsigned long) frame);
|
|
||||||
regs->pc = (unsigned long) ka->sa.sa_handler;
|
|
||||||
((struct switch_stack *)regs - 1)->a5 = current->mm->start_data;
|
|
||||||
regs->format = 0x4; /*set format byte to make stack appear modulo 4
|
|
||||||
which it will be when doing the rte */
|
|
||||||
|
|
||||||
adjust_stack:
|
|
||||||
/* Prepare to skip over the extra stuff in the exception frame. */
|
|
||||||
if (regs->stkadj) {
|
|
||||||
struct pt_regs *tregs =
|
|
||||||
(struct pt_regs *)((ulong)regs + regs->stkadj);
|
|
||||||
#if defined(DEBUG)
|
|
||||||
printk(KERN_DEBUG "Performing stackadjust=%04x\n", regs->stkadj);
|
|
||||||
#endif
|
|
||||||
/* This must be copied with decreasing addresses to
|
|
||||||
handle overlaps. */
|
|
||||||
tregs->vector = 0;
|
|
||||||
tregs->format = 0;
|
|
||||||
tregs->pc = regs->pc;
|
|
||||||
tregs->sr = regs->sr;
|
|
||||||
}
|
|
||||||
return err;
|
|
||||||
|
|
||||||
give_sigsegv:
|
|
||||||
force_sigsegv(sig, current);
|
|
||||||
goto adjust_stack;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
handle_restart(struct pt_regs *regs, struct k_sigaction *ka, int has_handler)
|
|
||||||
{
|
|
||||||
switch (regs->d0) {
|
|
||||||
case -ERESTARTNOHAND:
|
|
||||||
if (!has_handler)
|
|
||||||
goto do_restart;
|
|
||||||
regs->d0 = -EINTR;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case -ERESTART_RESTARTBLOCK:
|
|
||||||
if (!has_handler) {
|
|
||||||
regs->d0 = __NR_restart_syscall;
|
|
||||||
regs->pc -= 2;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
regs->d0 = -EINTR;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case -ERESTARTSYS:
|
|
||||||
if (has_handler && !(ka->sa.sa_flags & SA_RESTART)) {
|
|
||||||
regs->d0 = -EINTR;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* fallthrough */
|
|
||||||
case -ERESTARTNOINTR:
|
|
||||||
do_restart:
|
|
||||||
regs->d0 = regs->orig_d0;
|
|
||||||
regs->pc -= 2;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* OK, we're invoking a handler
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info,
|
|
||||||
sigset_t *oldset, struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
/* are we from a system call? */
|
|
||||||
if (regs->orig_d0 >= 0)
|
|
||||||
/* If so, check system call restarting.. */
|
|
||||||
handle_restart(regs, ka, 1);
|
|
||||||
|
|
||||||
/* set up the stack frame */
|
|
||||||
if (ka->sa.sa_flags & SA_SIGINFO)
|
|
||||||
err = setup_rt_frame(sig, ka, info, oldset, regs);
|
|
||||||
else
|
|
||||||
err = setup_frame(sig, ka, oldset, regs);
|
|
||||||
|
|
||||||
if (err)
|
|
||||||
return;
|
|
||||||
|
|
||||||
spin_lock_irq(¤t->sighand->siglock);
|
|
||||||
sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
|
|
||||||
if (!(ka->sa.sa_flags & SA_NODEFER))
|
|
||||||
sigaddset(¤t->blocked,sig);
|
|
||||||
recalc_sigpending();
|
|
||||||
spin_unlock_irq(¤t->sighand->siglock);
|
|
||||||
|
|
||||||
clear_thread_flag(TIF_RESTORE_SIGMASK);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Note that 'init' is a special process: it doesn't get signals it doesn't
|
|
||||||
* want to handle. Thus you cannot kill init even with a SIGKILL even by
|
|
||||||
* mistake.
|
|
||||||
*/
|
|
||||||
asmlinkage void do_signal(struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
struct k_sigaction ka;
|
|
||||||
siginfo_t info;
|
|
||||||
int signr;
|
|
||||||
sigset_t *oldset;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We want the common case to go fast, which
|
|
||||||
* is why we may in certain cases get here from
|
|
||||||
* kernel mode. Just return without doing anything
|
|
||||||
* if so.
|
|
||||||
*/
|
|
||||||
if (!user_mode(regs))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (test_thread_flag(TIF_RESTORE_SIGMASK))
|
|
||||||
oldset = ¤t->saved_sigmask;
|
|
||||||
else
|
|
||||||
oldset = ¤t->blocked;
|
|
||||||
|
|
||||||
signr = get_signal_to_deliver(&info, &ka, regs, NULL);
|
|
||||||
if (signr > 0) {
|
|
||||||
/* Whee! Actually deliver the signal. */
|
|
||||||
handle_signal(signr, &ka, &info, oldset, regs);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Did we come from a system call? */
|
|
||||||
if (regs->orig_d0 >= 0) {
|
|
||||||
/* Restart the system call - no handlers present */
|
|
||||||
handle_restart(regs, NULL, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If there's no signal to deliver, we just restore the saved mask. */
|
|
||||||
if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
|
|
||||||
clear_thread_flag(TIF_RESTORE_SIGMASK);
|
|
||||||
sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,18 +0,0 @@
|
||||||
#
|
|
||||||
# Makefile for the m68knommu linux kernel.
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# If you want to play with the HW breakpoints then you will
|
|
||||||
# need to add define this, which will give you a stack backtrace
|
|
||||||
# on the console port whenever a DBG interrupt occurs. You have to
|
|
||||||
# set up you HW breakpoints to trigger a DBG interrupt:
|
|
||||||
#
|
|
||||||
# ccflags-y := -DTRAP_DBG_INTERRUPT
|
|
||||||
# asflags-y := -DTRAP_DBG_INTERRUPT
|
|
||||||
#
|
|
||||||
|
|
||||||
asflags-$(CONFIG_FULLDEBUG) := -DDEBUGGER_COMPATIBLE_CACHE=1
|
|
||||||
|
|
||||||
obj-y := config.o gpio.o
|
|
||||||
|
|
|
@ -1,49 +0,0 @@
|
||||||
/*
|
|
||||||
* Coldfire generic GPIO support
|
|
||||||
*
|
|
||||||
* (C) Copyright 2009, Steven King <sfking@fdwdc.com>
|
|
||||||
*
|
|
||||||
* 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; version 2 of the License.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/init.h>
|
|
||||||
|
|
||||||
#include <asm/coldfire.h>
|
|
||||||
#include <asm/mcfsim.h>
|
|
||||||
#include <asm/mcfgpio.h>
|
|
||||||
|
|
||||||
static struct mcf_gpio_chip mcf_gpio_chips[] = {
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "PP",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFSIM_PADDR,
|
|
||||||
.podr = (void __iomem *) MCFSIM_PADAT,
|
|
||||||
.ppdr = (void __iomem *) MCFSIM_PADAT,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init mcf_gpio_init(void)
|
|
||||||
{
|
|
||||||
unsigned i = 0;
|
|
||||||
while (i < ARRAY_SIZE(mcf_gpio_chips))
|
|
||||||
(void)gpiochip_add((struct gpio_chip *)&mcf_gpio_chips[i++]);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
core_initcall(mcf_gpio_init);
|
|
|
@ -1,17 +0,0 @@
|
||||||
#
|
|
||||||
# Makefile for the M5208 specific file.
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# If you want to play with the HW breakpoints then you will
|
|
||||||
# need to add define this, which will give you a stack backtrace
|
|
||||||
# on the console port whenever a DBG interrupt occurs. You have to
|
|
||||||
# set up you HW breakpoints to trigger a DBG interrupt:
|
|
||||||
#
|
|
||||||
# ccflags-y := -DTRAP_DBG_INTERRUPT
|
|
||||||
# asflags-y := -DTRAP_DBG_INTERRUPT
|
|
||||||
#
|
|
||||||
|
|
||||||
asflags-$(CONFIG_FULLDEBUG) := -DDEBUGGER_COMPATIBLE_CACHE=1
|
|
||||||
|
|
||||||
obj-y := config.o gpio.o
|
|
|
@ -1,175 +0,0 @@
|
||||||
/*
|
|
||||||
* Coldfire generic GPIO support
|
|
||||||
*
|
|
||||||
* (C) Copyright 2009, Steven King <sfking@fdwdc.com>
|
|
||||||
*
|
|
||||||
* 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; version 2 of the License.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/init.h>
|
|
||||||
|
|
||||||
#include <asm/coldfire.h>
|
|
||||||
#include <asm/mcfsim.h>
|
|
||||||
#include <asm/mcfgpio.h>
|
|
||||||
|
|
||||||
static struct mcf_gpio_chip mcf_gpio_chips[] = {
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "PIRQ",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFEPORT_EPDDR,
|
|
||||||
.podr = (void __iomem *) MCFEPORT_EPDR,
|
|
||||||
.ppdr = (void __iomem *) MCFEPORT_EPPDR,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "CS",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 9,
|
|
||||||
.ngpio = 3,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_CS,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_CS,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_CS,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_CS,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_CS,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "FECI2C",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 16,
|
|
||||||
.ngpio = 4,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_FECI2C,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_FECI2C,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_FECI2C,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_FECI2C,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_FECI2C,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "QSPI",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 24,
|
|
||||||
.ngpio = 4,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_QSPI,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_QSPI,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_QSPI,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_QSPI,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_QSPI,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "TIMER",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 32,
|
|
||||||
.ngpio = 4,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_TIMER,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_TIMER,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_TIMER,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_TIMER,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_TIMER,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "UART",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 40,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_UART,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_UART,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_UART,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_UART,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_UART,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "FECH",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 48,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_FECH,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_FECH,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_FECH,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_FECH,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_FECH,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "FECL",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 56,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_FECL,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_FECL,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_FECL,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_FECL,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_FECL,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init mcf_gpio_init(void)
|
|
||||||
{
|
|
||||||
unsigned i = 0;
|
|
||||||
while (i < ARRAY_SIZE(mcf_gpio_chips))
|
|
||||||
(void)gpiochip_add((struct gpio_chip *)&mcf_gpio_chips[i++]);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
core_initcall(mcf_gpio_init);
|
|
|
@ -1,17 +0,0 @@
|
||||||
#
|
|
||||||
# Makefile for the m68knommu linux kernel.
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# If you want to play with the HW breakpoints then you will
|
|
||||||
# need to add define this, which will give you a stack backtrace
|
|
||||||
# on the console port whenever a DBG interrupt occurs. You have to
|
|
||||||
# set up you HW breakpoints to trigger a DBG interrupt:
|
|
||||||
#
|
|
||||||
# ccflags-y := -DTRAP_DBG_INTERRUPT
|
|
||||||
# asflags-y := -DTRAP_DBG_INTERRUPT
|
|
||||||
#
|
|
||||||
|
|
||||||
asflags-$(CONFIG_FULLDEBUG) := -DDEBUGGER_COMPATIBLE_CACHE=1
|
|
||||||
|
|
||||||
obj-y := config.o gpio.o
|
|
|
@ -1,284 +0,0 @@
|
||||||
/*
|
|
||||||
* Coldfire generic GPIO support
|
|
||||||
*
|
|
||||||
* (C) Copyright 2009, Steven King <sfking@fdwdc.com>
|
|
||||||
*
|
|
||||||
* 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; version 2 of the License.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/init.h>
|
|
||||||
|
|
||||||
#include <asm/coldfire.h>
|
|
||||||
#include <asm/mcfsim.h>
|
|
||||||
#include <asm/mcfgpio.h>
|
|
||||||
|
|
||||||
static struct mcf_gpio_chip mcf_gpio_chips[] = {
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "PIRQ",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value,
|
|
||||||
.base = 1,
|
|
||||||
.ngpio = 7,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFEPORT_EPDDR,
|
|
||||||
.podr = (void __iomem *) MCFEPORT_EPDR,
|
|
||||||
.ppdr = (void __iomem *) MCFEPORT_EPPDR,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "ADDR",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 13,
|
|
||||||
.ngpio = 3,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_ADDR,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_ADDR,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_ADDR,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_ADDR,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_ADDR,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "DATAH",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 16,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_DATAH,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_DATAH,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_DATAH,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_DATAH,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_DATAH,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "DATAL",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 24,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_DATAL,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_DATAL,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_DATAL,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_DATAL,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_DATAL,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "BUSCTL",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 32,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_BUSCTL,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_BUSCTL,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_BUSCTL,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_BUSCTL,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_BUSCTL,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "BS",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 40,
|
|
||||||
.ngpio = 4,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_BS,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_BS,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_BS,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_BS,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_BS,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "CS",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 49,
|
|
||||||
.ngpio = 7,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_CS,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_CS,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_CS,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_CS,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_CS,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "SDRAM",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 56,
|
|
||||||
.ngpio = 6,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_SDRAM,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_SDRAM,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_SDRAM,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_SDRAM,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_SDRAM,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "FECI2C",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 64,
|
|
||||||
.ngpio = 4,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_FECI2C,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_FECI2C,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_FECI2C,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_FECI2C,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_FECI2C,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "UARTH",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 72,
|
|
||||||
.ngpio = 2,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_UARTH,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_UARTH,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_UARTH,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_UARTH,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_UARTH,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "UARTL",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 80,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_UARTL,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_UARTL,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_UARTL,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_UARTL,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_UARTL,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "QSPI",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 88,
|
|
||||||
.ngpio = 5,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_QSPI,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_QSPI,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_QSPI,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_QSPI,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_QSPI,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "TIMER",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 96,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_TIMER,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_TIMER,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_TIMER,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_TIMER,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_TIMER,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "ETPU",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 104,
|
|
||||||
.ngpio = 3,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_ETPU,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_ETPU,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_ETPU,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_ETPU,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_ETPU,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init mcf_gpio_init(void)
|
|
||||||
{
|
|
||||||
unsigned i = 0;
|
|
||||||
while (i < ARRAY_SIZE(mcf_gpio_chips))
|
|
||||||
(void)gpiochip_add((struct gpio_chip *)&mcf_gpio_chips[i++]);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
core_initcall(mcf_gpio_init);
|
|
|
@ -1,18 +0,0 @@
|
||||||
#
|
|
||||||
# Makefile for the m68knommu linux kernel.
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# If you want to play with the HW breakpoints then you will
|
|
||||||
# need to add define this, which will give you a stack backtrace
|
|
||||||
# on the console port whenever a DBG interrupt occurs. You have to
|
|
||||||
# set up you HW breakpoints to trigger a DBG interrupt:
|
|
||||||
#
|
|
||||||
# ccflags-y := -DTRAP_DBG_INTERRUPT
|
|
||||||
# asflags-y := -DTRAP_DBG_INTERRUPT
|
|
||||||
#
|
|
||||||
|
|
||||||
asflags-$(CONFIG_FULLDEBUG) := -DDEBUGGER_COMPATIBLE_CACHE=1
|
|
||||||
|
|
||||||
obj-y := config.o gpio.o intc2.o
|
|
||||||
|
|
|
@ -1,65 +0,0 @@
|
||||||
/*
|
|
||||||
* Coldfire generic GPIO support
|
|
||||||
*
|
|
||||||
* (C) Copyright 2009, Steven King <sfking@fdwdc.com>
|
|
||||||
*
|
|
||||||
* 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; version 2 of the License.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/init.h>
|
|
||||||
|
|
||||||
#include <asm/coldfire.h>
|
|
||||||
#include <asm/mcfsim.h>
|
|
||||||
#include <asm/mcfgpio.h>
|
|
||||||
|
|
||||||
static struct mcf_gpio_chip mcf_gpio_chips[] = {
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "GPIO0",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value,
|
|
||||||
.ngpio = 32,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFSIM2_GPIOENABLE,
|
|
||||||
.podr = (void __iomem *) MCFSIM2_GPIOWRITE,
|
|
||||||
.ppdr = (void __iomem *) MCFSIM2_GPIOREAD,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "GPIO1",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value,
|
|
||||||
.base = 32,
|
|
||||||
.ngpio = 32,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFSIM2_GPIO1ENABLE,
|
|
||||||
.podr = (void __iomem *) MCFSIM2_GPIO1WRITE,
|
|
||||||
.ppdr = (void __iomem *) MCFSIM2_GPIO1READ,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init mcf_gpio_init(void)
|
|
||||||
{
|
|
||||||
unsigned i = 0;
|
|
||||||
while (i < ARRAY_SIZE(mcf_gpio_chips))
|
|
||||||
(void)gpiochip_add((struct gpio_chip *)&mcf_gpio_chips[i++]);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
core_initcall(mcf_gpio_init);
|
|
|
@ -1,18 +0,0 @@
|
||||||
#
|
|
||||||
# Makefile for the linux kernel.
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# If you want to play with the HW breakpoints then you will
|
|
||||||
# need to add define this, which will give you a stack backtrace
|
|
||||||
# on the console port whenever a DBG interrupt occurs. You have to
|
|
||||||
# set up you HW breakpoints to trigger a DBG interrupt:
|
|
||||||
#
|
|
||||||
# ccflags-y := -DTRAP_DBG_INTERRUPT
|
|
||||||
# asflags-y := -DTRAP_DBG_INTERRUPT
|
|
||||||
#
|
|
||||||
|
|
||||||
asflags-$(CONFIG_FULLDEBUG) := -DDEBUGGER_COMPATIBLE_CACHE=1
|
|
||||||
|
|
||||||
obj-y := config.o gpio.o intc.o
|
|
||||||
|
|
|
@ -1,81 +0,0 @@
|
||||||
/*
|
|
||||||
* Coldfire generic GPIO support
|
|
||||||
*
|
|
||||||
* (C) Copyright 2009, Steven King <sfking@fdwdc.com>
|
|
||||||
*
|
|
||||||
* 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; version 2 of the License.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/init.h>
|
|
||||||
|
|
||||||
#include <asm/coldfire.h>
|
|
||||||
#include <asm/mcfsim.h>
|
|
||||||
#include <asm/mcfgpio.h>
|
|
||||||
|
|
||||||
static struct mcf_gpio_chip mcf_gpio_chips[] = {
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "PA",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value,
|
|
||||||
.ngpio = 16,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFSIM_PADDR,
|
|
||||||
.podr = (void __iomem *) MCFSIM_PADAT,
|
|
||||||
.ppdr = (void __iomem *) MCFSIM_PADAT,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "PB",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value,
|
|
||||||
.base = 16,
|
|
||||||
.ngpio = 16,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFSIM_PBDDR,
|
|
||||||
.podr = (void __iomem *) MCFSIM_PBDAT,
|
|
||||||
.ppdr = (void __iomem *) MCFSIM_PBDAT,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "PC",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value,
|
|
||||||
.base = 32,
|
|
||||||
.ngpio = 16,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFSIM_PCDDR,
|
|
||||||
.podr = (void __iomem *) MCFSIM_PCDAT,
|
|
||||||
.ppdr = (void __iomem *) MCFSIM_PCDAT,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init mcf_gpio_init(void)
|
|
||||||
{
|
|
||||||
unsigned i = 0;
|
|
||||||
while (i < ARRAY_SIZE(mcf_gpio_chips))
|
|
||||||
(void)gpiochip_add((struct gpio_chip *)&mcf_gpio_chips[i++]);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
core_initcall(mcf_gpio_init);
|
|
|
@ -1,18 +0,0 @@
|
||||||
#
|
|
||||||
# Makefile for the linux kernel.
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# If you want to play with the HW breakpoints then you will
|
|
||||||
# need to add define this, which will give you a stack backtrace
|
|
||||||
# on the console port whenever a DBG interrupt occurs. You have to
|
|
||||||
# set up you HW breakpoints to trigger a DBG interrupt:
|
|
||||||
#
|
|
||||||
# ccflags-y := -DTRAP_DBG_INTERRUPT
|
|
||||||
# asflags-y := -DTRAP_DBG_INTERRUPT
|
|
||||||
#
|
|
||||||
|
|
||||||
asflags-$(CONFIG_FULLDEBUG) := -DDEBUGGER_COMPATIBLE_CACHE=1
|
|
||||||
|
|
||||||
obj-y := config.o gpio.o
|
|
||||||
|
|
|
@ -1,609 +0,0 @@
|
||||||
/*
|
|
||||||
* Coldfire generic GPIO support
|
|
||||||
*
|
|
||||||
* (C) Copyright 2009, Steven King <sfking@fdwdc.com>
|
|
||||||
*
|
|
||||||
* 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; version 2 of the License.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/init.h>
|
|
||||||
|
|
||||||
#include <asm/coldfire.h>
|
|
||||||
#include <asm/mcfsim.h>
|
|
||||||
#include <asm/mcfgpio.h>
|
|
||||||
|
|
||||||
static struct mcf_gpio_chip mcf_gpio_chips[] = {
|
|
||||||
#if defined(CONFIG_M5271)
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "PIRQ",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value,
|
|
||||||
.base = 1,
|
|
||||||
.ngpio = 7,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFEPORT_EPDDR,
|
|
||||||
.podr = (void __iomem *) MCFEPORT_EPDR,
|
|
||||||
.ppdr = (void __iomem *) MCFEPORT_EPPDR,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "ADDR",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 13,
|
|
||||||
.ngpio = 3,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_ADDR,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_ADDR,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_ADDR,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_ADDR,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_ADDR,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "DATAH",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 16,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_DATAH,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_DATAH,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_DATAH,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_DATAH,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_DATAH,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "DATAL",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 24,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_DATAL,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_DATAL,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_DATAL,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_DATAL,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_DATAL,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "BUSCTL",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 32,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_BUSCTL,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_BUSCTL,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_BUSCTL,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_BUSCTL,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_BUSCTL,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "BS",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 40,
|
|
||||||
.ngpio = 4,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_BS,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_BS,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_BS,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_BS,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_BS,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "CS",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 49,
|
|
||||||
.ngpio = 7,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_CS,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_CS,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_CS,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_CS,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_CS,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "SDRAM",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 56,
|
|
||||||
.ngpio = 6,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_SDRAM,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_SDRAM,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_SDRAM,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_SDRAM,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_SDRAM,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "FECI2C",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 64,
|
|
||||||
.ngpio = 4,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_FECI2C,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_FECI2C,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_FECI2C,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_FECI2C,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_FECI2C,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "UARTH",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 72,
|
|
||||||
.ngpio = 2,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_UARTH,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_UARTH,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_UARTH,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_UARTH,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_UARTH,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "UARTL",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 80,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_UARTL,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_UARTL,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_UARTL,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_UARTL,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_UARTL,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "QSPI",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 88,
|
|
||||||
.ngpio = 5,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_QSPI,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_QSPI,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_QSPI,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_QSPI,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_QSPI,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "TIMER",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 96,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_TIMER,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_TIMER,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_TIMER,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_TIMER,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_TIMER,
|
|
||||||
},
|
|
||||||
#elif defined(CONFIG_M5275)
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "PIRQ",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value,
|
|
||||||
.base = 1,
|
|
||||||
.ngpio = 7,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFEPORT_EPDDR,
|
|
||||||
.podr = (void __iomem *) MCFEPORT_EPDR,
|
|
||||||
.ppdr = (void __iomem *) MCFEPORT_EPPDR,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "BUSCTL",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 8,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_BUSCTL,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_BUSCTL,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_BUSCTL,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_BUSCTL,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_BUSCTL,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "ADDR",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 21,
|
|
||||||
.ngpio = 3,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_ADDR,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_ADDR,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_ADDR,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_ADDR,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_ADDR,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "CS",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 25,
|
|
||||||
.ngpio = 7,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_CS,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_CS,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_CS,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_CS,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_CS,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "FEC0H",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 32,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_FEC0H,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_FEC0H,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_FEC0H,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_FEC0H,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_FEC0H,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "FEC0L",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 40,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_FEC0L,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_FEC0L,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_FEC0L,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_FEC0L,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_FEC0L,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "FECI2C",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 48,
|
|
||||||
.ngpio = 6,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_FECI2C,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_FECI2C,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_FECI2C,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_FECI2C,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_FECI2C,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "QSPI",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 56,
|
|
||||||
.ngpio = 7,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_QSPI,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_QSPI,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_QSPI,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_QSPI,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_QSPI,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "SDRAM",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 64,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_SDRAM,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_SDRAM,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_SDRAM,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_SDRAM,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_SDRAM,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "TIMERH",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 72,
|
|
||||||
.ngpio = 4,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_TIMERH,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_TIMERH,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_TIMERH,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_TIMERH,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_TIMERH,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "TIMERL",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 80,
|
|
||||||
.ngpio = 4,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_TIMERL,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_TIMERL,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_TIMERL,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_TIMERL,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_TIMERL,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "UARTL",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 88,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_UARTL,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_UARTL,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_UARTL,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_UARTL,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_UARTL,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "FEC1H",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 96,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_FEC1H,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_FEC1H,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_FEC1H,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_FEC1H,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_FEC1H,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "FEC1L",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 104,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_FEC1L,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_FEC1L,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_FEC1L,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_FEC1L,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_FEC1L,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "BS",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 114,
|
|
||||||
.ngpio = 2,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_BS,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_BS,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_BS,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_BS,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_BS,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "IRQ",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 121,
|
|
||||||
.ngpio = 7,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_IRQ,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_IRQ,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_IRQ,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_IRQ,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_IRQ,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "USBH",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 128,
|
|
||||||
.ngpio = 1,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_USBH,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_USBH,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_USBH,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_USBH,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_USBH,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "USBL",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 136,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_USBL,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_USBL,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_USBL,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_USBL,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_USBL,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "UARTH",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 144,
|
|
||||||
.ngpio = 4,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_UARTH,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_UARTH,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_UARTH,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_UARTH,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_UARTH,
|
|
||||||
},
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init mcf_gpio_init(void)
|
|
||||||
{
|
|
||||||
unsigned i = 0;
|
|
||||||
while (i < ARRAY_SIZE(mcf_gpio_chips))
|
|
||||||
(void)gpiochip_add((struct gpio_chip *)&mcf_gpio_chips[i++]);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
core_initcall(mcf_gpio_init);
|
|
|
@ -1,18 +0,0 @@
|
||||||
#
|
|
||||||
# Makefile for the linux kernel.
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# If you want to play with the HW breakpoints then you will
|
|
||||||
# need to add define this, which will give you a stack backtrace
|
|
||||||
# on the console port whenever a DBG interrupt occurs. You have to
|
|
||||||
# set up you HW breakpoints to trigger a DBG interrupt:
|
|
||||||
#
|
|
||||||
# ccflags-y := -DTRAP_DBG_INTERRUPT
|
|
||||||
# asflags-y := -DTRAP_DBG_INTERRUPT
|
|
||||||
#
|
|
||||||
|
|
||||||
asflags-$(CONFIG_FULLDEBUG) := -DDEBUGGER_COMPATIBLE_CACHE=1
|
|
||||||
|
|
||||||
obj-y := config.o gpio.o
|
|
||||||
|
|
|
@ -1,438 +0,0 @@
|
||||||
/*
|
|
||||||
* Coldfire generic GPIO support
|
|
||||||
*
|
|
||||||
* (C) Copyright 2009, Steven King <sfking@fdwdc.com>
|
|
||||||
*
|
|
||||||
* 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; version 2 of the License.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/init.h>
|
|
||||||
|
|
||||||
#include <asm/coldfire.h>
|
|
||||||
#include <asm/mcfsim.h>
|
|
||||||
#include <asm/mcfgpio.h>
|
|
||||||
|
|
||||||
static struct mcf_gpio_chip mcf_gpio_chips[] = {
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "NQ",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value,
|
|
||||||
.base = 1,
|
|
||||||
.ngpio = 7,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *)MCFEPORT_EPDDR,
|
|
||||||
.podr = (void __iomem *)MCFEPORT_EPDR,
|
|
||||||
.ppdr = (void __iomem *)MCFEPORT_EPPDR,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "TA",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 8,
|
|
||||||
.ngpio = 4,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *)MCFGPTA_GPTDDR,
|
|
||||||
.podr = (void __iomem *)MCFGPTA_GPTPORT,
|
|
||||||
.ppdr = (void __iomem *)MCFGPTB_GPTPORT,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "TB",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 16,
|
|
||||||
.ngpio = 4,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *)MCFGPTB_GPTDDR,
|
|
||||||
.podr = (void __iomem *)MCFGPTB_GPTPORT,
|
|
||||||
.ppdr = (void __iomem *)MCFGPTB_GPTPORT,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "QA",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 24,
|
|
||||||
.ngpio = 4,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *)MCFQADC_DDRQA,
|
|
||||||
.podr = (void __iomem *)MCFQADC_PORTQA,
|
|
||||||
.ppdr = (void __iomem *)MCFQADC_PORTQA,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "QB",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 32,
|
|
||||||
.ngpio = 4,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *)MCFQADC_DDRQB,
|
|
||||||
.podr = (void __iomem *)MCFQADC_PORTQB,
|
|
||||||
.ppdr = (void __iomem *)MCFQADC_PORTQB,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "A",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 40,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *)MCFGPIO_DDRA,
|
|
||||||
.podr = (void __iomem *)MCFGPIO_PORTA,
|
|
||||||
.ppdr = (void __iomem *)MCFGPIO_PORTAP,
|
|
||||||
.setr = (void __iomem *)MCFGPIO_SETA,
|
|
||||||
.clrr = (void __iomem *)MCFGPIO_CLRA,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "B",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 48,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *)MCFGPIO_DDRB,
|
|
||||||
.podr = (void __iomem *)MCFGPIO_PORTB,
|
|
||||||
.ppdr = (void __iomem *)MCFGPIO_PORTBP,
|
|
||||||
.setr = (void __iomem *)MCFGPIO_SETB,
|
|
||||||
.clrr = (void __iomem *)MCFGPIO_CLRB,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "C",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 56,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *)MCFGPIO_DDRC,
|
|
||||||
.podr = (void __iomem *)MCFGPIO_PORTC,
|
|
||||||
.ppdr = (void __iomem *)MCFGPIO_PORTCP,
|
|
||||||
.setr = (void __iomem *)MCFGPIO_SETC,
|
|
||||||
.clrr = (void __iomem *)MCFGPIO_CLRC,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "D",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 64,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *)MCFGPIO_DDRD,
|
|
||||||
.podr = (void __iomem *)MCFGPIO_PORTD,
|
|
||||||
.ppdr = (void __iomem *)MCFGPIO_PORTDP,
|
|
||||||
.setr = (void __iomem *)MCFGPIO_SETD,
|
|
||||||
.clrr = (void __iomem *)MCFGPIO_CLRD,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "E",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 72,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *)MCFGPIO_DDRE,
|
|
||||||
.podr = (void __iomem *)MCFGPIO_PORTE,
|
|
||||||
.ppdr = (void __iomem *)MCFGPIO_PORTEP,
|
|
||||||
.setr = (void __iomem *)MCFGPIO_SETE,
|
|
||||||
.clrr = (void __iomem *)MCFGPIO_CLRE,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "F",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 80,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *)MCFGPIO_DDRF,
|
|
||||||
.podr = (void __iomem *)MCFGPIO_PORTF,
|
|
||||||
.ppdr = (void __iomem *)MCFGPIO_PORTFP,
|
|
||||||
.setr = (void __iomem *)MCFGPIO_SETF,
|
|
||||||
.clrr = (void __iomem *)MCFGPIO_CLRF,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "G",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 88,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *)MCFGPIO_DDRG,
|
|
||||||
.podr = (void __iomem *)MCFGPIO_PORTG,
|
|
||||||
.ppdr = (void __iomem *)MCFGPIO_PORTGP,
|
|
||||||
.setr = (void __iomem *)MCFGPIO_SETG,
|
|
||||||
.clrr = (void __iomem *)MCFGPIO_CLRG,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "H",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 96,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *)MCFGPIO_DDRH,
|
|
||||||
.podr = (void __iomem *)MCFGPIO_PORTH,
|
|
||||||
.ppdr = (void __iomem *)MCFGPIO_PORTHP,
|
|
||||||
.setr = (void __iomem *)MCFGPIO_SETH,
|
|
||||||
.clrr = (void __iomem *)MCFGPIO_CLRH,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "J",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 104,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *)MCFGPIO_DDRJ,
|
|
||||||
.podr = (void __iomem *)MCFGPIO_PORTJ,
|
|
||||||
.ppdr = (void __iomem *)MCFGPIO_PORTJP,
|
|
||||||
.setr = (void __iomem *)MCFGPIO_SETJ,
|
|
||||||
.clrr = (void __iomem *)MCFGPIO_CLRJ,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "DD",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 112,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *)MCFGPIO_DDRDD,
|
|
||||||
.podr = (void __iomem *)MCFGPIO_PORTDD,
|
|
||||||
.ppdr = (void __iomem *)MCFGPIO_PORTDDP,
|
|
||||||
.setr = (void __iomem *)MCFGPIO_SETDD,
|
|
||||||
.clrr = (void __iomem *)MCFGPIO_CLRDD,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "EH",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 120,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *)MCFGPIO_DDREH,
|
|
||||||
.podr = (void __iomem *)MCFGPIO_PORTEH,
|
|
||||||
.ppdr = (void __iomem *)MCFGPIO_PORTEHP,
|
|
||||||
.setr = (void __iomem *)MCFGPIO_SETEH,
|
|
||||||
.clrr = (void __iomem *)MCFGPIO_CLREH,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "EL",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 128,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *)MCFGPIO_DDREL,
|
|
||||||
.podr = (void __iomem *)MCFGPIO_PORTEL,
|
|
||||||
.ppdr = (void __iomem *)MCFGPIO_PORTELP,
|
|
||||||
.setr = (void __iomem *)MCFGPIO_SETEL,
|
|
||||||
.clrr = (void __iomem *)MCFGPIO_CLREL,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "AS",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 136,
|
|
||||||
.ngpio = 6,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *)MCFGPIO_DDRAS,
|
|
||||||
.podr = (void __iomem *)MCFGPIO_PORTAS,
|
|
||||||
.ppdr = (void __iomem *)MCFGPIO_PORTASP,
|
|
||||||
.setr = (void __iomem *)MCFGPIO_SETAS,
|
|
||||||
.clrr = (void __iomem *)MCFGPIO_CLRAS,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "QS",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 144,
|
|
||||||
.ngpio = 7,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *)MCFGPIO_DDRQS,
|
|
||||||
.podr = (void __iomem *)MCFGPIO_PORTQS,
|
|
||||||
.ppdr = (void __iomem *)MCFGPIO_PORTQSP,
|
|
||||||
.setr = (void __iomem *)MCFGPIO_SETQS,
|
|
||||||
.clrr = (void __iomem *)MCFGPIO_CLRQS,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "SD",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 152,
|
|
||||||
.ngpio = 6,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *)MCFGPIO_DDRSD,
|
|
||||||
.podr = (void __iomem *)MCFGPIO_PORTSD,
|
|
||||||
.ppdr = (void __iomem *)MCFGPIO_PORTSDP,
|
|
||||||
.setr = (void __iomem *)MCFGPIO_SETSD,
|
|
||||||
.clrr = (void __iomem *)MCFGPIO_CLRSD,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "TC",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 160,
|
|
||||||
.ngpio = 4,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *)MCFGPIO_DDRTC,
|
|
||||||
.podr = (void __iomem *)MCFGPIO_PORTTC,
|
|
||||||
.ppdr = (void __iomem *)MCFGPIO_PORTTCP,
|
|
||||||
.setr = (void __iomem *)MCFGPIO_SETTC,
|
|
||||||
.clrr = (void __iomem *)MCFGPIO_CLRTC,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "TD",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 168,
|
|
||||||
.ngpio = 4,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *)MCFGPIO_DDRTD,
|
|
||||||
.podr = (void __iomem *)MCFGPIO_PORTTD,
|
|
||||||
.ppdr = (void __iomem *)MCFGPIO_PORTTDP,
|
|
||||||
.setr = (void __iomem *)MCFGPIO_SETTD,
|
|
||||||
.clrr = (void __iomem *)MCFGPIO_CLRTD,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "UA",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 176,
|
|
||||||
.ngpio = 4,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *)MCFGPIO_DDRUA,
|
|
||||||
.podr = (void __iomem *)MCFGPIO_PORTUA,
|
|
||||||
.ppdr = (void __iomem *)MCFGPIO_PORTUAP,
|
|
||||||
.setr = (void __iomem *)MCFGPIO_SETUA,
|
|
||||||
.clrr = (void __iomem *)MCFGPIO_CLRUA,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init mcf_gpio_init(void)
|
|
||||||
{
|
|
||||||
unsigned i = 0;
|
|
||||||
while (i < ARRAY_SIZE(mcf_gpio_chips))
|
|
||||||
(void)gpiochip_add((struct gpio_chip *)&mcf_gpio_chips[i++]);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
core_initcall(mcf_gpio_init);
|
|
|
@ -1,20 +0,0 @@
|
||||||
#
|
|
||||||
# Makefile for the m68knommu kernel.
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# If you want to play with the HW breakpoints then you will
|
|
||||||
# need to add define this, which will give you a stack backtrace
|
|
||||||
# on the console port whenever a DBG interrupt occurs. You have to
|
|
||||||
# set up you HW breakpoints to trigger a DBG interrupt:
|
|
||||||
#
|
|
||||||
# ccflags-y := -DTRAP_DBG_INTERRUPT
|
|
||||||
# asflags-y := -DTRAP_DBG_INTERRUPT
|
|
||||||
#
|
|
||||||
|
|
||||||
asflags-$(CONFIG_FULLDEBUG) := -DDEBUGGER_COMPATIBLE_CACHE=1
|
|
||||||
|
|
||||||
obj-y += config.o gpio.o
|
|
||||||
obj-$(CONFIG_NETtel) += nettel.o
|
|
||||||
obj-$(CONFIG_CLEOPATRA) += nettel.o
|
|
||||||
|
|
|
@ -1,49 +0,0 @@
|
||||||
/*
|
|
||||||
* Coldfire generic GPIO support
|
|
||||||
*
|
|
||||||
* (C) Copyright 2009, Steven King <sfking@fdwdc.com>
|
|
||||||
*
|
|
||||||
* 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; version 2 of the License.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/init.h>
|
|
||||||
|
|
||||||
#include <asm/coldfire.h>
|
|
||||||
#include <asm/mcfsim.h>
|
|
||||||
#include <asm/mcfgpio.h>
|
|
||||||
|
|
||||||
static struct mcf_gpio_chip mcf_gpio_chips[] = {
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "PP",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value,
|
|
||||||
.ngpio = 16,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFSIM_PADDR,
|
|
||||||
.podr = (void __iomem *) MCFSIM_PADAT,
|
|
||||||
.ppdr = (void __iomem *) MCFSIM_PADAT,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init mcf_gpio_init(void)
|
|
||||||
{
|
|
||||||
unsigned i = 0;
|
|
||||||
while (i < ARRAY_SIZE(mcf_gpio_chips))
|
|
||||||
(void)gpiochip_add((struct gpio_chip *)&mcf_gpio_chips[i++]);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
core_initcall(mcf_gpio_init);
|
|
|
@ -1,18 +0,0 @@
|
||||||
#
|
|
||||||
# Makefile for the m68knommu linux kernel.
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# If you want to play with the HW breakpoints then you will
|
|
||||||
# need to add define this, which will give you a stack backtrace
|
|
||||||
# on the console port whenever a DBG interrupt occurs. You have to
|
|
||||||
# set up you HW breakpoints to trigger a DBG interrupt:
|
|
||||||
#
|
|
||||||
# ccflags-y := -DTRAP_DBG_INTERRUPT
|
|
||||||
# asflags-y := -DTRAP_DBG_INTERRUPT
|
|
||||||
#
|
|
||||||
|
|
||||||
asflags-$(CONFIG_FULLDEBUG) := -DDEBUGGER_COMPATIBLE_CACHE=1
|
|
||||||
|
|
||||||
#obj-y := config.o usb-mcf532x.o spi-mcf532x.o
|
|
||||||
obj-y := config.o gpio.o
|
|
|
@ -1,337 +0,0 @@
|
||||||
/*
|
|
||||||
* Coldfire generic GPIO support
|
|
||||||
*
|
|
||||||
* (C) Copyright 2009, Steven King <sfking@fdwdc.com>
|
|
||||||
*
|
|
||||||
* 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; version 2 of the License.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/init.h>
|
|
||||||
|
|
||||||
#include <asm/coldfire.h>
|
|
||||||
#include <asm/mcfsim.h>
|
|
||||||
#include <asm/mcfgpio.h>
|
|
||||||
|
|
||||||
static struct mcf_gpio_chip mcf_gpio_chips[] = {
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "PIRQ",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFEPORT_EPDDR,
|
|
||||||
.podr = (void __iomem *) MCFEPORT_EPDR,
|
|
||||||
.ppdr = (void __iomem *) MCFEPORT_EPPDR,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "FECH",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 8,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_FECH,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_FECH,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_FECH,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_FECH,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_FECH,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "FECL",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 16,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_FECL,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_FECL,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_FECL,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_FECL,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_FECL,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "SSI",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 24,
|
|
||||||
.ngpio = 5,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_SSI,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_SSI,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_SSI,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_SSI,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_SSI,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "BUSCTL",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 32,
|
|
||||||
.ngpio = 4,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_BUSCTL,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_BUSCTL,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_BUSCTL,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_BUSCTL,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_BUSCTL,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "BE",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 40,
|
|
||||||
.ngpio = 4,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_BE,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_BE,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_BE,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_BE,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_BE,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "CS",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 49,
|
|
||||||
.ngpio = 5,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_CS,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_CS,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_CS,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_CS,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_CS,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "PWM",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 58,
|
|
||||||
.ngpio = 4,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_PWM,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_PWM,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_PWM,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_PWM,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_PWM,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "FECI2C",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 64,
|
|
||||||
.ngpio = 4,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_FECI2C,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_FECI2C,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_FECI2C,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_FECI2C,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_FECI2C,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "UART",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 72,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_UART,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_UART,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_UART,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_UART,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_UART,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "QSPI",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 80,
|
|
||||||
.ngpio = 6,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_QSPI,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_QSPI,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_QSPI,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_QSPI,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_QSPI,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "TIMER",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 88,
|
|
||||||
.ngpio = 4,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_TIMER,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_TIMER,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_TIMER,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_TIMER,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_TIMER,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "LCDDATAH",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 96,
|
|
||||||
.ngpio = 2,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_LCDDATAH,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_LCDDATAH,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_LCDDATAH,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_LCDDATAH,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_LCDDATAH,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "LCDDATAM",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 104,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_LCDDATAM,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_LCDDATAM,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_LCDDATAM,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_LCDDATAM,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_LCDDATAM,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "LCDDATAL",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 112,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_LCDDATAL,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_LCDDATAL,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_LCDDATAL,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_LCDDATAL,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_LCDDATAL,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "LCDCTLH",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 120,
|
|
||||||
.ngpio = 1,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_LCDCTLH,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_LCDCTLH,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_LCDCTLH,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_LCDCTLH,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_LCDCTLH,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "LCDCTLL",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value_fast,
|
|
||||||
.base = 128,
|
|
||||||
.ngpio = 8,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFGPIO_PDDR_LCDCTLL,
|
|
||||||
.podr = (void __iomem *) MCFGPIO_PODR_LCDCTLL,
|
|
||||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_LCDCTLL,
|
|
||||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_LCDCTLL,
|
|
||||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_LCDCTLL,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init mcf_gpio_init(void)
|
|
||||||
{
|
|
||||||
unsigned i = 0;
|
|
||||||
while (i < ARRAY_SIZE(mcf_gpio_chips))
|
|
||||||
(void)gpiochip_add((struct gpio_chip *)&mcf_gpio_chips[i++]);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
core_initcall(mcf_gpio_init);
|
|
|
@ -1,18 +0,0 @@
|
||||||
#
|
|
||||||
# Makefile for the m68knommu linux kernel.
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# If you want to play with the HW breakpoints then you will
|
|
||||||
# need to add define this, which will give you a stack backtrace
|
|
||||||
# on the console port whenever a DBG interrupt occurs. You have to
|
|
||||||
# set up you HW breakpoints to trigger a DBG interrupt:
|
|
||||||
#
|
|
||||||
# ccflags-y := -DTRAP_DBG_INTERRUPT
|
|
||||||
# asflags-y := -DTRAP_DBG_INTERRUPT
|
|
||||||
#
|
|
||||||
|
|
||||||
asflags-$(CONFIG_FULLDEBUG) := -DDEBUGGER_COMPATIBLE_CACHE=1
|
|
||||||
|
|
||||||
obj-y := config.o gpio.o
|
|
||||||
|
|
|
@ -1,49 +0,0 @@
|
||||||
/*
|
|
||||||
* Coldfire generic GPIO support
|
|
||||||
*
|
|
||||||
* (C) Copyright 2009, Steven King <sfking@fdwdc.com>
|
|
||||||
*
|
|
||||||
* 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; version 2 of the License.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/init.h>
|
|
||||||
|
|
||||||
#include <asm/coldfire.h>
|
|
||||||
#include <asm/mcfsim.h>
|
|
||||||
#include <asm/mcfgpio.h>
|
|
||||||
|
|
||||||
static struct mcf_gpio_chip mcf_gpio_chips[] = {
|
|
||||||
{
|
|
||||||
.gpio_chip = {
|
|
||||||
.label = "PP",
|
|
||||||
.request = mcf_gpio_request,
|
|
||||||
.free = mcf_gpio_free,
|
|
||||||
.direction_input = mcf_gpio_direction_input,
|
|
||||||
.direction_output = mcf_gpio_direction_output,
|
|
||||||
.get = mcf_gpio_get_value,
|
|
||||||
.set = mcf_gpio_set_value,
|
|
||||||
.ngpio = 16,
|
|
||||||
},
|
|
||||||
.pddr = (void __iomem *) MCFSIM_PADDR,
|
|
||||||
.podr = (void __iomem *) MCFSIM_PADAT,
|
|
||||||
.ppdr = (void __iomem *) MCFSIM_PADAT,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init mcf_gpio_init(void)
|
|
||||||
{
|
|
||||||
unsigned i = 0;
|
|
||||||
while (i < ARRAY_SIZE(mcf_gpio_chips))
|
|
||||||
(void)gpiochip_add((struct gpio_chip *)&mcf_gpio_chips[i++]);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
core_initcall(mcf_gpio_init);
|
|
|
@ -1,19 +0,0 @@
|
||||||
#
|
|
||||||
# Makefile for the m68knommu linux kernel.
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# If you want to play with the HW breakpoints then you will
|
|
||||||
# need to add define this, which will give you a stack backtrace
|
|
||||||
# on the console port whenever a DBG interrupt occurs. You have to
|
|
||||||
# set up you HW breakpoints to trigger a DBG interrupt:
|
|
||||||
#
|
|
||||||
# EXTRA_CFLAGS += -DTRAP_DBG_INTERRUPT
|
|
||||||
# EXTRA_AFLAGS += -DTRAP_DBG_INTERRUPT
|
|
||||||
#
|
|
||||||
|
|
||||||
asflags-$(CONFIG_FULLDEBUG) := -DDEBUGGER_COMPATIBLE_CACHE=1
|
|
||||||
|
|
||||||
obj-y := config.o
|
|
||||||
obj-$(CONFIG_FIREBEE) += firebee.o
|
|
||||||
|
|
|
@ -15,18 +15,22 @@
|
||||||
asflags-$(CONFIG_FULLDEBUG) := -DDEBUGGER_COMPATIBLE_CACHE=1
|
asflags-$(CONFIG_FULLDEBUG) := -DDEBUGGER_COMPATIBLE_CACHE=1
|
||||||
|
|
||||||
obj-$(CONFIG_COLDFIRE) += cache.o clk.o device.o dma.o entry.o vectors.o
|
obj-$(CONFIG_COLDFIRE) += cache.o clk.o device.o dma.o entry.o vectors.o
|
||||||
obj-$(CONFIG_M5206) += timers.o intc.o reset.o
|
obj-$(CONFIG_M5206) += m5206.o timers.o intc.o reset.o
|
||||||
obj-$(CONFIG_M5206e) += timers.o intc.o reset.o
|
obj-$(CONFIG_M5206e) += m5206.o timers.o intc.o reset.o
|
||||||
obj-$(CONFIG_M520x) += pit.o intc-simr.o reset.o
|
obj-$(CONFIG_M520x) += m520x.o pit.o intc-simr.o reset.o
|
||||||
obj-$(CONFIG_M523x) += pit.o dma_timer.o intc-2.o reset.o
|
obj-$(CONFIG_M523x) += m523x.o pit.o dma_timer.o intc-2.o reset.o
|
||||||
obj-$(CONFIG_M5249) += timers.o intc.o reset.o
|
obj-$(CONFIG_M5249) += m5249.o timers.o intc.o intc-5249.o reset.o
|
||||||
obj-$(CONFIG_M527x) += pit.o intc-2.o reset.o
|
obj-$(CONFIG_M527x) += m527x.o pit.o intc-2.o reset.o
|
||||||
obj-$(CONFIG_M5272) += timers.o
|
obj-$(CONFIG_M5272) += m5272.o intc-5272.o timers.o
|
||||||
obj-$(CONFIG_M528x) += pit.o intc-2.o reset.o
|
obj-$(CONFIG_M528x) += m528x.o pit.o intc-2.o reset.o
|
||||||
obj-$(CONFIG_M5307) += timers.o intc.o reset.o
|
obj-$(CONFIG_M5307) += m5307.o timers.o intc.o reset.o
|
||||||
obj-$(CONFIG_M532x) += timers.o intc-simr.o reset.o
|
obj-$(CONFIG_M532x) += m532x.o timers.o intc-simr.o reset.o
|
||||||
obj-$(CONFIG_M5407) += timers.o intc.o reset.o
|
obj-$(CONFIG_M5407) += m5407.o timers.o intc.o reset.o
|
||||||
obj-$(CONFIG_M54xx) += sltimers.o intc-2.o
|
obj-$(CONFIG_M54xx) += m54xx.o sltimers.o intc-2.o
|
||||||
|
|
||||||
|
obj-$(CONFIG_NETtel) += nettel.o
|
||||||
|
obj-$(CONFIG_CLEOPATRA) += nettel.o
|
||||||
|
obj-$(CONFIG_FIREBEE) += firebee.o
|
||||||
|
|
||||||
obj-y += pinmux.o gpio.o
|
obj-y += pinmux.o gpio.o
|
||||||
extra-y := head.o
|
extra-y := head.o
|
||||||
|
|
|
@ -122,6 +122,10 @@ struct bus_type mcf_gpio_subsys = {
|
||||||
|
|
||||||
static int __init mcf_gpio_sysinit(void)
|
static int __init mcf_gpio_sysinit(void)
|
||||||
{
|
{
|
||||||
|
unsigned int i = 0;
|
||||||
|
|
||||||
|
while (i < mcf_gpio_chips_size)
|
||||||
|
gpiochip_add((struct gpio_chip *)&mcf_gpio_chips[i++]);
|
||||||
return subsys_system_register(&mcf_gpio_subsys, NULL);
|
return subsys_system_register(&mcf_gpio_subsys, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,15 @@
|
||||||
#include <asm/machdep.h>
|
#include <asm/machdep.h>
|
||||||
#include <asm/coldfire.h>
|
#include <asm/coldfire.h>
|
||||||
#include <asm/mcfsim.h>
|
#include <asm/mcfsim.h>
|
||||||
|
#include <asm/mcfgpio.h>
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
|
struct mcf_gpio_chip mcf_gpio_chips[] = {
|
||||||
|
MCFGPS(PP, 0, 8, MCFSIM_PADDR, MCFSIM_PADAT, MCFSIM_PADAT),
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned int mcf_gpio_chips_size = ARRAY_SIZE(mcf_gpio_chips);
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
|
|
|
@ -19,6 +19,22 @@
|
||||||
#include <asm/coldfire.h>
|
#include <asm/coldfire.h>
|
||||||
#include <asm/mcfsim.h>
|
#include <asm/mcfsim.h>
|
||||||
#include <asm/mcfuart.h>
|
#include <asm/mcfuart.h>
|
||||||
|
#include <asm/mcfgpio.h>
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
|
struct mcf_gpio_chip mcf_gpio_chips[] = {
|
||||||
|
MCFGPS(PIRQ, 0, 8, MCFEPORT_EPDDR, MCFEPORT_EPDR, MCFEPORT_EPPDR),
|
||||||
|
MCFGPF(CS, 9, 3),
|
||||||
|
MCFGPF(FECI2C, 16, 4),
|
||||||
|
MCFGPF(QSPI, 24, 4),
|
||||||
|
MCFGPF(TIMER, 32, 4),
|
||||||
|
MCFGPF(UART, 40, 8),
|
||||||
|
MCFGPF(FECH, 48, 8),
|
||||||
|
MCFGPF(FECL, 56, 8),
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned int mcf_gpio_chips_size = ARRAY_SIZE(mcf_gpio_chips);
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
|
|
|
@ -19,6 +19,28 @@
|
||||||
#include <asm/machdep.h>
|
#include <asm/machdep.h>
|
||||||
#include <asm/coldfire.h>
|
#include <asm/coldfire.h>
|
||||||
#include <asm/mcfsim.h>
|
#include <asm/mcfsim.h>
|
||||||
|
#include <asm/mcfgpio.h>
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
|
struct mcf_gpio_chip mcf_gpio_chips[] = {
|
||||||
|
MCFGPS(PIRQ, 1, 7, MCFEPORT_EPDDR, MCFEPORT_EPDR, MCFEPORT_EPPDR),
|
||||||
|
MCFGPF(ADDR, 13, 3),
|
||||||
|
MCFGPF(DATAH, 16, 8),
|
||||||
|
MCFGPF(DATAL, 24, 8),
|
||||||
|
MCFGPF(BUSCTL, 32, 8),
|
||||||
|
MCFGPF(BS, 40, 4),
|
||||||
|
MCFGPF(CS, 49, 7),
|
||||||
|
MCFGPF(SDRAM, 56, 6),
|
||||||
|
MCFGPF(FECI2C, 64, 4),
|
||||||
|
MCFGPF(UARTH, 72, 2),
|
||||||
|
MCFGPF(UARTL, 80, 8),
|
||||||
|
MCFGPF(QSPI, 88, 5),
|
||||||
|
MCFGPF(TIMER, 96, 8),
|
||||||
|
MCFGPF(ETPU, 104, 3),
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned int mcf_gpio_chips_size = ARRAY_SIZE(mcf_gpio_chips);
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
|
|
|
@ -16,6 +16,16 @@
|
||||||
#include <asm/machdep.h>
|
#include <asm/machdep.h>
|
||||||
#include <asm/coldfire.h>
|
#include <asm/coldfire.h>
|
||||||
#include <asm/mcfsim.h>
|
#include <asm/mcfsim.h>
|
||||||
|
#include <asm/mcfgpio.h>
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
|
struct mcf_gpio_chip mcf_gpio_chips[] = {
|
||||||
|
MCFGPS(GPIO0, 0, 32, MCFSIM2_GPIOENABLE, MCFSIM2_GPIOWRITE, MCFSIM2_GPIOREAD),
|
||||||
|
MCFGPS(GPIO1, 32, 32, MCFSIM2_GPIO1ENABLE, MCFSIM2_GPIO1WRITE, MCFSIM2_GPIO1READ),
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned int mcf_gpio_chips_size = ARRAY_SIZE(mcf_gpio_chips);
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <asm/coldfire.h>
|
#include <asm/coldfire.h>
|
||||||
#include <asm/mcfsim.h>
|
#include <asm/mcfsim.h>
|
||||||
#include <asm/mcfuart.h>
|
#include <asm/mcfuart.h>
|
||||||
|
#include <asm/mcfgpio.h>
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
|
|
||||||
|
@ -30,6 +31,16 @@ unsigned char ledbank = 0xff;
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
|
|
||||||
|
struct mcf_gpio_chip mcf_gpio_chips[] = {
|
||||||
|
MCFGPS(PA, 0, 16, MCFSIM_PADDR, MCFSIM_PADAT, MCFSIM_PADAT),
|
||||||
|
MCFGPS(PB, 16, 16, MCFSIM_PBDDR, MCFSIM_PBDAT, MCFSIM_PBDAT),
|
||||||
|
MCFGPS(Pc, 32, 16, MCFSIM_PCDDR, MCFSIM_PCDAT, MCFSIM_PCDAT),
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned int mcf_gpio_chips_size = ARRAY_SIZE(mcf_gpio_chips);
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
static void __init m5272_uarts_init(void)
|
static void __init m5272_uarts_init(void)
|
||||||
{
|
{
|
||||||
u32 v;
|
u32 v;
|
|
@ -20,6 +20,49 @@
|
||||||
#include <asm/coldfire.h>
|
#include <asm/coldfire.h>
|
||||||
#include <asm/mcfsim.h>
|
#include <asm/mcfsim.h>
|
||||||
#include <asm/mcfuart.h>
|
#include <asm/mcfuart.h>
|
||||||
|
#include <asm/mcfgpio.h>
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
|
struct mcf_gpio_chip mcf_gpio_chips[] = {
|
||||||
|
#if defined(CONFIG_M5271)
|
||||||
|
MCFGPS(PIRQ, 1, 7, MCFEPORT_EPDDR, MCFEPORT_EPDR, MCFEPORT_EPPDR),
|
||||||
|
MCFGPF(ADDR, 13, 3),
|
||||||
|
MCFGPF(DATAH, 16, 8),
|
||||||
|
MCFGPF(DATAL, 24, 8),
|
||||||
|
MCFGPF(BUSCTL, 32, 8),
|
||||||
|
MCFGPF(BS, 40, 4),
|
||||||
|
MCFGPF(CS, 49, 7),
|
||||||
|
MCFGPF(SDRAM, 56, 6),
|
||||||
|
MCFGPF(FECI2C, 64, 4),
|
||||||
|
MCFGPF(UARTH, 72, 2),
|
||||||
|
MCFGPF(UARTL, 80, 8),
|
||||||
|
MCFGPF(QSPI, 88, 5),
|
||||||
|
MCFGPF(TIMER, 96, 8),
|
||||||
|
#elif defined(CONFIG_M5275)
|
||||||
|
MCFGPS(PIRQ, 1, 7, MCFEPORT_EPDDR, MCFEPORT_EPDR, MCFEPORT_EPPDR),
|
||||||
|
MCFGPF(BUSCTL, 8, 8),
|
||||||
|
MCFGPF(ADDR, 21, 3),
|
||||||
|
MCFGPF(CS, 25, 7),
|
||||||
|
MCFGPF(FEC0H, 32, 8),
|
||||||
|
MCFGPF(FEC0L, 40, 8),
|
||||||
|
MCFGPF(FECI2C, 48, 6),
|
||||||
|
MCFGPF(QSPI, 56, 7),
|
||||||
|
MCFGPF(SDRAM, 64, 8),
|
||||||
|
MCFGPF(TIMERH, 72, 4),
|
||||||
|
MCFGPF(TIMERL, 80, 4),
|
||||||
|
MCFGPF(UARTL, 88, 8),
|
||||||
|
MCFGPF(FEC1H, 96, 8),
|
||||||
|
MCFGPF(FEC1L, 104, 8),
|
||||||
|
MCFGPF(BS, 114, 2),
|
||||||
|
MCFGPF(IRQ, 121, 7),
|
||||||
|
MCFGPF(USBH, 128, 1),
|
||||||
|
MCFGPF(USBL, 136, 8),
|
||||||
|
MCFGPF(UARTH, 144, 4),
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned int mcf_gpio_chips_size = ARRAY_SIZE(mcf_gpio_chips);
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
|
|
|
@ -21,6 +21,37 @@
|
||||||
#include <asm/coldfire.h>
|
#include <asm/coldfire.h>
|
||||||
#include <asm/mcfsim.h>
|
#include <asm/mcfsim.h>
|
||||||
#include <asm/mcfuart.h>
|
#include <asm/mcfuart.h>
|
||||||
|
#include <asm/mcfgpio.h>
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
|
struct mcf_gpio_chip mcf_gpio_chips[] = {
|
||||||
|
MCFGPS(NQ, 1, 7, MCFEPORT_EPDDR, MCFEPORT_EPDR, MCFEPORT_EPPDR),
|
||||||
|
MCFGPS(TA, 8, 4, MCFGPTA_GPTDDR, MCFGPTA_GPTPORT, MCFGPTB_GPTPORT),
|
||||||
|
MCFGPS(TB, 16, 4, MCFGPTB_GPTDDR, MCFGPTB_GPTPORT, MCFGPTB_GPTPORT),
|
||||||
|
MCFGPS(QA, 24, 4, MCFQADC_DDRQA, MCFQADC_PORTQA, MCFQADC_PORTQA),
|
||||||
|
MCFGPS(QB, 32, 4, MCFQADC_DDRQB, MCFQADC_PORTQB, MCFQADC_PORTQB),
|
||||||
|
MCFGPF(A, 40, 8),
|
||||||
|
MCFGPF(B, 48, 8),
|
||||||
|
MCFGPF(C, 56, 8),
|
||||||
|
MCFGPF(D, 64, 8),
|
||||||
|
MCFGPF(E, 72, 8),
|
||||||
|
MCFGPF(F, 80, 8),
|
||||||
|
MCFGPF(G, 88, 8),
|
||||||
|
MCFGPF(H, 96, 8),
|
||||||
|
MCFGPF(J, 104, 8),
|
||||||
|
MCFGPF(DD, 112, 8),
|
||||||
|
MCFGPF(EH, 120, 8),
|
||||||
|
MCFGPF(EL, 128, 8),
|
||||||
|
MCFGPF(AS, 136, 6),
|
||||||
|
MCFGPF(QS, 144, 7),
|
||||||
|
MCFGPF(SD, 152, 6),
|
||||||
|
MCFGPF(TC, 160, 4),
|
||||||
|
MCFGPF(TD, 168, 4),
|
||||||
|
MCFGPF(UA, 176, 4),
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned int mcf_gpio_chips_size = ARRAY_SIZE(mcf_gpio_chips);
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include <asm/machdep.h>
|
#include <asm/machdep.h>
|
||||||
#include <asm/coldfire.h>
|
#include <asm/coldfire.h>
|
||||||
#include <asm/mcfsim.h>
|
#include <asm/mcfsim.h>
|
||||||
|
#include <asm/mcfgpio.h>
|
||||||
#include <asm/mcfwdebug.h>
|
#include <asm/mcfwdebug.h>
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
|
@ -28,6 +29,14 @@ unsigned char ledbank = 0xff;
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
|
|
||||||
|
struct mcf_gpio_chip mcf_gpio_chips[] = {
|
||||||
|
MCFGPS(PP, 0, 16, MCFSIM_PADDR, MCFSIM_PADAT, MCFSIM_PADAT),
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned int mcf_gpio_chips_size = ARRAY_SIZE(mcf_gpio_chips);
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
void __init config_BSP(char *commandp, int size)
|
void __init config_BSP(char *commandp, int size)
|
||||||
{
|
{
|
||||||
#if defined(CONFIG_NETtel) || \
|
#if defined(CONFIG_NETtel) || \
|
|
@ -26,10 +26,35 @@
|
||||||
#include <asm/mcfsim.h>
|
#include <asm/mcfsim.h>
|
||||||
#include <asm/mcfuart.h>
|
#include <asm/mcfuart.h>
|
||||||
#include <asm/mcfdma.h>
|
#include <asm/mcfdma.h>
|
||||||
|
#include <asm/mcfgpio.h>
|
||||||
#include <asm/mcfwdebug.h>
|
#include <asm/mcfwdebug.h>
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
|
|
||||||
|
struct mcf_gpio_chip mcf_gpio_chips[] = {
|
||||||
|
MCFGPS(PIRQ, 0, 8, MCFEPORT_EPDDR, MCFEPORT_EPDR, MCFEPORT_EPPDR),
|
||||||
|
MCFGPF(FECH, 8, 8),
|
||||||
|
MCFGPF(FECL, 16, 8),
|
||||||
|
MCFGPF(SSI, 24, 5),
|
||||||
|
MCFGPF(BUSCTL, 32, 4),
|
||||||
|
MCFGPF(BE, 40, 4),
|
||||||
|
MCFGPF(CS, 49, 5),
|
||||||
|
MCFGPF(PWM, 58, 4),
|
||||||
|
MCFGPF(FECI2C, 64, 4),
|
||||||
|
MCFGPF(UART, 72, 8),
|
||||||
|
MCFGPF(QSPI, 80, 6),
|
||||||
|
MCFGPF(TIMER, 88, 4),
|
||||||
|
MCFGPF(LCDDATAH, 96, 2),
|
||||||
|
MCFGPF(LCDDATAM, 104, 8),
|
||||||
|
MCFGPF(LCDDATAL, 112, 8),
|
||||||
|
MCFGPF(LCDCTLH, 120, 1),
|
||||||
|
MCFGPF(LCDCTLL, 128, 8),
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned int mcf_gpio_chips_size = ARRAY_SIZE(mcf_gpio_chips);
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)
|
#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)
|
||||||
|
|
||||||
static void __init m532x_qspi_init(void)
|
static void __init m532x_qspi_init(void)
|
|
@ -16,6 +16,15 @@
|
||||||
#include <asm/machdep.h>
|
#include <asm/machdep.h>
|
||||||
#include <asm/coldfire.h>
|
#include <asm/coldfire.h>
|
||||||
#include <asm/mcfsim.h>
|
#include <asm/mcfsim.h>
|
||||||
|
#include <asm/mcfgpio.h>
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
|
struct mcf_gpio_chip mcf_gpio_chips[] = {
|
||||||
|
MCFGPS(PP, 0, 16, MCFSIM_PADDR, MCFSIM_PADAT, MCFSIM_PADAT),
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned int mcf_gpio_chips_size = ARRAY_SIZE(mcf_gpio_chips);
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
|
|
|
@ -21,12 +21,19 @@
|
||||||
#include <asm/m54xxsim.h>
|
#include <asm/m54xxsim.h>
|
||||||
#include <asm/mcfuart.h>
|
#include <asm/mcfuart.h>
|
||||||
#include <asm/m54xxgpt.h>
|
#include <asm/m54xxgpt.h>
|
||||||
|
#include <asm/mcfgpio.h>
|
||||||
#ifdef CONFIG_MMU
|
#ifdef CONFIG_MMU
|
||||||
#include <asm/mmu_context.h>
|
#include <asm/mmu_context.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
|
|
||||||
|
struct mcf_gpio_chip mcf_gpio_chips[] = { };
|
||||||
|
|
||||||
|
unsigned int mcf_gpio_chips_size = ARRAY_SIZE(mcf_gpio_chips);
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
static void __init m54xx_uarts_init(void)
|
static void __init m54xx_uarts_init(void)
|
||||||
{
|
{
|
||||||
/* enable io pins */
|
/* enable io pins */
|
Loading…
Reference in a new issue