Merge branch 'x86/urgent' into x86/mce2
This commit is contained in:
commit
dc731ca609
4
.mailmap
4
.mailmap
|
@ -92,6 +92,7 @@ Rudolf Marek <R.Marek@sh.cvut.cz>
|
|||
Rui Saraiva <rmps@joel.ist.utl.pt>
|
||||
Sachin P Sant <ssant@in.ibm.com>
|
||||
Sam Ravnborg <sam@mars.ravnborg.org>
|
||||
Sascha Hauer <s.hauer@pengutronix.de>
|
||||
S.Çağlar Onur <caglar@pardus.org.tr>
|
||||
Simon Kelley <simon@thekelleys.org.uk>
|
||||
Stéphane Witzmann <stephane.witzmann@ubpmes.univ-bpclermont.fr>
|
||||
|
@ -100,6 +101,7 @@ Tejun Heo <htejun@gmail.com>
|
|||
Thomas Graf <tgraf@suug.ch>
|
||||
Tony Luck <tony.luck@intel.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 <ukl@pengutronix.de>
|
||||
Uwe Kleine-König <Uwe.Kleine-Koenig@digi.com>
|
||||
Valdis Kletnieks <Valdis.Kletnieks@vt.edu>
|
||||
|
|
1
CREDITS
1
CREDITS
|
@ -2166,7 +2166,6 @@ D: Initial implementation of VC's, pty's and select()
|
|||
|
||||
N: Pavel Machek
|
||||
E: pavel@ucw.cz
|
||||
E: pavel@suse.cz
|
||||
D: Softcursor for vga, hypertech cdrom support, vcsa bugfix, nbd
|
||||
D: sun4/330 port, capabilities for elf, speedup for rm on ext2, USB,
|
||||
D: work on suspend-to-ram/disk, killing duplicates from ioctl32
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
What: /sys/firmware/memmap/
|
||||
Date: June 2008
|
||||
Contact: Bernhard Walle <bwalle@suse.de>
|
||||
Contact: Bernhard Walle <bernhard.walle@gmx.de>
|
||||
Description:
|
||||
On all platforms, the firmware provides a memory map which the
|
||||
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
|
||||
# list of DOCBOOKS.
|
||||
|
||||
DOCBOOKS := z8530book.xml mcabook.xml \
|
||||
DOCBOOKS := z8530book.xml mcabook.xml device-drivers.xml \
|
||||
kernel-hacking.xml kernel-locking.xml deviceiobook.xml \
|
||||
procfs-guide.xml writing_usb_driver.xml networking.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>
|
||||
|
||||
<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">
|
||||
<title>Data Types</title>
|
||||
<sect1><title>Doubly Linked Lists</title>
|
||||
|
@ -298,62 +246,6 @@ X!Earch/x86/kernel/mca_32.c
|
|||
!Ikernel/acct.c
|
||||
</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">
|
||||
<title>Block Devices</title>
|
||||
!Eblock/blk-core.c
|
||||
|
@ -381,275 +273,6 @@ X!Edrivers/pnp/system.c
|
|||
!Edrivers/char/misc.c
|
||||
</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">
|
||||
<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)
|
||||
|
||||
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
|
||||
module init. Note that after service driver being loaded, calls
|
||||
such as pci_enable_device(dev) and pci_set_master(dev) are no longer
|
||||
|
|
|
@ -252,10 +252,8 @@ cgroup file system directories.
|
|||
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
|
||||
desired collection of cgroups then that group is reused, else a new
|
||||
css_set is allocated. Note that the current implementation uses a
|
||||
linear search to locate an appropriate existing css_set, so isn't
|
||||
very efficient. A future version will use a hash table for better
|
||||
performance.
|
||||
css_set is allocated. The appropriate existing css_set is located by
|
||||
looking into a hash table.
|
||||
|
||||
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;
|
||||
|
|
|
@ -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 sched_setaffinity, to mask the requested CPUs by what's
|
||||
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.
|
||||
- in the mbind and set_mempolicy system calls, to mask the requested
|
||||
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_hardwall flag: is memory allocation hardwalled
|
||||
- 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:
|
||||
- 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
|
||||
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
|
||||
computing jobs that will dramatically fail to meet required performance
|
||||
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
|
||||
kernel data structures such as the task list increases more than
|
||||
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.
|
||||
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
|
||||
|
@ -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
|
||||
cpuset code to the scheduler code a partition of the load balanced
|
||||
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
|
||||
the CPUs that must be load balanced.
|
||||
as an array of struct cpumask) of CPUs, pairwise disjoint, that cover
|
||||
all the CPUs that must be load balanced.
|
||||
|
||||
Whenever the 'sched_load_balance' flag changes, or CPUs come or go
|
||||
from a cpuset with this flag enabled, or a cpuset with this flag
|
||||
enabled is removed, the cpuset code builds a new such partition and
|
||||
passes it to the scheduler sched domain setup code, to have the sched
|
||||
domains rebuilt as necessary.
|
||||
The cpuset code builds a new such partition and passes it to the
|
||||
scheduler sched domain setup code, to have the sched domains rebuilt
|
||||
as necessary, whenever:
|
||||
- the 'sched_load_balance' flag of a cpuset with non-empty CPUs changes,
|
||||
- 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
|
||||
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.
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
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
|
||||
will have its allowed CPU placement changed immediately. Similarly,
|
||||
if a tasks pid is written to a cpusets 'tasks' file, in either its
|
||||
current cpuset or another cpuset, then its allowed CPU placement is
|
||||
changed immediately. If such a task had been bound to some subset
|
||||
of its cpuset using the sched_setaffinity() call, the task will be
|
||||
allowed to run on any CPU allowed in its new cpuset, negating the
|
||||
affect of the prior sched_setaffinity() call.
|
||||
if a tasks pid is written to another cpusets 'tasks' file, then its
|
||||
allowed CPU placement is changed immediately. If such a task had been
|
||||
bound to some subset of its cpuset using the sched_setaffinity() call,
|
||||
the task will be allowed to run on any CPU allowed in its new cpuset,
|
||||
negating the effect of the prior sched_setaffinity() call.
|
||||
|
||||
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,
|
||||
but the processor placement is not updated, until that tasks pid is
|
||||
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.
|
||||
and the processor placement is updated immediately.
|
||||
|
||||
Normally, once a page is allocated (given a physical page
|
||||
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'
|
||||
cat /proc/self/cpuset
|
||||
|
||||
In the future, a C library interface to cpusets will likely be
|
||||
available. For now, the only way to query or modify cpusets is
|
||||
via the cpuset file system, using the various cd, mkdir, echo, cat,
|
||||
rmdir commands from the shell, or their equivalent from C.
|
||||
There are ways to query or modify cpusets:
|
||||
- via the cpuset file system directly, using the various cd, mkdir, echo,
|
||||
cat, 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
|
||||
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
|
||||
|
||||
mount -t cgroup -ocpuset X /dev/cpuset
|
||||
mount -t cgroup -ocpuset,noprefix X /dev/cpuset
|
||||
echo "/sbin/cpuset_release_agent" > /dev/cpuset/release_agent
|
||||
|
||||
2.2 Adding/removing cpus
|
||||
|
|
|
@ -137,7 +137,7 @@ static void cn_test_timer_func(unsigned long __data)
|
|||
|
||||
memcpy(m + 1, data, m->len);
|
||||
|
||||
cn_netlink_send(m, 0, gfp_any());
|
||||
cn_netlink_send(m, 0, GFP_ATOMIC);
|
||||
kfree(m);
|
||||
}
|
||||
|
||||
|
@ -160,10 +160,8 @@ static int cn_test_init(void)
|
|||
goto err_out;
|
||||
}
|
||||
|
||||
init_timer(&cn_test_timer);
|
||||
cn_test_timer.function = cn_test_timer_func;
|
||||
setup_timer(&cn_test_timer, cn_test_timer_func, 0);
|
||||
cn_test_timer.expires = jiffies + HZ;
|
||||
cn_test_timer.data = 0;
|
||||
add_timer(&cn_test_timer);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -195,19 +195,3 @@ scaling_setspeed. By "echoing" a new frequency into this
|
|||
you can change the speed of the CPU,
|
||||
but only within the limits of
|
||||
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
|
||||
~~~~~~~~~~
|
||||
struct device_attribute {
|
||||
struct attribute attr;
|
||||
ssize_t (*show)(struct device * dev, char * buf, size_t count, loff_t off);
|
||||
ssize_t (*store)(struct device * dev, const char * buf, size_t count, loff_t off);
|
||||
struct attribute attr;
|
||||
ssize_t (*show)(struct device *dev, struct device_attribute *attr,
|
||||
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
|
||||
|
|
|
@ -9,6 +9,7 @@ that support it. For example, a given bus might look like this:
|
|||
| |-- class
|
||||
| |-- config
|
||||
| |-- device
|
||||
| |-- enable
|
||||
| |-- irq
|
||||
| |-- local_cpus
|
||||
| |-- resource
|
||||
|
@ -32,6 +33,7 @@ files, each with their own function.
|
|||
class PCI class (ascii, ro)
|
||||
config PCI config space (binary, rw)
|
||||
device PCI device (ascii, ro)
|
||||
enable Whether the device is enabled (ascii, rw)
|
||||
irq IRQ number (ascii, ro)
|
||||
local_cpus nearby CPU mask (cpumask, 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
|
||||
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
|
||||
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
|
||||
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
|
||||
----------------------------------------
|
||||
|
|
|
@ -2,8 +2,10 @@
|
|||
sysfs - _The_ filesystem for exporting kernel objects.
|
||||
|
||||
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:
|
||||
|
@ -64,12 +66,13 @@ An attribute definition is simply:
|
|||
|
||||
struct attribute {
|
||||
char * name;
|
||||
struct module *owner;
|
||||
mode_t mode;
|
||||
};
|
||||
|
||||
|
||||
int sysfs_create_file(struct kobject * kobj, struct attribute * attr);
|
||||
void sysfs_remove_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, const struct attribute * attr);
|
||||
|
||||
|
||||
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:
|
||||
|
||||
struct device_attribute {
|
||||
struct attribute attr;
|
||||
ssize_t (*show)(struct device * dev, char * buf);
|
||||
ssize_t (*store)(struct device * dev, const char * buf);
|
||||
struct attribute attr;
|
||||
ssize_t (*show)(struct device *dev, struct device_attribute *attr,
|
||||
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 *);
|
||||
|
@ -90,12 +95,8 @@ void device_remove_file(struct device *, struct device_attribute *);
|
|||
|
||||
It also defines this helper for defining device attributes:
|
||||
|
||||
#define DEVICE_ATTR(_name, _mode, _show, _store) \
|
||||
struct device_attribute dev_attr_##_name = { \
|
||||
.attr = {.name = __stringify(_name) , .mode = _mode }, \
|
||||
.show = _show, \
|
||||
.store = _store, \
|
||||
};
|
||||
#define DEVICE_ATTR(_name, _mode, _show, _store) \
|
||||
struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)
|
||||
|
||||
For example, declaring
|
||||
|
||||
|
@ -107,9 +108,9 @@ static struct device_attribute dev_attr_foo = {
|
|||
.attr = {
|
||||
.name = "foo",
|
||||
.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
|
||||
simple as those defined for device attributes:
|
||||
|
||||
ssize_t (*show)(struct device * dev, char * buf);
|
||||
ssize_t (*store)(struct device * dev, const char * buf);
|
||||
ssize_t (*show)(struct device * dev, struct device_attribute * attr,
|
||||
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
|
||||
|
@ -299,14 +302,16 @@ The following interface layers currently exist in sysfs:
|
|||
Structure:
|
||||
|
||||
struct device_attribute {
|
||||
struct attribute attr;
|
||||
ssize_t (*show)(struct device * dev, char * buf);
|
||||
ssize_t (*store)(struct device * dev, const char * buf);
|
||||
struct attribute attr;
|
||||
ssize_t (*show)(struct device *dev, struct device_attribute *attr,
|
||||
char *buf);
|
||||
ssize_t (*store)(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count);
|
||||
};
|
||||
|
||||
Declaring:
|
||||
|
||||
DEVICE_ATTR(_name, _str, _mode, _show, _store);
|
||||
DEVICE_ATTR(_name, _mode, _show, _store);
|
||||
|
||||
Creation/Removal:
|
||||
|
||||
|
@ -342,7 +347,8 @@ Structure:
|
|||
struct driver_attribute {
|
||||
struct attribute attr;
|
||||
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:
|
||||
|
|
|
@ -79,13 +79,6 @@ Mount options
|
|||
|
||||
(*) == 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
|
||||
media that read faster sequentially
|
||||
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
|
||||
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
|
||||
----------------
|
||||
|
||||
|
|
|
@ -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
|
||||
"/**" to be begin a comment block unless the comment block contains
|
||||
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
|
||||
or data structure being described.
|
||||
|
@ -63,7 +64,7 @@ Example kernel-doc function comment:
|
|||
* comment lines.
|
||||
*
|
||||
* The longer description can have multiple paragraphs.
|
||||
**/
|
||||
*/
|
||||
|
||||
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.
|
||||
*
|
||||
* Longer description of this structure.
|
||||
**/
|
||||
*/
|
||||
|
||||
The kernel-doc function comments describe each parameter to the
|
||||
function, in order, with the @name lines.
|
||||
|
|
|
@ -134,7 +134,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
|
||||
acpi= [HW,ACPI,X86-64,i386]
|
||||
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
|
||||
off -- disable ACPI if default was on
|
||||
noirq -- do not use ACPI for IRQ routing
|
||||
|
|
|
@ -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
|
||||
try again. Buffers are enlarged by first seeing how large the current buffers
|
||||
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
|
||||
instance:
|
||||
$ echo 0 > /debug/tracing/tracing_enabled
|
||||
$ echo 128000 > /debug/tracing/trace_entries
|
||||
$ echo 1 > /debug/tracing/tracing_enabled
|
||||
$ echo 128000 > /debug/tracing/buffer_size_kb
|
||||
Then start again from the top.
|
||||
|
||||
If you are doing a trace for a driver project, e.g. Nouveau, you should also
|
||||
|
|
53
MAINTAINERS
53
MAINTAINERS
|
@ -692,6 +692,13 @@ M: kernel@wantstofly.org
|
|||
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
||||
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
|
||||
P: Jonathan Layes
|
||||
L: netdev@vger.kernel.org
|
||||
|
@ -911,7 +918,7 @@ S: Maintained
|
|||
BLACKFIN ARCHITECTURE
|
||||
P: Bryan Wu
|
||||
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
|
||||
S: Supported
|
||||
|
||||
|
@ -1021,6 +1028,14 @@ M: mb@bu3sch.de
|
|||
W: http://bu3sch.de/btgpio.php
|
||||
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
|
||||
P: Mauro Carvalho Chehab
|
||||
M: mchehab@infradead.org
|
||||
|
@ -1194,6 +1209,8 @@ S: Supported
|
|||
CONTROL GROUPS (CGROUPS)
|
||||
P: Paul Menage
|
||||
M: menage@google.com
|
||||
P: Li Zefan
|
||||
M: lizf@cn.fujitsu.com
|
||||
L: containers@lists.linux-foundation.org
|
||||
S: Maintained
|
||||
|
||||
|
@ -1895,10 +1912,10 @@ W: http://gigaset307x.sourceforge.net/
|
|||
S: Maintained
|
||||
|
||||
HARD DRIVE ACTIVE PROTECTION SYSTEM (HDAPS) DRIVER
|
||||
P: Robert Love
|
||||
M: rlove@rlove.org
|
||||
M: linux-kernel@vger.kernel.org
|
||||
W: http://www.kernel.org/pub/linux/kernel/people/rml/hdaps/
|
||||
P: Frank Seidel
|
||||
M: frank@f-seidel.de
|
||||
L: lm-sensors@lm-sensors.org
|
||||
W: http://www.kernel.org/pub/linux/kernel/people/fseidel/hdaps/
|
||||
S: Maintained
|
||||
|
||||
GSPCA FINEPIX SUBDRIVER
|
||||
|
@ -1991,7 +2008,7 @@ S: Maintained
|
|||
|
||||
HIBERNATION (aka Software Suspend, aka swsusp)
|
||||
P: Pavel Machek
|
||||
M: pavel@suse.cz
|
||||
M: pavel@ucw.cz
|
||||
P: Rafael J. Wysocki
|
||||
M: rjw@sisk.pl
|
||||
L: linux-pm@lists.linux-foundation.org
|
||||
|
@ -2212,7 +2229,7 @@ P: Sean Hefty
|
|||
M: sean.hefty@intel.com
|
||||
P: Hal Rosenstock
|
||||
M: hal.rosenstock@gmail.com
|
||||
L: general@lists.openfabrics.org
|
||||
L: general@lists.openfabrics.org (moderated for non-subscribers)
|
||||
W: http://www.openib.org/
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git
|
||||
S: Supported
|
||||
|
@ -3317,8 +3334,8 @@ P: Jeremy Fitzhardinge
|
|||
M: jeremy@xensource.com
|
||||
P: Chris Wright
|
||||
M: chrisw@sous-sol.org
|
||||
P: Zachary Amsden
|
||||
M: zach@vmware.com
|
||||
P: Alok Kataria
|
||||
M: akataria@vmware.com
|
||||
P: Rusty Russell
|
||||
M: rusty@rustcorp.com.au
|
||||
L: virtualization@lists.osdl.org
|
||||
|
@ -3529,6 +3546,12 @@ S: Maintained
|
|||
PXA MMCI DRIVER
|
||||
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
|
||||
P: Andrew Vasquez
|
||||
M: linux-driver@qlogic.com
|
||||
|
@ -4156,7 +4179,7 @@ SUSPEND TO RAM
|
|||
P: Len Brown
|
||||
M: len.brown@intel.com
|
||||
P: Pavel Machek
|
||||
M: pavel@suse.cz
|
||||
M: pavel@ucw.cz
|
||||
P: Rafael J. Wysocki
|
||||
M: rjw@sisk.pl
|
||||
L: linux-pm@lists.linux-foundation.org
|
||||
|
@ -4277,8 +4300,8 @@ P: Rajiv Andrade
|
|||
M: srajiv@linux.vnet.ibm.com
|
||||
W: http://tpmdd.sourceforge.net
|
||||
P: Marcel Selhorst
|
||||
M: tpm@selhorst.net
|
||||
W: http://www.prosec.rub.de/tpm/
|
||||
M: m.selhorst@sirrix.com
|
||||
W: http://www.sirrix.com
|
||||
L: tpmdd-devel@lists.sourceforge.net (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
|
||||
|
@ -4908,11 +4931,11 @@ L: zd1211-devs@lists.sourceforge.net (subscribers-only)
|
|||
S: Maintained
|
||||
|
||||
ZR36067 VIDEO FOR LINUX DRIVER
|
||||
P: Ronald Bultje
|
||||
M: rbultje@ronald.bitfreak.net
|
||||
L: mjpeg-users@lists.sourceforge.net
|
||||
L: linux-media@vger.kernel.org
|
||||
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
|
||||
P: Maciej W. Rozycki
|
||||
|
|
4
Makefile
4
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 29
|
||||
EXTRAVERSION = -rc3
|
||||
EXTRAVERSION = -rc6
|
||||
NAME = Erotic Pickled Herring
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -389,6 +389,7 @@ PHONY += outputmakefile
|
|||
# output directory.
|
||||
outputmakefile:
|
||||
ifneq ($(KBUILD_SRC),)
|
||||
$(Q)ln -fsn $(srctree) source
|
||||
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \
|
||||
$(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
|
||||
endif
|
||||
|
@ -946,7 +947,6 @@ ifneq ($(KBUILD_SRC),)
|
|||
mkdir -p include2; \
|
||||
ln -fsn $(srctree)/include/asm-$(SRCARCH) include2/asm; \
|
||||
fi
|
||||
ln -fsn $(srctree) source
|
||||
endif
|
||||
|
||||
# prepare2 creates a makefile if using a separate output directory
|
||||
|
|
2
README
2
README
|
@ -188,7 +188,7 @@ CONFIGURING the kernel:
|
|||
values to random values.
|
||||
|
||||
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":
|
||||
- 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
|
||||
function loaded the GP, so this could fail in modules. */
|
||||
#define BUG() { \
|
||||
#define BUG() do { \
|
||||
__asm__ __volatile__( \
|
||||
"call_pal %0 # bugchk\n\t" \
|
||||
".long %1\n\t.8byte %2" \
|
||||
: : "i"(PAL_bugchk), "i"(__LINE__), "i"(__FILE__)); \
|
||||
for ( ; ; ); }
|
||||
for ( ; ; ); } while (0)
|
||||
|
||||
#define HAVE_ARCH_BUG
|
||||
#endif
|
||||
|
|
|
@ -93,8 +93,8 @@ common_shutdown_1(void *generic_ptr)
|
|||
if (cpuid != boot_cpuid) {
|
||||
flags |= 0x00040000UL; /* "remain halted" */
|
||||
*pflags = flags;
|
||||
cpu_clear(cpuid, cpu_present_map);
|
||||
cpu_clear(cpuid, cpu_possible_map);
|
||||
set_cpu_present(cpuid, false);
|
||||
set_cpu_possible(cpuid, false);
|
||||
halt();
|
||||
}
|
||||
#endif
|
||||
|
@ -120,8 +120,8 @@ common_shutdown_1(void *generic_ptr)
|
|||
|
||||
#ifdef CONFIG_SMP
|
||||
/* Wait for the secondaries to halt. */
|
||||
cpu_clear(boot_cpuid, cpu_present_map);
|
||||
cpu_clear(boot_cpuid, cpu_possible_map);
|
||||
set_cpu_present(boot_cpuid, false);
|
||||
set_cpu_possible(boot_cpuid, false);
|
||||
while (cpus_weight(cpu_present_map))
|
||||
barrier();
|
||||
#endif
|
||||
|
|
|
@ -120,12 +120,12 @@ void __cpuinit
|
|||
smp_callin(void)
|
||||
{
|
||||
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);
|
||||
BUG();
|
||||
}
|
||||
set_cpu_online(cpuid, true);
|
||||
|
||||
/* Turn on machine checks. */
|
||||
wrmces(7);
|
||||
|
@ -436,8 +436,8 @@ setup_smp(void)
|
|||
((char *)cpubase + i*hwrpb->processor_size);
|
||||
if ((cpu->flags & 0x1cc) == 0x1cc) {
|
||||
smp_num_probed++;
|
||||
cpu_set(i, cpu_possible_map);
|
||||
cpu_set(i, cpu_present_map);
|
||||
set_cpu_possible(i, true);
|
||||
set_cpu_present(i, true);
|
||||
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. */
|
||||
if (smp_num_probed == 1 || max_cpus == 0) {
|
||||
cpu_possible_map = cpumask_of_cpu(boot_cpuid);
|
||||
cpu_present_map = cpumask_of_cpu(boot_cpuid);
|
||||
init_cpu_possible(cpumask_of(boot_cpuid));
|
||||
init_cpu_present(cpumask_of(boot_cpuid));
|
||||
printk(KERN_INFO "SMP mode deactivated.\n");
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -608,7 +608,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y
|
|||
# Watchdog Device Drivers
|
||||
#
|
||||
# CONFIG_SOFT_WATCHDOG is not set
|
||||
CONFIG_AT91SAM9_WATCHDOG=y
|
||||
CONFIG_AT91SAM9X_WATCHDOG=y
|
||||
|
||||
#
|
||||
# USB-based Watchdog Cards
|
||||
|
|
|
@ -700,7 +700,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y
|
|||
# Watchdog Device Drivers
|
||||
#
|
||||
# CONFIG_SOFT_WATCHDOG is not set
|
||||
CONFIG_AT91SAM9_WATCHDOG=y
|
||||
CONFIG_AT91SAM9X_WATCHDOG=y
|
||||
|
||||
#
|
||||
# USB-based Watchdog Cards
|
||||
|
|
|
@ -710,7 +710,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y
|
|||
# Watchdog Device Drivers
|
||||
#
|
||||
# CONFIG_SOFT_WATCHDOG is not set
|
||||
CONFIG_AT91SAM9_WATCHDOG=y
|
||||
CONFIG_AT91SAM9X_WATCHDOG=y
|
||||
|
||||
#
|
||||
# USB-based Watchdog Cards
|
||||
|
|
|
@ -606,7 +606,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y
|
|||
# Watchdog Device Drivers
|
||||
#
|
||||
# CONFIG_SOFT_WATCHDOG is not set
|
||||
CONFIG_AT91SAM9_WATCHDOG=y
|
||||
CONFIG_AT91SAM9X_WATCHDOG=y
|
||||
|
||||
#
|
||||
# Sonics Silicon Backplane
|
||||
|
|
|
@ -727,7 +727,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y
|
|||
# Watchdog Device Drivers
|
||||
#
|
||||
# CONFIG_SOFT_WATCHDOG is not set
|
||||
# CONFIG_AT91SAM9_WATCHDOG is not set
|
||||
# CONFIG_AT91SAM9X_WATCHDOG is not set
|
||||
|
||||
#
|
||||
# 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)
|
||||
{
|
||||
if (executable_stack != EXSTACK_ENABLE_X)
|
||||
if (executable_stack != EXSTACK_DISABLE_X)
|
||||
return 1;
|
||||
if (cpu_architecture() <= CPU_ARCH_ARMv6)
|
||||
if (cpu_architecture() < CPU_ARCH_ARMv6)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -650,6 +650,7 @@ ENTRY(fp_enter)
|
|||
no_fp: mov pc, lr
|
||||
|
||||
__und_usr_unknown:
|
||||
enable_irq
|
||||
mov r0, sp
|
||||
adr lr, ret_from_exception
|
||||
b do_undefinstr
|
||||
|
|
|
@ -136,7 +136,7 @@ ENTRY(mcount)
|
|||
ldmia sp!, {r0-r3, pc}
|
||||
|
||||
trace:
|
||||
ldr r1, [fp, #-4]
|
||||
ldr r1, [fp, #-4] @ lr of instrumented routine
|
||||
mov r0, lr
|
||||
sub r0, r0, #MCOUNT_INSN_SIZE
|
||||
mov lr, pc
|
||||
|
|
|
@ -101,7 +101,7 @@ unlock:
|
|||
/* Handle bad interrupts */
|
||||
static struct irq_desc bad_irq_desc = {
|
||||
.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/mach-types.h>
|
||||
|
||||
const extern unsigned char relocate_new_kernel[];
|
||||
const extern unsigned int relocate_new_kernel_size;
|
||||
extern const unsigned char relocate_new_kernel[];
|
||||
extern const unsigned int relocate_new_kernel_size;
|
||||
|
||||
extern void setup_mm_for_reboot(char mode);
|
||||
|
||||
|
|
|
@ -697,7 +697,7 @@ static void __init at91_add_device_rtt(void)
|
|||
* 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 = {
|
||||
.name = "at91_wdt",
|
||||
.id = -1,
|
||||
|
|
|
@ -643,7 +643,7 @@ static void __init at91_add_device_rtt(void)
|
|||
* 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 = {
|
||||
.name = "at91_wdt",
|
||||
.id = -1,
|
||||
|
|
|
@ -621,7 +621,7 @@ static void __init at91_add_device_rtt(void)
|
|||
* 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 = {
|
||||
.name = "at91_wdt",
|
||||
.id = -1,
|
||||
|
|
|
@ -854,7 +854,7 @@ static void __init at91_add_device_rtt(void)
|
|||
* 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 = {
|
||||
.name = "at91_wdt",
|
||||
.id = -1,
|
||||
|
|
|
@ -609,7 +609,7 @@ static void __init at91_add_device_rtt(void)
|
|||
* 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 = {
|
||||
.name = "at91_wdt",
|
||||
.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.
|
||||
*/
|
||||
static struct lock_class_key gpio_lock_class;
|
||||
|
@ -509,9 +510,6 @@ void __init at91_gpio_irq_setup(void)
|
|||
unsigned id = this->id;
|
||||
unsigned i;
|
||||
|
||||
/* enable PIO controller's clock */
|
||||
clk_enable(this->clock);
|
||||
|
||||
__raw_writel(~0, this->regbase + PIO_IDR);
|
||||
|
||||
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->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)
|
||||
last->next = data;
|
||||
}
|
||||
|
|
|
@ -93,6 +93,7 @@ struct atmel_nand_data {
|
|||
u8 enable_pin; /* chip enable */
|
||||
u8 det_pin; /* card detect */
|
||||
u8 rdy_pin; /* ready/busy */
|
||||
u8 rdy_pin_active_low; /* rdy_pin value is inverted */
|
||||
u8 ale; /* address line number connected to ALE */
|
||||
u8 cle; /* address line number connected to CLE */
|
||||
u8 bus_width_16; /* buswidth is 16 bit */
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
/*
|
||||
* arch/arm/mach-ep93xx/include/mach/gesbc9312.h
|
||||
*/
|
|
@ -10,7 +10,6 @@
|
|||
|
||||
#include "platform.h"
|
||||
|
||||
#include "gesbc9312.h"
|
||||
#include "ts72xx.h"
|
||||
|
||||
#endif
|
||||
|
|
|
@ -42,7 +42,7 @@ void __init kirkwood_init_irq(void)
|
|||
writel(0, GPIO_EDGE_CAUSE(32));
|
||||
|
||||
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);
|
||||
irq_desc[i].status |= IRQ_LEVEL;
|
||||
set_irq_flags(i, IRQF_VALID);
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/flash.h>
|
||||
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/board.h>
|
||||
#include <mach/msm_iomap.h>
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@ void __init mv78xx0_init_irq(void)
|
|||
writel(0, GPIO_EDGE_CAUSE(0));
|
||||
|
||||
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);
|
||||
irq_desc[i].status |= IRQ_LEVEL;
|
||||
set_irq_flags(i, IRQF_VALID);
|
||||
|
|
|
@ -181,7 +181,7 @@ void __init omap1_init_mmc(struct omap_mmc_platform_data **mmc_data,
|
|||
}
|
||||
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 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)
|
||||
static void omap_mcbsp_clk_init(struct mcbsp_internal_clk *mclk)
|
||||
{
|
||||
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)
|
||||
{ }
|
||||
const char *clk_names[] = { "dsp_ck", "api_ck", "dspxor_ck" };
|
||||
#endif
|
||||
|
||||
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,
|
||||
.tx_irq = INT_McBSP1TX,
|
||||
.ops = &omap1_mcbsp_ops,
|
||||
.clk_name = "mcbsp_clk",
|
||||
},
|
||||
.clk_names = clk_names,
|
||||
.num_clks = 3,
|
||||
},
|
||||
{
|
||||
.phys_base = OMAP1510_MCBSP2_BASE,
|
||||
.dma_rx_sync = OMAP_DMA_MCBSP2_RX,
|
||||
|
@ -184,7 +112,8 @@ static struct omap_mcbsp_platform_data omap15xx_mcbsp_pdata[] = {
|
|||
.rx_irq = INT_McBSP3RX,
|
||||
.tx_irq = INT_McBSP3TX,
|
||||
.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)
|
||||
|
@ -202,7 +131,8 @@ static struct omap_mcbsp_platform_data omap16xx_mcbsp_pdata[] = {
|
|||
.rx_irq = INT_McBSP1RX,
|
||||
.tx_irq = INT_McBSP1TX,
|
||||
.ops = &omap1_mcbsp_ops,
|
||||
.clk_name = "mcbsp_clk",
|
||||
.clk_names = clk_names,
|
||||
.num_clks = 3,
|
||||
},
|
||||
{
|
||||
.phys_base = OMAP1610_MCBSP2_BASE,
|
||||
|
@ -219,7 +149,8 @@ static struct omap_mcbsp_platform_data omap16xx_mcbsp_pdata[] = {
|
|||
.rx_irq = INT_McBSP3RX,
|
||||
.tx_irq = INT_McBSP3TX,
|
||||
.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)
|
||||
|
@ -230,15 +161,6 @@ static struct omap_mcbsp_platform_data omap16xx_mcbsp_pdata[] = {
|
|||
|
||||
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())
|
||||
omap_mcbsp_count = OMAP730_MCBSP_PDATA_SZ;
|
||||
if (cpu_is_omap15xx())
|
||||
|
|
|
@ -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,
|
||||
* 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)
|
||||
{
|
||||
|
@ -577,7 +577,7 @@ u32 omap2_divisor_to_clksel(struct clk *clk, u32 div)
|
|||
|
||||
clks = omap2_get_clksel_by_parent(clk, clk->parent);
|
||||
if (clks == NULL)
|
||||
return 0;
|
||||
return ~0;
|
||||
|
||||
for (clkr = clks->rates; clkr->div; clkr++) {
|
||||
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 "
|
||||
"clock %s parent %s\n", div, clk->name,
|
||||
clk->parent->name);
|
||||
return 0;
|
||||
return ~0;
|
||||
}
|
||||
|
||||
return clkr->val;
|
||||
|
@ -708,7 +708,7 @@ static u32 omap2_clksel_get_src_field(void __iomem **src_addr,
|
|||
return 0;
|
||||
|
||||
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 */
|
||||
}
|
||||
|
||||
|
@ -746,7 +746,7 @@ int omap2_clk_set_parent(struct clk *clk, struct clk *new_parent)
|
|||
return -EINVAL;
|
||||
|
||||
if (clk->usecount > 0)
|
||||
_omap2_clk_disable(clk);
|
||||
omap2_clk_disable(clk);
|
||||
|
||||
/* Set new source value (previous dividers if any in effect) */
|
||||
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();
|
||||
}
|
||||
|
||||
if (clk->usecount > 0)
|
||||
_omap2_clk_enable(clk);
|
||||
|
||||
clk->parent = new_parent;
|
||||
|
||||
if (clk->usecount > 0)
|
||||
omap2_clk_enable(clk);
|
||||
|
||||
/* CLKSEL clocks follow their parents' rates, divided by a divisor */
|
||||
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 i;
|
||||
char *name;
|
||||
|
||||
for (i = 0; i < nr_controllers; i++) {
|
||||
unsigned long base, size;
|
||||
|
@ -450,12 +451,14 @@ void __init omap2_init_mmc(struct omap_mmc_platform_data **mmc_data,
|
|||
continue;
|
||||
}
|
||||
|
||||
if (cpu_is_omap2420())
|
||||
if (cpu_is_omap2420()) {
|
||||
size = OMAP2420_MMC_SIZE;
|
||||
else
|
||||
name = "mmci-omap";
|
||||
} else {
|
||||
size = HSMMC_SIZE;
|
||||
|
||||
omap_mmc_add(i, base, size, irq, mmc_data[i]);
|
||||
name = "mmci-omap-hs";
|
||||
}
|
||||
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;
|
||||
rev_name = "ES3.0";
|
||||
break;
|
||||
case 4:
|
||||
omap_revision = OMAP3430_REV_ES3_1;
|
||||
rev_name = "ES3.1";
|
||||
break;
|
||||
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";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -134,6 +134,7 @@ static struct irq_chip omap_irq_chip = {
|
|||
.ack = omap_mask_ack_irq,
|
||||
.mask = omap_mask_irq,
|
||||
.unmask = omap_unmask_irq,
|
||||
.disable = omap_mask_irq,
|
||||
};
|
||||
|
||||
static void __init omap_irq_bank_init_one(struct omap_irq_bank *bank)
|
||||
|
|
|
@ -24,106 +24,7 @@
|
|||
#include <mach/cpu.h>
|
||||
#include <mach/mcbsp.h>
|
||||
|
||||
struct mcbsp_internal_clk {
|
||||
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
|
||||
const char *clk_names[] = { "mcbsp_ick", "mcbsp_fck" };
|
||||
|
||||
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,
|
||||
.tx_irq = INT_24XX_MCBSP1_IRQ_TX,
|
||||
.ops = &omap2_mcbsp_ops,
|
||||
.clk_name = "mcbsp_clk",
|
||||
.clk_names = clk_names,
|
||||
.num_clks = 2,
|
||||
},
|
||||
{
|
||||
.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,
|
||||
.tx_irq = INT_24XX_MCBSP2_IRQ_TX,
|
||||
.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)
|
||||
|
@ -183,7 +86,8 @@ static struct omap_mcbsp_platform_data omap2430_mcbsp_pdata[] = {
|
|||
.rx_irq = INT_24XX_MCBSP1_IRQ_RX,
|
||||
.tx_irq = INT_24XX_MCBSP1_IRQ_TX,
|
||||
.ops = &omap2_mcbsp_ops,
|
||||
.clk_name = "mcbsp_clk",
|
||||
.clk_names = clk_names,
|
||||
.num_clks = 2,
|
||||
},
|
||||
{
|
||||
.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,
|
||||
.tx_irq = INT_24XX_MCBSP2_IRQ_TX,
|
||||
.ops = &omap2_mcbsp_ops,
|
||||
.clk_name = "mcbsp_clk",
|
||||
.clk_names = clk_names,
|
||||
.num_clks = 2,
|
||||
},
|
||||
{
|
||||
.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,
|
||||
.tx_irq = INT_24XX_MCBSP3_IRQ_TX,
|
||||
.ops = &omap2_mcbsp_ops,
|
||||
.clk_name = "mcbsp_clk",
|
||||
.clk_names = clk_names,
|
||||
.num_clks = 2,
|
||||
},
|
||||
{
|
||||
.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,
|
||||
.tx_irq = INT_24XX_MCBSP4_IRQ_TX,
|
||||
.ops = &omap2_mcbsp_ops,
|
||||
.clk_name = "mcbsp_clk",
|
||||
.clk_names = clk_names,
|
||||
.num_clks = 2,
|
||||
},
|
||||
{
|
||||
.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,
|
||||
.tx_irq = INT_24XX_MCBSP5_IRQ_TX,
|
||||
.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)
|
||||
|
@ -237,7 +145,8 @@ static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = {
|
|||
.rx_irq = INT_24XX_MCBSP1_IRQ_RX,
|
||||
.tx_irq = INT_24XX_MCBSP1_IRQ_TX,
|
||||
.ops = &omap2_mcbsp_ops,
|
||||
.clk_name = "mcbsp_clk",
|
||||
.clk_names = clk_names,
|
||||
.num_clks = 2,
|
||||
},
|
||||
{
|
||||
.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,
|
||||
.tx_irq = INT_24XX_MCBSP2_IRQ_TX,
|
||||
.ops = &omap2_mcbsp_ops,
|
||||
.clk_name = "mcbsp_clk",
|
||||
.clk_names = clk_names,
|
||||
.num_clks = 2,
|
||||
},
|
||||
{
|
||||
.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,
|
||||
.tx_irq = INT_24XX_MCBSP3_IRQ_TX,
|
||||
.ops = &omap2_mcbsp_ops,
|
||||
.clk_name = "mcbsp_clk",
|
||||
.clk_names = clk_names,
|
||||
.num_clks = 2,
|
||||
},
|
||||
{
|
||||
.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,
|
||||
.tx_irq = INT_24XX_MCBSP4_IRQ_TX,
|
||||
.ops = &omap2_mcbsp_ops,
|
||||
.clk_name = "mcbsp_clk",
|
||||
.clk_names = clk_names,
|
||||
.num_clks = 2,
|
||||
},
|
||||
{
|
||||
.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,
|
||||
.tx_irq = INT_24XX_MCBSP5_IRQ_TX,
|
||||
.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)
|
||||
|
@ -284,14 +197,6 @@ static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = {
|
|||
|
||||
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())
|
||||
omap_mcbsp_count = OMAP2420_MCBSP_PDATA_SZ;
|
||||
if (cpu_is_omap2430())
|
||||
|
|
|
@ -93,9 +93,8 @@ ENTRY(omap24xx_cpu_suspend)
|
|||
orr r4, r4, #0x40 @ enable self refresh on idle req
|
||||
mov r5, #0x2000 @ set delay (DPLL relock + DLL relock)
|
||||
str r4, [r2] @ make it so
|
||||
mov r2, #0
|
||||
nop
|
||||
mcr p15, 0, r2, c7, c0, 4 @ wait for interrupt
|
||||
mcr p15, 0, r3, c7, c0, 4 @ wait for interrupt
|
||||
nop
|
||||
loop:
|
||||
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_delta2ns(0xffffffff, &clockevent_gpt);
|
||||
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);
|
||||
clockevents_register_device(&clockevent_gpt);
|
||||
|
|
|
@ -44,7 +44,7 @@ void __init orion5x_init_irq(void)
|
|||
* User can use set_type() if he wants to use edge types handlers.
|
||||
*/
|
||||
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);
|
||||
irq_desc[i].status |= IRQ_LEVEL;
|
||||
set_irq_flags(i, IRQF_VALID);
|
||||
|
|
|
@ -121,6 +121,16 @@ int __init pxa_init_dma(int num_ch)
|
|||
if (dma_channels == NULL)
|
||||
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);
|
||||
if (ret) {
|
||||
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;
|
||||
}
|
||||
|
||||
/* 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;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef __ASM_ARCH_REGS_AC97_H
|
||||
#define __ASM_ARCH_REGS_AC97_H
|
||||
|
||||
#include <mach/hardware.h>
|
||||
|
||||
/*
|
||||
* AC97 Controller registers
|
||||
*/
|
||||
|
|
|
@ -41,6 +41,9 @@
|
|||
#elif defined(CONFIG_PXA27x) || defined(CONFIG_PXA3xx)
|
||||
#define SSCR0_SCR (0x000fff00) /* Serial Clock Rate (mask) */
|
||||
#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_NCS (1 << 21) /* Network clock select */
|
||||
#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 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 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)
|
||||
|
|
|
@ -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 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)
|
||||
|
|
|
@ -289,7 +289,7 @@ static struct platform_device sa11x0pcmcia_device = {
|
|||
};
|
||||
|
||||
static struct platform_device sa11x0mtd_device = {
|
||||
.name = "flash",
|
||||
.name = "sa1100-mtd",
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
|
|
|
@ -66,7 +66,10 @@ static int adjust_pte(struct vm_area_struct *vma, unsigned long address)
|
|||
* fault (ie, is old), we can safely ignore any issues.
|
||||
*/
|
||||
if (ret && (pte_val(entry) & L_PTE_MT_MASK) != shared_pte_mask) {
|
||||
flush_cache_page(vma, address, pte_pfn(entry));
|
||||
unsigned long pfn = pte_pfn(entry);
|
||||
flush_cache_page(vma, address, pfn);
|
||||
outer_flush_range((pfn << PAGE_SHIFT),
|
||||
(pfn << PAGE_SHIFT) + PAGE_SIZE);
|
||||
pte_val(entry) &= ~L_PTE_MT_MASK;
|
||||
pte_val(entry) |= shared_pte_mask;
|
||||
set_pte_at(vma->vm_mm, address, pte, entry);
|
||||
|
|
|
@ -693,7 +693,8 @@ static void __init sanity_check_meminfo(void)
|
|||
* Check whether this memory bank would entirely overlap
|
||||
* the vmalloc area.
|
||||
*/
|
||||
if (__va(bank->start) >= VMALLOC_MIN) {
|
||||
if (__va(bank->start) >= VMALLOC_MIN ||
|
||||
__va(bank->start) < PAGE_OFFSET) {
|
||||
printk(KERN_NOTICE "Ignoring RAM at %.8lx-%.8lx "
|
||||
"(vmalloc region overlap).\n",
|
||||
bank->start, bank->start + bank->size - 1);
|
||||
|
|
|
@ -200,14 +200,15 @@ void omap_mcbsp_register_board_cfg(struct omap_mcbsp_platform_data *config,
|
|||
/*
|
||||
* Register MMC devices. Called from mach-omap1 and mach-omap2 device init.
|
||||
*/
|
||||
int __init omap_mmc_add(int id, unsigned long base, unsigned long size,
|
||||
unsigned int irq, struct omap_mmc_platform_data *data)
|
||||
int __init omap_mmc_add(const char *name, int id, unsigned long base,
|
||||
unsigned long size, unsigned int irq,
|
||||
struct omap_mmc_platform_data *data)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
struct resource res[OMAP_MMC_NR_RES];
|
||||
int ret;
|
||||
|
||||
pdev = platform_device_alloc("mmci-omap", id);
|
||||
pdev = platform_device_alloc(name, id);
|
||||
if (!pdev)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
|
@ -709,6 +709,7 @@ int omap_request_dma(int dev_id, const char *dev_name,
|
|||
chan->dev_name = dev_name;
|
||||
chan->callback = callback;
|
||||
chan->data = data;
|
||||
chan->flags = 0;
|
||||
|
||||
#ifndef CONFIG_ARCH_OMAP1
|
||||
if (cpu_class_is_omap2()) {
|
||||
|
@ -1888,11 +1889,11 @@ static int omap2_dma_handle_ch(int ch)
|
|||
status = dma_read(CSR(ch));
|
||||
}
|
||||
|
||||
dma_write(status, CSR(ch));
|
||||
|
||||
if (likely(dma_chan[ch].callback != NULL))
|
||||
dma_chan[ch].callback(ch, status, dma_chan[ch].data);
|
||||
|
||||
dma_write(status, CSR(ch));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -339,6 +339,7 @@ IS_OMAP_TYPE(3430, 0x3430)
|
|||
#define OMAP3430_REV_ES2_0 0x34301034
|
||||
#define OMAP3430_REV_ES2_1 0x34302034
|
||||
#define OMAP3430_REV_ES3_0 0x34303034
|
||||
#define OMAP3430_REV_ES3_1 0x34304034
|
||||
|
||||
/*
|
||||
* omap_chip bits
|
||||
|
|
|
@ -344,7 +344,8 @@ struct omap_mcbsp_platform_data {
|
|||
u8 dma_rx_sync, dma_tx_sync;
|
||||
u16 rx_irq, tx_irq;
|
||||
struct omap_mcbsp_ops *ops;
|
||||
char const *clk_name;
|
||||
char const **clk_names;
|
||||
int num_clks;
|
||||
};
|
||||
|
||||
struct omap_mcbsp {
|
||||
|
@ -376,7 +377,8 @@ struct omap_mcbsp {
|
|||
/* Protect the field .free, while checking if the mcbsp is in use */
|
||||
spinlock_t lock;
|
||||
struct omap_mcbsp_platform_data *pdata;
|
||||
struct clk *clk;
|
||||
struct clk **clks;
|
||||
int num_clks;
|
||||
};
|
||||
extern struct omap_mcbsp **mcbsp_ptr;
|
||||
extern int omap_mcbsp_count;
|
||||
|
|
|
@ -115,8 +115,9 @@ void omap1_init_mmc(struct omap_mmc_platform_data **mmc_data,
|
|||
int nr_controllers);
|
||||
void omap2_init_mmc(struct omap_mmc_platform_data **mmc_data,
|
||||
int nr_controllers);
|
||||
int omap_mmc_add(int id, unsigned long base, unsigned long size,
|
||||
unsigned int irq, struct omap_mmc_platform_data *data);
|
||||
int omap_mmc_add(const char *name, int id, unsigned long base,
|
||||
unsigned long size, unsigned int irq,
|
||||
struct omap_mmc_platform_data *data);
|
||||
#else
|
||||
static inline void omap1_init_mmc(struct omap_mmc_platform_data **mmc_data,
|
||||
int nr_controllers)
|
||||
|
@ -126,8 +127,9 @@ static inline void omap2_init_mmc(struct omap_mmc_platform_data **mmc_data,
|
|||
int nr_controllers)
|
||||
{
|
||||
}
|
||||
static inline int omap_mmc_add(int id, unsigned long base, unsigned long size,
|
||||
unsigned int irq, struct omap_mmc_platform_data *data)
|
||||
static inline int omap_mmc_add(const char *name, int id, unsigned long base,
|
||||
unsigned long size, unsigned int irq,
|
||||
struct omap_mmc_platform_data *data)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -214,6 +214,7 @@ EXPORT_SYMBOL(omap_mcbsp_set_io_type);
|
|||
int omap_mcbsp_request(unsigned int id)
|
||||
{
|
||||
struct omap_mcbsp *mcbsp;
|
||||
int i;
|
||||
int err;
|
||||
|
||||
if (!omap_mcbsp_check_valid_id(id)) {
|
||||
|
@ -225,7 +226,8 @@ int omap_mcbsp_request(unsigned int id)
|
|||
if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->request)
|
||||
mcbsp->pdata->ops->request(id);
|
||||
|
||||
clk_enable(mcbsp->clk);
|
||||
for (i = 0; i < mcbsp->num_clks; i++)
|
||||
clk_enable(mcbsp->clks[i]);
|
||||
|
||||
spin_lock(&mcbsp->lock);
|
||||
if (!mcbsp->free) {
|
||||
|
@ -276,6 +278,7 @@ EXPORT_SYMBOL(omap_mcbsp_request);
|
|||
void omap_mcbsp_free(unsigned int id)
|
||||
{
|
||||
struct omap_mcbsp *mcbsp;
|
||||
int i;
|
||||
|
||||
if (!omap_mcbsp_check_valid_id(id)) {
|
||||
printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
|
||||
|
@ -286,7 +289,8 @@ void omap_mcbsp_free(unsigned int id)
|
|||
if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->free)
|
||||
mcbsp->pdata->ops->free(id);
|
||||
|
||||
clk_disable(mcbsp->clk);
|
||||
for (i = mcbsp->num_clks - 1; i >= 0; i--)
|
||||
clk_disable(mcbsp->clks[i]);
|
||||
|
||||
spin_lock(&mcbsp->lock);
|
||||
if (mcbsp->free) {
|
||||
|
@ -872,6 +876,7 @@ static int __devinit omap_mcbsp_probe(struct platform_device *pdev)
|
|||
struct omap_mcbsp_platform_data *pdata = pdev->dev.platform_data;
|
||||
struct omap_mcbsp *mcbsp;
|
||||
int id = pdev->id - 1;
|
||||
int i;
|
||||
int ret = 0;
|
||||
|
||||
if (!pdata) {
|
||||
|
@ -916,14 +921,25 @@ static int __devinit omap_mcbsp_probe(struct platform_device *pdev)
|
|||
mcbsp->dma_rx_sync = pdata->dma_rx_sync;
|
||||
mcbsp->dma_tx_sync = pdata->dma_tx_sync;
|
||||
|
||||
if (pdata->clk_name)
|
||||
mcbsp->clk = clk_get(&pdev->dev, pdata->clk_name);
|
||||
if (IS_ERR(mcbsp->clk)) {
|
||||
dev_err(&pdev->dev,
|
||||
"Invalid clock configuration for McBSP%d.\n",
|
||||
mcbsp->id);
|
||||
ret = PTR_ERR(mcbsp->clk);
|
||||
goto err_clk;
|
||||
if (pdata->num_clks) {
|
||||
mcbsp->num_clks = pdata->num_clks;
|
||||
mcbsp->clks = kzalloc(mcbsp->num_clks * sizeof(struct clk *),
|
||||
GFP_KERNEL);
|
||||
if (!mcbsp->clks) {
|
||||
ret = -ENOMEM;
|
||||
goto exit;
|
||||
}
|
||||
for (i = 0; i < mcbsp->num_clks; i++) {
|
||||
mcbsp->clks[i] = clk_get(&pdev->dev, pdata->clk_names[i]);
|
||||
if (IS_ERR(mcbsp->clks[i])) {
|
||||
dev_err(&pdev->dev,
|
||||
"Invalid %s configuration for McBSP%d.\n",
|
||||
pdata->clk_names[i], mcbsp->id);
|
||||
ret = PTR_ERR(mcbsp->clks[i]);
|
||||
goto err_clk;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
mcbsp->pdata = pdata;
|
||||
|
@ -932,6 +948,9 @@ static int __devinit omap_mcbsp_probe(struct platform_device *pdev)
|
|||
return 0;
|
||||
|
||||
err_clk:
|
||||
while (i--)
|
||||
clk_put(mcbsp->clks[i]);
|
||||
kfree(mcbsp->clks);
|
||||
iounmap(mcbsp->io_base);
|
||||
err_ioremap:
|
||||
mcbsp->free = 0;
|
||||
|
@ -942,6 +961,7 @@ exit:
|
|||
static int __devexit omap_mcbsp_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct omap_mcbsp *mcbsp = platform_get_drvdata(pdev);
|
||||
int i;
|
||||
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
if (mcbsp) {
|
||||
|
@ -950,12 +970,18 @@ static int __devexit omap_mcbsp_remove(struct platform_device *pdev)
|
|||
mcbsp->pdata->ops->free)
|
||||
mcbsp->pdata->ops->free(mcbsp->id);
|
||||
|
||||
clk_disable(mcbsp->clk);
|
||||
clk_put(mcbsp->clk);
|
||||
for (i = mcbsp->num_clks - 1; i >= 0; i--) {
|
||||
clk_disable(mcbsp->clks[i]);
|
||||
clk_put(mcbsp->clks[i]);
|
||||
}
|
||||
|
||||
iounmap(mcbsp->io_base);
|
||||
|
||||
mcbsp->clk = NULL;
|
||||
if (mcbsp->num_clks) {
|
||||
kfree(mcbsp->clks);
|
||||
mcbsp->clks = NULL;
|
||||
mcbsp->num_clks = 0;
|
||||
}
|
||||
mcbsp->free = 0;
|
||||
mcbsp->dev = NULL;
|
||||
}
|
||||
|
|
|
@ -265,51 +265,36 @@ EXPORT_SYMBOL(orion_gpio_set_blink);
|
|||
* polarity LEVEL mask
|
||||
*
|
||||
****************************************************************************/
|
||||
static void gpio_irq_edge_ack(u32 irq)
|
||||
{
|
||||
int pin = irq_to_gpio(irq);
|
||||
|
||||
writel(~(1 << (pin & 31)), GPIO_EDGE_CAUSE(pin));
|
||||
static void gpio_irq_ack(u32 irq)
|
||||
{
|
||||
int type = irq_desc[irq].status & IRQ_TYPE_SENSE_MASK;
|
||||
if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) {
|
||||
int pin = irq_to_gpio(irq);
|
||||
writel(~(1 << (pin & 31)), GPIO_EDGE_CAUSE(pin));
|
||||
}
|
||||
}
|
||||
|
||||
static void gpio_irq_edge_mask(u32 irq)
|
||||
static void gpio_irq_mask(u32 irq)
|
||||
{
|
||||
int pin = irq_to_gpio(irq);
|
||||
u32 u;
|
||||
|
||||
u = readl(GPIO_EDGE_MASK(pin));
|
||||
int type = irq_desc[irq].status & IRQ_TYPE_SENSE_MASK;
|
||||
u32 reg = (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) ?
|
||||
GPIO_EDGE_MASK(pin) : GPIO_LEVEL_MASK(pin);
|
||||
u32 u = readl(reg);
|
||||
u &= ~(1 << (pin & 31));
|
||||
writel(u, GPIO_EDGE_MASK(pin));
|
||||
writel(u, reg);
|
||||
}
|
||||
|
||||
static void gpio_irq_edge_unmask(u32 irq)
|
||||
static void gpio_irq_unmask(u32 irq)
|
||||
{
|
||||
int pin = irq_to_gpio(irq);
|
||||
u32 u;
|
||||
|
||||
u = readl(GPIO_EDGE_MASK(pin));
|
||||
int type = irq_desc[irq].status & IRQ_TYPE_SENSE_MASK;
|
||||
u32 reg = (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) ?
|
||||
GPIO_EDGE_MASK(pin) : GPIO_LEVEL_MASK(pin);
|
||||
u32 u = readl(reg);
|
||||
u |= 1 << (pin & 31);
|
||||
writel(u, GPIO_EDGE_MASK(pin));
|
||||
}
|
||||
|
||||
static void gpio_irq_level_mask(u32 irq)
|
||||
{
|
||||
int pin = irq_to_gpio(irq);
|
||||
u32 u;
|
||||
|
||||
u = readl(GPIO_LEVEL_MASK(pin));
|
||||
u &= ~(1 << (pin & 31));
|
||||
writel(u, GPIO_LEVEL_MASK(pin));
|
||||
}
|
||||
|
||||
static void gpio_irq_level_unmask(u32 irq)
|
||||
{
|
||||
int pin = irq_to_gpio(irq);
|
||||
u32 u;
|
||||
|
||||
u = readl(GPIO_LEVEL_MASK(pin));
|
||||
u |= 1 << (pin & 31);
|
||||
writel(u, GPIO_LEVEL_MASK(pin));
|
||||
writel(u, reg);
|
||||
}
|
||||
|
||||
static int gpio_irq_set_type(u32 irq, u32 type)
|
||||
|
@ -331,9 +316,9 @@ static int gpio_irq_set_type(u32 irq, u32 type)
|
|||
* Set edge/level type.
|
||||
*/
|
||||
if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) {
|
||||
desc->chip = &orion_gpio_irq_edge_chip;
|
||||
desc->handle_irq = handle_edge_irq;
|
||||
} else if (type & (IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW)) {
|
||||
desc->chip = &orion_gpio_irq_level_chip;
|
||||
desc->handle_irq = handle_level_irq;
|
||||
} else {
|
||||
printk(KERN_ERR "failed to set irq=%d (type=%d)\n", irq, type);
|
||||
return -EINVAL;
|
||||
|
@ -371,19 +356,11 @@ static int gpio_irq_set_type(u32 irq, u32 type)
|
|||
return 0;
|
||||
}
|
||||
|
||||
struct irq_chip orion_gpio_irq_edge_chip = {
|
||||
.name = "orion_gpio_irq_edge",
|
||||
.ack = gpio_irq_edge_ack,
|
||||
.mask = gpio_irq_edge_mask,
|
||||
.unmask = gpio_irq_edge_unmask,
|
||||
.set_type = gpio_irq_set_type,
|
||||
};
|
||||
|
||||
struct irq_chip orion_gpio_irq_level_chip = {
|
||||
.name = "orion_gpio_irq_level",
|
||||
.mask = gpio_irq_level_mask,
|
||||
.mask_ack = gpio_irq_level_mask,
|
||||
.unmask = gpio_irq_level_unmask,
|
||||
struct irq_chip orion_gpio_irq_chip = {
|
||||
.name = "orion_gpio",
|
||||
.ack = gpio_irq_ack,
|
||||
.mask = gpio_irq_mask,
|
||||
.unmask = gpio_irq_unmask,
|
||||
.set_type = gpio_irq_set_type,
|
||||
};
|
||||
|
||||
|
|
|
@ -31,8 +31,7 @@ void orion_gpio_set_blink(unsigned pin, int blink);
|
|||
/*
|
||||
* GPIO interrupt handling.
|
||||
*/
|
||||
extern struct irq_chip orion_gpio_irq_edge_chip;
|
||||
extern struct irq_chip orion_gpio_irq_level_chip;
|
||||
extern struct irq_chip orion_gpio_irq_chip;
|
||||
void orion_gpio_irq_handler(int irqoff);
|
||||
|
||||
|
||||
|
|
|
@ -116,6 +116,7 @@ struct atmel_nand_data {
|
|||
int enable_pin; /* chip enable */
|
||||
int det_pin; /* card detect */
|
||||
int rdy_pin; /* ready/busy */
|
||||
u8 rdy_pin_active_low; /* rdy_pin value is inverted */
|
||||
u8 ale; /* address line number connected to ALE */
|
||||
u8 cle; /* address line number connected to CLE */
|
||||
u8 bus_width_16; /* buswidth is 16 bit */
|
||||
|
|
|
@ -169,26 +169,51 @@ config BF542
|
|||
help
|
||||
BF542 Processor Support.
|
||||
|
||||
config BF542M
|
||||
bool "BF542m"
|
||||
help
|
||||
BF542 Processor Support.
|
||||
|
||||
config BF544
|
||||
bool "BF544"
|
||||
help
|
||||
BF544 Processor Support.
|
||||
|
||||
config BF544M
|
||||
bool "BF544m"
|
||||
help
|
||||
BF544 Processor Support.
|
||||
|
||||
config BF547
|
||||
bool "BF547"
|
||||
help
|
||||
BF547 Processor Support.
|
||||
|
||||
config BF547M
|
||||
bool "BF547m"
|
||||
help
|
||||
BF547 Processor Support.
|
||||
|
||||
config BF548
|
||||
bool "BF548"
|
||||
help
|
||||
BF548 Processor Support.
|
||||
|
||||
config BF548M
|
||||
bool "BF548m"
|
||||
help
|
||||
BF548 Processor Support.
|
||||
|
||||
config BF549
|
||||
bool "BF549"
|
||||
help
|
||||
BF549 Processor Support.
|
||||
|
||||
config BF549M
|
||||
bool "BF549m"
|
||||
help
|
||||
BF549 Processor Support.
|
||||
|
||||
config BF561
|
||||
bool "BF561"
|
||||
help
|
||||
|
@ -224,39 +249,39 @@ config TICK_SOURCE_SYSTMR0
|
|||
|
||||
config BF_REV_MIN
|
||||
int
|
||||
default 0 if (BF51x || BF52x || BF54x)
|
||||
default 0 if (BF51x || BF52x || (BF54x && !BF54xM))
|
||||
default 2 if (BF537 || BF536 || BF534)
|
||||
default 3 if (BF561 ||BF533 || BF532 || BF531)
|
||||
default 3 if (BF561 || BF533 || BF532 || BF531 || BF54xM)
|
||||
default 4 if (BF538 || BF539)
|
||||
|
||||
config BF_REV_MAX
|
||||
int
|
||||
default 2 if (BF51x || BF52x || BF54x)
|
||||
default 3 if (BF537 || BF536 || BF534)
|
||||
default 2 if (BF51x || BF52x || (BF54x && !BF54xM))
|
||||
default 3 if (BF537 || BF536 || BF534 || BF54xM)
|
||||
default 5 if (BF561 || BF538 || BF539)
|
||||
default 6 if (BF533 || BF532 || BF531)
|
||||
|
||||
choice
|
||||
prompt "Silicon Rev"
|
||||
default BF_REV_0_1 if (BF51x || BF52x || BF54x)
|
||||
default BF_REV_0_1 if (BF51x || BF52x || (BF54x && !BF54xM))
|
||||
default BF_REV_0_2 if (BF534 || BF536 || BF537)
|
||||
default BF_REV_0_3 if (BF531 || BF532 || BF533 || BF561)
|
||||
default BF_REV_0_3 if (BF531 || BF532 || BF533 || BF54xM || BF561)
|
||||
|
||||
config BF_REV_0_0
|
||||
bool "0.0"
|
||||
depends on (BF51x || BF52x || BF54x)
|
||||
depends on (BF51x || BF52x || (BF54x && !BF54xM))
|
||||
|
||||
config BF_REV_0_1
|
||||
bool "0.1"
|
||||
depends on (BF52x || BF54x)
|
||||
depends on (BF52x || (BF54x && !BF54xM))
|
||||
|
||||
config BF_REV_0_2
|
||||
bool "0.2"
|
||||
depends on (BF52x || BF537 || BF536 || BF534 || BF54x)
|
||||
depends on (BF52x || BF537 || BF536 || BF534 || (BF54x && !BF54xM))
|
||||
|
||||
config BF_REV_0_3
|
||||
bool "0.3"
|
||||
depends on (BF561 || BF537 || BF536 || BF534 || BF533 || BF532 || BF531)
|
||||
depends on (BF54xM || BF561 || BF537 || BF536 || BF534 || BF533 || BF532 || BF531)
|
||||
|
||||
config BF_REV_0_4
|
||||
bool "0.4"
|
||||
|
@ -293,9 +318,14 @@ config BF53x
|
|||
depends on (BF531 || BF532 || BF533 || BF534 || BF536 || BF537)
|
||||
default y
|
||||
|
||||
config BF54xM
|
||||
bool
|
||||
depends on (BF542M || BF544M || BF547M || BF548M || BF549M)
|
||||
default y
|
||||
|
||||
config BF54x
|
||||
bool
|
||||
depends on (BF542 || BF544 || BF547 || BF548 || BF549)
|
||||
depends on (BF542 || BF544 || BF547 || BF548 || BF549 || BF54xM)
|
||||
default y
|
||||
|
||||
config MEM_GENERIC_BOARD
|
||||
|
|
|
@ -21,57 +21,67 @@ KALLSYMS += --symbol-prefix=_
|
|||
KBUILD_DEFCONFIG := BF537-STAMP_defconfig
|
||||
|
||||
# setup the machine name and the machine dependent settings
|
||||
machine-$(CONFIG_BF512) := bf518
|
||||
machine-$(CONFIG_BF514) := bf518
|
||||
machine-$(CONFIG_BF516) := bf518
|
||||
machine-$(CONFIG_BF518) := bf518
|
||||
machine-$(CONFIG_BF522) := bf527
|
||||
machine-$(CONFIG_BF523) := bf527
|
||||
machine-$(CONFIG_BF524) := bf527
|
||||
machine-$(CONFIG_BF525) := bf527
|
||||
machine-$(CONFIG_BF526) := bf527
|
||||
machine-$(CONFIG_BF527) := bf527
|
||||
machine-$(CONFIG_BF531) := bf533
|
||||
machine-$(CONFIG_BF532) := bf533
|
||||
machine-$(CONFIG_BF533) := bf533
|
||||
machine-$(CONFIG_BF534) := bf537
|
||||
machine-$(CONFIG_BF536) := bf537
|
||||
machine-$(CONFIG_BF537) := bf537
|
||||
machine-$(CONFIG_BF538) := bf538
|
||||
machine-$(CONFIG_BF539) := bf538
|
||||
machine-$(CONFIG_BF542) := bf548
|
||||
machine-$(CONFIG_BF544) := bf548
|
||||
machine-$(CONFIG_BF547) := bf548
|
||||
machine-$(CONFIG_BF548) := bf548
|
||||
machine-$(CONFIG_BF549) := bf548
|
||||
machine-$(CONFIG_BF561) := bf561
|
||||
machine-$(CONFIG_BF512) := bf518
|
||||
machine-$(CONFIG_BF514) := bf518
|
||||
machine-$(CONFIG_BF516) := bf518
|
||||
machine-$(CONFIG_BF518) := bf518
|
||||
machine-$(CONFIG_BF522) := bf527
|
||||
machine-$(CONFIG_BF523) := bf527
|
||||
machine-$(CONFIG_BF524) := bf527
|
||||
machine-$(CONFIG_BF525) := bf527
|
||||
machine-$(CONFIG_BF526) := bf527
|
||||
machine-$(CONFIG_BF527) := bf527
|
||||
machine-$(CONFIG_BF531) := bf533
|
||||
machine-$(CONFIG_BF532) := bf533
|
||||
machine-$(CONFIG_BF533) := bf533
|
||||
machine-$(CONFIG_BF534) := bf537
|
||||
machine-$(CONFIG_BF536) := bf537
|
||||
machine-$(CONFIG_BF537) := bf537
|
||||
machine-$(CONFIG_BF538) := bf538
|
||||
machine-$(CONFIG_BF539) := bf538
|
||||
machine-$(CONFIG_BF542) := bf548
|
||||
machine-$(CONFIG_BF542M) := bf548
|
||||
machine-$(CONFIG_BF544) := bf548
|
||||
machine-$(CONFIG_BF544M) := bf548
|
||||
machine-$(CONFIG_BF547) := bf548
|
||||
machine-$(CONFIG_BF547M) := bf548
|
||||
machine-$(CONFIG_BF548) := bf548
|
||||
machine-$(CONFIG_BF548M) := bf548
|
||||
machine-$(CONFIG_BF549) := bf548
|
||||
machine-$(CONFIG_BF549M) := bf548
|
||||
machine-$(CONFIG_BF561) := bf561
|
||||
MACHINE := $(machine-y)
|
||||
export MACHINE
|
||||
|
||||
cpu-$(CONFIG_BF512) := bf512
|
||||
cpu-$(CONFIG_BF514) := bf514
|
||||
cpu-$(CONFIG_BF516) := bf516
|
||||
cpu-$(CONFIG_BF518) := bf518
|
||||
cpu-$(CONFIG_BF522) := bf522
|
||||
cpu-$(CONFIG_BF523) := bf523
|
||||
cpu-$(CONFIG_BF524) := bf524
|
||||
cpu-$(CONFIG_BF525) := bf525
|
||||
cpu-$(CONFIG_BF526) := bf526
|
||||
cpu-$(CONFIG_BF527) := bf527
|
||||
cpu-$(CONFIG_BF531) := bf531
|
||||
cpu-$(CONFIG_BF532) := bf532
|
||||
cpu-$(CONFIG_BF533) := bf533
|
||||
cpu-$(CONFIG_BF534) := bf534
|
||||
cpu-$(CONFIG_BF536) := bf536
|
||||
cpu-$(CONFIG_BF537) := bf537
|
||||
cpu-$(CONFIG_BF538) := bf538
|
||||
cpu-$(CONFIG_BF539) := bf539
|
||||
cpu-$(CONFIG_BF542) := bf542
|
||||
cpu-$(CONFIG_BF544) := bf544
|
||||
cpu-$(CONFIG_BF547) := bf547
|
||||
cpu-$(CONFIG_BF548) := bf548
|
||||
cpu-$(CONFIG_BF549) := bf549
|
||||
cpu-$(CONFIG_BF561) := bf561
|
||||
cpu-$(CONFIG_BF512) := bf512
|
||||
cpu-$(CONFIG_BF514) := bf514
|
||||
cpu-$(CONFIG_BF516) := bf516
|
||||
cpu-$(CONFIG_BF518) := bf518
|
||||
cpu-$(CONFIG_BF522) := bf522
|
||||
cpu-$(CONFIG_BF523) := bf523
|
||||
cpu-$(CONFIG_BF524) := bf524
|
||||
cpu-$(CONFIG_BF525) := bf525
|
||||
cpu-$(CONFIG_BF526) := bf526
|
||||
cpu-$(CONFIG_BF527) := bf527
|
||||
cpu-$(CONFIG_BF531) := bf531
|
||||
cpu-$(CONFIG_BF532) := bf532
|
||||
cpu-$(CONFIG_BF533) := bf533
|
||||
cpu-$(CONFIG_BF534) := bf534
|
||||
cpu-$(CONFIG_BF536) := bf536
|
||||
cpu-$(CONFIG_BF537) := bf537
|
||||
cpu-$(CONFIG_BF538) := bf538
|
||||
cpu-$(CONFIG_BF539) := bf539
|
||||
cpu-$(CONFIG_BF542) := bf542
|
||||
cpu-$(CONFIG_BF542M) := bf542m
|
||||
cpu-$(CONFIG_BF544) := bf544
|
||||
cpu-$(CONFIG_BF544M) := bf544m
|
||||
cpu-$(CONFIG_BF547) := bf547
|
||||
cpu-$(CONFIG_BF547M) := bf547m
|
||||
cpu-$(CONFIG_BF548) := bf548
|
||||
cpu-$(CONFIG_BF548M) := bf548m
|
||||
cpu-$(CONFIG_BF549) := bf549
|
||||
cpu-$(CONFIG_BF549M) := bf549m
|
||||
cpu-$(CONFIG_BF561) := bf561
|
||||
|
||||
rev-$(CONFIG_BF_REV_0_0) := 0.0
|
||||
rev-$(CONFIG_BF_REV_0_1) := 0.1
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.28-rc2
|
||||
# Fri Jan 9 17:58:41 2009
|
||||
#
|
||||
# CONFIG_MMU is not set
|
||||
# CONFIG_FPU is not set
|
||||
|
@ -149,6 +150,7 @@ CONFIG_BF_REV_0_0=y
|
|||
# CONFIG_BF_REV_ANY is not set
|
||||
# CONFIG_BF_REV_NONE is not set
|
||||
CONFIG_BF51x=y
|
||||
CONFIG_MEM_MT48LC32M8A2_75=y
|
||||
CONFIG_BFIN518F_EZBRD=y
|
||||
|
||||
#
|
||||
|
@ -598,7 +600,10 @@ CONFIG_PHYLIB=y
|
|||
# CONFIG_MDIO_BITBANG is not set
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_MII=y
|
||||
# CONFIG_BFIN_MAC is not set
|
||||
CONFIG_BFIN_MAC=y
|
||||
CONFIG_BFIN_TX_DESC_NUM=10
|
||||
CONFIG_BFIN_RX_DESC_NUM=20
|
||||
# CONFIG_BFIN_MAC_RMII is not set
|
||||
# CONFIG_SMC91X is not set
|
||||
# CONFIG_SMSC911X is not set
|
||||
# CONFIG_DM9000 is not set
|
||||
|
@ -679,7 +684,7 @@ CONFIG_VT_CONSOLE=y
|
|||
CONFIG_HW_CONSOLE=y
|
||||
# CONFIG_VT_HW_CONSOLE_BINDING is not set
|
||||
# CONFIG_DEVKMEM is not set
|
||||
# CONFIG_BFIN_JTAG_COMM is not set
|
||||
CONFIG_BFIN_JTAG_COMM=m
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
|
|
|
@ -723,7 +723,7 @@ CONFIG_VT_CONSOLE=y
|
|||
CONFIG_HW_CONSOLE=y
|
||||
# CONFIG_VT_HW_CONSOLE_BINDING is not set
|
||||
# CONFIG_DEVKMEM is not set
|
||||
# CONFIG_BFIN_JTAG_COMM is not set
|
||||
CONFIG_BFIN_JTAG_COMM=m
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
|
|
|
@ -767,7 +767,7 @@ CONFIG_VT_CONSOLE=y
|
|||
CONFIG_HW_CONSOLE=y
|
||||
# CONFIG_VT_HW_CONSOLE_BINDING is not set
|
||||
# CONFIG_DEVKMEM is not set
|
||||
# CONFIG_BFIN_JTAG_COMM is not set
|
||||
CONFIG_BFIN_JTAG_COMM=m
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
|
|
|
@ -672,7 +672,7 @@ CONFIG_BFIN_DMA_INTERFACE=m
|
|||
CONFIG_SIMPLE_GPIO=m
|
||||
# CONFIG_VT is not set
|
||||
# CONFIG_DEVKMEM is not set
|
||||
# CONFIG_BFIN_JTAG_COMM is not set
|
||||
CONFIG_BFIN_JTAG_COMM=m
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
|
|
|
@ -679,7 +679,7 @@ CONFIG_BFIN_DMA_INTERFACE=m
|
|||
CONFIG_SIMPLE_GPIO=m
|
||||
# CONFIG_VT is not set
|
||||
# CONFIG_DEVKMEM is not set
|
||||
# CONFIG_BFIN_JTAG_COMM is not set
|
||||
CONFIG_BFIN_JTAG_COMM=m
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
|
|
|
@ -722,7 +722,7 @@ CONFIG_BFIN_DMA_INTERFACE=m
|
|||
CONFIG_SIMPLE_GPIO=m
|
||||
# CONFIG_VT is not set
|
||||
# CONFIG_DEVKMEM is not set
|
||||
# CONFIG_BFIN_JTAG_COMM is not set
|
||||
CONFIG_BFIN_JTAG_COMM=m
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
|
|
|
@ -726,7 +726,7 @@ CONFIG_BFIN_DMA_INTERFACE=m
|
|||
CONFIG_SIMPLE_GPIO=m
|
||||
# CONFIG_VT is not set
|
||||
# CONFIG_DEVKMEM is not set
|
||||
# CONFIG_BFIN_JTAG_COMM is not set
|
||||
CONFIG_BFIN_JTAG_COMM=m
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
|
|
|
@ -856,7 +856,7 @@ CONFIG_VT_CONSOLE=y
|
|||
CONFIG_HW_CONSOLE=y
|
||||
# CONFIG_VT_HW_CONSOLE_BINDING is not set
|
||||
# CONFIG_DEVKMEM is not set
|
||||
# CONFIG_BFIN_JTAG_COMM is not set
|
||||
CONFIG_BFIN_JTAG_COMM=m
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
|
|
|
@ -709,7 +709,7 @@ CONFIG_BFIN_DMA_INTERFACE=m
|
|||
CONFIG_SIMPLE_GPIO=m
|
||||
# CONFIG_VT is not set
|
||||
# CONFIG_DEVKMEM is not set
|
||||
# CONFIG_BFIN_JTAG_COMM is not set
|
||||
CONFIG_BFIN_JTAG_COMM=m
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.24.7
|
||||
# Fri Jul 18 18:00:41 2008
|
||||
# Linux kernel version: 2.6.28
|
||||
#
|
||||
# CONFIG_MMU is not set
|
||||
# CONFIG_FPU is not set
|
||||
|
@ -9,7 +8,6 @@ CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
|||
# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
|
||||
CONFIG_BLACKFIN=y
|
||||
CONFIG_ZONE_DMA=y
|
||||
CONFIG_SEMAPHORE_SLEEPERS=y
|
||||
CONFIG_GENERIC_FIND_NEXT_BIT=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
|
@ -32,18 +30,16 @@ CONFIG_SYSVIPC_SYSCTL=y
|
|||
# CONFIG_POSIX_MQUEUE is not set
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
# CONFIG_TASKSTATS is not set
|
||||
# CONFIG_USER_NS is not set
|
||||
# CONFIG_PID_NS is not set
|
||||
# CONFIG_AUDIT is not set
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
# CONFIG_CGROUPS is not set
|
||||
CONFIG_FAIR_GROUP_SCHED=y
|
||||
CONFIG_FAIR_USER_SCHED=y
|
||||
# CONFIG_FAIR_CGROUP_SCHED is not set
|
||||
# CONFIG_SYSFS_DEPRECATED is not set
|
||||
# CONFIG_GROUP_SCHED is not set
|
||||
CONFIG_SYSFS_DEPRECATED=y
|
||||
CONFIG_SYSFS_DEPRECATED_V2=y
|
||||
# CONFIG_RELAY is not set
|
||||
# CONFIG_NAMESPACES is not set
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||
|
@ -52,26 +48,35 @@ CONFIG_EMBEDDED=y
|
|||
CONFIG_UID16=y
|
||||
CONFIG_SYSCTL_SYSCALL=y
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
# CONFIG_ELF_CORE is not set
|
||||
CONFIG_COMPAT_BRK=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_ANON_INODES=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SIGNALFD=y
|
||||
CONFIG_TIMERFD=y
|
||||
CONFIG_EVENTFD=y
|
||||
CONFIG_AIO=y
|
||||
CONFIG_VM_EVENT_COUNTERS=y
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_SLUB is not set
|
||||
# CONFIG_SLOB is not set
|
||||
# CONFIG_PROFILING is not set
|
||||
# CONFIG_MARKERS is not set
|
||||
CONFIG_HAVE_OPROFILE=y
|
||||
# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
|
||||
CONFIG_SLABINFO=y
|
||||
CONFIG_RT_MUTEXES=y
|
||||
CONFIG_TINY_SHMEM=y
|
||||
CONFIG_BASE_SMALL=0
|
||||
CONFIG_MODULES=y
|
||||
# CONFIG_MODULE_FORCE_LOAD is not set
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
||||
# CONFIG_MODVERSIONS is not set
|
||||
|
@ -82,6 +87,7 @@ CONFIG_BLOCK=y
|
|||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
# CONFIG_LSF is not set
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
# CONFIG_BLK_DEV_INTEGRITY is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
|
@ -95,9 +101,11 @@ CONFIG_IOSCHED_CFQ=y
|
|||
CONFIG_DEFAULT_CFQ=y
|
||||
# CONFIG_DEFAULT_NOOP is not set
|
||||
CONFIG_DEFAULT_IOSCHED="cfq"
|
||||
CONFIG_CLASSIC_RCU=y
|
||||
# CONFIG_PREEMPT_NONE is not set
|
||||
CONFIG_PREEMPT_VOLUNTARY=y
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_FREEZER is not set
|
||||
|
||||
#
|
||||
# Blackfin Processor Options
|
||||
|
@ -106,6 +114,10 @@ CONFIG_PREEMPT_VOLUNTARY=y
|
|||
#
|
||||
# Processor and Board Settings
|
||||
#
|
||||
# CONFIG_BF512 is not set
|
||||
# CONFIG_BF514 is not set
|
||||
# CONFIG_BF516 is not set
|
||||
# CONFIG_BF518 is not set
|
||||
# CONFIG_BF522 is not set
|
||||
# CONFIG_BF523 is not set
|
||||
# CONFIG_BF524 is not set
|
||||
|
@ -118,48 +130,32 @@ CONFIG_BF527=y
|
|||
# CONFIG_BF534 is not set
|
||||
# CONFIG_BF536 is not set
|
||||
# CONFIG_BF537 is not set
|
||||
# CONFIG_BF538 is not set
|
||||
# CONFIG_BF539 is not set
|
||||
# CONFIG_BF542 is not set
|
||||
# CONFIG_BF542M is not set
|
||||
# CONFIG_BF544 is not set
|
||||
# CONFIG_BF544M is not set
|
||||
# CONFIG_BF547 is not set
|
||||
# CONFIG_BF547M is not set
|
||||
# CONFIG_BF548 is not set
|
||||
# CONFIG_BF548M is not set
|
||||
# CONFIG_BF549 is not set
|
||||
# CONFIG_BF549M is not set
|
||||
# CONFIG_BF561 is not set
|
||||
CONFIG_BF_REV_MIN=0
|
||||
CONFIG_BF_REV_MAX=2
|
||||
# CONFIG_BF_REV_0_0 is not set
|
||||
CONFIG_BF_REV_0_1=y
|
||||
# CONFIG_BF_REV_0_2 is not set
|
||||
# CONFIG_BF_REV_0_3 is not set
|
||||
# CONFIG_BF_REV_0_4 is not set
|
||||
# CONFIG_BF_REV_0_5 is not set
|
||||
# CONFIG_BF_REV_0_6 is not set
|
||||
# CONFIG_BF_REV_ANY is not set
|
||||
# CONFIG_BF_REV_NONE is not set
|
||||
CONFIG_BF52x=y
|
||||
CONFIG_MEM_MT48LC16M16A2TG_75=y
|
||||
# CONFIG_BFIN527_EZKIT is not set
|
||||
CONFIG_BFIN527_BLUETECHNIX_CM=y
|
||||
|
||||
#
|
||||
# BF527 Specific Configuration
|
||||
#
|
||||
|
||||
#
|
||||
# Alternative Multiplexing Scheme
|
||||
#
|
||||
# CONFIG_BF527_SPORT0_PORTF is not set
|
||||
CONFIG_BF527_SPORT0_PORTG=y
|
||||
CONFIG_BF527_SPORT0_TSCLK_PG10=y
|
||||
# CONFIG_BF527_SPORT0_TSCLK_PG14 is not set
|
||||
CONFIG_BF527_UART1_PORTF=y
|
||||
# CONFIG_BF527_UART1_PORTG is not set
|
||||
# CONFIG_BF527_NAND_D_PORTF is not set
|
||||
CONFIG_BF527_NAND_D_PORTH=y
|
||||
|
||||
#
|
||||
# Interrupt Priority Assignment
|
||||
#
|
||||
|
||||
#
|
||||
# Priority
|
||||
#
|
||||
CONFIG_IRQ_PLL_WAKEUP=7
|
||||
CONFIG_IRQ_DMA0_ERROR=7
|
||||
CONFIG_IRQ_DMAR0_BLK=7
|
||||
|
@ -179,7 +175,6 @@ CONFIG_IRQ_SPORT0_TX=9
|
|||
CONFIG_IRQ_SPORT1_RX=9
|
||||
CONFIG_IRQ_SPORT1_TX=9
|
||||
CONFIG_IRQ_TWI=10
|
||||
CONFIG_IRQ_SPI=10
|
||||
CONFIG_IRQ_UART0_RX=10
|
||||
CONFIG_IRQ_UART0_TX=10
|
||||
CONFIG_IRQ_UART1_RX=10
|
||||
|
@ -205,6 +200,34 @@ CONFIG_IRQ_MEM_DMA1=13
|
|||
CONFIG_IRQ_WATCH=13
|
||||
CONFIG_IRQ_PORTF_INTA=13
|
||||
CONFIG_IRQ_PORTF_INTB=13
|
||||
# CONFIG_BFIN527_EZKIT is not set
|
||||
CONFIG_BFIN527_BLUETECHNIX_CM=y
|
||||
# CONFIG_BFIN526_EZBRD is not set
|
||||
|
||||
#
|
||||
# BF527 Specific Configuration
|
||||
#
|
||||
|
||||
#
|
||||
# Alternative Multiplexing Scheme
|
||||
#
|
||||
# CONFIG_BF527_SPORT0_PORTF is not set
|
||||
CONFIG_BF527_SPORT0_PORTG=y
|
||||
CONFIG_BF527_SPORT0_TSCLK_PG10=y
|
||||
# CONFIG_BF527_SPORT0_TSCLK_PG14 is not set
|
||||
CONFIG_BF527_UART1_PORTF=y
|
||||
# CONFIG_BF527_UART1_PORTG is not set
|
||||
# CONFIG_BF527_NAND_D_PORTF is not set
|
||||
CONFIG_BF527_NAND_D_PORTH=y
|
||||
|
||||
#
|
||||
# Interrupt Priority Assignment
|
||||
#
|
||||
|
||||
#
|
||||
# Priority
|
||||
#
|
||||
CONFIG_IRQ_SPI=10
|
||||
CONFIG_IRQ_SPI_ERROR=7
|
||||
CONFIG_IRQ_NFC_ERROR=7
|
||||
CONFIG_IRQ_HDMA_ERROR=7
|
||||
|
@ -226,7 +249,6 @@ CONFIG_BOOT_LOAD=0x1000
|
|||
#
|
||||
CONFIG_CLKIN_HZ=25000000
|
||||
# CONFIG_BFIN_KERNEL_CLOCK is not set
|
||||
CONFIG_MAX_MEM_SIZE=512
|
||||
CONFIG_MAX_VCO_HZ=600000000
|
||||
CONFIG_MIN_VCO_HZ=50000000
|
||||
CONFIG_MAX_SCLK_HZ=133333333
|
||||
|
@ -240,10 +262,10 @@ CONFIG_HZ_250=y
|
|||
# CONFIG_HZ_300 is not set
|
||||
# CONFIG_HZ_1000 is not set
|
||||
CONFIG_HZ=250
|
||||
# CONFIG_SCHED_HRTICK is not set
|
||||
CONFIG_GENERIC_TIME=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
# CONFIG_CYCLES_CLOCKSOURCE is not set
|
||||
# CONFIG_TICK_ONESHOT is not set
|
||||
# CONFIG_NO_HZ is not set
|
||||
# CONFIG_HIGH_RES_TIMERS is not set
|
||||
CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
|
||||
|
@ -277,6 +299,12 @@ CONFIG_ACCESS_OK_L1=y
|
|||
CONFIG_CACHELINE_ALIGNED_L1=y
|
||||
# CONFIG_SYSCALL_TAB_L1 is not set
|
||||
# CONFIG_CPLB_SWITCH_TAB_L1 is not set
|
||||
CONFIG_APP_STACK_L1=y
|
||||
|
||||
#
|
||||
# Speed Optimizations
|
||||
#
|
||||
CONFIG_BFIN_INS_LOWOVERHEAD=y
|
||||
CONFIG_RAMKERNEL=y
|
||||
# CONFIG_ROMKERNEL is not set
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
|
@ -285,10 +313,10 @@ CONFIG_FLATMEM_MANUAL=y
|
|||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
|
||||
CONFIG_PAGEFLAGS_EXTENDED=y
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||
# CONFIG_RESOURCES_64BIT is not set
|
||||
# CONFIG_PHYS_ADDR_T_64BIT is not set
|
||||
CONFIG_ZONE_DMA_FLAG=1
|
||||
CONFIG_VIRT_TO_BUS=y
|
||||
CONFIG_BFIN_GPTIMERS=y
|
||||
|
@ -334,7 +362,6 @@ CONFIG_BANK_3=0xFFC0
|
|||
#
|
||||
# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
|
||||
#
|
||||
# CONFIG_PCI is not set
|
||||
# CONFIG_ARCH_SUPPORTS_MSI is not set
|
||||
# CONFIG_PCCARD is not set
|
||||
|
||||
|
@ -345,25 +372,20 @@ CONFIG_BINFMT_ELF_FDPIC=y
|
|||
CONFIG_BINFMT_FLAT=y
|
||||
CONFIG_BINFMT_ZFLAT=y
|
||||
# CONFIG_BINFMT_SHARED_FLAT is not set
|
||||
# CONFIG_HAVE_AOUT is not set
|
||||
# CONFIG_BINFMT_MISC is not set
|
||||
|
||||
#
|
||||
# Power management options
|
||||
#
|
||||
# CONFIG_PM is not set
|
||||
CONFIG_SUSPEND_UP_POSSIBLE=y
|
||||
# CONFIG_PM_BFIN_SLEEP_DEEPER is not set
|
||||
# CONFIG_PM_BFIN_SLEEP is not set
|
||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||
# CONFIG_PM_WAKEUP_BY_GPIO is not set
|
||||
|
||||
#
|
||||
# CPU Frequency scaling
|
||||
#
|
||||
# CONFIG_CPU_FREQ is not set
|
||||
|
||||
#
|
||||
# Networking
|
||||
#
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
|
@ -376,6 +398,7 @@ CONFIG_XFRM=y
|
|||
# CONFIG_XFRM_USER is not set
|
||||
# CONFIG_XFRM_SUB_POLICY is not set
|
||||
# CONFIG_XFRM_MIGRATE is not set
|
||||
# CONFIG_XFRM_STATISTICS is not set
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
# CONFIG_IP_MULTICAST is not set
|
||||
|
@ -405,8 +428,6 @@ CONFIG_TCP_CONG_CUBIC=y
|
|||
CONFIG_DEFAULT_TCP_CONG="cubic"
|
||||
# CONFIG_TCP_MD5SIG is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_INET6_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET6_TUNNEL is not set
|
||||
# CONFIG_NETLABEL is not set
|
||||
# CONFIG_NETWORK_SECMARK is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
@ -415,6 +436,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
|
|||
# CONFIG_TIPC is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
# CONFIG_NET_DSA is not set
|
||||
# CONFIG_VLAN_8021Q is not set
|
||||
# CONFIG_DECNET is not set
|
||||
# CONFIG_LLC2 is not set
|
||||
|
@ -431,14 +453,14 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
|
|||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_CAN is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
# CONFIG_AF_RXRPC is not set
|
||||
|
||||
#
|
||||
# Wireless
|
||||
#
|
||||
# CONFIG_PHONET is not set
|
||||
CONFIG_WIRELESS=y
|
||||
# CONFIG_CFG80211 is not set
|
||||
CONFIG_WIRELESS_OLD_REGULATORY=y
|
||||
# CONFIG_WIRELESS_EXT is not set
|
||||
# CONFIG_MAC80211 is not set
|
||||
# CONFIG_IEEE80211 is not set
|
||||
|
@ -456,6 +478,8 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
|||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
# CONFIG_FW_LOADER is not set
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
# CONFIG_DEBUG_DEVRES is not set
|
||||
# CONFIG_SYS_HYPERVISOR is not set
|
||||
# CONFIG_CONNECTOR is not set
|
||||
CONFIG_MTD=y
|
||||
|
@ -464,6 +488,7 @@ CONFIG_MTD=y
|
|||
CONFIG_MTD_PARTITIONS=y
|
||||
# CONFIG_MTD_REDBOOT_PARTS is not set
|
||||
# CONFIG_MTD_CMDLINE_PARTS is not set
|
||||
# CONFIG_MTD_AR7_PARTS is not set
|
||||
|
||||
#
|
||||
# User Modules And Translation Layers
|
||||
|
@ -507,6 +532,7 @@ CONFIG_MTD_ROM=m
|
|||
#
|
||||
CONFIG_MTD_COMPLEX_MAPPINGS=y
|
||||
# CONFIG_MTD_PHYSMAP is not set
|
||||
# CONFIG_MTD_GPIO_ADDR is not set
|
||||
# CONFIG_MTD_UCLINUX is not set
|
||||
# CONFIG_MTD_PLATRAM is not set
|
||||
|
||||
|
@ -542,10 +568,12 @@ CONFIG_BLK_DEV=y
|
|||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=4096
|
||||
CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
|
||||
# CONFIG_BLK_DEV_XIP is not set
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
# CONFIG_BLK_DEV_HD is not set
|
||||
# CONFIG_MISC_DEVICES is not set
|
||||
CONFIG_HAVE_IDE=y
|
||||
# CONFIG_IDE is not set
|
||||
|
||||
#
|
||||
|
@ -558,7 +586,6 @@ CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
|
|||
# CONFIG_ATA is not set
|
||||
# CONFIG_MD is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_NETDEVICES_MULTIQUEUE is not set
|
||||
# CONFIG_DUMMY is not set
|
||||
# CONFIG_BONDING is not set
|
||||
# CONFIG_MACVLAN is not set
|
||||
|
@ -579,6 +606,7 @@ CONFIG_PHYLIB=y
|
|||
# CONFIG_SMSC_PHY is not set
|
||||
# CONFIG_BROADCOM_PHY is not set
|
||||
# CONFIG_ICPLUS_PHY is not set
|
||||
# CONFIG_REALTEK_PHY is not set
|
||||
# CONFIG_FIXED_PHY is not set
|
||||
# CONFIG_MDIO_BITBANG is not set
|
||||
CONFIG_NET_ETHERNET=y
|
||||
|
@ -591,11 +619,14 @@ CONFIG_BFIN_MAC_RMII=y
|
|||
# CONFIG_SMC91X is not set
|
||||
# CONFIG_SMSC911X is not set
|
||||
# CONFIG_DM9000 is not set
|
||||
# CONFIG_ENC28J60 is not set
|
||||
# CONFIG_IBM_NEW_EMAC_ZMII is not set
|
||||
# CONFIG_IBM_NEW_EMAC_RGMII is not set
|
||||
# CONFIG_IBM_NEW_EMAC_TAH is not set
|
||||
# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
|
||||
# CONFIG_B44 is not set
|
||||
# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
|
||||
# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
|
||||
# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
|
||||
# CONFIG_NETDEV_1000 is not set
|
||||
# CONFIG_NETDEV_10000 is not set
|
||||
|
||||
|
@ -604,6 +635,7 @@ CONFIG_BFIN_MAC_RMII=y
|
|||
#
|
||||
# CONFIG_WLAN_PRE80211 is not set
|
||||
# CONFIG_WLAN_80211 is not set
|
||||
# CONFIG_IWLWIFI_LEDS is not set
|
||||
|
||||
#
|
||||
# USB Network Adapters
|
||||
|
@ -616,7 +648,6 @@ CONFIG_BFIN_MAC_RMII=y
|
|||
# CONFIG_WAN is not set
|
||||
# CONFIG_PPP is not set
|
||||
# CONFIG_SLIP is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
# CONFIG_NETCONSOLE is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
|
@ -642,14 +673,15 @@ CONFIG_BFIN_MAC_RMII=y
|
|||
# CONFIG_BF5xx_PPIFCD is not set
|
||||
# CONFIG_BFIN_SIMPLE_TIMER is not set
|
||||
# CONFIG_BF5xx_PPI is not set
|
||||
CONFIG_BFIN_OTP=y
|
||||
# CONFIG_BFIN_OTP_WRITE_ENABLE is not set
|
||||
# CONFIG_BF5xx_EPPI is not set
|
||||
# CONFIG_BFIN_SPORT is not set
|
||||
# CONFIG_BFIN_TIMER_LATENCY is not set
|
||||
# CONFIG_TWI_LCD is not set
|
||||
CONFIG_BFIN_DMA_INTERFACE=m
|
||||
CONFIG_SIMPLE_GPIO=m
|
||||
# CONFIG_VT is not set
|
||||
# CONFIG_DEVKMEM is not set
|
||||
# CONFIG_BFIN_JTAG_COMM is not set
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
|
@ -673,6 +705,8 @@ CONFIG_SERIAL_CORE_CONSOLE=y
|
|||
# CONFIG_SERIAL_BFIN_SPORT is not set
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
CONFIG_BFIN_OTP=y
|
||||
# CONFIG_BFIN_OTP_WRITE_ENABLE is not set
|
||||
|
||||
#
|
||||
# CAN, the car bus and industrial fieldbus
|
||||
|
@ -680,44 +714,49 @@ CONFIG_UNIX98_PTYS=y
|
|||
# CONFIG_CAN4LINUX is not set
|
||||
# CONFIG_IPMI_HANDLER is not set
|
||||
# CONFIG_HW_RANDOM is not set
|
||||
# CONFIG_GEN_RTC is not set
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
# CONFIG_TCG_TPM is not set
|
||||
CONFIG_I2C=y
|
||||
CONFIG_I2C_BOARDINFO=y
|
||||
CONFIG_I2C_CHARDEV=m
|
||||
|
||||
#
|
||||
# I2C Algorithms
|
||||
#
|
||||
# CONFIG_I2C_ALGOBIT is not set
|
||||
# CONFIG_I2C_ALGOPCF is not set
|
||||
# CONFIG_I2C_ALGOPCA is not set
|
||||
CONFIG_I2C_HELPER_AUTO=y
|
||||
|
||||
#
|
||||
# I2C Hardware Bus support
|
||||
#
|
||||
|
||||
#
|
||||
# I2C system bus drivers (mostly embedded / system-on-chip)
|
||||
#
|
||||
CONFIG_I2C_BLACKFIN_TWI=m
|
||||
CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ=100
|
||||
# CONFIG_I2C_GPIO is not set
|
||||
# CONFIG_I2C_OCORES is not set
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
# CONFIG_I2C_SIMTEC is not set
|
||||
|
||||
#
|
||||
# External I2C/SMBus adapter drivers
|
||||
#
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
# CONFIG_I2C_TAOS_EVM is not set
|
||||
# CONFIG_I2C_STUB is not set
|
||||
# CONFIG_I2C_TINY_USB is not set
|
||||
|
||||
#
|
||||
# Other I2C/SMBus bus drivers
|
||||
#
|
||||
# CONFIG_I2C_PCA_PLATFORM is not set
|
||||
# CONFIG_I2C_STUB is not set
|
||||
|
||||
#
|
||||
# Miscellaneous I2C Chip support
|
||||
#
|
||||
# CONFIG_SENSORS_DS1337 is not set
|
||||
# CONFIG_SENSORS_DS1374 is not set
|
||||
# CONFIG_DS1682 is not set
|
||||
# CONFIG_AT24 is not set
|
||||
# CONFIG_SENSORS_AD5252 is not set
|
||||
# CONFIG_EEPROM_LEGACY is not set
|
||||
# CONFIG_SENSORS_EEPROM is not set
|
||||
# CONFIG_SENSORS_PCF8574 is not set
|
||||
# CONFIG_SENSORS_PCF8575 is not set
|
||||
# CONFIG_PCF8575 is not set
|
||||
# CONFIG_SENSORS_PCA9539 is not set
|
||||
# CONFIG_SENSORS_PCF8591 is not set
|
||||
# CONFIG_SENSORS_MAX6875 is not set
|
||||
|
@ -726,37 +765,41 @@ CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ=100
|
|||
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||
# CONFIG_I2C_DEBUG_BUS is not set
|
||||
# CONFIG_I2C_DEBUG_CHIP is not set
|
||||
|
||||
#
|
||||
# SPI support
|
||||
#
|
||||
CONFIG_SPI=y
|
||||
# CONFIG_SPI_DEBUG is not set
|
||||
CONFIG_SPI_MASTER=y
|
||||
|
||||
#
|
||||
# SPI Master Controller Drivers
|
||||
#
|
||||
CONFIG_SPI_BFIN=y
|
||||
# CONFIG_SPI_BFIN_LOCK is not set
|
||||
# CONFIG_SPI_BITBANG is not set
|
||||
|
||||
#
|
||||
# SPI Protocol Masters
|
||||
#
|
||||
# CONFIG_EEPROM_AT25 is not set
|
||||
# CONFIG_SPI_AT25 is not set
|
||||
# CONFIG_SPI_SPIDEV is not set
|
||||
# CONFIG_SPI_TLE62X0 is not set
|
||||
CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
|
||||
# CONFIG_GPIOLIB is not set
|
||||
# CONFIG_W1 is not set
|
||||
# CONFIG_POWER_SUPPLY is not set
|
||||
CONFIG_HWMON=y
|
||||
# CONFIG_HWMON_VID is not set
|
||||
# CONFIG_SENSORS_AD7414 is not set
|
||||
# CONFIG_SENSORS_AD7418 is not set
|
||||
# CONFIG_SENSORS_ADCXX is not set
|
||||
# CONFIG_SENSORS_ADM1021 is not set
|
||||
# CONFIG_SENSORS_ADM1025 is not set
|
||||
# CONFIG_SENSORS_ADM1026 is not set
|
||||
# CONFIG_SENSORS_ADM1029 is not set
|
||||
# CONFIG_SENSORS_ADM1031 is not set
|
||||
# CONFIG_SENSORS_ADM9240 is not set
|
||||
# CONFIG_SENSORS_ADT7462 is not set
|
||||
# CONFIG_SENSORS_ADT7470 is not set
|
||||
# CONFIG_SENSORS_ADT7473 is not set
|
||||
# CONFIG_SENSORS_ATXP1 is not set
|
||||
# CONFIG_SENSORS_DS1621 is not set
|
||||
# CONFIG_SENSORS_F71805F is not set
|
||||
|
@ -777,6 +820,7 @@ CONFIG_HWMON=y
|
|||
# CONFIG_SENSORS_LM90 is not set
|
||||
# CONFIG_SENSORS_LM92 is not set
|
||||
# CONFIG_SENSORS_LM93 is not set
|
||||
# CONFIG_SENSORS_MAX1111 is not set
|
||||
# CONFIG_SENSORS_MAX1619 is not set
|
||||
# CONFIG_SENSORS_MAX6650 is not set
|
||||
# CONFIG_SENSORS_PC87360 is not set
|
||||
|
@ -785,6 +829,7 @@ CONFIG_HWMON=y
|
|||
# CONFIG_SENSORS_SMSC47M1 is not set
|
||||
# CONFIG_SENSORS_SMSC47M192 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_ADS7828 is not set
|
||||
# CONFIG_SENSORS_THMC50 is not set
|
||||
# CONFIG_SENSORS_VT1211 is not set
|
||||
# CONFIG_SENSORS_W83781D is not set
|
||||
|
@ -792,9 +837,12 @@ CONFIG_HWMON=y
|
|||
# CONFIG_SENSORS_W83792D is not set
|
||||
# CONFIG_SENSORS_W83793 is not set
|
||||
# CONFIG_SENSORS_W83L785TS is not set
|
||||
# CONFIG_SENSORS_W83L786NG is not set
|
||||
# CONFIG_SENSORS_W83627HF is not set
|
||||
# CONFIG_SENSORS_W83627EHF is not set
|
||||
# CONFIG_HWMON_DEBUG_CHIP is not set
|
||||
# CONFIG_THERMAL is not set
|
||||
# CONFIG_THERMAL_HWMON is not set
|
||||
CONFIG_WATCHDOG=y
|
||||
# CONFIG_WATCHDOG_NOWAYOUT is not set
|
||||
|
||||
|
@ -809,22 +857,32 @@ CONFIG_BFIN_WDT=y
|
|||
#
|
||||
# CONFIG_USBPCWATCHDOG is not set
|
||||
|
||||
#
|
||||
# Sonics Silicon Backplane
|
||||
#
|
||||
CONFIG_SSB_POSSIBLE=y
|
||||
# CONFIG_SSB is not set
|
||||
|
||||
#
|
||||
# Multifunction device drivers
|
||||
#
|
||||
# CONFIG_MFD_CORE is not set
|
||||
# CONFIG_MFD_SM501 is not set
|
||||
# CONFIG_HTC_PASIC3 is not set
|
||||
# CONFIG_MFD_TMIO is not set
|
||||
# CONFIG_PMIC_DA903X is not set
|
||||
# CONFIG_MFD_WM8400 is not set
|
||||
# CONFIG_MFD_WM8350_I2C is not set
|
||||
# CONFIG_REGULATOR is not set
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia core support
|
||||
#
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
# CONFIG_DVB_CORE is not set
|
||||
# CONFIG_VIDEO_MEDIA is not set
|
||||
|
||||
#
|
||||
# Multimedia drivers
|
||||
#
|
||||
# CONFIG_DAB is not set
|
||||
|
||||
#
|
||||
|
@ -839,10 +897,6 @@ CONFIG_SSB_POSSIBLE=y
|
|||
# Display device support
|
||||
#
|
||||
# CONFIG_DISPLAY_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Sound
|
||||
#
|
||||
# CONFIG_SOUND is not set
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
|
@ -850,6 +904,7 @@ CONFIG_USB_ARCH_HAS_HCD=y
|
|||
# CONFIG_USB_ARCH_HAS_EHCI is not set
|
||||
CONFIG_USB=y
|
||||
# CONFIG_USB_DEBUG is not set
|
||||
# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
|
||||
|
||||
#
|
||||
# Miscellaneous USB options
|
||||
|
@ -860,40 +915,48 @@ CONFIG_USB_DEVICE_CLASS=y
|
|||
# CONFIG_USB_OTG is not set
|
||||
# CONFIG_USB_OTG_WHITELIST is not set
|
||||
CONFIG_USB_OTG_BLACKLIST_HUB=y
|
||||
CONFIG_USB_MON=y
|
||||
# CONFIG_USB_WUSB is not set
|
||||
# CONFIG_USB_WUSB_CBAF is not set
|
||||
|
||||
#
|
||||
# USB Host Controller Drivers
|
||||
#
|
||||
# CONFIG_USB_C67X00_HCD is not set
|
||||
# CONFIG_USB_ISP116X_HCD is not set
|
||||
# CONFIG_USB_ISP1362_HCD is not set
|
||||
# CONFIG_USB_ISP1760_HCD is not set
|
||||
# CONFIG_USB_ISP1362_HCD is not set
|
||||
# CONFIG_USB_SL811_HCD is not set
|
||||
# CONFIG_USB_R8A66597_HCD is not set
|
||||
# CONFIG_USB_HWA_HCD is not set
|
||||
CONFIG_USB_MUSB_HDRC=y
|
||||
CONFIG_USB_MUSB_SOC=y
|
||||
|
||||
#
|
||||
# Blackfin high speed USB support
|
||||
# Blackfin high speed USB Support
|
||||
#
|
||||
CONFIG_USB_MUSB_HOST=y
|
||||
# CONFIG_USB_MUSB_PERIPHERAL is not set
|
||||
# CONFIG_USB_MUSB_OTG is not set
|
||||
CONFIG_USB_MUSB_HDRC_HCD=y
|
||||
CONFIG_MUSB_PIO_ONLY=y
|
||||
CONFIG_USB_MUSB_LOGLEVEL=0
|
||||
CONFIG_MUSB_DMA_POLL=y
|
||||
# CONFIG_USB_MUSB_DEBUG is not set
|
||||
|
||||
#
|
||||
# USB Device Class drivers
|
||||
#
|
||||
# CONFIG_USB_ACM is not set
|
||||
# CONFIG_USB_PRINTER is not set
|
||||
# CONFIG_USB_WDM is not set
|
||||
# CONFIG_USB_TMC is not set
|
||||
|
||||
#
|
||||
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
|
||||
# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;
|
||||
#
|
||||
|
||||
#
|
||||
# may also be needed; see USB_STORAGE Help for more information
|
||||
# see USB_STORAGE Help for more information
|
||||
#
|
||||
# CONFIG_USB_LIBUSUAL is not set
|
||||
|
||||
|
@ -901,15 +964,10 @@ CONFIG_USB_MUSB_LOGLEVEL=0
|
|||
# USB Imaging devices
|
||||
#
|
||||
# CONFIG_USB_MDC800 is not set
|
||||
CONFIG_USB_MON=y
|
||||
|
||||
#
|
||||
# USB port drivers
|
||||
#
|
||||
|
||||
#
|
||||
# USB Serial Converter support
|
||||
#
|
||||
# CONFIG_USB_SERIAL is not set
|
||||
|
||||
#
|
||||
|
@ -918,7 +976,7 @@ CONFIG_USB_MON=y
|
|||
# CONFIG_USB_EMI62 is not set
|
||||
# CONFIG_USB_EMI26 is not set
|
||||
# CONFIG_USB_ADUTUX is not set
|
||||
# CONFIG_USB_AUERSWALD is not set
|
||||
# CONFIG_USB_SEVSEG is not set
|
||||
# CONFIG_USB_RIO500 is not set
|
||||
# CONFIG_USB_LEGOTOWER is not set
|
||||
# CONFIG_USB_LCD is not set
|
||||
|
@ -934,17 +992,13 @@ CONFIG_USB_MON=y
|
|||
# CONFIG_USB_LD is not set
|
||||
# CONFIG_USB_TRANCEVIBRATOR is not set
|
||||
# CONFIG_USB_IOWARRIOR is not set
|
||||
|
||||
#
|
||||
# USB DSL modem support
|
||||
#
|
||||
|
||||
#
|
||||
# USB Gadget Support
|
||||
#
|
||||
# CONFIG_USB_ISIGHTFW is not set
|
||||
# CONFIG_USB_VST is not set
|
||||
# CONFIG_USB_GADGET is not set
|
||||
# CONFIG_MMC is not set
|
||||
# CONFIG_MEMSTICK is not set
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
# CONFIG_ACCESSIBILITY is not set
|
||||
CONFIG_RTC_LIB=y
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_HCTOSYS=y
|
||||
|
@ -973,51 +1027,59 @@ CONFIG_RTC_INTF_DEV=y
|
|||
# CONFIG_RTC_DRV_PCF8563 is not set
|
||||
# CONFIG_RTC_DRV_PCF8583 is not set
|
||||
# CONFIG_RTC_DRV_M41T80 is not set
|
||||
# CONFIG_RTC_DRV_S35390A is not set
|
||||
# CONFIG_RTC_DRV_FM3130 is not set
|
||||
# CONFIG_RTC_DRV_RX8581 is not set
|
||||
|
||||
#
|
||||
# SPI RTC drivers
|
||||
#
|
||||
# CONFIG_RTC_DRV_RS5C348 is not set
|
||||
# CONFIG_RTC_DRV_M41T94 is not set
|
||||
# CONFIG_RTC_DRV_DS1305 is not set
|
||||
# CONFIG_RTC_DRV_DS1390 is not set
|
||||
# CONFIG_RTC_DRV_MAX6902 is not set
|
||||
# CONFIG_RTC_DRV_R9701 is not set
|
||||
# CONFIG_RTC_DRV_RS5C348 is not set
|
||||
# CONFIG_RTC_DRV_DS3234 is not set
|
||||
|
||||
#
|
||||
# Platform RTC drivers
|
||||
#
|
||||
# CONFIG_RTC_DRV_DS1286 is not set
|
||||
# CONFIG_RTC_DRV_DS1511 is not set
|
||||
# CONFIG_RTC_DRV_DS1553 is not set
|
||||
# CONFIG_RTC_DRV_STK17TA8 is not set
|
||||
# CONFIG_RTC_DRV_DS1742 is not set
|
||||
# CONFIG_RTC_DRV_STK17TA8 is not set
|
||||
# CONFIG_RTC_DRV_M48T86 is not set
|
||||
# CONFIG_RTC_DRV_M48T35 is not set
|
||||
# CONFIG_RTC_DRV_M48T59 is not set
|
||||
# CONFIG_RTC_DRV_BQ4802 is not set
|
||||
# CONFIG_RTC_DRV_V3020 is not set
|
||||
|
||||
#
|
||||
# on-CPU RTC drivers
|
||||
#
|
||||
CONFIG_RTC_DRV_BFIN=y
|
||||
|
||||
#
|
||||
# Userspace I/O
|
||||
#
|
||||
# CONFIG_DMADEVICES is not set
|
||||
# CONFIG_UIO is not set
|
||||
# CONFIG_STAGING is not set
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
# CONFIG_EXT2_FS is not set
|
||||
# CONFIG_EXT3_FS is not set
|
||||
# CONFIG_EXT4DEV_FS is not set
|
||||
# CONFIG_EXT4_FS is not set
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
# CONFIG_FS_POSIX_ACL is not set
|
||||
CONFIG_FILE_LOCKING=y
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_GFS2_FS is not set
|
||||
# CONFIG_OCFS2_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
# CONFIG_DNOTIFY is not set
|
||||
CONFIG_INOTIFY=y
|
||||
CONFIG_INOTIFY_USER=y
|
||||
# CONFIG_QUOTA is not set
|
||||
# CONFIG_DNOTIFY is not set
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
# CONFIG_FUSE_FS is not set
|
||||
|
@ -1059,8 +1121,11 @@ CONFIG_SYSFS=y
|
|||
# CONFIG_JFFS2_FS is not set
|
||||
# CONFIG_CRAMFS is not set
|
||||
# CONFIG_VXFS_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_OMFS_FS is not set
|
||||
# CONFIG_HPFS_FS is not set
|
||||
# CONFIG_QNX4FS_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
# CONFIG_SYSV_FS is not set
|
||||
# CONFIG_UFS_FS is not set
|
||||
CONFIG_NETWORK_FILESYSTEMS=y
|
||||
|
@ -1068,13 +1133,12 @@ CONFIG_NFS_FS=m
|
|||
CONFIG_NFS_V3=y
|
||||
# CONFIG_NFS_V3_ACL is not set
|
||||
# CONFIG_NFS_V4 is not set
|
||||
# CONFIG_NFS_DIRECTIO is not set
|
||||
# CONFIG_NFSD is not set
|
||||
CONFIG_LOCKD=m
|
||||
CONFIG_LOCKD_V4=y
|
||||
CONFIG_NFS_COMMON=y
|
||||
CONFIG_SUNRPC=m
|
||||
# CONFIG_SUNRPC_BIND34 is not set
|
||||
# CONFIG_SUNRPC_REGISTER_V4 is not set
|
||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||
CONFIG_SMB_FS=m
|
||||
|
@ -1130,7 +1194,6 @@ CONFIG_NLS_DEFAULT="iso8859-1"
|
|||
# CONFIG_NLS_KOI8_U is not set
|
||||
# CONFIG_NLS_UTF8 is not set
|
||||
# CONFIG_DLM is not set
|
||||
# CONFIG_INSTRUMENTATION is not set
|
||||
|
||||
#
|
||||
# Kernel hacking
|
||||
|
@ -1138,14 +1201,61 @@ CONFIG_NLS_DEFAULT="iso8859-1"
|
|||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_ENABLE_WARN_DEPRECATED=y
|
||||
CONFIG_ENABLE_MUST_CHECK=y
|
||||
CONFIG_FRAME_WARN=1024
|
||||
# CONFIG_MAGIC_SYSRQ is not set
|
||||
# CONFIG_UNUSED_SYMBOLS is not set
|
||||
CONFIG_DEBUG_FS=y
|
||||
# CONFIG_HEADERS_CHECK is not set
|
||||
# CONFIG_DEBUG_KERNEL is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
# CONFIG_DEBUG_SHIRQ is not set
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
|
||||
CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
|
||||
# CONFIG_SCHED_DEBUG is not set
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_TIMER_STATS is not set
|
||||
# CONFIG_DEBUG_OBJECTS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
# CONFIG_DEBUG_RT_MUTEXES is not set
|
||||
# CONFIG_RT_MUTEX_TESTER is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_DEBUG_MUTEXES is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
# CONFIG_DEBUG_BUGVERBOSE is not set
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
# CONFIG_DEBUG_WRITECOUNT is not set
|
||||
# CONFIG_DEBUG_MEMORY_INIT is not set
|
||||
# CONFIG_DEBUG_LIST is not set
|
||||
# CONFIG_DEBUG_SG is not set
|
||||
# CONFIG_FRAME_POINTER is not set
|
||||
# CONFIG_BOOT_PRINTK_DELAY is not set
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
||||
# CONFIG_BACKTRACE_SELF_TEST is not set
|
||||
# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
|
||||
# CONFIG_FAULT_INJECTION is not set
|
||||
# CONFIG_SYSCTL_SYSCALL_CHECK is not set
|
||||
|
||||
#
|
||||
# Tracers
|
||||
#
|
||||
# CONFIG_SCHED_TRACER is not set
|
||||
# CONFIG_CONTEXT_SWITCH_TRACER is not set
|
||||
# CONFIG_BOOT_TRACER is not set
|
||||
# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
|
||||
# CONFIG_SAMPLES is not set
|
||||
CONFIG_HAVE_ARCH_KGDB=y
|
||||
# CONFIG_KGDB is not set
|
||||
# CONFIG_DEBUG_STACKOVERFLOW is not set
|
||||
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||
# CONFIG_KGDB_TESTCASE is not set
|
||||
CONFIG_DEBUG_VERBOSE=y
|
||||
CONFIG_DEBUG_MMRS=y
|
||||
# CONFIG_DEBUG_HWERR is not set
|
||||
# CONFIG_DEBUG_DOUBLEFAULT is not set
|
||||
CONFIG_DEBUG_HUNT_FOR_ZERO=y
|
||||
CONFIG_DEBUG_BFIN_HWTRACE_ON=y
|
||||
CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION_OFF=y
|
||||
|
@ -1154,7 +1264,7 @@ CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION_OFF=y
|
|||
CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION=0
|
||||
# CONFIG_DEBUG_BFIN_HWTRACE_EXPAND is not set
|
||||
# CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE is not set
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
# CONFIG_EARLY_PRINTK is not set
|
||||
# CONFIG_CPLB_INFO is not set
|
||||
CONFIG_ACCESS_CHECK=y
|
||||
|
||||
|
@ -1163,10 +1273,96 @@ CONFIG_ACCESS_CHECK=y
|
|||
#
|
||||
# CONFIG_KEYS is not set
|
||||
CONFIG_SECURITY=y
|
||||
# CONFIG_SECURITYFS is not set
|
||||
# CONFIG_SECURITY_NETWORK is not set
|
||||
# CONFIG_SECURITY_CAPABILITIES is not set
|
||||
# CONFIG_SECURITY_FILE_CAPABILITIES is not set
|
||||
# CONFIG_SECURITY_ROOTPLUG is not set
|
||||
# CONFIG_CRYPTO is not set
|
||||
CONFIG_SECURITY_DEFAULT_MMAP_MIN_ADDR=0
|
||||
CONFIG_CRYPTO=y
|
||||
|
||||
#
|
||||
# Crypto core or helper
|
||||
#
|
||||
# CONFIG_CRYPTO_FIPS is not set
|
||||
# CONFIG_CRYPTO_MANAGER is not set
|
||||
# CONFIG_CRYPTO_MANAGER2 is not set
|
||||
# CONFIG_CRYPTO_GF128MUL is not set
|
||||
# CONFIG_CRYPTO_NULL is not set
|
||||
# CONFIG_CRYPTO_CRYPTD is not set
|
||||
# CONFIG_CRYPTO_AUTHENC is not set
|
||||
# CONFIG_CRYPTO_TEST is not set
|
||||
|
||||
#
|
||||
# Authenticated Encryption with Associated Data
|
||||
#
|
||||
# CONFIG_CRYPTO_CCM is not set
|
||||
# CONFIG_CRYPTO_GCM is not set
|
||||
# CONFIG_CRYPTO_SEQIV is not set
|
||||
|
||||
#
|
||||
# Block modes
|
||||
#
|
||||
# CONFIG_CRYPTO_CBC is not set
|
||||
# CONFIG_CRYPTO_CTR is not set
|
||||
# CONFIG_CRYPTO_CTS is not set
|
||||
# CONFIG_CRYPTO_ECB is not set
|
||||
# CONFIG_CRYPTO_LRW is not set
|
||||
# CONFIG_CRYPTO_PCBC is not set
|
||||
# CONFIG_CRYPTO_XTS is not set
|
||||
|
||||
#
|
||||
# Hash modes
|
||||
#
|
||||
# CONFIG_CRYPTO_HMAC is not set
|
||||
# CONFIG_CRYPTO_XCBC is not set
|
||||
|
||||
#
|
||||
# Digest
|
||||
#
|
||||
# CONFIG_CRYPTO_CRC32C is not set
|
||||
# CONFIG_CRYPTO_MD4 is not set
|
||||
# CONFIG_CRYPTO_MD5 is not set
|
||||
# CONFIG_CRYPTO_MICHAEL_MIC is not set
|
||||
# CONFIG_CRYPTO_RMD128 is not set
|
||||
# CONFIG_CRYPTO_RMD160 is not set
|
||||
# CONFIG_CRYPTO_RMD256 is not set
|
||||
# CONFIG_CRYPTO_RMD320 is not set
|
||||
# CONFIG_CRYPTO_SHA1 is not set
|
||||
# CONFIG_CRYPTO_SHA256 is not set
|
||||
# CONFIG_CRYPTO_SHA512 is not set
|
||||
# CONFIG_CRYPTO_TGR192 is not set
|
||||
# CONFIG_CRYPTO_WP512 is not set
|
||||
|
||||
#
|
||||
# Ciphers
|
||||
#
|
||||
# CONFIG_CRYPTO_AES is not set
|
||||
# CONFIG_CRYPTO_ANUBIS is not set
|
||||
# CONFIG_CRYPTO_ARC4 is not set
|
||||
# CONFIG_CRYPTO_BLOWFISH is not set
|
||||
# CONFIG_CRYPTO_CAMELLIA is not set
|
||||
# CONFIG_CRYPTO_CAST5 is not set
|
||||
# CONFIG_CRYPTO_CAST6 is not set
|
||||
# CONFIG_CRYPTO_DES is not set
|
||||
# CONFIG_CRYPTO_FCRYPT is not set
|
||||
# CONFIG_CRYPTO_KHAZAD is not set
|
||||
# CONFIG_CRYPTO_SALSA20 is not set
|
||||
# CONFIG_CRYPTO_SEED is not set
|
||||
# CONFIG_CRYPTO_SERPENT is not set
|
||||
# CONFIG_CRYPTO_TEA is not set
|
||||
# CONFIG_CRYPTO_TWOFISH is not set
|
||||
|
||||
#
|
||||
# Compression
|
||||
#
|
||||
# CONFIG_CRYPTO_DEFLATE is not set
|
||||
# CONFIG_CRYPTO_LZO is not set
|
||||
|
||||
#
|
||||
# Random Number Generation
|
||||
#
|
||||
# CONFIG_CRYPTO_ANSI_CPRNG is not set
|
||||
CONFIG_CRYPTO_HW=y
|
||||
|
||||
#
|
||||
# Library routines
|
||||
|
@ -1174,6 +1370,7 @@ CONFIG_SECURITY=y
|
|||
CONFIG_BITREVERSE=y
|
||||
CONFIG_CRC_CCITT=m
|
||||
# CONFIG_CRC16 is not set
|
||||
# CONFIG_CRC_T10DIF is not set
|
||||
# CONFIG_CRC_ITU_T is not set
|
||||
CONFIG_CRC32=y
|
||||
# CONFIG_CRC7 is not set
|
||||
|
|
|
@ -63,23 +63,23 @@ static inline __wsum
|
|||
csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len,
|
||||
unsigned short proto, __wsum sum)
|
||||
{
|
||||
unsigned int carry;
|
||||
|
||||
__asm__ ("%0 = %0 + %1;\n\t"
|
||||
"CC = AC0;\n\t"
|
||||
"if !CC jump 4;\n\t"
|
||||
"%0 = %0 + %4;\n\t"
|
||||
"%0 = %0 + %2;\n\t"
|
||||
"CC = AC0;\n\t"
|
||||
"if !CC jump 4;\n\t"
|
||||
"%0 = %0 + %4;\n\t"
|
||||
"%0 = %0 + %3;\n\t"
|
||||
"CC = AC0;\n\t"
|
||||
"if !CC jump 4;\n\t"
|
||||
"%0 = %0 + %4;\n\t"
|
||||
"NOP;\n\t"
|
||||
: "=d" (sum)
|
||||
: "d" (daddr), "d" (saddr), "d" ((ntohs(len)<<16)+proto*256), "d" (1), "0"(sum)
|
||||
: "CC");
|
||||
__asm__ ("%0 = %0 + %2;\n\t"
|
||||
"CC = AC0;\n\t"
|
||||
"%1 = CC;\n\t"
|
||||
"%0 = %0 + %1;\n\t"
|
||||
"%0 = %0 + %3;\n\t"
|
||||
"CC = AC0;\n\t"
|
||||
"%1 = CC;\n\t"
|
||||
"%0 = %0 + %1;\n\t"
|
||||
"%0 = %0 + %4;\n\t"
|
||||
"CC = AC0;\n\t"
|
||||
"%1 = CC;\n\t"
|
||||
"%0 = %0 + %1;\n\t"
|
||||
: "=d" (sum), "=&d" (carry)
|
||||
: "d" (daddr), "d" (saddr), "d" ((len + proto) << 8), "0"(sum)
|
||||
: "CC");
|
||||
|
||||
return (sum);
|
||||
}
|
||||
|
|
|
@ -13,29 +13,7 @@
|
|||
|
||||
static inline void __delay(unsigned long loops)
|
||||
{
|
||||
if (ANOMALY_05000312) {
|
||||
/* Interrupted loads to loop registers -> bad */
|
||||
unsigned long tmp;
|
||||
__asm__ __volatile__(
|
||||
"[--SP] = LC0;"
|
||||
"[--SP] = LT0;"
|
||||
"[--SP] = LB0;"
|
||||
"LSETUP (1f,1f) LC0 = %1;"
|
||||
"1: NOP;"
|
||||
/* We take advantage of the fact that LC0 is 0 at
|
||||
* the end of the loop. Otherwise we'd need some
|
||||
* NOPs after the CLI here.
|
||||
*/
|
||||
"CLI %0;"
|
||||
"LB0 = [SP++];"
|
||||
"LT0 = [SP++];"
|
||||
"LC0 = [SP++];"
|
||||
"STI %0;"
|
||||
: "=d" (tmp)
|
||||
: "a" (loops)
|
||||
);
|
||||
} else
|
||||
__asm__ __volatile__ (
|
||||
__asm__ __volatile__ (
|
||||
"LSETUP(1f, 1f) LC0 = %0;"
|
||||
"1: NOP;"
|
||||
:
|
||||
|
@ -47,16 +25,15 @@ static inline void __delay(unsigned long loops)
|
|||
#include <linux/param.h> /* needed for HZ */
|
||||
|
||||
/*
|
||||
* Use only for very small delays ( < 1 msec). Should probably use a
|
||||
* lookup table, really, as the multiplications take much too long with
|
||||
* short delays. This is a "reasonable" implementation, though (and the
|
||||
* first constant multiplications gets optimized away if the delay is
|
||||
* a constant)
|
||||
* close approximation borrowed from m68knommu to avoid 64-bit math
|
||||
*/
|
||||
|
||||
#define HZSCALE (268435456 / (1000000/HZ))
|
||||
|
||||
static inline void udelay(unsigned long usecs)
|
||||
{
|
||||
extern unsigned long loops_per_jiffy;
|
||||
__delay(usecs * loops_per_jiffy / (1000000 / HZ));
|
||||
__delay((((usecs * HZSCALE) >> 11) * (loops_per_jiffy >> 11)) >> 6);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -27,60 +27,6 @@
|
|||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
/*
|
||||
* Number BF537/6/4 BF561 BF533/2/1
|
||||
* BF527/5/2
|
||||
*
|
||||
* GPIO_0 PF0 PF0 PF0
|
||||
* GPIO_1 PF1 PF1 PF1
|
||||
* GPIO_2 PF2 PF2 PF2
|
||||
* GPIO_3 PF3 PF3 PF3
|
||||
* GPIO_4 PF4 PF4 PF4
|
||||
* GPIO_5 PF5 PF5 PF5
|
||||
* GPIO_6 PF6 PF6 PF6
|
||||
* GPIO_7 PF7 PF7 PF7
|
||||
* GPIO_8 PF8 PF8 PF8
|
||||
* GPIO_9 PF9 PF9 PF9
|
||||
* GPIO_10 PF10 PF10 PF10
|
||||
* GPIO_11 PF11 PF11 PF11
|
||||
* GPIO_12 PF12 PF12 PF12
|
||||
* GPIO_13 PF13 PF13 PF13
|
||||
* GPIO_14 PF14 PF14 PF14
|
||||
* GPIO_15 PF15 PF15 PF15
|
||||
* GPIO_16 PG0 PF16
|
||||
* GPIO_17 PG1 PF17
|
||||
* GPIO_18 PG2 PF18
|
||||
* GPIO_19 PG3 PF19
|
||||
* GPIO_20 PG4 PF20
|
||||
* GPIO_21 PG5 PF21
|
||||
* GPIO_22 PG6 PF22
|
||||
* GPIO_23 PG7 PF23
|
||||
* GPIO_24 PG8 PF24
|
||||
* GPIO_25 PG9 PF25
|
||||
* GPIO_26 PG10 PF26
|
||||
* GPIO_27 PG11 PF27
|
||||
* GPIO_28 PG12 PF28
|
||||
* GPIO_29 PG13 PF29
|
||||
* GPIO_30 PG14 PF30
|
||||
* GPIO_31 PG15 PF31
|
||||
* GPIO_32 PH0 PF32
|
||||
* GPIO_33 PH1 PF33
|
||||
* GPIO_34 PH2 PF34
|
||||
* GPIO_35 PH3 PF35
|
||||
* GPIO_36 PH4 PF36
|
||||
* GPIO_37 PH5 PF37
|
||||
* GPIO_38 PH6 PF38
|
||||
* GPIO_39 PH7 PF39
|
||||
* GPIO_40 PH8 PF40
|
||||
* GPIO_41 PH9 PF41
|
||||
* GPIO_42 PH10 PF42
|
||||
* GPIO_43 PH11 PF43
|
||||
* GPIO_44 PH12 PF44
|
||||
* GPIO_45 PH13 PF45
|
||||
* GPIO_46 PH14 PF46
|
||||
* GPIO_47 PH15 PF47
|
||||
*/
|
||||
|
||||
#ifndef __ARCH_BLACKFIN_GPIO_H__
|
||||
#define __ARCH_BLACKFIN_GPIO_H__
|
||||
|
||||
|
@ -295,10 +241,6 @@ int bfin_gpio_direction_output(unsigned gpio, int value);
|
|||
int bfin_gpio_get_value(unsigned gpio);
|
||||
void bfin_gpio_set_value(unsigned gpio, int value);
|
||||
|
||||
#ifndef BF548_FAMILY
|
||||
#define bfin_gpio_set_value(gpio, value) set_gpio_data(gpio, value)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_GPIOLIB
|
||||
#include <asm-generic/gpio.h> /* cansleep wrappers */
|
||||
|
||||
|
|
|
@ -1,32 +1,8 @@
|
|||
/*
|
||||
* File: include/asm-blackfin/kgdb.h
|
||||
* Based on:
|
||||
* Author: Sonic Zhang
|
||||
/* Blackfin KGDB header
|
||||
*
|
||||
* Created:
|
||||
* Description:
|
||||
* Copyright 2005-2009 Analog Devices Inc.
|
||||
*
|
||||
* Rev: $Id: kgdb_bfin_linux-2.6.x.patch 4934 2007-02-13 09:32:11Z sonicz $
|
||||
*
|
||||
* Modified:
|
||||
* Copyright 2005-2006 Analog Devices Inc.
|
||||
*
|
||||
* Bugs: Enter bugs at http://blackfin.uclinux.org/
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see the file COPYING, or write
|
||||
* to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
* Licensed under the GPL-2 or later.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_BLACKFIN_KGDB_H__
|
||||
|
@ -37,17 +13,18 @@
|
|||
/* gdb locks */
|
||||
#define KGDB_MAX_NO_CPUS 8
|
||||
|
||||
/************************************************************************/
|
||||
/* BUFMAX defines the maximum number of characters in inbound/outbound buffers*/
|
||||
/* at least NUMREGBYTES*2 are needed for register packets */
|
||||
/* Longer buffer is needed to list all threads */
|
||||
/*
|
||||
* BUFMAX defines the maximum number of characters in inbound/outbound buffers.
|
||||
* At least NUMREGBYTES*2 are needed for register packets.
|
||||
* Longer buffer is needed to list all threads.
|
||||
*/
|
||||
#define BUFMAX 2048
|
||||
|
||||
/*
|
||||
* Note that this register image is different from
|
||||
* the register image that Linux produces at interrupt time.
|
||||
*
|
||||
* Linux's register image is defined by struct pt_regs in ptrace.h.
|
||||
* Note that this register image is different from
|
||||
* the register image that Linux produces at interrupt time.
|
||||
*
|
||||
* Linux's register image is defined by struct pt_regs in ptrace.h.
|
||||
*/
|
||||
enum regnames {
|
||||
/* Core Registers */
|
||||
|
@ -104,14 +81,14 @@ enum regnames {
|
|||
BFIN_RETX,
|
||||
BFIN_RETN,
|
||||
BFIN_RETE,
|
||||
|
||||
|
||||
/* Pseudo Registers */
|
||||
BFIN_PC,
|
||||
BFIN_CC,
|
||||
BFIN_EXTRA1, /* Address of .text section. */
|
||||
BFIN_EXTRA2, /* Address of .data section. */
|
||||
BFIN_EXTRA3, /* Address of .bss section. */
|
||||
BFIN_FDPIC_EXEC,
|
||||
BFIN_FDPIC_EXEC,
|
||||
BFIN_FDPIC_INTERP,
|
||||
|
||||
/* MMRs */
|
||||
|
@ -126,7 +103,7 @@ enum regnames {
|
|||
|
||||
static inline void arch_kgdb_breakpoint(void)
|
||||
{
|
||||
asm(" EXCPT 2;");
|
||||
asm("EXCPT 2;");
|
||||
}
|
||||
#define BREAK_INSTR_SIZE 2
|
||||
#define CACHE_FLUSH_IS_SAFE 1
|
||||
|
|
|
@ -115,7 +115,7 @@
|
|||
#define mem_SDRRC (((CONFIG_SCLK_HZ / 1000) * SDRAM_Tref) / SDRAM_NRA) - (SDRAM_tRAS_num + SDRAM_tRP_num)
|
||||
|
||||
/* Enable SCLK Out */
|
||||
#define mem_SDGCTL (0x80000000 | SCTLE | SDRAM_CL | SDRAM_tRAS | SDRAM_tRP | SDRAM_tRCD | SDRAM_tWR | PSS)
|
||||
#define mem_SDGCTL (SCTLE | SDRAM_CL | SDRAM_tRAS | SDRAM_tRP | SDRAM_tRCD | SDRAM_tWR | PSS)
|
||||
#else
|
||||
#define mem_SDRRC CONFIG_MEM_SDRRC
|
||||
#define mem_SDGCTL CONFIG_MEM_SDGCTL
|
||||
|
|
|
@ -59,6 +59,7 @@ struct blackfin_pda { /* Per-processor Data Area */
|
|||
unsigned long icplb_fault_addr;
|
||||
unsigned long retx;
|
||||
unsigned long seqstat;
|
||||
unsigned int __nmi_count; /* number of times NMI asserted on this CPU */
|
||||
};
|
||||
|
||||
extern struct blackfin_pda cpu_pda[];
|
||||
|
|
|
@ -15,6 +15,6 @@ extern void native_machine_halt(void);
|
|||
extern void native_machine_power_off(void);
|
||||
|
||||
/* common reboot workarounds */
|
||||
extern void bfin_gpio_reset_spi0_ssel1(void);
|
||||
extern void bfin_reset_boot_spi_cs(unsigned short pin);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -15,6 +15,8 @@ else
|
|||
obj-y += time.o
|
||||
endif
|
||||
|
||||
CFLAGS_kgdb_test.o := -mlong-calls -O0
|
||||
|
||||
obj-$(CONFIG_IPIPE) += ipipe.o
|
||||
obj-$(CONFIG_IPIPE_TRACE_MCOUNT) += mcount.o
|
||||
obj-$(CONFIG_BFIN_GPTIMERS) += gptimers.o
|
||||
|
|
|
@ -249,6 +249,13 @@ static void __dma_memcpy(u32 daddr, s16 dmod, u32 saddr, s16 smod, size_t cnt, u
|
|||
|
||||
spin_lock_irqsave(&mdma_lock, flags);
|
||||
|
||||
/* Force a sync in case a previous config reset on this channel
|
||||
* occurred. This is needed so subsequent writes to DMA registers
|
||||
* are not spuriously lost/corrupted. Do it under irq lock and
|
||||
* without the anomaly version (because we are atomic already).
|
||||
*/
|
||||
__builtin_bfin_ssync();
|
||||
|
||||
if (bfin_read_MDMA_S0_CONFIG())
|
||||
while (!(bfin_read_MDMA_D0_IRQ_STATUS() & DMA_DONE))
|
||||
continue;
|
||||
|
|
|
@ -27,59 +27,6 @@
|
|||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
/*
|
||||
* Number BF537/6/4 BF561 BF533/2/1 BF549/8/4/2
|
||||
*
|
||||
* GPIO_0 PF0 PF0 PF0 PA0...PJ13
|
||||
* GPIO_1 PF1 PF1 PF1
|
||||
* GPIO_2 PF2 PF2 PF2
|
||||
* GPIO_3 PF3 PF3 PF3
|
||||
* GPIO_4 PF4 PF4 PF4
|
||||
* GPIO_5 PF5 PF5 PF5
|
||||
* GPIO_6 PF6 PF6 PF6
|
||||
* GPIO_7 PF7 PF7 PF7
|
||||
* GPIO_8 PF8 PF8 PF8
|
||||
* GPIO_9 PF9 PF9 PF9
|
||||
* GPIO_10 PF10 PF10 PF10
|
||||
* GPIO_11 PF11 PF11 PF11
|
||||
* GPIO_12 PF12 PF12 PF12
|
||||
* GPIO_13 PF13 PF13 PF13
|
||||
* GPIO_14 PF14 PF14 PF14
|
||||
* GPIO_15 PF15 PF15 PF15
|
||||
* GPIO_16 PG0 PF16
|
||||
* GPIO_17 PG1 PF17
|
||||
* GPIO_18 PG2 PF18
|
||||
* GPIO_19 PG3 PF19
|
||||
* GPIO_20 PG4 PF20
|
||||
* GPIO_21 PG5 PF21
|
||||
* GPIO_22 PG6 PF22
|
||||
* GPIO_23 PG7 PF23
|
||||
* GPIO_24 PG8 PF24
|
||||
* GPIO_25 PG9 PF25
|
||||
* GPIO_26 PG10 PF26
|
||||
* GPIO_27 PG11 PF27
|
||||
* GPIO_28 PG12 PF28
|
||||
* GPIO_29 PG13 PF29
|
||||
* GPIO_30 PG14 PF30
|
||||
* GPIO_31 PG15 PF31
|
||||
* GPIO_32 PH0 PF32
|
||||
* GPIO_33 PH1 PF33
|
||||
* GPIO_34 PH2 PF34
|
||||
* GPIO_35 PH3 PF35
|
||||
* GPIO_36 PH4 PF36
|
||||
* GPIO_37 PH5 PF37
|
||||
* GPIO_38 PH6 PF38
|
||||
* GPIO_39 PH7 PF39
|
||||
* GPIO_40 PH8 PF40
|
||||
* GPIO_41 PH9 PF41
|
||||
* GPIO_42 PH10 PF42
|
||||
* GPIO_43 PH11 PF43
|
||||
* GPIO_44 PH12 PF44
|
||||
* GPIO_45 PH13 PF45
|
||||
* GPIO_46 PH14 PF46
|
||||
* GPIO_47 PH15 PF47
|
||||
*/
|
||||
|
||||
#include <linux/delay.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/err.h>
|
||||
|
@ -119,51 +66,18 @@ enum {
|
|||
#define AWA_DUMMY_READ(...) do { } while (0)
|
||||
#endif
|
||||
|
||||
static struct gpio_port_t * const gpio_array[] = {
|
||||
#if defined(BF533_FAMILY) || defined(BF538_FAMILY)
|
||||
static struct gpio_port_t *gpio_bankb[] = {
|
||||
(struct gpio_port_t *) FIO_FLAG_D,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(BF527_FAMILY) || defined(BF537_FAMILY) || defined(BF518_FAMILY)
|
||||
static struct gpio_port_t *gpio_bankb[] = {
|
||||
#elif defined(BF527_FAMILY) || defined(BF537_FAMILY) || defined(BF518_FAMILY)
|
||||
(struct gpio_port_t *) PORTFIO,
|
||||
(struct gpio_port_t *) PORTGIO,
|
||||
(struct gpio_port_t *) PORTHIO,
|
||||
};
|
||||
|
||||
static unsigned short *port_fer[] = {
|
||||
(unsigned short *) PORTF_FER,
|
||||
(unsigned short *) PORTG_FER,
|
||||
(unsigned short *) PORTH_FER,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(BF527_FAMILY) || defined(BF518_FAMILY)
|
||||
static unsigned short *port_mux[] = {
|
||||
(unsigned short *) PORTF_MUX,
|
||||
(unsigned short *) PORTG_MUX,
|
||||
(unsigned short *) PORTH_MUX,
|
||||
};
|
||||
|
||||
static const
|
||||
u8 pmux_offset[][16] =
|
||||
{{ 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 4, 6, 8, 8, 10, 10 }, /* PORTF */
|
||||
{ 0, 0, 0, 0, 0, 2, 2, 4, 4, 6, 8, 10, 10, 10, 12, 12 }, /* PORTG */
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 4, 4, 4, 4, 4, 4 }, /* PORTH */
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef BF561_FAMILY
|
||||
static struct gpio_port_t *gpio_bankb[] = {
|
||||
#elif defined(BF561_FAMILY)
|
||||
(struct gpio_port_t *) FIO0_FLAG_D,
|
||||
(struct gpio_port_t *) FIO1_FLAG_D,
|
||||
(struct gpio_port_t *) FIO2_FLAG_D,
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef BF548_FAMILY
|
||||
static struct gpio_port_t *gpio_array[] = {
|
||||
#elif defined(BF548_FAMILY)
|
||||
(struct gpio_port_t *)PORTA_FER,
|
||||
(struct gpio_port_t *)PORTB_FER,
|
||||
(struct gpio_port_t *)PORTC_FER,
|
||||
|
@ -174,7 +88,39 @@ static struct gpio_port_t *gpio_array[] = {
|
|||
(struct gpio_port_t *)PORTH_FER,
|
||||
(struct gpio_port_t *)PORTI_FER,
|
||||
(struct gpio_port_t *)PORTJ_FER,
|
||||
#else
|
||||
# error no gpio arrays defined
|
||||
#endif
|
||||
};
|
||||
|
||||
#if defined(BF527_FAMILY) || defined(BF537_FAMILY) || defined(BF518_FAMILY)
|
||||
static unsigned short * const port_fer[] = {
|
||||
(unsigned short *) PORTF_FER,
|
||||
(unsigned short *) PORTG_FER,
|
||||
(unsigned short *) PORTH_FER,
|
||||
};
|
||||
|
||||
# if !defined(BF537_FAMILY)
|
||||
static unsigned short * const port_mux[] = {
|
||||
(unsigned short *) PORTF_MUX,
|
||||
(unsigned short *) PORTG_MUX,
|
||||
(unsigned short *) PORTH_MUX,
|
||||
};
|
||||
|
||||
static const
|
||||
u8 pmux_offset[][16] = {
|
||||
# if defined(BF527_FAMILY)
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 4, 6, 8, 8, 10, 10 }, /* PORTF */
|
||||
{ 0, 0, 0, 0, 0, 2, 2, 4, 4, 6, 8, 10, 10, 10, 12, 12 }, /* PORTG */
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 4, 4, 4, 4, 4, 4 }, /* PORTH */
|
||||
# elif defined(BF518_FAMILY)
|
||||
{ 0, 2, 2, 2, 2, 2, 2, 4, 6, 6, 6, 8, 8, 8, 8, 10 }, /* PORTF */
|
||||
{ 0, 0, 0, 2, 4, 6, 6, 6, 8, 10, 10, 12, 14, 14, 14, 14 }, /* PORTG */
|
||||
{ 0, 0, 0, 0, 2, 2, 4, 6, 10, 10, 10, 10, 10, 10, 10, 10 }, /* PORTH */
|
||||
# endif
|
||||
};
|
||||
# endif
|
||||
|
||||
#endif
|
||||
|
||||
static unsigned short reserved_gpio_map[GPIO_BANK_NUM];
|
||||
|
@ -188,35 +134,9 @@ static struct str_ident {
|
|||
} str_ident[MAX_RESOURCES];
|
||||
|
||||
#if defined(CONFIG_PM)
|
||||
#if defined(CONFIG_BF54x)
|
||||
static struct gpio_port_s gpio_bank_saved[GPIO_BANK_NUM];
|
||||
#else
|
||||
static unsigned short wakeup_map[GPIO_BANK_NUM];
|
||||
static unsigned char wakeup_flags_map[MAX_BLACKFIN_GPIOS];
|
||||
static struct gpio_port_s gpio_bank_saved[GPIO_BANK_NUM];
|
||||
|
||||
#ifdef BF533_FAMILY
|
||||
static unsigned int sic_iwr_irqs[] = {IRQ_PROG_INTB};
|
||||
#endif
|
||||
|
||||
#ifdef BF537_FAMILY
|
||||
static unsigned int sic_iwr_irqs[] = {IRQ_PROG_INTB, IRQ_PORTG_INTB, IRQ_MAC_TX};
|
||||
#endif
|
||||
|
||||
#ifdef BF538_FAMILY
|
||||
static unsigned int sic_iwr_irqs[] = {IRQ_PORTF_INTB};
|
||||
#endif
|
||||
|
||||
#if defined(BF527_FAMILY) || defined(BF518_FAMILY)
|
||||
static unsigned int sic_iwr_irqs[] = {IRQ_PORTF_INTB, IRQ_PORTG_INTB, IRQ_PORTH_INTB};
|
||||
#endif
|
||||
|
||||
#ifdef BF561_FAMILY
|
||||
static unsigned int sic_iwr_irqs[] = {IRQ_PROG0_INTB, IRQ_PROG1_INTB, IRQ_PROG2_INTB};
|
||||
#endif
|
||||
#endif
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
inline int check_gpio(unsigned gpio)
|
||||
{
|
||||
#if defined(BF548_FAMILY)
|
||||
|
@ -330,9 +250,10 @@ static struct {
|
|||
{.res = P_SPI0_SSEL3, .offset = 0},
|
||||
};
|
||||
|
||||
static void portmux_setup(unsigned short per, unsigned short function)
|
||||
static void portmux_setup(unsigned short per)
|
||||
{
|
||||
u16 y, offset, muxreg;
|
||||
u16 function = P_FUNCT2MUX(per);
|
||||
|
||||
for (y = 0; y < ARRAY_SIZE(port_mux_lut); y++) {
|
||||
if (port_mux_lut[y].res == per) {
|
||||
|
@ -353,30 +274,33 @@ static void portmux_setup(unsigned short per, unsigned short function)
|
|||
}
|
||||
}
|
||||
#elif defined(BF548_FAMILY)
|
||||
inline void portmux_setup(unsigned short portno, unsigned short function)
|
||||
inline void portmux_setup(unsigned short per)
|
||||
{
|
||||
u32 pmux;
|
||||
u16 ident = P_IDENT(per);
|
||||
u16 function = P_FUNCT2MUX(per);
|
||||
|
||||
pmux = gpio_array[gpio_bank(portno)]->port_mux;
|
||||
pmux = gpio_array[gpio_bank(ident)]->port_mux;
|
||||
|
||||
pmux &= ~(0x3 << (2 * gpio_sub_n(portno)));
|
||||
pmux |= (function & 0x3) << (2 * gpio_sub_n(portno));
|
||||
pmux &= ~(0x3 << (2 * gpio_sub_n(ident)));
|
||||
pmux |= (function & 0x3) << (2 * gpio_sub_n(ident));
|
||||
|
||||
gpio_array[gpio_bank(portno)]->port_mux = pmux;
|
||||
gpio_array[gpio_bank(ident)]->port_mux = pmux;
|
||||
}
|
||||
|
||||
inline u16 get_portmux(unsigned short portno)
|
||||
inline u16 get_portmux(unsigned short per)
|
||||
{
|
||||
u32 pmux;
|
||||
u16 ident = P_IDENT(per);
|
||||
|
||||
pmux = gpio_array[gpio_bank(portno)]->port_mux;
|
||||
pmux = gpio_array[gpio_bank(ident)]->port_mux;
|
||||
|
||||
return (pmux >> (2 * gpio_sub_n(portno)) & 0x3);
|
||||
return (pmux >> (2 * gpio_sub_n(ident)) & 0x3);
|
||||
}
|
||||
#elif defined(BF527_FAMILY) || defined(BF518_FAMILY)
|
||||
inline void portmux_setup(unsigned short portno, unsigned short function)
|
||||
inline void portmux_setup(unsigned short per)
|
||||
{
|
||||
u16 pmux, ident = P_IDENT(portno);
|
||||
u16 pmux, ident = P_IDENT(per), function = P_FUNCT2MUX(per);
|
||||
u8 offset = pmux_offset[gpio_bank(ident)][gpio_sub_n(ident)];
|
||||
|
||||
pmux = *port_mux[gpio_bank(ident)];
|
||||
|
@ -424,90 +348,71 @@ void set_gpio_ ## name(unsigned gpio, unsigned short arg) \
|
|||
unsigned long flags; \
|
||||
local_irq_save_hw(flags); \
|
||||
if (arg) \
|
||||
gpio_bankb[gpio_bank(gpio)]->name |= gpio_bit(gpio); \
|
||||
gpio_array[gpio_bank(gpio)]->name |= gpio_bit(gpio); \
|
||||
else \
|
||||
gpio_bankb[gpio_bank(gpio)]->name &= ~gpio_bit(gpio); \
|
||||
gpio_array[gpio_bank(gpio)]->name &= ~gpio_bit(gpio); \
|
||||
AWA_DUMMY_READ(name); \
|
||||
local_irq_restore_hw(flags); \
|
||||
} \
|
||||
EXPORT_SYMBOL(set_gpio_ ## name);
|
||||
|
||||
SET_GPIO(dir)
|
||||
SET_GPIO(inen)
|
||||
SET_GPIO(polar)
|
||||
SET_GPIO(edge)
|
||||
SET_GPIO(both)
|
||||
SET_GPIO(dir) /* set_gpio_dir() */
|
||||
SET_GPIO(inen) /* set_gpio_inen() */
|
||||
SET_GPIO(polar) /* set_gpio_polar() */
|
||||
SET_GPIO(edge) /* set_gpio_edge() */
|
||||
SET_GPIO(both) /* set_gpio_both() */
|
||||
|
||||
|
||||
#if ANOMALY_05000311 || ANOMALY_05000323
|
||||
#define SET_GPIO_SC(name) \
|
||||
void set_gpio_ ## name(unsigned gpio, unsigned short arg) \
|
||||
{ \
|
||||
unsigned long flags; \
|
||||
local_irq_save_hw(flags); \
|
||||
if (ANOMALY_05000311 || ANOMALY_05000323) \
|
||||
local_irq_save_hw(flags); \
|
||||
if (arg) \
|
||||
gpio_bankb[gpio_bank(gpio)]->name ## _set = gpio_bit(gpio); \
|
||||
gpio_array[gpio_bank(gpio)]->name ## _set = gpio_bit(gpio); \
|
||||
else \
|
||||
gpio_bankb[gpio_bank(gpio)]->name ## _clear = gpio_bit(gpio); \
|
||||
AWA_DUMMY_READ(name); \
|
||||
local_irq_restore_hw(flags); \
|
||||
gpio_array[gpio_bank(gpio)]->name ## _clear = gpio_bit(gpio); \
|
||||
if (ANOMALY_05000311 || ANOMALY_05000323) { \
|
||||
AWA_DUMMY_READ(name); \
|
||||
local_irq_restore_hw(flags); \
|
||||
} \
|
||||
} \
|
||||
EXPORT_SYMBOL(set_gpio_ ## name);
|
||||
#else
|
||||
#define SET_GPIO_SC(name) \
|
||||
void set_gpio_ ## name(unsigned gpio, unsigned short arg) \
|
||||
{ \
|
||||
if (arg) \
|
||||
gpio_bankb[gpio_bank(gpio)]->name ## _set = gpio_bit(gpio); \
|
||||
else \
|
||||
gpio_bankb[gpio_bank(gpio)]->name ## _clear = gpio_bit(gpio); \
|
||||
} \
|
||||
EXPORT_SYMBOL(set_gpio_ ## name);
|
||||
#endif
|
||||
|
||||
SET_GPIO_SC(maska)
|
||||
SET_GPIO_SC(maskb)
|
||||
SET_GPIO_SC(data)
|
||||
|
||||
#if ANOMALY_05000311 || ANOMALY_05000323
|
||||
void set_gpio_toggle(unsigned gpio)
|
||||
{
|
||||
unsigned long flags;
|
||||
local_irq_save_hw(flags);
|
||||
gpio_bankb[gpio_bank(gpio)]->toggle = gpio_bit(gpio);
|
||||
AWA_DUMMY_READ(toggle);
|
||||
local_irq_restore_hw(flags);
|
||||
if (ANOMALY_05000311 || ANOMALY_05000323)
|
||||
local_irq_save_hw(flags);
|
||||
gpio_array[gpio_bank(gpio)]->toggle = gpio_bit(gpio);
|
||||
if (ANOMALY_05000311 || ANOMALY_05000323) {
|
||||
AWA_DUMMY_READ(toggle);
|
||||
local_irq_restore_hw(flags);
|
||||
}
|
||||
}
|
||||
#else
|
||||
void set_gpio_toggle(unsigned gpio)
|
||||
{
|
||||
gpio_bankb[gpio_bank(gpio)]->toggle = gpio_bit(gpio);
|
||||
}
|
||||
#endif
|
||||
EXPORT_SYMBOL(set_gpio_toggle);
|
||||
|
||||
|
||||
/*Set current PORT date (16-bit word)*/
|
||||
|
||||
#if ANOMALY_05000311 || ANOMALY_05000323
|
||||
#define SET_GPIO_P(name) \
|
||||
void set_gpiop_ ## name(unsigned gpio, unsigned short arg) \
|
||||
{ \
|
||||
unsigned long flags; \
|
||||
local_irq_save_hw(flags); \
|
||||
gpio_bankb[gpio_bank(gpio)]->name = arg; \
|
||||
AWA_DUMMY_READ(name); \
|
||||
local_irq_restore_hw(flags); \
|
||||
if (ANOMALY_05000311 || ANOMALY_05000323) \
|
||||
local_irq_save_hw(flags); \
|
||||
gpio_array[gpio_bank(gpio)]->name = arg; \
|
||||
if (ANOMALY_05000311 || ANOMALY_05000323) { \
|
||||
AWA_DUMMY_READ(name); \
|
||||
local_irq_restore_hw(flags); \
|
||||
} \
|
||||
} \
|
||||
EXPORT_SYMBOL(set_gpiop_ ## name);
|
||||
#else
|
||||
#define SET_GPIO_P(name) \
|
||||
void set_gpiop_ ## name(unsigned gpio, unsigned short arg) \
|
||||
{ \
|
||||
gpio_bankb[gpio_bank(gpio)]->name = arg; \
|
||||
} \
|
||||
EXPORT_SYMBOL(set_gpiop_ ## name);
|
||||
#endif
|
||||
|
||||
SET_GPIO_P(data)
|
||||
SET_GPIO_P(dir)
|
||||
|
@ -519,27 +424,21 @@ SET_GPIO_P(maska)
|
|||
SET_GPIO_P(maskb)
|
||||
|
||||
/* Get a specific bit */
|
||||
#if ANOMALY_05000311 || ANOMALY_05000323
|
||||
#define GET_GPIO(name) \
|
||||
unsigned short get_gpio_ ## name(unsigned gpio) \
|
||||
{ \
|
||||
unsigned long flags; \
|
||||
unsigned short ret; \
|
||||
local_irq_save_hw(flags); \
|
||||
ret = 0x01 & (gpio_bankb[gpio_bank(gpio)]->name >> gpio_sub_n(gpio)); \
|
||||
AWA_DUMMY_READ(name); \
|
||||
local_irq_restore_hw(flags); \
|
||||
if (ANOMALY_05000311 || ANOMALY_05000323) \
|
||||
local_irq_save_hw(flags); \
|
||||
ret = 0x01 & (gpio_array[gpio_bank(gpio)]->name >> gpio_sub_n(gpio)); \
|
||||
if (ANOMALY_05000311 || ANOMALY_05000323) { \
|
||||
AWA_DUMMY_READ(name); \
|
||||
local_irq_restore_hw(flags); \
|
||||
} \
|
||||
return ret; \
|
||||
} \
|
||||
EXPORT_SYMBOL(get_gpio_ ## name);
|
||||
#else
|
||||
#define GET_GPIO(name) \
|
||||
unsigned short get_gpio_ ## name(unsigned gpio) \
|
||||
{ \
|
||||
return (0x01 & (gpio_bankb[gpio_bank(gpio)]->name >> gpio_sub_n(gpio))); \
|
||||
} \
|
||||
EXPORT_SYMBOL(get_gpio_ ## name);
|
||||
#endif
|
||||
|
||||
GET_GPIO(data)
|
||||
GET_GPIO(dir)
|
||||
|
@ -552,27 +451,21 @@ GET_GPIO(maskb)
|
|||
|
||||
/*Get current PORT date (16-bit word)*/
|
||||
|
||||
#if ANOMALY_05000311 || ANOMALY_05000323
|
||||
#define GET_GPIO_P(name) \
|
||||
unsigned short get_gpiop_ ## name(unsigned gpio) \
|
||||
{ \
|
||||
unsigned long flags; \
|
||||
unsigned short ret; \
|
||||
local_irq_save_hw(flags); \
|
||||
ret = (gpio_bankb[gpio_bank(gpio)]->name); \
|
||||
AWA_DUMMY_READ(name); \
|
||||
local_irq_restore_hw(flags); \
|
||||
if (ANOMALY_05000311 || ANOMALY_05000323) \
|
||||
local_irq_save_hw(flags); \
|
||||
ret = (gpio_array[gpio_bank(gpio)]->name); \
|
||||
if (ANOMALY_05000311 || ANOMALY_05000323) { \
|
||||
AWA_DUMMY_READ(name); \
|
||||
local_irq_restore_hw(flags); \
|
||||
} \
|
||||
return ret; \
|
||||
} \
|
||||
EXPORT_SYMBOL(get_gpiop_ ## name);
|
||||
#else
|
||||
#define GET_GPIO_P(name) \
|
||||
unsigned short get_gpiop_ ## name(unsigned gpio) \
|
||||
{ \
|
||||
return (gpio_bankb[gpio_bank(gpio)]->name);\
|
||||
} \
|
||||
EXPORT_SYMBOL(get_gpiop_ ## name);
|
||||
#endif
|
||||
|
||||
GET_GPIO_P(data)
|
||||
GET_GPIO_P(dir)
|
||||
|
@ -585,6 +478,26 @@ GET_GPIO_P(maskb)
|
|||
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
static unsigned short wakeup_map[GPIO_BANK_NUM];
|
||||
static unsigned char wakeup_flags_map[MAX_BLACKFIN_GPIOS];
|
||||
|
||||
static const unsigned int sic_iwr_irqs[] = {
|
||||
#if defined(BF533_FAMILY)
|
||||
IRQ_PROG_INTB
|
||||
#elif defined(BF537_FAMILY)
|
||||
IRQ_PROG_INTB, IRQ_PORTG_INTB, IRQ_MAC_TX
|
||||
#elif defined(BF538_FAMILY)
|
||||
IRQ_PORTF_INTB
|
||||
#elif defined(BF527_FAMILY) || defined(BF518_FAMILY)
|
||||
IRQ_PORTF_INTB, IRQ_PORTG_INTB, IRQ_PORTH_INTB
|
||||
#elif defined(BF561_FAMILY)
|
||||
IRQ_PROG0_INTB, IRQ_PROG1_INTB, IRQ_PROG2_INTB
|
||||
#else
|
||||
# error no SIC_IWR defined
|
||||
#endif
|
||||
};
|
||||
|
||||
/***********************************************************
|
||||
*
|
||||
* FUNCTIONS: Blackfin PM Setup API
|
||||
|
@ -669,18 +582,18 @@ u32 bfin_pm_standby_setup(void)
|
|||
mask = wakeup_map[gpio_bank(i)];
|
||||
bank = gpio_bank(i);
|
||||
|
||||
gpio_bank_saved[bank].maskb = gpio_bankb[bank]->maskb;
|
||||
gpio_bankb[bank]->maskb = 0;
|
||||
gpio_bank_saved[bank].maskb = gpio_array[bank]->maskb;
|
||||
gpio_array[bank]->maskb = 0;
|
||||
|
||||
if (mask) {
|
||||
#if defined(BF527_FAMILY) || defined(BF537_FAMILY) || defined(BF518_FAMILY)
|
||||
gpio_bank_saved[bank].fer = *port_fer[bank];
|
||||
#endif
|
||||
gpio_bank_saved[bank].inen = gpio_bankb[bank]->inen;
|
||||
gpio_bank_saved[bank].polar = gpio_bankb[bank]->polar;
|
||||
gpio_bank_saved[bank].dir = gpio_bankb[bank]->dir;
|
||||
gpio_bank_saved[bank].edge = gpio_bankb[bank]->edge;
|
||||
gpio_bank_saved[bank].both = gpio_bankb[bank]->both;
|
||||
gpio_bank_saved[bank].inen = gpio_array[bank]->inen;
|
||||
gpio_bank_saved[bank].polar = gpio_array[bank]->polar;
|
||||
gpio_bank_saved[bank].dir = gpio_array[bank]->dir;
|
||||
gpio_bank_saved[bank].edge = gpio_array[bank]->edge;
|
||||
gpio_bank_saved[bank].both = gpio_array[bank]->both;
|
||||
gpio_bank_saved[bank].reserved =
|
||||
reserved_gpio_map[bank];
|
||||
|
||||
|
@ -700,7 +613,7 @@ u32 bfin_pm_standby_setup(void)
|
|||
}
|
||||
|
||||
bfin_internal_set_wake(sic_iwr_irqs[bank], 1);
|
||||
gpio_bankb[bank]->maskb_set = wakeup_map[gpio_bank(i)];
|
||||
gpio_array[bank]->maskb_set = wakeup_map[gpio_bank(i)];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -721,18 +634,18 @@ void bfin_pm_standby_restore(void)
|
|||
#if defined(BF527_FAMILY) || defined(BF537_FAMILY) || defined(BF518_FAMILY)
|
||||
*port_fer[bank] = gpio_bank_saved[bank].fer;
|
||||
#endif
|
||||
gpio_bankb[bank]->inen = gpio_bank_saved[bank].inen;
|
||||
gpio_bankb[bank]->dir = gpio_bank_saved[bank].dir;
|
||||
gpio_bankb[bank]->polar = gpio_bank_saved[bank].polar;
|
||||
gpio_bankb[bank]->edge = gpio_bank_saved[bank].edge;
|
||||
gpio_bankb[bank]->both = gpio_bank_saved[bank].both;
|
||||
gpio_array[bank]->inen = gpio_bank_saved[bank].inen;
|
||||
gpio_array[bank]->dir = gpio_bank_saved[bank].dir;
|
||||
gpio_array[bank]->polar = gpio_bank_saved[bank].polar;
|
||||
gpio_array[bank]->edge = gpio_bank_saved[bank].edge;
|
||||
gpio_array[bank]->both = gpio_bank_saved[bank].both;
|
||||
|
||||
reserved_gpio_map[bank] =
|
||||
gpio_bank_saved[bank].reserved;
|
||||
bfin_internal_set_wake(sic_iwr_irqs[bank], 0);
|
||||
}
|
||||
|
||||
gpio_bankb[bank]->maskb = gpio_bank_saved[bank].maskb;
|
||||
gpio_array[bank]->maskb = gpio_bank_saved[bank].maskb;
|
||||
}
|
||||
AWA_DUMMY_READ(maskb);
|
||||
}
|
||||
|
@ -745,21 +658,21 @@ void bfin_gpio_pm_hibernate_suspend(void)
|
|||
bank = gpio_bank(i);
|
||||
|
||||
#if defined(BF527_FAMILY) || defined(BF537_FAMILY) || defined(BF518_FAMILY)
|
||||
gpio_bank_saved[bank].fer = *port_fer[bank];
|
||||
gpio_bank_saved[bank].fer = *port_fer[bank];
|
||||
#if defined(BF527_FAMILY) || defined(BF518_FAMILY)
|
||||
gpio_bank_saved[bank].mux = *port_mux[bank];
|
||||
gpio_bank_saved[bank].mux = *port_mux[bank];
|
||||
#else
|
||||
if (bank == 0)
|
||||
gpio_bank_saved[bank].mux = bfin_read_PORT_MUX();
|
||||
if (bank == 0)
|
||||
gpio_bank_saved[bank].mux = bfin_read_PORT_MUX();
|
||||
#endif
|
||||
#endif
|
||||
gpio_bank_saved[bank].data = gpio_bankb[bank]->data;
|
||||
gpio_bank_saved[bank].inen = gpio_bankb[bank]->inen;
|
||||
gpio_bank_saved[bank].polar = gpio_bankb[bank]->polar;
|
||||
gpio_bank_saved[bank].dir = gpio_bankb[bank]->dir;
|
||||
gpio_bank_saved[bank].edge = gpio_bankb[bank]->edge;
|
||||
gpio_bank_saved[bank].both = gpio_bankb[bank]->both;
|
||||
gpio_bank_saved[bank].maska = gpio_bankb[bank]->maska;
|
||||
gpio_bank_saved[bank].data = gpio_array[bank]->data;
|
||||
gpio_bank_saved[bank].inen = gpio_array[bank]->inen;
|
||||
gpio_bank_saved[bank].polar = gpio_array[bank]->polar;
|
||||
gpio_bank_saved[bank].dir = gpio_array[bank]->dir;
|
||||
gpio_bank_saved[bank].edge = gpio_array[bank]->edge;
|
||||
gpio_bank_saved[bank].both = gpio_array[bank]->both;
|
||||
gpio_bank_saved[bank].maska = gpio_array[bank]->maska;
|
||||
}
|
||||
|
||||
AWA_DUMMY_READ(maska);
|
||||
|
@ -770,27 +683,27 @@ void bfin_gpio_pm_hibernate_restore(void)
|
|||
int i, bank;
|
||||
|
||||
for (i = 0; i < MAX_BLACKFIN_GPIOS; i += GPIO_BANKSIZE) {
|
||||
bank = gpio_bank(i);
|
||||
bank = gpio_bank(i);
|
||||
|
||||
#if defined(BF527_FAMILY) || defined(BF537_FAMILY) || defined(BF518_FAMILY)
|
||||
#if defined(BF527_FAMILY) || defined(BF518_FAMILY)
|
||||
*port_mux[bank] = gpio_bank_saved[bank].mux;
|
||||
*port_mux[bank] = gpio_bank_saved[bank].mux;
|
||||
#else
|
||||
if (bank == 0)
|
||||
bfin_write_PORT_MUX(gpio_bank_saved[bank].mux);
|
||||
if (bank == 0)
|
||||
bfin_write_PORT_MUX(gpio_bank_saved[bank].mux);
|
||||
#endif
|
||||
*port_fer[bank] = gpio_bank_saved[bank].fer;
|
||||
*port_fer[bank] = gpio_bank_saved[bank].fer;
|
||||
#endif
|
||||
gpio_bankb[bank]->inen = gpio_bank_saved[bank].inen;
|
||||
gpio_bankb[bank]->dir = gpio_bank_saved[bank].dir;
|
||||
gpio_bankb[bank]->polar = gpio_bank_saved[bank].polar;
|
||||
gpio_bankb[bank]->edge = gpio_bank_saved[bank].edge;
|
||||
gpio_bankb[bank]->both = gpio_bank_saved[bank].both;
|
||||
gpio_array[bank]->inen = gpio_bank_saved[bank].inen;
|
||||
gpio_array[bank]->dir = gpio_bank_saved[bank].dir;
|
||||
gpio_array[bank]->polar = gpio_bank_saved[bank].polar;
|
||||
gpio_array[bank]->edge = gpio_bank_saved[bank].edge;
|
||||
gpio_array[bank]->both = gpio_bank_saved[bank].both;
|
||||
|
||||
gpio_bankb[bank]->data_set = gpio_bank_saved[bank].data
|
||||
| gpio_bank_saved[bank].dir;
|
||||
gpio_array[bank]->data_set = gpio_bank_saved[bank].data
|
||||
| gpio_bank_saved[bank].dir;
|
||||
|
||||
gpio_bankb[bank]->maska = gpio_bank_saved[bank].maska;
|
||||
gpio_array[bank]->maska = gpio_bank_saved[bank].maska;
|
||||
}
|
||||
AWA_DUMMY_READ(maska);
|
||||
}
|
||||
|
@ -817,12 +730,12 @@ void bfin_gpio_pm_hibernate_suspend(void)
|
|||
for (i = 0; i < MAX_BLACKFIN_GPIOS; i += GPIO_BANKSIZE) {
|
||||
bank = gpio_bank(i);
|
||||
|
||||
gpio_bank_saved[bank].fer = gpio_array[bank]->port_fer;
|
||||
gpio_bank_saved[bank].mux = gpio_array[bank]->port_mux;
|
||||
gpio_bank_saved[bank].data = gpio_array[bank]->port_data;
|
||||
gpio_bank_saved[bank].data = gpio_array[bank]->port_data;
|
||||
gpio_bank_saved[bank].inen = gpio_array[bank]->port_inen;
|
||||
gpio_bank_saved[bank].dir = gpio_array[bank]->port_dir_set;
|
||||
gpio_bank_saved[bank].fer = gpio_array[bank]->port_fer;
|
||||
gpio_bank_saved[bank].mux = gpio_array[bank]->port_mux;
|
||||
gpio_bank_saved[bank].data = gpio_array[bank]->data;
|
||||
gpio_bank_saved[bank].data = gpio_array[bank]->data;
|
||||
gpio_bank_saved[bank].inen = gpio_array[bank]->inen;
|
||||
gpio_bank_saved[bank].dir = gpio_array[bank]->dir_set;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -831,21 +744,21 @@ void bfin_gpio_pm_hibernate_restore(void)
|
|||
int i, bank;
|
||||
|
||||
for (i = 0; i < MAX_BLACKFIN_GPIOS; i += GPIO_BANKSIZE) {
|
||||
bank = gpio_bank(i);
|
||||
bank = gpio_bank(i);
|
||||
|
||||
gpio_array[bank]->port_mux = gpio_bank_saved[bank].mux;
|
||||
gpio_array[bank]->port_fer = gpio_bank_saved[bank].fer;
|
||||
gpio_array[bank]->port_inen = gpio_bank_saved[bank].inen;
|
||||
gpio_array[bank]->port_dir_set = gpio_bank_saved[bank].dir;
|
||||
gpio_array[bank]->port_set = gpio_bank_saved[bank].data
|
||||
| gpio_bank_saved[bank].dir;
|
||||
gpio_array[bank]->port_mux = gpio_bank_saved[bank].mux;
|
||||
gpio_array[bank]->port_fer = gpio_bank_saved[bank].fer;
|
||||
gpio_array[bank]->inen = gpio_bank_saved[bank].inen;
|
||||
gpio_array[bank]->dir_set = gpio_bank_saved[bank].dir;
|
||||
gpio_array[bank]->data_set = gpio_bank_saved[bank].data
|
||||
| gpio_bank_saved[bank].dir;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
unsigned short get_gpio_dir(unsigned gpio)
|
||||
{
|
||||
return (0x01 & (gpio_array[gpio_bank(gpio)]->port_dir_clear >> gpio_sub_n(gpio)));
|
||||
return (0x01 & (gpio_array[gpio_bank(gpio)]->dir_clear >> gpio_sub_n(gpio)));
|
||||
}
|
||||
EXPORT_SYMBOL(get_gpio_dir);
|
||||
|
||||
|
@ -905,9 +818,7 @@ int peripheral_request(unsigned short per, const char *label)
|
|||
*/
|
||||
|
||||
#ifdef BF548_FAMILY
|
||||
u16 funct = get_portmux(ident);
|
||||
|
||||
if (!((per & P_MAYSHARE) && (funct == P_FUNCT2MUX(per)))) {
|
||||
if (!((per & P_MAYSHARE) && get_portmux(per) == P_FUNCT2MUX(per))) {
|
||||
#else
|
||||
if (!(per & P_MAYSHARE)) {
|
||||
#endif
|
||||
|
@ -931,11 +842,7 @@ int peripheral_request(unsigned short per, const char *label)
|
|||
anyway:
|
||||
reserved_peri_map[gpio_bank(ident)] |= gpio_bit(ident);
|
||||
|
||||
#ifdef BF548_FAMILY
|
||||
portmux_setup(ident, P_FUNCT2MUX(per));
|
||||
#else
|
||||
portmux_setup(per, P_FUNCT2MUX(per));
|
||||
#endif
|
||||
portmux_setup(per);
|
||||
port_setup(ident, PERIPHERAL_USAGE);
|
||||
|
||||
local_irq_restore_hw(flags);
|
||||
|
@ -977,9 +884,6 @@ void peripheral_free(unsigned short per)
|
|||
if (!(per & P_DEFINED))
|
||||
return;
|
||||
|
||||
if (check_gpio(ident) < 0)
|
||||
return;
|
||||
|
||||
local_irq_save_hw(flags);
|
||||
|
||||
if (unlikely(!(reserved_peri_map[gpio_bank(ident)] & gpio_bit(ident)))) {
|
||||
|
@ -1056,9 +960,15 @@ int bfin_gpio_request(unsigned gpio, const char *label)
|
|||
local_irq_restore_hw(flags);
|
||||
return -EBUSY;
|
||||
}
|
||||
if (unlikely(reserved_gpio_irq_map[gpio_bank(gpio)] & gpio_bit(gpio)))
|
||||
if (unlikely(reserved_gpio_irq_map[gpio_bank(gpio)] & gpio_bit(gpio))) {
|
||||
printk(KERN_NOTICE "bfin-gpio: GPIO %d is already reserved as gpio-irq!"
|
||||
" (Documentation/blackfin/bfin-gpio-notes.txt)\n", gpio);
|
||||
}
|
||||
#ifndef BF548_FAMILY
|
||||
else { /* Reset POLAR setting when acquiring a gpio for the first time */
|
||||
set_gpio_polar(gpio, 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
reserved_gpio_map[gpio_bank(gpio)] |= gpio_bit(gpio);
|
||||
set_label(gpio, label);
|
||||
|
@ -1078,6 +988,8 @@ void bfin_gpio_free(unsigned gpio)
|
|||
if (check_gpio(gpio) < 0)
|
||||
return;
|
||||
|
||||
might_sleep();
|
||||
|
||||
local_irq_save_hw(flags);
|
||||
|
||||
if (unlikely(!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio)))) {
|
||||
|
@ -1158,92 +1070,15 @@ void bfin_gpio_irq_free(unsigned gpio)
|
|||
local_irq_restore_hw(flags);
|
||||
}
|
||||
|
||||
|
||||
static inline void __bfin_gpio_direction_input(unsigned gpio)
|
||||
{
|
||||
#ifdef BF548_FAMILY
|
||||
int bfin_gpio_direction_input(unsigned gpio)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio))) {
|
||||
gpio_error(gpio);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
local_irq_save_hw(flags);
|
||||
gpio_array[gpio_bank(gpio)]->port_dir_clear = gpio_bit(gpio);
|
||||
gpio_array[gpio_bank(gpio)]->port_inen |= gpio_bit(gpio);
|
||||
local_irq_restore_hw(flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(bfin_gpio_direction_input);
|
||||
|
||||
int bfin_gpio_direction_output(unsigned gpio, int value)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio))) {
|
||||
gpio_error(gpio);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
local_irq_save_hw(flags);
|
||||
gpio_array[gpio_bank(gpio)]->port_inen &= ~gpio_bit(gpio);
|
||||
gpio_set_value(gpio, value);
|
||||
gpio_array[gpio_bank(gpio)]->port_dir_set = gpio_bit(gpio);
|
||||
local_irq_restore_hw(flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(bfin_gpio_direction_output);
|
||||
|
||||
void bfin_gpio_set_value(unsigned gpio, int arg)
|
||||
{
|
||||
if (arg)
|
||||
gpio_array[gpio_bank(gpio)]->port_set = gpio_bit(gpio);
|
||||
else
|
||||
gpio_array[gpio_bank(gpio)]->port_clear = gpio_bit(gpio);
|
||||
}
|
||||
EXPORT_SYMBOL(bfin_gpio_set_value);
|
||||
|
||||
int bfin_gpio_get_value(unsigned gpio)
|
||||
{
|
||||
return (1 & (gpio_array[gpio_bank(gpio)]->port_data >> gpio_sub_n(gpio)));
|
||||
}
|
||||
EXPORT_SYMBOL(bfin_gpio_get_value);
|
||||
|
||||
void bfin_gpio_irq_prepare(unsigned gpio)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
port_setup(gpio, GPIO_USAGE);
|
||||
|
||||
local_irq_save_hw(flags);
|
||||
gpio_array[gpio_bank(gpio)]->port_dir_clear = gpio_bit(gpio);
|
||||
gpio_array[gpio_bank(gpio)]->port_inen |= gpio_bit(gpio);
|
||||
local_irq_restore_hw(flags);
|
||||
}
|
||||
|
||||
gpio_array[gpio_bank(gpio)]->dir_clear = gpio_bit(gpio);
|
||||
#else
|
||||
|
||||
int bfin_gpio_get_value(unsigned gpio)
|
||||
{
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
if (unlikely(get_gpio_edge(gpio))) {
|
||||
local_irq_save_hw(flags);
|
||||
set_gpio_edge(gpio, 0);
|
||||
ret = get_gpio_data(gpio);
|
||||
set_gpio_edge(gpio, 1);
|
||||
local_irq_restore_hw(flags);
|
||||
|
||||
return ret;
|
||||
} else
|
||||
return get_gpio_data(gpio);
|
||||
gpio_array[gpio_bank(gpio)]->dir &= ~gpio_bit(gpio);
|
||||
#endif
|
||||
gpio_array[gpio_bank(gpio)]->inen |= gpio_bit(gpio);
|
||||
}
|
||||
EXPORT_SYMBOL(bfin_gpio_get_value);
|
||||
|
||||
|
||||
int bfin_gpio_direction_input(unsigned gpio)
|
||||
{
|
||||
|
@ -1255,8 +1090,7 @@ int bfin_gpio_direction_input(unsigned gpio)
|
|||
}
|
||||
|
||||
local_irq_save_hw(flags);
|
||||
gpio_bankb[gpio_bank(gpio)]->dir &= ~gpio_bit(gpio);
|
||||
gpio_bankb[gpio_bank(gpio)]->inen |= gpio_bit(gpio);
|
||||
__bfin_gpio_direction_input(gpio);
|
||||
AWA_DUMMY_READ(inen);
|
||||
local_irq_restore_hw(flags);
|
||||
|
||||
|
@ -1264,6 +1098,30 @@ int bfin_gpio_direction_input(unsigned gpio)
|
|||
}
|
||||
EXPORT_SYMBOL(bfin_gpio_direction_input);
|
||||
|
||||
void bfin_gpio_irq_prepare(unsigned gpio)
|
||||
{
|
||||
#ifdef BF548_FAMILY
|
||||
unsigned long flags;
|
||||
#endif
|
||||
|
||||
port_setup(gpio, GPIO_USAGE);
|
||||
|
||||
#ifdef BF548_FAMILY
|
||||
local_irq_save_hw(flags);
|
||||
__bfin_gpio_direction_input(gpio);
|
||||
local_irq_restore_hw(flags);
|
||||
#endif
|
||||
}
|
||||
|
||||
void bfin_gpio_set_value(unsigned gpio, int arg)
|
||||
{
|
||||
if (arg)
|
||||
gpio_array[gpio_bank(gpio)]->data_set = gpio_bit(gpio);
|
||||
else
|
||||
gpio_array[gpio_bank(gpio)]->data_clear = gpio_bit(gpio);
|
||||
}
|
||||
EXPORT_SYMBOL(bfin_gpio_set_value);
|
||||
|
||||
int bfin_gpio_direction_output(unsigned gpio, int value)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
@ -1274,14 +1132,15 @@ int bfin_gpio_direction_output(unsigned gpio, int value)
|
|||
}
|
||||
|
||||
local_irq_save_hw(flags);
|
||||
gpio_bankb[gpio_bank(gpio)]->inen &= ~gpio_bit(gpio);
|
||||
|
||||
if (value)
|
||||
gpio_bankb[gpio_bank(gpio)]->data_set = gpio_bit(gpio);
|
||||
else
|
||||
gpio_bankb[gpio_bank(gpio)]->data_clear = gpio_bit(gpio);
|
||||
gpio_array[gpio_bank(gpio)]->inen &= ~gpio_bit(gpio);
|
||||
gpio_set_value(gpio, value);
|
||||
#ifdef BF548_FAMILY
|
||||
gpio_array[gpio_bank(gpio)]->dir_set = gpio_bit(gpio);
|
||||
#else
|
||||
gpio_array[gpio_bank(gpio)]->dir |= gpio_bit(gpio);
|
||||
#endif
|
||||
|
||||
gpio_bankb[gpio_bank(gpio)]->dir |= gpio_bit(gpio);
|
||||
AWA_DUMMY_READ(dir);
|
||||
local_irq_restore_hw(flags);
|
||||
|
||||
|
@ -1289,6 +1148,27 @@ int bfin_gpio_direction_output(unsigned gpio, int value)
|
|||
}
|
||||
EXPORT_SYMBOL(bfin_gpio_direction_output);
|
||||
|
||||
int bfin_gpio_get_value(unsigned gpio)
|
||||
{
|
||||
#ifdef BF548_FAMILY
|
||||
return (1 & (gpio_array[gpio_bank(gpio)]->data >> gpio_sub_n(gpio)));
|
||||
#else
|
||||
unsigned long flags;
|
||||
|
||||
if (unlikely(get_gpio_edge(gpio))) {
|
||||
int ret;
|
||||
local_irq_save_hw(flags);
|
||||
set_gpio_edge(gpio, 0);
|
||||
ret = get_gpio_data(gpio);
|
||||
set_gpio_edge(gpio, 1);
|
||||
local_irq_restore_hw(flags);
|
||||
return ret;
|
||||
} else
|
||||
return get_gpio_data(gpio);
|
||||
#endif
|
||||
}
|
||||
EXPORT_SYMBOL(bfin_gpio_get_value);
|
||||
|
||||
/* If we are booting from SPI and our board lacks a strong enough pull up,
|
||||
* the core can reset and execute the bootrom faster than the resistor can
|
||||
* pull the signal logically high. To work around this (common) error in
|
||||
|
@ -1299,23 +1179,15 @@ EXPORT_SYMBOL(bfin_gpio_direction_output);
|
|||
* lives here as we need to force all the GPIO states w/out going through
|
||||
* BUG() checks and such.
|
||||
*/
|
||||
void bfin_gpio_reset_spi0_ssel1(void)
|
||||
void bfin_reset_boot_spi_cs(unsigned short pin)
|
||||
{
|
||||
u16 gpio = P_IDENT(P_SPI0_SSEL1);
|
||||
|
||||
unsigned short gpio = P_IDENT(pin);
|
||||
port_setup(gpio, GPIO_USAGE);
|
||||
gpio_bankb[gpio_bank(gpio)]->data_set = gpio_bit(gpio);
|
||||
gpio_array[gpio_bank(gpio)]->data_set = gpio_bit(gpio);
|
||||
AWA_DUMMY_READ(data_set);
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
void bfin_gpio_irq_prepare(unsigned gpio)
|
||||
{
|
||||
port_setup(gpio, GPIO_USAGE);
|
||||
}
|
||||
|
||||
#endif /*BF548_FAMILY */
|
||||
|
||||
#if defined(CONFIG_PROC_FS)
|
||||
static int gpio_proc_read(char *buf, char **start, off_t offset,
|
||||
int len, int *unused_i, void *unused_v)
|
||||
|
@ -1369,11 +1241,7 @@ int bfin_gpiolib_get_value(struct gpio_chip *chip, unsigned gpio)
|
|||
|
||||
void bfin_gpiolib_set_value(struct gpio_chip *chip, unsigned gpio, int value)
|
||||
{
|
||||
#ifdef BF548_FAMILY
|
||||
return bfin_gpio_set_value(gpio, value);
|
||||
#else
|
||||
return set_gpio_data(gpio, value);
|
||||
#endif
|
||||
}
|
||||
|
||||
int bfin_gpiolib_gpio_request(struct gpio_chip *chip, unsigned gpio)
|
||||
|
|
|
@ -63,10 +63,8 @@ void __init generate_cplb_tables_cpu(unsigned int cpu)
|
|||
dcplb_tbl[cpu][i_d].addr = 0;
|
||||
dcplb_tbl[cpu][i_d++].data = SDRAM_OOPS | PAGE_SIZE_1KB;
|
||||
|
||||
#if 0
|
||||
icplb_tbl[cpu][i_i].addr = 0;
|
||||
icplb_tbl[cpu][i_i++].data = i_cache | CPLB_USER_RD | PAGE_SIZE_4KB;
|
||||
#endif
|
||||
icplb_tbl[cpu][i_i++].data = i_cache | CPLB_USER_RD | PAGE_SIZE_1KB;
|
||||
|
||||
/* Cover kernel memory with 4M pages. */
|
||||
addr = 0;
|
||||
|
|
|
@ -163,12 +163,14 @@ MGR_ATTR static int icplb_miss(int cpu)
|
|||
nr_icplb_supv_miss[cpu]++;
|
||||
|
||||
base = 0;
|
||||
for (idx = 0; idx < icplb_nr_bounds; idx++) {
|
||||
idx = 0;
|
||||
do {
|
||||
eaddr = icplb_bounds[idx].eaddr;
|
||||
if (addr < eaddr)
|
||||
break;
|
||||
base = eaddr;
|
||||
}
|
||||
} while (++idx < icplb_nr_bounds);
|
||||
|
||||
if (unlikely(idx == icplb_nr_bounds))
|
||||
return CPLB_NO_ADDR_MATCH;
|
||||
|
||||
|
@ -208,12 +210,14 @@ MGR_ATTR static int dcplb_miss(int cpu)
|
|||
nr_dcplb_supv_miss[cpu]++;
|
||||
|
||||
base = 0;
|
||||
for (idx = 0; idx < dcplb_nr_bounds; idx++) {
|
||||
idx = 0;
|
||||
do {
|
||||
eaddr = dcplb_bounds[idx].eaddr;
|
||||
if (addr < eaddr)
|
||||
break;
|
||||
base = eaddr;
|
||||
}
|
||||
} while (++idx < dcplb_nr_bounds);
|
||||
|
||||
if (unlikely(idx == dcplb_nr_bounds))
|
||||
return CPLB_NO_ADDR_MATCH;
|
||||
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <asm/trace.h>
|
||||
#include <asm/pda.h>
|
||||
|
||||
static atomic_t irq_err_count;
|
||||
static spinlock_t irq_controller_lock;
|
||||
|
@ -91,8 +92,13 @@ int show_interrupts(struct seq_file *p, void *v)
|
|||
seq_putc(p, '\n');
|
||||
skip:
|
||||
spin_unlock_irqrestore(&irq_desc[i].lock, flags);
|
||||
} else if (i == NR_IRQS)
|
||||
} else if (i == NR_IRQS) {
|
||||
seq_printf(p, "NMI: ");
|
||||
for_each_online_cpu(j)
|
||||
seq_printf(p, "%10u ", cpu_pda[j].__nmi_count);
|
||||
seq_printf(p, " CORE Non Maskable Interrupt\n");
|
||||
seq_printf(p, "Err: %10u\n", atomic_read(&irq_err_count));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue