Commit abf5940d authored by Linus Torvalds's avatar Linus Torvalds

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
  ...
parents 66bc4a6f 5bf9cbef
...@@ -342,8 +342,9 @@ config MEM_MT48LC64M4A2FB_7E ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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" ...@@ -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 ...@@ -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 ...@@ -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" ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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); ...@@ -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[]; ...@@ -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 { ...@@ -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 @@ ...@@ -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 @@ ...@@ -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; ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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); ...@@ -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); ...@@ -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); ...@@ -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, ...@@ -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 */ ...@@ -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 */ ...@@ -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 ...@@ -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) ...@@ -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) ...@@ -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 @@ ...@@ -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); ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 @@ ...@@ -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 \
......
/*
* 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 @@ ...@@ -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]; ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 @@ ...@@ -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 \
......
/*
* 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; ...@@ -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) ...@@ -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]; ...@@ -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, ...@@ -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) ...@@ -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 @@ ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 @@ ...@@ -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 @@ ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -24,7 +24,7 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr)
if (unlikely(atomic_read(&current->tracing_graph_pause))) if (unlikely(atomic_read(&current->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 @@ ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 @@ void __ipipe_handle_irq(unsigned irq, struct pt_regs *regs) ...@@ -159,11 +164,6 @@ void __ipipe_handle_irq(unsigned irq, struct pt_regs *regs)
__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) ...@@ -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) ...@@ -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) ...@@ -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;
} }
......
This diff is collapsed.
...@@ -282,25 +282,19 @@ void finish_atomic_sections (struct pt_regs *regs) ...@@ -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) ...@@ -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) ...@@ -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;
}
pr_debug("ptrace: copied size %d [0x%08lx]\n", copied, tmp);
if (copied != sizeof(tmp))
break; break;
ret = put_user(tmp, datap); 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);
if (copied == to_copy)
ret = put_user(tmp, datap);
break; break;
} }
...@@ -277,9 +285,9 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) ...@@ -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) ...@@ -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;
}
pr_debug("ptrace: copied size %d\n", copied);
if (copied != sizeof(data))
break; break;
ret = 0; 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);
if (copied == to_copy)
ret = 0;
break; break;
} }
......
...@@ -112,7 +112,7 @@ void __cpuinit bfin_setup_caches(unsigned int cpu) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 = { ...@@ -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);
} }
/*
* 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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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;
} else if (address < CONFIG_BOOT_LOAD) {
/* Problem somewhere before the kernel start address */
strcat(buf, "/* Maybe null pointer? */");
return;
} else if (address >= COREMMR_BASE) {
strcat(buf, "/* core mmrs */");
return; return;
}
/* Problem somewhere before the kernel start address */ } else if (address >= SYSMMR_BASE) {
if (address < CONFIG_BOOT_LOAD) { strcat(buf, "/* system mmrs */");
sprintf(buf, "<0x%p> /* Maybe null pointer? */", (void *)address); 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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 ...@@ -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 ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 = { ...@@ -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 = { ...@@ -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[] = { ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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[] = { ...@@ -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 = { ...@@ -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 = { ...@@ -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) ...@@ -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 = { ...@@ -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 = { ...@@ -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[] = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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[] = { ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 @@ ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = &para_flash_data,
},
.num_resources = 1,
.resource = &para_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 = { ...@@ -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)
&para_flash_device,
#endif
&bfin_gpios_device, &bfin_gpios_device,
}; };
......
...@@ -67,6 +67,14 @@ static struct platform_device bfin_fb_adv7393_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 = { ...@@ -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 = { ...@@ -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 @@ ...@@ -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 = { ...@@ -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 = { ...@@ -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,19 +219,38 @@ static struct bfin5xx_spi_chip ad1836_spi_chip_info = { ...@@ -207,19 +219,38 @@ static struct bfin5xx_spi_chip ad1836_spi_chip_info = {
}; };
#endif #endif
#if defined(CONFIG_PBX) #if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE)
static struct bfin5xx_spi_chip spi_si3xxx_chip_info = { static struct bfin5xx_spi_chip spidev_chip_info = {
.ctl_reg = 0x4, /* send zero */ .enable_dma = 0,
.enable_dma = 0, .bits_per_word = 8,
.bits_per_word = 8,
.cs_change_per_word = 1,
}; };
#endif #endif
#if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE) #if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
static struct bfin5xx_spi_chip spidev_chip_info = { #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, .enable_dma = 0,
.bits_per_word = 8, .bits_per_word = 8,
.pio_interrupt = 0,
}; };
#endif #endif
...@@ -250,33 +281,14 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = { ...@@ -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 = { ...@@ -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[] = { ...@@ -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) ...@@ -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 { ...@@ -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 @@ ...@@ -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 ...@@ -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 @@ ...@@ -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
This diff is collapsed.
/* /*
* 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 @@ ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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[] = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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) ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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",
......
This diff is collapsed.
...@@ -45,6 +45,7 @@ ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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[] = { ...@@ -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) ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 = { ...@@ -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 = { ...@@ -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[] = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 @@ ...@@ -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 */
......
...@@ -1310,6 +1310,7 @@ ...@@ -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)
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment