Commit e6944202 authored by Linus Torvalds's avatar Linus Torvalds

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

* master.kernel.org:/home/rmk/linux-2.6-arm:
  [ARM] 3762/1: Fix ptrace cache coherency bug for ARM1136 VIPT nonaliasing Harvard caches
  [ARM] 3765/1: S3C24XX: cleanup include/asm-arm/arch-s3c2410/dma.h
  [ARM] 3764/1: S3C24XX: change type naming to kernel style
  [ARM] 3763/1: add both rtcs to csb337 defconfig
  [ARM] Fix ARM __raw_read_trylock() implementation
  [ARM] 3750/3: Fix double VFP emulation for EABI kernels
parents 3b6362b8 a188ad2b
...@@ -621,9 +621,8 @@ CONFIG_AT91_WATCHDOG=y ...@@ -621,9 +621,8 @@ CONFIG_AT91_WATCHDOG=y
# USB-based Watchdog Cards # USB-based Watchdog Cards
# #
# CONFIG_USBPCWATCHDOG is not set # CONFIG_USBPCWATCHDOG is not set
# CONFIG_HW_RANDOM is not set
# CONFIG_NVRAM is not set # CONFIG_NVRAM is not set
CONFIG_RTC=y
# CONFIG_AT91_RTC is not set
# CONFIG_DTLK is not set # CONFIG_DTLK is not set
# CONFIG_R3964 is not set # CONFIG_R3964 is not set
...@@ -956,9 +955,41 @@ CONFIG_USB_AT91=y ...@@ -956,9 +955,41 @@ CONFIG_USB_AT91=y
CONFIG_MMC=y CONFIG_MMC=y
# CONFIG_MMC_DEBUG is not set # CONFIG_MMC_DEBUG is not set
CONFIG_MMC_BLOCK=y CONFIG_MMC_BLOCK=y
# CONFIG_MMC_WBSD is not set
CONFIG_MMC_AT91RM9200=y CONFIG_MMC_AT91RM9200=y
#
# Real Time Clock
#
CONFIG_RTC_LIB=y
CONFIG_RTC_CLASS=y
CONFIG_RTC_HCTOSYS=y
CONFIG_RTC_HCTOSYS_DEVICE="rtc1"
#
# RTC interfaces
#
# CONFIG_RTC_INTF_SYSFS is not set
CONFIG_RTC_INTF_PROC=y
CONFIG_RTC_INTF_DEV=y
# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
#
# RTC drivers
#
# CONFIG_RTC_DRV_X1205 is not set
CONFIG_RTC_DRV_DS1307=y
# CONFIG_RTC_DRV_DS1553 is not set
# CONFIG_RTC_DRV_ISL1208 is not set
# CONFIG_RTC_DRV_DS1672 is not set
# CONFIG_RTC_DRV_DS1742 is not set
# CONFIG_RTC_DRV_PCF8563 is not set
# CONFIG_RTC_DRV_PCF8583 is not set
# CONFIG_RTC_DRV_RS5C372 is not set
# CONFIG_RTC_DRV_M48T86 is not set
CONFIG_RTC_DRV_AT91=y
# CONFIG_RTC_DRV_TEST is not set
# CONFIG_RTC_DRV_V3020 is not set
# #
# File systems # File systems
# #
......
This diff is collapsed.
...@@ -87,6 +87,32 @@ void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsig ...@@ -87,6 +87,32 @@ void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsig
if (cache_is_vipt_aliasing()) if (cache_is_vipt_aliasing())
flush_pfn_alias(pfn, user_addr); flush_pfn_alias(pfn, user_addr);
} }
void flush_ptrace_access(struct vm_area_struct *vma, struct page *page,
unsigned long uaddr, void *kaddr,
unsigned long len, int write)
{
if (cache_is_vivt()) {
if (cpu_isset(smp_processor_id(), vma->vm_mm->cpu_vm_mask)) {
unsigned long addr = (unsigned long)kaddr;
__cpuc_coherent_kern_range(addr, addr + len);
}
return;
}
if (cache_is_vipt_aliasing()) {
flush_pfn_alias(page_to_pfn(page), uaddr);
return;
}
/* VIPT non-aliasing cache */
if (cpu_isset(smp_processor_id(), vma->vm_mm->cpu_vm_mask) &&
vma->vm_flags | VM_EXEC) {
unsigned long addr = (unsigned long)kaddr;
/* only flushing the kernel mapping on non-aliasing VIPT */
__cpuc_coherent_kern_range(addr, addr + len);
}
}
#else #else
#define flush_pfn_alias(pfn,vaddr) do { } while (0) #define flush_pfn_alias(pfn,vaddr) do { } while (0)
#endif #endif
......
...@@ -156,7 +156,7 @@ struct vfp_single { ...@@ -156,7 +156,7 @@ struct vfp_single {
}; };
extern s32 vfp_get_float(unsigned int reg); extern s32 vfp_get_float(unsigned int reg);
extern void vfp_put_float(unsigned int reg, s32 val); extern void vfp_put_float(s32 val, unsigned int reg);
/* /*
* VFP_SINGLE_MANTISSA_BITS - number of bits in the mantissa * VFP_SINGLE_MANTISSA_BITS - number of bits in the mantissa
...@@ -267,7 +267,7 @@ struct vfp_double { ...@@ -267,7 +267,7 @@ struct vfp_double {
*/ */
#define VFP_REG_ZERO 16 #define VFP_REG_ZERO 16
extern u64 vfp_get_double(unsigned int reg); extern u64 vfp_get_double(unsigned int reg);
extern void vfp_put_double(unsigned int reg, u64 val); extern void vfp_put_double(u64 val, unsigned int reg);
#define VFP_DOUBLE_MANTISSA_BITS (52) #define VFP_DOUBLE_MANTISSA_BITS (52)
#define VFP_DOUBLE_EXPONENT_BITS (11) #define VFP_DOUBLE_EXPONENT_BITS (11)
...@@ -341,12 +341,6 @@ static inline int vfp_double_type(struct vfp_double *s) ...@@ -341,12 +341,6 @@ static inline int vfp_double_type(struct vfp_double *s)
u32 vfp_double_normaliseround(int dd, struct vfp_double *vd, u32 fpscr, u32 exceptions, const char *func); u32 vfp_double_normaliseround(int dd, struct vfp_double *vd, u32 fpscr, u32 exceptions, const char *func);
/*
* System registers
*/
extern u32 vfp_get_sys(unsigned int reg);
extern void vfp_put_sys(unsigned int reg, u32 val);
u32 vfp_estimate_sqrt_significand(u32 exponent, u32 significand); u32 vfp_estimate_sqrt_significand(u32 exponent, u32 significand);
/* /*
......
...@@ -195,7 +195,7 @@ u32 vfp_double_normaliseround(int dd, struct vfp_double *vd, u32 fpscr, u32 exce ...@@ -195,7 +195,7 @@ u32 vfp_double_normaliseround(int dd, struct vfp_double *vd, u32 fpscr, u32 exce
s64 d = vfp_double_pack(vd); s64 d = vfp_double_pack(vd);
pr_debug("VFP: %s: d(d%d)=%016llx exceptions=%08x\n", func, pr_debug("VFP: %s: d(d%d)=%016llx exceptions=%08x\n", func,
dd, d, exceptions); dd, d, exceptions);
vfp_put_double(dd, d); vfp_put_double(d, dd);
} }
return exceptions; return exceptions;
} }
...@@ -250,19 +250,19 @@ vfp_propagate_nan(struct vfp_double *vdd, struct vfp_double *vdn, ...@@ -250,19 +250,19 @@ vfp_propagate_nan(struct vfp_double *vdd, struct vfp_double *vdn,
*/ */
static u32 vfp_double_fabs(int dd, int unused, int dm, u32 fpscr) static u32 vfp_double_fabs(int dd, int unused, int dm, u32 fpscr)
{ {
vfp_put_double(dd, vfp_double_packed_abs(vfp_get_double(dm))); vfp_put_double(vfp_double_packed_abs(vfp_get_double(dm)), dd);
return 0; return 0;
} }
static u32 vfp_double_fcpy(int dd, int unused, int dm, u32 fpscr) static u32 vfp_double_fcpy(int dd, int unused, int dm, u32 fpscr)
{ {
vfp_put_double(dd, vfp_get_double(dm)); vfp_put_double(vfp_get_double(dm), dd);
return 0; return 0;
} }
static u32 vfp_double_fneg(int dd, int unused, int dm, u32 fpscr) static u32 vfp_double_fneg(int dd, int unused, int dm, u32 fpscr)
{ {
vfp_put_double(dd, vfp_double_packed_negate(vfp_get_double(dm))); vfp_put_double(vfp_double_packed_negate(vfp_get_double(dm)), dd);
return 0; return 0;
} }
...@@ -287,7 +287,7 @@ static u32 vfp_double_fsqrt(int dd, int unused, int dm, u32 fpscr) ...@@ -287,7 +287,7 @@ static u32 vfp_double_fsqrt(int dd, int unused, int dm, u32 fpscr)
vdp = &vfp_double_default_qnan; vdp = &vfp_double_default_qnan;
ret = FPSCR_IOC; ret = FPSCR_IOC;
} }
vfp_put_double(dd, vfp_double_pack(vdp)); vfp_put_double(vfp_double_pack(vdp), dd);
return ret; return ret;
} }
...@@ -476,7 +476,7 @@ static u32 vfp_double_fcvts(int sd, int unused, int dm, u32 fpscr) ...@@ -476,7 +476,7 @@ static u32 vfp_double_fcvts(int sd, int unused, int dm, u32 fpscr)
return vfp_single_normaliseround(sd, &vsd, fpscr, exceptions, "fcvts"); return vfp_single_normaliseround(sd, &vsd, fpscr, exceptions, "fcvts");
pack_nan: pack_nan:
vfp_put_float(sd, vfp_single_pack(&vsd)); vfp_put_float(vfp_single_pack(&vsd), sd);
return exceptions; return exceptions;
} }
...@@ -573,7 +573,7 @@ static u32 vfp_double_ftoui(int sd, int unused, int dm, u32 fpscr) ...@@ -573,7 +573,7 @@ static u32 vfp_double_ftoui(int sd, int unused, int dm, u32 fpscr)
pr_debug("VFP: ftoui: d(s%d)=%08x exceptions=%08x\n", sd, d, exceptions); pr_debug("VFP: ftoui: d(s%d)=%08x exceptions=%08x\n", sd, d, exceptions);
vfp_put_float(sd, d); vfp_put_float(d, sd);
return exceptions; return exceptions;
} }
...@@ -648,7 +648,7 @@ static u32 vfp_double_ftosi(int sd, int unused, int dm, u32 fpscr) ...@@ -648,7 +648,7 @@ static u32 vfp_double_ftosi(int sd, int unused, int dm, u32 fpscr)
pr_debug("VFP: ftosi: d(s%d)=%08x exceptions=%08x\n", sd, d, exceptions); pr_debug("VFP: ftosi: d(s%d)=%08x exceptions=%08x\n", sd, d, exceptions);
vfp_put_float(sd, (s32)d); vfp_put_float((s32)d, sd);
return exceptions; return exceptions;
} }
...@@ -1084,7 +1084,7 @@ static u32 vfp_double_fdiv(int dd, int dn, int dm, u32 fpscr) ...@@ -1084,7 +1084,7 @@ static u32 vfp_double_fdiv(int dd, int dn, int dm, u32 fpscr)
vdn_nan: vdn_nan:
exceptions = vfp_propagate_nan(&vdd, &vdn, &vdm, fpscr); exceptions = vfp_propagate_nan(&vdd, &vdn, &vdm, fpscr);
pack: pack:
vfp_put_double(dd, vfp_double_pack(&vdd)); vfp_put_double(vfp_double_pack(&vdd), dd);
return exceptions; return exceptions;
vdm_nan: vdm_nan:
...@@ -1104,7 +1104,7 @@ static u32 vfp_double_fdiv(int dd, int dn, int dm, u32 fpscr) ...@@ -1104,7 +1104,7 @@ static u32 vfp_double_fdiv(int dd, int dn, int dm, u32 fpscr)
goto pack; goto pack;
invalid: invalid:
vfp_put_double(dd, vfp_double_pack(&vfp_double_default_qnan)); vfp_put_double(vfp_double_pack(&vfp_double_default_qnan), dd);
return FPSCR_IOC; return FPSCR_IOC;
} }
......
...@@ -178,12 +178,12 @@ vfp_get_float: ...@@ -178,12 +178,12 @@ vfp_get_float:
.globl vfp_put_float .globl vfp_put_float
vfp_put_float: vfp_put_float:
add pc, pc, r0, lsl #3 add pc, pc, r1, lsl #3
mov r0, r0 mov r0, r0
.irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 .irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
mcr p10, 0, r1, c\dr, c0, 0 @ fmsr r0, s0 mcr p10, 0, r0, c\dr, c0, 0 @ fmsr r0, s0
mov pc, lr mov pc, lr
mcr p10, 0, r1, c\dr, c0, 4 @ fmsr r0, s1 mcr p10, 0, r0, c\dr, c0, 4 @ fmsr r0, s1
mov pc, lr mov pc, lr
.endr .endr
...@@ -203,9 +203,9 @@ vfp_get_double: ...@@ -203,9 +203,9 @@ vfp_get_double:
.globl vfp_put_double .globl vfp_put_double
vfp_put_double: vfp_put_double:
add pc, pc, r0, lsl #3 add pc, pc, r2, lsl #3
mov r0, r0 mov r0, r0
.irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 .irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
fmdrr d\dr, r1, r2 fmdrr d\dr, r0, r1
mov pc, lr mov pc, lr
.endr .endr
...@@ -200,7 +200,7 @@ u32 vfp_single_normaliseround(int sd, struct vfp_single *vs, u32 fpscr, u32 exce ...@@ -200,7 +200,7 @@ u32 vfp_single_normaliseround(int sd, struct vfp_single *vs, u32 fpscr, u32 exce
s32 d = vfp_single_pack(vs); s32 d = vfp_single_pack(vs);
pr_debug("VFP: %s: d(s%d)=%08x exceptions=%08x\n", func, pr_debug("VFP: %s: d(s%d)=%08x exceptions=%08x\n", func,
sd, d, exceptions); sd, d, exceptions);
vfp_put_float(sd, d); vfp_put_float(d, sd);
} }
return exceptions; return exceptions;
...@@ -257,19 +257,19 @@ vfp_propagate_nan(struct vfp_single *vsd, struct vfp_single *vsn, ...@@ -257,19 +257,19 @@ vfp_propagate_nan(struct vfp_single *vsd, struct vfp_single *vsn,
*/ */
static u32 vfp_single_fabs(int sd, int unused, s32 m, u32 fpscr) static u32 vfp_single_fabs(int sd, int unused, s32 m, u32 fpscr)
{ {
vfp_put_float(sd, vfp_single_packed_abs(m)); vfp_put_float(vfp_single_packed_abs(m), sd);
return 0; return 0;
} }
static u32 vfp_single_fcpy(int sd, int unused, s32 m, u32 fpscr) static u32 vfp_single_fcpy(int sd, int unused, s32 m, u32 fpscr)
{ {
vfp_put_float(sd, m); vfp_put_float(m, sd);
return 0; return 0;
} }
static u32 vfp_single_fneg(int sd, int unused, s32 m, u32 fpscr) static u32 vfp_single_fneg(int sd, int unused, s32 m, u32 fpscr)
{ {
vfp_put_float(sd, vfp_single_packed_negate(m)); vfp_put_float(vfp_single_packed_negate(m), sd);
return 0; return 0;
} }
...@@ -333,7 +333,7 @@ static u32 vfp_single_fsqrt(int sd, int unused, s32 m, u32 fpscr) ...@@ -333,7 +333,7 @@ static u32 vfp_single_fsqrt(int sd, int unused, s32 m, u32 fpscr)
vsp = &vfp_single_default_qnan; vsp = &vfp_single_default_qnan;
ret = FPSCR_IOC; ret = FPSCR_IOC;
} }
vfp_put_float(sd, vfp_single_pack(vsp)); vfp_put_float(vfp_single_pack(vsp), sd);
return ret; return ret;
} }
...@@ -517,7 +517,7 @@ static u32 vfp_single_fcvtd(int dd, int unused, s32 m, u32 fpscr) ...@@ -517,7 +517,7 @@ static u32 vfp_single_fcvtd(int dd, int unused, s32 m, u32 fpscr)
return vfp_double_normaliseround(dd, &vdd, fpscr, exceptions, "fcvtd"); return vfp_double_normaliseround(dd, &vdd, fpscr, exceptions, "fcvtd");
pack_nan: pack_nan:
vfp_put_double(dd, vfp_double_pack(&vdd)); vfp_put_double(vfp_double_pack(&vdd), dd);
return exceptions; return exceptions;
} }
...@@ -613,7 +613,7 @@ static u32 vfp_single_ftoui(int sd, int unused, s32 m, u32 fpscr) ...@@ -613,7 +613,7 @@ static u32 vfp_single_ftoui(int sd, int unused, s32 m, u32 fpscr)
pr_debug("VFP: ftoui: d(s%d)=%08x exceptions=%08x\n", sd, d, exceptions); pr_debug("VFP: ftoui: d(s%d)=%08x exceptions=%08x\n", sd, d, exceptions);
vfp_put_float(sd, d); vfp_put_float(d, sd);
return exceptions; return exceptions;
} }
...@@ -692,7 +692,7 @@ static u32 vfp_single_ftosi(int sd, int unused, s32 m, u32 fpscr) ...@@ -692,7 +692,7 @@ static u32 vfp_single_ftosi(int sd, int unused, s32 m, u32 fpscr)
pr_debug("VFP: ftosi: d(s%d)=%08x exceptions=%08x\n", sd, d, exceptions); pr_debug("VFP: ftosi: d(s%d)=%08x exceptions=%08x\n", sd, d, exceptions);
vfp_put_float(sd, (s32)d); vfp_put_float((s32)d, sd);
return exceptions; return exceptions;
} }
...@@ -1127,7 +1127,7 @@ static u32 vfp_single_fdiv(int sd, int sn, s32 m, u32 fpscr) ...@@ -1127,7 +1127,7 @@ static u32 vfp_single_fdiv(int sd, int sn, s32 m, u32 fpscr)
vsn_nan: vsn_nan:
exceptions = vfp_propagate_nan(&vsd, &vsn, &vsm, fpscr); exceptions = vfp_propagate_nan(&vsd, &vsn, &vsm, fpscr);
pack: pack:
vfp_put_float(sd, vfp_single_pack(&vsd)); vfp_put_float(vfp_single_pack(&vsd), sd);
return exceptions; return exceptions;
vsm_nan: vsm_nan:
...@@ -1147,7 +1147,7 @@ static u32 vfp_single_fdiv(int sd, int sn, s32 m, u32 fpscr) ...@@ -1147,7 +1147,7 @@ static u32 vfp_single_fdiv(int sd, int sn, s32 m, u32 fpscr)
goto pack; goto pack;
invalid: invalid:
vfp_put_float(sd, vfp_single_pack(&vfp_single_default_qnan)); vfp_put_float(vfp_single_pack(&vfp_single_default_qnan), sd);
return FPSCR_IOC; return FPSCR_IOC;
} }
......
/* linux/include/asm-arm/arch-bast/dma.h /* linux/include/asm-arm/arch-s3c2410/dma.h
* *
* Copyright (C) 2003,2004 Simtec Electronics * Copyright (C) 2003,2004,2006 Simtec Electronics
* Ben Dooks <ben@simtec.co.uk> * Ben Dooks <ben@simtec.co.uk>
* *
* Samsung S3C2410X DMA support * Samsung S3C241XX DMA support
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as * it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation. * published by the Free Software Foundation.
*
* Changelog:
* ??-May-2003 BJD Created file
* ??-Jun-2003 BJD Added more dma functionality to go with arch
* 10-Nov-2004 BJD Added sys_device support
*/ */
#ifndef __ASM_ARCH_DMA_H #ifndef __ASM_ARCH_DMA_H
...@@ -21,28 +16,26 @@ ...@@ -21,28 +16,26 @@
#include <linux/sysdev.h> #include <linux/sysdev.h>
#include "hardware.h" #include "hardware.h"
/* /*
* This is the maximum DMA address(physical address) that can be DMAd to. * This is the maximum DMA address(physical address) that can be DMAd to.
* *
*/ */
#define MAX_DMA_ADDRESS 0x20000000 #define MAX_DMA_ADDRESS 0x40000000
#define MAX_DMA_TRANSFER_SIZE 0x100000 /* Data Unit is half word */ #define MAX_DMA_TRANSFER_SIZE 0x100000 /* Data Unit is half word */
/* we have 4 dma channels */ /* we have 4 dma channels */
#define S3C2410_DMA_CHANNELS (4) #define S3C2410_DMA_CHANNELS (4)
/* types */ /* types */
typedef enum { enum s3c2410_dma_state {
S3C2410_DMA_IDLE, S3C2410_DMA_IDLE,
S3C2410_DMA_RUNNING, S3C2410_DMA_RUNNING,
S3C2410_DMA_PAUSED S3C2410_DMA_PAUSED
} s3c2410_dma_state_t; };
/* s3c2410_dma_loadst_t /* enum s3c2410_dma_loadst
* *
* This represents the state of the DMA engine, wrt to the loaded / running * This represents the state of the DMA engine, wrt to the loaded / running
* transfers. Since we don't have any way of knowing exactly the state of * transfers. Since we don't have any way of knowing exactly the state of
...@@ -70,45 +63,40 @@ typedef enum { ...@@ -70,45 +63,40 @@ typedef enum {
* currently running. * currently running.
*/ */
typedef enum { enum s3c2410_dma_loadst {
S3C2410_DMALOAD_NONE, S3C2410_DMALOAD_NONE,
S3C2410_DMALOAD_1LOADED, S3C2410_DMALOAD_1LOADED,
S3C2410_DMALOAD_1RUNNING, S3C2410_DMALOAD_1RUNNING,
S3C2410_DMALOAD_1LOADED_1RUNNING, S3C2410_DMALOAD_1LOADED_1RUNNING,
} s3c2410_dma_loadst_t; };
typedef enum { enum s3c2410_dma_buffresult {
S3C2410_RES_OK, S3C2410_RES_OK,
S3C2410_RES_ERR, S3C2410_RES_ERR,
S3C2410_RES_ABORT S3C2410_RES_ABORT
} s3c2410_dma_buffresult_t; };
typedef enum s3c2410_dmasrc_e s3c2410_dmasrc_t;
enum s3c2410_dmasrc_e { enum s3c2410_dmasrc {
S3C2410_DMASRC_HW, /* source is memory */ S3C2410_DMASRC_HW, /* source is memory */
S3C2410_DMASRC_MEM /* source is hardware */ S3C2410_DMASRC_MEM /* source is hardware */
}; };
/* enum s3c2410_chan_op_e /* enum s3c2410_chan_op
* *
* operation codes passed to the DMA code by the user, and also used * operation codes passed to the DMA code by the user, and also used
* to inform the current channel owner of any changes to the system state * to inform the current channel owner of any changes to the system state
*/ */
enum s3c2410_chan_op_e { enum s3c2410_chan_op {
S3C2410_DMAOP_START, S3C2410_DMAOP_START,
S3C2410_DMAOP_STOP, S3C2410_DMAOP_STOP,
S3C2410_DMAOP_PAUSE, S3C2410_DMAOP_PAUSE,
S3C2410_DMAOP_RESUME, S3C2410_DMAOP_RESUME,
S3C2410_DMAOP_FLUSH, S3C2410_DMAOP_FLUSH,
S3C2410_DMAOP_TIMEOUT, /* internal signal to handler */ S3C2410_DMAOP_TIMEOUT, /* internal signal to handler */
S3C2410_DMAOP_STARTED, /* indicate channel started */ S3C2410_DMAOP_STARTED, /* indicate channel started */
}; };
typedef enum s3c2410_chan_op_e s3c2410_chan_op_t;
/* flags */ /* flags */
#define S3C2410_DMAF_SLOW (1<<0) /* slow, so don't worry about #define S3C2410_DMAF_SLOW (1<<0) /* slow, so don't worry about
...@@ -117,104 +105,100 @@ typedef enum s3c2410_chan_op_e s3c2410_chan_op_t; ...@@ -117,104 +105,100 @@ typedef enum s3c2410_chan_op_e s3c2410_chan_op_t;
/* dma buffer */ /* dma buffer */
typedef struct s3c2410_dma_buf_s s3c2410_dma_buf_t;
struct s3c2410_dma_client { struct s3c2410_dma_client {
char *name; char *name;
}; };
typedef struct s3c2410_dma_client s3c2410_dma_client_t;
/* s3c2410_dma_buf_s /* s3c2410_dma_buf_s
* *
* internally used buffer structure to describe a queued or running * internally used buffer structure to describe a queued or running
* buffer. * buffer.
*/ */
struct s3c2410_dma_buf_s { struct s3c2410_dma_buf;
s3c2410_dma_buf_t *next; struct s3c2410_dma_buf {
int magic; /* magic */ struct s3c2410_dma_buf *next;
int size; /* buffer size in bytes */ int magic; /* magic */
dma_addr_t data; /* start of DMA data */ int size; /* buffer size in bytes */
dma_addr_t ptr; /* where the DMA got to [1] */ dma_addr_t data; /* start of DMA data */
void *id; /* client's id */ dma_addr_t ptr; /* where the DMA got to [1] */
void *id; /* client's id */
}; };
/* [1] is this updated for both recv/send modes? */ /* [1] is this updated for both recv/send modes? */
typedef struct s3c2410_dma_chan_s s3c2410_dma_chan_t; struct s3c2410_dma_chan;
/* s3c2410_dma_cbfn_t /* s3c2410_dma_cbfn_t
* *
* buffer callback routine type * buffer callback routine type
*/ */
typedef void (*s3c2410_dma_cbfn_t)(s3c2410_dma_chan_t *, void *buf, int size, typedef void (*s3c2410_dma_cbfn_t)(struct s3c2410_dma_chan *,
s3c2410_dma_buffresult_t result); void *buf, int size,
enum s3c2410_dma_buffresult result);
typedef int (*s3c2410_dma_opfn_t)(s3c2410_dma_chan_t *, typedef int (*s3c2410_dma_opfn_t)(struct s3c2410_dma_chan *,
s3c2410_chan_op_t ); enum s3c2410_chan_op );
struct s3c2410_dma_stats_s { struct s3c2410_dma_stats {
unsigned long loads; unsigned long loads;
unsigned long timeout_longest; unsigned long timeout_longest;
unsigned long timeout_shortest; unsigned long timeout_shortest;
unsigned long timeout_avg; unsigned long timeout_avg;
unsigned long timeout_failed; unsigned long timeout_failed;
}; };
typedef struct s3c2410_dma_stats_s s3c2410_dma_stats_t; /* struct s3c2410_dma_chan
/* struct s3c2410_dma_chan_s
* *
* full state information for each DMA channel * full state information for each DMA channel
*/ */
struct s3c2410_dma_chan_s { struct s3c2410_dma_chan {
/* channel state flags and information */ /* channel state flags and information */
unsigned char number; /* number of this dma channel */ unsigned char number; /* number of this dma channel */
unsigned char in_use; /* channel allocated */ unsigned char in_use; /* channel allocated */
unsigned char irq_claimed; /* irq claimed for channel */ unsigned char irq_claimed; /* irq claimed for channel */
unsigned char irq_enabled; /* irq enabled for channel */ unsigned char irq_enabled; /* irq enabled for channel */
unsigned char xfer_unit; /* size of an transfer */ unsigned char xfer_unit; /* size of an transfer */
/* channel state */ /* channel state */
s3c2410_dma_state_t state; enum s3c2410_dma_state state;
s3c2410_dma_loadst_t load_state; enum s3c2410_dma_loadst load_state;
s3c2410_dma_client_t *client; struct s3c2410_dma_client *client;
/* channel configuration */ /* channel configuration */
s3c2410_dmasrc_t source; enum s3c2410_dmasrc source;
unsigned long dev_addr; unsigned long dev_addr;
unsigned long load_timeout; unsigned long load_timeout;
unsigned int flags; /* channel flags */ unsigned int flags; /* channel flags */
/* channel's hardware position and configuration */ /* channel's hardware position and configuration */
void __iomem *regs; /* channels registers */ void __iomem *regs; /* channels registers */
void __iomem *addr_reg; /* data address register */ void __iomem *addr_reg; /* data address register */
unsigned int irq; /* channel irq */ unsigned int irq; /* channel irq */
unsigned long dcon; /* default value of DCON */ unsigned long dcon; /* default value of DCON */
/* driver handles */ /* driver handles */
s3c2410_dma_cbfn_t callback_fn; /* buffer done callback */ s3c2410_dma_cbfn_t callback_fn; /* buffer done callback */
s3c2410_dma_opfn_t op_fn; /* channel operation callback */ s3c2410_dma_opfn_t op_fn; /* channel op callback */
/* stats gathering */ /* stats gathering */
s3c2410_dma_stats_t *stats; struct s3c2410_dma_stats *stats;
s3c2410_dma_stats_t stats_store; struct s3c2410_dma_stats stats_store;
/* buffer list and information */ /* buffer list and information */
s3c2410_dma_buf_t *curr; /* current dma buffer */ struct s3c2410_dma_buf *curr; /* current dma buffer */
s3c2410_dma_buf_t *next; /* next buffer to load */ struct s3c2410_dma_buf *next; /* next buffer to load */
s3c2410_dma_buf_t *end; /* end of queue */ struct s3c2410_dma_buf *end; /* end of queue */
/* system device */ /* system device */
struct sys_device dev; struct sys_device dev;
}; };
/* the currently allocated channel information */ /* the currently allocated channel information */
extern s3c2410_dma_chan_t s3c2410_chans[]; extern struct s3c2410_dma_chan s3c2410_chans[];
/* note, we don't really use dma_device_t at the moment */ /* note, we don't really use dma_device_t at the moment */
typedef unsigned long dma_device_t; typedef unsigned long dma_device_t;
...@@ -227,7 +211,7 @@ typedef unsigned long dma_device_t; ...@@ -227,7 +211,7 @@ typedef unsigned long dma_device_t;
*/ */
extern int s3c2410_dma_request(dmach_t channel, extern int s3c2410_dma_request(dmach_t channel,
s3c2410_dma_client_t *, void *dev); struct s3c2410_dma_client *, void *dev);
/* s3c2410_dma_ctrl /* s3c2410_dma_ctrl
...@@ -235,7 +219,7 @@ extern int s3c2410_dma_request(dmach_t channel, ...@@ -235,7 +219,7 @@ extern int s3c2410_dma_request(dmach_t channel,
* change the state of the dma channel * change the state of the dma channel
*/ */
extern int s3c2410_dma_ctrl(dmach_t channel, s3c2410_chan_op_t op); extern int s3c2410_dma_ctrl(dmach_t channel, enum s3c2410_chan_op op);
/* s3c2410_dma_setflags /* s3c2410_dma_setflags
* *
...@@ -250,7 +234,7 @@ extern int s3c2410_dma_setflags(dmach_t channel, ...@@ -250,7 +234,7 @@ extern int s3c2410_dma_setflags(dmach_t channel,
* free the dma channel (will also abort any outstanding operations) * free the dma channel (will also abort any outstanding operations)
*/ */
extern int s3c2410_dma_free(dmach_t channel, s3c2410_dma_client_t *); extern int s3c2410_dma_free(dmach_t channel, struct s3c2410_dma_client *);
/* s3c2410_dma_enqueue /* s3c2410_dma_enqueue
* *
...@@ -274,7 +258,7 @@ extern int s3c2410_dma_config(dmach_t channel, int xferunit, int dcon); ...@@ -274,7 +258,7 @@ extern int s3c2410_dma_config(dmach_t channel, int xferunit, int dcon);
* configure the device we're talking to * configure the device we're talking to
*/ */
extern int s3c2410_dma_devconfig(int channel, s3c2410_dmasrc_t source, extern int s3c2410_dma_devconfig(int channel, enum s3c2410_dmasrc source,
int hwcfg, unsigned long devaddr); int hwcfg, unsigned long devaddr);
/* s3c2410_dma_getposition /* s3c2410_dma_getposition
......
...@@ -247,14 +247,12 @@ extern void dmac_flush_range(unsigned long, unsigned long); ...@@ -247,14 +247,12 @@ extern void dmac_flush_range(unsigned long, unsigned long);
*/ */
#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ #define copy_to_user_page(vma, page, vaddr, dst, src, len) \
do { \ do { \
flush_cache_page(vma, vaddr, page_to_pfn(page));\
memcpy(dst, src, len); \ memcpy(dst, src, len); \
flush_dcache_page(page); \ flush_ptrace_access(vma, page, vaddr, dst, len, 1);\
} while (0) } while (0)
#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ #define copy_from_user_page(vma, page, vaddr, dst, src, len) \
do { \ do { \
flush_cache_page(vma, vaddr, page_to_pfn(page));\
memcpy(dst, src, len); \ memcpy(dst, src, len); \
} while (0) } while (0)
...@@ -285,10 +283,24 @@ flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsigned l ...@@ -285,10 +283,24 @@ flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsigned l
__cpuc_flush_user_range(addr, addr + PAGE_SIZE, vma->vm_flags); __cpuc_flush_user_range(addr, addr + PAGE_SIZE, vma->vm_flags);
} }
} }
static inline void
flush_ptrace_access(struct vm_area_struct *vma, struct page *page,
unsigned long uaddr, void *kaddr,
unsigned long len, int write)
{
if (cpu_isset(smp_processor_id(), vma->vm_mm->cpu_vm_mask)) {
unsigned long addr = (unsigned long)kaddr;
__cpuc_coherent_kern_range(addr, addr + len);
}
}
#else #else
extern void flush_cache_mm(struct mm_struct *mm); extern void flush_cache_mm(struct mm_struct *mm);
extern void flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end); extern void flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end);
extern void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsigned long pfn); extern void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsigned long pfn);
extern void flush_ptrace_access(struct vm_area_struct *vma, struct page *page,
unsigned long uaddr, void *kaddr,
unsigned long len, int write);
#endif #endif
/* /*
......
...@@ -199,7 +199,21 @@ static inline void __raw_read_unlock(raw_rwlock_t *rw) ...@@ -199,7 +199,21 @@ static inline void __raw_read_unlock(raw_rwlock_t *rw)
: "cc"); : "cc");
} }
#define __raw_read_trylock(lock) generic__raw_read_trylock(lock) static inline int __raw_read_trylock(raw_rwlock_t *rw)
{
unsigned long tmp tmp2 = 1;
__asm__ __volatile__(
"1: ldrex %0, [%2]\n"
" adds %0, %0, #1\n"
" strexpl %1, %0, [%2]\n"
: "=&r" (tmp), "+r" (tmp2)
: "r" (&rw->lock)
: "cc");
smp_mb();
return tmp2 == 0;
}
/* read_can_lock - would read_trylock() succeed? */ /* read_can_lock - would read_trylock() succeed? */
#define __raw_read_can_lock(x) ((x)->lock < 0x80000000) #define __raw_read_can_lock(x) ((x)->lock < 0x80000000)
......
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