diff options
Diffstat (limited to 'arch/blackfin/kernel')
-rw-r--r-- | arch/blackfin/kernel/Makefile | 1 | ||||
-rw-r--r-- | arch/blackfin/kernel/asm-offsets.c | 10 | ||||
-rw-r--r-- | arch/blackfin/kernel/bfin_gpio.c | 26 | ||||
-rw-r--r-- | arch/blackfin/kernel/debug-mmrs.c | 109 | ||||
-rw-r--r-- | arch/blackfin/kernel/ftrace.c | 2 | ||||
-rw-r--r-- | arch/blackfin/kernel/gptimers.c | 93 | ||||
-rw-r--r-- | arch/blackfin/kernel/ipipe.c | 2 | ||||
-rw-r--r-- | arch/blackfin/kernel/module.c | 21 | ||||
-rw-r--r-- | arch/blackfin/kernel/nmi.c | 2 | ||||
-rw-r--r-- | arch/blackfin/kernel/process.c | 1 | ||||
-rw-r--r-- | arch/blackfin/kernel/pwm.c | 100 | ||||
-rw-r--r-- | arch/blackfin/kernel/reboot.c | 4 | ||||
-rw-r--r-- | arch/blackfin/kernel/setup.c | 16 | ||||
-rw-r--r-- | arch/blackfin/kernel/time.c | 4 | ||||
-rw-r--r-- | arch/blackfin/kernel/vmlinux.lds.S | 1 |
15 files changed, 263 insertions, 129 deletions
diff --git a/arch/blackfin/kernel/Makefile b/arch/blackfin/kernel/Makefile index d550b24d9e9..b7bdc42fe1a 100644 --- a/arch/blackfin/kernel/Makefile +++ b/arch/blackfin/kernel/Makefile | |||
@@ -21,6 +21,7 @@ obj-$(CONFIG_FUNCTION_TRACER) += ftrace-entry.o | |||
21 | obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o | 21 | obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o |
22 | CFLAGS_REMOVE_ftrace.o = -pg | 22 | CFLAGS_REMOVE_ftrace.o = -pg |
23 | 23 | ||
24 | obj-$(CONFIG_HAVE_PWM) += pwm.o | ||
24 | obj-$(CONFIG_IPIPE) += ipipe.o | 25 | obj-$(CONFIG_IPIPE) += ipipe.o |
25 | obj-$(CONFIG_BFIN_GPTIMERS) += gptimers.o | 26 | obj-$(CONFIG_BFIN_GPTIMERS) += gptimers.o |
26 | obj-$(CONFIG_CPLB_INFO) += cplbinfo.o | 27 | obj-$(CONFIG_CPLB_INFO) += cplbinfo.o |
diff --git a/arch/blackfin/kernel/asm-offsets.c b/arch/blackfin/kernel/asm-offsets.c index bd32c09b934..17e35465a41 100644 --- a/arch/blackfin/kernel/asm-offsets.c +++ b/arch/blackfin/kernel/asm-offsets.c | |||
@@ -138,6 +138,16 @@ int main(void) | |||
138 | DEFINE(PDA_DF_SEQSTAT, offsetof(struct blackfin_pda, seqstat_doublefault)); | 138 | DEFINE(PDA_DF_SEQSTAT, offsetof(struct blackfin_pda, seqstat_doublefault)); |
139 | DEFINE(PDA_DF_RETX, offsetof(struct blackfin_pda, retx_doublefault)); | 139 | DEFINE(PDA_DF_RETX, offsetof(struct blackfin_pda, retx_doublefault)); |
140 | #endif | 140 | #endif |
141 | |||
142 | /* PDA initial management */ | ||
143 | DEFINE(PDA_INIT_RETX, offsetof(struct blackfin_initial_pda, retx)); | ||
144 | #ifdef CONFIG_DEBUG_DOUBLEFAULT | ||
145 | DEFINE(PDA_INIT_DF_DCPLB, offsetof(struct blackfin_initial_pda, dcplb_doublefault_addr)); | ||
146 | DEFINE(PDA_INIT_DF_ICPLB, offsetof(struct blackfin_initial_pda, icplb_doublefault_addr)); | ||
147 | DEFINE(PDA_INIT_DF_SEQSTAT, offsetof(struct blackfin_initial_pda, seqstat_doublefault)); | ||
148 | DEFINE(PDA_INIT_DF_RETX, offsetof(struct blackfin_initial_pda, retx_doublefault)); | ||
149 | #endif | ||
150 | |||
141 | #ifdef CONFIG_SMP | 151 | #ifdef CONFIG_SMP |
142 | /* Inter-core lock (in L2 SRAM) */ | 152 | /* Inter-core lock (in L2 SRAM) */ |
143 | DEFINE(SIZEOF_CORELOCK, sizeof(struct corelock_slot)); | 153 | DEFINE(SIZEOF_CORELOCK, sizeof(struct corelock_slot)); |
diff --git a/arch/blackfin/kernel/bfin_gpio.c b/arch/blackfin/kernel/bfin_gpio.c index bcf8cf6fe41..02796b88443 100644 --- a/arch/blackfin/kernel/bfin_gpio.c +++ b/arch/blackfin/kernel/bfin_gpio.c | |||
@@ -118,6 +118,9 @@ static struct str_ident { | |||
118 | 118 | ||
119 | #if defined(CONFIG_PM) | 119 | #if defined(CONFIG_PM) |
120 | static struct gpio_port_s gpio_bank_saved[GPIO_BANK_NUM]; | 120 | static struct gpio_port_s gpio_bank_saved[GPIO_BANK_NUM]; |
121 | # ifdef BF538_FAMILY | ||
122 | static unsigned short port_fer_saved[3]; | ||
123 | # endif | ||
121 | #endif | 124 | #endif |
122 | 125 | ||
123 | static void gpio_error(unsigned gpio) | 126 | static void gpio_error(unsigned gpio) |
@@ -604,6 +607,11 @@ void bfin_gpio_pm_hibernate_suspend(void) | |||
604 | { | 607 | { |
605 | int i, bank; | 608 | int i, bank; |
606 | 609 | ||
610 | #ifdef BF538_FAMILY | ||
611 | for (i = 0; i < ARRAY_SIZE(port_fer_saved); ++i) | ||
612 | port_fer_saved[i] = *port_fer[i]; | ||
613 | #endif | ||
614 | |||
607 | for (i = 0; i < MAX_BLACKFIN_GPIOS; i += GPIO_BANKSIZE) { | 615 | for (i = 0; i < MAX_BLACKFIN_GPIOS; i += GPIO_BANKSIZE) { |
608 | bank = gpio_bank(i); | 616 | bank = gpio_bank(i); |
609 | 617 | ||
@@ -625,6 +633,10 @@ void bfin_gpio_pm_hibernate_suspend(void) | |||
625 | gpio_bank_saved[bank].maska = gpio_array[bank]->maska; | 633 | gpio_bank_saved[bank].maska = gpio_array[bank]->maska; |
626 | } | 634 | } |
627 | 635 | ||
636 | #ifdef BFIN_SPECIAL_GPIO_BANKS | ||
637 | bfin_special_gpio_pm_hibernate_suspend(); | ||
638 | #endif | ||
639 | |||
628 | AWA_DUMMY_READ(maska); | 640 | AWA_DUMMY_READ(maska); |
629 | } | 641 | } |
630 | 642 | ||
@@ -632,6 +644,11 @@ void bfin_gpio_pm_hibernate_restore(void) | |||
632 | { | 644 | { |
633 | int i, bank; | 645 | int i, bank; |
634 | 646 | ||
647 | #ifdef BF538_FAMILY | ||
648 | for (i = 0; i < ARRAY_SIZE(port_fer_saved); ++i) | ||
649 | *port_fer[i] = port_fer_saved[i]; | ||
650 | #endif | ||
651 | |||
635 | for (i = 0; i < MAX_BLACKFIN_GPIOS; i += GPIO_BANKSIZE) { | 652 | for (i = 0; i < MAX_BLACKFIN_GPIOS; i += GPIO_BANKSIZE) { |
636 | bank = gpio_bank(i); | 653 | bank = gpio_bank(i); |
637 | 654 | ||
@@ -653,6 +670,11 @@ void bfin_gpio_pm_hibernate_restore(void) | |||
653 | gpio_array[bank]->both = gpio_bank_saved[bank].both; | 670 | gpio_array[bank]->both = gpio_bank_saved[bank].both; |
654 | gpio_array[bank]->maska = gpio_bank_saved[bank].maska; | 671 | gpio_array[bank]->maska = gpio_bank_saved[bank].maska; |
655 | } | 672 | } |
673 | |||
674 | #ifdef BFIN_SPECIAL_GPIO_BANKS | ||
675 | bfin_special_gpio_pm_hibernate_restore(); | ||
676 | #endif | ||
677 | |||
656 | AWA_DUMMY_READ(maska); | 678 | AWA_DUMMY_READ(maska); |
657 | } | 679 | } |
658 | 680 | ||
@@ -691,9 +713,9 @@ void bfin_gpio_pm_hibernate_restore(void) | |||
691 | gpio_array[bank]->port_mux = gpio_bank_saved[bank].mux; | 713 | gpio_array[bank]->port_mux = gpio_bank_saved[bank].mux; |
692 | gpio_array[bank]->port_fer = gpio_bank_saved[bank].fer; | 714 | gpio_array[bank]->port_fer = gpio_bank_saved[bank].fer; |
693 | gpio_array[bank]->inen = gpio_bank_saved[bank].inen; | 715 | gpio_array[bank]->inen = gpio_bank_saved[bank].inen; |
694 | gpio_array[bank]->dir_set = gpio_bank_saved[bank].dir; | ||
695 | gpio_array[bank]->data_set = gpio_bank_saved[bank].data | 716 | gpio_array[bank]->data_set = gpio_bank_saved[bank].data |
696 | | gpio_bank_saved[bank].dir; | 717 | & gpio_bank_saved[bank].dir; |
718 | gpio_array[bank]->dir_set = gpio_bank_saved[bank].dir; | ||
697 | } | 719 | } |
698 | } | 720 | } |
699 | #endif | 721 | #endif |
diff --git a/arch/blackfin/kernel/debug-mmrs.c b/arch/blackfin/kernel/debug-mmrs.c index fce4807ceef..92f66482628 100644 --- a/arch/blackfin/kernel/debug-mmrs.c +++ b/arch/blackfin/kernel/debug-mmrs.c | |||
@@ -27,7 +27,7 @@ | |||
27 | #define PORT_MUX BFIN_PORT_MUX | 27 | #define PORT_MUX BFIN_PORT_MUX |
28 | #endif | 28 | #endif |
29 | 29 | ||
30 | #define _d(name, bits, addr, perms) debugfs_create_x##bits(name, perms, parent, (u##bits *)addr) | 30 | #define _d(name, bits, addr, perms) debugfs_create_x##bits(name, perms, parent, (u##bits *)(addr)) |
31 | #define d(name, bits, addr) _d(name, bits, addr, S_IRUSR|S_IWUSR) | 31 | #define d(name, bits, addr) _d(name, bits, addr, S_IRUSR|S_IWUSR) |
32 | #define d_RO(name, bits, addr) _d(name, bits, addr, S_IRUSR) | 32 | #define d_RO(name, bits, addr) _d(name, bits, addr, S_IRUSR) |
33 | #define d_WO(name, bits, addr) _d(name, bits, addr, S_IWUSR) | 33 | #define d_WO(name, bits, addr) _d(name, bits, addr, S_IWUSR) |
@@ -223,7 +223,8 @@ bfin_debug_mmrs_dma(struct dentry *parent, unsigned long base, int num, char mdm | |||
223 | __DMA(CURR_DESC_PTR, curr_desc_ptr); | 223 | __DMA(CURR_DESC_PTR, curr_desc_ptr); |
224 | __DMA(CURR_ADDR, curr_addr); | 224 | __DMA(CURR_ADDR, curr_addr); |
225 | __DMA(IRQ_STATUS, irq_status); | 225 | __DMA(IRQ_STATUS, irq_status); |
226 | __DMA(PERIPHERAL_MAP, peripheral_map); | 226 | if (strcmp(pfx, "IMDMA") != 0) |
227 | __DMA(PERIPHERAL_MAP, peripheral_map); | ||
227 | __DMA(CURR_X_COUNT, curr_x_count); | 228 | __DMA(CURR_X_COUNT, curr_x_count); |
228 | __DMA(CURR_Y_COUNT, curr_y_count); | 229 | __DMA(CURR_Y_COUNT, curr_y_count); |
229 | } | 230 | } |
@@ -277,6 +278,32 @@ bfin_debug_mmrs_gptimer(struct dentry *parent, unsigned long base, int num) | |||
277 | } | 278 | } |
278 | #define GPTIMER(num) bfin_debug_mmrs_gptimer(parent, TIMER##num##_CONFIG, num) | 279 | #define GPTIMER(num) bfin_debug_mmrs_gptimer(parent, TIMER##num##_CONFIG, num) |
279 | 280 | ||
281 | #define GPTIMER_GROUP_OFF(mmr) REGS_OFF(gptimer_group, mmr) | ||
282 | #define __GPTIMER_GROUP(uname, lname) __REGS(gptimer_group, #uname, lname) | ||
283 | static void __init __maybe_unused | ||
284 | bfin_debug_mmrs_gptimer_group(struct dentry *parent, unsigned long base, int num) | ||
285 | { | ||
286 | char buf[32], *_buf; | ||
287 | |||
288 | if (num == -1) { | ||
289 | _buf = buf + sprintf(buf, "TIMER_"); | ||
290 | __GPTIMER_GROUP(ENABLE, enable); | ||
291 | __GPTIMER_GROUP(DISABLE, disable); | ||
292 | __GPTIMER_GROUP(STATUS, status); | ||
293 | } else { | ||
294 | /* These MMRs are a bit odd as the group # is a suffix */ | ||
295 | _buf = buf + sprintf(buf, "TIMER_ENABLE%i", num); | ||
296 | d(buf, 16, base + GPTIMER_GROUP_OFF(enable)); | ||
297 | |||
298 | _buf = buf + sprintf(buf, "TIMER_DISABLE%i", num); | ||
299 | d(buf, 16, base + GPTIMER_GROUP_OFF(disable)); | ||
300 | |||
301 | _buf = buf + sprintf(buf, "TIMER_STATUS%i", num); | ||
302 | d(buf, 32, base + GPTIMER_GROUP_OFF(status)); | ||
303 | } | ||
304 | } | ||
305 | #define GPTIMER_GROUP(mmr, num) bfin_debug_mmrs_gptimer_group(parent, mmr, num) | ||
306 | |||
280 | /* | 307 | /* |
281 | * Handshake MDMA | 308 | * Handshake MDMA |
282 | */ | 309 | */ |
@@ -296,6 +323,29 @@ bfin_debug_mmrs_hmdma(struct dentry *parent, unsigned long base, int num) | |||
296 | #define HMDMA(num) bfin_debug_mmrs_hmdma(parent, HMDMA##num##_CONTROL, num) | 323 | #define HMDMA(num) bfin_debug_mmrs_hmdma(parent, HMDMA##num##_CONTROL, num) |
297 | 324 | ||
298 | /* | 325 | /* |
326 | * Peripheral Interrupts (PINT/GPIO) | ||
327 | */ | ||
328 | #ifdef PINT0_MASK_SET | ||
329 | #define __PINT(uname, lname) __REGS(pint, #uname, lname) | ||
330 | static void __init __maybe_unused | ||
331 | bfin_debug_mmrs_pint(struct dentry *parent, unsigned long base, int num) | ||
332 | { | ||
333 | char buf[32], *_buf = REGS_STR_PFX(buf, PINT, num); | ||
334 | __PINT(MASK_SET, mask_set); | ||
335 | __PINT(MASK_CLEAR, mask_clear); | ||
336 | __PINT(REQUEST, request); | ||
337 | __PINT(ASSIGN, assign); | ||
338 | __PINT(EDGE_SET, edge_set); | ||
339 | __PINT(EDGE_CLEAR, edge_clear); | ||
340 | __PINT(INVERT_SET, invert_set); | ||
341 | __PINT(INVERT_CLEAR, invert_clear); | ||
342 | __PINT(PINSTATE, pinstate); | ||
343 | __PINT(LATCH, latch); | ||
344 | } | ||
345 | #define PINT(num) bfin_debug_mmrs_pint(parent, PINT##num##_MASK_SET, num) | ||
346 | #endif | ||
347 | |||
348 | /* | ||
299 | * Port/GPIO | 349 | * Port/GPIO |
300 | */ | 350 | */ |
301 | #define bfin_gpio_regs gpio_port_t | 351 | #define bfin_gpio_regs gpio_port_t |
@@ -747,7 +797,7 @@ static int __init bfin_debug_mmrs_init(void) | |||
747 | #endif | 797 | #endif |
748 | 798 | ||
749 | parent = debugfs_create_dir("dmac", top); | 799 | parent = debugfs_create_dir("dmac", top); |
750 | #ifdef DMA_TC_CNT | 800 | #ifdef DMAC_TC_CNT |
751 | D16(DMAC_TC_CNT); | 801 | D16(DMAC_TC_CNT); |
752 | D16(DMAC_TC_PER); | 802 | D16(DMAC_TC_PER); |
753 | #endif | 803 | #endif |
@@ -1005,29 +1055,19 @@ static int __init bfin_debug_mmrs_init(void) | |||
1005 | #endif | 1055 | #endif |
1006 | 1056 | ||
1007 | parent = debugfs_create_dir("gptimer", top); | 1057 | parent = debugfs_create_dir("gptimer", top); |
1008 | #ifdef TIMER_DISABLE | 1058 | #ifdef TIMER_ENABLE |
1009 | D16(TIMER_DISABLE); | 1059 | GPTIMER_GROUP(TIMER_ENABLE, -1); |
1010 | D16(TIMER_ENABLE); | ||
1011 | D32(TIMER_STATUS); | ||
1012 | #endif | 1060 | #endif |
1013 | #ifdef TIMER_DISABLE0 | 1061 | #ifdef TIMER_ENABLE0 |
1014 | D16(TIMER_DISABLE0); | 1062 | GPTIMER_GROUP(TIMER_ENABLE0, 0); |
1015 | D16(TIMER_ENABLE0); | ||
1016 | D32(TIMER_STATUS0); | ||
1017 | #endif | 1063 | #endif |
1018 | #ifdef TIMER_DISABLE1 | 1064 | #ifdef TIMER_ENABLE1 |
1019 | D16(TIMER_DISABLE1); | 1065 | GPTIMER_GROUP(TIMER_ENABLE1, 1); |
1020 | D16(TIMER_ENABLE1); | ||
1021 | D32(TIMER_STATUS1); | ||
1022 | #endif | 1066 | #endif |
1023 | /* XXX: Should convert BF561 MMR names */ | 1067 | /* XXX: Should convert BF561 MMR names */ |
1024 | #ifdef TMRS4_DISABLE | 1068 | #ifdef TMRS4_DISABLE |
1025 | D16(TMRS4_DISABLE); | 1069 | GPTIMER_GROUP(TMRS4_ENABLE, 0); |
1026 | D16(TMRS4_ENABLE); | 1070 | GPTIMER_GROUP(TMRS8_ENABLE, 1); |
1027 | D32(TMRS4_STATUS); | ||
1028 | D16(TMRS8_DISABLE); | ||
1029 | D16(TMRS8_ENABLE); | ||
1030 | D32(TMRS8_STATUS); | ||
1031 | #endif | 1071 | #endif |
1032 | GPTIMER(0); | 1072 | GPTIMER(0); |
1033 | GPTIMER(1); | 1073 | GPTIMER(1); |
@@ -1253,6 +1293,14 @@ static int __init bfin_debug_mmrs_init(void) | |||
1253 | D32(OTP_DATA3); | 1293 | D32(OTP_DATA3); |
1254 | #endif | 1294 | #endif |
1255 | 1295 | ||
1296 | #ifdef PINT0_MASK_SET | ||
1297 | parent = debugfs_create_dir("pint", top); | ||
1298 | PINT(0); | ||
1299 | PINT(1); | ||
1300 | PINT(2); | ||
1301 | PINT(3); | ||
1302 | #endif | ||
1303 | |||
1256 | #ifdef PIXC_CTL | 1304 | #ifdef PIXC_CTL |
1257 | parent = debugfs_create_dir("pixc", top); | 1305 | parent = debugfs_create_dir("pixc", top); |
1258 | D16(PIXC_CTL); | 1306 | D16(PIXC_CTL); |
@@ -1816,7 +1864,6 @@ static int __init bfin_debug_mmrs_init(void) | |||
1816 | { | 1864 | { |
1817 | int num; | 1865 | int num; |
1818 | unsigned long base; | 1866 | unsigned long base; |
1819 | char *_buf, buf[32]; | ||
1820 | 1867 | ||
1821 | base = PORTA_FER; | 1868 | base = PORTA_FER; |
1822 | for (num = 0; num < 10; ++num) { | 1869 | for (num = 0; num < 10; ++num) { |
@@ -1824,24 +1871,6 @@ static int __init bfin_debug_mmrs_init(void) | |||
1824 | base += sizeof(struct bfin_gpio_regs); | 1871 | base += sizeof(struct bfin_gpio_regs); |
1825 | } | 1872 | } |
1826 | 1873 | ||
1827 | #define __PINT(uname, lname) __REGS(pint, #uname, lname) | ||
1828 | parent = debugfs_create_dir("pint", top); | ||
1829 | base = PINT0_MASK_SET; | ||
1830 | for (num = 0; num < 4; ++num) { | ||
1831 | _buf = REGS_STR_PFX(buf, PINT, num); | ||
1832 | __PINT(MASK_SET, mask_set); | ||
1833 | __PINT(MASK_CLEAR, mask_clear); | ||
1834 | __PINT(IRQ, irq); | ||
1835 | __PINT(ASSIGN, assign); | ||
1836 | __PINT(EDGE_SET, edge_set); | ||
1837 | __PINT(EDGE_CLEAR, edge_clear); | ||
1838 | __PINT(INVERT_SET, invert_set); | ||
1839 | __PINT(INVERT_CLEAR, invert_clear); | ||
1840 | __PINT(PINSTATE, pinstate); | ||
1841 | __PINT(LATCH, latch); | ||
1842 | base += sizeof(struct bfin_pint_regs); | ||
1843 | } | ||
1844 | |||
1845 | } | 1874 | } |
1846 | #endif /* BF54x */ | 1875 | #endif /* BF54x */ |
1847 | 1876 | ||
diff --git a/arch/blackfin/kernel/ftrace.c b/arch/blackfin/kernel/ftrace.c index 48808a12b42..9277905b82c 100644 --- a/arch/blackfin/kernel/ftrace.c +++ b/arch/blackfin/kernel/ftrace.c | |||
@@ -9,7 +9,7 @@ | |||
9 | #include <linux/kernel.h> | 9 | #include <linux/kernel.h> |
10 | #include <linux/sched.h> | 10 | #include <linux/sched.h> |
11 | #include <linux/uaccess.h> | 11 | #include <linux/uaccess.h> |
12 | #include <asm/atomic.h> | 12 | #include <linux/atomic.h> |
13 | #include <asm/cacheflush.h> | 13 | #include <asm/cacheflush.h> |
14 | 14 | ||
15 | #ifdef CONFIG_DYNAMIC_FTRACE | 15 | #ifdef CONFIG_DYNAMIC_FTRACE |
diff --git a/arch/blackfin/kernel/gptimers.c b/arch/blackfin/kernel/gptimers.c index 8b81dc04488..06459f4bf43 100644 --- a/arch/blackfin/kernel/gptimers.c +++ b/arch/blackfin/kernel/gptimers.c | |||
@@ -25,49 +25,33 @@ | |||
25 | 25 | ||
26 | #define BFIN_TIMER_NUM_GROUP (BFIN_TIMER_OCTET(MAX_BLACKFIN_GPTIMERS - 1) + 1) | 26 | #define BFIN_TIMER_NUM_GROUP (BFIN_TIMER_OCTET(MAX_BLACKFIN_GPTIMERS - 1) + 1) |
27 | 27 | ||
28 | typedef struct { | 28 | static struct bfin_gptimer_regs * const timer_regs[MAX_BLACKFIN_GPTIMERS] = |
29 | uint16_t config; | ||
30 | uint16_t __pad; | ||
31 | uint32_t counter; | ||
32 | uint32_t period; | ||
33 | uint32_t width; | ||
34 | } GPTIMER_timer_regs; | ||
35 | |||
36 | typedef struct { | ||
37 | uint16_t enable; | ||
38 | uint16_t __pad0; | ||
39 | uint16_t disable; | ||
40 | uint16_t __pad1; | ||
41 | uint32_t status; | ||
42 | } GPTIMER_group_regs; | ||
43 | |||
44 | static volatile GPTIMER_timer_regs *const timer_regs[MAX_BLACKFIN_GPTIMERS] = | ||
45 | { | 29 | { |
46 | (GPTIMER_timer_regs *)TIMER0_CONFIG, | 30 | (void *)TIMER0_CONFIG, |
47 | (GPTIMER_timer_regs *)TIMER1_CONFIG, | 31 | (void *)TIMER1_CONFIG, |
48 | (GPTIMER_timer_regs *)TIMER2_CONFIG, | 32 | (void *)TIMER2_CONFIG, |
49 | #if (MAX_BLACKFIN_GPTIMERS > 3) | 33 | #if (MAX_BLACKFIN_GPTIMERS > 3) |
50 | (GPTIMER_timer_regs *)TIMER3_CONFIG, | 34 | (void *)TIMER3_CONFIG, |
51 | (GPTIMER_timer_regs *)TIMER4_CONFIG, | 35 | (void *)TIMER4_CONFIG, |
52 | (GPTIMER_timer_regs *)TIMER5_CONFIG, | 36 | (void *)TIMER5_CONFIG, |
53 | (GPTIMER_timer_regs *)TIMER6_CONFIG, | 37 | (void *)TIMER6_CONFIG, |
54 | (GPTIMER_timer_regs *)TIMER7_CONFIG, | 38 | (void *)TIMER7_CONFIG, |
55 | # if (MAX_BLACKFIN_GPTIMERS > 8) | 39 | # if (MAX_BLACKFIN_GPTIMERS > 8) |
56 | (GPTIMER_timer_regs *)TIMER8_CONFIG, | 40 | (void *)TIMER8_CONFIG, |
57 | (GPTIMER_timer_regs *)TIMER9_CONFIG, | 41 | (void *)TIMER9_CONFIG, |
58 | (GPTIMER_timer_regs *)TIMER10_CONFIG, | 42 | (void *)TIMER10_CONFIG, |
59 | # if (MAX_BLACKFIN_GPTIMERS > 11) | 43 | # if (MAX_BLACKFIN_GPTIMERS > 11) |
60 | (GPTIMER_timer_regs *)TIMER11_CONFIG, | 44 | (void *)TIMER11_CONFIG, |
61 | # endif | 45 | # endif |
62 | # endif | 46 | # endif |
63 | #endif | 47 | #endif |
64 | }; | 48 | }; |
65 | 49 | ||
66 | static volatile GPTIMER_group_regs *const group_regs[BFIN_TIMER_NUM_GROUP] = | 50 | static struct bfin_gptimer_group_regs * const group_regs[BFIN_TIMER_NUM_GROUP] = |
67 | { | 51 | { |
68 | (GPTIMER_group_regs *)TIMER0_GROUP_REG, | 52 | (void *)TIMER0_GROUP_REG, |
69 | #if (MAX_BLACKFIN_GPTIMERS > 8) | 53 | #if (MAX_BLACKFIN_GPTIMERS > 8) |
70 | (GPTIMER_group_regs *)TIMER8_GROUP_REG, | 54 | (void *)TIMER8_GROUP_REG, |
71 | #endif | 55 | #endif |
72 | }; | 56 | }; |
73 | 57 | ||
@@ -140,7 +124,7 @@ static uint32_t const timil_mask[MAX_BLACKFIN_GPTIMERS] = | |||
140 | void set_gptimer_pwidth(unsigned int timer_id, uint32_t value) | 124 | void set_gptimer_pwidth(unsigned int timer_id, uint32_t value) |
141 | { | 125 | { |
142 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 126 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
143 | timer_regs[timer_id]->width = value; | 127 | bfin_write(&timer_regs[timer_id]->width, value); |
144 | SSYNC(); | 128 | SSYNC(); |
145 | } | 129 | } |
146 | EXPORT_SYMBOL(set_gptimer_pwidth); | 130 | EXPORT_SYMBOL(set_gptimer_pwidth); |
@@ -148,14 +132,14 @@ EXPORT_SYMBOL(set_gptimer_pwidth); | |||
148 | uint32_t get_gptimer_pwidth(unsigned int timer_id) | 132 | uint32_t get_gptimer_pwidth(unsigned int timer_id) |
149 | { | 133 | { |
150 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 134 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
151 | return timer_regs[timer_id]->width; | 135 | return bfin_read(&timer_regs[timer_id]->width); |
152 | } | 136 | } |
153 | EXPORT_SYMBOL(get_gptimer_pwidth); | 137 | EXPORT_SYMBOL(get_gptimer_pwidth); |
154 | 138 | ||
155 | void set_gptimer_period(unsigned int timer_id, uint32_t period) | 139 | void set_gptimer_period(unsigned int timer_id, uint32_t period) |
156 | { | 140 | { |
157 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 141 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
158 | timer_regs[timer_id]->period = period; | 142 | bfin_write(&timer_regs[timer_id]->period, period); |
159 | SSYNC(); | 143 | SSYNC(); |
160 | } | 144 | } |
161 | EXPORT_SYMBOL(set_gptimer_period); | 145 | EXPORT_SYMBOL(set_gptimer_period); |
@@ -163,71 +147,76 @@ EXPORT_SYMBOL(set_gptimer_period); | |||
163 | uint32_t get_gptimer_period(unsigned int timer_id) | 147 | uint32_t get_gptimer_period(unsigned int timer_id) |
164 | { | 148 | { |
165 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 149 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
166 | return timer_regs[timer_id]->period; | 150 | return bfin_read(&timer_regs[timer_id]->period); |
167 | } | 151 | } |
168 | EXPORT_SYMBOL(get_gptimer_period); | 152 | EXPORT_SYMBOL(get_gptimer_period); |
169 | 153 | ||
170 | uint32_t get_gptimer_count(unsigned int timer_id) | 154 | uint32_t get_gptimer_count(unsigned int timer_id) |
171 | { | 155 | { |
172 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 156 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
173 | return timer_regs[timer_id]->counter; | 157 | return bfin_read(&timer_regs[timer_id]->counter); |
174 | } | 158 | } |
175 | EXPORT_SYMBOL(get_gptimer_count); | 159 | EXPORT_SYMBOL(get_gptimer_count); |
176 | 160 | ||
177 | uint32_t get_gptimer_status(unsigned int group) | 161 | uint32_t get_gptimer_status(unsigned int group) |
178 | { | 162 | { |
179 | tassert(group < BFIN_TIMER_NUM_GROUP); | 163 | tassert(group < BFIN_TIMER_NUM_GROUP); |
180 | return group_regs[group]->status; | 164 | return bfin_read(&group_regs[group]->status); |
181 | } | 165 | } |
182 | EXPORT_SYMBOL(get_gptimer_status); | 166 | EXPORT_SYMBOL(get_gptimer_status); |
183 | 167 | ||
184 | void set_gptimer_status(unsigned int group, uint32_t value) | 168 | void set_gptimer_status(unsigned int group, uint32_t value) |
185 | { | 169 | { |
186 | tassert(group < BFIN_TIMER_NUM_GROUP); | 170 | tassert(group < BFIN_TIMER_NUM_GROUP); |
187 | group_regs[group]->status = value; | 171 | bfin_write(&group_regs[group]->status, value); |
188 | SSYNC(); | 172 | SSYNC(); |
189 | } | 173 | } |
190 | EXPORT_SYMBOL(set_gptimer_status); | 174 | EXPORT_SYMBOL(set_gptimer_status); |
191 | 175 | ||
176 | static uint32_t read_gptimer_status(unsigned int timer_id) | ||
177 | { | ||
178 | return bfin_read(&group_regs[BFIN_TIMER_OCTET(timer_id)]->status); | ||
179 | } | ||
180 | |||
192 | int get_gptimer_intr(unsigned int timer_id) | 181 | int get_gptimer_intr(unsigned int timer_id) |
193 | { | 182 | { |
194 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 183 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
195 | return !!(group_regs[BFIN_TIMER_OCTET(timer_id)]->status & timil_mask[timer_id]); | 184 | return !!(read_gptimer_status(timer_id) & timil_mask[timer_id]); |
196 | } | 185 | } |
197 | EXPORT_SYMBOL(get_gptimer_intr); | 186 | EXPORT_SYMBOL(get_gptimer_intr); |
198 | 187 | ||
199 | void clear_gptimer_intr(unsigned int timer_id) | 188 | void clear_gptimer_intr(unsigned int timer_id) |
200 | { | 189 | { |
201 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 190 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
202 | group_regs[BFIN_TIMER_OCTET(timer_id)]->status = timil_mask[timer_id]; | 191 | bfin_write(&group_regs[BFIN_TIMER_OCTET(timer_id)]->status, timil_mask[timer_id]); |
203 | } | 192 | } |
204 | EXPORT_SYMBOL(clear_gptimer_intr); | 193 | EXPORT_SYMBOL(clear_gptimer_intr); |
205 | 194 | ||
206 | int get_gptimer_over(unsigned int timer_id) | 195 | int get_gptimer_over(unsigned int timer_id) |
207 | { | 196 | { |
208 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 197 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
209 | return !!(group_regs[BFIN_TIMER_OCTET(timer_id)]->status & tovf_mask[timer_id]); | 198 | return !!(read_gptimer_status(timer_id) & tovf_mask[timer_id]); |
210 | } | 199 | } |
211 | EXPORT_SYMBOL(get_gptimer_over); | 200 | EXPORT_SYMBOL(get_gptimer_over); |
212 | 201 | ||
213 | void clear_gptimer_over(unsigned int timer_id) | 202 | void clear_gptimer_over(unsigned int timer_id) |
214 | { | 203 | { |
215 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 204 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
216 | group_regs[BFIN_TIMER_OCTET(timer_id)]->status = tovf_mask[timer_id]; | 205 | bfin_write(&group_regs[BFIN_TIMER_OCTET(timer_id)]->status, tovf_mask[timer_id]); |
217 | } | 206 | } |
218 | EXPORT_SYMBOL(clear_gptimer_over); | 207 | EXPORT_SYMBOL(clear_gptimer_over); |
219 | 208 | ||
220 | int get_gptimer_run(unsigned int timer_id) | 209 | int get_gptimer_run(unsigned int timer_id) |
221 | { | 210 | { |
222 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 211 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
223 | return !!(group_regs[BFIN_TIMER_OCTET(timer_id)]->status & trun_mask[timer_id]); | 212 | return !!(read_gptimer_status(timer_id) & trun_mask[timer_id]); |
224 | } | 213 | } |
225 | EXPORT_SYMBOL(get_gptimer_run); | 214 | EXPORT_SYMBOL(get_gptimer_run); |
226 | 215 | ||
227 | void set_gptimer_config(unsigned int timer_id, uint16_t config) | 216 | void set_gptimer_config(unsigned int timer_id, uint16_t config) |
228 | { | 217 | { |
229 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 218 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
230 | timer_regs[timer_id]->config = config; | 219 | bfin_write(&timer_regs[timer_id]->config, config); |
231 | SSYNC(); | 220 | SSYNC(); |
232 | } | 221 | } |
233 | EXPORT_SYMBOL(set_gptimer_config); | 222 | EXPORT_SYMBOL(set_gptimer_config); |
@@ -235,7 +224,7 @@ EXPORT_SYMBOL(set_gptimer_config); | |||
235 | uint16_t get_gptimer_config(unsigned int timer_id) | 224 | uint16_t get_gptimer_config(unsigned int timer_id) |
236 | { | 225 | { |
237 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 226 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
238 | return timer_regs[timer_id]->config; | 227 | return bfin_read(&timer_regs[timer_id]->config); |
239 | } | 228 | } |
240 | EXPORT_SYMBOL(get_gptimer_config); | 229 | EXPORT_SYMBOL(get_gptimer_config); |
241 | 230 | ||
@@ -244,7 +233,7 @@ void enable_gptimers(uint16_t mask) | |||
244 | int i; | 233 | int i; |
245 | tassert((mask & ~BLACKFIN_GPTIMER_IDMASK) == 0); | 234 | tassert((mask & ~BLACKFIN_GPTIMER_IDMASK) == 0); |
246 | for (i = 0; i < BFIN_TIMER_NUM_GROUP; ++i) { | 235 | for (i = 0; i < BFIN_TIMER_NUM_GROUP; ++i) { |
247 | group_regs[i]->enable = mask & 0xFF; | 236 | bfin_write(&group_regs[i]->enable, mask & 0xFF); |
248 | mask >>= 8; | 237 | mask >>= 8; |
249 | } | 238 | } |
250 | SSYNC(); | 239 | SSYNC(); |
@@ -257,7 +246,7 @@ static void _disable_gptimers(uint16_t mask) | |||
257 | uint16_t m = mask; | 246 | uint16_t m = mask; |
258 | tassert((mask & ~BLACKFIN_GPTIMER_IDMASK) == 0); | 247 | tassert((mask & ~BLACKFIN_GPTIMER_IDMASK) == 0); |
259 | for (i = 0; i < BFIN_TIMER_NUM_GROUP; ++i) { | 248 | for (i = 0; i < BFIN_TIMER_NUM_GROUP; ++i) { |
260 | group_regs[i]->disable = m & 0xFF; | 249 | bfin_write(&group_regs[i]->disable, m & 0xFF); |
261 | m >>= 8; | 250 | m >>= 8; |
262 | } | 251 | } |
263 | } | 252 | } |
@@ -268,7 +257,7 @@ void disable_gptimers(uint16_t mask) | |||
268 | _disable_gptimers(mask); | 257 | _disable_gptimers(mask); |
269 | for (i = 0; i < MAX_BLACKFIN_GPTIMERS; ++i) | 258 | for (i = 0; i < MAX_BLACKFIN_GPTIMERS; ++i) |
270 | if (mask & (1 << i)) | 259 | if (mask & (1 << i)) |
271 | group_regs[BFIN_TIMER_OCTET(i)]->status = trun_mask[i]; | 260 | bfin_write(&group_regs[BFIN_TIMER_OCTET(i)]->status, trun_mask[i]); |
272 | SSYNC(); | 261 | SSYNC(); |
273 | } | 262 | } |
274 | EXPORT_SYMBOL(disable_gptimers); | 263 | EXPORT_SYMBOL(disable_gptimers); |
@@ -283,7 +272,7 @@ EXPORT_SYMBOL(disable_gptimers_sync); | |||
283 | void set_gptimer_pulse_hi(unsigned int timer_id) | 272 | void set_gptimer_pulse_hi(unsigned int timer_id) |
284 | { | 273 | { |
285 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 274 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
286 | timer_regs[timer_id]->config |= TIMER_PULSE_HI; | 275 | bfin_write_or(&timer_regs[timer_id]->config, TIMER_PULSE_HI); |
287 | SSYNC(); | 276 | SSYNC(); |
288 | } | 277 | } |
289 | EXPORT_SYMBOL(set_gptimer_pulse_hi); | 278 | EXPORT_SYMBOL(set_gptimer_pulse_hi); |
@@ -291,7 +280,7 @@ EXPORT_SYMBOL(set_gptimer_pulse_hi); | |||
291 | void clear_gptimer_pulse_hi(unsigned int timer_id) | 280 | void clear_gptimer_pulse_hi(unsigned int timer_id) |
292 | { | 281 | { |
293 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 282 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
294 | timer_regs[timer_id]->config &= ~TIMER_PULSE_HI; | 283 | bfin_write_and(&timer_regs[timer_id]->config, ~TIMER_PULSE_HI); |
295 | SSYNC(); | 284 | SSYNC(); |
296 | } | 285 | } |
297 | EXPORT_SYMBOL(clear_gptimer_pulse_hi); | 286 | EXPORT_SYMBOL(clear_gptimer_pulse_hi); |
@@ -301,7 +290,7 @@ uint16_t get_enabled_gptimers(void) | |||
301 | int i; | 290 | int i; |
302 | uint16_t result = 0; | 291 | uint16_t result = 0; |
303 | for (i = 0; i < BFIN_TIMER_NUM_GROUP; ++i) | 292 | for (i = 0; i < BFIN_TIMER_NUM_GROUP; ++i) |
304 | result |= (group_regs[i]->enable << (i << 3)); | 293 | result |= (bfin_read(&group_regs[i]->enable) << (i << 3)); |
305 | return result; | 294 | return result; |
306 | } | 295 | } |
307 | EXPORT_SYMBOL(get_enabled_gptimers); | 296 | EXPORT_SYMBOL(get_enabled_gptimers); |
diff --git a/arch/blackfin/kernel/ipipe.c b/arch/blackfin/kernel/ipipe.c index 486426f8a0d..dbe11220cc5 100644 --- a/arch/blackfin/kernel/ipipe.c +++ b/arch/blackfin/kernel/ipipe.c | |||
@@ -32,7 +32,7 @@ | |||
32 | #include <linux/unistd.h> | 32 | #include <linux/unistd.h> |
33 | #include <linux/io.h> | 33 | #include <linux/io.h> |
34 | #include <asm/system.h> | 34 | #include <asm/system.h> |
35 | #include <asm/atomic.h> | 35 | #include <linux/atomic.h> |
36 | #include <asm/irq_handler.h> | 36 | #include <asm/irq_handler.h> |
37 | 37 | ||
38 | DEFINE_PER_CPU(struct pt_regs, __ipipe_tick_regs); | 38 | DEFINE_PER_CPU(struct pt_regs, __ipipe_tick_regs); |
diff --git a/arch/blackfin/kernel/module.c b/arch/blackfin/kernel/module.c index 35e350cad9d..4489efc5288 100644 --- a/arch/blackfin/kernel/module.c +++ b/arch/blackfin/kernel/module.c | |||
@@ -16,19 +16,6 @@ | |||
16 | #include <asm/cacheflush.h> | 16 | #include <asm/cacheflush.h> |
17 | #include <asm/uaccess.h> | 17 | #include <asm/uaccess.h> |
18 | 18 | ||
19 | void *module_alloc(unsigned long size) | ||
20 | { | ||
21 | if (size == 0) | ||
22 | return NULL; | ||
23 | return vmalloc(size); | ||
24 | } | ||
25 | |||
26 | /* Free memory returned from module_alloc */ | ||
27 | void module_free(struct module *mod, void *module_region) | ||
28 | { | ||
29 | vfree(module_region); | ||
30 | } | ||
31 | |||
32 | /* Transfer the section to the L1 memory */ | 19 | /* Transfer the section to the L1 memory */ |
33 | int | 20 | int |
34 | module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs, | 21 | module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs, |
@@ -150,14 +137,6 @@ module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs, | |||
150 | return 0; | 137 | return 0; |
151 | } | 138 | } |
152 | 139 | ||
153 | int | ||
154 | apply_relocate(Elf_Shdr * sechdrs, const char *strtab, | ||
155 | unsigned int symindex, unsigned int relsec, struct module *mod) | ||
156 | { | ||
157 | pr_err(".rel unsupported\n"); | ||
158 | return -ENOEXEC; | ||
159 | } | ||
160 | |||
161 | /*************************************************************************/ | 140 | /*************************************************************************/ |
162 | /* FUNCTION : apply_relocate_add */ | 141 | /* FUNCTION : apply_relocate_add */ |
163 | /* ABSTRACT : Blackfin specific relocation handling for the loadable */ | 142 | /* ABSTRACT : Blackfin specific relocation handling for the loadable */ |
diff --git a/arch/blackfin/kernel/nmi.c b/arch/blackfin/kernel/nmi.c index 679d0db3525..9919d29287d 100644 --- a/arch/blackfin/kernel/nmi.c +++ b/arch/blackfin/kernel/nmi.c | |||
@@ -18,7 +18,7 @@ | |||
18 | #include <linux/smp.h> | 18 | #include <linux/smp.h> |
19 | #include <linux/timer.h> | 19 | #include <linux/timer.h> |
20 | #include <asm/blackfin.h> | 20 | #include <asm/blackfin.h> |
21 | #include <asm/atomic.h> | 21 | #include <linux/atomic.h> |
22 | #include <asm/cacheflush.h> | 22 | #include <asm/cacheflush.h> |
23 | #include <asm/bfin_watchdog.h> | 23 | #include <asm/bfin_watchdog.h> |
24 | 24 | ||
diff --git a/arch/blackfin/kernel/process.c b/arch/blackfin/kernel/process.c index 6a660fa921b..6a80a9e9fc4 100644 --- a/arch/blackfin/kernel/process.c +++ b/arch/blackfin/kernel/process.c | |||
@@ -140,7 +140,6 @@ EXPORT_SYMBOL(kernel_thread); | |||
140 | */ | 140 | */ |
141 | void start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp) | 141 | void start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp) |
142 | { | 142 | { |
143 | set_fs(USER_DS); | ||
144 | regs->pc = new_ip; | 143 | regs->pc = new_ip; |
145 | if (current->mm) | 144 | if (current->mm) |
146 | regs->p5 = current->mm->start_data; | 145 | regs->p5 = current->mm->start_data; |
diff --git a/arch/blackfin/kernel/pwm.c b/arch/blackfin/kernel/pwm.c new file mode 100644 index 00000000000..33f5942733b --- /dev/null +++ b/arch/blackfin/kernel/pwm.c | |||
@@ -0,0 +1,100 @@ | |||
1 | /* | ||
2 | * Blackfin Pulse Width Modulation (PWM) core | ||
3 | * | ||
4 | * Copyright (c) 2011 Analog Devices Inc. | ||
5 | * | ||
6 | * Licensed under the GPL-2 or later. | ||
7 | */ | ||
8 | |||
9 | #include <linux/module.h> | ||
10 | #include <linux/pwm.h> | ||
11 | #include <linux/slab.h> | ||
12 | |||
13 | #include <asm/gptimers.h> | ||
14 | #include <asm/portmux.h> | ||
15 | |||
16 | struct pwm_device { | ||
17 | unsigned id; | ||
18 | unsigned short pin; | ||
19 | }; | ||
20 | |||
21 | static const unsigned short pwm_to_gptimer_per[] = { | ||
22 | P_TMR0, P_TMR1, P_TMR2, P_TMR3, P_TMR4, P_TMR5, | ||
23 | P_TMR6, P_TMR7, P_TMR8, P_TMR9, P_TMR10, P_TMR11, | ||
24 | }; | ||
25 | |||
26 | struct pwm_device *pwm_request(int pwm_id, const char *label) | ||
27 | { | ||
28 | struct pwm_device *pwm; | ||
29 | int ret; | ||
30 | |||
31 | /* XXX: pwm_id really should be unsigned */ | ||
32 | if (pwm_id < 0) | ||
33 | return NULL; | ||
34 | |||
35 | pwm = kzalloc(sizeof(*pwm), GFP_KERNEL); | ||
36 | if (!pwm) | ||
37 | return pwm; | ||
38 | |||
39 | pwm->id = pwm_id; | ||
40 | if (pwm->id >= ARRAY_SIZE(pwm_to_gptimer_per)) | ||
41 | goto err; | ||
42 | |||
43 | pwm->pin = pwm_to_gptimer_per[pwm->id]; | ||
44 | ret = peripheral_request(pwm->pin, label); | ||
45 | if (ret) | ||
46 | goto err; | ||
47 | |||
48 | return pwm; | ||
49 | err: | ||
50 | kfree(pwm); | ||
51 | return NULL; | ||
52 | } | ||
53 | EXPORT_SYMBOL(pwm_request); | ||
54 | |||
55 | void pwm_free(struct pwm_device *pwm) | ||
56 | { | ||
57 | peripheral_free(pwm->pin); | ||
58 | kfree(pwm); | ||
59 | } | ||
60 | EXPORT_SYMBOL(pwm_free); | ||
61 | |||
62 | int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns) | ||
63 | { | ||
64 | unsigned long period, duty; | ||
65 | unsigned long long val; | ||
66 | |||
67 | if (duty_ns < 0 || duty_ns > period_ns) | ||
68 | return -EINVAL; | ||
69 | |||
70 | val = (unsigned long long)get_sclk() * period_ns; | ||
71 | do_div(val, NSEC_PER_SEC); | ||
72 | period = val; | ||
73 | |||
74 | val = (unsigned long long)period * duty_ns; | ||
75 | do_div(val, period_ns); | ||
76 | duty = period - val; | ||
77 | |||
78 | if (duty >= period) | ||
79 | duty = period - 1; | ||
80 | |||
81 | set_gptimer_config(pwm->id, TIMER_MODE_PWM | TIMER_PERIOD_CNT); | ||
82 | set_gptimer_pwidth(pwm->id, duty); | ||
83 | set_gptimer_period(pwm->id, period); | ||
84 | |||
85 | return 0; | ||
86 | } | ||
87 | EXPORT_SYMBOL(pwm_config); | ||
88 | |||
89 | int pwm_enable(struct pwm_device *pwm) | ||
90 | { | ||
91 | enable_gptimer(pwm->id); | ||
92 | return 0; | ||
93 | } | ||
94 | EXPORT_SYMBOL(pwm_enable); | ||
95 | |||
96 | void pwm_disable(struct pwm_device *pwm) | ||
97 | { | ||
98 | disable_gptimer(pwm->id); | ||
99 | } | ||
100 | EXPORT_SYMBOL(pwm_disable); | ||
diff --git a/arch/blackfin/kernel/reboot.c b/arch/blackfin/kernel/reboot.c index 488bdc51aaa..c4c0081b199 100644 --- a/arch/blackfin/kernel/reboot.c +++ b/arch/blackfin/kernel/reboot.c | |||
@@ -54,7 +54,9 @@ static void bfin_reset(void) | |||
54 | 54 | ||
55 | /* The BF526 ROM will crash during reset */ | 55 | /* The BF526 ROM will crash during reset */ |
56 | #if defined(__ADSPBF522__) || defined(__ADSPBF524__) || defined(__ADSPBF526__) | 56 | #if defined(__ADSPBF522__) || defined(__ADSPBF524__) || defined(__ADSPBF526__) |
57 | bfin_read_SWRST(); | 57 | /* Seems to be fixed with newer parts though ... */ |
58 | if (__SILICON_REVISION__ < 1 && bfin_revid() < 1) | ||
59 | bfin_read_SWRST(); | ||
58 | #endif | 60 | #endif |
59 | 61 | ||
60 | /* Wait for the SWRST write to complete. Cannot rely on SSYNC | 62 | /* Wait for the SWRST write to complete. Cannot rely on SSYNC |
diff --git a/arch/blackfin/kernel/setup.c b/arch/blackfin/kernel/setup.c index 536bd9d7e0c..dfa2525a442 100644 --- a/arch/blackfin/kernel/setup.c +++ b/arch/blackfin/kernel/setup.c | |||
@@ -54,8 +54,7 @@ EXPORT_SYMBOL(mtd_size); | |||
54 | #endif | 54 | #endif |
55 | 55 | ||
56 | char __initdata command_line[COMMAND_LINE_SIZE]; | 56 | char __initdata command_line[COMMAND_LINE_SIZE]; |
57 | void __initdata *init_retx, *init_saved_retx, *init_saved_seqstat, | 57 | struct blackfin_initial_pda __initdata initial_pda; |
58 | *init_saved_icplb_fault_addr, *init_saved_dcplb_fault_addr; | ||
59 | 58 | ||
60 | /* boot memmap, for parsing "memmap=" */ | 59 | /* boot memmap, for parsing "memmap=" */ |
61 | #define BFIN_MEMMAP_MAX 128 /* number of entries in bfin_memmap */ | 60 | #define BFIN_MEMMAP_MAX 128 /* number of entries in bfin_memmap */ |
@@ -957,13 +956,16 @@ void __init setup_arch(char **cmdline_p) | |||
957 | printk(KERN_EMERG "Recovering from DOUBLE FAULT event\n"); | 956 | printk(KERN_EMERG "Recovering from DOUBLE FAULT event\n"); |
958 | #ifdef CONFIG_DEBUG_DOUBLEFAULT | 957 | #ifdef CONFIG_DEBUG_DOUBLEFAULT |
959 | /* We assume the crashing kernel, and the current symbol table match */ | 958 | /* We assume the crashing kernel, and the current symbol table match */ |
960 | printk(KERN_EMERG " While handling exception (EXCAUSE = 0x%x) at %pF\n", | 959 | printk(KERN_EMERG " While handling exception (EXCAUSE = %#x) at %pF\n", |
961 | (int)init_saved_seqstat & SEQSTAT_EXCAUSE, init_saved_retx); | 960 | initial_pda.seqstat_doublefault & SEQSTAT_EXCAUSE, |
962 | printk(KERN_NOTICE " DCPLB_FAULT_ADDR: %pF\n", init_saved_dcplb_fault_addr); | 961 | initial_pda.retx_doublefault); |
963 | printk(KERN_NOTICE " ICPLB_FAULT_ADDR: %pF\n", init_saved_icplb_fault_addr); | 962 | printk(KERN_NOTICE " DCPLB_FAULT_ADDR: %pF\n", |
963 | initial_pda.dcplb_doublefault_addr); | ||
964 | printk(KERN_NOTICE " ICPLB_FAULT_ADDR: %pF\n", | ||
965 | initial_pda.icplb_doublefault_addr); | ||
964 | #endif | 966 | #endif |
965 | printk(KERN_NOTICE " The instruction at %pF caused a double exception\n", | 967 | printk(KERN_NOTICE " The instruction at %pF caused a double exception\n", |
966 | init_retx); | 968 | initial_pda.retx); |
967 | } else if (_bfin_swrst & RESET_WDOG) | 969 | } else if (_bfin_swrst & RESET_WDOG) |
968 | printk(KERN_INFO "Recovering from Watchdog event\n"); | 970 | printk(KERN_INFO "Recovering from Watchdog event\n"); |
969 | else if (_bfin_swrst & RESET_SOFTWARE) | 971 | else if (_bfin_swrst & RESET_SOFTWARE) |
diff --git a/arch/blackfin/kernel/time.c b/arch/blackfin/kernel/time.c index 8d73724c009..ceb2bf63dfe 100644 --- a/arch/blackfin/kernel/time.c +++ b/arch/blackfin/kernel/time.c | |||
@@ -51,7 +51,7 @@ void __init setup_core_timer(void) | |||
51 | u32 tcount; | 51 | u32 tcount; |
52 | 52 | ||
53 | /* power up the timer, but don't enable it just yet */ | 53 | /* power up the timer, but don't enable it just yet */ |
54 | bfin_write_TCNTL(1); | 54 | bfin_write_TCNTL(TMPWR); |
55 | CSYNC(); | 55 | CSYNC(); |
56 | 56 | ||
57 | /* the TSCALE prescaler counter */ | 57 | /* the TSCALE prescaler counter */ |
@@ -64,7 +64,7 @@ void __init setup_core_timer(void) | |||
64 | /* now enable the timer */ | 64 | /* now enable the timer */ |
65 | CSYNC(); | 65 | CSYNC(); |
66 | 66 | ||
67 | bfin_write_TCNTL(7); | 67 | bfin_write_TCNTL(TAUTORLD | TMREN | TMPWR); |
68 | } | 68 | } |
69 | #endif | 69 | #endif |
70 | 70 | ||
diff --git a/arch/blackfin/kernel/vmlinux.lds.S b/arch/blackfin/kernel/vmlinux.lds.S index 3ac5b66d14a..ba35864b2b7 100644 --- a/arch/blackfin/kernel/vmlinux.lds.S +++ b/arch/blackfin/kernel/vmlinux.lds.S | |||
@@ -155,6 +155,7 @@ SECTIONS | |||
155 | SECURITY_INITCALL | 155 | SECURITY_INITCALL |
156 | INIT_RAM_FS | 156 | INIT_RAM_FS |
157 | 157 | ||
158 | . = ALIGN(PAGE_SIZE); | ||
158 | ___per_cpu_load = .; | 159 | ___per_cpu_load = .; |
159 | PERCPU_INPUT(32) | 160 | PERCPU_INPUT(32) |
160 | 161 | ||