Merge branch 'devel-stable' into devel

This commit is contained in:
Russell King 2010-08-09 14:09:29 +01:00
commit 054d5c9238
1269 changed files with 57964 additions and 28778 deletions

View File

@ -199,10 +199,33 @@
may be configured as a kernel built-in or a kernel loadable module. may be configured as a kernel built-in or a kernel loadable module.
You can only make use of <constant>kgdbwait</constant> and early You can only make use of <constant>kgdbwait</constant> and early
debugging if you build kgdboc into the kernel as a built-in. debugging if you build kgdboc into the kernel as a built-in.
<para>Optionally you can elect to activate kms (Kernel Mode
Setting) integration. When you use kms with kgdboc and you have a
video driver that has atomic mode setting hooks, it is possible to
enter the debugger on the graphics console. When the kernel
execution is resumed, the previous graphics mode will be restored.
This integration can serve as a useful tool to aid in diagnosing
crashes or doing analysis of memory with kdb while allowing the
full graphics console applications to run.
</para>
</para> </para>
<sect2 id="kgdbocArgs"> <sect2 id="kgdbocArgs">
<title>kgdboc arguments</title> <title>kgdboc arguments</title>
<para>Usage: <constant>kgdboc=[kbd][[,]serial_device][,baud]</constant></para> <para>Usage: <constant>kgdboc=[kms][[,]kbd][[,]serial_device][,baud]</constant></para>
<para>The order listed above must be observed if you use any of the
optional configurations together.
</para>
<para>Abbreviations:
<itemizedlist>
<listitem><para>kms = Kernel Mode Setting</para></listitem>
<listitem><para>kbd = Keyboard</para></listitem>
</itemizedlist>
</para>
<para>You can configure kgdboc to use the keyboard, and or a serial
device depending on if you are using kdb and or kgdb, in one of the
following scenarios. The order listed above must be observed if
you use any of the optional configurations together. Using kms +
only gdb is generally not a useful combination.</para>
<sect3 id="kgdbocArgs1"> <sect3 id="kgdbocArgs1">
<title>Using loadable module or built-in</title> <title>Using loadable module or built-in</title>
<para> <para>
@ -212,7 +235,7 @@
<listitem> <listitem>
<para>As a kernel loadable module:</para> <para>As a kernel loadable module:</para>
<para>Use the command: <constant>modprobe kgdboc kgdboc=&lt;tty-device&gt;,[baud]</constant></para> <para>Use the command: <constant>modprobe kgdboc kgdboc=&lt;tty-device&gt;,[baud]</constant></para>
<para>Here are two examples of how you might formate the kgdboc <para>Here are two examples of how you might format the kgdboc
string. The first is for an x86 target using the first serial port. string. The first is for an x86 target using the first serial port.
The second example is for the ARM Versatile AB using the second The second example is for the ARM Versatile AB using the second
serial port. serial port.
@ -240,6 +263,9 @@
</sect3> </sect3>
<sect3 id="kgdbocArgs3"> <sect3 id="kgdbocArgs3">
<title>More examples</title> <title>More examples</title>
<para>You can configure kgdboc to use the keyboard, and or a serial
device depending on if you are using kdb and or kgdb, in one of the
following scenarios.</para>
<para>You can configure kgdboc to use the keyboard, and or a serial device <para>You can configure kgdboc to use the keyboard, and or a serial device
depending on if you are using kdb and or kgdb, in one of the depending on if you are using kdb and or kgdb, in one of the
following scenarios. following scenarios.
@ -255,6 +281,12 @@
<listitem><para>kdb with a keyboard</para> <listitem><para>kdb with a keyboard</para>
<para><constant>kgdboc=kbd</constant></para> <para><constant>kgdboc=kbd</constant></para>
</listitem> </listitem>
<listitem><para>kdb with kernel mode setting</para>
<para><constant>kgdboc=kms,kbd</constant></para>
</listitem>
<listitem><para>kdb with kernel mode setting and kgdb over a serial port</para>
<para><constant>kgdboc=kms,kbd,ttyS0,115200</constant></para>
</listitem>
</orderedlist> </orderedlist>
</para> </para>
</sect3> </sect3>
@ -637,6 +669,8 @@ Task Addr Pid Parent [*] cpu State Thread Command
<listitem><para>The logic to perform safe memory reads and writes to memory while using the debugger</para></listitem> <listitem><para>The logic to perform safe memory reads and writes to memory while using the debugger</para></listitem>
<listitem><para>A full implementation for software breakpoints unless overridden by the arch</para></listitem> <listitem><para>A full implementation for software breakpoints unless overridden by the arch</para></listitem>
<listitem><para>The API to invoke either the kdb or kgdb frontend to the debug core.</para></listitem> <listitem><para>The API to invoke either the kdb or kgdb frontend to the debug core.</para></listitem>
<listitem><para>The structures and callback API for atomic kernel mode setting.</para>
<para>NOTE: kgdboc is where the kms callbacks are invoked.</para></listitem>
</itemizedlist> </itemizedlist>
</para> </para>
</listitem> </listitem>
@ -747,6 +781,8 @@ Task Addr Pid Parent [*] cpu State Thread Command
</sect1> </sect1>
<sect1 id="kgdbocDesign"> <sect1 id="kgdbocDesign">
<title>kgdboc internals</title> <title>kgdboc internals</title>
<sect2>
<title>kgdboc and uarts</title>
<para> <para>
The kgdboc driver is actually a very thin driver that relies on the The kgdboc driver is actually a very thin driver that relies on the
underlying low level to the hardware driver having "polling hooks" underlying low level to the hardware driver having "polling hooks"
@ -754,11 +790,8 @@ Task Addr Pid Parent [*] cpu State Thread Command
implementation of kgdboc it the serial_core was changed to expose a implementation of kgdboc it the serial_core was changed to expose a
low level UART hook for doing polled mode reading and writing of a low level UART hook for doing polled mode reading and writing of a
single character while in an atomic context. When kgdb makes an I/O single character while in an atomic context. When kgdb makes an I/O
request to the debugger, kgdboc invokes a call back in the serial request to the debugger, kgdboc invokes a callback in the serial
core which in turn uses the call back in the UART driver. It is core which in turn uses the callback in the UART driver.</para>
certainly possible to extend kgdboc to work with non-UART based
consoles in the future.
</para>
<para> <para>
When using kgdboc with a UART, the UART driver must implement two callbacks in the <constant>struct uart_ops</constant>. Example from drivers/8250.c:<programlisting> When using kgdboc with a UART, the UART driver must implement two callbacks in the <constant>struct uart_ops</constant>. Example from drivers/8250.c:<programlisting>
#ifdef CONFIG_CONSOLE_POLL #ifdef CONFIG_CONSOLE_POLL
@ -772,9 +805,68 @@ Task Addr Pid Parent [*] cpu State Thread Command
that they can be called from an atomic context and have to restore that they can be called from an atomic context and have to restore
the state of the UART chip on return such that the system can return the state of the UART chip on return such that the system can return
to normal when the debugger detaches. You need to be very careful to normal when the debugger detaches. You need to be very careful
with any kind of lock you consider, because failing here is most with any kind of lock you consider, because failing here is most likely
going to mean pressing the reset button. going to mean pressing the reset button.
</para> </para>
</sect2>
<sect2 id="kgdbocKbd">
<title>kgdboc and keyboards</title>
<para>The kgdboc driver contains logic to configure communications
with an attached keyboard. The keyboard infrastructure is only
compiled into the kernel when CONFIG_KDB_KEYBOARD=y is set in the
kernel configuration.</para>
<para>The core polled keyboard driver driver for PS/2 type keyboards
is in drivers/char/kdb_keyboard.c. This driver is hooked into the
debug core when kgdboc populates the callback in the array
called <constant>kdb_poll_funcs[]</constant>. The
kdb_get_kbd_char() is the top-level function which polls hardware
for single character input.
</para>
</sect2>
<sect2 id="kgdbocKms">
<title>kgdboc and kms</title>
<para>The kgdboc driver contains logic to request the graphics
display to switch to a text context when you are using
"kgdboc=kms,kbd", provided that you have a video driver which has a
frame buffer console and atomic kernel mode setting support.</para>
<para>
Every time the kernel
debugger is entered it calls kgdboc_pre_exp_handler() which in turn
calls con_debug_enter() in the virtual console layer. On resuming kernel
execution, the kernel debugger calls kgdboc_post_exp_handler() which
in turn calls con_debug_leave().</para>
<para>Any video driver that wants to be compatible with the kernel
debugger and the atomic kms callbacks must implement the
mode_set_base_atomic, fb_debug_enter and fb_debug_leave operations.
For the fb_debug_enter and fb_debug_leave the option exists to use
the generic drm fb helper functions or implement something custom for
the hardware. The following example shows the initialization of the
.mode_set_base_atomic operation in
drivers/gpu/drm/i915/intel_display.c:
<informalexample>
<programlisting>
static const struct drm_crtc_helper_funcs intel_helper_funcs = {
[...]
.mode_set_base_atomic = intel_pipe_set_base_atomic,
[...]
};
</programlisting>
</informalexample>
</para>
<para>Here is an example of how the i915 driver initializes the fb_debug_enter and fb_debug_leave functions to use the generic drm helpers in
drivers/gpu/drm/i915/intel_fb.c:
<informalexample>
<programlisting>
static struct fb_ops intelfb_ops = {
[...]
.fb_debug_enter = drm_fb_helper_debug_enter,
.fb_debug_leave = drm_fb_helper_debug_leave,
[...]
};
</programlisting>
</informalexample>
</para>
</sect2>
</sect1> </sect1>
</chapter> </chapter>
<chapter id="credits"> <chapter id="credits">

View File

@ -6,4 +6,5 @@
<param name="callout.graphics">0</param> <param name="callout.graphics">0</param>
<!-- <param name="paper.type">A4</param> --> <!-- <param name="paper.type">A4</param> -->
<param name="generate.section.toc.level">2</param> <param name="generate.section.toc.level">2</param>
<param name="use.id.as.filename">1</param>
</stylesheet> </stylesheet>

View File

@ -7,7 +7,7 @@ Notes Written on Jan 15, 2002:
Last Updated May 2, 2002 Last Updated May 2, 2002
September 2003: Updated I/O Scheduler portions September 2003: Updated I/O Scheduler portions
Nick Piggin <piggin@cyberone.com.au> Nick Piggin <npiggin@kernel.dk>
Introduction: Introduction:

View File

@ -0,0 +1,258 @@
Copyright 2010 Nicolas Palix <npalix@diku.dk>
Copyright 2010 Julia Lawall <julia@diku.dk>
Copyright 2010 Gilles Muller <Gilles.Muller@lip6.fr>
Getting Coccinelle
~~~~~~~~~~~~~~~~~~~~
The semantic patches included in the kernel use the 'virtual rule'
feature which was introduced in Coccinelle version 0.1.11.
Coccinelle (>=0.2.0) is available through the package manager
of many distributions, e.g. :
- Debian (>=squeeze)
- Fedora (>=13)
- Ubuntu (>=10.04 Lucid Lynx)
- OpenSUSE
- Arch Linux
- NetBSD
- FreeBSD
You can get the latest version released from the Coccinelle homepage at
http://coccinelle.lip6.fr/
Once you have it, run the following command:
./configure
make
as a regular user, and install it with
sudo make install
Using Coccinelle on the Linux kernel
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
A Coccinelle-specific target is defined in the top level
Makefile. This target is named 'coccicheck' and calls the 'coccicheck'
front-end in the 'scripts' directory.
Four modes are defined: report, patch, context, and org. The mode to
use is specified by setting the MODE variable with 'MODE=<mode>'.
'report' generates a list in the following format:
file:line:column-column: message
'patch' proposes a fix, when possible.
'context' highlights lines of interest and their context in a
diff-like style.Lines of interest are indicated with '-'.
'org' generates a report in the Org mode format of Emacs.
Note that not all semantic patches implement all modes.
To make a report for every semantic patch, run the following command:
make coccicheck MODE=report
NB: The 'report' mode is the default one.
To produce patches, run:
make coccicheck MODE=patch
The coccicheck target applies every semantic patch available in the
subdirectories of 'scripts/coccinelle' to the entire Linux kernel.
For each semantic patch, a changelog message is proposed. It gives a
description of the problem being checked by the semantic patch, and
includes a reference to Coccinelle.
As any static code analyzer, Coccinelle produces false
positives. Thus, reports must be carefully checked, and patches
reviewed.
Using Coccinelle with a single semantic patch
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The optional make variable COCCI can be used to check a single
semantic patch. In that case, the variable must be initialized with
the name of the semantic patch to apply.
For instance:
make coccicheck COCCI=<my_SP.cocci> MODE=patch
or
make coccicheck COCCI=<my_SP.cocci> MODE=report
Proposing new semantic patches
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
New semantic patches can be proposed and submitted by kernel
developers. For sake of clarity, they should be organized in the
subdirectories of 'scripts/coccinelle/'.
Detailed description of the 'report' mode
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'report' generates a list in the following format:
file:line:column-column: message
Example:
Running
make coccicheck MODE=report COCCI=scripts/coccinelle/err_cast.cocci
will execute the following part of the SmPL script.
<smpl>
@r depends on !context && !patch && (org || report)@
expression x;
position p;
@@
ERR_PTR@p(PTR_ERR(x))
@script:python depends on report@
p << r.p;
x << r.x;
@@
msg="ERR_CAST can be used with %s" % (x)
coccilib.report.print_report(p[0], msg)
</smpl>
This SmPL excerpt generates entries on the standard output, as
illustrated below:
/home/user/linux/crypto/ctr.c:188:9-16: ERR_CAST can be used with alg
/home/user/linux/crypto/authenc.c:619:9-16: ERR_CAST can be used with auth
/home/user/linux/crypto/xts.c:227:9-16: ERR_CAST can be used with alg
Detailed description of the 'patch' mode
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
When the 'patch' mode is available, it proposes a fix for each problem
identified.
Example:
Running
make coccicheck MODE=patch COCCI=scripts/coccinelle/err_cast.cocci
will execute the following part of the SmPL script.
<smpl>
@ depends on !context && patch && !org && !report @
expression x;
@@
- ERR_PTR(PTR_ERR(x))
+ ERR_CAST(x)
</smpl>
This SmPL excerpt generates patch hunks on the standard output, as
illustrated below:
diff -u -p a/crypto/ctr.c b/crypto/ctr.c
--- a/crypto/ctr.c 2010-05-26 10:49:38.000000000 +0200
+++ b/crypto/ctr.c 2010-06-03 23:44:49.000000000 +0200
@@ -185,7 +185,7 @@ static struct crypto_instance *crypto_ct
alg = crypto_attr_alg(tb[1], CRYPTO_ALG_TYPE_CIPHER,
CRYPTO_ALG_TYPE_MASK);
if (IS_ERR(alg))
- return ERR_PTR(PTR_ERR(alg));
+ return ERR_CAST(alg);
/* Block size must be >= 4 bytes. */
err = -EINVAL;
Detailed description of the 'context' mode
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'context' highlights lines of interest and their context
in a diff-like style.
NOTE: The diff-like output generated is NOT an applicable patch. The
intent of the 'context' mode is to highlight the important lines
(annotated with minus, '-') and gives some surrounding context
lines around. This output can be used with the diff mode of
Emacs to review the code.
Example:
Running
make coccicheck MODE=context COCCI=scripts/coccinelle/err_cast.cocci
will execute the following part of the SmPL script.
<smpl>
@ depends on context && !patch && !org && !report@
expression x;
@@
* ERR_PTR(PTR_ERR(x))
</smpl>
This SmPL excerpt generates diff hunks on the standard output, as
illustrated below:
diff -u -p /home/user/linux/crypto/ctr.c /tmp/nothing
--- /home/user/linux/crypto/ctr.c 2010-05-26 10:49:38.000000000 +0200
+++ /tmp/nothing
@@ -185,7 +185,6 @@ static struct crypto_instance *crypto_ct
alg = crypto_attr_alg(tb[1], CRYPTO_ALG_TYPE_CIPHER,
CRYPTO_ALG_TYPE_MASK);
if (IS_ERR(alg))
- return ERR_PTR(PTR_ERR(alg));
/* Block size must be >= 4 bytes. */
err = -EINVAL;
Detailed description of the 'org' mode
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'org' generates a report in the Org mode format of Emacs.
Example:
Running
make coccicheck MODE=org COCCI=scripts/coccinelle/err_cast.cocci
will execute the following part of the SmPL script.
<smpl>
@r depends on !context && !patch && (org || report)@
expression x;
position p;
@@
ERR_PTR@p(PTR_ERR(x))
@script:python depends on org@
p << r.p;
x << r.x;
@@
msg="ERR_CAST can be used with %s" % (x)
msg_safe=msg.replace("[","@(").replace("]",")")
coccilib.org.print_todo(p[0], msg_safe)
</smpl>
This SmPL excerpt generates Org entries on the standard output, as
illustrated below:
* TODO [[view:/home/user/linux/crypto/ctr.c::face=ovl-face1::linb=188::colb=9::cole=16][ERR_CAST can be used with alg]]
* TODO [[view:/home/user/linux/crypto/authenc.c::face=ovl-face1::linb=619::colb=9::cole=16][ERR_CAST can be used with auth]]
* TODO [[view:/home/user/linux/crypto/xts.c::face=ovl-face1::linb=227::colb=9::cole=16][ERR_CAST can be used with alg]]

View File

@ -22,11 +22,33 @@ building C files and assembler files.
KAFLAGS KAFLAGS
-------------------------------------------------- --------------------------------------------------
Additional options to the assembler. Additional options to the assembler (for built-in and modules).
AFLAGS_MODULE
--------------------------------------------------
Addtional module specific options to use for $(AS).
AFLAGS_KERNEL
--------------------------------------------------
Addtional options for $(AS) when used for assembler
code for code that is compiled as built-in.
KCFLAGS KCFLAGS
-------------------------------------------------- --------------------------------------------------
Additional options to the C compiler. Additional options to the C compiler (for built-in and modules).
CFLAGS_KERNEL
--------------------------------------------------
Addtional options for $(CC) when used to compile
code that is compiled as built-in.
CFLAGS_MODULE
--------------------------------------------------
Addtional module specific options to use for $(CC).
LDFLAGS_MODULE
--------------------------------------------------
Additional options used for $(LD) when linking modules.
KBUILD_VERBOSE KBUILD_VERBOSE
-------------------------------------------------- --------------------------------------------------
@ -40,15 +62,15 @@ Set the directory to look for the kernel source when building external
modules. modules.
The directory can be specified in several ways: The directory can be specified in several ways:
1) Use "M=..." on the command line 1) Use "M=..." on the command line
2) Environmnet variable KBUILD_EXTMOD 2) Environment variable KBUILD_EXTMOD
3) Environmnet variable SUBDIRS 3) Environment variable SUBDIRS
The possibilities are listed in the order they take precedence. The possibilities are listed in the order they take precedence.
Using "M=..." will always override the others. Using "M=..." will always override the others.
KBUILD_OUTPUT KBUILD_OUTPUT
-------------------------------------------------- --------------------------------------------------
Specify the output directory when building the kernel. Specify the output directory when building the kernel.
The output directory can also be specificed using "O=...". The output directory can also be specified using "O=...".
Setting "O=..." takes precedence over KBUILD_OUTPUT. Setting "O=..." takes precedence over KBUILD_OUTPUT.
ARCH ARCH
@ -90,7 +112,7 @@ The script will be called with the following arguments:
$3 - kernel map file $3 - kernel map file
$4 - default install path (use root directory if blank) $4 - default install path (use root directory if blank)
The implmentation of "make install" is architecture specific The implementation of "make install" is architecture specific
and it may differ from the above. and it may differ from the above.
INSTALLKERNEL is provided to enable the possibility to INSTALLKERNEL is provided to enable the possibility to

View File

@ -65,7 +65,7 @@ also use the environment variable KCONFIG_ALLCONFIG as a flag or a
filename that contains config symbols that the user requires to be filename that contains config symbols that the user requires to be
set to a specific value. If KCONFIG_ALLCONFIG is used without a set to a specific value. If KCONFIG_ALLCONFIG is used without a
filename, "make *config" checks for a file named filename, "make *config" checks for a file named
"all{yes/mod/no/random}.config" (corresponding to the *config command "all{yes/mod/no/def/random}.config" (corresponding to the *config command
that was used) for symbol values that are to be forced. If this file that was used) for symbol values that are to be forced. If this file
is not found, it checks for a file named "all.config" to contain forced is not found, it checks for a file named "all.config" to contain forced
values. values.

View File

@ -168,7 +168,7 @@ more details, with real examples.
#drivers/isdn/i4l/Makefile #drivers/isdn/i4l/Makefile
# Makefile for the kernel ISDN subsystem and device drivers. # Makefile for the kernel ISDN subsystem and device drivers.
# Each configuration option enables a list of files. # Each configuration option enables a list of files.
obj-$(CONFIG_ISDN) += isdn.o obj-$(CONFIG_ISDN_I4L) += isdn.o
obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o
--- 3.3 Loadable module goals - obj-m --- 3.3 Loadable module goals - obj-m
@ -187,34 +187,35 @@ more details, with real examples.
Note: In this example $(CONFIG_ISDN_PPP_BSDCOMP) evaluates to 'm' Note: In this example $(CONFIG_ISDN_PPP_BSDCOMP) evaluates to 'm'
If a kernel module is built from several source files, you specify If a kernel module is built from several source files, you specify
that you want to build a module in the same way as above. that you want to build a module in the same way as above; however,
kbuild needs to know which object files you want to build your
Kbuild needs to know which the parts that you want to build your module from, so you have to tell it by setting a $(<module_name>-y)
module from, so you have to tell it by setting an variable.
$(<module_name>-objs) variable.
Example: Example:
#drivers/isdn/i4l/Makefile #drivers/isdn/i4l/Makefile
obj-$(CONFIG_ISDN) += isdn.o obj-$(CONFIG_ISDN_I4L) += isdn.o
isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o isdn-y := isdn_net_lib.o isdn_v110.o isdn_common.o
In this example, the module name will be isdn.o. Kbuild will In this example, the module name will be isdn.o. Kbuild will
compile the objects listed in $(isdn-objs) and then run compile the objects listed in $(isdn-y) and then run
"$(LD) -r" on the list of these files to generate isdn.o. "$(LD) -r" on the list of these files to generate isdn.o.
Kbuild recognises objects used for composite objects by the suffix Due to kbuild recognizing $(<module_name>-y) for composite objects,
-objs, and the suffix -y. This allows the Makefiles to use you can use the value of a CONFIG_ symbol to optionally include an
the value of a CONFIG_ symbol to determine if an object is part object file as part of a composite object.
of a composite object.
Example: Example:
#fs/ext2/Makefile #fs/ext2/Makefile
obj-$(CONFIG_EXT2_FS) += ext2.o obj-$(CONFIG_EXT2_FS) += ext2.o
ext2-y := balloc.o bitmap.o ext2-y := balloc.o dir.o file.o ialloc.o inode.o ioctl.o \
ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o namei.o super.o symlink.o
ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o xattr_user.o \
xattr_trusted.o
In this example, xattr.o is only part of the composite object In this example, xattr.o, xattr_user.o and xattr_trusted.o are only
ext2.o if $(CONFIG_EXT2_FS_XATTR) evaluates to 'y'. part of the composite object ext2.o if $(CONFIG_EXT2_FS_XATTR)
evaluates to 'y'.
Note: Of course, when you are building objects into the kernel, Note: Of course, when you are building objects into the kernel,
the syntax above will also work. So, if you have CONFIG_EXT2_FS=y, the syntax above will also work. So, if you have CONFIG_EXT2_FS=y,
@ -244,12 +245,12 @@ more details, with real examples.
may contain both a built-in.o and a lib.a file. may contain both a built-in.o and a lib.a file.
Example: Example:
#arch/i386/lib/Makefile #arch/x86/lib/Makefile
lib-y := checksum.o delay.o lib-y := delay.o
This will create a library lib.a based on checksum.o and delay.o. This will create a library lib.a based on delay.o. For kbuild to
For kbuild to actually recognize that there is a lib.a being built, actually recognize that there is a lib.a being built, the directory
the directory shall be listed in libs-y. shall be listed in libs-y.
See also "6.3 List directories to visit when descending". See also "6.3 List directories to visit when descending".
Use of lib-y is normally restricted to lib/ and arch/*/lib. Use of lib-y is normally restricted to lib/ and arch/*/lib.
@ -284,43 +285,40 @@ more details, with real examples.
--- 3.7 Compilation flags --- 3.7 Compilation flags
ccflags-y, asflags-y and ldflags-y ccflags-y, asflags-y and ldflags-y
The three flags listed above applies only to the kbuild makefile These three flags apply only to the kbuild makefile in which they
where they are assigned. They are used for all the normal are assigned. They are used for all the normal cc, as and ld
cc, as and ld invocation happenign during a recursive build. invocations happening during a recursive build.
Note: Flags with the same behaviour were previously named: Note: Flags with the same behaviour were previously named:
EXTRA_CFLAGS, EXTRA_AFLAGS and EXTRA_LDFLAGS. EXTRA_CFLAGS, EXTRA_AFLAGS and EXTRA_LDFLAGS.
They are yet supported but their use are deprecated. They are still supported but their usage is deprecated.
ccflags-y specifies options for compiling C files with $(CC). ccflags-y specifies options for compiling with $(CC).
Example: Example:
# drivers/sound/emu10k1/Makefile # drivers/acpi/Makefile
ccflags-y += -I$(obj) ccflags-y := -Os
ccflags-$(DEBUG) += -DEMU10K1_DEBUG ccflags-$(CONFIG_ACPI_DEBUG) += -DACPI_DEBUG_OUTPUT
This variable is necessary because the top Makefile owns the This variable is necessary because the top Makefile owns the
variable $(KBUILD_CFLAGS) and uses it for compilation flags for the variable $(KBUILD_CFLAGS) and uses it for compilation flags for the
entire tree. entire tree.
asflags-y is a similar string for per-directory options asflags-y specifies options for assembling with $(AS).
when compiling assembly language source.
Example: Example:
#arch/x86_64/kernel/Makefile #arch/sparc/kernel/Makefile
asflags-y := -traditional asflags-y := -ansi
ldflags-y specifies options for linking with $(LD).
ldflags-y is a string for per-directory options to $(LD).
Example: Example:
#arch/m68k/fpsp040/Makefile #arch/cris/boot/compressed/Makefile
ldflags-y := -x ldflags-y += -T $(srctree)/$(src)/decompress_$(arch-y).lds
subdir-ccflags-y, subdir-asflags-y subdir-ccflags-y, subdir-asflags-y
The two flags listed above are similar to ccflags-y and as-falgs-y. The two flags listed above are similar to ccflags-y and asflags-y.
The difference is that the subdir- variants has effect for the kbuild The difference is that the subdir- variants have effect for the kbuild
file where tey are present and all subdirectories. file where they are present and all subdirectories.
Options specified using subdir-* are added to the commandline before Options specified using subdir-* are added to the commandline before
the options specified using the non-subdir variants. the options specified using the non-subdir variants.
@ -340,18 +338,18 @@ more details, with real examples.
CFLAGS_aha152x.o = -DAHA152X_STAT -DAUTOCONF CFLAGS_aha152x.o = -DAHA152X_STAT -DAUTOCONF
CFLAGS_gdth.o = # -DDEBUG_GDTH=2 -D__SERIAL__ -D__COM2__ \ CFLAGS_gdth.o = # -DDEBUG_GDTH=2 -D__SERIAL__ -D__COM2__ \
-DGDTH_STATISTICS -DGDTH_STATISTICS
CFLAGS_seagate.o = -DARBITRATE -DPARITY -DSEAGATE_USE_ASM
These three lines specify compilation flags for aha152x.o, These two lines specify compilation flags for aha152x.o and gdth.o.
gdth.o, and seagate.o
$(AFLAGS_$@) is a similar feature for source files in assembly $(AFLAGS_$@) is a similar feature for source files in assembly
languages. languages.
Example: Example:
# arch/arm/kernel/Makefile # arch/arm/kernel/Makefile
AFLAGS_head-armv.o := -DTEXTADDR=$(TEXTADDR) -traditional AFLAGS_head.o := -DTEXT_OFFSET=$(TEXT_OFFSET)
AFLAGS_head-armo.o := -DTEXTADDR=$(TEXTADDR) -traditional AFLAGS_crunch-bits.o := -Wa,-mcpu=ep9312
AFLAGS_iwmmxt.o := -Wa,-mcpu=iwmmxt
--- 3.9 Dependency tracking --- 3.9 Dependency tracking
@ -923,16 +921,33 @@ When kbuild executes, the following steps are followed (roughly):
The first example utilises the trick that a config option expands The first example utilises the trick that a config option expands
to 'y' when selected. to 'y' when selected.
CFLAGS_KERNEL $(CC) options specific for built-in KBUILD_AFLAGS_KERNEL $(AS) options specific for built-in
$(CFLAGS_KERNEL) contains extra C compiler flags used to compile $(KBUILD_AFLAGS_KERNEL) contains extra C compiler flags used to compile
resident kernel code. resident kernel code.
CFLAGS_MODULE $(CC) options specific for modules KBUILD_AFLAGS_MODULE Options for $(AS) when building modules
$(CFLAGS_MODULE) contains extra C compiler flags used to compile code $(KBUILD_AFLAGS_MODULE) is used to add arch specific options that
for loadable kernel modules. are used for $(AS).
From commandline AFLAGS_MODULE shall be used (see kbuild.txt).
KBUILD_CFLAGS_KERNEL $(CC) options specific for built-in
$(KBUILD_CFLAGS_KERNEL) contains extra C compiler flags used to compile
resident kernel code.
KBUILD_CFLAGS_MODULE Options for $(CC) when building modules
$(KBUILD_CFLAGS_MODULE) is used to add arch specific options that
are used for $(CC).
From commandline CFLAGS_MODULE shall be used (see kbuild.txt).
KBUILD_LDFLAGS_MODULE Options for $(LD) when linking modules
$(KBUILD_LDFLAGS_MODULE) is used to add arch specific options
used when linking modules. This is often a linker script.
From commandline LDFLAGS_MODULE shall be used (see kbuild.txt).
--- 6.2 Add prerequisites to archprepare: --- 6.2 Add prerequisites to archprepare:
@ -1176,14 +1191,14 @@ When kbuild executes, the following steps are followed (roughly):
=== 7 Kbuild syntax for exported headers === 7 Kbuild syntax for exported headers
The kernel include a set of headers that is exported to userspace. The kernel include a set of headers that is exported to userspace.
Many headers can be exported as-is but other headers requires a Many headers can be exported as-is but other headers require a
minimal pre-processing before they are ready for user-space. minimal pre-processing before they are ready for user-space.
The pre-processing does: The pre-processing does:
- drop kernel specific annotations - drop kernel specific annotations
- drop include of compiler.h - drop include of compiler.h
- drop all sections that is kernel internat (guarded by ifdef __KERNEL__) - drop all sections that are kernel internal (guarded by ifdef __KERNEL__)
Each relevant directory contain a file name "Kbuild" which specify the Each relevant directory contains a file name "Kbuild" which specifies the
headers to be exported. headers to be exported.
See subsequent chapter for the syntax of the Kbuild file. See subsequent chapter for the syntax of the Kbuild file.

View File

@ -116,6 +116,7 @@ parameter is applicable:
More X86-64 boot options can be found in More X86-64 boot options can be found in
Documentation/x86/x86_64/boot-options.txt . Documentation/x86/x86_64/boot-options.txt .
X86 Either 32bit or 64bit x86 (same as X86-32+X86-64) X86 Either 32bit or 64bit x86 (same as X86-32+X86-64)
XEN Xen support is enabled
In addition, the following text indicates that the option: In addition, the following text indicates that the option:
@ -1144,9 +1145,12 @@ and is between 256 and 4096 characters. It is defined in the file
kgdboc= [KGDB,HW] kgdb over consoles. kgdboc= [KGDB,HW] kgdb over consoles.
Requires a tty driver that supports console polling, Requires a tty driver that supports console polling,
or a supported polling keyboard driver (non-usb). or a supported polling keyboard driver (non-usb).
Serial only format: <serial_device>[,baud] Serial only format: <serial_device>[,baud]
keyboard only format: kbd keyboard only format: kbd
keyboard and serial format: kbd,<serial_device>[,baud] keyboard and serial format: kbd,<serial_device>[,baud]
Optional Kernel mode setting:
kms, kbd format: kms,kbd
kms, kbd and serial format: kms,kbd,<ser_dev>[,baud]
kgdbwait [KGDB] Stop kernel execution and enter the kgdbwait [KGDB] Stop kernel execution and enter the
kernel debugger at the earliest opportunity. kernel debugger at the earliest opportunity.
@ -2886,6 +2890,16 @@ and is between 256 and 4096 characters. It is defined in the file
xd= [HW,XT] Original XT pre-IDE (RLL encoded) disks. xd= [HW,XT] Original XT pre-IDE (RLL encoded) disks.
xd_geo= See header of drivers/block/xd.c. xd_geo= See header of drivers/block/xd.c.
xen_emul_unplug= [HW,X86,XEN]
Unplug Xen emulated devices
Format: [unplug0,][unplug1]
ide-disks -- unplug primary master IDE devices
aux-ide-disks -- unplug non-primary-master IDE devices
nics -- unplug network devices
all -- unplug all emulated devices (NICs and IDE disks)
ignore -- continue loading the Xen platform PCI driver even
if the version check failed
xirc2ps_cs= [NET,PCMCIA] xirc2ps_cs= [NET,PCMCIA]
Format: Format:
<irq>,<irq_mask>,<io>,<full_duplex>,<do_sound>,<lockup_hack>[,<irq2>[,<irq3>[,<irq4>]]] <irq>,<irq_mask>,<io>,<full_duplex>,<do_sound>,<lockup_hack>[,<irq2>[,<irq3>[,<irq4>]]]

View File

@ -285,6 +285,7 @@ architectures:
- sparc64 (Return probes not yet implemented.) - sparc64 (Return probes not yet implemented.)
- arm - arm
- ppc - ppc
- mips
3. Configuring Kprobes 3. Configuring Kprobes

View File

@ -4,10 +4,17 @@ The Freescale DIU is a LCD controller, with proper hardware, it can also
drive DVI monitors. drive DVI monitors.
Required properties: Required properties:
- compatible : should be "fsl-diu". - compatible : should be "fsl,diu" or "fsl,mpc5121-diu".
- reg : should contain at least address and length of the DIU register - reg : should contain at least address and length of the DIU register
set. set.
- Interrupts : one DIU interrupt should be describe here. - interrupts : one DIU interrupt should be described here.
- interrupt-parent : the phandle for the interrupt controller that
services interrupts for this device.
Optional properties:
- edid : verbatim EDID data block describing attached display.
Data from the detailed timing descriptor will be used to
program the display controller.
Example (MPC8610HPCD): Example (MPC8610HPCD):
display@2c000 { display@2c000 {
@ -16,3 +23,12 @@ Example (MPC8610HPCD):
interrupts = <72 2>; interrupts = <72 2>;
interrupt-parent = <&mpic>; interrupt-parent = <&mpic>;
}; };
Example for MPC5121:
display@2100 {
compatible = "fsl,mpc5121-diu";
reg = <0x2100 0x100>;
interrupts = <64 0x8>;
interrupt-parent = <&ipic>;
edid = [edid-data];
};

View File

@ -20,6 +20,7 @@ Recommended properties :
- fsl,preserve-clocking : boolean; if defined, the clock settings - fsl,preserve-clocking : boolean; if defined, the clock settings
from the bootloader are preserved (not touched). from the bootloader are preserved (not touched).
- clock-frequency : desired I2C bus clock frequency in Hz. - clock-frequency : desired I2C bus clock frequency in Hz.
- fsl,timeout : I2C bus timeout in microseconds.
Examples : Examples :
@ -59,4 +60,5 @@ Examples :
interrupts = <43 2>; interrupts = <43 2>;
interrupt-parent = <&mpic>; interrupt-parent = <&mpic>;
clock-frequency = <400000>; clock-frequency = <400000>;
fsl,timeout = <10000>;
}; };

View File

@ -694,7 +694,7 @@ static void usage(void)
#endif #endif
" -l|--list Show page details in ranges\n" " -l|--list Show page details in ranges\n"
" -L|--list-each Show page details one by one\n" " -L|--list-each Show page details one by one\n"
" -N|--no-summary Don't show summay info\n" " -N|--no-summary Don't show summary info\n"
" -X|--hwpoison hwpoison pages\n" " -X|--hwpoison hwpoison pages\n"
" -x|--unpoison unpoison pages\n" " -x|--unpoison unpoison pages\n"
" -h|--help Show this usage message\n" " -h|--help Show this usage message\n"

View File

@ -694,6 +694,13 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/kristoffer/linux-hpc.git
F: arch/arm/mach-sa1100/jornada720.c F: arch/arm/mach-sa1100/jornada720.c
F: arch/arm/mach-sa1100/include/mach/jornada720.h F: arch/arm/mach-sa1100/include/mach/jornada720.h
ARM/INCOME PXA270 SUPPORT
M: Marek Vasut <marek.vasut@gmail.com>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
S: Maintained
F: arch/arm/mach-pxa/income.c
F: arch/arm/mach-pxa/include/mach-pxa/income.h
ARM/INTEL IOP32X ARM ARCHITECTURE ARM/INTEL IOP32X ARM ARCHITECTURE
M: Lennert Buytenhek <kernel@wantstofly.org> M: Lennert Buytenhek <kernel@wantstofly.org>
M: Dan Williams <dan.j.williams@intel.com> M: Dan Williams <dan.j.williams@intel.com>
@ -949,8 +956,9 @@ ARM/SHMOBILE ARM ARCHITECTURE
M: Paul Mundt <lethal@linux-sh.org> M: Paul Mundt <lethal@linux-sh.org>
M: Magnus Damm <magnus.damm@gmail.com> M: Magnus Damm <magnus.damm@gmail.com>
L: linux-sh@vger.kernel.org L: linux-sh@vger.kernel.org
T: git git://git.kernel.org/pub/scm/linux/kernel/git/lethal/genesis-2.6.git
W: http://oss.renesas.com W: http://oss.renesas.com
Q: http://patchwork.kernel.org/project/linux-sh/list/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/lethal/genesis-2.6.git
S: Supported S: Supported
F: arch/arm/mach-shmobile/ F: arch/arm/mach-shmobile/
F: drivers/sh/ F: drivers/sh/
@ -1570,6 +1578,16 @@ L: platform-driver-x86@vger.kernel.org
S: Supported S: Supported
F: drivers/platform/x86/classmate-laptop.c F: drivers/platform/x86/classmate-laptop.c
COCCINELLE/Semantic Patches (SmPL)
M: Julia Lawall <julia@diku.dk>
M: Gilles Muller <Gilles.Muller@lip6.fr>
M: Nicolas Palix <npalix@diku.dk>
L: cocci@diku.dk (moderated for non-subscribers)
W: http://coccinelle.lip6.fr/
S: Supported
F: scripts/coccinelle/
F: scripts/coccicheck
CODA FILE SYSTEM CODA FILE SYSTEM
M: Jan Harkes <jaharkes@cs.cmu.edu> M: Jan Harkes <jaharkes@cs.cmu.edu>
M: coda@cs.cmu.edu M: coda@cs.cmu.edu
@ -3267,8 +3285,8 @@ F: fs/autofs4/
KERNEL BUILD + files below scripts/ (unless maintained elsewhere) KERNEL BUILD + files below scripts/ (unless maintained elsewhere)
M: Michal Marek <mmarek@suse.cz> M: Michal Marek <mmarek@suse.cz>
T: git git://repo.or.cz/linux-kbuild.git for-next T: git git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6.git for-next
T: git git://repo.or.cz/linux-kbuild.git for-linus T: git git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6.git rc-fixes
L: linux-kbuild@vger.kernel.org L: linux-kbuild@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/kbuild/ F: Documentation/kbuild/
@ -4732,7 +4750,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/ivd/rt2x00.git
F: drivers/net/wireless/rt2x00/ F: drivers/net/wireless/rt2x00/
RAMDISK RAM BLOCK DEVICE DRIVER RAMDISK RAM BLOCK DEVICE DRIVER
M: Nick Piggin <npiggin@suse.de> M: Nick Piggin <npiggin@kernel.dk>
S: Maintained S: Maintained
F: Documentation/blockdev/ramdisk.txt F: Documentation/blockdev/ramdisk.txt
F: drivers/block/brd.c F: drivers/block/brd.c
@ -5358,7 +5376,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6.git
T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next-2.6.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next-2.6.git
S: Maintained S: Maintained
F: arch/sparc/ F: arch/sparc/
F: drivers/sbus F: drivers/sbus/
SPARC SERIAL DRIVERS SPARC SERIAL DRIVERS
M: "David S. Miller" <davem@davemloft.net> M: "David S. Miller" <davem@davemloft.net>

View File

@ -332,10 +332,9 @@ CHECK = sparse
CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \ CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \
-Wbitwise -Wno-return-void $(CF) -Wbitwise -Wno-return-void $(CF)
MODFLAGS = -DMODULE CFLAGS_MODULE =
CFLAGS_MODULE = $(MODFLAGS) AFLAGS_MODULE =
AFLAGS_MODULE = $(MODFLAGS) LDFLAGS_MODULE =
LDFLAGS_MODULE = -T $(srctree)/scripts/module-common.lds
CFLAGS_KERNEL = CFLAGS_KERNEL =
AFLAGS_KERNEL = AFLAGS_KERNEL =
CFLAGS_GCOV = -fprofile-arcs -ftest-coverage CFLAGS_GCOV = -fprofile-arcs -ftest-coverage
@ -354,7 +353,12 @@ KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
-Werror-implicit-function-declaration \ -Werror-implicit-function-declaration \
-Wno-format-security \ -Wno-format-security \
-fno-delete-null-pointer-checks -fno-delete-null-pointer-checks
KBUILD_AFLAGS_KERNEL :=
KBUILD_CFLAGS_KERNEL :=
KBUILD_AFLAGS := -D__ASSEMBLY__ KBUILD_AFLAGS := -D__ASSEMBLY__
KBUILD_AFLAGS_MODULE := -DMODULE
KBUILD_CFLAGS_MODULE := -DMODULE
KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds
# Read KERNELRELEASE from include/config/kernel.release (if it exists) # Read KERNELRELEASE from include/config/kernel.release (if it exists)
KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null) KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
@ -369,6 +373,8 @@ export HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS LDFLAGS export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS LDFLAGS
export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE CFLAGS_GCOV export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE CFLAGS_GCOV
export KBUILD_AFLAGS AFLAGS_KERNEL AFLAGS_MODULE export KBUILD_AFLAGS AFLAGS_KERNEL AFLAGS_MODULE
export KBUILD_AFLAGS_MODULE KBUILD_CFLAGS_MODULE KBUILD_LDFLAGS_MODULE
export KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNEL
# When compiling out-of-tree modules, put MODVERDIR in the module # When compiling out-of-tree modules, put MODVERDIR in the module
# tree rather than in the kernel tree. The kernel tree might # tree rather than in the kernel tree. The kernel tree might
@ -412,9 +418,9 @@ endif
# of make so .config is not included in this case either (for *config). # of make so .config is not included in this case either (for *config).
no-dot-config-targets := clean mrproper distclean \ no-dot-config-targets := clean mrproper distclean \
cscope TAGS tags help %docs check% \ cscope TAGS tags help %docs check% coccicheck \
include/linux/version.h headers_% \ include/linux/version.h headers_% \
kernelrelease kernelversion kernelversion
config-targets := 0 config-targets := 0
mixed-targets := 0 mixed-targets := 0
@ -526,7 +532,7 @@ endif # $(dot-config)
# The all: target is the default when no target is given on the # The all: target is the default when no target is given on the
# command line. # command line.
# This allow a user to issue only 'make' to build a kernel including modules # This allow a user to issue only 'make' to build a kernel including modules
# Defaults vmlinux but it is usually overridden in the arch makefile # Defaults to vmlinux, but the arch makefile usually adds further targets
all: vmlinux all: vmlinux
ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
@ -557,6 +563,10 @@ KBUILD_CFLAGS += -g
KBUILD_AFLAGS += -gdwarf-2 KBUILD_AFLAGS += -gdwarf-2
endif endif
ifdef CONFIG_DEBUG_INFO_REDUCED
KBUILD_CFLAGS += $(call cc-option, -femit-struct-debug-baseonly)
endif
ifdef CONFIG_FUNCTION_TRACER ifdef CONFIG_FUNCTION_TRACER
KBUILD_CFLAGS += -pg KBUILD_CFLAGS += -pg
endif endif
@ -603,7 +613,7 @@ endif
# Use --build-id when available. # Use --build-id when available.
LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\ LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\
$(call cc-ldoption, -Wl$(comma)--build-id,)) $(call cc-ldoption, -Wl$(comma)--build-id,))
LDFLAGS_MODULE += $(LDFLAGS_BUILD_ID) KBUILD_LDFLAGS_MODULE += $(LDFLAGS_BUILD_ID)
LDFLAGS_vmlinux += $(LDFLAGS_BUILD_ID) LDFLAGS_vmlinux += $(LDFLAGS_BUILD_ID)
ifeq ($(CONFIG_STRIP_ASM_SYMS),y) ifeq ($(CONFIG_STRIP_ASM_SYMS),y)
@ -1209,8 +1219,9 @@ help:
@echo ' includecheck - Check for duplicate included header files' @echo ' includecheck - Check for duplicate included header files'
@echo ' export_report - List the usages of all exported symbols' @echo ' export_report - List the usages of all exported symbols'
@echo ' headers_check - Sanity check on exported headers' @echo ' headers_check - Sanity check on exported headers'
@echo ' headerdep - Detect inclusion cycles in headers'; \ @echo ' headerdep - Detect inclusion cycles in headers'
echo '' @$(MAKE) -f $(srctree)/scripts/Makefile.help checker-help
@echo ''
@echo 'Kernel packaging:' @echo 'Kernel packaging:'
@$(MAKE) $(build)=$(package-dir) help @$(MAKE) $(build)=$(package-dir) help
@echo '' @echo ''
@ -1369,6 +1380,9 @@ versioncheck:
-name '*.[hcS]' -type f -print | sort \ -name '*.[hcS]' -type f -print | sort \
| xargs $(PERL) -w $(srctree)/scripts/checkversion.pl | xargs $(PERL) -w $(srctree)/scripts/checkversion.pl
coccicheck:
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/$@
namespacecheck: namespacecheck:
$(PERL) $(srctree)/scripts/namespace.pl $(PERL) $(srctree)/scripts/namespace.pl
@ -1393,9 +1407,9 @@ checkstack:
$(OBJDUMP) -d vmlinux $$(find . -name '*.ko') | \ $(OBJDUMP) -d vmlinux $$(find . -name '*.ko') | \
$(PERL) $(src)/scripts/checkstack.pl $(CHECKSTACK_ARCH) $(PERL) $(src)/scripts/checkstack.pl $(CHECKSTACK_ARCH)
kernelrelease: kernelrelease: include/config/kernel.release
$(if $(wildcard include/config/kernel.release), $(Q)echo $(KERNELRELEASE), \ @echo $(KERNELRELEASE)
$(error kernelrelease not valid - run 'make prepare' to update it))
kernelversion: kernelversion:
@echo $(KERNELVERSION) @echo $(KERNELVERSION)
@ -1472,6 +1486,7 @@ cmd_crmodverdir = $(Q)mkdir -p $(MODVERDIR) \
$(if $(KBUILD_MODULES),; rm -f $(MODVERDIR)/*) $(if $(KBUILD_MODULES),; rm -f $(MODVERDIR)/*)
a_flags = -Wp,-MD,$(depfile) $(KBUILD_AFLAGS) $(AFLAGS_KERNEL) \ a_flags = -Wp,-MD,$(depfile) $(KBUILD_AFLAGS) $(AFLAGS_KERNEL) \
$(KBUILD_AFLAGS_KERNEL) \
$(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(KBUILD_CPPFLAGS) \ $(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(KBUILD_CPPFLAGS) \
$(modkern_aflags) $(EXTRA_AFLAGS) $(AFLAGS_$(basetarget).o) $(modkern_aflags) $(EXTRA_AFLAGS) $(AFLAGS_$(basetarget).o)

View File

@ -636,6 +636,7 @@ config ARCH_S3C2410
select ARCH_HAS_CPUFREQ select ARCH_HAS_CPUFREQ
select HAVE_CLK select HAVE_CLK
select ARCH_USES_GETTIMEOFFSET select ARCH_USES_GETTIMEOFFSET
select HAVE_S3C2410_I2C
help help
Samsung S3C2410X CPU based systems, such as the Simtec Electronics Samsung S3C2410X CPU based systems, such as the Simtec Electronics
BAST (<http://www.simtec.co.uk/products/EB110ITX/>), the IPAQ 1940 or BAST (<http://www.simtec.co.uk/products/EB110ITX/>), the IPAQ 1940 or
@ -665,6 +666,8 @@ config ARCH_S3C64XX
select S3C_DEV_NAND select S3C_DEV_NAND
select USB_ARCH_HAS_OHCI select USB_ARCH_HAS_OHCI
select SAMSUNG_GPIOLIB_4BIT select SAMSUNG_GPIOLIB_4BIT
select HAVE_S3C2410_I2C
select HAVE_S3C2410_WATCHDOG
help help
Samsung S3C64XX series based systems Samsung S3C64XX series based systems
@ -673,7 +676,10 @@ config ARCH_S5P6440
select CPU_V6 select CPU_V6
select GENERIC_GPIO select GENERIC_GPIO
select HAVE_CLK select HAVE_CLK
select HAVE_S3C2410_WATCHDOG
select ARCH_USES_GETTIMEOFFSET select ARCH_USES_GETTIMEOFFSET
select HAVE_S3C2410_I2C
select HAVE_S3C_RTC
help help
Samsung S5P6440 CPU based systems Samsung S5P6440 CPU based systems
@ -683,6 +689,7 @@ config ARCH_S5P6442
select GENERIC_GPIO select GENERIC_GPIO
select HAVE_CLK select HAVE_CLK
select ARCH_USES_GETTIMEOFFSET select ARCH_USES_GETTIMEOFFSET
select HAVE_S3C2410_WATCHDOG
help help
Samsung S5P6442 CPU based systems Samsung S5P6442 CPU based systems
@ -693,6 +700,9 @@ config ARCH_S5PC100
select CPU_V7 select CPU_V7
select ARM_L1_CACHE_SHIFT_6 select ARM_L1_CACHE_SHIFT_6
select ARCH_USES_GETTIMEOFFSET select ARCH_USES_GETTIMEOFFSET
select HAVE_S3C2410_I2C
select HAVE_S3C_RTC
select HAVE_S3C2410_WATCHDOG
help help
Samsung S5PC100 series based systems Samsung S5PC100 series based systems
@ -703,9 +713,21 @@ config ARCH_S5PV210
select HAVE_CLK select HAVE_CLK
select ARM_L1_CACHE_SHIFT_6 select ARM_L1_CACHE_SHIFT_6
select ARCH_USES_GETTIMEOFFSET select ARCH_USES_GETTIMEOFFSET
select HAVE_S3C2410_I2C
select HAVE_S3C_RTC
select HAVE_S3C2410_WATCHDOG
help help
Samsung S5PV210/S5PC110 series based systems Samsung S5PV210/S5PC110 series based systems
config ARCH_S5PV310
bool "Samsung S5PV310/S5PC210"
select CPU_V7
select GENERIC_GPIO
select HAVE_CLK
select GENERIC_CLOCKEVENTS
help
Samsung S5PV310 series based systems
config ARCH_SHARK config ARCH_SHARK
bool "Shark" bool "Shark"
select CPU_SA110 select CPU_SA110
@ -907,6 +929,8 @@ source "arch/arm/mach-s5pc100/Kconfig"
source "arch/arm/mach-s5pv210/Kconfig" source "arch/arm/mach-s5pv210/Kconfig"
source "arch/arm/mach-s5pv310/Kconfig"
source "arch/arm/mach-shmobile/Kconfig" source "arch/arm/mach-shmobile/Kconfig"
source "arch/arm/plat-stmp3xxx/Kconfig" source "arch/arm/plat-stmp3xxx/Kconfig"
@ -1098,10 +1122,11 @@ config SMP
bool "Symmetric Multi-Processing (EXPERIMENTAL)" bool "Symmetric Multi-Processing (EXPERIMENTAL)"
depends on EXPERIMENTAL && (REALVIEW_EB_ARM11MP || REALVIEW_EB_A9MP ||\ depends on EXPERIMENTAL && (REALVIEW_EB_ARM11MP || REALVIEW_EB_A9MP ||\
MACH_REALVIEW_PB11MP || MACH_REALVIEW_PBX || ARCH_OMAP4 ||\ MACH_REALVIEW_PB11MP || MACH_REALVIEW_PBX || ARCH_OMAP4 ||\
ARCH_U8500 || ARCH_VEXPRESS_CA9X4) ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || ARCH_S5PV310)
depends on GENERIC_CLOCKEVENTS depends on GENERIC_CLOCKEVENTS
select USE_GENERIC_SMP_HELPERS select USE_GENERIC_SMP_HELPERS
select HAVE_ARM_SCU if (ARCH_REALVIEW || ARCH_OMAP4 || ARCH_U8500 || ARCH_VEXPRESS_CA9X4) select HAVE_ARM_SCU if (ARCH_REALVIEW || ARCH_OMAP4 || ARCH_U8500 || ARCH_VEXPRESS_CA9X4 ||\
ARCH_S5PV310)
help help
This enables support for systems with more than one CPU. If you have This enables support for systems with more than one CPU. If you have
a system with only one CPU, like most personal computers, say N. If a system with only one CPU, like most personal computers, say N. If
@ -1171,9 +1196,9 @@ config LOCAL_TIMERS
bool "Use local timer interrupts" bool "Use local timer interrupts"
depends on SMP && (REALVIEW_EB_ARM11MP || MACH_REALVIEW_PB11MP || \ depends on SMP && (REALVIEW_EB_ARM11MP || MACH_REALVIEW_PB11MP || \
REALVIEW_EB_A9MP || MACH_REALVIEW_PBX || ARCH_OMAP4 || \ REALVIEW_EB_A9MP || MACH_REALVIEW_PBX || ARCH_OMAP4 || \
ARCH_U8500 || ARCH_VEXPRESS_CA9X4) ARCH_S5PV310 || ARCH_U8500 || ARCH_VEXPRESS_CA9X4)
default y select HAVE_ARM_TWD if (ARCH_REALVIEW || ARCH_OMAP4 || ARCH_S5PV310 || \
select HAVE_ARM_TWD if (ARCH_REALVIEW || ARCH_VEXPRESS || ARCH_OMAP4 || ARCH_U8500) ARCH_U8500 || ARCH_VEXPRESS)
help help
Enable support for local timers on SMP platforms, rather then the Enable support for local timers on SMP platforms, rather then the
legacy IPI broadcast method. Local timers allows the system legacy IPI broadcast method. Local timers allows the system
@ -1184,7 +1209,8 @@ source kernel/Kconfig.preempt
config HZ config HZ
int int
default 200 if ARCH_EBSA110 || ARCH_S3C2410 || ARCH_S5P6440 || ARCH_S5P6442 || ARCH_S5PV210 default 200 if ARCH_EBSA110 || ARCH_S3C2410 || ARCH_S5P6440 || \
ARCH_S5P6442 || ARCH_S5PV210 || ARCH_S5PV310
default OMAP_32K_TIMER_HZ if ARCH_OMAP && OMAP_32K_TIMER default OMAP_32K_TIMER_HZ if ARCH_OMAP && OMAP_32K_TIMER
default AT91_TIMER_HZ if ARCH_AT91 default AT91_TIMER_HZ if ARCH_AT91
default SHMOBILE_TIMER_HZ if ARCH_SHMOBILE default SHMOBILE_TIMER_HZ if ARCH_SHMOBILE

View File

@ -174,6 +174,7 @@ machine-$(CONFIG_ARCH_S5P6440) := s5p6440
machine-$(CONFIG_ARCH_S5P6442) := s5p6442 machine-$(CONFIG_ARCH_S5P6442) := s5p6442
machine-$(CONFIG_ARCH_S5PC100) := s5pc100 machine-$(CONFIG_ARCH_S5PC100) := s5pc100
machine-$(CONFIG_ARCH_S5PV210) := s5pv210 machine-$(CONFIG_ARCH_S5PV210) := s5pv210
machine-$(CONFIG_ARCH_S5PV310) := s5pv310
machine-$(CONFIG_ARCH_SA1100) := sa1100 machine-$(CONFIG_ARCH_SA1100) := sa1100
machine-$(CONFIG_ARCH_SHARK) := shark machine-$(CONFIG_ARCH_SHARK) := shark
machine-$(CONFIG_ARCH_SHMOBILE) := shmobile machine-$(CONFIG_ARCH_SHMOBILE) := shmobile

View File

@ -33,7 +33,7 @@ ifeq ($(CONFIG_CPU_XSCALE),y)
OBJS += head-xscale.o OBJS += head-xscale.o
endif endif
ifeq ($(CONFIG_PXA_SHARPSL),y) ifeq ($(CONFIG_PXA_SHARPSL_DETECT_MACH_ID),y)
OBJS += head-sharpsl.o OBJS += head-sharpsl.o
endif endif

View File

@ -263,14 +263,6 @@ static int it8152_pci_platform_notify_remove(struct device *dev)
return 0; return 0;
} }
int dma_needs_bounce(struct device *dev, dma_addr_t dma_addr, size_t size)
{
dev_dbg(dev, "%s: dma_addr %08x, size %08x\n",
__func__, dma_addr, size);
return (dev->bus == &pci_bus_type) &&
((dma_addr + size - PHYS_OFFSET) >= SZ_64M);
}
int __init it8152_pci_setup(int nr, struct pci_sys_data *sys) int __init it8152_pci_setup(int nr, struct pci_sys_data *sys)
{ {
it8152_io.start = IT8152_IO_BASE + 0x12000; it8152_io.start = IT8152_IO_BASE + 0x12000;

View File

@ -1,66 +0,0 @@
CONFIG_EXPERIMENTAL=y
CONFIG_SYSFS_DEPRECATED_V2=y
CONFIG_BLK_DEV_INITRD=y
CONFIG_KALLSYMS_ALL=y
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
# CONFIG_BLK_DEV_BSG is not set
CONFIG_ARCH_S5PV210=y
CONFIG_S3C_LOWLEVEL_UART_PORT=1
CONFIG_MACH_SMDKC110=y
CONFIG_VMSPLIT_2G=y
CONFIG_PREEMPT=y
CONFIG_AEABI=y
CONFIG_CMDLINE="root=/dev/ram0 rw ramdisk=8192 initrd=0x20800000,8M console=ttySAC1,115200 init=/linuxrc"
CONFIG_VFP=y
CONFIG_NEON=y
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=8192
# CONFIG_MISC_DEVICES is not set
CONFIG_SCSI=y
CONFIG_BLK_DEV_SD=y
CONFIG_CHR_DEV_SG=y
CONFIG_INPUT_EVDEV=y
# CONFIG_INPUT_KEYBOARD is not set
# CONFIG_INPUT_MOUSE is not set
CONFIG_INPUT_TOUCHSCREEN=y
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_SAMSUNG=y
CONFIG_SERIAL_SAMSUNG_CONSOLE=y
CONFIG_HW_RANDOM=y
# CONFIG_HWMON is not set
# CONFIG_VGA_CONSOLE is not set
# CONFIG_HID_SUPPORT is not set
# CONFIG_USB_SUPPORT is not set
CONFIG_EXT2_FS=y
CONFIG_INOTIFY=y
CONFIG_MSDOS_FS=y
CONFIG_VFAT_FS=y
CONFIG_TMPFS=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_CRAMFS=y
CONFIG_ROMFS_FS=y
CONFIG_PARTITION_ADVANCED=y
CONFIG_BSD_DISKLABEL=y
CONFIG_SOLARIS_X86_PARTITION=y
CONFIG_NLS_CODEPAGE_437=y
CONFIG_NLS_ASCII=y
CONFIG_NLS_ISO8859_1=y
CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_KERNEL=y
# CONFIG_DEBUG_PREEMPT is not set
CONFIG_DEBUG_RT_MUTEXES=y
CONFIG_DEBUG_SPINLOCK=y
CONFIG_DEBUG_MUTEXES=y
CONFIG_DEBUG_SPINLOCK_SLEEP=y
CONFIG_DEBUG_INFO=y
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
CONFIG_SYSCTL_SYSCALL_CHECK=y
CONFIG_DEBUG_USER=y
CONFIG_DEBUG_ERRORS=y
CONFIG_DEBUG_LL=y
CONFIG_EARLY_PRINTK=y
CONFIG_DEBUG_S3C_UART=1
CONFIG_CRC_CCITT=y

View File

@ -7,6 +7,11 @@ CONFIG_MODULE_UNLOAD=y
# CONFIG_BLK_DEV_BSG is not set # CONFIG_BLK_DEV_BSG is not set
CONFIG_ARCH_S5PV210=y CONFIG_ARCH_S5PV210=y
CONFIG_S3C_LOWLEVEL_UART_PORT=1 CONFIG_S3C_LOWLEVEL_UART_PORT=1
CONFIG_S3C_DEV_FB=y
CONFIG_S5PV210_SETUP_FB_24BPP=y
CONFIG_MACH_AQUILA=y
CONFIG_MACH_GONI=y
CONFIG_MACH_SMDKC110=y
CONFIG_MACH_SMDKV210=y CONFIG_MACH_SMDKV210=y
CONFIG_VMSPLIT_2G=y CONFIG_VMSPLIT_2G=y
CONFIG_PREEMPT=y CONFIG_PREEMPT=y

View File

@ -298,7 +298,15 @@ extern void dmabounce_unregister_dev(struct device *);
* DMA access and 1 if the buffer needs to be bounced. * DMA access and 1 if the buffer needs to be bounced.
* *
*/ */
#ifdef CONFIG_SA1111
extern int dma_needs_bounce(struct device*, dma_addr_t, size_t); extern int dma_needs_bounce(struct device*, dma_addr_t, size_t);
#else
static inline int dma_needs_bounce(struct device *dev, dma_addr_t addr,
size_t size)
{
return 0;
}
#endif
/* /*
* The DMA API, implemented by dmabounce.c. See below for descriptions. * The DMA API, implemented by dmabounce.c. See below for descriptions.

View File

@ -22,18 +22,23 @@
#define SCOOP_GPWR 0x24 #define SCOOP_GPWR 0x24
#define SCOOP_GPRR 0x28 #define SCOOP_GPRR 0x28
#define SCOOP_GPCR_PA22 ( 1 << 12 ) #define SCOOP_CPR_OUT (1 << 7)
#define SCOOP_GPCR_PA21 ( 1 << 11 ) #define SCOOP_CPR_SD_3V (1 << 2)
#define SCOOP_GPCR_PA20 ( 1 << 10 ) #define SCOOP_CPR_CF_XV (1 << 1)
#define SCOOP_GPCR_PA19 ( 1 << 9 ) #define SCOOP_CPR_CF_3V (1 << 0)
#define SCOOP_GPCR_PA18 ( 1 << 8 )
#define SCOOP_GPCR_PA17 ( 1 << 7 ) #define SCOOP_GPCR_PA22 (1 << 12)
#define SCOOP_GPCR_PA16 ( 1 << 6 ) #define SCOOP_GPCR_PA21 (1 << 11)
#define SCOOP_GPCR_PA15 ( 1 << 5 ) #define SCOOP_GPCR_PA20 (1 << 10)
#define SCOOP_GPCR_PA14 ( 1 << 4 ) #define SCOOP_GPCR_PA19 (1 << 9)
#define SCOOP_GPCR_PA13 ( 1 << 3 ) #define SCOOP_GPCR_PA18 (1 << 8)
#define SCOOP_GPCR_PA12 ( 1 << 2 ) #define SCOOP_GPCR_PA17 (1 << 7)
#define SCOOP_GPCR_PA11 ( 1 << 1 ) #define SCOOP_GPCR_PA16 (1 << 6)
#define SCOOP_GPCR_PA15 (1 << 5)
#define SCOOP_GPCR_PA14 (1 << 4)
#define SCOOP_GPCR_PA13 (1 << 3)
#define SCOOP_GPCR_PA12 (1 << 2)
#define SCOOP_GPCR_PA11 (1 << 1)
struct scoop_config { struct scoop_config {
unsigned short io_out; unsigned short io_out;

View File

@ -70,11 +70,11 @@ extern int kgdb_fault_expected;
#define _GP_REGS 16 #define _GP_REGS 16
#define _FP_REGS 8 #define _FP_REGS 8
#define _EXTRA_REGS 2 #define _EXTRA_REGS 2
#define GDB_MAX_REGS (_GP_REGS + (_FP_REGS * 3) + _EXTRA_REGS) #define DBG_MAX_REG_NUM (_GP_REGS + (_FP_REGS * 3) + _EXTRA_REGS)
#define KGDB_MAX_NO_CPUS 1 #define KGDB_MAX_NO_CPUS 1
#define BUFMAX 400 #define BUFMAX 400
#define NUMREGBYTES (GDB_MAX_REGS << 2) #define NUMREGBYTES (DBG_MAX_REG_NUM << 2)
#define NUMCRITREGBYTES (32 << 2) #define NUMCRITREGBYTES (32 << 2)
#define _R0 0 #define _R0 0
@ -93,7 +93,7 @@ extern int kgdb_fault_expected;
#define _SPT 13 #define _SPT 13
#define _LR 14 #define _LR 14
#define _PC 15 #define _PC 15
#define _CPSR (GDB_MAX_REGS - 1) #define _CPSR (DBG_MAX_REG_NUM - 1)
/* /*
* So that we can denote the end of a frame for tracing, * So that we can denote the end of a frame for tracing,

View File

@ -10,57 +10,62 @@
* Deepak Saxena <dsaxena@plexity.net> * Deepak Saxena <dsaxena@plexity.net>
*/ */
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/kdebug.h>
#include <linux/kgdb.h> #include <linux/kgdb.h>
#include <asm/traps.h> #include <asm/traps.h>
/* Make a local copy of the registers passed into the handler (bletch) */ struct dbg_reg_def_t dbg_reg_def[DBG_MAX_REG_NUM] =
void pt_regs_to_gdb_regs(unsigned long *gdb_regs, struct pt_regs *kernel_regs)
{ {
int regno; { "r0", 4, offsetof(struct pt_regs, ARM_r0)},
{ "r1", 4, offsetof(struct pt_regs, ARM_r1)},
{ "r2", 4, offsetof(struct pt_regs, ARM_r2)},
{ "r3", 4, offsetof(struct pt_regs, ARM_r3)},
{ "r4", 4, offsetof(struct pt_regs, ARM_r4)},
{ "r5", 4, offsetof(struct pt_regs, ARM_r5)},
{ "r6", 4, offsetof(struct pt_regs, ARM_r6)},
{ "r7", 4, offsetof(struct pt_regs, ARM_r7)},
{ "r8", 4, offsetof(struct pt_regs, ARM_r8)},
{ "r9", 4, offsetof(struct pt_regs, ARM_r9)},
{ "r10", 4, offsetof(struct pt_regs, ARM_r10)},
{ "fp", 4, offsetof(struct pt_regs, ARM_fp)},
{ "ip", 4, offsetof(struct pt_regs, ARM_ip)},
{ "sp", 4, offsetof(struct pt_regs, ARM_sp)},
{ "lr", 4, offsetof(struct pt_regs, ARM_lr)},
{ "pc", 4, offsetof(struct pt_regs, ARM_pc)},
{ "f0", 12, -1 },
{ "f1", 12, -1 },
{ "f2", 12, -1 },
{ "f3", 12, -1 },
{ "f4", 12, -1 },
{ "f5", 12, -1 },
{ "f6", 12, -1 },
{ "f7", 12, -1 },
{ "fps", 4, -1 },
{ "cpsr", 4, offsetof(struct pt_regs, ARM_cpsr)},
};
/* Initialize all to zero. */ char *dbg_get_reg(int regno, void *mem, struct pt_regs *regs)
for (regno = 0; regno < GDB_MAX_REGS; regno++) {
gdb_regs[regno] = 0; if (regno >= DBG_MAX_REG_NUM || regno < 0)
return NULL;
gdb_regs[_R0] = kernel_regs->ARM_r0; if (dbg_reg_def[regno].offset != -1)
gdb_regs[_R1] = kernel_regs->ARM_r1; memcpy(mem, (void *)regs + dbg_reg_def[regno].offset,
gdb_regs[_R2] = kernel_regs->ARM_r2; dbg_reg_def[regno].size);
gdb_regs[_R3] = kernel_regs->ARM_r3; else
gdb_regs[_R4] = kernel_regs->ARM_r4; memset(mem, 0, dbg_reg_def[regno].size);
gdb_regs[_R5] = kernel_regs->ARM_r5; return dbg_reg_def[regno].name;
gdb_regs[_R6] = kernel_regs->ARM_r6;
gdb_regs[_R7] = kernel_regs->ARM_r7;
gdb_regs[_R8] = kernel_regs->ARM_r8;
gdb_regs[_R9] = kernel_regs->ARM_r9;
gdb_regs[_R10] = kernel_regs->ARM_r10;
gdb_regs[_FP] = kernel_regs->ARM_fp;
gdb_regs[_IP] = kernel_regs->ARM_ip;
gdb_regs[_SPT] = kernel_regs->ARM_sp;
gdb_regs[_LR] = kernel_regs->ARM_lr;
gdb_regs[_PC] = kernel_regs->ARM_pc;
gdb_regs[_CPSR] = kernel_regs->ARM_cpsr;
} }
/* Copy local gdb registers back to kgdb regs, for later copy to kernel */ int dbg_set_reg(int regno, void *mem, struct pt_regs *regs)
void gdb_regs_to_pt_regs(unsigned long *gdb_regs, struct pt_regs *kernel_regs)
{ {
kernel_regs->ARM_r0 = gdb_regs[_R0]; if (regno >= DBG_MAX_REG_NUM || regno < 0)
kernel_regs->ARM_r1 = gdb_regs[_R1]; return -EINVAL;
kernel_regs->ARM_r2 = gdb_regs[_R2];
kernel_regs->ARM_r3 = gdb_regs[_R3]; if (dbg_reg_def[regno].offset != -1)
kernel_regs->ARM_r4 = gdb_regs[_R4]; memcpy((void *)regs + dbg_reg_def[regno].offset, mem,
kernel_regs->ARM_r5 = gdb_regs[_R5]; dbg_reg_def[regno].size);
kernel_regs->ARM_r6 = gdb_regs[_R6]; return 0;
kernel_regs->ARM_r7 = gdb_regs[_R7];
kernel_regs->ARM_r8 = gdb_regs[_R8];
kernel_regs->ARM_r9 = gdb_regs[_R9];
kernel_regs->ARM_r10 = gdb_regs[_R10];
kernel_regs->ARM_fp = gdb_regs[_FP];
kernel_regs->ARM_ip = gdb_regs[_IP];
kernel_regs->ARM_sp = gdb_regs[_SPT];
kernel_regs->ARM_lr = gdb_regs[_LR];
kernel_regs->ARM_pc = gdb_regs[_PC];
kernel_regs->ARM_cpsr = gdb_regs[_CPSR];
} }
void void
@ -176,6 +181,33 @@ void kgdb_roundup_cpus(unsigned long flags)
local_irq_disable(); local_irq_disable();
} }
static int __kgdb_notify(struct die_args *args, unsigned long cmd)
{
struct pt_regs *regs = args->regs;
if (kgdb_handle_exception(1, args->signr, cmd, regs))
return NOTIFY_DONE;
return NOTIFY_STOP;
}
static int
kgdb_notify(struct notifier_block *self, unsigned long cmd, void *ptr)
{
unsigned long flags;
int ret;
local_irq_save(flags);
ret = __kgdb_notify(ptr, cmd);
local_irq_restore(flags);
return ret;
}
static struct notifier_block kgdb_notifier = {
.notifier_call = kgdb_notify,
.priority = -INT_MAX,
};
/** /**
* kgdb_arch_init - Perform any architecture specific initalization. * kgdb_arch_init - Perform any architecture specific initalization.
* *
@ -184,6 +216,11 @@ void kgdb_roundup_cpus(unsigned long flags)
*/ */
int kgdb_arch_init(void) int kgdb_arch_init(void)
{ {
int ret = register_die_notifier(&kgdb_notifier);
if (ret != 0)
return ret;
register_undef_hook(&kgdb_brkpt_hook); register_undef_hook(&kgdb_brkpt_hook);
register_undef_hook(&kgdb_compiled_brkpt_hook); register_undef_hook(&kgdb_compiled_brkpt_hook);
@ -200,6 +237,7 @@ void kgdb_arch_exit(void)
{ {
unregister_undef_hook(&kgdb_brkpt_hook); unregister_undef_hook(&kgdb_brkpt_hook);
unregister_undef_hook(&kgdb_compiled_brkpt_hook); unregister_undef_hook(&kgdb_compiled_brkpt_hook);
unregister_die_notifier(&kgdb_notifier);
} }
/* /*

View File

@ -150,9 +150,8 @@ static void __init common_init(void)
MACHINE_START(ASPENITE, "PXA168-based Aspenite Development Platform") MACHINE_START(ASPENITE, "PXA168-based Aspenite Development Platform")
.phys_io = APB_PHYS_BASE, .phys_io = APB_PHYS_BASE,
.boot_params = 0x00000100,
.io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc, .io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc,
.map_io = pxa_map_io, .map_io = mmp_map_io,
.init_irq = pxa168_init_irq, .init_irq = pxa168_init_irq,
.timer = &pxa168_timer, .timer = &pxa168_timer,
.init_machine = common_init, .init_machine = common_init,
@ -160,9 +159,8 @@ MACHINE_END
MACHINE_START(ZYLONITE2, "PXA168-based Zylonite2 Development Platform") MACHINE_START(ZYLONITE2, "PXA168-based Zylonite2 Development Platform")
.phys_io = APB_PHYS_BASE, .phys_io = APB_PHYS_BASE,
.boot_params = 0x00000100,
.io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc, .io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc,
.map_io = pxa_map_io, .map_io = mmp_map_io,
.init_irq = pxa168_init_irq, .init_irq = pxa168_init_irq,
.timer = &pxa168_timer, .timer = &pxa168_timer,
.init_machine = common_init, .init_machine = common_init,

View File

@ -42,9 +42,8 @@ static void __init avengers_lite_init(void)
MACHINE_START(AVENGERS_LITE, "PXA168 Avengers lite Development Platform") MACHINE_START(AVENGERS_LITE, "PXA168 Avengers lite Development Platform")
.phys_io = APB_PHYS_BASE, .phys_io = APB_PHYS_BASE,
.boot_params = 0x00000100,
.io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc, .io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc,
.map_io = pxa_map_io, .map_io = mmp_map_io,
.init_irq = pxa168_init_irq, .init_irq = pxa168_init_irq,
.timer = &pxa168_timer, .timer = &pxa168_timer,
.init_machine = avengers_lite_init, .init_machine = avengers_lite_init,

View File

@ -31,7 +31,7 @@ static struct map_desc standard_io_desc[] __initdata = {
}, },
}; };
void __init pxa_map_io(void) void __init mmp_map_io(void)
{ {
iotable_init(standard_io_desc, ARRAY_SIZE(standard_io_desc)); iotable_init(standard_io_desc, ARRAY_SIZE(standard_io_desc));
} }

View File

@ -3,15 +3,6 @@
struct sys_timer; struct sys_timer;
extern void timer_init(int irq); extern void timer_init(int irq);
extern void mmp2_clear_pmic_int(void);
extern struct sys_timer pxa168_timer;
extern struct sys_timer pxa910_timer;
extern struct sys_timer mmp2_timer;
extern void __init pxa168_init_irq(void);
extern void __init pxa910_init_irq(void);
extern void __init mmp2_init_icu(void);
extern void __init mmp2_init_irq(void);
extern void __init icu_init_irq(void); extern void __init icu_init_irq(void);
extern void __init pxa_map_io(void); extern void __init mmp_map_io(void);

View File

@ -114,9 +114,8 @@ static void __init flint_init(void)
MACHINE_START(FLINT, "Flint Development Platform") MACHINE_START(FLINT, "Flint Development Platform")
.phys_io = APB_PHYS_BASE, .phys_io = APB_PHYS_BASE,
.boot_params = 0x00000100,
.io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc, .io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc,
.map_io = pxa_map_io, .map_io = mmp_map_io,
.init_irq = mmp2_init_irq, .init_irq = mmp2_init_irq,
.timer = &mmp2_timer, .timer = &mmp2_timer,
.init_machine = flint_init, .init_machine = flint_init,

View File

@ -1,3 +1,6 @@
#ifndef __MACH_DEVICE_H
#define __MACH_DEVICE_H
#include <linux/types.h> #include <linux/types.h>
#define MAX_RESOURCE_DMA 2 #define MAX_RESOURCE_DMA 2
@ -47,3 +50,4 @@ struct pxa_device_desc mmp2_device_##_name __initdata = { \
} }
extern int pxa_register_device(struct pxa_device_desc *, void *, size_t); extern int pxa_register_device(struct pxa_device_desc *, void *, size_t);
#endif /* __MACH_DEVICE_H */

View File

@ -1,6 +1,13 @@
#ifndef __ASM_MACH_MMP2_H #ifndef __ASM_MACH_MMP2_H
#define __ASM_MACH_MMP2_H #define __ASM_MACH_MMP2_H
struct sys_timer;
extern struct sys_timer mmp2_timer;
extern void __init mmp2_init_icu(void);
extern void __init mmp2_init_irq(void);
extern void mmp2_clear_pmic_int(void);
#include <linux/i2c.h> #include <linux/i2c.h>
#include <mach/devices.h> #include <mach/devices.h>
#include <plat/i2c.h> #include <plat/i2c.h>

View File

@ -1,6 +1,11 @@
#ifndef __ASM_MACH_PXA168_H #ifndef __ASM_MACH_PXA168_H
#define __ASM_MACH_PXA168_H #define __ASM_MACH_PXA168_H
struct sys_timer;
extern struct sys_timer pxa168_timer;
extern void __init pxa168_init_irq(void);
#include <linux/i2c.h> #include <linux/i2c.h>
#include <mach/devices.h> #include <mach/devices.h>
#include <plat/i2c.h> #include <plat/i2c.h>

View File

@ -1,6 +1,11 @@
#ifndef __ASM_MACH_PXA910_H #ifndef __ASM_MACH_PXA910_H
#define __ASM_MACH_PXA910_H #define __ASM_MACH_PXA910_H
struct sys_timer;
extern struct sys_timer pxa910_timer;
extern void __init pxa910_init_irq(void);
#include <linux/i2c.h> #include <linux/i2c.h>
#include <mach/devices.h> #include <mach/devices.h>
#include <plat/i2c.h> #include <plat/i2c.h>

View File

@ -16,6 +16,7 @@
#include <linux/io.h> #include <linux/io.h>
#include <mach/regs-icu.h> #include <mach/regs-icu.h>
#include <mach/mmp2.h>
#include "common.h" #include "common.h"

View File

@ -135,9 +135,8 @@ static void __init jasper_init(void)
MACHINE_START(MARVELL_JASPER, "Jasper Development Platform") MACHINE_START(MARVELL_JASPER, "Jasper Development Platform")
.phys_io = APB_PHYS_BASE, .phys_io = APB_PHYS_BASE,
.boot_params = 0x00000100,
.io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc, .io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc,
.map_io = pxa_map_io, .map_io = mmp_map_io,
.init_irq = mmp2_init_irq, .init_irq = mmp2_init_irq,
.timer = &mmp2_timer, .timer = &mmp2_timer,
.init_machine = jasper_init, .init_machine = jasper_init,

View File

@ -17,6 +17,7 @@
#include <asm/hardware/cache-tauros2.h> #include <asm/hardware/cache-tauros2.h>
#include <asm/mach/time.h>
#include <mach/addr-map.h> #include <mach/addr-map.h>
#include <mach/regs-apbc.h> #include <mach/regs-apbc.h>
#include <mach/regs-apmu.h> #include <mach/regs-apmu.h>
@ -26,6 +27,7 @@
#include <mach/mfp.h> #include <mach/mfp.h>
#include <mach/gpio.h> #include <mach/gpio.h>
#include <mach/devices.h> #include <mach/devices.h>
#include <mach/mmp2.h>
#include "common.h" #include "common.h"
#include "clock.h" #include "clock.h"
@ -158,6 +160,26 @@ static int __init mmp2_init(void)
} }
postcore_initcall(mmp2_init); postcore_initcall(mmp2_init);
static void __init mmp2_timer_init(void)
{
unsigned long clk_rst;
__raw_writel(APBC_APBCLK | APBC_RST, APBC_MMP2_TIMERS);
/*
* enable bus/functional clock, enable 6.5MHz (divider 4),
* release reset
*/
clk_rst = APBC_APBCLK | APBC_FNCLK | APBC_FNCLKSEL(1);
__raw_writel(clk_rst, APBC_MMP2_TIMERS);
timer_init(IRQ_MMP2_TIMER1);
}
struct sys_timer mmp2_timer = {
.init = mmp2_timer_init,
};
/* on-chip devices */ /* on-chip devices */
MMP2_DEVICE(uart1, "pxa2xx-uart", 0, UART1, 0xd4030000, 0x30, 4, 5); MMP2_DEVICE(uart1, "pxa2xx-uart", 0, UART1, 0xd4030000, 0x30, 4, 5);
MMP2_DEVICE(uart2, "pxa2xx-uart", 1, UART2, 0xd4017000, 0x30, 20, 21); MMP2_DEVICE(uart2, "pxa2xx-uart", 1, UART2, 0xd4017000, 0x30, 20, 21);

View File

@ -100,9 +100,8 @@ static void __init tavorevb_init(void)
MACHINE_START(TAVOREVB, "PXA910 Evaluation Board (aka TavorEVB)") MACHINE_START(TAVOREVB, "PXA910 Evaluation Board (aka TavorEVB)")
.phys_io = APB_PHYS_BASE, .phys_io = APB_PHYS_BASE,
.boot_params = 0x00000100,
.io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc, .io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc,
.map_io = pxa_map_io, .map_io = mmp_map_io,
.init_irq = pxa910_init_irq, .init_irq = pxa910_init_irq,
.timer = &pxa910_timer, .timer = &pxa910_timer,
.init_machine = tavorevb_init, .init_machine = tavorevb_init,

View File

@ -200,24 +200,3 @@ void __init timer_init(int irq)
clocksource_register(&cksrc); clocksource_register(&cksrc);
clockevents_register_device(&ckevt); clockevents_register_device(&ckevt);
} }
static void __init mmp2_timer_init(void)
{
unsigned long clk_rst;
__raw_writel(APBC_APBCLK | APBC_RST, APBC_MMP2_TIMERS);
/*
* enable bus/functional clock, enable 6.5MHz (divider 4),
* release reset
*/
clk_rst = APBC_APBCLK | APBC_FNCLK | APBC_FNCLKSEL(1);
__raw_writel(clk_rst, APBC_MMP2_TIMERS);
timer_init(IRQ_MMP2_TIMER1);
}
struct sys_timer mmp2_timer = {
.init = mmp2_timer_init,
};

View File

@ -123,9 +123,8 @@ static void __init ttc_dkb_init(void)
MACHINE_START(TTC_DKB, "PXA910-based TTC_DKB Development Platform") MACHINE_START(TTC_DKB, "PXA910-based TTC_DKB Development Platform")
.phys_io = APB_PHYS_BASE, .phys_io = APB_PHYS_BASE,
.boot_params = 0x00000100,
.io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc, .io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc,
.map_io = pxa_map_io, .map_io = mmp_map_io,
.init_irq = pxa910_init_irq, .init_irq = pxa910_init_irq,
.timer = &pxa910_timer, .timer = &pxa910_timer,
.init_machine = ttc_dkb_init, .init_machine = ttc_dkb_init,

View File

@ -238,6 +238,17 @@ config MACH_COLIBRI
bool "Toradex Colibri PXA270" bool "Toradex Colibri PXA270"
select PXA27x select PXA27x
config MACH_COLIBRI_PXA270_EVALBOARD
bool "Toradex Colibri Evaluation Carrier Board support (PXA270)"
depends on MACH_COLIBRI
config MACH_COLIBRI_PXA270_INCOME
bool "Income s.r.o. PXA270 SBC"
depends on MACH_COLIBRI
select PXA27x
select HAVE_PWM
select PXA_HAVE_BOARD_IRQS
config MACH_COLIBRI300 config MACH_COLIBRI300
bool "Toradex Colibri PXA300/310" bool "Toradex Colibri PXA300/310"
select PXA3xx select PXA3xx
@ -336,6 +347,9 @@ config ARCH_PXA_PALM
bool "PXA based Palm PDAs" bool "PXA based Palm PDAs"
select HAVE_PWM select HAVE_PWM
config MACH_PALM27X
bool
config MACH_PALMTE2 config MACH_PALMTE2
bool "Palm Tungsten|E2" bool "Palm Tungsten|E2"
default y default y
@ -360,6 +374,7 @@ config MACH_PALMT5
depends on ARCH_PXA_PALM depends on ARCH_PXA_PALM
select PXA27x select PXA27x
select IWMMXT select IWMMXT
select MACH_PALM27X
help help
Say Y here if you intend to run this kernel on a Palm Tungsten|T5 Say Y here if you intend to run this kernel on a Palm Tungsten|T5
handheld computer. handheld computer.
@ -370,6 +385,7 @@ config MACH_PALMTX
depends on ARCH_PXA_PALM depends on ARCH_PXA_PALM
select PXA27x select PXA27x
select IWMMXT select IWMMXT
select MACH_PALM27X
help help
Say Y here if you intend to run this kernel on a Palm T|X Say Y here if you intend to run this kernel on a Palm T|X
handheld computer. handheld computer.
@ -380,6 +396,7 @@ config MACH_PALMZ72
depends on ARCH_PXA_PALM depends on ARCH_PXA_PALM
select PXA27x select PXA27x
select IWMMXT select IWMMXT
select MACH_PALM27X
help help
Say Y here if you intend to run this kernel on Palm Zire 72 Say Y here if you intend to run this kernel on Palm Zire 72
handheld computer. handheld computer.
@ -390,6 +407,7 @@ config MACH_PALMLD
depends on ARCH_PXA_PALM depends on ARCH_PXA_PALM
select PXA27x select PXA27x
select IWMMXT select IWMMXT
select MACH_PALM27X
help help
Say Y here if you intend to run this kernel on a Palm LifeDrive Say Y here if you intend to run this kernel on a Palm LifeDrive
handheld computer. handheld computer.
@ -447,16 +465,13 @@ config PXA_SHARPSL
SL-C3000 (Spitz), SL-C3100 (Borzoi) or SL-C6000x (Tosa) SL-C3000 (Spitz), SL-C3100 (Borzoi) or SL-C6000x (Tosa)
handheld computer. handheld computer.
config SHARPSL_PM config PXA_SHARPSL_DETECT_MACH_ID
bool bool "Detect machine ID at run-time in the decompressor"
select APM_EMULATION depends on PXA_SHARPSL
select SHARPSL_PM_MAX1111 help
Say Y here if you want the zImage decompressor to detect
config SHARPSL_PM_MAX1111 the Zaurus machine ID at run-time. For latest kexec-based
bool boot loader, this is not necessary.
depends on !CORGI_SSP_DEPRECATED
select HWMON
select SENSORS_MAX1111
config MACH_POODLE config MACH_POODLE
bool "Enable Sharp SL-5600 (Poodle) Support" bool "Enable Sharp SL-5600 (Poodle) Support"
@ -510,6 +525,25 @@ config MACH_TOSA
select PXA25x select PXA25x
select PXA_HAVE_BOARD_IRQS select PXA_HAVE_BOARD_IRQS
config TOSA_BT
tristate "Control the state of built-in bluetooth chip on Sharp SL-6000"
depends on MACH_TOSA
select RFKILL
help
This is a simple driver that is able to control
the state of built in bluetooth chip on tosa.
config TOSA_USE_EXT_KEYCODES
bool "Tosa keyboard: use extended keycodes"
depends on MACH_TOSA
default n
help
Say Y here to enable the tosa keyboard driver to generate extended
(>= 127) keycodes. Be aware, that they can't be correctly interpreted
by either console keyboard driver or by Kdrive keybd driver.
Say Y only if you know, what you are doing!
config MACH_ICONTROL config MACH_ICONTROL
bool "TMT iControl/SafeTCam based on the MXM-8x10 CoM" bool "TMT iControl/SafeTCam based on the MXM-8x10 CoM"
select CPU_PXA320 select CPU_PXA320
@ -648,25 +682,15 @@ config PXA_SHARP_Cxx00
help help
Enable common support for Sharp Cxx00 models Enable common support for Sharp Cxx00 models
config TOSA_BT config SHARPSL_PM
tristate "Control the state of built-in bluetooth chip on Sharp SL-6000" bool
depends on MACH_TOSA select APM_EMULATION
select RFKILL select SHARPSL_PM_MAX1111
help
This is a simple driver that is able to control
the state of built in bluetooth chip on tosa.
config TOSA_USE_EXT_KEYCODES
bool "Tosa keyboard: use extended keycodes"
depends on MACH_TOSA
default n
help
Say Y here to enable the tosa keyboard driver to generate extended
(>= 127) keycodes. Be aware, that they can't be correctly interpreted
by either console keyboard driver or by Kdrive keybd driver.
Say Y only if you know, what you are doing!
config SHARPSL_PM_MAX1111
bool
select HWMON
select SENSORS_MAX1111
config PXA_HAVE_BOARD_IRQS config PXA_HAVE_BOARD_IRQS
bool bool

View File

@ -51,14 +51,16 @@ obj-$(CONFIG_MACH_CAPC7117) += capc7117.o mxm8x10.o
obj-$(CONFIG_ARCH_GUMSTIX) += gumstix.o obj-$(CONFIG_ARCH_GUMSTIX) += gumstix.o
obj-$(CONFIG_GUMSTIX_AM200EPD) += am200epd.o obj-$(CONFIG_GUMSTIX_AM200EPD) += am200epd.o
obj-$(CONFIG_GUMSTIX_AM300EPD) += am300epd.o obj-$(CONFIG_GUMSTIX_AM300EPD) += am300epd.o
obj-$(CONFIG_MACH_INTELMOTE2) += imote2.o obj-$(CONFIG_MACH_INTELMOTE2) += stargate2.o
obj-$(CONFIG_MACH_STARGATE2) += stargate2.o obj-$(CONFIG_MACH_STARGATE2) += stargate2.o
obj-$(CONFIG_MACH_XCEP) += xcep.o obj-$(CONFIG_MACH_XCEP) += xcep.o
obj-$(CONFIG_MACH_TRIZEPS4) += trizeps4.o obj-$(CONFIG_MACH_TRIZEPS4) += trizeps4.o
obj-$(CONFIG_MACH_LOGICPD_PXA270) += lpd270.o obj-$(CONFIG_MACH_LOGICPD_PXA270) += lpd270.o
obj-$(CONFIG_MACH_PCM027) += pcm027.o obj-$(CONFIG_MACH_PCM027) += pcm027.o
obj-$(CONFIG_MACH_PCM990_BASEBOARD) += pcm990-baseboard.o obj-$(CONFIG_MACH_PCM990_BASEBOARD) += pcm990-baseboard.o
obj-$(CONFIG_MACH_COLIBRI) += colibri-pxa270.o obj-$(CONFIG_MACH_COLIBRI) += colibri-pxa270.o
obj-$(CONFIG_MACH_COLIBRI_PXA270_EVALBOARD) += colibri-pxa270-evalboard.o
obj-$(CONFIG_MACH_COLIBRI_PXA270_INCOME) += colibri-pxa270-income.o
obj-$(CONFIG_MACH_COLIBRI300) += colibri-pxa3xx.o colibri-pxa300.o obj-$(CONFIG_MACH_COLIBRI300) += colibri-pxa3xx.o colibri-pxa300.o
obj-$(CONFIG_MACH_COLIBRI320) += colibri-pxa3xx.o colibri-pxa320.o obj-$(CONFIG_MACH_COLIBRI320) += colibri-pxa3xx.o colibri-pxa320.o
obj-$(CONFIG_MACH_VPAC270) += vpac270.o obj-$(CONFIG_MACH_VPAC270) += vpac270.o
@ -73,6 +75,7 @@ obj-$(CONFIG_PXA_EZX) += ezx.o
obj-$(CONFIG_MACH_MP900C) += mp900.o obj-$(CONFIG_MACH_MP900C) += mp900.o
obj-$(CONFIG_MACH_PALMTE2) += palmte2.o obj-$(CONFIG_MACH_PALMTE2) += palmte2.o
obj-$(CONFIG_MACH_PALMTC) += palmtc.o obj-$(CONFIG_MACH_PALMTC) += palmtc.o
obj-$(CONFIG_MACH_PALM27X) += palm27x.o
obj-$(CONFIG_MACH_PALMT5) += palmt5.o obj-$(CONFIG_MACH_PALMT5) += palmt5.o
obj-$(CONFIG_MACH_PALMTX) += palmtx.o obj-$(CONFIG_MACH_PALMTX) += palmtx.o
obj-$(CONFIG_MACH_PALMZ72) += palmz72.o obj-$(CONFIG_MACH_PALMZ72) += palmz72.o
@ -84,12 +87,6 @@ obj-$(CONFIG_MACH_POODLE) += poodle.o
obj-$(CONFIG_MACH_TOSA) += tosa.o obj-$(CONFIG_MACH_TOSA) += tosa.o
obj-$(CONFIG_MACH_ICONTROL) += icontrol.o mxm8x10.o obj-$(CONFIG_MACH_ICONTROL) += icontrol.o mxm8x10.o
obj-$(CONFIG_ARCH_PXA_ESERIES) += eseries.o obj-$(CONFIG_ARCH_PXA_ESERIES) += eseries.o
obj-$(CONFIG_MACH_E330) += e330.o
obj-$(CONFIG_MACH_E350) += e350.o
obj-$(CONFIG_MACH_E740) += e740.o
obj-$(CONFIG_MACH_E750) += e750.o
obj-$(CONFIG_MACH_E400) += e400.o
obj-$(CONFIG_MACH_E800) += e800.o
obj-$(CONFIG_MACH_RAUMFELD_RC) += raumfeld.o obj-$(CONFIG_MACH_RAUMFELD_RC) += raumfeld.o
obj-$(CONFIG_MACH_RAUMFELD_CONNECTOR) += raumfeld.o obj-$(CONFIG_MACH_RAUMFELD_CONNECTOR) += raumfeld.o
obj-$(CONFIG_MACH_RAUMFELD_SPEAKER) += raumfeld.o obj-$(CONFIG_MACH_RAUMFELD_SPEAKER) += raumfeld.o

View File

@ -22,9 +22,14 @@
#include <linux/fb.h> #include <linux/fb.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/ucb1400.h>
#include <linux/mtd/mtd.h> #include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h> #include <linux/mtd/partitions.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/i2c/pcf857x.h>
#include <linux/mtd/nand.h>
#include <linux/mtd/physmap.h>
#include <linux/regulator/max1586.h>
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
@ -51,6 +56,59 @@
#include "generic.h" #include "generic.h"
#include "devices.h" #include "devices.h"
/******************************************************************************
* Pin configuration
******************************************************************************/
static unsigned long balloon3_pin_config[] __initdata = {
/* Select BTUART 'COM1/ttyS0' as IO option for pins 42/43/44/45 */
GPIO42_BTUART_RXD,
GPIO43_BTUART_TXD,
GPIO44_BTUART_CTS,
GPIO45_BTUART_RTS,
/* Reset, configured as GPIO wakeup source */
GPIO1_GPIO | WAKEUP_ON_EDGE_BOTH,
/* LEDs */
GPIO9_GPIO, /* NAND activity LED */
GPIO10_GPIO, /* Heartbeat LED */
/* AC97 */
GPIO28_AC97_BITCLK,
GPIO29_AC97_SDATA_IN_0,
GPIO30_AC97_SDATA_OUT,
GPIO31_AC97_SYNC,
GPIO113_AC97_nRESET,
GPIO95_GPIO,
/* MMC */
GPIO32_MMC_CLK,
GPIO92_MMC_DAT_0,
GPIO109_MMC_DAT_1,
GPIO110_MMC_DAT_2,
GPIO111_MMC_DAT_3,
GPIO112_MMC_CMD,
/* USB Host */
GPIO88_USBH1_PWR,
GPIO89_USBH1_PEN,
/* PC Card */
GPIO48_nPOE,
GPIO49_nPWE,
GPIO50_nPIOR,
GPIO51_nPIOW,
GPIO85_nPCE_1,
GPIO54_nPCE_2,
GPIO79_PSKTSEL,
GPIO55_nPREG,
GPIO56_nPWAIT,
GPIO57_nIOIS16,
};
/******************************************************************************
* Compatibility: Parameter parsing
******************************************************************************/
static unsigned long balloon3_irq_enabled; static unsigned long balloon3_irq_enabled;
static unsigned long balloon3_features_present = static unsigned long balloon3_features_present =
@ -73,6 +131,321 @@ int __init parse_balloon3_features(char *arg)
} }
early_param("balloon3_features", parse_balloon3_features); early_param("balloon3_features", parse_balloon3_features);
/******************************************************************************
* NOR Flash
******************************************************************************/
#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
static struct mtd_partition balloon3_nor_partitions[] = {
{
.name = "Flash",
.offset = 0x00000000,
.size = MTDPART_SIZ_FULL,
}
};
static struct physmap_flash_data balloon3_flash_data[] = {
{
.width = 2, /* bankwidth in bytes */
.parts = balloon3_nor_partitions,
.nr_parts = ARRAY_SIZE(balloon3_nor_partitions)
}
};
static struct resource balloon3_flash_resource = {
.start = PXA_CS0_PHYS,
.end = PXA_CS0_PHYS + SZ_64M - 1,
.flags = IORESOURCE_MEM,
};
static struct platform_device balloon3_flash = {
.name = "physmap-flash",
.id = 0,
.resource = &balloon3_flash_resource,
.num_resources = 1,
.dev = {
.platform_data = balloon3_flash_data,
},
};
static void __init balloon3_nor_init(void)
{
platform_device_register(&balloon3_flash);
}
#else
static inline void balloon3_nor_init(void) {}
#endif
/******************************************************************************
* Audio and Touchscreen
******************************************************************************/
#if defined(CONFIG_TOUCHSCREEN_UCB1400) || \
defined(CONFIG_TOUCHSCREEN_UCB1400_MODULE)
static struct ucb1400_pdata vpac270_ucb1400_pdata = {
.irq = IRQ_GPIO(BALLOON3_GPIO_CODEC_IRQ),
};
static struct platform_device balloon3_ucb1400_device = {
.name = "ucb1400_core",
.id = -1,
.dev = {
.platform_data = &vpac270_ucb1400_pdata,
},
};
static void __init balloon3_ts_init(void)
{
if (!balloon3_has(BALLOON3_FEATURE_AUDIO))
return;
pxa_set_ac97_info(NULL);
platform_device_register(&balloon3_ucb1400_device);
}
#else
static inline void balloon3_ts_init(void) {}
#endif
/******************************************************************************
* Framebuffer
******************************************************************************/
#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
static struct pxafb_mode_info balloon3_lcd_modes[] = {
{
.pixclock = 38000,
.xres = 480,
.yres = 640,
.bpp = 16,
.hsync_len = 8,
.left_margin = 8,
.right_margin = 8,
.vsync_len = 2,
.upper_margin = 4,
.lower_margin = 5,
.sync = 0,
},
};
static struct pxafb_mach_info balloon3_lcd_screen = {
.modes = balloon3_lcd_modes,
.num_modes = ARRAY_SIZE(balloon3_lcd_modes),
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
};
static void balloon3_backlight_power(int on)
{
gpio_set_value(BALLOON3_GPIO_RUN_BACKLIGHT, on);
}
static void __init balloon3_lcd_init(void)
{
int ret;
if (!balloon3_has(BALLOON3_FEATURE_TOPPOLY))
return;
ret = gpio_request(BALLOON3_GPIO_RUN_BACKLIGHT, "BKL-ON");
if (ret) {
pr_err("Requesting BKL-ON GPIO failed!\n");
goto err;
}
ret = gpio_direction_output(BALLOON3_GPIO_RUN_BACKLIGHT, 1);
if (ret) {
pr_err("Setting BKL-ON GPIO direction failed!\n");
goto err2;
}
balloon3_lcd_screen.pxafb_backlight_power = balloon3_backlight_power;
set_pxa_fb_info(&balloon3_lcd_screen);
return;
err2:
gpio_free(BALLOON3_GPIO_RUN_BACKLIGHT);
err:
return;
}
#else
static inline void balloon3_lcd_init(void) {}
#endif
/******************************************************************************
* SD/MMC card controller
******************************************************************************/
#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
static struct pxamci_platform_data balloon3_mci_platform_data = {
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
.gpio_card_detect = -1,
.gpio_card_ro = -1,
.gpio_power = -1,
.detect_delay_ms = 200,
};
static void __init balloon3_mmc_init(void)
{
pxa_set_mci_info(&balloon3_mci_platform_data);
}
#else
static inline void balloon3_mmc_init(void) {}
#endif
/******************************************************************************
* USB Gadget
******************************************************************************/
#if defined(CONFIG_USB_GADGET_PXA27X)||defined(CONFIG_USB_GADGET_PXA27X_MODULE)
static void balloon3_udc_command(int cmd)
{
if (cmd == PXA2XX_UDC_CMD_CONNECT)
UP2OCR |= UP2OCR_DPPUE | UP2OCR_DPPUBE;
else if (cmd == PXA2XX_UDC_CMD_DISCONNECT)
UP2OCR &= ~UP2OCR_DPPUE;
}
static int balloon3_udc_is_connected(void)
{
return 1;
}
static struct pxa2xx_udc_mach_info balloon3_udc_info __initdata = {
.udc_command = balloon3_udc_command,
.udc_is_connected = balloon3_udc_is_connected,
.gpio_pullup = -1,
};
static void __init balloon3_udc_init(void)
{
pxa_set_udc_info(&balloon3_udc_info);
platform_device_register(&balloon3_gpio_vbus);
}
#else
static inline void balloon3_udc_init(void) {}
#endif
/******************************************************************************
* IrDA
******************************************************************************/
#if defined(CONFIG_IRDA) || defined(CONFIG_IRDA_MODULE)
static struct pxaficp_platform_data balloon3_ficp_platform_data = {
.transceiver_cap = IR_FIRMODE | IR_SIRMODE | IR_OFF,
};
static void __init balloon3_irda_init(void)
{
pxa_set_ficp_info(&balloon3_ficp_platform_data);
}
#else
static inline void balloon3_irda_init(void) {}
#endif
/******************************************************************************
* USB Host
******************************************************************************/
#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
static struct pxaohci_platform_data balloon3_ohci_info = {
.port_mode = PMM_PERPORT_MODE,
.flags = ENABLE_PORT_ALL | POWER_CONTROL_LOW | POWER_SENSE_LOW,
};
static void __init balloon3_uhc_init(void)
{
if (!balloon3_has(BALLOON3_FEATURE_OHCI))
return;
pxa_set_ohci_info(&balloon3_ohci_info);
}
#else
static inline void balloon3_uhc_init(void) {}
#endif
/******************************************************************************
* LEDs
******************************************************************************/
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
struct gpio_led balloon3_gpio_leds[] = {
{
.name = "balloon3:green:idle",
.default_trigger = "heartbeat",
.gpio = BALLOON3_GPIO_LED_IDLE,
.active_low = 1,
}, {
.name = "balloon3:green:nand",
.default_trigger = "nand-disk",
.gpio = BALLOON3_GPIO_LED_NAND,
.active_low = 1,
},
};
static struct gpio_led_platform_data balloon3_gpio_led_info = {
.leds = balloon3_gpio_leds,
.num_leds = ARRAY_SIZE(balloon3_gpio_leds),
};
static struct platform_device balloon3_leds = {
.name = "leds-gpio",
.id = 0,
.dev = {
.platform_data = &balloon3_gpio_led_info,
}
};
struct gpio_led balloon3_pcf_gpio_leds[] = {
{
.name = "balloon3:green:led0",
.gpio = BALLOON3_PCF_GPIO_LED0,
.active_low = 1,
}, {
.name = "balloon3:green:led1",
.gpio = BALLOON3_PCF_GPIO_LED1,
.active_low = 1,
}, {
.name = "balloon3:orange:led2",
.gpio = BALLOON3_PCF_GPIO_LED2,
.active_low = 1,
}, {
.name = "balloon3:orange:led3",
.gpio = BALLOON3_PCF_GPIO_LED3,
.active_low = 1,
}, {
.name = "balloon3:orange:led4",
.gpio = BALLOON3_PCF_GPIO_LED4,
.active_low = 1,
}, {
.name = "balloon3:orange:led5",
.gpio = BALLOON3_PCF_GPIO_LED5,
.active_low = 1,
}, {
.name = "balloon3:red:led6",
.gpio = BALLOON3_PCF_GPIO_LED6,
.active_low = 1,
}, {
.name = "balloon3:red:led7",
.gpio = BALLOON3_PCF_GPIO_LED7,
.active_low = 1,
},
};
static struct gpio_led_platform_data balloon3_pcf_gpio_led_info = {
.leds = balloon3_pcf_gpio_leds,
.num_leds = ARRAY_SIZE(balloon3_pcf_gpio_leds),
};
static struct platform_device balloon3_pcf_leds = {
.name = "leds-gpio",
.id = 1,
.dev = {
.platform_data = &balloon3_pcf_gpio_led_info,
}
};
static void __init balloon3_leds_init(void)
{
platform_device_register(&balloon3_leds);
platform_device_register(&balloon3_pcf_leds);
}
#else
static inline void balloon3_leds_init(void) {}
#endif
/******************************************************************************
* FPGA IRQ
******************************************************************************/
static void balloon3_mask_irq(unsigned int irq) static void balloon3_mask_irq(unsigned int irq)
{ {
int balloon3_irq = (irq - BALLOON3_IRQ(0)); int balloon3_irq = (irq - BALLOON3_IRQ(0));
@ -98,7 +471,6 @@ static void balloon3_irq_handler(unsigned int irq, struct irq_desc *desc)
{ {
unsigned long pending = __raw_readl(BALLOON3_INT_CONTROL_REG) & unsigned long pending = __raw_readl(BALLOON3_INT_CONTROL_REG) &
balloon3_irq_enabled; balloon3_irq_enabled;
do { do {
/* clear useless edge notification */ /* clear useless edge notification */
if (desc->chip->ack) if (desc->chip->ack)
@ -132,201 +504,259 @@ static void __init balloon3_init_irq(void)
"enabled\n", __func__, BALLOON3_AUX_NIRQ); "enabled\n", __func__, BALLOON3_AUX_NIRQ);
} }
static unsigned long balloon3_ac97_pin_config[] = { /******************************************************************************
GPIO28_AC97_BITCLK, * GPIO expander
GPIO29_AC97_SDATA_IN_0, ******************************************************************************/
GPIO30_AC97_SDATA_OUT, #if defined(CONFIG_GPIO_PCF857X) || defined(CONFIG_GPIO_PCF857X_MODULE)
GPIO31_AC97_SYNC, static struct pcf857x_platform_data balloon3_pcf857x_pdata = {
GPIO113_AC97_nRESET, .gpio_base = BALLOON3_PCF_GPIO_BASE,
.n_latch = 0,
.setup = NULL,
.teardown = NULL,
.context = NULL,
}; };
static void balloon3_backlight_power(int on) static struct i2c_board_info __initdata balloon3_i2c_devs[] = {
{
pr_debug("%s: power is %s\n", __func__, on ? "on" : "off");
gpio_set_value(BALLOON3_GPIO_RUN_BACKLIGHT, on);
}
static unsigned long balloon3_lcd_pin_config[] = {
/* LCD - 16bpp Active TFT */
GPIOxx_LCD_TFT_16BPP,
GPIO99_GPIO, /* Backlight */
};
static struct pxafb_mode_info balloon3_lcd_modes[] = {
{ {
.pixclock = 38000, I2C_BOARD_INFO("pcf8574a", 0x38),
.xres = 480, .platform_data = &balloon3_pcf857x_pdata,
.yres = 640,
.bpp = 16,
.hsync_len = 8,
.left_margin = 8,
.right_margin = 8,
.vsync_len = 2,
.upper_margin = 4,
.lower_margin = 5,
.sync = 0,
}, },
}; };
static struct pxafb_mach_info balloon3_pxafb_info = { static void __init balloon3_i2c_init(void)
.modes = balloon3_lcd_modes,
.num_modes = ARRAY_SIZE(balloon3_lcd_modes),
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
.pxafb_backlight_power = balloon3_backlight_power,
};
static unsigned long balloon3_mmc_pin_config[] = {
GPIO32_MMC_CLK,
GPIO92_MMC_DAT_0,
GPIO109_MMC_DAT_1,
GPIO110_MMC_DAT_2,
GPIO111_MMC_DAT_3,
GPIO112_MMC_CMD,
};
static void balloon3_mci_setpower(struct device *dev, unsigned int vdd)
{ {
struct pxamci_platform_data *p_d = dev->platform_data; pxa_set_i2c_info(NULL);
i2c_register_board_info(0, ARRAY_AND_SIZE(balloon3_i2c_devs));
}
#else
static inline void balloon3_i2c_init(void) {}
#endif
if ((1 << vdd) & p_d->ocr_mask) { /******************************************************************************
pr_debug("%s: on\n", __func__); * NAND
/* FIXME something to prod here? */ ******************************************************************************/
} else { #if defined(CONFIG_MTD_NAND_PLATFORM)||defined(CONFIG_MTD_NAND_PLATFORM_MODULE)
pr_debug("%s: off\n", __func__); static uint16_t balloon3_ctl =
/* FIXME something to prod here? */ BALLOON3_NAND_CONTROL_FLCE0 | BALLOON3_NAND_CONTROL_FLCE1 |
BALLOON3_NAND_CONTROL_FLCE2 | BALLOON3_NAND_CONTROL_FLCE3 |
BALLOON3_NAND_CONTROL_FLWP;
static void balloon3_nand_cmd_ctl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
{
struct nand_chip *this = mtd->priv;
if (ctrl & NAND_CTRL_CHANGE) {
if (ctrl & NAND_CLE)
balloon3_ctl |= BALLOON3_NAND_CONTROL_FLCLE;
else
balloon3_ctl &= ~BALLOON3_NAND_CONTROL_FLCLE;
if (ctrl & NAND_ALE)
balloon3_ctl |= BALLOON3_NAND_CONTROL_FLALE;
else
balloon3_ctl &= ~BALLOON3_NAND_CONTROL_FLALE;
__raw_writel(balloon3_ctl, BALLOON3_NAND_CONTROL_REG);
} }
if (cmd != NAND_CMD_NONE)
writeb(cmd, this->IO_ADDR_W);
} }
static struct pxamci_platform_data balloon3_mci_platform_data = { static void balloon3_nand_select_chip(struct mtd_info *mtd, int chip)
.ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, {
.setpower = balloon3_mci_setpower, if (chip < 0 || chip > 3)
return;
balloon3_ctl |= BALLOON3_NAND_CONTROL_FLCE0 |
BALLOON3_NAND_CONTROL_FLCE1 |
BALLOON3_NAND_CONTROL_FLCE2 |
BALLOON3_NAND_CONTROL_FLCE3;
/* Deassert correct nCE line */
balloon3_ctl &= ~(BALLOON3_NAND_CONTROL_FLCE0 << chip);
__raw_writew(balloon3_ctl, BALLOON3_NAND_CONTROL_REG);
}
static int balloon3_nand_probe(struct platform_device *pdev)
{
void __iomem *temp_map;
uint16_t ver;
int ret;
__raw_writew(BALLOON3_NAND_CONTROL2_16BIT, BALLOON3_NAND_CONTROL2_REG);
ver = __raw_readw(BALLOON3_FPGA_VER);
if (ver > 0x0201)
pr_warn("The FPGA code, version 0x%04x, is newer than rel-0.3. "
"NAND support might be broken in this version!", ver);
/* Power up the NAND chips */
ret = gpio_request(BALLOON3_GPIO_RUN_NAND, "NAND");
if (ret)
goto err1;
ret = gpio_direction_output(BALLOON3_GPIO_RUN_NAND, 1);
if (ret)
goto err2;
gpio_set_value(BALLOON3_GPIO_RUN_NAND, 1);
/* Deassert all nCE lines and write protect line */
__raw_writel(balloon3_ctl, BALLOON3_NAND_CONTROL_REG);
return 0;
err2:
gpio_free(BALLOON3_GPIO_RUN_NAND);
err1:
return ret;
}
static void balloon3_nand_remove(struct platform_device *pdev)
{
/* Power down the NAND chips */
gpio_set_value(BALLOON3_GPIO_RUN_NAND, 0);
gpio_free(BALLOON3_GPIO_RUN_NAND);
}
static struct mtd_partition balloon3_partition_info[] = {
[0] = {
.name = "Boot",
.offset = 0,
.size = SZ_4M,
},
[1] = {
.name = "RootFS",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL
},
}; };
static int balloon3_udc_is_connected(void) static const char *balloon3_part_probes[] = { "cmdlinepart", NULL };
{
pr_debug("%s: udc connected\n", __func__);
return 1;
}
static void balloon3_udc_command(int cmd) struct platform_nand_data balloon3_nand_pdata = {
{ .chip = {
switch (cmd) { .nr_chips = 4,
case PXA2XX_UDC_CMD_CONNECT: .chip_offset = 0,
UP2OCR |= (UP2OCR_DPPUE + UP2OCR_DPPUBE); .nr_partitions = ARRAY_SIZE(balloon3_partition_info),
pr_debug("%s: connect\n", __func__); .partitions = balloon3_partition_info,
break; .chip_delay = 50,
case PXA2XX_UDC_CMD_DISCONNECT: .part_probe_types = balloon3_part_probes,
UP2OCR &= ~UP2OCR_DPPUE; },
pr_debug("%s: disconnect\n", __func__); .ctrl = {
break; .hwcontrol = 0,
.dev_ready = 0,
.select_chip = balloon3_nand_select_chip,
.cmd_ctrl = balloon3_nand_cmd_ctl,
.probe = balloon3_nand_probe,
.remove = balloon3_nand_remove,
},
};
static struct resource balloon3_nand_resource[] = {
[0] = {
.start = BALLOON3_NAND_BASE,
.end = BALLOON3_NAND_BASE + 0x4,
.flags = IORESOURCE_MEM,
},
};
static struct platform_device balloon3_nand = {
.name = "gen_nand",
.num_resources = ARRAY_SIZE(balloon3_nand_resource),
.resource = balloon3_nand_resource,
.id = -1,
.dev = {
.platform_data = &balloon3_nand_pdata,
} }
};
static void __init balloon3_nand_init(void)
{
platform_device_register(&balloon3_nand);
} }
#else
static inline void balloon3_nand_init(void) {}
#endif
static struct pxa2xx_udc_mach_info balloon3_udc_info = { /******************************************************************************
.udc_is_connected = balloon3_udc_is_connected, * Core power regulator
.udc_command = balloon3_udc_command, ******************************************************************************/
}; #if defined(CONFIG_REGULATOR_MAX1586) || \
defined(CONFIG_REGULATOR_MAX1586_MODULE)
static struct pxaficp_platform_data balloon3_ficp_platform_data = { static struct regulator_consumer_supply balloon3_max1587a_consumers[] = {
.transceiver_cap = IR_SIRMODE | IR_FIRMODE | IR_OFF,
};
static unsigned long balloon3_ohci_pin_config[] = {
GPIO88_USBH1_PWR,
GPIO89_USBH1_PEN,
};
static struct pxaohci_platform_data balloon3_ohci_platform_data = {
.port_mode = PMM_PERPORT_MODE,
.flags = ENABLE_PORT_ALL | POWER_CONTROL_LOW | POWER_SENSE_LOW,
};
static unsigned long balloon3_pin_config[] __initdata = {
/* Select BTUART 'COM1/ttyS0' as IO option for pins 42/43/44/45 */
GPIO42_BTUART_RXD,
GPIO43_BTUART_TXD,
GPIO44_BTUART_CTS,
GPIO45_BTUART_RTS,
/* Wakeup GPIO */
GPIO1_GPIO | WAKEUP_ON_EDGE_BOTH,
/* NAND & IDLE LED GPIOs */
GPIO9_GPIO,
GPIO10_GPIO,
};
static struct gpio_led balloon3_gpio_leds[] = {
{ {
.name = "balloon3:green:idle", .supply = "vcc_core",
.default_trigger = "heartbeat", }
.gpio = BALLOON3_GPIO_LED_IDLE, };
.active_low = 1,
static struct regulator_init_data balloon3_max1587a_v3_info = {
.constraints = {
.name = "vcc_core range",
.min_uV = 900000,
.max_uV = 1705000,
.always_on = 1,
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
}, },
.consumer_supplies = balloon3_max1587a_consumers,
.num_consumer_supplies = ARRAY_SIZE(balloon3_max1587a_consumers),
};
static struct max1586_subdev_data balloon3_max1587a_subdevs[] = {
{ {
.name = "balloon3:green:nand", .name = "vcc_core",
.default_trigger = "nand-disk", .id = MAX1586_V3,
.gpio = BALLOON3_GPIO_LED_NAND, .platform_data = &balloon3_max1587a_v3_info,
.active_low = 1, }
};
static struct max1586_platform_data balloon3_max1587a_info = {
.subdevs = balloon3_max1587a_subdevs,
.num_subdevs = ARRAY_SIZE(balloon3_max1587a_subdevs),
.v3_gain = MAX1586_GAIN_R24_3k32, /* 730..1550 mV */
};
static struct i2c_board_info __initdata balloon3_pi2c_board_info[] = {
{
I2C_BOARD_INFO("max1586", 0x14),
.platform_data = &balloon3_max1587a_info,
}, },
}; };
static struct gpio_led_platform_data balloon3_gpio_leds_platform_data = { static void __init balloon3_pmic_init(void)
.leds = balloon3_gpio_leds, {
.num_leds = ARRAY_SIZE(balloon3_gpio_leds), pxa27x_set_i2c_power_info(NULL);
}; i2c_register_board_info(1, ARRAY_AND_SIZE(balloon3_pi2c_board_info));
}
static struct platform_device balloon3led_device = { #else
.name = "leds-gpio", static inline void balloon3_pmic_init(void) {}
.id = -1, #endif
.dev = {
.platform_data = &balloon3_gpio_leds_platform_data,
},
};
/******************************************************************************
* Machine init
******************************************************************************/
static void __init balloon3_init(void) static void __init balloon3_init(void)
{ {
pr_info("Initialising Balloon3\n");
/* system bus arbiter setting
* - Core_Park
* - LCD_wt:DMA_wt:CORE_Wt = 2:3:4
*/
ARB_CNTRL = ARB_CORE_PARK | 0x234; ARB_CNTRL = ARB_CORE_PARK | 0x234;
pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_pin_config));
pxa_set_ffuart_info(NULL); pxa_set_ffuart_info(NULL);
pxa_set_btuart_info(NULL); pxa_set_btuart_info(NULL);
pxa_set_stuart_info(NULL); pxa_set_stuart_info(NULL);
pxa_set_i2c_info(NULL); balloon3_i2c_init();
if (balloon3_has(BALLOON3_FEATURE_AUDIO)) { balloon3_irda_init();
pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_ac97_pin_config)); balloon3_lcd_init();
pxa_set_ac97_info(NULL); balloon3_leds_init();
} balloon3_mmc_init();
balloon3_nand_init();
if (balloon3_has(BALLOON3_FEATURE_TOPPOLY)) { balloon3_nor_init();
pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_lcd_pin_config)); balloon3_pmic_init();
gpio_request(BALLOON3_GPIO_RUN_BACKLIGHT, balloon3_ts_init();
"LCD Backlight Power"); balloon3_udc_init();
gpio_direction_output(BALLOON3_GPIO_RUN_BACKLIGHT, 1); balloon3_uhc_init();
set_pxa_fb_info(&balloon3_pxafb_info);
}
if (balloon3_has(BALLOON3_FEATURE_MMC)) {
pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_mmc_pin_config));
pxa_set_mci_info(&balloon3_mci_platform_data);
}
pxa_set_ficp_info(&balloon3_ficp_platform_data);
if (balloon3_has(BALLOON3_FEATURE_OHCI)) {
pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_ohci_pin_config));
pxa_set_ohci_info(&balloon3_ohci_platform_data);
}
pxa_set_udc_info(&balloon3_udc_info);
pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_pin_config));
platform_device_register(&balloon3led_device);
} }
static struct map_desc balloon3_io_desc[] __initdata = { static struct map_desc balloon3_io_desc[] __initdata = {

View File

@ -689,6 +689,7 @@ static void __init cm_x300_init_da9030(void)
{ {
pxa3xx_set_i2c_power_info(&cm_x300_pwr_i2c_info); pxa3xx_set_i2c_power_info(&cm_x300_pwr_i2c_info);
i2c_register_board_info(1, &cm_x300_pmic_info, 1); i2c_register_board_info(1, &cm_x300_pmic_info, 1);
set_irq_wake(IRQ_WAKEUP0, 1);
} }
static void __init cm_x300_init_wi2wi(void) static void __init cm_x300_init_wi2wi(void)
@ -745,9 +746,10 @@ static void __init cm_x300_init(void)
{ {
cm_x300_init_mfp(); cm_x300_init_mfp();
pxa_set_ffuart_info(NULL);
pxa_set_btuart_info(NULL); pxa_set_btuart_info(NULL);
pxa_set_stuart_info(NULL); pxa_set_stuart_info(NULL);
if (cpu_is_pxa300())
pxa_set_ffuart_info(NULL);
cm_x300_init_da9030(); cm_x300_init_da9030();
cm_x300_init_dm9000(); cm_x300_init_dm9000();

View File

@ -0,0 +1,111 @@
/*
* linux/arch/arm/mach-pxa/colibri-pxa270-evalboard.c
*
* Support for Toradex PXA270 based Colibri Evaluation Carrier Board
* Daniel Mack <daniel@caiaq.de>
* Marek Vasut <marek.vasut@gmail.com>
*
* 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
* published by the Free Software Foundation.
*/
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
#include <linux/sysdev.h>
#include <linux/interrupt.h>
#include <linux/gpio.h>
#include <asm/mach-types.h>
#include <mach/hardware.h>
#include <asm/mach/arch.h>
#include <mach/pxa27x.h>
#include <mach/colibri.h>
#include <mach/mmc.h>
#include <mach/ohci.h>
#include <mach/pxa27x-udc.h>
#include "generic.h"
#include "devices.h"
/******************************************************************************
* Pin configuration
******************************************************************************/
static mfp_cfg_t colibri_pxa270_evalboard_pin_config[] __initdata = {
/* MMC */
GPIO32_MMC_CLK,
GPIO92_MMC_DAT_0,
GPIO109_MMC_DAT_1,
GPIO110_MMC_DAT_2,
GPIO111_MMC_DAT_3,
GPIO112_MMC_CMD,
GPIO0_GPIO, /* SD detect */
/* FFUART */
GPIO39_FFUART_TXD,
GPIO34_FFUART_RXD,
/* UHC */
GPIO88_USBH1_PWR,
GPIO89_USBH1_PEN,
GPIO119_USBH2_PWR,
GPIO120_USBH2_PEN,
};
/******************************************************************************
* SD/MMC card controller
******************************************************************************/
#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
static struct pxamci_platform_data colibri_pxa270_mci_platform_data = {
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
.gpio_power = -1,
.gpio_card_detect = GPIO0_COLIBRI_PXA270_SD_DETECT,
.gpio_card_ro = -1,
.detect_delay_ms = 200,
};
static void __init colibri_pxa270_mmc_init(void)
{
pxa_set_mci_info(&colibri_pxa270_mci_platform_data);
}
#else
static inline void colibri_pxa270_mmc_init(void) {}
#endif
/******************************************************************************
* USB Host
******************************************************************************/
#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
static int colibri_pxa270_ohci_init(struct device *dev)
{
UP2OCR = UP2OCR_HXS | UP2OCR_HXOE | UP2OCR_DPPDE | UP2OCR_DMPDE;
return 0;
}
static struct pxaohci_platform_data colibri_pxa270_ohci_info = {
.port_mode = PMM_PERPORT_MODE,
.flags = ENABLE_PORT1 | ENABLE_PORT2 |
POWER_CONTROL_LOW | POWER_SENSE_LOW,
.init = colibri_pxa270_ohci_init,
};
static void __init colibri_pxa270_uhc_init(void)
{
pxa_set_ohci_info(&colibri_pxa270_ohci_info);
}
#else
static inline void colibri_pxa270_uhc_init(void) {}
#endif
void __init colibri_pxa270_evalboard_init(void)
{
pxa2xx_mfp_config(ARRAY_AND_SIZE(colibri_pxa270_evalboard_pin_config));
pxa_set_ffuart_info(NULL);
pxa_set_btuart_info(NULL);
pxa_set_stuart_info(NULL);
colibri_pxa270_mmc_init();
colibri_pxa270_uhc_init();
}

View File

@ -0,0 +1,272 @@
/*
* linux/arch/arm/mach-pxa/income.c
*
* Support for Income s.r.o. SH-Dmaster PXA270 SBC
*
* Copyright (C) 2010
* Marek Vasut <marek.vasut@gmail.com>
* Pavel Revak <palo@bielyvlk.sk>
*
* 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
* published by the Free Software Foundation.
*/
#include <linux/bitops.h>
#include <linux/delay.h>
#include <linux/gpio.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
#include <linux/pwm_backlight.h>
#include <linux/sysdev.h>
#include <asm/irq.h>
#include <asm/mach-types.h>
#include <mach/hardware.h>
#include <mach/mmc.h>
#include <mach/ohci.h>
#include <mach/pxa27x.h>
#include <mach/pxa27x-udc.h>
#include <mach/pxafb.h>
#include <plat/i2c.h>
#include "devices.h"
#include "generic.h"
#define GPIO114_INCOME_ETH_IRQ (114)
#define GPIO0_INCOME_SD_DETECT (0)
#define GPIO0_INCOME_SD_RO (1)
#define GPIO54_INCOME_LED_A (54)
#define GPIO55_INCOME_LED_B (55)
#define GPIO113_INCOME_TS_IRQ (113)
/******************************************************************************
* Pin configuration
******************************************************************************/
static mfp_cfg_t income_pin_config[] __initdata = {
/* MMC */
GPIO32_MMC_CLK,
GPIO92_MMC_DAT_0,
GPIO109_MMC_DAT_1,
GPIO110_MMC_DAT_2,
GPIO111_MMC_DAT_3,
GPIO112_MMC_CMD,
GPIO0_GPIO, /* SD detect */
GPIO1_GPIO, /* SD read-only */
/* FFUART */
GPIO39_FFUART_TXD,
GPIO34_FFUART_RXD,
/* BFUART */
GPIO42_BTUART_RXD,
GPIO43_BTUART_TXD,
GPIO45_BTUART_RTS,
/* STUART */
GPIO46_STUART_RXD,
GPIO47_STUART_TXD,
/* UHC */
GPIO88_USBH1_PWR,
GPIO89_USBH1_PEN,
/* LCD */
GPIOxx_LCD_TFT_16BPP,
/* PWM */
GPIO16_PWM0_OUT,
/* I2C */
GPIO117_I2C_SCL,
GPIO118_I2C_SDA,
/* LED */
GPIO54_GPIO, /* LED A */
GPIO55_GPIO, /* LED B */
};
/******************************************************************************
* SD/MMC card controller
******************************************************************************/
#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
static struct pxamci_platform_data income_mci_platform_data = {
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
.gpio_power = -1,
.gpio_card_detect = GPIO0_INCOME_SD_DETECT,
.gpio_card_ro = GPIO0_INCOME_SD_RO,
.detect_delay_ms = 200,
};
static void __init income_mmc_init(void)
{
pxa_set_mci_info(&income_mci_platform_data);
}
#else
static inline void income_mmc_init(void) {}
#endif
/******************************************************************************
* USB Host
******************************************************************************/
#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
static struct pxaohci_platform_data income_ohci_info = {
.port_mode = PMM_PERPORT_MODE,
.flags = ENABLE_PORT1 | POWER_CONTROL_LOW | POWER_SENSE_LOW,
};
static void __init income_uhc_init(void)
{
pxa_set_ohci_info(&income_ohci_info);
}
#else
static inline void income_uhc_init(void) {}
#endif
/******************************************************************************
* LED
******************************************************************************/
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
struct gpio_led income_gpio_leds[] = {
{
.name = "income:green:leda",
.default_trigger = "none",
.gpio = GPIO54_INCOME_LED_A,
.active_low = 1,
},
{
.name = "income:green:ledb",
.default_trigger = "none",
.gpio = GPIO55_INCOME_LED_B,
.active_low = 1,
}
};
static struct gpio_led_platform_data income_gpio_led_info = {
.leds = income_gpio_leds,
.num_leds = ARRAY_SIZE(income_gpio_leds),
};
static struct platform_device income_leds = {
.name = "leds-gpio",
.id = -1,
.dev = {
.platform_data = &income_gpio_led_info,
}
};
static void __init income_led_init(void)
{
platform_device_register(&income_leds);
}
#else
static inline void income_led_init(void) {}
#endif
/******************************************************************************
* I2C
******************************************************************************/
#if defined(CONFIG_I2C_PXA) || defined(CONFIG_I2C_PXA_MODULE)
static struct i2c_board_info __initdata income_i2c_devs[] = {
{
I2C_BOARD_INFO("ds1340", 0x68),
}, {
I2C_BOARD_INFO("lm75", 0x4f),
},
};
static void __init income_i2c_init(void)
{
pxa_set_i2c_info(NULL);
pxa27x_set_i2c_power_info(NULL);
i2c_register_board_info(0, ARRAY_AND_SIZE(income_i2c_devs));
}
#else
static inline void income_i2c_init(void) {}
#endif
/******************************************************************************
* Framebuffer
******************************************************************************/
#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
static struct pxafb_mode_info income_lcd_modes[] = {
{
.pixclock = 144700,
.xres = 320,
.yres = 240,
.bpp = 32,
.depth = 18,
.left_margin = 10,
.right_margin = 10,
.upper_margin = 7,
.lower_margin = 8,
.hsync_len = 20,
.vsync_len = 2,
.sync = FB_SYNC_VERT_HIGH_ACT,
},
};
static struct pxafb_mach_info income_lcd_screen = {
.modes = income_lcd_modes,
.num_modes = ARRAY_SIZE(income_lcd_modes),
.lcd_conn = LCD_COLOR_TFT_18BPP | LCD_PCLK_EDGE_FALL,
};
static void __init income_lcd_init(void)
{
set_pxa_fb_info(&income_lcd_screen);
}
#else
static inline void income_lcd_init(void) {}
#endif
/******************************************************************************
* Backlight
******************************************************************************/
#if defined(CONFIG_BACKLIGHT_PWM) || defined(CONFIG_BACKLIGHT_PWM__MODULE)
static struct platform_pwm_backlight_data income_backlight_data = {
.pwm_id = 0,
.max_brightness = 0x3ff,
.dft_brightness = 0x1ff,
.pwm_period_ns = 1000000,
};
static struct platform_device income_backlight = {
.name = "pwm-backlight",
.dev = {
.parent = &pxa27x_device_pwm0.dev,
.platform_data = &income_backlight_data,
},
};
static void __init income_pwm_init(void)
{
platform_device_register(&income_backlight);
}
#else
static inline void income_pwm_init(void) {}
#endif
void __init colibri_pxa270_income_boardinit(void)
{
pxa2xx_mfp_config(ARRAY_AND_SIZE(income_pin_config));
pxa_set_ffuart_info(NULL);
pxa_set_btuart_info(NULL);
pxa_set_stuart_info(NULL);
income_mmc_init();
income_uhc_init();
income_led_init();
income_i2c_init();
income_lcd_init();
income_pwm_init();
}

View File

@ -3,6 +3,7 @@
* *
* Support for Toradex PXA270 based Colibri module * Support for Toradex PXA270 based Colibri module
* Daniel Mack <daniel@caiaq.de> * Daniel Mack <daniel@caiaq.de>
* Marek Vasut <marek.vasut@gmail.com>
* *
* 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
@ -10,49 +11,55 @@
*/ */
#include <linux/init.h> #include <linux/init.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
#include <linux/sysdev.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/bitops.h> #include <linux/kernel.h>
#include <linux/ioport.h>
#include <linux/delay.h>
#include <linux/mtd/mtd.h> #include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h> #include <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h> #include <linux/mtd/physmap.h>
#include <linux/gpio.h> #include <linux/platform_device.h>
#include <asm/mach-types.h> #include <linux/sysdev.h>
#include <mach/hardware.h> #include <linux/ucb1400.h>
#include <asm/irq.h>
#include <asm/sizes.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include <asm/mach/map.h>
#include <asm/mach/irq.h>
#include <asm/mach/flash.h> #include <asm/mach/flash.h>
#include <asm/mach-types.h>
#include <asm/sizes.h>
#include <mach/pxa27x.h> #include <mach/audio.h>
#include <mach/colibri.h> #include <mach/colibri.h>
#include <mach/pxa27x.h>
#include "generic.h"
#include "devices.h" #include "devices.h"
#include "generic.h"
/* /******************************************************************************
* GPIO configuration * Pin configuration
*/ ******************************************************************************/
static mfp_cfg_t colibri_pxa270_pin_config[] __initdata = { static mfp_cfg_t colibri_pxa270_pin_config[] __initdata = {
/* Ethernet */
GPIO78_nCS_2, /* Ethernet CS */ GPIO78_nCS_2, /* Ethernet CS */
GPIO114_GPIO, /* Ethernet IRQ */ GPIO114_GPIO, /* Ethernet IRQ */
/* AC97 */
GPIO28_AC97_BITCLK,
GPIO29_AC97_SDATA_IN_0,
GPIO30_AC97_SDATA_OUT,
GPIO31_AC97_SYNC,
GPIO95_AC97_nRESET,
GPIO98_AC97_SYSCLK,
GPIO113_GPIO, /* Touchscreen IRQ */
}; };
/* /******************************************************************************
* NOR flash * NOR Flash
*/ ******************************************************************************/
#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
static struct mtd_partition colibri_partitions[] = { static struct mtd_partition colibri_partitions[] = {
{ {
.name = "Bootloader", .name = "Bootloader",
.offset = 0x00000000, .offset = 0x00000000,
.size = 0x00040000, .size = 0x00040000,
.mask_flags = MTD_WRITEABLE /* force read-only */ .mask_flags = MTD_WRITEABLE /* force read-only */
}, { }, {
.name = "Kernel", .name = "Kernel",
.offset = 0x00040000, .offset = 0x00040000,
@ -90,50 +97,113 @@ static struct platform_device colibri_pxa270_flash_device = {
.num_resources = 1, .num_resources = 1,
}; };
/* static void __init colibri_pxa270_nor_init(void)
* DM9000 Ethernet {
*/ platform_device_register(&colibri_pxa270_flash_device);
#if defined(CONFIG_DM9000) }
static struct resource dm9000_resources[] = { #else
[0] = { static inline void colibri_pxa270_nor_init(void) {}
.start = COLIBRI_PXA270_ETH_PHYS, #endif
.end = COLIBRI_PXA270_ETH_PHYS + 3,
/******************************************************************************
* Ethernet
******************************************************************************/
#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
static struct resource colibri_pxa270_dm9000_resources[] = {
{
.start = PXA_CS2_PHYS,
.end = PXA_CS2_PHYS + 3,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
[1] = { {
.start = COLIBRI_PXA270_ETH_PHYS + 4, .start = PXA_CS2_PHYS + 4,
.end = COLIBRI_PXA270_ETH_PHYS + 4 + 500, .end = PXA_CS2_PHYS + 4 + 500,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
[2] = { {
.start = COLIBRI_PXA270_ETH_IRQ, .start = gpio_to_irq(GPIO114_COLIBRI_PXA270_ETH_IRQ),
.end = COLIBRI_PXA270_ETH_IRQ, .end = gpio_to_irq(GPIO114_COLIBRI_PXA270_ETH_IRQ),
.flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING, .flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING,
}, },
}; };
static struct platform_device dm9000_device = { static struct platform_device colibri_pxa270_dm9000_device = {
.name = "dm9000", .name = "dm9000",
.id = -1, .id = -1,
.num_resources = ARRAY_SIZE(dm9000_resources), .num_resources = ARRAY_SIZE(colibri_pxa270_dm9000_resources),
.resource = dm9000_resources, .resource = colibri_pxa270_dm9000_resources,
}; };
#endif /* CONFIG_DM9000 */
static struct platform_device *colibri_pxa270_devices[] __initdata = { static void __init colibri_pxa270_eth_init(void)
&colibri_pxa270_flash_device, {
#if defined(CONFIG_DM9000) platform_device_register(&colibri_pxa270_dm9000_device);
&dm9000_device, }
#else
static inline void colibri_pxa270_eth_init(void) {}
#endif #endif
/******************************************************************************
* Audio and Touchscreen
******************************************************************************/
#if defined(CONFIG_TOUCHSCREEN_UCB1400) || \
defined(CONFIG_TOUCHSCREEN_UCB1400_MODULE)
static pxa2xx_audio_ops_t colibri_pxa270_ac97_pdata = {
.reset_gpio = 95,
}; };
static struct ucb1400_pdata colibri_pxa270_ucb1400_pdata = {
.irq = gpio_to_irq(GPIO113_COLIBRI_PXA270_TS_IRQ),
};
static struct platform_device colibri_pxa270_ucb1400_device = {
.name = "ucb1400_core",
.id = -1,
.dev = {
.platform_data = &colibri_pxa270_ucb1400_pdata,
},
};
static void __init colibri_pxa270_tsc_init(void)
{
pxa_set_ac97_info(&colibri_pxa270_ac97_pdata);
platform_device_register(&colibri_pxa270_ucb1400_device);
}
#else
static inline void colibri_pxa270_tsc_init(void) {}
#endif
static int colibri_pxa270_baseboard;
core_param(colibri_pxa270_baseboard, colibri_pxa270_baseboard, int, 0444);
static void __init colibri_pxa270_init(void) static void __init colibri_pxa270_init(void)
{ {
pxa2xx_mfp_config(ARRAY_AND_SIZE(colibri_pxa270_pin_config)); pxa2xx_mfp_config(ARRAY_AND_SIZE(colibri_pxa270_pin_config));
pxa_set_ffuart_info(NULL);
pxa_set_btuart_info(NULL); colibri_pxa270_nor_init();
pxa_set_stuart_info(NULL); colibri_pxa270_eth_init();
platform_add_devices(ARRAY_AND_SIZE(colibri_pxa270_devices)); colibri_pxa270_tsc_init();
switch (colibri_pxa270_baseboard) {
case COLIBRI_PXA270_EVALBOARD:
colibri_pxa270_evalboard_init();
break;
case COLIBRI_PXA270_INCOME:
colibri_pxa270_income_boardinit();
break;
default:
printk(KERN_ERR "Illegal colibri_pxa270_baseboard type %d\n",
colibri_pxa270_baseboard);
}
}
/* The "Income s.r.o. SH-Dmaster PXA270 SBC" board can be booted either
* with the INCOME mach type or with COLIBRI and the kernel parameter
* "colibri_pxa270_baseboard=1"
*/
static void __init colibri_pxa270_income_init(void)
{
colibri_pxa270_baseboard = COLIBRI_PXA270_INCOME;
colibri_pxa270_init();
} }
MACHINE_START(COLIBRI, "Toradex Colibri PXA270") MACHINE_START(COLIBRI, "Toradex Colibri PXA270")
@ -146,3 +216,13 @@ MACHINE_START(COLIBRI, "Toradex Colibri PXA270")
.timer = &pxa_timer, .timer = &pxa_timer,
MACHINE_END MACHINE_END
MACHINE_START(INCOME, "Income s.r.o. SH-Dmaster PXA270 SBC")
.phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100,
.init_machine = colibri_pxa270_income_init,
.map_io = pxa_map_io,
.init_irq = pxa27x_init_irq,
.timer = &pxa_timer,
MACHINE_END

View File

@ -16,6 +16,7 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/usb/gpio_vbus.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/sizes.h> #include <asm/sizes.h>
@ -28,6 +29,8 @@
#include <mach/pxafb.h> #include <mach/pxafb.h>
#include <mach/ohci.h> #include <mach/ohci.h>
#include <mach/audio.h> #include <mach/audio.h>
#include <mach/pxa27x-udc.h>
#include <mach/udc.h>
#include "generic.h" #include "generic.h"
#include "devices.h" #include "devices.h"
@ -101,6 +104,42 @@ void __init colibri_pxa320_init_ohci(void)
static inline void colibri_pxa320_init_ohci(void) {} static inline void colibri_pxa320_init_ohci(void) {}
#endif /* CONFIG_USB_OHCI_HCD || CONFIG_USB_OHCI_HCD_MODULE */ #endif /* CONFIG_USB_OHCI_HCD || CONFIG_USB_OHCI_HCD_MODULE */
#if defined(CONFIG_USB_GADGET_PXA27X)||defined(CONFIG_USB_GADGET_PXA27X_MODULE)
static struct gpio_vbus_mach_info colibri_pxa320_gpio_vbus_info = {
.gpio_vbus = mfp_to_gpio(MFP_PIN_GPIO96),
.gpio_pullup = -1,
};
static struct platform_device colibri_pxa320_gpio_vbus = {
.name = "gpio-vbus",
.id = -1,
.dev = {
.platform_data = &colibri_pxa320_gpio_vbus_info,
},
};
static void colibri_pxa320_udc_command(int cmd)
{
if (cmd == PXA2XX_UDC_CMD_CONNECT)
UP2OCR = UP2OCR_HXOE | UP2OCR_DPPUE;
else if (cmd == PXA2XX_UDC_CMD_DISCONNECT)
UP2OCR = UP2OCR_HXOE;
}
static struct pxa2xx_udc_mach_info colibri_pxa320_udc_info __initdata = {
.udc_command = colibri_pxa320_udc_command,
.gpio_pullup = -1,
};
static void __init colibri_pxa320_init_udc(void)
{
pxa_set_udc_info(&colibri_pxa320_udc_info);
platform_device_register(&colibri_pxa320_gpio_vbus);
}
#else
static inline void colibri_pxa320_init_udc(void) {}
#endif
static mfp_cfg_t colibri_pxa320_mmc_pin_config[] __initdata = { static mfp_cfg_t colibri_pxa320_mmc_pin_config[] __initdata = {
GPIO22_MMC1_CLK, GPIO22_MMC1_CLK,
GPIO23_MMC1_CMD, GPIO23_MMC1_CMD,
@ -212,6 +251,7 @@ void __init colibri_pxa320_init(void)
colibri_pxa3xx_init_mmc(ARRAY_AND_SIZE(colibri_pxa320_mmc_pin_config), colibri_pxa3xx_init_mmc(ARRAY_AND_SIZE(colibri_pxa320_mmc_pin_config),
mfp_to_gpio(MFP_PIN_GPIO28)); mfp_to_gpio(MFP_PIN_GPIO28));
colibri_pxa320_init_uart(); colibri_pxa320_init_uart();
colibri_pxa320_init_udc();
} }
MACHINE_START(COLIBRI320, "Toradex Colibri PXA320") MACHINE_START(COLIBRI320, "Toradex Colibri PXA320")

View File

@ -50,14 +50,13 @@
#include <mach/udc.h> #include <mach/udc.h>
#include <mach/pxa2xx_spi.h> #include <mach/pxa2xx_spi.h>
#include <mach/corgi.h> #include <mach/corgi.h>
#include <mach/sharpsl.h> #include <mach/sharpsl_pm.h>
#include <asm/mach/sharpsl_param.h> #include <asm/mach/sharpsl_param.h>
#include <asm/hardware/scoop.h> #include <asm/hardware/scoop.h>
#include "generic.h" #include "generic.h"
#include "devices.h" #include "devices.h"
#include "sharpsl.h"
static unsigned long corgi_pin_config[] __initdata = { static unsigned long corgi_pin_config[] __initdata = {
/* Static Memory I/O */ /* Static Memory I/O */
@ -185,8 +184,6 @@ static struct scoop_pcmcia_config corgi_pcmcia_config = {
.num_devs = 1, .num_devs = 1,
}; };
EXPORT_SYMBOL(corgiscoop_device);
static struct w100_mem_info corgi_fb_mem = { static struct w100_mem_info corgi_fb_mem = {
.ext_cntl = 0x00040003, .ext_cntl = 0x00040003,
.sdram_mode_reg = 0x00650021, .sdram_mode_reg = 0x00650021,

View File

@ -23,12 +23,11 @@
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <mach/sharpsl.h>
#include <mach/corgi.h> #include <mach/corgi.h>
#include <mach/pxa2xx-regs.h> #include <mach/pxa2xx-regs.h>
#include <mach/sharpsl_pm.h>
#include "generic.h" #include "generic.h"
#include "sharpsl.h"
#define SHARPSL_CHARGE_ON_VOLT 0x99 /* 2.9V */ #define SHARPSL_CHARGE_ON_VOLT 0x99 /* 2.9V */
#define SHARPSL_CHARGE_ON_TEMP 0xe0 /* 2.9V */ #define SHARPSL_CHARGE_ON_TEMP 0xe0 /* 2.9V */
@ -134,11 +133,11 @@ unsigned long corgipm_read_devdata(int type)
case SHARPSL_STATUS_ACIN: case SHARPSL_STATUS_ACIN:
return ((GPLR(CORGI_GPIO_AC_IN) & GPIO_bit(CORGI_GPIO_AC_IN)) != 0); return ((GPLR(CORGI_GPIO_AC_IN) & GPIO_bit(CORGI_GPIO_AC_IN)) != 0);
case SHARPSL_STATUS_LOCK: case SHARPSL_STATUS_LOCK:
return READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_batlock); return gpio_get_value(sharpsl_pm.machinfo->gpio_batlock);
case SHARPSL_STATUS_CHRGFULL: case SHARPSL_STATUS_CHRGFULL:
return READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_batfull); return gpio_get_value(sharpsl_pm.machinfo->gpio_batfull);
case SHARPSL_STATUS_FATAL: case SHARPSL_STATUS_FATAL:
return READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_fatal); return gpio_get_value(sharpsl_pm.machinfo->gpio_fatal);
case SHARPSL_ACIN_VOLT: case SHARPSL_ACIN_VOLT:
return sharpsl_pm_pxa_read_max1111(MAX1111_ACIN_VOLT); return sharpsl_pm_pxa_read_max1111(MAX1111_ACIN_VOLT);
case SHARPSL_BATT_TEMP: case SHARPSL_BATT_TEMP:
@ -165,8 +164,6 @@ static struct sharpsl_charger_machinfo corgi_pm_machinfo = {
.should_wakeup = corgi_should_wakeup, .should_wakeup = corgi_should_wakeup,
#if defined(CONFIG_LCD_CORGI) #if defined(CONFIG_LCD_CORGI)
.backlight_limit = corgi_lcd_limit_intensity, .backlight_limit = corgi_lcd_limit_intensity,
#elif defined(CONFIG_BACKLIGHT_CORGI)
.backlight_limit = corgibl_limit_intensity,
#endif #endif
.charge_on_volt = SHARPSL_CHARGE_ON_VOLT, .charge_on_volt = SHARPSL_CHARGE_ON_VOLT,
.charge_on_temp = SHARPSL_CHARGE_ON_TEMP, .charge_on_temp = SHARPSL_CHARGE_ON_TEMP,

View File

@ -4,6 +4,7 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <asm/pmu.h>
#include <mach/udc.h> #include <mach/udc.h>
#include <mach/pxafb.h> #include <mach/pxafb.h>
#include <mach/mmc.h> #include <mach/mmc.h>
@ -31,6 +32,19 @@ void __init pxa_register_device(struct platform_device *dev, void *data)
dev_err(&dev->dev, "unable to register device: %d\n", ret); dev_err(&dev->dev, "unable to register device: %d\n", ret);
} }
static struct resource pxa_resource_pmu = {
.start = IRQ_PMU,
.end = IRQ_PMU,
.flags = IORESOURCE_IRQ,
};
struct platform_device pxa_device_pmu = {
.name = "arm-pmu",
.id = ARM_PMU_DEVICE_CPU,
.resource = &pxa_resource_pmu,
.num_resources = 1,
};
static struct resource pxamci_resources[] = { static struct resource pxamci_resources[] = {
[0] = { [0] = {
.start = 0x41100000, .start = 0x41100000,

View File

@ -1,3 +1,4 @@
extern struct platform_device pxa_device_pmu;
extern struct platform_device pxa_device_mci; extern struct platform_device pxa_device_mci;
extern struct platform_device pxa3xx_device_mci2; extern struct platform_device pxa3xx_device_mci2;
extern struct platform_device pxa3xx_device_mci3; extern struct platform_device pxa3xx_device_mci3;

View File

@ -1,78 +0,0 @@
/*
* Hardware definitions for the Toshiba e330 PDAs
*
* Copyright (c) 2003 Ian Molton <spyro@f2s.com>
*
* This file is licensed under
* the terms of the GNU General Public License version 2. This program
* is licensed "as is" without any warranty of any kind, whether express
* or implied.
*
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/clk.h>
#include <linux/platform_device.h>
#include <linux/mfd/tc6387xb.h>
#include <asm/setup.h>
#include <asm/mach/arch.h>
#include <asm/mach-types.h>
#include <mach/pxa25x.h>
#include <mach/eseries-gpio.h>
#include <mach/udc.h>
#include "generic.h"
#include "eseries.h"
#include "clock.h"
/* -------------------- e330 tc6387xb parameters -------------------- */
static struct tc6387xb_platform_data e330_tc6387xb_info = {
.enable = &eseries_tmio_enable,
.disable = &eseries_tmio_disable,
.suspend = &eseries_tmio_suspend,
.resume = &eseries_tmio_resume,
};
static struct platform_device e330_tc6387xb_device = {
.name = "tc6387xb",
.id = -1,
.dev = {
.platform_data = &e330_tc6387xb_info,
},
.num_resources = 2,
.resource = eseries_tmio_resources,
};
/* --------------------------------------------------------------- */
static struct platform_device *devices[] __initdata = {
&e330_tc6387xb_device,
};
static void __init e330_init(void)
{
pxa_set_ffuart_info(NULL);
pxa_set_btuart_info(NULL);
pxa_set_stuart_info(NULL);
eseries_register_clks();
eseries_get_tmio_gpios();
platform_add_devices(devices, ARRAY_SIZE(devices));
pxa_set_udc_info(&e7xx_udc_mach_info);
}
MACHINE_START(E330, "Toshiba e330")
/* Maintainer: Ian Molton (spyro@f2s.com) */
.phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100,
.map_io = pxa_map_io,
.init_irq = pxa25x_init_irq,
.fixup = eseries_fixup,
.init_machine = e330_init,
.timer = &pxa_timer,
MACHINE_END

View File

@ -1,79 +0,0 @@
/*
* Hardware definitions for the Toshiba e350 PDAs
*
* Copyright (c) 2003 Ian Molton <spyro@f2s.com>
*
* This file is licensed under
* the terms of the GNU General Public License version 2. This program
* is licensed "as is" without any warranty of any kind, whether express
* or implied.
*
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/clk.h>
#include <linux/platform_device.h>
#include <linux/mfd/t7l66xb.h>
#include <asm/setup.h>
#include <asm/mach/arch.h>
#include <asm/mach-types.h>
#include <mach/irqs.h>
#include <mach/pxa25x.h>
#include <mach/eseries-gpio.h>
#include <mach/udc.h>
#include "generic.h"
#include "eseries.h"
#include "clock.h"
/* -------------------- e350 t7l66xb parameters -------------------- */
static struct t7l66xb_platform_data e350_t7l66xb_info = {
.irq_base = IRQ_BOARD_START,
.enable = &eseries_tmio_enable,
.suspend = &eseries_tmio_suspend,
.resume = &eseries_tmio_resume,
};
static struct platform_device e350_t7l66xb_device = {
.name = "t7l66xb",
.id = -1,
.dev = {
.platform_data = &e350_t7l66xb_info,
},
.num_resources = 2,
.resource = eseries_tmio_resources,
};
/* ---------------------------------------------------------- */
static struct platform_device *devices[] __initdata = {
&e350_t7l66xb_device,
};
static void __init e350_init(void)
{
pxa_set_ffuart_info(NULL);
pxa_set_btuart_info(NULL);
pxa_set_stuart_info(NULL);
eseries_register_clks();
eseries_get_tmio_gpios();
platform_add_devices(devices, ARRAY_SIZE(devices));
pxa_set_udc_info(&e7xx_udc_mach_info);
}
MACHINE_START(E350, "Toshiba e350")
/* Maintainer: Ian Molton (spyro@f2s.com) */
.phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100,
.map_io = pxa_map_io,
.init_irq = pxa25x_init_irq,
.fixup = eseries_fixup,
.init_machine = e350_init,
.timer = &pxa_timer,
MACHINE_END

View File

@ -1,155 +0,0 @@
/*
* Hardware definitions for the Toshiba eseries PDAs
*
* Copyright (c) 2003 Ian Molton <spyro@f2s.com>
*
* This file is licensed under
* the terms of the GNU General Public License version 2. This program
* is licensed "as is" without any warranty of any kind, whether express
* or implied.
*
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/clk.h>
#include <linux/platform_device.h>
#include <linux/mfd/t7l66xb.h>
#include <linux/mtd/nand.h>
#include <linux/mtd/partitions.h>
#include <asm/setup.h>
#include <asm/mach/arch.h>
#include <asm/mach-types.h>
#include <mach/pxa25x.h>
#include <mach/eseries-gpio.h>
#include <mach/pxafb.h>
#include <mach/udc.h>
#include <mach/irqs.h>
#include "generic.h"
#include "eseries.h"
#include "clock.h"
/* ------------------------ E400 LCD definitions ------------------------ */
static struct pxafb_mode_info e400_pxafb_mode_info = {
.pixclock = 140703,
.xres = 240,
.yres = 320,
.bpp = 16,
.hsync_len = 4,
.left_margin = 28,
.right_margin = 8,
.vsync_len = 3,
.upper_margin = 5,
.lower_margin = 6,
.sync = 0,
};
static struct pxafb_mach_info e400_pxafb_mach_info = {
.modes = &e400_pxafb_mode_info,
.num_modes = 1,
.lcd_conn = LCD_COLOR_TFT_16BPP,
.lccr3 = 0,
.pxafb_backlight_power = NULL,
};
/* ------------------------ E400 MFP config ----------------------------- */
static unsigned long e400_pin_config[] __initdata = {
/* Chip selects */
GPIO15_nCS_1, /* CS1 - Flash */
GPIO80_nCS_4, /* CS4 - TMIO */
/* Clocks */
GPIO12_32KHz,
/* BTUART */
GPIO42_BTUART_RXD,
GPIO43_BTUART_TXD,
GPIO44_BTUART_CTS,
/* TMIO controller */
GPIO19_GPIO, /* t7l66xb #PCLR */
GPIO45_GPIO, /* t7l66xb #SUSPEND (NOT BTUART!) */
/* wakeup */
GPIO0_GPIO | WAKEUP_ON_EDGE_RISE,
};
/* ---------------------------------------------------------------------- */
static struct mtd_partition partition_a = {
.name = "Internal NAND flash",
.offset = 0,
.size = MTDPART_SIZ_FULL,
};
static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
static struct nand_bbt_descr e400_t7l66xb_nand_bbt = {
.options = 0,
.offs = 4,
.len = 2,
.pattern = scan_ff_pattern
};
static struct tmio_nand_data e400_t7l66xb_nand_config = {
.num_partitions = 1,
.partition = &partition_a,
.badblock_pattern = &e400_t7l66xb_nand_bbt,
};
static struct t7l66xb_platform_data e400_t7l66xb_info = {
.irq_base = IRQ_BOARD_START,
.enable = &eseries_tmio_enable,
.suspend = &eseries_tmio_suspend,
.resume = &eseries_tmio_resume,
.nand_data = &e400_t7l66xb_nand_config,
};
static struct platform_device e400_t7l66xb_device = {
.name = "t7l66xb",
.id = -1,
.dev = {
.platform_data = &e400_t7l66xb_info,
},
.num_resources = 2,
.resource = eseries_tmio_resources,
};
/* ---------------------------------------------------------- */
static struct platform_device *devices[] __initdata = {
&e400_t7l66xb_device,
};
static void __init e400_init(void)
{
pxa2xx_mfp_config(ARRAY_AND_SIZE(e400_pin_config));
pxa_set_ffuart_info(NULL);
pxa_set_btuart_info(NULL);
pxa_set_stuart_info(NULL);
/* Fixme - e400 may have a switched clock */
eseries_register_clks();
eseries_get_tmio_gpios();
set_pxa_fb_info(&e400_pxafb_mach_info);
platform_add_devices(devices, ARRAY_SIZE(devices));
pxa_set_udc_info(&e7xx_udc_mach_info);
}
MACHINE_START(E400, "Toshiba e400")
/* Maintainer: Ian Molton (spyro@f2s.com) */
.phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100,
.map_io = pxa_map_io,
.init_irq = pxa25x_init_irq,
.fixup = eseries_fixup,
.init_machine = e400_init,
.timer = &pxa_timer,
MACHINE_END

View File

@ -1,225 +0,0 @@
/*
* Hardware definitions for the Toshiba eseries PDAs
*
* Copyright (c) 2003 Ian Molton <spyro@f2s.com>
*
* This file is licensed under
* the terms of the GNU General Public License version 2. This program
* is licensed "as is" without any warranty of any kind, whether express
* or implied.
*
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/fb.h>
#include <linux/clk.h>
#include <linux/mfd/t7l66xb.h>
#include <video/w100fb.h>
#include <asm/setup.h>
#include <asm/mach/arch.h>
#include <asm/mach-types.h>
#include <mach/pxa25x.h>
#include <mach/eseries-gpio.h>
#include <mach/udc.h>
#include <mach/irda.h>
#include <mach/irqs.h>
#include <mach/audio.h>
#include "generic.h"
#include "eseries.h"
#include "clock.h"
#include "devices.h"
/* ------------------------ e740 video support --------------------------- */
static struct w100_gen_regs e740_lcd_regs = {
.lcd_format = 0x00008023,
.lcdd_cntl1 = 0x0f000000,
.lcdd_cntl2 = 0x0003ffff,
.genlcd_cntl1 = 0x00ffff03,
.genlcd_cntl2 = 0x003c0f03,
.genlcd_cntl3 = 0x000143aa,
};
static struct w100_mode e740_lcd_mode = {
.xres = 240,
.yres = 320,
.left_margin = 20,
.right_margin = 28,
.upper_margin = 9,
.lower_margin = 8,
.crtc_ss = 0x80140013,
.crtc_ls = 0x81150110,
.crtc_gs = 0x80050005,
.crtc_vpos_gs = 0x000a0009,
.crtc_rev = 0x0040010a,
.crtc_dclk = 0xa906000a,
.crtc_gclk = 0x80050108,
.crtc_goe = 0x80050108,
.pll_freq = 57,
.pixclk_divider = 4,
.pixclk_divider_rotated = 4,
.pixclk_src = CLK_SRC_XTAL,
.sysclk_divider = 1,
.sysclk_src = CLK_SRC_PLL,
.crtc_ps1_active = 0x41060010,
};
static struct w100_gpio_regs e740_w100_gpio_info = {
.init_data1 = 0x21002103,
.gpio_dir1 = 0xffffdeff,
.gpio_oe1 = 0x03c00643,
.init_data2 = 0x003f003f,
.gpio_dir2 = 0xffffffff,
.gpio_oe2 = 0x000000ff,
};
static struct w100fb_mach_info e740_fb_info = {
.modelist = &e740_lcd_mode,
.num_modes = 1,
.regs = &e740_lcd_regs,
.gpio = &e740_w100_gpio_info,
.xtal_freq = 14318000,
.xtal_dbl = 1,
};
static struct resource e740_fb_resources[] = {
[0] = {
.start = 0x0c000000,
.end = 0x0cffffff,
.flags = IORESOURCE_MEM,
},
};
static struct platform_device e740_fb_device = {
.name = "w100fb",
.id = -1,
.dev = {
.platform_data = &e740_fb_info,
},
.num_resources = ARRAY_SIZE(e740_fb_resources),
.resource = e740_fb_resources,
};
/* --------------------------- MFP Pin config -------------------------- */
static unsigned long e740_pin_config[] __initdata = {
/* Chip selects */
GPIO15_nCS_1, /* CS1 - Flash */
GPIO79_nCS_3, /* CS3 - IMAGEON */
GPIO80_nCS_4, /* CS4 - TMIO */
/* Clocks */
GPIO12_32KHz,
/* BTUART */
GPIO42_BTUART_RXD,
GPIO43_BTUART_TXD,
GPIO44_BTUART_CTS,
/* TMIO controller */
GPIO19_GPIO, /* t7l66xb #PCLR */
GPIO45_GPIO, /* t7l66xb #SUSPEND (NOT BTUART!) */
/* UDC */
GPIO13_GPIO,
GPIO3_GPIO,
/* IrDA */
GPIO38_GPIO | MFP_LPM_DRIVE_HIGH,
/* AC97 */
GPIO28_AC97_BITCLK,
GPIO29_AC97_SDATA_IN_0,
GPIO30_AC97_SDATA_OUT,
GPIO31_AC97_SYNC,
/* Audio power control */
GPIO16_GPIO, /* AC97 codec AVDD2 supply (analogue power) */
GPIO40_GPIO, /* Mic amp power */
GPIO41_GPIO, /* Headphone amp power */
/* PC Card */
GPIO8_GPIO, /* CD0 */
GPIO44_GPIO, /* CD1 */
GPIO11_GPIO, /* IRQ0 */
GPIO6_GPIO, /* IRQ1 */
GPIO27_GPIO, /* RST0 */
GPIO24_GPIO, /* RST1 */
GPIO20_GPIO, /* PWR0 */
GPIO23_GPIO, /* PWR1 */
GPIO48_nPOE,
GPIO49_nPWE,
GPIO50_nPIOR,
GPIO51_nPIOW,
GPIO52_nPCE_1,
GPIO53_nPCE_2,
GPIO54_nPSKTSEL,
GPIO55_nPREG,
GPIO56_nPWAIT,
GPIO57_nIOIS16,
/* wakeup */
GPIO0_GPIO | WAKEUP_ON_EDGE_RISE,
};
/* -------------------- e740 t7l66xb parameters -------------------- */
static struct t7l66xb_platform_data e740_t7l66xb_info = {
.irq_base = IRQ_BOARD_START,
.enable = &eseries_tmio_enable,
.suspend = &eseries_tmio_suspend,
.resume = &eseries_tmio_resume,
};
static struct platform_device e740_t7l66xb_device = {
.name = "t7l66xb",
.id = -1,
.dev = {
.platform_data = &e740_t7l66xb_info,
},
.num_resources = 2,
.resource = eseries_tmio_resources,
};
/* ----------------------------------------------------------------------- */
static struct platform_device *devices[] __initdata = {
&e740_fb_device,
&e740_t7l66xb_device,
};
static void __init e740_init(void)
{
pxa2xx_mfp_config(ARRAY_AND_SIZE(e740_pin_config));
pxa_set_ffuart_info(NULL);
pxa_set_btuart_info(NULL);
pxa_set_stuart_info(NULL);
eseries_register_clks();
clk_add_alias("CLK_CK48M", e740_t7l66xb_device.name,
"UDCCLK", &pxa25x_device_udc.dev),
eseries_get_tmio_gpios();
platform_add_devices(devices, ARRAY_SIZE(devices));
pxa_set_udc_info(&e7xx_udc_mach_info);
pxa_set_ac97_info(NULL);
pxa_set_ficp_info(&e7xx_ficp_platform_data);
}
MACHINE_START(E740, "Toshiba e740")
/* Maintainer: Ian Molton (spyro@f2s.com) */
.phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100,
.map_io = pxa_map_io,
.init_irq = pxa25x_init_irq,
.fixup = eseries_fixup,
.init_machine = e740_init,
.timer = &pxa_timer,
MACHINE_END

View File

@ -1,226 +0,0 @@
/*
* Hardware definitions for the Toshiba eseries PDAs
*
* Copyright (c) 2003 Ian Molton <spyro@f2s.com>
*
* This file is licensed under
* the terms of the GNU General Public License version 2. This program
* is licensed "as is" without any warranty of any kind, whether express
* or implied.
*
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/fb.h>
#include <linux/mfd/tc6393xb.h>
#include <video/w100fb.h>
#include <asm/setup.h>
#include <asm/mach/arch.h>
#include <asm/mach-types.h>
#include <mach/pxa25x.h>
#include <mach/eseries-gpio.h>
#include <mach/udc.h>
#include <mach/irda.h>
#include <mach/irqs.h>
#include <mach/audio.h>
#include "generic.h"
#include "eseries.h"
#include "clock.h"
/* ---------------------- E750 LCD definitions -------------------- */
static struct w100_gen_regs e750_lcd_regs = {
.lcd_format = 0x00008003,
.lcdd_cntl1 = 0x00000000,
.lcdd_cntl2 = 0x0003ffff,
.genlcd_cntl1 = 0x00fff003,
.genlcd_cntl2 = 0x003c0f03,
.genlcd_cntl3 = 0x000143aa,
};
static struct w100_mode e750_lcd_mode = {
.xres = 240,
.yres = 320,
.left_margin = 21,
.right_margin = 22,
.upper_margin = 5,
.lower_margin = 4,
.crtc_ss = 0x80150014,
.crtc_ls = 0x8014000d,
.crtc_gs = 0xc1000005,
.crtc_vpos_gs = 0x00020147,
.crtc_rev = 0x0040010a,
.crtc_dclk = 0xa1700030,
.crtc_gclk = 0x80cc0015,
.crtc_goe = 0x80cc0015,
.crtc_ps1_active = 0x61060017,
.pll_freq = 57,
.pixclk_divider = 4,
.pixclk_divider_rotated = 4,
.pixclk_src = CLK_SRC_XTAL,
.sysclk_divider = 1,
.sysclk_src = CLK_SRC_PLL,
};
static struct w100_gpio_regs e750_w100_gpio_info = {
.init_data1 = 0x01192f1b,
.gpio_dir1 = 0xd5ffdeff,
.gpio_oe1 = 0x000020bf,
.init_data2 = 0x010f010f,
.gpio_dir2 = 0xffffffff,
.gpio_oe2 = 0x000001cf,
};
static struct w100fb_mach_info e750_fb_info = {
.modelist = &e750_lcd_mode,
.num_modes = 1,
.regs = &e750_lcd_regs,
.gpio = &e750_w100_gpio_info,
.xtal_freq = 14318000,
.xtal_dbl = 1,
};
static struct resource e750_fb_resources[] = {
[0] = {
.start = 0x0c000000,
.end = 0x0cffffff,
.flags = IORESOURCE_MEM,
},
};
static struct platform_device e750_fb_device = {
.name = "w100fb",
.id = -1,
.dev = {
.platform_data = &e750_fb_info,
},
.num_resources = ARRAY_SIZE(e750_fb_resources),
.resource = e750_fb_resources,
};
/* -------------------- e750 MFP parameters -------------------- */
static unsigned long e750_pin_config[] __initdata = {
/* Chip selects */
GPIO15_nCS_1, /* CS1 - Flash */
GPIO79_nCS_3, /* CS3 - IMAGEON */
GPIO80_nCS_4, /* CS4 - TMIO */
/* Clocks */
GPIO11_3_6MHz,
/* BTUART */
GPIO42_BTUART_RXD,
GPIO43_BTUART_TXD,
GPIO44_BTUART_CTS,
/* TMIO controller */
GPIO19_GPIO, /* t7l66xb #PCLR */
GPIO45_GPIO, /* t7l66xb #SUSPEND (NOT BTUART!) */
/* UDC */
GPIO13_GPIO,
GPIO3_GPIO,
/* IrDA */
GPIO38_GPIO | MFP_LPM_DRIVE_HIGH,
/* AC97 */
GPIO28_AC97_BITCLK,
GPIO29_AC97_SDATA_IN_0,
GPIO30_AC97_SDATA_OUT,
GPIO31_AC97_SYNC,
/* Audio power control */
GPIO4_GPIO, /* Headphone amp power */
GPIO7_GPIO, /* Speaker amp power */
GPIO37_GPIO, /* Headphone detect */
/* PC Card */
GPIO8_GPIO, /* CD0 */
GPIO44_GPIO, /* CD1 */
GPIO11_GPIO, /* IRQ0 */
GPIO6_GPIO, /* IRQ1 */
GPIO27_GPIO, /* RST0 */
GPIO24_GPIO, /* RST1 */
GPIO20_GPIO, /* PWR0 */
GPIO23_GPIO, /* PWR1 */
GPIO48_nPOE,
GPIO49_nPWE,
GPIO50_nPIOR,
GPIO51_nPIOW,
GPIO52_nPCE_1,
GPIO53_nPCE_2,
GPIO54_nPSKTSEL,
GPIO55_nPREG,
GPIO56_nPWAIT,
GPIO57_nIOIS16,
/* wakeup */
GPIO0_GPIO | WAKEUP_ON_EDGE_RISE,
};
/* ----------------- e750 tc6393xb parameters ------------------ */
static struct tc6393xb_platform_data e750_tc6393xb_info = {
.irq_base = IRQ_BOARD_START,
.scr_pll2cr = 0x0cc1,
.scr_gper = 0,
.gpio_base = -1,
.suspend = &eseries_tmio_suspend,
.resume = &eseries_tmio_resume,
.enable = &eseries_tmio_enable,
.disable = &eseries_tmio_disable,
};
static struct platform_device e750_tc6393xb_device = {
.name = "tc6393xb",
.id = -1,
.dev = {
.platform_data = &e750_tc6393xb_info,
},
.num_resources = 2,
.resource = eseries_tmio_resources,
};
/* ------------------------------------------------------------- */
static struct platform_device *devices[] __initdata = {
&e750_fb_device,
&e750_tc6393xb_device,
};
static void __init e750_init(void)
{
pxa2xx_mfp_config(ARRAY_AND_SIZE(e750_pin_config));
pxa_set_ffuart_info(NULL);
pxa_set_btuart_info(NULL);
pxa_set_stuart_info(NULL);
clk_add_alias("CLK_CK3P6MI", e750_tc6393xb_device.name,
"GPIO11_CLK", NULL),
eseries_get_tmio_gpios();
platform_add_devices(devices, ARRAY_SIZE(devices));
pxa_set_udc_info(&e7xx_udc_mach_info);
pxa_set_ac97_info(NULL);
pxa_set_ficp_info(&e7xx_ficp_platform_data);
}
MACHINE_START(E750, "Toshiba e750")
/* Maintainer: Ian Molton (spyro@f2s.com) */
.phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100,
.map_io = pxa_map_io,
.init_irq = pxa25x_init_irq,
.fixup = eseries_fixup,
.init_machine = e750_init,
.timer = &pxa_timer,
MACHINE_END

View File

@ -1,229 +0,0 @@
/*
* Hardware definitions for the Toshiba eseries PDAs
*
* Copyright (c) 2003 Ian Molton <spyro@f2s.com>
*
* This file is licensed under
* the terms of the GNU General Public License version 2. This program
* is licensed "as is" without any warranty of any kind, whether express
* or implied.
*
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/fb.h>
#include <linux/mfd/tc6393xb.h>
#include <video/w100fb.h>
#include <asm/setup.h>
#include <asm/mach/arch.h>
#include <asm/mach-types.h>
#include <mach/pxa25x.h>
#include <mach/eseries-gpio.h>
#include <mach/udc.h>
#include <mach/irqs.h>
#include <mach/audio.h>
#include "generic.h"
#include "eseries.h"
#include "clock.h"
/* ------------------------ e800 LCD definitions ------------------------- */
static unsigned long e800_pin_config[] __initdata = {
/* AC97 */
GPIO28_AC97_BITCLK,
GPIO29_AC97_SDATA_IN_0,
GPIO30_AC97_SDATA_OUT,
GPIO31_AC97_SYNC,
};
static struct w100_gen_regs e800_lcd_regs = {
.lcd_format = 0x00008003,
.lcdd_cntl1 = 0x02a00000,
.lcdd_cntl2 = 0x0003ffff,
.genlcd_cntl1 = 0x000ff2a3,
.genlcd_cntl2 = 0x000002a3,
.genlcd_cntl3 = 0x000102aa,
};
static struct w100_mode e800_lcd_mode[2] = {
[0] = {
.xres = 480,
.yres = 640,
.left_margin = 52,
.right_margin = 148,
.upper_margin = 2,
.lower_margin = 6,
.crtc_ss = 0x80350034,
.crtc_ls = 0x802b0026,
.crtc_gs = 0x80160016,
.crtc_vpos_gs = 0x00020003,
.crtc_rev = 0x0040001d,
.crtc_dclk = 0xe0000000,
.crtc_gclk = 0x82a50049,
.crtc_goe = 0x80ee001c,
.crtc_ps1_active = 0x00000000,
.pll_freq = 128,
.pixclk_divider = 4,
.pixclk_divider_rotated = 6,
.pixclk_src = CLK_SRC_PLL,
.sysclk_divider = 0,
.sysclk_src = CLK_SRC_PLL,
},
[1] = {
.xres = 240,
.yres = 320,
.left_margin = 15,
.right_margin = 88,
.upper_margin = 0,
.lower_margin = 7,
.crtc_ss = 0xd010000f,
.crtc_ls = 0x80070003,
.crtc_gs = 0x80000000,
.crtc_vpos_gs = 0x01460147,
.crtc_rev = 0x00400003,
.crtc_dclk = 0xa1700030,
.crtc_gclk = 0x814b0008,
.crtc_goe = 0x80cc0015,
.crtc_ps1_active = 0x00000000,
.pll_freq = 100,
.pixclk_divider = 6, /* Wince uses 14 which gives a */
.pixclk_divider_rotated = 6, /* 7MHz Pclk. We use a 14MHz one */
.pixclk_src = CLK_SRC_PLL,
.sysclk_divider = 0,
.sysclk_src = CLK_SRC_PLL,
}
};
static struct w100_gpio_regs e800_w100_gpio_info = {
.init_data1 = 0xc13fc019,
.gpio_dir1 = 0x3e40df7f,
.gpio_oe1 = 0x003c3000,
.init_data2 = 0x00000000,
.gpio_dir2 = 0x00000000,
.gpio_oe2 = 0x00000000,
};
static struct w100_mem_info e800_w100_mem_info = {
.ext_cntl = 0x09640011,
.sdram_mode_reg = 0x00600021,
.ext_timing_cntl = 0x10001545,
.io_cntl = 0x7ddd7333,
.size = 0x1fffff,
};
static void e800_tg_change(struct w100fb_par *par)
{
unsigned long tmp;
tmp = w100fb_gpio_read(W100_GPIO_PORT_A);
if (par->mode->xres == 480)
tmp |= 0x100;
else
tmp &= ~0x100;
w100fb_gpio_write(W100_GPIO_PORT_A, tmp);
}
static struct w100_tg_info e800_tg_info = {
.change = e800_tg_change,
};
static struct w100fb_mach_info e800_fb_info = {
.modelist = e800_lcd_mode,
.num_modes = 2,
.regs = &e800_lcd_regs,
.gpio = &e800_w100_gpio_info,
.mem = &e800_w100_mem_info,
.tg = &e800_tg_info,
.xtal_freq = 16000000,
};
static struct resource e800_fb_resources[] = {
[0] = {
.start = 0x0c000000,
.end = 0x0cffffff,
.flags = IORESOURCE_MEM,
},
};
static struct platform_device e800_fb_device = {
.name = "w100fb",
.id = -1,
.dev = {
.platform_data = &e800_fb_info,
},
.num_resources = ARRAY_SIZE(e800_fb_resources),
.resource = e800_fb_resources,
};
/* --------------------------- UDC definitions --------------------------- */
static struct pxa2xx_udc_mach_info e800_udc_mach_info = {
.gpio_vbus = GPIO_E800_USB_DISC,
.gpio_pullup = GPIO_E800_USB_PULLUP,
.gpio_pullup_inverted = 1
};
/* ----------------- e800 tc6393xb parameters ------------------ */
static struct tc6393xb_platform_data e800_tc6393xb_info = {
.irq_base = IRQ_BOARD_START,
.scr_pll2cr = 0x0cc1,
.scr_gper = 0,
.gpio_base = -1,
.suspend = &eseries_tmio_suspend,
.resume = &eseries_tmio_resume,
.enable = &eseries_tmio_enable,
.disable = &eseries_tmio_disable,
};
static struct platform_device e800_tc6393xb_device = {
.name = "tc6393xb",
.id = -1,
.dev = {
.platform_data = &e800_tc6393xb_info,
},
.num_resources = 2,
.resource = eseries_tmio_resources,
};
/* ----------------------------------------------------------------------- */
static struct platform_device *devices[] __initdata = {
&e800_fb_device,
&e800_tc6393xb_device,
};
static void __init e800_init(void)
{
pxa2xx_mfp_config(ARRAY_AND_SIZE(e800_pin_config));
pxa_set_ffuart_info(NULL);
pxa_set_btuart_info(NULL);
pxa_set_stuart_info(NULL);
clk_add_alias("CLK_CK3P6MI", e800_tc6393xb_device.name,
"GPIO11_CLK", NULL),
eseries_get_tmio_gpios();
platform_add_devices(devices, ARRAY_SIZE(devices));
pxa_set_udc_info(&e800_udc_mach_info);
pxa_set_ac97_info(NULL);
}
MACHINE_START(E800, "Toshiba e800")
/* Maintainer: Ian Molton (spyro@f2s.com) */
.phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100,
.map_io = pxa_map_io,
.init_irq = pxa25x_init_irq,
.fixup = eseries_fixup,
.init_machine = e800_init,
.timer = &pxa_timer,
MACHINE_END

View File

@ -15,6 +15,13 @@
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/mfd/tc6387xb.h>
#include <linux/mfd/tc6393xb.h>
#include <linux/mfd/t7l66xb.h>
#include <linux/mtd/nand.h>
#include <linux/mtd/partitions.h>
#include <video/w100fb.h>
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
@ -22,9 +29,12 @@
#include <mach/pxa25x.h> #include <mach/pxa25x.h>
#include <mach/eseries-gpio.h> #include <mach/eseries-gpio.h>
#include <mach/audio.h>
#include <mach/pxafb.h>
#include <mach/udc.h> #include <mach/udc.h>
#include <mach/irda.h> #include <mach/irda.h>
#include "devices.h"
#include "generic.h" #include "generic.h"
#include "clock.h" #include "clock.h"
@ -130,3 +140,802 @@ void eseries_register_clks(void)
clkdev_add_table(eseries_clkregs, ARRAY_SIZE(eseries_clkregs)); clkdev_add_table(eseries_clkregs, ARRAY_SIZE(eseries_clkregs));
} }
#ifdef CONFIG_MACH_E330
/* -------------------- e330 tc6387xb parameters -------------------- */
static struct tc6387xb_platform_data e330_tc6387xb_info = {
.enable = &eseries_tmio_enable,
.disable = &eseries_tmio_disable,
.suspend = &eseries_tmio_suspend,
.resume = &eseries_tmio_resume,
};
static struct platform_device e330_tc6387xb_device = {
.name = "tc6387xb",
.id = -1,
.dev = {
.platform_data = &e330_tc6387xb_info,
},
.num_resources = 2,
.resource = eseries_tmio_resources,
};
/* --------------------------------------------------------------- */
static struct platform_device *e330_devices[] __initdata = {
&e330_tc6387xb_device,
};
static void __init e330_init(void)
{
pxa_set_ffuart_info(NULL);
pxa_set_btuart_info(NULL);
pxa_set_stuart_info(NULL);
eseries_register_clks();
eseries_get_tmio_gpios();
platform_add_devices(ARRAY_AND_SIZE(e330_devices));
pxa_set_udc_info(&e7xx_udc_mach_info);
}
MACHINE_START(E330, "Toshiba e330")
/* Maintainer: Ian Molton (spyro@f2s.com) */
.phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100,
.map_io = pxa_map_io,
.init_irq = pxa25x_init_irq,
.fixup = eseries_fixup,
.init_machine = e330_init,
.timer = &pxa_timer,
MACHINE_END
#endif
#ifdef CONFIG_MACH_E350
/* -------------------- e350 t7l66xb parameters -------------------- */
static struct t7l66xb_platform_data e350_t7l66xb_info = {
.irq_base = IRQ_BOARD_START,
.enable = &eseries_tmio_enable,
.suspend = &eseries_tmio_suspend,
.resume = &eseries_tmio_resume,
};
static struct platform_device e350_t7l66xb_device = {
.name = "t7l66xb",
.id = -1,
.dev = {
.platform_data = &e350_t7l66xb_info,
},
.num_resources = 2,
.resource = eseries_tmio_resources,
};
/* ---------------------------------------------------------- */
static struct platform_device *e350_devices[] __initdata = {
&e350_t7l66xb_device,
};
static void __init e350_init(void)
{
pxa_set_ffuart_info(NULL);
pxa_set_btuart_info(NULL);
pxa_set_stuart_info(NULL);
eseries_register_clks();
eseries_get_tmio_gpios();
platform_add_devices(ARRAY_AND_SIZE(e350_devices));
pxa_set_udc_info(&e7xx_udc_mach_info);
}
MACHINE_START(E350, "Toshiba e350")
/* Maintainer: Ian Molton (spyro@f2s.com) */
.phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100,
.map_io = pxa_map_io,
.init_irq = pxa25x_init_irq,
.fixup = eseries_fixup,
.init_machine = e350_init,
.timer = &pxa_timer,
MACHINE_END
#endif
#ifdef CONFIG_MACH_E400
/* ------------------------ E400 LCD definitions ------------------------ */
static struct pxafb_mode_info e400_pxafb_mode_info = {
.pixclock = 140703,
.xres = 240,
.yres = 320,
.bpp = 16,
.hsync_len = 4,
.left_margin = 28,
.right_margin = 8,
.vsync_len = 3,
.upper_margin = 5,
.lower_margin = 6,
.sync = 0,
};
static struct pxafb_mach_info e400_pxafb_mach_info = {
.modes = &e400_pxafb_mode_info,
.num_modes = 1,
.lcd_conn = LCD_COLOR_TFT_16BPP,
.lccr3 = 0,
.pxafb_backlight_power = NULL,
};
/* ------------------------ E400 MFP config ----------------------------- */
static unsigned long e400_pin_config[] __initdata = {
/* Chip selects */
GPIO15_nCS_1, /* CS1 - Flash */
GPIO80_nCS_4, /* CS4 - TMIO */
/* Clocks */
GPIO12_32KHz,
/* BTUART */
GPIO42_BTUART_RXD,
GPIO43_BTUART_TXD,
GPIO44_BTUART_CTS,
/* TMIO controller */
GPIO19_GPIO, /* t7l66xb #PCLR */
GPIO45_GPIO, /* t7l66xb #SUSPEND (NOT BTUART!) */
/* wakeup */
GPIO0_GPIO | WAKEUP_ON_EDGE_RISE,
};
/* ---------------------------------------------------------------------- */
static struct mtd_partition partition_a = {
.name = "Internal NAND flash",
.offset = 0,
.size = MTDPART_SIZ_FULL,
};
static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
static struct nand_bbt_descr e400_t7l66xb_nand_bbt = {
.options = 0,
.offs = 4,
.len = 2,
.pattern = scan_ff_pattern
};
static struct tmio_nand_data e400_t7l66xb_nand_config = {
.num_partitions = 1,
.partition = &partition_a,
.badblock_pattern = &e400_t7l66xb_nand_bbt,
};
static struct t7l66xb_platform_data e400_t7l66xb_info = {
.irq_base = IRQ_BOARD_START,
.enable = &eseries_tmio_enable,
.suspend = &eseries_tmio_suspend,
.resume = &eseries_tmio_resume,
.nand_data = &e400_t7l66xb_nand_config,
};
static struct platform_device e400_t7l66xb_device = {
.name = "t7l66xb",
.id = -1,
.dev = {
.platform_data = &e400_t7l66xb_info,
},
.num_resources = 2,
.resource = eseries_tmio_resources,
};
/* ---------------------------------------------------------- */
static struct platform_device *e400_devices[] __initdata = {
&e400_t7l66xb_device,
};
static void __init e400_init(void)
{
pxa2xx_mfp_config(ARRAY_AND_SIZE(e400_pin_config));
pxa_set_ffuart_info(NULL);
pxa_set_btuart_info(NULL);
pxa_set_stuart_info(NULL);
/* Fixme - e400 may have a switched clock */
eseries_register_clks();
eseries_get_tmio_gpios();
set_pxa_fb_info(&e400_pxafb_mach_info);
platform_add_devices(ARRAY_AND_SIZE(e400_devices));
pxa_set_udc_info(&e7xx_udc_mach_info);
}
MACHINE_START(E400, "Toshiba e400")
/* Maintainer: Ian Molton (spyro@f2s.com) */
.phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100,
.map_io = pxa_map_io,
.init_irq = pxa25x_init_irq,
.fixup = eseries_fixup,
.init_machine = e400_init,
.timer = &pxa_timer,
MACHINE_END
#endif
#ifdef CONFIG_MACH_E740
/* ------------------------ e740 video support --------------------------- */
static struct w100_gen_regs e740_lcd_regs = {
.lcd_format = 0x00008023,
.lcdd_cntl1 = 0x0f000000,
.lcdd_cntl2 = 0x0003ffff,
.genlcd_cntl1 = 0x00ffff03,
.genlcd_cntl2 = 0x003c0f03,
.genlcd_cntl3 = 0x000143aa,
};
static struct w100_mode e740_lcd_mode = {
.xres = 240,
.yres = 320,
.left_margin = 20,
.right_margin = 28,
.upper_margin = 9,
.lower_margin = 8,
.crtc_ss = 0x80140013,
.crtc_ls = 0x81150110,
.crtc_gs = 0x80050005,
.crtc_vpos_gs = 0x000a0009,
.crtc_rev = 0x0040010a,
.crtc_dclk = 0xa906000a,
.crtc_gclk = 0x80050108,
.crtc_goe = 0x80050108,
.pll_freq = 57,
.pixclk_divider = 4,
.pixclk_divider_rotated = 4,
.pixclk_src = CLK_SRC_XTAL,
.sysclk_divider = 1,
.sysclk_src = CLK_SRC_PLL,
.crtc_ps1_active = 0x41060010,
};
static struct w100_gpio_regs e740_w100_gpio_info = {
.init_data1 = 0x21002103,
.gpio_dir1 = 0xffffdeff,
.gpio_oe1 = 0x03c00643,
.init_data2 = 0x003f003f,
.gpio_dir2 = 0xffffffff,
.gpio_oe2 = 0x000000ff,
};
static struct w100fb_mach_info e740_fb_info = {
.modelist = &e740_lcd_mode,
.num_modes = 1,
.regs = &e740_lcd_regs,
.gpio = &e740_w100_gpio_info,
.xtal_freq = 14318000,
.xtal_dbl = 1,
};
static struct resource e740_fb_resources[] = {
[0] = {
.start = 0x0c000000,
.end = 0x0cffffff,
.flags = IORESOURCE_MEM,
},
};
static struct platform_device e740_fb_device = {
.name = "w100fb",
.id = -1,
.dev = {
.platform_data = &e740_fb_info,
},
.num_resources = ARRAY_SIZE(e740_fb_resources),
.resource = e740_fb_resources,
};
/* --------------------------- MFP Pin config -------------------------- */
static unsigned long e740_pin_config[] __initdata = {
/* Chip selects */
GPIO15_nCS_1, /* CS1 - Flash */
GPIO79_nCS_3, /* CS3 - IMAGEON */
GPIO80_nCS_4, /* CS4 - TMIO */
/* Clocks */
GPIO12_32KHz,
/* BTUART */
GPIO42_BTUART_RXD,
GPIO43_BTUART_TXD,
GPIO44_BTUART_CTS,
/* TMIO controller */
GPIO19_GPIO, /* t7l66xb #PCLR */
GPIO45_GPIO, /* t7l66xb #SUSPEND (NOT BTUART!) */
/* UDC */
GPIO13_GPIO,
GPIO3_GPIO,
/* IrDA */
GPIO38_GPIO | MFP_LPM_DRIVE_HIGH,
/* AC97 */
GPIO28_AC97_BITCLK,
GPIO29_AC97_SDATA_IN_0,
GPIO30_AC97_SDATA_OUT,
GPIO31_AC97_SYNC,
/* Audio power control */
GPIO16_GPIO, /* AC97 codec AVDD2 supply (analogue power) */
GPIO40_GPIO, /* Mic amp power */
GPIO41_GPIO, /* Headphone amp power */
/* PC Card */
GPIO8_GPIO, /* CD0 */
GPIO44_GPIO, /* CD1 */
GPIO11_GPIO, /* IRQ0 */
GPIO6_GPIO, /* IRQ1 */
GPIO27_GPIO, /* RST0 */
GPIO24_GPIO, /* RST1 */
GPIO20_GPIO, /* PWR0 */
GPIO23_GPIO, /* PWR1 */
GPIO48_nPOE,
GPIO49_nPWE,
GPIO50_nPIOR,
GPIO51_nPIOW,
GPIO52_nPCE_1,
GPIO53_nPCE_2,
GPIO54_nPSKTSEL,
GPIO55_nPREG,
GPIO56_nPWAIT,
GPIO57_nIOIS16,
/* wakeup */
GPIO0_GPIO | WAKEUP_ON_EDGE_RISE,
};
/* -------------------- e740 t7l66xb parameters -------------------- */
static struct t7l66xb_platform_data e740_t7l66xb_info = {
.irq_base = IRQ_BOARD_START,
.enable = &eseries_tmio_enable,
.suspend = &eseries_tmio_suspend,
.resume = &eseries_tmio_resume,
};
static struct platform_device e740_t7l66xb_device = {
.name = "t7l66xb",
.id = -1,
.dev = {
.platform_data = &e740_t7l66xb_info,
},
.num_resources = 2,
.resource = eseries_tmio_resources,
};
/* ----------------------------------------------------------------------- */
static struct platform_device *e740_devices[] __initdata = {
&e740_fb_device,
&e740_t7l66xb_device,
};
static void __init e740_init(void)
{
pxa2xx_mfp_config(ARRAY_AND_SIZE(e740_pin_config));
pxa_set_ffuart_info(NULL);
pxa_set_btuart_info(NULL);
pxa_set_stuart_info(NULL);
eseries_register_clks();
clk_add_alias("CLK_CK48M", e740_t7l66xb_device.name,
"UDCCLK", &pxa25x_device_udc.dev),
eseries_get_tmio_gpios();
platform_add_devices(ARRAY_AND_SIZE(e740_devices));
pxa_set_udc_info(&e7xx_udc_mach_info);
pxa_set_ac97_info(NULL);
pxa_set_ficp_info(&e7xx_ficp_platform_data);
}
MACHINE_START(E740, "Toshiba e740")
/* Maintainer: Ian Molton (spyro@f2s.com) */
.phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100,
.map_io = pxa_map_io,
.init_irq = pxa25x_init_irq,
.fixup = eseries_fixup,
.init_machine = e740_init,
.timer = &pxa_timer,
MACHINE_END
#endif
#ifdef CONFIG_MACH_E750
/* ---------------------- E750 LCD definitions -------------------- */
static struct w100_gen_regs e750_lcd_regs = {
.lcd_format = 0x00008003,
.lcdd_cntl1 = 0x00000000,
.lcdd_cntl2 = 0x0003ffff,
.genlcd_cntl1 = 0x00fff003,
.genlcd_cntl2 = 0x003c0f03,
.genlcd_cntl3 = 0x000143aa,
};
static struct w100_mode e750_lcd_mode = {
.xres = 240,
.yres = 320,
.left_margin = 21,
.right_margin = 22,
.upper_margin = 5,
.lower_margin = 4,
.crtc_ss = 0x80150014,
.crtc_ls = 0x8014000d,
.crtc_gs = 0xc1000005,
.crtc_vpos_gs = 0x00020147,
.crtc_rev = 0x0040010a,
.crtc_dclk = 0xa1700030,
.crtc_gclk = 0x80cc0015,
.crtc_goe = 0x80cc0015,
.crtc_ps1_active = 0x61060017,
.pll_freq = 57,
.pixclk_divider = 4,
.pixclk_divider_rotated = 4,
.pixclk_src = CLK_SRC_XTAL,
.sysclk_divider = 1,
.sysclk_src = CLK_SRC_PLL,
};
static struct w100_gpio_regs e750_w100_gpio_info = {
.init_data1 = 0x01192f1b,
.gpio_dir1 = 0xd5ffdeff,
.gpio_oe1 = 0x000020bf,
.init_data2 = 0x010f010f,
.gpio_dir2 = 0xffffffff,
.gpio_oe2 = 0x000001cf,
};
static struct w100fb_mach_info e750_fb_info = {
.modelist = &e750_lcd_mode,
.num_modes = 1,
.regs = &e750_lcd_regs,
.gpio = &e750_w100_gpio_info,
.xtal_freq = 14318000,
.xtal_dbl = 1,
};
static struct resource e750_fb_resources[] = {
[0] = {
.start = 0x0c000000,
.end = 0x0cffffff,
.flags = IORESOURCE_MEM,
},
};
static struct platform_device e750_fb_device = {
.name = "w100fb",
.id = -1,
.dev = {
.platform_data = &e750_fb_info,
},
.num_resources = ARRAY_SIZE(e750_fb_resources),
.resource = e750_fb_resources,
};
/* -------------------- e750 MFP parameters -------------------- */
static unsigned long e750_pin_config[] __initdata = {
/* Chip selects */
GPIO15_nCS_1, /* CS1 - Flash */
GPIO79_nCS_3, /* CS3 - IMAGEON */
GPIO80_nCS_4, /* CS4 - TMIO */
/* Clocks */
GPIO11_3_6MHz,
/* BTUART */
GPIO42_BTUART_RXD,
GPIO43_BTUART_TXD,
GPIO44_BTUART_CTS,
/* TMIO controller */
GPIO19_GPIO, /* t7l66xb #PCLR */
GPIO45_GPIO, /* t7l66xb #SUSPEND (NOT BTUART!) */
/* UDC */
GPIO13_GPIO,
GPIO3_GPIO,
/* IrDA */
GPIO38_GPIO | MFP_LPM_DRIVE_HIGH,
/* AC97 */
GPIO28_AC97_BITCLK,
GPIO29_AC97_SDATA_IN_0,
GPIO30_AC97_SDATA_OUT,
GPIO31_AC97_SYNC,
/* Audio power control */
GPIO4_GPIO, /* Headphone amp power */
GPIO7_GPIO, /* Speaker amp power */
GPIO37_GPIO, /* Headphone detect */
/* PC Card */
GPIO8_GPIO, /* CD0 */
GPIO44_GPIO, /* CD1 */
GPIO11_GPIO, /* IRQ0 */
GPIO6_GPIO, /* IRQ1 */
GPIO27_GPIO, /* RST0 */
GPIO24_GPIO, /* RST1 */
GPIO20_GPIO, /* PWR0 */
GPIO23_GPIO, /* PWR1 */
GPIO48_nPOE,
GPIO49_nPWE,
GPIO50_nPIOR,
GPIO51_nPIOW,
GPIO52_nPCE_1,
GPIO53_nPCE_2,
GPIO54_nPSKTSEL,
GPIO55_nPREG,
GPIO56_nPWAIT,
GPIO57_nIOIS16,
/* wakeup */
GPIO0_GPIO | WAKEUP_ON_EDGE_RISE,
};
/* ----------------- e750 tc6393xb parameters ------------------ */
static struct tc6393xb_platform_data e750_tc6393xb_info = {
.irq_base = IRQ_BOARD_START,
.scr_pll2cr = 0x0cc1,
.scr_gper = 0,
.gpio_base = -1,
.suspend = &eseries_tmio_suspend,
.resume = &eseries_tmio_resume,
.enable = &eseries_tmio_enable,
.disable = &eseries_tmio_disable,
};
static struct platform_device e750_tc6393xb_device = {
.name = "tc6393xb",
.id = -1,
.dev = {
.platform_data = &e750_tc6393xb_info,
},
.num_resources = 2,
.resource = eseries_tmio_resources,
};
/* ------------------------------------------------------------- */
static struct platform_device *e750_devices[] __initdata = {
&e750_fb_device,
&e750_tc6393xb_device,
};
static void __init e750_init(void)
{
pxa2xx_mfp_config(ARRAY_AND_SIZE(e750_pin_config));
pxa_set_ffuart_info(NULL);
pxa_set_btuart_info(NULL);
pxa_set_stuart_info(NULL);
clk_add_alias("CLK_CK3P6MI", e750_tc6393xb_device.name,
"GPIO11_CLK", NULL),
eseries_get_tmio_gpios();
platform_add_devices(ARRAY_AND_SIZE(e750_devices));
pxa_set_udc_info(&e7xx_udc_mach_info);
pxa_set_ac97_info(NULL);
pxa_set_ficp_info(&e7xx_ficp_platform_data);
}
MACHINE_START(E750, "Toshiba e750")
/* Maintainer: Ian Molton (spyro@f2s.com) */
.phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100,
.map_io = pxa_map_io,
.init_irq = pxa25x_init_irq,
.fixup = eseries_fixup,
.init_machine = e750_init,
.timer = &pxa_timer,
MACHINE_END
#endif
#ifdef CONFIG_MACH_E800
/* ------------------------ e800 LCD definitions ------------------------- */
static unsigned long e800_pin_config[] __initdata = {
/* AC97 */
GPIO28_AC97_BITCLK,
GPIO29_AC97_SDATA_IN_0,
GPIO30_AC97_SDATA_OUT,
GPIO31_AC97_SYNC,
};
static struct w100_gen_regs e800_lcd_regs = {
.lcd_format = 0x00008003,
.lcdd_cntl1 = 0x02a00000,
.lcdd_cntl2 = 0x0003ffff,
.genlcd_cntl1 = 0x000ff2a3,
.genlcd_cntl2 = 0x000002a3,
.genlcd_cntl3 = 0x000102aa,
};
static struct w100_mode e800_lcd_mode[2] = {
[0] = {
.xres = 480,
.yres = 640,
.left_margin = 52,
.right_margin = 148,
.upper_margin = 2,
.lower_margin = 6,
.crtc_ss = 0x80350034,
.crtc_ls = 0x802b0026,
.crtc_gs = 0x80160016,
.crtc_vpos_gs = 0x00020003,
.crtc_rev = 0x0040001d,
.crtc_dclk = 0xe0000000,
.crtc_gclk = 0x82a50049,
.crtc_goe = 0x80ee001c,
.crtc_ps1_active = 0x00000000,
.pll_freq = 128,
.pixclk_divider = 4,
.pixclk_divider_rotated = 6,
.pixclk_src = CLK_SRC_PLL,
.sysclk_divider = 0,
.sysclk_src = CLK_SRC_PLL,
},
[1] = {
.xres = 240,
.yres = 320,
.left_margin = 15,
.right_margin = 88,
.upper_margin = 0,
.lower_margin = 7,
.crtc_ss = 0xd010000f,
.crtc_ls = 0x80070003,
.crtc_gs = 0x80000000,
.crtc_vpos_gs = 0x01460147,
.crtc_rev = 0x00400003,
.crtc_dclk = 0xa1700030,
.crtc_gclk = 0x814b0008,
.crtc_goe = 0x80cc0015,
.crtc_ps1_active = 0x00000000,
.pll_freq = 100,
.pixclk_divider = 6, /* Wince uses 14 which gives a */
.pixclk_divider_rotated = 6, /* 7MHz Pclk. We use a 14MHz one */
.pixclk_src = CLK_SRC_PLL,
.sysclk_divider = 0,
.sysclk_src = CLK_SRC_PLL,
}
};
static struct w100_gpio_regs e800_w100_gpio_info = {
.init_data1 = 0xc13fc019,
.gpio_dir1 = 0x3e40df7f,
.gpio_oe1 = 0x003c3000,
.init_data2 = 0x00000000,
.gpio_dir2 = 0x00000000,
.gpio_oe2 = 0x00000000,
};
static struct w100_mem_info e800_w100_mem_info = {
.ext_cntl = 0x09640011,
.sdram_mode_reg = 0x00600021,
.ext_timing_cntl = 0x10001545,
.io_cntl = 0x7ddd7333,
.size = 0x1fffff,
};
static void e800_tg_change(struct w100fb_par *par)
{
unsigned long tmp;
tmp = w100fb_gpio_read(W100_GPIO_PORT_A);
if (par->mode->xres == 480)
tmp |= 0x100;
else
tmp &= ~0x100;
w100fb_gpio_write(W100_GPIO_PORT_A, tmp);
}
static struct w100_tg_info e800_tg_info = {
.change = e800_tg_change,
};
static struct w100fb_mach_info e800_fb_info = {
.modelist = e800_lcd_mode,
.num_modes = 2,
.regs = &e800_lcd_regs,
.gpio = &e800_w100_gpio_info,
.mem = &e800_w100_mem_info,
.tg = &e800_tg_info,
.xtal_freq = 16000000,
};
static struct resource e800_fb_resources[] = {
[0] = {
.start = 0x0c000000,
.end = 0x0cffffff,
.flags = IORESOURCE_MEM,
},
};
static struct platform_device e800_fb_device = {
.name = "w100fb",
.id = -1,
.dev = {
.platform_data = &e800_fb_info,
},
.num_resources = ARRAY_SIZE(e800_fb_resources),
.resource = e800_fb_resources,
};
/* --------------------------- UDC definitions --------------------------- */
static struct pxa2xx_udc_mach_info e800_udc_mach_info = {
.gpio_vbus = GPIO_E800_USB_DISC,
.gpio_pullup = GPIO_E800_USB_PULLUP,
.gpio_pullup_inverted = 1
};
/* ----------------- e800 tc6393xb parameters ------------------ */
static struct tc6393xb_platform_data e800_tc6393xb_info = {
.irq_base = IRQ_BOARD_START,
.scr_pll2cr = 0x0cc1,
.scr_gper = 0,
.gpio_base = -1,
.suspend = &eseries_tmio_suspend,
.resume = &eseries_tmio_resume,
.enable = &eseries_tmio_enable,
.disable = &eseries_tmio_disable,
};
static struct platform_device e800_tc6393xb_device = {
.name = "tc6393xb",
.id = -1,
.dev = {
.platform_data = &e800_tc6393xb_info,
},
.num_resources = 2,
.resource = eseries_tmio_resources,
};
/* ----------------------------------------------------------------------- */
static struct platform_device *e800_devices[] __initdata = {
&e800_fb_device,
&e800_tc6393xb_device,
};
static void __init e800_init(void)
{
pxa2xx_mfp_config(ARRAY_AND_SIZE(e800_pin_config));
pxa_set_ffuart_info(NULL);
pxa_set_btuart_info(NULL);
pxa_set_stuart_info(NULL);
clk_add_alias("CLK_CK3P6MI", e800_tc6393xb_device.name,
"GPIO11_CLK", NULL),
eseries_get_tmio_gpios();
platform_add_devices(ARRAY_AND_SIZE(e800_devices));
pxa_set_udc_info(&e800_udc_mach_info);
pxa_set_ac97_info(NULL);
}
MACHINE_START(E800, "Toshiba e800")
/* Maintainer: Ian Molton (spyro@f2s.com) */
.phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100,
.map_io = pxa_map_io,
.init_irq = pxa25x_init_irq,
.fixup = eseries_fixup,
.init_machine = e800_init,
.timer = &pxa_timer,
MACHINE_END
#endif

View File

@ -1,590 +0,0 @@
/*
* linux/arch/arm/mach-pxa/imote2.c
*
* Author: Ed C. Epp
* Created: Nov 05, 2002
* Copyright: Intel Corp.
*
* Modified 2008: Jonathan Cameron
*
* The Imote2 is a wireless sensor node platform sold
* by Crossbow (www.xbow.com).
*/
#include <linux/init.h>
#include <linux/device.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
#include <linux/platform_device.h>
#include <linux/regulator/machine.h>
#include <linux/gpio.h>
#include <linux/leds.h>
#include <linux/spi/spi.h>
#include <linux/i2c.h>
#include <linux/mfd/da903x.h>
#include <linux/sht15.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
#include <asm/mach/map.h>
#include <asm/mach/flash.h>
#include <mach/pxa27x.h>
#include <plat/i2c.h>
#include <mach/udc.h>
#include <mach/mmc.h>
#include <mach/pxa2xx_spi.h>
#include <mach/pxa27x-udc.h>
#include "devices.h"
#include "generic.h"
static unsigned long imote2_pin_config[] __initdata = {
/* Device Identification for wakeup*/
GPIO102_GPIO,
/* Button */
GPIO91_GPIO,
/* DA9030 */
GPIO1_GPIO,
/* MMC */
GPIO32_MMC_CLK,
GPIO112_MMC_CMD,
GPIO92_MMC_DAT_0,
GPIO109_MMC_DAT_1,
GPIO110_MMC_DAT_2,
GPIO111_MMC_DAT_3,
/* 802.15.4 radio - driver out of mainline */
GPIO22_GPIO, /* CC_RSTN */
GPIO114_GPIO, /* CC_FIFO */
GPIO116_GPIO, /* CC_CCA */
GPIO0_GPIO, /* CC_FIFOP */
GPIO16_GPIO, /* CCSFD */
GPIO115_GPIO, /* Power enable */
/* I2C */
GPIO117_I2C_SCL,
GPIO118_I2C_SDA,
/* SSP 3 - 802.15.4 radio */
GPIO39_GPIO, /* Chip Select */
GPIO34_SSP3_SCLK,
GPIO35_SSP3_TXD,
GPIO41_SSP3_RXD,
/* SSP 2 - to daughter boards */
GPIO37_GPIO, /* Chip Select */
GPIO36_SSP2_SCLK,
GPIO38_SSP2_TXD,
GPIO11_SSP2_RXD,
/* SSP 1 - to daughter boards */
GPIO24_GPIO, /* Chip Select */
GPIO23_SSP1_SCLK,
GPIO25_SSP1_TXD,
GPIO26_SSP1_RXD,
/* BTUART Basic Connector*/
GPIO42_BTUART_RXD,
GPIO43_BTUART_TXD,
GPIO44_BTUART_CTS,
GPIO45_BTUART_RTS,
/* STUART Serial console via debug board*/
GPIO46_STUART_RXD,
GPIO47_STUART_TXD,
/* Basic sensor board */
GPIO96_GPIO, /* accelerometer interrupt */
GPIO99_GPIO, /* ADC interrupt */
/* SHT15 */
GPIO100_GPIO,
GPIO98_GPIO,
/* Connector pins specified as gpios */
GPIO94_GPIO, /* large basic connector pin 14 */
GPIO10_GPIO, /* large basic connector pin 23 */
/* LEDS */
GPIO103_GPIO, /* red led */
GPIO104_GPIO, /* green led */
GPIO105_GPIO, /* blue led */
};
static struct sht15_platform_data platform_data_sht15 = {
.gpio_data = 100,
.gpio_sck = 98,
};
static struct platform_device sht15 = {
.name = "sht15",
.id = -1,
.dev = {
.platform_data = &platform_data_sht15,
},
};
static struct regulator_consumer_supply imote2_sensor_3_con[] = {
{
.dev = &sht15.dev,
.supply = "vcc",
},
};
static struct gpio_led imote2_led_pins[] = {
{
.name = "imote2:red",
.gpio = 103,
.active_low = 1,
}, {
.name = "imote2:green",
.gpio = 104,
.active_low = 1,
}, {
.name = "imote2:blue",
.gpio = 105,
.active_low = 1,
},
};
static struct gpio_led_platform_data imote2_led_data = {
.num_leds = ARRAY_SIZE(imote2_led_pins),
.leds = imote2_led_pins,
};
static struct platform_device imote2_leds = {
.name = "leds-gpio",
.id = -1,
.dev = {
.platform_data = &imote2_led_data,
},
};
/* Reverse engineered partly from Platformx drivers */
enum imote2_ldos{
vcc_vref,
vcc_cc2420,
vcc_mica,
vcc_bt,
/* The two voltages available to sensor boards */
vcc_sensor_1_8,
vcc_sensor_3,
vcc_sram_ext, /* directly connected to the pxa271 */
vcc_pxa_pll,
vcc_pxa_usim, /* Reference voltage for certain gpios */
vcc_pxa_mem,
vcc_pxa_flash,
vcc_pxa_core, /*Dc-Dc buck not yet supported */
vcc_lcd,
vcc_bb,
vcc_bbio,
vcc_io, /* cc2420 802.15.4 radio and pxa vcc_io ?*/
};
/* The values of the various regulator constraints are obviously dependent
* on exactly what is wired to each ldo. Unfortunately this information is
* not generally available. More information has been requested from Xbow
* but as of yet they haven't been forthcoming.
*
* Some of these are clearly Stargate 2 related (no way of plugging
* in an lcd on the IM2 for example!).
*/
static struct regulator_init_data imote2_ldo_init_data[] = {
[vcc_bbio] = {
.constraints = { /* board default 1.8V */
.name = "vcc_bbio",
.min_uV = 1800000,
.max_uV = 1800000,
},
},
[vcc_bb] = {
.constraints = { /* board default 2.8V */
.name = "vcc_bb",
.min_uV = 2700000,
.max_uV = 3000000,
},
},
[vcc_pxa_flash] = {
.constraints = {/* default is 1.8V */
.name = "vcc_pxa_flash",
.min_uV = 1800000,
.max_uV = 1800000,
},
},
[vcc_cc2420] = { /* also vcc_io */
.constraints = {
/* board default is 2.8V */
.name = "vcc_cc2420",
.min_uV = 2700000,
.max_uV = 3300000,
},
},
[vcc_vref] = { /* Reference for what? */
.constraints = { /* default 1.8V */
.name = "vcc_vref",
.min_uV = 1800000,
.max_uV = 1800000,
},
},
[vcc_sram_ext] = {
.constraints = { /* default 2.8V */
.name = "vcc_sram_ext",
.min_uV = 2800000,
.max_uV = 2800000,
},
},
[vcc_mica] = {
.constraints = { /* default 2.8V */
.name = "vcc_mica",
.min_uV = 2800000,
.max_uV = 2800000,
},
},
[vcc_bt] = {
.constraints = { /* default 2.8V */
.name = "vcc_bt",
.min_uV = 2800000,
.max_uV = 2800000,
},
},
[vcc_lcd] = {
.constraints = { /* default 2.8V */
.name = "vcc_lcd",
.min_uV = 2700000,
.max_uV = 3300000,
},
},
[vcc_io] = { /* Same or higher than everything
* bar vccbat and vccusb */
.constraints = { /* default 2.8V */
.name = "vcc_io",
.min_uV = 2692000,
.max_uV = 3300000,
},
},
[vcc_sensor_1_8] = {
.constraints = { /* default 1.8V */
.name = "vcc_sensor_1_8",
.min_uV = 1800000,
.max_uV = 1800000,
},
},
[vcc_sensor_3] = { /* curiously default 2.8V */
.constraints = {
.name = "vcc_sensor_3",
.min_uV = 2800000,
.max_uV = 3000000,
},
.num_consumer_supplies = ARRAY_SIZE(imote2_sensor_3_con),
.consumer_supplies = imote2_sensor_3_con,
},
[vcc_pxa_pll] = { /* 1.17V - 1.43V, default 1.3V*/
.constraints = {
.name = "vcc_pxa_pll",
.min_uV = 1170000,
.max_uV = 1430000,
},
},
[vcc_pxa_usim] = {
.constraints = { /* default 1.8V */
.name = "vcc_pxa_usim",
.min_uV = 1710000,
.max_uV = 2160000,
},
},
[vcc_pxa_mem] = {
.constraints = { /* default 1.8V */
.name = "vcc_pxa_mem",
.min_uV = 1800000,
.max_uV = 1800000,
},
},
};
static struct da903x_subdev_info imote2_da9030_subdevs[] = {
{
.name = "da903x-regulator",
.id = DA9030_ID_LDO2,
.platform_data = &imote2_ldo_init_data[vcc_bbio],
}, {
.name = "da903x-regulator",
.id = DA9030_ID_LDO3,
.platform_data = &imote2_ldo_init_data[vcc_bb],
}, {
.name = "da903x-regulator",
.id = DA9030_ID_LDO4,
.platform_data = &imote2_ldo_init_data[vcc_pxa_flash],
}, {
.name = "da903x-regulator",
.id = DA9030_ID_LDO5,
.platform_data = &imote2_ldo_init_data[vcc_cc2420],
}, {
.name = "da903x-regulator",
.id = DA9030_ID_LDO6,
.platform_data = &imote2_ldo_init_data[vcc_vref],
}, {
.name = "da903x-regulator",
.id = DA9030_ID_LDO7,
.platform_data = &imote2_ldo_init_data[vcc_sram_ext],
}, {
.name = "da903x-regulator",
.id = DA9030_ID_LDO8,
.platform_data = &imote2_ldo_init_data[vcc_mica],
}, {
.name = "da903x-regulator",
.id = DA9030_ID_LDO9,
.platform_data = &imote2_ldo_init_data[vcc_bt],
}, {
.name = "da903x-regulator",
.id = DA9030_ID_LDO10,
.platform_data = &imote2_ldo_init_data[vcc_sensor_1_8],
}, {
.name = "da903x-regulator",
.id = DA9030_ID_LDO11,
.platform_data = &imote2_ldo_init_data[vcc_sensor_3],
}, {
.name = "da903x-regulator",
.id = DA9030_ID_LDO12,
.platform_data = &imote2_ldo_init_data[vcc_lcd],
}, {
.name = "da903x-regulator",
.id = DA9030_ID_LDO15,
.platform_data = &imote2_ldo_init_data[vcc_pxa_pll],
}, {
.name = "da903x-regulator",
.id = DA9030_ID_LDO17,
.platform_data = &imote2_ldo_init_data[vcc_pxa_usim],
}, {
.name = "da903x-regulator",
.id = DA9030_ID_LDO18,
.platform_data = &imote2_ldo_init_data[vcc_io],
}, {
.name = "da903x-regulator",
.id = DA9030_ID_LDO19,
.platform_data = &imote2_ldo_init_data[vcc_pxa_mem],
},
};
static struct da903x_platform_data imote2_da9030_pdata = {
.num_subdevs = ARRAY_SIZE(imote2_da9030_subdevs),
.subdevs = imote2_da9030_subdevs,
};
/* As the the imote2 doesn't currently have a conventional SD slot
* there is no option to hotplug cards, making all this rather simple
*/
static int imote2_mci_get_ro(struct device *dev)
{
return 0;
}
/* Rather simple case as hotplugging not possible */
static struct pxamci_platform_data imote2_mci_platform_data = {
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, /* default anyway */
.get_ro = imote2_mci_get_ro,
.gpio_card_detect = -1,
.gpio_card_ro = -1,
.gpio_power = -1,
};
static struct mtd_partition imote2flash_partitions[] = {
{
.name = "Bootloader",
.size = 0x00040000,
.offset = 0,
.mask_flags = MTD_WRITEABLE,
}, {
.name = "Kernel",
.size = 0x00200000,
.offset = 0x00040000,
.mask_flags = 0,
}, {
.name = "Filesystem",
.size = 0x01DC0000,
.offset = 0x00240000,
.mask_flags = 0,
},
};
static struct resource flash_resources = {
.start = PXA_CS0_PHYS,
.end = PXA_CS0_PHYS + SZ_32M - 1,
.flags = IORESOURCE_MEM,
};
static struct flash_platform_data imote2_flash_data = {
.map_name = "cfi_probe",
.parts = imote2flash_partitions,
.nr_parts = ARRAY_SIZE(imote2flash_partitions),
.name = "PXA27xOnChipROM",
.width = 2,
};
static struct platform_device imote2_flash_device = {
.name = "pxa2xx-flash",
.id = 0,
.dev = {
.platform_data = &imote2_flash_data,
},
.resource = &flash_resources,
.num_resources = 1,
};
/* Some of the drivers here are out of kernel at the moment (parts of IIO)
* and it may be a while before they are in the mainline.
*/
static struct i2c_board_info __initdata imote2_i2c_board_info[] = {
{ /* UCAM sensor board */
.type = "max1239",
.addr = 0x35,
}, { /* ITS400 Sensor board only */
.type = "max1363",
.addr = 0x34,
/* Through a nand gate - Also beware, on V2 sensor board the
* pull up resistors are missing.
*/
.irq = IRQ_GPIO(99),
}, { /* ITS400 Sensor board only */
.type = "tsl2561",
.addr = 0x49,
/* Through a nand gate - Also beware, on V2 sensor board the
* pull up resistors are missing.
*/
.irq = IRQ_GPIO(99),
}, { /* ITS400 Sensor board only */
.type = "tmp175",
.addr = 0x4A,
.irq = IRQ_GPIO(96),
}, { /* IMB400 Multimedia board */
.type = "wm8940",
.addr = 0x1A,
},
};
static struct i2c_board_info __initdata imote2_pwr_i2c_board_info[] = {
{
.type = "da9030",
.addr = 0x49,
.platform_data = &imote2_da9030_pdata,
.irq = gpio_to_irq(1),
},
};
static struct pxa2xx_spi_master pxa_ssp_master_0_info = {
.num_chipselect = 1,
};
static struct pxa2xx_spi_master pxa_ssp_master_1_info = {
.num_chipselect = 1,
};
static struct pxa2xx_spi_master pxa_ssp_master_2_info = {
.num_chipselect = 1,
};
static struct pxa2xx_spi_chip staccel_chip_info = {
.tx_threshold = 8,
.rx_threshold = 8,
.dma_burst_size = 8,
.timeout = 235,
.gpio_cs = 24,
};
static struct pxa2xx_spi_chip cc2420_info = {
.tx_threshold = 8,
.rx_threshold = 8,
.dma_burst_size = 8,
.timeout = 235,
.gpio_cs = 39,
};
static struct spi_board_info spi_board_info[] __initdata = {
{ /* Driver in IIO */
.modalias = "lis3l02dq",
.max_speed_hz = 8000000,/* 8MHz max spi frequency at 3V */
.bus_num = 1,
.chip_select = 0,
.controller_data = &staccel_chip_info,
.irq = IRQ_GPIO(96),
}, { /* Driver out of kernel as it needs considerable rewriting */
.modalias = "cc2420",
.max_speed_hz = 6500000,
.bus_num = 3,
.chip_select = 0,
.controller_data = &cc2420_info,
},
};
static void im2_udc_command(int cmd)
{
switch (cmd) {
case PXA2XX_UDC_CMD_CONNECT:
UP2OCR |= UP2OCR_HXOE | UP2OCR_DPPUE | UP2OCR_DPPUBE;
break;
case PXA2XX_UDC_CMD_DISCONNECT:
UP2OCR &= ~(UP2OCR_HXOE | UP2OCR_DPPUE | UP2OCR_DPPUBE);
break;
}
}
static struct pxa2xx_udc_mach_info imote2_udc_info __initdata = {
.udc_command = im2_udc_command,
};
static struct platform_device *imote2_devices[] = {
&imote2_flash_device,
&imote2_leds,
&sht15,
};
static struct i2c_pxa_platform_data i2c_pwr_pdata = {
.fast_mode = 1,
};
static struct i2c_pxa_platform_data i2c_pdata = {
.fast_mode = 1,
};
static void __init imote2_init(void)
{
pxa2xx_mfp_config(ARRAY_AND_SIZE(imote2_pin_config));
pxa_set_ffuart_info(NULL);
pxa_set_btuart_info(NULL);
pxa_set_stuart_info(NULL);
platform_add_devices(imote2_devices, ARRAY_SIZE(imote2_devices));
pxa2xx_set_spi_info(1, &pxa_ssp_master_0_info);
pxa2xx_set_spi_info(2, &pxa_ssp_master_1_info);
pxa2xx_set_spi_info(3, &pxa_ssp_master_2_info);
spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
i2c_register_board_info(0, imote2_i2c_board_info,
ARRAY_SIZE(imote2_i2c_board_info));
i2c_register_board_info(1, imote2_pwr_i2c_board_info,
ARRAY_SIZE(imote2_pwr_i2c_board_info));
pxa27x_set_i2c_power_info(&i2c_pwr_pdata);
pxa_set_i2c_info(&i2c_pdata);
pxa_set_mci_info(&imote2_mci_platform_data);
pxa_set_udc_info(&imote2_udc_info);
}
MACHINE_START(INTELMOTE2, "IMOTE 2")
.phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.map_io = pxa_map_io,
.init_irq = pxa27x_init_irq,
.timer = &pxa_timer,
.init_machine = imote2_init,
.boot_params = 0xA0000100,
MACHINE_END

View File

@ -26,21 +26,55 @@ enum balloon3_features {
#define BALLOON3_FPGA_VIRT (0xf1000000) /* as per balloon2 */ #define BALLOON3_FPGA_VIRT (0xf1000000) /* as per balloon2 */
#define BALLOON3_FPGA_LENGTH 0x01000000 #define BALLOON3_FPGA_LENGTH 0x01000000
/* FPGA/CPLD registers */ /* FPGA / CPLD registers for CF socket */
#define BALLOON3_PCMCIA0_REG (BALLOON3_FPGA_VIRT + 0x00e00008) #define BALLOON3_CF_STATUS_REG (BALLOON3_FPGA_VIRT + 0x00e00008)
/* fixme - same for now */ #define BALLOON3_CF_CONTROL_REG (BALLOON3_FPGA_VIRT + 0x00e00008)
#define BALLOON3_PCMCIA1_REG (BALLOON3_FPGA_VIRT + 0x00e00008) /* FPGA / CPLD version register */
#define BALLOON3_NANDIO_IO_REG (BALLOON3_FPGA_VIRT + 0x00e00000) #define BALLOON3_FPGA_VER (BALLOON3_FPGA_VIRT + 0x00e0001c)
/* FPGA / CPLD registers for NAND flash */
#define BALLOON3_NAND_BASE (PXA_CS4_PHYS + 0x00e00000)
#define BALLOON3_NAND_IO_REG (BALLOON3_FPGA_VIRT + 0x00e00000)
#define BALLOON3_NAND_CONTROL2_REG (BALLOON3_FPGA_VIRT + 0x00e00010)
#define BALLOON3_NAND_STAT_REG (BALLOON3_FPGA_VIRT + 0x00e00010)
#define BALLOON3_NAND_CONTROL_REG (BALLOON3_FPGA_VIRT + 0x00e00014)
/* fpga/cpld interrupt control register */ /* fpga/cpld interrupt control register */
#define BALLOON3_INT_CONTROL_REG (BALLOON3_FPGA_VIRT + 0x00e0000C) #define BALLOON3_INT_CONTROL_REG (BALLOON3_FPGA_VIRT + 0x00e0000C)
#define BALLOON3_NANDIO_CTL2_REG (BALLOON3_FPGA_VIRT + 0x00e00010)
#define BALLOON3_NANDIO_CTL_REG (BALLOON3_FPGA_VIRT + 0x00e00014)
#define BALLOON3_VERSION_REG (BALLOON3_FPGA_VIRT + 0x00e0001c) #define BALLOON3_VERSION_REG (BALLOON3_FPGA_VIRT + 0x00e0001c)
#define BALLOON3_SAMOSA_ADDR_REG (BALLOON3_FPGA_VIRT + 0x00c00000) #define BALLOON3_SAMOSA_ADDR_REG (BALLOON3_FPGA_VIRT + 0x00c00000)
#define BALLOON3_SAMOSA_DATA_REG (BALLOON3_FPGA_VIRT + 0x00c00004) #define BALLOON3_SAMOSA_DATA_REG (BALLOON3_FPGA_VIRT + 0x00c00004)
#define BALLOON3_SAMOSA_STATUS_REG (BALLOON3_FPGA_VIRT + 0x00c0001c) #define BALLOON3_SAMOSA_STATUS_REG (BALLOON3_FPGA_VIRT + 0x00c0001c)
/* CF Status Register bits (read-only) bits */
#define BALLOON3_CF_nIRQ (1 << 0)
#define BALLOON3_CF_nSTSCHG_BVD1 (1 << 1)
/* CF Control Set Register bits / CF Control Clear Register bits (write-only) */
#define BALLOON3_CF_RESET (1 << 0)
#define BALLOON3_CF_ENABLE (1 << 1)
#define BALLOON3_CF_ADD_ENABLE (1 << 2)
/* CF Interrupt sources */
#define BALLOON3_BP_CF_NRDY_IRQ BALLOON3_IRQ(0)
#define BALLOON3_BP_NSTSCHG_IRQ BALLOON3_IRQ(1)
/* NAND Control register */
#define BALLOON3_NAND_CONTROL_FLWP (1 << 7)
#define BALLOON3_NAND_CONTROL_FLSE (1 << 6)
#define BALLOON3_NAND_CONTROL_FLCE3 (1 << 5)
#define BALLOON3_NAND_CONTROL_FLCE2 (1 << 4)
#define BALLOON3_NAND_CONTROL_FLCE1 (1 << 3)
#define BALLOON3_NAND_CONTROL_FLCE0 (1 << 2)
#define BALLOON3_NAND_CONTROL_FLALE (1 << 1)
#define BALLOON3_NAND_CONTROL_FLCLE (1 << 0)
/* NAND Status register */
#define BALLOON3_NAND_STAT_RNB (1 << 0)
/* NAND Control2 register */
#define BALLOON3_NAND_CONTROL2_16BIT (1 << 0)
/* GPIOs for irqs */ /* GPIOs for irqs */
#define BALLOON3_GPIO_AUX_NIRQ (94) #define BALLOON3_GPIO_AUX_NIRQ (94)
#define BALLOON3_GPIO_CODEC_IRQ (95) #define BALLOON3_GPIO_CODEC_IRQ (95)
@ -54,20 +88,24 @@ enum balloon3_features {
#define BALLOON3_GPIO_S0_CD (105) #define BALLOON3_GPIO_S0_CD (105)
/* NAND */
#define BALLOON3_GPIO_RUN_NAND (102)
/* PCF8574A Leds */
#define BALLOON3_PCF_GPIO_BASE 160
#define BALLOON3_PCF_GPIO_LED0 (BALLOON3_PCF_GPIO_BASE + 0)
#define BALLOON3_PCF_GPIO_LED1 (BALLOON3_PCF_GPIO_BASE + 1)
#define BALLOON3_PCF_GPIO_LED2 (BALLOON3_PCF_GPIO_BASE + 2)
#define BALLOON3_PCF_GPIO_LED3 (BALLOON3_PCF_GPIO_BASE + 3)
#define BALLOON3_PCF_GPIO_LED4 (BALLOON3_PCF_GPIO_BASE + 4)
#define BALLOON3_PCF_GPIO_LED5 (BALLOON3_PCF_GPIO_BASE + 5)
#define BALLOON3_PCF_GPIO_LED6 (BALLOON3_PCF_GPIO_BASE + 6)
#define BALLOON3_PCF_GPIO_LED7 (BALLOON3_PCF_GPIO_BASE + 7)
/* FPGA Interrupt Mask/Acknowledge Register */ /* FPGA Interrupt Mask/Acknowledge Register */
#define BALLOON3_INT_S0_IRQ (1 << 0) /* PCMCIA 0 IRQ */ #define BALLOON3_INT_S0_IRQ (1 << 0) /* PCMCIA 0 IRQ */
#define BALLOON3_INT_S0_STSCHG (1 << 1) /* PCMCIA 0 status changed */ #define BALLOON3_INT_S0_STSCHG (1 << 1) /* PCMCIA 0 status changed */
/* CF Status Register */
#define BALLOON3_PCMCIA_nIRQ (1 << 0) /* IRQ / ready signal */
#define BALLOON3_PCMCIA_nSTSCHG_BVD1 (1 << 1)
/* VDD sense / card status changed */
/* CF control register (write) */
#define BALLOON3_PCMCIA_RESET (1 << 0) /* Card reset signal */
#define BALLOON3_PCMCIA_ENABLE (1 << 1)
#define BALLOON3_PCMCIA_ADD_ENABLE (1 << 2)
/* CPLD (and FPGA) interface definitions */ /* CPLD (and FPGA) interface definitions */
#define CPLD_LCD0_DATA_SET 0x00 #define CPLD_LCD0_DATA_SET 0x00
#define CPLD_LCD0_DATA_CLR 0x10 #define CPLD_LCD0_DATA_CLR 0x10
@ -132,9 +170,6 @@ enum balloon3_features {
/* Balloon3 Interrupts */ /* Balloon3 Interrupts */
#define BALLOON3_IRQ(x) (IRQ_BOARD_START + (x)) #define BALLOON3_IRQ(x) (IRQ_BOARD_START + (x))
#define BALLOON3_BP_CF_NRDY_IRQ BALLOON3_IRQ(0)
#define BALLOON3_BP_NSTSCHG_IRQ BALLOON3_IRQ(1)
#define BALLOON3_AUX_NIRQ IRQ_GPIO(BALLOON3_GPIO_AUX_NIRQ) #define BALLOON3_AUX_NIRQ IRQ_GPIO(BALLOON3_GPIO_AUX_NIRQ)
#define BALLOON3_CODEC_IRQ IRQ_GPIO(BALLOON3_GPIO_CODEC_IRQ) #define BALLOON3_CODEC_IRQ IRQ_GPIO(BALLOON3_GPIO_CODEC_IRQ)
#define BALLOON3_S0_CD_IRQ IRQ_GPIO(BALLOON3_GPIO_S0_CD) #define BALLOON3_S0_CD_IRQ IRQ_GPIO(BALLOON3_GPIO_S0_CD)

View File

@ -4,6 +4,27 @@
#include <net/ax88796.h> #include <net/ax88796.h>
#include <mach/mfp.h> #include <mach/mfp.h>
/*
* base board glue for PXA270 module
*/
enum {
COLIBRI_PXA270_EVALBOARD = 0,
COLIBRI_PXA270_INCOME,
};
#if defined(CONFIG_MACH_COLIBRI_PXA270_EVALBOARD)
extern void colibri_pxa270_evalboard_init(void);
#else
static inline void colibri_pxa270_evalboard_init(void) {}
#endif
#if defined(CONFIG_MACH_COLIBRI_PXA270_INCOME)
extern void colibri_pxa270_income_boardinit(void);
#else
static inline void colibri_pxa270_income_boardinit(void) {}
#endif
/* /*
* common settings for all modules * common settings for all modules
*/ */
@ -33,13 +54,10 @@ static inline void colibri_pxa3xx_init_nand(void) {}
/* physical memory regions */ /* physical memory regions */
#define COLIBRI_SDRAM_BASE 0xa0000000 /* SDRAM region */ #define COLIBRI_SDRAM_BASE 0xa0000000 /* SDRAM region */
/* definitions for Colibri PXA270 */ /* GPIO definitions for Colibri PXA270 */
#define GPIO114_COLIBRI_PXA270_ETH_IRQ 114
#define COLIBRI_PXA270_FLASH_PHYS (PXA_CS0_PHYS) /* Flash region */ #define GPIO0_COLIBRI_PXA270_SD_DETECT 0
#define COLIBRI_PXA270_ETH_PHYS (PXA_CS2_PHYS) /* Ethernet */ #define GPIO113_COLIBRI_PXA270_TS_IRQ 113
#define COLIBRI_PXA270_ETH_IRQ_GPIO 114
#define COLIBRI_PXA270_ETH_IRQ \
gpio_to_irq(mfp_to_gpio(COLIBRI_PXA270_ETH_IRQ_GPIO))
#endif /* _COLIBRI_H_ */ #endif /* _COLIBRI_H_ */

View File

@ -109,10 +109,5 @@
#define CORGI_GPIO_BACKLIGHT_CONT (CORGI_SCOOP_GPIO_BASE + 7) #define CORGI_GPIO_BACKLIGHT_CONT (CORGI_SCOOP_GPIO_BASE + 7)
#define CORGI_GPIO_MIC_BIAS (CORGI_SCOOP_GPIO_BASE + 8) #define CORGI_GPIO_MIC_BIAS (CORGI_SCOOP_GPIO_BASE + 8)
/*
* Shared data structures
*/
extern struct platform_device corgiscoop_device;
#endif /* __ASM_ARCH_CORGI_H */ #endif /* __ASM_ARCH_CORGI_H */

View File

@ -14,25 +14,15 @@
/* /*
GPIOn - Input from MAX823 (or equiv), normalizing USB +5V into a clean GPIOn - Input from MAX823 (or equiv), normalizing USB +5V into a clean
interrupt signal for determining cable presence. On the original gumstix, interrupt signal for determining cable presence. On the gumstix F,
this is GPIO81, and GPIO83 needs to be defined as well. On the gumstix F,
this moves to GPIO17 and GPIO37. */ this moves to GPIO17 and GPIO37. */
/* GPIOx - Connects to USB D+ and used as a pull-up after GPIOn /* GPIOx - Connects to USB D+ and used as a pull-up after GPIOn
has detected a cable insertion; driven low otherwise. */ has detected a cable insertion; driven low otherwise. */
#ifdef CONFIG_ARCH_GUMSTIX_ORIG
#define GPIO_GUMSTIX_USB_GPIOn 81
#define GPIO_GUMSTIX_USB_GPIOx 83
#else
#define GPIO_GUMSTIX_USB_GPIOn 35 #define GPIO_GUMSTIX_USB_GPIOn 35
#define GPIO_GUMSTIX_USB_GPIOx 41 #define GPIO_GUMSTIX_USB_GPIOx 41
#endif
/* usb state change */ /* usb state change */
#define GUMSTIX_USB_INTR_IRQ IRQ_GPIO(GPIO_GUMSTIX_USB_GPIOn) #define GUMSTIX_USB_INTR_IRQ IRQ_GPIO(GPIO_GUMSTIX_USB_GPIOn)

View File

@ -0,0 +1,81 @@
/*
* Common functions for Palm LD, T5, TX, Z72
*
* Copyright (C) 2010
* Marek Vasut <marek.vasut@gmail.com>
*
* 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
* published by the Free Software Foundation.
*
*/
#ifndef __INCLUDE_MACH_PALM27X__
#define __INCLUDE_MACH_PALM27X__
#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
extern void __init palm27x_mmc_init(int detect, int ro, int power,
int power_inverted);
#else
static inline void palm27x_mmc_init(int detect, int ro, int power,
int power_inverted)
{}
#endif
#if defined(CONFIG_SUSPEND)
extern void __init palm27x_pm_init(unsigned long str_base);
#else
static inline void palm27x_pm_init(unsigned long str_base) {}
#endif
#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
extern struct pxafb_mode_info palm_320x480_lcd_mode;
extern struct pxafb_mode_info palm_320x320_lcd_mode;
extern struct pxafb_mode_info palm_320x320_new_lcd_mode;
extern void __init palm27x_lcd_init(int power,
struct pxafb_mode_info *mode);
#else
static inline void palm27x_lcd_init(int power, struct pxafb_mode_info *mode) {}
#endif
#if defined(CONFIG_USB_GADGET_PXA27X) || \
defined(CONFIG_USB_GADGET_PXA27X_MODULE)
extern void __init palm27x_udc_init(int vbus, int pullup,
int vbus_inverted);
#else
static inline void palm27x_udc_init(int vbus, int pullup, int vbus_inverted) {}
#endif
#if defined(CONFIG_IRDA) || defined(CONFIG_IRDA_MODULE)
extern void __init palm27x_irda_init(int pwdn);
#else
static inline void palm27x_irda_init(int pwdn) {}
#endif
#if defined(CONFIG_TOUCHSCREEN_WM97XX) || \
defined(CONFIG_TOUCHSCREEN_WM97XX_MODULE)
extern void __init palm27x_ac97_init(int minv, int maxv, int jack,
int reset);
#else
static inline void palm27x_ac97_init(int minv, int maxv, int jack, int reset) {}
#endif
#if defined(CONFIG_BACKLIGHT_PWM) || defined(CONFIG_BACKLIGHT_PWM_MODULE)
extern void __init palm27x_pwm_init(int bl, int lcd);
#else
static inline void palm27x_pwm_init(int bl, int lcd) {}
#endif
#if defined(CONFIG_PDA_POWER) || defined(CONFIG_PDA_POWER_MODULE)
extern void __init palm27x_power_init(int ac, int usb);
#else
static inline void palm27x_power_init(int ac, int usb) {}
#endif
#if defined(CONFIG_REGULATOR_MAX1586) || \
defined(CONFIG_REGULATOR_MAX1586_MODULE)
extern void __init palm27x_pmic_init(void);
#else
static inline void palm27x_pmic_init(void) {}
#endif
#endif /* __INCLUDE_MACH_PALM27X__ */

View File

@ -0,0 +1,33 @@
/*
* Generic PXA PATA driver
*
* Copyright (C) 2010 Marek Vasut <marek.vasut@gmail.com>
*
* 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, 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; see the file COPYING. If not, write to
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef __MACH_PATA_PXA_H__
#define __MACH_PATA_PXA_H__
struct pata_pxa_pdata {
/* PXA DMA DREQ<0:2> pin */
uint32_t dma_dreq;
/* Register shift */
uint32_t reg_shift;
/* IRQ flags */
uint32_t irq_flags;
};
#endif /* __MACH_PATA_PXA_H__ */

View File

@ -1,35 +0,0 @@
/*
* SharpSL SSP Driver
*/
unsigned long corgi_ssp_ads7846_putget(unsigned long);
unsigned long corgi_ssp_ads7846_get(void);
void corgi_ssp_ads7846_put(unsigned long data);
void corgi_ssp_ads7846_lock(void);
void corgi_ssp_ads7846_unlock(void);
void corgi_ssp_lcdtg_send (unsigned char adrs, unsigned char data);
void corgi_ssp_blduty_set(int duty);
int corgi_ssp_max1111_get(unsigned long data);
/*
* SharpSL Touchscreen Driver
*/
struct corgits_machinfo {
unsigned long (*get_hsync_invperiod)(void);
void (*put_hsync)(void);
void (*wait_hsync)(void);
};
/*
* SharpSL Backlight
*/
extern void corgibl_limit_intensity(int limit);
extern void corgi_lcd_limit_intensity(int limit);
/*
* SharpSL Battery/PM Driver
*/
extern void sharpsl_battery_kick(void);

View File

@ -93,6 +93,8 @@ struct sharpsl_pm_status {
extern struct sharpsl_pm_status sharpsl_pm; extern struct sharpsl_pm_status sharpsl_pm;
extern struct battery_thresh sharpsl_battery_levels_acin[];
extern struct battery_thresh sharpsl_battery_levels_noac[];
#define SHARPSL_LED_ERROR 2 #define SHARPSL_LED_ERROR 2
#define SHARPSL_LED_ON 1 #define SHARPSL_LED_ON 1
@ -101,4 +103,11 @@ extern struct sharpsl_pm_status sharpsl_pm;
void sharpsl_battery_kick(void); void sharpsl_battery_kick(void);
void sharpsl_pm_led(int val); void sharpsl_pm_led(int val);
/* MAX1111 Channel Definitions */
#define MAX1111_BATT_VOLT 4u
#define MAX1111_BATT_TEMP 2u
#define MAX1111_ACIN_VOLT 6u
int sharpsl_pm_pxa_read_max1111(int channel);
void corgi_lcd_limit_intensity(int limit);
#endif #endif

View File

@ -185,7 +185,5 @@
/* /*
* Shared data structures * Shared data structures
*/ */
extern struct platform_device spitzscoop_device;
extern struct platform_device spitzscoop2_device;
extern struct platform_device spitzssp_device; extern struct platform_device spitzssp_device;
extern struct sharpsl_charger_machinfo spitz_pm_machinfo; extern struct sharpsl_charger_machinfo spitz_pm_machinfo;

View File

@ -34,7 +34,7 @@
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/pda_power.h> #include <linux/pda_power.h>
#include <linux/power_supply.h> #include <linux/power_supply.h>
#include <linux/wm97xx_batt.h> #include <linux/wm97xx.h>
#include <linux/mtd/physmap.h> #include <linux/mtd/physmap.h>
#include <linux/usb/gpio_vbus.h> #include <linux/usb/gpio_vbus.h>
#include <linux/regulator/max1586.h> #include <linux/regulator/max1586.h>
@ -636,7 +636,7 @@ static struct platform_device power_dev = {
}, },
}; };
static struct wm97xx_batt_info mioa701_battery_data = { static struct wm97xx_batt_pdata mioa701_battery_data = {
.batt_aux = WM97XX_AUX_ID1, .batt_aux = WM97XX_AUX_ID1,
.temp_aux = -1, .temp_aux = -1,
.charge_gpio = -1, .charge_gpio = -1,
@ -648,6 +648,10 @@ static struct wm97xx_batt_info mioa701_battery_data = {
.batt_name = "mioa701_battery", .batt_name = "mioa701_battery",
}; };
static struct wm97xx_pdata mioa701_wm97xx_pdata = {
.batt_pdata = &mioa701_battery_data,
};
/* /*
* Voltage regulation * Voltage regulation
*/ */
@ -716,6 +720,7 @@ struct i2c_pxa_platform_data i2c_pdata = {
static pxa2xx_audio_ops_t mioa701_ac97_info = { static pxa2xx_audio_ops_t mioa701_ac97_info = {
.reset_gpio = 95, .reset_gpio = 95,
.codec_pdata = { &mioa701_wm97xx_pdata, },
}; };
/* /*
@ -794,7 +799,6 @@ static void __init mioa701_machine_init(void)
set_pxa_fb_info(&mioa701_pxafb_info); set_pxa_fb_info(&mioa701_pxafb_info);
pxa_set_mci_info(&mioa701_mci_info); pxa_set_mci_info(&mioa701_mci_info);
pxa_set_keypad_info(&mioa701_keypad_info); pxa_set_keypad_info(&mioa701_keypad_info);
wm97xx_bat_set_pdata(&mioa701_battery_data);
pxa_set_udc_info(&mioa701_udc_info); pxa_set_udc_info(&mioa701_udc_info);
pxa_set_ac97_info(&mioa701_ac97_info); pxa_set_ac97_info(&mioa701_ac97_info);
pm_power_off = mioa701_poweroff; pm_power_off = mioa701_poweroff;

477
arch/arm/mach-pxa/palm27x.c Normal file
View File

@ -0,0 +1,477 @@
/*
* Common code for Palm LD, T5, TX, Z72
*
* Copyright (C) 2010
* Marek Vasut <marek.vasut@gmail.com>
*
* 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
* published by the Free Software Foundation.
*
*/
#include <linux/platform_device.h>
#include <linux/delay.h>
#include <linux/irq.h>
#include <linux/gpio_keys.h>
#include <linux/input.h>
#include <linux/pda_power.h>
#include <linux/pwm_backlight.h>
#include <linux/gpio.h>
#include <linux/wm97xx.h>
#include <linux/power_supply.h>
#include <linux/usb/gpio_vbus.h>
#include <linux/regulator/max1586.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
#include <asm/mach/map.h>
#include <mach/pxa27x.h>
#include <mach/audio.h>
#include <mach/mmc.h>
#include <mach/pxafb.h>
#include <mach/irda.h>
#include <mach/udc.h>
#include <mach/palmasoc.h>
#include <mach/palm27x.h>
#include <plat/i2c.h>
#include "generic.h"
#include "devices.h"
/******************************************************************************
* SD/MMC card controller
******************************************************************************/
#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
static struct pxamci_platform_data palm27x_mci_platform_data = {
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
.detect_delay_ms = 200,
};
void __init palm27x_mmc_init(int detect, int ro, int power,
int power_inverted)
{
palm27x_mci_platform_data.gpio_card_detect = detect;
palm27x_mci_platform_data.gpio_card_ro = ro;
palm27x_mci_platform_data.gpio_power = power;
palm27x_mci_platform_data.gpio_power_invert = power_inverted;
pxa_set_mci_info(&palm27x_mci_platform_data);
}
#endif
/******************************************************************************
* Power management - standby
******************************************************************************/
#if defined(CONFIG_SUSPEND)
void __init palm27x_pm_init(unsigned long str_base)
{
static const unsigned long resume[] = {
0xe3a00101, /* mov r0, #0x40000000 */
0xe380060f, /* orr r0, r0, #0x00f00000 */
0xe590f008, /* ldr pc, [r0, #0x08] */
};
/*
* Copy the bootloader.
* NOTE: PalmZ72 uses a different wakeup method!
*/
memcpy(phys_to_virt(str_base), resume, sizeof(resume));
}
#endif
/******************************************************************************
* Framebuffer
******************************************************************************/
#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
struct pxafb_mode_info palm_320x480_lcd_mode = {
.pixclock = 57692,
.xres = 320,
.yres = 480,
.bpp = 16,
.left_margin = 32,
.right_margin = 1,
.upper_margin = 7,
.lower_margin = 1,
.hsync_len = 4,
.vsync_len = 1,
};
struct pxafb_mode_info palm_320x320_lcd_mode = {
.pixclock = 115384,
.xres = 320,
.yres = 320,
.bpp = 16,
.left_margin = 27,
.right_margin = 7,
.upper_margin = 7,
.lower_margin = 8,
.hsync_len = 6,
.vsync_len = 1,
};
struct pxafb_mode_info palm_320x320_new_lcd_mode = {
.pixclock = 86538,
.xres = 320,
.yres = 320,
.bpp = 16,
.left_margin = 20,
.right_margin = 8,
.upper_margin = 8,
.lower_margin = 5,
.hsync_len = 4,
.vsync_len = 1,
};
static struct pxafb_mach_info palm27x_lcd_screen = {
.num_modes = 1,
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
};
static int palm27x_lcd_power;
static void palm27x_lcd_ctl(int on, struct fb_var_screeninfo *info)
{
gpio_set_value(palm27x_lcd_power, on);
}
void __init palm27x_lcd_init(int power, struct pxafb_mode_info *mode)
{
palm27x_lcd_screen.modes = mode;
if (gpio_is_valid(power)) {
if (!gpio_request(power, "LCD power")) {
pr_err("Palm27x: failed to claim lcd power gpio!\n");
return;
}
if (!gpio_direction_output(power, 1)) {
pr_err("Palm27x: lcd power configuration failed!\n");
return;
}
palm27x_lcd_power = power;
palm27x_lcd_screen.pxafb_lcd_power = palm27x_lcd_ctl;
}
set_pxa_fb_info(&palm27x_lcd_screen);
}
#endif
/******************************************************************************
* USB Gadget
******************************************************************************/
#if defined(CONFIG_USB_GADGET_PXA27X) || \
defined(CONFIG_USB_GADGET_PXA27X_MODULE)
static struct gpio_vbus_mach_info palm27x_udc_info = {
.gpio_vbus_inverted = 1,
};
static struct platform_device palm27x_gpio_vbus = {
.name = "gpio-vbus",
.id = -1,
.dev = {
.platform_data = &palm27x_udc_info,
},
};
void __init palm27x_udc_init(int vbus, int pullup, int vbus_inverted)
{
palm27x_udc_info.gpio_vbus = vbus;
palm27x_udc_info.gpio_pullup = pullup;
palm27x_udc_info.gpio_vbus_inverted = vbus_inverted;
if (!gpio_request(pullup, "USB Pullup")) {
gpio_direction_output(pullup,
palm27x_udc_info.gpio_vbus_inverted);
gpio_free(pullup);
} else
return;
platform_device_register(&palm27x_gpio_vbus);
}
#endif
/******************************************************************************
* IrDA
******************************************************************************/
#if defined(CONFIG_IRDA) || defined(CONFIG_IRDA_MODULE)
static struct pxaficp_platform_data palm27x_ficp_platform_data = {
.transceiver_cap = IR_SIRMODE | IR_OFF,
};
void __init palm27x_irda_init(int pwdn)
{
palm27x_ficp_platform_data.gpio_pwdown = pwdn;
pxa_set_ficp_info(&palm27x_ficp_platform_data);
}
#endif
/******************************************************************************
* WM97xx audio, battery
******************************************************************************/
#if defined(CONFIG_TOUCHSCREEN_WM97XX) || \
defined(CONFIG_TOUCHSCREEN_WM97XX_MODULE)
static struct wm97xx_batt_pdata palm27x_batt_pdata = {
.batt_aux = WM97XX_AUX_ID3,
.temp_aux = WM97XX_AUX_ID2,
.charge_gpio = -1,
.batt_mult = 1000,
.batt_div = 414,
.temp_mult = 1,
.temp_div = 1,
.batt_tech = POWER_SUPPLY_TECHNOLOGY_LIPO,
.batt_name = "main-batt",
};
static struct wm97xx_pdata palm27x_wm97xx_pdata = {
.batt_pdata = &palm27x_batt_pdata,
};
static pxa2xx_audio_ops_t palm27x_ac97_pdata = {
.codec_pdata = { &palm27x_wm97xx_pdata, },
};
static struct palm27x_asoc_info palm27x_asoc_pdata = {
.jack_gpio = -1,
};
static struct platform_device palm27x_asoc = {
.name = "palm27x-asoc",
.id = -1,
.dev = {
.platform_data = &palm27x_asoc_pdata,
},
};
void __init palm27x_ac97_init(int minv, int maxv, int jack, int reset)
{
palm27x_ac97_pdata.reset_gpio = reset;
palm27x_asoc_pdata.jack_gpio = jack;
if (minv < 0 || maxv < 0) {
palm27x_ac97_pdata.codec_pdata[0] = NULL;
pxa_set_ac97_info(&palm27x_ac97_pdata);
} else {
palm27x_batt_pdata.min_voltage = minv,
palm27x_batt_pdata.max_voltage = maxv,
pxa_set_ac97_info(&palm27x_ac97_pdata);
platform_device_register(&palm27x_asoc);
}
}
#endif
/******************************************************************************
* Backlight
******************************************************************************/
#if defined(CONFIG_BACKLIGHT_PWM) || defined(CONFIG_BACKLIGHT_PWM_MODULE)
static int palm_bl_power;
static int palm_lcd_power;
static int palm27x_backlight_init(struct device *dev)
{
int ret;
ret = gpio_request(palm_bl_power, "BL POWER");
if (ret)
goto err;
ret = gpio_direction_output(palm_bl_power, 0);
if (ret)
goto err2;
if (gpio_is_valid(palm_lcd_power)) {
ret = gpio_request(palm_lcd_power, "LCD POWER");
if (ret)
goto err2;
ret = gpio_direction_output(palm_lcd_power, 0);
if (ret)
goto err3;
}
return 0;
err3:
gpio_free(palm_lcd_power);
err2:
gpio_free(palm_bl_power);
err:
return ret;
}
static int palm27x_backlight_notify(struct device *dev, int brightness)
{
gpio_set_value(palm_bl_power, brightness);
if (gpio_is_valid(palm_lcd_power))
gpio_set_value(palm_lcd_power, brightness);
return brightness;
}
static void palm27x_backlight_exit(struct device *dev)
{
gpio_free(palm_bl_power);
if (gpio_is_valid(palm_lcd_power))
gpio_free(palm_lcd_power);
}
static struct platform_pwm_backlight_data palm27x_backlight_data = {
.pwm_id = 0,
.max_brightness = 0xfe,
.dft_brightness = 0x7e,
.pwm_period_ns = 3500,
.init = palm27x_backlight_init,
.notify = palm27x_backlight_notify,
.exit = palm27x_backlight_exit,
};
static struct platform_device palm27x_backlight = {
.name = "pwm-backlight",
.dev = {
.parent = &pxa27x_device_pwm0.dev,
.platform_data = &palm27x_backlight_data,
},
};
void __init palm27x_pwm_init(int bl, int lcd)
{
palm_bl_power = bl;
palm_lcd_power = lcd;
platform_device_register(&palm27x_backlight);
}
#endif
/******************************************************************************
* Power supply
******************************************************************************/
#if defined(CONFIG_PDA_POWER) || defined(CONFIG_PDA_POWER_MODULE)
static int palm_ac_state;
static int palm_usb_state;
static int palm27x_power_supply_init(struct device *dev)
{
int ret;
ret = gpio_request(palm_ac_state, "AC state");
if (ret)
goto err1;
ret = gpio_direction_input(palm_ac_state);
if (ret)
goto err2;
if (gpio_is_valid(palm_usb_state)) {
ret = gpio_request(palm_usb_state, "USB state");
if (ret)
goto err2;
ret = gpio_direction_input(palm_usb_state);
if (ret)
goto err3;
}
return 0;
err3:
gpio_free(palm_usb_state);
err2:
gpio_free(palm_ac_state);
err1:
return ret;
}
static void palm27x_power_supply_exit(struct device *dev)
{
gpio_free(palm_usb_state);
gpio_free(palm_ac_state);
}
static int palm27x_is_ac_online(void)
{
return gpio_get_value(palm_ac_state);
}
static int palm27x_is_usb_online(void)
{
return !gpio_get_value(palm_usb_state);
}
static char *palm27x_supplicants[] = {
"main-battery",
};
static struct pda_power_pdata palm27x_ps_info = {
.init = palm27x_power_supply_init,
.exit = palm27x_power_supply_exit,
.is_ac_online = palm27x_is_ac_online,
.is_usb_online = palm27x_is_usb_online,
.supplied_to = palm27x_supplicants,
.num_supplicants = ARRAY_SIZE(palm27x_supplicants),
};
static struct platform_device palm27x_power_supply = {
.name = "pda-power",
.id = -1,
.dev = {
.platform_data = &palm27x_ps_info,
},
};
void __init palm27x_power_init(int ac, int usb)
{
palm_ac_state = ac;
palm_usb_state = usb;
platform_device_register(&palm27x_power_supply);
}
#endif
/******************************************************************************
* Core power regulator
******************************************************************************/
#if defined(CONFIG_REGULATOR_MAX1586) || \
defined(CONFIG_REGULATOR_MAX1586_MODULE)
static struct regulator_consumer_supply palm27x_max1587a_consumers[] = {
{
.supply = "vcc_core",
}
};
static struct regulator_init_data palm27x_max1587a_v3_info = {
.constraints = {
.name = "vcc_core range",
.min_uV = 900000,
.max_uV = 1705000,
.always_on = 1,
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
},
.consumer_supplies = palm27x_max1587a_consumers,
.num_consumer_supplies = ARRAY_SIZE(palm27x_max1587a_consumers),
};
static struct max1586_subdev_data palm27x_max1587a_subdevs[] = {
{
.name = "vcc_core",
.id = MAX1586_V3,
.platform_data = &palm27x_max1587a_v3_info,
}
};
static struct max1586_platform_data palm27x_max1587a_info = {
.subdevs = palm27x_max1587a_subdevs,
.num_subdevs = ARRAY_SIZE(palm27x_max1587a_subdevs),
.v3_gain = MAX1586_GAIN_R24_3k32, /* 730..1550 mV */
};
static struct i2c_board_info __initdata palm27x_pi2c_board_info[] = {
{
I2C_BOARD_INFO("max1586", 0x14),
.platform_data = &palm27x_max1587a_info,
},
};
void __init palm27x_pmic_init(void)
{
i2c_register_board_info(1, ARRAY_AND_SIZE(palm27x_pi2c_board_info));
pxa27x_set_i2c_power_info(NULL);
}
#endif

View File

@ -22,7 +22,7 @@
#include <linux/pda_power.h> #include <linux/pda_power.h>
#include <linux/pwm_backlight.h> #include <linux/pwm_backlight.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/wm97xx_batt.h> #include <linux/wm97xx.h>
#include <linux/power_supply.h> #include <linux/power_supply.h>
#include <linux/sysdev.h> #include <linux/sysdev.h>
#include <linux/mtd/mtd.h> #include <linux/mtd/mtd.h>
@ -41,6 +41,7 @@
#include <mach/irda.h> #include <mach/irda.h>
#include <mach/pxa27x_keypad.h> #include <mach/pxa27x_keypad.h>
#include <mach/palmasoc.h> #include <mach/palmasoc.h>
#include <mach/palm27x.h>
#include "generic.h" #include "generic.h"
#include "devices.h" #include "devices.h"
@ -127,6 +128,7 @@ static unsigned long palmld_pin_config[] __initdata = {
/****************************************************************************** /******************************************************************************
* NOR Flash * NOR Flash
******************************************************************************/ ******************************************************************************/
#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
static struct mtd_partition palmld_partitions[] = { static struct mtd_partition palmld_partitions[] = {
{ {
.name = "Flash", .name = "Flash",
@ -160,20 +162,18 @@ static struct platform_device palmld_flash = {
}, },
}; };
/****************************************************************************** static void __init palmld_nor_init(void)
* SD/MMC card controller {
******************************************************************************/ platform_device_register(&palmld_flash);
static struct pxamci_platform_data palmld_mci_platform_data = { }
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, #else
.gpio_card_detect = GPIO_NR_PALMLD_SD_DETECT_N, static inline void palmld_nor_init(void) {}
.gpio_card_ro = GPIO_NR_PALMLD_SD_READONLY, #endif
.gpio_power = GPIO_NR_PALMLD_SD_POWER,
.detect_delay_ms = 200,
};
/****************************************************************************** /******************************************************************************
* GPIO keyboard * GPIO keyboard
******************************************************************************/ ******************************************************************************/
#if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE)
static unsigned int palmld_matrix_keys[] = { static unsigned int palmld_matrix_keys[] = {
KEY(0, 1, KEY_F2), KEY(0, 1, KEY_F2),
KEY(0, 2, KEY_UP), KEY(0, 2, KEY_UP),
@ -200,9 +200,18 @@ static struct pxa27x_keypad_platform_data palmld_keypad_platform_data = {
.debounce_interval = 30, .debounce_interval = 30,
}; };
static void __init palmld_kpc_init(void)
{
pxa_set_keypad_info(&palmld_keypad_platform_data);
}
#else
static inline void palmld_kpc_init(void) {}
#endif
/****************************************************************************** /******************************************************************************
* GPIO keys * GPIO keys
******************************************************************************/ ******************************************************************************/
#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
static struct gpio_keys_button palmld_pxa_buttons[] = { static struct gpio_keys_button palmld_pxa_buttons[] = {
{KEY_F8, GPIO_NR_PALMLD_HOTSYNC_BUTTON_N, 1, "HotSync Button" }, {KEY_F8, GPIO_NR_PALMLD_HOTSYNC_BUTTON_N, 1, "HotSync Button" },
{KEY_F9, GPIO_NR_PALMLD_LOCK_SWITCH, 0, "Lock Switch" }, {KEY_F9, GPIO_NR_PALMLD_LOCK_SWITCH, 0, "Lock Switch" },
@ -222,77 +231,18 @@ static struct platform_device palmld_pxa_keys = {
}, },
}; };
/****************************************************************************** static void __init palmld_keys_init(void)
* Backlight
******************************************************************************/
static int palmld_backlight_init(struct device *dev)
{ {
int ret; platform_device_register(&palmld_pxa_keys);
ret = gpio_request(GPIO_NR_PALMLD_BL_POWER, "BL POWER");
if (ret)
goto err;
ret = gpio_direction_output(GPIO_NR_PALMLD_BL_POWER, 0);
if (ret)
goto err2;
ret = gpio_request(GPIO_NR_PALMLD_LCD_POWER, "LCD POWER");
if (ret)
goto err2;
ret = gpio_direction_output(GPIO_NR_PALMLD_LCD_POWER, 0);
if (ret)
goto err3;
return 0;
err3:
gpio_free(GPIO_NR_PALMLD_LCD_POWER);
err2:
gpio_free(GPIO_NR_PALMLD_BL_POWER);
err:
return ret;
} }
#else
static int palmld_backlight_notify(struct device *dev, int brightness) static inline void palmld_keys_init(void) {}
{ #endif
gpio_set_value(GPIO_NR_PALMLD_BL_POWER, brightness);
gpio_set_value(GPIO_NR_PALMLD_LCD_POWER, brightness);
return brightness;
}
static void palmld_backlight_exit(struct device *dev)
{
gpio_free(GPIO_NR_PALMLD_BL_POWER);
gpio_free(GPIO_NR_PALMLD_LCD_POWER);
}
static struct platform_pwm_backlight_data palmld_backlight_data = {
.pwm_id = 0,
.max_brightness = PALMLD_MAX_INTENSITY,
.dft_brightness = PALMLD_MAX_INTENSITY,
.pwm_period_ns = PALMLD_PERIOD_NS,
.init = palmld_backlight_init,
.notify = palmld_backlight_notify,
.exit = palmld_backlight_exit,
};
static struct platform_device palmld_backlight = {
.name = "pwm-backlight",
.dev = {
.parent = &pxa27x_device_pwm0.dev,
.platform_data = &palmld_backlight_data,
},
};
/******************************************************************************
* IrDA
******************************************************************************/
static struct pxaficp_platform_data palmld_ficp_platform_data = {
.gpio_pwdown = GPIO_NR_PALMLD_IR_DISABLE,
.transceiver_cap = IR_SIRMODE | IR_OFF,
};
/****************************************************************************** /******************************************************************************
* LEDs * LEDs
******************************************************************************/ ******************************************************************************/
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
struct gpio_led gpio_leds[] = { struct gpio_led gpio_leds[] = {
{ {
.name = "palmld:green:led", .name = "palmld:green:led",
@ -318,174 +268,34 @@ static struct platform_device palmld_leds = {
} }
}; };
/****************************************************************************** static void __init palmld_leds_init(void)
* Power supply
******************************************************************************/
static int power_supply_init(struct device *dev)
{ {
int ret; platform_device_register(&palmld_leds);
ret = gpio_request(GPIO_NR_PALMLD_POWER_DETECT, "CABLE_STATE_AC");
if (ret)
goto err1;
ret = gpio_direction_input(GPIO_NR_PALMLD_POWER_DETECT);
if (ret)
goto err2;
ret = gpio_request(GPIO_NR_PALMLD_USB_DETECT_N, "CABLE_STATE_USB");
if (ret)
goto err2;
ret = gpio_direction_input(GPIO_NR_PALMLD_USB_DETECT_N);
if (ret)
goto err3;
return 0;
err3:
gpio_free(GPIO_NR_PALMLD_USB_DETECT_N);
err2:
gpio_free(GPIO_NR_PALMLD_POWER_DETECT);
err1:
return ret;
} }
#else
static int palmld_is_ac_online(void) static inline void palmld_leds_init(void) {}
{ #endif
return gpio_get_value(GPIO_NR_PALMLD_POWER_DETECT);
}
static int palmld_is_usb_online(void)
{
return !gpio_get_value(GPIO_NR_PALMLD_USB_DETECT_N);
}
static void power_supply_exit(struct device *dev)
{
gpio_free(GPIO_NR_PALMLD_USB_DETECT_N);
gpio_free(GPIO_NR_PALMLD_POWER_DETECT);
}
static char *palmld_supplicants[] = {
"main-battery",
};
static struct pda_power_pdata power_supply_info = {
.init = power_supply_init,
.is_ac_online = palmld_is_ac_online,
.is_usb_online = palmld_is_usb_online,
.exit = power_supply_exit,
.supplied_to = palmld_supplicants,
.num_supplicants = ARRAY_SIZE(palmld_supplicants),
};
static struct platform_device power_supply = {
.name = "pda-power",
.id = -1,
.dev = {
.platform_data = &power_supply_info,
},
};
/******************************************************************************
* WM97xx battery
******************************************************************************/
static struct wm97xx_batt_info wm97xx_batt_pdata = {
.batt_aux = WM97XX_AUX_ID3,
.temp_aux = WM97XX_AUX_ID2,
.charge_gpio = -1,
.max_voltage = PALMLD_BAT_MAX_VOLTAGE,
.min_voltage = PALMLD_BAT_MIN_VOLTAGE,
.batt_mult = 1000,
.batt_div = 414,
.temp_mult = 1,
.temp_div = 1,
.batt_tech = POWER_SUPPLY_TECHNOLOGY_LIPO,
.batt_name = "main-batt",
};
/******************************************************************************
* aSoC audio
******************************************************************************/
static struct palm27x_asoc_info palmld_asoc_pdata = {
.jack_gpio = GPIO_NR_PALMLD_EARPHONE_DETECT,
};
static pxa2xx_audio_ops_t palmld_ac97_pdata = {
.reset_gpio = 95,
};
static struct platform_device palmld_asoc = {
.name = "palm27x-asoc",
.id = -1,
.dev = {
.platform_data = &palmld_asoc_pdata,
},
};
/****************************************************************************** /******************************************************************************
* HDD * HDD
******************************************************************************/ ******************************************************************************/
static struct platform_device palmld_hdd = { #if defined(CONFIG_PATA_PALMLD) || defined(CONFIG_PATA_PALMLD_MODULE)
static struct platform_device palmld_ide_device = {
.name = "pata_palmld", .name = "pata_palmld",
.id = -1, .id = -1,
}; };
/****************************************************************************** static void __init palmld_ide_init(void)
* Framebuffer
******************************************************************************/
static struct pxafb_mode_info palmld_lcd_modes[] = {
{ {
.pixclock = 57692, platform_device_register(&palmld_ide_device);
.xres = 320,
.yres = 480,
.bpp = 16,
.left_margin = 32,
.right_margin = 1,
.upper_margin = 7,
.lower_margin = 1,
.hsync_len = 4,
.vsync_len = 1,
},
};
static struct pxafb_mach_info palmld_lcd_screen = {
.modes = palmld_lcd_modes,
.num_modes = ARRAY_SIZE(palmld_lcd_modes),
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
};
/******************************************************************************
* Power management - standby
******************************************************************************/
static void __init palmld_pm_init(void)
{
static u32 resume[] = {
0xe3a00101, /* mov r0, #0x40000000 */
0xe380060f, /* orr r0, r0, #0x00f00000 */
0xe590f008, /* ldr pc, [r0, #0x08] */
};
/* copy the bootloader */
memcpy(phys_to_virt(PALMLD_STR_BASE), resume, sizeof(resume));
} }
#else
static inline void palmld_ide_init(void) {}
#endif
/****************************************************************************** /******************************************************************************
* Machine init * Machine init
******************************************************************************/ ******************************************************************************/
static struct platform_device *devices[] __initdata = {
#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
&palmld_pxa_keys,
#endif
&palmld_backlight,
&palmld_leds,
&power_supply,
&palmld_asoc,
&palmld_hdd,
&palmld_flash,
};
static struct map_desc palmld_io_desc[] __initdata = { static struct map_desc palmld_io_desc[] __initdata = {
{ {
.virtual = PALMLD_IDE_VIRT, .virtual = PALMLD_IDE_VIRT,
@ -510,20 +320,26 @@ static void __init palmld_map_io(void)
static void __init palmld_init(void) static void __init palmld_init(void)
{ {
pxa2xx_mfp_config(ARRAY_AND_SIZE(palmld_pin_config)); pxa2xx_mfp_config(ARRAY_AND_SIZE(palmld_pin_config));
pxa_set_ffuart_info(NULL); pxa_set_ffuart_info(NULL);
pxa_set_btuart_info(NULL); pxa_set_btuart_info(NULL);
pxa_set_stuart_info(NULL); pxa_set_stuart_info(NULL);
palmld_pm_init(); palm27x_mmc_init(GPIO_NR_PALMLD_SD_DETECT_N, GPIO_NR_PALMLD_SD_READONLY,
set_pxa_fb_info(&palmld_lcd_screen); GPIO_NR_PALMLD_SD_POWER, 0);
pxa_set_mci_info(&palmld_mci_platform_data); palm27x_pm_init(PALMLD_STR_BASE);
pxa_set_ac97_info(&palmld_ac97_pdata); palm27x_lcd_init(-1, &palm_320x480_lcd_mode);
pxa_set_ficp_info(&palmld_ficp_platform_data); palm27x_irda_init(GPIO_NR_PALMLD_IR_DISABLE);
pxa_set_keypad_info(&palmld_keypad_platform_data); palm27x_ac97_init(PALMLD_BAT_MIN_VOLTAGE, PALMLD_BAT_MAX_VOLTAGE,
wm97xx_bat_set_pdata(&wm97xx_batt_pdata); GPIO_NR_PALMLD_EARPHONE_DETECT, 95);
palm27x_pwm_init(GPIO_NR_PALMLD_BL_POWER, GPIO_NR_PALMLD_LCD_POWER);
platform_add_devices(devices, ARRAY_SIZE(devices)); palm27x_power_init(GPIO_NR_PALMLD_POWER_DETECT,
GPIO_NR_PALMLD_USB_DETECT_N);
palm27x_pmic_init();
palmld_kpc_init();
palmld_keys_init();
palmld_nor_init();
palmld_leds_init();
palmld_ide_init();
} }
MACHINE_START(PALMLD, "Palm LifeDrive") MACHINE_START(PALMLD, "Palm LifeDrive")

View File

@ -25,7 +25,7 @@
#include <linux/pda_power.h> #include <linux/pda_power.h>
#include <linux/pwm_backlight.h> #include <linux/pwm_backlight.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/wm97xx_batt.h> #include <linux/wm97xx.h>
#include <linux/power_supply.h> #include <linux/power_supply.h>
#include <linux/usb/gpio_vbus.h> #include <linux/usb/gpio_vbus.h>
@ -42,6 +42,7 @@
#include <mach/pxa27x_keypad.h> #include <mach/pxa27x_keypad.h>
#include <mach/udc.h> #include <mach/udc.h>
#include <mach/palmasoc.h> #include <mach/palmasoc.h>
#include <mach/palm27x.h>
#include "generic.h" #include "generic.h"
#include "devices.h" #include "devices.h"
@ -103,20 +104,10 @@ static unsigned long palmt5_pin_config[] __initdata = {
GPIO107_GPIO, /* earphone detect */ GPIO107_GPIO, /* earphone detect */
}; };
/******************************************************************************
* SD/MMC card controller
******************************************************************************/
static struct pxamci_platform_data palmt5_mci_platform_data = {
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
.gpio_card_detect = GPIO_NR_PALMT5_SD_DETECT_N,
.gpio_card_ro = GPIO_NR_PALMT5_SD_READONLY,
.gpio_power = GPIO_NR_PALMT5_SD_POWER,
.detect_delay_ms = 200,
};
/****************************************************************************** /******************************************************************************
* GPIO keyboard * GPIO keyboard
******************************************************************************/ ******************************************************************************/
#if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE)
static unsigned int palmt5_matrix_keys[] = { static unsigned int palmt5_matrix_keys[] = {
KEY(0, 0, KEY_POWER), KEY(0, 0, KEY_POWER),
KEY(0, 1, KEY_F1), KEY(0, 1, KEY_F1),
@ -142,9 +133,18 @@ static struct pxa27x_keypad_platform_data palmt5_keypad_platform_data = {
.debounce_interval = 30, .debounce_interval = 30,
}; };
static void __init palmt5_kpc_init(void)
{
pxa_set_keypad_info(&palmt5_keypad_platform_data);
}
#else
static inline void palmt5_kpc_init(void) {}
#endif
/****************************************************************************** /******************************************************************************
* GPIO keys * GPIO keys
******************************************************************************/ ******************************************************************************/
#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
static struct gpio_keys_button palmt5_pxa_buttons[] = { static struct gpio_keys_button palmt5_pxa_buttons[] = {
{KEY_F8, GPIO_NR_PALMT5_HOTSYNC_BUTTON_N, 1, "HotSync Button" }, {KEY_F8, GPIO_NR_PALMT5_HOTSYNC_BUTTON_N, 1, "HotSync Button" },
}; };
@ -162,241 +162,17 @@ static struct platform_device palmt5_pxa_keys = {
}, },
}; };
/****************************************************************************** static void __init palmt5_keys_init(void)
* Backlight
******************************************************************************/
static int palmt5_backlight_init(struct device *dev)
{ {
int ret; platform_device_register(&palmt5_pxa_keys);
ret = gpio_request(GPIO_NR_PALMT5_BL_POWER, "BL POWER");
if (ret)
goto err;
ret = gpio_direction_output(GPIO_NR_PALMT5_BL_POWER, 0);
if (ret)
goto err2;
ret = gpio_request(GPIO_NR_PALMT5_LCD_POWER, "LCD POWER");
if (ret)
goto err2;
ret = gpio_direction_output(GPIO_NR_PALMT5_LCD_POWER, 0);
if (ret)
goto err3;
return 0;
err3:
gpio_free(GPIO_NR_PALMT5_LCD_POWER);
err2:
gpio_free(GPIO_NR_PALMT5_BL_POWER);
err:
return ret;
}
static int palmt5_backlight_notify(struct device *dev, int brightness)
{
gpio_set_value(GPIO_NR_PALMT5_BL_POWER, brightness);
gpio_set_value(GPIO_NR_PALMT5_LCD_POWER, brightness);
return brightness;
}
static void palmt5_backlight_exit(struct device *dev)
{
gpio_free(GPIO_NR_PALMT5_BL_POWER);
gpio_free(GPIO_NR_PALMT5_LCD_POWER);
}
static struct platform_pwm_backlight_data palmt5_backlight_data = {
.pwm_id = 0,
.max_brightness = PALMT5_MAX_INTENSITY,
.dft_brightness = PALMT5_MAX_INTENSITY,
.pwm_period_ns = PALMT5_PERIOD_NS,
.init = palmt5_backlight_init,
.notify = palmt5_backlight_notify,
.exit = palmt5_backlight_exit,
};
static struct platform_device palmt5_backlight = {
.name = "pwm-backlight",
.dev = {
.parent = &pxa27x_device_pwm0.dev,
.platform_data = &palmt5_backlight_data,
},
};
/******************************************************************************
* IrDA
******************************************************************************/
static struct pxaficp_platform_data palmt5_ficp_platform_data = {
.gpio_pwdown = GPIO_NR_PALMT5_IR_DISABLE,
.transceiver_cap = IR_SIRMODE | IR_OFF,
};
/******************************************************************************
* UDC
******************************************************************************/
static struct gpio_vbus_mach_info palmt5_udc_info = {
.gpio_vbus = GPIO_NR_PALMT5_USB_DETECT_N,
.gpio_vbus_inverted = 1,
.gpio_pullup = GPIO_NR_PALMT5_USB_PULLUP,
};
static struct platform_device palmt5_gpio_vbus = {
.name = "gpio-vbus",
.id = -1,
.dev = {
.platform_data = &palmt5_udc_info,
},
};
/******************************************************************************
* Power supply
******************************************************************************/
static int power_supply_init(struct device *dev)
{
int ret;
ret = gpio_request(GPIO_NR_PALMT5_POWER_DETECT, "CABLE_STATE_AC");
if (ret)
goto err1;
ret = gpio_direction_input(GPIO_NR_PALMT5_POWER_DETECT);
if (ret)
goto err2;
return 0;
err2:
gpio_free(GPIO_NR_PALMT5_POWER_DETECT);
err1:
return ret;
}
static int palmt5_is_ac_online(void)
{
return gpio_get_value(GPIO_NR_PALMT5_POWER_DETECT);
}
static void power_supply_exit(struct device *dev)
{
gpio_free(GPIO_NR_PALMT5_POWER_DETECT);
}
static char *palmt5_supplicants[] = {
"main-battery",
};
static struct pda_power_pdata power_supply_info = {
.init = power_supply_init,
.is_ac_online = palmt5_is_ac_online,
.exit = power_supply_exit,
.supplied_to = palmt5_supplicants,
.num_supplicants = ARRAY_SIZE(palmt5_supplicants),
};
static struct platform_device power_supply = {
.name = "pda-power",
.id = -1,
.dev = {
.platform_data = &power_supply_info,
},
};
/******************************************************************************
* WM97xx battery
******************************************************************************/
static struct wm97xx_batt_info wm97xx_batt_pdata = {
.batt_aux = WM97XX_AUX_ID3,
.temp_aux = WM97XX_AUX_ID2,
.charge_gpio = -1,
.max_voltage = PALMT5_BAT_MAX_VOLTAGE,
.min_voltage = PALMT5_BAT_MIN_VOLTAGE,
.batt_mult = 1000,
.batt_div = 414,
.temp_mult = 1,
.temp_div = 1,
.batt_tech = POWER_SUPPLY_TECHNOLOGY_LIPO,
.batt_name = "main-batt",
};
/******************************************************************************
* aSoC audio
******************************************************************************/
static struct palm27x_asoc_info palmt5_asoc_pdata = {
.jack_gpio = GPIO_NR_PALMT5_EARPHONE_DETECT,
};
static pxa2xx_audio_ops_t palmt5_ac97_pdata = {
.reset_gpio = 95,
};
static struct platform_device palmt5_asoc = {
.name = "palm27x-asoc",
.id = -1,
.dev = {
.platform_data = &palmt5_asoc_pdata,
},
};
/******************************************************************************
* Framebuffer
******************************************************************************/
static struct pxafb_mode_info palmt5_lcd_modes[] = {
{
.pixclock = 57692,
.xres = 320,
.yres = 480,
.bpp = 16,
.left_margin = 32,
.right_margin = 1,
.upper_margin = 7,
.lower_margin = 1,
.hsync_len = 4,
.vsync_len = 1,
},
};
static struct pxafb_mach_info palmt5_lcd_screen = {
.modes = palmt5_lcd_modes,
.num_modes = ARRAY_SIZE(palmt5_lcd_modes),
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
};
/******************************************************************************
* Power management - standby
******************************************************************************/
static void __init palmt5_pm_init(void)
{
static u32 resume[] = {
0xe3a00101, /* mov r0, #0x40000000 */
0xe380060f, /* orr r0, r0, #0x00f00000 */
0xe590f008, /* ldr pc, [r0, #0x08] */
};
/* copy the bootloader */
memcpy(phys_to_virt(PALMT5_STR_BASE), resume, sizeof(resume));
} }
#else
static inline void palmt5_keys_init(void) {}
#endif
/****************************************************************************** /******************************************************************************
* Machine init * Machine init
******************************************************************************/ ******************************************************************************/
static struct platform_device *devices[] __initdata = {
#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
&palmt5_pxa_keys,
#endif
&palmt5_backlight,
&power_supply,
&palmt5_asoc,
&palmt5_gpio_vbus,
};
/* setup udc GPIOs initial state */
static void __init palmt5_udc_init(void)
{
if (!gpio_request(GPIO_NR_PALMT5_USB_PULLUP, "UDC Vbus")) {
gpio_direction_output(GPIO_NR_PALMT5_USB_PULLUP, 1);
gpio_free(GPIO_NR_PALMT5_USB_PULLUP);
}
}
static void __init palmt5_reserve(void) static void __init palmt5_reserve(void)
{ {
memblock_reserve(0xa0200000, 0x1000); memblock_reserve(0xa0200000, 0x1000);
@ -405,21 +181,24 @@ static void __init palmt5_reserve(void)
static void __init palmt5_init(void) static void __init palmt5_init(void)
{ {
pxa2xx_mfp_config(ARRAY_AND_SIZE(palmt5_pin_config)); pxa2xx_mfp_config(ARRAY_AND_SIZE(palmt5_pin_config));
pxa_set_ffuart_info(NULL); pxa_set_ffuart_info(NULL);
pxa_set_btuart_info(NULL); pxa_set_btuart_info(NULL);
pxa_set_stuart_info(NULL); pxa_set_stuart_info(NULL);
palmt5_pm_init(); palm27x_mmc_init(GPIO_NR_PALMT5_SD_DETECT_N, GPIO_NR_PALMT5_SD_READONLY,
set_pxa_fb_info(&palmt5_lcd_screen); GPIO_NR_PALMT5_SD_POWER, 0);
pxa_set_mci_info(&palmt5_mci_platform_data); palm27x_pm_init(PALMT5_STR_BASE);
palmt5_udc_init(); palm27x_lcd_init(-1, &palm_320x480_lcd_mode);
pxa_set_ac97_info(&palmt5_ac97_pdata); palm27x_udc_init(GPIO_NR_PALMT5_USB_DETECT_N,
pxa_set_ficp_info(&palmt5_ficp_platform_data); GPIO_NR_PALMT5_USB_PULLUP, 1);
pxa_set_keypad_info(&palmt5_keypad_platform_data); palm27x_irda_init(GPIO_NR_PALMT5_IR_DISABLE);
wm97xx_bat_set_pdata(&wm97xx_batt_pdata); palm27x_ac97_init(PALMT5_BAT_MIN_VOLTAGE, PALMT5_BAT_MAX_VOLTAGE,
GPIO_NR_PALMT5_EARPHONE_DETECT, 95);
platform_add_devices(devices, ARRAY_SIZE(devices)); palm27x_pwm_init(GPIO_NR_PALMT5_BL_POWER, GPIO_NR_PALMT5_LCD_POWER);
palm27x_power_init(GPIO_NR_PALMT5_POWER_DETECT, -1);
palm27x_pmic_init();
palmt5_kpc_init();
palmt5_keys_init();
} }
MACHINE_START(PALMT5, "Palm Tungsten|T5") MACHINE_START(PALMT5, "Palm Tungsten|T5")

View File

@ -23,7 +23,7 @@
#include <linux/pda_power.h> #include <linux/pda_power.h>
#include <linux/pwm_backlight.h> #include <linux/pwm_backlight.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/wm97xx_batt.h> #include <linux/wm97xx.h>
#include <linux/power_supply.h> #include <linux/power_supply.h>
#include <linux/usb/gpio_vbus.h> #include <linux/usb/gpio_vbus.h>
@ -271,9 +271,9 @@ static struct platform_device power_supply = {
}; };
/****************************************************************************** /******************************************************************************
* WM97xx battery * WM97xx audio, battery
******************************************************************************/ ******************************************************************************/
static struct wm97xx_batt_info wm97xx_batt_pdata = { static struct wm97xx_batt_pdata palmte2_batt_pdata = {
.batt_aux = WM97XX_AUX_ID3, .batt_aux = WM97XX_AUX_ID3,
.temp_aux = WM97XX_AUX_ID2, .temp_aux = WM97XX_AUX_ID2,
.charge_gpio = -1, .charge_gpio = -1,
@ -287,9 +287,14 @@ static struct wm97xx_batt_info wm97xx_batt_pdata = {
.batt_name = "main-batt", .batt_name = "main-batt",
}; };
/****************************************************************************** static struct wm97xx_pdata palmte2_wm97xx_pdata = {
* aSoC audio .batt_pdata = &palmte2_batt_pdata,
******************************************************************************/ };
static pxa2xx_audio_ops_t palmte2_ac97_pdata = {
.codec_pdata = { &palmte2_wm97xx_pdata, },
};
static struct palm27x_asoc_info palmte2_asoc_pdata = { static struct palm27x_asoc_info palmte2_asoc_pdata = {
.jack_gpio = GPIO_NR_PALMTE2_EARPHONE_DETECT, .jack_gpio = GPIO_NR_PALMTE2_EARPHONE_DETECT,
}; };
@ -361,9 +366,8 @@ static void __init palmte2_init(void)
set_pxa_fb_info(&palmte2_lcd_screen); set_pxa_fb_info(&palmte2_lcd_screen);
pxa_set_mci_info(&palmte2_mci_platform_data); pxa_set_mci_info(&palmte2_mci_platform_data);
palmte2_udc_init(); palmte2_udc_init();
pxa_set_ac97_info(NULL); pxa_set_ac97_info(&palmte2_ac97_pdata);
pxa_set_ficp_info(&palmte2_ficp_platform_data); pxa_set_ficp_info(&palmte2_ficp_platform_data);
wm97xx_bat_set_pdata(&wm97xx_batt_pdata);
platform_add_devices(devices, ARRAY_SIZE(devices)); platform_add_devices(devices, ARRAY_SIZE(devices));
} }

View File

@ -24,7 +24,6 @@
#include <linux/pda_power.h> #include <linux/pda_power.h>
#include <linux/pwm_backlight.h> #include <linux/pwm_backlight.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/wm97xx_batt.h>
#include <linux/power_supply.h> #include <linux/power_supply.h>
#include <linux/sysdev.h> #include <linux/sysdev.h>
#include <linux/w1-gpio.h> #include <linux/w1-gpio.h>
@ -46,6 +45,7 @@
#include <mach/pxa2xx-regs.h> #include <mach/pxa2xx-regs.h>
#include <mach/palmasoc.h> #include <mach/palmasoc.h>
#include <mach/camera.h> #include <mach/camera.h>
#include <mach/palm27x.h>
#include <sound/pxa2xx-lib.h> #include <sound/pxa2xx-lib.h>
@ -159,32 +159,10 @@ static unsigned long centro685_pin_config[] __initdata = {
}; };
#endif /* CONFIG_MACH_CENTRO */ #endif /* CONFIG_MACH_CENTRO */
/******************************************************************************
* SD/MMC card controller
******************************************************************************/
#ifdef CONFIG_MACH_TREO680
static struct pxamci_platform_data treo680_mci_platform_data = {
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
.gpio_card_detect = GPIO_NR_TREO_SD_DETECT_N,
.gpio_card_ro = GPIO_NR_TREO680_SD_READONLY,
.gpio_power = GPIO_NR_TREO680_SD_POWER,
};
#endif /* CONFIG_MACH_TREO680 */
#ifdef CONFIG_MACH_CENTRO
static struct pxamci_platform_data centro_mci_platform_data = {
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
.gpio_card_detect = GPIO_NR_TREO_SD_DETECT_N,
.gpio_card_ro = -1,
.gpio_power = GPIO_NR_CENTRO_SD_POWER,
.gpio_power_invert = 1,
};
#endif /* CONFIG_MACH_CENTRO */
/****************************************************************************** /******************************************************************************
* GPIO keyboard * GPIO keyboard
******************************************************************************/ ******************************************************************************/
#ifdef CONFIG_MACH_TREO680 #if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE)
static unsigned int treo680_matrix_keys[] = { static unsigned int treo680_matrix_keys[] = {
KEY(0, 0, KEY_F8), /* Red/Off/Power */ KEY(0, 0, KEY_F8), /* Red/Off/Power */
KEY(0, 1, KEY_LEFT), KEY(0, 1, KEY_LEFT),
@ -244,19 +222,6 @@ static unsigned int treo680_matrix_keys[] = {
KEY(7, 5, KEY_I), KEY(7, 5, KEY_I),
}; };
static struct pxa27x_keypad_platform_data treo680_keypad_platform_data = {
.matrix_key_rows = 8,
.matrix_key_cols = 7,
.matrix_key_map = treo680_matrix_keys,
.matrix_key_map_size = ARRAY_SIZE(treo680_matrix_keys),
.direct_key_map = { KEY_CONNECT },
.direct_key_num = 1,
.debounce_interval = 30,
};
#endif /* CONFIG_MACH_TREO680 */
#ifdef CONFIG_MACH_CENTRO
static unsigned int centro_matrix_keys[] = { static unsigned int centro_matrix_keys[] = {
KEY(0, 0, KEY_F9), /* Home */ KEY(0, 0, KEY_F9), /* Home */
KEY(0, 1, KEY_LEFT), KEY(0, 1, KEY_LEFT),
@ -316,157 +281,50 @@ static unsigned int centro_matrix_keys[] = {
KEY(7, 5, KEY_I), KEY(7, 5, KEY_I),
}; };
static struct pxa27x_keypad_platform_data centro_keypad_platform_data = { static struct pxa27x_keypad_platform_data treo680_keypad_pdata = {
.matrix_key_rows = 8, .matrix_key_rows = 8,
.matrix_key_cols = 7, .matrix_key_cols = 7,
.matrix_key_map = centro_matrix_keys, .matrix_key_map = treo680_matrix_keys,
.matrix_key_map_size = ARRAY_SIZE(centro_matrix_keys), .matrix_key_map_size = ARRAY_SIZE(treo680_matrix_keys),
.direct_key_map = { KEY_CONNECT }, .direct_key_map = { KEY_CONNECT },
.direct_key_num = 1, .direct_key_num = 1,
.debounce_interval = 30, .debounce_interval = 30,
}; };
#endif /* CONFIG_MACH_CENTRO */
/****************************************************************************** static void __init palmtreo_kpc_init(void)
* aSoC audio
******************************************************************************/
static pxa2xx_audio_ops_t treo_ac97_pdata = {
.reset_gpio = 95,
};
/******************************************************************************
* Backlight
******************************************************************************/
static int treo_backlight_init(struct device *dev)
{ {
int ret; static struct pxa27x_keypad_platform_data *data = &treo680_keypad_pdata;
ret = gpio_request(GPIO_NR_TREO_BL_POWER, "BL POWER"); if (machine_is_centro()) {
if (ret) data->matrix_key_map = centro_matrix_keys;
goto err; data->matrix_key_map_size = ARRAY_SIZE(centro_matrix_keys);
ret = gpio_direction_output(GPIO_NR_TREO_BL_POWER, 0); }
if (ret)
goto err2;
return 0; pxa_set_keypad_info(&treo680_keypad_pdata);
err2:
gpio_free(GPIO_NR_TREO_BL_POWER);
err:
return ret;
} }
#else
static int treo_backlight_notify(struct device *dev, int brightness) static inline void palmtreo_kpc_init(void) {}
{ #endif
gpio_set_value(GPIO_NR_TREO_BL_POWER, brightness);
return TREO_MAX_INTENSITY - brightness;
};
static void treo_backlight_exit(struct device *dev)
{
gpio_free(GPIO_NR_TREO_BL_POWER);
}
static struct platform_pwm_backlight_data treo_backlight_data = {
.pwm_id = 0,
.max_brightness = TREO_MAX_INTENSITY,
.dft_brightness = TREO_DEFAULT_INTENSITY,
.pwm_period_ns = TREO_PERIOD_NS,
.init = treo_backlight_init,
.notify = treo_backlight_notify,
.exit = treo_backlight_exit,
};
static struct platform_device treo_backlight = {
.name = "pwm-backlight",
.dev = {
.parent = &pxa27x_device_pwm0.dev,
.platform_data = &treo_backlight_data,
},
};
/******************************************************************************
* IrDA
******************************************************************************/
static struct pxaficp_platform_data treo_ficp_info = {
.gpio_pwdown = GPIO_NR_TREO_IR_EN,
.transceiver_cap = IR_SIRMODE | IR_OFF,
};
/******************************************************************************
* UDC
******************************************************************************/
static struct pxa2xx_udc_mach_info treo_udc_info __initdata = {
.gpio_vbus = GPIO_NR_TREO_USB_DETECT,
.gpio_vbus_inverted = 1,
.gpio_pullup = GPIO_NR_TREO_USB_PULLUP,
};
/****************************************************************************** /******************************************************************************
* USB host * USB host
******************************************************************************/ ******************************************************************************/
#ifdef CONFIG_MACH_TREO680 #if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
static struct pxaohci_platform_data treo680_ohci_info = { static struct pxaohci_platform_data treo680_ohci_info = {
.port_mode = PMM_PERPORT_MODE, .port_mode = PMM_PERPORT_MODE,
.flags = ENABLE_PORT1 | ENABLE_PORT3, .flags = ENABLE_PORT1 | ENABLE_PORT3,
.power_budget = 0, .power_budget = 0,
}; };
#endif /* CONFIG_MACH_TREO680 */
/****************************************************************************** static void __init palmtreo_uhc_init(void)
* Power supply
******************************************************************************/
static int power_supply_init(struct device *dev)
{ {
int ret; if (machine_is_treo680())
pxa_set_ohci_info(&treo680_ohci_info);
ret = gpio_request(GPIO_NR_TREO_POWER_DETECT, "CABLE_STATE_AC");
if (ret)
goto err1;
ret = gpio_direction_input(GPIO_NR_TREO_POWER_DETECT);
if (ret)
goto err2;
return 0;
err2:
gpio_free(GPIO_NR_TREO_POWER_DETECT);
err1:
return ret;
} }
#else
static int treo_is_ac_online(void) static inline void palmtreo_uhc_init(void) {}
{ #endif
return gpio_get_value(GPIO_NR_TREO_POWER_DETECT);
}
static void power_supply_exit(struct device *dev)
{
gpio_free(GPIO_NR_TREO_POWER_DETECT);
}
static char *treo_supplicants[] = {
"main-battery",
};
static struct pda_power_pdata power_supply_info = {
.init = power_supply_init,
.is_ac_online = treo_is_ac_online,
.exit = power_supply_exit,
.supplied_to = treo_supplicants,
.num_supplicants = ARRAY_SIZE(treo_supplicants),
};
static struct platform_device power_supply = {
.name = "pda-power",
.id = -1,
.dev = {
.platform_data = &power_supply_info,
},
};
/****************************************************************************** /******************************************************************************
* Vibra and LEDs * Vibra and LEDs
@ -495,16 +353,6 @@ static struct gpio_led_platform_data treo680_gpio_led_info = {
.num_leds = ARRAY_SIZE(treo680_gpio_leds), .num_leds = ARRAY_SIZE(treo680_gpio_leds),
}; };
static struct platform_device treo680_leds = {
.name = "leds-gpio",
.id = -1,
.dev = {
.platform_data = &treo680_gpio_led_info,
}
};
#endif /* CONFIG_MACH_TREO680 */
#ifdef CONFIG_MACH_CENTRO
static struct gpio_led centro_gpio_leds[] = { static struct gpio_led centro_gpio_leds[] = {
{ {
.name = "centro:vibra:vibra", .name = "centro:vibra:vibra",
@ -529,145 +377,67 @@ static struct gpio_led_platform_data centro_gpio_led_info = {
.num_leds = ARRAY_SIZE(centro_gpio_leds), .num_leds = ARRAY_SIZE(centro_gpio_leds),
}; };
static struct platform_device centro_leds = { static struct platform_device palmtreo_leds = {
.name = "leds-gpio", .name = "leds-gpio",
.id = -1, .id = -1,
.dev = { .dev = {
.platform_data = &centro_gpio_led_info, .platform_data = &treo680_gpio_led_info,
} }
}; };
#endif /* CONFIG_MACH_CENTRO */
/****************************************************************************** static void __init palmtreo_leds_init(void)
* Framebuffer
******************************************************************************/
/* TODO: add support for 324x324 */
static struct pxafb_mode_info treo_lcd_modes[] = {
{ {
.pixclock = 86538, if (machine_is_centro())
.xres = 320, palmtreo_leds.dev.platform_data = &centro_gpio_led_info;
.yres = 320,
.bpp = 16,
.left_margin = 20, platform_device_register(&palmtreo_leds);
.right_margin = 8,
.upper_margin = 8,
.lower_margin = 5,
.hsync_len = 4,
.vsync_len = 1,
},
};
static void treo_lcd_power(int on, struct fb_var_screeninfo *info)
{
gpio_set_value(GPIO_NR_TREO_BL_POWER, on);
}
static struct pxafb_mach_info treo_lcd_screen = {
.modes = treo_lcd_modes,
.num_modes = ARRAY_SIZE(treo_lcd_modes),
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
};
/******************************************************************************
* Power management - standby
******************************************************************************/
static void __init treo_pm_init(void)
{
static u32 resume[] = {
0xe3a00101, /* mov r0, #0x40000000 */
0xe380060f, /* orr r0, r0, #0x00f00000 */
0xe590f008, /* ldr pc, [r0, #0x08] */
};
/* this is where the bootloader jumps */
memcpy(phys_to_virt(TREO_STR_BASE), resume, sizeof(resume));
} }
#else
static inline void palmtreo_leds_init(void) {}
#endif
/****************************************************************************** /******************************************************************************
* Machine init * Machine init
******************************************************************************/ ******************************************************************************/
static struct platform_device *treo_devices[] __initdata = {
&treo_backlight,
&power_supply,
};
#ifdef CONFIG_MACH_TREO680
static struct platform_device *treo680_devices[] __initdata = {
&treo680_leds,
};
#endif /* CONFIG_MACH_TREO680 */
#ifdef CONFIG_MACH_CENTRO
static struct platform_device *centro_devices[] __initdata = {
&centro_leds,
};
#endif /* CONFIG_MACH_CENTRO */
/* setup udc GPIOs initial state */
static void __init treo_udc_init(void)
{
if (!gpio_request(GPIO_NR_TREO_USB_PULLUP, "UDC Vbus")) {
gpio_direction_output(GPIO_NR_TREO_USB_PULLUP, 1);
gpio_free(GPIO_NR_TREO_USB_PULLUP);
}
}
static void __init treo_lcd_power_init(void)
{
int ret;
ret = gpio_request(GPIO_NR_TREO_LCD_POWER, "LCD POWER");
if (ret) {
pr_err("Treo680: LCD power GPIO request failed!\n");
return;
}
ret = gpio_direction_output(GPIO_NR_TREO_LCD_POWER, 0);
if (ret) {
pr_err("Treo680: setting LCD power GPIO direction failed!\n");
gpio_free(GPIO_NR_TREO_LCD_POWER);
return;
}
treo_lcd_screen.pxafb_lcd_power = treo_lcd_power;
}
static void __init treo_reserve(void) static void __init treo_reserve(void)
{ {
memblock_reserve(0xa0000000, 0x1000); memblock_reserve(0xa0000000, 0x1000);
memblock_reserve(0xa2000000, 0x1000); memblock_reserve(0xa2000000, 0x1000);
} }
static void __init treo_init(void) static void __init palmphone_common_init(void)
{ {
pxa2xx_mfp_config(ARRAY_AND_SIZE(treo_pin_config));
pxa_set_ffuart_info(NULL); pxa_set_ffuart_info(NULL);
pxa_set_btuart_info(NULL); pxa_set_btuart_info(NULL);
pxa_set_stuart_info(NULL); pxa_set_stuart_info(NULL);
palm27x_pm_init(TREO_STR_BASE);
treo_pm_init(); palm27x_lcd_init(GPIO_NR_TREO_BL_POWER, &palm_320x320_new_lcd_mode);
pxa2xx_mfp_config(ARRAY_AND_SIZE(treo_pin_config)); palm27x_udc_init(GPIO_NR_TREO_USB_DETECT, GPIO_NR_TREO_USB_PULLUP, 1);
treo_lcd_power_init(); palm27x_irda_init(GPIO_NR_TREO_IR_EN);
set_pxa_fb_info(&treo_lcd_screen); palm27x_ac97_init(-1, -1, -1, 95);
treo_udc_init(); palm27x_pwm_init(GPIO_NR_TREO_BL_POWER, -1);
pxa_set_udc_info(&treo_udc_info); palm27x_power_init(GPIO_NR_TREO_POWER_DETECT, -1);
pxa_set_ac97_info(&treo_ac97_pdata); palm27x_pmic_init();
pxa_set_ficp_info(&treo_ficp_info); palmtreo_kpc_init();
palmtreo_uhc_init();
platform_add_devices(ARRAY_AND_SIZE(treo_devices)); palmtreo_leds_init();
} }
#ifdef CONFIG_MACH_TREO680
static void __init treo680_init(void) static void __init treo680_init(void)
{ {
treo_init();
pxa2xx_mfp_config(ARRAY_AND_SIZE(treo680_pin_config)); pxa2xx_mfp_config(ARRAY_AND_SIZE(treo680_pin_config));
pxa_set_mci_info(&treo680_mci_platform_data); palmphone_common_init();
pxa_set_keypad_info(&treo680_keypad_platform_data); palm27x_mmc_init(GPIO_NR_TREO_SD_DETECT_N, GPIO_NR_TREO680_SD_READONLY,
pxa_set_ohci_info(&treo680_ohci_info); GPIO_NR_TREO680_SD_POWER, 0);
}
platform_add_devices(ARRAY_AND_SIZE(treo680_devices)); static void __init centro_init(void)
{
pxa2xx_mfp_config(ARRAY_AND_SIZE(centro685_pin_config));
palmphone_common_init();
palm27x_mmc_init(GPIO_NR_TREO_SD_DETECT_N, -1,
GPIO_NR_CENTRO_SD_POWER, 1);
} }
MACHINE_START(TREO680, "Palm Treo 680") MACHINE_START(TREO680, "Palm Treo 680")
@ -680,19 +450,6 @@ MACHINE_START(TREO680, "Palm Treo 680")
.timer = &pxa_timer, .timer = &pxa_timer,
.init_machine = treo680_init, .init_machine = treo680_init,
MACHINE_END MACHINE_END
#endif /* CONFIG_MACH_TREO680 */
#ifdef CONFIG_MACH_CENTRO
static void __init centro_init(void)
{
treo_init();
pxa2xx_mfp_config(ARRAY_AND_SIZE(centro685_pin_config));
pxa_set_mci_info(&centro_mci_platform_data);
pxa_set_keypad_info(&centro_keypad_platform_data);
platform_add_devices(ARRAY_AND_SIZE(centro_devices));
}
MACHINE_START(CENTRO, "Palm Centro 685") MACHINE_START(CENTRO, "Palm Centro 685")
.phys_io = TREO_PHYS_IO_START, .phys_io = TREO_PHYS_IO_START,
@ -702,6 +459,5 @@ MACHINE_START(CENTRO, "Palm Centro 685")
.reserve = treo_reserve, .reserve = treo_reserve,
.init_irq = pxa27x_init_irq, .init_irq = pxa27x_init_irq,
.timer = &pxa_timer, .timer = &pxa_timer,
.init_machine = centro_init, .init_machine = centro_init,
MACHINE_END MACHINE_END
#endif /* CONFIG_MACH_CENTRO */

View File

@ -25,7 +25,7 @@
#include <linux/pda_power.h> #include <linux/pda_power.h>
#include <linux/pwm_backlight.h> #include <linux/pwm_backlight.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/wm97xx_batt.h> #include <linux/wm97xx.h>
#include <linux/power_supply.h> #include <linux/power_supply.h>
#include <linux/usb/gpio_vbus.h> #include <linux/usb/gpio_vbus.h>
#include <linux/mtd/nand.h> #include <linux/mtd/nand.h>
@ -46,6 +46,7 @@
#include <mach/pxa27x_keypad.h> #include <mach/pxa27x_keypad.h>
#include <mach/udc.h> #include <mach/udc.h>
#include <mach/palmasoc.h> #include <mach/palmasoc.h>
#include <mach/palm27x.h>
#include "generic.h" #include "generic.h"
#include "devices.h" #include "devices.h"
@ -129,6 +130,7 @@ static unsigned long palmtx_pin_config[] __initdata = {
/****************************************************************************** /******************************************************************************
* NOR Flash * NOR Flash
******************************************************************************/ ******************************************************************************/
#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
static struct mtd_partition palmtx_partitions[] = { static struct mtd_partition palmtx_partitions[] = {
{ {
.name = "Flash", .name = "Flash",
@ -162,20 +164,18 @@ static struct platform_device palmtx_flash = {
}, },
}; };
/****************************************************************************** static void __init palmtx_nor_init(void)
* SD/MMC card controller {
******************************************************************************/ platform_device_register(&palmtx_flash);
static struct pxamci_platform_data palmtx_mci_platform_data = { }
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, #else
.gpio_card_detect = GPIO_NR_PALMTX_SD_DETECT_N, static inline void palmtx_nor_init(void) {}
.gpio_card_ro = GPIO_NR_PALMTX_SD_READONLY, #endif
.gpio_power = GPIO_NR_PALMTX_SD_POWER,
.detect_delay_ms = 200,
};
/****************************************************************************** /******************************************************************************
* GPIO keyboard * GPIO keyboard
******************************************************************************/ ******************************************************************************/
#if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE)
static unsigned int palmtx_matrix_keys[] = { static unsigned int palmtx_matrix_keys[] = {
KEY(0, 0, KEY_POWER), KEY(0, 0, KEY_POWER),
KEY(0, 1, KEY_F1), KEY(0, 1, KEY_F1),
@ -201,9 +201,18 @@ static struct pxa27x_keypad_platform_data palmtx_keypad_platform_data = {
.debounce_interval = 30, .debounce_interval = 30,
}; };
static void __init palmtx_kpc_init(void)
{
pxa_set_keypad_info(&palmtx_keypad_platform_data);
}
#else
static inline void palmtx_kpc_init(void) {}
#endif
/****************************************************************************** /******************************************************************************
* GPIO keys * GPIO keys
******************************************************************************/ ******************************************************************************/
#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
static struct gpio_keys_button palmtx_pxa_buttons[] = { static struct gpio_keys_button palmtx_pxa_buttons[] = {
{KEY_F8, GPIO_NR_PALMTX_HOTSYNC_BUTTON_N, 1, "HotSync Button" }, {KEY_F8, GPIO_NR_PALMTX_HOTSYNC_BUTTON_N, 1, "HotSync Button" },
}; };
@ -221,208 +230,18 @@ static struct platform_device palmtx_pxa_keys = {
}, },
}; };
/****************************************************************************** static void __init palmtx_keys_init(void)
* Backlight
******************************************************************************/
static int palmtx_backlight_init(struct device *dev)
{ {
int ret; platform_device_register(&palmtx_pxa_keys);
ret = gpio_request(GPIO_NR_PALMTX_BL_POWER, "BL POWER");
if (ret)
goto err;
ret = gpio_direction_output(GPIO_NR_PALMTX_BL_POWER, 0);
if (ret)
goto err2;
ret = gpio_request(GPIO_NR_PALMTX_LCD_POWER, "LCD POWER");
if (ret)
goto err2;
ret = gpio_direction_output(GPIO_NR_PALMTX_LCD_POWER, 0);
if (ret)
goto err3;
return 0;
err3:
gpio_free(GPIO_NR_PALMTX_LCD_POWER);
err2:
gpio_free(GPIO_NR_PALMTX_BL_POWER);
err:
return ret;
} }
#else
static int palmtx_backlight_notify(struct device *dev, int brightness) static inline void palmtx_keys_init(void) {}
{ #endif
gpio_set_value(GPIO_NR_PALMTX_BL_POWER, brightness);
gpio_set_value(GPIO_NR_PALMTX_LCD_POWER, brightness);
return brightness;
}
static void palmtx_backlight_exit(struct device *dev)
{
gpio_free(GPIO_NR_PALMTX_BL_POWER);
gpio_free(GPIO_NR_PALMTX_LCD_POWER);
}
static struct platform_pwm_backlight_data palmtx_backlight_data = {
.pwm_id = 0,
.max_brightness = PALMTX_MAX_INTENSITY,
.dft_brightness = PALMTX_MAX_INTENSITY,
.pwm_period_ns = PALMTX_PERIOD_NS,
.init = palmtx_backlight_init,
.notify = palmtx_backlight_notify,
.exit = palmtx_backlight_exit,
};
static struct platform_device palmtx_backlight = {
.name = "pwm-backlight",
.dev = {
.parent = &pxa27x_device_pwm0.dev,
.platform_data = &palmtx_backlight_data,
},
};
/******************************************************************************
* IrDA
******************************************************************************/
static struct pxaficp_platform_data palmtx_ficp_platform_data = {
.gpio_pwdown = GPIO_NR_PALMTX_IR_DISABLE,
.transceiver_cap = IR_SIRMODE | IR_OFF,
};
/******************************************************************************
* UDC
******************************************************************************/
static struct gpio_vbus_mach_info palmtx_udc_info = {
.gpio_vbus = GPIO_NR_PALMTX_USB_DETECT_N,
.gpio_vbus_inverted = 1,
.gpio_pullup = GPIO_NR_PALMTX_USB_PULLUP,
};
static struct platform_device palmtx_gpio_vbus = {
.name = "gpio-vbus",
.id = -1,
.dev = {
.platform_data = &palmtx_udc_info,
},
};
/******************************************************************************
* Power supply
******************************************************************************/
static int power_supply_init(struct device *dev)
{
int ret;
ret = gpio_request(GPIO_NR_PALMTX_POWER_DETECT, "CABLE_STATE_AC");
if (ret)
goto err1;
ret = gpio_direction_input(GPIO_NR_PALMTX_POWER_DETECT);
if (ret)
goto err2;
return 0;
err2:
gpio_free(GPIO_NR_PALMTX_POWER_DETECT);
err1:
return ret;
}
static int palmtx_is_ac_online(void)
{
return gpio_get_value(GPIO_NR_PALMTX_POWER_DETECT);
}
static void power_supply_exit(struct device *dev)
{
gpio_free(GPIO_NR_PALMTX_POWER_DETECT);
}
static char *palmtx_supplicants[] = {
"main-battery",
};
static struct pda_power_pdata power_supply_info = {
.init = power_supply_init,
.is_ac_online = palmtx_is_ac_online,
.exit = power_supply_exit,
.supplied_to = palmtx_supplicants,
.num_supplicants = ARRAY_SIZE(palmtx_supplicants),
};
static struct platform_device power_supply = {
.name = "pda-power",
.id = -1,
.dev = {
.platform_data = &power_supply_info,
},
};
/******************************************************************************
* WM97xx battery
******************************************************************************/
static struct wm97xx_batt_info wm97xx_batt_pdata = {
.batt_aux = WM97XX_AUX_ID3,
.temp_aux = WM97XX_AUX_ID2,
.charge_gpio = -1,
.max_voltage = PALMTX_BAT_MAX_VOLTAGE,
.min_voltage = PALMTX_BAT_MIN_VOLTAGE,
.batt_mult = 1000,
.batt_div = 414,
.temp_mult = 1,
.temp_div = 1,
.batt_tech = POWER_SUPPLY_TECHNOLOGY_LIPO,
.batt_name = "main-batt",
};
/******************************************************************************
* aSoC audio
******************************************************************************/
static struct palm27x_asoc_info palmtx_asoc_pdata = {
.jack_gpio = GPIO_NR_PALMTX_EARPHONE_DETECT,
};
static pxa2xx_audio_ops_t palmtx_ac97_pdata = {
.reset_gpio = 95,
};
static struct platform_device palmtx_asoc = {
.name = "palm27x-asoc",
.id = -1,
.dev = {
.platform_data = &palmtx_asoc_pdata,
},
};
/******************************************************************************
* Framebuffer
******************************************************************************/
static struct pxafb_mode_info palmtx_lcd_modes[] = {
{
.pixclock = 57692,
.xres = 320,
.yres = 480,
.bpp = 16,
.left_margin = 32,
.right_margin = 1,
.upper_margin = 7,
.lower_margin = 1,
.hsync_len = 4,
.vsync_len = 1,
},
};
static struct pxafb_mach_info palmtx_lcd_screen = {
.modes = palmtx_lcd_modes,
.num_modes = ARRAY_SIZE(palmtx_lcd_modes),
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
};
/****************************************************************************** /******************************************************************************
* NAND Flash * NAND Flash
******************************************************************************/ ******************************************************************************/
#if defined(CONFIG_MTD_NAND_GPIO) || defined(CONFIG_MTD_NAND_GPIO_MODULE)
static void palmtx_nand_cmd_ctl(struct mtd_info *mtd, int cmd, static void palmtx_nand_cmd_ctl(struct mtd_info *mtd, int cmd,
unsigned int ctrl) unsigned int ctrl)
{ {
@ -482,36 +301,17 @@ static struct platform_device palmtx_nand = {
} }
}; };
/****************************************************************************** static void __init palmtx_nand_init(void)
* Power management - standby
******************************************************************************/
static void __init palmtx_pm_init(void)
{ {
static u32 resume[] = { platform_device_register(&palmtx_nand);
0xe3a00101, /* mov r0, #0x40000000 */
0xe380060f, /* orr r0, r0, #0x00f00000 */
0xe590f008, /* ldr pc, [r0, #0x08] */
};
/* copy the bootloader */
memcpy(phys_to_virt(PALMTX_STR_BASE), resume, sizeof(resume));
} }
#else
static inline void palmtx_nand_init(void) {}
#endif
/****************************************************************************** /******************************************************************************
* Machine init * Machine init
******************************************************************************/ ******************************************************************************/
static struct platform_device *devices[] __initdata = {
#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
&palmtx_pxa_keys,
#endif
&palmtx_backlight,
&power_supply,
&palmtx_asoc,
&palmtx_gpio_vbus,
&palmtx_flash,
&palmtx_nand,
};
static struct map_desc palmtx_io_desc[] __initdata = { static struct map_desc palmtx_io_desc[] __initdata = {
{ {
.virtual = PALMTX_PCMCIA_VIRT, .virtual = PALMTX_PCMCIA_VIRT,
@ -537,34 +337,29 @@ static void __init palmtx_map_io(void)
iotable_init(palmtx_io_desc, ARRAY_SIZE(palmtx_io_desc)); iotable_init(palmtx_io_desc, ARRAY_SIZE(palmtx_io_desc));
} }
/* setup udc GPIOs initial state */
static void __init palmtx_udc_init(void)
{
if (!gpio_request(GPIO_NR_PALMTX_USB_PULLUP, "UDC Vbus")) {
gpio_direction_output(GPIO_NR_PALMTX_USB_PULLUP, 1);
gpio_free(GPIO_NR_PALMTX_USB_PULLUP);
}
}
static void __init palmtx_init(void) static void __init palmtx_init(void)
{ {
pxa2xx_mfp_config(ARRAY_AND_SIZE(palmtx_pin_config)); pxa2xx_mfp_config(ARRAY_AND_SIZE(palmtx_pin_config));
pxa_set_ffuart_info(NULL); pxa_set_ffuart_info(NULL);
pxa_set_btuart_info(NULL); pxa_set_btuart_info(NULL);
pxa_set_stuart_info(NULL); pxa_set_stuart_info(NULL);
palmtx_pm_init(); palm27x_mmc_init(GPIO_NR_PALMTX_SD_DETECT_N, GPIO_NR_PALMTX_SD_READONLY,
set_pxa_fb_info(&palmtx_lcd_screen); GPIO_NR_PALMTX_SD_POWER, 0);
pxa_set_mci_info(&palmtx_mci_platform_data); palm27x_pm_init(PALMTX_STR_BASE);
palmtx_udc_init(); palm27x_lcd_init(-1, &palm_320x480_lcd_mode);
pxa_set_ac97_info(&palmtx_ac97_pdata); palm27x_udc_init(GPIO_NR_PALMTX_USB_DETECT_N,
pxa_set_ficp_info(&palmtx_ficp_platform_data); GPIO_NR_PALMTX_USB_PULLUP, 1);
pxa_set_keypad_info(&palmtx_keypad_platform_data); palm27x_irda_init(GPIO_NR_PALMTX_IR_DISABLE);
wm97xx_bat_set_pdata(&wm97xx_batt_pdata); palm27x_ac97_init(PALMTX_BAT_MIN_VOLTAGE, PALMTX_BAT_MAX_VOLTAGE,
GPIO_NR_PALMTX_EARPHONE_DETECT, 95);
platform_add_devices(devices, ARRAY_SIZE(devices)); palm27x_pwm_init(GPIO_NR_PALMTX_BL_POWER, GPIO_NR_PALMTX_LCD_POWER);
palm27x_power_init(GPIO_NR_PALMTX_POWER_DETECT, -1);
palm27x_pmic_init();
palmtx_kpc_init();
palmtx_keys_init();
palmtx_nor_init();
palmtx_nand_init();
} }
MACHINE_START(PALMTX, "Palm T|X") MACHINE_START(PALMTX, "Palm T|X")

View File

@ -27,7 +27,7 @@
#include <linux/pda_power.h> #include <linux/pda_power.h>
#include <linux/pwm_backlight.h> #include <linux/pwm_backlight.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/wm97xx_batt.h> #include <linux/wm97xx.h>
#include <linux/power_supply.h> #include <linux/power_supply.h>
#include <linux/usb/gpio_vbus.h> #include <linux/usb/gpio_vbus.h>
@ -44,6 +44,7 @@
#include <mach/pxa27x_keypad.h> #include <mach/pxa27x_keypad.h>
#include <mach/udc.h> #include <mach/udc.h>
#include <mach/palmasoc.h> #include <mach/palmasoc.h>
#include <mach/palm27x.h>
#include <mach/pm.h> #include <mach/pm.h>
@ -108,22 +109,10 @@ static unsigned long palmz72_pin_config[] __initdata = {
GPIO27_GPIO, /* WM9712 IRQ */ GPIO27_GPIO, /* WM9712 IRQ */
}; };
/******************************************************************************
* SD/MMC card controller
******************************************************************************/
/* SD_POWER is not actually power, but it is more like chip
* select, i.e. it is inverted */
static struct pxamci_platform_data palmz72_mci_platform_data = {
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
.gpio_card_detect = GPIO_NR_PALMZ72_SD_DETECT_N,
.gpio_card_ro = GPIO_NR_PALMZ72_SD_RO,
.gpio_power = GPIO_NR_PALMZ72_SD_POWER_N,
.gpio_power_invert = 1,
};
/****************************************************************************** /******************************************************************************
* GPIO keyboard * GPIO keyboard
******************************************************************************/ ******************************************************************************/
#if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE)
static unsigned int palmz72_matrix_keys[] = { static unsigned int palmz72_matrix_keys[] = {
KEY(0, 0, KEY_POWER), KEY(0, 0, KEY_POWER),
KEY(0, 1, KEY_F1), KEY(0, 1, KEY_F1),
@ -149,77 +138,18 @@ static struct pxa27x_keypad_platform_data palmz72_keypad_platform_data = {
.debounce_interval = 30, .debounce_interval = 30,
}; };
/****************************************************************************** static void __init palmz72_kpc_init(void)
* Backlight
******************************************************************************/
static int palmz72_backlight_init(struct device *dev)
{ {
int ret; pxa_set_keypad_info(&palmz72_keypad_platform_data);
ret = gpio_request(GPIO_NR_PALMZ72_BL_POWER, "BL POWER");
if (ret)
goto err;
ret = gpio_direction_output(GPIO_NR_PALMZ72_BL_POWER, 0);
if (ret)
goto err2;
ret = gpio_request(GPIO_NR_PALMZ72_LCD_POWER, "LCD POWER");
if (ret)
goto err2;
ret = gpio_direction_output(GPIO_NR_PALMZ72_LCD_POWER, 0);
if (ret)
goto err3;
return 0;
err3:
gpio_free(GPIO_NR_PALMZ72_LCD_POWER);
err2:
gpio_free(GPIO_NR_PALMZ72_BL_POWER);
err:
return ret;
} }
#else
static int palmz72_backlight_notify(struct device *dev, int brightness) static inline void palmz72_kpc_init(void) {}
{ #endif
gpio_set_value(GPIO_NR_PALMZ72_BL_POWER, brightness);
gpio_set_value(GPIO_NR_PALMZ72_LCD_POWER, brightness);
return brightness;
}
static void palmz72_backlight_exit(struct device *dev)
{
gpio_free(GPIO_NR_PALMZ72_BL_POWER);
gpio_free(GPIO_NR_PALMZ72_LCD_POWER);
}
static struct platform_pwm_backlight_data palmz72_backlight_data = {
.pwm_id = 0,
.max_brightness = PALMZ72_MAX_INTENSITY,
.dft_brightness = PALMZ72_MAX_INTENSITY,
.pwm_period_ns = PALMZ72_PERIOD_NS,
.init = palmz72_backlight_init,
.notify = palmz72_backlight_notify,
.exit = palmz72_backlight_exit,
};
static struct platform_device palmz72_backlight = {
.name = "pwm-backlight",
.dev = {
.parent = &pxa27x_device_pwm0.dev,
.platform_data = &palmz72_backlight_data,
},
};
/******************************************************************************
* IrDA
******************************************************************************/
static struct pxaficp_platform_data palmz72_ficp_platform_data = {
.gpio_pwdown = GPIO_NR_PALMZ72_IR_DISABLE,
.transceiver_cap = IR_SIRMODE | IR_OFF,
};
/****************************************************************************** /******************************************************************************
* LEDs * LEDs
******************************************************************************/ ******************************************************************************/
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
static struct gpio_led gpio_leds[] = { static struct gpio_led gpio_leds[] = {
{ {
.name = "palmz72:green:led", .name = "palmz72:green:led",
@ -241,139 +171,13 @@ static struct platform_device palmz72_leds = {
} }
}; };
/****************************************************************************** static void __init palmz72_leds_init(void)
* UDC
******************************************************************************/
static struct gpio_vbus_mach_info palmz72_udc_info = {
.gpio_vbus = GPIO_NR_PALMZ72_USB_DETECT_N,
.gpio_pullup = GPIO_NR_PALMZ72_USB_PULLUP,
};
static struct platform_device palmz72_gpio_vbus = {
.name = "gpio-vbus",
.id = -1,
.dev = {
.platform_data = &palmz72_udc_info,
},
};
/******************************************************************************
* Power supply
******************************************************************************/
static int power_supply_init(struct device *dev)
{ {
int ret; platform_device_register(&palmz72_leds);
ret = gpio_request(GPIO_NR_PALMZ72_POWER_DETECT, "CABLE_STATE_AC");
if (ret)
goto err1;
ret = gpio_direction_input(GPIO_NR_PALMZ72_POWER_DETECT);
if (ret)
goto err2;
ret = gpio_request(GPIO_NR_PALMZ72_USB_DETECT_N, "CABLE_STATE_USB");
if (ret)
goto err2;
ret = gpio_direction_input(GPIO_NR_PALMZ72_USB_DETECT_N);
if (ret)
goto err3;
return 0;
err3:
gpio_free(GPIO_NR_PALMZ72_USB_DETECT_N);
err2:
gpio_free(GPIO_NR_PALMZ72_POWER_DETECT);
err1:
return ret;
} }
#else
static int palmz72_is_ac_online(void) static inline void palmz72_leds_init(void) {}
{ #endif
return gpio_get_value(GPIO_NR_PALMZ72_POWER_DETECT);
}
static int palmz72_is_usb_online(void)
{
return !gpio_get_value(GPIO_NR_PALMZ72_USB_DETECT_N);
}
static void power_supply_exit(struct device *dev)
{
gpio_free(GPIO_NR_PALMZ72_USB_DETECT_N);
gpio_free(GPIO_NR_PALMZ72_POWER_DETECT);
}
static char *palmz72_supplicants[] = {
"main-battery",
};
static struct pda_power_pdata power_supply_info = {
.init = power_supply_init,
.is_ac_online = palmz72_is_ac_online,
.is_usb_online = palmz72_is_usb_online,
.exit = power_supply_exit,
.supplied_to = palmz72_supplicants,
.num_supplicants = ARRAY_SIZE(palmz72_supplicants),
};
static struct platform_device power_supply = {
.name = "pda-power",
.id = -1,
.dev = {
.platform_data = &power_supply_info,
},
};
/******************************************************************************
* WM97xx battery
******************************************************************************/
static struct wm97xx_batt_info wm97xx_batt_pdata = {
.batt_aux = WM97XX_AUX_ID3,
.temp_aux = WM97XX_AUX_ID2,
.charge_gpio = -1,
.max_voltage = PALMZ72_BAT_MAX_VOLTAGE,
.min_voltage = PALMZ72_BAT_MIN_VOLTAGE,
.batt_mult = 1000,
.batt_div = 414,
.temp_mult = 1,
.temp_div = 1,
.batt_tech = POWER_SUPPLY_TECHNOLOGY_LIPO,
.batt_name = "main-batt",
};
/******************************************************************************
* aSoC audio
******************************************************************************/
static struct platform_device palmz72_asoc = {
.name = "palm27x-asoc",
.id = -1,
};
/******************************************************************************
* Framebuffer
******************************************************************************/
static struct pxafb_mode_info palmz72_lcd_modes[] = {
{
.pixclock = 115384,
.xres = 320,
.yres = 320,
.bpp = 16,
.left_margin = 27,
.right_margin = 7,
.upper_margin = 7,
.lower_margin = 8,
.hsync_len = 6,
.vsync_len = 1,
},
};
static struct pxafb_mach_info palmz72_lcd_screen = {
.modes = palmz72_lcd_modes,
.num_modes = ARRAY_SIZE(palmz72_lcd_modes),
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
};
#ifdef CONFIG_PM #ifdef CONFIG_PM
@ -452,40 +256,26 @@ device_initcall(palmz72_pm_init);
/****************************************************************************** /******************************************************************************
* Machine init * Machine init
******************************************************************************/ ******************************************************************************/
static struct platform_device *devices[] __initdata = {
&palmz72_backlight,
&palmz72_leds,
&palmz72_asoc,
&power_supply,
&palmz72_gpio_vbus,
};
/* setup udc GPIOs initial state */
static void __init palmz72_udc_init(void)
{
if (!gpio_request(GPIO_NR_PALMZ72_USB_PULLUP, "USB Pullup")) {
gpio_direction_output(GPIO_NR_PALMZ72_USB_PULLUP, 0);
gpio_free(GPIO_NR_PALMZ72_USB_PULLUP);
}
}
static void __init palmz72_init(void) static void __init palmz72_init(void)
{ {
pxa2xx_mfp_config(ARRAY_AND_SIZE(palmz72_pin_config)); pxa2xx_mfp_config(ARRAY_AND_SIZE(palmz72_pin_config));
pxa_set_ffuart_info(NULL); pxa_set_ffuart_info(NULL);
pxa_set_btuart_info(NULL); pxa_set_btuart_info(NULL);
pxa_set_stuart_info(NULL); pxa_set_stuart_info(NULL);
set_pxa_fb_info(&palmz72_lcd_screen); palm27x_mmc_init(GPIO_NR_PALMZ72_SD_DETECT_N, GPIO_NR_PALMZ72_SD_RO,
pxa_set_mci_info(&palmz72_mci_platform_data); GPIO_NR_PALMZ72_SD_POWER_N, 1);
palmz72_udc_init(); palm27x_lcd_init(-1, &palm_320x320_lcd_mode);
pxa_set_ac97_info(NULL); palm27x_udc_init(GPIO_NR_PALMZ72_USB_DETECT_N,
pxa_set_ficp_info(&palmz72_ficp_platform_data); GPIO_NR_PALMZ72_USB_PULLUP, 0);
pxa_set_keypad_info(&palmz72_keypad_platform_data); palm27x_irda_init(GPIO_NR_PALMZ72_IR_DISABLE);
wm97xx_bat_set_pdata(&wm97xx_batt_pdata); palm27x_ac97_init(PALMZ72_BAT_MIN_VOLTAGE, PALMZ72_BAT_MAX_VOLTAGE,
-1, 113);
platform_add_devices(devices, ARRAY_SIZE(devices)); palm27x_pwm_init(-1, -1);
palm27x_power_init(-1, -1);
palm27x_pmic_init();
palmz72_kpc_init();
palmz72_leds_init();
} }
MACHINE_START(PALMZ72, "Palm Zire72") MACHINE_START(PALMZ72, "Palm Zire72")

View File

@ -43,7 +43,6 @@
#include <mach/irda.h> #include <mach/irda.h>
#include <mach/poodle.h> #include <mach/poodle.h>
#include <mach/pxafb.h> #include <mach/pxafb.h>
#include <mach/sharpsl.h>
#include <mach/pxa2xx_spi.h> #include <mach/pxa2xx_spi.h>
#include <plat/i2c.h> #include <plat/i2c.h>
@ -53,7 +52,6 @@
#include "generic.h" #include "generic.h"
#include "devices.h" #include "devices.h"
#include "sharpsl.h"
static unsigned long poodle_pin_config[] __initdata = { static unsigned long poodle_pin_config[] __initdata = {
/* I/O */ /* I/O */

View File

@ -322,6 +322,7 @@ void __init pxa26x_init_irq(void)
static struct platform_device *pxa25x_devices[] __initdata = { static struct platform_device *pxa25x_devices[] __initdata = {
&pxa25x_device_udc, &pxa25x_device_udc,
&pxa_device_pmu,
&pxa_device_i2s, &pxa_device_i2s,
&sa1100_device_rtc, &sa1100_device_rtc,
&pxa25x_device_ssp, &pxa25x_device_ssp,

View File

@ -383,6 +383,7 @@ void __init pxa27x_set_i2c_power_info(struct i2c_pxa_platform_data *info)
static struct platform_device *devices[] __initdata = { static struct platform_device *devices[] __initdata = {
&pxa27x_device_udc, &pxa27x_device_udc,
&pxa_device_pmu,
&pxa_device_i2s, &pxa_device_i2s,
&sa1100_device_rtc, &sa1100_device_rtc,
&pxa_device_rtc, &pxa_device_rtc,

View File

@ -52,7 +52,7 @@
static unsigned char smcfs_mult[8] = { 6, 0, 8, 0, 0, 16, }; static unsigned char smcfs_mult[8] = { 6, 0, 8, 0, 0, 16, };
/* crystal frequency to HSIO bus frequency multiplier (HSS) */ /* crystal frequency to HSIO bus frequency multiplier (HSS) */
static unsigned char hss_mult[4] = { 8, 12, 16, 0 }; static unsigned char hss_mult[4] = { 8, 12, 16, 24 };
/* /*
* Get the clock frequency as reflected by CCSR and the turbo flag. * Get the clock frequency as reflected by CCSR and the turbo flag.
@ -552,11 +552,23 @@ static void pxa_unmask_ext_wakeup(unsigned int irq)
PECR |= PECR_IE(irq - IRQ_WAKEUP0); PECR |= PECR_IE(irq - IRQ_WAKEUP0);
} }
static int pxa_set_ext_wakeup_type(unsigned int irq, unsigned int flow_type)
{
if (flow_type & IRQ_TYPE_EDGE_RISING)
PWER |= 1 << (irq - IRQ_WAKEUP0);
if (flow_type & IRQ_TYPE_EDGE_FALLING)
PWER |= 1 << (irq - IRQ_WAKEUP0 + 2);
return 0;
}
static struct irq_chip pxa_ext_wakeup_chip = { static struct irq_chip pxa_ext_wakeup_chip = {
.name = "WAKEUP", .name = "WAKEUP",
.ack = pxa_ack_ext_wakeup, .ack = pxa_ack_ext_wakeup,
.mask = pxa_mask_ext_wakeup, .mask = pxa_mask_ext_wakeup,
.unmask = pxa_unmask_ext_wakeup, .unmask = pxa_unmask_ext_wakeup,
.set_type = pxa_set_ext_wakeup_type,
}; };
static void __init pxa_init_ext_wakeup_irq(set_wake_t fn) static void __init pxa_init_ext_wakeup_irq(set_wake_t fn)
@ -596,6 +608,7 @@ void __init pxa3xx_set_i2c_power_info(struct i2c_pxa_platform_data *info)
static struct platform_device *devices[] __initdata = { static struct platform_device *devices[] __initdata = {
&pxa27x_device_udc, &pxa27x_device_udc,
&pxa_device_pmu,
&pxa_device_i2s, &pxa_device_i2s,
&sa1100_device_rtc, &sa1100_device_rtc,
&pxa_device_rtc, &pxa_device_rtc,

View File

@ -745,13 +745,32 @@ static int raumfeld_is_usb_online(void)
static char *raumfeld_power_supplicants[] = { "ds2760-battery.0" }; static char *raumfeld_power_supplicants[] = { "ds2760-battery.0" };
static void raumfeld_power_signal_charged(void)
{
struct power_supply *psy =
power_supply_get_by_name(raumfeld_power_supplicants[0]);
if (psy)
power_supply_set_battery_charged(psy);
}
static int raumfeld_power_resume(void)
{
/* check if GPIO_CHARGE_DONE went low while we were sleeping */
if (!gpio_get_value(GPIO_CHARGE_DONE))
raumfeld_power_signal_charged();
return 0;
}
static struct pda_power_pdata power_supply_info = { static struct pda_power_pdata power_supply_info = {
.init = power_supply_init, .init = power_supply_init,
.is_ac_online = raumfeld_is_ac_online, .is_ac_online = raumfeld_is_ac_online,
.is_usb_online = raumfeld_is_usb_online, .is_usb_online = raumfeld_is_usb_online,
.exit = power_supply_exit, .exit = power_supply_exit,
.supplied_to = raumfeld_power_supplicants, .supplied_to = raumfeld_power_supplicants,
.num_supplicants = ARRAY_SIZE(raumfeld_power_supplicants) .num_supplicants = ARRAY_SIZE(raumfeld_power_supplicants),
.resume = raumfeld_power_resume,
}; };
static struct resource power_supply_resources[] = { static struct resource power_supply_resources[] = {
@ -766,13 +785,7 @@ static struct resource power_supply_resources[] = {
static irqreturn_t charge_done_irq(int irq, void *dev_id) static irqreturn_t charge_done_irq(int irq, void *dev_id)
{ {
struct power_supply *psy; raumfeld_power_signal_charged();
psy = power_supply_get_by_name("ds2760-battery.0");
if (psy)
power_supply_set_battery_charged(psy);
return IRQ_HANDLED; return IRQ_HANDLED;
} }

View File

@ -1,26 +0,0 @@
/*
* Copyright (c) 2004-2005 Richard Purdie
*
* 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
* published by the Free Software Foundation.
*
*/
#include <mach/sharpsl_pm.h>
/*
* SharpSL Battery/PM Driver
*/
#define READ_GPIO_BIT(x) (GPLR(x) & GPIO_bit(x))
/* MAX1111 Channel Definitions */
#define MAX1111_BATT_VOLT 4u
#define MAX1111_BATT_TEMP 2u
#define MAX1111_ACIN_VOLT 6u
extern struct battery_thresh sharpsl_battery_levels_acin[];
extern struct battery_thresh sharpsl_battery_levels_noac[];
int sharpsl_pm_pxa_read_max1111(int channel);

View File

@ -29,11 +29,8 @@
#include <mach/pm.h> #include <mach/pm.h>
#include <mach/pxa2xx-regs.h> #include <mach/pxa2xx-regs.h>
#include <mach/regs-rtc.h> #include <mach/regs-rtc.h>
#include <mach/sharpsl.h>
#include <mach/sharpsl_pm.h> #include <mach/sharpsl_pm.h>
#include "sharpsl.h"
/* /*
* Constants * Constants
*/ */
@ -180,17 +177,12 @@ int sharpsl_pm_pxa_read_max1111(int channel)
if (machine_is_tosa()) if (machine_is_tosa())
return 0; return 0;
#ifdef CONFIG_CORGI_SSP_DEPRECATED
return corgi_ssp_max1111_get((channel << MAXCTRL_SEL_SH) | MAXCTRL_PD0 | MAXCTRL_PD1
| MAXCTRL_SGL | MAXCTRL_UNI | MAXCTRL_STR);
#else
extern int max1111_read_channel(int); extern int max1111_read_channel(int);
/* max1111 accepts channels from 0-3, however, /* max1111 accepts channels from 0-3, however,
* it is encoded from 0-7 here in the code. * it is encoded from 0-7 here in the code.
*/ */
return max1111_read_channel(channel >> 1); return max1111_read_channel(channel >> 1);
#endif
} }
static int get_percentage(int voltage) static int get_percentage(int voltage)
@ -277,21 +269,6 @@ static void sharpsl_battery_thread(struct work_struct *private_)
dev_dbg(sharpsl_pm.dev, "Battery: voltage: %d, status: %d, percentage: %d, time: %ld\n", voltage, dev_dbg(sharpsl_pm.dev, "Battery: voltage: %d, status: %d, percentage: %d, time: %ld\n", voltage,
sharpsl_pm.battstat.mainbat_status, sharpsl_pm.battstat.mainbat_percent, jiffies); sharpsl_pm.battstat.mainbat_status, sharpsl_pm.battstat.mainbat_percent, jiffies);
#ifdef CONFIG_BACKLIGHT_CORGI
/* If battery is low. limit backlight intensity to save power. */
if ((sharpsl_pm.battstat.ac_status != APM_AC_ONLINE)
&& ((sharpsl_pm.battstat.mainbat_status == APM_BATTERY_STATUS_LOW)
|| (sharpsl_pm.battstat.mainbat_status == APM_BATTERY_STATUS_CRITICAL))) {
if (!(sharpsl_pm.flags & SHARPSL_BL_LIMIT)) {
sharpsl_pm.machinfo->backlight_limit(1);
sharpsl_pm.flags |= SHARPSL_BL_LIMIT;
}
} else if (sharpsl_pm.flags & SHARPSL_BL_LIMIT) {
sharpsl_pm.machinfo->backlight_limit(0);
sharpsl_pm.flags &= ~SHARPSL_BL_LIMIT;
}
#endif
/* Suspend if critical battery level */ /* Suspend if critical battery level */
if ((sharpsl_pm.battstat.ac_status != APM_AC_ONLINE) if ((sharpsl_pm.battstat.ac_status != APM_AC_ONLINE)
&& (sharpsl_pm.battstat.mainbat_status == APM_BATTERY_STATUS_CRITICAL) && (sharpsl_pm.battstat.mainbat_status == APM_BATTERY_STATUS_CRITICAL)

View File

@ -339,10 +339,6 @@ ENTRY(pxa_cpu_resume)
mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs
mcr p15, 0, r1, c7, c7, 0 @ invalidate I & D caches, BTB mcr p15, 0, r1, c7, c7, 0 @ invalidate I & D caches, BTB
#ifdef CONFIG_XSCALE_CACHE_ERRATA
bic r9, r9, #0x0004 @ see cpu_xscale_proc_init
#endif
mcr p14, 0, r3, c6, c0, 0 @ clock configuration, turbo mode. mcr p14, 0, r3, c6, c0, 0 @ clock configuration, turbo mode.
mcr p15, 0, r4, c15, c1, 0 @ CP access reg mcr p15, 0, r4, c15, c1, 0 @ CP access reg
mcr p15, 0, r5, c13, c0, 0 @ PID mcr p15, 0, r5, c13, c0, 0 @ PID
@ -368,9 +364,6 @@ sleep_save_sp:
.text .text
resume_after_mmu: resume_after_mmu:
#ifdef CONFIG_XSCALE_CACHE_ERRATA
bl cpu_xscale_proc_init
#endif
ldmfd sp!, {r2, r3} ldmfd sp!, {r2, r3}
#ifndef CONFIG_IWMMXT #ifndef CONFIG_IWMMXT
mar acc0, r2, r3 mar acc0, r2, r3

File diff suppressed because it is too large Load Diff

View File

@ -22,11 +22,10 @@
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <mach/sharpsl.h>
#include <mach/spitz.h> #include <mach/spitz.h>
#include <mach/pxa27x.h> #include <mach/pxa27x.h>
#include <mach/sharpsl_pm.h>
#include "sharpsl.h"
#include "generic.h" #include "generic.h"
#define SHARPSL_CHARGE_ON_VOLT 0x99 /* 2.9V */ #define SHARPSL_CHARGE_ON_VOLT 0x99 /* 2.9V */
@ -178,11 +177,11 @@ unsigned long spitzpm_read_devdata(int type)
case SHARPSL_STATUS_ACIN: case SHARPSL_STATUS_ACIN:
return (((~GPLR(SPITZ_GPIO_AC_IN)) & GPIO_bit(SPITZ_GPIO_AC_IN)) != 0); return (((~GPLR(SPITZ_GPIO_AC_IN)) & GPIO_bit(SPITZ_GPIO_AC_IN)) != 0);
case SHARPSL_STATUS_LOCK: case SHARPSL_STATUS_LOCK:
return READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_batlock); return gpio_get_value(sharpsl_pm.machinfo->gpio_batlock);
case SHARPSL_STATUS_CHRGFULL: case SHARPSL_STATUS_CHRGFULL:
return READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_batfull); return gpio_get_value(sharpsl_pm.machinfo->gpio_batfull);
case SHARPSL_STATUS_FATAL: case SHARPSL_STATUS_FATAL:
return READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_fatal); return gpio_get_value(sharpsl_pm.machinfo->gpio_fatal);
case SHARPSL_ACIN_VOLT: case SHARPSL_ACIN_VOLT:
return sharpsl_pm_pxa_read_max1111(MAX1111_ACIN_VOLT); return sharpsl_pm_pxa_read_max1111(MAX1111_ACIN_VOLT);
case SHARPSL_BATT_TEMP: case SHARPSL_BATT_TEMP:
@ -212,8 +211,6 @@ struct sharpsl_charger_machinfo spitz_pm_machinfo = {
.should_wakeup = spitz_should_wakeup, .should_wakeup = spitz_should_wakeup,
#if defined(CONFIG_LCD_CORGI) #if defined(CONFIG_LCD_CORGI)
.backlight_limit = corgi_lcd_limit_intensity, .backlight_limit = corgi_lcd_limit_intensity,
#elif defined(CONFIG_BACKLIGHT_CORGI)
.backlight_limit = corgibl_limit_intensity,
#endif #endif
.charge_on_volt = SHARPSL_CHARGE_ON_VOLT, .charge_on_volt = SHARPSL_CHARGE_ON_VOLT,
.charge_on_temp = SHARPSL_CHARGE_ON_TEMP, .charge_on_temp = SHARPSL_CHARGE_ON_TEMP,

File diff suppressed because it is too large Load Diff

View File

@ -530,13 +530,9 @@ static void __init trizeps4_init(void)
i2c_register_board_info(0, trizeps4_i2c_devices, i2c_register_board_info(0, trizeps4_i2c_devices,
ARRAY_SIZE(trizeps4_i2c_devices)); ARRAY_SIZE(trizeps4_i2c_devices));
#ifdef CONFIG_IDE_PXA_CF
/* if boot direct from compact flash dont disable power */
trizeps_conxs_bcr = 0x0009;
#else
/* this is the reset value */ /* this is the reset value */
trizeps_conxs_bcr = 0x00A0; trizeps_conxs_bcr = 0x00A0;
#endif
BCR_writew(trizeps_conxs_bcr); BCR_writew(trizeps_conxs_bcr);
board_backlight_power(1); board_backlight_power(1);
} }

View File

@ -25,6 +25,7 @@
#include <linux/dm9000.h> #include <linux/dm9000.h>
#include <linux/ucb1400.h> #include <linux/ucb1400.h>
#include <linux/ata_platform.h> #include <linux/ata_platform.h>
#include <linux/regulator/max1586.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
@ -37,6 +38,7 @@
#include <mach/ohci.h> #include <mach/ohci.h>
#include <mach/pxa27x-udc.h> #include <mach/pxa27x-udc.h>
#include <mach/udc.h> #include <mach/udc.h>
#include <mach/pata_pxa.h>
#include <plat/i2c.h> #include <plat/i2c.h>
@ -464,7 +466,6 @@ static struct i2c_board_info __initdata vpac270_i2c_devs[] = {
static void __init vpac270_rtc_init(void) static void __init vpac270_rtc_init(void)
{ {
pxa_set_i2c_info(NULL);
i2c_register_board_info(0, ARRAY_AND_SIZE(vpac270_i2c_devs)); i2c_register_board_info(0, ARRAY_AND_SIZE(vpac270_i2c_devs));
} }
#else #else
@ -492,7 +493,55 @@ static struct pxafb_mode_info vpac270_lcd_modes[] = {
.vsync_len = 2, .vsync_len = 2,
.sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
}, }, { /* CRT 640x480 */
.pixclock = 35000,
.xres = 640,
.yres = 480,
.bpp = 16,
.depth = 16,
.left_margin = 96,
.right_margin = 48,
.upper_margin = 33,
.lower_margin = 10,
.hsync_len = 48,
.vsync_len = 1,
.sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
}, { /* CRT 800x600 H=30kHz V=48HZ */
.pixclock = 25000,
.xres = 800,
.yres = 600,
.bpp = 16,
.depth = 16,
.left_margin = 50,
.right_margin = 1,
.upper_margin = 21,
.lower_margin = 12,
.hsync_len = 8,
.vsync_len = 1,
.sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
}, { /* CRT 1024x768 H=40kHz V=50Hz */
.pixclock = 15000,
.xres = 1024,
.yres = 768,
.bpp = 16,
.depth = 16,
.left_margin = 220,
.right_margin = 8,
.upper_margin = 33,
.lower_margin = 2,
.hsync_len = 48,
.vsync_len = 1,
.sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
}
}; };
static struct pxafb_mach_info vpac270_lcd_screen = { static struct pxafb_mach_info vpac270_lcd_screen = {
@ -538,9 +587,10 @@ static inline void vpac270_lcd_init(void) {}
/****************************************************************************** /******************************************************************************
* PATA IDE * PATA IDE
******************************************************************************/ ******************************************************************************/
#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) #if defined(CONFIG_PATA_PXA) || defined(CONFIG_PATA_PXA_MODULE)
static struct pata_platform_info vpac270_pata_pdata = { static struct pata_pxa_pdata vpac270_pata_pdata = {
.ioport_shift = 1, .reg_shift = 1,
.dma_dreq = 1,
.irq_flags = IRQF_TRIGGER_RISING, .irq_flags = IRQF_TRIGGER_RISING,
}; };
@ -555,7 +605,12 @@ static struct resource vpac270_ide_resources[] = {
.end = PXA_CS3_PHYS + 0x15f, .end = PXA_CS3_PHYS + 0x15f,
.flags = IORESOURCE_MEM .flags = IORESOURCE_MEM
}, },
[2] = { /* IDE IRQ pin */ [2] = { /* DMA Base address */
.start = PXA_CS3_PHYS + 0x20,
.end = PXA_CS3_PHYS + 0x2f,
.flags = IORESOURCE_DMA
},
[3] = { /* IDE IRQ pin */
.start = gpio_to_irq(GPIO36_VPAC270_IDE_IRQ), .start = gpio_to_irq(GPIO36_VPAC270_IDE_IRQ),
.end = gpio_to_irq(GPIO36_VPAC270_IDE_IRQ), .end = gpio_to_irq(GPIO36_VPAC270_IDE_IRQ),
.flags = IORESOURCE_IRQ .flags = IORESOURCE_IRQ
@ -563,11 +618,12 @@ static struct resource vpac270_ide_resources[] = {
}; };
static struct platform_device vpac270_ide_device = { static struct platform_device vpac270_ide_device = {
.name = "pata_platform", .name = "pata_pxa",
.num_resources = ARRAY_SIZE(vpac270_ide_resources), .num_resources = ARRAY_SIZE(vpac270_ide_resources),
.resource = vpac270_ide_resources, .resource = vpac270_ide_resources,
.dev = { .dev = {
.platform_data = &vpac270_pata_pdata, .platform_data = &vpac270_pata_pdata,
.coherent_dma_mask = 0xffffffff,
} }
}; };
@ -579,6 +635,59 @@ static void __init vpac270_ide_init(void)
static inline void vpac270_ide_init(void) {} static inline void vpac270_ide_init(void) {}
#endif #endif
/******************************************************************************
* Core power regulator
******************************************************************************/
#if defined(CONFIG_REGULATOR_MAX1586) || \
defined(CONFIG_REGULATOR_MAX1586_MODULE)
static struct regulator_consumer_supply vpac270_max1587a_consumers[] = {
{
.supply = "vcc_core",
}
};
static struct regulator_init_data vpac270_max1587a_v3_info = {
.constraints = {
.name = "vcc_core range",
.min_uV = 900000,
.max_uV = 1705000,
.always_on = 1,
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
},
.consumer_supplies = vpac270_max1587a_consumers,
.num_consumer_supplies = ARRAY_SIZE(vpac270_max1587a_consumers),
};
static struct max1586_subdev_data vpac270_max1587a_subdevs[] = {
{
.name = "vcc_core",
.id = MAX1586_V3,
.platform_data = &vpac270_max1587a_v3_info,
}
};
static struct max1586_platform_data vpac270_max1587a_info = {
.subdevs = vpac270_max1587a_subdevs,
.num_subdevs = ARRAY_SIZE(vpac270_max1587a_subdevs),
.v3_gain = MAX1586_GAIN_R24_3k32, /* 730..1550 mV */
};
static struct i2c_board_info __initdata vpac270_pi2c_board_info[] = {
{
I2C_BOARD_INFO("max1586", 0x14),
.platform_data = &vpac270_max1587a_info,
},
};
static void __init vpac270_pmic_init(void)
{
i2c_register_board_info(1, ARRAY_AND_SIZE(vpac270_pi2c_board_info));
}
#else
static inline void vpac270_pmic_init(void) {}
#endif
/****************************************************************************** /******************************************************************************
* Machine init * Machine init
******************************************************************************/ ******************************************************************************/
@ -589,7 +698,10 @@ static void __init vpac270_init(void)
pxa_set_ffuart_info(NULL); pxa_set_ffuart_info(NULL);
pxa_set_btuart_info(NULL); pxa_set_btuart_info(NULL);
pxa_set_stuart_info(NULL); pxa_set_stuart_info(NULL);
pxa_set_i2c_info(NULL);
pxa27x_set_i2c_power_info(NULL);
vpac270_pmic_init();
vpac270_lcd_init(); vpac270_lcd_init();
vpac270_mmc_init(); vpac270_mmc_init();
vpac270_nor_init(); vpac270_nor_init();

View File

@ -17,6 +17,7 @@
#include <linux/mtd/mtd.h> #include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h> #include <linux/mtd/partitions.h>
#include <linux/pwm_backlight.h> #include <linux/pwm_backlight.h>
#include <linux/z2_battery.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/spi/libertas_spi.h> #include <linux/spi/libertas_spi.h>
@ -26,6 +27,7 @@
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/gpio_keys.h> #include <linux/gpio_keys.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/regulator/machine.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
@ -162,7 +164,7 @@ static struct mtd_partition z2_flash_parts[] = {
}, { }, {
.name = "U-Boot Environment", .name = "U-Boot Environment",
.offset = 0x40000, .offset = 0x40000,
.size = 0x60000, .size = 0x20000,
}, { }, {
.name = "Flash", .name = "Flash",
.offset = 0x60000, .offset = 0x60000,
@ -451,6 +453,42 @@ static void __init z2_keys_init(void)
static inline void z2_keys_init(void) {} static inline void z2_keys_init(void) {}
#endif #endif
/******************************************************************************
* Battery
******************************************************************************/
#if defined(CONFIG_I2C_PXA) || defined(CONFIG_I2C_PXA_MODULE)
static struct z2_battery_info batt_chip_info = {
.batt_I2C_bus = 0,
.batt_I2C_addr = 0x55,
.batt_I2C_reg = 2,
.charge_gpio = GPIO0_ZIPITZ2_AC_DETECT,
.min_voltage = 2400000,
.max_voltage = 3700000,
.batt_div = 69,
.batt_mult = 1000000,
.batt_tech = POWER_SUPPLY_TECHNOLOGY_LION,
.batt_name = "Z2",
};
static struct i2c_board_info __initdata z2_i2c_board_info[] = {
{
I2C_BOARD_INFO("aer915", 0x55),
.platform_data = &batt_chip_info,
}, {
I2C_BOARD_INFO("wm8750", 0x1b),
},
};
static void __init z2_i2c_init(void)
{
pxa_set_i2c_info(NULL);
i2c_register_board_info(0, ARRAY_AND_SIZE(z2_i2c_board_info));
}
#else
static inline void z2_i2c_init(void) {}
#endif
/****************************************************************************** /******************************************************************************
* SSP Devices - WiFi and LCD control * SSP Devices - WiFi and LCD control
******************************************************************************/ ******************************************************************************/
@ -572,6 +610,75 @@ static void __init z2_spi_init(void)
static inline void z2_spi_init(void) {} static inline void z2_spi_init(void) {}
#endif #endif
/******************************************************************************
* Core power regulator
******************************************************************************/
#if defined(CONFIG_REGULATOR_TPS65023) || \
defined(CONFIG_REGULATOR_TPS65023_MODULE)
static struct regulator_consumer_supply z2_tps65021_consumers[] = {
{
.supply = "vcc_core",
}
};
static struct regulator_init_data z2_tps65021_info[] = {
{
.constraints = {
.name = "vcc_core range",
.min_uV = 800000,
.max_uV = 1600000,
.always_on = 1,
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
},
.consumer_supplies = z2_tps65021_consumers,
.num_consumer_supplies = ARRAY_SIZE(z2_tps65021_consumers),
}, {
.constraints = {
.name = "DCDC2",
.min_uV = 3300000,
.max_uV = 3300000,
.always_on = 1,
},
}, {
.constraints = {
.name = "DCDC3",
.min_uV = 1800000,
.max_uV = 1800000,
.always_on = 1,
},
}, {
.constraints = {
.name = "LDO1",
.min_uV = 1000000,
.max_uV = 3150000,
.always_on = 1,
},
}, {
.constraints = {
.name = "LDO2",
.min_uV = 1050000,
.max_uV = 3300000,
.always_on = 1,
},
}
};
static struct i2c_board_info __initdata z2_pi2c_board_info[] = {
{
I2C_BOARD_INFO("tps65021", 0x48),
.platform_data = &z2_tps65021_info,
},
};
static void __init z2_pmic_init(void)
{
pxa27x_set_i2c_power_info(NULL);
i2c_register_board_info(1, ARRAY_AND_SIZE(z2_pi2c_board_info));
}
#else
static inline void z2_pmic_init(void) {}
#endif
/****************************************************************************** /******************************************************************************
* Machine init * Machine init
******************************************************************************/ ******************************************************************************/
@ -579,17 +686,20 @@ static void __init z2_init(void)
{ {
pxa2xx_mfp_config(ARRAY_AND_SIZE(z2_pin_config)); pxa2xx_mfp_config(ARRAY_AND_SIZE(z2_pin_config));
pxa_set_ffuart_info(NULL);
pxa_set_btuart_info(NULL);
pxa_set_stuart_info(NULL);
z2_lcd_init(); z2_lcd_init();
z2_mmc_init(); z2_mmc_init();
z2_mkp_init(); z2_mkp_init();
z2_i2c_init();
pxa_set_i2c_info(NULL);
z2_spi_init(); z2_spi_init();
z2_nor_init(); z2_nor_init();
z2_pwm_init(); z2_pwm_init();
z2_leds_init(); z2_leds_init();
z2_keys_init(); z2_keys_init();
z2_pmic_init();
} }
MACHINE_START(ZIPIT2, "Zipit Z2") MACHINE_START(ZIPIT2, "Zipit Z2")

View File

@ -57,11 +57,21 @@ config S3C64XX_SETUP_I2C1
help help
Common setup code for i2c bus 1. Common setup code for i2c bus 1.
config S3C64XX_SETUP_IDE
bool
help
Common setup code for S3C64XX IDE.
config S3C64XX_SETUP_FB_24BPP config S3C64XX_SETUP_FB_24BPP
bool bool
help help
Common setup code for S3C64XX with an 24bpp RGB display helper. Common setup code for S3C64XX with an 24bpp RGB display helper.
config S3C64XX_SETUP_KEYPAD
bool
help
Common setup code for S3C64XX KEYPAD GPIO configurations
config S3C64XX_SETUP_SDHCI_GPIO config S3C64XX_SETUP_SDHCI_GPIO
bool bool
help help
@ -95,15 +105,20 @@ config MACH_SMDK6410
select S3C_DEV_HSMMC select S3C_DEV_HSMMC
select S3C_DEV_HSMMC1 select S3C_DEV_HSMMC1
select S3C_DEV_I2C1 select S3C_DEV_I2C1
select SAMSUNG_DEV_IDE
select S3C_DEV_FB select S3C_DEV_FB
select S3C_DEV_RTC
select SAMSUNG_DEV_TS select SAMSUNG_DEV_TS
select S3C_DEV_USB_HOST select S3C_DEV_USB_HOST
select S3C_DEV_USB_HSOTG select S3C_DEV_USB_HSOTG
select S3C_DEV_WDT select S3C_DEV_WDT
select SAMSUNG_DEV_KEYPAD
select HAVE_S3C2410_WATCHDOG select HAVE_S3C2410_WATCHDOG
select S3C64XX_SETUP_SDHCI select S3C64XX_SETUP_SDHCI
select S3C64XX_SETUP_I2C1 select S3C64XX_SETUP_I2C1
select S3C64XX_SETUP_IDE
select S3C64XX_SETUP_FB_24BPP select S3C64XX_SETUP_FB_24BPP
select S3C64XX_SETUP_KEYPAD
help help
Machine support for the Samsung SMDK6410 Machine support for the Samsung SMDK6410

View File

@ -35,6 +35,8 @@ obj-$(CONFIG_S3C64XX_DMA) += dma.o
obj-$(CONFIG_S3C64XX_SETUP_I2C0) += setup-i2c0.o obj-$(CONFIG_S3C64XX_SETUP_I2C0) += setup-i2c0.o
obj-$(CONFIG_S3C64XX_SETUP_I2C1) += setup-i2c1.o obj-$(CONFIG_S3C64XX_SETUP_I2C1) += setup-i2c1.o
obj-$(CONFIG_S3C64XX_SETUP_IDE) += setup-ide.o
obj-$(CONFIG_S3C64XX_SETUP_KEYPAD) += setup-keypad.o
obj-$(CONFIG_S3C64XX_SETUP_SDHCI) += setup-sdhci.o obj-$(CONFIG_S3C64XX_SETUP_SDHCI) += setup-sdhci.o
obj-$(CONFIG_S3C64XX_SETUP_FB_24BPP) += setup-fb-24bpp.o obj-$(CONFIG_S3C64XX_SETUP_FB_24BPP) += setup-fb-24bpp.o
obj-$(CONFIG_S3C64XX_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o obj-$(CONFIG_S3C64XX_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o

View File

@ -132,6 +132,12 @@ static struct clk init_clocks_disable[] = {
.name = "nand", .name = "nand",
.id = -1, .id = -1,
.parent = &clk_h, .parent = &clk_h,
}, {
.name = "rtc",
.id = -1,
.parent = &clk_p,
.enable = s3c64xx_pclk_ctrl,
.ctrlbit = S3C_CLKCON_PCLK_RTC,
}, { }, {
.name = "adc", .name = "adc",
.id = -1, .id = -1,
@ -165,6 +171,12 @@ static struct clk init_clocks_disable[] = {
.ctrlbit = S3C6410_CLKCON_PCLK_IIS2, .ctrlbit = S3C6410_CLKCON_PCLK_IIS2,
}, { }, {
#endif #endif
.name = "keypad",
.id = -1,
.parent = &clk_p,
.enable = s3c64xx_pclk_ctrl,
.ctrlbit = S3C_CLKCON_PCLK_KEYPAD,
}, {
.name = "spi", .name = "spi",
.id = 0, .id = 0,
.parent = &clk_p, .parent = &clk_p,
@ -294,12 +306,6 @@ static struct clk init_clocks[] = {
.parent = &clk_p, .parent = &clk_p,
.enable = s3c64xx_pclk_ctrl, .enable = s3c64xx_pclk_ctrl,
.ctrlbit = S3C_CLKCON_PCLK_UART3, .ctrlbit = S3C_CLKCON_PCLK_UART3,
}, {
.name = "rtc",
.id = -1,
.parent = &clk_p,
.enable = s3c64xx_pclk_ctrl,
.ctrlbit = S3C_CLKCON_PCLK_RTC,
}, { }, {
.name = "watchdog", .name = "watchdog",
.id = -1, .id = -1,
@ -310,6 +316,12 @@ static struct clk init_clocks[] = {
.id = -1, .id = -1,
.parent = &clk_p, .parent = &clk_p,
.ctrlbit = S3C_CLKCON_PCLK_AC97, .ctrlbit = S3C_CLKCON_PCLK_AC97,
}, {
.name = "cfcon",
.id = -1,
.parent = &clk_h,
.enable = s3c64xx_hclk_ctrl,
.ctrlbit = S3C_CLKCON_HCLK_IHOST,
} }
}; };

View File

@ -12,11 +12,11 @@
#include <linux/string.h> #include <linux/string.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/gpio.h>
#include <mach/irqs.h> #include <mach/irqs.h>
#include <mach/map.h> #include <mach/map.h>
#include <mach/dma.h> #include <mach/dma.h>
#include <mach/gpio.h>
#include <plat/devs.h> #include <plat/devs.h>
#include <plat/audio.h> #include <plat/audio.h>

View File

@ -12,10 +12,10 @@
#include <linux/string.h> #include <linux/string.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/gpio.h>
#include <mach/dma.h> #include <mach/dma.h>
#include <mach/map.h> #include <mach/map.h>
#include <mach/gpio.h>
#include <mach/gpio-bank-c.h> #include <mach/gpio-bank-c.h>
#include <mach/spi-clocks.h> #include <mach/spi-clocks.h>

View File

@ -15,9 +15,9 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/gpio.h>
#include <mach/map.h> #include <mach/map.h>
#include <mach/gpio.h>
#include <plat/gpio-core.h> #include <plat/gpio-core.h>
#include <plat/gpio-cfg.h> #include <plat/gpio-cfg.h>

View File

@ -67,6 +67,7 @@
#define S3C64XX_PA_USB_HSOTG (0x7C000000) #define S3C64XX_PA_USB_HSOTG (0x7C000000)
#define S3C64XX_PA_WATCHDOG (0x7E004000) #define S3C64XX_PA_WATCHDOG (0x7E004000)
#define S3C64XX_PA_RTC (0x7E005000) #define S3C64XX_PA_RTC (0x7E005000)
#define S3C64XX_PA_KEYPAD (0x7E00A000)
#define S3C64XX_PA_ADC (0x7E00B000) #define S3C64XX_PA_ADC (0x7E00B000)
#define S3C64XX_PA_SYSCON (0x7E00F000) #define S3C64XX_PA_SYSCON (0x7E00F000)
#define S3C64XX_PA_AC97 (0x7F001000) #define S3C64XX_PA_AC97 (0x7F001000)
@ -86,6 +87,9 @@
#define S3C64XX_SZ_GPIO SZ_4K #define S3C64XX_SZ_GPIO SZ_4K
#define S3C64XX_PA_SDRAM (0x50000000) #define S3C64XX_PA_SDRAM (0x50000000)
#define S3C64XX_PA_CFCON (0x70300000)
#define S3C64XX_PA_VIC0 (0x71200000) #define S3C64XX_PA_VIC0 (0x71200000)
#define S3C64XX_PA_VIC1 (0x71300000) #define S3C64XX_PA_VIC1 (0x71300000)
@ -120,5 +124,7 @@
#define S3C_PA_WDT S3C64XX_PA_WATCHDOG #define S3C_PA_WDT S3C64XX_PA_WATCHDOG
#define SAMSUNG_PA_ADC S3C64XX_PA_ADC #define SAMSUNG_PA_ADC S3C64XX_PA_ADC
#define SAMSUNG_PA_CFCON S3C64XX_PA_CFCON
#define SAMSUNG_PA_KEYPAD S3C64XX_PA_KEYPAD
#endif /* __ASM_ARCH_6400_MAP_H */ #endif /* __ASM_ARCH_6400_MAP_H */

View File

@ -34,6 +34,7 @@
#define S3C_SCLK_GATE S3C_CLKREG(0x38) #define S3C_SCLK_GATE S3C_CLKREG(0x38)
#define S3C_MEM0_GATE S3C_CLKREG(0x3C) #define S3C_MEM0_GATE S3C_CLKREG(0x3C)
#define S3C6410_CLK_SRC2 S3C_CLKREG(0x10C) #define S3C6410_CLK_SRC2 S3C_CLKREG(0x10C)
#define S3C_MEM_SYS_CFG S3C_CLKREG(0x120)
/* CLKDIV0 */ /* CLKDIV0 */
#define S3C6400_CLKDIV0_PCLK_MASK (0xf << 12) #define S3C6400_CLKDIV0_PCLK_MASK (0xf << 12)
@ -154,4 +155,8 @@
#define S3C6400_CLKSRC_EPLL_MOUT_SHIFT (2) #define S3C6400_CLKSRC_EPLL_MOUT_SHIFT (2)
#define S3C6400_CLKSRC_MFC (1 << 4) #define S3C6400_CLKSRC_MFC (1 << 4)
/* MEM_SYS_CFG */
#define MEM_SYS_CFG_INDEP_CF 0x4000
#define MEM_SYS_CFG_EBI_FIX_PRI_CFCON 0x30
#endif /* _PLAT_REGS_CLOCK_H */ #endif /* _PLAT_REGS_CLOCK_H */

View File

@ -17,6 +17,7 @@
#include <linux/list.h> #include <linux/list.h>
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/input.h>
#include <linux/serial_core.h> #include <linux/serial_core.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/io.h> #include <linux/io.h>
@ -56,6 +57,7 @@
#include <mach/regs-gpio.h> #include <mach/regs-gpio.h>
#include <mach/regs-sys.h> #include <mach/regs-sys.h>
#include <mach/regs-srom.h> #include <mach/regs-srom.h>
#include <plat/ata.h>
#include <plat/iic.h> #include <plat/iic.h>
#include <plat/fb.h> #include <plat/fb.h>
#include <plat/gpio-cfg.h> #include <plat/gpio-cfg.h>
@ -66,6 +68,7 @@
#include <plat/cpu.h> #include <plat/cpu.h>
#include <plat/adc.h> #include <plat/adc.h>
#include <plat/ts.h> #include <plat/ts.h>
#include <plat/keypad.h>
#define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK #define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK
#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB #define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
@ -242,6 +245,29 @@ static struct platform_device smdk6410_b_pwr_5v = {
}; };
#endif #endif
static struct s3c_ide_platdata smdk6410_ide_pdata __initdata = {
.setup_gpio = s3c64xx_ide_setup_gpio,
};
static uint32_t smdk6410_keymap[] __initdata = {
/* KEY(row, col, keycode) */
KEY(0, 3, KEY_1), KEY(0, 4, KEY_2), KEY(0, 5, KEY_3),
KEY(0, 6, KEY_4), KEY(0, 7, KEY_5),
KEY(1, 3, KEY_A), KEY(1, 4, KEY_B), KEY(1, 5, KEY_C),
KEY(1, 6, KEY_D), KEY(1, 7, KEY_E)
};
static struct matrix_keymap_data smdk6410_keymap_data __initdata = {
.keymap = smdk6410_keymap,
.keymap_size = ARRAY_SIZE(smdk6410_keymap),
};
static struct samsung_keypad_platdata smdk6410_keypad_data __initdata = {
.keymap_data = &smdk6410_keymap_data,
.rows = 2,
.cols = 8,
};
static struct map_desc smdk6410_iodesc[] = {}; static struct map_desc smdk6410_iodesc[] = {};
static struct platform_device *smdk6410_devices[] __initdata = { static struct platform_device *smdk6410_devices[] __initdata = {
@ -257,6 +283,7 @@ static struct platform_device *smdk6410_devices[] __initdata = {
&s3c_device_ohci, &s3c_device_ohci,
&s3c_device_usb_hsotg, &s3c_device_usb_hsotg,
&s3c64xx_device_iisv4, &s3c64xx_device_iisv4,
&samsung_device_keypad,
#ifdef CONFIG_REGULATOR #ifdef CONFIG_REGULATOR
&smdk6410_b_pwr_5v, &smdk6410_b_pwr_5v,
@ -265,6 +292,8 @@ static struct platform_device *smdk6410_devices[] __initdata = {
&smdk6410_smsc911x, &smdk6410_smsc911x,
&s3c_device_adc, &s3c_device_adc,
&s3c_device_cfcon,
&s3c_device_rtc,
&s3c_device_ts, &s3c_device_ts,
&s3c_device_wdt, &s3c_device_wdt,
}; };
@ -636,6 +665,8 @@ static void __init smdk6410_machine_init(void)
s3c_i2c1_set_platdata(NULL); s3c_i2c1_set_platdata(NULL);
s3c_fb_set_platdata(&smdk6410_lcd_pdata); s3c_fb_set_platdata(&smdk6410_lcd_pdata);
samsung_keypad_set_platdata(&smdk6410_keypad_data);
s3c24xx_ts_set_platdata(&s3c_ts_platform); s3c24xx_ts_set_platdata(&s3c_ts_platform);
/* configure nCS1 width to 16 bits */ /* configure nCS1 width to 16 bits */
@ -665,6 +696,8 @@ static void __init smdk6410_machine_init(void)
i2c_register_board_info(0, i2c_devs0, ARRAY_SIZE(i2c_devs0)); i2c_register_board_info(0, i2c_devs0, ARRAY_SIZE(i2c_devs0));
i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1)); i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1));
s3c_ide_set_platdata(&smdk6410_ide_pdata);
platform_add_devices(smdk6410_devices, ARRAY_SIZE(smdk6410_devices)); platform_add_devices(smdk6410_devices, ARRAY_SIZE(smdk6410_devices));
} }

View File

@ -37,8 +37,9 @@
#include <plat/devs.h> #include <plat/devs.h>
#include <plat/clock.h> #include <plat/clock.h>
#include <plat/sdhci.h> #include <plat/sdhci.h>
#include <plat/ata-core.h>
#include <plat/adc-core.h>
#include <plat/iic-core.h> #include <plat/iic-core.h>
#include <plat/adc.h>
#include <plat/onenand-core.h> #include <plat/onenand-core.h>
#include <mach/s3c6400.h> #include <mach/s3c6400.h>
#include <mach/s3c6410.h> #include <mach/s3c6410.h>
@ -54,10 +55,11 @@ void __init s3c6410_map_io(void)
s3c_i2c0_setname("s3c2440-i2c"); s3c_i2c0_setname("s3c2440-i2c");
s3c_i2c1_setname("s3c2440-i2c"); s3c_i2c1_setname("s3c2440-i2c");
s3c_device_adc.name = "s3c64xx-adc"; s3c_adc_setname("s3c64xx-adc");
s3c_device_nand.name = "s3c6400-nand"; s3c_device_nand.name = "s3c6400-nand";
s3c_onenand_setname("s3c6410-onenand"); s3c_onenand_setname("s3c6410-onenand");
s3c64xx_onenand1_setname("s3c6410-onenand"); s3c64xx_onenand1_setname("s3c6410-onenand");
s3c_cfcon_setname("s3c64xx-pata");
} }
void __init s3c6410_init_clocks(int xtal) void __init s3c6410_init_clocks(int xtal)

Some files were not shown because too many files have changed in this diff Show More