Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
This commit is contained in:
commit
e0aa51f54f
@ -144,3 +144,16 @@ Description:
|
||||
|
||||
Write a 1 to force the device to disconnect
|
||||
(equivalent to unplugging a wired USB device).
|
||||
|
||||
What: /sys/bus/usb/drivers/.../remove_id
|
||||
Date: November 2009
|
||||
Contact: CHENG Renquan <rqcheng@smu.edu.sg>
|
||||
Description:
|
||||
Writing a device ID to this file will remove an ID
|
||||
that was dynamically added via the new_id sysfs entry.
|
||||
The format for the device ID is:
|
||||
idVendor idProduct. After successfully
|
||||
removing an ID, the driver will no longer support the
|
||||
device. This is useful to ensure auto probing won't
|
||||
match the driver to the device. For example:
|
||||
# echo "046d c315" > /sys/bus/usb/drivers/foo/remove_id
|
||||
|
@ -23,3 +23,16 @@ Description:
|
||||
Since this relates to security (specifically, the
|
||||
lifetime of PTKs and GTKs) it should not be changed
|
||||
from the default.
|
||||
|
||||
What: /sys/class/uwb_rc/uwbN/wusbhc/wusb_phy_rate
|
||||
Date: August 2009
|
||||
KernelVersion: 2.6.32
|
||||
Contact: David Vrabel <david.vrabel@csr.com>
|
||||
Description:
|
||||
The maximum PHY rate to use for all connected devices.
|
||||
This is only of limited use for testing and
|
||||
development as the hardware's automatic rate
|
||||
adaptation is better then this simple control.
|
||||
|
||||
Refer to [ECMA-368] section 10.3.1.1 for the value to
|
||||
use.
|
||||
|
@ -62,6 +62,21 @@ Description: CPU topology files that describe kernel limits related to
|
||||
See Documentation/cputopology.txt for more information.
|
||||
|
||||
|
||||
What: /sys/devices/system/cpu/probe
|
||||
/sys/devices/system/cpu/release
|
||||
Date: November 2009
|
||||
Contact: Linux kernel mailing list <linux-kernel@vger.kernel.org>
|
||||
Description: Dynamic addition and removal of CPU's. This is not hotplug
|
||||
removal, this is meant complete removal/addition of the CPU
|
||||
from the system.
|
||||
|
||||
probe: writes to this file will dynamically add a CPU to the
|
||||
system. Information written to the file to add CPU's is
|
||||
architecture specific.
|
||||
|
||||
release: writes to this file dynamically remove a CPU from
|
||||
the system. Information writtento the file to remove CPU's
|
||||
is architecture specific.
|
||||
|
||||
What: /sys/devices/system/cpu/cpu#/node
|
||||
Date: October 2009
|
||||
@ -136,6 +151,24 @@ Description: Discover cpuidle policy and mechanism
|
||||
See files in Documentation/cpuidle/ for more information.
|
||||
|
||||
|
||||
What: /sys/devices/system/cpu/cpu#/cpufreq/*
|
||||
Date: pre-git history
|
||||
Contact: cpufreq@vger.kernel.org
|
||||
Description: Discover and change clock speed of CPUs
|
||||
|
||||
Clock scaling allows you to change the clock speed of the
|
||||
CPUs on the fly. This is a nice method to save battery
|
||||
power, because the lower the clock speed, the less power
|
||||
the CPU consumes.
|
||||
|
||||
There are many knobs to tweak in this directory.
|
||||
|
||||
See files in Documentation/cpu-freq/ for more information.
|
||||
|
||||
In particular, read Documentation/cpu-freq/user-guide.txt
|
||||
to learn how to control the knobs.
|
||||
|
||||
|
||||
What: /sys/devices/system/cpu/cpu*/cache/index*/cache_disable_X
|
||||
Date: August 2008
|
||||
KernelVersion: 2.6.27
|
||||
|
@ -45,8 +45,9 @@ KernelVersion: 2.6.25
|
||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||
Christoph Lameter <cl@linux-foundation.org>
|
||||
Description:
|
||||
The alloc_fastpath file is read-only and specifies how many
|
||||
objects have been allocated using the fast path.
|
||||
The alloc_fastpath file shows how many objects have been
|
||||
allocated using the fast path. It can be written to clear the
|
||||
current count.
|
||||
Available when CONFIG_SLUB_STATS is enabled.
|
||||
|
||||
What: /sys/kernel/slab/cache/alloc_from_partial
|
||||
@ -55,9 +56,10 @@ KernelVersion: 2.6.25
|
||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||
Christoph Lameter <cl@linux-foundation.org>
|
||||
Description:
|
||||
The alloc_from_partial file is read-only and specifies how
|
||||
many times a cpu slab has been full and it has been refilled
|
||||
by using a slab from the list of partially used slabs.
|
||||
The alloc_from_partial file shows how many times a cpu slab has
|
||||
been full and it has been refilled by using a slab from the list
|
||||
of partially used slabs. It can be written to clear the current
|
||||
count.
|
||||
Available when CONFIG_SLUB_STATS is enabled.
|
||||
|
||||
What: /sys/kernel/slab/cache/alloc_refill
|
||||
@ -66,9 +68,9 @@ KernelVersion: 2.6.25
|
||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||
Christoph Lameter <cl@linux-foundation.org>
|
||||
Description:
|
||||
The alloc_refill file is read-only and specifies how many
|
||||
times the per-cpu freelist was empty but there were objects
|
||||
available as the result of remote cpu frees.
|
||||
The alloc_refill file shows how many times the per-cpu freelist
|
||||
was empty but there were objects available as the result of
|
||||
remote cpu frees. It can be written to clear the current count.
|
||||
Available when CONFIG_SLUB_STATS is enabled.
|
||||
|
||||
What: /sys/kernel/slab/cache/alloc_slab
|
||||
@ -77,8 +79,9 @@ KernelVersion: 2.6.25
|
||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||
Christoph Lameter <cl@linux-foundation.org>
|
||||
Description:
|
||||
The alloc_slab file is read-only and specifies how many times
|
||||
a new slab had to be allocated from the page allocator.
|
||||
The alloc_slab file is shows how many times a new slab had to
|
||||
be allocated from the page allocator. It can be written to
|
||||
clear the current count.
|
||||
Available when CONFIG_SLUB_STATS is enabled.
|
||||
|
||||
What: /sys/kernel/slab/cache/alloc_slowpath
|
||||
@ -87,9 +90,10 @@ KernelVersion: 2.6.25
|
||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||
Christoph Lameter <cl@linux-foundation.org>
|
||||
Description:
|
||||
The alloc_slowpath file is read-only and specifies how many
|
||||
objects have been allocated using the slow path because of a
|
||||
refill or allocation from a partial or new slab.
|
||||
The alloc_slowpath file shows how many objects have been
|
||||
allocated using the slow path because of a refill or
|
||||
allocation from a partial or new slab. It can be written to
|
||||
clear the current count.
|
||||
Available when CONFIG_SLUB_STATS is enabled.
|
||||
|
||||
What: /sys/kernel/slab/cache/cache_dma
|
||||
@ -117,10 +121,11 @@ KernelVersion: 2.6.31
|
||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||
Christoph Lameter <cl@linux-foundation.org>
|
||||
Description:
|
||||
The file cpuslab_flush is read-only and specifies how many
|
||||
times a cache's cpu slabs have been flushed as the result of
|
||||
destroying or shrinking a cache, a cpu going offline, or as
|
||||
the result of forcing an allocation from a certain node.
|
||||
The file cpuslab_flush shows how many times a cache's cpu slabs
|
||||
have been flushed as the result of destroying or shrinking a
|
||||
cache, a cpu going offline, or as the result of forcing an
|
||||
allocation from a certain node. It can be written to clear the
|
||||
current count.
|
||||
Available when CONFIG_SLUB_STATS is enabled.
|
||||
|
||||
What: /sys/kernel/slab/cache/ctor
|
||||
@ -139,8 +144,8 @@ KernelVersion: 2.6.25
|
||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||
Christoph Lameter <cl@linux-foundation.org>
|
||||
Description:
|
||||
The file deactivate_empty is read-only and specifies how many
|
||||
times an empty cpu slab was deactivated.
|
||||
The deactivate_empty file shows how many times an empty cpu slab
|
||||
was deactivated. It can be written to clear the current count.
|
||||
Available when CONFIG_SLUB_STATS is enabled.
|
||||
|
||||
What: /sys/kernel/slab/cache/deactivate_full
|
||||
@ -149,8 +154,8 @@ KernelVersion: 2.6.25
|
||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||
Christoph Lameter <cl@linux-foundation.org>
|
||||
Description:
|
||||
The file deactivate_full is read-only and specifies how many
|
||||
times a full cpu slab was deactivated.
|
||||
The deactivate_full file shows how many times a full cpu slab
|
||||
was deactivated. It can be written to clear the current count.
|
||||
Available when CONFIG_SLUB_STATS is enabled.
|
||||
|
||||
What: /sys/kernel/slab/cache/deactivate_remote_frees
|
||||
@ -159,9 +164,9 @@ KernelVersion: 2.6.25
|
||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||
Christoph Lameter <cl@linux-foundation.org>
|
||||
Description:
|
||||
The file deactivate_remote_frees is read-only and specifies how
|
||||
many times a cpu slab has been deactivated and contained free
|
||||
objects that were freed remotely.
|
||||
The deactivate_remote_frees file shows how many times a cpu slab
|
||||
has been deactivated and contained free objects that were freed
|
||||
remotely. It can be written to clear the current count.
|
||||
Available when CONFIG_SLUB_STATS is enabled.
|
||||
|
||||
What: /sys/kernel/slab/cache/deactivate_to_head
|
||||
@ -170,9 +175,9 @@ KernelVersion: 2.6.25
|
||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||
Christoph Lameter <cl@linux-foundation.org>
|
||||
Description:
|
||||
The file deactivate_to_head is read-only and specifies how
|
||||
many times a partial cpu slab was deactivated and added to the
|
||||
head of its node's partial list.
|
||||
The deactivate_to_head file shows how many times a partial cpu
|
||||
slab was deactivated and added to the head of its node's partial
|
||||
list. It can be written to clear the current count.
|
||||
Available when CONFIG_SLUB_STATS is enabled.
|
||||
|
||||
What: /sys/kernel/slab/cache/deactivate_to_tail
|
||||
@ -181,9 +186,9 @@ KernelVersion: 2.6.25
|
||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||
Christoph Lameter <cl@linux-foundation.org>
|
||||
Description:
|
||||
The file deactivate_to_tail is read-only and specifies how
|
||||
many times a partial cpu slab was deactivated and added to the
|
||||
tail of its node's partial list.
|
||||
The deactivate_to_tail file shows how many times a partial cpu
|
||||
slab was deactivated and added to the tail of its node's partial
|
||||
list. It can be written to clear the current count.
|
||||
Available when CONFIG_SLUB_STATS is enabled.
|
||||
|
||||
What: /sys/kernel/slab/cache/destroy_by_rcu
|
||||
@ -201,9 +206,9 @@ KernelVersion: 2.6.25
|
||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||
Christoph Lameter <cl@linux-foundation.org>
|
||||
Description:
|
||||
The file free_add_partial is read-only and specifies how many
|
||||
times an object has been freed in a full slab so that it had to
|
||||
added to its node's partial list.
|
||||
The free_add_partial file shows how many times an object has
|
||||
been freed in a full slab so that it had to added to its node's
|
||||
partial list. It can be written to clear the current count.
|
||||
Available when CONFIG_SLUB_STATS is enabled.
|
||||
|
||||
What: /sys/kernel/slab/cache/free_calls
|
||||
@ -222,9 +227,9 @@ KernelVersion: 2.6.25
|
||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||
Christoph Lameter <cl@linux-foundation.org>
|
||||
Description:
|
||||
The free_fastpath file is read-only and specifies how many
|
||||
objects have been freed using the fast path because it was an
|
||||
object from the cpu slab.
|
||||
The free_fastpath file shows how many objects have been freed
|
||||
using the fast path because it was an object from the cpu slab.
|
||||
It can be written to clear the current count.
|
||||
Available when CONFIG_SLUB_STATS is enabled.
|
||||
|
||||
What: /sys/kernel/slab/cache/free_frozen
|
||||
@ -233,9 +238,9 @@ KernelVersion: 2.6.25
|
||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||
Christoph Lameter <cl@linux-foundation.org>
|
||||
Description:
|
||||
The free_frozen file is read-only and specifies how many
|
||||
objects have been freed to a frozen slab (i.e. a remote cpu
|
||||
slab).
|
||||
The free_frozen file shows how many objects have been freed to
|
||||
a frozen slab (i.e. a remote cpu slab). It can be written to
|
||||
clear the current count.
|
||||
Available when CONFIG_SLUB_STATS is enabled.
|
||||
|
||||
What: /sys/kernel/slab/cache/free_remove_partial
|
||||
@ -244,9 +249,10 @@ KernelVersion: 2.6.25
|
||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||
Christoph Lameter <cl@linux-foundation.org>
|
||||
Description:
|
||||
The file free_remove_partial is read-only and specifies how
|
||||
many times an object has been freed to a now-empty slab so
|
||||
that it had to be removed from its node's partial list.
|
||||
The free_remove_partial file shows how many times an object has
|
||||
been freed to a now-empty slab so that it had to be removed from
|
||||
its node's partial list. It can be written to clear the current
|
||||
count.
|
||||
Available when CONFIG_SLUB_STATS is enabled.
|
||||
|
||||
What: /sys/kernel/slab/cache/free_slab
|
||||
@ -255,8 +261,9 @@ KernelVersion: 2.6.25
|
||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||
Christoph Lameter <cl@linux-foundation.org>
|
||||
Description:
|
||||
The free_slab file is read-only and specifies how many times an
|
||||
empty slab has been freed back to the page allocator.
|
||||
The free_slab file shows how many times an empty slab has been
|
||||
freed back to the page allocator. It can be written to clear
|
||||
the current count.
|
||||
Available when CONFIG_SLUB_STATS is enabled.
|
||||
|
||||
What: /sys/kernel/slab/cache/free_slowpath
|
||||
@ -265,9 +272,9 @@ KernelVersion: 2.6.25
|
||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||
Christoph Lameter <cl@linux-foundation.org>
|
||||
Description:
|
||||
The free_slowpath file is read-only and specifies how many
|
||||
objects have been freed using the slow path (i.e. to a full or
|
||||
partial slab).
|
||||
The free_slowpath file shows how many objects have been freed
|
||||
using the slow path (i.e. to a full or partial slab). It can
|
||||
be written to clear the current count.
|
||||
Available when CONFIG_SLUB_STATS is enabled.
|
||||
|
||||
What: /sys/kernel/slab/cache/hwcache_align
|
||||
@ -346,10 +353,10 @@ KernelVersion: 2.6.26
|
||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||
Christoph Lameter <cl@linux-foundation.org>
|
||||
Description:
|
||||
The file order_fallback is read-only and specifies how many
|
||||
times an allocation of a new slab has not been possible at the
|
||||
cache's order and instead fallen back to its minimum possible
|
||||
order.
|
||||
The order_fallback file shows how many times an allocation of a
|
||||
new slab has not been possible at the cache's order and instead
|
||||
fallen back to its minimum possible order. It can be written to
|
||||
clear the current count.
|
||||
Available when CONFIG_SLUB_STATS is enabled.
|
||||
|
||||
What: /sys/kernel/slab/cache/partial
|
||||
|
317
Documentation/arm/OMAP/DSS
Normal file
317
Documentation/arm/OMAP/DSS
Normal file
@ -0,0 +1,317 @@
|
||||
OMAP2/3 Display Subsystem
|
||||
-------------------------
|
||||
|
||||
This is an almost total rewrite of the OMAP FB driver in drivers/video/omap
|
||||
(let's call it DSS1). The main differences between DSS1 and DSS2 are DSI,
|
||||
TV-out and multiple display support, but there are lots of small improvements
|
||||
also.
|
||||
|
||||
The DSS2 driver (omapdss module) is in arch/arm/plat-omap/dss/, and the FB,
|
||||
panel and controller drivers are in drivers/video/omap2/. DSS1 and DSS2 live
|
||||
currently side by side, you can choose which one to use.
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
Working and tested features include:
|
||||
|
||||
- MIPI DPI (parallel) output
|
||||
- MIPI DSI output in command mode
|
||||
- MIPI DBI (RFBI) output
|
||||
- SDI output
|
||||
- TV output
|
||||
- All pieces can be compiled as a module or inside kernel
|
||||
- Use DISPC to update any of the outputs
|
||||
- Use CPU to update RFBI or DSI output
|
||||
- OMAP DISPC planes
|
||||
- RGB16, RGB24 packed, RGB24 unpacked
|
||||
- YUV2, UYVY
|
||||
- Scaling
|
||||
- Adjusting DSS FCK to find a good pixel clock
|
||||
- Use DSI DPLL to create DSS FCK
|
||||
|
||||
Tested boards include:
|
||||
- OMAP3 SDP board
|
||||
- Beagle board
|
||||
- N810
|
||||
|
||||
omapdss driver
|
||||
--------------
|
||||
|
||||
The DSS driver does not itself have any support for Linux framebuffer, V4L or
|
||||
such like the current ones, but it has an internal kernel API that upper level
|
||||
drivers can use.
|
||||
|
||||
The DSS driver models OMAP's overlays, overlay managers and displays in a
|
||||
flexible way to enable non-common multi-display configuration. In addition to
|
||||
modelling the hardware overlays, omapdss supports virtual overlays and overlay
|
||||
managers. These can be used when updating a display with CPU or system DMA.
|
||||
|
||||
Panel and controller drivers
|
||||
----------------------------
|
||||
|
||||
The drivers implement panel or controller specific functionality and are not
|
||||
usually visible to users except through omapfb driver. They register
|
||||
themselves to the DSS driver.
|
||||
|
||||
omapfb driver
|
||||
-------------
|
||||
|
||||
The omapfb driver implements arbitrary number of standard linux framebuffers.
|
||||
These framebuffers can be routed flexibly to any overlays, thus allowing very
|
||||
dynamic display architecture.
|
||||
|
||||
The driver exports some omapfb specific ioctls, which are compatible with the
|
||||
ioctls in the old driver.
|
||||
|
||||
The rest of the non standard features are exported via sysfs. Whether the final
|
||||
implementation will use sysfs, or ioctls, is still open.
|
||||
|
||||
V4L2 drivers
|
||||
------------
|
||||
|
||||
V4L2 is being implemented in TI.
|
||||
|
||||
From omapdss point of view the V4L2 drivers should be similar to framebuffer
|
||||
driver.
|
||||
|
||||
Architecture
|
||||
--------------------
|
||||
|
||||
Some clarification what the different components do:
|
||||
|
||||
- Framebuffer is a memory area inside OMAP's SRAM/SDRAM that contains the
|
||||
pixel data for the image. Framebuffer has width and height and color
|
||||
depth.
|
||||
- Overlay defines where the pixels are read from and where they go on the
|
||||
screen. The overlay may be smaller than framebuffer, thus displaying only
|
||||
part of the framebuffer. The position of the overlay may be changed if
|
||||
the overlay is smaller than the display.
|
||||
- Overlay manager combines the overlays in to one image and feeds them to
|
||||
display.
|
||||
- Display is the actual physical display device.
|
||||
|
||||
A framebuffer can be connected to multiple overlays to show the same pixel data
|
||||
on all of the overlays. Note that in this case the overlay input sizes must be
|
||||
the same, but, in case of video overlays, the output size can be different. Any
|
||||
framebuffer can be connected to any overlay.
|
||||
|
||||
An overlay can be connected to one overlay manager. Also DISPC overlays can be
|
||||
connected only to DISPC overlay managers, and virtual overlays can be only
|
||||
connected to virtual overlays.
|
||||
|
||||
An overlay manager can be connected to one display. There are certain
|
||||
restrictions which kinds of displays an overlay manager can be connected:
|
||||
|
||||
- DISPC TV overlay manager can be only connected to TV display.
|
||||
- Virtual overlay managers can only be connected to DBI or DSI displays.
|
||||
- DISPC LCD overlay manager can be connected to all displays, except TV
|
||||
display.
|
||||
|
||||
Sysfs
|
||||
-----
|
||||
The sysfs interface is mainly used for testing. I don't think sysfs
|
||||
interface is the best for this in the final version, but I don't quite know
|
||||
what would be the best interfaces for these things.
|
||||
|
||||
The sysfs interface is divided to two parts: DSS and FB.
|
||||
|
||||
/sys/class/graphics/fb? directory:
|
||||
mirror 0=off, 1=on
|
||||
rotate Rotation 0-3 for 0, 90, 180, 270 degrees
|
||||
rotate_type 0 = DMA rotation, 1 = VRFB rotation
|
||||
overlays List of overlay numbers to which framebuffer pixels go
|
||||
phys_addr Physical address of the framebuffer
|
||||
virt_addr Virtual address of the framebuffer
|
||||
size Size of the framebuffer
|
||||
|
||||
/sys/devices/platform/omapdss/overlay? directory:
|
||||
enabled 0=off, 1=on
|
||||
input_size width,height (ie. the framebuffer size)
|
||||
manager Destination overlay manager name
|
||||
name
|
||||
output_size width,height
|
||||
position x,y
|
||||
screen_width width
|
||||
global_alpha global alpha 0-255 0=transparent 255=opaque
|
||||
|
||||
/sys/devices/platform/omapdss/manager? directory:
|
||||
display Destination display
|
||||
name
|
||||
alpha_blending_enabled 0=off, 1=on
|
||||
trans_key_enabled 0=off, 1=on
|
||||
trans_key_type gfx-destination, video-source
|
||||
trans_key_value transparency color key (RGB24)
|
||||
default_color default background color (RGB24)
|
||||
|
||||
/sys/devices/platform/omapdss/display? directory:
|
||||
ctrl_name Controller name
|
||||
mirror 0=off, 1=on
|
||||
update_mode 0=off, 1=auto, 2=manual
|
||||
enabled 0=off, 1=on
|
||||
name
|
||||
rotate Rotation 0-3 for 0, 90, 180, 270 degrees
|
||||
timings Display timings (pixclock,xres/hfp/hbp/hsw,yres/vfp/vbp/vsw)
|
||||
When writing, two special timings are accepted for tv-out:
|
||||
"pal" and "ntsc"
|
||||
panel_name
|
||||
tear_elim Tearing elimination 0=off, 1=on
|
||||
|
||||
There are also some debugfs files at <debugfs>/omapdss/ which show information
|
||||
about clocks and registers.
|
||||
|
||||
Examples
|
||||
--------
|
||||
|
||||
The following definitions have been made for the examples below:
|
||||
|
||||
ovl0=/sys/devices/platform/omapdss/overlay0
|
||||
ovl1=/sys/devices/platform/omapdss/overlay1
|
||||
ovl2=/sys/devices/platform/omapdss/overlay2
|
||||
|
||||
mgr0=/sys/devices/platform/omapdss/manager0
|
||||
mgr1=/sys/devices/platform/omapdss/manager1
|
||||
|
||||
lcd=/sys/devices/platform/omapdss/display0
|
||||
dvi=/sys/devices/platform/omapdss/display1
|
||||
tv=/sys/devices/platform/omapdss/display2
|
||||
|
||||
fb0=/sys/class/graphics/fb0
|
||||
fb1=/sys/class/graphics/fb1
|
||||
fb2=/sys/class/graphics/fb2
|
||||
|
||||
Default setup on OMAP3 SDP
|
||||
--------------------------
|
||||
|
||||
Here's the default setup on OMAP3 SDP board. All planes go to LCD. DVI
|
||||
and TV-out are not in use. The columns from left to right are:
|
||||
framebuffers, overlays, overlay managers, displays. Framebuffers are
|
||||
handled by omapfb, and the rest by the DSS.
|
||||
|
||||
FB0 --- GFX -\ DVI
|
||||
FB1 --- VID1 --+- LCD ---- LCD
|
||||
FB2 --- VID2 -/ TV ----- TV
|
||||
|
||||
Example: Switch from LCD to DVI
|
||||
----------------------
|
||||
|
||||
w=`cat $dvi/timings | cut -d "," -f 2 | cut -d "/" -f 1`
|
||||
h=`cat $dvi/timings | cut -d "," -f 3 | cut -d "/" -f 1`
|
||||
|
||||
echo "0" > $lcd/enabled
|
||||
echo "" > $mgr0/display
|
||||
fbset -fb /dev/fb0 -xres $w -yres $h -vxres $w -vyres $h
|
||||
# at this point you have to switch the dvi/lcd dip-switch from the omap board
|
||||
echo "dvi" > $mgr0/display
|
||||
echo "1" > $dvi/enabled
|
||||
|
||||
After this the configuration looks like:
|
||||
|
||||
FB0 --- GFX -\ -- DVI
|
||||
FB1 --- VID1 --+- LCD -/ LCD
|
||||
FB2 --- VID2 -/ TV ----- TV
|
||||
|
||||
Example: Clone GFX overlay to LCD and TV
|
||||
-------------------------------
|
||||
|
||||
w=`cat $tv/timings | cut -d "," -f 2 | cut -d "/" -f 1`
|
||||
h=`cat $tv/timings | cut -d "," -f 3 | cut -d "/" -f 1`
|
||||
|
||||
echo "0" > $ovl0/enabled
|
||||
echo "0" > $ovl1/enabled
|
||||
|
||||
echo "" > $fb1/overlays
|
||||
echo "0,1" > $fb0/overlays
|
||||
|
||||
echo "$w,$h" > $ovl1/output_size
|
||||
echo "tv" > $ovl1/manager
|
||||
|
||||
echo "1" > $ovl0/enabled
|
||||
echo "1" > $ovl1/enabled
|
||||
|
||||
echo "1" > $tv/enabled
|
||||
|
||||
After this the configuration looks like (only relevant parts shown):
|
||||
|
||||
FB0 +-- GFX ---- LCD ---- LCD
|
||||
\- VID1 ---- TV ---- TV
|
||||
|
||||
Misc notes
|
||||
----------
|
||||
|
||||
OMAP FB allocates the framebuffer memory using the OMAP VRAM allocator.
|
||||
|
||||
Using DSI DPLL to generate pixel clock it is possible produce the pixel clock
|
||||
of 86.5MHz (max possible), and with that you get 1280x1024@57 output from DVI.
|
||||
|
||||
Rotation and mirroring currently only supports RGB565 and RGB8888 modes. VRFB
|
||||
does not support mirroring.
|
||||
|
||||
VRFB rotation requires much more memory than non-rotated framebuffer, so you
|
||||
probably need to increase your vram setting before using VRFB rotation. Also,
|
||||
many applications may not work with VRFB if they do not pay attention to all
|
||||
framebuffer parameters.
|
||||
|
||||
Kernel boot arguments
|
||||
---------------------
|
||||
|
||||
vram=<size>
|
||||
- Amount of total VRAM to preallocate. For example, "10M". omapfb
|
||||
allocates memory for framebuffers from VRAM.
|
||||
|
||||
omapfb.mode=<display>:<mode>[,...]
|
||||
- Default video mode for specified displays. For example,
|
||||
"dvi:800x400MR-24@60". See drivers/video/modedb.c.
|
||||
There are also two special modes: "pal" and "ntsc" that
|
||||
can be used to tv out.
|
||||
|
||||
omapfb.vram=<fbnum>:<size>[@<physaddr>][,...]
|
||||
- VRAM allocated for a framebuffer. Normally omapfb allocates vram
|
||||
depending on the display size. With this you can manually allocate
|
||||
more or define the physical address of each framebuffer. For example,
|
||||
"1:4M" to allocate 4M for fb1.
|
||||
|
||||
omapfb.debug=<y|n>
|
||||
- Enable debug printing. You have to have OMAPFB debug support enabled
|
||||
in kernel config.
|
||||
|
||||
omapfb.test=<y|n>
|
||||
- Draw test pattern to framebuffer whenever framebuffer settings change.
|
||||
You need to have OMAPFB debug support enabled in kernel config.
|
||||
|
||||
omapfb.vrfb=<y|n>
|
||||
- Use VRFB rotation for all framebuffers.
|
||||
|
||||
omapfb.rotate=<angle>
|
||||
- Default rotation applied to all framebuffers.
|
||||
0 - 0 degree rotation
|
||||
1 - 90 degree rotation
|
||||
2 - 180 degree rotation
|
||||
3 - 270 degree rotation
|
||||
|
||||
omapfb.mirror=<y|n>
|
||||
- Default mirror for all framebuffers. Only works with DMA rotation.
|
||||
|
||||
omapdss.def_disp=<display>
|
||||
- Name of default display, to which all overlays will be connected.
|
||||
Common examples are "lcd" or "tv".
|
||||
|
||||
omapdss.debug=<y|n>
|
||||
- Enable debug printing. You have to have DSS debug support enabled in
|
||||
kernel config.
|
||||
|
||||
TODO
|
||||
----
|
||||
|
||||
DSS locking
|
||||
|
||||
Error checking
|
||||
- Lots of checks are missing or implemented just as BUG()
|
||||
|
||||
System DMA update for DSI
|
||||
- Can be used for RGB16 and RGB24P modes. Probably not for RGB24U (how
|
||||
to skip the empty byte?)
|
||||
|
||||
OMAP1 support
|
||||
- Not sure if needed
|
||||
|
@ -92,9 +92,9 @@ policy->cpuinfo.max_freq - the minimum and maximum frequency
|
||||
(in kHz) which is supported by
|
||||
this CPU
|
||||
policy->cpuinfo.transition_latency the time it takes on this CPU to
|
||||
switch between two frequencies (if
|
||||
appropriate, else specify
|
||||
CPUFREQ_ETERNAL)
|
||||
switch between two frequencies in
|
||||
nanoseconds (if appropriate, else
|
||||
specify CPUFREQ_ETERNAL)
|
||||
|
||||
policy->cur The current operating frequency of
|
||||
this CPU (if appropriate)
|
||||
|
@ -203,6 +203,17 @@ scaling_cur_freq : Current frequency of the CPU as determined by
|
||||
the frequency the kernel thinks the CPU runs
|
||||
at.
|
||||
|
||||
bios_limit : If the BIOS tells the OS to limit a CPU to
|
||||
lower frequencies, the user can read out the
|
||||
maximum available frequency from this file.
|
||||
This typically can happen through (often not
|
||||
intended) BIOS settings, restrictions
|
||||
triggered through a service processor or other
|
||||
BIOS/HW based implementations.
|
||||
This does not cover thermal ACPI limitations
|
||||
which can be detected through the generic
|
||||
thermal driver.
|
||||
|
||||
If you have selected the "userspace" governor which allows you to
|
||||
set the CPU operating frequency to a specific value, you can read out
|
||||
the current frequency in
|
||||
|
@ -49,6 +49,12 @@ maxcpus=n Restrict boot time cpus to n. Say if you have 4 cpus, using
|
||||
additional_cpus=n (*) Use this to limit hotpluggable cpus. This option sets
|
||||
cpu_possible_map = cpu_present_map + additional_cpus
|
||||
|
||||
cede_offline={"off","on"} Use this option to disable/enable putting offlined
|
||||
processors to an extended H_CEDE state on
|
||||
supported pseries platforms.
|
||||
If nothing is specified,
|
||||
cede_offline is set to "on".
|
||||
|
||||
(*) Option valid only for following architectures
|
||||
- ia64
|
||||
|
||||
|
@ -291,13 +291,6 @@ Who: Michael Buesch <mb@bu3sch.de>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: usedac i386 kernel parameter
|
||||
When: 2.6.27
|
||||
Why: replaced by allowdac and no dac combination
|
||||
Who: Glauber Costa <gcosta@redhat.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: print_fn_descriptor_symbol()
|
||||
When: October 2009
|
||||
Why: The %pF vsprintf format provides the same functionality in a
|
||||
|
@ -36,6 +36,8 @@ dnotify.txt
|
||||
- info about directory notification in Linux.
|
||||
ecryptfs.txt
|
||||
- docs on eCryptfs: stacked cryptographic filesystem for Linux.
|
||||
exofs.txt
|
||||
- info, usage, mount options, design about EXOFS.
|
||||
ext2.txt
|
||||
- info, mount options and specifications for the Ext2 filesystem.
|
||||
ext3.txt
|
||||
|
@ -60,13 +60,13 @@ USAGE
|
||||
|
||||
mkfs.exofs --pid=65536 --format /dev/osd0
|
||||
|
||||
The --format is optional if not specified no OSD_FORMAT will be
|
||||
preformed and a clean file system will be created in the specified pid,
|
||||
The --format is optional. If not specified, no OSD_FORMAT will be
|
||||
performed and a clean file system will be created in the specified pid,
|
||||
in the available space of the target. (Use --format=size_in_meg to limit
|
||||
the total LUN space available)
|
||||
|
||||
If pid already exist it will be deleted and a new one will be created in it's
|
||||
place. Be careful.
|
||||
If pid already exists, it will be deleted and a new one will be created in
|
||||
its place. Be careful.
|
||||
|
||||
An exofs lives inside a single OSD partition. You can create multiple exofs
|
||||
filesystems on the same device using multiple pids.
|
||||
@ -81,7 +81,7 @@ USAGE
|
||||
|
||||
7. For reference (See do-exofs example script):
|
||||
do-exofs start - an example of how to perform the above steps.
|
||||
do-exofs stop - an example of how to unmount the file system.
|
||||
do-exofs stop - an example of how to unmount the file system.
|
||||
do-exofs format - an example of how to format and mkfs a new exofs.
|
||||
|
||||
8. Extra compilation flags (uncomment in fs/exofs/Kbuild):
|
||||
@ -104,8 +104,8 @@ Where:
|
||||
exofs specific options: Options are separated by commas (,)
|
||||
pid=<integer> - The partition number to mount/create as
|
||||
container of the filesystem.
|
||||
This option is mandatory
|
||||
to=<integer> - Timeout in ticks for a single command
|
||||
This option is mandatory.
|
||||
to=<integer> - Timeout in ticks for a single command.
|
||||
default is (60 * HZ) [for debugging only]
|
||||
|
||||
===============================================================================
|
||||
@ -116,7 +116,7 @@ DESIGN
|
||||
with a special ID (defined in common.h).
|
||||
Information included in the file system control block is used to fill the
|
||||
in-memory superblock structure at mount time. This object is created before
|
||||
the file system is used by mkexofs.c It contains information such as:
|
||||
the file system is used by mkexofs.c. It contains information such as:
|
||||
- The file system's magic number
|
||||
- The next inode number to be allocated
|
||||
|
||||
@ -134,8 +134,8 @@ DESIGN
|
||||
attributes. This applies to both regular files and other types (directories,
|
||||
device files, symlinks, etc.).
|
||||
|
||||
* Credentials are generated per object (inode and superblock) when they is
|
||||
created in memory (read off disk or created). The credential works for all
|
||||
* Credentials are generated per object (inode and superblock) when they are
|
||||
created in memory (read from disk or created). The credential works for all
|
||||
operations and is used as long as the object remains in memory.
|
||||
|
||||
* Async OSD operations are used whenever possible, but the target may execute
|
||||
@ -145,7 +145,8 @@ DESIGN
|
||||
from executing in reverse order:
|
||||
- The following are handled with the OBJ_CREATED and OBJ_2BCREATED
|
||||
flags. OBJ_CREATED is set when we know the object exists on the OSD -
|
||||
in create's callback function, and when we successfully do a read_inode.
|
||||
in create's callback function, and when we successfully do a
|
||||
read_inode.
|
||||
OBJ_2BCREATED is set in the beginning of the create function, so we
|
||||
know that we should wait.
|
||||
- create/delete: delete should wait until the object is created
|
||||
|
@ -32,8 +32,8 @@ journal_dev=devnum When the external journal device's major/minor numbers
|
||||
identified through its new major/minor numbers encoded
|
||||
in devnum.
|
||||
|
||||
noload Don't load the journal on mounting. Note that this forces
|
||||
mount of inconsistent filesystem, which can lead to
|
||||
norecovery Don't load the journal on mounting. Note that this forces
|
||||
noload mount of inconsistent filesystem, which can lead to
|
||||
various problems.
|
||||
|
||||
data=journal All data are committed into the journal prior to being
|
||||
|
@ -153,8 +153,8 @@ journal_dev=devnum When the external journal device's major/minor numbers
|
||||
identified through its new major/minor numbers encoded
|
||||
in devnum.
|
||||
|
||||
noload Don't load the journal on mounting. Note that
|
||||
if the filesystem was not unmounted cleanly,
|
||||
norecovery Don't load the journal on mounting. Note that
|
||||
noload if the filesystem was not unmounted cleanly,
|
||||
skipping the journal replay will lead to the
|
||||
filesystem containing inconsistencies that can
|
||||
lead to any number of problems.
|
||||
@ -353,6 +353,12 @@ noauto_da_alloc replacing existing files via patterns such as
|
||||
system crashes before the delayed allocation
|
||||
blocks are forced to disk.
|
||||
|
||||
discard Controls whether ext4 should issue discard/TRIM
|
||||
nodiscard(*) commands to the underlying block device when
|
||||
blocks are freed. This is useful for SSD devices
|
||||
and sparse/thinly-provisioned LUNs, but it is off
|
||||
by default until sufficient testing has been done.
|
||||
|
||||
Data Mode
|
||||
=========
|
||||
There are 3 different data modes:
|
||||
|
@ -49,8 +49,7 @@ Mount options
|
||||
NILFS2 supports the following mount options:
|
||||
(*) == default
|
||||
|
||||
barrier=on(*) This enables/disables barriers. barrier=off disables
|
||||
it, barrier=on enables it.
|
||||
nobarrier Disables barriers.
|
||||
errors=continue(*) Keep going on a filesystem error.
|
||||
errors=remount-ro Remount the filesystem read-only on an error.
|
||||
errors=panic Panic and halt the machine if an error occurs.
|
||||
@ -71,6 +70,10 @@ order=strict Apply strict in-order semantics that preserves sequence
|
||||
blocks. That means, it is guaranteed that no
|
||||
overtaking of events occurs in the recovered file
|
||||
system after a crash.
|
||||
norecovery Disable recovery of the filesystem on mount.
|
||||
This disables every write access on the device for
|
||||
read-only mounts or snapshots. This option will fail
|
||||
for r/w mounts on an unclean volume.
|
||||
|
||||
NILFS2 usage
|
||||
============
|
||||
|
@ -472,7 +472,7 @@ __sync_single_inode) to check if ->writepages has been successful in
|
||||
writing out the whole address_space.
|
||||
|
||||
The Writeback tag is used by filemap*wait* and sync_page* functions,
|
||||
via wait_on_page_writeback_range, to wait for all writeback to
|
||||
via filemap_fdatawait_range, to wait for all writeback to
|
||||
complete. While waiting ->sync_page (if defined) will be called on
|
||||
each page that is found to require writeback.
|
||||
|
||||
|
@ -68,22 +68,38 @@ GigaSet 307x Device Driver
|
||||
for troubleshooting or to pass module parameters.
|
||||
|
||||
The module ser_gigaset provides a serial line discipline N_GIGASET_M101
|
||||
which drives the device through the regular serial line driver. It must
|
||||
be attached to the serial line to which the M101 is connected with the
|
||||
ldattach(8) command (requires util-linux-ng release 2.14 or later), for
|
||||
example:
|
||||
ldattach GIGASET_M101 /dev/ttyS1
|
||||
which uses the regular serial port driver to access the device, and must
|
||||
therefore be attached to the serial device to which the M101 is connected.
|
||||
The ldattach(8) command (included in util-linux-ng release 2.14 or later)
|
||||
can be used for that purpose, for example:
|
||||
ldattach GIGASET_M101 /dev/ttyS1
|
||||
This will open the device file, attach the line discipline to it, and
|
||||
then sleep in the background, keeping the device open so that the line
|
||||
discipline remains active. To deactivate it, kill the daemon, for example
|
||||
with
|
||||
killall ldattach
|
||||
killall ldattach
|
||||
before disconnecting the device. To have this happen automatically at
|
||||
system startup/shutdown on an LSB compatible system, create and activate
|
||||
an appropriate LSB startup script /etc/init.d/gigaset. (The init name
|
||||
'gigaset' is officially assigned to this project by LANANA.)
|
||||
Alternatively, just add the 'ldattach' command line to /etc/rc.local.
|
||||
|
||||
The modules accept the following parameters:
|
||||
|
||||
Module Parameter Meaning
|
||||
|
||||
gigaset debug debug level (see section 3.2.)
|
||||
|
||||
startmode initial operation mode (see section 2.5.):
|
||||
bas_gigaset ) 1=ISDN4linux/CAPI (default), 0=Unimodem
|
||||
ser_gigaset )
|
||||
usb_gigaset ) cidmode initial Call-ID mode setting (see section
|
||||
2.5.): 1=on (default), 0=off
|
||||
|
||||
Depending on your distribution you may want to create a separate module
|
||||
configuration file /etc/modprobe.d/gigaset for these, or add them to a
|
||||
custom file like /etc/modprobe.conf.local.
|
||||
|
||||
2.2. Device nodes for user space programs
|
||||
------------------------------------
|
||||
The device can be accessed from user space (eg. by the user space tools
|
||||
@ -93,11 +109,48 @@ GigaSet 307x Device Driver
|
||||
- /dev/ttyGU0 for M105 (USB data boxes)
|
||||
- /dev/ttyGB0 for the base driver (direct USB connection)
|
||||
|
||||
You can also select a "default device" which is used by the frontends when
|
||||
If you connect more than one device of a type, they will get consecutive
|
||||
device nodes, eg. /dev/ttyGU1 for a second M105.
|
||||
|
||||
You can also set a "default device" for the user space tools to use when
|
||||
no device node is given as parameter, by creating a symlink /dev/ttyG to
|
||||
one of them, eg.:
|
||||
|
||||
ln -s /dev/ttyGB0 /dev/ttyG
|
||||
ln -s /dev/ttyGB0 /dev/ttyG
|
||||
|
||||
The devices accept the following device specific ioctl calls
|
||||
(defined in gigaset_dev.h):
|
||||
|
||||
ioctl(int fd, GIGASET_REDIR, int *cmd);
|
||||
If cmd==1, the device is set to be controlled exclusively through the
|
||||
character device node; access from the ISDN subsystem is blocked.
|
||||
If cmd==0, the device is set to be used from the ISDN subsystem and does
|
||||
not communicate through the character device node.
|
||||
|
||||
ioctl(int fd, GIGASET_CONFIG, int *cmd);
|
||||
(ser_gigaset and usb_gigaset only)
|
||||
If cmd==1, the device is set to adapter configuration mode where commands
|
||||
are interpreted by the M10x DECT adapter itself instead of being
|
||||
forwarded to the base station. In this mode, the device accepts the
|
||||
commands described in Siemens document "AT-Kommando Alignment M10x Data"
|
||||
for setting the operation mode, associating with a base station and
|
||||
querying parameters like field strengh and signal quality.
|
||||
Note that there is no ioctl command for leaving adapter configuration
|
||||
mode and returning to regular operation. In order to leave adapter
|
||||
configuration mode, write the command ATO to the device.
|
||||
|
||||
ioctl(int fd, GIGASET_BRKCHARS, unsigned char brkchars[6]);
|
||||
(usb_gigaset only)
|
||||
Set the break characters on an M105's internal serial adapter to the six
|
||||
bytes stored in brkchars[]. Unused bytes should be set to zero.
|
||||
|
||||
ioctl(int fd, GIGASET_VERSION, unsigned version[4]);
|
||||
Retrieve version information from the driver. version[0] must be set to
|
||||
one of:
|
||||
- GIGVER_DRIVER: retrieve driver version
|
||||
- GIGVER_COMPAT: retrieve interface compatibility version
|
||||
- GIGVER_FWBASE: retrieve the firmware version of the base
|
||||
Upon return, version[] is filled with the requested version information.
|
||||
|
||||
2.3. ISDN4linux
|
||||
----------
|
||||
@ -113,15 +166,24 @@ GigaSet 307x Device Driver
|
||||
Connection State: 0, Response: -1
|
||||
gigaset_process_response: resp_code -1 in ConState 0 !
|
||||
Timeout occurred
|
||||
you might need to use unimodem mode. (see section 2.5.)
|
||||
you probably need to use unimodem mode. (see section 2.5.)
|
||||
|
||||
2.4. CAPI
|
||||
----
|
||||
If the driver is compiled with CAPI support (kernel configuration option
|
||||
GIGASET_CAPI, experimental) it can also be used with CAPI 2.0 kernel and
|
||||
user space applications. ISDN4Linux is supported in this configuration
|
||||
user space applications. For user space access, the module capi.ko must
|
||||
be loaded. The capiinit command (included in the capi4k-utils package)
|
||||
does this for you.
|
||||
|
||||
The CAPI variant of the driver supports legacy ISDN4Linux applications
|
||||
via the capidrv compatibility driver. The kernel module capidrv.ko must
|
||||
be loaded explicitly ("modprobe capidrv") if needed.
|
||||
be loaded explicitly with the command
|
||||
modprobe capidrv
|
||||
if needed, and cannot be unloaded again without unloading the driver
|
||||
first. (These are limitations of capidrv.)
|
||||
|
||||
The note about unimodem mode in the preceding section applies here, too.
|
||||
|
||||
2.5. Unimodem mode
|
||||
-------------
|
||||
@ -134,9 +196,14 @@ GigaSet 307x Device Driver
|
||||
You can switch back using
|
||||
gigacontr --mode isdn
|
||||
|
||||
You can also load the driver using e.g.
|
||||
modprobe usb_gigaset startmode=0
|
||||
to prevent the driver from starting in "isdn4linux mode".
|
||||
You can also put the driver directly into Unimodem mode when it's loaded,
|
||||
by passing the module parameter startmode=0 to the hardware specific
|
||||
module, e.g.
|
||||
modprobe usb_gigaset startmode=0
|
||||
or by adding a line like
|
||||
options usb_gigaset startmode=0
|
||||
to an appropriate module configuration file, like /etc/modprobe.d/gigaset
|
||||
or /etc/modprobe.conf.local.
|
||||
|
||||
In this mode the device works like a modem connected to a serial port
|
||||
(the /dev/ttyGU0, ... mentioned above) which understands the commands
|
||||
@ -164,9 +231,8 @@ GigaSet 307x Device Driver
|
||||
|
||||
options ppp_async flag_time=0
|
||||
|
||||
to /etc/modprobe.conf. If your distribution has some local module
|
||||
configuration file like /etc/modprobe.conf.local,
|
||||
using that should be preferred.
|
||||
to an appropriate module configuration file, like /etc/modprobe.d/gigaset
|
||||
or /etc/modprobe.conf.local.
|
||||
|
||||
2.6. Call-ID (CID) mode
|
||||
------------------
|
||||
@ -189,12 +255,13 @@ GigaSet 307x Device Driver
|
||||
settings (CID mode).
|
||||
- If you have several DECT data devices (M10x) which you want to use
|
||||
in turn, select Unimodem mode by passing the parameter "cidmode=0" to
|
||||
the driver ("modprobe usb_gigaset cidmode=0" or modprobe.conf).
|
||||
the appropriate driver module (ser_gigaset or usb_gigaset).
|
||||
|
||||
If you want both of these at once, you are out of luck.
|
||||
|
||||
You can also use /sys/class/tty/ttyGxy/cidmode for changing the CID mode
|
||||
setting (ttyGxy is ttyGU0 or ttyGB0).
|
||||
You can also use the tty class parameter "cidmode" of the device to
|
||||
change its CID mode while the driver is loaded, eg.
|
||||
echo 0 > /sys/class/tty/ttyGU0/cidmode
|
||||
|
||||
2.7. Unregistered Wireless Devices (M101/M105)
|
||||
-----------------------------------------
|
||||
@ -208,7 +275,7 @@ GigaSet 307x Device Driver
|
||||
driver. In that situation, a restricted set of functions is available
|
||||
which includes, in particular, those necessary for registering the device
|
||||
to a base or for switching it between Fixed Part and Portable Part
|
||||
modes.
|
||||
modes. See the gigacontr(8) manpage for details.
|
||||
|
||||
3. Troubleshooting
|
||||
---------------
|
||||
@ -222,9 +289,7 @@ GigaSet 307x Device Driver
|
||||
|
||||
options isdn dialtimeout=15
|
||||
|
||||
to /etc/modprobe.conf. If your distribution has some local module
|
||||
configuration file like /etc/modprobe.conf.local,
|
||||
using that should be preferred.
|
||||
to /etc/modprobe.d/gigaset, /etc/modprobe.conf.local or a similar file.
|
||||
|
||||
Problem:
|
||||
Your isdn script aborts with a message about isdnlog.
|
||||
@ -264,7 +329,8 @@ GigaSet 307x Device Driver
|
||||
The initial value can be set using the debug parameter when loading the
|
||||
module "gigaset", e.g. by adding a line
|
||||
options gigaset debug=0
|
||||
to /etc/modprobe.conf, ...
|
||||
to your module configuration file, eg. /etc/modprobe.d/gigaset or
|
||||
/etc/modprobe.conf.local.
|
||||
|
||||
Generated debugging information can be found
|
||||
- as output of the command
|
||||
|
@ -1787,6 +1787,11 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
waiting for the ACK, so if this is set too high
|
||||
interrupts *may* be lost!
|
||||
|
||||
omap_mux= [OMAP] Override bootloader pin multiplexing.
|
||||
Format: <mux_mode0.mode_name=value>...
|
||||
For example, to override I2C bus2:
|
||||
omap_mux=i2c2_scl.i2c2_scl=0x100,i2c2_sda.i2c2_sda=0x100
|
||||
|
||||
opl3= [HW,OSS]
|
||||
Format: <io>
|
||||
|
||||
@ -2663,6 +2668,8 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
to a common usb-storage quirk flag as follows:
|
||||
a = SANE_SENSE (collect more than 18 bytes
|
||||
of sense data);
|
||||
b = BAD_SENSE (don't collect more than 18
|
||||
bytes of sense data);
|
||||
c = FIX_CAPACITY (decrease the reported
|
||||
device capacity by one sector);
|
||||
h = CAPACITY_HEURISTICS (decrease the
|
||||
|
@ -62,8 +62,20 @@ applicable).
|
||||
It also tracks 4 contention points per class. A contention point is a call site
|
||||
that had to wait on lock acquisition.
|
||||
|
||||
- CONFIGURATION
|
||||
|
||||
Lock statistics are enabled via CONFIG_LOCK_STATS.
|
||||
|
||||
- USAGE
|
||||
|
||||
Enable collection of statistics:
|
||||
|
||||
# echo 1 >/proc/sys/kernel/lock_stat
|
||||
|
||||
Disable collection of statistics:
|
||||
|
||||
# echo 0 >/proc/sys/kernel/lock_stat
|
||||
|
||||
Look at the current lock statistics:
|
||||
|
||||
( line numbers not part of actual output, done for clarity in the explanation
|
||||
|
@ -233,9 +233,9 @@ All md devices contain:
|
||||
|
||||
resync_start
|
||||
The point at which resync should start. If no resync is needed,
|
||||
this will be a very large number. At array creation it will
|
||||
default to 0, though starting the array as 'clean' will
|
||||
set it much larger.
|
||||
this will be a very large number (or 'none' since 2.6.30-rc1). At
|
||||
array creation it will default to 0, though starting the array as
|
||||
'clean' will set it much larger.
|
||||
|
||||
new_dev
|
||||
This file can be written but not read. The value written should
|
||||
@ -296,6 +296,51 @@ All md devices contain:
|
||||
active-idle
|
||||
like active, but no writes have been seen for a while (safe_mode_delay).
|
||||
|
||||
bitmap/location
|
||||
This indicates where the write-intent bitmap for the array is
|
||||
stored.
|
||||
It can be one of "none", "file" or "[+-]N".
|
||||
"file" may later be extended to "file:/file/name"
|
||||
"[+-]N" means that many sectors from the start of the metadata.
|
||||
This is replicated on all devices. For arrays with externally
|
||||
managed metadata, the offset is from the beginning of the
|
||||
device.
|
||||
bitmap/chunksize
|
||||
The size, in bytes, of the chunk which will be represented by a
|
||||
single bit. For RAID456, it is a portion of an individual
|
||||
device. For RAID10, it is a portion of the array. For RAID1, it
|
||||
is both (they come to the same thing).
|
||||
bitmap/time_base
|
||||
The time, in seconds, between looking for bits in the bitmap to
|
||||
be cleared. In the current implementation, a bit will be cleared
|
||||
between 2 and 3 times "time_base" after all the covered blocks
|
||||
are known to be in-sync.
|
||||
bitmap/backlog
|
||||
When write-mostly devices are active in a RAID1, write requests
|
||||
to those devices proceed in the background - the filesystem (or
|
||||
other user of the device) does not have to wait for them.
|
||||
'backlog' sets a limit on the number of concurrent background
|
||||
writes. If there are more than this, new writes will by
|
||||
synchronous.
|
||||
bitmap/metadata
|
||||
This can be either 'internal' or 'external'.
|
||||
'internal' is the default and means the metadata for the bitmap
|
||||
is stored in the first 256 bytes of the allocated space and is
|
||||
managed by the md module.
|
||||
'external' means that bitmap metadata is managed externally to
|
||||
the kernel (i.e. by some userspace program)
|
||||
bitmap/can_clear
|
||||
This is either 'true' or 'false'. If 'true', then bits in the
|
||||
bitmap will be cleared when the corresponding blocks are thought
|
||||
to be in-sync. If 'false', bits will never be cleared.
|
||||
This is automatically set to 'false' if a write happens on a
|
||||
degraded array, or if the array becomes degraded during a write.
|
||||
When metadata is managed externally, it should be set to true
|
||||
once the array becomes non-degraded, and this fact has been
|
||||
recorded in the metadata.
|
||||
|
||||
|
||||
|
||||
|
||||
As component devices are added to an md array, they appear in the 'md'
|
||||
directory as new directories named
|
||||
@ -334,8 +379,9 @@ Each directory contains:
|
||||
Writing "writemostly" sets the writemostly flag.
|
||||
Writing "-writemostly" clears the writemostly flag.
|
||||
Writing "blocked" sets the "blocked" flag.
|
||||
Writing "-blocked" clear the "blocked" flag and allows writes
|
||||
Writing "-blocked" clears the "blocked" flag and allows writes
|
||||
to complete.
|
||||
Writing "in_sync" sets the in_sync flag.
|
||||
|
||||
This file responds to select/poll. Any change to 'faulty'
|
||||
or 'blocked' causes an event.
|
||||
@ -372,6 +418,24 @@ Each directory contains:
|
||||
array. If a value less than the current component_size is
|
||||
written, it will be rejected.
|
||||
|
||||
recovery_start
|
||||
|
||||
When the device is not 'in_sync', this records the number of
|
||||
sectors from the start of the device which are known to be
|
||||
correct. This is normally zero, but during a recovery
|
||||
operation is will steadily increase, and if the recovery is
|
||||
interrupted, restoring this value can cause recovery to
|
||||
avoid repeating the earlier blocks. With v1.x metadata, this
|
||||
value is saved and restored automatically.
|
||||
|
||||
This can be set whenever the device is not an active member of
|
||||
the array, either before the array is activated, or before
|
||||
the 'slot' is set.
|
||||
|
||||
Setting this to 'none' is equivalent to setting 'in_sync'.
|
||||
Setting to any other value also clears the 'in_sync' flag.
|
||||
|
||||
|
||||
|
||||
An active md device will also contain and entry for each active device
|
||||
in the array. These are named
|
||||
|
@ -20,12 +20,16 @@ Required properities:
|
||||
- compatible : should be "fsl,fpga-pixis".
|
||||
- reg : should contain the address and the length of the FPPGA register
|
||||
set.
|
||||
- interrupt-parent: should specify phandle for the interrupt controller.
|
||||
- interrupts : should specify event (wakeup) IRQ.
|
||||
|
||||
Example (MPC8610HPCD):
|
||||
|
||||
board-control@e8000000 {
|
||||
compatible = "fsl,fpga-pixis";
|
||||
reg = <0xe8000000 32>;
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <8 8>;
|
||||
};
|
||||
|
||||
* Freescale BCSR GPIO banks
|
||||
|
@ -103,7 +103,22 @@ fsl,mpc5200-gpt nodes
|
||||
---------------------
|
||||
On the mpc5200 and 5200b, GPT0 has a watchdog timer function. If the board
|
||||
design supports the internal wdt, then the device node for GPT0 should
|
||||
include the empty property 'fsl,has-wdt'.
|
||||
include the empty property 'fsl,has-wdt'. Note that this does not activate
|
||||
the watchdog. The timer will function as a GPT if the timer api is used, and
|
||||
it will function as watchdog if the watchdog device is used. The watchdog
|
||||
mode has priority over the gpt mode, i.e. if the watchdog is activated, any
|
||||
gpt api call to this timer will fail with -EBUSY.
|
||||
|
||||
If you add the property
|
||||
fsl,wdt-on-boot = <n>;
|
||||
GPT0 will be marked as in-use watchdog, i.e. blocking every gpt access to it.
|
||||
If n>0, the watchdog is started with a timeout of n seconds. If n=0, the
|
||||
configuration of the watchdog is not touched. This is useful in two cases:
|
||||
- just mark GPT0 as watchdog, blocking gpt accesses, and configure it later;
|
||||
- do not touch a configuration assigned by the boot loader which supervises
|
||||
the boot process itself.
|
||||
|
||||
The watchdog will respect the CONFIG_WATCHDOG_NOWAYOUT option.
|
||||
|
||||
An mpc5200-gpt can be used as a single line GPIO controller. To do so,
|
||||
add the following properties to the gpt node:
|
||||
|
@ -292,4 +292,15 @@
|
||||
- reg-offset : A value of 3 is required
|
||||
- reg-shift : A value of 2 is required
|
||||
|
||||
vii) Xilinx USB Host controller
|
||||
|
||||
The Xilinx USB host controller is EHCI compatible but with a different
|
||||
base address for the EHCI registers, and it is always a big-endian
|
||||
USB Host controller. The hardware can be configured as high speed only,
|
||||
or high speed/full speed hybrid.
|
||||
|
||||
Required properties:
|
||||
- xlnx,support-usb-fs: A value 0 means the core is built as high speed
|
||||
only. A value 1 means the core also supports
|
||||
full speed devices.
|
||||
|
||||
|
@ -1,154 +0,0 @@
|
||||
HAYES ESP DRIVER VERSION 2.1
|
||||
|
||||
A big thanks to the people at Hayes, especially Alan Adamson. Their support
|
||||
has enabled me to provide enhancements to the driver.
|
||||
|
||||
Please report your experiences with this driver to me (arobinso@nyx.net). I
|
||||
am looking for both positive and negative feedback.
|
||||
|
||||
*** IMPORTANT CHANGES FOR 2.1 ***
|
||||
Support for PIO mode. Five situations will cause PIO mode to be used:
|
||||
1) A multiport card is detected. PIO mode will always be used. (8 port cards
|
||||
do not support DMA).
|
||||
2) The DMA channel is set to an invalid value (anything other than 1 or 3).
|
||||
3) The DMA buffer/channel could not be allocated. The port will revert to PIO
|
||||
mode until it is reopened.
|
||||
4) Less than a specified number of bytes need to be transferred to/from the
|
||||
FIFOs. PIO mode will be used for that transfer only.
|
||||
5) A port needs to do a DMA transfer and another port is already using the
|
||||
DMA channel. PIO mode will be used for that transfer only.
|
||||
|
||||
Since the Hayes ESP seems to conflict with other cards (notably sound cards)
|
||||
when using DMA, DMA is turned off by default. To use DMA, it must be turned
|
||||
on explicitly, either with the "dma=" option described below or with
|
||||
setserial. A multiport card can be forced into DMA mode by using setserial;
|
||||
however, most multiport cards don't support DMA.
|
||||
|
||||
The latest version of setserial allows the enhanced configuration of the ESP
|
||||
card to be viewed and modified.
|
||||
***
|
||||
|
||||
This package contains the files needed to compile a module to support the Hayes
|
||||
ESP card. The drivers are basically a modified version of the serial drivers.
|
||||
|
||||
Features:
|
||||
|
||||
- Uses the enhanced mode of the ESP card, allowing a wider range of
|
||||
interrupts and features than compatibility mode
|
||||
- Uses DMA and 16 bit PIO mode to transfer data to and from the ESP's FIFOs,
|
||||
reducing CPU load
|
||||
- Supports primary and secondary ports
|
||||
|
||||
|
||||
If the driver is compiled as a module, the IRQs to use can be specified by
|
||||
using the irq= option. The format is:
|
||||
|
||||
irq=[0x100],[0x140],[0x180],[0x200],[0x240],[0x280],[0x300],[0x380]
|
||||
|
||||
The address in brackets is the base address of the card. The IRQ of
|
||||
nonexistent cards can be set to 0. If an IRQ of a card that does exist is set
|
||||
to 0, the driver will attempt to guess at the correct IRQ. For example, to set
|
||||
the IRQ of the card at address 0x300 to 12, the insmod command would be:
|
||||
|
||||
insmod esp irq=0,0,0,0,0,0,12,0
|
||||
|
||||
The custom divisor can be set by using the divisor= option. The format is the
|
||||
same as for the irq= option. Each divisor value is a series of hex digits,
|
||||
with each digit representing the divisor to use for a corresponding port. The
|
||||
divisor value is constructed RIGHT TO LEFT. Specifying a nonzero divisor value
|
||||
will automatically set the spd_cust flag. To calculate the divisor to use for
|
||||
a certain baud rate, divide the port's base baud (generally 921600) by the
|
||||
desired rate. For example, to set the divisor of the primary port at 0x300 to
|
||||
4 and the divisor of the secondary port at 0x308 to 8, the insmod command would
|
||||
be:
|
||||
|
||||
insmod esp divisor=0,0,0,0,0,0,0x84,0
|
||||
|
||||
The dma= option can be used to set the DMA channel. The channel can be either
|
||||
1 or 3. Specifying any other value will force the driver to use PIO mode.
|
||||
For example, to set the DMA channel to 3, the insmod command would be:
|
||||
|
||||
insmod esp dma=3
|
||||
|
||||
The rx_trigger= and tx_trigger= options can be used to set the FIFO trigger
|
||||
levels. They specify when the ESP card should send an interrupt. Larger
|
||||
values will decrease the number of interrupts; however, a value too high may
|
||||
result in data loss. Valid values are 1 through 1023, with 768 being the
|
||||
default. For example, to set the receive trigger level to 512 bytes and the
|
||||
transmit trigger level to 700 bytes, the insmod command would be:
|
||||
|
||||
insmod esp rx_trigger=512 tx_trigger=700
|
||||
|
||||
The flow_off= and flow_on= options can be used to set the hardware flow off/
|
||||
flow on levels. The flow on level must be lower than the flow off level, and
|
||||
the flow off level should be higher than rx_trigger. Valid values are 1
|
||||
through 1023, with 1016 being the default flow off level and 944 being the
|
||||
default flow on level. For example, to set the flow off level to 1000 bytes
|
||||
and the flow on level to 935 bytes, the insmod command would be:
|
||||
|
||||
insmod esp flow_off=1000 flow_on=935
|
||||
|
||||
The rx_timeout= option can be used to set the receive timeout value. This
|
||||
value indicates how long after receiving the last character that the ESP card
|
||||
should wait before signalling an interrupt. Valid values are 0 though 255,
|
||||
with 128 being the default. A value too high will increase latency, and a
|
||||
value too low will cause unnecessary interrupts. For example, to set the
|
||||
receive timeout to 255, the insmod command would be:
|
||||
|
||||
insmod esp rx_timeout=255
|
||||
|
||||
The pio_threshold= option sets the threshold (in number of characters) for
|
||||
using PIO mode instead of DMA mode. For example, if this value is 32,
|
||||
transfers of 32 bytes or less will always use PIO mode.
|
||||
|
||||
insmod esp pio_threshold=32
|
||||
|
||||
Multiple options can be listed on the insmod command line by separating each
|
||||
option with a space. For example:
|
||||
|
||||
insmod esp dma=3 trigger=512
|
||||
|
||||
The esp module can be automatically loaded when needed. To cause this to
|
||||
happen, add the following lines to /etc/modprobe.conf (replacing the last line
|
||||
with options for your configuration):
|
||||
|
||||
alias char-major-57 esp
|
||||
alias char-major-58 esp
|
||||
options esp irq=0,0,0,0,0,0,3,0 divisor=0,0,0,0,0,0,0x4,0
|
||||
|
||||
You may also need to run 'depmod -a'.
|
||||
|
||||
Devices must be created manually. To create the devices, note the output from
|
||||
the module after it is inserted. The output will appear in the location where
|
||||
kernel messages usually appear (usually /var/adm/messages). Create two devices
|
||||
for each 'tty' mentioned, one with major of 57 and the other with major of 58.
|
||||
The minor number should be the same as the tty number reported. The commands
|
||||
would be (replace ? with the tty number):
|
||||
|
||||
mknod /dev/ttyP? c 57 ?
|
||||
mknod /dev/cup? c 58 ?
|
||||
|
||||
For example, if the following line appears:
|
||||
|
||||
Oct 24 18:17:23 techno kernel: ttyP8 at 0x0140 (irq = 3) is an ESP primary port
|
||||
|
||||
...two devices should be created:
|
||||
|
||||
mknod /dev/ttyP8 c 57 8
|
||||
mknod /dev/cup8 c 58 8
|
||||
|
||||
You may need to set the permissions on the devices:
|
||||
|
||||
chmod 666 /dev/ttyP*
|
||||
chmod 666 /dev/cup*
|
||||
|
||||
The ESP module and the serial module should not conflict (they can be used at
|
||||
the same time). After the ESP module has been loaded the ports on the ESP card
|
||||
will no longer be accessible by the serial driver.
|
||||
|
||||
If I/O errors are experienced when accessing the port, check for IRQ and DMA
|
||||
conflicts ('cat /proc/interrupts' and 'cat /proc/dma' for a list of IRQs and
|
||||
DMAs currently in use).
|
||||
|
||||
Enjoy!
|
||||
Andrew J. Robinson <arobinso@nyx.net>
|
@ -42,7 +42,8 @@ TTY side interfaces:
|
||||
open() - Called when the line discipline is attached to
|
||||
the terminal. No other call into the line
|
||||
discipline for this tty will occur until it
|
||||
completes successfully. Can sleep.
|
||||
completes successfully. Returning an error will
|
||||
prevent the ldisc from being attached. Can sleep.
|
||||
|
||||
close() - This is called on a terminal when the line
|
||||
discipline is being unplugged. At the point of
|
||||
@ -52,7 +53,7 @@ close() - This is called on a terminal when the line
|
||||
hangup() - Called when the tty line is hung up.
|
||||
The line discipline should cease I/O to the tty.
|
||||
No further calls into the ldisc code will occur.
|
||||
Can sleep.
|
||||
The return value is ignored. Can sleep.
|
||||
|
||||
write() - A process is writing data through the line
|
||||
discipline. Multiple write calls are serialized
|
||||
@ -83,6 +84,10 @@ ioctl() - Called when an ioctl is handed to the tty layer
|
||||
that might be for the ldisc. Multiple ioctl calls
|
||||
may occur in parallel. May sleep.
|
||||
|
||||
compat_ioctl() - Called when a 32 bit ioctl is handed to the tty layer
|
||||
that might be for the ldisc. Multiple ioctl calls
|
||||
may occur in parallel. May sleep.
|
||||
|
||||
Driver Side Interfaces:
|
||||
|
||||
receive_buf() - Hand buffers of bytes from the driver to the ldisc
|
||||
|
@ -1,73 +1,8 @@
|
||||
SPIN_LOCK_UNLOCKED and RW_LOCK_UNLOCKED defeat lockdep state tracking and
|
||||
are hence deprecated.
|
||||
Lesson 1: Spin locks
|
||||
|
||||
Please use DEFINE_SPINLOCK()/DEFINE_RWLOCK() or
|
||||
__SPIN_LOCK_UNLOCKED()/__RW_LOCK_UNLOCKED() as appropriate for static
|
||||
initialization.
|
||||
|
||||
Most of the time, you can simply turn:
|
||||
|
||||
static spinlock_t xxx_lock = SPIN_LOCK_UNLOCKED;
|
||||
|
||||
into:
|
||||
|
||||
static DEFINE_SPINLOCK(xxx_lock);
|
||||
|
||||
Static structure member variables go from:
|
||||
|
||||
struct foo bar {
|
||||
.lock = SPIN_LOCK_UNLOCKED;
|
||||
};
|
||||
|
||||
to:
|
||||
|
||||
struct foo bar {
|
||||
.lock = __SPIN_LOCK_UNLOCKED(bar.lock);
|
||||
};
|
||||
|
||||
Declaration of static rw_locks undergo a similar transformation.
|
||||
|
||||
Dynamic initialization, when necessary, may be performed as
|
||||
demonstrated below.
|
||||
|
||||
spinlock_t xxx_lock;
|
||||
rwlock_t xxx_rw_lock;
|
||||
|
||||
static int __init xxx_init(void)
|
||||
{
|
||||
spin_lock_init(&xxx_lock);
|
||||
rwlock_init(&xxx_rw_lock);
|
||||
...
|
||||
}
|
||||
|
||||
module_init(xxx_init);
|
||||
|
||||
The following discussion is still valid, however, with the dynamic
|
||||
initialization of spinlocks or with DEFINE_SPINLOCK, etc., used
|
||||
instead of SPIN_LOCK_UNLOCKED.
|
||||
|
||||
-----------------------
|
||||
|
||||
On Fri, 2 Jan 1998, Doug Ledford wrote:
|
||||
>
|
||||
> I'm working on making the aic7xxx driver more SMP friendly (as well as
|
||||
> importing the latest FreeBSD sequencer code to have 7895 support) and wanted
|
||||
> to get some info from you. The goal here is to make the various routines
|
||||
> SMP safe as well as UP safe during interrupts and other manipulating
|
||||
> routines. So far, I've added a spin_lock variable to things like my queue
|
||||
> structs. Now, from what I recall, there are some spin lock functions I can
|
||||
> use to lock these spin locks from other use as opposed to a (nasty)
|
||||
> save_flags(); cli(); stuff; restore_flags(); construct. Where do I find
|
||||
> these routines and go about making use of them? Do they only lock on a
|
||||
> per-processor basis or can they also lock say an interrupt routine from
|
||||
> mucking with a queue if the queue routine was manipulating it when the
|
||||
> interrupt occurred, or should I still use a cli(); based construct on that
|
||||
> one?
|
||||
|
||||
See <asm/spinlock.h>. The basic version is:
|
||||
|
||||
spinlock_t xxx_lock = SPIN_LOCK_UNLOCKED;
|
||||
The most basic primitive for locking is spinlock.
|
||||
|
||||
static DEFINE_SPINLOCK(xxx_lock);
|
||||
|
||||
unsigned long flags;
|
||||
|
||||
@ -75,13 +10,11 @@ See <asm/spinlock.h>. The basic version is:
|
||||
... critical section here ..
|
||||
spin_unlock_irqrestore(&xxx_lock, flags);
|
||||
|
||||
and the above is always safe. It will disable interrupts _locally_, but the
|
||||
The above is always safe. It will disable interrupts _locally_, but the
|
||||
spinlock itself will guarantee the global lock, so it will guarantee that
|
||||
there is only one thread-of-control within the region(s) protected by that
|
||||
lock.
|
||||
|
||||
Note that it works well even under UP - the above sequence under UP
|
||||
essentially is just the same as doing a
|
||||
lock. This works well even under UP. The above sequence under UP
|
||||
essentially is just the same as doing
|
||||
|
||||
unsigned long flags;
|
||||
|
||||
@ -91,15 +24,13 @@ essentially is just the same as doing a
|
||||
|
||||
so the code does _not_ need to worry about UP vs SMP issues: the spinlocks
|
||||
work correctly under both (and spinlocks are actually more efficient on
|
||||
architectures that allow doing the "save_flags + cli" in one go because I
|
||||
don't export that interface normally).
|
||||
architectures that allow doing the "save_flags + cli" in one operation).
|
||||
|
||||
NOTE NOTE NOTE! The reason the spinlock is so much faster than a global
|
||||
interrupt lock under SMP is exactly because it disables interrupts only on
|
||||
the local CPU. The spin-lock is safe only when you _also_ use the lock
|
||||
itself to do locking across CPU's, which implies that EVERYTHING that
|
||||
touches a shared variable has to agree about the spinlock they want to
|
||||
use.
|
||||
NOTE! Implications of spin_locks for memory are further described in:
|
||||
|
||||
Documentation/memory-barriers.txt
|
||||
(5) LOCK operations.
|
||||
(6) UNLOCK operations.
|
||||
|
||||
The above is usually pretty simple (you usually need and want only one
|
||||
spinlock for most things - using more than one spinlock can make things a
|
||||
@ -120,20 +51,24 @@ and another sequence that does
|
||||
then they are NOT mutually exclusive, and the critical regions can happen
|
||||
at the same time on two different CPU's. That's fine per se, but the
|
||||
critical regions had better be critical for different things (ie they
|
||||
can't stomp on each other).
|
||||
can't stomp on each other).
|
||||
|
||||
The above is a problem mainly if you end up mixing code - for example the
|
||||
routines in ll_rw_block() tend to use cli/sti to protect the atomicity of
|
||||
their actions, and if a driver uses spinlocks instead then you should
|
||||
think about issues like the above..
|
||||
think about issues like the above.
|
||||
|
||||
This is really the only really hard part about spinlocks: once you start
|
||||
using spinlocks they tend to expand to areas you might not have noticed
|
||||
before, because you have to make sure the spinlocks correctly protect the
|
||||
shared data structures _everywhere_ they are used. The spinlocks are most
|
||||
easily added to places that are completely independent of other code (ie
|
||||
internal driver data structures that nobody else ever touches, for
|
||||
example).
|
||||
easily added to places that are completely independent of other code (for
|
||||
example, internal driver data structures that nobody else ever touches).
|
||||
|
||||
NOTE! The spin-lock is safe only when you _also_ use the lock itself
|
||||
to do locking across CPU's, which implies that EVERYTHING that
|
||||
touches a shared variable has to agree about the spinlock they want
|
||||
to use.
|
||||
|
||||
----
|
||||
|
||||
@ -141,14 +76,18 @@ Lesson 2: reader-writer spinlocks.
|
||||
|
||||
If your data accesses have a very natural pattern where you usually tend
|
||||
to mostly read from the shared variables, the reader-writer locks
|
||||
(rw_lock) versions of the spinlocks are often nicer. They allow multiple
|
||||
(rw_lock) versions of the spinlocks are sometimes useful. They allow multiple
|
||||
readers to be in the same critical region at once, but if somebody wants
|
||||
to change the variables it has to get an exclusive write lock. The
|
||||
routines look the same as above:
|
||||
to change the variables it has to get an exclusive write lock.
|
||||
|
||||
NOTE! reader-writer locks require more atomic memory operations than
|
||||
simple spinlocks. Unless the reader critical section is long, you
|
||||
are better off just using spinlocks.
|
||||
|
||||
The routines look the same as above:
|
||||
|
||||
rwlock_t xxx_lock = RW_LOCK_UNLOCKED;
|
||||
|
||||
|
||||
unsigned long flags;
|
||||
|
||||
read_lock_irqsave(&xxx_lock, flags);
|
||||
@ -159,18 +98,21 @@ routines look the same as above:
|
||||
.. read and write exclusive access to the info ...
|
||||
write_unlock_irqrestore(&xxx_lock, flags);
|
||||
|
||||
The above kind of lock is useful for complex data structures like linked
|
||||
lists etc, especially when you know that most of the work is to just
|
||||
traverse the list searching for entries without changing the list itself,
|
||||
for example. Then you can use the read lock for that kind of list
|
||||
traversal, which allows many concurrent readers. Anything that _changes_
|
||||
the list will have to get the write lock.
|
||||
The above kind of lock may be useful for complex data structures like
|
||||
linked lists, especially searching for entries without changing the list
|
||||
itself. The read lock allows many concurrent readers. Anything that
|
||||
_changes_ the list will have to get the write lock.
|
||||
|
||||
Note: you cannot "upgrade" a read-lock to a write-lock, so if you at _any_
|
||||
NOTE! RCU is better for list traversal, but requires careful
|
||||
attention to design detail (see Documentation/RCU/listRCU.txt).
|
||||
|
||||
Also, you cannot "upgrade" a read-lock to a write-lock, so if you at _any_
|
||||
time need to do any changes (even if you don't do it every time), you have
|
||||
to get the write-lock at the very beginning. I could fairly easily add a
|
||||
primitive to create a "upgradeable" read-lock, but it hasn't been an issue
|
||||
yet. Tell me if you'd want one.
|
||||
to get the write-lock at the very beginning.
|
||||
|
||||
NOTE! We are working hard to remove reader-writer spinlocks in most
|
||||
cases, so please don't add a new one without consensus. (Instead, see
|
||||
Documentation/RCU/rcu.txt for complete information.)
|
||||
|
||||
----
|
||||
|
||||
@ -233,4 +175,46 @@ indeed), while write-locks need to protect themselves against interrupts.
|
||||
|
||||
Linus
|
||||
|
||||
----
|
||||
|
||||
Reference information:
|
||||
|
||||
For dynamic initialization, use spin_lock_init() or rwlock_init() as
|
||||
appropriate:
|
||||
|
||||
spinlock_t xxx_lock;
|
||||
rwlock_t xxx_rw_lock;
|
||||
|
||||
static int __init xxx_init(void)
|
||||
{
|
||||
spin_lock_init(&xxx_lock);
|
||||
rwlock_init(&xxx_rw_lock);
|
||||
...
|
||||
}
|
||||
|
||||
module_init(xxx_init);
|
||||
|
||||
For static initialization, use DEFINE_SPINLOCK() / DEFINE_RWLOCK() or
|
||||
__SPIN_LOCK_UNLOCKED() / __RW_LOCK_UNLOCKED() as appropriate.
|
||||
|
||||
SPIN_LOCK_UNLOCKED and RW_LOCK_UNLOCKED are deprecated. These interfere
|
||||
with lockdep state tracking.
|
||||
|
||||
Most of the time, you can simply turn:
|
||||
static spinlock_t xxx_lock = SPIN_LOCK_UNLOCKED;
|
||||
into:
|
||||
static DEFINE_SPINLOCK(xxx_lock);
|
||||
|
||||
Static structure member variables go from:
|
||||
|
||||
struct foo bar {
|
||||
.lock = SPIN_LOCK_UNLOCKED;
|
||||
};
|
||||
|
||||
to:
|
||||
|
||||
struct foo bar {
|
||||
.lock = __SPIN_LOCK_UNLOCKED(bar.lock);
|
||||
};
|
||||
|
||||
Declaration of static rw_locks undergo a similar transformation.
|
||||
|
@ -19,6 +19,8 @@ Currently, these files might (depending on your configuration)
|
||||
show up in /proc/sys/kernel:
|
||||
- acpi_video_flags
|
||||
- acct
|
||||
- bootloader_type [ X86 only ]
|
||||
- bootloader_version [ X86 only ]
|
||||
- callhome [ S390 only ]
|
||||
- auto_msgmni
|
||||
- core_pattern
|
||||
@ -93,6 +95,35 @@ valid for 30 seconds.
|
||||
|
||||
==============================================================
|
||||
|
||||
bootloader_type:
|
||||
|
||||
x86 bootloader identification
|
||||
|
||||
This gives the bootloader type number as indicated by the bootloader,
|
||||
shifted left by 4, and OR'd with the low four bits of the bootloader
|
||||
version. The reason for this encoding is that this used to match the
|
||||
type_of_loader field in the kernel header; the encoding is kept for
|
||||
backwards compatibility. That is, if the full bootloader type number
|
||||
is 0x15 and the full version number is 0x234, this file will contain
|
||||
the value 340 = 0x154.
|
||||
|
||||
See the type_of_loader and ext_loader_type fields in
|
||||
Documentation/x86/boot.txt for additional information.
|
||||
|
||||
==============================================================
|
||||
|
||||
bootloader_version:
|
||||
|
||||
x86 bootloader version
|
||||
|
||||
The complete bootloader version number. In the example above, this
|
||||
file will contain the value 564 = 0x234.
|
||||
|
||||
See the type_of_loader and ext_loader_ver fields in
|
||||
Documentation/x86/boot.txt for additional information.
|
||||
|
||||
==============================================================
|
||||
|
||||
callhome:
|
||||
|
||||
Controls the kernel's callhome behavior in case of a kernel panic.
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
Alan Stern <stern@rowland.harvard.edu>
|
||||
|
||||
October 5, 2007
|
||||
November 10, 2009
|
||||
|
||||
|
||||
|
||||
@ -123,9 +123,9 @@ relevant attribute files are: wakeup, level, and autosuspend.
|
||||
|
||||
power/level
|
||||
|
||||
This file contains one of three words: "on", "auto",
|
||||
or "suspend". You can write those words to the file
|
||||
to change the device's setting.
|
||||
This file contains one of two words: "on" or "auto".
|
||||
You can write those words to the file to change the
|
||||
device's setting.
|
||||
|
||||
"on" means that the device should be resumed and
|
||||
autosuspend is not allowed. (Of course, system
|
||||
@ -134,10 +134,10 @@ relevant attribute files are: wakeup, level, and autosuspend.
|
||||
"auto" is the normal state in which the kernel is
|
||||
allowed to autosuspend and autoresume the device.
|
||||
|
||||
"suspend" means that the device should remain
|
||||
suspended, and autoresume is not allowed. (But remote
|
||||
wakeup may still be allowed, since it is controlled
|
||||
separately by the power/wakeup attribute.)
|
||||
(In kernels up to 2.6.32, you could also specify
|
||||
"suspend", meaning that the device should remain
|
||||
suspended and autoresume was not allowed. This
|
||||
setting is no longer supported.)
|
||||
|
||||
power/autosuspend
|
||||
|
||||
@ -313,13 +313,14 @@ three of the methods listed above. In addition, a driver indicates
|
||||
that it supports autosuspend by setting the .supports_autosuspend flag
|
||||
in its usb_driver structure. It is then responsible for informing the
|
||||
USB core whenever one of its interfaces becomes busy or idle. The
|
||||
driver does so by calling these five functions:
|
||||
driver does so by calling these six functions:
|
||||
|
||||
int usb_autopm_get_interface(struct usb_interface *intf);
|
||||
void usb_autopm_put_interface(struct usb_interface *intf);
|
||||
int usb_autopm_set_interface(struct usb_interface *intf);
|
||||
int usb_autopm_get_interface_async(struct usb_interface *intf);
|
||||
void usb_autopm_put_interface_async(struct usb_interface *intf);
|
||||
void usb_autopm_get_interface_no_resume(struct usb_interface *intf);
|
||||
void usb_autopm_put_interface_no_suspend(struct usb_interface *intf);
|
||||
|
||||
The functions work by maintaining a counter in the usb_interface
|
||||
structure. When intf->pm_usage_count is > 0 then the interface is
|
||||
@ -331,11 +332,13 @@ considered to be idle, and the kernel may autosuspend the device.
|
||||
associated with the device itself rather than any of its interfaces.
|
||||
This field is used only by the USB core.)
|
||||
|
||||
The driver owns intf->pm_usage_count; it can modify the value however
|
||||
and whenever it likes. A nice aspect of the non-async usb_autopm_*
|
||||
routines is that the changes they make are protected by the usb_device
|
||||
structure's PM mutex (udev->pm_mutex); however drivers may change
|
||||
pm_usage_count without holding the mutex. Drivers using the async
|
||||
Drivers must not modify intf->pm_usage_count directly; its value
|
||||
should be changed only be using the functions listed above. Drivers
|
||||
are responsible for insuring that the overall change to pm_usage_count
|
||||
during their lifetime balances out to 0 (it may be necessary for the
|
||||
disconnect method to call usb_autopm_put_interface() one or more times
|
||||
to fulfill this requirement). The first two routines use the PM mutex
|
||||
in struct usb_device for mutual exclusion; drivers using the async
|
||||
routines are responsible for their own synchronization and mutual
|
||||
exclusion.
|
||||
|
||||
@ -347,11 +350,6 @@ exclusion.
|
||||
attempts an autosuspend if the new value is <= 0 and the
|
||||
device isn't suspended.
|
||||
|
||||
usb_autopm_set_interface() leaves pm_usage_count alone.
|
||||
It attempts an autoresume if the value is > 0 and the device
|
||||
is suspended, and it attempts an autosuspend if the value is
|
||||
<= 0 and the device isn't suspended.
|
||||
|
||||
usb_autopm_get_interface_async() and
|
||||
usb_autopm_put_interface_async() do almost the same things as
|
||||
their non-async counterparts. The differences are: they do
|
||||
@ -360,13 +358,11 @@ exclusion.
|
||||
such as an URB's completion handler, but when they return the
|
||||
device will not generally not yet be in the desired state.
|
||||
|
||||
There also are a couple of utility routines drivers can use:
|
||||
|
||||
usb_autopm_enable() sets pm_usage_cnt to 0 and then calls
|
||||
usb_autopm_set_interface(), which will attempt an autosuspend.
|
||||
|
||||
usb_autopm_disable() sets pm_usage_cnt to 1 and then calls
|
||||
usb_autopm_set_interface(), which will attempt an autoresume.
|
||||
usb_autopm_get_interface_no_resume() and
|
||||
usb_autopm_put_interface_no_suspend() merely increment or
|
||||
decrement the pm_usage_count value; they do not attempt to
|
||||
carry out an autoresume or an autosuspend. Hence they can be
|
||||
called in an atomic context.
|
||||
|
||||
The conventional usage pattern is that a driver calls
|
||||
usb_autopm_get_interface() in its open routine and
|
||||
@ -400,11 +396,11 @@ though, setting this flag won't cause the kernel to autoresume it.
|
||||
Normally a driver would set this flag in its probe method, at which
|
||||
time the device is guaranteed not to be autosuspended.)
|
||||
|
||||
The usb_autopm_* routines have to run in a sleepable process context;
|
||||
they must not be called from an interrupt handler or while holding a
|
||||
spinlock. In fact, the entire autosuspend mechanism is not well geared
|
||||
toward interrupt-driven operation. However there is one thing a
|
||||
driver can do in an interrupt handler:
|
||||
The synchronous usb_autopm_* routines have to run in a sleepable
|
||||
process context; they must not be called from an interrupt handler or
|
||||
while holding a spinlock. In fact, the entire autosuspend mechanism
|
||||
is not well geared toward interrupt-driven operation. However there
|
||||
is one thing a driver can do in an interrupt handler:
|
||||
|
||||
usb_mark_last_busy(struct usb_device *udev);
|
||||
|
||||
@ -423,15 +419,16 @@ an URB had completed too recently.
|
||||
|
||||
External suspend calls should never be allowed to fail in this way,
|
||||
only autosuspend calls. The driver can tell them apart by checking
|
||||
udev->auto_pm; this flag will be set to 1 for internal PM events
|
||||
(autosuspend or autoresume) and 0 for external PM events.
|
||||
the PM_EVENT_AUTO bit in the message.event argument to the suspend
|
||||
method; this bit will be set for internal PM events (autosuspend) and
|
||||
clear for external PM events.
|
||||
|
||||
Many of the ingredients in the autosuspend framework are oriented
|
||||
towards interfaces: The usb_interface structure contains the
|
||||
pm_usage_cnt field, and the usb_autopm_* routines take an interface
|
||||
pointer as their argument. But somewhat confusingly, a few of the
|
||||
pieces (usb_mark_last_busy() and udev->auto_pm) use the usb_device
|
||||
structure instead. Drivers need to keep this straight; they can call
|
||||
pieces (i.e., usb_mark_last_busy()) use the usb_device structure
|
||||
instead. Drivers need to keep this straight; they can call
|
||||
interface_to_usbdev() to find the device structure for a given
|
||||
interface.
|
||||
|
||||
|
57
MAINTAINERS
57
MAINTAINERS
@ -801,6 +801,19 @@ L: openmoko-kernel@lists.openmoko.org (subscribers-only)
|
||||
W: http://wiki.openmoko.org/wiki/Neo_FreeRunner
|
||||
S: Supported
|
||||
|
||||
ARM/QUALCOMM MSM MACHINE SUPPORT
|
||||
M: David Brown <davidb@codeaurora.org>
|
||||
M: Daniel Walker <dwalker@codeaurora.org>
|
||||
M: Bryan Huntsman <bryanh@codeaurora.org>
|
||||
F: arch/arm/mach-msm/
|
||||
F: drivers/video/msm/
|
||||
F: drivers/mmc/host/msm_sdcc.c
|
||||
F: drivers/mmc/host/msm_sdcc.h
|
||||
F: drivers/serial/msm_serial.h
|
||||
F: drivers/serial/msm_serial.c
|
||||
T: git git://codeaurora.org/quic/kernel/dwalker/linux-msm.git
|
||||
S: Maintained
|
||||
|
||||
ARM/TOSA MACHINE SUPPORT
|
||||
M: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
|
||||
M: Dirk Opfer <dirk@opfer-online.de>
|
||||
@ -3247,6 +3260,7 @@ LINUX FOR IBM pSERIES (RS/6000)
|
||||
M: Paul Mackerras <paulus@au.ibm.com>
|
||||
W: http://www.ibm.com/linux/ltc/projects/ppc
|
||||
S: Supported
|
||||
F: arch/powerpc/boot/rs6000.h
|
||||
|
||||
LINUX FOR POWERPC (32-BIT AND 64-BIT)
|
||||
M: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
@ -3255,18 +3269,24 @@ W: http://www.penguinppc.org/
|
||||
L: linuxppc-dev@ozlabs.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc.git
|
||||
S: Supported
|
||||
F: Documentation/powerpc/
|
||||
F: arch/powerpc/
|
||||
|
||||
LINUX FOR POWER MACINTOSH
|
||||
M: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
W: http://www.penguinppc.org/
|
||||
L: linuxppc-dev@ozlabs.org
|
||||
S: Maintained
|
||||
F: arch/powerpc/platforms/powermac/
|
||||
F: drivers/macintosh/
|
||||
|
||||
LINUX FOR POWERPC EMBEDDED MPC5XXX
|
||||
M: Grant Likely <grant.likely@secretlab.ca>
|
||||
L: linuxppc-dev@ozlabs.org
|
||||
T: git git://git.secretlab.ca/git/linux-2.6.git
|
||||
S: Maintained
|
||||
F: arch/powerpc/platforms/512x/
|
||||
F: arch/powerpc/platforms/52xx/
|
||||
|
||||
LINUX FOR POWERPC EMBEDDED PPC4XX
|
||||
M: Josh Boyer <jwboyer@linux.vnet.ibm.com>
|
||||
@ -3275,6 +3295,8 @@ W: http://www.penguinppc.org/
|
||||
L: linuxppc-dev@ozlabs.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jwboyer/powerpc-4xx.git
|
||||
S: Maintained
|
||||
F: arch/powerpc/platforms/40x/
|
||||
F: arch/powerpc/platforms/44x/
|
||||
|
||||
LINUX FOR POWERPC EMBEDDED XILINX VIRTEX
|
||||
M: Grant Likely <grant.likely@secretlab.ca>
|
||||
@ -3282,6 +3304,8 @@ W: http://wiki.secretlab.ca/index.php/Linux_on_Xilinx_Virtex
|
||||
L: linuxppc-dev@ozlabs.org
|
||||
T: git git://git.secretlab.ca/git/linux-2.6.git
|
||||
S: Maintained
|
||||
F: arch/powerpc/*/*virtex*
|
||||
F: arch/powerpc/*/*/*virtex*
|
||||
|
||||
LINUX FOR POWERPC EMBEDDED PPC8XX
|
||||
M: Vitaly Bordug <vitb@kernel.crashing.org>
|
||||
@ -3295,12 +3319,16 @@ M: Kumar Gala <galak@kernel.crashing.org>
|
||||
W: http://www.penguinppc.org/
|
||||
L: linuxppc-dev@ozlabs.org
|
||||
S: Maintained
|
||||
F: arch/powerpc/platforms/83xx/
|
||||
|
||||
LINUX FOR POWERPC PA SEMI PWRFICIENT
|
||||
M: Olof Johansson <olof@lixom.net>
|
||||
W: http://www.pasemi.com/
|
||||
L: linuxppc-dev@ozlabs.org
|
||||
S: Supported
|
||||
F: arch/powerpc/platforms/pasemi/
|
||||
F: drivers/*/*pasemi*
|
||||
F: drivers/*/*/*pasemi*
|
||||
|
||||
LINUX SECURITY MODULE (LSM) FRAMEWORK
|
||||
M: Chris Wright <chrisw@sous-sol.org>
|
||||
@ -3903,6 +3931,23 @@ L: linux-omap@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/video/omap/
|
||||
|
||||
OMAP DISPLAY SUBSYSTEM SUPPORT (DSS2)
|
||||
M: Tomi Valkeinen <tomi.valkeinen@nokia.com>
|
||||
L: linux-omap@vger.kernel.org
|
||||
L: linux-fbdev@vger.kernel.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: drivers/video/omap2/dss/
|
||||
F: drivers/video/omap2/vrfb.c
|
||||
F: drivers/video/omap2/vram.c
|
||||
F: Documentation/arm/OMAP/DSS
|
||||
|
||||
OMAP FRAMEBUFFER SUPPORT (FOR DSS2)
|
||||
M: Tomi Valkeinen <tomi.valkeinen@nokia.com>
|
||||
L: linux-omap@vger.kernel.org
|
||||
L: linux-fbdev@vger.kernel.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: drivers/video/omap2/omapfb/
|
||||
|
||||
OMAP MMC SUPPORT
|
||||
M: Jarkko Lavinen <jarkko.lavinen@nokia.com>
|
||||
L: linux-omap@vger.kernel.org
|
||||
@ -5035,6 +5080,7 @@ F: drivers/char/specialix*
|
||||
|
||||
SPI SUBSYSTEM
|
||||
M: David Brownell <dbrownell@users.sourceforge.net>
|
||||
M: Grant Likely <grant.likely@secretlab.ca>
|
||||
L: spi-devel-general@lists.sourceforge.net
|
||||
S: Maintained
|
||||
F: Documentation/spi/
|
||||
@ -5335,7 +5381,7 @@ S: Maintained
|
||||
F: drivers/scsi/u14-34f.c
|
||||
|
||||
UBI FILE SYSTEM (UBIFS)
|
||||
M: Artem Bityutskiy <dedekind@infradead.org>
|
||||
M: Artem Bityutskiy <dedekind1@gmail.com>
|
||||
M: Adrian Hunter <adrian.hunter@nokia.com>
|
||||
L: linux-mtd@lists.infradead.org
|
||||
T: git git://git.infradead.org/ubifs-2.6.git
|
||||
@ -5386,7 +5432,7 @@ F: drivers/cdrom/cdrom.c
|
||||
F: include/linux/cdrom.h
|
||||
|
||||
UNSORTED BLOCK IMAGES (UBI)
|
||||
M: Artem Bityutskiy <dedekind@infradead.org>
|
||||
M: Artem Bityutskiy <dedekind1@gmail.com>
|
||||
W: http://www.linux-mtd.infradead.org/
|
||||
L: linux-mtd@lists.infradead.org
|
||||
T: git git://git.infradead.org/ubi-2.6.git
|
||||
@ -5409,10 +5455,9 @@ S: Supported
|
||||
F: drivers/block/ub.c
|
||||
|
||||
USB CDC ETHERNET DRIVER
|
||||
M: Greg Kroah-Hartman <greg@kroah.com>
|
||||
M: Oliver Neukum <oliver@neukum.name>
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Maintained
|
||||
W: http://www.kroah.com/linux-usb/
|
||||
F: drivers/net/usb/cdc_*.c
|
||||
F: include/linux/usb/cdc.h
|
||||
|
||||
@ -5663,9 +5708,11 @@ S: Maintained
|
||||
F: drivers/net/wireless/rndis_wlan.c
|
||||
|
||||
USB XHCI DRIVER
|
||||
M: Sarah Sharp <sarah.a.sharp@intel.com>
|
||||
M: Sarah Sharp <sarah.a.sharp@linux.intel.com>
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/usb/host/xhci*
|
||||
F: drivers/usb/host/pci-quirks*
|
||||
|
||||
USB ZC0301 DRIVER
|
||||
M: Luca Risolia <luca.risolia@studio.unibo.it>
|
||||
|
@ -1,8 +1,6 @@
|
||||
#ifndef _ALPHA_FCNTL_H
|
||||
#define _ALPHA_FCNTL_H
|
||||
|
||||
/* open/fcntl - O_SYNC is only implemented on blocks devices and on files
|
||||
located on an ext2 file system */
|
||||
#define O_CREAT 01000 /* not fcntl */
|
||||
#define O_TRUNC 02000 /* not fcntl */
|
||||
#define O_EXCL 04000 /* not fcntl */
|
||||
@ -10,13 +8,28 @@
|
||||
|
||||
#define O_NONBLOCK 00004
|
||||
#define O_APPEND 00010
|
||||
#define O_SYNC 040000
|
||||
#define O_DSYNC 040000 /* used to be O_SYNC, see below */
|
||||
#define O_DIRECTORY 0100000 /* must be a directory */
|
||||
#define O_NOFOLLOW 0200000 /* don't follow links */
|
||||
#define O_LARGEFILE 0400000 /* will be set by the kernel on every open */
|
||||
#define O_DIRECT 02000000 /* direct disk access - should check with OSF/1 */
|
||||
#define O_NOATIME 04000000
|
||||
#define O_CLOEXEC 010000000 /* set close_on_exec */
|
||||
/*
|
||||
* Before Linux 2.6.32 only O_DSYNC semantics were implemented, but using
|
||||
* the O_SYNC flag. We continue to use the existing numerical value
|
||||
* for O_DSYNC semantics now, but using the correct symbolic name for it.
|
||||
* This new value is used to request true Posix O_SYNC semantics. It is
|
||||
* defined in this strange way to make sure applications compiled against
|
||||
* new headers get at least O_DSYNC semantics on older kernels.
|
||||
*
|
||||
* This has the nice side-effect that we can simply test for O_DSYNC
|
||||
* wherever we do not care if O_DSYNC or O_SYNC is used.
|
||||
*
|
||||
* Note: __O_SYNC must never be used directly.
|
||||
*/
|
||||
#define __O_SYNC 020000000
|
||||
#define O_SYNC (__O_SYNC|O_DSYNC)
|
||||
|
||||
#define F_GETLK 7
|
||||
#define F_SETLK 8
|
||||
|
@ -178,25 +178,18 @@ SYSCALL_DEFINE6(osf_mmap, unsigned long, addr, unsigned long, len,
|
||||
unsigned long, prot, unsigned long, flags, unsigned long, fd,
|
||||
unsigned long, off)
|
||||
{
|
||||
struct file *file = NULL;
|
||||
unsigned long ret = -EBADF;
|
||||
unsigned long ret = -EINVAL;
|
||||
|
||||
#if 0
|
||||
if (flags & (_MAP_HASSEMAPHORE | _MAP_INHERIT | _MAP_UNALIGNED))
|
||||
printk("%s: unimplemented OSF mmap flags %04lx\n",
|
||||
current->comm, flags);
|
||||
#endif
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
file = fget(fd);
|
||||
if (!file)
|
||||
goto out;
|
||||
}
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
ret = do_mmap(file, addr, len, prot, flags, off);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
if (file)
|
||||
fput(file);
|
||||
if ((off + PAGE_ALIGN(len)) < off)
|
||||
goto out;
|
||||
if (off & ~PAGE_MASK)
|
||||
goto out;
|
||||
ret = sys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
@ -603,6 +603,7 @@ config ARCH_SA1100
|
||||
select ARCH_SPARSEMEM_ENABLE
|
||||
select ARCH_MTD_XIP
|
||||
select ARCH_HAS_CPUFREQ
|
||||
select CPU_FREQ
|
||||
select GENERIC_GPIO
|
||||
select GENERIC_TIME
|
||||
select GENERIC_CLOCKEVENTS
|
||||
@ -1359,13 +1360,9 @@ source "drivers/cpufreq/Kconfig"
|
||||
|
||||
config CPU_FREQ_SA1100
|
||||
bool
|
||||
depends on CPU_FREQ && (SA1100_H3100 || SA1100_H3600 || SA1100_LART || SA1100_PLEB || SA1100_BADGE4 || SA1100_HACKKIT)
|
||||
default y
|
||||
|
||||
config CPU_FREQ_SA1110
|
||||
bool
|
||||
depends on CPU_FREQ && (SA1100_ASSABET || SA1100_CERF || SA1100_PT_SYSTEM3)
|
||||
default y
|
||||
|
||||
config CPU_FREQ_INTEGRATOR
|
||||
tristate "CPUfreq driver for ARM Integrator CPUs"
|
||||
|
@ -71,6 +71,14 @@ config DEBUG_LL
|
||||
in the kernel. This is helpful if you are debugging code that
|
||||
executes before the console is initialized.
|
||||
|
||||
config EARLY_PRINTK
|
||||
bool "Early printk"
|
||||
depends on DEBUG_LL
|
||||
help
|
||||
Say Y here if you want to have an early console using the
|
||||
kernel low-level debugging functions. Add earlyprintk to your
|
||||
kernel parameters to enable this console.
|
||||
|
||||
config DEBUG_ICEDCC
|
||||
bool "Kernel low-level debugging via EmbeddedICE DCC channel"
|
||||
depends on DEBUG_LL
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.32-rc6
|
||||
# Sat Nov 14 10:56:01 2009
|
||||
# Linux kernel version: 2.6.32-rc8
|
||||
# Sat Dec 5 12:16:24 2009
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
||||
@ -198,7 +198,9 @@ CONFIG_ARCH_OMAP1=y
|
||||
# OMAP Feature Selections
|
||||
#
|
||||
# CONFIG_OMAP_RESET_CLOCKS is not set
|
||||
# CONFIG_OMAP_MUX is not set
|
||||
CONFIG_OMAP_MUX=y
|
||||
# CONFIG_OMAP_MUX_DEBUG is not set
|
||||
CONFIG_OMAP_MUX_WARNINGS=y
|
||||
CONFIG_OMAP_MCBSP=y
|
||||
# CONFIG_OMAP_MBOX_FWK is not set
|
||||
CONFIG_OMAP_MPU_TIMER=y
|
||||
@ -207,6 +209,7 @@ CONFIG_OMAP_LL_DEBUG_UART1=y
|
||||
# CONFIG_OMAP_LL_DEBUG_UART2 is not set
|
||||
# CONFIG_OMAP_LL_DEBUG_UART3 is not set
|
||||
# CONFIG_OMAP_LL_DEBUG_NONE is not set
|
||||
CONFIG_OMAP_SERIAL_WAKE=y
|
||||
# CONFIG_OMAP_PM_NONE is not set
|
||||
CONFIG_OMAP_PM_NOOP=y
|
||||
|
||||
|
2431
arch/arm/configs/omap3_touchbook_defconfig
Normal file
2431
arch/arm/configs/omap3_touchbook_defconfig
Normal file
File diff suppressed because it is too large
Load Diff
@ -963,10 +963,32 @@ CONFIG_FB_CFB_IMAGEBLIT=y
|
||||
#
|
||||
# CONFIG_FB_S1D13XXX is not set
|
||||
# CONFIG_FB_VIRTUAL is not set
|
||||
CONFIG_FB_OMAP=y
|
||||
# CONFIG_FB_OMAP_LCDC_EXTERNAL is not set
|
||||
# CONFIG_FB_METRONOME is not set
|
||||
# CONFIG_FB_MB862XX is not set
|
||||
# CONFIG_FB_BROADSHEET is not set
|
||||
# CONFIG_FB_OMAP_LCD_VGA is not set
|
||||
# CONFIG_FB_OMAP_BOOTLOADER_INIT is not set
|
||||
CONFIG_FB_OMAP_CONSISTENT_DMA_SIZE=2
|
||||
CONFIG_OMAP2_VRAM=y
|
||||
CONFIG_OMAP2_VRFB=y
|
||||
CONFIG_OMAP2_DSS=y
|
||||
CONFIG_OMAP2_VRAM_SIZE=4
|
||||
CONFIG_OMAP2_DSS_DEBUG_SUPPORT=y
|
||||
# CONFIG_OMAP2_DSS_RFBI is not set
|
||||
CONFIG_OMAP2_DSS_VENC=y
|
||||
# CONFIG_OMAP2_DSS_SDI is not set
|
||||
# CONFIG_OMAP2_DSS_DSI is not set
|
||||
# CONFIG_OMAP2_DSS_FAKE_VSYNC is not set
|
||||
CONFIG_OMAP2_DSS_MIN_FCK_PER_PCK=0
|
||||
CONFIG_FB_OMAP2=y
|
||||
CONFIG_FB_OMAP2_DEBUG_SUPPORT=y
|
||||
# CONFIG_FB_OMAP2_FORCE_AUTO_UPDATE is not set
|
||||
CONFIG_FB_OMAP2_NUM_FBS=3
|
||||
|
||||
#
|
||||
# OMAP2/3 Display Device Drivers
|
||||
#
|
||||
CONFIG_PANEL_GENERIC=y
|
||||
CONFIG_PANEL_SHARP_LS037V7DW01=y
|
||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||
|
||||
#
|
||||
|
@ -1,26 +1,29 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.30-rc7
|
||||
# Tue Jun 9 12:36:23 2009
|
||||
# Linux kernel version: 2.6.32
|
||||
# Sun Dec 6 23:37:45 2009
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
||||
CONFIG_GENERIC_GPIO=y
|
||||
CONFIG_GENERIC_TIME=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_STACKTRACE_SUPPORT=y
|
||||
CONFIG_LOCKDEP_SUPPORT=y
|
||||
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
|
||||
CONFIG_HARDIRQS_SW_RESEND=y
|
||||
CONFIG_GENERIC_IRQ_PROBE=y
|
||||
CONFIG_GENERIC_LOCKBREAK=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
CONFIG_ARCH_HAS_CPUFREQ=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
|
||||
CONFIG_VECTORS_BASE=0xffff0000
|
||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
CONFIG_CONSTRUCTORS=y
|
||||
|
||||
#
|
||||
# General setup
|
||||
@ -39,11 +42,12 @@ CONFIG_BSD_PROCESS_ACCT=y
|
||||
#
|
||||
# RCU Subsystem
|
||||
#
|
||||
CONFIG_CLASSIC_RCU=y
|
||||
# CONFIG_TREE_RCU is not set
|
||||
# CONFIG_PREEMPT_RCU is not set
|
||||
CONFIG_TREE_RCU=y
|
||||
# CONFIG_TREE_PREEMPT_RCU is not set
|
||||
# CONFIG_RCU_TRACE is not set
|
||||
CONFIG_RCU_FANOUT=32
|
||||
# CONFIG_RCU_FANOUT_EXACT is not set
|
||||
# CONFIG_TREE_RCU_TRACE is not set
|
||||
# CONFIG_PREEMPT_RCU_TRACE is not set
|
||||
# CONFIG_IKCONFIG is not set
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_GROUP_SCHED=y
|
||||
@ -52,8 +56,7 @@ CONFIG_FAIR_GROUP_SCHED=y
|
||||
CONFIG_USER_SCHED=y
|
||||
# CONFIG_CGROUP_SCHED is not set
|
||||
# CONFIG_CGROUPS is not set
|
||||
# CONFIG_SYSFS_DEPRECATED=y is not set
|
||||
# CONFIG_SYSFS_DEPRECATED_V2=y is not set
|
||||
# CONFIG_SYSFS_DEPRECATED_V2 is not set
|
||||
# CONFIG_RELAY is not set
|
||||
# CONFIG_NAMESPACES is not set
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
@ -70,7 +73,6 @@ CONFIG_UID16=y
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
# CONFIG_STRIP_ASM_SYMS is not set
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
@ -83,6 +85,10 @@ CONFIG_TIMERFD=y
|
||||
CONFIG_EVENTFD=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_AIO=y
|
||||
|
||||
#
|
||||
# Kernel Performance Events And Counters
|
||||
#
|
||||
CONFIG_VM_EVENT_COUNTERS=y
|
||||
CONFIG_SLUB_DEBUG=y
|
||||
CONFIG_COMPAT_BRK=y
|
||||
@ -90,13 +96,16 @@ CONFIG_COMPAT_BRK=y
|
||||
CONFIG_SLUB=y
|
||||
# CONFIG_SLOB is not set
|
||||
# CONFIG_PROFILING is not set
|
||||
# CONFIG_MARKERS is not set
|
||||
CONFIG_HAVE_OPROFILE=y
|
||||
# CONFIG_KPROBES is not set
|
||||
CONFIG_HAVE_KPROBES=y
|
||||
CONFIG_HAVE_KRETPROBES=y
|
||||
CONFIG_USE_GENERIC_SMP_HELPERS=y
|
||||
CONFIG_HAVE_CLK=y
|
||||
|
||||
#
|
||||
# GCOV-based kernel profiling
|
||||
#
|
||||
# CONFIG_SLOW_WORK is not set
|
||||
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
|
||||
CONFIG_SLABINFO=y
|
||||
@ -110,7 +119,7 @@ CONFIG_MODVERSIONS=y
|
||||
CONFIG_MODULE_SRCVERSION_ALL=y
|
||||
CONFIG_STOP_MACHINE=y
|
||||
CONFIG_BLOCK=y
|
||||
# CONFIG_LBD is not set
|
||||
CONFIG_LBDAF=y
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
# CONFIG_BLK_DEV_INTEGRITY is not set
|
||||
|
||||
@ -131,6 +140,7 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
|
||||
#
|
||||
# System Type
|
||||
#
|
||||
CONFIG_MMU=y
|
||||
# CONFIG_ARCH_AAEC2000 is not set
|
||||
# CONFIG_ARCH_INTEGRATOR is not set
|
||||
# CONFIG_ARCH_REALVIEW is not set
|
||||
@ -142,8 +152,10 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
|
||||
# CONFIG_ARCH_EP93XX is not set
|
||||
# CONFIG_ARCH_FOOTBRIDGE is not set
|
||||
# CONFIG_ARCH_MXC is not set
|
||||
# CONFIG_ARCH_STMP3XXX is not set
|
||||
# CONFIG_ARCH_NETX is not set
|
||||
# CONFIG_ARCH_H720X is not set
|
||||
# CONFIG_ARCH_NOMADIK is not set
|
||||
# CONFIG_ARCH_IOP13XX is not set
|
||||
# CONFIG_ARCH_IOP32X is not set
|
||||
# CONFIG_ARCH_IOP33X is not set
|
||||
@ -166,10 +178,13 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
|
||||
# CONFIG_ARCH_SA1100 is not set
|
||||
# CONFIG_ARCH_S3C2410 is not set
|
||||
# CONFIG_ARCH_S3C64XX is not set
|
||||
# CONFIG_ARCH_S5PC1XX is not set
|
||||
# CONFIG_ARCH_SHARK is not set
|
||||
# CONFIG_ARCH_LH7A40X is not set
|
||||
# CONFIG_ARCH_U300 is not set
|
||||
# CONFIG_ARCH_DAVINCI is not set
|
||||
CONFIG_ARCH_OMAP=y
|
||||
# CONFIG_ARCH_BCMRING is not set
|
||||
|
||||
#
|
||||
# TI OMAP Implementations
|
||||
@ -190,9 +205,12 @@ CONFIG_ARCH_OMAP4=y
|
||||
CONFIG_OMAP_32K_TIMER=y
|
||||
CONFIG_OMAP_32K_TIMER_HZ=128
|
||||
CONFIG_OMAP_DM_TIMER=y
|
||||
CONFIG_OMAP_LL_DEBUG_UART1=y
|
||||
# CONFIG_OMAP_LL_DEBUG_UART1 is not set
|
||||
# CONFIG_OMAP_LL_DEBUG_UART2 is not set
|
||||
# CONFIG_OMAP_LL_DEBUG_UART3 is not set
|
||||
CONFIG_OMAP_LL_DEBUG_UART3=y
|
||||
# CONFIG_OMAP_LL_DEBUG_NONE is not set
|
||||
# CONFIG_OMAP_PM_NONE is not set
|
||||
CONFIG_OMAP_PM_NOOP=y
|
||||
|
||||
#
|
||||
# OMAP Board Type
|
||||
@ -207,7 +225,7 @@ CONFIG_CPU_32v6K=y
|
||||
CONFIG_CPU_V7=y
|
||||
CONFIG_CPU_32v7=y
|
||||
CONFIG_CPU_ABRT_EV7=y
|
||||
CONFIG_CPU_PABRT_IFAR=y
|
||||
CONFIG_CPU_PABRT_V7=y
|
||||
CONFIG_CPU_CACHE_V7=y
|
||||
CONFIG_CPU_CACHE_VIPT=y
|
||||
CONFIG_CPU_COPY_V6=y
|
||||
@ -222,9 +240,10 @@ CONFIG_CPU_CP15_MMU=y
|
||||
# CONFIG_ARM_THUMB is not set
|
||||
# CONFIG_ARM_THUMBEE is not set
|
||||
# CONFIG_CPU_ICACHE_DISABLE is not set
|
||||
CONFIG_CPU_DCACHE_DISABLE=y
|
||||
# CONFIG_CPU_DCACHE_DISABLE is not set
|
||||
# CONFIG_CPU_BPREDICT_DISABLE is not set
|
||||
CONFIG_HAS_TLS_REG=y
|
||||
CONFIG_ARM_L1_CACHE_SHIFT=5
|
||||
# CONFIG_ARM_ERRATA_430973 is not set
|
||||
# CONFIG_ARM_ERRATA_458693 is not set
|
||||
# CONFIG_ARM_ERRATA_460075 is not set
|
||||
@ -245,18 +264,20 @@ CONFIG_ARM_GIC=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_HAVE_ARM_SCU=y
|
||||
CONFIG_HAVE_ARM_TWD=y
|
||||
CONFIG_VMSPLIT_3G=y
|
||||
# CONFIG_VMSPLIT_2G is not set
|
||||
# CONFIG_VMSPLIT_1G is not set
|
||||
CONFIG_PAGE_OFFSET=0xC0000000
|
||||
CONFIG_NR_CPUS=2
|
||||
# CONFIG_HOTPLUG_CPU is not set
|
||||
CONFIG_LOCAL_TIMERS=y
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_LOCAL_TIMERS is not set
|
||||
# CONFIG_PREEMPT_NONE is not set
|
||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_HZ=128
|
||||
# CONFIG_THUMB2_KERNEL is not set
|
||||
CONFIG_AEABI=y
|
||||
# CONFIG_OABI_COMPAT is not set
|
||||
CONFIG_OABI_COMPAT=y
|
||||
# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
|
||||
# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
|
||||
# CONFIG_HIGHMEM is not set
|
||||
@ -271,10 +292,13 @@ CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||
# CONFIG_PHYS_ADDR_T_64BIT is not set
|
||||
CONFIG_ZONE_DMA_FLAG=0
|
||||
CONFIG_VIRT_TO_BUS=y
|
||||
# CONFIG_UNEVICTABLE_LRU is not set
|
||||
CONFIG_HAVE_MLOCK=y
|
||||
CONFIG_HAVE_MLOCKED_PAGE_BIT=y
|
||||
# CONFIG_KSM is not set
|
||||
CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
|
||||
# CONFIG_LEDS is not set
|
||||
CONFIG_ALIGNMENT_TRAP=y
|
||||
# CONFIG_UACCESS_WITH_MEMCPY is not set
|
||||
|
||||
#
|
||||
# Boot options
|
||||
@ -298,9 +322,11 @@ CONFIG_CMDLINE="root=/dev/ram0 rw mem=128M console=ttyS0,115200n8 initrd=0x81600
|
||||
#
|
||||
# At least one emulation must be selected
|
||||
#
|
||||
# CONFIG_FPE_NWFPE is not set
|
||||
# CONFIG_FPE_FASTFPE is not set
|
||||
CONFIG_VFP=y
|
||||
CONFIG_VFPv3=y
|
||||
# CONFIG_NEON is not set
|
||||
CONFIG_NEON=y
|
||||
|
||||
#
|
||||
# Userspace binary formats
|
||||
@ -325,6 +351,7 @@ CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||
# Generic Driver Options
|
||||
#
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
# CONFIG_DEVTMPFS is not set
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
# CONFIG_FW_LOADER is not set
|
||||
@ -342,6 +369,7 @@ CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=16384
|
||||
# CONFIG_BLK_DEV_XIP is not set
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
# CONFIG_MG_DISK is not set
|
||||
# CONFIG_MISC_DEVICES is not set
|
||||
CONFIG_HAVE_IDE=y
|
||||
# CONFIG_IDE is not set
|
||||
@ -355,6 +383,7 @@ CONFIG_HAVE_IDE=y
|
||||
# CONFIG_SCSI_NETLINK is not set
|
||||
# CONFIG_ATA is not set
|
||||
# CONFIG_MD is not set
|
||||
# CONFIG_PHONE is not set
|
||||
|
||||
#
|
||||
# Input device support
|
||||
@ -427,6 +456,11 @@ CONFIG_HW_RANDOM=y
|
||||
# CONFIG_TCG_TPM is not set
|
||||
# CONFIG_I2C is not set
|
||||
# CONFIG_SPI is not set
|
||||
|
||||
#
|
||||
# PPS support
|
||||
#
|
||||
# CONFIG_PPS is not set
|
||||
CONFIG_ARCH_REQUIRE_GPIOLIB=y
|
||||
CONFIG_GPIOLIB=y
|
||||
# CONFIG_DEBUG_GPIO is not set
|
||||
@ -447,11 +481,14 @@ CONFIG_GPIOLIB=y
|
||||
#
|
||||
# SPI GPIO expanders:
|
||||
#
|
||||
|
||||
#
|
||||
# AC97 GPIO expanders:
|
||||
#
|
||||
# CONFIG_W1 is not set
|
||||
# CONFIG_POWER_SUPPLY is not set
|
||||
# CONFIG_HWMON is not set
|
||||
# CONFIG_THERMAL is not set
|
||||
# CONFIG_THERMAL_HWMON is not set
|
||||
# CONFIG_WATCHDOG is not set
|
||||
CONFIG_SSB_POSSIBLE=y
|
||||
|
||||
@ -472,21 +509,8 @@ CONFIG_SSB_POSSIBLE=y
|
||||
# CONFIG_MFD_T7L66XB is not set
|
||||
# CONFIG_MFD_TC6387XB is not set
|
||||
# CONFIG_MFD_TC6393XB is not set
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia core support
|
||||
#
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
# CONFIG_VIDEO_MEDIA is not set
|
||||
|
||||
#
|
||||
# Multimedia drivers
|
||||
#
|
||||
CONFIG_DAB=y
|
||||
# CONFIG_REGULATOR is not set
|
||||
# CONFIG_MEDIA_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
@ -511,14 +535,17 @@ CONFIG_DUMMY_CONSOLE=y
|
||||
# CONFIG_USB_SUPPORT is not set
|
||||
# CONFIG_MMC is not set
|
||||
# CONFIG_MEMSTICK is not set
|
||||
# CONFIG_ACCESSIBILITY is not set
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
# CONFIG_ACCESSIBILITY is not set
|
||||
CONFIG_RTC_LIB=y
|
||||
# CONFIG_RTC_CLASS is not set
|
||||
# CONFIG_DMADEVICES is not set
|
||||
# CONFIG_AUXDISPLAY is not set
|
||||
# CONFIG_REGULATOR is not set
|
||||
# CONFIG_UIO is not set
|
||||
|
||||
#
|
||||
# TI VLYNQ
|
||||
#
|
||||
# CONFIG_STAGING is not set
|
||||
|
||||
#
|
||||
@ -535,9 +562,12 @@ CONFIG_JBD=y
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
# CONFIG_FS_POSIX_ACL is not set
|
||||
CONFIG_FILE_LOCKING=y
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_GFS2_FS is not set
|
||||
# CONFIG_BTRFS_FS is not set
|
||||
# CONFIG_NILFS2_FS is not set
|
||||
CONFIG_FILE_LOCKING=y
|
||||
CONFIG_FSNOTIFY=y
|
||||
CONFIG_DNOTIFY=y
|
||||
CONFIG_INOTIFY=y
|
||||
CONFIG_INOTIFY_USER=y
|
||||
@ -601,7 +631,6 @@ CONFIG_MISC_FILESYSTEMS=y
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
# CONFIG_SYSV_FS is not set
|
||||
# CONFIG_UFS_FS is not set
|
||||
# CONFIG_NILFS2_FS is not set
|
||||
|
||||
#
|
||||
# Partition Types
|
||||
@ -673,23 +702,24 @@ CONFIG_NLS_ISO8859_1=y
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_FRAME_WARN=1024
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
# CONFIG_STRIP_ASM_SYMS is not set
|
||||
# CONFIG_UNUSED_SYMBOLS is not set
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
# CONFIG_HEADERS_CHECK is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
# CONFIG_DEBUG_SHIRQ is not set
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
|
||||
CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
|
||||
# CONFIG_DETECT_SOFTLOCKUP is not set
|
||||
CONFIG_DETECT_HUNG_TASK=y
|
||||
# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
|
||||
CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
|
||||
CONFIG_SCHED_DEBUG=y
|
||||
# CONFIG_SCHED_DEBUG is not set
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_TIMER_STATS is not set
|
||||
# CONFIG_DEBUG_OBJECTS is not set
|
||||
# CONFIG_SLUB_DEBUG_ON is not set
|
||||
# CONFIG_SLUB_STATS is not set
|
||||
# CONFIG_DEBUG_KMEMLEAK is not set
|
||||
# CONFIG_DEBUG_PREEMPT is not set
|
||||
# CONFIG_DEBUG_RT_MUTEXES is not set
|
||||
# CONFIG_RT_MUTEX_TESTER is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
@ -708,31 +738,22 @@ CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_DEBUG_LIST is not set
|
||||
# CONFIG_DEBUG_SG is not set
|
||||
# CONFIG_DEBUG_NOTIFIERS is not set
|
||||
# CONFIG_DEBUG_CREDENTIALS is not set
|
||||
CONFIG_FRAME_POINTER=y
|
||||
# CONFIG_BOOT_PRINTK_DELAY is not set
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
||||
# CONFIG_BACKTRACE_SELF_TEST is not set
|
||||
# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
|
||||
# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
|
||||
# CONFIG_FAULT_INJECTION is not set
|
||||
# CONFIG_PAGE_POISONING is not set
|
||||
CONFIG_HAVE_FUNCTION_TRACER=y
|
||||
CONFIG_TRACING_SUPPORT=y
|
||||
|
||||
#
|
||||
# Tracers
|
||||
#
|
||||
# CONFIG_FUNCTION_TRACER is not set
|
||||
# CONFIG_IRQSOFF_TRACER is not set
|
||||
# CONFIG_SCHED_TRACER is not set
|
||||
# CONFIG_CONTEXT_SWITCH_TRACER is not set
|
||||
# CONFIG_EVENT_TRACER is not set
|
||||
# CONFIG_BOOT_TRACER is not set
|
||||
# CONFIG_TRACE_BRANCH_PROFILING is not set
|
||||
# CONFIG_STACK_TRACER is not set
|
||||
# CONFIG_KMEMTRACE is not set
|
||||
# CONFIG_WORKQUEUE_TRACER is not set
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
# CONFIG_FTRACE is not set
|
||||
# CONFIG_BRANCH_PROFILE_NONE is not set
|
||||
# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
|
||||
# CONFIG_PROFILE_ALL_BRANCHES is not set
|
||||
# CONFIG_SAMPLES is not set
|
||||
CONFIG_HAVE_ARCH_KGDB=y
|
||||
# CONFIG_KGDB is not set
|
||||
@ -754,7 +775,6 @@ CONFIG_CRYPTO=y
|
||||
#
|
||||
# Crypto core or helper
|
||||
#
|
||||
# CONFIG_CRYPTO_FIPS is not set
|
||||
CONFIG_CRYPTO_ALGAPI=y
|
||||
CONFIG_CRYPTO_ALGAPI2=y
|
||||
CONFIG_CRYPTO_AEAD2=y
|
||||
@ -796,11 +816,13 @@ CONFIG_CRYPTO_PCBC=m
|
||||
#
|
||||
# CONFIG_CRYPTO_HMAC is not set
|
||||
# CONFIG_CRYPTO_XCBC is not set
|
||||
# CONFIG_CRYPTO_VMAC is not set
|
||||
|
||||
#
|
||||
# Digest
|
||||
#
|
||||
CONFIG_CRYPTO_CRC32C=y
|
||||
# CONFIG_CRYPTO_GHASH is not set
|
||||
# CONFIG_CRYPTO_MD4 is not set
|
||||
CONFIG_CRYPTO_MD5=y
|
||||
# CONFIG_CRYPTO_MICHAEL_MIC is not set
|
||||
|
@ -610,7 +610,8 @@ CONFIG_INPUT_EVDEV=y
|
||||
#
|
||||
# Input Device Drivers
|
||||
#
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
CONFIG_INPUT_KEYBOARD=y
|
||||
CONFIG_KEYBOARD_TWL4030=y
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
# CONFIG_INPUT_JOYSTICK is not set
|
||||
# CONFIG_INPUT_TABLET is not set
|
||||
|
@ -629,7 +629,8 @@ CONFIG_INPUT_EVDEV=y
|
||||
#
|
||||
# Input Device Drivers
|
||||
#
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
CONFIG_INPUT_KEYBOARD=y
|
||||
CONFIG_KEYBOARD_TWL4030=y
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
# CONFIG_INPUT_JOYSTICK is not set
|
||||
# CONFIG_INPUT_TABLET is not set
|
||||
|
2032
arch/arm/configs/zeus_defconfig
Normal file
2032
arch/arm/configs/zeus_defconfig
Normal file
File diff suppressed because it is too large
Load Diff
@ -1 +1,4 @@
|
||||
#include <asm-generic/mman.h>
|
||||
|
||||
#define arch_mmap_check(addr, len, flags) \
|
||||
(((flags) & MAP_FIXED && (addr) < FIRST_USER_ADDRESS) ? -EINVAL : 0)
|
||||
|
@ -54,5 +54,6 @@ endif
|
||||
|
||||
head-y := head$(MMUEXT).o
|
||||
obj-$(CONFIG_DEBUG_LL) += debug.o
|
||||
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
|
||||
|
||||
extra-y := $(head-y) init_task.o vmlinux.lds
|
||||
|
@ -172,7 +172,7 @@
|
||||
/* 160 */ CALL(sys_sched_get_priority_min)
|
||||
CALL(sys_sched_rr_get_interval)
|
||||
CALL(sys_nanosleep)
|
||||
CALL(sys_arm_mremap)
|
||||
CALL(sys_mremap)
|
||||
CALL(sys_setresuid16)
|
||||
/* 165 */ CALL(sys_getresuid16)
|
||||
CALL(sys_ni_syscall) /* vm86 */
|
||||
|
57
arch/arm/kernel/early_printk.c
Normal file
57
arch/arm/kernel/early_printk.c
Normal file
@ -0,0 +1,57 @@
|
||||
/*
|
||||
* linux/arch/arm/kernel/early_printk.c
|
||||
*
|
||||
* Copyright (C) 2009 Sascha Hauer <s.hauer@pengutronix.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
extern void printch(int);
|
||||
|
||||
static void early_write(const char *s, unsigned n)
|
||||
{
|
||||
while (n-- > 0) {
|
||||
if (*s == '\n')
|
||||
printch('\r');
|
||||
printch(*s);
|
||||
s++;
|
||||
}
|
||||
}
|
||||
|
||||
static void early_console_write(struct console *con, const char *s, unsigned n)
|
||||
{
|
||||
early_write(s, n);
|
||||
}
|
||||
|
||||
static struct console early_console = {
|
||||
.name = "earlycon",
|
||||
.write = early_console_write,
|
||||
.flags = CON_PRINTBUFFER | CON_BOOT,
|
||||
.index = -1,
|
||||
};
|
||||
|
||||
asmlinkage void early_printk(const char *fmt, ...)
|
||||
{
|
||||
char buf[512];
|
||||
int n;
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, fmt);
|
||||
n = vscnprintf(buf, sizeof(buf), fmt, ap);
|
||||
early_write(buf, n);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
static int __init setup_early_printk(char *buf)
|
||||
{
|
||||
register_console(&early_console);
|
||||
return 0;
|
||||
}
|
||||
|
||||
early_param("earlyprintk", setup_early_printk);
|
@ -416,12 +416,12 @@ sys_mmap2:
|
||||
tst r5, #PGOFF_MASK
|
||||
moveq r5, r5, lsr #PAGE_SHIFT - 12
|
||||
streq r5, [sp, #4]
|
||||
beq do_mmap2
|
||||
beq sys_mmap_pgoff
|
||||
mov r0, #-EINVAL
|
||||
mov pc, lr
|
||||
#else
|
||||
str r5, [sp, #4]
|
||||
b do_mmap2
|
||||
b sys_mmap_pgoff
|
||||
#endif
|
||||
ENDPROC(sys_mmap2)
|
||||
|
||||
|
@ -160,6 +160,7 @@ void __cpuinit twd_timer_setup(struct clock_event_device *clk)
|
||||
|
||||
/* Make sure our local interrupt controller has this enabled */
|
||||
local_irq_save(flags);
|
||||
irq_to_desc(clk->irq)->status |= IRQ_NOPROBE;
|
||||
get_irq_chip(clk->irq)->unmask(clk->irq);
|
||||
local_irq_restore(flags);
|
||||
|
||||
|
@ -28,41 +28,6 @@
|
||||
#include <linux/ipc.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
extern unsigned long do_mremap(unsigned long addr, unsigned long old_len,
|
||||
unsigned long new_len, unsigned long flags,
|
||||
unsigned long new_addr);
|
||||
|
||||
/* common code for old and new mmaps */
|
||||
inline long do_mmap2(
|
||||
unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
unsigned long fd, unsigned long pgoff)
|
||||
{
|
||||
int error = -EINVAL;
|
||||
struct file * file = NULL;
|
||||
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
|
||||
if (flags & MAP_FIXED && addr < FIRST_USER_ADDRESS)
|
||||
goto out;
|
||||
|
||||
error = -EBADF;
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
file = fget(fd);
|
||||
if (!file)
|
||||
goto out;
|
||||
}
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
||||
if (file)
|
||||
fput(file);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
struct mmap_arg_struct {
|
||||
unsigned long addr;
|
||||
unsigned long len;
|
||||
@ -84,29 +49,11 @@ asmlinkage int old_mmap(struct mmap_arg_struct __user *arg)
|
||||
if (a.offset & ~PAGE_MASK)
|
||||
goto out;
|
||||
|
||||
error = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT);
|
||||
error = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
asmlinkage unsigned long
|
||||
sys_arm_mremap(unsigned long addr, unsigned long old_len,
|
||||
unsigned long new_len, unsigned long flags,
|
||||
unsigned long new_addr)
|
||||
{
|
||||
unsigned long ret = -EINVAL;
|
||||
|
||||
if (flags & MREMAP_FIXED && new_addr < FIRST_USER_ADDRESS)
|
||||
goto out;
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
ret = do_mremap(addr, old_len, new_len, flags, new_addr);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Perform the select(nd, in, out, ex, tv) and mmap() system
|
||||
* calls.
|
||||
|
@ -30,6 +30,8 @@
|
||||
|
||||
#define __virt_to_bus(x) ((x) - PAGE_OFFSET)
|
||||
#define __bus_to_virt(x) ((x) + PAGE_OFFSET)
|
||||
#define __pfn_to_bus(x) (__pfn_to_phys(x) - PHYS_OFFSET)
|
||||
#define __bus_to_pfn(x) __phys_to_pfn((x) + PHYS_OFFSET)
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -201,6 +201,11 @@ void __init footbridge_map_io(void)
|
||||
|
||||
#ifdef CONFIG_FOOTBRIDGE_ADDIN
|
||||
|
||||
static inline unsigned long fb_bus_sdram_offset(void)
|
||||
{
|
||||
return *CSR_PCISDRAMBASE & 0xfffffff0;
|
||||
}
|
||||
|
||||
/*
|
||||
* These two functions convert virtual addresses to PCI addresses and PCI
|
||||
* addresses to virtual addresses. Note that it is only legal to use these
|
||||
@ -210,14 +215,13 @@ unsigned long __virt_to_bus(unsigned long res)
|
||||
{
|
||||
WARN_ON(res < PAGE_OFFSET || res >= (unsigned long)high_memory);
|
||||
|
||||
return (res - PAGE_OFFSET) + (*CSR_PCISDRAMBASE & 0xfffffff0);
|
||||
return res + (fb_bus_sdram_offset() - PAGE_OFFSET);
|
||||
}
|
||||
EXPORT_SYMBOL(__virt_to_bus);
|
||||
|
||||
unsigned long __bus_to_virt(unsigned long res)
|
||||
{
|
||||
res -= (*CSR_PCISDRAMBASE & 0xfffffff0);
|
||||
res += PAGE_OFFSET;
|
||||
res = res - (fb_bus_sdram_offset() - PAGE_OFFSET);
|
||||
|
||||
WARN_ON(res < PAGE_OFFSET || res >= (unsigned long)high_memory);
|
||||
|
||||
@ -225,4 +229,16 @@ unsigned long __bus_to_virt(unsigned long res)
|
||||
}
|
||||
EXPORT_SYMBOL(__bus_to_virt);
|
||||
|
||||
unsigned long __pfn_to_bus(unsigned long pfn)
|
||||
{
|
||||
return __pfn_to_phys(pfn) + (fb_bus_sdram_offset() - PHYS_OFFSET));
|
||||
}
|
||||
EXPORT_SYMBOL(__pfn_to_bus);
|
||||
|
||||
unsigned long __bus_to_pfn(unsigned long bus)
|
||||
{
|
||||
return __phys_to_pfn(bus - (fb_bus_sdram_offset() - PHYS_OFFSET));
|
||||
}
|
||||
EXPORT_SYMBOL(__bus_to_pfn);
|
||||
|
||||
#endif
|
||||
|
@ -29,6 +29,8 @@
|
||||
#ifndef __ASSEMBLY__
|
||||
extern unsigned long __virt_to_bus(unsigned long);
|
||||
extern unsigned long __bus_to_virt(unsigned long);
|
||||
extern unsigned long __pfn_to_bus(unsigned long);
|
||||
extern unsigned long __bus_to_pfn(unsigned long);
|
||||
#endif
|
||||
#define __virt_to_bus __virt_to_bus
|
||||
#define __bus_to_virt __bus_to_virt
|
||||
@ -36,14 +38,15 @@ extern unsigned long __bus_to_virt(unsigned long);
|
||||
#elif defined(CONFIG_FOOTBRIDGE_HOST)
|
||||
|
||||
/*
|
||||
* The footbridge is programmed to expose the system RAM at the corresponding
|
||||
* address. So, if PAGE_OFFSET is 0xc0000000, RAM appears at 0xe0000000.
|
||||
* If 0x80000000, then its exposed at 0xa0000000 on the bus. etc.
|
||||
* The only requirement is that the RAM isn't placed at bus address 0 which
|
||||
* The footbridge is programmed to expose the system RAM at 0xe0000000.
|
||||
* The requirement is that the RAM isn't placed at bus address 0, which
|
||||
* would clash with VGA cards.
|
||||
*/
|
||||
#define __virt_to_bus(x) ((x) - 0xe0000000)
|
||||
#define __bus_to_virt(x) ((x) + 0xe0000000)
|
||||
#define BUS_OFFSET 0xe0000000
|
||||
#define __virt_to_bus(x) ((x) + (BUS_OFFSET - PAGE_OFFSET))
|
||||
#define __bus_to_virt(x) ((x) - (BUS_OFFSET - PAGE_OFFSET))
|
||||
#define __pfn_to_bus(x) (__pfn_to_phys(x) + (BUS_OFFSET - PHYS_OFFSET))
|
||||
#define __bus_to_pfn(x) __phys_to_pfn((x) - (BUS_OFFSET - PHYS_OFFSET))
|
||||
|
||||
#else
|
||||
|
||||
|
@ -28,6 +28,7 @@
|
||||
#define BUS_OFFSET UL(0x80000000)
|
||||
#define __virt_to_bus(x) ((x) - PAGE_OFFSET + BUS_OFFSET)
|
||||
#define __bus_to_virt(x) ((x) - BUS_OFFSET + PAGE_OFFSET)
|
||||
#define __pfn_to_bus(x) (((x) << PAGE_SHIFT) + BUS_OFFSET)
|
||||
#define __pfn_to_bus(x) (__pfn_to_phys(x) + (BUS_OFFSET - PHYS_OFFSET))
|
||||
#define __bus_to_pfn(x) __phys_to_pfn((x) - (BUS_OFFSET - PHYS_OFFSET))
|
||||
|
||||
#endif
|
||||
|
@ -17,11 +17,15 @@
|
||||
|
||||
#include <mach/ixp2000-regs.h>
|
||||
|
||||
#define __virt_to_bus(v) \
|
||||
(((__virt_to_phys(v) - 0x0) + (*IXP2000_PCI_SDRAM_BAR & 0xfffffff0)))
|
||||
#define IXP2000_PCI_SDRAM_OFFSET (*IXP2000_PCI_SDRAM_BAR & 0xfffffff0)
|
||||
|
||||
#define __bus_to_virt(b) \
|
||||
__phys_to_virt((((b - (*IXP2000_PCI_SDRAM_BAR & 0xfffffff0)) + 0x0)))
|
||||
#define __phys_to_bus(x) ((x) + (IXP2000_PCI_SDRAM_OFFSET - PHYS_OFFSET))
|
||||
#define __bus_to_phys(x) ((x) - (IXP2000_PCI_SDRAM_OFFSET - PHYS_OFFSET))
|
||||
|
||||
#define __virt_to_bus(v) __phys_to_bus(__virt_to_phys(v))
|
||||
#define __bus_to_virt(b) __phys_to_virt(__bus_to_phys(b))
|
||||
#define __pfn_to_bus(p) __phys_to_bus(__pfn_to_phys(p))
|
||||
#define __bus_to_pfn(b) __phys_to_pfn(__bus_to_phys(b))
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -19,16 +19,15 @@
|
||||
*/
|
||||
#define PHYS_OFFSET (0x00000000)
|
||||
|
||||
#define __virt_to_bus(v) \
|
||||
({ unsigned int ret; \
|
||||
ret = ((__virt_to_phys(v) - 0x00000000) + \
|
||||
(*((volatile int *)IXP23XX_PCI_SDRAM_BAR) & 0xfffffff0)); \
|
||||
ret; })
|
||||
#define IXP23XX_PCI_SDRAM_OFFSET (*((volatile int *)IXP23XX_PCI_SDRAM_BAR) & 0xfffffff0))
|
||||
|
||||
#define __bus_to_virt(b) \
|
||||
({ unsigned int data; \
|
||||
data = *((volatile int *)IXP23XX_PCI_SDRAM_BAR); \
|
||||
__phys_to_virt((((b - (data & 0xfffffff0)) + 0x00000000))); })
|
||||
#define __phys_to_bus(x) ((x) + (IXP23XX_PCI_SDRAM_OFFSET - PHYS_OFFSET))
|
||||
#define __bus_to_phys(x) ((x) - (IXP23XX_PCI_SDRAM_OFFSET - PHYS_OFFSET))
|
||||
|
||||
#define __virt_to_bus(v) __phys_to_bus(__virt_to_phys(v))
|
||||
#define __bus_to_virt(b) __phys_to_virt(__bus_to_phys(b))
|
||||
#define __pfn_to_bus(p) __phys_to_bus(__pfn_to_phys(p))
|
||||
#define __bus_to_pfn(b) __phys_to_pfn(__bus_to_phys(b))
|
||||
|
||||
#define arch_is_coherent() 1
|
||||
|
||||
|
@ -179,21 +179,21 @@ config IXP4XX_INDIRECT_PCI
|
||||
help
|
||||
IXP4xx provides two methods of accessing PCI memory space:
|
||||
|
||||
1) A direct mapped window from 0x48000000 to 0x4bffffff (64MB).
|
||||
1) A direct mapped window from 0x48000000 to 0x4BFFFFFF (64MB).
|
||||
To access PCI via this space, we simply ioremap() the BAR
|
||||
into the kernel and we can use the standard read[bwl]/write[bwl]
|
||||
macros. This is the preferred method due to speed but it
|
||||
limits the system to just 64MB of PCI memory. This can be
|
||||
limits the system to just 64MB of PCI memory. This can be
|
||||
problematic if using video cards and other memory-heavy devices.
|
||||
|
||||
2) If > 64MB of memory space is required, the IXP4xx can be
|
||||
configured to use indirect registers to access PCI This allows
|
||||
for up to 128MB (0x48000000 to 0x4fffffff) of memory on the bus.
|
||||
The disadvantage of this is that every PCI access requires
|
||||
three local register accesses plus a spinlock, but in some
|
||||
cases the performance hit is acceptable. In addition, you cannot
|
||||
mmap() PCI devices in this case due to the indirect nature
|
||||
of the PCI window.
|
||||
|
||||
2) If > 64MB of memory space is required, the IXP4xx can be
|
||||
configured to use indirect registers to access the whole PCI
|
||||
memory space. This currently allows for up to 1 GB (0x10000000
|
||||
to 0x4FFFFFFF) of memory on the bus. The disadvantage of this
|
||||
is that every PCI access requires three local register accesses
|
||||
plus a spinlock, but in some cases the performance hit is
|
||||
acceptable. In addition, you cannot mmap() PCI devices in this
|
||||
case due to the indirect nature of the PCI window.
|
||||
|
||||
By default, the direct method is used. Choose this option if you
|
||||
need to use the indirect method instead. If you don't know
|
||||
|
@ -22,40 +22,45 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <asm/mach/pci.h>
|
||||
#include <asm/irq.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#define AVILA_MAX_DEV 4
|
||||
#define LOFT_MAX_DEV 6
|
||||
#define IRQ_LINES 4
|
||||
|
||||
/* PCI controller GPIO to IRQ pin mappings */
|
||||
#define INTA 11
|
||||
#define INTB 10
|
||||
#define INTC 9
|
||||
#define INTD 8
|
||||
|
||||
void __init avila_pci_preinit(void)
|
||||
{
|
||||
set_irq_type(IRQ_AVILA_PCI_INTA, IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IRQ_AVILA_PCI_INTB, IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IRQ_AVILA_PCI_INTC, IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IRQ_AVILA_PCI_INTD, IRQ_TYPE_LEVEL_LOW);
|
||||
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(INTA), IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(INTB), IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(INTC), IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(INTD), IRQ_TYPE_LEVEL_LOW);
|
||||
ixp4xx_pci_preinit();
|
||||
}
|
||||
|
||||
static int __init avila_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
static int pci_irq_table[AVILA_PCI_IRQ_LINES] = {
|
||||
IRQ_AVILA_PCI_INTA,
|
||||
IRQ_AVILA_PCI_INTB,
|
||||
IRQ_AVILA_PCI_INTC,
|
||||
IRQ_AVILA_PCI_INTD
|
||||
static int pci_irq_table[IRQ_LINES] = {
|
||||
IXP4XX_GPIO_IRQ(INTA),
|
||||
IXP4XX_GPIO_IRQ(INTB),
|
||||
IXP4XX_GPIO_IRQ(INTC),
|
||||
IXP4XX_GPIO_IRQ(INTD)
|
||||
};
|
||||
|
||||
int irq = -1;
|
||||
|
||||
if (slot >= 1 &&
|
||||
slot <= (machine_is_loft() ? LOFT_PCI_MAX_DEV : AVILA_PCI_MAX_DEV) &&
|
||||
pin >= 1 && pin <= AVILA_PCI_IRQ_LINES) {
|
||||
irq = pci_irq_table[(slot + pin - 2) % 4];
|
||||
}
|
||||
slot <= (machine_is_loft() ? LOFT_MAX_DEV : AVILA_MAX_DEV) &&
|
||||
pin >= 1 && pin <= IRQ_LINES)
|
||||
return pci_irq_table[(slot + pin - 2) % 4];
|
||||
|
||||
return irq;
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct hw_pci avila_pci __initdata = {
|
||||
@ -75,4 +80,3 @@ int __init avila_pci_init(void)
|
||||
}
|
||||
|
||||
subsys_initcall(avila_pci_init);
|
||||
|
||||
|
@ -19,7 +19,6 @@
|
||||
#include <linux/serial_8250.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/i2c-gpio.h>
|
||||
|
||||
#include <asm/types.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/memory.h>
|
||||
@ -29,6 +28,9 @@
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/flash.h>
|
||||
|
||||
#define AVILA_SDA_PIN 7
|
||||
#define AVILA_SCL_PIN 6
|
||||
|
||||
static struct flash_platform_data avila_flash_data = {
|
||||
.map_name = "cfi_probe",
|
||||
.width = 2,
|
||||
|
@ -481,11 +481,7 @@ int ixp4xx_setup(int nr, struct pci_sys_data *sys)
|
||||
|
||||
res[1].name = "PCI Memory Space";
|
||||
res[1].start = PCIBIOS_MIN_MEM;
|
||||
#ifndef CONFIG_IXP4XX_INDIRECT_PCI
|
||||
res[1].end = 0x4bffffff;
|
||||
#else
|
||||
res[1].end = 0x4fffffff;
|
||||
#endif
|
||||
res[1].end = PCIBIOS_MAX_MEM;
|
||||
res[1].flags = IORESOURCE_MEM;
|
||||
|
||||
request_resource(&ioport_resource, &res[0]);
|
||||
|
@ -117,7 +117,7 @@ int gpio_to_irq(int gpio)
|
||||
}
|
||||
EXPORT_SYMBOL(gpio_to_irq);
|
||||
|
||||
int irq_to_gpio(int irq)
|
||||
int irq_to_gpio(unsigned int irq)
|
||||
{
|
||||
int gpio = (irq < 32) ? irq2gpio[irq] : -EINVAL;
|
||||
|
||||
|
@ -18,27 +18,31 @@
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
#include <asm/mach/pci.h>
|
||||
|
||||
#define SLOT0_DEVID 14
|
||||
#define SLOT1_DEVID 15
|
||||
|
||||
/* PCI controller GPIO to IRQ pin mappings */
|
||||
#define SLOT0_INTA 6
|
||||
#define SLOT1_INTA 11
|
||||
|
||||
void __init coyote_pci_preinit(void)
|
||||
{
|
||||
set_irq_type(IRQ_COYOTE_PCI_SLOT0, IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IRQ_COYOTE_PCI_SLOT1, IRQ_TYPE_LEVEL_LOW);
|
||||
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(SLOT0_INTA), IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(SLOT1_INTA), IRQ_TYPE_LEVEL_LOW);
|
||||
ixp4xx_pci_preinit();
|
||||
}
|
||||
|
||||
static int __init coyote_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
if (slot == COYOTE_PCI_SLOT0_DEVID)
|
||||
return IRQ_COYOTE_PCI_SLOT0;
|
||||
else if (slot == COYOTE_PCI_SLOT1_DEVID)
|
||||
return IRQ_COYOTE_PCI_SLOT1;
|
||||
if (slot == SLOT0_DEVID)
|
||||
return IXP4XX_GPIO_IRQ(SLOT0_INTA);
|
||||
else if (slot == SLOT1_DEVID)
|
||||
return IXP4XX_GPIO_IRQ(SLOT1_INTA);
|
||||
else return -1;
|
||||
}
|
||||
|
||||
|
@ -25,6 +25,15 @@
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/flash.h>
|
||||
|
||||
#define COYOTE_IDE_BASE_PHYS IXP4XX_EXP_BUS_BASE(3)
|
||||
#define COYOTE_IDE_BASE_VIRT 0xFFFE1000
|
||||
#define COYOTE_IDE_REGION_SIZE 0x1000
|
||||
|
||||
#define COYOTE_IDE_DATA_PORT 0xFFFE10E0
|
||||
#define COYOTE_IDE_CTRL_PORT 0xFFFE10FC
|
||||
#define COYOTE_IDE_ERROR_PORT 0xFFFE10E2
|
||||
#define IRQ_COYOTE_IDE IRQ_IXP4XX_GPIO5
|
||||
|
||||
static struct flash_platform_data coyote_flash_data = {
|
||||
.map_name = "cfi_probe",
|
||||
.width = 2,
|
||||
|
@ -19,39 +19,45 @@
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
#include <asm/mach/pci.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#define MAX_DEV 4
|
||||
#define IRQ_LINES 3
|
||||
|
||||
/* PCI controller GPIO to IRQ pin mappings */
|
||||
#define INTA 11
|
||||
#define INTB 10
|
||||
#define INTC 9
|
||||
#define INTD 8
|
||||
#define INTE 7
|
||||
#define INTF 6
|
||||
|
||||
void __init dsmg600_pci_preinit(void)
|
||||
{
|
||||
set_irq_type(IRQ_DSMG600_PCI_INTA, IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IRQ_DSMG600_PCI_INTB, IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IRQ_DSMG600_PCI_INTC, IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IRQ_DSMG600_PCI_INTD, IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IRQ_DSMG600_PCI_INTE, IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IRQ_DSMG600_PCI_INTF, IRQ_TYPE_LEVEL_LOW);
|
||||
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(INTA), IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(INTB), IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(INTC), IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(INTD), IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(INTE), IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(INTF), IRQ_TYPE_LEVEL_LOW);
|
||||
ixp4xx_pci_preinit();
|
||||
}
|
||||
|
||||
static int __init dsmg600_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
static int pci_irq_table[DSMG600_PCI_MAX_DEV][DSMG600_PCI_IRQ_LINES] =
|
||||
{
|
||||
{ IRQ_DSMG600_PCI_INTE, -1, -1 },
|
||||
{ IRQ_DSMG600_PCI_INTA, -1, -1 },
|
||||
{ IRQ_DSMG600_PCI_INTB, IRQ_DSMG600_PCI_INTC, IRQ_DSMG600_PCI_INTD },
|
||||
{ IRQ_DSMG600_PCI_INTF, -1, -1 },
|
||||
static int pci_irq_table[MAX_DEV][IRQ_LINES] = {
|
||||
{ IXP4XX_GPIO_IRQ(INTE), -1, -1 },
|
||||
{ IXP4XX_GPIO_IRQ(INTA), -1, -1 },
|
||||
{ IXP4XX_GPIO_IRQ(INTB), IXP4XX_GPIO_IRQ(INTC),
|
||||
IXP4XX_GPIO_IRQ(INTD) },
|
||||
{ IXP4XX_GPIO_IRQ(INTF), -1, -1 },
|
||||
};
|
||||
|
||||
int irq = -1;
|
||||
if (slot >= 1 && slot <= MAX_DEV && pin >= 1 && pin <= IRQ_LINES)
|
||||
return pci_irq_table[slot - 1][pin - 1];
|
||||
|
||||
if (slot >= 1 && slot <= DSMG600_PCI_MAX_DEV &&
|
||||
pin >= 1 && pin <= DSMG600_PCI_IRQ_LINES)
|
||||
irq = pci_irq_table[slot-1][pin-1];
|
||||
|
||||
return irq;
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct hw_pci __initdata dsmg600_pci = {
|
||||
|
@ -33,6 +33,23 @@
|
||||
#include <asm/mach/time.h>
|
||||
#include <asm/gpio.h>
|
||||
|
||||
#define DSMG600_SDA_PIN 5
|
||||
#define DSMG600_SCL_PIN 4
|
||||
|
||||
/* DSM-G600 Timer Setting */
|
||||
#define DSMG600_FREQ 66000000
|
||||
|
||||
/* Buttons */
|
||||
#define DSMG600_PB_GPIO 15 /* power button */
|
||||
#define DSMG600_RB_GPIO 3 /* reset button */
|
||||
|
||||
/* Power control */
|
||||
#define DSMG600_PO_GPIO 2 /* power off */
|
||||
|
||||
/* LEDs */
|
||||
#define DSMG600_LED_PWR_GPIO 0
|
||||
#define DSMG600_LED_WLAN_GPIO 14
|
||||
|
||||
static struct flash_platform_data dsmg600_flash_data = {
|
||||
.map_name = "cfi_probe",
|
||||
.width = 2,
|
||||
|
@ -19,33 +19,38 @@
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
#include <asm/mach/pci.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#define MAX_DEV 3
|
||||
#define IRQ_LINES 3
|
||||
|
||||
/* PCI controller GPIO to IRQ pin mappings */
|
||||
#define INTA 6
|
||||
#define INTB 7
|
||||
#define INTC 5
|
||||
|
||||
void __init fsg_pci_preinit(void)
|
||||
{
|
||||
set_irq_type(IRQ_FSG_PCI_INTA, IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IRQ_FSG_PCI_INTB, IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IRQ_FSG_PCI_INTC, IRQ_TYPE_LEVEL_LOW);
|
||||
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(INTA), IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(INTB), IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(INTC), IRQ_TYPE_LEVEL_LOW);
|
||||
ixp4xx_pci_preinit();
|
||||
}
|
||||
|
||||
static int __init fsg_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
static int pci_irq_table[FSG_PCI_IRQ_LINES] = {
|
||||
IRQ_FSG_PCI_INTC,
|
||||
IRQ_FSG_PCI_INTB,
|
||||
IRQ_FSG_PCI_INTA,
|
||||
static int pci_irq_table[IRQ_LINES] = {
|
||||
IXP4XX_GPIO_IRQ(INTC),
|
||||
IXP4XX_GPIO_IRQ(INTB),
|
||||
IXP4XX_GPIO_IRQ(INTA),
|
||||
};
|
||||
|
||||
int irq = -1;
|
||||
slot = slot - 11;
|
||||
slot -= 11;
|
||||
|
||||
if (slot >= 1 && slot <= FSG_PCI_MAX_DEV &&
|
||||
pin >= 1 && pin <= FSG_PCI_IRQ_LINES)
|
||||
irq = pci_irq_table[(slot - 1)];
|
||||
if (slot >= 1 && slot <= MAX_DEV && pin >= 1 && pin <= IRQ_LINES)
|
||||
irq = pci_irq_table[slot - 1];
|
||||
printk(KERN_INFO "%s: Mapped slot %d pin %d to IRQ %d\n",
|
||||
__func__, slot, pin, irq);
|
||||
|
||||
|
@ -24,12 +24,18 @@
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-gpio.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/flash.h>
|
||||
#include <asm/gpio.h>
|
||||
|
||||
#define FSG_SDA_PIN 12
|
||||
#define FSG_SCL_PIN 13
|
||||
|
||||
#define FSG_SB_GPIO 4 /* sync button */
|
||||
#define FSG_RB_GPIO 9 /* reset button */
|
||||
#define FSG_UB_GPIO 10 /* usb button */
|
||||
|
||||
static struct flash_platform_data fsg_flash_data = {
|
||||
.map_name = "cfi_probe",
|
||||
.width = 2,
|
||||
|
@ -17,29 +17,28 @@
|
||||
#include <asm/mach/flash.h>
|
||||
#include <asm/mach/pci.h>
|
||||
|
||||
#define xgpio_irq(n) (IRQ_IXP4XX_GPIO ## n)
|
||||
#define gpio_irq(n) xgpio_irq(n)
|
||||
|
||||
#define SLOT_ETHA 0x0B /* IDSEL = AD21 */
|
||||
#define SLOT_ETHB 0x0C /* IDSEL = AD20 */
|
||||
#define SLOT_MPCI 0x0D /* IDSEL = AD19 */
|
||||
#define SLOT_NEC 0x0E /* IDSEL = AD18 */
|
||||
|
||||
#define IRQ_ETHA IRQ_IXP4XX_GPIO4
|
||||
#define IRQ_ETHB IRQ_IXP4XX_GPIO5
|
||||
#define IRQ_NEC IRQ_IXP4XX_GPIO3
|
||||
#define IRQ_MPCI IRQ_IXP4XX_GPIO12
|
||||
|
||||
/* GPIO lines */
|
||||
#define GPIO_SCL 0
|
||||
#define GPIO_SDA 1
|
||||
#define GPIO_STR 2
|
||||
#define GPIO_IRQ_NEC 3
|
||||
#define GPIO_IRQ_ETHA 4
|
||||
#define GPIO_IRQ_ETHB 5
|
||||
#define GPIO_HSS0_DCD_N 6
|
||||
#define GPIO_HSS1_DCD_N 7
|
||||
#define GPIO_UART0_DCD 8
|
||||
#define GPIO_UART1_DCD 9
|
||||
#define GPIO_HSS0_CTS_N 10
|
||||
#define GPIO_HSS1_CTS_N 11
|
||||
#define GPIO_IRQ_MPCI 12
|
||||
#define GPIO_HSS1_RTS_N 13
|
||||
#define GPIO_HSS0_RTS_N 14
|
||||
/* GPIO15 is not connected */
|
||||
|
||||
/* Control outputs from 74HC4094 */
|
||||
#define CONTROL_HSS0_CLK_INT 0
|
||||
@ -152,7 +151,7 @@ static int hss_set_clock(int port, unsigned int clock_type)
|
||||
|
||||
static irqreturn_t hss_dcd_irq(int irq, void *pdev)
|
||||
{
|
||||
int i, port = (irq == gpio_irq(GPIO_HSS1_DCD_N));
|
||||
int i, port = (irq == IXP4XX_GPIO_IRQ(GPIO_HSS1_DCD_N));
|
||||
gpio_line_get(port ? GPIO_HSS1_DCD_N : GPIO_HSS0_DCD_N, &i);
|
||||
set_carrier_cb_tab[port](pdev, !i);
|
||||
return IRQ_HANDLED;
|
||||
@ -165,9 +164,9 @@ static int hss_open(int port, void *pdev,
|
||||
int i, irq;
|
||||
|
||||
if (!port)
|
||||
irq = gpio_irq(GPIO_HSS0_DCD_N);
|
||||
irq = IXP4XX_GPIO_IRQ(GPIO_HSS0_DCD_N);
|
||||
else
|
||||
irq = gpio_irq(GPIO_HSS1_DCD_N);
|
||||
irq = IXP4XX_GPIO_IRQ(GPIO_HSS1_DCD_N);
|
||||
|
||||
gpio_line_get(port ? GPIO_HSS1_DCD_N : GPIO_HSS0_DCD_N, &i);
|
||||
set_carrier_cb(pdev, !i);
|
||||
@ -188,8 +187,8 @@ static int hss_open(int port, void *pdev,
|
||||
|
||||
static void hss_close(int port, void *pdev)
|
||||
{
|
||||
free_irq(port ? gpio_irq(GPIO_HSS1_DCD_N) : gpio_irq(GPIO_HSS0_DCD_N),
|
||||
pdev);
|
||||
free_irq(port ? IXP4XX_GPIO_IRQ(GPIO_HSS1_DCD_N) :
|
||||
IXP4XX_GPIO_IRQ(GPIO_HSS0_DCD_N), pdev);
|
||||
set_carrier_cb_tab[!!port] = NULL; /* catch bugs */
|
||||
|
||||
set_control(port ? CONTROL_HSS1_DTR_N : CONTROL_HSS0_DTR_N, 1);
|
||||
@ -421,8 +420,8 @@ static void __init gmlr_init(void)
|
||||
gpio_line_config(GPIO_HSS1_RTS_N, IXP4XX_GPIO_OUT);
|
||||
gpio_line_config(GPIO_HSS0_DCD_N, IXP4XX_GPIO_IN);
|
||||
gpio_line_config(GPIO_HSS1_DCD_N, IXP4XX_GPIO_IN);
|
||||
set_irq_type(gpio_irq(GPIO_HSS0_DCD_N), IRQ_TYPE_EDGE_BOTH);
|
||||
set_irq_type(gpio_irq(GPIO_HSS1_DCD_N), IRQ_TYPE_EDGE_BOTH);
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(GPIO_HSS0_DCD_N), IRQ_TYPE_EDGE_BOTH);
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(GPIO_HSS1_DCD_N), IRQ_TYPE_EDGE_BOTH);
|
||||
|
||||
set_control(CONTROL_HSS0_DTR_N, 1);
|
||||
set_control(CONTROL_HSS1_DTR_N, 1);
|
||||
@ -442,10 +441,10 @@ static void __init gmlr_init(void)
|
||||
#ifdef CONFIG_PCI
|
||||
static void __init gmlr_pci_preinit(void)
|
||||
{
|
||||
set_irq_type(IRQ_ETHA, IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IRQ_ETHB, IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IRQ_NEC, IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IRQ_MPCI, IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(GPIO_IRQ_ETHA), IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(GPIO_IRQ_ETHB), IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(GPIO_IRQ_NEC), IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(GPIO_IRQ_MPCI), IRQ_TYPE_LEVEL_LOW);
|
||||
ixp4xx_pci_preinit();
|
||||
}
|
||||
|
||||
@ -466,10 +465,10 @@ static void __init gmlr_pci_postinit(void)
|
||||
static int __init gmlr_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
switch(slot) {
|
||||
case SLOT_ETHA: return IRQ_ETHA;
|
||||
case SLOT_ETHB: return IRQ_ETHB;
|
||||
case SLOT_NEC: return IRQ_NEC;
|
||||
default: return IRQ_MPCI;
|
||||
case SLOT_ETHA: return IXP4XX_GPIO_IRQ(GPIO_IRQ_ETHA);
|
||||
case SLOT_ETHB: return IXP4XX_GPIO_IRQ(GPIO_IRQ_ETHB);
|
||||
case SLOT_NEC: return IXP4XX_GPIO_IRQ(GPIO_IRQ_NEC);
|
||||
default: return IXP4XX_GPIO_IRQ(GPIO_IRQ_MPCI);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -26,14 +26,16 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/gtwx5715.h>
|
||||
#include <asm/mach/pci.h>
|
||||
|
||||
#define SLOT0_DEVID 0
|
||||
#define SLOT1_DEVID 1
|
||||
#define INTA 10 /* slot 1 has INTA and INTB crossed */
|
||||
#define INTB 11
|
||||
|
||||
/*
|
||||
* The exact GPIO pins and IRQs are defined in arch-ixp4xx/gtwx5715.h
|
||||
* Slot 0 isn't actually populated with a card connector but
|
||||
* we initialize it anyway in case a future version has the
|
||||
* slot populated or someone with good soldering skills has
|
||||
@ -41,32 +43,26 @@
|
||||
*/
|
||||
void __init gtwx5715_pci_preinit(void)
|
||||
{
|
||||
set_irq_type(GTWX5715_PCI_SLOT0_INTA_IRQ, IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(GTWX5715_PCI_SLOT0_INTB_IRQ, IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(GTWX5715_PCI_SLOT1_INTA_IRQ, IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(GTWX5715_PCI_SLOT1_INTB_IRQ, IRQ_TYPE_LEVEL_LOW);
|
||||
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(INTA), IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(INTB), IRQ_TYPE_LEVEL_LOW);
|
||||
ixp4xx_pci_preinit();
|
||||
}
|
||||
|
||||
|
||||
static int __init gtwx5715_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
int rc;
|
||||
static int gtwx5715_irqmap
|
||||
[GTWX5715_PCI_SLOT_COUNT]
|
||||
[GTWX5715_PCI_INT_PIN_COUNT] = {
|
||||
{GTWX5715_PCI_SLOT0_INTA_IRQ, GTWX5715_PCI_SLOT0_INTB_IRQ},
|
||||
{GTWX5715_PCI_SLOT1_INTA_IRQ, GTWX5715_PCI_SLOT1_INTB_IRQ},
|
||||
};
|
||||
int rc = -1;
|
||||
|
||||
if (slot >= GTWX5715_PCI_SLOT_COUNT ||
|
||||
pin >= GTWX5715_PCI_INT_PIN_COUNT) rc = -1;
|
||||
else
|
||||
rc = gtwx5715_irqmap[slot][pin-1];
|
||||
if ((slot == SLOT0_DEVID && pin == 1) ||
|
||||
(slot == SLOT1_DEVID && pin == 2))
|
||||
rc = IXP4XX_GPIO_IRQ(INTA);
|
||||
else if ((slot == SLOT0_DEVID && pin == 2) ||
|
||||
(slot == SLOT1_DEVID && pin == 1))
|
||||
rc = IXP4XX_GPIO_IRQ(INTB);
|
||||
|
||||
printk("%s: Mapped slot %d pin %d to IRQ %d\n", __func__, slot, pin, rc);
|
||||
return(rc);
|
||||
printk(KERN_INFO "%s: Mapped slot %d pin %d to IRQ %d\n",
|
||||
__func__, slot, pin, rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
struct hw_pci gtwx5715_pci __initdata = {
|
||||
@ -81,9 +77,7 @@ struct hw_pci gtwx5715_pci __initdata = {
|
||||
int __init gtwx5715_pci_init(void)
|
||||
{
|
||||
if (machine_is_gtwx5715())
|
||||
{
|
||||
pci_common_init(>wx5715_pci);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -28,7 +28,6 @@
|
||||
#include <linux/tty.h>
|
||||
#include <linux/serial_8250.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <asm/types.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/memory.h>
|
||||
@ -37,7 +36,34 @@
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/flash.h>
|
||||
#include <mach/gtwx5715.h>
|
||||
|
||||
/* GPIO 5,6,7 and 12 are hard wired to the Kendin KS8995M Switch
|
||||
and operate as an SPI type interface. The details of the interface
|
||||
are available on Kendin/Micrel's web site. */
|
||||
|
||||
#define GTWX5715_KSSPI_SELECT 5
|
||||
#define GTWX5715_KSSPI_TXD 6
|
||||
#define GTWX5715_KSSPI_CLOCK 7
|
||||
#define GTWX5715_KSSPI_RXD 12
|
||||
|
||||
/* The "reset" button is wired to GPIO 3.
|
||||
The GPIO is brought "low" when the button is pushed. */
|
||||
|
||||
#define GTWX5715_BUTTON_GPIO 3
|
||||
|
||||
/* Board Label Front Label
|
||||
LED1 Power
|
||||
LED2 Wireless-G
|
||||
LED3 not populated but could be
|
||||
LED4 Internet
|
||||
LED5 - LED8 Controlled by KS8995M Switch
|
||||
LED9 DMZ */
|
||||
|
||||
#define GTWX5715_LED1_GPIO 2
|
||||
#define GTWX5715_LED2_GPIO 9
|
||||
#define GTWX5715_LED3_GPIO 8
|
||||
#define GTWX5715_LED4_GPIO 1
|
||||
#define GTWX5715_LED9_GPIO 4
|
||||
|
||||
/*
|
||||
* Xscale UART registers are 32 bits wide with only the least
|
||||
|
@ -1,39 +0,0 @@
|
||||
/*
|
||||
* arch/arm/mach-ixp4xx/include/mach/avila.h
|
||||
*
|
||||
* Gateworks Avila platform specific definitions
|
||||
*
|
||||
* Author: Michael-Luke Jones <mlj28@cam.ac.uk>
|
||||
*
|
||||
* Based on ixdp425.h
|
||||
* Author: Deepak Saxena <dsaxena@plexity.net>
|
||||
*
|
||||
* Copyright 2004 (c) MontaVista, Software, Inc.
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_HARDWARE_H__
|
||||
#error "Do not include this directly, instead #include <mach/hardware.h>"
|
||||
#endif
|
||||
|
||||
#define AVILA_SDA_PIN 7
|
||||
#define AVILA_SCL_PIN 6
|
||||
|
||||
/*
|
||||
* AVILA PCI IRQs
|
||||
*/
|
||||
#define AVILA_PCI_MAX_DEV 4
|
||||
#define LOFT_PCI_MAX_DEV 6
|
||||
#define AVILA_PCI_IRQ_LINES 4
|
||||
|
||||
|
||||
/* PCI controller GPIO to IRQ pin mappings */
|
||||
#define AVILA_PCI_INTA_PIN 11
|
||||
#define AVILA_PCI_INTB_PIN 10
|
||||
#define AVILA_PCI_INTC_PIN 9
|
||||
#define AVILA_PCI_INTD_PIN 8
|
||||
|
||||
|
@ -1,33 +0,0 @@
|
||||
/*
|
||||
* arch/arm/mach-ixp4xx/include/mach/coyote.h
|
||||
*
|
||||
* ADI Engineering platform specific definitions
|
||||
*
|
||||
* Author: Deepak Saxena <dsaxena@plexity.net>
|
||||
*
|
||||
* Copyright 2004 (c) MontaVista, Software, Inc.
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_HARDWARE_H__
|
||||
#error "Do not include this directly, instead #include <mach/hardware.h>"
|
||||
#endif
|
||||
|
||||
/* PCI controller GPIO to IRQ pin mappings */
|
||||
#define COYOTE_PCI_SLOT0_PIN 6
|
||||
#define COYOTE_PCI_SLOT1_PIN 11
|
||||
|
||||
#define COYOTE_PCI_SLOT0_DEVID 14
|
||||
#define COYOTE_PCI_SLOT1_DEVID 15
|
||||
|
||||
#define COYOTE_IDE_BASE_PHYS IXP4XX_EXP_BUS_BASE(3)
|
||||
#define COYOTE_IDE_BASE_VIRT 0xFFFE1000
|
||||
#define COYOTE_IDE_REGION_SIZE 0x1000
|
||||
|
||||
#define COYOTE_IDE_DATA_PORT 0xFFFE10E0
|
||||
#define COYOTE_IDE_CTRL_PORT 0xFFFE10FC
|
||||
#define COYOTE_IDE_ERROR_PORT 0xFFFE10E2
|
||||
|
@ -1,52 +0,0 @@
|
||||
/*
|
||||
* DSM-G600 platform specific definitions
|
||||
*
|
||||
* Copyright (C) 2006 Tower Technologies
|
||||
* Author: Alessandro Zummo <a.zummo@towertech.it>
|
||||
*
|
||||
* based on ixdp425.h:
|
||||
* Copyright 2004 (C) MontaVista, Software, Inc.
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_HARDWARE_H__
|
||||
#error "Do not include this directly, instead #include <mach/hardware.h>"
|
||||
#endif
|
||||
|
||||
#define DSMG600_SDA_PIN 5
|
||||
#define DSMG600_SCL_PIN 4
|
||||
|
||||
/*
|
||||
* DSMG600 PCI IRQs
|
||||
*/
|
||||
#define DSMG600_PCI_MAX_DEV 4
|
||||
#define DSMG600_PCI_IRQ_LINES 3
|
||||
|
||||
|
||||
/* PCI controller GPIO to IRQ pin mappings */
|
||||
#define DSMG600_PCI_INTA_PIN 11
|
||||
#define DSMG600_PCI_INTB_PIN 10
|
||||
#define DSMG600_PCI_INTC_PIN 9
|
||||
#define DSMG600_PCI_INTD_PIN 8
|
||||
#define DSMG600_PCI_INTE_PIN 7
|
||||
#define DSMG600_PCI_INTF_PIN 6
|
||||
|
||||
/* DSM-G600 Timer Setting */
|
||||
#define DSMG600_FREQ 66000000
|
||||
|
||||
/* Buttons */
|
||||
|
||||
#define DSMG600_PB_GPIO 15 /* power button */
|
||||
#define DSMG600_RB_GPIO 3 /* reset button */
|
||||
|
||||
/* Power control */
|
||||
|
||||
#define DSMG600_PO_GPIO 2 /* power off */
|
||||
|
||||
/* LEDs */
|
||||
|
||||
#define DSMG600_LED_PWR_GPIO 0
|
||||
#define DSMG600_LED_WLAN_GPIO 14
|
@ -1,50 +0,0 @@
|
||||
/*
|
||||
* arch/arm/mach-ixp4xx/include/mach/fsg.h
|
||||
*
|
||||
* Freecom FSG-3 platform specific definitions
|
||||
*
|
||||
* Author: Rod Whitby <rod@whitby.id.au>
|
||||
* Author: Tomasz Chmielewski <mangoo@wpkg.org>
|
||||
* Maintainers: http://www.nslu2-linux.org
|
||||
*
|
||||
* Based on coyote.h by
|
||||
* Copyright 2004 (c) MontaVista, Software, Inc.
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_HARDWARE_H__
|
||||
#error "Do not include this directly, instead #include <mach/hardware.h>"
|
||||
#endif
|
||||
|
||||
#define FSG_SDA_PIN 12
|
||||
#define FSG_SCL_PIN 13
|
||||
|
||||
/*
|
||||
* FSG PCI IRQs
|
||||
*/
|
||||
#define FSG_PCI_MAX_DEV 3
|
||||
#define FSG_PCI_IRQ_LINES 3
|
||||
|
||||
|
||||
/* PCI controller GPIO to IRQ pin mappings */
|
||||
#define FSG_PCI_INTA_PIN 6
|
||||
#define FSG_PCI_INTB_PIN 7
|
||||
#define FSG_PCI_INTC_PIN 5
|
||||
|
||||
/* Buttons */
|
||||
|
||||
#define FSG_SB_GPIO 4 /* sync button */
|
||||
#define FSG_RB_GPIO 9 /* reset button */
|
||||
#define FSG_UB_GPIO 10 /* usb button */
|
||||
|
||||
/* LEDs */
|
||||
|
||||
#define FSG_LED_WLAN_BIT 0
|
||||
#define FSG_LED_WAN_BIT 1
|
||||
#define FSG_LED_SATA_BIT 2
|
||||
#define FSG_LED_USB_BIT 4
|
||||
#define FSG_LED_RING_BIT 5
|
||||
#define FSG_LED_SYNC_BIT 7
|
@ -70,7 +70,7 @@ static inline void gpio_set_value(unsigned gpio, int value)
|
||||
#include <asm-generic/gpio.h> /* cansleep wrappers */
|
||||
|
||||
extern int gpio_to_irq(int gpio);
|
||||
extern int irq_to_gpio(int gpio);
|
||||
extern int irq_to_gpio(unsigned int irq);
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -1,116 +0,0 @@
|
||||
/*
|
||||
* arch/arm/mach-ixp4xx/include/mach/gtwx5715.h
|
||||
*
|
||||
* Gemtek GTWX5715 Gateway (Linksys WRV54G)
|
||||
*
|
||||
* Copyright 2004 (c) George T. Joseph
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_HARDWARE_H__
|
||||
#error "Do not include this directly, instead #include <mach/hardware.h>"
|
||||
#endif
|
||||
#include "irqs.h"
|
||||
|
||||
#define GTWX5715_GPIO0 0
|
||||
#define GTWX5715_GPIO1 1
|
||||
#define GTWX5715_GPIO2 2
|
||||
#define GTWX5715_GPIO3 3
|
||||
#define GTWX5715_GPIO4 4
|
||||
#define GTWX5715_GPIO5 5
|
||||
#define GTWX5715_GPIO6 6
|
||||
#define GTWX5715_GPIO7 7
|
||||
#define GTWX5715_GPIO8 8
|
||||
#define GTWX5715_GPIO9 9
|
||||
#define GTWX5715_GPIO10 10
|
||||
#define GTWX5715_GPIO11 11
|
||||
#define GTWX5715_GPIO12 12
|
||||
#define GTWX5715_GPIO13 13
|
||||
#define GTWX5715_GPIO14 14
|
||||
|
||||
#define GTWX5715_GPIO0_IRQ IRQ_IXP4XX_GPIO0
|
||||
#define GTWX5715_GPIO1_IRQ IRQ_IXP4XX_GPIO1
|
||||
#define GTWX5715_GPIO2_IRQ IRQ_IXP4XX_GPIO2
|
||||
#define GTWX5715_GPIO3_IRQ IRQ_IXP4XX_GPIO3
|
||||
#define GTWX5715_GPIO4_IRQ IRQ_IXP4XX_GPIO4
|
||||
#define GTWX5715_GPIO5_IRQ IRQ_IXP4XX_GPIO5
|
||||
#define GTWX5715_GPIO6_IRQ IRQ_IXP4XX_GPIO6
|
||||
#define GTWX5715_GPIO7_IRQ IRQ_IXP4XX_GPIO7
|
||||
#define GTWX5715_GPIO8_IRQ IRQ_IXP4XX_GPIO8
|
||||
#define GTWX5715_GPIO9_IRQ IRQ_IXP4XX_GPIO9
|
||||
#define GTWX5715_GPIO10_IRQ IRQ_IXP4XX_GPIO10
|
||||
#define GTWX5715_GPIO11_IRQ IRQ_IXP4XX_GPIO11
|
||||
#define GTWX5715_GPIO12_IRQ IRQ_IXP4XX_GPIO12
|
||||
#define GTWX5715_GPIO13_IRQ IRQ_IXP4XX_SW_INT1
|
||||
#define GTWX5715_GPIO14_IRQ IRQ_IXP4XX_SW_INT2
|
||||
|
||||
/* PCI controller GPIO to IRQ pin mappings
|
||||
|
||||
INTA INTB
|
||||
SLOT 0 10 11
|
||||
SLOT 1 11 10
|
||||
|
||||
*/
|
||||
|
||||
#define GTWX5715_PCI_SLOT0_DEVID 0
|
||||
#define GTWX5715_PCI_SLOT0_INTA_GPIO GTWX5715_GPIO10
|
||||
#define GTWX5715_PCI_SLOT0_INTB_GPIO GTWX5715_GPIO11
|
||||
#define GTWX5715_PCI_SLOT0_INTA_IRQ GTWX5715_GPIO10_IRQ
|
||||
#define GTWX5715_PCI_SLOT0_INTB_IRQ GTWX5715_GPIO11_IRQ
|
||||
|
||||
#define GTWX5715_PCI_SLOT1_DEVID 1
|
||||
#define GTWX5715_PCI_SLOT1_INTA_GPIO GTWX5715_GPIO11
|
||||
#define GTWX5715_PCI_SLOT1_INTB_GPIO GTWX5715_GPIO10
|
||||
#define GTWX5715_PCI_SLOT1_INTA_IRQ GTWX5715_GPIO11_IRQ
|
||||
#define GTWX5715_PCI_SLOT1_INTB_IRQ GTWX5715_GPIO10_IRQ
|
||||
|
||||
#define GTWX5715_PCI_SLOT_COUNT 2
|
||||
#define GTWX5715_PCI_INT_PIN_COUNT 2
|
||||
|
||||
/*
|
||||
* GPIO 5,6,7 and12 are hard wired to the Kendin KS8995M Switch
|
||||
* and operate as an SPI type interface. The details of the interface
|
||||
* are available on Kendin/Micrel's web site.
|
||||
*/
|
||||
|
||||
#define GTWX5715_KSSPI_SELECT GTWX5715_GPIO5
|
||||
#define GTWX5715_KSSPI_TXD GTWX5715_GPIO6
|
||||
#define GTWX5715_KSSPI_CLOCK GTWX5715_GPIO7
|
||||
#define GTWX5715_KSSPI_RXD GTWX5715_GPIO12
|
||||
|
||||
/*
|
||||
* The "reset" button is wired to GPIO 3.
|
||||
* The GPIO is brought "low" when the button is pushed.
|
||||
*/
|
||||
|
||||
#define GTWX5715_BUTTON_GPIO GTWX5715_GPIO3
|
||||
#define GTWX5715_BUTTON_IRQ GTWX5715_GPIO3_IRQ
|
||||
|
||||
/*
|
||||
* Board Label Front Label
|
||||
* LED1 Power
|
||||
* LED2 Wireless-G
|
||||
* LED3 not populated but could be
|
||||
* LED4 Internet
|
||||
* LED5 - LED8 Controlled by KS8995M Switch
|
||||
* LED9 DMZ
|
||||
*/
|
||||
|
||||
#define GTWX5715_LED1_GPIO GTWX5715_GPIO2
|
||||
#define GTWX5715_LED2_GPIO GTWX5715_GPIO9
|
||||
#define GTWX5715_LED3_GPIO GTWX5715_GPIO8
|
||||
#define GTWX5715_LED4_GPIO GTWX5715_GPIO1
|
||||
#define GTWX5715_LED9_GPIO GTWX5715_GPIO4
|
@ -18,7 +18,13 @@
|
||||
#define __ASM_ARCH_HARDWARE_H__
|
||||
|
||||
#define PCIBIOS_MIN_IO 0x00001000
|
||||
#define PCIBIOS_MIN_MEM (cpu_is_ixp43x() ? 0x40000000 : 0x48000000)
|
||||
#ifdef CONFIG_IXP4XX_INDIRECT_PCI
|
||||
#define PCIBIOS_MIN_MEM 0x10000000 /* 1 GB of indirect PCI MMIO space */
|
||||
#define PCIBIOS_MAX_MEM 0x4FFFFFFF
|
||||
#else
|
||||
#define PCIBIOS_MIN_MEM 0x48000000 /* 64 MB of PCI MMIO space */
|
||||
#define PCIBIOS_MAX_MEM 0x4BFFFFFF
|
||||
#endif
|
||||
|
||||
/*
|
||||
* We override the standard dma-mask routines for bouncing.
|
||||
@ -37,14 +43,4 @@
|
||||
/* Platform helper functions and definitions */
|
||||
#include "platform.h"
|
||||
|
||||
/* Platform specific details */
|
||||
#include "ixdp425.h"
|
||||
#include "avila.h"
|
||||
#include "coyote.h"
|
||||
#include "prpmc1100.h"
|
||||
#include "nslu2.h"
|
||||
#include "nas100d.h"
|
||||
#include "dsmg600.h"
|
||||
#include "fsg.h"
|
||||
|
||||
#endif /* _ASM_ARCH_HARDWARE_H */
|
||||
|
@ -26,22 +26,20 @@ extern int ixp4xx_pci_write(u32 addr, u32 cmd, u32 data);
|
||||
/*
|
||||
* IXP4xx provides two methods of accessing PCI memory space:
|
||||
*
|
||||
* 1) A direct mapped window from 0x48000000 to 0x4bffffff (64MB).
|
||||
* 1) A direct mapped window from 0x48000000 to 0x4BFFFFFF (64MB).
|
||||
* To access PCI via this space, we simply ioremap() the BAR
|
||||
* into the kernel and we can use the standard read[bwl]/write[bwl]
|
||||
* macros. This is the preffered method due to speed but it
|
||||
* limits the system to just 64MB of PCI memory. This can be
|
||||
* problamatic if using video cards and other memory-heavy
|
||||
* targets.
|
||||
*
|
||||
* 2) If > 64MB of memory space is required, the IXP4xx can be configured
|
||||
* to use indirect registers to access PCI (as we do below for I/O
|
||||
* transactions). This allows for up to 128MB (0x48000000 to 0x4fffffff)
|
||||
* of memory on the bus. The disadvantage of this is that every
|
||||
* PCI access requires three local register accesses plus a spinlock,
|
||||
* but in some cases the performance hit is acceptable. In addition,
|
||||
* you cannot mmap() PCI devices in this case.
|
||||
* limits the system to just 64MB of PCI memory. This can be
|
||||
* problematic if using video cards and other memory-heavy targets.
|
||||
*
|
||||
* 2) If > 64MB of memory space is required, the IXP4xx can use indirect
|
||||
* registers to access the whole 4 GB of PCI memory space (as we do below
|
||||
* for I/O transactions). This allows currently for up to 1 GB (0x10000000
|
||||
* to 0x4FFFFFFF) of memory on the bus. The disadvantage of this is that
|
||||
* every PCI access requires three local register accesses plus a spinlock,
|
||||
* but in some cases the performance hit is acceptable. In addition, you
|
||||
* cannot mmap() PCI devices in this case.
|
||||
*/
|
||||
#ifndef CONFIG_IXP4XX_INDIRECT_PCI
|
||||
|
||||
@ -55,48 +53,52 @@ extern int ixp4xx_pci_write(u32 addr, u32 cmd, u32 data);
|
||||
* access registers. If something outside of PCI is ioremap'd, we
|
||||
* fallback to the default.
|
||||
*/
|
||||
static inline void __iomem *
|
||||
__ixp4xx_ioremap(unsigned long addr, size_t size, unsigned int mtype)
|
||||
|
||||
static inline int is_pci_memory(u32 addr)
|
||||
{
|
||||
if((addr < PCIBIOS_MIN_MEM) || (addr > 0x4fffffff))
|
||||
return (addr >= PCIBIOS_MIN_MEM) && (addr <= 0x4FFFFFFF);
|
||||
}
|
||||
|
||||
static inline void __iomem * __indirect_ioremap(unsigned long addr, size_t size,
|
||||
unsigned int mtype)
|
||||
{
|
||||
if (!is_pci_memory(addr))
|
||||
return __arm_ioremap(addr, size, mtype);
|
||||
|
||||
return (void __iomem *)addr;
|
||||
}
|
||||
|
||||
static inline void
|
||||
__ixp4xx_iounmap(void __iomem *addr)
|
||||
static inline void __indirect_iounmap(void __iomem *addr)
|
||||
{
|
||||
if ((__force u32)addr >= VMALLOC_START)
|
||||
if (!is_pci_memory((__force u32)addr))
|
||||
__iounmap(addr);
|
||||
}
|
||||
|
||||
#define __arch_ioremap(a, s, f) __ixp4xx_ioremap(a, s, f)
|
||||
#define __arch_iounmap(a) __ixp4xx_iounmap(a)
|
||||
#define __arch_ioremap(a, s, f) __indirect_ioremap(a, s, f)
|
||||
#define __arch_iounmap(a) __indirect_iounmap(a)
|
||||
|
||||
#define writeb(v, p) __ixp4xx_writeb(v, p)
|
||||
#define writew(v, p) __ixp4xx_writew(v, p)
|
||||
#define writel(v, p) __ixp4xx_writel(v, p)
|
||||
#define writeb(v, p) __indirect_writeb(v, p)
|
||||
#define writew(v, p) __indirect_writew(v, p)
|
||||
#define writel(v, p) __indirect_writel(v, p)
|
||||
|
||||
#define writesb(p, v, l) __ixp4xx_writesb(p, v, l)
|
||||
#define writesw(p, v, l) __ixp4xx_writesw(p, v, l)
|
||||
#define writesl(p, v, l) __ixp4xx_writesl(p, v, l)
|
||||
|
||||
#define readb(p) __ixp4xx_readb(p)
|
||||
#define readw(p) __ixp4xx_readw(p)
|
||||
#define readl(p) __ixp4xx_readl(p)
|
||||
|
||||
#define readsb(p, v, l) __ixp4xx_readsb(p, v, l)
|
||||
#define readsw(p, v, l) __ixp4xx_readsw(p, v, l)
|
||||
#define readsl(p, v, l) __ixp4xx_readsl(p, v, l)
|
||||
#define writesb(p, v, l) __indirect_writesb(p, v, l)
|
||||
#define writesw(p, v, l) __indirect_writesw(p, v, l)
|
||||
#define writesl(p, v, l) __indirect_writesl(p, v, l)
|
||||
|
||||
static inline void
|
||||
__ixp4xx_writeb(u8 value, volatile void __iomem *p)
|
||||
#define readb(p) __indirect_readb(p)
|
||||
#define readw(p) __indirect_readw(p)
|
||||
#define readl(p) __indirect_readl(p)
|
||||
|
||||
#define readsb(p, v, l) __indirect_readsb(p, v, l)
|
||||
#define readsw(p, v, l) __indirect_readsw(p, v, l)
|
||||
#define readsl(p, v, l) __indirect_readsl(p, v, l)
|
||||
|
||||
static inline void __indirect_writeb(u8 value, volatile void __iomem *p)
|
||||
{
|
||||
u32 addr = (u32)p;
|
||||
u32 n, byte_enables, data;
|
||||
|
||||
if (addr >= VMALLOC_START) {
|
||||
if (!is_pci_memory(addr)) {
|
||||
__raw_writeb(value, addr);
|
||||
return;
|
||||
}
|
||||
@ -107,20 +109,19 @@ __ixp4xx_writeb(u8 value, volatile void __iomem *p)
|
||||
ixp4xx_pci_write(addr, byte_enables | NP_CMD_MEMWRITE, data);
|
||||
}
|
||||
|
||||
static inline void
|
||||
__ixp4xx_writesb(volatile void __iomem *bus_addr, const u8 *vaddr, int count)
|
||||
static inline void __indirect_writesb(volatile void __iomem *bus_addr,
|
||||
const u8 *vaddr, int count)
|
||||
{
|
||||
while (count--)
|
||||
writeb(*vaddr++, bus_addr);
|
||||
}
|
||||
|
||||
static inline void
|
||||
__ixp4xx_writew(u16 value, volatile void __iomem *p)
|
||||
static inline void __indirect_writew(u16 value, volatile void __iomem *p)
|
||||
{
|
||||
u32 addr = (u32)p;
|
||||
u32 n, byte_enables, data;
|
||||
|
||||
if (addr >= VMALLOC_START) {
|
||||
if (!is_pci_memory(addr)) {
|
||||
__raw_writew(value, addr);
|
||||
return;
|
||||
}
|
||||
@ -131,18 +132,18 @@ __ixp4xx_writew(u16 value, volatile void __iomem *p)
|
||||
ixp4xx_pci_write(addr, byte_enables | NP_CMD_MEMWRITE, data);
|
||||
}
|
||||
|
||||
static inline void
|
||||
__ixp4xx_writesw(volatile void __iomem *bus_addr, const u16 *vaddr, int count)
|
||||
static inline void __indirect_writesw(volatile void __iomem *bus_addr,
|
||||
const u16 *vaddr, int count)
|
||||
{
|
||||
while (count--)
|
||||
writew(*vaddr++, bus_addr);
|
||||
}
|
||||
|
||||
static inline void
|
||||
__ixp4xx_writel(u32 value, volatile void __iomem *p)
|
||||
static inline void __indirect_writel(u32 value, volatile void __iomem *p)
|
||||
{
|
||||
u32 addr = (__force u32)p;
|
||||
if (addr >= VMALLOC_START) {
|
||||
|
||||
if (!is_pci_memory(addr)) {
|
||||
__raw_writel(value, p);
|
||||
return;
|
||||
}
|
||||
@ -150,20 +151,19 @@ __ixp4xx_writel(u32 value, volatile void __iomem *p)
|
||||
ixp4xx_pci_write(addr, NP_CMD_MEMWRITE, value);
|
||||
}
|
||||
|
||||
static inline void
|
||||
__ixp4xx_writesl(volatile void __iomem *bus_addr, const u32 *vaddr, int count)
|
||||
static inline void __indirect_writesl(volatile void __iomem *bus_addr,
|
||||
const u32 *vaddr, int count)
|
||||
{
|
||||
while (count--)
|
||||
writel(*vaddr++, bus_addr);
|
||||
}
|
||||
|
||||
static inline unsigned char
|
||||
__ixp4xx_readb(const volatile void __iomem *p)
|
||||
static inline unsigned char __indirect_readb(const volatile void __iomem *p)
|
||||
{
|
||||
u32 addr = (u32)p;
|
||||
u32 n, byte_enables, data;
|
||||
|
||||
if (addr >= VMALLOC_START)
|
||||
if (!is_pci_memory(addr))
|
||||
return __raw_readb(addr);
|
||||
|
||||
n = addr % 4;
|
||||
@ -174,20 +174,19 @@ __ixp4xx_readb(const volatile void __iomem *p)
|
||||
return data >> (8*n);
|
||||
}
|
||||
|
||||
static inline void
|
||||
__ixp4xx_readsb(const volatile void __iomem *bus_addr, u8 *vaddr, u32 count)
|
||||
static inline void __indirect_readsb(const volatile void __iomem *bus_addr,
|
||||
u8 *vaddr, u32 count)
|
||||
{
|
||||
while (count--)
|
||||
*vaddr++ = readb(bus_addr);
|
||||
}
|
||||
|
||||
static inline unsigned short
|
||||
__ixp4xx_readw(const volatile void __iomem *p)
|
||||
static inline unsigned short __indirect_readw(const volatile void __iomem *p)
|
||||
{
|
||||
u32 addr = (u32)p;
|
||||
u32 n, byte_enables, data;
|
||||
|
||||
if (addr >= VMALLOC_START)
|
||||
if (!is_pci_memory(addr))
|
||||
return __raw_readw(addr);
|
||||
|
||||
n = addr % 4;
|
||||
@ -198,20 +197,19 @@ __ixp4xx_readw(const volatile void __iomem *p)
|
||||
return data>>(8*n);
|
||||
}
|
||||
|
||||
static inline void
|
||||
__ixp4xx_readsw(const volatile void __iomem *bus_addr, u16 *vaddr, u32 count)
|
||||
static inline void __indirect_readsw(const volatile void __iomem *bus_addr,
|
||||
u16 *vaddr, u32 count)
|
||||
{
|
||||
while (count--)
|
||||
*vaddr++ = readw(bus_addr);
|
||||
}
|
||||
|
||||
static inline unsigned long
|
||||
__ixp4xx_readl(const volatile void __iomem *p)
|
||||
static inline unsigned long __indirect_readl(const volatile void __iomem *p)
|
||||
{
|
||||
u32 addr = (__force u32)p;
|
||||
u32 data;
|
||||
|
||||
if (addr >= VMALLOC_START)
|
||||
if (!is_pci_memory(addr))
|
||||
return __raw_readl(p);
|
||||
|
||||
if (ixp4xx_pci_read(addr, NP_CMD_MEMREAD, &data))
|
||||
@ -220,8 +218,8 @@ __ixp4xx_readl(const volatile void __iomem *p)
|
||||
return data;
|
||||
}
|
||||
|
||||
static inline void
|
||||
__ixp4xx_readsl(const volatile void __iomem *bus_addr, u32 *vaddr, u32 count)
|
||||
static inline void __indirect_readsl(const volatile void __iomem *bus_addr,
|
||||
u32 *vaddr, u32 count)
|
||||
{
|
||||
while (count--)
|
||||
*vaddr++ = readl(bus_addr);
|
||||
@ -235,7 +233,7 @@ __ixp4xx_readsl(const volatile void __iomem *bus_addr, u32 *vaddr, u32 count)
|
||||
#define memcpy_fromio(a,c,l) _memcpy_fromio((a),(c),(l))
|
||||
#define memcpy_toio(c,a,l) _memcpy_toio((c),(a),(l))
|
||||
|
||||
#endif
|
||||
#endif /* CONFIG_IXP4XX_INDIRECT_PCI */
|
||||
|
||||
#ifndef CONFIG_PCI
|
||||
|
||||
@ -250,25 +248,8 @@ __ixp4xx_readsl(const volatile void __iomem *bus_addr, u32 *vaddr, u32 count)
|
||||
* transaction. This means that we need to override the default
|
||||
* I/O functions.
|
||||
*/
|
||||
#define outb(p, v) __ixp4xx_outb(p, v)
|
||||
#define outw(p, v) __ixp4xx_outw(p, v)
|
||||
#define outl(p, v) __ixp4xx_outl(p, v)
|
||||
|
||||
#define outsb(p, v, l) __ixp4xx_outsb(p, v, l)
|
||||
#define outsw(p, v, l) __ixp4xx_outsw(p, v, l)
|
||||
#define outsl(p, v, l) __ixp4xx_outsl(p, v, l)
|
||||
|
||||
#define inb(p) __ixp4xx_inb(p)
|
||||
#define inw(p) __ixp4xx_inw(p)
|
||||
#define inl(p) __ixp4xx_inl(p)
|
||||
|
||||
#define insb(p, v, l) __ixp4xx_insb(p, v, l)
|
||||
#define insw(p, v, l) __ixp4xx_insw(p, v, l)
|
||||
#define insl(p, v, l) __ixp4xx_insl(p, v, l)
|
||||
|
||||
|
||||
static inline void
|
||||
__ixp4xx_outb(u8 value, u32 addr)
|
||||
static inline void outb(u8 value, u32 addr)
|
||||
{
|
||||
u32 n, byte_enables, data;
|
||||
n = addr % 4;
|
||||
@ -277,15 +258,13 @@ __ixp4xx_outb(u8 value, u32 addr)
|
||||
ixp4xx_pci_write(addr, byte_enables | NP_CMD_IOWRITE, data);
|
||||
}
|
||||
|
||||
static inline void
|
||||
__ixp4xx_outsb(u32 io_addr, const u8 *vaddr, u32 count)
|
||||
static inline void outsb(u32 io_addr, const u8 *vaddr, u32 count)
|
||||
{
|
||||
while (count--)
|
||||
outb(*vaddr++, io_addr);
|
||||
}
|
||||
|
||||
static inline void
|
||||
__ixp4xx_outw(u16 value, u32 addr)
|
||||
static inline void outw(u16 value, u32 addr)
|
||||
{
|
||||
u32 n, byte_enables, data;
|
||||
n = addr % 4;
|
||||
@ -294,28 +273,24 @@ __ixp4xx_outw(u16 value, u32 addr)
|
||||
ixp4xx_pci_write(addr, byte_enables | NP_CMD_IOWRITE, data);
|
||||
}
|
||||
|
||||
static inline void
|
||||
__ixp4xx_outsw(u32 io_addr, const u16 *vaddr, u32 count)
|
||||
static inline void outsw(u32 io_addr, const u16 *vaddr, u32 count)
|
||||
{
|
||||
while (count--)
|
||||
outw(cpu_to_le16(*vaddr++), io_addr);
|
||||
}
|
||||
|
||||
static inline void
|
||||
__ixp4xx_outl(u32 value, u32 addr)
|
||||
static inline void outl(u32 value, u32 addr)
|
||||
{
|
||||
ixp4xx_pci_write(addr, NP_CMD_IOWRITE, value);
|
||||
}
|
||||
|
||||
static inline void
|
||||
__ixp4xx_outsl(u32 io_addr, const u32 *vaddr, u32 count)
|
||||
static inline void outsl(u32 io_addr, const u32 *vaddr, u32 count)
|
||||
{
|
||||
while (count--)
|
||||
outl(*vaddr++, io_addr);
|
||||
outl(cpu_to_le32(*vaddr++), io_addr);
|
||||
}
|
||||
|
||||
static inline u8
|
||||
__ixp4xx_inb(u32 addr)
|
||||
static inline u8 inb(u32 addr)
|
||||
{
|
||||
u32 n, byte_enables, data;
|
||||
n = addr % 4;
|
||||
@ -326,15 +301,13 @@ __ixp4xx_inb(u32 addr)
|
||||
return data >> (8*n);
|
||||
}
|
||||
|
||||
static inline void
|
||||
__ixp4xx_insb(u32 io_addr, u8 *vaddr, u32 count)
|
||||
static inline void insb(u32 io_addr, u8 *vaddr, u32 count)
|
||||
{
|
||||
while (count--)
|
||||
*vaddr++ = inb(io_addr);
|
||||
}
|
||||
|
||||
static inline u16
|
||||
__ixp4xx_inw(u32 addr)
|
||||
static inline u16 inw(u32 addr)
|
||||
{
|
||||
u32 n, byte_enables, data;
|
||||
n = addr % 4;
|
||||
@ -345,15 +318,13 @@ __ixp4xx_inw(u32 addr)
|
||||
return data>>(8*n);
|
||||
}
|
||||
|
||||
static inline void
|
||||
__ixp4xx_insw(u32 io_addr, u16 *vaddr, u32 count)
|
||||
static inline void insw(u32 io_addr, u16 *vaddr, u32 count)
|
||||
{
|
||||
while (count--)
|
||||
*vaddr++ = le16_to_cpu(inw(io_addr));
|
||||
}
|
||||
|
||||
static inline u32
|
||||
__ixp4xx_inl(u32 addr)
|
||||
static inline u32 inl(u32 addr)
|
||||
{
|
||||
u32 data;
|
||||
if (ixp4xx_pci_read(addr, NP_CMD_IOREAD, &data))
|
||||
@ -362,11 +333,10 @@ __ixp4xx_inl(u32 addr)
|
||||
return data;
|
||||
}
|
||||
|
||||
static inline void
|
||||
__ixp4xx_insl(u32 io_addr, u32 *vaddr, u32 count)
|
||||
static inline void insl(u32 io_addr, u32 *vaddr, u32 count)
|
||||
{
|
||||
while (count--)
|
||||
*vaddr++ = inl(io_addr);
|
||||
*vaddr++ = le32_to_cpu(inl(io_addr));
|
||||
}
|
||||
|
||||
#define PIO_OFFSET 0x10000UL
|
||||
@ -374,194 +344,183 @@ __ixp4xx_insl(u32 io_addr, u32 *vaddr, u32 count)
|
||||
|
||||
#define __is_io_address(p) (((unsigned long)p >= PIO_OFFSET) && \
|
||||
((unsigned long)p <= (PIO_MASK + PIO_OFFSET)))
|
||||
static inline unsigned int
|
||||
__ixp4xx_ioread8(const void __iomem *addr)
|
||||
|
||||
#define ioread8(p) ioread8(p)
|
||||
static inline unsigned int ioread8(const void __iomem *addr)
|
||||
{
|
||||
unsigned long port = (unsigned long __force)addr;
|
||||
if (__is_io_address(port))
|
||||
return (unsigned int)__ixp4xx_inb(port & PIO_MASK);
|
||||
return (unsigned int)inb(port & PIO_MASK);
|
||||
else
|
||||
#ifndef CONFIG_IXP4XX_INDIRECT_PCI
|
||||
return (unsigned int)__raw_readb(port);
|
||||
#else
|
||||
return (unsigned int)__ixp4xx_readb(addr);
|
||||
return (unsigned int)__indirect_readb(addr);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void
|
||||
__ixp4xx_ioread8_rep(const void __iomem *addr, void *vaddr, u32 count)
|
||||
#define ioread8_rep(p, v, c) ioread8_rep(p, v, c)
|
||||
static inline void ioread8_rep(const void __iomem *addr, void *vaddr, u32 count)
|
||||
{
|
||||
unsigned long port = (unsigned long __force)addr;
|
||||
if (__is_io_address(port))
|
||||
__ixp4xx_insb(port & PIO_MASK, vaddr, count);
|
||||
insb(port & PIO_MASK, vaddr, count);
|
||||
else
|
||||
#ifndef CONFIG_IXP4XX_INDIRECT_PCI
|
||||
__raw_readsb(addr, vaddr, count);
|
||||
#else
|
||||
__ixp4xx_readsb(addr, vaddr, count);
|
||||
__indirect_readsb(addr, vaddr, count);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline unsigned int
|
||||
__ixp4xx_ioread16(const void __iomem *addr)
|
||||
#define ioread16(p) ioread16(p)
|
||||
static inline unsigned int ioread16(const void __iomem *addr)
|
||||
{
|
||||
unsigned long port = (unsigned long __force)addr;
|
||||
if (__is_io_address(port))
|
||||
return (unsigned int)__ixp4xx_inw(port & PIO_MASK);
|
||||
return (unsigned int)inw(port & PIO_MASK);
|
||||
else
|
||||
#ifndef CONFIG_IXP4XX_INDIRECT_PCI
|
||||
return le16_to_cpu(__raw_readw((u32)port));
|
||||
#else
|
||||
return (unsigned int)__ixp4xx_readw(addr);
|
||||
return (unsigned int)__indirect_readw(addr);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void
|
||||
__ixp4xx_ioread16_rep(const void __iomem *addr, void *vaddr, u32 count)
|
||||
#define ioread16_rep(p, v, c) ioread16_rep(p, v, c)
|
||||
static inline void ioread16_rep(const void __iomem *addr, void *vaddr,
|
||||
u32 count)
|
||||
{
|
||||
unsigned long port = (unsigned long __force)addr;
|
||||
if (__is_io_address(port))
|
||||
__ixp4xx_insw(port & PIO_MASK, vaddr, count);
|
||||
insw(port & PIO_MASK, vaddr, count);
|
||||
else
|
||||
#ifndef CONFIG_IXP4XX_INDIRECT_PCI
|
||||
__raw_readsw(addr, vaddr, count);
|
||||
#else
|
||||
__ixp4xx_readsw(addr, vaddr, count);
|
||||
__indirect_readsw(addr, vaddr, count);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline unsigned int
|
||||
__ixp4xx_ioread32(const void __iomem *addr)
|
||||
#define ioread32(p) ioread32(p)
|
||||
static inline unsigned int ioread32(const void __iomem *addr)
|
||||
{
|
||||
unsigned long port = (unsigned long __force)addr;
|
||||
if (__is_io_address(port))
|
||||
return (unsigned int)__ixp4xx_inl(port & PIO_MASK);
|
||||
return (unsigned int)inl(port & PIO_MASK);
|
||||
else {
|
||||
#ifndef CONFIG_IXP4XX_INDIRECT_PCI
|
||||
return le32_to_cpu((__force __le32)__raw_readl(addr));
|
||||
#else
|
||||
return (unsigned int)__ixp4xx_readl(addr);
|
||||
return (unsigned int)__indirect_readl(addr);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
static inline void
|
||||
__ixp4xx_ioread32_rep(const void __iomem *addr, void *vaddr, u32 count)
|
||||
#define ioread32_rep(p, v, c) ioread32_rep(p, v, c)
|
||||
static inline void ioread32_rep(const void __iomem *addr, void *vaddr,
|
||||
u32 count)
|
||||
{
|
||||
unsigned long port = (unsigned long __force)addr;
|
||||
if (__is_io_address(port))
|
||||
__ixp4xx_insl(port & PIO_MASK, vaddr, count);
|
||||
insl(port & PIO_MASK, vaddr, count);
|
||||
else
|
||||
#ifndef CONFIG_IXP4XX_INDIRECT_PCI
|
||||
__raw_readsl(addr, vaddr, count);
|
||||
#else
|
||||
__ixp4xx_readsl(addr, vaddr, count);
|
||||
__indirect_readsl(addr, vaddr, count);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void
|
||||
__ixp4xx_iowrite8(u8 value, void __iomem *addr)
|
||||
#define iowrite8(v, p) iowrite8(v, p)
|
||||
static inline void iowrite8(u8 value, void __iomem *addr)
|
||||
{
|
||||
unsigned long port = (unsigned long __force)addr;
|
||||
if (__is_io_address(port))
|
||||
__ixp4xx_outb(value, port & PIO_MASK);
|
||||
outb(value, port & PIO_MASK);
|
||||
else
|
||||
#ifndef CONFIG_IXP4XX_INDIRECT_PCI
|
||||
__raw_writeb(value, port);
|
||||
#else
|
||||
__ixp4xx_writeb(value, addr);
|
||||
__indirect_writeb(value, addr);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void
|
||||
__ixp4xx_iowrite8_rep(void __iomem *addr, const void *vaddr, u32 count)
|
||||
#define iowrite8_rep(p, v, c) iowrite8_rep(p, v, c)
|
||||
static inline void iowrite8_rep(void __iomem *addr, const void *vaddr,
|
||||
u32 count)
|
||||
{
|
||||
unsigned long port = (unsigned long __force)addr;
|
||||
if (__is_io_address(port))
|
||||
__ixp4xx_outsb(port & PIO_MASK, vaddr, count);
|
||||
outsb(port & PIO_MASK, vaddr, count);
|
||||
else
|
||||
#ifndef CONFIG_IXP4XX_INDIRECT_PCI
|
||||
__raw_writesb(addr, vaddr, count);
|
||||
#else
|
||||
__ixp4xx_writesb(addr, vaddr, count);
|
||||
__indirect_writesb(addr, vaddr, count);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void
|
||||
__ixp4xx_iowrite16(u16 value, void __iomem *addr)
|
||||
#define iowrite16(v, p) iowrite16(v, p)
|
||||
static inline void iowrite16(u16 value, void __iomem *addr)
|
||||
{
|
||||
unsigned long port = (unsigned long __force)addr;
|
||||
if (__is_io_address(port))
|
||||
__ixp4xx_outw(value, port & PIO_MASK);
|
||||
outw(value, port & PIO_MASK);
|
||||
else
|
||||
#ifndef CONFIG_IXP4XX_INDIRECT_PCI
|
||||
__raw_writew(cpu_to_le16(value), addr);
|
||||
#else
|
||||
__ixp4xx_writew(value, addr);
|
||||
__indirect_writew(value, addr);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void
|
||||
__ixp4xx_iowrite16_rep(void __iomem *addr, const void *vaddr, u32 count)
|
||||
#define iowrite16_rep(p, v, c) iowrite16_rep(p, v, c)
|
||||
static inline void iowrite16_rep(void __iomem *addr, const void *vaddr,
|
||||
u32 count)
|
||||
{
|
||||
unsigned long port = (unsigned long __force)addr;
|
||||
if (__is_io_address(port))
|
||||
__ixp4xx_outsw(port & PIO_MASK, vaddr, count);
|
||||
outsw(port & PIO_MASK, vaddr, count);
|
||||
else
|
||||
#ifndef CONFIG_IXP4XX_INDIRECT_PCI
|
||||
__raw_writesw(addr, vaddr, count);
|
||||
#else
|
||||
__ixp4xx_writesw(addr, vaddr, count);
|
||||
__indirect_writesw(addr, vaddr, count);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void
|
||||
__ixp4xx_iowrite32(u32 value, void __iomem *addr)
|
||||
#define iowrite32(v, p) iowrite32(v, p)
|
||||
static inline void iowrite32(u32 value, void __iomem *addr)
|
||||
{
|
||||
unsigned long port = (unsigned long __force)addr;
|
||||
if (__is_io_address(port))
|
||||
__ixp4xx_outl(value, port & PIO_MASK);
|
||||
outl(value, port & PIO_MASK);
|
||||
else
|
||||
#ifndef CONFIG_IXP4XX_INDIRECT_PCI
|
||||
__raw_writel((u32 __force)cpu_to_le32(value), addr);
|
||||
#else
|
||||
__ixp4xx_writel(value, addr);
|
||||
__indirect_writel(value, addr);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void
|
||||
__ixp4xx_iowrite32_rep(void __iomem *addr, const void *vaddr, u32 count)
|
||||
#define iowrite32_rep(p, v, c) iowrite32_rep(p, v, c)
|
||||
static inline void iowrite32_rep(void __iomem *addr, const void *vaddr,
|
||||
u32 count)
|
||||
{
|
||||
unsigned long port = (unsigned long __force)addr;
|
||||
if (__is_io_address(port))
|
||||
__ixp4xx_outsl(port & PIO_MASK, vaddr, count);
|
||||
outsl(port & PIO_MASK, vaddr, count);
|
||||
else
|
||||
#ifndef CONFIG_IXP4XX_INDIRECT_PCI
|
||||
__raw_writesl(addr, vaddr, count);
|
||||
#else
|
||||
__ixp4xx_writesl(addr, vaddr, count);
|
||||
__indirect_writesl(addr, vaddr, count);
|
||||
#endif
|
||||
}
|
||||
|
||||
#define ioread8(p) __ixp4xx_ioread8(p)
|
||||
#define ioread16(p) __ixp4xx_ioread16(p)
|
||||
#define ioread32(p) __ixp4xx_ioread32(p)
|
||||
|
||||
#define ioread8_rep(p, v, c) __ixp4xx_ioread8_rep(p, v, c)
|
||||
#define ioread16_rep(p, v, c) __ixp4xx_ioread16_rep(p, v, c)
|
||||
#define ioread32_rep(p, v, c) __ixp4xx_ioread32_rep(p, v, c)
|
||||
|
||||
#define iowrite8(v,p) __ixp4xx_iowrite8(v,p)
|
||||
#define iowrite16(v,p) __ixp4xx_iowrite16(v,p)
|
||||
#define iowrite32(v,p) __ixp4xx_iowrite32(v,p)
|
||||
|
||||
#define iowrite8_rep(p, v, c) __ixp4xx_iowrite8_rep(p, v, c)
|
||||
#define iowrite16_rep(p, v, c) __ixp4xx_iowrite16_rep(p, v, c)
|
||||
#define iowrite32_rep(p, v, c) __ixp4xx_iowrite32_rep(p, v, c)
|
||||
|
||||
#define ioport_map(port, nr) ((void __iomem*)(port + PIO_OFFSET))
|
||||
#define ioport_unmap(addr)
|
||||
#endif // !CONFIG_PCI
|
||||
|
||||
#endif // __ASM_ARM_ARCH_IO_H
|
||||
#endif /* CONFIG_PCI */
|
||||
|
||||
#endif /* __ASM_ARM_ARCH_IO_H */
|
||||
|
@ -15,7 +15,6 @@
|
||||
#ifndef _ARCH_IXP4XX_IRQS_H_
|
||||
#define _ARCH_IXP4XX_IRQS_H_
|
||||
|
||||
|
||||
#define IRQ_IXP4XX_NPEA 0
|
||||
#define IRQ_IXP4XX_NPEB 1
|
||||
#define IRQ_IXP4XX_NPEC 2
|
||||
@ -59,6 +58,9 @@
|
||||
#define IRQ_IXP4XX_MCU_ECC 61
|
||||
#define IRQ_IXP4XX_EXP_PE 62
|
||||
|
||||
#define _IXP4XX_GPIO_IRQ(n) (IRQ_IXP4XX_GPIO ## n)
|
||||
#define IXP4XX_GPIO_IRQ(n) _IXP4XX_GPIO_IRQ(n)
|
||||
|
||||
/*
|
||||
* Only first 32 sources are valid if running on IXP42x systems
|
||||
*/
|
||||
@ -70,69 +72,4 @@
|
||||
|
||||
#define XSCALE_PMU_IRQ (IRQ_IXP4XX_XSCALE_PMU)
|
||||
|
||||
/*
|
||||
* IXDP425 board IRQs
|
||||
*/
|
||||
#define IRQ_IXDP425_PCI_INTA IRQ_IXP4XX_GPIO11
|
||||
#define IRQ_IXDP425_PCI_INTB IRQ_IXP4XX_GPIO10
|
||||
#define IRQ_IXDP425_PCI_INTC IRQ_IXP4XX_GPIO9
|
||||
#define IRQ_IXDP425_PCI_INTD IRQ_IXP4XX_GPIO8
|
||||
|
||||
/*
|
||||
* Gateworks Avila board IRQs
|
||||
*/
|
||||
#define IRQ_AVILA_PCI_INTA IRQ_IXP4XX_GPIO11
|
||||
#define IRQ_AVILA_PCI_INTB IRQ_IXP4XX_GPIO10
|
||||
#define IRQ_AVILA_PCI_INTC IRQ_IXP4XX_GPIO9
|
||||
#define IRQ_AVILA_PCI_INTD IRQ_IXP4XX_GPIO8
|
||||
|
||||
|
||||
/*
|
||||
* PrPMC1100 Board IRQs
|
||||
*/
|
||||
#define IRQ_PRPMC1100_PCI_INTA IRQ_IXP4XX_GPIO11
|
||||
#define IRQ_PRPMC1100_PCI_INTB IRQ_IXP4XX_GPIO10
|
||||
#define IRQ_PRPMC1100_PCI_INTC IRQ_IXP4XX_GPIO9
|
||||
#define IRQ_PRPMC1100_PCI_INTD IRQ_IXP4XX_GPIO8
|
||||
|
||||
/*
|
||||
* ADI Coyote Board IRQs
|
||||
*/
|
||||
#define IRQ_COYOTE_PCI_SLOT0 IRQ_IXP4XX_GPIO6
|
||||
#define IRQ_COYOTE_PCI_SLOT1 IRQ_IXP4XX_GPIO11
|
||||
#define IRQ_COYOTE_IDE IRQ_IXP4XX_GPIO5
|
||||
|
||||
/*
|
||||
* NSLU2 board IRQs
|
||||
*/
|
||||
#define IRQ_NSLU2_PCI_INTA IRQ_IXP4XX_GPIO11
|
||||
#define IRQ_NSLU2_PCI_INTB IRQ_IXP4XX_GPIO10
|
||||
#define IRQ_NSLU2_PCI_INTC IRQ_IXP4XX_GPIO9
|
||||
|
||||
/*
|
||||
* NAS100D board IRQs
|
||||
*/
|
||||
#define IRQ_NAS100D_PCI_INTA IRQ_IXP4XX_GPIO11
|
||||
#define IRQ_NAS100D_PCI_INTB IRQ_IXP4XX_GPIO10
|
||||
#define IRQ_NAS100D_PCI_INTC IRQ_IXP4XX_GPIO9
|
||||
#define IRQ_NAS100D_PCI_INTD IRQ_IXP4XX_GPIO8
|
||||
#define IRQ_NAS100D_PCI_INTE IRQ_IXP4XX_GPIO7
|
||||
|
||||
/*
|
||||
* D-Link DSM-G600 RevA board IRQs
|
||||
*/
|
||||
#define IRQ_DSMG600_PCI_INTA IRQ_IXP4XX_GPIO11
|
||||
#define IRQ_DSMG600_PCI_INTB IRQ_IXP4XX_GPIO10
|
||||
#define IRQ_DSMG600_PCI_INTC IRQ_IXP4XX_GPIO9
|
||||
#define IRQ_DSMG600_PCI_INTD IRQ_IXP4XX_GPIO8
|
||||
#define IRQ_DSMG600_PCI_INTE IRQ_IXP4XX_GPIO7
|
||||
#define IRQ_DSMG600_PCI_INTF IRQ_IXP4XX_GPIO6
|
||||
|
||||
/*
|
||||
* Freecom FSG-3 Board IRQs
|
||||
*/
|
||||
#define IRQ_FSG_PCI_INTA IRQ_IXP4XX_GPIO6
|
||||
#define IRQ_FSG_PCI_INTB IRQ_IXP4XX_GPIO7
|
||||
#define IRQ_FSG_PCI_INTC IRQ_IXP4XX_GPIO5
|
||||
|
||||
#endif
|
||||
|
@ -1,39 +0,0 @@
|
||||
/*
|
||||
* arch/arm/mach-ixp4xx/include/mach/ixdp425.h
|
||||
*
|
||||
* IXDP425 platform specific definitions
|
||||
*
|
||||
* Author: Deepak Saxena <dsaxena@plexity.net>
|
||||
*
|
||||
* Copyright 2004 (c) MontaVista, Software, Inc.
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_HARDWARE_H__
|
||||
#error "Do not include this directly, instead #include <mach/hardware.h>"
|
||||
#endif
|
||||
|
||||
#define IXDP425_SDA_PIN 7
|
||||
#define IXDP425_SCL_PIN 6
|
||||
|
||||
/*
|
||||
* IXDP425 PCI IRQs
|
||||
*/
|
||||
#define IXDP425_PCI_MAX_DEV 4
|
||||
#define IXDP425_PCI_IRQ_LINES 4
|
||||
|
||||
|
||||
/* PCI controller GPIO to IRQ pin mappings */
|
||||
#define IXDP425_PCI_INTA_PIN 11
|
||||
#define IXDP425_PCI_INTB_PIN 10
|
||||
#define IXDP425_PCI_INTC_PIN 9
|
||||
#define IXDP425_PCI_INTD_PIN 8
|
||||
|
||||
/* NAND Flash pins */
|
||||
#define IXDP425_NAND_NCE_PIN 12
|
||||
|
||||
#define IXDP425_NAND_CMD_BYTE 0x01
|
||||
#define IXDP425_NAND_ADDR_BYTE 0x02
|
@ -1,52 +0,0 @@
|
||||
/*
|
||||
* arch/arm/mach-ixp4xx/include/mach/nas100d.h
|
||||
*
|
||||
* NAS100D platform specific definitions
|
||||
*
|
||||
* Copyright (c) 2005 Tower Technologies
|
||||
*
|
||||
* Author: Alessandro Zummo <a.zummo@towertech.it>
|
||||
*
|
||||
* based on ixdp425.h:
|
||||
* Copyright 2004 (c) MontaVista, Software, Inc.
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_HARDWARE_H__
|
||||
#error "Do not include this directly, instead #include <mach/hardware.h>"
|
||||
#endif
|
||||
|
||||
#define NAS100D_SDA_PIN 5
|
||||
#define NAS100D_SCL_PIN 6
|
||||
|
||||
/*
|
||||
* NAS100D PCI IRQs
|
||||
*/
|
||||
#define NAS100D_PCI_MAX_DEV 3
|
||||
#define NAS100D_PCI_IRQ_LINES 3
|
||||
|
||||
|
||||
/* PCI controller GPIO to IRQ pin mappings */
|
||||
#define NAS100D_PCI_INTA_PIN 11
|
||||
#define NAS100D_PCI_INTB_PIN 10
|
||||
#define NAS100D_PCI_INTC_PIN 9
|
||||
#define NAS100D_PCI_INTD_PIN 8
|
||||
#define NAS100D_PCI_INTE_PIN 7
|
||||
|
||||
/* Buttons */
|
||||
|
||||
#define NAS100D_PB_GPIO 14 /* power button */
|
||||
#define NAS100D_RB_GPIO 4 /* reset button */
|
||||
|
||||
/* Power control */
|
||||
|
||||
#define NAS100D_PO_GPIO 12 /* power off */
|
||||
|
||||
/* LEDs */
|
||||
|
||||
#define NAS100D_LED_WLAN_GPIO 0
|
||||
#define NAS100D_LED_DISK_GPIO 3
|
||||
#define NAS100D_LED_PWR_GPIO 15
|
@ -33,7 +33,7 @@ int npe_send_message(struct npe *npe, const void *msg, const char *what);
|
||||
int npe_recv_message(struct npe *npe, void *msg, const char *what);
|
||||
int npe_send_recv_message(struct npe *npe, void *msg, const char *what);
|
||||
int npe_load_firmware(struct npe *npe, const char *name, struct device *dev);
|
||||
struct npe *npe_request(int id);
|
||||
struct npe *npe_request(unsigned id);
|
||||
void npe_release(struct npe *npe);
|
||||
|
||||
#endif /* __IXP4XX_NPE_H */
|
||||
|
@ -1,55 +0,0 @@
|
||||
/*
|
||||
* arch/arm/mach-ixp4xx/include/mach/nslu2.h
|
||||
*
|
||||
* NSLU2 platform specific definitions
|
||||
*
|
||||
* Author: Mark Rakes <mrakes AT mac.com>
|
||||
* Maintainers: http://www.nslu2-linux.org
|
||||
*
|
||||
* based on ixdp425.h:
|
||||
* Copyright 2004 (c) MontaVista, Software, Inc.
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_HARDWARE_H__
|
||||
#error "Do not include this directly, instead #include <mach/hardware.h>"
|
||||
#endif
|
||||
|
||||
#define NSLU2_SDA_PIN 7
|
||||
#define NSLU2_SCL_PIN 6
|
||||
|
||||
/*
|
||||
* NSLU2 PCI IRQs
|
||||
*/
|
||||
#define NSLU2_PCI_MAX_DEV 3
|
||||
#define NSLU2_PCI_IRQ_LINES 3
|
||||
|
||||
|
||||
/* PCI controller GPIO to IRQ pin mappings */
|
||||
#define NSLU2_PCI_INTA_PIN 11
|
||||
#define NSLU2_PCI_INTB_PIN 10
|
||||
#define NSLU2_PCI_INTC_PIN 9
|
||||
#define NSLU2_PCI_INTD_PIN 8
|
||||
|
||||
/* NSLU2 Timer */
|
||||
#define NSLU2_FREQ 66000000
|
||||
|
||||
/* Buttons */
|
||||
|
||||
#define NSLU2_PB_GPIO 5 /* power button */
|
||||
#define NSLU2_PO_GPIO 8 /* power off */
|
||||
#define NSLU2_RB_GPIO 12 /* reset button */
|
||||
|
||||
/* Buzzer */
|
||||
|
||||
#define NSLU2_GPIO_BUZZ 4
|
||||
|
||||
/* LEDs */
|
||||
|
||||
#define NSLU2_LED_RED_GPIO 0
|
||||
#define NSLU2_LED_GRN_GPIO 1
|
||||
#define NSLU2_LED_DISK1_GPIO 3
|
||||
#define NSLU2_LED_DISK2_GPIO 2
|
@ -1,33 +0,0 @@
|
||||
/*
|
||||
* arch/arm/mach-ixp4xx/include/mach/prpmc1100.h
|
||||
*
|
||||
* Motorolla PrPMC1100 platform specific definitions
|
||||
*
|
||||
* Author: Deepak Saxena <dsaxena@plexity.net>
|
||||
*
|
||||
* Copyright 2004 (c) MontaVista, Software, Inc.
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_HARDWARE_H__
|
||||
#error "Do not include this directly, instead #include <mach/hardware.h>"
|
||||
#endif
|
||||
|
||||
#define PRPMC1100_FLASH_BASE IXP4XX_EXP_BUS_CS0_BASE_PHYS
|
||||
#define PRPMC1100_FLASH_SIZE IXP4XX_EXP_BUS_CSX_REGION_SIZE
|
||||
|
||||
#define PRPMC1100_PCI_MIN_DEVID 10
|
||||
#define PRPMC1100_PCI_MAX_DEVID 16
|
||||
#define PRPMC1100_PCI_IRQ_LINES 4
|
||||
|
||||
|
||||
/* PCI controller GPIO to IRQ pin mappings */
|
||||
#define PRPMC1100_PCI_INTA_PIN 11
|
||||
#define PRPMC1100_PCI_INTB_PIN 10
|
||||
#define PRPMC1100_PCI_INTC_PIN 9
|
||||
#define PRPMC1100_PCI_INTD_PIN 8
|
||||
|
||||
|
@ -10,6 +10,6 @@
|
||||
* 66.66... MHz. We do a convulted calculation of CLOCK_TICK_RATE b/c the
|
||||
* timer register ignores the bottom 2 bits of the LATCH value.
|
||||
*/
|
||||
#define FREQ 66666666
|
||||
#define FREQ 66666000
|
||||
#define CLOCK_TICK_RATE (((FREQ / HZ & ~IXP4XX_OST_RELOAD_MASK) + 1) * HZ)
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* arch/arm/mach-ixp4xx/ixdp425-pci.c
|
||||
* arch/arm/mach-ixp4xx/ixdp425-pci.c
|
||||
*
|
||||
* IXDP425 board-level PCI initialization
|
||||
*
|
||||
@ -19,39 +19,43 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <asm/mach/pci.h>
|
||||
#include <asm/irq.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#define MAX_DEV 4
|
||||
#define IRQ_LINES 4
|
||||
|
||||
/* PCI controller GPIO to IRQ pin mappings */
|
||||
#define INTA 11
|
||||
#define INTB 10
|
||||
#define INTC 9
|
||||
#define INTD 8
|
||||
|
||||
|
||||
void __init ixdp425_pci_preinit(void)
|
||||
{
|
||||
set_irq_type(IRQ_IXDP425_PCI_INTA, IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IRQ_IXDP425_PCI_INTB, IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IRQ_IXDP425_PCI_INTC, IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IRQ_IXDP425_PCI_INTD, IRQ_TYPE_LEVEL_LOW);
|
||||
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(INTA), IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(INTB), IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(INTC), IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(INTD), IRQ_TYPE_LEVEL_LOW);
|
||||
ixp4xx_pci_preinit();
|
||||
}
|
||||
|
||||
static int __init ixdp425_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
static int pci_irq_table[IXDP425_PCI_IRQ_LINES] = {
|
||||
IRQ_IXDP425_PCI_INTA,
|
||||
IRQ_IXDP425_PCI_INTB,
|
||||
IRQ_IXDP425_PCI_INTC,
|
||||
IRQ_IXDP425_PCI_INTD
|
||||
static int pci_irq_table[IRQ_LINES] = {
|
||||
IXP4XX_GPIO_IRQ(INTA),
|
||||
IXP4XX_GPIO_IRQ(INTB),
|
||||
IXP4XX_GPIO_IRQ(INTC),
|
||||
IXP4XX_GPIO_IRQ(INTD)
|
||||
};
|
||||
|
||||
int irq = -1;
|
||||
if (slot >= 1 && slot <= MAX_DEV && pin >= 1 && pin <= IRQ_LINES)
|
||||
return pci_irq_table[(slot + pin - 2) % 4];
|
||||
|
||||
if (slot >= 1 && slot <= IXDP425_PCI_MAX_DEV &&
|
||||
pin >= 1 && pin <= IXDP425_PCI_IRQ_LINES) {
|
||||
irq = pci_irq_table[(slot + pin - 2) % 4];
|
||||
}
|
||||
|
||||
return irq;
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct hw_pci ixdp425_pci __initdata = {
|
||||
@ -72,4 +76,3 @@ int __init ixdp425_pci_init(void)
|
||||
}
|
||||
|
||||
subsys_initcall(ixdp425_pci_init);
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* arch/arm/mach-ixp4xx/ixdp425-setup.c
|
||||
*
|
||||
* IXDP425/IXCDP1100 board-setup
|
||||
* IXDP425/IXCDP1100 board-setup
|
||||
*
|
||||
* Copyright (C) 2003-2005 MontaVista Software, Inc.
|
||||
*
|
||||
@ -21,7 +21,6 @@
|
||||
#include <linux/mtd/nand.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <asm/types.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/memory.h>
|
||||
@ -31,6 +30,15 @@
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/flash.h>
|
||||
|
||||
#define IXDP425_SDA_PIN 7
|
||||
#define IXDP425_SCL_PIN 6
|
||||
|
||||
/* NAND Flash pins */
|
||||
#define IXDP425_NAND_NCE_PIN 12
|
||||
|
||||
#define IXDP425_NAND_CMD_BYTE 0x01
|
||||
#define IXDP425_NAND_ADDR_BYTE 0x02
|
||||
|
||||
static struct flash_platform_data ixdp425_flash_data = {
|
||||
.map_name = "cfi_probe",
|
||||
.width = 2,
|
||||
|
@ -665,7 +665,7 @@ int npe_load_firmware(struct npe *npe, const char *name, struct device *dev)
|
||||
}
|
||||
|
||||
|
||||
struct npe *npe_request(int id)
|
||||
struct npe *npe_request(unsigned id)
|
||||
{
|
||||
if (id < NPE_COUNT)
|
||||
if (npe_tab[id].valid)
|
||||
|
@ -18,37 +18,42 @@
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
#include <asm/mach/pci.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#define MAX_DEV 3
|
||||
#define IRQ_LINES 3
|
||||
|
||||
/* PCI controller GPIO to IRQ pin mappings */
|
||||
#define INTA 11
|
||||
#define INTB 10
|
||||
#define INTC 9
|
||||
#define INTD 8
|
||||
#define INTE 7
|
||||
|
||||
void __init nas100d_pci_preinit(void)
|
||||
{
|
||||
set_irq_type(IRQ_NAS100D_PCI_INTA, IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IRQ_NAS100D_PCI_INTB, IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IRQ_NAS100D_PCI_INTC, IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IRQ_NAS100D_PCI_INTD, IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IRQ_NAS100D_PCI_INTE, IRQ_TYPE_LEVEL_LOW);
|
||||
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(INTA), IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(INTB), IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(INTC), IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(INTD), IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(INTE), IRQ_TYPE_LEVEL_LOW);
|
||||
ixp4xx_pci_preinit();
|
||||
}
|
||||
|
||||
static int __init nas100d_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
static int pci_irq_table[NAS100D_PCI_MAX_DEV][NAS100D_PCI_IRQ_LINES] =
|
||||
{
|
||||
{ IRQ_NAS100D_PCI_INTA, -1, -1 },
|
||||
{ IRQ_NAS100D_PCI_INTB, -1, -1 },
|
||||
{ IRQ_NAS100D_PCI_INTC, IRQ_NAS100D_PCI_INTD, IRQ_NAS100D_PCI_INTE },
|
||||
static int pci_irq_table[MAX_DEV][IRQ_LINES] = {
|
||||
{ IXP4XX_GPIO_IRQ(INTA), -1, -1 },
|
||||
{ IXP4XX_GPIO_IRQ(INTB), -1, -1 },
|
||||
{ IXP4XX_GPIO_IRQ(INTC), IXP4XX_GPIO_IRQ(INTD),
|
||||
IXP4XX_GPIO_IRQ(INTE) },
|
||||
};
|
||||
|
||||
int irq = -1;
|
||||
if (slot >= 1 && slot <= MAX_DEV && pin >= 1 && pin <= IRQ_LINES)
|
||||
return pci_irq_table[slot - 1][pin - 1];
|
||||
|
||||
if (slot >= 1 && slot <= NAS100D_PCI_MAX_DEV &&
|
||||
pin >= 1 && pin <= NAS100D_PCI_IRQ_LINES)
|
||||
irq = pci_irq_table[slot-1][pin-1];
|
||||
|
||||
return irq;
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct hw_pci __initdata nas100d_pci = {
|
||||
|
@ -29,12 +29,26 @@
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-gpio.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/flash.h>
|
||||
#include <asm/gpio.h>
|
||||
|
||||
#define NAS100D_SDA_PIN 5
|
||||
#define NAS100D_SCL_PIN 6
|
||||
|
||||
/* Buttons */
|
||||
#define NAS100D_PB_GPIO 14 /* power button */
|
||||
#define NAS100D_RB_GPIO 4 /* reset button */
|
||||
|
||||
/* Power control */
|
||||
#define NAS100D_PO_GPIO 12 /* power off */
|
||||
|
||||
/* LEDs */
|
||||
#define NAS100D_LED_WLAN_GPIO 0
|
||||
#define NAS100D_LED_DISK_GPIO 3
|
||||
#define NAS100D_LED_PWR_GPIO 15
|
||||
|
||||
static struct flash_platform_data nas100d_flash_data = {
|
||||
.map_name = "cfi_probe",
|
||||
.width = 2,
|
||||
|
@ -18,35 +18,38 @@
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
#include <asm/mach/pci.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#define MAX_DEV 3
|
||||
#define IRQ_LINES 3
|
||||
|
||||
/* PCI controller GPIO to IRQ pin mappings */
|
||||
#define INTA 11
|
||||
#define INTB 10
|
||||
#define INTC 9
|
||||
#define INTD 8
|
||||
|
||||
void __init nslu2_pci_preinit(void)
|
||||
{
|
||||
set_irq_type(IRQ_NSLU2_PCI_INTA, IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IRQ_NSLU2_PCI_INTB, IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IRQ_NSLU2_PCI_INTC, IRQ_TYPE_LEVEL_LOW);
|
||||
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(INTA), IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(INTB), IRQ_TYPE_LEVEL_LOW);
|
||||
set_irq_type(IXP4XX_GPIO_IRQ(INTC), IRQ_TYPE_LEVEL_LOW);
|
||||
ixp4xx_pci_preinit();
|
||||
}
|
||||
|
||||
static int __init nslu2_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
static int pci_irq_table[NSLU2_PCI_IRQ_LINES] = {
|
||||
IRQ_NSLU2_PCI_INTA,
|
||||
IRQ_NSLU2_PCI_INTB,
|
||||
IRQ_NSLU2_PCI_INTC,
|
||||
static int pci_irq_table[IRQ_LINES] = {
|
||||
IXP4XX_GPIO_IRQ(INTA),
|
||||
IXP4XX_GPIO_IRQ(INTB),
|
||||
IXP4XX_GPIO_IRQ(INTC),
|
||||
};
|
||||
|
||||
int irq = -1;
|
||||
if (slot >= 1 && slot <= MAX_DEV && pin >= 1 && pin <= IRQ_LINES)
|
||||
return pci_irq_table[(slot + pin - 2) % IRQ_LINES];
|
||||
|
||||
if (slot >= 1 && slot <= NSLU2_PCI_MAX_DEV &&
|
||||
pin >= 1 && pin <= NSLU2_PCI_IRQ_LINES) {
|
||||
irq = pci_irq_table[(slot + pin - 2) % NSLU2_PCI_IRQ_LINES];
|
||||
}
|
||||
|
||||
return irq;
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct hw_pci __initdata nslu2_pci = {
|
||||
|
@ -26,13 +26,32 @@
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-gpio.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/flash.h>
|
||||
#include <asm/mach/time.h>
|
||||
#include <asm/gpio.h>
|
||||
|
||||
#define NSLU2_SDA_PIN 7
|
||||
#define NSLU2_SCL_PIN 6
|
||||
|
||||
/* NSLU2 Timer */
|
||||
#define NSLU2_FREQ 66000000
|
||||
|
||||
/* Buttons */
|
||||
#define NSLU2_PB_GPIO 5 /* power button */
|
||||
#define NSLU2_PO_GPIO 8 /* power off */
|
||||
#define NSLU2_RB_GPIO 12 /* reset button */
|
||||
|
||||
/* Buzzer */
|
||||
#define NSLU2_GPIO_BUZZ 4
|
||||
|
||||
/* LEDs */
|
||||
#define NSLU2_LED_RED_GPIO 0
|
||||
#define NSLU2_LED_GRN_GPIO 1
|
||||
#define NSLU2_LED_DISK1_GPIO 3
|
||||
#define NSLU2_LED_DISK2_GPIO 2
|
||||
|
||||
static struct flash_platform_data nslu2_flash_data = {
|
||||
.map_name = "cfi_probe",
|
||||
.width = 2,
|
||||
|
@ -7,8 +7,6 @@
|
||||
* version 2 as published by the Free Software Foundation.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/cpufreq.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/clocks.h>
|
||||
#include <linux/err.h>
|
||||
@ -31,12 +29,6 @@ struct clk {
|
||||
#define HCLKDIV(c) (((c) >> 0) & 0x02)
|
||||
#define PCLKDIV(c) (((c) >> 16) & 0x03)
|
||||
|
||||
unsigned int cpufreq_get (unsigned int cpu) /* in kHz */
|
||||
{
|
||||
return fclkfreq_get ()/1000;
|
||||
}
|
||||
EXPORT_SYMBOL(cpufreq_get);
|
||||
|
||||
unsigned int fclkfreq_get (void)
|
||||
{
|
||||
unsigned int clkset = CSC_CLKSET;
|
||||
|
@ -3,6 +3,30 @@ if ARCH_MSM
|
||||
comment "MSM Board Type"
|
||||
depends on ARCH_MSM
|
||||
|
||||
config MSM_DEBUG_UART
|
||||
int
|
||||
default 1 if MSM_DEBUG_UART1
|
||||
default 2 if MSM_DEBUG_UART2
|
||||
default 3 if MSM_DEBUG_UART3
|
||||
|
||||
choice
|
||||
prompt "Debug UART"
|
||||
|
||||
default MSM_DEBUG_UART_NONE
|
||||
|
||||
config MSM_DEBUG_UART_NONE
|
||||
bool "None"
|
||||
|
||||
config MSM_DEBUG_UART1
|
||||
bool "UART1"
|
||||
|
||||
config MSM_DEBUG_UART2
|
||||
bool "UART2"
|
||||
|
||||
config MSM_DEBUG_UART3
|
||||
bool "UART3"
|
||||
endchoice
|
||||
|
||||
config MACH_HALIBUT
|
||||
depends on ARCH_MSM
|
||||
default y
|
||||
@ -10,4 +34,10 @@ config MACH_HALIBUT
|
||||
help
|
||||
Support for the Qualcomm SURF7201A eval board.
|
||||
|
||||
config MACH_TROUT
|
||||
default y
|
||||
bool "HTC Dream (aka trout)"
|
||||
help
|
||||
Support for the HTC Dream, T-Mobile G1, Android ADP1 devices.
|
||||
|
||||
endif
|
||||
|
@ -6,3 +6,4 @@ obj-y += clock.o clock-7x01a.o
|
||||
|
||||
obj-$(CONFIG_MACH_HALIBUT) += board-halibut.o
|
||||
|
||||
obj-$(CONFIG_MACH_TROUT) += board-dream.o
|
||||
|
93
arch/arm/mach-msm/board-dream.c
Normal file
93
arch/arm/mach-msm/board-dream.c
Normal file
@ -0,0 +1,93 @@
|
||||
/* linux/arch/arm/mach-msm/board-dream.c
|
||||
*
|
||||
* Copyright (C) 2009 Google, Inc.
|
||||
* Author: Brian Swetland <swetland@google.com>
|
||||
*
|
||||
* This software is licensed under the terms of the GNU General Public
|
||||
* License version 2, as published by the Free Software Foundation, and
|
||||
* may be copied, distributed, and modified under those terms.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/setup.h>
|
||||
|
||||
#include <mach/board.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/msm_iomap.h>
|
||||
|
||||
#include "devices.h"
|
||||
#include "board-dream.h"
|
||||
|
||||
static struct platform_device *devices[] __initdata = {
|
||||
&msm_device_uart3,
|
||||
&msm_device_smd,
|
||||
&msm_device_nand,
|
||||
&msm_device_hsusb,
|
||||
&msm_device_i2c,
|
||||
};
|
||||
|
||||
extern struct sys_timer msm_timer;
|
||||
|
||||
static void __init trout_init_irq(void)
|
||||
{
|
||||
msm_init_irq();
|
||||
}
|
||||
|
||||
static void __init trout_fixup(struct machine_desc *desc, struct tag *tags,
|
||||
char **cmdline, struct meminfo *mi)
|
||||
{
|
||||
mi->nr_banks = 1;
|
||||
mi->bank[0].start = PHYS_OFFSET;
|
||||
mi->bank[0].node = PHYS_TO_NID(PHYS_OFFSET);
|
||||
mi->bank[0].size = (101*1024*1024);
|
||||
}
|
||||
|
||||
static void __init trout_init(void)
|
||||
{
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
}
|
||||
|
||||
static struct map_desc trout_io_desc[] __initdata = {
|
||||
{
|
||||
.virtual = TROUT_CPLD_BASE,
|
||||
.pfn = __phys_to_pfn(TROUT_CPLD_START),
|
||||
.length = TROUT_CPLD_SIZE,
|
||||
.type = MT_DEVICE_NONSHARED
|
||||
}
|
||||
};
|
||||
|
||||
static void __init trout_map_io(void)
|
||||
{
|
||||
msm_map_common_io();
|
||||
iotable_init(trout_io_desc, ARRAY_SIZE(trout_io_desc));
|
||||
|
||||
#ifdef CONFIG_MSM_DEBUG_UART3
|
||||
/* route UART3 to the "H2W" extended usb connector */
|
||||
writeb(0x80, TROUT_CPLD_BASE + 0x00);
|
||||
#endif
|
||||
|
||||
msm_clock_init();
|
||||
}
|
||||
|
||||
MACHINE_START(TROUT, "HTC Dream")
|
||||
.phys_io = MSM_DEBUG_UART_PHYS,
|
||||
.io_pg_offst = ((MSM_DEBUG_UART_BASE) >> 18) & 0xfffc,
|
||||
.boot_params = 0x10000100,
|
||||
.fixup = trout_fixup,
|
||||
.map_io = trout_map_io,
|
||||
.init_irq = trout_init_irq,
|
||||
.init_machine = trout_init,
|
||||
.timer = &msm_timer,
|
||||
MACHINE_END
|
5
arch/arm/mach-msm/board-dream.h
Normal file
5
arch/arm/mach-msm/board-dream.h
Normal file
@ -0,0 +1,5 @@
|
||||
|
||||
#define TROUT_CPLD_BASE 0xE8100000
|
||||
#define TROUT_CPLD_START 0x98000000
|
||||
#define TROUT_CPLD_SIZE SZ_4K
|
||||
|
@ -14,15 +14,18 @@
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/msm_iomap.h>
|
||||
|
||||
#ifdef CONFIG_MSM_DEBUG_UART
|
||||
.macro addruart,rx
|
||||
@ see if the MMU is enabled and select appropriate base address
|
||||
mrc p15, 0, \rx, c1, c0
|
||||
tst \rx, #1
|
||||
ldreq \rx, =MSM_UART1_PHYS
|
||||
movne \rx, #0
|
||||
ldreq \rx, =MSM_DEBUG_UART_PHYS
|
||||
ldrne \rx, =MSM_DEBUG_UART_BASE
|
||||
.endm
|
||||
|
||||
.macro senduart,rd,rx
|
||||
@ -32,13 +35,20 @@
|
||||
|
||||
.macro waituart,rd,rx
|
||||
@ wait for TX_READY
|
||||
teq \rx, #0
|
||||
bne 2f
|
||||
1: ldr \rd, [\rx, #0x08]
|
||||
1001: ldr \rd, [\rx, #0x08]
|
||||
tst \rd, #0x04
|
||||
beq 1b
|
||||
2:
|
||||
beq 1001b
|
||||
.endm
|
||||
#else
|
||||
.macro addruart,rx
|
||||
.endm
|
||||
|
||||
.macro senduart,rd,rx
|
||||
.endm
|
||||
|
||||
.macro waituart,rd,rx
|
||||
.endm
|
||||
#endif
|
||||
|
||||
.macro busyuart,rd,rx
|
||||
.endm
|
||||
|
26
arch/arm/mach-msm/include/mach/mmc.h
Normal file
26
arch/arm/mach-msm/include/mach/mmc.h
Normal file
@ -0,0 +1,26 @@
|
||||
/*
|
||||
* arch/arm/include/asm/mach/mmc.h
|
||||
*/
|
||||
#ifndef ASMARM_MACH_MMC_H
|
||||
#define ASMARM_MACH_MMC_H
|
||||
|
||||
#include <linux/mmc/host.h>
|
||||
#include <linux/mmc/card.h>
|
||||
#include <linux/mmc/sdio_func.h>
|
||||
|
||||
struct embedded_sdio_data {
|
||||
struct sdio_cis cis;
|
||||
struct sdio_cccr cccr;
|
||||
struct sdio_embedded_func *funcs;
|
||||
int num_funcs;
|
||||
};
|
||||
|
||||
struct mmc_platform_data {
|
||||
unsigned int ocr_mask; /* available voltages */
|
||||
u32 (*translate_vdd)(struct device *, unsigned int);
|
||||
unsigned int (*status)(struct device *);
|
||||
struct embedded_sdio_data *embedded_sdio;
|
||||
int (*register_status_notify)(void (*callback)(int card_present, void *dev_id), void *dev_id);
|
||||
};
|
||||
|
||||
#endif
|
@ -84,6 +84,18 @@
|
||||
#define MSM_UART3_PHYS 0xA9C00000
|
||||
#define MSM_UART3_SIZE SZ_4K
|
||||
|
||||
#ifdef CONFIG_MSM_DEBUG_UART
|
||||
#define MSM_DEBUG_UART_BASE 0xE1000000
|
||||
#if CONFIG_MSM_DEBUG_UART == 1
|
||||
#define MSM_DEBUG_UART_PHYS MSM_UART1_PHYS
|
||||
#elif CONFIG_MSM_DEBUG_UART == 2
|
||||
#define MSM_DEBUG_UART_PHYS MSM_UART2_PHYS
|
||||
#elif CONFIG_MSM_DEBUG_UART == 3
|
||||
#define MSM_DEBUG_UART_PHYS MSM_UART3_PHYS
|
||||
#endif
|
||||
#define MSM_DEBUG_UART_SIZE SZ_4K
|
||||
#endif
|
||||
|
||||
#define MSM_SDC1_PHYS 0xA0400000
|
||||
#define MSM_SDC1_SIZE SZ_4K
|
||||
|
||||
|
@ -16,9 +16,16 @@
|
||||
#ifndef __ASM_ARCH_MSM_UNCOMPRESS_H
|
||||
|
||||
#include "hardware.h"
|
||||
#include "linux/io.h"
|
||||
#include "mach/msm_iomap.h"
|
||||
|
||||
static void putc(int c)
|
||||
{
|
||||
#if defined(MSM_DEBUG_UART_PHYS)
|
||||
unsigned base = MSM_DEBUG_UART_PHYS;
|
||||
while (!(readl(base + 0x08) & 0x04)) ;
|
||||
writel(c, base + 0x0c);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void flush(void)
|
||||
|
@ -42,6 +42,9 @@ static struct map_desc msm_io_desc[] __initdata = {
|
||||
MSM_DEVICE(GPIO1),
|
||||
MSM_DEVICE(GPIO2),
|
||||
MSM_DEVICE(CLK_CTL),
|
||||
#ifdef CONFIG_MSM_DEBUG_UART
|
||||
MSM_DEVICE(DEBUG_UART),
|
||||
#endif
|
||||
{
|
||||
.virtual = (unsigned long) MSM_SHARED_RAM_BASE,
|
||||
.pfn = __phys_to_pfn(MSM_SHARED_RAM_PHYS),
|
||||
|
@ -3,7 +3,8 @@
|
||||
#
|
||||
|
||||
# Common support
|
||||
obj-y := io.o id.o sram.o clock.o irq.o mux.o serial.o devices.o
|
||||
obj-y := io.o id.o sram.o irq.o mux.o serial.o devices.o
|
||||
obj-y += clock.o clock_data.o opp_data.o
|
||||
|
||||
obj-$(CONFIG_OMAP_MCBSP) += mcbsp.o
|
||||
|
||||
@ -17,6 +18,9 @@ obj-$(CONFIG_PM) += pm.o sleep.o
|
||||
obj-$(CONFIG_OMAP_MBOX_FWK) += mailbox_mach.o
|
||||
mailbox_mach-objs := mailbox.o
|
||||
|
||||
i2c-omap-$(CONFIG_I2C_OMAP) := i2c.o
|
||||
obj-y += $(i2c-omap-m) $(i2c-omap-y)
|
||||
|
||||
led-y := leds.o
|
||||
|
||||
# Specific board support
|
||||
@ -48,3 +52,7 @@ led-$(CONFIG_MACH_OMAP_INNOVATOR) += leds-innovator.o
|
||||
led-$(CONFIG_MACH_OMAP_PERSEUS2) += leds-h2p2-debug.o
|
||||
led-$(CONFIG_MACH_OMAP_OSK) += leds-osk.o
|
||||
obj-$(CONFIG_LEDS) += $(led-y)
|
||||
|
||||
ifneq ($(CONFIG_FB_OMAP),)
|
||||
obj-y += lcd_dma.o
|
||||
endif
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include <linux/mtd/nand.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/smc91x.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/mach-types.h>
|
||||
@ -30,7 +31,6 @@
|
||||
#include <mach/gpio.h>
|
||||
#include <plat/mux.h>
|
||||
#include <plat/fpga.h>
|
||||
#include <plat/nand.h>
|
||||
#include <plat/keypad.h>
|
||||
#include <plat/common.h>
|
||||
#include <plat/board.h>
|
||||
@ -100,6 +100,12 @@ static int fsample_keymap[] = {
|
||||
0
|
||||
};
|
||||
|
||||
static struct smc91x_platdata smc91x_info = {
|
||||
.flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
|
||||
.leda = RPC_LED_100_10,
|
||||
.ledb = RPC_LED_TX_RX,
|
||||
};
|
||||
|
||||
static struct resource smc91x_resources[] = {
|
||||
[0] = {
|
||||
.start = H2P2_DBG_FPGA_ETHR_START, /* Physical */
|
||||
@ -167,8 +173,40 @@ static struct platform_device nor_device = {
|
||||
.resource = &nor_resource,
|
||||
};
|
||||
|
||||
static struct omap_nand_platform_data nand_data = {
|
||||
.options = NAND_SAMSUNG_LP_OPTIONS,
|
||||
static void nand_cmd_ctl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
|
||||
{
|
||||
struct nand_chip *this = mtd->priv;
|
||||
unsigned long mask;
|
||||
|
||||
if (cmd == NAND_CMD_NONE)
|
||||
return;
|
||||
|
||||
mask = (ctrl & NAND_CLE) ? 0x02 : 0;
|
||||
if (ctrl & NAND_ALE)
|
||||
mask |= 0x04;
|
||||
writeb(cmd, (unsigned long)this->IO_ADDR_W | mask);
|
||||
}
|
||||
|
||||
#define FSAMPLE_NAND_RB_GPIO_PIN 62
|
||||
|
||||
static int nand_dev_ready(struct mtd_info *mtd)
|
||||
{
|
||||
return gpio_get_value(FSAMPLE_NAND_RB_GPIO_PIN);
|
||||
}
|
||||
|
||||
static const char *part_probes[] = { "cmdlinepart", NULL };
|
||||
|
||||
static struct platform_nand_data nand_data = {
|
||||
.chip = {
|
||||
.nr_chips = 1,
|
||||
.chip_offset = 0,
|
||||
.options = NAND_SAMSUNG_LP_OPTIONS,
|
||||
.part_probe_types = part_probes,
|
||||
},
|
||||
.ctrl = {
|
||||
.cmd_ctrl = nand_cmd_ctl,
|
||||
.dev_ready = nand_dev_ready,
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource nand_resource = {
|
||||
@ -178,7 +216,7 @@ static struct resource nand_resource = {
|
||||
};
|
||||
|
||||
static struct platform_device nand_device = {
|
||||
.name = "omapnand",
|
||||
.name = "gen_nand",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &nand_data,
|
||||
@ -190,6 +228,9 @@ static struct platform_device nand_device = {
|
||||
static struct platform_device smc91x_device = {
|
||||
.name = "smc91x",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &smc91x_info,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(smc91x_resources),
|
||||
.resource = smc91x_resources,
|
||||
};
|
||||
@ -233,13 +274,6 @@ static struct platform_device *devices[] __initdata = {
|
||||
&lcd_device,
|
||||
};
|
||||
|
||||
#define P2_NAND_RB_GPIO_PIN 62
|
||||
|
||||
static int nand_dev_ready(struct omap_nand_platform_data *data)
|
||||
{
|
||||
return gpio_get_value(P2_NAND_RB_GPIO_PIN);
|
||||
}
|
||||
|
||||
static struct omap_lcd_config fsample_lcd_config __initdata = {
|
||||
.ctrl_name = "internal",
|
||||
};
|
||||
@ -250,9 +284,9 @@ static struct omap_board_config_kernel fsample_config[] = {
|
||||
|
||||
static void __init omap_fsample_init(void)
|
||||
{
|
||||
if (gpio_request(P2_NAND_RB_GPIO_PIN, "NAND ready") < 0)
|
||||
if (gpio_request(FSAMPLE_NAND_RB_GPIO_PIN, "NAND ready") < 0)
|
||||
BUG();
|
||||
nand_data.dev_ready = nand_dev_ready;
|
||||
gpio_direction_input(FSAMPLE_NAND_RB_GPIO_PIN);
|
||||
|
||||
omap_cfg_reg(L3_1610_FLASH_CS2B_OE);
|
||||
omap_cfg_reg(M8_1610_FLASH_CS2B_WE);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user