Merge with rsync://fileserver/linux
This commit is contained in:
commit
a98a5d04f4
|
@ -13,14 +13,17 @@ different way: With the help of a dvb-usb-framework.
|
|||
The framework provides generic functions (mostly kernel API calls), such as:
|
||||
|
||||
- Transport Stream URB handling in conjunction with dvb-demux-feed-control
|
||||
(bulk and isoc (TODO) are supported)
|
||||
(bulk and isoc are supported)
|
||||
- registering the device for the DVB-API
|
||||
- registering an I2C-adapter if applicable
|
||||
- remote-control/input-device handling
|
||||
- firmware requesting and loading (currently just for the Cypress USB
|
||||
controller)
|
||||
controllers)
|
||||
- other functions/methods which can be shared by several drivers (such as
|
||||
functions for bulk-control-commands)
|
||||
- TODO: a I2C-chunker. It creates device-specific chunks of register-accesses
|
||||
depending on length of a register and the number of values that can be
|
||||
multi-written and multi-read.
|
||||
|
||||
The source code of the particular DVB USB devices does just the communication
|
||||
with the device via the bus. The connection between the DVB-API-functionality
|
||||
|
@ -36,93 +39,18 @@ the dvb-usb-lib.
|
|||
TODO: dynamic enabling and disabling of the pid-filter in regard to number of
|
||||
feeds requested.
|
||||
|
||||
Supported devices USB1.1
|
||||
Supported devices
|
||||
========================
|
||||
|
||||
Produced and reselled by Twinhan:
|
||||
---------------------------------
|
||||
- TwinhanDTV USB-Ter DVB-T Device (VP7041)
|
||||
http://www.twinhan.com/product_terrestrial_3.asp
|
||||
See the LinuxTV DVB Wiki at www.linuxtv.org for a complete list of
|
||||
cards/drivers/firmwares:
|
||||
|
||||
- TwinhanDTV Magic Box (VP7041e)
|
||||
http://www.twinhan.com/product_terrestrial_4.asp
|
||||
|
||||
- HAMA DVB-T USB device
|
||||
http://www.hama.de/portal/articleId*110620/action*2598
|
||||
|
||||
- CTS Portable (Chinese Television System) (2)
|
||||
http://www.2cts.tv/ctsportable/
|
||||
|
||||
- Unknown USB DVB-T device with vendor ID Hyper-Paltek
|
||||
|
||||
|
||||
Produced and reselled by KWorld:
|
||||
--------------------------------
|
||||
- KWorld V-Stream XPERT DTV DVB-T USB
|
||||
http://www.kworld.com.tw/en/product/DVBT-USB/DVBT-USB.html
|
||||
|
||||
- JetWay DTV DVB-T USB
|
||||
http://www.jetway.com.tw/evisn/product/lcd-tv/DVT-USB/dtv-usb.htm
|
||||
|
||||
- ADSTech Instant TV DVB-T USB
|
||||
http://www.adstech.com/products/PTV-333/intro/PTV-333_intro.asp?pid=PTV-333
|
||||
|
||||
|
||||
Others:
|
||||
-------
|
||||
- Ultima Electronic/Artec T1 USB TVBOX (AN2135, AN2235, AN2235 with Panasonic Tuner)
|
||||
http://82.161.246.249/products-tvbox.html
|
||||
|
||||
- Compro Videomate DVB-U2000 - DVB-T USB (2)
|
||||
http://www.comprousa.com/products/vmu2000.htm
|
||||
|
||||
- Grandtec USB DVB-T
|
||||
http://www.grand.com.tw/
|
||||
|
||||
- AVerMedia AverTV DVBT USB
|
||||
http://www.avermedia.com/
|
||||
|
||||
- DiBcom USB DVB-T reference device (non-public)
|
||||
|
||||
|
||||
Supported devices USB2.0-only
|
||||
=============================
|
||||
- Twinhan MagicBox II
|
||||
http://www.twinhan.com/product_terrestrial_7.asp
|
||||
|
||||
- TwinhanDTV Alpha
|
||||
http://www.twinhan.com/product_terrestrial_8.asp
|
||||
|
||||
- DigitalNow TinyUSB 2 DVB-t Receiver
|
||||
http://www.digitalnow.com.au/DigitalNow%20tinyUSB2%20Specifications.html
|
||||
|
||||
- Hanftek UMT-010
|
||||
http://www.globalsources.com/si/6008819757082/ProductDetail/Digital-TV/product_id-100046529
|
||||
|
||||
|
||||
Supported devices USB2.0 and USB1.1
|
||||
=============================
|
||||
- Typhoon/Yakumo/HAMA/Yuan DVB-T mobile USB2.0
|
||||
http://www.yakumo.de/produkte/index.php?pid=1&ag=DVB-T
|
||||
http://www.yuan.com.tw/en/products/vdo_ub300.html
|
||||
http://www.hama.de/portal/articleId*114663/action*2563
|
||||
http://www.anubisline.com/english/articlec.asp?id=50502&catid=002
|
||||
|
||||
- Artec T1 USB TVBOX (FX2) (2)
|
||||
|
||||
- Hauppauge WinTV NOVA-T USB2
|
||||
http://www.hauppauge.com/
|
||||
|
||||
- KWorld/ADSTech Instant DVB-T USB2.0 (DiB3000M-B)
|
||||
|
||||
- DiBcom USB2.0 DVB-T reference device (non-public)
|
||||
|
||||
- AVerMedia AverTV A800 DVB-T USB2.0
|
||||
|
||||
1) It is working almost - work-in-progress.
|
||||
2) No test reports received yet.
|
||||
http://www.linuxtv.org/wiki/index.php/DVB_USB
|
||||
|
||||
0. History & News:
|
||||
2005-06-30 - added support for WideView WT-220U (Thanks to Steve Chang)
|
||||
2005-05-30 - added basic isochronous support to the dvb-usb-framework
|
||||
added support for Conexant Hybrid reference design and Nebula DigiTV USB
|
||||
2005-04-17 - all dibusb devices ported to make use of the dvb-usb-framework
|
||||
2005-04-02 - re-enabled and improved remote control code.
|
||||
2005-03-31 - ported the Yakumo/Hama/Typhoon DVB-T USB2.0 device to dvb-usb.
|
||||
|
@ -137,7 +65,7 @@ Supported devices USB2.0 and USB1.1
|
|||
2005-01-31 - distorted streaming is gone for USB1.1 devices
|
||||
2005-01-13 - moved the mirrored pid_filter_table back to dvb-dibusb
|
||||
- first almost working version for HanfTek UMT-010
|
||||
- found out, that Yakumo/HAMA/Typhoon are predessors of the HanfTek UMT-010
|
||||
- found out, that Yakumo/HAMA/Typhoon are predecessors of the HanfTek UMT-010
|
||||
2005-01-10 - refactoring completed, now everything is very delightful
|
||||
- tuner quirks for some weird devices (Artec T1 AN2235 device has sometimes a
|
||||
Panasonic Tuner assembled). Tunerprobing implemented. Thanks a lot to Gunnar Wittich.
|
||||
|
@ -187,25 +115,13 @@ Supported devices USB2.0 and USB1.1
|
|||
1. How to use?
|
||||
1.1. Firmware
|
||||
|
||||
Most of the USB drivers need to download a firmware to start working.
|
||||
Most of the USB drivers need to download a firmware to the device before start
|
||||
working.
|
||||
|
||||
for USB1.1 (AN2135) you need: dvb-usb-dibusb-5.0.0.11.fw
|
||||
for USB2.0 HanfTek: dvb-usb-umt-010-02.fw
|
||||
for USB2.0 DiBcom: dvb-usb-dibusb-6.0.0.8.fw
|
||||
for USB2.0 AVerMedia AverTV DVB-T USB2: dvb-usb-avertv-a800-01.fw
|
||||
for USB2.0 TwinhanDTV Alpha/MagicBox II: dvb-usb-vp7045-01.fw
|
||||
Have a look at the Wikipage for the DVB-USB-drivers to find out, which firmware
|
||||
you need for your device:
|
||||
|
||||
The files can be found on http://www.linuxtv.org/download/firmware/ .
|
||||
|
||||
We do not have the permission (yet) to publish the following firmware-files.
|
||||
You'll need to extract them from the windows drivers.
|
||||
|
||||
You should be able to use "get_dvb_firmware dvb-usb" to get the firmware:
|
||||
|
||||
for USB1.1 (AN2235) (a few Artec T1 devices): dvb-usb-dibusb-an2235-01.fw
|
||||
for USB2.0 Hauppauge: dvb-usb-nova-t-usb2-01.fw
|
||||
for USB2.0 ADSTech/Kworld USB2.0: dvb-usb-adstech-usb2-01.fw
|
||||
for USB2.0 Yakumo/Typhoon/Hama: dvb-usb-dtt200u-01.fw
|
||||
http://www.linuxtv.org/wiki/index.php/DVB_USB
|
||||
|
||||
1.2. Compiling
|
||||
|
||||
|
@ -289,6 +205,9 @@ Patches, comments and suggestions are very very welcome.
|
|||
Gunnar Wittich and Joachim von Caron for their trust for providing
|
||||
root-shells on their machines to implement support for new devices.
|
||||
|
||||
Allan Third and Michael Hutchinson for their help to write the Nebula
|
||||
digitv-driver.
|
||||
|
||||
Glen Harris for bringing up, that there is a new dibusb-device and Jiun-Kuei
|
||||
Jung from AVerMedia who kindly provided a special firmware to get the device
|
||||
up and running in Linux.
|
||||
|
@ -296,7 +215,12 @@ Patches, comments and suggestions are very very welcome.
|
|||
Jennifer Chen, Jeff and Jack from Twinhan for kindly supporting by
|
||||
writing the vp7045-driver.
|
||||
|
||||
Some guys on the linux-dvb mailing list for encouraging me
|
||||
Steve Chang from WideView for providing information for new devices and
|
||||
firmware files.
|
||||
|
||||
Michael Paxton for submitting remote control keymaps.
|
||||
|
||||
Some guys on the linux-dvb mailing list for encouraging me.
|
||||
|
||||
Peter Schildmann >peter.schildmann-nospam-at-web.de< for his
|
||||
user-level firmware loader, which saves a lot of time
|
||||
|
@ -305,4 +229,4 @@ Patches, comments and suggestions are very very welcome.
|
|||
Ulf Hermenau for helping me out with traditional chinese.
|
||||
|
||||
André Smoktun and Christian Frömmel for supporting me with
|
||||
hardware and listening to my problems very patient.
|
||||
hardware and listening to my problems very patiently.
|
||||
|
|
|
@ -1,66 +1,55 @@
|
|||
How to get the Nebula, PCTV and Twinhan DST cards working
|
||||
=========================================================
|
||||
How to get the Nebula Electronics DigiTV, Pinnacle PCTV Sat, Twinhan DST + clones working
|
||||
=========================================================================================
|
||||
|
||||
This class of cards has a bt878a as the PCI interface, and
|
||||
require the bttv driver.
|
||||
1) General information
|
||||
======================
|
||||
|
||||
Please pay close attention to the warning about the bttv module
|
||||
options below for the DST card.
|
||||
This class of cards has a bt878a chip as the PCI interface.
|
||||
The different card drivers require the bttv driver to provide the means
|
||||
to access the i2c bus and the gpio pins of the bt8xx chipset.
|
||||
|
||||
1) General informations
|
||||
=======================
|
||||
2) Compilation rules for Kernel >= 2.6.12
|
||||
=========================================
|
||||
|
||||
These drivers require the bttv driver to provide the means to access
|
||||
the i2c bus and the gpio pins of the bt8xx chipset.
|
||||
Enable the following options:
|
||||
|
||||
Because of this, you need to enable
|
||||
"Device drivers" => "Multimedia devices"
|
||||
=> "Video For Linux" => "BT848 Video For Linux"
|
||||
|
||||
Furthermore you need to enable
|
||||
"Device drivers" => "Multimedia devices" => "Digital Video Broadcasting Devices"
|
||||
=> "DVB for Linux" "DVB Core Support" "Nebula/Pinnacle PCTV/TwinHan PCI Cards"
|
||||
|
||||
2) Loading Modules
|
||||
==================
|
||||
3) Loading Modules, described by two approaches
|
||||
===============================================
|
||||
|
||||
In general you need to load the bttv driver, which will handle the gpio and
|
||||
i2c communication for us, plus the common dvb-bt8xx device driver.
|
||||
The frontends for Nebula (nxt6000), Pinnacle PCTV (cx24110) and
|
||||
TwinHan (dst) are loaded automatically by the dvb-bt8xx device driver.
|
||||
i2c communication for us, plus the common dvb-bt8xx device driver,
|
||||
which is called the backend.
|
||||
The frontends for Nebula DigiTV (nxt6000), Pinnacle PCTV Sat (cx24110),
|
||||
TwinHan DST + clones (dst and dst-ca) are loaded automatically by the backend.
|
||||
For further details about TwinHan DST + clones see /Documentation/dvb/ci.txt.
|
||||
|
||||
3a) Nebula / Pinnacle PCTV
|
||||
3a) The manual approach
|
||||
-----------------------
|
||||
|
||||
Loading modules:
|
||||
modprobe bttv
|
||||
modprobe dvb-bt8xx
|
||||
|
||||
Unloading modules:
|
||||
modprobe -r dvb-bt8xx
|
||||
modprobe -r bttv
|
||||
|
||||
3b) The automatic approach
|
||||
--------------------------
|
||||
|
||||
$ modprobe bttv (normally bttv is being loaded automatically by kmod)
|
||||
$ modprobe dvb-bt8xx (or just place dvb-bt8xx in /etc/modules for automatic loading)
|
||||
If not already done by installation, place a line either in
|
||||
/etc/modules.conf or in /etc/modprobe.conf containing this text:
|
||||
alias char-major-81 bttv
|
||||
|
||||
Then place a line in /etc/modules containing this text:
|
||||
dvb-bt8xx
|
||||
|
||||
3b) TwinHan and Clones
|
||||
--------------------------
|
||||
|
||||
$ modprobe bttv i2c_hw=1 card=0x71
|
||||
$ modprobe dvb-bt8xx
|
||||
$ modprobe dst
|
||||
|
||||
The value 0x71 will override the PCI type detection for dvb-bt8xx,
|
||||
which is necessary for TwinHan cards.
|
||||
|
||||
If you're having an older card (blue color circuit) and card=0x71 locks
|
||||
your machine, try using 0x68, too. If that does not work, ask on the
|
||||
mailing list.
|
||||
|
||||
The DST module takes a couple of useful parameters:
|
||||
|
||||
a. verbose takes values 0 to 5. These values control the verbosity level.
|
||||
b. debug takes values 0 and 1. You can either disable or enable debugging.
|
||||
c. dst_addons takes values 0 and 0x20:
|
||||
- A value of 0 means it is a FTA card.
|
||||
- A value of 0x20 means it has a Conditional Access slot.
|
||||
|
||||
The autodetected values are determined by the "response string"
|
||||
of the card, which you can see in your logs:
|
||||
e.g.: dst_get_device_id: Recognize [DSTMCI]
|
||||
Reboot your system and have fun!
|
||||
|
||||
--
|
||||
Authors: Richard Walker, Jamie Honan, Michael Hunold, Manu Abraham, Uwe Bugla
|
||||
|
|
|
@ -119,3 +119,19 @@ Why: Match the other drivers' name for the same function, duplicate names
|
|||
will be available until removal of old names.
|
||||
Who: Grant Coady <gcoady@gmail.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: PCMCIA control ioctl (needed for pcmcia-cs [cardmgr, cardctl])
|
||||
When: November 2005
|
||||
Files: drivers/pcmcia/: pcmcia_ioctl.c
|
||||
Why: With the 16-bit PCMCIA subsystem now behaving (almost) like a
|
||||
normal hotpluggable bus, and with it using the default kernel
|
||||
infrastructure (hotplug, driver core, sysfs) keeping the PCMCIA
|
||||
control ioctl needed by cardmgr and cardctl from pcmcia-cs is
|
||||
unnecessary, and makes further cleanups and integration of the
|
||||
PCMCIA subsystem into the Linux kernel device driver model more
|
||||
difficult. The features provided by cardmgr and cardctl are either
|
||||
handled by the kernel itself now or are available in the new
|
||||
pcmciautils package available at
|
||||
http://kernel.org/pub/linux/utils/kernel/pcmcia/
|
||||
Who: Dominik Brodowski <linux@brodo.de>
|
||||
|
|
|
@ -0,0 +1,69 @@
|
|||
USERSPACE VERBS ACCESS
|
||||
|
||||
The ib_uverbs module, built by enabling CONFIG_INFINIBAND_USER_VERBS,
|
||||
enables direct userspace access to IB hardware via "verbs," as
|
||||
described in chapter 11 of the InfiniBand Architecture Specification.
|
||||
|
||||
To use the verbs, the libibverbs library, available from
|
||||
<http://openib.org/>, is required. libibverbs contains a
|
||||
device-independent API for using the ib_uverbs interface.
|
||||
libibverbs also requires appropriate device-dependent kernel and
|
||||
userspace driver for your InfiniBand hardware. For example, to use
|
||||
a Mellanox HCA, you will need the ib_mthca kernel module and the
|
||||
libmthca userspace driver be installed.
|
||||
|
||||
User-kernel communication
|
||||
|
||||
Userspace communicates with the kernel for slow path, resource
|
||||
management operations via the /dev/infiniband/uverbsN character
|
||||
devices. Fast path operations are typically performed by writing
|
||||
directly to hardware registers mmap()ed into userspace, with no
|
||||
system call or context switch into the kernel.
|
||||
|
||||
Commands are sent to the kernel via write()s on these device files.
|
||||
The ABI is defined in drivers/infiniband/include/ib_user_verbs.h.
|
||||
The structs for commands that require a response from the kernel
|
||||
contain a 64-bit field used to pass a pointer to an output buffer.
|
||||
Status is returned to userspace as the return value of the write()
|
||||
system call.
|
||||
|
||||
Resource management
|
||||
|
||||
Since creation and destruction of all IB resources is done by
|
||||
commands passed through a file descriptor, the kernel can keep track
|
||||
of which resources are attached to a given userspace context. The
|
||||
ib_uverbs module maintains idr tables that are used to translate
|
||||
between kernel pointers and opaque userspace handles, so that kernel
|
||||
pointers are never exposed to userspace and userspace cannot trick
|
||||
the kernel into following a bogus pointer.
|
||||
|
||||
This also allows the kernel to clean up when a process exits and
|
||||
prevent one process from touching another process's resources.
|
||||
|
||||
Memory pinning
|
||||
|
||||
Direct userspace I/O requires that memory regions that are potential
|
||||
I/O targets be kept resident at the same physical address. The
|
||||
ib_uverbs module manages pinning and unpinning memory regions via
|
||||
get_user_pages() and put_page() calls. It also accounts for the
|
||||
amount of memory pinned in the process's locked_vm, and checks that
|
||||
unprivileged processes do not exceed their RLIMIT_MEMLOCK limit.
|
||||
|
||||
Pages that are pinned multiple times are counted each time they are
|
||||
pinned, so the value of locked_vm may be an overestimate of the
|
||||
number of pages pinned by a process.
|
||||
|
||||
/dev files
|
||||
|
||||
To create the appropriate character device files automatically with
|
||||
udev, a rule like
|
||||
|
||||
KERNEL="uverbs*", NAME="infiniband/%k"
|
||||
|
||||
can be used. This will create device nodes named
|
||||
|
||||
/dev/infiniband/uverbs0
|
||||
|
||||
and so on. Since the InfiniBand userspace verbs should be safe for
|
||||
use by non-privileged processes, it may be useful to add an
|
||||
appropriate MODE or GROUP to the udev rule.
|
|
@ -758,6 +758,9 @@ running once the system is up.
|
|||
maxcpus= [SMP] Maximum number of processors that an SMP kernel
|
||||
should make use of
|
||||
|
||||
max_addr=[KMG] [KNL,BOOT,ia64] All physical memory greater than or
|
||||
equal to this physical address is ignored.
|
||||
|
||||
max_luns= [SCSI] Maximum number of LUNs to probe
|
||||
Should be between 1 and 2^32-1.
|
||||
|
||||
|
|
|
@ -117,6 +117,7 @@ IBM Thinkpad X40 Type 2371-7JG s3_bios,s3_mode (4)
|
|||
Medion MD4220 ??? (*)
|
||||
Samsung P35 vbetool needed (6)
|
||||
Sharp PC-AR10 (ATI rage) none (1)
|
||||
Sony Vaio PCG-C1VRX/K s3_bios (2)
|
||||
Sony Vaio PCG-F403 ??? (*)
|
||||
Sony Vaio PCG-N505SN ??? (*)
|
||||
Sony Vaio vgn-s260 X or boot-radeon can init it (5)
|
||||
|
|
|
@ -370,6 +370,10 @@ W: http://www.thekelleys.org.uk/atmel
|
|||
W: http://atmelwlandriver.sourceforge.net/
|
||||
S: Maintained
|
||||
|
||||
AUDIT SUBSYSTEM
|
||||
L: linux-audit@redhat.com (subscribers-only)
|
||||
S: Maintained
|
||||
|
||||
AX.25 NETWORK LAYER
|
||||
P: Ralf Baechle
|
||||
M: ralf@linux-mips.org
|
||||
|
@ -1803,8 +1807,9 @@ M: greg@kroah.com
|
|||
S: Maintained
|
||||
|
||||
PCMCIA SUBSYSTEM
|
||||
P: Linux PCMCIA Team
|
||||
L: http://lists.infradead.org/mailman/listinfo/linux-pcmcia
|
||||
S: Unmaintained
|
||||
S: Maintained
|
||||
|
||||
PCNET32 NETWORK DRIVER
|
||||
P: Thomas Bogendörfer
|
||||
|
@ -2161,7 +2166,7 @@ UltraSPARC (sparc64):
|
|||
P: David S. Miller
|
||||
M: davem@davemloft.net
|
||||
P: Eddie C. Dost
|
||||
M: ecd@skynet.be
|
||||
M: ecd@brainaid.de
|
||||
P: Jakub Jelinek
|
||||
M: jj@sunsite.ms.mff.cuni.cz
|
||||
P: Anton Blanchard
|
||||
|
|
6
Makefile
6
Makefile
|
@ -792,6 +792,9 @@ export CPPFLAGS_vmlinux.lds += -P -C -U$(ARCH)
|
|||
$(Q)$(MAKE) $(build)=$(@D) $@
|
||||
%.o: %.c scripts FORCE
|
||||
$(Q)$(MAKE) $(build)=$(@D) $@
|
||||
%.ko: scripts FORCE
|
||||
$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) $(build)=$(@D) $(@:.ko=.o)
|
||||
$(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost
|
||||
%/: scripts prepare FORCE
|
||||
$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) $(build)=$(@D)
|
||||
%.lst: %.c scripts FORCE
|
||||
|
@ -1033,6 +1036,7 @@ help:
|
|||
@echo ' modules_install - Install all modules'
|
||||
@echo ' dir/ - Build all files in dir and below'
|
||||
@echo ' dir/file.[ois] - Build specified target only'
|
||||
@echo ' dir/file.ko - Build module including final link'
|
||||
@echo ' rpm - Build a kernel as an RPM package'
|
||||
@echo ' tags/TAGS - Generate tags file for editors'
|
||||
@echo ' cscope - Generate cscope index'
|
||||
|
@ -1149,7 +1153,7 @@ endif # KBUILD_EXTMOD
|
|||
#(which is the most common case IMHO) to avoid unneeded clutter in the big tags file.
|
||||
#Adding $(srctree) adds about 20M on i386 to the size of the output file!
|
||||
|
||||
ifeq ($(KBUILD_OUTPUT),)
|
||||
ifeq ($(src),$(obj))
|
||||
__srctree =
|
||||
else
|
||||
__srctree = $(srctree)/
|
||||
|
|
|
@ -223,7 +223,9 @@ source "arch/arm/mach-pxa/Kconfig"
|
|||
|
||||
source "arch/arm/mach-sa1100/Kconfig"
|
||||
|
||||
source "arch/arm/mach-omap/Kconfig"
|
||||
source "arch/arm/plat-omap/Kconfig"
|
||||
|
||||
source "arch/arm/mach-omap1/Kconfig"
|
||||
|
||||
source "arch/arm/mach-s3c2410/Kconfig"
|
||||
|
||||
|
@ -514,7 +516,7 @@ config XIP_PHYS_ADDR
|
|||
|
||||
endmenu
|
||||
|
||||
if (ARCH_SA1100 || ARCH_INTEGRATOR)
|
||||
if (ARCH_SA1100 || ARCH_INTEGRATOR || ARCH_OMAP1)
|
||||
|
||||
menu "CPU Frequency scaling"
|
||||
|
||||
|
|
|
@ -91,7 +91,8 @@ textaddr-$(CONFIG_ARCH_FORTUNET) := 0xc0008000
|
|||
machine-$(CONFIG_ARCH_IOP3XX) := iop3xx
|
||||
machine-$(CONFIG_ARCH_IXP4XX) := ixp4xx
|
||||
machine-$(CONFIG_ARCH_IXP2000) := ixp2000
|
||||
machine-$(CONFIG_ARCH_OMAP) := omap
|
||||
machine-$(CONFIG_ARCH_OMAP1) := omap1
|
||||
incdir-$(CONFIG_ARCH_OMAP) := omap
|
||||
machine-$(CONFIG_ARCH_S3C2410) := s3c2410
|
||||
machine-$(CONFIG_ARCH_LH7A40X) := lh7a40x
|
||||
machine-$(CONFIG_ARCH_VERSATILE) := versatile
|
||||
|
@ -142,6 +143,9 @@ core-$(CONFIG_FPE_NWFPE) += arch/arm/nwfpe/
|
|||
core-$(CONFIG_FPE_FASTFPE) += $(FASTFPE_OBJ)
|
||||
core-$(CONFIG_VFP) += arch/arm/vfp/
|
||||
|
||||
# If we have a common platform directory, then include it in the build.
|
||||
core-$(CONFIG_ARCH_OMAP) += arch/arm/plat-omap/
|
||||
|
||||
drivers-$(CONFIG_OPROFILE) += arch/arm/oprofile/
|
||||
drivers-$(CONFIG_ARCH_CLPS7500) += drivers/acorn/char/
|
||||
drivers-$(CONFIG_ARCH_L7200) += drivers/acorn/char/
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.12-git6
|
||||
# Sat Jun 25 00:57:29 2005
|
||||
# Linux kernel version: 2.6.13-rc2
|
||||
# Thu Jul 7 16:41:21 2005
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -137,6 +137,7 @@ CONFIG_PCI_NAMES=y
|
|||
#
|
||||
# CONFIG_SMP is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_NO_IDLE_HZ is not set
|
||||
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
|
@ -345,10 +346,9 @@ CONFIG_PACKET_MMAP=y
|
|||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
# CONFIG_IP_FIB_TRIE is not set
|
||||
# CONFIG_IP_MULTICAST is not set
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
CONFIG_IP_PNP=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
|
@ -363,17 +363,8 @@ CONFIG_SYN_COOKIES=y
|
|||
# CONFIG_INET_TUNNEL is not set
|
||||
# CONFIG_IP_TCPDIAG is not set
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
|
||||
#
|
||||
# TCP congestion control
|
||||
#
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
CONFIG_TCP_CONG_WESTWOOD=m
|
||||
CONFIG_TCP_CONG_HTCP=m
|
||||
# CONFIG_TCP_CONG_HSTCP is not set
|
||||
# CONFIG_TCP_CONG_HYBLA is not set
|
||||
# CONFIG_TCP_CONG_VEGAS is not set
|
||||
# CONFIG_TCP_CONG_SCALABLE is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
|
@ -931,4 +922,3 @@ CONFIG_CRC32=y
|
|||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZLIB_DEFLATE=y
|
||||
# CONFIG_TEXTSEARCH is not set
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.12-git6
|
||||
# Sat Jun 25 00:58:38 2005
|
||||
# Linux kernel version: 2.6.13-rc2
|
||||
# Thu Jul 7 16:49:01 2005
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -138,6 +138,7 @@ CONFIG_PCI_NAMES=y
|
|||
#
|
||||
# CONFIG_SMP is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_NO_IDLE_HZ is not set
|
||||
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
|
@ -346,10 +347,9 @@ CONFIG_PACKET_MMAP=y
|
|||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
# CONFIG_IP_FIB_TRIE is not set
|
||||
# CONFIG_IP_MULTICAST is not set
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
CONFIG_IP_PNP=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
|
@ -364,17 +364,8 @@ CONFIG_SYN_COOKIES=y
|
|||
# CONFIG_INET_TUNNEL is not set
|
||||
# CONFIG_IP_TCPDIAG is not set
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
|
||||
#
|
||||
# TCP congestion control
|
||||
#
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
CONFIG_TCP_CONG_WESTWOOD=m
|
||||
CONFIG_TCP_CONG_HTCP=m
|
||||
# CONFIG_TCP_CONG_HSTCP is not set
|
||||
# CONFIG_TCP_CONG_HYBLA is not set
|
||||
# CONFIG_TCP_CONG_VEGAS is not set
|
||||
# CONFIG_TCP_CONG_SCALABLE is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
|
@ -932,4 +923,3 @@ CONFIG_CRC32=y
|
|||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZLIB_DEFLATE=y
|
||||
# CONFIG_TEXTSEARCH is not set
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.12-git6
|
||||
# Sat Jun 25 00:59:35 2005
|
||||
# Linux kernel version: 2.6.13-rc2
|
||||
# Thu Jul 7 16:49:08 2005
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -138,6 +138,7 @@ CONFIG_PCI_NAMES=y
|
|||
#
|
||||
# CONFIG_SMP is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_NO_IDLE_HZ is not set
|
||||
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
|
@ -346,10 +347,9 @@ CONFIG_PACKET_MMAP=y
|
|||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
# CONFIG_IP_FIB_TRIE is not set
|
||||
# CONFIG_IP_MULTICAST is not set
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
CONFIG_IP_PNP=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
|
@ -364,17 +364,8 @@ CONFIG_SYN_COOKIES=y
|
|||
# CONFIG_INET_TUNNEL is not set
|
||||
CONFIG_IP_TCPDIAG=y
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
|
||||
#
|
||||
# TCP congestion control
|
||||
#
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
CONFIG_TCP_CONG_WESTWOOD=m
|
||||
CONFIG_TCP_CONG_HTCP=m
|
||||
# CONFIG_TCP_CONG_HSTCP is not set
|
||||
# CONFIG_TCP_CONG_HYBLA is not set
|
||||
# CONFIG_TCP_CONG_VEGAS is not set
|
||||
# CONFIG_TCP_CONG_SCALABLE is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
|
@ -933,4 +924,3 @@ CONFIG_CRC32=y
|
|||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZLIB_DEFLATE=y
|
||||
# CONFIG_TEXTSEARCH is not set
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.12-git6
|
||||
# Sat Jun 25 01:00:27 2005
|
||||
# Linux kernel version: 2.6.13-rc2
|
||||
# Thu Jul 7 16:49:20 2005
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -138,6 +138,7 @@ CONFIG_PCI_NAMES=y
|
|||
#
|
||||
# CONFIG_SMP is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_NO_IDLE_HZ is not set
|
||||
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
|
@ -346,10 +347,9 @@ CONFIG_PACKET_MMAP=y
|
|||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
# CONFIG_IP_FIB_TRIE is not set
|
||||
# CONFIG_IP_MULTICAST is not set
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
CONFIG_IP_PNP=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
|
@ -364,17 +364,8 @@ CONFIG_SYN_COOKIES=y
|
|||
# CONFIG_INET_TUNNEL is not set
|
||||
# CONFIG_IP_TCPDIAG is not set
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
|
||||
#
|
||||
# TCP congestion control
|
||||
#
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
CONFIG_TCP_CONG_WESTWOOD=m
|
||||
CONFIG_TCP_CONG_HTCP=m
|
||||
# CONFIG_TCP_CONG_HSTCP is not set
|
||||
# CONFIG_TCP_CONG_HYBLA is not set
|
||||
# CONFIG_TCP_CONG_VEGAS is not set
|
||||
# CONFIG_TCP_CONG_SCALABLE is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
|
@ -932,4 +923,3 @@ CONFIG_CRC32=y
|
|||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZLIB_DEFLATE=y
|
||||
# CONFIG_TEXTSEARCH is not set
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.12-git6
|
||||
# Sat Jun 25 01:01:18 2005
|
||||
# Linux kernel version: 2.6.13-rc2
|
||||
# Thu Jul 7 16:49:13 2005
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -138,6 +138,7 @@ CONFIG_PCI_NAMES=y
|
|||
#
|
||||
# CONFIG_SMP is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_NO_IDLE_HZ is not set
|
||||
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
|
@ -346,10 +347,9 @@ CONFIG_PACKET_MMAP=y
|
|||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
# CONFIG_IP_FIB_TRIE is not set
|
||||
# CONFIG_IP_MULTICAST is not set
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
CONFIG_IP_PNP=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
|
@ -364,17 +364,8 @@ CONFIG_SYN_COOKIES=y
|
|||
# CONFIG_INET_TUNNEL is not set
|
||||
# CONFIG_IP_TCPDIAG is not set
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
|
||||
#
|
||||
# TCP congestion control
|
||||
#
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
CONFIG_TCP_CONG_WESTWOOD=m
|
||||
CONFIG_TCP_CONG_HTCP=m
|
||||
# CONFIG_TCP_CONG_HSTCP is not set
|
||||
# CONFIG_TCP_CONG_HYBLA is not set
|
||||
# CONFIG_TCP_CONG_VEGAS is not set
|
||||
# CONFIG_TCP_CONG_SCALABLE is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
|
@ -933,4 +924,3 @@ CONFIG_CRC32=y
|
|||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZLIB_DEFLATE=y
|
||||
# CONFIG_TEXTSEARCH is not set
|
||||
|
|
|
@ -1,14 +1,13 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.12-rc1-bk2
|
||||
# Sun Mar 27 17:52:41 2005
|
||||
# Linux kernel version: 2.6.13-rc2
|
||||
# Fri Jul 8 04:49:34 2005
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_UID16=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_GENERIC_IOMAP=y
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
|
@ -17,6 +16,7 @@ CONFIG_EXPERIMENTAL=y
|
|||
CONFIG_CLEAN_COMPILE=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_LOCK_KERNEL=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
# General setup
|
||||
|
@ -33,8 +33,9 @@ CONFIG_KOBJECT_UEVENT=y
|
|||
# CONFIG_IKCONFIG is not set
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
|
@ -82,10 +83,28 @@ CONFIG_ARCH_OMAP=y
|
|||
# CONFIG_ARCH_VERSATILE is not set
|
||||
# CONFIG_ARCH_IMX is not set
|
||||
# CONFIG_ARCH_H720X is not set
|
||||
# CONFIG_ARCH_AAEC2000 is not set
|
||||
|
||||
#
|
||||
# TI OMAP Implementations
|
||||
#
|
||||
CONFIG_ARCH_OMAP_OTG=y
|
||||
CONFIG_ARCH_OMAP1=y
|
||||
# CONFIG_ARCH_OMAP2 is not set
|
||||
|
||||
#
|
||||
# OMAP Feature Selections
|
||||
#
|
||||
# CONFIG_OMAP_RESET_CLOCKS is not set
|
||||
CONFIG_OMAP_MUX=y
|
||||
# CONFIG_OMAP_MUX_DEBUG is not set
|
||||
CONFIG_OMAP_MUX_WARNINGS=y
|
||||
# CONFIG_OMAP_MPU_TIMER is not set
|
||||
CONFIG_OMAP_32K_TIMER=y
|
||||
CONFIG_OMAP_32K_TIMER_HZ=128
|
||||
CONFIG_OMAP_LL_DEBUG_UART1=y
|
||||
# CONFIG_OMAP_LL_DEBUG_UART2 is not set
|
||||
# CONFIG_OMAP_LL_DEBUG_UART3 is not set
|
||||
|
||||
#
|
||||
# OMAP Core Type
|
||||
|
@ -93,7 +112,6 @@ CONFIG_ARCH_OMAP=y
|
|||
# CONFIG_ARCH_OMAP730 is not set
|
||||
# CONFIG_ARCH_OMAP1510 is not set
|
||||
CONFIG_ARCH_OMAP16XX=y
|
||||
CONFIG_ARCH_OMAP_OTG=y
|
||||
|
||||
#
|
||||
# OMAP Board Type
|
||||
|
@ -101,21 +119,14 @@ CONFIG_ARCH_OMAP_OTG=y
|
|||
# CONFIG_MACH_OMAP_INNOVATOR is not set
|
||||
CONFIG_MACH_OMAP_H2=y
|
||||
# CONFIG_MACH_OMAP_H3 is not set
|
||||
# CONFIG_MACH_OMAP_H4 is not set
|
||||
# CONFIG_MACH_OMAP_OSK is not set
|
||||
# CONFIG_MACH_OMAP_GENERIC is not set
|
||||
|
||||
#
|
||||
# OMAP Feature Selections
|
||||
# OMAP CPU Speed
|
||||
#
|
||||
CONFIG_OMAP_MUX=y
|
||||
# CONFIG_OMAP_MUX_DEBUG is not set
|
||||
CONFIG_OMAP_MUX_WARNINGS=y
|
||||
CONFIG_OMAP_MPU_TIMER=y
|
||||
# CONFIG_OMAP_32K_TIMER is not set
|
||||
CONFIG_OMAP_LL_DEBUG_UART1=y
|
||||
# CONFIG_OMAP_LL_DEBUG_UART2 is not set
|
||||
# CONFIG_OMAP_LL_DEBUG_UART3 is not set
|
||||
# CONFIG_OMAP_CLOCKS_SET_BY_BOOTLOADER is not set
|
||||
# CONFIG_OMAP_ARM_216MHZ is not set
|
||||
CONFIG_OMAP_ARM_192MHZ=y
|
||||
# CONFIG_OMAP_ARM_168MHZ is not set
|
||||
# CONFIG_OMAP_ARM_120MHZ is not set
|
||||
|
@ -145,6 +156,7 @@ CONFIG_ARM_THUMB=y
|
|||
#
|
||||
# Bus support
|
||||
#
|
||||
CONFIG_ISA_DMA_API=y
|
||||
|
||||
#
|
||||
# PCCARD (PCMCIA/CardBus) support
|
||||
|
@ -154,7 +166,16 @@ CONFIG_ARM_THUMB=y
|
|||
#
|
||||
# Kernel Features
|
||||
#
|
||||
# CONFIG_SMP is not set
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_NO_IDLE_HZ=y
|
||||
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_LEDS is not set
|
||||
CONFIG_ALIGNMENT_TRAP=y
|
||||
|
||||
|
@ -166,6 +187,22 @@ CONFIG_ZBOOT_ROM_BSS=0x0
|
|||
CONFIG_CMDLINE="mem=32M console=ttyS0,115200n8 root=0801 ro init=/bin/sh"
|
||||
# CONFIG_XIP_KERNEL is not set
|
||||
|
||||
#
|
||||
# CPU Frequency scaling
|
||||
#
|
||||
CONFIG_CPU_FREQ=y
|
||||
CONFIG_CPU_FREQ_TABLE=y
|
||||
# CONFIG_CPU_FREQ_DEBUG is not set
|
||||
CONFIG_CPU_FREQ_STAT=y
|
||||
# CONFIG_CPU_FREQ_STAT_DETAILS is not set
|
||||
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
|
||||
CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
|
||||
# CONFIG_CPU_FREQ_GOV_PERFORMANCE is not set
|
||||
# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
|
||||
CONFIG_CPU_FREQ_GOV_USERSPACE=y
|
||||
# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set
|
||||
# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
|
||||
|
||||
#
|
||||
# Floating point emulation
|
||||
#
|
||||
|
@ -202,7 +239,6 @@ CONFIG_PM=y
|
|||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
# CONFIG_FW_LOADER is not set
|
||||
CONFIG_DEBUG_DRIVER=y
|
||||
|
||||
#
|
||||
# Memory Technology Devices (MTD)
|
||||
|
@ -292,7 +328,6 @@ CONFIG_MTD_CFI_UTIL=y
|
|||
#
|
||||
# Block devices
|
||||
#
|
||||
# CONFIG_BLK_DEV_FD is not set
|
||||
# CONFIG_BLK_DEV_COW_COMMON is not set
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
|
||||
|
@ -327,6 +362,7 @@ CONFIG_SCSI_PROC_FS=y
|
|||
# CONFIG_CHR_DEV_OSST is not set
|
||||
# CONFIG_BLK_DEV_SR is not set
|
||||
# CONFIG_CHR_DEV_SG is not set
|
||||
# CONFIG_CHR_DEV_SCH is not set
|
||||
|
||||
#
|
||||
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
|
||||
|
@ -356,6 +392,7 @@ CONFIG_SCSI_PROC_FS=y
|
|||
#
|
||||
# Fusion MPT device support
|
||||
#
|
||||
# CONFIG_FUSION is not set
|
||||
|
||||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
|
@ -375,12 +412,12 @@ CONFIG_NET=y
|
|||
#
|
||||
CONFIG_PACKET=y
|
||||
# CONFIG_PACKET_MMAP is not set
|
||||
# CONFIG_NETLINK_DEV is not set
|
||||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
# CONFIG_IP_MULTICAST is not set
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
CONFIG_IP_PNP=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
|
@ -395,6 +432,8 @@ CONFIG_IP_PNP_BOOTP=y
|
|||
# CONFIG_INET_TUNNEL is not set
|
||||
CONFIG_IP_TCPDIAG=y
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
|
@ -442,6 +481,7 @@ CONFIG_NETDEVICES=y
|
|||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_MII=y
|
||||
CONFIG_SMC91X=y
|
||||
# CONFIG_DM9000 is not set
|
||||
|
||||
#
|
||||
# Ethernet (1000 Mbit)
|
||||
|
@ -518,7 +558,6 @@ CONFIG_SERIO=y
|
|||
CONFIG_SERIO_SERPORT=y
|
||||
# CONFIG_SERIO_RAW is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
CONFIG_SOUND_GAMEPORT=y
|
||||
|
||||
#
|
||||
# Character devices
|
||||
|
@ -567,13 +606,11 @@ CONFIG_WATCHDOG_NOWAYOUT=y
|
|||
#
|
||||
# Ftape, the floppy tape device driver
|
||||
#
|
||||
# CONFIG_DRM is not set
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
|
||||
#
|
||||
# TPM devices
|
||||
#
|
||||
# CONFIG_TCG_TPM is not set
|
||||
|
||||
#
|
||||
# I2C support
|
||||
|
@ -604,7 +641,9 @@ CONFIG_I2C_CHARDEV=y
|
|||
# CONFIG_SENSORS_ADM1025 is not set
|
||||
# CONFIG_SENSORS_ADM1026 is not set
|
||||
# CONFIG_SENSORS_ADM1031 is not set
|
||||
# CONFIG_SENSORS_ADM9240 is not set
|
||||
# CONFIG_SENSORS_ASB100 is not set
|
||||
# CONFIG_SENSORS_ATXP1 is not set
|
||||
# CONFIG_SENSORS_DS1621 is not set
|
||||
# CONFIG_SENSORS_FSCHER is not set
|
||||
# CONFIG_SENSORS_FSCPOS is not set
|
||||
|
@ -620,6 +659,7 @@ CONFIG_I2C_CHARDEV=y
|
|||
# CONFIG_SENSORS_LM85 is not set
|
||||
# CONFIG_SENSORS_LM87 is not set
|
||||
# CONFIG_SENSORS_LM90 is not set
|
||||
# CONFIG_SENSORS_LM92 is not set
|
||||
# CONFIG_SENSORS_MAX1619 is not set
|
||||
# CONFIG_SENSORS_PC87360 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
|
@ -627,15 +667,21 @@ CONFIG_I2C_CHARDEV=y
|
|||
# CONFIG_SENSORS_W83781D is not set
|
||||
# CONFIG_SENSORS_W83L785TS is not set
|
||||
# CONFIG_SENSORS_W83627HF is not set
|
||||
# CONFIG_SENSORS_W83627EHF is not set
|
||||
|
||||
#
|
||||
# Other I2C Chip support
|
||||
#
|
||||
# CONFIG_SENSORS_DS1337 is not set
|
||||
# CONFIG_SENSORS_DS1374 is not set
|
||||
# CONFIG_SENSORS_EEPROM is not set
|
||||
# CONFIG_SENSORS_PCF8574 is not set
|
||||
# CONFIG_SENSORS_PCA9539 is not set
|
||||
# CONFIG_SENSORS_PCF8591 is not set
|
||||
# CONFIG_SENSORS_RTC8564 is not set
|
||||
CONFIG_ISP1301_OMAP=y
|
||||
CONFIG_TPS65010=y
|
||||
# CONFIG_SENSORS_MAX6875 is not set
|
||||
# CONFIG_I2C_DEBUG_CORE is not set
|
||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||
# CONFIG_I2C_DEBUG_BUS is not set
|
||||
|
@ -663,8 +709,10 @@ CONFIG_FB=y
|
|||
# CONFIG_FB_CFB_COPYAREA is not set
|
||||
# CONFIG_FB_CFB_IMAGEBLIT is not set
|
||||
# CONFIG_FB_SOFT_CURSOR is not set
|
||||
# CONFIG_FB_MACMODES is not set
|
||||
CONFIG_FB_MODE_HELPERS=y
|
||||
# CONFIG_FB_TILEBLITTING is not set
|
||||
# CONFIG_FB_S1D13XXX is not set
|
||||
# CONFIG_FB_VIRTUAL is not set
|
||||
|
||||
#
|
||||
|
@ -677,11 +725,13 @@ CONFIG_FONTS=y
|
|||
CONFIG_FONT_8x8=y
|
||||
CONFIG_FONT_8x16=y
|
||||
# CONFIG_FONT_6x11 is not set
|
||||
# CONFIG_FONT_7x14 is not set
|
||||
# CONFIG_FONT_PEARL_8x8 is not set
|
||||
# CONFIG_FONT_ACORN_8x8 is not set
|
||||
# CONFIG_FONT_MINI_4x6 is not set
|
||||
# CONFIG_FONT_SUN8x16 is not set
|
||||
# CONFIG_FONT_SUN12x22 is not set
|
||||
# CONFIG_FONT_10x18 is not set
|
||||
|
||||
#
|
||||
# Logo configuration
|
||||
|
@ -729,14 +779,14 @@ CONFIG_USB_ARCH_HAS_OHCI=y
|
|||
#
|
||||
CONFIG_USB_GADGET=y
|
||||
# CONFIG_USB_GADGET_DEBUG_FILES is not set
|
||||
CONFIG_USB_GADGET_SELECTED=y
|
||||
# CONFIG_USB_GADGET_NET2280 is not set
|
||||
# CONFIG_USB_GADGET_PXA2XX is not set
|
||||
# CONFIG_USB_GADGET_GOKU is not set
|
||||
# CONFIG_USB_GADGET_SA1100 is not set
|
||||
# CONFIG_USB_GADGET_LH7A40X is not set
|
||||
# CONFIG_USB_GADGET_DUMMY_HCD is not set
|
||||
CONFIG_USB_GADGET_OMAP=y
|
||||
CONFIG_USB_OMAP=y
|
||||
# CONFIG_USB_GADGET_DUMMY_HCD is not set
|
||||
# CONFIG_USB_GADGET_DUALSPEED is not set
|
||||
# CONFIG_USB_ZERO is not set
|
||||
CONFIG_USB_ETH=y
|
||||
|
@ -755,6 +805,7 @@ CONFIG_USB_ETH_RNDIS=y
|
|||
#
|
||||
CONFIG_EXT2_FS=y
|
||||
# CONFIG_EXT2_FS_XATTR is not set
|
||||
# CONFIG_EXT2_FS_XIP is not set
|
||||
# CONFIG_EXT3_FS is not set
|
||||
# CONFIG_JBD is not set
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
|
@ -791,7 +842,6 @@ CONFIG_FAT_DEFAULT_CODEPAGE=437
|
|||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_SYSFS=y
|
||||
# CONFIG_DEVFS_FS is not set
|
||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||
# CONFIG_TMPFS is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
|
@ -828,12 +878,14 @@ CONFIG_CRAMFS=y
|
|||
#
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
# CONFIG_NFS_V3_ACL is not set
|
||||
CONFIG_NFS_V4=y
|
||||
# CONFIG_NFS_DIRECTIO is not set
|
||||
# CONFIG_NFSD is not set
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_LOCKD=y
|
||||
CONFIG_LOCKD_V4=y
|
||||
CONFIG_NFS_COMMON=y
|
||||
CONFIG_SUNRPC=y
|
||||
CONFIG_SUNRPC_GSS=y
|
||||
CONFIG_RPCSEC_GSS_KRB5=y
|
||||
|
@ -903,24 +955,11 @@ CONFIG_NLS_DEFAULT="iso8859-1"
|
|||
# Kernel hacking
|
||||
#
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
# CONFIG_MAGIC_SYSRQ is not set
|
||||
# CONFIG_DEBUG_KERNEL is not set
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
CONFIG_DEBUG_PREEMPT=y
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
CONFIG_FRAME_POINTER=y
|
||||
CONFIG_DEBUG_USER=y
|
||||
# CONFIG_DEBUG_WAITQ is not set
|
||||
CONFIG_DEBUG_ERRORS=y
|
||||
CONFIG_DEBUG_LL=y
|
||||
# CONFIG_DEBUG_ICEDCC is not set
|
||||
# CONFIG_DEBUG_USER is not set
|
||||
|
||||
#
|
||||
# Security options
|
||||
|
|
|
@ -41,7 +41,10 @@ extern void fp_enter(void);
|
|||
* This has a special calling convention; it doesn't
|
||||
* modify any of the usual registers, except for LR.
|
||||
*/
|
||||
#define EXPORT_CRC_ALIAS(sym) __CRC_SYMBOL(sym, "")
|
||||
|
||||
#define EXPORT_SYMBOL_ALIAS(sym,orig) \
|
||||
EXPORT_CRC_ALIAS(sym) \
|
||||
const struct kernel_symbol __ksymtab_##sym \
|
||||
__attribute__((section("__ksymtab"))) = \
|
||||
{ (unsigned long)&orig, #sym };
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
#include <linux/serial.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/serial_8250.h>
|
||||
#include <linux/mm.h>
|
||||
|
||||
#include <asm/types.h>
|
||||
|
@ -125,19 +125,6 @@ static struct map_desc ixp2000_io_desc[] __initdata = {
|
|||
}
|
||||
};
|
||||
|
||||
static struct uart_port ixp2000_serial_port = {
|
||||
.membase = (char *)(IXP2000_UART_VIRT_BASE + 3),
|
||||
.mapbase = IXP2000_UART_PHYS_BASE + 3,
|
||||
.irq = IRQ_IXP2000_UART,
|
||||
.flags = UPF_SKIP_TEST,
|
||||
.iotype = UPIO_MEM,
|
||||
.regshift = 2,
|
||||
.uartclk = 50000000,
|
||||
.line = 0,
|
||||
.type = PORT_XSCALE,
|
||||
.fifosize = 16
|
||||
};
|
||||
|
||||
void __init ixp2000_map_io(void)
|
||||
{
|
||||
extern unsigned int processor_id;
|
||||
|
@ -157,12 +144,50 @@ void __init ixp2000_map_io(void)
|
|||
}
|
||||
|
||||
iotable_init(ixp2000_io_desc, ARRAY_SIZE(ixp2000_io_desc));
|
||||
early_serial_setup(&ixp2000_serial_port);
|
||||
|
||||
/* Set slowport to 8-bit mode. */
|
||||
ixp2000_reg_write(IXP2000_SLOWPORT_FRM, 1);
|
||||
}
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
* Serial port support for IXP2000
|
||||
*************************************************************************/
|
||||
static struct plat_serial8250_port ixp2000_serial_port[] = {
|
||||
{
|
||||
.mapbase = IXP2000_UART_PHYS_BASE,
|
||||
.membase = (char *)(IXP2000_UART_VIRT_BASE + 3),
|
||||
.irq = IRQ_IXP2000_UART,
|
||||
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
|
||||
.iotype = UPIO_MEM,
|
||||
.regshift = 2,
|
||||
.uartclk = 50000000,
|
||||
},
|
||||
{ },
|
||||
};
|
||||
|
||||
static struct resource ixp2000_uart_resource = {
|
||||
.start = IXP2000_UART_PHYS_BASE,
|
||||
.end = IXP2000_UART_PHYS_BASE + 0xffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
|
||||
static struct platform_device ixp2000_serial_device = {
|
||||
.name = "serial8250",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = ixp2000_serial_port,
|
||||
},
|
||||
.num_resources = 1,
|
||||
.resource = &ixp2000_uart_resource,
|
||||
};
|
||||
|
||||
void __init ixp2000_uart_init(void)
|
||||
{
|
||||
platform_device_register(&ixp2000_serial_device);
|
||||
}
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
* Timer-tick functions for IXP2000
|
||||
*************************************************************************/
|
||||
|
|
|
@ -219,6 +219,7 @@ static struct platform_device *enp2611_devices[] __initdata = {
|
|||
static void __init enp2611_init_machine(void)
|
||||
{
|
||||
platform_add_devices(enp2611_devices, ARRAY_SIZE(enp2611_devices));
|
||||
ixp2000_uart_init();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -303,5 +303,6 @@ void __init ixdp2x00_init_machine(void)
|
|||
gpio_line_config(IXDP2X00_GPIO_I2C_ENABLE, GPIO_OUT);
|
||||
|
||||
platform_add_devices(ixdp2x00_devices, ARRAY_SIZE(ixdp2x00_devices));
|
||||
ixp2000_uart_init();
|
||||
}
|
||||
|
||||
|
|
|
@ -370,6 +370,7 @@ static void __init ixdp2x01_init_machine(void)
|
|||
((*IXDP2X01_CPLD_FLASH_REG & IXDP2X01_CPLD_FLASH_BANK_MASK) + 1);
|
||||
|
||||
platform_add_devices(ixdp2x01_devices, ARRAY_SIZE(ixdp2x01_devices));
|
||||
ixp2000_uart_init();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -453,8 +453,8 @@ int ixp4xx_setup(int nr, struct pci_sys_data *sys)
|
|||
local_write_config(PCI_COMMAND, 2, PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY);
|
||||
|
||||
res[0].name = "PCI I/O Space";
|
||||
res[0].start = 0x00001000;
|
||||
res[0].end = 0xffff0000;
|
||||
res[0].start = 0x00000000;
|
||||
res[0].end = 0x0000ffff;
|
||||
res[0].flags = IORESOURCE_IO;
|
||||
|
||||
res[1].name = "PCI Memory Space";
|
||||
|
|
|
@ -56,7 +56,8 @@ static struct resource coyote_uart_resource = {
|
|||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
|
||||
static struct plat_serial8250_port coyote_uart_data = {
|
||||
static struct plat_serial8250_port coyote_uart_data[] = {
|
||||
{
|
||||
.mapbase = IXP4XX_UART2_BASE_PHYS,
|
||||
.membase = (char *)IXP4XX_UART2_BASE_VIRT + REG_OFFSET,
|
||||
.irq = IRQ_IXP4XX_UART2,
|
||||
|
@ -64,13 +65,15 @@ static struct plat_serial8250_port coyote_uart_data = {
|
|||
.iotype = UPIO_MEM,
|
||||
.regshift = 2,
|
||||
.uartclk = IXP4XX_UART_XTAL,
|
||||
},
|
||||
{ },
|
||||
};
|
||||
|
||||
static struct platform_device coyote_uart = {
|
||||
.name = "serial8250",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &coyote_uart_data,
|
||||
.platform_data = coyote_uart_data,
|
||||
},
|
||||
.num_resources = 1,
|
||||
.resource = &coyote_uart_resource,
|
||||
|
@ -87,10 +90,10 @@ static void __init coyote_init(void)
|
|||
*IXP4XX_EXP_CS1 = *IXP4XX_EXP_CS0;
|
||||
|
||||
if (machine_is_ixdpg425()) {
|
||||
coyote_uart_data.membase =
|
||||
coyote_uart_data[0].membase =
|
||||
(char*)(IXP4XX_UART1_BASE_VIRT + REG_OFFSET);
|
||||
coyote_uart_data.mapbase = IXP4XX_UART1_BASE_PHYS;
|
||||
coyote_uart_data.irq = IRQ_IXP4XX_UART1;
|
||||
coyote_uart_data[0].mapbase = IXP4XX_UART1_BASE_PHYS;
|
||||
coyote_uart_data[0].irq = IRQ_IXP4XX_UART1;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -95,7 +95,8 @@ static struct plat_serial8250_port ixdp425_uart_data[] = {
|
|||
.iotype = UPIO_MEM,
|
||||
.regshift = 2,
|
||||
.uartclk = IXP4XX_UART_XTAL,
|
||||
}
|
||||
},
|
||||
{ },
|
||||
};
|
||||
|
||||
static struct platform_device ixdp425_uart = {
|
||||
|
|
|
@ -1,221 +0,0 @@
|
|||
if ARCH_OMAP
|
||||
|
||||
menu "TI OMAP Implementations"
|
||||
|
||||
comment "OMAP Core Type"
|
||||
|
||||
config ARCH_OMAP730
|
||||
depends on ARCH_OMAP
|
||||
bool "OMAP730 Based System"
|
||||
select ARCH_OMAP_OTG
|
||||
|
||||
config ARCH_OMAP1510
|
||||
depends on ARCH_OMAP
|
||||
default y
|
||||
bool "OMAP1510 Based System"
|
||||
|
||||
config ARCH_OMAP16XX
|
||||
depends on ARCH_OMAP
|
||||
bool "OMAP16XX Based System"
|
||||
select ARCH_OMAP_OTG
|
||||
|
||||
config ARCH_OMAP_OTG
|
||||
bool
|
||||
|
||||
comment "OMAP Board Type"
|
||||
|
||||
config MACH_OMAP_INNOVATOR
|
||||
bool "TI Innovator"
|
||||
depends on ARCH_OMAP1510 || ARCH_OMAP16XX
|
||||
help
|
||||
TI OMAP 1510 or 1610 Innovator board support. Say Y here if you
|
||||
have such a board.
|
||||
|
||||
config MACH_OMAP_H2
|
||||
bool "TI H2 Support"
|
||||
depends on ARCH_OMAP16XX
|
||||
help
|
||||
TI OMAP 1610/1611B H2 board support. Say Y here if you have such
|
||||
a board.
|
||||
|
||||
config MACH_OMAP_H3
|
||||
bool "TI H3 Support"
|
||||
depends on ARCH_OMAP16XX
|
||||
help
|
||||
TI OMAP 1710 H3 board support. Say Y here if you have such
|
||||
a board.
|
||||
|
||||
config MACH_OMAP_H4
|
||||
bool "TI H4 Support"
|
||||
depends on ARCH_OMAP16XX
|
||||
help
|
||||
TI OMAP 1610 H4 board support. Say Y here if you have such
|
||||
a board.
|
||||
|
||||
config MACH_OMAP_OSK
|
||||
bool "TI OSK Support"
|
||||
depends on ARCH_OMAP16XX
|
||||
help
|
||||
TI OMAP 5912 OSK (OMAP Starter Kit) board support. Say Y here
|
||||
if you have such a board.
|
||||
|
||||
config MACH_OMAP_PERSEUS2
|
||||
bool "TI Perseus2"
|
||||
depends on ARCH_OMAP730
|
||||
help
|
||||
Support for TI OMAP 730 Perseus2 board. Say Y here if you have such
|
||||
a board.
|
||||
|
||||
config MACH_VOICEBLUE
|
||||
bool "Voiceblue"
|
||||
depends on ARCH_OMAP1510
|
||||
help
|
||||
Support for Voiceblue GSM/VoIP gateway. Say Y here if you have such
|
||||
board.
|
||||
|
||||
config MACH_NETSTAR
|
||||
bool "NetStar"
|
||||
depends on ARCH_OMAP1510
|
||||
help
|
||||
Support for NetStar PBX. Say Y here if you have such a board.
|
||||
|
||||
config MACH_OMAP_GENERIC
|
||||
bool "Generic OMAP board"
|
||||
depends on ARCH_OMAP1510 || ARCH_OMAP16XX
|
||||
help
|
||||
Support for generic OMAP-1510, 1610 or 1710 board with
|
||||
no FPGA. Can be used as template for porting Linux to
|
||||
custom OMAP boards. Say Y here if you have a custom
|
||||
board.
|
||||
|
||||
comment "OMAP Feature Selections"
|
||||
|
||||
#config OMAP_BOOT_TAG
|
||||
# bool "OMAP bootloader information passing"
|
||||
# depends on ARCH_OMAP
|
||||
# default n
|
||||
# help
|
||||
# Say Y, if you have a bootloader which passes information
|
||||
# about your board and its peripheral configuration.
|
||||
|
||||
config OMAP_MUX
|
||||
bool "OMAP multiplexing support"
|
||||
depends on ARCH_OMAP
|
||||
default y
|
||||
help
|
||||
Pin multiplexing support for OMAP boards. If your bootloader
|
||||
sets the multiplexing correctly, say N. Otherwise, or if unsure,
|
||||
say Y.
|
||||
|
||||
config OMAP_MUX_DEBUG
|
||||
bool "Multiplexing debug output"
|
||||
depends on OMAP_MUX
|
||||
default n
|
||||
help
|
||||
Makes the multiplexing functions print out a lot of debug info.
|
||||
This is useful if you want to find out the correct values of the
|
||||
multiplexing registers.
|
||||
|
||||
config OMAP_MUX_WARNINGS
|
||||
bool "Warn about pins the bootloader didn't set up"
|
||||
depends on OMAP_MUX
|
||||
default y
|
||||
help
|
||||
Choose Y here to warn whenever driver initialization logic needs
|
||||
to change the pin multiplexing setup. When there are no warnings
|
||||
printed, it's safe to deselect OMAP_MUX for your product.
|
||||
|
||||
choice
|
||||
prompt "System timer"
|
||||
default OMAP_MPU_TIMER
|
||||
|
||||
config OMAP_MPU_TIMER
|
||||
bool "Use mpu timer"
|
||||
help
|
||||
Select this option if you want to use the OMAP mpu timer. This
|
||||
timer provides more intra-tick resolution than the 32KHz timer,
|
||||
but consumes more power.
|
||||
|
||||
config OMAP_32K_TIMER
|
||||
bool "Use 32KHz timer"
|
||||
depends on ARCH_OMAP16XX
|
||||
help
|
||||
Select this option if you want to enable the OMAP 32KHz timer.
|
||||
This timer saves power compared to the OMAP_MPU_TIMER, and has
|
||||
support for no tick during idle. The 32KHz timer provides less
|
||||
intra-tick resolution than OMAP_MPU_TIMER. The 32KHz timer is
|
||||
currently only available for OMAP-16xx.
|
||||
|
||||
endchoice
|
||||
|
||||
config OMAP_32K_TIMER_HZ
|
||||
int "Kernel internal timer frequency for 32KHz timer"
|
||||
range 32 1024
|
||||
depends on OMAP_32K_TIMER
|
||||
default "128"
|
||||
help
|
||||
Kernel internal timer frequency should be a divisor of 32768,
|
||||
such as 64 or 128.
|
||||
|
||||
choice
|
||||
prompt "Low-level debug console UART"
|
||||
depends on ARCH_OMAP
|
||||
default OMAP_LL_DEBUG_UART1
|
||||
|
||||
config OMAP_LL_DEBUG_UART1
|
||||
bool "UART1"
|
||||
|
||||
config OMAP_LL_DEBUG_UART2
|
||||
bool "UART2"
|
||||
|
||||
config OMAP_LL_DEBUG_UART3
|
||||
bool "UART3"
|
||||
|
||||
endchoice
|
||||
|
||||
config OMAP_ARM_195MHZ
|
||||
bool "OMAP ARM 195 MHz CPU"
|
||||
depends on ARCH_OMAP730
|
||||
help
|
||||
Enable 195MHz clock for OMAP CPU. If unsure, say N.
|
||||
|
||||
config OMAP_ARM_192MHZ
|
||||
bool "OMAP ARM 192 MHz CPU"
|
||||
depends on ARCH_OMAP16XX
|
||||
help
|
||||
Enable 192MHz clock for OMAP CPU. If unsure, say N.
|
||||
|
||||
config OMAP_ARM_182MHZ
|
||||
bool "OMAP ARM 182 MHz CPU"
|
||||
depends on ARCH_OMAP730
|
||||
help
|
||||
Enable 182MHz clock for OMAP CPU. If unsure, say N.
|
||||
|
||||
config OMAP_ARM_168MHZ
|
||||
bool "OMAP ARM 168 MHz CPU"
|
||||
depends on ARCH_OMAP1510 || ARCH_OMAP16XX || ARCH_OMAP730
|
||||
help
|
||||
Enable 168MHz clock for OMAP CPU. If unsure, say N.
|
||||
|
||||
config OMAP_ARM_120MHZ
|
||||
bool "OMAP ARM 120 MHz CPU"
|
||||
depends on ARCH_OMAP1510 || ARCH_OMAP16XX || ARCH_OMAP730
|
||||
help
|
||||
Enable 120MHz clock for OMAP CPU. If unsure, say N.
|
||||
|
||||
config OMAP_ARM_60MHZ
|
||||
bool "OMAP ARM 60 MHz CPU"
|
||||
depends on ARCH_OMAP1510 || ARCH_OMAP16XX || ARCH_OMAP730
|
||||
default y
|
||||
help
|
||||
Enable 60MHz clock for OMAP CPU. If unsure, say Y.
|
||||
|
||||
config OMAP_ARM_30MHZ
|
||||
bool "OMAP ARM 30 MHz CPU"
|
||||
depends on ARCH_OMAP1510 || ARCH_OMAP16XX || ARCH_OMAP730
|
||||
help
|
||||
Enable 30MHz clock for OMAP CPU. If unsure, say N.
|
||||
|
||||
endmenu
|
||||
|
||||
endif
|
|
@ -1,40 +0,0 @@
|
|||
#
|
||||
# Makefile for the linux kernel.
|
||||
#
|
||||
|
||||
# Common support
|
||||
obj-y := common.o time.o irq.o dma.o clock.o mux.o gpio.o mcbsp.o usb.o
|
||||
obj-m :=
|
||||
obj-n :=
|
||||
obj- :=
|
||||
led-y := leds.o
|
||||
|
||||
# Specific board support
|
||||
obj-$(CONFIG_MACH_OMAP_H2) += board-h2.o
|
||||
obj-$(CONFIG_MACH_OMAP_INNOVATOR) += board-innovator.o
|
||||
obj-$(CONFIG_MACH_OMAP_GENERIC) += board-generic.o
|
||||
obj-$(CONFIG_MACH_OMAP_PERSEUS2) += board-perseus2.o
|
||||
obj-$(CONFIG_MACH_OMAP_OSK) += board-osk.o
|
||||
obj-$(CONFIG_MACH_OMAP_H3) += board-h3.o
|
||||
obj-$(CONFIG_MACH_VOICEBLUE) += board-voiceblue.o
|
||||
obj-$(CONFIG_MACH_NETSTAR) += board-netstar.o
|
||||
|
||||
# OCPI interconnect support for 1710, 1610 and 5912
|
||||
obj-$(CONFIG_ARCH_OMAP16XX) += ocpi.o
|
||||
|
||||
# LEDs support
|
||||
led-$(CONFIG_MACH_OMAP_H2) += leds-h2p2-debug.o
|
||||
led-$(CONFIG_MACH_OMAP_INNOVATOR) += leds-innovator.o
|
||||
led-$(CONFIG_MACH_OMAP_PERSEUS2) += leds-h2p2-debug.o
|
||||
obj-$(CONFIG_LEDS) += $(led-y)
|
||||
|
||||
# Power Management
|
||||
obj-$(CONFIG_PM) += pm.o sleep.o
|
||||
|
||||
ifeq ($(CONFIG_ARCH_OMAP1510),y)
|
||||
# Innovator-1510 FPGA
|
||||
obj-$(CONFIG_MACH_OMAP_INNOVATOR) += fpga.o
|
||||
endif
|
||||
|
||||
# kgdb support
|
||||
obj-$(CONFIG_KGDB_SERIAL) += kgdb-serial.o
|
|
@ -1,549 +0,0 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-omap/common.c
|
||||
*
|
||||
* Code common to all OMAP machines.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#include <linux/config.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/serial.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/serial_8250.h>
|
||||
#include <linux/serial_reg.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/hardware/clock.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include <asm/arch/board.h>
|
||||
#include <asm/arch/mux.h>
|
||||
#include <asm/arch/fpga.h>
|
||||
|
||||
#include "clock.h"
|
||||
|
||||
#define DEBUG 1
|
||||
|
||||
struct omap_id {
|
||||
u16 jtag_id; /* Used to determine OMAP type */
|
||||
u8 die_rev; /* Processor revision */
|
||||
u32 omap_id; /* OMAP revision */
|
||||
u32 type; /* Cpu id bits [31:08], cpu class bits [07:00] */
|
||||
};
|
||||
|
||||
/* Register values to detect the OMAP version */
|
||||
static struct omap_id omap_ids[] __initdata = {
|
||||
{ .jtag_id = 0x355f, .die_rev = 0x0, .omap_id = 0x03320000, .type = 0x07300100},
|
||||
{ .jtag_id = 0xb55f, .die_rev = 0x0, .omap_id = 0x03320000, .type = 0x07300300},
|
||||
{ .jtag_id = 0xb470, .die_rev = 0x0, .omap_id = 0x03310100, .type = 0x15100000},
|
||||
{ .jtag_id = 0xb576, .die_rev = 0x0, .omap_id = 0x03320000, .type = 0x16100000},
|
||||
{ .jtag_id = 0xb576, .die_rev = 0x2, .omap_id = 0x03320100, .type = 0x16110000},
|
||||
{ .jtag_id = 0xb576, .die_rev = 0x3, .omap_id = 0x03320100, .type = 0x16100c00},
|
||||
{ .jtag_id = 0xb576, .die_rev = 0x0, .omap_id = 0x03320200, .type = 0x16100d00},
|
||||
{ .jtag_id = 0xb613, .die_rev = 0x0, .omap_id = 0x03320300, .type = 0x1610ef00},
|
||||
{ .jtag_id = 0xb613, .die_rev = 0x0, .omap_id = 0x03320300, .type = 0x1610ef00},
|
||||
{ .jtag_id = 0xb576, .die_rev = 0x1, .omap_id = 0x03320100, .type = 0x16110000},
|
||||
{ .jtag_id = 0xb58c, .die_rev = 0x2, .omap_id = 0x03320200, .type = 0x16110b00},
|
||||
{ .jtag_id = 0xb58c, .die_rev = 0x3, .omap_id = 0x03320200, .type = 0x16110c00},
|
||||
{ .jtag_id = 0xb65f, .die_rev = 0x0, .omap_id = 0x03320400, .type = 0x16212300},
|
||||
{ .jtag_id = 0xb65f, .die_rev = 0x1, .omap_id = 0x03320400, .type = 0x16212300},
|
||||
{ .jtag_id = 0xb65f, .die_rev = 0x1, .omap_id = 0x03320500, .type = 0x16212300},
|
||||
{ .jtag_id = 0xb5f7, .die_rev = 0x0, .omap_id = 0x03330000, .type = 0x17100000},
|
||||
{ .jtag_id = 0xb5f7, .die_rev = 0x1, .omap_id = 0x03330100, .type = 0x17100000},
|
||||
{ .jtag_id = 0xb5f7, .die_rev = 0x2, .omap_id = 0x03330100, .type = 0x17100000},
|
||||
};
|
||||
|
||||
/*
|
||||
* Get OMAP type from PROD_ID.
|
||||
* 1710 has the PROD_ID in bits 15:00, not in 16:01 as documented in TRM.
|
||||
* 1510 PROD_ID is empty, and 1610 PROD_ID does not make sense.
|
||||
* Undocumented register in TEST BLOCK is used as fallback; This seems to
|
||||
* work on 1510, 1610 & 1710. The official way hopefully will work in future
|
||||
* processors.
|
||||
*/
|
||||
static u16 __init omap_get_jtag_id(void)
|
||||
{
|
||||
u32 prod_id, omap_id;
|
||||
|
||||
prod_id = omap_readl(OMAP_PRODUCTION_ID_1);
|
||||
omap_id = omap_readl(OMAP32_ID_1);
|
||||
|
||||
/* Check for unusable OMAP_PRODUCTION_ID_1 on 1611B/5912 and 730 */
|
||||
if (((prod_id >> 20) == 0) || (prod_id == omap_id))
|
||||
prod_id = 0;
|
||||
else
|
||||
prod_id &= 0xffff;
|
||||
|
||||
if (prod_id)
|
||||
return prod_id;
|
||||
|
||||
/* Use OMAP32_ID_1 as fallback */
|
||||
prod_id = ((omap_id >> 12) & 0xffff);
|
||||
|
||||
return prod_id;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get OMAP revision from DIE_REV.
|
||||
* Early 1710 processors may have broken OMAP_DIE_ID, it contains PROD_ID.
|
||||
* Undocumented register in the TEST BLOCK is used as fallback.
|
||||
* REVISIT: This does not seem to work on 1510
|
||||
*/
|
||||
static u8 __init omap_get_die_rev(void)
|
||||
{
|
||||
u32 die_rev;
|
||||
|
||||
die_rev = omap_readl(OMAP_DIE_ID_1);
|
||||
|
||||
/* Check for broken OMAP_DIE_ID on early 1710 */
|
||||
if (((die_rev >> 12) & 0xffff) == omap_get_jtag_id())
|
||||
die_rev = 0;
|
||||
|
||||
die_rev = (die_rev >> 17) & 0xf;
|
||||
if (die_rev)
|
||||
return die_rev;
|
||||
|
||||
die_rev = (omap_readl(OMAP32_ID_1) >> 28) & 0xf;
|
||||
|
||||
return die_rev;
|
||||
}
|
||||
|
||||
static void __init omap_check_revision(void)
|
||||
{
|
||||
int i;
|
||||
u16 jtag_id;
|
||||
u8 die_rev;
|
||||
u32 omap_id;
|
||||
u8 cpu_type;
|
||||
|
||||
jtag_id = omap_get_jtag_id();
|
||||
die_rev = omap_get_die_rev();
|
||||
omap_id = omap_readl(OMAP32_ID_0);
|
||||
|
||||
#ifdef DEBUG
|
||||
printk("OMAP_DIE_ID_0: 0x%08x\n", omap_readl(OMAP_DIE_ID_0));
|
||||
printk("OMAP_DIE_ID_1: 0x%08x DIE_REV: %i\n",
|
||||
omap_readl(OMAP_DIE_ID_1),
|
||||
(omap_readl(OMAP_DIE_ID_1) >> 17) & 0xf);
|
||||
printk("OMAP_PRODUCTION_ID_0: 0x%08x\n", omap_readl(OMAP_PRODUCTION_ID_0));
|
||||
printk("OMAP_PRODUCTION_ID_1: 0x%08x JTAG_ID: 0x%04x\n",
|
||||
omap_readl(OMAP_PRODUCTION_ID_1),
|
||||
omap_readl(OMAP_PRODUCTION_ID_1) & 0xffff);
|
||||
printk("OMAP32_ID_0: 0x%08x\n", omap_readl(OMAP32_ID_0));
|
||||
printk("OMAP32_ID_1: 0x%08x\n", omap_readl(OMAP32_ID_1));
|
||||
printk("JTAG_ID: 0x%04x DIE_REV: %i\n", jtag_id, die_rev);
|
||||
#endif
|
||||
|
||||
system_serial_high = omap_readl(OMAP_DIE_ID_0);
|
||||
system_serial_low = omap_readl(OMAP_DIE_ID_1);
|
||||
|
||||
/* First check only the major version in a safe way */
|
||||
for (i = 0; i < ARRAY_SIZE(omap_ids); i++) {
|
||||
if (jtag_id == (omap_ids[i].jtag_id)) {
|
||||
system_rev = omap_ids[i].type;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check if we can find the die revision */
|
||||
for (i = 0; i < ARRAY_SIZE(omap_ids); i++) {
|
||||
if (jtag_id == omap_ids[i].jtag_id && die_rev == omap_ids[i].die_rev) {
|
||||
system_rev = omap_ids[i].type;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Finally check also the omap_id */
|
||||
for (i = 0; i < ARRAY_SIZE(omap_ids); i++) {
|
||||
if (jtag_id == omap_ids[i].jtag_id
|
||||
&& die_rev == omap_ids[i].die_rev
|
||||
&& omap_id == omap_ids[i].omap_id) {
|
||||
system_rev = omap_ids[i].type;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Add the cpu class info (7xx, 15xx, 16xx, 24xx) */
|
||||
cpu_type = system_rev >> 24;
|
||||
|
||||
switch (cpu_type) {
|
||||
case 0x07:
|
||||
system_rev |= 0x07;
|
||||
break;
|
||||
case 0x15:
|
||||
system_rev |= 0x15;
|
||||
break;
|
||||
case 0x16:
|
||||
case 0x17:
|
||||
system_rev |= 0x16;
|
||||
break;
|
||||
case 0x24:
|
||||
system_rev |= 0x24;
|
||||
break;
|
||||
default:
|
||||
printk("Unknown OMAP cpu type: 0x%02x\n", cpu_type);
|
||||
}
|
||||
|
||||
printk("OMAP%04x", system_rev >> 16);
|
||||
if ((system_rev >> 8) & 0xff)
|
||||
printk("%x", (system_rev >> 8) & 0xff);
|
||||
printk(" revision %i handled as %02xxx id: %08x%08x\n",
|
||||
die_rev, system_rev & 0xff, system_serial_low,
|
||||
system_serial_high);
|
||||
}
|
||||
|
||||
/*
|
||||
* ----------------------------------------------------------------------------
|
||||
* OMAP I/O mapping
|
||||
*
|
||||
* The machine specific code may provide the extra mapping besides the
|
||||
* default mapping provided here.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static struct map_desc omap_io_desc[] __initdata = {
|
||||
{ IO_VIRT, IO_PHYS, IO_SIZE, MT_DEVICE },
|
||||
};
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP730
|
||||
static struct map_desc omap730_io_desc[] __initdata = {
|
||||
{ OMAP730_DSP_BASE, OMAP730_DSP_START, OMAP730_DSP_SIZE, MT_DEVICE },
|
||||
{ OMAP730_DSPREG_BASE, OMAP730_DSPREG_START, OMAP730_DSPREG_SIZE, MT_DEVICE },
|
||||
{ OMAP730_SRAM_BASE, OMAP730_SRAM_START, OMAP730_SRAM_SIZE, MT_DEVICE }
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP1510
|
||||
static struct map_desc omap1510_io_desc[] __initdata = {
|
||||
{ OMAP1510_DSP_BASE, OMAP1510_DSP_START, OMAP1510_DSP_SIZE, MT_DEVICE },
|
||||
{ OMAP1510_DSPREG_BASE, OMAP1510_DSPREG_START, OMAP1510_DSPREG_SIZE, MT_DEVICE },
|
||||
{ OMAP1510_SRAM_BASE, OMAP1510_SRAM_START, OMAP1510_SRAM_SIZE, MT_DEVICE }
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP16XX)
|
||||
static struct map_desc omap1610_io_desc[] __initdata = {
|
||||
{ OMAP16XX_DSP_BASE, OMAP16XX_DSP_START, OMAP16XX_DSP_SIZE, MT_DEVICE },
|
||||
{ OMAP16XX_DSPREG_BASE, OMAP16XX_DSPREG_START, OMAP16XX_DSPREG_SIZE, MT_DEVICE },
|
||||
{ OMAP16XX_SRAM_BASE, OMAP16XX_SRAM_START, OMAP1610_SRAM_SIZE, MT_DEVICE }
|
||||
};
|
||||
|
||||
static struct map_desc omap5912_io_desc[] __initdata = {
|
||||
{ OMAP16XX_DSP_BASE, OMAP16XX_DSP_START, OMAP16XX_DSP_SIZE, MT_DEVICE },
|
||||
{ OMAP16XX_DSPREG_BASE, OMAP16XX_DSPREG_START, OMAP16XX_DSPREG_SIZE, MT_DEVICE },
|
||||
/*
|
||||
* The OMAP5912 has 250kByte internal SRAM. Because the mapping is baseed on page
|
||||
* size (4kByte), it seems that the last 2kByte (=0x800) of the 250kByte are not mapped.
|
||||
* Add additional 2kByte (0x800) so that the last page is mapped and the last 2kByte
|
||||
* can be used.
|
||||
*/
|
||||
{ OMAP16XX_SRAM_BASE, OMAP16XX_SRAM_START, OMAP5912_SRAM_SIZE + 0x800, MT_DEVICE }
|
||||
};
|
||||
#endif
|
||||
|
||||
static int initialized = 0;
|
||||
|
||||
static void __init _omap_map_io(void)
|
||||
{
|
||||
initialized = 1;
|
||||
|
||||
/* We have to initialize the IO space mapping before we can run
|
||||
* cpu_is_omapxxx() macros. */
|
||||
iotable_init(omap_io_desc, ARRAY_SIZE(omap_io_desc));
|
||||
omap_check_revision();
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP730
|
||||
if (cpu_is_omap730()) {
|
||||
iotable_init(omap730_io_desc, ARRAY_SIZE(omap730_io_desc));
|
||||
}
|
||||
#endif
|
||||
#ifdef CONFIG_ARCH_OMAP1510
|
||||
if (cpu_is_omap1510()) {
|
||||
iotable_init(omap1510_io_desc, ARRAY_SIZE(omap1510_io_desc));
|
||||
}
|
||||
#endif
|
||||
#if defined(CONFIG_ARCH_OMAP16XX)
|
||||
if (cpu_is_omap1610() || cpu_is_omap1710()) {
|
||||
iotable_init(omap1610_io_desc, ARRAY_SIZE(omap1610_io_desc));
|
||||
}
|
||||
if (cpu_is_omap5912()) {
|
||||
iotable_init(omap5912_io_desc, ARRAY_SIZE(omap5912_io_desc));
|
||||
}
|
||||
#endif
|
||||
|
||||
/* REVISIT: Refer to OMAP5910 Errata, Advisory SYS_1: "Timeout Abort
|
||||
* on a Posted Write in the TIPB Bridge".
|
||||
*/
|
||||
omap_writew(0x0, MPU_PUBLIC_TIPB_CNTL);
|
||||
omap_writew(0x0, MPU_PRIVATE_TIPB_CNTL);
|
||||
|
||||
/* Must init clocks early to assure that timer interrupt works
|
||||
*/
|
||||
clk_init();
|
||||
}
|
||||
|
||||
/*
|
||||
* This should only get called from board specific init
|
||||
*/
|
||||
void omap_map_io(void)
|
||||
{
|
||||
if (!initialized)
|
||||
_omap_map_io();
|
||||
}
|
||||
|
||||
static inline unsigned int omap_serial_in(struct plat_serial8250_port *up,
|
||||
int offset)
|
||||
{
|
||||
offset <<= up->regshift;
|
||||
return (unsigned int)__raw_readb(up->membase + offset);
|
||||
}
|
||||
|
||||
static inline void omap_serial_outp(struct plat_serial8250_port *p, int offset,
|
||||
int value)
|
||||
{
|
||||
offset <<= p->regshift;
|
||||
__raw_writeb(value, p->membase + offset);
|
||||
}
|
||||
|
||||
/*
|
||||
* Internal UARTs need to be initialized for the 8250 autoconfig to work
|
||||
* properly. Note that the TX watermark initialization may not be needed
|
||||
* once the 8250.c watermark handling code is merged.
|
||||
*/
|
||||
static void __init omap_serial_reset(struct plat_serial8250_port *p)
|
||||
{
|
||||
omap_serial_outp(p, UART_OMAP_MDR1, 0x07); /* disable UART */
|
||||
omap_serial_outp(p, UART_OMAP_SCR, 0x08); /* TX watermark */
|
||||
omap_serial_outp(p, UART_OMAP_MDR1, 0x00); /* enable UART */
|
||||
|
||||
if (!cpu_is_omap1510()) {
|
||||
omap_serial_outp(p, UART_OMAP_SYSC, 0x01);
|
||||
while (!(omap_serial_in(p, UART_OMAP_SYSC) & 0x01));
|
||||
}
|
||||
}
|
||||
|
||||
static struct plat_serial8250_port serial_platform_data[] = {
|
||||
{
|
||||
.membase = (char*)IO_ADDRESS(OMAP_UART1_BASE),
|
||||
.mapbase = (unsigned long)OMAP_UART1_BASE,
|
||||
.irq = INT_UART1,
|
||||
.flags = UPF_BOOT_AUTOCONF,
|
||||
.iotype = UPIO_MEM,
|
||||
.regshift = 2,
|
||||
.uartclk = OMAP16XX_BASE_BAUD * 16,
|
||||
},
|
||||
{
|
||||
.membase = (char*)IO_ADDRESS(OMAP_UART2_BASE),
|
||||
.mapbase = (unsigned long)OMAP_UART2_BASE,
|
||||
.irq = INT_UART2,
|
||||
.flags = UPF_BOOT_AUTOCONF,
|
||||
.iotype = UPIO_MEM,
|
||||
.regshift = 2,
|
||||
.uartclk = OMAP16XX_BASE_BAUD * 16,
|
||||
},
|
||||
{
|
||||
.membase = (char*)IO_ADDRESS(OMAP_UART3_BASE),
|
||||
.mapbase = (unsigned long)OMAP_UART3_BASE,
|
||||
.irq = INT_UART3,
|
||||
.flags = UPF_BOOT_AUTOCONF,
|
||||
.iotype = UPIO_MEM,
|
||||
.regshift = 2,
|
||||
.uartclk = OMAP16XX_BASE_BAUD * 16,
|
||||
},
|
||||
{ },
|
||||
};
|
||||
|
||||
static struct platform_device serial_device = {
|
||||
.name = "serial8250",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = serial_platform_data,
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* Note that on Innovator-1510 UART2 pins conflict with USB2.
|
||||
* By default UART2 does not work on Innovator-1510 if you have
|
||||
* USB OHCI enabled. To use UART2, you must disable USB2 first.
|
||||
*/
|
||||
void __init omap_serial_init(int ports[OMAP_MAX_NR_PORTS])
|
||||
{
|
||||
int i;
|
||||
|
||||
if (cpu_is_omap730()) {
|
||||
serial_platform_data[0].regshift = 0;
|
||||
serial_platform_data[1].regshift = 0;
|
||||
serial_platform_data[0].irq = INT_730_UART_MODEM_1;
|
||||
serial_platform_data[1].irq = INT_730_UART_MODEM_IRDA_2;
|
||||
}
|
||||
|
||||
if (cpu_is_omap1510()) {
|
||||
serial_platform_data[0].uartclk = OMAP1510_BASE_BAUD * 16;
|
||||
serial_platform_data[1].uartclk = OMAP1510_BASE_BAUD * 16;
|
||||
serial_platform_data[2].uartclk = OMAP1510_BASE_BAUD * 16;
|
||||
}
|
||||
|
||||
for (i = 0; i < OMAP_MAX_NR_PORTS; i++) {
|
||||
unsigned char reg;
|
||||
|
||||
if (ports[i] == 0) {
|
||||
serial_platform_data[i].membase = 0;
|
||||
serial_platform_data[i].mapbase = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (i) {
|
||||
case 0:
|
||||
if (cpu_is_omap1510()) {
|
||||
omap_cfg_reg(UART1_TX);
|
||||
omap_cfg_reg(UART1_RTS);
|
||||
if (machine_is_omap_innovator()) {
|
||||
reg = fpga_read(OMAP1510_FPGA_POWER);
|
||||
reg |= OMAP1510_FPGA_PCR_COM1_EN;
|
||||
fpga_write(reg, OMAP1510_FPGA_POWER);
|
||||
udelay(10);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (cpu_is_omap1510()) {
|
||||
omap_cfg_reg(UART2_TX);
|
||||
omap_cfg_reg(UART2_RTS);
|
||||
if (machine_is_omap_innovator()) {
|
||||
reg = fpga_read(OMAP1510_FPGA_POWER);
|
||||
reg |= OMAP1510_FPGA_PCR_COM2_EN;
|
||||
fpga_write(reg, OMAP1510_FPGA_POWER);
|
||||
udelay(10);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (cpu_is_omap1510()) {
|
||||
omap_cfg_reg(UART3_TX);
|
||||
omap_cfg_reg(UART3_RX);
|
||||
}
|
||||
if (cpu_is_omap1710()) {
|
||||
clk_enable(clk_get(0, "uart3_ck"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
omap_serial_reset(&serial_platform_data[i]);
|
||||
}
|
||||
}
|
||||
|
||||
static int __init omap_init(void)
|
||||
{
|
||||
return platform_device_register(&serial_device);
|
||||
}
|
||||
arch_initcall(omap_init);
|
||||
|
||||
#define NO_LENGTH_CHECK 0xffffffff
|
||||
|
||||
extern int omap_bootloader_tag_len;
|
||||
extern u8 omap_bootloader_tag[];
|
||||
|
||||
struct omap_board_config_kernel *omap_board_config;
|
||||
int omap_board_config_size = 0;
|
||||
|
||||
static const void *get_config(u16 tag, size_t len, int skip, size_t *len_out)
|
||||
{
|
||||
struct omap_board_config_kernel *kinfo = NULL;
|
||||
int i;
|
||||
|
||||
#ifdef CONFIG_OMAP_BOOT_TAG
|
||||
struct omap_board_config_entry *info = NULL;
|
||||
|
||||
if (omap_bootloader_tag_len > 4)
|
||||
info = (struct omap_board_config_entry *) omap_bootloader_tag;
|
||||
while (info != NULL) {
|
||||
u8 *next;
|
||||
|
||||
if (info->tag == tag) {
|
||||
if (skip == 0)
|
||||
break;
|
||||
skip--;
|
||||
}
|
||||
|
||||
if ((info->len & 0x03) != 0) {
|
||||
/* We bail out to avoid an alignment fault */
|
||||
printk(KERN_ERR "OMAP peripheral config: Length (%d) not word-aligned (tag %04x)\n",
|
||||
info->len, info->tag);
|
||||
return NULL;
|
||||
}
|
||||
next = (u8 *) info + sizeof(*info) + info->len;
|
||||
if (next >= omap_bootloader_tag + omap_bootloader_tag_len)
|
||||
info = NULL;
|
||||
else
|
||||
info = (struct omap_board_config_entry *) next;
|
||||
}
|
||||
if (info != NULL) {
|
||||
/* Check the length as a lame attempt to check for
|
||||
* binary inconsistancy. */
|
||||
if (len != NO_LENGTH_CHECK) {
|
||||
/* Word-align len */
|
||||
if (len & 0x03)
|
||||
len = (len + 3) & ~0x03;
|
||||
if (info->len != len) {
|
||||
printk(KERN_ERR "OMAP peripheral config: Length mismatch with tag %x (want %d, got %d)\n",
|
||||
tag, len, info->len);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
if (len_out != NULL)
|
||||
*len_out = info->len;
|
||||
return info->data;
|
||||
}
|
||||
#endif
|
||||
/* Try to find the config from the board-specific structures
|
||||
* in the kernel. */
|
||||
for (i = 0; i < omap_board_config_size; i++) {
|
||||
if (omap_board_config[i].tag == tag) {
|
||||
kinfo = &omap_board_config[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (kinfo == NULL)
|
||||
return NULL;
|
||||
return kinfo->data;
|
||||
}
|
||||
|
||||
const void *__omap_get_config(u16 tag, size_t len, int nr)
|
||||
{
|
||||
return get_config(tag, len, nr, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL(__omap_get_config);
|
||||
|
||||
const void *omap_get_var_config(u16 tag, size_t *len)
|
||||
{
|
||||
return get_config(tag, NO_LENGTH_CHECK, 0, len);
|
||||
}
|
||||
EXPORT_SYMBOL(omap_get_var_config);
|
||||
|
||||
static int __init omap_add_serial_console(void)
|
||||
{
|
||||
const struct omap_uart_config *info;
|
||||
|
||||
info = omap_get_config(OMAP_TAG_UART, struct omap_uart_config);
|
||||
if (info != NULL && info->console_uart) {
|
||||
static char speed[11], *opt = NULL;
|
||||
|
||||
if (info->console_speed) {
|
||||
snprintf(speed, sizeof(speed), "%u", info->console_speed);
|
||||
opt = speed;
|
||||
}
|
||||
return add_preferred_console("ttyS", info->console_uart - 1, opt);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
console_initcall(omap_add_serial_console);
|
|
@ -0,0 +1,144 @@
|
|||
comment "OMAP Core Type"
|
||||
depends on ARCH_OMAP1
|
||||
|
||||
config ARCH_OMAP730
|
||||
depends on ARCH_OMAP1
|
||||
bool "OMAP730 Based System"
|
||||
select ARCH_OMAP_OTG
|
||||
|
||||
config ARCH_OMAP1510
|
||||
depends on ARCH_OMAP1
|
||||
default y
|
||||
bool "OMAP1510 Based System"
|
||||
|
||||
config ARCH_OMAP16XX
|
||||
depends on ARCH_OMAP1
|
||||
bool "OMAP16xx Based System"
|
||||
select ARCH_OMAP_OTG
|
||||
|
||||
comment "OMAP Board Type"
|
||||
depends on ARCH_OMAP1
|
||||
|
||||
config MACH_OMAP_INNOVATOR
|
||||
bool "TI Innovator"
|
||||
depends on ARCH_OMAP1 && (ARCH_OMAP1510 || ARCH_OMAP16XX)
|
||||
help
|
||||
TI OMAP 1510 or 1610 Innovator board support. Say Y here if you
|
||||
have such a board.
|
||||
|
||||
config MACH_OMAP_H2
|
||||
bool "TI H2 Support"
|
||||
depends on ARCH_OMAP1 && ARCH_OMAP16XX
|
||||
help
|
||||
TI OMAP 1610/1611B H2 board support. Say Y here if you have such
|
||||
a board.
|
||||
|
||||
config MACH_OMAP_H3
|
||||
bool "TI H3 Support"
|
||||
depends on ARCH_OMAP1 && ARCH_OMAP16XX
|
||||
help
|
||||
TI OMAP 1710 H3 board support. Say Y here if you have such
|
||||
a board.
|
||||
|
||||
config MACH_OMAP_OSK
|
||||
bool "TI OSK Support"
|
||||
depends on ARCH_OMAP1 && ARCH_OMAP16XX
|
||||
help
|
||||
TI OMAP 5912 OSK (OMAP Starter Kit) board support. Say Y here
|
||||
if you have such a board.
|
||||
|
||||
config MACH_OMAP_PERSEUS2
|
||||
bool "TI Perseus2"
|
||||
depends on ARCH_OMAP1 && ARCH_OMAP730
|
||||
help
|
||||
Support for TI OMAP 730 Perseus2 board. Say Y here if you have such
|
||||
a board.
|
||||
|
||||
config MACH_VOICEBLUE
|
||||
bool "Voiceblue"
|
||||
depends on ARCH_OMAP1 && ARCH_OMAP1510
|
||||
help
|
||||
Support for Voiceblue GSM/VoIP gateway. Say Y here if you have
|
||||
such a board.
|
||||
|
||||
config MACH_NETSTAR
|
||||
bool "NetStar"
|
||||
depends on ARCH_OMAP1 && ARCH_OMAP1510
|
||||
help
|
||||
Support for NetStar PBX. Say Y here if you have such a board.
|
||||
|
||||
config MACH_OMAP_GENERIC
|
||||
bool "Generic OMAP board"
|
||||
depends on ARCH_OMAP1 && (ARCH_OMAP1510 || ARCH_OMAP16XX)
|
||||
help
|
||||
Support for generic OMAP-1510, 1610 or 1710 board with
|
||||
no FPGA. Can be used as template for porting Linux to
|
||||
custom OMAP boards. Say Y here if you have a custom
|
||||
board.
|
||||
|
||||
comment "OMAP CPU Speed"
|
||||
depends on ARCH_OMAP1
|
||||
|
||||
config OMAP_CLOCKS_SET_BY_BOOTLOADER
|
||||
bool "OMAP clocks set by bootloader"
|
||||
depends on ARCH_OMAP1
|
||||
help
|
||||
Enable this option to prevent the kernel from overriding the clock
|
||||
frequencies programmed by bootloader for MPU, DSP, MMUs, TC,
|
||||
internal LCD controller and MPU peripherals.
|
||||
|
||||
config OMAP_ARM_216MHZ
|
||||
bool "OMAP ARM 216 MHz CPU (1710 only)"
|
||||
depends on ARCH_OMAP1 && ARCH_OMAP16XX
|
||||
help
|
||||
Enable 216 MHz clock for OMAP1710 CPU. If unsure, say N.
|
||||
|
||||
config OMAP_ARM_195MHZ
|
||||
bool "OMAP ARM 195 MHz CPU"
|
||||
depends on ARCH_OMAP1 && ARCH_OMAP730
|
||||
help
|
||||
Enable 195MHz clock for OMAP CPU. If unsure, say N.
|
||||
|
||||
config OMAP_ARM_192MHZ
|
||||
bool "OMAP ARM 192 MHz CPU"
|
||||
depends on ARCH_OMAP1 && ARCH_OMAP16XX
|
||||
help
|
||||
Enable 192MHz clock for OMAP CPU. If unsure, say N.
|
||||
|
||||
config OMAP_ARM_182MHZ
|
||||
bool "OMAP ARM 182 MHz CPU"
|
||||
depends on ARCH_OMAP1 && ARCH_OMAP730
|
||||
help
|
||||
Enable 182MHz clock for OMAP CPU. If unsure, say N.
|
||||
|
||||
config OMAP_ARM_168MHZ
|
||||
bool "OMAP ARM 168 MHz CPU"
|
||||
depends on ARCH_OMAP1 && (ARCH_OMAP1510 || ARCH_OMAP16XX || ARCH_OMAP730)
|
||||
help
|
||||
Enable 168MHz clock for OMAP CPU. If unsure, say N.
|
||||
|
||||
config OMAP_ARM_150MHZ
|
||||
bool "OMAP ARM 150 MHz CPU"
|
||||
depends on ARCH_OMAP1 && ARCH_OMAP1510
|
||||
help
|
||||
Enable 150MHz clock for OMAP CPU. If unsure, say N.
|
||||
|
||||
config OMAP_ARM_120MHZ
|
||||
bool "OMAP ARM 120 MHz CPU"
|
||||
depends on ARCH_OMAP1 && (ARCH_OMAP1510 || ARCH_OMAP16XX || ARCH_OMAP730)
|
||||
help
|
||||
Enable 120MHz clock for OMAP CPU. If unsure, say N.
|
||||
|
||||
config OMAP_ARM_60MHZ
|
||||
bool "OMAP ARM 60 MHz CPU"
|
||||
depends on ARCH_OMAP1 && (ARCH_OMAP1510 || ARCH_OMAP16XX || ARCH_OMAP730)
|
||||
default y
|
||||
help
|
||||
Enable 60MHz clock for OMAP CPU. If unsure, say Y.
|
||||
|
||||
config OMAP_ARM_30MHZ
|
||||
bool "OMAP ARM 30 MHz CPU"
|
||||
depends on ARCH_OMAP1 && (ARCH_OMAP1510 || ARCH_OMAP16XX || ARCH_OMAP730)
|
||||
help
|
||||
Enable 30MHz clock for OMAP CPU. If unsure, say N.
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
#
|
||||
# Makefile for the linux kernel.
|
||||
#
|
||||
|
||||
# Common support
|
||||
obj-y := io.o id.o irq.o time.o serial.o
|
||||
led-y := leds.o
|
||||
|
||||
# Specific board support
|
||||
obj-$(CONFIG_MACH_OMAP_H2) += board-h2.o
|
||||
obj-$(CONFIG_MACH_OMAP_INNOVATOR) += board-innovator.o
|
||||
obj-$(CONFIG_MACH_OMAP_GENERIC) += board-generic.o
|
||||
obj-$(CONFIG_MACH_OMAP_PERSEUS2) += board-perseus2.o
|
||||
obj-$(CONFIG_MACH_OMAP_OSK) += board-osk.o
|
||||
obj-$(CONFIG_MACH_OMAP_H3) += board-h3.o
|
||||
obj-$(CONFIG_MACH_VOICEBLUE) += board-voiceblue.o
|
||||
obj-$(CONFIG_MACH_NETSTAR) += board-netstar.o
|
||||
|
||||
ifeq ($(CONFIG_ARCH_OMAP1510),y)
|
||||
# Innovator-1510 FPGA
|
||||
obj-$(CONFIG_MACH_OMAP_INNOVATOR) += fpga.o
|
||||
endif
|
||||
|
||||
# LEDs support
|
||||
led-$(CONFIG_MACH_OMAP_H2) += leds-h2p2-debug.o
|
||||
led-$(CONFIG_MACH_OMAP_INNOVATOR) += leds-innovator.o
|
||||
led-$(CONFIG_MACH_OMAP_PERSEUS2) += leds-h2p2-debug.o
|
||||
led-$(CONFIG_MACH_OMAP_OSK) += leds-osk.o
|
||||
obj-$(CONFIG_LEDS) += $(led-y)
|
||||
|
|
@ -1,4 +1,3 @@
|
|||
zreladdr-y := 0x10008000
|
||||
params_phys-y := 0x10000100
|
||||
initrd_phys-y := 0x10800000
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-omap/board-generic.c
|
||||
* linux/arch/arm/mach-omap1/board-generic.c
|
||||
*
|
||||
* Modified from board-innovator1510.c
|
||||
*
|
||||
|
@ -26,8 +26,7 @@
|
|||
#include <asm/arch/mux.h>
|
||||
#include <asm/arch/usb.h>
|
||||
#include <asm/arch/board.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <asm/arch/common.h>
|
||||
|
||||
static int __initdata generic_serial_ports[OMAP_MAX_NR_PORTS] = {1, 1, 1};
|
||||
|
||||
|
@ -84,7 +83,7 @@ static void __init omap_generic_init(void)
|
|||
|
||||
static void __init omap_generic_map_io(void)
|
||||
{
|
||||
omap_map_io();
|
||||
omap_map_common_io()
|
||||
}
|
||||
|
||||
MACHINE_START(OMAP_GENERIC, "Generic OMAP1510/1610/1710")
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-omap/board-h2.c
|
||||
* linux/arch/arm/mach-omap1/board-h2.c
|
||||
*
|
||||
* Board specific inits for OMAP-1610 H2
|
||||
*
|
||||
|
@ -35,8 +35,7 @@
|
|||
#include <asm/arch/gpio.h>
|
||||
#include <asm/arch/tc.h>
|
||||
#include <asm/arch/usb.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <asm/arch/common.h>
|
||||
|
||||
extern int omap_gpio_init(void);
|
||||
|
||||
|
@ -172,7 +171,7 @@ static void __init h2_init(void)
|
|||
|
||||
static void __init h2_map_io(void)
|
||||
{
|
||||
omap_map_io();
|
||||
omap_map_common_io();
|
||||
omap_serial_init(h2_serial_ports);
|
||||
}
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-omap/board-h3.c
|
||||
* linux/arch/arm/mach-omap1/board-h3.c
|
||||
*
|
||||
* This file contains OMAP1710 H3 specific code.
|
||||
*
|
||||
|
@ -37,8 +37,7 @@
|
|||
#include <asm/arch/mux.h>
|
||||
#include <asm/arch/tc.h>
|
||||
#include <asm/arch/usb.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <asm/arch/common.h>
|
||||
|
||||
extern int omap_gpio_init(void);
|
||||
|
||||
|
@ -190,7 +189,7 @@ void h3_init_irq(void)
|
|||
|
||||
static void __init h3_map_io(void)
|
||||
{
|
||||
omap_map_io();
|
||||
omap_map_common_io();
|
||||
omap_serial_init(h3_serial_ports);
|
||||
}
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-omap/board-innovator.c
|
||||
* linux/arch/arm/mach-omap1/board-innovator.c
|
||||
*
|
||||
* Board specific inits for OMAP-1510 and OMAP-1610 Innovator
|
||||
*
|
||||
|
@ -33,8 +33,7 @@
|
|||
#include <asm/arch/gpio.h>
|
||||
#include <asm/arch/tc.h>
|
||||
#include <asm/arch/usb.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <asm/arch/common.h>
|
||||
|
||||
static int __initdata innovator_serial_ports[OMAP_MAX_NR_PORTS] = {1, 1, 1};
|
||||
|
||||
|
@ -252,7 +251,7 @@ static void __init innovator_init(void)
|
|||
|
||||
static void __init innovator_map_io(void)
|
||||
{
|
||||
omap_map_io();
|
||||
omap_map_common_io();
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP1510
|
||||
if (cpu_is_omap1510()) {
|
|
@ -26,8 +26,7 @@
|
|||
#include <asm/arch/gpio.h>
|
||||
#include <asm/arch/mux.h>
|
||||
#include <asm/arch/usb.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <asm/arch/common.h>
|
||||
|
||||
extern void __init omap_init_time(void);
|
||||
extern int omap_gpio_init(void);
|
||||
|
@ -100,7 +99,7 @@ static int __initdata omap_serial_ports[OMAP_MAX_NR_PORTS] = {1, 1, 1};
|
|||
|
||||
static void __init netstar_map_io(void)
|
||||
{
|
||||
omap_map_io();
|
||||
omap_map_common_io();
|
||||
omap_serial_init(omap_serial_ports);
|
||||
}
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-omap/board-osk.c
|
||||
* linux/arch/arm/mach-omap1/board-osk.c
|
||||
*
|
||||
* Board specific init for OMAP5912 OSK
|
||||
*
|
||||
|
@ -39,8 +39,7 @@
|
|||
#include <asm/arch/usb.h>
|
||||
#include <asm/arch/mux.h>
|
||||
#include <asm/arch/tc.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <asm/arch/common.h>
|
||||
|
||||
static struct map_desc osk5912_io_desc[] __initdata = {
|
||||
{ OMAP_OSK_NOR_FLASH_BASE, OMAP_OSK_NOR_FLASH_START, OMAP_OSK_NOR_FLASH_SIZE,
|
||||
|
@ -153,7 +152,7 @@ static void __init osk_init(void)
|
|||
|
||||
static void __init osk_map_io(void)
|
||||
{
|
||||
omap_map_io();
|
||||
omap_map_common_io();
|
||||
iotable_init(osk5912_io_desc, ARRAY_SIZE(osk5912_io_desc));
|
||||
omap_serial_init(osk_serial_ports);
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-omap/board-perseus2.c
|
||||
* linux/arch/arm/mach-omap1/board-perseus2.c
|
||||
*
|
||||
* Modified from board-generic.c
|
||||
*
|
||||
|
@ -27,8 +27,7 @@
|
|||
#include <asm/arch/gpio.h>
|
||||
#include <asm/arch/mux.h>
|
||||
#include <asm/arch/fpga.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <asm/arch/common.h>
|
||||
|
||||
static struct resource smc91x_resources[] = {
|
||||
[0] = {
|
||||
|
@ -140,7 +139,7 @@ static struct map_desc omap_perseus2_io_desc[] __initdata = {
|
|||
|
||||
static void __init omap_perseus2_map_io(void)
|
||||
{
|
||||
omap_map_io();
|
||||
omap_map_common_io();
|
||||
iotable_init(omap_perseus2_io_desc,
|
||||
ARRAY_SIZE(omap_perseus2_io_desc));
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-omap/board-voiceblue.c
|
||||
* linux/arch/arm/mach-omap1/board-voiceblue.c
|
||||
*
|
||||
* Modified from board-generic.c
|
||||
*
|
||||
|
@ -31,8 +31,7 @@
|
|||
#include <asm/arch/tc.h>
|
||||
#include <asm/arch/mux.h>
|
||||
#include <asm/arch/usb.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <asm/arch/common.h>
|
||||
|
||||
extern void omap_init_time(void);
|
||||
extern int omap_gpio_init(void);
|
||||
|
@ -170,7 +169,7 @@ static int __initdata omap_serial_ports[OMAP_MAX_NR_PORTS] = {1, 1, 1};
|
|||
|
||||
static void __init voiceblue_map_io(void)
|
||||
{
|
||||
omap_map_io();
|
||||
omap_map_common_io();
|
||||
omap_serial_init(omap_serial_ports);
|
||||
}
|
||||
|
|
@ -0,0 +1,188 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-omap1/id.c
|
||||
*
|
||||
* OMAP1 CPU identification code
|
||||
*
|
||||
* Copyright (C) 2004 Nokia Corporation
|
||||
* Written by Tony Lindgren <tony@atomide.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
struct omap_id {
|
||||
u16 jtag_id; /* Used to determine OMAP type */
|
||||
u8 die_rev; /* Processor revision */
|
||||
u32 omap_id; /* OMAP revision */
|
||||
u32 type; /* Cpu id bits [31:08], cpu class bits [07:00] */
|
||||
};
|
||||
|
||||
/* Register values to detect the OMAP version */
|
||||
static struct omap_id omap_ids[] __initdata = {
|
||||
{ .jtag_id = 0x355f, .die_rev = 0x0, .omap_id = 0x03320000, .type = 0x07300100},
|
||||
{ .jtag_id = 0xb55f, .die_rev = 0x0, .omap_id = 0x03320000, .type = 0x07300300},
|
||||
{ .jtag_id = 0xb470, .die_rev = 0x0, .omap_id = 0x03310100, .type = 0x15100000},
|
||||
{ .jtag_id = 0xb576, .die_rev = 0x0, .omap_id = 0x03320000, .type = 0x16100000},
|
||||
{ .jtag_id = 0xb576, .die_rev = 0x2, .omap_id = 0x03320100, .type = 0x16110000},
|
||||
{ .jtag_id = 0xb576, .die_rev = 0x3, .omap_id = 0x03320100, .type = 0x16100c00},
|
||||
{ .jtag_id = 0xb576, .die_rev = 0x0, .omap_id = 0x03320200, .type = 0x16100d00},
|
||||
{ .jtag_id = 0xb613, .die_rev = 0x0, .omap_id = 0x03320300, .type = 0x1610ef00},
|
||||
{ .jtag_id = 0xb613, .die_rev = 0x0, .omap_id = 0x03320300, .type = 0x1610ef00},
|
||||
{ .jtag_id = 0xb576, .die_rev = 0x1, .omap_id = 0x03320100, .type = 0x16110000},
|
||||
{ .jtag_id = 0xb58c, .die_rev = 0x2, .omap_id = 0x03320200, .type = 0x16110b00},
|
||||
{ .jtag_id = 0xb58c, .die_rev = 0x3, .omap_id = 0x03320200, .type = 0x16110c00},
|
||||
{ .jtag_id = 0xb65f, .die_rev = 0x0, .omap_id = 0x03320400, .type = 0x16212300},
|
||||
{ .jtag_id = 0xb65f, .die_rev = 0x1, .omap_id = 0x03320400, .type = 0x16212300},
|
||||
{ .jtag_id = 0xb65f, .die_rev = 0x1, .omap_id = 0x03320500, .type = 0x16212300},
|
||||
{ .jtag_id = 0xb5f7, .die_rev = 0x0, .omap_id = 0x03330000, .type = 0x17100000},
|
||||
{ .jtag_id = 0xb5f7, .die_rev = 0x1, .omap_id = 0x03330100, .type = 0x17100000},
|
||||
{ .jtag_id = 0xb5f7, .die_rev = 0x2, .omap_id = 0x03330100, .type = 0x17100000},
|
||||
};
|
||||
|
||||
/*
|
||||
* Get OMAP type from PROD_ID.
|
||||
* 1710 has the PROD_ID in bits 15:00, not in 16:01 as documented in TRM.
|
||||
* 1510 PROD_ID is empty, and 1610 PROD_ID does not make sense.
|
||||
* Undocumented register in TEST BLOCK is used as fallback; This seems to
|
||||
* work on 1510, 1610 & 1710. The official way hopefully will work in future
|
||||
* processors.
|
||||
*/
|
||||
static u16 __init omap_get_jtag_id(void)
|
||||
{
|
||||
u32 prod_id, omap_id;
|
||||
|
||||
prod_id = omap_readl(OMAP_PRODUCTION_ID_1);
|
||||
omap_id = omap_readl(OMAP32_ID_1);
|
||||
|
||||
/* Check for unusable OMAP_PRODUCTION_ID_1 on 1611B/5912 and 730 */
|
||||
if (((prod_id >> 20) == 0) || (prod_id == omap_id))
|
||||
prod_id = 0;
|
||||
else
|
||||
prod_id &= 0xffff;
|
||||
|
||||
if (prod_id)
|
||||
return prod_id;
|
||||
|
||||
/* Use OMAP32_ID_1 as fallback */
|
||||
prod_id = ((omap_id >> 12) & 0xffff);
|
||||
|
||||
return prod_id;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get OMAP revision from DIE_REV.
|
||||
* Early 1710 processors may have broken OMAP_DIE_ID, it contains PROD_ID.
|
||||
* Undocumented register in the TEST BLOCK is used as fallback.
|
||||
* REVISIT: This does not seem to work on 1510
|
||||
*/
|
||||
static u8 __init omap_get_die_rev(void)
|
||||
{
|
||||
u32 die_rev;
|
||||
|
||||
die_rev = omap_readl(OMAP_DIE_ID_1);
|
||||
|
||||
/* Check for broken OMAP_DIE_ID on early 1710 */
|
||||
if (((die_rev >> 12) & 0xffff) == omap_get_jtag_id())
|
||||
die_rev = 0;
|
||||
|
||||
die_rev = (die_rev >> 17) & 0xf;
|
||||
if (die_rev)
|
||||
return die_rev;
|
||||
|
||||
die_rev = (omap_readl(OMAP32_ID_1) >> 28) & 0xf;
|
||||
|
||||
return die_rev;
|
||||
}
|
||||
|
||||
void __init omap_check_revision(void)
|
||||
{
|
||||
int i;
|
||||
u16 jtag_id;
|
||||
u8 die_rev;
|
||||
u32 omap_id;
|
||||
u8 cpu_type;
|
||||
|
||||
jtag_id = omap_get_jtag_id();
|
||||
die_rev = omap_get_die_rev();
|
||||
omap_id = omap_readl(OMAP32_ID_0);
|
||||
|
||||
#ifdef DEBUG
|
||||
printk("OMAP_DIE_ID_0: 0x%08x\n", omap_readl(OMAP_DIE_ID_0));
|
||||
printk("OMAP_DIE_ID_1: 0x%08x DIE_REV: %i\n",
|
||||
omap_readl(OMAP_DIE_ID_1),
|
||||
(omap_readl(OMAP_DIE_ID_1) >> 17) & 0xf);
|
||||
printk("OMAP_PRODUCTION_ID_0: 0x%08x\n", omap_readl(OMAP_PRODUCTION_ID_0));
|
||||
printk("OMAP_PRODUCTION_ID_1: 0x%08x JTAG_ID: 0x%04x\n",
|
||||
omap_readl(OMAP_PRODUCTION_ID_1),
|
||||
omap_readl(OMAP_PRODUCTION_ID_1) & 0xffff);
|
||||
printk("OMAP32_ID_0: 0x%08x\n", omap_readl(OMAP32_ID_0));
|
||||
printk("OMAP32_ID_1: 0x%08x\n", omap_readl(OMAP32_ID_1));
|
||||
printk("JTAG_ID: 0x%04x DIE_REV: %i\n", jtag_id, die_rev);
|
||||
#endif
|
||||
|
||||
system_serial_high = omap_readl(OMAP_DIE_ID_0);
|
||||
system_serial_low = omap_readl(OMAP_DIE_ID_1);
|
||||
|
||||
/* First check only the major version in a safe way */
|
||||
for (i = 0; i < ARRAY_SIZE(omap_ids); i++) {
|
||||
if (jtag_id == (omap_ids[i].jtag_id)) {
|
||||
system_rev = omap_ids[i].type;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check if we can find the die revision */
|
||||
for (i = 0; i < ARRAY_SIZE(omap_ids); i++) {
|
||||
if (jtag_id == omap_ids[i].jtag_id && die_rev == omap_ids[i].die_rev) {
|
||||
system_rev = omap_ids[i].type;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Finally check also the omap_id */
|
||||
for (i = 0; i < ARRAY_SIZE(omap_ids); i++) {
|
||||
if (jtag_id == omap_ids[i].jtag_id
|
||||
&& die_rev == omap_ids[i].die_rev
|
||||
&& omap_id == omap_ids[i].omap_id) {
|
||||
system_rev = omap_ids[i].type;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Add the cpu class info (7xx, 15xx, 16xx, 24xx) */
|
||||
cpu_type = system_rev >> 24;
|
||||
|
||||
switch (cpu_type) {
|
||||
case 0x07:
|
||||
system_rev |= 0x07;
|
||||
break;
|
||||
case 0x15:
|
||||
system_rev |= 0x15;
|
||||
break;
|
||||
case 0x16:
|
||||
case 0x17:
|
||||
system_rev |= 0x16;
|
||||
break;
|
||||
case 0x24:
|
||||
system_rev |= 0x24;
|
||||
break;
|
||||
default:
|
||||
printk("Unknown OMAP cpu type: 0x%02x\n", cpu_type);
|
||||
}
|
||||
|
||||
printk("OMAP%04x", system_rev >> 16);
|
||||
if ((system_rev >> 8) & 0xff)
|
||||
printk("%x", (system_rev >> 8) & 0xff);
|
||||
printk(" revision %i handled as %02xxx id: %08x%08x\n",
|
||||
die_rev, system_rev & 0xff, system_serial_low,
|
||||
system_serial_high);
|
||||
}
|
||||
|
|
@ -0,0 +1,115 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-omap1/io.c
|
||||
*
|
||||
* OMAP1 I/O mapping code
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/tc.h>
|
||||
|
||||
extern int clk_init(void);
|
||||
extern void omap_check_revision(void);
|
||||
|
||||
/*
|
||||
* The machine specific code may provide the extra mapping besides the
|
||||
* default mapping provided here.
|
||||
*/
|
||||
static struct map_desc omap_io_desc[] __initdata = {
|
||||
{ IO_VIRT, IO_PHYS, IO_SIZE, MT_DEVICE },
|
||||
};
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP730
|
||||
static struct map_desc omap730_io_desc[] __initdata = {
|
||||
{ OMAP730_DSP_BASE, OMAP730_DSP_START, OMAP730_DSP_SIZE, MT_DEVICE },
|
||||
{ OMAP730_DSPREG_BASE, OMAP730_DSPREG_START, OMAP730_DSPREG_SIZE, MT_DEVICE },
|
||||
{ OMAP730_SRAM_BASE, OMAP730_SRAM_START, OMAP730_SRAM_SIZE, MT_DEVICE }
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP1510
|
||||
static struct map_desc omap1510_io_desc[] __initdata = {
|
||||
{ OMAP1510_DSP_BASE, OMAP1510_DSP_START, OMAP1510_DSP_SIZE, MT_DEVICE },
|
||||
{ OMAP1510_DSPREG_BASE, OMAP1510_DSPREG_START, OMAP1510_DSPREG_SIZE, MT_DEVICE },
|
||||
{ OMAP1510_SRAM_BASE, OMAP1510_SRAM_START, OMAP1510_SRAM_SIZE, MT_DEVICE }
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP16XX)
|
||||
static struct map_desc omap1610_io_desc[] __initdata = {
|
||||
{ OMAP16XX_DSP_BASE, OMAP16XX_DSP_START, OMAP16XX_DSP_SIZE, MT_DEVICE },
|
||||
{ OMAP16XX_DSPREG_BASE, OMAP16XX_DSPREG_START, OMAP16XX_DSPREG_SIZE, MT_DEVICE },
|
||||
{ OMAP16XX_SRAM_BASE, OMAP16XX_SRAM_START, OMAP1610_SRAM_SIZE, MT_DEVICE }
|
||||
};
|
||||
|
||||
static struct map_desc omap5912_io_desc[] __initdata = {
|
||||
{ OMAP16XX_DSP_BASE, OMAP16XX_DSP_START, OMAP16XX_DSP_SIZE, MT_DEVICE },
|
||||
{ OMAP16XX_DSPREG_BASE, OMAP16XX_DSPREG_START, OMAP16XX_DSPREG_SIZE, MT_DEVICE },
|
||||
/*
|
||||
* The OMAP5912 has 250kByte internal SRAM. Because the mapping is baseed on page
|
||||
* size (4kByte), it seems that the last 2kByte (=0x800) of the 250kByte are not mapped.
|
||||
* Add additional 2kByte (0x800) so that the last page is mapped and the last 2kByte
|
||||
* can be used.
|
||||
*/
|
||||
{ OMAP16XX_SRAM_BASE, OMAP16XX_SRAM_START, OMAP5912_SRAM_SIZE + 0x800, MT_DEVICE }
|
||||
};
|
||||
#endif
|
||||
|
||||
static int initialized = 0;
|
||||
|
||||
static void __init _omap_map_io(void)
|
||||
{
|
||||
initialized = 1;
|
||||
|
||||
/* We have to initialize the IO space mapping before we can run
|
||||
* cpu_is_omapxxx() macros. */
|
||||
iotable_init(omap_io_desc, ARRAY_SIZE(omap_io_desc));
|
||||
omap_check_revision();
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP730
|
||||
if (cpu_is_omap730()) {
|
||||
iotable_init(omap730_io_desc, ARRAY_SIZE(omap730_io_desc));
|
||||
}
|
||||
#endif
|
||||
#ifdef CONFIG_ARCH_OMAP1510
|
||||
if (cpu_is_omap1510()) {
|
||||
iotable_init(omap1510_io_desc, ARRAY_SIZE(omap1510_io_desc));
|
||||
}
|
||||
#endif
|
||||
#if defined(CONFIG_ARCH_OMAP16XX)
|
||||
if (cpu_is_omap1610() || cpu_is_omap1710()) {
|
||||
iotable_init(omap1610_io_desc, ARRAY_SIZE(omap1610_io_desc));
|
||||
}
|
||||
if (cpu_is_omap5912()) {
|
||||
iotable_init(omap5912_io_desc, ARRAY_SIZE(omap5912_io_desc));
|
||||
}
|
||||
#endif
|
||||
|
||||
/* REVISIT: Refer to OMAP5910 Errata, Advisory SYS_1: "Timeout Abort
|
||||
* on a Posted Write in the TIPB Bridge".
|
||||
*/
|
||||
omap_writew(0x0, MPU_PUBLIC_TIPB_CNTL);
|
||||
omap_writew(0x0, MPU_PRIVATE_TIPB_CNTL);
|
||||
|
||||
/* Must init clocks early to assure that timer interrupt works
|
||||
*/
|
||||
clk_init();
|
||||
}
|
||||
|
||||
/*
|
||||
* This should only get called from board specific init
|
||||
*/
|
||||
void omap_map_common_io(void)
|
||||
{
|
||||
if (!initialized)
|
||||
_omap_map_io();
|
||||
}
|
|
@ -56,6 +56,7 @@
|
|||
struct omap_irq_bank {
|
||||
unsigned long base_reg;
|
||||
unsigned long trigger_map;
|
||||
unsigned long wake_enable;
|
||||
};
|
||||
|
||||
static unsigned int irq_bank_count = 0;
|
||||
|
@ -105,6 +106,19 @@ static void omap_mask_ack_irq(unsigned int irq)
|
|||
omap_ack_irq(irq);
|
||||
}
|
||||
|
||||
static int omap_wake_irq(unsigned int irq, unsigned int enable)
|
||||
{
|
||||
int bank = IRQ_BANK(irq);
|
||||
|
||||
if (enable)
|
||||
irq_banks[bank].wake_enable |= IRQ_BIT(irq);
|
||||
else
|
||||
irq_banks[bank].wake_enable &= ~IRQ_BIT(irq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Allows tuning the IRQ type and priority
|
||||
*
|
||||
|
@ -145,7 +159,7 @@ static struct omap_irq_bank omap1510_irq_banks[] = {
|
|||
static struct omap_irq_bank omap1610_irq_banks[] = {
|
||||
{ .base_reg = OMAP_IH1_BASE, .trigger_map = 0xb3fefe8f },
|
||||
{ .base_reg = OMAP_IH2_BASE, .trigger_map = 0xfdb7c1fd },
|
||||
{ .base_reg = OMAP_IH2_BASE + 0x100, .trigger_map = 0xfffff7ff },
|
||||
{ .base_reg = OMAP_IH2_BASE + 0x100, .trigger_map = 0xffffb7ff },
|
||||
{ .base_reg = OMAP_IH2_BASE + 0x200, .trigger_map = 0xffffffff },
|
||||
};
|
||||
#endif
|
||||
|
@ -154,6 +168,7 @@ static struct irqchip omap_irq_chip = {
|
|||
.ack = omap_mask_ack_irq,
|
||||
.mask = omap_mask_irq,
|
||||
.unmask = omap_unmask_irq,
|
||||
.wake = omap_wake_irq,
|
||||
};
|
||||
|
||||
void __init omap_init_irq(void)
|
|
@ -129,14 +129,11 @@ void osk_leds_event(led_event_t evt)
|
|||
|
||||
#ifdef CONFIG_FB_OMAP
|
||||
|
||||
#ifdef CONFIG_LEDS_TIMER
|
||||
case led_timer:
|
||||
hw_led_state ^= TIMER_LED;
|
||||
mistral_setled();
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_LEDS_CPU
|
||||
case led_idle_start:
|
||||
hw_led_state |= IDLE_LED;
|
||||
mistral_setled();
|
||||
|
@ -146,7 +143,6 @@ void osk_leds_event(led_event_t evt)
|
|||
hw_led_state &= ~IDLE_LED;
|
||||
mistral_setled();
|
||||
break;
|
||||
#endif
|
||||
|
||||
#endif /* CONFIG_FB_OMAP */
|
||||
|
|
@ -0,0 +1,200 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-omap1/id.c
|
||||
*
|
||||
* OMAP1 CPU identification code
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/serial.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/serial_8250.h>
|
||||
#include <linux/serial_reg.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/hardware/clock.h>
|
||||
|
||||
#include <asm/arch/board.h>
|
||||
#include <asm/arch/mux.h>
|
||||
#include <asm/arch/fpga.h>
|
||||
|
||||
static struct clk * uart1_ck = NULL;
|
||||
static struct clk * uart2_ck = NULL;
|
||||
static struct clk * uart3_ck = NULL;
|
||||
|
||||
static inline unsigned int omap_serial_in(struct plat_serial8250_port *up,
|
||||
int offset)
|
||||
{
|
||||
offset <<= up->regshift;
|
||||
return (unsigned int)__raw_readb(up->membase + offset);
|
||||
}
|
||||
|
||||
static inline void omap_serial_outp(struct plat_serial8250_port *p, int offset,
|
||||
int value)
|
||||
{
|
||||
offset <<= p->regshift;
|
||||
__raw_writeb(value, p->membase + offset);
|
||||
}
|
||||
|
||||
/*
|
||||
* Internal UARTs need to be initialized for the 8250 autoconfig to work
|
||||
* properly. Note that the TX watermark initialization may not be needed
|
||||
* once the 8250.c watermark handling code is merged.
|
||||
*/
|
||||
static void __init omap_serial_reset(struct plat_serial8250_port *p)
|
||||
{
|
||||
omap_serial_outp(p, UART_OMAP_MDR1, 0x07); /* disable UART */
|
||||
omap_serial_outp(p, UART_OMAP_SCR, 0x08); /* TX watermark */
|
||||
omap_serial_outp(p, UART_OMAP_MDR1, 0x00); /* enable UART */
|
||||
|
||||
if (!cpu_is_omap1510()) {
|
||||
omap_serial_outp(p, UART_OMAP_SYSC, 0x01);
|
||||
while (!(omap_serial_in(p, UART_OMAP_SYSC) & 0x01));
|
||||
}
|
||||
}
|
||||
|
||||
static struct plat_serial8250_port serial_platform_data[] = {
|
||||
{
|
||||
.membase = (char*)IO_ADDRESS(OMAP_UART1_BASE),
|
||||
.mapbase = (unsigned long)OMAP_UART1_BASE,
|
||||
.irq = INT_UART1,
|
||||
.flags = UPF_BOOT_AUTOCONF,
|
||||
.iotype = UPIO_MEM,
|
||||
.regshift = 2,
|
||||
.uartclk = OMAP16XX_BASE_BAUD * 16,
|
||||
},
|
||||
{
|
||||
.membase = (char*)IO_ADDRESS(OMAP_UART2_BASE),
|
||||
.mapbase = (unsigned long)OMAP_UART2_BASE,
|
||||
.irq = INT_UART2,
|
||||
.flags = UPF_BOOT_AUTOCONF,
|
||||
.iotype = UPIO_MEM,
|
||||
.regshift = 2,
|
||||
.uartclk = OMAP16XX_BASE_BAUD * 16,
|
||||
},
|
||||
{
|
||||
.membase = (char*)IO_ADDRESS(OMAP_UART3_BASE),
|
||||
.mapbase = (unsigned long)OMAP_UART3_BASE,
|
||||
.irq = INT_UART3,
|
||||
.flags = UPF_BOOT_AUTOCONF,
|
||||
.iotype = UPIO_MEM,
|
||||
.regshift = 2,
|
||||
.uartclk = OMAP16XX_BASE_BAUD * 16,
|
||||
},
|
||||
{ },
|
||||
};
|
||||
|
||||
static struct platform_device serial_device = {
|
||||
.name = "serial8250",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = serial_platform_data,
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* Note that on Innovator-1510 UART2 pins conflict with USB2.
|
||||
* By default UART2 does not work on Innovator-1510 if you have
|
||||
* USB OHCI enabled. To use UART2, you must disable USB2 first.
|
||||
*/
|
||||
void __init omap_serial_init(int ports[OMAP_MAX_NR_PORTS])
|
||||
{
|
||||
int i;
|
||||
|
||||
if (cpu_is_omap730()) {
|
||||
serial_platform_data[0].regshift = 0;
|
||||
serial_platform_data[1].regshift = 0;
|
||||
serial_platform_data[0].irq = INT_730_UART_MODEM_1;
|
||||
serial_platform_data[1].irq = INT_730_UART_MODEM_IRDA_2;
|
||||
}
|
||||
|
||||
if (cpu_is_omap1510()) {
|
||||
serial_platform_data[0].uartclk = OMAP1510_BASE_BAUD * 16;
|
||||
serial_platform_data[1].uartclk = OMAP1510_BASE_BAUD * 16;
|
||||
serial_platform_data[2].uartclk = OMAP1510_BASE_BAUD * 16;
|
||||
}
|
||||
|
||||
for (i = 0; i < OMAP_MAX_NR_PORTS; i++) {
|
||||
unsigned char reg;
|
||||
|
||||
if (ports[i] == 0) {
|
||||
serial_platform_data[i].membase = NULL;
|
||||
serial_platform_data[i].mapbase = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (i) {
|
||||
case 0:
|
||||
uart1_ck = clk_get(NULL, "uart1_ck");
|
||||
if (IS_ERR(uart1_ck))
|
||||
printk("Could not get uart1_ck\n");
|
||||
else {
|
||||
clk_use(uart1_ck);
|
||||
if (cpu_is_omap1510())
|
||||
clk_set_rate(uart1_ck, 12000000);
|
||||
}
|
||||
if (cpu_is_omap1510()) {
|
||||
omap_cfg_reg(UART1_TX);
|
||||
omap_cfg_reg(UART1_RTS);
|
||||
if (machine_is_omap_innovator()) {
|
||||
reg = fpga_read(OMAP1510_FPGA_POWER);
|
||||
reg |= OMAP1510_FPGA_PCR_COM1_EN;
|
||||
fpga_write(reg, OMAP1510_FPGA_POWER);
|
||||
udelay(10);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
uart2_ck = clk_get(NULL, "uart2_ck");
|
||||
if (IS_ERR(uart2_ck))
|
||||
printk("Could not get uart2_ck\n");
|
||||
else {
|
||||
clk_use(uart2_ck);
|
||||
if (cpu_is_omap1510())
|
||||
clk_set_rate(uart2_ck, 12000000);
|
||||
else
|
||||
clk_set_rate(uart2_ck, 48000000);
|
||||
}
|
||||
if (cpu_is_omap1510()) {
|
||||
omap_cfg_reg(UART2_TX);
|
||||
omap_cfg_reg(UART2_RTS);
|
||||
if (machine_is_omap_innovator()) {
|
||||
reg = fpga_read(OMAP1510_FPGA_POWER);
|
||||
reg |= OMAP1510_FPGA_PCR_COM2_EN;
|
||||
fpga_write(reg, OMAP1510_FPGA_POWER);
|
||||
udelay(10);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
uart3_ck = clk_get(NULL, "uart3_ck");
|
||||
if (IS_ERR(uart3_ck))
|
||||
printk("Could not get uart3_ck\n");
|
||||
else {
|
||||
clk_use(uart3_ck);
|
||||
if (cpu_is_omap1510())
|
||||
clk_set_rate(uart3_ck, 12000000);
|
||||
}
|
||||
if (cpu_is_omap1510()) {
|
||||
omap_cfg_reg(UART3_TX);
|
||||
omap_cfg_reg(UART3_RX);
|
||||
}
|
||||
break;
|
||||
}
|
||||
omap_serial_reset(&serial_platform_data[i]);
|
||||
}
|
||||
}
|
||||
|
||||
static int __init omap_init(void)
|
||||
{
|
||||
return platform_device_register(&serial_device);
|
||||
}
|
||||
arch_initcall(omap_init);
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-omap/time.c
|
||||
* linux/arch/arm/mach-omap1/time.c
|
||||
*
|
||||
* OMAP Timers
|
||||
*
|
||||
|
@ -58,17 +58,9 @@ struct sys_timer omap_timer;
|
|||
* MPU timer
|
||||
* ---------------------------------------------------------------------------
|
||||
*/
|
||||
#define OMAP_MPU_TIMER1_BASE (0xfffec500)
|
||||
#define OMAP_MPU_TIMER2_BASE (0xfffec600)
|
||||
#define OMAP_MPU_TIMER3_BASE (0xfffec700)
|
||||
#define OMAP_MPU_TIMER_BASE OMAP_MPU_TIMER1_BASE
|
||||
#define OMAP_MPU_TIMER_OFFSET 0x100
|
||||
|
||||
#define MPU_TIMER_FREE (1 << 6)
|
||||
#define MPU_TIMER_CLOCK_ENABLE (1 << 5)
|
||||
#define MPU_TIMER_AR (1 << 1)
|
||||
#define MPU_TIMER_ST (1 << 0)
|
||||
|
||||
/* cycles to nsec conversions taken from arch/i386/kernel/timers/timer_tsc.c,
|
||||
* converted to use kHz by Kevin Hilman */
|
||||
/* convert from cycles(64bits) => nanoseconds (64bits)
|
||||
|
@ -255,6 +247,13 @@ unsigned long long sched_clock(void)
|
|||
#define OMAP_32K_TIMER_TCR 0x04
|
||||
|
||||
#define OMAP_32K_TICKS_PER_HZ (32768 / HZ)
|
||||
#if (32768 % HZ) != 0
|
||||
/* We cannot ignore modulo.
|
||||
* Potential error can be as high as several percent.
|
||||
*/
|
||||
#define OMAP_32K_TICK_MODULO (32768 % HZ)
|
||||
static unsigned modulo_count = 0; /* Counts 1/HZ units */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* TRM says 1 / HZ = ( TVR + 1) / 32768, so TRV = (32768 / HZ) - 1
|
||||
|
@ -331,6 +330,19 @@ static irqreturn_t omap_32k_timer_interrupt(int irq, void *dev_id,
|
|||
now = omap_32k_sync_timer_read();
|
||||
|
||||
while (now - omap_32k_last_tick >= OMAP_32K_TICKS_PER_HZ) {
|
||||
#ifdef OMAP_32K_TICK_MODULO
|
||||
/* Modulo addition may put omap_32k_last_tick ahead of now
|
||||
* and cause unwanted repetition of the while loop.
|
||||
*/
|
||||
if (unlikely(now - omap_32k_last_tick == ~0))
|
||||
break;
|
||||
|
||||
modulo_count += OMAP_32K_TICK_MODULO;
|
||||
if (modulo_count > HZ) {
|
||||
++omap_32k_last_tick;
|
||||
modulo_count -= HZ;
|
||||
}
|
||||
#endif
|
||||
omap_32k_last_tick += OMAP_32K_TICKS_PER_HZ;
|
||||
timer_tick(regs);
|
||||
}
|
||||
|
@ -407,7 +419,7 @@ static __init void omap_init_32k_timer(void)
|
|||
* Timer initialization
|
||||
* ---------------------------------------------------------------------------
|
||||
*/
|
||||
void __init omap_timer_init(void)
|
||||
static void __init omap_timer_init(void)
|
||||
{
|
||||
#if defined(CONFIG_OMAP_MPU_TIMER)
|
||||
omap_init_mpu_timer();
|
|
@ -101,7 +101,7 @@ config CPU_ARM922T
|
|||
|
||||
# ARM925T
|
||||
config CPU_ARM925T
|
||||
bool "Support ARM925T processor" if ARCH_OMAP
|
||||
bool "Support ARM925T processor" if ARCH_OMAP1
|
||||
depends on ARCH_OMAP1510
|
||||
default y if ARCH_OMAP1510
|
||||
select CPU_32v4
|
||||
|
|
|
@ -399,7 +399,7 @@ static void __init build_mem_type_table(void)
|
|||
ecc_mask = 0;
|
||||
}
|
||||
|
||||
if (cpu_arch <= CPU_ARCH_ARMv5) {
|
||||
if (cpu_arch <= CPU_ARCH_ARMv5TEJ) {
|
||||
for (i = 0; i < ARRAY_SIZE(mem_types); i++) {
|
||||
if (mem_types[i].prot_l1)
|
||||
mem_types[i].prot_l1 |= PMD_BIT4;
|
||||
|
@ -584,7 +584,7 @@ void setup_mm_for_reboot(char mode)
|
|||
pmdval = (i << PGDIR_SHIFT) |
|
||||
PMD_SECT_AP_WRITE | PMD_SECT_AP_READ |
|
||||
PMD_TYPE_SECT;
|
||||
if (cpu_arch <= CPU_ARCH_ARMv5)
|
||||
if (cpu_arch <= CPU_ARCH_ARMv5TEJ)
|
||||
pmdval |= PMD_BIT4;
|
||||
pmd = pmd_off(pgd, i << PGDIR_SHIFT);
|
||||
pmd[0] = __pmd(pmdval);
|
||||
|
|
|
@ -200,7 +200,7 @@ __v6_setup:
|
|||
mcr p15, 0, r4, c2, c0, 1 @ load TTB1
|
||||
#ifdef CONFIG_VFP
|
||||
mrc p15, 0, r0, c1, c0, 2
|
||||
orr r0, r0, #(3 << 20)
|
||||
orr r0, r0, #(0xf << 20)
|
||||
mcr p15, 0, r0, c1, c0, 2 @ Enable full access to VFP
|
||||
#endif
|
||||
mrc p15, 0, r0, c1, c0, 0 @ read control register
|
||||
|
|
|
@ -0,0 +1,112 @@
|
|||
if ARCH_OMAP
|
||||
|
||||
menu "TI OMAP Implementations"
|
||||
|
||||
config ARCH_OMAP_OTG
|
||||
bool
|
||||
|
||||
choice
|
||||
prompt "OMAP System Type"
|
||||
default ARCH_OMAP1
|
||||
|
||||
config ARCH_OMAP1
|
||||
bool "TI OMAP1"
|
||||
|
||||
config ARCH_OMAP2
|
||||
bool "TI OMAP2"
|
||||
|
||||
endchoice
|
||||
|
||||
comment "OMAP Feature Selections"
|
||||
|
||||
config OMAP_RESET_CLOCKS
|
||||
bool "Reset unused clocks during boot"
|
||||
depends on ARCH_OMAP
|
||||
default n
|
||||
help
|
||||
Say Y if you want to reset unused clocks during boot.
|
||||
This option saves power, but assumes all drivers are
|
||||
using the clock framework. Broken drivers that do not
|
||||
yet use clock framework may not work with this option.
|
||||
If you are booting from another operating system, you
|
||||
probably do not want this option enabled until your
|
||||
device drivers work properly.
|
||||
|
||||
config OMAP_MUX
|
||||
bool "OMAP multiplexing support"
|
||||
depends on ARCH_OMAP
|
||||
default y
|
||||
help
|
||||
Pin multiplexing support for OMAP boards. If your bootloader
|
||||
sets the multiplexing correctly, say N. Otherwise, or if unsure,
|
||||
say Y.
|
||||
|
||||
config OMAP_MUX_DEBUG
|
||||
bool "Multiplexing debug output"
|
||||
depends on OMAP_MUX
|
||||
default n
|
||||
help
|
||||
Makes the multiplexing functions print out a lot of debug info.
|
||||
This is useful if you want to find out the correct values of the
|
||||
multiplexing registers.
|
||||
|
||||
config OMAP_MUX_WARNINGS
|
||||
bool "Warn about pins the bootloader didn't set up"
|
||||
depends on OMAP_MUX
|
||||
default y
|
||||
help
|
||||
Choose Y here to warn whenever driver initialization logic needs
|
||||
to change the pin multiplexing setup. When there are no warnings
|
||||
printed, it's safe to deselect OMAP_MUX for your product.
|
||||
|
||||
choice
|
||||
prompt "System timer"
|
||||
default OMAP_MPU_TIMER
|
||||
|
||||
config OMAP_MPU_TIMER
|
||||
bool "Use mpu timer"
|
||||
help
|
||||
Select this option if you want to use the OMAP mpu timer. This
|
||||
timer provides more intra-tick resolution than the 32KHz timer,
|
||||
but consumes more power.
|
||||
|
||||
config OMAP_32K_TIMER
|
||||
bool "Use 32KHz timer"
|
||||
depends on ARCH_OMAP16XX
|
||||
help
|
||||
Select this option if you want to enable the OMAP 32KHz timer.
|
||||
This timer saves power compared to the OMAP_MPU_TIMER, and has
|
||||
support for no tick during idle. The 32KHz timer provides less
|
||||
intra-tick resolution than OMAP_MPU_TIMER. The 32KHz timer is
|
||||
currently only available for OMAP-16xx.
|
||||
|
||||
endchoice
|
||||
|
||||
config OMAP_32K_TIMER_HZ
|
||||
int "Kernel internal timer frequency for 32KHz timer"
|
||||
range 32 1024
|
||||
depends on OMAP_32K_TIMER
|
||||
default "128"
|
||||
help
|
||||
Kernel internal timer frequency should be a divisor of 32768,
|
||||
such as 64 or 128.
|
||||
|
||||
choice
|
||||
prompt "Low-level debug console UART"
|
||||
depends on ARCH_OMAP
|
||||
default OMAP_LL_DEBUG_UART1
|
||||
|
||||
config OMAP_LL_DEBUG_UART1
|
||||
bool "UART1"
|
||||
|
||||
config OMAP_LL_DEBUG_UART2
|
||||
bool "UART2"
|
||||
|
||||
config OMAP_LL_DEBUG_UART3
|
||||
bool "UART3"
|
||||
|
||||
endchoice
|
||||
|
||||
endmenu
|
||||
|
||||
endif
|
|
@ -0,0 +1,17 @@
|
|||
#
|
||||
# Makefile for the linux kernel.
|
||||
#
|
||||
|
||||
# Common support
|
||||
obj-y := common.o dma.o clock.o mux.o gpio.o mcbsp.o usb.o
|
||||
obj-m :=
|
||||
obj-n :=
|
||||
obj- :=
|
||||
|
||||
# OCPI interconnect support for 1710, 1610 and 5912
|
||||
obj-$(CONFIG_ARCH_OMAP16XX) += ocpi.o
|
||||
|
||||
# Power Management
|
||||
obj-$(CONFIG_PM) += pm.o sleep.o
|
||||
|
||||
obj-$(CONFIG_CPU_FREQ) += cpu-omap.o
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-omap/clock.c
|
||||
* linux/arch/arm/plat-omap/clock.c
|
||||
*
|
||||
* Copyright (C) 2004 Nokia corporation
|
||||
* Written by Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
|
||||
|
@ -14,6 +14,7 @@
|
|||
#include <linux/errno.h>
|
||||
#include <linux/err.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/semaphore.h>
|
||||
#include <asm/hardware/clock.h>
|
||||
#include <asm/arch/board.h>
|
||||
|
@ -25,6 +26,8 @@ static LIST_HEAD(clocks);
|
|||
static DECLARE_MUTEX(clocks_sem);
|
||||
static DEFINE_SPINLOCK(clockfw_lock);
|
||||
static void propagate_rate(struct clk * clk);
|
||||
/* UART clock function */
|
||||
static int set_uart_rate(struct clk * clk, unsigned long rate);
|
||||
/* External clock (MCLK & BCLK) functions */
|
||||
static int set_ext_clk_rate(struct clk * clk, unsigned long rate);
|
||||
static long round_ext_clk_rate(struct clk * clk, unsigned long rate);
|
||||
|
@ -34,7 +37,7 @@ static int select_table_rate(struct clk * clk, unsigned long rate);
|
|||
static long round_to_table_rate(struct clk * clk, unsigned long rate);
|
||||
void clk_setdpll(__u16, __u16);
|
||||
|
||||
struct mpu_rate rate_table[] = {
|
||||
static struct mpu_rate rate_table[] = {
|
||||
/* MPU MHz, xtal MHz, dpll1 MHz, CKCTL, DPLL_CTL
|
||||
* armdiv, dspdiv, dspmmu, tcdiv, perdiv, lcddiv
|
||||
*/
|
||||
|
@ -48,7 +51,7 @@ struct mpu_rate rate_table[] = {
|
|||
{ 192000000, 19200000, 192000000, 0x050f, 0x2510 }, /* 1/1/2/2/8/8 */
|
||||
{ 192000000, 12000000, 192000000, 0x050f, 0x2810 }, /* 1/1/2/2/8/8 */
|
||||
{ 96000000, 12000000, 192000000, 0x055f, 0x2810 }, /* 2/2/2/2/8/8 */
|
||||
{ 48000000, 12000000, 192000000, 0x0ccf, 0x2810 }, /* 4/4/4/4/8/8 */
|
||||
{ 48000000, 12000000, 192000000, 0x0baf, 0x2810 }, /* 4/8/4/4/8/8 */
|
||||
{ 24000000, 12000000, 192000000, 0x0fff, 0x2810 }, /* 8/8/8/8/8/8 */
|
||||
#endif
|
||||
#if defined(CONFIG_OMAP_ARM_182MHZ)
|
||||
|
@ -58,7 +61,7 @@ struct mpu_rate rate_table[] = {
|
|||
{ 168000000, 12000000, 168000000, 0x010f, 0x2710 }, /* 1/1/1/2/8/8 */
|
||||
#endif
|
||||
#if defined(CONFIG_OMAP_ARM_150MHZ)
|
||||
{ 150000000, 12000000, 150000000, 0x150a, 0x2cb0 }, /* 0/0/1/1/2/2 */
|
||||
{ 150000000, 12000000, 150000000, 0x010a, 0x2cb0 }, /* 1/1/1/2/4/4 */
|
||||
#endif
|
||||
#if defined(CONFIG_OMAP_ARM_120MHZ)
|
||||
{ 120000000, 12000000, 120000000, 0x010a, 0x2510 }, /* 1/1/1/2/4/4 */
|
||||
|
@ -76,19 +79,11 @@ struct mpu_rate rate_table[] = {
|
|||
};
|
||||
|
||||
|
||||
static void ckctl_recalc(struct clk * clk)
|
||||
{
|
||||
int dsor;
|
||||
|
||||
/* Calculate divisor encoded as 2-bit exponent */
|
||||
dsor = 1 << (3 & (omap_readw(ARM_CKCTL) >> clk->rate_offset));
|
||||
if (unlikely(clk->rate == clk->parent->rate / dsor))
|
||||
return; /* No change, quick exit */
|
||||
clk->rate = clk->parent->rate / dsor;
|
||||
|
||||
if (unlikely(clk->flags & RATE_PROPAGATES))
|
||||
propagate_rate(clk);
|
||||
}
|
||||
static void ckctl_recalc(struct clk * clk);
|
||||
int __clk_enable(struct clk *clk);
|
||||
void __clk_disable(struct clk *clk);
|
||||
void __clk_unuse(struct clk *clk);
|
||||
int __clk_use(struct clk *clk);
|
||||
|
||||
|
||||
static void followparent_recalc(struct clk * clk)
|
||||
|
@ -102,6 +97,14 @@ static void watchdog_recalc(struct clk * clk)
|
|||
clk->rate = clk->parent->rate / 14;
|
||||
}
|
||||
|
||||
static void uart_recalc(struct clk * clk)
|
||||
{
|
||||
unsigned int val = omap_readl(clk->enable_reg);
|
||||
if (val & clk->enable_bit)
|
||||
clk->rate = 48000000;
|
||||
else
|
||||
clk->rate = 12000000;
|
||||
}
|
||||
|
||||
static struct clk ck_ref = {
|
||||
.name = "ck_ref",
|
||||
|
@ -138,7 +141,7 @@ static struct clk arm_ck = {
|
|||
static struct clk armper_ck = {
|
||||
.name = "armper_ck",
|
||||
.parent = &ck_dpll1,
|
||||
.flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
|
||||
.flags = CLOCK_IN_OMAP730 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
|
||||
RATE_CKCTL,
|
||||
.enable_reg = ARM_IDLECT2,
|
||||
.enable_bit = EN_PERCK,
|
||||
|
@ -185,7 +188,7 @@ static struct clk armwdt_ck = {
|
|||
static struct clk arminth_ck16xx = {
|
||||
.name = "arminth_ck",
|
||||
.parent = &arm_ck,
|
||||
.flags = CLOCK_IN_OMAP16XX,
|
||||
.flags = CLOCK_IN_OMAP16XX | ALWAYS_ENABLED,
|
||||
.recalc = &followparent_recalc,
|
||||
/* Note: On 16xx the frequency can be divided by 2 by programming
|
||||
* ARM_CKCTL:ARM_INTHCK_SEL(14) to 1
|
||||
|
@ -214,6 +217,38 @@ static struct clk dspmmu_ck = {
|
|||
.recalc = &ckctl_recalc,
|
||||
};
|
||||
|
||||
static struct clk dspper_ck = {
|
||||
.name = "dspper_ck",
|
||||
.parent = &ck_dpll1,
|
||||
.flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
|
||||
RATE_CKCTL | DSP_DOMAIN_CLOCK | VIRTUAL_IO_ADDRESS,
|
||||
.enable_reg = DSP_IDLECT2,
|
||||
.enable_bit = EN_PERCK,
|
||||
.rate_offset = CKCTL_PERDIV_OFFSET,
|
||||
.recalc = &followparent_recalc,
|
||||
//.recalc = &ckctl_recalc,
|
||||
};
|
||||
|
||||
static struct clk dspxor_ck = {
|
||||
.name = "dspxor_ck",
|
||||
.parent = &ck_ref,
|
||||
.flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
|
||||
DSP_DOMAIN_CLOCK | VIRTUAL_IO_ADDRESS,
|
||||
.enable_reg = DSP_IDLECT2,
|
||||
.enable_bit = EN_XORPCK,
|
||||
.recalc = &followparent_recalc,
|
||||
};
|
||||
|
||||
static struct clk dsptim_ck = {
|
||||
.name = "dsptim_ck",
|
||||
.parent = &ck_ref,
|
||||
.flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
|
||||
DSP_DOMAIN_CLOCK | VIRTUAL_IO_ADDRESS,
|
||||
.enable_reg = DSP_IDLECT2,
|
||||
.enable_bit = EN_DSPTIMCK,
|
||||
.recalc = &followparent_recalc,
|
||||
};
|
||||
|
||||
static struct clk tc_ck = {
|
||||
.name = "tc_ck",
|
||||
.parent = &ck_dpll1,
|
||||
|
@ -226,7 +261,7 @@ static struct clk tc_ck = {
|
|||
static struct clk arminth_ck1510 = {
|
||||
.name = "arminth_ck",
|
||||
.parent = &tc_ck,
|
||||
.flags = CLOCK_IN_OMAP1510,
|
||||
.flags = CLOCK_IN_OMAP1510 | ALWAYS_ENABLED,
|
||||
.recalc = &followparent_recalc,
|
||||
/* Note: On 1510 the frequency follows TC_CK
|
||||
*
|
||||
|
@ -237,7 +272,7 @@ static struct clk arminth_ck1510 = {
|
|||
static struct clk tipb_ck = {
|
||||
.name = "tibp_ck",
|
||||
.parent = &tc_ck,
|
||||
.flags = CLOCK_IN_OMAP1510,
|
||||
.flags = CLOCK_IN_OMAP1510 | ALWAYS_ENABLED,
|
||||
.recalc = &followparent_recalc,
|
||||
};
|
||||
|
||||
|
@ -271,14 +306,15 @@ static struct clk tc2_ck = {
|
|||
static struct clk dma_ck = {
|
||||
.name = "dma_ck",
|
||||
.parent = &tc_ck,
|
||||
.flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX,
|
||||
.flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
|
||||
ALWAYS_ENABLED,
|
||||
.recalc = &followparent_recalc,
|
||||
};
|
||||
|
||||
static struct clk dma_lcdfree_ck = {
|
||||
.name = "dma_lcdfree_ck",
|
||||
.parent = &tc_ck,
|
||||
.flags = CLOCK_IN_OMAP16XX,
|
||||
.flags = CLOCK_IN_OMAP16XX | ALWAYS_ENABLED,
|
||||
.recalc = &followparent_recalc,
|
||||
};
|
||||
|
||||
|
@ -303,14 +339,14 @@ static struct clk lb_ck = {
|
|||
static struct clk rhea1_ck = {
|
||||
.name = "rhea1_ck",
|
||||
.parent = &tc_ck,
|
||||
.flags = CLOCK_IN_OMAP16XX,
|
||||
.flags = CLOCK_IN_OMAP16XX | ALWAYS_ENABLED,
|
||||
.recalc = &followparent_recalc,
|
||||
};
|
||||
|
||||
static struct clk rhea2_ck = {
|
||||
.name = "rhea2_ck",
|
||||
.parent = &tc_ck,
|
||||
.flags = CLOCK_IN_OMAP16XX,
|
||||
.flags = CLOCK_IN_OMAP16XX | ALWAYS_ENABLED,
|
||||
.recalc = &followparent_recalc,
|
||||
};
|
||||
|
||||
|
@ -325,43 +361,55 @@ static struct clk lcd_ck = {
|
|||
.recalc = &ckctl_recalc,
|
||||
};
|
||||
|
||||
static struct clk uart1_ck = {
|
||||
static struct clk uart1_1510 = {
|
||||
.name = "uart1_ck",
|
||||
/* Direct from ULPD, no parent */
|
||||
.rate = 12000000,
|
||||
.flags = CLOCK_IN_OMAP1510 | ENABLE_REG_32BIT | ALWAYS_ENABLED,
|
||||
.enable_reg = MOD_CONF_CTRL_0,
|
||||
.enable_bit = 29, /* Chooses between 12MHz and 48MHz */
|
||||
.set_rate = &set_uart_rate,
|
||||
.recalc = &uart_recalc,
|
||||
};
|
||||
|
||||
static struct clk uart1_16xx = {
|
||||
.name = "uart1_ck",
|
||||
/* Direct from ULPD, no parent */
|
||||
.rate = 48000000,
|
||||
.flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
|
||||
RATE_FIXED | ENABLE_REG_32BIT,
|
||||
.flags = CLOCK_IN_OMAP16XX | RATE_FIXED | ENABLE_REG_32BIT,
|
||||
.enable_reg = MOD_CONF_CTRL_0,
|
||||
.enable_bit = 29,
|
||||
/* (Only on 1510)
|
||||
* The "enable bit" actually chooses between 48MHz and 12MHz.
|
||||
*/
|
||||
};
|
||||
|
||||
static struct clk uart2_ck = {
|
||||
.name = "uart2_ck",
|
||||
/* Direct from ULPD, no parent */
|
||||
.rate = 48000000,
|
||||
.flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
|
||||
RATE_FIXED | ENABLE_REG_32BIT,
|
||||
.rate = 12000000,
|
||||
.flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | ENABLE_REG_32BIT,
|
||||
.enable_reg = MOD_CONF_CTRL_0,
|
||||
.enable_bit = 30,
|
||||
/* (for both 1510 and 16xx)
|
||||
* The "enable bit" actually chooses between 48MHz and 12MHz/32kHz.
|
||||
*/
|
||||
.enable_bit = 30, /* Chooses between 12MHz and 48MHz */
|
||||
.set_rate = &set_uart_rate,
|
||||
.recalc = &uart_recalc,
|
||||
};
|
||||
|
||||
static struct clk uart3_ck = {
|
||||
static struct clk uart3_1510 = {
|
||||
.name = "uart3_ck",
|
||||
/* Direct from ULPD, no parent */
|
||||
.rate = 12000000,
|
||||
.flags = CLOCK_IN_OMAP1510 | ENABLE_REG_32BIT | ALWAYS_ENABLED,
|
||||
.enable_reg = MOD_CONF_CTRL_0,
|
||||
.enable_bit = 31, /* Chooses between 12MHz and 48MHz */
|
||||
.set_rate = &set_uart_rate,
|
||||
.recalc = &uart_recalc,
|
||||
};
|
||||
|
||||
static struct clk uart3_16xx = {
|
||||
.name = "uart3_ck",
|
||||
/* Direct from ULPD, no parent */
|
||||
.rate = 48000000,
|
||||
.flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
|
||||
RATE_FIXED | ENABLE_REG_32BIT,
|
||||
.flags = CLOCK_IN_OMAP16XX | RATE_FIXED | ENABLE_REG_32BIT,
|
||||
.enable_reg = MOD_CONF_CTRL_0,
|
||||
.enable_bit = 31,
|
||||
/* (Only on 1510)
|
||||
* The "enable bit" actually chooses between 48MHz and 12MHz.
|
||||
*/
|
||||
};
|
||||
|
||||
static struct clk usb_clko = { /* 6 MHz output on W4_USB_CLKO */
|
||||
|
@ -480,6 +528,9 @@ static struct clk * onchip_clks[] = {
|
|||
/* CK_GEN2 clocks */
|
||||
&dsp_ck,
|
||||
&dspmmu_ck,
|
||||
&dspper_ck,
|
||||
&dspxor_ck,
|
||||
&dsptim_ck,
|
||||
/* CK_GEN3 clocks */
|
||||
&tc_ck,
|
||||
&tipb_ck,
|
||||
|
@ -494,9 +545,11 @@ static struct clk * onchip_clks[] = {
|
|||
&rhea2_ck,
|
||||
&lcd_ck,
|
||||
/* ULPD clocks */
|
||||
&uart1_ck,
|
||||
&uart1_1510,
|
||||
&uart1_16xx,
|
||||
&uart2_ck,
|
||||
&uart3_ck,
|
||||
&uart3_1510,
|
||||
&uart3_16xx,
|
||||
&usb_clko,
|
||||
&usb_hhc_ck1510, &usb_hhc_ck16xx,
|
||||
&mclk_1510, &mclk_16xx,
|
||||
|
@ -547,15 +600,35 @@ int __clk_enable(struct clk *clk)
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (clk->flags & DSP_DOMAIN_CLOCK) {
|
||||
__clk_use(&api_ck);
|
||||
}
|
||||
|
||||
if (clk->flags & ENABLE_REG_32BIT) {
|
||||
if (clk->flags & VIRTUAL_IO_ADDRESS) {
|
||||
regval32 = __raw_readl(clk->enable_reg);
|
||||
regval32 |= (1 << clk->enable_bit);
|
||||
__raw_writel(regval32, clk->enable_reg);
|
||||
} else {
|
||||
regval32 = omap_readl(clk->enable_reg);
|
||||
regval32 |= (1 << clk->enable_bit);
|
||||
omap_writel(regval32, clk->enable_reg);
|
||||
}
|
||||
} else {
|
||||
if (clk->flags & VIRTUAL_IO_ADDRESS) {
|
||||
regval16 = __raw_readw(clk->enable_reg);
|
||||
regval16 |= (1 << clk->enable_bit);
|
||||
__raw_writew(regval16, clk->enable_reg);
|
||||
} else {
|
||||
regval16 = omap_readw(clk->enable_reg);
|
||||
regval16 |= (1 << clk->enable_bit);
|
||||
omap_writew(regval16, clk->enable_reg);
|
||||
}
|
||||
}
|
||||
|
||||
if (clk->flags & DSP_DOMAIN_CLOCK) {
|
||||
__clk_unuse(&api_ck);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -569,15 +642,35 @@ void __clk_disable(struct clk *clk)
|
|||
if (clk->enable_reg == 0)
|
||||
return;
|
||||
|
||||
if (clk->flags & DSP_DOMAIN_CLOCK) {
|
||||
__clk_use(&api_ck);
|
||||
}
|
||||
|
||||
if (clk->flags & ENABLE_REG_32BIT) {
|
||||
if (clk->flags & VIRTUAL_IO_ADDRESS) {
|
||||
regval32 = __raw_readl(clk->enable_reg);
|
||||
regval32 &= ~(1 << clk->enable_bit);
|
||||
__raw_writel(regval32, clk->enable_reg);
|
||||
} else {
|
||||
regval32 = omap_readl(clk->enable_reg);
|
||||
regval32 &= ~(1 << clk->enable_bit);
|
||||
omap_writel(regval32, clk->enable_reg);
|
||||
}
|
||||
} else {
|
||||
if (clk->flags & VIRTUAL_IO_ADDRESS) {
|
||||
regval16 = __raw_readw(clk->enable_reg);
|
||||
regval16 &= ~(1 << clk->enable_bit);
|
||||
__raw_writew(regval16, clk->enable_reg);
|
||||
} else {
|
||||
regval16 = omap_readw(clk->enable_reg);
|
||||
regval16 &= ~(1 << clk->enable_bit);
|
||||
omap_writew(regval16, clk->enable_reg);
|
||||
}
|
||||
}
|
||||
|
||||
if (clk->flags & DSP_DOMAIN_CLOCK) {
|
||||
__clk_unuse(&api_ck);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -766,6 +859,33 @@ static int calc_dsor_exp(struct clk *clk, unsigned long rate)
|
|||
return dsor_exp;
|
||||
}
|
||||
|
||||
|
||||
static void ckctl_recalc(struct clk * clk)
|
||||
{
|
||||
int dsor;
|
||||
|
||||
/* Calculate divisor encoded as 2-bit exponent */
|
||||
if (clk->flags & DSP_DOMAIN_CLOCK) {
|
||||
/* The clock control bits are in DSP domain,
|
||||
* so api_ck is needed for access.
|
||||
* Note that DSP_CKCTL virt addr = phys addr, so
|
||||
* we must use __raw_readw() instead of omap_readw().
|
||||
*/
|
||||
__clk_use(&api_ck);
|
||||
dsor = 1 << (3 & (__raw_readw(DSP_CKCTL) >> clk->rate_offset));
|
||||
__clk_unuse(&api_ck);
|
||||
} else {
|
||||
dsor = 1 << (3 & (omap_readw(ARM_CKCTL) >> clk->rate_offset));
|
||||
}
|
||||
if (unlikely(clk->rate == clk->parent->rate / dsor))
|
||||
return; /* No change, quick exit */
|
||||
clk->rate = clk->parent->rate / dsor;
|
||||
|
||||
if (unlikely(clk->flags & RATE_PROPAGATES))
|
||||
propagate_rate(clk);
|
||||
}
|
||||
|
||||
|
||||
long clk_round_rate(struct clk *clk, unsigned long rate)
|
||||
{
|
||||
int dsor_exp;
|
||||
|
@ -823,6 +943,9 @@ static int select_table_rate(struct clk * clk, unsigned long rate)
|
|||
break;
|
||||
}
|
||||
|
||||
if (!ptr->rate)
|
||||
return -EINVAL;
|
||||
|
||||
if (!ptr->rate)
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -921,6 +1044,23 @@ static unsigned calc_ext_dsor(unsigned long rate)
|
|||
return dsor;
|
||||
}
|
||||
|
||||
/* Only needed on 1510 */
|
||||
static int set_uart_rate(struct clk * clk, unsigned long rate)
|
||||
{
|
||||
unsigned int val;
|
||||
|
||||
val = omap_readl(clk->enable_reg);
|
||||
if (rate == 12000000)
|
||||
val &= ~(1 << clk->enable_bit);
|
||||
else if (rate == 48000000)
|
||||
val |= (1 << clk->enable_bit);
|
||||
else
|
||||
return -EINVAL;
|
||||
omap_writel(val, clk->enable_reg);
|
||||
clk->rate = rate;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ext_clk_rate(struct clk * clk, unsigned long rate)
|
||||
{
|
||||
|
@ -985,7 +1125,18 @@ void clk_unregister(struct clk *clk)
|
|||
}
|
||||
EXPORT_SYMBOL(clk_unregister);
|
||||
|
||||
|
||||
#ifdef CONFIG_OMAP_RESET_CLOCKS
|
||||
/*
|
||||
* Resets some clocks that may be left on from bootloader,
|
||||
* but leaves serial clocks on. See also omap_late_clk_reset().
|
||||
*/
|
||||
static inline void omap_early_clk_reset(void)
|
||||
{
|
||||
//omap_writel(0x3 << 29, MOD_CONF_CTRL_0);
|
||||
}
|
||||
#else
|
||||
#define omap_early_clk_reset() {}
|
||||
#endif
|
||||
|
||||
int __init clk_init(void)
|
||||
{
|
||||
|
@ -993,6 +1144,8 @@ int __init clk_init(void)
|
|||
const struct omap_clock_config *info;
|
||||
int crystal_type = 0; /* Default 12 MHz */
|
||||
|
||||
omap_early_clk_reset();
|
||||
|
||||
for (clkp = onchip_clks; clkp < onchip_clks+ARRAY_SIZE(onchip_clks); clkp++) {
|
||||
if (((*clkp)->flags &CLOCK_IN_OMAP1510) && cpu_is_omap1510()) {
|
||||
clk_register(*clkp);
|
||||
|
@ -1023,9 +1176,42 @@ int __init clk_init(void)
|
|||
ck_ref.rate = 19200000;
|
||||
#endif
|
||||
|
||||
printk("Clocks: ARM_SYSST: 0x%04x DPLL_CTL: 0x%04x ARM_CKCTL: 0x%04x\n",
|
||||
omap_readw(ARM_SYSST), omap_readw(DPLL_CTL),
|
||||
omap_readw(ARM_CKCTL));
|
||||
|
||||
/* We want to be in syncronous scalable mode */
|
||||
omap_writew(0x1000, ARM_SYSST);
|
||||
|
||||
#ifdef CONFIG_OMAP_CLOCKS_SET_BY_BOOTLOADER
|
||||
/* Use values set by bootloader. Determine PLL rate and recalculate
|
||||
* dependent clocks as if kernel had changed PLL or divisors.
|
||||
*/
|
||||
{
|
||||
unsigned pll_ctl_val = omap_readw(DPLL_CTL);
|
||||
|
||||
ck_dpll1.rate = ck_ref.rate; /* Base xtal rate */
|
||||
if (pll_ctl_val & 0x10) {
|
||||
/* PLL enabled, apply multiplier and divisor */
|
||||
if (pll_ctl_val & 0xf80)
|
||||
ck_dpll1.rate *= (pll_ctl_val & 0xf80) >> 7;
|
||||
ck_dpll1.rate /= ((pll_ctl_val & 0x60) >> 5) + 1;
|
||||
} else {
|
||||
/* PLL disabled, apply bypass divisor */
|
||||
switch (pll_ctl_val & 0xc) {
|
||||
case 0:
|
||||
break;
|
||||
case 0x4:
|
||||
ck_dpll1.rate /= 2;
|
||||
break;
|
||||
default:
|
||||
ck_dpll1.rate /= 4;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
propagate_rate(&ck_dpll1);
|
||||
#else
|
||||
/* Find the highest supported frequency and enable it */
|
||||
if (select_table_rate(&virtual_ck_mpu, ~0)) {
|
||||
printk(KERN_ERR "System frequencies not set. Check your config.\n");
|
||||
|
@ -1034,12 +1220,13 @@ int __init clk_init(void)
|
|||
omap_writew(0x1005, ARM_CKCTL);
|
||||
ck_dpll1.rate = 60000000;
|
||||
propagate_rate(&ck_dpll1);
|
||||
printk(KERN_INFO "Clocking rate (xtal/DPLL1/MPU): %ld/%ld/%ld\n",
|
||||
ck_ref.rate, ck_dpll1.rate, arm_ck.rate);
|
||||
}
|
||||
|
||||
#endif
|
||||
/* Cache rates for clocks connected to ck_ref (not dpll1) */
|
||||
propagate_rate(&ck_ref);
|
||||
printk(KERN_INFO "Clocking rate (xtal/DPLL1/MPU): %ld.%01ld/%ld/%ld MHz\n",
|
||||
ck_ref.rate / 1000000, (ck_ref.rate / 100000) % 10,
|
||||
ck_dpll1.rate, arm_ck.rate);
|
||||
|
||||
#ifdef CONFIG_MACH_OMAP_PERSEUS2
|
||||
/* Select slicer output as OMAP input clock */
|
||||
|
@ -1074,3 +1261,63 @@ int __init clk_init(void)
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_OMAP_RESET_CLOCKS
|
||||
|
||||
static int __init omap_late_clk_reset(void)
|
||||
{
|
||||
/* Turn off all unused clocks */
|
||||
struct clk *p;
|
||||
__u32 regval32;
|
||||
|
||||
omap_writew(0, SOFT_REQ_REG);
|
||||
omap_writew(0, SOFT_REQ_REG2);
|
||||
|
||||
list_for_each_entry(p, &clocks, node) {
|
||||
if (p->usecount > 0 || (p->flags & ALWAYS_ENABLED) ||
|
||||
p->enable_reg == 0)
|
||||
continue;
|
||||
|
||||
/* Assume no DSP clocks have been activated by bootloader */
|
||||
if (p->flags & DSP_DOMAIN_CLOCK)
|
||||
continue;
|
||||
|
||||
/* Is the clock already disabled? */
|
||||
if (p->flags & ENABLE_REG_32BIT) {
|
||||
if (p->flags & VIRTUAL_IO_ADDRESS)
|
||||
regval32 = __raw_readl(p->enable_reg);
|
||||
else
|
||||
regval32 = omap_readl(p->enable_reg);
|
||||
} else {
|
||||
if (p->flags & VIRTUAL_IO_ADDRESS)
|
||||
regval32 = __raw_readw(p->enable_reg);
|
||||
else
|
||||
regval32 = omap_readw(p->enable_reg);
|
||||
}
|
||||
|
||||
if ((regval32 & (1 << p->enable_bit)) == 0)
|
||||
continue;
|
||||
|
||||
/* FIXME: This clock seems to be necessary but no-one
|
||||
* has asked for its activation. */
|
||||
if (p == &tc2_ck // FIX: pm.c (SRAM), CCP, Camera
|
||||
|| p == &ck_dpll1out // FIX: SoSSI, SSR
|
||||
|| p == &arm_gpio_ck // FIX: GPIO code for 1510
|
||||
) {
|
||||
printk(KERN_INFO "FIXME: Clock \"%s\" seems unused\n",
|
||||
p->name);
|
||||
continue;
|
||||
}
|
||||
|
||||
printk(KERN_INFO "Disabling unused clock \"%s\"... ", p->name);
|
||||
__clk_disable(p);
|
||||
printk(" done\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
late_initcall(omap_late_clk_reset);
|
||||
|
||||
#endif
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-omap/clock.h
|
||||
* linux/arch/arm/plat-omap/clock.h
|
||||
*
|
||||
* Copyright (C) 2004 Nokia corporation
|
||||
* Written by Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
|
||||
|
@ -52,6 +52,8 @@ struct mpu_rate {
|
|||
#define CLOCK_IN_OMAP16XX 64
|
||||
#define CLOCK_IN_OMAP1510 128
|
||||
#define CLOCK_IN_OMAP730 256
|
||||
#define DSP_DOMAIN_CLOCK 512
|
||||
#define VIRTUAL_IO_ADDRESS 1024
|
||||
|
||||
/* ARM_CKCTL bit shifts */
|
||||
#define CKCTL_PERDIV_OFFSET 0
|
||||
|
@ -63,6 +65,8 @@ struct mpu_rate {
|
|||
/*#define ARM_TIMXO 12*/
|
||||
#define EN_DSPCK 13
|
||||
/*#define ARM_INTHCK_SEL 14*/ /* Divide-by-2 for mpu inth_ck */
|
||||
/* DSP_CKCTL bit shifts */
|
||||
#define CKCTL_DSPPERDIV_OFFSET 0
|
||||
|
||||
/* ARM_IDLECT1 bit shifts */
|
||||
/*#define IDLWDT_ARM 0*/
|
||||
|
@ -96,6 +100,9 @@ struct mpu_rate {
|
|||
#define EN_TC1_CK 2
|
||||
#define EN_TC2_CK 4
|
||||
|
||||
/* DSP_IDLECT2 bit shifts (0,1,2 are same as for ARM_IDLECT2) */
|
||||
#define EN_DSPTIMCK 5
|
||||
|
||||
/* Various register defines for clock controls scattered around OMAP chip */
|
||||
#define USB_MCLK_EN_BIT 4 /* In ULPD_CLKC_CTRL */
|
||||
#define USB_HOST_HHC_UHOST_EN 9 /* In MOD_CONF_CTRL_0 */
|
||||
|
@ -103,7 +110,8 @@ struct mpu_rate {
|
|||
#define COM_ULPD_PLL_CLK_REQ 1 /* In COM_CLK_DIV_CTRL_SEL */
|
||||
#define SWD_CLK_DIV_CTRL_SEL 0xfffe0874
|
||||
#define COM_CLK_DIV_CTRL_SEL 0xfffe0878
|
||||
|
||||
#define SOFT_REQ_REG 0xfffe0834
|
||||
#define SOFT_REQ_REG2 0xfffe0880
|
||||
|
||||
int clk_register(struct clk *clk);
|
||||
void clk_unregister(struct clk *clk);
|
|
@ -0,0 +1,135 @@
|
|||
/*
|
||||
* linux/arch/arm/plat-omap/common.c
|
||||
*
|
||||
* Code common to all OMAP machines.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#include <linux/config.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/serial.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/serial_8250.h>
|
||||
#include <linux/serial_reg.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/hardware/clock.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include <asm/arch/board.h>
|
||||
#include <asm/arch/mux.h>
|
||||
#include <asm/arch/fpga.h>
|
||||
|
||||
#include "clock.h"
|
||||
|
||||
#define NO_LENGTH_CHECK 0xffffffff
|
||||
|
||||
extern int omap_bootloader_tag_len;
|
||||
extern u8 omap_bootloader_tag[];
|
||||
|
||||
struct omap_board_config_kernel *omap_board_config;
|
||||
int omap_board_config_size = 0;
|
||||
|
||||
static const void *get_config(u16 tag, size_t len, int skip, size_t *len_out)
|
||||
{
|
||||
struct omap_board_config_kernel *kinfo = NULL;
|
||||
int i;
|
||||
|
||||
#ifdef CONFIG_OMAP_BOOT_TAG
|
||||
struct omap_board_config_entry *info = NULL;
|
||||
|
||||
if (omap_bootloader_tag_len > 4)
|
||||
info = (struct omap_board_config_entry *) omap_bootloader_tag;
|
||||
while (info != NULL) {
|
||||
u8 *next;
|
||||
|
||||
if (info->tag == tag) {
|
||||
if (skip == 0)
|
||||
break;
|
||||
skip--;
|
||||
}
|
||||
|
||||
if ((info->len & 0x03) != 0) {
|
||||
/* We bail out to avoid an alignment fault */
|
||||
printk(KERN_ERR "OMAP peripheral config: Length (%d) not word-aligned (tag %04x)\n",
|
||||
info->len, info->tag);
|
||||
return NULL;
|
||||
}
|
||||
next = (u8 *) info + sizeof(*info) + info->len;
|
||||
if (next >= omap_bootloader_tag + omap_bootloader_tag_len)
|
||||
info = NULL;
|
||||
else
|
||||
info = (struct omap_board_config_entry *) next;
|
||||
}
|
||||
if (info != NULL) {
|
||||
/* Check the length as a lame attempt to check for
|
||||
* binary inconsistancy. */
|
||||
if (len != NO_LENGTH_CHECK) {
|
||||
/* Word-align len */
|
||||
if (len & 0x03)
|
||||
len = (len + 3) & ~0x03;
|
||||
if (info->len != len) {
|
||||
printk(KERN_ERR "OMAP peripheral config: Length mismatch with tag %x (want %d, got %d)\n",
|
||||
tag, len, info->len);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
if (len_out != NULL)
|
||||
*len_out = info->len;
|
||||
return info->data;
|
||||
}
|
||||
#endif
|
||||
/* Try to find the config from the board-specific structures
|
||||
* in the kernel. */
|
||||
for (i = 0; i < omap_board_config_size; i++) {
|
||||
if (omap_board_config[i].tag == tag) {
|
||||
kinfo = &omap_board_config[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (kinfo == NULL)
|
||||
return NULL;
|
||||
return kinfo->data;
|
||||
}
|
||||
|
||||
const void *__omap_get_config(u16 tag, size_t len, int nr)
|
||||
{
|
||||
return get_config(tag, len, nr, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL(__omap_get_config);
|
||||
|
||||
const void *omap_get_var_config(u16 tag, size_t *len)
|
||||
{
|
||||
return get_config(tag, NO_LENGTH_CHECK, 0, len);
|
||||
}
|
||||
EXPORT_SYMBOL(omap_get_var_config);
|
||||
|
||||
static int __init omap_add_serial_console(void)
|
||||
{
|
||||
const struct omap_serial_console_config *info;
|
||||
|
||||
info = omap_get_config(OMAP_TAG_SERIAL_CONSOLE,
|
||||
struct omap_serial_console_config);
|
||||
if (info != NULL && info->console_uart) {
|
||||
static char speed[11], *opt = NULL;
|
||||
|
||||
if (info->console_speed) {
|
||||
snprintf(speed, sizeof(speed), "%u", info->console_speed);
|
||||
opt = speed;
|
||||
}
|
||||
return add_preferred_console("ttyS", info->console_uart - 1, opt);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
console_initcall(omap_add_serial_console);
|
|
@ -0,0 +1,128 @@
|
|||
/*
|
||||
* linux/arch/arm/plat-omap/cpu-omap.c
|
||||
*
|
||||
* CPU frequency scaling for OMAP
|
||||
*
|
||||
* Copyright (C) 2005 Nokia Corporation
|
||||
* Written by Tony Lindgren <tony@atomide.com>
|
||||
*
|
||||
* Based on cpu-sa1110.c, Copyright (C) 2001 Russell King
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/cpufreq.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/err.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#include <asm/hardware/clock.h>
|
||||
|
||||
/* TODO: Add support for SDRAM timing changes */
|
||||
|
||||
int omap_verify_speed(struct cpufreq_policy *policy)
|
||||
{
|
||||
struct clk * mpu_clk;
|
||||
|
||||
if (policy->cpu)
|
||||
return -EINVAL;
|
||||
|
||||
cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq,
|
||||
policy->cpuinfo.max_freq);
|
||||
mpu_clk = clk_get(NULL, "mpu");
|
||||
if (IS_ERR(mpu_clk))
|
||||
return PTR_ERR(mpu_clk);
|
||||
policy->min = clk_round_rate(mpu_clk, policy->min * 1000) / 1000;
|
||||
policy->max = clk_round_rate(mpu_clk, policy->max * 1000) / 1000;
|
||||
cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq,
|
||||
policy->cpuinfo.max_freq);
|
||||
clk_put(mpu_clk);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned int omap_getspeed(unsigned int cpu)
|
||||
{
|
||||
struct clk * mpu_clk;
|
||||
unsigned long rate;
|
||||
|
||||
if (cpu)
|
||||
return 0;
|
||||
|
||||
mpu_clk = clk_get(NULL, "mpu");
|
||||
if (IS_ERR(mpu_clk))
|
||||
return 0;
|
||||
rate = clk_get_rate(mpu_clk) / 1000;
|
||||
clk_put(mpu_clk);
|
||||
|
||||
return rate;
|
||||
}
|
||||
|
||||
static int omap_target(struct cpufreq_policy *policy,
|
||||
unsigned int target_freq,
|
||||
unsigned int relation)
|
||||
{
|
||||
struct clk * mpu_clk;
|
||||
struct cpufreq_freqs freqs;
|
||||
int ret = 0;
|
||||
|
||||
mpu_clk = clk_get(NULL, "mpu");
|
||||
if (IS_ERR(mpu_clk))
|
||||
return PTR_ERR(mpu_clk);
|
||||
|
||||
freqs.old = omap_getspeed(0);
|
||||
freqs.new = clk_round_rate(mpu_clk, target_freq * 1000) / 1000;
|
||||
freqs.cpu = 0;
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||
ret = clk_set_rate(mpu_clk, target_freq * 1000);
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
clk_put(mpu_clk);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __init omap_cpu_init(struct cpufreq_policy *policy)
|
||||
{
|
||||
struct clk * mpu_clk;
|
||||
|
||||
mpu_clk = clk_get(NULL, "mpu");
|
||||
if (IS_ERR(mpu_clk))
|
||||
return PTR_ERR(mpu_clk);
|
||||
|
||||
if (policy->cpu != 0)
|
||||
return -EINVAL;
|
||||
policy->cur = policy->min = policy->max = omap_getspeed(0);
|
||||
policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
|
||||
policy->cpuinfo.min_freq = clk_round_rate(mpu_clk, 0) / 1000;
|
||||
policy->cpuinfo.max_freq = clk_round_rate(mpu_clk, 216000000) / 1000;
|
||||
policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL;
|
||||
clk_put(mpu_clk);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct cpufreq_driver omap_driver = {
|
||||
.flags = CPUFREQ_STICKY,
|
||||
.verify = omap_verify_speed,
|
||||
.target = omap_target,
|
||||
.get = omap_getspeed,
|
||||
.init = omap_cpu_init,
|
||||
.name = "omap",
|
||||
};
|
||||
|
||||
static int __init omap_cpufreq_init(void)
|
||||
{
|
||||
return cpufreq_register_driver(&omap_driver);
|
||||
}
|
||||
|
||||
arch_initcall(omap_cpufreq_init);
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/omap/dma.c
|
||||
* linux/arch/arm/plat-omap/dma.c
|
||||
*
|
||||
* Copyright (C) 2003 Nokia Corporation
|
||||
* Author: Juha Yrjölä <juha.yrjola@nokia.com>
|
||||
|
@ -794,10 +794,6 @@ static void set_b1_regs(void)
|
|||
w = omap_readw(OMAP1610_DMA_LCD_CTRL);
|
||||
/* Always set the source port as SDRAM for now*/
|
||||
w &= ~(0x03 << 6);
|
||||
if (lcd_dma.ext_ctrl)
|
||||
w |= 1 << 8;
|
||||
else
|
||||
w &= ~(1 << 8);
|
||||
if (lcd_dma.callback != NULL)
|
||||
w |= 1 << 1; /* Block interrupt enable */
|
||||
else
|
||||
|
@ -889,9 +885,15 @@ void omap_enable_lcd_dma(void)
|
|||
*/
|
||||
if (enable_1510_mode || !lcd_dma.ext_ctrl)
|
||||
return;
|
||||
|
||||
w = omap_readw(OMAP1610_DMA_LCD_CTRL);
|
||||
w |= 1 << 8;
|
||||
omap_writew(w, OMAP1610_DMA_LCD_CTRL);
|
||||
|
||||
w = omap_readw(OMAP1610_DMA_LCD_CCR);
|
||||
w |= 1 << 7;
|
||||
omap_writew(w, OMAP1610_DMA_LCD_CCR);
|
||||
|
||||
lcd_dma.active = 1;
|
||||
}
|
||||
|
||||
|
@ -922,10 +924,19 @@ void omap_setup_lcd_dma(void)
|
|||
|
||||
void omap_stop_lcd_dma(void)
|
||||
{
|
||||
u16 w;
|
||||
|
||||
lcd_dma.active = 0;
|
||||
if (!enable_1510_mode && lcd_dma.ext_ctrl)
|
||||
omap_writew(omap_readw(OMAP1610_DMA_LCD_CCR) & ~(1 << 7),
|
||||
OMAP1610_DMA_LCD_CCR);
|
||||
if (enable_1510_mode || !lcd_dma.ext_ctrl)
|
||||
return;
|
||||
|
||||
w = omap_readw(OMAP1610_DMA_LCD_CCR);
|
||||
w &= ~(1 << 7);
|
||||
omap_writew(w, OMAP1610_DMA_LCD_CCR);
|
||||
|
||||
w = omap_readw(OMAP1610_DMA_LCD_CTRL);
|
||||
w &= ~(1 << 8);
|
||||
omap_writew(w, OMAP1610_DMA_LCD_CTRL);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -972,6 +983,25 @@ dma_addr_t omap_get_dma_dst_pos(int lch)
|
|||
(OMAP_DMA_CDSA_U(lch) << 16));
|
||||
}
|
||||
|
||||
int omap_dma_running(void)
|
||||
{
|
||||
int lch;
|
||||
|
||||
/* Check if LCD DMA is running */
|
||||
if (cpu_is_omap16xx())
|
||||
if (omap_readw(OMAP1610_DMA_LCD_CCR) & OMAP_DMA_CCR_EN)
|
||||
return 1;
|
||||
|
||||
for (lch = 0; lch < dma_chan_count; lch++) {
|
||||
u16 w;
|
||||
|
||||
w = omap_readw(OMAP_DMA_CCR(lch));
|
||||
if (w & OMAP_DMA_CCR_EN)
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init omap_init_dma(void)
|
||||
{
|
||||
int ch, r;
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-omap/gpio.c
|
||||
* linux/arch/arm/plat-omap/gpio.c
|
||||
*
|
||||
* Support functions for OMAP GPIO
|
||||
*
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/omap/mcbsp.c
|
||||
* linux/arch/arm/plat-omap/mcbsp.c
|
||||
*
|
||||
* Copyright (C) 2004 Nokia Corporation
|
||||
* Author: Samuel Ortiz <samuel.ortiz@nokia.com>
|
||||
|
@ -66,6 +66,7 @@ struct omap_mcbsp {
|
|||
static struct omap_mcbsp mcbsp[OMAP_MAX_MCBSP_COUNT];
|
||||
static struct clk *mcbsp_dsp_ck = 0;
|
||||
static struct clk *mcbsp_api_ck = 0;
|
||||
static struct clk *mcbsp_dspxor_ck = 0;
|
||||
|
||||
|
||||
static void omap_mcbsp_dump_reg(u8 id)
|
||||
|
@ -175,7 +176,7 @@ static int omap_mcbsp_check(unsigned int id)
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (cpu_is_omap1510() || cpu_is_omap1610() || cpu_is_omap1710()) {
|
||||
if (cpu_is_omap1510() || cpu_is_omap16xx()) {
|
||||
if (id > OMAP_MAX_MCBSP_COUNT) {
|
||||
printk(KERN_ERR "OMAP-McBSP: McBSP%d doesn't exist\n", id + 1);
|
||||
return -1;
|
||||
|
@ -191,15 +192,12 @@ static int omap_mcbsp_check(unsigned int id)
|
|||
|
||||
static void omap_mcbsp_dsp_request(void)
|
||||
{
|
||||
if (cpu_is_omap1510() || cpu_is_omap1610() || cpu_is_omap1710()) {
|
||||
omap_writew((omap_readw(ARM_RSTCT1) | (1 << 1) | (1 << 2)),
|
||||
ARM_RSTCT1);
|
||||
clk_enable(mcbsp_dsp_ck);
|
||||
clk_enable(mcbsp_api_ck);
|
||||
if (cpu_is_omap1510() || cpu_is_omap16xx()) {
|
||||
clk_use(mcbsp_dsp_ck);
|
||||
clk_use(mcbsp_api_ck);
|
||||
|
||||
/* enable 12MHz clock to mcbsp 1 & 3 */
|
||||
__raw_writew(__raw_readw(DSP_IDLECT2) | (1 << EN_XORPCK),
|
||||
DSP_IDLECT2);
|
||||
clk_use(mcbsp_dspxor_ck);
|
||||
__raw_writew(__raw_readw(DSP_RSTCT2) | 1 | 1 << 1,
|
||||
DSP_RSTCT2);
|
||||
}
|
||||
|
@ -207,10 +205,13 @@ static void omap_mcbsp_dsp_request(void)
|
|||
|
||||
static void omap_mcbsp_dsp_free(void)
|
||||
{
|
||||
/* Useless for now */
|
||||
if (cpu_is_omap1510() || cpu_is_omap16xx()) {
|
||||
clk_unuse(mcbsp_dspxor_ck);
|
||||
clk_unuse(mcbsp_dsp_ck);
|
||||
clk_unuse(mcbsp_api_ck);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int omap_mcbsp_request(unsigned int id)
|
||||
{
|
||||
int err;
|
||||
|
@ -350,6 +351,73 @@ void omap_mcbsp_stop(unsigned int id)
|
|||
}
|
||||
|
||||
|
||||
/* polled mcbsp i/o operations */
|
||||
int omap_mcbsp_pollwrite(unsigned int id, u16 buf)
|
||||
{
|
||||
u32 base = mcbsp[id].io_base;
|
||||
writew(buf, base + OMAP_MCBSP_REG_DXR1);
|
||||
/* if frame sync error - clear the error */
|
||||
if (readw(base + OMAP_MCBSP_REG_SPCR2) & XSYNC_ERR) {
|
||||
/* clear error */
|
||||
writew(readw(base + OMAP_MCBSP_REG_SPCR2) & (~XSYNC_ERR),
|
||||
base + OMAP_MCBSP_REG_SPCR2);
|
||||
/* resend */
|
||||
return -1;
|
||||
} else {
|
||||
/* wait for transmit confirmation */
|
||||
int attemps = 0;
|
||||
while (!(readw(base + OMAP_MCBSP_REG_SPCR2) & XRDY)) {
|
||||
if (attemps++ > 1000) {
|
||||
writew(readw(base + OMAP_MCBSP_REG_SPCR2) &
|
||||
(~XRST),
|
||||
base + OMAP_MCBSP_REG_SPCR2);
|
||||
udelay(10);
|
||||
writew(readw(base + OMAP_MCBSP_REG_SPCR2) |
|
||||
(XRST),
|
||||
base + OMAP_MCBSP_REG_SPCR2);
|
||||
udelay(10);
|
||||
printk(KERN_ERR
|
||||
" Could not write to McBSP Register\n");
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int omap_mcbsp_pollread(unsigned int id, u16 * buf)
|
||||
{
|
||||
u32 base = mcbsp[id].io_base;
|
||||
/* if frame sync error - clear the error */
|
||||
if (readw(base + OMAP_MCBSP_REG_SPCR1) & RSYNC_ERR) {
|
||||
/* clear error */
|
||||
writew(readw(base + OMAP_MCBSP_REG_SPCR1) & (~RSYNC_ERR),
|
||||
base + OMAP_MCBSP_REG_SPCR1);
|
||||
/* resend */
|
||||
return -1;
|
||||
} else {
|
||||
/* wait for recieve confirmation */
|
||||
int attemps = 0;
|
||||
while (!(readw(base + OMAP_MCBSP_REG_SPCR1) & RRDY)) {
|
||||
if (attemps++ > 1000) {
|
||||
writew(readw(base + OMAP_MCBSP_REG_SPCR1) &
|
||||
(~RRST),
|
||||
base + OMAP_MCBSP_REG_SPCR1);
|
||||
udelay(10);
|
||||
writew(readw(base + OMAP_MCBSP_REG_SPCR1) |
|
||||
(RRST),
|
||||
base + OMAP_MCBSP_REG_SPCR1);
|
||||
udelay(10);
|
||||
printk(KERN_ERR
|
||||
" Could not read from McBSP Register\n");
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
}
|
||||
*buf = readw(base + OMAP_MCBSP_REG_DRR1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* IRQ based word transmission.
|
||||
*/
|
||||
|
@ -625,10 +693,15 @@ static int __init omap_mcbsp_init(void)
|
|||
return PTR_ERR(mcbsp_dsp_ck);
|
||||
}
|
||||
mcbsp_api_ck = clk_get(0, "api_ck");
|
||||
if (IS_ERR(mcbsp_dsp_ck)) {
|
||||
if (IS_ERR(mcbsp_api_ck)) {
|
||||
printk(KERN_ERR "mcbsp: could not acquire api_ck handle.\n");
|
||||
return PTR_ERR(mcbsp_api_ck);
|
||||
}
|
||||
mcbsp_dspxor_ck = clk_get(0, "dspxor_ck");
|
||||
if (IS_ERR(mcbsp_dspxor_ck)) {
|
||||
printk(KERN_ERR "mcbsp: could not acquire dspxor_ck handle.\n");
|
||||
return PTR_ERR(mcbsp_dspxor_ck);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP730
|
||||
if (cpu_is_omap730()) {
|
||||
|
@ -643,7 +716,7 @@ static int __init omap_mcbsp_init(void)
|
|||
}
|
||||
#endif
|
||||
#if defined(CONFIG_ARCH_OMAP16XX)
|
||||
if (cpu_is_omap1610() || cpu_is_omap1710()) {
|
||||
if (cpu_is_omap16xx()) {
|
||||
mcbsp_info = mcbsp_1610;
|
||||
mcbsp_count = ARRAY_SIZE(mcbsp_1610);
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-omap/mux.c
|
||||
* linux/arch/arm/plat-omap/mux.c
|
||||
*
|
||||
* Utility to set the Omap MUX and PULL_DWN registers from a table in mux.h
|
||||
*
|
||||
|
@ -53,19 +53,13 @@ omap_cfg_reg(const reg_cfg_t reg_cfg)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
cfg = ®_cfg_table[reg_cfg];
|
||||
|
||||
/*
|
||||
* We do a pretty long section here with lock on, but pin muxing
|
||||
* should only happen on driver init for each driver, so it's not time
|
||||
* critical.
|
||||
*/
|
||||
spin_lock_irqsave(&mux_spin_lock, flags);
|
||||
cfg = (reg_cfg_set *)®_cfg_table[reg_cfg];
|
||||
|
||||
/* Check the mux register in question */
|
||||
if (cfg->mux_reg) {
|
||||
unsigned tmp1, tmp2;
|
||||
|
||||
spin_lock_irqsave(&mux_spin_lock, flags);
|
||||
reg_orig = omap_readl(cfg->mux_reg);
|
||||
|
||||
/* The mux registers always seem to be 3 bits long */
|
||||
|
@ -80,11 +74,13 @@ omap_cfg_reg(const reg_cfg_t reg_cfg)
|
|||
warn = 1;
|
||||
|
||||
omap_writel(reg, cfg->mux_reg);
|
||||
spin_unlock_irqrestore(&mux_spin_lock, flags);
|
||||
}
|
||||
|
||||
/* Check for pull up or pull down selection on 1610 */
|
||||
if (!cpu_is_omap1510()) {
|
||||
if (cfg->pu_pd_reg && cfg->pull_val) {
|
||||
spin_lock_irqsave(&mux_spin_lock, flags);
|
||||
pu_pd_orig = omap_readl(cfg->pu_pd_reg);
|
||||
mask = 1 << cfg->pull_bit;
|
||||
|
||||
|
@ -100,11 +96,13 @@ omap_cfg_reg(const reg_cfg_t reg_cfg)
|
|||
pu_pd = pu_pd_orig & ~mask;
|
||||
}
|
||||
omap_writel(pu_pd, cfg->pu_pd_reg);
|
||||
spin_unlock_irqrestore(&mux_spin_lock, flags);
|
||||
}
|
||||
}
|
||||
|
||||
/* Check for an associated pull down register */
|
||||
if (cfg->pull_reg) {
|
||||
spin_lock_irqsave(&mux_spin_lock, flags);
|
||||
pull_orig = omap_readl(cfg->pull_reg);
|
||||
mask = 1 << cfg->pull_bit;
|
||||
|
||||
|
@ -121,6 +119,7 @@ omap_cfg_reg(const reg_cfg_t reg_cfg)
|
|||
}
|
||||
|
||||
omap_writel(pull, cfg->pull_reg);
|
||||
spin_unlock_irqrestore(&mux_spin_lock, flags);
|
||||
}
|
||||
|
||||
if (warn) {
|
||||
|
@ -149,8 +148,6 @@ omap_cfg_reg(const reg_cfg_t reg_cfg)
|
|||
}
|
||||
#endif
|
||||
|
||||
spin_unlock_irqrestore(&mux_spin_lock, flags);
|
||||
|
||||
#ifdef CONFIG_OMAP_MUX_ERRORS
|
||||
return warn ? -ETXTBSY : 0;
|
||||
#else
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-omap/ocpi.c
|
||||
* linux/arch/arm/plat-omap/ocpi.c
|
||||
*
|
||||
* Minimal OCP bus support for omap16xx
|
||||
*
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-omap/pm.c
|
||||
* linux/arch/arm/plat-omap/pm.c
|
||||
*
|
||||
* OMAP Power Management Routines
|
||||
*
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-omap/sleep.S
|
||||
* linux/arch/arm/plat-omap/sleep.S
|
||||
*
|
||||
* Low-level OMAP1510/1610 sleep/wakeUp support
|
||||
*
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* arch/arm/mach-omap/usb.c -- platform level USB initialization
|
||||
* arch/arm/plat-omap/usb.c -- platform level USB initialization
|
||||
*
|
||||
* Copyright (C) 2004 Texas Instruments, Inc.
|
||||
*
|
||||
|
@ -326,7 +326,7 @@ static u64 ohci_dmamask = ~(u32)0;
|
|||
static struct resource ohci_resources[] = {
|
||||
{
|
||||
.start = OMAP_OHCI_BASE,
|
||||
.end = OMAP_OHCI_BASE + 4096,
|
||||
.end = OMAP_OHCI_BASE + 4096 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
|
@ -0,0 +1,627 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.11.8
|
||||
# Fri May 13 17:16:03 2005
|
||||
#
|
||||
CONFIG_FRV=y
|
||||
CONFIG_UID16=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
CONFIG_GENERIC_FIND_NEXT_BIT=y
|
||||
# CONFIG_GENERIC_CALIBRATE_DELAY is not set
|
||||
# CONFIG_GENERIC_HARDIRQS is not set
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_CLEAN_COMPILE=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
# General setup
|
||||
#
|
||||
CONFIG_LOCALVERSION=""
|
||||
CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_POSIX_MQUEUE=y
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_AUDIT is not set
|
||||
# CONFIG_HOTPLUG is not set
|
||||
# CONFIG_KOBJECT_UEVENT is not set
|
||||
# CONFIG_IKCONFIG is not set
|
||||
CONFIG_EMBEDDED=y
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_CC_ALIGN_FUNCTIONS=0
|
||||
CONFIG_CC_ALIGN_LABELS=0
|
||||
CONFIG_CC_ALIGN_LOOPS=0
|
||||
CONFIG_CC_ALIGN_JUMPS=0
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
|
||||
#
|
||||
# Loadable module support
|
||||
#
|
||||
# CONFIG_MODULES is not set
|
||||
|
||||
#
|
||||
# Fujitsu FR-V system setup
|
||||
#
|
||||
CONFIG_MMU=y
|
||||
CONFIG_FRV_OUTOFLINE_ATOMIC_OPS=y
|
||||
CONFIG_HIGHMEM=y
|
||||
CONFIG_HIGHPTE=y
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_FRV_DEFL_CACHE_WBACK is not set
|
||||
# CONFIG_FRV_DEFL_CACHE_WBEHIND is not set
|
||||
CONFIG_FRV_DEFL_CACHE_WTHRU=y
|
||||
# CONFIG_FRV_DEFL_CACHE_DISABLED is not set
|
||||
|
||||
#
|
||||
# CPU core support
|
||||
#
|
||||
CONFIG_CPU_FR451=y
|
||||
CONFIG_CPU_FR451_COMPILE=y
|
||||
CONFIG_FRV_L1_CACHE_SHIFT=5
|
||||
CONFIG_MB93091_VDK=y
|
||||
# CONFIG_MB93093_PDK is not set
|
||||
CONFIG_MB93090_MB00=y
|
||||
# CONFIG_MB93091_NO_MB is not set
|
||||
# CONFIG_GPREL_DATA_8 is not set
|
||||
CONFIG_GPREL_DATA_4=y
|
||||
# CONFIG_GPREL_DATA_NONE is not set
|
||||
CONFIG_PCI=y
|
||||
# CONFIG_PCI_LEGACY_PROC is not set
|
||||
# CONFIG_PCI_NAMES is not set
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
# CONFIG_PCMCIA is not set
|
||||
|
||||
#
|
||||
# Power management options
|
||||
#
|
||||
# CONFIG_PM is not set
|
||||
|
||||
#
|
||||
# Executable formats
|
||||
#
|
||||
# CONFIG_BINFMT_ELF is not set
|
||||
CONFIG_BINFMT_ELF_FDPIC=y
|
||||
# CONFIG_BINFMT_MISC is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Generic Driver Options
|
||||
#
|
||||
# CONFIG_STANDALONE is not set
|
||||
# CONFIG_PREVENT_FIRMWARE_BUILD is not set
|
||||
# CONFIG_FW_LOADER is not set
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
|
||||
#
|
||||
# Connector - unified userspace <-> kernelspace linker
|
||||
#
|
||||
# CONFIG_CONNECTOR is not set
|
||||
# CONFIG_FORK_CONNECTOR is not set
|
||||
|
||||
#
|
||||
# Memory Technology Devices (MTD)
|
||||
#
|
||||
# CONFIG_MTD is not set
|
||||
|
||||
#
|
||||
# Parallel port support
|
||||
#
|
||||
# CONFIG_PARPORT is not set
|
||||
|
||||
#
|
||||
# Plug and Play support
|
||||
#
|
||||
|
||||
#
|
||||
# Block devices
|
||||
#
|
||||
# CONFIG_BLK_DEV_FD is not set
|
||||
# CONFIG_BLK_CPQ_DA is not set
|
||||
# CONFIG_BLK_CPQ_CISS_DA is not set
|
||||
# CONFIG_BLK_DEV_DAC960 is not set
|
||||
# CONFIG_BLK_DEV_UMEM is not set
|
||||
# CONFIG_BLK_DEV_COW_COMMON is not set
|
||||
# CONFIG_BLK_DEV_LOOP is not set
|
||||
# CONFIG_BLK_DEV_NBD is not set
|
||||
# CONFIG_BLK_DEV_SX8 is not set
|
||||
# CONFIG_BLK_DEV_RAM is not set
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
|
||||
#
|
||||
# ATA/ATAPI/MFM/RLL support
|
||||
#
|
||||
# CONFIG_IDE is not set
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
#
|
||||
# CONFIG_SCSI is not set
|
||||
|
||||
#
|
||||
# Multi-device support (RAID and LVM)
|
||||
#
|
||||
# CONFIG_MD is not set
|
||||
|
||||
#
|
||||
# Fusion MPT device support
|
||||
#
|
||||
# CONFIG_FUSION is not set
|
||||
|
||||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
#
|
||||
# CONFIG_IEEE1394 is not set
|
||||
|
||||
#
|
||||
# I2O device support
|
||||
#
|
||||
# CONFIG_I2O is not set
|
||||
|
||||
#
|
||||
# Networking support
|
||||
#
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
CONFIG_PACKET=y
|
||||
# CONFIG_PACKET_MMAP is not set
|
||||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
# CONFIG_IP_MULTICAST is not set
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_PNP=y
|
||||
# CONFIG_IP_PNP_DHCP is not set
|
||||
# CONFIG_IP_PNP_BOOTP is not set
|
||||
# CONFIG_IP_PNP_RARP is not set
|
||||
# CONFIG_NET_IPIP is not set
|
||||
# CONFIG_NET_IPGRE is not set
|
||||
# CONFIG_ARPD is not set
|
||||
# CONFIG_SYN_COOKIES is not set
|
||||
# CONFIG_INET_AH is not set
|
||||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
# CONFIG_IP_TCPDIAG is not set
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
#
|
||||
# SCTP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_SCTP is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
# CONFIG_VLAN_8021Q is not set
|
||||
# CONFIG_DECNET is not set
|
||||
# CONFIG_LLC2 is not set
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
# CONFIG_X25 is not set
|
||||
# CONFIG_LAPB is not set
|
||||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_NET_CLS_ROUTE is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_KGDBOE is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NETPOLL_RX is not set
|
||||
# CONFIG_NETPOLL_TRAP is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
# CONFIG_IEEE80211 is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_DUMMY is not set
|
||||
# CONFIG_BONDING is not set
|
||||
# CONFIG_EQUALIZER is not set
|
||||
# CONFIG_TUN is not set
|
||||
|
||||
#
|
||||
# ARCnet devices
|
||||
#
|
||||
# CONFIG_ARCNET is not set
|
||||
|
||||
#
|
||||
# Ethernet (10 or 100Mbit)
|
||||
#
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_MII=y
|
||||
# CONFIG_HAPPYMEAL is not set
|
||||
# CONFIG_SUNGEM is not set
|
||||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
|
||||
#
|
||||
# Tulip family network device support
|
||||
#
|
||||
# CONFIG_NET_TULIP is not set
|
||||
# CONFIG_HP100 is not set
|
||||
CONFIG_NET_PCI=y
|
||||
# CONFIG_PCNET32 is not set
|
||||
# CONFIG_AMD8111_ETH is not set
|
||||
# CONFIG_ADAPTEC_STARFIRE is not set
|
||||
# CONFIG_B44 is not set
|
||||
# CONFIG_FORCEDETH is not set
|
||||
# CONFIG_DGRS is not set
|
||||
# CONFIG_EEPRO100 is not set
|
||||
# CONFIG_E100 is not set
|
||||
# CONFIG_FEALNX is not set
|
||||
# CONFIG_NATSEMI is not set
|
||||
CONFIG_NE2K_PCI=y
|
||||
# CONFIG_8139CP is not set
|
||||
# CONFIG_8139TOO is not set
|
||||
# CONFIG_SIS900 is not set
|
||||
# CONFIG_EPIC100 is not set
|
||||
# CONFIG_SUNDANCE is not set
|
||||
# CONFIG_TLAN is not set
|
||||
# CONFIG_VIA_RHINE is not set
|
||||
|
||||
#
|
||||
# Ethernet (1000 Mbit)
|
||||
#
|
||||
# CONFIG_ACENIC is not set
|
||||
# CONFIG_DL2K is not set
|
||||
# CONFIG_E1000 is not set
|
||||
# CONFIG_NS83820 is not set
|
||||
# CONFIG_HAMACHI is not set
|
||||
# CONFIG_YELLOWFIN is not set
|
||||
# CONFIG_R8169 is not set
|
||||
# CONFIG_SKGE is not set
|
||||
# CONFIG_SK98LIN is not set
|
||||
# CONFIG_VIA_VELOCITY is not set
|
||||
# CONFIG_TIGON3 is not set
|
||||
|
||||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
#
|
||||
# CONFIG_CHELSIO_T1 is not set
|
||||
# CONFIG_IXGB is not set
|
||||
# CONFIG_S2IO is not set
|
||||
|
||||
#
|
||||
# Token Ring devices
|
||||
#
|
||||
# CONFIG_TR is not set
|
||||
|
||||
#
|
||||
# Wireless LAN (non-hamradio)
|
||||
#
|
||||
# CONFIG_NET_RADIO is not set
|
||||
|
||||
#
|
||||
# Wan interfaces
|
||||
#
|
||||
# CONFIG_WAN is not set
|
||||
# CONFIG_FDDI is not set
|
||||
# CONFIG_HIPPI is not set
|
||||
# CONFIG_PPP is not set
|
||||
# CONFIG_SLIP is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
# CONFIG_NETCONSOLE is not set
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
#
|
||||
# CONFIG_ISDN is not set
|
||||
|
||||
#
|
||||
# Telephony Support
|
||||
#
|
||||
# CONFIG_PHONE is not set
|
||||
|
||||
#
|
||||
# Input device support
|
||||
#
|
||||
# CONFIG_INPUT is not set
|
||||
|
||||
#
|
||||
# Hardware I/O ports
|
||||
#
|
||||
# CONFIG_SERIO is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
|
||||
#
|
||||
# Character devices
|
||||
#
|
||||
# CONFIG_VT is not set
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
# Serial drivers
|
||||
#
|
||||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=1
|
||||
CONFIG_SERIAL_8250_EXTENDED=y
|
||||
# CONFIG_SERIAL_8250_MANY_PORTS is not set
|
||||
CONFIG_SERIAL_8250_SHARE_IRQ=y
|
||||
# CONFIG_SERIAL_8250_DETECT_IRQ is not set
|
||||
# CONFIG_SERIAL_8250_MULTIPORT is not set
|
||||
# CONFIG_SERIAL_8250_RSA is not set
|
||||
|
||||
#
|
||||
# Non-8250 serial port support
|
||||
#
|
||||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
# CONFIG_SERIAL_JSM is not set
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
|
||||
#
|
||||
# IPMI
|
||||
#
|
||||
# CONFIG_IPMI_HANDLER is not set
|
||||
|
||||
#
|
||||
# Watchdog Cards
|
||||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_RTC is not set
|
||||
# CONFIG_GEN_RTC is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_APPLICOM is not set
|
||||
|
||||
#
|
||||
# Ftape, the floppy tape device driver
|
||||
#
|
||||
# CONFIG_DRM is not set
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
|
||||
#
|
||||
# TPM devices
|
||||
#
|
||||
# CONFIG_TCG_TPM is not set
|
||||
|
||||
#
|
||||
# I2C support
|
||||
#
|
||||
# CONFIG_I2C is not set
|
||||
|
||||
#
|
||||
# Dallas's 1-wire bus
|
||||
#
|
||||
# CONFIG_W1 is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
|
||||
#
|
||||
# Digital Video Broadcasting Devices
|
||||
#
|
||||
# CONFIG_DVB is not set
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
#
|
||||
# CONFIG_FB is not set
|
||||
|
||||
#
|
||||
# Sound
|
||||
#
|
||||
# CONFIG_SOUND is not set
|
||||
|
||||
#
|
||||
# USB support
|
||||
#
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
# CONFIG_USB is not set
|
||||
|
||||
#
|
||||
# USB Gadget Support
|
||||
#
|
||||
# CONFIG_USB_GADGET is not set
|
||||
|
||||
#
|
||||
# MMC/SD Card support
|
||||
#
|
||||
# CONFIG_MMC is not set
|
||||
|
||||
#
|
||||
# InfiniBand support
|
||||
#
|
||||
# CONFIG_INFINIBAND is not set
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
# CONFIG_EXT2_FS is not set
|
||||
# CONFIG_EXT3_FS is not set
|
||||
# CONFIG_JBD is not set
|
||||
# CONFIG_REISER4_FS is not set
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
|
||||
#
|
||||
# XFS support
|
||||
#
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
CONFIG_INOTIFY=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
|
||||
#
|
||||
# Caches
|
||||
#
|
||||
# CONFIG_FSCACHE is not set
|
||||
# CONFIG_FUSE_FS is not set
|
||||
|
||||
#
|
||||
# CD-ROM/DVD Filesystems
|
||||
#
|
||||
# CONFIG_ISO9660_FS is not set
|
||||
# CONFIG_UDF_FS is not set
|
||||
|
||||
#
|
||||
# DOS/FAT/NT Filesystems
|
||||
#
|
||||
# CONFIG_MSDOS_FS is not set
|
||||
# CONFIG_VFAT_FS is not set
|
||||
# CONFIG_NTFS_FS is not set
|
||||
|
||||
#
|
||||
# Pseudo filesystems
|
||||
#
|
||||
CONFIG_PROC_FS=y
|
||||
# CONFIG_PROC_KCORE is not set
|
||||
CONFIG_SYSFS=y
|
||||
# CONFIG_DEVFS_FS is not set
|
||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_TMPFS_XATTR is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_RELAYFS_FS is not set
|
||||
|
||||
#
|
||||
# Miscellaneous filesystems
|
||||
#
|
||||
# CONFIG_ADFS_FS is not set
|
||||
# CONFIG_AFFS_FS is not set
|
||||
# CONFIG_HFS_FS is not set
|
||||
# CONFIG_HFSPLUS_FS is not set
|
||||
# CONFIG_BEFS_FS is not set
|
||||
# CONFIG_BFS_FS is not set
|
||||
# CONFIG_EFS_FS is not set
|
||||
# CONFIG_CRAMFS is not set
|
||||
# CONFIG_VXFS_FS is not set
|
||||
# CONFIG_HPFS_FS is not set
|
||||
# CONFIG_QNX4FS_FS is not set
|
||||
# CONFIG_SYSV_FS is not set
|
||||
# CONFIG_UFS_FS is not set
|
||||
|
||||
#
|
||||
# Network File Systems
|
||||
#
|
||||
CONFIG_NFS_FS=y
|
||||
# CONFIG_NFS_V3 is not set
|
||||
# CONFIG_NFS_V4 is not set
|
||||
# CONFIG_NFS_DIRECTIO is not set
|
||||
# CONFIG_NFSD is not set
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_LOCKD=y
|
||||
CONFIG_NFS_COMMON=y
|
||||
CONFIG_SUNRPC=y
|
||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||
# CONFIG_SMB_FS is not set
|
||||
# CONFIG_CIFS is not set
|
||||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
|
||||
#
|
||||
# Partition Types
|
||||
#
|
||||
# CONFIG_PARTITION_ADVANCED is not set
|
||||
CONFIG_MSDOS_PARTITION=y
|
||||
|
||||
#
|
||||
# Native Language Support
|
||||
#
|
||||
# CONFIG_NLS is not set
|
||||
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
# CONFIG_MAGIC_SYSRQ is not set
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
# CONFIG_DEBUG_HIGHMEM is not set
|
||||
# CONFIG_DEBUG_BUGVERBOSE is not set
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
# CONFIG_FRAME_POINTER is not set
|
||||
# CONFIG_EARLY_PRINTK is not set
|
||||
CONFIG_DEBUG_STACKOVERFLOW=y
|
||||
# CONFIG_DEBUG_PAGEALLOC is not set
|
||||
# CONFIG_GDBSTUB is not set
|
||||
|
||||
#
|
||||
# Security options
|
||||
#
|
||||
# CONFIG_KEYS is not set
|
||||
# CONFIG_SECURITY is not set
|
||||
|
||||
#
|
||||
# Cryptographic options
|
||||
#
|
||||
# CONFIG_CRYPTO is not set
|
||||
|
||||
#
|
||||
# Hardware crypto devices
|
||||
#
|
||||
|
||||
#
|
||||
# Library routines
|
||||
#
|
||||
# CONFIG_CRC_CCITT is not set
|
||||
CONFIG_CRC32=y
|
||||
# CONFIG_LIBCRC32C is not set
|
|
@ -435,6 +435,11 @@ void __devinit identify_cpu(struct cpuinfo_x86 *c)
|
|||
if (c == &boot_cpu_data)
|
||||
sysenter_setup();
|
||||
enable_sep_cpu();
|
||||
|
||||
if (c == &boot_cpu_data)
|
||||
mtrr_bp_init();
|
||||
else
|
||||
mtrr_ap_init();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_HT
|
||||
|
|
|
@ -25,7 +25,7 @@ extern int trap_init_f00f_bug(void);
|
|||
/*
|
||||
* Alignment at which movsl is preferred for bulk memory copies.
|
||||
*/
|
||||
struct movsl_mask movsl_mask;
|
||||
struct movsl_mask movsl_mask __read_mostly;
|
||||
#endif
|
||||
|
||||
void __devinit early_intel_workaround(struct cpuinfo_x86 *c)
|
||||
|
|
|
@ -67,13 +67,6 @@ void __init get_mtrr_state(void)
|
|||
mtrr_state.enabled = (lo & 0xc00) >> 10;
|
||||
}
|
||||
|
||||
/* Free resources associated with a struct mtrr_state */
|
||||
void __init finalize_mtrr_state(void)
|
||||
{
|
||||
kfree(mtrr_state.var_ranges);
|
||||
mtrr_state.var_ranges = NULL;
|
||||
}
|
||||
|
||||
/* Some BIOS's are fucked and don't set all MTRRs the same! */
|
||||
void __init mtrr_state_warn(void)
|
||||
{
|
||||
|
@ -334,6 +327,9 @@ static void generic_set_mtrr(unsigned int reg, unsigned long base,
|
|||
*/
|
||||
{
|
||||
unsigned long flags;
|
||||
struct mtrr_var_range *vr;
|
||||
|
||||
vr = &mtrr_state.var_ranges[reg];
|
||||
|
||||
local_irq_save(flags);
|
||||
prepare_set();
|
||||
|
@ -342,11 +338,15 @@ static void generic_set_mtrr(unsigned int reg, unsigned long base,
|
|||
/* The invalid bit is kept in the mask, so we simply clear the
|
||||
relevant mask register to disable a range. */
|
||||
mtrr_wrmsr(MTRRphysMask_MSR(reg), 0, 0);
|
||||
memset(vr, 0, sizeof(struct mtrr_var_range));
|
||||
} else {
|
||||
mtrr_wrmsr(MTRRphysBase_MSR(reg), base << PAGE_SHIFT | type,
|
||||
(base & size_and_mask) >> (32 - PAGE_SHIFT));
|
||||
mtrr_wrmsr(MTRRphysMask_MSR(reg), -size << PAGE_SHIFT | 0x800,
|
||||
(-size & size_and_mask) >> (32 - PAGE_SHIFT));
|
||||
vr->base_lo = base << PAGE_SHIFT | type;
|
||||
vr->base_hi = (base & size_and_mask) >> (32 - PAGE_SHIFT);
|
||||
vr->mask_lo = -size << PAGE_SHIFT | 0x800;
|
||||
vr->mask_hi = (-size & size_and_mask) >> (32 - PAGE_SHIFT);
|
||||
|
||||
mtrr_wrmsr(MTRRphysBase_MSR(reg), vr->base_lo, vr->base_hi);
|
||||
mtrr_wrmsr(MTRRphysMask_MSR(reg), vr->mask_lo, vr->mask_hi);
|
||||
}
|
||||
|
||||
post_set();
|
||||
|
|
|
@ -332,6 +332,8 @@ int mtrr_add_page(unsigned long base, unsigned long size,
|
|||
|
||||
error = -EINVAL;
|
||||
|
||||
/* No CPU hotplug when we change MTRR entries */
|
||||
lock_cpu_hotplug();
|
||||
/* Search for existing MTRR */
|
||||
down(&main_lock);
|
||||
for (i = 0; i < num_var_ranges; ++i) {
|
||||
|
@ -372,6 +374,7 @@ int mtrr_add_page(unsigned long base, unsigned long size,
|
|||
error = i;
|
||||
out:
|
||||
up(&main_lock);
|
||||
unlock_cpu_hotplug();
|
||||
return error;
|
||||
}
|
||||
|
||||
|
@ -461,6 +464,8 @@ int mtrr_del_page(int reg, unsigned long base, unsigned long size)
|
|||
return -ENXIO;
|
||||
|
||||
max = num_var_ranges;
|
||||
/* No CPU hotplug when we change MTRR entries */
|
||||
lock_cpu_hotplug();
|
||||
down(&main_lock);
|
||||
if (reg < 0) {
|
||||
/* Search for existing MTRR */
|
||||
|
@ -501,6 +506,7 @@ int mtrr_del_page(int reg, unsigned long base, unsigned long size)
|
|||
error = reg;
|
||||
out:
|
||||
up(&main_lock);
|
||||
unlock_cpu_hotplug();
|
||||
return error;
|
||||
}
|
||||
/**
|
||||
|
@ -544,21 +550,9 @@ static void __init init_ifs(void)
|
|||
centaur_init_mtrr();
|
||||
}
|
||||
|
||||
static void __init init_other_cpus(void)
|
||||
{
|
||||
if (use_intel())
|
||||
get_mtrr_state();
|
||||
|
||||
/* bring up the other processors */
|
||||
set_mtrr(~0U,0,0,0);
|
||||
|
||||
if (use_intel()) {
|
||||
finalize_mtrr_state();
|
||||
mtrr_state_warn();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* The suspend/resume methods are only for CPU without MTRR. CPU using generic
|
||||
* MTRR driver doesn't require this
|
||||
*/
|
||||
struct mtrr_value {
|
||||
mtrr_type ltype;
|
||||
unsigned long lbase;
|
||||
|
@ -611,13 +605,13 @@ static struct sysdev_driver mtrr_sysdev_driver = {
|
|||
|
||||
|
||||
/**
|
||||
* mtrr_init - initialize mtrrs on the boot CPU
|
||||
* mtrr_bp_init - initialize mtrrs on the boot CPU
|
||||
*
|
||||
* This needs to be called early; before any of the other CPUs are
|
||||
* initialized (i.e. before smp_init()).
|
||||
*
|
||||
*/
|
||||
static int __init mtrr_init(void)
|
||||
void __init mtrr_bp_init(void)
|
||||
{
|
||||
init_ifs();
|
||||
|
||||
|
@ -674,12 +668,48 @@ static int __init mtrr_init(void)
|
|||
if (mtrr_if) {
|
||||
set_num_var_ranges();
|
||||
init_table();
|
||||
init_other_cpus();
|
||||
|
||||
return sysdev_driver_register(&cpu_sysdev_class,
|
||||
&mtrr_sysdev_driver);
|
||||
if (use_intel())
|
||||
get_mtrr_state();
|
||||
}
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
subsys_initcall(mtrr_init);
|
||||
void mtrr_ap_init(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (!mtrr_if || !use_intel())
|
||||
return;
|
||||
/*
|
||||
* Ideally we should hold main_lock here to avoid mtrr entries changed,
|
||||
* but this routine will be called in cpu boot time, holding the lock
|
||||
* breaks it. This routine is called in two cases: 1.very earily time
|
||||
* of software resume, when there absolutely isn't mtrr entry changes;
|
||||
* 2.cpu hotadd time. We let mtrr_add/del_page hold cpuhotplug lock to
|
||||
* prevent mtrr entry changes
|
||||
*/
|
||||
local_irq_save(flags);
|
||||
|
||||
mtrr_if->set_all();
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static int __init mtrr_init_finialize(void)
|
||||
{
|
||||
if (!mtrr_if)
|
||||
return 0;
|
||||
if (use_intel())
|
||||
mtrr_state_warn();
|
||||
else {
|
||||
/* The CPUs haven't MTRR and seemes not support SMP. They have
|
||||
* specific drivers, we use a tricky method to support
|
||||
* suspend/resume for them.
|
||||
* TBD: is there any system with such CPU which supports
|
||||
* suspend/resume? if no, we should remove the code.
|
||||
*/
|
||||
sysdev_driver_register(&cpu_sysdev_class,
|
||||
&mtrr_sysdev_driver);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
subsys_initcall(mtrr_init_finialize);
|
||||
|
|
|
@ -91,7 +91,6 @@ extern struct mtrr_ops * mtrr_if;
|
|||
|
||||
extern unsigned int num_var_ranges;
|
||||
|
||||
void finalize_mtrr_state(void);
|
||||
void mtrr_state_warn(void);
|
||||
char *mtrr_attrib_to_str(int x);
|
||||
void mtrr_wrmsr(unsigned, unsigned, unsigned);
|
||||
|
|
|
@ -68,21 +68,21 @@ EXPORT_SYMBOL(smp_num_siblings);
|
|||
#endif
|
||||
|
||||
/* Package ID of each logical CPU */
|
||||
int phys_proc_id[NR_CPUS] = {[0 ... NR_CPUS-1] = BAD_APICID};
|
||||
int phys_proc_id[NR_CPUS] __read_mostly = {[0 ... NR_CPUS-1] = BAD_APICID};
|
||||
EXPORT_SYMBOL(phys_proc_id);
|
||||
|
||||
/* Core ID of each logical CPU */
|
||||
int cpu_core_id[NR_CPUS] = {[0 ... NR_CPUS-1] = BAD_APICID};
|
||||
int cpu_core_id[NR_CPUS] __read_mostly = {[0 ... NR_CPUS-1] = BAD_APICID};
|
||||
EXPORT_SYMBOL(cpu_core_id);
|
||||
|
||||
cpumask_t cpu_sibling_map[NR_CPUS];
|
||||
cpumask_t cpu_sibling_map[NR_CPUS] __read_mostly;
|
||||
EXPORT_SYMBOL(cpu_sibling_map);
|
||||
|
||||
cpumask_t cpu_core_map[NR_CPUS];
|
||||
cpumask_t cpu_core_map[NR_CPUS] __read_mostly;
|
||||
EXPORT_SYMBOL(cpu_core_map);
|
||||
|
||||
/* bitmap of online cpus */
|
||||
cpumask_t cpu_online_map;
|
||||
cpumask_t cpu_online_map __read_mostly;
|
||||
EXPORT_SYMBOL(cpu_online_map);
|
||||
|
||||
cpumask_t cpu_callin_map;
|
||||
|
@ -100,7 +100,7 @@ static int __devinitdata tsc_sync_disabled;
|
|||
struct cpuinfo_x86 cpu_data[NR_CPUS] __cacheline_aligned;
|
||||
EXPORT_SYMBOL(cpu_data);
|
||||
|
||||
u8 x86_cpu_to_apicid[NR_CPUS] =
|
||||
u8 x86_cpu_to_apicid[NR_CPUS] __read_mostly =
|
||||
{ [0 ... NR_CPUS-1] = 0xff };
|
||||
EXPORT_SYMBOL(x86_cpu_to_apicid);
|
||||
|
||||
|
@ -550,10 +550,10 @@ extern struct {
|
|||
#ifdef CONFIG_NUMA
|
||||
|
||||
/* which logical CPUs are on which nodes */
|
||||
cpumask_t node_2_cpu_mask[MAX_NUMNODES] =
|
||||
cpumask_t node_2_cpu_mask[MAX_NUMNODES] __read_mostly =
|
||||
{ [0 ... MAX_NUMNODES-1] = CPU_MASK_NONE };
|
||||
/* which node each logical CPU is on */
|
||||
int cpu_2_node[NR_CPUS] = { [0 ... NR_CPUS-1] = 0 };
|
||||
int cpu_2_node[NR_CPUS] __read_mostly = { [0 ... NR_CPUS-1] = 0 };
|
||||
EXPORT_SYMBOL(cpu_2_node);
|
||||
|
||||
/* set up a mapping between cpu and node. */
|
||||
|
@ -581,7 +581,7 @@ static inline void unmap_cpu_to_node(int cpu)
|
|||
|
||||
#endif /* CONFIG_NUMA */
|
||||
|
||||
u8 cpu_2_logical_apicid[NR_CPUS] = { [0 ... NR_CPUS-1] = BAD_APICID };
|
||||
u8 cpu_2_logical_apicid[NR_CPUS] __read_mostly = { [0 ... NR_CPUS-1] = BAD_APICID };
|
||||
|
||||
static void map_cpu_to_logical_apicid(void)
|
||||
{
|
||||
|
|
|
@ -91,7 +91,7 @@ EXPORT_SYMBOL(rtc_lock);
|
|||
DEFINE_SPINLOCK(i8253_lock);
|
||||
EXPORT_SYMBOL(i8253_lock);
|
||||
|
||||
struct timer_opts *cur_timer = &timer_none;
|
||||
struct timer_opts *cur_timer __read_mostly = &timer_none;
|
||||
|
||||
/*
|
||||
* This is a special lock that is owned by the CPU and holds the index
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
#include "mach_timer.h"
|
||||
#include <asm/hpet.h>
|
||||
|
||||
static unsigned long hpet_usec_quotient; /* convert hpet clks to usec */
|
||||
static unsigned long __read_mostly hpet_usec_quotient; /* convert hpet clks to usec */
|
||||
static unsigned long tsc_hpet_quotient; /* convert tsc to hpet clks */
|
||||
static unsigned long hpet_last; /* hpet counter value at last tick*/
|
||||
static unsigned long last_tsc_low; /* lsb 32 bits of Time Stamp Counter */
|
||||
|
@ -180,7 +180,7 @@ static int __init init_hpet(char* override)
|
|||
/************************************************************/
|
||||
|
||||
/* tsc timer_opts struct */
|
||||
static struct timer_opts timer_hpet = {
|
||||
static struct timer_opts timer_hpet __read_mostly = {
|
||||
.name = "hpet",
|
||||
.mark_offset = mark_offset_hpet,
|
||||
.get_offset = get_offset_hpet,
|
||||
|
|
|
@ -57,6 +57,9 @@ SECTIONS
|
|||
*(.data.cacheline_aligned)
|
||||
}
|
||||
|
||||
/* rarely changed data like cpu maps */
|
||||
. = ALIGN(32);
|
||||
.data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) { *(.data.read_mostly) }
|
||||
_edata = .; /* End of data section */
|
||||
|
||||
. = ALIGN(THREAD_SIZE); /* init_task */
|
||||
|
|
|
@ -228,7 +228,8 @@ EXPORT_SYMBOL(ioremap_nocache);
|
|||
void iounmap(volatile void __iomem *addr)
|
||||
{
|
||||
struct vm_struct *p;
|
||||
if ((void __force *) addr <= high_memory)
|
||||
|
||||
if ((void __force *)addr <= high_memory)
|
||||
return;
|
||||
|
||||
/*
|
||||
|
@ -241,9 +242,10 @@ void iounmap(volatile void __iomem *addr)
|
|||
return;
|
||||
|
||||
write_lock(&vmlist_lock);
|
||||
p = __remove_vm_area((void *) (PAGE_MASK & (unsigned long __force) addr));
|
||||
p = __remove_vm_area((void *)(PAGE_MASK & (unsigned long __force)addr));
|
||||
if (!p) {
|
||||
printk(KERN_WARNING "iounmap: bad address %p\n", addr);
|
||||
dump_stack();
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
|
|
|
@ -137,6 +137,7 @@ void __restore_processor_state(struct saved_context *ctxt)
|
|||
|
||||
fix_processor_context();
|
||||
do_fpu_end();
|
||||
mtrr_ap_init();
|
||||
}
|
||||
|
||||
void restore_processor_state(void)
|
||||
|
|
|
@ -191,7 +191,7 @@ simeth_probe1(void)
|
|||
unsigned char mac_addr[ETH_ALEN];
|
||||
struct simeth_local *local;
|
||||
struct net_device *dev;
|
||||
int fd, i, err;
|
||||
int fd, i, err, rc;
|
||||
|
||||
/*
|
||||
* XXX Fix me
|
||||
|
@ -228,7 +228,9 @@ simeth_probe1(void)
|
|||
return err;
|
||||
}
|
||||
|
||||
dev->irq = assign_irq_vector(AUTO_ASSIGN);
|
||||
if ((rc = assign_irq_vector(AUTO_ASSIGN)) < 0)
|
||||
panic("%s: out of interrupt vectors!\n", __FUNCTION__);
|
||||
dev->irq = rc;
|
||||
|
||||
/*
|
||||
* attach the interrupt in the simulator, this does enable interrupts
|
||||
|
|
|
@ -982,7 +982,7 @@ static struct tty_operations hp_ops = {
|
|||
static int __init
|
||||
simrs_init (void)
|
||||
{
|
||||
int i;
|
||||
int i, rc;
|
||||
struct serial_state *state;
|
||||
|
||||
if (!ia64_platform_is("hpsim"))
|
||||
|
@ -1017,7 +1017,10 @@ simrs_init (void)
|
|||
if (state->type == PORT_UNKNOWN) continue;
|
||||
|
||||
if (!state->irq) {
|
||||
state->irq = assign_irq_vector(AUTO_ASSIGN);
|
||||
if ((rc = assign_irq_vector(AUTO_ASSIGN)) < 0)
|
||||
panic("%s: out of interrupt vectors!\n",
|
||||
__FUNCTION__);
|
||||
state->irq = rc;
|
||||
ia64_ssc_connect_irq(KEYBOARD_INTR, state->irq);
|
||||
}
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@ obj-$(CONFIG_IA64_PALINFO) += palinfo.o
|
|||
obj-$(CONFIG_IOSAPIC) += iosapic.o
|
||||
obj-$(CONFIG_MODULES) += module.o
|
||||
obj-$(CONFIG_SMP) += smp.o smpboot.o domain.o
|
||||
obj-$(CONFIG_NUMA) += numa.o
|
||||
obj-$(CONFIG_PERFMON) += perfmon_default_smpl.o
|
||||
obj-$(CONFIG_IA64_CYCLONE) += cyclone.o
|
||||
obj-$(CONFIG_IA64_MCA_RECOVERY) += mca_recovery.o
|
||||
|
|
|
@ -640,8 +640,10 @@ acpi_boot_init (void)
|
|||
if (smp_boot_data.cpu_phys_id[cpu] != hard_smp_processor_id())
|
||||
node_cpuid[i++].phys_id = smp_boot_data.cpu_phys_id[cpu];
|
||||
}
|
||||
build_cpu_to_node_map();
|
||||
# endif
|
||||
#endif
|
||||
#ifdef CONFIG_ACPI_NUMA
|
||||
build_cpu_to_node_map();
|
||||
#endif
|
||||
/* Make boot-up look pretty */
|
||||
printk(KERN_INFO "%d CPUs available, %d CPUs total\n", available_cpus, total_cpus);
|
||||
|
|
|
@ -1249,7 +1249,7 @@ ENTRY(sys_rt_sigreturn)
|
|||
stf.spill [r17]=f11
|
||||
adds out0=16,sp // out0 = &sigscratch
|
||||
br.call.sptk.many rp=ia64_rt_sigreturn
|
||||
.ret19: .restore sp 0
|
||||
.ret19: .restore sp,0
|
||||
adds sp=16,sp
|
||||
;;
|
||||
ld8 r9=[sp] // load new ar.unat
|
||||
|
|
|
@ -489,8 +489,6 @@ static int iosapic_find_sharable_vector (unsigned long trigger, unsigned long po
|
|||
}
|
||||
}
|
||||
}
|
||||
if (vector < 0)
|
||||
panic("%s: out of interrupt vectors!\n", __FUNCTION__);
|
||||
|
||||
return vector;
|
||||
}
|
||||
|
@ -506,6 +504,8 @@ iosapic_reassign_vector (int vector)
|
|||
|
||||
if (!list_empty(&iosapic_intr_info[vector].rtes)) {
|
||||
new_vector = assign_irq_vector(AUTO_ASSIGN);
|
||||
if (new_vector < 0)
|
||||
panic("%s: out of interrupt vectors!\n", __FUNCTION__);
|
||||
printk(KERN_INFO "Reassigning vector %d to %d\n", vector, new_vector);
|
||||
memcpy(&iosapic_intr_info[new_vector], &iosapic_intr_info[vector],
|
||||
sizeof(struct iosapic_intr_info));
|
||||
|
@ -734,9 +734,12 @@ again:
|
|||
spin_unlock_irqrestore(&iosapic_lock, flags);
|
||||
|
||||
/* If vector is running out, we try to find a sharable vector */
|
||||
vector = assign_irq_vector_nopanic(AUTO_ASSIGN);
|
||||
if (vector < 0)
|
||||
vector = assign_irq_vector(AUTO_ASSIGN);
|
||||
if (vector < 0) {
|
||||
vector = iosapic_find_sharable_vector(trigger, polarity);
|
||||
if (vector < 0)
|
||||
panic("%s: out of interrupt vectors!\n", __FUNCTION__);
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&irq_descp(vector)->lock, flags);
|
||||
spin_lock(&iosapic_lock);
|
||||
|
@ -884,6 +887,8 @@ iosapic_register_platform_intr (u32 int_type, unsigned int gsi,
|
|||
break;
|
||||
case ACPI_INTERRUPT_INIT:
|
||||
vector = assign_irq_vector(AUTO_ASSIGN);
|
||||
if (vector < 0)
|
||||
panic("%s: out of interrupt vectors!\n", __FUNCTION__);
|
||||
delivery = IOSAPIC_INIT;
|
||||
break;
|
||||
case ACPI_INTERRUPT_CPEI:
|
||||
|
|
|
@ -63,30 +63,19 @@ EXPORT_SYMBOL(isa_irq_to_vector_map);
|
|||
static unsigned long ia64_vector_mask[BITS_TO_LONGS(IA64_NUM_DEVICE_VECTORS)];
|
||||
|
||||
int
|
||||
assign_irq_vector_nopanic (int irq)
|
||||
assign_irq_vector (int irq)
|
||||
{
|
||||
int pos, vector;
|
||||
again:
|
||||
pos = find_first_zero_bit(ia64_vector_mask, IA64_NUM_DEVICE_VECTORS);
|
||||
vector = IA64_FIRST_DEVICE_VECTOR + pos;
|
||||
if (vector > IA64_LAST_DEVICE_VECTOR)
|
||||
return -1;
|
||||
return -ENOSPC;
|
||||
if (test_and_set_bit(pos, ia64_vector_mask))
|
||||
goto again;
|
||||
return vector;
|
||||
}
|
||||
|
||||
int
|
||||
assign_irq_vector (int irq)
|
||||
{
|
||||
int vector = assign_irq_vector_nopanic(irq);
|
||||
|
||||
if (vector < 0)
|
||||
panic("assign_irq_vector: out of interrupt vectors!");
|
||||
|
||||
return vector;
|
||||
}
|
||||
|
||||
void
|
||||
free_irq_vector (int vector)
|
||||
{
|
||||
|
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* ia64 kernel NUMA specific stuff
|
||||
*
|
||||
* Copyright (C) 2002 Erich Focht <efocht@ess.nec.de>
|
||||
* Copyright (C) 2004 Silicon Graphics, Inc.
|
||||
* Jesse Barnes <jbarnes@sgi.com>
|
||||
*/
|
||||
#include <linux/config.h>
|
||||
#include <linux/topology.h>
|
||||
#include <linux/module.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/smp.h>
|
||||
|
||||
u8 cpu_to_node_map[NR_CPUS] __cacheline_aligned;
|
||||
EXPORT_SYMBOL(cpu_to_node_map);
|
||||
|
||||
cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned;
|
||||
|
||||
/**
|
||||
* build_cpu_to_node_map - setup cpu to node and node to cpumask arrays
|
||||
*
|
||||
* Build cpu to node mapping and initialize the per node cpu masks using
|
||||
* info from the node_cpuid array handed to us by ACPI.
|
||||
*/
|
||||
void __init build_cpu_to_node_map(void)
|
||||
{
|
||||
int cpu, i, node;
|
||||
|
||||
for(node=0; node < MAX_NUMNODES; node++)
|
||||
cpus_clear(node_to_cpu_mask[node]);
|
||||
|
||||
for(cpu = 0; cpu < NR_CPUS; ++cpu) {
|
||||
node = -1;
|
||||
for (i = 0; i < NR_CPUS; ++i)
|
||||
if (cpu_physical_id(cpu) == node_cpuid[i].phys_id) {
|
||||
node = node_cpuid[i].nid;
|
||||
break;
|
||||
}
|
||||
cpu_to_node_map[cpu] = (node >= 0) ? node : 0;
|
||||
if (node >= 0)
|
||||
cpu_set(cpu, node_to_cpu_mask[node]);
|
||||
}
|
||||
}
|
|
@ -37,7 +37,6 @@
|
|||
#include <linux/vfs.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/mount.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/bitops.h>
|
||||
|
||||
#include <asm/errno.h>
|
||||
|
|
|
@ -143,6 +143,7 @@ restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr)
|
|||
|
||||
__copy_from_user(current->thread.fph, &sc->sc_fr[32], 96*16);
|
||||
psr->mfh = 0; /* drop signal handler's fph contents... */
|
||||
preempt_disable();
|
||||
if (psr->dfh)
|
||||
ia64_drop_fpu(current);
|
||||
else {
|
||||
|
@ -150,6 +151,7 @@ restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr)
|
|||
__ia64_load_fpu(current->thread.fph);
|
||||
ia64_set_local_fpu_owner(current);
|
||||
}
|
||||
preempt_enable();
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -525,47 +525,6 @@ smp_build_cpu_map (void)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
|
||||
/* on which node is each logical CPU (one cacheline even for 64 CPUs) */
|
||||
u8 cpu_to_node_map[NR_CPUS] __cacheline_aligned;
|
||||
EXPORT_SYMBOL(cpu_to_node_map);
|
||||
/* which logical CPUs are on which nodes */
|
||||
cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned;
|
||||
|
||||
/*
|
||||
* Build cpu to node mapping and initialize the per node cpu masks.
|
||||
*/
|
||||
void __init
|
||||
build_cpu_to_node_map (void)
|
||||
{
|
||||
int cpu, i, node;
|
||||
|
||||
for(node=0; node<MAX_NUMNODES; node++)
|
||||
cpus_clear(node_to_cpu_mask[node]);
|
||||
for(cpu = 0; cpu < NR_CPUS; ++cpu) {
|
||||
/*
|
||||
* All Itanium NUMA platforms I know use ACPI, so maybe we
|
||||
* can drop this ifdef completely. [EF]
|
||||
*/
|
||||
#ifdef CONFIG_ACPI_NUMA
|
||||
node = -1;
|
||||
for (i = 0; i < NR_CPUS; ++i)
|
||||
if (cpu_physical_id(cpu) == node_cpuid[i].phys_id) {
|
||||
node = node_cpuid[i].nid;
|
||||
break;
|
||||
}
|
||||
#else
|
||||
# error Fixme: Dunno how to build CPU-to-node map.
|
||||
#endif
|
||||
cpu_to_node_map[cpu] = (node >= 0) ? node : 0;
|
||||
if (node >= 0)
|
||||
cpu_set(cpu, node_to_cpu_mask[node]);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* CONFIG_NUMA */
|
||||
|
||||
/*
|
||||
* Cycle through the APs sending Wakeup IPIs to boot each.
|
||||
*/
|
||||
|
|
|
@ -90,14 +90,16 @@ die (const char *str, struct pt_regs *regs, long err)
|
|||
.lock_owner_depth = 0
|
||||
};
|
||||
static int die_counter;
|
||||
int cpu = get_cpu();
|
||||
|
||||
if (die.lock_owner != smp_processor_id()) {
|
||||
if (die.lock_owner != cpu) {
|
||||
console_verbose();
|
||||
spin_lock_irq(&die.lock);
|
||||
die.lock_owner = smp_processor_id();
|
||||
die.lock_owner = cpu;
|
||||
die.lock_owner_depth = 0;
|
||||
bust_spinlocks(1);
|
||||
}
|
||||
put_cpu();
|
||||
|
||||
if (++die.lock_owner_depth < 3) {
|
||||
printk("%s[%d]: %s %ld [%d]\n",
|
||||
|
|
|
@ -44,150 +44,7 @@ struct early_node_data {
|
|||
};
|
||||
|
||||
static struct early_node_data mem_data[MAX_NUMNODES] __initdata;
|
||||
|
||||
/**
|
||||
* reassign_cpu_only_nodes - called from find_memory to move CPU-only nodes to a memory node
|
||||
*
|
||||
* This function will move nodes with only CPUs (no memory)
|
||||
* to a node with memory which is at the minimum numa_slit distance.
|
||||
* Any reassigments will result in the compression of the nodes
|
||||
* and renumbering the nid values where appropriate.
|
||||
* The static declarations below are to avoid large stack size which
|
||||
* makes the code not re-entrant.
|
||||
*/
|
||||
static void __init reassign_cpu_only_nodes(void)
|
||||
{
|
||||
struct node_memblk_s *p;
|
||||
int i, j, k, nnode, nid, cpu, cpunid, pxm;
|
||||
u8 cslit, slit;
|
||||
static DECLARE_BITMAP(nodes_with_mem, MAX_NUMNODES) __initdata;
|
||||
static u8 numa_slit_fix[MAX_NUMNODES * MAX_NUMNODES] __initdata;
|
||||
static int node_flip[MAX_NUMNODES] __initdata;
|
||||
static int old_nid_map[NR_CPUS] __initdata;
|
||||
|
||||
for (nnode = 0, p = &node_memblk[0]; p < &node_memblk[num_node_memblks]; p++)
|
||||
if (!test_bit(p->nid, (void *) nodes_with_mem)) {
|
||||
set_bit(p->nid, (void *) nodes_with_mem);
|
||||
nnode++;
|
||||
}
|
||||
|
||||
/*
|
||||
* All nids with memory.
|
||||
*/
|
||||
if (nnode == num_online_nodes())
|
||||
return;
|
||||
|
||||
/*
|
||||
* Change nids and attempt to migrate CPU-only nodes
|
||||
* to the best numa_slit (closest neighbor) possible.
|
||||
* For reassigned CPU nodes a nid can't be arrived at
|
||||
* until after this loop because the target nid's new
|
||||
* identity might not have been established yet. So
|
||||
* new nid values are fabricated above num_online_nodes() and
|
||||
* mapped back later to their true value.
|
||||
*/
|
||||
/* MCD - This code is a bit complicated, but may be unnecessary now.
|
||||
* We can now handle much more interesting node-numbering.
|
||||
* The old requirement that 0 <= nid <= numnodes <= MAX_NUMNODES
|
||||
* and that there be no holes in the numbering 0..numnodes
|
||||
* has become simply 0 <= nid <= MAX_NUMNODES.
|
||||
*/
|
||||
nid = 0;
|
||||
for_each_online_node(i) {
|
||||
if (test_bit(i, (void *) nodes_with_mem)) {
|
||||
/*
|
||||
* Save original nid value for numa_slit
|
||||
* fixup and node_cpuid reassignments.
|
||||
*/
|
||||
node_flip[nid] = i;
|
||||
|
||||
if (i == nid) {
|
||||
nid++;
|
||||
continue;
|
||||
}
|
||||
|
||||
for (p = &node_memblk[0]; p < &node_memblk[num_node_memblks]; p++)
|
||||
if (p->nid == i)
|
||||
p->nid = nid;
|
||||
|
||||
cpunid = nid;
|
||||
nid++;
|
||||
} else
|
||||
cpunid = MAX_NUMNODES;
|
||||
|
||||
for (cpu = 0; cpu < NR_CPUS; cpu++)
|
||||
if (node_cpuid[cpu].nid == i) {
|
||||
/*
|
||||
* For nodes not being reassigned just
|
||||
* fix the cpu's nid and reverse pxm map
|
||||
*/
|
||||
if (cpunid < MAX_NUMNODES) {
|
||||
pxm = nid_to_pxm_map[i];
|
||||
pxm_to_nid_map[pxm] =
|
||||
node_cpuid[cpu].nid = cpunid;
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* For nodes being reassigned, find best node by
|
||||
* numa_slit information and then make a temporary
|
||||
* nid value based on current nid and num_online_nodes().
|
||||
*/
|
||||
slit = 0xff;
|
||||
k = 2*num_online_nodes();
|
||||
for_each_online_node(j) {
|
||||
if (i == j)
|
||||
continue;
|
||||
else if (test_bit(j, (void *) nodes_with_mem)) {
|
||||
cslit = numa_slit[i * num_online_nodes() + j];
|
||||
if (cslit < slit) {
|
||||
k = num_online_nodes() + j;
|
||||
slit = cslit;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* save old nid map so we can update the pxm */
|
||||
old_nid_map[cpu] = node_cpuid[cpu].nid;
|
||||
node_cpuid[cpu].nid = k;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Fixup temporary nid values for CPU-only nodes.
|
||||
*/
|
||||
for (cpu = 0; cpu < NR_CPUS; cpu++)
|
||||
if (node_cpuid[cpu].nid == (2*num_online_nodes())) {
|
||||
pxm = nid_to_pxm_map[old_nid_map[cpu]];
|
||||
pxm_to_nid_map[pxm] = node_cpuid[cpu].nid = nnode - 1;
|
||||
} else {
|
||||
for (i = 0; i < nnode; i++) {
|
||||
if (node_flip[i] != (node_cpuid[cpu].nid - num_online_nodes()))
|
||||
continue;
|
||||
|
||||
pxm = nid_to_pxm_map[old_nid_map[cpu]];
|
||||
pxm_to_nid_map[pxm] = node_cpuid[cpu].nid = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Fix numa_slit by compressing from larger
|
||||
* nid array to reduced nid array.
|
||||
*/
|
||||
for (i = 0; i < nnode; i++)
|
||||
for (j = 0; j < nnode; j++)
|
||||
numa_slit_fix[i * nnode + j] =
|
||||
numa_slit[node_flip[i] * num_online_nodes() + node_flip[j]];
|
||||
|
||||
memcpy(numa_slit, numa_slit_fix, sizeof (numa_slit));
|
||||
|
||||
nodes_clear(node_online_map);
|
||||
for (i = 0; i < nnode; i++)
|
||||
node_set_online(i);
|
||||
|
||||
return;
|
||||
}
|
||||
static nodemask_t memory_less_mask __initdata;
|
||||
|
||||
/*
|
||||
* To prevent cache aliasing effects, align per-node structures so that they
|
||||
|
@ -232,28 +89,6 @@ static int __init build_node_maps(unsigned long start, unsigned long len,
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* early_nr_phys_cpus_node - return number of physical cpus on a given node
|
||||
* @node: node to check
|
||||
*
|
||||
* Count the number of physical cpus on @node. These are cpus that actually
|
||||
* exist. We can't use nr_cpus_node() yet because
|
||||
* acpi_boot_init() (which builds the node_to_cpu_mask array) hasn't been
|
||||
* called yet.
|
||||
*/
|
||||
static int early_nr_phys_cpus_node(int node)
|
||||
{
|
||||
int cpu, n = 0;
|
||||
|
||||
for (cpu = 0; cpu < NR_CPUS; cpu++)
|
||||
if (node == node_cpuid[cpu].nid)
|
||||
if ((cpu == 0) || node_cpuid[cpu].phys_id)
|
||||
n++;
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* early_nr_cpus_node - return number of cpus on a given node
|
||||
* @node: node to check
|
||||
|
@ -262,7 +97,7 @@ static int early_nr_phys_cpus_node(int node)
|
|||
* acpi_boot_init() (which builds the node_to_cpu_mask array) hasn't been
|
||||
* called yet. Note that node 0 will also count all non-existent cpus.
|
||||
*/
|
||||
static int early_nr_cpus_node(int node)
|
||||
static int __init early_nr_cpus_node(int node)
|
||||
{
|
||||
int cpu, n = 0;
|
||||
|
||||
|
@ -273,6 +108,85 @@ static int early_nr_cpus_node(int node)
|
|||
return n;
|
||||
}
|
||||
|
||||
/**
|
||||
* compute_pernodesize - compute size of pernode data
|
||||
* @node: the node id.
|
||||
*/
|
||||
static unsigned long __init compute_pernodesize(int node)
|
||||
{
|
||||
unsigned long pernodesize = 0, cpus;
|
||||
|
||||
cpus = early_nr_cpus_node(node);
|
||||
pernodesize += PERCPU_PAGE_SIZE * cpus;
|
||||
pernodesize += node * L1_CACHE_BYTES;
|
||||
pernodesize += L1_CACHE_ALIGN(sizeof(pg_data_t));
|
||||
pernodesize += L1_CACHE_ALIGN(sizeof(struct ia64_node_data));
|
||||
pernodesize = PAGE_ALIGN(pernodesize);
|
||||
return pernodesize;
|
||||
}
|
||||
|
||||
/**
|
||||
* per_cpu_node_setup - setup per-cpu areas on each node
|
||||
* @cpu_data: per-cpu area on this node
|
||||
* @node: node to setup
|
||||
*
|
||||
* Copy the static per-cpu data into the region we just set aside and then
|
||||
* setup __per_cpu_offset for each CPU on this node. Return a pointer to
|
||||
* the end of the area.
|
||||
*/
|
||||
static void *per_cpu_node_setup(void *cpu_data, int node)
|
||||
{
|
||||
#ifdef CONFIG_SMP
|
||||
int cpu;
|
||||
|
||||
for (cpu = 0; cpu < NR_CPUS; cpu++) {
|
||||
if (node == node_cpuid[cpu].nid) {
|
||||
memcpy(__va(cpu_data), __phys_per_cpu_start,
|
||||
__per_cpu_end - __per_cpu_start);
|
||||
__per_cpu_offset[cpu] = (char*)__va(cpu_data) -
|
||||
__per_cpu_start;
|
||||
cpu_data += PERCPU_PAGE_SIZE;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return cpu_data;
|
||||
}
|
||||
|
||||
/**
|
||||
* fill_pernode - initialize pernode data.
|
||||
* @node: the node id.
|
||||
* @pernode: physical address of pernode data
|
||||
* @pernodesize: size of the pernode data
|
||||
*/
|
||||
static void __init fill_pernode(int node, unsigned long pernode,
|
||||
unsigned long pernodesize)
|
||||
{
|
||||
void *cpu_data;
|
||||
int cpus = early_nr_cpus_node(node);
|
||||
struct bootmem_data *bdp = &mem_data[node].bootmem_data;
|
||||
|
||||
mem_data[node].pernode_addr = pernode;
|
||||
mem_data[node].pernode_size = pernodesize;
|
||||
memset(__va(pernode), 0, pernodesize);
|
||||
|
||||
cpu_data = (void *)pernode;
|
||||
pernode += PERCPU_PAGE_SIZE * cpus;
|
||||
pernode += node * L1_CACHE_BYTES;
|
||||
|
||||
mem_data[node].pgdat = __va(pernode);
|
||||
pernode += L1_CACHE_ALIGN(sizeof(pg_data_t));
|
||||
|
||||
mem_data[node].node_data = __va(pernode);
|
||||
pernode += L1_CACHE_ALIGN(sizeof(struct ia64_node_data));
|
||||
|
||||
mem_data[node].pgdat->bdata = bdp;
|
||||
pernode += L1_CACHE_ALIGN(sizeof(pg_data_t));
|
||||
|
||||
cpu_data = per_cpu_node_setup(cpu_data, node);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* find_pernode_space - allocate memory for memory map and per-node structures
|
||||
* @start: physical start of range
|
||||
|
@ -304,9 +218,8 @@ static int early_nr_cpus_node(int node)
|
|||
static int __init find_pernode_space(unsigned long start, unsigned long len,
|
||||
int node)
|
||||
{
|
||||
unsigned long epfn, cpu, cpus, phys_cpus;
|
||||
unsigned long epfn;
|
||||
unsigned long pernodesize = 0, pernode, pages, mapsize;
|
||||
void *cpu_data;
|
||||
struct bootmem_data *bdp = &mem_data[node].bootmem_data;
|
||||
|
||||
epfn = (start + len) >> PAGE_SHIFT;
|
||||
|
@ -329,49 +242,12 @@ static int __init find_pernode_space(unsigned long start, unsigned long len,
|
|||
* Calculate total size needed, incl. what's necessary
|
||||
* for good alignment and alias prevention.
|
||||
*/
|
||||
cpus = early_nr_cpus_node(node);
|
||||
phys_cpus = early_nr_phys_cpus_node(node);
|
||||
pernodesize += PERCPU_PAGE_SIZE * cpus;
|
||||
pernodesize += node * L1_CACHE_BYTES;
|
||||
pernodesize += L1_CACHE_ALIGN(sizeof(pg_data_t));
|
||||
pernodesize += L1_CACHE_ALIGN(sizeof(struct ia64_node_data));
|
||||
pernodesize = PAGE_ALIGN(pernodesize);
|
||||
pernodesize = compute_pernodesize(node);
|
||||
pernode = NODEDATA_ALIGN(start, node);
|
||||
|
||||
/* Is this range big enough for what we want to store here? */
|
||||
if (start + len > (pernode + pernodesize + mapsize)) {
|
||||
mem_data[node].pernode_addr = pernode;
|
||||
mem_data[node].pernode_size = pernodesize;
|
||||
memset(__va(pernode), 0, pernodesize);
|
||||
|
||||
cpu_data = (void *)pernode;
|
||||
pernode += PERCPU_PAGE_SIZE * cpus;
|
||||
pernode += node * L1_CACHE_BYTES;
|
||||
|
||||
mem_data[node].pgdat = __va(pernode);
|
||||
pernode += L1_CACHE_ALIGN(sizeof(pg_data_t));
|
||||
|
||||
mem_data[node].node_data = __va(pernode);
|
||||
pernode += L1_CACHE_ALIGN(sizeof(struct ia64_node_data));
|
||||
|
||||
mem_data[node].pgdat->bdata = bdp;
|
||||
pernode += L1_CACHE_ALIGN(sizeof(pg_data_t));
|
||||
|
||||
/*
|
||||
* Copy the static per-cpu data into the region we
|
||||
* just set aside and then setup __per_cpu_offset
|
||||
* for each CPU on this node.
|
||||
*/
|
||||
for (cpu = 0; cpu < NR_CPUS; cpu++) {
|
||||
if (node == node_cpuid[cpu].nid) {
|
||||
memcpy(__va(cpu_data), __phys_per_cpu_start,
|
||||
__per_cpu_end - __per_cpu_start);
|
||||
__per_cpu_offset[cpu] = (char*)__va(cpu_data) -
|
||||
__per_cpu_start;
|
||||
cpu_data += PERCPU_PAGE_SIZE;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (start + len > (pernode + pernodesize + mapsize))
|
||||
fill_pernode(node, pernode, pernodesize);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -411,6 +287,9 @@ static void __init reserve_pernode_space(void)
|
|||
for_each_online_node(node) {
|
||||
pg_data_t *pdp = mem_data[node].pgdat;
|
||||
|
||||
if (node_isset(node, memory_less_mask))
|
||||
continue;
|
||||
|
||||
bdp = pdp->bdata;
|
||||
|
||||
/* First the bootmem_map itself */
|
||||
|
@ -436,8 +315,8 @@ static void __init reserve_pernode_space(void)
|
|||
*/
|
||||
static void __init initialize_pernode_data(void)
|
||||
{
|
||||
int cpu, node;
|
||||
pg_data_t *pgdat_list[MAX_NUMNODES];
|
||||
int cpu, node;
|
||||
|
||||
for_each_online_node(node)
|
||||
pgdat_list[node] = mem_data[node].pgdat;
|
||||
|
@ -447,12 +326,99 @@ static void __init initialize_pernode_data(void)
|
|||
memcpy(mem_data[node].node_data->pg_data_ptrs, pgdat_list,
|
||||
sizeof(pgdat_list));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
/* Set the node_data pointer for each per-cpu struct */
|
||||
for (cpu = 0; cpu < NR_CPUS; cpu++) {
|
||||
node = node_cpuid[cpu].nid;
|
||||
per_cpu(cpu_info, cpu).node_data = mem_data[node].node_data;
|
||||
}
|
||||
#else
|
||||
{
|
||||
struct cpuinfo_ia64 *cpu0_cpu_info;
|
||||
cpu = 0;
|
||||
node = node_cpuid[cpu].nid;
|
||||
cpu0_cpu_info = (struct cpuinfo_ia64 *)(__phys_per_cpu_start +
|
||||
((char *)&per_cpu__cpu_info - __per_cpu_start));
|
||||
cpu0_cpu_info->node_data = mem_data[node].node_data;
|
||||
}
|
||||
#endif /* CONFIG_SMP */
|
||||
}
|
||||
|
||||
/**
|
||||
* memory_less_node_alloc - * attempt to allocate memory on the best NUMA slit
|
||||
* node but fall back to any other node when __alloc_bootmem_node fails
|
||||
* for best.
|
||||
* @nid: node id
|
||||
* @pernodesize: size of this node's pernode data
|
||||
* @align: alignment to use for this node's pernode data
|
||||
*/
|
||||
static void __init *memory_less_node_alloc(int nid, unsigned long pernodesize,
|
||||
unsigned long align)
|
||||
{
|
||||
void *ptr = NULL;
|
||||
u8 best = 0xff;
|
||||
int bestnode = -1, node;
|
||||
|
||||
for_each_online_node(node) {
|
||||
if (node_isset(node, memory_less_mask))
|
||||
continue;
|
||||
else if (node_distance(nid, node) < best) {
|
||||
best = node_distance(nid, node);
|
||||
bestnode = node;
|
||||
}
|
||||
}
|
||||
|
||||
ptr = __alloc_bootmem_node(mem_data[bestnode].pgdat,
|
||||
pernodesize, align, __pa(MAX_DMA_ADDRESS));
|
||||
|
||||
if (!ptr)
|
||||
panic("NO memory for memory less node\n");
|
||||
return ptr;
|
||||
}
|
||||
|
||||
/**
|
||||
* pgdat_insert - insert the pgdat into global pgdat_list
|
||||
* @pgdat: the pgdat for a node.
|
||||
*/
|
||||
static void __init pgdat_insert(pg_data_t *pgdat)
|
||||
{
|
||||
pg_data_t *prev = NULL, *next;
|
||||
|
||||
for_each_pgdat(next)
|
||||
if (pgdat->node_id < next->node_id)
|
||||
break;
|
||||
else
|
||||
prev = next;
|
||||
|
||||
if (prev) {
|
||||
prev->pgdat_next = pgdat;
|
||||
pgdat->pgdat_next = next;
|
||||
} else {
|
||||
pgdat->pgdat_next = pgdat_list;
|
||||
pgdat_list = pgdat;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* memory_less_nodes - allocate and initialize CPU only nodes pernode
|
||||
* information.
|
||||
*/
|
||||
static void __init memory_less_nodes(void)
|
||||
{
|
||||
unsigned long pernodesize;
|
||||
void *pernode;
|
||||
int node;
|
||||
|
||||
for_each_node_mask(node, memory_less_mask) {
|
||||
pernodesize = compute_pernodesize(node);
|
||||
pernode = memory_less_node_alloc(node, pernodesize,
|
||||
(node) ? (node * PERCPU_PAGE_SIZE) : (1024*1024));
|
||||
fill_pernode(node, __pa(pernode), pernodesize);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -472,16 +438,19 @@ void __init find_memory(void)
|
|||
node_set_online(0);
|
||||
}
|
||||
|
||||
nodes_or(memory_less_mask, memory_less_mask, node_online_map);
|
||||
min_low_pfn = -1;
|
||||
max_low_pfn = 0;
|
||||
|
||||
if (num_online_nodes() > 1)
|
||||
reassign_cpu_only_nodes();
|
||||
|
||||
/* These actually end up getting called by call_pernode_memory() */
|
||||
efi_memmap_walk(filter_rsvd_memory, build_node_maps);
|
||||
efi_memmap_walk(filter_rsvd_memory, find_pernode_space);
|
||||
|
||||
for_each_online_node(node)
|
||||
if (mem_data[node].bootmem_data.node_low_pfn) {
|
||||
node_clear(node, memory_less_mask);
|
||||
mem_data[node].min_pfn = ~0UL;
|
||||
}
|
||||
/*
|
||||
* Initialize the boot memory maps in reverse order since that's
|
||||
* what the bootmem allocator expects
|
||||
|
@ -492,17 +461,14 @@ void __init find_memory(void)
|
|||
|
||||
if (!node_online(node))
|
||||
continue;
|
||||
else if (node_isset(node, memory_less_mask))
|
||||
continue;
|
||||
|
||||
bdp = &mem_data[node].bootmem_data;
|
||||
pernode = mem_data[node].pernode_addr;
|
||||
pernodesize = mem_data[node].pernode_size;
|
||||
map = pernode + pernodesize;
|
||||
|
||||
/* Sanity check... */
|
||||
if (!pernode)
|
||||
panic("pernode space for node %d "
|
||||
"could not be allocated!", node);
|
||||
|
||||
init_bootmem_node(mem_data[node].pgdat,
|
||||
map>>PAGE_SHIFT,
|
||||
bdp->node_boot_start>>PAGE_SHIFT,
|
||||
|
@ -512,6 +478,7 @@ void __init find_memory(void)
|
|||
efi_memmap_walk(filter_rsvd_memory, free_node_bootmem);
|
||||
|
||||
reserve_pernode_space();
|
||||
memory_less_nodes();
|
||||
initialize_pernode_data();
|
||||
|
||||
max_pfn = max_low_pfn;
|
||||
|
@ -519,6 +486,7 @@ void __init find_memory(void)
|
|||
find_initrd();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
/**
|
||||
* per_cpu_init - setup per-cpu variables
|
||||
*
|
||||
|
@ -529,15 +497,15 @@ void *per_cpu_init(void)
|
|||
{
|
||||
int cpu;
|
||||
|
||||
if (smp_processor_id() == 0) {
|
||||
for (cpu = 0; cpu < NR_CPUS; cpu++) {
|
||||
per_cpu(local_per_cpu_offset, cpu) =
|
||||
__per_cpu_offset[cpu];
|
||||
}
|
||||
}
|
||||
if (smp_processor_id() != 0)
|
||||
return __per_cpu_start + __per_cpu_offset[smp_processor_id()];
|
||||
|
||||
for (cpu = 0; cpu < NR_CPUS; cpu++)
|
||||
per_cpu(local_per_cpu_offset, cpu) = __per_cpu_offset[cpu];
|
||||
|
||||
return __per_cpu_start + __per_cpu_offset[smp_processor_id()];
|
||||
}
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
/**
|
||||
* show_mem - give short summary of memory stats
|
||||
|
@ -680,12 +648,13 @@ void __init paging_init(void)
|
|||
|
||||
max_dma = virt_to_phys((void *) MAX_DMA_ADDRESS) >> PAGE_SHIFT;
|
||||
|
||||
/* so min() will work in count_node_pages */
|
||||
for_each_online_node(node)
|
||||
mem_data[node].min_pfn = ~0UL;
|
||||
|
||||
efi_memmap_walk(filter_rsvd_memory, count_node_pages);
|
||||
|
||||
vmalloc_end -= PAGE_ALIGN(max_low_pfn * sizeof(struct page));
|
||||
vmem_map = (struct page *) vmalloc_end;
|
||||
efi_memmap_walk(create_mem_map_page_table, NULL);
|
||||
printk("Virtual mem_map starts at 0x%p\n", vmem_map);
|
||||
|
||||
for_each_online_node(node) {
|
||||
memset(zones_size, 0, sizeof(zones_size));
|
||||
memset(zholes_size, 0, sizeof(zholes_size));
|
||||
|
@ -719,15 +688,6 @@ void __init paging_init(void)
|
|||
mem_data[node].num_dma_physpages);
|
||||
}
|
||||
|
||||
if (node == 0) {
|
||||
vmalloc_end -=
|
||||
PAGE_ALIGN(max_low_pfn * sizeof(struct page));
|
||||
vmem_map = (struct page *) vmalloc_end;
|
||||
|
||||
efi_memmap_walk(create_mem_map_page_table, NULL);
|
||||
printk("Virtual mem_map starts at 0x%p\n", vmem_map);
|
||||
}
|
||||
|
||||
pfn_offset = mem_data[node].min_pfn;
|
||||
|
||||
NODE_DATA(node)->node_mem_map = vmem_map + pfn_offset;
|
||||
|
@ -735,5 +695,11 @@ void __init paging_init(void)
|
|||
pfn_offset, zholes_size);
|
||||
}
|
||||
|
||||
/*
|
||||
* Make memory less nodes become a member of the known nodes.
|
||||
*/
|
||||
for_each_node_mask(node, memory_less_mask)
|
||||
pgdat_insert(mem_data[node].pgdat);
|
||||
|
||||
zero_page_memmap_ptr = virt_to_page(ia64_imva(empty_zero_page));
|
||||
}
|
||||
|
|
|
@ -597,6 +597,7 @@ mem_init (void)
|
|||
kclist_add(&kcore_kernel, _stext, _end - _stext);
|
||||
|
||||
for_each_pgdat(pgdat)
|
||||
if (pgdat->bdata->node_bootmem_map)
|
||||
totalram_pages += free_all_bootmem_node(pgdat);
|
||||
|
||||
reserved_pages = 0;
|
||||
|
|
|
@ -8,6 +8,8 @@
|
|||
#ifndef _ASM_IA64_SN_XTALK_HUBDEV_H
|
||||
#define _ASM_IA64_SN_XTALK_HUBDEV_H
|
||||
|
||||
#include "xtalk/xwidgetdev.h"
|
||||
|
||||
#define HUB_WIDGET_ID_MAX 0xf
|
||||
#define DEV_PER_WIDGET (2*2*8)
|
||||
#define IIO_ITTE_WIDGET_BITS 4 /* size of widget field */
|
||||
|
|
|
@ -9,21 +9,28 @@
|
|||
#include <linux/bootmem.h>
|
||||
#include <linux/nodemask.h>
|
||||
#include <asm/sn/types.h>
|
||||
#include <asm/sn/sn_sal.h>
|
||||
#include <asm/sn/addrs.h>
|
||||
#include <asm/sn/geo.h>
|
||||
#include <asm/sn/io.h>
|
||||
#include <asm/sn/pcibr_provider.h>
|
||||
#include <asm/sn/pcibus_provider_defs.h>
|
||||
#include <asm/sn/pcidev.h>
|
||||
#include "pci/pcibr_provider.h"
|
||||
#include "xtalk/xwidgetdev.h"
|
||||
#include <asm/sn/geo.h>
|
||||
#include "xtalk/hubdev.h"
|
||||
#include <asm/sn/io.h>
|
||||
#include <asm/sn/simulator.h>
|
||||
#include <asm/sn/sn_sal.h>
|
||||
#include <asm/sn/tioca_provider.h>
|
||||
#include "xtalk/hubdev.h"
|
||||
#include "xtalk/xwidgetdev.h"
|
||||
|
||||
char master_baseio_wid;
|
||||
nasid_t master_nasid = INVALID_NASID; /* Partition Master */
|
||||
|
||||
static struct list_head sn_sysdata_list;
|
||||
|
||||
/* sysdata list struct */
|
||||
struct sysdata_el {
|
||||
struct list_head entry;
|
||||
void *sysdata;
|
||||
};
|
||||
|
||||
struct slab_info {
|
||||
struct hubdev_info hubdev;
|
||||
};
|
||||
|
@ -137,23 +144,6 @@ sal_get_pcidev_info(u64 segment, u64 bus_number, u64 devfn, u64 pci_dev,
|
|||
return ret_stuff.v0;
|
||||
}
|
||||
|
||||
/*
|
||||
* sn_alloc_pci_sysdata() - This routine allocates a pci controller
|
||||
* which is expected as the pci_dev and pci_bus sysdata by the Linux
|
||||
* PCI infrastructure.
|
||||
*/
|
||||
static inline struct pci_controller *sn_alloc_pci_sysdata(void)
|
||||
{
|
||||
struct pci_controller *pci_sysdata;
|
||||
|
||||
pci_sysdata = kmalloc(sizeof(*pci_sysdata), GFP_KERNEL);
|
||||
if (!pci_sysdata)
|
||||
BUG();
|
||||
|
||||
memset(pci_sysdata, 0, sizeof(*pci_sysdata));
|
||||
return pci_sysdata;
|
||||
}
|
||||
|
||||
/*
|
||||
* sn_fixup_ionodes() - This routine initializes the HUB data strcuture for
|
||||
* each node in the system.
|
||||
|
@ -221,22 +211,34 @@ static void sn_fixup_ionodes(void)
|
|||
|
||||
}
|
||||
|
||||
void sn_pci_unfixup_slot(struct pci_dev *dev)
|
||||
{
|
||||
struct pci_dev *host_pci_dev = SN_PCIDEV_INFO(dev)->host_pci_dev;
|
||||
|
||||
sn_irq_unfixup(dev);
|
||||
pci_dev_put(host_pci_dev);
|
||||
pci_dev_put(dev);
|
||||
}
|
||||
|
||||
/*
|
||||
* sn_pci_fixup_slot() - This routine sets up a slot's resources
|
||||
* consistent with the Linux PCI abstraction layer. Resources acquired
|
||||
* from our PCI provider include PIO maps to BAR space and interrupt
|
||||
* objects.
|
||||
*/
|
||||
static void sn_pci_fixup_slot(struct pci_dev *dev)
|
||||
void sn_pci_fixup_slot(struct pci_dev *dev)
|
||||
{
|
||||
int idx;
|
||||
int segment = 0;
|
||||
uint64_t size;
|
||||
struct sn_irq_info *sn_irq_info;
|
||||
struct pci_dev *host_pci_dev;
|
||||
int status = 0;
|
||||
struct pcibus_bussoft *bs;
|
||||
struct pci_bus *host_pci_bus;
|
||||
struct pci_dev *host_pci_dev;
|
||||
struct sn_irq_info *sn_irq_info;
|
||||
unsigned long size;
|
||||
unsigned int bus_no, devfn;
|
||||
|
||||
pci_dev_get(dev); /* for the sysdata pointer */
|
||||
dev->sysdata = kmalloc(sizeof(struct pcidev_info), GFP_KERNEL);
|
||||
if (SN_PCIDEV_INFO(dev) <= 0)
|
||||
BUG(); /* Cannot afford to run out of memory */
|
||||
|
@ -253,7 +255,7 @@ static void sn_pci_fixup_slot(struct pci_dev *dev)
|
|||
(u64) __pa(SN_PCIDEV_INFO(dev)),
|
||||
(u64) __pa(sn_irq_info));
|
||||
if (status)
|
||||
BUG(); /* Cannot get platform pci device information information */
|
||||
BUG(); /* Cannot get platform pci device information */
|
||||
|
||||
/* Copy over PIO Mapped Addresses */
|
||||
for (idx = 0; idx <= PCI_ROM_RESOURCE; idx++) {
|
||||
|
@ -275,15 +277,21 @@ static void sn_pci_fixup_slot(struct pci_dev *dev)
|
|||
dev->resource[idx].parent = &iomem_resource;
|
||||
}
|
||||
|
||||
/* set up host bus linkages */
|
||||
bs = SN_PCIBUS_BUSSOFT(dev->bus);
|
||||
host_pci_dev =
|
||||
pci_find_slot(SN_PCIDEV_INFO(dev)->pdi_slot_host_handle >> 32,
|
||||
SN_PCIDEV_INFO(dev)->
|
||||
pdi_slot_host_handle & 0xffffffff);
|
||||
/*
|
||||
* Using the PROMs values for the PCI host bus, get the Linux
|
||||
* PCI host_pci_dev struct and set up host bus linkages
|
||||
*/
|
||||
|
||||
bus_no = SN_PCIDEV_INFO(dev)->pdi_slot_host_handle >> 32;
|
||||
devfn = SN_PCIDEV_INFO(dev)->pdi_slot_host_handle & 0xffffffff;
|
||||
host_pci_bus = pci_find_bus(pci_domain_nr(dev->bus), bus_no);
|
||||
host_pci_dev = pci_get_slot(host_pci_bus, devfn);
|
||||
|
||||
SN_PCIDEV_INFO(dev)->host_pci_dev = host_pci_dev;
|
||||
SN_PCIDEV_INFO(dev)->pdi_host_pcidev_info =
|
||||
SN_PCIDEV_INFO(host_pci_dev);
|
||||
SN_PCIDEV_INFO(dev)->pdi_linux_pcidev = dev;
|
||||
bs = SN_PCIBUS_BUSSOFT(dev->bus);
|
||||
SN_PCIDEV_INFO(dev)->pdi_pcibus_info = bs;
|
||||
|
||||
if (bs && bs->bs_asic_type < PCIIO_ASIC_MAX_TYPES) {
|
||||
|
@ -297,6 +305,9 @@ static void sn_pci_fixup_slot(struct pci_dev *dev)
|
|||
SN_PCIDEV_INFO(dev)->pdi_sn_irq_info = sn_irq_info;
|
||||
dev->irq = SN_PCIDEV_INFO(dev)->pdi_sn_irq_info->irq_irq;
|
||||
sn_irq_fixup(dev, sn_irq_info);
|
||||
} else {
|
||||
SN_PCIDEV_INFO(dev)->pdi_sn_irq_info = NULL;
|
||||
kfree(sn_irq_info);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -304,55 +315,57 @@ static void sn_pci_fixup_slot(struct pci_dev *dev)
|
|||
* sn_pci_controller_fixup() - This routine sets up a bus's resources
|
||||
* consistent with the Linux PCI abstraction layer.
|
||||
*/
|
||||
static void sn_pci_controller_fixup(int segment, int busnum)
|
||||
void sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
|
||||
{
|
||||
int status = 0;
|
||||
int nasid, cnode;
|
||||
struct pci_bus *bus;
|
||||
struct pci_controller *controller;
|
||||
struct pcibus_bussoft *prom_bussoft_ptr;
|
||||
struct hubdev_info *hubdev_info;
|
||||
void *provider_soft;
|
||||
struct sn_pcibus_provider *provider;
|
||||
|
||||
status =
|
||||
sal_get_pcibus_info((u64) segment, (u64) busnum,
|
||||
status = sal_get_pcibus_info((u64) segment, (u64) busnum,
|
||||
(u64) ia64_tpa(&prom_bussoft_ptr));
|
||||
if (status > 0) {
|
||||
return; /* bus # does not exist */
|
||||
}
|
||||
|
||||
if (status > 0)
|
||||
return; /*bus # does not exist */
|
||||
prom_bussoft_ptr = __va(prom_bussoft_ptr);
|
||||
controller = sn_alloc_pci_sysdata();
|
||||
/* controller non-zero is BUG'd in sn_alloc_pci_sysdata */
|
||||
|
||||
bus = pci_scan_bus(busnum, &pci_root_ops, controller);
|
||||
controller = kcalloc(1,sizeof(struct pci_controller), GFP_KERNEL);
|
||||
if (!controller)
|
||||
BUG();
|
||||
|
||||
if (bus == NULL) {
|
||||
bus = pci_scan_bus(busnum, &pci_root_ops, controller);
|
||||
if (bus == NULL)
|
||||
return; /* error, or bus already scanned */
|
||||
bus->sysdata = NULL;
|
||||
}
|
||||
|
||||
if (bus->sysdata)
|
||||
goto error_return; /* sysdata already alloc'd */
|
||||
|
||||
/*
|
||||
* Per-provider fixup. Copies the contents from prom to local
|
||||
* area and links SN_PCIBUS_BUSSOFT().
|
||||
*/
|
||||
|
||||
if (prom_bussoft_ptr->bs_asic_type >= PCIIO_ASIC_MAX_TYPES) {
|
||||
if (prom_bussoft_ptr->bs_asic_type >= PCIIO_ASIC_MAX_TYPES)
|
||||
return; /* unsupported asic type */
|
||||
}
|
||||
|
||||
if (prom_bussoft_ptr->bs_asic_type == PCIIO_ASIC_TYPE_PPB)
|
||||
goto error_return; /* no further fixup necessary */
|
||||
|
||||
provider = sn_pci_provider[prom_bussoft_ptr->bs_asic_type];
|
||||
if (provider == NULL) {
|
||||
if (provider == NULL)
|
||||
return; /* no provider registerd for this asic */
|
||||
}
|
||||
|
||||
provider_soft = NULL;
|
||||
if (provider->bus_fixup) {
|
||||
if (provider->bus_fixup)
|
||||
provider_soft = (*provider->bus_fixup) (prom_bussoft_ptr);
|
||||
}
|
||||
|
||||
if (provider_soft == NULL) {
|
||||
if (provider_soft == NULL)
|
||||
return; /* fixup failed or not applicable */
|
||||
}
|
||||
|
||||
/*
|
||||
* Generic bus fixup goes here. Don't reference prom_bussoft_ptr
|
||||
|
@ -361,12 +374,47 @@ static void sn_pci_controller_fixup(int segment, int busnum)
|
|||
|
||||
bus->sysdata = controller;
|
||||
PCI_CONTROLLER(bus)->platform_data = provider_soft;
|
||||
|
||||
nasid = NASID_GET(SN_PCIBUS_BUSSOFT(bus)->bs_base);
|
||||
cnode = nasid_to_cnodeid(nasid);
|
||||
hubdev_info = (struct hubdev_info *)(NODEPDA(cnode)->pdinfo);
|
||||
SN_PCIBUS_BUSSOFT(bus)->bs_xwidget_info =
|
||||
&(hubdev_info->hdi_xwidget_info[SN_PCIBUS_BUSSOFT(bus)->bs_xid]);
|
||||
|
||||
return;
|
||||
|
||||
error_return:
|
||||
|
||||
kfree(controller);
|
||||
return;
|
||||
}
|
||||
|
||||
void sn_bus_store_sysdata(struct pci_dev *dev)
|
||||
{
|
||||
struct sysdata_el *element;
|
||||
|
||||
element = kcalloc(1, sizeof(struct sysdata_el), GFP_KERNEL);
|
||||
if (!element) {
|
||||
dev_dbg(dev, "%s: out of memory!\n", __FUNCTION__);
|
||||
return;
|
||||
}
|
||||
element->sysdata = dev->sysdata;
|
||||
list_add(&element->entry, &sn_sysdata_list);
|
||||
}
|
||||
|
||||
void sn_bus_free_sysdata(void)
|
||||
{
|
||||
struct sysdata_el *element;
|
||||
struct list_head *list;
|
||||
|
||||
sn_sysdata_free_start:
|
||||
list_for_each(list, &sn_sysdata_list) {
|
||||
element = list_entry(list, struct sysdata_el, entry);
|
||||
list_del(&element->entry);
|
||||
kfree(element->sysdata);
|
||||
kfree(element);
|
||||
goto sn_sysdata_free_start;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -403,20 +451,17 @@ static int __init sn_pci_init(void)
|
|||
*/
|
||||
ia64_max_iommu_merge_mask = ~PAGE_MASK;
|
||||
sn_fixup_ionodes();
|
||||
sn_irq = kmalloc(sizeof(struct sn_irq_info *) * NR_IRQS, GFP_KERNEL);
|
||||
if (sn_irq <= 0)
|
||||
BUG(); /* Canno afford to run out of memory. */
|
||||
memset(sn_irq, 0, sizeof(struct sn_irq_info *) * NR_IRQS);
|
||||
|
||||
sn_irq_lh_init();
|
||||
INIT_LIST_HEAD(&sn_sysdata_list);
|
||||
sn_init_cpei_timer();
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
register_sn_procfs();
|
||||
#endif
|
||||
|
||||
for (i = 0; i < PCI_BUSES_TO_SCAN; i++) {
|
||||
sn_pci_controller_fixup(0, i);
|
||||
}
|
||||
/* busses are not known yet ... */
|
||||
for (i = 0; i < PCI_BUSES_TO_SCAN; i++)
|
||||
sn_pci_controller_fixup(0, i, NULL);
|
||||
|
||||
/*
|
||||
* Generic Linux PCI Layer has created the pci_bus and pci_dev
|
||||
|
@ -425,9 +470,8 @@ static int __init sn_pci_init(void)
|
|||
*/
|
||||
|
||||
while ((pci_dev =
|
||||
pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pci_dev)) != NULL) {
|
||||
pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pci_dev)) != NULL)
|
||||
sn_pci_fixup_slot(pci_dev);
|
||||
}
|
||||
|
||||
sn_ioif_inited = 1; /* sn I/O infrastructure now initialized */
|
||||
|
||||
|
@ -469,3 +513,8 @@ cnodeid_get_geoid(cnodeid_t cnode)
|
|||
}
|
||||
|
||||
subsys_initcall(sn_pci_init);
|
||||
EXPORT_SYMBOL(sn_pci_fixup_slot);
|
||||
EXPORT_SYMBOL(sn_pci_unfixup_slot);
|
||||
EXPORT_SYMBOL(sn_pci_controller_fixup);
|
||||
EXPORT_SYMBOL(sn_bus_store_sysdata);
|
||||
EXPORT_SYMBOL(sn_bus_free_sysdata);
|
||||
|
|
|
@ -9,13 +9,13 @@
|
|||
*/
|
||||
|
||||
#include <linux/irq.h>
|
||||
#include <asm/sn/intr.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <asm/sn/addrs.h>
|
||||
#include <asm/sn/arch.h>
|
||||
#include "xtalk/xwidgetdev.h"
|
||||
#include <asm/sn/intr.h>
|
||||
#include <asm/sn/pcibr_provider.h>
|
||||
#include <asm/sn/pcibus_provider_defs.h>
|
||||
#include <asm/sn/pcidev.h>
|
||||
#include "pci/pcibr_provider.h"
|
||||
#include <asm/sn/shub_mmr.h>
|
||||
#include <asm/sn/sn_sal.h>
|
||||
|
||||
|
@ -25,7 +25,8 @@ static void unregister_intr_pda(struct sn_irq_info *sn_irq_info);
|
|||
|
||||
extern int sn_force_interrupt_flag;
|
||||
extern int sn_ioif_inited;
|
||||
struct sn_irq_info **sn_irq;
|
||||
static struct list_head **sn_irq_lh;
|
||||
static spinlock_t sn_irq_info_lock = SPIN_LOCK_UNLOCKED; /* non-IRQ lock */
|
||||
|
||||
static inline uint64_t sn_intr_alloc(nasid_t local_nasid, int local_widget,
|
||||
u64 sn_irq_info,
|
||||
|
@ -115,82 +116,84 @@ static void sn_end_irq(unsigned int irq)
|
|||
force_interrupt(irq);
|
||||
}
|
||||
|
||||
static void sn_irq_info_free(struct rcu_head *head);
|
||||
|
||||
static void sn_set_affinity_irq(unsigned int irq, cpumask_t mask)
|
||||
{
|
||||
struct sn_irq_info *sn_irq_info = sn_irq[irq];
|
||||
struct sn_irq_info *tmp_sn_irq_info;
|
||||
struct sn_irq_info *sn_irq_info, *sn_irq_info_safe;
|
||||
int cpuid, cpuphys;
|
||||
nasid_t t_nasid; /* nasid to target */
|
||||
int t_slice; /* slice to target */
|
||||
|
||||
/* allocate a temp sn_irq_info struct to get new target info */
|
||||
tmp_sn_irq_info = kmalloc(sizeof(*tmp_sn_irq_info), GFP_KERNEL);
|
||||
if (!tmp_sn_irq_info)
|
||||
return;
|
||||
|
||||
cpuid = first_cpu(mask);
|
||||
cpuphys = cpu_physical_id(cpuid);
|
||||
t_nasid = cpuid_to_nasid(cpuid);
|
||||
t_slice = cpuid_to_slice(cpuid);
|
||||
|
||||
while (sn_irq_info) {
|
||||
int status;
|
||||
int local_widget;
|
||||
uint64_t bridge = (uint64_t) sn_irq_info->irq_bridge;
|
||||
nasid_t local_nasid = NASID_GET(bridge);
|
||||
list_for_each_entry_safe(sn_irq_info, sn_irq_info_safe,
|
||||
sn_irq_lh[irq], list) {
|
||||
uint64_t bridge;
|
||||
int local_widget, status;
|
||||
nasid_t local_nasid;
|
||||
struct sn_irq_info *new_irq_info;
|
||||
|
||||
if (!bridge)
|
||||
new_irq_info = kmalloc(sizeof(struct sn_irq_info), GFP_ATOMIC);
|
||||
if (new_irq_info == NULL)
|
||||
break;
|
||||
memcpy(new_irq_info, sn_irq_info, sizeof(struct sn_irq_info));
|
||||
|
||||
bridge = (uint64_t) new_irq_info->irq_bridge;
|
||||
if (!bridge) {
|
||||
kfree(new_irq_info);
|
||||
break; /* irq is not a device interrupt */
|
||||
}
|
||||
|
||||
local_nasid = NASID_GET(bridge);
|
||||
|
||||
if (local_nasid & 1)
|
||||
local_widget = TIO_SWIN_WIDGETNUM(bridge);
|
||||
else
|
||||
local_widget = SWIN_WIDGETNUM(bridge);
|
||||
|
||||
/* Free the old PROM sn_irq_info structure */
|
||||
sn_intr_free(local_nasid, local_widget, sn_irq_info);
|
||||
/* Free the old PROM new_irq_info structure */
|
||||
sn_intr_free(local_nasid, local_widget, new_irq_info);
|
||||
/* Update kernels new_irq_info with new target info */
|
||||
unregister_intr_pda(new_irq_info);
|
||||
|
||||
/* allocate a new PROM sn_irq_info struct */
|
||||
/* allocate a new PROM new_irq_info struct */
|
||||
status = sn_intr_alloc(local_nasid, local_widget,
|
||||
__pa(tmp_sn_irq_info), irq, t_nasid,
|
||||
t_slice);
|
||||
__pa(new_irq_info), irq,
|
||||
cpuid_to_nasid(cpuid),
|
||||
cpuid_to_slice(cpuid));
|
||||
|
||||
if (status == 0) {
|
||||
/* Update kernels sn_irq_info with new target info */
|
||||
unregister_intr_pda(sn_irq_info);
|
||||
sn_irq_info->irq_cpuid = cpuid;
|
||||
sn_irq_info->irq_nasid = t_nasid;
|
||||
sn_irq_info->irq_slice = t_slice;
|
||||
sn_irq_info->irq_xtalkaddr =
|
||||
tmp_sn_irq_info->irq_xtalkaddr;
|
||||
sn_irq_info->irq_cookie = tmp_sn_irq_info->irq_cookie;
|
||||
register_intr_pda(sn_irq_info);
|
||||
|
||||
if (IS_PCI_BRIDGE_ASIC(sn_irq_info->irq_bridge_type)) {
|
||||
pcibr_change_devices_irq(sn_irq_info);
|
||||
/* SAL call failed */
|
||||
if (status) {
|
||||
kfree(new_irq_info);
|
||||
break;
|
||||
}
|
||||
|
||||
sn_irq_info = sn_irq_info->irq_next;
|
||||
new_irq_info->irq_cpuid = cpuid;
|
||||
register_intr_pda(new_irq_info);
|
||||
|
||||
if (IS_PCI_BRIDGE_ASIC(new_irq_info->irq_bridge_type))
|
||||
pcibr_change_devices_irq(new_irq_info);
|
||||
|
||||
spin_lock(&sn_irq_info_lock);
|
||||
list_replace_rcu(&sn_irq_info->list, &new_irq_info->list);
|
||||
spin_unlock(&sn_irq_info_lock);
|
||||
call_rcu(&sn_irq_info->rcu, sn_irq_info_free);
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
set_irq_affinity_info((irq & 0xff), cpuphys, 0);
|
||||
#endif
|
||||
} else {
|
||||
break; /* snp_affinity failed the intr_alloc */
|
||||
}
|
||||
}
|
||||
kfree(tmp_sn_irq_info);
|
||||
}
|
||||
|
||||
struct hw_interrupt_type irq_type_sn = {
|
||||
"SN hub",
|
||||
sn_startup_irq,
|
||||
sn_shutdown_irq,
|
||||
sn_enable_irq,
|
||||
sn_disable_irq,
|
||||
sn_ack_irq,
|
||||
sn_end_irq,
|
||||
sn_set_affinity_irq
|
||||
.typename = "SN hub",
|
||||
.startup = sn_startup_irq,
|
||||
.shutdown = sn_shutdown_irq,
|
||||
.enable = sn_enable_irq,
|
||||
.disable = sn_disable_irq,
|
||||
.ack = sn_ack_irq,
|
||||
.end = sn_end_irq,
|
||||
.set_affinity = sn_set_affinity_irq
|
||||
};
|
||||
|
||||
unsigned int sn_local_vector_to_irq(u8 vector)
|
||||
|
@ -231,19 +234,18 @@ static void unregister_intr_pda(struct sn_irq_info *sn_irq_info)
|
|||
struct sn_irq_info *tmp_irq_info;
|
||||
int i, foundmatch;
|
||||
|
||||
rcu_read_lock();
|
||||
if (pdacpu(cpu)->sn_last_irq == irq) {
|
||||
foundmatch = 0;
|
||||
for (i = pdacpu(cpu)->sn_last_irq - 1; i; i--) {
|
||||
tmp_irq_info = sn_irq[i];
|
||||
while (tmp_irq_info) {
|
||||
for (i = pdacpu(cpu)->sn_last_irq - 1;
|
||||
i && !foundmatch; i--) {
|
||||
list_for_each_entry_rcu(tmp_irq_info,
|
||||
sn_irq_lh[i],
|
||||
list) {
|
||||
if (tmp_irq_info->irq_cpuid == cpu) {
|
||||
foundmatch++;
|
||||
foundmatch = 1;
|
||||
break;
|
||||
}
|
||||
tmp_irq_info = tmp_irq_info->irq_next;
|
||||
}
|
||||
if (foundmatch) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
pdacpu(cpu)->sn_last_irq = i;
|
||||
|
@ -251,60 +253,27 @@ static void unregister_intr_pda(struct sn_irq_info *sn_irq_info)
|
|||
|
||||
if (pdacpu(cpu)->sn_first_irq == irq) {
|
||||
foundmatch = 0;
|
||||
for (i = pdacpu(cpu)->sn_first_irq + 1; i < NR_IRQS; i++) {
|
||||
tmp_irq_info = sn_irq[i];
|
||||
while (tmp_irq_info) {
|
||||
for (i = pdacpu(cpu)->sn_first_irq + 1;
|
||||
i < NR_IRQS && !foundmatch; i++) {
|
||||
list_for_each_entry_rcu(tmp_irq_info,
|
||||
sn_irq_lh[i],
|
||||
list) {
|
||||
if (tmp_irq_info->irq_cpuid == cpu) {
|
||||
foundmatch++;
|
||||
foundmatch = 1;
|
||||
break;
|
||||
}
|
||||
tmp_irq_info = tmp_irq_info->irq_next;
|
||||
}
|
||||
if (foundmatch) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
pdacpu(cpu)->sn_first_irq = ((i == NR_IRQS) ? 0 : i);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
struct sn_irq_info *sn_irq_alloc(nasid_t local_nasid, int local_widget, int irq,
|
||||
nasid_t nasid, int slice)
|
||||
static void sn_irq_info_free(struct rcu_head *head)
|
||||
{
|
||||
struct sn_irq_info *sn_irq_info;
|
||||
int status;
|
||||
|
||||
sn_irq_info = kmalloc(sizeof(*sn_irq_info), GFP_KERNEL);
|
||||
if (sn_irq_info == NULL)
|
||||
return NULL;
|
||||
|
||||
memset(sn_irq_info, 0x0, sizeof(*sn_irq_info));
|
||||
|
||||
status =
|
||||
sn_intr_alloc(local_nasid, local_widget, __pa(sn_irq_info), irq,
|
||||
nasid, slice);
|
||||
|
||||
if (status) {
|
||||
kfree(sn_irq_info);
|
||||
return NULL;
|
||||
} else {
|
||||
return sn_irq_info;
|
||||
}
|
||||
}
|
||||
|
||||
void sn_irq_free(struct sn_irq_info *sn_irq_info)
|
||||
{
|
||||
uint64_t bridge = (uint64_t) sn_irq_info->irq_bridge;
|
||||
nasid_t local_nasid = NASID_GET(bridge);
|
||||
int local_widget;
|
||||
|
||||
if (local_nasid & 1) /* tio check */
|
||||
local_widget = TIO_SWIN_WIDGETNUM(bridge);
|
||||
else
|
||||
local_widget = SWIN_WIDGETNUM(bridge);
|
||||
|
||||
sn_intr_free(local_nasid, local_widget, sn_irq_info);
|
||||
|
||||
sn_irq_info = container_of(head, struct sn_irq_info, rcu);
|
||||
kfree(sn_irq_info);
|
||||
}
|
||||
|
||||
|
@ -314,30 +283,54 @@ void sn_irq_fixup(struct pci_dev *pci_dev, struct sn_irq_info *sn_irq_info)
|
|||
int slice = sn_irq_info->irq_slice;
|
||||
int cpu = nasid_slice_to_cpuid(nasid, slice);
|
||||
|
||||
pci_dev_get(pci_dev);
|
||||
sn_irq_info->irq_cpuid = cpu;
|
||||
sn_irq_info->irq_pciioinfo = SN_PCIDEV_INFO(pci_dev);
|
||||
|
||||
/* link it into the sn_irq[irq] list */
|
||||
sn_irq_info->irq_next = sn_irq[sn_irq_info->irq_irq];
|
||||
sn_irq[sn_irq_info->irq_irq] = sn_irq_info;
|
||||
spin_lock(&sn_irq_info_lock);
|
||||
list_add_rcu(&sn_irq_info->list, sn_irq_lh[sn_irq_info->irq_irq]);
|
||||
spin_unlock(&sn_irq_info_lock);
|
||||
|
||||
(void)register_intr_pda(sn_irq_info);
|
||||
}
|
||||
|
||||
void sn_irq_unfixup(struct pci_dev *pci_dev)
|
||||
{
|
||||
struct sn_irq_info *sn_irq_info;
|
||||
|
||||
/* Only cleanup IRQ stuff if this device has a host bus context */
|
||||
if (!SN_PCIDEV_BUSSOFT(pci_dev))
|
||||
return;
|
||||
|
||||
sn_irq_info = SN_PCIDEV_INFO(pci_dev)->pdi_sn_irq_info;
|
||||
if (!sn_irq_info || !sn_irq_info->irq_irq) {
|
||||
kfree(sn_irq_info);
|
||||
return;
|
||||
}
|
||||
|
||||
unregister_intr_pda(sn_irq_info);
|
||||
spin_lock(&sn_irq_info_lock);
|
||||
list_del_rcu(&sn_irq_info->list);
|
||||
spin_unlock(&sn_irq_info_lock);
|
||||
call_rcu(&sn_irq_info->rcu, sn_irq_info_free);
|
||||
pci_dev_put(pci_dev);
|
||||
}
|
||||
|
||||
static void force_interrupt(int irq)
|
||||
{
|
||||
struct sn_irq_info *sn_irq_info;
|
||||
|
||||
if (!sn_ioif_inited)
|
||||
return;
|
||||
sn_irq_info = sn_irq[irq];
|
||||
while (sn_irq_info) {
|
||||
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(sn_irq_info, sn_irq_lh[irq], list) {
|
||||
if (IS_PCI_BRIDGE_ASIC(sn_irq_info->irq_bridge_type) &&
|
||||
(sn_irq_info->irq_bridge != NULL)) {
|
||||
(sn_irq_info->irq_bridge != NULL))
|
||||
pcibr_force_interrupt(sn_irq_info);
|
||||
}
|
||||
sn_irq_info = sn_irq_info->irq_next;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -402,19 +395,41 @@ static void sn_check_intr(int irq, struct sn_irq_info *sn_irq_info)
|
|||
|
||||
void sn_lb_int_war_check(void)
|
||||
{
|
||||
struct sn_irq_info *sn_irq_info;
|
||||
int i;
|
||||
|
||||
if (!sn_ioif_inited || pda->sn_first_irq == 0)
|
||||
return;
|
||||
|
||||
rcu_read_lock();
|
||||
for (i = pda->sn_first_irq; i <= pda->sn_last_irq; i++) {
|
||||
struct sn_irq_info *sn_irq_info = sn_irq[i];
|
||||
while (sn_irq_info) {
|
||||
/* Only call for PCI bridges that are fully initialized. */
|
||||
list_for_each_entry_rcu(sn_irq_info, sn_irq_lh[i], list) {
|
||||
/*
|
||||
* Only call for PCI bridges that are fully
|
||||
* initialized.
|
||||
*/
|
||||
if (IS_PCI_BRIDGE_ASIC(sn_irq_info->irq_bridge_type) &&
|
||||
(sn_irq_info->irq_bridge != NULL)) {
|
||||
(sn_irq_info->irq_bridge != NULL))
|
||||
sn_check_intr(i, sn_irq_info);
|
||||
}
|
||||
sn_irq_info = sn_irq_info->irq_next;
|
||||
}
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
void sn_irq_lh_init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
sn_irq_lh = kmalloc(sizeof(struct list_head *) * NR_IRQS, GFP_KERNEL);
|
||||
if (!sn_irq_lh)
|
||||
panic("SN PCI INIT: Failed to allocate memory for PCI init\n");
|
||||
|
||||
for (i = 0; i < NR_IRQS; i++) {
|
||||
sn_irq_lh[i] = kmalloc(sizeof(struct list_head), GFP_KERNEL);
|
||||
if (!sn_irq_lh[i])
|
||||
panic("SN PCI INIT: Failed IRQ memory allocation\n");
|
||||
|
||||
INIT_LIST_HEAD(sn_irq_lh[i]);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -270,7 +270,7 @@ void __init sn_setup(char **cmdline_p)
|
|||
{
|
||||
long status, ticks_per_sec, drift;
|
||||
int pxm;
|
||||
int major = sn_sal_rev_major(), minor = sn_sal_rev_minor();
|
||||
u32 version = sn_sal_rev();
|
||||
extern void sn_cpu_init(void);
|
||||
|
||||
ia64_sn_plat_set_error_handling_features();
|
||||
|
@ -308,22 +308,21 @@ void __init sn_setup(char **cmdline_p)
|
|||
* support here so we don't have to listen to failed keyboard probe
|
||||
* messages.
|
||||
*/
|
||||
if ((major < 2 || (major == 2 && minor <= 9)) &&
|
||||
acpi_kbd_controller_present) {
|
||||
if (version <= 0x0209 && acpi_kbd_controller_present) {
|
||||
printk(KERN_INFO "Disabling legacy keyboard support as prom "
|
||||
"is too old and doesn't provide FADT\n");
|
||||
acpi_kbd_controller_present = 0;
|
||||
}
|
||||
|
||||
printk("SGI SAL version %x.%02x\n", major, minor);
|
||||
printk("SGI SAL version %x.%02x\n", version >> 8, version & 0x00FF);
|
||||
|
||||
/*
|
||||
* Confirm the SAL we're running on is recent enough...
|
||||
*/
|
||||
if ((major < SN_SAL_MIN_MAJOR) || (major == SN_SAL_MIN_MAJOR &&
|
||||
minor < SN_SAL_MIN_MINOR)) {
|
||||
if (version < SN_SAL_MIN_VERSION) {
|
||||
printk(KERN_ERR "This kernel needs SGI SAL version >= "
|
||||
"%x.%02x\n", SN_SAL_MIN_MAJOR, SN_SAL_MIN_MINOR);
|
||||
"%x.%02x\n", SN_SAL_MIN_VERSION >> 8,
|
||||
SN_SAL_MIN_VERSION & 0x00FF);
|
||||
panic("PROM version too old\n");
|
||||
}
|
||||
|
||||
|
|
|
@ -8,12 +8,12 @@
|
|||
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/delay.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/sn/sn_sal.h>
|
||||
#include <asm/sn/addrs.h>
|
||||
|
@ -481,6 +481,9 @@ static int __init tiocx_init(void)
|
|||
cnodeid_t cnodeid;
|
||||
int found_tiocx_device = 0;
|
||||
|
||||
if (!ia64_platform_is("sn2"))
|
||||
return -ENODEV;
|
||||
|
||||
bus_register(&tiocx_bus_type);
|
||||
|
||||
for (cnodeid = 0; cnodeid < MAX_COMPACT_NODES; cnodeid++) {
|
||||
|
|
|
@ -53,6 +53,7 @@
|
|||
#include <linux/cache.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/delay.h>
|
||||
#include <asm/sn/intr.h>
|
||||
#include <asm/sn/sn_sal.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
@ -308,8 +309,7 @@ xpc_make_first_contact(struct xpc_partition *part)
|
|||
"partition %d\n", XPC_PARTID(part));
|
||||
|
||||
/* wait a 1/4 of a second or so */
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
(void) schedule_timeout(0.25 * HZ);
|
||||
msleep_interruptible(250);
|
||||
|
||||
if (part->act_state == XPC_P_DEACTIVATING) {
|
||||
return part->reason;
|
||||
|
@ -841,9 +841,7 @@ xpc_do_exit(void)
|
|||
down(&xpc_discovery_exited);
|
||||
|
||||
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
schedule_timeout(0.3 * HZ);
|
||||
set_current_state(TASK_RUNNING);
|
||||
msleep_interruptible(300);
|
||||
|
||||
|
||||
/* wait for all partitions to become inactive */
|
||||
|
@ -860,12 +858,8 @@ xpc_do_exit(void)
|
|||
}
|
||||
}
|
||||
|
||||
if (active_part_count) {
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
schedule_timeout(0.3 * HZ);
|
||||
set_current_state(TASK_RUNNING);
|
||||
}
|
||||
|
||||
if (active_part_count)
|
||||
msleep_interruptible(300);
|
||||
} while (active_part_count > 0);
|
||||
|
||||
|
||||
|
|
|
@ -11,9 +11,10 @@
|
|||
|
||||
#include <linux/module.h>
|
||||
#include <asm/dma.h>
|
||||
#include <asm/sn/sn_sal.h>
|
||||
#include <asm/sn/pcibr_provider.h>
|
||||
#include <asm/sn/pcibus_provider_defs.h>
|
||||
#include <asm/sn/pcidev.h>
|
||||
#include <asm/sn/sn_sal.h>
|
||||
|
||||
#define SG_ENT_VIRT_ADDRESS(sg) (page_address((sg)->page) + (sg)->offset)
|
||||
#define SG_ENT_PHYS_ADDRESS(SG) virt_to_phys(SG_ENT_VIRT_ADDRESS(SG))
|
||||
|
|
|
@ -8,9 +8,9 @@
|
|||
|
||||
#include <linux/types.h>
|
||||
#include <asm/sn/sn_sal.h>
|
||||
#include <asm/sn/pcibr_provider.h>
|
||||
#include <asm/sn/pcibus_provider_defs.h>
|
||||
#include <asm/sn/pcidev.h>
|
||||
#include "pci/pcibr_provider.h"
|
||||
|
||||
int pcibr_invalidate_ate = 0; /* by default don't invalidate ATE on free */
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue