Merge commit 'v2.6.29' into core/header-fixes
This commit is contained in:
Коммит
5a54bd1307
4
.mailmap
4
.mailmap
|
@ -92,6 +92,7 @@ Rudolf Marek <R.Marek@sh.cvut.cz>
|
||||||
Rui Saraiva <rmps@joel.ist.utl.pt>
|
Rui Saraiva <rmps@joel.ist.utl.pt>
|
||||||
Sachin P Sant <ssant@in.ibm.com>
|
Sachin P Sant <ssant@in.ibm.com>
|
||||||
Sam Ravnborg <sam@mars.ravnborg.org>
|
Sam Ravnborg <sam@mars.ravnborg.org>
|
||||||
|
Sascha Hauer <s.hauer@pengutronix.de>
|
||||||
S.Çağlar Onur <caglar@pardus.org.tr>
|
S.Çağlar Onur <caglar@pardus.org.tr>
|
||||||
Simon Kelley <simon@thekelleys.org.uk>
|
Simon Kelley <simon@thekelleys.org.uk>
|
||||||
Stéphane Witzmann <stephane.witzmann@ubpmes.univ-bpclermont.fr>
|
Stéphane Witzmann <stephane.witzmann@ubpmes.univ-bpclermont.fr>
|
||||||
|
@ -100,6 +101,7 @@ Tejun Heo <htejun@gmail.com>
|
||||||
Thomas Graf <tgraf@suug.ch>
|
Thomas Graf <tgraf@suug.ch>
|
||||||
Tony Luck <tony.luck@intel.com>
|
Tony Luck <tony.luck@intel.com>
|
||||||
Tsuneo Yoshioka <Tsuneo.Yoshioka@f-secure.com>
|
Tsuneo Yoshioka <Tsuneo.Yoshioka@f-secure.com>
|
||||||
Uwe Kleine-König <Uwe.Kleine-Koenig@digi.com>
|
|
||||||
Uwe Kleine-König <ukleinek@informatik.uni-freiburg.de>
|
Uwe Kleine-König <ukleinek@informatik.uni-freiburg.de>
|
||||||
|
Uwe Kleine-König <ukl@pengutronix.de>
|
||||||
|
Uwe Kleine-König <Uwe.Kleine-Koenig@digi.com>
|
||||||
Valdis Kletnieks <Valdis.Kletnieks@vt.edu>
|
Valdis Kletnieks <Valdis.Kletnieks@vt.edu>
|
||||||
|
|
3
CREDITS
3
CREDITS
|
@ -2166,7 +2166,6 @@ D: Initial implementation of VC's, pty's and select()
|
||||||
|
|
||||||
N: Pavel Machek
|
N: Pavel Machek
|
||||||
E: pavel@ucw.cz
|
E: pavel@ucw.cz
|
||||||
E: pavel@suse.cz
|
|
||||||
D: Softcursor for vga, hypertech cdrom support, vcsa bugfix, nbd
|
D: Softcursor for vga, hypertech cdrom support, vcsa bugfix, nbd
|
||||||
D: sun4/330 port, capabilities for elf, speedup for rm on ext2, USB,
|
D: sun4/330 port, capabilities for elf, speedup for rm on ext2, USB,
|
||||||
D: work on suspend-to-ram/disk, killing duplicates from ioctl32
|
D: work on suspend-to-ram/disk, killing duplicates from ioctl32
|
||||||
|
@ -3739,7 +3738,7 @@ S: 93149 Nittenau
|
||||||
S: Germany
|
S: Germany
|
||||||
|
|
||||||
N: Gertjan van Wingerde
|
N: Gertjan van Wingerde
|
||||||
E: gwingerde@home.nl
|
E: gwingerde@gmail.com
|
||||||
D: Ralink rt2x00 WLAN driver
|
D: Ralink rt2x00 WLAN driver
|
||||||
D: Minix V2 file-system
|
D: Minix V2 file-system
|
||||||
D: Misc fixes
|
D: Misc fixes
|
||||||
|
|
|
@ -1,3 +1,46 @@
|
||||||
|
What: /sys/bus/pci/drivers/.../bind
|
||||||
|
Date: December 2003
|
||||||
|
Contact: linux-pci@vger.kernel.org
|
||||||
|
Description:
|
||||||
|
Writing a device location to this file will cause
|
||||||
|
the driver to attempt to bind to the device found at
|
||||||
|
this location. This is useful for overriding default
|
||||||
|
bindings. The format for the location is: DDDD:BB:DD.F.
|
||||||
|
That is Domain:Bus:Device.Function and is the same as
|
||||||
|
found in /sys/bus/pci/devices/. For example:
|
||||||
|
# echo 0000:00:19.0 > /sys/bus/pci/drivers/foo/bind
|
||||||
|
(Note: kernels before 2.6.28 may require echo -n).
|
||||||
|
|
||||||
|
What: /sys/bus/pci/drivers/.../unbind
|
||||||
|
Date: December 2003
|
||||||
|
Contact: linux-pci@vger.kernel.org
|
||||||
|
Description:
|
||||||
|
Writing a device location to this file will cause the
|
||||||
|
driver to attempt to unbind from the device found at
|
||||||
|
this location. This may be useful when overriding default
|
||||||
|
bindings. The format for the location is: DDDD:BB:DD.F.
|
||||||
|
That is Domain:Bus:Device.Function and is the same as
|
||||||
|
found in /sys/bus/pci/devices/. For example:
|
||||||
|
# echo 0000:00:19.0 > /sys/bus/pci/drivers/foo/unbind
|
||||||
|
(Note: kernels before 2.6.28 may require echo -n).
|
||||||
|
|
||||||
|
What: /sys/bus/pci/drivers/.../new_id
|
||||||
|
Date: December 2003
|
||||||
|
Contact: linux-pci@vger.kernel.org
|
||||||
|
Description:
|
||||||
|
Writing a device ID to this file will attempt to
|
||||||
|
dynamically add a new device ID to a PCI device driver.
|
||||||
|
This may allow the driver to support more hardware than
|
||||||
|
was included in the driver's static device ID support
|
||||||
|
table at compile time. The format for the device ID is:
|
||||||
|
VVVV DDDD SVVV SDDD CCCC MMMM PPPP. That is Vendor ID,
|
||||||
|
Device ID, Subsystem Vendor ID, Subsystem Device ID,
|
||||||
|
Class, Class Mask, and Private Driver Data. The Vendor ID
|
||||||
|
and Device ID fields are required, the rest are optional.
|
||||||
|
Upon successfully adding an ID, the driver will probe
|
||||||
|
for the device and attempt to bind to it. For example:
|
||||||
|
# echo "8086 10f5" > /sys/bus/pci/drivers/foo/new_id
|
||||||
|
|
||||||
What: /sys/bus/pci/devices/.../vpd
|
What: /sys/bus/pci/devices/.../vpd
|
||||||
Date: February 2008
|
Date: February 2008
|
||||||
Contact: Ben Hutchings <bhutchings@solarflare.com>
|
Contact: Ben Hutchings <bhutchings@solarflare.com>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
What: /sys/firmware/memmap/
|
What: /sys/firmware/memmap/
|
||||||
Date: June 2008
|
Date: June 2008
|
||||||
Contact: Bernhard Walle <bwalle@suse.de>
|
Contact: Bernhard Walle <bernhard.walle@gmx.de>
|
||||||
Description:
|
Description:
|
||||||
On all platforms, the firmware provides a memory map which the
|
On all platforms, the firmware provides a memory map which the
|
||||||
kernel reads. The resources from that memory map are registered
|
kernel reads. The resources from that memory map are registered
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
# To add a new book the only step required is to add the book to the
|
# To add a new book the only step required is to add the book to the
|
||||||
# list of DOCBOOKS.
|
# list of DOCBOOKS.
|
||||||
|
|
||||||
DOCBOOKS := z8530book.xml mcabook.xml \
|
DOCBOOKS := z8530book.xml mcabook.xml device-drivers.xml \
|
||||||
kernel-hacking.xml kernel-locking.xml deviceiobook.xml \
|
kernel-hacking.xml kernel-locking.xml deviceiobook.xml \
|
||||||
procfs-guide.xml writing_usb_driver.xml networking.xml \
|
procfs-guide.xml writing_usb_driver.xml networking.xml \
|
||||||
kernel-api.xml filesystems.xml lsm.xml usb.xml kgdb.xml \
|
kernel-api.xml filesystems.xml lsm.xml usb.xml kgdb.xml \
|
||||||
|
|
|
@ -0,0 +1,418 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
|
||||||
|
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []>
|
||||||
|
|
||||||
|
<book id="LinuxDriversAPI">
|
||||||
|
<bookinfo>
|
||||||
|
<title>Linux Device Drivers</title>
|
||||||
|
|
||||||
|
<legalnotice>
|
||||||
|
<para>
|
||||||
|
This documentation 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.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
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.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
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
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
For more details see the file COPYING in the source
|
||||||
|
distribution of Linux.
|
||||||
|
</para>
|
||||||
|
</legalnotice>
|
||||||
|
</bookinfo>
|
||||||
|
|
||||||
|
<toc></toc>
|
||||||
|
|
||||||
|
<chapter id="Basics">
|
||||||
|
<title>Driver Basics</title>
|
||||||
|
<sect1><title>Driver Entry and Exit points</title>
|
||||||
|
!Iinclude/linux/init.h
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1><title>Atomic and pointer manipulation</title>
|
||||||
|
!Iarch/x86/include/asm/atomic_32.h
|
||||||
|
!Iarch/x86/include/asm/unaligned.h
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1><title>Delaying, scheduling, and timer routines</title>
|
||||||
|
!Iinclude/linux/sched.h
|
||||||
|
!Ekernel/sched.c
|
||||||
|
!Ekernel/timer.c
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>High-resolution timers</title>
|
||||||
|
!Iinclude/linux/ktime.h
|
||||||
|
!Iinclude/linux/hrtimer.h
|
||||||
|
!Ekernel/hrtimer.c
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>Workqueues and Kevents</title>
|
||||||
|
!Ekernel/workqueue.c
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>Internal Functions</title>
|
||||||
|
!Ikernel/exit.c
|
||||||
|
!Ikernel/signal.c
|
||||||
|
!Iinclude/linux/kthread.h
|
||||||
|
!Ekernel/kthread.c
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1><title>Kernel objects manipulation</title>
|
||||||
|
<!--
|
||||||
|
X!Iinclude/linux/kobject.h
|
||||||
|
-->
|
||||||
|
!Elib/kobject.c
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1><title>Kernel utility functions</title>
|
||||||
|
!Iinclude/linux/kernel.h
|
||||||
|
!Ekernel/printk.c
|
||||||
|
!Ekernel/panic.c
|
||||||
|
!Ekernel/sys.c
|
||||||
|
!Ekernel/rcupdate.c
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1><title>Device Resource Management</title>
|
||||||
|
!Edrivers/base/devres.c
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="devdrivers">
|
||||||
|
<title>Device drivers infrastructure</title>
|
||||||
|
<sect1><title>Device Drivers Base</title>
|
||||||
|
<!--
|
||||||
|
X!Iinclude/linux/device.h
|
||||||
|
-->
|
||||||
|
!Edrivers/base/driver.c
|
||||||
|
!Edrivers/base/core.c
|
||||||
|
!Edrivers/base/class.c
|
||||||
|
!Edrivers/base/firmware_class.c
|
||||||
|
!Edrivers/base/transport_class.c
|
||||||
|
<!-- Cannot be included, because
|
||||||
|
attribute_container_add_class_device_adapter
|
||||||
|
and attribute_container_classdev_to_container
|
||||||
|
exceed allowed 44 characters maximum
|
||||||
|
X!Edrivers/base/attribute_container.c
|
||||||
|
-->
|
||||||
|
!Edrivers/base/sys.c
|
||||||
|
<!--
|
||||||
|
X!Edrivers/base/interface.c
|
||||||
|
-->
|
||||||
|
!Edrivers/base/platform.c
|
||||||
|
!Edrivers/base/bus.c
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>Device Drivers Power Management</title>
|
||||||
|
!Edrivers/base/power/main.c
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>Device Drivers ACPI Support</title>
|
||||||
|
<!-- Internal functions only
|
||||||
|
X!Edrivers/acpi/sleep/main.c
|
||||||
|
X!Edrivers/acpi/sleep/wakeup.c
|
||||||
|
X!Edrivers/acpi/motherboard.c
|
||||||
|
X!Edrivers/acpi/bus.c
|
||||||
|
-->
|
||||||
|
!Edrivers/acpi/scan.c
|
||||||
|
!Idrivers/acpi/scan.c
|
||||||
|
<!-- No correct structured comments
|
||||||
|
X!Edrivers/acpi/pci_bind.c
|
||||||
|
-->
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>Device drivers PnP support</title>
|
||||||
|
!Idrivers/pnp/core.c
|
||||||
|
<!-- No correct structured comments
|
||||||
|
X!Edrivers/pnp/system.c
|
||||||
|
-->
|
||||||
|
!Edrivers/pnp/card.c
|
||||||
|
!Idrivers/pnp/driver.c
|
||||||
|
!Edrivers/pnp/manager.c
|
||||||
|
!Edrivers/pnp/support.c
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>Userspace IO devices</title>
|
||||||
|
!Edrivers/uio/uio.c
|
||||||
|
!Iinclude/linux/uio_driver.h
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="parportdev">
|
||||||
|
<title>Parallel Port Devices</title>
|
||||||
|
!Iinclude/linux/parport.h
|
||||||
|
!Edrivers/parport/ieee1284.c
|
||||||
|
!Edrivers/parport/share.c
|
||||||
|
!Idrivers/parport/daisy.c
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="message_devices">
|
||||||
|
<title>Message-based devices</title>
|
||||||
|
<sect1><title>Fusion message devices</title>
|
||||||
|
!Edrivers/message/fusion/mptbase.c
|
||||||
|
!Idrivers/message/fusion/mptbase.c
|
||||||
|
!Edrivers/message/fusion/mptscsih.c
|
||||||
|
!Idrivers/message/fusion/mptscsih.c
|
||||||
|
!Idrivers/message/fusion/mptctl.c
|
||||||
|
!Idrivers/message/fusion/mptspi.c
|
||||||
|
!Idrivers/message/fusion/mptfc.c
|
||||||
|
!Idrivers/message/fusion/mptlan.c
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>I2O message devices</title>
|
||||||
|
!Iinclude/linux/i2o.h
|
||||||
|
!Idrivers/message/i2o/core.h
|
||||||
|
!Edrivers/message/i2o/iop.c
|
||||||
|
!Idrivers/message/i2o/iop.c
|
||||||
|
!Idrivers/message/i2o/config-osm.c
|
||||||
|
!Edrivers/message/i2o/exec-osm.c
|
||||||
|
!Idrivers/message/i2o/exec-osm.c
|
||||||
|
!Idrivers/message/i2o/bus-osm.c
|
||||||
|
!Edrivers/message/i2o/device.c
|
||||||
|
!Idrivers/message/i2o/device.c
|
||||||
|
!Idrivers/message/i2o/driver.c
|
||||||
|
!Idrivers/message/i2o/pci.c
|
||||||
|
!Idrivers/message/i2o/i2o_block.c
|
||||||
|
!Idrivers/message/i2o/i2o_scsi.c
|
||||||
|
!Idrivers/message/i2o/i2o_proc.c
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="snddev">
|
||||||
|
<title>Sound Devices</title>
|
||||||
|
!Iinclude/sound/core.h
|
||||||
|
!Esound/sound_core.c
|
||||||
|
!Iinclude/sound/pcm.h
|
||||||
|
!Esound/core/pcm.c
|
||||||
|
!Esound/core/device.c
|
||||||
|
!Esound/core/info.c
|
||||||
|
!Esound/core/rawmidi.c
|
||||||
|
!Esound/core/sound.c
|
||||||
|
!Esound/core/memory.c
|
||||||
|
!Esound/core/pcm_memory.c
|
||||||
|
!Esound/core/init.c
|
||||||
|
!Esound/core/isadma.c
|
||||||
|
!Esound/core/control.c
|
||||||
|
!Esound/core/pcm_lib.c
|
||||||
|
!Esound/core/hwdep.c
|
||||||
|
!Esound/core/pcm_native.c
|
||||||
|
!Esound/core/memalloc.c
|
||||||
|
<!-- FIXME: Removed for now since no structured comments in source
|
||||||
|
X!Isound/sound_firmware.c
|
||||||
|
-->
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="uart16x50">
|
||||||
|
<title>16x50 UART Driver</title>
|
||||||
|
!Iinclude/linux/serial_core.h
|
||||||
|
!Edrivers/serial/serial_core.c
|
||||||
|
!Edrivers/serial/8250.c
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="fbdev">
|
||||||
|
<title>Frame Buffer Library</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The frame buffer drivers depend heavily on four data structures.
|
||||||
|
These structures are declared in include/linux/fb.h. They are
|
||||||
|
fb_info, fb_var_screeninfo, fb_fix_screeninfo and fb_monospecs.
|
||||||
|
The last three can be made available to and from userland.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
fb_info defines the current state of a particular video card.
|
||||||
|
Inside fb_info, there exists a fb_ops structure which is a
|
||||||
|
collection of needed functions to make fbdev and fbcon work.
|
||||||
|
fb_info is only visible to the kernel.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
fb_var_screeninfo is used to describe the features of a video card
|
||||||
|
that are user defined. With fb_var_screeninfo, things such as
|
||||||
|
depth and the resolution may be defined.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The next structure is fb_fix_screeninfo. This defines the
|
||||||
|
properties of a card that are created when a mode is set and can't
|
||||||
|
be changed otherwise. A good example of this is the start of the
|
||||||
|
frame buffer memory. This "locks" the address of the frame buffer
|
||||||
|
memory, so that it cannot be changed or moved.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The last structure is fb_monospecs. In the old API, there was
|
||||||
|
little importance for fb_monospecs. This allowed for forbidden things
|
||||||
|
such as setting a mode of 800x600 on a fix frequency monitor. With
|
||||||
|
the new API, fb_monospecs prevents such things, and if used
|
||||||
|
correctly, can prevent a monitor from being cooked. fb_monospecs
|
||||||
|
will not be useful until kernels 2.5.x.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<sect1><title>Frame Buffer Memory</title>
|
||||||
|
!Edrivers/video/fbmem.c
|
||||||
|
</sect1>
|
||||||
|
<!--
|
||||||
|
<sect1><title>Frame Buffer Console</title>
|
||||||
|
X!Edrivers/video/console/fbcon.c
|
||||||
|
</sect1>
|
||||||
|
-->
|
||||||
|
<sect1><title>Frame Buffer Colormap</title>
|
||||||
|
!Edrivers/video/fbcmap.c
|
||||||
|
</sect1>
|
||||||
|
<!-- FIXME:
|
||||||
|
drivers/video/fbgen.c has no docs, which stuffs up the sgml. Comment
|
||||||
|
out until somebody adds docs. KAO
|
||||||
|
<sect1><title>Frame Buffer Generic Functions</title>
|
||||||
|
X!Idrivers/video/fbgen.c
|
||||||
|
</sect1>
|
||||||
|
KAO -->
|
||||||
|
<sect1><title>Frame Buffer Video Mode Database</title>
|
||||||
|
!Idrivers/video/modedb.c
|
||||||
|
!Edrivers/video/modedb.c
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>Frame Buffer Macintosh Video Mode Database</title>
|
||||||
|
!Edrivers/video/macmodes.c
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>Frame Buffer Fonts</title>
|
||||||
|
<para>
|
||||||
|
Refer to the file drivers/video/console/fonts.c for more information.
|
||||||
|
</para>
|
||||||
|
<!-- FIXME: Removed for now since no structured comments in source
|
||||||
|
X!Idrivers/video/console/fonts.c
|
||||||
|
-->
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="input_subsystem">
|
||||||
|
<title>Input Subsystem</title>
|
||||||
|
!Iinclude/linux/input.h
|
||||||
|
!Edrivers/input/input.c
|
||||||
|
!Edrivers/input/ff-core.c
|
||||||
|
!Edrivers/input/ff-memless.c
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="spi">
|
||||||
|
<title>Serial Peripheral Interface (SPI)</title>
|
||||||
|
<para>
|
||||||
|
SPI is the "Serial Peripheral Interface", widely used with
|
||||||
|
embedded systems because it is a simple and efficient
|
||||||
|
interface: basically a multiplexed shift register.
|
||||||
|
Its three signal wires hold a clock (SCK, often in the range
|
||||||
|
of 1-20 MHz), a "Master Out, Slave In" (MOSI) data line, and
|
||||||
|
a "Master In, Slave Out" (MISO) data line.
|
||||||
|
SPI is a full duplex protocol; for each bit shifted out the
|
||||||
|
MOSI line (one per clock) another is shifted in on the MISO line.
|
||||||
|
Those bits are assembled into words of various sizes on the
|
||||||
|
way to and from system memory.
|
||||||
|
An additional chipselect line is usually active-low (nCS);
|
||||||
|
four signals are normally used for each peripheral, plus
|
||||||
|
sometimes an interrupt.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
The SPI bus facilities listed here provide a generalized
|
||||||
|
interface to declare SPI busses and devices, manage them
|
||||||
|
according to the standard Linux driver model, and perform
|
||||||
|
input/output operations.
|
||||||
|
At this time, only "master" side interfaces are supported,
|
||||||
|
where Linux talks to SPI peripherals and does not implement
|
||||||
|
such a peripheral itself.
|
||||||
|
(Interfaces to support implementing SPI slaves would
|
||||||
|
necessarily look different.)
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
The programming interface is structured around two kinds of driver,
|
||||||
|
and two kinds of device.
|
||||||
|
A "Controller Driver" abstracts the controller hardware, which may
|
||||||
|
be as simple as a set of GPIO pins or as complex as a pair of FIFOs
|
||||||
|
connected to dual DMA engines on the other side of the SPI shift
|
||||||
|
register (maximizing throughput). Such drivers bridge between
|
||||||
|
whatever bus they sit on (often the platform bus) and SPI, and
|
||||||
|
expose the SPI side of their device as a
|
||||||
|
<structname>struct spi_master</structname>.
|
||||||
|
SPI devices are children of that master, represented as a
|
||||||
|
<structname>struct spi_device</structname> and manufactured from
|
||||||
|
<structname>struct spi_board_info</structname> descriptors which
|
||||||
|
are usually provided by board-specific initialization code.
|
||||||
|
A <structname>struct spi_driver</structname> is called a
|
||||||
|
"Protocol Driver", and is bound to a spi_device using normal
|
||||||
|
driver model calls.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
The I/O model is a set of queued messages. Protocol drivers
|
||||||
|
submit one or more <structname>struct spi_message</structname>
|
||||||
|
objects, which are processed and completed asynchronously.
|
||||||
|
(There are synchronous wrappers, however.) Messages are
|
||||||
|
built from one or more <structname>struct spi_transfer</structname>
|
||||||
|
objects, each of which wraps a full duplex SPI transfer.
|
||||||
|
A variety of protocol tweaking options are needed, because
|
||||||
|
different chips adopt very different policies for how they
|
||||||
|
use the bits transferred with SPI.
|
||||||
|
</para>
|
||||||
|
!Iinclude/linux/spi/spi.h
|
||||||
|
!Fdrivers/spi/spi.c spi_register_board_info
|
||||||
|
!Edrivers/spi/spi.c
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="i2c">
|
||||||
|
<title>I<superscript>2</superscript>C and SMBus Subsystem</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
I<superscript>2</superscript>C (or without fancy typography, "I2C")
|
||||||
|
is an acronym for the "Inter-IC" bus, a simple bus protocol which is
|
||||||
|
widely used where low data rate communications suffice.
|
||||||
|
Since it's also a licensed trademark, some vendors use another
|
||||||
|
name (such as "Two-Wire Interface", TWI) for the same bus.
|
||||||
|
I2C only needs two signals (SCL for clock, SDA for data), conserving
|
||||||
|
board real estate and minimizing signal quality issues.
|
||||||
|
Most I2C devices use seven bit addresses, and bus speeds of up
|
||||||
|
to 400 kHz; there's a high speed extension (3.4 MHz) that's not yet
|
||||||
|
found wide use.
|
||||||
|
I2C is a multi-master bus; open drain signaling is used to
|
||||||
|
arbitrate between masters, as well as to handshake and to
|
||||||
|
synchronize clocks from slower clients.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The Linux I2C programming interfaces support only the master
|
||||||
|
side of bus interactions, not the slave side.
|
||||||
|
The programming interface is structured around two kinds of driver,
|
||||||
|
and two kinds of device.
|
||||||
|
An I2C "Adapter Driver" abstracts the controller hardware; it binds
|
||||||
|
to a physical device (perhaps a PCI device or platform_device) and
|
||||||
|
exposes a <structname>struct i2c_adapter</structname> representing
|
||||||
|
each I2C bus segment it manages.
|
||||||
|
On each I2C bus segment will be I2C devices represented by a
|
||||||
|
<structname>struct i2c_client</structname>. Those devices will
|
||||||
|
be bound to a <structname>struct i2c_driver</structname>,
|
||||||
|
which should follow the standard Linux driver model.
|
||||||
|
(At this writing, a legacy model is more widely used.)
|
||||||
|
There are functions to perform various I2C protocol operations; at
|
||||||
|
this writing all such functions are usable only from task context.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The System Management Bus (SMBus) is a sibling protocol. Most SMBus
|
||||||
|
systems are also I2C conformant. The electrical constraints are
|
||||||
|
tighter for SMBus, and it standardizes particular protocol messages
|
||||||
|
and idioms. Controllers that support I2C can also support most
|
||||||
|
SMBus operations, but SMBus controllers don't support all the protocol
|
||||||
|
options that an I2C controller will.
|
||||||
|
There are functions to perform various SMBus protocol operations,
|
||||||
|
either using I2C primitives or by issuing SMBus commands to
|
||||||
|
i2c_adapter devices which don't support those I2C operations.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
!Iinclude/linux/i2c.h
|
||||||
|
!Fdrivers/i2c/i2c-boardinfo.c i2c_register_board_info
|
||||||
|
!Edrivers/i2c/i2c-core.c
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
</book>
|
|
@ -38,58 +38,6 @@
|
||||||
|
|
||||||
<toc></toc>
|
<toc></toc>
|
||||||
|
|
||||||
<chapter id="Basics">
|
|
||||||
<title>Driver Basics</title>
|
|
||||||
<sect1><title>Driver Entry and Exit points</title>
|
|
||||||
!Iinclude/linux/init.h
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Atomic and pointer manipulation</title>
|
|
||||||
!Iarch/x86/include/asm/atomic_32.h
|
|
||||||
!Iarch/x86/include/asm/unaligned.h
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Delaying, scheduling, and timer routines</title>
|
|
||||||
!Iinclude/linux/sched.h
|
|
||||||
!Ekernel/sched.c
|
|
||||||
!Ekernel/timer.c
|
|
||||||
</sect1>
|
|
||||||
<sect1><title>High-resolution timers</title>
|
|
||||||
!Iinclude/linux/ktime.h
|
|
||||||
!Iinclude/linux/hrtimer.h
|
|
||||||
!Ekernel/hrtimer.c
|
|
||||||
</sect1>
|
|
||||||
<sect1><title>Workqueues and Kevents</title>
|
|
||||||
!Ekernel/workqueue.c
|
|
||||||
</sect1>
|
|
||||||
<sect1><title>Internal Functions</title>
|
|
||||||
!Ikernel/exit.c
|
|
||||||
!Ikernel/signal.c
|
|
||||||
!Iinclude/linux/kthread.h
|
|
||||||
!Ekernel/kthread.c
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Kernel objects manipulation</title>
|
|
||||||
<!--
|
|
||||||
X!Iinclude/linux/kobject.h
|
|
||||||
-->
|
|
||||||
!Elib/kobject.c
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Kernel utility functions</title>
|
|
||||||
!Iinclude/linux/kernel.h
|
|
||||||
!Ekernel/printk.c
|
|
||||||
!Ekernel/panic.c
|
|
||||||
!Ekernel/sys.c
|
|
||||||
!Ekernel/rcupdate.c
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Device Resource Management</title>
|
|
||||||
!Edrivers/base/devres.c
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="adt">
|
<chapter id="adt">
|
||||||
<title>Data Types</title>
|
<title>Data Types</title>
|
||||||
<sect1><title>Doubly Linked Lists</title>
|
<sect1><title>Doubly Linked Lists</title>
|
||||||
|
@ -298,62 +246,6 @@ X!Earch/x86/kernel/mca_32.c
|
||||||
!Ikernel/acct.c
|
!Ikernel/acct.c
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
<chapter id="devdrivers">
|
|
||||||
<title>Device drivers infrastructure</title>
|
|
||||||
<sect1><title>Device Drivers Base</title>
|
|
||||||
<!--
|
|
||||||
X!Iinclude/linux/device.h
|
|
||||||
-->
|
|
||||||
!Edrivers/base/driver.c
|
|
||||||
!Edrivers/base/core.c
|
|
||||||
!Edrivers/base/class.c
|
|
||||||
!Edrivers/base/firmware_class.c
|
|
||||||
!Edrivers/base/transport_class.c
|
|
||||||
<!-- Cannot be included, because
|
|
||||||
attribute_container_add_class_device_adapter
|
|
||||||
and attribute_container_classdev_to_container
|
|
||||||
exceed allowed 44 characters maximum
|
|
||||||
X!Edrivers/base/attribute_container.c
|
|
||||||
-->
|
|
||||||
!Edrivers/base/sys.c
|
|
||||||
<!--
|
|
||||||
X!Edrivers/base/interface.c
|
|
||||||
-->
|
|
||||||
!Edrivers/base/platform.c
|
|
||||||
!Edrivers/base/bus.c
|
|
||||||
</sect1>
|
|
||||||
<sect1><title>Device Drivers Power Management</title>
|
|
||||||
!Edrivers/base/power/main.c
|
|
||||||
</sect1>
|
|
||||||
<sect1><title>Device Drivers ACPI Support</title>
|
|
||||||
<!-- Internal functions only
|
|
||||||
X!Edrivers/acpi/sleep/main.c
|
|
||||||
X!Edrivers/acpi/sleep/wakeup.c
|
|
||||||
X!Edrivers/acpi/motherboard.c
|
|
||||||
X!Edrivers/acpi/bus.c
|
|
||||||
-->
|
|
||||||
!Edrivers/acpi/scan.c
|
|
||||||
!Idrivers/acpi/scan.c
|
|
||||||
<!-- No correct structured comments
|
|
||||||
X!Edrivers/acpi/pci_bind.c
|
|
||||||
-->
|
|
||||||
</sect1>
|
|
||||||
<sect1><title>Device drivers PnP support</title>
|
|
||||||
!Idrivers/pnp/core.c
|
|
||||||
<!-- No correct structured comments
|
|
||||||
X!Edrivers/pnp/system.c
|
|
||||||
-->
|
|
||||||
!Edrivers/pnp/card.c
|
|
||||||
!Idrivers/pnp/driver.c
|
|
||||||
!Edrivers/pnp/manager.c
|
|
||||||
!Edrivers/pnp/support.c
|
|
||||||
</sect1>
|
|
||||||
<sect1><title>Userspace IO devices</title>
|
|
||||||
!Edrivers/uio/uio.c
|
|
||||||
!Iinclude/linux/uio_driver.h
|
|
||||||
</sect1>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="blkdev">
|
<chapter id="blkdev">
|
||||||
<title>Block Devices</title>
|
<title>Block Devices</title>
|
||||||
!Eblock/blk-core.c
|
!Eblock/blk-core.c
|
||||||
|
@ -381,275 +273,6 @@ X!Edrivers/pnp/system.c
|
||||||
!Edrivers/char/misc.c
|
!Edrivers/char/misc.c
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
<chapter id="parportdev">
|
|
||||||
<title>Parallel Port Devices</title>
|
|
||||||
!Iinclude/linux/parport.h
|
|
||||||
!Edrivers/parport/ieee1284.c
|
|
||||||
!Edrivers/parport/share.c
|
|
||||||
!Idrivers/parport/daisy.c
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="message_devices">
|
|
||||||
<title>Message-based devices</title>
|
|
||||||
<sect1><title>Fusion message devices</title>
|
|
||||||
!Edrivers/message/fusion/mptbase.c
|
|
||||||
!Idrivers/message/fusion/mptbase.c
|
|
||||||
!Edrivers/message/fusion/mptscsih.c
|
|
||||||
!Idrivers/message/fusion/mptscsih.c
|
|
||||||
!Idrivers/message/fusion/mptctl.c
|
|
||||||
!Idrivers/message/fusion/mptspi.c
|
|
||||||
!Idrivers/message/fusion/mptfc.c
|
|
||||||
!Idrivers/message/fusion/mptlan.c
|
|
||||||
</sect1>
|
|
||||||
<sect1><title>I2O message devices</title>
|
|
||||||
!Iinclude/linux/i2o.h
|
|
||||||
!Idrivers/message/i2o/core.h
|
|
||||||
!Edrivers/message/i2o/iop.c
|
|
||||||
!Idrivers/message/i2o/iop.c
|
|
||||||
!Idrivers/message/i2o/config-osm.c
|
|
||||||
!Edrivers/message/i2o/exec-osm.c
|
|
||||||
!Idrivers/message/i2o/exec-osm.c
|
|
||||||
!Idrivers/message/i2o/bus-osm.c
|
|
||||||
!Edrivers/message/i2o/device.c
|
|
||||||
!Idrivers/message/i2o/device.c
|
|
||||||
!Idrivers/message/i2o/driver.c
|
|
||||||
!Idrivers/message/i2o/pci.c
|
|
||||||
!Idrivers/message/i2o/i2o_block.c
|
|
||||||
!Idrivers/message/i2o/i2o_scsi.c
|
|
||||||
!Idrivers/message/i2o/i2o_proc.c
|
|
||||||
</sect1>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="snddev">
|
|
||||||
<title>Sound Devices</title>
|
|
||||||
!Iinclude/sound/core.h
|
|
||||||
!Esound/sound_core.c
|
|
||||||
!Iinclude/sound/pcm.h
|
|
||||||
!Esound/core/pcm.c
|
|
||||||
!Esound/core/device.c
|
|
||||||
!Esound/core/info.c
|
|
||||||
!Esound/core/rawmidi.c
|
|
||||||
!Esound/core/sound.c
|
|
||||||
!Esound/core/memory.c
|
|
||||||
!Esound/core/pcm_memory.c
|
|
||||||
!Esound/core/init.c
|
|
||||||
!Esound/core/isadma.c
|
|
||||||
!Esound/core/control.c
|
|
||||||
!Esound/core/pcm_lib.c
|
|
||||||
!Esound/core/hwdep.c
|
|
||||||
!Esound/core/pcm_native.c
|
|
||||||
!Esound/core/memalloc.c
|
|
||||||
<!-- FIXME: Removed for now since no structured comments in source
|
|
||||||
X!Isound/sound_firmware.c
|
|
||||||
-->
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="uart16x50">
|
|
||||||
<title>16x50 UART Driver</title>
|
|
||||||
!Iinclude/linux/serial_core.h
|
|
||||||
!Edrivers/serial/serial_core.c
|
|
||||||
!Edrivers/serial/8250.c
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="fbdev">
|
|
||||||
<title>Frame Buffer Library</title>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The frame buffer drivers depend heavily on four data structures.
|
|
||||||
These structures are declared in include/linux/fb.h. They are
|
|
||||||
fb_info, fb_var_screeninfo, fb_fix_screeninfo and fb_monospecs.
|
|
||||||
The last three can be made available to and from userland.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
fb_info defines the current state of a particular video card.
|
|
||||||
Inside fb_info, there exists a fb_ops structure which is a
|
|
||||||
collection of needed functions to make fbdev and fbcon work.
|
|
||||||
fb_info is only visible to the kernel.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
fb_var_screeninfo is used to describe the features of a video card
|
|
||||||
that are user defined. With fb_var_screeninfo, things such as
|
|
||||||
depth and the resolution may be defined.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The next structure is fb_fix_screeninfo. This defines the
|
|
||||||
properties of a card that are created when a mode is set and can't
|
|
||||||
be changed otherwise. A good example of this is the start of the
|
|
||||||
frame buffer memory. This "locks" the address of the frame buffer
|
|
||||||
memory, so that it cannot be changed or moved.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The last structure is fb_monospecs. In the old API, there was
|
|
||||||
little importance for fb_monospecs. This allowed for forbidden things
|
|
||||||
such as setting a mode of 800x600 on a fix frequency monitor. With
|
|
||||||
the new API, fb_monospecs prevents such things, and if used
|
|
||||||
correctly, can prevent a monitor from being cooked. fb_monospecs
|
|
||||||
will not be useful until kernels 2.5.x.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<sect1><title>Frame Buffer Memory</title>
|
|
||||||
!Edrivers/video/fbmem.c
|
|
||||||
</sect1>
|
|
||||||
<!--
|
|
||||||
<sect1><title>Frame Buffer Console</title>
|
|
||||||
X!Edrivers/video/console/fbcon.c
|
|
||||||
</sect1>
|
|
||||||
-->
|
|
||||||
<sect1><title>Frame Buffer Colormap</title>
|
|
||||||
!Edrivers/video/fbcmap.c
|
|
||||||
</sect1>
|
|
||||||
<!-- FIXME:
|
|
||||||
drivers/video/fbgen.c has no docs, which stuffs up the sgml. Comment
|
|
||||||
out until somebody adds docs. KAO
|
|
||||||
<sect1><title>Frame Buffer Generic Functions</title>
|
|
||||||
X!Idrivers/video/fbgen.c
|
|
||||||
</sect1>
|
|
||||||
KAO -->
|
|
||||||
<sect1><title>Frame Buffer Video Mode Database</title>
|
|
||||||
!Idrivers/video/modedb.c
|
|
||||||
!Edrivers/video/modedb.c
|
|
||||||
</sect1>
|
|
||||||
<sect1><title>Frame Buffer Macintosh Video Mode Database</title>
|
|
||||||
!Edrivers/video/macmodes.c
|
|
||||||
</sect1>
|
|
||||||
<sect1><title>Frame Buffer Fonts</title>
|
|
||||||
<para>
|
|
||||||
Refer to the file drivers/video/console/fonts.c for more information.
|
|
||||||
</para>
|
|
||||||
<!-- FIXME: Removed for now since no structured comments in source
|
|
||||||
X!Idrivers/video/console/fonts.c
|
|
||||||
-->
|
|
||||||
</sect1>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="input_subsystem">
|
|
||||||
<title>Input Subsystem</title>
|
|
||||||
!Iinclude/linux/input.h
|
|
||||||
!Edrivers/input/input.c
|
|
||||||
!Edrivers/input/ff-core.c
|
|
||||||
!Edrivers/input/ff-memless.c
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="spi">
|
|
||||||
<title>Serial Peripheral Interface (SPI)</title>
|
|
||||||
<para>
|
|
||||||
SPI is the "Serial Peripheral Interface", widely used with
|
|
||||||
embedded systems because it is a simple and efficient
|
|
||||||
interface: basically a multiplexed shift register.
|
|
||||||
Its three signal wires hold a clock (SCK, often in the range
|
|
||||||
of 1-20 MHz), a "Master Out, Slave In" (MOSI) data line, and
|
|
||||||
a "Master In, Slave Out" (MISO) data line.
|
|
||||||
SPI is a full duplex protocol; for each bit shifted out the
|
|
||||||
MOSI line (one per clock) another is shifted in on the MISO line.
|
|
||||||
Those bits are assembled into words of various sizes on the
|
|
||||||
way to and from system memory.
|
|
||||||
An additional chipselect line is usually active-low (nCS);
|
|
||||||
four signals are normally used for each peripheral, plus
|
|
||||||
sometimes an interrupt.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
The SPI bus facilities listed here provide a generalized
|
|
||||||
interface to declare SPI busses and devices, manage them
|
|
||||||
according to the standard Linux driver model, and perform
|
|
||||||
input/output operations.
|
|
||||||
At this time, only "master" side interfaces are supported,
|
|
||||||
where Linux talks to SPI peripherals and does not implement
|
|
||||||
such a peripheral itself.
|
|
||||||
(Interfaces to support implementing SPI slaves would
|
|
||||||
necessarily look different.)
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
The programming interface is structured around two kinds of driver,
|
|
||||||
and two kinds of device.
|
|
||||||
A "Controller Driver" abstracts the controller hardware, which may
|
|
||||||
be as simple as a set of GPIO pins or as complex as a pair of FIFOs
|
|
||||||
connected to dual DMA engines on the other side of the SPI shift
|
|
||||||
register (maximizing throughput). Such drivers bridge between
|
|
||||||
whatever bus they sit on (often the platform bus) and SPI, and
|
|
||||||
expose the SPI side of their device as a
|
|
||||||
<structname>struct spi_master</structname>.
|
|
||||||
SPI devices are children of that master, represented as a
|
|
||||||
<structname>struct spi_device</structname> and manufactured from
|
|
||||||
<structname>struct spi_board_info</structname> descriptors which
|
|
||||||
are usually provided by board-specific initialization code.
|
|
||||||
A <structname>struct spi_driver</structname> is called a
|
|
||||||
"Protocol Driver", and is bound to a spi_device using normal
|
|
||||||
driver model calls.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
The I/O model is a set of queued messages. Protocol drivers
|
|
||||||
submit one or more <structname>struct spi_message</structname>
|
|
||||||
objects, which are processed and completed asynchronously.
|
|
||||||
(There are synchronous wrappers, however.) Messages are
|
|
||||||
built from one or more <structname>struct spi_transfer</structname>
|
|
||||||
objects, each of which wraps a full duplex SPI transfer.
|
|
||||||
A variety of protocol tweaking options are needed, because
|
|
||||||
different chips adopt very different policies for how they
|
|
||||||
use the bits transferred with SPI.
|
|
||||||
</para>
|
|
||||||
!Iinclude/linux/spi/spi.h
|
|
||||||
!Fdrivers/spi/spi.c spi_register_board_info
|
|
||||||
!Edrivers/spi/spi.c
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="i2c">
|
|
||||||
<title>I<superscript>2</superscript>C and SMBus Subsystem</title>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
I<superscript>2</superscript>C (or without fancy typography, "I2C")
|
|
||||||
is an acronym for the "Inter-IC" bus, a simple bus protocol which is
|
|
||||||
widely used where low data rate communications suffice.
|
|
||||||
Since it's also a licensed trademark, some vendors use another
|
|
||||||
name (such as "Two-Wire Interface", TWI) for the same bus.
|
|
||||||
I2C only needs two signals (SCL for clock, SDA for data), conserving
|
|
||||||
board real estate and minimizing signal quality issues.
|
|
||||||
Most I2C devices use seven bit addresses, and bus speeds of up
|
|
||||||
to 400 kHz; there's a high speed extension (3.4 MHz) that's not yet
|
|
||||||
found wide use.
|
|
||||||
I2C is a multi-master bus; open drain signaling is used to
|
|
||||||
arbitrate between masters, as well as to handshake and to
|
|
||||||
synchronize clocks from slower clients.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The Linux I2C programming interfaces support only the master
|
|
||||||
side of bus interactions, not the slave side.
|
|
||||||
The programming interface is structured around two kinds of driver,
|
|
||||||
and two kinds of device.
|
|
||||||
An I2C "Adapter Driver" abstracts the controller hardware; it binds
|
|
||||||
to a physical device (perhaps a PCI device or platform_device) and
|
|
||||||
exposes a <structname>struct i2c_adapter</structname> representing
|
|
||||||
each I2C bus segment it manages.
|
|
||||||
On each I2C bus segment will be I2C devices represented by a
|
|
||||||
<structname>struct i2c_client</structname>. Those devices will
|
|
||||||
be bound to a <structname>struct i2c_driver</structname>,
|
|
||||||
which should follow the standard Linux driver model.
|
|
||||||
(At this writing, a legacy model is more widely used.)
|
|
||||||
There are functions to perform various I2C protocol operations; at
|
|
||||||
this writing all such functions are usable only from task context.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The System Management Bus (SMBus) is a sibling protocol. Most SMBus
|
|
||||||
systems are also I2C conformant. The electrical constraints are
|
|
||||||
tighter for SMBus, and it standardizes particular protocol messages
|
|
||||||
and idioms. Controllers that support I2C can also support most
|
|
||||||
SMBus operations, but SMBus controllers don't support all the protocol
|
|
||||||
options that an I2C controller will.
|
|
||||||
There are functions to perform various SMBus protocol operations,
|
|
||||||
either using I2C primitives or by issuing SMBus commands to
|
|
||||||
i2c_adapter devices which don't support those I2C operations.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
!Iinclude/linux/i2c.h
|
|
||||||
!Fdrivers/i2c/i2c-boardinfo.c i2c_register_board_info
|
|
||||||
!Edrivers/i2c/i2c-core.c
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="clk">
|
<chapter id="clk">
|
||||||
<title>Clock Framework</title>
|
<title>Clock Framework</title>
|
||||||
|
|
||||||
|
|
|
@ -93,7 +93,7 @@ the PCI Express Port Bus driver from loading a service driver.
|
||||||
|
|
||||||
int pcie_port_service_register(struct pcie_port_service_driver *new)
|
int pcie_port_service_register(struct pcie_port_service_driver *new)
|
||||||
|
|
||||||
This API replaces the Linux Driver Model's pci_module_init API. A
|
This API replaces the Linux Driver Model's pci_register_driver API. A
|
||||||
service driver should always calls pcie_port_service_register at
|
service driver should always calls pcie_port_service_register at
|
||||||
module init. Note that after service driver being loaded, calls
|
module init. Note that after service driver being loaded, calls
|
||||||
such as pci_enable_device(dev) and pci_set_master(dev) are no longer
|
such as pci_enable_device(dev) and pci_set_master(dev) are no longer
|
||||||
|
|
|
@ -298,3 +298,15 @@ over a rather long period of time, but improvements are always welcome!
|
||||||
|
|
||||||
Note that, rcu_assign_pointer() and rcu_dereference() relate to
|
Note that, rcu_assign_pointer() and rcu_dereference() relate to
|
||||||
SRCU just as they do to other forms of RCU.
|
SRCU just as they do to other forms of RCU.
|
||||||
|
|
||||||
|
15. The whole point of call_rcu(), synchronize_rcu(), and friends
|
||||||
|
is to wait until all pre-existing readers have finished before
|
||||||
|
carrying out some otherwise-destructive operation. It is
|
||||||
|
therefore critically important to -first- remove any path
|
||||||
|
that readers can follow that could be affected by the
|
||||||
|
destructive operation, and -only- -then- invoke call_rcu(),
|
||||||
|
synchronize_rcu(), or friends.
|
||||||
|
|
||||||
|
Because these primitives only wait for pre-existing readers,
|
||||||
|
it is the caller's responsibility to guarantee safety to
|
||||||
|
any subsequent readers.
|
||||||
|
|
|
@ -954,14 +954,14 @@ elevator_allow_merge_fn called whenever the block layer determines
|
||||||
results in some sort of conflict internally,
|
results in some sort of conflict internally,
|
||||||
this hook allows it to do that.
|
this hook allows it to do that.
|
||||||
|
|
||||||
elevator_dispatch_fn fills the dispatch queue with ready requests.
|
elevator_dispatch_fn* fills the dispatch queue with ready requests.
|
||||||
I/O schedulers are free to postpone requests by
|
I/O schedulers are free to postpone requests by
|
||||||
not filling the dispatch queue unless @force
|
not filling the dispatch queue unless @force
|
||||||
is non-zero. Once dispatched, I/O schedulers
|
is non-zero. Once dispatched, I/O schedulers
|
||||||
are not allowed to manipulate the requests -
|
are not allowed to manipulate the requests -
|
||||||
they belong to generic dispatch queue.
|
they belong to generic dispatch queue.
|
||||||
|
|
||||||
elevator_add_req_fn called to add a new request into the scheduler
|
elevator_add_req_fn* called to add a new request into the scheduler
|
||||||
|
|
||||||
elevator_queue_empty_fn returns true if the merge queue is empty.
|
elevator_queue_empty_fn returns true if the merge queue is empty.
|
||||||
Drivers shouldn't use this, but rather check
|
Drivers shouldn't use this, but rather check
|
||||||
|
@ -991,7 +991,7 @@ elevator_activate_req_fn Called when device driver first sees a request.
|
||||||
elevator_deactivate_req_fn Called when device driver decides to delay
|
elevator_deactivate_req_fn Called when device driver decides to delay
|
||||||
a request by requeueing it.
|
a request by requeueing it.
|
||||||
|
|
||||||
elevator_init_fn
|
elevator_init_fn*
|
||||||
elevator_exit_fn Allocate and free any elevator specific storage
|
elevator_exit_fn Allocate and free any elevator specific storage
|
||||||
for a queue.
|
for a queue.
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
Queue sysfs files
|
||||||
|
=================
|
||||||
|
|
||||||
|
This text file will detail the queue files that are located in the sysfs tree
|
||||||
|
for each block device. Note that stacked devices typically do not export
|
||||||
|
any settings, since their queue merely functions are a remapping target.
|
||||||
|
These files are the ones found in the /sys/block/xxx/queue/ directory.
|
||||||
|
|
||||||
|
Files denoted with a RO postfix are readonly and the RW postfix means
|
||||||
|
read-write.
|
||||||
|
|
||||||
|
hw_sector_size (RO)
|
||||||
|
-------------------
|
||||||
|
This is the hardware sector size of the device, in bytes.
|
||||||
|
|
||||||
|
max_hw_sectors_kb (RO)
|
||||||
|
----------------------
|
||||||
|
This is the maximum number of kilobytes supported in a single data transfer.
|
||||||
|
|
||||||
|
max_sectors_kb (RW)
|
||||||
|
-------------------
|
||||||
|
This is the maximum number of kilobytes that the block layer will allow
|
||||||
|
for a filesystem request. Must be smaller than or equal to the maximum
|
||||||
|
size allowed by the hardware.
|
||||||
|
|
||||||
|
nomerges (RW)
|
||||||
|
-------------
|
||||||
|
This enables the user to disable the lookup logic involved with IO merging
|
||||||
|
requests in the block layer. Merging may still occur through a direct
|
||||||
|
1-hit cache, since that comes for (almost) free. The IO scheduler will not
|
||||||
|
waste cycles doing tree/hash lookups for merges if nomerges is 1. Defaults
|
||||||
|
to 0, enabling all merges.
|
||||||
|
|
||||||
|
nr_requests (RW)
|
||||||
|
----------------
|
||||||
|
This controls how many requests may be allocated in the block layer for
|
||||||
|
read or write requests. Note that the total allocated number may be twice
|
||||||
|
this amount, since it applies only to reads or writes (not the accumulated
|
||||||
|
sum).
|
||||||
|
|
||||||
|
read_ahead_kb (RW)
|
||||||
|
------------------
|
||||||
|
Maximum number of kilobytes to read-ahead for filesystems on this block
|
||||||
|
device.
|
||||||
|
|
||||||
|
rq_affinity (RW)
|
||||||
|
----------------
|
||||||
|
If this option is enabled, the block layer will migrate request completions
|
||||||
|
to the CPU that originally submitted the request. For some workloads
|
||||||
|
this provides a significant reduction in CPU cycles due to caching effects.
|
||||||
|
|
||||||
|
scheduler (RW)
|
||||||
|
--------------
|
||||||
|
When read, this file will display the current and available IO schedulers
|
||||||
|
for this block device. The currently active IO scheduler will be enclosed
|
||||||
|
in [] brackets. Writing an IO scheduler name to this file will switch
|
||||||
|
control of this block device to that new IO scheduler. Note that writing
|
||||||
|
an IO scheduler name to this file will attempt to load that IO scheduler
|
||||||
|
module, if it isn't already present in the system.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Jens Axboe <jens.axboe@oracle.com>, February 2009
|
|
@ -252,10 +252,8 @@ cgroup file system directories.
|
||||||
When a task is moved from one cgroup to another, it gets a new
|
When a task is moved from one cgroup to another, it gets a new
|
||||||
css_set pointer - if there's an already existing css_set with the
|
css_set pointer - if there's an already existing css_set with the
|
||||||
desired collection of cgroups then that group is reused, else a new
|
desired collection of cgroups then that group is reused, else a new
|
||||||
css_set is allocated. Note that the current implementation uses a
|
css_set is allocated. The appropriate existing css_set is located by
|
||||||
linear search to locate an appropriate existing css_set, so isn't
|
looking into a hash table.
|
||||||
very efficient. A future version will use a hash table for better
|
|
||||||
performance.
|
|
||||||
|
|
||||||
To allow access from a cgroup to the css_sets (and hence tasks)
|
To allow access from a cgroup to the css_sets (and hence tasks)
|
||||||
that comprise it, a set of cg_cgroup_link objects form a lattice;
|
that comprise it, a set of cg_cgroup_link objects form a lattice;
|
||||||
|
|
|
@ -142,7 +142,7 @@ into the rest of the kernel, none in performance critical paths:
|
||||||
- in fork and exit, to attach and detach a task from its cpuset.
|
- in fork and exit, to attach and detach a task from its cpuset.
|
||||||
- in sched_setaffinity, to mask the requested CPUs by what's
|
- in sched_setaffinity, to mask the requested CPUs by what's
|
||||||
allowed in that tasks cpuset.
|
allowed in that tasks cpuset.
|
||||||
- in sched.c migrate_all_tasks(), to keep migrating tasks within
|
- in sched.c migrate_live_tasks(), to keep migrating tasks within
|
||||||
the CPUs allowed by their cpuset, if possible.
|
the CPUs allowed by their cpuset, if possible.
|
||||||
- in the mbind and set_mempolicy system calls, to mask the requested
|
- in the mbind and set_mempolicy system calls, to mask the requested
|
||||||
Memory Nodes by what's allowed in that tasks cpuset.
|
Memory Nodes by what's allowed in that tasks cpuset.
|
||||||
|
@ -175,6 +175,10 @@ files describing that cpuset:
|
||||||
- mem_exclusive flag: is memory placement exclusive?
|
- mem_exclusive flag: is memory placement exclusive?
|
||||||
- mem_hardwall flag: is memory allocation hardwalled
|
- mem_hardwall flag: is memory allocation hardwalled
|
||||||
- memory_pressure: measure of how much paging pressure in cpuset
|
- memory_pressure: measure of how much paging pressure in cpuset
|
||||||
|
- memory_spread_page flag: if set, spread page cache evenly on allowed nodes
|
||||||
|
- memory_spread_slab flag: if set, spread slab cache evenly on allowed nodes
|
||||||
|
- sched_load_balance flag: if set, load balance within CPUs on that cpuset
|
||||||
|
- sched_relax_domain_level: the searching range when migrating tasks
|
||||||
|
|
||||||
In addition, the root cpuset only has the following file:
|
In addition, the root cpuset only has the following file:
|
||||||
- memory_pressure_enabled flag: compute memory_pressure?
|
- memory_pressure_enabled flag: compute memory_pressure?
|
||||||
|
@ -252,7 +256,7 @@ is causing.
|
||||||
|
|
||||||
This is useful both on tightly managed systems running a wide mix of
|
This is useful both on tightly managed systems running a wide mix of
|
||||||
submitted jobs, which may choose to terminate or re-prioritize jobs that
|
submitted jobs, which may choose to terminate or re-prioritize jobs that
|
||||||
are trying to use more memory than allowed on the nodes assigned them,
|
are trying to use more memory than allowed on the nodes assigned to them,
|
||||||
and with tightly coupled, long running, massively parallel scientific
|
and with tightly coupled, long running, massively parallel scientific
|
||||||
computing jobs that will dramatically fail to meet required performance
|
computing jobs that will dramatically fail to meet required performance
|
||||||
goals if they start to use more memory than allowed to them.
|
goals if they start to use more memory than allowed to them.
|
||||||
|
@ -378,7 +382,7 @@ as cpusets and sched_setaffinity.
|
||||||
The algorithmic cost of load balancing and its impact on key shared
|
The algorithmic cost of load balancing and its impact on key shared
|
||||||
kernel data structures such as the task list increases more than
|
kernel data structures such as the task list increases more than
|
||||||
linearly with the number of CPUs being balanced. So the scheduler
|
linearly with the number of CPUs being balanced. So the scheduler
|
||||||
has support to partition the systems CPUs into a number of sched
|
has support to partition the systems CPUs into a number of sched
|
||||||
domains such that it only load balances within each sched domain.
|
domains such that it only load balances within each sched domain.
|
||||||
Each sched domain covers some subset of the CPUs in the system;
|
Each sched domain covers some subset of the CPUs in the system;
|
||||||
no two sched domains overlap; some CPUs might not be in any sched
|
no two sched domains overlap; some CPUs might not be in any sched
|
||||||
|
@ -485,17 +489,22 @@ of CPUs allowed to a cpuset having 'sched_load_balance' enabled.
|
||||||
The internal kernel cpuset to scheduler interface passes from the
|
The internal kernel cpuset to scheduler interface passes from the
|
||||||
cpuset code to the scheduler code a partition of the load balanced
|
cpuset code to the scheduler code a partition of the load balanced
|
||||||
CPUs in the system. This partition is a set of subsets (represented
|
CPUs in the system. This partition is a set of subsets (represented
|
||||||
as an array of cpumask_t) of CPUs, pairwise disjoint, that cover all
|
as an array of struct cpumask) of CPUs, pairwise disjoint, that cover
|
||||||
the CPUs that must be load balanced.
|
all the CPUs that must be load balanced.
|
||||||
|
|
||||||
Whenever the 'sched_load_balance' flag changes, or CPUs come or go
|
The cpuset code builds a new such partition and passes it to the
|
||||||
from a cpuset with this flag enabled, or a cpuset with this flag
|
scheduler sched domain setup code, to have the sched domains rebuilt
|
||||||
enabled is removed, the cpuset code builds a new such partition and
|
as necessary, whenever:
|
||||||
passes it to the scheduler sched domain setup code, to have the sched
|
- the 'sched_load_balance' flag of a cpuset with non-empty CPUs changes,
|
||||||
domains rebuilt as necessary.
|
- or CPUs come or go from a cpuset with this flag enabled,
|
||||||
|
- or 'sched_relax_domain_level' value of a cpuset with non-empty CPUs
|
||||||
|
and with this flag enabled changes,
|
||||||
|
- or a cpuset with non-empty CPUs and with this flag enabled is removed,
|
||||||
|
- or a cpu is offlined/onlined.
|
||||||
|
|
||||||
This partition exactly defines what sched domains the scheduler should
|
This partition exactly defines what sched domains the scheduler should
|
||||||
setup - one sched domain for each element (cpumask_t) in the partition.
|
setup - one sched domain for each element (struct cpumask) in the
|
||||||
|
partition.
|
||||||
|
|
||||||
The scheduler remembers the currently active sched domain partitions.
|
The scheduler remembers the currently active sched domain partitions.
|
||||||
When the scheduler routine partition_sched_domains() is invoked from
|
When the scheduler routine partition_sched_domains() is invoked from
|
||||||
|
@ -559,7 +568,7 @@ domain, the largest value among those is used. Be careful, if one
|
||||||
requests 0 and others are -1 then 0 is used.
|
requests 0 and others are -1 then 0 is used.
|
||||||
|
|
||||||
Note that modifying this file will have both good and bad effects,
|
Note that modifying this file will have both good and bad effects,
|
||||||
and whether it is acceptable or not will be depend on your situation.
|
and whether it is acceptable or not depends on your situation.
|
||||||
Don't modify this file if you are not sure.
|
Don't modify this file if you are not sure.
|
||||||
|
|
||||||
If your situation is:
|
If your situation is:
|
||||||
|
@ -600,19 +609,15 @@ to allocate a page of memory for that task.
|
||||||
|
|
||||||
If a cpuset has its 'cpus' modified, then each task in that cpuset
|
If a cpuset has its 'cpus' modified, then each task in that cpuset
|
||||||
will have its allowed CPU placement changed immediately. Similarly,
|
will have its allowed CPU placement changed immediately. Similarly,
|
||||||
if a tasks pid is written to a cpusets 'tasks' file, in either its
|
if a tasks pid is written to another cpusets 'tasks' file, then its
|
||||||
current cpuset or another cpuset, then its allowed CPU placement is
|
allowed CPU placement is changed immediately. If such a task had been
|
||||||
changed immediately. If such a task had been bound to some subset
|
bound to some subset of its cpuset using the sched_setaffinity() call,
|
||||||
of its cpuset using the sched_setaffinity() call, the task will be
|
the task will be allowed to run on any CPU allowed in its new cpuset,
|
||||||
allowed to run on any CPU allowed in its new cpuset, negating the
|
negating the effect of the prior sched_setaffinity() call.
|
||||||
affect of the prior sched_setaffinity() call.
|
|
||||||
|
|
||||||
In summary, the memory placement of a task whose cpuset is changed is
|
In summary, the memory placement of a task whose cpuset is changed is
|
||||||
updated by the kernel, on the next allocation of a page for that task,
|
updated by the kernel, on the next allocation of a page for that task,
|
||||||
but the processor placement is not updated, until that tasks pid is
|
and the processor placement is updated immediately.
|
||||||
rewritten to the 'tasks' file of its cpuset. This is done to avoid
|
|
||||||
impacting the scheduler code in the kernel with a check for changes
|
|
||||||
in a tasks processor placement.
|
|
||||||
|
|
||||||
Normally, once a page is allocated (given a physical page
|
Normally, once a page is allocated (given a physical page
|
||||||
of main memory) then that page stays on whatever node it
|
of main memory) then that page stays on whatever node it
|
||||||
|
@ -681,10 +686,14 @@ and then start a subshell 'sh' in that cpuset:
|
||||||
# The next line should display '/Charlie'
|
# The next line should display '/Charlie'
|
||||||
cat /proc/self/cpuset
|
cat /proc/self/cpuset
|
||||||
|
|
||||||
In the future, a C library interface to cpusets will likely be
|
There are ways to query or modify cpusets:
|
||||||
available. For now, the only way to query or modify cpusets is
|
- via the cpuset file system directly, using the various cd, mkdir, echo,
|
||||||
via the cpuset file system, using the various cd, mkdir, echo, cat,
|
cat, rmdir commands from the shell, or their equivalent from C.
|
||||||
rmdir commands from the shell, or their equivalent from C.
|
- via the C library libcpuset.
|
||||||
|
- via the C library libcgroup.
|
||||||
|
(http://sourceforge.net/proects/libcg/)
|
||||||
|
- via the python application cset.
|
||||||
|
(http://developer.novell.com/wiki/index.php/Cpuset)
|
||||||
|
|
||||||
The sched_setaffinity calls can also be done at the shell prompt using
|
The sched_setaffinity calls can also be done at the shell prompt using
|
||||||
SGI's runon or Robert Love's taskset. The mbind and set_mempolicy
|
SGI's runon or Robert Love's taskset. The mbind and set_mempolicy
|
||||||
|
@ -756,7 +765,7 @@ mount -t cpuset X /dev/cpuset
|
||||||
|
|
||||||
is equivalent to
|
is equivalent to
|
||||||
|
|
||||||
mount -t cgroup -ocpuset X /dev/cpuset
|
mount -t cgroup -ocpuset,noprefix X /dev/cpuset
|
||||||
echo "/sbin/cpuset_release_agent" > /dev/cpuset/release_agent
|
echo "/sbin/cpuset_release_agent" > /dev/cpuset/release_agent
|
||||||
|
|
||||||
2.2 Adding/removing cpus
|
2.2 Adding/removing cpus
|
||||||
|
|
|
@ -137,7 +137,7 @@ static void cn_test_timer_func(unsigned long __data)
|
||||||
|
|
||||||
memcpy(m + 1, data, m->len);
|
memcpy(m + 1, data, m->len);
|
||||||
|
|
||||||
cn_netlink_send(m, 0, gfp_any());
|
cn_netlink_send(m, 0, GFP_ATOMIC);
|
||||||
kfree(m);
|
kfree(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -160,10 +160,8 @@ static int cn_test_init(void)
|
||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
init_timer(&cn_test_timer);
|
setup_timer(&cn_test_timer, cn_test_timer_func, 0);
|
||||||
cn_test_timer.function = cn_test_timer_func;
|
|
||||||
cn_test_timer.expires = jiffies + HZ;
|
cn_test_timer.expires = jiffies + HZ;
|
||||||
cn_test_timer.data = 0;
|
|
||||||
add_timer(&cn_test_timer);
|
add_timer(&cn_test_timer);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -195,19 +195,3 @@ scaling_setspeed. By "echoing" a new frequency into this
|
||||||
you can change the speed of the CPU,
|
you can change the speed of the CPU,
|
||||||
but only within the limits of
|
but only within the limits of
|
||||||
scaling_min_freq and scaling_max_freq.
|
scaling_min_freq and scaling_max_freq.
|
||||||
|
|
||||||
|
|
||||||
3.2 Deprecated Interfaces
|
|
||||||
-------------------------
|
|
||||||
|
|
||||||
Depending on your kernel configuration, you might find the following
|
|
||||||
cpufreq-related files:
|
|
||||||
/proc/cpufreq
|
|
||||||
/proc/sys/cpu/*/speed
|
|
||||||
/proc/sys/cpu/*/speed-min
|
|
||||||
/proc/sys/cpu/*/speed-max
|
|
||||||
|
|
||||||
These are files for deprecated interfaces to cpufreq, which offer far
|
|
||||||
less functionality. Because of this, these interfaces aren't described
|
|
||||||
here.
|
|
||||||
|
|
||||||
|
|
|
@ -127,9 +127,11 @@ void unlock_device(struct device * dev);
|
||||||
Attributes
|
Attributes
|
||||||
~~~~~~~~~~
|
~~~~~~~~~~
|
||||||
struct device_attribute {
|
struct device_attribute {
|
||||||
struct attribute attr;
|
struct attribute attr;
|
||||||
ssize_t (*show)(struct device * dev, char * buf, size_t count, loff_t off);
|
ssize_t (*show)(struct device *dev, struct device_attribute *attr,
|
||||||
ssize_t (*store)(struct device * dev, const char * buf, size_t count, loff_t off);
|
char *buf);
|
||||||
|
ssize_t (*store)(struct device *dev, struct device_attribute *attr,
|
||||||
|
const char *buf, size_t count);
|
||||||
};
|
};
|
||||||
|
|
||||||
Attributes of devices can be exported via drivers using a simple
|
Attributes of devices can be exported via drivers using a simple
|
||||||
|
|
|
@ -1,205 +0,0 @@
|
||||||
This README escorted the skystar2-driver rewriting procedure. It describes the
|
|
||||||
state of the new flexcop-driver set and some internals are written down here
|
|
||||||
too.
|
|
||||||
|
|
||||||
This document hopefully describes things about the flexcop and its
|
|
||||||
device-offsprings. Goal was to write an easy-to-write and easy-to-read set of
|
|
||||||
drivers based on the skystar2.c and other information.
|
|
||||||
|
|
||||||
Remark: flexcop-pci.c was a copy of skystar2.c, but every line has been
|
|
||||||
touched and rewritten.
|
|
||||||
|
|
||||||
History & News
|
|
||||||
==============
|
|
||||||
2005-04-01 - correct USB ISOC transfers (thanks to Vadim Catana)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
General coding processing
|
|
||||||
=========================
|
|
||||||
|
|
||||||
We should proceed as follows (as long as no one complains):
|
|
||||||
|
|
||||||
0) Think before start writing code!
|
|
||||||
|
|
||||||
1) rewriting the skystar2.c with the help of the flexcop register descriptions
|
|
||||||
and splitting up the files to a pci-bus-part and a flexcop-part.
|
|
||||||
The new driver will be called b2c2-flexcop-pci.ko/b2c2-flexcop-usb.ko for the
|
|
||||||
device-specific part and b2c2-flexcop.ko for the common flexcop-functions.
|
|
||||||
|
|
||||||
2) Search for errors in the leftover of flexcop-pci.c (compare with pluto2.c
|
|
||||||
and other pci drivers)
|
|
||||||
|
|
||||||
3) make some beautification (see 'Improvements when rewriting (refactoring) is
|
|
||||||
done')
|
|
||||||
|
|
||||||
4) Testing the new driver and maybe substitute the skystar2.c with it, to reach
|
|
||||||
a wider tester audience.
|
|
||||||
|
|
||||||
5) creating an usb-bus-part using the already written flexcop code for the pci
|
|
||||||
card.
|
|
||||||
|
|
||||||
Idea: create a kernel-object for the flexcop and export all important
|
|
||||||
functions. This option saves kernel-memory, but maybe a lot of functions have
|
|
||||||
to be exported to kernel namespace.
|
|
||||||
|
|
||||||
|
|
||||||
Current situation
|
|
||||||
=================
|
|
||||||
|
|
||||||
0) Done :)
|
|
||||||
1) Done (some minor issues left)
|
|
||||||
2) Done
|
|
||||||
3) Not ready yet, more information is necessary
|
|
||||||
4) next to be done (see the table below)
|
|
||||||
5) USB driver is working (yes, there are some minor issues)
|
|
||||||
|
|
||||||
What seems to be ready?
|
|
||||||
-----------------------
|
|
||||||
|
|
||||||
1) Rewriting
|
|
||||||
1a) i2c is cut off from the flexcop-pci.c and seems to work
|
|
||||||
1b) moved tuner and demod stuff from flexcop-pci.c to flexcop-tuner-fe.c
|
|
||||||
1c) moved lnb and diseqc stuff from flexcop-pci.c to flexcop-tuner-fe.c
|
|
||||||
1e) eeprom (reading MAC address)
|
|
||||||
1d) sram (no dynamic sll size detection (commented out) (using default as JJ told me))
|
|
||||||
1f) misc. register accesses for reading parameters (e.g. resetting, revision)
|
|
||||||
1g) pid/mac filter (flexcop-hw-filter.c)
|
|
||||||
1i) dvb-stuff initialization in flexcop.c (done)
|
|
||||||
1h) dma stuff (now just using the size-irq, instead of all-together, to be done)
|
|
||||||
1j) remove flexcop initialization from flexcop-pci.c completely (done)
|
|
||||||
1l) use a well working dma IRQ method (done, see 'Known bugs and problems and TODO')
|
|
||||||
1k) cleanup flexcop-files (remove unused EXPORT_SYMBOLs, make static from
|
|
||||||
non-static where possible, moved code to proper places)
|
|
||||||
|
|
||||||
2) Search for errors in the leftover of flexcop-pci.c (partially done)
|
|
||||||
5a) add MAC address reading
|
|
||||||
5c) feeding of ISOC data to the software demux (format of the isochronous data
|
|
||||||
and speed optimization, no real error) (thanks to Vadim Catana)
|
|
||||||
|
|
||||||
What to do in the near future?
|
|
||||||
--------------------------------------
|
|
||||||
(no special order here)
|
|
||||||
|
|
||||||
5) USB driver
|
|
||||||
5b) optimize isoc-transfer (submitting/killing isoc URBs when transfer is starting)
|
|
||||||
|
|
||||||
Testing changes
|
|
||||||
---------------
|
|
||||||
|
|
||||||
O = item is working
|
|
||||||
P = item is partially working
|
|
||||||
X = item is not working
|
|
||||||
N = item does not apply here
|
|
||||||
<empty field> = item need to be examined
|
|
||||||
|
|
||||||
| PCI | USB
|
|
||||||
item | mt352 | nxt2002 | stv0299 | mt312 | mt352 | nxt2002 | stv0299 | mt312
|
|
||||||
-------+-------+---------+---------+-------+-------+---------+---------+-------
|
|
||||||
1a) | O | | | | N | N | N | N
|
|
||||||
1b) | O | | | | | | O |
|
|
||||||
1c) | N | N | | | N | N | O |
|
|
||||||
1d) | O | O
|
|
||||||
1e) | O | O
|
|
||||||
1f) | P
|
|
||||||
1g) | O
|
|
||||||
1h) | P |
|
|
||||||
1i) | O | N
|
|
||||||
1j) | O | N
|
|
||||||
1l) | O | N
|
|
||||||
2) | O | N
|
|
||||||
5a) | N | O
|
|
||||||
5b)* | N |
|
|
||||||
5c) | N | O
|
|
||||||
|
|
||||||
* - not done yet
|
|
||||||
|
|
||||||
Known bugs and problems and TODO
|
|
||||||
--------------------------------
|
|
||||||
|
|
||||||
1g/h/l) when pid filtering is enabled on the pci card
|
|
||||||
|
|
||||||
DMA usage currently:
|
|
||||||
The DMA is splitted in 2 equal-sized subbuffers. The Flexcop writes to first
|
|
||||||
address and triggers an IRQ when it's full and starts writing to the second
|
|
||||||
address. When the second address is full, the IRQ is triggered again, and
|
|
||||||
the flexcop writes to first address again, and so on.
|
|
||||||
The buffersize of each address is currently 640*188 bytes.
|
|
||||||
|
|
||||||
Problem is, when using hw-pid-filtering and doing some low-bandwidth
|
|
||||||
operation (like scanning) the buffers won't be filled enough to trigger
|
|
||||||
the IRQ. That's why:
|
|
||||||
|
|
||||||
When PID filtering is activated, the timer IRQ is used. Every 1.97 ms the IRQ
|
|
||||||
is triggered. Is the current write address of DMA1 different to the one
|
|
||||||
during the last IRQ, then the data is passed to the demuxer.
|
|
||||||
|
|
||||||
There is an additional DMA-IRQ-method: packet count IRQ. This isn't
|
|
||||||
implemented correctly yet.
|
|
||||||
|
|
||||||
The solution is to disable HW PID filtering, but I don't know how the DVB
|
|
||||||
API software demux behaves on slow systems with 45MBit/s TS.
|
|
||||||
|
|
||||||
Solved bugs :)
|
|
||||||
--------------
|
|
||||||
1g) pid-filtering (somehow pid index 4 and 5 (EMM_PID and ECM_PID) aren't
|
|
||||||
working)
|
|
||||||
SOLUTION: also index 0 was affected, because net_translation is done for
|
|
||||||
these indexes by default
|
|
||||||
|
|
||||||
5b) isochronous transfer does only work in the first attempt (for the Sky2PC
|
|
||||||
USB, Air2PC is working) SOLUTION: the flexcop was going asleep and never really
|
|
||||||
woke up again (don't know if this need fixes, see
|
|
||||||
flexcop-fe-tuner.c:flexcop_sleep)
|
|
||||||
|
|
||||||
NEWS: when the driver is loaded and unloaded and loaded again (w/o doing
|
|
||||||
anything in the while the driver is loaded the first time), no transfers take
|
|
||||||
place anymore.
|
|
||||||
|
|
||||||
Improvements when rewriting (refactoring) is done
|
|
||||||
=================================================
|
|
||||||
|
|
||||||
- split sleeping of the flexcop (misc_204.ACPI3_sig = 1;) from lnb_control
|
|
||||||
(enable sleeping for other demods than dvb-s)
|
|
||||||
- add support for CableStar (stv0297 Microtune 203x/ALPS) (almost done, incompatibilities with the Nexus-CA)
|
|
||||||
|
|
||||||
Debugging
|
|
||||||
---------
|
|
||||||
- add verbose debugging to skystar2.c (dump the reg_dw_data) and compare it
|
|
||||||
with this flexcop, this is important, because i2c is now using the
|
|
||||||
flexcop_ibi_value union from flexcop-reg.h (do you have a better idea for
|
|
||||||
that, please tell us so).
|
|
||||||
|
|
||||||
Everything which is identical in the following table, can be put into a common
|
|
||||||
flexcop-module.
|
|
||||||
|
|
||||||
PCI USB
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
Different:
|
|
||||||
Register access: accessing IO memory USB control message
|
|
||||||
I2C bus: I2C bus of the FC USB control message
|
|
||||||
Data transfer: DMA isochronous transfer
|
|
||||||
EEPROM transfer: through i2c bus not clear yet
|
|
||||||
|
|
||||||
Identical:
|
|
||||||
Streaming: accessing registers
|
|
||||||
PID Filtering: accessing registers
|
|
||||||
Sram destinations: accessing registers
|
|
||||||
Tuner/Demod: I2C bus
|
|
||||||
DVB-stuff: can be written for common use
|
|
||||||
|
|
||||||
Acknowledgements (just for the rewriting part)
|
|
||||||
================
|
|
||||||
|
|
||||||
Bjarne Steinsbo thought a lot in the first place of the pci part for this code
|
|
||||||
sharing idea.
|
|
||||||
|
|
||||||
Andreas Oberritter for providing a recent PCI initialization template
|
|
||||||
(pluto2.c).
|
|
||||||
|
|
||||||
Boleslaw Ciesielski for pointing out a problem with firmware loader.
|
|
||||||
|
|
||||||
Vadim Catana for correcting the USB transfer.
|
|
||||||
|
|
||||||
comments, critics and ideas to linux-dvb@linuxtv.org.
|
|
|
@ -1,5 +1,5 @@
|
||||||
How to set up the Technisat devices
|
How to set up the Technisat/B2C2 Flexcop devices
|
||||||
===================================
|
================================================
|
||||||
|
|
||||||
1) Find out what device you have
|
1) Find out what device you have
|
||||||
================================
|
================================
|
||||||
|
@ -16,54 +16,60 @@ DVB: registering frontend 0 (Conexant CX24123/CX24109)...
|
||||||
|
|
||||||
If the Technisat is the only TV device in your box get rid of unnecessary modules and check this one:
|
If the Technisat is the only TV device in your box get rid of unnecessary modules and check this one:
|
||||||
"Multimedia devices" => "Customise analog and hybrid tuner modules to build"
|
"Multimedia devices" => "Customise analog and hybrid tuner modules to build"
|
||||||
In this directory uncheck every driver which is activated there.
|
In this directory uncheck every driver which is activated there (except "Simple tuner support" for case 9 only).
|
||||||
|
|
||||||
Then please activate:
|
Then please activate:
|
||||||
2a) Main module part:
|
2a) Main module part:
|
||||||
|
|
||||||
a.)"Multimedia devices" => "DVB/ATSC adapters" => "Technisat/B2C2 FlexcopII(b) and FlexCopIII adapters"
|
a.)"Multimedia devices" => "DVB/ATSC adapters" => "Technisat/B2C2 FlexcopII(b) and FlexCopIII adapters"
|
||||||
b.)"Multimedia devices" => "DVB/ATSC adapters" => "Technisat/B2C2 FlexcopII(b) and FlexCopIII adapters" => "Technisat/B2C2 Air/Sky/Cable2PC PCI" in case of a PCI card OR
|
b.)"Multimedia devices" => "DVB/ATSC adapters" => "Technisat/B2C2 FlexcopII(b) and FlexCopIII adapters" => "Technisat/B2C2 Air/Sky/Cable2PC PCI" in case of a PCI card
|
||||||
|
OR
|
||||||
c.)"Multimedia devices" => "DVB/ATSC adapters" => "Technisat/B2C2 FlexcopII(b) and FlexCopIII adapters" => "Technisat/B2C2 Air/Sky/Cable2PC USB" in case of an USB 1.1 adapter
|
c.)"Multimedia devices" => "DVB/ATSC adapters" => "Technisat/B2C2 FlexcopII(b) and FlexCopIII adapters" => "Technisat/B2C2 Air/Sky/Cable2PC USB" in case of an USB 1.1 adapter
|
||||||
d.)"Multimedia devices" => "DVB/ATSC adapters" => "Technisat/B2C2 FlexcopII(b) and FlexCopIII adapters" => "Enable debug for the B2C2 FlexCop drivers"
|
d.)"Multimedia devices" => "DVB/ATSC adapters" => "Technisat/B2C2 FlexcopII(b) and FlexCopIII adapters" => "Enable debug for the B2C2 FlexCop drivers"
|
||||||
Notice: d.) is helpful for troubleshooting
|
Notice: d.) is helpful for troubleshooting
|
||||||
|
|
||||||
2b) Frontend module part:
|
2b) Frontend module part:
|
||||||
|
|
||||||
1.) Revision 2.3:
|
1.) SkyStar DVB-S Revision 2.3:
|
||||||
a.)"Multimedia devices" => "Customise DVB frontends" => "Customise the frontend modules to build"
|
a.)"Multimedia devices" => "Customise DVB frontends" => "Customise the frontend modules to build"
|
||||||
b.)"Multimedia devices" => "Customise DVB frontends" => "Zarlink VP310/MT312/ZL10313 based"
|
b.)"Multimedia devices" => "Customise DVB frontends" => "Zarlink VP310/MT312/ZL10313 based"
|
||||||
|
|
||||||
2.) Revision 2.6:
|
2.) SkyStar DVB-S Revision 2.6:
|
||||||
a.)"Multimedia devices" => "Customise DVB frontends" => "Customise the frontend modules to build"
|
a.)"Multimedia devices" => "Customise DVB frontends" => "Customise the frontend modules to build"
|
||||||
b.)"Multimedia devices" => "Customise DVB frontends" => "ST STV0299 based"
|
b.)"Multimedia devices" => "Customise DVB frontends" => "ST STV0299 based"
|
||||||
|
|
||||||
3.) Revision 2.7:
|
3.) SkyStar DVB-S Revision 2.7:
|
||||||
a.)"Multimedia devices" => "Customise DVB frontends" => "Customise the frontend modules to build"
|
a.)"Multimedia devices" => "Customise DVB frontends" => "Customise the frontend modules to build"
|
||||||
b.)"Multimedia devices" => "Customise DVB frontends" => "Samsung S5H1420 based"
|
b.)"Multimedia devices" => "Customise DVB frontends" => "Samsung S5H1420 based"
|
||||||
c.)"Multimedia devices" => "Customise DVB frontends" => "Integrant ITD1000 Zero IF tuner for DVB-S/DSS"
|
c.)"Multimedia devices" => "Customise DVB frontends" => "Integrant ITD1000 Zero IF tuner for DVB-S/DSS"
|
||||||
d.)"Multimedia devices" => "Customise DVB frontends" => "ISL6421 SEC controller"
|
d.)"Multimedia devices" => "Customise DVB frontends" => "ISL6421 SEC controller"
|
||||||
|
|
||||||
4.) Revision 2.8:
|
4.) SkyStar DVB-S Revision 2.8:
|
||||||
a.)"Multimedia devices" => "Customise DVB frontends" => "Customise the frontend modules to build"
|
a.)"Multimedia devices" => "Customise DVB frontends" => "Customise the frontend modules to build"
|
||||||
b.)"Multimedia devices" => "Customise DVB frontends" => "Conexant CX24113/CX24128 tuner for DVB-S/DSS"
|
b.)"Multimedia devices" => "Customise DVB frontends" => "Conexant CX24113/CX24128 tuner for DVB-S/DSS"
|
||||||
c.)"Multimedia devices" => "Customise DVB frontends" => "Conexant CX24123 based"
|
c.)"Multimedia devices" => "Customise DVB frontends" => "Conexant CX24123 based"
|
||||||
d.)"Multimedia devices" => "Customise DVB frontends" => "ISL6421 SEC controller"
|
d.)"Multimedia devices" => "Customise DVB frontends" => "ISL6421 SEC controller"
|
||||||
|
|
||||||
5.) DVB-T card:
|
5.) AirStar DVB-T card:
|
||||||
a.)"Multimedia devices" => "Customise DVB frontends" => "Customise the frontend modules to build"
|
a.)"Multimedia devices" => "Customise DVB frontends" => "Customise the frontend modules to build"
|
||||||
b.)"Multimedia devices" => "Customise DVB frontends" => "Zarlink MT352 based"
|
b.)"Multimedia devices" => "Customise DVB frontends" => "Zarlink MT352 based"
|
||||||
|
|
||||||
6.) DVB-C card:
|
6.) CableStar DVB-C card:
|
||||||
a.)"Multimedia devices" => "Customise DVB frontends" => "Customise the frontend modules to build"
|
a.)"Multimedia devices" => "Customise DVB frontends" => "Customise the frontend modules to build"
|
||||||
b.)"Multimedia devices" => "Customise DVB frontends" => "ST STV0297 based"
|
b.)"Multimedia devices" => "Customise DVB frontends" => "ST STV0297 based"
|
||||||
|
|
||||||
7.) ATSC card 1st generation:
|
7.) AirStar ATSC card 1st generation:
|
||||||
a.)"Multimedia devices" => "Customise DVB frontends" => "Customise the frontend modules to build"
|
a.)"Multimedia devices" => "Customise DVB frontends" => "Customise the frontend modules to build"
|
||||||
b.)"Multimedia devices" => "Customise DVB frontends" => "Broadcom BCM3510"
|
b.)"Multimedia devices" => "Customise DVB frontends" => "Broadcom BCM3510"
|
||||||
|
|
||||||
8.) ATSC card 2nd generation:
|
8.) AirStar ATSC card 2nd generation:
|
||||||
a.)"Multimedia devices" => "Customise DVB frontends" => "Customise the frontend modules to build"
|
a.)"Multimedia devices" => "Customise DVB frontends" => "Customise the frontend modules to build"
|
||||||
b.)"Multimedia devices" => "Customise DVB frontends" => "NxtWave Communications NXT2002/NXT2004 based"
|
b.)"Multimedia devices" => "Customise DVB frontends" => "NxtWave Communications NXT2002/NXT2004 based"
|
||||||
c.)"Multimedia devices" => "Customise DVB frontends" => "LG Electronics LGDT3302/LGDT3303 based"
|
c.)"Multimedia devices" => "Customise DVB frontends" => "Generic I2C PLL based tuners"
|
||||||
|
|
||||||
Author: Uwe Bugla <uwe.bugla@gmx.de> December 2008
|
9.) AirStar ATSC card 3rd generation:
|
||||||
|
a.)"Multimedia devices" => "Customise DVB frontends" => "Customise the frontend modules to build"
|
||||||
|
b.)"Multimedia devices" => "Customise DVB frontends" => "LG Electronics LGDT3302/LGDT3303 based"
|
||||||
|
c.)"Multimedia devices" => "Customise analog and hybrid tuner modules to build" => "Simple tuner support"
|
||||||
|
|
||||||
|
Author: Uwe Bugla <uwe.bugla@gmx.de> February 2009
|
||||||
|
|
|
@ -335,3 +335,12 @@ Why: In 2.6.18 the Secmark concept was introduced to replace the "compat_net"
|
||||||
Secmark, it is time to deprecate the older mechanism and start the
|
Secmark, it is time to deprecate the older mechanism and start the
|
||||||
process of removing the old code.
|
process of removing the old code.
|
||||||
Who: Paul Moore <paul.moore@hp.com>
|
Who: Paul Moore <paul.moore@hp.com>
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
What: sysfs ui for changing p4-clockmod parameters
|
||||||
|
When: September 2009
|
||||||
|
Why: See commits 129f8ae9b1b5be94517da76009ea956e89104ce8 and
|
||||||
|
e088e4c9cdb618675874becb91b2fd581ee707e6.
|
||||||
|
Removal is subject to fixing any remaining bugs in ACPI which may
|
||||||
|
cause the thermal throttling not to happen at the right time.
|
||||||
|
Who: Dave Jones <davej@redhat.com>, Matthew Garrett <mjg@redhat.com>
|
||||||
|
|
|
@ -373,10 +373,11 @@ Filesystem Resizing http://ext2resize.sourceforge.net/
|
||||||
Compression (*) http://e2compr.sourceforge.net/
|
Compression (*) http://e2compr.sourceforge.net/
|
||||||
|
|
||||||
Implementations for:
|
Implementations for:
|
||||||
Windows 95/98/NT/2000 http://uranus.it.swin.edu.au/~jn/linux/Explore2fs.htm
|
Windows 95/98/NT/2000 http://www.chrysocome.net/explore2fs
|
||||||
Windows 95 (*) http://www.yipton.demon.co.uk/content.html#FSDEXT2
|
Windows 95 (*) http://www.yipton.net/content.html#FSDEXT2
|
||||||
DOS client (*) ftp://metalab.unc.edu/pub/Linux/system/filesystems/ext2/
|
DOS client (*) ftp://metalab.unc.edu/pub/Linux/system/filesystems/ext2/
|
||||||
OS/2 http://perso.wanadoo.fr/matthieu.willm/ext2-os2/
|
OS/2 (+) ftp://metalab.unc.edu/pub/Linux/system/filesystems/ext2/
|
||||||
RISC OS client ftp://ftp.barnet.ac.uk/pub/acorn/armlinux/iscafs/
|
RISC OS client http://www.esw-heim.tu-clausthal.de/~marco/smorbrod/IscaFS/
|
||||||
|
|
||||||
(*) no longer actively developed/supported (as of Apr 2001)
|
(*) no longer actively developed/supported (as of Apr 2001)
|
||||||
|
(+) no longer actively developed/supported (as of Mar 2009)
|
||||||
|
|
|
@ -198,5 +198,5 @@ kernel source: <file:fs/ext3/>
|
||||||
programs: http://e2fsprogs.sourceforge.net/
|
programs: http://e2fsprogs.sourceforge.net/
|
||||||
http://ext2resize.sourceforge.net
|
http://ext2resize.sourceforge.net
|
||||||
|
|
||||||
useful links: http://www-106.ibm.com/developerworks/linux/library/l-fs7/
|
useful links: http://www.ibm.com/developerworks/library/l-fs7.html
|
||||||
http://www-106.ibm.com/developerworks/linux/library/l-fs8/
|
http://www.ibm.com/developerworks/library/l-fs8.html
|
||||||
|
|
|
@ -1478,6 +1478,13 @@ of problems on the network like duplicate address or bad checksums. Normally,
|
||||||
this should be enabled, but if the problem persists the messages can be
|
this should be enabled, but if the problem persists the messages can be
|
||||||
disabled.
|
disabled.
|
||||||
|
|
||||||
|
netdev_budget
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Maximum number of packets taken from all interfaces in one polling cycle (NAPI
|
||||||
|
poll). In one polling cycle interfaces which are registered to polling are
|
||||||
|
probed in a round-robin manner. The limit of packets in one such probe can be
|
||||||
|
set per-device via sysfs class/net/<device>/weight .
|
||||||
|
|
||||||
netdev_max_backlog
|
netdev_max_backlog
|
||||||
------------------
|
------------------
|
||||||
|
|
|
@ -22,7 +22,7 @@ Squashfs filesystem features versus Cramfs:
|
||||||
|
|
||||||
Squashfs Cramfs
|
Squashfs Cramfs
|
||||||
|
|
||||||
Max filesystem size: 2^64 16 MiB
|
Max filesystem size: 2^64 256 MiB
|
||||||
Max file size: ~ 2 TiB 16 MiB
|
Max file size: ~ 2 TiB 16 MiB
|
||||||
Max files: unlimited unlimited
|
Max files: unlimited unlimited
|
||||||
Max directories: unlimited unlimited
|
Max directories: unlimited unlimited
|
||||||
|
|
|
@ -9,6 +9,7 @@ that support it. For example, a given bus might look like this:
|
||||||
| |-- class
|
| |-- class
|
||||||
| |-- config
|
| |-- config
|
||||||
| |-- device
|
| |-- device
|
||||||
|
| |-- enable
|
||||||
| |-- irq
|
| |-- irq
|
||||||
| |-- local_cpus
|
| |-- local_cpus
|
||||||
| |-- resource
|
| |-- resource
|
||||||
|
@ -32,6 +33,7 @@ files, each with their own function.
|
||||||
class PCI class (ascii, ro)
|
class PCI class (ascii, ro)
|
||||||
config PCI config space (binary, rw)
|
config PCI config space (binary, rw)
|
||||||
device PCI device (ascii, ro)
|
device PCI device (ascii, ro)
|
||||||
|
enable Whether the device is enabled (ascii, rw)
|
||||||
irq IRQ number (ascii, ro)
|
irq IRQ number (ascii, ro)
|
||||||
local_cpus nearby CPU mask (cpumask, ro)
|
local_cpus nearby CPU mask (cpumask, ro)
|
||||||
resource PCI resource host addresses (ascii, ro)
|
resource PCI resource host addresses (ascii, ro)
|
||||||
|
@ -57,10 +59,19 @@ used to do actual device programming from userspace. Note that some platforms
|
||||||
don't support mmapping of certain resources, so be sure to check the return
|
don't support mmapping of certain resources, so be sure to check the return
|
||||||
value from any attempted mmap.
|
value from any attempted mmap.
|
||||||
|
|
||||||
|
The 'enable' file provides a counter that indicates how many times the device
|
||||||
|
has been enabled. If the 'enable' file currently returns '4', and a '1' is
|
||||||
|
echoed into it, it will then return '5'. Echoing a '0' into it will decrease
|
||||||
|
the count. Even when it returns to 0, though, some of the initialisation
|
||||||
|
may not be reversed.
|
||||||
|
|
||||||
The 'rom' file is special in that it provides read-only access to the device's
|
The 'rom' file is special in that it provides read-only access to the device's
|
||||||
ROM file, if available. It's disabled by default, however, so applications
|
ROM file, if available. It's disabled by default, however, so applications
|
||||||
should write the string "1" to the file to enable it before attempting a read
|
should write the string "1" to the file to enable it before attempting a read
|
||||||
call, and disable it following the access by writing "0" to the file.
|
call, and disable it following the access by writing "0" to the file. Note
|
||||||
|
that the device must be enabled for a rom read to return data succesfully.
|
||||||
|
In the event a driver is not bound to the device, it can be enabled using the
|
||||||
|
'enable' file, documented above.
|
||||||
|
|
||||||
Accessing legacy resources through sysfs
|
Accessing legacy resources through sysfs
|
||||||
----------------------------------------
|
----------------------------------------
|
||||||
|
|
|
@ -2,8 +2,10 @@
|
||||||
sysfs - _The_ filesystem for exporting kernel objects.
|
sysfs - _The_ filesystem for exporting kernel objects.
|
||||||
|
|
||||||
Patrick Mochel <mochel@osdl.org>
|
Patrick Mochel <mochel@osdl.org>
|
||||||
|
Mike Murphy <mamurph@cs.clemson.edu>
|
||||||
|
|
||||||
10 January 2003
|
Revised: 22 February 2009
|
||||||
|
Original: 10 January 2003
|
||||||
|
|
||||||
|
|
||||||
What it is:
|
What it is:
|
||||||
|
@ -64,12 +66,13 @@ An attribute definition is simply:
|
||||||
|
|
||||||
struct attribute {
|
struct attribute {
|
||||||
char * name;
|
char * name;
|
||||||
|
struct module *owner;
|
||||||
mode_t mode;
|
mode_t mode;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
int sysfs_create_file(struct kobject * kobj, struct attribute * attr);
|
int sysfs_create_file(struct kobject * kobj, const struct attribute * attr);
|
||||||
void sysfs_remove_file(struct kobject * kobj, struct attribute * attr);
|
void sysfs_remove_file(struct kobject * kobj, const struct attribute * attr);
|
||||||
|
|
||||||
|
|
||||||
A bare attribute contains no means to read or write the value of the
|
A bare attribute contains no means to read or write the value of the
|
||||||
|
@ -80,9 +83,11 @@ a specific object type.
|
||||||
For example, the driver model defines struct device_attribute like:
|
For example, the driver model defines struct device_attribute like:
|
||||||
|
|
||||||
struct device_attribute {
|
struct device_attribute {
|
||||||
struct attribute attr;
|
struct attribute attr;
|
||||||
ssize_t (*show)(struct device * dev, char * buf);
|
ssize_t (*show)(struct device *dev, struct device_attribute *attr,
|
||||||
ssize_t (*store)(struct device * dev, const char * buf);
|
char *buf);
|
||||||
|
ssize_t (*store)(struct device *dev, struct device_attribute *attr,
|
||||||
|
const char *buf, size_t count);
|
||||||
};
|
};
|
||||||
|
|
||||||
int device_create_file(struct device *, struct device_attribute *);
|
int device_create_file(struct device *, struct device_attribute *);
|
||||||
|
@ -90,12 +95,8 @@ void device_remove_file(struct device *, struct device_attribute *);
|
||||||
|
|
||||||
It also defines this helper for defining device attributes:
|
It also defines this helper for defining device attributes:
|
||||||
|
|
||||||
#define DEVICE_ATTR(_name, _mode, _show, _store) \
|
#define DEVICE_ATTR(_name, _mode, _show, _store) \
|
||||||
struct device_attribute dev_attr_##_name = { \
|
struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)
|
||||||
.attr = {.name = __stringify(_name) , .mode = _mode }, \
|
|
||||||
.show = _show, \
|
|
||||||
.store = _store, \
|
|
||||||
};
|
|
||||||
|
|
||||||
For example, declaring
|
For example, declaring
|
||||||
|
|
||||||
|
@ -107,9 +108,9 @@ static struct device_attribute dev_attr_foo = {
|
||||||
.attr = {
|
.attr = {
|
||||||
.name = "foo",
|
.name = "foo",
|
||||||
.mode = S_IWUSR | S_IRUGO,
|
.mode = S_IWUSR | S_IRUGO,
|
||||||
|
.show = show_foo,
|
||||||
|
.store = store_foo,
|
||||||
},
|
},
|
||||||
.show = show_foo,
|
|
||||||
.store = store_foo,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -161,10 +162,12 @@ To read or write attributes, show() or store() methods must be
|
||||||
specified when declaring the attribute. The method types should be as
|
specified when declaring the attribute. The method types should be as
|
||||||
simple as those defined for device attributes:
|
simple as those defined for device attributes:
|
||||||
|
|
||||||
ssize_t (*show)(struct device * dev, char * buf);
|
ssize_t (*show)(struct device * dev, struct device_attribute * attr,
|
||||||
ssize_t (*store)(struct device * dev, const char * buf);
|
char * buf);
|
||||||
|
ssize_t (*store)(struct device * dev, struct device_attribute * attr,
|
||||||
|
const char * buf);
|
||||||
|
|
||||||
IOW, they should take only an object and a buffer as parameters.
|
IOW, they should take only an object, an attribute, and a buffer as parameters.
|
||||||
|
|
||||||
|
|
||||||
sysfs allocates a buffer of size (PAGE_SIZE) and passes it to the
|
sysfs allocates a buffer of size (PAGE_SIZE) and passes it to the
|
||||||
|
@ -299,14 +302,16 @@ The following interface layers currently exist in sysfs:
|
||||||
Structure:
|
Structure:
|
||||||
|
|
||||||
struct device_attribute {
|
struct device_attribute {
|
||||||
struct attribute attr;
|
struct attribute attr;
|
||||||
ssize_t (*show)(struct device * dev, char * buf);
|
ssize_t (*show)(struct device *dev, struct device_attribute *attr,
|
||||||
ssize_t (*store)(struct device * dev, const char * buf);
|
char *buf);
|
||||||
|
ssize_t (*store)(struct device *dev, struct device_attribute *attr,
|
||||||
|
const char *buf, size_t count);
|
||||||
};
|
};
|
||||||
|
|
||||||
Declaring:
|
Declaring:
|
||||||
|
|
||||||
DEVICE_ATTR(_name, _str, _mode, _show, _store);
|
DEVICE_ATTR(_name, _mode, _show, _store);
|
||||||
|
|
||||||
Creation/Removal:
|
Creation/Removal:
|
||||||
|
|
||||||
|
@ -342,7 +347,8 @@ Structure:
|
||||||
struct driver_attribute {
|
struct driver_attribute {
|
||||||
struct attribute attr;
|
struct attribute attr;
|
||||||
ssize_t (*show)(struct device_driver *, char * buf);
|
ssize_t (*show)(struct device_driver *, char * buf);
|
||||||
ssize_t (*store)(struct device_driver *, const char * buf);
|
ssize_t (*store)(struct device_driver *, const char * buf,
|
||||||
|
size_t count);
|
||||||
};
|
};
|
||||||
|
|
||||||
Declaring:
|
Declaring:
|
||||||
|
|
|
@ -79,13 +79,6 @@ Mount options
|
||||||
|
|
||||||
(*) == default.
|
(*) == default.
|
||||||
|
|
||||||
norm_unmount (*) commit on unmount; the journal is committed
|
|
||||||
when the file-system is unmounted so that the
|
|
||||||
next mount does not have to replay the journal
|
|
||||||
and it becomes very fast;
|
|
||||||
fast_unmount do not commit on unmount; this option makes
|
|
||||||
unmount faster, but the next mount slower
|
|
||||||
because of the need to replay the journal.
|
|
||||||
bulk_read read more in one go to take advantage of flash
|
bulk_read read more in one go to take advantage of flash
|
||||||
media that read faster sequentially
|
media that read faster sequentially
|
||||||
no_bulk_read (*) do not bulk-read
|
no_bulk_read (*) do not bulk-read
|
||||||
|
|
|
@ -0,0 +1,101 @@
|
||||||
|
/* Disk protection for HP machines.
|
||||||
|
*
|
||||||
|
* Copyright 2008 Eric Piel
|
||||||
|
* Copyright 2009 Pavel Machek <pavel@suse.cz>
|
||||||
|
*
|
||||||
|
* GPLv2.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
|
void write_int(char *path, int i)
|
||||||
|
{
|
||||||
|
char buf[1024];
|
||||||
|
int fd = open(path, O_RDWR);
|
||||||
|
if (fd < 0) {
|
||||||
|
perror("open");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
sprintf(buf, "%d", i);
|
||||||
|
if (write(fd, buf, strlen(buf)) != strlen(buf)) {
|
||||||
|
perror("write");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_led(int on)
|
||||||
|
{
|
||||||
|
write_int("/sys/class/leds/hp::hddprotect/brightness", on);
|
||||||
|
}
|
||||||
|
|
||||||
|
void protect(int seconds)
|
||||||
|
{
|
||||||
|
write_int("/sys/block/sda/device/unload_heads", seconds*1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
int on_ac(void)
|
||||||
|
{
|
||||||
|
// /sys/class/power_supply/AC0/online
|
||||||
|
}
|
||||||
|
|
||||||
|
int lid_open(void)
|
||||||
|
{
|
||||||
|
// /proc/acpi/button/lid/LID/state
|
||||||
|
}
|
||||||
|
|
||||||
|
void ignore_me(void)
|
||||||
|
{
|
||||||
|
protect(0);
|
||||||
|
set_led(0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
int fd, ret;
|
||||||
|
|
||||||
|
fd = open("/dev/freefall", O_RDONLY);
|
||||||
|
if (fd < 0) {
|
||||||
|
perror("open");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
signal(SIGALRM, ignore_me);
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
unsigned char count;
|
||||||
|
|
||||||
|
ret = read(fd, &count, sizeof(count));
|
||||||
|
alarm(0);
|
||||||
|
if ((ret == -1) && (errno == EINTR)) {
|
||||||
|
/* Alarm expired, time to unpark the heads */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret != sizeof(count)) {
|
||||||
|
perror("read");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
protect(21);
|
||||||
|
set_led(1);
|
||||||
|
if (1 || on_ac() || lid_open()) {
|
||||||
|
alarm(2);
|
||||||
|
} else {
|
||||||
|
alarm(20);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
|
@ -33,6 +33,14 @@ rate - reports the sampling rate of the accelerometer device in HZ
|
||||||
This driver also provides an absolute input class device, allowing
|
This driver also provides an absolute input class device, allowing
|
||||||
the laptop to act as a pinball machine-esque joystick.
|
the laptop to act as a pinball machine-esque joystick.
|
||||||
|
|
||||||
|
Another feature of the driver is misc device called "freefall" that
|
||||||
|
acts similar to /dev/rtc and reacts on free-fall interrupts received
|
||||||
|
from the device. It supports blocking operations, poll/select and
|
||||||
|
fasync operation modes. You must read 1 bytes from the device. The
|
||||||
|
result is number of free-fall interrupts since the last successful
|
||||||
|
read (or 255 if number of interrupts would not fit).
|
||||||
|
|
||||||
|
|
||||||
Axes orientation
|
Axes orientation
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,11 @@ Supported chips:
|
||||||
Addresses scanned: I2C 0x4e
|
Addresses scanned: I2C 0x4e
|
||||||
Datasheet: Publicly available at the Maxim website
|
Datasheet: Publicly available at the Maxim website
|
||||||
http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3497
|
http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3497
|
||||||
|
* Maxim MAX6648
|
||||||
|
Prefix: 'max6646'
|
||||||
|
Addresses scanned: I2C 0x4c
|
||||||
|
Datasheet: Publicly available at the Maxim website
|
||||||
|
http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3500
|
||||||
* Maxim MAX6649
|
* Maxim MAX6649
|
||||||
Prefix: 'max6646'
|
Prefix: 'max6646'
|
||||||
Addresses scanned: I2C 0x4c
|
Addresses scanned: I2C 0x4c
|
||||||
|
@ -74,6 +79,11 @@ Supported chips:
|
||||||
0x4c, 0x4d and 0x4e
|
0x4c, 0x4d and 0x4e
|
||||||
Datasheet: Publicly available at the Maxim website
|
Datasheet: Publicly available at the Maxim website
|
||||||
http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3370
|
http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3370
|
||||||
|
* Maxim MAX6692
|
||||||
|
Prefix: 'max6646'
|
||||||
|
Addresses scanned: I2C 0x4c
|
||||||
|
Datasheet: Publicly available at the Maxim website
|
||||||
|
http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3500
|
||||||
|
|
||||||
|
|
||||||
Author: Jean Delvare <khali@linux-fr.org>
|
Author: Jean Delvare <khali@linux-fr.org>
|
||||||
|
|
|
@ -43,7 +43,8 @@ Only comments so marked will be considered by the kernel-doc scripts,
|
||||||
and any comment so marked must be in kernel-doc format. Do not use
|
and any comment so marked must be in kernel-doc format. Do not use
|
||||||
"/**" to be begin a comment block unless the comment block contains
|
"/**" to be begin a comment block unless the comment block contains
|
||||||
kernel-doc formatted comments. The closing comment marker for
|
kernel-doc formatted comments. The closing comment marker for
|
||||||
kernel-doc comments can be either "*/" or "**/".
|
kernel-doc comments can be either "*/" or "**/", but "*/" is
|
||||||
|
preferred in the Linux kernel tree.
|
||||||
|
|
||||||
Kernel-doc comments should be placed just before the function
|
Kernel-doc comments should be placed just before the function
|
||||||
or data structure being described.
|
or data structure being described.
|
||||||
|
@ -63,7 +64,7 @@ Example kernel-doc function comment:
|
||||||
* comment lines.
|
* comment lines.
|
||||||
*
|
*
|
||||||
* The longer description can have multiple paragraphs.
|
* The longer description can have multiple paragraphs.
|
||||||
**/
|
*/
|
||||||
|
|
||||||
The first line, with the short description, must be on a single line.
|
The first line, with the short description, must be on a single line.
|
||||||
|
|
||||||
|
@ -85,7 +86,7 @@ Example kernel-doc data structure comment.
|
||||||
* perhaps with more lines and words.
|
* perhaps with more lines and words.
|
||||||
*
|
*
|
||||||
* Longer description of this structure.
|
* Longer description of this structure.
|
||||||
**/
|
*/
|
||||||
|
|
||||||
The kernel-doc function comments describe each parameter to the
|
The kernel-doc function comments describe each parameter to the
|
||||||
function, in order, with the @name lines.
|
function, in order, with the @name lines.
|
||||||
|
|
|
@ -114,7 +114,7 @@ In addition, the following text indicates that the option:
|
||||||
Parameters denoted with BOOT are actually interpreted by the boot
|
Parameters denoted with BOOT are actually interpreted by the boot
|
||||||
loader, and have no meaning to the kernel directly.
|
loader, and have no meaning to the kernel directly.
|
||||||
Do not modify the syntax of boot loader parameters without extreme
|
Do not modify the syntax of boot loader parameters without extreme
|
||||||
need or coordination with <Documentation/x86/i386/boot.txt>.
|
need or coordination with <Documentation/x86/boot.txt>.
|
||||||
|
|
||||||
There are also arch-specific kernel-parameters not documented here.
|
There are also arch-specific kernel-parameters not documented here.
|
||||||
See for example <Documentation/x86/x86_64/boot-options.txt>.
|
See for example <Documentation/x86/x86_64/boot-options.txt>.
|
||||||
|
@ -134,7 +134,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
|
|
||||||
acpi= [HW,ACPI,X86-64,i386]
|
acpi= [HW,ACPI,X86-64,i386]
|
||||||
Advanced Configuration and Power Interface
|
Advanced Configuration and Power Interface
|
||||||
Format: { force | off | ht | strict | noirq }
|
Format: { force | off | ht | strict | noirq | rsdt }
|
||||||
force -- enable ACPI if default was off
|
force -- enable ACPI if default was off
|
||||||
off -- disable ACPI if default was on
|
off -- disable ACPI if default was on
|
||||||
noirq -- do not use ACPI for IRQ routing
|
noirq -- do not use ACPI for IRQ routing
|
||||||
|
@ -868,8 +868,10 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
icn= [HW,ISDN]
|
icn= [HW,ISDN]
|
||||||
Format: <io>[,<membase>[,<icn_id>[,<icn_id2>]]]
|
Format: <io>[,<membase>[,<icn_id>[,<icn_id2>]]]
|
||||||
|
|
||||||
ide= [HW] (E)IDE subsystem
|
ide-core.nodma= [HW] (E)IDE subsystem
|
||||||
Format: ide=nodma or ide=doubler
|
Format: =0.0 to prevent dma on hda, =0.1 hdb =1.0 hdc
|
||||||
|
.vlb_clock .pci_clock .noflush .noprobe .nowerr .cdrom
|
||||||
|
.chs .ignore_cable are additional options
|
||||||
See Documentation/ide/ide.txt.
|
See Documentation/ide/ide.txt.
|
||||||
|
|
||||||
idebus= [HW] (E)IDE subsystem - VLB/PCI bus speed
|
idebus= [HW] (E)IDE subsystem - VLB/PCI bus speed
|
||||||
|
@ -937,6 +939,8 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
|
|
||||||
|
|
||||||
intel_iommu= [DMAR] Intel IOMMU driver (DMAR) option
|
intel_iommu= [DMAR] Intel IOMMU driver (DMAR) option
|
||||||
|
on
|
||||||
|
Enable intel iommu driver.
|
||||||
off
|
off
|
||||||
Disable intel iommu driver.
|
Disable intel iommu driver.
|
||||||
igfx_off [Default Off]
|
igfx_off [Default Off]
|
||||||
|
@ -2447,7 +2451,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
See Documentation/fb/modedb.txt.
|
See Documentation/fb/modedb.txt.
|
||||||
|
|
||||||
vga= [BOOT,X86-32] Select a particular video mode
|
vga= [BOOT,X86-32] Select a particular video mode
|
||||||
See Documentation/x86/i386/boot.txt and
|
See Documentation/x86/boot.txt and
|
||||||
Documentation/svga.txt.
|
Documentation/svga.txt.
|
||||||
Use vga=ask for menu.
|
Use vga=ask for menu.
|
||||||
This is actually a boot loader parameter; the value is
|
This is actually a boot loader parameter; the value is
|
||||||
|
|
Двоичные данные
Documentation/logo.gif
Двоичные данные
Documentation/logo.gif
Двоичный файл не отображается.
До Ширина: | Высота: | Размер: 16 KiB |
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
После Ширина: | Высота: | Размер: 303 KiB |
|
@ -1,13 +1,4 @@
|
||||||
This is the full-colour version of the currently unofficial Linux logo
|
Tux is taking a three month sabbatical to work as a barber, so Tuz is
|
||||||
("currently unofficial" just means that there has been no paperwork and
|
standing in. He's taken pains to ensure you'll hardly notice.
|
||||||
that I have not really announced it yet). It was created by Larry Ewing,
|
|
||||||
and is freely usable as long as you acknowledge Larry as the original
|
|
||||||
artist.
|
|
||||||
|
|
||||||
Note that there are black-and-white versions of this available that
|
|
||||||
scale down to smaller sizes and are better for letterheads or whatever
|
|
||||||
you want to use it for: for the full range of logos take a look at
|
|
||||||
Larry's web-page:
|
|
||||||
|
|
||||||
http://www.isc.tamu.edu/~lewing/linux/
|
|
||||||
|
|
||||||
|
Image by Andrew McGown and Josh Bush. Image is licensed CC BY-SA.
|
||||||
|
|
|
@ -2,14 +2,14 @@
|
||||||
IP-Aliasing:
|
IP-Aliasing:
|
||||||
============
|
============
|
||||||
|
|
||||||
IP-aliases are additional IP-addresses/masks hooked up to a base
|
IP-aliases are an obsolete way to manage multiple IP-addresses/masks
|
||||||
interface by adding a colon and a string when running ifconfig.
|
per interface. Newer tools such as iproute2 support multiple
|
||||||
|
address/prefixes per interface, but aliases are still supported
|
||||||
|
for backwards compatibility.
|
||||||
|
|
||||||
|
An alias is formed by adding a colon and a string when running ifconfig.
|
||||||
This string is usually numeric, but this is not a must.
|
This string is usually numeric, but this is not a must.
|
||||||
|
|
||||||
IP-Aliases are avail if CONFIG_INET (`standard' IPv4 networking)
|
|
||||||
is configured in the kernel.
|
|
||||||
|
|
||||||
|
|
||||||
o Alias creation.
|
o Alias creation.
|
||||||
Alias creation is done by 'magic' interface naming: eg. to create a
|
Alias creation is done by 'magic' interface naming: eg. to create a
|
||||||
200.1.1.1 alias for eth0 ...
|
200.1.1.1 alias for eth0 ...
|
||||||
|
@ -38,16 +38,3 @@ o Relationship with main device
|
||||||
|
|
||||||
If the base device is shut down the added aliases will be deleted
|
If the base device is shut down the added aliases will be deleted
|
||||||
too.
|
too.
|
||||||
|
|
||||||
|
|
||||||
Contact
|
|
||||||
-------
|
|
||||||
Please finger or e-mail me:
|
|
||||||
Juan Jose Ciarlante <jjciarla@raiz.uncu.edu.ar>
|
|
||||||
|
|
||||||
Updated by Erik Schoenfelder <schoenfr@gaertner.DE>
|
|
||||||
|
|
||||||
; local variables:
|
|
||||||
; mode: indented-text
|
|
||||||
; mode: auto-fill
|
|
||||||
; end:
|
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
|
||||||
|
Options for the ipv6 module are supplied as parameters at load time.
|
||||||
|
|
||||||
|
Module options may be given as command line arguments to the insmod
|
||||||
|
or modprobe command, but are usually specified in either the
|
||||||
|
/etc/modules.conf or /etc/modprobe.conf configuration file, or in a
|
||||||
|
distro-specific configuration file.
|
||||||
|
|
||||||
|
The available ipv6 module parameters are listed below. If a parameter
|
||||||
|
is not specified the default value is used.
|
||||||
|
|
||||||
|
The parameters are as follows:
|
||||||
|
|
||||||
|
disable
|
||||||
|
|
||||||
|
Specifies whether to load the IPv6 module, but disable all
|
||||||
|
its functionality. This might be used when another module
|
||||||
|
has a dependency on the IPv6 module being loaded, but no
|
||||||
|
IPv6 addresses or operations are desired.
|
||||||
|
|
||||||
|
The possible values and their effects are:
|
||||||
|
|
||||||
|
0
|
||||||
|
IPv6 is enabled.
|
||||||
|
|
||||||
|
This is the default value.
|
||||||
|
|
||||||
|
1
|
||||||
|
IPv6 is disabled.
|
||||||
|
|
||||||
|
No IPv6 addresses will be added to interfaces, and
|
||||||
|
it will not be possible to open an IPv6 socket.
|
||||||
|
|
||||||
|
A reboot is required to enable IPv6.
|
||||||
|
|
|
@ -0,0 +1,180 @@
|
||||||
|
MPC5200 Device Tree Bindings
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
(c) 2006-2009 Secret Lab Technologies Ltd
|
||||||
|
Grant Likely <grant.likely@secretlab.ca>
|
||||||
|
|
||||||
|
Naming conventions
|
||||||
|
------------------
|
||||||
|
For mpc5200 on-chip devices, the format for each compatible value is
|
||||||
|
<chip>-<device>[-<mode>]. The OS should be able to match a device driver
|
||||||
|
to the device based solely on the compatible value. If two drivers
|
||||||
|
match on the compatible list; the 'most compatible' driver should be
|
||||||
|
selected.
|
||||||
|
|
||||||
|
The split between the MPC5200 and the MPC5200B leaves a bit of a
|
||||||
|
conundrum. How should the compatible property be set up to provide
|
||||||
|
maximum compatibility information; but still accurately describe the
|
||||||
|
chip? For the MPC5200; the answer is easy. Most of the SoC devices
|
||||||
|
originally appeared on the MPC5200. Since they didn't exist anywhere
|
||||||
|
else; the 5200 compatible properties will contain only one item;
|
||||||
|
"fsl,mpc5200-<device>".
|
||||||
|
|
||||||
|
The 5200B is almost the same as the 5200, but not quite. It fixes
|
||||||
|
silicon bugs and it adds a small number of enhancements. Most of the
|
||||||
|
devices either provide exactly the same interface as on the 5200. A few
|
||||||
|
devices have extra functions but still have a backwards compatible mode.
|
||||||
|
To express this information as completely as possible, 5200B device trees
|
||||||
|
should have two items in the compatible list:
|
||||||
|
compatible = "fsl,mpc5200b-<device>","fsl,mpc5200-<device>";
|
||||||
|
|
||||||
|
It is *strongly* recommended that 5200B device trees follow this convention
|
||||||
|
(instead of only listing the base mpc5200 item).
|
||||||
|
|
||||||
|
ie. ethernet on mpc5200: compatible = "fsl,mpc5200-fec";
|
||||||
|
ethernet on mpc5200b: compatible = "fsl,mpc5200b-fec", "fsl,mpc5200-fec";
|
||||||
|
|
||||||
|
Modal devices, like PSCs, also append the configured function to the
|
||||||
|
end of the compatible field. ie. A PSC in i2s mode would specify
|
||||||
|
"fsl,mpc5200-psc-i2s", not "fsl,mpc5200-i2s". This convention is chosen to
|
||||||
|
avoid naming conflicts with non-psc devices providing the same
|
||||||
|
function. For example, "fsl,mpc5200-spi" and "fsl,mpc5200-psc-spi" describe
|
||||||
|
the mpc5200 simple spi device and a PSC spi mode respectively.
|
||||||
|
|
||||||
|
At the time of writing, exact chip may be either 'fsl,mpc5200' or
|
||||||
|
'fsl,mpc5200b'.
|
||||||
|
|
||||||
|
The soc node
|
||||||
|
------------
|
||||||
|
This node describes the on chip SOC peripherals. Every mpc5200 based
|
||||||
|
board will have this node, and as such there is a common naming
|
||||||
|
convention for SOC devices.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
name description
|
||||||
|
---- -----------
|
||||||
|
ranges Memory range of the internal memory mapped registers.
|
||||||
|
Should be <0 [baseaddr] 0xc000>
|
||||||
|
reg Should be <[baseaddr] 0x100>
|
||||||
|
compatible mpc5200: "fsl,mpc5200-immr"
|
||||||
|
mpc5200b: "fsl,mpc5200b-immr"
|
||||||
|
system-frequency 'fsystem' frequency in Hz; XLB, IPB, USB and PCI
|
||||||
|
clocks are derived from the fsystem clock.
|
||||||
|
bus-frequency IPB bus frequency in Hz. Clock rate
|
||||||
|
used by most of the soc devices.
|
||||||
|
|
||||||
|
soc child nodes
|
||||||
|
---------------
|
||||||
|
Any on chip SOC devices available to Linux must appear as soc5200 child nodes.
|
||||||
|
|
||||||
|
Note: The tables below show the value for the mpc5200. A mpc5200b device
|
||||||
|
tree should use the "fsl,mpc5200b-<device>","fsl,mpc5200-<device>" form.
|
||||||
|
|
||||||
|
Required soc5200 child nodes:
|
||||||
|
name compatible Description
|
||||||
|
---- ---------- -----------
|
||||||
|
cdm@<addr> fsl,mpc5200-cdm Clock Distribution
|
||||||
|
interrupt-controller@<addr> fsl,mpc5200-pic need an interrupt
|
||||||
|
controller to boot
|
||||||
|
bestcomm@<addr> fsl,mpc5200-bestcomm Bestcomm DMA controller
|
||||||
|
|
||||||
|
Recommended soc5200 child nodes; populate as needed for your board
|
||||||
|
name compatible Description
|
||||||
|
---- ---------- -----------
|
||||||
|
timer@<addr> fsl,mpc5200-gpt General purpose timers
|
||||||
|
gpio@<addr> fsl,mpc5200-gpio MPC5200 simple gpio controller
|
||||||
|
gpio@<addr> fsl,mpc5200-gpio-wkup MPC5200 wakeup gpio controller
|
||||||
|
rtc@<addr> fsl,mpc5200-rtc Real time clock
|
||||||
|
mscan@<addr> fsl,mpc5200-mscan CAN bus controller
|
||||||
|
pci@<addr> fsl,mpc5200-pci PCI bridge
|
||||||
|
serial@<addr> fsl,mpc5200-psc-uart PSC in serial mode
|
||||||
|
i2s@<addr> fsl,mpc5200-psc-i2s PSC in i2s mode
|
||||||
|
ac97@<addr> fsl,mpc5200-psc-ac97 PSC in ac97 mode
|
||||||
|
spi@<addr> fsl,mpc5200-psc-spi PSC in spi mode
|
||||||
|
irda@<addr> fsl,mpc5200-psc-irda PSC in IrDA mode
|
||||||
|
spi@<addr> fsl,mpc5200-spi MPC5200 spi device
|
||||||
|
ethernet@<addr> fsl,mpc5200-fec MPC5200 ethernet device
|
||||||
|
ata@<addr> fsl,mpc5200-ata IDE ATA interface
|
||||||
|
i2c@<addr> fsl,mpc5200-i2c I2C controller
|
||||||
|
usb@<addr> fsl,mpc5200-ohci,ohci-be USB controller
|
||||||
|
xlb@<addr> fsl,mpc5200-xlb XLB arbitrator
|
||||||
|
|
||||||
|
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'.
|
||||||
|
|
||||||
|
An mpc5200-gpt can be used as a single line GPIO controller. To do so,
|
||||||
|
add the following properties to the gpt node:
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
When referencing the GPIO line from another node, the first cell must always
|
||||||
|
be zero and the second cell represents the gpio flags and described in the
|
||||||
|
gpio device tree binding.
|
||||||
|
|
||||||
|
An mpc5200-gpt can be used as a single line edge sensitive interrupt
|
||||||
|
controller. To do so, add the following properties to the gpt node:
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <1>;
|
||||||
|
When referencing the IRQ line from another node, the cell represents the
|
||||||
|
sense mode; 1 for edge rising, 2 for edge falling.
|
||||||
|
|
||||||
|
fsl,mpc5200-psc nodes
|
||||||
|
---------------------
|
||||||
|
The PSCs should include a cell-index which is the index of the PSC in
|
||||||
|
hardware. cell-index is used to determine which shared SoC registers to
|
||||||
|
use when setting up PSC clocking. cell-index number starts at '0'. ie:
|
||||||
|
PSC1 has 'cell-index = <0>'
|
||||||
|
PSC4 has 'cell-index = <3>'
|
||||||
|
|
||||||
|
PSC in i2s mode: The mpc5200 and mpc5200b PSCs are not compatible when in
|
||||||
|
i2s mode. An 'mpc5200b-psc-i2s' node cannot include 'mpc5200-psc-i2s' in the
|
||||||
|
compatible field.
|
||||||
|
|
||||||
|
|
||||||
|
fsl,mpc5200-gpio and fsl,mpc5200-gpio-wkup nodes
|
||||||
|
------------------------------------------------
|
||||||
|
Each GPIO controller node should have the empty property gpio-controller and
|
||||||
|
#gpio-cells set to 2. First cell is the GPIO number which is interpreted
|
||||||
|
according to the bit numbers in the GPIO control registers. The second cell
|
||||||
|
is for flags which is currently unused.
|
||||||
|
|
||||||
|
fsl,mpc5200-fec nodes
|
||||||
|
---------------------
|
||||||
|
The FEC node can specify one of the following properties to configure
|
||||||
|
the MII link:
|
||||||
|
- fsl,7-wire-mode - An empty property that specifies the link uses 7-wire
|
||||||
|
mode instead of MII
|
||||||
|
- current-speed - Specifies that the MII should be configured for a fixed
|
||||||
|
speed. This property should contain two cells. The
|
||||||
|
first cell specifies the speed in Mbps and the second
|
||||||
|
should be '0' for half duplex and '1' for full duplex
|
||||||
|
- phy-handle - Contains a phandle to an Ethernet PHY.
|
||||||
|
|
||||||
|
Interrupt controller (fsl,mpc5200-pic) node
|
||||||
|
-------------------------------------------
|
||||||
|
The mpc5200 pic binding splits hardware IRQ numbers into two levels. The
|
||||||
|
split reflects the layout of the PIC hardware itself, which groups
|
||||||
|
interrupts into one of three groups; CRIT, MAIN or PERP. Also, the
|
||||||
|
Bestcomm dma engine has it's own set of interrupt sources which are
|
||||||
|
cascaded off of peripheral interrupt 0, which the driver interprets as a
|
||||||
|
fourth group, SDMA.
|
||||||
|
|
||||||
|
The interrupts property for device nodes using the mpc5200 pic consists
|
||||||
|
of three cells; <L1 L2 level>
|
||||||
|
|
||||||
|
L1 := [CRIT=0, MAIN=1, PERP=2, SDMA=3]
|
||||||
|
L2 := interrupt number; directly mapped from the value in the
|
||||||
|
"ICTL PerStat, MainStat, CritStat Encoded Register"
|
||||||
|
level := [LEVEL_HIGH=0, EDGE_RISING=1, EDGE_FALLING=2, LEVEL_LOW=3]
|
||||||
|
|
||||||
|
For external IRQs, use the following interrupt property values (how to
|
||||||
|
specify external interrupts is a frequently asked question):
|
||||||
|
External interrupts:
|
||||||
|
external irq0: interrupts = <0 0 n>;
|
||||||
|
external irq1: interrupts = <1 1 n>;
|
||||||
|
external irq2: interrupts = <1 2 n>;
|
||||||
|
external irq3: interrupts = <1 3 n>;
|
||||||
|
'n' is sense (0: level high, 1: edge rising, 2: edge falling 3: level low)
|
||||||
|
|
|
@ -1,277 +0,0 @@
|
||||||
MPC5200 Device Tree Bindings
|
|
||||||
----------------------------
|
|
||||||
|
|
||||||
(c) 2006-2007 Secret Lab Technologies Ltd
|
|
||||||
Grant Likely <grant.likely at secretlab.ca>
|
|
||||||
|
|
||||||
********** DRAFT ***********
|
|
||||||
* WARNING: Do not depend on the stability of these bindings just yet.
|
|
||||||
* The MPC5200 device tree conventions are still in flux
|
|
||||||
* Keep an eye on the linuxppc-dev mailing list for more details
|
|
||||||
********** DRAFT ***********
|
|
||||||
|
|
||||||
I - Introduction
|
|
||||||
================
|
|
||||||
Boards supported by the arch/powerpc architecture require device tree be
|
|
||||||
passed by the boot loader to the kernel at boot time. The device tree
|
|
||||||
describes what devices are present on the board and how they are
|
|
||||||
connected. The device tree can either be passed as a binary blob (as
|
|
||||||
described in Documentation/powerpc/booting-without-of.txt), or passed
|
|
||||||
by Open Firmware (IEEE 1275) compatible firmware using an OF compatible
|
|
||||||
client interface API.
|
|
||||||
|
|
||||||
This document specifies the requirements on the device-tree for mpc5200
|
|
||||||
based boards. These requirements are above and beyond the details
|
|
||||||
specified in either the Open Firmware spec or booting-without-of.txt
|
|
||||||
|
|
||||||
All new mpc5200-based boards are expected to match this document. In
|
|
||||||
cases where this document is not sufficient to support a new board port,
|
|
||||||
this document should be updated as part of adding the new board support.
|
|
||||||
|
|
||||||
II - Philosophy
|
|
||||||
===============
|
|
||||||
The core of this document is naming convention. The whole point of
|
|
||||||
defining this convention is to reduce or eliminate the number of
|
|
||||||
special cases required to support a 5200 board. If all 5200 boards
|
|
||||||
follow the same convention, then generic 5200 support code will work
|
|
||||||
rather than coding special cases for each new board.
|
|
||||||
|
|
||||||
This section tries to capture the thought process behind why the naming
|
|
||||||
convention is what it is.
|
|
||||||
|
|
||||||
1. names
|
|
||||||
---------
|
|
||||||
There is strong convention/requirements already established for children
|
|
||||||
of the root node. 'cpus' describes the processor cores, 'memory'
|
|
||||||
describes memory, and 'chosen' provides boot configuration. Other nodes
|
|
||||||
are added to describe devices attached to the processor local bus.
|
|
||||||
|
|
||||||
Following convention already established with other system-on-chip
|
|
||||||
processors, 5200 device trees should use the name 'soc5200' for the
|
|
||||||
parent node of on chip devices, and the root node should be its parent.
|
|
||||||
|
|
||||||
Child nodes are typically named after the configured function. ie.
|
|
||||||
the FEC node is named 'ethernet', and a PSC in uart mode is named 'serial'.
|
|
||||||
|
|
||||||
2. device_type property
|
|
||||||
-----------------------
|
|
||||||
similar to the node name convention above; the device_type reflects the
|
|
||||||
configured function of a device. ie. 'serial' for a uart and 'spi' for
|
|
||||||
an spi controller. However, while node names *should* reflect the
|
|
||||||
configured function, device_type *must* match the configured function
|
|
||||||
exactly.
|
|
||||||
|
|
||||||
3. compatible property
|
|
||||||
----------------------
|
|
||||||
Since device_type isn't enough to match devices to drivers, there also
|
|
||||||
needs to be a naming convention for the compatible property. Compatible
|
|
||||||
is an list of device descriptions sorted from specific to generic. For
|
|
||||||
the mpc5200, the required format for each compatible value is
|
|
||||||
<chip>-<device>[-<mode>]. The OS should be able to match a device driver
|
|
||||||
to the device based solely on the compatible value. If two drivers
|
|
||||||
match on the compatible list; the 'most compatible' driver should be
|
|
||||||
selected.
|
|
||||||
|
|
||||||
The split between the MPC5200 and the MPC5200B leaves a bit of a
|
|
||||||
conundrum. How should the compatible property be set up to provide
|
|
||||||
maximum compatibility information; but still accurately describe the
|
|
||||||
chip? For the MPC5200; the answer is easy. Most of the SoC devices
|
|
||||||
originally appeared on the MPC5200. Since they didn't exist anywhere
|
|
||||||
else; the 5200 compatible properties will contain only one item;
|
|
||||||
"mpc5200-<device>".
|
|
||||||
|
|
||||||
The 5200B is almost the same as the 5200, but not quite. It fixes
|
|
||||||
silicon bugs and it adds a small number of enhancements. Most of the
|
|
||||||
devices either provide exactly the same interface as on the 5200. A few
|
|
||||||
devices have extra functions but still have a backwards compatible mode.
|
|
||||||
To express this information as completely as possible, 5200B device trees
|
|
||||||
should have two items in the compatible list;
|
|
||||||
"mpc5200b-<device>\0mpc5200-<device>". It is *strongly* recommended
|
|
||||||
that 5200B device trees follow this convention (instead of only listing
|
|
||||||
the base mpc5200 item).
|
|
||||||
|
|
||||||
If another chip appear on the market with one of the mpc5200 SoC
|
|
||||||
devices, then the compatible list should include mpc5200-<device>.
|
|
||||||
|
|
||||||
ie. ethernet on mpc5200: compatible = "mpc5200-ethernet"
|
|
||||||
ethernet on mpc5200b: compatible = "mpc5200b-ethernet\0mpc5200-ethernet"
|
|
||||||
|
|
||||||
Modal devices, like PSCs, also append the configured function to the
|
|
||||||
end of the compatible field. ie. A PSC in i2s mode would specify
|
|
||||||
"mpc5200-psc-i2s", not "mpc5200-i2s". This convention is chosen to
|
|
||||||
avoid naming conflicts with non-psc devices providing the same
|
|
||||||
function. For example, "mpc5200-spi" and "mpc5200-psc-spi" describe
|
|
||||||
the mpc5200 simple spi device and a PSC spi mode respectively.
|
|
||||||
|
|
||||||
If the soc device is more generic and present on other SOCs, the
|
|
||||||
compatible property can specify the more generic device type also.
|
|
||||||
|
|
||||||
ie. mscan: compatible = "mpc5200-mscan\0fsl,mscan";
|
|
||||||
|
|
||||||
At the time of writing, exact chip may be either 'mpc5200' or
|
|
||||||
'mpc5200b'.
|
|
||||||
|
|
||||||
Device drivers should always try to match as generically as possible.
|
|
||||||
|
|
||||||
III - Structure
|
|
||||||
===============
|
|
||||||
The device tree for an mpc5200 board follows the structure defined in
|
|
||||||
booting-without-of.txt with the following additional notes:
|
|
||||||
|
|
||||||
0) the root node
|
|
||||||
----------------
|
|
||||||
Typical root description node; see booting-without-of
|
|
||||||
|
|
||||||
1) The cpus node
|
|
||||||
----------------
|
|
||||||
The cpus node follows the basic layout described in booting-without-of.
|
|
||||||
The bus-frequency property holds the XLB bus frequency
|
|
||||||
The clock-frequency property holds the core frequency
|
|
||||||
|
|
||||||
2) The memory node
|
|
||||||
------------------
|
|
||||||
Typical memory description node; see booting-without-of.
|
|
||||||
|
|
||||||
3) The soc5200 node
|
|
||||||
-------------------
|
|
||||||
This node describes the on chip SOC peripherals. Every mpc5200 based
|
|
||||||
board will have this node, and as such there is a common naming
|
|
||||||
convention for SOC devices.
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
name type description
|
|
||||||
---- ---- -----------
|
|
||||||
device_type string must be "soc"
|
|
||||||
ranges int should be <0 baseaddr baseaddr+10000>
|
|
||||||
reg int must be <baseaddr 10000>
|
|
||||||
compatible string mpc5200: "mpc5200-soc"
|
|
||||||
mpc5200b: "mpc5200b-soc\0mpc5200-soc"
|
|
||||||
system-frequency int Fsystem frequency; source of all
|
|
||||||
other clocks.
|
|
||||||
bus-frequency int IPB bus frequency in HZ. Clock rate
|
|
||||||
used by most of the soc devices.
|
|
||||||
#interrupt-cells int must be <3>.
|
|
||||||
|
|
||||||
Recommended properties:
|
|
||||||
name type description
|
|
||||||
---- ---- -----------
|
|
||||||
model string Exact model of the chip;
|
|
||||||
ie: model="fsl,mpc5200"
|
|
||||||
revision string Silicon revision of chip
|
|
||||||
ie: revision="M08A"
|
|
||||||
|
|
||||||
The 'model' and 'revision' properties are *strongly* recommended. Having
|
|
||||||
them presence acts as a bit of a safety net for working around as yet
|
|
||||||
undiscovered bugs on one version of silicon. For example, device drivers
|
|
||||||
can use the model and revision properties to decide if a bug fix should
|
|
||||||
be turned on.
|
|
||||||
|
|
||||||
4) soc5200 child nodes
|
|
||||||
----------------------
|
|
||||||
Any on chip SOC devices available to Linux must appear as soc5200 child nodes.
|
|
||||||
|
|
||||||
Note: The tables below show the value for the mpc5200. A mpc5200b device
|
|
||||||
tree should use the "mpc5200b-<device>\0mpc5200-<device> form.
|
|
||||||
|
|
||||||
Required soc5200 child nodes:
|
|
||||||
name device_type compatible Description
|
|
||||||
---- ----------- ---------- -----------
|
|
||||||
cdm@<addr> cdm mpc5200-cmd Clock Distribution
|
|
||||||
pic@<addr> interrupt-controller mpc5200-pic need an interrupt
|
|
||||||
controller to boot
|
|
||||||
bestcomm@<addr> dma-controller mpc5200-bestcomm 5200 pic also requires
|
|
||||||
the bestcomm device
|
|
||||||
|
|
||||||
Recommended soc5200 child nodes; populate as needed for your board
|
|
||||||
name device_type compatible Description
|
|
||||||
---- ----------- ---------- -----------
|
|
||||||
gpt@<addr> gpt fsl,mpc5200-gpt General purpose timers
|
|
||||||
gpt@<addr> gpt fsl,mpc5200-gpt-gpio General purpose
|
|
||||||
timers in GPIO mode
|
|
||||||
gpio@<addr> fsl,mpc5200-gpio MPC5200 simple gpio
|
|
||||||
controller
|
|
||||||
gpio@<addr> fsl,mpc5200-gpio-wkup MPC5200 wakeup gpio
|
|
||||||
controller
|
|
||||||
rtc@<addr> rtc mpc5200-rtc Real time clock
|
|
||||||
mscan@<addr> mscan mpc5200-mscan CAN bus controller
|
|
||||||
pci@<addr> pci mpc5200-pci PCI bridge
|
|
||||||
serial@<addr> serial mpc5200-psc-uart PSC in serial mode
|
|
||||||
i2s@<addr> sound mpc5200-psc-i2s PSC in i2s mode
|
|
||||||
ac97@<addr> sound mpc5200-psc-ac97 PSC in ac97 mode
|
|
||||||
spi@<addr> spi mpc5200-psc-spi PSC in spi mode
|
|
||||||
irda@<addr> irda mpc5200-psc-irda PSC in IrDA mode
|
|
||||||
spi@<addr> spi mpc5200-spi MPC5200 spi device
|
|
||||||
ethernet@<addr> network mpc5200-fec MPC5200 ethernet device
|
|
||||||
ata@<addr> ata mpc5200-ata IDE ATA interface
|
|
||||||
i2c@<addr> i2c mpc5200-i2c I2C controller
|
|
||||||
usb@<addr> usb-ohci-be mpc5200-ohci,ohci-be USB controller
|
|
||||||
xlb@<addr> xlb mpc5200-xlb XLB arbitrator
|
|
||||||
|
|
||||||
Important child node properties
|
|
||||||
name type description
|
|
||||||
---- ---- -----------
|
|
||||||
cell-index int When multiple devices are present, is the
|
|
||||||
index of the device in the hardware (ie. There
|
|
||||||
are 6 PSC on the 5200 numbered PSC1 to PSC6)
|
|
||||||
PSC1 has 'cell-index = <0>'
|
|
||||||
PSC4 has 'cell-index = <3>'
|
|
||||||
|
|
||||||
5) General Purpose Timer nodes (child of soc5200 node)
|
|
||||||
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'.
|
|
||||||
|
|
||||||
6) PSC nodes (child of soc5200 node)
|
|
||||||
PSC nodes can define the optional 'port-number' property to force assignment
|
|
||||||
order of serial ports. For example, PSC5 might be physically connected to
|
|
||||||
the port labeled 'COM1' and PSC1 wired to 'COM1'. In this case, PSC5 would
|
|
||||||
have a "port-number = <0>" property, and PSC1 would have "port-number = <1>".
|
|
||||||
|
|
||||||
PSC in i2s mode: The mpc5200 and mpc5200b PSCs are not compatible when in
|
|
||||||
i2s mode. An 'mpc5200b-psc-i2s' node cannot include 'mpc5200-psc-i2s' in the
|
|
||||||
compatible field.
|
|
||||||
|
|
||||||
7) GPIO controller nodes
|
|
||||||
Each GPIO controller node should have the empty property gpio-controller and
|
|
||||||
#gpio-cells set to 2. First cell is the GPIO number which is interpreted
|
|
||||||
according to the bit numbers in the GPIO control registers. The second cell
|
|
||||||
is for flags which is currently unsused.
|
|
||||||
|
|
||||||
8) FEC nodes
|
|
||||||
The FEC node can specify one of the following properties to configure
|
|
||||||
the MII link:
|
|
||||||
"fsl,7-wire-mode" - An empty property that specifies the link uses 7-wire
|
|
||||||
mode instead of MII
|
|
||||||
"current-speed" - Specifies that the MII should be configured for a fixed
|
|
||||||
speed. This property should contain two cells. The
|
|
||||||
first cell specifies the speed in Mbps and the second
|
|
||||||
should be '0' for half duplex and '1' for full duplex
|
|
||||||
"phy-handle" - Contains a phandle to an Ethernet PHY.
|
|
||||||
|
|
||||||
IV - Extra Notes
|
|
||||||
================
|
|
||||||
|
|
||||||
1. Interrupt mapping
|
|
||||||
--------------------
|
|
||||||
The mpc5200 pic driver splits hardware IRQ numbers into two levels. The
|
|
||||||
split reflects the layout of the PIC hardware itself, which groups
|
|
||||||
interrupts into one of three groups; CRIT, MAIN or PERP. Also, the
|
|
||||||
Bestcomm dma engine has it's own set of interrupt sources which are
|
|
||||||
cascaded off of peripheral interrupt 0, which the driver interprets as a
|
|
||||||
fourth group, SDMA.
|
|
||||||
|
|
||||||
The interrupts property for device nodes using the mpc5200 pic consists
|
|
||||||
of three cells; <L1 L2 level>
|
|
||||||
|
|
||||||
L1 := [CRIT=0, MAIN=1, PERP=2, SDMA=3]
|
|
||||||
L2 := interrupt number; directly mapped from the value in the
|
|
||||||
"ICTL PerStat, MainStat, CritStat Encoded Register"
|
|
||||||
level := [LEVEL_HIGH=0, EDGE_RISING=1, EDGE_FALLING=2, LEVEL_LOW=3]
|
|
||||||
|
|
||||||
2. Shared registers
|
|
||||||
-------------------
|
|
||||||
Some SoC devices share registers between them. ie. the i2c devices use
|
|
||||||
a single clock control register, and almost all device are affected by
|
|
||||||
the port_config register. Devices which need to manipulate shared regs
|
|
||||||
should look to the parent SoC node. The soc node is responsible
|
|
||||||
for arbitrating all shared register access.
|
|
|
@ -4,7 +4,7 @@ Introduction
|
||||||
============
|
============
|
||||||
|
|
||||||
The Chelsio T3 ASIC based Adapters (S310, S320, S302, S304, Mezz cards, etc.
|
The Chelsio T3 ASIC based Adapters (S310, S320, S302, S304, Mezz cards, etc.
|
||||||
series of products) supports iSCSI acceleration and iSCSI Direct Data Placement
|
series of products) support iSCSI acceleration and iSCSI Direct Data Placement
|
||||||
(DDP) where the hardware handles the expensive byte touching operations, such
|
(DDP) where the hardware handles the expensive byte touching operations, such
|
||||||
as CRC computation and verification, and direct DMA to the final host memory
|
as CRC computation and verification, and direct DMA to the final host memory
|
||||||
destination:
|
destination:
|
||||||
|
@ -31,9 +31,9 @@ destination:
|
||||||
the TCP segments onto the wire. It handles TCP retransmission if
|
the TCP segments onto the wire. It handles TCP retransmission if
|
||||||
needed.
|
needed.
|
||||||
|
|
||||||
On receving, S3 h/w recovers the iSCSI PDU by reassembling TCP
|
On receiving, S3 h/w recovers the iSCSI PDU by reassembling TCP
|
||||||
segments, separating the header and data, calculating and verifying
|
segments, separating the header and data, calculating and verifying
|
||||||
the digests, then forwards the header to the host. The payload data,
|
the digests, then forwarding the header to the host. The payload data,
|
||||||
if possible, will be directly placed into the pre-posted host DDP
|
if possible, will be directly placed into the pre-posted host DDP
|
||||||
buffer. Otherwise, the payload data will be sent to the host too.
|
buffer. Otherwise, the payload data will be sent to the host too.
|
||||||
|
|
||||||
|
@ -68,9 +68,8 @@ The following steps need to be taken to accelerates the open-iscsi initiator:
|
||||||
sure the ip address is unique in the network.
|
sure the ip address is unique in the network.
|
||||||
|
|
||||||
3. edit /etc/iscsi/iscsid.conf
|
3. edit /etc/iscsi/iscsid.conf
|
||||||
The default setting for MaxRecvDataSegmentLength (131072) is too big,
|
The default setting for MaxRecvDataSegmentLength (131072) is too big;
|
||||||
replace "node.conn[0].iscsi.MaxRecvDataSegmentLength" to be a value no
|
replace with a value no bigger than 15360 (for example 8192):
|
||||||
bigger than 15360 (for example 8192):
|
|
||||||
|
|
||||||
node.conn[0].iscsi.MaxRecvDataSegmentLength = 8192
|
node.conn[0].iscsi.MaxRecvDataSegmentLength = 8192
|
||||||
|
|
||||||
|
|
|
@ -78,12 +78,10 @@ to view your kernel log and look for "mmiotrace has lost events" warning. If
|
||||||
events were lost, the trace is incomplete. You should enlarge the buffers and
|
events were lost, the trace is incomplete. You should enlarge the buffers and
|
||||||
try again. Buffers are enlarged by first seeing how large the current buffers
|
try again. Buffers are enlarged by first seeing how large the current buffers
|
||||||
are:
|
are:
|
||||||
$ cat /debug/tracing/trace_entries
|
$ cat /debug/tracing/buffer_size_kb
|
||||||
gives you a number. Approximately double this number and write it back, for
|
gives you a number. Approximately double this number and write it back, for
|
||||||
instance:
|
instance:
|
||||||
$ echo 0 > /debug/tracing/tracing_enabled
|
$ echo 128000 > /debug/tracing/buffer_size_kb
|
||||||
$ echo 128000 > /debug/tracing/trace_entries
|
|
||||||
$ echo 1 > /debug/tracing/tracing_enabled
|
|
||||||
Then start again from the top.
|
Then start again from the top.
|
||||||
|
|
||||||
If you are doing a trace for a driver project, e.g. Nouveau, you should also
|
If you are doing a trace for a driver project, e.g. Nouveau, you should also
|
||||||
|
|
|
@ -4,12 +4,21 @@
|
||||||
*
|
*
|
||||||
* Compile with:
|
* Compile with:
|
||||||
* gcc -s -Wall -Wstrict-prototypes v4lgrab.c -o v4lgrab
|
* gcc -s -Wall -Wstrict-prototypes v4lgrab.c -o v4lgrab
|
||||||
* Use as:
|
* Use as:
|
||||||
* v4lgrab >image.ppm
|
* v4lgrab >image.ppm
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998-05-03, Phil Blundell <philb@gnu.org>
|
* Copyright (C) 1998-05-03, Phil Blundell <philb@gnu.org>
|
||||||
* Copied from http://www.tazenda.demon.co.uk/phil/vgrabber.c
|
* Copied from http://www.tazenda.demon.co.uk/phil/vgrabber.c
|
||||||
* with minor modifications (Dave Forrest, drf5n@virginia.edu).
|
* with minor modifications (Dave Forrest, drf5n@virginia.edu).
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* For some cameras you may need to pre-load libv4l to perform
|
||||||
|
* the necessary decompression, e.g.:
|
||||||
|
*
|
||||||
|
* export LD_PRELOAD=/usr/lib/libv4l/v4l1compat.so
|
||||||
|
* ./v4lgrab >image.ppm
|
||||||
|
*
|
||||||
|
* see http://hansdegoede.livejournal.com/3636.html for details.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -24,7 +33,7 @@
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/videodev.h>
|
#include <linux/videodev.h>
|
||||||
|
|
||||||
#define FILE "/dev/video0"
|
#define VIDEO_DEV "/dev/video0"
|
||||||
|
|
||||||
/* Stole this from tvset.c */
|
/* Stole this from tvset.c */
|
||||||
|
|
||||||
|
@ -90,7 +99,7 @@ int get_brightness_adj(unsigned char *image, long size, int *brightness) {
|
||||||
|
|
||||||
int main(int argc, char ** argv)
|
int main(int argc, char ** argv)
|
||||||
{
|
{
|
||||||
int fd = open(FILE, O_RDONLY), f;
|
int fd = open(VIDEO_DEV, O_RDONLY), f;
|
||||||
struct video_capability cap;
|
struct video_capability cap;
|
||||||
struct video_window win;
|
struct video_window win;
|
||||||
struct video_picture vpic;
|
struct video_picture vpic;
|
||||||
|
@ -100,13 +109,13 @@ int main(int argc, char ** argv)
|
||||||
unsigned int i, src_depth;
|
unsigned int i, src_depth;
|
||||||
|
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
perror(FILE);
|
perror(VIDEO_DEV);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ioctl(fd, VIDIOCGCAP, &cap) < 0) {
|
if (ioctl(fd, VIDIOCGCAP, &cap) < 0) {
|
||||||
perror("VIDIOGCAP");
|
perror("VIDIOGCAP");
|
||||||
fprintf(stderr, "(" FILE " not a video4linux device?)\n");
|
fprintf(stderr, "(" VIDEO_DEV " not a video4linux device?)\n");
|
||||||
close(fd);
|
close(fd);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
77
MAINTAINERS
77
MAINTAINERS
|
@ -692,6 +692,13 @@ M: kernel@wantstofly.org
|
||||||
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
ARM/NUVOTON W90X900 ARM ARCHITECTURE
|
||||||
|
P: Wan ZongShun
|
||||||
|
M: mcuos.com@gmail.com
|
||||||
|
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
||||||
|
W: http://www.mcuos.com
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
ARPD SUPPORT
|
ARPD SUPPORT
|
||||||
P: Jonathan Layes
|
P: Jonathan Layes
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
|
@ -911,7 +918,7 @@ S: Maintained
|
||||||
BLACKFIN ARCHITECTURE
|
BLACKFIN ARCHITECTURE
|
||||||
P: Bryan Wu
|
P: Bryan Wu
|
||||||
M: cooloney@kernel.org
|
M: cooloney@kernel.org
|
||||||
L: uclinux-dist-devel@blackfin.uclinux.org (subscribers-only)
|
L: uclinux-dist-devel@blackfin.uclinux.org
|
||||||
W: http://blackfin.uclinux.org
|
W: http://blackfin.uclinux.org
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
|
@ -1021,6 +1028,14 @@ M: mb@bu3sch.de
|
||||||
W: http://bu3sch.de/btgpio.php
|
W: http://bu3sch.de/btgpio.php
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
BTRFS FILE SYSTEM
|
||||||
|
P: Chris Mason
|
||||||
|
M: chris.mason@oracle.com
|
||||||
|
L: linux-btrfs@vger.kernel.org
|
||||||
|
W: http://btrfs.wiki.kernel.org/
|
||||||
|
T: git kernel.org:/pub/scm/linux/kernel/git/mason/btrfs-unstable.git
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
BTTV VIDEO4LINUX DRIVER
|
BTTV VIDEO4LINUX DRIVER
|
||||||
P: Mauro Carvalho Chehab
|
P: Mauro Carvalho Chehab
|
||||||
M: mchehab@infradead.org
|
M: mchehab@infradead.org
|
||||||
|
@ -1194,6 +1209,8 @@ S: Supported
|
||||||
CONTROL GROUPS (CGROUPS)
|
CONTROL GROUPS (CGROUPS)
|
||||||
P: Paul Menage
|
P: Paul Menage
|
||||||
M: menage@google.com
|
M: menage@google.com
|
||||||
|
P: Li Zefan
|
||||||
|
M: lizf@cn.fujitsu.com
|
||||||
L: containers@lists.linux-foundation.org
|
L: containers@lists.linux-foundation.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
@ -1452,8 +1469,6 @@ L: linux-acpi@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
DOCUMENTATION (/Documentation directory)
|
DOCUMENTATION (/Documentation directory)
|
||||||
P: Michael Kerrisk
|
|
||||||
M: mtk.manpages@gmail.com
|
|
||||||
P: Randy Dunlap
|
P: Randy Dunlap
|
||||||
M: rdunlap@xenotime.net
|
M: rdunlap@xenotime.net
|
||||||
L: linux-doc@vger.kernel.org
|
L: linux-doc@vger.kernel.org
|
||||||
|
@ -1895,10 +1910,10 @@ W: http://gigaset307x.sourceforge.net/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
HARD DRIVE ACTIVE PROTECTION SYSTEM (HDAPS) DRIVER
|
HARD DRIVE ACTIVE PROTECTION SYSTEM (HDAPS) DRIVER
|
||||||
P: Robert Love
|
P: Frank Seidel
|
||||||
M: rlove@rlove.org
|
M: frank@f-seidel.de
|
||||||
M: linux-kernel@vger.kernel.org
|
L: lm-sensors@lm-sensors.org
|
||||||
W: http://www.kernel.org/pub/linux/kernel/people/rml/hdaps/
|
W: http://www.kernel.org/pub/linux/kernel/people/fseidel/hdaps/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
GSPCA FINEPIX SUBDRIVER
|
GSPCA FINEPIX SUBDRIVER
|
||||||
|
@ -1991,7 +2006,7 @@ S: Maintained
|
||||||
|
|
||||||
HIBERNATION (aka Software Suspend, aka swsusp)
|
HIBERNATION (aka Software Suspend, aka swsusp)
|
||||||
P: Pavel Machek
|
P: Pavel Machek
|
||||||
M: pavel@suse.cz
|
M: pavel@ucw.cz
|
||||||
P: Rafael J. Wysocki
|
P: Rafael J. Wysocki
|
||||||
M: rjw@sisk.pl
|
M: rjw@sisk.pl
|
||||||
L: linux-pm@lists.linux-foundation.org
|
L: linux-pm@lists.linux-foundation.org
|
||||||
|
@ -2212,7 +2227,7 @@ P: Sean Hefty
|
||||||
M: sean.hefty@intel.com
|
M: sean.hefty@intel.com
|
||||||
P: Hal Rosenstock
|
P: Hal Rosenstock
|
||||||
M: hal.rosenstock@gmail.com
|
M: hal.rosenstock@gmail.com
|
||||||
L: general@lists.openfabrics.org
|
L: general@lists.openfabrics.org (moderated for non-subscribers)
|
||||||
W: http://www.openib.org/
|
W: http://www.openib.org/
|
||||||
T: git kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git
|
T: git kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git
|
||||||
S: Supported
|
S: Supported
|
||||||
|
@ -2447,7 +2462,7 @@ S: Maintained
|
||||||
|
|
||||||
ISDN SUBSYSTEM
|
ISDN SUBSYSTEM
|
||||||
P: Karsten Keil
|
P: Karsten Keil
|
||||||
M: kkeil@suse.de
|
M: isdn@linux-pingi.de
|
||||||
L: isdn4linux@listserv.isdn4linux.de (subscribers-only)
|
L: isdn4linux@listserv.isdn4linux.de (subscribers-only)
|
||||||
W: http://www.isdn4linux.de
|
W: http://www.isdn4linux.de
|
||||||
T: git kernel.org:/pub/scm/linux/kernel/kkeil/isdn-2.6.git
|
T: git kernel.org:/pub/scm/linux/kernel/kkeil/isdn-2.6.git
|
||||||
|
@ -2836,8 +2851,6 @@ S: Maintained
|
||||||
MAC80211
|
MAC80211
|
||||||
P: Johannes Berg
|
P: Johannes Berg
|
||||||
M: johannes@sipsolutions.net
|
M: johannes@sipsolutions.net
|
||||||
P: Michael Wu
|
|
||||||
M: flamingice@sourmilk.net
|
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
W: http://linuxwireless.org/
|
W: http://linuxwireless.org/
|
||||||
T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git
|
T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git
|
||||||
|
@ -2864,7 +2877,7 @@ P: Michael Kerrisk
|
||||||
M: mtk.manpages@gmail.com
|
M: mtk.manpages@gmail.com
|
||||||
W: http://www.kernel.org/doc/man-pages
|
W: http://www.kernel.org/doc/man-pages
|
||||||
L: linux-man@vger.kernel.org
|
L: linux-man@vger.kernel.org
|
||||||
S: Supported
|
S: Maintained
|
||||||
|
|
||||||
MARVELL LIBERTAS WIRELESS DRIVER
|
MARVELL LIBERTAS WIRELESS DRIVER
|
||||||
P: Dan Williams
|
P: Dan Williams
|
||||||
|
@ -3319,8 +3332,8 @@ P: Jeremy Fitzhardinge
|
||||||
M: jeremy@xensource.com
|
M: jeremy@xensource.com
|
||||||
P: Chris Wright
|
P: Chris Wright
|
||||||
M: chrisw@sous-sol.org
|
M: chrisw@sous-sol.org
|
||||||
P: Zachary Amsden
|
P: Alok Kataria
|
||||||
M: zach@vmware.com
|
M: akataria@vmware.com
|
||||||
P: Rusty Russell
|
P: Rusty Russell
|
||||||
M: rusty@rustcorp.com.au
|
M: rusty@rustcorp.com.au
|
||||||
L: virtualization@lists.osdl.org
|
L: virtualization@lists.osdl.org
|
||||||
|
@ -3337,10 +3350,8 @@ S: Maintained
|
||||||
PARISC ARCHITECTURE
|
PARISC ARCHITECTURE
|
||||||
P: Kyle McMartin
|
P: Kyle McMartin
|
||||||
M: kyle@mcmartin.ca
|
M: kyle@mcmartin.ca
|
||||||
P: Matthew Wilcox
|
P: Helge Deller
|
||||||
M: matthew@wil.cx
|
M: deller@gmx.de
|
||||||
P: Grant Grundler
|
|
||||||
M: grundler@parisc-linux.org
|
|
||||||
L: linux-parisc@vger.kernel.org
|
L: linux-parisc@vger.kernel.org
|
||||||
W: http://www.parisc-linux.org/
|
W: http://www.parisc-linux.org/
|
||||||
T: git kernel.org:/pub/scm/linux/kernel/git/kyle/parisc-2.6.git
|
T: git kernel.org:/pub/scm/linux/kernel/git/kyle/parisc-2.6.git
|
||||||
|
@ -3531,6 +3542,12 @@ S: Maintained
|
||||||
PXA MMCI DRIVER
|
PXA MMCI DRIVER
|
||||||
S: Orphan
|
S: Orphan
|
||||||
|
|
||||||
|
PXA RTC DRIVER
|
||||||
|
P: Robert Jarzmik
|
||||||
|
M: robert.jarzmik@free.fr
|
||||||
|
L: rtc-linux@googlegroups.com
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
QLOGIC QLA2XXX FC-SCSI DRIVER
|
QLOGIC QLA2XXX FC-SCSI DRIVER
|
||||||
P: Andrew Vasquez
|
P: Andrew Vasquez
|
||||||
M: linux-driver@qlogic.com
|
M: linux-driver@qlogic.com
|
||||||
|
@ -3859,6 +3876,15 @@ L: linux-ide@vger.kernel.org
|
||||||
T: git kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev.git
|
T: git kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev.git
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
|
SERVER ENGINES 10Gbps NIC - BladeEngine 2 DRIVER
|
||||||
|
P: Sathya Perla
|
||||||
|
M: sathyap@serverengines.com
|
||||||
|
P: Subbu Seetharaman
|
||||||
|
M: subbus@serverengines.com
|
||||||
|
L: netdev@vger.kernel.org
|
||||||
|
W: http://www.serverengines.com
|
||||||
|
S: Supported
|
||||||
|
|
||||||
SFC NETWORK DRIVER
|
SFC NETWORK DRIVER
|
||||||
P: Steve Hodgson
|
P: Steve Hodgson
|
||||||
P: Ben Hutchings
|
P: Ben Hutchings
|
||||||
|
@ -4158,7 +4184,7 @@ SUSPEND TO RAM
|
||||||
P: Len Brown
|
P: Len Brown
|
||||||
M: len.brown@intel.com
|
M: len.brown@intel.com
|
||||||
P: Pavel Machek
|
P: Pavel Machek
|
||||||
M: pavel@suse.cz
|
M: pavel@ucw.cz
|
||||||
P: Rafael J. Wysocki
|
P: Rafael J. Wysocki
|
||||||
M: rjw@sisk.pl
|
M: rjw@sisk.pl
|
||||||
L: linux-pm@lists.linux-foundation.org
|
L: linux-pm@lists.linux-foundation.org
|
||||||
|
@ -4279,8 +4305,8 @@ P: Rajiv Andrade
|
||||||
M: srajiv@linux.vnet.ibm.com
|
M: srajiv@linux.vnet.ibm.com
|
||||||
W: http://tpmdd.sourceforge.net
|
W: http://tpmdd.sourceforge.net
|
||||||
P: Marcel Selhorst
|
P: Marcel Selhorst
|
||||||
M: tpm@selhorst.net
|
M: m.selhorst@sirrix.com
|
||||||
W: http://www.prosec.rub.de/tpm/
|
W: http://www.sirrix.com
|
||||||
L: tpmdd-devel@lists.sourceforge.net (moderated for non-subscribers)
|
L: tpmdd-devel@lists.sourceforge.net (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
@ -4843,6 +4869,7 @@ P: Ingo Molnar
|
||||||
M: mingo@redhat.com
|
M: mingo@redhat.com
|
||||||
P: H. Peter Anvin
|
P: H. Peter Anvin
|
||||||
M: hpa@zytor.com
|
M: hpa@zytor.com
|
||||||
|
M: x86@kernel.org
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
T: git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86.git
|
T: git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -4909,11 +4936,11 @@ L: zd1211-devs@lists.sourceforge.net (subscribers-only)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
ZR36067 VIDEO FOR LINUX DRIVER
|
ZR36067 VIDEO FOR LINUX DRIVER
|
||||||
P: Ronald Bultje
|
|
||||||
M: rbultje@ronald.bitfreak.net
|
|
||||||
L: mjpeg-users@lists.sourceforge.net
|
L: mjpeg-users@lists.sourceforge.net
|
||||||
|
L: linux-media@vger.kernel.org
|
||||||
W: http://mjpeg.sourceforge.net/driver-zoran/
|
W: http://mjpeg.sourceforge.net/driver-zoran/
|
||||||
S: Maintained
|
T: Mercurial http://linuxtv.org/hg/v4l-dvb
|
||||||
|
S: Odd Fixes
|
||||||
|
|
||||||
ZS DECSTATION Z85C30 SERIAL DRIVER
|
ZS DECSTATION Z85C30 SERIAL DRIVER
|
||||||
P: Maciej W. Rozycki
|
P: Maciej W. Rozycki
|
||||||
|
|
30
Makefile
30
Makefile
|
@ -1,8 +1,8 @@
|
||||||
VERSION = 2
|
VERSION = 2
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 29
|
SUBLEVEL = 29
|
||||||
EXTRAVERSION = -rc3
|
EXTRAVERSION =
|
||||||
NAME = Erotic Pickled Herring
|
NAME = Temporary Tasmanian Devil
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
# To see a list of typical targets execute "make help"
|
# To see a list of typical targets execute "make help"
|
||||||
|
@ -389,6 +389,7 @@ PHONY += outputmakefile
|
||||||
# output directory.
|
# output directory.
|
||||||
outputmakefile:
|
outputmakefile:
|
||||||
ifneq ($(KBUILD_SRC),)
|
ifneq ($(KBUILD_SRC),)
|
||||||
|
$(Q)ln -fsn $(srctree) source
|
||||||
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \
|
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \
|
||||||
$(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
|
$(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
|
||||||
endif
|
endif
|
||||||
|
@ -565,6 +566,12 @@ KBUILD_CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)
|
||||||
# disable pointer signed / unsigned warnings in gcc 4.0
|
# disable pointer signed / unsigned warnings in gcc 4.0
|
||||||
KBUILD_CFLAGS += $(call cc-option,-Wno-pointer-sign,)
|
KBUILD_CFLAGS += $(call cc-option,-Wno-pointer-sign,)
|
||||||
|
|
||||||
|
# disable invalid "can't wrap" optimzations for signed / pointers
|
||||||
|
KBUILD_CFLAGS += $(call cc-option,-fwrapv)
|
||||||
|
|
||||||
|
# revert to pre-gcc-4.4 behaviour of .eh_frame
|
||||||
|
KBUILD_CFLAGS += $(call cc-option,-fno-dwarf2-cfi-asm)
|
||||||
|
|
||||||
# Add user supplied CPPFLAGS, AFLAGS and CFLAGS as the last assignments
|
# Add user supplied CPPFLAGS, AFLAGS and CFLAGS as the last assignments
|
||||||
# But warn user when we do so
|
# But warn user when we do so
|
||||||
warn-assign = \
|
warn-assign = \
|
||||||
|
@ -903,12 +910,18 @@ localver = $(subst $(space),, $(string) \
|
||||||
# and if the SCM is know a tag from the SCM is appended.
|
# and if the SCM is know a tag from the SCM is appended.
|
||||||
# The appended tag is determined by the SCM used.
|
# The appended tag is determined by the SCM used.
|
||||||
#
|
#
|
||||||
# Currently, only git is supported.
|
# .scmversion is used when generating rpm packages so we do not loose
|
||||||
# Other SCMs can edit scripts/setlocalversion and add the appropriate
|
# the version information from the SCM when we do the build of the kernel
|
||||||
# checks as needed.
|
# from the copied source
|
||||||
ifdef CONFIG_LOCALVERSION_AUTO
|
ifdef CONFIG_LOCALVERSION_AUTO
|
||||||
_localver-auto = $(shell $(CONFIG_SHELL) \
|
|
||||||
$(srctree)/scripts/setlocalversion $(srctree))
|
ifeq ($(wildcard .scmversion),)
|
||||||
|
_localver-auto = $(shell $(CONFIG_SHELL) \
|
||||||
|
$(srctree)/scripts/setlocalversion $(srctree))
|
||||||
|
else
|
||||||
|
_localver-auto = $(shell cat .scmversion 2> /dev/null)
|
||||||
|
endif
|
||||||
|
|
||||||
localver-auto = $(LOCALVERSION)$(_localver-auto)
|
localver-auto = $(LOCALVERSION)$(_localver-auto)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -946,7 +959,6 @@ ifneq ($(KBUILD_SRC),)
|
||||||
mkdir -p include2; \
|
mkdir -p include2; \
|
||||||
ln -fsn $(srctree)/include/asm-$(SRCARCH) include2/asm; \
|
ln -fsn $(srctree)/include/asm-$(SRCARCH) include2/asm; \
|
||||||
fi
|
fi
|
||||||
ln -fsn $(srctree) source
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# prepare2 creates a makefile if using a separate output directory
|
# prepare2 creates a makefile if using a separate output directory
|
||||||
|
@ -1537,7 +1549,7 @@ quiet_cmd_depmod = DEPMOD $(KERNELRELEASE)
|
||||||
cmd_depmod = \
|
cmd_depmod = \
|
||||||
if [ -r System.map -a -x $(DEPMOD) ]; then \
|
if [ -r System.map -a -x $(DEPMOD) ]; then \
|
||||||
$(DEPMOD) -ae -F System.map \
|
$(DEPMOD) -ae -F System.map \
|
||||||
$(if $(strip $(INSTALL_MOD_PATH)), -b $(INSTALL_MOD_PATH) -r) \
|
$(if $(strip $(INSTALL_MOD_PATH)), -b $(INSTALL_MOD_PATH) ) \
|
||||||
$(KERNELRELEASE); \
|
$(KERNELRELEASE); \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
2
README
2
README
|
@ -188,7 +188,7 @@ CONFIGURING the kernel:
|
||||||
values to random values.
|
values to random values.
|
||||||
|
|
||||||
You can find more information on using the Linux kernel config tools
|
You can find more information on using the Linux kernel config tools
|
||||||
in Documentation/kbuild/make-configs.txt.
|
in Documentation/kbuild/kconfig.txt.
|
||||||
|
|
||||||
NOTES on "make config":
|
NOTES on "make config":
|
||||||
- having unnecessary drivers will make the kernel bigger, and can
|
- having unnecessary drivers will make the kernel bigger, and can
|
||||||
|
|
|
@ -8,12 +8,12 @@
|
||||||
|
|
||||||
/* ??? Would be nice to use .gprel32 here, but we can't be sure that the
|
/* ??? Would be nice to use .gprel32 here, but we can't be sure that the
|
||||||
function loaded the GP, so this could fail in modules. */
|
function loaded the GP, so this could fail in modules. */
|
||||||
#define BUG() { \
|
#define BUG() do { \
|
||||||
__asm__ __volatile__( \
|
__asm__ __volatile__( \
|
||||||
"call_pal %0 # bugchk\n\t" \
|
"call_pal %0 # bugchk\n\t" \
|
||||||
".long %1\n\t.8byte %2" \
|
".long %1\n\t.8byte %2" \
|
||||||
: : "i"(PAL_bugchk), "i"(__LINE__), "i"(__FILE__)); \
|
: : "i"(PAL_bugchk), "i"(__LINE__), "i"(__FILE__)); \
|
||||||
for ( ; ; ); }
|
for ( ; ; ); } while (0)
|
||||||
|
|
||||||
#define HAVE_ARCH_BUG
|
#define HAVE_ARCH_BUG
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -93,8 +93,8 @@ common_shutdown_1(void *generic_ptr)
|
||||||
if (cpuid != boot_cpuid) {
|
if (cpuid != boot_cpuid) {
|
||||||
flags |= 0x00040000UL; /* "remain halted" */
|
flags |= 0x00040000UL; /* "remain halted" */
|
||||||
*pflags = flags;
|
*pflags = flags;
|
||||||
cpu_clear(cpuid, cpu_present_map);
|
set_cpu_present(cpuid, false);
|
||||||
cpu_clear(cpuid, cpu_possible_map);
|
set_cpu_possible(cpuid, false);
|
||||||
halt();
|
halt();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -120,8 +120,8 @@ common_shutdown_1(void *generic_ptr)
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
/* Wait for the secondaries to halt. */
|
/* Wait for the secondaries to halt. */
|
||||||
cpu_clear(boot_cpuid, cpu_present_map);
|
set_cpu_present(boot_cpuid, false);
|
||||||
cpu_clear(boot_cpuid, cpu_possible_map);
|
set_cpu_possible(boot_cpuid, false);
|
||||||
while (cpus_weight(cpu_present_map))
|
while (cpus_weight(cpu_present_map))
|
||||||
barrier();
|
barrier();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -120,12 +120,12 @@ void __cpuinit
|
||||||
smp_callin(void)
|
smp_callin(void)
|
||||||
{
|
{
|
||||||
int cpuid = hard_smp_processor_id();
|
int cpuid = hard_smp_processor_id();
|
||||||
cpumask_t mask = cpu_online_map;
|
|
||||||
|
|
||||||
if (cpu_test_and_set(cpuid, mask)) {
|
if (cpu_online(cpuid)) {
|
||||||
printk("??, cpu 0x%x already present??\n", cpuid);
|
printk("??, cpu 0x%x already present??\n", cpuid);
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
|
set_cpu_online(cpuid, true);
|
||||||
|
|
||||||
/* Turn on machine checks. */
|
/* Turn on machine checks. */
|
||||||
wrmces(7);
|
wrmces(7);
|
||||||
|
@ -436,8 +436,8 @@ setup_smp(void)
|
||||||
((char *)cpubase + i*hwrpb->processor_size);
|
((char *)cpubase + i*hwrpb->processor_size);
|
||||||
if ((cpu->flags & 0x1cc) == 0x1cc) {
|
if ((cpu->flags & 0x1cc) == 0x1cc) {
|
||||||
smp_num_probed++;
|
smp_num_probed++;
|
||||||
cpu_set(i, cpu_possible_map);
|
set_cpu_possible(i, true);
|
||||||
cpu_set(i, cpu_present_map);
|
set_cpu_present(i, true);
|
||||||
cpu->pal_revision = boot_cpu_palrev;
|
cpu->pal_revision = boot_cpu_palrev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -470,8 +470,8 @@ smp_prepare_cpus(unsigned int max_cpus)
|
||||||
|
|
||||||
/* Nothing to do on a UP box, or when told not to. */
|
/* Nothing to do on a UP box, or when told not to. */
|
||||||
if (smp_num_probed == 1 || max_cpus == 0) {
|
if (smp_num_probed == 1 || max_cpus == 0) {
|
||||||
cpu_possible_map = cpumask_of_cpu(boot_cpuid);
|
init_cpu_possible(cpumask_of(boot_cpuid));
|
||||||
cpu_present_map = cpumask_of_cpu(boot_cpuid);
|
init_cpu_present(cpumask_of(boot_cpuid));
|
||||||
printk(KERN_INFO "SMP mode deactivated.\n");
|
printk(KERN_INFO "SMP mode deactivated.\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -608,7 +608,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y
|
||||||
# Watchdog Device Drivers
|
# Watchdog Device Drivers
|
||||||
#
|
#
|
||||||
# CONFIG_SOFT_WATCHDOG is not set
|
# CONFIG_SOFT_WATCHDOG is not set
|
||||||
CONFIG_AT91SAM9_WATCHDOG=y
|
CONFIG_AT91SAM9X_WATCHDOG=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# USB-based Watchdog Cards
|
# USB-based Watchdog Cards
|
||||||
|
|
|
@ -700,7 +700,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y
|
||||||
# Watchdog Device Drivers
|
# Watchdog Device Drivers
|
||||||
#
|
#
|
||||||
# CONFIG_SOFT_WATCHDOG is not set
|
# CONFIG_SOFT_WATCHDOG is not set
|
||||||
CONFIG_AT91SAM9_WATCHDOG=y
|
CONFIG_AT91SAM9X_WATCHDOG=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# USB-based Watchdog Cards
|
# USB-based Watchdog Cards
|
||||||
|
|
|
@ -710,7 +710,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y
|
||||||
# Watchdog Device Drivers
|
# Watchdog Device Drivers
|
||||||
#
|
#
|
||||||
# CONFIG_SOFT_WATCHDOG is not set
|
# CONFIG_SOFT_WATCHDOG is not set
|
||||||
CONFIG_AT91SAM9_WATCHDOG=y
|
CONFIG_AT91SAM9X_WATCHDOG=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# USB-based Watchdog Cards
|
# USB-based Watchdog Cards
|
||||||
|
|
|
@ -606,7 +606,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y
|
||||||
# Watchdog Device Drivers
|
# Watchdog Device Drivers
|
||||||
#
|
#
|
||||||
# CONFIG_SOFT_WATCHDOG is not set
|
# CONFIG_SOFT_WATCHDOG is not set
|
||||||
CONFIG_AT91SAM9_WATCHDOG=y
|
CONFIG_AT91SAM9X_WATCHDOG=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# Sonics Silicon Backplane
|
# Sonics Silicon Backplane
|
||||||
|
|
|
@ -727,7 +727,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y
|
||||||
# Watchdog Device Drivers
|
# Watchdog Device Drivers
|
||||||
#
|
#
|
||||||
# CONFIG_SOFT_WATCHDOG is not set
|
# CONFIG_SOFT_WATCHDOG is not set
|
||||||
# CONFIG_AT91SAM9_WATCHDOG is not set
|
# CONFIG_AT91SAM9X_WATCHDOG is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# USB-based Watchdog Cards
|
# USB-based Watchdog Cards
|
||||||
|
|
|
@ -74,9 +74,9 @@ EXPORT_SYMBOL(elf_set_personality);
|
||||||
*/
|
*/
|
||||||
int arm_elf_read_implies_exec(const struct elf32_hdr *x, int executable_stack)
|
int arm_elf_read_implies_exec(const struct elf32_hdr *x, int executable_stack)
|
||||||
{
|
{
|
||||||
if (executable_stack != EXSTACK_ENABLE_X)
|
if (executable_stack != EXSTACK_DISABLE_X)
|
||||||
return 1;
|
return 1;
|
||||||
if (cpu_architecture() <= CPU_ARCH_ARMv6)
|
if (cpu_architecture() < CPU_ARCH_ARMv6)
|
||||||
return 1;
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -650,6 +650,7 @@ ENTRY(fp_enter)
|
||||||
no_fp: mov pc, lr
|
no_fp: mov pc, lr
|
||||||
|
|
||||||
__und_usr_unknown:
|
__und_usr_unknown:
|
||||||
|
enable_irq
|
||||||
mov r0, sp
|
mov r0, sp
|
||||||
adr lr, ret_from_exception
|
adr lr, ret_from_exception
|
||||||
b do_undefinstr
|
b do_undefinstr
|
||||||
|
|
|
@ -111,6 +111,7 @@ ENTRY(mcount)
|
||||||
.globl mcount_call
|
.globl mcount_call
|
||||||
mcount_call:
|
mcount_call:
|
||||||
bl ftrace_stub
|
bl ftrace_stub
|
||||||
|
ldr lr, [fp, #-4] @ restore lr
|
||||||
ldmia sp!, {r0-r3, pc}
|
ldmia sp!, {r0-r3, pc}
|
||||||
|
|
||||||
ENTRY(ftrace_caller)
|
ENTRY(ftrace_caller)
|
||||||
|
@ -122,6 +123,7 @@ ENTRY(ftrace_caller)
|
||||||
.globl ftrace_call
|
.globl ftrace_call
|
||||||
ftrace_call:
|
ftrace_call:
|
||||||
bl ftrace_stub
|
bl ftrace_stub
|
||||||
|
ldr lr, [fp, #-4] @ restore lr
|
||||||
ldmia sp!, {r0-r3, pc}
|
ldmia sp!, {r0-r3, pc}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
@ -133,14 +135,16 @@ ENTRY(mcount)
|
||||||
adr r0, ftrace_stub
|
adr r0, ftrace_stub
|
||||||
cmp r0, r2
|
cmp r0, r2
|
||||||
bne trace
|
bne trace
|
||||||
|
ldr lr, [fp, #-4] @ restore lr
|
||||||
ldmia sp!, {r0-r3, pc}
|
ldmia sp!, {r0-r3, pc}
|
||||||
|
|
||||||
trace:
|
trace:
|
||||||
ldr r1, [fp, #-4]
|
ldr r1, [fp, #-4] @ lr of instrumented routine
|
||||||
mov r0, lr
|
mov r0, lr
|
||||||
sub r0, r0, #MCOUNT_INSN_SIZE
|
sub r0, r0, #MCOUNT_INSN_SIZE
|
||||||
mov lr, pc
|
mov lr, pc
|
||||||
mov pc, r2
|
mov pc, r2
|
||||||
|
mov lr, r1 @ restore lr
|
||||||
ldmia sp!, {r0-r3, pc}
|
ldmia sp!, {r0-r3, pc}
|
||||||
|
|
||||||
#endif /* CONFIG_DYNAMIC_FTRACE */
|
#endif /* CONFIG_DYNAMIC_FTRACE */
|
||||||
|
|
|
@ -88,7 +88,7 @@ void set_fiq_handler(void *start, unsigned int length)
|
||||||
* disable irqs for the duration. Note - these functions are almost
|
* disable irqs for the duration. Note - these functions are almost
|
||||||
* entirely coded in assembly.
|
* entirely coded in assembly.
|
||||||
*/
|
*/
|
||||||
void __attribute__((naked)) set_fiq_regs(struct pt_regs *regs)
|
void __naked set_fiq_regs(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
register unsigned long tmp;
|
register unsigned long tmp;
|
||||||
asm volatile (
|
asm volatile (
|
||||||
|
@ -106,7 +106,7 @@ void __attribute__((naked)) set_fiq_regs(struct pt_regs *regs)
|
||||||
: "r" (®s->ARM_r8), "I" (PSR_I_BIT | PSR_F_BIT | FIQ_MODE));
|
: "r" (®s->ARM_r8), "I" (PSR_I_BIT | PSR_F_BIT | FIQ_MODE));
|
||||||
}
|
}
|
||||||
|
|
||||||
void __attribute__((naked)) get_fiq_regs(struct pt_regs *regs)
|
void __naked get_fiq_regs(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
register unsigned long tmp;
|
register unsigned long tmp;
|
||||||
asm volatile (
|
asm volatile (
|
||||||
|
|
|
@ -101,7 +101,7 @@ unlock:
|
||||||
/* Handle bad interrupts */
|
/* Handle bad interrupts */
|
||||||
static struct irq_desc bad_irq_desc = {
|
static struct irq_desc bad_irq_desc = {
|
||||||
.handle_irq = handle_bad_irq,
|
.handle_irq = handle_bad_irq,
|
||||||
.lock = SPIN_LOCK_UNLOCKED
|
.lock = __SPIN_LOCK_UNLOCKED(bad_irq_desc.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -13,8 +13,8 @@
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
|
|
||||||
const extern unsigned char relocate_new_kernel[];
|
extern const unsigned char relocate_new_kernel[];
|
||||||
const extern unsigned int relocate_new_kernel_size;
|
extern const unsigned int relocate_new_kernel_size;
|
||||||
|
|
||||||
extern void setup_mm_for_reboot(char mode);
|
extern void setup_mm_for_reboot(char mode);
|
||||||
|
|
||||||
|
|
|
@ -233,12 +233,13 @@ static void __init cacheid_init(void)
|
||||||
unsigned int cachetype = read_cpuid_cachetype();
|
unsigned int cachetype = read_cpuid_cachetype();
|
||||||
unsigned int arch = cpu_architecture();
|
unsigned int arch = cpu_architecture();
|
||||||
|
|
||||||
if (arch >= CPU_ARCH_ARMv7) {
|
if (arch >= CPU_ARCH_ARMv6) {
|
||||||
cacheid = CACHEID_VIPT_NONALIASING;
|
if ((cachetype & (7 << 29)) == 4 << 29) {
|
||||||
if ((cachetype & (3 << 14)) == 1 << 14)
|
/* ARMv7 register format */
|
||||||
cacheid |= CACHEID_ASID_TAGGED;
|
cacheid = CACHEID_VIPT_NONALIASING;
|
||||||
} else if (arch >= CPU_ARCH_ARMv6) {
|
if ((cachetype & (3 << 14)) == 1 << 14)
|
||||||
if (cachetype & (1 << 23))
|
cacheid |= CACHEID_ASID_TAGGED;
|
||||||
|
} else if (cachetype & (1 << 23))
|
||||||
cacheid = CACHEID_VIPT_ALIASING;
|
cacheid = CACHEID_VIPT_ALIASING;
|
||||||
else
|
else
|
||||||
cacheid = CACHEID_VIPT_NONALIASING;
|
cacheid = CACHEID_VIPT_NONALIASING;
|
||||||
|
|
|
@ -697,7 +697,7 @@ static void __init at91_add_device_rtt(void)
|
||||||
* Watchdog
|
* Watchdog
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE)
|
#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
|
||||||
static struct platform_device at91cap9_wdt_device = {
|
static struct platform_device at91cap9_wdt_device = {
|
||||||
.name = "at91_wdt",
|
.name = "at91_wdt",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
|
|
|
@ -643,7 +643,7 @@ static void __init at91_add_device_rtt(void)
|
||||||
* Watchdog
|
* Watchdog
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE)
|
#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
|
||||||
static struct platform_device at91sam9260_wdt_device = {
|
static struct platform_device at91sam9260_wdt_device = {
|
||||||
.name = "at91_wdt",
|
.name = "at91_wdt",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
|
|
|
@ -621,7 +621,7 @@ static void __init at91_add_device_rtt(void)
|
||||||
* Watchdog
|
* Watchdog
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE)
|
#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
|
||||||
static struct platform_device at91sam9261_wdt_device = {
|
static struct platform_device at91sam9261_wdt_device = {
|
||||||
.name = "at91_wdt",
|
.name = "at91_wdt",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
|
|
|
@ -347,6 +347,111 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)
|
||||||
void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
|
void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------
|
||||||
|
* Compact Flash (PCMCIA or IDE)
|
||||||
|
* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#if defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE) || \
|
||||||
|
defined(CONFIG_BLK_DEV_IDE_AT91) || defined(CONFIG_BLK_DEV_IDE_AT91_MODULE)
|
||||||
|
|
||||||
|
static struct at91_cf_data cf0_data;
|
||||||
|
|
||||||
|
static struct resource cf0_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = AT91_CHIPSELECT_4,
|
||||||
|
.end = AT91_CHIPSELECT_4 + SZ_256M - 1,
|
||||||
|
.flags = IORESOURCE_MEM | IORESOURCE_MEM_8AND16BIT,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device cf0_device = {
|
||||||
|
.id = 0,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &cf0_data,
|
||||||
|
},
|
||||||
|
.resource = cf0_resources,
|
||||||
|
.num_resources = ARRAY_SIZE(cf0_resources),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct at91_cf_data cf1_data;
|
||||||
|
|
||||||
|
static struct resource cf1_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = AT91_CHIPSELECT_5,
|
||||||
|
.end = AT91_CHIPSELECT_5 + SZ_256M - 1,
|
||||||
|
.flags = IORESOURCE_MEM | IORESOURCE_MEM_8AND16BIT,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device cf1_device = {
|
||||||
|
.id = 1,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &cf1_data,
|
||||||
|
},
|
||||||
|
.resource = cf1_resources,
|
||||||
|
.num_resources = ARRAY_SIZE(cf1_resources),
|
||||||
|
};
|
||||||
|
|
||||||
|
void __init at91_add_device_cf(struct at91_cf_data *data)
|
||||||
|
{
|
||||||
|
unsigned long ebi0_csa;
|
||||||
|
struct platform_device *pdev;
|
||||||
|
|
||||||
|
if (!data)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* assign CS4 or CS5 to SMC with Compact Flash logic support,
|
||||||
|
* we assume SMC timings are configured by board code,
|
||||||
|
* except True IDE where timings are controlled by driver
|
||||||
|
*/
|
||||||
|
ebi0_csa = at91_sys_read(AT91_MATRIX_EBI0CSA);
|
||||||
|
switch (data->chipselect) {
|
||||||
|
case 4:
|
||||||
|
at91_set_A_periph(AT91_PIN_PD6, 0); /* EBI0_NCS4/CFCS0 */
|
||||||
|
ebi0_csa |= AT91_MATRIX_EBI0_CS4A_SMC_CF1;
|
||||||
|
cf0_data = *data;
|
||||||
|
pdev = &cf0_device;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
at91_set_A_periph(AT91_PIN_PD7, 0); /* EBI0_NCS5/CFCS1 */
|
||||||
|
ebi0_csa |= AT91_MATRIX_EBI0_CS5A_SMC_CF2;
|
||||||
|
cf1_data = *data;
|
||||||
|
pdev = &cf1_device;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printk(KERN_ERR "AT91 CF: bad chip-select requested (%u)\n",
|
||||||
|
data->chipselect);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
at91_sys_write(AT91_MATRIX_EBI0CSA, ebi0_csa);
|
||||||
|
|
||||||
|
if (data->det_pin) {
|
||||||
|
at91_set_gpio_input(data->det_pin, 1);
|
||||||
|
at91_set_deglitch(data->det_pin, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data->irq_pin) {
|
||||||
|
at91_set_gpio_input(data->irq_pin, 1);
|
||||||
|
at91_set_deglitch(data->irq_pin, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data->vcc_pin)
|
||||||
|
/* initially off */
|
||||||
|
at91_set_gpio_output(data->vcc_pin, 0);
|
||||||
|
|
||||||
|
/* enable EBI controlled pins */
|
||||||
|
at91_set_A_periph(AT91_PIN_PD5, 1); /* NWAIT */
|
||||||
|
at91_set_A_periph(AT91_PIN_PD8, 0); /* CFCE1 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PD9, 0); /* CFCE2 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PD14, 0); /* CFNRW */
|
||||||
|
|
||||||
|
pdev->name = (data->flags & AT91_CF_TRUE_IDE) ? "at91_ide" : "at91_cf";
|
||||||
|
platform_device_register(pdev);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
void __init at91_add_device_cf(struct at91_cf_data *data) {}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
/* --------------------------------------------------------------------
|
||||||
* NAND / SmartMedia
|
* NAND / SmartMedia
|
||||||
|
@ -854,7 +959,7 @@ static void __init at91_add_device_rtt(void)
|
||||||
* Watchdog
|
* Watchdog
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE)
|
#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
|
||||||
static struct platform_device at91sam9263_wdt_device = {
|
static struct platform_device at91sam9263_wdt_device = {
|
||||||
.name = "at91_wdt",
|
.name = "at91_wdt",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
|
|
|
@ -609,7 +609,7 @@ static void __init at91_add_device_rtt(void)
|
||||||
* Watchdog
|
* Watchdog
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE)
|
#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
|
||||||
static struct platform_device at91sam9rl_wdt_device = {
|
static struct platform_device at91sam9rl_wdt_device = {
|
||||||
.name = "at91_wdt",
|
.name = "at91_wdt",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
|
|
|
@ -490,7 +490,8 @@ postcore_initcall(at91_gpio_debugfs_init);
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
/* This lock class tells lockdep that GPIO irqs are in a different
|
/*
|
||||||
|
* This lock class tells lockdep that GPIO irqs are in a different
|
||||||
* category than their parents, so it won't report false recursion.
|
* category than their parents, so it won't report false recursion.
|
||||||
*/
|
*/
|
||||||
static struct lock_class_key gpio_lock_class;
|
static struct lock_class_key gpio_lock_class;
|
||||||
|
@ -509,9 +510,6 @@ void __init at91_gpio_irq_setup(void)
|
||||||
unsigned id = this->id;
|
unsigned id = this->id;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
/* enable PIO controller's clock */
|
|
||||||
clk_enable(this->clock);
|
|
||||||
|
|
||||||
__raw_writel(~0, this->regbase + PIO_IDR);
|
__raw_writel(~0, this->regbase + PIO_IDR);
|
||||||
|
|
||||||
for (i = 0, pin = this->chipbase; i < 32; i++, pin++) {
|
for (i = 0, pin = this->chipbase; i < 32; i++, pin++) {
|
||||||
|
@ -556,7 +554,14 @@ void __init at91_gpio_init(struct at91_gpio_bank *data, int nr_banks)
|
||||||
data->chipbase = PIN_BASE + i * 32;
|
data->chipbase = PIN_BASE + i * 32;
|
||||||
data->regbase = data->offset + (void __iomem *)AT91_VA_BASE_SYS;
|
data->regbase = data->offset + (void __iomem *)AT91_VA_BASE_SYS;
|
||||||
|
|
||||||
/* AT91SAM9263_ID_PIOCDE groups PIOC, PIOD, PIOE */
|
/* enable PIO controller's clock */
|
||||||
|
clk_enable(data->clock);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Some processors share peripheral ID between multiple GPIO banks.
|
||||||
|
* SAM9263 (PIOC, PIOD, PIOE)
|
||||||
|
* CAP9 (PIOA, PIOB, PIOC, PIOD)
|
||||||
|
*/
|
||||||
if (last && last->id == data->id)
|
if (last && last->id == data->id)
|
||||||
last->next = data;
|
last->next = data;
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,6 +56,9 @@ struct at91_cf_data {
|
||||||
u8 vcc_pin; /* power switching */
|
u8 vcc_pin; /* power switching */
|
||||||
u8 rst_pin; /* card reset */
|
u8 rst_pin; /* card reset */
|
||||||
u8 chipselect; /* EBI Chip Select number */
|
u8 chipselect; /* EBI Chip Select number */
|
||||||
|
u8 flags;
|
||||||
|
#define AT91_CF_TRUE_IDE 0x01
|
||||||
|
#define AT91_IDE_SWAP_A0_A2 0x02
|
||||||
};
|
};
|
||||||
extern void __init at91_add_device_cf(struct at91_cf_data *data);
|
extern void __init at91_add_device_cf(struct at91_cf_data *data);
|
||||||
|
|
||||||
|
@ -93,6 +96,7 @@ struct atmel_nand_data {
|
||||||
u8 enable_pin; /* chip enable */
|
u8 enable_pin; /* chip enable */
|
||||||
u8 det_pin; /* card detect */
|
u8 det_pin; /* card detect */
|
||||||
u8 rdy_pin; /* ready/busy */
|
u8 rdy_pin; /* ready/busy */
|
||||||
|
u8 rdy_pin_active_low; /* rdy_pin value is inverted */
|
||||||
u8 ale; /* address line number connected to ALE */
|
u8 ale; /* address line number connected to ALE */
|
||||||
u8 cle; /* address line number connected to CLE */
|
u8 cle; /* address line number connected to CLE */
|
||||||
u8 bus_width_16; /* buswidth is 16 bit */
|
u8 bus_width_16; /* buswidth is 16 bit */
|
||||||
|
|
|
@ -332,7 +332,6 @@ static int at91_pm_enter(suspend_state_t state)
|
||||||
at91_sys_read(AT91_AIC_IPR) & at91_sys_read(AT91_AIC_IMR));
|
at91_sys_read(AT91_AIC_IPR) & at91_sys_read(AT91_AIC_IMR));
|
||||||
|
|
||||||
error:
|
error:
|
||||||
sdram_selfrefresh_disable();
|
|
||||||
target_state = PM_SUSPEND_ON;
|
target_state = PM_SUSPEND_ON;
|
||||||
at91_irq_resume();
|
at91_irq_resume();
|
||||||
at91_gpio_resume();
|
at91_gpio_resume();
|
||||||
|
|
|
@ -311,6 +311,9 @@ evm_u35_setup(struct i2c_client *client, int gpio, unsigned ngpio, void *c)
|
||||||
gpio_request(gpio + 7, "nCF_SEL");
|
gpio_request(gpio + 7, "nCF_SEL");
|
||||||
gpio_direction_output(gpio + 7, 1);
|
gpio_direction_output(gpio + 7, 1);
|
||||||
|
|
||||||
|
/* irlml6401 sustains over 3A, switches 5V in under 8 msec */
|
||||||
|
setup_usb(500, 8);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -417,9 +420,6 @@ static __init void davinci_evm_init(void)
|
||||||
platform_add_devices(davinci_evm_devices,
|
platform_add_devices(davinci_evm_devices,
|
||||||
ARRAY_SIZE(davinci_evm_devices));
|
ARRAY_SIZE(davinci_evm_devices));
|
||||||
evm_init_i2c();
|
evm_init_i2c();
|
||||||
|
|
||||||
/* irlml6401 sustains over 3A, switches 5V in under 8 msec */
|
|
||||||
setup_usb(500, 8);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static __init void davinci_evm_irq_init(void)
|
static __init void davinci_evm_irq_init(void)
|
||||||
|
|
|
@ -230,6 +230,11 @@ static struct clk davinci_clks[] = {
|
||||||
.rate = &commonrate,
|
.rate = &commonrate,
|
||||||
.lpsc = DAVINCI_LPSC_GPIO,
|
.lpsc = DAVINCI_LPSC_GPIO,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.name = "usb",
|
||||||
|
.rate = &commonrate,
|
||||||
|
.lpsc = DAVINCI_LPSC_USB,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.name = "AEMIFCLK",
|
.name = "AEMIFCLK",
|
||||||
.rate = &commonrate,
|
.rate = &commonrate,
|
||||||
|
|
|
@ -47,6 +47,7 @@ static struct musb_hdrc_platform_data usb_data = {
|
||||||
#elif defined(CONFIG_USB_MUSB_HOST)
|
#elif defined(CONFIG_USB_MUSB_HOST)
|
||||||
.mode = MUSB_HOST,
|
.mode = MUSB_HOST,
|
||||||
#endif
|
#endif
|
||||||
|
.clock = "usb",
|
||||||
.config = &musb_config,
|
.config = &musb_config,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
/*
|
|
||||||
* arch/arm/mach-ep93xx/include/mach/gesbc9312.h
|
|
||||||
*/
|
|
|
@ -10,7 +10,6 @@
|
||||||
|
|
||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
|
|
||||||
#include "gesbc9312.h"
|
|
||||||
#include "ts72xx.h"
|
#include "ts72xx.h"
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
struct i2c_board_info;
|
||||||
|
|
||||||
struct ep93xx_eth_data
|
struct ep93xx_eth_data
|
||||||
{
|
{
|
||||||
unsigned char dev_addr[6];
|
unsigned char dev_addr[6];
|
||||||
|
|
|
@ -42,7 +42,7 @@ void __init kirkwood_init_irq(void)
|
||||||
writel(0, GPIO_EDGE_CAUSE(32));
|
writel(0, GPIO_EDGE_CAUSE(32));
|
||||||
|
|
||||||
for (i = IRQ_KIRKWOOD_GPIO_START; i < NR_IRQS; i++) {
|
for (i = IRQ_KIRKWOOD_GPIO_START; i < NR_IRQS; i++) {
|
||||||
set_irq_chip(i, &orion_gpio_irq_level_chip);
|
set_irq_chip(i, &orion_gpio_irq_chip);
|
||||||
set_irq_handler(i, handle_level_irq);
|
set_irq_handler(i, handle_level_irq);
|
||||||
irq_desc[i].status |= IRQ_LEVEL;
|
irq_desc[i].status |= IRQ_LEVEL;
|
||||||
set_irq_flags(i, IRQF_VALID);
|
set_irq_flags(i, IRQF_VALID);
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
#include <asm/mach/flash.h>
|
#include <asm/mach/flash.h>
|
||||||
|
|
||||||
|
#include <mach/irqs.h>
|
||||||
#include <mach/board.h>
|
#include <mach/board.h>
|
||||||
#include <mach/msm_iomap.h>
|
#include <mach/msm_iomap.h>
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@ void __init mv78xx0_init_irq(void)
|
||||||
writel(0, GPIO_EDGE_CAUSE(0));
|
writel(0, GPIO_EDGE_CAUSE(0));
|
||||||
|
|
||||||
for (i = IRQ_MV78XX0_GPIO_START; i < NR_IRQS; i++) {
|
for (i = IRQ_MV78XX0_GPIO_START; i < NR_IRQS; i++) {
|
||||||
set_irq_chip(i, &orion_gpio_irq_level_chip);
|
set_irq_chip(i, &orion_gpio_irq_chip);
|
||||||
set_irq_handler(i, handle_level_irq);
|
set_irq_handler(i, handle_level_irq);
|
||||||
irq_desc[i].status |= IRQ_LEVEL;
|
irq_desc[i].status |= IRQ_LEVEL;
|
||||||
set_irq_flags(i, IRQF_VALID);
|
set_irq_flags(i, IRQF_VALID);
|
||||||
|
|
|
@ -23,6 +23,8 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
|
|
||||||
|
#include <mach/irqs.h>
|
||||||
#include <mach/hardware.h>
|
#include <mach/hardware.h>
|
||||||
|
|
||||||
static struct resource imx_csi_resources[] = {
|
static struct resource imx_csi_resources[] = {
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
#include <asm/mach/time.h>
|
#include <asm/mach/time.h>
|
||||||
|
|
||||||
|
#include <mach/irqs.h>
|
||||||
#include <mach/hardware.h>
|
#include <mach/hardware.h>
|
||||||
#include <mach/common.h>
|
#include <mach/common.h>
|
||||||
#include <mach/imx-uart.h>
|
#include <mach/imx-uart.h>
|
||||||
|
|
|
@ -181,7 +181,7 @@ void __init omap1_init_mmc(struct omap_mmc_platform_data **mmc_data,
|
||||||
}
|
}
|
||||||
size = OMAP1_MMC_SIZE;
|
size = OMAP1_MMC_SIZE;
|
||||||
|
|
||||||
omap_mmc_add(i, base, size, irq, mmc_data[i]);
|
omap_mmc_add("mmci-omap", i, base, size, irq, mmc_data[i]);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,81 +28,8 @@
|
||||||
#define DPS_RSTCT2_PER_EN (1 << 0)
|
#define DPS_RSTCT2_PER_EN (1 << 0)
|
||||||
#define DSP_RSTCT2_WD_PER_EN (1 << 1)
|
#define DSP_RSTCT2_WD_PER_EN (1 << 1)
|
||||||
|
|
||||||
struct mcbsp_internal_clk {
|
|
||||||
struct clk clk;
|
|
||||||
struct clk **childs;
|
|
||||||
int n_childs;
|
|
||||||
};
|
|
||||||
|
|
||||||
#if defined(CONFIG_ARCH_OMAP15XX) || defined(CONFIG_ARCH_OMAP16XX)
|
#if defined(CONFIG_ARCH_OMAP15XX) || defined(CONFIG_ARCH_OMAP16XX)
|
||||||
static void omap_mcbsp_clk_init(struct mcbsp_internal_clk *mclk)
|
const char *clk_names[] = { "dsp_ck", "api_ck", "dspxor_ck" };
|
||||||
{
|
|
||||||
const char *clk_names[] = { "dsp_ck", "api_ck", "dspxor_ck" };
|
|
||||||
int i;
|
|
||||||
|
|
||||||
mclk->n_childs = ARRAY_SIZE(clk_names);
|
|
||||||
mclk->childs = kzalloc(mclk->n_childs * sizeof(struct clk *),
|
|
||||||
GFP_KERNEL);
|
|
||||||
|
|
||||||
for (i = 0; i < mclk->n_childs; i++) {
|
|
||||||
/* We fake a platform device to get correct device id */
|
|
||||||
struct platform_device pdev;
|
|
||||||
|
|
||||||
pdev.dev.bus = &platform_bus_type;
|
|
||||||
pdev.id = mclk->clk.id;
|
|
||||||
mclk->childs[i] = clk_get(&pdev.dev, clk_names[i]);
|
|
||||||
if (IS_ERR(mclk->childs[i]))
|
|
||||||
printk(KERN_ERR "Could not get clock %s (%d).\n",
|
|
||||||
clk_names[i], mclk->clk.id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int omap_mcbsp_clk_enable(struct clk *clk)
|
|
||||||
{
|
|
||||||
struct mcbsp_internal_clk *mclk = container_of(clk,
|
|
||||||
struct mcbsp_internal_clk, clk);
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < mclk->n_childs; i++)
|
|
||||||
clk_enable(mclk->childs[i]);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void omap_mcbsp_clk_disable(struct clk *clk)
|
|
||||||
{
|
|
||||||
struct mcbsp_internal_clk *mclk = container_of(clk,
|
|
||||||
struct mcbsp_internal_clk, clk);
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < mclk->n_childs; i++)
|
|
||||||
clk_disable(mclk->childs[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct mcbsp_internal_clk omap_mcbsp_clks[] = {
|
|
||||||
{
|
|
||||||
.clk = {
|
|
||||||
.name = "mcbsp_clk",
|
|
||||||
.id = 1,
|
|
||||||
.enable = omap_mcbsp_clk_enable,
|
|
||||||
.disable = omap_mcbsp_clk_disable,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.clk = {
|
|
||||||
.name = "mcbsp_clk",
|
|
||||||
.id = 3,
|
|
||||||
.enable = omap_mcbsp_clk_enable,
|
|
||||||
.disable = omap_mcbsp_clk_disable,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
#define omap_mcbsp_clks_size ARRAY_SIZE(omap_mcbsp_clks)
|
|
||||||
#else
|
|
||||||
#define omap_mcbsp_clks_size 0
|
|
||||||
static struct mcbsp_internal_clk __initdata *omap_mcbsp_clks;
|
|
||||||
static inline void omap_mcbsp_clk_init(struct mcbsp_internal_clk *mclk)
|
|
||||||
{ }
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void omap1_mcbsp_request(unsigned int id)
|
static void omap1_mcbsp_request(unsigned int id)
|
||||||
|
@ -167,8 +94,9 @@ static struct omap_mcbsp_platform_data omap15xx_mcbsp_pdata[] = {
|
||||||
.rx_irq = INT_McBSP1RX,
|
.rx_irq = INT_McBSP1RX,
|
||||||
.tx_irq = INT_McBSP1TX,
|
.tx_irq = INT_McBSP1TX,
|
||||||
.ops = &omap1_mcbsp_ops,
|
.ops = &omap1_mcbsp_ops,
|
||||||
.clk_name = "mcbsp_clk",
|
.clk_names = clk_names,
|
||||||
},
|
.num_clks = 3,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.phys_base = OMAP1510_MCBSP2_BASE,
|
.phys_base = OMAP1510_MCBSP2_BASE,
|
||||||
.dma_rx_sync = OMAP_DMA_MCBSP2_RX,
|
.dma_rx_sync = OMAP_DMA_MCBSP2_RX,
|
||||||
|
@ -184,7 +112,8 @@ static struct omap_mcbsp_platform_data omap15xx_mcbsp_pdata[] = {
|
||||||
.rx_irq = INT_McBSP3RX,
|
.rx_irq = INT_McBSP3RX,
|
||||||
.tx_irq = INT_McBSP3TX,
|
.tx_irq = INT_McBSP3TX,
|
||||||
.ops = &omap1_mcbsp_ops,
|
.ops = &omap1_mcbsp_ops,
|
||||||
.clk_name = "mcbsp_clk",
|
.clk_names = clk_names,
|
||||||
|
.num_clks = 3,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
#define OMAP15XX_MCBSP_PDATA_SZ ARRAY_SIZE(omap15xx_mcbsp_pdata)
|
#define OMAP15XX_MCBSP_PDATA_SZ ARRAY_SIZE(omap15xx_mcbsp_pdata)
|
||||||
|
@ -202,7 +131,8 @@ static struct omap_mcbsp_platform_data omap16xx_mcbsp_pdata[] = {
|
||||||
.rx_irq = INT_McBSP1RX,
|
.rx_irq = INT_McBSP1RX,
|
||||||
.tx_irq = INT_McBSP1TX,
|
.tx_irq = INT_McBSP1TX,
|
||||||
.ops = &omap1_mcbsp_ops,
|
.ops = &omap1_mcbsp_ops,
|
||||||
.clk_name = "mcbsp_clk",
|
.clk_names = clk_names,
|
||||||
|
.num_clks = 3,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.phys_base = OMAP1610_MCBSP2_BASE,
|
.phys_base = OMAP1610_MCBSP2_BASE,
|
||||||
|
@ -219,7 +149,8 @@ static struct omap_mcbsp_platform_data omap16xx_mcbsp_pdata[] = {
|
||||||
.rx_irq = INT_McBSP3RX,
|
.rx_irq = INT_McBSP3RX,
|
||||||
.tx_irq = INT_McBSP3TX,
|
.tx_irq = INT_McBSP3TX,
|
||||||
.ops = &omap1_mcbsp_ops,
|
.ops = &omap1_mcbsp_ops,
|
||||||
.clk_name = "mcbsp_clk",
|
.clk_names = clk_names,
|
||||||
|
.num_clks = 3,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
#define OMAP16XX_MCBSP_PDATA_SZ ARRAY_SIZE(omap16xx_mcbsp_pdata)
|
#define OMAP16XX_MCBSP_PDATA_SZ ARRAY_SIZE(omap16xx_mcbsp_pdata)
|
||||||
|
@ -230,15 +161,6 @@ static struct omap_mcbsp_platform_data omap16xx_mcbsp_pdata[] = {
|
||||||
|
|
||||||
int __init omap1_mcbsp_init(void)
|
int __init omap1_mcbsp_init(void)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < omap_mcbsp_clks_size; i++) {
|
|
||||||
if (cpu_is_omap15xx() || cpu_is_omap16xx()) {
|
|
||||||
omap_mcbsp_clk_init(&omap_mcbsp_clks[i]);
|
|
||||||
clk_register(&omap_mcbsp_clks[i].clk);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cpu_is_omap730())
|
if (cpu_is_omap730())
|
||||||
omap_mcbsp_count = OMAP730_MCBSP_PDATA_SZ;
|
omap_mcbsp_count = OMAP730_MCBSP_PDATA_SZ;
|
||||||
if (cpu_is_omap15xx())
|
if (cpu_is_omap15xx())
|
||||||
|
|
|
@ -81,7 +81,7 @@ static inline void __init ldp_init_smc911x(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
ldp_smc911x_resources[0].start = cs_mem_base + 0x0;
|
ldp_smc911x_resources[0].start = cs_mem_base + 0x0;
|
||||||
ldp_smc911x_resources[0].end = cs_mem_base + 0xf;
|
ldp_smc911x_resources[0].end = cs_mem_base + 0xff;
|
||||||
udelay(100);
|
udelay(100);
|
||||||
|
|
||||||
eth_gpio = LDP_SMC911X_GPIO;
|
eth_gpio = LDP_SMC911X_GPIO;
|
||||||
|
|
|
@ -178,7 +178,9 @@ static int __init omap3_beagle_i2c_init(void)
|
||||||
#ifdef CONFIG_I2C2_OMAP_BEAGLE
|
#ifdef CONFIG_I2C2_OMAP_BEAGLE
|
||||||
omap_register_i2c_bus(2, 400, NULL, 0);
|
omap_register_i2c_bus(2, 400, NULL, 0);
|
||||||
#endif
|
#endif
|
||||||
omap_register_i2c_bus(3, 400, NULL, 0);
|
/* Bus 3 is attached to the DVI port where devices like the pico DLP
|
||||||
|
* projector don't work reliably with 400kHz */
|
||||||
|
omap_register_i2c_bus(3, 100, NULL, 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -565,7 +565,7 @@ u32 omap2_clksel_to_divisor(struct clk *clk, u32 field_val)
|
||||||
*
|
*
|
||||||
* Given a struct clk of a rate-selectable clksel clock, and a clock divisor,
|
* Given a struct clk of a rate-selectable clksel clock, and a clock divisor,
|
||||||
* find the corresponding register field value. The return register value is
|
* find the corresponding register field value. The return register value is
|
||||||
* the value before left-shifting. Returns 0xffffffff on error
|
* the value before left-shifting. Returns ~0 on error
|
||||||
*/
|
*/
|
||||||
u32 omap2_divisor_to_clksel(struct clk *clk, u32 div)
|
u32 omap2_divisor_to_clksel(struct clk *clk, u32 div)
|
||||||
{
|
{
|
||||||
|
@ -577,7 +577,7 @@ u32 omap2_divisor_to_clksel(struct clk *clk, u32 div)
|
||||||
|
|
||||||
clks = omap2_get_clksel_by_parent(clk, clk->parent);
|
clks = omap2_get_clksel_by_parent(clk, clk->parent);
|
||||||
if (clks == NULL)
|
if (clks == NULL)
|
||||||
return 0;
|
return ~0;
|
||||||
|
|
||||||
for (clkr = clks->rates; clkr->div; clkr++) {
|
for (clkr = clks->rates; clkr->div; clkr++) {
|
||||||
if ((clkr->flags & cpu_mask) && (clkr->div == div))
|
if ((clkr->flags & cpu_mask) && (clkr->div == div))
|
||||||
|
@ -588,7 +588,7 @@ u32 omap2_divisor_to_clksel(struct clk *clk, u32 div)
|
||||||
printk(KERN_ERR "clock: Could not find divisor %d for "
|
printk(KERN_ERR "clock: Could not find divisor %d for "
|
||||||
"clock %s parent %s\n", div, clk->name,
|
"clock %s parent %s\n", div, clk->name,
|
||||||
clk->parent->name);
|
clk->parent->name);
|
||||||
return 0;
|
return ~0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return clkr->val;
|
return clkr->val;
|
||||||
|
@ -708,7 +708,7 @@ static u32 omap2_clksel_get_src_field(void __iomem **src_addr,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for (clkr = clks->rates; clkr->div; clkr++) {
|
for (clkr = clks->rates; clkr->div; clkr++) {
|
||||||
if (clkr->flags & (cpu_mask | DEFAULT_RATE))
|
if (clkr->flags & cpu_mask && clkr->flags & DEFAULT_RATE)
|
||||||
break; /* Found the default rate for this platform */
|
break; /* Found the default rate for this platform */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -746,7 +746,7 @@ int omap2_clk_set_parent(struct clk *clk, struct clk *new_parent)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (clk->usecount > 0)
|
if (clk->usecount > 0)
|
||||||
_omap2_clk_disable(clk);
|
omap2_clk_disable(clk);
|
||||||
|
|
||||||
/* Set new source value (previous dividers if any in effect) */
|
/* Set new source value (previous dividers if any in effect) */
|
||||||
reg_val = __raw_readl(src_addr) & ~field_mask;
|
reg_val = __raw_readl(src_addr) & ~field_mask;
|
||||||
|
@ -759,11 +759,11 @@ int omap2_clk_set_parent(struct clk *clk, struct clk *new_parent)
|
||||||
wmb();
|
wmb();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (clk->usecount > 0)
|
|
||||||
_omap2_clk_enable(clk);
|
|
||||||
|
|
||||||
clk->parent = new_parent;
|
clk->parent = new_parent;
|
||||||
|
|
||||||
|
if (clk->usecount > 0)
|
||||||
|
omap2_clk_enable(clk);
|
||||||
|
|
||||||
/* CLKSEL clocks follow their parents' rates, divided by a divisor */
|
/* CLKSEL clocks follow their parents' rates, divided by a divisor */
|
||||||
clk->rate = new_parent->rate;
|
clk->rate = new_parent->rate;
|
||||||
|
|
||||||
|
|
|
@ -421,6 +421,7 @@ void __init omap2_init_mmc(struct omap_mmc_platform_data **mmc_data,
|
||||||
int nr_controllers)
|
int nr_controllers)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
char *name;
|
||||||
|
|
||||||
for (i = 0; i < nr_controllers; i++) {
|
for (i = 0; i < nr_controllers; i++) {
|
||||||
unsigned long base, size;
|
unsigned long base, size;
|
||||||
|
@ -450,12 +451,14 @@ void __init omap2_init_mmc(struct omap_mmc_platform_data **mmc_data,
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cpu_is_omap2420())
|
if (cpu_is_omap2420()) {
|
||||||
size = OMAP2420_MMC_SIZE;
|
size = OMAP2420_MMC_SIZE;
|
||||||
else
|
name = "mmci-omap";
|
||||||
|
} else {
|
||||||
size = HSMMC_SIZE;
|
size = HSMMC_SIZE;
|
||||||
|
name = "mmci-omap-hs";
|
||||||
omap_mmc_add(i, base, size, irq, mmc_data[i]);
|
}
|
||||||
|
omap_mmc_add(name, i, base, size, irq, mmc_data[i]);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -172,9 +172,13 @@ void __init omap34xx_check_revision(void)
|
||||||
omap_revision = OMAP3430_REV_ES3_0;
|
omap_revision = OMAP3430_REV_ES3_0;
|
||||||
rev_name = "ES3.0";
|
rev_name = "ES3.0";
|
||||||
break;
|
break;
|
||||||
|
case 4:
|
||||||
|
omap_revision = OMAP3430_REV_ES3_1;
|
||||||
|
rev_name = "ES3.1";
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
/* Use the latest known revision as default */
|
/* Use the latest known revision as default */
|
||||||
omap_revision = OMAP3430_REV_ES3_0;
|
omap_revision = OMAP3430_REV_ES3_1;
|
||||||
rev_name = "Unknown revision\n";
|
rev_name = "Unknown revision\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -134,6 +134,7 @@ static struct irq_chip omap_irq_chip = {
|
||||||
.ack = omap_mask_ack_irq,
|
.ack = omap_mask_ack_irq,
|
||||||
.mask = omap_mask_irq,
|
.mask = omap_mask_irq,
|
||||||
.unmask = omap_unmask_irq,
|
.unmask = omap_unmask_irq,
|
||||||
|
.disable = omap_mask_irq,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init omap_irq_bank_init_one(struct omap_irq_bank *bank)
|
static void __init omap_irq_bank_init_one(struct omap_irq_bank *bank)
|
||||||
|
|
|
@ -24,106 +24,7 @@
|
||||||
#include <mach/cpu.h>
|
#include <mach/cpu.h>
|
||||||
#include <mach/mcbsp.h>
|
#include <mach/mcbsp.h>
|
||||||
|
|
||||||
struct mcbsp_internal_clk {
|
const char *clk_names[] = { "mcbsp_ick", "mcbsp_fck" };
|
||||||
struct clk clk;
|
|
||||||
struct clk **childs;
|
|
||||||
int n_childs;
|
|
||||||
};
|
|
||||||
|
|
||||||
#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX)
|
|
||||||
static void omap_mcbsp_clk_init(struct mcbsp_internal_clk *mclk)
|
|
||||||
{
|
|
||||||
const char *clk_names[] = { "mcbsp_ick", "mcbsp_fck" };
|
|
||||||
int i;
|
|
||||||
|
|
||||||
mclk->n_childs = ARRAY_SIZE(clk_names);
|
|
||||||
mclk->childs = kzalloc(mclk->n_childs * sizeof(struct clk *),
|
|
||||||
GFP_KERNEL);
|
|
||||||
|
|
||||||
for (i = 0; i < mclk->n_childs; i++) {
|
|
||||||
/* We fake a platform device to get correct device id */
|
|
||||||
struct platform_device pdev;
|
|
||||||
|
|
||||||
pdev.dev.bus = &platform_bus_type;
|
|
||||||
pdev.id = mclk->clk.id;
|
|
||||||
mclk->childs[i] = clk_get(&pdev.dev, clk_names[i]);
|
|
||||||
if (IS_ERR(mclk->childs[i]))
|
|
||||||
printk(KERN_ERR "Could not get clock %s (%d).\n",
|
|
||||||
clk_names[i], mclk->clk.id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int omap_mcbsp_clk_enable(struct clk *clk)
|
|
||||||
{
|
|
||||||
struct mcbsp_internal_clk *mclk = container_of(clk,
|
|
||||||
struct mcbsp_internal_clk, clk);
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < mclk->n_childs; i++)
|
|
||||||
clk_enable(mclk->childs[i]);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void omap_mcbsp_clk_disable(struct clk *clk)
|
|
||||||
{
|
|
||||||
struct mcbsp_internal_clk *mclk = container_of(clk,
|
|
||||||
struct mcbsp_internal_clk, clk);
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < mclk->n_childs; i++)
|
|
||||||
clk_disable(mclk->childs[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct mcbsp_internal_clk omap_mcbsp_clks[] = {
|
|
||||||
{
|
|
||||||
.clk = {
|
|
||||||
.name = "mcbsp_clk",
|
|
||||||
.id = 1,
|
|
||||||
.enable = omap_mcbsp_clk_enable,
|
|
||||||
.disable = omap_mcbsp_clk_disable,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.clk = {
|
|
||||||
.name = "mcbsp_clk",
|
|
||||||
.id = 2,
|
|
||||||
.enable = omap_mcbsp_clk_enable,
|
|
||||||
.disable = omap_mcbsp_clk_disable,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.clk = {
|
|
||||||
.name = "mcbsp_clk",
|
|
||||||
.id = 3,
|
|
||||||
.enable = omap_mcbsp_clk_enable,
|
|
||||||
.disable = omap_mcbsp_clk_disable,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.clk = {
|
|
||||||
.name = "mcbsp_clk",
|
|
||||||
.id = 4,
|
|
||||||
.enable = omap_mcbsp_clk_enable,
|
|
||||||
.disable = omap_mcbsp_clk_disable,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.clk = {
|
|
||||||
.name = "mcbsp_clk",
|
|
||||||
.id = 5,
|
|
||||||
.enable = omap_mcbsp_clk_enable,
|
|
||||||
.disable = omap_mcbsp_clk_disable,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
#define omap_mcbsp_clks_size ARRAY_SIZE(omap_mcbsp_clks)
|
|
||||||
#else
|
|
||||||
#define omap_mcbsp_clks_size 0
|
|
||||||
static struct mcbsp_internal_clk __initdata *omap_mcbsp_clks;
|
|
||||||
static inline void omap_mcbsp_clk_init(struct clk *clk)
|
|
||||||
{ }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void omap2_mcbsp2_mux_setup(void)
|
static void omap2_mcbsp2_mux_setup(void)
|
||||||
{
|
{
|
||||||
|
@ -156,7 +57,8 @@ static struct omap_mcbsp_platform_data omap2420_mcbsp_pdata[] = {
|
||||||
.rx_irq = INT_24XX_MCBSP1_IRQ_RX,
|
.rx_irq = INT_24XX_MCBSP1_IRQ_RX,
|
||||||
.tx_irq = INT_24XX_MCBSP1_IRQ_TX,
|
.tx_irq = INT_24XX_MCBSP1_IRQ_TX,
|
||||||
.ops = &omap2_mcbsp_ops,
|
.ops = &omap2_mcbsp_ops,
|
||||||
.clk_name = "mcbsp_clk",
|
.clk_names = clk_names,
|
||||||
|
.num_clks = 2,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.phys_base = OMAP24XX_MCBSP2_BASE,
|
.phys_base = OMAP24XX_MCBSP2_BASE,
|
||||||
|
@ -165,7 +67,8 @@ static struct omap_mcbsp_platform_data omap2420_mcbsp_pdata[] = {
|
||||||
.rx_irq = INT_24XX_MCBSP2_IRQ_RX,
|
.rx_irq = INT_24XX_MCBSP2_IRQ_RX,
|
||||||
.tx_irq = INT_24XX_MCBSP2_IRQ_TX,
|
.tx_irq = INT_24XX_MCBSP2_IRQ_TX,
|
||||||
.ops = &omap2_mcbsp_ops,
|
.ops = &omap2_mcbsp_ops,
|
||||||
.clk_name = "mcbsp_clk",
|
.clk_names = clk_names,
|
||||||
|
.num_clks = 2,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
#define OMAP2420_MCBSP_PDATA_SZ ARRAY_SIZE(omap2420_mcbsp_pdata)
|
#define OMAP2420_MCBSP_PDATA_SZ ARRAY_SIZE(omap2420_mcbsp_pdata)
|
||||||
|
@ -183,7 +86,8 @@ static struct omap_mcbsp_platform_data omap2430_mcbsp_pdata[] = {
|
||||||
.rx_irq = INT_24XX_MCBSP1_IRQ_RX,
|
.rx_irq = INT_24XX_MCBSP1_IRQ_RX,
|
||||||
.tx_irq = INT_24XX_MCBSP1_IRQ_TX,
|
.tx_irq = INT_24XX_MCBSP1_IRQ_TX,
|
||||||
.ops = &omap2_mcbsp_ops,
|
.ops = &omap2_mcbsp_ops,
|
||||||
.clk_name = "mcbsp_clk",
|
.clk_names = clk_names,
|
||||||
|
.num_clks = 2,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.phys_base = OMAP24XX_MCBSP2_BASE,
|
.phys_base = OMAP24XX_MCBSP2_BASE,
|
||||||
|
@ -192,7 +96,8 @@ static struct omap_mcbsp_platform_data omap2430_mcbsp_pdata[] = {
|
||||||
.rx_irq = INT_24XX_MCBSP2_IRQ_RX,
|
.rx_irq = INT_24XX_MCBSP2_IRQ_RX,
|
||||||
.tx_irq = INT_24XX_MCBSP2_IRQ_TX,
|
.tx_irq = INT_24XX_MCBSP2_IRQ_TX,
|
||||||
.ops = &omap2_mcbsp_ops,
|
.ops = &omap2_mcbsp_ops,
|
||||||
.clk_name = "mcbsp_clk",
|
.clk_names = clk_names,
|
||||||
|
.num_clks = 2,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.phys_base = OMAP2430_MCBSP3_BASE,
|
.phys_base = OMAP2430_MCBSP3_BASE,
|
||||||
|
@ -201,7 +106,8 @@ static struct omap_mcbsp_platform_data omap2430_mcbsp_pdata[] = {
|
||||||
.rx_irq = INT_24XX_MCBSP3_IRQ_RX,
|
.rx_irq = INT_24XX_MCBSP3_IRQ_RX,
|
||||||
.tx_irq = INT_24XX_MCBSP3_IRQ_TX,
|
.tx_irq = INT_24XX_MCBSP3_IRQ_TX,
|
||||||
.ops = &omap2_mcbsp_ops,
|
.ops = &omap2_mcbsp_ops,
|
||||||
.clk_name = "mcbsp_clk",
|
.clk_names = clk_names,
|
||||||
|
.num_clks = 2,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.phys_base = OMAP2430_MCBSP4_BASE,
|
.phys_base = OMAP2430_MCBSP4_BASE,
|
||||||
|
@ -210,7 +116,8 @@ static struct omap_mcbsp_platform_data omap2430_mcbsp_pdata[] = {
|
||||||
.rx_irq = INT_24XX_MCBSP4_IRQ_RX,
|
.rx_irq = INT_24XX_MCBSP4_IRQ_RX,
|
||||||
.tx_irq = INT_24XX_MCBSP4_IRQ_TX,
|
.tx_irq = INT_24XX_MCBSP4_IRQ_TX,
|
||||||
.ops = &omap2_mcbsp_ops,
|
.ops = &omap2_mcbsp_ops,
|
||||||
.clk_name = "mcbsp_clk",
|
.clk_names = clk_names,
|
||||||
|
.num_clks = 2,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.phys_base = OMAP2430_MCBSP5_BASE,
|
.phys_base = OMAP2430_MCBSP5_BASE,
|
||||||
|
@ -219,7 +126,8 @@ static struct omap_mcbsp_platform_data omap2430_mcbsp_pdata[] = {
|
||||||
.rx_irq = INT_24XX_MCBSP5_IRQ_RX,
|
.rx_irq = INT_24XX_MCBSP5_IRQ_RX,
|
||||||
.tx_irq = INT_24XX_MCBSP5_IRQ_TX,
|
.tx_irq = INT_24XX_MCBSP5_IRQ_TX,
|
||||||
.ops = &omap2_mcbsp_ops,
|
.ops = &omap2_mcbsp_ops,
|
||||||
.clk_name = "mcbsp_clk",
|
.clk_names = clk_names,
|
||||||
|
.num_clks = 2,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
#define OMAP2430_MCBSP_PDATA_SZ ARRAY_SIZE(omap2430_mcbsp_pdata)
|
#define OMAP2430_MCBSP_PDATA_SZ ARRAY_SIZE(omap2430_mcbsp_pdata)
|
||||||
|
@ -237,7 +145,8 @@ static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = {
|
||||||
.rx_irq = INT_24XX_MCBSP1_IRQ_RX,
|
.rx_irq = INT_24XX_MCBSP1_IRQ_RX,
|
||||||
.tx_irq = INT_24XX_MCBSP1_IRQ_TX,
|
.tx_irq = INT_24XX_MCBSP1_IRQ_TX,
|
||||||
.ops = &omap2_mcbsp_ops,
|
.ops = &omap2_mcbsp_ops,
|
||||||
.clk_name = "mcbsp_clk",
|
.clk_names = clk_names,
|
||||||
|
.num_clks = 2,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.phys_base = OMAP34XX_MCBSP2_BASE,
|
.phys_base = OMAP34XX_MCBSP2_BASE,
|
||||||
|
@ -246,7 +155,8 @@ static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = {
|
||||||
.rx_irq = INT_24XX_MCBSP2_IRQ_RX,
|
.rx_irq = INT_24XX_MCBSP2_IRQ_RX,
|
||||||
.tx_irq = INT_24XX_MCBSP2_IRQ_TX,
|
.tx_irq = INT_24XX_MCBSP2_IRQ_TX,
|
||||||
.ops = &omap2_mcbsp_ops,
|
.ops = &omap2_mcbsp_ops,
|
||||||
.clk_name = "mcbsp_clk",
|
.clk_names = clk_names,
|
||||||
|
.num_clks = 2,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.phys_base = OMAP34XX_MCBSP3_BASE,
|
.phys_base = OMAP34XX_MCBSP3_BASE,
|
||||||
|
@ -255,7 +165,8 @@ static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = {
|
||||||
.rx_irq = INT_24XX_MCBSP3_IRQ_RX,
|
.rx_irq = INT_24XX_MCBSP3_IRQ_RX,
|
||||||
.tx_irq = INT_24XX_MCBSP3_IRQ_TX,
|
.tx_irq = INT_24XX_MCBSP3_IRQ_TX,
|
||||||
.ops = &omap2_mcbsp_ops,
|
.ops = &omap2_mcbsp_ops,
|
||||||
.clk_name = "mcbsp_clk",
|
.clk_names = clk_names,
|
||||||
|
.num_clks = 2,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.phys_base = OMAP34XX_MCBSP4_BASE,
|
.phys_base = OMAP34XX_MCBSP4_BASE,
|
||||||
|
@ -264,7 +175,8 @@ static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = {
|
||||||
.rx_irq = INT_24XX_MCBSP4_IRQ_RX,
|
.rx_irq = INT_24XX_MCBSP4_IRQ_RX,
|
||||||
.tx_irq = INT_24XX_MCBSP4_IRQ_TX,
|
.tx_irq = INT_24XX_MCBSP4_IRQ_TX,
|
||||||
.ops = &omap2_mcbsp_ops,
|
.ops = &omap2_mcbsp_ops,
|
||||||
.clk_name = "mcbsp_clk",
|
.clk_names = clk_names,
|
||||||
|
.num_clks = 2,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.phys_base = OMAP34XX_MCBSP5_BASE,
|
.phys_base = OMAP34XX_MCBSP5_BASE,
|
||||||
|
@ -273,7 +185,8 @@ static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = {
|
||||||
.rx_irq = INT_24XX_MCBSP5_IRQ_RX,
|
.rx_irq = INT_24XX_MCBSP5_IRQ_RX,
|
||||||
.tx_irq = INT_24XX_MCBSP5_IRQ_TX,
|
.tx_irq = INT_24XX_MCBSP5_IRQ_TX,
|
||||||
.ops = &omap2_mcbsp_ops,
|
.ops = &omap2_mcbsp_ops,
|
||||||
.clk_name = "mcbsp_clk",
|
.clk_names = clk_names,
|
||||||
|
.num_clks = 2,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
#define OMAP34XX_MCBSP_PDATA_SZ ARRAY_SIZE(omap34xx_mcbsp_pdata)
|
#define OMAP34XX_MCBSP_PDATA_SZ ARRAY_SIZE(omap34xx_mcbsp_pdata)
|
||||||
|
@ -284,14 +197,6 @@ static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = {
|
||||||
|
|
||||||
static int __init omap2_mcbsp_init(void)
|
static int __init omap2_mcbsp_init(void)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < omap_mcbsp_clks_size; i++) {
|
|
||||||
/* Once we call clk_get inside init, we do not register it */
|
|
||||||
omap_mcbsp_clk_init(&omap_mcbsp_clks[i]);
|
|
||||||
clk_register(&omap_mcbsp_clks[i].clk);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cpu_is_omap2420())
|
if (cpu_is_omap2420())
|
||||||
omap_mcbsp_count = OMAP2420_MCBSP_PDATA_SZ;
|
omap_mcbsp_count = OMAP2420_MCBSP_PDATA_SZ;
|
||||||
if (cpu_is_omap2430())
|
if (cpu_is_omap2430())
|
||||||
|
|
|
@ -93,9 +93,8 @@ ENTRY(omap24xx_cpu_suspend)
|
||||||
orr r4, r4, #0x40 @ enable self refresh on idle req
|
orr r4, r4, #0x40 @ enable self refresh on idle req
|
||||||
mov r5, #0x2000 @ set delay (DPLL relock + DLL relock)
|
mov r5, #0x2000 @ set delay (DPLL relock + DLL relock)
|
||||||
str r4, [r2] @ make it so
|
str r4, [r2] @ make it so
|
||||||
mov r2, #0
|
|
||||||
nop
|
nop
|
||||||
mcr p15, 0, r2, c7, c0, 4 @ wait for interrupt
|
mcr p15, 0, r3, c7, c0, 4 @ wait for interrupt
|
||||||
nop
|
nop
|
||||||
loop:
|
loop:
|
||||||
subs r5, r5, #0x1 @ awake, wait just a bit
|
subs r5, r5, #0x1 @ awake, wait just a bit
|
||||||
|
|
|
@ -118,7 +118,8 @@ static void __init omap2_gp_clockevent_init(void)
|
||||||
clockevent_gpt.max_delta_ns =
|
clockevent_gpt.max_delta_ns =
|
||||||
clockevent_delta2ns(0xffffffff, &clockevent_gpt);
|
clockevent_delta2ns(0xffffffff, &clockevent_gpt);
|
||||||
clockevent_gpt.min_delta_ns =
|
clockevent_gpt.min_delta_ns =
|
||||||
clockevent_delta2ns(1, &clockevent_gpt);
|
clockevent_delta2ns(3, &clockevent_gpt);
|
||||||
|
/* Timer internal resynch latency. */
|
||||||
|
|
||||||
clockevent_gpt.cpumask = cpumask_of(0);
|
clockevent_gpt.cpumask = cpumask_of(0);
|
||||||
clockevents_register_device(&clockevent_gpt);
|
clockevents_register_device(&clockevent_gpt);
|
||||||
|
|
|
@ -431,6 +431,10 @@ void __init orion5x_uart1_init(void)
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* XOR engine
|
* XOR engine
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
struct mv_xor_platform_shared_data orion5x_xor_shared_data = {
|
||||||
|
.dram = &orion5x_mbus_dram_info,
|
||||||
|
};
|
||||||
|
|
||||||
static struct resource orion5x_xor_shared_resources[] = {
|
static struct resource orion5x_xor_shared_resources[] = {
|
||||||
{
|
{
|
||||||
.name = "xor low",
|
.name = "xor low",
|
||||||
|
@ -448,6 +452,9 @@ static struct resource orion5x_xor_shared_resources[] = {
|
||||||
static struct platform_device orion5x_xor_shared = {
|
static struct platform_device orion5x_xor_shared = {
|
||||||
.name = MV_XOR_SHARED_NAME,
|
.name = MV_XOR_SHARED_NAME,
|
||||||
.id = 0,
|
.id = 0,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &orion5x_xor_shared_data,
|
||||||
|
},
|
||||||
.num_resources = ARRAY_SIZE(orion5x_xor_shared_resources),
|
.num_resources = ARRAY_SIZE(orion5x_xor_shared_resources),
|
||||||
.resource = orion5x_xor_shared_resources,
|
.resource = orion5x_xor_shared_resources,
|
||||||
};
|
};
|
||||||
|
|
|
@ -44,7 +44,7 @@ void __init orion5x_init_irq(void)
|
||||||
* User can use set_type() if he wants to use edge types handlers.
|
* User can use set_type() if he wants to use edge types handlers.
|
||||||
*/
|
*/
|
||||||
for (i = IRQ_ORION5X_GPIO_START; i < NR_IRQS; i++) {
|
for (i = IRQ_ORION5X_GPIO_START; i < NR_IRQS; i++) {
|
||||||
set_irq_chip(i, &orion_gpio_irq_level_chip);
|
set_irq_chip(i, &orion_gpio_irq_chip);
|
||||||
set_irq_handler(i, handle_level_irq);
|
set_irq_handler(i, handle_level_irq);
|
||||||
irq_desc[i].status |= IRQ_LEVEL;
|
irq_desc[i].status |= IRQ_LEVEL;
|
||||||
set_irq_flags(i, IRQF_VALID);
|
set_irq_flags(i, IRQF_VALID);
|
||||||
|
|
|
@ -121,6 +121,16 @@ int __init pxa_init_dma(int num_ch)
|
||||||
if (dma_channels == NULL)
|
if (dma_channels == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
/* dma channel priorities on pxa2xx processors:
|
||||||
|
* ch 0 - 3, 16 - 19 <--> (0) DMA_PRIO_HIGH
|
||||||
|
* ch 4 - 7, 20 - 23 <--> (1) DMA_PRIO_MEDIUM
|
||||||
|
* ch 8 - 15, 24 - 31 <--> (2) DMA_PRIO_LOW
|
||||||
|
*/
|
||||||
|
for (i = 0; i < num_ch; i++) {
|
||||||
|
DCSR(i) = 0;
|
||||||
|
dma_channels[i].prio = min((i & 0xf) >> 2, DMA_PRIO_LOW);
|
||||||
|
}
|
||||||
|
|
||||||
ret = request_irq(IRQ_DMA, dma_irq_handler, IRQF_DISABLED, "DMA", NULL);
|
ret = request_irq(IRQ_DMA, dma_irq_handler, IRQF_DISABLED, "DMA", NULL);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
printk (KERN_CRIT "Wow! Can't register IRQ for DMA\n");
|
printk (KERN_CRIT "Wow! Can't register IRQ for DMA\n");
|
||||||
|
@ -128,14 +138,6 @@ int __init pxa_init_dma(int num_ch)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* dma channel priorities on pxa2xx processors:
|
|
||||||
* ch 0 - 3, 16 - 19 <--> (0) DMA_PRIO_HIGH
|
|
||||||
* ch 4 - 7, 20 - 23 <--> (1) DMA_PRIO_MEDIUM
|
|
||||||
* ch 8 - 15, 24 - 31 <--> (2) DMA_PRIO_LOW
|
|
||||||
*/
|
|
||||||
for (i = 0; i < num_ch; i++)
|
|
||||||
dma_channels[i].prio = min((i & 0xf) >> 2, DMA_PRIO_LOW);
|
|
||||||
|
|
||||||
num_dma_channels = num_ch;
|
num_dma_channels = num_ch;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
#ifndef __ASM_ARCH_REGS_AC97_H
|
#ifndef __ASM_ARCH_REGS_AC97_H
|
||||||
#define __ASM_ARCH_REGS_AC97_H
|
#define __ASM_ARCH_REGS_AC97_H
|
||||||
|
|
||||||
|
#include <mach/hardware.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* AC97 Controller registers
|
* AC97 Controller registers
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -41,6 +41,9 @@
|
||||||
#elif defined(CONFIG_PXA27x) || defined(CONFIG_PXA3xx)
|
#elif defined(CONFIG_PXA27x) || defined(CONFIG_PXA3xx)
|
||||||
#define SSCR0_SCR (0x000fff00) /* Serial Clock Rate (mask) */
|
#define SSCR0_SCR (0x000fff00) /* Serial Clock Rate (mask) */
|
||||||
#define SSCR0_SerClkDiv(x) (((x) - 1) << 8) /* Divisor [1..4096] */
|
#define SSCR0_SerClkDiv(x) (((x) - 1) << 8) /* Divisor [1..4096] */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_PXA27x) || defined(CONFIG_PXA3xx)
|
||||||
#define SSCR0_EDSS (1 << 20) /* Extended data size select */
|
#define SSCR0_EDSS (1 << 20) /* Extended data size select */
|
||||||
#define SSCR0_NCS (1 << 21) /* Network clock select */
|
#define SSCR0_NCS (1 << 21) /* Network clock select */
|
||||||
#define SSCR0_RIM (1 << 22) /* Receive FIFO overrrun interrupt mask */
|
#define SSCR0_RIM (1 << 22) /* Receive FIFO overrrun interrupt mask */
|
||||||
|
|
|
@ -88,13 +88,13 @@ static struct pxa3xx_mfp_addr_map pxa310_mfp_addr_map[] __initdata = {
|
||||||
static DEFINE_PXA3_CKEN(common_nand, NAND, 156000000, 0);
|
static DEFINE_PXA3_CKEN(common_nand, NAND, 156000000, 0);
|
||||||
|
|
||||||
static struct clk_lookup common_clkregs[] = {
|
static struct clk_lookup common_clkregs[] = {
|
||||||
INIT_CLKREG(&clk_common_nand, "pxa3xx-nand", "NANDCLK"),
|
INIT_CLKREG(&clk_common_nand, "pxa3xx-nand", NULL),
|
||||||
};
|
};
|
||||||
|
|
||||||
static DEFINE_PXA3_CKEN(pxa310_mmc3, MMC3, 19500000, 0);
|
static DEFINE_PXA3_CKEN(pxa310_mmc3, MMC3, 19500000, 0);
|
||||||
|
|
||||||
static struct clk_lookup pxa310_clkregs[] = {
|
static struct clk_lookup pxa310_clkregs[] = {
|
||||||
INIT_CLKREG(&clk_pxa310_mmc3, "pxa2xx-mci.2", "MMCCLK"),
|
INIT_CLKREG(&clk_pxa310_mmc3, "pxa2xx-mci.2", NULL),
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init pxa300_init(void)
|
static int __init pxa300_init(void)
|
||||||
|
|
|
@ -83,7 +83,7 @@ static struct pxa3xx_mfp_addr_map pxa320_mfp_addr_map[] __initdata = {
|
||||||
static DEFINE_PXA3_CKEN(pxa320_nand, NAND, 104000000, 0);
|
static DEFINE_PXA3_CKEN(pxa320_nand, NAND, 104000000, 0);
|
||||||
|
|
||||||
static struct clk_lookup pxa320_clkregs[] = {
|
static struct clk_lookup pxa320_clkregs[] = {
|
||||||
INIT_CLKREG(&clk_pxa320_nand, "pxa3xx-nand", "NANDCLK"),
|
INIT_CLKREG(&clk_pxa320_nand, "pxa3xx-nand", NULL),
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init pxa320_init(void)
|
static int __init pxa320_init(void)
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <linux/serial_8250.h>
|
#include <linux/serial_8250.h>
|
||||||
#include <linux/ata_platform.h>
|
#include <linux/ata_platform.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
#include <linux/i2c.h>
|
||||||
|
|
||||||
#include <asm/elf.h>
|
#include <asm/elf.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
|
@ -201,8 +202,13 @@ static struct platform_device *devs[] __initdata = {
|
||||||
&pata_device,
|
&pata_device,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct i2c_board_info i2c_rtc = {
|
||||||
|
I2C_BOARD_INFO("pcf8583", 0x50)
|
||||||
|
};
|
||||||
|
|
||||||
static int __init rpc_init(void)
|
static int __init rpc_init(void)
|
||||||
{
|
{
|
||||||
|
i2c_register_board_info(0, &i2c_rtc, 1);
|
||||||
return platform_add_devices(devs, ARRAY_SIZE(devs));
|
return platform_add_devices(devs, ARRAY_SIZE(devs));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -129,7 +129,7 @@ static struct s3c_fb_platdata smdk6410_lcd_pdata __initdata = {
|
||||||
.vidcon1 = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC,
|
.vidcon1 = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct map_desc smdk6410_iodesc[] = {};
|
static struct map_desc smdk6410_iodesc[] = {};
|
||||||
|
|
||||||
static struct platform_device *smdk6410_devices[] __initdata = {
|
static struct platform_device *smdk6410_devices[] __initdata = {
|
||||||
#ifdef CONFIG_SMDK6410_SD_CH0
|
#ifdef CONFIG_SMDK6410_SD_CH0
|
||||||
|
@ -146,7 +146,7 @@ static struct platform_device *smdk6410_devices[] __initdata = {
|
||||||
|
|
||||||
static struct i2c_board_info i2c_devs0[] __initdata = {
|
static struct i2c_board_info i2c_devs0[] __initdata = {
|
||||||
{ I2C_BOARD_INFO("24c08", 0x50), },
|
{ I2C_BOARD_INFO("24c08", 0x50), },
|
||||||
{ I2C_BOARD_INFO("WM8580", 0X1b), },
|
{ I2C_BOARD_INFO("wm8580", 0x1b), },
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct i2c_board_info i2c_devs1[] __initdata = {
|
static struct i2c_board_info i2c_devs1[] __initdata = {
|
||||||
|
|
|
@ -289,7 +289,7 @@ static struct platform_device sa11x0pcmcia_device = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device sa11x0mtd_device = {
|
static struct platform_device sa11x0mtd_device = {
|
||||||
.name = "flash",
|
.name = "sa1100-mtd",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,8 @@ ENTRY(v6_early_abort)
|
||||||
#ifdef CONFIG_CPU_32v6K
|
#ifdef CONFIG_CPU_32v6K
|
||||||
clrex
|
clrex
|
||||||
#else
|
#else
|
||||||
strex r0, r1, [sp] @ Clear the exclusive monitor
|
sub r1, sp, #4 @ Get unused stack location
|
||||||
|
strex r0, r1, [r1] @ Clear the exclusive monitor
|
||||||
#endif
|
#endif
|
||||||
mrc p15, 0, r1, c5, c0, 0 @ get FSR
|
mrc p15, 0, r1, c5, c0, 0 @ get FSR
|
||||||
mrc p15, 0, r0, c6, c0, 0 @ get FAR
|
mrc p15, 0, r0, c6, c0, 0 @ get FAR
|
||||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче