mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-23 20:53:53 +08:00
Merge branch 'fix/hda' into topic/hda
This commit is contained in:
commit
ca19e77e44
22
Documentation/ABI/obsolete/proc-pid-oom_adj
Normal file
22
Documentation/ABI/obsolete/proc-pid-oom_adj
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
What: /proc/<pid>/oom_adj
|
||||||
|
When: August 2012
|
||||||
|
Why: /proc/<pid>/oom_adj allows userspace to influence the oom killer's
|
||||||
|
badness heuristic used to determine which task to kill when the kernel
|
||||||
|
is out of memory.
|
||||||
|
|
||||||
|
The badness heuristic has since been rewritten since the introduction of
|
||||||
|
this tunable such that its meaning is deprecated. The value was
|
||||||
|
implemented as a bitshift on a score generated by the badness()
|
||||||
|
function that did not have any precise units of measure. With the
|
||||||
|
rewrite, the score is given as a proportion of available memory to the
|
||||||
|
task allocating pages, so using a bitshift which grows the score
|
||||||
|
exponentially is, thus, impossible to tune with fine granularity.
|
||||||
|
|
||||||
|
A much more powerful interface, /proc/<pid>/oom_score_adj, was
|
||||||
|
introduced with the oom killer rewrite that allows users to increase or
|
||||||
|
decrease the badness() score linearly. This interface will replace
|
||||||
|
/proc/<pid>/oom_adj.
|
||||||
|
|
||||||
|
A warning will be emitted to the kernel log if an application uses this
|
||||||
|
deprecated interface. After it is printed once, future warnings will be
|
||||||
|
suppressed until the kernel is rebooted.
|
@ -16,7 +16,7 @@
|
|||||||
</orgname>
|
</orgname>
|
||||||
|
|
||||||
<address>
|
<address>
|
||||||
<email>hjk@linutronix.de</email>
|
<email>hjk@hansjkoch.de</email>
|
||||||
</address>
|
</address>
|
||||||
</affiliation>
|
</affiliation>
|
||||||
</author>
|
</author>
|
||||||
@ -114,7 +114,7 @@ GPL version 2.
|
|||||||
|
|
||||||
<para>If you know of any translations for this document, or you are
|
<para>If you know of any translations for this document, or you are
|
||||||
interested in translating it, please email me
|
interested in translating it, please email me
|
||||||
<email>hjk@linutronix.de</email>.
|
<email>hjk@hansjkoch.de</email>.
|
||||||
</para>
|
</para>
|
||||||
</sect1>
|
</sect1>
|
||||||
|
|
||||||
@ -171,7 +171,7 @@ interested in translating it, please email me
|
|||||||
<title>Feedback</title>
|
<title>Feedback</title>
|
||||||
<para>Find something wrong with this document? (Or perhaps something
|
<para>Find something wrong with this document? (Or perhaps something
|
||||||
right?) I would love to hear from you. Please email me at
|
right?) I would love to hear from you. Please email me at
|
||||||
<email>hjk@linutronix.de</email>.</para>
|
<email>hjk@hansjkoch.de</email>.</para>
|
||||||
</sect1>
|
</sect1>
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
|
@ -255,9 +255,10 @@ framebuffer parameters.
|
|||||||
Kernel boot arguments
|
Kernel boot arguments
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
vram=<size>
|
vram=<size>[,<physaddr>]
|
||||||
- Amount of total VRAM to preallocate. For example, "10M". omapfb
|
- Amount of total VRAM to preallocate and optionally a physical start
|
||||||
allocates memory for framebuffers from VRAM.
|
memory address. For example, "10M". omapfb allocates memory for
|
||||||
|
framebuffers from VRAM.
|
||||||
|
|
||||||
omapfb.mode=<display>:<mode>[,...]
|
omapfb.mode=<display>:<mode>[,...]
|
||||||
- Default video mode for specified displays. For example,
|
- Default video mode for specified displays. For example,
|
||||||
|
@ -16,7 +16,7 @@ you can do so by typing:
|
|||||||
As of the Linux 2.6.10 kernel, it is now possible to change the
|
As of the Linux 2.6.10 kernel, it is now possible to change the
|
||||||
IO scheduler for a given block device on the fly (thus making it possible,
|
IO scheduler for a given block device on the fly (thus making it possible,
|
||||||
for instance, to set the CFQ scheduler for the system default, but
|
for instance, to set the CFQ scheduler for the system default, but
|
||||||
set a specific device to use the anticipatory or noop schedulers - which
|
set a specific device to use the deadline or noop schedulers - which
|
||||||
can improve that device's throughput).
|
can improve that device's throughput).
|
||||||
|
|
||||||
To set a specific scheduler, simply do this:
|
To set a specific scheduler, simply do this:
|
||||||
@ -31,7 +31,7 @@ a "cat /sys/block/DEV/queue/scheduler" - the list of valid names
|
|||||||
will be displayed, with the currently selected scheduler in brackets:
|
will be displayed, with the currently selected scheduler in brackets:
|
||||||
|
|
||||||
# cat /sys/block/hda/queue/scheduler
|
# cat /sys/block/hda/queue/scheduler
|
||||||
noop anticipatory deadline [cfq]
|
noop deadline [cfq]
|
||||||
# echo anticipatory > /sys/block/hda/queue/scheduler
|
# echo deadline > /sys/block/hda/queue/scheduler
|
||||||
# cat /sys/block/hda/queue/scheduler
|
# cat /sys/block/hda/queue/scheduler
|
||||||
noop [anticipatory] deadline cfq
|
noop [deadline] cfq
|
||||||
|
@ -154,7 +154,7 @@ The stages that a patch goes through are, generally:
|
|||||||
inclusion, it should be accepted by a relevant subsystem maintainer -
|
inclusion, it should be accepted by a relevant subsystem maintainer -
|
||||||
though this acceptance is not a guarantee that the patch will make it
|
though this acceptance is not a guarantee that the patch will make it
|
||||||
all the way to the mainline. The patch will show up in the maintainer's
|
all the way to the mainline. The patch will show up in the maintainer's
|
||||||
subsystem tree and into the staging trees (described below). When the
|
subsystem tree and into the -next trees (described below). When the
|
||||||
process works, this step leads to more extensive review of the patch and
|
process works, this step leads to more extensive review of the patch and
|
||||||
the discovery of any problems resulting from the integration of this
|
the discovery of any problems resulting from the integration of this
|
||||||
patch with work being done by others.
|
patch with work being done by others.
|
||||||
@ -236,7 +236,7 @@ finding the right maintainer. Sending patches directly to Linus is not
|
|||||||
normally the right way to go.
|
normally the right way to go.
|
||||||
|
|
||||||
|
|
||||||
2.4: STAGING TREES
|
2.4: NEXT TREES
|
||||||
|
|
||||||
The chain of subsystem trees guides the flow of patches into the kernel,
|
The chain of subsystem trees guides the flow of patches into the kernel,
|
||||||
but it also raises an interesting question: what if somebody wants to look
|
but it also raises an interesting question: what if somebody wants to look
|
||||||
@ -250,7 +250,7 @@ changes land in the mainline kernel. One could pull changes from all of
|
|||||||
the interesting subsystem trees, but that would be a big and error-prone
|
the interesting subsystem trees, but that would be a big and error-prone
|
||||||
job.
|
job.
|
||||||
|
|
||||||
The answer comes in the form of staging trees, where subsystem trees are
|
The answer comes in the form of -next trees, where subsystem trees are
|
||||||
collected for testing and review. The older of these trees, maintained by
|
collected for testing and review. The older of these trees, maintained by
|
||||||
Andrew Morton, is called "-mm" (for memory management, which is how it got
|
Andrew Morton, is called "-mm" (for memory management, which is how it got
|
||||||
started). The -mm tree integrates patches from a long list of subsystem
|
started). The -mm tree integrates patches from a long list of subsystem
|
||||||
@ -275,7 +275,7 @@ directory at:
|
|||||||
Use of the MMOTM tree is likely to be a frustrating experience, though;
|
Use of the MMOTM tree is likely to be a frustrating experience, though;
|
||||||
there is a definite chance that it will not even compile.
|
there is a definite chance that it will not even compile.
|
||||||
|
|
||||||
The other staging tree, started more recently, is linux-next, maintained by
|
The other -next tree, started more recently, is linux-next, maintained by
|
||||||
Stephen Rothwell. The linux-next tree is, by design, a snapshot of what
|
Stephen Rothwell. The linux-next tree is, by design, a snapshot of what
|
||||||
the mainline is expected to look like after the next merge window closes.
|
the mainline is expected to look like after the next merge window closes.
|
||||||
Linux-next trees are announced on the linux-kernel and linux-next mailing
|
Linux-next trees are announced on the linux-kernel and linux-next mailing
|
||||||
@ -303,12 +303,25 @@ volatility of linux-next tends to make it a difficult development target.
|
|||||||
See http://lwn.net/Articles/289013/ for more information on this topic, and
|
See http://lwn.net/Articles/289013/ for more information on this topic, and
|
||||||
stay tuned; much is still in flux where linux-next is involved.
|
stay tuned; much is still in flux where linux-next is involved.
|
||||||
|
|
||||||
Besides the mmotm and linux-next trees, the kernel source tree now contains
|
2.4.1: STAGING TREES
|
||||||
the drivers/staging/ directory and many sub-directories for drivers or
|
|
||||||
filesystems that are on their way to being added to the kernel tree
|
|
||||||
proper, but they remain in drivers/staging/ while they still need more
|
|
||||||
work.
|
|
||||||
|
|
||||||
|
The kernel source tree now contains the drivers/staging/ directory, where
|
||||||
|
many sub-directories for drivers or filesystems that are on their way to
|
||||||
|
being added to the kernel tree live. They remain in drivers/staging while
|
||||||
|
they still need more work; once complete, they can be moved into the
|
||||||
|
kernel proper. This is a way to keep track of drivers that aren't
|
||||||
|
up to Linux kernel coding or quality standards, but people may want to use
|
||||||
|
them and track development.
|
||||||
|
|
||||||
|
Greg Kroah-Hartman currently (as of 2.6.36) maintains the staging tree.
|
||||||
|
Drivers that still need work are sent to him, with each driver having
|
||||||
|
its own subdirectory in drivers/staging/. Along with the driver source
|
||||||
|
files, a TODO file should be present in the directory as well. The TODO
|
||||||
|
file lists the pending work that the driver needs for acceptance into
|
||||||
|
the kernel proper, as well as a list of people that should be Cc'd for any
|
||||||
|
patches to the driver. Staging drivers that don't currently build should
|
||||||
|
have their config entries depend upon CONFIG_BROKEN. Once they can
|
||||||
|
be successfully built without outside patches, CONFIG_BROKEN can be removed.
|
||||||
|
|
||||||
2.5: TOOLS
|
2.5: TOOLS
|
||||||
|
|
||||||
|
@ -554,3 +554,13 @@ Why: This is a legacy interface which have been replaced by a more
|
|||||||
Who: NeilBrown <neilb@suse.de>
|
Who: NeilBrown <neilb@suse.de>
|
||||||
|
|
||||||
----------------------------
|
----------------------------
|
||||||
|
|
||||||
|
What: i2c_adapter.id
|
||||||
|
When: June 2011
|
||||||
|
Why: This field is deprecated. I2C device drivers shouldn't change their
|
||||||
|
behavior based on the underlying I2C adapter. Instead, the I2C
|
||||||
|
adapter driver should instantiate the I2C devices and provide the
|
||||||
|
needed platform-specific information.
|
||||||
|
Who: Jean Delvare <khali@linux-fr.org>
|
||||||
|
|
||||||
|
----------------------------
|
||||||
|
@ -89,7 +89,7 @@ static ssize_t childless_storeme_write(struct childless *childless,
|
|||||||
char *p = (char *) page;
|
char *p = (char *) page;
|
||||||
|
|
||||||
tmp = simple_strtoul(p, &p, 10);
|
tmp = simple_strtoul(p, &p, 10);
|
||||||
if (!p || (*p && (*p != '\n')))
|
if ((*p != '\0') && (*p != '\n'))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (tmp > INT_MAX)
|
if (tmp > INT_MAX)
|
||||||
|
@ -794,17 +794,6 @@ designed.
|
|||||||
|
|
||||||
Roadmap:
|
Roadmap:
|
||||||
|
|
||||||
2.6.37 Remove experimental tag from mount option
|
|
||||||
=> should be roughly 6 months after initial merge
|
|
||||||
=> enough time to:
|
|
||||||
=> gain confidence and fix problems reported by early
|
|
||||||
adopters (a.k.a. guinea pigs)
|
|
||||||
=> address worst performance regressions and undesired
|
|
||||||
behaviours
|
|
||||||
=> start tuning/optimising code for parallelism
|
|
||||||
=> start tuning/optimising algorithms consuming
|
|
||||||
excessive CPU time
|
|
||||||
|
|
||||||
2.6.39 Switch default mount option to use delayed logging
|
2.6.39 Switch default mount option to use delayed logging
|
||||||
=> should be roughly 12 months after initial merge
|
=> should be roughly 12 months after initial merge
|
||||||
=> enough time to shake out remaining problems before next round of
|
=> enough time to shake out remaining problems before next round of
|
||||||
|
@ -617,6 +617,16 @@ and have the following read/write attributes:
|
|||||||
is configured as an output, this value may be written;
|
is configured as an output, this value may be written;
|
||||||
any nonzero value is treated as high.
|
any nonzero value is treated as high.
|
||||||
|
|
||||||
|
If the pin can be configured as interrupt-generating interrupt
|
||||||
|
and if it has been configured to generate interrupts (see the
|
||||||
|
description of "edge"), you can poll(2) on that file and
|
||||||
|
poll(2) will return whenever the interrupt was triggered. If
|
||||||
|
you use poll(2), set the events POLLPRI and POLLERR. If you
|
||||||
|
use select(2), set the file descriptor in exceptfds. After
|
||||||
|
poll(2) returns, either lseek(2) to the beginning of the sysfs
|
||||||
|
file and read the new value or close the file and re-open it
|
||||||
|
to read the value.
|
||||||
|
|
||||||
"edge" ... reads as either "none", "rising", "falling", or
|
"edge" ... reads as either "none", "rising", "falling", or
|
||||||
"both". Write these strings to select the signal edge(s)
|
"both". Write these strings to select the signal edge(s)
|
||||||
that will make poll(2) on the "value" file return.
|
that will make poll(2) on the "value" file return.
|
||||||
|
@ -11,7 +11,7 @@ Authors:
|
|||||||
Mark M. Hoffman <mhoffman@lightlink.com>
|
Mark M. Hoffman <mhoffman@lightlink.com>
|
||||||
Ported to 2.6 by Eric J. Bowersox <ericb@aspsys.com>
|
Ported to 2.6 by Eric J. Bowersox <ericb@aspsys.com>
|
||||||
Adapted to 2.6.20 by Carsten Emde <ce@osadl.org>
|
Adapted to 2.6.20 by Carsten Emde <ce@osadl.org>
|
||||||
Modified for mainline integration by Hans J. Koch <hjk@linutronix.de>
|
Modified for mainline integration by Hans J. Koch <hjk@hansjkoch.de>
|
||||||
|
|
||||||
Module Parameters
|
Module Parameters
|
||||||
-----------------
|
-----------------
|
||||||
|
@ -8,7 +8,7 @@ Supported chips:
|
|||||||
Datasheet: http://pdfserv.maxim-ic.com/en/ds/MAX6650-MAX6651.pdf
|
Datasheet: http://pdfserv.maxim-ic.com/en/ds/MAX6650-MAX6651.pdf
|
||||||
|
|
||||||
Authors:
|
Authors:
|
||||||
Hans J. Koch <hjk@linutronix.de>
|
Hans J. Koch <hjk@hansjkoch.de>
|
||||||
John Morris <john.morris@spirentcom.com>
|
John Morris <john.morris@spirentcom.com>
|
||||||
Claus Gindhart <claus.gindhart@kontron.com>
|
Claus Gindhart <claus.gindhart@kontron.com>
|
||||||
|
|
||||||
|
@ -706,7 +706,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||||||
arch/x86/kernel/cpu/cpufreq/elanfreq.c.
|
arch/x86/kernel/cpu/cpufreq/elanfreq.c.
|
||||||
|
|
||||||
elevator= [IOSCHED]
|
elevator= [IOSCHED]
|
||||||
Format: {"anticipatory" | "cfq" | "deadline" | "noop"}
|
Format: {"cfq" | "deadline" | "noop"}
|
||||||
See Documentation/block/as-iosched.txt and
|
See Documentation/block/as-iosched.txt and
|
||||||
Documentation/block/deadline-iosched.txt for details.
|
Documentation/block/deadline-iosched.txt for details.
|
||||||
|
|
||||||
|
@ -60,15 +60,18 @@ Hardware accelerated blink of LEDs
|
|||||||
|
|
||||||
Some LEDs can be programmed to blink without any CPU interaction. To
|
Some LEDs can be programmed to blink without any CPU interaction. To
|
||||||
support this feature, a LED driver can optionally implement the
|
support this feature, a LED driver can optionally implement the
|
||||||
blink_set() function (see <linux/leds.h>). If implemented, triggers can
|
blink_set() function (see <linux/leds.h>). To set an LED to blinking,
|
||||||
attempt to use it before falling back to software timers. The blink_set()
|
however, it is better to use use the API function led_blink_set(),
|
||||||
function should return 0 if the blink setting is supported, or -EINVAL
|
as it will check and implement software fallback if necessary.
|
||||||
otherwise, which means that LED blinking will be handled by software.
|
|
||||||
|
|
||||||
The blink_set() function should choose a user friendly blinking
|
To turn off blinking again, use the API function led_brightness_set()
|
||||||
value if it is called with *delay_on==0 && *delay_off==0 parameters. In
|
as that will not just set the LED brightness but also stop any software
|
||||||
this case the driver should give back the chosen value through delay_on
|
timers that may have been required for blinking.
|
||||||
and delay_off parameters to the leds subsystem.
|
|
||||||
|
The blink_set() function should choose a user friendly blinking value
|
||||||
|
if it is called with *delay_on==0 && *delay_off==0 parameters. In this
|
||||||
|
case the driver should give back the chosen value through delay_on and
|
||||||
|
delay_off parameters to the leds subsystem.
|
||||||
|
|
||||||
Setting the brightness to zero with brightness_set() callback function
|
Setting the brightness to zero with brightness_set() callback function
|
||||||
should completely turn off the LED and cancel the previously programmed
|
should completely turn off the LED and cancel the previously programmed
|
||||||
|
88
Documentation/leds/leds-lp5521.txt
Normal file
88
Documentation/leds/leds-lp5521.txt
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
Kernel driver for lp5521
|
||||||
|
========================
|
||||||
|
|
||||||
|
* National Semiconductor LP5521 led driver chip
|
||||||
|
* Datasheet: http://www.national.com/pf/LP/LP5521.html
|
||||||
|
|
||||||
|
Authors: Mathias Nyman, Yuri Zaporozhets, Samu Onkalo
|
||||||
|
Contact: Samu Onkalo (samu.p.onkalo-at-nokia.com)
|
||||||
|
|
||||||
|
Description
|
||||||
|
-----------
|
||||||
|
|
||||||
|
LP5521 can drive up to 3 channels. Leds can be controlled directly via
|
||||||
|
the led class control interface. Channels have generic names:
|
||||||
|
lp5521:channelx, where x is 0 .. 2
|
||||||
|
|
||||||
|
All three channels can be also controlled using the engine micro programs.
|
||||||
|
More details of the instructions can be found from the public data sheet.
|
||||||
|
|
||||||
|
Control interface for the engines:
|
||||||
|
x is 1 .. 3
|
||||||
|
enginex_mode : disabled, load, run
|
||||||
|
enginex_load : store program (visible only in engine load mode)
|
||||||
|
|
||||||
|
Example (start to blink the channel 2 led):
|
||||||
|
cd /sys/class/leds/lp5521:channel2/device
|
||||||
|
echo "load" > engine3_mode
|
||||||
|
echo "037f4d0003ff6000" > engine3_load
|
||||||
|
echo "run" > engine3_mode
|
||||||
|
|
||||||
|
stop the engine:
|
||||||
|
echo "disabled" > engine3_mode
|
||||||
|
|
||||||
|
sysfs contains a selftest entry.
|
||||||
|
The test communicates with the chip and checks that
|
||||||
|
the clock mode is automatically set to the requested one.
|
||||||
|
|
||||||
|
Each channel has its own led current settings.
|
||||||
|
/sys/class/leds/lp5521:channel0/led_current - RW
|
||||||
|
/sys/class/leds/lp5521:channel0/max_current - RO
|
||||||
|
Format: 10x mA i.e 10 means 1.0 mA
|
||||||
|
|
||||||
|
example platform data:
|
||||||
|
|
||||||
|
Note: chan_nr can have values between 0 and 2.
|
||||||
|
|
||||||
|
static struct lp5521_led_config lp5521_led_config[] = {
|
||||||
|
{
|
||||||
|
.chan_nr = 0,
|
||||||
|
.led_current = 50,
|
||||||
|
.max_current = 130,
|
||||||
|
}, {
|
||||||
|
.chan_nr = 1,
|
||||||
|
.led_current = 0,
|
||||||
|
.max_current = 130,
|
||||||
|
}, {
|
||||||
|
.chan_nr = 2,
|
||||||
|
.led_current = 0,
|
||||||
|
.max_current = 130,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static int lp5521_setup(void)
|
||||||
|
{
|
||||||
|
/* setup HW resources */
|
||||||
|
}
|
||||||
|
|
||||||
|
static void lp5521_release(void)
|
||||||
|
{
|
||||||
|
/* Release HW resources */
|
||||||
|
}
|
||||||
|
|
||||||
|
static void lp5521_enable(bool state)
|
||||||
|
{
|
||||||
|
/* Control of chip enable signal */
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct lp5521_platform_data lp5521_platform_data = {
|
||||||
|
.led_config = lp5521_led_config,
|
||||||
|
.num_channels = ARRAY_SIZE(lp5521_led_config),
|
||||||
|
.clock_mode = LP5521_CLOCK_EXT,
|
||||||
|
.setup_resources = lp5521_setup,
|
||||||
|
.release_resources = lp5521_release,
|
||||||
|
.enable = lp5521_enable,
|
||||||
|
};
|
||||||
|
|
||||||
|
If the current is set to 0 in the platform data, that channel is
|
||||||
|
disabled and it is not visible in the sysfs.
|
83
Documentation/leds/leds-lp5523.txt
Normal file
83
Documentation/leds/leds-lp5523.txt
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
Kernel driver for lp5523
|
||||||
|
========================
|
||||||
|
|
||||||
|
* National Semiconductor LP5523 led driver chip
|
||||||
|
* Datasheet: http://www.national.com/pf/LP/LP5523.html
|
||||||
|
|
||||||
|
Authors: Mathias Nyman, Yuri Zaporozhets, Samu Onkalo
|
||||||
|
Contact: Samu Onkalo (samu.p.onkalo-at-nokia.com)
|
||||||
|
|
||||||
|
Description
|
||||||
|
-----------
|
||||||
|
LP5523 can drive up to 9 channels. Leds can be controlled directly via
|
||||||
|
the led class control interface. Channels have generic names:
|
||||||
|
lp5523:channelx where x is 0...8
|
||||||
|
|
||||||
|
The chip provides 3 engines. Each engine can control channels without
|
||||||
|
interaction from the main CPU. Details of the micro engine code can be found
|
||||||
|
from the public data sheet. Leds can be muxed to different channels.
|
||||||
|
|
||||||
|
Control interface for the engines:
|
||||||
|
x is 1 .. 3
|
||||||
|
enginex_mode : disabled, load, run
|
||||||
|
enginex_load : microcode load (visible only in load mode)
|
||||||
|
enginex_leds : led mux control (visible only in load mode)
|
||||||
|
|
||||||
|
cd /sys/class/leds/lp5523:channel2/device
|
||||||
|
echo "load" > engine3_mode
|
||||||
|
echo "9d80400004ff05ff437f0000" > engine3_load
|
||||||
|
echo "111111111" > engine3_leds
|
||||||
|
echo "run" > engine3_mode
|
||||||
|
|
||||||
|
sysfs contains a selftest entry. It measures each channel
|
||||||
|
voltage level and checks if it looks reasonable. If the level is too high,
|
||||||
|
the led is missing; if the level is too low, there is a short circuit.
|
||||||
|
|
||||||
|
Selftest uses always the current from the platform data.
|
||||||
|
|
||||||
|
Each channel contains led current settings.
|
||||||
|
/sys/class/leds/lp5523:channel2/led_current - RW
|
||||||
|
/sys/class/leds/lp5523:channel2/max_current - RO
|
||||||
|
Format: 10x mA i.e 10 means 1.0 mA
|
||||||
|
|
||||||
|
Example platform data:
|
||||||
|
|
||||||
|
Note - chan_nr can have values between 0 and 8.
|
||||||
|
|
||||||
|
static struct lp5523_led_config lp5523_led_config[] = {
|
||||||
|
{
|
||||||
|
.chan_nr = 0,
|
||||||
|
.led_current = 50,
|
||||||
|
.max_current = 130,
|
||||||
|
},
|
||||||
|
...
|
||||||
|
}, {
|
||||||
|
.chan_nr = 8,
|
||||||
|
.led_current = 50,
|
||||||
|
.max_current = 130,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static int lp5523_setup(void)
|
||||||
|
{
|
||||||
|
/* Setup HW resources */
|
||||||
|
}
|
||||||
|
|
||||||
|
static void lp5523_release(void)
|
||||||
|
{
|
||||||
|
/* Release HW resources */
|
||||||
|
}
|
||||||
|
|
||||||
|
static void lp5523_enable(bool state)
|
||||||
|
{
|
||||||
|
/* Control chip enable signal */
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct lp5523_platform_data lp5523_platform_data = {
|
||||||
|
.led_config = lp5523_led_config,
|
||||||
|
.num_channels = ARRAY_SIZE(lp5523_led_config),
|
||||||
|
.clock_mode = LP5523_CLOCK_EXT,
|
||||||
|
.setup_resources = lp5523_setup,
|
||||||
|
.release_resources = lp5523_release,
|
||||||
|
.enable = lp5523_enable,
|
||||||
|
};
|
@ -20,6 +20,15 @@ ip_no_pmtu_disc - BOOLEAN
|
|||||||
min_pmtu - INTEGER
|
min_pmtu - INTEGER
|
||||||
default 562 - minimum discovered Path MTU
|
default 562 - minimum discovered Path MTU
|
||||||
|
|
||||||
|
route/max_size - INTEGER
|
||||||
|
Maximum number of routes allowed in the kernel. Increase
|
||||||
|
this when using large numbers of interfaces and/or routes.
|
||||||
|
|
||||||
|
neigh/default/gc_thresh3 - INTEGER
|
||||||
|
Maximum number of neighbor entries allowed. Increase this
|
||||||
|
when using large numbers of interfaces and when communicating
|
||||||
|
with large numbers of directly-connected peers.
|
||||||
|
|
||||||
mtu_expires - INTEGER
|
mtu_expires - INTEGER
|
||||||
Time, in seconds, that cached PMTU information is kept.
|
Time, in seconds, that cached PMTU information is kept.
|
||||||
|
|
||||||
|
@ -37,6 +37,9 @@ Typical usage of the OPP library is as follows:
|
|||||||
SoC framework -> modifies on required cases certain OPPs -> OPP layer
|
SoC framework -> modifies on required cases certain OPPs -> OPP layer
|
||||||
-> queries to search/retrieve information ->
|
-> queries to search/retrieve information ->
|
||||||
|
|
||||||
|
Architectures that provide a SoC framework for OPP should select ARCH_HAS_OPP
|
||||||
|
to make the OPP layer available.
|
||||||
|
|
||||||
OPP layer expects each domain to be represented by a unique device pointer. SoC
|
OPP layer expects each domain to be represented by a unique device pointer. SoC
|
||||||
framework registers a set of initial OPPs per device with the OPP layer. This
|
framework registers a set of initial OPPs per device with the OPP layer. This
|
||||||
list is expected to be an optimally small number typically around 5 per device.
|
list is expected to be an optimally small number typically around 5 per device.
|
||||||
|
@ -21,8 +21,8 @@ three rotations, respectively, to balance the tree), with slightly slower
|
|||||||
To quote Linux Weekly News:
|
To quote Linux Weekly News:
|
||||||
|
|
||||||
There are a number of red-black trees in use in the kernel.
|
There are a number of red-black trees in use in the kernel.
|
||||||
The anticipatory, deadline, and CFQ I/O schedulers all employ
|
The deadline and CFQ I/O schedulers employ rbtrees to
|
||||||
rbtrees to track requests; the packet CD/DVD driver does the same.
|
track requests; the packet CD/DVD driver does the same.
|
||||||
The high-resolution timer code uses an rbtree to organize outstanding
|
The high-resolution timer code uses an rbtree to organize outstanding
|
||||||
timer requests. The ext3 filesystem tracks directory entries in a
|
timer requests. The ext3 filesystem tracks directory entries in a
|
||||||
red-black tree. Virtual memory areas (VMAs) are tracked with red-black
|
red-black tree. Virtual memory areas (VMAs) are tracked with red-black
|
||||||
|
@ -28,6 +28,7 @@ show up in /proc/sys/kernel:
|
|||||||
- core_uses_pid
|
- core_uses_pid
|
||||||
- ctrl-alt-del
|
- ctrl-alt-del
|
||||||
- dentry-state
|
- dentry-state
|
||||||
|
- dmesg_restrict
|
||||||
- domainname
|
- domainname
|
||||||
- hostname
|
- hostname
|
||||||
- hotplug
|
- hotplug
|
||||||
@ -213,6 +214,19 @@ to decide what to do with it.
|
|||||||
|
|
||||||
==============================================================
|
==============================================================
|
||||||
|
|
||||||
|
dmesg_restrict:
|
||||||
|
|
||||||
|
This toggle indicates whether unprivileged users are prevented from using
|
||||||
|
dmesg(8) to view messages from the kernel's log buffer. When
|
||||||
|
dmesg_restrict is set to (0) there are no restrictions. When
|
||||||
|
dmesg_restrict is set set to (1), users must have CAP_SYS_ADMIN to use
|
||||||
|
dmesg(8).
|
||||||
|
|
||||||
|
The kernel config option CONFIG_SECURITY_DMESG_RESTRICT sets the default
|
||||||
|
value of dmesg_restrict.
|
||||||
|
|
||||||
|
==============================================================
|
||||||
|
|
||||||
domainname & hostname:
|
domainname & hostname:
|
||||||
|
|
||||||
These files can be used to set the NIS/YP domainname and the
|
These files can be used to set the NIS/YP domainname and the
|
||||||
|
30
MAINTAINERS
30
MAINTAINERS
@ -161,7 +161,7 @@ M: Greg Kroah-Hartman <gregkh@suse.de>
|
|||||||
L: linux-serial@vger.kernel.org
|
L: linux-serial@vger.kernel.org
|
||||||
W: http://serial.sourceforge.net
|
W: http://serial.sourceforge.net
|
||||||
S: Maintained
|
S: Maintained
|
||||||
T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6.git
|
||||||
F: drivers/serial/8250*
|
F: drivers/serial/8250*
|
||||||
F: include/linux/serial_8250.h
|
F: include/linux/serial_8250.h
|
||||||
|
|
||||||
@ -945,7 +945,7 @@ M: Magnus Damm <magnus.damm@gmail.com>
|
|||||||
L: linux-sh@vger.kernel.org
|
L: linux-sh@vger.kernel.org
|
||||||
W: http://oss.renesas.com
|
W: http://oss.renesas.com
|
||||||
Q: http://patchwork.kernel.org/project/linux-sh/list/
|
Q: http://patchwork.kernel.org/project/linux-sh/list/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/lethal/genesis-2.6.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6.git rmobile-latest
|
||||||
S: Supported
|
S: Supported
|
||||||
F: arch/arm/mach-shmobile/
|
F: arch/arm/mach-shmobile/
|
||||||
F: drivers/sh/
|
F: drivers/sh/
|
||||||
@ -1359,7 +1359,7 @@ F: include/net/bluetooth/
|
|||||||
|
|
||||||
BONDING DRIVER
|
BONDING DRIVER
|
||||||
M: Jay Vosburgh <fubar@us.ibm.com>
|
M: Jay Vosburgh <fubar@us.ibm.com>
|
||||||
L: bonding-devel@lists.sourceforge.net
|
L: netdev@vger.kernel.org
|
||||||
W: http://sourceforge.net/projects/bonding/
|
W: http://sourceforge.net/projects/bonding/
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/net/bonding/
|
F: drivers/net/bonding/
|
||||||
@ -1829,6 +1829,13 @@ W: http://www.chelsio.com
|
|||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/net/cxgb4vf/
|
F: drivers/net/cxgb4vf/
|
||||||
|
|
||||||
|
STMMAC ETHERNET DRIVER
|
||||||
|
M: Giuseppe Cavallaro <peppe.cavallaro@st.com>
|
||||||
|
L: netdev@vger.kernel.org
|
||||||
|
W: http://www.stlinux.com
|
||||||
|
S: Supported
|
||||||
|
F: drivers/net/stmmac/
|
||||||
|
|
||||||
CYBERPRO FB DRIVER
|
CYBERPRO FB DRIVER
|
||||||
M: Russell King <linux@arm.linux.org.uk>
|
M: Russell King <linux@arm.linux.org.uk>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
@ -2008,6 +2015,7 @@ F: drivers/hwmon/dme1737.c
|
|||||||
DOCBOOK FOR DOCUMENTATION
|
DOCBOOK FOR DOCUMENTATION
|
||||||
M: Randy Dunlap <rdunlap@xenotime.net>
|
M: Randy Dunlap <rdunlap@xenotime.net>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
F: scripts/kernel-doc
|
||||||
|
|
||||||
DOCKING STATION DRIVER
|
DOCKING STATION DRIVER
|
||||||
M: Shaohua Li <shaohua.li@intel.com>
|
M: Shaohua Li <shaohua.li@intel.com>
|
||||||
@ -2018,6 +2026,7 @@ F: drivers/acpi/dock.c
|
|||||||
DOCUMENTATION
|
DOCUMENTATION
|
||||||
M: Randy Dunlap <rdunlap@xenotime.net>
|
M: Randy Dunlap <rdunlap@xenotime.net>
|
||||||
L: linux-doc@vger.kernel.org
|
L: linux-doc@vger.kernel.org
|
||||||
|
T: quilt oss.oracle.com/~rdunlap/kernel-doc-patches/current/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/
|
F: Documentation/
|
||||||
|
|
||||||
@ -2435,6 +2444,7 @@ F: drivers/net/wan/sdla.c
|
|||||||
FRAMEBUFFER LAYER
|
FRAMEBUFFER LAYER
|
||||||
L: linux-fbdev@vger.kernel.org
|
L: linux-fbdev@vger.kernel.org
|
||||||
W: http://linux-fbdev.sourceforge.net/
|
W: http://linux-fbdev.sourceforge.net/
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/lethal/fbdev-2.6.git
|
||||||
S: Orphan
|
S: Orphan
|
||||||
F: Documentation/fb/
|
F: Documentation/fb/
|
||||||
F: drivers/video/fb*
|
F: drivers/video/fb*
|
||||||
@ -5676,7 +5686,7 @@ S: Maintained
|
|||||||
|
|
||||||
STAGING SUBSYSTEM
|
STAGING SUBSYSTEM
|
||||||
M: Greg Kroah-Hartman <gregkh@suse.de>
|
M: Greg Kroah-Hartman <gregkh@suse.de>
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging-next-2.6.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging-2.6.git
|
||||||
L: devel@driverdev.osuosl.org
|
L: devel@driverdev.osuosl.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/staging/
|
F: drivers/staging/
|
||||||
@ -5705,7 +5715,7 @@ M: Paul Mundt <lethal@linux-sh.org>
|
|||||||
L: linux-sh@vger.kernel.org
|
L: linux-sh@vger.kernel.org
|
||||||
W: http://www.linux-sh.org
|
W: http://www.linux-sh.org
|
||||||
Q: http://patchwork.kernel.org/project/linux-sh/list/
|
Q: http://patchwork.kernel.org/project/linux-sh/list/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6.git sh-latest
|
||||||
S: Supported
|
S: Supported
|
||||||
F: Documentation/sh/
|
F: Documentation/sh/
|
||||||
F: arch/sh/
|
F: arch/sh/
|
||||||
@ -5910,7 +5920,7 @@ S: Maintained
|
|||||||
TTY LAYER
|
TTY LAYER
|
||||||
M: Greg Kroah-Hartman <gregkh@suse.de>
|
M: Greg Kroah-Hartman <gregkh@suse.de>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6.git
|
||||||
F: drivers/char/tty_*
|
F: drivers/char/tty_*
|
||||||
F: drivers/serial/serial_core.c
|
F: drivers/serial/serial_core.c
|
||||||
F: include/linux/serial_core.h
|
F: include/linux/serial_core.h
|
||||||
@ -6233,7 +6243,7 @@ USB SUBSYSTEM
|
|||||||
M: Greg Kroah-Hartman <gregkh@suse.de>
|
M: Greg Kroah-Hartman <gregkh@suse.de>
|
||||||
L: linux-usb@vger.kernel.org
|
L: linux-usb@vger.kernel.org
|
||||||
W: http://www.linux-usb.org
|
W: http://www.linux-usb.org
|
||||||
T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6.git
|
||||||
S: Supported
|
S: Supported
|
||||||
F: Documentation/usb/
|
F: Documentation/usb/
|
||||||
F: drivers/net/usb/
|
F: drivers/net/usb/
|
||||||
@ -6598,14 +6608,14 @@ F: drivers/platform/x86
|
|||||||
|
|
||||||
XEN PCI SUBSYSTEM
|
XEN PCI SUBSYSTEM
|
||||||
M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||||||
L: xen-devel@lists.xensource.com
|
L: xen-devel@lists.xensource.com (moderated for non-subscribers)
|
||||||
S: Supported
|
S: Supported
|
||||||
F: arch/x86/pci/*xen*
|
F: arch/x86/pci/*xen*
|
||||||
F: drivers/pci/*xen*
|
F: drivers/pci/*xen*
|
||||||
|
|
||||||
XEN SWIOTLB SUBSYSTEM
|
XEN SWIOTLB SUBSYSTEM
|
||||||
M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||||||
L: xen-devel@lists.xensource.com
|
L: xen-devel@lists.xensource.com (moderated for non-subscribers)
|
||||||
S: Supported
|
S: Supported
|
||||||
F: arch/x86/xen/*swiotlb*
|
F: arch/x86/xen/*swiotlb*
|
||||||
F: drivers/xen/*swiotlb*
|
F: drivers/xen/*swiotlb*
|
||||||
@ -6613,7 +6623,7 @@ F: drivers/xen/*swiotlb*
|
|||||||
XEN HYPERVISOR INTERFACE
|
XEN HYPERVISOR INTERFACE
|
||||||
M: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
|
M: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
|
||||||
M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||||||
L: xen-devel@lists.xen.org
|
L: xen-devel@lists.xensource.com (moderated for non-subscribers)
|
||||||
L: virtualization@lists.osdl.org
|
L: virtualization@lists.osdl.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: arch/x86/xen/
|
F: arch/x86/xen/
|
||||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
|||||||
VERSION = 2
|
VERSION = 2
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 37
|
SUBLEVEL = 37
|
||||||
EXTRAVERSION = -rc1
|
EXTRAVERSION = -rc3
|
||||||
NAME = Flesh-Eating Bats with Fangs
|
NAME = Flesh-Eating Bats with Fangs
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@ -6,7 +6,7 @@ config ARM
|
|||||||
select HAVE_MEMBLOCK
|
select HAVE_MEMBLOCK
|
||||||
select RTC_LIB
|
select RTC_LIB
|
||||||
select SYS_SUPPORTS_APM_EMULATION
|
select SYS_SUPPORTS_APM_EMULATION
|
||||||
select GENERIC_ATOMIC64 if (!CPU_32v6K)
|
select GENERIC_ATOMIC64 if (!CPU_32v6K || !AEABI)
|
||||||
select HAVE_OPROFILE if (HAVE_PERF_EVENTS)
|
select HAVE_OPROFILE if (HAVE_PERF_EVENTS)
|
||||||
select HAVE_ARCH_KGDB
|
select HAVE_ARCH_KGDB
|
||||||
select HAVE_KPROBES if (!XIP_KERNEL)
|
select HAVE_KPROBES if (!XIP_KERNEL)
|
||||||
@ -646,7 +646,7 @@ config ARCH_S3C2410
|
|||||||
select ARCH_HAS_CPUFREQ
|
select ARCH_HAS_CPUFREQ
|
||||||
select HAVE_CLK
|
select HAVE_CLK
|
||||||
select ARCH_USES_GETTIMEOFFSET
|
select ARCH_USES_GETTIMEOFFSET
|
||||||
select HAVE_S3C2410_I2C
|
select HAVE_S3C2410_I2C if I2C
|
||||||
help
|
help
|
||||||
Samsung S3C2410X CPU based systems, such as the Simtec Electronics
|
Samsung S3C2410X CPU based systems, such as the Simtec Electronics
|
||||||
BAST (<http://www.simtec.co.uk/products/EB110ITX/>), the IPAQ 1940 or
|
BAST (<http://www.simtec.co.uk/products/EB110ITX/>), the IPAQ 1940 or
|
||||||
@ -676,8 +676,8 @@ config ARCH_S3C64XX
|
|||||||
select S3C_DEV_NAND
|
select S3C_DEV_NAND
|
||||||
select USB_ARCH_HAS_OHCI
|
select USB_ARCH_HAS_OHCI
|
||||||
select SAMSUNG_GPIOLIB_4BIT
|
select SAMSUNG_GPIOLIB_4BIT
|
||||||
select HAVE_S3C2410_I2C
|
select HAVE_S3C2410_I2C if I2C
|
||||||
select HAVE_S3C2410_WATCHDOG
|
select HAVE_S3C2410_WATCHDOG if WATCHDOG
|
||||||
help
|
help
|
||||||
Samsung S3C64XX series based systems
|
Samsung S3C64XX series based systems
|
||||||
|
|
||||||
@ -686,10 +686,10 @@ config ARCH_S5P64X0
|
|||||||
select CPU_V6
|
select CPU_V6
|
||||||
select GENERIC_GPIO
|
select GENERIC_GPIO
|
||||||
select HAVE_CLK
|
select HAVE_CLK
|
||||||
select HAVE_S3C2410_WATCHDOG
|
select HAVE_S3C2410_WATCHDOG if WATCHDOG
|
||||||
select ARCH_USES_GETTIMEOFFSET
|
select ARCH_USES_GETTIMEOFFSET
|
||||||
select HAVE_S3C2410_I2C
|
select HAVE_S3C2410_I2C if I2C
|
||||||
select HAVE_S3C_RTC
|
select HAVE_S3C_RTC if RTC_CLASS
|
||||||
help
|
help
|
||||||
Samsung S5P64X0 CPU based systems, such as the Samsung SMDK6440,
|
Samsung S5P64X0 CPU based systems, such as the Samsung SMDK6440,
|
||||||
SMDK6450.
|
SMDK6450.
|
||||||
@ -700,7 +700,7 @@ config ARCH_S5P6442
|
|||||||
select GENERIC_GPIO
|
select GENERIC_GPIO
|
||||||
select HAVE_CLK
|
select HAVE_CLK
|
||||||
select ARCH_USES_GETTIMEOFFSET
|
select ARCH_USES_GETTIMEOFFSET
|
||||||
select HAVE_S3C2410_WATCHDOG
|
select HAVE_S3C2410_WATCHDOG if WATCHDOG
|
||||||
help
|
help
|
||||||
Samsung S5P6442 CPU based systems
|
Samsung S5P6442 CPU based systems
|
||||||
|
|
||||||
@ -711,9 +711,9 @@ config ARCH_S5PC100
|
|||||||
select CPU_V7
|
select CPU_V7
|
||||||
select ARM_L1_CACHE_SHIFT_6
|
select ARM_L1_CACHE_SHIFT_6
|
||||||
select ARCH_USES_GETTIMEOFFSET
|
select ARCH_USES_GETTIMEOFFSET
|
||||||
select HAVE_S3C2410_I2C
|
select HAVE_S3C2410_I2C if I2C
|
||||||
select HAVE_S3C_RTC
|
select HAVE_S3C_RTC if RTC_CLASS
|
||||||
select HAVE_S3C2410_WATCHDOG
|
select HAVE_S3C2410_WATCHDOG if WATCHDOG
|
||||||
help
|
help
|
||||||
Samsung S5PC100 series based systems
|
Samsung S5PC100 series based systems
|
||||||
|
|
||||||
@ -726,9 +726,9 @@ config ARCH_S5PV210
|
|||||||
select ARM_L1_CACHE_SHIFT_6
|
select ARM_L1_CACHE_SHIFT_6
|
||||||
select ARCH_HAS_CPUFREQ
|
select ARCH_HAS_CPUFREQ
|
||||||
select ARCH_USES_GETTIMEOFFSET
|
select ARCH_USES_GETTIMEOFFSET
|
||||||
select HAVE_S3C2410_I2C
|
select HAVE_S3C2410_I2C if I2C
|
||||||
select HAVE_S3C_RTC
|
select HAVE_S3C_RTC if RTC_CLASS
|
||||||
select HAVE_S3C2410_WATCHDOG
|
select HAVE_S3C2410_WATCHDOG if WATCHDOG
|
||||||
help
|
help
|
||||||
Samsung S5PV210/S5PC110 series based systems
|
Samsung S5PV210/S5PC110 series based systems
|
||||||
|
|
||||||
@ -739,9 +739,9 @@ config ARCH_S5PV310
|
|||||||
select GENERIC_GPIO
|
select GENERIC_GPIO
|
||||||
select HAVE_CLK
|
select HAVE_CLK
|
||||||
select GENERIC_CLOCKEVENTS
|
select GENERIC_CLOCKEVENTS
|
||||||
select HAVE_S3C_RTC
|
select HAVE_S3C_RTC if RTC_CLASS
|
||||||
select HAVE_S3C2410_I2C
|
select HAVE_S3C2410_I2C if I2C
|
||||||
select HAVE_S3C2410_WATCHDOG
|
select HAVE_S3C2410_WATCHDOG if WATCHDOG
|
||||||
help
|
help
|
||||||
Samsung S5PV310 series based systems
|
Samsung S5PV310 series based systems
|
||||||
|
|
||||||
|
@ -251,15 +251,16 @@ void __init gic_dist_init(unsigned int gic_nr, void __iomem *base,
|
|||||||
writel(cpumask, base + GIC_DIST_TARGET + i * 4 / 4);
|
writel(cpumask, base + GIC_DIST_TARGET + i * 4 / 4);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set priority on all interrupts.
|
* Set priority on all global interrupts.
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < max_irq; i += 4)
|
for (i = 32; i < max_irq; i += 4)
|
||||||
writel(0xa0a0a0a0, base + GIC_DIST_PRI + i * 4 / 4);
|
writel(0xa0a0a0a0, base + GIC_DIST_PRI + i * 4 / 4);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Disable all interrupts.
|
* Disable all interrupts. Leave the PPI and SGIs alone
|
||||||
|
* as these enables are banked registers.
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < max_irq; i += 32)
|
for (i = 32; i < max_irq; i += 32)
|
||||||
writel(0xffffffff, base + GIC_DIST_ENABLE_CLEAR + i * 4 / 32);
|
writel(0xffffffff, base + GIC_DIST_ENABLE_CLEAR + i * 4 / 32);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -277,11 +278,30 @@ void __init gic_dist_init(unsigned int gic_nr, void __iomem *base,
|
|||||||
|
|
||||||
void __cpuinit gic_cpu_init(unsigned int gic_nr, void __iomem *base)
|
void __cpuinit gic_cpu_init(unsigned int gic_nr, void __iomem *base)
|
||||||
{
|
{
|
||||||
|
void __iomem *dist_base;
|
||||||
|
int i;
|
||||||
|
|
||||||
if (gic_nr >= MAX_GIC_NR)
|
if (gic_nr >= MAX_GIC_NR)
|
||||||
BUG();
|
BUG();
|
||||||
|
|
||||||
|
dist_base = gic_data[gic_nr].dist_base;
|
||||||
|
BUG_ON(!dist_base);
|
||||||
|
|
||||||
gic_data[gic_nr].cpu_base = base;
|
gic_data[gic_nr].cpu_base = base;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Deal with the banked PPI and SGI interrupts - disable all
|
||||||
|
* PPI interrupts, ensure all SGI interrupts are enabled.
|
||||||
|
*/
|
||||||
|
writel(0xffff0000, dist_base + GIC_DIST_ENABLE_CLEAR);
|
||||||
|
writel(0x0000ffff, dist_base + GIC_DIST_ENABLE_SET);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set priority on PPI and SGI interrupts
|
||||||
|
*/
|
||||||
|
for (i = 0; i < 32; i += 4)
|
||||||
|
writel(0xa0a0a0a0, dist_base + GIC_DIST_PRI + i * 4 / 4);
|
||||||
|
|
||||||
writel(0xf0, base + GIC_CPU_PRIMASK);
|
writel(0xf0, base + GIC_CPU_PRIMASK);
|
||||||
writel(1, base + GIC_CPU_CTRL);
|
writel(1, base + GIC_CPU_CTRL);
|
||||||
}
|
}
|
||||||
|
@ -75,7 +75,7 @@ extern unsigned long it8152_base_address;
|
|||||||
IT8152_PD_IRQ(1) USB (USBR)
|
IT8152_PD_IRQ(1) USB (USBR)
|
||||||
IT8152_PD_IRQ(0) Audio controller (ACR)
|
IT8152_PD_IRQ(0) Audio controller (ACR)
|
||||||
*/
|
*/
|
||||||
#define IT8152_IRQ(x) (IRQ_BOARD_END + (x))
|
#define IT8152_IRQ(x) (IRQ_BOARD_START + (x))
|
||||||
|
|
||||||
/* IRQ-sources in 3 groups - local devices, LPC (serial), and external PCI */
|
/* IRQ-sources in 3 groups - local devices, LPC (serial), and external PCI */
|
||||||
#define IT8152_LD_IRQ_COUNT 9
|
#define IT8152_LD_IRQ_COUNT 9
|
||||||
|
@ -748,8 +748,7 @@ static int hw_breakpoint_pending(unsigned long addr, unsigned int fsr,
|
|||||||
breakpoint_handler(addr, regs);
|
breakpoint_handler(addr, regs);
|
||||||
break;
|
break;
|
||||||
case ARM_ENTRY_ASYNC_WATCHPOINT:
|
case ARM_ENTRY_ASYNC_WATCHPOINT:
|
||||||
WARN_ON("Asynchronous watchpoint exception taken. "
|
WARN(1, "Asynchronous watchpoint exception taken. Debugging results may be unreliable\n");
|
||||||
"Debugging results may be unreliable");
|
|
||||||
case ARM_ENTRY_SYNC_WATCHPOINT:
|
case ARM_ENTRY_SYNC_WATCHPOINT:
|
||||||
watchpoint_handler(addr, regs);
|
watchpoint_handler(addr, regs);
|
||||||
break;
|
break;
|
||||||
|
@ -1749,7 +1749,7 @@ static inline int armv7_pmnc_has_overflowed(unsigned long pmnc)
|
|||||||
static inline int armv7_pmnc_counter_has_overflowed(unsigned long pmnc,
|
static inline int armv7_pmnc_counter_has_overflowed(unsigned long pmnc,
|
||||||
enum armv7_counters counter)
|
enum armv7_counters counter)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret = 0;
|
||||||
|
|
||||||
if (counter == ARMV7_CYCLE_COUNTER)
|
if (counter == ARMV7_CYCLE_COUNTER)
|
||||||
ret = pmnc & ARMV7_FLAG_C;
|
ret = pmnc & ARMV7_FLAG_C;
|
||||||
|
@ -28,7 +28,7 @@ int notrace unwind_frame(struct stackframe *frame)
|
|||||||
|
|
||||||
/* only go to a higher address on the stack */
|
/* only go to a higher address on the stack */
|
||||||
low = frame->sp;
|
low = frame->sp;
|
||||||
high = ALIGN(low, THREAD_SIZE) + THREAD_SIZE;
|
high = ALIGN(low, THREAD_SIZE);
|
||||||
|
|
||||||
/* check current frame pointer is within bounds */
|
/* check current frame pointer is within bounds */
|
||||||
if (fp < (low + 12) || fp + 4 >= high)
|
if (fp < (low + 12) || fp + 4 >= high)
|
||||||
|
@ -53,10 +53,7 @@ static void dump_mem(const char *, const char *, unsigned long, unsigned long);
|
|||||||
void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long frame)
|
void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long frame)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_KALLSYMS
|
#ifdef CONFIG_KALLSYMS
|
||||||
char sym1[KSYM_SYMBOL_LEN], sym2[KSYM_SYMBOL_LEN];
|
printk("[<%08lx>] (%pS) from [<%08lx>] (%pS)\n", where, (void *)where, from, (void *)from);
|
||||||
sprint_symbol(sym1, where);
|
|
||||||
sprint_symbol(sym2, from);
|
|
||||||
printk("[<%08lx>] (%s) from [<%08lx>] (%s)\n", where, sym1, from, sym2);
|
|
||||||
#else
|
#else
|
||||||
printk("Function entered at [<%08lx>] from [<%08lx>]\n", where, from);
|
printk("Function entered at [<%08lx>] from [<%08lx>]\n", where, from);
|
||||||
#endif
|
#endif
|
||||||
|
@ -279,7 +279,7 @@ int unwind_frame(struct stackframe *frame)
|
|||||||
|
|
||||||
/* only go to a higher address on the stack */
|
/* only go to a higher address on the stack */
|
||||||
low = frame->sp;
|
low = frame->sp;
|
||||||
high = ALIGN(low, THREAD_SIZE) + THREAD_SIZE;
|
high = ALIGN(low, THREAD_SIZE);
|
||||||
|
|
||||||
pr_debug("%s(pc = %08lx lr = %08lx sp = %08lx)\n", __func__,
|
pr_debug("%s(pc = %08lx lr = %08lx sp = %08lx)\n", __func__,
|
||||||
frame->pc, frame->lr, frame->sp);
|
frame->pc, frame->lr, frame->sp);
|
||||||
|
@ -359,8 +359,8 @@ static struct clk_lookup dm355_clks[] = {
|
|||||||
CLK(NULL, "uart1", &uart1_clk),
|
CLK(NULL, "uart1", &uart1_clk),
|
||||||
CLK(NULL, "uart2", &uart2_clk),
|
CLK(NULL, "uart2", &uart2_clk),
|
||||||
CLK("i2c_davinci.1", NULL, &i2c_clk),
|
CLK("i2c_davinci.1", NULL, &i2c_clk),
|
||||||
CLK("davinci-asp.0", NULL, &asp0_clk),
|
CLK("davinci-mcbsp.0", NULL, &asp0_clk),
|
||||||
CLK("davinci-asp.1", NULL, &asp1_clk),
|
CLK("davinci-mcbsp.1", NULL, &asp1_clk),
|
||||||
CLK("davinci_mmc.0", NULL, &mmcsd0_clk),
|
CLK("davinci_mmc.0", NULL, &mmcsd0_clk),
|
||||||
CLK("davinci_mmc.1", NULL, &mmcsd1_clk),
|
CLK("davinci_mmc.1", NULL, &mmcsd1_clk),
|
||||||
CLK("spi_davinci.0", NULL, &spi0_clk),
|
CLK("spi_davinci.0", NULL, &spi0_clk),
|
||||||
@ -664,7 +664,7 @@ static struct resource dm355_asp1_resources[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device dm355_asp1_device = {
|
static struct platform_device dm355_asp1_device = {
|
||||||
.name = "davinci-asp",
|
.name = "davinci-mcbsp",
|
||||||
.id = 1,
|
.id = 1,
|
||||||
.num_resources = ARRAY_SIZE(dm355_asp1_resources),
|
.num_resources = ARRAY_SIZE(dm355_asp1_resources),
|
||||||
.resource = dm355_asp1_resources,
|
.resource = dm355_asp1_resources,
|
||||||
|
@ -459,7 +459,7 @@ static struct clk_lookup dm365_clks[] = {
|
|||||||
CLK(NULL, "usb", &usb_clk),
|
CLK(NULL, "usb", &usb_clk),
|
||||||
CLK("davinci_emac.1", NULL, &emac_clk),
|
CLK("davinci_emac.1", NULL, &emac_clk),
|
||||||
CLK("davinci_voicecodec", NULL, &voicecodec_clk),
|
CLK("davinci_voicecodec", NULL, &voicecodec_clk),
|
||||||
CLK("davinci-asp.0", NULL, &asp0_clk),
|
CLK("davinci-mcbsp", NULL, &asp0_clk),
|
||||||
CLK(NULL, "rto", &rto_clk),
|
CLK(NULL, "rto", &rto_clk),
|
||||||
CLK(NULL, "mjcp", &mjcp_clk),
|
CLK(NULL, "mjcp", &mjcp_clk),
|
||||||
CLK(NULL, NULL, NULL),
|
CLK(NULL, NULL, NULL),
|
||||||
@ -922,8 +922,8 @@ static struct resource dm365_asp_resources[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device dm365_asp_device = {
|
static struct platform_device dm365_asp_device = {
|
||||||
.name = "davinci-asp",
|
.name = "davinci-mcbsp",
|
||||||
.id = 0,
|
.id = -1,
|
||||||
.num_resources = ARRAY_SIZE(dm365_asp_resources),
|
.num_resources = ARRAY_SIZE(dm365_asp_resources),
|
||||||
.resource = dm365_asp_resources,
|
.resource = dm365_asp_resources,
|
||||||
};
|
};
|
||||||
|
@ -302,7 +302,7 @@ static struct clk_lookup dm644x_clks[] = {
|
|||||||
CLK("davinci_emac.1", NULL, &emac_clk),
|
CLK("davinci_emac.1", NULL, &emac_clk),
|
||||||
CLK("i2c_davinci.1", NULL, &i2c_clk),
|
CLK("i2c_davinci.1", NULL, &i2c_clk),
|
||||||
CLK("palm_bk3710", NULL, &ide_clk),
|
CLK("palm_bk3710", NULL, &ide_clk),
|
||||||
CLK("davinci-asp", NULL, &asp_clk),
|
CLK("davinci-mcbsp", NULL, &asp_clk),
|
||||||
CLK("davinci_mmc.0", NULL, &mmcsd_clk),
|
CLK("davinci_mmc.0", NULL, &mmcsd_clk),
|
||||||
CLK(NULL, "spi", &spi_clk),
|
CLK(NULL, "spi", &spi_clk),
|
||||||
CLK(NULL, "gpio", &gpio_clk),
|
CLK(NULL, "gpio", &gpio_clk),
|
||||||
@ -580,7 +580,7 @@ static struct resource dm644x_asp_resources[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device dm644x_asp_device = {
|
static struct platform_device dm644x_asp_device = {
|
||||||
.name = "davinci-asp",
|
.name = "davinci-mcbsp",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
.num_resources = ARRAY_SIZE(dm644x_asp_resources),
|
.num_resources = ARRAY_SIZE(dm644x_asp_resources),
|
||||||
.resource = dm644x_asp_resources,
|
.resource = dm644x_asp_resources,
|
||||||
|
@ -1,5 +1,13 @@
|
|||||||
/*
|
/**
|
||||||
* arch/arm/mach-ep93xx/include/mach/dma.h
|
* DOC: EP93xx DMA M2P memory to peripheral and peripheral to memory engine
|
||||||
|
*
|
||||||
|
* The EP93xx DMA M2P subsystem handles DMA transfers between memory and
|
||||||
|
* peripherals. DMA M2P channels are available for audio, UARTs and IrDA.
|
||||||
|
* See chapter 10 of the EP93xx users guide for full details on the DMA M2P
|
||||||
|
* engine.
|
||||||
|
*
|
||||||
|
* See sound/soc/ep93xx/ep93xx-pcm.c for an example use of the DMA M2P code.
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __ASM_ARCH_DMA_H
|
#ifndef __ASM_ARCH_DMA_H
|
||||||
@ -8,12 +16,34 @@
|
|||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct ep93xx_dma_buffer - Information about a buffer to be transferred
|
||||||
|
* using the DMA M2P engine
|
||||||
|
*
|
||||||
|
* @list: Entry in DMA buffer list
|
||||||
|
* @bus_addr: Physical address of the buffer
|
||||||
|
* @size: Size of the buffer in bytes
|
||||||
|
*/
|
||||||
struct ep93xx_dma_buffer {
|
struct ep93xx_dma_buffer {
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
u32 bus_addr;
|
u32 bus_addr;
|
||||||
u16 size;
|
u16 size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct ep93xx_dma_m2p_client - Information about a DMA M2P client
|
||||||
|
*
|
||||||
|
* @name: Unique name for this client
|
||||||
|
* @flags: Client flags
|
||||||
|
* @cookie: User data to pass to callback functions
|
||||||
|
* @buffer_started: Non NULL function to call when a transfer is started.
|
||||||
|
* The arguments are the user data cookie and the DMA
|
||||||
|
* buffer which is starting.
|
||||||
|
* @buffer_finished: Non NULL function to call when a transfer is completed.
|
||||||
|
* The arguments are the user data cookie, the DMA buffer
|
||||||
|
* which has completed, and a boolean flag indicating if
|
||||||
|
* the transfer had an error.
|
||||||
|
*/
|
||||||
struct ep93xx_dma_m2p_client {
|
struct ep93xx_dma_m2p_client {
|
||||||
char *name;
|
char *name;
|
||||||
u8 flags;
|
u8 flags;
|
||||||
@ -24,10 +54,11 @@ struct ep93xx_dma_m2p_client {
|
|||||||
struct ep93xx_dma_buffer *buf,
|
struct ep93xx_dma_buffer *buf,
|
||||||
int bytes, int error);
|
int bytes, int error);
|
||||||
|
|
||||||
/* Internal to the DMA code. */
|
/* private: Internal use only */
|
||||||
void *channel;
|
void *channel;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* DMA M2P ports */
|
||||||
#define EP93XX_DMA_M2P_PORT_I2S1 0x00
|
#define EP93XX_DMA_M2P_PORT_I2S1 0x00
|
||||||
#define EP93XX_DMA_M2P_PORT_I2S2 0x01
|
#define EP93XX_DMA_M2P_PORT_I2S2 0x01
|
||||||
#define EP93XX_DMA_M2P_PORT_AAC1 0x02
|
#define EP93XX_DMA_M2P_PORT_AAC1 0x02
|
||||||
@ -39,18 +70,80 @@ struct ep93xx_dma_m2p_client {
|
|||||||
#define EP93XX_DMA_M2P_PORT_UART3 0x08
|
#define EP93XX_DMA_M2P_PORT_UART3 0x08
|
||||||
#define EP93XX_DMA_M2P_PORT_IRDA 0x09
|
#define EP93XX_DMA_M2P_PORT_IRDA 0x09
|
||||||
#define EP93XX_DMA_M2P_PORT_MASK 0x0f
|
#define EP93XX_DMA_M2P_PORT_MASK 0x0f
|
||||||
#define EP93XX_DMA_M2P_TX 0x00
|
|
||||||
#define EP93XX_DMA_M2P_RX 0x10
|
|
||||||
#define EP93XX_DMA_M2P_ABORT_ON_ERROR 0x20
|
|
||||||
#define EP93XX_DMA_M2P_IGNORE_ERROR 0x40
|
|
||||||
#define EP93XX_DMA_M2P_ERROR_MASK 0x60
|
|
||||||
|
|
||||||
int ep93xx_dma_m2p_client_register(struct ep93xx_dma_m2p_client *m2p);
|
/* DMA M2P client flags */
|
||||||
|
#define EP93XX_DMA_M2P_TX 0x00 /* Memory to peripheral */
|
||||||
|
#define EP93XX_DMA_M2P_RX 0x10 /* Peripheral to memory */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* DMA M2P client error handling flags. See the EP93xx users guide
|
||||||
|
* documentation on the DMA M2P CONTROL register for more details
|
||||||
|
*/
|
||||||
|
#define EP93XX_DMA_M2P_ABORT_ON_ERROR 0x20 /* Abort on peripheral error */
|
||||||
|
#define EP93XX_DMA_M2P_IGNORE_ERROR 0x40 /* Ignore peripheral errors */
|
||||||
|
#define EP93XX_DMA_M2P_ERROR_MASK 0x60 /* Mask of error bits */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ep93xx_dma_m2p_client_register - Register a client with the DMA M2P
|
||||||
|
* subsystem
|
||||||
|
*
|
||||||
|
* @m2p: Client information to register
|
||||||
|
* returns 0 on success
|
||||||
|
*
|
||||||
|
* The DMA M2P subsystem allocates a channel and an interrupt line for the DMA
|
||||||
|
* client
|
||||||
|
*/
|
||||||
|
int ep93xx_dma_m2p_client_register(struct ep93xx_dma_m2p_client *m2p);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ep93xx_dma_m2p_client_unregister - Unregister a client from the DMA M2P
|
||||||
|
* subsystem
|
||||||
|
*
|
||||||
|
* @m2p: Client to unregister
|
||||||
|
*
|
||||||
|
* Any transfers currently in progress will be completed in hardware, but
|
||||||
|
* ignored in software.
|
||||||
|
*/
|
||||||
void ep93xx_dma_m2p_client_unregister(struct ep93xx_dma_m2p_client *m2p);
|
void ep93xx_dma_m2p_client_unregister(struct ep93xx_dma_m2p_client *m2p);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ep93xx_dma_m2p_submit - Submit a DMA M2P transfer
|
||||||
|
*
|
||||||
|
* @m2p: DMA Client to submit the transfer on
|
||||||
|
* @buf: DMA Buffer to submit
|
||||||
|
*
|
||||||
|
* If the current or next transfer positions are free on the M2P client then
|
||||||
|
* the transfer is started immediately. If not, the transfer is added to the
|
||||||
|
* list of pending transfers. This function must not be called from the
|
||||||
|
* buffer_finished callback for an M2P channel.
|
||||||
|
*
|
||||||
|
*/
|
||||||
void ep93xx_dma_m2p_submit(struct ep93xx_dma_m2p_client *m2p,
|
void ep93xx_dma_m2p_submit(struct ep93xx_dma_m2p_client *m2p,
|
||||||
struct ep93xx_dma_buffer *buf);
|
struct ep93xx_dma_buffer *buf);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ep93xx_dma_m2p_submit_recursive - Put a DMA transfer on the pending list
|
||||||
|
* for an M2P channel
|
||||||
|
*
|
||||||
|
* @m2p: DMA Client to submit the transfer on
|
||||||
|
* @buf: DMA Buffer to submit
|
||||||
|
*
|
||||||
|
* This function must only be called from the buffer_finished callback for an
|
||||||
|
* M2P channel. It is commonly used to add the next transfer in a chained list
|
||||||
|
* of DMA transfers.
|
||||||
|
*/
|
||||||
void ep93xx_dma_m2p_submit_recursive(struct ep93xx_dma_m2p_client *m2p,
|
void ep93xx_dma_m2p_submit_recursive(struct ep93xx_dma_m2p_client *m2p,
|
||||||
struct ep93xx_dma_buffer *buf);
|
struct ep93xx_dma_buffer *buf);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ep93xx_dma_m2p_flush - Flush all pending transfers on a DMA M2P client
|
||||||
|
*
|
||||||
|
* @m2p: DMA client to flush transfers on
|
||||||
|
*
|
||||||
|
* Any transfers currently in progress will be completed in hardware, but
|
||||||
|
* ignored in software.
|
||||||
|
*
|
||||||
|
*/
|
||||||
void ep93xx_dma_m2p_flush(struct ep93xx_dma_m2p_client *m2p);
|
void ep93xx_dma_m2p_flush(struct ep93xx_dma_m2p_client *m2p);
|
||||||
|
|
||||||
#endif /* __ASM_ARCH_DMA_H */
|
#endif /* __ASM_ARCH_DMA_H */
|
||||||
|
@ -854,10 +854,9 @@ int __init kirkwood_find_tclk(void)
|
|||||||
|
|
||||||
kirkwood_pcie_id(&dev, &rev);
|
kirkwood_pcie_id(&dev, &rev);
|
||||||
|
|
||||||
if ((dev == MV88F6281_DEV_ID && (rev == MV88F6281_REV_A0 ||
|
if (dev == MV88F6281_DEV_ID || dev == MV88F6282_DEV_ID)
|
||||||
rev == MV88F6281_REV_A1)) ||
|
if (((readl(SAMPLE_AT_RESET) >> 21) & 1) == 0)
|
||||||
(dev == MV88F6282_DEV_ID))
|
return 200000000;
|
||||||
return 200000000;
|
|
||||||
|
|
||||||
return 166666667;
|
return 166666667;
|
||||||
}
|
}
|
||||||
|
@ -225,5 +225,5 @@ MACHINE_START(D2NET_V2, "LaCie d2 Network v2")
|
|||||||
.init_machine = d2net_v2_init,
|
.init_machine = d2net_v2_init,
|
||||||
.map_io = kirkwood_map_io,
|
.map_io = kirkwood_map_io,
|
||||||
.init_irq = kirkwood_init_irq,
|
.init_irq = kirkwood_init_irq,
|
||||||
.timer = &lacie_v2_timer,
|
.timer = &kirkwood_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
@ -111,17 +111,3 @@ void __init lacie_v2_hdd_power_init(int hdd_num)
|
|||||||
pr_err("Failed to power up HDD%d\n", i + 1);
|
pr_err("Failed to power up HDD%d\n", i + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
* Timer
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
static void lacie_v2_timer_init(void)
|
|
||||||
{
|
|
||||||
kirkwood_tclk = 166666667;
|
|
||||||
orion_time_init(IRQ_KIRKWOOD_BRIDGE, kirkwood_tclk);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct sys_timer lacie_v2_timer = {
|
|
||||||
.init = lacie_v2_timer_init,
|
|
||||||
};
|
|
||||||
|
@ -13,6 +13,4 @@ void lacie_v2_register_flash(void);
|
|||||||
void lacie_v2_register_i2c_devices(void);
|
void lacie_v2_register_i2c_devices(void);
|
||||||
void lacie_v2_hdd_power_init(int hdd_num);
|
void lacie_v2_hdd_power_init(int hdd_num);
|
||||||
|
|
||||||
extern struct sys_timer lacie_v2_timer;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -59,7 +59,7 @@ void __init kirkwood_mpp_conf(unsigned int *mpp_list)
|
|||||||
}
|
}
|
||||||
printk("\n");
|
printk("\n");
|
||||||
|
|
||||||
while (*mpp_list) {
|
for ( ; *mpp_list; mpp_list++) {
|
||||||
unsigned int num = MPP_NUM(*mpp_list);
|
unsigned int num = MPP_NUM(*mpp_list);
|
||||||
unsigned int sel = MPP_SEL(*mpp_list);
|
unsigned int sel = MPP_SEL(*mpp_list);
|
||||||
int shift, gpio_mode;
|
int shift, gpio_mode;
|
||||||
@ -88,8 +88,6 @@ void __init kirkwood_mpp_conf(unsigned int *mpp_list)
|
|||||||
if (sel != 0)
|
if (sel != 0)
|
||||||
gpio_mode = 0;
|
gpio_mode = 0;
|
||||||
orion_gpio_set_valid(num, gpio_mode);
|
orion_gpio_set_valid(num, gpio_mode);
|
||||||
|
|
||||||
mpp_list++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
printk(KERN_DEBUG " final MPP regs:");
|
printk(KERN_DEBUG " final MPP regs:");
|
||||||
|
@ -262,7 +262,7 @@ MACHINE_START(NETSPACE_V2, "LaCie Network Space v2")
|
|||||||
.init_machine = netspace_v2_init,
|
.init_machine = netspace_v2_init,
|
||||||
.map_io = kirkwood_map_io,
|
.map_io = kirkwood_map_io,
|
||||||
.init_irq = kirkwood_init_irq,
|
.init_irq = kirkwood_init_irq,
|
||||||
.timer = &lacie_v2_timer,
|
.timer = &kirkwood_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -272,7 +272,7 @@ MACHINE_START(INETSPACE_V2, "LaCie Internet Space v2")
|
|||||||
.init_machine = netspace_v2_init,
|
.init_machine = netspace_v2_init,
|
||||||
.map_io = kirkwood_map_io,
|
.map_io = kirkwood_map_io,
|
||||||
.init_irq = kirkwood_init_irq,
|
.init_irq = kirkwood_init_irq,
|
||||||
.timer = &lacie_v2_timer,
|
.timer = &kirkwood_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -282,6 +282,6 @@ MACHINE_START(NETSPACE_MAX_V2, "LaCie Network Space Max v2")
|
|||||||
.init_machine = netspace_v2_init,
|
.init_machine = netspace_v2_init,
|
||||||
.map_io = kirkwood_map_io,
|
.map_io = kirkwood_map_io,
|
||||||
.init_irq = kirkwood_init_irq,
|
.init_irq = kirkwood_init_irq,
|
||||||
.timer = &lacie_v2_timer,
|
.timer = &kirkwood_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
#endif
|
#endif
|
||||||
|
@ -403,7 +403,7 @@ MACHINE_START(NET2BIG_V2, "LaCie 2Big Network v2")
|
|||||||
.init_machine = netxbig_v2_init,
|
.init_machine = netxbig_v2_init,
|
||||||
.map_io = kirkwood_map_io,
|
.map_io = kirkwood_map_io,
|
||||||
.init_irq = kirkwood_init_irq,
|
.init_irq = kirkwood_init_irq,
|
||||||
.timer = &lacie_v2_timer,
|
.timer = &kirkwood_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -413,6 +413,6 @@ MACHINE_START(NET5BIG_V2, "LaCie 5Big Network v2")
|
|||||||
.init_machine = netxbig_v2_init,
|
.init_machine = netxbig_v2_init,
|
||||||
.map_io = kirkwood_map_io,
|
.map_io = kirkwood_map_io,
|
||||||
.init_irq = kirkwood_init_irq,
|
.init_irq = kirkwood_init_irq,
|
||||||
.timer = &lacie_v2_timer,
|
.timer = &kirkwood_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
#endif
|
#endif
|
||||||
|
@ -27,6 +27,10 @@
|
|||||||
#include "mpp.h"
|
#include "mpp.h"
|
||||||
#include "tsx1x-common.h"
|
#include "tsx1x-common.h"
|
||||||
|
|
||||||
|
/* for the PCIe reset workaround */
|
||||||
|
#include <plat/pcie.h>
|
||||||
|
|
||||||
|
|
||||||
#define QNAP_TS41X_JUMPER_JP1 45
|
#define QNAP_TS41X_JUMPER_JP1 45
|
||||||
|
|
||||||
static struct i2c_board_info __initdata qnap_ts41x_i2c_rtc = {
|
static struct i2c_board_info __initdata qnap_ts41x_i2c_rtc = {
|
||||||
@ -140,8 +144,16 @@ static void __init qnap_ts41x_init(void)
|
|||||||
|
|
||||||
static int __init ts41x_pci_init(void)
|
static int __init ts41x_pci_init(void)
|
||||||
{
|
{
|
||||||
if (machine_is_ts41x())
|
if (machine_is_ts41x()) {
|
||||||
|
/*
|
||||||
|
* Without this explicit reset, the PCIe SATA controller
|
||||||
|
* (Marvell 88sx7042/sata_mv) is known to stop working
|
||||||
|
* after a few minutes.
|
||||||
|
*/
|
||||||
|
orion_pcie_reset((void __iomem *)PCIE_VIRT_BASE);
|
||||||
|
|
||||||
kirkwood_pcie_init(KW_PCIE0);
|
kirkwood_pcie_init(KW_PCIE0);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,8 @@ static inline int cpu_is_pxa910(void)
|
|||||||
#ifdef CONFIG_CPU_MMP2
|
#ifdef CONFIG_CPU_MMP2
|
||||||
static inline int cpu_is_mmp2(void)
|
static inline int cpu_is_mmp2(void)
|
||||||
{
|
{
|
||||||
return (((cpu_readid_id() >> 8) & 0xff) == 0x58);
|
return (((read_cpuid_id() >> 8) & 0xff) == 0x58);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
#define cpu_is_mmp2() (0)
|
#define cpu_is_mmp2() (0)
|
||||||
#endif
|
#endif
|
||||||
|
@ -54,7 +54,7 @@ void __init mv78xx0_mpp_conf(unsigned int *mpp_list)
|
|||||||
}
|
}
|
||||||
printk("\n");
|
printk("\n");
|
||||||
|
|
||||||
while (*mpp_list) {
|
for ( ; *mpp_list; mpp_list++) {
|
||||||
unsigned int num = MPP_NUM(*mpp_list);
|
unsigned int num = MPP_NUM(*mpp_list);
|
||||||
unsigned int sel = MPP_SEL(*mpp_list);
|
unsigned int sel = MPP_SEL(*mpp_list);
|
||||||
int shift, gpio_mode;
|
int shift, gpio_mode;
|
||||||
@ -83,8 +83,6 @@ void __init mv78xx0_mpp_conf(unsigned int *mpp_list)
|
|||||||
if (sel != 0)
|
if (sel != 0)
|
||||||
gpio_mode = 0;
|
gpio_mode = 0;
|
||||||
orion_gpio_set_valid(num, gpio_mode);
|
orion_gpio_set_valid(num, gpio_mode);
|
||||||
|
|
||||||
mpp_list++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
printk(KERN_DEBUG " final MPP regs:");
|
printk(KERN_DEBUG " final MPP regs:");
|
||||||
|
@ -321,10 +321,9 @@ static struct platform_device omap_wdt_device = {
|
|||||||
static int __init omap_init_wdt(void)
|
static int __init omap_init_wdt(void)
|
||||||
{
|
{
|
||||||
if (!cpu_is_omap16xx())
|
if (!cpu_is_omap16xx())
|
||||||
return;
|
return -ENODEV;
|
||||||
|
|
||||||
platform_device_register(&omap_wdt_device);
|
return platform_device_register(&omap_wdt_device);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
subsys_initcall(omap_init_wdt);
|
subsys_initcall(omap_init_wdt);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
#ifndef __ASM_ARCH_CAMERA_H_
|
#ifndef __ASM_ARCH_CAMERA_H_
|
||||||
#define __ASM_ARCH_CAMERA_H_
|
#define __ASM_ARCH_CAMERA_H_
|
||||||
|
|
||||||
|
#include <media/omap1_camera.h>
|
||||||
|
|
||||||
void omap1_camera_init(void *);
|
void omap1_camera_init(void *);
|
||||||
|
|
||||||
static inline void omap1_set_camera_info(struct omap1_cam_platform_data *info)
|
static inline void omap1_set_camera_info(struct omap1_cam_platform_data *info)
|
||||||
|
@ -242,9 +242,6 @@ static int devkit8000_twl_gpio_setup(struct device *dev,
|
|||||||
mmc[0].gpio_cd = gpio + 0;
|
mmc[0].gpio_cd = gpio + 0;
|
||||||
omap2_hsmmc_init(mmc);
|
omap2_hsmmc_init(mmc);
|
||||||
|
|
||||||
/* link regulators to MMC adapters */
|
|
||||||
devkit8000_vmmc1_supply.dev = mmc[0].dev;
|
|
||||||
|
|
||||||
/* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
|
/* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
|
||||||
gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
|
gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
|
||||||
|
|
||||||
|
@ -127,7 +127,7 @@ void __init orion5x_mpp_conf(struct orion5x_mpp_mode *mode)
|
|||||||
/* Initialize gpiolib. */
|
/* Initialize gpiolib. */
|
||||||
orion_gpio_init();
|
orion_gpio_init();
|
||||||
|
|
||||||
while (mode->mpp >= 0) {
|
for ( ; mode->mpp >= 0; mode++) {
|
||||||
u32 *reg;
|
u32 *reg;
|
||||||
int num_type;
|
int num_type;
|
||||||
int shift;
|
int shift;
|
||||||
@ -160,8 +160,6 @@ void __init orion5x_mpp_conf(struct orion5x_mpp_mode *mode)
|
|||||||
orion_gpio_set_unused(mode->mpp);
|
orion_gpio_set_unused(mode->mpp);
|
||||||
|
|
||||||
orion_gpio_set_valid(mode->mpp, !!(mode->type == MPP_GPIO));
|
orion_gpio_set_valid(mode->mpp, !!(mode->type == MPP_GPIO));
|
||||||
|
|
||||||
mode++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
writel(mpp_0_7_ctrl, MPP_0_7_CTRL);
|
writel(mpp_0_7_ctrl, MPP_0_7_CTRL);
|
||||||
|
@ -239,7 +239,7 @@ static struct platform_nand_data ts78xx_ts_nand_data = {
|
|||||||
static struct resource ts78xx_ts_nand_resources = {
|
static struct resource ts78xx_ts_nand_resources = {
|
||||||
.start = TS_NAND_DATA,
|
.start = TS_NAND_DATA,
|
||||||
.end = TS_NAND_DATA + 4,
|
.end = TS_NAND_DATA + 4,
|
||||||
.flags = IORESOURCE_IO,
|
.flags = IORESOURCE_MEM,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device ts78xx_ts_nand_device = {
|
static struct platform_device ts78xx_ts_nand_device = {
|
||||||
|
@ -476,8 +476,6 @@ static void __init cmx2xx_init(void)
|
|||||||
|
|
||||||
static void __init cmx2xx_init_irq(void)
|
static void __init cmx2xx_init_irq(void)
|
||||||
{
|
{
|
||||||
pxa27x_init_irq();
|
|
||||||
|
|
||||||
if (cpu_is_pxa25x()) {
|
if (cpu_is_pxa25x()) {
|
||||||
pxa25x_init_irq();
|
pxa25x_init_irq();
|
||||||
cmx2xx_pci_init_irq(CMX255_GPIO_IT8152_IRQ);
|
cmx2xx_pci_init_irq(CMX255_GPIO_IT8152_IRQ);
|
||||||
|
@ -116,7 +116,7 @@ static struct platform_device smc91x_device = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
#if defined(CONFIG_FB_PXA) || (CONFIG_FB_PXA_MODULE)
|
#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
|
||||||
static uint16_t lcd_power_on[] = {
|
static uint16_t lcd_power_on[] = {
|
||||||
/* single frame */
|
/* single frame */
|
||||||
SMART_CMD_NOOP,
|
SMART_CMD_NOOP,
|
||||||
|
@ -143,7 +143,7 @@ config MACH_SMDK6410
|
|||||||
select S3C_DEV_USB_HSOTG
|
select S3C_DEV_USB_HSOTG
|
||||||
select S3C_DEV_WDT
|
select S3C_DEV_WDT
|
||||||
select SAMSUNG_DEV_KEYPAD
|
select SAMSUNG_DEV_KEYPAD
|
||||||
select HAVE_S3C2410_WATCHDOG
|
select HAVE_S3C2410_WATCHDOG if WATCHDOG
|
||||||
select S3C64XX_SETUP_SDHCI
|
select S3C64XX_SETUP_SDHCI
|
||||||
select S3C64XX_SETUP_I2C1
|
select S3C64XX_SETUP_I2C1
|
||||||
select S3C64XX_SETUP_IDE
|
select S3C64XX_SETUP_IDE
|
||||||
|
@ -116,4 +116,6 @@ endmenu
|
|||||||
config SH_CLK_CPG
|
config SH_CLK_CPG
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
source "drivers/sh/Kconfig"
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
@ -163,11 +163,13 @@ static struct mtd_partition nor_flash_partitions[] = {
|
|||||||
.name = "loader",
|
.name = "loader",
|
||||||
.offset = 0x00000000,
|
.offset = 0x00000000,
|
||||||
.size = 512 * 1024,
|
.size = 512 * 1024,
|
||||||
|
.mask_flags = MTD_WRITEABLE,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "bootenv",
|
.name = "bootenv",
|
||||||
.offset = MTDPART_OFS_APPEND,
|
.offset = MTDPART_OFS_APPEND,
|
||||||
.size = 512 * 1024,
|
.size = 512 * 1024,
|
||||||
|
.mask_flags = MTD_WRITEABLE,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "kernel_ro",
|
.name = "kernel_ro",
|
||||||
@ -565,12 +567,54 @@ static struct platform_device *qhd_devices[] __initdata = {
|
|||||||
|
|
||||||
/* FSI */
|
/* FSI */
|
||||||
#define IRQ_FSI evt2irq(0x1840)
|
#define IRQ_FSI evt2irq(0x1840)
|
||||||
|
|
||||||
|
static int fsi_set_rate(int is_porta, int rate)
|
||||||
|
{
|
||||||
|
struct clk *fsib_clk;
|
||||||
|
struct clk *fdiv_clk = &sh7372_fsidivb_clk;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/* set_rate is not needed if port A */
|
||||||
|
if (is_porta)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
fsib_clk = clk_get(NULL, "fsib_clk");
|
||||||
|
if (IS_ERR(fsib_clk))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
switch (rate) {
|
||||||
|
case 44100:
|
||||||
|
clk_set_rate(fsib_clk, clk_round_rate(fsib_clk, 11283000));
|
||||||
|
ret = SH_FSI_ACKMD_256 | SH_FSI_BPFMD_64;
|
||||||
|
break;
|
||||||
|
case 48000:
|
||||||
|
clk_set_rate(fsib_clk, clk_round_rate(fsib_clk, 85428000));
|
||||||
|
clk_set_rate(fdiv_clk, clk_round_rate(fdiv_clk, 12204000));
|
||||||
|
ret = SH_FSI_ACKMD_256 | SH_FSI_BPFMD_64;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
pr_err("unsupported rate in FSI2 port B\n");
|
||||||
|
ret = -EINVAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
clk_put(fsib_clk);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static struct sh_fsi_platform_info fsi_info = {
|
static struct sh_fsi_platform_info fsi_info = {
|
||||||
.porta_flags = SH_FSI_BRS_INV |
|
.porta_flags = SH_FSI_BRS_INV |
|
||||||
SH_FSI_OUT_SLAVE_MODE |
|
SH_FSI_OUT_SLAVE_MODE |
|
||||||
SH_FSI_IN_SLAVE_MODE |
|
SH_FSI_IN_SLAVE_MODE |
|
||||||
SH_FSI_OFMT(PCM) |
|
SH_FSI_OFMT(PCM) |
|
||||||
SH_FSI_IFMT(PCM),
|
SH_FSI_IFMT(PCM),
|
||||||
|
|
||||||
|
.portb_flags = SH_FSI_BRS_INV |
|
||||||
|
SH_FSI_BRM_INV |
|
||||||
|
SH_FSI_LRS_INV |
|
||||||
|
SH_FSI_OFMT(SPDIF),
|
||||||
|
.set_rate = fsi_set_rate,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct resource fsi_resources[] = {
|
static struct resource fsi_resources[] = {
|
||||||
@ -634,6 +678,7 @@ static struct platform_device lcdc1_device = {
|
|||||||
static struct sh_mobile_hdmi_info hdmi_info = {
|
static struct sh_mobile_hdmi_info hdmi_info = {
|
||||||
.lcd_chan = &sh_mobile_lcdc1_info.ch[0],
|
.lcd_chan = &sh_mobile_lcdc1_info.ch[0],
|
||||||
.lcd_dev = &lcdc1_device.dev,
|
.lcd_dev = &lcdc1_device.dev,
|
||||||
|
.flags = HDMI_SND_SRC_SPDIF,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct resource hdmi_resources[] = {
|
static struct resource hdmi_resources[] = {
|
||||||
@ -992,6 +1037,7 @@ static void __init ap4evb_map_io(void)
|
|||||||
|
|
||||||
#define GPIO_PORT9CR 0xE6051009
|
#define GPIO_PORT9CR 0xE6051009
|
||||||
#define GPIO_PORT10CR 0xE605100A
|
#define GPIO_PORT10CR 0xE605100A
|
||||||
|
#define USCCR1 0xE6058144
|
||||||
static void __init ap4evb_init(void)
|
static void __init ap4evb_init(void)
|
||||||
{
|
{
|
||||||
u32 srcr4;
|
u32 srcr4;
|
||||||
@ -1062,7 +1108,7 @@ static void __init ap4evb_init(void)
|
|||||||
/* setup USB phy */
|
/* setup USB phy */
|
||||||
__raw_writew(0x8a0a, 0xE6058130); /* USBCR2 */
|
__raw_writew(0x8a0a, 0xE6058130); /* USBCR2 */
|
||||||
|
|
||||||
/* enable FSI2 */
|
/* enable FSI2 port A (ak4643) */
|
||||||
gpio_request(GPIO_FN_FSIAIBT, NULL);
|
gpio_request(GPIO_FN_FSIAIBT, NULL);
|
||||||
gpio_request(GPIO_FN_FSIAILR, NULL);
|
gpio_request(GPIO_FN_FSIAILR, NULL);
|
||||||
gpio_request(GPIO_FN_FSIAISLD, NULL);
|
gpio_request(GPIO_FN_FSIAISLD, NULL);
|
||||||
@ -1079,6 +1125,10 @@ static void __init ap4evb_init(void)
|
|||||||
gpio_request(GPIO_PORT41, NULL);
|
gpio_request(GPIO_PORT41, NULL);
|
||||||
gpio_direction_input(GPIO_PORT41);
|
gpio_direction_input(GPIO_PORT41);
|
||||||
|
|
||||||
|
/* setup FSI2 port B (HDMI) */
|
||||||
|
gpio_request(GPIO_FN_FSIBCK, NULL);
|
||||||
|
__raw_writew(__raw_readw(USCCR1) & ~(1 << 6), USCCR1); /* use SPDIF */
|
||||||
|
|
||||||
/* set SPU2 clock to 119.6 MHz */
|
/* set SPU2 clock to 119.6 MHz */
|
||||||
clk = clk_get(NULL, "spu_clk");
|
clk = clk_get(NULL, "spu_clk");
|
||||||
if (!IS_ERR(clk)) {
|
if (!IS_ERR(clk)) {
|
||||||
|
@ -50,6 +50,9 @@
|
|||||||
#define SMSTPCR3 0xe615013c
|
#define SMSTPCR3 0xe615013c
|
||||||
#define SMSTPCR4 0xe6150140
|
#define SMSTPCR4 0xe6150140
|
||||||
|
|
||||||
|
#define FSIDIVA 0xFE1F8000
|
||||||
|
#define FSIDIVB 0xFE1F8008
|
||||||
|
|
||||||
/* Platforms must set frequency on their DV_CLKI pin */
|
/* Platforms must set frequency on their DV_CLKI pin */
|
||||||
struct clk sh7372_dv_clki_clk = {
|
struct clk sh7372_dv_clki_clk = {
|
||||||
};
|
};
|
||||||
@ -288,6 +291,7 @@ struct clk sh7372_pllc2_clk = {
|
|||||||
.ops = &pllc2_clk_ops,
|
.ops = &pllc2_clk_ops,
|
||||||
.parent = &extal1_div2_clk,
|
.parent = &extal1_div2_clk,
|
||||||
.freq_table = pllc2_freq_table,
|
.freq_table = pllc2_freq_table,
|
||||||
|
.nr_freqs = ARRAY_SIZE(pllc2_freq_table) - 1,
|
||||||
.parent_table = pllc2_parent,
|
.parent_table = pllc2_parent,
|
||||||
.parent_num = ARRAY_SIZE(pllc2_parent),
|
.parent_num = ARRAY_SIZE(pllc2_parent),
|
||||||
};
|
};
|
||||||
@ -417,6 +421,101 @@ static struct clk div6_reparent_clks[DIV6_REPARENT_NR] = {
|
|||||||
fsibckcr_parent, ARRAY_SIZE(fsibckcr_parent), 6, 2),
|
fsibckcr_parent, ARRAY_SIZE(fsibckcr_parent), 6, 2),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* FSI DIV */
|
||||||
|
static unsigned long fsidiv_recalc(struct clk *clk)
|
||||||
|
{
|
||||||
|
unsigned long value;
|
||||||
|
|
||||||
|
value = __raw_readl(clk->mapping->base);
|
||||||
|
|
||||||
|
if ((value & 0x3) != 0x3)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
value >>= 16;
|
||||||
|
if (value < 2)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return clk->parent->rate / value;
|
||||||
|
}
|
||||||
|
|
||||||
|
static long fsidiv_round_rate(struct clk *clk, unsigned long rate)
|
||||||
|
{
|
||||||
|
return clk_rate_div_range_round(clk, 2, 0xffff, rate);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void fsidiv_disable(struct clk *clk)
|
||||||
|
{
|
||||||
|
__raw_writel(0, clk->mapping->base);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int fsidiv_enable(struct clk *clk)
|
||||||
|
{
|
||||||
|
unsigned long value;
|
||||||
|
|
||||||
|
value = __raw_readl(clk->mapping->base) >> 16;
|
||||||
|
if (value < 2) {
|
||||||
|
fsidiv_disable(clk);
|
||||||
|
return -ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
__raw_writel((value << 16) | 0x3, clk->mapping->base);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int fsidiv_set_rate(struct clk *clk,
|
||||||
|
unsigned long rate, int algo_id)
|
||||||
|
{
|
||||||
|
int idx;
|
||||||
|
|
||||||
|
if (clk->parent->rate == rate) {
|
||||||
|
fsidiv_disable(clk);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
idx = (clk->parent->rate / rate) & 0xffff;
|
||||||
|
if (idx < 2)
|
||||||
|
return -ENOENT;
|
||||||
|
|
||||||
|
__raw_writel(idx << 16, clk->mapping->base);
|
||||||
|
return fsidiv_enable(clk);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct clk_ops fsidiv_clk_ops = {
|
||||||
|
.recalc = fsidiv_recalc,
|
||||||
|
.round_rate = fsidiv_round_rate,
|
||||||
|
.set_rate = fsidiv_set_rate,
|
||||||
|
.enable = fsidiv_enable,
|
||||||
|
.disable = fsidiv_disable,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_mapping sh7372_fsidiva_clk_mapping = {
|
||||||
|
.phys = FSIDIVA,
|
||||||
|
.len = 8,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct clk sh7372_fsidiva_clk = {
|
||||||
|
.ops = &fsidiv_clk_ops,
|
||||||
|
.parent = &div6_reparent_clks[DIV6_FSIA], /* late install */
|
||||||
|
.mapping = &sh7372_fsidiva_clk_mapping,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_mapping sh7372_fsidivb_clk_mapping = {
|
||||||
|
.phys = FSIDIVB,
|
||||||
|
.len = 8,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct clk sh7372_fsidivb_clk = {
|
||||||
|
.ops = &fsidiv_clk_ops,
|
||||||
|
.parent = &div6_reparent_clks[DIV6_FSIB], /* late install */
|
||||||
|
.mapping = &sh7372_fsidivb_clk_mapping,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk *late_main_clks[] = {
|
||||||
|
&sh7372_fsidiva_clk,
|
||||||
|
&sh7372_fsidivb_clk,
|
||||||
|
};
|
||||||
|
|
||||||
enum { MSTP001,
|
enum { MSTP001,
|
||||||
MSTP131, MSTP130,
|
MSTP131, MSTP130,
|
||||||
MSTP129, MSTP128, MSTP127, MSTP126, MSTP125,
|
MSTP129, MSTP128, MSTP127, MSTP126, MSTP125,
|
||||||
@ -585,6 +684,9 @@ void __init sh7372_clock_init(void)
|
|||||||
if (!ret)
|
if (!ret)
|
||||||
ret = sh_clk_mstp32_register(mstp_clks, MSTP_NR);
|
ret = sh_clk_mstp32_register(mstp_clks, MSTP_NR);
|
||||||
|
|
||||||
|
for (k = 0; !ret && (k < ARRAY_SIZE(late_main_clks)); k++)
|
||||||
|
ret = clk_register(late_main_clks[k]);
|
||||||
|
|
||||||
clkdev_add_table(lookups, ARRAY_SIZE(lookups));
|
clkdev_add_table(lookups, ARRAY_SIZE(lookups));
|
||||||
|
|
||||||
if (!ret)
|
if (!ret)
|
||||||
|
@ -35,12 +35,12 @@ static inline int gpio_cansleep(unsigned gpio)
|
|||||||
|
|
||||||
static inline int gpio_to_irq(unsigned gpio)
|
static inline int gpio_to_irq(unsigned gpio)
|
||||||
{
|
{
|
||||||
return -ENOSYS;
|
return __gpio_to_irq(gpio);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int irq_to_gpio(unsigned int irq)
|
static inline int irq_to_gpio(unsigned int irq)
|
||||||
{
|
{
|
||||||
return -EINVAL;
|
return -ENOSYS;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_GPIOLIB */
|
#endif /* CONFIG_GPIOLIB */
|
||||||
|
@ -464,5 +464,7 @@ extern struct clk sh7372_dv_clki_div2_clk;
|
|||||||
extern struct clk sh7372_pllc2_clk;
|
extern struct clk sh7372_pllc2_clk;
|
||||||
extern struct clk sh7372_fsiack_clk;
|
extern struct clk sh7372_fsiack_clk;
|
||||||
extern struct clk sh7372_fsibck_clk;
|
extern struct clk sh7372_fsibck_clk;
|
||||||
|
extern struct clk sh7372_fsidiva_clk;
|
||||||
|
extern struct clk sh7372_fsidivb_clk;
|
||||||
|
|
||||||
#endif /* __ASM_SH7372_H__ */
|
#endif /* __ASM_SH7372_H__ */
|
||||||
|
@ -98,7 +98,7 @@ static struct intc_vect intca_vectors[] __initdata = {
|
|||||||
INTC_VECT(IRQ14A, 0x03c0), INTC_VECT(IRQ15A, 0x03e0),
|
INTC_VECT(IRQ14A, 0x03c0), INTC_VECT(IRQ15A, 0x03e0),
|
||||||
INTC_VECT(IRQ16A, 0x3200), INTC_VECT(IRQ17A, 0x3220),
|
INTC_VECT(IRQ16A, 0x3200), INTC_VECT(IRQ17A, 0x3220),
|
||||||
INTC_VECT(IRQ18A, 0x3240), INTC_VECT(IRQ19A, 0x3260),
|
INTC_VECT(IRQ18A, 0x3240), INTC_VECT(IRQ19A, 0x3260),
|
||||||
INTC_VECT(IRQ20A, 0x3280), INTC_VECT(IRQ31A, 0x32a0),
|
INTC_VECT(IRQ20A, 0x3280), INTC_VECT(IRQ21A, 0x32a0),
|
||||||
INTC_VECT(IRQ22A, 0x32c0), INTC_VECT(IRQ23A, 0x32e0),
|
INTC_VECT(IRQ22A, 0x32c0), INTC_VECT(IRQ23A, 0x32e0),
|
||||||
INTC_VECT(IRQ24A, 0x3300), INTC_VECT(IRQ25A, 0x3320),
|
INTC_VECT(IRQ24A, 0x3300), INTC_VECT(IRQ25A, 0x3320),
|
||||||
INTC_VECT(IRQ26A, 0x3340), INTC_VECT(IRQ27A, 0x3360),
|
INTC_VECT(IRQ26A, 0x3340), INTC_VECT(IRQ27A, 0x3360),
|
||||||
|
@ -54,7 +54,9 @@ static struct map_desc ct_ca9x4_io_desc[] __initdata = {
|
|||||||
|
|
||||||
static void __init ct_ca9x4_map_io(void)
|
static void __init ct_ca9x4_map_io(void)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_LOCAL_TIMERS
|
||||||
twd_base = MMIO_P2V(A9_MPCORE_TWD);
|
twd_base = MMIO_P2V(A9_MPCORE_TWD);
|
||||||
|
#endif
|
||||||
v2m_map_io(ct_ca9x4_io_desc, ARRAY_SIZE(ct_ca9x4_io_desc));
|
v2m_map_io(ct_ca9x4_io_desc, ARRAY_SIZE(ct_ca9x4_io_desc));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,7 +198,7 @@ __dma_alloc_remap(struct page *page, size_t size, gfp_t gfp, pgprot_t prot)
|
|||||||
* fragmentation of the DMA space, and also prevents allocations
|
* fragmentation of the DMA space, and also prevents allocations
|
||||||
* smaller than a section from crossing a section boundary.
|
* smaller than a section from crossing a section boundary.
|
||||||
*/
|
*/
|
||||||
bit = fls(size - 1) + 1;
|
bit = fls(size - 1);
|
||||||
if (bit > SECTION_SHIFT)
|
if (bit > SECTION_SHIFT)
|
||||||
bit = SECTION_SHIFT;
|
bit = SECTION_SHIFT;
|
||||||
align = 1 << bit;
|
align = 1 << bit;
|
||||||
|
@ -284,12 +284,14 @@ void __init omap_dsp_reserve_sdram_memblock(void)
|
|||||||
if (!size)
|
if (!size)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
paddr = __memblock_alloc_base(size, SZ_1M, MEMBLOCK_REAL_LIMIT);
|
paddr = memblock_alloc(size, SZ_1M);
|
||||||
if (!paddr) {
|
if (!paddr) {
|
||||||
pr_err("%s: failed to reserve %x bytes\n",
|
pr_err("%s: failed to reserve %x bytes\n",
|
||||||
__func__, size);
|
__func__, size);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
memblock_free(paddr, size);
|
||||||
|
memblock_remove(paddr, size);
|
||||||
|
|
||||||
omap_dsp_phys_mempool_base = paddr;
|
omap_dsp_phys_mempool_base = paddr;
|
||||||
}
|
}
|
||||||
|
@ -1983,6 +1983,8 @@ static int omap2_dma_handle_ch(int ch)
|
|||||||
|
|
||||||
dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR(ch));
|
dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR(ch));
|
||||||
dma_write(1 << ch, IRQSTATUS_L0);
|
dma_write(1 << ch, IRQSTATUS_L0);
|
||||||
|
/* read back the register to flush the write */
|
||||||
|
dma_read(IRQSTATUS_L0);
|
||||||
|
|
||||||
/* If the ch is not chained then chain_id will be -1 */
|
/* If the ch is not chained then chain_id will be -1 */
|
||||||
if (dma_chan[ch].chain_id != -1) {
|
if (dma_chan[ch].chain_id != -1) {
|
||||||
|
@ -11,12 +11,15 @@
|
|||||||
#ifndef __PLAT_PCIE_H
|
#ifndef __PLAT_PCIE_H
|
||||||
#define __PLAT_PCIE_H
|
#define __PLAT_PCIE_H
|
||||||
|
|
||||||
|
struct pci_bus;
|
||||||
|
|
||||||
u32 orion_pcie_dev_id(void __iomem *base);
|
u32 orion_pcie_dev_id(void __iomem *base);
|
||||||
u32 orion_pcie_rev(void __iomem *base);
|
u32 orion_pcie_rev(void __iomem *base);
|
||||||
int orion_pcie_link_up(void __iomem *base);
|
int orion_pcie_link_up(void __iomem *base);
|
||||||
int orion_pcie_x4_mode(void __iomem *base);
|
int orion_pcie_x4_mode(void __iomem *base);
|
||||||
int orion_pcie_get_local_bus_nr(void __iomem *base);
|
int orion_pcie_get_local_bus_nr(void __iomem *base);
|
||||||
void orion_pcie_set_local_bus_nr(void __iomem *base, int nr);
|
void orion_pcie_set_local_bus_nr(void __iomem *base, int nr);
|
||||||
|
void orion_pcie_reset(void __iomem *base);
|
||||||
void orion_pcie_setup(void __iomem *base,
|
void orion_pcie_setup(void __iomem *base,
|
||||||
struct mbus_dram_target_info *dram);
|
struct mbus_dram_target_info *dram);
|
||||||
int orion_pcie_rd_conf(void __iomem *base, struct pci_bus *bus,
|
int orion_pcie_rd_conf(void __iomem *base, struct pci_bus *bus,
|
||||||
|
@ -181,11 +181,6 @@ void __init orion_pcie_setup(void __iomem *base,
|
|||||||
u16 cmd;
|
u16 cmd;
|
||||||
u32 mask;
|
u32 mask;
|
||||||
|
|
||||||
/*
|
|
||||||
* soft reset PCIe unit
|
|
||||||
*/
|
|
||||||
orion_pcie_reset(base);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Point PCIe unit MBUS decode windows to DRAM space.
|
* Point PCIe unit MBUS decode windows to DRAM space.
|
||||||
*/
|
*/
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <linux/unistd.h>
|
#include <linux/unistd.h>
|
||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <linux/stddef.h>
|
#include <linux/stddef.h>
|
||||||
#include <linux/unistd.h>
|
#include <linux/unistd.h>
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
|
@ -28,7 +28,6 @@
|
|||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <linux/stddef.h>
|
#include <linux/stddef.h>
|
||||||
#include <linux/unistd.h>
|
#include <linux/unistd.h>
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
|
@ -202,7 +202,7 @@ simscsi_readwrite10 (struct scsi_cmnd *sc, int mode)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
simscsi_queuecommand (struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
|
simscsi_queuecommand_lck (struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
|
||||||
{
|
{
|
||||||
unsigned int target_id = sc->device->id;
|
unsigned int target_id = sc->device->id;
|
||||||
char fname[MAX_ROOT_LEN+16];
|
char fname[MAX_ROOT_LEN+16];
|
||||||
@ -326,6 +326,8 @@ simscsi_queuecommand (struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static DEF_SCSI_QCMD(simscsi_queuecommand)
|
||||||
|
|
||||||
static int
|
static int
|
||||||
simscsi_host_reset (struct scsi_cmnd *sc)
|
simscsi_host_reset (struct scsi_cmnd *sc)
|
||||||
{
|
{
|
||||||
|
@ -2,7 +2,9 @@
|
|||||||
#define _M68K_IRQFLAGS_H
|
#define _M68K_IRQFLAGS_H
|
||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
#ifdef CONFIG_MMU
|
||||||
#include <linux/hardirq.h>
|
#include <linux/hardirq.h>
|
||||||
|
#endif
|
||||||
#include <linux/preempt.h>
|
#include <linux/preempt.h>
|
||||||
#include <asm/thread_info.h>
|
#include <asm/thread_info.h>
|
||||||
#include <asm/entry.h>
|
#include <asm/entry.h>
|
||||||
|
@ -40,5 +40,6 @@ extern unsigned long hw_timer_offset(void);
|
|||||||
extern irqreturn_t arch_timer_interrupt(int irq, void *dummy);
|
extern irqreturn_t arch_timer_interrupt(int irq, void *dummy);
|
||||||
|
|
||||||
extern void config_BSP(char *command, int len);
|
extern void config_BSP(char *command, int len);
|
||||||
|
extern void do_IRQ(int irq, struct pt_regs *fp);
|
||||||
|
|
||||||
#endif /* _M68K_MACHDEP_H */
|
#endif /* _M68K_MACHDEP_H */
|
||||||
|
@ -18,7 +18,6 @@
|
|||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <linux/stddef.h>
|
#include <linux/stddef.h>
|
||||||
#include <linux/unistd.h>
|
#include <linux/unistd.h>
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <linux/stddef.h>
|
#include <linux/stddef.h>
|
||||||
#include <linux/unistd.h>
|
#include <linux/unistd.h>
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <linux/stddef.h>
|
#include <linux/stddef.h>
|
||||||
#include <linux/unistd.h>
|
#include <linux/unistd.h>
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
|
@ -28,7 +28,6 @@
|
|||||||
#include <linux/namei.h>
|
#include <linux/namei.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <linux/syscalls.h>
|
#include <linux/syscalls.h>
|
||||||
#include <linux/utsname.h>
|
#include <linux/utsname.h>
|
||||||
#include <linux/vfs.h>
|
#include <linux/vfs.h>
|
||||||
|
@ -20,7 +20,6 @@
|
|||||||
#include <linux/times.h>
|
#include <linux/times.h>
|
||||||
#include <linux/time.h>
|
#include <linux/time.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <linux/sem.h>
|
#include <linux/sem.h>
|
||||||
#include <linux/msg.h>
|
#include <linux/msg.h>
|
||||||
#include <linux/shm.h>
|
#include <linux/shm.h>
|
||||||
|
@ -4,6 +4,10 @@ config PPC32
|
|||||||
bool
|
bool
|
||||||
default y if !PPC64
|
default y if !PPC64
|
||||||
|
|
||||||
|
config 32BIT
|
||||||
|
bool
|
||||||
|
default y if PPC32
|
||||||
|
|
||||||
config 64BIT
|
config 64BIT
|
||||||
bool
|
bool
|
||||||
default y if PPC64
|
default y if PPC64
|
||||||
|
@ -33,9 +33,10 @@ __div64_32:
|
|||||||
cntlzw r0,r5 # we are shifting the dividend right
|
cntlzw r0,r5 # we are shifting the dividend right
|
||||||
li r10,-1 # to make it < 2^32, and shifting
|
li r10,-1 # to make it < 2^32, and shifting
|
||||||
srw r10,r10,r0 # the divisor right the same amount,
|
srw r10,r10,r0 # the divisor right the same amount,
|
||||||
add r9,r4,r10 # rounding up (so the estimate cannot
|
addc r9,r4,r10 # rounding up (so the estimate cannot
|
||||||
andc r11,r6,r10 # ever be too large, only too small)
|
andc r11,r6,r10 # ever be too large, only too small)
|
||||||
andc r9,r9,r10
|
andc r9,r9,r10
|
||||||
|
addze r9,r9
|
||||||
or r11,r5,r11
|
or r11,r5,r11
|
||||||
rotlw r9,r9,r0
|
rotlw r9,r9,r0
|
||||||
rotlw r11,r11,r0
|
rotlw r11,r11,r0
|
||||||
|
@ -337,7 +337,7 @@ char *dbg_get_reg(int regno, void *mem, struct pt_regs *regs)
|
|||||||
/* FP registers 32 -> 63 */
|
/* FP registers 32 -> 63 */
|
||||||
#if defined(CONFIG_FSL_BOOKE) && defined(CONFIG_SPE)
|
#if defined(CONFIG_FSL_BOOKE) && defined(CONFIG_SPE)
|
||||||
if (current)
|
if (current)
|
||||||
memcpy(mem, current->thread.evr[regno-32],
|
memcpy(mem, ¤t->thread.evr[regno-32],
|
||||||
dbg_reg_def[regno].size);
|
dbg_reg_def[regno].size);
|
||||||
#else
|
#else
|
||||||
/* fp registers not used by kernel, leave zero */
|
/* fp registers not used by kernel, leave zero */
|
||||||
@ -362,7 +362,7 @@ int dbg_set_reg(int regno, void *mem, struct pt_regs *regs)
|
|||||||
if (regno >= 32 && regno < 64) {
|
if (regno >= 32 && regno < 64) {
|
||||||
/* FP registers 32 -> 63 */
|
/* FP registers 32 -> 63 */
|
||||||
#if defined(CONFIG_FSL_BOOKE) && defined(CONFIG_SPE)
|
#if defined(CONFIG_FSL_BOOKE) && defined(CONFIG_SPE)
|
||||||
memcpy(current->thread.evr[regno-32], mem,
|
memcpy(¤t->thread.evr[regno-32], mem,
|
||||||
dbg_reg_def[regno].size);
|
dbg_reg_def[regno].size);
|
||||||
#else
|
#else
|
||||||
/* fp registers not used by kernel, leave zero */
|
/* fp registers not used by kernel, leave zero */
|
||||||
|
@ -127,7 +127,7 @@ static void kvm_patch_ins_nop(u32 *inst)
|
|||||||
|
|
||||||
static void kvm_patch_ins_b(u32 *inst, int addr)
|
static void kvm_patch_ins_b(u32 *inst, int addr)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_RELOCATABLE
|
#if defined(CONFIG_RELOCATABLE) && defined(CONFIG_PPC_BOOK3S)
|
||||||
/* On relocatable kernels interrupts handlers and our code
|
/* On relocatable kernels interrupts handlers and our code
|
||||||
can be in different regions, so we don't patch them */
|
can be in different regions, so we don't patch them */
|
||||||
|
|
||||||
|
@ -497,9 +497,8 @@ static void __init emergency_stack_init(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Called into from start_kernel, after lock_kernel has been called.
|
* Called into from start_kernel this initializes bootmem, which is used
|
||||||
* Initializes bootmem, which is unsed to manage page allocation until
|
* to manage page allocation until mem_init is called.
|
||||||
* mem_init is called.
|
|
||||||
*/
|
*/
|
||||||
void __init setup_arch(char **cmdline_p)
|
void __init setup_arch(char **cmdline_p)
|
||||||
{
|
{
|
||||||
|
@ -23,7 +23,6 @@
|
|||||||
#include <linux/resource.h>
|
#include <linux/resource.h>
|
||||||
#include <linux/times.h>
|
#include <linux/times.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <linux/sem.h>
|
#include <linux/sem.h>
|
||||||
#include <linux/msg.h>
|
#include <linux/msg.h>
|
||||||
#include <linux/shm.h>
|
#include <linux/shm.h>
|
||||||
|
@ -416,7 +416,7 @@ lightweight_exit:
|
|||||||
lwz r3, VCPU_PC(r4)
|
lwz r3, VCPU_PC(r4)
|
||||||
mtsrr0 r3
|
mtsrr0 r3
|
||||||
lwz r3, VCPU_SHARED(r4)
|
lwz r3, VCPU_SHARED(r4)
|
||||||
lwz r3, VCPU_SHARED_MSR(r3)
|
lwz r3, (VCPU_SHARED_MSR + 4)(r3)
|
||||||
oris r3, r3, KVMPPC_MSR_MASK@h
|
oris r3, r3, KVMPPC_MSR_MASK@h
|
||||||
ori r3, r3, KVMPPC_MSR_MASK@l
|
ori r3, r3, KVMPPC_MSR_MASK@l
|
||||||
mtsrr1 r3
|
mtsrr1 r3
|
||||||
|
@ -138,8 +138,8 @@ void kvmppc_core_vcpu_free(struct kvm_vcpu *vcpu)
|
|||||||
struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu);
|
struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu);
|
||||||
|
|
||||||
free_page((unsigned long)vcpu->arch.shared);
|
free_page((unsigned long)vcpu->arch.shared);
|
||||||
kvmppc_e500_tlb_uninit(vcpu_e500);
|
|
||||||
kvm_vcpu_uninit(vcpu);
|
kvm_vcpu_uninit(vcpu);
|
||||||
|
kvmppc_e500_tlb_uninit(vcpu_e500);
|
||||||
kmem_cache_free(kvm_vcpu_cache, vcpu_e500);
|
kmem_cache_free(kvm_vcpu_cache, vcpu_e500);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -617,6 +617,7 @@ long kvm_arch_vm_ioctl(struct file *filp,
|
|||||||
switch (ioctl) {
|
switch (ioctl) {
|
||||||
case KVM_PPC_GET_PVINFO: {
|
case KVM_PPC_GET_PVINFO: {
|
||||||
struct kvm_ppc_pvinfo pvinfo;
|
struct kvm_ppc_pvinfo pvinfo;
|
||||||
|
memset(&pvinfo, 0, sizeof(pvinfo));
|
||||||
r = kvm_vm_ioctl_get_pvinfo(&pvinfo);
|
r = kvm_vm_ioctl_get_pvinfo(&pvinfo);
|
||||||
if (copy_to_user(argp, &pvinfo, sizeof(pvinfo))) {
|
if (copy_to_user(argp, &pvinfo, sizeof(pvinfo))) {
|
||||||
r = -EFAULT;
|
r = -EFAULT;
|
||||||
|
@ -35,7 +35,6 @@ void kvmppc_init_timing_stats(struct kvm_vcpu *vcpu)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* pause guest execution to avoid concurrent updates */
|
/* pause guest execution to avoid concurrent updates */
|
||||||
local_irq_disable();
|
|
||||||
mutex_lock(&vcpu->mutex);
|
mutex_lock(&vcpu->mutex);
|
||||||
|
|
||||||
vcpu->arch.last_exit_type = 0xDEAD;
|
vcpu->arch.last_exit_type = 0xDEAD;
|
||||||
@ -51,7 +50,6 @@ void kvmppc_init_timing_stats(struct kvm_vcpu *vcpu)
|
|||||||
vcpu->arch.timing_last_enter.tv64 = 0;
|
vcpu->arch.timing_last_enter.tv64 = 0;
|
||||||
|
|
||||||
mutex_unlock(&vcpu->mutex);
|
mutex_unlock(&vcpu->mutex);
|
||||||
local_irq_enable();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void add_exit_timing(struct kvm_vcpu *vcpu, u64 duration, int type)
|
static void add_exit_timing(struct kvm_vcpu *vcpu, u64 duration, int type)
|
||||||
|
@ -1123,7 +1123,7 @@ void hash_preload(struct mm_struct *mm, unsigned long ea,
|
|||||||
else
|
else
|
||||||
#endif /* CONFIG_PPC_HAS_HASH_64K */
|
#endif /* CONFIG_PPC_HAS_HASH_64K */
|
||||||
rc = __hash_page_4K(ea, access, vsid, ptep, trap, local, ssize,
|
rc = __hash_page_4K(ea, access, vsid, ptep, trap, local, ssize,
|
||||||
subpage_protection(pgdir, ea));
|
subpage_protection(mm, ea));
|
||||||
|
|
||||||
/* Dump some info in case of hash insertion failure, they should
|
/* Dump some info in case of hash insertion failure, they should
|
||||||
* never happen so it is really useful to know if/when they do
|
* never happen so it is really useful to know if/when they do
|
||||||
|
@ -138,8 +138,11 @@
|
|||||||
cmpldi cr0,r15,0 /* Check for user region */
|
cmpldi cr0,r15,0 /* Check for user region */
|
||||||
std r14,EX_TLB_ESR(r12) /* write crazy -1 to frame */
|
std r14,EX_TLB_ESR(r12) /* write crazy -1 to frame */
|
||||||
beq normal_tlb_miss
|
beq normal_tlb_miss
|
||||||
|
|
||||||
|
li r11,_PAGE_PRESENT|_PAGE_BAP_SX /* Base perm */
|
||||||
|
oris r11,r11,_PAGE_ACCESSED@h
|
||||||
/* XXX replace the RMW cycles with immediate loads + writes */
|
/* XXX replace the RMW cycles with immediate loads + writes */
|
||||||
1: mfspr r10,SPRN_MAS1
|
mfspr r10,SPRN_MAS1
|
||||||
cmpldi cr0,r15,8 /* Check for vmalloc region */
|
cmpldi cr0,r15,8 /* Check for vmalloc region */
|
||||||
rlwinm r10,r10,0,16,1 /* Clear TID */
|
rlwinm r10,r10,0,16,1 /* Clear TID */
|
||||||
mtspr SPRN_MAS1,r10
|
mtspr SPRN_MAS1,r10
|
||||||
|
@ -585,6 +585,6 @@ void setup_initial_memory_limit(phys_addr_t first_memblock_base,
|
|||||||
ppc64_rma_size = min_t(u64, first_memblock_size, 0x40000000);
|
ppc64_rma_size = min_t(u64, first_memblock_size, 0x40000000);
|
||||||
|
|
||||||
/* Finally limit subsequent allocations */
|
/* Finally limit subsequent allocations */
|
||||||
memblock_set_current_limit(ppc64_memblock_base + ppc64_rma_size);
|
memblock_set_current_limit(first_memblock_base + ppc64_rma_size);
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_PPC64 */
|
#endif /* CONFIG_PPC64 */
|
||||||
|
@ -47,6 +47,12 @@ config LPARCFG
|
|||||||
config PPC_PSERIES_DEBUG
|
config PPC_PSERIES_DEBUG
|
||||||
depends on PPC_PSERIES && PPC_EARLY_DEBUG
|
depends on PPC_PSERIES && PPC_EARLY_DEBUG
|
||||||
bool "Enable extra debug logging in platforms/pseries"
|
bool "Enable extra debug logging in platforms/pseries"
|
||||||
|
help
|
||||||
|
Say Y here if you want the pseries core to produce a bunch of
|
||||||
|
debug messages to the system log. Select this if you are having a
|
||||||
|
problem with the pseries core and want to see more of what is
|
||||||
|
going on. This does not enable debugging in lpar.c, which must
|
||||||
|
be manually done due to its verbosity.
|
||||||
default y
|
default y
|
||||||
|
|
||||||
config PPC_SMLPAR
|
config PPC_SMLPAR
|
||||||
|
@ -21,8 +21,6 @@
|
|||||||
* Please address comments and feedback to Linas Vepstas <linas@austin.ibm.com>
|
* Please address comments and feedback to Linas Vepstas <linas@austin.ibm.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#undef DEBUG
|
|
||||||
|
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
|
@ -25,8 +25,6 @@
|
|||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#undef DEBUG
|
|
||||||
|
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <asm/pci-bridge.h>
|
#include <asm/pci-bridge.h>
|
||||||
#include <asm/ppc-pci.h>
|
#include <asm/ppc-pci.h>
|
||||||
|
@ -6,6 +6,18 @@ config TRACE_IRQFLAGS_SUPPORT
|
|||||||
|
|
||||||
source "lib/Kconfig.debug"
|
source "lib/Kconfig.debug"
|
||||||
|
|
||||||
|
config STRICT_DEVMEM
|
||||||
|
def_bool y
|
||||||
|
prompt "Filter access to /dev/mem"
|
||||||
|
---help---
|
||||||
|
This option restricts access to /dev/mem. If this option is
|
||||||
|
disabled, you allow userspace access to all memory, including
|
||||||
|
kernel and userspace memory. Accidental memory access is likely
|
||||||
|
to be disastrous.
|
||||||
|
Memory access is required for experts who want to debug the kernel.
|
||||||
|
|
||||||
|
If you are unsure, say Y.
|
||||||
|
|
||||||
config DEBUG_STRICT_USER_COPY_CHECKS
|
config DEBUG_STRICT_USER_COPY_CHECKS
|
||||||
bool "Strict user copy size checks"
|
bool "Strict user copy size checks"
|
||||||
---help---
|
---help---
|
||||||
|
@ -130,6 +130,11 @@ struct page;
|
|||||||
void arch_free_page(struct page *page, int order);
|
void arch_free_page(struct page *page, int order);
|
||||||
void arch_alloc_page(struct page *page, int order);
|
void arch_alloc_page(struct page *page, int order);
|
||||||
|
|
||||||
|
static inline int devmem_is_allowed(unsigned long pfn)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#define HAVE_ARCH_FREE_PAGE
|
#define HAVE_ARCH_FREE_PAGE
|
||||||
#define HAVE_ARCH_ALLOC_PAGE
|
#define HAVE_ARCH_ALLOC_PAGE
|
||||||
|
|
||||||
|
@ -25,7 +25,6 @@
|
|||||||
#include <linux/resource.h>
|
#include <linux/resource.h>
|
||||||
#include <linux/times.h>
|
#include <linux/times.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <linux/sem.h>
|
#include <linux/sem.h>
|
||||||
#include <linux/msg.h>
|
#include <linux/msg.h>
|
||||||
#include <linux/shm.h>
|
#include <linux/shm.h>
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#include <asm/sections.h>
|
#include <asm/sections.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
#include <linux/hardirq.h>
|
||||||
|
|
||||||
DEFINE_PER_CPU(struct kprobe *, current_kprobe) = NULL;
|
DEFINE_PER_CPU(struct kprobe *, current_kprobe) = NULL;
|
||||||
DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
|
DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
|
||||||
@ -212,7 +213,7 @@ static void __kprobes prepare_singlestep(struct kprobe *p, struct pt_regs *regs)
|
|||||||
/* Set the PER control regs, turns on single step for this address */
|
/* Set the PER control regs, turns on single step for this address */
|
||||||
__ctl_load(kprobe_per_regs, 9, 11);
|
__ctl_load(kprobe_per_regs, 9, 11);
|
||||||
regs->psw.mask |= PSW_MASK_PER;
|
regs->psw.mask |= PSW_MASK_PER;
|
||||||
regs->psw.mask &= ~(PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK);
|
regs->psw.mask &= ~(PSW_MASK_IO | PSW_MASK_EXT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __kprobes save_previous_kprobe(struct kprobe_ctlblk *kcb)
|
static void __kprobes save_previous_kprobe(struct kprobe_ctlblk *kcb)
|
||||||
@ -239,7 +240,7 @@ static void __kprobes set_current_kprobe(struct kprobe *p, struct pt_regs *regs,
|
|||||||
__get_cpu_var(current_kprobe) = p;
|
__get_cpu_var(current_kprobe) = p;
|
||||||
/* Save the interrupt and per flags */
|
/* Save the interrupt and per flags */
|
||||||
kcb->kprobe_saved_imask = regs->psw.mask &
|
kcb->kprobe_saved_imask = regs->psw.mask &
|
||||||
(PSW_MASK_PER | PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK);
|
(PSW_MASK_PER | PSW_MASK_IO | PSW_MASK_EXT);
|
||||||
/* Save the control regs that govern PER */
|
/* Save the control regs that govern PER */
|
||||||
__ctl_store(kcb->kprobe_saved_ctl, 9, 11);
|
__ctl_store(kcb->kprobe_saved_ctl, 9, 11);
|
||||||
}
|
}
|
||||||
@ -316,8 +317,6 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
|
|||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
ss_probe:
|
ss_probe:
|
||||||
if (regs->psw.mask & (PSW_MASK_PER | PSW_MASK_IO))
|
|
||||||
local_irq_disable();
|
|
||||||
prepare_singlestep(p, regs);
|
prepare_singlestep(p, regs);
|
||||||
kcb->kprobe_status = KPROBE_HIT_SS;
|
kcb->kprobe_status = KPROBE_HIT_SS;
|
||||||
return 1;
|
return 1;
|
||||||
@ -350,6 +349,7 @@ static int __kprobes trampoline_probe_handler(struct kprobe *p,
|
|||||||
struct hlist_node *node, *tmp;
|
struct hlist_node *node, *tmp;
|
||||||
unsigned long flags, orig_ret_address = 0;
|
unsigned long flags, orig_ret_address = 0;
|
||||||
unsigned long trampoline_address = (unsigned long)&kretprobe_trampoline;
|
unsigned long trampoline_address = (unsigned long)&kretprobe_trampoline;
|
||||||
|
kprobe_opcode_t *correct_ret_addr = NULL;
|
||||||
|
|
||||||
INIT_HLIST_HEAD(&empty_rp);
|
INIT_HLIST_HEAD(&empty_rp);
|
||||||
kretprobe_hash_lock(current, &head, &flags);
|
kretprobe_hash_lock(current, &head, &flags);
|
||||||
@ -372,10 +372,32 @@ static int __kprobes trampoline_probe_handler(struct kprobe *p,
|
|||||||
/* another task is sharing our hash bucket */
|
/* another task is sharing our hash bucket */
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (ri->rp && ri->rp->handler)
|
orig_ret_address = (unsigned long)ri->ret_addr;
|
||||||
ri->rp->handler(ri, regs);
|
|
||||||
|
if (orig_ret_address != trampoline_address)
|
||||||
|
/*
|
||||||
|
* This is the real return address. Any other
|
||||||
|
* instances associated with this task are for
|
||||||
|
* other calls deeper on the call stack
|
||||||
|
*/
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
kretprobe_assert(ri, orig_ret_address, trampoline_address);
|
||||||
|
|
||||||
|
correct_ret_addr = ri->ret_addr;
|
||||||
|
hlist_for_each_entry_safe(ri, node, tmp, head, hlist) {
|
||||||
|
if (ri->task != current)
|
||||||
|
/* another task is sharing our hash bucket */
|
||||||
|
continue;
|
||||||
|
|
||||||
orig_ret_address = (unsigned long)ri->ret_addr;
|
orig_ret_address = (unsigned long)ri->ret_addr;
|
||||||
|
|
||||||
|
if (ri->rp && ri->rp->handler) {
|
||||||
|
ri->ret_addr = correct_ret_addr;
|
||||||
|
ri->rp->handler(ri, regs);
|
||||||
|
}
|
||||||
|
|
||||||
recycle_rp_inst(ri, &empty_rp);
|
recycle_rp_inst(ri, &empty_rp);
|
||||||
|
|
||||||
if (orig_ret_address != trampoline_address) {
|
if (orig_ret_address != trampoline_address) {
|
||||||
@ -387,7 +409,7 @@ static int __kprobes trampoline_probe_handler(struct kprobe *p,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
kretprobe_assert(ri, orig_ret_address, trampoline_address);
|
|
||||||
regs->psw.addr = orig_ret_address | PSW_ADDR_AMODE;
|
regs->psw.addr = orig_ret_address | PSW_ADDR_AMODE;
|
||||||
|
|
||||||
reset_current_kprobe();
|
reset_current_kprobe();
|
||||||
@ -465,8 +487,6 @@ static int __kprobes post_kprobe_handler(struct pt_regs *regs)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
reset_current_kprobe();
|
reset_current_kprobe();
|
||||||
if (regs->psw.mask & (PSW_MASK_PER | PSW_MASK_IO))
|
|
||||||
local_irq_enable();
|
|
||||||
out:
|
out:
|
||||||
preempt_enable_no_resched();
|
preempt_enable_no_resched();
|
||||||
|
|
||||||
@ -482,7 +502,7 @@ out:
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr)
|
static int __kprobes kprobe_trap_handler(struct pt_regs *regs, int trapnr)
|
||||||
{
|
{
|
||||||
struct kprobe *cur = kprobe_running();
|
struct kprobe *cur = kprobe_running();
|
||||||
struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
|
struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
|
||||||
@ -508,8 +528,6 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr)
|
|||||||
restore_previous_kprobe(kcb);
|
restore_previous_kprobe(kcb);
|
||||||
else {
|
else {
|
||||||
reset_current_kprobe();
|
reset_current_kprobe();
|
||||||
if (regs->psw.mask & (PSW_MASK_PER | PSW_MASK_IO))
|
|
||||||
local_irq_enable();
|
|
||||||
}
|
}
|
||||||
preempt_enable_no_resched();
|
preempt_enable_no_resched();
|
||||||
break;
|
break;
|
||||||
@ -553,6 +571,18 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (regs->psw.mask & (PSW_MASK_IO | PSW_MASK_EXT))
|
||||||
|
local_irq_disable();
|
||||||
|
ret = kprobe_trap_handler(regs, trapnr);
|
||||||
|
if (regs->psw.mask & (PSW_MASK_IO | PSW_MASK_EXT))
|
||||||
|
local_irq_restore(regs->psw.mask & ~PSW_MASK_PER);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Wrapper routine to for handling exceptions.
|
* Wrapper routine to for handling exceptions.
|
||||||
*/
|
*/
|
||||||
@ -560,8 +590,12 @@ int __kprobes kprobe_exceptions_notify(struct notifier_block *self,
|
|||||||
unsigned long val, void *data)
|
unsigned long val, void *data)
|
||||||
{
|
{
|
||||||
struct die_args *args = (struct die_args *)data;
|
struct die_args *args = (struct die_args *)data;
|
||||||
|
struct pt_regs *regs = args->regs;
|
||||||
int ret = NOTIFY_DONE;
|
int ret = NOTIFY_DONE;
|
||||||
|
|
||||||
|
if (regs->psw.mask & (PSW_MASK_IO | PSW_MASK_EXT))
|
||||||
|
local_irq_disable();
|
||||||
|
|
||||||
switch (val) {
|
switch (val) {
|
||||||
case DIE_BPT:
|
case DIE_BPT:
|
||||||
if (kprobe_handler(args->regs))
|
if (kprobe_handler(args->regs))
|
||||||
@ -572,16 +606,17 @@ int __kprobes kprobe_exceptions_notify(struct notifier_block *self,
|
|||||||
ret = NOTIFY_STOP;
|
ret = NOTIFY_STOP;
|
||||||
break;
|
break;
|
||||||
case DIE_TRAP:
|
case DIE_TRAP:
|
||||||
/* kprobe_running() needs smp_processor_id() */
|
if (!preemptible() && kprobe_running() &&
|
||||||
preempt_disable();
|
kprobe_trap_handler(args->regs, args->trapnr))
|
||||||
if (kprobe_running() &&
|
|
||||||
kprobe_fault_handler(args->regs, args->trapnr))
|
|
||||||
ret = NOTIFY_STOP;
|
ret = NOTIFY_STOP;
|
||||||
preempt_enable();
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (regs->psw.mask & (PSW_MASK_IO | PSW_MASK_EXT))
|
||||||
|
local_irq_restore(regs->psw.mask & ~PSW_MASK_PER);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -595,6 +630,7 @@ int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
|
|||||||
|
|
||||||
/* setup return addr to the jprobe handler routine */
|
/* setup return addr to the jprobe handler routine */
|
||||||
regs->psw.addr = (unsigned long)(jp->entry) | PSW_ADDR_AMODE;
|
regs->psw.addr = (unsigned long)(jp->entry) | PSW_ADDR_AMODE;
|
||||||
|
regs->psw.mask &= ~(PSW_MASK_IO | PSW_MASK_EXT);
|
||||||
|
|
||||||
/* r14 is the function return address */
|
/* r14 is the function return address */
|
||||||
kcb->jprobe_saved_r14 = (unsigned long)regs->gprs[14];
|
kcb->jprobe_saved_r14 = (unsigned long)regs->gprs[14];
|
||||||
|
@ -20,18 +20,17 @@
|
|||||||
static inline int gup_pte_range(pmd_t *pmdp, pmd_t pmd, unsigned long addr,
|
static inline int gup_pte_range(pmd_t *pmdp, pmd_t pmd, unsigned long addr,
|
||||||
unsigned long end, int write, struct page **pages, int *nr)
|
unsigned long end, int write, struct page **pages, int *nr)
|
||||||
{
|
{
|
||||||
unsigned long mask, result;
|
unsigned long mask;
|
||||||
pte_t *ptep, pte;
|
pte_t *ptep, pte;
|
||||||
struct page *page;
|
struct page *page;
|
||||||
|
|
||||||
result = write ? 0 : _PAGE_RO;
|
mask = (write ? _PAGE_RO : 0) | _PAGE_INVALID | _PAGE_SPECIAL;
|
||||||
mask = result | _PAGE_INVALID | _PAGE_SPECIAL;
|
|
||||||
|
|
||||||
ptep = ((pte_t *) pmd_deref(pmd)) + pte_index(addr);
|
ptep = ((pte_t *) pmd_deref(pmd)) + pte_index(addr);
|
||||||
do {
|
do {
|
||||||
pte = *ptep;
|
pte = *ptep;
|
||||||
barrier();
|
barrier();
|
||||||
if ((pte_val(pte) & mask) != result)
|
if ((pte_val(pte) & mask) != 0)
|
||||||
return 0;
|
return 0;
|
||||||
VM_BUG_ON(!pfn_valid(pte_pfn(pte)));
|
VM_BUG_ON(!pfn_valid(pte_pfn(pte)));
|
||||||
page = pte_page(pte);
|
page = pte_page(pte);
|
||||||
|
@ -193,6 +193,7 @@ config CPU_SH2
|
|||||||
config CPU_SH2A
|
config CPU_SH2A
|
||||||
bool
|
bool
|
||||||
select CPU_SH2
|
select CPU_SH2
|
||||||
|
select UNCACHED_MAPPING
|
||||||
|
|
||||||
config CPU_SH3
|
config CPU_SH3
|
||||||
bool
|
bool
|
||||||
|
@ -133,10 +133,7 @@ machdir-$(CONFIG_SOLUTION_ENGINE) += mach-se
|
|||||||
machdir-$(CONFIG_SH_HP6XX) += mach-hp6xx
|
machdir-$(CONFIG_SH_HP6XX) += mach-hp6xx
|
||||||
machdir-$(CONFIG_SH_DREAMCAST) += mach-dreamcast
|
machdir-$(CONFIG_SH_DREAMCAST) += mach-dreamcast
|
||||||
machdir-$(CONFIG_SH_SH03) += mach-sh03
|
machdir-$(CONFIG_SH_SH03) += mach-sh03
|
||||||
machdir-$(CONFIG_SH_SECUREEDGE5410) += mach-snapgear
|
|
||||||
machdir-$(CONFIG_SH_RTS7751R2D) += mach-r2d
|
machdir-$(CONFIG_SH_RTS7751R2D) += mach-r2d
|
||||||
machdir-$(CONFIG_SH_7751_SYSTEMH) += mach-systemh
|
|
||||||
machdir-$(CONFIG_SH_EDOSK7705) += mach-edosk7705
|
|
||||||
machdir-$(CONFIG_SH_HIGHLANDER) += mach-highlander
|
machdir-$(CONFIG_SH_HIGHLANDER) += mach-highlander
|
||||||
machdir-$(CONFIG_SH_MIGOR) += mach-migor
|
machdir-$(CONFIG_SH_MIGOR) += mach-migor
|
||||||
machdir-$(CONFIG_SH_AP325RXA) += mach-ap325rxa
|
machdir-$(CONFIG_SH_AP325RXA) += mach-ap325rxa
|
||||||
|
@ -81,13 +81,6 @@ config SH_7343_SOLUTION_ENGINE
|
|||||||
Select 7343 SolutionEngine if configuring for a Hitachi
|
Select 7343 SolutionEngine if configuring for a Hitachi
|
||||||
SH7343 (SH-Mobile 3AS) evaluation board.
|
SH7343 (SH-Mobile 3AS) evaluation board.
|
||||||
|
|
||||||
config SH_7751_SYSTEMH
|
|
||||||
bool "SystemH7751R"
|
|
||||||
depends on CPU_SUBTYPE_SH7751R
|
|
||||||
help
|
|
||||||
Select SystemH if you are configuring for a Renesas SystemH
|
|
||||||
7751R evaluation board.
|
|
||||||
|
|
||||||
config SH_HP6XX
|
config SH_HP6XX
|
||||||
bool "HP6XX"
|
bool "HP6XX"
|
||||||
select SYS_SUPPORTS_APM_EMULATION
|
select SYS_SUPPORTS_APM_EMULATION
|
||||||
|
@ -2,10 +2,12 @@
|
|||||||
# Specific board support, not covered by a mach group.
|
# Specific board support, not covered by a mach group.
|
||||||
#
|
#
|
||||||
obj-$(CONFIG_SH_MAGIC_PANEL_R2) += board-magicpanelr2.o
|
obj-$(CONFIG_SH_MAGIC_PANEL_R2) += board-magicpanelr2.o
|
||||||
|
obj-$(CONFIG_SH_SECUREEDGE5410) += board-secureedge5410.o
|
||||||
obj-$(CONFIG_SH_SH2007) += board-sh2007.o
|
obj-$(CONFIG_SH_SH2007) += board-sh2007.o
|
||||||
obj-$(CONFIG_SH_SH7785LCR) += board-sh7785lcr.o
|
obj-$(CONFIG_SH_SH7785LCR) += board-sh7785lcr.o
|
||||||
obj-$(CONFIG_SH_URQUELL) += board-urquell.o
|
obj-$(CONFIG_SH_URQUELL) += board-urquell.o
|
||||||
obj-$(CONFIG_SH_SHMIN) += board-shmin.o
|
obj-$(CONFIG_SH_SHMIN) += board-shmin.o
|
||||||
|
obj-$(CONFIG_SH_EDOSK7705) += board-edosk7705.o
|
||||||
obj-$(CONFIG_SH_EDOSK7760) += board-edosk7760.o
|
obj-$(CONFIG_SH_EDOSK7760) += board-edosk7760.o
|
||||||
obj-$(CONFIG_SH_ESPT) += board-espt.o
|
obj-$(CONFIG_SH_ESPT) += board-espt.o
|
||||||
obj-$(CONFIG_SH_POLARIS) += board-polaris.o
|
obj-$(CONFIG_SH_POLARIS) += board-polaris.o
|
||||||
|
78
arch/sh/boards/board-edosk7705.c
Normal file
78
arch/sh/boards/board-edosk7705.c
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
* arch/sh/boards/renesas/edosk7705/setup.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2000 Kazumoto Kojima
|
||||||
|
*
|
||||||
|
* Hitachi SolutionEngine Support.
|
||||||
|
*
|
||||||
|
* Modified for edosk7705 development
|
||||||
|
* board by S. Dunn, 2003.
|
||||||
|
*/
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/irq.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/interrupt.h>
|
||||||
|
#include <linux/smc91x.h>
|
||||||
|
#include <asm/machvec.h>
|
||||||
|
#include <asm/sizes.h>
|
||||||
|
|
||||||
|
#define SMC_IOBASE 0xA2000000
|
||||||
|
#define SMC_IO_OFFSET 0x300
|
||||||
|
#define SMC_IOADDR (SMC_IOBASE + SMC_IO_OFFSET)
|
||||||
|
|
||||||
|
#define ETHERNET_IRQ 0x09
|
||||||
|
|
||||||
|
static void __init sh_edosk7705_init_irq(void)
|
||||||
|
{
|
||||||
|
make_imask_irq(ETHERNET_IRQ);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* eth initialization functions */
|
||||||
|
static struct smc91x_platdata smc91x_info = {
|
||||||
|
.flags = SMC91X_USE_16BIT | SMC91X_IO_SHIFT_1 | IORESOURCE_IRQ_LOWLEVEL,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct resource smc91x_res[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = SMC_IOADDR,
|
||||||
|
.end = SMC_IOADDR + SZ_32 - 1,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = ETHERNET_IRQ,
|
||||||
|
.end = ETHERNET_IRQ,
|
||||||
|
.flags = IORESOURCE_IRQ ,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device smc91x_dev = {
|
||||||
|
.name = "smc91x",
|
||||||
|
.id = -1,
|
||||||
|
.num_resources = ARRAY_SIZE(smc91x_res),
|
||||||
|
.resource = smc91x_res,
|
||||||
|
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &smc91x_info,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
/* platform init code */
|
||||||
|
static struct platform_device *edosk7705_devices[] __initdata = {
|
||||||
|
&smc91x_dev,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init init_edosk7705_devices(void)
|
||||||
|
{
|
||||||
|
return platform_add_devices(edosk7705_devices,
|
||||||
|
ARRAY_SIZE(edosk7705_devices));
|
||||||
|
}
|
||||||
|
__initcall(init_edosk7705_devices);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The Machine Vector
|
||||||
|
*/
|
||||||
|
static struct sh_machine_vector mv_edosk7705 __initmv = {
|
||||||
|
.mv_name = "EDOSK7705",
|
||||||
|
.mv_nr_irqs = 80,
|
||||||
|
.mv_init_irq = sh_edosk7705_init_irq,
|
||||||
|
};
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user