diff options
author | Roy Huang <roy.huang@analog.com> | 2007-07-12 10:41:45 -0400 |
---|---|---|
committer | Bryan Wu <bryan.wu@analog.com> | 2007-07-12 10:41:45 -0400 |
commit | 24a07a124198153540f8f43d9e91d16227aba66e (patch) | |
tree | 917b2011e67e224515830833b1151e276b6c6137 /arch/blackfin/mach-common | |
parent | 088eec1192a0ae60fc218796027e622008af36c0 (diff) |
Blackfin arch: initial supporting for BF548-EZKIT
The ADSP-BF54x was specifically designed to meet the needs of convergent multimedia
applications where system performance and cost are essential ingredients. The
integration of multimedia, human interface, and connectivity peripherals combined
with increased system bandwidth and on-chip memory provides customers a platform to
design the most demanding applications.
Since now, ADSP-BF54x will be supported in the Linux kernel and bunch of related drivers
such as USB OTG, ATAPI, NAND flash controller, LCD framebuffer, sound, touch screen will
be submitted later.
Please enjoy the show.
Signed-off-by: Roy Huang <roy.huang@analog.com>
Signed-off-by: Bryan Wu <bryan.wu@analog.com>
Diffstat (limited to 'arch/blackfin/mach-common')
-rw-r--r-- | arch/blackfin/mach-common/Makefile | 4 | ||||
-rw-r--r-- | arch/blackfin/mach-common/ints-priority-sc.c | 50 |
2 files changed, 47 insertions, 7 deletions
diff --git a/arch/blackfin/mach-common/Makefile b/arch/blackfin/mach-common/Makefile index d3a49073d19..0279ede7039 100644 --- a/arch/blackfin/mach-common/Makefile +++ b/arch/blackfin/mach-common/Makefile | |||
@@ -4,9 +4,9 @@ | |||
4 | 4 | ||
5 | obj-y := \ | 5 | obj-y := \ |
6 | cache.o cacheinit.o cplbhdlr.o cplbmgr.o entry.o \ | 6 | cache.o cacheinit.o cplbhdlr.o cplbmgr.o entry.o \ |
7 | interrupt.o lock.o dpmc.o irqpanic.o | 7 | interrupt.o lock.o irqpanic.o |
8 | 8 | ||
9 | obj-$(CONFIG_CPLB_INFO) += cplbinfo.o | 9 | obj-$(CONFIG_CPLB_INFO) += cplbinfo.o |
10 | obj-$(CONFIG_BFIN_SINGLE_CORE) += ints-priority-sc.o | 10 | obj-$(CONFIG_BFIN_SINGLE_CORE) += ints-priority-sc.o |
11 | obj-$(CONFIG_BFIN_DUAL_CORE) += ints-priority-dc.o | 11 | obj-$(CONFIG_BFIN_DUAL_CORE) += ints-priority-dc.o |
12 | obj-$(CONFIG_PM) += pm.o | 12 | obj-$(CONFIG_PM) += pm.o dpmc.o |
diff --git a/arch/blackfin/mach-common/ints-priority-sc.c b/arch/blackfin/mach-common/ints-priority-sc.c index 2cfc7d5aec5..cec0f841fb5 100644 --- a/arch/blackfin/mach-common/ints-priority-sc.c +++ b/arch/blackfin/mach-common/ints-priority-sc.c | |||
@@ -13,7 +13,7 @@ | |||
13 | * 2002 Arcturus Networks Inc. MaTed <mated@sympatico.ca> | 13 | * 2002 Arcturus Networks Inc. MaTed <mated@sympatico.ca> |
14 | * 2003 Metrowerks/Motorola | 14 | * 2003 Metrowerks/Motorola |
15 | * 2003 Bas Vermeulen <bas@buyways.nl> | 15 | * 2003 Bas Vermeulen <bas@buyways.nl> |
16 | * Copyright 2004-2006 Analog Devices Inc. | 16 | * Copyright 2004-2007 Analog Devices Inc. |
17 | * | 17 | * |
18 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | 18 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ |
19 | * | 19 | * |
@@ -65,9 +65,9 @@ atomic_t num_spurious; | |||
65 | 65 | ||
66 | struct ivgx { | 66 | struct ivgx { |
67 | /* irq number for request_irq, available in mach-bf533/irq.h */ | 67 | /* irq number for request_irq, available in mach-bf533/irq.h */ |
68 | int irqno; | 68 | unsigned int irqno; |
69 | /* corresponding bit in the SIC_ISR register */ | 69 | /* corresponding bit in the SIC_ISR register */ |
70 | int isrflag; | 70 | unsigned int isrflag; |
71 | } ivg_table[NR_PERI_INTS]; | 71 | } ivg_table[NR_PERI_INTS]; |
72 | 72 | ||
73 | struct ivg_slice { | 73 | struct ivg_slice { |
@@ -98,7 +98,7 @@ static void __init search_IAR(void) | |||
98 | bfin_read32((unsigned long *) SIC_IAR0 + | 98 | bfin_read32((unsigned long *) SIC_IAR0 + |
99 | (irqn >> 3)) >> iar_shift)) { | 99 | (irqn >> 3)) >> iar_shift)) { |
100 | ivg_table[irq_pos].irqno = IVG7 + irqn; | 100 | ivg_table[irq_pos].irqno = IVG7 + irqn; |
101 | ivg_table[irq_pos].isrflag = 1 << irqn; | 101 | ivg_table[irq_pos].isrflag = 1 << (irqn % 32); |
102 | ivg7_13[ivg].istop++; | 102 | ivg7_13[ivg].istop++; |
103 | irq_pos++; | 103 | irq_pos++; |
104 | } | 104 | } |
@@ -141,15 +141,31 @@ static void bfin_core_unmask_irq(unsigned int irq) | |||
141 | 141 | ||
142 | static void bfin_internal_mask_irq(unsigned int irq) | 142 | static void bfin_internal_mask_irq(unsigned int irq) |
143 | { | 143 | { |
144 | #ifndef CONFIG_BF54x | ||
144 | bfin_write_SIC_IMASK(bfin_read_SIC_IMASK() & | 145 | bfin_write_SIC_IMASK(bfin_read_SIC_IMASK() & |
145 | ~(1 << (irq - (IRQ_CORETMR + 1)))); | 146 | ~(1 << (irq - (IRQ_CORETMR + 1)))); |
147 | #else | ||
148 | unsigned mask_bank, mask_bit; | ||
149 | mask_bank = (irq - (IRQ_CORETMR +1))/32; | ||
150 | mask_bit = (irq - (IRQ_CORETMR + 1))%32; | ||
151 | bfin_write_SIC_IMASK( mask_bank, bfin_read_SIC_IMASK(mask_bank) & \ | ||
152 | ~(1 << mask_bit)); | ||
153 | #endif | ||
146 | SSYNC(); | 154 | SSYNC(); |
147 | } | 155 | } |
148 | 156 | ||
149 | static void bfin_internal_unmask_irq(unsigned int irq) | 157 | static void bfin_internal_unmask_irq(unsigned int irq) |
150 | { | 158 | { |
159 | #ifndef CONFIG_BF54x | ||
151 | bfin_write_SIC_IMASK(bfin_read_SIC_IMASK() | | 160 | bfin_write_SIC_IMASK(bfin_read_SIC_IMASK() | |
152 | (1 << (irq - (IRQ_CORETMR + 1)))); | 161 | (1 << (irq - (IRQ_CORETMR + 1)))); |
162 | #else | ||
163 | unsigned mask_bank, mask_bit; | ||
164 | mask_bank = (irq - (IRQ_CORETMR +1))/32; | ||
165 | mask_bit = (irq - (IRQ_CORETMR + 1))%32; | ||
166 | bfin_write_SIC_IMASK(mask_bank, bfin_read_SIC_IMASK(mask_bank) | \ | ||
167 | ( 1 << mask_bit)); | ||
168 | #endif | ||
153 | SSYNC(); | 169 | SSYNC(); |
154 | } | 170 | } |
155 | 171 | ||
@@ -452,7 +468,14 @@ int __init init_arch_irq(void) | |||
452 | int irq; | 468 | int irq; |
453 | unsigned long ilat = 0; | 469 | unsigned long ilat = 0; |
454 | /* Disable all the peripheral intrs - page 4-29 HW Ref manual */ | 470 | /* Disable all the peripheral intrs - page 4-29 HW Ref manual */ |
471 | #ifdef CONFIG_BF54x | ||
472 | bfin_write_SIC_IMASK0(SIC_UNMASK_ALL); | ||
473 | bfin_write_SIC_IMASK1(SIC_UNMASK_ALL); | ||
474 | bfin_write_SIC_IMASK2(SIC_UNMASK_ALL); | ||
475 | #else | ||
455 | bfin_write_SIC_IMASK(SIC_UNMASK_ALL); | 476 | bfin_write_SIC_IMASK(SIC_UNMASK_ALL); |
477 | #endif | ||
478 | |||
456 | SSYNC(); | 479 | SSYNC(); |
457 | 480 | ||
458 | local_irq_disable(); | 481 | local_irq_disable(); |
@@ -555,9 +578,25 @@ void do_irq(int vec, struct pt_regs *fp) | |||
555 | } else { | 578 | } else { |
556 | struct ivgx *ivg = ivg7_13[vec - IVG7].ifirst; | 579 | struct ivgx *ivg = ivg7_13[vec - IVG7].ifirst; |
557 | struct ivgx *ivg_stop = ivg7_13[vec - IVG7].istop; | 580 | struct ivgx *ivg_stop = ivg7_13[vec - IVG7].istop; |
558 | unsigned long sic_status; | 581 | #ifdef CONFIG_BF54x |
582 | unsigned long sic_status[3]; | ||
559 | 583 | ||
560 | SSYNC(); | 584 | SSYNC(); |
585 | sic_status[0] = bfin_read_SIC_ISR(0) & bfin_read_SIC_IMASK(0); | ||
586 | sic_status[1] = bfin_read_SIC_ISR(1) & bfin_read_SIC_IMASK(1); | ||
587 | sic_status[2] = bfin_read_SIC_ISR(2) & bfin_read_SIC_IMASK(2); | ||
588 | SSYNC(); | ||
589 | for(;; ivg++) { | ||
590 | if (ivg >= ivg_stop) { | ||
591 | atomic_inc(&num_spurious); | ||
592 | return; | ||
593 | } | ||
594 | if (sic_status[(ivg->irqno - IVG7)/32] & ivg->isrflag) | ||
595 | break; | ||
596 | } | ||
597 | #else | ||
598 | unsigned long sic_status; | ||
599 | SSYNC(); | ||
561 | sic_status = bfin_read_SIC_IMASK() & bfin_read_SIC_ISR(); | 600 | sic_status = bfin_read_SIC_IMASK() & bfin_read_SIC_ISR(); |
562 | 601 | ||
563 | for (;; ivg++) { | 602 | for (;; ivg++) { |
@@ -567,6 +606,7 @@ void do_irq(int vec, struct pt_regs *fp) | |||
567 | } else if (sic_status & ivg->isrflag) | 606 | } else if (sic_status & ivg->isrflag) |
568 | break; | 607 | break; |
569 | } | 608 | } |
609 | #endif | ||
570 | vec = ivg->irqno; | 610 | vec = ivg->irqno; |
571 | } | 611 | } |
572 | asm_do_IRQ(vec, fp); | 612 | asm_do_IRQ(vec, fp); |