mirror of https://gitee.com/openkylin/linux.git
Merge commit 'v3.0-rc1' into perf/core
Merge reason: merge in the latest fixes. Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
commit
27eb4a1e4a
|
@ -192,10 +192,6 @@ kernel-docs.txt
|
||||||
- listing of various WWW + books that document kernel internals.
|
- listing of various WWW + books that document kernel internals.
|
||||||
kernel-parameters.txt
|
kernel-parameters.txt
|
||||||
- summary listing of command line / boot prompt args for the kernel.
|
- summary listing of command line / boot prompt args for the kernel.
|
||||||
keys-request-key.txt
|
|
||||||
- description of the kernel key request service.
|
|
||||||
keys.txt
|
|
||||||
- description of the kernel key retention service.
|
|
||||||
kobject.txt
|
kobject.txt
|
||||||
- info of the kobject infrastructure of the Linux kernel.
|
- info of the kobject infrastructure of the Linux kernel.
|
||||||
kprobes.txt
|
kprobes.txt
|
||||||
|
@ -294,6 +290,8 @@ scheduler/
|
||||||
- directory with info on the scheduler.
|
- directory with info on the scheduler.
|
||||||
scsi/
|
scsi/
|
||||||
- directory with info on Linux scsi support.
|
- directory with info on Linux scsi support.
|
||||||
|
security/
|
||||||
|
- directory that contains security-related info
|
||||||
serial/
|
serial/
|
||||||
- directory with info on the low level serial API.
|
- directory with info on the low level serial API.
|
||||||
serial-console.txt
|
serial-console.txt
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
What: /sys/o2cb symlink
|
What: /sys/o2cb symlink
|
||||||
Date: Dec 2005
|
Date: May 2011
|
||||||
KernelVersion: 2.6.16
|
KernelVersion: 2.6.40
|
||||||
Contact: ocfs2-devel@oss.oracle.com
|
Contact: ocfs2-devel@oss.oracle.com
|
||||||
Description: This is a symlink: /sys/o2cb to /sys/fs/o2cb. The symlink will
|
Description: This is a symlink: /sys/o2cb to /sys/fs/o2cb. The symlink is
|
||||||
be removed when new versions of ocfs2-tools which know to look
|
removed when new versions of ocfs2-tools which know to look
|
||||||
in /sys/fs/o2cb are sufficiently prevalent. Don't code new
|
in /sys/fs/o2cb are sufficiently prevalent. Don't code new
|
||||||
software to look here, it should try /sys/fs/o2cb instead.
|
software to look here, it should try /sys/fs/o2cb instead.
|
||||||
See Documentation/ABI/stable/o2cb for more information on usage.
|
|
||||||
Users: ocfs2-tools. It's sufficient to mail proposed changes to
|
Users: ocfs2-tools. It's sufficient to mail proposed changes to
|
||||||
ocfs2-devel@oss.oracle.com.
|
ocfs2-devel@oss.oracle.com.
|
|
@ -0,0 +1,11 @@
|
||||||
|
What: /sys/kernel/mm/cleancache/
|
||||||
|
Date: April 2011
|
||||||
|
Contact: Dan Magenheimer <dan.magenheimer@oracle.com>
|
||||||
|
Description:
|
||||||
|
/sys/kernel/mm/cleancache/ contains a number of files which
|
||||||
|
record a count of various cleancache operations
|
||||||
|
(sum across all filesystems):
|
||||||
|
succ_gets
|
||||||
|
failed_gets
|
||||||
|
puts
|
||||||
|
flushes
|
|
@ -141,13 +141,15 @@ struct dtv_properties {
|
||||||
</row></tbody></tgroup></informaltable>
|
</row></tbody></tgroup></informaltable>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<title>Property types</title>
|
||||||
<para>
|
<para>
|
||||||
On <link linkend="FE_GET_PROPERTY">FE_GET_PROPERTY</link>/<link linkend="FE_SET_PROPERTY">FE_SET_PROPERTY</link>,
|
On <link linkend="FE_GET_PROPERTY">FE_GET_PROPERTY</link>/<link linkend="FE_SET_PROPERTY">FE_SET_PROPERTY</link>,
|
||||||
the actual action is determined by the dtv_property cmd/data pairs. With one single ioctl, is possible to
|
the actual action is determined by the dtv_property cmd/data pairs. With one single ioctl, is possible to
|
||||||
get/set up to 64 properties. The actual meaning of each property is described on the next sections.
|
get/set up to 64 properties. The actual meaning of each property is described on the next sections.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>The Available frontend property types are:</para>
|
<para>The available frontend property types are:</para>
|
||||||
<programlisting>
|
<programlisting>
|
||||||
#define DTV_UNDEFINED 0
|
#define DTV_UNDEFINED 0
|
||||||
#define DTV_TUNE 1
|
#define DTV_TUNE 1
|
||||||
|
@ -193,6 +195,7 @@ get/set up to 64 properties. The actual meaning of each property is described on
|
||||||
#define DTV_ISDBT_LAYER_ENABLED 41
|
#define DTV_ISDBT_LAYER_ENABLED 41
|
||||||
#define DTV_ISDBS_TS_ID 42
|
#define DTV_ISDBS_TS_ID 42
|
||||||
</programlisting>
|
</programlisting>
|
||||||
|
</section>
|
||||||
|
|
||||||
<section id="fe_property_common">
|
<section id="fe_property_common">
|
||||||
<title>Parameters that are common to all Digital TV standards</title>
|
<title>Parameters that are common to all Digital TV standards</title>
|
||||||
|
|
|
@ -293,6 +293,7 @@
|
||||||
<!ENTITY sub-yuyv SYSTEM "v4l/pixfmt-yuyv.xml">
|
<!ENTITY sub-yuyv SYSTEM "v4l/pixfmt-yuyv.xml">
|
||||||
<!ENTITY sub-yvyu SYSTEM "v4l/pixfmt-yvyu.xml">
|
<!ENTITY sub-yvyu SYSTEM "v4l/pixfmt-yvyu.xml">
|
||||||
<!ENTITY sub-srggb10 SYSTEM "v4l/pixfmt-srggb10.xml">
|
<!ENTITY sub-srggb10 SYSTEM "v4l/pixfmt-srggb10.xml">
|
||||||
|
<!ENTITY sub-srggb12 SYSTEM "v4l/pixfmt-srggb12.xml">
|
||||||
<!ENTITY sub-srggb8 SYSTEM "v4l/pixfmt-srggb8.xml">
|
<!ENTITY sub-srggb8 SYSTEM "v4l/pixfmt-srggb8.xml">
|
||||||
<!ENTITY sub-y10 SYSTEM "v4l/pixfmt-y10.xml">
|
<!ENTITY sub-y10 SYSTEM "v4l/pixfmt-y10.xml">
|
||||||
<!ENTITY sub-y12 SYSTEM "v4l/pixfmt-y12.xml">
|
<!ENTITY sub-y12 SYSTEM "v4l/pixfmt-y12.xml">
|
||||||
|
@ -373,9 +374,9 @@
|
||||||
<!ENTITY sub-media-indices SYSTEM "media-indices.tmpl">
|
<!ENTITY sub-media-indices SYSTEM "media-indices.tmpl">
|
||||||
|
|
||||||
<!ENTITY sub-media-controller SYSTEM "v4l/media-controller.xml">
|
<!ENTITY sub-media-controller SYSTEM "v4l/media-controller.xml">
|
||||||
<!ENTITY sub-media-open SYSTEM "v4l/media-func-open.xml">
|
<!ENTITY sub-media-func-open SYSTEM "v4l/media-func-open.xml">
|
||||||
<!ENTITY sub-media-close SYSTEM "v4l/media-func-close.xml">
|
<!ENTITY sub-media-func-close SYSTEM "v4l/media-func-close.xml">
|
||||||
<!ENTITY sub-media-ioctl SYSTEM "v4l/media-func-ioctl.xml">
|
<!ENTITY sub-media-func-ioctl SYSTEM "v4l/media-func-ioctl.xml">
|
||||||
<!ENTITY sub-media-ioc-device-info SYSTEM "v4l/media-ioc-device-info.xml">
|
<!ENTITY sub-media-ioc-device-info SYSTEM "v4l/media-ioc-device-info.xml">
|
||||||
<!ENTITY sub-media-ioc-enum-entities SYSTEM "v4l/media-ioc-enum-entities.xml">
|
<!ENTITY sub-media-ioc-enum-entities SYSTEM "v4l/media-ioc-enum-entities.xml">
|
||||||
<!ENTITY sub-media-ioc-enum-links SYSTEM "v4l/media-ioc-enum-links.xml">
|
<!ENTITY sub-media-ioc-enum-links SYSTEM "v4l/media-ioc-enum-links.xml">
|
||||||
|
|
|
@ -189,8 +189,7 @@ static void __iomem *baseaddr;
|
||||||
<title>Partition defines</title>
|
<title>Partition defines</title>
|
||||||
<para>
|
<para>
|
||||||
If you want to divide your device into partitions, then
|
If you want to divide your device into partitions, then
|
||||||
enable the configuration switch CONFIG_MTD_PARTITIONS and define
|
define a partitioning scheme suitable to your board.
|
||||||
a partitioning scheme suitable to your board.
|
|
||||||
</para>
|
</para>
|
||||||
<programlisting>
|
<programlisting>
|
||||||
#define NUM_PARTITIONS 2
|
#define NUM_PARTITIONS 2
|
||||||
|
|
|
@ -78,9 +78,9 @@
|
||||||
<appendix id="media-user-func">
|
<appendix id="media-user-func">
|
||||||
<title>Function Reference</title>
|
<title>Function Reference</title>
|
||||||
<!-- Keep this alphabetically sorted. -->
|
<!-- Keep this alphabetically sorted. -->
|
||||||
&sub-media-open;
|
&sub-media-func-open;
|
||||||
&sub-media-close;
|
&sub-media-func-close;
|
||||||
&sub-media-ioctl;
|
&sub-media-func-ioctl;
|
||||||
<!-- All ioctls go here. -->
|
<!-- All ioctls go here. -->
|
||||||
&sub-media-ioc-device-info;
|
&sub-media-ioc-device-info;
|
||||||
&sub-media-ioc-enum-entities;
|
&sub-media-ioc-enum-entities;
|
||||||
|
|
|
@ -673,6 +673,7 @@ access the palette, this must be done with ioctls of the Linux framebuffer API.<
|
||||||
&sub-srggb8;
|
&sub-srggb8;
|
||||||
&sub-sbggr16;
|
&sub-sbggr16;
|
||||||
&sub-srggb10;
|
&sub-srggb10;
|
||||||
|
&sub-srggb12;
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section id="yuv-formats">
|
<section id="yuv-formats">
|
||||||
|
|
|
@ -2531,13 +2531,13 @@
|
||||||
<constant>_JPEG</constant> prefix the format code is made of
|
<constant>_JPEG</constant> prefix the format code is made of
|
||||||
the following information.
|
the following information.
|
||||||
<itemizedlist>
|
<itemizedlist>
|
||||||
<listitem>The number of bus samples per entropy encoded byte.</listitem>
|
<listitem><para>The number of bus samples per entropy encoded byte.</para></listitem>
|
||||||
<listitem>The bus width.</listitem>
|
<listitem><para>The bus width.</para></listitem>
|
||||||
</itemizedlist>
|
</itemizedlist>
|
||||||
|
</para>
|
||||||
|
|
||||||
<para>For instance, for a JPEG baseline process and an 8-bit bus width
|
<para>For instance, for a JPEG baseline process and an 8-bit bus width
|
||||||
the format will be named <constant>V4L2_MBUS_FMT_JPEG_1X8</constant>.
|
the format will be named <constant>V4L2_MBUS_FMT_JPEG_1X8</constant>.
|
||||||
</para>
|
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>The following table lists existing JPEG compressed formats.</para>
|
<para>The following table lists existing JPEG compressed formats.</para>
|
||||||
|
|
|
@ -99,18 +99,11 @@ o "qp" indicates that RCU still expects a quiescent state from
|
||||||
|
|
||||||
o "dt" is the current value of the dyntick counter that is incremented
|
o "dt" is the current value of the dyntick counter that is incremented
|
||||||
when entering or leaving dynticks idle state, either by the
|
when entering or leaving dynticks idle state, either by the
|
||||||
scheduler or by irq. The number after the "/" is the interrupt
|
scheduler or by irq. This number is even if the CPU is in
|
||||||
nesting depth when in dyntick-idle state, or one greater than
|
dyntick idle mode and odd otherwise. The number after the first
|
||||||
the interrupt-nesting depth otherwise.
|
"/" is the interrupt nesting depth when in dyntick-idle state,
|
||||||
|
or one greater than the interrupt-nesting depth otherwise.
|
||||||
This field is displayed only for CONFIG_NO_HZ kernels.
|
The number after the second "/" is the NMI nesting depth.
|
||||||
|
|
||||||
o "dn" is the current value of the dyntick counter that is incremented
|
|
||||||
when entering or leaving dynticks idle state via NMI. If both
|
|
||||||
the "dt" and "dn" values are even, then this CPU is in dynticks
|
|
||||||
idle mode and may be ignored by RCU. If either of these two
|
|
||||||
counters is odd, then RCU must be alert to the possibility of
|
|
||||||
an RCU read-side critical section running on this CPU.
|
|
||||||
|
|
||||||
This field is displayed only for CONFIG_NO_HZ kernels.
|
This field is displayed only for CONFIG_NO_HZ kernels.
|
||||||
|
|
||||||
|
|
|
@ -177,6 +177,8 @@ static int get_family_id(int sd)
|
||||||
rc = send_cmd(sd, GENL_ID_CTRL, getpid(), CTRL_CMD_GETFAMILY,
|
rc = send_cmd(sd, GENL_ID_CTRL, getpid(), CTRL_CMD_GETFAMILY,
|
||||||
CTRL_ATTR_FAMILY_NAME, (void *)name,
|
CTRL_ATTR_FAMILY_NAME, (void *)name,
|
||||||
strlen(TASKSTATS_GENL_NAME)+1);
|
strlen(TASKSTATS_GENL_NAME)+1);
|
||||||
|
if (rc < 0)
|
||||||
|
return 0; /* sendto() failure? */
|
||||||
|
|
||||||
rep_len = recv(sd, &ans, sizeof(ans), 0);
|
rep_len = recv(sd, &ans, sizeof(ans), 0);
|
||||||
if (ans.n.nlmsg_type == NLMSG_ERROR ||
|
if (ans.n.nlmsg_type == NLMSG_ERROR ||
|
||||||
|
@ -191,30 +193,37 @@ static int get_family_id(int sd)
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define average_ms(t, c) (t / 1000000ULL / (c ? c : 1))
|
||||||
|
|
||||||
static void print_delayacct(struct taskstats *t)
|
static void print_delayacct(struct taskstats *t)
|
||||||
{
|
{
|
||||||
printf("\n\nCPU %15s%15s%15s%15s\n"
|
printf("\n\nCPU %15s%15s%15s%15s%15s\n"
|
||||||
" %15llu%15llu%15llu%15llu\n"
|
" %15llu%15llu%15llu%15llu%15.3fms\n"
|
||||||
"IO %15s%15s\n"
|
"IO %15s%15s%15s\n"
|
||||||
" %15llu%15llu\n"
|
" %15llu%15llu%15llums\n"
|
||||||
"SWAP %15s%15s\n"
|
"SWAP %15s%15s%15s\n"
|
||||||
" %15llu%15llu\n"
|
" %15llu%15llu%15llums\n"
|
||||||
"RECLAIM %12s%15s\n"
|
"RECLAIM %12s%15s%15s\n"
|
||||||
" %15llu%15llu\n",
|
" %15llu%15llu%15llums\n",
|
||||||
"count", "real total", "virtual total", "delay total",
|
"count", "real total", "virtual total",
|
||||||
|
"delay total", "delay average",
|
||||||
(unsigned long long)t->cpu_count,
|
(unsigned long long)t->cpu_count,
|
||||||
(unsigned long long)t->cpu_run_real_total,
|
(unsigned long long)t->cpu_run_real_total,
|
||||||
(unsigned long long)t->cpu_run_virtual_total,
|
(unsigned long long)t->cpu_run_virtual_total,
|
||||||
(unsigned long long)t->cpu_delay_total,
|
(unsigned long long)t->cpu_delay_total,
|
||||||
"count", "delay total",
|
average_ms((double)t->cpu_delay_total, t->cpu_count),
|
||||||
|
"count", "delay total", "delay average",
|
||||||
(unsigned long long)t->blkio_count,
|
(unsigned long long)t->blkio_count,
|
||||||
(unsigned long long)t->blkio_delay_total,
|
(unsigned long long)t->blkio_delay_total,
|
||||||
"count", "delay total",
|
average_ms(t->blkio_delay_total, t->blkio_count),
|
||||||
|
"count", "delay total", "delay average",
|
||||||
(unsigned long long)t->swapin_count,
|
(unsigned long long)t->swapin_count,
|
||||||
(unsigned long long)t->swapin_delay_total,
|
(unsigned long long)t->swapin_delay_total,
|
||||||
"count", "delay total",
|
average_ms(t->swapin_delay_total, t->swapin_count),
|
||||||
|
"count", "delay total", "delay average",
|
||||||
(unsigned long long)t->freepages_count,
|
(unsigned long long)t->freepages_count,
|
||||||
(unsigned long long)t->freepages_delay_total);
|
(unsigned long long)t->freepages_delay_total,
|
||||||
|
average_ms(t->freepages_delay_total, t->freepages_count));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void task_context_switch_counts(struct taskstats *t)
|
static void task_context_switch_counts(struct taskstats *t)
|
||||||
|
@ -433,8 +442,6 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
int i;
|
|
||||||
|
|
||||||
rep_len = recv(nl_sd, &msg, sizeof(msg), 0);
|
rep_len = recv(nl_sd, &msg, sizeof(msg), 0);
|
||||||
PRINTF("received %d bytes\n", rep_len);
|
PRINTF("received %d bytes\n", rep_len);
|
||||||
|
|
||||||
|
@ -459,7 +466,6 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
na = (struct nlattr *) GENLMSG_DATA(&msg);
|
na = (struct nlattr *) GENLMSG_DATA(&msg);
|
||||||
len = 0;
|
len = 0;
|
||||||
i = 0;
|
|
||||||
while (len < rep_len) {
|
while (len < rep_len) {
|
||||||
len += NLA_ALIGN(na->nla_len);
|
len += NLA_ALIGN(na->nla_len);
|
||||||
switch (na->nla_type) {
|
switch (na->nla_type) {
|
||||||
|
|
|
@ -66,3 +66,8 @@ Note: We can use a kernel with multiple custom ACPI method running,
|
||||||
But each individual write to debugfs can implement a SINGLE
|
But each individual write to debugfs can implement a SINGLE
|
||||||
method override. i.e. if we want to insert/override multiple
|
method override. i.e. if we want to insert/override multiple
|
||||||
ACPI methods, we need to redo step c) ~ g) for multiple times.
|
ACPI methods, we need to redo step c) ~ g) for multiple times.
|
||||||
|
|
||||||
|
Note: Be aware that root can mis-use this driver to modify arbitrary
|
||||||
|
memory and gain additional rights, if root's privileges got
|
||||||
|
restricted (for example if root is not allowed to load additional
|
||||||
|
modules after boot).
|
||||||
|
|
|
@ -65,13 +65,19 @@ looks at the connected hardware is beyond the scope of this document.
|
||||||
The boot loader must ultimately be able to provide a MACH_TYPE_xxx
|
The boot loader must ultimately be able to provide a MACH_TYPE_xxx
|
||||||
value to the kernel. (see linux/arch/arm/tools/mach-types).
|
value to the kernel. (see linux/arch/arm/tools/mach-types).
|
||||||
|
|
||||||
|
4. Setup boot data
|
||||||
4. Setup the kernel tagged list
|
------------------
|
||||||
-------------------------------
|
|
||||||
|
|
||||||
Existing boot loaders: OPTIONAL, HIGHLY RECOMMENDED
|
Existing boot loaders: OPTIONAL, HIGHLY RECOMMENDED
|
||||||
New boot loaders: MANDATORY
|
New boot loaders: MANDATORY
|
||||||
|
|
||||||
|
The boot loader must provide either a tagged list or a dtb image for
|
||||||
|
passing configuration data to the kernel. The physical address of the
|
||||||
|
boot data is passed to the kernel in register r2.
|
||||||
|
|
||||||
|
4a. Setup the kernel tagged list
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
The boot loader must create and initialise the kernel tagged list.
|
The boot loader must create and initialise the kernel tagged list.
|
||||||
A valid tagged list starts with ATAG_CORE and ends with ATAG_NONE.
|
A valid tagged list starts with ATAG_CORE and ends with ATAG_NONE.
|
||||||
The ATAG_CORE tag may or may not be empty. An empty ATAG_CORE tag
|
The ATAG_CORE tag may or may not be empty. An empty ATAG_CORE tag
|
||||||
|
@ -101,6 +107,24 @@ The tagged list must be placed in a region of memory where neither
|
||||||
the kernel decompressor nor initrd 'bootp' program will overwrite
|
the kernel decompressor nor initrd 'bootp' program will overwrite
|
||||||
it. The recommended placement is in the first 16KiB of RAM.
|
it. The recommended placement is in the first 16KiB of RAM.
|
||||||
|
|
||||||
|
4b. Setup the device tree
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
The boot loader must load a device tree image (dtb) into system ram
|
||||||
|
at a 64bit aligned address and initialize it with the boot data. The
|
||||||
|
dtb format is documented in Documentation/devicetree/booting-without-of.txt.
|
||||||
|
The kernel will look for the dtb magic value of 0xd00dfeed at the dtb
|
||||||
|
physical address to determine if a dtb has been passed instead of a
|
||||||
|
tagged list.
|
||||||
|
|
||||||
|
The boot loader must pass at a minimum the size and location of the
|
||||||
|
system memory, and the root filesystem location. The dtb must be
|
||||||
|
placed in a region of memory where the kernel decompressor will not
|
||||||
|
overwrite it. The recommended placement is in the first 16KiB of RAM
|
||||||
|
with the caveat that it may not be located at physical address 0 since
|
||||||
|
the kernel interprets a value of 0 in r2 to mean neither a tagged list
|
||||||
|
nor a dtb were passed.
|
||||||
|
|
||||||
5. Calling the kernel image
|
5. Calling the kernel image
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
|
@ -125,7 +149,8 @@ In either case, the following conditions must be met:
|
||||||
- CPU register settings
|
- CPU register settings
|
||||||
r0 = 0,
|
r0 = 0,
|
||||||
r1 = machine type number discovered in (3) above.
|
r1 = machine type number discovered in (3) above.
|
||||||
r2 = physical address of tagged list in system RAM.
|
r2 = physical address of tagged list in system RAM, or
|
||||||
|
physical address of device tree block (dtb) in system RAM
|
||||||
|
|
||||||
- CPU mode
|
- CPU mode
|
||||||
All forms of interrupts must be disabled (IRQs and FIQs)
|
All forms of interrupts must be disabled (IRQs and FIQs)
|
||||||
|
|
|
@ -14,7 +14,6 @@ Introduction
|
||||||
- S3C24XX: See Documentation/arm/Samsung-S3C24XX/Overview.txt for full list
|
- S3C24XX: See Documentation/arm/Samsung-S3C24XX/Overview.txt for full list
|
||||||
- S3C64XX: S3C6400 and S3C6410
|
- S3C64XX: S3C6400 and S3C6410
|
||||||
- S5P6440
|
- S5P6440
|
||||||
- S5P6442
|
|
||||||
- S5PC100
|
- S5PC100
|
||||||
- S5PC110 / S5PV210
|
- S5PC110 / S5PV210
|
||||||
|
|
||||||
|
@ -36,7 +35,6 @@ Configuration
|
||||||
unifying all the SoCs into one kernel.
|
unifying all the SoCs into one kernel.
|
||||||
|
|
||||||
s5p6440_defconfig - S5P6440 specific default configuration
|
s5p6440_defconfig - S5P6440 specific default configuration
|
||||||
s5p6442_defconfig - S5P6442 specific default configuration
|
|
||||||
s5pc100_defconfig - S5PC100 specific default configuration
|
s5pc100_defconfig - S5PC100 specific default configuration
|
||||||
s5pc110_defconfig - S5PC110 specific default configuration
|
s5pc110_defconfig - S5PC110 specific default configuration
|
||||||
s5pv210_defconfig - S5PV210 specific default configuration
|
s5pv210_defconfig - S5PV210 specific default configuration
|
||||||
|
|
|
@ -12,7 +12,7 @@ Also, it should be made opaque such that any kind of cast to a normal
|
||||||
C integer type will fail. Something like the following should
|
C integer type will fail. Something like the following should
|
||||||
suffice:
|
suffice:
|
||||||
|
|
||||||
typedef struct { volatile int counter; } atomic_t;
|
typedef struct { int counter; } atomic_t;
|
||||||
|
|
||||||
Historically, counter has been declared volatile. This is now discouraged.
|
Historically, counter has been declared volatile. This is now discouraged.
|
||||||
See Documentation/volatile-considered-harmful.txt for the complete rationale.
|
See Documentation/volatile-considered-harmful.txt for the complete rationale.
|
||||||
|
|
|
@ -236,7 +236,8 @@ containing the following files describing that cgroup:
|
||||||
- cgroup.procs: list of tgids in the cgroup. This list is not
|
- cgroup.procs: list of tgids in the cgroup. This list is not
|
||||||
guaranteed to be sorted or free of duplicate tgids, and userspace
|
guaranteed to be sorted or free of duplicate tgids, and userspace
|
||||||
should sort/uniquify the list if this property is required.
|
should sort/uniquify the list if this property is required.
|
||||||
This is a read-only file, for now.
|
Writing a thread group id into this file moves all threads in that
|
||||||
|
group into this cgroup.
|
||||||
- notify_on_release flag: run the release agent on exit?
|
- notify_on_release flag: run the release agent on exit?
|
||||||
- release_agent: the path to use for release notifications (this file
|
- release_agent: the path to use for release notifications (this file
|
||||||
exists in the top cgroup only)
|
exists in the top cgroup only)
|
||||||
|
@ -430,6 +431,12 @@ You can attach the current shell task by echoing 0:
|
||||||
|
|
||||||
# echo 0 > tasks
|
# echo 0 > tasks
|
||||||
|
|
||||||
|
You can use the cgroup.procs file instead of the tasks file to move all
|
||||||
|
threads in a threadgroup at once. Echoing the pid of any task in a
|
||||||
|
threadgroup to cgroup.procs causes all tasks in that threadgroup to be
|
||||||
|
be attached to the cgroup. Writing 0 to cgroup.procs moves all tasks
|
||||||
|
in the writing task's threadgroup.
|
||||||
|
|
||||||
Note: Since every task is always a member of exactly one cgroup in each
|
Note: Since every task is always a member of exactly one cgroup in each
|
||||||
mounted hierarchy, to remove a task from its current cgroup you must
|
mounted hierarchy, to remove a task from its current cgroup you must
|
||||||
move it into a new cgroup (possibly the root cgroup) by writing to the
|
move it into a new cgroup (possibly the root cgroup) by writing to the
|
||||||
|
@ -575,7 +582,7 @@ rmdir() will fail with it. From this behavior, pre_destroy() can be
|
||||||
called multiple times against a cgroup.
|
called multiple times against a cgroup.
|
||||||
|
|
||||||
int can_attach(struct cgroup_subsys *ss, struct cgroup *cgrp,
|
int can_attach(struct cgroup_subsys *ss, struct cgroup *cgrp,
|
||||||
struct task_struct *task, bool threadgroup)
|
struct task_struct *task)
|
||||||
(cgroup_mutex held by caller)
|
(cgroup_mutex held by caller)
|
||||||
|
|
||||||
Called prior to moving a task into a cgroup; if the subsystem
|
Called prior to moving a task into a cgroup; if the subsystem
|
||||||
|
@ -584,9 +591,14 @@ task is passed, then a successful result indicates that *any*
|
||||||
unspecified task can be moved into the cgroup. Note that this isn't
|
unspecified task can be moved into the cgroup. Note that this isn't
|
||||||
called on a fork. If this method returns 0 (success) then this should
|
called on a fork. If this method returns 0 (success) then this should
|
||||||
remain valid while the caller holds cgroup_mutex and it is ensured that either
|
remain valid while the caller holds cgroup_mutex and it is ensured that either
|
||||||
attach() or cancel_attach() will be called in future. If threadgroup is
|
attach() or cancel_attach() will be called in future.
|
||||||
true, then a successful result indicates that all threads in the given
|
|
||||||
thread's threadgroup can be moved together.
|
int can_attach_task(struct cgroup *cgrp, struct task_struct *tsk);
|
||||||
|
(cgroup_mutex held by caller)
|
||||||
|
|
||||||
|
As can_attach, but for operations that must be run once per task to be
|
||||||
|
attached (possibly many when using cgroup_attach_proc). Called after
|
||||||
|
can_attach.
|
||||||
|
|
||||||
void cancel_attach(struct cgroup_subsys *ss, struct cgroup *cgrp,
|
void cancel_attach(struct cgroup_subsys *ss, struct cgroup *cgrp,
|
||||||
struct task_struct *task, bool threadgroup)
|
struct task_struct *task, bool threadgroup)
|
||||||
|
@ -598,15 +610,24 @@ function, so that the subsystem can implement a rollback. If not, not necessary.
|
||||||
This will be called only about subsystems whose can_attach() operation have
|
This will be called only about subsystems whose can_attach() operation have
|
||||||
succeeded.
|
succeeded.
|
||||||
|
|
||||||
|
void pre_attach(struct cgroup *cgrp);
|
||||||
|
(cgroup_mutex held by caller)
|
||||||
|
|
||||||
|
For any non-per-thread attachment work that needs to happen before
|
||||||
|
attach_task. Needed by cpuset.
|
||||||
|
|
||||||
void attach(struct cgroup_subsys *ss, struct cgroup *cgrp,
|
void attach(struct cgroup_subsys *ss, struct cgroup *cgrp,
|
||||||
struct cgroup *old_cgrp, struct task_struct *task,
|
struct cgroup *old_cgrp, struct task_struct *task)
|
||||||
bool threadgroup)
|
|
||||||
(cgroup_mutex held by caller)
|
(cgroup_mutex held by caller)
|
||||||
|
|
||||||
Called after the task has been attached to the cgroup, to allow any
|
Called after the task has been attached to the cgroup, to allow any
|
||||||
post-attachment activity that requires memory allocations or blocking.
|
post-attachment activity that requires memory allocations or blocking.
|
||||||
If threadgroup is true, the subsystem should take care of all threads
|
|
||||||
in the specified thread's threadgroup. Currently does not support any
|
void attach_task(struct cgroup *cgrp, struct task_struct *tsk);
|
||||||
|
(cgroup_mutex held by caller)
|
||||||
|
|
||||||
|
As attach, but for operations that must be run once per task to be attached,
|
||||||
|
like can_attach_task. Called before attach. Currently does not support any
|
||||||
subsystem that might need the old_cgrp for every thread in the group.
|
subsystem that might need the old_cgrp for every thread in the group.
|
||||||
|
|
||||||
void fork(struct cgroup_subsy *ss, struct task_struct *task)
|
void fork(struct cgroup_subsy *ss, struct task_struct *task)
|
||||||
|
@ -630,7 +651,7 @@ always handled well.
|
||||||
void post_clone(struct cgroup_subsys *ss, struct cgroup *cgrp)
|
void post_clone(struct cgroup_subsys *ss, struct cgroup *cgrp)
|
||||||
(cgroup_mutex held by caller)
|
(cgroup_mutex held by caller)
|
||||||
|
|
||||||
Called at the end of cgroup_clone() to do any parameter
|
Called during cgroup_create() to do any parameter
|
||||||
initialization which might be required before a task could attach. For
|
initialization which might be required before a task could attach. For
|
||||||
example in cpusets, no task may attach before 'cpus' and 'mems' are set
|
example in cpusets, no task may attach before 'cpus' and 'mems' are set
|
||||||
up.
|
up.
|
||||||
|
|
|
@ -12,8 +12,9 @@ Table of Contents
|
||||||
=================
|
=================
|
||||||
|
|
||||||
I - Introduction
|
I - Introduction
|
||||||
1) Entry point for arch/powerpc
|
1) Entry point for arch/arm
|
||||||
2) Entry point for arch/x86
|
2) Entry point for arch/powerpc
|
||||||
|
3) Entry point for arch/x86
|
||||||
|
|
||||||
II - The DT block format
|
II - The DT block format
|
||||||
1) Header
|
1) Header
|
||||||
|
@ -148,7 +149,46 @@ upgrades without significantly impacting the kernel code or cluttering
|
||||||
it with special cases.
|
it with special cases.
|
||||||
|
|
||||||
|
|
||||||
1) Entry point for arch/powerpc
|
1) Entry point for arch/arm
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
There is one single entry point to the kernel, at the start
|
||||||
|
of the kernel image. That entry point supports two calling
|
||||||
|
conventions. A summary of the interface is described here. A full
|
||||||
|
description of the boot requirements is documented in
|
||||||
|
Documentation/arm/Booting
|
||||||
|
|
||||||
|
a) ATAGS interface. Minimal information is passed from firmware
|
||||||
|
to the kernel with a tagged list of predefined parameters.
|
||||||
|
|
||||||
|
r0 : 0
|
||||||
|
|
||||||
|
r1 : Machine type number
|
||||||
|
|
||||||
|
r2 : Physical address of tagged list in system RAM
|
||||||
|
|
||||||
|
b) Entry with a flattened device-tree block. Firmware loads the
|
||||||
|
physical address of the flattened device tree block (dtb) into r2,
|
||||||
|
r1 is not used, but it is considered good practise to use a valid
|
||||||
|
machine number as described in Documentation/arm/Booting.
|
||||||
|
|
||||||
|
r0 : 0
|
||||||
|
|
||||||
|
r1 : Valid machine type number. When using a device tree,
|
||||||
|
a single machine type number will often be assigned to
|
||||||
|
represent a class or family of SoCs.
|
||||||
|
|
||||||
|
r2 : physical pointer to the device-tree block
|
||||||
|
(defined in chapter II) in RAM. Device tree can be located
|
||||||
|
anywhere in system RAM, but it should be aligned on a 64 bit
|
||||||
|
boundary.
|
||||||
|
|
||||||
|
The kernel will differentiate between ATAGS and device tree booting by
|
||||||
|
reading the memory pointed to by r2 and looking for either the flattened
|
||||||
|
device tree block magic value (0xd00dfeed) or the ATAG_CORE value at
|
||||||
|
offset 0x4 from r2 (0x54410001).
|
||||||
|
|
||||||
|
2) Entry point for arch/powerpc
|
||||||
-------------------------------
|
-------------------------------
|
||||||
|
|
||||||
There is one single entry point to the kernel, at the start
|
There is one single entry point to the kernel, at the start
|
||||||
|
@ -226,7 +266,7 @@ it with special cases.
|
||||||
cannot support both configurations with Book E and configurations
|
cannot support both configurations with Book E and configurations
|
||||||
with classic Powerpc architectures.
|
with classic Powerpc architectures.
|
||||||
|
|
||||||
2) Entry point for arch/x86
|
3) Entry point for arch/x86
|
||||||
-------------------------------
|
-------------------------------
|
||||||
|
|
||||||
There is one single 32bit entry point to the kernel at code32_start,
|
There is one single 32bit entry point to the kernel at code32_start,
|
||||||
|
|
|
@ -1 +1,96 @@
|
||||||
See Documentation/crypto/async-tx-api.txt
|
DMA Engine API Guide
|
||||||
|
====================
|
||||||
|
|
||||||
|
Vinod Koul <vinod dot koul at intel.com>
|
||||||
|
|
||||||
|
NOTE: For DMA Engine usage in async_tx please see:
|
||||||
|
Documentation/crypto/async-tx-api.txt
|
||||||
|
|
||||||
|
|
||||||
|
Below is a guide to device driver writers on how to use the Slave-DMA API of the
|
||||||
|
DMA Engine. This is applicable only for slave DMA usage only.
|
||||||
|
|
||||||
|
The slave DMA usage consists of following steps
|
||||||
|
1. Allocate a DMA slave channel
|
||||||
|
2. Set slave and controller specific parameters
|
||||||
|
3. Get a descriptor for transaction
|
||||||
|
4. Submit the transaction and wait for callback notification
|
||||||
|
|
||||||
|
1. Allocate a DMA slave channel
|
||||||
|
Channel allocation is slightly different in the slave DMA context, client
|
||||||
|
drivers typically need a channel from a particular DMA controller only and even
|
||||||
|
in some cases a specific channel is desired. To request a channel
|
||||||
|
dma_request_channel() API is used.
|
||||||
|
|
||||||
|
Interface:
|
||||||
|
struct dma_chan *dma_request_channel(dma_cap_mask_t mask,
|
||||||
|
dma_filter_fn filter_fn,
|
||||||
|
void *filter_param);
|
||||||
|
where dma_filter_fn is defined as:
|
||||||
|
typedef bool (*dma_filter_fn)(struct dma_chan *chan, void *filter_param);
|
||||||
|
|
||||||
|
When the optional 'filter_fn' parameter is set to NULL dma_request_channel
|
||||||
|
simply returns the first channel that satisfies the capability mask. Otherwise,
|
||||||
|
when the mask parameter is insufficient for specifying the necessary channel,
|
||||||
|
the filter_fn routine can be used to disposition the available channels in the
|
||||||
|
system. The filter_fn routine is called once for each free channel in the
|
||||||
|
system. Upon seeing a suitable channel filter_fn returns DMA_ACK which flags
|
||||||
|
that channel to be the return value from dma_request_channel. A channel
|
||||||
|
allocated via this interface is exclusive to the caller, until
|
||||||
|
dma_release_channel() is called.
|
||||||
|
|
||||||
|
2. Set slave and controller specific parameters
|
||||||
|
Next step is always to pass some specific information to the DMA driver. Most of
|
||||||
|
the generic information which a slave DMA can use is in struct dma_slave_config.
|
||||||
|
It allows the clients to specify DMA direction, DMA addresses, bus widths, DMA
|
||||||
|
burst lengths etc. If some DMA controllers have more parameters to be sent then
|
||||||
|
they should try to embed struct dma_slave_config in their controller specific
|
||||||
|
structure. That gives flexibility to client to pass more parameters, if
|
||||||
|
required.
|
||||||
|
|
||||||
|
Interface:
|
||||||
|
int dmaengine_slave_config(struct dma_chan *chan,
|
||||||
|
struct dma_slave_config *config)
|
||||||
|
|
||||||
|
3. Get a descriptor for transaction
|
||||||
|
For slave usage the various modes of slave transfers supported by the
|
||||||
|
DMA-engine are:
|
||||||
|
slave_sg - DMA a list of scatter gather buffers from/to a peripheral
|
||||||
|
dma_cyclic - Perform a cyclic DMA operation from/to a peripheral till the
|
||||||
|
operation is explicitly stopped.
|
||||||
|
The non NULL return of this transfer API represents a "descriptor" for the given
|
||||||
|
transaction.
|
||||||
|
|
||||||
|
Interface:
|
||||||
|
struct dma_async_tx_descriptor *(*chan->device->device_prep_dma_sg)(
|
||||||
|
struct dma_chan *chan,
|
||||||
|
struct scatterlist *dst_sg, unsigned int dst_nents,
|
||||||
|
struct scatterlist *src_sg, unsigned int src_nents,
|
||||||
|
unsigned long flags);
|
||||||
|
struct dma_async_tx_descriptor *(*chan->device->device_prep_dma_cyclic)(
|
||||||
|
struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len,
|
||||||
|
size_t period_len, enum dma_data_direction direction);
|
||||||
|
|
||||||
|
4. Submit the transaction and wait for callback notification
|
||||||
|
To schedule the transaction to be scheduled by dma device, the "descriptor"
|
||||||
|
returned in above (3) needs to be submitted.
|
||||||
|
To tell the dma driver that a transaction is ready to be serviced, the
|
||||||
|
descriptor->submit() callback needs to be invoked. This chains the descriptor to
|
||||||
|
the pending queue.
|
||||||
|
The transactions in the pending queue can be activated by calling the
|
||||||
|
issue_pending API. If channel is idle then the first transaction in queue is
|
||||||
|
started and subsequent ones queued up.
|
||||||
|
On completion of the DMA operation the next in queue is submitted and a tasklet
|
||||||
|
triggered. The tasklet would then call the client driver completion callback
|
||||||
|
routine for notification, if set.
|
||||||
|
Interface:
|
||||||
|
void dma_async_issue_pending(struct dma_chan *chan);
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
|
||||||
|
Additional usage notes for dma driver writers
|
||||||
|
1/ Although DMA engine specifies that completion callback routines cannot submit
|
||||||
|
any new operations, but typically for slave DMA subsequent transaction may not
|
||||||
|
be available for submit prior to callback routine being called. This requirement
|
||||||
|
is not a requirement for DMA-slave devices. But they should take care to drop
|
||||||
|
the spin-lock they might be holding before calling the callback routine
|
||||||
|
|
|
@ -6,6 +6,42 @@ be removed from this file.
|
||||||
|
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
|
What: x86 floppy disable_hlt
|
||||||
|
When: 2012
|
||||||
|
Why: ancient workaround of dubious utility clutters the
|
||||||
|
code used by everybody else.
|
||||||
|
Who: Len Brown <len.brown@intel.com>
|
||||||
|
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
What: CONFIG_APM_CPU_IDLE, and its ability to call APM BIOS in idle
|
||||||
|
When: 2012
|
||||||
|
Why: This optional sub-feature of APM is of dubious reliability,
|
||||||
|
and ancient APM laptops are likely better served by calling HLT.
|
||||||
|
Deleting CONFIG_APM_CPU_IDLE allows x86 to stop exporting
|
||||||
|
the pm_idle function pointer to modules.
|
||||||
|
Who: Len Brown <len.brown@intel.com>
|
||||||
|
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
What: x86_32 "no-hlt" cmdline param
|
||||||
|
When: 2012
|
||||||
|
Why: remove a branch from idle path, simplify code used by everybody.
|
||||||
|
This option disabled the use of HLT in idle and machine_halt()
|
||||||
|
for hardware that was flakey 15-years ago. Today we have
|
||||||
|
"idle=poll" that removed HLT from idle, and so if such a machine
|
||||||
|
is still running the upstream kernel, "idle=poll" is likely sufficient.
|
||||||
|
Who: Len Brown <len.brown@intel.com>
|
||||||
|
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
What: x86 "idle=mwait" cmdline param
|
||||||
|
When: 2012
|
||||||
|
Why: simplify x86 idle code
|
||||||
|
Who: Len Brown <len.brown@intel.com>
|
||||||
|
|
||||||
|
----------------------------
|
||||||
|
|
||||||
What: PRISM54
|
What: PRISM54
|
||||||
When: 2.6.34
|
When: 2.6.34
|
||||||
|
|
||||||
|
@ -262,16 +298,6 @@ Who: Michael Buesch <mb@bu3sch.de>
|
||||||
|
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
What: /sys/o2cb symlink
|
|
||||||
When: January 2010
|
|
||||||
Why: /sys/fs/o2cb is the proper location for this information - /sys/o2cb
|
|
||||||
exists as a symlink for backwards compatibility for old versions of
|
|
||||||
ocfs2-tools. 2 years should be sufficient time to phase in new versions
|
|
||||||
which know to look in /sys/fs/o2cb.
|
|
||||||
Who: ocfs2-devel@oss.oracle.com
|
|
||||||
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
What: Ability for non root users to shm_get hugetlb pages based on mlock
|
What: Ability for non root users to shm_get hugetlb pages based on mlock
|
||||||
resource limits
|
resource limits
|
||||||
When: 2.6.31
|
When: 2.6.31
|
||||||
|
|
|
@ -104,7 +104,7 @@ of the locking scheme for directory operations.
|
||||||
prototypes:
|
prototypes:
|
||||||
struct inode *(*alloc_inode)(struct super_block *sb);
|
struct inode *(*alloc_inode)(struct super_block *sb);
|
||||||
void (*destroy_inode)(struct inode *);
|
void (*destroy_inode)(struct inode *);
|
||||||
void (*dirty_inode) (struct inode *);
|
void (*dirty_inode) (struct inode *, int flags);
|
||||||
int (*write_inode) (struct inode *, struct writeback_control *wbc);
|
int (*write_inode) (struct inode *, struct writeback_control *wbc);
|
||||||
int (*drop_inode) (struct inode *);
|
int (*drop_inode) (struct inode *);
|
||||||
void (*evict_inode) (struct inode *);
|
void (*evict_inode) (struct inode *);
|
||||||
|
@ -126,7 +126,7 @@ locking rules:
|
||||||
s_umount
|
s_umount
|
||||||
alloc_inode:
|
alloc_inode:
|
||||||
destroy_inode:
|
destroy_inode:
|
||||||
dirty_inode: (must not sleep)
|
dirty_inode:
|
||||||
write_inode:
|
write_inode:
|
||||||
drop_inode: !!!inode->i_lock!!!
|
drop_inode: !!!inode->i_lock!!!
|
||||||
evict_inode:
|
evict_inode:
|
||||||
|
|
|
@ -464,9 +464,8 @@ static int __init configfs_example_init(void)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out_unregister:
|
out_unregister:
|
||||||
for (; i >= 0; i--) {
|
for (i--; i >= 0; i--)
|
||||||
configfs_unregister_subsystem(example_subsys[i]);
|
configfs_unregister_subsystem(example_subsys[i]);
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -475,9 +474,8 @@ static void __exit configfs_example_exit(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; example_subsys[i]; i++) {
|
for (i = 0; example_subsys[i]; i++)
|
||||||
configfs_unregister_subsystem(example_subsys[i]);
|
configfs_unregister_subsystem(example_subsys[i]);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module_init(configfs_example_init);
|
module_init(configfs_example_init);
|
||||||
|
|
|
@ -427,9 +427,8 @@ static int __init configfs_example_init(void)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out_unregister:
|
out_unregister:
|
||||||
for (; i >= 0; i--) {
|
for (i--; i >= 0; i--)
|
||||||
configfs_unregister_subsystem(example_subsys[i]);
|
configfs_unregister_subsystem(example_subsys[i]);
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -438,9 +437,8 @@ static void __exit configfs_example_exit(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; example_subsys[i]; i++) {
|
for (i = 0; example_subsys[i]; i++)
|
||||||
configfs_unregister_subsystem(example_subsys[i]);
|
configfs_unregister_subsystem(example_subsys[i]);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module_init(configfs_example_init);
|
module_init(configfs_example_init);
|
||||||
|
|
|
@ -226,10 +226,6 @@ acl Enables POSIX Access Control Lists support.
|
||||||
noacl This option disables POSIX Access Control List
|
noacl This option disables POSIX Access Control List
|
||||||
support.
|
support.
|
||||||
|
|
||||||
reservation
|
|
||||||
|
|
||||||
noreservation
|
|
||||||
|
|
||||||
bsddf (*) Make 'df' act like BSD.
|
bsddf (*) Make 'df' act like BSD.
|
||||||
minixdf Make 'df' act like Minix.
|
minixdf Make 'df' act like Minix.
|
||||||
|
|
||||||
|
|
|
@ -47,8 +47,8 @@ request-key will find the first matching line and corresponding program. In
|
||||||
this case, /some/other/program will handle all uid lookups and
|
this case, /some/other/program will handle all uid lookups and
|
||||||
/usr/sbin/nfs.idmap will handle gid, user, and group lookups.
|
/usr/sbin/nfs.idmap will handle gid, user, and group lookups.
|
||||||
|
|
||||||
See <file:Documentation/keys-request-keys.txt> for more information about the
|
See <file:Documentation/security/keys-request-keys.txt> for more information
|
||||||
request-key function.
|
about the request-key function.
|
||||||
|
|
||||||
|
|
||||||
=========
|
=========
|
||||||
|
|
|
@ -46,9 +46,15 @@ errors=panic Panic and halt the machine if an error occurs.
|
||||||
intr (*) Allow signals to interrupt cluster operations.
|
intr (*) Allow signals to interrupt cluster operations.
|
||||||
nointr Do not allow signals to interrupt cluster
|
nointr Do not allow signals to interrupt cluster
|
||||||
operations.
|
operations.
|
||||||
|
noatime Do not update access time.
|
||||||
|
relatime(*) Update atime if the previous atime is older than
|
||||||
|
mtime or ctime
|
||||||
|
strictatime Always update atime, but the minimum update interval
|
||||||
|
is specified by atime_quantum.
|
||||||
atime_quantum=60(*) OCFS2 will not update atime unless this number
|
atime_quantum=60(*) OCFS2 will not update atime unless this number
|
||||||
of seconds has passed since the last update.
|
of seconds has passed since the last update.
|
||||||
Set to zero to always update atime.
|
Set to zero to always update atime. This option need
|
||||||
|
work with strictatime.
|
||||||
data=ordered (*) All data are forced directly out to the main file
|
data=ordered (*) All data are forced directly out to the main file
|
||||||
system prior to its metadata being committed to the
|
system prior to its metadata being committed to the
|
||||||
journal.
|
journal.
|
||||||
|
|
|
@ -211,7 +211,7 @@ struct super_operations {
|
||||||
struct inode *(*alloc_inode)(struct super_block *sb);
|
struct inode *(*alloc_inode)(struct super_block *sb);
|
||||||
void (*destroy_inode)(struct inode *);
|
void (*destroy_inode)(struct inode *);
|
||||||
|
|
||||||
void (*dirty_inode) (struct inode *);
|
void (*dirty_inode) (struct inode *, int flags);
|
||||||
int (*write_inode) (struct inode *, int);
|
int (*write_inode) (struct inode *, int);
|
||||||
void (*drop_inode) (struct inode *);
|
void (*drop_inode) (struct inode *);
|
||||||
void (*delete_inode) (struct inode *);
|
void (*delete_inode) (struct inode *);
|
||||||
|
|
|
@ -39,6 +39,12 @@ When mounting an XFS filesystem, the following options are accepted.
|
||||||
drive level write caching to be enabled, for devices that
|
drive level write caching to be enabled, for devices that
|
||||||
support write barriers.
|
support write barriers.
|
||||||
|
|
||||||
|
discard
|
||||||
|
Issue command to let the block device reclaim space freed by the
|
||||||
|
filesystem. This is useful for SSD devices, thinly provisioned
|
||||||
|
LUNs and virtual machine images, but may have a performance
|
||||||
|
impact. This option is incompatible with the nodelaylog option.
|
||||||
|
|
||||||
dmapi
|
dmapi
|
||||||
Enable the DMAPI (Data Management API) event callouts.
|
Enable the DMAPI (Data Management API) event callouts.
|
||||||
Use with the "mtpt" option.
|
Use with the "mtpt" option.
|
||||||
|
|
|
@ -1,184 +0,0 @@
|
||||||
Acer Laptop WMI Extras Driver
|
|
||||||
http://code.google.com/p/aceracpi
|
|
||||||
Version 0.3
|
|
||||||
4th April 2009
|
|
||||||
|
|
||||||
Copyright 2007-2009 Carlos Corbacho <carlos@strangeworlds.co.uk>
|
|
||||||
|
|
||||||
acer-wmi is a driver to allow you to control various parts of your Acer laptop
|
|
||||||
hardware under Linux which are exposed via ACPI-WMI.
|
|
||||||
|
|
||||||
This driver completely replaces the old out-of-tree acer_acpi, which I am
|
|
||||||
currently maintaining for bug fixes only on pre-2.6.25 kernels. All development
|
|
||||||
work is now focused solely on acer-wmi.
|
|
||||||
|
|
||||||
Disclaimer
|
|
||||||
**********
|
|
||||||
|
|
||||||
Acer and Wistron have provided nothing towards the development acer_acpi or
|
|
||||||
acer-wmi. All information we have has been through the efforts of the developers
|
|
||||||
and the users to discover as much as possible about the hardware.
|
|
||||||
|
|
||||||
As such, I do warn that this could break your hardware - this is extremely
|
|
||||||
unlikely of course, but please bear this in mind.
|
|
||||||
|
|
||||||
Background
|
|
||||||
**********
|
|
||||||
|
|
||||||
acer-wmi is derived from acer_acpi, originally developed by Mark
|
|
||||||
Smith in 2005, then taken over by Carlos Corbacho in 2007, in order to activate
|
|
||||||
the wireless LAN card under a 64-bit version of Linux, as acerhk[1] (the
|
|
||||||
previous solution to the problem) relied on making 32 bit BIOS calls which are
|
|
||||||
not possible in kernel space from a 64 bit OS.
|
|
||||||
|
|
||||||
[1] acerhk: http://www.cakey.de/acerhk/
|
|
||||||
|
|
||||||
Supported Hardware
|
|
||||||
******************
|
|
||||||
|
|
||||||
NOTE: The Acer Aspire One is not supported hardware. It cannot work with
|
|
||||||
acer-wmi until Acer fix their ACPI-WMI implementation on them, so has been
|
|
||||||
blacklisted until that happens.
|
|
||||||
|
|
||||||
Please see the website for the current list of known working hardware:
|
|
||||||
|
|
||||||
http://code.google.com/p/aceracpi/wiki/SupportedHardware
|
|
||||||
|
|
||||||
If your laptop is not listed, or listed as unknown, and works with acer-wmi,
|
|
||||||
please contact me with a copy of the DSDT.
|
|
||||||
|
|
||||||
If your Acer laptop doesn't work with acer-wmi, I would also like to see the
|
|
||||||
DSDT.
|
|
||||||
|
|
||||||
To send me the DSDT, as root/sudo:
|
|
||||||
|
|
||||||
cat /sys/firmware/acpi/tables/DSDT > dsdt
|
|
||||||
|
|
||||||
And send me the resulting 'dsdt' file.
|
|
||||||
|
|
||||||
Usage
|
|
||||||
*****
|
|
||||||
|
|
||||||
On Acer laptops, acer-wmi should already be autoloaded based on DMI matching.
|
|
||||||
For non-Acer laptops, until WMI based autoloading support is added, you will
|
|
||||||
need to manually load acer-wmi.
|
|
||||||
|
|
||||||
acer-wmi creates /sys/devices/platform/acer-wmi, and fills it with various
|
|
||||||
files whose usage is detailed below, which enables you to control some of the
|
|
||||||
following (varies between models):
|
|
||||||
|
|
||||||
* the wireless LAN card radio
|
|
||||||
* inbuilt Bluetooth adapter
|
|
||||||
* inbuilt 3G card
|
|
||||||
* mail LED of your laptop
|
|
||||||
* brightness of the LCD panel
|
|
||||||
|
|
||||||
Wireless
|
|
||||||
********
|
|
||||||
|
|
||||||
With regards to wireless, all acer-wmi does is enable the radio on the card. It
|
|
||||||
is not responsible for the wireless LED - once the radio is enabled, this is
|
|
||||||
down to the wireless driver for your card. So the behaviour of the wireless LED,
|
|
||||||
once you enable the radio, will depend on your hardware and driver combination.
|
|
||||||
|
|
||||||
e.g. With the BCM4318 on the Acer Aspire 5020 series:
|
|
||||||
|
|
||||||
ndiswrapper: Light blinks on when transmitting
|
|
||||||
b43: Solid light, blinks off when transmitting
|
|
||||||
|
|
||||||
Wireless radio control is unconditionally enabled - all Acer laptops that support
|
|
||||||
acer-wmi come with built-in wireless. However, should you feel so inclined to
|
|
||||||
ever wish to remove the card, or swap it out at some point, please get in touch
|
|
||||||
with me, as we may well be able to gain some data on wireless card detection.
|
|
||||||
|
|
||||||
The wireless radio is exposed through rfkill.
|
|
||||||
|
|
||||||
Bluetooth
|
|
||||||
*********
|
|
||||||
|
|
||||||
For bluetooth, this is an internal USB dongle, so once enabled, you will get
|
|
||||||
a USB device connection event, and a new USB device appears. When you disable
|
|
||||||
bluetooth, you get the reverse - a USB device disconnect event, followed by the
|
|
||||||
device disappearing again.
|
|
||||||
|
|
||||||
Bluetooth is autodetected by acer-wmi, so if you do not have a bluetooth module
|
|
||||||
installed in your laptop, this file won't exist (please be aware that it is
|
|
||||||
quite common for Acer not to fit bluetooth to their laptops - so just because
|
|
||||||
you have a bluetooth button on the laptop, doesn't mean that bluetooth is
|
|
||||||
installed).
|
|
||||||
|
|
||||||
For the adventurously minded - if you want to buy an internal bluetooth
|
|
||||||
module off the internet that is compatible with your laptop and fit it, then
|
|
||||||
it will work just fine with acer-wmi.
|
|
||||||
|
|
||||||
Bluetooth is exposed through rfkill.
|
|
||||||
|
|
||||||
3G
|
|
||||||
**
|
|
||||||
|
|
||||||
3G is currently not autodetected, so the 'threeg' file is always created under
|
|
||||||
sysfs. So far, no-one in possession of an Acer laptop with 3G built-in appears to
|
|
||||||
have tried Linux, or reported back, so we don't have any information on this.
|
|
||||||
|
|
||||||
If you have an Acer laptop that does have a 3G card in, please contact me so we
|
|
||||||
can properly detect these, and find out a bit more about them.
|
|
||||||
|
|
||||||
To read the status of the 3G card (0=off, 1=on):
|
|
||||||
cat /sys/devices/platform/acer-wmi/threeg
|
|
||||||
|
|
||||||
To enable the 3G card:
|
|
||||||
echo 1 > /sys/devices/platform/acer-wmi/threeg
|
|
||||||
|
|
||||||
To disable the 3G card:
|
|
||||||
echo 0 > /sys/devices/platform/acer-wmi/threeg
|
|
||||||
|
|
||||||
To set the state of the 3G card when loading acer-wmi, pass:
|
|
||||||
threeg=X (where X is 0 or 1)
|
|
||||||
|
|
||||||
Mail LED
|
|
||||||
********
|
|
||||||
|
|
||||||
This can be found in most older Acer laptops supported by acer-wmi, and many
|
|
||||||
newer ones - it is built into the 'mail' button, and blinks when active.
|
|
||||||
|
|
||||||
On newer (WMID) laptops though, we have no way of detecting the mail LED. If
|
|
||||||
your laptop identifies itself in dmesg as a WMID model, then please try loading
|
|
||||||
acer_acpi with:
|
|
||||||
|
|
||||||
force_series=2490
|
|
||||||
|
|
||||||
This will use a known alternative method of reading/ writing the mail LED. If
|
|
||||||
it works, please report back to me with the DMI data from your laptop so this
|
|
||||||
can be added to acer-wmi.
|
|
||||||
|
|
||||||
The LED is exposed through the LED subsystem, and can be found in:
|
|
||||||
|
|
||||||
/sys/devices/platform/acer-wmi/leds/acer-wmi::mail/
|
|
||||||
|
|
||||||
The mail LED is autodetected, so if you don't have one, the LED device won't
|
|
||||||
be registered.
|
|
||||||
|
|
||||||
Backlight
|
|
||||||
*********
|
|
||||||
|
|
||||||
The backlight brightness control is available on all acer-wmi supported
|
|
||||||
hardware. The maximum brightness level is usually 15, but on some newer laptops
|
|
||||||
it's 10 (this is again autodetected).
|
|
||||||
|
|
||||||
The backlight is exposed through the backlight subsystem, and can be found in:
|
|
||||||
|
|
||||||
/sys/devices/platform/acer-wmi/backlight/acer-wmi/
|
|
||||||
|
|
||||||
Credits
|
|
||||||
*******
|
|
||||||
|
|
||||||
Olaf Tauber, who did the real hard work when he developed acerhk
|
|
||||||
http://www.cakey.de/acerhk/
|
|
||||||
All the authors of laptop ACPI modules in the kernel, whose work
|
|
||||||
was an inspiration in the early days of acer_acpi
|
|
||||||
Mathieu Segaud, who solved the problem with having to modprobe the driver
|
|
||||||
twice in acer_acpi 0.2.
|
|
||||||
Jim Ramsay, who added support for the WMID interface
|
|
||||||
Mark Smith, who started the original acer_acpi
|
|
||||||
|
|
||||||
And the many people who have used both acer_acpi and acer-wmi.
|
|
|
@ -12,8 +12,9 @@ Because things like lock contention can severely impact performance.
|
||||||
- HOW
|
- HOW
|
||||||
|
|
||||||
Lockdep already has hooks in the lock functions and maps lock instances to
|
Lockdep already has hooks in the lock functions and maps lock instances to
|
||||||
lock classes. We build on that. The graph below shows the relation between
|
lock classes. We build on that (see Documentation/lockdep-design.txt).
|
||||||
the lock functions and the various hooks therein.
|
The graph below shows the relation between the lock functions and the various
|
||||||
|
hooks therein.
|
||||||
|
|
||||||
__acquire
|
__acquire
|
||||||
|
|
|
|
||||||
|
@ -128,6 +129,37 @@ points are the points we're contending with.
|
||||||
|
|
||||||
The integer part of the time values is in us.
|
The integer part of the time values is in us.
|
||||||
|
|
||||||
|
Dealing with nested locks, subclasses may appear:
|
||||||
|
|
||||||
|
32...............................................................................................................................................................................................
|
||||||
|
33
|
||||||
|
34 &rq->lock: 13128 13128 0.43 190.53 103881.26 97454 3453404 0.00 401.11 13224683.11
|
||||||
|
35 ---------
|
||||||
|
36 &rq->lock 645 [<ffffffff8103bfc4>] task_rq_lock+0x43/0x75
|
||||||
|
37 &rq->lock 297 [<ffffffff8104ba65>] try_to_wake_up+0x127/0x25a
|
||||||
|
38 &rq->lock 360 [<ffffffff8103c4c5>] select_task_rq_fair+0x1f0/0x74a
|
||||||
|
39 &rq->lock 428 [<ffffffff81045f98>] scheduler_tick+0x46/0x1fb
|
||||||
|
40 ---------
|
||||||
|
41 &rq->lock 77 [<ffffffff8103bfc4>] task_rq_lock+0x43/0x75
|
||||||
|
42 &rq->lock 174 [<ffffffff8104ba65>] try_to_wake_up+0x127/0x25a
|
||||||
|
43 &rq->lock 4715 [<ffffffff8103ed4b>] double_rq_lock+0x42/0x54
|
||||||
|
44 &rq->lock 893 [<ffffffff81340524>] schedule+0x157/0x7b8
|
||||||
|
45
|
||||||
|
46...............................................................................................................................................................................................
|
||||||
|
47
|
||||||
|
48 &rq->lock/1: 11526 11488 0.33 388.73 136294.31 21461 38404 0.00 37.93 109388.53
|
||||||
|
49 -----------
|
||||||
|
50 &rq->lock/1 11526 [<ffffffff8103ed58>] double_rq_lock+0x4f/0x54
|
||||||
|
51 -----------
|
||||||
|
52 &rq->lock/1 5645 [<ffffffff8103ed4b>] double_rq_lock+0x42/0x54
|
||||||
|
53 &rq->lock/1 1224 [<ffffffff81340524>] schedule+0x157/0x7b8
|
||||||
|
54 &rq->lock/1 4336 [<ffffffff8103ed58>] double_rq_lock+0x4f/0x54
|
||||||
|
55 &rq->lock/1 181 [<ffffffff8104ba65>] try_to_wake_up+0x127/0x25a
|
||||||
|
|
||||||
|
Line 48 shows statistics for the second subclass (/1) of &rq->lock class
|
||||||
|
(subclass starts from 0), since in this case, as line 50 suggests,
|
||||||
|
double_rq_lock actually acquires a nested lock of two spinlocks.
|
||||||
|
|
||||||
View the top contending locks:
|
View the top contending locks:
|
||||||
|
|
||||||
# grep : /proc/lock_stat | head
|
# grep : /proc/lock_stat | head
|
||||||
|
|
|
@ -139,8 +139,8 @@ the key will be discarded and recreated when the data it holds has expired.
|
||||||
dns_query() returns a copy of the value attached to the key, or an error if
|
dns_query() returns a copy of the value attached to the key, or an error if
|
||||||
that is indicated instead.
|
that is indicated instead.
|
||||||
|
|
||||||
See <file:Documentation/keys-request-key.txt> for further information about
|
See <file:Documentation/security/keys-request-key.txt> for further
|
||||||
request-key function.
|
information about request-key function.
|
||||||
|
|
||||||
|
|
||||||
=========
|
=========
|
||||||
|
|
|
@ -53,11 +53,11 @@ static struct regulator_init_data regulator1_data = {
|
||||||
|
|
||||||
Regulator-1 supplies power to Regulator-2. This relationship must be registered
|
Regulator-1 supplies power to Regulator-2. This relationship must be registered
|
||||||
with the core so that Regulator-1 is also enabled when Consumer A enables its
|
with the core so that Regulator-1 is also enabled when Consumer A enables its
|
||||||
supply (Regulator-2). The supply regulator is set by the supply_regulator_dev
|
supply (Regulator-2). The supply regulator is set by the supply_regulator
|
||||||
field below:-
|
field below:-
|
||||||
|
|
||||||
static struct regulator_init_data regulator2_data = {
|
static struct regulator_init_data regulator2_data = {
|
||||||
.supply_regulator_dev = &platform_regulator1_device.dev,
|
.supply_regulator = "regulator_name",
|
||||||
.constraints = {
|
.constraints = {
|
||||||
.min_uV = 1800000,
|
.min_uV = 1800000,
|
||||||
.max_uV = 2000000,
|
.max_uV = 2000000,
|
||||||
|
|
|
@ -1,3 +1,17 @@
|
||||||
|
Release Date : Wed. May 11, 2011 17:00:00 PST 2010 -
|
||||||
|
(emaild-id:megaraidlinux@lsi.com)
|
||||||
|
Adam Radford
|
||||||
|
Current Version : 00.00.05.38-rc1
|
||||||
|
Old Version : 00.00.05.34-rc1
|
||||||
|
1. Remove MSI-X black list, use MFI_REG_STATE.ready.msiEnable.
|
||||||
|
2. Remove un-used function megasas_return_cmd_for_smid().
|
||||||
|
3. Check MFI_REG_STATE.fault.resetAdapter in megasas_reset_fusion().
|
||||||
|
4. Disable interrupts/free_irq() in megasas_shutdown().
|
||||||
|
5. Fix bug where AENs could be lost in probe() and resume().
|
||||||
|
6. Convert 6,10,12 byte CDB's to 16 byte CDB for large LBA's for FastPath
|
||||||
|
IO.
|
||||||
|
7. Add 1078 OCR support.
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
Release Date : Thu. Feb 24, 2011 17:00:00 PST 2010 -
|
Release Date : Thu. Feb 24, 2011 17:00:00 PST 2010 -
|
||||||
(emaild-id:megaraidlinux@lsi.com)
|
(emaild-id:megaraidlinux@lsi.com)
|
||||||
Adam Radford
|
Adam Radford
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
00-INDEX
|
||||||
|
- this file.
|
||||||
|
SELinux.txt
|
||||||
|
- how to get started with the SELinux security enhancement.
|
||||||
|
Smack.txt
|
||||||
|
- documentation on the Smack Linux Security Module.
|
||||||
|
apparmor.txt
|
||||||
|
- documentation on the AppArmor security extension.
|
||||||
|
credentials.txt
|
||||||
|
- documentation about credentials in Linux.
|
||||||
|
keys-request-key.txt
|
||||||
|
- description of the kernel key request service.
|
||||||
|
keys-trusted-encrypted.txt
|
||||||
|
- info on the Trusted and Encrypted keys in the kernel key ring service.
|
||||||
|
keys.txt
|
||||||
|
- description of the kernel key retention service.
|
||||||
|
tomoyo.txt
|
||||||
|
- documentation on the TOMOYO Linux Security Module.
|
|
@ -216,7 +216,7 @@ The Linux kernel supports the following types of credentials:
|
||||||
When a process accesses a key, if not already present, it will normally be
|
When a process accesses a key, if not already present, it will normally be
|
||||||
cached on one of these keyrings for future accesses to find.
|
cached on one of these keyrings for future accesses to find.
|
||||||
|
|
||||||
For more information on using keys, see Documentation/keys.txt.
|
For more information on using keys, see Documentation/security/keys.txt.
|
||||||
|
|
||||||
(5) LSM
|
(5) LSM
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
===================
|
===================
|
||||||
|
|
||||||
The key request service is part of the key retention service (refer to
|
The key request service is part of the key retention service (refer to
|
||||||
Documentation/keys.txt). This document explains more fully how the requesting
|
Documentation/security/keys.txt). This document explains more fully how
|
||||||
algorithm works.
|
the requesting algorithm works.
|
||||||
|
|
||||||
The process starts by either the kernel requesting a service by calling
|
The process starts by either the kernel requesting a service by calling
|
||||||
request_key*():
|
request_key*():
|
|
@ -434,7 +434,7 @@ The main syscalls are:
|
||||||
/sbin/request-key will be invoked in an attempt to obtain a key. The
|
/sbin/request-key will be invoked in an attempt to obtain a key. The
|
||||||
callout_info string will be passed as an argument to the program.
|
callout_info string will be passed as an argument to the program.
|
||||||
|
|
||||||
See also Documentation/keys-request-key.txt.
|
See also Documentation/security/keys-request-key.txt.
|
||||||
|
|
||||||
|
|
||||||
The keyctl syscall functions are:
|
The keyctl syscall functions are:
|
||||||
|
@ -864,7 +864,7 @@ payload contents" for more information.
|
||||||
If successful, the key will have been attached to the default keyring for
|
If successful, the key will have been attached to the default keyring for
|
||||||
implicitly obtained request-key keys, as set by KEYCTL_SET_REQKEY_KEYRING.
|
implicitly obtained request-key keys, as set by KEYCTL_SET_REQKEY_KEYRING.
|
||||||
|
|
||||||
See also Documentation/keys-request-key.txt.
|
See also Documentation/security/keys-request-key.txt.
|
||||||
|
|
||||||
|
|
||||||
(*) To search for a key, passing auxiliary data to the upcaller, call:
|
(*) To search for a key, passing auxiliary data to the upcaller, call:
|
|
@ -161,7 +161,8 @@ core_pattern is used to specify a core dumpfile pattern name.
|
||||||
%s signal number
|
%s signal number
|
||||||
%t UNIX time of dump
|
%t UNIX time of dump
|
||||||
%h hostname
|
%h hostname
|
||||||
%e executable filename
|
%e executable filename (may be shortened)
|
||||||
|
%E executable path
|
||||||
%<OTHER> both are dropped
|
%<OTHER> both are dropped
|
||||||
. If the first character of the pattern is a '|', the kernel will treat
|
. If the first character of the pattern is a '|', the kernel will treat
|
||||||
the rest of the pattern as a command to run. The core dump will be
|
the rest of the pattern as a command to run. The core dump will be
|
||||||
|
|
|
@ -0,0 +1,278 @@
|
||||||
|
MOTIVATION
|
||||||
|
|
||||||
|
Cleancache is a new optional feature provided by the VFS layer that
|
||||||
|
potentially dramatically increases page cache effectiveness for
|
||||||
|
many workloads in many environments at a negligible cost.
|
||||||
|
|
||||||
|
Cleancache can be thought of as a page-granularity victim cache for clean
|
||||||
|
pages that the kernel's pageframe replacement algorithm (PFRA) would like
|
||||||
|
to keep around, but can't since there isn't enough memory. So when the
|
||||||
|
PFRA "evicts" a page, it first attempts to use cleancache code to
|
||||||
|
put the data contained in that page into "transcendent memory", memory
|
||||||
|
that is not directly accessible or addressable by the kernel and is
|
||||||
|
of unknown and possibly time-varying size.
|
||||||
|
|
||||||
|
Later, when a cleancache-enabled filesystem wishes to access a page
|
||||||
|
in a file on disk, it first checks cleancache to see if it already
|
||||||
|
contains it; if it does, the page of data is copied into the kernel
|
||||||
|
and a disk access is avoided.
|
||||||
|
|
||||||
|
Transcendent memory "drivers" for cleancache are currently implemented
|
||||||
|
in Xen (using hypervisor memory) and zcache (using in-kernel compressed
|
||||||
|
memory) and other implementations are in development.
|
||||||
|
|
||||||
|
FAQs are included below.
|
||||||
|
|
||||||
|
IMPLEMENTATION OVERVIEW
|
||||||
|
|
||||||
|
A cleancache "backend" that provides transcendent memory registers itself
|
||||||
|
to the kernel's cleancache "frontend" by calling cleancache_register_ops,
|
||||||
|
passing a pointer to a cleancache_ops structure with funcs set appropriately.
|
||||||
|
Note that cleancache_register_ops returns the previous settings so that
|
||||||
|
chaining can be performed if desired. The functions provided must conform to
|
||||||
|
certain semantics as follows:
|
||||||
|
|
||||||
|
Most important, cleancache is "ephemeral". Pages which are copied into
|
||||||
|
cleancache have an indefinite lifetime which is completely unknowable
|
||||||
|
by the kernel and so may or may not still be in cleancache at any later time.
|
||||||
|
Thus, as its name implies, cleancache is not suitable for dirty pages.
|
||||||
|
Cleancache has complete discretion over what pages to preserve and what
|
||||||
|
pages to discard and when.
|
||||||
|
|
||||||
|
Mounting a cleancache-enabled filesystem should call "init_fs" to obtain a
|
||||||
|
pool id which, if positive, must be saved in the filesystem's superblock;
|
||||||
|
a negative return value indicates failure. A "put_page" will copy a
|
||||||
|
(presumably about-to-be-evicted) page into cleancache and associate it with
|
||||||
|
the pool id, a file key, and a page index into the file. (The combination
|
||||||
|
of a pool id, a file key, and an index is sometimes called a "handle".)
|
||||||
|
A "get_page" will copy the page, if found, from cleancache into kernel memory.
|
||||||
|
A "flush_page" will ensure the page no longer is present in cleancache;
|
||||||
|
a "flush_inode" will flush all pages associated with the specified file;
|
||||||
|
and, when a filesystem is unmounted, a "flush_fs" will flush all pages in
|
||||||
|
all files specified by the given pool id and also surrender the pool id.
|
||||||
|
|
||||||
|
An "init_shared_fs", like init_fs, obtains a pool id but tells cleancache
|
||||||
|
to treat the pool as shared using a 128-bit UUID as a key. On systems
|
||||||
|
that may run multiple kernels (such as hard partitioned or virtualized
|
||||||
|
systems) that may share a clustered filesystem, and where cleancache
|
||||||
|
may be shared among those kernels, calls to init_shared_fs that specify the
|
||||||
|
same UUID will receive the same pool id, thus allowing the pages to
|
||||||
|
be shared. Note that any security requirements must be imposed outside
|
||||||
|
of the kernel (e.g. by "tools" that control cleancache). Or a
|
||||||
|
cleancache implementation can simply disable shared_init by always
|
||||||
|
returning a negative value.
|
||||||
|
|
||||||
|
If a get_page is successful on a non-shared pool, the page is flushed (thus
|
||||||
|
making cleancache an "exclusive" cache). On a shared pool, the page
|
||||||
|
is NOT flushed on a successful get_page so that it remains accessible to
|
||||||
|
other sharers. The kernel is responsible for ensuring coherency between
|
||||||
|
cleancache (shared or not), the page cache, and the filesystem, using
|
||||||
|
cleancache flush operations as required.
|
||||||
|
|
||||||
|
Note that cleancache must enforce put-put-get coherency and get-get
|
||||||
|
coherency. For the former, if two puts are made to the same handle but
|
||||||
|
with different data, say AAA by the first put and BBB by the second, a
|
||||||
|
subsequent get can never return the stale data (AAA). For get-get coherency,
|
||||||
|
if a get for a given handle fails, subsequent gets for that handle will
|
||||||
|
never succeed unless preceded by a successful put with that handle.
|
||||||
|
|
||||||
|
Last, cleancache provides no SMP serialization guarantees; if two
|
||||||
|
different Linux threads are simultaneously putting and flushing a page
|
||||||
|
with the same handle, the results are indeterminate. Callers must
|
||||||
|
lock the page to ensure serial behavior.
|
||||||
|
|
||||||
|
CLEANCACHE PERFORMANCE METRICS
|
||||||
|
|
||||||
|
Cleancache monitoring is done by sysfs files in the
|
||||||
|
/sys/kernel/mm/cleancache directory. The effectiveness of cleancache
|
||||||
|
can be measured (across all filesystems) with:
|
||||||
|
|
||||||
|
succ_gets - number of gets that were successful
|
||||||
|
failed_gets - number of gets that failed
|
||||||
|
puts - number of puts attempted (all "succeed")
|
||||||
|
flushes - number of flushes attempted
|
||||||
|
|
||||||
|
A backend implementatation may provide additional metrics.
|
||||||
|
|
||||||
|
FAQ
|
||||||
|
|
||||||
|
1) Where's the value? (Andrew Morton)
|
||||||
|
|
||||||
|
Cleancache provides a significant performance benefit to many workloads
|
||||||
|
in many environments with negligible overhead by improving the
|
||||||
|
effectiveness of the pagecache. Clean pagecache pages are
|
||||||
|
saved in transcendent memory (RAM that is otherwise not directly
|
||||||
|
addressable to the kernel); fetching those pages later avoids "refaults"
|
||||||
|
and thus disk reads.
|
||||||
|
|
||||||
|
Cleancache (and its sister code "frontswap") provide interfaces for
|
||||||
|
this transcendent memory (aka "tmem"), which conceptually lies between
|
||||||
|
fast kernel-directly-addressable RAM and slower DMA/asynchronous devices.
|
||||||
|
Disallowing direct kernel or userland reads/writes to tmem
|
||||||
|
is ideal when data is transformed to a different form and size (such
|
||||||
|
as with compression) or secretly moved (as might be useful for write-
|
||||||
|
balancing for some RAM-like devices). Evicted page-cache pages (and
|
||||||
|
swap pages) are a great use for this kind of slower-than-RAM-but-much-
|
||||||
|
faster-than-disk transcendent memory, and the cleancache (and frontswap)
|
||||||
|
"page-object-oriented" specification provides a nice way to read and
|
||||||
|
write -- and indirectly "name" -- the pages.
|
||||||
|
|
||||||
|
In the virtual case, the whole point of virtualization is to statistically
|
||||||
|
multiplex physical resources across the varying demands of multiple
|
||||||
|
virtual machines. This is really hard to do with RAM and efforts to
|
||||||
|
do it well with no kernel change have essentially failed (except in some
|
||||||
|
well-publicized special-case workloads). Cleancache -- and frontswap --
|
||||||
|
with a fairly small impact on the kernel, provide a huge amount
|
||||||
|
of flexibility for more dynamic, flexible RAM multiplexing.
|
||||||
|
Specifically, the Xen Transcendent Memory backend allows otherwise
|
||||||
|
"fallow" hypervisor-owned RAM to not only be "time-shared" between multiple
|
||||||
|
virtual machines, but the pages can be compressed and deduplicated to
|
||||||
|
optimize RAM utilization. And when guest OS's are induced to surrender
|
||||||
|
underutilized RAM (e.g. with "self-ballooning"), page cache pages
|
||||||
|
are the first to go, and cleancache allows those pages to be
|
||||||
|
saved and reclaimed if overall host system memory conditions allow.
|
||||||
|
|
||||||
|
And the identical interface used for cleancache can be used in
|
||||||
|
physical systems as well. The zcache driver acts as a memory-hungry
|
||||||
|
device that stores pages of data in a compressed state. And
|
||||||
|
the proposed "RAMster" driver shares RAM across multiple physical
|
||||||
|
systems.
|
||||||
|
|
||||||
|
2) Why does cleancache have its sticky fingers so deep inside the
|
||||||
|
filesystems and VFS? (Andrew Morton and Christoph Hellwig)
|
||||||
|
|
||||||
|
The core hooks for cleancache in VFS are in most cases a single line
|
||||||
|
and the minimum set are placed precisely where needed to maintain
|
||||||
|
coherency (via cleancache_flush operations) between cleancache,
|
||||||
|
the page cache, and disk. All hooks compile into nothingness if
|
||||||
|
cleancache is config'ed off and turn into a function-pointer-
|
||||||
|
compare-to-NULL if config'ed on but no backend claims the ops
|
||||||
|
functions, or to a compare-struct-element-to-negative if a
|
||||||
|
backend claims the ops functions but a filesystem doesn't enable
|
||||||
|
cleancache.
|
||||||
|
|
||||||
|
Some filesystems are built entirely on top of VFS and the hooks
|
||||||
|
in VFS are sufficient, so don't require an "init_fs" hook; the
|
||||||
|
initial implementation of cleancache didn't provide this hook.
|
||||||
|
But for some filesystems (such as btrfs), the VFS hooks are
|
||||||
|
incomplete and one or more hooks in fs-specific code are required.
|
||||||
|
And for some other filesystems, such as tmpfs, cleancache may
|
||||||
|
be counterproductive. So it seemed prudent to require a filesystem
|
||||||
|
to "opt in" to use cleancache, which requires adding a hook in
|
||||||
|
each filesystem. Not all filesystems are supported by cleancache
|
||||||
|
only because they haven't been tested. The existing set should
|
||||||
|
be sufficient to validate the concept, the opt-in approach means
|
||||||
|
that untested filesystems are not affected, and the hooks in the
|
||||||
|
existing filesystems should make it very easy to add more
|
||||||
|
filesystems in the future.
|
||||||
|
|
||||||
|
The total impact of the hooks to existing fs and mm files is only
|
||||||
|
about 40 lines added (not counting comments and blank lines).
|
||||||
|
|
||||||
|
3) Why not make cleancache asynchronous and batched so it can
|
||||||
|
more easily interface with real devices with DMA instead
|
||||||
|
of copying each individual page? (Minchan Kim)
|
||||||
|
|
||||||
|
The one-page-at-a-time copy semantics simplifies the implementation
|
||||||
|
on both the frontend and backend and also allows the backend to
|
||||||
|
do fancy things on-the-fly like page compression and
|
||||||
|
page deduplication. And since the data is "gone" (copied into/out
|
||||||
|
of the pageframe) before the cleancache get/put call returns,
|
||||||
|
a great deal of race conditions and potential coherency issues
|
||||||
|
are avoided. While the interface seems odd for a "real device"
|
||||||
|
or for real kernel-addressable RAM, it makes perfect sense for
|
||||||
|
transcendent memory.
|
||||||
|
|
||||||
|
4) Why is non-shared cleancache "exclusive"? And where is the
|
||||||
|
page "flushed" after a "get"? (Minchan Kim)
|
||||||
|
|
||||||
|
The main reason is to free up space in transcendent memory and
|
||||||
|
to avoid unnecessary cleancache_flush calls. If you want inclusive,
|
||||||
|
the page can be "put" immediately following the "get". If
|
||||||
|
put-after-get for inclusive becomes common, the interface could
|
||||||
|
be easily extended to add a "get_no_flush" call.
|
||||||
|
|
||||||
|
The flush is done by the cleancache backend implementation.
|
||||||
|
|
||||||
|
5) What's the performance impact?
|
||||||
|
|
||||||
|
Performance analysis has been presented at OLS'09 and LCA'10.
|
||||||
|
Briefly, performance gains can be significant on most workloads,
|
||||||
|
especially when memory pressure is high (e.g. when RAM is
|
||||||
|
overcommitted in a virtual workload); and because the hooks are
|
||||||
|
invoked primarily in place of or in addition to a disk read/write,
|
||||||
|
overhead is negligible even in worst case workloads. Basically
|
||||||
|
cleancache replaces I/O with memory-copy-CPU-overhead; on older
|
||||||
|
single-core systems with slow memory-copy speeds, cleancache
|
||||||
|
has little value, but in newer multicore machines, especially
|
||||||
|
consolidated/virtualized machines, it has great value.
|
||||||
|
|
||||||
|
6) How do I add cleancache support for filesystem X? (Boaz Harrash)
|
||||||
|
|
||||||
|
Filesystems that are well-behaved and conform to certain
|
||||||
|
restrictions can utilize cleancache simply by making a call to
|
||||||
|
cleancache_init_fs at mount time. Unusual, misbehaving, or
|
||||||
|
poorly layered filesystems must either add additional hooks
|
||||||
|
and/or undergo extensive additional testing... or should just
|
||||||
|
not enable the optional cleancache.
|
||||||
|
|
||||||
|
Some points for a filesystem to consider:
|
||||||
|
|
||||||
|
- The FS should be block-device-based (e.g. a ram-based FS such
|
||||||
|
as tmpfs should not enable cleancache)
|
||||||
|
- To ensure coherency/correctness, the FS must ensure that all
|
||||||
|
file removal or truncation operations either go through VFS or
|
||||||
|
add hooks to do the equivalent cleancache "flush" operations
|
||||||
|
- To ensure coherency/correctness, either inode numbers must
|
||||||
|
be unique across the lifetime of the on-disk file OR the
|
||||||
|
FS must provide an "encode_fh" function.
|
||||||
|
- The FS must call the VFS superblock alloc and deactivate routines
|
||||||
|
or add hooks to do the equivalent cleancache calls done there.
|
||||||
|
- To maximize performance, all pages fetched from the FS should
|
||||||
|
go through the do_mpag_readpage routine or the FS should add
|
||||||
|
hooks to do the equivalent (cf. btrfs)
|
||||||
|
- Currently, the FS blocksize must be the same as PAGESIZE. This
|
||||||
|
is not an architectural restriction, but no backends currently
|
||||||
|
support anything different.
|
||||||
|
- A clustered FS should invoke the "shared_init_fs" cleancache
|
||||||
|
hook to get best performance for some backends.
|
||||||
|
|
||||||
|
7) Why not use the KVA of the inode as the key? (Christoph Hellwig)
|
||||||
|
|
||||||
|
If cleancache would use the inode virtual address instead of
|
||||||
|
inode/filehandle, the pool id could be eliminated. But, this
|
||||||
|
won't work because cleancache retains pagecache data pages
|
||||||
|
persistently even when the inode has been pruned from the
|
||||||
|
inode unused list, and only flushes the data page if the file
|
||||||
|
gets removed/truncated. So if cleancache used the inode kva,
|
||||||
|
there would be potential coherency issues if/when the inode
|
||||||
|
kva is reused for a different file. Alternately, if cleancache
|
||||||
|
flushed the pages when the inode kva was freed, much of the value
|
||||||
|
of cleancache would be lost because the cache of pages in cleanache
|
||||||
|
is potentially much larger than the kernel pagecache and is most
|
||||||
|
useful if the pages survive inode cache removal.
|
||||||
|
|
||||||
|
8) Why is a global variable required?
|
||||||
|
|
||||||
|
The cleancache_enabled flag is checked in all of the frequently-used
|
||||||
|
cleancache hooks. The alternative is a function call to check a static
|
||||||
|
variable. Since cleancache is enabled dynamically at runtime, systems
|
||||||
|
that don't enable cleancache would suffer thousands (possibly
|
||||||
|
tens-of-thousands) of unnecessary function calls per second. So the
|
||||||
|
global variable allows cleancache to be enabled by default at compile
|
||||||
|
time, but have insignificant performance impact when cleancache remains
|
||||||
|
disabled at runtime.
|
||||||
|
|
||||||
|
9) Does cleanache work with KVM?
|
||||||
|
|
||||||
|
The memory model of KVM is sufficiently different that a cleancache
|
||||||
|
backend may have less value for KVM. This remains to be tested,
|
||||||
|
especially in an overcommitted system.
|
||||||
|
|
||||||
|
10) Does cleancache work in userspace? It sounds useful for
|
||||||
|
memory hungry caches like web browsers. (Jamie Lokier)
|
||||||
|
|
||||||
|
No plans yet, though we agree it sounds useful, at least for
|
||||||
|
apps that bypass the page cache (e.g. O_DIRECT).
|
||||||
|
|
||||||
|
Last updated: Dan Magenheimer, April 13 2011
|
66
MAINTAINERS
66
MAINTAINERS
|
@ -223,10 +223,8 @@ S: Maintained
|
||||||
F: drivers/platform/x86/acerhdf.c
|
F: drivers/platform/x86/acerhdf.c
|
||||||
|
|
||||||
ACER WMI LAPTOP EXTRAS
|
ACER WMI LAPTOP EXTRAS
|
||||||
M: Carlos Corbacho <carlos@strangeworlds.co.uk>
|
M: Joey Lee <jlee@novell.com>
|
||||||
L: aceracpi@googlegroups.com (subscribers-only)
|
|
||||||
L: platform-driver-x86@vger.kernel.org
|
L: platform-driver-x86@vger.kernel.org
|
||||||
W: http://code.google.com/p/aceracpi
|
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/platform/x86/acer-wmi.c
|
F: drivers/platform/x86/acer-wmi.c
|
||||||
|
|
||||||
|
@ -271,10 +269,8 @@ S: Supported
|
||||||
F: drivers/acpi/video.c
|
F: drivers/acpi/video.c
|
||||||
|
|
||||||
ACPI WMI DRIVER
|
ACPI WMI DRIVER
|
||||||
M: Carlos Corbacho <carlos@strangeworlds.co.uk>
|
|
||||||
L: platform-driver-x86@vger.kernel.org
|
L: platform-driver-x86@vger.kernel.org
|
||||||
W: http://www.lesswatts.org/projects/acpi/
|
S: Orphan
|
||||||
S: Maintained
|
|
||||||
F: drivers/platform/x86/wmi.c
|
F: drivers/platform/x86/wmi.c
|
||||||
|
|
||||||
AD1889 ALSA SOUND DRIVER
|
AD1889 ALSA SOUND DRIVER
|
||||||
|
@ -931,6 +927,8 @@ F: drivers/mmc/host/msm_sdcc.h
|
||||||
F: drivers/tty/serial/msm_serial.h
|
F: drivers/tty/serial/msm_serial.h
|
||||||
F: drivers/tty/serial/msm_serial.c
|
F: drivers/tty/serial/msm_serial.c
|
||||||
F: drivers/platform/msm/
|
F: drivers/platform/msm/
|
||||||
|
F: drivers/*/pm8???-*
|
||||||
|
F: include/linux/mfd/pm8xxx/
|
||||||
T: git git://codeaurora.org/quic/kernel/davidb/linux-msm.git
|
T: git git://codeaurora.org/quic/kernel/davidb/linux-msm.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
@ -2176,6 +2174,8 @@ M: Dan Williams <dan.j.williams@intel.com>
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/dma/
|
F: drivers/dma/
|
||||||
F: include/linux/dma*
|
F: include/linux/dma*
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/djbw/async_tx.git
|
||||||
|
T: git git://git.infradead.org/users/vkoul/slave-dma.git (slave-dma)
|
||||||
|
|
||||||
DME1737 HARDWARE MONITOR DRIVER
|
DME1737 HARDWARE MONITOR DRIVER
|
||||||
M: Juerg Haefliger <juergh@gmail.com>
|
M: Juerg Haefliger <juergh@gmail.com>
|
||||||
|
@ -2302,7 +2302,7 @@ F: net/bridge/netfilter/ebt*.c
|
||||||
ECRYPT FILE SYSTEM
|
ECRYPT FILE SYSTEM
|
||||||
M: Tyler Hicks <tyhicks@linux.vnet.ibm.com>
|
M: Tyler Hicks <tyhicks@linux.vnet.ibm.com>
|
||||||
M: Dustin Kirkland <kirkland@canonical.com>
|
M: Dustin Kirkland <kirkland@canonical.com>
|
||||||
L: ecryptfs-devel@lists.launchpad.net
|
L: ecryptfs@vger.kernel.org
|
||||||
W: https://launchpad.net/ecryptfs
|
W: https://launchpad.net/ecryptfs
|
||||||
S: Supported
|
S: Supported
|
||||||
F: Documentation/filesystems/ecryptfs.txt
|
F: Documentation/filesystems/ecryptfs.txt
|
||||||
|
@ -2582,6 +2582,13 @@ S: Maintained
|
||||||
F: drivers/hwmon/f75375s.c
|
F: drivers/hwmon/f75375s.c
|
||||||
F: include/linux/f75375s.h
|
F: include/linux/f75375s.h
|
||||||
|
|
||||||
|
FIREWIRE AUDIO DRIVERS
|
||||||
|
M: Clemens Ladisch <clemens@ladisch.de>
|
||||||
|
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||||
|
T: git git://git.alsa-project.org/alsa-kernel.git
|
||||||
|
S: Maintained
|
||||||
|
F: sound/firewire/
|
||||||
|
|
||||||
FIREWIRE SUBSYSTEM
|
FIREWIRE SUBSYSTEM
|
||||||
M: Stefan Richter <stefanr@s5r6.in-berlin.de>
|
M: Stefan Richter <stefanr@s5r6.in-berlin.de>
|
||||||
L: linux1394-devel@lists.sourceforge.net
|
L: linux1394-devel@lists.sourceforge.net
|
||||||
|
@ -3022,9 +3029,8 @@ S: Maintained
|
||||||
F: drivers/net/wireless/hostap/
|
F: drivers/net/wireless/hostap/
|
||||||
|
|
||||||
HP COMPAQ TC1100 TABLET WMI EXTRAS DRIVER
|
HP COMPAQ TC1100 TABLET WMI EXTRAS DRIVER
|
||||||
M: Carlos Corbacho <carlos@strangeworlds.co.uk>
|
|
||||||
L: platform-driver-x86@vger.kernel.org
|
L: platform-driver-x86@vger.kernel.org
|
||||||
S: Odd Fixes
|
S: Orphan
|
||||||
F: drivers/platform/x86/tc1100-wmi.c
|
F: drivers/platform/x86/tc1100-wmi.c
|
||||||
|
|
||||||
HP100: Driver for HP 10/100 Mbit/s Voice Grade Network Adapter Series
|
HP100: Driver for HP 10/100 Mbit/s Voice Grade Network Adapter Series
|
||||||
|
@ -3572,9 +3578,16 @@ M: Andrew Morton <akpm@linux-foundation.org>
|
||||||
M: Jan Kara <jack@suse.cz>
|
M: Jan Kara <jack@suse.cz>
|
||||||
L: linux-ext4@vger.kernel.org
|
L: linux-ext4@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: fs/jbd*/
|
F: fs/jbd/
|
||||||
F: include/linux/ext*jbd*.h
|
F: include/linux/ext3_jbd.h
|
||||||
F: include/linux/jbd*.h
|
F: include/linux/jbd.h
|
||||||
|
|
||||||
|
JOURNALLING LAYER FOR BLOCK DEVICES (JBD2)
|
||||||
|
M: "Theodore Ts'o" <tytso@mit.edu>
|
||||||
|
L: linux-ext4@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
F: fs/jbd2/
|
||||||
|
F: include/linux/jbd2.h
|
||||||
|
|
||||||
JSM Neo PCI based serial card
|
JSM Neo PCI based serial card
|
||||||
M: Breno Leitao <leitao@linux.vnet.ibm.com>
|
M: Breno Leitao <leitao@linux.vnet.ibm.com>
|
||||||
|
@ -3710,7 +3723,7 @@ KEYS/KEYRINGS:
|
||||||
M: David Howells <dhowells@redhat.com>
|
M: David Howells <dhowells@redhat.com>
|
||||||
L: keyrings@linux-nfs.org
|
L: keyrings@linux-nfs.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/keys.txt
|
F: Documentation/security/keys.txt
|
||||||
F: include/linux/key.h
|
F: include/linux/key.h
|
||||||
F: include/linux/key-type.h
|
F: include/linux/key-type.h
|
||||||
F: include/keys/
|
F: include/keys/
|
||||||
|
@ -3722,7 +3735,7 @@ M: Mimi Zohar <zohar@us.ibm.com>
|
||||||
L: linux-security-module@vger.kernel.org
|
L: linux-security-module@vger.kernel.org
|
||||||
L: keyrings@linux-nfs.org
|
L: keyrings@linux-nfs.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: Documentation/keys-trusted-encrypted.txt
|
F: Documentation/security/keys-trusted-encrypted.txt
|
||||||
F: include/keys/trusted-type.h
|
F: include/keys/trusted-type.h
|
||||||
F: security/keys/trusted.c
|
F: security/keys/trusted.c
|
||||||
F: security/keys/trusted.h
|
F: security/keys/trusted.h
|
||||||
|
@ -3733,7 +3746,7 @@ M: David Safford <safford@watson.ibm.com>
|
||||||
L: linux-security-module@vger.kernel.org
|
L: linux-security-module@vger.kernel.org
|
||||||
L: keyrings@linux-nfs.org
|
L: keyrings@linux-nfs.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: Documentation/keys-trusted-encrypted.txt
|
F: Documentation/security/keys-trusted-encrypted.txt
|
||||||
F: include/keys/encrypted-type.h
|
F: include/keys/encrypted-type.h
|
||||||
F: security/keys/encrypted.c
|
F: security/keys/encrypted.c
|
||||||
F: security/keys/encrypted.h
|
F: security/keys/encrypted.h
|
||||||
|
@ -4138,6 +4151,7 @@ M: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
|
||||||
L: linux-mm@kvack.org
|
L: linux-mm@kvack.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: mm/memcontrol.c
|
F: mm/memcontrol.c
|
||||||
|
F: mm/page_cgroup.c
|
||||||
|
|
||||||
MEMORY TECHNOLOGY DEVICES (MTD)
|
MEMORY TECHNOLOGY DEVICES (MTD)
|
||||||
M: David Woodhouse <dwmw2@infradead.org>
|
M: David Woodhouse <dwmw2@infradead.org>
|
||||||
|
@ -5434,6 +5448,13 @@ L: linux-serial@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/tty/serial
|
F: drivers/tty/serial
|
||||||
|
|
||||||
|
SYNOPSYS DESIGNWARE DMAC DRIVER
|
||||||
|
M: Viresh Kumar <viresh.kumar@st.com>
|
||||||
|
S: Maintained
|
||||||
|
F: include/linux/dw_dmac.h
|
||||||
|
F: drivers/dma/dw_dmac_regs.h
|
||||||
|
F: drivers/dma/dw_dmac.c
|
||||||
|
|
||||||
TIMEKEEPING, NTP
|
TIMEKEEPING, NTP
|
||||||
M: John Stultz <johnstul@us.ibm.com>
|
M: John Stultz <johnstul@us.ibm.com>
|
||||||
M: Thomas Gleixner <tglx@linutronix.de>
|
M: Thomas Gleixner <tglx@linutronix.de>
|
||||||
|
@ -5498,7 +5519,7 @@ F: drivers/scsi/sg.c
|
||||||
F: include/scsi/sg.h
|
F: include/scsi/sg.h
|
||||||
|
|
||||||
SCSI SUBSYSTEM
|
SCSI SUBSYSTEM
|
||||||
M: "James E.J. Bottomley" <James.Bottomley@suse.de>
|
M: "James E.J. Bottomley" <JBottomley@parallels.com>
|
||||||
L: linux-scsi@vger.kernel.org
|
L: linux-scsi@vger.kernel.org
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6.git
|
||||||
|
@ -5991,7 +6012,7 @@ F: Documentation/filesystems/spufs.txt
|
||||||
F: arch/powerpc/platforms/cell/spufs/
|
F: arch/powerpc/platforms/cell/spufs/
|
||||||
|
|
||||||
SQUASHFS FILE SYSTEM
|
SQUASHFS FILE SYSTEM
|
||||||
M: Phillip Lougher <phillip@lougher.demon.co.uk>
|
M: Phillip Lougher <phillip@squashfs.org.uk>
|
||||||
L: squashfs-devel@lists.sourceforge.net (subscribers-only)
|
L: squashfs-devel@lists.sourceforge.net (subscribers-only)
|
||||||
W: http://squashfs.org.uk
|
W: http://squashfs.org.uk
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -6067,6 +6088,17 @@ F: Documentation/filesystems/sysv-fs.txt
|
||||||
F: fs/sysv/
|
F: fs/sysv/
|
||||||
F: include/linux/sysv_fs.h
|
F: include/linux/sysv_fs.h
|
||||||
|
|
||||||
|
TARGET SUBSYSTEM
|
||||||
|
M: Nicholas A. Bellinger <nab@linux-iscsi.org>
|
||||||
|
L: linux-scsi@vger.kernel.org
|
||||||
|
L: http://groups.google.com/group/linux-iscsi-target-dev
|
||||||
|
W: http://www.linux-iscsi.org
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/nab/lio-core-2.6.git master
|
||||||
|
S: Supported
|
||||||
|
F: drivers/target/
|
||||||
|
F: include/target/
|
||||||
|
F: Documentation/target/
|
||||||
|
|
||||||
TASKSTATS STATISTICS INTERFACE
|
TASKSTATS STATISTICS INTERFACE
|
||||||
M: Balbir Singh <balbir@linux.vnet.ibm.com>
|
M: Balbir Singh <balbir@linux.vnet.ibm.com>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
10
Makefile
10
Makefile
|
@ -1,8 +1,8 @@
|
||||||
VERSION = 2
|
VERSION = 3
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 0
|
||||||
SUBLEVEL = 39
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION =
|
EXTRAVERSION = -rc1
|
||||||
NAME = Flesh-Eating Bats with Fangs
|
NAME = Sneaky Weasel
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
# To see a list of typical targets execute "make help"
|
# To see a list of typical targets execute "make help"
|
||||||
|
|
|
@ -41,10 +41,6 @@ config ARCH_HAS_ILOG2_U64
|
||||||
bool
|
bool
|
||||||
default n
|
default n
|
||||||
|
|
||||||
config GENERIC_FIND_NEXT_BIT
|
|
||||||
bool
|
|
||||||
default y
|
|
||||||
|
|
||||||
config GENERIC_CALIBRATE_DELAY
|
config GENERIC_CALIBRATE_DELAY
|
||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
|
|
@ -456,10 +456,11 @@
|
||||||
#define __NR_open_by_handle_at 498
|
#define __NR_open_by_handle_at 498
|
||||||
#define __NR_clock_adjtime 499
|
#define __NR_clock_adjtime 499
|
||||||
#define __NR_syncfs 500
|
#define __NR_syncfs 500
|
||||||
|
#define __NR_setns 501
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
#define NR_SYSCALLS 501
|
#define NR_SYSCALLS 502
|
||||||
|
|
||||||
#define __ARCH_WANT_IPC_PARSE_VERSION
|
#define __ARCH_WANT_IPC_PARSE_VERSION
|
||||||
#define __ARCH_WANT_OLD_READDIR
|
#define __ARCH_WANT_OLD_READDIR
|
||||||
|
|
|
@ -519,6 +519,7 @@ sys_call_table:
|
||||||
.quad sys_open_by_handle_at
|
.quad sys_open_by_handle_at
|
||||||
.quad sys_clock_adjtime
|
.quad sys_clock_adjtime
|
||||||
.quad sys_syncfs /* 500 */
|
.quad sys_syncfs /* 500 */
|
||||||
|
.quad sys_setns
|
||||||
|
|
||||||
.size sys_call_table, . - sys_call_table
|
.size sys_call_table, . - sys_call_table
|
||||||
.type sys_call_table, @object
|
.type sys_call_table, @object
|
||||||
|
|
|
@ -294,6 +294,8 @@ config ARCH_AT91
|
||||||
bool "Atmel AT91"
|
bool "Atmel AT91"
|
||||||
select ARCH_REQUIRE_GPIOLIB
|
select ARCH_REQUIRE_GPIOLIB
|
||||||
select HAVE_CLK
|
select HAVE_CLK
|
||||||
|
select CLKDEV_LOOKUP
|
||||||
|
select ARM_PATCH_PHYS_VIRT if MMU
|
||||||
help
|
help
|
||||||
This enables support for systems based on the Atmel AT91RM9200,
|
This enables support for systems based on the Atmel AT91RM9200,
|
||||||
AT91SAM9 and AT91CAP9 processors.
|
AT91SAM9 and AT91CAP9 processors.
|
||||||
|
@ -730,16 +732,6 @@ config ARCH_S5P64X0
|
||||||
Samsung S5P64X0 CPU based systems, such as the Samsung SMDK6440,
|
Samsung S5P64X0 CPU based systems, such as the Samsung SMDK6440,
|
||||||
SMDK6450.
|
SMDK6450.
|
||||||
|
|
||||||
config ARCH_S5P6442
|
|
||||||
bool "Samsung S5P6442"
|
|
||||||
select CPU_V6
|
|
||||||
select GENERIC_GPIO
|
|
||||||
select HAVE_CLK
|
|
||||||
select ARCH_USES_GETTIMEOFFSET
|
|
||||||
select HAVE_S3C2410_WATCHDOG if WATCHDOG
|
|
||||||
help
|
|
||||||
Samsung S5P6442 CPU based systems
|
|
||||||
|
|
||||||
config ARCH_S5PC100
|
config ARCH_S5PC100
|
||||||
bool "Samsung S5PC100"
|
bool "Samsung S5PC100"
|
||||||
select GENERIC_GPIO
|
select GENERIC_GPIO
|
||||||
|
@ -991,8 +983,6 @@ endif
|
||||||
|
|
||||||
source "arch/arm/mach-s5p64x0/Kconfig"
|
source "arch/arm/mach-s5p64x0/Kconfig"
|
||||||
|
|
||||||
source "arch/arm/mach-s5p6442/Kconfig"
|
|
||||||
|
|
||||||
source "arch/arm/mach-s5pc100/Kconfig"
|
source "arch/arm/mach-s5pc100/Kconfig"
|
||||||
|
|
||||||
source "arch/arm/mach-s5pv210/Kconfig"
|
source "arch/arm/mach-s5pv210/Kconfig"
|
||||||
|
@ -1399,7 +1389,6 @@ config NR_CPUS
|
||||||
config HOTPLUG_CPU
|
config HOTPLUG_CPU
|
||||||
bool "Support for hot-pluggable CPUs (EXPERIMENTAL)"
|
bool "Support for hot-pluggable CPUs (EXPERIMENTAL)"
|
||||||
depends on SMP && HOTPLUG && EXPERIMENTAL
|
depends on SMP && HOTPLUG && EXPERIMENTAL
|
||||||
depends on !ARCH_MSM
|
|
||||||
help
|
help
|
||||||
Say Y here to experiment with turning CPUs off and on. CPUs
|
Say Y here to experiment with turning CPUs off and on. CPUs
|
||||||
can be controlled through /sys/devices/system/cpu.
|
can be controlled through /sys/devices/system/cpu.
|
||||||
|
@ -1420,7 +1409,7 @@ source kernel/Kconfig.preempt
|
||||||
config HZ
|
config HZ
|
||||||
int
|
int
|
||||||
default 200 if ARCH_EBSA110 || ARCH_S3C2410 || ARCH_S5P64X0 || \
|
default 200 if ARCH_EBSA110 || ARCH_S3C2410 || ARCH_S5P64X0 || \
|
||||||
ARCH_S5P6442 || ARCH_S5PV210 || ARCH_EXYNOS4
|
ARCH_S5PV210 || ARCH_EXYNOS4
|
||||||
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
|
||||||
|
@ -1516,6 +1505,9 @@ config ARCH_SPARSEMEM_DEFAULT
|
||||||
config ARCH_SELECT_MEMORY_MODEL
|
config ARCH_SELECT_MEMORY_MODEL
|
||||||
def_bool ARCH_SPARSEMEM_ENABLE
|
def_bool ARCH_SPARSEMEM_ENABLE
|
||||||
|
|
||||||
|
config HAVE_ARCH_PFN_VALID
|
||||||
|
def_bool ARCH_HAS_HOLES_MEMORYMODEL || !SPARSEMEM
|
||||||
|
|
||||||
config HIGHMEM
|
config HIGHMEM
|
||||||
bool "High Memory Support"
|
bool "High Memory Support"
|
||||||
depends on MMU
|
depends on MMU
|
||||||
|
@ -1683,6 +1675,13 @@ endmenu
|
||||||
|
|
||||||
menu "Boot options"
|
menu "Boot options"
|
||||||
|
|
||||||
|
config USE_OF
|
||||||
|
bool "Flattened Device Tree support"
|
||||||
|
select OF
|
||||||
|
select OF_EARLY_FLATTREE
|
||||||
|
help
|
||||||
|
Include support for flattened device tree machine descriptions.
|
||||||
|
|
||||||
# Compressed boot loader in ROM. Yes, we really want to ask about
|
# Compressed boot loader in ROM. Yes, we really want to ask about
|
||||||
# TEXT and BSS so we preserve their values in the config files.
|
# TEXT and BSS so we preserve their values in the config files.
|
||||||
config ZBOOT_ROM_TEXT
|
config ZBOOT_ROM_TEXT
|
||||||
|
@ -2021,7 +2020,7 @@ menu "Power management options"
|
||||||
source "kernel/power/Kconfig"
|
source "kernel/power/Kconfig"
|
||||||
|
|
||||||
config ARCH_SUSPEND_POSSIBLE
|
config ARCH_SUSPEND_POSSIBLE
|
||||||
depends on !ARCH_S5P64X0 && !ARCH_S5P6442 && !ARCH_S5PC100
|
depends on !ARCH_S5P64X0 && !ARCH_S5PC100
|
||||||
depends on CPU_ARM920T || CPU_ARM926T || CPU_SA1100 || \
|
depends on CPU_ARM920T || CPU_ARM926T || CPU_SA1100 || \
|
||||||
CPU_V6 || CPU_V6K || CPU_V7 || CPU_XSC3 || CPU_XSCALE
|
CPU_V6 || CPU_V6K || CPU_V7 || CPU_XSC3 || CPU_XSCALE
|
||||||
def_bool y
|
def_bool y
|
||||||
|
|
|
@ -176,7 +176,6 @@ machine-$(CONFIG_ARCH_S3C2410) := s3c2410 s3c2400 s3c2412 s3c2416 s3c2440 s3c24
|
||||||
machine-$(CONFIG_ARCH_S3C24A0) := s3c24a0
|
machine-$(CONFIG_ARCH_S3C24A0) := s3c24a0
|
||||||
machine-$(CONFIG_ARCH_S3C64XX) := s3c64xx
|
machine-$(CONFIG_ARCH_S3C64XX) := s3c64xx
|
||||||
machine-$(CONFIG_ARCH_S5P64X0) := s5p64x0
|
machine-$(CONFIG_ARCH_S5P64X0) := s5p64x0
|
||||||
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_EXYNOS4) := exynos4
|
machine-$(CONFIG_ARCH_EXYNOS4) := exynos4
|
||||||
|
|
|
@ -7,7 +7,7 @@ config ARM_VIC
|
||||||
config ARM_VIC_NR
|
config ARM_VIC_NR
|
||||||
int
|
int
|
||||||
default 4 if ARCH_S5PV210
|
default 4 if ARCH_S5PV210
|
||||||
default 3 if ARCH_S5P6442 || ARCH_S5PC100
|
default 3 if ARCH_S5PC100
|
||||||
default 2
|
default 2
|
||||||
depends on ARM_VIC
|
depends on ARM_VIC
|
||||||
help
|
help
|
||||||
|
|
|
@ -1,358 +0,0 @@
|
||||||
CONFIG_EXPERIMENTAL=y
|
|
||||||
CONFIG_LOCALVERSION="-AT572D940HF"
|
|
||||||
# CONFIG_LOCALVERSION_AUTO is not set
|
|
||||||
CONFIG_SYSVIPC=y
|
|
||||||
CONFIG_POSIX_MQUEUE=y
|
|
||||||
CONFIG_BSD_PROCESS_ACCT=y
|
|
||||||
CONFIG_BSD_PROCESS_ACCT_V3=y
|
|
||||||
CONFIG_TASKSTATS=y
|
|
||||||
CONFIG_TASK_XACCT=y
|
|
||||||
CONFIG_TASK_IO_ACCOUNTING=y
|
|
||||||
CONFIG_AUDIT=y
|
|
||||||
CONFIG_CGROUPS=y
|
|
||||||
CONFIG_CGROUP_CPUACCT=y
|
|
||||||
CONFIG_CGROUP_SCHED=y
|
|
||||||
CONFIG_RT_GROUP_SCHED=y
|
|
||||||
CONFIG_SYSFS_DEPRECATED_V2=y
|
|
||||||
CONFIG_RELAY=y
|
|
||||||
CONFIG_BLK_DEV_INITRD=y
|
|
||||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
|
||||||
CONFIG_EXPERT=y
|
|
||||||
CONFIG_SLAB=y
|
|
||||||
CONFIG_PROFILING=y
|
|
||||||
CONFIG_OPROFILE=m
|
|
||||||
CONFIG_KPROBES=y
|
|
||||||
CONFIG_MODULES=y
|
|
||||||
CONFIG_MODULE_UNLOAD=y
|
|
||||||
CONFIG_MODVERSIONS=y
|
|
||||||
CONFIG_MODULE_SRCVERSION_ALL=y
|
|
||||||
# CONFIG_BLK_DEV_BSG is not set
|
|
||||||
CONFIG_ARCH_AT91=y
|
|
||||||
CONFIG_ARCH_AT572D940HF=y
|
|
||||||
CONFIG_MACH_AT572D940HFEB=y
|
|
||||||
CONFIG_AT91_PROGRAMMABLE_CLOCKS=y
|
|
||||||
CONFIG_NO_HZ=y
|
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
|
||||||
CONFIG_PREEMPT=y
|
|
||||||
CONFIG_CMDLINE="mem=48M console=ttyS0 initrd=0x21100000,3145728 root=/dev/ram0 rw ip=172.16.1.181"
|
|
||||||
CONFIG_KEXEC=y
|
|
||||||
CONFIG_FPE_NWFPE=y
|
|
||||||
CONFIG_FPE_NWFPE_XP=y
|
|
||||||
CONFIG_NET=y
|
|
||||||
CONFIG_PACKET=m
|
|
||||||
CONFIG_UNIX=y
|
|
||||||
CONFIG_INET=y
|
|
||||||
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
|
|
||||||
# CONFIG_INET_XFRM_MODE_TUNNEL is not set
|
|
||||||
# CONFIG_INET_XFRM_MODE_BEET is not set
|
|
||||||
# CONFIG_INET_LRO is not set
|
|
||||||
# CONFIG_INET_DIAG is not set
|
|
||||||
# CONFIG_IPV6 is not set
|
|
||||||
CONFIG_NET_PKTGEN=m
|
|
||||||
CONFIG_NET_TCPPROBE=m
|
|
||||||
CONFIG_CAN=m
|
|
||||||
CONFIG_CAN_RAW=m
|
|
||||||
CONFIG_CAN_BCM=m
|
|
||||||
CONFIG_CAN_VCAN=m
|
|
||||||
CONFIG_CAN_DEBUG_DEVICES=y
|
|
||||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
|
||||||
CONFIG_CONNECTOR=m
|
|
||||||
CONFIG_MTD=m
|
|
||||||
CONFIG_MTD_DEBUG=y
|
|
||||||
CONFIG_MTD_DEBUG_VERBOSE=1
|
|
||||||
CONFIG_MTD_CONCAT=m
|
|
||||||
CONFIG_MTD_PARTITIONS=y
|
|
||||||
CONFIG_MTD_CHAR=m
|
|
||||||
CONFIG_MTD_BLOCK=m
|
|
||||||
CONFIG_MTD_BLOCK_RO=m
|
|
||||||
CONFIG_FTL=m
|
|
||||||
CONFIG_NFTL=m
|
|
||||||
CONFIG_NFTL_RW=y
|
|
||||||
CONFIG_INFTL=m
|
|
||||||
CONFIG_RFD_FTL=m
|
|
||||||
CONFIG_SSFDC=m
|
|
||||||
CONFIG_MTD_OOPS=m
|
|
||||||
CONFIG_MTD_CFI=m
|
|
||||||
CONFIG_MTD_JEDECPROBE=m
|
|
||||||
CONFIG_MTD_CFI_INTELEXT=m
|
|
||||||
CONFIG_MTD_CFI_AMDSTD=m
|
|
||||||
CONFIG_MTD_CFI_STAA=m
|
|
||||||
CONFIG_MTD_ROM=m
|
|
||||||
CONFIG_MTD_ABSENT=m
|
|
||||||
CONFIG_MTD_COMPLEX_MAPPINGS=y
|
|
||||||
CONFIG_MTD_PHYSMAP=m
|
|
||||||
CONFIG_MTD_PLATRAM=m
|
|
||||||
CONFIG_MTD_DATAFLASH=m
|
|
||||||
CONFIG_MTD_M25P80=m
|
|
||||||
CONFIG_MTD_SLRAM=m
|
|
||||||
CONFIG_MTD_PHRAM=m
|
|
||||||
CONFIG_MTD_MTDRAM=m
|
|
||||||
CONFIG_MTD_BLOCK2MTD=m
|
|
||||||
CONFIG_MTD_NAND=m
|
|
||||||
CONFIG_MTD_NAND_VERIFY_WRITE=y
|
|
||||||
CONFIG_MTD_NAND_DISKONCHIP=m
|
|
||||||
CONFIG_MTD_NAND_NANDSIM=m
|
|
||||||
CONFIG_MTD_NAND_PLATFORM=m
|
|
||||||
CONFIG_MTD_ALAUDA=m
|
|
||||||
CONFIG_MTD_UBI=m
|
|
||||||
CONFIG_MTD_UBI_GLUEBI=m
|
|
||||||
CONFIG_BLK_DEV_LOOP=y
|
|
||||||
CONFIG_BLK_DEV_CRYPTOLOOP=m
|
|
||||||
CONFIG_BLK_DEV_NBD=m
|
|
||||||
CONFIG_BLK_DEV_RAM=y
|
|
||||||
CONFIG_BLK_DEV_RAM_SIZE=65536
|
|
||||||
CONFIG_ATMEL_TCLIB=y
|
|
||||||
CONFIG_ATMEL_SSC=m
|
|
||||||
CONFIG_SENSORS_TSL2550=m
|
|
||||||
CONFIG_DS1682=m
|
|
||||||
CONFIG_RAID_ATTRS=m
|
|
||||||
CONFIG_SCSI=m
|
|
||||||
CONFIG_SCSI_TGT=m
|
|
||||||
# CONFIG_SCSI_PROC_FS is not set
|
|
||||||
CONFIG_BLK_DEV_SD=m
|
|
||||||
CONFIG_BLK_DEV_SR=m
|
|
||||||
CONFIG_CHR_DEV_SG=m
|
|
||||||
CONFIG_CHR_DEV_SCH=m
|
|
||||||
CONFIG_SCSI_MULTI_LUN=y
|
|
||||||
CONFIG_SCSI_CONSTANTS=y
|
|
||||||
CONFIG_SCSI_LOGGING=y
|
|
||||||
CONFIG_SCSI_SCAN_ASYNC=y
|
|
||||||
CONFIG_SCSI_ISCSI_ATTRS=m
|
|
||||||
CONFIG_NETDEVICES=y
|
|
||||||
CONFIG_DUMMY=m
|
|
||||||
CONFIG_BONDING=m
|
|
||||||
CONFIG_MACVLAN=m
|
|
||||||
CONFIG_EQUALIZER=m
|
|
||||||
CONFIG_TUN=m
|
|
||||||
CONFIG_VETH=m
|
|
||||||
CONFIG_PHYLIB=y
|
|
||||||
CONFIG_MARVELL_PHY=m
|
|
||||||
CONFIG_DAVICOM_PHY=m
|
|
||||||
CONFIG_QSEMI_PHY=m
|
|
||||||
CONFIG_LXT_PHY=m
|
|
||||||
CONFIG_CICADA_PHY=m
|
|
||||||
CONFIG_VITESSE_PHY=m
|
|
||||||
CONFIG_SMSC_PHY=m
|
|
||||||
CONFIG_BROADCOM_PHY=m
|
|
||||||
CONFIG_ICPLUS_PHY=m
|
|
||||||
CONFIG_MDIO_BITBANG=m
|
|
||||||
CONFIG_NET_ETHERNET=y
|
|
||||||
# CONFIG_NETDEV_1000 is not set
|
|
||||||
# CONFIG_NETDEV_10000 is not set
|
|
||||||
CONFIG_USB_ZD1201=m
|
|
||||||
CONFIG_HOSTAP=m
|
|
||||||
CONFIG_HOSTAP_FIRMWARE=y
|
|
||||||
CONFIG_HOSTAP_FIRMWARE_NVRAM=y
|
|
||||||
CONFIG_USB_CATC=m
|
|
||||||
CONFIG_USB_KAWETH=m
|
|
||||||
CONFIG_USB_PEGASUS=m
|
|
||||||
CONFIG_USB_RTL8150=m
|
|
||||||
CONFIG_USB_USBNET=m
|
|
||||||
CONFIG_USB_NET_DM9601=m
|
|
||||||
CONFIG_USB_NET_GL620A=m
|
|
||||||
CONFIG_USB_NET_PLUSB=m
|
|
||||||
CONFIG_USB_NET_MCS7830=m
|
|
||||||
CONFIG_USB_NET_RNDIS_HOST=m
|
|
||||||
CONFIG_USB_ALI_M5632=y
|
|
||||||
CONFIG_USB_AN2720=y
|
|
||||||
CONFIG_USB_EPSON2888=y
|
|
||||||
CONFIG_USB_KC2190=y
|
|
||||||
# CONFIG_USB_NET_ZAURUS is not set
|
|
||||||
CONFIG_INPUT_MOUSEDEV=m
|
|
||||||
CONFIG_INPUT_EVDEV=m
|
|
||||||
CONFIG_INPUT_EVBUG=m
|
|
||||||
CONFIG_KEYBOARD_LKKBD=m
|
|
||||||
CONFIG_KEYBOARD_GPIO=m
|
|
||||||
CONFIG_KEYBOARD_NEWTON=m
|
|
||||||
CONFIG_KEYBOARD_STOWAWAY=m
|
|
||||||
CONFIG_KEYBOARD_SUNKBD=m
|
|
||||||
CONFIG_KEYBOARD_XTKBD=m
|
|
||||||
CONFIG_MOUSE_PS2=m
|
|
||||||
CONFIG_MOUSE_SERIAL=m
|
|
||||||
CONFIG_MOUSE_APPLETOUCH=m
|
|
||||||
CONFIG_MOUSE_VSXXXAA=m
|
|
||||||
CONFIG_MOUSE_GPIO=m
|
|
||||||
CONFIG_INPUT_MISC=y
|
|
||||||
CONFIG_INPUT_UINPUT=m
|
|
||||||
CONFIG_SERIO_SERPORT=m
|
|
||||||
CONFIG_SERIO_RAW=m
|
|
||||||
CONFIG_VT_HW_CONSOLE_BINDING=y
|
|
||||||
CONFIG_SERIAL_NONSTANDARD=y
|
|
||||||
CONFIG_N_HDLC=m
|
|
||||||
CONFIG_SPECIALIX=m
|
|
||||||
CONFIG_STALDRV=y
|
|
||||||
CONFIG_SERIAL_ATMEL=y
|
|
||||||
CONFIG_SERIAL_ATMEL_CONSOLE=y
|
|
||||||
CONFIG_IPMI_HANDLER=m
|
|
||||||
CONFIG_IPMI_DEVICE_INTERFACE=m
|
|
||||||
CONFIG_IPMI_SI=m
|
|
||||||
CONFIG_IPMI_WATCHDOG=m
|
|
||||||
CONFIG_IPMI_POWEROFF=m
|
|
||||||
CONFIG_HW_RANDOM=y
|
|
||||||
CONFIG_R3964=m
|
|
||||||
CONFIG_RAW_DRIVER=m
|
|
||||||
CONFIG_TCG_TPM=m
|
|
||||||
CONFIG_TCG_NSC=m
|
|
||||||
CONFIG_TCG_ATMEL=m
|
|
||||||
CONFIG_I2C=m
|
|
||||||
CONFIG_I2C_CHARDEV=m
|
|
||||||
CONFIG_SPI=y
|
|
||||||
CONFIG_SPI_ATMEL=y
|
|
||||||
CONFIG_SPI_BITBANG=m
|
|
||||||
CONFIG_SPI_SPIDEV=m
|
|
||||||
# CONFIG_HWMON is not set
|
|
||||||
# CONFIG_VGA_CONSOLE is not set
|
|
||||||
CONFIG_SOUND=m
|
|
||||||
CONFIG_SND=m
|
|
||||||
CONFIG_SND_SEQUENCER=m
|
|
||||||
CONFIG_SND_SEQ_DUMMY=m
|
|
||||||
CONFIG_SND_MIXER_OSS=m
|
|
||||||
CONFIG_SND_PCM_OSS=m
|
|
||||||
# CONFIG_SND_PCM_OSS_PLUGINS is not set
|
|
||||||
CONFIG_SND_SEQUENCER_OSS=y
|
|
||||||
CONFIG_SND_DYNAMIC_MINORS=y
|
|
||||||
# CONFIG_SND_VERBOSE_PROCFS is not set
|
|
||||||
CONFIG_SND_DUMMY=m
|
|
||||||
CONFIG_SND_VIRMIDI=m
|
|
||||||
CONFIG_SND_USB_AUDIO=m
|
|
||||||
CONFIG_SND_USB_CAIAQ=m
|
|
||||||
CONFIG_SND_USB_CAIAQ_INPUT=y
|
|
||||||
CONFIG_HID=m
|
|
||||||
CONFIG_HIDRAW=y
|
|
||||||
CONFIG_USB_HID=m
|
|
||||||
CONFIG_USB_HIDDEV=y
|
|
||||||
CONFIG_USB_KBD=m
|
|
||||||
CONFIG_USB_MOUSE=m
|
|
||||||
CONFIG_HID_A4TECH=m
|
|
||||||
CONFIG_HID_APPLE=m
|
|
||||||
CONFIG_HID_BELKIN=m
|
|
||||||
CONFIG_HID_CHERRY=m
|
|
||||||
CONFIG_HID_CHICONY=m
|
|
||||||
CONFIG_HID_CYPRESS=m
|
|
||||||
CONFIG_HID_EZKEY=m
|
|
||||||
CONFIG_HID_GYRATION=m
|
|
||||||
CONFIG_HID_LOGITECH=m
|
|
||||||
CONFIG_HID_MICROSOFT=m
|
|
||||||
CONFIG_HID_MONTEREY=m
|
|
||||||
CONFIG_HID_PANTHERLORD=m
|
|
||||||
CONFIG_HID_PETALYNX=m
|
|
||||||
CONFIG_HID_SAMSUNG=m
|
|
||||||
CONFIG_HID_SONY=m
|
|
||||||
CONFIG_HID_SUNPLUS=m
|
|
||||||
CONFIG_USB=y
|
|
||||||
CONFIG_USB_DEVICEFS=y
|
|
||||||
# CONFIG_USB_DEVICE_CLASS is not set
|
|
||||||
CONFIG_USB_DYNAMIC_MINORS=y
|
|
||||||
CONFIG_USB_MON=y
|
|
||||||
CONFIG_USB_OHCI_HCD=y
|
|
||||||
CONFIG_USB_STORAGE=m
|
|
||||||
CONFIG_USB_STORAGE_DATAFAB=m
|
|
||||||
CONFIG_USB_STORAGE_FREECOM=m
|
|
||||||
CONFIG_USB_STORAGE_ISD200=m
|
|
||||||
CONFIG_USB_STORAGE_USBAT=m
|
|
||||||
CONFIG_USB_STORAGE_SDDR09=m
|
|
||||||
CONFIG_USB_STORAGE_SDDR55=m
|
|
||||||
CONFIG_USB_STORAGE_JUMPSHOT=m
|
|
||||||
CONFIG_USB_STORAGE_ALAUDA=m
|
|
||||||
CONFIG_USB_STORAGE_KARMA=m
|
|
||||||
CONFIG_USB_LIBUSUAL=y
|
|
||||||
CONFIG_USB_SERIAL=m
|
|
||||||
CONFIG_USB_EZUSB=y
|
|
||||||
CONFIG_USB_SERIAL_GENERIC=y
|
|
||||||
CONFIG_USB_SERIAL_PL2303=m
|
|
||||||
CONFIG_USB_SERIAL_SPCP8X5=m
|
|
||||||
CONFIG_USB_SERIAL_DEBUG=m
|
|
||||||
CONFIG_USB_EMI62=m
|
|
||||||
CONFIG_USB_EMI26=m
|
|
||||||
CONFIG_USB_ADUTUX=m
|
|
||||||
CONFIG_USB_TEST=m
|
|
||||||
CONFIG_USB_GADGET=m
|
|
||||||
CONFIG_USB_GADGET_DEBUG_FILES=y
|
|
||||||
CONFIG_USB_GADGET_DEBUG_FS=y
|
|
||||||
CONFIG_USB_ZERO=m
|
|
||||||
CONFIG_USB_ETH=m
|
|
||||||
CONFIG_USB_GADGETFS=m
|
|
||||||
CONFIG_USB_FILE_STORAGE=m
|
|
||||||
CONFIG_USB_G_SERIAL=m
|
|
||||||
CONFIG_USB_MIDI_GADGET=m
|
|
||||||
CONFIG_MMC=y
|
|
||||||
CONFIG_SDIO_UART=m
|
|
||||||
CONFIG_MMC_AT91=m
|
|
||||||
CONFIG_MMC_SPI=m
|
|
||||||
CONFIG_NEW_LEDS=y
|
|
||||||
CONFIG_LEDS_CLASS=m
|
|
||||||
CONFIG_LEDS_GPIO=m
|
|
||||||
CONFIG_LEDS_TRIGGERS=y
|
|
||||||
CONFIG_LEDS_TRIGGER_TIMER=m
|
|
||||||
CONFIG_LEDS_TRIGGER_HEARTBEAT=m
|
|
||||||
CONFIG_RTC_CLASS=y
|
|
||||||
CONFIG_RTC_INTF_DEV_UIE_EMUL=y
|
|
||||||
CONFIG_RTC_DRV_DS1307=m
|
|
||||||
CONFIG_RTC_DRV_DS1305=y
|
|
||||||
CONFIG_EXT2_FS=y
|
|
||||||
CONFIG_EXT2_FS_XATTR=y
|
|
||||||
CONFIG_EXT2_FS_POSIX_ACL=y
|
|
||||||
CONFIG_EXT2_FS_SECURITY=y
|
|
||||||
CONFIG_EXT3_FS=y
|
|
||||||
CONFIG_EXT3_FS_POSIX_ACL=y
|
|
||||||
CONFIG_EXT3_FS_SECURITY=y
|
|
||||||
CONFIG_JBD_DEBUG=y
|
|
||||||
CONFIG_REISERFS_FS=m
|
|
||||||
CONFIG_REISERFS_CHECK=y
|
|
||||||
CONFIG_REISERFS_PROC_INFO=y
|
|
||||||
CONFIG_REISERFS_FS_XATTR=y
|
|
||||||
CONFIG_REISERFS_FS_POSIX_ACL=y
|
|
||||||
CONFIG_REISERFS_FS_SECURITY=y
|
|
||||||
CONFIG_INOTIFY=y
|
|
||||||
CONFIG_FUSE_FS=m
|
|
||||||
CONFIG_MSDOS_FS=m
|
|
||||||
CONFIG_VFAT_FS=y
|
|
||||||
CONFIG_NTFS_FS=m
|
|
||||||
CONFIG_NTFS_RW=y
|
|
||||||
CONFIG_TMPFS=y
|
|
||||||
CONFIG_TMPFS_POSIX_ACL=y
|
|
||||||
CONFIG_JFFS2_FS=m
|
|
||||||
CONFIG_JFFS2_COMPRESSION_OPTIONS=y
|
|
||||||
CONFIG_JFFS2_LZO=y
|
|
||||||
CONFIG_JFFS2_CMODE_FAVOURLZO=y
|
|
||||||
CONFIG_CRAMFS=m
|
|
||||||
CONFIG_NFS_FS=m
|
|
||||||
CONFIG_NFS_V3=y
|
|
||||||
CONFIG_NFS_V3_ACL=y
|
|
||||||
CONFIG_NFS_V4=y
|
|
||||||
CONFIG_NFSD=m
|
|
||||||
CONFIG_NFSD_V3_ACL=y
|
|
||||||
CONFIG_NFSD_V4=y
|
|
||||||
CONFIG_CIFS=m
|
|
||||||
CONFIG_CIFS_WEAK_PW_HASH=y
|
|
||||||
CONFIG_PARTITION_ADVANCED=y
|
|
||||||
CONFIG_MAC_PARTITION=y
|
|
||||||
CONFIG_BSD_DISKLABEL=y
|
|
||||||
CONFIG_MINIX_SUBPARTITION=y
|
|
||||||
CONFIG_SOLARIS_X86_PARTITION=y
|
|
||||||
CONFIG_UNIXWARE_DISKLABEL=y
|
|
||||||
CONFIG_LDM_PARTITION=y
|
|
||||||
CONFIG_LDM_DEBUG=y
|
|
||||||
CONFIG_SGI_PARTITION=y
|
|
||||||
CONFIG_SUN_PARTITION=y
|
|
||||||
CONFIG_NLS_DEFAULT="cp437"
|
|
||||||
CONFIG_NLS_CODEPAGE_437=y
|
|
||||||
CONFIG_NLS_CODEPAGE_850=m
|
|
||||||
CONFIG_NLS_ASCII=y
|
|
||||||
CONFIG_NLS_ISO8859_1=y
|
|
||||||
CONFIG_NLS_UTF8=m
|
|
||||||
CONFIG_DLM=m
|
|
||||||
CONFIG_PRINTK_TIME=y
|
|
||||||
CONFIG_MAGIC_SYSRQ=y
|
|
||||||
CONFIG_UNUSED_SYMBOLS=y
|
|
||||||
CONFIG_DEBUG_FS=y
|
|
||||||
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
|
||||||
CONFIG_SYSCTL_SYSCALL_CHECK=y
|
|
||||||
CONFIG_CRYPTO=y
|
|
||||||
CONFIG_CRYPTO_GF128MUL=m
|
|
||||||
CONFIG_CRYPTO_HMAC=y
|
|
||||||
CONFIG_CRYPTO_MD5=y
|
|
||||||
# CONFIG_CRYPTO_ANSI_CPRNG is not set
|
|
||||||
# CONFIG_CRYPTO_HW is not set
|
|
||||||
CONFIG_CRC_CCITT=m
|
|
||||||
CONFIG_CRC16=m
|
|
|
@ -1,9 +1,13 @@
|
||||||
CONFIG_EXPERIMENTAL=y
|
CONFIG_EXPERIMENTAL=y
|
||||||
# CONFIG_LOCALVERSION_AUTO is not set
|
# CONFIG_LOCALVERSION_AUTO is not set
|
||||||
|
CONFIG_KERNEL_LZMA=y
|
||||||
# CONFIG_SWAP is not set
|
# CONFIG_SWAP is not set
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
|
CONFIG_IKCONFIG=y
|
||||||
|
CONFIG_IKCONFIG_PROC=y
|
||||||
CONFIG_LOG_BUF_SHIFT=14
|
CONFIG_LOG_BUF_SHIFT=14
|
||||||
CONFIG_BLK_DEV_INITRD=y
|
CONFIG_NAMESPACES=y
|
||||||
|
CONFIG_EMBEDDED=y
|
||||||
CONFIG_SLAB=y
|
CONFIG_SLAB=y
|
||||||
CONFIG_MODULES=y
|
CONFIG_MODULES=y
|
||||||
CONFIG_MODULE_UNLOAD=y
|
CONFIG_MODULE_UNLOAD=y
|
||||||
|
@ -15,18 +19,27 @@ CONFIG_ARCH_AT91SAM9261=y
|
||||||
CONFIG_MACH_AT91SAM9261EK=y
|
CONFIG_MACH_AT91SAM9261EK=y
|
||||||
CONFIG_AT91_PROGRAMMABLE_CLOCKS=y
|
CONFIG_AT91_PROGRAMMABLE_CLOCKS=y
|
||||||
# CONFIG_ARM_THUMB is not set
|
# CONFIG_ARM_THUMB is not set
|
||||||
|
CONFIG_AEABI=y
|
||||||
|
# CONFIG_OABI_COMPAT is not set
|
||||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||||
CONFIG_CMDLINE="mem=64M console=ttyS0,115200 initrd=0x21100000,3145728 root=/dev/ram0 rw"
|
CONFIG_CMDLINE="mem=64M console=ttyS0,115200 initrd=0x21100000,3145728 root=/dev/ram0 rw"
|
||||||
CONFIG_FPE_NWFPE=y
|
CONFIG_AUTO_ZRELADDR=y
|
||||||
|
CONFIG_VFP=y
|
||||||
|
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
|
||||||
CONFIG_NET=y
|
CONFIG_NET=y
|
||||||
CONFIG_PACKET=y
|
CONFIG_PACKET=y
|
||||||
CONFIG_UNIX=y
|
CONFIG_UNIX=y
|
||||||
CONFIG_INET=y
|
CONFIG_INET=y
|
||||||
|
CONFIG_IP_MULTICAST=y
|
||||||
CONFIG_IP_PNP=y
|
CONFIG_IP_PNP=y
|
||||||
|
CONFIG_IP_PNP_DHCP=y
|
||||||
CONFIG_IP_PNP_BOOTP=y
|
CONFIG_IP_PNP_BOOTP=y
|
||||||
# CONFIG_INET_LRO is not set
|
# CONFIG_INET_LRO is not set
|
||||||
# CONFIG_IPV6 is not set
|
# CONFIG_IPV6 is not set
|
||||||
|
CONFIG_CFG80211=y
|
||||||
|
CONFIG_LIB80211=y
|
||||||
|
CONFIG_MAC80211=y
|
||||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||||
CONFIG_MTD=y
|
CONFIG_MTD=y
|
||||||
CONFIG_MTD_PARTITIONS=y
|
CONFIG_MTD_PARTITIONS=y
|
||||||
|
@ -34,8 +47,12 @@ CONFIG_MTD_CMDLINE_PARTS=y
|
||||||
CONFIG_MTD_BLOCK=y
|
CONFIG_MTD_BLOCK=y
|
||||||
CONFIG_MTD_NAND=y
|
CONFIG_MTD_NAND=y
|
||||||
CONFIG_MTD_NAND_ATMEL=y
|
CONFIG_MTD_NAND_ATMEL=y
|
||||||
|
CONFIG_MTD_UBI=y
|
||||||
|
CONFIG_MTD_UBI_GLUEBI=y
|
||||||
CONFIG_BLK_DEV_RAM=y
|
CONFIG_BLK_DEV_RAM=y
|
||||||
CONFIG_BLK_DEV_RAM_SIZE=8192
|
CONFIG_BLK_DEV_RAM_SIZE=8192
|
||||||
|
CONFIG_MISC_DEVICES=y
|
||||||
|
CONFIG_ATMEL_TCLIB=y
|
||||||
CONFIG_ATMEL_SSC=y
|
CONFIG_ATMEL_SSC=y
|
||||||
CONFIG_SCSI=y
|
CONFIG_SCSI=y
|
||||||
CONFIG_BLK_DEV_SD=y
|
CONFIG_BLK_DEV_SD=y
|
||||||
|
@ -45,12 +62,27 @@ CONFIG_NET_ETHERNET=y
|
||||||
CONFIG_DM9000=y
|
CONFIG_DM9000=y
|
||||||
# CONFIG_NETDEV_1000 is not set
|
# CONFIG_NETDEV_1000 is not set
|
||||||
# CONFIG_NETDEV_10000 is not set
|
# CONFIG_NETDEV_10000 is not set
|
||||||
|
CONFIG_USB_ZD1201=m
|
||||||
|
CONFIG_RTL8187=m
|
||||||
|
CONFIG_LIBERTAS=m
|
||||||
|
CONFIG_LIBERTAS_USB=m
|
||||||
|
CONFIG_LIBERTAS_SDIO=m
|
||||||
|
CONFIG_LIBERTAS_SPI=m
|
||||||
|
CONFIG_RT2X00=m
|
||||||
|
CONFIG_RT2500USB=m
|
||||||
|
CONFIG_RT73USB=m
|
||||||
|
CONFIG_ZD1211RW=m
|
||||||
|
CONFIG_INPUT_POLLDEV=m
|
||||||
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
||||||
|
CONFIG_INPUT_MOUSEDEV_SCREEN_X=240
|
||||||
|
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=320
|
||||||
|
CONFIG_INPUT_EVDEV=y
|
||||||
# CONFIG_KEYBOARD_ATKBD is not set
|
# CONFIG_KEYBOARD_ATKBD is not set
|
||||||
CONFIG_KEYBOARD_GPIO=y
|
CONFIG_KEYBOARD_GPIO=y
|
||||||
# CONFIG_INPUT_MOUSE is not set
|
# CONFIG_INPUT_MOUSE is not set
|
||||||
CONFIG_INPUT_TOUCHSCREEN=y
|
CONFIG_INPUT_TOUCHSCREEN=y
|
||||||
CONFIG_TOUCHSCREEN_ADS7846=y
|
CONFIG_TOUCHSCREEN_ADS7846=y
|
||||||
|
CONFIG_DEVPTS_MULTIPLE_INSTANCES=y
|
||||||
CONFIG_SERIAL_ATMEL=y
|
CONFIG_SERIAL_ATMEL=y
|
||||||
CONFIG_SERIAL_ATMEL_CONSOLE=y
|
CONFIG_SERIAL_ATMEL_CONSOLE=y
|
||||||
CONFIG_HW_RANDOM=y
|
CONFIG_HW_RANDOM=y
|
||||||
|
@ -65,31 +97,62 @@ CONFIG_WATCHDOG_NOWAYOUT=y
|
||||||
CONFIG_AT91SAM9X_WATCHDOG=y
|
CONFIG_AT91SAM9X_WATCHDOG=y
|
||||||
CONFIG_FB=y
|
CONFIG_FB=y
|
||||||
CONFIG_FB_ATMEL=y
|
CONFIG_FB_ATMEL=y
|
||||||
# CONFIG_VGA_CONSOLE is not set
|
CONFIG_BACKLIGHT_LCD_SUPPORT=y
|
||||||
|
# CONFIG_LCD_CLASS_DEVICE is not set
|
||||||
|
CONFIG_BACKLIGHT_CLASS_DEVICE=y
|
||||||
|
CONFIG_BACKLIGHT_ATMEL_LCDC=y
|
||||||
|
# CONFIG_BACKLIGHT_GENERIC is not set
|
||||||
|
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||||
|
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
|
||||||
|
CONFIG_LOGO=y
|
||||||
|
CONFIG_SOUND=y
|
||||||
|
CONFIG_SND=y
|
||||||
|
CONFIG_SND_SEQUENCER=y
|
||||||
|
CONFIG_SND_MIXER_OSS=y
|
||||||
|
CONFIG_SND_PCM_OSS=y
|
||||||
|
# CONFIG_SND_SUPPORT_OLD_API is not set
|
||||||
|
# CONFIG_SND_VERBOSE_PROCFS is not set
|
||||||
|
# CONFIG_SND_DRIVERS is not set
|
||||||
|
# CONFIG_SND_ARM is not set
|
||||||
|
CONFIG_SND_AT73C213=y
|
||||||
|
CONFIG_SND_USB_AUDIO=m
|
||||||
# CONFIG_USB_HID is not set
|
# CONFIG_USB_HID is not set
|
||||||
CONFIG_USB=y
|
CONFIG_USB=y
|
||||||
CONFIG_USB_DEVICEFS=y
|
CONFIG_USB_DEVICEFS=y
|
||||||
CONFIG_USB_MON=y
|
|
||||||
CONFIG_USB_OHCI_HCD=y
|
CONFIG_USB_OHCI_HCD=y
|
||||||
CONFIG_USB_STORAGE=y
|
CONFIG_USB_STORAGE=y
|
||||||
CONFIG_USB_STORAGE_DEBUG=y
|
|
||||||
CONFIG_USB_GADGET=y
|
CONFIG_USB_GADGET=y
|
||||||
CONFIG_USB_ZERO=m
|
CONFIG_USB_ZERO=m
|
||||||
|
CONFIG_USB_ETH=m
|
||||||
CONFIG_USB_GADGETFS=m
|
CONFIG_USB_GADGETFS=m
|
||||||
CONFIG_USB_FILE_STORAGE=m
|
CONFIG_USB_FILE_STORAGE=m
|
||||||
CONFIG_USB_G_SERIAL=m
|
CONFIG_USB_G_SERIAL=m
|
||||||
CONFIG_MMC=y
|
CONFIG_MMC=y
|
||||||
CONFIG_MMC_AT91=m
|
CONFIG_MMC_AT91=m
|
||||||
|
CONFIG_NEW_LEDS=y
|
||||||
|
CONFIG_LEDS_CLASS=y
|
||||||
|
CONFIG_LEDS_GPIO=y
|
||||||
|
CONFIG_LEDS_TRIGGERS=y
|
||||||
|
CONFIG_LEDS_TRIGGER_TIMER=y
|
||||||
|
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
|
||||||
|
CONFIG_LEDS_TRIGGER_GPIO=y
|
||||||
CONFIG_RTC_CLASS=y
|
CONFIG_RTC_CLASS=y
|
||||||
CONFIG_RTC_DRV_AT91SAM9=y
|
CONFIG_RTC_DRV_AT91SAM9=y
|
||||||
CONFIG_EXT2_FS=y
|
CONFIG_MSDOS_FS=y
|
||||||
CONFIG_INOTIFY=y
|
|
||||||
CONFIG_VFAT_FS=y
|
CONFIG_VFAT_FS=y
|
||||||
CONFIG_TMPFS=y
|
CONFIG_TMPFS=y
|
||||||
CONFIG_CRAMFS=y
|
CONFIG_UBIFS_FS=y
|
||||||
|
CONFIG_UBIFS_FS_ADVANCED_COMPR=y
|
||||||
|
CONFIG_SQUASHFS=y
|
||||||
|
CONFIG_SQUASHFS_LZO=y
|
||||||
|
CONFIG_SQUASHFS_XZ=y
|
||||||
|
CONFIG_NFS_FS=y
|
||||||
|
CONFIG_NFS_V3=y
|
||||||
|
CONFIG_ROOT_NFS=y
|
||||||
CONFIG_NLS_CODEPAGE_437=y
|
CONFIG_NLS_CODEPAGE_437=y
|
||||||
CONFIG_NLS_CODEPAGE_850=y
|
CONFIG_NLS_CODEPAGE_850=y
|
||||||
CONFIG_NLS_ISO8859_1=y
|
CONFIG_NLS_ISO8859_1=y
|
||||||
CONFIG_DEBUG_KERNEL=y
|
CONFIG_NLS_ISO8859_15=y
|
||||||
CONFIG_DEBUG_USER=y
|
CONFIG_NLS_UTF8=y
|
||||||
CONFIG_DEBUG_LL=y
|
CONFIG_FTRACE=y
|
||||||
|
CONFIG_CRC_CCITT=m
|
|
@ -1,9 +1,13 @@
|
||||||
CONFIG_EXPERIMENTAL=y
|
CONFIG_EXPERIMENTAL=y
|
||||||
# CONFIG_LOCALVERSION_AUTO is not set
|
# CONFIG_LOCALVERSION_AUTO is not set
|
||||||
|
CONFIG_KERNEL_LZMA=y
|
||||||
# CONFIG_SWAP is not set
|
# CONFIG_SWAP is not set
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
|
CONFIG_IKCONFIG=y
|
||||||
|
CONFIG_IKCONFIG_PROC=y
|
||||||
CONFIG_LOG_BUF_SHIFT=14
|
CONFIG_LOG_BUF_SHIFT=14
|
||||||
CONFIG_BLK_DEV_INITRD=y
|
CONFIG_NAMESPACES=y
|
||||||
|
CONFIG_EMBEDDED=y
|
||||||
CONFIG_SLAB=y
|
CONFIG_SLAB=y
|
||||||
CONFIG_MODULES=y
|
CONFIG_MODULES=y
|
||||||
CONFIG_MODULE_UNLOAD=y
|
CONFIG_MODULE_UNLOAD=y
|
||||||
|
@ -13,53 +17,81 @@ CONFIG_MODULE_UNLOAD=y
|
||||||
CONFIG_ARCH_AT91=y
|
CONFIG_ARCH_AT91=y
|
||||||
CONFIG_ARCH_AT91SAM9263=y
|
CONFIG_ARCH_AT91SAM9263=y
|
||||||
CONFIG_MACH_AT91SAM9263EK=y
|
CONFIG_MACH_AT91SAM9263EK=y
|
||||||
|
CONFIG_MACH_USB_A9263=y
|
||||||
|
CONFIG_MACH_NEOCORE926=y
|
||||||
CONFIG_MTD_AT91_DATAFLASH_CARD=y
|
CONFIG_MTD_AT91_DATAFLASH_CARD=y
|
||||||
# CONFIG_ARM_THUMB is not set
|
# CONFIG_ARM_THUMB is not set
|
||||||
|
CONFIG_AEABI=y
|
||||||
|
# CONFIG_OABI_COMPAT is not set
|
||||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||||
CONFIG_CMDLINE="mem=64M console=ttyS0,115200 initrd=0x21100000,3145728 root=/dev/ram0 rw"
|
CONFIG_CMDLINE="mem=64M console=ttyS0,115200 initrd=0x21100000,3145728 root=/dev/ram0 rw"
|
||||||
CONFIG_FPE_NWFPE=y
|
CONFIG_AUTO_ZRELADDR=y
|
||||||
CONFIG_NET=y
|
CONFIG_NET=y
|
||||||
CONFIG_PACKET=y
|
CONFIG_PACKET=y
|
||||||
CONFIG_UNIX=y
|
CONFIG_UNIX=y
|
||||||
|
CONFIG_NET_KEY=y
|
||||||
CONFIG_INET=y
|
CONFIG_INET=y
|
||||||
|
CONFIG_IP_MULTICAST=y
|
||||||
|
CONFIG_IP_ADVANCED_ROUTER=y
|
||||||
|
CONFIG_IP_ROUTE_VERBOSE=y
|
||||||
CONFIG_IP_PNP=y
|
CONFIG_IP_PNP=y
|
||||||
|
CONFIG_IP_PNP_DHCP=y
|
||||||
CONFIG_IP_PNP_BOOTP=y
|
CONFIG_IP_PNP_BOOTP=y
|
||||||
CONFIG_IP_PNP_RARP=y
|
CONFIG_IP_PNP_RARP=y
|
||||||
|
CONFIG_NET_IPIP=y
|
||||||
|
CONFIG_IP_MROUTE=y
|
||||||
|
CONFIG_IP_PIMSM_V1=y
|
||||||
|
CONFIG_IP_PIMSM_V2=y
|
||||||
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
|
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
|
||||||
# CONFIG_INET_XFRM_MODE_TUNNEL is not set
|
# CONFIG_INET_XFRM_MODE_TUNNEL is not set
|
||||||
# CONFIG_INET_XFRM_MODE_BEET is not set
|
# CONFIG_INET_XFRM_MODE_BEET is not set
|
||||||
# CONFIG_INET_LRO is not set
|
# CONFIG_INET_LRO is not set
|
||||||
# CONFIG_INET_DIAG is not set
|
# CONFIG_INET_DIAG is not set
|
||||||
# CONFIG_IPV6 is not set
|
CONFIG_IPV6=y
|
||||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||||
CONFIG_MTD=y
|
CONFIG_MTD=y
|
||||||
CONFIG_MTD_PARTITIONS=y
|
CONFIG_MTD_PARTITIONS=y
|
||||||
CONFIG_MTD_CMDLINE_PARTS=y
|
CONFIG_MTD_CMDLINE_PARTS=y
|
||||||
CONFIG_MTD_CHAR=y
|
CONFIG_MTD_CHAR=y
|
||||||
CONFIG_MTD_BLOCK=y
|
CONFIG_MTD_BLOCK=y
|
||||||
|
CONFIG_NFTL=y
|
||||||
|
CONFIG_NFTL_RW=y
|
||||||
CONFIG_MTD_DATAFLASH=y
|
CONFIG_MTD_DATAFLASH=y
|
||||||
|
CONFIG_MTD_BLOCK2MTD=y
|
||||||
CONFIG_MTD_NAND=y
|
CONFIG_MTD_NAND=y
|
||||||
CONFIG_MTD_NAND_ATMEL=y
|
CONFIG_MTD_NAND_ATMEL=y
|
||||||
|
CONFIG_MTD_NAND_ATMEL_ECC_SOFT=y
|
||||||
|
CONFIG_MTD_UBI=y
|
||||||
|
CONFIG_MTD_UBI_GLUEBI=y
|
||||||
CONFIG_BLK_DEV_LOOP=y
|
CONFIG_BLK_DEV_LOOP=y
|
||||||
CONFIG_BLK_DEV_RAM=y
|
CONFIG_BLK_DEV_RAM=y
|
||||||
CONFIG_BLK_DEV_RAM_SIZE=8192
|
CONFIG_BLK_DEV_RAM_SIZE=8192
|
||||||
CONFIG_ATMEL_SSC=y
|
CONFIG_MISC_DEVICES=y
|
||||||
|
CONFIG_ATMEL_PWM=y
|
||||||
|
CONFIG_ATMEL_TCLIB=y
|
||||||
CONFIG_SCSI=y
|
CONFIG_SCSI=y
|
||||||
CONFIG_BLK_DEV_SD=y
|
CONFIG_BLK_DEV_SD=y
|
||||||
CONFIG_SCSI_MULTI_LUN=y
|
CONFIG_SCSI_MULTI_LUN=y
|
||||||
CONFIG_NETDEVICES=y
|
CONFIG_NETDEVICES=y
|
||||||
CONFIG_NET_ETHERNET=y
|
|
||||||
CONFIG_MII=y
|
CONFIG_MII=y
|
||||||
|
CONFIG_SMSC_PHY=y
|
||||||
|
CONFIG_NET_ETHERNET=y
|
||||||
CONFIG_MACB=y
|
CONFIG_MACB=y
|
||||||
|
# CONFIG_NETDEV_1000 is not set
|
||||||
|
# CONFIG_NETDEV_10000 is not set
|
||||||
|
CONFIG_USB_ZD1201=m
|
||||||
|
CONFIG_INPUT_POLLDEV=m
|
||||||
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
||||||
|
CONFIG_INPUT_MOUSEDEV_SCREEN_X=240
|
||||||
|
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=320
|
||||||
CONFIG_INPUT_EVDEV=y
|
CONFIG_INPUT_EVDEV=y
|
||||||
# CONFIG_KEYBOARD_ATKBD is not set
|
# CONFIG_KEYBOARD_ATKBD is not set
|
||||||
CONFIG_KEYBOARD_GPIO=y
|
CONFIG_KEYBOARD_GPIO=y
|
||||||
# CONFIG_INPUT_MOUSE is not set
|
# CONFIG_INPUT_MOUSE is not set
|
||||||
CONFIG_INPUT_TOUCHSCREEN=y
|
CONFIG_INPUT_TOUCHSCREEN=y
|
||||||
CONFIG_TOUCHSCREEN_ADS7846=y
|
CONFIG_TOUCHSCREEN_ADS7846=y
|
||||||
# CONFIG_SERIO is not set
|
CONFIG_LEGACY_PTY_COUNT=4
|
||||||
CONFIG_SERIAL_ATMEL=y
|
CONFIG_SERIAL_ATMEL=y
|
||||||
CONFIG_SERIAL_ATMEL_CONSOLE=y
|
CONFIG_SERIAL_ATMEL_CONSOLE=y
|
||||||
CONFIG_HW_RANDOM=y
|
CONFIG_HW_RANDOM=y
|
||||||
|
@ -74,8 +106,25 @@ CONFIG_WATCHDOG_NOWAYOUT=y
|
||||||
CONFIG_AT91SAM9X_WATCHDOG=y
|
CONFIG_AT91SAM9X_WATCHDOG=y
|
||||||
CONFIG_FB=y
|
CONFIG_FB=y
|
||||||
CONFIG_FB_ATMEL=y
|
CONFIG_FB_ATMEL=y
|
||||||
# CONFIG_VGA_CONSOLE is not set
|
CONFIG_BACKLIGHT_LCD_SUPPORT=y
|
||||||
# CONFIG_USB_HID is not set
|
CONFIG_LCD_CLASS_DEVICE=y
|
||||||
|
CONFIG_BACKLIGHT_CLASS_DEVICE=y
|
||||||
|
CONFIG_BACKLIGHT_ATMEL_LCDC=y
|
||||||
|
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||||
|
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
|
||||||
|
CONFIG_LOGO=y
|
||||||
|
CONFIG_SOUND=y
|
||||||
|
CONFIG_SND=y
|
||||||
|
CONFIG_SND_SEQUENCER=y
|
||||||
|
CONFIG_SND_MIXER_OSS=y
|
||||||
|
CONFIG_SND_PCM_OSS=y
|
||||||
|
# CONFIG_SND_SUPPORT_OLD_API is not set
|
||||||
|
# CONFIG_SND_VERBOSE_PROCFS is not set
|
||||||
|
# CONFIG_SND_DRIVERS is not set
|
||||||
|
# CONFIG_SND_ARM is not set
|
||||||
|
CONFIG_SND_ATMEL_AC97C=y
|
||||||
|
# CONFIG_SND_SPI is not set
|
||||||
|
CONFIG_SND_USB_AUDIO=m
|
||||||
CONFIG_USB=y
|
CONFIG_USB=y
|
||||||
CONFIG_USB_DEVICEFS=y
|
CONFIG_USB_DEVICEFS=y
|
||||||
CONFIG_USB_MON=y
|
CONFIG_USB_MON=y
|
||||||
|
@ -83,24 +132,37 @@ CONFIG_USB_OHCI_HCD=y
|
||||||
CONFIG_USB_STORAGE=y
|
CONFIG_USB_STORAGE=y
|
||||||
CONFIG_USB_GADGET=y
|
CONFIG_USB_GADGET=y
|
||||||
CONFIG_USB_ZERO=m
|
CONFIG_USB_ZERO=m
|
||||||
|
CONFIG_USB_ETH=m
|
||||||
CONFIG_USB_GADGETFS=m
|
CONFIG_USB_GADGETFS=m
|
||||||
CONFIG_USB_FILE_STORAGE=m
|
CONFIG_USB_FILE_STORAGE=m
|
||||||
CONFIG_USB_G_SERIAL=m
|
CONFIG_USB_G_SERIAL=m
|
||||||
CONFIG_MMC=y
|
CONFIG_MMC=y
|
||||||
|
CONFIG_SDIO_UART=m
|
||||||
CONFIG_MMC_AT91=m
|
CONFIG_MMC_AT91=m
|
||||||
|
CONFIG_NEW_LEDS=y
|
||||||
|
CONFIG_LEDS_CLASS=y
|
||||||
|
CONFIG_LEDS_ATMEL_PWM=y
|
||||||
|
CONFIG_LEDS_GPIO=y
|
||||||
|
CONFIG_LEDS_TRIGGERS=y
|
||||||
|
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
|
||||||
CONFIG_RTC_CLASS=y
|
CONFIG_RTC_CLASS=y
|
||||||
CONFIG_RTC_DRV_AT91SAM9=y
|
CONFIG_RTC_DRV_AT91SAM9=y
|
||||||
CONFIG_EXT2_FS=y
|
CONFIG_EXT2_FS=y
|
||||||
CONFIG_INOTIFY=y
|
CONFIG_FUSE_FS=m
|
||||||
CONFIG_VFAT_FS=y
|
CONFIG_VFAT_FS=y
|
||||||
CONFIG_TMPFS=y
|
CONFIG_TMPFS=y
|
||||||
CONFIG_JFFS2_FS=y
|
CONFIG_JFFS2_FS=y
|
||||||
|
CONFIG_UBIFS_FS=y
|
||||||
|
CONFIG_UBIFS_FS_ADVANCED_COMPR=y
|
||||||
CONFIG_CRAMFS=y
|
CONFIG_CRAMFS=y
|
||||||
CONFIG_NFS_FS=y
|
CONFIG_NFS_FS=y
|
||||||
|
CONFIG_NFS_V3=y
|
||||||
|
CONFIG_NFS_V3_ACL=y
|
||||||
|
CONFIG_NFS_V4=y
|
||||||
CONFIG_ROOT_NFS=y
|
CONFIG_ROOT_NFS=y
|
||||||
CONFIG_NLS_CODEPAGE_437=y
|
CONFIG_NLS_CODEPAGE_437=y
|
||||||
CONFIG_NLS_CODEPAGE_850=y
|
CONFIG_NLS_CODEPAGE_850=y
|
||||||
CONFIG_NLS_ISO8859_1=y
|
CONFIG_NLS_ISO8859_1=y
|
||||||
CONFIG_DEBUG_KERNEL=y
|
CONFIG_FTRACE=y
|
||||||
CONFIG_DEBUG_USER=y
|
CONFIG_DEBUG_USER=y
|
||||||
CONFIG_DEBUG_LL=y
|
CONFIG_XZ_DEC=y
|
|
@ -8,7 +8,9 @@ CONFIG_ARCH_EXYNOS4=y
|
||||||
CONFIG_S3C_LOWLEVEL_UART_PORT=1
|
CONFIG_S3C_LOWLEVEL_UART_PORT=1
|
||||||
CONFIG_MACH_SMDKC210=y
|
CONFIG_MACH_SMDKC210=y
|
||||||
CONFIG_MACH_SMDKV310=y
|
CONFIG_MACH_SMDKV310=y
|
||||||
|
CONFIG_MACH_ARMLEX4210=y
|
||||||
CONFIG_MACH_UNIVERSAL_C210=y
|
CONFIG_MACH_UNIVERSAL_C210=y
|
||||||
|
CONFIG_MACH_NURI=y
|
||||||
CONFIG_NO_HZ=y
|
CONFIG_NO_HZ=y
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_SMP=y
|
CONFIG_SMP=y
|
||||||
|
|
|
@ -1,104 +0,0 @@
|
||||||
CONFIG_EXPERIMENTAL=y
|
|
||||||
# CONFIG_LOCALVERSION_AUTO is not set
|
|
||||||
# CONFIG_SWAP is not set
|
|
||||||
CONFIG_SYSVIPC=y
|
|
||||||
CONFIG_BLK_DEV_INITRD=y
|
|
||||||
# CONFIG_COMPAT_BRK is not set
|
|
||||||
CONFIG_MODULES=y
|
|
||||||
CONFIG_MODULE_UNLOAD=y
|
|
||||||
# CONFIG_BLK_DEV_BSG is not set
|
|
||||||
# CONFIG_IOSCHED_DEADLINE is not set
|
|
||||||
# CONFIG_IOSCHED_CFQ is not set
|
|
||||||
CONFIG_ARCH_AT91=y
|
|
||||||
CONFIG_ARCH_AT91SAM9263=y
|
|
||||||
CONFIG_MACH_NEOCORE926=y
|
|
||||||
CONFIG_MTD_AT91_DATAFLASH_CARD=y
|
|
||||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
|
||||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
|
||||||
CONFIG_FPE_NWFPE=y
|
|
||||||
CONFIG_NET=y
|
|
||||||
CONFIG_PACKET=y
|
|
||||||
CONFIG_UNIX=y
|
|
||||||
CONFIG_NET_KEY=y
|
|
||||||
CONFIG_INET=y
|
|
||||||
CONFIG_IP_PNP=y
|
|
||||||
CONFIG_IP_PNP_DHCP=y
|
|
||||||
CONFIG_IP_PNP_BOOTP=y
|
|
||||||
CONFIG_IP_PNP_RARP=y
|
|
||||||
CONFIG_NET_IPIP=y
|
|
||||||
# CONFIG_INET_LRO is not set
|
|
||||||
CONFIG_IPV6=y
|
|
||||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
|
||||||
# CONFIG_PREVENT_FIRMWARE_BUILD is not set
|
|
||||||
CONFIG_MTD=y
|
|
||||||
CONFIG_MTD_PARTITIONS=y
|
|
||||||
CONFIG_MTD_CHAR=y
|
|
||||||
CONFIG_MTD_BLOCK=y
|
|
||||||
CONFIG_NFTL=y
|
|
||||||
CONFIG_NFTL_RW=y
|
|
||||||
CONFIG_MTD_BLOCK2MTD=y
|
|
||||||
CONFIG_MTD_NAND=y
|
|
||||||
CONFIG_MTD_NAND_ECC_SMC=y
|
|
||||||
CONFIG_MTD_NAND_VERIFY_WRITE=y
|
|
||||||
CONFIG_MTD_NAND_ATMEL=y
|
|
||||||
CONFIG_MTD_NAND_PLATFORM=y
|
|
||||||
CONFIG_BLK_DEV_LOOP=y
|
|
||||||
CONFIG_BLK_DEV_NBD=y
|
|
||||||
CONFIG_ATMEL_PWM=y
|
|
||||||
CONFIG_ATMEL_TCLIB=y
|
|
||||||
CONFIG_SCSI=y
|
|
||||||
CONFIG_CHR_DEV_SG=y
|
|
||||||
CONFIG_NETDEVICES=y
|
|
||||||
CONFIG_SMSC_PHY=y
|
|
||||||
CONFIG_NET_ETHERNET=y
|
|
||||||
CONFIG_MACB=y
|
|
||||||
# CONFIG_NETDEV_1000 is not set
|
|
||||||
# CONFIG_NETDEV_10000 is not set
|
|
||||||
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
|
||||||
CONFIG_INPUT_EVDEV=y
|
|
||||||
CONFIG_INPUT_TOUCHSCREEN=y
|
|
||||||
CONFIG_TOUCHSCREEN_ADS7846=y
|
|
||||||
CONFIG_VT_HW_CONSOLE_BINDING=y
|
|
||||||
# CONFIG_DEVKMEM is not set
|
|
||||||
CONFIG_SERIAL_NONSTANDARD=y
|
|
||||||
CONFIG_SERIAL_ATMEL=y
|
|
||||||
CONFIG_SERIAL_ATMEL_CONSOLE=y
|
|
||||||
# CONFIG_SERIAL_ATMEL_PDC is not set
|
|
||||||
# CONFIG_HW_RANDOM is not set
|
|
||||||
CONFIG_I2C=y
|
|
||||||
CONFIG_I2C_CHARDEV=y
|
|
||||||
CONFIG_SPI=y
|
|
||||||
CONFIG_SPI_ATMEL=y
|
|
||||||
# CONFIG_HWMON is not set
|
|
||||||
CONFIG_VIDEO_OUTPUT_CONTROL=y
|
|
||||||
CONFIG_FB=y
|
|
||||||
CONFIG_FB_ATMEL=y
|
|
||||||
CONFIG_BACKLIGHT_LCD_SUPPORT=y
|
|
||||||
CONFIG_LCD_CLASS_DEVICE=y
|
|
||||||
CONFIG_BACKLIGHT_CLASS_DEVICE=y
|
|
||||||
CONFIG_BACKLIGHT_ATMEL_LCDC=y
|
|
||||||
# CONFIG_VGA_CONSOLE is not set
|
|
||||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
|
||||||
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
|
|
||||||
CONFIG_LOGO=y
|
|
||||||
CONFIG_USB=y
|
|
||||||
CONFIG_USB_DEVICEFS=y
|
|
||||||
CONFIG_USB_MON=y
|
|
||||||
CONFIG_USB_OHCI_HCD=y
|
|
||||||
CONFIG_USB_STORAGE=y
|
|
||||||
CONFIG_MMC=y
|
|
||||||
CONFIG_SDIO_UART=y
|
|
||||||
CONFIG_MMC_AT91=m
|
|
||||||
CONFIG_EXT2_FS=y
|
|
||||||
# CONFIG_DNOTIFY is not set
|
|
||||||
CONFIG_AUTOFS_FS=y
|
|
||||||
CONFIG_VFAT_FS=y
|
|
||||||
CONFIG_TMPFS=y
|
|
||||||
CONFIG_JFFS2_FS=y
|
|
||||||
CONFIG_JFFS2_FS_WBUF_VERIFY=y
|
|
||||||
CONFIG_NFS_FS=y
|
|
||||||
CONFIG_ROOT_NFS=y
|
|
||||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
|
||||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
|
||||||
CONFIG_SYSCTL_SYSCALL_CHECK=y
|
|
||||||
# CONFIG_CRYPTO_HW is not set
|
|
|
@ -21,58 +21,22 @@ CONFIG_MODVERSIONS=y
|
||||||
CONFIG_MODULE_SRCVERSION_ALL=y
|
CONFIG_MODULE_SRCVERSION_ALL=y
|
||||||
# CONFIG_BLK_DEV_BSG is not set
|
# CONFIG_BLK_DEV_BSG is not set
|
||||||
CONFIG_ARCH_OMAP=y
|
CONFIG_ARCH_OMAP=y
|
||||||
CONFIG_ARCH_OMAP2=y
|
|
||||||
CONFIG_ARCH_OMAP3=y
|
|
||||||
CONFIG_ARCH_OMAP4=y
|
|
||||||
CONFIG_OMAP_RESET_CLOCKS=y
|
CONFIG_OMAP_RESET_CLOCKS=y
|
||||||
CONFIG_OMAP_MUX_DEBUG=y
|
CONFIG_OMAP_MUX_DEBUG=y
|
||||||
CONFIG_OMAP_32K_TIMER=y
|
|
||||||
CONFIG_MACH_OMAP_GENERIC=y
|
|
||||||
CONFIG_ARCH_OMAP2420=y
|
|
||||||
CONFIG_ARCH_OMAP2430=y
|
|
||||||
CONFIG_ARCH_OMAP3430=y
|
|
||||||
CONFIG_MACH_OMAP_H4=y
|
|
||||||
CONFIG_MACH_OMAP_APOLLON=y
|
|
||||||
CONFIG_MACH_OMAP_2430SDP=y
|
|
||||||
CONFIG_MACH_OMAP3_BEAGLE=y
|
|
||||||
CONFIG_MACH_DEVKIT8000=y
|
|
||||||
CONFIG_MACH_OMAP_LDP=y
|
|
||||||
CONFIG_MACH_OVERO=y
|
|
||||||
CONFIG_MACH_OMAP3EVM=y
|
|
||||||
CONFIG_MACH_OMAP3517EVM=y
|
|
||||||
CONFIG_MACH_OMAP3_PANDORA=y
|
|
||||||
CONFIG_MACH_OMAP3_TOUCHBOOK=y
|
|
||||||
CONFIG_MACH_OMAP_3430SDP=y
|
|
||||||
CONFIG_MACH_NOKIA_N8X0=y
|
|
||||||
CONFIG_MACH_NOKIA_RX51=y
|
|
||||||
CONFIG_MACH_OMAP_ZOOM2=y
|
|
||||||
CONFIG_MACH_OMAP_ZOOM3=y
|
|
||||||
CONFIG_MACH_CM_T35=y
|
|
||||||
CONFIG_MACH_IGEP0020=y
|
|
||||||
CONFIG_MACH_SBC3530=y
|
|
||||||
CONFIG_MACH_OMAP_3630SDP=y
|
|
||||||
CONFIG_MACH_OMAP_4430SDP=y
|
|
||||||
CONFIG_ARM_THUMBEE=y
|
CONFIG_ARM_THUMBEE=y
|
||||||
CONFIG_ARM_L1_CACHE_SHIFT=5
|
|
||||||
CONFIG_ARM_ERRATA_411920=y
|
CONFIG_ARM_ERRATA_411920=y
|
||||||
CONFIG_NO_HZ=y
|
CONFIG_NO_HZ=y
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_SMP=y
|
CONFIG_SMP=y
|
||||||
CONFIG_NR_CPUS=2
|
CONFIG_NR_CPUS=2
|
||||||
# CONFIG_LOCAL_TIMERS is not set
|
|
||||||
CONFIG_AEABI=y
|
|
||||||
CONFIG_LEDS=y
|
CONFIG_LEDS=y
|
||||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||||
CONFIG_CMDLINE="root=/dev/mmcblk0p2 rootwait console=ttyO2,115200"
|
CONFIG_CMDLINE="root=/dev/mmcblk0p2 rootwait console=ttyO2,115200"
|
||||||
CONFIG_KEXEC=y
|
CONFIG_KEXEC=y
|
||||||
CONFIG_FPE_NWFPE=y
|
CONFIG_FPE_NWFPE=y
|
||||||
CONFIG_VFP=y
|
|
||||||
CONFIG_NEON=y
|
|
||||||
CONFIG_BINFMT_MISC=y
|
CONFIG_BINFMT_MISC=y
|
||||||
CONFIG_PM=y
|
|
||||||
CONFIG_PM_DEBUG=y
|
CONFIG_PM_DEBUG=y
|
||||||
CONFIG_PM_RUNTIME=y
|
|
||||||
CONFIG_NET=y
|
CONFIG_NET=y
|
||||||
CONFIG_PACKET=y
|
CONFIG_PACKET=y
|
||||||
CONFIG_UNIX=y
|
CONFIG_UNIX=y
|
||||||
|
@ -89,14 +53,6 @@ CONFIG_IP_PNP_RARP=y
|
||||||
# CONFIG_IPV6 is not set
|
# CONFIG_IPV6 is not set
|
||||||
CONFIG_NETFILTER=y
|
CONFIG_NETFILTER=y
|
||||||
CONFIG_BT=m
|
CONFIG_BT=m
|
||||||
CONFIG_BT_L2CAP=m
|
|
||||||
CONFIG_BT_SCO=m
|
|
||||||
CONFIG_BT_RFCOMM=y
|
|
||||||
CONFIG_BT_RFCOMM_TTY=y
|
|
||||||
CONFIG_BT_BNEP=m
|
|
||||||
CONFIG_BT_BNEP_MC_FILTER=y
|
|
||||||
CONFIG_BT_BNEP_PROTO_FILTER=y
|
|
||||||
CONFIG_BT_HIDP=m
|
|
||||||
CONFIG_BT_HCIUART=m
|
CONFIG_BT_HCIUART=m
|
||||||
CONFIG_BT_HCIUART_H4=y
|
CONFIG_BT_HCIUART_H4=y
|
||||||
CONFIG_BT_HCIUART_BCSP=y
|
CONFIG_BT_HCIUART_BCSP=y
|
||||||
|
@ -107,11 +63,9 @@ CONFIG_CFG80211=m
|
||||||
CONFIG_MAC80211=m
|
CONFIG_MAC80211=m
|
||||||
CONFIG_MAC80211_RC_PID=y
|
CONFIG_MAC80211_RC_PID=y
|
||||||
CONFIG_MAC80211_RC_DEFAULT_PID=y
|
CONFIG_MAC80211_RC_DEFAULT_PID=y
|
||||||
CONFIG_MAC80211_LEDS=y
|
|
||||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||||
CONFIG_CONNECTOR=y
|
CONFIG_CONNECTOR=y
|
||||||
CONFIG_MTD=y
|
CONFIG_MTD=y
|
||||||
CONFIG_MTD_CONCAT=y
|
|
||||||
CONFIG_MTD_CMDLINE_PARTS=y
|
CONFIG_MTD_CMDLINE_PARTS=y
|
||||||
CONFIG_MTD_CHAR=y
|
CONFIG_MTD_CHAR=y
|
||||||
CONFIG_MTD_BLOCK=y
|
CONFIG_MTD_BLOCK=y
|
||||||
|
@ -127,7 +81,6 @@ CONFIG_MTD_UBI=y
|
||||||
CONFIG_BLK_DEV_LOOP=y
|
CONFIG_BLK_DEV_LOOP=y
|
||||||
CONFIG_BLK_DEV_RAM=y
|
CONFIG_BLK_DEV_RAM=y
|
||||||
CONFIG_BLK_DEV_RAM_SIZE=16384
|
CONFIG_BLK_DEV_RAM_SIZE=16384
|
||||||
CONFIG_EEPROM_LEGACY=y
|
|
||||||
CONFIG_SCSI=y
|
CONFIG_SCSI=y
|
||||||
CONFIG_BLK_DEV_SD=y
|
CONFIG_BLK_DEV_SD=y
|
||||||
CONFIG_SCSI_MULTI_LUN=y
|
CONFIG_SCSI_MULTI_LUN=y
|
||||||
|
@ -158,19 +111,15 @@ CONFIG_TOUCHSCREEN_ADS7846=y
|
||||||
CONFIG_INPUT_MISC=y
|
CONFIG_INPUT_MISC=y
|
||||||
CONFIG_INPUT_TWL4030_PWRBUTTON=y
|
CONFIG_INPUT_TWL4030_PWRBUTTON=y
|
||||||
CONFIG_VT_HW_CONSOLE_BINDING=y
|
CONFIG_VT_HW_CONSOLE_BINDING=y
|
||||||
CONFIG_SERIAL_8250=y
|
# CONFIG_LEGACY_PTYS is not set
|
||||||
CONFIG_SERIAL_8250_CONSOLE=y
|
|
||||||
CONFIG_SERIAL_8250_NR_UARTS=32
|
CONFIG_SERIAL_8250_NR_UARTS=32
|
||||||
CONFIG_SERIAL_8250_EXTENDED=y
|
CONFIG_SERIAL_8250_EXTENDED=y
|
||||||
CONFIG_SERIAL_8250_MANY_PORTS=y
|
CONFIG_SERIAL_8250_MANY_PORTS=y
|
||||||
CONFIG_SERIAL_8250_SHARE_IRQ=y
|
CONFIG_SERIAL_8250_SHARE_IRQ=y
|
||||||
CONFIG_SERIAL_8250_DETECT_IRQ=y
|
CONFIG_SERIAL_8250_DETECT_IRQ=y
|
||||||
CONFIG_SERIAL_8250_RSA=y
|
CONFIG_SERIAL_8250_RSA=y
|
||||||
# CONFIG_LEGACY_PTYS is not set
|
|
||||||
CONFIG_HW_RANDOM=y
|
CONFIG_HW_RANDOM=y
|
||||||
CONFIG_I2C=y
|
|
||||||
CONFIG_I2C_CHARDEV=y
|
CONFIG_I2C_CHARDEV=y
|
||||||
CONFIG_I2C_OMAP=y
|
|
||||||
CONFIG_SPI=y
|
CONFIG_SPI=y
|
||||||
CONFIG_SPI_OMAP24XX=y
|
CONFIG_SPI_OMAP24XX=y
|
||||||
CONFIG_DEBUG_GPIO=y
|
CONFIG_DEBUG_GPIO=y
|
||||||
|
@ -181,10 +130,6 @@ CONFIG_POWER_SUPPLY=y
|
||||||
CONFIG_WATCHDOG=y
|
CONFIG_WATCHDOG=y
|
||||||
CONFIG_OMAP_WATCHDOG=y
|
CONFIG_OMAP_WATCHDOG=y
|
||||||
CONFIG_TWL4030_WATCHDOG=y
|
CONFIG_TWL4030_WATCHDOG=y
|
||||||
CONFIG_MENELAUS=y
|
|
||||||
CONFIG_TWL4030_CORE=y
|
|
||||||
CONFIG_TWL4030_POWER=y
|
|
||||||
CONFIG_REGULATOR=y
|
|
||||||
CONFIG_REGULATOR_TWL4030=y
|
CONFIG_REGULATOR_TWL4030=y
|
||||||
CONFIG_REGULATOR_TPS65023=y
|
CONFIG_REGULATOR_TPS65023=y
|
||||||
CONFIG_REGULATOR_TPS6507X=y
|
CONFIG_REGULATOR_TPS6507X=y
|
||||||
|
@ -208,7 +153,6 @@ CONFIG_BACKLIGHT_LCD_SUPPORT=y
|
||||||
CONFIG_LCD_CLASS_DEVICE=y
|
CONFIG_LCD_CLASS_DEVICE=y
|
||||||
CONFIG_LCD_PLATFORM=y
|
CONFIG_LCD_PLATFORM=y
|
||||||
CONFIG_DISPLAY_SUPPORT=y
|
CONFIG_DISPLAY_SUPPORT=y
|
||||||
# CONFIG_VGA_CONSOLE is not set
|
|
||||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||||
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
|
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
|
||||||
CONFIG_FONTS=y
|
CONFIG_FONTS=y
|
||||||
|
@ -217,25 +161,20 @@ CONFIG_FONT_8x16=y
|
||||||
CONFIG_LOGO=y
|
CONFIG_LOGO=y
|
||||||
CONFIG_SOUND=m
|
CONFIG_SOUND=m
|
||||||
CONFIG_SND=m
|
CONFIG_SND=m
|
||||||
CONFIG_SND_MIXER_OSS=y
|
CONFIG_SND_MIXER_OSS=m
|
||||||
CONFIG_SND_PCM_OSS=y
|
CONFIG_SND_PCM_OSS=m
|
||||||
CONFIG_SND_VERBOSE_PRINTK=y
|
CONFIG_SND_VERBOSE_PRINTK=y
|
||||||
CONFIG_SND_DEBUG=y
|
CONFIG_SND_DEBUG=y
|
||||||
CONFIG_SND_USB_AUDIO=y
|
CONFIG_SND_USB_AUDIO=m
|
||||||
CONFIG_SND_SOC=y
|
CONFIG_SND_SOC=m
|
||||||
CONFIG_SND_OMAP_SOC=y
|
CONFIG_SND_OMAP_SOC=m
|
||||||
CONFIG_SND_OMAP_SOC_OMAP3_PANDORA=y
|
CONFIG_SND_OMAP_SOC_OMAP3_PANDORA=m
|
||||||
CONFIG_USB=y
|
CONFIG_USB=y
|
||||||
CONFIG_USB_DEBUG=y
|
CONFIG_USB_DEBUG=y
|
||||||
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
||||||
CONFIG_USB_DEVICEFS=y
|
CONFIG_USB_DEVICEFS=y
|
||||||
CONFIG_USB_SUSPEND=y
|
CONFIG_USB_SUSPEND=y
|
||||||
# CONFIG_USB_OTG_WHITELIST is not set
|
|
||||||
CONFIG_USB_MON=y
|
CONFIG_USB_MON=y
|
||||||
# CONFIG_USB_MUSB_HDRC is not set
|
|
||||||
# CONFIG_USB_MUSB_OTG is not set
|
|
||||||
# CONFIG_USB_GADGET_MUSB_HDRC is not set
|
|
||||||
CONFIG_USB_MUSB_DEBUG=y
|
|
||||||
CONFIG_USB_WDM=y
|
CONFIG_USB_WDM=y
|
||||||
CONFIG_USB_STORAGE=y
|
CONFIG_USB_STORAGE=y
|
||||||
CONFIG_USB_LIBUSUAL=y
|
CONFIG_USB_LIBUSUAL=y
|
||||||
|
@ -250,18 +189,12 @@ CONFIG_MMC_UNSAFE_RESUME=y
|
||||||
CONFIG_SDIO_UART=y
|
CONFIG_SDIO_UART=y
|
||||||
CONFIG_MMC_OMAP=y
|
CONFIG_MMC_OMAP=y
|
||||||
CONFIG_MMC_OMAP_HS=y
|
CONFIG_MMC_OMAP_HS=y
|
||||||
CONFIG_LEDS_CLASS=y
|
|
||||||
CONFIG_LEDS_GPIO=y
|
|
||||||
CONFIG_LEDS_TRIGGER_TIMER=y
|
|
||||||
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
|
|
||||||
CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
|
|
||||||
CONFIG_RTC_CLASS=y
|
CONFIG_RTC_CLASS=y
|
||||||
CONFIG_RTC_DRV_TWL92330=y
|
CONFIG_RTC_DRV_TWL92330=y
|
||||||
CONFIG_RTC_DRV_TWL4030=y
|
CONFIG_RTC_DRV_TWL4030=y
|
||||||
CONFIG_EXT2_FS=y
|
CONFIG_EXT2_FS=y
|
||||||
CONFIG_EXT3_FS=y
|
CONFIG_EXT3_FS=y
|
||||||
# CONFIG_EXT3_FS_XATTR is not set
|
# CONFIG_EXT3_FS_XATTR is not set
|
||||||
CONFIG_INOTIFY=y
|
|
||||||
CONFIG_QUOTA=y
|
CONFIG_QUOTA=y
|
||||||
CONFIG_QFMT_V2=y
|
CONFIG_QFMT_V2=y
|
||||||
CONFIG_MSDOS_FS=y
|
CONFIG_MSDOS_FS=y
|
||||||
|
@ -285,12 +218,10 @@ CONFIG_NLS_CODEPAGE_437=y
|
||||||
CONFIG_NLS_ISO8859_1=y
|
CONFIG_NLS_ISO8859_1=y
|
||||||
CONFIG_PRINTK_TIME=y
|
CONFIG_PRINTK_TIME=y
|
||||||
CONFIG_MAGIC_SYSRQ=y
|
CONFIG_MAGIC_SYSRQ=y
|
||||||
CONFIG_DEBUG_FS=y
|
|
||||||
CONFIG_DEBUG_KERNEL=y
|
CONFIG_DEBUG_KERNEL=y
|
||||||
CONFIG_SCHEDSTATS=y
|
CONFIG_SCHEDSTATS=y
|
||||||
CONFIG_TIMER_STATS=y
|
CONFIG_TIMER_STATS=y
|
||||||
CONFIG_PROVE_LOCKING=y
|
CONFIG_PROVE_LOCKING=y
|
||||||
# CONFIG_LOCK_STAT is not set
|
|
||||||
CONFIG_DEBUG_SPINLOCK_SLEEP=y
|
CONFIG_DEBUG_SPINLOCK_SLEEP=y
|
||||||
# CONFIG_DEBUG_BUGVERBOSE is not set
|
# CONFIG_DEBUG_BUGVERBOSE is not set
|
||||||
CONFIG_DEBUG_INFO=y
|
CONFIG_DEBUG_INFO=y
|
||||||
|
|
|
@ -1,65 +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_S5P6442=y
|
|
||||||
CONFIG_S3C_LOWLEVEL_UART_PORT=1
|
|
||||||
CONFIG_MACH_SMDK6442=y
|
|
||||||
CONFIG_CPU_32v6K=y
|
|
||||||
CONFIG_AEABI=y
|
|
||||||
CONFIG_CMDLINE="root=/dev/ram0 rw ramdisk=8192 initrd=0x20800000,8M console=ttySAC1,115200 init=/linuxrc"
|
|
||||||
CONFIG_FPE_NWFPE=y
|
|
||||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
|
||||||
# CONFIG_PREVENT_FIRMWARE_BUILD is not set
|
|
||||||
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_8250_NR_UARTS=3
|
|
||||||
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_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_ARM_UNWIND is not set
|
|
||||||
CONFIG_DEBUG_USER=y
|
|
||||||
CONFIG_DEBUG_ERRORS=y
|
|
||||||
CONFIG_DEBUG_LL=y
|
|
||||||
CONFIG_DEBUG_S3C_UART=1
|
|
||||||
CONFIG_CRC_CCITT=y
|
|
|
@ -1,106 +0,0 @@
|
||||||
CONFIG_EXPERIMENTAL=y
|
|
||||||
# CONFIG_LOCALVERSION_AUTO is not set
|
|
||||||
# CONFIG_SWAP is not set
|
|
||||||
CONFIG_SYSVIPC=y
|
|
||||||
CONFIG_LOG_BUF_SHIFT=14
|
|
||||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
|
||||||
CONFIG_SLAB=y
|
|
||||||
CONFIG_MODULES=y
|
|
||||||
CONFIG_MODULE_UNLOAD=y
|
|
||||||
# CONFIG_BLK_DEV_BSG is not set
|
|
||||||
# CONFIG_IOSCHED_DEADLINE is not set
|
|
||||||
# CONFIG_IOSCHED_CFQ is not set
|
|
||||||
CONFIG_ARCH_AT91=y
|
|
||||||
CONFIG_ARCH_AT91SAM9263=y
|
|
||||||
CONFIG_MACH_USB_A9263=y
|
|
||||||
CONFIG_AT91_SLOW_CLOCK=y
|
|
||||||
# CONFIG_ARM_THUMB is not set
|
|
||||||
CONFIG_AEABI=y
|
|
||||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
|
||||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
|
||||||
CONFIG_CMDLINE="mem=64M console=ttyS0,115200"
|
|
||||||
CONFIG_FPE_NWFPE=y
|
|
||||||
CONFIG_PM=y
|
|
||||||
CONFIG_NET=y
|
|
||||||
CONFIG_PACKET=y
|
|
||||||
CONFIG_UNIX=y
|
|
||||||
CONFIG_INET=y
|
|
||||||
CONFIG_IP_MULTICAST=y
|
|
||||||
CONFIG_IP_ADVANCED_ROUTER=y
|
|
||||||
CONFIG_IP_ROUTE_VERBOSE=y
|
|
||||||
CONFIG_IP_PNP=y
|
|
||||||
CONFIG_IP_PNP_BOOTP=y
|
|
||||||
CONFIG_IP_PNP_RARP=y
|
|
||||||
CONFIG_IP_MROUTE=y
|
|
||||||
CONFIG_IP_PIMSM_V1=y
|
|
||||||
CONFIG_IP_PIMSM_V2=y
|
|
||||||
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
|
|
||||||
# CONFIG_INET_XFRM_MODE_TUNNEL is not set
|
|
||||||
# CONFIG_INET_XFRM_MODE_BEET is not set
|
|
||||||
# CONFIG_INET_LRO is not set
|
|
||||||
# CONFIG_INET_DIAG is not set
|
|
||||||
# CONFIG_IPV6 is not set
|
|
||||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
|
||||||
CONFIG_MTD=y
|
|
||||||
CONFIG_MTD_PARTITIONS=y
|
|
||||||
CONFIG_MTD_CMDLINE_PARTS=y
|
|
||||||
CONFIG_MTD_CHAR=y
|
|
||||||
CONFIG_MTD_BLOCK=y
|
|
||||||
CONFIG_MTD_DATAFLASH=y
|
|
||||||
CONFIG_MTD_NAND=y
|
|
||||||
CONFIG_MTD_NAND_ATMEL=y
|
|
||||||
CONFIG_MTD_NAND_ATMEL_ECC_SOFT=y
|
|
||||||
CONFIG_BLK_DEV_LOOP=y
|
|
||||||
# CONFIG_MISC_DEVICES is not set
|
|
||||||
CONFIG_SCSI=y
|
|
||||||
CONFIG_BLK_DEV_SD=y
|
|
||||||
CONFIG_SCSI_MULTI_LUN=y
|
|
||||||
CONFIG_NETDEVICES=y
|
|
||||||
CONFIG_NET_ETHERNET=y
|
|
||||||
CONFIG_MII=y
|
|
||||||
CONFIG_MACB=y
|
|
||||||
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
|
||||||
CONFIG_INPUT_EVDEV=y
|
|
||||||
CONFIG_INPUT_EVBUG=y
|
|
||||||
# CONFIG_KEYBOARD_ATKBD is not set
|
|
||||||
CONFIG_KEYBOARD_GPIO=y
|
|
||||||
# CONFIG_INPUT_MOUSE is not set
|
|
||||||
# CONFIG_SERIO is not set
|
|
||||||
CONFIG_SERIAL_ATMEL=y
|
|
||||||
CONFIG_SERIAL_ATMEL_CONSOLE=y
|
|
||||||
CONFIG_HW_RANDOM=y
|
|
||||||
CONFIG_SPI=y
|
|
||||||
CONFIG_SPI_ATMEL=y
|
|
||||||
# CONFIG_HWMON is not set
|
|
||||||
# CONFIG_VGA_CONSOLE is not set
|
|
||||||
# CONFIG_USB_HID is not set
|
|
||||||
CONFIG_USB=y
|
|
||||||
CONFIG_USB_DEVICEFS=y
|
|
||||||
CONFIG_USB_MON=y
|
|
||||||
CONFIG_USB_OHCI_HCD=y
|
|
||||||
CONFIG_USB_STORAGE=y
|
|
||||||
CONFIG_USB_GADGET=y
|
|
||||||
CONFIG_USB_ETH=m
|
|
||||||
CONFIG_NEW_LEDS=y
|
|
||||||
CONFIG_LEDS_CLASS=y
|
|
||||||
CONFIG_LEDS_GPIO=y
|
|
||||||
CONFIG_LEDS_TRIGGERS=y
|
|
||||||
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
|
|
||||||
CONFIG_EXT2_FS=y
|
|
||||||
CONFIG_INOTIFY=y
|
|
||||||
CONFIG_FUSE_FS=m
|
|
||||||
CONFIG_VFAT_FS=y
|
|
||||||
CONFIG_TMPFS=y
|
|
||||||
CONFIG_JFFS2_FS=y
|
|
||||||
CONFIG_NFS_FS=y
|
|
||||||
CONFIG_NFS_V3=y
|
|
||||||
CONFIG_NFS_V3_ACL=y
|
|
||||||
CONFIG_NFS_V4=y
|
|
||||||
CONFIG_ROOT_NFS=y
|
|
||||||
CONFIG_NLS_CODEPAGE_437=y
|
|
||||||
CONFIG_NLS_CODEPAGE_850=y
|
|
||||||
CONFIG_NLS_ISO8859_1=y
|
|
||||||
CONFIG_DEBUG_KERNEL=y
|
|
||||||
CONFIG_DEBUG_USER=y
|
|
||||||
CONFIG_DEBUG_LL=y
|
|
||||||
# CONFIG_CRYPTO_HW is not set
|
|
|
@ -203,8 +203,6 @@ extern int _find_next_bit_be(const unsigned long *p, int size, int offset);
|
||||||
#define find_first_bit(p,sz) _find_first_bit_le(p,sz)
|
#define find_first_bit(p,sz) _find_first_bit_le(p,sz)
|
||||||
#define find_next_bit(p,sz,off) _find_next_bit_le(p,sz,off)
|
#define find_next_bit(p,sz,off) _find_next_bit_le(p,sz,off)
|
||||||
|
|
||||||
#define WORD_BITOFF_TO_LE(x) ((x))
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
/*
|
/*
|
||||||
* These are the big endian, atomic definitions.
|
* These are the big endian, atomic definitions.
|
||||||
|
@ -214,8 +212,6 @@ extern int _find_next_bit_be(const unsigned long *p, int size, int offset);
|
||||||
#define find_first_bit(p,sz) _find_first_bit_be(p,sz)
|
#define find_first_bit(p,sz) _find_first_bit_be(p,sz)
|
||||||
#define find_next_bit(p,sz,off) _find_next_bit_be(p,sz,off)
|
#define find_next_bit(p,sz,off) _find_next_bit_be(p,sz,off)
|
||||||
|
|
||||||
#define WORD_BITOFF_TO_LE(x) ((x) ^ 0x18)
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if __LINUX_ARM_ARCH__ < 5
|
#if __LINUX_ARM_ARCH__ < 5
|
||||||
|
@ -287,55 +283,29 @@ static inline int fls(int x)
|
||||||
#include <asm-generic/bitops/hweight.h>
|
#include <asm-generic/bitops/hweight.h>
|
||||||
#include <asm-generic/bitops/lock.h>
|
#include <asm-generic/bitops/lock.h>
|
||||||
|
|
||||||
static inline void __set_bit_le(int nr, void *addr)
|
#ifdef __ARMEB__
|
||||||
{
|
|
||||||
__set_bit(WORD_BITOFF_TO_LE(nr), addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void __clear_bit_le(int nr, void *addr)
|
|
||||||
{
|
|
||||||
__clear_bit(WORD_BITOFF_TO_LE(nr), addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int __test_and_set_bit_le(int nr, void *addr)
|
|
||||||
{
|
|
||||||
return __test_and_set_bit(WORD_BITOFF_TO_LE(nr), addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int test_and_set_bit_le(int nr, void *addr)
|
|
||||||
{
|
|
||||||
return test_and_set_bit(WORD_BITOFF_TO_LE(nr), addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int __test_and_clear_bit_le(int nr, void *addr)
|
|
||||||
{
|
|
||||||
return __test_and_clear_bit(WORD_BITOFF_TO_LE(nr), addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int test_and_clear_bit_le(int nr, void *addr)
|
|
||||||
{
|
|
||||||
return test_and_clear_bit(WORD_BITOFF_TO_LE(nr), addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int test_bit_le(int nr, const void *addr)
|
|
||||||
{
|
|
||||||
return test_bit(WORD_BITOFF_TO_LE(nr), addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int find_first_zero_bit_le(const void *p, unsigned size)
|
static inline int find_first_zero_bit_le(const void *p, unsigned size)
|
||||||
{
|
{
|
||||||
return _find_first_zero_bit_le(p, size);
|
return _find_first_zero_bit_le(p, size);
|
||||||
}
|
}
|
||||||
|
#define find_first_zero_bit_le find_first_zero_bit_le
|
||||||
|
|
||||||
static inline int find_next_zero_bit_le(const void *p, int size, int offset)
|
static inline int find_next_zero_bit_le(const void *p, int size, int offset)
|
||||||
{
|
{
|
||||||
return _find_next_zero_bit_le(p, size, offset);
|
return _find_next_zero_bit_le(p, size, offset);
|
||||||
}
|
}
|
||||||
|
#define find_next_zero_bit_le find_next_zero_bit_le
|
||||||
|
|
||||||
static inline int find_next_bit_le(const void *p, int size, int offset)
|
static inline int find_next_bit_le(const void *p, int size, int offset)
|
||||||
{
|
{
|
||||||
return _find_next_bit_le(p, size, offset);
|
return _find_next_bit_le(p, size, offset);
|
||||||
}
|
}
|
||||||
|
#define find_next_bit_le find_next_bit_le
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <asm-generic/bitops/le.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Ext2 is defined to use little-endian byte ordering.
|
* Ext2 is defined to use little-endian byte ordering.
|
||||||
|
|
|
@ -4,6 +4,13 @@
|
||||||
* Support for FIQ on ARM architectures.
|
* Support for FIQ on ARM architectures.
|
||||||
* Written by Philip Blundell <philb@gnu.org>, 1998
|
* Written by Philip Blundell <philb@gnu.org>, 1998
|
||||||
* Re-written by Russell King
|
* Re-written by Russell King
|
||||||
|
*
|
||||||
|
* NOTE: The FIQ mode registers are not magically preserved across
|
||||||
|
* suspend/resume.
|
||||||
|
*
|
||||||
|
* Drivers which require these registers to be preserved across power
|
||||||
|
* management operations must implement appropriate suspend/resume handlers to
|
||||||
|
* save and restore them.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __ASM_FIQ_H
|
#ifndef __ASM_FIQ_H
|
||||||
|
@ -29,9 +36,21 @@ struct fiq_handler {
|
||||||
extern int claim_fiq(struct fiq_handler *f);
|
extern int claim_fiq(struct fiq_handler *f);
|
||||||
extern void release_fiq(struct fiq_handler *f);
|
extern void release_fiq(struct fiq_handler *f);
|
||||||
extern void set_fiq_handler(void *start, unsigned int length);
|
extern void set_fiq_handler(void *start, unsigned int length);
|
||||||
extern void set_fiq_regs(struct pt_regs *regs);
|
|
||||||
extern void get_fiq_regs(struct pt_regs *regs);
|
|
||||||
extern void enable_fiq(int fiq);
|
extern void enable_fiq(int fiq);
|
||||||
extern void disable_fiq(int fiq);
|
extern void disable_fiq(int fiq);
|
||||||
|
|
||||||
|
/* helpers defined in fiqasm.S: */
|
||||||
|
extern void __set_fiq_regs(unsigned long const *regs);
|
||||||
|
extern void __get_fiq_regs(unsigned long *regs);
|
||||||
|
|
||||||
|
static inline void set_fiq_regs(struct pt_regs const *regs)
|
||||||
|
{
|
||||||
|
__set_fiq_regs(®s->ARM_r8);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void get_fiq_regs(struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
__get_fiq_regs(®s->ARM_r8);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -18,6 +18,8 @@ struct machine_desc {
|
||||||
unsigned int nr; /* architecture number */
|
unsigned int nr; /* architecture number */
|
||||||
const char *name; /* architecture name */
|
const char *name; /* architecture name */
|
||||||
unsigned long boot_params; /* tagged list */
|
unsigned long boot_params; /* tagged list */
|
||||||
|
const char **dt_compat; /* array of device tree
|
||||||
|
* 'compatible' strings */
|
||||||
|
|
||||||
unsigned int nr_irqs; /* number of IRQs */
|
unsigned int nr_irqs; /* number of IRQs */
|
||||||
|
|
||||||
|
@ -47,6 +49,13 @@ struct machine_desc {
|
||||||
*/
|
*/
|
||||||
extern struct machine_desc *machine_desc;
|
extern struct machine_desc *machine_desc;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Machine type table - also only accessible during boot
|
||||||
|
*/
|
||||||
|
extern struct machine_desc __arch_info_begin[], __arch_info_end[];
|
||||||
|
#define for_each_machine_desc(p) \
|
||||||
|
for (p = __arch_info_begin; p < __arch_info_end; p++)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set of macros to define architecture features. This is built into
|
* Set of macros to define architecture features. This is built into
|
||||||
* a table by the linker.
|
* a table by the linker.
|
||||||
|
|
|
@ -197,7 +197,7 @@ typedef unsigned long pgprot_t;
|
||||||
|
|
||||||
typedef struct page *pgtable_t;
|
typedef struct page *pgtable_t;
|
||||||
|
|
||||||
#ifndef CONFIG_SPARSEMEM
|
#ifdef CONFIG_HAVE_ARCH_PFN_VALID
|
||||||
extern int pfn_valid(unsigned long);
|
extern int pfn_valid(unsigned long);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
* arch/arm/include/asm/prom.h
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Canonical Ltd. <jeremy.kerr@canonical.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 __ASMARM_PROM_H
|
||||||
|
#define __ASMARM_PROM_H
|
||||||
|
|
||||||
|
#ifdef CONFIG_OF
|
||||||
|
|
||||||
|
#include <asm/setup.h>
|
||||||
|
#include <asm/irq.h>
|
||||||
|
|
||||||
|
static inline void irq_dispose_mapping(unsigned int virq)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern struct machine_desc *setup_machine_fdt(unsigned int dt_phys);
|
||||||
|
extern void arm_dt_memblock_reserve(void);
|
||||||
|
|
||||||
|
#else /* CONFIG_OF */
|
||||||
|
|
||||||
|
static inline struct machine_desc *setup_machine_fdt(unsigned int dt_phys)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void arm_dt_memblock_reserve(void) { }
|
||||||
|
|
||||||
|
#endif /* CONFIG_OF */
|
||||||
|
#endif /* ASMARM_PROM_H */
|
|
@ -217,6 +217,10 @@ extern struct meminfo meminfo;
|
||||||
#define bank_phys_end(bank) ((bank)->start + (bank)->size)
|
#define bank_phys_end(bank) ((bank)->start + (bank)->size)
|
||||||
#define bank_phys_size(bank) (bank)->size
|
#define bank_phys_size(bank) (bank)->size
|
||||||
|
|
||||||
|
extern int arm_add_memory(phys_addr_t start, unsigned long size);
|
||||||
|
extern void early_print(const char *str, ...);
|
||||||
|
extern void dump_machine_table(void);
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -70,6 +70,7 @@ extern void platform_smp_prepare_cpus(unsigned int);
|
||||||
*/
|
*/
|
||||||
struct secondary_data {
|
struct secondary_data {
|
||||||
unsigned long pgdir;
|
unsigned long pgdir;
|
||||||
|
unsigned long swapper_pg_dir;
|
||||||
void *stack;
|
void *stack;
|
||||||
};
|
};
|
||||||
extern struct secondary_data secondary_data;
|
extern struct secondary_data secondary_data;
|
||||||
|
|
|
@ -400,6 +400,8 @@
|
||||||
#define __NR_open_by_handle_at (__NR_SYSCALL_BASE+371)
|
#define __NR_open_by_handle_at (__NR_SYSCALL_BASE+371)
|
||||||
#define __NR_clock_adjtime (__NR_SYSCALL_BASE+372)
|
#define __NR_clock_adjtime (__NR_SYSCALL_BASE+372)
|
||||||
#define __NR_syncfs (__NR_SYSCALL_BASE+373)
|
#define __NR_syncfs (__NR_SYSCALL_BASE+373)
|
||||||
|
#define __NR_sendmmsg (__NR_SYSCALL_BASE+374)
|
||||||
|
#define __NR_setns (__NR_SYSCALL_BASE+375)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The following SWIs are ARM private.
|
* The following SWIs are ARM private.
|
||||||
|
|
|
@ -24,7 +24,7 @@ obj-$(CONFIG_OC_ETM) += etm.o
|
||||||
|
|
||||||
obj-$(CONFIG_ISA_DMA_API) += dma.o
|
obj-$(CONFIG_ISA_DMA_API) += dma.o
|
||||||
obj-$(CONFIG_ARCH_ACORN) += ecard.o
|
obj-$(CONFIG_ARCH_ACORN) += ecard.o
|
||||||
obj-$(CONFIG_FIQ) += fiq.o
|
obj-$(CONFIG_FIQ) += fiq.o fiqasm.o
|
||||||
obj-$(CONFIG_MODULES) += armksyms.o module.o
|
obj-$(CONFIG_MODULES) += armksyms.o module.o
|
||||||
obj-$(CONFIG_ARTHUR) += arthur.o
|
obj-$(CONFIG_ARTHUR) += arthur.o
|
||||||
obj-$(CONFIG_ISA_DMA) += dma-isa.o
|
obj-$(CONFIG_ISA_DMA) += dma-isa.o
|
||||||
|
@ -44,6 +44,7 @@ obj-$(CONFIG_ARM_THUMBEE) += thumbee.o
|
||||||
obj-$(CONFIG_KGDB) += kgdb.o
|
obj-$(CONFIG_KGDB) += kgdb.o
|
||||||
obj-$(CONFIG_ARM_UNWIND) += unwind.o
|
obj-$(CONFIG_ARM_UNWIND) += unwind.o
|
||||||
obj-$(CONFIG_HAVE_TCM) += tcm.o
|
obj-$(CONFIG_HAVE_TCM) += tcm.o
|
||||||
|
obj-$(CONFIG_OF) += devtree.o
|
||||||
obj-$(CONFIG_CRASH_DUMP) += crash_dump.o
|
obj-$(CONFIG_CRASH_DUMP) += crash_dump.o
|
||||||
obj-$(CONFIG_SWP_EMULATE) += swp_emulate.o
|
obj-$(CONFIG_SWP_EMULATE) += swp_emulate.o
|
||||||
CFLAGS_swp_emulate.o := -Wa,-march=armv7-a
|
CFLAGS_swp_emulate.o := -Wa,-march=armv7-a
|
||||||
|
|
|
@ -383,6 +383,8 @@
|
||||||
CALL(sys_open_by_handle_at)
|
CALL(sys_open_by_handle_at)
|
||||||
CALL(sys_clock_adjtime)
|
CALL(sys_clock_adjtime)
|
||||||
CALL(sys_syncfs)
|
CALL(sys_syncfs)
|
||||||
|
CALL(sys_sendmmsg)
|
||||||
|
/* 375 */ CALL(sys_setns)
|
||||||
#ifndef syscalls_counted
|
#ifndef syscalls_counted
|
||||||
.equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
|
.equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
|
||||||
#define syscalls_counted
|
#define syscalls_counted
|
||||||
|
|
|
@ -0,0 +1,145 @@
|
||||||
|
/*
|
||||||
|
* linux/arch/arm/kernel/devtree.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Canonical Ltd. <jeremy.kerr@canonical.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/module.h>
|
||||||
|
#include <linux/errno.h>
|
||||||
|
#include <linux/types.h>
|
||||||
|
#include <linux/bootmem.h>
|
||||||
|
#include <linux/memblock.h>
|
||||||
|
#include <linux/of.h>
|
||||||
|
#include <linux/of_fdt.h>
|
||||||
|
#include <linux/of_irq.h>
|
||||||
|
#include <linux/of_platform.h>
|
||||||
|
|
||||||
|
#include <asm/setup.h>
|
||||||
|
#include <asm/page.h>
|
||||||
|
#include <asm/mach/arch.h>
|
||||||
|
#include <asm/mach-types.h>
|
||||||
|
|
||||||
|
void __init early_init_dt_add_memory_arch(u64 base, u64 size)
|
||||||
|
{
|
||||||
|
arm_add_memory(base, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align)
|
||||||
|
{
|
||||||
|
return alloc_bootmem_align(size, align);
|
||||||
|
}
|
||||||
|
|
||||||
|
void __init arm_dt_memblock_reserve(void)
|
||||||
|
{
|
||||||
|
u64 *reserve_map, base, size;
|
||||||
|
|
||||||
|
if (!initial_boot_params)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Reserve the dtb region */
|
||||||
|
memblock_reserve(virt_to_phys(initial_boot_params),
|
||||||
|
be32_to_cpu(initial_boot_params->totalsize));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Process the reserve map. This will probably overlap the initrd
|
||||||
|
* and dtb locations which are already reserved, but overlaping
|
||||||
|
* doesn't hurt anything
|
||||||
|
*/
|
||||||
|
reserve_map = ((void*)initial_boot_params) +
|
||||||
|
be32_to_cpu(initial_boot_params->off_mem_rsvmap);
|
||||||
|
while (1) {
|
||||||
|
base = be64_to_cpup(reserve_map++);
|
||||||
|
size = be64_to_cpup(reserve_map++);
|
||||||
|
if (!size)
|
||||||
|
break;
|
||||||
|
memblock_reserve(base, size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* setup_machine_fdt - Machine setup when an dtb was passed to the kernel
|
||||||
|
* @dt_phys: physical address of dt blob
|
||||||
|
*
|
||||||
|
* If a dtb was passed to the kernel in r2, then use it to choose the
|
||||||
|
* correct machine_desc and to setup the system.
|
||||||
|
*/
|
||||||
|
struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys)
|
||||||
|
{
|
||||||
|
struct boot_param_header *devtree;
|
||||||
|
struct machine_desc *mdesc, *mdesc_best = NULL;
|
||||||
|
unsigned int score, mdesc_score = ~1;
|
||||||
|
unsigned long dt_root;
|
||||||
|
const char *model;
|
||||||
|
|
||||||
|
devtree = phys_to_virt(dt_phys);
|
||||||
|
|
||||||
|
/* check device tree validity */
|
||||||
|
if (be32_to_cpu(devtree->magic) != OF_DT_HEADER)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* Search the mdescs for the 'best' compatible value match */
|
||||||
|
initial_boot_params = devtree;
|
||||||
|
dt_root = of_get_flat_dt_root();
|
||||||
|
for_each_machine_desc(mdesc) {
|
||||||
|
score = of_flat_dt_match(dt_root, mdesc->dt_compat);
|
||||||
|
if (score > 0 && score < mdesc_score) {
|
||||||
|
mdesc_best = mdesc;
|
||||||
|
mdesc_score = score;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!mdesc_best) {
|
||||||
|
const char *prop;
|
||||||
|
long size;
|
||||||
|
|
||||||
|
early_print("\nError: unrecognized/unsupported "
|
||||||
|
"device tree compatible list:\n[ ");
|
||||||
|
|
||||||
|
prop = of_get_flat_dt_prop(dt_root, "compatible", &size);
|
||||||
|
while (size > 0) {
|
||||||
|
early_print("'%s' ", prop);
|
||||||
|
size -= strlen(prop) + 1;
|
||||||
|
prop += strlen(prop) + 1;
|
||||||
|
}
|
||||||
|
early_print("]\n\n");
|
||||||
|
|
||||||
|
dump_machine_table(); /* does not return */
|
||||||
|
}
|
||||||
|
|
||||||
|
model = of_get_flat_dt_prop(dt_root, "model", NULL);
|
||||||
|
if (!model)
|
||||||
|
model = of_get_flat_dt_prop(dt_root, "compatible", NULL);
|
||||||
|
if (!model)
|
||||||
|
model = "<unknown>";
|
||||||
|
pr_info("Machine: %s, model: %s\n", mdesc_best->name, model);
|
||||||
|
|
||||||
|
/* Retrieve various information from the /chosen node */
|
||||||
|
of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line);
|
||||||
|
/* Initialize {size,address}-cells info */
|
||||||
|
of_scan_flat_dt(early_init_dt_scan_root, NULL);
|
||||||
|
/* Setup memory, calling early_init_dt_add_memory_arch */
|
||||||
|
of_scan_flat_dt(early_init_dt_scan_memory, NULL);
|
||||||
|
|
||||||
|
/* Change machine number to match the mdesc we're using */
|
||||||
|
__machine_arch_type = mdesc_best->nr;
|
||||||
|
|
||||||
|
return mdesc_best;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* irq_create_of_mapping - Hook to resolve OF irq specifier into a Linux irq#
|
||||||
|
*
|
||||||
|
* Currently the mapping mechanism is trivial; simple flat hwirq numbers are
|
||||||
|
* mapped 1:1 onto Linux irq numbers. Cascaded irq controllers are not
|
||||||
|
* supported.
|
||||||
|
*/
|
||||||
|
unsigned int irq_create_of_mapping(struct device_node *controller,
|
||||||
|
const u32 *intspec, unsigned int intsize)
|
||||||
|
{
|
||||||
|
return intspec[0];
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(irq_create_of_mapping);
|
|
@ -89,47 +89,6 @@ void set_fiq_handler(void *start, unsigned int length)
|
||||||
flush_icache_range(0x1c, 0x1c + length);
|
flush_icache_range(0x1c, 0x1c + length);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Taking an interrupt in FIQ mode is death, so both these functions
|
|
||||||
* disable irqs for the duration. Note - these functions are almost
|
|
||||||
* entirely coded in assembly.
|
|
||||||
*/
|
|
||||||
void __naked set_fiq_regs(struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
register unsigned long tmp;
|
|
||||||
asm volatile (
|
|
||||||
"mov ip, sp\n\
|
|
||||||
stmfd sp!, {fp, ip, lr, pc}\n\
|
|
||||||
sub fp, ip, #4\n\
|
|
||||||
mrs %0, cpsr\n\
|
|
||||||
msr cpsr_c, %2 @ select FIQ mode\n\
|
|
||||||
mov r0, r0\n\
|
|
||||||
ldmia %1, {r8 - r14}\n\
|
|
||||||
msr cpsr_c, %0 @ return to SVC mode\n\
|
|
||||||
mov r0, r0\n\
|
|
||||||
ldmfd sp, {fp, sp, pc}"
|
|
||||||
: "=&r" (tmp)
|
|
||||||
: "r" (®s->ARM_r8), "I" (PSR_I_BIT | PSR_F_BIT | FIQ_MODE));
|
|
||||||
}
|
|
||||||
|
|
||||||
void __naked get_fiq_regs(struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
register unsigned long tmp;
|
|
||||||
asm volatile (
|
|
||||||
"mov ip, sp\n\
|
|
||||||
stmfd sp!, {fp, ip, lr, pc}\n\
|
|
||||||
sub fp, ip, #4\n\
|
|
||||||
mrs %0, cpsr\n\
|
|
||||||
msr cpsr_c, %2 @ select FIQ mode\n\
|
|
||||||
mov r0, r0\n\
|
|
||||||
stmia %1, {r8 - r14}\n\
|
|
||||||
msr cpsr_c, %0 @ return to SVC mode\n\
|
|
||||||
mov r0, r0\n\
|
|
||||||
ldmfd sp, {fp, sp, pc}"
|
|
||||||
: "=&r" (tmp)
|
|
||||||
: "r" (®s->ARM_r8), "I" (PSR_I_BIT | PSR_F_BIT | FIQ_MODE));
|
|
||||||
}
|
|
||||||
|
|
||||||
int claim_fiq(struct fiq_handler *f)
|
int claim_fiq(struct fiq_handler *f)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
@ -174,8 +133,8 @@ void disable_fiq(int fiq)
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(set_fiq_handler);
|
EXPORT_SYMBOL(set_fiq_handler);
|
||||||
EXPORT_SYMBOL(set_fiq_regs);
|
EXPORT_SYMBOL(__set_fiq_regs); /* defined in fiqasm.S */
|
||||||
EXPORT_SYMBOL(get_fiq_regs);
|
EXPORT_SYMBOL(__get_fiq_regs); /* defined in fiqasm.S */
|
||||||
EXPORT_SYMBOL(claim_fiq);
|
EXPORT_SYMBOL(claim_fiq);
|
||||||
EXPORT_SYMBOL(release_fiq);
|
EXPORT_SYMBOL(release_fiq);
|
||||||
EXPORT_SYMBOL(enable_fiq);
|
EXPORT_SYMBOL(enable_fiq);
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
/*
|
||||||
|
* linux/arch/arm/kernel/fiqasm.S
|
||||||
|
*
|
||||||
|
* Derived from code originally in linux/arch/arm/kernel/fiq.c:
|
||||||
|
*
|
||||||
|
* Copyright (C) 1998 Russell King
|
||||||
|
* Copyright (C) 1998, 1999 Phil Blundell
|
||||||
|
* Copyright (C) 2011, Linaro Limited
|
||||||
|
*
|
||||||
|
* FIQ support written by Philip Blundell <philb@gnu.org>, 1998.
|
||||||
|
*
|
||||||
|
* FIQ support re-written by Russell King to be more generic
|
||||||
|
*
|
||||||
|
* v7/Thumb-2 compatibility modifications by Linaro Limited, 2011.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/linkage.h>
|
||||||
|
#include <asm/assembler.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Taking an interrupt in FIQ mode is death, so both these functions
|
||||||
|
* disable irqs for the duration.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ENTRY(__set_fiq_regs)
|
||||||
|
mov r2, #PSR_I_BIT | PSR_F_BIT | FIQ_MODE
|
||||||
|
mrs r1, cpsr
|
||||||
|
msr cpsr_c, r2 @ select FIQ mode
|
||||||
|
mov r0, r0 @ avoid hazard prior to ARMv4
|
||||||
|
ldmia r0!, {r8 - r12}
|
||||||
|
ldr sp, [r0], #4
|
||||||
|
ldr lr, [r0]
|
||||||
|
msr cpsr_c, r1 @ return to SVC mode
|
||||||
|
mov r0, r0 @ avoid hazard prior to ARMv4
|
||||||
|
mov pc, lr
|
||||||
|
ENDPROC(__set_fiq_regs)
|
||||||
|
|
||||||
|
ENTRY(__get_fiq_regs)
|
||||||
|
mov r2, #PSR_I_BIT | PSR_F_BIT | FIQ_MODE
|
||||||
|
mrs r1, cpsr
|
||||||
|
msr cpsr_c, r2 @ select FIQ mode
|
||||||
|
mov r0, r0 @ avoid hazard prior to ARMv4
|
||||||
|
stmia r0!, {r8 - r12}
|
||||||
|
str sp, [r0], #4
|
||||||
|
str lr, [r0]
|
||||||
|
msr cpsr_c, r1 @ return to SVC mode
|
||||||
|
mov r0, r0 @ avoid hazard prior to ARMv4
|
||||||
|
mov pc, lr
|
||||||
|
ENDPROC(__get_fiq_regs)
|
|
@ -15,6 +15,12 @@
|
||||||
#define ATAG_CORE_SIZE ((2*4 + 3*4) >> 2)
|
#define ATAG_CORE_SIZE ((2*4 + 3*4) >> 2)
|
||||||
#define ATAG_CORE_SIZE_EMPTY ((2*4) >> 2)
|
#define ATAG_CORE_SIZE_EMPTY ((2*4) >> 2)
|
||||||
|
|
||||||
|
#ifdef CONFIG_CPU_BIG_ENDIAN
|
||||||
|
#define OF_DT_MAGIC 0xd00dfeed
|
||||||
|
#else
|
||||||
|
#define OF_DT_MAGIC 0xedfe0dd0 /* 0xd00dfeed in big-endian */
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Exception handling. Something went wrong and we can't proceed. We
|
* Exception handling. Something went wrong and we can't proceed. We
|
||||||
* ought to tell the user, but since we don't have any guarantee that
|
* ought to tell the user, but since we don't have any guarantee that
|
||||||
|
@ -28,20 +34,26 @@
|
||||||
|
|
||||||
/* Determine validity of the r2 atags pointer. The heuristic requires
|
/* Determine validity of the r2 atags pointer. The heuristic requires
|
||||||
* that the pointer be aligned, in the first 16k of physical RAM and
|
* that the pointer be aligned, in the first 16k of physical RAM and
|
||||||
* that the ATAG_CORE marker is first and present. Future revisions
|
* that the ATAG_CORE marker is first and present. If CONFIG_OF_FLATTREE
|
||||||
|
* is selected, then it will also accept a dtb pointer. Future revisions
|
||||||
* of this function may be more lenient with the physical address and
|
* of this function may be more lenient with the physical address and
|
||||||
* may also be able to move the ATAGS block if necessary.
|
* may also be able to move the ATAGS block if necessary.
|
||||||
*
|
*
|
||||||
* Returns:
|
* Returns:
|
||||||
* r2 either valid atags pointer, or zero
|
* r2 either valid atags pointer, valid dtb pointer, or zero
|
||||||
* r5, r6 corrupted
|
* r5, r6 corrupted
|
||||||
*/
|
*/
|
||||||
__vet_atags:
|
__vet_atags:
|
||||||
tst r2, #0x3 @ aligned?
|
tst r2, #0x3 @ aligned?
|
||||||
bne 1f
|
bne 1f
|
||||||
|
|
||||||
ldr r5, [r2, #0] @ is first tag ATAG_CORE?
|
ldr r5, [r2, #0]
|
||||||
cmp r5, #ATAG_CORE_SIZE
|
#ifdef CONFIG_OF_FLATTREE
|
||||||
|
ldr r6, =OF_DT_MAGIC @ is it a DTB?
|
||||||
|
cmp r5, r6
|
||||||
|
beq 2f
|
||||||
|
#endif
|
||||||
|
cmp r5, #ATAG_CORE_SIZE @ is first tag ATAG_CORE?
|
||||||
cmpne r5, #ATAG_CORE_SIZE_EMPTY
|
cmpne r5, #ATAG_CORE_SIZE_EMPTY
|
||||||
bne 1f
|
bne 1f
|
||||||
ldr r5, [r2, #4]
|
ldr r5, [r2, #4]
|
||||||
|
@ -49,7 +61,7 @@ __vet_atags:
|
||||||
cmp r5, r6
|
cmp r5, r6
|
||||||
bne 1f
|
bne 1f
|
||||||
|
|
||||||
mov pc, lr @ atag pointer is ok
|
2: mov pc, lr @ atag/dtb pointer is ok
|
||||||
|
|
||||||
1: mov r2, #0
|
1: mov r2, #0
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
@ -61,7 +73,7 @@ ENDPROC(__vet_atags)
|
||||||
*
|
*
|
||||||
* r0 = cp#15 control register
|
* r0 = cp#15 control register
|
||||||
* r1 = machine ID
|
* r1 = machine ID
|
||||||
* r2 = atags pointer
|
* r2 = atags/dtb pointer
|
||||||
* r9 = processor ID
|
* r9 = processor ID
|
||||||
*/
|
*/
|
||||||
__INIT
|
__INIT
|
||||||
|
|
|
@ -59,7 +59,7 @@
|
||||||
*
|
*
|
||||||
* This is normally called from the decompressor code. The requirements
|
* This is normally called from the decompressor code. The requirements
|
||||||
* are: MMU = off, D-cache = off, I-cache = dont care, r0 = 0,
|
* are: MMU = off, D-cache = off, I-cache = dont care, r0 = 0,
|
||||||
* r1 = machine nr, r2 = atags pointer.
|
* r1 = machine nr, r2 = atags or dtb pointer.
|
||||||
*
|
*
|
||||||
* This code is mostly position independent, so if you link the kernel at
|
* This code is mostly position independent, so if you link the kernel at
|
||||||
* 0xc0008000, you call this at __pa(0xc0008000).
|
* 0xc0008000, you call this at __pa(0xc0008000).
|
||||||
|
@ -91,7 +91,7 @@ ENTRY(stext)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* r1 = machine no, r2 = atags,
|
* r1 = machine no, r2 = atags or dtb,
|
||||||
* r8 = phys_offset, r9 = cpuid, r10 = procinfo
|
* r8 = phys_offset, r9 = cpuid, r10 = procinfo
|
||||||
*/
|
*/
|
||||||
bl __vet_atags
|
bl __vet_atags
|
||||||
|
@ -113,6 +113,7 @@ ENTRY(stext)
|
||||||
ldr r13, =__mmap_switched @ address to jump to after
|
ldr r13, =__mmap_switched @ address to jump to after
|
||||||
@ mmu has been enabled
|
@ mmu has been enabled
|
||||||
adr lr, BSYM(1f) @ return (PIC) address
|
adr lr, BSYM(1f) @ return (PIC) address
|
||||||
|
mov r8, r4 @ set TTBR1 to swapper_pg_dir
|
||||||
ARM( add pc, r10, #PROCINFO_INITFUNC )
|
ARM( add pc, r10, #PROCINFO_INITFUNC )
|
||||||
THUMB( add r12, r10, #PROCINFO_INITFUNC )
|
THUMB( add r12, r10, #PROCINFO_INITFUNC )
|
||||||
THUMB( mov pc, r12 )
|
THUMB( mov pc, r12 )
|
||||||
|
@ -302,8 +303,10 @@ ENTRY(secondary_startup)
|
||||||
*/
|
*/
|
||||||
adr r4, __secondary_data
|
adr r4, __secondary_data
|
||||||
ldmia r4, {r5, r7, r12} @ address to jump to after
|
ldmia r4, {r5, r7, r12} @ address to jump to after
|
||||||
sub r4, r4, r5 @ mmu has been enabled
|
sub lr, r4, r5 @ mmu has been enabled
|
||||||
ldr r4, [r7, r4] @ get secondary_data.pgdir
|
ldr r4, [r7, lr] @ get secondary_data.pgdir
|
||||||
|
add r7, r7, #4
|
||||||
|
ldr r8, [r7, lr] @ get secondary_data.swapper_pg_dir
|
||||||
adr lr, BSYM(__enable_mmu) @ return address
|
adr lr, BSYM(__enable_mmu) @ return address
|
||||||
mov r13, r12 @ __secondary_switched address
|
mov r13, r12 @ __secondary_switched address
|
||||||
ARM( add pc, r10, #PROCINFO_INITFUNC ) @ initialise processor
|
ARM( add pc, r10, #PROCINFO_INITFUNC ) @ initialise processor
|
||||||
|
@ -339,7 +342,7 @@ __secondary_data:
|
||||||
*
|
*
|
||||||
* r0 = cp#15 control register
|
* r0 = cp#15 control register
|
||||||
* r1 = machine ID
|
* r1 = machine ID
|
||||||
* r2 = atags pointer
|
* r2 = atags or dtb pointer
|
||||||
* r4 = page table pointer
|
* r4 = page table pointer
|
||||||
* r9 = processor ID
|
* r9 = processor ID
|
||||||
* r13 = *virtual* address to jump to upon completion
|
* r13 = *virtual* address to jump to upon completion
|
||||||
|
@ -376,7 +379,7 @@ ENDPROC(__enable_mmu)
|
||||||
*
|
*
|
||||||
* r0 = cp#15 control register
|
* r0 = cp#15 control register
|
||||||
* r1 = machine ID
|
* r1 = machine ID
|
||||||
* r2 = atags pointer
|
* r2 = atags or dtb pointer
|
||||||
* r9 = processor ID
|
* r9 = processor ID
|
||||||
* r13 = *virtual* address to jump to upon completion
|
* r13 = *virtual* address to jump to upon completion
|
||||||
*
|
*
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include <linux/screen_info.h>
|
#include <linux/screen_info.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/kexec.h>
|
#include <linux/kexec.h>
|
||||||
|
#include <linux/of_fdt.h>
|
||||||
#include <linux/crash_dump.h>
|
#include <linux/crash_dump.h>
|
||||||
#include <linux/root_dev.h>
|
#include <linux/root_dev.h>
|
||||||
#include <linux/cpu.h>
|
#include <linux/cpu.h>
|
||||||
|
@ -42,6 +43,7 @@
|
||||||
#include <asm/cachetype.h>
|
#include <asm/cachetype.h>
|
||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
|
|
||||||
|
#include <asm/prom.h>
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
#include <asm/mach/irq.h>
|
#include <asm/mach/irq.h>
|
||||||
#include <asm/mach/time.h>
|
#include <asm/mach/time.h>
|
||||||
|
@ -309,7 +311,7 @@ static void __init cacheid_init(void)
|
||||||
*/
|
*/
|
||||||
extern struct proc_info_list *lookup_processor_type(unsigned int);
|
extern struct proc_info_list *lookup_processor_type(unsigned int);
|
||||||
|
|
||||||
static void __init early_print(const char *str, ...)
|
void __init early_print(const char *str, ...)
|
||||||
{
|
{
|
||||||
extern void printascii(const char *);
|
extern void printascii(const char *);
|
||||||
char buf[256];
|
char buf[256];
|
||||||
|
@ -439,25 +441,12 @@ void cpu_init(void)
|
||||||
: "r14");
|
: "r14");
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct machine_desc * __init setup_machine(unsigned int nr)
|
void __init dump_machine_table(void)
|
||||||
{
|
{
|
||||||
extern struct machine_desc __arch_info_begin[], __arch_info_end[];
|
|
||||||
struct machine_desc *p;
|
struct machine_desc *p;
|
||||||
|
|
||||||
/*
|
early_print("Available machine support:\n\nID (hex)\tNAME\n");
|
||||||
* locate machine in the list of supported machines.
|
for_each_machine_desc(p)
|
||||||
*/
|
|
||||||
for (p = __arch_info_begin; p < __arch_info_end; p++)
|
|
||||||
if (nr == p->nr) {
|
|
||||||
printk("Machine: %s\n", p->name);
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
early_print("\n"
|
|
||||||
"Error: unrecognized/unsupported machine ID (r1 = 0x%08x).\n\n"
|
|
||||||
"Available machine support:\n\nID (hex)\tNAME\n", nr);
|
|
||||||
|
|
||||||
for (p = __arch_info_begin; p < __arch_info_end; p++)
|
|
||||||
early_print("%08x\t%s\n", p->nr, p->name);
|
early_print("%08x\t%s\n", p->nr, p->name);
|
||||||
|
|
||||||
early_print("\nPlease check your kernel config and/or bootloader.\n");
|
early_print("\nPlease check your kernel config and/or bootloader.\n");
|
||||||
|
@ -466,7 +455,7 @@ static struct machine_desc * __init setup_machine(unsigned int nr)
|
||||||
/* can't use cpu_relax() here as it may require MMU setup */;
|
/* can't use cpu_relax() here as it may require MMU setup */;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init arm_add_memory(phys_addr_t start, unsigned long size)
|
int __init arm_add_memory(phys_addr_t start, unsigned long size)
|
||||||
{
|
{
|
||||||
struct membank *bank = &meminfo.bank[meminfo.nr_banks];
|
struct membank *bank = &meminfo.bank[meminfo.nr_banks];
|
||||||
|
|
||||||
|
@ -801,23 +790,29 @@ static void __init squash_mem_tags(struct tag *tag)
|
||||||
tag->hdr.tag = ATAG_NONE;
|
tag->hdr.tag = ATAG_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init setup_arch(char **cmdline_p)
|
static struct machine_desc * __init setup_machine_tags(unsigned int nr)
|
||||||
{
|
{
|
||||||
struct tag *tags = (struct tag *)&init_tags;
|
struct tag *tags = (struct tag *)&init_tags;
|
||||||
struct machine_desc *mdesc;
|
struct machine_desc *mdesc = NULL, *p;
|
||||||
char *from = default_command_line;
|
char *from = default_command_line;
|
||||||
|
|
||||||
init_tags.mem.start = PHYS_OFFSET;
|
init_tags.mem.start = PHYS_OFFSET;
|
||||||
|
|
||||||
unwind_init();
|
/*
|
||||||
|
* locate machine in the list of supported machines.
|
||||||
|
*/
|
||||||
|
for_each_machine_desc(p)
|
||||||
|
if (nr == p->nr) {
|
||||||
|
printk("Machine: %s\n", p->name);
|
||||||
|
mdesc = p;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
setup_processor();
|
if (!mdesc) {
|
||||||
mdesc = setup_machine(machine_arch_type);
|
early_print("\nError: unrecognized/unsupported machine ID"
|
||||||
machine_desc = mdesc;
|
" (r1 = 0x%08x).\n\n", nr);
|
||||||
machine_name = mdesc->name;
|
dump_machine_table(); /* does not return */
|
||||||
|
}
|
||||||
if (mdesc->soft_reboot)
|
|
||||||
reboot_setup("s");
|
|
||||||
|
|
||||||
if (__atags_pointer)
|
if (__atags_pointer)
|
||||||
tags = phys_to_virt(__atags_pointer);
|
tags = phys_to_virt(__atags_pointer);
|
||||||
|
@ -849,8 +844,17 @@ void __init setup_arch(char **cmdline_p)
|
||||||
if (tags->hdr.tag != ATAG_CORE)
|
if (tags->hdr.tag != ATAG_CORE)
|
||||||
convert_to_tag_list(tags);
|
convert_to_tag_list(tags);
|
||||||
#endif
|
#endif
|
||||||
if (tags->hdr.tag != ATAG_CORE)
|
|
||||||
|
if (tags->hdr.tag != ATAG_CORE) {
|
||||||
|
#if defined(CONFIG_OF)
|
||||||
|
/*
|
||||||
|
* If CONFIG_OF is set, then assume this is a reasonably
|
||||||
|
* modern system that should pass boot parameters
|
||||||
|
*/
|
||||||
|
early_print("Warning: Neither atags nor dtb found\n");
|
||||||
|
#endif
|
||||||
tags = (struct tag *)&init_tags;
|
tags = (struct tag *)&init_tags;
|
||||||
|
}
|
||||||
|
|
||||||
if (mdesc->fixup)
|
if (mdesc->fixup)
|
||||||
mdesc->fixup(mdesc, tags, &from, &meminfo);
|
mdesc->fixup(mdesc, tags, &from, &meminfo);
|
||||||
|
@ -862,14 +866,34 @@ void __init setup_arch(char **cmdline_p)
|
||||||
parse_tags(tags);
|
parse_tags(tags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* parse_early_param needs a boot_command_line */
|
||||||
|
strlcpy(boot_command_line, from, COMMAND_LINE_SIZE);
|
||||||
|
|
||||||
|
return mdesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void __init setup_arch(char **cmdline_p)
|
||||||
|
{
|
||||||
|
struct machine_desc *mdesc;
|
||||||
|
|
||||||
|
unwind_init();
|
||||||
|
|
||||||
|
setup_processor();
|
||||||
|
mdesc = setup_machine_fdt(__atags_pointer);
|
||||||
|
if (!mdesc)
|
||||||
|
mdesc = setup_machine_tags(machine_arch_type);
|
||||||
|
machine_desc = mdesc;
|
||||||
|
machine_name = mdesc->name;
|
||||||
|
|
||||||
|
if (mdesc->soft_reboot)
|
||||||
|
reboot_setup("s");
|
||||||
|
|
||||||
init_mm.start_code = (unsigned long) _text;
|
init_mm.start_code = (unsigned long) _text;
|
||||||
init_mm.end_code = (unsigned long) _etext;
|
init_mm.end_code = (unsigned long) _etext;
|
||||||
init_mm.end_data = (unsigned long) _edata;
|
init_mm.end_data = (unsigned long) _edata;
|
||||||
init_mm.brk = (unsigned long) _end;
|
init_mm.brk = (unsigned long) _end;
|
||||||
|
|
||||||
/* parse_early_param needs a boot_command_line */
|
|
||||||
strlcpy(boot_command_line, from, COMMAND_LINE_SIZE);
|
|
||||||
|
|
||||||
/* populate cmd_line too for later use, preserving boot_command_line */
|
/* populate cmd_line too for later use, preserving boot_command_line */
|
||||||
strlcpy(cmd_line, boot_command_line, COMMAND_LINE_SIZE);
|
strlcpy(cmd_line, boot_command_line, COMMAND_LINE_SIZE);
|
||||||
*cmdline_p = cmd_line;
|
*cmdline_p = cmd_line;
|
||||||
|
@ -881,6 +905,8 @@ void __init setup_arch(char **cmdline_p)
|
||||||
paging_init(mdesc);
|
paging_init(mdesc);
|
||||||
request_standard_resources(mdesc);
|
request_standard_resources(mdesc);
|
||||||
|
|
||||||
|
unflatten_device_tree();
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
if (is_smp())
|
if (is_smp())
|
||||||
smp_init_cpus();
|
smp_init_cpus();
|
||||||
|
|
|
@ -105,6 +105,7 @@ int __cpuinit __cpu_up(unsigned int cpu)
|
||||||
*/
|
*/
|
||||||
secondary_data.stack = task_stack_page(idle) + THREAD_START_SP;
|
secondary_data.stack = task_stack_page(idle) + THREAD_START_SP;
|
||||||
secondary_data.pgdir = virt_to_phys(pgd);
|
secondary_data.pgdir = virt_to_phys(pgd);
|
||||||
|
secondary_data.swapper_pg_dir = virt_to_phys(swapper_pg_dir);
|
||||||
__cpuc_flush_dcache_area(&secondary_data, sizeof(secondary_data));
|
__cpuc_flush_dcache_area(&secondary_data, sizeof(secondary_data));
|
||||||
outer_clean_range(__pa(&secondary_data), __pa(&secondary_data + 1));
|
outer_clean_range(__pa(&secondary_data), __pa(&secondary_data + 1));
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <asm/assembler.h>
|
#include <asm/assembler.h>
|
||||||
|
#include <asm/unwind.h>
|
||||||
|
|
||||||
.macro ARM_DIV_BODY dividend, divisor, result, curbit
|
.macro ARM_DIV_BODY dividend, divisor, result, curbit
|
||||||
|
|
||||||
|
@ -207,6 +207,7 @@ Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
ENTRY(__udivsi3)
|
ENTRY(__udivsi3)
|
||||||
ENTRY(__aeabi_uidiv)
|
ENTRY(__aeabi_uidiv)
|
||||||
|
UNWIND(.fnstart)
|
||||||
|
|
||||||
subs r2, r1, #1
|
subs r2, r1, #1
|
||||||
moveq pc, lr
|
moveq pc, lr
|
||||||
|
@ -230,10 +231,12 @@ ENTRY(__aeabi_uidiv)
|
||||||
mov r0, r0, lsr r2
|
mov r0, r0, lsr r2
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
|
||||||
|
UNWIND(.fnend)
|
||||||
ENDPROC(__udivsi3)
|
ENDPROC(__udivsi3)
|
||||||
ENDPROC(__aeabi_uidiv)
|
ENDPROC(__aeabi_uidiv)
|
||||||
|
|
||||||
ENTRY(__umodsi3)
|
ENTRY(__umodsi3)
|
||||||
|
UNWIND(.fnstart)
|
||||||
|
|
||||||
subs r2, r1, #1 @ compare divisor with 1
|
subs r2, r1, #1 @ compare divisor with 1
|
||||||
bcc Ldiv0
|
bcc Ldiv0
|
||||||
|
@ -247,10 +250,12 @@ ENTRY(__umodsi3)
|
||||||
|
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
|
||||||
|
UNWIND(.fnend)
|
||||||
ENDPROC(__umodsi3)
|
ENDPROC(__umodsi3)
|
||||||
|
|
||||||
ENTRY(__divsi3)
|
ENTRY(__divsi3)
|
||||||
ENTRY(__aeabi_idiv)
|
ENTRY(__aeabi_idiv)
|
||||||
|
UNWIND(.fnstart)
|
||||||
|
|
||||||
cmp r1, #0
|
cmp r1, #0
|
||||||
eor ip, r0, r1 @ save the sign of the result.
|
eor ip, r0, r1 @ save the sign of the result.
|
||||||
|
@ -287,10 +292,12 @@ ENTRY(__aeabi_idiv)
|
||||||
rsbmi r0, r0, #0
|
rsbmi r0, r0, #0
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
|
||||||
|
UNWIND(.fnend)
|
||||||
ENDPROC(__divsi3)
|
ENDPROC(__divsi3)
|
||||||
ENDPROC(__aeabi_idiv)
|
ENDPROC(__aeabi_idiv)
|
||||||
|
|
||||||
ENTRY(__modsi3)
|
ENTRY(__modsi3)
|
||||||
|
UNWIND(.fnstart)
|
||||||
|
|
||||||
cmp r1, #0
|
cmp r1, #0
|
||||||
beq Ldiv0
|
beq Ldiv0
|
||||||
|
@ -310,11 +317,14 @@ ENTRY(__modsi3)
|
||||||
rsbmi r0, r0, #0
|
rsbmi r0, r0, #0
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
|
||||||
|
UNWIND(.fnend)
|
||||||
ENDPROC(__modsi3)
|
ENDPROC(__modsi3)
|
||||||
|
|
||||||
#ifdef CONFIG_AEABI
|
#ifdef CONFIG_AEABI
|
||||||
|
|
||||||
ENTRY(__aeabi_uidivmod)
|
ENTRY(__aeabi_uidivmod)
|
||||||
|
UNWIND(.fnstart)
|
||||||
|
UNWIND(.save {r0, r1, ip, lr} )
|
||||||
|
|
||||||
stmfd sp!, {r0, r1, ip, lr}
|
stmfd sp!, {r0, r1, ip, lr}
|
||||||
bl __aeabi_uidiv
|
bl __aeabi_uidiv
|
||||||
|
@ -323,10 +333,12 @@ ENTRY(__aeabi_uidivmod)
|
||||||
sub r1, r1, r3
|
sub r1, r1, r3
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
|
||||||
|
UNWIND(.fnend)
|
||||||
ENDPROC(__aeabi_uidivmod)
|
ENDPROC(__aeabi_uidivmod)
|
||||||
|
|
||||||
ENTRY(__aeabi_idivmod)
|
ENTRY(__aeabi_idivmod)
|
||||||
|
UNWIND(.fnstart)
|
||||||
|
UNWIND(.save {r0, r1, ip, lr} )
|
||||||
stmfd sp!, {r0, r1, ip, lr}
|
stmfd sp!, {r0, r1, ip, lr}
|
||||||
bl __aeabi_idiv
|
bl __aeabi_idiv
|
||||||
ldmfd sp!, {r1, r2, ip, lr}
|
ldmfd sp!, {r1, r2, ip, lr}
|
||||||
|
@ -334,15 +346,18 @@ ENTRY(__aeabi_idivmod)
|
||||||
sub r1, r1, r3
|
sub r1, r1, r3
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
|
||||||
|
UNWIND(.fnend)
|
||||||
ENDPROC(__aeabi_idivmod)
|
ENDPROC(__aeabi_idivmod)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Ldiv0:
|
Ldiv0:
|
||||||
|
UNWIND(.fnstart)
|
||||||
|
UNWIND(.pad #4)
|
||||||
|
UNWIND(.save {lr})
|
||||||
str lr, [sp, #-8]!
|
str lr, [sp, #-8]!
|
||||||
bl __div0
|
bl __div0
|
||||||
mov r0, #0 @ About as wrong as it could be.
|
mov r0, #0 @ About as wrong as it could be.
|
||||||
ldr pc, [sp], #8
|
ldr pc, [sp], #8
|
||||||
|
UNWIND(.fnend)
|
||||||
|
ENDPROC(Ldiv0)
|
||||||
|
|
|
@ -3,9 +3,6 @@ if ARCH_AT91
|
||||||
config HAVE_AT91_DATAFLASH_CARD
|
config HAVE_AT91_DATAFLASH_CARD
|
||||||
bool
|
bool
|
||||||
|
|
||||||
config HAVE_NAND_ATMEL_BUSWIDTH_16
|
|
||||||
bool
|
|
||||||
|
|
||||||
config HAVE_AT91_USART3
|
config HAVE_AT91_USART3
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
@ -85,11 +82,6 @@ config ARCH_AT91CAP9
|
||||||
select HAVE_FB_ATMEL
|
select HAVE_FB_ATMEL
|
||||||
select HAVE_NET_MACB
|
select HAVE_NET_MACB
|
||||||
|
|
||||||
config ARCH_AT572D940HF
|
|
||||||
bool "AT572D940HF"
|
|
||||||
select CPU_ARM926T
|
|
||||||
select GENERIC_CLOCKEVENTS
|
|
||||||
|
|
||||||
config ARCH_AT91X40
|
config ARCH_AT91X40
|
||||||
bool "AT91x40"
|
bool "AT91x40"
|
||||||
select ARCH_USES_GETTIMEOFFSET
|
select ARCH_USES_GETTIMEOFFSET
|
||||||
|
@ -209,7 +201,6 @@ comment "AT91SAM9260 / AT91SAM9XE Board Type"
|
||||||
config MACH_AT91SAM9260EK
|
config MACH_AT91SAM9260EK
|
||||||
bool "Atmel AT91SAM9260-EK / AT91SAM9XE Evaluation Kit"
|
bool "Atmel AT91SAM9260-EK / AT91SAM9XE Evaluation Kit"
|
||||||
select HAVE_AT91_DATAFLASH_CARD
|
select HAVE_AT91_DATAFLASH_CARD
|
||||||
select HAVE_NAND_ATMEL_BUSWIDTH_16
|
|
||||||
help
|
help
|
||||||
Select this if you are using Atmel's AT91SAM9260-EK or AT91SAM9XE Evaluation Kit
|
Select this if you are using Atmel's AT91SAM9260-EK or AT91SAM9XE Evaluation Kit
|
||||||
<http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3933>
|
<http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3933>
|
||||||
|
@ -270,7 +261,6 @@ comment "AT91SAM9261 Board Type"
|
||||||
config MACH_AT91SAM9261EK
|
config MACH_AT91SAM9261EK
|
||||||
bool "Atmel AT91SAM9261-EK Evaluation Kit"
|
bool "Atmel AT91SAM9261-EK Evaluation Kit"
|
||||||
select HAVE_AT91_DATAFLASH_CARD
|
select HAVE_AT91_DATAFLASH_CARD
|
||||||
select HAVE_NAND_ATMEL_BUSWIDTH_16
|
|
||||||
help
|
help
|
||||||
Select this if you are using Atmel's AT91SAM9261-EK Evaluation Kit.
|
Select this if you are using Atmel's AT91SAM9261-EK Evaluation Kit.
|
||||||
<http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3820>
|
<http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3820>
|
||||||
|
@ -286,7 +276,6 @@ comment "AT91SAM9G10 Board Type"
|
||||||
config MACH_AT91SAM9G10EK
|
config MACH_AT91SAM9G10EK
|
||||||
bool "Atmel AT91SAM9G10-EK Evaluation Kit"
|
bool "Atmel AT91SAM9G10-EK Evaluation Kit"
|
||||||
select HAVE_AT91_DATAFLASH_CARD
|
select HAVE_AT91_DATAFLASH_CARD
|
||||||
select HAVE_NAND_ATMEL_BUSWIDTH_16
|
|
||||||
help
|
help
|
||||||
Select this if you are using Atmel's AT91SAM9G10-EK Evaluation Kit.
|
Select this if you are using Atmel's AT91SAM9G10-EK Evaluation Kit.
|
||||||
<http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4588>
|
<http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4588>
|
||||||
|
@ -302,7 +291,6 @@ comment "AT91SAM9263 Board Type"
|
||||||
config MACH_AT91SAM9263EK
|
config MACH_AT91SAM9263EK
|
||||||
bool "Atmel AT91SAM9263-EK Evaluation Kit"
|
bool "Atmel AT91SAM9263-EK Evaluation Kit"
|
||||||
select HAVE_AT91_DATAFLASH_CARD
|
select HAVE_AT91_DATAFLASH_CARD
|
||||||
select HAVE_NAND_ATMEL_BUSWIDTH_16
|
|
||||||
help
|
help
|
||||||
Select this if you are using Atmel's AT91SAM9263-EK Evaluation Kit.
|
Select this if you are using Atmel's AT91SAM9263-EK Evaluation Kit.
|
||||||
<http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4057>
|
<http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4057>
|
||||||
|
@ -343,7 +331,6 @@ comment "AT91SAM9G20 Board Type"
|
||||||
config MACH_AT91SAM9G20EK
|
config MACH_AT91SAM9G20EK
|
||||||
bool "Atmel AT91SAM9G20-EK Evaluation Kit"
|
bool "Atmel AT91SAM9G20-EK Evaluation Kit"
|
||||||
select HAVE_AT91_DATAFLASH_CARD
|
select HAVE_AT91_DATAFLASH_CARD
|
||||||
select HAVE_NAND_ATMEL_BUSWIDTH_16
|
|
||||||
help
|
help
|
||||||
Select this if you are using Atmel's AT91SAM9G20-EK Evaluation Kit
|
Select this if you are using Atmel's AT91SAM9G20-EK Evaluation Kit
|
||||||
that embeds only one SD/MMC slot.
|
that embeds only one SD/MMC slot.
|
||||||
|
@ -351,7 +338,6 @@ config MACH_AT91SAM9G20EK
|
||||||
config MACH_AT91SAM9G20EK_2MMC
|
config MACH_AT91SAM9G20EK_2MMC
|
||||||
depends on MACH_AT91SAM9G20EK
|
depends on MACH_AT91SAM9G20EK
|
||||||
bool "Atmel AT91SAM9G20-EK Evaluation Kit with 2 SD/MMC Slots"
|
bool "Atmel AT91SAM9G20-EK Evaluation Kit with 2 SD/MMC Slots"
|
||||||
select HAVE_NAND_ATMEL_BUSWIDTH_16
|
|
||||||
help
|
help
|
||||||
Select this if you are using an Atmel AT91SAM9G20-EK Evaluation Kit
|
Select this if you are using an Atmel AT91SAM9G20-EK Evaluation Kit
|
||||||
with 2 SD/MMC Slots. This is the case for AT91SAM9G20-EK rev. C and
|
with 2 SD/MMC Slots. This is the case for AT91SAM9G20-EK rev. C and
|
||||||
|
@ -416,7 +402,6 @@ comment "AT91SAM9G45 Board Type"
|
||||||
|
|
||||||
config MACH_AT91SAM9M10G45EK
|
config MACH_AT91SAM9M10G45EK
|
||||||
bool "Atmel AT91SAM9M10G45-EK Evaluation Kits"
|
bool "Atmel AT91SAM9M10G45-EK Evaluation Kits"
|
||||||
select HAVE_NAND_ATMEL_BUSWIDTH_16
|
|
||||||
help
|
help
|
||||||
Select this if you are using Atmel's AT91SAM9G45-EKES Evaluation Kit.
|
Select this if you are using Atmel's AT91SAM9G45-EKES Evaluation Kit.
|
||||||
"ES" at the end of the name means that this board is an
|
"ES" at the end of the name means that this board is an
|
||||||
|
@ -433,7 +418,6 @@ comment "AT91CAP9 Board Type"
|
||||||
config MACH_AT91CAP9ADK
|
config MACH_AT91CAP9ADK
|
||||||
bool "Atmel AT91CAP9A-DK Evaluation Kit"
|
bool "Atmel AT91CAP9A-DK Evaluation Kit"
|
||||||
select HAVE_AT91_DATAFLASH_CARD
|
select HAVE_AT91_DATAFLASH_CARD
|
||||||
select HAVE_NAND_ATMEL_BUSWIDTH_16
|
|
||||||
help
|
help
|
||||||
Select this if you are using Atmel's AT91CAP9A-DK Evaluation Kit.
|
Select this if you are using Atmel's AT91CAP9A-DK Evaluation Kit.
|
||||||
<http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4138>
|
<http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4138>
|
||||||
|
@ -442,23 +426,6 @@ endif
|
||||||
|
|
||||||
# ----------------------------------------------------------
|
# ----------------------------------------------------------
|
||||||
|
|
||||||
if ARCH_AT572D940HF
|
|
||||||
|
|
||||||
comment "AT572D940HF Board Type"
|
|
||||||
|
|
||||||
config MACH_AT572D940HFEB
|
|
||||||
bool "AT572D940HF-EK"
|
|
||||||
depends on ARCH_AT572D940HF
|
|
||||||
select HAVE_AT91_DATAFLASH_CARD
|
|
||||||
select HAVE_NAND_ATMEL_BUSWIDTH_16
|
|
||||||
help
|
|
||||||
Select this if you are using Atmel's AT572D940HF-EK evaluation kit.
|
|
||||||
<http://www.atmel.com/products/diopsis/default.asp>
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
# ----------------------------------------------------------
|
|
||||||
|
|
||||||
if ARCH_AT91X40
|
if ARCH_AT91X40
|
||||||
|
|
||||||
comment "AT91X40 Board Type"
|
comment "AT91X40 Board Type"
|
||||||
|
@ -483,13 +450,6 @@ config MTD_AT91_DATAFLASH_CARD
|
||||||
help
|
help
|
||||||
Enable support for the DataFlash card.
|
Enable support for the DataFlash card.
|
||||||
|
|
||||||
config MTD_NAND_ATMEL_BUSWIDTH_16
|
|
||||||
bool "Enable 16-bit data bus interface to NAND flash"
|
|
||||||
depends on HAVE_NAND_ATMEL_BUSWIDTH_16
|
|
||||||
help
|
|
||||||
On AT91SAM926x boards both types of NAND flash can be present
|
|
||||||
(8 and 16 bit data bus width).
|
|
||||||
|
|
||||||
# ----------------------------------------------------------
|
# ----------------------------------------------------------
|
||||||
|
|
||||||
comment "AT91 Feature Selections"
|
comment "AT91 Feature Selections"
|
||||||
|
|
|
@ -19,7 +19,6 @@ obj-$(CONFIG_ARCH_AT91SAM9RL) += at91sam9rl.o at91sam926x_time.o at91sam9rl_devi
|
||||||
obj-$(CONFIG_ARCH_AT91SAM9G20) += at91sam9260.o at91sam926x_time.o at91sam9260_devices.o sam9_smc.o at91sam9_alt_reset.o
|
obj-$(CONFIG_ARCH_AT91SAM9G20) += at91sam9260.o at91sam926x_time.o at91sam9260_devices.o sam9_smc.o at91sam9_alt_reset.o
|
||||||
obj-$(CONFIG_ARCH_AT91SAM9G45) += at91sam9g45.o at91sam926x_time.o at91sam9g45_devices.o sam9_smc.o
|
obj-$(CONFIG_ARCH_AT91SAM9G45) += at91sam9g45.o at91sam926x_time.o at91sam9g45_devices.o sam9_smc.o
|
||||||
obj-$(CONFIG_ARCH_AT91CAP9) += at91cap9.o at91sam926x_time.o at91cap9_devices.o sam9_smc.o
|
obj-$(CONFIG_ARCH_AT91CAP9) += at91cap9.o at91sam926x_time.o at91cap9_devices.o sam9_smc.o
|
||||||
obj-$(CONFIG_ARCH_AT572D940HF) += at572d940hf.o at91sam926x_time.o at572d940hf_devices.o sam9_smc.o
|
|
||||||
obj-$(CONFIG_ARCH_AT91X40) += at91x40.o at91x40_time.o
|
obj-$(CONFIG_ARCH_AT91X40) += at91x40.o at91x40_time.o
|
||||||
|
|
||||||
# AT91RM9200 board-specific support
|
# AT91RM9200 board-specific support
|
||||||
|
@ -78,9 +77,6 @@ obj-$(CONFIG_MACH_AT91SAM9M10G45EK) += board-sam9m10g45ek.o
|
||||||
# AT91CAP9 board-specific support
|
# AT91CAP9 board-specific support
|
||||||
obj-$(CONFIG_MACH_AT91CAP9ADK) += board-cap9adk.o
|
obj-$(CONFIG_MACH_AT91CAP9ADK) += board-cap9adk.o
|
||||||
|
|
||||||
# AT572D940HF board-specific support
|
|
||||||
obj-$(CONFIG_MACH_AT572D940HFEB) += board-at572d940hf_ek.o
|
|
||||||
|
|
||||||
# AT91X40 board-specific support
|
# AT91X40 board-specific support
|
||||||
obj-$(CONFIG_MACH_AT91EB01) += board-eb01.o
|
obj-$(CONFIG_MACH_AT91EB01) += board-eb01.o
|
||||||
|
|
||||||
|
|
|
@ -1,377 +0,0 @@
|
||||||
/*
|
|
||||||
* arch/arm/mach-at91/at572d940hf.c
|
|
||||||
*
|
|
||||||
* Antonio R. Costa <costa.antonior@gmail.com>
|
|
||||||
* Copyright (C) 2008 Atmel
|
|
||||||
*
|
|
||||||
* Copyright (C) 2005 SAN People
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/module.h>
|
|
||||||
|
|
||||||
#include <asm/mach/irq.h>
|
|
||||||
#include <asm/mach/arch.h>
|
|
||||||
#include <asm/mach/map.h>
|
|
||||||
#include <mach/at572d940hf.h>
|
|
||||||
#include <mach/at91_pmc.h>
|
|
||||||
#include <mach/at91_rstc.h>
|
|
||||||
|
|
||||||
#include "generic.h"
|
|
||||||
#include "clock.h"
|
|
||||||
|
|
||||||
static struct map_desc at572d940hf_io_desc[] __initdata = {
|
|
||||||
{
|
|
||||||
.virtual = AT91_VA_BASE_SYS,
|
|
||||||
.pfn = __phys_to_pfn(AT91_BASE_SYS),
|
|
||||||
.length = SZ_16K,
|
|
||||||
.type = MT_DEVICE,
|
|
||||||
}, {
|
|
||||||
.virtual = AT91_IO_VIRT_BASE - AT572D940HF_SRAM_SIZE,
|
|
||||||
.pfn = __phys_to_pfn(AT572D940HF_SRAM_BASE),
|
|
||||||
.length = AT572D940HF_SRAM_SIZE,
|
|
||||||
.type = MT_DEVICE,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
|
||||||
* Clocks
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The peripheral clocks.
|
|
||||||
*/
|
|
||||||
static struct clk pioA_clk = {
|
|
||||||
.name = "pioA_clk",
|
|
||||||
.pmc_mask = 1 << AT572D940HF_ID_PIOA,
|
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
|
||||||
};
|
|
||||||
static struct clk pioB_clk = {
|
|
||||||
.name = "pioB_clk",
|
|
||||||
.pmc_mask = 1 << AT572D940HF_ID_PIOB,
|
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
|
||||||
};
|
|
||||||
static struct clk pioC_clk = {
|
|
||||||
.name = "pioC_clk",
|
|
||||||
.pmc_mask = 1 << AT572D940HF_ID_PIOC,
|
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
|
||||||
};
|
|
||||||
static struct clk macb_clk = {
|
|
||||||
.name = "macb_clk",
|
|
||||||
.pmc_mask = 1 << AT572D940HF_ID_EMAC,
|
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
|
||||||
};
|
|
||||||
static struct clk usart0_clk = {
|
|
||||||
.name = "usart0_clk",
|
|
||||||
.pmc_mask = 1 << AT572D940HF_ID_US0,
|
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
|
||||||
};
|
|
||||||
static struct clk usart1_clk = {
|
|
||||||
.name = "usart1_clk",
|
|
||||||
.pmc_mask = 1 << AT572D940HF_ID_US1,
|
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
|
||||||
};
|
|
||||||
static struct clk usart2_clk = {
|
|
||||||
.name = "usart2_clk",
|
|
||||||
.pmc_mask = 1 << AT572D940HF_ID_US2,
|
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
|
||||||
};
|
|
||||||
static struct clk mmc_clk = {
|
|
||||||
.name = "mci_clk",
|
|
||||||
.pmc_mask = 1 << AT572D940HF_ID_MCI,
|
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
|
||||||
};
|
|
||||||
static struct clk udc_clk = {
|
|
||||||
.name = "udc_clk",
|
|
||||||
.pmc_mask = 1 << AT572D940HF_ID_UDP,
|
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
|
||||||
};
|
|
||||||
static struct clk twi0_clk = {
|
|
||||||
.name = "twi0_clk",
|
|
||||||
.pmc_mask = 1 << AT572D940HF_ID_TWI0,
|
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
|
||||||
};
|
|
||||||
static struct clk spi0_clk = {
|
|
||||||
.name = "spi0_clk",
|
|
||||||
.pmc_mask = 1 << AT572D940HF_ID_SPI0,
|
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
|
||||||
};
|
|
||||||
static struct clk spi1_clk = {
|
|
||||||
.name = "spi1_clk",
|
|
||||||
.pmc_mask = 1 << AT572D940HF_ID_SPI1,
|
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
|
||||||
};
|
|
||||||
static struct clk ssc0_clk = {
|
|
||||||
.name = "ssc0_clk",
|
|
||||||
.pmc_mask = 1 << AT572D940HF_ID_SSC0,
|
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
|
||||||
};
|
|
||||||
static struct clk ssc1_clk = {
|
|
||||||
.name = "ssc1_clk",
|
|
||||||
.pmc_mask = 1 << AT572D940HF_ID_SSC1,
|
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
|
||||||
};
|
|
||||||
static struct clk ssc2_clk = {
|
|
||||||
.name = "ssc2_clk",
|
|
||||||
.pmc_mask = 1 << AT572D940HF_ID_SSC2,
|
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
|
||||||
};
|
|
||||||
static struct clk tc0_clk = {
|
|
||||||
.name = "tc0_clk",
|
|
||||||
.pmc_mask = 1 << AT572D940HF_ID_TC0,
|
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
|
||||||
};
|
|
||||||
static struct clk tc1_clk = {
|
|
||||||
.name = "tc1_clk",
|
|
||||||
.pmc_mask = 1 << AT572D940HF_ID_TC1,
|
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
|
||||||
};
|
|
||||||
static struct clk tc2_clk = {
|
|
||||||
.name = "tc2_clk",
|
|
||||||
.pmc_mask = 1 << AT572D940HF_ID_TC2,
|
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
|
||||||
};
|
|
||||||
static struct clk ohci_clk = {
|
|
||||||
.name = "ohci_clk",
|
|
||||||
.pmc_mask = 1 << AT572D940HF_ID_UHP,
|
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
|
||||||
};
|
|
||||||
static struct clk ssc3_clk = {
|
|
||||||
.name = "ssc3_clk",
|
|
||||||
.pmc_mask = 1 << AT572D940HF_ID_SSC3,
|
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
|
||||||
};
|
|
||||||
static struct clk twi1_clk = {
|
|
||||||
.name = "twi1_clk",
|
|
||||||
.pmc_mask = 1 << AT572D940HF_ID_TWI1,
|
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
|
||||||
};
|
|
||||||
static struct clk can0_clk = {
|
|
||||||
.name = "can0_clk",
|
|
||||||
.pmc_mask = 1 << AT572D940HF_ID_CAN0,
|
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
|
||||||
};
|
|
||||||
static struct clk can1_clk = {
|
|
||||||
.name = "can1_clk",
|
|
||||||
.pmc_mask = 1 << AT572D940HF_ID_CAN1,
|
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
|
||||||
};
|
|
||||||
static struct clk mAgicV_clk = {
|
|
||||||
.name = "mAgicV_clk",
|
|
||||||
.pmc_mask = 1 << AT572D940HF_ID_MSIRQ0,
|
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static struct clk *periph_clocks[] __initdata = {
|
|
||||||
&pioA_clk,
|
|
||||||
&pioB_clk,
|
|
||||||
&pioC_clk,
|
|
||||||
&macb_clk,
|
|
||||||
&usart0_clk,
|
|
||||||
&usart1_clk,
|
|
||||||
&usart2_clk,
|
|
||||||
&mmc_clk,
|
|
||||||
&udc_clk,
|
|
||||||
&twi0_clk,
|
|
||||||
&spi0_clk,
|
|
||||||
&spi1_clk,
|
|
||||||
&ssc0_clk,
|
|
||||||
&ssc1_clk,
|
|
||||||
&ssc2_clk,
|
|
||||||
&tc0_clk,
|
|
||||||
&tc1_clk,
|
|
||||||
&tc2_clk,
|
|
||||||
&ohci_clk,
|
|
||||||
&ssc3_clk,
|
|
||||||
&twi1_clk,
|
|
||||||
&can0_clk,
|
|
||||||
&can1_clk,
|
|
||||||
&mAgicV_clk,
|
|
||||||
/* irq0 .. irq2 */
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The five programmable clocks.
|
|
||||||
* You must configure pin multiplexing to bring these signals out.
|
|
||||||
*/
|
|
||||||
static struct clk pck0 = {
|
|
||||||
.name = "pck0",
|
|
||||||
.pmc_mask = AT91_PMC_PCK0,
|
|
||||||
.type = CLK_TYPE_PROGRAMMABLE,
|
|
||||||
.id = 0,
|
|
||||||
};
|
|
||||||
static struct clk pck1 = {
|
|
||||||
.name = "pck1",
|
|
||||||
.pmc_mask = AT91_PMC_PCK1,
|
|
||||||
.type = CLK_TYPE_PROGRAMMABLE,
|
|
||||||
.id = 1,
|
|
||||||
};
|
|
||||||
static struct clk pck2 = {
|
|
||||||
.name = "pck2",
|
|
||||||
.pmc_mask = AT91_PMC_PCK2,
|
|
||||||
.type = CLK_TYPE_PROGRAMMABLE,
|
|
||||||
.id = 2,
|
|
||||||
};
|
|
||||||
static struct clk pck3 = {
|
|
||||||
.name = "pck3",
|
|
||||||
.pmc_mask = AT91_PMC_PCK3,
|
|
||||||
.type = CLK_TYPE_PROGRAMMABLE,
|
|
||||||
.id = 3,
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct clk mAgicV_mem_clk = {
|
|
||||||
.name = "mAgicV_mem_clk",
|
|
||||||
.pmc_mask = AT91_PMC_PCK4,
|
|
||||||
.type = CLK_TYPE_PROGRAMMABLE,
|
|
||||||
.id = 4,
|
|
||||||
};
|
|
||||||
|
|
||||||
/* HClocks */
|
|
||||||
static struct clk hck0 = {
|
|
||||||
.name = "hck0",
|
|
||||||
.pmc_mask = AT91_PMC_HCK0,
|
|
||||||
.type = CLK_TYPE_SYSTEM,
|
|
||||||
.id = 0,
|
|
||||||
};
|
|
||||||
static struct clk hck1 = {
|
|
||||||
.name = "hck1",
|
|
||||||
.pmc_mask = AT91_PMC_HCK1,
|
|
||||||
.type = CLK_TYPE_SYSTEM,
|
|
||||||
.id = 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
static void __init at572d940hf_register_clocks(void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
|
|
||||||
clk_register(periph_clocks[i]);
|
|
||||||
|
|
||||||
clk_register(&pck0);
|
|
||||||
clk_register(&pck1);
|
|
||||||
clk_register(&pck2);
|
|
||||||
clk_register(&pck3);
|
|
||||||
clk_register(&mAgicV_mem_clk);
|
|
||||||
|
|
||||||
clk_register(&hck0);
|
|
||||||
clk_register(&hck1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
|
||||||
* GPIO
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
static struct at91_gpio_bank at572d940hf_gpio[] = {
|
|
||||||
{
|
|
||||||
.id = AT572D940HF_ID_PIOA,
|
|
||||||
.offset = AT91_PIOA,
|
|
||||||
.clock = &pioA_clk,
|
|
||||||
}, {
|
|
||||||
.id = AT572D940HF_ID_PIOB,
|
|
||||||
.offset = AT91_PIOB,
|
|
||||||
.clock = &pioB_clk,
|
|
||||||
}, {
|
|
||||||
.id = AT572D940HF_ID_PIOC,
|
|
||||||
.offset = AT91_PIOC,
|
|
||||||
.clock = &pioC_clk,
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static void at572d940hf_reset(void)
|
|
||||||
{
|
|
||||||
at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
|
||||||
* AT572D940HF processor initialization
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
void __init at572d940hf_initialize(unsigned long main_clock)
|
|
||||||
{
|
|
||||||
/* Map peripherals */
|
|
||||||
iotable_init(at572d940hf_io_desc, ARRAY_SIZE(at572d940hf_io_desc));
|
|
||||||
|
|
||||||
at91_arch_reset = at572d940hf_reset;
|
|
||||||
at91_extern_irq = (1 << AT572D940HF_ID_IRQ0) | (1 << AT572D940HF_ID_IRQ1)
|
|
||||||
| (1 << AT572D940HF_ID_IRQ2);
|
|
||||||
|
|
||||||
/* Init clock subsystem */
|
|
||||||
at91_clock_init(main_clock);
|
|
||||||
|
|
||||||
/* Register the processor-specific clocks */
|
|
||||||
at572d940hf_register_clocks();
|
|
||||||
|
|
||||||
/* Register GPIO subsystem */
|
|
||||||
at91_gpio_init(at572d940hf_gpio, 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
|
||||||
* Interrupt initialization
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The default interrupt priority levels (0 = lowest, 7 = highest).
|
|
||||||
*/
|
|
||||||
static unsigned int at572d940hf_default_irq_priority[NR_AIC_IRQS] __initdata = {
|
|
||||||
7, /* Advanced Interrupt Controller */
|
|
||||||
7, /* System Peripherals */
|
|
||||||
0, /* Parallel IO Controller A */
|
|
||||||
0, /* Parallel IO Controller B */
|
|
||||||
0, /* Parallel IO Controller C */
|
|
||||||
3, /* Ethernet */
|
|
||||||
6, /* USART 0 */
|
|
||||||
6, /* USART 1 */
|
|
||||||
6, /* USART 2 */
|
|
||||||
0, /* Multimedia Card Interface */
|
|
||||||
4, /* USB Device Port */
|
|
||||||
0, /* Two-Wire Interface 0 */
|
|
||||||
6, /* Serial Peripheral Interface 0 */
|
|
||||||
6, /* Serial Peripheral Interface 1 */
|
|
||||||
5, /* Serial Synchronous Controller 0 */
|
|
||||||
5, /* Serial Synchronous Controller 1 */
|
|
||||||
5, /* Serial Synchronous Controller 2 */
|
|
||||||
0, /* Timer Counter 0 */
|
|
||||||
0, /* Timer Counter 1 */
|
|
||||||
0, /* Timer Counter 2 */
|
|
||||||
3, /* USB Host port */
|
|
||||||
3, /* Serial Synchronous Controller 3 */
|
|
||||||
0, /* Two-Wire Interface 1 */
|
|
||||||
0, /* CAN Controller 0 */
|
|
||||||
0, /* CAN Controller 1 */
|
|
||||||
0, /* mAgicV HALT line */
|
|
||||||
0, /* mAgicV SIRQ0 line */
|
|
||||||
0, /* mAgicV exception line */
|
|
||||||
0, /* mAgicV end of DMA line */
|
|
||||||
0, /* Advanced Interrupt Controller */
|
|
||||||
0, /* Advanced Interrupt Controller */
|
|
||||||
0, /* Advanced Interrupt Controller */
|
|
||||||
};
|
|
||||||
|
|
||||||
void __init at572d940hf_init_interrupts(unsigned int priority[NR_AIC_IRQS])
|
|
||||||
{
|
|
||||||
if (!priority)
|
|
||||||
priority = at572d940hf_default_irq_priority;
|
|
||||||
|
|
||||||
/* Initialize the AIC interrupt controller */
|
|
||||||
at91_aic_init(priority);
|
|
||||||
|
|
||||||
/* Enable GPIO interrupts */
|
|
||||||
at91_gpio_irq_setup();
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,970 +0,0 @@
|
||||||
/*
|
|
||||||
* arch/arm/mach-at91/at572d940hf_devices.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 2008 Atmel Antonio R. Costa <costa.antonior@gmail.com>
|
|
||||||
* Copyright (C) 2005 Thibaut VARENE <varenet@parisc-linux.org>
|
|
||||||
* Copyright (C) 2005 David Brownell
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <asm/mach/arch.h>
|
|
||||||
#include <asm/mach/map.h>
|
|
||||||
|
|
||||||
#include <linux/dma-mapping.h>
|
|
||||||
#include <linux/platform_device.h>
|
|
||||||
|
|
||||||
#include <mach/board.h>
|
|
||||||
#include <mach/gpio.h>
|
|
||||||
#include <mach/at572d940hf.h>
|
|
||||||
#include <mach/at572d940hf_matrix.h>
|
|
||||||
#include <mach/at91sam9_smc.h>
|
|
||||||
|
|
||||||
#include "generic.h"
|
|
||||||
#include "sam9_smc.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
|
||||||
* USB Host
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
|
|
||||||
static u64 ohci_dmamask = DMA_BIT_MASK(32);
|
|
||||||
static struct at91_usbh_data usbh_data;
|
|
||||||
|
|
||||||
static struct resource usbh_resources[] = {
|
|
||||||
[0] = {
|
|
||||||
.start = AT572D940HF_UHP_BASE,
|
|
||||||
.end = AT572D940HF_UHP_BASE + SZ_1M - 1,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
},
|
|
||||||
[1] = {
|
|
||||||
.start = AT572D940HF_ID_UHP,
|
|
||||||
.end = AT572D940HF_ID_UHP,
|
|
||||||
.flags = IORESOURCE_IRQ,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct platform_device at572d940hf_usbh_device = {
|
|
||||||
.name = "at91_ohci",
|
|
||||||
.id = -1,
|
|
||||||
.dev = {
|
|
||||||
.dma_mask = &ohci_dmamask,
|
|
||||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
|
||||||
.platform_data = &usbh_data,
|
|
||||||
},
|
|
||||||
.resource = usbh_resources,
|
|
||||||
.num_resources = ARRAY_SIZE(usbh_resources),
|
|
||||||
};
|
|
||||||
|
|
||||||
void __init at91_add_device_usbh(struct at91_usbh_data *data)
|
|
||||||
{
|
|
||||||
if (!data)
|
|
||||||
return;
|
|
||||||
|
|
||||||
usbh_data = *data;
|
|
||||||
platform_device_register(&at572d940hf_usbh_device);
|
|
||||||
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
void __init at91_add_device_usbh(struct at91_usbh_data *data) {}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
|
||||||
* USB Device (Gadget)
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#ifdef CONFIG_USB_GADGET_AT91
|
|
||||||
static struct at91_udc_data udc_data;
|
|
||||||
|
|
||||||
static struct resource udc_resources[] = {
|
|
||||||
[0] = {
|
|
||||||
.start = AT572D940HF_BASE_UDP,
|
|
||||||
.end = AT572D940HF_BASE_UDP + SZ_16K - 1,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
},
|
|
||||||
[1] = {
|
|
||||||
.start = AT572D940HF_ID_UDP,
|
|
||||||
.end = AT572D940HF_ID_UDP,
|
|
||||||
.flags = IORESOURCE_IRQ,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct platform_device at572d940hf_udc_device = {
|
|
||||||
.name = "at91_udc",
|
|
||||||
.id = -1,
|
|
||||||
.dev = {
|
|
||||||
.platform_data = &udc_data,
|
|
||||||
},
|
|
||||||
.resource = udc_resources,
|
|
||||||
.num_resources = ARRAY_SIZE(udc_resources),
|
|
||||||
};
|
|
||||||
|
|
||||||
void __init at91_add_device_udc(struct at91_udc_data *data)
|
|
||||||
{
|
|
||||||
if (!data)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (data->vbus_pin) {
|
|
||||||
at91_set_gpio_input(data->vbus_pin, 0);
|
|
||||||
at91_set_deglitch(data->vbus_pin, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Pullup pin is handled internally */
|
|
||||||
|
|
||||||
udc_data = *data;
|
|
||||||
platform_device_register(&at572d940hf_udc_device);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
void __init at91_add_device_udc(struct at91_udc_data *data) {}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
|
||||||
* Ethernet
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#if defined(CONFIG_MACB) || defined(CONFIG_MACB_MODULE)
|
|
||||||
static u64 eth_dmamask = DMA_BIT_MASK(32);
|
|
||||||
static struct at91_eth_data eth_data;
|
|
||||||
|
|
||||||
static struct resource eth_resources[] = {
|
|
||||||
[0] = {
|
|
||||||
.start = AT572D940HF_BASE_EMAC,
|
|
||||||
.end = AT572D940HF_BASE_EMAC + SZ_16K - 1,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
},
|
|
||||||
[1] = {
|
|
||||||
.start = AT572D940HF_ID_EMAC,
|
|
||||||
.end = AT572D940HF_ID_EMAC,
|
|
||||||
.flags = IORESOURCE_IRQ,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct platform_device at572d940hf_eth_device = {
|
|
||||||
.name = "macb",
|
|
||||||
.id = -1,
|
|
||||||
.dev = {
|
|
||||||
.dma_mask = ð_dmamask,
|
|
||||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
|
||||||
.platform_data = ð_data,
|
|
||||||
},
|
|
||||||
.resource = eth_resources,
|
|
||||||
.num_resources = ARRAY_SIZE(eth_resources),
|
|
||||||
};
|
|
||||||
|
|
||||||
void __init at91_add_device_eth(struct at91_eth_data *data)
|
|
||||||
{
|
|
||||||
if (!data)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (data->phy_irq_pin) {
|
|
||||||
at91_set_gpio_input(data->phy_irq_pin, 0);
|
|
||||||
at91_set_deglitch(data->phy_irq_pin, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Only RMII is supported */
|
|
||||||
data->is_rmii = 1;
|
|
||||||
|
|
||||||
/* Pins used for RMII */
|
|
||||||
at91_set_A_periph(AT91_PIN_PA16, 0); /* ETXCK_EREFCK */
|
|
||||||
at91_set_A_periph(AT91_PIN_PA17, 0); /* ERXDV */
|
|
||||||
at91_set_A_periph(AT91_PIN_PA18, 0); /* ERX0 */
|
|
||||||
at91_set_A_periph(AT91_PIN_PA19, 0); /* ERX1 */
|
|
||||||
at91_set_A_periph(AT91_PIN_PA20, 0); /* ERXER */
|
|
||||||
at91_set_A_periph(AT91_PIN_PA23, 0); /* ETXEN */
|
|
||||||
at91_set_A_periph(AT91_PIN_PA21, 0); /* ETX0 */
|
|
||||||
at91_set_A_periph(AT91_PIN_PA22, 0); /* ETX1 */
|
|
||||||
at91_set_A_periph(AT91_PIN_PA13, 0); /* EMDIO */
|
|
||||||
at91_set_A_periph(AT91_PIN_PA14, 0); /* EMDC */
|
|
||||||
|
|
||||||
eth_data = *data;
|
|
||||||
platform_device_register(&at572d940hf_eth_device);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
void __init at91_add_device_eth(struct at91_eth_data *data) {}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
|
||||||
* MMC / SD
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE)
|
|
||||||
static u64 mmc_dmamask = DMA_BIT_MASK(32);
|
|
||||||
static struct at91_mmc_data mmc_data;
|
|
||||||
|
|
||||||
static struct resource mmc_resources[] = {
|
|
||||||
[0] = {
|
|
||||||
.start = AT572D940HF_BASE_MCI,
|
|
||||||
.end = AT572D940HF_BASE_MCI + SZ_16K - 1,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
},
|
|
||||||
[1] = {
|
|
||||||
.start = AT572D940HF_ID_MCI,
|
|
||||||
.end = AT572D940HF_ID_MCI,
|
|
||||||
.flags = IORESOURCE_IRQ,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct platform_device at572d940hf_mmc_device = {
|
|
||||||
.name = "at91_mci",
|
|
||||||
.id = -1,
|
|
||||||
.dev = {
|
|
||||||
.dma_mask = &mmc_dmamask,
|
|
||||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
|
||||||
.platform_data = &mmc_data,
|
|
||||||
},
|
|
||||||
.resource = mmc_resources,
|
|
||||||
.num_resources = ARRAY_SIZE(mmc_resources),
|
|
||||||
};
|
|
||||||
|
|
||||||
void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)
|
|
||||||
{
|
|
||||||
if (!data)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* input/irq */
|
|
||||||
if (data->det_pin) {
|
|
||||||
at91_set_gpio_input(data->det_pin, 1);
|
|
||||||
at91_set_deglitch(data->det_pin, 1);
|
|
||||||
}
|
|
||||||
if (data->wp_pin)
|
|
||||||
at91_set_gpio_input(data->wp_pin, 1);
|
|
||||||
if (data->vcc_pin)
|
|
||||||
at91_set_gpio_output(data->vcc_pin, 0);
|
|
||||||
|
|
||||||
/* CLK */
|
|
||||||
at91_set_A_periph(AT91_PIN_PC22, 0);
|
|
||||||
|
|
||||||
/* CMD */
|
|
||||||
at91_set_A_periph(AT91_PIN_PC23, 1);
|
|
||||||
|
|
||||||
/* DAT0, maybe DAT1..DAT3 */
|
|
||||||
at91_set_A_periph(AT91_PIN_PC24, 1);
|
|
||||||
if (data->wire4) {
|
|
||||||
at91_set_A_periph(AT91_PIN_PC25, 1);
|
|
||||||
at91_set_A_periph(AT91_PIN_PC26, 1);
|
|
||||||
at91_set_A_periph(AT91_PIN_PC27, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
mmc_data = *data;
|
|
||||||
platform_device_register(&at572d940hf_mmc_device);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
|
||||||
* NAND / SmartMedia
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#if defined(CONFIG_MTD_NAND_ATMEL) || defined(CONFIG_MTD_NAND_ATMEL_MODULE)
|
|
||||||
static struct atmel_nand_data nand_data;
|
|
||||||
|
|
||||||
#define NAND_BASE AT91_CHIPSELECT_3
|
|
||||||
|
|
||||||
static struct resource nand_resources[] = {
|
|
||||||
{
|
|
||||||
.start = NAND_BASE,
|
|
||||||
.end = NAND_BASE + SZ_256M - 1,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct platform_device at572d940hf_nand_device = {
|
|
||||||
.name = "atmel_nand",
|
|
||||||
.id = -1,
|
|
||||||
.dev = {
|
|
||||||
.platform_data = &nand_data,
|
|
||||||
},
|
|
||||||
.resource = nand_resources,
|
|
||||||
.num_resources = ARRAY_SIZE(nand_resources),
|
|
||||||
};
|
|
||||||
|
|
||||||
void __init at91_add_device_nand(struct atmel_nand_data *data)
|
|
||||||
{
|
|
||||||
unsigned long csa;
|
|
||||||
|
|
||||||
if (!data)
|
|
||||||
return;
|
|
||||||
|
|
||||||
csa = at91_sys_read(AT91_MATRIX_EBICSA);
|
|
||||||
at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_CS3A_SMC_SMARTMEDIA);
|
|
||||||
|
|
||||||
/* enable pin */
|
|
||||||
if (data->enable_pin)
|
|
||||||
at91_set_gpio_output(data->enable_pin, 1);
|
|
||||||
|
|
||||||
/* ready/busy pin */
|
|
||||||
if (data->rdy_pin)
|
|
||||||
at91_set_gpio_input(data->rdy_pin, 1);
|
|
||||||
|
|
||||||
/* card detect pin */
|
|
||||||
if (data->det_pin)
|
|
||||||
at91_set_gpio_input(data->det_pin, 1);
|
|
||||||
|
|
||||||
at91_set_A_periph(AT91_PIN_PB28, 0); /* A[22] */
|
|
||||||
at91_set_B_periph(AT91_PIN_PA28, 0); /* NANDOE */
|
|
||||||
at91_set_B_periph(AT91_PIN_PA29, 0); /* NANDWE */
|
|
||||||
|
|
||||||
nand_data = *data;
|
|
||||||
platform_device_register(&at572d940hf_nand_device);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
void __init at91_add_device_nand(struct atmel_nand_data *data) {}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
|
||||||
* TWI (i2c)
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Prefer the GPIO code since the TWI controller isn't robust
|
|
||||||
* (gets overruns and underruns under load) and can only issue
|
|
||||||
* repeated STARTs in one scenario (the driver doesn't yet handle them).
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)
|
|
||||||
|
|
||||||
static struct i2c_gpio_platform_data pdata = {
|
|
||||||
.sda_pin = AT91_PIN_PC7,
|
|
||||||
.sda_is_open_drain = 1,
|
|
||||||
.scl_pin = AT91_PIN_PC8,
|
|
||||||
.scl_is_open_drain = 1,
|
|
||||||
.udelay = 2, /* ~100 kHz */
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct platform_device at572d940hf_twi_device {
|
|
||||||
.name = "i2c-gpio",
|
|
||||||
.id = -1,
|
|
||||||
.dev.platform_data = &pdata,
|
|
||||||
};
|
|
||||||
|
|
||||||
void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)
|
|
||||||
{
|
|
||||||
at91_set_GPIO_periph(AT91_PIN_PC7, 1); /* TWD (SDA) */
|
|
||||||
at91_set_multi_drive(AT91_PIN_PC7, 1);
|
|
||||||
|
|
||||||
at91_set_GPIO_periph(AT91_PIN_PA8, 1); /* TWCK (SCL) */
|
|
||||||
at91_set_multi_drive(AT91_PIN_PC8, 1);
|
|
||||||
|
|
||||||
i2c_register_board_info(0, devices, nr_devices);
|
|
||||||
platform_device_register(&at572d940hf_twi_device);
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined(CONFIG_I2C_AT91) || defined(CONFIG_I2C_AT91_MODULE)
|
|
||||||
|
|
||||||
static struct resource twi0_resources[] = {
|
|
||||||
[0] = {
|
|
||||||
.start = AT572D940HF_BASE_TWI0,
|
|
||||||
.end = AT572D940HF_BASE_TWI0 + SZ_16K - 1,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
},
|
|
||||||
[1] = {
|
|
||||||
.start = AT572D940HF_ID_TWI0,
|
|
||||||
.end = AT572D940HF_ID_TWI0,
|
|
||||||
.flags = IORESOURCE_IRQ,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct platform_device at572d940hf_twi0_device = {
|
|
||||||
.name = "at91_i2c",
|
|
||||||
.id = 0,
|
|
||||||
.resource = twi0_resources,
|
|
||||||
.num_resources = ARRAY_SIZE(twi0_resources),
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct resource twi1_resources[] = {
|
|
||||||
[0] = {
|
|
||||||
.start = AT572D940HF_BASE_TWI1,
|
|
||||||
.end = AT572D940HF_BASE_TWI1 + SZ_16K - 1,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
},
|
|
||||||
[1] = {
|
|
||||||
.start = AT572D940HF_ID_TWI1,
|
|
||||||
.end = AT572D940HF_ID_TWI1,
|
|
||||||
.flags = IORESOURCE_IRQ,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct platform_device at572d940hf_twi1_device = {
|
|
||||||
.name = "at91_i2c",
|
|
||||||
.id = 1,
|
|
||||||
.resource = twi1_resources,
|
|
||||||
.num_resources = ARRAY_SIZE(twi1_resources),
|
|
||||||
};
|
|
||||||
|
|
||||||
void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)
|
|
||||||
{
|
|
||||||
/* pins used for TWI0 interface */
|
|
||||||
at91_set_A_periph(AT91_PIN_PC7, 0); /* TWD */
|
|
||||||
at91_set_multi_drive(AT91_PIN_PC7, 1);
|
|
||||||
|
|
||||||
at91_set_A_periph(AT91_PIN_PC8, 0); /* TWCK */
|
|
||||||
at91_set_multi_drive(AT91_PIN_PC8, 1);
|
|
||||||
|
|
||||||
/* pins used for TWI1 interface */
|
|
||||||
at91_set_A_periph(AT91_PIN_PC20, 0); /* TWD */
|
|
||||||
at91_set_multi_drive(AT91_PIN_PC20, 1);
|
|
||||||
|
|
||||||
at91_set_A_periph(AT91_PIN_PC21, 0); /* TWCK */
|
|
||||||
at91_set_multi_drive(AT91_PIN_PC21, 1);
|
|
||||||
|
|
||||||
i2c_register_board_info(0, devices, nr_devices);
|
|
||||||
platform_device_register(&at572d940hf_twi0_device);
|
|
||||||
platform_device_register(&at572d940hf_twi1_device);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices) {}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
|
||||||
* SPI
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE)
|
|
||||||
static u64 spi_dmamask = DMA_BIT_MASK(32);
|
|
||||||
|
|
||||||
static struct resource spi0_resources[] = {
|
|
||||||
[0] = {
|
|
||||||
.start = AT572D940HF_BASE_SPI0,
|
|
||||||
.end = AT572D940HF_BASE_SPI0 + SZ_16K - 1,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
},
|
|
||||||
[1] = {
|
|
||||||
.start = AT572D940HF_ID_SPI0,
|
|
||||||
.end = AT572D940HF_ID_SPI0,
|
|
||||||
.flags = IORESOURCE_IRQ,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct platform_device at572d940hf_spi0_device = {
|
|
||||||
.name = "atmel_spi",
|
|
||||||
.id = 0,
|
|
||||||
.dev = {
|
|
||||||
.dma_mask = &spi_dmamask,
|
|
||||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
|
||||||
},
|
|
||||||
.resource = spi0_resources,
|
|
||||||
.num_resources = ARRAY_SIZE(spi0_resources),
|
|
||||||
};
|
|
||||||
|
|
||||||
static const unsigned spi0_standard_cs[4] = { AT91_PIN_PA3, AT91_PIN_PA4, AT91_PIN_PA5, AT91_PIN_PA6 };
|
|
||||||
|
|
||||||
static struct resource spi1_resources[] = {
|
|
||||||
[0] = {
|
|
||||||
.start = AT572D940HF_BASE_SPI1,
|
|
||||||
.end = AT572D940HF_BASE_SPI1 + SZ_16K - 1,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
},
|
|
||||||
[1] = {
|
|
||||||
.start = AT572D940HF_ID_SPI1,
|
|
||||||
.end = AT572D940HF_ID_SPI1,
|
|
||||||
.flags = IORESOURCE_IRQ,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct platform_device at572d940hf_spi1_device = {
|
|
||||||
.name = "atmel_spi",
|
|
||||||
.id = 1,
|
|
||||||
.dev = {
|
|
||||||
.dma_mask = &spi_dmamask,
|
|
||||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
|
||||||
},
|
|
||||||
.resource = spi1_resources,
|
|
||||||
.num_resources = ARRAY_SIZE(spi1_resources),
|
|
||||||
};
|
|
||||||
|
|
||||||
static const unsigned spi1_standard_cs[4] = { AT91_PIN_PC3, AT91_PIN_PC4, AT91_PIN_PC5, AT91_PIN_PC6 };
|
|
||||||
|
|
||||||
void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
unsigned long cs_pin;
|
|
||||||
short enable_spi0 = 0;
|
|
||||||
short enable_spi1 = 0;
|
|
||||||
|
|
||||||
/* Choose SPI chip-selects */
|
|
||||||
for (i = 0; i < nr_devices; i++) {
|
|
||||||
if (devices[i].controller_data)
|
|
||||||
cs_pin = (unsigned long) devices[i].controller_data;
|
|
||||||
else if (devices[i].bus_num == 0)
|
|
||||||
cs_pin = spi0_standard_cs[devices[i].chip_select];
|
|
||||||
else
|
|
||||||
cs_pin = spi1_standard_cs[devices[i].chip_select];
|
|
||||||
|
|
||||||
if (devices[i].bus_num == 0)
|
|
||||||
enable_spi0 = 1;
|
|
||||||
else
|
|
||||||
enable_spi1 = 1;
|
|
||||||
|
|
||||||
/* enable chip-select pin */
|
|
||||||
at91_set_gpio_output(cs_pin, 1);
|
|
||||||
|
|
||||||
/* pass chip-select pin to driver */
|
|
||||||
devices[i].controller_data = (void *) cs_pin;
|
|
||||||
}
|
|
||||||
|
|
||||||
spi_register_board_info(devices, nr_devices);
|
|
||||||
|
|
||||||
/* Configure SPI bus(es) */
|
|
||||||
if (enable_spi0) {
|
|
||||||
at91_set_A_periph(AT91_PIN_PA0, 0); /* SPI0_MISO */
|
|
||||||
at91_set_A_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */
|
|
||||||
at91_set_A_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */
|
|
||||||
|
|
||||||
at91_clock_associate("spi0_clk", &at572d940hf_spi0_device.dev, "spi_clk");
|
|
||||||
platform_device_register(&at572d940hf_spi0_device);
|
|
||||||
}
|
|
||||||
if (enable_spi1) {
|
|
||||||
at91_set_A_periph(AT91_PIN_PC0, 0); /* SPI1_MISO */
|
|
||||||
at91_set_A_periph(AT91_PIN_PC1, 0); /* SPI1_MOSI */
|
|
||||||
at91_set_A_periph(AT91_PIN_PC2, 0); /* SPI1_SPCK */
|
|
||||||
|
|
||||||
at91_clock_associate("spi1_clk", &at572d940hf_spi1_device.dev, "spi_clk");
|
|
||||||
platform_device_register(&at572d940hf_spi1_device);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) {}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
|
||||||
* Timer/Counter blocks
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#ifdef CONFIG_ATMEL_TCLIB
|
|
||||||
|
|
||||||
static struct resource tcb_resources[] = {
|
|
||||||
[0] = {
|
|
||||||
.start = AT572D940HF_BASE_TCB,
|
|
||||||
.end = AT572D940HF_BASE_TCB + SZ_16K - 1,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
},
|
|
||||||
[1] = {
|
|
||||||
.start = AT572D940HF_ID_TC0,
|
|
||||||
.end = AT572D940HF_ID_TC0,
|
|
||||||
.flags = IORESOURCE_IRQ,
|
|
||||||
},
|
|
||||||
[2] = {
|
|
||||||
.start = AT572D940HF_ID_TC1,
|
|
||||||
.end = AT572D940HF_ID_TC1,
|
|
||||||
.flags = IORESOURCE_IRQ,
|
|
||||||
},
|
|
||||||
[3] = {
|
|
||||||
.start = AT572D940HF_ID_TC2,
|
|
||||||
.end = AT572D940HF_ID_TC2,
|
|
||||||
.flags = IORESOURCE_IRQ,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct platform_device at572d940hf_tcb_device = {
|
|
||||||
.name = "atmel_tcb",
|
|
||||||
.id = 0,
|
|
||||||
.resource = tcb_resources,
|
|
||||||
.num_resources = ARRAY_SIZE(tcb_resources),
|
|
||||||
};
|
|
||||||
|
|
||||||
static void __init at91_add_device_tc(void)
|
|
||||||
{
|
|
||||||
/* this chip has a separate clock and irq for each TC channel */
|
|
||||||
at91_clock_associate("tc0_clk", &at572d940hf_tcb_device.dev, "t0_clk");
|
|
||||||
at91_clock_associate("tc1_clk", &at572d940hf_tcb_device.dev, "t1_clk");
|
|
||||||
at91_clock_associate("tc2_clk", &at572d940hf_tcb_device.dev, "t2_clk");
|
|
||||||
platform_device_register(&at572d940hf_tcb_device);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static void __init at91_add_device_tc(void) { }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
|
||||||
* RTT
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
static struct resource rtt_resources[] = {
|
|
||||||
{
|
|
||||||
.start = AT91_BASE_SYS + AT91_RTT,
|
|
||||||
.end = AT91_BASE_SYS + AT91_RTT + SZ_16 - 1,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct platform_device at572d940hf_rtt_device = {
|
|
||||||
.name = "at91_rtt",
|
|
||||||
.id = 0,
|
|
||||||
.resource = rtt_resources,
|
|
||||||
.num_resources = ARRAY_SIZE(rtt_resources),
|
|
||||||
};
|
|
||||||
|
|
||||||
static void __init at91_add_device_rtt(void)
|
|
||||||
{
|
|
||||||
platform_device_register(&at572d940hf_rtt_device);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
|
||||||
* Watchdog
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
|
|
||||||
static struct platform_device at572d940hf_wdt_device = {
|
|
||||||
.name = "at91_wdt",
|
|
||||||
.id = -1,
|
|
||||||
.num_resources = 0,
|
|
||||||
};
|
|
||||||
|
|
||||||
static void __init at91_add_device_watchdog(void)
|
|
||||||
{
|
|
||||||
platform_device_register(&at572d940hf_wdt_device);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static void __init at91_add_device_watchdog(void) {}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
|
||||||
* UART
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#if defined(CONFIG_SERIAL_ATMEL)
|
|
||||||
static struct resource dbgu_resources[] = {
|
|
||||||
[0] = {
|
|
||||||
.start = AT91_VA_BASE_SYS + AT91_DBGU,
|
|
||||||
.end = AT91_VA_BASE_SYS + AT91_DBGU + SZ_512 - 1,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
},
|
|
||||||
[1] = {
|
|
||||||
.start = AT91_ID_SYS,
|
|
||||||
.end = AT91_ID_SYS,
|
|
||||||
.flags = IORESOURCE_IRQ,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct atmel_uart_data dbgu_data = {
|
|
||||||
.use_dma_tx = 0,
|
|
||||||
.use_dma_rx = 0, /* DBGU not capable of receive DMA */
|
|
||||||
.regs = (void __iomem *)(AT91_VA_BASE_SYS + AT91_DBGU),
|
|
||||||
};
|
|
||||||
|
|
||||||
static u64 dbgu_dmamask = DMA_BIT_MASK(32);
|
|
||||||
|
|
||||||
static struct platform_device at572d940hf_dbgu_device = {
|
|
||||||
.name = "atmel_usart",
|
|
||||||
.id = 0,
|
|
||||||
.dev = {
|
|
||||||
.dma_mask = &dbgu_dmamask,
|
|
||||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
|
||||||
.platform_data = &dbgu_data,
|
|
||||||
},
|
|
||||||
.resource = dbgu_resources,
|
|
||||||
.num_resources = ARRAY_SIZE(dbgu_resources),
|
|
||||||
};
|
|
||||||
|
|
||||||
static inline void configure_dbgu_pins(void)
|
|
||||||
{
|
|
||||||
at91_set_A_periph(AT91_PIN_PC31, 1); /* DTXD */
|
|
||||||
at91_set_A_periph(AT91_PIN_PC30, 0); /* DRXD */
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct resource uart0_resources[] = {
|
|
||||||
[0] = {
|
|
||||||
.start = AT572D940HF_BASE_US0,
|
|
||||||
.end = AT572D940HF_BASE_US0 + SZ_16K - 1,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
},
|
|
||||||
[1] = {
|
|
||||||
.start = AT572D940HF_ID_US0,
|
|
||||||
.end = AT572D940HF_ID_US0,
|
|
||||||
.flags = IORESOURCE_IRQ,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct atmel_uart_data uart0_data = {
|
|
||||||
.use_dma_tx = 1,
|
|
||||||
.use_dma_rx = 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
static u64 uart0_dmamask = DMA_BIT_MASK(32);
|
|
||||||
|
|
||||||
static struct platform_device at572d940hf_uart0_device = {
|
|
||||||
.name = "atmel_usart",
|
|
||||||
.id = 1,
|
|
||||||
.dev = {
|
|
||||||
.dma_mask = &uart0_dmamask,
|
|
||||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
|
||||||
.platform_data = &uart0_data,
|
|
||||||
},
|
|
||||||
.resource = uart0_resources,
|
|
||||||
.num_resources = ARRAY_SIZE(uart0_resources),
|
|
||||||
};
|
|
||||||
|
|
||||||
static inline void configure_usart0_pins(unsigned pins)
|
|
||||||
{
|
|
||||||
at91_set_A_periph(AT91_PIN_PA8, 1); /* TXD0 */
|
|
||||||
at91_set_A_periph(AT91_PIN_PA7, 0); /* RXD0 */
|
|
||||||
|
|
||||||
if (pins & ATMEL_UART_RTS)
|
|
||||||
at91_set_A_periph(AT91_PIN_PA10, 0); /* RTS0 */
|
|
||||||
if (pins & ATMEL_UART_CTS)
|
|
||||||
at91_set_A_periph(AT91_PIN_PA9, 0); /* CTS0 */
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct resource uart1_resources[] = {
|
|
||||||
[0] = {
|
|
||||||
.start = AT572D940HF_BASE_US1,
|
|
||||||
.end = AT572D940HF_BASE_US1 + SZ_16K - 1,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
},
|
|
||||||
[1] = {
|
|
||||||
.start = AT572D940HF_ID_US1,
|
|
||||||
.end = AT572D940HF_ID_US1,
|
|
||||||
.flags = IORESOURCE_IRQ,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct atmel_uart_data uart1_data = {
|
|
||||||
.use_dma_tx = 1,
|
|
||||||
.use_dma_rx = 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
static u64 uart1_dmamask = DMA_BIT_MASK(32);
|
|
||||||
|
|
||||||
static struct platform_device at572d940hf_uart1_device = {
|
|
||||||
.name = "atmel_usart",
|
|
||||||
.id = 2,
|
|
||||||
.dev = {
|
|
||||||
.dma_mask = &uart1_dmamask,
|
|
||||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
|
||||||
.platform_data = &uart1_data,
|
|
||||||
},
|
|
||||||
.resource = uart1_resources,
|
|
||||||
.num_resources = ARRAY_SIZE(uart1_resources),
|
|
||||||
};
|
|
||||||
|
|
||||||
static inline void configure_usart1_pins(unsigned pins)
|
|
||||||
{
|
|
||||||
at91_set_A_periph(AT91_PIN_PC10, 1); /* TXD1 */
|
|
||||||
at91_set_A_periph(AT91_PIN_PC9 , 0); /* RXD1 */
|
|
||||||
|
|
||||||
if (pins & ATMEL_UART_RTS)
|
|
||||||
at91_set_A_periph(AT91_PIN_PC12, 0); /* RTS1 */
|
|
||||||
if (pins & ATMEL_UART_CTS)
|
|
||||||
at91_set_A_periph(AT91_PIN_PC11, 0); /* CTS1 */
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct resource uart2_resources[] = {
|
|
||||||
[0] = {
|
|
||||||
.start = AT572D940HF_BASE_US2,
|
|
||||||
.end = AT572D940HF_BASE_US2 + SZ_16K - 1,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
},
|
|
||||||
[1] = {
|
|
||||||
.start = AT572D940HF_ID_US2,
|
|
||||||
.end = AT572D940HF_ID_US2,
|
|
||||||
.flags = IORESOURCE_IRQ,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct atmel_uart_data uart2_data = {
|
|
||||||
.use_dma_tx = 1,
|
|
||||||
.use_dma_rx = 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
static u64 uart2_dmamask = DMA_BIT_MASK(32);
|
|
||||||
|
|
||||||
static struct platform_device at572d940hf_uart2_device = {
|
|
||||||
.name = "atmel_usart",
|
|
||||||
.id = 3,
|
|
||||||
.dev = {
|
|
||||||
.dma_mask = &uart2_dmamask,
|
|
||||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
|
||||||
.platform_data = &uart2_data,
|
|
||||||
},
|
|
||||||
.resource = uart2_resources,
|
|
||||||
.num_resources = ARRAY_SIZE(uart2_resources),
|
|
||||||
};
|
|
||||||
|
|
||||||
static inline void configure_usart2_pins(unsigned pins)
|
|
||||||
{
|
|
||||||
at91_set_A_periph(AT91_PIN_PC15, 1); /* TXD2 */
|
|
||||||
at91_set_A_periph(AT91_PIN_PC14, 0); /* RXD2 */
|
|
||||||
|
|
||||||
if (pins & ATMEL_UART_RTS)
|
|
||||||
at91_set_A_periph(AT91_PIN_PC17, 0); /* RTS2 */
|
|
||||||
if (pins & ATMEL_UART_CTS)
|
|
||||||
at91_set_A_periph(AT91_PIN_PC16, 0); /* CTS2 */
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct platform_device *__initdata at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */
|
|
||||||
struct platform_device *atmel_default_console_device; /* the serial console device */
|
|
||||||
|
|
||||||
void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
|
|
||||||
{
|
|
||||||
struct platform_device *pdev;
|
|
||||||
|
|
||||||
switch (id) {
|
|
||||||
case 0: /* DBGU */
|
|
||||||
pdev = &at572d940hf_dbgu_device;
|
|
||||||
configure_dbgu_pins();
|
|
||||||
at91_clock_associate("mck", &pdev->dev, "usart");
|
|
||||||
break;
|
|
||||||
case AT572D940HF_ID_US0:
|
|
||||||
pdev = &at572d940hf_uart0_device;
|
|
||||||
configure_usart0_pins(pins);
|
|
||||||
at91_clock_associate("usart0_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
|
||||||
case AT572D940HF_ID_US1:
|
|
||||||
pdev = &at572d940hf_uart1_device;
|
|
||||||
configure_usart1_pins(pins);
|
|
||||||
at91_clock_associate("usart1_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
|
||||||
case AT572D940HF_ID_US2:
|
|
||||||
pdev = &at572d940hf_uart2_device;
|
|
||||||
configure_usart2_pins(pins);
|
|
||||||
at91_clock_associate("usart2_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
pdev->id = portnr; /* update to mapped ID */
|
|
||||||
|
|
||||||
if (portnr < ATMEL_MAX_UART)
|
|
||||||
at91_uarts[portnr] = pdev;
|
|
||||||
}
|
|
||||||
|
|
||||||
void __init at91_set_serial_console(unsigned portnr)
|
|
||||||
{
|
|
||||||
if (portnr < ATMEL_MAX_UART)
|
|
||||||
atmel_default_console_device = at91_uarts[portnr];
|
|
||||||
}
|
|
||||||
|
|
||||||
void __init at91_add_device_serial(void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < ATMEL_MAX_UART; i++) {
|
|
||||||
if (at91_uarts[i])
|
|
||||||
platform_device_register(at91_uarts[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!atmel_default_console_device)
|
|
||||||
printk(KERN_INFO "AT91: No default serial console defined.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) {}
|
|
||||||
void __init at91_set_serial_console(unsigned portnr) {}
|
|
||||||
void __init at91_add_device_serial(void) {}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
|
||||||
* mAgic
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#ifdef CONFIG_MAGICV
|
|
||||||
static struct resource mAgic_resources[] = {
|
|
||||||
{
|
|
||||||
.start = AT91_MAGIC_PM_BASE,
|
|
||||||
.end = AT91_MAGIC_PM_BASE + AT91_MAGIC_PM_SIZE - 1,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.start = AT91_MAGIC_DM_I_BASE,
|
|
||||||
.end = AT91_MAGIC_DM_I_BASE + AT91_MAGIC_DM_I_SIZE - 1,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.start = AT91_MAGIC_DM_F_BASE,
|
|
||||||
.end = AT91_MAGIC_DM_F_BASE + AT91_MAGIC_DM_F_SIZE - 1,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.start = AT91_MAGIC_DM_DB_BASE,
|
|
||||||
.end = AT91_MAGIC_DM_DB_BASE + AT91_MAGIC_DM_DB_SIZE - 1,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.start = AT91_MAGIC_REGS_BASE,
|
|
||||||
.end = AT91_MAGIC_REGS_BASE + AT91_MAGIC_REGS_SIZE - 1,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.start = AT91_MAGIC_EXTPAGE_BASE,
|
|
||||||
.end = AT91_MAGIC_EXTPAGE_BASE + AT91_MAGIC_EXTPAGE_SIZE - 1,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.start = AT572D940HF_ID_MSIRQ0,
|
|
||||||
.end = AT572D940HF_ID_MSIRQ0,
|
|
||||||
.flags = IORESOURCE_IRQ,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.start = AT572D940HF_ID_MHALT,
|
|
||||||
.end = AT572D940HF_ID_MHALT,
|
|
||||||
.flags = IORESOURCE_IRQ,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.start = AT572D940HF_ID_MEXC,
|
|
||||||
.end = AT572D940HF_ID_MEXC,
|
|
||||||
.flags = IORESOURCE_IRQ,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.start = AT572D940HF_ID_MEDMA,
|
|
||||||
.end = AT572D940HF_ID_MEDMA,
|
|
||||||
.flags = IORESOURCE_IRQ,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct platform_device mAgic_device = {
|
|
||||||
.name = "mAgic",
|
|
||||||
.id = -1,
|
|
||||||
.num_resources = ARRAY_SIZE(mAgic_resources),
|
|
||||||
.resource = mAgic_resources,
|
|
||||||
};
|
|
||||||
|
|
||||||
void __init at91_add_device_mAgic(void)
|
|
||||||
{
|
|
||||||
platform_device_register(&mAgic_device);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
void __init at91_add_device_mAgic(void) {}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* These devices are always present and don't need any board-specific
|
|
||||||
* setup.
|
|
||||||
*/
|
|
||||||
static int __init at91_add_standard_devices(void)
|
|
||||||
{
|
|
||||||
at91_add_device_rtt();
|
|
||||||
at91_add_device_watchdog();
|
|
||||||
at91_add_device_tc();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
arch_initcall(at91_add_standard_devices);
|
|
|
@ -222,6 +222,25 @@ static struct clk *periph_clocks[] __initdata = {
|
||||||
// irq0 .. irq1
|
// irq0 .. irq1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct clk_lookup periph_clocks_lookups[] = {
|
||||||
|
CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc.0", &utmi_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc.0", &udphs_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.0", &mmc0_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.1", &mmc1_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("ssc", "ssc.0", &ssc0_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("ssc", "ssc.1", &ssc1_clk),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_lookup usart_clocks_lookups[] = {
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.0", &mck),
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.1", &usart0_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.2", &usart1_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.3", &usart2_clk),
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The four programmable clocks.
|
* The four programmable clocks.
|
||||||
* You must configure pin multiplexing to bring these signals out.
|
* You must configure pin multiplexing to bring these signals out.
|
||||||
|
@ -258,12 +277,29 @@ static void __init at91cap9_register_clocks(void)
|
||||||
for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
|
for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
|
||||||
clk_register(periph_clocks[i]);
|
clk_register(periph_clocks[i]);
|
||||||
|
|
||||||
|
clkdev_add_table(periph_clocks_lookups,
|
||||||
|
ARRAY_SIZE(periph_clocks_lookups));
|
||||||
|
clkdev_add_table(usart_clocks_lookups,
|
||||||
|
ARRAY_SIZE(usart_clocks_lookups));
|
||||||
|
|
||||||
clk_register(&pck0);
|
clk_register(&pck0);
|
||||||
clk_register(&pck1);
|
clk_register(&pck1);
|
||||||
clk_register(&pck2);
|
clk_register(&pck2);
|
||||||
clk_register(&pck3);
|
clk_register(&pck3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct clk_lookup console_clock_lookup;
|
||||||
|
|
||||||
|
void __init at91cap9_set_console_clock(int id)
|
||||||
|
{
|
||||||
|
if (id >= ARRAY_SIZE(usart_clocks_lookups))
|
||||||
|
return;
|
||||||
|
|
||||||
|
console_clock_lookup.con_id = "usart";
|
||||||
|
console_clock_lookup.clk = usart_clocks_lookups[id].clk;
|
||||||
|
clkdev_add(&console_clock_lookup);
|
||||||
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
/* --------------------------------------------------------------------
|
||||||
* GPIO
|
* GPIO
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
@ -303,11 +339,14 @@ static void at91cap9_poweroff(void)
|
||||||
* AT91CAP9 processor initialization
|
* AT91CAP9 processor initialization
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
void __init at91cap9_initialize(unsigned long main_clock)
|
void __init at91cap9_map_io(void)
|
||||||
{
|
{
|
||||||
/* Map peripherals */
|
/* Map peripherals */
|
||||||
iotable_init(at91cap9_io_desc, ARRAY_SIZE(at91cap9_io_desc));
|
iotable_init(at91cap9_io_desc, ARRAY_SIZE(at91cap9_io_desc));
|
||||||
|
}
|
||||||
|
|
||||||
|
void __init at91cap9_initialize(unsigned long main_clock)
|
||||||
|
{
|
||||||
at91_arch_reset = at91cap9_reset;
|
at91_arch_reset = at91cap9_reset;
|
||||||
pm_power_off = at91cap9_poweroff;
|
pm_power_off = at91cap9_poweroff;
|
||||||
at91_extern_irq = (1 << AT91CAP9_ID_IRQ0) | (1 << AT91CAP9_ID_IRQ1);
|
at91_extern_irq = (1 << AT91CAP9_ID_IRQ0) | (1 << AT91CAP9_ID_IRQ1);
|
||||||
|
|
|
@ -181,10 +181,6 @@ void __init at91_add_device_usba(struct usba_platform_data *data)
|
||||||
|
|
||||||
/* Pullup pin is handled internally by USB device peripheral */
|
/* Pullup pin is handled internally by USB device peripheral */
|
||||||
|
|
||||||
/* Clocks */
|
|
||||||
at91_clock_associate("utmi_clk", &at91_usba_udc_device.dev, "hclk");
|
|
||||||
at91_clock_associate("udphs_clk", &at91_usba_udc_device.dev, "pclk");
|
|
||||||
|
|
||||||
platform_device_register(&at91_usba_udc_device);
|
platform_device_register(&at91_usba_udc_device);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -355,7 +351,6 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
mmc0_data = *data;
|
mmc0_data = *data;
|
||||||
at91_clock_associate("mci0_clk", &at91cap9_mmc0_device.dev, "mci_clk");
|
|
||||||
platform_device_register(&at91cap9_mmc0_device);
|
platform_device_register(&at91cap9_mmc0_device);
|
||||||
} else { /* MCI1 */
|
} else { /* MCI1 */
|
||||||
/* CLK */
|
/* CLK */
|
||||||
|
@ -373,7 +368,6 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
mmc1_data = *data;
|
mmc1_data = *data;
|
||||||
at91_clock_associate("mci1_clk", &at91cap9_mmc1_device.dev, "mci_clk");
|
|
||||||
platform_device_register(&at91cap9_mmc1_device);
|
platform_device_register(&at91cap9_mmc1_device);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -614,7 +608,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)
|
||||||
at91_set_B_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */
|
at91_set_B_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */
|
||||||
at91_set_B_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */
|
at91_set_B_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */
|
||||||
|
|
||||||
at91_clock_associate("spi0_clk", &at91cap9_spi0_device.dev, "spi_clk");
|
|
||||||
platform_device_register(&at91cap9_spi0_device);
|
platform_device_register(&at91cap9_spi0_device);
|
||||||
}
|
}
|
||||||
if (enable_spi1) {
|
if (enable_spi1) {
|
||||||
|
@ -622,7 +615,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)
|
||||||
at91_set_A_periph(AT91_PIN_PB13, 0); /* SPI1_MOSI */
|
at91_set_A_periph(AT91_PIN_PB13, 0); /* SPI1_MOSI */
|
||||||
at91_set_A_periph(AT91_PIN_PB14, 0); /* SPI1_SPCK */
|
at91_set_A_periph(AT91_PIN_PB14, 0); /* SPI1_SPCK */
|
||||||
|
|
||||||
at91_clock_associate("spi1_clk", &at91cap9_spi1_device.dev, "spi_clk");
|
|
||||||
platform_device_register(&at91cap9_spi1_device);
|
platform_device_register(&at91cap9_spi1_device);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -659,8 +651,6 @@ static struct platform_device at91cap9_tcb_device = {
|
||||||
|
|
||||||
static void __init at91_add_device_tc(void)
|
static void __init at91_add_device_tc(void)
|
||||||
{
|
{
|
||||||
/* this chip has one clock and irq for all three TC channels */
|
|
||||||
at91_clock_associate("tcb_clk", &at91cap9_tcb_device.dev, "t0_clk");
|
|
||||||
platform_device_register(&at91cap9_tcb_device);
|
platform_device_register(&at91cap9_tcb_device);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -1001,12 +991,10 @@ void __init at91_add_device_ssc(unsigned id, unsigned pins)
|
||||||
case AT91CAP9_ID_SSC0:
|
case AT91CAP9_ID_SSC0:
|
||||||
pdev = &at91cap9_ssc0_device;
|
pdev = &at91cap9_ssc0_device;
|
||||||
configure_ssc0_pins(pins);
|
configure_ssc0_pins(pins);
|
||||||
at91_clock_associate("ssc0_clk", &pdev->dev, "ssc");
|
|
||||||
break;
|
break;
|
||||||
case AT91CAP9_ID_SSC1:
|
case AT91CAP9_ID_SSC1:
|
||||||
pdev = &at91cap9_ssc1_device;
|
pdev = &at91cap9_ssc1_device;
|
||||||
configure_ssc1_pins(pins);
|
configure_ssc1_pins(pins);
|
||||||
at91_clock_associate("ssc1_clk", &pdev->dev, "ssc");
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
|
@ -1199,32 +1187,30 @@ struct platform_device *atmel_default_console_device; /* the serial console devi
|
||||||
void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
|
void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
|
||||||
{
|
{
|
||||||
struct platform_device *pdev;
|
struct platform_device *pdev;
|
||||||
|
struct atmel_uart_data *pdata;
|
||||||
|
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case 0: /* DBGU */
|
case 0: /* DBGU */
|
||||||
pdev = &at91cap9_dbgu_device;
|
pdev = &at91cap9_dbgu_device;
|
||||||
configure_dbgu_pins();
|
configure_dbgu_pins();
|
||||||
at91_clock_associate("mck", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
case AT91CAP9_ID_US0:
|
case AT91CAP9_ID_US0:
|
||||||
pdev = &at91cap9_uart0_device;
|
pdev = &at91cap9_uart0_device;
|
||||||
configure_usart0_pins(pins);
|
configure_usart0_pins(pins);
|
||||||
at91_clock_associate("usart0_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
case AT91CAP9_ID_US1:
|
case AT91CAP9_ID_US1:
|
||||||
pdev = &at91cap9_uart1_device;
|
pdev = &at91cap9_uart1_device;
|
||||||
configure_usart1_pins(pins);
|
configure_usart1_pins(pins);
|
||||||
at91_clock_associate("usart1_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
case AT91CAP9_ID_US2:
|
case AT91CAP9_ID_US2:
|
||||||
pdev = &at91cap9_uart2_device;
|
pdev = &at91cap9_uart2_device;
|
||||||
configure_usart2_pins(pins);
|
configure_usart2_pins(pins);
|
||||||
at91_clock_associate("usart2_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
pdev->id = portnr; /* update to mapped ID */
|
pdata = pdev->dev.platform_data;
|
||||||
|
pdata->num = portnr; /* update to mapped ID */
|
||||||
|
|
||||||
if (portnr < ATMEL_MAX_UART)
|
if (portnr < ATMEL_MAX_UART)
|
||||||
at91_uarts[portnr] = pdev;
|
at91_uarts[portnr] = pdev;
|
||||||
|
@ -1232,8 +1218,10 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
|
||||||
|
|
||||||
void __init at91_set_serial_console(unsigned portnr)
|
void __init at91_set_serial_console(unsigned portnr)
|
||||||
{
|
{
|
||||||
if (portnr < ATMEL_MAX_UART)
|
if (portnr < ATMEL_MAX_UART) {
|
||||||
atmel_default_console_device = at91_uarts[portnr];
|
atmel_default_console_device = at91_uarts[portnr];
|
||||||
|
at91cap9_set_console_clock(portnr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init at91_add_device_serial(void)
|
void __init at91_add_device_serial(void)
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include <mach/at91rm9200.h>
|
#include <mach/at91rm9200.h>
|
||||||
#include <mach/at91_pmc.h>
|
#include <mach/at91_pmc.h>
|
||||||
#include <mach/at91_st.h>
|
#include <mach/at91_st.h>
|
||||||
|
#include <mach/cpu.h>
|
||||||
|
|
||||||
#include "generic.h"
|
#include "generic.h"
|
||||||
#include "clock.h"
|
#include "clock.h"
|
||||||
|
@ -191,6 +192,26 @@ static struct clk *periph_clocks[] __initdata = {
|
||||||
// irq0 .. irq6
|
// irq0 .. irq6
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct clk_lookup periph_clocks_lookups[] = {
|
||||||
|
CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tc0_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.0", &tc1_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.0", &tc2_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.1", &tc3_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.1", &tc4_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.1", &tc5_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("ssc", "ssc.0", &ssc0_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("ssc", "ssc.1", &ssc1_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("ssc", "ssc.2", &ssc2_clk),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_lookup usart_clocks_lookups[] = {
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.0", &mck),
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.1", &usart0_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.2", &usart1_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.3", &usart2_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.4", &usart3_clk),
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The four programmable clocks.
|
* The four programmable clocks.
|
||||||
* You must configure pin multiplexing to bring these signals out.
|
* You must configure pin multiplexing to bring these signals out.
|
||||||
|
@ -227,12 +248,29 @@ static void __init at91rm9200_register_clocks(void)
|
||||||
for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
|
for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
|
||||||
clk_register(periph_clocks[i]);
|
clk_register(periph_clocks[i]);
|
||||||
|
|
||||||
|
clkdev_add_table(periph_clocks_lookups,
|
||||||
|
ARRAY_SIZE(periph_clocks_lookups));
|
||||||
|
clkdev_add_table(usart_clocks_lookups,
|
||||||
|
ARRAY_SIZE(usart_clocks_lookups));
|
||||||
|
|
||||||
clk_register(&pck0);
|
clk_register(&pck0);
|
||||||
clk_register(&pck1);
|
clk_register(&pck1);
|
||||||
clk_register(&pck2);
|
clk_register(&pck2);
|
||||||
clk_register(&pck3);
|
clk_register(&pck3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct clk_lookup console_clock_lookup;
|
||||||
|
|
||||||
|
void __init at91rm9200_set_console_clock(int id)
|
||||||
|
{
|
||||||
|
if (id >= ARRAY_SIZE(usart_clocks_lookups))
|
||||||
|
return;
|
||||||
|
|
||||||
|
console_clock_lookup.con_id = "usart";
|
||||||
|
console_clock_lookup.clk = usart_clocks_lookups[id].clk;
|
||||||
|
clkdev_add(&console_clock_lookup);
|
||||||
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
/* --------------------------------------------------------------------
|
||||||
* GPIO
|
* GPIO
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
@ -266,15 +304,25 @@ static void at91rm9200_reset(void)
|
||||||
at91_sys_write(AT91_ST_CR, AT91_ST_WDRST);
|
at91_sys_write(AT91_ST_CR, AT91_ST_WDRST);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int rm9200_type;
|
||||||
|
EXPORT_SYMBOL(rm9200_type);
|
||||||
|
|
||||||
|
void __init at91rm9200_set_type(int type)
|
||||||
|
{
|
||||||
|
rm9200_type = type;
|
||||||
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
/* --------------------------------------------------------------------
|
||||||
* AT91RM9200 processor initialization
|
* AT91RM9200 processor initialization
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
void __init at91rm9200_initialize(unsigned long main_clock, unsigned short banks)
|
void __init at91rm9200_map_io(void)
|
||||||
{
|
{
|
||||||
/* Map peripherals */
|
/* Map peripherals */
|
||||||
iotable_init(at91rm9200_io_desc, ARRAY_SIZE(at91rm9200_io_desc));
|
iotable_init(at91rm9200_io_desc, ARRAY_SIZE(at91rm9200_io_desc));
|
||||||
|
}
|
||||||
|
|
||||||
|
void __init at91rm9200_initialize(unsigned long main_clock)
|
||||||
|
{
|
||||||
at91_arch_reset = at91rm9200_reset;
|
at91_arch_reset = at91rm9200_reset;
|
||||||
at91_extern_irq = (1 << AT91RM9200_ID_IRQ0) | (1 << AT91RM9200_ID_IRQ1)
|
at91_extern_irq = (1 << AT91RM9200_ID_IRQ0) | (1 << AT91RM9200_ID_IRQ1)
|
||||||
| (1 << AT91RM9200_ID_IRQ2) | (1 << AT91RM9200_ID_IRQ3)
|
| (1 << AT91RM9200_ID_IRQ2) | (1 << AT91RM9200_ID_IRQ3)
|
||||||
|
@ -288,7 +336,8 @@ void __init at91rm9200_initialize(unsigned long main_clock, unsigned short banks
|
||||||
at91rm9200_register_clocks();
|
at91rm9200_register_clocks();
|
||||||
|
|
||||||
/* Initialize GPIO subsystem */
|
/* Initialize GPIO subsystem */
|
||||||
at91_gpio_init(at91rm9200_gpio, banks);
|
at91_gpio_init(at91rm9200_gpio,
|
||||||
|
cpu_is_at91rm9200_bga() ? AT91RM9200_BGA : AT91RM9200_PQFP);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -644,15 +644,7 @@ static struct platform_device at91rm9200_tcb1_device = {
|
||||||
|
|
||||||
static void __init at91_add_device_tc(void)
|
static void __init at91_add_device_tc(void)
|
||||||
{
|
{
|
||||||
/* this chip has a separate clock and irq for each TC channel */
|
|
||||||
at91_clock_associate("tc0_clk", &at91rm9200_tcb0_device.dev, "t0_clk");
|
|
||||||
at91_clock_associate("tc1_clk", &at91rm9200_tcb0_device.dev, "t1_clk");
|
|
||||||
at91_clock_associate("tc2_clk", &at91rm9200_tcb0_device.dev, "t2_clk");
|
|
||||||
platform_device_register(&at91rm9200_tcb0_device);
|
platform_device_register(&at91rm9200_tcb0_device);
|
||||||
|
|
||||||
at91_clock_associate("tc3_clk", &at91rm9200_tcb1_device.dev, "t0_clk");
|
|
||||||
at91_clock_associate("tc4_clk", &at91rm9200_tcb1_device.dev, "t1_clk");
|
|
||||||
at91_clock_associate("tc5_clk", &at91rm9200_tcb1_device.dev, "t2_clk");
|
|
||||||
platform_device_register(&at91rm9200_tcb1_device);
|
platform_device_register(&at91rm9200_tcb1_device);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -849,17 +841,14 @@ void __init at91_add_device_ssc(unsigned id, unsigned pins)
|
||||||
case AT91RM9200_ID_SSC0:
|
case AT91RM9200_ID_SSC0:
|
||||||
pdev = &at91rm9200_ssc0_device;
|
pdev = &at91rm9200_ssc0_device;
|
||||||
configure_ssc0_pins(pins);
|
configure_ssc0_pins(pins);
|
||||||
at91_clock_associate("ssc0_clk", &pdev->dev, "ssc");
|
|
||||||
break;
|
break;
|
||||||
case AT91RM9200_ID_SSC1:
|
case AT91RM9200_ID_SSC1:
|
||||||
pdev = &at91rm9200_ssc1_device;
|
pdev = &at91rm9200_ssc1_device;
|
||||||
configure_ssc1_pins(pins);
|
configure_ssc1_pins(pins);
|
||||||
at91_clock_associate("ssc1_clk", &pdev->dev, "ssc");
|
|
||||||
break;
|
break;
|
||||||
case AT91RM9200_ID_SSC2:
|
case AT91RM9200_ID_SSC2:
|
||||||
pdev = &at91rm9200_ssc2_device;
|
pdev = &at91rm9200_ssc2_device;
|
||||||
configure_ssc2_pins(pins);
|
configure_ssc2_pins(pins);
|
||||||
at91_clock_associate("ssc2_clk", &pdev->dev, "ssc");
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
|
@ -1109,37 +1098,34 @@ struct platform_device *atmel_default_console_device; /* the serial console devi
|
||||||
void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
|
void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
|
||||||
{
|
{
|
||||||
struct platform_device *pdev;
|
struct platform_device *pdev;
|
||||||
|
struct atmel_uart_data *pdata;
|
||||||
|
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case 0: /* DBGU */
|
case 0: /* DBGU */
|
||||||
pdev = &at91rm9200_dbgu_device;
|
pdev = &at91rm9200_dbgu_device;
|
||||||
configure_dbgu_pins();
|
configure_dbgu_pins();
|
||||||
at91_clock_associate("mck", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
case AT91RM9200_ID_US0:
|
case AT91RM9200_ID_US0:
|
||||||
pdev = &at91rm9200_uart0_device;
|
pdev = &at91rm9200_uart0_device;
|
||||||
configure_usart0_pins(pins);
|
configure_usart0_pins(pins);
|
||||||
at91_clock_associate("usart0_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
case AT91RM9200_ID_US1:
|
case AT91RM9200_ID_US1:
|
||||||
pdev = &at91rm9200_uart1_device;
|
pdev = &at91rm9200_uart1_device;
|
||||||
configure_usart1_pins(pins);
|
configure_usart1_pins(pins);
|
||||||
at91_clock_associate("usart1_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
case AT91RM9200_ID_US2:
|
case AT91RM9200_ID_US2:
|
||||||
pdev = &at91rm9200_uart2_device;
|
pdev = &at91rm9200_uart2_device;
|
||||||
configure_usart2_pins(pins);
|
configure_usart2_pins(pins);
|
||||||
at91_clock_associate("usart2_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
case AT91RM9200_ID_US3:
|
case AT91RM9200_ID_US3:
|
||||||
pdev = &at91rm9200_uart3_device;
|
pdev = &at91rm9200_uart3_device;
|
||||||
configure_usart3_pins(pins);
|
configure_usart3_pins(pins);
|
||||||
at91_clock_associate("usart3_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
pdev->id = portnr; /* update to mapped ID */
|
pdata = pdev->dev.platform_data;
|
||||||
|
pdata->num = portnr; /* update to mapped ID */
|
||||||
|
|
||||||
if (portnr < ATMEL_MAX_UART)
|
if (portnr < ATMEL_MAX_UART)
|
||||||
at91_uarts[portnr] = pdev;
|
at91_uarts[portnr] = pdev;
|
||||||
|
@ -1147,8 +1133,10 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
|
||||||
|
|
||||||
void __init at91_set_serial_console(unsigned portnr)
|
void __init at91_set_serial_console(unsigned portnr)
|
||||||
{
|
{
|
||||||
if (portnr < ATMEL_MAX_UART)
|
if (portnr < ATMEL_MAX_UART) {
|
||||||
atmel_default_console_device = at91_uarts[portnr];
|
atmel_default_console_device = at91_uarts[portnr];
|
||||||
|
at91rm9200_set_console_clock(portnr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init at91_add_device_serial(void)
|
void __init at91_add_device_serial(void)
|
||||||
|
|
|
@ -231,6 +231,28 @@ static struct clk *periph_clocks[] __initdata = {
|
||||||
// irq0 .. irq2
|
// irq0 .. irq2
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct clk_lookup periph_clocks_lookups[] = {
|
||||||
|
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tc0_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.0", &tc1_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.0", &tc2_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("t3_clk", "atmel_tcb.1", &tc3_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("t4_clk", "atmel_tcb.1", &tc4_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("t5_clk", "atmel_tcb.1", &tc5_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc_clk),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_lookup usart_clocks_lookups[] = {
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.0", &mck),
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.1", &usart0_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.2", &usart1_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.3", &usart2_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.4", &usart3_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.5", &usart4_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.6", &usart5_clk),
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The two programmable clocks.
|
* The two programmable clocks.
|
||||||
* You must configure pin multiplexing to bring these signals out.
|
* You must configure pin multiplexing to bring these signals out.
|
||||||
|
@ -255,10 +277,27 @@ static void __init at91sam9260_register_clocks(void)
|
||||||
for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
|
for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
|
||||||
clk_register(periph_clocks[i]);
|
clk_register(periph_clocks[i]);
|
||||||
|
|
||||||
|
clkdev_add_table(periph_clocks_lookups,
|
||||||
|
ARRAY_SIZE(periph_clocks_lookups));
|
||||||
|
clkdev_add_table(usart_clocks_lookups,
|
||||||
|
ARRAY_SIZE(usart_clocks_lookups));
|
||||||
|
|
||||||
clk_register(&pck0);
|
clk_register(&pck0);
|
||||||
clk_register(&pck1);
|
clk_register(&pck1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct clk_lookup console_clock_lookup;
|
||||||
|
|
||||||
|
void __init at91sam9260_set_console_clock(int id)
|
||||||
|
{
|
||||||
|
if (id >= ARRAY_SIZE(usart_clocks_lookups))
|
||||||
|
return;
|
||||||
|
|
||||||
|
console_clock_lookup.con_id = "usart";
|
||||||
|
console_clock_lookup.clk = usart_clocks_lookups[id].clk;
|
||||||
|
clkdev_add(&console_clock_lookup);
|
||||||
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
/* --------------------------------------------------------------------
|
||||||
* GPIO
|
* GPIO
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
@ -289,7 +328,7 @@ static void at91sam9260_poweroff(void)
|
||||||
* AT91SAM9260 processor initialization
|
* AT91SAM9260 processor initialization
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
static void __init at91sam9xe_initialize(void)
|
static void __init at91sam9xe_map_io(void)
|
||||||
{
|
{
|
||||||
unsigned long cidr, sram_size;
|
unsigned long cidr, sram_size;
|
||||||
|
|
||||||
|
@ -310,18 +349,21 @@ static void __init at91sam9xe_initialize(void)
|
||||||
iotable_init(at91sam9xe_sram_desc, ARRAY_SIZE(at91sam9xe_sram_desc));
|
iotable_init(at91sam9xe_sram_desc, ARRAY_SIZE(at91sam9xe_sram_desc));
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init at91sam9260_initialize(unsigned long main_clock)
|
void __init at91sam9260_map_io(void)
|
||||||
{
|
{
|
||||||
/* Map peripherals */
|
/* Map peripherals */
|
||||||
iotable_init(at91sam9260_io_desc, ARRAY_SIZE(at91sam9260_io_desc));
|
iotable_init(at91sam9260_io_desc, ARRAY_SIZE(at91sam9260_io_desc));
|
||||||
|
|
||||||
if (cpu_is_at91sam9xe())
|
if (cpu_is_at91sam9xe())
|
||||||
at91sam9xe_initialize();
|
at91sam9xe_map_io();
|
||||||
else if (cpu_is_at91sam9g20())
|
else if (cpu_is_at91sam9g20())
|
||||||
iotable_init(at91sam9g20_sram_desc, ARRAY_SIZE(at91sam9g20_sram_desc));
|
iotable_init(at91sam9g20_sram_desc, ARRAY_SIZE(at91sam9g20_sram_desc));
|
||||||
else
|
else
|
||||||
iotable_init(at91sam9260_sram_desc, ARRAY_SIZE(at91sam9260_sram_desc));
|
iotable_init(at91sam9260_sram_desc, ARRAY_SIZE(at91sam9260_sram_desc));
|
||||||
|
}
|
||||||
|
|
||||||
|
void __init at91sam9260_initialize(unsigned long main_clock)
|
||||||
|
{
|
||||||
at91_arch_reset = at91sam9_alt_reset;
|
at91_arch_reset = at91sam9_alt_reset;
|
||||||
pm_power_off = at91sam9260_poweroff;
|
pm_power_off = at91sam9260_poweroff;
|
||||||
at91_extern_irq = (1 << AT91SAM9260_ID_IRQ0) | (1 << AT91SAM9260_ID_IRQ1)
|
at91_extern_irq = (1 << AT91SAM9260_ID_IRQ0) | (1 << AT91SAM9260_ID_IRQ1)
|
||||||
|
|
|
@ -609,7 +609,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)
|
||||||
at91_set_A_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */
|
at91_set_A_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */
|
||||||
at91_set_A_periph(AT91_PIN_PA2, 0); /* SPI1_SPCK */
|
at91_set_A_periph(AT91_PIN_PA2, 0); /* SPI1_SPCK */
|
||||||
|
|
||||||
at91_clock_associate("spi0_clk", &at91sam9260_spi0_device.dev, "spi_clk");
|
|
||||||
platform_device_register(&at91sam9260_spi0_device);
|
platform_device_register(&at91sam9260_spi0_device);
|
||||||
}
|
}
|
||||||
if (enable_spi1) {
|
if (enable_spi1) {
|
||||||
|
@ -617,7 +616,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)
|
||||||
at91_set_A_periph(AT91_PIN_PB1, 0); /* SPI1_MOSI */
|
at91_set_A_periph(AT91_PIN_PB1, 0); /* SPI1_MOSI */
|
||||||
at91_set_A_periph(AT91_PIN_PB2, 0); /* SPI1_SPCK */
|
at91_set_A_periph(AT91_PIN_PB2, 0); /* SPI1_SPCK */
|
||||||
|
|
||||||
at91_clock_associate("spi1_clk", &at91sam9260_spi1_device.dev, "spi_clk");
|
|
||||||
platform_device_register(&at91sam9260_spi1_device);
|
platform_device_register(&at91sam9260_spi1_device);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -694,15 +692,7 @@ static struct platform_device at91sam9260_tcb1_device = {
|
||||||
|
|
||||||
static void __init at91_add_device_tc(void)
|
static void __init at91_add_device_tc(void)
|
||||||
{
|
{
|
||||||
/* this chip has a separate clock and irq for each TC channel */
|
|
||||||
at91_clock_associate("tc0_clk", &at91sam9260_tcb0_device.dev, "t0_clk");
|
|
||||||
at91_clock_associate("tc1_clk", &at91sam9260_tcb0_device.dev, "t1_clk");
|
|
||||||
at91_clock_associate("tc2_clk", &at91sam9260_tcb0_device.dev, "t2_clk");
|
|
||||||
platform_device_register(&at91sam9260_tcb0_device);
|
platform_device_register(&at91sam9260_tcb0_device);
|
||||||
|
|
||||||
at91_clock_associate("tc3_clk", &at91sam9260_tcb1_device.dev, "t0_clk");
|
|
||||||
at91_clock_associate("tc4_clk", &at91sam9260_tcb1_device.dev, "t1_clk");
|
|
||||||
at91_clock_associate("tc5_clk", &at91sam9260_tcb1_device.dev, "t2_clk");
|
|
||||||
platform_device_register(&at91sam9260_tcb1_device);
|
platform_device_register(&at91sam9260_tcb1_device);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -820,7 +810,6 @@ void __init at91_add_device_ssc(unsigned id, unsigned pins)
|
||||||
case AT91SAM9260_ID_SSC:
|
case AT91SAM9260_ID_SSC:
|
||||||
pdev = &at91sam9260_ssc_device;
|
pdev = &at91sam9260_ssc_device;
|
||||||
configure_ssc_pins(pins);
|
configure_ssc_pins(pins);
|
||||||
at91_clock_associate("ssc_clk", &pdev->dev, "pclk");
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
|
@ -1139,47 +1128,42 @@ struct platform_device *atmel_default_console_device; /* the serial console devi
|
||||||
void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
|
void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
|
||||||
{
|
{
|
||||||
struct platform_device *pdev;
|
struct platform_device *pdev;
|
||||||
|
struct atmel_uart_data *pdata;
|
||||||
|
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case 0: /* DBGU */
|
case 0: /* DBGU */
|
||||||
pdev = &at91sam9260_dbgu_device;
|
pdev = &at91sam9260_dbgu_device;
|
||||||
configure_dbgu_pins();
|
configure_dbgu_pins();
|
||||||
at91_clock_associate("mck", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
case AT91SAM9260_ID_US0:
|
case AT91SAM9260_ID_US0:
|
||||||
pdev = &at91sam9260_uart0_device;
|
pdev = &at91sam9260_uart0_device;
|
||||||
configure_usart0_pins(pins);
|
configure_usart0_pins(pins);
|
||||||
at91_clock_associate("usart0_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
case AT91SAM9260_ID_US1:
|
case AT91SAM9260_ID_US1:
|
||||||
pdev = &at91sam9260_uart1_device;
|
pdev = &at91sam9260_uart1_device;
|
||||||
configure_usart1_pins(pins);
|
configure_usart1_pins(pins);
|
||||||
at91_clock_associate("usart1_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
case AT91SAM9260_ID_US2:
|
case AT91SAM9260_ID_US2:
|
||||||
pdev = &at91sam9260_uart2_device;
|
pdev = &at91sam9260_uart2_device;
|
||||||
configure_usart2_pins(pins);
|
configure_usart2_pins(pins);
|
||||||
at91_clock_associate("usart2_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
case AT91SAM9260_ID_US3:
|
case AT91SAM9260_ID_US3:
|
||||||
pdev = &at91sam9260_uart3_device;
|
pdev = &at91sam9260_uart3_device;
|
||||||
configure_usart3_pins(pins);
|
configure_usart3_pins(pins);
|
||||||
at91_clock_associate("usart3_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
case AT91SAM9260_ID_US4:
|
case AT91SAM9260_ID_US4:
|
||||||
pdev = &at91sam9260_uart4_device;
|
pdev = &at91sam9260_uart4_device;
|
||||||
configure_usart4_pins();
|
configure_usart4_pins();
|
||||||
at91_clock_associate("usart4_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
case AT91SAM9260_ID_US5:
|
case AT91SAM9260_ID_US5:
|
||||||
pdev = &at91sam9260_uart5_device;
|
pdev = &at91sam9260_uart5_device;
|
||||||
configure_usart5_pins();
|
configure_usart5_pins();
|
||||||
at91_clock_associate("usart5_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
pdev->id = portnr; /* update to mapped ID */
|
pdata = pdev->dev.platform_data;
|
||||||
|
pdata->num = portnr; /* update to mapped ID */
|
||||||
|
|
||||||
if (portnr < ATMEL_MAX_UART)
|
if (portnr < ATMEL_MAX_UART)
|
||||||
at91_uarts[portnr] = pdev;
|
at91_uarts[portnr] = pdev;
|
||||||
|
@ -1187,8 +1171,10 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
|
||||||
|
|
||||||
void __init at91_set_serial_console(unsigned portnr)
|
void __init at91_set_serial_console(unsigned portnr)
|
||||||
{
|
{
|
||||||
if (portnr < ATMEL_MAX_UART)
|
if (portnr < ATMEL_MAX_UART) {
|
||||||
atmel_default_console_device = at91_uarts[portnr];
|
atmel_default_console_device = at91_uarts[portnr];
|
||||||
|
at91sam9260_set_console_clock(portnr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init at91_add_device_serial(void)
|
void __init at91_add_device_serial(void)
|
||||||
|
|
|
@ -178,6 +178,24 @@ static struct clk *periph_clocks[] __initdata = {
|
||||||
// irq0 .. irq2
|
// irq0 .. irq2
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct clk_lookup periph_clocks_lookups[] = {
|
||||||
|
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tc0_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.0", &tc1_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.0", &tc1_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("pclk", "ssc.2", &ssc2_clk),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_lookup usart_clocks_lookups[] = {
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.0", &mck),
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.1", &usart0_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.2", &usart1_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.3", &usart2_clk),
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The four programmable clocks.
|
* The four programmable clocks.
|
||||||
* You must configure pin multiplexing to bring these signals out.
|
* You must configure pin multiplexing to bring these signals out.
|
||||||
|
@ -228,6 +246,11 @@ static void __init at91sam9261_register_clocks(void)
|
||||||
for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
|
for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
|
||||||
clk_register(periph_clocks[i]);
|
clk_register(periph_clocks[i]);
|
||||||
|
|
||||||
|
clkdev_add_table(periph_clocks_lookups,
|
||||||
|
ARRAY_SIZE(periph_clocks_lookups));
|
||||||
|
clkdev_add_table(usart_clocks_lookups,
|
||||||
|
ARRAY_SIZE(usart_clocks_lookups));
|
||||||
|
|
||||||
clk_register(&pck0);
|
clk_register(&pck0);
|
||||||
clk_register(&pck1);
|
clk_register(&pck1);
|
||||||
clk_register(&pck2);
|
clk_register(&pck2);
|
||||||
|
@ -237,6 +260,18 @@ static void __init at91sam9261_register_clocks(void)
|
||||||
clk_register(&hck1);
|
clk_register(&hck1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct clk_lookup console_clock_lookup;
|
||||||
|
|
||||||
|
void __init at91sam9261_set_console_clock(int id)
|
||||||
|
{
|
||||||
|
if (id >= ARRAY_SIZE(usart_clocks_lookups))
|
||||||
|
return;
|
||||||
|
|
||||||
|
console_clock_lookup.con_id = "usart";
|
||||||
|
console_clock_lookup.clk = usart_clocks_lookups[id].clk;
|
||||||
|
clkdev_add(&console_clock_lookup);
|
||||||
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
/* --------------------------------------------------------------------
|
||||||
* GPIO
|
* GPIO
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
@ -267,7 +302,7 @@ static void at91sam9261_poweroff(void)
|
||||||
* AT91SAM9261 processor initialization
|
* AT91SAM9261 processor initialization
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
void __init at91sam9261_initialize(unsigned long main_clock)
|
void __init at91sam9261_map_io(void)
|
||||||
{
|
{
|
||||||
/* Map peripherals */
|
/* Map peripherals */
|
||||||
iotable_init(at91sam9261_io_desc, ARRAY_SIZE(at91sam9261_io_desc));
|
iotable_init(at91sam9261_io_desc, ARRAY_SIZE(at91sam9261_io_desc));
|
||||||
|
@ -276,8 +311,10 @@ void __init at91sam9261_initialize(unsigned long main_clock)
|
||||||
iotable_init(at91sam9g10_sram_desc, ARRAY_SIZE(at91sam9g10_sram_desc));
|
iotable_init(at91sam9g10_sram_desc, ARRAY_SIZE(at91sam9g10_sram_desc));
|
||||||
else
|
else
|
||||||
iotable_init(at91sam9261_sram_desc, ARRAY_SIZE(at91sam9261_sram_desc));
|
iotable_init(at91sam9261_sram_desc, ARRAY_SIZE(at91sam9261_sram_desc));
|
||||||
|
}
|
||||||
|
|
||||||
|
void __init at91sam9261_initialize(unsigned long main_clock)
|
||||||
|
{
|
||||||
at91_arch_reset = at91sam9_alt_reset;
|
at91_arch_reset = at91sam9_alt_reset;
|
||||||
pm_power_off = at91sam9261_poweroff;
|
pm_power_off = at91sam9261_poweroff;
|
||||||
at91_extern_irq = (1 << AT91SAM9261_ID_IRQ0) | (1 << AT91SAM9261_ID_IRQ1)
|
at91_extern_irq = (1 << AT91SAM9261_ID_IRQ0) | (1 << AT91SAM9261_ID_IRQ1)
|
||||||
|
|
|
@ -426,7 +426,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)
|
||||||
at91_set_A_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */
|
at91_set_A_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */
|
||||||
at91_set_A_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */
|
at91_set_A_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */
|
||||||
|
|
||||||
at91_clock_associate("spi0_clk", &at91sam9261_spi0_device.dev, "spi_clk");
|
|
||||||
platform_device_register(&at91sam9261_spi0_device);
|
platform_device_register(&at91sam9261_spi0_device);
|
||||||
}
|
}
|
||||||
if (enable_spi1) {
|
if (enable_spi1) {
|
||||||
|
@ -434,7 +433,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)
|
||||||
at91_set_A_periph(AT91_PIN_PB31, 0); /* SPI1_MOSI */
|
at91_set_A_periph(AT91_PIN_PB31, 0); /* SPI1_MOSI */
|
||||||
at91_set_A_periph(AT91_PIN_PB29, 0); /* SPI1_SPCK */
|
at91_set_A_periph(AT91_PIN_PB29, 0); /* SPI1_SPCK */
|
||||||
|
|
||||||
at91_clock_associate("spi1_clk", &at91sam9261_spi1_device.dev, "spi_clk");
|
|
||||||
platform_device_register(&at91sam9261_spi1_device);
|
platform_device_register(&at91sam9261_spi1_device);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -581,10 +579,6 @@ static struct platform_device at91sam9261_tcb_device = {
|
||||||
|
|
||||||
static void __init at91_add_device_tc(void)
|
static void __init at91_add_device_tc(void)
|
||||||
{
|
{
|
||||||
/* this chip has a separate clock and irq for each TC channel */
|
|
||||||
at91_clock_associate("tc0_clk", &at91sam9261_tcb_device.dev, "t0_clk");
|
|
||||||
at91_clock_associate("tc1_clk", &at91sam9261_tcb_device.dev, "t1_clk");
|
|
||||||
at91_clock_associate("tc2_clk", &at91sam9261_tcb_device.dev, "t2_clk");
|
|
||||||
platform_device_register(&at91sam9261_tcb_device);
|
platform_device_register(&at91sam9261_tcb_device);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -786,17 +780,14 @@ void __init at91_add_device_ssc(unsigned id, unsigned pins)
|
||||||
case AT91SAM9261_ID_SSC0:
|
case AT91SAM9261_ID_SSC0:
|
||||||
pdev = &at91sam9261_ssc0_device;
|
pdev = &at91sam9261_ssc0_device;
|
||||||
configure_ssc0_pins(pins);
|
configure_ssc0_pins(pins);
|
||||||
at91_clock_associate("ssc0_clk", &pdev->dev, "pclk");
|
|
||||||
break;
|
break;
|
||||||
case AT91SAM9261_ID_SSC1:
|
case AT91SAM9261_ID_SSC1:
|
||||||
pdev = &at91sam9261_ssc1_device;
|
pdev = &at91sam9261_ssc1_device;
|
||||||
configure_ssc1_pins(pins);
|
configure_ssc1_pins(pins);
|
||||||
at91_clock_associate("ssc1_clk", &pdev->dev, "pclk");
|
|
||||||
break;
|
break;
|
||||||
case AT91SAM9261_ID_SSC2:
|
case AT91SAM9261_ID_SSC2:
|
||||||
pdev = &at91sam9261_ssc2_device;
|
pdev = &at91sam9261_ssc2_device;
|
||||||
configure_ssc2_pins(pins);
|
configure_ssc2_pins(pins);
|
||||||
at91_clock_associate("ssc2_clk", &pdev->dev, "pclk");
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
|
@ -989,32 +980,30 @@ struct platform_device *atmel_default_console_device; /* the serial console devi
|
||||||
void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
|
void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
|
||||||
{
|
{
|
||||||
struct platform_device *pdev;
|
struct platform_device *pdev;
|
||||||
|
struct atmel_uart_data *pdata;
|
||||||
|
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case 0: /* DBGU */
|
case 0: /* DBGU */
|
||||||
pdev = &at91sam9261_dbgu_device;
|
pdev = &at91sam9261_dbgu_device;
|
||||||
configure_dbgu_pins();
|
configure_dbgu_pins();
|
||||||
at91_clock_associate("mck", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
case AT91SAM9261_ID_US0:
|
case AT91SAM9261_ID_US0:
|
||||||
pdev = &at91sam9261_uart0_device;
|
pdev = &at91sam9261_uart0_device;
|
||||||
configure_usart0_pins(pins);
|
configure_usart0_pins(pins);
|
||||||
at91_clock_associate("usart0_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
case AT91SAM9261_ID_US1:
|
case AT91SAM9261_ID_US1:
|
||||||
pdev = &at91sam9261_uart1_device;
|
pdev = &at91sam9261_uart1_device;
|
||||||
configure_usart1_pins(pins);
|
configure_usart1_pins(pins);
|
||||||
at91_clock_associate("usart1_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
case AT91SAM9261_ID_US2:
|
case AT91SAM9261_ID_US2:
|
||||||
pdev = &at91sam9261_uart2_device;
|
pdev = &at91sam9261_uart2_device;
|
||||||
configure_usart2_pins(pins);
|
configure_usart2_pins(pins);
|
||||||
at91_clock_associate("usart2_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
pdev->id = portnr; /* update to mapped ID */
|
pdata = pdev->dev.platform_data;
|
||||||
|
pdata->num = portnr; /* update to mapped ID */
|
||||||
|
|
||||||
if (portnr < ATMEL_MAX_UART)
|
if (portnr < ATMEL_MAX_UART)
|
||||||
at91_uarts[portnr] = pdev;
|
at91_uarts[portnr] = pdev;
|
||||||
|
@ -1022,8 +1011,10 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
|
||||||
|
|
||||||
void __init at91_set_serial_console(unsigned portnr)
|
void __init at91_set_serial_console(unsigned portnr)
|
||||||
{
|
{
|
||||||
if (portnr < ATMEL_MAX_UART)
|
if (portnr < ATMEL_MAX_UART) {
|
||||||
atmel_default_console_device = at91_uarts[portnr];
|
atmel_default_console_device = at91_uarts[portnr];
|
||||||
|
at91sam9261_set_console_clock(portnr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init at91_add_device_serial(void)
|
void __init at91_add_device_serial(void)
|
||||||
|
|
|
@ -199,6 +199,23 @@ static struct clk *periph_clocks[] __initdata = {
|
||||||
// irq0 .. irq1
|
// irq0 .. irq1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct clk_lookup periph_clocks_lookups[] = {
|
||||||
|
CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.0", &mmc0_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.1", &mmc1_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb_clk),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_lookup usart_clocks_lookups[] = {
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.0", &mck),
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.1", &usart0_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.2", &usart1_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.3", &usart2_clk),
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The four programmable clocks.
|
* The four programmable clocks.
|
||||||
* You must configure pin multiplexing to bring these signals out.
|
* You must configure pin multiplexing to bring these signals out.
|
||||||
|
@ -235,12 +252,29 @@ static void __init at91sam9263_register_clocks(void)
|
||||||
for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
|
for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
|
||||||
clk_register(periph_clocks[i]);
|
clk_register(periph_clocks[i]);
|
||||||
|
|
||||||
|
clkdev_add_table(periph_clocks_lookups,
|
||||||
|
ARRAY_SIZE(periph_clocks_lookups));
|
||||||
|
clkdev_add_table(usart_clocks_lookups,
|
||||||
|
ARRAY_SIZE(usart_clocks_lookups));
|
||||||
|
|
||||||
clk_register(&pck0);
|
clk_register(&pck0);
|
||||||
clk_register(&pck1);
|
clk_register(&pck1);
|
||||||
clk_register(&pck2);
|
clk_register(&pck2);
|
||||||
clk_register(&pck3);
|
clk_register(&pck3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct clk_lookup console_clock_lookup;
|
||||||
|
|
||||||
|
void __init at91sam9263_set_console_clock(int id)
|
||||||
|
{
|
||||||
|
if (id >= ARRAY_SIZE(usart_clocks_lookups))
|
||||||
|
return;
|
||||||
|
|
||||||
|
console_clock_lookup.con_id = "usart";
|
||||||
|
console_clock_lookup.clk = usart_clocks_lookups[id].clk;
|
||||||
|
clkdev_add(&console_clock_lookup);
|
||||||
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
/* --------------------------------------------------------------------
|
||||||
* GPIO
|
* GPIO
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
@ -279,11 +313,14 @@ static void at91sam9263_poweroff(void)
|
||||||
* AT91SAM9263 processor initialization
|
* AT91SAM9263 processor initialization
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
void __init at91sam9263_initialize(unsigned long main_clock)
|
void __init at91sam9263_map_io(void)
|
||||||
{
|
{
|
||||||
/* Map peripherals */
|
/* Map peripherals */
|
||||||
iotable_init(at91sam9263_io_desc, ARRAY_SIZE(at91sam9263_io_desc));
|
iotable_init(at91sam9263_io_desc, ARRAY_SIZE(at91sam9263_io_desc));
|
||||||
|
}
|
||||||
|
|
||||||
|
void __init at91sam9263_initialize(unsigned long main_clock)
|
||||||
|
{
|
||||||
at91_arch_reset = at91sam9_alt_reset;
|
at91_arch_reset = at91sam9_alt_reset;
|
||||||
pm_power_off = at91sam9263_poweroff;
|
pm_power_off = at91sam9263_poweroff;
|
||||||
at91_extern_irq = (1 << AT91SAM9263_ID_IRQ0) | (1 << AT91SAM9263_ID_IRQ1);
|
at91_extern_irq = (1 << AT91SAM9263_ID_IRQ0) | (1 << AT91SAM9263_ID_IRQ1);
|
||||||
|
|
|
@ -308,7 +308,6 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
mmc0_data = *data;
|
mmc0_data = *data;
|
||||||
at91_clock_associate("mci0_clk", &at91sam9263_mmc0_device.dev, "mci_clk");
|
|
||||||
platform_device_register(&at91sam9263_mmc0_device);
|
platform_device_register(&at91sam9263_mmc0_device);
|
||||||
} else { /* MCI1 */
|
} else { /* MCI1 */
|
||||||
/* CLK */
|
/* CLK */
|
||||||
|
@ -339,7 +338,6 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
mmc1_data = *data;
|
mmc1_data = *data;
|
||||||
at91_clock_associate("mci1_clk", &at91sam9263_mmc1_device.dev, "mci_clk");
|
|
||||||
platform_device_register(&at91sam9263_mmc1_device);
|
platform_device_register(&at91sam9263_mmc1_device);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -686,7 +684,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)
|
||||||
at91_set_B_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */
|
at91_set_B_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */
|
||||||
at91_set_B_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */
|
at91_set_B_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */
|
||||||
|
|
||||||
at91_clock_associate("spi0_clk", &at91sam9263_spi0_device.dev, "spi_clk");
|
|
||||||
platform_device_register(&at91sam9263_spi0_device);
|
platform_device_register(&at91sam9263_spi0_device);
|
||||||
}
|
}
|
||||||
if (enable_spi1) {
|
if (enable_spi1) {
|
||||||
|
@ -694,7 +691,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)
|
||||||
at91_set_A_periph(AT91_PIN_PB13, 0); /* SPI1_MOSI */
|
at91_set_A_periph(AT91_PIN_PB13, 0); /* SPI1_MOSI */
|
||||||
at91_set_A_periph(AT91_PIN_PB14, 0); /* SPI1_SPCK */
|
at91_set_A_periph(AT91_PIN_PB14, 0); /* SPI1_SPCK */
|
||||||
|
|
||||||
at91_clock_associate("spi1_clk", &at91sam9263_spi1_device.dev, "spi_clk");
|
|
||||||
platform_device_register(&at91sam9263_spi1_device);
|
platform_device_register(&at91sam9263_spi1_device);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -941,8 +937,6 @@ static struct platform_device at91sam9263_tcb_device = {
|
||||||
|
|
||||||
static void __init at91_add_device_tc(void)
|
static void __init at91_add_device_tc(void)
|
||||||
{
|
{
|
||||||
/* this chip has one clock and irq for all three TC channels */
|
|
||||||
at91_clock_associate("tcb_clk", &at91sam9263_tcb_device.dev, "t0_clk");
|
|
||||||
platform_device_register(&at91sam9263_tcb_device);
|
platform_device_register(&at91sam9263_tcb_device);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -1171,12 +1165,10 @@ void __init at91_add_device_ssc(unsigned id, unsigned pins)
|
||||||
case AT91SAM9263_ID_SSC0:
|
case AT91SAM9263_ID_SSC0:
|
||||||
pdev = &at91sam9263_ssc0_device;
|
pdev = &at91sam9263_ssc0_device;
|
||||||
configure_ssc0_pins(pins);
|
configure_ssc0_pins(pins);
|
||||||
at91_clock_associate("ssc0_clk", &pdev->dev, "pclk");
|
|
||||||
break;
|
break;
|
||||||
case AT91SAM9263_ID_SSC1:
|
case AT91SAM9263_ID_SSC1:
|
||||||
pdev = &at91sam9263_ssc1_device;
|
pdev = &at91sam9263_ssc1_device;
|
||||||
configure_ssc1_pins(pins);
|
configure_ssc1_pins(pins);
|
||||||
at91_clock_associate("ssc1_clk", &pdev->dev, "pclk");
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
|
@ -1370,32 +1362,30 @@ struct platform_device *atmel_default_console_device; /* the serial console devi
|
||||||
void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
|
void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
|
||||||
{
|
{
|
||||||
struct platform_device *pdev;
|
struct platform_device *pdev;
|
||||||
|
struct atmel_uart_data *pdata;
|
||||||
|
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case 0: /* DBGU */
|
case 0: /* DBGU */
|
||||||
pdev = &at91sam9263_dbgu_device;
|
pdev = &at91sam9263_dbgu_device;
|
||||||
configure_dbgu_pins();
|
configure_dbgu_pins();
|
||||||
at91_clock_associate("mck", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
case AT91SAM9263_ID_US0:
|
case AT91SAM9263_ID_US0:
|
||||||
pdev = &at91sam9263_uart0_device;
|
pdev = &at91sam9263_uart0_device;
|
||||||
configure_usart0_pins(pins);
|
configure_usart0_pins(pins);
|
||||||
at91_clock_associate("usart0_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
case AT91SAM9263_ID_US1:
|
case AT91SAM9263_ID_US1:
|
||||||
pdev = &at91sam9263_uart1_device;
|
pdev = &at91sam9263_uart1_device;
|
||||||
configure_usart1_pins(pins);
|
configure_usart1_pins(pins);
|
||||||
at91_clock_associate("usart1_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
case AT91SAM9263_ID_US2:
|
case AT91SAM9263_ID_US2:
|
||||||
pdev = &at91sam9263_uart2_device;
|
pdev = &at91sam9263_uart2_device;
|
||||||
configure_usart2_pins(pins);
|
configure_usart2_pins(pins);
|
||||||
at91_clock_associate("usart2_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
pdev->id = portnr; /* update to mapped ID */
|
pdata = pdev->dev.platform_data;
|
||||||
|
pdata->num = portnr; /* update to mapped ID */
|
||||||
|
|
||||||
if (portnr < ATMEL_MAX_UART)
|
if (portnr < ATMEL_MAX_UART)
|
||||||
at91_uarts[portnr] = pdev;
|
at91_uarts[portnr] = pdev;
|
||||||
|
@ -1403,8 +1393,10 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
|
||||||
|
|
||||||
void __init at91_set_serial_console(unsigned portnr)
|
void __init at91_set_serial_console(unsigned portnr)
|
||||||
{
|
{
|
||||||
if (portnr < ATMEL_MAX_UART)
|
if (portnr < ATMEL_MAX_UART) {
|
||||||
atmel_default_console_device = at91_uarts[portnr];
|
atmel_default_console_device = at91_uarts[portnr];
|
||||||
|
at91sam9263_set_console_clock(portnr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init at91_add_device_serial(void)
|
void __init at91_add_device_serial(void)
|
||||||
|
|
|
@ -184,22 +184,6 @@ static struct clk vdec_clk = {
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
.type = CLK_TYPE_PERIPHERAL,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* One additional fake clock for ohci */
|
|
||||||
static struct clk ohci_clk = {
|
|
||||||
.name = "ohci_clk",
|
|
||||||
.pmc_mask = 0,
|
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
|
||||||
.parent = &uhphs_clk,
|
|
||||||
};
|
|
||||||
|
|
||||||
/* One additional fake clock for second TC block */
|
|
||||||
static struct clk tcb1_clk = {
|
|
||||||
.name = "tcb1_clk",
|
|
||||||
.pmc_mask = 0,
|
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
|
||||||
.parent = &tcb0_clk,
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct clk *periph_clocks[] __initdata = {
|
static struct clk *periph_clocks[] __initdata = {
|
||||||
&pioA_clk,
|
&pioA_clk,
|
||||||
&pioB_clk,
|
&pioB_clk,
|
||||||
|
@ -228,8 +212,30 @@ static struct clk *periph_clocks[] __initdata = {
|
||||||
&udphs_clk,
|
&udphs_clk,
|
||||||
&mmc1_clk,
|
&mmc1_clk,
|
||||||
// irq0
|
// irq0
|
||||||
&ohci_clk,
|
};
|
||||||
&tcb1_clk,
|
|
||||||
|
static struct clk_lookup periph_clocks_lookups[] = {
|
||||||
|
/* One additional fake clock for ohci */
|
||||||
|
CLKDEV_CON_ID("ohci_clk", &uhphs_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("ehci_clk", "atmel-ehci.0", &uhphs_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc.0", &utmi_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc.0", &udphs_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.0", &mmc0_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.1", &mmc1_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb0_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.1", &tcb0_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_lookup usart_clocks_lookups[] = {
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.0", &mck),
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.1", &usart0_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.2", &usart1_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.3", &usart2_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.4", &usart3_clk),
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -256,6 +262,11 @@ static void __init at91sam9g45_register_clocks(void)
|
||||||
for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
|
for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
|
||||||
clk_register(periph_clocks[i]);
|
clk_register(periph_clocks[i]);
|
||||||
|
|
||||||
|
clkdev_add_table(periph_clocks_lookups,
|
||||||
|
ARRAY_SIZE(periph_clocks_lookups));
|
||||||
|
clkdev_add_table(usart_clocks_lookups,
|
||||||
|
ARRAY_SIZE(usart_clocks_lookups));
|
||||||
|
|
||||||
if (cpu_is_at91sam9m10() || cpu_is_at91sam9m11())
|
if (cpu_is_at91sam9m10() || cpu_is_at91sam9m11())
|
||||||
clk_register(&vdec_clk);
|
clk_register(&vdec_clk);
|
||||||
|
|
||||||
|
@ -263,6 +274,18 @@ static void __init at91sam9g45_register_clocks(void)
|
||||||
clk_register(&pck1);
|
clk_register(&pck1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct clk_lookup console_clock_lookup;
|
||||||
|
|
||||||
|
void __init at91sam9g45_set_console_clock(int id)
|
||||||
|
{
|
||||||
|
if (id >= ARRAY_SIZE(usart_clocks_lookups))
|
||||||
|
return;
|
||||||
|
|
||||||
|
console_clock_lookup.con_id = "usart";
|
||||||
|
console_clock_lookup.clk = usart_clocks_lookups[id].clk;
|
||||||
|
clkdev_add(&console_clock_lookup);
|
||||||
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
/* --------------------------------------------------------------------
|
||||||
* GPIO
|
* GPIO
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
@ -306,11 +329,14 @@ static void at91sam9g45_poweroff(void)
|
||||||
* AT91SAM9G45 processor initialization
|
* AT91SAM9G45 processor initialization
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
void __init at91sam9g45_initialize(unsigned long main_clock)
|
void __init at91sam9g45_map_io(void)
|
||||||
{
|
{
|
||||||
/* Map peripherals */
|
/* Map peripherals */
|
||||||
iotable_init(at91sam9g45_io_desc, ARRAY_SIZE(at91sam9g45_io_desc));
|
iotable_init(at91sam9g45_io_desc, ARRAY_SIZE(at91sam9g45_io_desc));
|
||||||
|
}
|
||||||
|
|
||||||
|
void __init at91sam9g45_initialize(unsigned long main_clock)
|
||||||
|
{
|
||||||
at91_arch_reset = at91sam9g45_reset;
|
at91_arch_reset = at91sam9g45_reset;
|
||||||
pm_power_off = at91sam9g45_poweroff;
|
pm_power_off = at91sam9g45_poweroff;
|
||||||
at91_extern_irq = (1 << AT91SAM9G45_ID_IRQ0);
|
at91_extern_irq = (1 << AT91SAM9G45_ID_IRQ0);
|
||||||
|
|
|
@ -180,7 +180,6 @@ void __init at91_add_device_usbh_ehci(struct at91_usbh_data *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
usbh_ehci_data = *data;
|
usbh_ehci_data = *data;
|
||||||
at91_clock_associate("uhphs_clk", &at91_usbh_ehci_device.dev, "ehci_clk");
|
|
||||||
platform_device_register(&at91_usbh_ehci_device);
|
platform_device_register(&at91_usbh_ehci_device);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -266,10 +265,6 @@ void __init at91_add_device_usba(struct usba_platform_data *data)
|
||||||
|
|
||||||
/* Pullup pin is handled internally by USB device peripheral */
|
/* Pullup pin is handled internally by USB device peripheral */
|
||||||
|
|
||||||
/* Clocks */
|
|
||||||
at91_clock_associate("utmi_clk", &at91_usba_udc_device.dev, "hclk");
|
|
||||||
at91_clock_associate("udphs_clk", &at91_usba_udc_device.dev, "pclk");
|
|
||||||
|
|
||||||
platform_device_register(&at91_usba_udc_device);
|
platform_device_register(&at91_usba_udc_device);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -478,7 +473,6 @@ void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
mmc0_data = *data;
|
mmc0_data = *data;
|
||||||
at91_clock_associate("mci0_clk", &at91sam9g45_mmc0_device.dev, "mci_clk");
|
|
||||||
platform_device_register(&at91sam9g45_mmc0_device);
|
platform_device_register(&at91sam9g45_mmc0_device);
|
||||||
|
|
||||||
} else { /* MCI1 */
|
} else { /* MCI1 */
|
||||||
|
@ -504,7 +498,6 @@ void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
mmc1_data = *data;
|
mmc1_data = *data;
|
||||||
at91_clock_associate("mci1_clk", &at91sam9g45_mmc1_device.dev, "mci_clk");
|
|
||||||
platform_device_register(&at91sam9g45_mmc1_device);
|
platform_device_register(&at91sam9g45_mmc1_device);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -801,7 +794,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)
|
||||||
at91_set_A_periph(AT91_PIN_PB1, 0); /* SPI0_MOSI */
|
at91_set_A_periph(AT91_PIN_PB1, 0); /* SPI0_MOSI */
|
||||||
at91_set_A_periph(AT91_PIN_PB2, 0); /* SPI0_SPCK */
|
at91_set_A_periph(AT91_PIN_PB2, 0); /* SPI0_SPCK */
|
||||||
|
|
||||||
at91_clock_associate("spi0_clk", &at91sam9g45_spi0_device.dev, "spi_clk");
|
|
||||||
platform_device_register(&at91sam9g45_spi0_device);
|
platform_device_register(&at91sam9g45_spi0_device);
|
||||||
}
|
}
|
||||||
if (enable_spi1) {
|
if (enable_spi1) {
|
||||||
|
@ -809,7 +801,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)
|
||||||
at91_set_A_periph(AT91_PIN_PB15, 0); /* SPI1_MOSI */
|
at91_set_A_periph(AT91_PIN_PB15, 0); /* SPI1_MOSI */
|
||||||
at91_set_A_periph(AT91_PIN_PB16, 0); /* SPI1_SPCK */
|
at91_set_A_periph(AT91_PIN_PB16, 0); /* SPI1_SPCK */
|
||||||
|
|
||||||
at91_clock_associate("spi1_clk", &at91sam9g45_spi1_device.dev, "spi_clk");
|
|
||||||
platform_device_register(&at91sam9g45_spi1_device);
|
platform_device_register(&at91sam9g45_spi1_device);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -999,10 +990,7 @@ static struct platform_device at91sam9g45_tcb1_device = {
|
||||||
|
|
||||||
static void __init at91_add_device_tc(void)
|
static void __init at91_add_device_tc(void)
|
||||||
{
|
{
|
||||||
/* this chip has one clock and irq for all six TC channels */
|
|
||||||
at91_clock_associate("tcb0_clk", &at91sam9g45_tcb0_device.dev, "t0_clk");
|
|
||||||
platform_device_register(&at91sam9g45_tcb0_device);
|
platform_device_register(&at91sam9g45_tcb0_device);
|
||||||
at91_clock_associate("tcb1_clk", &at91sam9g45_tcb1_device.dev, "t0_clk");
|
|
||||||
platform_device_register(&at91sam9g45_tcb1_device);
|
platform_device_register(&at91sam9g45_tcb1_device);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -1286,12 +1274,10 @@ void __init at91_add_device_ssc(unsigned id, unsigned pins)
|
||||||
case AT91SAM9G45_ID_SSC0:
|
case AT91SAM9G45_ID_SSC0:
|
||||||
pdev = &at91sam9g45_ssc0_device;
|
pdev = &at91sam9g45_ssc0_device;
|
||||||
configure_ssc0_pins(pins);
|
configure_ssc0_pins(pins);
|
||||||
at91_clock_associate("ssc0_clk", &pdev->dev, "pclk");
|
|
||||||
break;
|
break;
|
||||||
case AT91SAM9G45_ID_SSC1:
|
case AT91SAM9G45_ID_SSC1:
|
||||||
pdev = &at91sam9g45_ssc1_device;
|
pdev = &at91sam9g45_ssc1_device;
|
||||||
configure_ssc1_pins(pins);
|
configure_ssc1_pins(pins);
|
||||||
at91_clock_associate("ssc1_clk", &pdev->dev, "pclk");
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
|
@ -1527,37 +1513,34 @@ struct platform_device *atmel_default_console_device; /* the serial console devi
|
||||||
void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
|
void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
|
||||||
{
|
{
|
||||||
struct platform_device *pdev;
|
struct platform_device *pdev;
|
||||||
|
struct atmel_uart_data *pdata;
|
||||||
|
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case 0: /* DBGU */
|
case 0: /* DBGU */
|
||||||
pdev = &at91sam9g45_dbgu_device;
|
pdev = &at91sam9g45_dbgu_device;
|
||||||
configure_dbgu_pins();
|
configure_dbgu_pins();
|
||||||
at91_clock_associate("mck", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
case AT91SAM9G45_ID_US0:
|
case AT91SAM9G45_ID_US0:
|
||||||
pdev = &at91sam9g45_uart0_device;
|
pdev = &at91sam9g45_uart0_device;
|
||||||
configure_usart0_pins(pins);
|
configure_usart0_pins(pins);
|
||||||
at91_clock_associate("usart0_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
case AT91SAM9G45_ID_US1:
|
case AT91SAM9G45_ID_US1:
|
||||||
pdev = &at91sam9g45_uart1_device;
|
pdev = &at91sam9g45_uart1_device;
|
||||||
configure_usart1_pins(pins);
|
configure_usart1_pins(pins);
|
||||||
at91_clock_associate("usart1_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
case AT91SAM9G45_ID_US2:
|
case AT91SAM9G45_ID_US2:
|
||||||
pdev = &at91sam9g45_uart2_device;
|
pdev = &at91sam9g45_uart2_device;
|
||||||
configure_usart2_pins(pins);
|
configure_usart2_pins(pins);
|
||||||
at91_clock_associate("usart2_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
case AT91SAM9G45_ID_US3:
|
case AT91SAM9G45_ID_US3:
|
||||||
pdev = &at91sam9g45_uart3_device;
|
pdev = &at91sam9g45_uart3_device;
|
||||||
configure_usart3_pins(pins);
|
configure_usart3_pins(pins);
|
||||||
at91_clock_associate("usart3_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
pdev->id = portnr; /* update to mapped ID */
|
pdata = pdev->dev.platform_data;
|
||||||
|
pdata->num = portnr; /* update to mapped ID */
|
||||||
|
|
||||||
if (portnr < ATMEL_MAX_UART)
|
if (portnr < ATMEL_MAX_UART)
|
||||||
at91_uarts[portnr] = pdev;
|
at91_uarts[portnr] = pdev;
|
||||||
|
@ -1565,8 +1548,10 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
|
||||||
|
|
||||||
void __init at91_set_serial_console(unsigned portnr)
|
void __init at91_set_serial_console(unsigned portnr)
|
||||||
{
|
{
|
||||||
if (portnr < ATMEL_MAX_UART)
|
if (portnr < ATMEL_MAX_UART) {
|
||||||
atmel_default_console_device = at91_uarts[portnr];
|
atmel_default_console_device = at91_uarts[portnr];
|
||||||
|
at91sam9g45_set_console_clock(portnr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init at91_add_device_serial(void)
|
void __init at91_add_device_serial(void)
|
||||||
|
|
|
@ -190,6 +190,24 @@ static struct clk *periph_clocks[] __initdata = {
|
||||||
// irq0
|
// irq0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct clk_lookup periph_clocks_lookups[] = {
|
||||||
|
CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc.0", &utmi_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc.0", &udphs_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tc0_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.0", &tc1_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.0", &tc2_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_lookup usart_clocks_lookups[] = {
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.0", &mck),
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.1", &usart0_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.2", &usart1_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.3", &usart2_clk),
|
||||||
|
CLKDEV_CON_DEV_ID("usart", "atmel_usart.4", &usart3_clk),
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The two programmable clocks.
|
* The two programmable clocks.
|
||||||
* You must configure pin multiplexing to bring these signals out.
|
* You must configure pin multiplexing to bring these signals out.
|
||||||
|
@ -214,10 +232,27 @@ static void __init at91sam9rl_register_clocks(void)
|
||||||
for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
|
for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
|
||||||
clk_register(periph_clocks[i]);
|
clk_register(periph_clocks[i]);
|
||||||
|
|
||||||
|
clkdev_add_table(periph_clocks_lookups,
|
||||||
|
ARRAY_SIZE(periph_clocks_lookups));
|
||||||
|
clkdev_add_table(usart_clocks_lookups,
|
||||||
|
ARRAY_SIZE(usart_clocks_lookups));
|
||||||
|
|
||||||
clk_register(&pck0);
|
clk_register(&pck0);
|
||||||
clk_register(&pck1);
|
clk_register(&pck1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct clk_lookup console_clock_lookup;
|
||||||
|
|
||||||
|
void __init at91sam9rl_set_console_clock(int id)
|
||||||
|
{
|
||||||
|
if (id >= ARRAY_SIZE(usart_clocks_lookups))
|
||||||
|
return;
|
||||||
|
|
||||||
|
console_clock_lookup.con_id = "usart";
|
||||||
|
console_clock_lookup.clk = usart_clocks_lookups[id].clk;
|
||||||
|
clkdev_add(&console_clock_lookup);
|
||||||
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
/* --------------------------------------------------------------------
|
||||||
* GPIO
|
* GPIO
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
@ -252,7 +287,7 @@ static void at91sam9rl_poweroff(void)
|
||||||
* AT91SAM9RL processor initialization
|
* AT91SAM9RL processor initialization
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
void __init at91sam9rl_initialize(unsigned long main_clock)
|
void __init at91sam9rl_map_io(void)
|
||||||
{
|
{
|
||||||
unsigned long cidr, sram_size;
|
unsigned long cidr, sram_size;
|
||||||
|
|
||||||
|
@ -275,7 +310,10 @@ void __init at91sam9rl_initialize(unsigned long main_clock)
|
||||||
|
|
||||||
/* Map SRAM */
|
/* Map SRAM */
|
||||||
iotable_init(at91sam9rl_sram_desc, ARRAY_SIZE(at91sam9rl_sram_desc));
|
iotable_init(at91sam9rl_sram_desc, ARRAY_SIZE(at91sam9rl_sram_desc));
|
||||||
|
}
|
||||||
|
|
||||||
|
void __init at91sam9rl_initialize(unsigned long main_clock)
|
||||||
|
{
|
||||||
at91_arch_reset = at91sam9_alt_reset;
|
at91_arch_reset = at91sam9_alt_reset;
|
||||||
pm_power_off = at91sam9rl_poweroff;
|
pm_power_off = at91sam9rl_poweroff;
|
||||||
at91_extern_irq = (1 << AT91SAM9RL_ID_IRQ0);
|
at91_extern_irq = (1 << AT91SAM9RL_ID_IRQ0);
|
||||||
|
|
|
@ -155,10 +155,6 @@ void __init at91_add_device_usba(struct usba_platform_data *data)
|
||||||
|
|
||||||
/* Pullup pin is handled internally by USB device peripheral */
|
/* Pullup pin is handled internally by USB device peripheral */
|
||||||
|
|
||||||
/* Clocks */
|
|
||||||
at91_clock_associate("utmi_clk", &at91_usba_udc_device.dev, "hclk");
|
|
||||||
at91_clock_associate("udphs_clk", &at91_usba_udc_device.dev, "pclk");
|
|
||||||
|
|
||||||
platform_device_register(&at91_usba_udc_device);
|
platform_device_register(&at91_usba_udc_device);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -605,10 +601,6 @@ static struct platform_device at91sam9rl_tcb_device = {
|
||||||
|
|
||||||
static void __init at91_add_device_tc(void)
|
static void __init at91_add_device_tc(void)
|
||||||
{
|
{
|
||||||
/* this chip has a separate clock and irq for each TC channel */
|
|
||||||
at91_clock_associate("tc0_clk", &at91sam9rl_tcb_device.dev, "t0_clk");
|
|
||||||
at91_clock_associate("tc1_clk", &at91sam9rl_tcb_device.dev, "t1_clk");
|
|
||||||
at91_clock_associate("tc2_clk", &at91sam9rl_tcb_device.dev, "t2_clk");
|
|
||||||
platform_device_register(&at91sam9rl_tcb_device);
|
platform_device_register(&at91sam9rl_tcb_device);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -892,12 +884,10 @@ void __init at91_add_device_ssc(unsigned id, unsigned pins)
|
||||||
case AT91SAM9RL_ID_SSC0:
|
case AT91SAM9RL_ID_SSC0:
|
||||||
pdev = &at91sam9rl_ssc0_device;
|
pdev = &at91sam9rl_ssc0_device;
|
||||||
configure_ssc0_pins(pins);
|
configure_ssc0_pins(pins);
|
||||||
at91_clock_associate("ssc0_clk", &pdev->dev, "pclk");
|
|
||||||
break;
|
break;
|
||||||
case AT91SAM9RL_ID_SSC1:
|
case AT91SAM9RL_ID_SSC1:
|
||||||
pdev = &at91sam9rl_ssc1_device;
|
pdev = &at91sam9rl_ssc1_device;
|
||||||
configure_ssc1_pins(pins);
|
configure_ssc1_pins(pins);
|
||||||
at91_clock_associate("ssc1_clk", &pdev->dev, "pclk");
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
|
@ -1141,37 +1131,34 @@ struct platform_device *atmel_default_console_device; /* the serial console devi
|
||||||
void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
|
void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
|
||||||
{
|
{
|
||||||
struct platform_device *pdev;
|
struct platform_device *pdev;
|
||||||
|
struct atmel_uart_data *pdata;
|
||||||
|
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case 0: /* DBGU */
|
case 0: /* DBGU */
|
||||||
pdev = &at91sam9rl_dbgu_device;
|
pdev = &at91sam9rl_dbgu_device;
|
||||||
configure_dbgu_pins();
|
configure_dbgu_pins();
|
||||||
at91_clock_associate("mck", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
case AT91SAM9RL_ID_US0:
|
case AT91SAM9RL_ID_US0:
|
||||||
pdev = &at91sam9rl_uart0_device;
|
pdev = &at91sam9rl_uart0_device;
|
||||||
configure_usart0_pins(pins);
|
configure_usart0_pins(pins);
|
||||||
at91_clock_associate("usart0_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
case AT91SAM9RL_ID_US1:
|
case AT91SAM9RL_ID_US1:
|
||||||
pdev = &at91sam9rl_uart1_device;
|
pdev = &at91sam9rl_uart1_device;
|
||||||
configure_usart1_pins(pins);
|
configure_usart1_pins(pins);
|
||||||
at91_clock_associate("usart1_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
case AT91SAM9RL_ID_US2:
|
case AT91SAM9RL_ID_US2:
|
||||||
pdev = &at91sam9rl_uart2_device;
|
pdev = &at91sam9rl_uart2_device;
|
||||||
configure_usart2_pins(pins);
|
configure_usart2_pins(pins);
|
||||||
at91_clock_associate("usart2_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
case AT91SAM9RL_ID_US3:
|
case AT91SAM9RL_ID_US3:
|
||||||
pdev = &at91sam9rl_uart3_device;
|
pdev = &at91sam9rl_uart3_device;
|
||||||
configure_usart3_pins(pins);
|
configure_usart3_pins(pins);
|
||||||
at91_clock_associate("usart3_clk", &pdev->dev, "usart");
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
pdev->id = portnr; /* update to mapped ID */
|
pdata = pdev->dev.platform_data;
|
||||||
|
pdata->num = portnr; /* update to mapped ID */
|
||||||
|
|
||||||
if (portnr < ATMEL_MAX_UART)
|
if (portnr < ATMEL_MAX_UART)
|
||||||
at91_uarts[portnr] = pdev;
|
at91_uarts[portnr] = pdev;
|
||||||
|
@ -1179,8 +1166,10 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
|
||||||
|
|
||||||
void __init at91_set_serial_console(unsigned portnr)
|
void __init at91_set_serial_console(unsigned portnr)
|
||||||
{
|
{
|
||||||
if (portnr < ATMEL_MAX_UART)
|
if (portnr < ATMEL_MAX_UART) {
|
||||||
atmel_default_console_device = at91_uarts[portnr];
|
atmel_default_console_device = at91_uarts[portnr];
|
||||||
|
at91sam9rl_set_console_clock(portnr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init at91_add_device_serial(void)
|
void __init at91_add_device_serial(void)
|
||||||
|
|
|
@ -37,11 +37,6 @@ unsigned long clk_get_rate(struct clk *clk)
|
||||||
return AT91X40_MASTER_CLOCK;
|
return AT91X40_MASTER_CLOCK;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct clk *clk_get(struct device *dev, const char *id)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void __init at91x40_initialize(unsigned long main_clock)
|
void __init at91x40_initialize(unsigned long main_clock)
|
||||||
{
|
{
|
||||||
at91_extern_irq = (1 << AT91X40_ID_IRQ0) | (1 << AT91X40_ID_IRQ1)
|
at91_extern_irq = (1 << AT91X40_ID_IRQ0) | (1 << AT91X40_ID_IRQ1)
|
||||||
|
|
|
@ -35,14 +35,18 @@
|
||||||
|
|
||||||
#include <mach/board.h>
|
#include <mach/board.h>
|
||||||
#include <mach/gpio.h>
|
#include <mach/gpio.h>
|
||||||
|
#include <mach/cpu.h>
|
||||||
|
|
||||||
#include "generic.h"
|
#include "generic.h"
|
||||||
|
|
||||||
|
|
||||||
static void __init onearm_map_io(void)
|
static void __init onearm_init_early(void)
|
||||||
{
|
{
|
||||||
|
/* Set cpu type: PQFP */
|
||||||
|
at91rm9200_set_type(ARCH_REVISON_9200_PQFP);
|
||||||
|
|
||||||
/* Initialize processor: 18.432 MHz crystal */
|
/* Initialize processor: 18.432 MHz crystal */
|
||||||
at91rm9200_initialize(18432000, AT91RM9200_PQFP);
|
at91rm9200_initialize(18432000);
|
||||||
|
|
||||||
/* DBGU on ttyS0. (Rx & Tx only) */
|
/* DBGU on ttyS0. (Rx & Tx only) */
|
||||||
at91_register_uart(0, 0, 0);
|
at91_register_uart(0, 0, 0);
|
||||||
|
@ -92,9 +96,9 @@ static void __init onearm_board_init(void)
|
||||||
|
|
||||||
MACHINE_START(ONEARM, "Ajeco 1ARM single board computer")
|
MACHINE_START(ONEARM, "Ajeco 1ARM single board computer")
|
||||||
/* Maintainer: Lennert Buytenhek <buytenh@wantstofly.org> */
|
/* Maintainer: Lennert Buytenhek <buytenh@wantstofly.org> */
|
||||||
.boot_params = AT91_SDRAM_BASE + 0x100,
|
|
||||||
.timer = &at91rm9200_timer,
|
.timer = &at91rm9200_timer,
|
||||||
.map_io = onearm_map_io,
|
.map_io = at91rm9200_map_io,
|
||||||
|
.init_early = onearm_init_early,
|
||||||
.init_irq = onearm_init_irq,
|
.init_irq = onearm_init_irq,
|
||||||
.init_machine = onearm_board_init,
|
.init_machine = onearm_board_init,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -48,7 +48,7 @@
|
||||||
#include "generic.h"
|
#include "generic.h"
|
||||||
|
|
||||||
|
|
||||||
static void __init afeb9260_map_io(void)
|
static void __init afeb9260_init_early(void)
|
||||||
{
|
{
|
||||||
/* Initialize processor: 18.432 MHz crystal */
|
/* Initialize processor: 18.432 MHz crystal */
|
||||||
at91sam9260_initialize(18432000);
|
at91sam9260_initialize(18432000);
|
||||||
|
@ -218,9 +218,9 @@ static void __init afeb9260_board_init(void)
|
||||||
|
|
||||||
MACHINE_START(AFEB9260, "Custom afeb9260 board")
|
MACHINE_START(AFEB9260, "Custom afeb9260 board")
|
||||||
/* Maintainer: Sergey Lapin <slapin@ossfans.org> */
|
/* Maintainer: Sergey Lapin <slapin@ossfans.org> */
|
||||||
.boot_params = AT91_SDRAM_BASE + 0x100,
|
|
||||||
.timer = &at91sam926x_timer,
|
.timer = &at91sam926x_timer,
|
||||||
.map_io = afeb9260_map_io,
|
.map_io = at91sam9260_map_io,
|
||||||
|
.init_early = afeb9260_init_early,
|
||||||
.init_irq = afeb9260_init_irq,
|
.init_irq = afeb9260_init_irq,
|
||||||
.init_machine = afeb9260_board_init,
|
.init_machine = afeb9260_board_init,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -1,326 +0,0 @@
|
||||||
/*
|
|
||||||
* linux/arch/arm/mach-at91/board-at572d940hf_ek.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 2008 Atmel Antonio R. Costa <costa.antonior@gmail.com>
|
|
||||||
* Copyright (C) 2005 SAN People
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/types.h>
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/mm.h>
|
|
||||||
#include <linux/module.h>
|
|
||||||
#include <linux/platform_device.h>
|
|
||||||
#include <linux/spi/spi.h>
|
|
||||||
#include <linux/spi/ds1305.h>
|
|
||||||
#include <linux/irq.h>
|
|
||||||
#include <linux/mtd/physmap.h>
|
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
|
||||||
#include <asm/setup.h>
|
|
||||||
#include <asm/mach-types.h>
|
|
||||||
#include <asm/irq.h>
|
|
||||||
|
|
||||||
#include <asm/mach/arch.h>
|
|
||||||
#include <asm/mach/map.h>
|
|
||||||
#include <asm/mach/irq.h>
|
|
||||||
|
|
||||||
#include <mach/board.h>
|
|
||||||
#include <mach/gpio.h>
|
|
||||||
#include <mach/at91sam9_smc.h>
|
|
||||||
|
|
||||||
#include "sam9_smc.h"
|
|
||||||
#include "generic.h"
|
|
||||||
|
|
||||||
|
|
||||||
static void __init eb_map_io(void)
|
|
||||||
{
|
|
||||||
/* Initialize processor: 12.500 MHz crystal */
|
|
||||||
at572d940hf_initialize(12000000);
|
|
||||||
|
|
||||||
/* DBGU on ttyS0. (Rx & Tx only) */
|
|
||||||
at91_register_uart(0, 0, 0);
|
|
||||||
|
|
||||||
/* USART0 on ttyS1. (Rx & Tx only) */
|
|
||||||
at91_register_uart(AT572D940HF_ID_US0, 1, 0);
|
|
||||||
|
|
||||||
/* USART1 on ttyS2. (Rx & Tx only) */
|
|
||||||
at91_register_uart(AT572D940HF_ID_US1, 2, 0);
|
|
||||||
|
|
||||||
/* USART2 on ttyS3. (Tx & Rx only */
|
|
||||||
at91_register_uart(AT572D940HF_ID_US2, 3, 0);
|
|
||||||
|
|
||||||
/* set serial console to ttyS0 (ie, DBGU) */
|
|
||||||
at91_set_serial_console(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __init eb_init_irq(void)
|
|
||||||
{
|
|
||||||
at572d940hf_init_interrupts(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* USB Host Port
|
|
||||||
*/
|
|
||||||
static struct at91_usbh_data __initdata eb_usbh_data = {
|
|
||||||
.ports = 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* USB Device Port
|
|
||||||
*/
|
|
||||||
static struct at91_udc_data __initdata eb_udc_data = {
|
|
||||||
.vbus_pin = 0, /* no VBUS detection,UDC always on */
|
|
||||||
.pullup_pin = 0, /* pull-up driven by UDC */
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* MCI (SD/MMC)
|
|
||||||
*/
|
|
||||||
static struct at91_mmc_data __initdata eb_mmc_data = {
|
|
||||||
.wire4 = 1,
|
|
||||||
/* .det_pin = ... not connected */
|
|
||||||
/* .wp_pin = ... not connected */
|
|
||||||
/* .vcc_pin = ... not connected */
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* MACB Ethernet device
|
|
||||||
*/
|
|
||||||
static struct at91_eth_data __initdata eb_eth_data = {
|
|
||||||
.phy_irq_pin = AT91_PIN_PB25,
|
|
||||||
.is_rmii = 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* NOR flash
|
|
||||||
*/
|
|
||||||
|
|
||||||
static struct mtd_partition eb_nor_partitions[] = {
|
|
||||||
{
|
|
||||||
.name = "Raw Environment",
|
|
||||||
.offset = 0,
|
|
||||||
.size = SZ_4M,
|
|
||||||
.mask_flags = 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.name = "OS FS",
|
|
||||||
.offset = MTDPART_OFS_APPEND,
|
|
||||||
.size = 3 * SZ_1M,
|
|
||||||
.mask_flags = 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.name = "APP FS",
|
|
||||||
.offset = MTDPART_OFS_APPEND,
|
|
||||||
.size = MTDPART_SIZ_FULL,
|
|
||||||
.mask_flags = 0,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static void nor_flash_set_vpp(struct map_info* mi, int i) {
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct physmap_flash_data nor_flash_data = {
|
|
||||||
.width = 4,
|
|
||||||
.parts = eb_nor_partitions,
|
|
||||||
.nr_parts = ARRAY_SIZE(eb_nor_partitions),
|
|
||||||
.set_vpp = nor_flash_set_vpp,
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct resource nor_flash_resources[] = {
|
|
||||||
{
|
|
||||||
.start = AT91_CHIPSELECT_0,
|
|
||||||
.end = AT91_CHIPSELECT_0 + SZ_16M - 1,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct platform_device nor_flash = {
|
|
||||||
.name = "physmap-flash",
|
|
||||||
.id = 0,
|
|
||||||
.dev = {
|
|
||||||
.platform_data = &nor_flash_data,
|
|
||||||
},
|
|
||||||
.resource = nor_flash_resources,
|
|
||||||
.num_resources = ARRAY_SIZE(nor_flash_resources),
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct sam9_smc_config __initdata eb_nor_smc_config = {
|
|
||||||
.ncs_read_setup = 1,
|
|
||||||
.nrd_setup = 1,
|
|
||||||
.ncs_write_setup = 1,
|
|
||||||
.nwe_setup = 1,
|
|
||||||
|
|
||||||
.ncs_read_pulse = 7,
|
|
||||||
.nrd_pulse = 7,
|
|
||||||
.ncs_write_pulse = 7,
|
|
||||||
.nwe_pulse = 7,
|
|
||||||
|
|
||||||
.read_cycle = 9,
|
|
||||||
.write_cycle = 9,
|
|
||||||
|
|
||||||
.mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_BAT_WRITE | AT91_SMC_DBW_32,
|
|
||||||
.tdf_cycles = 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
static void __init eb_add_device_nor(void)
|
|
||||||
{
|
|
||||||
/* configure chip-select 0 (NOR) */
|
|
||||||
sam9_smc_configure(0, &eb_nor_smc_config);
|
|
||||||
platform_device_register(&nor_flash);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* NAND flash
|
|
||||||
*/
|
|
||||||
static struct mtd_partition __initdata eb_nand_partition[] = {
|
|
||||||
{
|
|
||||||
.name = "Partition 1",
|
|
||||||
.offset = 0,
|
|
||||||
.size = SZ_16M,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.name = "Partition 2",
|
|
||||||
.offset = MTDPART_OFS_NXTBLK,
|
|
||||||
.size = MTDPART_SIZ_FULL,
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct mtd_partition * __init nand_partitions(int size, int *num_partitions)
|
|
||||||
{
|
|
||||||
*num_partitions = ARRAY_SIZE(eb_nand_partition);
|
|
||||||
return eb_nand_partition;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct atmel_nand_data __initdata eb_nand_data = {
|
|
||||||
.ale = 22,
|
|
||||||
.cle = 21,
|
|
||||||
/* .det_pin = ... not connected */
|
|
||||||
/* .rdy_pin = AT91_PIN_PC16, */
|
|
||||||
.enable_pin = AT91_PIN_PA15,
|
|
||||||
.partition_info = nand_partitions,
|
|
||||||
#if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
|
|
||||||
.bus_width_16 = 1,
|
|
||||||
#else
|
|
||||||
.bus_width_16 = 0,
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct sam9_smc_config __initdata eb_nand_smc_config = {
|
|
||||||
.ncs_read_setup = 0,
|
|
||||||
.nrd_setup = 0,
|
|
||||||
.ncs_write_setup = 1,
|
|
||||||
.nwe_setup = 1,
|
|
||||||
|
|
||||||
.ncs_read_pulse = 3,
|
|
||||||
.nrd_pulse = 3,
|
|
||||||
.ncs_write_pulse = 3,
|
|
||||||
.nwe_pulse = 3,
|
|
||||||
|
|
||||||
.read_cycle = 5,
|
|
||||||
.write_cycle = 5,
|
|
||||||
|
|
||||||
.mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE,
|
|
||||||
.tdf_cycles = 12,
|
|
||||||
};
|
|
||||||
|
|
||||||
static void __init eb_add_device_nand(void)
|
|
||||||
{
|
|
||||||
/* setup bus-width (8 or 16) */
|
|
||||||
if (eb_nand_data.bus_width_16)
|
|
||||||
eb_nand_smc_config.mode |= AT91_SMC_DBW_16;
|
|
||||||
else
|
|
||||||
eb_nand_smc_config.mode |= AT91_SMC_DBW_8;
|
|
||||||
|
|
||||||
/* configure chip-select 3 (NAND) */
|
|
||||||
sam9_smc_configure(3, &eb_nand_smc_config);
|
|
||||||
|
|
||||||
at91_add_device_nand(&eb_nand_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SPI devices
|
|
||||||
*/
|
|
||||||
static struct resource rtc_resources[] = {
|
|
||||||
[0] = {
|
|
||||||
.start = AT572D940HF_ID_IRQ1,
|
|
||||||
.end = AT572D940HF_ID_IRQ1,
|
|
||||||
.flags = IORESOURCE_IRQ,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct ds1305_platform_data ds1306_data = {
|
|
||||||
.is_ds1306 = true,
|
|
||||||
.en_1hz = false,
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct spi_board_info eb_spi_devices[] = {
|
|
||||||
{ /* RTC Dallas DS1306 */
|
|
||||||
.modalias = "rtc-ds1305",
|
|
||||||
.chip_select = 3,
|
|
||||||
.mode = SPI_CS_HIGH | SPI_CPOL | SPI_CPHA,
|
|
||||||
.max_speed_hz = 500000,
|
|
||||||
.bus_num = 0,
|
|
||||||
.irq = AT572D940HF_ID_IRQ1,
|
|
||||||
.platform_data = (void *) &ds1306_data,
|
|
||||||
},
|
|
||||||
#if defined(CONFIG_MTD_AT91_DATAFLASH_CARD)
|
|
||||||
{ /* Dataflash card */
|
|
||||||
.modalias = "mtd_dataflash",
|
|
||||||
.chip_select = 0,
|
|
||||||
.max_speed_hz = 15 * 1000 * 1000,
|
|
||||||
.bus_num = 0,
|
|
||||||
},
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
static void __init eb_board_init(void)
|
|
||||||
{
|
|
||||||
/* Serial */
|
|
||||||
at91_add_device_serial();
|
|
||||||
/* USB Host */
|
|
||||||
at91_add_device_usbh(&eb_usbh_data);
|
|
||||||
/* USB Device */
|
|
||||||
at91_add_device_udc(&eb_udc_data);
|
|
||||||
/* I2C */
|
|
||||||
at91_add_device_i2c(NULL, 0);
|
|
||||||
/* NOR */
|
|
||||||
eb_add_device_nor();
|
|
||||||
/* NAND */
|
|
||||||
eb_add_device_nand();
|
|
||||||
/* SPI */
|
|
||||||
at91_add_device_spi(eb_spi_devices, ARRAY_SIZE(eb_spi_devices));
|
|
||||||
/* MMC */
|
|
||||||
at91_add_device_mmc(0, &eb_mmc_data);
|
|
||||||
/* Ethernet */
|
|
||||||
at91_add_device_eth(&eb_eth_data);
|
|
||||||
/* mAgic */
|
|
||||||
at91_add_device_mAgic();
|
|
||||||
}
|
|
||||||
|
|
||||||
MACHINE_START(AT572D940HFEB, "Atmel AT91D940HF-EB")
|
|
||||||
/* Maintainer: Atmel <costa.antonior@gmail.com> */
|
|
||||||
.boot_params = AT91_SDRAM_BASE + 0x100,
|
|
||||||
.timer = &at91sam926x_timer,
|
|
||||||
.map_io = eb_map_io,
|
|
||||||
.init_irq = eb_init_irq,
|
|
||||||
.init_machine = eb_board_init,
|
|
||||||
MACHINE_END
|
|
|
@ -45,7 +45,7 @@
|
||||||
#include "generic.h"
|
#include "generic.h"
|
||||||
|
|
||||||
|
|
||||||
static void __init cam60_map_io(void)
|
static void __init cam60_init_early(void)
|
||||||
{
|
{
|
||||||
/* Initialize processor: 10 MHz crystal */
|
/* Initialize processor: 10 MHz crystal */
|
||||||
at91sam9260_initialize(10000000);
|
at91sam9260_initialize(10000000);
|
||||||
|
@ -198,9 +198,9 @@ static void __init cam60_board_init(void)
|
||||||
|
|
||||||
MACHINE_START(CAM60, "KwikByte CAM60")
|
MACHINE_START(CAM60, "KwikByte CAM60")
|
||||||
/* Maintainer: KwikByte */
|
/* Maintainer: KwikByte */
|
||||||
.boot_params = AT91_SDRAM_BASE + 0x100,
|
|
||||||
.timer = &at91sam926x_timer,
|
.timer = &at91sam926x_timer,
|
||||||
.map_io = cam60_map_io,
|
.map_io = at91sam9260_map_io,
|
||||||
|
.init_early = cam60_init_early,
|
||||||
.init_irq = cam60_init_irq,
|
.init_irq = cam60_init_irq,
|
||||||
.init_machine = cam60_board_init,
|
.init_machine = cam60_board_init,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue