Merge branch 'master' into next
This commit is contained in:
commit
ac7242142b
@ -122,3 +122,10 @@ Description:
|
||||
This symbolic link appears when a device is a Virtual Function.
|
||||
The symbolic link points to the PCI device sysfs entry of the
|
||||
Physical Function this device associates with.
|
||||
|
||||
What: /sys/bus/pci/slots/.../module
|
||||
Date: June 2009
|
||||
Contact: linux-pci@vger.kernel.org
|
||||
Description:
|
||||
This symbolic link points to the PCI hotplug controller driver
|
||||
module that manages the hotplug slot.
|
||||
|
125
Documentation/ABI/testing/sysfs-class-mtd
Normal file
125
Documentation/ABI/testing/sysfs-class-mtd
Normal file
@ -0,0 +1,125 @@
|
||||
What: /sys/class/mtd/
|
||||
Date: April 2009
|
||||
KernelVersion: 2.6.29
|
||||
Contact: linux-mtd@lists.infradead.org
|
||||
Description:
|
||||
The mtd/ class subdirectory belongs to the MTD subsystem
|
||||
(MTD core).
|
||||
|
||||
What: /sys/class/mtd/mtdX/
|
||||
Date: April 2009
|
||||
KernelVersion: 2.6.29
|
||||
Contact: linux-mtd@lists.infradead.org
|
||||
Description:
|
||||
The /sys/class/mtd/mtd{0,1,2,3,...} directories correspond
|
||||
to each /dev/mtdX character device. These may represent
|
||||
physical/simulated flash devices, partitions on a flash
|
||||
device, or concatenated flash devices. They exist regardless
|
||||
of whether CONFIG_MTD_CHAR is actually enabled.
|
||||
|
||||
What: /sys/class/mtd/mtdXro/
|
||||
Date: April 2009
|
||||
KernelVersion: 2.6.29
|
||||
Contact: linux-mtd@lists.infradead.org
|
||||
Description:
|
||||
These directories provide the corresponding read-only device
|
||||
nodes for /sys/class/mtd/mtdX/ . They are only created
|
||||
(for the benefit of udev) if CONFIG_MTD_CHAR is enabled.
|
||||
|
||||
What: /sys/class/mtd/mtdX/dev
|
||||
Date: April 2009
|
||||
KernelVersion: 2.6.29
|
||||
Contact: linux-mtd@lists.infradead.org
|
||||
Description:
|
||||
Major and minor numbers of the character device corresponding
|
||||
to this MTD device (in <major>:<minor> format). This is the
|
||||
read-write device so <minor> will be even.
|
||||
|
||||
What: /sys/class/mtd/mtdXro/dev
|
||||
Date: April 2009
|
||||
KernelVersion: 2.6.29
|
||||
Contact: linux-mtd@lists.infradead.org
|
||||
Description:
|
||||
Major and minor numbers of the character device corresponding
|
||||
to the read-only variant of thie MTD device (in
|
||||
<major>:<minor> format). In this case <minor> will be odd.
|
||||
|
||||
What: /sys/class/mtd/mtdX/erasesize
|
||||
Date: April 2009
|
||||
KernelVersion: 2.6.29
|
||||
Contact: linux-mtd@lists.infradead.org
|
||||
Description:
|
||||
"Major" erase size for the device. If numeraseregions is
|
||||
zero, this is the eraseblock size for the entire device.
|
||||
Otherwise, the MEMGETREGIONCOUNT/MEMGETREGIONINFO ioctls
|
||||
can be used to determine the actual eraseblock layout.
|
||||
|
||||
What: /sys/class/mtd/mtdX/flags
|
||||
Date: April 2009
|
||||
KernelVersion: 2.6.29
|
||||
Contact: linux-mtd@lists.infradead.org
|
||||
Description:
|
||||
A hexadecimal value representing the device flags, ORed
|
||||
together:
|
||||
|
||||
0x0400: MTD_WRITEABLE - device is writable
|
||||
0x0800: MTD_BIT_WRITEABLE - single bits can be flipped
|
||||
0x1000: MTD_NO_ERASE - no erase necessary
|
||||
0x2000: MTD_POWERUP_LOCK - always locked after reset
|
||||
|
||||
What: /sys/class/mtd/mtdX/name
|
||||
Date: April 2009
|
||||
KernelVersion: 2.6.29
|
||||
Contact: linux-mtd@lists.infradead.org
|
||||
Description:
|
||||
A human-readable ASCII name for the device or partition.
|
||||
This will match the name in /proc/mtd .
|
||||
|
||||
What: /sys/class/mtd/mtdX/numeraseregions
|
||||
Date: April 2009
|
||||
KernelVersion: 2.6.29
|
||||
Contact: linux-mtd@lists.infradead.org
|
||||
Description:
|
||||
For devices that have variable eraseblock sizes, this
|
||||
provides the total number of erase regions. Otherwise,
|
||||
it will read back as zero.
|
||||
|
||||
What: /sys/class/mtd/mtdX/oobsize
|
||||
Date: April 2009
|
||||
KernelVersion: 2.6.29
|
||||
Contact: linux-mtd@lists.infradead.org
|
||||
Description:
|
||||
Number of OOB bytes per page.
|
||||
|
||||
What: /sys/class/mtd/mtdX/size
|
||||
Date: April 2009
|
||||
KernelVersion: 2.6.29
|
||||
Contact: linux-mtd@lists.infradead.org
|
||||
Description:
|
||||
Total size of the device/partition, in bytes.
|
||||
|
||||
What: /sys/class/mtd/mtdX/type
|
||||
Date: April 2009
|
||||
KernelVersion: 2.6.29
|
||||
Contact: linux-mtd@lists.infradead.org
|
||||
Description:
|
||||
One of the following ASCII strings, representing the device
|
||||
type:
|
||||
|
||||
absent, ram, rom, nor, nand, dataflash, ubi, unknown
|
||||
|
||||
What: /sys/class/mtd/mtdX/writesize
|
||||
Date: April 2009
|
||||
KernelVersion: 2.6.29
|
||||
Contact: linux-mtd@lists.infradead.org
|
||||
Description:
|
||||
Minimal writable flash unit size. This will always be
|
||||
a positive integer.
|
||||
|
||||
In the case of NOR flash it is 1 (even though individual
|
||||
bits can be cleared).
|
||||
|
||||
In the case of NAND flash it is one NAND page (or a
|
||||
half page, or a quarter page).
|
||||
|
||||
In the case of ECC NOR, it is the ECC block size.
|
@ -61,6 +61,10 @@ be initiated although firmwares have no _OSC support. To enable the
|
||||
walkaround, pls. add aerdriver.forceload=y to kernel boot parameter line
|
||||
when booting kernel. Note that forceload=n by default.
|
||||
|
||||
nosourceid, another parameter of type bool, can be used when broken
|
||||
hardware (mostly chipsets) has root ports that cannot obtain the reporting
|
||||
source ID. nosourceid=n by default.
|
||||
|
||||
2.3 AER error output
|
||||
When a PCI-E AER error is captured, an error message will be outputed to
|
||||
console. If it's a correctable error, it is outputed as a warning.
|
||||
@ -246,3 +250,24 @@ with the PCI Express AER Root driver?
|
||||
A: It could call the helper functions to enable AER in devices and
|
||||
cleanup uncorrectable status register. Pls. refer to section 3.3.
|
||||
|
||||
|
||||
4. Software error injection
|
||||
|
||||
Debugging PCIE AER error recovery code is quite difficult because it
|
||||
is hard to trigger real hardware errors. Software based error
|
||||
injection can be used to fake various kinds of PCIE errors.
|
||||
|
||||
First you should enable PCIE AER software error injection in kernel
|
||||
configuration, that is, following item should be in your .config.
|
||||
|
||||
CONFIG_PCIEAER_INJECT=y or CONFIG_PCIEAER_INJECT=m
|
||||
|
||||
After reboot with new kernel or insert the module, a device file named
|
||||
/dev/aer_inject should be created.
|
||||
|
||||
Then, you need a user space tool named aer-inject, which can be gotten
|
||||
from:
|
||||
http://www.kernel.org/pub/linux/utils/pci/aer-inject/
|
||||
|
||||
More information about aer-inject can be found in the document comes
|
||||
with its source code.
|
||||
|
@ -54,7 +54,7 @@ kernel patches.
|
||||
CONFIG_PREEMPT.
|
||||
|
||||
14: If the patch affects IO/Disk, etc: has been tested with and without
|
||||
CONFIG_LBD.
|
||||
CONFIG_LBDAF.
|
||||
|
||||
15: All codepaths have been exercised with all lockdep features enabled.
|
||||
|
||||
|
54
Documentation/device-mapper/dm-log.txt
Normal file
54
Documentation/device-mapper/dm-log.txt
Normal file
@ -0,0 +1,54 @@
|
||||
Device-Mapper Logging
|
||||
=====================
|
||||
The device-mapper logging code is used by some of the device-mapper
|
||||
RAID targets to track regions of the disk that are not consistent.
|
||||
A region (or portion of the address space) of the disk may be
|
||||
inconsistent because a RAID stripe is currently being operated on or
|
||||
a machine died while the region was being altered. In the case of
|
||||
mirrors, a region would be considered dirty/inconsistent while you
|
||||
are writing to it because the writes need to be replicated for all
|
||||
the legs of the mirror and may not reach the legs at the same time.
|
||||
Once all writes are complete, the region is considered clean again.
|
||||
|
||||
There is a generic logging interface that the device-mapper RAID
|
||||
implementations use to perform logging operations (see
|
||||
dm_dirty_log_type in include/linux/dm-dirty-log.h). Various different
|
||||
logging implementations are available and provide different
|
||||
capabilities. The list includes:
|
||||
|
||||
Type Files
|
||||
==== =====
|
||||
disk drivers/md/dm-log.c
|
||||
core drivers/md/dm-log.c
|
||||
userspace drivers/md/dm-log-userspace* include/linux/dm-log-userspace.h
|
||||
|
||||
The "disk" log type
|
||||
-------------------
|
||||
This log implementation commits the log state to disk. This way, the
|
||||
logging state survives reboots/crashes.
|
||||
|
||||
The "core" log type
|
||||
-------------------
|
||||
This log implementation keeps the log state in memory. The log state
|
||||
will not survive a reboot or crash, but there may be a small boost in
|
||||
performance. This method can also be used if no storage device is
|
||||
available for storing log state.
|
||||
|
||||
The "userspace" log type
|
||||
------------------------
|
||||
This log type simply provides a way to export the log API to userspace,
|
||||
so log implementations can be done there. This is done by forwarding most
|
||||
logging requests to userspace, where a daemon receives and processes the
|
||||
request.
|
||||
|
||||
The structure used for communication between kernel and userspace are
|
||||
located in include/linux/dm-log-userspace.h. Due to the frequency,
|
||||
diversity, and 2-way communication nature of the exchanges between
|
||||
kernel and userspace, 'connector' is used as the interface for
|
||||
communication.
|
||||
|
||||
There are currently two userspace log implementations that leverage this
|
||||
framework - "clustered_disk" and "clustered_core". These implementations
|
||||
provide a cluster-coherent log for shared-storage. Device-mapper mirroring
|
||||
can be used in a shared-storage environment when the cluster log implementations
|
||||
are employed.
|
39
Documentation/device-mapper/dm-queue-length.txt
Normal file
39
Documentation/device-mapper/dm-queue-length.txt
Normal file
@ -0,0 +1,39 @@
|
||||
dm-queue-length
|
||||
===============
|
||||
|
||||
dm-queue-length is a path selector module for device-mapper targets,
|
||||
which selects a path with the least number of in-flight I/Os.
|
||||
The path selector name is 'queue-length'.
|
||||
|
||||
Table parameters for each path: [<repeat_count>]
|
||||
<repeat_count>: The number of I/Os to dispatch using the selected
|
||||
path before switching to the next path.
|
||||
If not given, internal default is used. To check
|
||||
the default value, see the activated table.
|
||||
|
||||
Status for each path: <status> <fail-count> <in-flight>
|
||||
<status>: 'A' if the path is active, 'F' if the path is failed.
|
||||
<fail-count>: The number of path failures.
|
||||
<in-flight>: The number of in-flight I/Os on the path.
|
||||
|
||||
|
||||
Algorithm
|
||||
=========
|
||||
|
||||
dm-queue-length increments/decrements 'in-flight' when an I/O is
|
||||
dispatched/completed respectively.
|
||||
dm-queue-length selects a path with the minimum 'in-flight'.
|
||||
|
||||
|
||||
Examples
|
||||
========
|
||||
In case that 2 paths (sda and sdb) are used with repeat_count == 128.
|
||||
|
||||
# echo "0 10 multipath 0 0 1 1 queue-length 0 2 1 8:0 128 8:16 128" \
|
||||
dmsetup create test
|
||||
#
|
||||
# dmsetup table
|
||||
test: 0 10 multipath 0 0 1 1 queue-length 0 2 1 8:0 128 8:16 128
|
||||
#
|
||||
# dmsetup status
|
||||
test: 0 10 multipath 2 0 0 0 1 1 E 0 2 1 8:0 A 0 0 8:16 A 0 0
|
91
Documentation/device-mapper/dm-service-time.txt
Normal file
91
Documentation/device-mapper/dm-service-time.txt
Normal file
@ -0,0 +1,91 @@
|
||||
dm-service-time
|
||||
===============
|
||||
|
||||
dm-service-time is a path selector module for device-mapper targets,
|
||||
which selects a path with the shortest estimated service time for
|
||||
the incoming I/O.
|
||||
|
||||
The service time for each path is estimated by dividing the total size
|
||||
of in-flight I/Os on a path with the performance value of the path.
|
||||
The performance value is a relative throughput value among all paths
|
||||
in a path-group, and it can be specified as a table argument.
|
||||
|
||||
The path selector name is 'service-time'.
|
||||
|
||||
Table parameters for each path: [<repeat_count> [<relative_throughput>]]
|
||||
<repeat_count>: The number of I/Os to dispatch using the selected
|
||||
path before switching to the next path.
|
||||
If not given, internal default is used. To check
|
||||
the default value, see the activated table.
|
||||
<relative_throughput>: The relative throughput value of the path
|
||||
among all paths in the path-group.
|
||||
The valid range is 0-100.
|
||||
If not given, minimum value '1' is used.
|
||||
If '0' is given, the path isn't selected while
|
||||
other paths having a positive value are available.
|
||||
|
||||
Status for each path: <status> <fail-count> <in-flight-size> \
|
||||
<relative_throughput>
|
||||
<status>: 'A' if the path is active, 'F' if the path is failed.
|
||||
<fail-count>: The number of path failures.
|
||||
<in-flight-size>: The size of in-flight I/Os on the path.
|
||||
<relative_throughput>: The relative throughput value of the path
|
||||
among all paths in the path-group.
|
||||
|
||||
|
||||
Algorithm
|
||||
=========
|
||||
|
||||
dm-service-time adds the I/O size to 'in-flight-size' when the I/O is
|
||||
dispatched and substracts when completed.
|
||||
Basically, dm-service-time selects a path having minimum service time
|
||||
which is calculated by:
|
||||
|
||||
('in-flight-size' + 'size-of-incoming-io') / 'relative_throughput'
|
||||
|
||||
However, some optimizations below are used to reduce the calculation
|
||||
as much as possible.
|
||||
|
||||
1. If the paths have the same 'relative_throughput', skip
|
||||
the division and just compare the 'in-flight-size'.
|
||||
|
||||
2. If the paths have the same 'in-flight-size', skip the division
|
||||
and just compare the 'relative_throughput'.
|
||||
|
||||
3. If some paths have non-zero 'relative_throughput' and others
|
||||
have zero 'relative_throughput', ignore those paths with zero
|
||||
'relative_throughput'.
|
||||
|
||||
If such optimizations can't be applied, calculate service time, and
|
||||
compare service time.
|
||||
If calculated service time is equal, the path having maximum
|
||||
'relative_throughput' may be better. So compare 'relative_throughput'
|
||||
then.
|
||||
|
||||
|
||||
Examples
|
||||
========
|
||||
In case that 2 paths (sda and sdb) are used with repeat_count == 128
|
||||
and sda has an average throughput 1GB/s and sdb has 4GB/s,
|
||||
'relative_throughput' value may be '1' for sda and '4' for sdb.
|
||||
|
||||
# echo "0 10 multipath 0 0 1 1 service-time 0 2 2 8:0 128 1 8:16 128 4" \
|
||||
dmsetup create test
|
||||
#
|
||||
# dmsetup table
|
||||
test: 0 10 multipath 0 0 1 1 service-time 0 2 2 8:0 128 1 8:16 128 4
|
||||
#
|
||||
# dmsetup status
|
||||
test: 0 10 multipath 2 0 0 0 1 1 E 0 2 2 8:0 A 0 0 1 8:16 A 0 0 4
|
||||
|
||||
|
||||
Or '2' for sda and '8' for sdb would be also true.
|
||||
|
||||
# echo "0 10 multipath 0 0 1 1 service-time 0 2 2 8:0 128 2 8:16 128 8" \
|
||||
dmsetup create test
|
||||
#
|
||||
# dmsetup table
|
||||
test: 0 10 multipath 0 0 1 1 service-time 0 2 2 8:0 128 2 8:16 128 8
|
||||
#
|
||||
# dmsetup status
|
||||
test: 0 10 multipath 2 0 0 0 1 1 E 0 2 2 8:0 A 0 0 2 8:16 A 0 0 8
|
@ -368,16 +368,6 @@ Who: Krzysztof Piotr Oledzki <ole@ans.pl>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: i2c_attach_client(), i2c_detach_client(), i2c_driver->detach_client(),
|
||||
i2c_adapter->client_register(), i2c_adapter->client_unregister
|
||||
When: 2.6.30
|
||||
Check: i2c_attach_client i2c_detach_client
|
||||
Why: Deprecated by the new (standard) device driver binding model. Use
|
||||
i2c_driver->probe() and ->remove() instead.
|
||||
Who: Jean Delvare <khali@linux-fr.org>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: fscher and fscpos drivers
|
||||
When: June 2009
|
||||
Why: Deprecated by the new fschmd driver.
|
||||
|
@ -66,6 +66,10 @@ mandatory-locking.txt
|
||||
- info on the Linux implementation of Sys V mandatory file locking.
|
||||
ncpfs.txt
|
||||
- info on Novell Netware(tm) filesystem using NCP protocol.
|
||||
nfs41-server.txt
|
||||
- info on the Linux server implementation of NFSv4 minor version 1.
|
||||
nfs-rdma.txt
|
||||
- how to install and setup the Linux NFS/RDMA client and server software.
|
||||
nfsroot.txt
|
||||
- short guide on setting up a diskless box with NFS root filesystem.
|
||||
nilfs2.txt
|
||||
|
@ -109,27 +109,28 @@ prototypes:
|
||||
|
||||
locking rules:
|
||||
All may block.
|
||||
BKL s_lock s_umount
|
||||
alloc_inode: no no no
|
||||
destroy_inode: no
|
||||
dirty_inode: no (must not sleep)
|
||||
write_inode: no
|
||||
drop_inode: no !!!inode_lock!!!
|
||||
delete_inode: no
|
||||
put_super: yes yes no
|
||||
write_super: no yes read
|
||||
sync_fs: no no read
|
||||
freeze_fs: ?
|
||||
unfreeze_fs: ?
|
||||
statfs: no no no
|
||||
remount_fs: yes yes maybe (see below)
|
||||
clear_inode: no
|
||||
umount_begin: yes no no
|
||||
show_options: no (vfsmount->sem)
|
||||
quota_read: no no no (see below)
|
||||
quota_write: no no no (see below)
|
||||
None have BKL
|
||||
s_umount
|
||||
alloc_inode:
|
||||
destroy_inode:
|
||||
dirty_inode: (must not sleep)
|
||||
write_inode:
|
||||
drop_inode: !!!inode_lock!!!
|
||||
delete_inode:
|
||||
put_super: write
|
||||
write_super: read
|
||||
sync_fs: read
|
||||
freeze_fs: read
|
||||
unfreeze_fs: read
|
||||
statfs: no
|
||||
remount_fs: maybe (see below)
|
||||
clear_inode:
|
||||
umount_begin: no
|
||||
show_options: no (namespace_sem)
|
||||
quota_read: no (see below)
|
||||
quota_write: no (see below)
|
||||
|
||||
->remount_fs() will have the s_umount lock if it's already mounted.
|
||||
->remount_fs() will have the s_umount exclusive lock if it's already mounted.
|
||||
When called from get_sb_single, it does NOT have the s_umount lock.
|
||||
->quota_read() and ->quota_write() functions are both guaranteed to
|
||||
be the only ones operating on the quota file by the quota code (via
|
||||
|
@ -165,3 +165,47 @@ was done there. Two significant differences are:
|
||||
Once again, method 3 should be avoided wherever possible. Explicit device
|
||||
instantiation (methods 1 and 2) is much preferred for it is safer and
|
||||
faster.
|
||||
|
||||
|
||||
Method 4: Instantiate from user-space
|
||||
-------------------------------------
|
||||
|
||||
In general, the kernel should know which I2C devices are connected and
|
||||
what addresses they live at. However, in certain cases, it does not, so a
|
||||
sysfs interface was added to let the user provide the information. This
|
||||
interface is made of 2 attribute files which are created in every I2C bus
|
||||
directory: new_device and delete_device. Both files are write only and you
|
||||
must write the right parameters to them in order to properly instantiate,
|
||||
respectively delete, an I2C device.
|
||||
|
||||
File new_device takes 2 parameters: the name of the I2C device (a string)
|
||||
and the address of the I2C device (a number, typically expressed in
|
||||
hexadecimal starting with 0x, but can also be expressed in decimal.)
|
||||
|
||||
File delete_device takes a single parameter: the address of the I2C
|
||||
device. As no two devices can live at the same address on a given I2C
|
||||
segment, the address is sufficient to uniquely identify the device to be
|
||||
deleted.
|
||||
|
||||
Example:
|
||||
# echo eeprom 0x50 > /sys/class/i2c-adapter/i2c-3/new_device
|
||||
|
||||
While this interface should only be used when in-kernel device declaration
|
||||
can't be done, there is a variety of cases where it can be helpful:
|
||||
* The I2C driver usually detects devices (method 3 above) but the bus
|
||||
segment your device lives on doesn't have the proper class bit set and
|
||||
thus detection doesn't trigger.
|
||||
* The I2C driver usually detects devices, but your device lives at an
|
||||
unexpected address.
|
||||
* The I2C driver usually detects devices, but your device is not detected,
|
||||
either because the detection routine is too strict, or because your
|
||||
device is not officially supported yet but you know it is compatible.
|
||||
* You are developing a driver on a test board, where you soldered the I2C
|
||||
device yourself.
|
||||
|
||||
This interface is a replacement for the force_* module parameters some I2C
|
||||
drivers implement. Being implemented in i2c-core rather than in each
|
||||
device driver individually, it is much more efficient, and also has the
|
||||
advantage that you do not have to reload the driver to change a setting.
|
||||
You can also instantiate the device before the driver is loaded or even
|
||||
available, and you don't need to know what driver the device needs.
|
||||
|
@ -126,19 +126,9 @@ different) configuration information, as do drivers handling chip variants
|
||||
that can't be distinguished by protocol probing, or which need some board
|
||||
specific information to operate correctly.
|
||||
|
||||
Accordingly, the I2C stack now has two models for associating I2C devices
|
||||
with their drivers: the original "legacy" model, and a newer one that's
|
||||
fully compatible with the Linux 2.6 driver model. These models do not mix,
|
||||
since the "legacy" model requires drivers to create "i2c_client" device
|
||||
objects after SMBus style probing, while the Linux driver model expects
|
||||
drivers to be given such device objects in their probe() routines.
|
||||
|
||||
The legacy model is deprecated now and will soon be removed, so we no
|
||||
longer document it here.
|
||||
|
||||
|
||||
Standard Driver Model Binding ("New Style")
|
||||
-------------------------------------------
|
||||
Device/Driver Binding
|
||||
---------------------
|
||||
|
||||
System infrastructure, typically board-specific initialization code or
|
||||
boot firmware, reports what I2C devices exist. For example, there may be
|
||||
@ -201,7 +191,7 @@ a given I2C bus. This is for example the case of hardware monitoring
|
||||
devices on a PC's SMBus. In that case, you may want to let your driver
|
||||
detect supported devices automatically. This is how the legacy model
|
||||
was working, and is now available as an extension to the standard
|
||||
driver model (so that we can finally get rid of the legacy model.)
|
||||
driver model.
|
||||
|
||||
You simply have to define a detect callback which will attempt to
|
||||
identify supported devices (returning 0 for supported ones and -ENODEV
|
||||
|
@ -278,7 +278,7 @@ struct input_event {
|
||||
};
|
||||
|
||||
'time' is the timestamp, it returns the time at which the event happened.
|
||||
Type is for example EV_REL for relative moment, REL_KEY for a keypress or
|
||||
Type is for example EV_REL for relative moment, EV_KEY for a keypress or
|
||||
release. More types are defined in include/linux/input.h.
|
||||
|
||||
'code' is event code, for example REL_X or KEY_BACKSPACE, again a complete
|
||||
|
@ -67,7 +67,12 @@ data with it.
|
||||
struct rotary_encoder_platform_data is declared in
|
||||
include/linux/rotary-encoder.h and needs to be filled with the number of
|
||||
steps the encoder has and can carry information about externally inverted
|
||||
signals (because of used invertig buffer or other reasons).
|
||||
signals (because of an inverting buffer or other reasons). The encoder
|
||||
can be set up to deliver input information as either an absolute or relative
|
||||
axes. For relative axes the input event returns +/-1 for each step. For
|
||||
absolute axes the position of the encoder can either roll over between zero
|
||||
and the number of steps or will clamp at the maximum and zero depending on
|
||||
the configuration.
|
||||
|
||||
Because GPIO to IRQ mapping is platform specific, this information must
|
||||
be given in seperately to the driver. See the example below.
|
||||
@ -85,6 +90,8 @@ be given in seperately to the driver. See the example below.
|
||||
static struct rotary_encoder_platform_data my_rotary_encoder_info = {
|
||||
.steps = 24,
|
||||
.axis = ABS_X,
|
||||
.relative_axis = false,
|
||||
.rollover = false,
|
||||
.gpio_a = GPIO_ROTARY_A,
|
||||
.gpio_b = GPIO_ROTARY_B,
|
||||
.inverted_a = 0,
|
||||
|
@ -14,25 +14,14 @@ README
|
||||
- general info on what you need and what to do for Linux ISDN.
|
||||
README.FAQ
|
||||
- general info for FAQ.
|
||||
README.audio
|
||||
- info for running audio over ISDN.
|
||||
README.fax
|
||||
- info for using Fax over ISDN.
|
||||
README.gigaset
|
||||
- info on the drivers for Siemens Gigaset ISDN adapters.
|
||||
README.icn
|
||||
- info on the ICN-ISDN-card and its driver.
|
||||
>>>>>>> 93af7aca44f0e82e67bda10a0fb73d383edcc8bd:Documentation/isdn/00-INDEX
|
||||
README.HiSax
|
||||
- info on the HiSax driver which replaces the old teles.
|
||||
README.act2000
|
||||
- info on driver for IBM ACT-2000 card.
|
||||
README.audio
|
||||
- info for running audio over ISDN.
|
||||
README.avmb1
|
||||
- info on driver for AVM-B1 ISDN card.
|
||||
README.act2000
|
||||
- info on driver for IBM ACT-2000 card.
|
||||
README.eicon
|
||||
- info on driver for Eicon active cards.
|
||||
README.concap
|
||||
- info on "CONCAP" encapsulation protocol interface used for X.25.
|
||||
README.diversion
|
||||
@ -59,7 +48,3 @@ README.x25
|
||||
- info for running X.25 over ISDN.
|
||||
syncPPP.FAQ
|
||||
- frequently asked questions about running PPP over ISDN.
|
||||
README.hysdn
|
||||
- info on driver for Hypercope active HYSDN cards
|
||||
README.mISDN
|
||||
- info on the Modular ISDN subsystem (mISDN).
|
||||
|
@ -75,7 +75,7 @@ Linux カーネルパッチ投稿者向けチェックリスト
|
||||
ビルドした上、動作確認を行ってください。
|
||||
|
||||
14: もしパッチがディスクのI/O性能などに影響を与えるようであれば、
|
||||
'CONFIG_LBD'オプションを有効にした場合と無効にした場合の両方で
|
||||
'CONFIG_LBDAF'オプションを有効にした場合と無効にした場合の両方で
|
||||
テストを実施してみてください。
|
||||
|
||||
15: lockdepの機能を全て有効にした上で、全てのコードパスを評価してください。
|
||||
|
@ -229,14 +229,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
to assume that this machine's pmtimer latches its value
|
||||
and always returns good values.
|
||||
|
||||
acpi.power_nocheck= [HW,ACPI]
|
||||
Format: 1/0 enable/disable the check of power state.
|
||||
On some bogus BIOS the _PSC object/_STA object of
|
||||
power resource can't return the correct device power
|
||||
state. In such case it is unneccessary to check its
|
||||
power state again in power transition.
|
||||
1 : disable the power state check
|
||||
|
||||
acpi_sci= [HW,ACPI] ACPI System Control Interrupt trigger mode
|
||||
Format: { level | edge | high | low }
|
||||
|
||||
@ -1006,6 +998,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
nomerge
|
||||
forcesac
|
||||
soft
|
||||
pt [x86, IA64]
|
||||
|
||||
io7= [HW] IO7 for Marvel based alpha systems
|
||||
See comment before marvel_specify_io7 in
|
||||
@ -1369,6 +1362,27 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
min_addr=nn[KMG] [KNL,BOOT,ia64] All physical memory below this
|
||||
physical address is ignored.
|
||||
|
||||
mini2440= [ARM,HW,KNL]
|
||||
Format:[0..2][b][c][t]
|
||||
Default: "0tb"
|
||||
MINI2440 configuration specification:
|
||||
0 - The attached screen is the 3.5" TFT
|
||||
1 - The attached screen is the 7" TFT
|
||||
2 - The VGA Shield is attached (1024x768)
|
||||
Leaving out the screen size parameter will not load
|
||||
the TFT driver, and the framebuffer will be left
|
||||
unconfigured.
|
||||
b - Enable backlight. The TFT backlight pin will be
|
||||
linked to the kernel VESA blanking code and a GPIO
|
||||
LED. This parameter is not necessary when using the
|
||||
VGA shield.
|
||||
c - Enable the s3c camera interface.
|
||||
t - Reserved for enabling touchscreen support. The
|
||||
touchscreen support is not enabled in the mainstream
|
||||
kernel as of 2.6.30, a preliminary port can be found
|
||||
in the "bleeding edge" mini2440 support kernel at
|
||||
http://repo.or.cz/w/linux-2.6/mini2440.git
|
||||
|
||||
mminit_loglevel=
|
||||
[KNL] When CONFIG_DEBUG_MEMORY_INIT is set, this
|
||||
parameter allows control of the logging verbosity for
|
||||
@ -1410,6 +1424,16 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
mtdparts= [MTD]
|
||||
See drivers/mtd/cmdlinepart.c.
|
||||
|
||||
onenand.bdry= [HW,MTD] Flex-OneNAND Boundary Configuration
|
||||
|
||||
Format: [die0_boundary][,die0_lock][,die1_boundary][,die1_lock]
|
||||
|
||||
boundary - index of last SLC block on Flex-OneNAND.
|
||||
The remaining blocks are configured as MLC blocks.
|
||||
lock - Configure if Flex-OneNAND boundary should be locked.
|
||||
Once locked, the boundary cannot be changed.
|
||||
1 indicates lock status, 0 indicates unlock status.
|
||||
|
||||
mtdset= [ARM]
|
||||
ARM/S3C2412 JIVE boot control
|
||||
|
||||
@ -1776,6 +1800,9 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
root domains (aka PCI segments, in ACPI-speak).
|
||||
nommconf [X86] Disable use of MMCONFIG for PCI
|
||||
Configuration
|
||||
check_enable_amd_mmconf [X86] check for and enable
|
||||
properly configured MMIO access to PCI
|
||||
config space on AMD family 10h CPU
|
||||
nomsi [MSI] If the PCI_MSI kernel config parameter is
|
||||
enabled, this kernel boot option can be used to
|
||||
disable the use of MSI interrupts system-wide.
|
||||
@ -1865,6 +1892,12 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
PAGE_SIZE is used as alignment.
|
||||
PCI-PCI bridge can be specified, if resource
|
||||
windows need to be expanded.
|
||||
ecrc= Enable/disable PCIe ECRC (transaction layer
|
||||
end-to-end CRC checking).
|
||||
bios: Use BIOS/firmware settings. This is the
|
||||
the default.
|
||||
off: Turn ECRC off
|
||||
on: Turn ECRC on.
|
||||
|
||||
pcie_aspm= [PCIE] Forcibly enable or disable PCIe Active State Power
|
||||
Management.
|
||||
@ -1882,6 +1915,12 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
Format: { 0 | 1 }
|
||||
See arch/parisc/kernel/pdc_chassis.c
|
||||
|
||||
percpu_alloc= [X86] Select which percpu first chunk allocator to use.
|
||||
Allowed values are one of "lpage", "embed" and "4k".
|
||||
See comments in arch/x86/kernel/setup_percpu.c for
|
||||
details on each allocator. This parameter is primarily
|
||||
for debugging and performance comparison.
|
||||
|
||||
pf. [PARIDE]
|
||||
See Documentation/blockdev/paride.txt.
|
||||
|
||||
@ -2434,7 +2473,8 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
|
||||
tp720= [HW,PS2]
|
||||
|
||||
trace_buf_size=nn[KMG] [ftrace] will set tracing buffer size.
|
||||
trace_buf_size=nn[KMG]
|
||||
[FTRACE] will set tracing buffer size.
|
||||
|
||||
trix= [HW,OSS] MediaTrix AudioTrix Pro
|
||||
Format:
|
||||
|
@ -920,7 +920,7 @@ The available commands are:
|
||||
echo '<LED number> off' >/proc/acpi/ibm/led
|
||||
echo '<LED number> blink' >/proc/acpi/ibm/led
|
||||
|
||||
The <LED number> range is 0 to 7. The set of LEDs that can be
|
||||
The <LED number> range is 0 to 15. The set of LEDs that can be
|
||||
controlled varies from model to model. Here is the common ThinkPad
|
||||
mapping:
|
||||
|
||||
@ -932,6 +932,11 @@ mapping:
|
||||
5 - UltraBase battery slot
|
||||
6 - (unknown)
|
||||
7 - standby
|
||||
8 - dock status 1
|
||||
9 - dock status 2
|
||||
10, 11 - (unknown)
|
||||
12 - thinkvantage
|
||||
13, 14, 15 - (unknown)
|
||||
|
||||
All of the above can be turned on and off and can be made to blink.
|
||||
|
||||
@ -940,10 +945,12 @@ sysfs notes:
|
||||
The ThinkPad LED sysfs interface is described in detail by the LED class
|
||||
documentation, in Documentation/leds-class.txt.
|
||||
|
||||
The leds are named (in LED ID order, from 0 to 7):
|
||||
The LEDs are named (in LED ID order, from 0 to 12):
|
||||
"tpacpi::power", "tpacpi:orange:batt", "tpacpi:green:batt",
|
||||
"tpacpi::dock_active", "tpacpi::bay_active", "tpacpi::dock_batt",
|
||||
"tpacpi::unknown_led", "tpacpi::standby".
|
||||
"tpacpi::unknown_led", "tpacpi::standby", "tpacpi::dock_status1",
|
||||
"tpacpi::dock_status2", "tpacpi::unknown_led2", "tpacpi::unknown_led3",
|
||||
"tpacpi::thinkvantage".
|
||||
|
||||
Due to limitations in the sysfs LED class, if the status of the LED
|
||||
indicators cannot be read due to an error, thinkpad-acpi will report it as
|
||||
@ -958,6 +965,12 @@ ThinkPad indicator LED should blink in hardware accelerated mode, use the
|
||||
"timer" trigger, and leave the delay_on and delay_off parameters set to
|
||||
zero (to request hardware acceleration autodetection).
|
||||
|
||||
LEDs that are known not to exist in a given ThinkPad model are not
|
||||
made available through the sysfs interface. If you have a dock and you
|
||||
notice there are LEDs listed for your ThinkPad that do not exist (and
|
||||
are not in the dock), or if you notice that there are missing LEDs,
|
||||
a report to ibm-acpi-devel@lists.sourceforge.net is appreciated.
|
||||
|
||||
|
||||
ACPI sounds -- /proc/acpi/ibm/beep
|
||||
----------------------------------
|
||||
@ -1156,17 +1169,19 @@ may not be distinct. Later Lenovo models that implement the ACPI
|
||||
display backlight brightness control methods have 16 levels, ranging
|
||||
from 0 to 15.
|
||||
|
||||
There are two interfaces to the firmware for direct brightness control,
|
||||
EC and UCMS (or CMOS). To select which one should be used, use the
|
||||
brightness_mode module parameter: brightness_mode=1 selects EC mode,
|
||||
brightness_mode=2 selects UCMS mode, brightness_mode=3 selects EC
|
||||
mode with NVRAM backing (so that brightness changes are remembered
|
||||
across shutdown/reboot).
|
||||
For IBM ThinkPads, there are two interfaces to the firmware for direct
|
||||
brightness control, EC and UCMS (or CMOS). To select which one should be
|
||||
used, use the brightness_mode module parameter: brightness_mode=1 selects
|
||||
EC mode, brightness_mode=2 selects UCMS mode, brightness_mode=3 selects EC
|
||||
mode with NVRAM backing (so that brightness changes are remembered across
|
||||
shutdown/reboot).
|
||||
|
||||
The driver tries to select which interface to use from a table of
|
||||
defaults for each ThinkPad model. If it makes a wrong choice, please
|
||||
report this as a bug, so that we can fix it.
|
||||
|
||||
Lenovo ThinkPads only support brightness_mode=2 (UCMS).
|
||||
|
||||
When display backlight brightness controls are available through the
|
||||
standard ACPI interface, it is best to use it instead of this direct
|
||||
ThinkPad-specific interface. The driver will disable its native
|
||||
@ -1254,7 +1269,7 @@ Fan control and monitoring: fan speed, fan enable/disable
|
||||
|
||||
procfs: /proc/acpi/ibm/fan
|
||||
sysfs device attributes: (hwmon "thinkpad") fan1_input, pwm1,
|
||||
pwm1_enable
|
||||
pwm1_enable, fan2_input
|
||||
sysfs hwmon driver attributes: fan_watchdog
|
||||
|
||||
NOTE NOTE NOTE: fan control operations are disabled by default for
|
||||
@ -1267,6 +1282,9 @@ from the hardware registers of the embedded controller. This is known
|
||||
to work on later R, T, X and Z series ThinkPads but may show a bogus
|
||||
value on other models.
|
||||
|
||||
Some Lenovo ThinkPads support a secondary fan. This fan cannot be
|
||||
controlled separately, it shares the main fan control.
|
||||
|
||||
Fan levels:
|
||||
|
||||
Most ThinkPad fans work in "levels" at the firmware interface. Level 0
|
||||
@ -1397,6 +1415,11 @@ hwmon device attribute fan1_input:
|
||||
which can take up to two minutes. May return rubbish on older
|
||||
ThinkPads.
|
||||
|
||||
hwmon device attribute fan2_input:
|
||||
Fan tachometer reading, in RPM, for the secondary fan.
|
||||
Available only on some ThinkPads. If the secondary fan is
|
||||
not installed, will always read 0.
|
||||
|
||||
hwmon driver attribute fan_watchdog:
|
||||
Fan safety watchdog timer interval, in seconds. Minimum is
|
||||
1 second, maximum is 120 seconds. 0 disables the watchdog.
|
||||
@ -1555,3 +1578,7 @@ Sysfs interface changelog:
|
||||
0x020300: hotkey enable/disable support removed, attributes
|
||||
hotkey_bios_enabled and hotkey_enable deprecated and
|
||||
marked for removal.
|
||||
|
||||
0x020400: Marker for 16 LEDs support. Also, LEDs that are known
|
||||
to not exist in a given model are not registered with
|
||||
the LED sysfs class anymore.
|
||||
|
50
Documentation/leds-lp3944.txt
Normal file
50
Documentation/leds-lp3944.txt
Normal file
@ -0,0 +1,50 @@
|
||||
Kernel driver lp3944
|
||||
====================
|
||||
|
||||
* National Semiconductor LP3944 Fun-light Chip
|
||||
Prefix: 'lp3944'
|
||||
Addresses scanned: None (see the Notes section below)
|
||||
Datasheet: Publicly available at the National Semiconductor website
|
||||
http://www.national.com/pf/LP/LP3944.html
|
||||
|
||||
Authors:
|
||||
Antonio Ospite <ospite@studenti.unina.it>
|
||||
|
||||
|
||||
Description
|
||||
-----------
|
||||
The LP3944 is a helper chip that can drive up to 8 leds, with two programmable
|
||||
DIM modes; it could even be used as a gpio expander but this driver assumes it
|
||||
is used as a led controller.
|
||||
|
||||
The DIM modes are used to set _blink_ patterns for leds, the pattern is
|
||||
specified supplying two parameters:
|
||||
- period: from 0s to 1.6s
|
||||
- duty cycle: percentage of the period the led is on, from 0 to 100
|
||||
|
||||
Setting a led in DIM0 or DIM1 mode makes it blink according to the pattern.
|
||||
See the datasheet for details.
|
||||
|
||||
LP3944 can be found on Motorola A910 smartphone, where it drives the rgb
|
||||
leds, the camera flash light and the lcds power.
|
||||
|
||||
|
||||
Notes
|
||||
-----
|
||||
The chip is used mainly in embedded contexts, so this driver expects it is
|
||||
registered using the i2c_board_info mechanism.
|
||||
|
||||
To register the chip at address 0x60 on adapter 0, set the platform data
|
||||
according to include/linux/leds-lp3944.h, set the i2c board info:
|
||||
|
||||
static struct i2c_board_info __initdata a910_i2c_board_info[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("lp3944", 0x60),
|
||||
.platform_data = &a910_lp3944_leds,
|
||||
},
|
||||
};
|
||||
|
||||
and register it in the platform init function
|
||||
|
||||
i2c_register_board_info(0, a910_i2c_board_info,
|
||||
ARRAY_SIZE(a910_i2c_board_info));
|
File diff suppressed because it is too large
Load Diff
148
Documentation/powerpc/dts-bindings/4xx/emac.txt
Normal file
148
Documentation/powerpc/dts-bindings/4xx/emac.txt
Normal file
@ -0,0 +1,148 @@
|
||||
4xx/Axon EMAC ethernet nodes
|
||||
|
||||
The EMAC ethernet controller in IBM and AMCC 4xx chips, and also
|
||||
the Axon bridge. To operate this needs to interact with a ths
|
||||
special McMAL DMA controller, and sometimes an RGMII or ZMII
|
||||
interface. In addition to the nodes and properties described
|
||||
below, the node for the OPB bus on which the EMAC sits must have a
|
||||
correct clock-frequency property.
|
||||
|
||||
i) The EMAC node itself
|
||||
|
||||
Required properties:
|
||||
- device_type : "network"
|
||||
|
||||
- compatible : compatible list, contains 2 entries, first is
|
||||
"ibm,emac-CHIP" where CHIP is the host ASIC (440gx,
|
||||
405gp, Axon) and second is either "ibm,emac" or
|
||||
"ibm,emac4". For Axon, thus, we have: "ibm,emac-axon",
|
||||
"ibm,emac4"
|
||||
- interrupts : <interrupt mapping for EMAC IRQ and WOL IRQ>
|
||||
- interrupt-parent : optional, if needed for interrupt mapping
|
||||
- reg : <registers mapping>
|
||||
- local-mac-address : 6 bytes, MAC address
|
||||
- mal-device : phandle of the associated McMAL node
|
||||
- mal-tx-channel : 1 cell, index of the tx channel on McMAL associated
|
||||
with this EMAC
|
||||
- mal-rx-channel : 1 cell, index of the rx channel on McMAL associated
|
||||
with this EMAC
|
||||
- cell-index : 1 cell, hardware index of the EMAC cell on a given
|
||||
ASIC (typically 0x0 and 0x1 for EMAC0 and EMAC1 on
|
||||
each Axon chip)
|
||||
- max-frame-size : 1 cell, maximum frame size supported in bytes
|
||||
- rx-fifo-size : 1 cell, Rx fifo size in bytes for 10 and 100 Mb/sec
|
||||
operations.
|
||||
For Axon, 2048
|
||||
- tx-fifo-size : 1 cell, Tx fifo size in bytes for 10 and 100 Mb/sec
|
||||
operations.
|
||||
For Axon, 2048.
|
||||
- fifo-entry-size : 1 cell, size of a fifo entry (used to calculate
|
||||
thresholds).
|
||||
For Axon, 0x00000010
|
||||
- mal-burst-size : 1 cell, MAL burst size (used to calculate thresholds)
|
||||
in bytes.
|
||||
For Axon, 0x00000100 (I think ...)
|
||||
- phy-mode : string, mode of operations of the PHY interface.
|
||||
Supported values are: "mii", "rmii", "smii", "rgmii",
|
||||
"tbi", "gmii", rtbi", "sgmii".
|
||||
For Axon on CAB, it is "rgmii"
|
||||
- mdio-device : 1 cell, required iff using shared MDIO registers
|
||||
(440EP). phandle of the EMAC to use to drive the
|
||||
MDIO lines for the PHY used by this EMAC.
|
||||
- zmii-device : 1 cell, required iff connected to a ZMII. phandle of
|
||||
the ZMII device node
|
||||
- zmii-channel : 1 cell, required iff connected to a ZMII. Which ZMII
|
||||
channel or 0xffffffff if ZMII is only used for MDIO.
|
||||
- rgmii-device : 1 cell, required iff connected to an RGMII. phandle
|
||||
of the RGMII device node.
|
||||
For Axon: phandle of plb5/plb4/opb/rgmii
|
||||
- rgmii-channel : 1 cell, required iff connected to an RGMII. Which
|
||||
RGMII channel is used by this EMAC.
|
||||
Fox Axon: present, whatever value is appropriate for each
|
||||
EMAC, that is the content of the current (bogus) "phy-port"
|
||||
property.
|
||||
|
||||
Optional properties:
|
||||
- phy-address : 1 cell, optional, MDIO address of the PHY. If absent,
|
||||
a search is performed.
|
||||
- phy-map : 1 cell, optional, bitmap of addresses to probe the PHY
|
||||
for, used if phy-address is absent. bit 0x00000001 is
|
||||
MDIO address 0.
|
||||
For Axon it can be absent, though my current driver
|
||||
doesn't handle phy-address yet so for now, keep
|
||||
0x00ffffff in it.
|
||||
- rx-fifo-size-gige : 1 cell, Rx fifo size in bytes for 1000 Mb/sec
|
||||
operations (if absent the value is the same as
|
||||
rx-fifo-size). For Axon, either absent or 2048.
|
||||
- tx-fifo-size-gige : 1 cell, Tx fifo size in bytes for 1000 Mb/sec
|
||||
operations (if absent the value is the same as
|
||||
tx-fifo-size). For Axon, either absent or 2048.
|
||||
- tah-device : 1 cell, optional. If connected to a TAH engine for
|
||||
offload, phandle of the TAH device node.
|
||||
- tah-channel : 1 cell, optional. If appropriate, channel used on the
|
||||
TAH engine.
|
||||
|
||||
Example:
|
||||
|
||||
EMAC0: ethernet@40000800 {
|
||||
device_type = "network";
|
||||
compatible = "ibm,emac-440gp", "ibm,emac";
|
||||
interrupt-parent = <&UIC1>;
|
||||
interrupts = <1c 4 1d 4>;
|
||||
reg = <40000800 70>;
|
||||
local-mac-address = [00 04 AC E3 1B 1E];
|
||||
mal-device = <&MAL0>;
|
||||
mal-tx-channel = <0 1>;
|
||||
mal-rx-channel = <0>;
|
||||
cell-index = <0>;
|
||||
max-frame-size = <5dc>;
|
||||
rx-fifo-size = <1000>;
|
||||
tx-fifo-size = <800>;
|
||||
phy-mode = "rmii";
|
||||
phy-map = <00000001>;
|
||||
zmii-device = <&ZMII0>;
|
||||
zmii-channel = <0>;
|
||||
};
|
||||
|
||||
ii) McMAL node
|
||||
|
||||
Required properties:
|
||||
- device_type : "dma-controller"
|
||||
- compatible : compatible list, containing 2 entries, first is
|
||||
"ibm,mcmal-CHIP" where CHIP is the host ASIC (like
|
||||
emac) and the second is either "ibm,mcmal" or
|
||||
"ibm,mcmal2".
|
||||
For Axon, "ibm,mcmal-axon","ibm,mcmal2"
|
||||
- interrupts : <interrupt mapping for the MAL interrupts sources:
|
||||
5 sources: tx_eob, rx_eob, serr, txde, rxde>.
|
||||
For Axon: This is _different_ from the current
|
||||
firmware. We use the "delayed" interrupts for txeob
|
||||
and rxeob. Thus we end up with mapping those 5 MPIC
|
||||
interrupts, all level positive sensitive: 10, 11, 32,
|
||||
33, 34 (in decimal)
|
||||
- dcr-reg : < DCR registers range >
|
||||
- dcr-parent : if needed for dcr-reg
|
||||
- num-tx-chans : 1 cell, number of Tx channels
|
||||
- num-rx-chans : 1 cell, number of Rx channels
|
||||
|
||||
iii) ZMII node
|
||||
|
||||
Required properties:
|
||||
- compatible : compatible list, containing 2 entries, first is
|
||||
"ibm,zmii-CHIP" where CHIP is the host ASIC (like
|
||||
EMAC) and the second is "ibm,zmii".
|
||||
For Axon, there is no ZMII node.
|
||||
- reg : <registers mapping>
|
||||
|
||||
iv) RGMII node
|
||||
|
||||
Required properties:
|
||||
- compatible : compatible list, containing 2 entries, first is
|
||||
"ibm,rgmii-CHIP" where CHIP is the host ASIC (like
|
||||
EMAC) and the second is "ibm,rgmii".
|
||||
For Axon, "ibm,rgmii-axon","ibm,rgmii"
|
||||
- reg : <registers mapping>
|
||||
- revision : as provided by the RGMII new version register if
|
||||
available.
|
||||
For Axon: 0x0000012a
|
||||
|
@ -10,6 +10,8 @@ Required properties:
|
||||
- interrupts : should contain eSDHC interrupt.
|
||||
- interrupt-parent : interrupt source phandle.
|
||||
- clock-frequency : specifies eSDHC base clock frequency.
|
||||
- sdhci,1-bit-only : (optional) specifies that a controller can
|
||||
only handle 1-bit data transfers.
|
||||
|
||||
Example:
|
||||
|
||||
|
50
Documentation/powerpc/dts-bindings/gpio/gpio.txt
Normal file
50
Documentation/powerpc/dts-bindings/gpio/gpio.txt
Normal file
@ -0,0 +1,50 @@
|
||||
Specifying GPIO information for devices
|
||||
============================================
|
||||
|
||||
1) gpios property
|
||||
-----------------
|
||||
|
||||
Nodes that makes use of GPIOs should define them using `gpios' property,
|
||||
format of which is: <&gpio-controller1-phandle gpio1-specifier
|
||||
&gpio-controller2-phandle gpio2-specifier
|
||||
0 /* holes are permitted, means no GPIO 3 */
|
||||
&gpio-controller4-phandle gpio4-specifier
|
||||
...>;
|
||||
|
||||
Note that gpio-specifier length is controller dependent.
|
||||
|
||||
gpio-specifier may encode: bank, pin position inside the bank,
|
||||
whether pin is open-drain and whether pin is logically inverted.
|
||||
|
||||
Example of the node using GPIOs:
|
||||
|
||||
node {
|
||||
gpios = <&qe_pio_e 18 0>;
|
||||
};
|
||||
|
||||
In this example gpio-specifier is "18 0" and encodes GPIO pin number,
|
||||
and empty GPIO flags as accepted by the "qe_pio_e" gpio-controller.
|
||||
|
||||
2) gpio-controller nodes
|
||||
------------------------
|
||||
|
||||
Every GPIO controller node must have #gpio-cells property defined,
|
||||
this information will be used to translate gpio-specifiers.
|
||||
|
||||
Example of two SOC GPIO banks defined as gpio-controller nodes:
|
||||
|
||||
qe_pio_a: gpio-controller@1400 {
|
||||
#gpio-cells = <2>;
|
||||
compatible = "fsl,qe-pario-bank-a", "fsl,qe-pario-bank";
|
||||
reg = <0x1400 0x18>;
|
||||
gpio-controller;
|
||||
};
|
||||
|
||||
qe_pio_e: gpio-controller@1460 {
|
||||
#gpio-cells = <2>;
|
||||
compatible = "fsl,qe-pario-bank-e", "fsl,qe-pario-bank";
|
||||
reg = <0x1460 0x18>;
|
||||
gpio-controller;
|
||||
};
|
||||
|
||||
|
@ -16,10 +16,17 @@ LED sub-node properties:
|
||||
string defining the trigger assigned to the LED. Current triggers are:
|
||||
"backlight" - LED will act as a back-light, controlled by the framebuffer
|
||||
system
|
||||
"default-on" - LED will turn on
|
||||
"default-on" - LED will turn on, but see "default-state" below
|
||||
"heartbeat" - LED "double" flashes at a load average based rate
|
||||
"ide-disk" - LED indicates disk activity
|
||||
"timer" - LED flashes at a fixed, configurable rate
|
||||
- default-state: (optional) The initial state of the LED. Valid
|
||||
values are "on", "off", and "keep". If the LED is already on or off
|
||||
and the default-state property is set the to same value, then no
|
||||
glitch should be produced where the LED momentarily turns off (or
|
||||
on). The "keep" setting will keep the LED at whatever its current
|
||||
state is, without producing a glitch. The default is off if this
|
||||
property is not present.
|
||||
|
||||
Examples:
|
||||
|
||||
@ -30,14 +37,22 @@ leds {
|
||||
gpios = <&mcu_pio 0 1>; /* Active low */
|
||||
linux,default-trigger = "ide-disk";
|
||||
};
|
||||
|
||||
fault {
|
||||
gpios = <&mcu_pio 1 0>;
|
||||
/* Keep LED on if BIOS detected hardware fault */
|
||||
default-state = "keep";
|
||||
};
|
||||
};
|
||||
|
||||
run-control {
|
||||
compatible = "gpio-leds";
|
||||
red {
|
||||
gpios = <&mpc8572 6 0>;
|
||||
default-state = "off";
|
||||
};
|
||||
green {
|
||||
gpios = <&mpc8572 7 0>;
|
||||
default-state = "on";
|
||||
};
|
||||
}
|
||||
|
19
Documentation/powerpc/dts-bindings/gpio/mdio.txt
Normal file
19
Documentation/powerpc/dts-bindings/gpio/mdio.txt
Normal file
@ -0,0 +1,19 @@
|
||||
MDIO on GPIOs
|
||||
|
||||
Currently defined compatibles:
|
||||
- virtual,gpio-mdio
|
||||
|
||||
MDC and MDIO lines connected to GPIO controllers are listed in the
|
||||
gpios property as described in section VIII.1 in the following order:
|
||||
|
||||
MDC, MDIO.
|
||||
|
||||
Example:
|
||||
|
||||
mdio {
|
||||
compatible = "virtual,mdio-gpio";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
gpios = <&qe_pio_a 11
|
||||
&qe_pio_c 6>;
|
||||
};
|
521
Documentation/powerpc/dts-bindings/marvell.txt
Normal file
521
Documentation/powerpc/dts-bindings/marvell.txt
Normal file
@ -0,0 +1,521 @@
|
||||
Marvell Discovery mv64[345]6x System Controller chips
|
||||
===========================================================
|
||||
|
||||
The Marvell mv64[345]60 series of system controller chips contain
|
||||
many of the peripherals needed to implement a complete computer
|
||||
system. In this section, we define device tree nodes to describe
|
||||
the system controller chip itself and each of the peripherals
|
||||
which it contains. Compatible string values for each node are
|
||||
prefixed with the string "marvell,", for Marvell Technology Group Ltd.
|
||||
|
||||
1) The /system-controller node
|
||||
|
||||
This node is used to represent the system-controller and must be
|
||||
present when the system uses a system controller chip. The top-level
|
||||
system-controller node contains information that is global to all
|
||||
devices within the system controller chip. The node name begins
|
||||
with "system-controller" followed by the unit address, which is
|
||||
the base address of the memory-mapped register set for the system
|
||||
controller chip.
|
||||
|
||||
Required properties:
|
||||
|
||||
- ranges : Describes the translation of system controller addresses
|
||||
for memory mapped registers.
|
||||
- clock-frequency: Contains the main clock frequency for the system
|
||||
controller chip.
|
||||
- reg : This property defines the address and size of the
|
||||
memory-mapped registers contained within the system controller
|
||||
chip. The address specified in the "reg" property should match
|
||||
the unit address of the system-controller node.
|
||||
- #address-cells : Address representation for system controller
|
||||
devices. This field represents the number of cells needed to
|
||||
represent the address of the memory-mapped registers of devices
|
||||
within the system controller chip.
|
||||
- #size-cells : Size representation for for the memory-mapped
|
||||
registers within the system controller chip.
|
||||
- #interrupt-cells : Defines the width of cells used to represent
|
||||
interrupts.
|
||||
|
||||
Optional properties:
|
||||
|
||||
- model : The specific model of the system controller chip. Such
|
||||
as, "mv64360", "mv64460", or "mv64560".
|
||||
- compatible : A string identifying the compatibility identifiers
|
||||
of the system controller chip.
|
||||
|
||||
The system-controller node contains child nodes for each system
|
||||
controller device that the platform uses. Nodes should not be created
|
||||
for devices which exist on the system controller chip but are not used
|
||||
|
||||
Example Marvell Discovery mv64360 system-controller node:
|
||||
|
||||
system-controller@f1000000 { /* Marvell Discovery mv64360 */
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
model = "mv64360"; /* Default */
|
||||
compatible = "marvell,mv64360";
|
||||
clock-frequency = <133333333>;
|
||||
reg = <0xf1000000 0x10000>;
|
||||
virtual-reg = <0xf1000000>;
|
||||
ranges = <0x88000000 0x88000000 0x1000000 /* PCI 0 I/O Space */
|
||||
0x80000000 0x80000000 0x8000000 /* PCI 0 MEM Space */
|
||||
0xa0000000 0xa0000000 0x4000000 /* User FLASH */
|
||||
0x00000000 0xf1000000 0x0010000 /* Bridge's regs */
|
||||
0xf2000000 0xf2000000 0x0040000>;/* Integrated SRAM */
|
||||
|
||||
[ child node definitions... ]
|
||||
}
|
||||
|
||||
2) Child nodes of /system-controller
|
||||
|
||||
a) Marvell Discovery MDIO bus
|
||||
|
||||
The MDIO is a bus to which the PHY devices are connected. For each
|
||||
device that exists on this bus, a child node should be created. See
|
||||
the definition of the PHY node below for an example of how to define
|
||||
a PHY.
|
||||
|
||||
Required properties:
|
||||
- #address-cells : Should be <1>
|
||||
- #size-cells : Should be <0>
|
||||
- device_type : Should be "mdio"
|
||||
- compatible : Should be "marvell,mv64360-mdio"
|
||||
|
||||
Example:
|
||||
|
||||
mdio {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
device_type = "mdio";
|
||||
compatible = "marvell,mv64360-mdio";
|
||||
|
||||
ethernet-phy@0 {
|
||||
......
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
b) Marvell Discovery ethernet controller
|
||||
|
||||
The Discover ethernet controller is described with two levels
|
||||
of nodes. The first level describes an ethernet silicon block
|
||||
and the second level describes up to 3 ethernet nodes within
|
||||
that block. The reason for the multiple levels is that the
|
||||
registers for the node are interleaved within a single set
|
||||
of registers. The "ethernet-block" level describes the
|
||||
shared register set, and the "ethernet" nodes describe ethernet
|
||||
port-specific properties.
|
||||
|
||||
Ethernet block node
|
||||
|
||||
Required properties:
|
||||
- #address-cells : <1>
|
||||
- #size-cells : <0>
|
||||
- compatible : "marvell,mv64360-eth-block"
|
||||
- reg : Offset and length of the register set for this block
|
||||
|
||||
Example Discovery Ethernet block node:
|
||||
ethernet-block@2000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "marvell,mv64360-eth-block";
|
||||
reg = <0x2000 0x2000>;
|
||||
ethernet@0 {
|
||||
.......
|
||||
};
|
||||
};
|
||||
|
||||
Ethernet port node
|
||||
|
||||
Required properties:
|
||||
- device_type : Should be "network".
|
||||
- compatible : Should be "marvell,mv64360-eth".
|
||||
- reg : Should be <0>, <1>, or <2>, according to which registers
|
||||
within the silicon block the device uses.
|
||||
- interrupts : <a> where a is the interrupt number for the port.
|
||||
- interrupt-parent : the phandle for the interrupt controller
|
||||
that services interrupts for this device.
|
||||
- phy : the phandle for the PHY connected to this ethernet
|
||||
controller.
|
||||
- local-mac-address : 6 bytes, MAC address
|
||||
|
||||
Example Discovery Ethernet port node:
|
||||
ethernet@0 {
|
||||
device_type = "network";
|
||||
compatible = "marvell,mv64360-eth";
|
||||
reg = <0>;
|
||||
interrupts = <32>;
|
||||
interrupt-parent = <&PIC>;
|
||||
phy = <&PHY0>;
|
||||
local-mac-address = [ 00 00 00 00 00 00 ];
|
||||
};
|
||||
|
||||
|
||||
|
||||
c) Marvell Discovery PHY nodes
|
||||
|
||||
Required properties:
|
||||
- device_type : Should be "ethernet-phy"
|
||||
- interrupts : <a> where a is the interrupt number for this phy.
|
||||
- interrupt-parent : the phandle for the interrupt controller that
|
||||
services interrupts for this device.
|
||||
- reg : The ID number for the phy, usually a small integer
|
||||
|
||||
Example Discovery PHY node:
|
||||
ethernet-phy@1 {
|
||||
device_type = "ethernet-phy";
|
||||
compatible = "broadcom,bcm5421";
|
||||
interrupts = <76>; /* GPP 12 */
|
||||
interrupt-parent = <&PIC>;
|
||||
reg = <1>;
|
||||
};
|
||||
|
||||
|
||||
d) Marvell Discovery SDMA nodes
|
||||
|
||||
Represent DMA hardware associated with the MPSC (multiprotocol
|
||||
serial controllers).
|
||||
|
||||
Required properties:
|
||||
- compatible : "marvell,mv64360-sdma"
|
||||
- reg : Offset and length of the register set for this device
|
||||
- interrupts : <a> where a is the interrupt number for the DMA
|
||||
device.
|
||||
- interrupt-parent : the phandle for the interrupt controller
|
||||
that services interrupts for this device.
|
||||
|
||||
Example Discovery SDMA node:
|
||||
sdma@4000 {
|
||||
compatible = "marvell,mv64360-sdma";
|
||||
reg = <0x4000 0xc18>;
|
||||
virtual-reg = <0xf1004000>;
|
||||
interrupts = <36>;
|
||||
interrupt-parent = <&PIC>;
|
||||
};
|
||||
|
||||
|
||||
e) Marvell Discovery BRG nodes
|
||||
|
||||
Represent baud rate generator hardware associated with the MPSC
|
||||
(multiprotocol serial controllers).
|
||||
|
||||
Required properties:
|
||||
- compatible : "marvell,mv64360-brg"
|
||||
- reg : Offset and length of the register set for this device
|
||||
- clock-src : A value from 0 to 15 which selects the clock
|
||||
source for the baud rate generator. This value corresponds
|
||||
to the CLKS value in the BRGx configuration register. See
|
||||
the mv64x60 User's Manual.
|
||||
- clock-frequence : The frequency (in Hz) of the baud rate
|
||||
generator's input clock.
|
||||
- current-speed : The current speed setting (presumably by
|
||||
firmware) of the baud rate generator.
|
||||
|
||||
Example Discovery BRG node:
|
||||
brg@b200 {
|
||||
compatible = "marvell,mv64360-brg";
|
||||
reg = <0xb200 0x8>;
|
||||
clock-src = <8>;
|
||||
clock-frequency = <133333333>;
|
||||
current-speed = <9600>;
|
||||
};
|
||||
|
||||
|
||||
f) Marvell Discovery CUNIT nodes
|
||||
|
||||
Represent the Serial Communications Unit device hardware.
|
||||
|
||||
Required properties:
|
||||
- reg : Offset and length of the register set for this device
|
||||
|
||||
Example Discovery CUNIT node:
|
||||
cunit@f200 {
|
||||
reg = <0xf200 0x200>;
|
||||
};
|
||||
|
||||
|
||||
g) Marvell Discovery MPSCROUTING nodes
|
||||
|
||||
Represent the Discovery's MPSC routing hardware
|
||||
|
||||
Required properties:
|
||||
- reg : Offset and length of the register set for this device
|
||||
|
||||
Example Discovery CUNIT node:
|
||||
mpscrouting@b500 {
|
||||
reg = <0xb400 0xc>;
|
||||
};
|
||||
|
||||
|
||||
h) Marvell Discovery MPSCINTR nodes
|
||||
|
||||
Represent the Discovery's MPSC DMA interrupt hardware registers
|
||||
(SDMA cause and mask registers).
|
||||
|
||||
Required properties:
|
||||
- reg : Offset and length of the register set for this device
|
||||
|
||||
Example Discovery MPSCINTR node:
|
||||
mpsintr@b800 {
|
||||
reg = <0xb800 0x100>;
|
||||
};
|
||||
|
||||
|
||||
i) Marvell Discovery MPSC nodes
|
||||
|
||||
Represent the Discovery's MPSC (Multiprotocol Serial Controller)
|
||||
serial port.
|
||||
|
||||
Required properties:
|
||||
- device_type : "serial"
|
||||
- compatible : "marvell,mv64360-mpsc"
|
||||
- reg : Offset and length of the register set for this device
|
||||
- sdma : the phandle for the SDMA node used by this port
|
||||
- brg : the phandle for the BRG node used by this port
|
||||
- cunit : the phandle for the CUNIT node used by this port
|
||||
- mpscrouting : the phandle for the MPSCROUTING node used by this port
|
||||
- mpscintr : the phandle for the MPSCINTR node used by this port
|
||||
- cell-index : the hardware index of this cell in the MPSC core
|
||||
- max_idle : value needed for MPSC CHR3 (Maximum Frame Length)
|
||||
register
|
||||
- interrupts : <a> where a is the interrupt number for the MPSC.
|
||||
- interrupt-parent : the phandle for the interrupt controller
|
||||
that services interrupts for this device.
|
||||
|
||||
Example Discovery MPSCINTR node:
|
||||
mpsc@8000 {
|
||||
device_type = "serial";
|
||||
compatible = "marvell,mv64360-mpsc";
|
||||
reg = <0x8000 0x38>;
|
||||
virtual-reg = <0xf1008000>;
|
||||
sdma = <&SDMA0>;
|
||||
brg = <&BRG0>;
|
||||
cunit = <&CUNIT>;
|
||||
mpscrouting = <&MPSCROUTING>;
|
||||
mpscintr = <&MPSCINTR>;
|
||||
cell-index = <0>;
|
||||
max_idle = <40>;
|
||||
interrupts = <40>;
|
||||
interrupt-parent = <&PIC>;
|
||||
};
|
||||
|
||||
|
||||
j) Marvell Discovery Watch Dog Timer nodes
|
||||
|
||||
Represent the Discovery's watchdog timer hardware
|
||||
|
||||
Required properties:
|
||||
- compatible : "marvell,mv64360-wdt"
|
||||
- reg : Offset and length of the register set for this device
|
||||
|
||||
Example Discovery Watch Dog Timer node:
|
||||
wdt@b410 {
|
||||
compatible = "marvell,mv64360-wdt";
|
||||
reg = <0xb410 0x8>;
|
||||
};
|
||||
|
||||
|
||||
k) Marvell Discovery I2C nodes
|
||||
|
||||
Represent the Discovery's I2C hardware
|
||||
|
||||
Required properties:
|
||||
- device_type : "i2c"
|
||||
- compatible : "marvell,mv64360-i2c"
|
||||
- reg : Offset and length of the register set for this device
|
||||
- interrupts : <a> where a is the interrupt number for the I2C.
|
||||
- interrupt-parent : the phandle for the interrupt controller
|
||||
that services interrupts for this device.
|
||||
|
||||
Example Discovery I2C node:
|
||||
compatible = "marvell,mv64360-i2c";
|
||||
reg = <0xc000 0x20>;
|
||||
virtual-reg = <0xf100c000>;
|
||||
interrupts = <37>;
|
||||
interrupt-parent = <&PIC>;
|
||||
};
|
||||
|
||||
|
||||
l) Marvell Discovery PIC (Programmable Interrupt Controller) nodes
|
||||
|
||||
Represent the Discovery's PIC hardware
|
||||
|
||||
Required properties:
|
||||
- #interrupt-cells : <1>
|
||||
- #address-cells : <0>
|
||||
- compatible : "marvell,mv64360-pic"
|
||||
- reg : Offset and length of the register set for this device
|
||||
- interrupt-controller
|
||||
|
||||
Example Discovery PIC node:
|
||||
pic {
|
||||
#interrupt-cells = <1>;
|
||||
#address-cells = <0>;
|
||||
compatible = "marvell,mv64360-pic";
|
||||
reg = <0x0 0x88>;
|
||||
interrupt-controller;
|
||||
};
|
||||
|
||||
|
||||
m) Marvell Discovery MPP (Multipurpose Pins) multiplexing nodes
|
||||
|
||||
Represent the Discovery's MPP hardware
|
||||
|
||||
Required properties:
|
||||
- compatible : "marvell,mv64360-mpp"
|
||||
- reg : Offset and length of the register set for this device
|
||||
|
||||
Example Discovery MPP node:
|
||||
mpp@f000 {
|
||||
compatible = "marvell,mv64360-mpp";
|
||||
reg = <0xf000 0x10>;
|
||||
};
|
||||
|
||||
|
||||
n) Marvell Discovery GPP (General Purpose Pins) nodes
|
||||
|
||||
Represent the Discovery's GPP hardware
|
||||
|
||||
Required properties:
|
||||
- compatible : "marvell,mv64360-gpp"
|
||||
- reg : Offset and length of the register set for this device
|
||||
|
||||
Example Discovery GPP node:
|
||||
gpp@f000 {
|
||||
compatible = "marvell,mv64360-gpp";
|
||||
reg = <0xf100 0x20>;
|
||||
};
|
||||
|
||||
|
||||
o) Marvell Discovery PCI host bridge node
|
||||
|
||||
Represents the Discovery's PCI host bridge device. The properties
|
||||
for this node conform to Rev 2.1 of the PCI Bus Binding to IEEE
|
||||
1275-1994. A typical value for the compatible property is
|
||||
"marvell,mv64360-pci".
|
||||
|
||||
Example Discovery PCI host bridge node
|
||||
pci@80000000 {
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
#interrupt-cells = <1>;
|
||||
device_type = "pci";
|
||||
compatible = "marvell,mv64360-pci";
|
||||
reg = <0xcf8 0x8>;
|
||||
ranges = <0x01000000 0x0 0x0
|
||||
0x88000000 0x0 0x01000000
|
||||
0x02000000 0x0 0x80000000
|
||||
0x80000000 0x0 0x08000000>;
|
||||
bus-range = <0 255>;
|
||||
clock-frequency = <66000000>;
|
||||
interrupt-parent = <&PIC>;
|
||||
interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
|
||||
interrupt-map = <
|
||||
/* IDSEL 0x0a */
|
||||
0x5000 0 0 1 &PIC 80
|
||||
0x5000 0 0 2 &PIC 81
|
||||
0x5000 0 0 3 &PIC 91
|
||||
0x5000 0 0 4 &PIC 93
|
||||
|
||||
/* IDSEL 0x0b */
|
||||
0x5800 0 0 1 &PIC 91
|
||||
0x5800 0 0 2 &PIC 93
|
||||
0x5800 0 0 3 &PIC 80
|
||||
0x5800 0 0 4 &PIC 81
|
||||
|
||||
/* IDSEL 0x0c */
|
||||
0x6000 0 0 1 &PIC 91
|
||||
0x6000 0 0 2 &PIC 93
|
||||
0x6000 0 0 3 &PIC 80
|
||||
0x6000 0 0 4 &PIC 81
|
||||
|
||||
/* IDSEL 0x0d */
|
||||
0x6800 0 0 1 &PIC 93
|
||||
0x6800 0 0 2 &PIC 80
|
||||
0x6800 0 0 3 &PIC 81
|
||||
0x6800 0 0 4 &PIC 91
|
||||
>;
|
||||
};
|
||||
|
||||
|
||||
p) Marvell Discovery CPU Error nodes
|
||||
|
||||
Represent the Discovery's CPU error handler device.
|
||||
|
||||
Required properties:
|
||||
- compatible : "marvell,mv64360-cpu-error"
|
||||
- reg : Offset and length of the register set for this device
|
||||
- interrupts : the interrupt number for this device
|
||||
- interrupt-parent : the phandle for the interrupt controller
|
||||
that services interrupts for this device.
|
||||
|
||||
Example Discovery CPU Error node:
|
||||
cpu-error@0070 {
|
||||
compatible = "marvell,mv64360-cpu-error";
|
||||
reg = <0x70 0x10 0x128 0x28>;
|
||||
interrupts = <3>;
|
||||
interrupt-parent = <&PIC>;
|
||||
};
|
||||
|
||||
|
||||
q) Marvell Discovery SRAM Controller nodes
|
||||
|
||||
Represent the Discovery's SRAM controller device.
|
||||
|
||||
Required properties:
|
||||
- compatible : "marvell,mv64360-sram-ctrl"
|
||||
- reg : Offset and length of the register set for this device
|
||||
- interrupts : the interrupt number for this device
|
||||
- interrupt-parent : the phandle for the interrupt controller
|
||||
that services interrupts for this device.
|
||||
|
||||
Example Discovery SRAM Controller node:
|
||||
sram-ctrl@0380 {
|
||||
compatible = "marvell,mv64360-sram-ctrl";
|
||||
reg = <0x380 0x80>;
|
||||
interrupts = <13>;
|
||||
interrupt-parent = <&PIC>;
|
||||
};
|
||||
|
||||
|
||||
r) Marvell Discovery PCI Error Handler nodes
|
||||
|
||||
Represent the Discovery's PCI error handler device.
|
||||
|
||||
Required properties:
|
||||
- compatible : "marvell,mv64360-pci-error"
|
||||
- reg : Offset and length of the register set for this device
|
||||
- interrupts : the interrupt number for this device
|
||||
- interrupt-parent : the phandle for the interrupt controller
|
||||
that services interrupts for this device.
|
||||
|
||||
Example Discovery PCI Error Handler node:
|
||||
pci-error@1d40 {
|
||||
compatible = "marvell,mv64360-pci-error";
|
||||
reg = <0x1d40 0x40 0xc28 0x4>;
|
||||
interrupts = <12>;
|
||||
interrupt-parent = <&PIC>;
|
||||
};
|
||||
|
||||
|
||||
s) Marvell Discovery Memory Controller nodes
|
||||
|
||||
Represent the Discovery's memory controller device.
|
||||
|
||||
Required properties:
|
||||
- compatible : "marvell,mv64360-mem-ctrl"
|
||||
- reg : Offset and length of the register set for this device
|
||||
- interrupts : the interrupt number for this device
|
||||
- interrupt-parent : the phandle for the interrupt controller
|
||||
that services interrupts for this device.
|
||||
|
||||
Example Discovery Memory Controller node:
|
||||
mem-ctrl@1400 {
|
||||
compatible = "marvell,mv64360-mem-ctrl";
|
||||
reg = <0x1400 0x60>;
|
||||
interrupts = <17>;
|
||||
interrupt-parent = <&PIC>;
|
||||
};
|
||||
|
||||
|
25
Documentation/powerpc/dts-bindings/phy.txt
Normal file
25
Documentation/powerpc/dts-bindings/phy.txt
Normal file
@ -0,0 +1,25 @@
|
||||
PHY nodes
|
||||
|
||||
Required properties:
|
||||
|
||||
- device_type : Should be "ethernet-phy"
|
||||
- interrupts : <a b> where a is the interrupt number and b is a
|
||||
field that represents an encoding of the sense and level
|
||||
information for the interrupt. This should be encoded based on
|
||||
the information in section 2) depending on the type of interrupt
|
||||
controller you have.
|
||||
- interrupt-parent : the phandle for the interrupt controller that
|
||||
services interrupts for this device.
|
||||
- reg : The ID number for the phy, usually a small integer
|
||||
- linux,phandle : phandle for this node; likely referenced by an
|
||||
ethernet controller node.
|
||||
|
||||
Example:
|
||||
|
||||
ethernet-phy@0 {
|
||||
linux,phandle = <2452000>
|
||||
interrupt-parent = <40000>;
|
||||
interrupts = <35 1>;
|
||||
reg = <0>;
|
||||
device_type = "ethernet-phy";
|
||||
};
|
57
Documentation/powerpc/dts-bindings/spi-bus.txt
Normal file
57
Documentation/powerpc/dts-bindings/spi-bus.txt
Normal file
@ -0,0 +1,57 @@
|
||||
SPI (Serial Peripheral Interface) busses
|
||||
|
||||
SPI busses can be described with a node for the SPI master device
|
||||
and a set of child nodes for each SPI slave on the bus. For this
|
||||
discussion, it is assumed that the system's SPI controller is in
|
||||
SPI master mode. This binding does not describe SPI controllers
|
||||
in slave mode.
|
||||
|
||||
The SPI master node requires the following properties:
|
||||
- #address-cells - number of cells required to define a chip select
|
||||
address on the SPI bus.
|
||||
- #size-cells - should be zero.
|
||||
- compatible - name of SPI bus controller following generic names
|
||||
recommended practice.
|
||||
No other properties are required in the SPI bus node. It is assumed
|
||||
that a driver for an SPI bus device will understand that it is an SPI bus.
|
||||
However, the binding does not attempt to define the specific method for
|
||||
assigning chip select numbers. Since SPI chip select configuration is
|
||||
flexible and non-standardized, it is left out of this binding with the
|
||||
assumption that board specific platform code will be used to manage
|
||||
chip selects. Individual drivers can define additional properties to
|
||||
support describing the chip select layout.
|
||||
|
||||
SPI slave nodes must be children of the SPI master node and can
|
||||
contain the following properties.
|
||||
- reg - (required) chip select address of device.
|
||||
- compatible - (required) name of SPI device following generic names
|
||||
recommended practice
|
||||
- spi-max-frequency - (required) Maximum SPI clocking speed of device in Hz
|
||||
- spi-cpol - (optional) Empty property indicating device requires
|
||||
inverse clock polarity (CPOL) mode
|
||||
- spi-cpha - (optional) Empty property indicating device requires
|
||||
shifted clock phase (CPHA) mode
|
||||
- spi-cs-high - (optional) Empty property indicating device requires
|
||||
chip select active high
|
||||
|
||||
SPI example for an MPC5200 SPI bus:
|
||||
spi@f00 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "fsl,mpc5200b-spi","fsl,mpc5200-spi";
|
||||
reg = <0xf00 0x20>;
|
||||
interrupts = <2 13 0 2 14 0>;
|
||||
interrupt-parent = <&mpc5200_pic>;
|
||||
|
||||
ethernet-switch@0 {
|
||||
compatible = "micrel,ks8995m";
|
||||
spi-max-frequency = <1000000>;
|
||||
reg = <0>;
|
||||
};
|
||||
|
||||
codec@1 {
|
||||
compatible = "ti,tlv320aic26";
|
||||
spi-max-frequency = <100000>;
|
||||
reg = <1>;
|
||||
};
|
||||
};
|
25
Documentation/powerpc/dts-bindings/usb-ehci.txt
Normal file
25
Documentation/powerpc/dts-bindings/usb-ehci.txt
Normal file
@ -0,0 +1,25 @@
|
||||
USB EHCI controllers
|
||||
|
||||
Required properties:
|
||||
- compatible : should be "usb-ehci".
|
||||
- reg : should contain at least address and length of the standard EHCI
|
||||
register set for the device. Optional platform-dependent registers
|
||||
(debug-port or other) can be also specified here, but only after
|
||||
definition of standard EHCI registers.
|
||||
- interrupts : one EHCI interrupt should be described here.
|
||||
If device registers are implemented in big endian mode, the device
|
||||
node should have "big-endian-regs" property.
|
||||
If controller implementation operates with big endian descriptors,
|
||||
"big-endian-desc" property should be specified.
|
||||
If both big endian registers and descriptors are used by the controller
|
||||
implementation, "big-endian" property can be specified instead of having
|
||||
both "big-endian-regs" and "big-endian-desc".
|
||||
|
||||
Example (Sequoia 440EPx):
|
||||
ehci@e0000300 {
|
||||
compatible = "ibm,usb-ehci-440epx", "usb-ehci";
|
||||
interrupt-parent = <&UIC0>;
|
||||
interrupts = <1a 4>;
|
||||
reg = <0 e0000300 90 0 e0000390 70>;
|
||||
big-endian;
|
||||
};
|
295
Documentation/powerpc/dts-bindings/xilinx.txt
Normal file
295
Documentation/powerpc/dts-bindings/xilinx.txt
Normal file
@ -0,0 +1,295 @@
|
||||
d) Xilinx IP cores
|
||||
|
||||
The Xilinx EDK toolchain ships with a set of IP cores (devices) for use
|
||||
in Xilinx Spartan and Virtex FPGAs. The devices cover the whole range
|
||||
of standard device types (network, serial, etc.) and miscellaneous
|
||||
devices (gpio, LCD, spi, etc). Also, since these devices are
|
||||
implemented within the fpga fabric every instance of the device can be
|
||||
synthesised with different options that change the behaviour.
|
||||
|
||||
Each IP-core has a set of parameters which the FPGA designer can use to
|
||||
control how the core is synthesized. Historically, the EDK tool would
|
||||
extract the device parameters relevant to device drivers and copy them
|
||||
into an 'xparameters.h' in the form of #define symbols. This tells the
|
||||
device drivers how the IP cores are configured, but it requres the kernel
|
||||
to be recompiled every time the FPGA bitstream is resynthesized.
|
||||
|
||||
The new approach is to export the parameters into the device tree and
|
||||
generate a new device tree each time the FPGA bitstream changes. The
|
||||
parameters which used to be exported as #defines will now become
|
||||
properties of the device node. In general, device nodes for IP-cores
|
||||
will take the following form:
|
||||
|
||||
(name): (generic-name)@(base-address) {
|
||||
compatible = "xlnx,(ip-core-name)-(HW_VER)"
|
||||
[, (list of compatible devices), ...];
|
||||
reg = <(baseaddr) (size)>;
|
||||
interrupt-parent = <&interrupt-controller-phandle>;
|
||||
interrupts = < ... >;
|
||||
xlnx,(parameter1) = "(string-value)";
|
||||
xlnx,(parameter2) = <(int-value)>;
|
||||
};
|
||||
|
||||
(generic-name): an open firmware-style name that describes the
|
||||
generic class of device. Preferably, this is one word, such
|
||||
as 'serial' or 'ethernet'.
|
||||
(ip-core-name): the name of the ip block (given after the BEGIN
|
||||
directive in system.mhs). Should be in lowercase
|
||||
and all underscores '_' converted to dashes '-'.
|
||||
(name): is derived from the "PARAMETER INSTANCE" value.
|
||||
(parameter#): C_* parameters from system.mhs. The C_ prefix is
|
||||
dropped from the parameter name, the name is converted
|
||||
to lowercase and all underscore '_' characters are
|
||||
converted to dashes '-'.
|
||||
(baseaddr): the baseaddr parameter value (often named C_BASEADDR).
|
||||
(HW_VER): from the HW_VER parameter.
|
||||
(size): the address range size (often C_HIGHADDR - C_BASEADDR + 1).
|
||||
|
||||
Typically, the compatible list will include the exact IP core version
|
||||
followed by an older IP core version which implements the same
|
||||
interface or any other device with the same interface.
|
||||
|
||||
'reg', 'interrupt-parent' and 'interrupts' are all optional properties.
|
||||
|
||||
For example, the following block from system.mhs:
|
||||
|
||||
BEGIN opb_uartlite
|
||||
PARAMETER INSTANCE = opb_uartlite_0
|
||||
PARAMETER HW_VER = 1.00.b
|
||||
PARAMETER C_BAUDRATE = 115200
|
||||
PARAMETER C_DATA_BITS = 8
|
||||
PARAMETER C_ODD_PARITY = 0
|
||||
PARAMETER C_USE_PARITY = 0
|
||||
PARAMETER C_CLK_FREQ = 50000000
|
||||
PARAMETER C_BASEADDR = 0xEC100000
|
||||
PARAMETER C_HIGHADDR = 0xEC10FFFF
|
||||
BUS_INTERFACE SOPB = opb_7
|
||||
PORT OPB_Clk = CLK_50MHz
|
||||
PORT Interrupt = opb_uartlite_0_Interrupt
|
||||
PORT RX = opb_uartlite_0_RX
|
||||
PORT TX = opb_uartlite_0_TX
|
||||
PORT OPB_Rst = sys_bus_reset_0
|
||||
END
|
||||
|
||||
becomes the following device tree node:
|
||||
|
||||
opb_uartlite_0: serial@ec100000 {
|
||||
device_type = "serial";
|
||||
compatible = "xlnx,opb-uartlite-1.00.b";
|
||||
reg = <ec100000 10000>;
|
||||
interrupt-parent = <&opb_intc_0>;
|
||||
interrupts = <1 0>; // got this from the opb_intc parameters
|
||||
current-speed = <d#115200>; // standard serial device prop
|
||||
clock-frequency = <d#50000000>; // standard serial device prop
|
||||
xlnx,data-bits = <8>;
|
||||
xlnx,odd-parity = <0>;
|
||||
xlnx,use-parity = <0>;
|
||||
};
|
||||
|
||||
Some IP cores actually implement 2 or more logical devices. In
|
||||
this case, the device should still describe the whole IP core with
|
||||
a single node and add a child node for each logical device. The
|
||||
ranges property can be used to translate from parent IP-core to the
|
||||
registers of each device. In addition, the parent node should be
|
||||
compatible with the bus type 'xlnx,compound', and should contain
|
||||
#address-cells and #size-cells, as with any other bus. (Note: this
|
||||
makes the assumption that both logical devices have the same bus
|
||||
binding. If this is not true, then separate nodes should be used
|
||||
for each logical device). The 'cell-index' property can be used to
|
||||
enumerate logical devices within an IP core. For example, the
|
||||
following is the system.mhs entry for the dual ps2 controller found
|
||||
on the ml403 reference design.
|
||||
|
||||
BEGIN opb_ps2_dual_ref
|
||||
PARAMETER INSTANCE = opb_ps2_dual_ref_0
|
||||
PARAMETER HW_VER = 1.00.a
|
||||
PARAMETER C_BASEADDR = 0xA9000000
|
||||
PARAMETER C_HIGHADDR = 0xA9001FFF
|
||||
BUS_INTERFACE SOPB = opb_v20_0
|
||||
PORT Sys_Intr1 = ps2_1_intr
|
||||
PORT Sys_Intr2 = ps2_2_intr
|
||||
PORT Clkin1 = ps2_clk_rx_1
|
||||
PORT Clkin2 = ps2_clk_rx_2
|
||||
PORT Clkpd1 = ps2_clk_tx_1
|
||||
PORT Clkpd2 = ps2_clk_tx_2
|
||||
PORT Rx1 = ps2_d_rx_1
|
||||
PORT Rx2 = ps2_d_rx_2
|
||||
PORT Txpd1 = ps2_d_tx_1
|
||||
PORT Txpd2 = ps2_d_tx_2
|
||||
END
|
||||
|
||||
It would result in the following device tree nodes:
|
||||
|
||||
opb_ps2_dual_ref_0: opb-ps2-dual-ref@a9000000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "xlnx,compound";
|
||||
ranges = <0 a9000000 2000>;
|
||||
// If this device had extra parameters, then they would
|
||||
// go here.
|
||||
ps2@0 {
|
||||
compatible = "xlnx,opb-ps2-dual-ref-1.00.a";
|
||||
reg = <0 40>;
|
||||
interrupt-parent = <&opb_intc_0>;
|
||||
interrupts = <3 0>;
|
||||
cell-index = <0>;
|
||||
};
|
||||
ps2@1000 {
|
||||
compatible = "xlnx,opb-ps2-dual-ref-1.00.a";
|
||||
reg = <1000 40>;
|
||||
interrupt-parent = <&opb_intc_0>;
|
||||
interrupts = <3 0>;
|
||||
cell-index = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
Also, the system.mhs file defines bus attachments from the processor
|
||||
to the devices. The device tree structure should reflect the bus
|
||||
attachments. Again an example; this system.mhs fragment:
|
||||
|
||||
BEGIN ppc405_virtex4
|
||||
PARAMETER INSTANCE = ppc405_0
|
||||
PARAMETER HW_VER = 1.01.a
|
||||
BUS_INTERFACE DPLB = plb_v34_0
|
||||
BUS_INTERFACE IPLB = plb_v34_0
|
||||
END
|
||||
|
||||
BEGIN opb_intc
|
||||
PARAMETER INSTANCE = opb_intc_0
|
||||
PARAMETER HW_VER = 1.00.c
|
||||
PARAMETER C_BASEADDR = 0xD1000FC0
|
||||
PARAMETER C_HIGHADDR = 0xD1000FDF
|
||||
BUS_INTERFACE SOPB = opb_v20_0
|
||||
END
|
||||
|
||||
BEGIN opb_uart16550
|
||||
PARAMETER INSTANCE = opb_uart16550_0
|
||||
PARAMETER HW_VER = 1.00.d
|
||||
PARAMETER C_BASEADDR = 0xa0000000
|
||||
PARAMETER C_HIGHADDR = 0xa0001FFF
|
||||
BUS_INTERFACE SOPB = opb_v20_0
|
||||
END
|
||||
|
||||
BEGIN plb_v34
|
||||
PARAMETER INSTANCE = plb_v34_0
|
||||
PARAMETER HW_VER = 1.02.a
|
||||
END
|
||||
|
||||
BEGIN plb_bram_if_cntlr
|
||||
PARAMETER INSTANCE = plb_bram_if_cntlr_0
|
||||
PARAMETER HW_VER = 1.00.b
|
||||
PARAMETER C_BASEADDR = 0xFFFF0000
|
||||
PARAMETER C_HIGHADDR = 0xFFFFFFFF
|
||||
BUS_INTERFACE SPLB = plb_v34_0
|
||||
END
|
||||
|
||||
BEGIN plb2opb_bridge
|
||||
PARAMETER INSTANCE = plb2opb_bridge_0
|
||||
PARAMETER HW_VER = 1.01.a
|
||||
PARAMETER C_RNG0_BASEADDR = 0x20000000
|
||||
PARAMETER C_RNG0_HIGHADDR = 0x3FFFFFFF
|
||||
PARAMETER C_RNG1_BASEADDR = 0x60000000
|
||||
PARAMETER C_RNG1_HIGHADDR = 0x7FFFFFFF
|
||||
PARAMETER C_RNG2_BASEADDR = 0x80000000
|
||||
PARAMETER C_RNG2_HIGHADDR = 0xBFFFFFFF
|
||||
PARAMETER C_RNG3_BASEADDR = 0xC0000000
|
||||
PARAMETER C_RNG3_HIGHADDR = 0xDFFFFFFF
|
||||
BUS_INTERFACE SPLB = plb_v34_0
|
||||
BUS_INTERFACE MOPB = opb_v20_0
|
||||
END
|
||||
|
||||
Gives this device tree (some properties removed for clarity):
|
||||
|
||||
plb@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "xlnx,plb-v34-1.02.a";
|
||||
device_type = "ibm,plb";
|
||||
ranges; // 1:1 translation
|
||||
|
||||
plb_bram_if_cntrl_0: bram@ffff0000 {
|
||||
reg = <ffff0000 10000>;
|
||||
}
|
||||
|
||||
opb@20000000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <20000000 20000000 20000000
|
||||
60000000 60000000 20000000
|
||||
80000000 80000000 40000000
|
||||
c0000000 c0000000 20000000>;
|
||||
|
||||
opb_uart16550_0: serial@a0000000 {
|
||||
reg = <a00000000 2000>;
|
||||
};
|
||||
|
||||
opb_intc_0: interrupt-controller@d1000fc0 {
|
||||
reg = <d1000fc0 20>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
That covers the general approach to binding xilinx IP cores into the
|
||||
device tree. The following are bindings for specific devices:
|
||||
|
||||
i) Xilinx ML300 Framebuffer
|
||||
|
||||
Simple framebuffer device from the ML300 reference design (also on the
|
||||
ML403 reference design as well as others).
|
||||
|
||||
Optional properties:
|
||||
- resolution = <xres yres> : pixel resolution of framebuffer. Some
|
||||
implementations use a different resolution.
|
||||
Default is <d#640 d#480>
|
||||
- virt-resolution = <xvirt yvirt> : Size of framebuffer in memory.
|
||||
Default is <d#1024 d#480>.
|
||||
- rotate-display (empty) : rotate display 180 degrees.
|
||||
|
||||
ii) Xilinx SystemACE
|
||||
|
||||
The Xilinx SystemACE device is used to program FPGAs from an FPGA
|
||||
bitstream stored on a CF card. It can also be used as a generic CF
|
||||
interface device.
|
||||
|
||||
Optional properties:
|
||||
- 8-bit (empty) : Set this property for SystemACE in 8 bit mode
|
||||
|
||||
iii) Xilinx EMAC and Xilinx TEMAC
|
||||
|
||||
Xilinx Ethernet devices. In addition to general xilinx properties
|
||||
listed above, nodes for these devices should include a phy-handle
|
||||
property, and may include other common network device properties
|
||||
like local-mac-address.
|
||||
|
||||
iv) Xilinx Uartlite
|
||||
|
||||
Xilinx uartlite devices are simple fixed speed serial ports.
|
||||
|
||||
Required properties:
|
||||
- current-speed : Baud rate of uartlite
|
||||
|
||||
v) Xilinx hwicap
|
||||
|
||||
Xilinx hwicap devices provide access to the configuration logic
|
||||
of the FPGA through the Internal Configuration Access Port
|
||||
(ICAP). The ICAP enables partial reconfiguration of the FPGA,
|
||||
readback of the configuration information, and some control over
|
||||
'warm boots' of the FPGA fabric.
|
||||
|
||||
Required properties:
|
||||
- xlnx,family : The family of the FPGA, necessary since the
|
||||
capabilities of the underlying ICAP hardware
|
||||
differ between different families. May be
|
||||
'virtex2p', 'virtex4', or 'virtex5'.
|
||||
|
||||
vi) Xilinx Uart 16550
|
||||
|
||||
Xilinx UART 16550 devices are very similar to the NS16550 but with
|
||||
different register spacing and an offset from the base address.
|
||||
|
||||
Required properties:
|
||||
- clock-frequency : Frequency of the clock input
|
||||
- reg-offset : A value of 3 is required
|
||||
- reg-shift : A value of 2 is required
|
||||
|
||||
|
@ -111,6 +111,8 @@ following attributes:
|
||||
|
||||
name: Name assigned by driver to this key (interface or driver name).
|
||||
type: Driver type string ("wlan", "bluetooth", etc).
|
||||
persistent: Whether the soft blocked state is initialised from
|
||||
non-volatile storage at startup.
|
||||
state: Current state of the transmitter
|
||||
0: RFKILL_STATE_SOFT_BLOCKED
|
||||
transmitter is turned off by software
|
||||
|
@ -139,6 +139,7 @@ ALC883/888
|
||||
acer Acer laptops (Travelmate 3012WTMi, Aspire 5600, etc)
|
||||
acer-aspire Acer Aspire 9810
|
||||
acer-aspire-4930g Acer Aspire 4930G
|
||||
acer-aspire-6530g Acer Aspire 6530G
|
||||
acer-aspire-8930g Acer Aspire 8930G
|
||||
medion Medion Laptops
|
||||
medion-md2 Medion MD2
|
||||
@ -239,6 +240,7 @@ AD1986A
|
||||
laptop-automute 2-channel with EAPD and HP-automute (Lenovo N100)
|
||||
ultra 2-channel with EAPD (Samsung Ultra tablet PC)
|
||||
samsung 2-channel with EAPD (Samsung R65)
|
||||
samsung-p50 2-channel with HP-automute (Samsung P50)
|
||||
|
||||
AD1988/AD1988B/AD1989A/AD1989B
|
||||
==============================
|
||||
|
@ -6,8 +6,8 @@
|
||||
5 -> Leadtek Winfast 2000XP Expert [107d:6611,107d:6613]
|
||||
6 -> AverTV Studio 303 (M126) [1461:000b]
|
||||
7 -> MSI TV-@nywhere Master [1462:8606]
|
||||
8 -> Leadtek Winfast DV2000 [107d:6620]
|
||||
9 -> Leadtek PVR 2000 [107d:663b,107d:663c,107d:6632]
|
||||
8 -> Leadtek Winfast DV2000 [107d:6620,107d:6621]
|
||||
9 -> Leadtek PVR 2000 [107d:663b,107d:663c,107d:6632,107d:6630,107d:6638,107d:6631,107d:6637,107d:663d]
|
||||
10 -> IODATA GV-VCP3/PCI [10fc:d003]
|
||||
11 -> Prolink PlayTV PVR
|
||||
12 -> ASUS PVR-416 [1043:4823,1461:c111]
|
||||
@ -59,7 +59,7 @@
|
||||
58 -> Pinnacle PCTV HD 800i [11bd:0051]
|
||||
59 -> DViCO FusionHDTV 5 PCI nano [18ac:d530]
|
||||
60 -> Pinnacle Hybrid PCTV [12ab:1788]
|
||||
61 -> Winfast TV2000 XP Global [107d:6f18]
|
||||
61 -> Leadtek TV2000 XP Global [107d:6f18,107d:6618]
|
||||
62 -> PowerColor RA330 [14f1:ea3d]
|
||||
63 -> Geniatech X8000-MT DVBT [14f1:8852]
|
||||
64 -> DViCO FusionHDTV DVB-T PRO [18ac:db30]
|
||||
|
@ -65,3 +65,4 @@
|
||||
67 -> Terratec Grabby (em2860) [0ccd:0096]
|
||||
68 -> Terratec AV350 (em2860) [0ccd:0084]
|
||||
69 -> KWorld ATSC 315U HDTV TV Box (em2882) [eb1a:a313]
|
||||
70 -> Evga inDtube (em2882)
|
||||
|
@ -390,6 +390,30 @@ later date. It differs between i2c drivers and as such can be confusing.
|
||||
To see which chip variants are supported you can look in the i2c driver code
|
||||
for the i2c_device_id table. This lists all the possibilities.
|
||||
|
||||
There are two more helper functions:
|
||||
|
||||
v4l2_i2c_new_subdev_cfg: this function adds new irq and platform_data
|
||||
arguments and has both 'addr' and 'probed_addrs' arguments: if addr is not
|
||||
0 then that will be used (non-probing variant), otherwise the probed_addrs
|
||||
are probed.
|
||||
|
||||
For example: this will probe for address 0x10:
|
||||
|
||||
struct v4l2_subdev *sd = v4l2_i2c_new_subdev_cfg(v4l2_dev, adapter,
|
||||
"module_foo", "chipid", 0, NULL, 0, I2C_ADDRS(0x10));
|
||||
|
||||
v4l2_i2c_new_subdev_board uses an i2c_board_info struct which is passed
|
||||
to the i2c driver and replaces the irq, platform_data and addr arguments.
|
||||
|
||||
If the subdev supports the s_config core ops, then that op is called with
|
||||
the irq and platform_data arguments after the subdev was setup. The older
|
||||
v4l2_i2c_new_(probed_)subdev functions will call s_config as well, but with
|
||||
irq set to 0 and platform_data set to NULL.
|
||||
|
||||
Note that in the next kernel release the functions v4l2_i2c_new_subdev,
|
||||
v4l2_i2c_new_probed_subdev and v4l2_i2c_new_probed_subdev_addr will all be
|
||||
replaced by a single v4l2_i2c_new_subdev that is identical to
|
||||
v4l2_i2c_new_subdev_cfg but without the irq and platform_data arguments.
|
||||
|
||||
struct video_device
|
||||
-------------------
|
||||
|
@ -19,30 +19,41 @@ Last reviewed: 06/02/2009
|
||||
not be updated in a timely fashion and a hardware system reset (also known as
|
||||
an Automatic Server Recovery (ASR)) event will occur.
|
||||
|
||||
The hpwdt driver also has three (3) module parameters. They are the following:
|
||||
The hpwdt driver also has four (4) module parameters. They are the following:
|
||||
|
||||
soft_margin - allows the user to set the watchdog timer value
|
||||
allow_kdump - allows the user to save off a kernel dump image after an NMI
|
||||
nowayout - basic watchdog parameter that does not allow the timer to
|
||||
be restarted or an impending ASR to be escaped.
|
||||
priority - determines whether or not the hpwdt driver is first on the
|
||||
die_notify list to handle NMIs or last. The default value
|
||||
for this module parameter is 0 or LAST. If the user wants to
|
||||
enable NMI sourcing then reload the hpwdt driver with
|
||||
priority=1 (and boot with nmi_watchdog=0).
|
||||
|
||||
NOTE: More information about watchdog drivers in general, including the ioctl
|
||||
interface to /dev/watchdog can be found in
|
||||
Documentation/watchdog/watchdog-api.txt and Documentation/IPMI.txt.
|
||||
|
||||
The NMI sourcing capability is disabled when the driver discovers that the
|
||||
nmi_watchdog is turned on (nmi_watchdog = 1). This is due to the inability to
|
||||
The priority parameter was introduced due to other kernel software that relied
|
||||
on handling NMIs (like oprofile). Keeping hpwdt's priority at 0 (or LAST)
|
||||
enables the users of NMIs for non critical events to be work as expected.
|
||||
|
||||
The NMI sourcing capability is disabled by default due to the inability to
|
||||
distinguish between "NMI Watchdog Ticks" and "HW generated NMI events" in the
|
||||
Linux kernel. What this means is that the hpwdt nmi handler code is called
|
||||
each time the NMI signal fires off. This could amount to several thousands of
|
||||
NMIs in a matter of seconds. If a user sees the Linux kernel's "dazed and
|
||||
confused" message in the logs or if the system gets into a hung state, then
|
||||
the user should reboot with nmi_watchdog=0.
|
||||
the hpwdt driver can be reloaded with the "priority" module parameter set
|
||||
(priority=1).
|
||||
|
||||
1. If the kernel has not been booted with nmi_watchdog turned off then
|
||||
edit /boot/grub/menu.lst and place the nmi_watchdog=0 at the end of the
|
||||
currently booting kernel line.
|
||||
2. reboot the sever
|
||||
3. Once the system comes up perform a rmmod hpwdt
|
||||
4. insmod /lib/modules/`uname -r`/kernel/drivers/char/watchdog/hpwdt.ko priority=1
|
||||
|
||||
Now, the hpwdt can successfully receive and source the NMI and provide a log
|
||||
message that details the reason for the NMI (as determined by the HP BIOS).
|
||||
|
102
MAINTAINERS
102
MAINTAINERS
@ -230,6 +230,13 @@ L: linux-acenic@sunsite.dk
|
||||
S: Maintained
|
||||
F: drivers/net/acenic*
|
||||
|
||||
ACER ASPIRE ONE TEMPERATURE AND FAN DRIVER
|
||||
P: Peter Feuerer
|
||||
M: peter@piie.net
|
||||
W: http://piie.net/?section=acerhdf
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/acerhdf.c
|
||||
|
||||
ACER WMI LAPTOP EXTRAS
|
||||
P: Carlos Corbacho
|
||||
M: carlos@strangeworlds.co.uk
|
||||
@ -653,6 +660,8 @@ M: laforge@openezx.org
|
||||
L: openezx-devel@lists.openezx.org (subscribers-only)
|
||||
W: http://www.openezx.org/
|
||||
S: Maintained
|
||||
T: topgit git://git.openezx.org/openezx.git
|
||||
F: arch/arm/mach-pxa/ezx.c
|
||||
|
||||
ARM/FARADAY FA526 PORT
|
||||
P: Paulius Zaleckas
|
||||
@ -774,11 +783,25 @@ P: Philipp Zabel
|
||||
M: philipp.zabel@gmail.com
|
||||
S: Maintained
|
||||
|
||||
ARM/MIOA701 MACHINE SUPPORT
|
||||
P: Robert Jarzmik
|
||||
M: robert.jarzmik@free.fr
|
||||
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
||||
F: arch/arm/mach-pxa/mioa701.c
|
||||
S: Maintained
|
||||
|
||||
ARM/NEC MOBILEPRO 900/c MACHINE SUPPORT
|
||||
P: Michael Petchkovsky
|
||||
M: mkpetch@internode.on.net
|
||||
S: Maintained
|
||||
|
||||
ARM/OPENMOKO NEO FREERUNNER (GTA02) MACHINE SUPPORT
|
||||
P: Nelson Castillo
|
||||
M: arhuaco@freaks-unidos.net
|
||||
L: openmoko-kernel@lists.openmoko.org (subscribers-only)
|
||||
W: http://wiki.openmoko.org/wiki/Neo_FreeRunner
|
||||
S: Supported
|
||||
|
||||
ARM/TOSA MACHINE SUPPORT
|
||||
P: Dmitry Eremin-Solenikov
|
||||
M: dbaryshkov@gmail.com
|
||||
@ -792,6 +815,12 @@ M: marek.vasut@gmail.com
|
||||
W: http://hackndev.com
|
||||
S: Maintained
|
||||
|
||||
ARM/PALM TREO 680 SUPPORT
|
||||
P: Tomas Cech
|
||||
M: sleep_walker@suse.cz
|
||||
W: http://hackndev.com
|
||||
S: Maintained
|
||||
|
||||
ARM/PALMZ72 SUPPORT
|
||||
P: Sergey Lapin
|
||||
M: slapin@ossfans.org
|
||||
@ -891,8 +920,7 @@ M: corentincj@iksaif.net
|
||||
P: Karol Kozimor
|
||||
M: sziwan@users.sourceforge.net
|
||||
L: acpi4asus-user@lists.sourceforge.net
|
||||
W: http://sourceforge.net/projects/acpi4asus
|
||||
W: http://xf.iksaif.net/acpi4asus
|
||||
W: http://acpi4asus.sf.net
|
||||
S: Maintained
|
||||
F: arch/x86/kernel/acpi/boot.c
|
||||
F: drivers/platform/x86/asus_acpi.c
|
||||
@ -908,8 +936,7 @@ ASUS LAPTOP EXTRAS DRIVER
|
||||
P: Corentin Chary
|
||||
M: corentincj@iksaif.net
|
||||
L: acpi4asus-user@lists.sourceforge.net
|
||||
W: http://sourceforge.net/projects/acpi4asus
|
||||
W: http://xf.iksaif.net/acpi4asus
|
||||
W: http://acpi4asus.sf.net
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/asus-laptop.c
|
||||
|
||||
@ -946,7 +973,7 @@ M: me@bobcopeland.com
|
||||
L: linux-wireless@vger.kernel.org
|
||||
L: ath5k-devel@lists.ath5k.org
|
||||
S: Maintained
|
||||
F: drivers/net/wireless/ath5k/
|
||||
F: drivers/net/wireless/ath/ath5k/
|
||||
|
||||
ATHEROS ATH9K WIRELESS DRIVER
|
||||
P: Luis R. Rodriguez
|
||||
@ -962,7 +989,7 @@ M: senthilkumar@atheros.com
|
||||
L: linux-wireless@vger.kernel.org
|
||||
L: ath9k-devel@lists.ath9k.org
|
||||
S: Supported
|
||||
F: drivers/net/wireless/ath9k/
|
||||
F: drivers/net/wireless/ath/ath9k/
|
||||
|
||||
ATHEROS AR9170 WIRELESS DRIVER
|
||||
P: Christian Lamparter
|
||||
@ -970,7 +997,7 @@ M: chunkeey@web.de
|
||||
L: linux-wireless@vger.kernel.org
|
||||
W: http://wireless.kernel.org/en/users/Drivers/ar9170
|
||||
S: Maintained
|
||||
F: drivers/net/wireless/ar9170/
|
||||
F: drivers/net/wireless/ath/ar9170/
|
||||
|
||||
ATI_REMOTE2 DRIVER
|
||||
P: Ville Syrjala
|
||||
@ -1010,6 +1037,13 @@ W: http://www.at91.com/
|
||||
S: Maintained
|
||||
F: drivers/mmc/host/at91_mci.c
|
||||
|
||||
ATMEL AT91 / AT32 MCI DRIVER
|
||||
P: Nicolas Ferre
|
||||
M: nicolas.ferre@atmel.com
|
||||
S: Maintained
|
||||
F: drivers/mmc/host/atmel-mci.c
|
||||
F: drivers/mmc/host/atmel-mci-regs.h
|
||||
|
||||
ATMEL AT91 / AT32 SERIAL DRIVER
|
||||
P: Haavard Skinnemoen
|
||||
M: hskinnemoen@atmel.com
|
||||
@ -1607,7 +1641,7 @@ P: Mikael Starvik
|
||||
M: starvik@axis.com
|
||||
P: Jesper Nilsson
|
||||
M: jesper.nilsson@axis.com
|
||||
L: dev-etrax@axis.com
|
||||
L: linux-cris-kernel@axis.com
|
||||
W: http://developer.axis.com
|
||||
S: Maintained
|
||||
F: arch/cris/
|
||||
@ -2053,8 +2087,8 @@ F: drivers/edac/i5400_edac.c
|
||||
|
||||
EDAC-I82975X
|
||||
P: Ranganathan Desikan
|
||||
P: Arvind R.
|
||||
M: rdesikan@jetzbroadband.com
|
||||
P: Arvind R.
|
||||
M: arvind@acarlab.com
|
||||
L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers)
|
||||
W: bluesmoke.sourceforge.net
|
||||
@ -2081,7 +2115,7 @@ EEEPC LAPTOP EXTRAS DRIVER
|
||||
P: Corentin Chary
|
||||
M: corentincj@iksaif.net
|
||||
L: acpi4asus-user@lists.sourceforge.net
|
||||
W: http://sourceforge.net/projects/acpi4asus
|
||||
W: http://acpi4asus.sf.net
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/eeepc-laptop.c
|
||||
|
||||
@ -2390,7 +2424,7 @@ FTRACE
|
||||
P: Steven Rostedt
|
||||
M: rostedt@goodmis.org
|
||||
S: Maintained
|
||||
F: Documentation/ftrace.txt
|
||||
F: Documentation/trace/ftrace.txt
|
||||
F: arch/*/*/*/ftrace.h
|
||||
F: arch/*/kernel/ftrace.c
|
||||
F: include/*/ftrace.h
|
||||
@ -2453,6 +2487,14 @@ F: drivers/net/wan/pc300too.c
|
||||
F: drivers/net/wan/pci200syn.c
|
||||
F: drivers/net/wan/wanxl*
|
||||
|
||||
GENERIC INCLUDE/ASM HEADER FILES
|
||||
P: Arnd Bergmann
|
||||
M: arnd@arndb.de
|
||||
L: linux-arch@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/arnd/asm-generic.git
|
||||
S: Maintained
|
||||
F: include/asm-generic
|
||||
|
||||
GFS2 FILE SYSTEM
|
||||
P: Steven Whitehouse
|
||||
M: swhiteho@redhat.com
|
||||
@ -2795,10 +2837,10 @@ S: Supported
|
||||
F: drivers/scsi/ips.*
|
||||
|
||||
IDE SUBSYSTEM
|
||||
P: Bartlomiej Zolnierkiewicz
|
||||
M: bzolnier@gmail.com
|
||||
P: David S. Miller
|
||||
M: davem@davemloft.net
|
||||
L: linux-ide@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/ide-2.6.git
|
||||
S: Maintained
|
||||
F: Documentation/ide/
|
||||
F: drivers/ide/
|
||||
@ -2846,10 +2888,10 @@ P: Sergey Lapin
|
||||
M: slapin@ossfans.org
|
||||
L: linux-zigbee-devel@lists.sourceforge.net
|
||||
W: http://apps.sourceforge.net/trac/linux-zigbee
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/lumag/lowpan.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/lowpan/lowpan.git
|
||||
S: Maintained
|
||||
F: net/ieee802154/
|
||||
F: drivers/ieee801254/
|
||||
F: drivers/ieee802154/
|
||||
|
||||
INTEGRITY MEASUREMENT ARCHITECTURE (IMA)
|
||||
P: Mimi Zohar
|
||||
@ -3223,7 +3265,6 @@ W: http://www.linux-mtd.infradead.org/doc/jffs2.html
|
||||
S: Maintained
|
||||
F: fs/jffs2/
|
||||
F: include/linux/jffs2.h
|
||||
F: include/mtd/jffs2-user.h
|
||||
|
||||
JOURNALLING LAYER FOR BLOCK DEVICES (JBD)
|
||||
P: Stephen Tweedie
|
||||
@ -3406,7 +3447,7 @@ P: Eduard - Gabriel Munteanu
|
||||
M: eduard.munteanu@linux360.ro
|
||||
S: Maintained
|
||||
F: Documentation/trace/kmemtrace.txt
|
||||
F: include/trace/kmemtrace.h
|
||||
F: include/linux/kmemtrace.h
|
||||
F: kernel/trace/kmemtrace.c
|
||||
|
||||
KPROBES
|
||||
@ -4083,7 +4124,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6.git
|
||||
S: Maintained
|
||||
F: net/wireless/
|
||||
F: include/net/ieee80211*
|
||||
F: include/net/wireless.h
|
||||
F: include/linux/wireless.h
|
||||
|
||||
NETWORKING DRIVERS
|
||||
L: netdev@vger.kernel.org
|
||||
@ -5094,6 +5135,13 @@ L: sdhci-devel@lists.ossman.eu
|
||||
S: Maintained
|
||||
F: drivers/mmc/host/sdhci.*
|
||||
|
||||
SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) SAMSUNG DRIVER
|
||||
P: Ben Dooks
|
||||
M: ben-linux@fluff.org
|
||||
L: sdhci-devel@lists.ossman.eu
|
||||
S: Maintained
|
||||
F: drivers/mmc/host/sdhci-s3c.c
|
||||
|
||||
SECURITY SUBSYSTEM
|
||||
P: James Morris
|
||||
M: jmorris@namei.org
|
||||
@ -5479,6 +5527,7 @@ STAGING SUBSYSTEM
|
||||
P: Greg Kroah-Hartman
|
||||
M: gregkh@suse.de
|
||||
T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
|
||||
L: devel@driverdev.osuosl.org
|
||||
S: Maintained
|
||||
F: drivers/staging/
|
||||
|
||||
@ -5619,6 +5668,13 @@ F: drivers/misc/tifm*
|
||||
F: drivers/mmc/host/tifm_sd.c
|
||||
F: include/linux/tifm.h
|
||||
|
||||
TI TWL4030 SERIES SOC CODEC DRIVER
|
||||
P: Peter Ujfalusi
|
||||
M: peter.ujfalusi@nokia.com
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: sound/soc/codecs/twl4030*
|
||||
|
||||
TIPC NETWORK LAYER
|
||||
P: Per Liden
|
||||
M: per.liden@ericsson.com
|
||||
@ -6215,6 +6271,14 @@ S: Maintained
|
||||
F: Documentation/i2c/busses/i2c-viapro
|
||||
F: drivers/i2c/busses/i2c-viapro.c
|
||||
|
||||
VIA SD/MMC CARD CONTROLLER DRIVER
|
||||
P: Joseph Chan
|
||||
M: JosephChan@via.com.tw
|
||||
P: Harald Welte
|
||||
M: HaraldWelte@viatech.com
|
||||
S: Maintained
|
||||
F: drivers/mmc/host/via-sdmmc.c
|
||||
|
||||
VIA UNICHROME(PRO)/CHROME9 FRAMEBUFFER DRIVER
|
||||
P: Joseph Chan
|
||||
M: JosephChan@via.com.tw
|
||||
|
4
Makefile
4
Makefile
@ -1,7 +1,7 @@
|
||||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 30
|
||||
EXTRAVERSION =
|
||||
SUBLEVEL = 31
|
||||
EXTRAVERSION = -rc1
|
||||
NAME = Man-Eating Seals of Antiquity
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -146,7 +146,7 @@ do_page_fault(unsigned long address, unsigned long mmcsr,
|
||||
/* If for any reason at all we couldn't handle the fault,
|
||||
make sure we exit gracefully rather than endlessly redo
|
||||
the fault. */
|
||||
fault = handle_mm_fault(mm, vma, address, cause > 0);
|
||||
fault = handle_mm_fault(mm, vma, address, cause > 0 ? FAULT_FLAG_WRITE : 0);
|
||||
up_read(&mm->mmap_sem);
|
||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||
if (fault & VM_FAULT_OOM)
|
||||
|
@ -1241,7 +1241,7 @@ endmenu
|
||||
|
||||
menu "CPU Power Management"
|
||||
|
||||
if (ARCH_SA1100 || ARCH_INTEGRATOR || ARCH_OMAP || ARCH_PXA)
|
||||
if (ARCH_SA1100 || ARCH_INTEGRATOR || ARCH_OMAP || ARCH_PXA || ARCH_S3C64XX)
|
||||
|
||||
source "drivers/cpufreq/Kconfig"
|
||||
|
||||
@ -1272,6 +1272,10 @@ config CPU_FREQ_PXA
|
||||
default y
|
||||
select CPU_FREQ_DEFAULT_GOV_USERSPACE
|
||||
|
||||
config CPU_FREQ_S3C64XX
|
||||
bool "CPUfreq support for Samsung S3C64XX CPUs"
|
||||
depends on CPU_FREQ && CPU_S3C6410
|
||||
|
||||
endif
|
||||
|
||||
source "drivers/cpuidle/Kconfig"
|
||||
|
@ -674,6 +674,15 @@ proc_types:
|
||||
b __armv4_mmu_cache_off
|
||||
b __armv5tej_mmu_cache_flush
|
||||
|
||||
#ifdef CONFIG_CPU_FEROCEON_OLD_ID
|
||||
/* this conflicts with the standard ARMv5TE entry */
|
||||
.long 0x41009260 @ Old Feroceon
|
||||
.long 0xff00fff0
|
||||
b __armv4_mmu_cache_on
|
||||
b __armv4_mmu_cache_off
|
||||
b __armv5tej_mmu_cache_flush
|
||||
#endif
|
||||
|
||||
.word 0x66015261 @ FA526
|
||||
.word 0xff01fff1
|
||||
b __fa526_cache_on
|
||||
|
@ -117,7 +117,7 @@ static int gic_set_cpu(unsigned int irq, const struct cpumask *mask_val)
|
||||
u32 val;
|
||||
|
||||
spin_lock(&irq_controller_lock);
|
||||
irq_desc[irq].cpu = cpu;
|
||||
irq_desc[irq].node = cpu;
|
||||
val = readl(reg) & ~(0xff << shift);
|
||||
val |= 1 << (cpu + shift);
|
||||
writel(val, reg);
|
||||
|
@ -229,14 +229,18 @@ static int vic_set_wake(unsigned int irq, unsigned int on)
|
||||
{
|
||||
struct vic_device *v = vic_from_irq(irq);
|
||||
unsigned int off = irq & 31;
|
||||
u32 bit = 1 << off;
|
||||
|
||||
if (!v)
|
||||
return -EINVAL;
|
||||
|
||||
if (!(bit & v->resume_sources))
|
||||
return -EINVAL;
|
||||
|
||||
if (on)
|
||||
v->resume_irqs |= 1 << off;
|
||||
v->resume_irqs |= bit;
|
||||
else
|
||||
v->resume_irqs &= ~(1 << off);
|
||||
v->resume_irqs &= ~bit;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
2097
arch/arm/configs/mini2440_defconfig
Normal file
2097
arch/arm/configs/mini2440_defconfig
Normal file
File diff suppressed because it is too large
Load Diff
@ -389,6 +389,8 @@
|
||||
#define __NR_inotify_init1 (__NR_SYSCALL_BASE+360)
|
||||
#define __NR_preadv (__NR_SYSCALL_BASE+361)
|
||||
#define __NR_pwritev (__NR_SYSCALL_BASE+362)
|
||||
#define __NR_rt_tgsigqueueinfo (__NR_SYSCALL_BASE+363)
|
||||
#define __NR_perf_counter_open (__NR_SYSCALL_BASE+364)
|
||||
|
||||
/*
|
||||
* The following SWIs are ARM private.
|
||||
|
@ -372,6 +372,8 @@
|
||||
/* 360 */ CALL(sys_inotify_init1)
|
||||
CALL(sys_preadv)
|
||||
CALL(sys_pwritev)
|
||||
CALL(sys_rt_tgsigqueueinfo)
|
||||
CALL(sys_perf_counter_open)
|
||||
#ifndef syscalls_counted
|
||||
.equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
|
||||
#define syscalls_counted
|
||||
|
@ -167,7 +167,7 @@ void __init init_IRQ(void)
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
cpumask_setall(bad_irq_desc.affinity);
|
||||
bad_irq_desc.cpu = smp_processor_id();
|
||||
bad_irq_desc.node = smp_processor_id();
|
||||
#endif
|
||||
init_arch_irq();
|
||||
}
|
||||
@ -176,7 +176,7 @@ void __init init_IRQ(void)
|
||||
|
||||
static void route_irq(struct irq_desc *desc, unsigned int irq, unsigned int cpu)
|
||||
{
|
||||
pr_debug("IRQ%u: moving from cpu%u to cpu%u\n", irq, desc->cpu, cpu);
|
||||
pr_debug("IRQ%u: moving from cpu%u to cpu%u\n", irq, desc->node, cpu);
|
||||
|
||||
spin_lock_irq(&desc->lock);
|
||||
desc->chip->set_affinity(irq, cpumask_of(cpu));
|
||||
@ -195,7 +195,7 @@ void migrate_irqs(void)
|
||||
for (i = 0; i < NR_IRQS; i++) {
|
||||
struct irq_desc *desc = irq_desc + i;
|
||||
|
||||
if (desc->cpu == cpu) {
|
||||
if (desc->node == cpu) {
|
||||
unsigned int newcpu = cpumask_any_and(desc->affinity,
|
||||
cpu_online_mask);
|
||||
if (newcpu >= nr_cpu_ids) {
|
||||
|
@ -114,9 +114,6 @@ void arm_machine_restart(char mode, const char *cmd)
|
||||
/*
|
||||
* Function pointers to optional machine specific functions
|
||||
*/
|
||||
void (*pm_idle)(void);
|
||||
EXPORT_SYMBOL(pm_idle);
|
||||
|
||||
void (*pm_power_off)(void);
|
||||
EXPORT_SYMBOL(pm_power_off);
|
||||
|
||||
@ -130,20 +127,19 @@ EXPORT_SYMBOL_GPL(arm_pm_restart);
|
||||
*/
|
||||
static void default_idle(void)
|
||||
{
|
||||
if (hlt_counter)
|
||||
cpu_relax();
|
||||
else {
|
||||
local_irq_disable();
|
||||
if (!need_resched())
|
||||
arch_idle();
|
||||
local_irq_enable();
|
||||
}
|
||||
if (!need_resched())
|
||||
arch_idle();
|
||||
local_irq_enable();
|
||||
}
|
||||
|
||||
void (*pm_idle)(void) = default_idle;
|
||||
EXPORT_SYMBOL(pm_idle);
|
||||
|
||||
/*
|
||||
* The idle thread. We try to conserve power, while trying to keep
|
||||
* overall latency low. The architecture specific idle is passed
|
||||
* a value to indicate the level of "idleness" of the system.
|
||||
* The idle thread, has rather strange semantics for calling pm_idle,
|
||||
* but this is what x86 does and we need to do the same, so that
|
||||
* things like cpuidle get called in the same way. The only difference
|
||||
* is that we always respect 'hlt_counter' to prevent low power idle.
|
||||
*/
|
||||
void cpu_idle(void)
|
||||
{
|
||||
@ -151,21 +147,31 @@ void cpu_idle(void)
|
||||
|
||||
/* endless idle loop with no priority at all */
|
||||
while (1) {
|
||||
void (*idle)(void) = pm_idle;
|
||||
|
||||
tick_nohz_stop_sched_tick(1);
|
||||
leds_event(led_idle_start);
|
||||
while (!need_resched()) {
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
if (cpu_is_offline(smp_processor_id())) {
|
||||
leds_event(led_idle_start);
|
||||
cpu_die();
|
||||
}
|
||||
if (cpu_is_offline(smp_processor_id()))
|
||||
cpu_die();
|
||||
#endif
|
||||
|
||||
if (!idle)
|
||||
idle = default_idle;
|
||||
leds_event(led_idle_start);
|
||||
tick_nohz_stop_sched_tick(1);
|
||||
while (!need_resched())
|
||||
idle();
|
||||
local_irq_disable();
|
||||
if (hlt_counter) {
|
||||
local_irq_enable();
|
||||
cpu_relax();
|
||||
} else {
|
||||
stop_critical_timings();
|
||||
pm_idle();
|
||||
start_critical_timings();
|
||||
/*
|
||||
* This will eventually be removed - pm_idle
|
||||
* functions should always return with IRQs
|
||||
* enabled.
|
||||
*/
|
||||
WARN_ON(irqs_disabled());
|
||||
local_irq_enable();
|
||||
}
|
||||
}
|
||||
leds_event(led_idle_end);
|
||||
tick_nohz_restart_sched_tick();
|
||||
preempt_enable_no_resched();
|
||||
@ -352,6 +358,23 @@ asm( ".section .text\n"
|
||||
" .size kernel_thread_helper, . - kernel_thread_helper\n"
|
||||
" .previous");
|
||||
|
||||
#ifdef CONFIG_ARM_UNWIND
|
||||
extern void kernel_thread_exit(long code);
|
||||
asm( ".section .text\n"
|
||||
" .align\n"
|
||||
" .type kernel_thread_exit, #function\n"
|
||||
"kernel_thread_exit:\n"
|
||||
" .fnstart\n"
|
||||
" .cantunwind\n"
|
||||
" bl do_exit\n"
|
||||
" nop\n"
|
||||
" .fnend\n"
|
||||
" .size kernel_thread_exit, . - kernel_thread_exit\n"
|
||||
" .previous");
|
||||
#else
|
||||
#define kernel_thread_exit do_exit
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Create a kernel thread.
|
||||
*/
|
||||
@ -363,7 +386,7 @@ pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)
|
||||
|
||||
regs.ARM_r1 = (unsigned long)arg;
|
||||
regs.ARM_r2 = (unsigned long)fn;
|
||||
regs.ARM_r3 = (unsigned long)do_exit;
|
||||
regs.ARM_r3 = (unsigned long)kernel_thread_exit;
|
||||
regs.ARM_pc = (unsigned long)kernel_thread_helper;
|
||||
regs.ARM_cpsr = SVC_MODE | PSR_ENDSTATE;
|
||||
|
||||
|
@ -212,7 +212,8 @@ static int unwind_exec_insn(struct unwind_ctrl_block *ctrl)
|
||||
ctrl->vrs[14] = *vsp++;
|
||||
ctrl->vrs[SP] = (unsigned long)vsp;
|
||||
} else if (insn == 0xb0) {
|
||||
ctrl->vrs[PC] = ctrl->vrs[LR];
|
||||
if (ctrl->vrs[PC] == 0)
|
||||
ctrl->vrs[PC] = ctrl->vrs[LR];
|
||||
/* no further processing */
|
||||
ctrl->entries = 0;
|
||||
} else if (insn == 0xb1) {
|
||||
@ -309,18 +310,20 @@ int unwind_frame(struct stackframe *frame)
|
||||
}
|
||||
|
||||
while (ctrl.entries > 0) {
|
||||
int urc;
|
||||
|
||||
if (ctrl.vrs[SP] < low || ctrl.vrs[SP] >= high)
|
||||
return -URC_FAILURE;
|
||||
urc = unwind_exec_insn(&ctrl);
|
||||
int urc = unwind_exec_insn(&ctrl);
|
||||
if (urc < 0)
|
||||
return urc;
|
||||
if (ctrl.vrs[SP] < low || ctrl.vrs[SP] >= high)
|
||||
return -URC_FAILURE;
|
||||
}
|
||||
|
||||
if (ctrl.vrs[PC] == 0)
|
||||
ctrl.vrs[PC] = ctrl.vrs[LR];
|
||||
|
||||
/* check for infinite loop */
|
||||
if (frame->pc == ctrl.vrs[PC])
|
||||
return -URC_FAILURE;
|
||||
|
||||
frame->fp = ctrl.vrs[FP];
|
||||
frame->sp = ctrl.vrs[SP];
|
||||
frame->lr = ctrl.vrs[LR];
|
||||
@ -332,7 +335,6 @@ int unwind_frame(struct stackframe *frame)
|
||||
void unwind_backtrace(struct pt_regs *regs, struct task_struct *tsk)
|
||||
{
|
||||
struct stackframe frame;
|
||||
unsigned long high, low;
|
||||
register unsigned long current_sp asm ("sp");
|
||||
|
||||
pr_debug("%s(regs = %p tsk = %p)\n", __func__, regs, tsk);
|
||||
@ -362,9 +364,6 @@ void unwind_backtrace(struct pt_regs *regs, struct task_struct *tsk)
|
||||
frame.pc = thread_saved_pc(tsk);
|
||||
}
|
||||
|
||||
low = frame.sp & ~(THREAD_SIZE - 1);
|
||||
high = low + THREAD_SIZE;
|
||||
|
||||
while (1) {
|
||||
int urc;
|
||||
unsigned long where = frame.pc;
|
||||
|
@ -84,6 +84,14 @@ SECTIONS
|
||||
*(.exitcall.exit)
|
||||
*(.ARM.exidx.exit.text)
|
||||
*(.ARM.extab.exit.text)
|
||||
#ifndef CONFIG_HOTPLUG_CPU
|
||||
*(.ARM.exidx.cpuexit.text)
|
||||
*(.ARM.extab.cpuexit.text)
|
||||
#endif
|
||||
#ifndef CONFIG_HOTPLUG
|
||||
*(.ARM.exidx.devexit.text)
|
||||
*(.ARM.extab.devexit.text)
|
||||
#endif
|
||||
#ifndef CONFIG_MMU
|
||||
*(.fixup)
|
||||
*(__ex_table)
|
||||
|
@ -68,10 +68,14 @@ struct davinci_nand_pdata { /* platform_data */
|
||||
|
||||
/* none == NAND_ECC_NONE (strongly *not* advised!!)
|
||||
* soft == NAND_ECC_SOFT
|
||||
* 1-bit == NAND_ECC_HW
|
||||
* 4-bit == NAND_ECC_HW_SYNDROME (not on all chips)
|
||||
* else == NAND_ECC_HW, according to ecc_bits
|
||||
*
|
||||
* All DaVinci-family chips support 1-bit hardware ECC.
|
||||
* Newer ones also support 4-bit ECC, but are awkward
|
||||
* using it with large page chips.
|
||||
*/
|
||||
nand_ecc_modes_t ecc_mode;
|
||||
u8 ecc_bits;
|
||||
|
||||
/* e.g. NAND_BUSWIDTH_16 or NAND_USE_FLASH_BBT */
|
||||
unsigned options;
|
||||
|
42
arch/arm/mach-ep93xx/include/mach/ep93xx_keypad.h
Normal file
42
arch/arm/mach-ep93xx/include/mach/ep93xx_keypad.h
Normal file
@ -0,0 +1,42 @@
|
||||
/*
|
||||
* arch/arm/mach-ep93xx/include/mach/ep93xx_keypad.h
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_EP93XX_KEYPAD_H
|
||||
#define __ASM_ARCH_EP93XX_KEYPAD_H
|
||||
|
||||
#define MAX_MATRIX_KEY_ROWS (8)
|
||||
#define MAX_MATRIX_KEY_COLS (8)
|
||||
|
||||
/* flags for the ep93xx_keypad driver */
|
||||
#define EP93XX_KEYPAD_DISABLE_3_KEY (1<<0) /* disable 3-key reset */
|
||||
#define EP93XX_KEYPAD_DIAG_MODE (1<<1) /* diagnostic mode */
|
||||
#define EP93XX_KEYPAD_BACK_DRIVE (1<<2) /* back driving mode */
|
||||
#define EP93XX_KEYPAD_TEST_MODE (1<<3) /* scan only column 0 */
|
||||
#define EP93XX_KEYPAD_KDIV (1<<4) /* 1/4 clock or 1/16 clock */
|
||||
#define EP93XX_KEYPAD_AUTOREPEAT (1<<5) /* enable key autorepeat */
|
||||
|
||||
/**
|
||||
* struct ep93xx_keypad_platform_data - platform specific device structure
|
||||
* @matrix_key_rows: number of rows in the keypad matrix
|
||||
* @matrix_key_cols: number of columns in the keypad matrix
|
||||
* @matrix_key_map: array of keycodes defining the keypad matrix
|
||||
* @matrix_key_map_size: ARRAY_SIZE(matrix_key_map)
|
||||
* @debounce: debounce start count; terminal count is 0xff
|
||||
* @prescale: row/column counter pre-scaler load value
|
||||
* @flags: see above
|
||||
*/
|
||||
struct ep93xx_keypad_platform_data {
|
||||
unsigned int matrix_key_rows;
|
||||
unsigned int matrix_key_cols;
|
||||
unsigned int *matrix_key_map;
|
||||
int matrix_key_map_size;
|
||||
unsigned int debounce;
|
||||
unsigned int prescale;
|
||||
unsigned int flags;
|
||||
};
|
||||
|
||||
/* macro for creating the matrix_key_map table */
|
||||
#define KEY(row, col, val) (((row) << 28) | ((col) << 24) | (val))
|
||||
|
||||
#endif /* __ASM_ARCH_EP93XX_KEYPAD_H */
|
@ -302,7 +302,7 @@ int omap2_wait_clock_ready(void __iomem *reg, u32 mask, const char *name)
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
if (i < MAX_CLOCK_ENABLE_WAIT)
|
||||
if (i <= MAX_CLOCK_ENABLE_WAIT)
|
||||
pr_debug("Clock %s stable after %d loops\n", name, i);
|
||||
else
|
||||
printk(KERN_ERR "Clock %s didn't enable in %d tries\n",
|
||||
|
@ -286,6 +286,20 @@ static struct omap_clk omap34xx_clks[] = {
|
||||
|
||||
#define MIN_SDRC_DLL_LOCK_FREQ 83000000
|
||||
|
||||
#define CYCLES_PER_MHZ 1000000
|
||||
|
||||
/* Scale factor for fixed-point arith in omap3_core_dpll_m2_set_rate() */
|
||||
#define SDRC_MPURATE_SCALE 8
|
||||
|
||||
/* 2^SDRC_MPURATE_BASE_SHIFT: MPU MHz that SDRC_MPURATE_LOOPS is defined for */
|
||||
#define SDRC_MPURATE_BASE_SHIFT 9
|
||||
|
||||
/*
|
||||
* SDRC_MPURATE_LOOPS: Number of MPU loops to execute at
|
||||
* 2^MPURATE_BASE_SHIFT MHz for SDRC to stabilize
|
||||
*/
|
||||
#define SDRC_MPURATE_LOOPS 96
|
||||
|
||||
/**
|
||||
* omap3_dpll_recalc - recalculate DPLL rate
|
||||
* @clk: DPLL struct clk
|
||||
@ -709,7 +723,8 @@ static int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate)
|
||||
{
|
||||
u32 new_div = 0;
|
||||
u32 unlock_dll = 0;
|
||||
unsigned long validrate, sdrcrate;
|
||||
u32 c;
|
||||
unsigned long validrate, sdrcrate, mpurate;
|
||||
struct omap_sdrc_params *sp;
|
||||
|
||||
if (!clk || !rate)
|
||||
@ -718,18 +733,15 @@ static int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate)
|
||||
if (clk != &dpll3_m2_ck)
|
||||
return -EINVAL;
|
||||
|
||||
if (rate == clk->rate)
|
||||
return 0;
|
||||
|
||||
validrate = omap2_clksel_round_rate_div(clk, rate, &new_div);
|
||||
if (validrate != rate)
|
||||
return -EINVAL;
|
||||
|
||||
sdrcrate = sdrc_ick.rate;
|
||||
if (rate > clk->rate)
|
||||
sdrcrate <<= ((rate / clk->rate) - 1);
|
||||
sdrcrate <<= ((rate / clk->rate) >> 1);
|
||||
else
|
||||
sdrcrate >>= ((clk->rate / rate) - 1);
|
||||
sdrcrate >>= ((clk->rate / rate) >> 1);
|
||||
|
||||
sp = omap2_sdrc_get_params(sdrcrate);
|
||||
if (!sp)
|
||||
@ -740,17 +752,25 @@ static int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate)
|
||||
unlock_dll = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* XXX This only needs to be done when the CPU frequency changes
|
||||
*/
|
||||
mpurate = arm_fck.rate / CYCLES_PER_MHZ;
|
||||
c = (mpurate << SDRC_MPURATE_SCALE) >> SDRC_MPURATE_BASE_SHIFT;
|
||||
c += 1; /* for safety */
|
||||
c *= SDRC_MPURATE_LOOPS;
|
||||
c >>= SDRC_MPURATE_SCALE;
|
||||
if (c == 0)
|
||||
c = 1;
|
||||
|
||||
pr_debug("clock: changing CORE DPLL rate from %lu to %lu\n", clk->rate,
|
||||
validrate);
|
||||
pr_debug("clock: SDRC timing params used: %08x %08x %08x\n",
|
||||
sp->rfr_ctrl, sp->actim_ctrla, sp->actim_ctrlb);
|
||||
|
||||
/* REVISIT: SRAM code doesn't support other M2 divisors yet */
|
||||
WARN_ON(new_div != 1 && new_div != 2);
|
||||
|
||||
/* REVISIT: Add SDRC_MR changing to this code also */
|
||||
omap3_configure_core_dpll(sp->rfr_ctrl, sp->actim_ctrla,
|
||||
sp->actim_ctrlb, new_div, unlock_dll);
|
||||
sp->actim_ctrlb, new_div, unlock_dll, c,
|
||||
sp->mr, rate > clk->rate);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/clk.h>
|
||||
|
||||
#include <asm/tlb.h>
|
||||
|
||||
@ -241,6 +242,40 @@ void __init omap2_map_common_io(void)
|
||||
omapfb_reserve_sdram();
|
||||
}
|
||||
|
||||
/*
|
||||
* omap2_init_reprogram_sdrc - reprogram SDRC timing parameters
|
||||
*
|
||||
* Sets the CORE DPLL3 M2 divider to the same value that it's at
|
||||
* currently. This has the effect of setting the SDRC SDRAM AC timing
|
||||
* registers to the values currently defined by the kernel. Currently
|
||||
* only defined for OMAP3; will return 0 if called on OMAP2. Returns
|
||||
* -EINVAL if the dpll3_m2_ck cannot be found, 0 if called on OMAP2,
|
||||
* or passes along the return value of clk_set_rate().
|
||||
*/
|
||||
static int __init _omap2_init_reprogram_sdrc(void)
|
||||
{
|
||||
struct clk *dpll3_m2_ck;
|
||||
int v = -EINVAL;
|
||||
long rate;
|
||||
|
||||
if (!cpu_is_omap34xx())
|
||||
return 0;
|
||||
|
||||
dpll3_m2_ck = clk_get(NULL, "dpll3_m2_ck");
|
||||
if (!dpll3_m2_ck)
|
||||
return -EINVAL;
|
||||
|
||||
rate = clk_get_rate(dpll3_m2_ck);
|
||||
pr_info("Reprogramming SDRC clock to %ld Hz\n", rate);
|
||||
v = clk_set_rate(dpll3_m2_ck, rate);
|
||||
if (v)
|
||||
pr_err("dpll3_m2_clk rate change failed: %d\n", v);
|
||||
|
||||
clk_put(dpll3_m2_ck);
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
void __init omap2_init_common_hw(struct omap_sdrc_params *sp)
|
||||
{
|
||||
omap2_mux_init();
|
||||
@ -249,6 +284,7 @@ void __init omap2_init_common_hw(struct omap_sdrc_params *sp)
|
||||
clkdm_init(clockdomains_omap, clkdm_pwrdm_autodeps);
|
||||
omap2_clk_init();
|
||||
omap2_sdrc_init(sp);
|
||||
_omap2_init_reprogram_sdrc();
|
||||
#endif
|
||||
gpmc_init();
|
||||
}
|
||||
|
@ -1099,7 +1099,7 @@ int pwrdm_wait_transition(struct powerdomain *pwrdm)
|
||||
(c++ < PWRDM_TRANSITION_BAILOUT))
|
||||
udelay(1);
|
||||
|
||||
if (c >= PWRDM_TRANSITION_BAILOUT) {
|
||||
if (c > PWRDM_TRANSITION_BAILOUT) {
|
||||
printk(KERN_ERR "powerdomain: waited too long for "
|
||||
"powerdomain %s to complete transition\n", pwrdm->name);
|
||||
return -EAGAIN;
|
||||
|
@ -3,13 +3,12 @@
|
||||
*
|
||||
* Omap3 specific functions that need to be run in internal SRAM
|
||||
*
|
||||
* (C) Copyright 2007
|
||||
* Texas Instruments Inc.
|
||||
* Rajendra Nayak <rnayak@ti.com>
|
||||
* Copyright (C) 2004, 2007, 2008 Texas Instruments, Inc.
|
||||
* Copyright (C) 2008 Nokia Corporation
|
||||
*
|
||||
* (C) Copyright 2004
|
||||
* Texas Instruments, <www.ti.com>
|
||||
* Rajendra Nayak <rnayak@ti.com>
|
||||
* Richard Woodruff <r-woodruff2@ti.com>
|
||||
* Paul Walmsley
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
@ -37,61 +36,112 @@
|
||||
|
||||
.text
|
||||
|
||||
/* r4 parameters */
|
||||
#define SDRC_NO_UNLOCK_DLL 0x0
|
||||
#define SDRC_UNLOCK_DLL 0x1
|
||||
|
||||
/* SDRC_DLLA_CTRL bit settings */
|
||||
#define FIXEDDELAY_SHIFT 24
|
||||
#define FIXEDDELAY_MASK (0xff << FIXEDDELAY_SHIFT)
|
||||
#define DLLIDLE_MASK 0x4
|
||||
|
||||
/*
|
||||
* Change frequency of core dpll
|
||||
* r0 = sdrc_rfr_ctrl r1 = sdrc_actim_ctrla r2 = sdrc_actim_ctrlb r3 = M2
|
||||
* r4 = Unlock SDRC DLL? (1 = yes, 0 = no) -- only unlock DLL for
|
||||
* SDRC_DLLA_CTRL default values: TI hardware team indicates that
|
||||
* FIXEDDELAY should be initialized to 0xf. This apparently was
|
||||
* empirically determined during process testing, so no derivation
|
||||
* was provided.
|
||||
*/
|
||||
#define FIXEDDELAY_DEFAULT (0x0f << FIXEDDELAY_SHIFT)
|
||||
|
||||
/* SDRC_DLLA_STATUS bit settings */
|
||||
#define LOCKSTATUS_MASK 0x4
|
||||
|
||||
/* SDRC_POWER bit settings */
|
||||
#define SRFRONIDLEREQ_MASK 0x40
|
||||
#define PWDENA_MASK 0x4
|
||||
|
||||
/* CM_IDLEST1_CORE bit settings */
|
||||
#define ST_SDRC_MASK 0x2
|
||||
|
||||
/* CM_ICLKEN1_CORE bit settings */
|
||||
#define EN_SDRC_MASK 0x2
|
||||
|
||||
/* CM_CLKSEL1_PLL bit settings */
|
||||
#define CORE_DPLL_CLKOUT_DIV_SHIFT 0x1b
|
||||
|
||||
/*
|
||||
* omap3_sram_configure_core_dpll - change DPLL3 M2 divider
|
||||
* r0 = new SDRC_RFR_CTRL register contents
|
||||
* r1 = new SDRC_ACTIM_CTRLA register contents
|
||||
* r2 = new SDRC_ACTIM_CTRLB register contents
|
||||
* r3 = new M2 divider setting (only 1 and 2 supported right now)
|
||||
* r4 = unlock SDRC DLL? (1 = yes, 0 = no). Only unlock DLL for
|
||||
* SDRC rates < 83MHz
|
||||
* r5 = number of MPU cycles to wait for SDRC to stabilize after
|
||||
* reprogramming the SDRC when switching to a slower MPU speed
|
||||
* r6 = new SDRC_MR_0 register value
|
||||
* r7 = increasing SDRC rate? (1 = yes, 0 = no)
|
||||
*
|
||||
*/
|
||||
ENTRY(omap3_sram_configure_core_dpll)
|
||||
stmfd sp!, {r1-r12, lr} @ store regs to stack
|
||||
ldr r4, [sp, #52] @ pull extra args off the stack
|
||||
ldr r5, [sp, #56] @ load extra args from the stack
|
||||
ldr r6, [sp, #60] @ load extra args from the stack
|
||||
ldr r7, [sp, #64] @ load extra args from the stack
|
||||
dsb @ flush buffered writes to interconnect
|
||||
cmp r3, #0x2
|
||||
blne configure_sdrc
|
||||
cmp r4, #0x1
|
||||
cmp r7, #1 @ if increasing SDRC clk rate,
|
||||
bleq configure_sdrc @ program the SDRC regs early (for RFR)
|
||||
cmp r4, #SDRC_UNLOCK_DLL @ set the intended DLL state
|
||||
bleq unlock_dll
|
||||
blne lock_dll
|
||||
bl sdram_in_selfrefresh @ put the SDRAM in self refresh
|
||||
bl configure_core_dpll
|
||||
bl enable_sdrc
|
||||
cmp r4, #0x1
|
||||
bl sdram_in_selfrefresh @ put SDRAM in self refresh, idle SDRC
|
||||
bl configure_core_dpll @ change the DPLL3 M2 divider
|
||||
bl enable_sdrc @ take SDRC out of idle
|
||||
cmp r4, #SDRC_UNLOCK_DLL @ wait for DLL status to change
|
||||
bleq wait_dll_unlock
|
||||
blne wait_dll_lock
|
||||
cmp r3, #0x1
|
||||
blne configure_sdrc
|
||||
cmp r7, #1 @ if increasing SDRC clk rate,
|
||||
beq return_to_sdram @ return to SDRAM code, otherwise,
|
||||
bl configure_sdrc @ reprogram SDRC regs now
|
||||
mov r12, r5
|
||||
bl wait_clk_stable @ wait for SDRC to stabilize
|
||||
return_to_sdram:
|
||||
isb @ prevent speculative exec past here
|
||||
mov r0, #0 @ return value
|
||||
ldmfd sp!, {r1-r12, pc} @ restore regs and return
|
||||
unlock_dll:
|
||||
ldr r11, omap3_sdrc_dlla_ctrl
|
||||
ldr r12, [r11]
|
||||
orr r12, r12, #0x4
|
||||
and r12, r12, #FIXEDDELAY_MASK
|
||||
orr r12, r12, #FIXEDDELAY_DEFAULT
|
||||
orr r12, r12, #DLLIDLE_MASK
|
||||
str r12, [r11] @ (no OCP barrier needed)
|
||||
bx lr
|
||||
lock_dll:
|
||||
ldr r11, omap3_sdrc_dlla_ctrl
|
||||
ldr r12, [r11]
|
||||
bic r12, r12, #0x4
|
||||
bic r12, r12, #DLLIDLE_MASK
|
||||
str r12, [r11] @ (no OCP barrier needed)
|
||||
bx lr
|
||||
sdram_in_selfrefresh:
|
||||
ldr r11, omap3_sdrc_power @ read the SDRC_POWER register
|
||||
ldr r12, [r11] @ read the contents of SDRC_POWER
|
||||
mov r9, r12 @ keep a copy of SDRC_POWER bits
|
||||
orr r12, r12, #0x40 @ enable self refresh on idle req
|
||||
bic r12, r12, #0x4 @ clear PWDENA
|
||||
orr r12, r12, #SRFRONIDLEREQ_MASK @ enable self refresh on idle
|
||||
bic r12, r12, #PWDENA_MASK @ clear PWDENA
|
||||
str r12, [r11] @ write back to SDRC_POWER register
|
||||
ldr r12, [r11] @ posted-write barrier for SDRC
|
||||
idle_sdrc:
|
||||
ldr r11, omap3_cm_iclken1_core @ read the CM_ICLKEN1_CORE reg
|
||||
ldr r12, [r11]
|
||||
bic r12, r12, #0x2 @ disable iclk bit for SDRC
|
||||
bic r12, r12, #EN_SDRC_MASK @ disable iclk bit for SDRC
|
||||
str r12, [r11]
|
||||
wait_sdrc_idle:
|
||||
ldr r11, omap3_cm_idlest1_core
|
||||
ldr r12, [r11]
|
||||
and r12, r12, #0x2 @ check for SDRC idle
|
||||
cmp r12, #2
|
||||
and r12, r12, #ST_SDRC_MASK @ check for SDRC idle
|
||||
cmp r12, #ST_SDRC_MASK
|
||||
bne wait_sdrc_idle
|
||||
bx lr
|
||||
configure_core_dpll:
|
||||
@ -99,36 +149,23 @@ configure_core_dpll:
|
||||
ldr r12, [r11]
|
||||
ldr r10, core_m2_mask_val @ modify m2 for core dpll
|
||||
and r12, r12, r10
|
||||
orr r12, r12, r3, lsl #0x1B @ r3 contains the M2 val
|
||||
orr r12, r12, r3, lsl #CORE_DPLL_CLKOUT_DIV_SHIFT
|
||||
str r12, [r11]
|
||||
ldr r12, [r11] @ posted-write barrier for CM
|
||||
mov r12, #0x800 @ wait for the clock to stabilise
|
||||
cmp r3, #2
|
||||
bne wait_clk_stable
|
||||
bx lr
|
||||
wait_clk_stable:
|
||||
subs r12, r12, #1
|
||||
bne wait_clk_stable
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
bx lr
|
||||
enable_sdrc:
|
||||
ldr r11, omap3_cm_iclken1_core
|
||||
ldr r12, [r11]
|
||||
orr r12, r12, #0x2 @ enable iclk bit for SDRC
|
||||
orr r12, r12, #EN_SDRC_MASK @ enable iclk bit for SDRC
|
||||
str r12, [r11]
|
||||
wait_sdrc_idle1:
|
||||
ldr r11, omap3_cm_idlest1_core
|
||||
ldr r12, [r11]
|
||||
and r12, r12, #0x2
|
||||
and r12, r12, #ST_SDRC_MASK
|
||||
cmp r12, #0
|
||||
bne wait_sdrc_idle1
|
||||
restore_sdrc_power_val:
|
||||
@ -138,14 +175,14 @@ restore_sdrc_power_val:
|
||||
wait_dll_lock:
|
||||
ldr r11, omap3_sdrc_dlla_status
|
||||
ldr r12, [r11]
|
||||
and r12, r12, #0x4
|
||||
cmp r12, #0x4
|
||||
and r12, r12, #LOCKSTATUS_MASK
|
||||
cmp r12, #LOCKSTATUS_MASK
|
||||
bne wait_dll_lock
|
||||
bx lr
|
||||
wait_dll_unlock:
|
||||
ldr r11, omap3_sdrc_dlla_status
|
||||
ldr r12, [r11]
|
||||
and r12, r12, #0x4
|
||||
and r12, r12, #LOCKSTATUS_MASK
|
||||
cmp r12, #0x0
|
||||
bne wait_dll_unlock
|
||||
bx lr
|
||||
@ -156,7 +193,9 @@ configure_sdrc:
|
||||
str r1, [r11]
|
||||
ldr r11, omap3_sdrc_actim_ctrlb
|
||||
str r2, [r11]
|
||||
ldr r2, [r11] @ posted-write barrier for SDRC
|
||||
ldr r11, omap3_sdrc_mr_0
|
||||
str r6, [r11]
|
||||
ldr r6, [r11] @ posted-write barrier for SDRC
|
||||
bx lr
|
||||
|
||||
omap3_sdrc_power:
|
||||
@ -173,6 +212,8 @@ omap3_sdrc_actim_ctrla:
|
||||
.word OMAP34XX_SDRC_REGADDR(SDRC_ACTIM_CTRL_A_0)
|
||||
omap3_sdrc_actim_ctrlb:
|
||||
.word OMAP34XX_SDRC_REGADDR(SDRC_ACTIM_CTRL_B_0)
|
||||
omap3_sdrc_mr_0:
|
||||
.word OMAP34XX_SDRC_REGADDR(SDRC_MR_0)
|
||||
omap3_sdrc_dlla_status:
|
||||
.word OMAP34XX_SDRC_REGADDR(SDRC_DLLA_STATUS)
|
||||
omap3_sdrc_dlla_ctrl:
|
||||
|
@ -200,6 +200,6 @@ void __init orion5x_setup_pcie_wa_win(u32 base, u32 size)
|
||||
|
||||
int __init orion5x_setup_sram_win(void)
|
||||
{
|
||||
return setup_cpu_win(win_alloc_count, ORION5X_SRAM_PHYS_BASE,
|
||||
return setup_cpu_win(win_alloc_count++, ORION5X_SRAM_PHYS_BASE,
|
||||
ORION5X_SRAM_SIZE, TARGET_SRAM, ATTR_SRAM, -1);
|
||||
}
|
||||
|
@ -562,7 +562,7 @@ static struct platform_device orion5x_crypto_device = {
|
||||
.resource = orion5x_crypto_res,
|
||||
};
|
||||
|
||||
int __init orion5x_crypto_init(void)
|
||||
static int __init orion5x_crypto_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@ -696,6 +696,14 @@ void __init orion5x_init(void)
|
||||
disable_hlt();
|
||||
}
|
||||
|
||||
/*
|
||||
* The 5082/5181l/5182/6082/6082l/6183 have crypto
|
||||
* while 5180n/5181/5281 don't have crypto.
|
||||
*/
|
||||
if ((dev == MV88F5181_DEV_ID && rev >= MV88F5181L_REV_A0) ||
|
||||
dev == MV88F5182_DEV_ID || dev == MV88F6183_DEV_ID)
|
||||
orion5x_crypto_init();
|
||||
|
||||
/*
|
||||
* Register watchdog driver
|
||||
*/
|
||||
|
@ -38,7 +38,6 @@ void orion5x_spi_init(void);
|
||||
void orion5x_uart0_init(void);
|
||||
void orion5x_uart1_init(void);
|
||||
void orion5x_xor_init(void);
|
||||
int orion5x_crypto_init(void);
|
||||
|
||||
/*
|
||||
* PCIe/PCI functions.
|
||||
|
@ -401,6 +401,16 @@ config MACH_PALMZ72
|
||||
Say Y here if you intend to run this kernel on Palm Zire 72
|
||||
handheld computer.
|
||||
|
||||
config MACH_TREO680
|
||||
bool "Palm Treo 680"
|
||||
default y
|
||||
depends on ARCH_PXA_PALM
|
||||
select PXA27x
|
||||
select IWMMXT
|
||||
help
|
||||
Say Y here if you intend to run this kernel on Palm Treo 680
|
||||
smartphone.
|
||||
|
||||
config MACH_PALMLD
|
||||
bool "Palm LifeDrive"
|
||||
default y
|
||||
|
@ -62,6 +62,7 @@ obj-$(CONFIG_MACH_PALMT5) += palmt5.o
|
||||
obj-$(CONFIG_MACH_PALMTX) += palmtx.o
|
||||
obj-$(CONFIG_MACH_PALMLD) += palmld.o
|
||||
obj-$(CONFIG_MACH_PALMZ72) += palmz72.o
|
||||
obj-$(CONFIG_MACH_TREO680) += treo680.o
|
||||
obj-$(CONFIG_ARCH_VIPER) += viper.o
|
||||
|
||||
ifeq ($(CONFIG_MACH_ZYLONITE),y)
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include <linux/pm.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/backlight.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/ads7846.h>
|
||||
@ -600,6 +601,10 @@ static struct platform_device *devices[] __initdata = {
|
||||
&sharpsl_rom_device,
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata corgi_i2c_devices[] = {
|
||||
{ I2C_BOARD_INFO("wm8731", 0x1b) },
|
||||
};
|
||||
|
||||
static void corgi_poweroff(void)
|
||||
{
|
||||
if (!machine_is_corgi())
|
||||
@ -634,6 +639,7 @@ static void __init corgi_init(void)
|
||||
pxa_set_mci_info(&corgi_mci_platform_data);
|
||||
pxa_set_ficp_info(&corgi_ficp_platform_data);
|
||||
pxa_set_i2c_info(NULL);
|
||||
i2c_register_board_info(0, ARRAY_AND_SIZE(corgi_i2c_devices));
|
||||
|
||||
platform_scoop_config = &corgi_pcmcia_config;
|
||||
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include <linux/apm-emulation.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c/pca953x.h>
|
||||
#include <linux/regulator/userspace-consumer.h>
|
||||
|
||||
#include <media/soc_camera.h>
|
||||
|
||||
@ -735,6 +736,7 @@ static struct pxa2xx_spi_chip em_x270_libertas_chip = {
|
||||
.rx_threshold = 1,
|
||||
.tx_threshold = 1,
|
||||
.timeout = 1000,
|
||||
.gpio_cs = 14,
|
||||
};
|
||||
|
||||
static unsigned long em_x270_libertas_pin_config[] = {
|
||||
@ -803,7 +805,6 @@ static int em_x270_libertas_teardown(struct spi_device *spi)
|
||||
|
||||
struct libertas_spi_platform_data em_x270_libertas_pdata = {
|
||||
.use_dummy_writes = 1,
|
||||
.gpio_cs = 14,
|
||||
.setup = em_x270_libertas_setup,
|
||||
.teardown = em_x270_libertas_teardown,
|
||||
};
|
||||
@ -838,10 +839,14 @@ static void __init em_x270_init_spi(void)
|
||||
static inline void em_x270_init_spi(void) {}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_PXA2XX_AC97) || defined(CONFIG_SND_PXA2XX_AC97_MODULE)
|
||||
#if defined(CONFIG_SND_PXA2XX_LIB_AC97)
|
||||
static pxa2xx_audio_ops_t em_x270_ac97_info = {
|
||||
.reset_gpio = 113,
|
||||
};
|
||||
|
||||
static void __init em_x270_init_ac97(void)
|
||||
{
|
||||
pxa_set_ac97_info(NULL);
|
||||
pxa_set_ac97_info(&em_x270_ac97_info);
|
||||
}
|
||||
#else
|
||||
static inline void em_x270_init_ac97(void) {}
|
||||
@ -1038,6 +1043,52 @@ static void __init em_x270_init_camera(void)
|
||||
static inline void em_x270_init_camera(void) {}
|
||||
#endif
|
||||
|
||||
static struct regulator_bulk_data em_x270_gps_consumer_supply = {
|
||||
.supply = "vcc gps",
|
||||
};
|
||||
|
||||
static struct regulator_userspace_consumer_data em_x270_gps_consumer_data = {
|
||||
.name = "vcc gps",
|
||||
.num_supplies = 1,
|
||||
.supplies = &em_x270_gps_consumer_supply,
|
||||
};
|
||||
|
||||
static struct platform_device em_x270_gps_userspace_consumer = {
|
||||
.name = "reg-userspace-consumer",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &em_x270_gps_consumer_data,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_bulk_data em_x270_gprs_consumer_supply = {
|
||||
.supply = "vcc gprs",
|
||||
};
|
||||
|
||||
static struct regulator_userspace_consumer_data em_x270_gprs_consumer_data = {
|
||||
.name = "vcc gprs",
|
||||
.num_supplies = 1,
|
||||
.supplies = &em_x270_gprs_consumer_supply
|
||||
};
|
||||
|
||||
static struct platform_device em_x270_gprs_userspace_consumer = {
|
||||
.name = "reg-userspace-consumer",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = &em_x270_gprs_consumer_data,
|
||||
}
|
||||
};
|
||||
|
||||
static struct platform_device *em_x270_userspace_consumers[] = {
|
||||
&em_x270_gps_userspace_consumer,
|
||||
&em_x270_gprs_userspace_consumer,
|
||||
};
|
||||
|
||||
static void __init em_x270_userspace_consumers_init(void)
|
||||
{
|
||||
platform_add_devices(ARRAY_AND_SIZE(em_x270_userspace_consumers));
|
||||
}
|
||||
|
||||
/* DA9030 related initializations */
|
||||
#define REGULATOR_CONSUMER(_name, _dev, _supply) \
|
||||
static struct regulator_consumer_supply _name##_consumers[] = { \
|
||||
@ -1047,11 +1098,11 @@ static inline void em_x270_init_camera(void) {}
|
||||
}, \
|
||||
}
|
||||
|
||||
REGULATOR_CONSUMER(ldo3, NULL, "vcc gps");
|
||||
REGULATOR_CONSUMER(ldo3, &em_x270_gps_userspace_consumer.dev, "vcc gps");
|
||||
REGULATOR_CONSUMER(ldo5, NULL, "vcc cam");
|
||||
REGULATOR_CONSUMER(ldo10, &pxa_device_mci.dev, "vcc sdio");
|
||||
REGULATOR_CONSUMER(ldo12, NULL, "vcc usb");
|
||||
REGULATOR_CONSUMER(ldo19, NULL, "vcc gprs");
|
||||
REGULATOR_CONSUMER(ldo19, &em_x270_gprs_userspace_consumer.dev, "vcc gprs");
|
||||
|
||||
#define REGULATOR_INIT(_ldo, _min_uV, _max_uV, _ops_mask) \
|
||||
static struct regulator_init_data _ldo##_data = { \
|
||||
@ -1062,6 +1113,7 @@ REGULATOR_CONSUMER(ldo19, NULL, "vcc gprs");
|
||||
.enabled = 0, \
|
||||
}, \
|
||||
.valid_ops_mask = _ops_mask, \
|
||||
.apply_uV = 1, \
|
||||
}, \
|
||||
.num_consumer_supplies = ARRAY_SIZE(_ldo##_consumers), \
|
||||
.consumer_supplies = _ldo##_consumers, \
|
||||
@ -1240,6 +1292,7 @@ static void __init em_x270_init(void)
|
||||
em_x270_init_spi();
|
||||
em_x270_init_i2c();
|
||||
em_x270_init_camera();
|
||||
em_x270_userspace_consumers_init();
|
||||
}
|
||||
|
||||
MACHINE_START(EM_X270, "Compulab EM-X270")
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/regulator/bq24022.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/regulator/max1586.h>
|
||||
#include <linux/spi/ads7846.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/usb/gpio_vbus.h>
|
||||
@ -774,6 +775,45 @@ static struct platform_device strataflash = {
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* Maxim MAX1587A on PI2C
|
||||
*/
|
||||
|
||||
static struct regulator_consumer_supply max1587a_consumer = {
|
||||
.supply = "vcc_core",
|
||||
};
|
||||
|
||||
static struct regulator_init_data max1587a_v3_info = {
|
||||
.constraints = {
|
||||
.name = "vcc_core range",
|
||||
.min_uV = 900000,
|
||||
.max_uV = 1705000,
|
||||
.always_on = 1,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &max1587a_consumer,
|
||||
};
|
||||
|
||||
static struct max1586_subdev_data max1587a_subdev = {
|
||||
.name = "vcc_core",
|
||||
.id = MAX1586_V3,
|
||||
.platform_data = &max1587a_v3_info,
|
||||
};
|
||||
|
||||
static struct max1586_platform_data max1587a_info = {
|
||||
.num_subdevs = 1,
|
||||
.subdevs = &max1587a_subdev,
|
||||
.v3_gain = MAX1586_GAIN_R24_3k32, /* 730..1550 mV */
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata pi2c_board_info[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("max1586", 0x14),
|
||||
.platform_data = &max1587a_info,
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* PCMCIA
|
||||
*/
|
||||
@ -828,6 +868,7 @@ static void __init hx4700_init(void)
|
||||
pxa_set_ficp_info(&ficp_info);
|
||||
pxa27x_set_i2c_power_info(NULL);
|
||||
pxa_set_i2c_info(NULL);
|
||||
i2c_register_board_info(1, ARRAY_AND_SIZE(pi2c_board_info));
|
||||
pxa2xx_set_spi_info(2, &pxa_ssp2_master_info);
|
||||
spi_register_board_info(ARRAY_AND_SIZE(tsc2046_board_info));
|
||||
|
||||
|
@ -21,7 +21,7 @@
|
||||
/* SD/MMC */
|
||||
#define GPIO_NR_PALMZ72_SD_DETECT_N 14
|
||||
#define GPIO_NR_PALMZ72_SD_POWER_N 98
|
||||
#define GPIO_NR_PALMZ72_SD_RO 115
|
||||
#define GPIO_NR_PALMZ72_SD_RO 115
|
||||
|
||||
/* Touchscreen */
|
||||
#define GPIO_NR_PALMZ72_WM9712_IRQ 27
|
||||
@ -31,8 +31,7 @@
|
||||
|
||||
/* USB */
|
||||
#define GPIO_NR_PALMZ72_USB_DETECT_N 15
|
||||
#define GPIO_NR_PALMZ72_USB_POWER 95
|
||||
#define GPIO_NR_PALMZ72_USB_PULLUP 12
|
||||
#define GPIO_NR_PALMZ72_USB_PULLUP 95
|
||||
|
||||
/* LCD/Backlight */
|
||||
#define GPIO_NR_PALMZ72_BL_POWER 20
|
||||
|
49
arch/arm/mach-pxa/include/mach/treo680.h
Normal file
49
arch/arm/mach-pxa/include/mach/treo680.h
Normal file
@ -0,0 +1,49 @@
|
||||
/*
|
||||
* GPIOs and interrupts for Palm Treo 680 smartphone
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _INCLUDE_TREO680_H_
|
||||
#define _INCLUDE_TREO680_H_
|
||||
|
||||
/* GPIOs */
|
||||
#define GPIO_NR_TREO680_POWER_DETECT 0
|
||||
#define GPIO_NR_TREO680_AMP_EN 27
|
||||
#define GPIO_NR_TREO680_KEYB_BL 24
|
||||
#define GPIO_NR_TREO680_VIBRATE_EN 44
|
||||
#define GPIO_NR_TREO680_GREEN_LED 20
|
||||
#define GPIO_NR_TREO680_RED_LED 79
|
||||
#define GPIO_NR_TREO680_SD_DETECT_N 113
|
||||
#define GPIO_NR_TREO680_SD_READONLY 33
|
||||
#define GPIO_NR_TREO680_EP_DETECT_N 116
|
||||
#define GPIO_NR_TREO680_SD_POWER 42
|
||||
#define GPIO_NR_TREO680_USB_DETECT 1
|
||||
#define GPIO_NR_TREO680_USB_PULLUP 114
|
||||
#define GPIO_NR_TREO680_GSM_POWER 40
|
||||
#define GPIO_NR_TREO680_GSM_RESET 87
|
||||
#define GPIO_NR_TREO680_GSM_WAKE 57
|
||||
#define GPIO_NR_TREO680_GSM_HOST_WAKE 14
|
||||
#define GPIO_NR_TREO680_GSM_TRIGGER 10
|
||||
#define GPIO_NR_TREO680_BT_EN 43
|
||||
#define GPIO_NR_TREO680_IR_EN 115
|
||||
#define GPIO_NR_TREO680_IR_TXD 47
|
||||
#define GPIO_NR_TREO680_BL_POWER 38
|
||||
#define GPIO_NR_TREO680_LCD_POWER 25
|
||||
|
||||
/* Various addresses */
|
||||
#define TREO680_PHYS_RAM_START 0xa0000000
|
||||
#define TREO680_PHYS_IO_START 0x40000000
|
||||
#define TREO680_STR_BASE 0xa2000000
|
||||
|
||||
/* BACKLIGHT */
|
||||
#define TREO680_MAX_INTENSITY 254
|
||||
#define TREO680_DEFAULT_INTENSITY 160
|
||||
#define TREO680_LIMIT_MASK 0x7F
|
||||
#define TREO680_PRESCALER 63
|
||||
#define TREO680_PERIOD_NS 3500
|
||||
|
||||
#endif
|
@ -37,6 +37,7 @@
|
||||
#include <linux/wm97xx_batt.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/usb/gpio_vbus.h>
|
||||
#include <linux/regulator/max1586.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
@ -716,6 +717,38 @@ static struct wm97xx_batt_info mioa701_battery_data = {
|
||||
.batt_name = "mioa701_battery",
|
||||
};
|
||||
|
||||
/*
|
||||
* Voltage regulation
|
||||
*/
|
||||
static struct regulator_consumer_supply max1586_consumers[] = {
|
||||
{
|
||||
.supply = "vcc_core",
|
||||
}
|
||||
};
|
||||
|
||||
static struct regulator_init_data max1586_v3_info = {
|
||||
.constraints = {
|
||||
.name = "vcc_core range",
|
||||
.min_uV = 1000000,
|
||||
.max_uV = 1705000,
|
||||
.always_on = 1,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(max1586_consumers),
|
||||
.consumer_supplies = max1586_consumers,
|
||||
};
|
||||
|
||||
static struct max1586_subdev_data max1586_subdevs[] = {
|
||||
{ .name = "vcc_core", .id = MAX1586_V3,
|
||||
.platform_data = &max1586_v3_info },
|
||||
};
|
||||
|
||||
static struct max1586_platform_data max1586_info = {
|
||||
.subdevs = max1586_subdevs,
|
||||
.num_subdevs = ARRAY_SIZE(max1586_subdevs),
|
||||
.v3_gain = MAX1586_GAIN_NO_R24, /* 700..1475 mV */
|
||||
};
|
||||
|
||||
/*
|
||||
* Camera interface
|
||||
*/
|
||||
@ -725,6 +758,13 @@ struct pxacamera_platform_data mioa701_pxacamera_platform_data = {
|
||||
.mclk_10khz = 5000,
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata mioa701_pi2c_devices[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("max1586", 0x14),
|
||||
.platform_data = &max1586_info,
|
||||
},
|
||||
};
|
||||
|
||||
static struct soc_camera_link iclink = {
|
||||
.bus_id = 0, /* Must match id in pxa27x_device_camera in device.c */
|
||||
};
|
||||
@ -825,7 +865,9 @@ static void __init mioa701_machine_init(void)
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
gsm_init();
|
||||
|
||||
i2c_register_board_info(1, ARRAY_AND_SIZE(mioa701_pi2c_devices));
|
||||
pxa_set_i2c_info(&i2c_pdata);
|
||||
pxa27x_set_i2c_power_info(NULL);
|
||||
pxa_set_camera_info(&mioa701_pxacamera_platform_data);
|
||||
i2c_register_board_info(0, ARRAY_AND_SIZE(mioa701_i2c_devices));
|
||||
}
|
||||
|
@ -27,7 +27,9 @@
|
||||
#include <linux/pda_power.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/wm97xx_batt.h>
|
||||
#include <linux/power_supply.h>
|
||||
#include <linux/usb/gpio_vbus.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
@ -41,6 +43,8 @@
|
||||
#include <mach/irda.h>
|
||||
#include <mach/pxa27x_keypad.h>
|
||||
#include <mach/udc.h>
|
||||
#include <mach/palmasoc.h>
|
||||
|
||||
#include <mach/pm.h>
|
||||
|
||||
#include "generic.h"
|
||||
@ -66,6 +70,8 @@ static unsigned long palmz72_pin_config[] __initdata = {
|
||||
GPIO29_AC97_SDATA_IN_0,
|
||||
GPIO30_AC97_SDATA_OUT,
|
||||
GPIO31_AC97_SYNC,
|
||||
GPIO89_AC97_SYSCLK,
|
||||
GPIO113_AC97_nRESET,
|
||||
|
||||
/* IrDA */
|
||||
GPIO49_GPIO, /* ir disable */
|
||||
@ -77,8 +83,7 @@ static unsigned long palmz72_pin_config[] __initdata = {
|
||||
|
||||
/* USB */
|
||||
GPIO15_GPIO, /* usb detect */
|
||||
GPIO12_GPIO, /* usb pullup */
|
||||
GPIO95_GPIO, /* usb power */
|
||||
GPIO95_GPIO, /* usb pullup */
|
||||
|
||||
/* Matrix keypad */
|
||||
GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
|
||||
@ -354,6 +359,22 @@ static struct platform_device palmz72_leds = {
|
||||
}
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* UDC
|
||||
******************************************************************************/
|
||||
static struct gpio_vbus_mach_info palmz72_udc_info = {
|
||||
.gpio_vbus = GPIO_NR_PALMZ72_USB_DETECT_N,
|
||||
.gpio_pullup = GPIO_NR_PALMZ72_USB_PULLUP,
|
||||
};
|
||||
|
||||
static struct platform_device palmz72_gpio_vbus = {
|
||||
.name = "gpio-vbus",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &palmz72_udc_info,
|
||||
},
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Power supply
|
||||
******************************************************************************/
|
||||
@ -421,6 +442,31 @@ static struct platform_device power_supply = {
|
||||
},
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* WM97xx battery
|
||||
******************************************************************************/
|
||||
static struct wm97xx_batt_info wm97xx_batt_pdata = {
|
||||
.batt_aux = WM97XX_AUX_ID3,
|
||||
.temp_aux = WM97XX_AUX_ID2,
|
||||
.charge_gpio = -1,
|
||||
.max_voltage = PALMZ72_BAT_MAX_VOLTAGE,
|
||||
.min_voltage = PALMZ72_BAT_MIN_VOLTAGE,
|
||||
.batt_mult = 1000,
|
||||
.batt_div = 414,
|
||||
.temp_mult = 1,
|
||||
.temp_div = 1,
|
||||
.batt_tech = POWER_SUPPLY_TECHNOLOGY_LIPO,
|
||||
.batt_name = "main-batt",
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* aSoC audio
|
||||
******************************************************************************/
|
||||
static struct platform_device palmz72_asoc = {
|
||||
.name = "palm27x-asoc",
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Framebuffer
|
||||
******************************************************************************/
|
||||
@ -527,17 +573,32 @@ device_initcall(palmz72_pm_init);
|
||||
static struct platform_device *devices[] __initdata = {
|
||||
&palmz72_backlight,
|
||||
&palmz72_leds,
|
||||
&palmz72_asoc,
|
||||
&power_supply,
|
||||
&palmz72_gpio_vbus,
|
||||
};
|
||||
|
||||
/* setup udc GPIOs initial state */
|
||||
static void __init palmz72_udc_init(void)
|
||||
{
|
||||
if (!gpio_request(GPIO_NR_PALMZ72_USB_PULLUP, "USB Pullup")) {
|
||||
gpio_direction_output(GPIO_NR_PALMZ72_USB_PULLUP, 0);
|
||||
gpio_free(GPIO_NR_PALMZ72_USB_PULLUP);
|
||||
}
|
||||
}
|
||||
|
||||
static void __init palmz72_init(void)
|
||||
{
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(palmz72_pin_config));
|
||||
|
||||
set_pxa_fb_info(&palmz72_lcd_screen);
|
||||
pxa_set_mci_info(&palmz72_mci_platform_data);
|
||||
palmz72_udc_init();
|
||||
pxa_set_ac97_info(NULL);
|
||||
pxa_set_ficp_info(&palmz72_ficp_platform_data);
|
||||
pxa_set_keypad_info(&palmz72_keypad_platform_data);
|
||||
wm97xx_bat_set_pdata(&wm97xx_batt_pdata);
|
||||
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
}
|
||||
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/ads7846.h>
|
||||
#include <linux/mtd/sharpsl.h>
|
||||
@ -486,6 +487,10 @@ static struct platform_device *devices[] __initdata = {
|
||||
&sharpsl_rom_device,
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata poodle_i2c_devices[] = {
|
||||
{ I2C_BOARD_INFO("wm8731", 0x1b) },
|
||||
};
|
||||
|
||||
static void poodle_poweroff(void)
|
||||
{
|
||||
arm_machine_restart('h', NULL);
|
||||
@ -519,6 +524,7 @@ static void __init poodle_init(void)
|
||||
pxa_set_mci_info(&poodle_mci_platform_data);
|
||||
pxa_set_ficp_info(&poodle_ficp_platform_data);
|
||||
pxa_set_i2c_info(NULL);
|
||||
i2c_register_board_info(0, ARRAY_AND_SIZE(poodle_i2c_devices));
|
||||
poodle_init_spi();
|
||||
}
|
||||
|
||||
|
612
arch/arm/mach-pxa/treo680.c
Normal file
612
arch/arm/mach-pxa/treo680.c
Normal file
@ -0,0 +1,612 @@
|
||||
/*
|
||||
* Hardware definitions for Palm Treo 680
|
||||
*
|
||||
* Author: Tomas Cech <sleep_walker@suse.cz>
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* (find more info at www.hackndev.com)
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/pda_power.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/wm97xx_batt.h>
|
||||
#include <linux/power_supply.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/w1-gpio.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <mach/pxa27x.h>
|
||||
#include <mach/pxa27x-udc.h>
|
||||
#include <mach/audio.h>
|
||||
#include <mach/treo680.h>
|
||||
#include <mach/mmc.h>
|
||||
#include <mach/pxafb.h>
|
||||
#include <mach/irda.h>
|
||||
#include <mach/pxa27x_keypad.h>
|
||||
#include <mach/udc.h>
|
||||
#include <mach/ohci.h>
|
||||
#include <mach/pxa2xx-regs.h>
|
||||
#include <mach/palmasoc.h>
|
||||
#include <mach/camera.h>
|
||||
|
||||
#include <sound/pxa2xx-lib.h>
|
||||
|
||||
#include "generic.h"
|
||||
#include "devices.h"
|
||||
|
||||
/******************************************************************************
|
||||
* Pin configuration
|
||||
******************************************************************************/
|
||||
static unsigned long treo680_pin_config[] __initdata = {
|
||||
/* MMC */
|
||||
GPIO32_MMC_CLK,
|
||||
GPIO92_MMC_DAT_0,
|
||||
GPIO109_MMC_DAT_1,
|
||||
GPIO110_MMC_DAT_2,
|
||||
GPIO111_MMC_DAT_3,
|
||||
GPIO112_MMC_CMD,
|
||||
GPIO33_GPIO, /* SD read only */
|
||||
GPIO113_GPIO, /* SD detect */
|
||||
|
||||
/* AC97 */
|
||||
GPIO28_AC97_BITCLK,
|
||||
GPIO29_AC97_SDATA_IN_0,
|
||||
GPIO30_AC97_SDATA_OUT,
|
||||
GPIO31_AC97_SYNC,
|
||||
GPIO89_AC97_SYSCLK,
|
||||
GPIO95_AC97_nRESET,
|
||||
|
||||
/* IrDA */
|
||||
GPIO46_FICP_RXD,
|
||||
GPIO47_FICP_TXD,
|
||||
|
||||
/* PWM */
|
||||
GPIO16_PWM0_OUT,
|
||||
|
||||
/* USB */
|
||||
GPIO1_GPIO | WAKEUP_ON_EDGE_BOTH, /* usb detect */
|
||||
|
||||
/* MATRIX KEYPAD */
|
||||
GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
|
||||
GPIO101_KP_MKIN_1,
|
||||
GPIO102_KP_MKIN_2,
|
||||
GPIO97_KP_MKIN_3,
|
||||
GPIO98_KP_MKIN_4,
|
||||
GPIO99_KP_MKIN_5,
|
||||
GPIO91_KP_MKIN_6,
|
||||
GPIO13_KP_MKIN_7,
|
||||
GPIO103_KP_MKOUT_0 | MFP_LPM_DRIVE_HIGH,
|
||||
GPIO104_KP_MKOUT_1,
|
||||
GPIO105_KP_MKOUT_2,
|
||||
GPIO106_KP_MKOUT_3,
|
||||
GPIO107_KP_MKOUT_4,
|
||||
GPIO108_KP_MKOUT_5,
|
||||
GPIO96_KP_MKOUT_6,
|
||||
GPIO93_KP_DKIN_0 | WAKEUP_ON_LEVEL_HIGH, /* Hotsync button */
|
||||
|
||||
/* LCD */
|
||||
GPIO58_LCD_LDD_0,
|
||||
GPIO59_LCD_LDD_1,
|
||||
GPIO60_LCD_LDD_2,
|
||||
GPIO61_LCD_LDD_3,
|
||||
GPIO62_LCD_LDD_4,
|
||||
GPIO63_LCD_LDD_5,
|
||||
GPIO64_LCD_LDD_6,
|
||||
GPIO65_LCD_LDD_7,
|
||||
GPIO66_LCD_LDD_8,
|
||||
GPIO67_LCD_LDD_9,
|
||||
GPIO68_LCD_LDD_10,
|
||||
GPIO69_LCD_LDD_11,
|
||||
GPIO70_LCD_LDD_12,
|
||||
GPIO71_LCD_LDD_13,
|
||||
GPIO72_LCD_LDD_14,
|
||||
GPIO73_LCD_LDD_15,
|
||||
GPIO74_LCD_FCLK,
|
||||
GPIO75_LCD_LCLK,
|
||||
GPIO76_LCD_PCLK,
|
||||
|
||||
/* Quick Capture Interface */
|
||||
GPIO84_CIF_FV,
|
||||
GPIO85_CIF_LV,
|
||||
GPIO53_CIF_MCLK,
|
||||
GPIO54_CIF_PCLK,
|
||||
GPIO81_CIF_DD_0,
|
||||
GPIO55_CIF_DD_1,
|
||||
GPIO51_CIF_DD_2,
|
||||
GPIO50_CIF_DD_3,
|
||||
GPIO52_CIF_DD_4,
|
||||
GPIO48_CIF_DD_5,
|
||||
GPIO17_CIF_DD_6,
|
||||
GPIO12_CIF_DD_7,
|
||||
|
||||
/* I2C */
|
||||
GPIO117_I2C_SCL,
|
||||
GPIO118_I2C_SDA,
|
||||
|
||||
/* GSM */
|
||||
GPIO14_GPIO | WAKEUP_ON_EDGE_BOTH, /* GSM host wake up */
|
||||
GPIO34_FFUART_RXD,
|
||||
GPIO35_FFUART_CTS,
|
||||
GPIO39_FFUART_TXD,
|
||||
GPIO41_FFUART_RTS,
|
||||
|
||||
/* MISC. */
|
||||
GPIO0_GPIO | WAKEUP_ON_EDGE_BOTH, /* external power detect */
|
||||
GPIO15_GPIO | WAKEUP_ON_EDGE_BOTH, /* silent switch */
|
||||
GPIO116_GPIO, /* headphone detect */
|
||||
GPIO11_GPIO | WAKEUP_ON_EDGE_BOTH, /* bluetooth host wake up */
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* SD/MMC card controller
|
||||
******************************************************************************/
|
||||
static int treo680_mci_init(struct device *dev,
|
||||
irq_handler_t treo680_detect_int, void *data)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
/* Setup an interrupt for detecting card insert/remove events */
|
||||
err = gpio_request(GPIO_NR_TREO680_SD_DETECT_N, "SD IRQ");
|
||||
|
||||
if (err)
|
||||
goto err;
|
||||
|
||||
err = gpio_direction_input(GPIO_NR_TREO680_SD_DETECT_N);
|
||||
if (err)
|
||||
goto err2;
|
||||
|
||||
err = request_irq(gpio_to_irq(GPIO_NR_TREO680_SD_DETECT_N),
|
||||
treo680_detect_int, IRQF_DISABLED | IRQF_SAMPLE_RANDOM |
|
||||
IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
|
||||
"SD/MMC card detect", data);
|
||||
|
||||
if (err) {
|
||||
dev_err(dev, "%s: cannot request SD/MMC card detect IRQ\n",
|
||||
__func__);
|
||||
goto err2;
|
||||
}
|
||||
|
||||
err = gpio_request(GPIO_NR_TREO680_SD_POWER, "SD_POWER");
|
||||
if (err)
|
||||
goto err3;
|
||||
|
||||
err = gpio_direction_output(GPIO_NR_TREO680_SD_POWER, 1);
|
||||
if (err)
|
||||
goto err4;
|
||||
|
||||
err = gpio_request(GPIO_NR_TREO680_SD_READONLY, "SD_READONLY");
|
||||
if (err)
|
||||
goto err4;
|
||||
|
||||
err = gpio_direction_input(GPIO_NR_TREO680_SD_READONLY);
|
||||
if (err)
|
||||
goto err5;
|
||||
|
||||
return 0;
|
||||
|
||||
err5:
|
||||
gpio_free(GPIO_NR_TREO680_SD_READONLY);
|
||||
err4:
|
||||
gpio_free(GPIO_NR_TREO680_SD_POWER);
|
||||
err3:
|
||||
free_irq(gpio_to_irq(GPIO_NR_TREO680_SD_DETECT_N), data);
|
||||
err2:
|
||||
gpio_free(GPIO_NR_TREO680_SD_DETECT_N);
|
||||
err:
|
||||
return err;
|
||||
}
|
||||
|
||||
static void treo680_mci_exit(struct device *dev, void *data)
|
||||
{
|
||||
gpio_free(GPIO_NR_TREO680_SD_READONLY);
|
||||
gpio_free(GPIO_NR_TREO680_SD_POWER);
|
||||
free_irq(gpio_to_irq(GPIO_NR_TREO680_SD_DETECT_N), data);
|
||||
gpio_free(GPIO_NR_TREO680_SD_DETECT_N);
|
||||
}
|
||||
|
||||
static void treo680_mci_power(struct device *dev, unsigned int vdd)
|
||||
{
|
||||
struct pxamci_platform_data *p_d = dev->platform_data;
|
||||
gpio_set_value(GPIO_NR_TREO680_SD_POWER, p_d->ocr_mask & (1 << vdd));
|
||||
}
|
||||
|
||||
static int treo680_mci_get_ro(struct device *dev)
|
||||
{
|
||||
return gpio_get_value(GPIO_NR_TREO680_SD_READONLY);
|
||||
}
|
||||
|
||||
static struct pxamci_platform_data treo680_mci_platform_data = {
|
||||
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||
.setpower = treo680_mci_power,
|
||||
.get_ro = treo680_mci_get_ro,
|
||||
.init = treo680_mci_init,
|
||||
.exit = treo680_mci_exit,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* GPIO keyboard
|
||||
******************************************************************************/
|
||||
static unsigned int treo680_matrix_keys[] = {
|
||||
KEY(0, 0, KEY_F8), /* Red/Off/Power */
|
||||
KEY(0, 1, KEY_LEFT),
|
||||
KEY(0, 2, KEY_LEFTCTRL), /* Alternate */
|
||||
KEY(0, 3, KEY_L),
|
||||
KEY(0, 4, KEY_A),
|
||||
KEY(0, 5, KEY_Q),
|
||||
KEY(0, 6, KEY_P),
|
||||
|
||||
KEY(1, 0, KEY_RIGHTCTRL), /* Menu */
|
||||
KEY(1, 1, KEY_RIGHT),
|
||||
KEY(1, 2, KEY_LEFTSHIFT), /* Left shift */
|
||||
KEY(1, 3, KEY_Z),
|
||||
KEY(1, 4, KEY_S),
|
||||
KEY(1, 5, KEY_W),
|
||||
|
||||
KEY(2, 0, KEY_F1), /* Phone */
|
||||
KEY(2, 1, KEY_UP),
|
||||
KEY(2, 2, KEY_0),
|
||||
KEY(2, 3, KEY_X),
|
||||
KEY(2, 4, KEY_D),
|
||||
KEY(2, 5, KEY_E),
|
||||
|
||||
KEY(3, 0, KEY_F10), /* Calendar */
|
||||
KEY(3, 1, KEY_DOWN),
|
||||
KEY(3, 2, KEY_SPACE),
|
||||
KEY(3, 3, KEY_C),
|
||||
KEY(3, 4, KEY_F),
|
||||
KEY(3, 5, KEY_R),
|
||||
|
||||
KEY(4, 0, KEY_F12), /* Mail */
|
||||
KEY(4, 1, KEY_KPENTER),
|
||||
KEY(4, 2, KEY_RIGHTALT), /* Alt */
|
||||
KEY(4, 3, KEY_V),
|
||||
KEY(4, 4, KEY_G),
|
||||
KEY(4, 5, KEY_T),
|
||||
|
||||
KEY(5, 0, KEY_F9), /* Home */
|
||||
KEY(5, 1, KEY_PAGEUP), /* Side up */
|
||||
KEY(5, 2, KEY_DOT),
|
||||
KEY(5, 3, KEY_B),
|
||||
KEY(5, 4, KEY_H),
|
||||
KEY(5, 5, KEY_Y),
|
||||
|
||||
KEY(6, 0, KEY_TAB), /* Side Activate */
|
||||
KEY(6, 1, KEY_PAGEDOWN), /* Side down */
|
||||
KEY(6, 2, KEY_ENTER),
|
||||
KEY(6, 3, KEY_N),
|
||||
KEY(6, 4, KEY_J),
|
||||
KEY(6, 5, KEY_U),
|
||||
|
||||
KEY(7, 0, KEY_F6), /* Green/Call */
|
||||
KEY(7, 1, KEY_O),
|
||||
KEY(7, 2, KEY_BACKSPACE),
|
||||
KEY(7, 3, KEY_M),
|
||||
KEY(7, 4, KEY_K),
|
||||
KEY(7, 5, KEY_I),
|
||||
};
|
||||
|
||||
static struct pxa27x_keypad_platform_data treo680_keypad_platform_data = {
|
||||
.matrix_key_rows = 8,
|
||||
.matrix_key_cols = 7,
|
||||
.matrix_key_map = treo680_matrix_keys,
|
||||
.matrix_key_map_size = ARRAY_SIZE(treo680_matrix_keys),
|
||||
.direct_key_map = { KEY_CONNECT },
|
||||
.direct_key_num = 1,
|
||||
|
||||
.debounce_interval = 30,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* aSoC audio
|
||||
******************************************************************************/
|
||||
|
||||
static pxa2xx_audio_ops_t treo680_ac97_pdata = {
|
||||
.reset_gpio = 95,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Backlight
|
||||
******************************************************************************/
|
||||
static int treo680_backlight_init(struct device *dev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = gpio_request(GPIO_NR_TREO680_BL_POWER, "BL POWER");
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = gpio_direction_output(GPIO_NR_TREO680_BL_POWER, 0);
|
||||
if (ret)
|
||||
goto err2;
|
||||
ret = gpio_request(GPIO_NR_TREO680_LCD_POWER, "LCD POWER");
|
||||
if (ret)
|
||||
goto err2;
|
||||
ret = gpio_direction_output(GPIO_NR_TREO680_LCD_POWER, 0);
|
||||
if (ret)
|
||||
goto err3;
|
||||
|
||||
return 0;
|
||||
err3:
|
||||
gpio_free(GPIO_NR_TREO680_LCD_POWER);
|
||||
err2:
|
||||
gpio_free(GPIO_NR_TREO680_BL_POWER);
|
||||
err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int treo680_backlight_notify(int brightness)
|
||||
{
|
||||
gpio_set_value(GPIO_NR_TREO680_BL_POWER, brightness);
|
||||
return TREO680_MAX_INTENSITY - brightness;
|
||||
};
|
||||
|
||||
static void treo680_backlight_exit(struct device *dev)
|
||||
{
|
||||
gpio_free(GPIO_NR_TREO680_BL_POWER);
|
||||
gpio_free(GPIO_NR_TREO680_LCD_POWER);
|
||||
}
|
||||
|
||||
static struct platform_pwm_backlight_data treo680_backlight_data = {
|
||||
.pwm_id = 0,
|
||||
.max_brightness = TREO680_MAX_INTENSITY,
|
||||
.dft_brightness = TREO680_DEFAULT_INTENSITY,
|
||||
.pwm_period_ns = TREO680_PERIOD_NS,
|
||||
.init = treo680_backlight_init,
|
||||
.notify = treo680_backlight_notify,
|
||||
.exit = treo680_backlight_exit,
|
||||
};
|
||||
|
||||
static struct platform_device treo680_backlight = {
|
||||
.name = "pwm-backlight",
|
||||
.dev = {
|
||||
.parent = &pxa27x_device_pwm0.dev,
|
||||
.platform_data = &treo680_backlight_data,
|
||||
},
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* IrDA
|
||||
******************************************************************************/
|
||||
static void treo680_transceiver_mode(struct device *dev, int mode)
|
||||
{
|
||||
gpio_set_value(GPIO_NR_TREO680_IR_EN, mode & IR_OFF);
|
||||
pxa2xx_transceiver_mode(dev, mode);
|
||||
}
|
||||
|
||||
static int treo680_irda_startup(struct device *dev)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = gpio_request(GPIO_NR_TREO680_IR_EN, "Ir port disable");
|
||||
if (err)
|
||||
goto err1;
|
||||
|
||||
err = gpio_direction_output(GPIO_NR_TREO680_IR_EN, 1);
|
||||
if (err)
|
||||
goto err2;
|
||||
|
||||
return 0;
|
||||
|
||||
err2:
|
||||
dev_err(dev, "treo680_irda: cannot change IR gpio direction\n");
|
||||
gpio_free(GPIO_NR_TREO680_IR_EN);
|
||||
err1:
|
||||
dev_err(dev, "treo680_irda: cannot allocate IR gpio\n");
|
||||
return err;
|
||||
}
|
||||
|
||||
static void treo680_irda_shutdown(struct device *dev)
|
||||
{
|
||||
gpio_free(GPIO_NR_TREO680_AMP_EN);
|
||||
}
|
||||
|
||||
static struct pxaficp_platform_data treo680_ficp_info = {
|
||||
.transceiver_cap = IR_FIRMODE | IR_SIRMODE | IR_OFF,
|
||||
.startup = treo680_irda_startup,
|
||||
.shutdown = treo680_irda_shutdown,
|
||||
.transceiver_mode = treo680_transceiver_mode,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* UDC
|
||||
******************************************************************************/
|
||||
static struct pxa2xx_udc_mach_info treo680_udc_info __initdata = {
|
||||
.gpio_vbus = GPIO_NR_TREO680_USB_DETECT,
|
||||
.gpio_vbus_inverted = 1,
|
||||
.gpio_pullup = GPIO_NR_TREO680_USB_PULLUP,
|
||||
};
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* USB host
|
||||
******************************************************************************/
|
||||
static struct pxaohci_platform_data treo680_ohci_info = {
|
||||
.port_mode = PMM_PERPORT_MODE,
|
||||
.flags = ENABLE_PORT1 | ENABLE_PORT3,
|
||||
.power_budget = 0,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Power supply
|
||||
******************************************************************************/
|
||||
static int power_supply_init(struct device *dev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = gpio_request(GPIO_NR_TREO680_POWER_DETECT, "CABLE_STATE_AC");
|
||||
if (ret)
|
||||
goto err1;
|
||||
ret = gpio_direction_input(GPIO_NR_TREO680_POWER_DETECT);
|
||||
if (ret)
|
||||
goto err2;
|
||||
|
||||
return 0;
|
||||
|
||||
err2:
|
||||
gpio_free(GPIO_NR_TREO680_POWER_DETECT);
|
||||
err1:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int treo680_is_ac_online(void)
|
||||
{
|
||||
return gpio_get_value(GPIO_NR_TREO680_POWER_DETECT);
|
||||
}
|
||||
|
||||
static void power_supply_exit(struct device *dev)
|
||||
{
|
||||
gpio_free(GPIO_NR_TREO680_POWER_DETECT);
|
||||
}
|
||||
|
||||
static char *treo680_supplicants[] = {
|
||||
"main-battery",
|
||||
};
|
||||
|
||||
static struct pda_power_pdata power_supply_info = {
|
||||
.init = power_supply_init,
|
||||
.is_ac_online = treo680_is_ac_online,
|
||||
.exit = power_supply_exit,
|
||||
.supplied_to = treo680_supplicants,
|
||||
.num_supplicants = ARRAY_SIZE(treo680_supplicants),
|
||||
};
|
||||
|
||||
static struct platform_device power_supply = {
|
||||
.name = "pda-power",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &power_supply_info,
|
||||
},
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Vibra and LEDs
|
||||
******************************************************************************/
|
||||
static struct gpio_led gpio_leds[] = {
|
||||
{
|
||||
.name = "treo680:vibra:vibra",
|
||||
.default_trigger = "none",
|
||||
.gpio = GPIO_NR_TREO680_VIBRATE_EN,
|
||||
},
|
||||
{
|
||||
.name = "treo680:green:led",
|
||||
.default_trigger = "mmc0",
|
||||
.gpio = GPIO_NR_TREO680_GREEN_LED,
|
||||
},
|
||||
{
|
||||
.name = "treo680:keybbl:keybbl",
|
||||
.default_trigger = "none",
|
||||
.gpio = GPIO_NR_TREO680_KEYB_BL,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data gpio_led_info = {
|
||||
.leds = gpio_leds,
|
||||
.num_leds = ARRAY_SIZE(gpio_leds),
|
||||
};
|
||||
|
||||
static struct platform_device treo680_leds = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &gpio_led_info,
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* Framebuffer
|
||||
******************************************************************************/
|
||||
/* TODO: add support for 324x324 */
|
||||
static struct pxafb_mode_info treo680_lcd_modes[] = {
|
||||
{
|
||||
.pixclock = 86538,
|
||||
.xres = 320,
|
||||
.yres = 320,
|
||||
.bpp = 16,
|
||||
|
||||
.left_margin = 20,
|
||||
.right_margin = 8,
|
||||
.upper_margin = 8,
|
||||
.lower_margin = 5,
|
||||
|
||||
.hsync_len = 4,
|
||||
.vsync_len = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct pxafb_mach_info treo680_lcd_screen = {
|
||||
.modes = treo680_lcd_modes,
|
||||
.num_modes = ARRAY_SIZE(treo680_lcd_modes),
|
||||
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Power management - standby
|
||||
******************************************************************************/
|
||||
static void __init treo680_pm_init(void)
|
||||
{
|
||||
static u32 resume[] = {
|
||||
0xe3a00101, /* mov r0, #0x40000000 */
|
||||
0xe380060f, /* orr r0, r0, #0x00f00000 */
|
||||
0xe590f008, /* ldr pc, [r0, #0x08] */
|
||||
};
|
||||
|
||||
/* this is where the bootloader jumps */
|
||||
memcpy(phys_to_virt(TREO680_STR_BASE), resume, sizeof(resume));
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Machine init
|
||||
******************************************************************************/
|
||||
static struct platform_device *devices[] __initdata = {
|
||||
&treo680_backlight,
|
||||
&treo680_leds,
|
||||
&power_supply,
|
||||
};
|
||||
|
||||
/* setup udc GPIOs initial state */
|
||||
static void __init treo680_udc_init(void)
|
||||
{
|
||||
if (!gpio_request(GPIO_NR_TREO680_USB_PULLUP, "UDC Vbus")) {
|
||||
gpio_direction_output(GPIO_NR_TREO680_USB_PULLUP, 1);
|
||||
gpio_free(GPIO_NR_TREO680_USB_PULLUP);
|
||||
}
|
||||
}
|
||||
|
||||
static void __init treo680_init(void)
|
||||
{
|
||||
treo680_pm_init();
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(treo680_pin_config));
|
||||
pxa_set_keypad_info(&treo680_keypad_platform_data);
|
||||
set_pxa_fb_info(&treo680_lcd_screen);
|
||||
pxa_set_mci_info(&treo680_mci_platform_data);
|
||||
treo680_udc_init();
|
||||
pxa_set_udc_info(&treo680_udc_info);
|
||||
pxa_set_ac97_info(&treo680_ac97_pdata);
|
||||
pxa_set_ficp_info(&treo680_ficp_info);
|
||||
pxa_set_ohci_info(&treo680_ohci_info);
|
||||
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
}
|
||||
|
||||
MACHINE_START(TREO680, "Palm Treo 680")
|
||||
.phys_io = TREO680_PHYS_IO_START,
|
||||
.io_pg_offst = io_p2v(0x40000000),
|
||||
.boot_params = 0xa0000100,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa27x_init_irq,
|
||||
.timer = &pxa_timer,
|
||||
.init_machine = treo680_init,
|
||||
MACHINE_END
|
@ -27,6 +27,7 @@
|
||||
#include <asm/irq.h>
|
||||
#include <asm/leds.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/smp_twd.h>
|
||||
#include <asm/hardware/gic.h>
|
||||
#include <asm/hardware/cache-l2x0.h>
|
||||
|
||||
|
@ -22,7 +22,6 @@
|
||||
#include <linux/timer.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
|
@ -84,5 +84,15 @@ config MACH_AT2440EVB
|
||||
help
|
||||
Say Y here if you are using the AT2440EVB development board
|
||||
|
||||
config MACH_MINI2440
|
||||
bool "MINI2440 development board"
|
||||
select CPU_S3C2440
|
||||
select EEPROM_AT24
|
||||
select LEDS_TRIGGER_BACKLIGHT
|
||||
select SND_S3C24XX_SOC_S3C24XX_UDA134X
|
||||
help
|
||||
Say Y here to select support for the MINI2440. Is a 10cm x 10cm board
|
||||
available via various sources. It can come with a 3.5" or 7" touch LCD.
|
||||
|
||||
endmenu
|
||||
|
||||
|
@ -22,3 +22,4 @@ obj-$(CONFIG_MACH_RX3715) += mach-rx3715.o
|
||||
obj-$(CONFIG_ARCH_S3C2440) += mach-smdk2440.o
|
||||
obj-$(CONFIG_MACH_NEXCODER_2440) += mach-nexcoder.o
|
||||
obj-$(CONFIG_MACH_AT2440EVB) += mach-at2440evb.o
|
||||
obj-$(CONFIG_MACH_MINI2440) += mach-mini2440.o
|
||||
|
703
arch/arm/mach-s3c2440/mach-mini2440.c
Normal file
703
arch/arm/mach-s3c2440/mach-mini2440.c
Normal file
@ -0,0 +1,703 @@
|
||||
/* linux/arch/arm/mach-s3c2440/mach-mini2440.c
|
||||
*
|
||||
* Copyright (c) 2008 Ramax Lo <ramaxlo@gmail.com>
|
||||
* Based on mach-anubis.c by Ben Dooks <ben@simtec.co.uk>
|
||||
* and modifications by SBZ <sbz@spgui.org> and
|
||||
* Weibing <http://weibing.blogbus.com> and
|
||||
* Michel Pollet <buserror@gmail.com>
|
||||
*
|
||||
* For product information, visit http://code.google.com/p/mini2440/
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/dm9000.h>
|
||||
#include <linux/i2c/at24.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/mmc/host.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/fb.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include <plat/regs-serial.h>
|
||||
#include <mach/regs-gpio.h>
|
||||
#include <mach/leds-gpio.h>
|
||||
#include <mach/regs-mem.h>
|
||||
#include <mach/regs-lcd.h>
|
||||
#include <mach/irqs.h>
|
||||
#include <plat/nand.h>
|
||||
#include <plat/iic.h>
|
||||
#include <plat/mci.h>
|
||||
#include <plat/udc.h>
|
||||
|
||||
#include <plat/regs-serial.h>
|
||||
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/nand.h>
|
||||
#include <linux/mtd/nand_ecc.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
||||
#include <plat/clock.h>
|
||||
#include <plat/devs.h>
|
||||
#include <plat/cpu.h>
|
||||
|
||||
#include <sound/s3c24xx_uda134x.h>
|
||||
|
||||
#define MACH_MINI2440_DM9K_BASE (S3C2410_CS4 + 0x300)
|
||||
|
||||
static struct map_desc mini2440_iodesc[] __initdata = {
|
||||
/* nothing to declare, move along */
|
||||
};
|
||||
|
||||
#define UCON S3C2410_UCON_DEFAULT
|
||||
#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
|
||||
#define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE
|
||||
|
||||
|
||||
static struct s3c2410_uartcfg mini2440_uartcfgs[] __initdata = {
|
||||
[0] = {
|
||||
.hwport = 0,
|
||||
.flags = 0,
|
||||
.ucon = UCON,
|
||||
.ulcon = ULCON,
|
||||
.ufcon = UFCON,
|
||||
},
|
||||
[1] = {
|
||||
.hwport = 1,
|
||||
.flags = 0,
|
||||
.ucon = UCON,
|
||||
.ulcon = ULCON,
|
||||
.ufcon = UFCON,
|
||||
},
|
||||
[2] = {
|
||||
.hwport = 2,
|
||||
.flags = 0,
|
||||
.ucon = UCON,
|
||||
.ulcon = ULCON,
|
||||
.ufcon = UFCON,
|
||||
},
|
||||
};
|
||||
|
||||
/* USB device UDC support */
|
||||
|
||||
static void mini2440_udc_pullup(enum s3c2410_udc_cmd_e cmd)
|
||||
{
|
||||
pr_debug("udc: pullup(%d)\n", cmd);
|
||||
|
||||
switch (cmd) {
|
||||
case S3C2410_UDC_P_ENABLE :
|
||||
s3c2410_gpio_setpin(S3C2410_GPC(5), 1);
|
||||
break;
|
||||
case S3C2410_UDC_P_DISABLE :
|
||||
s3c2410_gpio_setpin(S3C2410_GPC(5), 0);
|
||||
break;
|
||||
case S3C2410_UDC_P_RESET :
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static struct s3c2410_udc_mach_info mini2440_udc_cfg __initdata = {
|
||||
.udc_command = mini2440_udc_pullup,
|
||||
};
|
||||
|
||||
|
||||
/* LCD timing and setup */
|
||||
|
||||
/*
|
||||
* This macro simplifies the table bellow
|
||||
*/
|
||||
#define _LCD_DECLARE(_clock,_xres,margin_left,margin_right,hsync, \
|
||||
_yres,margin_top,margin_bottom,vsync, refresh) \
|
||||
.width = _xres, \
|
||||
.xres = _xres, \
|
||||
.height = _yres, \
|
||||
.yres = _yres, \
|
||||
.left_margin = margin_left, \
|
||||
.right_margin = margin_right, \
|
||||
.upper_margin = margin_top, \
|
||||
.lower_margin = margin_bottom, \
|
||||
.hsync_len = hsync, \
|
||||
.vsync_len = vsync, \
|
||||
.pixclock = ((_clock*100000000000LL) / \
|
||||
((refresh) * \
|
||||
(hsync + margin_left + _xres + margin_right) * \
|
||||
(vsync + margin_top + _yres + margin_bottom))), \
|
||||
.bpp = 16,\
|
||||
.type = (S3C2410_LCDCON1_TFT16BPP |\
|
||||
S3C2410_LCDCON1_TFT)
|
||||
|
||||
struct s3c2410fb_display mini2440_lcd_cfg[] __initdata = {
|
||||
[0] = { /* mini2440 + 3.5" TFT + touchscreen */
|
||||
_LCD_DECLARE(
|
||||
7, /* The 3.5 is quite fast */
|
||||
240, 21, 38, 6, /* x timing */
|
||||
320, 4, 4, 2, /* y timing */
|
||||
60), /* refresh rate */
|
||||
.lcdcon5 = (S3C2410_LCDCON5_FRM565 |
|
||||
S3C2410_LCDCON5_INVVLINE |
|
||||
S3C2410_LCDCON5_INVVFRAME |
|
||||
S3C2410_LCDCON5_INVVDEN |
|
||||
S3C2410_LCDCON5_PWREN),
|
||||
},
|
||||
[1] = { /* mini2440 + 7" TFT + touchscreen */
|
||||
_LCD_DECLARE(
|
||||
10, /* the 7" runs slower */
|
||||
800, 40, 40, 48, /* x timing */
|
||||
480, 29, 3, 3, /* y timing */
|
||||
50), /* refresh rate */
|
||||
.lcdcon5 = (S3C2410_LCDCON5_FRM565 |
|
||||
S3C2410_LCDCON5_INVVLINE |
|
||||
S3C2410_LCDCON5_INVVFRAME |
|
||||
S3C2410_LCDCON5_PWREN),
|
||||
},
|
||||
/* The VGA shield can outout at several resolutions. All share
|
||||
* the same timings, however, anything smaller than 1024x768
|
||||
* will only be displayed in the top left corner of a 1024x768
|
||||
* XGA output unless you add optional dip switches to the shield.
|
||||
* Therefore timings for other resolutions have been ommited here.
|
||||
*/
|
||||
[2] = {
|
||||
_LCD_DECLARE(
|
||||
10,
|
||||
1024, 1, 2, 2, /* y timing */
|
||||
768, 200, 16, 16, /* x timing */
|
||||
24), /* refresh rate, maximum stable,
|
||||
tested with the FPGA shield */
|
||||
.lcdcon5 = (S3C2410_LCDCON5_FRM565 |
|
||||
S3C2410_LCDCON5_HWSWP),
|
||||
},
|
||||
};
|
||||
|
||||
/* todo - put into gpio header */
|
||||
|
||||
#define S3C2410_GPCCON_MASK(x) (3 << ((x) * 2))
|
||||
#define S3C2410_GPDCON_MASK(x) (3 << ((x) * 2))
|
||||
|
||||
struct s3c2410fb_mach_info mini2440_fb_info __initdata = {
|
||||
.displays = &mini2440_lcd_cfg[0], /* not constant! see init */
|
||||
.num_displays = 1,
|
||||
.default_display = 0,
|
||||
|
||||
/* Enable VD[2..7], VD[10..15], VD[18..23] and VCLK, syncs, VDEN
|
||||
* and disable the pull down resistors on pins we are using for LCD
|
||||
* data. */
|
||||
|
||||
.gpcup = (0xf << 1) | (0x3f << 10),
|
||||
|
||||
.gpccon = (S3C2410_GPC1_VCLK | S3C2410_GPC2_VLINE |
|
||||
S3C2410_GPC3_VFRAME | S3C2410_GPC4_VM |
|
||||
S3C2410_GPC10_VD2 | S3C2410_GPC11_VD3 |
|
||||
S3C2410_GPC12_VD4 | S3C2410_GPC13_VD5 |
|
||||
S3C2410_GPC14_VD6 | S3C2410_GPC15_VD7),
|
||||
|
||||
.gpccon_mask = (S3C2410_GPCCON_MASK(1) | S3C2410_GPCCON_MASK(2) |
|
||||
S3C2410_GPCCON_MASK(3) | S3C2410_GPCCON_MASK(4) |
|
||||
S3C2410_GPCCON_MASK(10) | S3C2410_GPCCON_MASK(11) |
|
||||
S3C2410_GPCCON_MASK(12) | S3C2410_GPCCON_MASK(13) |
|
||||
S3C2410_GPCCON_MASK(14) | S3C2410_GPCCON_MASK(15)),
|
||||
|
||||
.gpdup = (0x3f << 2) | (0x3f << 10),
|
||||
|
||||
.gpdcon = (S3C2410_GPD2_VD10 | S3C2410_GPD3_VD11 |
|
||||
S3C2410_GPD4_VD12 | S3C2410_GPD5_VD13 |
|
||||
S3C2410_GPD6_VD14 | S3C2410_GPD7_VD15 |
|
||||
S3C2410_GPD10_VD18 | S3C2410_GPD11_VD19 |
|
||||
S3C2410_GPD12_VD20 | S3C2410_GPD13_VD21 |
|
||||
S3C2410_GPD14_VD22 | S3C2410_GPD15_VD23),
|
||||
|
||||
.gpdcon_mask = (S3C2410_GPDCON_MASK(2) | S3C2410_GPDCON_MASK(3) |
|
||||
S3C2410_GPDCON_MASK(4) | S3C2410_GPDCON_MASK(5) |
|
||||
S3C2410_GPDCON_MASK(6) | S3C2410_GPDCON_MASK(7) |
|
||||
S3C2410_GPDCON_MASK(10) | S3C2410_GPDCON_MASK(11)|
|
||||
S3C2410_GPDCON_MASK(12) | S3C2410_GPDCON_MASK(13)|
|
||||
S3C2410_GPDCON_MASK(14) | S3C2410_GPDCON_MASK(15)),
|
||||
};
|
||||
|
||||
/* MMC/SD */
|
||||
|
||||
static struct s3c24xx_mci_pdata mini2440_mmc_cfg __initdata = {
|
||||
.gpio_detect = S3C2410_GPG(8),
|
||||
.gpio_wprotect = S3C2410_GPH(8),
|
||||
.set_power = NULL,
|
||||
.ocr_avail = MMC_VDD_32_33|MMC_VDD_33_34,
|
||||
};
|
||||
|
||||
/* NAND Flash on MINI2440 board */
|
||||
|
||||
static struct mtd_partition mini2440_default_nand_part[] __initdata = {
|
||||
[0] = {
|
||||
.name = "u-boot",
|
||||
.size = SZ_256K,
|
||||
.offset = 0,
|
||||
},
|
||||
[1] = {
|
||||
.name = "u-boot-env",
|
||||
.size = SZ_128K,
|
||||
.offset = SZ_256K,
|
||||
},
|
||||
[2] = {
|
||||
.name = "kernel",
|
||||
/* 5 megabytes, for a kernel with no modules
|
||||
* or a uImage with a ramdisk attached */
|
||||
.size = 0x00500000,
|
||||
.offset = SZ_256K + SZ_128K,
|
||||
},
|
||||
[3] = {
|
||||
.name = "root",
|
||||
.offset = SZ_256K + SZ_128K + 0x00500000,
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
},
|
||||
};
|
||||
|
||||
static struct s3c2410_nand_set mini2440_nand_sets[] __initdata = {
|
||||
[0] = {
|
||||
.name = "nand",
|
||||
.nr_chips = 1,
|
||||
.nr_partitions = ARRAY_SIZE(mini2440_default_nand_part),
|
||||
.partitions = mini2440_default_nand_part,
|
||||
},
|
||||
};
|
||||
|
||||
static struct s3c2410_platform_nand mini2440_nand_info __initdata = {
|
||||
.tacls = 0,
|
||||
.twrph0 = 25,
|
||||
.twrph1 = 15,
|
||||
.nr_sets = ARRAY_SIZE(mini2440_nand_sets),
|
||||
.sets = mini2440_nand_sets,
|
||||
.ignore_unset_ecc = 1,
|
||||
};
|
||||
|
||||
/* DM9000AEP 10/100 ethernet controller */
|
||||
|
||||
static struct resource mini2440_dm9k_resource[] __initdata = {
|
||||
[0] = {
|
||||
.start = MACH_MINI2440_DM9K_BASE,
|
||||
.end = MACH_MINI2440_DM9K_BASE + 3,
|
||||
.flags = IORESOURCE_MEM
|
||||
},
|
||||
[1] = {
|
||||
.start = MACH_MINI2440_DM9K_BASE + 4,
|
||||
.end = MACH_MINI2440_DM9K_BASE + 7,
|
||||
.flags = IORESOURCE_MEM
|
||||
},
|
||||
[2] = {
|
||||
.start = IRQ_EINT7,
|
||||
.end = IRQ_EINT7,
|
||||
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
* The DM9000 has no eeprom, and it's MAC address is set by
|
||||
* the bootloader before starting the kernel.
|
||||
*/
|
||||
static struct dm9000_plat_data mini2440_dm9k_pdata __initdata = {
|
||||
.flags = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),
|
||||
};
|
||||
|
||||
static struct platform_device mini2440_device_eth __initdata = {
|
||||
.name = "dm9000",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(mini2440_dm9k_resource),
|
||||
.resource = mini2440_dm9k_resource,
|
||||
.dev = {
|
||||
.platform_data = &mini2440_dm9k_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
/* CON5
|
||||
* +--+ /-----\
|
||||
* | | | |
|
||||
* | | | BAT |
|
||||
* | | \_____/
|
||||
* | |
|
||||
* | | +----+ +----+
|
||||
* | | | K5 | | K1 |
|
||||
* | | +----+ +----+
|
||||
* | | +----+ +----+
|
||||
* | | | K4 | | K2 |
|
||||
* | | +----+ +----+
|
||||
* | | +----+ +----+
|
||||
* | | | K6 | | K3 |
|
||||
* | | +----+ +----+
|
||||
* .....
|
||||
*/
|
||||
static struct gpio_keys_button mini2440_buttons[] __initdata = {
|
||||
{
|
||||
.gpio = S3C2410_GPG(0), /* K1 */
|
||||
.code = KEY_F1,
|
||||
.desc = "Button 1",
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.gpio = S3C2410_GPG(3), /* K2 */
|
||||
.code = KEY_F2,
|
||||
.desc = "Button 2",
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.gpio = S3C2410_GPG(5), /* K3 */
|
||||
.code = KEY_F3,
|
||||
.desc = "Button 3",
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.gpio = S3C2410_GPG(6), /* K4 */
|
||||
.code = KEY_POWER,
|
||||
.desc = "Power",
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.gpio = S3C2410_GPG(7), /* K5 */
|
||||
.code = KEY_F5,
|
||||
.desc = "Button 5",
|
||||
.active_low = 1,
|
||||
},
|
||||
#if 0
|
||||
/* this pin is also known as TCLK1 and seems to already
|
||||
* marked as "in use" somehow in the kernel -- possibly wrongly */
|
||||
{
|
||||
.gpio = S3C2410_GPG(11), /* K6 */
|
||||
.code = KEY_F6,
|
||||
.desc = "Button 6",
|
||||
.active_low = 1,
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
static struct gpio_keys_platform_data mini2440_button_data __initdata = {
|
||||
.buttons = mini2440_buttons,
|
||||
.nbuttons = ARRAY_SIZE(mini2440_buttons),
|
||||
};
|
||||
|
||||
static struct platform_device mini2440_button_device __initdata = {
|
||||
.name = "gpio-keys",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &mini2440_button_data,
|
||||
}
|
||||
};
|
||||
|
||||
/* LEDS */
|
||||
|
||||
static struct s3c24xx_led_platdata mini2440_led1_pdata __initdata = {
|
||||
.name = "led1",
|
||||
.gpio = S3C2410_GPB(5),
|
||||
.flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
|
||||
.def_trigger = "heartbeat",
|
||||
};
|
||||
|
||||
static struct s3c24xx_led_platdata mini2440_led2_pdata __initdata = {
|
||||
.name = "led2",
|
||||
.gpio = S3C2410_GPB(6),
|
||||
.flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
|
||||
.def_trigger = "nand-disk",
|
||||
};
|
||||
|
||||
static struct s3c24xx_led_platdata mini2440_led3_pdata __initdata = {
|
||||
.name = "led3",
|
||||
.gpio = S3C2410_GPB(7),
|
||||
.flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
|
||||
.def_trigger = "mmc0",
|
||||
};
|
||||
|
||||
static struct s3c24xx_led_platdata mini2440_led4_pdata __initdata = {
|
||||
.name = "led4",
|
||||
.gpio = S3C2410_GPB(8),
|
||||
.flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
|
||||
.def_trigger = "",
|
||||
};
|
||||
|
||||
static struct s3c24xx_led_platdata mini2440_led_backlight_pdata __initdata = {
|
||||
.name = "backlight",
|
||||
.gpio = S3C2410_GPG(4),
|
||||
.def_trigger = "backlight",
|
||||
};
|
||||
|
||||
static struct platform_device mini2440_led1 __initdata = {
|
||||
.name = "s3c24xx_led",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = &mini2440_led1_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device mini2440_led2 __initdata = {
|
||||
.name = "s3c24xx_led",
|
||||
.id = 2,
|
||||
.dev = {
|
||||
.platform_data = &mini2440_led2_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device mini2440_led3 __initdata = {
|
||||
.name = "s3c24xx_led",
|
||||
.id = 3,
|
||||
.dev = {
|
||||
.platform_data = &mini2440_led3_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device mini2440_led4 __initdata = {
|
||||
.name = "s3c24xx_led",
|
||||
.id = 4,
|
||||
.dev = {
|
||||
.platform_data = &mini2440_led4_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device mini2440_led_backlight __initdata = {
|
||||
.name = "s3c24xx_led",
|
||||
.id = 5,
|
||||
.dev = {
|
||||
.platform_data = &mini2440_led_backlight_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
/* AUDIO */
|
||||
|
||||
static struct s3c24xx_uda134x_platform_data mini2440_audio_pins __initdata = {
|
||||
.l3_clk = S3C2410_GPB(4),
|
||||
.l3_mode = S3C2410_GPB(2),
|
||||
.l3_data = S3C2410_GPB(3),
|
||||
.model = UDA134X_UDA1341
|
||||
};
|
||||
|
||||
static struct platform_device mini2440_audio __initdata = {
|
||||
.name = "s3c24xx_uda134x",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &mini2440_audio_pins,
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* I2C devices
|
||||
*/
|
||||
static struct at24_platform_data at24c08 = {
|
||||
.byte_len = SZ_8K / 8,
|
||||
.page_size = 16,
|
||||
};
|
||||
|
||||
static struct i2c_board_info mini2440_i2c_devs[] __initdata = {
|
||||
{
|
||||
I2C_BOARD_INFO("24c08", 0x50),
|
||||
.platform_data = &at24c08,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device *mini2440_devices[] __initdata = {
|
||||
&s3c_device_usb,
|
||||
&s3c_device_wdt,
|
||||
/* &s3c_device_adc,*/ /* ADC doesn't like living with touchscreen ! */
|
||||
&s3c_device_i2c0,
|
||||
&s3c_device_rtc,
|
||||
&s3c_device_usbgadget,
|
||||
&mini2440_device_eth,
|
||||
&mini2440_led1,
|
||||
&mini2440_led2,
|
||||
&mini2440_led3,
|
||||
&mini2440_led4,
|
||||
&mini2440_button_device,
|
||||
&s3c_device_nand,
|
||||
&s3c_device_sdi,
|
||||
&s3c_device_iis,
|
||||
&mini2440_audio,
|
||||
/* &s3c_device_timer[0],*/ /* buzzer pwm, no API for it */
|
||||
/* remaining devices are optional */
|
||||
};
|
||||
|
||||
static void __init mini2440_map_io(void)
|
||||
{
|
||||
s3c24xx_init_io(mini2440_iodesc, ARRAY_SIZE(mini2440_iodesc));
|
||||
s3c24xx_init_clocks(12000000);
|
||||
s3c24xx_init_uarts(mini2440_uartcfgs, ARRAY_SIZE(mini2440_uartcfgs));
|
||||
|
||||
s3c_device_nand.dev.platform_data = &mini2440_nand_info;
|
||||
s3c_device_sdi.dev.platform_data = &mini2440_mmc_cfg;
|
||||
}
|
||||
|
||||
/*
|
||||
* mini2440_features string
|
||||
*
|
||||
* t = Touchscreen present
|
||||
* b = backlight control
|
||||
* c = camera [TODO]
|
||||
* 0-9 LCD configuration
|
||||
*
|
||||
*/
|
||||
static char mini2440_features_str[12] __initdata = "0tb";
|
||||
|
||||
static int __init mini2440_features_setup(char *str)
|
||||
{
|
||||
if (str)
|
||||
strlcpy(mini2440_features_str, str, sizeof(mini2440_features_str));
|
||||
return 1;
|
||||
}
|
||||
|
||||
__setup("mini2440=", mini2440_features_setup);
|
||||
|
||||
#define FEATURE_SCREEN (1 << 0)
|
||||
#define FEATURE_BACKLIGHT (1 << 1)
|
||||
#define FEATURE_TOUCH (1 << 2)
|
||||
#define FEATURE_CAMERA (1 << 3)
|
||||
|
||||
struct mini2440_features_t {
|
||||
int count;
|
||||
int done;
|
||||
int lcd_index;
|
||||
struct platform_device *optional[8];
|
||||
};
|
||||
|
||||
static void mini2440_parse_features(
|
||||
struct mini2440_features_t * features,
|
||||
const char * features_str )
|
||||
{
|
||||
const char * fp = features_str;
|
||||
|
||||
features->count = 0;
|
||||
features->done = 0;
|
||||
features->lcd_index = -1;
|
||||
|
||||
while (*fp) {
|
||||
char f = *fp++;
|
||||
|
||||
switch (f) {
|
||||
case '0'...'9': /* tft screen */
|
||||
if (features->done & FEATURE_SCREEN) {
|
||||
printk(KERN_INFO "MINI2440: '%c' ignored, "
|
||||
"screen type already set\n", f);
|
||||
} else {
|
||||
int li = f - '0';
|
||||
if (li >= ARRAY_SIZE(mini2440_lcd_cfg))
|
||||
printk(KERN_INFO "MINI2440: "
|
||||
"'%c' out of range LCD mode\n", f);
|
||||
else {
|
||||
features->optional[features->count++] =
|
||||
&s3c_device_lcd;
|
||||
features->lcd_index = li;
|
||||
}
|
||||
}
|
||||
features->done |= FEATURE_SCREEN;
|
||||
break;
|
||||
case 'b':
|
||||
if (features->done & FEATURE_BACKLIGHT)
|
||||
printk(KERN_INFO "MINI2440: '%c' ignored, "
|
||||
"backlight already set\n", f);
|
||||
else {
|
||||
features->optional[features->count++] =
|
||||
&mini2440_led_backlight;
|
||||
}
|
||||
features->done |= FEATURE_BACKLIGHT;
|
||||
break;
|
||||
case 't':
|
||||
printk(KERN_INFO "MINI2440: '%c' ignored, "
|
||||
"touchscreen not compiled in\n", f);
|
||||
break;
|
||||
case 'c':
|
||||
if (features->done & FEATURE_CAMERA)
|
||||
printk(KERN_INFO "MINI2440: '%c' ignored, "
|
||||
"camera already registered\n", f);
|
||||
else
|
||||
features->optional[features->count++] =
|
||||
&s3c_device_camif;
|
||||
features->done |= FEATURE_CAMERA;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void __init mini2440_init(void)
|
||||
{
|
||||
struct mini2440_features_t features = { 0 };
|
||||
int i;
|
||||
|
||||
printk(KERN_INFO "MINI2440: Option string mini2440=%s\n",
|
||||
mini2440_features_str);
|
||||
|
||||
/* Parse the feature string */
|
||||
mini2440_parse_features(&features, mini2440_features_str);
|
||||
|
||||
/* turn LCD on */
|
||||
s3c2410_gpio_cfgpin(S3C2410_GPC(0), S3C2410_GPC0_LEND);
|
||||
|
||||
/* Turn the backlight early on */
|
||||
s3c2410_gpio_setpin(S3C2410_GPG(4), 1);
|
||||
s3c2410_gpio_cfgpin(S3C2410_GPG(4), S3C2410_GPIO_OUTPUT);
|
||||
|
||||
/* remove pullup on optional PWM backlight -- unused on 3.5 and 7"s */
|
||||
s3c2410_gpio_pullup(S3C2410_GPB(1), 0);
|
||||
s3c2410_gpio_setpin(S3C2410_GPB(1), 0);
|
||||
s3c2410_gpio_cfgpin(S3C2410_GPB(1), S3C2410_GPIO_INPUT);
|
||||
|
||||
/* Make sure the D+ pullup pin is output */
|
||||
s3c2410_gpio_cfgpin(S3C2410_GPC(5), S3C2410_GPIO_OUTPUT);
|
||||
|
||||
/* mark the key as input, without pullups (there is one on the board) */
|
||||
for (i = 0; i < ARRAY_SIZE(mini2440_buttons); i++) {
|
||||
s3c2410_gpio_pullup(mini2440_buttons[i].gpio, 0);
|
||||
s3c2410_gpio_cfgpin(mini2440_buttons[i].gpio,
|
||||
S3C2410_GPIO_INPUT);
|
||||
}
|
||||
if (features.lcd_index != -1) {
|
||||
int li;
|
||||
|
||||
mini2440_fb_info.displays =
|
||||
&mini2440_lcd_cfg[features.lcd_index];
|
||||
|
||||
printk(KERN_INFO "MINI2440: LCD");
|
||||
for (li = 0; li < ARRAY_SIZE(mini2440_lcd_cfg); li++)
|
||||
if (li == features.lcd_index)
|
||||
printk(" [%d:%dx%d]", li,
|
||||
mini2440_lcd_cfg[li].width,
|
||||
mini2440_lcd_cfg[li].height);
|
||||
else
|
||||
printk(" %d:%dx%d", li,
|
||||
mini2440_lcd_cfg[li].width,
|
||||
mini2440_lcd_cfg[li].height);
|
||||
printk("\n");
|
||||
s3c24xx_fb_set_platdata(&mini2440_fb_info);
|
||||
}
|
||||
s3c24xx_udc_set_platdata(&mini2440_udc_cfg);
|
||||
s3c_i2c0_set_platdata(NULL);
|
||||
i2c_register_board_info(0, mini2440_i2c_devs,
|
||||
ARRAY_SIZE(mini2440_i2c_devs));
|
||||
|
||||
platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices));
|
||||
|
||||
if (features.count) /* the optional features */
|
||||
platform_add_devices(features.optional, features.count);
|
||||
|
||||
}
|
||||
|
||||
|
||||
MACHINE_START(MINI2440, "MINI2440")
|
||||
/* Maintainer: Michel Pollet <buserror@gmail.com> */
|
||||
.phys_io = S3C2410_PA_UART,
|
||||
.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
|
||||
.boot_params = S3C2410_SDRAM_PA + 0x100,
|
||||
.map_io = mini2440_map_io,
|
||||
.init_machine = mini2440_init,
|
||||
.init_irq = s3c24xx_init_irq,
|
||||
.timer = &s3c24xx_timer,
|
||||
MACHINE_END
|
@ -24,6 +24,18 @@ config SMDK2440_CPU2442
|
||||
depends on ARCH_S3C2440
|
||||
select CPU_S3C2442
|
||||
|
||||
config MACH_NEO1973_GTA02
|
||||
bool "Openmoko GTA02 / Freerunner phone"
|
||||
select CPU_S3C2442
|
||||
select MFD_PCF50633
|
||||
select PCF50633_GPIO
|
||||
select I2C
|
||||
select POWER_SUPPLY
|
||||
select MACH_NEO1973
|
||||
select S3C2410_PWM
|
||||
help
|
||||
Say Y here if you are using the Openmoko GTA02 / Freerunner GSM Phone
|
||||
|
||||
|
||||
endmenu
|
||||
|
||||
|
@ -12,5 +12,7 @@ obj- :=
|
||||
obj-$(CONFIG_CPU_S3C2442) += s3c2442.o
|
||||
obj-$(CONFIG_CPU_S3C2442) += clock.o
|
||||
|
||||
obj-$(CONFIG_MACH_NEO1973_GTA02) += mach-gta02.o
|
||||
|
||||
# Machine support
|
||||
|
||||
|
84
arch/arm/mach-s3c2442/include/mach/gta02.h
Normal file
84
arch/arm/mach-s3c2442/include/mach/gta02.h
Normal file
@ -0,0 +1,84 @@
|
||||
#ifndef _GTA02_H
|
||||
#define _GTA02_H
|
||||
|
||||
#include <mach/regs-gpio.h>
|
||||
|
||||
/* Different hardware revisions, passed in ATAG_REVISION by u-boot */
|
||||
#define GTA02v1_SYSTEM_REV 0x00000310
|
||||
#define GTA02v2_SYSTEM_REV 0x00000320
|
||||
#define GTA02v3_SYSTEM_REV 0x00000330
|
||||
#define GTA02v4_SYSTEM_REV 0x00000340
|
||||
#define GTA02v5_SYSTEM_REV 0x00000350
|
||||
/* since A7 is basically same as A6, we use A6 PCB ID */
|
||||
#define GTA02v6_SYSTEM_REV 0x00000360
|
||||
|
||||
#define GTA02_GPIO_n3DL_GSM S3C2410_GPA(13) /* v1 + v2 + v3 only */
|
||||
|
||||
#define GTA02_GPIO_PWR_LED1 S3C2410_GPB(0)
|
||||
#define GTA02_GPIO_PWR_LED2 S3C2410_GPB(1)
|
||||
#define GTA02_GPIO_AUX_LED S3C2410_GPB(2)
|
||||
#define GTA02_GPIO_VIBRATOR_ON S3C2410_GPB(3)
|
||||
#define GTA02_GPIO_MODEM_RST S3C2410_GPB(5)
|
||||
#define GTA02_GPIO_BT_EN S3C2410_GPB(6)
|
||||
#define GTA02_GPIO_MODEM_ON S3C2410_GPB(7)
|
||||
#define GTA02_GPIO_EXTINT8 S3C2410_GPB(8)
|
||||
#define GTA02_GPIO_USB_PULLUP S3C2410_GPB(9)
|
||||
|
||||
#define GTA02_GPIO_PIO5 S3C2410_GPC(5) /* v3 + v4 only */
|
||||
|
||||
#define GTA02v3_GPIO_nG1_CS S3C2410_GPD(12) /* v3 + v4 only */
|
||||
#define GTA02v3_GPIO_nG2_CS S3C2410_GPD(13) /* v3 + v4 only */
|
||||
#define GTA02v5_GPIO_HDQ S3C2410_GPD(14) /* v5 + */
|
||||
|
||||
#define GTA02_GPIO_nG1_INT S3C2410_GPF(0)
|
||||
#define GTA02_GPIO_IO1 S3C2410_GPF(1)
|
||||
#define GTA02_GPIO_PIO_2 S3C2410_GPF(2) /* v2 + v3 + v4 only */
|
||||
#define GTA02_GPIO_JACK_INSERT S3C2410_GPF(4)
|
||||
#define GTA02_GPIO_WLAN_GPIO1 S3C2410_GPF(5) /* v2 + v3 + v4 only */
|
||||
#define GTA02_GPIO_AUX_KEY S3C2410_GPF(6)
|
||||
#define GTA02_GPIO_HOLD_KEY S3C2410_GPF(7)
|
||||
|
||||
#define GTA02_GPIO_3D_IRQ S3C2410_GPG(4)
|
||||
#define GTA02v2_GPIO_nG2_INT S3C2410_GPG(8) /* v2 + v3 + v4 only */
|
||||
#define GTA02v3_GPIO_nUSB_OC S3C2410_GPG(9) /* v3 + v4 only */
|
||||
#define GTA02v3_GPIO_nUSB_FLT S3C2410_GPG(10) /* v3 + v4 only */
|
||||
#define GTA02v3_GPIO_nGSM_OC S3C2410_GPG(11) /* v3 + v4 only */
|
||||
|
||||
#define GTA02_GPIO_AMP_SHUT S3C2440_GPJ1 /* v2 + v3 + v4 only */
|
||||
#define GTA02v1_GPIO_WLAN_GPIO10 S3C2440_GPJ2
|
||||
#define GTA02_GPIO_HP_IN S3C2440_GPJ2 /* v2 + v3 + v4 only */
|
||||
#define GTA02_GPIO_INT0 S3C2440_GPJ3 /* v2 + v3 + v4 only */
|
||||
#define GTA02_GPIO_nGSM_EN S3C2440_GPJ4
|
||||
#define GTA02_GPIO_3D_RESET S3C2440_GPJ5
|
||||
#define GTA02_GPIO_nDL_GSM S3C2440_GPJ6 /* v4 + v5 only */
|
||||
#define GTA02_GPIO_WLAN_GPIO0 S3C2440_GPJ7
|
||||
#define GTA02v1_GPIO_BAT_ID S3C2440_GPJ8
|
||||
#define GTA02_GPIO_KEEPACT S3C2440_GPJ8
|
||||
#define GTA02v1_GPIO_HP_IN S3C2440_GPJ10
|
||||
#define GTA02_CHIP_PWD S3C2440_GPJ11 /* v2 + v3 + v4 only */
|
||||
#define GTA02_GPIO_nWLAN_RESET S3C2440_GPJ12 /* v2 + v3 + v4 only */
|
||||
|
||||
#define GTA02_IRQ_GSENSOR_1 IRQ_EINT0
|
||||
#define GTA02_IRQ_MODEM IRQ_EINT1
|
||||
#define GTA02_IRQ_PIO_2 IRQ_EINT2 /* v2 + v3 + v4 only */
|
||||
#define GTA02_IRQ_nJACK_INSERT IRQ_EINT4
|
||||
#define GTA02_IRQ_WLAN_GPIO1 IRQ_EINT5
|
||||
#define GTA02_IRQ_AUX IRQ_EINT6
|
||||
#define GTA02_IRQ_nHOLD IRQ_EINT7
|
||||
#define GTA02_IRQ_PCF50633 IRQ_EINT9
|
||||
#define GTA02_IRQ_3D IRQ_EINT12
|
||||
#define GTA02_IRQ_GSENSOR_2 IRQ_EINT16 /* v2 + v3 + v4 only */
|
||||
#define GTA02v3_IRQ_nUSB_OC IRQ_EINT17 /* v3 + v4 only */
|
||||
#define GTA02v3_IRQ_nUSB_FLT IRQ_EINT18 /* v3 + v4 only */
|
||||
#define GTA02v3_IRQ_nGSM_OC IRQ_EINT19 /* v3 + v4 only */
|
||||
|
||||
/* returns 00 000 on GTA02 A5 and earlier, A6 returns 01 001 */
|
||||
#define GTA02_PCB_ID1_0 S3C2410_GPC(13)
|
||||
#define GTA02_PCB_ID1_1 S3C2410_GPC(15)
|
||||
#define GTA02_PCB_ID1_2 S3C2410_GPD(0)
|
||||
#define GTA02_PCB_ID2_0 S3C2410_GPD(3)
|
||||
#define GTA02_PCB_ID2_1 S3C2410_GPD(4)
|
||||
|
||||
int gta02_get_pcb_revision(void);
|
||||
|
||||
#endif /* _GTA02_H */
|
646
arch/arm/mach-s3c2442/mach-gta02.c
Normal file
646
arch/arm/mach-s3c2442/mach-gta02.c
Normal file
@ -0,0 +1,646 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-s3c2442/mach-gta02.c
|
||||
*
|
||||
* S3C2442 Machine Support for Openmoko GTA02 / FreeRunner.
|
||||
*
|
||||
* Copyright (C) 2006-2009 by Openmoko, Inc.
|
||||
* Authors: Harald Welte <laforge@openmoko.org>
|
||||
* Andy Green <andy@openmoko.org>
|
||||
* Werner Almesberger <werner@openmoko.org>
|
||||
* All rights reserved.
|
||||
*
|
||||
* 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
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/spi/spi.h>
|
||||
|
||||
#include <linux/mmc/host.h>
|
||||
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/nand.h>
|
||||
#include <linux/mtd/nand_ecc.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/backlight.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
|
||||
#include <linux/mfd/pcf50633/core.h>
|
||||
#include <linux/mfd/pcf50633/mbc.h>
|
||||
#include <linux/mfd/pcf50633/adc.h>
|
||||
#include <linux/mfd/pcf50633/gpio.h>
|
||||
#include <linux/mfd/pcf50633/pmic.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include <asm/irq.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include <mach/regs-irq.h>
|
||||
#include <mach/regs-gpio.h>
|
||||
#include <mach/regs-gpioj.h>
|
||||
#include <mach/fb.h>
|
||||
|
||||
#include <mach/spi.h>
|
||||
#include <mach/spi-gpio.h>
|
||||
#include <plat/usb-control.h>
|
||||
#include <mach/regs-mem.h>
|
||||
#include <mach/hardware.h>
|
||||
|
||||
#include <mach/gta02.h>
|
||||
|
||||
#include <plat/regs-serial.h>
|
||||
#include <plat/nand.h>
|
||||
#include <plat/devs.h>
|
||||
#include <plat/cpu.h>
|
||||
#include <plat/pm.h>
|
||||
#include <plat/udc.h>
|
||||
#include <plat/gpio-cfg.h>
|
||||
#include <plat/iic.h>
|
||||
|
||||
static struct pcf50633 *gta02_pcf;
|
||||
|
||||
/*
|
||||
* This gets called every 1ms when we paniced.
|
||||
*/
|
||||
|
||||
static long gta02_panic_blink(long count)
|
||||
{
|
||||
long delay = 0;
|
||||
static long last_blink;
|
||||
static char led;
|
||||
|
||||
/* Fast blink: 200ms period. */
|
||||
if (count - last_blink < 100)
|
||||
return 0;
|
||||
|
||||
led ^= 1;
|
||||
gpio_direction_output(GTA02_GPIO_AUX_LED, led);
|
||||
|
||||
last_blink = count;
|
||||
|
||||
return delay;
|
||||
}
|
||||
|
||||
|
||||
static struct map_desc gta02_iodesc[] __initdata = {
|
||||
{
|
||||
.virtual = 0xe0000000,
|
||||
.pfn = __phys_to_pfn(S3C2410_CS3 + 0x01000000),
|
||||
.length = SZ_1M,
|
||||
.type = MT_DEVICE
|
||||
},
|
||||
};
|
||||
|
||||
#define UCON (S3C2410_UCON_DEFAULT | S3C2443_UCON_RXERR_IRQEN)
|
||||
#define ULCON (S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB)
|
||||
#define UFCON (S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE)
|
||||
|
||||
static struct s3c2410_uartcfg gta02_uartcfgs[] = {
|
||||
[0] = {
|
||||
.hwport = 0,
|
||||
.flags = 0,
|
||||
.ucon = UCON,
|
||||
.ulcon = ULCON,
|
||||
.ufcon = UFCON,
|
||||
},
|
||||
[1] = {
|
||||
.hwport = 1,
|
||||
.flags = 0,
|
||||
.ucon = UCON,
|
||||
.ulcon = ULCON,
|
||||
.ufcon = UFCON,
|
||||
},
|
||||
[2] = {
|
||||
.hwport = 2,
|
||||
.flags = 0,
|
||||
.ucon = UCON,
|
||||
.ulcon = ULCON,
|
||||
.ufcon = UFCON,
|
||||
},
|
||||
};
|
||||
|
||||
#ifdef CONFIG_CHARGER_PCF50633
|
||||
/*
|
||||
* On GTA02 the 1A charger features a 48K resistor to 0V on the ID pin.
|
||||
* We use this to recognize that we can pull 1A from the USB socket.
|
||||
*
|
||||
* These constants are the measured pcf50633 ADC levels with the 1A
|
||||
* charger / 48K resistor, and with no pulldown resistor.
|
||||
*/
|
||||
|
||||
#define ADC_NOM_CHG_DETECT_1A 6
|
||||
#define ADC_NOM_CHG_DETECT_USB 43
|
||||
|
||||
static void
|
||||
gta02_configure_pmu_for_charger(struct pcf50633 *pcf, void *unused, int res)
|
||||
{
|
||||
int ma;
|
||||
|
||||
/* Interpret charger type */
|
||||
if (res < ((ADC_NOM_CHG_DETECT_USB + ADC_NOM_CHG_DETECT_1A) / 2)) {
|
||||
|
||||
/*
|
||||
* Sanity - stop GPO driving out now that we have a 1A charger
|
||||
* GPO controls USB Host power generation on GTA02
|
||||
*/
|
||||
pcf50633_gpio_set(pcf, PCF50633_GPO, 0);
|
||||
|
||||
ma = 1000;
|
||||
} else
|
||||
ma = 100;
|
||||
|
||||
pcf50633_mbc_usb_curlim_set(pcf, ma);
|
||||
}
|
||||
|
||||
static struct delayed_work gta02_charger_work;
|
||||
static int gta02_usb_vbus_draw;
|
||||
|
||||
static void gta02_charger_worker(struct work_struct *work)
|
||||
{
|
||||
if (gta02_usb_vbus_draw) {
|
||||
pcf50633_mbc_usb_curlim_set(gta02_pcf, gta02_usb_vbus_draw);
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PCF50633_ADC
|
||||
pcf50633_adc_async_read(gta02_pcf,
|
||||
PCF50633_ADCC1_MUX_ADCIN1,
|
||||
PCF50633_ADCC1_AVERAGE_16,
|
||||
gta02_configure_pmu_for_charger,
|
||||
NULL);
|
||||
#else
|
||||
/*
|
||||
* If the PCF50633 ADC is disabled we fallback to a
|
||||
* 100mA limit for safety.
|
||||
*/
|
||||
pcf50633_mbc_usb_curlim_set(pcf, 100);
|
||||
#endif
|
||||
}
|
||||
|
||||
#define GTA02_CHARGER_CONFIGURE_TIMEOUT ((3000 * HZ) / 1000)
|
||||
|
||||
static void gta02_pmu_event_callback(struct pcf50633 *pcf, int irq)
|
||||
{
|
||||
if (irq == PCF50633_IRQ_USBINS) {
|
||||
schedule_delayed_work(>a02_charger_work,
|
||||
GTA02_CHARGER_CONFIGURE_TIMEOUT);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (irq == PCF50633_IRQ_USBREM) {
|
||||
cancel_delayed_work_sync(>a02_charger_work);
|
||||
gta02_usb_vbus_draw = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void gta02_udc_vbus_draw(unsigned int ma)
|
||||
{
|
||||
if (!gta02_pcf)
|
||||
return;
|
||||
|
||||
gta02_usb_vbus_draw = ma;
|
||||
|
||||
schedule_delayed_work(>a02_charger_work,
|
||||
GTA02_CHARGER_CONFIGURE_TIMEOUT);
|
||||
}
|
||||
#else /* !CONFIG_CHARGER_PCF50633 */
|
||||
#define gta02_pmu_event_callback NULL
|
||||
#define gta02_udc_vbus_draw NULL
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This is called when pc50633 is probed, unfortunately quite late in the
|
||||
* day since it is an I2C bus device. Here we can belatedly define some
|
||||
* platform devices with the advantage that we can mark the pcf50633 as the
|
||||
* parent. This makes them get suspended and resumed with their parent
|
||||
* the pcf50633 still around.
|
||||
*/
|
||||
|
||||
static void gta02_pmu_attach_child_devices(struct pcf50633 *pcf);
|
||||
|
||||
|
||||
static char *gta02_batteries[] = {
|
||||
"battery",
|
||||
};
|
||||
|
||||
struct pcf50633_platform_data gta02_pcf_pdata = {
|
||||
.resumers = {
|
||||
[0] = PCF50633_INT1_USBINS |
|
||||
PCF50633_INT1_USBREM |
|
||||
PCF50633_INT1_ALARM,
|
||||
[1] = PCF50633_INT2_ONKEYF,
|
||||
[2] = PCF50633_INT3_ONKEY1S,
|
||||
[3] = PCF50633_INT4_LOWSYS |
|
||||
PCF50633_INT4_LOWBAT |
|
||||
PCF50633_INT4_HIGHTMP,
|
||||
},
|
||||
|
||||
.batteries = gta02_batteries,
|
||||
.num_batteries = ARRAY_SIZE(gta02_batteries),
|
||||
.reg_init_data = {
|
||||
[PCF50633_REGULATOR_AUTO] = {
|
||||
.constraints = {
|
||||
.min_uV = 3300000,
|
||||
.max_uV = 3300000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL,
|
||||
.always_on = 1,
|
||||
.apply_uV = 1,
|
||||
.state_mem = {
|
||||
.enabled = 1,
|
||||
},
|
||||
},
|
||||
},
|
||||
[PCF50633_REGULATOR_DOWN1] = {
|
||||
.constraints = {
|
||||
.min_uV = 1300000,
|
||||
.max_uV = 1600000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL,
|
||||
.always_on = 1,
|
||||
.apply_uV = 1,
|
||||
},
|
||||
},
|
||||
[PCF50633_REGULATOR_DOWN2] = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL,
|
||||
.apply_uV = 1,
|
||||
.always_on = 1,
|
||||
.state_mem = {
|
||||
.enabled = 1,
|
||||
},
|
||||
},
|
||||
},
|
||||
[PCF50633_REGULATOR_HCLDO] = {
|
||||
.constraints = {
|
||||
.min_uV = 2000000,
|
||||
.max_uV = 3300000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
|
||||
.always_on = 1,
|
||||
},
|
||||
},
|
||||
[PCF50633_REGULATOR_LDO1] = {
|
||||
.constraints = {
|
||||
.min_uV = 3300000,
|
||||
.max_uV = 3300000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL,
|
||||
.apply_uV = 1,
|
||||
.state_mem = {
|
||||
.enabled = 0,
|
||||
},
|
||||
},
|
||||
},
|
||||
[PCF50633_REGULATOR_LDO2] = {
|
||||
.constraints = {
|
||||
.min_uV = 3300000,
|
||||
.max_uV = 3300000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL,
|
||||
.apply_uV = 1,
|
||||
},
|
||||
},
|
||||
[PCF50633_REGULATOR_LDO3] = {
|
||||
.constraints = {
|
||||
.min_uV = 3000000,
|
||||
.max_uV = 3000000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL,
|
||||
.apply_uV = 1,
|
||||
},
|
||||
},
|
||||
[PCF50633_REGULATOR_LDO4] = {
|
||||
.constraints = {
|
||||
.min_uV = 3200000,
|
||||
.max_uV = 3200000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL,
|
||||
.apply_uV = 1,
|
||||
},
|
||||
},
|
||||
[PCF50633_REGULATOR_LDO5] = {
|
||||
.constraints = {
|
||||
.min_uV = 3000000,
|
||||
.max_uV = 3000000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL,
|
||||
.apply_uV = 1,
|
||||
.state_mem = {
|
||||
.enabled = 1,
|
||||
},
|
||||
},
|
||||
},
|
||||
[PCF50633_REGULATOR_LDO6] = {
|
||||
.constraints = {
|
||||
.min_uV = 3000000,
|
||||
.max_uV = 3000000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL,
|
||||
},
|
||||
},
|
||||
[PCF50633_REGULATOR_MEMLDO] = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL,
|
||||
.state_mem = {
|
||||
.enabled = 1,
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
},
|
||||
.probe_done = gta02_pmu_attach_child_devices,
|
||||
.mbc_event_callback = gta02_pmu_event_callback,
|
||||
};
|
||||
|
||||
|
||||
/* NOR Flash. */
|
||||
|
||||
#define GTA02_FLASH_BASE 0x18000000 /* GCS3 */
|
||||
#define GTA02_FLASH_SIZE 0x200000 /* 2MBytes */
|
||||
|
||||
static struct physmap_flash_data gta02_nor_flash_data = {
|
||||
.width = 2,
|
||||
};
|
||||
|
||||
static struct resource gta02_nor_flash_resource = {
|
||||
.start = GTA02_FLASH_BASE,
|
||||
.end = GTA02_FLASH_BASE + GTA02_FLASH_SIZE - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
|
||||
static struct platform_device gta02_nor_flash = {
|
||||
.name = "physmap-flash",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = >a02_nor_flash_data,
|
||||
},
|
||||
.resource = >a02_nor_flash_resource,
|
||||
.num_resources = 1,
|
||||
};
|
||||
|
||||
|
||||
struct platform_device s3c24xx_pwm_device = {
|
||||
.name = "s3c24xx_pwm",
|
||||
.num_resources = 0,
|
||||
};
|
||||
|
||||
static struct i2c_board_info gta02_i2c_devs[] __initdata = {
|
||||
{
|
||||
I2C_BOARD_INFO("pcf50633", 0x73),
|
||||
.irq = GTA02_IRQ_PCF50633,
|
||||
.platform_data = >a02_pcf_pdata,
|
||||
},
|
||||
{
|
||||
I2C_BOARD_INFO("wm8753", 0x1a),
|
||||
},
|
||||
};
|
||||
|
||||
static struct s3c2410_nand_set gta02_nand_sets[] = {
|
||||
[0] = {
|
||||
/*
|
||||
* This name is also hard-coded in the boot loaders, so
|
||||
* changing it would would require all users to upgrade
|
||||
* their boot loaders, some of which are stored in a NOR
|
||||
* that is considered to be immutable.
|
||||
*/
|
||||
.name = "neo1973-nand",
|
||||
.nr_chips = 1,
|
||||
.use_bbt = 1,
|
||||
.force_soft_ecc = 1,
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* Choose a set of timings derived from S3C@2442B MCP54
|
||||
* data sheet (K5D2G13ACM-D075 MCP Memory).
|
||||
*/
|
||||
|
||||
static struct s3c2410_platform_nand gta02_nand_info = {
|
||||
.tacls = 0,
|
||||
.twrph0 = 25,
|
||||
.twrph1 = 15,
|
||||
.nr_sets = ARRAY_SIZE(gta02_nand_sets),
|
||||
.sets = gta02_nand_sets,
|
||||
};
|
||||
|
||||
|
||||
static void gta02_udc_command(enum s3c2410_udc_cmd_e cmd)
|
||||
{
|
||||
switch (cmd) {
|
||||
case S3C2410_UDC_P_ENABLE:
|
||||
pr_debug("%s S3C2410_UDC_P_ENABLE\n", __func__);
|
||||
gpio_direction_output(GTA02_GPIO_USB_PULLUP, 1);
|
||||
break;
|
||||
case S3C2410_UDC_P_DISABLE:
|
||||
pr_debug("%s S3C2410_UDC_P_DISABLE\n", __func__);
|
||||
gpio_direction_output(GTA02_GPIO_USB_PULLUP, 0);
|
||||
break;
|
||||
case S3C2410_UDC_P_RESET:
|
||||
pr_debug("%s S3C2410_UDC_P_RESET\n", __func__);
|
||||
/* FIXME: Do something here. */
|
||||
}
|
||||
}
|
||||
|
||||
/* Get PMU to set USB current limit accordingly. */
|
||||
static struct s3c2410_udc_mach_info gta02_udc_cfg = {
|
||||
.vbus_draw = gta02_udc_vbus_draw,
|
||||
.udc_command = gta02_udc_command,
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
static void gta02_bl_set_intensity(int intensity)
|
||||
{
|
||||
struct pcf50633 *pcf = gta02_pcf;
|
||||
int old_intensity = pcf50633_reg_read(pcf, PCF50633_REG_LEDOUT);
|
||||
|
||||
/* We map 8-bit intensity to 6-bit intensity in hardware. */
|
||||
intensity >>= 2;
|
||||
|
||||
/*
|
||||
* This can happen during, eg, print of panic on blanked console,
|
||||
* but we can't service i2c without interrupts active, so abort.
|
||||
*/
|
||||
if (in_atomic()) {
|
||||
printk(KERN_ERR "gta02_bl_set_intensity called while atomic\n");
|
||||
return;
|
||||
}
|
||||
|
||||
old_intensity = pcf50633_reg_read(pcf, PCF50633_REG_LEDOUT);
|
||||
if (intensity == old_intensity)
|
||||
return;
|
||||
|
||||
/* We can't do this anywhere else. */
|
||||
pcf50633_reg_write(pcf, PCF50633_REG_LEDDIM, 5);
|
||||
|
||||
if (!(pcf50633_reg_read(pcf, PCF50633_REG_LEDENA) & 3))
|
||||
old_intensity = 0;
|
||||
|
||||
/*
|
||||
* The PCF50633 cannot handle LEDOUT = 0 (datasheet p60)
|
||||
* if seen, you have to re-enable the LED unit.
|
||||
*/
|
||||
if (!intensity || !old_intensity)
|
||||
pcf50633_reg_write(pcf, PCF50633_REG_LEDENA, 0);
|
||||
|
||||
/* Illegal to set LEDOUT to 0. */
|
||||
if (!intensity)
|
||||
pcf50633_reg_set_bit_mask(pcf, PCF50633_REG_LEDOUT, 0x3f, 2);
|
||||
else
|
||||
pcf50633_reg_set_bit_mask(pcf, PCF50633_REG_LEDOUT, 0x3f,
|
||||
intensity);
|
||||
|
||||
if (intensity)
|
||||
pcf50633_reg_write(pcf, PCF50633_REG_LEDENA, 2);
|
||||
|
||||
}
|
||||
|
||||
static struct generic_bl_info gta02_bl_info = {
|
||||
.name = "gta02-bl",
|
||||
.max_intensity = 0xff,
|
||||
.default_intensity = 0xff,
|
||||
.set_bl_intensity = gta02_bl_set_intensity,
|
||||
};
|
||||
|
||||
static struct platform_device gta02_bl_dev = {
|
||||
.name = "generic-bl",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = >a02_bl_info,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* USB */
|
||||
static struct s3c2410_hcd_info gta02_usb_info = {
|
||||
.port[0] = {
|
||||
.flags = S3C_HCDFLG_USED,
|
||||
},
|
||||
.port[1] = {
|
||||
.flags = 0,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
static void __init gta02_map_io(void)
|
||||
{
|
||||
s3c24xx_init_io(gta02_iodesc, ARRAY_SIZE(gta02_iodesc));
|
||||
s3c24xx_init_clocks(12000000);
|
||||
s3c24xx_init_uarts(gta02_uartcfgs, ARRAY_SIZE(gta02_uartcfgs));
|
||||
}
|
||||
|
||||
|
||||
/* These are the guys that don't need to be children of PMU. */
|
||||
|
||||
static struct platform_device *gta02_devices[] __initdata = {
|
||||
&s3c_device_usb,
|
||||
&s3c_device_wdt,
|
||||
&s3c_device_sdi,
|
||||
&s3c_device_usbgadget,
|
||||
&s3c_device_nand,
|
||||
>a02_nor_flash,
|
||||
&s3c24xx_pwm_device,
|
||||
&s3c_device_iis,
|
||||
&s3c_device_i2c0,
|
||||
};
|
||||
|
||||
/* These guys DO need to be children of PMU. */
|
||||
|
||||
static struct platform_device *gta02_devices_pmu_children[] = {
|
||||
>a02_bl_dev,
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* This is called when pc50633 is probed, quite late in the day since it is an
|
||||
* I2C bus device. Here we can define platform devices with the advantage that
|
||||
* we can mark the pcf50633 as the parent. This makes them get suspended and
|
||||
* resumed with their parent the pcf50633 still around. All devices whose
|
||||
* operation depends on something from pcf50633 must have this relationship
|
||||
* made explicit like this, or suspend and resume will become an unreliable
|
||||
* hellworld.
|
||||
*/
|
||||
|
||||
static void gta02_pmu_attach_child_devices(struct pcf50633 *pcf)
|
||||
{
|
||||
int n;
|
||||
|
||||
/* Grab a copy of the now probed PMU pointer. */
|
||||
gta02_pcf = pcf;
|
||||
|
||||
for (n = 0; n < ARRAY_SIZE(gta02_devices_pmu_children); n++)
|
||||
gta02_devices_pmu_children[n]->dev.parent = pcf->dev;
|
||||
|
||||
platform_add_devices(gta02_devices_pmu_children,
|
||||
ARRAY_SIZE(gta02_devices_pmu_children));
|
||||
}
|
||||
|
||||
static void gta02_poweroff(void)
|
||||
{
|
||||
pcf50633_reg_set_bit_mask(gta02_pcf, PCF50633_REG_OOCSHDWN, 1, 1);
|
||||
}
|
||||
|
||||
static void __init gta02_machine_init(void)
|
||||
{
|
||||
/* Set the panic callback to make AUX LED blink at ~5Hz. */
|
||||
panic_blink = gta02_panic_blink;
|
||||
|
||||
s3c_pm_init();
|
||||
|
||||
#ifdef CONFIG_CHARGER_PCF50633
|
||||
INIT_DELAYED_WORK(>a02_charger_work, gta02_charger_worker);
|
||||
#endif
|
||||
|
||||
s3c_device_usb.dev.platform_data = >a02_usb_info;
|
||||
s3c_device_nand.dev.platform_data = >a02_nand_info;
|
||||
|
||||
s3c24xx_udc_set_platdata(>a02_udc_cfg);
|
||||
s3c_i2c0_set_platdata(NULL);
|
||||
|
||||
i2c_register_board_info(0, gta02_i2c_devs, ARRAY_SIZE(gta02_i2c_devs));
|
||||
|
||||
platform_add_devices(gta02_devices, ARRAY_SIZE(gta02_devices));
|
||||
pm_power_off = gta02_poweroff;
|
||||
}
|
||||
|
||||
|
||||
MACHINE_START(NEO1973_GTA02, "GTA02")
|
||||
/* Maintainer: Nelson Castillo <arhuaco@freaks-unidos.net> */
|
||||
.phys_io = S3C2410_PA_UART,
|
||||
.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
|
||||
.boot_params = S3C2410_SDRAM_PA + 0x100,
|
||||
.map_io = gta02_map_io,
|
||||
.init_irq = s3c24xx_init_irq,
|
||||
.init_machine = gta02_machine_init,
|
||||
.timer = &s3c24xx_timer,
|
||||
MACHINE_END
|
@ -62,6 +62,12 @@
|
||||
#define SHIFT_ASR 0x40
|
||||
#define SHIFT_RORRRX 0x60
|
||||
|
||||
#define BAD_INSTR 0xdeadc0de
|
||||
|
||||
/* Thumb-2 32 bit format per ARMv7 DDI0406A A6.3, either f800h,e800h,f800h */
|
||||
#define IS_T32(hi16) \
|
||||
(((hi16) & 0xe000) == 0xe000 && ((hi16) & 0x1800))
|
||||
|
||||
static unsigned long ai_user;
|
||||
static unsigned long ai_sys;
|
||||
static unsigned long ai_skipped;
|
||||
@ -332,38 +338,48 @@ do_alignment_ldrdstrd(unsigned long addr, unsigned long instr,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
unsigned int rd = RD_BITS(instr);
|
||||
unsigned int rd2;
|
||||
int load;
|
||||
|
||||
if (((rd & 1) == 1) || (rd == 14))
|
||||
if ((instr & 0xfe000000) == 0xe8000000) {
|
||||
/* ARMv7 Thumb-2 32-bit LDRD/STRD */
|
||||
rd2 = (instr >> 8) & 0xf;
|
||||
load = !!(LDST_L_BIT(instr));
|
||||
} else if (((rd & 1) == 1) || (rd == 14))
|
||||
goto bad;
|
||||
else {
|
||||
load = ((instr & 0xf0) == 0xd0);
|
||||
rd2 = rd + 1;
|
||||
}
|
||||
|
||||
ai_dword += 1;
|
||||
|
||||
if (user_mode(regs))
|
||||
goto user;
|
||||
|
||||
if ((instr & 0xf0) == 0xd0) {
|
||||
if (load) {
|
||||
unsigned long val;
|
||||
get32_unaligned_check(val, addr);
|
||||
regs->uregs[rd] = val;
|
||||
get32_unaligned_check(val, addr + 4);
|
||||
regs->uregs[rd + 1] = val;
|
||||
regs->uregs[rd2] = val;
|
||||
} else {
|
||||
put32_unaligned_check(regs->uregs[rd], addr);
|
||||
put32_unaligned_check(regs->uregs[rd + 1], addr + 4);
|
||||
put32_unaligned_check(regs->uregs[rd2], addr + 4);
|
||||
}
|
||||
|
||||
return TYPE_LDST;
|
||||
|
||||
user:
|
||||
if ((instr & 0xf0) == 0xd0) {
|
||||
if (load) {
|
||||
unsigned long val;
|
||||
get32t_unaligned_check(val, addr);
|
||||
regs->uregs[rd] = val;
|
||||
get32t_unaligned_check(val, addr + 4);
|
||||
regs->uregs[rd + 1] = val;
|
||||
regs->uregs[rd2] = val;
|
||||
} else {
|
||||
put32t_unaligned_check(regs->uregs[rd], addr);
|
||||
put32t_unaligned_check(regs->uregs[rd + 1], addr + 4);
|
||||
put32t_unaligned_check(regs->uregs[rd2], addr + 4);
|
||||
}
|
||||
|
||||
return TYPE_LDST;
|
||||
@ -616,10 +632,74 @@ thumb2arm(u16 tinstr)
|
||||
/* Else fall through for illegal instruction case */
|
||||
|
||||
default:
|
||||
return 0xdeadc0de;
|
||||
return BAD_INSTR;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert Thumb-2 32 bit LDM, STM, LDRD, STRD to equivalent instruction
|
||||
* handlable by ARM alignment handler, also find the corresponding handler,
|
||||
* so that we can reuse ARM userland alignment fault fixups for Thumb.
|
||||
*
|
||||
* @pinstr: original Thumb-2 instruction; returns new handlable instruction
|
||||
* @regs: register context.
|
||||
* @poffset: return offset from faulted addr for later writeback
|
||||
*
|
||||
* NOTES:
|
||||
* 1. Comments below refer to ARMv7 DDI0406A Thumb Instruction sections.
|
||||
* 2. Register name Rt from ARMv7 is same as Rd from ARMv6 (Rd is Rt)
|
||||
*/
|
||||
static void *
|
||||
do_alignment_t32_to_handler(unsigned long *pinstr, struct pt_regs *regs,
|
||||
union offset_union *poffset)
|
||||
{
|
||||
unsigned long instr = *pinstr;
|
||||
u16 tinst1 = (instr >> 16) & 0xffff;
|
||||
u16 tinst2 = instr & 0xffff;
|
||||
poffset->un = 0;
|
||||
|
||||
switch (tinst1 & 0xffe0) {
|
||||
/* A6.3.5 Load/Store multiple */
|
||||
case 0xe880: /* STM/STMIA/STMEA,LDM/LDMIA, PUSH/POP T2 */
|
||||
case 0xe8a0: /* ...above writeback version */
|
||||
case 0xe900: /* STMDB/STMFD, LDMDB/LDMEA */
|
||||
case 0xe920: /* ...above writeback version */
|
||||
/* no need offset decision since handler calculates it */
|
||||
return do_alignment_ldmstm;
|
||||
|
||||
case 0xf840: /* POP/PUSH T3 (single register) */
|
||||
if (RN_BITS(instr) == 13 && (tinst2 & 0x09ff) == 0x0904) {
|
||||
u32 L = !!(LDST_L_BIT(instr));
|
||||
const u32 subset[2] = {
|
||||
0xe92d0000, /* STMDB sp!,{registers} */
|
||||
0xe8bd0000, /* LDMIA sp!,{registers} */
|
||||
};
|
||||
*pinstr = subset[L] | (1<<RD_BITS(instr));
|
||||
return do_alignment_ldmstm;
|
||||
}
|
||||
/* Else fall through for illegal instruction case */
|
||||
break;
|
||||
|
||||
/* A6.3.6 Load/store double, STRD/LDRD(immed, lit, reg) */
|
||||
case 0xe860:
|
||||
case 0xe960:
|
||||
case 0xe8e0:
|
||||
case 0xe9e0:
|
||||
poffset->un = (tinst2 & 0xff) << 2;
|
||||
case 0xe940:
|
||||
case 0xe9c0:
|
||||
return do_alignment_ldrdstrd;
|
||||
|
||||
/*
|
||||
* No need to handle load/store instructions up to word size
|
||||
* since ARMv6 and later CPUs can perform unaligned accesses.
|
||||
*/
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int
|
||||
do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
||||
{
|
||||
@ -630,6 +710,8 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
||||
mm_segment_t fs;
|
||||
unsigned int fault;
|
||||
u16 tinstr = 0;
|
||||
int isize = 4;
|
||||
int thumb2_32b = 0;
|
||||
|
||||
instrptr = instruction_pointer(regs);
|
||||
|
||||
@ -637,8 +719,19 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
||||
set_fs(KERNEL_DS);
|
||||
if (thumb_mode(regs)) {
|
||||
fault = __get_user(tinstr, (u16 *)(instrptr & ~1));
|
||||
if (!(fault))
|
||||
instr = thumb2arm(tinstr);
|
||||
if (!fault) {
|
||||
if (cpu_architecture() >= CPU_ARCH_ARMv7 &&
|
||||
IS_T32(tinstr)) {
|
||||
/* Thumb-2 32-bit */
|
||||
u16 tinst2 = 0;
|
||||
fault = __get_user(tinst2, (u16 *)(instrptr+2));
|
||||
instr = (tinstr << 16) | tinst2;
|
||||
thumb2_32b = 1;
|
||||
} else {
|
||||
isize = 2;
|
||||
instr = thumb2arm(tinstr);
|
||||
}
|
||||
}
|
||||
} else
|
||||
fault = __get_user(instr, (u32 *)instrptr);
|
||||
set_fs(fs);
|
||||
@ -655,7 +748,7 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
||||
|
||||
fixup:
|
||||
|
||||
regs->ARM_pc += thumb_mode(regs) ? 2 : 4;
|
||||
regs->ARM_pc += isize;
|
||||
|
||||
switch (CODING_BITS(instr)) {
|
||||
case 0x00000000: /* 3.13.4 load/store instruction extensions */
|
||||
@ -714,18 +807,25 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
||||
handler = do_alignment_ldrstr;
|
||||
break;
|
||||
|
||||
case 0x08000000: /* ldm or stm */
|
||||
handler = do_alignment_ldmstm;
|
||||
case 0x08000000: /* ldm or stm, or thumb-2 32bit instruction */
|
||||
if (thumb2_32b)
|
||||
handler = do_alignment_t32_to_handler(&instr, regs, &offset);
|
||||
else
|
||||
handler = do_alignment_ldmstm;
|
||||
break;
|
||||
|
||||
default:
|
||||
goto bad;
|
||||
}
|
||||
|
||||
if (!handler)
|
||||
goto bad;
|
||||
type = handler(addr, instr, regs);
|
||||
|
||||
if (type == TYPE_ERROR || type == TYPE_FAULT)
|
||||
if (type == TYPE_ERROR || type == TYPE_FAULT) {
|
||||
regs->ARM_pc -= isize;
|
||||
goto bad_or_fault;
|
||||
}
|
||||
|
||||
if (type == TYPE_LDST)
|
||||
do_alignment_finish_ldst(addr, instr, regs, offset);
|
||||
@ -735,7 +835,6 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
||||
bad_or_fault:
|
||||
if (type == TYPE_ERROR)
|
||||
goto bad;
|
||||
regs->ARM_pc -= thumb_mode(regs) ? 2 : 4;
|
||||
/*
|
||||
* We got a fault - fix it up, or die.
|
||||
*/
|
||||
@ -751,8 +850,8 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
||||
*/
|
||||
printk(KERN_ERR "Alignment trap: not handling instruction "
|
||||
"%0*lx at [<%08lx>]\n",
|
||||
thumb_mode(regs) ? 4 : 8,
|
||||
thumb_mode(regs) ? tinstr : instr, instrptr);
|
||||
isize << 1,
|
||||
isize == 2 ? tinstr : instr, instrptr);
|
||||
ai_skipped += 1;
|
||||
return 1;
|
||||
|
||||
@ -763,8 +862,8 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
||||
printk("Alignment trap: %s (%d) PC=0x%08lx Instr=0x%0*lx "
|
||||
"Address=0x%08lx FSR 0x%03x\n", current->comm,
|
||||
task_pid_nr(current), instrptr,
|
||||
thumb_mode(regs) ? 4 : 8,
|
||||
thumb_mode(regs) ? tinstr : instr,
|
||||
isize << 1,
|
||||
isize == 2 ? tinstr : instr,
|
||||
addr, fsr);
|
||||
|
||||
if (ai_usermode & UM_FIXUP)
|
||||
|
@ -208,7 +208,7 @@ good_area:
|
||||
* than endlessly redo the fault.
|
||||
*/
|
||||
survive:
|
||||
fault = handle_mm_fault(mm, vma, addr & PAGE_MASK, fsr & (1 << 11));
|
||||
fault = handle_mm_fault(mm, vma, addr & PAGE_MASK, (fsr & (1 << 11)) ? FAULT_FLAG_WRITE : 0);
|
||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||
if (fault & VM_FAULT_OOM)
|
||||
goto out_of_memory;
|
||||
|
@ -836,6 +836,13 @@ void __init reserve_node_zero(pg_data_t *pgdat)
|
||||
BOOTMEM_EXCLUSIVE);
|
||||
}
|
||||
|
||||
if (machine_is_treo680()) {
|
||||
reserve_bootmem_node(pgdat, 0xa0000000, 0x1000,
|
||||
BOOTMEM_EXCLUSIVE);
|
||||
reserve_bootmem_node(pgdat, 0xa2000000, 0x1000,
|
||||
BOOTMEM_EXCLUSIVE);
|
||||
}
|
||||
|
||||
if (machine_is_palmt5())
|
||||
reserve_bootmem_node(pgdat, 0xa0200000, 0x1000,
|
||||
BOOTMEM_EXCLUSIVE);
|
||||
|
@ -24,7 +24,8 @@ extern u32 omap2_set_prcm(u32 dpll_ctrl_val, u32 sdrc_rfr_val, int bypass);
|
||||
extern u32 omap3_configure_core_dpll(u32 sdrc_rfr_ctrl,
|
||||
u32 sdrc_actim_ctrla,
|
||||
u32 sdrc_actim_ctrlb, u32 m2,
|
||||
u32 unlock_dll);
|
||||
u32 unlock_dll, u32 f, u32 sdrc_mr,
|
||||
u32 inc);
|
||||
|
||||
/* Do not use these */
|
||||
extern void omap1_sram_reprogram_clock(u32 ckctl, u32 dpllctl);
|
||||
@ -62,7 +63,8 @@ extern unsigned long omap243x_sram_reprogram_sdrc_sz;
|
||||
extern u32 omap3_sram_configure_core_dpll(u32 sdrc_rfr_ctrl,
|
||||
u32 sdrc_actim_ctrla,
|
||||
u32 sdrc_actim_ctrlb, u32 m2,
|
||||
u32 unlock_dll);
|
||||
u32 unlock_dll, u32 f, u32 sdrc_mr,
|
||||
u32 inc);
|
||||
extern unsigned long omap3_sram_configure_core_dpll_sz;
|
||||
|
||||
#endif
|
||||
|
@ -371,15 +371,17 @@ static inline int omap243x_sram_init(void)
|
||||
static u32 (*_omap3_sram_configure_core_dpll)(u32 sdrc_rfr_ctrl,
|
||||
u32 sdrc_actim_ctrla,
|
||||
u32 sdrc_actim_ctrlb,
|
||||
u32 m2, u32 unlock_dll);
|
||||
u32 m2, u32 unlock_dll,
|
||||
u32 f, u32 sdrc_mr, u32 inc);
|
||||
u32 omap3_configure_core_dpll(u32 sdrc_rfr_ctrl, u32 sdrc_actim_ctrla,
|
||||
u32 sdrc_actim_ctrlb, u32 m2, u32 unlock_dll)
|
||||
u32 sdrc_actim_ctrlb, u32 m2, u32 unlock_dll,
|
||||
u32 f, u32 sdrc_mr, u32 inc)
|
||||
{
|
||||
BUG_ON(!_omap3_sram_configure_core_dpll);
|
||||
return _omap3_sram_configure_core_dpll(sdrc_rfr_ctrl,
|
||||
sdrc_actim_ctrla,
|
||||
sdrc_actim_ctrlb, m2,
|
||||
unlock_dll);
|
||||
unlock_dll, f, sdrc_mr, inc);
|
||||
}
|
||||
|
||||
/* REVISIT: Should this be same as omap34xx_sram_init() after off-idle? */
|
||||
|
@ -34,6 +34,7 @@ obj-$(CONFIG_S3C_DEV_HSMMC) += dev-hsmmc.o
|
||||
obj-$(CONFIG_S3C_DEV_HSMMC1) += dev-hsmmc1.o
|
||||
obj-y += dev-i2c0.o
|
||||
obj-$(CONFIG_S3C_DEV_I2C1) += dev-i2c1.o
|
||||
obj-$(CONFIG_SND_S3C24XX_SOC) += dev-audio.o
|
||||
obj-$(CONFIG_S3C_DEV_FB) += dev-fb.o
|
||||
obj-$(CONFIG_S3C_DEV_USB_HOST) += dev-usb.o
|
||||
obj-$(CONFIG_S3C_DEV_USB_HSOTG) += dev-usb-hsotg.o
|
||||
|
68
arch/arm/plat-s3c/dev-audio.c
Normal file
68
arch/arm/plat-s3c/dev-audio.c
Normal file
@ -0,0 +1,68 @@
|
||||
/* linux/arch/arm/plat-s3c/dev-audio.c
|
||||
*
|
||||
* Copyright 2009 Wolfson Microelectronics
|
||||
* Mark Brown <broonie@opensource.wolfsonmicro.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/kernel.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/map.h>
|
||||
|
||||
#include <plat/devs.h>
|
||||
|
||||
|
||||
static struct resource s3c64xx_iis0_resource[] = {
|
||||
[0] = {
|
||||
.start = S3C64XX_PA_IIS0,
|
||||
.end = S3C64XX_PA_IIS0 + 0x100 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
struct platform_device s3c64xx_device_iis0 = {
|
||||
.name = "s3c64xx-iis",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(s3c64xx_iis0_resource),
|
||||
.resource = s3c64xx_iis0_resource,
|
||||
};
|
||||
EXPORT_SYMBOL(s3c64xx_device_iis0);
|
||||
|
||||
static struct resource s3c64xx_iis1_resource[] = {
|
||||
[0] = {
|
||||
.start = S3C64XX_PA_IIS1,
|
||||
.end = S3C64XX_PA_IIS1 + 0x100 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
struct platform_device s3c64xx_device_iis1 = {
|
||||
.name = "s3c64xx-iis",
|
||||
.id = 1,
|
||||
.num_resources = ARRAY_SIZE(s3c64xx_iis1_resource),
|
||||
.resource = s3c64xx_iis1_resource,
|
||||
};
|
||||
EXPORT_SYMBOL(s3c64xx_device_iis1);
|
||||
|
||||
static struct resource s3c64xx_iisv4_resource[] = {
|
||||
[0] = {
|
||||
.start = S3C64XX_PA_IISV4,
|
||||
.end = S3C64XX_PA_IISV4 + 0x100 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
struct platform_device s3c64xx_device_iisv4 = {
|
||||
.name = "s3c64xx-iis-v4",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(s3c64xx_iisv4_resource),
|
||||
.resource = s3c64xx_iisv4_resource,
|
||||
};
|
||||
EXPORT_SYMBOL(s3c64xx_device_iisv4);
|
@ -119,7 +119,7 @@ int s3c_gpio_setcfg_s3c64xx_4bit(struct s3c_gpio_chip *chip,
|
||||
unsigned int shift = (off & 7) * 4;
|
||||
u32 con;
|
||||
|
||||
if (off < 8 && chip->chip.ngpio >= 8)
|
||||
if (off < 8 && chip->chip.ngpio > 8)
|
||||
reg -= 4;
|
||||
|
||||
if (s3c_gpio_is_cfg_special(cfg)) {
|
||||
|
@ -24,13 +24,16 @@ extern struct platform_device *s3c24xx_uart_src[];
|
||||
|
||||
extern struct platform_device s3c_device_timer[];
|
||||
|
||||
extern struct platform_device s3c64xx_device_iis0;
|
||||
extern struct platform_device s3c64xx_device_iis1;
|
||||
extern struct platform_device s3c64xx_device_iisv4;
|
||||
|
||||
extern struct platform_device s3c_device_fb;
|
||||
extern struct platform_device s3c_device_usb;
|
||||
extern struct platform_device s3c_device_lcd;
|
||||
extern struct platform_device s3c_device_wdt;
|
||||
extern struct platform_device s3c_device_i2c0;
|
||||
extern struct platform_device s3c_device_i2c1;
|
||||
extern struct platform_device s3c_device_iis;
|
||||
extern struct platform_device s3c_device_rtc;
|
||||
extern struct platform_device s3c_device_adc;
|
||||
extern struct platform_device s3c_device_sdi;
|
||||
|
@ -10,19 +10,26 @@
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
/* struct s3c2410_nand_set
|
||||
/**
|
||||
* struct s3c2410_nand_set - define a set of one or more nand chips
|
||||
* @disable_ecc: Entirely disable ECC - Dangerous
|
||||
* @flash_bbt: Openmoko u-boot can create a Bad Block Table
|
||||
* Setting this flag will allow the kernel to
|
||||
* look for it at boot time and also skip the NAND
|
||||
* scan.
|
||||
* @nr_chips: Number of chips in this set
|
||||
* @nr_partitions: Number of partitions pointed to by @partitions
|
||||
* @name: Name of set (optional)
|
||||
* @nr_map: Map for low-layer logical to physical chip numbers (option)
|
||||
* @partitions: The mtd partition list
|
||||
*
|
||||
* define an set of one or more nand chips registered with an unique mtd
|
||||
*
|
||||
* nr_chips = number of chips in this set
|
||||
* nr_partitions = number of partitions pointed to be partitoons (or zero)
|
||||
* name = name of set (optional)
|
||||
* nr_map = map for low-layer logical to physical chip numbers (option)
|
||||
* partitions = mtd partition list
|
||||
*/
|
||||
|
||||
* define a set of one or more nand chips registered with an unique mtd. Also
|
||||
* allows to pass flag to the underlying NAND layer. 'disable_ecc' will trigger
|
||||
* a warning at boot time.
|
||||
*/
|
||||
struct s3c2410_nand_set {
|
||||
unsigned int disable_ecc : 1;
|
||||
unsigned int disable_ecc:1;
|
||||
unsigned int flash_bbt:1;
|
||||
|
||||
int nr_chips;
|
||||
int nr_partitions;
|
||||
@ -39,7 +46,7 @@ struct s3c2410_platform_nand {
|
||||
int twrph0; /* active time for nWE/nOE */
|
||||
int twrph1; /* time for release CLE/ALE from nWE/nOE inactive */
|
||||
|
||||
unsigned int ignore_unset_ecc : 1;
|
||||
unsigned int ignore_unset_ecc:1;
|
||||
|
||||
int nr_sets;
|
||||
struct s3c2410_nand_set *sets;
|
||||
|
@ -23,6 +23,7 @@ obj-y += gpiolib.o
|
||||
|
||||
obj-$(CONFIG_CPU_S3C6400_INIT) += s3c6400-init.o
|
||||
obj-$(CONFIG_CPU_S3C6400_CLOCK) += s3c6400-clock.o
|
||||
obj-$(CONFIG_CPU_FREQ_S3C64XX) += cpufreq.o
|
||||
|
||||
# PM support
|
||||
|
||||
|
@ -191,7 +191,7 @@ static struct clk init_clocks[] = {
|
||||
.id = -1,
|
||||
.parent = &clk_h,
|
||||
.enable = s3c64xx_hclk_ctrl,
|
||||
.ctrlbit = S3C_CLKCON_SCLK_UHOST,
|
||||
.ctrlbit = S3C_CLKCON_HCLK_UHOST,
|
||||
}, {
|
||||
.name = "hsmmc",
|
||||
.id = 0,
|
||||
|
262
arch/arm/plat-s3c64xx/cpufreq.c
Normal file
262
arch/arm/plat-s3c64xx/cpufreq.c
Normal file
@ -0,0 +1,262 @@
|
||||
/* linux/arch/arm/plat-s3c64xx/cpufreq.c
|
||||
*
|
||||
* Copyright 2009 Wolfson Microelectronics plc
|
||||
*
|
||||
* S3C64xx CPUfreq Support
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/cpufreq.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
|
||||
static struct clk *armclk;
|
||||
static struct regulator *vddarm;
|
||||
|
||||
#ifdef CONFIG_CPU_S3C6410
|
||||
struct s3c64xx_dvfs {
|
||||
unsigned int vddarm_min;
|
||||
unsigned int vddarm_max;
|
||||
};
|
||||
|
||||
static struct s3c64xx_dvfs s3c64xx_dvfs_table[] = {
|
||||
[0] = { 1000000, 1000000 },
|
||||
[1] = { 1000000, 1050000 },
|
||||
[2] = { 1050000, 1100000 },
|
||||
[3] = { 1050000, 1150000 },
|
||||
[4] = { 1250000, 1350000 },
|
||||
};
|
||||
|
||||
static struct cpufreq_frequency_table s3c64xx_freq_table[] = {
|
||||
{ 0, 66000 },
|
||||
{ 0, 133000 },
|
||||
{ 1, 222000 },
|
||||
{ 1, 266000 },
|
||||
{ 2, 333000 },
|
||||
{ 2, 400000 },
|
||||
{ 3, 532000 },
|
||||
{ 3, 533000 },
|
||||
{ 4, 667000 },
|
||||
{ 0, CPUFREQ_TABLE_END },
|
||||
};
|
||||
#endif
|
||||
|
||||
static int s3c64xx_cpufreq_verify_speed(struct cpufreq_policy *policy)
|
||||
{
|
||||
if (policy->cpu != 0)
|
||||
return -EINVAL;
|
||||
|
||||
return cpufreq_frequency_table_verify(policy, s3c64xx_freq_table);
|
||||
}
|
||||
|
||||
static unsigned int s3c64xx_cpufreq_get_speed(unsigned int cpu)
|
||||
{
|
||||
if (cpu != 0)
|
||||
return 0;
|
||||
|
||||
return clk_get_rate(armclk) / 1000;
|
||||
}
|
||||
|
||||
static int s3c64xx_cpufreq_set_target(struct cpufreq_policy *policy,
|
||||
unsigned int target_freq,
|
||||
unsigned int relation)
|
||||
{
|
||||
int ret;
|
||||
unsigned int i;
|
||||
struct cpufreq_freqs freqs;
|
||||
struct s3c64xx_dvfs *dvfs;
|
||||
|
||||
ret = cpufreq_frequency_table_target(policy, s3c64xx_freq_table,
|
||||
target_freq, relation, &i);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
freqs.cpu = 0;
|
||||
freqs.old = clk_get_rate(armclk) / 1000;
|
||||
freqs.new = s3c64xx_freq_table[i].frequency;
|
||||
freqs.flags = 0;
|
||||
dvfs = &s3c64xx_dvfs_table[s3c64xx_freq_table[i].index];
|
||||
|
||||
if (freqs.old == freqs.new)
|
||||
return 0;
|
||||
|
||||
pr_debug("cpufreq: Transition %d-%dkHz\n", freqs.old, freqs.new);
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
#ifdef CONFIG_REGULATOR
|
||||
if (vddarm && freqs.new > freqs.old) {
|
||||
ret = regulator_set_voltage(vddarm,
|
||||
dvfs->vddarm_min,
|
||||
dvfs->vddarm_max);
|
||||
if (ret != 0) {
|
||||
pr_err("cpufreq: Failed to set VDDARM for %dkHz: %d\n",
|
||||
freqs.new, ret);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
ret = clk_set_rate(armclk, freqs.new * 1000);
|
||||
if (ret < 0) {
|
||||
pr_err("cpufreq: Failed to set rate %dkHz: %d\n",
|
||||
freqs.new, ret);
|
||||
goto err;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_REGULATOR
|
||||
if (vddarm && freqs.new < freqs.old) {
|
||||
ret = regulator_set_voltage(vddarm,
|
||||
dvfs->vddarm_min,
|
||||
dvfs->vddarm_max);
|
||||
if (ret != 0) {
|
||||
pr_err("cpufreq: Failed to set VDDARM for %dkHz: %d\n",
|
||||
freqs.new, ret);
|
||||
goto err_clk;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
pr_debug("cpufreq: Set actual frequency %lukHz\n",
|
||||
clk_get_rate(armclk) / 1000);
|
||||
|
||||
return 0;
|
||||
|
||||
err_clk:
|
||||
if (clk_set_rate(armclk, freqs.old * 1000) < 0)
|
||||
pr_err("Failed to restore original clock rate\n");
|
||||
err:
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_REGULATOR
|
||||
static void __init s3c64xx_cpufreq_constrain_voltages(void)
|
||||
{
|
||||
int count, v, i, found;
|
||||
struct cpufreq_frequency_table *freq;
|
||||
struct s3c64xx_dvfs *dvfs;
|
||||
|
||||
count = regulator_count_voltages(vddarm);
|
||||
if (count < 0) {
|
||||
pr_err("cpufreq: Unable to check supported voltages\n");
|
||||
return;
|
||||
}
|
||||
|
||||
freq = s3c64xx_freq_table;
|
||||
while (freq->frequency != CPUFREQ_TABLE_END) {
|
||||
if (freq->frequency == CPUFREQ_ENTRY_INVALID)
|
||||
continue;
|
||||
|
||||
dvfs = &s3c64xx_dvfs_table[freq->index];
|
||||
found = 0;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
v = regulator_list_voltage(vddarm, i);
|
||||
if (v >= dvfs->vddarm_min && v <= dvfs->vddarm_max)
|
||||
found = 1;
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
pr_debug("cpufreq: %dkHz unsupported by regulator\n",
|
||||
freq->frequency);
|
||||
freq->frequency = CPUFREQ_ENTRY_INVALID;
|
||||
}
|
||||
|
||||
freq++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static int __init s3c64xx_cpufreq_driver_init(struct cpufreq_policy *policy)
|
||||
{
|
||||
int ret;
|
||||
struct cpufreq_frequency_table *freq;
|
||||
|
||||
if (policy->cpu != 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (s3c64xx_freq_table == NULL) {
|
||||
pr_err("cpufreq: No frequency information for this CPU\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
armclk = clk_get(NULL, "armclk");
|
||||
if (IS_ERR(armclk)) {
|
||||
pr_err("cpufreq: Unable to obtain ARMCLK: %ld\n",
|
||||
PTR_ERR(armclk));
|
||||
return PTR_ERR(armclk);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_REGULATOR
|
||||
vddarm = regulator_get(NULL, "vddarm");
|
||||
if (IS_ERR(vddarm)) {
|
||||
ret = PTR_ERR(vddarm);
|
||||
pr_err("cpufreq: Failed to obtain VDDARM: %d\n", ret);
|
||||
pr_err("cpufreq: Only frequency scaling available\n");
|
||||
vddarm = NULL;
|
||||
} else {
|
||||
s3c64xx_cpufreq_constrain_voltages();
|
||||
}
|
||||
#endif
|
||||
|
||||
freq = s3c64xx_freq_table;
|
||||
while (freq->frequency != CPUFREQ_TABLE_END) {
|
||||
unsigned long r;
|
||||
|
||||
/* Check for frequencies we can generate */
|
||||
r = clk_round_rate(armclk, freq->frequency * 1000);
|
||||
r /= 1000;
|
||||
if (r != freq->frequency)
|
||||
freq->frequency = CPUFREQ_ENTRY_INVALID;
|
||||
|
||||
/* If we have no regulator then assume startup
|
||||
* frequency is the maximum we can support. */
|
||||
if (!vddarm && freq->frequency > s3c64xx_cpufreq_get_speed(0))
|
||||
freq->frequency = CPUFREQ_ENTRY_INVALID;
|
||||
|
||||
freq++;
|
||||
}
|
||||
|
||||
policy->cur = clk_get_rate(armclk) / 1000;
|
||||
|
||||
/* Pick a conservative guess in ns: we'll need ~1 I2C/SPI
|
||||
* write plus clock reprogramming. */
|
||||
policy->cpuinfo.transition_latency = 2 * 1000 * 1000;
|
||||
|
||||
ret = cpufreq_frequency_table_cpuinfo(policy, s3c64xx_freq_table);
|
||||
if (ret != 0) {
|
||||
pr_err("cpufreq: Failed to configure frequency table: %d\n",
|
||||
ret);
|
||||
regulator_put(vddarm);
|
||||
clk_put(armclk);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct cpufreq_driver s3c64xx_cpufreq_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.flags = 0,
|
||||
.verify = s3c64xx_cpufreq_verify_speed,
|
||||
.target = s3c64xx_cpufreq_set_target,
|
||||
.get = s3c64xx_cpufreq_get_speed,
|
||||
.init = s3c64xx_cpufreq_driver_init,
|
||||
.name = "s3c",
|
||||
};
|
||||
|
||||
static int __init s3c64xx_cpufreq_init(void)
|
||||
{
|
||||
return cpufreq_register_driver(&s3c64xx_cpufreq_driver);
|
||||
}
|
||||
module_init(s3c64xx_cpufreq_init);
|
@ -321,6 +321,11 @@ static struct s3c_gpio_cfg gpio_2bit_cfg_eint11 = {
|
||||
.get_pull = s3c_gpio_getpull_updown,
|
||||
};
|
||||
|
||||
int s3c64xx_gpio2int_gpn(struct gpio_chip *chip, unsigned pin)
|
||||
{
|
||||
return IRQ_EINT(0) + pin;
|
||||
}
|
||||
|
||||
static struct s3c_gpio_chip gpio_2bit[] = {
|
||||
{
|
||||
.base = S3C64XX_GPF_BASE,
|
||||
@ -353,6 +358,7 @@ static struct s3c_gpio_chip gpio_2bit[] = {
|
||||
.base = S3C64XX_GPN(0),
|
||||
.ngpio = S3C64XX_GPIO_N_NR,
|
||||
.label = "GPN",
|
||||
.to_irq = s3c64xx_gpio2int_gpn,
|
||||
},
|
||||
}, {
|
||||
.base = S3C64XX_GPO_BASE,
|
||||
|
@ -88,11 +88,11 @@
|
||||
#define S3C6400_CLKDIV2_SPI0_SHIFT (0)
|
||||
|
||||
/* HCLK GATE Registers */
|
||||
#define S3C_CLKCON_HCLK_BUS (1<<30)
|
||||
#define S3C_CLKCON_HCLK_SECUR (1<<29)
|
||||
#define S3C_CLKCON_HCLK_SDMA1 (1<<28)
|
||||
#define S3C_CLKCON_HCLK_SDMA2 (1<<27)
|
||||
#define S3C_CLKCON_HCLK_UHOST (1<<26)
|
||||
#define S3C_CLKCON_HCLK_3DSE (1<<31)
|
||||
#define S3C_CLKCON_HCLK_UHOST (1<<29)
|
||||
#define S3C_CLKCON_HCLK_SECUR (1<<28)
|
||||
#define S3C_CLKCON_HCLK_SDMA1 (1<<27)
|
||||
#define S3C_CLKCON_HCLK_SDMA0 (1<<26)
|
||||
#define S3C_CLKCON_HCLK_IROM (1<<25)
|
||||
#define S3C_CLKCON_HCLK_DDR1 (1<<24)
|
||||
#define S3C_CLKCON_HCLK_DDR0 (1<<23)
|
||||
|
@ -12,7 +12,7 @@
|
||||
#
|
||||
# http://www.arm.linux.org.uk/developer/machines/?action=new
|
||||
#
|
||||
# Last update: Fri May 29 10:14:20 2009
|
||||
# Last update: Sat Jun 20 22:28:39 2009
|
||||
#
|
||||
# machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number
|
||||
#
|
||||
@ -1455,7 +1455,7 @@ gba MACH_GBA GBA 1457
|
||||
h6044 MACH_H6044 H6044 1458
|
||||
app MACH_APP APP 1459
|
||||
tct_hammer MACH_TCT_HAMMER TCT_HAMMER 1460
|
||||
herald MACH_HERMES HERMES 1461
|
||||
herald MACH_HERALD HERALD 1461
|
||||
artemis MACH_ARTEMIS ARTEMIS 1462
|
||||
htctitan MACH_HTCTITAN HTCTITAN 1463
|
||||
qranium MACH_QRANIUM QRANIUM 1464
|
||||
@ -2245,3 +2245,38 @@ str9 MACH_STR9 STR9 2257
|
||||
omap3_wl_ff MACH_OMAP3_WL_FF OMAP3_WL_FF 2258
|
||||
simcom MACH_SIMCOM SIMCOM 2259
|
||||
mcwebio MACH_MCWEBIO MCWEBIO 2260
|
||||
omap3_phrazer MACH_OMAP3_PHRAZER OMAP3_PHRAZER 2261
|
||||
darwin MACH_DARWIN DARWIN 2262
|
||||
oratiscomu MACH_ORATISCOMU ORATISCOMU 2263
|
||||
rtsbc20 MACH_RTSBC20 RTSBC20 2264
|
||||
i780 MACH_I780 I780 2265
|
||||
gemini324 MACH_GEMINI324 GEMINI324 2266
|
||||
oratislan MACH_ORATISLAN ORATISLAN 2267
|
||||
oratisalog MACH_ORATISALOG ORATISALOG 2268
|
||||
oratismadi MACH_ORATISMADI ORATISMADI 2269
|
||||
oratisot16 MACH_ORATISOT16 ORATISOT16 2270
|
||||
oratisdesk MACH_ORATISDESK ORATISDESK 2271
|
||||
v2p_ca9 MACH_V2P_CA9 V2P_CA9 2272
|
||||
sintexo MACH_SINTEXO SINTEXO 2273
|
||||
cm3389 MACH_CM3389 CM3389 2274
|
||||
omap3_cio MACH_OMAP3_CIO OMAP3_CIO 2275
|
||||
sgh_i900 MACH_SGH_I900 SGH_I900 2276
|
||||
bst100 MACH_BST100 BST100 2277
|
||||
passion MACH_PASSION PASSION 2278
|
||||
indesign_at91sam MACH_INDESIGN_AT91SAM INDESIGN_AT91SAM 2279
|
||||
c4_badger MACH_C4_BADGER C4_BADGER 2280
|
||||
c4_viper MACH_C4_VIPER C4_VIPER 2281
|
||||
d2net MACH_D2NET D2NET 2282
|
||||
bigdisk MACH_BIGDISK BIGDISK 2283
|
||||
notalvision MACH_NOTALVISION NOTALVISION 2284
|
||||
omap3_kboc MACH_OMAP3_KBOC OMAP3_KBOC 2285
|
||||
cyclone MACH_CYCLONE CYCLONE 2286
|
||||
ninja MACH_NINJA NINJA 2287
|
||||
at91sam9g20ek_2mmc MACH_AT91SAM9G20EK_2MMC AT91SAM9G20EK_2MMC 2288
|
||||
bcmring MACH_BCMRING BCMRING 2289
|
||||
resol_dl2 MACH_RESOL_DL2 RESOL_DL2 2290
|
||||
ifosw MACH_IFOSW IFOSW 2291
|
||||
htcrhodium MACH_HTCRHODIUM HTCRHODIUM 2292
|
||||
htctopaz MACH_HTCTOPAZ HTCTOPAZ 2293
|
||||
matrix504 MACH_MATRIX504 MATRIX504 2294
|
||||
mrfsa MACH_MRFSA MRFSA 2295
|
||||
|
@ -133,7 +133,7 @@ good_area:
|
||||
* fault.
|
||||
*/
|
||||
survive:
|
||||
fault = handle_mm_fault(mm, vma, address, writeaccess);
|
||||
fault = handle_mm_fault(mm, vma, address, writeaccess ? FAULT_FLAG_WRITE : 0);
|
||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||
if (fault & VM_FAULT_OOM)
|
||||
goto out_of_memory;
|
||||
|
@ -274,7 +274,7 @@ config BF_REV_0_0
|
||||
|
||||
config BF_REV_0_1
|
||||
bool "0.1"
|
||||
depends on (BF52x || (BF54x && !BF54xM))
|
||||
depends on (BF51x || BF52x || (BF54x && !BF54xM))
|
||||
|
||||
config BF_REV_0_2
|
||||
bool "0.2"
|
||||
@ -358,7 +358,7 @@ config MEM_MT48LC8M32B2B5_7
|
||||
|
||||
config MEM_MT48LC32M16A2TG_75
|
||||
bool
|
||||
depends on (BFIN527_EZKIT || BFIN532_IP0X || BLACKSTAMP || BFIN526_EZBRD)
|
||||
depends on (BFIN527_EZKIT || BFIN532_IP0X || BLACKSTAMP)
|
||||
default y
|
||||
|
||||
config MEM_MT48LC32M8A2_75
|
||||
@ -366,6 +366,11 @@ config MEM_MT48LC32M8A2_75
|
||||
depends on (BFIN518F_EZBRD)
|
||||
default y
|
||||
|
||||
config MEM_MT48H32M16LFCJ_75
|
||||
bool
|
||||
depends on (BFIN526_EZBRD)
|
||||
default y
|
||||
|
||||
source "arch/blackfin/mach-bf518/Kconfig"
|
||||
source "arch/blackfin/mach-bf527/Kconfig"
|
||||
source "arch/blackfin/mach-bf533/Kconfig"
|
||||
@ -623,7 +628,6 @@ choice
|
||||
config TICKSOURCE_GPTMR0
|
||||
bool "Gptimer0 (SCLK domain)"
|
||||
select BFIN_GPTIMERS
|
||||
depends on !IPIPE
|
||||
|
||||
config TICKSOURCE_CORETMR
|
||||
bool "Core timer (CCLK domain)"
|
||||
@ -644,6 +648,7 @@ config CYCLES_CLOCKSOURCE
|
||||
|
||||
config GPTMR0_CLOCKSOURCE
|
||||
bool "Use GPTimer0 as a clocksource (higher rating)"
|
||||
select BFIN_GPTIMERS
|
||||
depends on GENERIC_CLOCKEVENTS
|
||||
depends on !TICKSOURCE_GPTMR0
|
||||
|
||||
@ -908,76 +913,97 @@ endchoice
|
||||
|
||||
|
||||
comment "Cache Support"
|
||||
|
||||
config BFIN_ICACHE
|
||||
bool "Enable ICACHE"
|
||||
default y
|
||||
config BFIN_ICACHE_LOCK
|
||||
bool "Enable Instruction Cache Locking"
|
||||
depends on BFIN_ICACHE
|
||||
default n
|
||||
config BFIN_EXTMEM_ICACHEABLE
|
||||
bool "Enable ICACHE for external memory"
|
||||
depends on BFIN_ICACHE
|
||||
default y
|
||||
config BFIN_L2_ICACHEABLE
|
||||
bool "Enable ICACHE for L2 SRAM"
|
||||
depends on BFIN_ICACHE
|
||||
depends on BF54x || BF561
|
||||
default n
|
||||
|
||||
config BFIN_DCACHE
|
||||
bool "Enable DCACHE"
|
||||
default y
|
||||
config BFIN_DCACHE_BANKA
|
||||
bool "Enable only 16k BankA DCACHE - BankB is SRAM"
|
||||
depends on BFIN_DCACHE && !BF531
|
||||
default n
|
||||
config BFIN_ICACHE_LOCK
|
||||
bool "Enable Instruction Cache Locking"
|
||||
|
||||
choice
|
||||
prompt "External memory cache policy"
|
||||
config BFIN_EXTMEM_DCACHEABLE
|
||||
bool "Enable DCACHE for external memory"
|
||||
depends on BFIN_DCACHE
|
||||
default BFIN_WB if !SMP
|
||||
default BFIN_WT if SMP
|
||||
config BFIN_WB
|
||||
bool "Write back"
|
||||
depends on !SMP
|
||||
help
|
||||
Write Back Policy:
|
||||
Cached data will be written back to SDRAM only when needed.
|
||||
This can give a nice increase in performance, but beware of
|
||||
broken drivers that do not properly invalidate/flush their
|
||||
cache.
|
||||
|
||||
Write Through Policy:
|
||||
Cached data will always be written back to SDRAM when the
|
||||
cache is updated. This is a completely safe setting, but
|
||||
performance is worse than Write Back.
|
||||
|
||||
If you are unsure of the options and you want to be safe,
|
||||
then go with Write Through.
|
||||
|
||||
config BFIN_WT
|
||||
bool "Write through"
|
||||
help
|
||||
Write Back Policy:
|
||||
Cached data will be written back to SDRAM only when needed.
|
||||
This can give a nice increase in performance, but beware of
|
||||
broken drivers that do not properly invalidate/flush their
|
||||
cache.
|
||||
|
||||
Write Through Policy:
|
||||
Cached data will always be written back to SDRAM when the
|
||||
cache is updated. This is a completely safe setting, but
|
||||
performance is worse than Write Back.
|
||||
|
||||
If you are unsure of the options and you want to be safe,
|
||||
then go with Write Through.
|
||||
|
||||
endchoice
|
||||
|
||||
default y
|
||||
choice
|
||||
prompt "L2 SRAM cache policy"
|
||||
depends on (BF54x || BF561)
|
||||
default BFIN_L2_WT
|
||||
config BFIN_L2_WB
|
||||
prompt "External memory DCACHE policy"
|
||||
depends on BFIN_EXTMEM_DCACHEABLE
|
||||
default BFIN_EXTMEM_WRITEBACK if !SMP
|
||||
default BFIN_EXTMEM_WRITETHROUGH if SMP
|
||||
config BFIN_EXTMEM_WRITEBACK
|
||||
bool "Write back"
|
||||
depends on !SMP
|
||||
help
|
||||
Write Back Policy:
|
||||
Cached data will be written back to SDRAM only when needed.
|
||||
This can give a nice increase in performance, but beware of
|
||||
broken drivers that do not properly invalidate/flush their
|
||||
cache.
|
||||
|
||||
config BFIN_L2_WT
|
||||
Write Through Policy:
|
||||
Cached data will always be written back to SDRAM when the
|
||||
cache is updated. This is a completely safe setting, but
|
||||
performance is worse than Write Back.
|
||||
|
||||
If you are unsure of the options and you want to be safe,
|
||||
then go with Write Through.
|
||||
|
||||
config BFIN_EXTMEM_WRITETHROUGH
|
||||
bool "Write through"
|
||||
depends on !SMP
|
||||
help
|
||||
Write Back Policy:
|
||||
Cached data will be written back to SDRAM only when needed.
|
||||
This can give a nice increase in performance, but beware of
|
||||
broken drivers that do not properly invalidate/flush their
|
||||
cache.
|
||||
|
||||
config BFIN_L2_NOT_CACHED
|
||||
bool "Not cached"
|
||||
Write Through Policy:
|
||||
Cached data will always be written back to SDRAM when the
|
||||
cache is updated. This is a completely safe setting, but
|
||||
performance is worse than Write Back.
|
||||
|
||||
If you are unsure of the options and you want to be safe,
|
||||
then go with Write Through.
|
||||
|
||||
endchoice
|
||||
|
||||
config BFIN_L2_DCACHEABLE
|
||||
bool "Enable DCACHE for L2 SRAM"
|
||||
depends on BFIN_DCACHE
|
||||
depends on BF54x || BF561
|
||||
default n
|
||||
choice
|
||||
prompt "L2 SRAM DCACHE policy"
|
||||
depends on BFIN_L2_DCACHEABLE
|
||||
default BFIN_L2_WRITEBACK
|
||||
config BFIN_L2_WRITEBACK
|
||||
bool "Write back"
|
||||
depends on !SMP
|
||||
|
||||
config BFIN_L2_WRITETHROUGH
|
||||
bool "Write through"
|
||||
depends on !SMP
|
||||
endchoice
|
||||
|
||||
|
||||
comment "Memory Protection Unit"
|
||||
config MPU
|
||||
bool "Enable the memory protection unit (EXPERIMENTAL)"
|
||||
default n
|
||||
|
@ -13,7 +13,7 @@ extra-y += vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma
|
||||
|
||||
quiet_cmd_uimage = UIMAGE $@
|
||||
cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A $(ARCH) -O linux -T kernel \
|
||||
-C $(2) -n 'Linux-$(KERNELRELEASE)' -a $(CONFIG_BOOT_LOAD) \
|
||||
-C $(2) -n '$(MACHINE)-$(KERNELRELEASE)' -a $(CONFIG_BOOT_LOAD) \
|
||||
-e $(shell $(NM) vmlinux | awk '$$NF == "__start" {print $$1}') \
|
||||
-d $< $@
|
||||
|
||||
|
@ -326,11 +326,17 @@ CONFIG_DMA_UNCACHED_1M=y
|
||||
# Cache Support
|
||||
#
|
||||
CONFIG_BFIN_ICACHE=y
|
||||
# CONFIG_BFIN_ICACHE_LOCK is not set
|
||||
CONFIG_BFIN_DCACHE=y
|
||||
# CONFIG_BFIN_DCACHE_BANKA is not set
|
||||
# CONFIG_BFIN_ICACHE_LOCK is not set
|
||||
CONFIG_BFIN_WB=y
|
||||
# CONFIG_BFIN_WT is not set
|
||||
CONFIG_BFIN_EXTMEM_ICACHEABLE=y
|
||||
CONFIG_BFIN_EXTMEM_DCACHEABLE=y
|
||||
CONFIG_BFIN_EXTMEM_WRITEBACK=y
|
||||
# CONFIG_BFIN_EXTMEM_WRITETHROUGH is not set
|
||||
|
||||
#
|
||||
# Memory Protection Unit
|
||||
#
|
||||
# CONFIG_MPU is not set
|
||||
|
||||
#
|
||||
@ -413,11 +419,11 @@ CONFIG_IP_PNP=y
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
CONFIG_INET_XFRM_MODE_TRANSPORT=y
|
||||
CONFIG_INET_XFRM_MODE_TUNNEL=y
|
||||
CONFIG_INET_XFRM_MODE_BEET=y
|
||||
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
|
||||
# CONFIG_INET_XFRM_MODE_TUNNEL is not set
|
||||
# CONFIG_INET_XFRM_MODE_BEET is not set
|
||||
# CONFIG_INET_LRO is not set
|
||||
CONFIG_INET_DIAG=y
|
||||
# CONFIG_INET_DIAG is not set
|
||||
CONFIG_INET_TCP_DIAG=y
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_CUBIC=y
|
||||
@ -916,7 +922,7 @@ CONFIG_MMC_BLOCK_BOUNCE=y
|
||||
# CONFIG_MMC_SDHCI is not set
|
||||
CONFIG_SDH_BFIN=m
|
||||
CONFIG_SDH_BFIN_MISSING_CMD_PULLUP_WORKAROUND=y
|
||||
CONFIG_SDH_BFIN_ENABLE_SDIO_IRQ=y
|
||||
# CONFIG_SDH_BFIN_ENABLE_SDIO_IRQ is not set
|
||||
# CONFIG_MMC_SPI is not set
|
||||
# CONFIG_MEMSTICK is not set
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
@ -1147,7 +1153,7 @@ CONFIG_SCHED_DEBUG=y
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
# CONFIG_DEBUG_BUGVERBOSE is not set
|
||||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
# CONFIG_DEBUG_WRITECOUNT is not set
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user