2009-06-09 06:33:19

by Chen Liqin

[permalink] [raw]
Subject: [PATCH 06/27] score: create head files delay.h device.h div64.h dma-mapping.h dma.h

>From 98df81697789227319d5909b66daf7e48bb3d2d7 Mon Sep 17 00:00:00 2001
From: Chen Liqin <[email protected]>
Date: Tue, 9 Jun 2009 13:43:07 +0800



Signed-off-by: Chen Liqin <[email protected]>
---
arch/score/include/asm/delay.h | 14 ++++++++++++++
arch/score/include/asm/device.h | 6 ++++++
arch/score/include/asm/div64.h | 6 ++++++
arch/score/include/asm/dma-mapping.h | 6 ++++++
arch/score/include/asm/dma.h | 8 ++++++++
5 files changed, 40 insertions(+), 0 deletions(-)
create mode 100644 arch/score/include/asm/delay.h
create mode 100644 arch/score/include/asm/device.h
create mode 100644 arch/score/include/asm/div64.h
create mode 100644 arch/score/include/asm/dma-mapping.h
create mode 100644 arch/score/include/asm/dma.h

diff --git a/arch/score/include/asm/delay.h
b/arch/score/include/asm/delay.h
new file mode 100644
index 0000000..ea4d532
--- /dev/null
+++ b/arch/score/include/asm/delay.h
@@ -0,0 +1,14 @@
+#ifndef _ASM_SCORE_DELAY_H
+#define _ASM_SCORE_DELAY_H
+
+static inline void __delay(unsigned long loops)
+{}
+
+static inline void __udelay(unsigned long usecs)
+{
+ __delay(usecs);
+}
+
+#define udelay(usecs) __udelay(usecs)
+
+#endif /* _ASM_SCORE_DELAY_H */
diff --git a/arch/score/include/asm/device.h
b/arch/score/include/asm/device.h
new file mode 100644
index 0000000..2dc7cc5
--- /dev/null
+++ b/arch/score/include/asm/device.h
@@ -0,0 +1,6 @@
+#ifndef _ASM_SCORE_DEVICE_H
+#define _ASM_SCORE_DEVICE_H
+
+#include <asm-generic/device.h>
+
+#endif /* _ASM_SCORE_DEVICE_H */
diff --git a/arch/score/include/asm/div64.h
b/arch/score/include/asm/div64.h
new file mode 100644
index 0000000..75fae19
--- /dev/null
+++ b/arch/score/include/asm/div64.h
@@ -0,0 +1,6 @@
+#ifndef _ASM_SCORE_DIV64_H
+#define _ASM_SCORE_DIV64_H
+
+#include <asm-generic/div64.h>
+
+#endif /* _ASM_SCORE_DIV64_H */
diff --git a/arch/score/include/asm/dma-mapping.h
b/arch/score/include/asm/dma-mapping.h
new file mode 100644
index 0000000..f9c0193
--- /dev/null
+++ b/arch/score/include/asm/dma-mapping.h
@@ -0,0 +1,6 @@
+#ifndef _ASM_SCORE_DMA_MAPPING_H
+#define _ASM_SCORE_DMA_MAPPING_H
+
+#include <asm-generic/dma-mapping-broken.h>
+
+#endif /* _ASM_SCORE_DMA_MAPPING_H */
diff --git a/arch/score/include/asm/dma.h b/arch/score/include/asm/dma.h
new file mode 100644
index 0000000..4c4f2e3
--- /dev/null
+++ b/arch/score/include/asm/dma.h
@@ -0,0 +1,8 @@
+#ifndef _ASM_SCORE_DMA_H
+#define _ASM_SCORE_DMA_H
+
+#include <asm/io.h>
+
+#define MAX_DMA_ADDRESS (PAGE_OFFSET + 0x01000000)
+
+#endif /* _ASM_SCORE_DMA_H */
--
1.6.2


2009-06-09 17:18:46

by Arnd Bergmann

[permalink] [raw]
Subject: Re: [PATCH 06/27] score: create head files delay.h device.h div64.h dma-mapping.h dma.h

On Tuesday 09 June 2009, [email protected] wrote:

> diff --git a/arch/score/include/asm/delay.h
> b/arch/score/include/asm/delay.h
> new file mode 100644
> index 0000000..ea4d532
> --- /dev/null
> +++ b/arch/score/include/asm/delay.h
> @@ -0,0 +1,14 @@
> +#ifndef _ASM_SCORE_DELAY_H
> +#define _ASM_SCORE_DELAY_H
> +
> +static inline void __delay(unsigned long loops)
> +{}
> +
> +static inline void __udelay(unsigned long usecs)
> +{
> + __delay(usecs);
> +}
> +
> +#define udelay(usecs) __udelay(usecs)
> +
> +#endif /* _ASM_SCORE_DELAY_H */

Having a working udelay() function is required for many
drivers that are sensitive to timing, you should probably
implement that at some point in the future.

> new file mode 100644
> index 0000000..f9c0193
> --- /dev/null
> +++ b/arch/score/include/asm/dma-mapping.h
> @@ -0,0 +1,6 @@
> +#ifndef _ASM_SCORE_DMA_MAPPING_H
> +#define _ASM_SCORE_DMA_MAPPING_H
> +
> +#include <asm-generic/dma-mapping-broken.h>
> +
> +#endif /* _ASM_SCORE_DMA_MAPPING_H */

This is what I did in the asm-generic#microblaze tree, but I noticed later
that you can simply leave out that file entirely when you set
CONFIG_NO_DMA.

> --- /dev/null
> +++ b/arch/score/include/asm/dma.h
> @@ -0,0 +1,8 @@
> +#ifndef _ASM_SCORE_DMA_H
> +#define _ASM_SCORE_DMA_H
> +
> +#include <asm/io.h>
> +
> +#define MAX_DMA_ADDRESS (PAGE_OFFSET + 0x01000000)
> +
> +#endif /* _ASM_SCORE_DMA_H */

This indicates that you allow DMA to certain devices only in the first
16MB of memory, like an ISA floppy or parallel port. Do you actually have
any devices with this behaviour?

Arnd <><

2009-06-13 06:41:09

by Chen Liqin

[permalink] [raw]
Subject: Re: [PATCH 06/27] score: create head files delay.h device.h div64.h dma-mapping.h dma.h

Arnd Bergmann <[email protected]> д?? 2009-06-10 01:18:20:

> On Tuesday 09 June 2009, [email protected] wrote:
>
> Having a working udelay() function is required for many
> drivers that are sensitive to timing, you should probably
> implement that at some point in the future.

Add udelay() implement in code.

>
> This indicates that you allow DMA to certain devices only in the first
> 16MB of memory, like an ISA floppy or parallel port. Do you actually
have
> any devices with this behaviour?
>

No, I had removed it.

Best Regards
Liqin
--
????{.n?+???????+%?????ݶ??w??{.n?+????{??G?????{ay?ʇڙ?,j??f???h?????????z_??(?階?ݢj"???m??????G????????????&???~???iO???z??v?^?m???? ????????I?

2009-06-13 22:32:46

by Arnd Bergmann

[permalink] [raw]
Subject: Re: [PATCH 06/27] score: create head files delay.h device.h div64.h dma-mapping.h dma.h

On Saturday 13 June 2009, [email protected] wrote:
> Arnd Bergmann <[email protected]> д?? 2009-06-10 01:18:20:
>
> > On Tuesday 09 June 2009, [email protected] wrote:
> >
> > Having a working udelay() function is required for many
> > drivers that are sensitive to timing, you should probably
> > implement that at some point in the future.
>
> Add udelay() implement in code.

so you use

static inline void __delay(unsigned long loops)
{
__asm__ __volatile__ (
"1:\tsubi\t%0,1\n\t"
"cmpz.c\t%0\n\t"
"bne\t1b\n\t"
: "=r" (loops)
: "0" (loops));
}

static inline void __udelay(unsigned long usecs)
{
__delay(usecs);
}


This is much better than before, but is far from exact in the __udelay()
case. Please take a look at init/calibrate.c and how other architectures
use loops_per_jiffy if you don't have an exact time source you can use.

If you have a time source with microsecond resolution or better, just loop
until the amount of microseconds has expired.

Arnd <><