Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/vapier/blackfin
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/vapier/blackfin: (75 commits) Blackfin: update ftrace for latest toolchain Blackfin: fix elf_fpregset_t definition Blackfin: unify cache init functions Blackfin: swap clocksource ratings for gptimer/cycles Blackfin: update ftrace_push_return_trace() breakage Blackfin: update cm board resources Blackfin: cm-bf537u: split board from cm-bf537e Blackfin: bf538-ezkit: add SPI IRQ resources Blackfin: increase default async timings for parallel flashes Blackfin: add ICPLB coverage for async banks Blackfin: use KERN_ALERT in all kgdb_test output Blackfin: fix BF54x SPI CS resources Blackfin: fix typo in isram_write() Blackfin: bf537-stamp: add adp5588 gpio resources Blackfin: add some isram-driver self tests Blackfin: workaround anomaly 05000283 Blackfin: fix spelling in a few comments Blackfin: use raw_smp_processor_id() in exception code Blackfin: remove useless duplicated assignment in gpio code Blackfin: Fix link errors with binutils 2.19 and GCC 4.3 ...
This commit is contained in:
commit
abf5940dad
@ -342,8 +342,9 @@ config MEM_MT48LC64M4A2FB_7E
|
|||||||
config MEM_MT48LC16M16A2TG_75
|
config MEM_MT48LC16M16A2TG_75
|
||||||
bool
|
bool
|
||||||
depends on (BFIN533_EZKIT || BFIN561_EZKIT \
|
depends on (BFIN533_EZKIT || BFIN561_EZKIT \
|
||||||
|| BFIN533_BLUETECHNIX_CM || BFIN537_BLUETECHNIX_CM \
|
|| BFIN533_BLUETECHNIX_CM || BFIN537_BLUETECHNIX_CM_E \
|
||||||
|| H8606_HVSISTEMAS || BFIN527_BLUETECHNIX_CM)
|
|| BFIN537_BLUETECHNIX_CM_U || H8606_HVSISTEMAS \
|
||||||
|
|| BFIN527_BLUETECHNIX_CM)
|
||||||
default y
|
default y
|
||||||
|
|
||||||
config MEM_MT48LC32M8A2_75
|
config MEM_MT48LC32M8A2_75
|
||||||
@ -459,7 +460,7 @@ config VCO_MULT
|
|||||||
default "45" if BFIN533_STAMP
|
default "45" if BFIN533_STAMP
|
||||||
default "20" if (BFIN537_STAMP || BFIN527_EZKIT || BFIN548_EZKIT || BFIN548_BLUETECHNIX_CM || BFIN538_EZKIT)
|
default "20" if (BFIN537_STAMP || BFIN527_EZKIT || BFIN548_EZKIT || BFIN548_BLUETECHNIX_CM || BFIN538_EZKIT)
|
||||||
default "22" if BFIN533_BLUETECHNIX_CM
|
default "22" if BFIN533_BLUETECHNIX_CM
|
||||||
default "20" if (BFIN537_BLUETECHNIX_CM || BFIN527_BLUETECHNIX_CM || BFIN561_BLUETECHNIX_CM)
|
default "20" if (BFIN537_BLUETECHNIX_CM_E || BFIN537_BLUETECHNIX_CM_U || BFIN527_BLUETECHNIX_CM || BFIN561_BLUETECHNIX_CM)
|
||||||
default "20" if BFIN561_EZKIT
|
default "20" if BFIN561_EZKIT
|
||||||
default "16" if (H8606_HVSISTEMAS || BLACKSTAMP || BFIN526_EZBRD || BFIN518F_EZBRD)
|
default "16" if (H8606_HVSISTEMAS || BLACKSTAMP || BFIN526_EZBRD || BFIN518F_EZBRD)
|
||||||
help
|
help
|
||||||
@ -574,8 +575,8 @@ config MAX_VCO_HZ
|
|||||||
default 400000000 if BF514
|
default 400000000 if BF514
|
||||||
default 400000000 if BF516
|
default 400000000 if BF516
|
||||||
default 400000000 if BF518
|
default 400000000 if BF518
|
||||||
default 600000000 if BF522
|
default 400000000 if BF522
|
||||||
default 400000000 if BF523
|
default 600000000 if BF523
|
||||||
default 400000000 if BF524
|
default 400000000 if BF524
|
||||||
default 600000000 if BF525
|
default 600000000 if BF525
|
||||||
default 400000000 if BF526
|
default 400000000 if BF526
|
||||||
@ -647,7 +648,7 @@ config CYCLES_CLOCKSOURCE
|
|||||||
writing the registers will most likely crash the kernel.
|
writing the registers will most likely crash the kernel.
|
||||||
|
|
||||||
config GPTMR0_CLOCKSOURCE
|
config GPTMR0_CLOCKSOURCE
|
||||||
bool "Use GPTimer0 as a clocksource (higher rating)"
|
bool "Use GPTimer0 as a clocksource"
|
||||||
select BFIN_GPTIMERS
|
select BFIN_GPTIMERS
|
||||||
depends on GENERIC_CLOCKEVENTS
|
depends on GENERIC_CLOCKEVENTS
|
||||||
depends on !TICKSOURCE_GPTMR0
|
depends on !TICKSOURCE_GPTMR0
|
||||||
@ -917,10 +918,6 @@ comment "Cache Support"
|
|||||||
config BFIN_ICACHE
|
config BFIN_ICACHE
|
||||||
bool "Enable ICACHE"
|
bool "Enable ICACHE"
|
||||||
default y
|
default y
|
||||||
config BFIN_ICACHE_LOCK
|
|
||||||
bool "Enable Instruction Cache Locking"
|
|
||||||
depends on BFIN_ICACHE
|
|
||||||
default n
|
|
||||||
config BFIN_EXTMEM_ICACHEABLE
|
config BFIN_EXTMEM_ICACHEABLE
|
||||||
bool "Enable ICACHE for external memory"
|
bool "Enable ICACHE for external memory"
|
||||||
depends on BFIN_ICACHE
|
depends on BFIN_ICACHE
|
||||||
@ -987,7 +984,7 @@ endchoice
|
|||||||
config BFIN_L2_DCACHEABLE
|
config BFIN_L2_DCACHEABLE
|
||||||
bool "Enable DCACHE for L2 SRAM"
|
bool "Enable DCACHE for L2 SRAM"
|
||||||
depends on BFIN_DCACHE
|
depends on BFIN_DCACHE
|
||||||
depends on BF54x || BF561
|
depends on (BF54x || BF561) && !SMP
|
||||||
default n
|
default n
|
||||||
choice
|
choice
|
||||||
prompt "L2 SRAM DCACHE policy"
|
prompt "L2 SRAM DCACHE policy"
|
||||||
@ -995,11 +992,9 @@ choice
|
|||||||
default BFIN_L2_WRITEBACK
|
default BFIN_L2_WRITEBACK
|
||||||
config BFIN_L2_WRITEBACK
|
config BFIN_L2_WRITEBACK
|
||||||
bool "Write back"
|
bool "Write back"
|
||||||
depends on !SMP
|
|
||||||
|
|
||||||
config BFIN_L2_WRITETHROUGH
|
config BFIN_L2_WRITETHROUGH
|
||||||
bool "Write through"
|
bool "Write through"
|
||||||
depends on !SMP
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
|
||||||
@ -1154,11 +1149,12 @@ source "fs/Kconfig.binfmt"
|
|||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
menu "Power management options"
|
menu "Power management options"
|
||||||
|
depends on !SMP
|
||||||
|
|
||||||
source "kernel/power/Kconfig"
|
source "kernel/power/Kconfig"
|
||||||
|
|
||||||
config ARCH_SUSPEND_POSSIBLE
|
config ARCH_SUSPEND_POSSIBLE
|
||||||
def_bool y
|
def_bool y
|
||||||
depends on !SMP
|
|
||||||
|
|
||||||
choice
|
choice
|
||||||
prompt "Standby Power Saving Mode"
|
prompt "Standby Power Saving Mode"
|
||||||
@ -1246,6 +1242,7 @@ config PM_BFIN_WAKE_GP
|
|||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
menu "CPU Frequency scaling"
|
menu "CPU Frequency scaling"
|
||||||
|
depends on !SMP
|
||||||
|
|
||||||
source "drivers/cpufreq/Kconfig"
|
source "drivers/cpufreq/Kconfig"
|
||||||
|
|
||||||
|
@ -252,4 +252,10 @@ config ACCESS_CHECK
|
|||||||
|
|
||||||
Say N here to disable that check to improve the performance.
|
Say N here to disable that check to improve the performance.
|
||||||
|
|
||||||
|
config BFIN_ISRAM_SELF_TEST
|
||||||
|
bool "isram boot self tests"
|
||||||
|
default n
|
||||||
|
help
|
||||||
|
Run some self tests of the isram driver code at boot.
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
@ -358,9 +358,9 @@ CONFIG_C_AMBEN_ALL=y
|
|||||||
# EBIU_AMBCTL Control
|
# EBIU_AMBCTL Control
|
||||||
#
|
#
|
||||||
CONFIG_BANK_0=0x7BB0
|
CONFIG_BANK_0=0x7BB0
|
||||||
CONFIG_BANK_1=0x5554
|
CONFIG_BANK_1=0x7BB0
|
||||||
CONFIG_BANK_2=0x7BB0
|
CONFIG_BANK_2=0x7BB0
|
||||||
CONFIG_BANK_3=0xFFC0
|
CONFIG_BANK_3=0x99B2
|
||||||
|
|
||||||
#
|
#
|
||||||
# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
|
# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
|
||||||
|
@ -359,9 +359,9 @@ CONFIG_C_AMBEN_ALL=y
|
|||||||
# EBIU_AMBCTL Control
|
# EBIU_AMBCTL Control
|
||||||
#
|
#
|
||||||
CONFIG_BANK_0=0x7BB0
|
CONFIG_BANK_0=0x7BB0
|
||||||
CONFIG_BANK_1=0x5554
|
CONFIG_BANK_1=0x7BB0
|
||||||
CONFIG_BANK_2=0x7BB0
|
CONFIG_BANK_2=0x7BB0
|
||||||
CONFIG_BANK_3=0xFFC0
|
CONFIG_BANK_3=0x99B2
|
||||||
|
|
||||||
#
|
#
|
||||||
# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
|
# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
|
||||||
|
@ -363,9 +363,9 @@ CONFIG_C_AMBEN_ALL=y
|
|||||||
# EBIU_AMBCTL Control
|
# EBIU_AMBCTL Control
|
||||||
#
|
#
|
||||||
CONFIG_BANK_0=0x7BB0
|
CONFIG_BANK_0=0x7BB0
|
||||||
CONFIG_BANK_1=0x5554
|
CONFIG_BANK_1=0x7BB0
|
||||||
CONFIG_BANK_2=0x7BB0
|
CONFIG_BANK_2=0x7BB0
|
||||||
CONFIG_BANK_3=0xFFC0
|
CONFIG_BANK_3=0x99B2
|
||||||
|
|
||||||
#
|
#
|
||||||
# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
|
# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
|
||||||
|
@ -400,7 +400,7 @@ CONFIG_C_AMBEN_ALL=y
|
|||||||
# EBIU_AMBCTL Control
|
# EBIU_AMBCTL Control
|
||||||
#
|
#
|
||||||
CONFIG_BANK_0=0x7BB0
|
CONFIG_BANK_0=0x7BB0
|
||||||
CONFIG_BANK_1=0x5554
|
CONFIG_BANK_1=0x7BB0
|
||||||
CONFIG_BANK_2=0x7BB0
|
CONFIG_BANK_2=0x7BB0
|
||||||
CONFIG_BANK_3=0x99B2
|
CONFIG_BANK_3=0x99B2
|
||||||
CONFIG_EBIU_MBSCTLVAL=0x0
|
CONFIG_EBIU_MBSCTLVAL=0x0
|
||||||
|
@ -66,7 +66,6 @@ extern void program_IAR(void);
|
|||||||
|
|
||||||
extern asmlinkage void lower_to_irq14(void);
|
extern asmlinkage void lower_to_irq14(void);
|
||||||
extern asmlinkage void bfin_return_from_exception(void);
|
extern asmlinkage void bfin_return_from_exception(void);
|
||||||
extern asmlinkage void evt14_softirq(void);
|
|
||||||
extern asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs);
|
extern asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs);
|
||||||
extern int bfin_internal_set_wake(unsigned int irq, unsigned int state);
|
extern int bfin_internal_set_wake(unsigned int irq, unsigned int state);
|
||||||
|
|
||||||
@ -100,11 +99,6 @@ extern unsigned long bfin_sic_iwr[];
|
|||||||
extern unsigned vr_wakeup;
|
extern unsigned vr_wakeup;
|
||||||
extern u16 _bfin_swrst; /* shadow for Software Reset Register (SWRST) */
|
extern u16 _bfin_swrst; /* shadow for Software Reset Register (SWRST) */
|
||||||
|
|
||||||
#ifdef CONFIG_BFIN_ICACHE_LOCK
|
|
||||||
extern void cache_grab_lock(int way);
|
|
||||||
extern void bfin_cache_lock(int way);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* _BLACKFIN_H_ */
|
#endif /* _BLACKFIN_H_ */
|
||||||
|
@ -127,6 +127,7 @@ struct bfin5xx_spi_chip {
|
|||||||
u32 cs_gpio;
|
u32 cs_gpio;
|
||||||
/* Value to send if no TX value is supplied, usually 0x0 or 0xFFFF */
|
/* Value to send if no TX value is supplied, usually 0x0 or 0xFFFF */
|
||||||
u16 idle_tx_val;
|
u16 idle_tx_val;
|
||||||
|
u8 pio_interrupt; /* Enable spi data irq */
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* _SPI_CHANNEL_H_ */
|
#endif /* _SPI_CHANNEL_H_ */
|
||||||
|
@ -125,4 +125,48 @@
|
|||||||
#define FAULT_USERSUPV (1 << 17)
|
#define FAULT_USERSUPV (1 << 17)
|
||||||
#define FAULT_CPLBBITS 0x0000ffff
|
#define FAULT_CPLBBITS 0x0000ffff
|
||||||
|
|
||||||
#endif /* _CPLB_H */
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
static inline void _disable_cplb(u32 mmr, u32 mask)
|
||||||
|
{
|
||||||
|
u32 ctrl = bfin_read32(mmr) & ~mask;
|
||||||
|
/* CSYNC to ensure load store ordering */
|
||||||
|
__builtin_bfin_csync();
|
||||||
|
bfin_write32(mmr, ctrl);
|
||||||
|
__builtin_bfin_ssync();
|
||||||
|
}
|
||||||
|
static inline void disable_cplb(u32 mmr, u32 mask)
|
||||||
|
{
|
||||||
|
u32 ctrl = bfin_read32(mmr) & ~mask;
|
||||||
|
CSYNC();
|
||||||
|
bfin_write32(mmr, ctrl);
|
||||||
|
SSYNC();
|
||||||
|
}
|
||||||
|
#define _disable_dcplb() _disable_cplb(DMEM_CONTROL, ENDCPLB)
|
||||||
|
#define disable_dcplb() disable_cplb(DMEM_CONTROL, ENDCPLB)
|
||||||
|
#define _disable_icplb() _disable_cplb(IMEM_CONTROL, ENICPLB)
|
||||||
|
#define disable_icplb() disable_cplb(IMEM_CONTROL, ENICPLB)
|
||||||
|
|
||||||
|
static inline void _enable_cplb(u32 mmr, u32 mask)
|
||||||
|
{
|
||||||
|
u32 ctrl = bfin_read32(mmr) | mask;
|
||||||
|
/* CSYNC to ensure load store ordering */
|
||||||
|
__builtin_bfin_csync();
|
||||||
|
bfin_write32(mmr, ctrl);
|
||||||
|
__builtin_bfin_ssync();
|
||||||
|
}
|
||||||
|
static inline void enable_cplb(u32 mmr, u32 mask)
|
||||||
|
{
|
||||||
|
u32 ctrl = bfin_read32(mmr) | mask;
|
||||||
|
CSYNC();
|
||||||
|
bfin_write32(mmr, ctrl);
|
||||||
|
SSYNC();
|
||||||
|
}
|
||||||
|
#define _enable_dcplb() _enable_cplb(DMEM_CONTROL, ENDCPLB)
|
||||||
|
#define enable_dcplb() enable_cplb(DMEM_CONTROL, ENDCPLB)
|
||||||
|
#define _enable_icplb() _enable_cplb(IMEM_CONTROL, ENICPLB)
|
||||||
|
#define enable_icplb() enable_cplb(IMEM_CONTROL, ENICPLB)
|
||||||
|
|
||||||
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
||||||
|
#endif /* _CPLB_H */
|
||||||
|
@ -21,8 +21,32 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __ASM_EARLY_PRINTK_H__
|
||||||
|
#define __ASM_EARLY_PRINTK_H__
|
||||||
|
|
||||||
#ifdef CONFIG_EARLY_PRINTK
|
#ifdef CONFIG_EARLY_PRINTK
|
||||||
|
/* For those that don't include it already */
|
||||||
|
#include <linux/console.h>
|
||||||
|
|
||||||
extern int setup_early_printk(char *);
|
extern int setup_early_printk(char *);
|
||||||
|
extern void enable_shadow_console(void);
|
||||||
|
extern int shadow_console_enabled(void);
|
||||||
|
extern void mark_shadow_error(void);
|
||||||
|
extern void early_shadow_reg(unsigned long reg, unsigned int n);
|
||||||
|
extern void early_shadow_write(struct console *con, const char *s,
|
||||||
|
unsigned int n) __attribute__((nonnull(2)));
|
||||||
|
#define early_shadow_puts(str) early_shadow_write(NULL, str, strlen(str))
|
||||||
|
#define early_shadow_stamp() \
|
||||||
|
do { \
|
||||||
|
early_shadow_puts(__FILE__ " : " __stringify(__LINE__) " ["); \
|
||||||
|
early_shadow_puts(__func__); \
|
||||||
|
early_shadow_puts("]\n"); \
|
||||||
|
} while (0)
|
||||||
#else
|
#else
|
||||||
#define setup_early_printk(fmt) do { } while (0)
|
#define setup_early_printk(fmt) do { } while (0)
|
||||||
|
#define enable_shadow_console(fmt) do { } while (0)
|
||||||
|
#define early_shadow_stamp() do { } while (0)
|
||||||
#endif /* CONFIG_EARLY_PRINTK */
|
#endif /* CONFIG_EARLY_PRINTK */
|
||||||
|
|
||||||
|
#endif /* __ASM_EARLY_PRINTK_H__ */
|
||||||
|
@ -23,7 +23,7 @@ typedef unsigned long elf_greg_t;
|
|||||||
#define ELF_NGREG 40 /* (sizeof(struct user_regs_struct) / sizeof(elf_greg_t)) */
|
#define ELF_NGREG 40 /* (sizeof(struct user_regs_struct) / sizeof(elf_greg_t)) */
|
||||||
typedef elf_greg_t elf_gregset_t[ELF_NGREG];
|
typedef elf_greg_t elf_gregset_t[ELF_NGREG];
|
||||||
|
|
||||||
typedef struct user_bfinfp_struct elf_fpregset_t;
|
typedef struct { } elf_fpregset_t;
|
||||||
/*
|
/*
|
||||||
* This is used to ensure we don't load something for the wrong architecture.
|
* This is used to ensure we don't load something for the wrong architecture.
|
||||||
*/
|
*/
|
||||||
|
@ -36,6 +36,21 @@
|
|||||||
# define LOAD_IPIPE_IPEND
|
# define LOAD_IPIPE_IPEND
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Workaround for anomalies 05000283 and 05000315
|
||||||
|
*/
|
||||||
|
#if ANOMALY_05000283 || ANOMALY_05000315
|
||||||
|
# define ANOMALY_283_315_WORKAROUND(preg, dreg) \
|
||||||
|
cc = dreg == dreg; \
|
||||||
|
preg.h = HI(CHIPID); \
|
||||||
|
preg.l = LO(CHIPID); \
|
||||||
|
if cc jump 1f; \
|
||||||
|
dreg.l = W[preg]; \
|
||||||
|
1:
|
||||||
|
#else
|
||||||
|
# define ANOMALY_283_315_WORKAROUND(preg, dreg)
|
||||||
|
#endif /* ANOMALY_05000283 || ANOMALY_05000315 */
|
||||||
|
|
||||||
#ifndef CONFIG_EXACT_HWERR
|
#ifndef CONFIG_EXACT_HWERR
|
||||||
/* As a debugging aid - we save IPEND when DEBUG_KERNEL is on,
|
/* As a debugging aid - we save IPEND when DEBUG_KERNEL is on,
|
||||||
* otherwise it is a waste of cycles.
|
* otherwise it is a waste of cycles.
|
||||||
@ -88,17 +103,22 @@
|
|||||||
* As you can see by the code - we actually need to do two SSYNCS - one to
|
* As you can see by the code - we actually need to do two SSYNCS - one to
|
||||||
* make sure the read/writes complete, and another to make sure the hardware
|
* make sure the read/writes complete, and another to make sure the hardware
|
||||||
* error is recognized by the core.
|
* error is recognized by the core.
|
||||||
|
*
|
||||||
|
* The extra nop before the SSYNC is to make sure we work around 05000244,
|
||||||
|
* since the 283/315 workaround includes a branch to the end
|
||||||
*/
|
*/
|
||||||
#define INTERRUPT_ENTRY(N) \
|
#define INTERRUPT_ENTRY(N) \
|
||||||
SSYNC; \
|
|
||||||
SSYNC; \
|
|
||||||
[--sp] = SYSCFG; \
|
[--sp] = SYSCFG; \
|
||||||
[--sp] = P0; /*orig_p0*/ \
|
[--sp] = P0; /*orig_p0*/ \
|
||||||
[--sp] = R0; /*orig_r0*/ \
|
[--sp] = R0; /*orig_r0*/ \
|
||||||
[--sp] = (R7:0,P5:0); \
|
[--sp] = (R7:0,P5:0); \
|
||||||
R1 = ASTAT; \
|
R1 = ASTAT; \
|
||||||
|
ANOMALY_283_315_WORKAROUND(p0, r0) \
|
||||||
P0.L = LO(ILAT); \
|
P0.L = LO(ILAT); \
|
||||||
P0.H = HI(ILAT); \
|
P0.H = HI(ILAT); \
|
||||||
|
NOP; \
|
||||||
|
SSYNC; \
|
||||||
|
SSYNC; \
|
||||||
R0 = [P0]; \
|
R0 = [P0]; \
|
||||||
CC = BITTST(R0, EVT_IVHW_P); \
|
CC = BITTST(R0, EVT_IVHW_P); \
|
||||||
IF CC JUMP 1f; \
|
IF CC JUMP 1f; \
|
||||||
@ -118,15 +138,17 @@
|
|||||||
RTI;
|
RTI;
|
||||||
|
|
||||||
#define TIMER_INTERRUPT_ENTRY(N) \
|
#define TIMER_INTERRUPT_ENTRY(N) \
|
||||||
SSYNC; \
|
|
||||||
SSYNC; \
|
|
||||||
[--sp] = SYSCFG; \
|
[--sp] = SYSCFG; \
|
||||||
[--sp] = P0; /*orig_p0*/ \
|
[--sp] = P0; /*orig_p0*/ \
|
||||||
[--sp] = R0; /*orig_r0*/ \
|
[--sp] = R0; /*orig_r0*/ \
|
||||||
[--sp] = (R7:0,P5:0); \
|
[--sp] = (R7:0,P5:0); \
|
||||||
R1 = ASTAT; \
|
R1 = ASTAT; \
|
||||||
|
ANOMALY_283_315_WORKAROUND(p0, r0) \
|
||||||
P0.L = LO(ILAT); \
|
P0.L = LO(ILAT); \
|
||||||
P0.H = HI(ILAT); \
|
P0.H = HI(ILAT); \
|
||||||
|
NOP; \
|
||||||
|
SSYNC; \
|
||||||
|
SSYNC; \
|
||||||
R0 = [P0]; \
|
R0 = [P0]; \
|
||||||
CC = BITTST(R0, EVT_IVHW_P); \
|
CC = BITTST(R0, EVT_IVHW_P); \
|
||||||
IF CC JUMP 1f; \
|
IF CC JUMP 1f; \
|
||||||
|
@ -8,6 +8,6 @@
|
|||||||
#ifndef __ASM_BFIN_FTRACE_H__
|
#ifndef __ASM_BFIN_FTRACE_H__
|
||||||
#define __ASM_BFIN_FTRACE_H__
|
#define __ASM_BFIN_FTRACE_H__
|
||||||
|
|
||||||
#define MCOUNT_INSN_SIZE 8 /* sizeof mcount call: LINK + CALL */
|
#define MCOUNT_INSN_SIZE 6 /* sizeof "[++sp] = rets; call __mcount;" */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -145,10 +145,6 @@ void __ipipe_handle_irq(unsigned irq, struct pt_regs *regs);
|
|||||||
|
|
||||||
int __ipipe_get_irq_priority(unsigned irq);
|
int __ipipe_get_irq_priority(unsigned irq);
|
||||||
|
|
||||||
void __ipipe_stall_root_raw(void);
|
|
||||||
|
|
||||||
void __ipipe_unstall_root_raw(void);
|
|
||||||
|
|
||||||
void __ipipe_serial_debug(const char *fmt, ...);
|
void __ipipe_serial_debug(const char *fmt, ...);
|
||||||
|
|
||||||
asmlinkage void __ipipe_call_irqtail(unsigned long addr);
|
asmlinkage void __ipipe_call_irqtail(unsigned long addr);
|
||||||
@ -234,9 +230,6 @@ int ipipe_start_irq_thread(unsigned irq, struct irq_desc *desc);
|
|||||||
#define task_hijacked(p) 0
|
#define task_hijacked(p) 0
|
||||||
#define ipipe_trap_notify(t, r) 0
|
#define ipipe_trap_notify(t, r) 0
|
||||||
|
|
||||||
#define __ipipe_stall_root_raw() do { } while (0)
|
|
||||||
#define __ipipe_unstall_root_raw() do { } while (0)
|
|
||||||
|
|
||||||
#define ipipe_init_irq_threads() do { } while (0)
|
#define ipipe_init_irq_threads() do { } while (0)
|
||||||
#define ipipe_start_irq_thread(irq, desc) 0
|
#define ipipe_start_irq_thread(irq, desc) 0
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@ asmlinkage void evt_evt10(void);
|
|||||||
asmlinkage void evt_evt11(void);
|
asmlinkage void evt_evt11(void);
|
||||||
asmlinkage void evt_evt12(void);
|
asmlinkage void evt_evt12(void);
|
||||||
asmlinkage void evt_evt13(void);
|
asmlinkage void evt_evt13(void);
|
||||||
|
asmlinkage void evt_evt14(void);
|
||||||
asmlinkage void evt_soft_int1(void);
|
asmlinkage void evt_soft_int1(void);
|
||||||
asmlinkage void evt_system_call(void);
|
asmlinkage void evt_system_call(void);
|
||||||
asmlinkage void init_exception_buff(void);
|
asmlinkage void init_exception_buff(void);
|
||||||
|
@ -127,17 +127,17 @@ static inline void protect_page(struct mm_struct *mm, unsigned long addr,
|
|||||||
unsigned long idx = page >> 5;
|
unsigned long idx = page >> 5;
|
||||||
unsigned long bit = 1 << (page & 31);
|
unsigned long bit = 1 << (page & 31);
|
||||||
|
|
||||||
if (flags & VM_MAYREAD)
|
if (flags & VM_READ)
|
||||||
mask[idx] |= bit;
|
mask[idx] |= bit;
|
||||||
else
|
else
|
||||||
mask[idx] &= ~bit;
|
mask[idx] &= ~bit;
|
||||||
mask += page_mask_nelts;
|
mask += page_mask_nelts;
|
||||||
if (flags & VM_MAYWRITE)
|
if (flags & VM_WRITE)
|
||||||
mask[idx] |= bit;
|
mask[idx] |= bit;
|
||||||
else
|
else
|
||||||
mask[idx] &= ~bit;
|
mask[idx] &= ~bit;
|
||||||
mask += page_mask_nelts;
|
mask += page_mask_nelts;
|
||||||
if (flags & VM_MAYEXEC)
|
if (flags & VM_EXEC)
|
||||||
mask[idx] |= bit;
|
mask[idx] |= bit;
|
||||||
else
|
else
|
||||||
mask[idx] &= ~bit;
|
mask[idx] &= ~bit;
|
||||||
|
@ -50,6 +50,7 @@ struct blackfin_pda { /* Per-processor Data Area */
|
|||||||
unsigned long ex_optr;
|
unsigned long ex_optr;
|
||||||
unsigned long ex_buf[4];
|
unsigned long ex_buf[4];
|
||||||
unsigned long ex_imask; /* Saved imask from exception */
|
unsigned long ex_imask; /* Saved imask from exception */
|
||||||
|
unsigned long ex_ipend; /* Saved IPEND from exception */
|
||||||
unsigned long *ex_stack; /* Exception stack space */
|
unsigned long *ex_stack; /* Exception stack space */
|
||||||
|
|
||||||
#ifdef ANOMALY_05000261
|
#ifdef ANOMALY_05000261
|
||||||
@ -60,6 +61,12 @@ struct blackfin_pda { /* Per-processor Data Area */
|
|||||||
unsigned long retx;
|
unsigned long retx;
|
||||||
unsigned long seqstat;
|
unsigned long seqstat;
|
||||||
unsigned int __nmi_count; /* number of times NMI asserted on this CPU */
|
unsigned int __nmi_count; /* number of times NMI asserted on this CPU */
|
||||||
|
#ifdef CONFIG_DEBUG_DOUBLEFAULT
|
||||||
|
unsigned long dcplb_doublefault_addr;
|
||||||
|
unsigned long icplb_doublefault_addr;
|
||||||
|
unsigned long retx_doublefault;
|
||||||
|
unsigned long seqstat_doublefault;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct blackfin_pda cpu_pda[];
|
extern struct blackfin_pda cpu_pda[];
|
||||||
|
@ -26,6 +26,7 @@ obj-$(CONFIG_MODULES) += module.o
|
|||||||
obj-$(CONFIG_KGDB) += kgdb.o
|
obj-$(CONFIG_KGDB) += kgdb.o
|
||||||
obj-$(CONFIG_KGDB_TESTS) += kgdb_test.o
|
obj-$(CONFIG_KGDB_TESTS) += kgdb_test.o
|
||||||
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
|
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
|
||||||
|
obj-$(CONFIG_EARLY_PRINTK) += shadow_console.o
|
||||||
obj-$(CONFIG_STACKTRACE) += stacktrace.o
|
obj-$(CONFIG_STACKTRACE) += stacktrace.o
|
||||||
|
|
||||||
# the kgdb test puts code into L2 and without linker
|
# the kgdb test puts code into L2 and without linker
|
||||||
|
@ -145,6 +145,7 @@ int main(void)
|
|||||||
DEFINE(PDA_EXBUF, offsetof(struct blackfin_pda, ex_buf));
|
DEFINE(PDA_EXBUF, offsetof(struct blackfin_pda, ex_buf));
|
||||||
DEFINE(PDA_EXIMASK, offsetof(struct blackfin_pda, ex_imask));
|
DEFINE(PDA_EXIMASK, offsetof(struct blackfin_pda, ex_imask));
|
||||||
DEFINE(PDA_EXSTACK, offsetof(struct blackfin_pda, ex_stack));
|
DEFINE(PDA_EXSTACK, offsetof(struct blackfin_pda, ex_stack));
|
||||||
|
DEFINE(PDA_EXIPEND, offsetof(struct blackfin_pda, ex_ipend));
|
||||||
#ifdef ANOMALY_05000261
|
#ifdef ANOMALY_05000261
|
||||||
DEFINE(PDA_LFRETX, offsetof(struct blackfin_pda, last_cplb_fault_retx));
|
DEFINE(PDA_LFRETX, offsetof(struct blackfin_pda, last_cplb_fault_retx));
|
||||||
#endif
|
#endif
|
||||||
@ -152,6 +153,12 @@ int main(void)
|
|||||||
DEFINE(PDA_ICPLB, offsetof(struct blackfin_pda, icplb_fault_addr));
|
DEFINE(PDA_ICPLB, offsetof(struct blackfin_pda, icplb_fault_addr));
|
||||||
DEFINE(PDA_RETX, offsetof(struct blackfin_pda, retx));
|
DEFINE(PDA_RETX, offsetof(struct blackfin_pda, retx));
|
||||||
DEFINE(PDA_SEQSTAT, offsetof(struct blackfin_pda, seqstat));
|
DEFINE(PDA_SEQSTAT, offsetof(struct blackfin_pda, seqstat));
|
||||||
|
#ifdef CONFIG_DEBUG_DOUBLEFAULT
|
||||||
|
DEFINE(PDA_DF_DCPLB, offsetof(struct blackfin_pda, dcplb_doublefault_addr));
|
||||||
|
DEFINE(PDA_DF_ICPLB, offsetof(struct blackfin_pda, icplb_doublefault_addr));
|
||||||
|
DEFINE(PDA_DF_SEQSTAT, offsetof(struct blackfin_pda, seqstat_doublefault));
|
||||||
|
DEFINE(PDA_DF_RETX, offsetof(struct blackfin_pda, retx_doublefault));
|
||||||
|
#endif
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
/* Inter-core lock (in L2 SRAM) */
|
/* Inter-core lock (in L2 SRAM) */
|
||||||
DEFINE(SIZEOF_CORELOCK, sizeof(struct corelock_slot));
|
DEFINE(SIZEOF_CORELOCK, sizeof(struct corelock_slot));
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
#include <asm/dma.h>
|
#include <asm/dma.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
|
#include <asm/early_printk.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* To make sure we work around 05000119 - we always check DMA_DONE bit,
|
* To make sure we work around 05000119 - we always check DMA_DONE bit,
|
||||||
@ -146,8 +147,8 @@ EXPORT_SYMBOL(request_dma);
|
|||||||
|
|
||||||
int set_dma_callback(unsigned int channel, irq_handler_t callback, void *data)
|
int set_dma_callback(unsigned int channel, irq_handler_t callback, void *data)
|
||||||
{
|
{
|
||||||
BUG_ON(!(dma_ch[channel].chan_status != DMA_CHANNEL_FREE
|
BUG_ON(channel >= MAX_DMA_CHANNELS ||
|
||||||
&& channel < MAX_DMA_CHANNELS));
|
dma_ch[channel].chan_status == DMA_CHANNEL_FREE);
|
||||||
|
|
||||||
if (callback != NULL) {
|
if (callback != NULL) {
|
||||||
int ret;
|
int ret;
|
||||||
@ -181,8 +182,8 @@ static void clear_dma_buffer(unsigned int channel)
|
|||||||
void free_dma(unsigned int channel)
|
void free_dma(unsigned int channel)
|
||||||
{
|
{
|
||||||
pr_debug("freedma() : BEGIN \n");
|
pr_debug("freedma() : BEGIN \n");
|
||||||
BUG_ON(!(dma_ch[channel].chan_status != DMA_CHANNEL_FREE
|
BUG_ON(channel >= MAX_DMA_CHANNELS ||
|
||||||
&& channel < MAX_DMA_CHANNELS));
|
dma_ch[channel].chan_status == DMA_CHANNEL_FREE);
|
||||||
|
|
||||||
/* Halt the DMA */
|
/* Halt the DMA */
|
||||||
disable_dma(channel);
|
disable_dma(channel);
|
||||||
@ -236,6 +237,7 @@ void blackfin_dma_resume(void)
|
|||||||
*/
|
*/
|
||||||
void __init blackfin_dma_early_init(void)
|
void __init blackfin_dma_early_init(void)
|
||||||
{
|
{
|
||||||
|
early_shadow_stamp();
|
||||||
bfin_write_MDMA_S0_CONFIG(0);
|
bfin_write_MDMA_S0_CONFIG(0);
|
||||||
bfin_write_MDMA_S1_CONFIG(0);
|
bfin_write_MDMA_S1_CONFIG(0);
|
||||||
}
|
}
|
||||||
@ -246,6 +248,8 @@ void __init early_dma_memcpy(void *pdst, const void *psrc, size_t size)
|
|||||||
unsigned long src = (unsigned long)psrc;
|
unsigned long src = (unsigned long)psrc;
|
||||||
struct dma_register *dst_ch, *src_ch;
|
struct dma_register *dst_ch, *src_ch;
|
||||||
|
|
||||||
|
early_shadow_stamp();
|
||||||
|
|
||||||
/* We assume that everything is 4 byte aligned, so include
|
/* We assume that everything is 4 byte aligned, so include
|
||||||
* a basic sanity check
|
* a basic sanity check
|
||||||
*/
|
*/
|
||||||
@ -300,6 +304,8 @@ void __init early_dma_memcpy(void *pdst, const void *psrc, size_t size)
|
|||||||
|
|
||||||
void __init early_dma_memcpy_done(void)
|
void __init early_dma_memcpy_done(void)
|
||||||
{
|
{
|
||||||
|
early_shadow_stamp();
|
||||||
|
|
||||||
while ((bfin_read_MDMA_S0_CONFIG() && !(bfin_read_MDMA_D0_IRQ_STATUS() & DMA_DONE)) ||
|
while ((bfin_read_MDMA_S0_CONFIG() && !(bfin_read_MDMA_D0_IRQ_STATUS() & DMA_DONE)) ||
|
||||||
(bfin_read_MDMA_S1_CONFIG() && !(bfin_read_MDMA_D1_IRQ_STATUS() & DMA_DONE)))
|
(bfin_read_MDMA_S1_CONFIG() && !(bfin_read_MDMA_D1_IRQ_STATUS() & DMA_DONE)))
|
||||||
continue;
|
continue;
|
||||||
|
@ -722,7 +722,6 @@ void bfin_gpio_pm_hibernate_suspend(void)
|
|||||||
gpio_bank_saved[bank].fer = gpio_array[bank]->port_fer;
|
gpio_bank_saved[bank].fer = gpio_array[bank]->port_fer;
|
||||||
gpio_bank_saved[bank].mux = gpio_array[bank]->port_mux;
|
gpio_bank_saved[bank].mux = gpio_array[bank]->port_mux;
|
||||||
gpio_bank_saved[bank].data = gpio_array[bank]->data;
|
gpio_bank_saved[bank].data = gpio_array[bank]->data;
|
||||||
gpio_bank_saved[bank].data = gpio_array[bank]->data;
|
|
||||||
gpio_bank_saved[bank].inen = gpio_array[bank]->inen;
|
gpio_bank_saved[bank].inen = gpio_array[bank]->inen;
|
||||||
gpio_bank_saved[bank].dir = gpio_array[bank]->dir_set;
|
gpio_bank_saved[bank].dir = gpio_array[bank]->dir_set;
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
# arch/blackfin/kernel/cplb-nompu/Makefile
|
# arch/blackfin/kernel/cplb-nompu/Makefile
|
||||||
#
|
#
|
||||||
|
|
||||||
obj-y := cplbinit.o cacheinit.o cplbmgr.o
|
obj-y := cplbinit.o cplbmgr.o
|
||||||
|
|
||||||
CFLAGS_cplbmgr.o := -ffixed-I0 -ffixed-I1 -ffixed-I2 -ffixed-I3 \
|
CFLAGS_cplbmgr.o := -ffixed-I0 -ffixed-I1 -ffixed-I2 -ffixed-I3 \
|
||||||
-ffixed-L0 -ffixed-L1 -ffixed-L2 -ffixed-L3 \
|
-ffixed-L0 -ffixed-L1 -ffixed-L2 -ffixed-L3 \
|
||||||
|
@ -1,69 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2004-2007 Analog Devices Inc.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, see the file COPYING, or write
|
|
||||||
* to the Free Software Foundation, Inc.,
|
|
||||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/cpu.h>
|
|
||||||
|
|
||||||
#include <asm/cacheflush.h>
|
|
||||||
#include <asm/blackfin.h>
|
|
||||||
#include <asm/cplb.h>
|
|
||||||
#include <asm/cplbinit.h>
|
|
||||||
|
|
||||||
#if defined(CONFIG_BFIN_ICACHE)
|
|
||||||
void __cpuinit bfin_icache_init(struct cplb_entry *icplb_tbl)
|
|
||||||
{
|
|
||||||
unsigned long ctrl;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
SSYNC();
|
|
||||||
for (i = 0; i < MAX_CPLBS; i++) {
|
|
||||||
bfin_write32(ICPLB_ADDR0 + i * 4, icplb_tbl[i].addr);
|
|
||||||
bfin_write32(ICPLB_DATA0 + i * 4, icplb_tbl[i].data);
|
|
||||||
}
|
|
||||||
ctrl = bfin_read_IMEM_CONTROL();
|
|
||||||
ctrl |= IMC | ENICPLB;
|
|
||||||
bfin_write_IMEM_CONTROL(ctrl);
|
|
||||||
SSYNC();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_BFIN_DCACHE)
|
|
||||||
void __cpuinit bfin_dcache_init(struct cplb_entry *dcplb_tbl)
|
|
||||||
{
|
|
||||||
unsigned long ctrl;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
SSYNC();
|
|
||||||
for (i = 0; i < MAX_CPLBS; i++) {
|
|
||||||
bfin_write32(DCPLB_ADDR0 + i * 4, dcplb_tbl[i].addr);
|
|
||||||
bfin_write32(DCPLB_DATA0 + i * 4, dcplb_tbl[i].data);
|
|
||||||
}
|
|
||||||
|
|
||||||
ctrl = bfin_read_DMEM_CONTROL();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Anomaly notes:
|
|
||||||
* 05000287 - We implement workaround #2 - Change the DMEM_CONTROL
|
|
||||||
* register, so that the port preferences for DAG0 and DAG1 are set
|
|
||||||
* to port B
|
|
||||||
*/
|
|
||||||
ctrl |= DMEM_CNTR | PORT_PREF0 | (ANOMALY_05000287 ? PORT_PREF1 : 0);
|
|
||||||
bfin_write_DMEM_CONTROL(ctrl);
|
|
||||||
SSYNC();
|
|
||||||
}
|
|
||||||
#endif
|
|
@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
#include <asm/blackfin.h>
|
#include <asm/blackfin.h>
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
|
#include <asm/cplb.h>
|
||||||
#include <asm/cplbinit.h>
|
#include <asm/cplbinit.h>
|
||||||
#include <asm/mmu_context.h>
|
#include <asm/mmu_context.h>
|
||||||
|
|
||||||
@ -41,46 +42,6 @@ int nr_dcplb_miss[NR_CPUS], nr_icplb_miss[NR_CPUS];
|
|||||||
int nr_icplb_supv_miss[NR_CPUS], nr_dcplb_prot[NR_CPUS];
|
int nr_icplb_supv_miss[NR_CPUS], nr_dcplb_prot[NR_CPUS];
|
||||||
int nr_cplb_flush[NR_CPUS];
|
int nr_cplb_flush[NR_CPUS];
|
||||||
|
|
||||||
static inline void disable_dcplb(void)
|
|
||||||
{
|
|
||||||
unsigned long ctrl;
|
|
||||||
SSYNC();
|
|
||||||
ctrl = bfin_read_DMEM_CONTROL();
|
|
||||||
ctrl &= ~ENDCPLB;
|
|
||||||
bfin_write_DMEM_CONTROL(ctrl);
|
|
||||||
SSYNC();
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void enable_dcplb(void)
|
|
||||||
{
|
|
||||||
unsigned long ctrl;
|
|
||||||
SSYNC();
|
|
||||||
ctrl = bfin_read_DMEM_CONTROL();
|
|
||||||
ctrl |= ENDCPLB;
|
|
||||||
bfin_write_DMEM_CONTROL(ctrl);
|
|
||||||
SSYNC();
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void disable_icplb(void)
|
|
||||||
{
|
|
||||||
unsigned long ctrl;
|
|
||||||
SSYNC();
|
|
||||||
ctrl = bfin_read_IMEM_CONTROL();
|
|
||||||
ctrl &= ~ENICPLB;
|
|
||||||
bfin_write_IMEM_CONTROL(ctrl);
|
|
||||||
SSYNC();
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void enable_icplb(void)
|
|
||||||
{
|
|
||||||
unsigned long ctrl;
|
|
||||||
SSYNC();
|
|
||||||
ctrl = bfin_read_IMEM_CONTROL();
|
|
||||||
ctrl |= ENICPLB;
|
|
||||||
bfin_write_IMEM_CONTROL(ctrl);
|
|
||||||
SSYNC();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Given the contents of the status register, return the index of the
|
* Given the contents of the status register, return the index of the
|
||||||
* CPLB that caused the fault.
|
* CPLB that caused the fault.
|
||||||
@ -198,10 +159,10 @@ static noinline int dcplb_miss(unsigned int cpu)
|
|||||||
dcplb_tbl[cpu][idx].addr = addr;
|
dcplb_tbl[cpu][idx].addr = addr;
|
||||||
dcplb_tbl[cpu][idx].data = d_data;
|
dcplb_tbl[cpu][idx].data = d_data;
|
||||||
|
|
||||||
disable_dcplb();
|
_disable_dcplb();
|
||||||
bfin_write32(DCPLB_DATA0 + idx * 4, d_data);
|
bfin_write32(DCPLB_DATA0 + idx * 4, d_data);
|
||||||
bfin_write32(DCPLB_ADDR0 + idx * 4, addr);
|
bfin_write32(DCPLB_ADDR0 + idx * 4, addr);
|
||||||
enable_dcplb();
|
_enable_dcplb();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -288,10 +249,10 @@ static noinline int icplb_miss(unsigned int cpu)
|
|||||||
icplb_tbl[cpu][idx].addr = addr;
|
icplb_tbl[cpu][idx].addr = addr;
|
||||||
icplb_tbl[cpu][idx].data = i_data;
|
icplb_tbl[cpu][idx].data = i_data;
|
||||||
|
|
||||||
disable_icplb();
|
_disable_icplb();
|
||||||
bfin_write32(ICPLB_DATA0 + idx * 4, i_data);
|
bfin_write32(ICPLB_DATA0 + idx * 4, i_data);
|
||||||
bfin_write32(ICPLB_ADDR0 + idx * 4, addr);
|
bfin_write32(ICPLB_ADDR0 + idx * 4, addr);
|
||||||
enable_icplb();
|
_enable_icplb();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -319,7 +280,7 @@ static noinline int dcplb_protection_fault(unsigned int cpu)
|
|||||||
int cplb_hdr(int seqstat, struct pt_regs *regs)
|
int cplb_hdr(int seqstat, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
int cause = seqstat & 0x3f;
|
int cause = seqstat & 0x3f;
|
||||||
unsigned int cpu = smp_processor_id();
|
unsigned int cpu = raw_smp_processor_id();
|
||||||
switch (cause) {
|
switch (cause) {
|
||||||
case 0x23:
|
case 0x23:
|
||||||
return dcplb_protection_fault(cpu);
|
return dcplb_protection_fault(cpu);
|
||||||
@ -340,19 +301,19 @@ void flush_switched_cplbs(unsigned int cpu)
|
|||||||
nr_cplb_flush[cpu]++;
|
nr_cplb_flush[cpu]++;
|
||||||
|
|
||||||
local_irq_save_hw(flags);
|
local_irq_save_hw(flags);
|
||||||
disable_icplb();
|
_disable_icplb();
|
||||||
for (i = first_switched_icplb; i < MAX_CPLBS; i++) {
|
for (i = first_switched_icplb; i < MAX_CPLBS; i++) {
|
||||||
icplb_tbl[cpu][i].data = 0;
|
icplb_tbl[cpu][i].data = 0;
|
||||||
bfin_write32(ICPLB_DATA0 + i * 4, 0);
|
bfin_write32(ICPLB_DATA0 + i * 4, 0);
|
||||||
}
|
}
|
||||||
enable_icplb();
|
_enable_icplb();
|
||||||
|
|
||||||
disable_dcplb();
|
_disable_dcplb();
|
||||||
for (i = first_switched_dcplb; i < MAX_CPLBS; i++) {
|
for (i = first_switched_dcplb; i < MAX_CPLBS; i++) {
|
||||||
dcplb_tbl[cpu][i].data = 0;
|
dcplb_tbl[cpu][i].data = 0;
|
||||||
bfin_write32(DCPLB_DATA0 + i * 4, 0);
|
bfin_write32(DCPLB_DATA0 + i * 4, 0);
|
||||||
}
|
}
|
||||||
enable_dcplb();
|
_enable_dcplb();
|
||||||
local_irq_restore_hw(flags);
|
local_irq_restore_hw(flags);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -385,7 +346,7 @@ void set_mask_dcplbs(unsigned long *masks, unsigned int cpu)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
disable_dcplb();
|
_disable_dcplb();
|
||||||
for (i = first_mask_dcplb; i < first_switched_dcplb; i++) {
|
for (i = first_mask_dcplb; i < first_switched_dcplb; i++) {
|
||||||
dcplb_tbl[cpu][i].addr = addr;
|
dcplb_tbl[cpu][i].addr = addr;
|
||||||
dcplb_tbl[cpu][i].data = d_data;
|
dcplb_tbl[cpu][i].data = d_data;
|
||||||
@ -393,6 +354,6 @@ void set_mask_dcplbs(unsigned long *masks, unsigned int cpu)
|
|||||||
bfin_write32(DCPLB_ADDR0 + i * 4, addr);
|
bfin_write32(DCPLB_ADDR0 + i * 4, addr);
|
||||||
addr += PAGE_SIZE;
|
addr += PAGE_SIZE;
|
||||||
}
|
}
|
||||||
enable_dcplb();
|
_enable_dcplb();
|
||||||
local_irq_restore_hw(flags);
|
local_irq_restore_hw(flags);
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
# arch/blackfin/kernel/cplb-nompu/Makefile
|
# arch/blackfin/kernel/cplb-nompu/Makefile
|
||||||
#
|
#
|
||||||
|
|
||||||
obj-y := cplbinit.o cacheinit.o cplbmgr.o
|
obj-y := cplbinit.o cplbmgr.o
|
||||||
|
|
||||||
CFLAGS_cplbmgr.o := -ffixed-I0 -ffixed-I1 -ffixed-I2 -ffixed-I3 \
|
CFLAGS_cplbmgr.o := -ffixed-I0 -ffixed-I1 -ffixed-I2 -ffixed-I3 \
|
||||||
-ffixed-L0 -ffixed-L1 -ffixed-L2 -ffixed-L3 \
|
-ffixed-L0 -ffixed-L1 -ffixed-L2 -ffixed-L3 \
|
||||||
|
@ -1,69 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2004-2007 Analog Devices Inc.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, see the file COPYING, or write
|
|
||||||
* to the Free Software Foundation, Inc.,
|
|
||||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/cpu.h>
|
|
||||||
|
|
||||||
#include <asm/cacheflush.h>
|
|
||||||
#include <asm/blackfin.h>
|
|
||||||
#include <asm/cplb.h>
|
|
||||||
#include <asm/cplbinit.h>
|
|
||||||
|
|
||||||
#if defined(CONFIG_BFIN_ICACHE)
|
|
||||||
void __cpuinit bfin_icache_init(struct cplb_entry *icplb_tbl)
|
|
||||||
{
|
|
||||||
unsigned long ctrl;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
SSYNC();
|
|
||||||
for (i = 0; i < MAX_CPLBS; i++) {
|
|
||||||
bfin_write32(ICPLB_ADDR0 + i * 4, icplb_tbl[i].addr);
|
|
||||||
bfin_write32(ICPLB_DATA0 + i * 4, icplb_tbl[i].data);
|
|
||||||
}
|
|
||||||
ctrl = bfin_read_IMEM_CONTROL();
|
|
||||||
ctrl |= IMC | ENICPLB;
|
|
||||||
bfin_write_IMEM_CONTROL(ctrl);
|
|
||||||
SSYNC();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_BFIN_DCACHE)
|
|
||||||
void __cpuinit bfin_dcache_init(struct cplb_entry *dcplb_tbl)
|
|
||||||
{
|
|
||||||
unsigned long ctrl;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
SSYNC();
|
|
||||||
for (i = 0; i < MAX_CPLBS; i++) {
|
|
||||||
bfin_write32(DCPLB_ADDR0 + i * 4, dcplb_tbl[i].addr);
|
|
||||||
bfin_write32(DCPLB_DATA0 + i * 4, dcplb_tbl[i].data);
|
|
||||||
}
|
|
||||||
|
|
||||||
ctrl = bfin_read_DMEM_CONTROL();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Anomaly notes:
|
|
||||||
* 05000287 - We implement workaround #2 - Change the DMEM_CONTROL
|
|
||||||
* register, so that the port preferences for DAG0 and DAG1 are set
|
|
||||||
* to port B
|
|
||||||
*/
|
|
||||||
ctrl |= DMEM_CNTR | PORT_PREF0 | (ANOMALY_05000287 ? PORT_PREF1 : 0);
|
|
||||||
bfin_write_DMEM_CONTROL(ctrl);
|
|
||||||
SSYNC();
|
|
||||||
}
|
|
||||||
#endif
|
|
@ -36,7 +36,7 @@ int first_switched_icplb PDT_ATTR;
|
|||||||
int first_switched_dcplb PDT_ATTR;
|
int first_switched_dcplb PDT_ATTR;
|
||||||
|
|
||||||
struct cplb_boundary dcplb_bounds[9] PDT_ATTR;
|
struct cplb_boundary dcplb_bounds[9] PDT_ATTR;
|
||||||
struct cplb_boundary icplb_bounds[7] PDT_ATTR;
|
struct cplb_boundary icplb_bounds[9] PDT_ATTR;
|
||||||
|
|
||||||
int icplb_nr_bounds PDT_ATTR;
|
int icplb_nr_bounds PDT_ATTR;
|
||||||
int dcplb_nr_bounds PDT_ATTR;
|
int dcplb_nr_bounds PDT_ATTR;
|
||||||
@ -167,14 +167,21 @@ void __init generate_cplb_tables_all(void)
|
|||||||
icplb_bounds[i_i++].data = (reserved_mem_icache_on ?
|
icplb_bounds[i_i++].data = (reserved_mem_icache_on ?
|
||||||
SDRAM_IGENERIC : SDRAM_INON_CHBL);
|
SDRAM_IGENERIC : SDRAM_INON_CHBL);
|
||||||
}
|
}
|
||||||
|
/* Addressing hole up to the async bank. */
|
||||||
|
icplb_bounds[i_i].eaddr = ASYNC_BANK0_BASE;
|
||||||
|
icplb_bounds[i_i++].data = 0;
|
||||||
|
/* ASYNC banks. */
|
||||||
|
icplb_bounds[i_i].eaddr = ASYNC_BANK3_BASE + ASYNC_BANK3_SIZE;
|
||||||
|
icplb_bounds[i_i++].data = SDRAM_EBIU;
|
||||||
/* Addressing hole up to BootROM. */
|
/* Addressing hole up to BootROM. */
|
||||||
icplb_bounds[i_i].eaddr = BOOT_ROM_START;
|
icplb_bounds[i_i].eaddr = BOOT_ROM_START;
|
||||||
icplb_bounds[i_i++].data = 0;
|
icplb_bounds[i_i++].data = 0;
|
||||||
/* BootROM -- largest one should be less than 1 meg. */
|
/* BootROM -- largest one should be less than 1 meg. */
|
||||||
icplb_bounds[i_i].eaddr = BOOT_ROM_START + (1 * 1024 * 1024);
|
icplb_bounds[i_i].eaddr = BOOT_ROM_START + (1 * 1024 * 1024);
|
||||||
icplb_bounds[i_i++].data = SDRAM_IGENERIC;
|
icplb_bounds[i_i++].data = SDRAM_IGENERIC;
|
||||||
|
|
||||||
if (L2_LENGTH) {
|
if (L2_LENGTH) {
|
||||||
/* Addressing hole up to L2 SRAM, including the async bank. */
|
/* Addressing hole up to L2 SRAM. */
|
||||||
icplb_bounds[i_i].eaddr = L2_START;
|
icplb_bounds[i_i].eaddr = L2_START;
|
||||||
icplb_bounds[i_i++].data = 0;
|
icplb_bounds[i_i++].data = 0;
|
||||||
/* L2 SRAM. */
|
/* L2 SRAM. */
|
||||||
|
@ -48,36 +48,13 @@ int nr_cplb_flush[NR_CPUS], nr_dcplb_prot[NR_CPUS];
|
|||||||
#define MGR_ATTR
|
#define MGR_ATTR
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* We're in an exception handler. The normal cli nop nop workaround
|
|
||||||
* isn't going to do very much, as the only thing that can interrupt
|
|
||||||
* us is an NMI, and the cli isn't going to stop that.
|
|
||||||
*/
|
|
||||||
#define NOWA_SSYNC __asm__ __volatile__ ("ssync;")
|
|
||||||
|
|
||||||
/* Anomaly handlers provide SSYNCs, so avoid extra if anomaly is present */
|
|
||||||
#if ANOMALY_05000125
|
|
||||||
|
|
||||||
#define bfin_write_DMEM_CONTROL_SSYNC(v) bfin_write_DMEM_CONTROL(v)
|
|
||||||
#define bfin_write_IMEM_CONTROL_SSYNC(v) bfin_write_IMEM_CONTROL(v)
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define bfin_write_DMEM_CONTROL_SSYNC(v) \
|
|
||||||
do { NOWA_SSYNC; bfin_write_DMEM_CONTROL(v); NOWA_SSYNC; } while (0)
|
|
||||||
#define bfin_write_IMEM_CONTROL_SSYNC(v) \
|
|
||||||
do { NOWA_SSYNC; bfin_write_IMEM_CONTROL(v); NOWA_SSYNC; } while (0)
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static inline void write_dcplb_data(int cpu, int idx, unsigned long data,
|
static inline void write_dcplb_data(int cpu, int idx, unsigned long data,
|
||||||
unsigned long addr)
|
unsigned long addr)
|
||||||
{
|
{
|
||||||
unsigned long ctrl = bfin_read_DMEM_CONTROL();
|
_disable_dcplb();
|
||||||
bfin_write_DMEM_CONTROL_SSYNC(ctrl & ~ENDCPLB);
|
|
||||||
bfin_write32(DCPLB_DATA0 + idx * 4, data);
|
bfin_write32(DCPLB_DATA0 + idx * 4, data);
|
||||||
bfin_write32(DCPLB_ADDR0 + idx * 4, addr);
|
bfin_write32(DCPLB_ADDR0 + idx * 4, addr);
|
||||||
bfin_write_DMEM_CONTROL_SSYNC(ctrl);
|
_enable_dcplb();
|
||||||
|
|
||||||
#ifdef CONFIG_CPLB_INFO
|
#ifdef CONFIG_CPLB_INFO
|
||||||
dcplb_tbl[cpu][idx].addr = addr;
|
dcplb_tbl[cpu][idx].addr = addr;
|
||||||
@ -88,12 +65,10 @@ static inline void write_dcplb_data(int cpu, int idx, unsigned long data,
|
|||||||
static inline void write_icplb_data(int cpu, int idx, unsigned long data,
|
static inline void write_icplb_data(int cpu, int idx, unsigned long data,
|
||||||
unsigned long addr)
|
unsigned long addr)
|
||||||
{
|
{
|
||||||
unsigned long ctrl = bfin_read_IMEM_CONTROL();
|
_disable_icplb();
|
||||||
|
|
||||||
bfin_write_IMEM_CONTROL_SSYNC(ctrl & ~ENICPLB);
|
|
||||||
bfin_write32(ICPLB_DATA0 + idx * 4, data);
|
bfin_write32(ICPLB_DATA0 + idx * 4, data);
|
||||||
bfin_write32(ICPLB_ADDR0 + idx * 4, addr);
|
bfin_write32(ICPLB_ADDR0 + idx * 4, addr);
|
||||||
bfin_write_IMEM_CONTROL_SSYNC(ctrl);
|
_enable_icplb();
|
||||||
|
|
||||||
#ifdef CONFIG_CPLB_INFO
|
#ifdef CONFIG_CPLB_INFO
|
||||||
icplb_tbl[cpu][idx].addr = addr;
|
icplb_tbl[cpu][idx].addr = addr;
|
||||||
@ -227,7 +202,7 @@ MGR_ATTR static int dcplb_miss(int cpu)
|
|||||||
MGR_ATTR int cplb_hdr(int seqstat, struct pt_regs *regs)
|
MGR_ATTR int cplb_hdr(int seqstat, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
int cause = seqstat & 0x3f;
|
int cause = seqstat & 0x3f;
|
||||||
unsigned int cpu = smp_processor_id();
|
unsigned int cpu = raw_smp_processor_id();
|
||||||
switch (cause) {
|
switch (cause) {
|
||||||
case VEC_CPLB_I_M:
|
case VEC_CPLB_I_M:
|
||||||
return icplb_miss(cpu);
|
return icplb_miss(cpu);
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#include <linux/serial_core.h>
|
#include <linux/serial_core.h>
|
||||||
#include <linux/console.h>
|
#include <linux/console.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
|
#include <linux/reboot.h>
|
||||||
#include <asm/blackfin.h>
|
#include <asm/blackfin.h>
|
||||||
#include <asm/irq_handler.h>
|
#include <asm/irq_handler.h>
|
||||||
#include <asm/early_printk.h>
|
#include <asm/early_printk.h>
|
||||||
@ -181,6 +182,22 @@ asmlinkage void __init init_early_exception_vectors(void)
|
|||||||
u32 evt;
|
u32 evt;
|
||||||
SSYNC();
|
SSYNC();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This starts up the shadow buffer, incase anything crashes before
|
||||||
|
* setup arch
|
||||||
|
*/
|
||||||
|
mark_shadow_error();
|
||||||
|
early_shadow_puts(linux_banner);
|
||||||
|
early_shadow_stamp();
|
||||||
|
|
||||||
|
if (CPUID != bfin_cpuid()) {
|
||||||
|
early_shadow_puts("Running on wrong machine type, expected");
|
||||||
|
early_shadow_reg(CPUID, 16);
|
||||||
|
early_shadow_puts(", but running on");
|
||||||
|
early_shadow_reg(bfin_cpuid(), 16);
|
||||||
|
early_shadow_puts("\n");
|
||||||
|
}
|
||||||
|
|
||||||
/* cannot program in software:
|
/* cannot program in software:
|
||||||
* evt0 - emulation (jtag)
|
* evt0 - emulation (jtag)
|
||||||
* evt1 - reset
|
* evt1 - reset
|
||||||
@ -199,6 +216,7 @@ asmlinkage void __init init_early_exception_vectors(void)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__attribute__((__noreturn__))
|
||||||
asmlinkage void __init early_trap_c(struct pt_regs *fp, void *retaddr)
|
asmlinkage void __init early_trap_c(struct pt_regs *fp, void *retaddr)
|
||||||
{
|
{
|
||||||
/* This can happen before the uart is initialized, so initialize
|
/* This can happen before the uart is initialized, so initialize
|
||||||
@ -210,10 +228,58 @@ asmlinkage void __init early_trap_c(struct pt_regs *fp, void *retaddr)
|
|||||||
if (likely(early_console == NULL) && CPUID == bfin_cpuid())
|
if (likely(early_console == NULL) && CPUID == bfin_cpuid())
|
||||||
setup_early_printk(DEFAULT_EARLY_PORT);
|
setup_early_printk(DEFAULT_EARLY_PORT);
|
||||||
|
|
||||||
printk(KERN_EMERG "Early panic\n");
|
if (!shadow_console_enabled()) {
|
||||||
dump_bfin_mem(fp);
|
/* crap - we crashed before setup_arch() */
|
||||||
show_regs(fp);
|
early_shadow_puts("panic before setup_arch\n");
|
||||||
dump_bfin_trace_buffer();
|
early_shadow_puts("IPEND:");
|
||||||
|
early_shadow_reg(fp->ipend, 16);
|
||||||
|
if (fp->seqstat & SEQSTAT_EXCAUSE) {
|
||||||
|
early_shadow_puts("\nEXCAUSE:");
|
||||||
|
early_shadow_reg(fp->seqstat & SEQSTAT_EXCAUSE, 8);
|
||||||
|
}
|
||||||
|
if (fp->seqstat & SEQSTAT_HWERRCAUSE) {
|
||||||
|
early_shadow_puts("\nHWERRCAUSE:");
|
||||||
|
early_shadow_reg(
|
||||||
|
(fp->seqstat & SEQSTAT_HWERRCAUSE) >> 14, 8);
|
||||||
|
}
|
||||||
|
early_shadow_puts("\nErr @");
|
||||||
|
if (fp->ipend & EVT_EVX)
|
||||||
|
early_shadow_reg(fp->retx, 32);
|
||||||
|
else
|
||||||
|
early_shadow_reg(fp->pc, 32);
|
||||||
|
#ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON
|
||||||
|
early_shadow_puts("\nTrace:");
|
||||||
|
if (likely(bfin_read_TBUFSTAT() & TBUFCNT)) {
|
||||||
|
while (bfin_read_TBUFSTAT() & TBUFCNT) {
|
||||||
|
early_shadow_puts("\nT :");
|
||||||
|
early_shadow_reg(bfin_read_TBUF(), 32);
|
||||||
|
early_shadow_puts("\n S :");
|
||||||
|
early_shadow_reg(bfin_read_TBUF(), 32);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
early_shadow_puts("\nUse bfin-elf-addr2line to determine "
|
||||||
|
"function names\n");
|
||||||
|
/*
|
||||||
|
* We should panic(), but we can't - since panic calls printk,
|
||||||
|
* and printk uses memcpy.
|
||||||
|
* we want to reboot, but if the machine type is different,
|
||||||
|
* can't due to machine specific reboot sequences
|
||||||
|
*/
|
||||||
|
if (CPUID == bfin_cpuid()) {
|
||||||
|
early_shadow_puts("Trying to restart\n");
|
||||||
|
machine_restart("");
|
||||||
|
}
|
||||||
|
|
||||||
|
early_shadow_puts("Halting, since it is not safe to restart\n");
|
||||||
|
while (1)
|
||||||
|
asm volatile ("EMUEXCPT; IDLE;\n");
|
||||||
|
|
||||||
|
} else {
|
||||||
|
printk(KERN_EMERG "Early panic\n");
|
||||||
|
show_regs(fp);
|
||||||
|
dump_bfin_trace_buffer();
|
||||||
|
}
|
||||||
|
|
||||||
panic("Died early");
|
panic("Died early");
|
||||||
}
|
}
|
||||||
|
@ -43,8 +43,28 @@
|
|||||||
|
|
||||||
ENTRY(_ret_from_fork)
|
ENTRY(_ret_from_fork)
|
||||||
#ifdef CONFIG_IPIPE
|
#ifdef CONFIG_IPIPE
|
||||||
[--sp] = reti; /* IRQs on. */
|
/*
|
||||||
SP += 4;
|
* Hw IRQs are off on entry, and we don't want the scheduling tail
|
||||||
|
* code to starve high priority domains from interrupts while it
|
||||||
|
* runs. Therefore we first stall the root stage to have the
|
||||||
|
* virtual interrupt state reflect IMASK.
|
||||||
|
*/
|
||||||
|
p0.l = ___ipipe_root_status;
|
||||||
|
p0.h = ___ipipe_root_status;
|
||||||
|
r4 = [p0];
|
||||||
|
bitset(r4, 0);
|
||||||
|
[p0] = r4;
|
||||||
|
/*
|
||||||
|
* Then we may enable hw IRQs, allowing preemption from high
|
||||||
|
* priority domains. schedule_tail() will do local_irq_enable()
|
||||||
|
* since Blackfin does not define __ARCH_WANT_UNLOCKED_CTXSW, so
|
||||||
|
* there is no need to unstall the root domain by ourselves
|
||||||
|
* afterwards.
|
||||||
|
*/
|
||||||
|
p0.l = _bfin_irq_flags;
|
||||||
|
p0.h = _bfin_irq_flags;
|
||||||
|
r4 = [p0];
|
||||||
|
sti r4;
|
||||||
#endif /* CONFIG_IPIPE */
|
#endif /* CONFIG_IPIPE */
|
||||||
SP += -12;
|
SP += -12;
|
||||||
call _schedule_tail;
|
call _schedule_tail;
|
||||||
|
@ -17,8 +17,8 @@
|
|||||||
* only one we can blow away. With pointer registers, we have P0-P2.
|
* only one we can blow away. With pointer registers, we have P0-P2.
|
||||||
*
|
*
|
||||||
* Upon entry, the RETS will point to the top of the current profiled
|
* Upon entry, the RETS will point to the top of the current profiled
|
||||||
* function. And since GCC setup the frame for us, the previous function
|
* function. And since GCC pushed the previous RETS for us, the previous
|
||||||
* will be waiting there. mmmm pie.
|
* function will be waiting there. mmmm pie.
|
||||||
*/
|
*/
|
||||||
ENTRY(__mcount)
|
ENTRY(__mcount)
|
||||||
/* save third function arg early so we can do testing below */
|
/* save third function arg early so we can do testing below */
|
||||||
@ -70,14 +70,14 @@ ENTRY(__mcount)
|
|||||||
/* setup the tracer function */
|
/* setup the tracer function */
|
||||||
p0 = r3;
|
p0 = r3;
|
||||||
|
|
||||||
/* tracer(ulong frompc, ulong selfpc):
|
/* function_trace_call(unsigned long ip, unsigned long parent_ip):
|
||||||
* frompc: the pc that did the call to ...
|
* ip: this point was called by ...
|
||||||
* selfpc: ... this location
|
* parent_ip: ... this function
|
||||||
* the selfpc itself will need adjusting for the mcount call
|
* the ip itself will need adjusting for the mcount call
|
||||||
*/
|
*/
|
||||||
r1 = rets;
|
r0 = rets;
|
||||||
r0 = [fp + 4];
|
r1 = [sp + 16]; /* skip the 4 local regs on stack */
|
||||||
r1 += -MCOUNT_INSN_SIZE;
|
r0 += -MCOUNT_INSN_SIZE;
|
||||||
|
|
||||||
/* call the tracer */
|
/* call the tracer */
|
||||||
call (p0);
|
call (p0);
|
||||||
@ -106,9 +106,10 @@ ENTRY(_ftrace_graph_caller)
|
|||||||
[--sp] = r1;
|
[--sp] = r1;
|
||||||
[--sp] = rets;
|
[--sp] = rets;
|
||||||
|
|
||||||
r0 = fp;
|
/* prepare_ftrace_return(unsigned long *parent, unsigned long self_addr) */
|
||||||
|
r0 = sp;
|
||||||
r1 = rets;
|
r1 = rets;
|
||||||
r0 += 4;
|
r0 += 16; /* skip the 4 local regs on stack */
|
||||||
r1 += -MCOUNT_INSN_SIZE;
|
r1 += -MCOUNT_INSN_SIZE;
|
||||||
call _prepare_ftrace_return;
|
call _prepare_ftrace_return;
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr)
|
|||||||
if (unlikely(atomic_read(¤t->tracing_graph_pause)))
|
if (unlikely(atomic_read(¤t->tracing_graph_pause)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (ftrace_push_return_trace(*parent, self_addr, &trace.depth) == -EBUSY)
|
if (ftrace_push_return_trace(*parent, self_addr, &trace.depth, 0) == -EBUSY)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
trace.func = self_addr;
|
trace.func = self_addr;
|
||||||
|
@ -30,10 +30,10 @@
|
|||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/kthread.h>
|
#include <linux/kthread.h>
|
||||||
#include <asm/unistd.h>
|
#include <linux/unistd.h>
|
||||||
|
#include <linux/io.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
#include <asm/atomic.h>
|
#include <asm/atomic.h>
|
||||||
#include <asm/io.h>
|
|
||||||
|
|
||||||
DEFINE_PER_CPU(struct pt_regs, __ipipe_tick_regs);
|
DEFINE_PER_CPU(struct pt_regs, __ipipe_tick_regs);
|
||||||
|
|
||||||
@ -90,6 +90,7 @@ void __ipipe_handle_irq(unsigned irq, struct pt_regs *regs)
|
|||||||
struct ipipe_percpu_domain_data *p = ipipe_root_cpudom_ptr();
|
struct ipipe_percpu_domain_data *p = ipipe_root_cpudom_ptr();
|
||||||
struct ipipe_domain *this_domain, *next_domain;
|
struct ipipe_domain *this_domain, *next_domain;
|
||||||
struct list_head *head, *pos;
|
struct list_head *head, *pos;
|
||||||
|
struct ipipe_irqdesc *idesc;
|
||||||
int m_ack, s = -1;
|
int m_ack, s = -1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -100,17 +101,20 @@ void __ipipe_handle_irq(unsigned irq, struct pt_regs *regs)
|
|||||||
*/
|
*/
|
||||||
m_ack = (regs == NULL || irq == IRQ_SYSTMR || irq == IRQ_CORETMR);
|
m_ack = (regs == NULL || irq == IRQ_SYSTMR || irq == IRQ_CORETMR);
|
||||||
this_domain = __ipipe_current_domain;
|
this_domain = __ipipe_current_domain;
|
||||||
|
idesc = &this_domain->irqs[irq];
|
||||||
|
|
||||||
if (unlikely(test_bit(IPIPE_STICKY_FLAG, &this_domain->irqs[irq].control)))
|
if (unlikely(test_bit(IPIPE_STICKY_FLAG, &idesc->control)))
|
||||||
head = &this_domain->p_link;
|
head = &this_domain->p_link;
|
||||||
else {
|
else {
|
||||||
head = __ipipe_pipeline.next;
|
head = __ipipe_pipeline.next;
|
||||||
next_domain = list_entry(head, struct ipipe_domain, p_link);
|
next_domain = list_entry(head, struct ipipe_domain, p_link);
|
||||||
if (likely(test_bit(IPIPE_WIRED_FLAG, &next_domain->irqs[irq].control))) {
|
idesc = &next_domain->irqs[irq];
|
||||||
if (!m_ack && next_domain->irqs[irq].acknowledge != NULL)
|
if (likely(test_bit(IPIPE_WIRED_FLAG, &idesc->control))) {
|
||||||
next_domain->irqs[irq].acknowledge(irq, irq_to_desc(irq));
|
if (!m_ack && idesc->acknowledge != NULL)
|
||||||
|
idesc->acknowledge(irq, irq_to_desc(irq));
|
||||||
if (test_bit(IPIPE_SYNCDEFER_FLAG, &p->status))
|
if (test_bit(IPIPE_SYNCDEFER_FLAG, &p->status))
|
||||||
s = __test_and_set_bit(IPIPE_STALL_FLAG, &p->status);
|
s = __test_and_set_bit(IPIPE_STALL_FLAG,
|
||||||
|
&p->status);
|
||||||
__ipipe_dispatch_wired(next_domain, irq);
|
__ipipe_dispatch_wired(next_domain, irq);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -121,14 +125,15 @@ void __ipipe_handle_irq(unsigned irq, struct pt_regs *regs)
|
|||||||
pos = head;
|
pos = head;
|
||||||
while (pos != &__ipipe_pipeline) {
|
while (pos != &__ipipe_pipeline) {
|
||||||
next_domain = list_entry(pos, struct ipipe_domain, p_link);
|
next_domain = list_entry(pos, struct ipipe_domain, p_link);
|
||||||
if (test_bit(IPIPE_HANDLE_FLAG, &next_domain->irqs[irq].control)) {
|
idesc = &next_domain->irqs[irq];
|
||||||
|
if (test_bit(IPIPE_HANDLE_FLAG, &idesc->control)) {
|
||||||
__ipipe_set_irq_pending(next_domain, irq);
|
__ipipe_set_irq_pending(next_domain, irq);
|
||||||
if (!m_ack && next_domain->irqs[irq].acknowledge != NULL) {
|
if (!m_ack && idesc->acknowledge != NULL) {
|
||||||
next_domain->irqs[irq].acknowledge(irq, irq_to_desc(irq));
|
idesc->acknowledge(irq, irq_to_desc(irq));
|
||||||
m_ack = 1;
|
m_ack = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!test_bit(IPIPE_PASS_FLAG, &next_domain->irqs[irq].control))
|
if (!test_bit(IPIPE_PASS_FLAG, &idesc->control))
|
||||||
break;
|
break;
|
||||||
pos = next_domain->p_link.next;
|
pos = next_domain->p_link.next;
|
||||||
}
|
}
|
||||||
@ -159,11 +164,6 @@ out:
|
|||||||
__clear_bit(IPIPE_STALL_FLAG, &p->status);
|
__clear_bit(IPIPE_STALL_FLAG, &p->status);
|
||||||
}
|
}
|
||||||
|
|
||||||
int __ipipe_check_root(void)
|
|
||||||
{
|
|
||||||
return ipipe_root_domain_p;
|
|
||||||
}
|
|
||||||
|
|
||||||
void __ipipe_enable_irqdesc(struct ipipe_domain *ipd, unsigned irq)
|
void __ipipe_enable_irqdesc(struct ipipe_domain *ipd, unsigned irq)
|
||||||
{
|
{
|
||||||
struct irq_desc *desc = irq_to_desc(irq);
|
struct irq_desc *desc = irq_to_desc(irq);
|
||||||
@ -186,30 +186,6 @@ void __ipipe_disable_irqdesc(struct ipipe_domain *ipd, unsigned irq)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(__ipipe_disable_irqdesc);
|
EXPORT_SYMBOL(__ipipe_disable_irqdesc);
|
||||||
|
|
||||||
void __ipipe_stall_root_raw(void)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* This code is called by the ins{bwl} routines (see
|
|
||||||
* arch/blackfin/lib/ins.S), which are heavily used by the
|
|
||||||
* network stack. It masks all interrupts but those handled by
|
|
||||||
* non-root domains, so that we keep decent network transfer
|
|
||||||
* rates for Linux without inducing pathological jitter for
|
|
||||||
* the real-time domain.
|
|
||||||
*/
|
|
||||||
__asm__ __volatile__ ("sti %0;" : : "d"(__ipipe_irq_lvmask));
|
|
||||||
|
|
||||||
__set_bit(IPIPE_STALL_FLAG,
|
|
||||||
&ipipe_root_cpudom_var(status));
|
|
||||||
}
|
|
||||||
|
|
||||||
void __ipipe_unstall_root_raw(void)
|
|
||||||
{
|
|
||||||
__clear_bit(IPIPE_STALL_FLAG,
|
|
||||||
&ipipe_root_cpudom_var(status));
|
|
||||||
|
|
||||||
__asm__ __volatile__ ("sti %0;" : : "d"(bfin_irq_flags));
|
|
||||||
}
|
|
||||||
|
|
||||||
int __ipipe_syscall_root(struct pt_regs *regs)
|
int __ipipe_syscall_root(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct ipipe_percpu_domain_data *p;
|
struct ipipe_percpu_domain_data *p;
|
||||||
@ -333,12 +309,29 @@ asmlinkage void __ipipe_sync_root(void)
|
|||||||
|
|
||||||
void ___ipipe_sync_pipeline(unsigned long syncmask)
|
void ___ipipe_sync_pipeline(unsigned long syncmask)
|
||||||
{
|
{
|
||||||
if (__ipipe_root_domain_p) {
|
if (__ipipe_root_domain_p &&
|
||||||
if (test_bit(IPIPE_SYNCDEFER_FLAG, &ipipe_root_cpudom_var(status)))
|
test_bit(IPIPE_SYNCDEFER_FLAG, &ipipe_root_cpudom_var(status)))
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
__ipipe_sync_stage(syncmask);
|
__ipipe_sync_stage(syncmask);
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(show_stack);
|
void __ipipe_disable_root_irqs_hw(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* This code is called by the ins{bwl} routines (see
|
||||||
|
* arch/blackfin/lib/ins.S), which are heavily used by the
|
||||||
|
* network stack. It masks all interrupts but those handled by
|
||||||
|
* non-root domains, so that we keep decent network transfer
|
||||||
|
* rates for Linux without inducing pathological jitter for
|
||||||
|
* the real-time domain.
|
||||||
|
*/
|
||||||
|
bfin_sti(__ipipe_irq_lvmask);
|
||||||
|
__set_bit(IPIPE_STALL_FLAG, &ipipe_root_cpudom_var(status));
|
||||||
|
}
|
||||||
|
|
||||||
|
void __ipipe_enable_root_irqs_hw(void)
|
||||||
|
{
|
||||||
|
__clear_bit(IPIPE_STALL_FLAG, &ipipe_root_cpudom_var(status));
|
||||||
|
bfin_sti(bfin_irq_flags);
|
||||||
|
}
|
||||||
|
@ -54,7 +54,7 @@ void kgdb_l2_test(void)
|
|||||||
|
|
||||||
int kgdb_test(char *name, int len, int count, int z)
|
int kgdb_test(char *name, int len, int count, int z)
|
||||||
{
|
{
|
||||||
printk(KERN_DEBUG "kgdb name(%d): %s, %d, %d\n", len, name, count, z);
|
printk(KERN_ALERT "kgdb name(%d): %s, %d, %d\n", len, name, count, z);
|
||||||
count = z;
|
count = z;
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define pr_fmt(fmt) "module %s: " fmt
|
||||||
|
|
||||||
#include <linux/moduleloader.h>
|
#include <linux/moduleloader.h>
|
||||||
#include <linux/elf.h>
|
#include <linux/elf.h>
|
||||||
@ -36,6 +37,7 @@
|
|||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <asm/dma.h>
|
#include <asm/dma.h>
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
|
#include <asm/uaccess.h>
|
||||||
|
|
||||||
void *module_alloc(unsigned long size)
|
void *module_alloc(unsigned long size)
|
||||||
{
|
{
|
||||||
@ -52,7 +54,7 @@ void module_free(struct module *mod, void *module_region)
|
|||||||
|
|
||||||
/* Transfer the section to the L1 memory */
|
/* Transfer the section to the L1 memory */
|
||||||
int
|
int
|
||||||
module_frob_arch_sections(Elf_Ehdr * hdr, Elf_Shdr * sechdrs,
|
module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
|
||||||
char *secstrings, struct module *mod)
|
char *secstrings, struct module *mod)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -63,126 +65,119 @@ module_frob_arch_sections(Elf_Ehdr * hdr, Elf_Shdr * sechdrs,
|
|||||||
* NOTE: this breaks the semantic of mod->arch structure.
|
* NOTE: this breaks the semantic of mod->arch structure.
|
||||||
*/
|
*/
|
||||||
Elf_Shdr *s, *sechdrs_end = sechdrs + hdr->e_shnum;
|
Elf_Shdr *s, *sechdrs_end = sechdrs + hdr->e_shnum;
|
||||||
void *dest = NULL;
|
void *dest;
|
||||||
|
|
||||||
for (s = sechdrs; s < sechdrs_end; ++s) {
|
for (s = sechdrs; s < sechdrs_end; ++s) {
|
||||||
if ((strcmp(".l1.text", secstrings + s->sh_name) == 0) ||
|
const char *shname = secstrings + s->sh_name;
|
||||||
((strcmp(".text", secstrings + s->sh_name) == 0) &&
|
|
||||||
(hdr->e_flags & EF_BFIN_CODE_IN_L1) && (s->sh_size > 0))) {
|
if (s->sh_size == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!strcmp(".l1.text", shname) ||
|
||||||
|
(!strcmp(".text", shname) &&
|
||||||
|
(hdr->e_flags & EF_BFIN_CODE_IN_L1))) {
|
||||||
|
|
||||||
dest = l1_inst_sram_alloc(s->sh_size);
|
dest = l1_inst_sram_alloc(s->sh_size);
|
||||||
mod->arch.text_l1 = dest;
|
mod->arch.text_l1 = dest;
|
||||||
if (dest == NULL) {
|
if (dest == NULL) {
|
||||||
printk(KERN_ERR
|
pr_err("L1 inst memory allocation failed\n",
|
||||||
"module %s: L1 instruction memory allocation failed\n",
|
mod->name);
|
||||||
mod->name);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
dma_memcpy(dest, (void *)s->sh_addr, s->sh_size);
|
dma_memcpy(dest, (void *)s->sh_addr, s->sh_size);
|
||||||
s->sh_flags &= ~SHF_ALLOC;
|
|
||||||
s->sh_addr = (unsigned long)dest;
|
} else if (!strcmp(".l1.data", shname) ||
|
||||||
}
|
(!strcmp(".data", shname) &&
|
||||||
if ((strcmp(".l1.data", secstrings + s->sh_name) == 0) ||
|
(hdr->e_flags & EF_BFIN_DATA_IN_L1))) {
|
||||||
((strcmp(".data", secstrings + s->sh_name) == 0) &&
|
|
||||||
(hdr->e_flags & EF_BFIN_DATA_IN_L1) && (s->sh_size > 0))) {
|
|
||||||
dest = l1_data_sram_alloc(s->sh_size);
|
dest = l1_data_sram_alloc(s->sh_size);
|
||||||
mod->arch.data_a_l1 = dest;
|
mod->arch.data_a_l1 = dest;
|
||||||
if (dest == NULL) {
|
if (dest == NULL) {
|
||||||
printk(KERN_ERR
|
pr_err("L1 data memory allocation failed\n",
|
||||||
"module %s: L1 data memory allocation failed\n",
|
|
||||||
mod->name);
|
mod->name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
memcpy(dest, (void *)s->sh_addr, s->sh_size);
|
memcpy(dest, (void *)s->sh_addr, s->sh_size);
|
||||||
s->sh_flags &= ~SHF_ALLOC;
|
|
||||||
s->sh_addr = (unsigned long)dest;
|
} else if (!strcmp(".l1.bss", shname) ||
|
||||||
}
|
(!strcmp(".bss", shname) &&
|
||||||
if (strcmp(".l1.bss", secstrings + s->sh_name) == 0 ||
|
(hdr->e_flags & EF_BFIN_DATA_IN_L1))) {
|
||||||
((strcmp(".bss", secstrings + s->sh_name) == 0) &&
|
|
||||||
(hdr->e_flags & EF_BFIN_DATA_IN_L1) && (s->sh_size > 0))) {
|
dest = l1_data_sram_zalloc(s->sh_size);
|
||||||
dest = l1_data_sram_alloc(s->sh_size);
|
|
||||||
mod->arch.bss_a_l1 = dest;
|
mod->arch.bss_a_l1 = dest;
|
||||||
if (dest == NULL) {
|
if (dest == NULL) {
|
||||||
printk(KERN_ERR
|
pr_err("L1 data memory allocation failed\n",
|
||||||
"module %s: L1 data memory allocation failed\n",
|
|
||||||
mod->name);
|
mod->name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
memset(dest, 0, s->sh_size);
|
|
||||||
s->sh_flags &= ~SHF_ALLOC;
|
} else if (!strcmp(".l1.data.B", shname)) {
|
||||||
s->sh_addr = (unsigned long)dest;
|
|
||||||
}
|
|
||||||
if (strcmp(".l1.data.B", secstrings + s->sh_name) == 0) {
|
|
||||||
dest = l1_data_B_sram_alloc(s->sh_size);
|
dest = l1_data_B_sram_alloc(s->sh_size);
|
||||||
mod->arch.data_b_l1 = dest;
|
mod->arch.data_b_l1 = dest;
|
||||||
if (dest == NULL) {
|
if (dest == NULL) {
|
||||||
printk(KERN_ERR
|
pr_err("L1 data memory allocation failed\n",
|
||||||
"module %s: L1 data memory allocation failed\n",
|
|
||||||
mod->name);
|
mod->name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
memcpy(dest, (void *)s->sh_addr, s->sh_size);
|
memcpy(dest, (void *)s->sh_addr, s->sh_size);
|
||||||
s->sh_flags &= ~SHF_ALLOC;
|
|
||||||
s->sh_addr = (unsigned long)dest;
|
} else if (!strcmp(".l1.bss.B", shname)) {
|
||||||
}
|
|
||||||
if (strcmp(".l1.bss.B", secstrings + s->sh_name) == 0) {
|
|
||||||
dest = l1_data_B_sram_alloc(s->sh_size);
|
dest = l1_data_B_sram_alloc(s->sh_size);
|
||||||
mod->arch.bss_b_l1 = dest;
|
mod->arch.bss_b_l1 = dest;
|
||||||
if (dest == NULL) {
|
if (dest == NULL) {
|
||||||
printk(KERN_ERR
|
pr_err("L1 data memory allocation failed\n",
|
||||||
"module %s: L1 data memory allocation failed\n",
|
|
||||||
mod->name);
|
mod->name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
memset(dest, 0, s->sh_size);
|
memset(dest, 0, s->sh_size);
|
||||||
s->sh_flags &= ~SHF_ALLOC;
|
|
||||||
s->sh_addr = (unsigned long)dest;
|
} else if (!strcmp(".l2.text", shname) ||
|
||||||
}
|
(!strcmp(".text", shname) &&
|
||||||
if ((strcmp(".l2.text", secstrings + s->sh_name) == 0) ||
|
(hdr->e_flags & EF_BFIN_CODE_IN_L2))) {
|
||||||
((strcmp(".text", secstrings + s->sh_name) == 0) &&
|
|
||||||
(hdr->e_flags & EF_BFIN_CODE_IN_L2) && (s->sh_size > 0))) {
|
|
||||||
dest = l2_sram_alloc(s->sh_size);
|
dest = l2_sram_alloc(s->sh_size);
|
||||||
mod->arch.text_l2 = dest;
|
mod->arch.text_l2 = dest;
|
||||||
if (dest == NULL) {
|
if (dest == NULL) {
|
||||||
printk(KERN_ERR
|
pr_err("L2 SRAM allocation failed\n",
|
||||||
"module %s: L2 SRAM allocation failed\n",
|
mod->name);
|
||||||
mod->name);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
memcpy(dest, (void *)s->sh_addr, s->sh_size);
|
memcpy(dest, (void *)s->sh_addr, s->sh_size);
|
||||||
s->sh_flags &= ~SHF_ALLOC;
|
|
||||||
s->sh_addr = (unsigned long)dest;
|
} else if (!strcmp(".l2.data", shname) ||
|
||||||
}
|
(!strcmp(".data", shname) &&
|
||||||
if ((strcmp(".l2.data", secstrings + s->sh_name) == 0) ||
|
(hdr->e_flags & EF_BFIN_DATA_IN_L2))) {
|
||||||
((strcmp(".data", secstrings + s->sh_name) == 0) &&
|
|
||||||
(hdr->e_flags & EF_BFIN_DATA_IN_L2) && (s->sh_size > 0))) {
|
|
||||||
dest = l2_sram_alloc(s->sh_size);
|
dest = l2_sram_alloc(s->sh_size);
|
||||||
mod->arch.data_l2 = dest;
|
mod->arch.data_l2 = dest;
|
||||||
if (dest == NULL) {
|
if (dest == NULL) {
|
||||||
printk(KERN_ERR
|
pr_err("L2 SRAM allocation failed\n",
|
||||||
"module %s: L2 SRAM allocation failed\n",
|
|
||||||
mod->name);
|
mod->name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
memcpy(dest, (void *)s->sh_addr, s->sh_size);
|
memcpy(dest, (void *)s->sh_addr, s->sh_size);
|
||||||
s->sh_flags &= ~SHF_ALLOC;
|
|
||||||
s->sh_addr = (unsigned long)dest;
|
} else if (!strcmp(".l2.bss", shname) ||
|
||||||
}
|
(!strcmp(".bss", shname) &&
|
||||||
if (strcmp(".l2.bss", secstrings + s->sh_name) == 0 ||
|
(hdr->e_flags & EF_BFIN_DATA_IN_L2))) {
|
||||||
((strcmp(".bss", secstrings + s->sh_name) == 0) &&
|
|
||||||
(hdr->e_flags & EF_BFIN_DATA_IN_L2) && (s->sh_size > 0))) {
|
dest = l2_sram_zalloc(s->sh_size);
|
||||||
dest = l2_sram_alloc(s->sh_size);
|
|
||||||
mod->arch.bss_l2 = dest;
|
mod->arch.bss_l2 = dest;
|
||||||
if (dest == NULL) {
|
if (dest == NULL) {
|
||||||
printk(KERN_ERR
|
pr_err("L2 SRAM allocation failed\n",
|
||||||
"module %s: L2 SRAM allocation failed\n",
|
|
||||||
mod->name);
|
mod->name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
memset(dest, 0, s->sh_size);
|
|
||||||
s->sh_flags &= ~SHF_ALLOC;
|
} else
|
||||||
s->sh_addr = (unsigned long)dest;
|
continue;
|
||||||
}
|
|
||||||
|
s->sh_flags &= ~SHF_ALLOC;
|
||||||
|
s->sh_addr = (unsigned long)dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -190,7 +185,7 @@ int
|
|||||||
apply_relocate(Elf_Shdr * sechdrs, const char *strtab,
|
apply_relocate(Elf_Shdr * sechdrs, const char *strtab,
|
||||||
unsigned int symindex, unsigned int relsec, struct module *me)
|
unsigned int symindex, unsigned int relsec, struct module *me)
|
||||||
{
|
{
|
||||||
printk(KERN_ERR "module %s: .rel unsupported\n", me->name);
|
pr_err(".rel unsupported\n", me->name);
|
||||||
return -ENOEXEC;
|
return -ENOEXEC;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,109 +200,86 @@ apply_relocate(Elf_Shdr * sechdrs, const char *strtab,
|
|||||||
/* gas does not generate it. */
|
/* gas does not generate it. */
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
int
|
int
|
||||||
apply_relocate_add(Elf_Shdr * sechdrs, const char *strtab,
|
apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,
|
||||||
unsigned int symindex, unsigned int relsec,
|
unsigned int symindex, unsigned int relsec,
|
||||||
struct module *mod)
|
struct module *mod)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
unsigned short tmp;
|
|
||||||
Elf32_Rela *rel = (void *)sechdrs[relsec].sh_addr;
|
Elf32_Rela *rel = (void *)sechdrs[relsec].sh_addr;
|
||||||
Elf32_Sym *sym;
|
Elf32_Sym *sym;
|
||||||
uint32_t *location32;
|
unsigned long location, value, size;
|
||||||
uint16_t *location16;
|
|
||||||
uint32_t value;
|
pr_debug("applying relocate section %u to %u\n", mod->name,
|
||||||
|
relsec, sechdrs[relsec].sh_info);
|
||||||
|
|
||||||
pr_debug("Applying relocate section %u to %u\n", relsec,
|
|
||||||
sechdrs[relsec].sh_info);
|
|
||||||
for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) {
|
for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) {
|
||||||
/* This is where to make the change */
|
/* This is where to make the change */
|
||||||
location16 =
|
location = sechdrs[sechdrs[relsec].sh_info].sh_addr +
|
||||||
(uint16_t *) (sechdrs[sechdrs[relsec].sh_info].sh_addr +
|
rel[i].r_offset;
|
||||||
rel[i].r_offset);
|
|
||||||
location32 = (uint32_t *) location16;
|
|
||||||
/* This is the symbol it is referring to. Note that all
|
/* This is the symbol it is referring to. Note that all
|
||||||
undefined symbols have been resolved. */
|
undefined symbols have been resolved. */
|
||||||
sym = (Elf32_Sym *) sechdrs[symindex].sh_addr
|
sym = (Elf32_Sym *) sechdrs[symindex].sh_addr
|
||||||
+ ELF32_R_SYM(rel[i].r_info);
|
+ ELF32_R_SYM(rel[i].r_info);
|
||||||
value = sym->st_value;
|
value = sym->st_value;
|
||||||
value += rel[i].r_addend;
|
value += rel[i].r_addend;
|
||||||
pr_debug("location is %x, value is %x type is %d \n",
|
|
||||||
(unsigned int) location32, value,
|
|
||||||
ELF32_R_TYPE(rel[i].r_info));
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
if ((unsigned long)location16 >= COREB_L1_DATA_A_START) {
|
if (location >= COREB_L1_DATA_A_START) {
|
||||||
printk(KERN_ERR "module %s: cannot relocate in L1: %u (SMP kernel)",
|
pr_err("cannot relocate in L1: %u (SMP kernel)",
|
||||||
mod->name, ELF32_R_TYPE(rel[i].r_info));
|
mod->name, ELF32_R_TYPE(rel[i].r_info));
|
||||||
return -ENOEXEC;
|
return -ENOEXEC;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
pr_debug("location is %lx, value is %lx type is %d\n",
|
||||||
|
mod->name, location, value, ELF32_R_TYPE(rel[i].r_info));
|
||||||
|
|
||||||
switch (ELF32_R_TYPE(rel[i].r_info)) {
|
switch (ELF32_R_TYPE(rel[i].r_info)) {
|
||||||
|
|
||||||
|
case R_BFIN_HUIMM16:
|
||||||
|
value >>= 16;
|
||||||
|
case R_BFIN_LUIMM16:
|
||||||
|
case R_BFIN_RIMM16:
|
||||||
|
size = 2;
|
||||||
|
break;
|
||||||
|
case R_BFIN_BYTE4_DATA:
|
||||||
|
size = 4;
|
||||||
|
break;
|
||||||
|
|
||||||
case R_BFIN_PCREL24:
|
case R_BFIN_PCREL24:
|
||||||
case R_BFIN_PCREL24_JUMP_L:
|
case R_BFIN_PCREL24_JUMP_L:
|
||||||
/* Add the value, subtract its postition */
|
|
||||||
location16 =
|
|
||||||
(uint16_t *) (sechdrs[sechdrs[relsec].sh_info].
|
|
||||||
sh_addr + rel[i].r_offset - 2);
|
|
||||||
location32 = (uint32_t *) location16;
|
|
||||||
value -= (uint32_t) location32;
|
|
||||||
value >>= 1;
|
|
||||||
if ((value & 0xFF000000) != 0 &&
|
|
||||||
(value & 0xFF000000) != 0xFF000000) {
|
|
||||||
printk(KERN_ERR "module %s: relocation overflow\n",
|
|
||||||
mod->name);
|
|
||||||
return -ENOEXEC;
|
|
||||||
}
|
|
||||||
pr_debug("value is %x, before %x-%x after %x-%x\n", value,
|
|
||||||
*location16, *(location16 + 1),
|
|
||||||
(*location16 & 0xff00) | (value >> 16 & 0x00ff),
|
|
||||||
value & 0xffff);
|
|
||||||
*location16 =
|
|
||||||
(*location16 & 0xff00) | (value >> 16 & 0x00ff);
|
|
||||||
*(location16 + 1) = value & 0xffff;
|
|
||||||
break;
|
|
||||||
case R_BFIN_PCREL12_JUMP:
|
case R_BFIN_PCREL12_JUMP:
|
||||||
case R_BFIN_PCREL12_JUMP_S:
|
case R_BFIN_PCREL12_JUMP_S:
|
||||||
value -= (uint32_t) location32;
|
|
||||||
value >>= 1;
|
|
||||||
*location16 = (value & 0xfff);
|
|
||||||
break;
|
|
||||||
case R_BFIN_PCREL10:
|
case R_BFIN_PCREL10:
|
||||||
value -= (uint32_t) location32;
|
pr_err("unsupported relocation: %u (no -mlong-calls?)\n",
|
||||||
value >>= 1;
|
mod->name, ELF32_R_TYPE(rel[i].r_info));
|
||||||
*location16 = (value & 0x3ff);
|
return -ENOEXEC;
|
||||||
|
|
||||||
|
default:
|
||||||
|
pr_err("unknown relocation: %u\n", mod->name,
|
||||||
|
ELF32_R_TYPE(rel[i].r_info));
|
||||||
|
return -ENOEXEC;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (bfin_mem_access_type(location, size)) {
|
||||||
|
case BFIN_MEM_ACCESS_CORE:
|
||||||
|
case BFIN_MEM_ACCESS_CORE_ONLY:
|
||||||
|
memcpy((void *)location, &value, size);
|
||||||
break;
|
break;
|
||||||
case R_BFIN_LUIMM16:
|
case BFIN_MEM_ACCESS_DMA:
|
||||||
pr_debug("before %x after %x\n", *location16,
|
dma_memcpy((void *)location, &value, size);
|
||||||
(value & 0xffff));
|
|
||||||
tmp = (value & 0xffff);
|
|
||||||
if ((unsigned long)location16 >= L1_CODE_START) {
|
|
||||||
dma_memcpy(location16, &tmp, 2);
|
|
||||||
} else
|
|
||||||
*location16 = tmp;
|
|
||||||
break;
|
break;
|
||||||
case R_BFIN_HUIMM16:
|
case BFIN_MEM_ACCESS_ITEST:
|
||||||
pr_debug("before %x after %x\n", *location16,
|
isram_memcpy((void *)location, &value, size);
|
||||||
((value >> 16) & 0xffff));
|
|
||||||
tmp = ((value >> 16) & 0xffff);
|
|
||||||
if ((unsigned long)location16 >= L1_CODE_START) {
|
|
||||||
dma_memcpy(location16, &tmp, 2);
|
|
||||||
} else
|
|
||||||
*location16 = tmp;
|
|
||||||
break;
|
|
||||||
case R_BFIN_RIMM16:
|
|
||||||
*location16 = (value & 0xffff);
|
|
||||||
break;
|
|
||||||
case R_BFIN_BYTE4_DATA:
|
|
||||||
pr_debug("before %x after %x\n", *location32, value);
|
|
||||||
*location32 = value;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printk(KERN_ERR "module %s: Unknown relocation: %u\n",
|
pr_err("invalid relocation for %#lx\n",
|
||||||
mod->name, ELF32_R_TYPE(rel[i].r_info));
|
mod->name, location);
|
||||||
return -ENOEXEC;
|
return -ENOEXEC;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -332,22 +304,28 @@ module_finalize(const Elf_Ehdr * hdr,
|
|||||||
for (i = 1; i < hdr->e_shnum; i++) {
|
for (i = 1; i < hdr->e_shnum; i++) {
|
||||||
const char *strtab = (char *)sechdrs[strindex].sh_addr;
|
const char *strtab = (char *)sechdrs[strindex].sh_addr;
|
||||||
unsigned int info = sechdrs[i].sh_info;
|
unsigned int info = sechdrs[i].sh_info;
|
||||||
|
const char *shname = secstrings + sechdrs[i].sh_name;
|
||||||
|
|
||||||
/* Not a valid relocation section? */
|
/* Not a valid relocation section? */
|
||||||
if (info >= hdr->e_shnum)
|
if (info >= hdr->e_shnum)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if ((sechdrs[i].sh_type == SHT_RELA) &&
|
/* Only support RELA relocation types */
|
||||||
((strcmp(".rela.l2.text", secstrings + sechdrs[i].sh_name) == 0) ||
|
if (sechdrs[i].sh_type != SHT_RELA)
|
||||||
(strcmp(".rela.l1.text", secstrings + sechdrs[i].sh_name) == 0) ||
|
continue;
|
||||||
((strcmp(".rela.text", secstrings + sechdrs[i].sh_name) == 0) &&
|
|
||||||
(hdr->e_flags & (EF_BFIN_CODE_IN_L1|EF_BFIN_CODE_IN_L2))))) {
|
if (!strcmp(".rela.l2.text", shname) ||
|
||||||
|
!strcmp(".rela.l1.text", shname) ||
|
||||||
|
(!strcmp(".rela.text", shname) &&
|
||||||
|
(hdr->e_flags & (EF_BFIN_CODE_IN_L1 | EF_BFIN_CODE_IN_L2)))) {
|
||||||
|
|
||||||
err = apply_relocate_add((Elf_Shdr *) sechdrs, strtab,
|
err = apply_relocate_add((Elf_Shdr *) sechdrs, strtab,
|
||||||
symindex, i, mod);
|
symindex, i, mod);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return -ENOEXEC;
|
return -ENOEXEC;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -282,25 +282,19 @@ void finish_atomic_sections (struct pt_regs *regs)
|
|||||||
{
|
{
|
||||||
int __user *up0 = (int __user *)regs->p0;
|
int __user *up0 = (int __user *)regs->p0;
|
||||||
|
|
||||||
if (regs->pc < ATOMIC_SEQS_START || regs->pc >= ATOMIC_SEQS_END)
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (regs->pc) {
|
switch (regs->pc) {
|
||||||
case ATOMIC_XCHG32 + 2:
|
case ATOMIC_XCHG32 + 2:
|
||||||
put_user(regs->r1, up0);
|
put_user(regs->r1, up0);
|
||||||
regs->pc += 2;
|
regs->pc = ATOMIC_XCHG32 + 4;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ATOMIC_CAS32 + 2:
|
case ATOMIC_CAS32 + 2:
|
||||||
case ATOMIC_CAS32 + 4:
|
case ATOMIC_CAS32 + 4:
|
||||||
if (regs->r0 == regs->r1)
|
if (regs->r0 == regs->r1)
|
||||||
|
case ATOMIC_CAS32 + 6:
|
||||||
put_user(regs->r2, up0);
|
put_user(regs->r2, up0);
|
||||||
regs->pc = ATOMIC_CAS32 + 8;
|
regs->pc = ATOMIC_CAS32 + 8;
|
||||||
break;
|
break;
|
||||||
case ATOMIC_CAS32 + 6:
|
|
||||||
put_user(regs->r2, up0);
|
|
||||||
regs->pc += 2;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ATOMIC_ADD32 + 2:
|
case ATOMIC_ADD32 + 2:
|
||||||
regs->r0 = regs->r1 + regs->r0;
|
regs->r0 = regs->r1 + regs->r0;
|
||||||
|
@ -206,6 +206,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
unsigned long __user *datap = (unsigned long __user *)data;
|
unsigned long __user *datap = (unsigned long __user *)data;
|
||||||
|
void *paddr = (void *)addr;
|
||||||
|
|
||||||
switch (request) {
|
switch (request) {
|
||||||
/* when I and D space are separate, these will need to be fixed. */
|
/* when I and D space are separate, these will need to be fixed. */
|
||||||
@ -215,42 +216,49 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
|||||||
case PTRACE_PEEKTEXT: /* read word at location addr. */
|
case PTRACE_PEEKTEXT: /* read word at location addr. */
|
||||||
{
|
{
|
||||||
unsigned long tmp = 0;
|
unsigned long tmp = 0;
|
||||||
int copied;
|
int copied = 0, to_copy = sizeof(tmp);
|
||||||
|
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
pr_debug("ptrace: PEEKTEXT at addr 0x%08lx + %ld\n", addr, sizeof(data));
|
pr_debug("ptrace: PEEKTEXT at addr 0x%08lx + %i\n", addr, to_copy);
|
||||||
if (is_user_addr_valid(child, addr, sizeof(tmp)) < 0)
|
if (is_user_addr_valid(child, addr, to_copy) < 0)
|
||||||
break;
|
break;
|
||||||
pr_debug("ptrace: user address is valid\n");
|
pr_debug("ptrace: user address is valid\n");
|
||||||
|
|
||||||
if (L1_CODE_LENGTH != 0 && addr >= get_l1_code_start()
|
switch (bfin_mem_access_type(addr, to_copy)) {
|
||||||
&& addr + sizeof(tmp) <= get_l1_code_start() + L1_CODE_LENGTH) {
|
case BFIN_MEM_ACCESS_CORE:
|
||||||
safe_dma_memcpy (&tmp, (const void *)(addr), sizeof(tmp));
|
case BFIN_MEM_ACCESS_CORE_ONLY:
|
||||||
copied = sizeof(tmp);
|
|
||||||
|
|
||||||
} else if (L1_DATA_A_LENGTH != 0 && addr >= L1_DATA_A_START
|
|
||||||
&& addr + sizeof(tmp) <= L1_DATA_A_START + L1_DATA_A_LENGTH) {
|
|
||||||
memcpy(&tmp, (const void *)(addr), sizeof(tmp));
|
|
||||||
copied = sizeof(tmp);
|
|
||||||
|
|
||||||
} else if (L1_DATA_B_LENGTH != 0 && addr >= L1_DATA_B_START
|
|
||||||
&& addr + sizeof(tmp) <= L1_DATA_B_START + L1_DATA_B_LENGTH) {
|
|
||||||
memcpy(&tmp, (const void *)(addr), sizeof(tmp));
|
|
||||||
copied = sizeof(tmp);
|
|
||||||
|
|
||||||
} else if (addr >= FIXED_CODE_START
|
|
||||||
&& addr + sizeof(tmp) <= FIXED_CODE_END) {
|
|
||||||
copy_from_user_page(0, 0, 0, &tmp, (const void *)(addr), sizeof(tmp));
|
|
||||||
copied = sizeof(tmp);
|
|
||||||
|
|
||||||
} else
|
|
||||||
copied = access_process_vm(child, addr, &tmp,
|
copied = access_process_vm(child, addr, &tmp,
|
||||||
sizeof(tmp), 0);
|
to_copy, 0);
|
||||||
|
if (copied)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* hrm, why didn't that work ... maybe no mapping */
|
||||||
|
if (addr >= FIXED_CODE_START &&
|
||||||
|
addr + to_copy <= FIXED_CODE_END) {
|
||||||
|
copy_from_user_page(0, 0, 0, &tmp, paddr, to_copy);
|
||||||
|
copied = to_copy;
|
||||||
|
} else if (addr >= BOOT_ROM_START) {
|
||||||
|
memcpy(&tmp, paddr, to_copy);
|
||||||
|
copied = to_copy;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case BFIN_MEM_ACCESS_DMA:
|
||||||
|
if (safe_dma_memcpy(&tmp, paddr, to_copy))
|
||||||
|
copied = to_copy;
|
||||||
|
break;
|
||||||
|
case BFIN_MEM_ACCESS_ITEST:
|
||||||
|
if (isram_memcpy(&tmp, paddr, to_copy))
|
||||||
|
copied = to_copy;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
copied = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
pr_debug("ptrace: copied size %d [0x%08lx]\n", copied, tmp);
|
pr_debug("ptrace: copied size %d [0x%08lx]\n", copied, tmp);
|
||||||
if (copied != sizeof(tmp))
|
if (copied == to_copy)
|
||||||
break;
|
ret = put_user(tmp, datap);
|
||||||
ret = put_user(tmp, datap);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -277,9 +285,9 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
|||||||
tmp = child->mm->start_data;
|
tmp = child->mm->start_data;
|
||||||
#ifdef CONFIG_BINFMT_ELF_FDPIC
|
#ifdef CONFIG_BINFMT_ELF_FDPIC
|
||||||
} else if (addr == (sizeof(struct pt_regs) + 12)) {
|
} else if (addr == (sizeof(struct pt_regs) + 12)) {
|
||||||
tmp = child->mm->context.exec_fdpic_loadmap;
|
goto case_PTRACE_GETFDPIC_EXEC;
|
||||||
} else if (addr == (sizeof(struct pt_regs) + 16)) {
|
} else if (addr == (sizeof(struct pt_regs) + 16)) {
|
||||||
tmp = child->mm->context.interp_fdpic_loadmap;
|
goto case_PTRACE_GETFDPIC_INTERP;
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
tmp = get_reg(child, addr);
|
tmp = get_reg(child, addr);
|
||||||
@ -288,49 +296,78 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_BINFMT_ELF_FDPIC
|
||||||
|
case PTRACE_GETFDPIC: {
|
||||||
|
unsigned long tmp = 0;
|
||||||
|
|
||||||
|
switch (addr) {
|
||||||
|
case_PTRACE_GETFDPIC_EXEC:
|
||||||
|
case PTRACE_GETFDPIC_EXEC:
|
||||||
|
tmp = child->mm->context.exec_fdpic_loadmap;
|
||||||
|
break;
|
||||||
|
case_PTRACE_GETFDPIC_INTERP:
|
||||||
|
case PTRACE_GETFDPIC_INTERP:
|
||||||
|
tmp = child->mm->context.interp_fdpic_loadmap;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = put_user(tmp, datap);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* when I and D space are separate, this will have to be fixed. */
|
/* when I and D space are separate, this will have to be fixed. */
|
||||||
case PTRACE_POKEDATA:
|
case PTRACE_POKEDATA:
|
||||||
pr_debug("ptrace: PTRACE_PEEKDATA\n");
|
pr_debug("ptrace: PTRACE_PEEKDATA\n");
|
||||||
/* fall through */
|
/* fall through */
|
||||||
case PTRACE_POKETEXT: /* write the word at location addr. */
|
case PTRACE_POKETEXT: /* write the word at location addr. */
|
||||||
{
|
{
|
||||||
int copied;
|
int copied = 0, to_copy = sizeof(data);
|
||||||
|
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
pr_debug("ptrace: POKETEXT at addr 0x%08lx + %ld bytes %lx\n",
|
pr_debug("ptrace: POKETEXT at addr 0x%08lx + %i bytes %lx\n",
|
||||||
addr, sizeof(data), data);
|
addr, to_copy, data);
|
||||||
if (is_user_addr_valid(child, addr, sizeof(data)) < 0)
|
if (is_user_addr_valid(child, addr, to_copy) < 0)
|
||||||
break;
|
break;
|
||||||
pr_debug("ptrace: user address is valid\n");
|
pr_debug("ptrace: user address is valid\n");
|
||||||
|
|
||||||
if (L1_CODE_LENGTH != 0 && addr >= get_l1_code_start()
|
switch (bfin_mem_access_type(addr, to_copy)) {
|
||||||
&& addr + sizeof(data) <= get_l1_code_start() + L1_CODE_LENGTH) {
|
case BFIN_MEM_ACCESS_CORE:
|
||||||
safe_dma_memcpy ((void *)(addr), &data, sizeof(data));
|
case BFIN_MEM_ACCESS_CORE_ONLY:
|
||||||
copied = sizeof(data);
|
|
||||||
|
|
||||||
} else if (L1_DATA_A_LENGTH != 0 && addr >= L1_DATA_A_START
|
|
||||||
&& addr + sizeof(data) <= L1_DATA_A_START + L1_DATA_A_LENGTH) {
|
|
||||||
memcpy((void *)(addr), &data, sizeof(data));
|
|
||||||
copied = sizeof(data);
|
|
||||||
|
|
||||||
} else if (L1_DATA_B_LENGTH != 0 && addr >= L1_DATA_B_START
|
|
||||||
&& addr + sizeof(data) <= L1_DATA_B_START + L1_DATA_B_LENGTH) {
|
|
||||||
memcpy((void *)(addr), &data, sizeof(data));
|
|
||||||
copied = sizeof(data);
|
|
||||||
|
|
||||||
} else if (addr >= FIXED_CODE_START
|
|
||||||
&& addr + sizeof(data) <= FIXED_CODE_END) {
|
|
||||||
copy_to_user_page(0, 0, 0, (void *)(addr), &data, sizeof(data));
|
|
||||||
copied = sizeof(data);
|
|
||||||
|
|
||||||
} else
|
|
||||||
copied = access_process_vm(child, addr, &data,
|
copied = access_process_vm(child, addr, &data,
|
||||||
sizeof(data), 1);
|
to_copy, 0);
|
||||||
|
if (copied)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* hrm, why didn't that work ... maybe no mapping */
|
||||||
|
if (addr >= FIXED_CODE_START &&
|
||||||
|
addr + to_copy <= FIXED_CODE_END) {
|
||||||
|
copy_to_user_page(0, 0, 0, paddr, &data, to_copy);
|
||||||
|
copied = to_copy;
|
||||||
|
} else if (addr >= BOOT_ROM_START) {
|
||||||
|
memcpy(paddr, &data, to_copy);
|
||||||
|
copied = to_copy;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case BFIN_MEM_ACCESS_DMA:
|
||||||
|
if (safe_dma_memcpy(paddr, &data, to_copy))
|
||||||
|
copied = to_copy;
|
||||||
|
break;
|
||||||
|
case BFIN_MEM_ACCESS_ITEST:
|
||||||
|
if (isram_memcpy(paddr, &data, to_copy))
|
||||||
|
copied = to_copy;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
copied = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
pr_debug("ptrace: copied size %d\n", copied);
|
pr_debug("ptrace: copied size %d\n", copied);
|
||||||
if (copied != sizeof(data))
|
if (copied == to_copy)
|
||||||
break;
|
ret = 0;
|
||||||
ret = 0;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,7 +112,7 @@ void __cpuinit bfin_setup_caches(unsigned int cpu)
|
|||||||
/*
|
/*
|
||||||
* In cache coherence emulation mode, we need to have the
|
* In cache coherence emulation mode, we need to have the
|
||||||
* D-cache enabled before running any atomic operation which
|
* D-cache enabled before running any atomic operation which
|
||||||
* might invove cache invalidation (i.e. spinlock, rwlock).
|
* might involve cache invalidation (i.e. spinlock, rwlock).
|
||||||
* So printk's are deferred until then.
|
* So printk's are deferred until then.
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_BFIN_ICACHE
|
#ifdef CONFIG_BFIN_ICACHE
|
||||||
@ -187,6 +187,8 @@ void __init bfin_relocate_l1_mem(void)
|
|||||||
unsigned long l1_data_b_length;
|
unsigned long l1_data_b_length;
|
||||||
unsigned long l2_length;
|
unsigned long l2_length;
|
||||||
|
|
||||||
|
early_shadow_stamp();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* due to the ALIGN(4) in the arch/blackfin/kernel/vmlinux.lds.S
|
* due to the ALIGN(4) in the arch/blackfin/kernel/vmlinux.lds.S
|
||||||
* we know that everything about l1 text/data is nice and aligned,
|
* we know that everything about l1 text/data is nice and aligned,
|
||||||
@ -511,6 +513,7 @@ static __init void memory_setup(void)
|
|||||||
#ifdef CONFIG_MTD_UCLINUX
|
#ifdef CONFIG_MTD_UCLINUX
|
||||||
unsigned long mtd_phys = 0;
|
unsigned long mtd_phys = 0;
|
||||||
#endif
|
#endif
|
||||||
|
unsigned long max_mem;
|
||||||
|
|
||||||
_rambase = (unsigned long)_stext;
|
_rambase = (unsigned long)_stext;
|
||||||
_ramstart = (unsigned long)_end;
|
_ramstart = (unsigned long)_end;
|
||||||
@ -520,7 +523,22 @@ static __init void memory_setup(void)
|
|||||||
panic("DMA region exceeds memory limit: %lu.",
|
panic("DMA region exceeds memory limit: %lu.",
|
||||||
_ramend - _ramstart);
|
_ramend - _ramstart);
|
||||||
}
|
}
|
||||||
memory_end = _ramend - DMA_UNCACHED_REGION;
|
max_mem = memory_end = _ramend - DMA_UNCACHED_REGION;
|
||||||
|
|
||||||
|
#if (defined(CONFIG_BFIN_EXTMEM_ICACHEABLE) && ANOMALY_05000263)
|
||||||
|
/* Due to a Hardware Anomaly we need to limit the size of usable
|
||||||
|
* instruction memory to max 60MB, 56 if HUNT_FOR_ZERO is on
|
||||||
|
* 05000263 - Hardware loop corrupted when taking an ICPLB exception
|
||||||
|
*/
|
||||||
|
# if (defined(CONFIG_DEBUG_HUNT_FOR_ZERO))
|
||||||
|
if (max_mem >= 56 * 1024 * 1024)
|
||||||
|
max_mem = 56 * 1024 * 1024;
|
||||||
|
# else
|
||||||
|
if (max_mem >= 60 * 1024 * 1024)
|
||||||
|
max_mem = 60 * 1024 * 1024;
|
||||||
|
# endif /* CONFIG_DEBUG_HUNT_FOR_ZERO */
|
||||||
|
#endif /* ANOMALY_05000263 */
|
||||||
|
|
||||||
|
|
||||||
#ifdef CONFIG_MPU
|
#ifdef CONFIG_MPU
|
||||||
/* Round up to multiple of 4MB */
|
/* Round up to multiple of 4MB */
|
||||||
@ -549,22 +567,16 @@ static __init void memory_setup(void)
|
|||||||
|
|
||||||
# if defined(CONFIG_ROMFS_FS)
|
# if defined(CONFIG_ROMFS_FS)
|
||||||
if (((unsigned long *)mtd_phys)[0] == ROMSB_WORD0
|
if (((unsigned long *)mtd_phys)[0] == ROMSB_WORD0
|
||||||
&& ((unsigned long *)mtd_phys)[1] == ROMSB_WORD1)
|
&& ((unsigned long *)mtd_phys)[1] == ROMSB_WORD1) {
|
||||||
mtd_size =
|
mtd_size =
|
||||||
PAGE_ALIGN(be32_to_cpu(((unsigned long *)mtd_phys)[2]));
|
PAGE_ALIGN(be32_to_cpu(((unsigned long *)mtd_phys)[2]));
|
||||||
# if (defined(CONFIG_BFIN_EXTMEM_ICACHEABLE) && ANOMALY_05000263)
|
|
||||||
/* Due to a Hardware Anomaly we need to limit the size of usable
|
/* ROM_FS is XIP, so if we found it, we need to limit memory */
|
||||||
* instruction memory to max 60MB, 56 if HUNT_FOR_ZERO is on
|
if (memory_end > max_mem) {
|
||||||
* 05000263 - Hardware loop corrupted when taking an ICPLB exception
|
pr_info("Limiting kernel memory to %liMB due to anomaly 05000263\n", max_mem >> 20);
|
||||||
*/
|
memory_end = max_mem;
|
||||||
# if (defined(CONFIG_DEBUG_HUNT_FOR_ZERO))
|
}
|
||||||
if (memory_end >= 56 * 1024 * 1024)
|
}
|
||||||
memory_end = 56 * 1024 * 1024;
|
|
||||||
# else
|
|
||||||
if (memory_end >= 60 * 1024 * 1024)
|
|
||||||
memory_end = 60 * 1024 * 1024;
|
|
||||||
# endif /* CONFIG_DEBUG_HUNT_FOR_ZERO */
|
|
||||||
# endif /* ANOMALY_05000263 */
|
|
||||||
# endif /* CONFIG_ROMFS_FS */
|
# endif /* CONFIG_ROMFS_FS */
|
||||||
|
|
||||||
/* Since the default MTD_UCLINUX has no magic number, we just blindly
|
/* Since the default MTD_UCLINUX has no magic number, we just blindly
|
||||||
@ -586,20 +598,14 @@ static __init void memory_setup(void)
|
|||||||
}
|
}
|
||||||
#endif /* CONFIG_MTD_UCLINUX */
|
#endif /* CONFIG_MTD_UCLINUX */
|
||||||
|
|
||||||
#if (defined(CONFIG_BFIN_EXTMEM_ICACHEABLE) && ANOMALY_05000263)
|
/* We need lo limit memory, since everything could have a text section
|
||||||
/* Due to a Hardware Anomaly we need to limit the size of usable
|
* of userspace in it, and expose anomaly 05000263. If the anomaly
|
||||||
* instruction memory to max 60MB, 56 if HUNT_FOR_ZERO is on
|
* doesn't exist, or we don't need to - then dont.
|
||||||
* 05000263 - Hardware loop corrupted when taking an ICPLB exception
|
|
||||||
*/
|
*/
|
||||||
#if (defined(CONFIG_DEBUG_HUNT_FOR_ZERO))
|
if (memory_end > max_mem) {
|
||||||
if (memory_end >= 56 * 1024 * 1024)
|
pr_info("Limiting kernel memory to %liMB due to anomaly 05000263\n", max_mem >> 20);
|
||||||
memory_end = 56 * 1024 * 1024;
|
memory_end = max_mem;
|
||||||
#else
|
}
|
||||||
if (memory_end >= 60 * 1024 * 1024)
|
|
||||||
memory_end = 60 * 1024 * 1024;
|
|
||||||
#endif /* CONFIG_DEBUG_HUNT_FOR_ZERO */
|
|
||||||
printk(KERN_NOTICE "Warning: limiting memory to %liMB due to hardware anomaly 05000263\n", memory_end >> 20);
|
|
||||||
#endif /* ANOMALY_05000263 */
|
|
||||||
|
|
||||||
#ifdef CONFIG_MPU
|
#ifdef CONFIG_MPU
|
||||||
page_mask_nelts = ((_ramend >> PAGE_SHIFT) + 31) / 32;
|
page_mask_nelts = ((_ramend >> PAGE_SHIFT) + 31) / 32;
|
||||||
@ -693,7 +699,7 @@ static __init void setup_bootmem_allocator(void)
|
|||||||
sanitize_memmap(bfin_memmap.map, &bfin_memmap.nr_map);
|
sanitize_memmap(bfin_memmap.map, &bfin_memmap.nr_map);
|
||||||
print_memory_map("boot memmap");
|
print_memory_map("boot memmap");
|
||||||
|
|
||||||
/* intialize globals in linux/bootmem.h */
|
/* initialize globals in linux/bootmem.h */
|
||||||
find_min_max_pfn();
|
find_min_max_pfn();
|
||||||
/* pfn of the last usable page frame */
|
/* pfn of the last usable page frame */
|
||||||
if (max_pfn > memory_end >> PAGE_SHIFT)
|
if (max_pfn > memory_end >> PAGE_SHIFT)
|
||||||
@ -806,6 +812,8 @@ void __init setup_arch(char **cmdline_p)
|
|||||||
{
|
{
|
||||||
unsigned long sclk, cclk;
|
unsigned long sclk, cclk;
|
||||||
|
|
||||||
|
enable_shadow_console();
|
||||||
|
|
||||||
/* Check to make sure we are running on the right processor */
|
/* Check to make sure we are running on the right processor */
|
||||||
if (unlikely(CPUID != bfin_cpuid()))
|
if (unlikely(CPUID != bfin_cpuid()))
|
||||||
printk(KERN_ERR "ERROR: Not running on ADSP-%s: unknown CPUID 0x%04x Rev 0.%d\n",
|
printk(KERN_ERR "ERROR: Not running on ADSP-%s: unknown CPUID 0x%04x Rev 0.%d\n",
|
||||||
@ -1230,57 +1238,6 @@ static int show_cpuinfo(struct seq_file *m, void *v)
|
|||||||
#ifdef __ARCH_SYNC_CORE_ICACHE
|
#ifdef __ARCH_SYNC_CORE_ICACHE
|
||||||
seq_printf(m, "SMP Icache Flushes\t: %lu\n\n", cpudata->icache_invld_count);
|
seq_printf(m, "SMP Icache Flushes\t: %lu\n\n", cpudata->icache_invld_count);
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_BFIN_ICACHE_LOCK
|
|
||||||
switch ((cpudata->imemctl >> 3) & WAYALL_L) {
|
|
||||||
case WAY0_L:
|
|
||||||
seq_printf(m, "Way0 Locked-Down\n");
|
|
||||||
break;
|
|
||||||
case WAY1_L:
|
|
||||||
seq_printf(m, "Way1 Locked-Down\n");
|
|
||||||
break;
|
|
||||||
case WAY01_L:
|
|
||||||
seq_printf(m, "Way0,Way1 Locked-Down\n");
|
|
||||||
break;
|
|
||||||
case WAY2_L:
|
|
||||||
seq_printf(m, "Way2 Locked-Down\n");
|
|
||||||
break;
|
|
||||||
case WAY02_L:
|
|
||||||
seq_printf(m, "Way0,Way2 Locked-Down\n");
|
|
||||||
break;
|
|
||||||
case WAY12_L:
|
|
||||||
seq_printf(m, "Way1,Way2 Locked-Down\n");
|
|
||||||
break;
|
|
||||||
case WAY012_L:
|
|
||||||
seq_printf(m, "Way0,Way1 & Way2 Locked-Down\n");
|
|
||||||
break;
|
|
||||||
case WAY3_L:
|
|
||||||
seq_printf(m, "Way3 Locked-Down\n");
|
|
||||||
break;
|
|
||||||
case WAY03_L:
|
|
||||||
seq_printf(m, "Way0,Way3 Locked-Down\n");
|
|
||||||
break;
|
|
||||||
case WAY13_L:
|
|
||||||
seq_printf(m, "Way1,Way3 Locked-Down\n");
|
|
||||||
break;
|
|
||||||
case WAY013_L:
|
|
||||||
seq_printf(m, "Way 0,Way1,Way3 Locked-Down\n");
|
|
||||||
break;
|
|
||||||
case WAY32_L:
|
|
||||||
seq_printf(m, "Way3,Way2 Locked-Down\n");
|
|
||||||
break;
|
|
||||||
case WAY320_L:
|
|
||||||
seq_printf(m, "Way3,Way2,Way0 Locked-Down\n");
|
|
||||||
break;
|
|
||||||
case WAY321_L:
|
|
||||||
seq_printf(m, "Way3,Way2,Way1 Locked-Down\n");
|
|
||||||
break;
|
|
||||||
case WAYALL_L:
|
|
||||||
seq_printf(m, "All Ways are locked\n");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
seq_printf(m, "No Ways are locked\n");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (cpu_num != num_possible_cpus() - 1)
|
if (cpu_num != num_possible_cpus() - 1)
|
||||||
return 0;
|
return 0;
|
||||||
@ -1346,6 +1303,7 @@ const struct seq_operations cpuinfo_op = {
|
|||||||
|
|
||||||
void __init cmdline_init(const char *r0)
|
void __init cmdline_init(const char *r0)
|
||||||
{
|
{
|
||||||
|
early_shadow_stamp();
|
||||||
if (r0)
|
if (r0)
|
||||||
strncpy(command_line, r0, COMMAND_LINE_SIZE);
|
strncpy(command_line, r0, COMMAND_LINE_SIZE);
|
||||||
}
|
}
|
||||||
|
113
arch/blackfin/kernel/shadow_console.c
Normal file
113
arch/blackfin/kernel/shadow_console.c
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
/*
|
||||||
|
* manage a small early shadow of the log buffer which we can pass between the
|
||||||
|
* bootloader so early crash messages are communicated properly and easily
|
||||||
|
*
|
||||||
|
* Copyright 2009 Analog Devices Inc.
|
||||||
|
*
|
||||||
|
* Enter bugs at http://blackfin.uclinux.org/
|
||||||
|
*
|
||||||
|
* Licensed under the GPL-2 or later.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/console.h>
|
||||||
|
#include <linux/string.h>
|
||||||
|
#include <asm/blackfin.h>
|
||||||
|
#include <asm/irq_handler.h>
|
||||||
|
#include <asm/early_printk.h>
|
||||||
|
|
||||||
|
#define SHADOW_CONSOLE_START (0x500)
|
||||||
|
#define SHADOW_CONSOLE_END (0x1000)
|
||||||
|
#define SHADOW_CONSOLE_MAGIC_LOC (0x4F0)
|
||||||
|
#define SHADOW_CONSOLE_MAGIC (0xDEADBEEF)
|
||||||
|
|
||||||
|
static __initdata char *shadow_console_buffer = (char *)SHADOW_CONSOLE_START;
|
||||||
|
|
||||||
|
__init void early_shadow_write(struct console *con, const char *s,
|
||||||
|
unsigned int n)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
/*
|
||||||
|
* save 2 bytes for the double null at the end
|
||||||
|
* once we fail on a long line, make sure we don't write a short line afterwards
|
||||||
|
*/
|
||||||
|
if ((shadow_console_buffer + n) <= (char *)(SHADOW_CONSOLE_END - 2)) {
|
||||||
|
/* can't use memcpy - it may not be relocated yet */
|
||||||
|
for (i = 0; i <= n; i++)
|
||||||
|
shadow_console_buffer[i] = s[i];
|
||||||
|
shadow_console_buffer += n;
|
||||||
|
shadow_console_buffer[0] = 0;
|
||||||
|
shadow_console_buffer[1] = 0;
|
||||||
|
} else
|
||||||
|
shadow_console_buffer = (char *)SHADOW_CONSOLE_END;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __initdata struct console early_shadow_console = {
|
||||||
|
.name = "early_shadow",
|
||||||
|
.write = early_shadow_write,
|
||||||
|
.flags = CON_BOOT | CON_PRINTBUFFER,
|
||||||
|
.index = -1,
|
||||||
|
.device = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
__init int shadow_console_enabled(void)
|
||||||
|
{
|
||||||
|
return early_shadow_console.flags & CON_ENABLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
__init void mark_shadow_error(void)
|
||||||
|
{
|
||||||
|
int *loc = (int *)SHADOW_CONSOLE_MAGIC_LOC;
|
||||||
|
loc[0] = SHADOW_CONSOLE_MAGIC;
|
||||||
|
loc[1] = SHADOW_CONSOLE_START;
|
||||||
|
}
|
||||||
|
|
||||||
|
__init void enable_shadow_console(void)
|
||||||
|
{
|
||||||
|
if (!shadow_console_enabled()) {
|
||||||
|
register_console(&early_shadow_console);
|
||||||
|
/* for now, assume things are going to fail */
|
||||||
|
mark_shadow_error();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static __init int disable_shadow_console(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* by the time pure_initcall runs, the standard console is enabled,
|
||||||
|
* and the early_console is off, so unset the magic numbers
|
||||||
|
* unregistering the console is taken care of in common code (See
|
||||||
|
* ./kernel/printk:disable_boot_consoles() )
|
||||||
|
*/
|
||||||
|
int *loc = (int *)SHADOW_CONSOLE_MAGIC_LOC;
|
||||||
|
|
||||||
|
loc[0] = 0;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
pure_initcall(disable_shadow_console);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* since we can't use printk, dump numbers (as hex), n = # bits
|
||||||
|
*/
|
||||||
|
__init void early_shadow_reg(unsigned long reg, unsigned int n)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* can't use any "normal" kernel features, since thay
|
||||||
|
* may not be relocated to their execute address yet
|
||||||
|
*/
|
||||||
|
int i;
|
||||||
|
char ascii[11] = " 0x";
|
||||||
|
|
||||||
|
n = n / 4;
|
||||||
|
reg = reg << ((8 - n) * 4);
|
||||||
|
n += 3;
|
||||||
|
|
||||||
|
for (i = 3; i <= n ; i++) {
|
||||||
|
ascii[i] = hex_asc_lo(reg >> 28);
|
||||||
|
reg <<= 4;
|
||||||
|
}
|
||||||
|
early_shadow_write(NULL, ascii, n);
|
||||||
|
|
||||||
|
}
|
@ -66,7 +66,7 @@ static cycle_t bfin_read_cycles(struct clocksource *cs)
|
|||||||
|
|
||||||
static struct clocksource bfin_cs_cycles = {
|
static struct clocksource bfin_cs_cycles = {
|
||||||
.name = "bfin_cs_cycles",
|
.name = "bfin_cs_cycles",
|
||||||
.rating = 350,
|
.rating = 400,
|
||||||
.read = bfin_read_cycles,
|
.read = bfin_read_cycles,
|
||||||
.mask = CLOCKSOURCE_MASK(64),
|
.mask = CLOCKSOURCE_MASK(64),
|
||||||
.shift = 22,
|
.shift = 22,
|
||||||
@ -115,7 +115,7 @@ static cycle_t bfin_read_gptimer0(void)
|
|||||||
|
|
||||||
static struct clocksource bfin_cs_gptimer0 = {
|
static struct clocksource bfin_cs_gptimer0 = {
|
||||||
.name = "bfin_cs_gptimer0",
|
.name = "bfin_cs_gptimer0",
|
||||||
.rating = 400,
|
.rating = 350,
|
||||||
.read = bfin_read_gptimer0,
|
.read = bfin_read_gptimer0,
|
||||||
.mask = CLOCKSOURCE_MASK(32),
|
.mask = CLOCKSOURCE_MASK(32),
|
||||||
.shift = 22,
|
.shift = 22,
|
||||||
|
@ -100,7 +100,11 @@ static void decode_address(char *buf, unsigned long address)
|
|||||||
char *modname;
|
char *modname;
|
||||||
char *delim = ":";
|
char *delim = ":";
|
||||||
char namebuf[128];
|
char namebuf[128];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
buf += sprintf(buf, "<0x%08lx> ", address);
|
||||||
|
|
||||||
|
#ifdef CONFIG_KALLSYMS
|
||||||
/* look up the address and see if we are in kernel space */
|
/* look up the address and see if we are in kernel space */
|
||||||
symname = kallsyms_lookup(address, &symsize, &offset, &modname, namebuf);
|
symname = kallsyms_lookup(address, &symsize, &offset, &modname, namebuf);
|
||||||
|
|
||||||
@ -108,23 +112,33 @@ static void decode_address(char *buf, unsigned long address)
|
|||||||
/* yeah! kernel space! */
|
/* yeah! kernel space! */
|
||||||
if (!modname)
|
if (!modname)
|
||||||
modname = delim = "";
|
modname = delim = "";
|
||||||
sprintf(buf, "<0x%p> { %s%s%s%s + 0x%lx }",
|
sprintf(buf, "{ %s%s%s%s + 0x%lx }",
|
||||||
(void *)address, delim, modname, delim, symname,
|
delim, modname, delim, symname,
|
||||||
(unsigned long)offset);
|
(unsigned long)offset);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Problem in fixed code section? */
|
|
||||||
if (address >= FIXED_CODE_START && address < FIXED_CODE_END) {
|
if (address >= FIXED_CODE_START && address < FIXED_CODE_END) {
|
||||||
sprintf(buf, "<0x%p> /* Maybe fixed code section */", (void *)address);
|
/* Problem in fixed code section? */
|
||||||
|
strcat(buf, "/* Maybe fixed code section */");
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
/* Problem somewhere before the kernel start address */
|
} else if (address < CONFIG_BOOT_LOAD) {
|
||||||
if (address < CONFIG_BOOT_LOAD) {
|
/* Problem somewhere before the kernel start address */
|
||||||
sprintf(buf, "<0x%p> /* Maybe null pointer? */", (void *)address);
|
strcat(buf, "/* Maybe null pointer? */");
|
||||||
|
return;
|
||||||
|
|
||||||
|
} else if (address >= COREMMR_BASE) {
|
||||||
|
strcat(buf, "/* core mmrs */");
|
||||||
|
return;
|
||||||
|
|
||||||
|
} else if (address >= SYSMMR_BASE) {
|
||||||
|
strcat(buf, "/* system mmrs */");
|
||||||
|
return;
|
||||||
|
|
||||||
|
} else if (address >= L1_ROM_START && address < L1_ROM_START + L1_ROM_LENGTH) {
|
||||||
|
strcat(buf, "/* on-chip L1 ROM */");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,18 +186,16 @@ static void decode_address(char *buf, unsigned long address)
|
|||||||
offset = (address - vma->vm_start) +
|
offset = (address - vma->vm_start) +
|
||||||
(vma->vm_pgoff << PAGE_SHIFT);
|
(vma->vm_pgoff << PAGE_SHIFT);
|
||||||
|
|
||||||
sprintf(buf, "<0x%p> [ %s + 0x%lx ]",
|
sprintf(buf, "[ %s + 0x%lx ]", name, offset);
|
||||||
(void *)address, name, offset);
|
|
||||||
} else
|
} else
|
||||||
sprintf(buf, "<0x%p> [ %s vma:0x%lx-0x%lx]",
|
sprintf(buf, "[ %s vma:0x%lx-0x%lx]",
|
||||||
(void *)address, name,
|
name, vma->vm_start, vma->vm_end);
|
||||||
vma->vm_start, vma->vm_end);
|
|
||||||
|
|
||||||
if (!in_atomic)
|
if (!in_atomic)
|
||||||
mmput(mm);
|
mmput(mm);
|
||||||
|
|
||||||
if (!strlen(buf))
|
if (buf[0] == '\0')
|
||||||
sprintf(buf, "<0x%p> [ %s ] dynamic memory", (void *)address, name);
|
sprintf(buf, "[ %s ] dynamic memory", name);
|
||||||
|
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
@ -193,7 +205,7 @@ static void decode_address(char *buf, unsigned long address)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* we were unable to find this address anywhere */
|
/* we were unable to find this address anywhere */
|
||||||
sprintf(buf, "<0x%p> /* kernel dynamic memory */", (void *)address);
|
sprintf(buf, "/* kernel dynamic memory */");
|
||||||
|
|
||||||
done:
|
done:
|
||||||
write_unlock_irqrestore(&tasklist_lock, flags);
|
write_unlock_irqrestore(&tasklist_lock, flags);
|
||||||
@ -215,14 +227,14 @@ asmlinkage void double_fault_c(struct pt_regs *fp)
|
|||||||
printk(KERN_EMERG "Double Fault\n");
|
printk(KERN_EMERG "Double Fault\n");
|
||||||
#ifdef CONFIG_DEBUG_DOUBLEFAULT_PRINT
|
#ifdef CONFIG_DEBUG_DOUBLEFAULT_PRINT
|
||||||
if (((long)fp->seqstat & SEQSTAT_EXCAUSE) == VEC_UNCOV) {
|
if (((long)fp->seqstat & SEQSTAT_EXCAUSE) == VEC_UNCOV) {
|
||||||
unsigned int cpu = smp_processor_id();
|
unsigned int cpu = raw_smp_processor_id();
|
||||||
char buf[150];
|
char buf[150];
|
||||||
decode_address(buf, cpu_pda[cpu].retx);
|
decode_address(buf, cpu_pda[cpu].retx_doublefault);
|
||||||
printk(KERN_EMERG "While handling exception (EXCAUSE = 0x%x) at %s:\n",
|
printk(KERN_EMERG "While handling exception (EXCAUSE = 0x%x) at %s:\n",
|
||||||
(unsigned int)cpu_pda[cpu].seqstat & SEQSTAT_EXCAUSE, buf);
|
(unsigned int)cpu_pda[cpu].seqstat_doublefault & SEQSTAT_EXCAUSE, buf);
|
||||||
decode_address(buf, cpu_pda[cpu].dcplb_fault_addr);
|
decode_address(buf, cpu_pda[cpu].dcplb_doublefault_addr);
|
||||||
printk(KERN_NOTICE " DCPLB_FAULT_ADDR: %s\n", buf);
|
printk(KERN_NOTICE " DCPLB_FAULT_ADDR: %s\n", buf);
|
||||||
decode_address(buf, cpu_pda[cpu].icplb_fault_addr);
|
decode_address(buf, cpu_pda[cpu].icplb_doublefault_addr);
|
||||||
printk(KERN_NOTICE " ICPLB_FAULT_ADDR: %s\n", buf);
|
printk(KERN_NOTICE " ICPLB_FAULT_ADDR: %s\n", buf);
|
||||||
|
|
||||||
decode_address(buf, fp->retx);
|
decode_address(buf, fp->retx);
|
||||||
@ -245,13 +257,13 @@ static int kernel_mode_regs(struct pt_regs *regs)
|
|||||||
return regs->ipend & 0xffc0;
|
return regs->ipend & 0xffc0;
|
||||||
}
|
}
|
||||||
|
|
||||||
asmlinkage void trap_c(struct pt_regs *fp)
|
asmlinkage notrace void trap_c(struct pt_regs *fp)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON
|
#ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON
|
||||||
int j;
|
int j;
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_DEBUG_HUNT_FOR_ZERO
|
#ifdef CONFIG_DEBUG_HUNT_FOR_ZERO
|
||||||
unsigned int cpu = smp_processor_id();
|
unsigned int cpu = raw_smp_processor_id();
|
||||||
#endif
|
#endif
|
||||||
const char *strerror = NULL;
|
const char *strerror = NULL;
|
||||||
int sig = 0;
|
int sig = 0;
|
||||||
@ -267,11 +279,6 @@ asmlinkage void trap_c(struct pt_regs *fp)
|
|||||||
* double faults if the stack has become corrupt
|
* double faults if the stack has become corrupt
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CONFIG_KGDB
|
|
||||||
/* IPEND is skipped if KGDB isn't enabled (see entry code) */
|
|
||||||
fp->ipend = bfin_read_IPEND();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* trap_c() will be called for exceptions. During exceptions
|
/* trap_c() will be called for exceptions. During exceptions
|
||||||
* processing, the pc value should be set with retx value.
|
* processing, the pc value should be set with retx value.
|
||||||
* With this change we can cleanup some code in signal.c- TODO
|
* With this change we can cleanup some code in signal.c- TODO
|
||||||
@ -404,7 +411,7 @@ asmlinkage void trap_c(struct pt_regs *fp)
|
|||||||
/* 0x23 - Data CPLB protection violation, handled here */
|
/* 0x23 - Data CPLB protection violation, handled here */
|
||||||
case VEC_CPLB_VL:
|
case VEC_CPLB_VL:
|
||||||
info.si_code = ILL_CPLB_VI;
|
info.si_code = ILL_CPLB_VI;
|
||||||
sig = SIGBUS;
|
sig = SIGSEGV;
|
||||||
strerror = KERN_NOTICE EXC_0x23(KERN_NOTICE);
|
strerror = KERN_NOTICE EXC_0x23(KERN_NOTICE);
|
||||||
CHK_DEBUGGER_TRAP_MAYBE();
|
CHK_DEBUGGER_TRAP_MAYBE();
|
||||||
break;
|
break;
|
||||||
@ -904,7 +911,7 @@ void show_stack(struct task_struct *task, unsigned long *stack)
|
|||||||
frame_no = 0;
|
frame_no = 0;
|
||||||
|
|
||||||
for (addr = (unsigned int *)((unsigned int)stack & ~0xF), i = 0;
|
for (addr = (unsigned int *)((unsigned int)stack & ~0xF), i = 0;
|
||||||
addr <= endstack; addr++, i++) {
|
addr < endstack; addr++, i++) {
|
||||||
|
|
||||||
ret_addr = 0;
|
ret_addr = 0;
|
||||||
if (!j && i % 8 == 0)
|
if (!j && i % 8 == 0)
|
||||||
@ -949,6 +956,7 @@ void show_stack(struct task_struct *task, unsigned long *stack)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(show_stack);
|
||||||
|
|
||||||
void dump_stack(void)
|
void dump_stack(void)
|
||||||
{
|
{
|
||||||
@ -1090,7 +1098,7 @@ void show_regs(struct pt_regs *fp)
|
|||||||
struct irqaction *action;
|
struct irqaction *action;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
unsigned long flags = 0;
|
unsigned long flags = 0;
|
||||||
unsigned int cpu = smp_processor_id();
|
unsigned int cpu = raw_smp_processor_id();
|
||||||
unsigned char in_atomic = (bfin_read_IPEND() & 0x10) || in_atomic();
|
unsigned char in_atomic = (bfin_read_IPEND() & 0x10) || in_atomic();
|
||||||
|
|
||||||
verbose_printk(KERN_NOTICE "\n");
|
verbose_printk(KERN_NOTICE "\n");
|
||||||
@ -1116,10 +1124,16 @@ void show_regs(struct pt_regs *fp)
|
|||||||
|
|
||||||
verbose_printk(KERN_NOTICE "%s", linux_banner);
|
verbose_printk(KERN_NOTICE "%s", linux_banner);
|
||||||
|
|
||||||
verbose_printk(KERN_NOTICE "\nSEQUENCER STATUS:\t\t%s\n",
|
verbose_printk(KERN_NOTICE "\nSEQUENCER STATUS:\t\t%s\n", print_tainted());
|
||||||
print_tainted());
|
verbose_printk(KERN_NOTICE " SEQSTAT: %08lx IPEND: %04lx IMASK: %04lx SYSCFG: %04lx\n",
|
||||||
verbose_printk(KERN_NOTICE " SEQSTAT: %08lx IPEND: %04lx SYSCFG: %04lx\n",
|
(long)fp->seqstat, fp->ipend, cpu_pda[raw_smp_processor_id()].ex_imask, fp->syscfg);
|
||||||
(long)fp->seqstat, fp->ipend, fp->syscfg);
|
if (fp->ipend & EVT_IRPTEN)
|
||||||
|
verbose_printk(KERN_NOTICE " Global Interrupts Disabled (IPEND[4])\n");
|
||||||
|
if (!(cpu_pda[raw_smp_processor_id()].ex_imask & (EVT_IVG13 | EVT_IVG12 | EVT_IVG11 |
|
||||||
|
EVT_IVG10 | EVT_IVG9 | EVT_IVG8 | EVT_IVG7 | EVT_IVTMR)))
|
||||||
|
verbose_printk(KERN_NOTICE " Peripheral interrupts masked off\n");
|
||||||
|
if (!(cpu_pda[raw_smp_processor_id()].ex_imask & (EVT_IVG15 | EVT_IVG14)))
|
||||||
|
verbose_printk(KERN_NOTICE " Kernel interrupts masked off\n");
|
||||||
if ((fp->seqstat & SEQSTAT_EXCAUSE) == VEC_HWERR) {
|
if ((fp->seqstat & SEQSTAT_EXCAUSE) == VEC_HWERR) {
|
||||||
verbose_printk(KERN_NOTICE " HWERRCAUSE: 0x%lx\n",
|
verbose_printk(KERN_NOTICE " HWERRCAUSE: 0x%lx\n",
|
||||||
(fp->seqstat & SEQSTAT_HWERRCAUSE) >> 14);
|
(fp->seqstat & SEQSTAT_HWERRCAUSE) >> 14);
|
||||||
|
@ -221,7 +221,7 @@ SECTIONS
|
|||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
__ebss_l1 = .;
|
__ebss_l1 = .;
|
||||||
}
|
}
|
||||||
ASSERT (SIZEOF(.data_a_l1) <= L1_DATA_A_LENGTH, "L1 data A overflow!")
|
ASSERT (SIZEOF(.data_l1) <= L1_DATA_A_LENGTH, "L1 data A overflow!")
|
||||||
|
|
||||||
.data_b_l1 L1_DATA_B_START : AT(LOADADDR(.data_l1) + SIZEOF(.data_l1))
|
.data_b_l1 L1_DATA_B_START : AT(LOADADDR(.data_l1) + SIZEOF(.data_l1))
|
||||||
{
|
{
|
||||||
@ -262,7 +262,7 @@ SECTIONS
|
|||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
__ebss_l2 = .;
|
__ebss_l2 = .;
|
||||||
}
|
}
|
||||||
ASSERT (SIZEOF(.text_data_l1) <= L2_LENGTH, "L2 overflow!")
|
ASSERT (SIZEOF(.text_data_l2) <= L2_LENGTH, "L2 overflow!")
|
||||||
|
|
||||||
/* Force trailing alignment of our init section so that when we
|
/* Force trailing alignment of our init section so that when we
|
||||||
* free our init memory, we don't leave behind a partial page.
|
* free our init memory, we don't leave behind a partial page.
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
[--sp] = rets; \
|
[--sp] = rets; \
|
||||||
[--sp] = (P5:0); \
|
[--sp] = (P5:0); \
|
||||||
sp += -12; \
|
sp += -12; \
|
||||||
call ___ipipe_stall_root_raw; \
|
call ___ipipe_disable_root_irqs_hw; \
|
||||||
sp += 12; \
|
sp += 12; \
|
||||||
(P5:0) = [sp++];
|
(P5:0) = [sp++];
|
||||||
# define CLI_INNER_NOP
|
# define CLI_INNER_NOP
|
||||||
@ -28,7 +28,7 @@
|
|||||||
#ifdef CONFIG_IPIPE
|
#ifdef CONFIG_IPIPE
|
||||||
# define DO_STI \
|
# define DO_STI \
|
||||||
sp += -12; \
|
sp += -12; \
|
||||||
call ___ipipe_unstall_root_raw; \
|
call ___ipipe_enable_root_irqs_hw; \
|
||||||
sp += 12; \
|
sp += 12; \
|
||||||
2: rets = [sp++];
|
2: rets = [sp++];
|
||||||
#else
|
#else
|
||||||
|
@ -199,15 +199,6 @@ static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_PBX)
|
|
||||||
static struct bfin5xx_spi_chip spi_si3xxx_chip_info = {
|
|
||||||
.ctl_reg = 0x4, /* send zero */
|
|
||||||
.enable_dma = 0,
|
|
||||||
.bits_per_word = 8,
|
|
||||||
.cs_change_per_word = 1,
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
|
#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
|
||||||
static struct bfin5xx_spi_chip spi_ad7877_chip_info = {
|
static struct bfin5xx_spi_chip spi_ad7877_chip_info = {
|
||||||
.enable_dma = 0,
|
.enable_dma = 0,
|
||||||
@ -296,24 +287,6 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
|||||||
.mode = SPI_MODE_3,
|
.mode = SPI_MODE_3,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_PBX)
|
|
||||||
{
|
|
||||||
.modalias = "fxs-spi",
|
|
||||||
.max_speed_hz = 12500000, /* max spi clock (SCK) speed in HZ */
|
|
||||||
.bus_num = 0,
|
|
||||||
.chip_select = 8 - CONFIG_J11_JUMPER,
|
|
||||||
.controller_data = &spi_si3xxx_chip_info,
|
|
||||||
.mode = SPI_MODE_3,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.modalias = "fxo-spi",
|
|
||||||
.max_speed_hz = 12500000, /* max spi clock (SCK) speed in HZ */
|
|
||||||
.bus_num = 0,
|
|
||||||
.chip_select = 8 - CONFIG_J19_JUMPER,
|
|
||||||
.controller_data = &spi_si3xxx_chip_info,
|
|
||||||
.mode = SPI_MODE_3,
|
|
||||||
},
|
|
||||||
#endif
|
|
||||||
#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
|
#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "ad7877",
|
.modalias = "ad7877",
|
||||||
@ -539,7 +512,7 @@ static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
|||||||
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_TWI_KEYPAD) || defined(CONFIG_TWI_KEYPAD_MODULE)
|
#if defined(CONFIG_INPUT_PCF8574) || defined(CONFIG_INPUT_PCF8574_MODULE)
|
||||||
{
|
{
|
||||||
I2C_BOARD_INFO("pcf8574_keypad", 0x27),
|
I2C_BOARD_INFO("pcf8574_keypad", 0x27),
|
||||||
.irq = IRQ_PF8,
|
.irq = IRQ_PF8,
|
||||||
|
@ -124,6 +124,7 @@
|
|||||||
#define ANOMALY_05000386 (0)
|
#define ANOMALY_05000386 (0)
|
||||||
#define ANOMALY_05000389 (0)
|
#define ANOMALY_05000389 (0)
|
||||||
#define ANOMALY_05000400 (0)
|
#define ANOMALY_05000400 (0)
|
||||||
|
#define ANOMALY_05000402 (0)
|
||||||
#define ANOMALY_05000412 (0)
|
#define ANOMALY_05000412 (0)
|
||||||
#define ANOMALY_05000432 (0)
|
#define ANOMALY_05000432 (0)
|
||||||
#define ANOMALY_05000447 (0)
|
#define ANOMALY_05000447 (0)
|
||||||
|
@ -68,11 +68,6 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* UART_IIR Register */
|
|
||||||
#define STATUS(x) ((x << 1) & 0x06)
|
|
||||||
#define STATUS_P1 0x02
|
|
||||||
#define STATUS_P0 0x01
|
|
||||||
|
|
||||||
#define BFIN_UART_NR_PORTS 2
|
#define BFIN_UART_NR_PORTS 2
|
||||||
|
|
||||||
#define OFFSET_THR 0x00 /* Transmit Holding register */
|
#define OFFSET_THR 0x00 /* Transmit Holding register */
|
||||||
@ -88,11 +83,6 @@
|
|||||||
#define OFFSET_SCR 0x1C /* SCR Scratch Register */
|
#define OFFSET_SCR 0x1C /* SCR Scratch Register */
|
||||||
#define OFFSET_GCTL 0x24 /* Global Control Register */
|
#define OFFSET_GCTL 0x24 /* Global Control Register */
|
||||||
|
|
||||||
/* DPMC*/
|
|
||||||
#define bfin_read_STOPCK_OFF() bfin_read_STOPCK()
|
|
||||||
#define bfin_write_STOPCK_OFF(val) bfin_write_STOPCK(val)
|
|
||||||
#define STOPCK_OFF STOPCK
|
|
||||||
|
|
||||||
/* PLL_DIV Masks */
|
/* PLL_DIV Masks */
|
||||||
#define CCLK_DIV1 CSEL_DIV1 /* CCLK = VCO / 1 */
|
#define CCLK_DIV1 CSEL_DIV1 /* CCLK = VCO / 1 */
|
||||||
#define CCLK_DIV2 CSEL_DIV2 /* CCLK = VCO / 2 */
|
#define CCLK_DIV2 CSEL_DIV2 /* CCLK = VCO / 2 */
|
||||||
|
@ -151,46 +151,6 @@ static struct platform_device musb_device = {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
|
|
||||||
static struct mtd_partition ezkit_partitions[] = {
|
|
||||||
{
|
|
||||||
.name = "bootloader(nor)",
|
|
||||||
.size = 0x40000,
|
|
||||||
.offset = 0,
|
|
||||||
}, {
|
|
||||||
.name = "linux kernel(nor)",
|
|
||||||
.size = 0x1C0000,
|
|
||||||
.offset = MTDPART_OFS_APPEND,
|
|
||||||
}, {
|
|
||||||
.name = "file system(nor)",
|
|
||||||
.size = MTDPART_SIZ_FULL,
|
|
||||||
.offset = MTDPART_OFS_APPEND,
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct physmap_flash_data ezkit_flash_data = {
|
|
||||||
.width = 2,
|
|
||||||
.parts = ezkit_partitions,
|
|
||||||
.nr_parts = ARRAY_SIZE(ezkit_partitions),
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct resource ezkit_flash_resource = {
|
|
||||||
.start = 0x20000000,
|
|
||||||
.end = 0x201fffff,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct platform_device ezkit_flash_device = {
|
|
||||||
.name = "physmap-flash",
|
|
||||||
.id = 0,
|
|
||||||
.dev = {
|
|
||||||
.platform_data = &ezkit_flash_data,
|
|
||||||
},
|
|
||||||
.num_resources = 1,
|
|
||||||
.resource = &ezkit_flash_resource,
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE)
|
#if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE)
|
||||||
static struct mtd_partition partition_info[] = {
|
static struct mtd_partition partition_info[] = {
|
||||||
{
|
{
|
||||||
@ -275,6 +235,14 @@ static struct platform_device rtc_device = {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
||||||
|
#include <linux/smc91x.h>
|
||||||
|
|
||||||
|
static struct smc91x_platdata smc91x_info = {
|
||||||
|
.flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
|
||||||
|
.leda = RPC_LED_100_10,
|
||||||
|
.ledb = RPC_LED_TX_RX,
|
||||||
|
};
|
||||||
|
|
||||||
static struct resource smc91x_resources[] = {
|
static struct resource smc91x_resources[] = {
|
||||||
{
|
{
|
||||||
.name = "smc91x-regs",
|
.name = "smc91x-regs",
|
||||||
@ -293,6 +261,9 @@ static struct platform_device smc91x_device = {
|
|||||||
.id = 0,
|
.id = 0,
|
||||||
.num_resources = ARRAY_SIZE(smc91x_resources),
|
.num_resources = ARRAY_SIZE(smc91x_resources),
|
||||||
.resource = smc91x_resources,
|
.resource = smc91x_resources,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &smc91x_info,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -300,10 +271,15 @@ static struct platform_device smc91x_device = {
|
|||||||
static struct resource dm9000_resources[] = {
|
static struct resource dm9000_resources[] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
.start = 0x203FB800,
|
.start = 0x203FB800,
|
||||||
.end = 0x203FB800 + 8,
|
.end = 0x203FB800 + 1,
|
||||||
.flags = IORESOURCE_MEM,
|
.flags = IORESOURCE_MEM,
|
||||||
},
|
},
|
||||||
[1] = {
|
[1] = {
|
||||||
|
.start = 0x203FB804,
|
||||||
|
.end = 0x203FB804 + 1,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
.start = IRQ_PF9,
|
.start = IRQ_PF9,
|
||||||
.end = IRQ_PF9,
|
.end = IRQ_PF9,
|
||||||
.flags = (IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE),
|
.flags = (IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE),
|
||||||
@ -479,13 +455,6 @@ static struct bfin5xx_spi_chip ad1836_spi_chip_info = {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE)
|
|
||||||
static struct bfin5xx_spi_chip ad9960_spi_chip_info = {
|
|
||||||
.enable_dma = 0,
|
|
||||||
.bits_per_word = 16,
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
||||||
static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
||||||
.enable_dma = 0,
|
.enable_dma = 0,
|
||||||
@ -493,15 +462,6 @@ static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_PBX)
|
|
||||||
static struct bfin5xx_spi_chip spi_si3xxx_chip_info = {
|
|
||||||
.ctl_reg = 0x4, /* send zero */
|
|
||||||
.enable_dma = 0,
|
|
||||||
.bits_per_word = 8,
|
|
||||||
.cs_change_per_word = 1,
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
|
#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
|
||||||
static struct bfin5xx_spi_chip spi_ad7877_chip_info = {
|
static struct bfin5xx_spi_chip spi_ad7877_chip_info = {
|
||||||
.enable_dma = 0,
|
.enable_dma = 0,
|
||||||
@ -568,22 +528,13 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
|||||||
#if defined(CONFIG_SND_BLACKFIN_AD1836) \
|
#if defined(CONFIG_SND_BLACKFIN_AD1836) \
|
||||||
|| defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
|| defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "ad1836-spi",
|
.modalias = "ad1836",
|
||||||
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
|
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
|
||||||
.bus_num = 0,
|
.bus_num = 0,
|
||||||
.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
||||||
.controller_data = &ad1836_spi_chip_info,
|
.controller_data = &ad1836_spi_chip_info,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE)
|
|
||||||
{
|
|
||||||
.modalias = "ad9960-spi",
|
|
||||||
.max_speed_hz = 10000000, /* max spi clock (SCK) speed in HZ */
|
|
||||||
.bus_num = 0,
|
|
||||||
.chip_select = 1,
|
|
||||||
.controller_data = &ad9960_spi_chip_info,
|
|
||||||
},
|
|
||||||
#endif
|
|
||||||
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "mmc_spi",
|
.modalias = "mmc_spi",
|
||||||
@ -594,24 +545,6 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
|||||||
.mode = SPI_MODE_3,
|
.mode = SPI_MODE_3,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_PBX)
|
|
||||||
{
|
|
||||||
.modalias = "fxs-spi",
|
|
||||||
.max_speed_hz = 12500000, /* max spi clock (SCK) speed in HZ */
|
|
||||||
.bus_num = 0,
|
|
||||||
.chip_select = 8 - CONFIG_J11_JUMPER,
|
|
||||||
.controller_data = &spi_si3xxx_chip_info,
|
|
||||||
.mode = SPI_MODE_3,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.modalias = "fxo-spi",
|
|
||||||
.max_speed_hz = 12500000, /* max spi clock (SCK) speed in HZ */
|
|
||||||
.bus_num = 0,
|
|
||||||
.chip_select = 8 - CONFIG_J19_JUMPER,
|
|
||||||
.controller_data = &spi_si3xxx_chip_info,
|
|
||||||
.mode = SPI_MODE_3,
|
|
||||||
},
|
|
||||||
#endif
|
|
||||||
#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
|
#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "ad7877",
|
.modalias = "ad7877",
|
||||||
@ -689,6 +622,55 @@ static struct platform_device bfin_fb_adv7393_device = {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE)
|
||||||
|
static struct mtd_partition cm_partitions[] = {
|
||||||
|
{
|
||||||
|
.name = "bootloader(nor)",
|
||||||
|
.size = 0x40000,
|
||||||
|
.offset = 0,
|
||||||
|
}, {
|
||||||
|
.name = "linux kernel(nor)",
|
||||||
|
.size = 0x100000,
|
||||||
|
.offset = MTDPART_OFS_APPEND,
|
||||||
|
}, {
|
||||||
|
.name = "file system(nor)",
|
||||||
|
.size = MTDPART_SIZ_FULL,
|
||||||
|
.offset = MTDPART_OFS_APPEND,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct physmap_flash_data cm_flash_data = {
|
||||||
|
.width = 2,
|
||||||
|
.parts = cm_partitions,
|
||||||
|
.nr_parts = ARRAY_SIZE(cm_partitions),
|
||||||
|
};
|
||||||
|
|
||||||
|
static unsigned cm_flash_gpios[] = { GPIO_PH9, GPIO_PG11 };
|
||||||
|
|
||||||
|
static struct resource cm_flash_resource[] = {
|
||||||
|
{
|
||||||
|
.name = "cfi_probe",
|
||||||
|
.start = 0x20000000,
|
||||||
|
.end = 0x201fffff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
}, {
|
||||||
|
.start = (unsigned long)cm_flash_gpios,
|
||||||
|
.end = ARRAY_SIZE(cm_flash_gpios),
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device cm_flash_device = {
|
||||||
|
.name = "gpio-addr-flash",
|
||||||
|
.id = 0,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &cm_flash_data,
|
||||||
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(cm_flash_resource),
|
||||||
|
.resource = cm_flash_resource,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE)
|
#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE)
|
||||||
static struct resource bfin_uart_resources[] = {
|
static struct resource bfin_uart_resources[] = {
|
||||||
#ifdef CONFIG_SERIAL_BFIN_UART0
|
#ifdef CONFIG_SERIAL_BFIN_UART0
|
||||||
@ -796,13 +778,11 @@ static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
|||||||
#if defined(CONFIG_BFIN_TWI_LCD) || defined(CONFIG_BFIN_TWI_LCD_MODULE)
|
#if defined(CONFIG_BFIN_TWI_LCD) || defined(CONFIG_BFIN_TWI_LCD_MODULE)
|
||||||
{
|
{
|
||||||
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
||||||
.type = "pcf8574_lcd",
|
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_TWI_KEYPAD) || defined(CONFIG_TWI_KEYPAD_MODULE)
|
#if defined(CONFIG_INPUT_PCF8574) || defined(CONFIG_INPUT_PCF8574_MODULE)
|
||||||
{
|
{
|
||||||
I2C_BOARD_INFO("pcf8574_keypad", 0x27),
|
I2C_BOARD_INFO("pcf8574_keypad", 0x27),
|
||||||
.type = "pcf8574_keypad",
|
|
||||||
.irq = IRQ_PF8,
|
.irq = IRQ_PF8,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
@ -876,7 +856,7 @@ static struct platform_device bfin_dpmc = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device *stamp_devices[] __initdata = {
|
static struct platform_device *cmbf527_devices[] __initdata = {
|
||||||
|
|
||||||
&bfin_dpmc,
|
&bfin_dpmc,
|
||||||
|
|
||||||
@ -959,8 +939,8 @@ static struct platform_device *stamp_devices[] __initdata = {
|
|||||||
&bfin_device_gpiokeys,
|
&bfin_device_gpiokeys,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
|
#if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE)
|
||||||
&ezkit_flash_device,
|
&cm_flash_device,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
&bfin_gpios_device,
|
&bfin_gpios_device,
|
||||||
@ -971,7 +951,7 @@ static int __init cm_init(void)
|
|||||||
printk(KERN_INFO "%s(): registering device resources\n", __func__);
|
printk(KERN_INFO "%s(): registering device resources\n", __func__);
|
||||||
i2c_register_board_info(0, bfin_i2c_board_info,
|
i2c_register_board_info(0, bfin_i2c_board_info,
|
||||||
ARRAY_SIZE(bfin_i2c_board_info));
|
ARRAY_SIZE(bfin_i2c_board_info));
|
||||||
platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
|
platform_add_devices(cmbf527_devices, ARRAY_SIZE(cmbf527_devices));
|
||||||
spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
|
spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -263,15 +263,6 @@ static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_PBX)
|
|
||||||
static struct bfin5xx_spi_chip spi_si3xxx_chip_info = {
|
|
||||||
.ctl_reg = 0x4, /* send zero */
|
|
||||||
.enable_dma = 0,
|
|
||||||
.bits_per_word = 8,
|
|
||||||
.cs_change_per_word = 1,
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
|
#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
|
||||||
static struct bfin5xx_spi_chip spi_ad7877_chip_info = {
|
static struct bfin5xx_spi_chip spi_ad7877_chip_info = {
|
||||||
.enable_dma = 0,
|
.enable_dma = 0,
|
||||||
@ -376,24 +367,6 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
|||||||
.mode = SPI_MODE_3,
|
.mode = SPI_MODE_3,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_PBX)
|
|
||||||
{
|
|
||||||
.modalias = "fxs-spi",
|
|
||||||
.max_speed_hz = 12500000, /* max spi clock (SCK) speed in HZ */
|
|
||||||
.bus_num = 0,
|
|
||||||
.chip_select = 8 - CONFIG_J11_JUMPER,
|
|
||||||
.controller_data = &spi_si3xxx_chip_info,
|
|
||||||
.mode = SPI_MODE_3,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.modalias = "fxo-spi",
|
|
||||||
.max_speed_hz = 12500000, /* max spi clock (SCK) speed in HZ */
|
|
||||||
.bus_num = 0,
|
|
||||||
.chip_select = 8 - CONFIG_J19_JUMPER,
|
|
||||||
.controller_data = &spi_si3xxx_chip_info,
|
|
||||||
.mode = SPI_MODE_3,
|
|
||||||
},
|
|
||||||
#endif
|
|
||||||
#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
|
#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "ad7877",
|
.modalias = "ad7877",
|
||||||
@ -596,7 +569,7 @@ static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
|||||||
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_TWI_KEYPAD) || defined(CONFIG_TWI_KEYPAD_MODULE)
|
#if defined(CONFIG_INPUT_PCF8574) || defined(CONFIG_INPUT_PCF8574_MODULE)
|
||||||
{
|
{
|
||||||
I2C_BOARD_INFO("pcf8574_keypad", 0x27),
|
I2C_BOARD_INFO("pcf8574_keypad", 0x27),
|
||||||
.irq = IRQ_PF8,
|
.irq = IRQ_PF8,
|
||||||
|
@ -292,6 +292,14 @@ static struct platform_device rtc_device = {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
||||||
|
#include <linux/smc91x.h>
|
||||||
|
|
||||||
|
static struct smc91x_platdata smc91x_info = {
|
||||||
|
.flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
|
||||||
|
.leda = RPC_LED_100_10,
|
||||||
|
.ledb = RPC_LED_TX_RX,
|
||||||
|
};
|
||||||
|
|
||||||
static struct resource smc91x_resources[] = {
|
static struct resource smc91x_resources[] = {
|
||||||
{
|
{
|
||||||
.name = "smc91x-regs",
|
.name = "smc91x-regs",
|
||||||
@ -310,6 +318,9 @@ static struct platform_device smc91x_device = {
|
|||||||
.id = 0,
|
.id = 0,
|
||||||
.num_resources = ARRAY_SIZE(smc91x_resources),
|
.num_resources = ARRAY_SIZE(smc91x_resources),
|
||||||
.resource = smc91x_resources,
|
.resource = smc91x_resources,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &smc91x_info,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -501,13 +512,6 @@ static struct bfin5xx_spi_chip ad1836_spi_chip_info = {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE)
|
|
||||||
static struct bfin5xx_spi_chip ad9960_spi_chip_info = {
|
|
||||||
.enable_dma = 0,
|
|
||||||
.bits_per_word = 16,
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
||||||
static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
||||||
.enable_dma = 0,
|
.enable_dma = 0,
|
||||||
@ -515,15 +519,6 @@ static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_PBX)
|
|
||||||
static struct bfin5xx_spi_chip spi_si3xxx_chip_info = {
|
|
||||||
.ctl_reg = 0x4, /* send zero */
|
|
||||||
.enable_dma = 0,
|
|
||||||
.bits_per_word = 8,
|
|
||||||
.cs_change_per_word = 1,
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
|
#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
|
||||||
static struct bfin5xx_spi_chip spi_ad7877_chip_info = {
|
static struct bfin5xx_spi_chip spi_ad7877_chip_info = {
|
||||||
.enable_dma = 0,
|
.enable_dma = 0,
|
||||||
@ -614,22 +609,13 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
|||||||
#if defined(CONFIG_SND_BLACKFIN_AD1836) \
|
#if defined(CONFIG_SND_BLACKFIN_AD1836) \
|
||||||
|| defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
|| defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "ad1836-spi",
|
.modalias = "ad1836",
|
||||||
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
|
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
|
||||||
.bus_num = 0,
|
.bus_num = 0,
|
||||||
.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
||||||
.controller_data = &ad1836_spi_chip_info,
|
.controller_data = &ad1836_spi_chip_info,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE)
|
|
||||||
{
|
|
||||||
.modalias = "ad9960-spi",
|
|
||||||
.max_speed_hz = 10000000, /* max spi clock (SCK) speed in HZ */
|
|
||||||
.bus_num = 0,
|
|
||||||
.chip_select = 1,
|
|
||||||
.controller_data = &ad9960_spi_chip_info,
|
|
||||||
},
|
|
||||||
#endif
|
|
||||||
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "mmc_spi",
|
.modalias = "mmc_spi",
|
||||||
@ -641,24 +627,6 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
|||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_PBX)
|
|
||||||
{
|
|
||||||
.modalias = "fxs-spi",
|
|
||||||
.max_speed_hz = 12500000, /* max spi clock (SCK) speed in HZ */
|
|
||||||
.bus_num = 0,
|
|
||||||
.chip_select = 8 - CONFIG_J11_JUMPER,
|
|
||||||
.controller_data = &spi_si3xxx_chip_info,
|
|
||||||
.mode = SPI_MODE_3,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.modalias = "fxo-spi",
|
|
||||||
.max_speed_hz = 12500000, /* max spi clock (SCK) speed in HZ */
|
|
||||||
.bus_num = 0,
|
|
||||||
.chip_select = 8 - CONFIG_J19_JUMPER,
|
|
||||||
.controller_data = &spi_si3xxx_chip_info,
|
|
||||||
.mode = SPI_MODE_3,
|
|
||||||
},
|
|
||||||
#endif
|
|
||||||
#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
|
#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "ad7877",
|
.modalias = "ad7877",
|
||||||
@ -863,7 +831,7 @@ static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
|||||||
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_TWI_KEYPAD) || defined(CONFIG_TWI_KEYPAD_MODULE)
|
#if defined(CONFIG_INPUT_PCF8574) || defined(CONFIG_INPUT_PCF8574_MODULE)
|
||||||
{
|
{
|
||||||
I2C_BOARD_INFO("pcf8574_keypad", 0x27),
|
I2C_BOARD_INFO("pcf8574_keypad", 0x27),
|
||||||
.irq = IRQ_PF8,
|
.irq = IRQ_PF8,
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* This file should be up to date with:
|
/* This file should be up to date with:
|
||||||
* - Revision C, 03/13/2009; ADSP-BF526 Blackfin Processor Anomaly List
|
* - Revision D, 08/14/2009; ADSP-BF526 Blackfin Processor Anomaly List
|
||||||
* - Revision F, 03/03/2009; ADSP-BF527 Blackfin Processor Anomaly List
|
* - Revision F, 03/03/2009; ADSP-BF527 Blackfin Processor Anomaly List
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -176,7 +176,7 @@
|
|||||||
#define ANOMALY_05000443 (1)
|
#define ANOMALY_05000443 (1)
|
||||||
/* The WURESET Bit in the SYSCR Register is not Functional */
|
/* The WURESET Bit in the SYSCR Register is not Functional */
|
||||||
#define ANOMALY_05000445 (1)
|
#define ANOMALY_05000445 (1)
|
||||||
/* USB DMA Short Packet Data Corruption */
|
/* USB DMA Mode 1 Short Packet Data Corruption */
|
||||||
#define ANOMALY_05000450 (1)
|
#define ANOMALY_05000450 (1)
|
||||||
/* BCODE_QUICKBOOT, BCODE_ALLBOOT, and BCODE_FULLBOOT Settings in SYSCR Register Not Functional */
|
/* BCODE_QUICKBOOT, BCODE_ALLBOOT, and BCODE_FULLBOOT Settings in SYSCR Register Not Functional */
|
||||||
#define ANOMALY_05000451 (1)
|
#define ANOMALY_05000451 (1)
|
||||||
@ -186,12 +186,20 @@
|
|||||||
#define ANOMALY_05000456 (1)
|
#define ANOMALY_05000456 (1)
|
||||||
/* Host DMA Port Responds to Certain Bus Activity Without HOST_CE Assertion */
|
/* Host DMA Port Responds to Certain Bus Activity Without HOST_CE Assertion */
|
||||||
#define ANOMALY_05000457 (1)
|
#define ANOMALY_05000457 (1)
|
||||||
|
/* USB DMA Mode 1 Failure When Multiple USB DMA Channels Are Concurrently Enabled */
|
||||||
|
#define ANOMALY_05000460 (1)
|
||||||
/* False Hardware Error when RETI Points to Invalid Memory */
|
/* False Hardware Error when RETI Points to Invalid Memory */
|
||||||
#define ANOMALY_05000461 (1)
|
#define ANOMALY_05000461 (1)
|
||||||
|
/* Synchronization Problem at Startup May Cause SPORT Transmit Channels to Misalign */
|
||||||
|
#define ANOMALY_05000462 (1)
|
||||||
/* USB Rx DMA hang */
|
/* USB Rx DMA hang */
|
||||||
#define ANOMALY_05000465 (1)
|
#define ANOMALY_05000465 (1)
|
||||||
|
/* TxPktRdy Bit Not Set for Transmit Endpoint When Core and DMA Access USB Endpoint FIFOs Simultaneously */
|
||||||
|
#define ANOMALY_05000466 (1)
|
||||||
/* Possible RX data corruption when control & data EP FIFOs are accessed via the core */
|
/* Possible RX data corruption when control & data EP FIFOs are accessed via the core */
|
||||||
#define ANOMALY_05000467 (1)
|
#define ANOMALY_05000467 (1)
|
||||||
|
/* PLL Latches Incorrect Settings During Reset */
|
||||||
|
#define ANOMALY_05000469 (1)
|
||||||
|
|
||||||
/* Anomalies that don't exist on this proc */
|
/* Anomalies that don't exist on this proc */
|
||||||
#define ANOMALY_05000099 (0)
|
#define ANOMALY_05000099 (0)
|
||||||
@ -238,6 +246,7 @@
|
|||||||
#define ANOMALY_05000362 (1)
|
#define ANOMALY_05000362 (1)
|
||||||
#define ANOMALY_05000363 (0)
|
#define ANOMALY_05000363 (0)
|
||||||
#define ANOMALY_05000400 (0)
|
#define ANOMALY_05000400 (0)
|
||||||
|
#define ANOMALY_05000402 (0)
|
||||||
#define ANOMALY_05000412 (0)
|
#define ANOMALY_05000412 (0)
|
||||||
#define ANOMALY_05000447 (0)
|
#define ANOMALY_05000447 (0)
|
||||||
#define ANOMALY_05000448 (0)
|
#define ANOMALY_05000448 (0)
|
||||||
|
@ -56,11 +56,6 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* UART_IIR Register */
|
|
||||||
#define STATUS(x) ((x << 1) & 0x06)
|
|
||||||
#define STATUS_P1 0x02
|
|
||||||
#define STATUS_P0 0x01
|
|
||||||
|
|
||||||
#define BFIN_UART_NR_PORTS 2
|
#define BFIN_UART_NR_PORTS 2
|
||||||
|
|
||||||
#define OFFSET_THR 0x00 /* Transmit Holding register */
|
#define OFFSET_THR 0x00 /* Transmit Holding register */
|
||||||
@ -76,11 +71,6 @@
|
|||||||
#define OFFSET_SCR 0x1C /* SCR Scratch Register */
|
#define OFFSET_SCR 0x1C /* SCR Scratch Register */
|
||||||
#define OFFSET_GCTL 0x24 /* Global Control Register */
|
#define OFFSET_GCTL 0x24 /* Global Control Register */
|
||||||
|
|
||||||
/* DPMC*/
|
|
||||||
#define bfin_read_STOPCK_OFF() bfin_read_STOPCK()
|
|
||||||
#define bfin_write_STOPCK_OFF(val) bfin_write_STOPCK(val)
|
|
||||||
#define STOPCK_OFF STOPCK
|
|
||||||
|
|
||||||
/* PLL_DIV Masks */
|
/* PLL_DIV Masks */
|
||||||
#define CCLK_DIV1 CSEL_DIV1 /* CCLK = VCO / 1 */
|
#define CCLK_DIV1 CSEL_DIV1 /* CCLK = VCO / 1 */
|
||||||
#define CCLK_DIV2 CSEL_DIV2 /* CCLK = VCO / 2 */
|
#define CCLK_DIV2 CSEL_DIV2 /* CCLK = VCO / 2 */
|
||||||
|
@ -88,6 +88,14 @@ static struct platform_device dm9000_device = {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
||||||
|
#include <linux/smc91x.h>
|
||||||
|
|
||||||
|
static struct smc91x_platdata smc91x_info = {
|
||||||
|
.flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
|
||||||
|
.leda = RPC_LED_100_10,
|
||||||
|
.ledb = RPC_LED_TX_RX,
|
||||||
|
};
|
||||||
|
|
||||||
static struct resource smc91x_resources[] = {
|
static struct resource smc91x_resources[] = {
|
||||||
{
|
{
|
||||||
.name = "smc91x-regs",
|
.name = "smc91x-regs",
|
||||||
@ -110,6 +118,9 @@ static struct platform_device smc91x_device = {
|
|||||||
.id = 0,
|
.id = 0,
|
||||||
.num_resources = ARRAY_SIZE(smc91x_resources),
|
.num_resources = ARRAY_SIZE(smc91x_resources),
|
||||||
.resource = smc91x_resources,
|
.resource = smc91x_resources,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &smc91x_info,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -190,15 +201,6 @@ static struct bfin5xx_spi_chip ad1836_spi_chip_info = {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_PBX)
|
|
||||||
static struct bfin5xx_spi_chip spi_si3xxx_chip_info = {
|
|
||||||
.ctl_reg = 0x1c04,
|
|
||||||
.enable_dma = 0,
|
|
||||||
.bits_per_word = 8,
|
|
||||||
.cs_change_per_word = 1,
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Notice: for blackfin, the speed_hz is the value of register
|
/* Notice: for blackfin, the speed_hz is the value of register
|
||||||
* SPI_BAUD, not the real baudrate */
|
* SPI_BAUD, not the real baudrate */
|
||||||
static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
||||||
@ -229,7 +231,7 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
|||||||
|
|
||||||
#if defined(CONFIG_SND_BLACKFIN_AD1836) || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
#if defined(CONFIG_SND_BLACKFIN_AD1836) || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "ad1836-spi",
|
.modalias = "ad1836",
|
||||||
.max_speed_hz = 16,
|
.max_speed_hz = 16,
|
||||||
.bus_num = 1,
|
.bus_num = 1,
|
||||||
.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
||||||
@ -237,23 +239,6 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
|||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_PBX)
|
|
||||||
{
|
|
||||||
.modalias = "fxs-spi",
|
|
||||||
.max_speed_hz = 4,
|
|
||||||
.bus_num = 1,
|
|
||||||
.chip_select = 3,
|
|
||||||
.controller_data = &spi_si3xxx_chip_info,
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
.modalias = "fxo-spi",
|
|
||||||
.max_speed_hz = 4,
|
|
||||||
.bus_num = 1,
|
|
||||||
.chip_select = 2,
|
|
||||||
.controller_data = &spi_si3xxx_chip_info,
|
|
||||||
},
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* SPI (0) */
|
/* SPI (0) */
|
||||||
|
@ -48,6 +48,14 @@ static struct platform_device rtc_device = {
|
|||||||
* Driver needs to know address, irq and flag pin.
|
* Driver needs to know address, irq and flag pin.
|
||||||
*/
|
*/
|
||||||
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
||||||
|
#include <linux/smc91x.h>
|
||||||
|
|
||||||
|
static struct smc91x_platdata smc91x_info = {
|
||||||
|
.flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
|
||||||
|
.leda = RPC_LED_100_10,
|
||||||
|
.ledb = RPC_LED_TX_RX,
|
||||||
|
};
|
||||||
|
|
||||||
static struct resource smc91x_resources[] = {
|
static struct resource smc91x_resources[] = {
|
||||||
{
|
{
|
||||||
.name = "smc91x-regs",
|
.name = "smc91x-regs",
|
||||||
@ -66,6 +74,9 @@ static struct platform_device smc91x_device = {
|
|||||||
.id = 0,
|
.id = 0,
|
||||||
.num_resources = ARRAY_SIZE(smc91x_resources),
|
.num_resources = ARRAY_SIZE(smc91x_resources),
|
||||||
.resource = smc91x_resources,
|
.resource = smc91x_resources,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &smc91x_info,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -31,8 +31,10 @@
|
|||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/mtd/mtd.h>
|
#include <linux/mtd/mtd.h>
|
||||||
#include <linux/mtd/partitions.h>
|
#include <linux/mtd/partitions.h>
|
||||||
|
#include <linux/mtd/physmap.h>
|
||||||
#include <linux/spi/spi.h>
|
#include <linux/spi/spi.h>
|
||||||
#include <linux/spi/flash.h>
|
#include <linux/spi/flash.h>
|
||||||
|
#include <linux/spi/mmc_spi.h>
|
||||||
#if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
|
#if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
|
||||||
#include <linux/usb/isp1362.h>
|
#include <linux/usb/isp1362.h>
|
||||||
#endif
|
#endif
|
||||||
@ -130,7 +132,7 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
|||||||
|
|
||||||
#if defined(CONFIG_SND_BLACKFIN_AD1836) || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
#if defined(CONFIG_SND_BLACKFIN_AD1836) || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "ad1836-spi",
|
.modalias = "ad1836",
|
||||||
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
|
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
|
||||||
.bus_num = 0,
|
.bus_num = 0,
|
||||||
.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
||||||
@ -141,9 +143,9 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
|||||||
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "mmc_spi",
|
.modalias = "mmc_spi",
|
||||||
.max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
|
.max_speed_hz = 20000000, /* max spi clock (SCK) speed in HZ */
|
||||||
.bus_num = 0,
|
.bus_num = 0,
|
||||||
.chip_select = 5,
|
.chip_select = 1,
|
||||||
.controller_data = &mmc_spi_chip_info,
|
.controller_data = &mmc_spi_chip_info,
|
||||||
.mode = SPI_MODE_3,
|
.mode = SPI_MODE_3,
|
||||||
},
|
},
|
||||||
@ -195,6 +197,14 @@ static struct platform_device rtc_device = {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
||||||
|
#include <linux/smc91x.h>
|
||||||
|
|
||||||
|
static struct smc91x_platdata smc91x_info = {
|
||||||
|
.flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
|
||||||
|
.leda = RPC_LED_100_10,
|
||||||
|
.ledb = RPC_LED_TX_RX,
|
||||||
|
};
|
||||||
|
|
||||||
static struct resource smc91x_resources[] = {
|
static struct resource smc91x_resources[] = {
|
||||||
{
|
{
|
||||||
.start = 0x20200300,
|
.start = 0x20200300,
|
||||||
@ -211,6 +221,43 @@ static struct platform_device smc91x_device = {
|
|||||||
.id = 0,
|
.id = 0,
|
||||||
.num_resources = ARRAY_SIZE(smc91x_resources),
|
.num_resources = ARRAY_SIZE(smc91x_resources),
|
||||||
.resource = smc91x_resources,
|
.resource = smc91x_resources,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &smc91x_info,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
|
||||||
|
#include <linux/smsc911x.h>
|
||||||
|
|
||||||
|
static struct resource smsc911x_resources[] = {
|
||||||
|
{
|
||||||
|
.name = "smsc911x-memory",
|
||||||
|
.start = 0x20308000,
|
||||||
|
.end = 0x20308000 + 0xFF,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
}, {
|
||||||
|
.start = IRQ_PF8,
|
||||||
|
.end = IRQ_PF8,
|
||||||
|
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct smsc911x_platform_config smsc911x_config = {
|
||||||
|
.flags = SMSC911X_USE_16BIT,
|
||||||
|
.irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
|
||||||
|
.irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN,
|
||||||
|
.phy_interface = PHY_INTERFACE_MODE_MII,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device smsc911x_device = {
|
||||||
|
.name = "smsc911x",
|
||||||
|
.id = 0,
|
||||||
|
.num_resources = ARRAY_SIZE(smsc911x_resources),
|
||||||
|
.resource = smsc911x_resources,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &smsc911x_config,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -324,6 +371,68 @@ static struct platform_device isp1362_hcd_device = {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE)
|
||||||
|
static struct resource net2272_bfin_resources[] = {
|
||||||
|
{
|
||||||
|
.start = 0x20300000,
|
||||||
|
.end = 0x20300000 + 0x100,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
}, {
|
||||||
|
.start = IRQ_PF6,
|
||||||
|
.end = IRQ_PF6,
|
||||||
|
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device net2272_bfin_device = {
|
||||||
|
.name = "net2272",
|
||||||
|
.id = -1,
|
||||||
|
.num_resources = ARRAY_SIZE(net2272_bfin_resources),
|
||||||
|
.resource = net2272_bfin_resources,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
|
||||||
|
static struct mtd_partition para_partitions[] = {
|
||||||
|
{
|
||||||
|
.name = "bootloader(nor)",
|
||||||
|
.size = 0x40000,
|
||||||
|
.offset = 0,
|
||||||
|
}, {
|
||||||
|
.name = "linux+rootfs(nor)",
|
||||||
|
.size = MTDPART_SIZ_FULL,
|
||||||
|
.offset = MTDPART_OFS_APPEND,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct physmap_flash_data para_flash_data = {
|
||||||
|
.width = 2,
|
||||||
|
.parts = para_partitions,
|
||||||
|
.nr_parts = ARRAY_SIZE(para_partitions),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct resource para_flash_resource = {
|
||||||
|
.start = 0x20000000,
|
||||||
|
.end = 0x201fffff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device para_flash_device = {
|
||||||
|
.name = "physmap-flash",
|
||||||
|
.id = 0,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = ¶_flash_data,
|
||||||
|
},
|
||||||
|
.num_resources = 1,
|
||||||
|
.resource = ¶_flash_resource,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static const unsigned int cclk_vlev_datasheet[] =
|
static const unsigned int cclk_vlev_datasheet[] =
|
||||||
{
|
{
|
||||||
VRPAIR(VLEV_085, 250000000),
|
VRPAIR(VLEV_085, 250000000),
|
||||||
@ -382,10 +491,22 @@ static struct platform_device *cm_bf533_devices[] __initdata = {
|
|||||||
&smc91x_device,
|
&smc91x_device,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
|
||||||
|
&smsc911x_device,
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE)
|
||||||
|
&net2272_bfin_device,
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
||||||
&bfin_spi0_device,
|
&bfin_spi0_device,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
|
||||||
|
¶_flash_device,
|
||||||
|
#endif
|
||||||
|
|
||||||
&bfin_gpios_device,
|
&bfin_gpios_device,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -67,6 +67,14 @@ static struct platform_device bfin_fb_adv7393_device = {
|
|||||||
* Driver needs to know address, irq and flag pin.
|
* Driver needs to know address, irq and flag pin.
|
||||||
*/
|
*/
|
||||||
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
||||||
|
#include <linux/smc91x.h>
|
||||||
|
|
||||||
|
static struct smc91x_platdata smc91x_info = {
|
||||||
|
.flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
|
||||||
|
.leda = RPC_LED_100_10,
|
||||||
|
.ledb = RPC_LED_TX_RX,
|
||||||
|
};
|
||||||
|
|
||||||
static struct resource smc91x_resources[] = {
|
static struct resource smc91x_resources[] = {
|
||||||
{
|
{
|
||||||
.name = "smc91x-regs",
|
.name = "smc91x-regs",
|
||||||
@ -84,6 +92,9 @@ static struct platform_device smc91x_device = {
|
|||||||
.id = 0,
|
.id = 0,
|
||||||
.num_resources = ARRAY_SIZE(smc91x_resources),
|
.num_resources = ARRAY_SIZE(smc91x_resources),
|
||||||
.resource = smc91x_resources,
|
.resource = smc91x_resources,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &smc91x_info,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -263,7 +274,7 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
|||||||
|
|
||||||
#if defined(CONFIG_SND_BLACKFIN_AD1836) || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
#if defined(CONFIG_SND_BLACKFIN_AD1836) || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "ad1836-spi",
|
.modalias = "ad1836",
|
||||||
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
|
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
|
||||||
.bus_num = 0,
|
.bus_num = 0,
|
||||||
.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
#include <linux/mtd/physmap.h>
|
#include <linux/mtd/physmap.h>
|
||||||
#include <linux/spi/spi.h>
|
#include <linux/spi/spi.h>
|
||||||
#include <linux/spi/flash.h>
|
#include <linux/spi/flash.h>
|
||||||
|
#include <linux/spi/mmc_spi.h>
|
||||||
#if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
|
#if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
|
||||||
#include <linux/usb/isp1362.h>
|
#include <linux/usb/isp1362.h>
|
||||||
#endif
|
#endif
|
||||||
@ -62,6 +63,14 @@ static struct platform_device rtc_device = {
|
|||||||
* Driver needs to know address, irq and flag pin.
|
* Driver needs to know address, irq and flag pin.
|
||||||
*/
|
*/
|
||||||
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
||||||
|
#include <linux/smc91x.h>
|
||||||
|
|
||||||
|
static struct smc91x_platdata smc91x_info = {
|
||||||
|
.flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
|
||||||
|
.leda = RPC_LED_100_10,
|
||||||
|
.ledb = RPC_LED_TX_RX,
|
||||||
|
};
|
||||||
|
|
||||||
static struct resource smc91x_resources[] = {
|
static struct resource smc91x_resources[] = {
|
||||||
{
|
{
|
||||||
.name = "smc91x-regs",
|
.name = "smc91x-regs",
|
||||||
@ -80,6 +89,9 @@ static struct platform_device smc91x_device = {
|
|||||||
.id = 0,
|
.id = 0,
|
||||||
.num_resources = ARRAY_SIZE(smc91x_resources),
|
.num_resources = ARRAY_SIZE(smc91x_resources),
|
||||||
.resource = smc91x_resources,
|
.resource = smc91x_resources,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &smc91x_info,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -207,15 +219,6 @@ static struct bfin5xx_spi_chip ad1836_spi_chip_info = {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_PBX)
|
|
||||||
static struct bfin5xx_spi_chip spi_si3xxx_chip_info = {
|
|
||||||
.ctl_reg = 0x4, /* send zero */
|
|
||||||
.enable_dma = 0,
|
|
||||||
.bits_per_word = 8,
|
|
||||||
.cs_change_per_word = 1,
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE)
|
#if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE)
|
||||||
static struct bfin5xx_spi_chip spidev_chip_info = {
|
static struct bfin5xx_spi_chip spidev_chip_info = {
|
||||||
.enable_dma = 0,
|
.enable_dma = 0,
|
||||||
@ -223,6 +226,34 @@ static struct bfin5xx_spi_chip spidev_chip_info = {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
||||||
|
#define MMC_SPI_CARD_DETECT_INT IRQ_PF5
|
||||||
|
static int bfin_mmc_spi_init(struct device *dev,
|
||||||
|
irqreturn_t (*detect_int)(int, void *), void *data)
|
||||||
|
{
|
||||||
|
return request_irq(MMC_SPI_CARD_DETECT_INT, detect_int,
|
||||||
|
IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
|
||||||
|
"mmc-spi-detect", data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void bfin_mmc_spi_exit(struct device *dev, void *data)
|
||||||
|
{
|
||||||
|
free_irq(MMC_SPI_CARD_DETECT_INT, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct mmc_spi_platform_data bfin_mmc_spi_pdata = {
|
||||||
|
.init = bfin_mmc_spi_init,
|
||||||
|
.exit = bfin_mmc_spi_exit,
|
||||||
|
.detect_delay = 100, /* msecs */
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
||||||
|
.enable_dma = 0,
|
||||||
|
.bits_per_word = 8,
|
||||||
|
.pio_interrupt = 0,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
||||||
#if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE)
|
#if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE)
|
||||||
{
|
{
|
||||||
@ -250,33 +281,14 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
|||||||
|
|
||||||
#if defined(CONFIG_SND_BLACKFIN_AD1836) || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
#if defined(CONFIG_SND_BLACKFIN_AD1836) || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "ad1836-spi",
|
.modalias = "ad1836",
|
||||||
.max_speed_hz = 31250000, /* max spi clock (SCK) speed in HZ */
|
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
|
||||||
.bus_num = 0,
|
.bus_num = 0,
|
||||||
.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
||||||
.controller_data = &ad1836_spi_chip_info,
|
.controller_data = &ad1836_spi_chip_info,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_PBX)
|
|
||||||
{
|
|
||||||
.modalias = "fxs-spi",
|
|
||||||
.max_speed_hz = 12500000, /* max spi clock (SCK) speed in HZ */
|
|
||||||
.bus_num = 0,
|
|
||||||
.chip_select = 8 - CONFIG_J11_JUMPER,
|
|
||||||
.controller_data = &spi_si3xxx_chip_info,
|
|
||||||
.mode = SPI_MODE_3,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.modalias = "fxo-spi",
|
|
||||||
.max_speed_hz = 12500000, /* max spi clock (SCK) speed in HZ */
|
|
||||||
.bus_num = 0,
|
|
||||||
.chip_select = 8 - CONFIG_J19_JUMPER,
|
|
||||||
.controller_data = &spi_si3xxx_chip_info,
|
|
||||||
.mode = SPI_MODE_3,
|
|
||||||
},
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE)
|
#if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "spidev",
|
.modalias = "spidev",
|
||||||
@ -286,6 +298,17 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
|||||||
.controller_data = &spidev_chip_info,
|
.controller_data = &spidev_chip_info,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
||||||
|
{
|
||||||
|
.modalias = "mmc_spi",
|
||||||
|
.max_speed_hz = 20000000, /* max spi clock (SCK) speed in HZ */
|
||||||
|
.bus_num = 0,
|
||||||
|
.chip_select = 4,
|
||||||
|
.platform_data = &bfin_mmc_spi_pdata,
|
||||||
|
.controller_data = &mmc_spi_chip_info,
|
||||||
|
.mode = SPI_MODE_3,
|
||||||
|
},
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
||||||
@ -458,7 +481,7 @@ static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
|||||||
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_TWI_KEYPAD) || defined(CONFIG_TWI_KEYPAD_MODULE)
|
#if defined(CONFIG_INPUT_PCF8574) || defined(CONFIG_INPUT_PCF8574_MODULE)
|
||||||
{
|
{
|
||||||
I2C_BOARD_INFO("pcf8574_keypad", 0x27),
|
I2C_BOARD_INFO("pcf8574_keypad", 0x27),
|
||||||
.irq = 39,
|
.irq = 39,
|
||||||
|
@ -76,12 +76,12 @@ int channel2irq(unsigned int channel)
|
|||||||
ret_irq = IRQ_SPI;
|
ret_irq = IRQ_SPI;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CH_UART_RX:
|
case CH_UART0_RX:
|
||||||
ret_irq = IRQ_UART_RX;
|
ret_irq = IRQ_UART0_RX;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CH_UART_TX:
|
case CH_UART0_TX:
|
||||||
ret_irq = IRQ_UART_TX;
|
ret_irq = IRQ_UART0_TX;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CH_MEM_STREAM0_SRC:
|
case CH_MEM_STREAM0_SRC:
|
||||||
|
@ -131,11 +131,11 @@ struct bfin_serial_res {
|
|||||||
struct bfin_serial_res bfin_serial_resource[] = {
|
struct bfin_serial_res bfin_serial_resource[] = {
|
||||||
{
|
{
|
||||||
0xFFC00400,
|
0xFFC00400,
|
||||||
IRQ_UART_RX,
|
IRQ_UART0_RX,
|
||||||
IRQ_UART_ERROR,
|
IRQ_UART0_ERROR,
|
||||||
#ifdef CONFIG_SERIAL_BFIN_DMA
|
#ifdef CONFIG_SERIAL_BFIN_DMA
|
||||||
CH_UART_TX,
|
CH_UART0_TX,
|
||||||
CH_UART_RX,
|
CH_UART0_RX,
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_SERIAL_BFIN_CTSRTS
|
#ifdef CONFIG_SERIAL_BFIN_CTSRTS
|
||||||
CONFIG_UART0_CTS_PIN,
|
CONFIG_UART0_CTS_PIN,
|
||||||
|
@ -43,13 +43,6 @@
|
|||||||
|
|
||||||
#define BFIN_UART_NR_PORTS 1
|
#define BFIN_UART_NR_PORTS 1
|
||||||
|
|
||||||
#define CH_UART_RX CH_UART0_RX
|
|
||||||
#define CH_UART_TX CH_UART0_TX
|
|
||||||
|
|
||||||
#define IRQ_UART_ERROR IRQ_UART0_ERROR
|
|
||||||
#define IRQ_UART_RX IRQ_UART0_RX
|
|
||||||
#define IRQ_UART_TX IRQ_UART0_TX
|
|
||||||
|
|
||||||
#define OFFSET_THR 0x00 /* Transmit Holding register */
|
#define OFFSET_THR 0x00 /* Transmit Holding register */
|
||||||
#define OFFSET_RBR 0x00 /* Receive Buffer register */
|
#define OFFSET_RBR 0x00 /* Receive Buffer register */
|
||||||
#define OFFSET_DLL 0x00 /* Divisor Latch (Low-Byte) */
|
#define OFFSET_DLL 0x00 /* Divisor Latch (Low-Byte) */
|
||||||
|
@ -9,11 +9,17 @@ config BFIN537_STAMP
|
|||||||
help
|
help
|
||||||
BF537-STAMP board support.
|
BF537-STAMP board support.
|
||||||
|
|
||||||
config BFIN537_BLUETECHNIX_CM
|
config BFIN537_BLUETECHNIX_CM_E
|
||||||
bool "Bluetechnix CM-BF537"
|
bool "Bluetechnix CM-BF537E"
|
||||||
depends on (BF537)
|
depends on (BF537)
|
||||||
help
|
help
|
||||||
CM-BF537 support for EVAL- and DEV-Board.
|
CM-BF537E support for EVAL- and DEV-Board.
|
||||||
|
|
||||||
|
config BFIN537_BLUETECHNIX_CM_U
|
||||||
|
bool "Bluetechnix CM-BF537U"
|
||||||
|
depends on (BF537)
|
||||||
|
help
|
||||||
|
CM-BF537U support for EVAL- and DEV-Board.
|
||||||
|
|
||||||
config BFIN537_BLUETECHNIX_TCM
|
config BFIN537_BLUETECHNIX_TCM
|
||||||
bool "Bluetechnix TCM-BF537"
|
bool "Bluetechnix TCM-BF537"
|
||||||
|
@ -3,7 +3,8 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
obj-$(CONFIG_BFIN537_STAMP) += stamp.o
|
obj-$(CONFIG_BFIN537_STAMP) += stamp.o
|
||||||
obj-$(CONFIG_BFIN537_BLUETECHNIX_CM) += cm_bf537.o
|
obj-$(CONFIG_BFIN537_BLUETECHNIX_CM_E) += cm_bf537e.o
|
||||||
|
obj-$(CONFIG_BFIN537_BLUETECHNIX_CM_U) += cm_bf537u.o
|
||||||
obj-$(CONFIG_BFIN537_BLUETECHNIX_TCM) += tcm_bf537.o
|
obj-$(CONFIG_BFIN537_BLUETECHNIX_TCM) += tcm_bf537.o
|
||||||
obj-$(CONFIG_PNAV10) += pnav10.o
|
obj-$(CONFIG_PNAV10) += pnav10.o
|
||||||
obj-$(CONFIG_CAMSIG_MINOTAUR) += minotaur.o
|
obj-$(CONFIG_CAMSIG_MINOTAUR) += minotaur.o
|
||||||
|
727
arch/blackfin/mach-bf537/boards/cm_bf537e.c
Normal file
727
arch/blackfin/mach-bf537/boards/cm_bf537e.c
Normal file
@ -0,0 +1,727 @@
|
|||||||
|
/*
|
||||||
|
* File: arch/blackfin/mach-bf537/boards/cm_bf537.c
|
||||||
|
* Based on: arch/blackfin/mach-bf533/boards/ezkit.c
|
||||||
|
* Author: Aidan Williams <aidan@nicta.com.au>
|
||||||
|
*
|
||||||
|
* Created: 2005
|
||||||
|
* Description: Board description file
|
||||||
|
*
|
||||||
|
* Modified:
|
||||||
|
* Copyright 2005 National ICT Australia (NICTA)
|
||||||
|
* Copyright 2004-2006 Analog Devices Inc.
|
||||||
|
*
|
||||||
|
* Bugs: Enter bugs at http://blackfin.uclinux.org/
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, see the file COPYING, or write
|
||||||
|
* to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/device.h>
|
||||||
|
#include <linux/etherdevice.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/mtd/mtd.h>
|
||||||
|
#include <linux/mtd/partitions.h>
|
||||||
|
#include <linux/mtd/physmap.h>
|
||||||
|
#include <linux/spi/spi.h>
|
||||||
|
#include <linux/spi/flash.h>
|
||||||
|
#if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
|
||||||
|
#include <linux/usb/isp1362.h>
|
||||||
|
#endif
|
||||||
|
#include <linux/ata_platform.h>
|
||||||
|
#include <linux/irq.h>
|
||||||
|
#include <asm/dma.h>
|
||||||
|
#include <asm/bfin5xx_spi.h>
|
||||||
|
#include <asm/portmux.h>
|
||||||
|
#include <asm/dpmc.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name the Board for the /proc/cpuinfo
|
||||||
|
*/
|
||||||
|
const char bfin_board_name[] = "Bluetechnix CM BF537E";
|
||||||
|
|
||||||
|
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
||||||
|
/* all SPI peripherals info goes here */
|
||||||
|
|
||||||
|
#if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE)
|
||||||
|
static struct mtd_partition bfin_spi_flash_partitions[] = {
|
||||||
|
{
|
||||||
|
.name = "bootloader(spi)",
|
||||||
|
.size = 0x00020000,
|
||||||
|
.offset = 0,
|
||||||
|
.mask_flags = MTD_CAP_ROM
|
||||||
|
}, {
|
||||||
|
.name = "linux kernel(spi)",
|
||||||
|
.size = 0xe0000,
|
||||||
|
.offset = 0x20000
|
||||||
|
}, {
|
||||||
|
.name = "file system(spi)",
|
||||||
|
.size = 0x700000,
|
||||||
|
.offset = 0x00100000,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct flash_platform_data bfin_spi_flash_data = {
|
||||||
|
.name = "m25p80",
|
||||||
|
.parts = bfin_spi_flash_partitions,
|
||||||
|
.nr_parts = ARRAY_SIZE(bfin_spi_flash_partitions),
|
||||||
|
.type = "m25p64",
|
||||||
|
};
|
||||||
|
|
||||||
|
/* SPI flash chip (m25p64) */
|
||||||
|
static struct bfin5xx_spi_chip spi_flash_chip_info = {
|
||||||
|
.enable_dma = 0, /* use dma transfer with this chip*/
|
||||||
|
.bits_per_word = 8,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_BFIN_SPI_ADC) || defined(CONFIG_BFIN_SPI_ADC_MODULE)
|
||||||
|
/* SPI ADC chip */
|
||||||
|
static struct bfin5xx_spi_chip spi_adc_chip_info = {
|
||||||
|
.enable_dma = 1, /* use dma transfer with this chip*/
|
||||||
|
.bits_per_word = 16,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_SND_BLACKFIN_AD1836) || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
||||||
|
static struct bfin5xx_spi_chip ad1836_spi_chip_info = {
|
||||||
|
.enable_dma = 0,
|
||||||
|
.bits_per_word = 16,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
||||||
|
static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
||||||
|
.enable_dma = 0,
|
||||||
|
.bits_per_word = 8,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
||||||
|
#if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE)
|
||||||
|
{
|
||||||
|
/* the modalias must be the same as spi device driver name */
|
||||||
|
.modalias = "m25p80", /* Name of spi_driver for this device */
|
||||||
|
.max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
|
||||||
|
.bus_num = 0, /* Framework bus number */
|
||||||
|
.chip_select = 1, /* Framework chip select. On STAMP537 it is SPISSEL1*/
|
||||||
|
.platform_data = &bfin_spi_flash_data,
|
||||||
|
.controller_data = &spi_flash_chip_info,
|
||||||
|
.mode = SPI_MODE_3,
|
||||||
|
},
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_BFIN_SPI_ADC) || defined(CONFIG_BFIN_SPI_ADC_MODULE)
|
||||||
|
{
|
||||||
|
.modalias = "bfin_spi_adc", /* Name of spi_driver for this device */
|
||||||
|
.max_speed_hz = 6250000, /* max spi clock (SCK) speed in HZ */
|
||||||
|
.bus_num = 0, /* Framework bus number */
|
||||||
|
.chip_select = 1, /* Framework chip select. */
|
||||||
|
.platform_data = NULL, /* No spi_driver specific config */
|
||||||
|
.controller_data = &spi_adc_chip_info,
|
||||||
|
},
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_SND_BLACKFIN_AD1836) || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
||||||
|
{
|
||||||
|
.modalias = "ad1836",
|
||||||
|
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
|
||||||
|
.bus_num = 0,
|
||||||
|
.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
||||||
|
.controller_data = &ad1836_spi_chip_info,
|
||||||
|
},
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
||||||
|
{
|
||||||
|
.modalias = "mmc_spi",
|
||||||
|
.max_speed_hz = 20000000, /* max spi clock (SCK) speed in HZ */
|
||||||
|
.bus_num = 0,
|
||||||
|
.chip_select = 1,
|
||||||
|
.controller_data = &mmc_spi_chip_info,
|
||||||
|
.mode = SPI_MODE_3,
|
||||||
|
},
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
/* SPI (0) */
|
||||||
|
static struct resource bfin_spi0_resource[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = SPI0_REGBASE,
|
||||||
|
.end = SPI0_REGBASE + 0xFF,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = CH_SPI,
|
||||||
|
.end = CH_SPI,
|
||||||
|
.flags = IORESOURCE_DMA,
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
|
.start = IRQ_SPI,
|
||||||
|
.end = IRQ_SPI,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
/* SPI controller data */
|
||||||
|
static struct bfin5xx_spi_master bfin_spi0_info = {
|
||||||
|
.num_chipselect = 8,
|
||||||
|
.enable_dma = 1, /* master has the ability to do dma transfer */
|
||||||
|
.pin_req = {P_SPI0_SCK, P_SPI0_MISO, P_SPI0_MOSI, 0},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device bfin_spi0_device = {
|
||||||
|
.name = "bfin-spi",
|
||||||
|
.id = 0, /* Bus number */
|
||||||
|
.num_resources = ARRAY_SIZE(bfin_spi0_resource),
|
||||||
|
.resource = bfin_spi0_resource,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &bfin_spi0_info, /* Passed to driver */
|
||||||
|
},
|
||||||
|
};
|
||||||
|
#endif /* spi master and devices */
|
||||||
|
|
||||||
|
#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
|
||||||
|
static struct platform_device rtc_device = {
|
||||||
|
.name = "rtc-bfin",
|
||||||
|
.id = -1,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_FB_HITACHI_TX09) || defined(CONFIG_FB_HITACHI_TX09_MODULE)
|
||||||
|
static struct platform_device hitachi_fb_device = {
|
||||||
|
.name = "hitachi-tx09",
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
||||||
|
#include <linux/smc91x.h>
|
||||||
|
|
||||||
|
static struct smc91x_platdata smc91x_info = {
|
||||||
|
.flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
|
||||||
|
.leda = RPC_LED_100_10,
|
||||||
|
.ledb = RPC_LED_TX_RX,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct resource smc91x_resources[] = {
|
||||||
|
{
|
||||||
|
.start = 0x20200300,
|
||||||
|
.end = 0x20200300 + 16,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
}, {
|
||||||
|
.start = IRQ_PF14,
|
||||||
|
.end = IRQ_PF14,
|
||||||
|
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device smc91x_device = {
|
||||||
|
.name = "smc91x",
|
||||||
|
.id = 0,
|
||||||
|
.num_resources = ARRAY_SIZE(smc91x_resources),
|
||||||
|
.resource = smc91x_resources,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &smc91x_info,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
|
||||||
|
static struct resource isp1362_hcd_resources[] = {
|
||||||
|
{
|
||||||
|
.start = 0x20308000,
|
||||||
|
.end = 0x20308000,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
}, {
|
||||||
|
.start = 0x20308004,
|
||||||
|
.end = 0x20308004,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
}, {
|
||||||
|
.start = IRQ_PG15,
|
||||||
|
.end = IRQ_PG15,
|
||||||
|
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct isp1362_platform_data isp1362_priv = {
|
||||||
|
.sel15Kres = 1,
|
||||||
|
.clknotstop = 0,
|
||||||
|
.oc_enable = 0,
|
||||||
|
.int_act_high = 0,
|
||||||
|
.int_edge_triggered = 0,
|
||||||
|
.remote_wakeup_connected = 0,
|
||||||
|
.no_power_switching = 1,
|
||||||
|
.power_switching_mode = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device isp1362_hcd_device = {
|
||||||
|
.name = "isp1362-hcd",
|
||||||
|
.id = 0,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &isp1362_priv,
|
||||||
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(isp1362_hcd_resources),
|
||||||
|
.resource = isp1362_hcd_resources,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE)
|
||||||
|
static struct resource net2272_bfin_resources[] = {
|
||||||
|
{
|
||||||
|
.start = 0x20300000,
|
||||||
|
.end = 0x20300000 + 0x100,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
}, {
|
||||||
|
.start = IRQ_PG13,
|
||||||
|
.end = IRQ_PG13,
|
||||||
|
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device net2272_bfin_device = {
|
||||||
|
.name = "net2272",
|
||||||
|
.id = -1,
|
||||||
|
.num_resources = ARRAY_SIZE(net2272_bfin_resources),
|
||||||
|
.resource = net2272_bfin_resources,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static struct resource bfin_gpios_resources = {
|
||||||
|
.start = 0,
|
||||||
|
.end = MAX_BLACKFIN_GPIOS - 1,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device bfin_gpios_device = {
|
||||||
|
.name = "simple-gpio",
|
||||||
|
.id = -1,
|
||||||
|
.num_resources = 1,
|
||||||
|
.resource = &bfin_gpios_resources,
|
||||||
|
};
|
||||||
|
|
||||||
|
#if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE)
|
||||||
|
static struct mtd_partition cm_partitions[] = {
|
||||||
|
{
|
||||||
|
.name = "bootloader(nor)",
|
||||||
|
.size = 0x40000,
|
||||||
|
.offset = 0,
|
||||||
|
}, {
|
||||||
|
.name = "linux kernel(nor)",
|
||||||
|
.size = 0x100000,
|
||||||
|
.offset = MTDPART_OFS_APPEND,
|
||||||
|
}, {
|
||||||
|
.name = "file system(nor)",
|
||||||
|
.size = MTDPART_SIZ_FULL,
|
||||||
|
.offset = MTDPART_OFS_APPEND,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct physmap_flash_data cm_flash_data = {
|
||||||
|
.width = 2,
|
||||||
|
.parts = cm_partitions,
|
||||||
|
.nr_parts = ARRAY_SIZE(cm_partitions),
|
||||||
|
};
|
||||||
|
|
||||||
|
static unsigned cm_flash_gpios[] = { GPIO_PF4 };
|
||||||
|
|
||||||
|
static struct resource cm_flash_resource[] = {
|
||||||
|
{
|
||||||
|
.name = "cfi_probe",
|
||||||
|
.start = 0x20000000,
|
||||||
|
.end = 0x201fffff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
}, {
|
||||||
|
.start = (unsigned long)cm_flash_gpios,
|
||||||
|
.end = ARRAY_SIZE(cm_flash_gpios),
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device cm_flash_device = {
|
||||||
|
.name = "gpio-addr-flash",
|
||||||
|
.id = 0,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &cm_flash_data,
|
||||||
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(cm_flash_resource),
|
||||||
|
.resource = cm_flash_resource,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE)
|
||||||
|
#ifdef CONFIG_SERIAL_BFIN_UART0
|
||||||
|
static struct resource bfin_uart0_resources[] = {
|
||||||
|
{
|
||||||
|
.start = 0xFFC00400,
|
||||||
|
.end = 0xFFC004FF,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_UART0_RX,
|
||||||
|
.end = IRQ_UART0_RX+1,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_UART0_ERROR,
|
||||||
|
.end = IRQ_UART0_ERROR,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = CH_UART0_TX,
|
||||||
|
.end = CH_UART0_TX,
|
||||||
|
.flags = IORESOURCE_DMA,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = CH_UART0_RX,
|
||||||
|
.end = CH_UART0_RX,
|
||||||
|
.flags = IORESOURCE_DMA,
|
||||||
|
},
|
||||||
|
#ifdef CONFIG_BFIN_UART0_CTSRTS
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Refer to arch/blackfin/mach-xxx/include/mach/gpio.h for the GPIO map.
|
||||||
|
*/
|
||||||
|
.start = -1,
|
||||||
|
.end = -1,
|
||||||
|
.flags = IORESOURCE_IO,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Refer to arch/blackfin/mach-xxx/include/mach/gpio.h for the GPIO map.
|
||||||
|
*/
|
||||||
|
.start = -1,
|
||||||
|
.end = -1,
|
||||||
|
.flags = IORESOURCE_IO,
|
||||||
|
},
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device bfin_uart0_device = {
|
||||||
|
.name = "bfin-uart",
|
||||||
|
.id = 0,
|
||||||
|
.num_resources = ARRAY_SIZE(bfin_uart0_resources),
|
||||||
|
.resource = bfin_uart0_resources,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_SERIAL_BFIN_UART1
|
||||||
|
static struct resource bfin_uart1_resources[] = {
|
||||||
|
{
|
||||||
|
.start = 0xFFC02000,
|
||||||
|
.end = 0xFFC020FF,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_UART1_RX,
|
||||||
|
.end = IRQ_UART1_RX+1,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_UART1_ERROR,
|
||||||
|
.end = IRQ_UART1_ERROR,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = CH_UART1_TX,
|
||||||
|
.end = CH_UART1_TX,
|
||||||
|
.flags = IORESOURCE_DMA,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = CH_UART1_RX,
|
||||||
|
.end = CH_UART1_RX,
|
||||||
|
.flags = IORESOURCE_DMA,
|
||||||
|
},
|
||||||
|
#ifdef CONFIG_BFIN_UART1_CTSRTS
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Refer to arch/blackfin/mach-xxx/include/mach/gpio.h for the GPIO map.
|
||||||
|
*/
|
||||||
|
.start = -1,
|
||||||
|
.end = -1,
|
||||||
|
.flags = IORESOURCE_IO,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Refer to arch/blackfin/mach-xxx/include/mach/gpio.h for the GPIO map.
|
||||||
|
*/
|
||||||
|
.start = -1,
|
||||||
|
.end = -1,
|
||||||
|
.flags = IORESOURCE_IO,
|
||||||
|
},
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device bfin_uart1_device = {
|
||||||
|
.name = "bfin-uart",
|
||||||
|
.id = 1,
|
||||||
|
.num_resources = ARRAY_SIZE(bfin_uart1_resources),
|
||||||
|
.resource = bfin_uart1_resources,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE)
|
||||||
|
#ifdef CONFIG_BFIN_SIR0
|
||||||
|
static struct resource bfin_sir0_resources[] = {
|
||||||
|
{
|
||||||
|
.start = 0xFFC00400,
|
||||||
|
.end = 0xFFC004FF,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_UART0_RX,
|
||||||
|
.end = IRQ_UART0_RX+1,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = CH_UART0_RX,
|
||||||
|
.end = CH_UART0_RX+1,
|
||||||
|
.flags = IORESOURCE_DMA,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
static struct platform_device bfin_sir0_device = {
|
||||||
|
.name = "bfin_sir",
|
||||||
|
.id = 0,
|
||||||
|
.num_resources = ARRAY_SIZE(bfin_sir0_resources),
|
||||||
|
.resource = bfin_sir0_resources,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_BFIN_SIR1
|
||||||
|
static struct resource bfin_sir1_resources[] = {
|
||||||
|
{
|
||||||
|
.start = 0xFFC02000,
|
||||||
|
.end = 0xFFC020FF,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_UART1_RX,
|
||||||
|
.end = IRQ_UART1_RX+1,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = CH_UART1_RX,
|
||||||
|
.end = CH_UART1_RX+1,
|
||||||
|
.flags = IORESOURCE_DMA,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
static struct platform_device bfin_sir1_device = {
|
||||||
|
.name = "bfin_sir",
|
||||||
|
.id = 1,
|
||||||
|
.num_resources = ARRAY_SIZE(bfin_sir1_resources),
|
||||||
|
.resource = bfin_sir1_resources,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_I2C_BLACKFIN_TWI) || defined(CONFIG_I2C_BLACKFIN_TWI_MODULE)
|
||||||
|
static struct resource bfin_twi0_resource[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = TWI0_REGBASE,
|
||||||
|
.end = TWI0_REGBASE,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = IRQ_TWI,
|
||||||
|
.end = IRQ_TWI,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device i2c_bfin_twi_device = {
|
||||||
|
.name = "i2c-bfin-twi",
|
||||||
|
.id = 0,
|
||||||
|
.num_resources = ARRAY_SIZE(bfin_twi0_resource),
|
||||||
|
.resource = bfin_twi0_resource,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
|
||||||
|
static struct platform_device bfin_sport0_uart_device = {
|
||||||
|
.name = "bfin-sport-uart",
|
||||||
|
.id = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device bfin_sport1_uart_device = {
|
||||||
|
.name = "bfin-sport-uart",
|
||||||
|
.id = 1,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
|
||||||
|
static struct platform_device bfin_mii_bus = {
|
||||||
|
.name = "bfin_mii_bus",
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device bfin_mac_device = {
|
||||||
|
.name = "bfin_mac",
|
||||||
|
.dev.platform_data = &bfin_mii_bus,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
|
||||||
|
#define PATA_INT IRQ_PF14
|
||||||
|
|
||||||
|
static struct pata_platform_info bfin_pata_platform_data = {
|
||||||
|
.ioport_shift = 2,
|
||||||
|
.irq_type = IRQF_TRIGGER_HIGH | IRQF_DISABLED,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct resource bfin_pata_resources[] = {
|
||||||
|
{
|
||||||
|
.start = 0x2030C000,
|
||||||
|
.end = 0x2030C01F,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = 0x2030D018,
|
||||||
|
.end = 0x2030D01B,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = PATA_INT,
|
||||||
|
.end = PATA_INT,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device bfin_pata_device = {
|
||||||
|
.name = "pata_platform",
|
||||||
|
.id = -1,
|
||||||
|
.num_resources = ARRAY_SIZE(bfin_pata_resources),
|
||||||
|
.resource = bfin_pata_resources,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &bfin_pata_platform_data,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static const unsigned int cclk_vlev_datasheet[] =
|
||||||
|
{
|
||||||
|
VRPAIR(VLEV_085, 250000000),
|
||||||
|
VRPAIR(VLEV_090, 376000000),
|
||||||
|
VRPAIR(VLEV_095, 426000000),
|
||||||
|
VRPAIR(VLEV_100, 426000000),
|
||||||
|
VRPAIR(VLEV_105, 476000000),
|
||||||
|
VRPAIR(VLEV_110, 476000000),
|
||||||
|
VRPAIR(VLEV_115, 476000000),
|
||||||
|
VRPAIR(VLEV_120, 500000000),
|
||||||
|
VRPAIR(VLEV_125, 533000000),
|
||||||
|
VRPAIR(VLEV_130, 600000000),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct bfin_dpmc_platform_data bfin_dmpc_vreg_data = {
|
||||||
|
.tuple_tab = cclk_vlev_datasheet,
|
||||||
|
.tabsize = ARRAY_SIZE(cclk_vlev_datasheet),
|
||||||
|
.vr_settling_time = 25 /* us */,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device bfin_dpmc = {
|
||||||
|
.name = "bfin dpmc",
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &bfin_dmpc_vreg_data,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device *cm_bf537e_devices[] __initdata = {
|
||||||
|
|
||||||
|
&bfin_dpmc,
|
||||||
|
|
||||||
|
#if defined(CONFIG_FB_HITACHI_TX09) || defined(CONFIG_FB_HITACHI_TX09_MODULE)
|
||||||
|
&hitachi_fb_device,
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
|
||||||
|
&rtc_device,
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE)
|
||||||
|
#ifdef CONFIG_SERIAL_BFIN_UART0
|
||||||
|
&bfin_uart0_device,
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_SERIAL_BFIN_UART1
|
||||||
|
&bfin_uart1_device,
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE)
|
||||||
|
#ifdef CONFIG_BFIN_SIR0
|
||||||
|
&bfin_sir0_device,
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_BFIN_SIR1
|
||||||
|
&bfin_sir1_device,
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_I2C_BLACKFIN_TWI) || defined(CONFIG_I2C_BLACKFIN_TWI_MODULE)
|
||||||
|
&i2c_bfin_twi_device,
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
|
||||||
|
&bfin_sport0_uart_device,
|
||||||
|
&bfin_sport1_uart_device,
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
|
||||||
|
&isp1362_hcd_device,
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
||||||
|
&smc91x_device,
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
|
||||||
|
&bfin_mii_bus,
|
||||||
|
&bfin_mac_device,
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE)
|
||||||
|
&net2272_bfin_device,
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
||||||
|
&bfin_spi0_device,
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
|
||||||
|
&bfin_pata_device,
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE)
|
||||||
|
&cm_flash_device,
|
||||||
|
#endif
|
||||||
|
|
||||||
|
&bfin_gpios_device,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init cm_bf537e_init(void)
|
||||||
|
{
|
||||||
|
printk(KERN_INFO "%s(): registering device resources\n", __func__);
|
||||||
|
platform_add_devices(cm_bf537e_devices, ARRAY_SIZE(cm_bf537e_devices));
|
||||||
|
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
||||||
|
spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
|
||||||
|
irq_desc[PATA_INT].status |= IRQ_NOAUTOEN;
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
arch_initcall(cm_bf537e_init);
|
||||||
|
|
||||||
|
void bfin_get_ether_addr(char *addr)
|
||||||
|
{
|
||||||
|
random_ether_addr(addr);
|
||||||
|
printk(KERN_WARNING "%s:%s: Setting Ethernet MAC to a random one\n", __FILE__, __func__);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(bfin_get_ether_addr);
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* File: arch/blackfin/mach-bf537/boards/cm_bf537.c
|
* File: arch/blackfin/mach-bf537/boards/cm_bf537u.c
|
||||||
* Based on: arch/blackfin/mach-bf533/boards/ezkit.c
|
* Based on: arch/blackfin/mach-bf533/boards/ezkit.c
|
||||||
* Author: Aidan Williams <aidan@nicta.com.au>
|
* Author: Aidan Williams <aidan@nicta.com.au>
|
||||||
*
|
*
|
||||||
@ -45,11 +45,12 @@
|
|||||||
#include <asm/bfin5xx_spi.h>
|
#include <asm/bfin5xx_spi.h>
|
||||||
#include <asm/portmux.h>
|
#include <asm/portmux.h>
|
||||||
#include <asm/dpmc.h>
|
#include <asm/dpmc.h>
|
||||||
|
#include <linux/spi/mmc_spi.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Name the Board for the /proc/cpuinfo
|
* Name the Board for the /proc/cpuinfo
|
||||||
*/
|
*/
|
||||||
const char bfin_board_name[] = "Bluetechnix CM BF537";
|
const char bfin_board_name[] = "Bluetechnix CM BF537U";
|
||||||
|
|
||||||
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
||||||
/* all SPI peripherals info goes here */
|
/* all SPI peripherals info goes here */
|
||||||
@ -101,13 +102,6 @@ static struct bfin5xx_spi_chip ad1836_spi_chip_info = {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE)
|
|
||||||
static struct bfin5xx_spi_chip ad9960_spi_chip_info = {
|
|
||||||
.enable_dma = 0,
|
|
||||||
.bits_per_word = 16,
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
||||||
static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
||||||
.enable_dma = 0,
|
.enable_dma = 0,
|
||||||
@ -142,7 +136,7 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
|||||||
|
|
||||||
#if defined(CONFIG_SND_BLACKFIN_AD1836) || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
#if defined(CONFIG_SND_BLACKFIN_AD1836) || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "ad1836-spi",
|
.modalias = "ad1836",
|
||||||
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
|
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
|
||||||
.bus_num = 0,
|
.bus_num = 0,
|
||||||
.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
||||||
@ -150,16 +144,6 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
|||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE)
|
|
||||||
{
|
|
||||||
.modalias = "ad9960-spi",
|
|
||||||
.max_speed_hz = 10000000, /* max spi clock (SCK) speed in HZ */
|
|
||||||
.bus_num = 0,
|
|
||||||
.chip_select = 1,
|
|
||||||
.controller_data = &ad9960_spi_chip_info,
|
|
||||||
},
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "mmc_spi",
|
.modalias = "mmc_spi",
|
||||||
@ -223,6 +207,14 @@ static struct platform_device hitachi_fb_device = {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
||||||
|
#include <linux/smc91x.h>
|
||||||
|
|
||||||
|
static struct smc91x_platdata smc91x_info = {
|
||||||
|
.flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
|
||||||
|
.leda = RPC_LED_100_10,
|
||||||
|
.ledb = RPC_LED_TX_RX,
|
||||||
|
};
|
||||||
|
|
||||||
static struct resource smc91x_resources[] = {
|
static struct resource smc91x_resources[] = {
|
||||||
{
|
{
|
||||||
.start = 0x20200300,
|
.start = 0x20200300,
|
||||||
@ -240,6 +232,9 @@ static struct platform_device smc91x_device = {
|
|||||||
.id = 0,
|
.id = 0,
|
||||||
.num_resources = ARRAY_SIZE(smc91x_resources),
|
.num_resources = ARRAY_SIZE(smc91x_resources),
|
||||||
.resource = smc91x_resources,
|
.resource = smc91x_resources,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &smc91x_info,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -324,7 +319,7 @@ static struct mtd_partition cm_partitions[] = {
|
|||||||
.offset = 0,
|
.offset = 0,
|
||||||
}, {
|
}, {
|
||||||
.name = "linux kernel(nor)",
|
.name = "linux kernel(nor)",
|
||||||
.size = 0xE0000,
|
.size = 0x100000,
|
||||||
.offset = MTDPART_OFS_APPEND,
|
.offset = MTDPART_OFS_APPEND,
|
||||||
}, {
|
}, {
|
||||||
.name = "file system(nor)",
|
.name = "file system(nor)",
|
||||||
@ -339,7 +334,7 @@ static struct physmap_flash_data cm_flash_data = {
|
|||||||
.nr_parts = ARRAY_SIZE(cm_partitions),
|
.nr_parts = ARRAY_SIZE(cm_partitions),
|
||||||
};
|
};
|
||||||
|
|
||||||
static unsigned cm_flash_gpios[] = { GPIO_PF4 };
|
static unsigned cm_flash_gpios[] = { GPIO_PH0 };
|
||||||
|
|
||||||
static struct resource cm_flash_resource[] = {
|
static struct resource cm_flash_resource[] = {
|
||||||
{
|
{
|
||||||
@ -548,7 +543,7 @@ static struct platform_device bfin_dpmc = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device *cm_bf537_devices[] __initdata = {
|
static struct platform_device *cm_bf537u_devices[] __initdata = {
|
||||||
|
|
||||||
&bfin_dpmc,
|
&bfin_dpmc,
|
||||||
|
|
||||||
@ -614,10 +609,10 @@ static struct platform_device *cm_bf537_devices[] __initdata = {
|
|||||||
&bfin_gpios_device,
|
&bfin_gpios_device,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init cm_bf537_init(void)
|
static int __init cm_bf537u_init(void)
|
||||||
{
|
{
|
||||||
printk(KERN_INFO "%s(): registering device resources\n", __func__);
|
printk(KERN_INFO "%s(): registering device resources\n", __func__);
|
||||||
platform_add_devices(cm_bf537_devices, ARRAY_SIZE(cm_bf537_devices));
|
platform_add_devices(cm_bf537u_devices, ARRAY_SIZE(cm_bf537u_devices));
|
||||||
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
||||||
spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
|
spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
|
||||||
#endif
|
#endif
|
||||||
@ -628,7 +623,7 @@ static int __init cm_bf537_init(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
arch_initcall(cm_bf537_init);
|
arch_initcall(cm_bf537u_init);
|
||||||
|
|
||||||
void bfin_get_ether_addr(char *addr)
|
void bfin_get_ether_addr(char *addr)
|
||||||
{
|
{
|
@ -92,6 +92,14 @@ static struct platform_device rtc_device = {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
||||||
|
#include <linux/smc91x.h>
|
||||||
|
|
||||||
|
static struct smc91x_platdata smc91x_info = {
|
||||||
|
.flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
|
||||||
|
.leda = RPC_LED_100_10,
|
||||||
|
.ledb = RPC_LED_TX_RX,
|
||||||
|
};
|
||||||
|
|
||||||
static struct resource smc91x_resources[] = {
|
static struct resource smc91x_resources[] = {
|
||||||
{
|
{
|
||||||
.name = "smc91x-regs",
|
.name = "smc91x-regs",
|
||||||
@ -110,6 +118,9 @@ static struct platform_device smc91x_device = {
|
|||||||
.id = 0,
|
.id = 0,
|
||||||
.num_resources = ARRAY_SIZE(smc91x_resources),
|
.num_resources = ARRAY_SIZE(smc91x_resources),
|
||||||
.resource = smc91x_resources,
|
.resource = smc91x_resources,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &smc91x_info,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -282,13 +293,6 @@ static struct bfin5xx_spi_chip ad1836_spi_chip_info = {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE)
|
|
||||||
static struct bfin5xx_spi_chip ad9960_spi_chip_info = {
|
|
||||||
.enable_dma = 0,
|
|
||||||
.bits_per_word = 16,
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
||||||
static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
||||||
.enable_dma = 0,
|
.enable_dma = 0,
|
||||||
@ -348,22 +352,13 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
|||||||
#if defined(CONFIG_SND_BLACKFIN_AD1836) \
|
#if defined(CONFIG_SND_BLACKFIN_AD1836) \
|
||||||
|| defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
|| defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "ad1836-spi",
|
.modalias = "ad1836",
|
||||||
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
|
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
|
||||||
.bus_num = 0,
|
.bus_num = 0,
|
||||||
.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
||||||
.controller_data = &ad1836_spi_chip_info,
|
.controller_data = &ad1836_spi_chip_info,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE)
|
|
||||||
{
|
|
||||||
.modalias = "ad9960-spi",
|
|
||||||
.max_speed_hz = 10000000, /* max spi clock (SCK) speed in HZ */
|
|
||||||
.bus_num = 0,
|
|
||||||
.chip_select = 1,
|
|
||||||
.controller_data = &ad9960_spi_chip_info,
|
|
||||||
},
|
|
||||||
#endif
|
|
||||||
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "mmc_spi",
|
.modalias = "mmc_spi",
|
||||||
|
@ -171,6 +171,14 @@ static struct platform_device rtc_device = {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
||||||
|
#include <linux/smc91x.h>
|
||||||
|
|
||||||
|
static struct smc91x_platdata smc91x_info = {
|
||||||
|
.flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
|
||||||
|
.leda = RPC_LED_100_10,
|
||||||
|
.ledb = RPC_LED_TX_RX,
|
||||||
|
};
|
||||||
|
|
||||||
static struct resource smc91x_resources[] = {
|
static struct resource smc91x_resources[] = {
|
||||||
{
|
{
|
||||||
.name = "smc91x-regs",
|
.name = "smc91x-regs",
|
||||||
@ -189,6 +197,9 @@ static struct platform_device smc91x_device = {
|
|||||||
.id = 0,
|
.id = 0,
|
||||||
.num_resources = ARRAY_SIZE(smc91x_resources),
|
.num_resources = ARRAY_SIZE(smc91x_resources),
|
||||||
.resource = smc91x_resources,
|
.resource = smc91x_resources,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &smc91x_info,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -196,10 +207,15 @@ static struct platform_device smc91x_device = {
|
|||||||
static struct resource dm9000_resources[] = {
|
static struct resource dm9000_resources[] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
.start = 0x203FB800,
|
.start = 0x203FB800,
|
||||||
.end = 0x203FB800 + 8,
|
.end = 0x203FB800 + 1,
|
||||||
.flags = IORESOURCE_MEM,
|
.flags = IORESOURCE_MEM,
|
||||||
},
|
},
|
||||||
[1] = {
|
[1] = {
|
||||||
|
.start = 0x203FB804,
|
||||||
|
.end = 0x203FB804 + 1,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
.start = IRQ_PF9,
|
.start = IRQ_PF9,
|
||||||
.end = IRQ_PF9,
|
.end = IRQ_PF9,
|
||||||
.flags = (IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE),
|
.flags = (IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE),
|
||||||
@ -516,19 +532,135 @@ static struct bfin5xx_spi_chip spi_adc_chip_info = {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_SND_BLACKFIN_AD1836) \
|
#if defined(CONFIG_SND_BF5XX_SOC_AD1836) \
|
||||||
|| defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
|| defined(CONFIG_SND_BF5XX_SOC_AD1836_MODULE)
|
||||||
static struct bfin5xx_spi_chip ad1836_spi_chip_info = {
|
static struct bfin5xx_spi_chip ad1836_spi_chip_info = {
|
||||||
.enable_dma = 0,
|
.enable_dma = 0,
|
||||||
.bits_per_word = 16,
|
.bits_per_word = 16,
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE)
|
#if defined(CONFIG_SND_BF5XX_SOC_AD1938) \
|
||||||
static struct bfin5xx_spi_chip ad9960_spi_chip_info = {
|
|| defined(CONFIG_SND_BF5XX_SOC_AD1938_MODULE)
|
||||||
|
static struct bfin5xx_spi_chip ad1938_spi_chip_info = {
|
||||||
|
.enable_dma = 0,
|
||||||
|
.bits_per_word = 8,
|
||||||
|
.cs_gpio = GPIO_PF5,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_INPUT_EVAL_AD7147EBZ)
|
||||||
|
#include <linux/input.h>
|
||||||
|
#include <linux/input/ad714x.h>
|
||||||
|
static struct bfin5xx_spi_chip ad7147_spi_chip_info = {
|
||||||
.enable_dma = 0,
|
.enable_dma = 0,
|
||||||
.bits_per_word = 16,
|
.bits_per_word = 16,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct ad714x_slider_plat slider_plat[] = {
|
||||||
|
{
|
||||||
|
.start_stage = 0,
|
||||||
|
.end_stage = 7,
|
||||||
|
.max_coord = 128,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct ad714x_button_plat button_plat[] = {
|
||||||
|
{
|
||||||
|
.keycode = BTN_FORWARD,
|
||||||
|
.l_mask = 0,
|
||||||
|
.h_mask = 0x600,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.keycode = BTN_LEFT,
|
||||||
|
.l_mask = 0,
|
||||||
|
.h_mask = 0x500,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.keycode = BTN_MIDDLE,
|
||||||
|
.l_mask = 0,
|
||||||
|
.h_mask = 0x800,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.keycode = BTN_RIGHT,
|
||||||
|
.l_mask = 0x100,
|
||||||
|
.h_mask = 0x400,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.keycode = BTN_BACK,
|
||||||
|
.l_mask = 0x200,
|
||||||
|
.h_mask = 0x400,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
static struct ad714x_platform_data ad7147_platfrom_data = {
|
||||||
|
.slider_num = 1,
|
||||||
|
.button_num = 5,
|
||||||
|
.slider = slider_plat,
|
||||||
|
.button = button_plat,
|
||||||
|
.stage_cfg_reg = {
|
||||||
|
{0xFBFF, 0x1FFF, 0, 0x2626, 1600, 1600, 1600, 1600},
|
||||||
|
{0xEFFF, 0x1FFF, 0, 0x2626, 1650, 1650, 1650, 1650},
|
||||||
|
{0xFFFF, 0x1FFE, 0, 0x2626, 1650, 1650, 1650, 1650},
|
||||||
|
{0xFFFF, 0x1FFB, 0, 0x2626, 1650, 1650, 1650, 1650},
|
||||||
|
{0xFFFF, 0x1FEF, 0, 0x2626, 1650, 1650, 1650, 1650},
|
||||||
|
{0xFFFF, 0x1FBF, 0, 0x2626, 1650, 1650, 1650, 1650},
|
||||||
|
{0xFFFF, 0x1EFF, 0, 0x2626, 1650, 1650, 1650, 1650},
|
||||||
|
{0xFFFF, 0x1BFF, 0, 0x2626, 1600, 1600, 1600, 1600},
|
||||||
|
{0xFF7B, 0x3FFF, 0x506, 0x2626, 1100, 1100, 1150, 1150},
|
||||||
|
{0xFDFE, 0x3FFF, 0x606, 0x2626, 1100, 1100, 1150, 1150},
|
||||||
|
{0xFEBA, 0x1FFF, 0x1400, 0x2626, 1200, 1200, 1300, 1300},
|
||||||
|
{0xFFEF, 0x1FFF, 0x0, 0x2626, 1100, 1100, 1150, 1150},
|
||||||
|
},
|
||||||
|
.sys_cfg_reg = {0x2B2, 0x0, 0x3233, 0x819, 0x832, 0xCFF, 0xCFF, 0x0},
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_INPUT_EVAL_AD7142EB)
|
||||||
|
#include <linux/input.h>
|
||||||
|
#include <linux/input/ad714x.h>
|
||||||
|
static struct ad714x_button_plat button_plat[] = {
|
||||||
|
{
|
||||||
|
.keycode = BTN_1,
|
||||||
|
.l_mask = 0,
|
||||||
|
.h_mask = 0x1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.keycode = BTN_2,
|
||||||
|
.l_mask = 0,
|
||||||
|
.h_mask = 0x2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.keycode = BTN_3,
|
||||||
|
.l_mask = 0,
|
||||||
|
.h_mask = 0x4,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.keycode = BTN_4,
|
||||||
|
.l_mask = 0x0,
|
||||||
|
.h_mask = 0x8,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
static struct ad714x_platform_data ad7142_platfrom_data = {
|
||||||
|
.button_num = 4,
|
||||||
|
.button = button_plat,
|
||||||
|
.stage_cfg_reg = {
|
||||||
|
/* fixme: figure out right setting for all comoponent according
|
||||||
|
* to hardware feature of EVAL-AD7142EB board */
|
||||||
|
{0xE7FF, 0x3FFF, 0x0005, 0x2626, 0x01F4, 0x01F4, 0x028A, 0x028A},
|
||||||
|
{0xFDBF, 0x3FFF, 0x0001, 0x2626, 0x01F4, 0x01F4, 0x028A, 0x028A},
|
||||||
|
{0xFFFF, 0x2DFF, 0x0001, 0x2626, 0x01F4, 0x01F4, 0x028A, 0x028A},
|
||||||
|
{0xFFFF, 0x37BF, 0x0001, 0x2626, 0x01F4, 0x01F4, 0x028A, 0x028A},
|
||||||
|
{0xFFFF, 0x3FFF, 0x0000, 0x0606, 0x01F4, 0x01F4, 0x0320, 0x0320},
|
||||||
|
{0xFFFF, 0x3FFF, 0x0000, 0x0606, 0x01F4, 0x01F4, 0x0320, 0x0320},
|
||||||
|
{0xFFFF, 0x3FFF, 0x0000, 0x0606, 0x01F4, 0x01F4, 0x0320, 0x0320},
|
||||||
|
{0xFFFF, 0x3FFF, 0x0000, 0x0606, 0x01F4, 0x01F4, 0x0320, 0x0320},
|
||||||
|
{0xFFFF, 0x3FFF, 0x0000, 0x0606, 0x01F4, 0x01F4, 0x0320, 0x0320},
|
||||||
|
{0xFFFF, 0x3FFF, 0x0000, 0x0606, 0x01F4, 0x01F4, 0x0320, 0x0320},
|
||||||
|
{0xFFFF, 0x3FFF, 0x0000, 0x0606, 0x01F4, 0x01F4, 0x0320, 0x0320},
|
||||||
|
{0xFFFF, 0x3FFF, 0x0000, 0x0606, 0x01F4, 0x01F4, 0x0320, 0x0320},
|
||||||
|
},
|
||||||
|
.sys_cfg_reg = {0x0B2, 0x0, 0x690, 0x664, 0x290F, 0xF, 0xF, 0x0},
|
||||||
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
||||||
@ -555,15 +687,7 @@ static struct mmc_spi_platform_data bfin_mmc_spi_pdata = {
|
|||||||
static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
||||||
.enable_dma = 0,
|
.enable_dma = 0,
|
||||||
.bits_per_word = 8,
|
.bits_per_word = 8,
|
||||||
};
|
.pio_interrupt = 0,
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_PBX)
|
|
||||||
static struct bfin5xx_spi_chip spi_si3xxx_chip_info = {
|
|
||||||
.ctl_reg = 0x4, /* send zero */
|
|
||||||
.enable_dma = 0,
|
|
||||||
.bits_per_word = 8,
|
|
||||||
.cs_change_per_word = 1,
|
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -743,25 +867,42 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
|||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_SND_BLACKFIN_AD1836) \
|
#if defined(CONFIG_SND_BF5XX_SOC_AD1836) \
|
||||||
|| defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
|| defined(CONFIG_SND_BF5XX_SOC_AD1836_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "ad1836-spi",
|
.modalias = "ad1836",
|
||||||
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
|
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
|
||||||
.bus_num = 0,
|
.bus_num = 0,
|
||||||
.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
.chip_select = 4,/* CONFIG_SND_BLACKFIN_SPI_PFBIT */
|
||||||
.controller_data = &ad1836_spi_chip_info,
|
.controller_data = &ad1836_spi_chip_info,
|
||||||
|
.mode = SPI_MODE_3,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE)
|
|
||||||
|
#if defined(CONFIG_SND_BF5XX_SOC_AD1938) || defined(CONFIG_SND_BF5XX_SOC_AD1938_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "ad9960-spi",
|
.modalias = "ad1938",
|
||||||
.max_speed_hz = 10000000, /* max spi clock (SCK) speed in HZ */
|
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
|
||||||
.bus_num = 0,
|
.bus_num = 0,
|
||||||
.chip_select = 1,
|
.chip_select = 0,/* CONFIG_SND_BLACKFIN_SPI_PFBIT */
|
||||||
.controller_data = &ad9960_spi_chip_info,
|
.controller_data = &ad1938_spi_chip_info,
|
||||||
|
.mode = SPI_MODE_3,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_INPUT_EVAL_AD7147EBZ)
|
||||||
|
{
|
||||||
|
.modalias = "ad714x_captouch",
|
||||||
|
.max_speed_hz = 1000000, /* max spi clock (SCK) speed in HZ */
|
||||||
|
.irq = IRQ_PF4,
|
||||||
|
.bus_num = 0,
|
||||||
|
.chip_select = 5,
|
||||||
|
.mode = SPI_MODE_3,
|
||||||
|
.platform_data = &ad7147_platfrom_data,
|
||||||
|
.controller_data = &ad7147_spi_chip_info,
|
||||||
|
},
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "mmc_spi",
|
.modalias = "mmc_spi",
|
||||||
@ -773,24 +914,6 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
|||||||
.mode = SPI_MODE_3,
|
.mode = SPI_MODE_3,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_PBX)
|
|
||||||
{
|
|
||||||
.modalias = "fxs-spi",
|
|
||||||
.max_speed_hz = 12500000, /* max spi clock (SCK) speed in HZ */
|
|
||||||
.bus_num = 0,
|
|
||||||
.chip_select = 8 - CONFIG_J11_JUMPER,
|
|
||||||
.controller_data = &spi_si3xxx_chip_info,
|
|
||||||
.mode = SPI_MODE_3,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.modalias = "fxo-spi",
|
|
||||||
.max_speed_hz = 12500000, /* max spi clock (SCK) speed in HZ */
|
|
||||||
.bus_num = 0,
|
|
||||||
.chip_select = 8 - CONFIG_J19_JUMPER,
|
|
||||||
.controller_data = &spi_si3xxx_chip_info,
|
|
||||||
.mode = SPI_MODE_3,
|
|
||||||
},
|
|
||||||
#endif
|
|
||||||
#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
|
#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "ad7877",
|
.modalias = "ad7877",
|
||||||
@ -864,6 +987,11 @@ static struct resource bfin_spi0_resource[] = {
|
|||||||
[1] = {
|
[1] = {
|
||||||
.start = CH_SPI,
|
.start = CH_SPI,
|
||||||
.end = CH_SPI,
|
.end = CH_SPI,
|
||||||
|
.flags = IORESOURCE_DMA,
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
|
.start = IRQ_SPI,
|
||||||
|
.end = IRQ_SPI,
|
||||||
.flags = IORESOURCE_IRQ,
|
.flags = IORESOURCE_IRQ,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@ -1089,7 +1217,7 @@ static struct platform_device i2c_bfin_twi_device = {
|
|||||||
|
|
||||||
#if defined(CONFIG_KEYBOARD_ADP5588) || defined(CONFIG_KEYBOARD_ADP5588_MODULE)
|
#if defined(CONFIG_KEYBOARD_ADP5588) || defined(CONFIG_KEYBOARD_ADP5588_MODULE)
|
||||||
#include <linux/input.h>
|
#include <linux/input.h>
|
||||||
#include <linux/i2c/adp5588_keys.h>
|
#include <linux/i2c/adp5588.h>
|
||||||
static const unsigned short adp5588_keymap[ADP5588_KEYMAPSIZE] = {
|
static const unsigned short adp5588_keymap[ADP5588_KEYMAPSIZE] = {
|
||||||
[0] = KEY_GRAVE,
|
[0] = KEY_GRAVE,
|
||||||
[1] = KEY_1,
|
[1] = KEY_1,
|
||||||
@ -1309,11 +1437,20 @@ static struct adp5520_platform_data adp5520_pdev_data = {
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_GPIO_ADP5588) || defined(CONFIG_GPIO_ADP5588_MODULE)
|
||||||
|
#include <linux/i2c/adp5588.h>
|
||||||
|
static struct adp5588_gpio_platfrom_data adp5588_gpio_data = {
|
||||||
|
.gpio_start = 50,
|
||||||
|
.pullup_dis_mask = 0,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
||||||
#if defined(CONFIG_JOYSTICK_AD7142) || defined(CONFIG_JOYSTICK_AD7142_MODULE)
|
#if defined(CONFIG_INPUT_EVAL_AD7142EB)
|
||||||
{
|
{
|
||||||
I2C_BOARD_INFO("ad7142_joystick", 0x2C),
|
I2C_BOARD_INFO("ad7142_captouch", 0x2C),
|
||||||
.irq = IRQ_PG5,
|
.irq = IRQ_PG5,
|
||||||
|
.platform_data = (void *)&ad7142_platfrom_data,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_BFIN_TWI_LCD) || defined(CONFIG_BFIN_TWI_LCD_MODULE)
|
#if defined(CONFIG_BFIN_TWI_LCD) || defined(CONFIG_BFIN_TWI_LCD_MODULE)
|
||||||
@ -1321,7 +1458,7 @@ static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
|||||||
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_TWI_KEYPAD) || defined(CONFIG_TWI_KEYPAD_MODULE)
|
#if defined(CONFIG_INPUT_PCF8574) || defined(CONFIG_INPUT_PCF8574_MODULE)
|
||||||
{
|
{
|
||||||
I2C_BOARD_INFO("pcf8574_keypad", 0x27),
|
I2C_BOARD_INFO("pcf8574_keypad", 0x27),
|
||||||
.irq = IRQ_PG6,
|
.irq = IRQ_PG6,
|
||||||
@ -1355,6 +1492,12 @@ static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
|||||||
.platform_data = (void *)&adxl34x_info,
|
.platform_data = (void *)&adxl34x_info,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(CONFIG_GPIO_ADP5588) || defined(CONFIG_GPIO_ADP5588_MODULE)
|
||||||
|
{
|
||||||
|
I2C_BOARD_INFO("adp5588-gpio", 0x34),
|
||||||
|
.platform_data = (void *)&adp5588_gpio_data,
|
||||||
|
},
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
|
#if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
|
||||||
@ -1456,6 +1599,13 @@ static struct platform_device bfin_dpmc = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE)
|
||||||
|
static struct platform_device bfin_tdm = {
|
||||||
|
.name = "bfin-tdm",
|
||||||
|
/* TODO: add platform data here */
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
static struct platform_device *stamp_devices[] __initdata = {
|
static struct platform_device *stamp_devices[] __initdata = {
|
||||||
|
|
||||||
&bfin_dpmc,
|
&bfin_dpmc,
|
||||||
@ -1561,6 +1711,10 @@ static struct platform_device *stamp_devices[] __initdata = {
|
|||||||
#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
|
#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
|
||||||
&stamp_flash_device,
|
&stamp_flash_device,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE)
|
||||||
|
&bfin_tdm,
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init stamp_init(void)
|
static int __init stamp_init(void)
|
||||||
@ -1572,11 +1726,6 @@ static int __init stamp_init(void)
|
|||||||
platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
|
platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
|
||||||
spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
|
spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
|
||||||
|
|
||||||
#if (defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)) \
|
|
||||||
&& defined(PATA_INT)
|
|
||||||
irq_desc[PATA_INT].status |= IRQ_NOAUTOEN;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,6 +45,7 @@
|
|||||||
#include <asm/bfin5xx_spi.h>
|
#include <asm/bfin5xx_spi.h>
|
||||||
#include <asm/portmux.h>
|
#include <asm/portmux.h>
|
||||||
#include <asm/dpmc.h>
|
#include <asm/dpmc.h>
|
||||||
|
#include <linux/spi/mmc_spi.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Name the Board for the /proc/cpuinfo
|
* Name the Board for the /proc/cpuinfo
|
||||||
@ -101,13 +102,6 @@ static struct bfin5xx_spi_chip ad1836_spi_chip_info = {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE)
|
|
||||||
static struct bfin5xx_spi_chip ad9960_spi_chip_info = {
|
|
||||||
.enable_dma = 0,
|
|
||||||
.bits_per_word = 16,
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
||||||
static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
||||||
.enable_dma = 0,
|
.enable_dma = 0,
|
||||||
@ -142,7 +136,7 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
|||||||
|
|
||||||
#if defined(CONFIG_SND_BLACKFIN_AD1836) || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
#if defined(CONFIG_SND_BLACKFIN_AD1836) || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "ad1836-spi",
|
.modalias = "ad1836",
|
||||||
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
|
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
|
||||||
.bus_num = 0,
|
.bus_num = 0,
|
||||||
.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
||||||
@ -150,22 +144,12 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
|||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE)
|
|
||||||
{
|
|
||||||
.modalias = "ad9960-spi",
|
|
||||||
.max_speed_hz = 10000000, /* max spi clock (SCK) speed in HZ */
|
|
||||||
.bus_num = 0,
|
|
||||||
.chip_select = 1,
|
|
||||||
.controller_data = &ad9960_spi_chip_info,
|
|
||||||
},
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "mmc_spi",
|
.modalias = "mmc_spi",
|
||||||
.max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
|
.max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
|
||||||
.bus_num = 0,
|
.bus_num = 0,
|
||||||
.chip_select = 5,
|
.chip_select = 1,
|
||||||
.controller_data = &mmc_spi_chip_info,
|
.controller_data = &mmc_spi_chip_info,
|
||||||
.mode = SPI_MODE_3,
|
.mode = SPI_MODE_3,
|
||||||
},
|
},
|
||||||
@ -223,6 +207,14 @@ static struct platform_device hitachi_fb_device = {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
||||||
|
#include <linux/smc91x.h>
|
||||||
|
|
||||||
|
static struct smc91x_platdata smc91x_info = {
|
||||||
|
.flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
|
||||||
|
.leda = RPC_LED_100_10,
|
||||||
|
.ledb = RPC_LED_TX_RX,
|
||||||
|
};
|
||||||
|
|
||||||
static struct resource smc91x_resources[] = {
|
static struct resource smc91x_resources[] = {
|
||||||
{
|
{
|
||||||
.start = 0x20200300,
|
.start = 0x20200300,
|
||||||
@ -240,6 +232,9 @@ static struct platform_device smc91x_device = {
|
|||||||
.id = 0,
|
.id = 0,
|
||||||
.num_resources = ARRAY_SIZE(smc91x_resources),
|
.num_resources = ARRAY_SIZE(smc91x_resources),
|
||||||
.resource = smc91x_resources,
|
.resource = smc91x_resources,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &smc91x_info,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -285,12 +280,12 @@ static struct platform_device isp1362_hcd_device = {
|
|||||||
#if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE)
|
#if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE)
|
||||||
static struct resource net2272_bfin_resources[] = {
|
static struct resource net2272_bfin_resources[] = {
|
||||||
{
|
{
|
||||||
.start = 0x20200000,
|
.start = 0x20300000,
|
||||||
.end = 0x20200000 + 0x100,
|
.end = 0x20300000 + 0x100,
|
||||||
.flags = IORESOURCE_MEM,
|
.flags = IORESOURCE_MEM,
|
||||||
}, {
|
}, {
|
||||||
.start = IRQ_PH14,
|
.start = IRQ_PG13,
|
||||||
.end = IRQ_PH14,
|
.end = IRQ_PG13,
|
||||||
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
|
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@ -324,7 +319,7 @@ static struct mtd_partition cm_partitions[] = {
|
|||||||
.offset = 0,
|
.offset = 0,
|
||||||
}, {
|
}, {
|
||||||
.name = "linux kernel(nor)",
|
.name = "linux kernel(nor)",
|
||||||
.size = 0xE0000,
|
.size = 0x100000,
|
||||||
.offset = MTDPART_OFS_APPEND,
|
.offset = MTDPART_OFS_APPEND,
|
||||||
}, {
|
}, {
|
||||||
.name = "file system(nor)",
|
.name = "file system(nor)",
|
||||||
|
@ -96,12 +96,12 @@ int channel2irq(unsigned int channel)
|
|||||||
ret_irq = IRQ_SPI;
|
ret_irq = IRQ_SPI;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CH_UART_RX:
|
case CH_UART0_RX:
|
||||||
ret_irq = IRQ_UART_RX;
|
ret_irq = IRQ_UART0_RX;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CH_UART_TX:
|
case CH_UART0_TX:
|
||||||
ret_irq = IRQ_UART_TX;
|
ret_irq = IRQ_UART0_TX;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CH_MEM_STREAM0_SRC:
|
case CH_MEM_STREAM0_SRC:
|
||||||
|
@ -143,7 +143,7 @@
|
|||||||
/* Possible RETS Register Corruption when Subroutine Is under 5 Cycles in Duration */
|
/* Possible RETS Register Corruption when Subroutine Is under 5 Cycles in Duration */
|
||||||
#define ANOMALY_05000371 (1)
|
#define ANOMALY_05000371 (1)
|
||||||
/* SSYNC Stalls Processor when Executed from Non-Cacheable Memory */
|
/* SSYNC Stalls Processor when Executed from Non-Cacheable Memory */
|
||||||
#define ANOMALY_05000402 (__SILICON_REVISION__ >= 5)
|
#define ANOMALY_05000402 (__SILICON_REVISION__ == 2)
|
||||||
/* Level-Sensitive External GPIO Wakeups May Cause Indefinite Stall */
|
/* Level-Sensitive External GPIO Wakeups May Cause Indefinite Stall */
|
||||||
#define ANOMALY_05000403 (1)
|
#define ANOMALY_05000403 (1)
|
||||||
/* Speculative Fetches Can Cause Undesired External FIFO Operations */
|
/* Speculative Fetches Can Cause Undesired External FIFO Operations */
|
||||||
|
@ -45,96 +45,11 @@
|
|||||||
#if !defined(__ASSEMBLY__)
|
#if !defined(__ASSEMBLY__)
|
||||||
#include "cdefBF534.h"
|
#include "cdefBF534.h"
|
||||||
|
|
||||||
/* UART 0*/
|
|
||||||
#define bfin_read_UART_THR() bfin_read_UART0_THR()
|
|
||||||
#define bfin_write_UART_THR(val) bfin_write_UART0_THR(val)
|
|
||||||
#define bfin_read_UART_RBR() bfin_read_UART0_RBR()
|
|
||||||
#define bfin_write_UART_RBR(val) bfin_write_UART0_RBR(val)
|
|
||||||
#define bfin_read_UART_DLL() bfin_read_UART0_DLL()
|
|
||||||
#define bfin_write_UART_DLL(val) bfin_write_UART0_DLL(val)
|
|
||||||
#define bfin_read_UART_IER() bfin_read_UART0_IER()
|
|
||||||
#define bfin_write_UART_IER(val) bfin_write_UART0_IER(val)
|
|
||||||
#define bfin_read_UART_DLH() bfin_read_UART0_DLH()
|
|
||||||
#define bfin_write_UART_DLH(val) bfin_write_UART0_DLH(val)
|
|
||||||
#define bfin_read_UART_IIR() bfin_read_UART0_IIR()
|
|
||||||
#define bfin_write_UART_IIR(val) bfin_write_UART0_IIR(val)
|
|
||||||
#define bfin_read_UART_LCR() bfin_read_UART0_LCR()
|
|
||||||
#define bfin_write_UART_LCR(val) bfin_write_UART0_LCR(val)
|
|
||||||
#define bfin_read_UART_MCR() bfin_read_UART0_MCR()
|
|
||||||
#define bfin_write_UART_MCR(val) bfin_write_UART0_MCR(val)
|
|
||||||
#define bfin_read_UART_LSR() bfin_read_UART0_LSR()
|
|
||||||
#define bfin_write_UART_LSR(val) bfin_write_UART0_LSR(val)
|
|
||||||
#define bfin_read_UART_SCR() bfin_read_UART0_SCR()
|
|
||||||
#define bfin_write_UART_SCR(val) bfin_write_UART0_SCR(val)
|
|
||||||
#define bfin_read_UART_GCTL() bfin_read_UART0_GCTL()
|
|
||||||
#define bfin_write_UART_GCTL(val) bfin_write_UART0_GCTL(val)
|
|
||||||
|
|
||||||
#if defined(CONFIG_BF537) || defined(CONFIG_BF536)
|
#if defined(CONFIG_BF537) || defined(CONFIG_BF536)
|
||||||
#include "cdefBF537.h"
|
#include "cdefBF537.h"
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* MAP used DEFINES from BF533 to BF537 - so we don't need to change them in the driver, kernel, etc. */
|
|
||||||
|
|
||||||
/* UART_IIR Register */
|
|
||||||
#define STATUS(x) ((x << 1) & 0x06)
|
|
||||||
#define STATUS_P1 0x02
|
|
||||||
#define STATUS_P0 0x01
|
|
||||||
|
|
||||||
/* DMA Channel */
|
|
||||||
#define bfin_read_CH_UART_RX() bfin_read_CH_UART0_RX()
|
|
||||||
#define bfin_write_CH_UART_RX(val) bfin_write_CH_UART0_RX(val)
|
|
||||||
#define CH_UART_RX CH_UART0_RX
|
|
||||||
#define bfin_read_CH_UART_TX() bfin_read_CH_UART0_TX()
|
|
||||||
#define bfin_write_CH_UART_TX(val) bfin_write_CH_UART0_TX(val)
|
|
||||||
#define CH_UART_TX CH_UART0_TX
|
|
||||||
|
|
||||||
/* System Interrupt Controller */
|
|
||||||
#define bfin_read_IRQ_UART_RX() bfin_read_IRQ_UART0_RX()
|
|
||||||
#define bfin_write_IRQ_UART_RX(val) bfin_write_IRQ_UART0_RX(val)
|
|
||||||
#define IRQ_UART_RX IRQ_UART0_RX
|
|
||||||
#define bfin_read_IRQ_UART_TX() bfin_read_IRQ_UART0_TX()
|
|
||||||
#define bfin_write_IRQ_UART_TX(val) bfin_write_IRQ_UART0_TX(val)
|
|
||||||
#define IRQ_UART_TX IRQ_UART0_TX
|
|
||||||
#define bfin_read_IRQ_UART_ERROR() bfin_read_IRQ_UART0_ERROR()
|
|
||||||
#define bfin_write_IRQ_UART_ERROR(val) bfin_write_IRQ_UART0_ERROR(val)
|
|
||||||
#define IRQ_UART_ERROR IRQ_UART0_ERROR
|
|
||||||
|
|
||||||
/* MMR Registers*/
|
|
||||||
#define bfin_read_UART_THR() bfin_read_UART0_THR()
|
|
||||||
#define bfin_write_UART_THR(val) bfin_write_UART0_THR(val)
|
|
||||||
#define BFIN_UART_THR UART0_THR
|
|
||||||
#define bfin_read_UART_RBR() bfin_read_UART0_RBR()
|
|
||||||
#define bfin_write_UART_RBR(val) bfin_write_UART0_RBR(val)
|
|
||||||
#define BFIN_UART_RBR UART0_RBR
|
|
||||||
#define bfin_read_UART_DLL() bfin_read_UART0_DLL()
|
|
||||||
#define bfin_write_UART_DLL(val) bfin_write_UART0_DLL(val)
|
|
||||||
#define BFIN_UART_DLL UART0_DLL
|
|
||||||
#define bfin_read_UART_IER() bfin_read_UART0_IER()
|
|
||||||
#define bfin_write_UART_IER(val) bfin_write_UART0_IER(val)
|
|
||||||
#define BFIN_UART_IER UART0_IER
|
|
||||||
#define bfin_read_UART_DLH() bfin_read_UART0_DLH()
|
|
||||||
#define bfin_write_UART_DLH(val) bfin_write_UART0_DLH(val)
|
|
||||||
#define BFIN_UART_DLH UART0_DLH
|
|
||||||
#define bfin_read_UART_IIR() bfin_read_UART0_IIR()
|
|
||||||
#define bfin_write_UART_IIR(val) bfin_write_UART0_IIR(val)
|
|
||||||
#define BFIN_UART_IIR UART0_IIR
|
|
||||||
#define bfin_read_UART_LCR() bfin_read_UART0_LCR()
|
|
||||||
#define bfin_write_UART_LCR(val) bfin_write_UART0_LCR(val)
|
|
||||||
#define BFIN_UART_LCR UART0_LCR
|
|
||||||
#define bfin_read_UART_MCR() bfin_read_UART0_MCR()
|
|
||||||
#define bfin_write_UART_MCR(val) bfin_write_UART0_MCR(val)
|
|
||||||
#define BFIN_UART_MCR UART0_MCR
|
|
||||||
#define bfin_read_UART_LSR() bfin_read_UART0_LSR()
|
|
||||||
#define bfin_write_UART_LSR(val) bfin_write_UART0_LSR(val)
|
|
||||||
#define BFIN_UART_LSR UART0_LSR
|
|
||||||
#define bfin_read_UART_SCR() bfin_read_UART0_SCR()
|
|
||||||
#define bfin_write_UART_SCR(val) bfin_write_UART0_SCR(val)
|
|
||||||
#define BFIN_UART_SCR UART0_SCR
|
|
||||||
#define bfin_read_UART_GCTL() bfin_read_UART0_GCTL()
|
|
||||||
#define bfin_write_UART_GCTL(val) bfin_write_UART0_GCTL(val)
|
|
||||||
#define BFIN_UART_GCTL UART0_GCTL
|
|
||||||
|
|
||||||
#define BFIN_UART_NR_PORTS 2
|
#define BFIN_UART_NR_PORTS 2
|
||||||
|
|
||||||
#define OFFSET_THR 0x00 /* Transmit Holding register */
|
#define OFFSET_THR 0x00 /* Transmit Holding register */
|
||||||
@ -150,11 +65,6 @@
|
|||||||
#define OFFSET_SCR 0x1C /* SCR Scratch Register */
|
#define OFFSET_SCR 0x1C /* SCR Scratch Register */
|
||||||
#define OFFSET_GCTL 0x24 /* Global Control Register */
|
#define OFFSET_GCTL 0x24 /* Global Control Register */
|
||||||
|
|
||||||
/* DPMC*/
|
|
||||||
#define bfin_read_STOPCK_OFF() bfin_read_STOPCK()
|
|
||||||
#define bfin_write_STOPCK_OFF(val) bfin_write_STOPCK(val)
|
|
||||||
#define STOPCK_OFF STOPCK
|
|
||||||
|
|
||||||
/* PLL_DIV Masks */
|
/* PLL_DIV Masks */
|
||||||
#define CCLK_DIV1 CSEL_DIV1 /* CCLK = VCO / 1 */
|
#define CCLK_DIV1 CSEL_DIV1 /* CCLK = VCO / 1 */
|
||||||
#define CCLK_DIV2 CSEL_DIV2 /* CCLK = VCO / 2 */
|
#define CCLK_DIV2 CSEL_DIV2 /* CCLK = VCO / 2 */
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/mtd/mtd.h>
|
#include <linux/mtd/mtd.h>
|
||||||
|
#include <linux/mtd/physmap.h>
|
||||||
#include <linux/mtd/partitions.h>
|
#include <linux/mtd/partitions.h>
|
||||||
#include <linux/spi/spi.h>
|
#include <linux/spi/spi.h>
|
||||||
#include <linux/spi/flash.h>
|
#include <linux/spi/flash.h>
|
||||||
@ -177,6 +178,14 @@ static struct platform_device bfin_sir2_device = {
|
|||||||
* Driver needs to know address, irq and flag pin.
|
* Driver needs to know address, irq and flag pin.
|
||||||
*/
|
*/
|
||||||
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
||||||
|
#include <linux/smc91x.h>
|
||||||
|
|
||||||
|
static struct smc91x_platdata smc91x_info = {
|
||||||
|
.flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
|
||||||
|
.leda = RPC_LED_100_10,
|
||||||
|
.ledb = RPC_LED_TX_RX,
|
||||||
|
};
|
||||||
|
|
||||||
static struct resource smc91x_resources[] = {
|
static struct resource smc91x_resources[] = {
|
||||||
{
|
{
|
||||||
.name = "smc91x-regs",
|
.name = "smc91x-regs",
|
||||||
@ -194,6 +203,9 @@ static struct platform_device smc91x_device = {
|
|||||||
.id = 0,
|
.id = 0,
|
||||||
.num_resources = ARRAY_SIZE(smc91x_resources),
|
.num_resources = ARRAY_SIZE(smc91x_resources),
|
||||||
.resource = smc91x_resources,
|
.resource = smc91x_resources,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &smc91x_info,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -390,6 +402,11 @@ static struct resource bfin_spi2_resource[] = {
|
|||||||
[1] = {
|
[1] = {
|
||||||
.start = CH_SPI2,
|
.start = CH_SPI2,
|
||||||
.end = CH_SPI2,
|
.end = CH_SPI2,
|
||||||
|
.flags = IORESOURCE_DMA,
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
|
.start = IRQ_SPI2,
|
||||||
|
.end = IRQ_SPI2,
|
||||||
.flags = IORESOURCE_IRQ,
|
.flags = IORESOURCE_IRQ,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -550,6 +567,50 @@ static struct platform_device bfin_dpmc = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
|
||||||
|
static struct mtd_partition ezkit_partitions[] = {
|
||||||
|
{
|
||||||
|
.name = "bootloader(nor)",
|
||||||
|
.size = 0x40000,
|
||||||
|
.offset = 0,
|
||||||
|
}, {
|
||||||
|
.name = "linux kernel(nor)",
|
||||||
|
.size = 0x180000,
|
||||||
|
.offset = MTDPART_OFS_APPEND,
|
||||||
|
}, {
|
||||||
|
.name = "file system(nor)",
|
||||||
|
.size = MTDPART_SIZ_FULL,
|
||||||
|
.offset = MTDPART_OFS_APPEND,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct physmap_flash_data ezkit_flash_data = {
|
||||||
|
.width = 2,
|
||||||
|
.parts = ezkit_partitions,
|
||||||
|
.nr_parts = ARRAY_SIZE(ezkit_partitions),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct resource ezkit_flash_resource = {
|
||||||
|
.start = 0x20000000,
|
||||||
|
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
||||||
|
.end = 0x202fffff,
|
||||||
|
#else
|
||||||
|
.end = 0x203fffff,
|
||||||
|
#endif
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device ezkit_flash_device = {
|
||||||
|
.name = "physmap-flash",
|
||||||
|
.id = 0,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &ezkit_flash_data,
|
||||||
|
},
|
||||||
|
.num_resources = 1,
|
||||||
|
.resource = &ezkit_flash_resource,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
static struct platform_device *cm_bf538_devices[] __initdata = {
|
static struct platform_device *cm_bf538_devices[] __initdata = {
|
||||||
|
|
||||||
&bfin_dpmc,
|
&bfin_dpmc,
|
||||||
@ -598,6 +659,10 @@ static struct platform_device *cm_bf538_devices[] __initdata = {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
&bfin_gpios_device,
|
&bfin_gpios_device,
|
||||||
|
|
||||||
|
#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
|
||||||
|
&ezkit_flash_device,
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init ezkit_init(void)
|
static int __init ezkit_init(void)
|
||||||
|
@ -113,7 +113,7 @@
|
|||||||
/* GPIO Pins PC1 and PC4 Can Function as Normal Outputs */
|
/* GPIO Pins PC1 and PC4 Can Function as Normal Outputs */
|
||||||
#define ANOMALY_05000375 (__SILICON_REVISION__ < 4)
|
#define ANOMALY_05000375 (__SILICON_REVISION__ < 4)
|
||||||
/* SSYNC Stalls Processor when Executed from Non-Cacheable Memory */
|
/* SSYNC Stalls Processor when Executed from Non-Cacheable Memory */
|
||||||
#define ANOMALY_05000402 (__SILICON_REVISION__ < 4)
|
#define ANOMALY_05000402 (__SILICON_REVISION__ == 3)
|
||||||
/* Level-Sensitive External GPIO Wakeups May Cause Indefinite Stall */
|
/* Level-Sensitive External GPIO Wakeups May Cause Indefinite Stall */
|
||||||
#define ANOMALY_05000403 (1)
|
#define ANOMALY_05000403 (1)
|
||||||
/* Speculative Fetches Can Cause Undesired External FIFO Operations */
|
/* Speculative Fetches Can Cause Undesired External FIFO Operations */
|
||||||
|
@ -47,11 +47,6 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* UART_IIR Register */
|
|
||||||
#define STATUS(x) ((x << 1) & 0x06)
|
|
||||||
#define STATUS_P1 0x02
|
|
||||||
#define STATUS_P0 0x01
|
|
||||||
|
|
||||||
#define BFIN_UART_NR_PORTS 3
|
#define BFIN_UART_NR_PORTS 3
|
||||||
|
|
||||||
#define OFFSET_THR 0x00 /* Transmit Holding register */
|
#define OFFSET_THR 0x00 /* Transmit Holding register */
|
||||||
@ -67,11 +62,6 @@
|
|||||||
#define OFFSET_SCR 0x1C /* SCR Scratch Register */
|
#define OFFSET_SCR 0x1C /* SCR Scratch Register */
|
||||||
#define OFFSET_GCTL 0x24 /* Global Control Register */
|
#define OFFSET_GCTL 0x24 /* Global Control Register */
|
||||||
|
|
||||||
/* DPMC*/
|
|
||||||
#define bfin_read_STOPCK_OFF() bfin_read_STOPCK()
|
|
||||||
#define bfin_write_STOPCK_OFF(val) bfin_write_STOPCK(val)
|
|
||||||
#define STOPCK_OFF STOPCK
|
|
||||||
|
|
||||||
/* PLL_DIV Masks */
|
/* PLL_DIV Masks */
|
||||||
#define CCLK_DIV1 CSEL_DIV1 /* CCLK = VCO / 1 */
|
#define CCLK_DIV1 CSEL_DIV1 /* CCLK = VCO / 1 */
|
||||||
#define CCLK_DIV2 CSEL_DIV2 /* CCLK = VCO / 2 */
|
#define CCLK_DIV2 CSEL_DIV2 /* CCLK = VCO / 2 */
|
||||||
|
@ -1310,6 +1310,7 @@
|
|||||||
#define bfin_write_PPI_CONTROL(val) bfin_write16(PPI_CONTROL, val)
|
#define bfin_write_PPI_CONTROL(val) bfin_write16(PPI_CONTROL, val)
|
||||||
#define bfin_read_PPI_STATUS() bfin_read16(PPI_STATUS)
|
#define bfin_read_PPI_STATUS() bfin_read16(PPI_STATUS)
|
||||||
#define bfin_write_PPI_STATUS(val) bfin_write16(PPI_STATUS, val)
|
#define bfin_write_PPI_STATUS(val) bfin_write16(PPI_STATUS, val)
|
||||||
|
#define bfin_clear_PPI_STATUS() bfin_read_PPI_STATUS()
|
||||||
#define bfin_read_PPI_DELAY() bfin_read16(PPI_DELAY)
|
#define bfin_read_PPI_DELAY() bfin_read16(PPI_DELAY)
|
||||||
#define bfin_write_PPI_DELAY(val) bfin_write16(PPI_DELAY, val)
|
#define bfin_write_PPI_DELAY(val) bfin_write16(PPI_DELAY, val)
|
||||||
#define bfin_read_PPI_COUNT() bfin_read16(PPI_COUNT)
|
#define bfin_read_PPI_COUNT() bfin_read16(PPI_COUNT)
|
||||||
|
@ -291,6 +291,8 @@ static struct platform_device bfin_sir3_device = {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
|
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
|
||||||
|
#include <linux/smsc911x.h>
|
||||||
|
|
||||||
static struct resource smsc911x_resources[] = {
|
static struct resource smsc911x_resources[] = {
|
||||||
{
|
{
|
||||||
.name = "smsc911x-memory",
|
.name = "smsc911x-memory",
|
||||||
@ -304,11 +306,22 @@ static struct resource smsc911x_resources[] = {
|
|||||||
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
|
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct smsc911x_platform_config smsc911x_config = {
|
||||||
|
.flags = SMSC911X_USE_16BIT,
|
||||||
|
.irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
|
||||||
|
.irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN,
|
||||||
|
.phy_interface = PHY_INTERFACE_MODE_MII,
|
||||||
|
};
|
||||||
|
|
||||||
static struct platform_device smsc911x_device = {
|
static struct platform_device smsc911x_device = {
|
||||||
.name = "smsc911x",
|
.name = "smsc911x",
|
||||||
.id = 0,
|
.id = 0,
|
||||||
.num_resources = ARRAY_SIZE(smsc911x_resources),
|
.num_resources = ARRAY_SIZE(smsc911x_resources),
|
||||||
.resource = smsc911x_resources,
|
.resource = smsc911x_resources,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &smsc911x_config,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -473,7 +486,7 @@ static struct mtd_partition para_partitions[] = {
|
|||||||
.offset = 0,
|
.offset = 0,
|
||||||
}, {
|
}, {
|
||||||
.name = "linux kernel(nor)",
|
.name = "linux kernel(nor)",
|
||||||
.size = 0x400000,
|
.size = 0x100000,
|
||||||
.offset = MTDPART_OFS_APPEND,
|
.offset = MTDPART_OFS_APPEND,
|
||||||
}, {
|
}, {
|
||||||
.name = "file system(nor)",
|
.name = "file system(nor)",
|
||||||
@ -642,7 +655,7 @@ static struct resource bfin_spi1_resource[] = {
|
|||||||
|
|
||||||
/* SPI controller data */
|
/* SPI controller data */
|
||||||
static struct bfin5xx_spi_master bf54x_spi_master_info0 = {
|
static struct bfin5xx_spi_master bf54x_spi_master_info0 = {
|
||||||
.num_chipselect = 8,
|
.num_chipselect = 3,
|
||||||
.enable_dma = 1, /* master has the ability to do dma transfer */
|
.enable_dma = 1, /* master has the ability to do dma transfer */
|
||||||
.pin_req = {P_SPI0_SCK, P_SPI0_MISO, P_SPI0_MOSI, 0},
|
.pin_req = {P_SPI0_SCK, P_SPI0_MISO, P_SPI0_MOSI, 0},
|
||||||
};
|
};
|
||||||
@ -658,7 +671,7 @@ static struct platform_device bf54x_spi_master0 = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct bfin5xx_spi_master bf54x_spi_master_info1 = {
|
static struct bfin5xx_spi_master bf54x_spi_master_info1 = {
|
||||||
.num_chipselect = 8,
|
.num_chipselect = 3,
|
||||||
.enable_dma = 1, /* master has the ability to do dma transfer */
|
.enable_dma = 1, /* master has the ability to do dma transfer */
|
||||||
.pin_req = {P_SPI1_SCK, P_SPI1_MISO, P_SPI1_MOSI, 0},
|
.pin_req = {P_SPI1_SCK, P_SPI1_MISO, P_SPI1_MOSI, 0},
|
||||||
};
|
};
|
||||||
|
@ -99,8 +99,8 @@ static struct platform_device bfin_isp1760_device = {
|
|||||||
#include <mach/bf54x-lq043.h>
|
#include <mach/bf54x-lq043.h>
|
||||||
|
|
||||||
static struct bfin_bf54xfb_mach_info bf54x_lq043_data = {
|
static struct bfin_bf54xfb_mach_info bf54x_lq043_data = {
|
||||||
.width = 480,
|
.width = 95,
|
||||||
.height = 272,
|
.height = 54,
|
||||||
.xres = {480, 480, 480},
|
.xres = {480, 480, 480},
|
||||||
.yres = {272, 272, 272},
|
.yres = {272, 272, 272},
|
||||||
.bpp = {24, 24, 24},
|
.bpp = {24, 24, 24},
|
||||||
@ -702,7 +702,7 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
|||||||
#if defined(CONFIG_SND_BLACKFIN_AD1836) \
|
#if defined(CONFIG_SND_BLACKFIN_AD1836) \
|
||||||
|| defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
|| defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "ad1836-spi",
|
.modalias = "ad1836",
|
||||||
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
|
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
|
||||||
.bus_num = 1,
|
.bus_num = 1,
|
||||||
.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
||||||
@ -783,7 +783,7 @@ static struct resource bfin_spi1_resource[] = {
|
|||||||
|
|
||||||
/* SPI controller data */
|
/* SPI controller data */
|
||||||
static struct bfin5xx_spi_master bf54x_spi_master_info0 = {
|
static struct bfin5xx_spi_master bf54x_spi_master_info0 = {
|
||||||
.num_chipselect = 8,
|
.num_chipselect = 3,
|
||||||
.enable_dma = 1, /* master has the ability to do dma transfer */
|
.enable_dma = 1, /* master has the ability to do dma transfer */
|
||||||
.pin_req = {P_SPI0_SCK, P_SPI0_MISO, P_SPI0_MOSI, 0},
|
.pin_req = {P_SPI0_SCK, P_SPI0_MISO, P_SPI0_MOSI, 0},
|
||||||
};
|
};
|
||||||
@ -799,7 +799,7 @@ static struct platform_device bf54x_spi_master0 = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct bfin5xx_spi_master bf54x_spi_master_info1 = {
|
static struct bfin5xx_spi_master bf54x_spi_master_info1 = {
|
||||||
.num_chipselect = 8,
|
.num_chipselect = 3,
|
||||||
.enable_dma = 1, /* master has the ability to do dma transfer */
|
.enable_dma = 1, /* master has the ability to do dma transfer */
|
||||||
.pin_req = {P_SPI1_SCK, P_SPI1_MISO, P_SPI1_MOSI, 0},
|
.pin_req = {P_SPI1_SCK, P_SPI1_MISO, P_SPI1_MOSI, 0},
|
||||||
};
|
};
|
||||||
@ -869,7 +869,7 @@ static struct i2c_board_info __initdata bfin_i2c_board_info1[] = {
|
|||||||
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_TWI_KEYPAD) || defined(CONFIG_TWI_KEYPAD_MODULE)
|
#if defined(CONFIG_INPUT_PCF8574) || defined(CONFIG_INPUT_PCF8574_MODULE)
|
||||||
{
|
{
|
||||||
I2C_BOARD_INFO("pcf8574_keypad", 0x27),
|
I2C_BOARD_INFO("pcf8574_keypad", 0x27),
|
||||||
.irq = 212,
|
.irq = 212,
|
||||||
|
@ -91,16 +91,16 @@ int channel2irq(unsigned int channel)
|
|||||||
ret_irq = IRQ_SPI1;
|
ret_irq = IRQ_SPI1;
|
||||||
break;
|
break;
|
||||||
case CH_UART0_RX:
|
case CH_UART0_RX:
|
||||||
ret_irq = IRQ_UART_RX;
|
ret_irq = IRQ_UART0_RX;
|
||||||
break;
|
break;
|
||||||
case CH_UART0_TX:
|
case CH_UART0_TX:
|
||||||
ret_irq = IRQ_UART_TX;
|
ret_irq = IRQ_UART0_TX;
|
||||||
break;
|
break;
|
||||||
case CH_UART1_RX:
|
case CH_UART1_RX:
|
||||||
ret_irq = IRQ_UART_RX;
|
ret_irq = IRQ_UART1_RX;
|
||||||
break;
|
break;
|
||||||
case CH_UART1_TX:
|
case CH_UART1_TX:
|
||||||
ret_irq = IRQ_UART_TX;
|
ret_irq = IRQ_UART1_TX;
|
||||||
break;
|
break;
|
||||||
case CH_EPPI0:
|
case CH_EPPI0:
|
||||||
ret_irq = IRQ_EPPI0;
|
ret_irq = IRQ_EPPI0;
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* This file should be up to date with:
|
/* This file should be up to date with:
|
||||||
* - Revision H, 01/16/2009; ADSP-BF542/BF544/BF547/BF548/BF549 Blackfin Processor Anomaly List
|
* - Revision I, 07/23/2009; ADSP-BF542/BF544/BF547/BF548/BF549 Blackfin Processor Anomaly List
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _MACH_ANOMALY_H_
|
#ifndef _MACH_ANOMALY_H_
|
||||||
@ -162,6 +162,8 @@
|
|||||||
#define ANOMALY_05000430 (__SILICON_REVISION__ >= 2)
|
#define ANOMALY_05000430 (__SILICON_REVISION__ >= 2)
|
||||||
/* Incorrect Use of Stack in Lockbox Firmware During Authentication */
|
/* Incorrect Use of Stack in Lockbox Firmware During Authentication */
|
||||||
#define ANOMALY_05000431 (__SILICON_REVISION__ < 3)
|
#define ANOMALY_05000431 (__SILICON_REVISION__ < 3)
|
||||||
|
/* SW Breakpoints Ignored Upon Return From Lockbox Authentication */
|
||||||
|
#define ANOMALY_05000434 (1)
|
||||||
/* OTP Write Accesses Not Supported */
|
/* OTP Write Accesses Not Supported */
|
||||||
#define ANOMALY_05000442 (__SILICON_REVISION__ < 1)
|
#define ANOMALY_05000442 (__SILICON_REVISION__ < 1)
|
||||||
/* IFLUSH Instruction at End of Hardware Loop Causes Infinite Stall */
|
/* IFLUSH Instruction at End of Hardware Loop Causes Infinite Stall */
|
||||||
@ -176,12 +178,26 @@
|
|||||||
#define ANOMALY_05000449 (__SILICON_REVISION__ == 1)
|
#define ANOMALY_05000449 (__SILICON_REVISION__ == 1)
|
||||||
/* USB DMA Mode 1 Short Packet Data Corruption */
|
/* USB DMA Mode 1 Short Packet Data Corruption */
|
||||||
#define ANOMALY_05000450 (1)
|
#define ANOMALY_05000450 (1)
|
||||||
|
/* Incorrect Default Hysteresis Setting for RESET, NMI, and BMODE Signals */
|
||||||
|
#define ANOMALY_05000452 (__SILICON_REVISION__ < 1)
|
||||||
/* USB Receive Interrupt Is Not Generated in DMA Mode 1 */
|
/* USB Receive Interrupt Is Not Generated in DMA Mode 1 */
|
||||||
#define ANOMALY_05000456 (__SILICON_REVISION__ < 3)
|
#define ANOMALY_05000456 (1)
|
||||||
|
/* Host DMA Port Responds to Certain Bus Activity Without HOST_CE Assertion */
|
||||||
|
#define ANOMALY_05000457 (1)
|
||||||
|
/* USB DMA Mode 1 Failure When Multiple USB DMA Channels Are Concurrently Enabled */
|
||||||
|
#define ANOMALY_05000460 (1)
|
||||||
/* False Hardware Error when RETI Points to Invalid Memory */
|
/* False Hardware Error when RETI Points to Invalid Memory */
|
||||||
#define ANOMALY_05000461 (1)
|
#define ANOMALY_05000461 (1)
|
||||||
|
/* Synchronization Problem at Startup May Cause SPORT Transmit Channels to Misalign */
|
||||||
|
#define ANOMALY_05000462 (1)
|
||||||
|
/* USB DMA RX Data Corruption */
|
||||||
|
#define ANOMALY_05000463 (1)
|
||||||
|
/* USB TX DMA Hang */
|
||||||
|
#define ANOMALY_05000464 (1)
|
||||||
/* USB Rx DMA hang */
|
/* USB Rx DMA hang */
|
||||||
#define ANOMALY_05000465 (1)
|
#define ANOMALY_05000465 (1)
|
||||||
|
/* TxPktRdy Bit Not Set for Transmit Endpoint When Core and DMA Access USB Endpoint FIFOs Simultaneously */
|
||||||
|
#define ANOMALY_05000466 (1)
|
||||||
/* Possible RX data corruption when control & data EP FIFOs are accessed via the core */
|
/* Possible RX data corruption when control & data EP FIFOs are accessed via the core */
|
||||||
#define ANOMALY_05000467 (1)
|
#define ANOMALY_05000467 (1)
|
||||||
|
|
||||||
@ -230,6 +246,7 @@
|
|||||||
#define ANOMALY_05000364 (0)
|
#define ANOMALY_05000364 (0)
|
||||||
#define ANOMALY_05000380 (0)
|
#define ANOMALY_05000380 (0)
|
||||||
#define ANOMALY_05000400 (0)
|
#define ANOMALY_05000400 (0)
|
||||||
|
#define ANOMALY_05000402 (0)
|
||||||
#define ANOMALY_05000412 (0)
|
#define ANOMALY_05000412 (0)
|
||||||
#define ANOMALY_05000432 (0)
|
#define ANOMALY_05000432 (0)
|
||||||
#define ANOMALY_05000435 (0)
|
#define ANOMALY_05000435 (0)
|
||||||
|
@ -72,97 +72,8 @@
|
|||||||
#include "cdefBF549.h"
|
#include "cdefBF549.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* UART 1*/
|
|
||||||
#define bfin_read_UART_THR() bfin_read_UART1_THR()
|
|
||||||
#define bfin_write_UART_THR(val) bfin_write_UART1_THR(val)
|
|
||||||
#define bfin_read_UART_RBR() bfin_read_UART1_RBR()
|
|
||||||
#define bfin_write_UART_RBR(val) bfin_write_UART1_RBR(val)
|
|
||||||
#define bfin_read_UART_DLL() bfin_read_UART1_DLL()
|
|
||||||
#define bfin_write_UART_DLL(val) bfin_write_UART1_DLL(val)
|
|
||||||
#define bfin_read_UART_IER() bfin_read_UART1_IER()
|
|
||||||
#define bfin_write_UART_IER(val) bfin_write_UART1_IER(val)
|
|
||||||
#define bfin_read_UART_DLH() bfin_read_UART1_DLH()
|
|
||||||
#define bfin_write_UART_DLH(val) bfin_write_UART1_DLH(val)
|
|
||||||
#define bfin_read_UART_IIR() bfin_read_UART1_IIR()
|
|
||||||
#define bfin_write_UART_IIR(val) bfin_write_UART1_IIR(val)
|
|
||||||
#define bfin_read_UART_LCR() bfin_read_UART1_LCR()
|
|
||||||
#define bfin_write_UART_LCR(val) bfin_write_UART1_LCR(val)
|
|
||||||
#define bfin_read_UART_MCR() bfin_read_UART1_MCR()
|
|
||||||
#define bfin_write_UART_MCR(val) bfin_write_UART1_MCR(val)
|
|
||||||
#define bfin_read_UART_LSR() bfin_read_UART1_LSR()
|
|
||||||
#define bfin_write_UART_LSR(val) bfin_write_UART1_LSR(val)
|
|
||||||
#define bfin_read_UART_SCR() bfin_read_UART1_SCR()
|
|
||||||
#define bfin_write_UART_SCR(val) bfin_write_UART1_SCR(val)
|
|
||||||
#define bfin_read_UART_GCTL() bfin_read_UART1_GCTL()
|
|
||||||
#define bfin_write_UART_GCTL(val) bfin_write_UART1_GCTL(val)
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* MAP used DEFINES from BF533 to BF54x - so we don't need to change
|
|
||||||
* them in the driver, kernel, etc. */
|
|
||||||
|
|
||||||
/* UART_IIR Register */
|
|
||||||
#define STATUS(x) ((x << 1) & 0x06)
|
|
||||||
#define STATUS_P1 0x02
|
|
||||||
#define STATUS_P0 0x01
|
|
||||||
|
|
||||||
/* UART 0*/
|
|
||||||
|
|
||||||
/* DMA Channel */
|
|
||||||
#define bfin_read_CH_UART_RX() bfin_read_CH_UART1_RX()
|
|
||||||
#define bfin_write_CH_UART_RX(val) bfin_write_CH_UART1_RX(val)
|
|
||||||
#define bfin_read_CH_UART_TX() bfin_read_CH_UART1_TX()
|
|
||||||
#define bfin_write_CH_UART_TX(val) bfin_write_CH_UART1_TX(val)
|
|
||||||
#define CH_UART_RX CH_UART1_RX
|
|
||||||
#define CH_UART_TX CH_UART1_TX
|
|
||||||
|
|
||||||
/* System Interrupt Controller */
|
|
||||||
#define bfin_read_IRQ_UART_RX() bfin_read_IRQ_UART1_RX()
|
|
||||||
#define bfin_write_IRQ_UART_RX(val) bfin_write_IRQ_UART1_RX(val)
|
|
||||||
#define bfin_read_IRQ_UART_TX() bfin_read_IRQ_UART1_TX()
|
|
||||||
#define bfin_write_IRQ_UART_TX(val) bfin_write_IRQ_UART1_TX(val)
|
|
||||||
#define bfin_read_IRQ_UART_ERROR() bfin_read_IRQ_UART1_ERROR()
|
|
||||||
#define bfin_write_IRQ_UART_ERROR(val) bfin_write_IRQ_UART1_ERROR(val)
|
|
||||||
#define IRQ_UART_RX IRQ_UART1_RX
|
|
||||||
#define IRQ_UART_TX IRQ_UART1_TX
|
|
||||||
#define IRQ_UART_ERROR IRQ_UART1_ERROR
|
|
||||||
|
|
||||||
/* MMR Registers*/
|
|
||||||
#define bfin_read_UART_THR() bfin_read_UART1_THR()
|
|
||||||
#define bfin_write_UART_THR(val) bfin_write_UART1_THR(val)
|
|
||||||
#define bfin_read_UART_RBR() bfin_read_UART1_RBR()
|
|
||||||
#define bfin_write_UART_RBR(val) bfin_write_UART1_RBR(val)
|
|
||||||
#define bfin_read_UART_DLL() bfin_read_UART1_DLL()
|
|
||||||
#define bfin_write_UART_DLL(val) bfin_write_UART1_DLL(val)
|
|
||||||
#define bfin_read_UART_IER() bfin_read_UART1_IER()
|
|
||||||
#define bfin_write_UART_IER(val) bfin_write_UART1_IER(val)
|
|
||||||
#define bfin_read_UART_DLH() bfin_read_UART1_DLH()
|
|
||||||
#define bfin_write_UART_DLH(val) bfin_write_UART1_DLH(val)
|
|
||||||
#define bfin_read_UART_IIR() bfin_read_UART1_IIR()
|
|
||||||
#define bfin_write_UART_IIR(val) bfin_write_UART1_IIR(val)
|
|
||||||
#define bfin_read_UART_LCR() bfin_read_UART1_LCR()
|
|
||||||
#define bfin_write_UART_LCR(val) bfin_write_UART1_LCR(val)
|
|
||||||
#define bfin_read_UART_MCR() bfin_read_UART1_MCR()
|
|
||||||
#define bfin_write_UART_MCR(val) bfin_write_UART1_MCR(val)
|
|
||||||
#define bfin_read_UART_LSR() bfin_read_UART1_LSR()
|
|
||||||
#define bfin_write_UART_LSR(val) bfin_write_UART1_LSR(val)
|
|
||||||
#define bfin_read_UART_SCR() bfin_read_UART1_SCR()
|
|
||||||
#define bfin_write_UART_SCR(val) bfin_write_UART1_SCR(val)
|
|
||||||
#define bfin_read_UART_GCTL() bfin_read_UART1_GCTL()
|
|
||||||
#define bfin_write_UART_GCTL(val) bfin_write_UART1_GCTL(val)
|
|
||||||
|
|
||||||
#define BFIN_UART_THR UART1_THR
|
|
||||||
#define BFIN_UART_RBR UART1_RBR
|
|
||||||
#define BFIN_UART_DLL UART1_DLL
|
|
||||||
#define BFIN_UART_IER UART1_IER
|
|
||||||
#define BFIN_UART_DLH UART1_DLH
|
|
||||||
#define BFIN_UART_IIR UART1_IIR
|
|
||||||
#define BFIN_UART_LCR UART1_LCR
|
|
||||||
#define BFIN_UART_MCR UART1_MCR
|
|
||||||
#define BFIN_UART_LSR UART1_LSR
|
|
||||||
#define BFIN_UART_SCR UART1_SCR
|
|
||||||
#define BFIN_UART_GCTL UART1_GCTL
|
|
||||||
|
|
||||||
#define BFIN_UART_NR_PORTS 4
|
#define BFIN_UART_NR_PORTS 4
|
||||||
|
|
||||||
#define OFFSET_DLL 0x00 /* Divisor Latch (Low-Byte) */
|
#define OFFSET_DLL 0x00 /* Divisor Latch (Low-Byte) */
|
||||||
|
@ -42,6 +42,7 @@
|
|||||||
#include <asm/bfin5xx_spi.h>
|
#include <asm/bfin5xx_spi.h>
|
||||||
#include <asm/portmux.h>
|
#include <asm/portmux.h>
|
||||||
#include <asm/dpmc.h>
|
#include <asm/dpmc.h>
|
||||||
|
#include <linux/mtd/physmap.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Name the Board for the /proc/cpuinfo
|
* Name the Board for the /proc/cpuinfo
|
||||||
@ -98,13 +99,6 @@ static struct bfin5xx_spi_chip ad1836_spi_chip_info = {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE)
|
|
||||||
static struct bfin5xx_spi_chip ad9960_spi_chip_info = {
|
|
||||||
.enable_dma = 0,
|
|
||||||
.bits_per_word = 16,
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
||||||
static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
||||||
.enable_dma = 0,
|
.enable_dma = 0,
|
||||||
@ -139,28 +133,19 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
|||||||
|
|
||||||
#if defined(CONFIG_SND_BLACKFIN_AD1836) || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
#if defined(CONFIG_SND_BLACKFIN_AD1836) || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "ad1836-spi",
|
.modalias = "ad1836",
|
||||||
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
|
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
|
||||||
.bus_num = 0,
|
.bus_num = 0,
|
||||||
.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
||||||
.controller_data = &ad1836_spi_chip_info,
|
.controller_data = &ad1836_spi_chip_info,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE)
|
|
||||||
{
|
|
||||||
.modalias = "ad9960-spi",
|
|
||||||
.max_speed_hz = 10000000, /* max spi clock (SCK) speed in HZ */
|
|
||||||
.bus_num = 0,
|
|
||||||
.chip_select = 1,
|
|
||||||
.controller_data = &ad9960_spi_chip_info,
|
|
||||||
},
|
|
||||||
#endif
|
|
||||||
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "mmc_spi",
|
.modalias = "mmc_spi",
|
||||||
.max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
|
.max_speed_hz = 20000000, /* max spi clock (SCK) speed in HZ */
|
||||||
.bus_num = 0,
|
.bus_num = 0,
|
||||||
.chip_select = 5,
|
.chip_select = 1,
|
||||||
.controller_data = &mmc_spi_chip_info,
|
.controller_data = &mmc_spi_chip_info,
|
||||||
.mode = SPI_MODE_3,
|
.mode = SPI_MODE_3,
|
||||||
},
|
},
|
||||||
@ -213,6 +198,13 @@ static struct platform_device hitachi_fb_device = {
|
|||||||
|
|
||||||
|
|
||||||
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
||||||
|
#include <linux/smc91x.h>
|
||||||
|
|
||||||
|
static struct smc91x_platdata smc91x_info = {
|
||||||
|
.flags = SMC91X_USE_32BIT | SMC91X_NOWAIT,
|
||||||
|
.leda = RPC_LED_100_10,
|
||||||
|
.ledb = RPC_LED_TX_RX,
|
||||||
|
};
|
||||||
|
|
||||||
static struct resource smc91x_resources[] = {
|
static struct resource smc91x_resources[] = {
|
||||||
{
|
{
|
||||||
@ -231,6 +223,65 @@ static struct platform_device smc91x_device = {
|
|||||||
.id = 0,
|
.id = 0,
|
||||||
.num_resources = ARRAY_SIZE(smc91x_resources),
|
.num_resources = ARRAY_SIZE(smc91x_resources),
|
||||||
.resource = smc91x_resources,
|
.resource = smc91x_resources,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &smc91x_info,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
|
||||||
|
#include <linux/smsc911x.h>
|
||||||
|
|
||||||
|
static struct resource smsc911x_resources[] = {
|
||||||
|
{
|
||||||
|
.name = "smsc911x-memory",
|
||||||
|
.start = 0x24008000,
|
||||||
|
.end = 0x24008000 + 0xFF,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_PF43,
|
||||||
|
.end = IRQ_PF43,
|
||||||
|
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct smsc911x_platform_config smsc911x_config = {
|
||||||
|
.flags = SMSC911X_USE_16BIT,
|
||||||
|
.irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
|
||||||
|
.irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN,
|
||||||
|
.phy_interface = PHY_INTERFACE_MODE_MII,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device smsc911x_device = {
|
||||||
|
.name = "smsc911x",
|
||||||
|
.id = 0,
|
||||||
|
.num_resources = ARRAY_SIZE(smsc911x_resources),
|
||||||
|
.resource = smsc911x_resources,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &smsc911x_config,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE)
|
||||||
|
static struct resource net2272_bfin_resources[] = {
|
||||||
|
{
|
||||||
|
.start = 0x24000000,
|
||||||
|
.end = 0x24000000 + 0x100,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
}, {
|
||||||
|
.start = IRQ_PF45,
|
||||||
|
.end = IRQ_PF45,
|
||||||
|
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device net2272_bfin_device = {
|
||||||
|
.name = "net2272",
|
||||||
|
.id = -1,
|
||||||
|
.num_resources = ARRAY_SIZE(net2272_bfin_resources),
|
||||||
|
.resource = net2272_bfin_resources,
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -369,6 +420,46 @@ static struct platform_device bfin_pata_device = {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
|
||||||
|
static struct mtd_partition para_partitions[] = {
|
||||||
|
{
|
||||||
|
.name = "bootloader(nor)",
|
||||||
|
.size = 0x40000,
|
||||||
|
.offset = 0,
|
||||||
|
}, {
|
||||||
|
.name = "linux kernel(nor)",
|
||||||
|
.size = 0x100000,
|
||||||
|
.offset = MTDPART_OFS_APPEND,
|
||||||
|
}, {
|
||||||
|
.name = "file system(nor)",
|
||||||
|
.size = MTDPART_SIZ_FULL,
|
||||||
|
.offset = MTDPART_OFS_APPEND,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct physmap_flash_data para_flash_data = {
|
||||||
|
.width = 2,
|
||||||
|
.parts = para_partitions,
|
||||||
|
.nr_parts = ARRAY_SIZE(para_partitions),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct resource para_flash_resource = {
|
||||||
|
.start = 0x20000000,
|
||||||
|
.end = 0x207fffff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device para_flash_device = {
|
||||||
|
.name = "physmap-flash",
|
||||||
|
.id = 0,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = ¶_flash_data,
|
||||||
|
},
|
||||||
|
.num_resources = 1,
|
||||||
|
.resource = ¶_flash_resource,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
static const unsigned int cclk_vlev_datasheet[] =
|
static const unsigned int cclk_vlev_datasheet[] =
|
||||||
{
|
{
|
||||||
VRPAIR(VLEV_085, 250000000),
|
VRPAIR(VLEV_085, 250000000),
|
||||||
@ -422,6 +513,14 @@ static struct platform_device *cm_bf561_devices[] __initdata = {
|
|||||||
&smc91x_device,
|
&smc91x_device,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
|
||||||
|
&smsc911x_device,
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE)
|
||||||
|
&net2272_bfin_device,
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
||||||
&bfin_spi0_device,
|
&bfin_spi0_device,
|
||||||
#endif
|
#endif
|
||||||
@ -430,6 +529,10 @@ static struct platform_device *cm_bf561_devices[] __initdata = {
|
|||||||
&bfin_pata_device,
|
&bfin_pata_device,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
|
||||||
|
¶_flash_device,
|
||||||
|
#endif
|
||||||
|
|
||||||
&bfin_gpios_device,
|
&bfin_gpios_device,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -147,6 +147,14 @@ static struct platform_device net2272_bfin_device = {
|
|||||||
* Driver needs to know address, irq and flag pin.
|
* Driver needs to know address, irq and flag pin.
|
||||||
*/
|
*/
|
||||||
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
||||||
|
#include <linux/smc91x.h>
|
||||||
|
|
||||||
|
static struct smc91x_platdata smc91x_info = {
|
||||||
|
.flags = SMC91X_USE_32BIT | SMC91X_NOWAIT,
|
||||||
|
.leda = RPC_LED_100_10,
|
||||||
|
.ledb = RPC_LED_TX_RX,
|
||||||
|
};
|
||||||
|
|
||||||
static struct resource smc91x_resources[] = {
|
static struct resource smc91x_resources[] = {
|
||||||
{
|
{
|
||||||
.name = "smc91x-regs",
|
.name = "smc91x-regs",
|
||||||
@ -166,6 +174,9 @@ static struct platform_device smc91x_device = {
|
|||||||
.id = 0,
|
.id = 0,
|
||||||
.num_resources = ARRAY_SIZE(smc91x_resources),
|
.num_resources = ARRAY_SIZE(smc91x_resources),
|
||||||
.resource = smc91x_resources,
|
.resource = smc91x_resources,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &smc91x_info,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -334,7 +345,7 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
|||||||
#if defined(CONFIG_SND_BLACKFIN_AD1836) \
|
#if defined(CONFIG_SND_BLACKFIN_AD1836) \
|
||||||
|| defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
|| defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
||||||
{
|
{
|
||||||
.modalias = "ad1836-spi",
|
.modalias = "ad1836",
|
||||||
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
|
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
|
||||||
.bus_num = 0,
|
.bus_num = 0,
|
||||||
.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
||||||
|
@ -262,6 +262,8 @@
|
|||||||
#define ANOMALY_05000366 (1)
|
#define ANOMALY_05000366 (1)
|
||||||
/* Possible RETS Register Corruption when Subroutine Is under 5 Cycles in Duration */
|
/* Possible RETS Register Corruption when Subroutine Is under 5 Cycles in Duration */
|
||||||
#define ANOMALY_05000371 (1)
|
#define ANOMALY_05000371 (1)
|
||||||
|
/* SSYNC Stalls Processor when Executed from Non-Cacheable Memory */
|
||||||
|
#define ANOMALY_05000402 (__SILICON_REVISION__ == 4)
|
||||||
/* Level-Sensitive External GPIO Wakeups May Cause Indefinite Stall */
|
/* Level-Sensitive External GPIO Wakeups May Cause Indefinite Stall */
|
||||||
#define ANOMALY_05000403 (1)
|
#define ANOMALY_05000403 (1)
|
||||||
/* TESTSET Instruction Causes Data Corruption with Writeback Data Cache Enabled */
|
/* TESTSET Instruction Causes Data Corruption with Writeback Data Cache Enabled */
|
||||||
|
@ -85,16 +85,10 @@ ENTRY(_coreb_trampoline_start)
|
|||||||
R0 = ~ENICPLB;
|
R0 = ~ENICPLB;
|
||||||
R0 = R0 & R1;
|
R0 = R0 & R1;
|
||||||
|
|
||||||
/* Anomaly 05000125 */
|
/* Disabling of CPLBs should be proceeded by a CSYNC */
|
||||||
#ifdef ANOMALY_05000125
|
CSYNC;
|
||||||
CLI R2;
|
|
||||||
SSYNC;
|
|
||||||
#endif
|
|
||||||
[p0] = R0;
|
[p0] = R0;
|
||||||
SSYNC;
|
SSYNC;
|
||||||
#ifdef ANOMALY_05000125
|
|
||||||
STI R2;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Turn off the dcache */
|
/* Turn off the dcache */
|
||||||
p0.l = LO(DMEM_CONTROL);
|
p0.l = LO(DMEM_CONTROL);
|
||||||
@ -103,16 +97,10 @@ ENTRY(_coreb_trampoline_start)
|
|||||||
R0 = ~ENDCPLB;
|
R0 = ~ENDCPLB;
|
||||||
R0 = R0 & R1;
|
R0 = R0 & R1;
|
||||||
|
|
||||||
/* Anomaly 05000125 */
|
/* Disabling of CPLBs should be proceeded by a CSYNC */
|
||||||
#ifdef ANOMALY_05000125
|
CSYNC;
|
||||||
CLI R2;
|
|
||||||
SSYNC;
|
|
||||||
#endif
|
|
||||||
[p0] = R0;
|
[p0] = R0;
|
||||||
SSYNC;
|
SSYNC;
|
||||||
#ifdef ANOMALY_05000125
|
|
||||||
STI R2;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* in case of double faults, save a few things */
|
/* in case of double faults, save a few things */
|
||||||
p0.l = _init_retx_coreb;
|
p0.l = _init_retx_coreb;
|
||||||
@ -126,22 +114,22 @@ ENTRY(_coreb_trampoline_start)
|
|||||||
* below
|
* below
|
||||||
*/
|
*/
|
||||||
GET_PDA(p0, r0);
|
GET_PDA(p0, r0);
|
||||||
r7 = [p0 + PDA_RETX];
|
r7 = [p0 + PDA_DF_RETX];
|
||||||
p1.l = _init_saved_retx_coreb;
|
p1.l = _init_saved_retx_coreb;
|
||||||
p1.h = _init_saved_retx_coreb;
|
p1.h = _init_saved_retx_coreb;
|
||||||
[p1] = r7;
|
[p1] = r7;
|
||||||
|
|
||||||
r7 = [p0 + PDA_DCPLB];
|
r7 = [p0 + PDA_DF_DCPLB];
|
||||||
p1.l = _init_saved_dcplb_fault_addr_coreb;
|
p1.l = _init_saved_dcplb_fault_addr_coreb;
|
||||||
p1.h = _init_saved_dcplb_fault_addr_coreb;
|
p1.h = _init_saved_dcplb_fault_addr_coreb;
|
||||||
[p1] = r7;
|
[p1] = r7;
|
||||||
|
|
||||||
r7 = [p0 + PDA_ICPLB];
|
r7 = [p0 + PDA_DF_ICPLB];
|
||||||
p1.l = _init_saved_icplb_fault_addr_coreb;
|
p1.l = _init_saved_icplb_fault_addr_coreb;
|
||||||
p1.h = _init_saved_icplb_fault_addr_coreb;
|
p1.h = _init_saved_icplb_fault_addr_coreb;
|
||||||
[p1] = r7;
|
[p1] = r7;
|
||||||
|
|
||||||
r7 = [p0 + PDA_SEQSTAT];
|
r7 = [p0 + PDA_DF_SEQSTAT];
|
||||||
p1.l = _init_saved_seqstat_coreb;
|
p1.l = _init_saved_seqstat_coreb;
|
||||||
p1.h = _init_saved_seqstat_coreb;
|
p1.h = _init_saved_seqstat_coreb;
|
||||||
[p1] = r7;
|
[p1] = r7;
|
||||||
|
@ -6,7 +6,6 @@ obj-y := \
|
|||||||
cache.o cache-c.o entry.o head.o \
|
cache.o cache-c.o entry.o head.o \
|
||||||
interrupt.o arch_checks.o ints-priority.o
|
interrupt.o arch_checks.o ints-priority.o
|
||||||
|
|
||||||
obj-$(CONFIG_BFIN_ICACHE_LOCK) += lock.o
|
|
||||||
obj-$(CONFIG_PM) += pm.o dpmc_modes.o
|
obj-$(CONFIG_PM) += pm.o dpmc_modes.o
|
||||||
obj-$(CONFIG_CPU_FREQ) += cpufreq.o
|
obj-$(CONFIG_CPU_FREQ) += cpufreq.o
|
||||||
obj-$(CONFIG_CPU_VOLTAGE) += dpmc.o
|
obj-$(CONFIG_CPU_VOLTAGE) += dpmc.o
|
||||||
|
@ -1,14 +1,16 @@
|
|||||||
/*
|
/*
|
||||||
* Blackfin cache control code (simpler control-style functions)
|
* Blackfin cache control code (simpler control-style functions)
|
||||||
*
|
*
|
||||||
* Copyright 2004-2008 Analog Devices Inc.
|
* Copyright 2004-2009 Analog Devices Inc.
|
||||||
*
|
*
|
||||||
* Enter bugs at http://blackfin.uclinux.org/
|
* Enter bugs at http://blackfin.uclinux.org/
|
||||||
*
|
*
|
||||||
* Licensed under the GPL-2 or later.
|
* Licensed under the GPL-2 or later.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <linux/init.h>
|
||||||
#include <asm/blackfin.h>
|
#include <asm/blackfin.h>
|
||||||
|
#include <asm/cplbinit.h>
|
||||||
|
|
||||||
/* Invalidate the Entire Data cache by
|
/* Invalidate the Entire Data cache by
|
||||||
* clearing DMC[1:0] bits
|
* clearing DMC[1:0] bits
|
||||||
@ -34,3 +36,43 @@ void blackfin_invalidate_entire_icache(void)
|
|||||||
SSYNC();
|
SSYNC();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(CONFIG_BFIN_ICACHE) || defined(CONFIG_BFIN_DCACHE)
|
||||||
|
|
||||||
|
static void
|
||||||
|
bfin_cache_init(struct cplb_entry *cplb_tbl, unsigned long cplb_addr,
|
||||||
|
unsigned long cplb_data, unsigned long mem_control,
|
||||||
|
unsigned long mem_mask)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_CPLBS; i++) {
|
||||||
|
bfin_write32(cplb_addr + i * 4, cplb_tbl[i].addr);
|
||||||
|
bfin_write32(cplb_data + i * 4, cplb_tbl[i].data);
|
||||||
|
}
|
||||||
|
|
||||||
|
_enable_cplb(mem_control, mem_mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_BFIN_ICACHE
|
||||||
|
void __cpuinit bfin_icache_init(struct cplb_entry *icplb_tbl)
|
||||||
|
{
|
||||||
|
bfin_cache_init(icplb_tbl, ICPLB_ADDR0, ICPLB_DATA0, IMEM_CONTROL,
|
||||||
|
(IMC | ENICPLB));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_BFIN_DCACHE
|
||||||
|
void __cpuinit bfin_dcache_init(struct cplb_entry *dcplb_tbl)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Anomaly notes:
|
||||||
|
* 05000287 - We implement workaround #2 - Change the DMEM_CONTROL
|
||||||
|
* register, so that the port preferences for DAG0 and DAG1 are set
|
||||||
|
* to port B
|
||||||
|
*/
|
||||||
|
bfin_cache_init(dcplb_tbl, DCPLB_ADDR0, DCPLB_DATA0, DMEM_CONTROL,
|
||||||
|
(DMEM_CNTR | PORT_PREF0 | (ANOMALY_05000287 ? PORT_PREF1 : 0)));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
@ -301,27 +301,31 @@ ENTRY(_ex_replaceable)
|
|||||||
nop;
|
nop;
|
||||||
|
|
||||||
ENTRY(_ex_trap_c)
|
ENTRY(_ex_trap_c)
|
||||||
|
/* The only thing that has been saved in this context is
|
||||||
|
* (R7:6,P5:4), ASTAT & SP - don't use anything else
|
||||||
|
*/
|
||||||
|
|
||||||
|
GET_PDA(p5, r6);
|
||||||
|
|
||||||
/* Make sure we are not in a double fault */
|
/* Make sure we are not in a double fault */
|
||||||
p4.l = lo(IPEND);
|
p4.l = lo(IPEND);
|
||||||
p4.h = hi(IPEND);
|
p4.h = hi(IPEND);
|
||||||
r7 = [p4];
|
r7 = [p4];
|
||||||
CC = BITTST (r7, 5);
|
CC = BITTST (r7, 5);
|
||||||
if CC jump _double_fault;
|
if CC jump _double_fault;
|
||||||
|
[p5 + PDA_EXIPEND] = r7;
|
||||||
|
|
||||||
/* Call C code (trap_c) to handle the exception, which most
|
/* Call C code (trap_c) to handle the exception, which most
|
||||||
* likely involves sending a signal to the current process.
|
* likely involves sending a signal to the current process.
|
||||||
* To avoid double faults, lower our priority to IRQ5 first.
|
* To avoid double faults, lower our priority to IRQ5 first.
|
||||||
*/
|
*/
|
||||||
P5.h = _exception_to_level5;
|
r7.h = _exception_to_level5;
|
||||||
P5.l = _exception_to_level5;
|
r7.l = _exception_to_level5;
|
||||||
p4.l = lo(EVT5);
|
p4.l = lo(EVT5);
|
||||||
p4.h = hi(EVT5);
|
p4.h = hi(EVT5);
|
||||||
[p4] = p5;
|
[p4] = r7;
|
||||||
csync;
|
csync;
|
||||||
|
|
||||||
GET_PDA(p5, r6);
|
|
||||||
#ifndef CONFIG_DEBUG_DOUBLEFAULT
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Save these registers, as they are only valid in exception context
|
* Save these registers, as they are only valid in exception context
|
||||||
* (where we are now - as soon as we defer to IRQ5, they can change)
|
* (where we are now - as soon as we defer to IRQ5, they can change)
|
||||||
@ -341,7 +345,10 @@ ENTRY(_ex_trap_c)
|
|||||||
|
|
||||||
r6 = retx;
|
r6 = retx;
|
||||||
[p5 + PDA_RETX] = r6;
|
[p5 + PDA_RETX] = r6;
|
||||||
#endif
|
|
||||||
|
r6 = SEQSTAT;
|
||||||
|
[p5 + PDA_SEQSTAT] = r6;
|
||||||
|
|
||||||
/* Save the state of single stepping */
|
/* Save the state of single stepping */
|
||||||
r6 = SYSCFG;
|
r6 = SYSCFG;
|
||||||
[p5 + PDA_SYSCFG] = r6;
|
[p5 + PDA_SYSCFG] = r6;
|
||||||
@ -349,8 +356,7 @@ ENTRY(_ex_trap_c)
|
|||||||
BITCLR(r6, SYSCFG_SSSTEP_P);
|
BITCLR(r6, SYSCFG_SSSTEP_P);
|
||||||
SYSCFG = r6;
|
SYSCFG = r6;
|
||||||
|
|
||||||
/* Disable all interrupts, but make sure level 5 is enabled so
|
/* Save the current IMASK, since we change in order to jump to level 5 */
|
||||||
* we can switch to that level. Save the old mask. */
|
|
||||||
cli r6;
|
cli r6;
|
||||||
[p5 + PDA_EXIMASK] = r6;
|
[p5 + PDA_EXIMASK] = r6;
|
||||||
|
|
||||||
@ -358,9 +364,21 @@ ENTRY(_ex_trap_c)
|
|||||||
p4.h = hi(SAFE_USER_INSTRUCTION);
|
p4.h = hi(SAFE_USER_INSTRUCTION);
|
||||||
retx = p4;
|
retx = p4;
|
||||||
|
|
||||||
|
/* Disable all interrupts, but make sure level 5 is enabled so
|
||||||
|
* we can switch to that level.
|
||||||
|
*/
|
||||||
r6 = 0x3f;
|
r6 = 0x3f;
|
||||||
sti r6;
|
sti r6;
|
||||||
|
|
||||||
|
/* In case interrupts are disabled IPEND[4] (global interrupt disable bit)
|
||||||
|
* clear it (re-enabling interrupts again) by the special sequence of pushing
|
||||||
|
* RETI onto the stack. This way we can lower ourselves to IVG5 even if the
|
||||||
|
* exception was taken after the interrupt handler was called but before it
|
||||||
|
* got a chance to enable global interrupts itself.
|
||||||
|
*/
|
||||||
|
[--sp] = reti;
|
||||||
|
sp += 4;
|
||||||
|
|
||||||
raise 5;
|
raise 5;
|
||||||
jump.s _bfin_return_from_exception;
|
jump.s _bfin_return_from_exception;
|
||||||
ENDPROC(_ex_trap_c)
|
ENDPROC(_ex_trap_c)
|
||||||
@ -379,8 +397,7 @@ ENTRY(_double_fault)
|
|||||||
|
|
||||||
R5 = [P4]; /* Control Register*/
|
R5 = [P4]; /* Control Register*/
|
||||||
BITCLR(R5,ENICPLB_P);
|
BITCLR(R5,ENICPLB_P);
|
||||||
SSYNC; /* SSYNC required before writing to IMEM_CONTROL. */
|
CSYNC; /* Disabling of CPLBs should be proceeded by a CSYNC */
|
||||||
.align 8;
|
|
||||||
[P4] = R5;
|
[P4] = R5;
|
||||||
SSYNC;
|
SSYNC;
|
||||||
|
|
||||||
@ -388,8 +405,7 @@ ENTRY(_double_fault)
|
|||||||
P4.H = HI(DMEM_CONTROL);
|
P4.H = HI(DMEM_CONTROL);
|
||||||
R5 = [P4];
|
R5 = [P4];
|
||||||
BITCLR(R5,ENDCPLB_P);
|
BITCLR(R5,ENDCPLB_P);
|
||||||
SSYNC; /* SSYNC required before writing to DMEM_CONTROL. */
|
CSYNC; /* Disabling of CPLBs should be proceeded by a CSYNC */
|
||||||
.align 8;
|
|
||||||
[P4] = R5;
|
[P4] = R5;
|
||||||
SSYNC;
|
SSYNC;
|
||||||
|
|
||||||
@ -420,47 +436,55 @@ ENDPROC(_double_fault)
|
|||||||
ENTRY(_exception_to_level5)
|
ENTRY(_exception_to_level5)
|
||||||
SAVE_ALL_SYS
|
SAVE_ALL_SYS
|
||||||
|
|
||||||
GET_PDA(p4, r7); /* Fetch current PDA */
|
GET_PDA(p5, r7); /* Fetch current PDA */
|
||||||
r6 = [p4 + PDA_RETX];
|
r6 = [p5 + PDA_RETX];
|
||||||
[sp + PT_PC] = r6;
|
[sp + PT_PC] = r6;
|
||||||
|
|
||||||
r6 = [p4 + PDA_SYSCFG];
|
r6 = [p5 + PDA_SYSCFG];
|
||||||
[sp + PT_SYSCFG] = r6;
|
[sp + PT_SYSCFG] = r6;
|
||||||
|
|
||||||
/* Restore interrupt mask. We haven't pushed RETI, so this
|
r6 = [p5 + PDA_SEQSTAT]; /* Read back seqstat */
|
||||||
* doesn't enable interrupts until we return from this handler. */
|
[sp + PT_SEQSTAT] = r6;
|
||||||
r6 = [p4 + PDA_EXIMASK];
|
|
||||||
sti r6;
|
|
||||||
|
|
||||||
/* Restore the hardware error vector. */
|
/* Restore the hardware error vector. */
|
||||||
P5.h = _evt_ivhw;
|
r7.h = _evt_ivhw;
|
||||||
P5.l = _evt_ivhw;
|
r7.l = _evt_ivhw;
|
||||||
p4.l = lo(EVT5);
|
p4.l = lo(EVT5);
|
||||||
p4.h = hi(EVT5);
|
p4.h = hi(EVT5);
|
||||||
[p4] = p5;
|
[p4] = r7;
|
||||||
csync;
|
csync;
|
||||||
|
|
||||||
p2.l = lo(IPEND);
|
#ifdef CONFIG_DEBUG_DOUBLEFAULT
|
||||||
p2.h = hi(IPEND);
|
/* Now that we have the hardware error vector programmed properly
|
||||||
csync;
|
* we can re-enable interrupts (IPEND[4]), so if the _trap_c causes
|
||||||
r0 = [p2]; /* Read current IPEND */
|
* another hardware error, we can catch it (self-nesting).
|
||||||
[sp + PT_IPEND] = r0; /* Store IPEND */
|
*/
|
||||||
|
[--sp] = reti;
|
||||||
|
sp += 4;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
r7 = [p5 + PDA_EXIPEND] /* Read the IPEND from the Exception state */
|
||||||
|
[sp + PT_IPEND] = r7; /* Store IPEND onto the stack */
|
||||||
|
|
||||||
r0 = sp; /* stack frame pt_regs pointer argument ==> r0 */
|
r0 = sp; /* stack frame pt_regs pointer argument ==> r0 */
|
||||||
SP += -12;
|
SP += -12;
|
||||||
call _trap_c;
|
call _trap_c;
|
||||||
SP += 12;
|
SP += 12;
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_DOUBLEFAULT
|
/* If interrupts were off during the exception (IPEND[4] = 1), turn them off
|
||||||
/* Grab ILAT */
|
* before we return.
|
||||||
p2.l = lo(ILAT);
|
*/
|
||||||
p2.h = hi(ILAT);
|
CC = BITTST(r7, EVT_IRPTEN_P)
|
||||||
r0 = [p2];
|
if !CC jump 1f;
|
||||||
r1 = 0x20; /* Did I just cause anther HW error? */
|
/* this will load a random value into the reti register - but that is OK,
|
||||||
r0 = r0 & r1;
|
* since we do restore it to the correct value in the 'RESTORE_ALL_SYS' macro
|
||||||
CC = R0 == R1;
|
*/
|
||||||
if CC JUMP _double_fault;
|
sp += -4;
|
||||||
#endif
|
reti = [sp++];
|
||||||
|
1:
|
||||||
|
/* restore the interrupt mask (IMASK) */
|
||||||
|
r6 = [p5 + PDA_EXIMASK];
|
||||||
|
sti r6;
|
||||||
|
|
||||||
call _ret_from_exception;
|
call _ret_from_exception;
|
||||||
RESTORE_ALL_SYS
|
RESTORE_ALL_SYS
|
||||||
@ -474,7 +498,7 @@ ENTRY(_trap) /* Exception: 4th entry into system event table(supervisor mode)*/
|
|||||||
*/
|
*/
|
||||||
EX_SCRATCH_REG = sp;
|
EX_SCRATCH_REG = sp;
|
||||||
GET_PDA_SAFE(sp);
|
GET_PDA_SAFE(sp);
|
||||||
sp = [sp + PDA_EXSTACK]
|
sp = [sp + PDA_EXSTACK];
|
||||||
/* Try to deal with syscalls quickly. */
|
/* Try to deal with syscalls quickly. */
|
||||||
[--sp] = ASTAT;
|
[--sp] = ASTAT;
|
||||||
[--sp] = (R7:6,P5:4);
|
[--sp] = (R7:6,P5:4);
|
||||||
@ -489,14 +513,7 @@ ENTRY(_trap) /* Exception: 4th entry into system event table(supervisor mode)*/
|
|||||||
ssync;
|
ssync;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ANOMALY_05000283 || ANOMALY_05000315
|
ANOMALY_283_315_WORKAROUND(p5, r7)
|
||||||
cc = r7 == r7;
|
|
||||||
p5.h = HI(CHIPID);
|
|
||||||
p5.l = LO(CHIPID);
|
|
||||||
if cc jump 1f;
|
|
||||||
r7.l = W[p5];
|
|
||||||
1:
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_DOUBLEFAULT
|
#ifdef CONFIG_DEBUG_DOUBLEFAULT
|
||||||
/*
|
/*
|
||||||
@ -510,18 +527,18 @@ ENTRY(_trap) /* Exception: 4th entry into system event table(supervisor mode)*/
|
|||||||
p4.l = lo(DCPLB_FAULT_ADDR);
|
p4.l = lo(DCPLB_FAULT_ADDR);
|
||||||
p4.h = hi(DCPLB_FAULT_ADDR);
|
p4.h = hi(DCPLB_FAULT_ADDR);
|
||||||
r7 = [p4];
|
r7 = [p4];
|
||||||
[p5 + PDA_DCPLB] = r7;
|
[p5 + PDA_DF_DCPLB] = r7;
|
||||||
|
|
||||||
p4.l = lo(ICPLB_FAULT_ADDR);
|
p4.l = lo(ICPLB_FAULT_ADDR);
|
||||||
p4.h = hi(ICPLB_FAULT_ADDR);
|
p4.h = hi(ICPLB_FAULT_ADDR);
|
||||||
r7 = [p4];
|
r7 = [p4];
|
||||||
[p5 + PDA_ICPLB] = r7;
|
[p5 + PDA_DF_ICPLB] = r7;
|
||||||
|
|
||||||
r6 = retx;
|
r7 = retx;
|
||||||
[p5 + PDA_RETX] = r6;
|
[p5 + PDA_DF_RETX] = r7;
|
||||||
|
|
||||||
r7 = SEQSTAT; /* reason code is in bit 5:0 */
|
r7 = SEQSTAT; /* reason code is in bit 5:0 */
|
||||||
[p5 + PDA_SEQSTAT] = r7;
|
[p5 + PDA_DF_SEQSTAT] = r7;
|
||||||
#else
|
#else
|
||||||
r7 = SEQSTAT; /* reason code is in bit 5:0 */
|
r7 = SEQSTAT; /* reason code is in bit 5:0 */
|
||||||
#endif
|
#endif
|
||||||
@ -686,8 +703,14 @@ ENTRY(_system_call)
|
|||||||
#ifdef CONFIG_IPIPE
|
#ifdef CONFIG_IPIPE
|
||||||
cc = BITTST(r7, TIF_IRQ_SYNC);
|
cc = BITTST(r7, TIF_IRQ_SYNC);
|
||||||
if !cc jump .Lsyscall_no_irqsync;
|
if !cc jump .Lsyscall_no_irqsync;
|
||||||
|
/*
|
||||||
|
* Clear IPEND[4] manually to undo what resume_userspace_1 just did;
|
||||||
|
* we need this so that high priority domain interrupts may still
|
||||||
|
* preempt the current domain while the pipeline log is being played
|
||||||
|
* back.
|
||||||
|
*/
|
||||||
[--sp] = reti;
|
[--sp] = reti;
|
||||||
r0 = [sp++];
|
SP += 4; /* don't merge with next insn to keep the pattern obvious */
|
||||||
SP += -12;
|
SP += -12;
|
||||||
call ___ipipe_sync_root;
|
call ___ipipe_sync_root;
|
||||||
SP += 12;
|
SP += 12;
|
||||||
@ -699,7 +722,7 @@ ENTRY(_system_call)
|
|||||||
|
|
||||||
/* Reenable interrupts. */
|
/* Reenable interrupts. */
|
||||||
[--sp] = reti;
|
[--sp] = reti;
|
||||||
r0 = [sp++];
|
sp += 4;
|
||||||
|
|
||||||
SP += -12;
|
SP += -12;
|
||||||
call _schedule;
|
call _schedule;
|
||||||
@ -715,7 +738,7 @@ ENTRY(_system_call)
|
|||||||
.Lsyscall_do_signals:
|
.Lsyscall_do_signals:
|
||||||
/* Reenable interrupts. */
|
/* Reenable interrupts. */
|
||||||
[--sp] = reti;
|
[--sp] = reti;
|
||||||
r0 = [sp++];
|
sp += 4;
|
||||||
|
|
||||||
r0 = sp;
|
r0 = sp;
|
||||||
SP += -12;
|
SP += -12;
|
||||||
@ -725,10 +748,6 @@ ENTRY(_system_call)
|
|||||||
.Lsyscall_really_exit:
|
.Lsyscall_really_exit:
|
||||||
r5 = [sp + PT_RESERVED];
|
r5 = [sp + PT_RESERVED];
|
||||||
rets = r5;
|
rets = r5;
|
||||||
#ifdef CONFIG_IPIPE
|
|
||||||
[--sp] = reti;
|
|
||||||
r5 = [sp++];
|
|
||||||
#endif /* CONFIG_IPIPE */
|
|
||||||
rts;
|
rts;
|
||||||
ENDPROC(_system_call)
|
ENDPROC(_system_call)
|
||||||
|
|
||||||
@ -816,13 +835,13 @@ ENDPROC(_resume)
|
|||||||
|
|
||||||
ENTRY(_ret_from_exception)
|
ENTRY(_ret_from_exception)
|
||||||
#ifdef CONFIG_IPIPE
|
#ifdef CONFIG_IPIPE
|
||||||
[--sp] = rets;
|
p2.l = _per_cpu__ipipe_percpu_domain;
|
||||||
SP += -12;
|
p2.h = _per_cpu__ipipe_percpu_domain;
|
||||||
call ___ipipe_check_root
|
r0.l = _ipipe_root;
|
||||||
SP += 12
|
r0.h = _ipipe_root;
|
||||||
rets = [sp++];
|
r2 = [p2];
|
||||||
cc = r0 == 0;
|
cc = r0 == r2;
|
||||||
if cc jump 4f; /* not on behalf of Linux, get out */
|
if !cc jump 4f; /* not on behalf of the root domain, get out */
|
||||||
#endif /* CONFIG_IPIPE */
|
#endif /* CONFIG_IPIPE */
|
||||||
p2.l = lo(IPEND);
|
p2.l = lo(IPEND);
|
||||||
p2.h = hi(IPEND);
|
p2.h = hi(IPEND);
|
||||||
@ -882,14 +901,9 @@ ENDPROC(_ret_from_exception)
|
|||||||
|
|
||||||
#ifdef CONFIG_IPIPE
|
#ifdef CONFIG_IPIPE
|
||||||
|
|
||||||
_sync_root_irqs:
|
|
||||||
[--sp] = reti; /* Reenable interrupts */
|
|
||||||
r0 = [sp++];
|
|
||||||
jump.l ___ipipe_sync_root
|
|
||||||
|
|
||||||
_resume_kernel_from_int:
|
_resume_kernel_from_int:
|
||||||
r0.l = _sync_root_irqs
|
r0.l = ___ipipe_sync_root;
|
||||||
r0.h = _sync_root_irqs
|
r0.h = ___ipipe_sync_root;
|
||||||
[--sp] = rets;
|
[--sp] = rets;
|
||||||
[--sp] = ( r7:4, p5:3 );
|
[--sp] = ( r7:4, p5:3 );
|
||||||
SP += -12;
|
SP += -12;
|
||||||
@ -953,10 +967,10 @@ ENTRY(_lower_to_irq14)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_HWERR
|
#ifdef CONFIG_DEBUG_HWERR
|
||||||
/* enable irq14 & hwerr interrupt, until we transition to _evt14_softirq */
|
/* enable irq14 & hwerr interrupt, until we transition to _evt_evt14 */
|
||||||
r0 = (EVT_IVG14 | EVT_IVHW | EVT_IRPTEN | EVT_EVX | EVT_NMI | EVT_RST | EVT_EMU);
|
r0 = (EVT_IVG14 | EVT_IVHW | EVT_IRPTEN | EVT_EVX | EVT_NMI | EVT_RST | EVT_EMU);
|
||||||
#else
|
#else
|
||||||
/* Only enable irq14 interrupt, until we transition to _evt14_softirq */
|
/* Only enable irq14 interrupt, until we transition to _evt_evt14 */
|
||||||
r0 = (EVT_IVG14 | EVT_IRPTEN | EVT_EVX | EVT_NMI | EVT_RST | EVT_EMU);
|
r0 = (EVT_IVG14 | EVT_IRPTEN | EVT_EVX | EVT_NMI | EVT_RST | EVT_EMU);
|
||||||
#endif
|
#endif
|
||||||
sti r0;
|
sti r0;
|
||||||
@ -964,7 +978,7 @@ ENTRY(_lower_to_irq14)
|
|||||||
rti;
|
rti;
|
||||||
ENDPROC(_lower_to_irq14)
|
ENDPROC(_lower_to_irq14)
|
||||||
|
|
||||||
ENTRY(_evt14_softirq)
|
ENTRY(_evt_evt14)
|
||||||
#ifdef CONFIG_DEBUG_HWERR
|
#ifdef CONFIG_DEBUG_HWERR
|
||||||
r0 = (EVT_IVHW | EVT_IRPTEN | EVT_EVX | EVT_NMI | EVT_RST | EVT_EMU);
|
r0 = (EVT_IVHW | EVT_IRPTEN | EVT_EVX | EVT_NMI | EVT_RST | EVT_EMU);
|
||||||
sti r0;
|
sti r0;
|
||||||
@ -974,7 +988,7 @@ ENTRY(_evt14_softirq)
|
|||||||
[--sp] = RETI;
|
[--sp] = RETI;
|
||||||
SP += 4;
|
SP += 4;
|
||||||
rts;
|
rts;
|
||||||
ENDPROC(_evt14_softirq)
|
ENDPROC(_evt_evt14)
|
||||||
|
|
||||||
ENTRY(_schedule_and_signal_from_int)
|
ENTRY(_schedule_and_signal_from_int)
|
||||||
/* To end up here, vector 15 was changed - so we have to change it
|
/* To end up here, vector 15 was changed - so we have to change it
|
||||||
@ -1004,6 +1018,12 @@ ENTRY(_schedule_and_signal_from_int)
|
|||||||
#endif
|
#endif
|
||||||
sti r0;
|
sti r0;
|
||||||
|
|
||||||
|
/* finish the userspace "atomic" functions for it */
|
||||||
|
r1 = FIXED_CODE_END;
|
||||||
|
r2 = [sp + PT_PC];
|
||||||
|
cc = r1 <= r2;
|
||||||
|
if cc jump .Lresume_userspace (bp);
|
||||||
|
|
||||||
r0 = sp;
|
r0 = sp;
|
||||||
sp += -12;
|
sp += -12;
|
||||||
call _finish_atomic_sections;
|
call _finish_atomic_sections;
|
||||||
@ -1107,14 +1127,7 @@ ENTRY(_early_trap)
|
|||||||
SAVE_ALL_SYS
|
SAVE_ALL_SYS
|
||||||
trace_buffer_stop(p0,r0);
|
trace_buffer_stop(p0,r0);
|
||||||
|
|
||||||
#if ANOMALY_05000283 || ANOMALY_05000315
|
ANOMALY_283_315_WORKAROUND(p4, r5)
|
||||||
cc = r5 == r5;
|
|
||||||
p4.h = HI(CHIPID);
|
|
||||||
p4.l = LO(CHIPID);
|
|
||||||
if cc jump 1f;
|
|
||||||
r5.l = W[p4];
|
|
||||||
1:
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Turn caches off, to ensure we don't get double exceptions */
|
/* Turn caches off, to ensure we don't get double exceptions */
|
||||||
|
|
||||||
@ -1123,9 +1136,7 @@ ENTRY(_early_trap)
|
|||||||
|
|
||||||
R5 = [P4]; /* Control Register*/
|
R5 = [P4]; /* Control Register*/
|
||||||
BITCLR(R5,ENICPLB_P);
|
BITCLR(R5,ENICPLB_P);
|
||||||
CLI R1;
|
CSYNC; /* Disabling of CPLBs should be proceeded by a CSYNC */
|
||||||
SSYNC; /* SSYNC required before writing to IMEM_CONTROL. */
|
|
||||||
.align 8;
|
|
||||||
[P4] = R5;
|
[P4] = R5;
|
||||||
SSYNC;
|
SSYNC;
|
||||||
|
|
||||||
@ -1133,11 +1144,9 @@ ENTRY(_early_trap)
|
|||||||
P4.H = HI(DMEM_CONTROL);
|
P4.H = HI(DMEM_CONTROL);
|
||||||
R5 = [P4];
|
R5 = [P4];
|
||||||
BITCLR(R5,ENDCPLB_P);
|
BITCLR(R5,ENDCPLB_P);
|
||||||
SSYNC; /* SSYNC required before writing to DMEM_CONTROL. */
|
CSYNC; /* Disabling of CPLBs should be proceeded by a CSYNC */
|
||||||
.align 8;
|
|
||||||
[P4] = R5;
|
[P4] = R5;
|
||||||
SSYNC;
|
SSYNC;
|
||||||
STI R1;
|
|
||||||
|
|
||||||
r0 = sp; /* stack frame pt_regs pointer argument ==> r0 */
|
r0 = sp; /* stack frame pt_regs pointer argument ==> r0 */
|
||||||
r1 = RETX;
|
r1 = RETX;
|
||||||
|
@ -124,22 +124,22 @@ ENTRY(__start)
|
|||||||
* below
|
* below
|
||||||
*/
|
*/
|
||||||
GET_PDA(p0, r0);
|
GET_PDA(p0, r0);
|
||||||
r6 = [p0 + PDA_RETX];
|
r6 = [p0 + PDA_DF_RETX];
|
||||||
p1.l = _init_saved_retx;
|
p1.l = _init_saved_retx;
|
||||||
p1.h = _init_saved_retx;
|
p1.h = _init_saved_retx;
|
||||||
[p1] = r6;
|
[p1] = r6;
|
||||||
|
|
||||||
r6 = [p0 + PDA_DCPLB];
|
r6 = [p0 + PDA_DF_DCPLB];
|
||||||
p1.l = _init_saved_dcplb_fault_addr;
|
p1.l = _init_saved_dcplb_fault_addr;
|
||||||
p1.h = _init_saved_dcplb_fault_addr;
|
p1.h = _init_saved_dcplb_fault_addr;
|
||||||
[p1] = r6;
|
[p1] = r6;
|
||||||
|
|
||||||
r6 = [p0 + PDA_ICPLB];
|
r6 = [p0 + PDA_DF_ICPLB];
|
||||||
p1.l = _init_saved_icplb_fault_addr;
|
p1.l = _init_saved_icplb_fault_addr;
|
||||||
p1.h = _init_saved_icplb_fault_addr;
|
p1.h = _init_saved_icplb_fault_addr;
|
||||||
[p1] = r6;
|
[p1] = r6;
|
||||||
|
|
||||||
r6 = [p0 + PDA_SEQSTAT];
|
r6 = [p0 + PDA_DF_SEQSTAT];
|
||||||
p1.l = _init_saved_seqstat;
|
p1.l = _init_saved_seqstat;
|
||||||
p1.h = _init_saved_seqstat;
|
p1.h = _init_saved_seqstat;
|
||||||
[p1] = r6;
|
[p1] = r6;
|
||||||
@ -153,6 +153,8 @@ ENTRY(__start)
|
|||||||
|
|
||||||
#ifdef CONFIG_EARLY_PRINTK
|
#ifdef CONFIG_EARLY_PRINTK
|
||||||
call _init_early_exception_vectors;
|
call _init_early_exception_vectors;
|
||||||
|
r0 = (EVT_IVHW | EVT_IRPTEN | EVT_EVX | EVT_NMI | EVT_RST | EVT_EMU);
|
||||||
|
sti r0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
r0 = 0 (x);
|
r0 = 0 (x);
|
||||||
@ -212,12 +214,21 @@ ENTRY(__start)
|
|||||||
[p0] = p1;
|
[p0] = p1;
|
||||||
csync;
|
csync;
|
||||||
|
|
||||||
|
#ifdef CONFIG_EARLY_PRINTK
|
||||||
|
r0 = (EVT_IVG15 | EVT_IVHW | EVT_IRPTEN | EVT_EVX | EVT_NMI | EVT_RST | EVT_EMU) (z);
|
||||||
|
#else
|
||||||
r0 = EVT_IVG15 (z);
|
r0 = EVT_IVG15 (z);
|
||||||
|
#endif
|
||||||
sti r0;
|
sti r0;
|
||||||
|
|
||||||
raise 15;
|
raise 15;
|
||||||
|
#ifdef CONFIG_EARLY_PRINTK
|
||||||
|
p0.l = _early_trap;
|
||||||
|
p0.h = _early_trap;
|
||||||
|
#else
|
||||||
p0.l = .LWAIT_HERE;
|
p0.l = .LWAIT_HERE;
|
||||||
p0.h = .LWAIT_HERE;
|
p0.h = .LWAIT_HERE;
|
||||||
|
#endif
|
||||||
reti = p0;
|
reti = p0;
|
||||||
#if ANOMALY_05000281
|
#if ANOMALY_05000281
|
||||||
nop; nop; nop;
|
nop; nop; nop;
|
||||||
|
@ -119,14 +119,8 @@ __common_int_entry:
|
|||||||
fp = 0;
|
fp = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ANOMALY_05000283 || ANOMALY_05000315
|
ANOMALY_283_315_WORKAROUND(p5, r7)
|
||||||
cc = r7 == r7;
|
|
||||||
p5.h = HI(CHIPID);
|
|
||||||
p5.l = LO(CHIPID);
|
|
||||||
if cc jump 1f;
|
|
||||||
r7.l = W[p5];
|
|
||||||
1:
|
|
||||||
#endif
|
|
||||||
r1 = sp;
|
r1 = sp;
|
||||||
SP += -12;
|
SP += -12;
|
||||||
#ifdef CONFIG_IPIPE
|
#ifdef CONFIG_IPIPE
|
||||||
@ -158,14 +152,7 @@ ENTRY(_evt_ivhw)
|
|||||||
fp = 0;
|
fp = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ANOMALY_05000283 || ANOMALY_05000315
|
ANOMALY_283_315_WORKAROUND(p5, r7)
|
||||||
cc = r7 == r7;
|
|
||||||
p5.h = HI(CHIPID);
|
|
||||||
p5.l = LO(CHIPID);
|
|
||||||
if cc jump 1f;
|
|
||||||
r7.l = W[p5];
|
|
||||||
1:
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Handle all stacked hardware errors
|
/* Handle all stacked hardware errors
|
||||||
* To make sure we don't hang forever, only do it 10 times
|
* To make sure we don't hang forever, only do it 10 times
|
||||||
@ -261,6 +248,31 @@ ENTRY(_evt_system_call)
|
|||||||
ENDPROC(_evt_system_call)
|
ENDPROC(_evt_system_call)
|
||||||
|
|
||||||
#ifdef CONFIG_IPIPE
|
#ifdef CONFIG_IPIPE
|
||||||
|
/*
|
||||||
|
* __ipipe_call_irqtail: lowers the current priority level to EVT15
|
||||||
|
* before running a user-defined routine, then raises the priority
|
||||||
|
* level to EVT14 to prepare the caller for a normal interrupt
|
||||||
|
* return through RTI.
|
||||||
|
*
|
||||||
|
* We currently use this facility in two occasions:
|
||||||
|
*
|
||||||
|
* - to branch to __ipipe_irq_tail_hook as requested by a high
|
||||||
|
* priority domain after the pipeline delivered an interrupt,
|
||||||
|
* e.g. such as Xenomai, in order to start its rescheduling
|
||||||
|
* procedure, since we may not switch tasks when IRQ levels are
|
||||||
|
* nested on the Blackfin, so we have to fake an interrupt return
|
||||||
|
* so that we may reschedule immediately.
|
||||||
|
*
|
||||||
|
* - to branch to sync_root_irqs, in order to play any interrupt
|
||||||
|
* pending for the root domain (i.e. the Linux kernel). This lowers
|
||||||
|
* the core priority level enough so that Linux IRQ handlers may
|
||||||
|
* never delay interrupts handled by high priority domains; we defer
|
||||||
|
* those handlers until this point instead. This is a substitute
|
||||||
|
* to using a threaded interrupt model for the Linux kernel.
|
||||||
|
*
|
||||||
|
* r0: address of user-defined routine
|
||||||
|
* context: caller must have preempted EVT15, hw interrupts must be off.
|
||||||
|
*/
|
||||||
ENTRY(___ipipe_call_irqtail)
|
ENTRY(___ipipe_call_irqtail)
|
||||||
p0 = r0;
|
p0 = r0;
|
||||||
r0.l = 1f;
|
r0.l = 1f;
|
||||||
@ -276,33 +288,19 @@ ENTRY(___ipipe_call_irqtail)
|
|||||||
( r7:4, p5:3 ) = [sp++];
|
( r7:4, p5:3 ) = [sp++];
|
||||||
rets = [sp++];
|
rets = [sp++];
|
||||||
|
|
||||||
[--sp] = reti;
|
#ifdef CONFIG_DEBUG_HWERR
|
||||||
reti = [sp++]; /* IRQs are off. */
|
/* enable irq14 & hwerr interrupt, until we transition to _evt_evt14 */
|
||||||
r0.h = 3f;
|
r0 = (EVT_IVG14 | EVT_IVHW | \
|
||||||
r0.l = 3f;
|
EVT_IRPTEN | EVT_EVX | EVT_NMI | EVT_RST | EVT_EMU);
|
||||||
p0.l = lo(EVT14);
|
#else
|
||||||
p0.h = hi(EVT14);
|
/* Only enable irq14 interrupt, until we transition to _evt_evt14 */
|
||||||
[p0] = r0;
|
r0 = (EVT_IVG14 | \
|
||||||
csync;
|
EVT_IRPTEN | EVT_EVX | EVT_NMI | EVT_RST | EVT_EMU);
|
||||||
r0 = 0x401f (z);
|
#endif
|
||||||
sti r0;
|
sti r0;
|
||||||
raise 14;
|
raise 14; /* Branches to _evt_evt14 */
|
||||||
[--sp] = reti; /* IRQs on. */
|
|
||||||
2:
|
2:
|
||||||
jump 2b; /* Likely paranoid. */
|
jump 2b; /* Likely paranoid. */
|
||||||
3:
|
|
||||||
sp += 4; /* Discard saved RETI */
|
|
||||||
r0.h = _evt14_softirq;
|
|
||||||
r0.l = _evt14_softirq;
|
|
||||||
p0.l = lo(EVT14);
|
|
||||||
p0.h = hi(EVT14);
|
|
||||||
[p0] = r0;
|
|
||||||
csync;
|
|
||||||
p0.l = _bfin_irq_flags;
|
|
||||||
p0.h = _bfin_irq_flags;
|
|
||||||
r0 = [p0];
|
|
||||||
sti r0;
|
|
||||||
rts;
|
|
||||||
ENDPROC(___ipipe_call_irqtail)
|
ENDPROC(___ipipe_call_irqtail)
|
||||||
|
|
||||||
#endif /* CONFIG_IPIPE */
|
#endif /* CONFIG_IPIPE */
|
||||||
|
@ -967,7 +967,7 @@ void __cpuinit init_exception_vectors(void)
|
|||||||
bfin_write_EVT11(evt_evt11);
|
bfin_write_EVT11(evt_evt11);
|
||||||
bfin_write_EVT12(evt_evt12);
|
bfin_write_EVT12(evt_evt12);
|
||||||
bfin_write_EVT13(evt_evt13);
|
bfin_write_EVT13(evt_evt13);
|
||||||
bfin_write_EVT14(evt14_softirq);
|
bfin_write_EVT14(evt_evt14);
|
||||||
bfin_write_EVT15(evt_system_call);
|
bfin_write_EVT15(evt_system_call);
|
||||||
CSYNC();
|
CSYNC();
|
||||||
}
|
}
|
||||||
@ -1052,18 +1052,26 @@ int __init init_arch_irq(void)
|
|||||||
set_irq_chained_handler(irq, bfin_demux_error_irq);
|
set_irq_chained_handler(irq, bfin_demux_error_irq);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
|
#ifdef CONFIG_TICKSOURCE_GPTMR0
|
||||||
|
case IRQ_TIMER0:
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_TICKSOURCE_CORETMR
|
||||||
|
case IRQ_CORETMR:
|
||||||
|
#endif
|
||||||
case IRQ_SUPPLE_0:
|
case IRQ_SUPPLE_0:
|
||||||
case IRQ_SUPPLE_1:
|
case IRQ_SUPPLE_1:
|
||||||
set_irq_handler(irq, handle_percpu_irq);
|
set_irq_handler(irq, handle_percpu_irq);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_IPIPE
|
#ifdef CONFIG_IPIPE
|
||||||
#ifndef CONFIG_TICKSOURCE_CORETMR
|
#ifndef CONFIG_TICKSOURCE_CORETMR
|
||||||
case IRQ_TIMER0:
|
case IRQ_TIMER0:
|
||||||
set_irq_handler(irq, handle_simple_irq);
|
set_irq_handler(irq, handle_simple_irq);
|
||||||
break;
|
break;
|
||||||
#endif /* !CONFIG_TICKSOURCE_CORETMR */
|
#endif
|
||||||
case IRQ_CORETMR:
|
case IRQ_CORETMR:
|
||||||
set_irq_handler(irq, handle_simple_irq);
|
set_irq_handler(irq, handle_simple_irq);
|
||||||
break;
|
break;
|
||||||
@ -1071,15 +1079,10 @@ int __init init_arch_irq(void)
|
|||||||
set_irq_handler(irq, handle_level_irq);
|
set_irq_handler(irq, handle_level_irq);
|
||||||
break;
|
break;
|
||||||
#else /* !CONFIG_IPIPE */
|
#else /* !CONFIG_IPIPE */
|
||||||
#ifdef CONFIG_TICKSOURCE_GPTMR0
|
|
||||||
case IRQ_TIMER0:
|
|
||||||
set_irq_handler(irq, handle_percpu_irq);
|
|
||||||
break;
|
|
||||||
#endif /* CONFIG_TICKSOURCE_GPTMR0 */
|
|
||||||
default:
|
default:
|
||||||
set_irq_handler(irq, handle_simple_irq);
|
set_irq_handler(irq, handle_simple_irq);
|
||||||
break;
|
break;
|
||||||
#endif /* !CONFIG_IPIPE */
|
#endif /* !CONFIG_IPIPE */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,223 +0,0 @@
|
|||||||
/*
|
|
||||||
* File: arch/blackfin/mach-common/lock.S
|
|
||||||
* Based on:
|
|
||||||
* Author: LG Soft India
|
|
||||||
*
|
|
||||||
* Created: ?
|
|
||||||
* Description: kernel locks
|
|
||||||
*
|
|
||||||
* Modified:
|
|
||||||
* Copyright 2004-2006 Analog Devices Inc.
|
|
||||||
*
|
|
||||||
* Bugs: Enter bugs at http://blackfin.uclinux.org/
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, see the file COPYING, or write
|
|
||||||
* to the Free Software Foundation, Inc.,
|
|
||||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/linkage.h>
|
|
||||||
#include <asm/blackfin.h>
|
|
||||||
|
|
||||||
.text
|
|
||||||
|
|
||||||
/* When you come here, it is assumed that
|
|
||||||
* R0 - Which way to be locked
|
|
||||||
*/
|
|
||||||
|
|
||||||
ENTRY(_cache_grab_lock)
|
|
||||||
|
|
||||||
[--SP]=( R7:0,P5:0 );
|
|
||||||
|
|
||||||
P1.H = HI(IMEM_CONTROL);
|
|
||||||
P1.L = LO(IMEM_CONTROL);
|
|
||||||
P5.H = HI(ICPLB_ADDR0);
|
|
||||||
P5.L = LO(ICPLB_ADDR0);
|
|
||||||
P4.H = HI(ICPLB_DATA0);
|
|
||||||
P4.L = LO(ICPLB_DATA0);
|
|
||||||
R7 = R0;
|
|
||||||
|
|
||||||
/* If the code of interest already resides in the cache
|
|
||||||
* invalidate the entire cache itself.
|
|
||||||
* invalidate_entire_icache;
|
|
||||||
*/
|
|
||||||
|
|
||||||
SP += -12;
|
|
||||||
[--SP] = RETS;
|
|
||||||
CALL _invalidate_entire_icache;
|
|
||||||
RETS = [SP++];
|
|
||||||
SP += 12;
|
|
||||||
|
|
||||||
/* Disable the Interrupts*/
|
|
||||||
|
|
||||||
CLI R3;
|
|
||||||
|
|
||||||
.LLOCK_WAY:
|
|
||||||
|
|
||||||
/* Way0 - 0xFFA133E0
|
|
||||||
* Way1 - 0xFFA137E0
|
|
||||||
* Way2 - 0xFFA13BE0 Total Way Size = 4K
|
|
||||||
* Way3 - 0xFFA13FE0
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Procedure Ex. -Set the locks for other ways by setting ILOC[3:1]
|
|
||||||
* Only Way0 of the instruction cache can now be
|
|
||||||
* replaced by a new code
|
|
||||||
*/
|
|
||||||
|
|
||||||
R5 = R7;
|
|
||||||
CC = BITTST(R7,0);
|
|
||||||
IF CC JUMP .LCLEAR1;
|
|
||||||
R7 = 0;
|
|
||||||
BITSET(R7,0);
|
|
||||||
JUMP .LDONE1;
|
|
||||||
|
|
||||||
.LCLEAR1:
|
|
||||||
R7 = 0;
|
|
||||||
BITCLR(R7,0);
|
|
||||||
.LDONE1: R4 = R7 << 3;
|
|
||||||
R7 = [P1];
|
|
||||||
R7 = R7 | R4;
|
|
||||||
SSYNC; /* SSYNC required writing to IMEM_CONTROL. */
|
|
||||||
.align 8;
|
|
||||||
[P1] = R7;
|
|
||||||
SSYNC;
|
|
||||||
|
|
||||||
R7 = R5;
|
|
||||||
CC = BITTST(R7,1);
|
|
||||||
IF CC JUMP .LCLEAR2;
|
|
||||||
R7 = 0;
|
|
||||||
BITSET(R7,1);
|
|
||||||
JUMP .LDONE2;
|
|
||||||
|
|
||||||
.LCLEAR2:
|
|
||||||
R7 = 0;
|
|
||||||
BITCLR(R7,1);
|
|
||||||
.LDONE2: R4 = R7 << 3;
|
|
||||||
R7 = [P1];
|
|
||||||
R7 = R7 | R4;
|
|
||||||
SSYNC; /* SSYNC required writing to IMEM_CONTROL. */
|
|
||||||
.align 8;
|
|
||||||
[P1] = R7;
|
|
||||||
SSYNC;
|
|
||||||
|
|
||||||
R7 = R5;
|
|
||||||
CC = BITTST(R7,2);
|
|
||||||
IF CC JUMP .LCLEAR3;
|
|
||||||
R7 = 0;
|
|
||||||
BITSET(R7,2);
|
|
||||||
JUMP .LDONE3;
|
|
||||||
.LCLEAR3:
|
|
||||||
R7 = 0;
|
|
||||||
BITCLR(R7,2);
|
|
||||||
.LDONE3: R4 = R7 << 3;
|
|
||||||
R7 = [P1];
|
|
||||||
R7 = R7 | R4;
|
|
||||||
SSYNC; /* SSYNC required writing to IMEM_CONTROL. */
|
|
||||||
.align 8;
|
|
||||||
[P1] = R7;
|
|
||||||
SSYNC;
|
|
||||||
|
|
||||||
|
|
||||||
R7 = R5;
|
|
||||||
CC = BITTST(R7,3);
|
|
||||||
IF CC JUMP .LCLEAR4;
|
|
||||||
R7 = 0;
|
|
||||||
BITSET(R7,3);
|
|
||||||
JUMP .LDONE4;
|
|
||||||
.LCLEAR4:
|
|
||||||
R7 = 0;
|
|
||||||
BITCLR(R7,3);
|
|
||||||
.LDONE4: R4 = R7 << 3;
|
|
||||||
R7 = [P1];
|
|
||||||
R7 = R7 | R4;
|
|
||||||
SSYNC; /* SSYNC required writing to IMEM_CONTROL. */
|
|
||||||
.align 8;
|
|
||||||
[P1] = R7;
|
|
||||||
SSYNC;
|
|
||||||
|
|
||||||
STI R3;
|
|
||||||
|
|
||||||
( R7:0,P5:0 ) = [SP++];
|
|
||||||
|
|
||||||
RTS;
|
|
||||||
ENDPROC(_cache_grab_lock)
|
|
||||||
|
|
||||||
/* After the execution of critical code, the code is now locked into
|
|
||||||
* the cache way. Now we need to set ILOC.
|
|
||||||
*
|
|
||||||
* R0 - Which way to be locked
|
|
||||||
*/
|
|
||||||
|
|
||||||
ENTRY(_bfin_cache_lock)
|
|
||||||
|
|
||||||
[--SP]=( R7:0,P5:0 );
|
|
||||||
|
|
||||||
P1.H = HI(IMEM_CONTROL);
|
|
||||||
P1.L = LO(IMEM_CONTROL);
|
|
||||||
|
|
||||||
/* Disable the Interrupts*/
|
|
||||||
CLI R3;
|
|
||||||
|
|
||||||
R7 = [P1];
|
|
||||||
R2 = ~(0x78) (X); /* mask out ILOC */
|
|
||||||
R7 = R7 & R2;
|
|
||||||
R0 = R0 << 3;
|
|
||||||
R7 = R0 | R7;
|
|
||||||
SSYNC; /* SSYNC required writing to IMEM_CONTROL. */
|
|
||||||
.align 8;
|
|
||||||
[P1] = R7;
|
|
||||||
SSYNC;
|
|
||||||
/* Renable the Interrupts */
|
|
||||||
STI R3;
|
|
||||||
|
|
||||||
( R7:0,P5:0 ) = [SP++];
|
|
||||||
RTS;
|
|
||||||
ENDPROC(_bfin_cache_lock)
|
|
||||||
|
|
||||||
/* Invalidate the Entire Instruction cache by
|
|
||||||
* disabling IMC bit
|
|
||||||
*/
|
|
||||||
ENTRY(_invalidate_entire_icache)
|
|
||||||
[--SP] = ( R7:5);
|
|
||||||
|
|
||||||
P0.L = LO(IMEM_CONTROL);
|
|
||||||
P0.H = HI(IMEM_CONTROL);
|
|
||||||
R7 = [P0];
|
|
||||||
|
|
||||||
/* Clear the IMC bit , All valid bits in the instruction
|
|
||||||
* cache are set to the invalid state
|
|
||||||
*/
|
|
||||||
BITCLR(R7,IMC_P);
|
|
||||||
CLI R6;
|
|
||||||
SSYNC; /* SSYNC required before invalidating cache. */
|
|
||||||
.align 8;
|
|
||||||
[P0] = R7;
|
|
||||||
SSYNC;
|
|
||||||
STI R6;
|
|
||||||
|
|
||||||
/* Configures the instruction cache agian */
|
|
||||||
R6 = (IMC | ENICPLB);
|
|
||||||
R7 = R7 | R6;
|
|
||||||
|
|
||||||
CLI R6;
|
|
||||||
SSYNC; /* SSYNC required before writing to IMEM_CONTROL. */
|
|
||||||
.align 8;
|
|
||||||
[P0] = R7;
|
|
||||||
SSYNC;
|
|
||||||
STI R6;
|
|
||||||
|
|
||||||
( R7:5) = [SP++];
|
|
||||||
RTS;
|
|
||||||
ENDPROC(_invalidate_entire_icache)
|
|
@ -38,6 +38,7 @@
|
|||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
|
||||||
|
#include <asm/cplb.h>
|
||||||
#include <asm/gpio.h>
|
#include <asm/gpio.h>
|
||||||
#include <asm/dma.h>
|
#include <asm/dma.h>
|
||||||
#include <asm/dpmc.h>
|
#include <asm/dpmc.h>
|
||||||
@ -170,58 +171,6 @@ static void flushinv_all_dcache(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static inline void dcache_disable(void)
|
|
||||||
{
|
|
||||||
#ifdef CONFIG_BFIN_DCACHE
|
|
||||||
unsigned long ctrl;
|
|
||||||
|
|
||||||
#if defined(CONFIG_BFIN_EXTMEM_WRITEBACK) || defined(CONFIG_BFIN_L2_WRITEBACK)
|
|
||||||
flushinv_all_dcache();
|
|
||||||
#endif
|
|
||||||
SSYNC();
|
|
||||||
ctrl = bfin_read_DMEM_CONTROL();
|
|
||||||
ctrl &= ~ENDCPLB;
|
|
||||||
bfin_write_DMEM_CONTROL(ctrl);
|
|
||||||
SSYNC();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void dcache_enable(void)
|
|
||||||
{
|
|
||||||
#ifdef CONFIG_BFIN_DCACHE
|
|
||||||
unsigned long ctrl;
|
|
||||||
SSYNC();
|
|
||||||
ctrl = bfin_read_DMEM_CONTROL();
|
|
||||||
ctrl |= ENDCPLB;
|
|
||||||
bfin_write_DMEM_CONTROL(ctrl);
|
|
||||||
SSYNC();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void icache_disable(void)
|
|
||||||
{
|
|
||||||
#ifdef CONFIG_BFIN_ICACHE
|
|
||||||
unsigned long ctrl;
|
|
||||||
SSYNC();
|
|
||||||
ctrl = bfin_read_IMEM_CONTROL();
|
|
||||||
ctrl &= ~ENICPLB;
|
|
||||||
bfin_write_IMEM_CONTROL(ctrl);
|
|
||||||
SSYNC();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void icache_enable(void)
|
|
||||||
{
|
|
||||||
#ifdef CONFIG_BFIN_ICACHE
|
|
||||||
unsigned long ctrl;
|
|
||||||
SSYNC();
|
|
||||||
ctrl = bfin_read_IMEM_CONTROL();
|
|
||||||
ctrl |= ENICPLB;
|
|
||||||
bfin_write_IMEM_CONTROL(ctrl);
|
|
||||||
SSYNC();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
int bfin_pm_suspend_mem_enter(void)
|
int bfin_pm_suspend_mem_enter(void)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
@ -258,16 +207,19 @@ int bfin_pm_suspend_mem_enter(void)
|
|||||||
|
|
||||||
bfin_gpio_pm_hibernate_suspend();
|
bfin_gpio_pm_hibernate_suspend();
|
||||||
|
|
||||||
dcache_disable();
|
#if defined(CONFIG_BFIN_EXTMEM_WRITEBACK) || defined(CONFIG_BFIN_L2_WRITEBACK)
|
||||||
icache_disable();
|
flushinv_all_dcache();
|
||||||
|
#endif
|
||||||
|
_disable_dcplb();
|
||||||
|
_disable_icplb();
|
||||||
bf53x_suspend_l1_mem(memptr);
|
bf53x_suspend_l1_mem(memptr);
|
||||||
|
|
||||||
do_hibernate(wakeup | vr_wakeup); /* Goodbye */
|
do_hibernate(wakeup | vr_wakeup); /* Goodbye */
|
||||||
|
|
||||||
bf53x_resume_l1_mem(memptr);
|
bf53x_resume_l1_mem(memptr);
|
||||||
|
|
||||||
icache_enable();
|
_enable_icplb();
|
||||||
dcache_enable();
|
_enable_dcplb();
|
||||||
|
|
||||||
bfin_gpio_pm_hibernate_restore();
|
bfin_gpio_pm_hibernate_restore();
|
||||||
blackfin_dma_resume();
|
blackfin_dma_resume();
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#include <asm/bfin-global.h>
|
#include <asm/bfin-global.h>
|
||||||
#include <asm/pda.h>
|
#include <asm/pda.h>
|
||||||
#include <asm/cplbinit.h>
|
#include <asm/cplbinit.h>
|
||||||
|
#include <asm/early_printk.h>
|
||||||
#include "blackfin_sram.h"
|
#include "blackfin_sram.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -113,6 +114,8 @@ asmlinkage void __init init_pda(void)
|
|||||||
{
|
{
|
||||||
unsigned int cpu = raw_smp_processor_id();
|
unsigned int cpu = raw_smp_processor_id();
|
||||||
|
|
||||||
|
early_shadow_stamp();
|
||||||
|
|
||||||
/* Initialize the PDA fields holding references to other parts
|
/* Initialize the PDA fields holding references to other parts
|
||||||
of the memory. The content of such memory is still
|
of the memory. The content of such memory is still
|
||||||
undefined at the time of the call, we are only setting up
|
undefined at the time of the call, we are only setting up
|
||||||
|
@ -16,6 +16,8 @@
|
|||||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define pr_fmt(fmt) "isram: " fmt
|
||||||
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
@ -23,6 +25,7 @@
|
|||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
|
|
||||||
#include <asm/blackfin.h>
|
#include <asm/blackfin.h>
|
||||||
|
#include <asm/dma.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* IMPORTANT WARNING ABOUT THESE FUNCTIONS
|
* IMPORTANT WARNING ABOUT THESE FUNCTIONS
|
||||||
@ -50,10 +53,12 @@ static DEFINE_SPINLOCK(dtest_lock);
|
|||||||
#define IADDR2DTEST(x) \
|
#define IADDR2DTEST(x) \
|
||||||
({ unsigned long __addr = (unsigned long)(x); \
|
({ unsigned long __addr = (unsigned long)(x); \
|
||||||
(__addr & 0x47F8) | /* address bits 14 & 10:3 */ \
|
(__addr & 0x47F8) | /* address bits 14 & 10:3 */ \
|
||||||
|
(__addr & 0x8000) << 23 | /* Bank A/B */ \
|
||||||
(__addr & 0x0800) << 15 | /* address bit 11 */ \
|
(__addr & 0x0800) << 15 | /* address bit 11 */ \
|
||||||
(__addr & 0x3000) << 4 | /* address bits 13:12 */ \
|
(__addr & 0x3000) << 4 | /* address bits 13:12 */ \
|
||||||
(__addr & 0x8000) << 8 | /* address bit 15 */ \
|
(__addr & 0x8000) << 8 | /* address bit 15 */ \
|
||||||
(0x1000004); /* isram access */ \
|
(0x1000000) | /* instruction access = 1 */ \
|
||||||
|
(0x4); /* data array = 1 */ \
|
||||||
})
|
})
|
||||||
|
|
||||||
/* Takes a pointer, and returns the offset (in bits) which things should be shifted */
|
/* Takes a pointer, and returns the offset (in bits) which things should be shifted */
|
||||||
@ -70,7 +75,7 @@ static void isram_write(const void *addr, uint64_t data)
|
|||||||
if (addr >= (void *)(L1_CODE_START + L1_CODE_LENGTH))
|
if (addr >= (void *)(L1_CODE_START + L1_CODE_LENGTH))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
cmd = IADDR2DTEST(addr) | 1; /* write */
|
cmd = IADDR2DTEST(addr) | 2; /* write */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Writes to DTEST_DATA[0:1] need to be atomic with write to DTEST_COMMAND
|
* Writes to DTEST_DATA[0:1] need to be atomic with write to DTEST_COMMAND
|
||||||
@ -127,8 +132,7 @@ static bool isram_check_addr(const void *addr, size_t n)
|
|||||||
(addr < (void *)(L1_CODE_START + L1_CODE_LENGTH))) {
|
(addr < (void *)(L1_CODE_START + L1_CODE_LENGTH))) {
|
||||||
if ((addr + n) > (void *)(L1_CODE_START + L1_CODE_LENGTH)) {
|
if ((addr + n) > (void *)(L1_CODE_START + L1_CODE_LENGTH)) {
|
||||||
show_stack(NULL, NULL);
|
show_stack(NULL, NULL);
|
||||||
printk(KERN_ERR "isram_memcpy: copy involving %p length "
|
pr_err("copy involving %p length (%zu) too long\n", addr, n);
|
||||||
"(%zu) too long\n", addr, n);
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -199,3 +203,209 @@ void *isram_memcpy(void *dest, const void *src, size_t n)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(isram_memcpy);
|
EXPORT_SYMBOL(isram_memcpy);
|
||||||
|
|
||||||
|
#ifdef CONFIG_BFIN_ISRAM_SELF_TEST
|
||||||
|
|
||||||
|
#define TEST_LEN 0x100
|
||||||
|
|
||||||
|
static __init void hex_dump(unsigned char *buf, int len)
|
||||||
|
{
|
||||||
|
while (len--)
|
||||||
|
pr_cont("%02x", *buf++);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __init int isram_read_test(char *sdram, void *l1inst)
|
||||||
|
{
|
||||||
|
int i, ret = 0;
|
||||||
|
uint64_t data1, data2;
|
||||||
|
|
||||||
|
pr_info("INFO: running isram_read tests\n");
|
||||||
|
|
||||||
|
/* setup some different data to play with */
|
||||||
|
for (i = 0; i < TEST_LEN; ++i)
|
||||||
|
sdram[i] = i;
|
||||||
|
dma_memcpy(l1inst, sdram, TEST_LEN);
|
||||||
|
|
||||||
|
/* make sure we can read the L1 inst */
|
||||||
|
for (i = 0; i < TEST_LEN; i += sizeof(uint64_t)) {
|
||||||
|
data1 = isram_read(l1inst + i);
|
||||||
|
memcpy(&data2, sdram + i, sizeof(data2));
|
||||||
|
if (memcmp(&data1, &data2, sizeof(uint64_t))) {
|
||||||
|
pr_err("FAIL: isram_read(%p) returned %#llx but wanted %#llx\n",
|
||||||
|
l1inst + i, data1, data2);
|
||||||
|
++ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __init int isram_write_test(char *sdram, void *l1inst)
|
||||||
|
{
|
||||||
|
int i, ret = 0;
|
||||||
|
uint64_t data1, data2;
|
||||||
|
|
||||||
|
pr_info("INFO: running isram_write tests\n");
|
||||||
|
|
||||||
|
/* setup some different data to play with */
|
||||||
|
memset(sdram, 0, TEST_LEN * 2);
|
||||||
|
dma_memcpy(l1inst, sdram, TEST_LEN);
|
||||||
|
for (i = 0; i < TEST_LEN; ++i)
|
||||||
|
sdram[i] = i;
|
||||||
|
|
||||||
|
/* make sure we can write the L1 inst */
|
||||||
|
for (i = 0; i < TEST_LEN; i += sizeof(uint64_t)) {
|
||||||
|
memcpy(&data1, sdram + i, sizeof(data1));
|
||||||
|
isram_write(l1inst + i, data1);
|
||||||
|
data2 = isram_read(l1inst + i);
|
||||||
|
if (memcmp(&data1, &data2, sizeof(uint64_t))) {
|
||||||
|
pr_err("FAIL: isram_write(%p, %#llx) != %#llx\n",
|
||||||
|
l1inst + i, data1, data2);
|
||||||
|
++ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dma_memcpy(sdram + TEST_LEN, l1inst, TEST_LEN);
|
||||||
|
if (memcmp(sdram, sdram + TEST_LEN, TEST_LEN)) {
|
||||||
|
pr_err("FAIL: isram_write() did not work properly\n");
|
||||||
|
++ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __init int
|
||||||
|
_isram_memcpy_test(char pattern, void *sdram, void *l1inst, const char *smemcpy,
|
||||||
|
void *(*fmemcpy)(void *, const void *, size_t))
|
||||||
|
{
|
||||||
|
memset(sdram, pattern, TEST_LEN);
|
||||||
|
fmemcpy(l1inst, sdram, TEST_LEN);
|
||||||
|
fmemcpy(sdram + TEST_LEN, l1inst, TEST_LEN);
|
||||||
|
if (memcmp(sdram, sdram + TEST_LEN, TEST_LEN)) {
|
||||||
|
pr_err("FAIL: %s(%p <=> %p, %#x) failed (data is %#x)\n",
|
||||||
|
smemcpy, l1inst, sdram, TEST_LEN, pattern);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#define _isram_memcpy_test(a, b, c, d) _isram_memcpy_test(a, b, c, #d, d)
|
||||||
|
|
||||||
|
static __init int isram_memcpy_test(char *sdram, void *l1inst)
|
||||||
|
{
|
||||||
|
int i, j, thisret, ret = 0;
|
||||||
|
|
||||||
|
/* check broad isram_memcpy() */
|
||||||
|
pr_info("INFO: running broad isram_memcpy tests\n");
|
||||||
|
for (i = 0xf; i >= 0; --i)
|
||||||
|
ret += _isram_memcpy_test(i, sdram, l1inst, isram_memcpy);
|
||||||
|
|
||||||
|
/* check read of small, unaligned, and hardware 64bit limits */
|
||||||
|
pr_info("INFO: running isram_memcpy (read) tests\n");
|
||||||
|
|
||||||
|
for (i = 0; i < TEST_LEN; ++i)
|
||||||
|
sdram[i] = i;
|
||||||
|
dma_memcpy(l1inst, sdram, TEST_LEN);
|
||||||
|
|
||||||
|
thisret = 0;
|
||||||
|
for (i = 0; i < TEST_LEN - 32; ++i) {
|
||||||
|
unsigned char cmp[32];
|
||||||
|
for (j = 1; j <= 32; ++j) {
|
||||||
|
memset(cmp, 0, sizeof(cmp));
|
||||||
|
isram_memcpy(cmp, l1inst + i, j);
|
||||||
|
if (memcmp(cmp, sdram + i, j)) {
|
||||||
|
pr_err("FAIL: %p:", l1inst + 1);
|
||||||
|
hex_dump(cmp, j);
|
||||||
|
pr_cont(" SDRAM:");
|
||||||
|
hex_dump(sdram + i, j);
|
||||||
|
pr_cont("\n");
|
||||||
|
if (++thisret > 20) {
|
||||||
|
pr_err("FAIL: skipping remaining series\n");
|
||||||
|
i = TEST_LEN;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ret += thisret;
|
||||||
|
|
||||||
|
/* check write of small, unaligned, and hardware 64bit limits */
|
||||||
|
pr_info("INFO: running isram_memcpy (write) tests\n");
|
||||||
|
|
||||||
|
memset(sdram + TEST_LEN, 0, TEST_LEN);
|
||||||
|
dma_memcpy(l1inst, sdram + TEST_LEN, TEST_LEN);
|
||||||
|
|
||||||
|
thisret = 0;
|
||||||
|
for (i = 0; i < TEST_LEN - 32; ++i) {
|
||||||
|
unsigned char cmp[32];
|
||||||
|
for (j = 1; j <= 32; ++j) {
|
||||||
|
isram_memcpy(l1inst + i, sdram + i, j);
|
||||||
|
dma_memcpy(cmp, l1inst + i, j);
|
||||||
|
if (memcmp(cmp, sdram + i, j)) {
|
||||||
|
pr_err("FAIL: %p:", l1inst + i);
|
||||||
|
hex_dump(cmp, j);
|
||||||
|
pr_cont(" SDRAM:");
|
||||||
|
hex_dump(sdram + i, j);
|
||||||
|
pr_cont("\n");
|
||||||
|
if (++thisret > 20) {
|
||||||
|
pr_err("FAIL: skipping remaining series\n");
|
||||||
|
i = TEST_LEN;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ret += thisret;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __init int isram_test_init(void)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
char *sdram;
|
||||||
|
void *l1inst;
|
||||||
|
|
||||||
|
sdram = kmalloc(TEST_LEN * 2, GFP_KERNEL);
|
||||||
|
if (!sdram) {
|
||||||
|
pr_warning("SKIP: could not allocate sdram\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
l1inst = l1_inst_sram_alloc(TEST_LEN);
|
||||||
|
if (!l1inst) {
|
||||||
|
kfree(sdram);
|
||||||
|
pr_warning("SKIP: could not allocate L1 inst\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* sanity check initial L1 inst state */
|
||||||
|
ret = 1;
|
||||||
|
pr_info("INFO: running initial dma_memcpy checks\n");
|
||||||
|
if (_isram_memcpy_test(0xa, sdram, l1inst, dma_memcpy))
|
||||||
|
goto abort;
|
||||||
|
if (_isram_memcpy_test(0x5, sdram, l1inst, dma_memcpy))
|
||||||
|
goto abort;
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
ret += isram_read_test(sdram, l1inst);
|
||||||
|
ret += isram_write_test(sdram, l1inst);
|
||||||
|
ret += isram_memcpy_test(sdram, l1inst);
|
||||||
|
|
||||||
|
abort:
|
||||||
|
sram_free(l1inst);
|
||||||
|
kfree(sdram);
|
||||||
|
|
||||||
|
if (ret)
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
|
pr_info("PASS: all tests worked !\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
late_initcall(isram_test_init);
|
||||||
|
|
||||||
|
static __exit void isram_test_exit(void)
|
||||||
|
{
|
||||||
|
/* stub to allow unloading */
|
||||||
|
}
|
||||||
|
module_exit(isram_test_exit);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
@ -42,11 +42,6 @@
|
|||||||
#include <asm/mem_map.h>
|
#include <asm/mem_map.h>
|
||||||
#include "blackfin_sram.h"
|
#include "blackfin_sram.h"
|
||||||
|
|
||||||
static DEFINE_PER_CPU_SHARED_ALIGNED(spinlock_t, l1sram_lock);
|
|
||||||
static DEFINE_PER_CPU_SHARED_ALIGNED(spinlock_t, l1_data_sram_lock);
|
|
||||||
static DEFINE_PER_CPU_SHARED_ALIGNED(spinlock_t, l1_inst_sram_lock);
|
|
||||||
static spinlock_t l2_sram_lock ____cacheline_aligned_in_smp;
|
|
||||||
|
|
||||||
/* the data structure for L1 scratchpad and DATA SRAM */
|
/* the data structure for L1 scratchpad and DATA SRAM */
|
||||||
struct sram_piece {
|
struct sram_piece {
|
||||||
void *paddr;
|
void *paddr;
|
||||||
@ -55,6 +50,7 @@ struct sram_piece {
|
|||||||
struct sram_piece *next;
|
struct sram_piece *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static DEFINE_PER_CPU_SHARED_ALIGNED(spinlock_t, l1sram_lock);
|
||||||
static DEFINE_PER_CPU(struct sram_piece, free_l1_ssram_head);
|
static DEFINE_PER_CPU(struct sram_piece, free_l1_ssram_head);
|
||||||
static DEFINE_PER_CPU(struct sram_piece, used_l1_ssram_head);
|
static DEFINE_PER_CPU(struct sram_piece, used_l1_ssram_head);
|
||||||
|
|
||||||
@ -68,12 +64,18 @@ static DEFINE_PER_CPU(struct sram_piece, free_l1_data_B_sram_head);
|
|||||||
static DEFINE_PER_CPU(struct sram_piece, used_l1_data_B_sram_head);
|
static DEFINE_PER_CPU(struct sram_piece, used_l1_data_B_sram_head);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if L1_DATA_A_LENGTH || L1_DATA_B_LENGTH
|
||||||
|
static DEFINE_PER_CPU_SHARED_ALIGNED(spinlock_t, l1_data_sram_lock);
|
||||||
|
#endif
|
||||||
|
|
||||||
#if L1_CODE_LENGTH != 0
|
#if L1_CODE_LENGTH != 0
|
||||||
|
static DEFINE_PER_CPU_SHARED_ALIGNED(spinlock_t, l1_inst_sram_lock);
|
||||||
static DEFINE_PER_CPU(struct sram_piece, free_l1_inst_sram_head);
|
static DEFINE_PER_CPU(struct sram_piece, free_l1_inst_sram_head);
|
||||||
static DEFINE_PER_CPU(struct sram_piece, used_l1_inst_sram_head);
|
static DEFINE_PER_CPU(struct sram_piece, used_l1_inst_sram_head);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if L2_LENGTH != 0
|
#if L2_LENGTH != 0
|
||||||
|
static spinlock_t l2_sram_lock ____cacheline_aligned_in_smp;
|
||||||
static struct sram_piece free_l2_sram_head, used_l2_sram_head;
|
static struct sram_piece free_l2_sram_head, used_l2_sram_head;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -225,10 +227,10 @@ static void __init l2_sram_init(void)
|
|||||||
printk(KERN_INFO "Blackfin L2 SRAM: %d KB (%d KB free)\n",
|
printk(KERN_INFO "Blackfin L2 SRAM: %d KB (%d KB free)\n",
|
||||||
L2_LENGTH >> 10,
|
L2_LENGTH >> 10,
|
||||||
free_l2_sram_head.next->size >> 10);
|
free_l2_sram_head.next->size >> 10);
|
||||||
#endif
|
|
||||||
|
|
||||||
/* mutex initialize */
|
/* mutex initialize */
|
||||||
spin_lock_init(&l2_sram_lock);
|
spin_lock_init(&l2_sram_lock);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init bfin_sram_init(void)
|
static int __init bfin_sram_init(void)
|
||||||
@ -416,18 +418,17 @@ EXPORT_SYMBOL(sram_free);
|
|||||||
|
|
||||||
void *l1_data_A_sram_alloc(size_t size)
|
void *l1_data_A_sram_alloc(size_t size)
|
||||||
{
|
{
|
||||||
|
#if L1_DATA_A_LENGTH != 0
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
void *addr = NULL;
|
void *addr;
|
||||||
unsigned int cpu;
|
unsigned int cpu;
|
||||||
|
|
||||||
cpu = get_cpu();
|
cpu = get_cpu();
|
||||||
/* add mutex operation */
|
/* add mutex operation */
|
||||||
spin_lock_irqsave(&per_cpu(l1_data_sram_lock, cpu), flags);
|
spin_lock_irqsave(&per_cpu(l1_data_sram_lock, cpu), flags);
|
||||||
|
|
||||||
#if L1_DATA_A_LENGTH != 0
|
|
||||||
addr = _sram_alloc(size, &per_cpu(free_l1_data_A_sram_head, cpu),
|
addr = _sram_alloc(size, &per_cpu(free_l1_data_A_sram_head, cpu),
|
||||||
&per_cpu(used_l1_data_A_sram_head, cpu));
|
&per_cpu(used_l1_data_A_sram_head, cpu));
|
||||||
#endif
|
|
||||||
|
|
||||||
/* add mutex operation */
|
/* add mutex operation */
|
||||||
spin_unlock_irqrestore(&per_cpu(l1_data_sram_lock, cpu), flags);
|
spin_unlock_irqrestore(&per_cpu(l1_data_sram_lock, cpu), flags);
|
||||||
@ -437,11 +438,15 @@ void *l1_data_A_sram_alloc(size_t size)
|
|||||||
(long unsigned int)addr, size);
|
(long unsigned int)addr, size);
|
||||||
|
|
||||||
return addr;
|
return addr;
|
||||||
|
#else
|
||||||
|
return NULL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(l1_data_A_sram_alloc);
|
EXPORT_SYMBOL(l1_data_A_sram_alloc);
|
||||||
|
|
||||||
int l1_data_A_sram_free(const void *addr)
|
int l1_data_A_sram_free(const void *addr)
|
||||||
{
|
{
|
||||||
|
#if L1_DATA_A_LENGTH != 0
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int ret;
|
int ret;
|
||||||
unsigned int cpu;
|
unsigned int cpu;
|
||||||
@ -450,18 +455,17 @@ int l1_data_A_sram_free(const void *addr)
|
|||||||
/* add mutex operation */
|
/* add mutex operation */
|
||||||
spin_lock_irqsave(&per_cpu(l1_data_sram_lock, cpu), flags);
|
spin_lock_irqsave(&per_cpu(l1_data_sram_lock, cpu), flags);
|
||||||
|
|
||||||
#if L1_DATA_A_LENGTH != 0
|
|
||||||
ret = _sram_free(addr, &per_cpu(free_l1_data_A_sram_head, cpu),
|
ret = _sram_free(addr, &per_cpu(free_l1_data_A_sram_head, cpu),
|
||||||
&per_cpu(used_l1_data_A_sram_head, cpu));
|
&per_cpu(used_l1_data_A_sram_head, cpu));
|
||||||
#else
|
|
||||||
ret = -1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* add mutex operation */
|
/* add mutex operation */
|
||||||
spin_unlock_irqrestore(&per_cpu(l1_data_sram_lock, cpu), flags);
|
spin_unlock_irqrestore(&per_cpu(l1_data_sram_lock, cpu), flags);
|
||||||
put_cpu();
|
put_cpu();
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
#else
|
||||||
|
return -1;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(l1_data_A_sram_free);
|
EXPORT_SYMBOL(l1_data_A_sram_free);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user