Commit ae42b9e1 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: (21 commits)
  Blackfin: define HARDIRQ_BITS again for now
  arch/blackfin: Add kmalloc NULL tests
  Blackfin: add CPLB entries for Core B on-chip L1 SRAM regions
  Blackfin: work around anomaly 05000189
  Blackfin: drop per-cpu loops_per_jiffy tracking
  Blackfin: fix bugs in GPIO resume code
  Blackfin: bf537-stamp: fix irq decl for AD7142
  Blackfin: fix handling of IPEND in interrupt context save
  Blackfin: drop duplicate runtime checking of anomaly 05000448
  Blackfin: fix incomplete renaming of the bfin-twi-lcd driver
  Blackfin: fix wrong CTS inversion
  Blackfin: update handling of anomaly 364 (wrong rev id in BF527-0.1)
  Blackfin: fix early_dma_memcpy() handling of busy channels
  Blackfin: handle BF561 Core B memory regions better when SMP=n
  Blackfin: fix miscompilation in lshrdi3
  Blackfin: fix silent crash when no uClinux MTD filesystem exists
  Blackfin: restore exception banner when dumping crash info
  Blackfin: work around anomaly 05000281
  Blackfin: update anomaly lists to match latest sheets/usage
  Blackfin: drop dead flash_probe call
  ...
parents 6cdbf734 6843f405
...@@ -223,9 +223,10 @@ ...@@ -223,9 +223,10 @@
[--sp] = RETN; [--sp] = RETN;
[--sp] = RETE; [--sp] = RETE;
[--sp] = SEQSTAT; [--sp] = SEQSTAT;
#ifdef CONFIG_KGDB #ifdef CONFIG_DEBUG_KERNEL
r1.l = lo(IPEND); p1.l = lo(IPEND);
r1.h = hi(IPEND); p1.h = hi(IPEND);
r1 = [p1];
[--sp] = r1; [--sp] = r1;
#else #else
[--sp] = r0; /* Skip IPEND as well. */ [--sp] = r0; /* Skip IPEND as well. */
......
...@@ -32,7 +32,6 @@ struct blackfin_cpudata { ...@@ -32,7 +32,6 @@ struct blackfin_cpudata {
struct task_struct *idle; struct task_struct *idle;
unsigned int imemctl; unsigned int imemctl;
unsigned int dmemctl; unsigned int dmemctl;
unsigned long loops_per_jiffy;
unsigned long dcache_invld_count; unsigned long dcache_invld_count;
unsigned long icache_invld_count; unsigned long icache_invld_count;
}; };
......
...@@ -6,6 +6,9 @@ ...@@ -6,6 +6,9 @@
extern void ack_bad_irq(unsigned int irq); extern void ack_bad_irq(unsigned int irq);
#define ack_bad_irq ack_bad_irq #define ack_bad_irq ack_bad_irq
/* Define until common code gets sane defaults */
#define HARDIRQ_BITS 9
#include <asm-generic/hardirq.h> #include <asm-generic/hardirq.h>
#endif #endif
...@@ -105,23 +105,16 @@ static inline uint32_t __pure bfin_revid(void) ...@@ -105,23 +105,16 @@ static inline uint32_t __pure bfin_revid(void)
/* Always use CHIPID, to work around ANOMALY_05000234 */ /* Always use CHIPID, to work around ANOMALY_05000234 */
uint32_t revid = (bfin_read_CHIPID() & CHIPID_VERSION) >> 28; uint32_t revid = (bfin_read_CHIPID() & CHIPID_VERSION) >> 28;
#ifdef CONFIG_BF52x #ifdef _BOOTROM_GET_DXE_ADDRESS_TWI
/* ANOMALY_05000357 /*
* ANOMALY_05000364
* Incorrect Revision Number in DSPID Register * Incorrect Revision Number in DSPID Register
*/ */
if (revid == 0) if (ANOMALY_05000364 &&
switch (bfin_read16(_BOOTROM_GET_DXE_ADDRESS_TWI)) { bfin_read16(_BOOTROM_GET_DXE_ADDRESS_TWI) == 0x2796)
case 0x0010:
revid = 0;
break;
case 0x2796:
revid = 1; revid = 1;
break;
default:
revid = 0xFFFF;
break;
}
#endif #endif
return revid; return revid;
} }
......
...@@ -253,32 +253,31 @@ void __init early_dma_memcpy(void *pdst, const void *psrc, size_t size) ...@@ -253,32 +253,31 @@ void __init early_dma_memcpy(void *pdst, const void *psrc, size_t size)
BUG_ON(src % 4); BUG_ON(src % 4);
BUG_ON(size % 4); BUG_ON(size % 4);
/* Force a sync in case a previous config reset on this channel
* occurred. This is needed so subsequent writes to DMA registers
* are not spuriously lost/corrupted.
*/
__builtin_bfin_ssync();
src_ch = 0; src_ch = 0;
/* Find an avalible memDMA channel */ /* Find an avalible memDMA channel */
while (1) { while (1) {
if (!src_ch || src_ch == (struct dma_register *)MDMA_S1_NEXT_DESC_PTR) { if (src_ch == (struct dma_register *)MDMA_S0_NEXT_DESC_PTR) {
dst_ch = (struct dma_register *)MDMA_D0_NEXT_DESC_PTR;
src_ch = (struct dma_register *)MDMA_S0_NEXT_DESC_PTR;
} else {
dst_ch = (struct dma_register *)MDMA_D1_NEXT_DESC_PTR; dst_ch = (struct dma_register *)MDMA_D1_NEXT_DESC_PTR;
src_ch = (struct dma_register *)MDMA_S1_NEXT_DESC_PTR; src_ch = (struct dma_register *)MDMA_S1_NEXT_DESC_PTR;
} else {
dst_ch = (struct dma_register *)MDMA_D0_NEXT_DESC_PTR;
src_ch = (struct dma_register *)MDMA_S0_NEXT_DESC_PTR;
} }
if (!bfin_read16(&src_ch->cfg)) { if (!bfin_read16(&src_ch->cfg))
break; break;
} else { else if (bfin_read16(&dst_ch->irq_status) & DMA_DONE) {
if (bfin_read16(&src_ch->irq_status) & DMA_DONE)
bfin_write16(&src_ch->cfg, 0); bfin_write16(&src_ch->cfg, 0);
break;
} }
} }
/* Force a sync in case a previous config reset on this channel
* occurred. This is needed so subsequent writes to DMA registers
* are not spuriously lost/corrupted.
*/
__builtin_bfin_ssync();
/* Destination */ /* Destination */
bfin_write32(&dst_ch->start_addr, dst); bfin_write32(&dst_ch->start_addr, dst);
bfin_write16(&dst_ch->x_count, size >> 2); bfin_write16(&dst_ch->x_count, size >> 2);
......
...@@ -686,14 +686,12 @@ void bfin_gpio_pm_hibernate_restore(void) ...@@ -686,14 +686,12 @@ void bfin_gpio_pm_hibernate_restore(void)
*port_fer[bank] = gpio_bank_saved[bank].fer; *port_fer[bank] = gpio_bank_saved[bank].fer;
#endif #endif
gpio_array[bank]->inen = gpio_bank_saved[bank].inen; gpio_array[bank]->inen = gpio_bank_saved[bank].inen;
gpio_array[bank]->data_set = gpio_bank_saved[bank].data
& gpio_bank_saved[bank].dir;
gpio_array[bank]->dir = gpio_bank_saved[bank].dir; gpio_array[bank]->dir = gpio_bank_saved[bank].dir;
gpio_array[bank]->polar = gpio_bank_saved[bank].polar; gpio_array[bank]->polar = gpio_bank_saved[bank].polar;
gpio_array[bank]->edge = gpio_bank_saved[bank].edge; gpio_array[bank]->edge = gpio_bank_saved[bank].edge;
gpio_array[bank]->both = gpio_bank_saved[bank].both; gpio_array[bank]->both = gpio_bank_saved[bank].both;
gpio_array[bank]->data_set = gpio_bank_saved[bank].data
| gpio_bank_saved[bank].dir;
gpio_array[bank]->maska = gpio_bank_saved[bank].maska; gpio_array[bank]->maska = gpio_bank_saved[bank].maska;
} }
AWA_DUMMY_READ(maska); AWA_DUMMY_READ(maska);
......
...@@ -72,13 +72,24 @@ void __init generate_cplb_tables_cpu(unsigned int cpu) ...@@ -72,13 +72,24 @@ void __init generate_cplb_tables_cpu(unsigned int cpu)
} }
/* Cover L1 memory. One 4M area for code and data each is enough. */ /* Cover L1 memory. One 4M area for code and data each is enough. */
if (cpu == 0) {
if (L1_DATA_A_LENGTH || L1_DATA_B_LENGTH) { if (L1_DATA_A_LENGTH || L1_DATA_B_LENGTH) {
d_tbl[i_d].addr = L1_DATA_A_START; d_tbl[i_d].addr = L1_DATA_A_START;
d_tbl[i_d++].data = L1_DMEMORY | PAGE_SIZE_4MB; d_tbl[i_d++].data = L1_DMEMORY | PAGE_SIZE_4MB;
} }
i_tbl[i_i].addr = L1_CODE_START; i_tbl[i_i].addr = L1_CODE_START;
i_tbl[i_i++].data = L1_IMEMORY | PAGE_SIZE_4MB; i_tbl[i_i++].data = L1_IMEMORY | PAGE_SIZE_4MB;
}
#ifdef CONFIG_SMP
else {
if (L1_DATA_A_LENGTH || L1_DATA_B_LENGTH) {
d_tbl[i_d].addr = COREB_L1_DATA_A_START;
d_tbl[i_d++].data = L1_DMEMORY | PAGE_SIZE_4MB;
}
i_tbl[i_i].addr = COREB_L1_CODE_START;
i_tbl[i_i++].data = L1_IMEMORY | PAGE_SIZE_4MB;
}
#endif
first_switched_dcplb = i_d; first_switched_dcplb = i_d;
first_switched_icplb = i_i; first_switched_icplb = i_i;
......
...@@ -361,7 +361,7 @@ static inline ...@@ -361,7 +361,7 @@ static inline
int in_mem_const(unsigned long addr, unsigned long size, int in_mem_const(unsigned long addr, unsigned long size,
unsigned long const_addr, unsigned long const_size) unsigned long const_addr, unsigned long const_size)
{ {
return in_mem_const_off(addr, 0, size, const_addr, const_size); return in_mem_const_off(addr, size, 0, const_addr, const_size);
} }
#define IN_ASYNC(bnum, bctlnum) \ #define IN_ASYNC(bnum, bctlnum) \
({ \ ({ \
...@@ -390,13 +390,13 @@ int bfin_mem_access_type(unsigned long addr, unsigned long size) ...@@ -390,13 +390,13 @@ int bfin_mem_access_type(unsigned long addr, unsigned long size)
if (in_mem_const(addr, size, L1_DATA_B_START, L1_DATA_B_LENGTH)) if (in_mem_const(addr, size, L1_DATA_B_START, L1_DATA_B_LENGTH))
return cpu == 0 ? BFIN_MEM_ACCESS_CORE : BFIN_MEM_ACCESS_IDMA; return cpu == 0 ? BFIN_MEM_ACCESS_CORE : BFIN_MEM_ACCESS_IDMA;
#ifdef COREB_L1_CODE_START #ifdef COREB_L1_CODE_START
if (in_mem_const(addr, size, COREB_L1_CODE_START, L1_CODE_LENGTH)) if (in_mem_const(addr, size, COREB_L1_CODE_START, COREB_L1_CODE_LENGTH))
return cpu == 1 ? BFIN_MEM_ACCESS_ITEST : BFIN_MEM_ACCESS_IDMA; return cpu == 1 ? BFIN_MEM_ACCESS_ITEST : BFIN_MEM_ACCESS_IDMA;
if (in_mem_const(addr, size, COREB_L1_SCRATCH_START, L1_SCRATCH_LENGTH)) if (in_mem_const(addr, size, COREB_L1_SCRATCH_START, L1_SCRATCH_LENGTH))
return cpu == 1 ? BFIN_MEM_ACCESS_CORE_ONLY : -EFAULT; return cpu == 1 ? BFIN_MEM_ACCESS_CORE_ONLY : -EFAULT;
if (in_mem_const(addr, size, COREB_L1_DATA_A_START, L1_DATA_A_LENGTH)) if (in_mem_const(addr, size, COREB_L1_DATA_A_START, COREB_L1_DATA_A_LENGTH))
return cpu == 1 ? BFIN_MEM_ACCESS_CORE : BFIN_MEM_ACCESS_IDMA; return cpu == 1 ? BFIN_MEM_ACCESS_CORE : BFIN_MEM_ACCESS_IDMA;
if (in_mem_const(addr, size, COREB_L1_DATA_B_START, L1_DATA_B_LENGTH)) if (in_mem_const(addr, size, COREB_L1_DATA_B_START, COREB_L1_DATA_B_LENGTH))
return cpu == 1 ? BFIN_MEM_ACCESS_CORE : BFIN_MEM_ACCESS_IDMA; return cpu == 1 ? BFIN_MEM_ACCESS_CORE : BFIN_MEM_ACCESS_IDMA;
#endif #endif
if (in_mem_const(addr, size, L2_START, L2_LENGTH)) if (in_mem_const(addr, size, L2_START, L2_LENGTH))
...@@ -472,13 +472,13 @@ int _access_ok(unsigned long addr, unsigned long size) ...@@ -472,13 +472,13 @@ int _access_ok(unsigned long addr, unsigned long size)
if (in_mem_const_off(addr, size, _ebss_b_l1 - _sdata_b_l1, L1_DATA_B_START, L1_DATA_B_LENGTH)) if (in_mem_const_off(addr, size, _ebss_b_l1 - _sdata_b_l1, L1_DATA_B_START, L1_DATA_B_LENGTH))
return 1; return 1;
#ifdef COREB_L1_CODE_START #ifdef COREB_L1_CODE_START
if (in_mem_const(addr, size, COREB_L1_CODE_START, L1_CODE_LENGTH)) if (in_mem_const(addr, size, COREB_L1_CODE_START, COREB_L1_CODE_LENGTH))
return 1; return 1;
if (in_mem_const(addr, size, COREB_L1_SCRATCH_START, L1_SCRATCH_LENGTH)) if (in_mem_const(addr, size, COREB_L1_SCRATCH_START, L1_SCRATCH_LENGTH))
return 1; return 1;
if (in_mem_const(addr, size, COREB_L1_DATA_A_START, L1_DATA_A_LENGTH)) if (in_mem_const(addr, size, COREB_L1_DATA_A_START, COREB_L1_DATA_A_LENGTH))
return 1; return 1;
if (in_mem_const(addr, size, COREB_L1_DATA_B_START, L1_DATA_B_LENGTH)) if (in_mem_const(addr, size, COREB_L1_DATA_B_START, COREB_L1_DATA_B_LENGTH))
return 1; return 1;
#endif #endif
if (in_mem_const_off(addr, size, _ebss_l2 - _stext_l2, L2_START, L2_LENGTH)) if (in_mem_const_off(addr, size, _ebss_l2 - _stext_l2, L2_START, L2_LENGTH))
......
...@@ -168,7 +168,6 @@ void __cpuinit bfin_setup_cpudata(unsigned int cpu) ...@@ -168,7 +168,6 @@ void __cpuinit bfin_setup_cpudata(unsigned int cpu)
struct blackfin_cpudata *cpudata = &per_cpu(cpu_data, cpu); struct blackfin_cpudata *cpudata = &per_cpu(cpu_data, cpu);
cpudata->idle = current; cpudata->idle = current;
cpudata->loops_per_jiffy = loops_per_jiffy;
cpudata->imemctl = bfin_read_IMEM_CONTROL(); cpudata->imemctl = bfin_read_IMEM_CONTROL();
cpudata->dmemctl = bfin_read_DMEM_CONTROL(); cpudata->dmemctl = bfin_read_DMEM_CONTROL();
} }
...@@ -568,17 +567,23 @@ static __init void memory_setup(void) ...@@ -568,17 +567,23 @@ static __init void memory_setup(void)
# endif /* ANOMALY_05000263 */ # endif /* ANOMALY_05000263 */
# endif /* CONFIG_ROMFS_FS */ # endif /* CONFIG_ROMFS_FS */
/* Since the default MTD_UCLINUX has no magic number, we just blindly
* read 8 past the end of the kernel's image, and look at it.
* When no image is attached, mtd_size is set to a random number
* Do some basic sanity checks before operating on things
*/
if (mtd_size == 0 || memory_end <= mtd_size) {
pr_emerg("Could not find valid ram mtd attached.\n");
} else {
memory_end -= mtd_size; memory_end -= mtd_size;
if (mtd_size == 0) {
console_init();
panic("Don't boot kernel without rootfs attached.");
}
/* Relocate MTD image to the top of memory after the uncached memory area */ /* Relocate MTD image to the top of memory after the uncached memory area */
uclinux_ram_map.phys = memory_mtd_start = memory_end; uclinux_ram_map.phys = memory_mtd_start = memory_end;
uclinux_ram_map.size = mtd_size; uclinux_ram_map.size = mtd_size;
pr_info("Found mtd parition at 0x%p, (len=0x%lx), moving to 0x%p\n",
_end, mtd_size, (void *)memory_mtd_start);
dma_memcpy((void *)uclinux_ram_map.phys, _end, uclinux_ram_map.size); dma_memcpy((void *)uclinux_ram_map.phys, _end, uclinux_ram_map.size);
}
#endif /* CONFIG_MTD_UCLINUX */ #endif /* CONFIG_MTD_UCLINUX */
#if (defined(CONFIG_BFIN_EXTMEM_ICACHEABLE) && ANOMALY_05000263) #if (defined(CONFIG_BFIN_EXTMEM_ICACHEABLE) && ANOMALY_05000263)
...@@ -868,13 +873,6 @@ void __init setup_arch(char **cmdline_p) ...@@ -868,13 +873,6 @@ void __init setup_arch(char **cmdline_p)
else else
printk(KERN_CONT "and Disabled\n"); printk(KERN_CONT "and Disabled\n");
#if defined(CONFIG_CHR_DEV_FLASH) || defined(CONFIG_BLK_DEV_FLASH)
/* we need to initialize the Flashrom device here since we might
* do things with flash early on in the boot
*/
flash_probe();
#endif
printk(KERN_INFO "Boot Mode: %i\n", bfin_read_SYSCR() & 0xF); printk(KERN_INFO "Boot Mode: %i\n", bfin_read_SYSCR() & 0xF);
/* Newer parts mirror SWRST bits in SYSCR */ /* Newer parts mirror SWRST bits in SYSCR */
...@@ -938,10 +936,6 @@ void __init setup_arch(char **cmdline_p) ...@@ -938,10 +936,6 @@ void __init setup_arch(char **cmdline_p)
CPU, bfin_revid()); CPU, bfin_revid());
} }
/* We can't run on BF548-0.1 due to ANOMALY 05000448 */
if (bfin_cpuid() == 0x27de && bfin_revid() == 1)
panic("You can't run on this processor due to 05000448");
printk(KERN_INFO "Blackfin Linux support by http://blackfin.uclinux.org/\n"); printk(KERN_INFO "Blackfin Linux support by http://blackfin.uclinux.org/\n");
printk(KERN_INFO "Processor Speed: %lu MHz core clock and %lu MHz System Clock\n", printk(KERN_INFO "Processor Speed: %lu MHz core clock and %lu MHz System Clock\n",
...@@ -1164,9 +1158,9 @@ static int show_cpuinfo(struct seq_file *m, void *v) ...@@ -1164,9 +1158,9 @@ static int show_cpuinfo(struct seq_file *m, void *v)
sclk/1000000, sclk%1000000); sclk/1000000, sclk%1000000);
seq_printf(m, "bogomips\t: %lu.%02lu\n" seq_printf(m, "bogomips\t: %lu.%02lu\n"
"Calibration\t: %lu loops\n", "Calibration\t: %lu loops\n",
(cpudata->loops_per_jiffy * HZ) / 500000, (loops_per_jiffy * HZ) / 500000,
((cpudata->loops_per_jiffy * HZ) / 5000) % 100, ((loops_per_jiffy * HZ) / 5000) % 100,
(cpudata->loops_per_jiffy * HZ)); (loops_per_jiffy * HZ));
/* Check Cache configutation */ /* Check Cache configutation */
switch (cpudata->dmemctl & (1 << DMC0_P | 1 << DMC1_P)) { switch (cpudata->dmemctl & (1 << DMC0_P | 1 << DMC1_P)) {
......
...@@ -570,11 +570,12 @@ asmlinkage void trap_c(struct pt_regs *fp) ...@@ -570,11 +570,12 @@ asmlinkage void trap_c(struct pt_regs *fp)
if (kernel_mode_regs(fp) || (current && !current->mm)) { if (kernel_mode_regs(fp) || (current && !current->mm)) {
console_verbose(); console_verbose();
oops_in_progress = 1; oops_in_progress = 1;
if (strerror)
verbose_printk(strerror);
} }
if (sig != SIGTRAP) { if (sig != SIGTRAP) {
if (strerror)
verbose_printk(strerror);
dump_bfin_process(fp); dump_bfin_process(fp);
dump_bfin_mem(fp); dump_bfin_mem(fp);
show_regs(fp); show_regs(fp);
...@@ -619,7 +620,9 @@ asmlinkage void trap_c(struct pt_regs *fp) ...@@ -619,7 +620,9 @@ asmlinkage void trap_c(struct pt_regs *fp)
force_sig_info(sig, &info, current); force_sig_info(sig, &info, current);
} }
if (ANOMALY_05000461 && trapnr == VEC_HWERR && !access_ok(VERIFY_READ, fp->pc, 8)) if ((ANOMALY_05000461 && trapnr == VEC_HWERR && !access_ok(VERIFY_READ, fp->pc, 8)) ||
(ANOMALY_05000281 && trapnr == VEC_HWERR) ||
(ANOMALY_05000189 && (trapnr == VEC_CPLB_I_VL || trapnr == VEC_CPLB_VL)))
fp->pc = SAFE_USER_INSTRUCTION; fp->pc = SAFE_USER_INSTRUCTION;
traps_done: traps_done:
......
...@@ -27,21 +27,7 @@ ...@@ -27,21 +27,7 @@
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#define BITS_PER_UNIT 8 #include "gcclib.h"
typedef int SItype __attribute__ ((mode(SI)));
typedef unsigned int USItype __attribute__ ((mode(SI)));
typedef int DItype __attribute__ ((mode(DI)));
typedef int word_type __attribute__ ((mode(__word__)));
struct DIstruct {
SItype high, low;
};
typedef union {
struct DIstruct s;
DItype ll;
} DIunion;
#ifdef CONFIG_ARITHMETIC_OPS_L1 #ifdef CONFIG_ARITHMETIC_OPS_L1
DItype __lshrdi3(DItype u, word_type b)__attribute__((l1_text)); DItype __lshrdi3(DItype u, word_type b)__attribute__((l1_text));
......
...@@ -534,7 +534,7 @@ static struct platform_device i2c_bfin_twi_device = { ...@@ -534,7 +534,7 @@ static struct platform_device i2c_bfin_twi_device = {
#endif #endif
static struct i2c_board_info __initdata bfin_i2c_board_info[] = { static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
#if defined(CONFIG_BFIN_TWI_LCD) || defined(CONFIG_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),
}, },
......
...@@ -82,6 +82,7 @@ ...@@ -82,6 +82,7 @@
#define ANOMALY_05000179 (0) #define ANOMALY_05000179 (0)
#define ANOMALY_05000182 (0) #define ANOMALY_05000182 (0)
#define ANOMALY_05000183 (0) #define ANOMALY_05000183 (0)
#define ANOMALY_05000189 (0)
#define ANOMALY_05000198 (0) #define ANOMALY_05000198 (0)
#define ANOMALY_05000202 (0) #define ANOMALY_05000202 (0)
#define ANOMALY_05000215 (0) #define ANOMALY_05000215 (0)
...@@ -117,6 +118,7 @@ ...@@ -117,6 +118,7 @@
#define ANOMALY_05000357 (0) #define ANOMALY_05000357 (0)
#define ANOMALY_05000362 (1) #define ANOMALY_05000362 (1)
#define ANOMALY_05000363 (0) #define ANOMALY_05000363 (0)
#define ANOMALY_05000364 (0)
#define ANOMALY_05000371 (0) #define ANOMALY_05000371 (0)
#define ANOMALY_05000380 (0) #define ANOMALY_05000380 (0)
#define ANOMALY_05000386 (0) #define ANOMALY_05000386 (0)
......
...@@ -793,7 +793,7 @@ static struct platform_device i2c_bfin_twi_device = { ...@@ -793,7 +793,7 @@ static struct platform_device i2c_bfin_twi_device = {
#endif #endif
static struct i2c_board_info __initdata bfin_i2c_board_info[] = { static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
#if defined(CONFIG_BFIN_TWI_LCD) || defined(CONFIG_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", .type = "pcf8574_lcd",
......
...@@ -591,7 +591,7 @@ static struct platform_device i2c_bfin_twi_device = { ...@@ -591,7 +591,7 @@ static struct platform_device i2c_bfin_twi_device = {
#endif #endif
static struct i2c_board_info __initdata bfin_i2c_board_info[] = { static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
#if defined(CONFIG_BFIN_TWI_LCD) || defined(CONFIG_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),
}, },
......
...@@ -858,7 +858,7 @@ static struct platform_device i2c_bfin_twi_device = { ...@@ -858,7 +858,7 @@ static struct platform_device i2c_bfin_twi_device = {
#endif #endif
static struct i2c_board_info __initdata bfin_i2c_board_info[] = { static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
#if defined(CONFIG_BFIN_TWI_LCD) || defined(CONFIG_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),
}, },
......
...@@ -176,6 +176,8 @@ ...@@ -176,6 +176,8 @@
#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 */
#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)
/* Incorrect Default Hysteresis Setting for RESET, NMI, and BMODE Signals */ /* Incorrect Default Hysteresis Setting for RESET, NMI, and BMODE Signals */
...@@ -201,6 +203,7 @@ ...@@ -201,6 +203,7 @@
#define ANOMALY_05000179 (0) #define ANOMALY_05000179 (0)
#define ANOMALY_05000182 (0) #define ANOMALY_05000182 (0)
#define ANOMALY_05000183 (0) #define ANOMALY_05000183 (0)
#define ANOMALY_05000189 (0)
#define ANOMALY_05000198 (0) #define ANOMALY_05000198 (0)
#define ANOMALY_05000202 (0) #define ANOMALY_05000202 (0)
#define ANOMALY_05000215 (0) #define ANOMALY_05000215 (0)
...@@ -238,6 +241,5 @@ ...@@ -238,6 +241,5 @@
#define ANOMALY_05000412 (0) #define ANOMALY_05000412 (0)
#define ANOMALY_05000447 (0) #define ANOMALY_05000447 (0)
#define ANOMALY_05000448 (0) #define ANOMALY_05000448 (0)
#define ANOMALY_05000450 (0)
#endif #endif
...@@ -453,7 +453,7 @@ static struct i2c_board_info __initdata bfin_i2c_board_info[] = { ...@@ -453,7 +453,7 @@ static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
.irq = 39, .irq = 39,
}, },
#endif #endif
#if defined(CONFIG_BFIN_TWI_LCD) || defined(CONFIG_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),
}, },
......
...@@ -335,6 +335,7 @@ ...@@ -335,6 +335,7 @@
#define ANOMALY_05000323 (0) #define ANOMALY_05000323 (0)
#define ANOMALY_05000353 (1) #define ANOMALY_05000353 (1)
#define ANOMALY_05000362 (1) #define ANOMALY_05000362 (1)
#define ANOMALY_05000364 (0)
#define ANOMALY_05000380 (0) #define ANOMALY_05000380 (0)
#define ANOMALY_05000386 (1) #define ANOMALY_05000386 (1)
#define ANOMALY_05000389 (0) #define ANOMALY_05000389 (0)
......
...@@ -1313,10 +1313,10 @@ static struct i2c_board_info __initdata bfin_i2c_board_info[] = { ...@@ -1313,10 +1313,10 @@ static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
#if defined(CONFIG_JOYSTICK_AD7142) || defined(CONFIG_JOYSTICK_AD7142_MODULE) #if defined(CONFIG_JOYSTICK_AD7142) || defined(CONFIG_JOYSTICK_AD7142_MODULE)
{ {
I2C_BOARD_INFO("ad7142_joystick", 0x2C), I2C_BOARD_INFO("ad7142_joystick", 0x2C),
.irq = IRQ_PF5, .irq = IRQ_PG5,
}, },
#endif #endif
#if defined(CONFIG_BFIN_TWI_LCD) || defined(CONFIG_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),
}, },
......
...@@ -167,6 +167,7 @@ ...@@ -167,6 +167,7 @@
#define ANOMALY_05000179 (0) #define ANOMALY_05000179 (0)
#define ANOMALY_05000182 (0) #define ANOMALY_05000182 (0)
#define ANOMALY_05000183 (0) #define ANOMALY_05000183 (0)
#define ANOMALY_05000189 (0)
#define ANOMALY_05000198 (0) #define ANOMALY_05000198 (0)
#define ANOMALY_05000202 (0) #define ANOMALY_05000202 (0)
#define ANOMALY_05000215 (0) #define ANOMALY_05000215 (0)
...@@ -186,6 +187,7 @@ ...@@ -186,6 +187,7 @@
#define ANOMALY_05000353 (1) #define ANOMALY_05000353 (1)
#define ANOMALY_05000362 (1) #define ANOMALY_05000362 (1)
#define ANOMALY_05000363 (0) #define ANOMALY_05000363 (0)
#define ANOMALY_05000364 (0)
#define ANOMALY_05000380 (0) #define ANOMALY_05000380 (0)
#define ANOMALY_05000386 (1) #define ANOMALY_05000386 (1)
#define ANOMALY_05000389 (0) #define ANOMALY_05000389 (0)
......
...@@ -137,6 +137,7 @@ ...@@ -137,6 +137,7 @@
#define ANOMALY_05000158 (0) #define ANOMALY_05000158 (0)
#define ANOMALY_05000171 (0) #define ANOMALY_05000171 (0)
#define ANOMALY_05000182 (0) #define ANOMALY_05000182 (0)
#define ANOMALY_05000189 (0)
#define ANOMALY_05000198 (0) #define ANOMALY_05000198 (0)
#define ANOMALY_05000202 (0) #define ANOMALY_05000202 (0)
#define ANOMALY_05000215 (0) #define ANOMALY_05000215 (0)
...@@ -160,6 +161,7 @@ ...@@ -160,6 +161,7 @@
#define ANOMALY_05000353 (1) #define ANOMALY_05000353 (1)
#define ANOMALY_05000362 (1) #define ANOMALY_05000362 (1)
#define ANOMALY_05000363 (0) #define ANOMALY_05000363 (0)
#define ANOMALY_05000364 (0)
#define ANOMALY_05000380 (0) #define ANOMALY_05000380 (0)
#define ANOMALY_05000386 (1) #define ANOMALY_05000386 (1)
#define ANOMALY_05000389 (0) #define ANOMALY_05000389 (0)
......
...@@ -864,7 +864,7 @@ static struct i2c_board_info __initdata bfin_i2c_board_info0[] = { ...@@ -864,7 +864,7 @@ static struct i2c_board_info __initdata bfin_i2c_board_info0[] = {
#if !defined(CONFIG_BF542) /* The BF542 only has 1 TWI */ #if !defined(CONFIG_BF542) /* The BF542 only has 1 TWI */
static struct i2c_board_info __initdata bfin_i2c_board_info1[] = { static struct i2c_board_info __initdata bfin_i2c_board_info1[] = {
#if defined(CONFIG_BFIN_TWI_LCD) || defined(CONFIG_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),
}, },
......
...@@ -195,6 +195,7 @@ ...@@ -195,6 +195,7 @@
#define ANOMALY_05000179 (0) #define ANOMALY_05000179 (0)
#define ANOMALY_05000182 (0) #define ANOMALY_05000182 (0)
#define ANOMALY_05000183 (0) #define ANOMALY_05000183 (0)
#define ANOMALY_05000189 (0)
#define ANOMALY_05000198 (0) #define ANOMALY_05000198 (0)
#define ANOMALY_05000202 (0) #define ANOMALY_05000202 (0)
#define ANOMALY_05000215 (0) #define ANOMALY_05000215 (0)
...@@ -226,6 +227,7 @@ ...@@ -226,6 +227,7 @@
#define ANOMALY_05000323 (0) #define ANOMALY_05000323 (0)
#define ANOMALY_05000362 (1) #define ANOMALY_05000362 (1)
#define ANOMALY_05000363 (0) #define ANOMALY_05000363 (0)
#define ANOMALY_05000364 (0)
#define ANOMALY_05000380 (0) #define ANOMALY_05000380 (0)
#define ANOMALY_05000400 (0) #define ANOMALY_05000400 (0)
#define ANOMALY_05000412 (0) #define ANOMALY_05000412 (0)
......
...@@ -288,6 +288,7 @@ ...@@ -288,6 +288,7 @@
#define ANOMALY_05000273 (0) #define ANOMALY_05000273 (0)
#define ANOMALY_05000311 (0) #define ANOMALY_05000311 (0)
#define ANOMALY_05000353 (1) #define ANOMALY_05000353 (1)
#define ANOMALY_05000364 (0)
#define ANOMALY_05000380 (0) #define ANOMALY_05000380 (0)
#define ANOMALY_05000386 (1) #define ANOMALY_05000386 (1)
#define ANOMALY_05000389 (0) #define ANOMALY_05000389 (0)
......
...@@ -37,7 +37,6 @@ ...@@ -37,7 +37,6 @@
/* Memory Map for ADSP-BF561 processors */ /* Memory Map for ADSP-BF561 processors */
#ifdef CONFIG_BF561
#define COREA_L1_CODE_START 0xFFA00000 #define COREA_L1_CODE_START 0xFFA00000
#define COREA_L1_DATA_A_START 0xFF800000 #define COREA_L1_DATA_A_START 0xFF800000
#define COREA_L1_DATA_B_START 0xFF900000 #define COREA_L1_DATA_B_START 0xFF900000
...@@ -74,6 +73,28 @@ ...@@ -74,6 +73,28 @@
#define BFIN_DCACHESIZE (0*1024) #define BFIN_DCACHESIZE (0*1024)
#define BFIN_DSUPBANKS 0 #define BFIN_DSUPBANKS 0
#endif /*CONFIG_BFIN_DCACHE*/ #endif /*CONFIG_BFIN_DCACHE*/
/*
* If we are in SMP mode, then the cache settings of Core B will match
* the settings of Core A. If we aren't, then we assume Core B is not
* using any cache. This allows the rest of the kernel to work with
* the core in either mode as we are only loading user code into it and
* it is the user's problem to make sure they aren't doing something
* stupid there.
*
* Note that we treat the L1 code region as a contiguous blob to make
* the rest of the kernel simpler. Easier to check one region than a
* bunch of small ones. Again, possible misbehavior here is the fault
* of the user -- don't try to use memory that doesn't exist.
*/
#ifdef CONFIG_SMP
# define COREB_L1_CODE_LENGTH L1_CODE_LENGTH
# define COREB_L1_DATA_A_LENGTH L1_DATA_A_LENGTH
# define COREB_L1_DATA_B_LENGTH L1_DATA_B_LENGTH
#else
# define COREB_L1_CODE_LENGTH 0x14000
# define COREB_L1_DATA_A_LENGTH 0x8000
# define COREB_L1_DATA_B_LENGTH 0x8000
#endif #endif
/* Level 2 Memory */ /* Level 2 Memory */
......
...@@ -218,7 +218,7 @@ ENTRY(_ex_single_step) ...@@ -218,7 +218,7 @@ ENTRY(_ex_single_step)
/* Single stepping only a single instruction, so clear the trace /* Single stepping only a single instruction, so clear the trace
* bit here. */ * bit here. */
r7 = syscfg; r7 = syscfg;
bitclr (r7, 0); bitclr (r7, SYSCFG_SSSTEP_P);
syscfg = R7; syscfg = R7;
jump _ex_trap_c; jump _ex_trap_c;
...@@ -251,7 +251,7 @@ ENTRY(_ex_single_step) ...@@ -251,7 +251,7 @@ ENTRY(_ex_single_step)
if !cc jump _bfin_return_from_exception; if !cc jump _bfin_return_from_exception;
r7 = syscfg; r7 = syscfg;
bitclr (r7, 0); bitclr (r7, SYSCFG_SSSTEP_P); /* Turn off single step */
syscfg = R7; syscfg = R7;
/* Fall through to _bfin_return_from_exception. */ /* Fall through to _bfin_return_from_exception. */
...@@ -342,9 +342,11 @@ ENTRY(_ex_trap_c) ...@@ -342,9 +342,11 @@ ENTRY(_ex_trap_c)
r6 = retx; r6 = retx;
[p5 + PDA_RETX] = r6; [p5 + PDA_RETX] = r6;
#endif #endif
/* Save the state of single stepping */
r6 = SYSCFG; r6 = SYSCFG;
[p5 + PDA_SYSCFG] = r6; [p5 + PDA_SYSCFG] = r6;
BITCLR(r6, 0); /* Clear it while we handle the exception in IRQ5 mode */
BITCLR(r6, SYSCFG_SSSTEP_P);
SYSCFG = r6; SYSCFG = r6;
/* Disable all interrupts, but make sure level 5 is enabled so /* Disable all interrupts, but make sure level 5 is enabled so
...@@ -367,7 +369,7 @@ ENDPROC(_ex_trap_c) ...@@ -367,7 +369,7 @@ ENDPROC(_ex_trap_c)
* exception. This is a unrecoverable event, so crash. * exception. This is a unrecoverable event, so crash.
* Note: this cannot be ENTRY() as we jump here with "if cc jump" ... * Note: this cannot be ENTRY() as we jump here with "if cc jump" ...
*/ */
_double_fault: ENTRY(_double_fault)
/* Turn caches & protection off, to ensure we don't get any more /* Turn caches & protection off, to ensure we don't get any more
* double exceptions * double exceptions
*/ */
...@@ -872,7 +874,7 @@ ENTRY(_ret_from_exception) ...@@ -872,7 +874,7 @@ ENTRY(_ret_from_exception)
raise 15; /* raise evt15 to do signal or reschedule */ raise 15; /* raise evt15 to do signal or reschedule */
4: 4:
r0 = syscfg; r0 = syscfg;
bitclr(r0, 0); bitclr(r0, SYSCFG_SSSTEP_P); /* Turn off single step */
syscfg = r0; syscfg = r0;
5: 5:
rts; rts;
......
...@@ -211,6 +211,8 @@ int smp_call_function(void (*func)(void *info), void *info, int wait) ...@@ -211,6 +211,8 @@ int smp_call_function(void (*func)(void *info), void *info, int wait)
return 0; return 0;
msg = kmalloc(sizeof(*msg), GFP_ATOMIC); msg = kmalloc(sizeof(*msg), GFP_ATOMIC);
if (!msg)
return -ENOMEM;
INIT_LIST_HEAD(&msg->list); INIT_LIST_HEAD(&msg->list);
msg->call_struct.func = func; msg->call_struct.func = func;
msg->call_struct.info = info; msg->call_struct.info = info;
...@@ -252,6 +254,8 @@ int smp_call_function_single(int cpuid, void (*func) (void *info), void *info, ...@@ -252,6 +254,8 @@ int smp_call_function_single(int cpuid, void (*func) (void *info), void *info,
cpu_set(cpu, callmap); cpu_set(cpu, callmap);
msg = kmalloc(sizeof(*msg), GFP_ATOMIC); msg = kmalloc(sizeof(*msg), GFP_ATOMIC);
if (!msg)
return -ENOMEM;
INIT_LIST_HEAD(&msg->list); INIT_LIST_HEAD(&msg->list);
msg->call_struct.func = func; msg->call_struct.func = func;
msg->call_struct.info = info; msg->call_struct.info = info;
...@@ -287,6 +291,8 @@ void smp_send_reschedule(int cpu) ...@@ -287,6 +291,8 @@ void smp_send_reschedule(int cpu)
return; return;
msg = kmalloc(sizeof(*msg), GFP_ATOMIC); msg = kmalloc(sizeof(*msg), GFP_ATOMIC);
if (!msg)
return;
memset(msg, 0, sizeof(msg)); memset(msg, 0, sizeof(msg));
INIT_LIST_HEAD(&msg->list); INIT_LIST_HEAD(&msg->list);
msg->type = BFIN_IPI_RESCHEDULE; msg->type = BFIN_IPI_RESCHEDULE;
...@@ -314,6 +320,8 @@ void smp_send_stop(void) ...@@ -314,6 +320,8 @@ void smp_send_stop(void)
return; return;
msg = kmalloc(sizeof(*msg), GFP_ATOMIC); msg = kmalloc(sizeof(*msg), GFP_ATOMIC);
if (!msg)
return;
memset(msg, 0, sizeof(msg)); memset(msg, 0, sizeof(msg));
INIT_LIST_HEAD(&msg->list); INIT_LIST_HEAD(&msg->list);
msg->type = BFIN_IPI_CPU_STOP; msg->type = BFIN_IPI_CPU_STOP;
...@@ -450,7 +458,7 @@ void __init smp_cpus_done(unsigned int max_cpus) ...@@ -450,7 +458,7 @@ void __init smp_cpus_done(unsigned int max_cpus)
unsigned int cpu; unsigned int cpu;
for_each_online_cpu(cpu) for_each_online_cpu(cpu)
bogosum += per_cpu(cpu_data, cpu).loops_per_jiffy; bogosum += loops_per_jiffy;
printk(KERN_INFO "SMP: Total of %d processors activated " printk(KERN_INFO "SMP: Total of %d processors activated "
"(%lu.%02lu BogoMIPS).\n", "(%lu.%02lu BogoMIPS).\n",
......
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