Commit bf785ee0 authored by Linus Torvalds's avatar Linus Torvalds

Merge master.kernel.org:/home/rmk/linux-2.6-arm

parents 8b87e1ba 00431707
...@@ -84,7 +84,7 @@ ...@@ -84,7 +84,7 @@
kputc #'\n' kputc #'\n'
kphex r5, 8 /* decompressed kernel start */ kphex r5, 8 /* decompressed kernel start */
kputc #'-' kputc #'-'
kphex r8, 8 /* decompressed kernel end */ kphex r9, 8 /* decompressed kernel end */
kputc #'>' kputc #'>'
kphex r4, 8 /* kernel execution address */ kphex r4, 8 /* kernel execution address */
kputc #'\n' kputc #'\n'
...@@ -116,7 +116,7 @@ start: ...@@ -116,7 +116,7 @@ start:
.word start @ absolute load/run zImage address .word start @ absolute load/run zImage address
.word _edata @ zImage end address .word _edata @ zImage end address
1: mov r7, r1 @ save architecture ID 1: mov r7, r1 @ save architecture ID
mov r8, #0 @ save r0 mov r8, r2 @ save atags pointer
#ifndef __ARM_ARCH_2__ #ifndef __ARM_ARCH_2__
/* /*
...@@ -144,7 +144,7 @@ not_angel: ...@@ -144,7 +144,7 @@ not_angel:
/* /*
* some architecture specific code can be inserted * some architecture specific code can be inserted
* by the linker here, but it should preserve r7 and r8. * by the linker here, but it should preserve r7, r8, and r9.
*/ */
.text .text
...@@ -249,16 +249,17 @@ not_relocated: mov r0, #0 ...@@ -249,16 +249,17 @@ not_relocated: mov r0, #0
* r5 = decompressed kernel start * r5 = decompressed kernel start
* r6 = processor ID * r6 = processor ID
* r7 = architecture ID * r7 = architecture ID
* r8-r14 = unused * r8 = atags pointer
* r9-r14 = corrupted
*/ */
add r1, r5, r0 @ end of decompressed kernel add r1, r5, r0 @ end of decompressed kernel
adr r2, reloc_start adr r2, reloc_start
ldr r3, LC1 ldr r3, LC1
add r3, r2, r3 add r3, r2, r3
1: ldmia r2!, {r8 - r13} @ copy relocation code 1: ldmia r2!, {r9 - r14} @ copy relocation code
stmia r1!, {r8 - r13} stmia r1!, {r9 - r14}
ldmia r2!, {r8 - r13} ldmia r2!, {r9 - r14}
stmia r1!, {r8 - r13} stmia r1!, {r9 - r14}
cmp r2, r3 cmp r2, r3
blo 1b blo 1b
...@@ -308,11 +309,12 @@ params: ldr r0, =params_phys ...@@ -308,11 +309,12 @@ params: ldr r0, =params_phys
* r4 = kernel execution address * r4 = kernel execution address
* r6 = processor ID * r6 = processor ID
* r7 = architecture number * r7 = architecture number
* r8 = run-time address of "start" * r8 = atags pointer
* r9 = run-time address of "start" (???)
* On exit, * On exit,
* r1, r2, r3, r8, r9, r12 corrupted * r1, r2, r3, r9, r10, r12 corrupted
* This routine must preserve: * This routine must preserve:
* r4, r5, r6, r7 * r4, r5, r6, r7, r8
*/ */
.align 5 .align 5
cache_on: mov r3, #8 @ cache_on function cache_on: mov r3, #8 @ cache_on function
...@@ -326,15 +328,15 @@ __setup_mmu: sub r3, r4, #16384 @ Page directory size ...@@ -326,15 +328,15 @@ __setup_mmu: sub r3, r4, #16384 @ Page directory size
* bits for the RAM area only. * bits for the RAM area only.
*/ */
mov r0, r3 mov r0, r3
mov r8, r0, lsr #18 mov r9, r0, lsr #18
mov r8, r8, lsl #18 @ start of RAM mov r9, r9, lsl #18 @ start of RAM
add r9, r8, #0x10000000 @ a reasonable RAM size add r10, r9, #0x10000000 @ a reasonable RAM size
mov r1, #0x12 mov r1, #0x12
orr r1, r1, #3 << 10 orr r1, r1, #3 << 10
add r2, r3, #16384 add r2, r3, #16384
1: cmp r1, r8 @ if virt > start of RAM 1: cmp r1, r8 @ if virt > start of RAM
orrhs r1, r1, #0x0c @ set cacheable, bufferable orrhs r1, r1, #0x0c @ set cacheable, bufferable
cmp r1, r9 @ if virt > end of RAM cmp r1, r10 @ if virt > end of RAM
bichs r1, r1, #0x0c @ clear cacheable, bufferable bichs r1, r1, #0x0c @ clear cacheable, bufferable
str r1, [r0], #4 @ 1:1 mapping str r1, [r0], #4 @ 1:1 mapping
add r1, r1, #1048576 add r1, r1, #1048576
...@@ -403,26 +405,28 @@ __common_cache_on: ...@@ -403,26 +405,28 @@ __common_cache_on:
* r5 = decompressed kernel start * r5 = decompressed kernel start
* r6 = processor ID * r6 = processor ID
* r7 = architecture ID * r7 = architecture ID
* r8-r14 = unused * r8 = atags pointer
* r9-r14 = corrupted
*/ */
.align 5 .align 5
reloc_start: add r8, r5, r0 reloc_start: add r9, r5, r0
debug_reloc_start debug_reloc_start
mov r1, r4 mov r1, r4
1: 1:
.rept 4 .rept 4
ldmia r5!, {r0, r2, r3, r9 - r13} @ relocate kernel ldmia r5!, {r0, r2, r3, r10 - r14} @ relocate kernel
stmia r1!, {r0, r2, r3, r9 - r13} stmia r1!, {r0, r2, r3, r10 - r14}
.endr .endr
cmp r5, r8 cmp r5, r9
blo 1b blo 1b
debug_reloc_end debug_reloc_end
call_kernel: bl cache_clean_flush call_kernel: bl cache_clean_flush
bl cache_off bl cache_off
mov r0, #0 mov r0, #0 @ must be zero
mov r1, r7 @ restore architecture number mov r1, r7 @ restore architecture number
mov r2, r8 @ restore atags pointer
mov pc, r4 @ call kernel mov pc, r4 @ call kernel
/* /*
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/capability.h> #include <linux/capability.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/mutex.h>
#include <asm/rtc.h> #include <asm/rtc.h>
#include <asm/semaphore.h> #include <asm/semaphore.h>
...@@ -35,7 +36,7 @@ static unsigned long rtc_irq_data; ...@@ -35,7 +36,7 @@ static unsigned long rtc_irq_data;
/* /*
* rtc_sem protects rtc_inuse and rtc_ops * rtc_sem protects rtc_inuse and rtc_ops
*/ */
static DECLARE_MUTEX(rtc_sem); static DEFINE_MUTEX(rtc_mutex);
static unsigned long rtc_inuse; static unsigned long rtc_inuse;
static struct rtc_ops *rtc_ops; static struct rtc_ops *rtc_ops;
...@@ -356,7 +357,7 @@ static int rtc_open(struct inode *inode, struct file *file) ...@@ -356,7 +357,7 @@ static int rtc_open(struct inode *inode, struct file *file)
{ {
int ret; int ret;
down(&rtc_sem); mutex_lock(&rtc_mutex);
if (rtc_inuse) { if (rtc_inuse) {
ret = -EBUSY; ret = -EBUSY;
...@@ -374,7 +375,7 @@ static int rtc_open(struct inode *inode, struct file *file) ...@@ -374,7 +375,7 @@ static int rtc_open(struct inode *inode, struct file *file)
rtc_inuse = 1; rtc_inuse = 1;
} }
} }
up(&rtc_sem); mutex_unlock(&rtc_mutex);
return ret; return ret;
} }
...@@ -480,7 +481,7 @@ int register_rtc(struct rtc_ops *ops) ...@@ -480,7 +481,7 @@ int register_rtc(struct rtc_ops *ops)
{ {
int ret = -EBUSY; int ret = -EBUSY;
down(&rtc_sem); mutex_lock(&rtc_mutex);
if (rtc_ops == NULL) { if (rtc_ops == NULL) {
rtc_ops = ops; rtc_ops = ops;
...@@ -489,7 +490,7 @@ int register_rtc(struct rtc_ops *ops) ...@@ -489,7 +490,7 @@ int register_rtc(struct rtc_ops *ops)
create_proc_read_entry("driver/rtc", 0, NULL, create_proc_read_entry("driver/rtc", 0, NULL,
rtc_read_proc, ops); rtc_read_proc, ops);
} }
up(&rtc_sem); mutex_unlock(&rtc_mutex);
return ret; return ret;
} }
...@@ -497,12 +498,12 @@ EXPORT_SYMBOL(register_rtc); ...@@ -497,12 +498,12 @@ EXPORT_SYMBOL(register_rtc);
void unregister_rtc(struct rtc_ops *rtc) void unregister_rtc(struct rtc_ops *rtc)
{ {
down(&rtc_sem); mutex_lock(&rtc_mutex);
if (rtc == rtc_ops) { if (rtc == rtc_ops) {
remove_proc_entry("driver/rtc", NULL); remove_proc_entry("driver/rtc", NULL);
misc_deregister(&rtc_miscdev); misc_deregister(&rtc_miscdev);
rtc_ops = NULL; rtc_ops = NULL;
} }
up(&rtc_sem); mutex_unlock(&rtc_mutex);
} }
EXPORT_SYMBOL(unregister_rtc); EXPORT_SYMBOL(unregister_rtc);
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/mutex.h>
#include <asm/dma.h> #include <asm/dma.h>
#include <asm/ecard.h> #include <asm/ecard.h>
...@@ -206,7 +207,7 @@ static void ecard_task_readbytes(struct ecard_request *req) ...@@ -206,7 +207,7 @@ static void ecard_task_readbytes(struct ecard_request *req)
static DECLARE_WAIT_QUEUE_HEAD(ecard_wait); static DECLARE_WAIT_QUEUE_HEAD(ecard_wait);
static struct ecard_request *ecard_req; static struct ecard_request *ecard_req;
static DECLARE_MUTEX(ecard_sem); static DEFINE_MUTEX(ecard_mutex);
/* /*
* Set up the expansion card daemon's page tables. * Set up the expansion card daemon's page tables.
...@@ -299,7 +300,7 @@ static void ecard_call(struct ecard_request *req) ...@@ -299,7 +300,7 @@ static void ecard_call(struct ecard_request *req)
req->complete = &completion; req->complete = &completion;
down(&ecard_sem); mutex_lock(&ecard_mutex);
ecard_req = req; ecard_req = req;
wake_up(&ecard_wait); wake_up(&ecard_wait);
...@@ -307,7 +308,7 @@ static void ecard_call(struct ecard_request *req) ...@@ -307,7 +308,7 @@ static void ecard_call(struct ecard_request *req)
* Now wait for kecardd to run. * Now wait for kecardd to run.
*/ */
wait_for_completion(&completion); wait_for_completion(&completion);
up(&ecard_sem); mutex_unlock(&ecard_mutex);
} }
/* ======================= Mid-level card control ===================== */ /* ======================= Mid-level card control ===================== */
......
...@@ -101,7 +101,7 @@ void __attribute__((naked)) set_fiq_regs(struct pt_regs *regs) ...@@ -101,7 +101,7 @@ void __attribute__((naked)) set_fiq_regs(struct pt_regs *regs)
ldmia %1, {r8 - r14}\n\ ldmia %1, {r8 - r14}\n\
msr cpsr_c, %0 @ return to SVC mode\n\ msr cpsr_c, %0 @ return to SVC mode\n\
mov r0, r0\n\ mov r0, r0\n\
ldmea fp, {fp, sp, pc}" ldmfd sp, {fp, sp, pc}"
: "=&r" (tmp) : "=&r" (tmp)
: "r" (&regs->ARM_r8), "I" (PSR_I_BIT | PSR_F_BIT | FIQ_MODE)); : "r" (&regs->ARM_r8), "I" (PSR_I_BIT | PSR_F_BIT | FIQ_MODE));
} }
...@@ -119,7 +119,7 @@ void __attribute__((naked)) get_fiq_regs(struct pt_regs *regs) ...@@ -119,7 +119,7 @@ void __attribute__((naked)) get_fiq_regs(struct pt_regs *regs)
stmia %1, {r8 - r14}\n\ stmia %1, {r8 - r14}\n\
msr cpsr_c, %0 @ return to SVC mode\n\ msr cpsr_c, %0 @ return to SVC mode\n\
mov r0, r0\n\ mov r0, r0\n\
ldmea fp, {fp, sp, pc}" ldmfd sp, {fp, sp, pc}"
: "=&r" (tmp) : "=&r" (tmp)
: "r" (&regs->ARM_r8), "I" (PSR_I_BIT | PSR_F_BIT | FIQ_MODE)); : "r" (&regs->ARM_r8), "I" (PSR_I_BIT | PSR_F_BIT | FIQ_MODE));
} }
......
...@@ -205,7 +205,7 @@ static const char *proc_arch[] = { ...@@ -205,7 +205,7 @@ static const char *proc_arch[] = {
"5TE", "5TE",
"5TEJ", "5TEJ",
"6TEJ", "6TEJ",
"?(10)", "7",
"?(11)", "?(11)",
"?(12)", "?(12)",
"?(13)", "?(13)",
...@@ -258,14 +258,17 @@ int cpu_architecture(void) ...@@ -258,14 +258,17 @@ int cpu_architecture(void)
{ {
int cpu_arch; int cpu_arch;
if ((processor_id & 0x0000f000) == 0) { if ((processor_id & 0x0008f000) == 0) {
cpu_arch = CPU_ARCH_UNKNOWN; cpu_arch = CPU_ARCH_UNKNOWN;
} else if ((processor_id & 0x0000f000) == 0x00007000) { } else if ((processor_id & 0x0008f000) == 0x00007000) {
cpu_arch = (processor_id & (1 << 23)) ? CPU_ARCH_ARMv4T : CPU_ARCH_ARMv3; cpu_arch = (processor_id & (1 << 23)) ? CPU_ARCH_ARMv4T : CPU_ARCH_ARMv3;
} else { } else if ((processor_id & 0x00080000) == 0x00000000) {
cpu_arch = (processor_id >> 16) & 7; cpu_arch = (processor_id >> 16) & 7;
if (cpu_arch) if (cpu_arch)
cpu_arch += CPU_ARCH_ARMv3; cpu_arch += CPU_ARCH_ARMv3;
} else {
/* the revised CPUID */
cpu_arch = ((processor_id >> 12) & 0xf) - 0xb + CPU_ARCH_ARMv6;
} }
return cpu_arch; return cpu_arch;
...@@ -863,11 +866,11 @@ static int c_show(struct seq_file *m, void *v) ...@@ -863,11 +866,11 @@ static int c_show(struct seq_file *m, void *v)
seq_printf(m, "\nCPU implementer\t: 0x%02x\n", processor_id >> 24); seq_printf(m, "\nCPU implementer\t: 0x%02x\n", processor_id >> 24);
seq_printf(m, "CPU architecture: %s\n", proc_arch[cpu_architecture()]); seq_printf(m, "CPU architecture: %s\n", proc_arch[cpu_architecture()]);
if ((processor_id & 0x0000f000) == 0x00000000) { if ((processor_id & 0x0008f000) == 0x00000000) {
/* pre-ARM7 */ /* pre-ARM7 */
seq_printf(m, "CPU part\t\t: %07x\n", processor_id >> 4); seq_printf(m, "CPU part\t\t: %07x\n", processor_id >> 4);
} else { } else {
if ((processor_id & 0x0000f000) == 0x00007000) { if ((processor_id & 0x0008f000) == 0x00007000) {
/* ARM7 */ /* ARM7 */
seq_printf(m, "CPU variant\t: 0x%02x\n", seq_printf(m, "CPU variant\t: 0x%02x\n",
(processor_id >> 16) & 127); (processor_id >> 16) & 127);
......
...@@ -18,11 +18,13 @@ ...@@ -18,11 +18,13 @@
*/ */
.macro save_regs .macro save_regs
mov ip, sp
stmfd sp!, {r1, r4 - r8, fp, ip, lr, pc} stmfd sp!, {r1, r4 - r8, fp, ip, lr, pc}
sub fp, ip, #4
.endm .endm
.macro load_regs,flags .macro load_regs
LOADREGS(\flags,fp,{r1, r4 - r8, fp, sp, pc}) ldmfd sp, {r1, r4 - r8, fp, sp, pc}
.endm .endm
.macro load1b, reg1 .macro load1b, reg1
......
...@@ -23,7 +23,7 @@ len .req r2 ...@@ -23,7 +23,7 @@ len .req r2
sum .req r3 sum .req r3
.Lzero: mov r0, sum .Lzero: mov r0, sum
load_regs ea load_regs
/* /*
* Align an unaligned destination pointer. We know that * Align an unaligned destination pointer. We know that
...@@ -87,9 +87,7 @@ sum .req r3 ...@@ -87,9 +87,7 @@ sum .req r3
b .Ldone b .Ldone
FN_ENTRY FN_ENTRY
mov ip, sp
save_regs save_regs
sub fp, ip, #4
cmp len, #8 @ Ensure that we have at least cmp len, #8 @ Ensure that we have at least
blo .Lless8 @ 8 bytes to copy. blo .Lless8 @ 8 bytes to copy.
...@@ -163,7 +161,7 @@ FN_ENTRY ...@@ -163,7 +161,7 @@ FN_ENTRY
ldr sum, [sp, #0] @ dst ldr sum, [sp, #0] @ dst
tst sum, #1 tst sum, #1
movne r0, r0, ror #8 movne r0, r0, ror #8
load_regs ea load_regs
.Lsrc_not_aligned: .Lsrc_not_aligned:
adc sum, sum, #0 @ include C from dst alignment adc sum, sum, #0 @ include C from dst alignment
......
...@@ -18,11 +18,13 @@ ...@@ -18,11 +18,13 @@
.text .text
.macro save_regs .macro save_regs
mov ip, sp
stmfd sp!, {r1 - r2, r4 - r8, fp, ip, lr, pc} stmfd sp!, {r1 - r2, r4 - r8, fp, ip, lr, pc}
sub fp, ip, #4
.endm .endm
.macro load_regs,flags .macro load_regs
ldm\flags fp, {r1, r2, r4-r8, fp, sp, pc} ldmfd sp, {r1, r2, r4-r8, fp, sp, pc}
.endm .endm
.macro load1b, reg1 .macro load1b, reg1
...@@ -100,5 +102,5 @@ ...@@ -100,5 +102,5 @@
6002: teq r2, r1 6002: teq r2, r1
strneb r0, [r1], #1 strneb r0, [r1], #1
bne 6002b bne 6002b
load_regs ea load_regs
.previous .previous
...@@ -16,26 +16,27 @@ ...@@ -16,26 +16,27 @@
#include <linux/err.h> #include <linux/err.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/mutex.h>
#include <asm/semaphore.h> #include <asm/semaphore.h>
#include "clock.h" #include "clock.h"
static LIST_HEAD(clocks); static LIST_HEAD(clocks);
static DECLARE_MUTEX(clocks_sem); static DEFINE_MUTEX(clocks_mutex);
struct clk *clk_get(struct device *dev, const char *id) struct clk *clk_get(struct device *dev, const char *id)
{ {
struct clk *p, *clk = ERR_PTR(-ENOENT); struct clk *p, *clk = ERR_PTR(-ENOENT);
down(&clocks_sem); mutex_lock(&clocks_mutex);
list_for_each_entry(p, &clocks, node) { list_for_each_entry(p, &clocks, node) {
if (strcmp(id, p->name) == 0 && try_module_get(p->owner)) { if (strcmp(id, p->name) == 0 && try_module_get(p->owner)) {
clk = p; clk = p;
break; break;
} }
} }
up(&clocks_sem); mutex_unlock(&clocks_mutex);
return clk; return clk;
} }
...@@ -78,18 +79,18 @@ EXPORT_SYMBOL(clk_set_rate); ...@@ -78,18 +79,18 @@ EXPORT_SYMBOL(clk_set_rate);
int clk_register(struct clk *clk) int clk_register(struct clk *clk)
{ {
down(&clocks_sem); mutex_lock(&clocks_mutex);
list_add(&clk->node, &clocks); list_add(&clk->node, &clocks);
up(&clocks_sem); mutex_unlock(&clocks_mutex);
return 0; return 0;
} }
EXPORT_SYMBOL(clk_register); EXPORT_SYMBOL(clk_register);
void clk_unregister(struct clk *clk) void clk_unregister(struct clk *clk)
{ {
down(&clocks_sem); mutex_lock(&clocks_mutex);
list_del(&clk->node); list_del(&clk->node);
up(&clocks_sem); mutex_unlock(&clocks_mutex);
} }
EXPORT_SYMBOL(clk_unregister); EXPORT_SYMBOL(clk_unregister);
......
...@@ -8,10 +8,10 @@ obj-n := ...@@ -8,10 +8,10 @@ obj-n :=
obj- := obj- :=
# Board-specific support # Board-specific support
#obj-$(CONFIG_ARCH_AT91RM9200DK) += board-dk.o obj-$(CONFIG_ARCH_AT91RM9200DK) += board-dk.o
#obj-$(CONFIG_MACH_AT91RM9200EK) += board-ek.o obj-$(CONFIG_MACH_AT91RM9200EK) += board-ek.o
#obj-$(CONFIG_MACH_CSB337) += board-csb337.o obj-$(CONFIG_MACH_CSB337) += board-csb337.o
#obj-$(CONFIG_MACH_CSB637) += board-csb637.o obj-$(CONFIG_MACH_CSB637) += board-csb637.o
#obj-$(CONFIG_MACH_CARMEVA) += board-carmeva.o #obj-$(CONFIG_MACH_CARMEVA) += board-carmeva.o
#obj-$(CONFIG_MACH_KB9200) += board-kb9202.o #obj-$(CONFIG_MACH_KB9200) += board-kb9202.o
......
/*
* linux/arch/arm/mach-at91rm9200/board-csb337.c
*
* Copyright (C) 2005 SAN People
*
* 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, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <linux/config.h>
#include <linux/types.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <asm/hardware.h>
#include <asm/setup.h>
#include <asm/mach-types.h>
#include <asm/irq.h>
#include <asm/mach/arch.h>
#include <asm/mach/map.h>
#include <asm/mach/irq.h>
#include <asm/arch/hardware.h>
#include <asm/mach/serial_at91rm9200.h>
#include <asm/arch/board.h>
#include "generic.h"
static void __init csb337_init_irq(void)
{
/* Initialize AIC controller */
at91rm9200_init_irq(NULL);
/* Set up the GPIO interrupts */
at91_gpio_irq_setup(BGA_GPIO_BANKS);
}
/*
* Serial port configuration.
* 0 .. 3 = USART0 .. USART3
* 4 = DBGU
*/
#define CSB337_UART_MAP { 4, 1, -1, -1, -1 } /* ttyS0, ..., ttyS4 */
#define CSB337_SERIAL_CONSOLE 0 /* ttyS0 */
static void __init csb337_map_io(void)
{
int serial[AT91_NR_UART] = CSB337_UART_MAP;
int i;
at91rm9200_map_io();
/* Initialize clocks: 3.6864 MHz crystal */
at91_clock_init(3686400);
#ifdef CONFIG_SERIAL_AT91
at91_console_port = CSB337_SERIAL_CONSOLE;
memcpy(at91_serial_map, serial, sizeof(serial));
/* Register UARTs */
for (i = 0; i < AT91_NR_UART; i++) {
if (serial[i] >= 0)
at91_register_uart(i, serial[i]);
}
#endif
}
static struct at91_eth_data __initdata csb337_eth_data = {
.phy_irq_pin = AT91_PIN_PC2,
.is_rmii = 0,
};
static struct at91_usbh_data __initdata csb337_usbh_data = {
.ports = 2,
};
static struct at91_udc_data __initdata csb337_udc_data = {
// this has no VBUS sensing pin
.pullup_pin = AT91_PIN_PA24,
};
static struct at91_cf_data __initdata csb337_cf_data = {
/*
* connector P4 on the CSB 337 mates to
* connector P8 on the CSB 300CF
*/
/* CSB337 specific */
.det_pin = AT91_PIN_PC3,
/* CSB300CF specific */
.irq_pin = AT91_PIN_PA19,
.vcc_pin = AT91_PIN_PD0,
.rst_pin = AT91_PIN_PD2,
};
static struct at91_mmc_data __initdata csb337_mmc_data = {
.det_pin = AT91_PIN_PD5,
.is_b = 0,
.wire4 = 1,
.wp_pin = AT91_PIN_PD6,
};
static void __init csb337_board_init(void)
{
/* Ethernet */
at91_add_device_eth(&csb337_eth_data);
/* USB Host */
at91_add_device_usbh(&csb337_usbh_data);
/* USB Device */
at91_add_device_udc(&csb337_udc_data);
/* Compact Flash */
at91_set_gpio_input(AT91_PIN_PB22, 1); /* IOIS16 */
at91_add_device_cf(&csb337_cf_data);
/* MMC */
at91_add_device_mmc(&csb337_mmc_data);
}
MACHINE_START(CSB337, "Cogent CSB337")
/* Maintainer: Bill Gatliff */
.phys_ram = AT91_SDRAM_BASE,
.phys_io = AT91_BASE_SYS,
.io_pg_offst = (AT91_VA_BASE_SYS >> 18) & 0xfffc,
.boot_params = AT91_SDRAM_BASE + 0x100,
.timer = &at91rm9200_timer,
.map_io = csb337_map_io,
.init_irq = csb337_init_irq,
.init_machine = csb337_board_init,
MACHINE_END
/*
* linux/arch/arm/mach-at91rm9200/board-csb637.c
*
* Copyright (C) 2005 SAN People
*
* 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, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <linux/config.h>
#include <linux/types.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <asm/hardware.h>
#include <asm/setup.h>
#include <asm/mach-types.h>
#include <asm/irq.h>
#include <asm/mach/arch.h>
#include <asm/mach/map.h>
#include <asm/mach/irq.h>
#include <asm/arch/hardware.h>
#include <asm/mach/serial_at91rm9200.h>
#include <asm/arch/board.h>
#include "generic.h"
static void __init csb637_init_irq(void)
{
/* Initialize AIC controller */
at91rm9200_init_irq(NULL);
/* Set up the GPIO interrupts */
at91_gpio_irq_setup(BGA_GPIO_BANKS);
}
/*
* Serial port configuration.
* 0 .. 3 = USART0 .. USART3
* 4 = DBGU
*/
#define CSB637_UART_MAP { 4, 1, -1, -1, -1 } /* ttyS0, ..., ttyS4 */
#define CSB637_SERIAL_CONSOLE 0 /* ttyS0 */
static void __init csb637_map_io(void)
{
int serial[AT91_NR_UART] = CSB637_UART_MAP;
int i;
at91rm9200_map_io();
/* Initialize clocks: 3.6864 MHz crystal */
at91_clock_init(3686400);
#ifdef CONFIG_SERIAL_AT91
at91_console_port = CSB637_SERIAL_CONSOLE;
memcpy(at91_serial_map, serial, sizeof(serial));
/* Register UARTs */
for (i = 0; i < AT91_NR_UART; i++) {
if (serial[i] >= 0)
at91_register_uart(i, serial[i]);
}
#endif
}
static struct at91_eth_data __initdata csb637_eth_data = {
.phy_irq_pin = AT91_PIN_PC0,
.is_rmii = 0,
};
static struct at91_usbh_data __initdata csb637_usbh_data = {
.ports = 2,
};
static struct at91_udc_data __initdata csb637_udc_data = {
.vbus_pin = AT91_PIN_PB28,
.pullup_pin = AT91_PIN_PB1,
};
static void __init csb637_board_init(void)
{
/* Ethernet */
at91_add_device_eth(&csb637_eth_data);
/* USB Host */
at91_add_device_usbh(&csb637_usbh_data);
/* USB Device */
at91_add_device_udc(&csb637_udc_data);
}
MACHINE_START(CSB637, "Cogent CSB637")
/* Maintainer: Bill Gatliff */
.phys_ram = AT91_SDRAM_BASE,
.phys_io = AT91_BASE_SYS,
.io_pg_offst = (AT91_VA_BASE_SYS >> 18) & 0xfffc,
.boot_params = AT91_SDRAM_BASE + 0x100,
.timer = &at91rm9200_timer,
.map_io = csb637_map_io,
.init_irq = csb637_init_irq,
.init_machine = csb637_board_init,
MACHINE_END
This diff is collapsed.
This diff is collapsed.
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <linux/err.h> #include <linux/err.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/mutex.h>
#include <asm/semaphore.h> #include <asm/semaphore.h>
#include <asm/hardware/icst525.h> #include <asm/hardware/icst525.h>
...@@ -22,20 +23,20 @@ ...@@ -22,20 +23,20 @@
#include "clock.h" #include "clock.h"
static LIST_HEAD(clocks); static LIST_HEAD(clocks);
static DECLARE_MUTEX(clocks_sem); static DEFINE_MUTEX(clocks_mutex);
struct clk *clk_get(struct device *dev, const char *id) struct clk *clk_get(struct device *dev, const char *id)
{ {
struct clk *p, *clk = ERR_PTR(-ENOENT); struct clk *p, *clk = ERR_PTR(-ENOENT);
down(&clocks_sem); mutex_lock(&clocks_mutex);
list_for_each_entry(p, &clocks, node) { list_for_each_entry(p, &clocks, node) {
if (strcmp(id, p->name) == 0 && try_module_get(p->owner)) { if (strcmp(id, p->name) == 0 && try_module_get(p->owner)) {
clk = p; clk = p;
break; break;
} }
} }
up(&clocks_sem); mutex_unlock(&clocks_mutex);
return clk; return clk;
} }
...@@ -107,18 +108,18 @@ static struct clk uart_clk = { ...@@ -107,18 +108,18 @@ static struct clk uart_clk = {
int clk_register(struct clk *clk) int clk_register(struct clk *clk)
{ {
down(&clocks_sem); mutex_lock(&clocks_mutex);
list_add(&clk->node, &clocks); list_add(&clk->node, &clocks);
up(&clocks_sem); mutex_unlock(&clocks_mutex);
return 0; return 0;
} }
EXPORT_SYMBOL(clk_register); EXPORT_SYMBOL(clk_register);
void clk_unregister(struct clk *clk) void clk_unregister(struct clk *clk)
{ {
down(&clocks_sem); mutex_lock(&clocks_mutex);
list_del(&clk->node); list_del(&clk->node);
up(&clocks_sem); mutex_unlock(&clocks_mutex);
} }
EXPORT_SYMBOL(clk_unregister); EXPORT_SYMBOL(clk_unregister);
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -899,6 +899,12 @@ static int i2c_pxa_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num ...@@ -899,6 +899,12 @@ static int i2c_pxa_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num
struct pxa_i2c *i2c = adap->algo_data; struct pxa_i2c *i2c = adap->algo_data;
int ret, i; int ret, i;
/* If the I2C controller is disabled we need to reset it (probably due
to a suspend/resume destroying state). We do this here as we can then
avoid worrying about resuming the controller before its users. */
if (!(ICR & ICR_IUE))
i2c_pxa_reset(i2c);
for (i = adap->retries; i >= 0; i--) { for (i = adap->retries; i >= 0; i--) {
ret = i2c_pxa_do_xfer(i2c, msgs, num); ret = i2c_pxa_do_xfer(i2c, msgs, num);
if (ret != I2C_RETRY) if (ret != I2C_RETRY)
...@@ -939,7 +945,9 @@ static struct pxa_i2c i2c_pxa = { ...@@ -939,7 +945,9 @@ static struct pxa_i2c i2c_pxa = {
static int i2c_pxa_probe(struct platform_device *dev) static int i2c_pxa_probe(struct platform_device *dev)
{ {
struct pxa_i2c *i2c = &i2c_pxa; struct pxa_i2c *i2c = &i2c_pxa;
#ifdef CONFIG_I2C_PXA_SLAVE
struct i2c_pxa_platform_data *plat = dev->dev.platform_data; struct i2c_pxa_platform_data *plat = dev->dev.platform_data;
#endif
int ret; int ret;
#ifdef CONFIG_PXA27x #ifdef CONFIG_PXA27x
...@@ -1024,5 +1032,7 @@ static void i2c_adap_pxa_exit(void) ...@@ -1024,5 +1032,7 @@ static void i2c_adap_pxa_exit(void)
return platform_driver_unregister(&i2c_pxa_driver); return platform_driver_unregister(&i2c_pxa_driver);
} }
MODULE_LICENSE("GPL");
module_init(i2c_adap_pxa_init); module_init(i2c_adap_pxa_init);
module_exit(i2c_adap_pxa_exit); module_exit(i2c_adap_pxa_exit);
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -56,3 +56,4 @@ obj-$(CONFIG_SERIAL_JSM) += jsm/ ...@@ -56,3 +56,4 @@ obj-$(CONFIG_SERIAL_JSM) += jsm/
obj-$(CONFIG_SERIAL_TXX9) += serial_txx9.o obj-$(CONFIG_SERIAL_TXX9) += serial_txx9.o
obj-$(CONFIG_SERIAL_VR41XX) += vr41xx_siu.o obj-$(CONFIG_SERIAL_VR41XX) += vr41xx_siu.o
obj-$(CONFIG_SERIAL_SGI_IOC4) += ioc4_serial.o obj-$(CONFIG_SERIAL_SGI_IOC4) += ioc4_serial.o
obj-$(CONFIG_SERIAL_AT91) += at91_serial.o
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