diff options
Diffstat (limited to 'arch/blackfin/mach-common')
-rw-r--r-- | arch/blackfin/mach-common/clocks-init.c | 1 | ||||
-rw-r--r-- | arch/blackfin/mach-common/cpufreq.c | 5 | ||||
-rw-r--r-- | arch/blackfin/mach-common/dpmc_modes.S | 30 | ||||
-rw-r--r-- | arch/blackfin/mach-common/entry.S | 4 | ||||
-rw-r--r-- | arch/blackfin/mach-common/ints-priority.c | 15 | ||||
-rw-r--r-- | arch/blackfin/mach-common/smp.c | 16 |
6 files changed, 56 insertions, 15 deletions
diff --git a/arch/blackfin/mach-common/clocks-init.c b/arch/blackfin/mach-common/clocks-init.c index ef6870e9eea..d5cfe611b77 100644 --- a/arch/blackfin/mach-common/clocks-init.c +++ b/arch/blackfin/mach-common/clocks-init.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <asm/dma.h> | 13 | #include <asm/dma.h> |
14 | #include <asm/clocks.h> | 14 | #include <asm/clocks.h> |
15 | #include <asm/mem_init.h> | 15 | #include <asm/mem_init.h> |
16 | #include <asm/dpmc.h> | ||
16 | 17 | ||
17 | #define SDGCTL_WIDTH (1 << 31) /* SDRAM external data path width */ | 18 | #define SDGCTL_WIDTH (1 << 31) /* SDRAM external data path width */ |
18 | #define PLL_CTL_VAL \ | 19 | #define PLL_CTL_VAL \ |
diff --git a/arch/blackfin/mach-common/cpufreq.c b/arch/blackfin/mach-common/cpufreq.c index 01506504e6d..77758289725 100644 --- a/arch/blackfin/mach-common/cpufreq.c +++ b/arch/blackfin/mach-common/cpufreq.c | |||
@@ -13,7 +13,7 @@ | |||
13 | #include <linux/fs.h> | 13 | #include <linux/fs.h> |
14 | #include <asm/blackfin.h> | 14 | #include <asm/blackfin.h> |
15 | #include <asm/time.h> | 15 | #include <asm/time.h> |
16 | 16 | #include <asm/dpmc.h> | |
17 | 17 | ||
18 | /* this is the table of CCLK frequencies, in Hz */ | 18 | /* this is the table of CCLK frequencies, in Hz */ |
19 | /* .index is the entry in the auxillary dpm_state_table[] */ | 19 | /* .index is the entry in the auxillary dpm_state_table[] */ |
@@ -138,7 +138,8 @@ static int __init __bfin_cpu_init(struct cpufreq_policy *policy) | |||
138 | dpm_state_table[index].tscale); | 138 | dpm_state_table[index].tscale); |
139 | } | 139 | } |
140 | 140 | ||
141 | policy->cpuinfo.transition_latency = (bfin_read_PLL_LOCKCNT() / (sclk / 1000000)) * 1000; | 141 | policy->cpuinfo.transition_latency = 50000; /* 50us assumed */ |
142 | |||
142 | /*Now ,only support one cpu */ | 143 | /*Now ,only support one cpu */ |
143 | policy->cur = cclk; | 144 | policy->cur = cclk; |
144 | cpufreq_frequency_table_get_attr(bfin_freq_table, policy->cpu); | 145 | cpufreq_frequency_table_get_attr(bfin_freq_table, policy->cpu); |
diff --git a/arch/blackfin/mach-common/dpmc_modes.S b/arch/blackfin/mach-common/dpmc_modes.S index 8009a512fb1..b0371689605 100644 --- a/arch/blackfin/mach-common/dpmc_modes.S +++ b/arch/blackfin/mach-common/dpmc_modes.S | |||
@@ -404,6 +404,21 @@ ENTRY(_do_hibernate) | |||
404 | PM_SYS_PUSH(EBIU_FCTL) | 404 | PM_SYS_PUSH(EBIU_FCTL) |
405 | #endif | 405 | #endif |
406 | 406 | ||
407 | #ifdef PORTCIO_FER | ||
408 | PM_SYS_PUSH16(PORTCIO_DIR) | ||
409 | PM_SYS_PUSH16(PORTCIO_INEN) | ||
410 | PM_SYS_PUSH16(PORTCIO) | ||
411 | PM_SYS_PUSH16(PORTCIO_FER) | ||
412 | PM_SYS_PUSH16(PORTDIO_DIR) | ||
413 | PM_SYS_PUSH16(PORTDIO_INEN) | ||
414 | PM_SYS_PUSH16(PORTDIO) | ||
415 | PM_SYS_PUSH16(PORTDIO_FER) | ||
416 | PM_SYS_PUSH16(PORTEIO_DIR) | ||
417 | PM_SYS_PUSH16(PORTEIO_INEN) | ||
418 | PM_SYS_PUSH16(PORTEIO) | ||
419 | PM_SYS_PUSH16(PORTEIO_FER) | ||
420 | #endif | ||
421 | |||
407 | PM_SYS_PUSH16(SYSCR) | 422 | PM_SYS_PUSH16(SYSCR) |
408 | 423 | ||
409 | /* Save Core MMRs */ | 424 | /* Save Core MMRs */ |
@@ -716,6 +731,21 @@ ENTRY(_do_hibernate) | |||
716 | P0.L = lo(PLL_CTL); | 731 | P0.L = lo(PLL_CTL); |
717 | PM_SYS_POP16(SYSCR) | 732 | PM_SYS_POP16(SYSCR) |
718 | 733 | ||
734 | #ifdef PORTCIO_FER | ||
735 | PM_SYS_POP16(PORTEIO_FER) | ||
736 | PM_SYS_POP16(PORTEIO) | ||
737 | PM_SYS_POP16(PORTEIO_INEN) | ||
738 | PM_SYS_POP16(PORTEIO_DIR) | ||
739 | PM_SYS_POP16(PORTDIO_FER) | ||
740 | PM_SYS_POP16(PORTDIO) | ||
741 | PM_SYS_POP16(PORTDIO_INEN) | ||
742 | PM_SYS_POP16(PORTDIO_DIR) | ||
743 | PM_SYS_POP16(PORTCIO_FER) | ||
744 | PM_SYS_POP16(PORTCIO) | ||
745 | PM_SYS_POP16(PORTCIO_INEN) | ||
746 | PM_SYS_POP16(PORTCIO_DIR) | ||
747 | #endif | ||
748 | |||
719 | #ifdef EBIU_FCTL | 749 | #ifdef EBIU_FCTL |
720 | PM_SYS_POP(EBIU_FCTL) | 750 | PM_SYS_POP(EBIU_FCTL) |
721 | PM_SYS_POP(EBIU_MODE) | 751 | PM_SYS_POP(EBIU_MODE) |
diff --git a/arch/blackfin/mach-common/entry.S b/arch/blackfin/mach-common/entry.S index f3f8bb46b51..b0ed0b487ff 100644 --- a/arch/blackfin/mach-common/entry.S +++ b/arch/blackfin/mach-common/entry.S | |||
@@ -713,6 +713,8 @@ ENTRY(_system_call) | |||
713 | cc = BITTST(r7, TIF_RESTORE_SIGMASK); | 713 | cc = BITTST(r7, TIF_RESTORE_SIGMASK); |
714 | if cc jump .Lsyscall_do_signals; | 714 | if cc jump .Lsyscall_do_signals; |
715 | cc = BITTST(r7, TIF_SIGPENDING); | 715 | cc = BITTST(r7, TIF_SIGPENDING); |
716 | if cc jump .Lsyscall_do_signals; | ||
717 | cc = BITTST(r7, TIF_NOTIFY_RESUME); | ||
716 | if !cc jump .Lsyscall_really_exit; | 718 | if !cc jump .Lsyscall_really_exit; |
717 | .Lsyscall_do_signals: | 719 | .Lsyscall_do_signals: |
718 | /* Reenable interrupts. */ | 720 | /* Reenable interrupts. */ |
@@ -721,7 +723,7 @@ ENTRY(_system_call) | |||
721 | 723 | ||
722 | r0 = sp; | 724 | r0 = sp; |
723 | SP += -12; | 725 | SP += -12; |
724 | call _do_signal; | 726 | call _do_notify_resume; |
725 | SP += 12; | 727 | SP += 12; |
726 | 728 | ||
727 | .Lsyscall_really_exit: | 729 | .Lsyscall_really_exit: |
diff --git a/arch/blackfin/mach-common/ints-priority.c b/arch/blackfin/mach-common/ints-priority.c index 660ea1bec54..1873b2c1fed 100644 --- a/arch/blackfin/mach-common/ints-priority.c +++ b/arch/blackfin/mach-common/ints-priority.c | |||
@@ -25,11 +25,20 @@ | |||
25 | #include <asm/blackfin.h> | 25 | #include <asm/blackfin.h> |
26 | #include <asm/gpio.h> | 26 | #include <asm/gpio.h> |
27 | #include <asm/irq_handler.h> | 27 | #include <asm/irq_handler.h> |
28 | #include <asm/dpmc.h> | ||
29 | #include <asm/bfin5xx_spi.h> | ||
30 | #include <asm/bfin_sport.h> | ||
28 | 31 | ||
29 | #define SIC_SYSIRQ(irq) (irq - (IRQ_CORETMR + 1)) | 32 | #define SIC_SYSIRQ(irq) (irq - (IRQ_CORETMR + 1)) |
30 | 33 | ||
31 | #ifdef BF537_FAMILY | 34 | #ifdef BF537_FAMILY |
32 | # define BF537_GENERIC_ERROR_INT_DEMUX | 35 | # define BF537_GENERIC_ERROR_INT_DEMUX |
36 | # define SPI_ERR_MASK (BIT_STAT_TXCOL | BIT_STAT_RBSY | BIT_STAT_MODF | BIT_STAT_TXE) /* SPI_STAT */ | ||
37 | # define SPORT_ERR_MASK (ROVF | RUVF | TOVF | TUVF) /* SPORT_STAT */ | ||
38 | # define PPI_ERR_MASK (0xFFFF & ~FLD) /* PPI_STATUS */ | ||
39 | # define EMAC_ERR_MASK (PHYINT | MMCINT | RXFSINT | TXFSINT | WAKEDET | RXDMAERR | TXDMAERR | STMDONE) /* EMAC_SYSTAT */ | ||
40 | # define UART_ERR_MASK (0x6) /* UART_IIR */ | ||
41 | # define CAN_ERR_MASK (EWTIF | EWRIF | EPIF | BOIF | WUIF | UIAIF | AAIF | RMLIF | UCEIF | EXTIF | ADIF) /* CAN_GIF */ | ||
33 | #else | 42 | #else |
34 | # undef BF537_GENERIC_ERROR_INT_DEMUX | 43 | # undef BF537_GENERIC_ERROR_INT_DEMUX |
35 | #endif | 44 | #endif |
@@ -324,11 +333,9 @@ static void bfin_demux_error_irq(unsigned int int_err_irq, | |||
324 | irq = IRQ_CAN_ERROR; | 333 | irq = IRQ_CAN_ERROR; |
325 | else if (bfin_read_SPI_STAT() & SPI_ERR_MASK) | 334 | else if (bfin_read_SPI_STAT() & SPI_ERR_MASK) |
326 | irq = IRQ_SPI_ERROR; | 335 | irq = IRQ_SPI_ERROR; |
327 | else if ((bfin_read_UART0_IIR() & UART_ERR_MASK_STAT1) && | 336 | else if ((bfin_read_UART0_IIR() & UART_ERR_MASK) == UART_ERR_MASK) |
328 | (bfin_read_UART0_IIR() & UART_ERR_MASK_STAT0)) | ||
329 | irq = IRQ_UART0_ERROR; | 337 | irq = IRQ_UART0_ERROR; |
330 | else if ((bfin_read_UART1_IIR() & UART_ERR_MASK_STAT1) && | 338 | else if ((bfin_read_UART1_IIR() & UART_ERR_MASK) == UART_ERR_MASK) |
331 | (bfin_read_UART1_IIR() & UART_ERR_MASK_STAT0)) | ||
332 | irq = IRQ_UART1_ERROR; | 339 | irq = IRQ_UART1_ERROR; |
333 | 340 | ||
334 | if (irq) { | 341 | if (irq) { |
diff --git a/arch/blackfin/mach-common/smp.c b/arch/blackfin/mach-common/smp.c index d92b168c832..369e687582b 100644 --- a/arch/blackfin/mach-common/smp.c +++ b/arch/blackfin/mach-common/smp.c | |||
@@ -336,13 +336,6 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
336 | 336 | ||
337 | ret = platform_boot_secondary(cpu, idle); | 337 | ret = platform_boot_secondary(cpu, idle); |
338 | 338 | ||
339 | if (ret) { | ||
340 | cpu_clear(cpu, cpu_present_map); | ||
341 | printk(KERN_CRIT "CPU%u: processor failed to boot (%d)\n", cpu, ret); | ||
342 | free_task(idle); | ||
343 | } else | ||
344 | cpu_set(cpu, cpu_online_map); | ||
345 | |||
346 | secondary_stack = NULL; | 339 | secondary_stack = NULL; |
347 | 340 | ||
348 | return ret; | 341 | return ret; |
@@ -418,9 +411,16 @@ void __cpuinit secondary_start_kernel(void) | |||
418 | 411 | ||
419 | setup_secondary(cpu); | 412 | setup_secondary(cpu); |
420 | 413 | ||
414 | platform_secondary_init(cpu); | ||
415 | |||
421 | local_irq_enable(); | 416 | local_irq_enable(); |
422 | 417 | ||
423 | platform_secondary_init(cpu); | 418 | /* |
419 | * Calibrate loops per jiffy value. | ||
420 | * IRQs need to be enabled here - D-cache can be invalidated | ||
421 | * in timer irq handler, so core B can read correct jiffies. | ||
422 | */ | ||
423 | calibrate_delay(); | ||
424 | 424 | ||
425 | cpu_idle(); | 425 | cpu_idle(); |
426 | } | 426 | } |