Merge branch 'linus' into x86/urgent
Merge reason: we want to queue up a dependent patch. Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
commit
de66ee979d
1
.mailmap
1
.mailmap
|
@ -32,6 +32,7 @@ Brian Avery <b.avery@hp.com>
|
|||
Brian King <brking@us.ibm.com>
|
||||
Christoph Hellwig <hch@lst.de>
|
||||
Corey Minyard <minyard@acm.org>
|
||||
Damian Hobson-Garcia <dhobsong@igel.co.jp>
|
||||
David Brownell <david-b@pacbell.net>
|
||||
David Woodhouse <dwmw2@shinybook.infradead.org>
|
||||
Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
|
||||
|
|
8
CREDITS
8
CREDITS
|
@ -2943,6 +2943,10 @@ S: Kasarmikatu 11 A4
|
|||
S: 70110 Kuopio
|
||||
S: Finland
|
||||
|
||||
N: Tobias Ringström
|
||||
E: tori@unhappy.mine.nu
|
||||
D: Davicom DM9102(A)/DM9132/DM9801 fast ethernet driver
|
||||
|
||||
N: Luca Risolia
|
||||
E: luca.risolia@studio.unibo.it
|
||||
P: 1024D/FCE635A4 88E8 F32F 7244 68BA 3958 5D40 99DA 5D2A FCE6 35A4
|
||||
|
@ -3913,6 +3917,10 @@ S: Flandernstrasse 101
|
|||
S: D-73732 Esslingen
|
||||
S: Germany
|
||||
|
||||
N: Roman Zippel
|
||||
E: zippel@linux-m68k.org
|
||||
D: AFFS and HFS filesystems, m68k maintainer, new kernel configuration in 2.5
|
||||
|
||||
N: Leonard N. Zubkoff
|
||||
W: http://www.dandelion.com/Linux/
|
||||
D: BusLogic SCSI driver
|
||||
|
|
|
@ -142,3 +142,67 @@ Description:
|
|||
with the previous I/O request are enabled. When set to 2,
|
||||
all merge tries are disabled. The default value is 0 -
|
||||
which enables all types of merge tries.
|
||||
|
||||
What: /sys/block/<disk>/discard_alignment
|
||||
Date: May 2011
|
||||
Contact: Martin K. Petersen <martin.petersen@oracle.com>
|
||||
Description:
|
||||
Devices that support discard functionality may
|
||||
internally allocate space in units that are bigger than
|
||||
the exported logical block size. The discard_alignment
|
||||
parameter indicates how many bytes the beginning of the
|
||||
device is offset from the internal allocation unit's
|
||||
natural alignment.
|
||||
|
||||
What: /sys/block/<disk>/<partition>/discard_alignment
|
||||
Date: May 2011
|
||||
Contact: Martin K. Petersen <martin.petersen@oracle.com>
|
||||
Description:
|
||||
Devices that support discard functionality may
|
||||
internally allocate space in units that are bigger than
|
||||
the exported logical block size. The discard_alignment
|
||||
parameter indicates how many bytes the beginning of the
|
||||
partition is offset from the internal allocation unit's
|
||||
natural alignment.
|
||||
|
||||
What: /sys/block/<disk>/queue/discard_granularity
|
||||
Date: May 2011
|
||||
Contact: Martin K. Petersen <martin.petersen@oracle.com>
|
||||
Description:
|
||||
Devices that support discard functionality may
|
||||
internally allocate space using units that are bigger
|
||||
than the logical block size. The discard_granularity
|
||||
parameter indicates the size of the internal allocation
|
||||
unit in bytes if reported by the device. Otherwise the
|
||||
discard_granularity will be set to match the device's
|
||||
physical block size. A discard_granularity of 0 means
|
||||
that the device does not support discard functionality.
|
||||
|
||||
What: /sys/block/<disk>/queue/discard_max_bytes
|
||||
Date: May 2011
|
||||
Contact: Martin K. Petersen <martin.petersen@oracle.com>
|
||||
Description:
|
||||
Devices that support discard functionality may have
|
||||
internal limits on the number of bytes that can be
|
||||
trimmed or unmapped in a single operation. Some storage
|
||||
protocols also have inherent limits on the number of
|
||||
blocks that can be described in a single command. The
|
||||
discard_max_bytes parameter is set by the device driver
|
||||
to the maximum number of bytes that can be discarded in
|
||||
a single operation. Discard requests issued to the
|
||||
device must not exceed this limit. A discard_max_bytes
|
||||
value of 0 means that the device does not support
|
||||
discard functionality.
|
||||
|
||||
What: /sys/block/<disk>/queue/discard_zeroes_data
|
||||
Date: May 2011
|
||||
Contact: Martin K. Petersen <martin.petersen@oracle.com>
|
||||
Description:
|
||||
Devices that support discard functionality may return
|
||||
stale or random data when a previously discarded block
|
||||
is read back. This can cause problems if the filesystem
|
||||
expects discarded blocks to be explicitly cleared. If a
|
||||
device reports that it deterministically returns zeroes
|
||||
when a discarded area is read the discard_zeroes_data
|
||||
parameter will be set to one. Otherwise it will be 0 and
|
||||
the result of reading a discarded area is undefined.
|
||||
|
|
|
@ -0,0 +1,98 @@
|
|||
What: /sys/class/ptp/
|
||||
Date: September 2010
|
||||
Contact: Richard Cochran <richardcochran@gmail.com>
|
||||
Description:
|
||||
This directory contains files and directories
|
||||
providing a standardized interface to the ancillary
|
||||
features of PTP hardware clocks.
|
||||
|
||||
What: /sys/class/ptp/ptpN/
|
||||
Date: September 2010
|
||||
Contact: Richard Cochran <richardcochran@gmail.com>
|
||||
Description:
|
||||
This directory contains the attributes of the Nth PTP
|
||||
hardware clock registered into the PTP class driver
|
||||
subsystem.
|
||||
|
||||
What: /sys/class/ptp/ptpN/clock_name
|
||||
Date: September 2010
|
||||
Contact: Richard Cochran <richardcochran@gmail.com>
|
||||
Description:
|
||||
This file contains the name of the PTP hardware clock
|
||||
as a human readable string.
|
||||
|
||||
What: /sys/class/ptp/ptpN/max_adjustment
|
||||
Date: September 2010
|
||||
Contact: Richard Cochran <richardcochran@gmail.com>
|
||||
Description:
|
||||
This file contains the PTP hardware clock's maximum
|
||||
frequency adjustment value (a positive integer) in
|
||||
parts per billion.
|
||||
|
||||
What: /sys/class/ptp/ptpN/n_alarms
|
||||
Date: September 2010
|
||||
Contact: Richard Cochran <richardcochran@gmail.com>
|
||||
Description:
|
||||
This file contains the number of periodic or one shot
|
||||
alarms offer by the PTP hardware clock.
|
||||
|
||||
What: /sys/class/ptp/ptpN/n_external_timestamps
|
||||
Date: September 2010
|
||||
Contact: Richard Cochran <richardcochran@gmail.com>
|
||||
Description:
|
||||
This file contains the number of external timestamp
|
||||
channels offered by the PTP hardware clock.
|
||||
|
||||
What: /sys/class/ptp/ptpN/n_periodic_outputs
|
||||
Date: September 2010
|
||||
Contact: Richard Cochran <richardcochran@gmail.com>
|
||||
Description:
|
||||
This file contains the number of programmable periodic
|
||||
output channels offered by the PTP hardware clock.
|
||||
|
||||
What: /sys/class/ptp/ptpN/pps_avaiable
|
||||
Date: September 2010
|
||||
Contact: Richard Cochran <richardcochran@gmail.com>
|
||||
Description:
|
||||
This file indicates whether the PTP hardware clock
|
||||
supports a Pulse Per Second to the host CPU. Reading
|
||||
"1" means that the PPS is supported, while "0" means
|
||||
not supported.
|
||||
|
||||
What: /sys/class/ptp/ptpN/extts_enable
|
||||
Date: September 2010
|
||||
Contact: Richard Cochran <richardcochran@gmail.com>
|
||||
Description:
|
||||
This write-only file enables or disables external
|
||||
timestamps. To enable external timestamps, write the
|
||||
channel index followed by a "1" into the file.
|
||||
To disable external timestamps, write the channel
|
||||
index followed by a "0" into the file.
|
||||
|
||||
What: /sys/class/ptp/ptpN/fifo
|
||||
Date: September 2010
|
||||
Contact: Richard Cochran <richardcochran@gmail.com>
|
||||
Description:
|
||||
This file provides timestamps on external events, in
|
||||
the form of three integers: channel index, seconds,
|
||||
and nanoseconds.
|
||||
|
||||
What: /sys/class/ptp/ptpN/period
|
||||
Date: September 2010
|
||||
Contact: Richard Cochran <richardcochran@gmail.com>
|
||||
Description:
|
||||
This write-only file enables or disables periodic
|
||||
outputs. To enable a periodic output, write five
|
||||
integers into the file: channel index, start time
|
||||
seconds, start time nanoseconds, period seconds, and
|
||||
period nanoseconds. To disable a periodic output, set
|
||||
all the seconds and nanoseconds values to zero.
|
||||
|
||||
What: /sys/class/ptp/ptpN/pps_enable
|
||||
Date: September 2010
|
||||
Contact: Richard Cochran <richardcochran@gmail.com>
|
||||
Description:
|
||||
This write-only file enables or disables delivery of
|
||||
PPS events to the Linux PPS subsystem. To enable PPS
|
||||
events, write a "1" into the file. To disable events,
|
||||
write a "0" into the file.
|
|
@ -4,10 +4,11 @@ ChangeLog:
|
|||
|
||||
SMP IRQ affinity
|
||||
|
||||
/proc/irq/IRQ#/smp_affinity specifies which target CPUs are permitted
|
||||
for a given IRQ source. It's a bitmask of allowed CPUs. It's not allowed
|
||||
to turn off all CPUs, and if an IRQ controller does not support IRQ
|
||||
affinity then the value will not change from the default 0xffffffff.
|
||||
/proc/irq/IRQ#/smp_affinity and /proc/irq/IRQ#/smp_affinity_list specify
|
||||
which target CPUs are permitted for a given IRQ source. It's a bitmask
|
||||
(smp_affinity) or cpu list (smp_affinity_list) of allowed CPUs. It's not
|
||||
allowed to turn off all CPUs, and if an IRQ controller does not support
|
||||
IRQ affinity then the value will not change from the default of all cpus.
|
||||
|
||||
/proc/irq/default_smp_affinity specifies default affinity mask that applies
|
||||
to all non-active IRQs. Once IRQ is allocated/activated its affinity bitmask
|
||||
|
@ -54,3 +55,11 @@ round-trip min/avg/max = 0.1/0.5/585.4 ms
|
|||
This time around IRQ44 was delivered only to the last four processors.
|
||||
i.e counters for the CPU0-3 did not change.
|
||||
|
||||
Here is an example of limiting that same irq (44) to cpus 1024 to 1031:
|
||||
|
||||
[root@moon 44]# echo 1024-1031 > smp_affinity
|
||||
[root@moon 44]# cat smp_affinity
|
||||
1024-1031
|
||||
|
||||
Note that to do this with a bitmask would require 32 bitmasks of zero
|
||||
to follow the pertinent one.
|
||||
|
|
|
@ -169,3 +169,18 @@ is issued which positions the tape to a known position. Typically you
|
|||
must rewind the tape (by issuing "mt -f /dev/st0 rewind" for example)
|
||||
before i/o can proceed again to a tape drive which was reset.
|
||||
|
||||
There is a cciss_tape_cmds module parameter which can be used to make cciss
|
||||
allocate more commands for use by tape drives. Ordinarily only a few commands
|
||||
(6) are allocated for tape drives because tape drives are slow and
|
||||
infrequently used and the primary purpose of Smart Array controllers is to
|
||||
act as a RAID controller for disk drives, so the vast majority of commands
|
||||
are allocated for disk devices. However, if you have more than a few tape
|
||||
drives attached to a smart array, the default number of commands may not be
|
||||
enought (for example, if you have 8 tape drives, you could only rewind 6
|
||||
at one time with the default number of commands.) The cciss_tape_cmds module
|
||||
parameter allows more commands (up to 16 more) to be allocated for use by
|
||||
tape drives. For example:
|
||||
|
||||
insmod cciss.ko cciss_tape_cmds=16
|
||||
|
||||
Or, as a kernel boot parameter passed in via grub: cciss.cciss_tape_cmds=8
|
||||
|
|
|
@ -16,7 +16,7 @@ on all processors in the system. Don't let this scare you into
|
|||
thinking SMP cache/tlb flushing must be so inefficient, this is in
|
||||
fact an area where many optimizations are possible. For example,
|
||||
if it can be proven that a user address space has never executed
|
||||
on a cpu (see vma->cpu_vm_mask), one need not perform a flush
|
||||
on a cpu (see mm_cpumask()), one need not perform a flush
|
||||
for this address space on that cpu.
|
||||
|
||||
First, the TLB flushing interfaces, since they are the simplest. The
|
||||
|
|
|
@ -74,3 +74,57 @@ Example:
|
|||
interrupt-parent = <&mpic>;
|
||||
phy-handle = <&phy0>
|
||||
};
|
||||
|
||||
* Gianfar PTP clock nodes
|
||||
|
||||
General Properties:
|
||||
|
||||
- compatible Should be "fsl,etsec-ptp"
|
||||
- reg Offset and length of the register set for the device
|
||||
- interrupts There should be at least two interrupts. Some devices
|
||||
have as many as four PTP related interrupts.
|
||||
|
||||
Clock Properties:
|
||||
|
||||
- fsl,tclk-period Timer reference clock period in nanoseconds.
|
||||
- fsl,tmr-prsc Prescaler, divides the output clock.
|
||||
- fsl,tmr-add Frequency compensation value.
|
||||
- fsl,tmr-fiper1 Fixed interval period pulse generator.
|
||||
- fsl,tmr-fiper2 Fixed interval period pulse generator.
|
||||
- fsl,max-adj Maximum frequency adjustment in parts per billion.
|
||||
|
||||
These properties set the operational parameters for the PTP
|
||||
clock. You must choose these carefully for the clock to work right.
|
||||
Here is how to figure good values:
|
||||
|
||||
TimerOsc = system clock MHz
|
||||
tclk_period = desired clock period nanoseconds
|
||||
NominalFreq = 1000 / tclk_period MHz
|
||||
FreqDivRatio = TimerOsc / NominalFreq (must be greater that 1.0)
|
||||
tmr_add = ceil(2^32 / FreqDivRatio)
|
||||
OutputClock = NominalFreq / tmr_prsc MHz
|
||||
PulseWidth = 1 / OutputClock microseconds
|
||||
FiperFreq1 = desired frequency in Hz
|
||||
FiperDiv1 = 1000000 * OutputClock / FiperFreq1
|
||||
tmr_fiper1 = tmr_prsc * tclk_period * FiperDiv1 - tclk_period
|
||||
max_adj = 1000000000 * (FreqDivRatio - 1.0) - 1
|
||||
|
||||
The calculation for tmr_fiper2 is the same as for tmr_fiper1. The
|
||||
driver expects that tmr_fiper1 will be correctly set to produce a 1
|
||||
Pulse Per Second (PPS) signal, since this will be offered to the PPS
|
||||
subsystem to synchronize the Linux clock.
|
||||
|
||||
Example:
|
||||
|
||||
ptp_clock@24E00 {
|
||||
compatible = "fsl,etsec-ptp";
|
||||
reg = <0x24E00 0xB0>;
|
||||
interrupts = <12 0x8 13 0x8>;
|
||||
interrupt-parent = < &ipic >;
|
||||
fsl,tclk-period = <10>;
|
||||
fsl,tmr-prsc = <100>;
|
||||
fsl,tmr-add = <0x999999A4>;
|
||||
fsl,tmr-fiper1 = <0x3B9AC9F6>;
|
||||
fsl,tmr-fiper2 = <0x00018696>;
|
||||
fsl,max-adj = <659999998>;
|
||||
};
|
||||
|
|
|
@ -25,6 +25,8 @@ Other applications are described in the following papers:
|
|||
http://xcpu.org/papers/cellfs-talk.pdf
|
||||
* PROSE I/O: Using 9p to enable Application Partitions
|
||||
http://plan9.escet.urjc.es/iwp9/cready/PROSE_iwp9_2006.pdf
|
||||
* VirtFS: A Virtualization Aware File System pass-through
|
||||
http://goo.gl/3WPDg
|
||||
|
||||
USAGE
|
||||
=====
|
||||
|
@ -130,31 +132,20 @@ OPTIONS
|
|||
RESOURCES
|
||||
=========
|
||||
|
||||
Our current recommendation is to use Inferno (http://www.vitanuova.com/nferno/index.html)
|
||||
as the 9p server. You can start a 9p server under Inferno by issuing the
|
||||
following command:
|
||||
; styxlisten -A tcp!*!564 export '#U*'
|
||||
Protocol specifications are maintained on github:
|
||||
http://ericvh.github.com/9p-rfc/
|
||||
|
||||
The -A specifies an unauthenticated export. The 564 is the port # (you may
|
||||
have to choose a higher port number if running as a normal user). The '#U*'
|
||||
specifies exporting the root of the Linux name space. You may specify a
|
||||
subset of the namespace by extending the path: '#U*'/tmp would just export
|
||||
/tmp. For more information, see the Inferno manual pages covering styxlisten
|
||||
and export.
|
||||
9p client and server implementations are listed on
|
||||
http://9p.cat-v.org/implementations
|
||||
|
||||
A Linux version of the 9p server is now maintained under the npfs project
|
||||
on sourceforge (http://sourceforge.net/projects/npfs). The currently
|
||||
maintained version is the single-threaded version of the server (named spfs)
|
||||
available from the same SVN repository.
|
||||
A 9p2000.L server is being developed by LLNL and can be found
|
||||
at http://code.google.com/p/diod/
|
||||
|
||||
There are user and developer mailing lists available through the v9fs project
|
||||
on sourceforge (http://sourceforge.net/projects/v9fs).
|
||||
|
||||
A stand-alone version of the module (which should build for any 2.6 kernel)
|
||||
is available via (http://github.com/ericvh/9p-sac/tree/master)
|
||||
|
||||
News and other information is maintained on SWiK (http://swik.net/v9fs)
|
||||
and the Wiki (http://sf.net/apps/mediawiki/v9fs/index.php).
|
||||
News and other information is maintained on a Wiki.
|
||||
(http://sf.net/apps/mediawiki/v9fs/index.php).
|
||||
|
||||
Bug reports may be issued through the kernel.org bugzilla
|
||||
(http://bugzilla.kernel.org)
|
||||
|
|
|
@ -574,6 +574,12 @@ The contents of each smp_affinity file is the same by default:
|
|||
> cat /proc/irq/0/smp_affinity
|
||||
ffffffff
|
||||
|
||||
There is an alternate interface, smp_affinity_list which allows specifying
|
||||
a cpu range instead of a bitmask:
|
||||
|
||||
> cat /proc/irq/0/smp_affinity_list
|
||||
1024-1031
|
||||
|
||||
The default_smp_affinity mask applies to all non-active IRQs, which are the
|
||||
IRQs which have not yet been allocated/activated, and hence which lack a
|
||||
/proc/irq/[0-9]* directory.
|
||||
|
@ -583,12 +589,13 @@ reports itself as being attached. This hardware locality information does not
|
|||
include information about any possible driver locality preference.
|
||||
|
||||
prof_cpu_mask specifies which CPUs are to be profiled by the system wide
|
||||
profiler. Default value is ffffffff (all cpus).
|
||||
profiler. Default value is ffffffff (all cpus if there are only 32 of them).
|
||||
|
||||
The way IRQs are routed is handled by the IO-APIC, and it's Round Robin
|
||||
between all the CPUs which are allowed to handle it. As usual the kernel has
|
||||
more info than you and does a better job than you, so the defaults are the
|
||||
best choice for almost everyone.
|
||||
best choice for almost everyone. [Note this applies only to those IO-APIC's
|
||||
that support "Round Robin" interrupt distribution.]
|
||||
|
||||
There are three more important subdirectories in /proc: net, scsi, and sys.
|
||||
The general rule is that the contents, or even the existence of these
|
||||
|
|
|
@ -0,0 +1,42 @@
|
|||
Kernel driver emc6w201
|
||||
======================
|
||||
|
||||
Supported chips:
|
||||
* SMSC EMC6W201
|
||||
Prefix: 'emc6w201'
|
||||
Addresses scanned: I2C 0x2c, 0x2d, 0x2e
|
||||
Datasheet: Not public
|
||||
|
||||
Author: Jean Delvare <khali@linux-fr.org>
|
||||
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
From the datasheet:
|
||||
|
||||
"The EMC6W201 is an environmental monitoring device with automatic fan
|
||||
control capability and enhanced system acoustics for noise suppression.
|
||||
This ACPI compliant device provides hardware monitoring for up to six
|
||||
voltages (including its own VCC) and five external thermal sensors,
|
||||
measures the speed of up to five fans, and controls the speed of
|
||||
multiple DC fans using three Pulse Width Modulator (PWM) outputs. Note
|
||||
that it is possible to control more than three fans by connecting two
|
||||
fans to one PWM output. The EMC6W201 will be available in a 36-pin
|
||||
QFN package."
|
||||
|
||||
The device is functionally close to the EMC6D100 series, but is
|
||||
register-incompatible.
|
||||
|
||||
The driver currently only supports the monitoring of the voltages,
|
||||
temperatures and fan speeds. Limits can be changed. Alarms are not
|
||||
supported, and neither is fan speed control.
|
||||
|
||||
|
||||
Known Systems With EMC6W201
|
||||
---------------------------
|
||||
|
||||
The EMC6W201 is a rare device, only found on a few systems, made in
|
||||
2005 and 2006. Known systems with this device:
|
||||
* Dell Precision 670 workstation
|
||||
* Gigabyte 2CEWH mainboard
|
|
@ -6,6 +6,10 @@ Supported chips:
|
|||
Prefix: 'f71808e'
|
||||
Addresses scanned: none, address read from Super I/O config space
|
||||
Datasheet: Not public
|
||||
* Fintek F71808A
|
||||
Prefix: 'f71808a'
|
||||
Addresses scanned: none, address read from Super I/O config space
|
||||
Datasheet: Not public
|
||||
* Fintek F71858FG
|
||||
Prefix: 'f71858fg'
|
||||
Addresses scanned: none, address read from Super I/O config space
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
Kernel driver fam15h_power
|
||||
==========================
|
||||
|
||||
Supported chips:
|
||||
* AMD Family 15h Processors
|
||||
|
||||
Prefix: 'fam15h_power'
|
||||
Addresses scanned: PCI space
|
||||
Datasheets:
|
||||
BIOS and Kernel Developer's Guide (BKDG) For AMD Family 15h Processors
|
||||
(not yet published)
|
||||
|
||||
Author: Andreas Herrmann <andreas.herrmann3@amd.com>
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
This driver permits reading of registers providing power information
|
||||
of AMD Family 15h processors.
|
||||
|
||||
For AMD Family 15h processors the following power values can be
|
||||
calculated using different processor northbridge function registers:
|
||||
|
||||
* BasePwrWatts: Specifies in watts the maximum amount of power
|
||||
consumed by the processor for NB and logic external to the core.
|
||||
* ProcessorPwrWatts: Specifies in watts the maximum amount of power
|
||||
the processor can support.
|
||||
* CurrPwrWatts: Specifies in watts the current amount of power being
|
||||
consumed by the processor.
|
||||
|
||||
This driver provides ProcessorPwrWatts and CurrPwrWatts:
|
||||
* power1_crit (ProcessorPwrWatts)
|
||||
* power1_input (CurrPwrWatts)
|
||||
|
||||
On multi-node processors the calculated value is for the entire
|
||||
package and not for a single node. Thus the driver creates sysfs
|
||||
attributes only for internal node0 of a multi-node processor.
|
|
@ -11,6 +11,7 @@ Supported chips:
|
|||
Socket S1G2: Athlon (X2), Sempron (X2), Turion X2 (Ultra)
|
||||
* AMD Family 12h processors: "Llano"
|
||||
* AMD Family 14h processors: "Brazos" (C/E/G-Series)
|
||||
* AMD Family 15h processors: "Bulldozer"
|
||||
|
||||
Prefix: 'k10temp'
|
||||
Addresses scanned: PCI space
|
||||
|
@ -40,7 +41,7 @@ Description
|
|||
-----------
|
||||
|
||||
This driver permits reading of the internal temperature sensor of AMD
|
||||
Family 10h/11h/12h/14h processors.
|
||||
Family 10h/11h/12h/14h/15h processors.
|
||||
|
||||
All these processors have a sensor, but on those for Socket F or AM2+,
|
||||
the sensor may return inconsistent values (erratum 319). The driver
|
||||
|
|
|
@ -2,9 +2,13 @@ Kernel driver max6650
|
|||
=====================
|
||||
|
||||
Supported chips:
|
||||
* Maxim 6650 / 6651
|
||||
* Maxim MAX6650
|
||||
Prefix: 'max6650'
|
||||
Addresses scanned: I2C 0x1b, 0x1f, 0x48, 0x4b
|
||||
Addresses scanned: none
|
||||
Datasheet: http://pdfserv.maxim-ic.com/en/ds/MAX6650-MAX6651.pdf
|
||||
* Maxim MAX6651
|
||||
Prefix: 'max6651'
|
||||
Addresses scanned: none
|
||||
Datasheet: http://pdfserv.maxim-ic.com/en/ds/MAX6650-MAX6651.pdf
|
||||
|
||||
Authors:
|
||||
|
@ -15,10 +19,10 @@ Authors:
|
|||
Description
|
||||
-----------
|
||||
|
||||
This driver implements support for the Maxim 6650/6651
|
||||
This driver implements support for the Maxim MAX6650 and MAX6651.
|
||||
|
||||
The 2 devices are very similar, but the Maxim 6550 has a reduced feature
|
||||
set, e.g. only one fan-input, instead of 4 for the 6651.
|
||||
The 2 devices are very similar, but the MAX6550 has a reduced feature
|
||||
set, e.g. only one fan-input, instead of 4 for the MAX6651.
|
||||
|
||||
The driver is not able to distinguish between the 2 devices.
|
||||
|
||||
|
@ -36,6 +40,13 @@ fan1_div rw sets the speed range the inputs can handle. Legal
|
|||
values are 1, 2, 4, and 8. Use lower values for
|
||||
faster fans.
|
||||
|
||||
Usage notes
|
||||
-----------
|
||||
|
||||
This driver does not auto-detect devices. You will have to instantiate the
|
||||
devices explicitly. Please see Documentation/i2c/instantiating-devices for
|
||||
details.
|
||||
|
||||
Module parameters
|
||||
-----------------
|
||||
|
||||
|
|
|
@ -304,6 +304,7 @@ Code Seq#(hex) Include File Comments
|
|||
0xB0 all RATIO devices in development:
|
||||
<mailto:vgo@ratio.de>
|
||||
0xB1 00-1F PPPoX <mailto:mostrows@styx.uwaterloo.ca>
|
||||
0xB3 00 linux/mmc/ioctl.h
|
||||
0xC0 00-0F linux/usb/iowarrior.h
|
||||
0xCB 00-1F CBM serial IEC bus in development:
|
||||
<mailto:michael.klein@puffin.lb.shuttle.de>
|
||||
|
|
|
@ -113,6 +113,13 @@ applicable everywhere (see syntax).
|
|||
That will limit the usefulness but on the other hand avoid
|
||||
the illegal configurations all over.
|
||||
|
||||
- limiting menu display: "visible if" <expr>
|
||||
This attribute is only applicable to menu blocks, if the condition is
|
||||
false, the menu block is not displayed to the user (the symbols
|
||||
contained there can still be selected by other symbols, though). It is
|
||||
similar to a conditional "prompt" attribude for individual menu
|
||||
entries. Default value of "visible" is true.
|
||||
|
||||
- numerical ranges: "range" <symbol> <symbol> ["if" <expr>]
|
||||
This allows to limit the range of possible input values for int
|
||||
and hex symbols. The user can only input a value which is larger than
|
||||
|
@ -303,7 +310,8 @@ menu:
|
|||
"endmenu"
|
||||
|
||||
This defines a menu block, see "Menu structure" above for more
|
||||
information. The only possible options are dependencies.
|
||||
information. The only possible options are dependencies and "visible"
|
||||
attributes.
|
||||
|
||||
if:
|
||||
|
||||
|
@ -381,3 +389,25 @@ config FOO
|
|||
|
||||
limits FOO to module (=m) or disabled (=n).
|
||||
|
||||
Kconfig symbol existence
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
The following two methods produce the same kconfig symbol dependencies
|
||||
but differ greatly in kconfig symbol existence (production) in the
|
||||
generated config file.
|
||||
|
||||
case 1:
|
||||
|
||||
config FOO
|
||||
tristate "about foo"
|
||||
depends on BAR
|
||||
|
||||
vs. case 2:
|
||||
|
||||
if BAR
|
||||
config FOO
|
||||
tristate "about foo"
|
||||
endif
|
||||
|
||||
In case 1, the symbol FOO will always exist in the config file (given
|
||||
no other dependencies). In case 2, the symbol FOO will only exist in
|
||||
the config file if BAR is enabled.
|
||||
|
|
|
@ -48,11 +48,6 @@ KCONFIG_OVERWRITECONFIG
|
|||
If you set KCONFIG_OVERWRITECONFIG in the environment, Kconfig will not
|
||||
break symlinks when .config is a symlink to somewhere else.
|
||||
|
||||
KCONFIG_NOTIMESTAMP
|
||||
--------------------------------------------------
|
||||
If this environment variable exists and is non-null, the timestamp line
|
||||
in generated .config files is omitted.
|
||||
|
||||
______________________________________________________________________
|
||||
Environment variables for '{allyes/allmod/allno/rand}config'
|
||||
|
||||
|
|
|
@ -1777,9 +1777,6 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
|||
|
||||
nosoftlockup [KNL] Disable the soft-lockup detector.
|
||||
|
||||
noswapaccount [KNL] Disable accounting of swap in memory resource
|
||||
controller. (See Documentation/cgroups/memory.txt)
|
||||
|
||||
nosync [HW,M68K] Disables sync negotiation for all devices.
|
||||
|
||||
notsc [BUGS=X86-32] Disable Time Stamp Counter
|
||||
|
|
|
@ -136,7 +136,7 @@ View the top contending locks:
|
|||
dcache_lock: 1037 1161 0.38 45.32 774.51 6611 243371 0.15 306.48 77387.24
|
||||
&inode->i_mutex: 161 286 18446744073709 62882.54 1244614.55 3653 20598 18446744073709 62318.60 1693822.74
|
||||
&zone->lru_lock: 94 94 0.53 7.33 92.10 4366 32690 0.29 59.81 16350.06
|
||||
&inode->i_data.i_mmap_lock: 79 79 0.40 3.77 53.03 11779 87755 0.28 116.93 29898.44
|
||||
&inode->i_data.i_mmap_mutex: 79 79 0.40 3.77 53.03 11779 87755 0.28 116.93 29898.44
|
||||
&q->__queue_lock: 48 50 0.52 31.62 86.31 774 13131 0.17 113.08 12277.52
|
||||
&rq->rq_lock_key: 43 47 0.74 68.50 170.63 3706 33929 0.22 107.99 17460.62
|
||||
&rq->rq_lock_key#2: 39 46 0.75 6.68 49.03 2979 32292 0.17 125.17 17137.63
|
||||
|
|
|
@ -2,3 +2,5 @@
|
|||
- this file
|
||||
mmc-dev-attrs.txt
|
||||
- info on SD and MMC device attributes
|
||||
mmc-dev-parts.txt
|
||||
- info on SD and MMC device partitions
|
||||
|
|
|
@ -1,3 +1,13 @@
|
|||
SD and MMC Block Device Attributes
|
||||
==================================
|
||||
|
||||
These attributes are defined for the block devices associated with the
|
||||
SD or MMC device.
|
||||
|
||||
The following attributes are read/write.
|
||||
|
||||
force_ro Enforce read-only access even if write protect switch is off.
|
||||
|
||||
SD and MMC Device Attributes
|
||||
============================
|
||||
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
SD and MMC Device Partitions
|
||||
============================
|
||||
|
||||
Device partitions are additional logical block devices present on the
|
||||
SD/MMC device.
|
||||
|
||||
As of this writing, MMC boot partitions as supported and exposed as
|
||||
/dev/mmcblkXboot0 and /dev/mmcblkXboot1, where X is the index of the
|
||||
parent /dev/mmcblkX.
|
||||
|
||||
MMC Boot Partitions
|
||||
===================
|
||||
|
||||
Read and write access is provided to the two MMC boot partitions. Due to
|
||||
the sensitive nature of the boot partition contents, which often store
|
||||
a bootloader or bootloader configuration tables crucial to booting the
|
||||
platform, write access is disabled by default to reduce the chance of
|
||||
accidental bricking.
|
||||
|
||||
To enable write access to /dev/mmcblkXbootY, disable the forced read-only
|
||||
access with:
|
||||
|
||||
echo 0 > /sys/block/mmcblkXbootY/force_ro
|
||||
|
||||
To re-enable read-only access:
|
||||
|
||||
echo 1 > /sys/block/mmcblkXbootY/force_ro
|
|
@ -770,8 +770,17 @@ resend_igmp
|
|||
a failover event. One membership report is issued immediately after
|
||||
the failover, subsequent packets are sent in each 200ms interval.
|
||||
|
||||
The valid range is 0 - 255; the default value is 1. This option
|
||||
was added for bonding version 3.7.0.
|
||||
The valid range is 0 - 255; the default value is 1. A value of 0
|
||||
prevents the IGMP membership report from being issued in response
|
||||
to the failover event.
|
||||
|
||||
This option is useful for bonding modes balance-rr (0), active-backup
|
||||
(1), balance-tlb (5) and balance-alb (6), in which a failover can
|
||||
switch the IGMP traffic from one slave to another. Therefore a fresh
|
||||
IGMP report must be issued to cause the switch to forward the incoming
|
||||
IGMP traffic over the newly selected slave.
|
||||
|
||||
This option was added for bonding version 3.7.0.
|
||||
|
||||
3. Configuring Bonding Devices
|
||||
==============================
|
||||
|
|
|
@ -0,0 +1,89 @@
|
|||
|
||||
* PTP hardware clock infrastructure for Linux
|
||||
|
||||
This patch set introduces support for IEEE 1588 PTP clocks in
|
||||
Linux. Together with the SO_TIMESTAMPING socket options, this
|
||||
presents a standardized method for developing PTP user space
|
||||
programs, synchronizing Linux with external clocks, and using the
|
||||
ancillary features of PTP hardware clocks.
|
||||
|
||||
A new class driver exports a kernel interface for specific clock
|
||||
drivers and a user space interface. The infrastructure supports a
|
||||
complete set of PTP hardware clock functionality.
|
||||
|
||||
+ Basic clock operations
|
||||
- Set time
|
||||
- Get time
|
||||
- Shift the clock by a given offset atomically
|
||||
- Adjust clock frequency
|
||||
|
||||
+ Ancillary clock features
|
||||
- One short or periodic alarms, with signal delivery to user program
|
||||
- Time stamp external events
|
||||
- Period output signals configurable from user space
|
||||
- Synchronization of the Linux system time via the PPS subsystem
|
||||
|
||||
** PTP hardware clock kernel API
|
||||
|
||||
A PTP clock driver registers itself with the class driver. The
|
||||
class driver handles all of the dealings with user space. The
|
||||
author of a clock driver need only implement the details of
|
||||
programming the clock hardware. The clock driver notifies the class
|
||||
driver of asynchronous events (alarms and external time stamps) via
|
||||
a simple message passing interface.
|
||||
|
||||
The class driver supports multiple PTP clock drivers. In normal use
|
||||
cases, only one PTP clock is needed. However, for testing and
|
||||
development, it can be useful to have more than one clock in a
|
||||
single system, in order to allow performance comparisons.
|
||||
|
||||
** PTP hardware clock user space API
|
||||
|
||||
The class driver also creates a character device for each
|
||||
registered clock. User space can use an open file descriptor from
|
||||
the character device as a POSIX clock id and may call
|
||||
clock_gettime, clock_settime, and clock_adjtime. These calls
|
||||
implement the basic clock operations.
|
||||
|
||||
User space programs may control the clock using standardized
|
||||
ioctls. A program may query, enable, configure, and disable the
|
||||
ancillary clock features. User space can receive time stamped
|
||||
events via blocking read() and poll(). One shot and periodic
|
||||
signals may be configured via the POSIX timer_settime() system
|
||||
call.
|
||||
|
||||
** Writing clock drivers
|
||||
|
||||
Clock drivers include include/linux/ptp_clock_kernel.h and register
|
||||
themselves by presenting a 'struct ptp_clock_info' to the
|
||||
registration method. Clock drivers must implement all of the
|
||||
functions in the interface. If a clock does not offer a particular
|
||||
ancillary feature, then the driver should just return -EOPNOTSUPP
|
||||
from those functions.
|
||||
|
||||
Drivers must ensure that all of the methods in interface are
|
||||
reentrant. Since most hardware implementations treat the time value
|
||||
as a 64 bit integer accessed as two 32 bit registers, drivers
|
||||
should use spin_lock_irqsave/spin_unlock_irqrestore to protect
|
||||
against concurrent access. This locking cannot be accomplished in
|
||||
class driver, since the lock may also be needed by the clock
|
||||
driver's interrupt service routine.
|
||||
|
||||
** Supported hardware
|
||||
|
||||
+ Freescale eTSEC gianfar
|
||||
- 2 Time stamp external triggers, programmable polarity (opt. interrupt)
|
||||
- 2 Alarm registers (optional interrupt)
|
||||
- 3 Periodic signals (optional interrupt)
|
||||
|
||||
+ National DP83640
|
||||
- 6 GPIOs programmable as inputs or outputs
|
||||
- 6 GPIOs with dedicated functions (LED/JTAG/clock) can also be
|
||||
used as general inputs or outputs
|
||||
- GPIO inputs can time stamp external triggers
|
||||
- GPIO outputs can produce periodic signals
|
||||
- 1 interrupt pin
|
||||
|
||||
+ Intel IXP465
|
||||
- Auxiliary Slave/Master Mode Snapshot (optional interrupt)
|
||||
- Target Time (optional interrupt)
|
|
@ -0,0 +1,381 @@
|
|||
/*
|
||||
* PTP 1588 clock support - User space test program
|
||||
*
|
||||
* Copyright (C) 2010 OMICRON electronics GmbH
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <math.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/timex.h>
|
||||
#include <sys/types.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <linux/ptp_clock.h>
|
||||
|
||||
#define DEVICE "/dev/ptp0"
|
||||
|
||||
#ifndef ADJ_SETOFFSET
|
||||
#define ADJ_SETOFFSET 0x0100
|
||||
#endif
|
||||
|
||||
#ifndef CLOCK_INVALID
|
||||
#define CLOCK_INVALID -1
|
||||
#endif
|
||||
|
||||
/* When glibc offers the syscall, this will go away. */
|
||||
#include <sys/syscall.h>
|
||||
static int clock_adjtime(clockid_t id, struct timex *tx)
|
||||
{
|
||||
return syscall(__NR_clock_adjtime, id, tx);
|
||||
}
|
||||
|
||||
static clockid_t get_clockid(int fd)
|
||||
{
|
||||
#define CLOCKFD 3
|
||||
#define FD_TO_CLOCKID(fd) ((~(clockid_t) (fd) << 3) | CLOCKFD)
|
||||
|
||||
return FD_TO_CLOCKID(fd);
|
||||
}
|
||||
|
||||
static void handle_alarm(int s)
|
||||
{
|
||||
printf("received signal %d\n", s);
|
||||
}
|
||||
|
||||
static int install_handler(int signum, void (*handler)(int))
|
||||
{
|
||||
struct sigaction action;
|
||||
sigset_t mask;
|
||||
|
||||
/* Unblock the signal. */
|
||||
sigemptyset(&mask);
|
||||
sigaddset(&mask, signum);
|
||||
sigprocmask(SIG_UNBLOCK, &mask, NULL);
|
||||
|
||||
/* Install the signal handler. */
|
||||
action.sa_handler = handler;
|
||||
action.sa_flags = 0;
|
||||
sigemptyset(&action.sa_mask);
|
||||
sigaction(signum, &action, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static long ppb_to_scaled_ppm(int ppb)
|
||||
{
|
||||
/*
|
||||
* The 'freq' field in the 'struct timex' is in parts per
|
||||
* million, but with a 16 bit binary fractional field.
|
||||
* Instead of calculating either one of
|
||||
*
|
||||
* scaled_ppm = (ppb / 1000) << 16 [1]
|
||||
* scaled_ppm = (ppb << 16) / 1000 [2]
|
||||
*
|
||||
* we simply use double precision math, in order to avoid the
|
||||
* truncation in [1] and the possible overflow in [2].
|
||||
*/
|
||||
return (long) (ppb * 65.536);
|
||||
}
|
||||
|
||||
static void usage(char *progname)
|
||||
{
|
||||
fprintf(stderr,
|
||||
"usage: %s [options]\n"
|
||||
" -a val request a one-shot alarm after 'val' seconds\n"
|
||||
" -A val request a periodic alarm every 'val' seconds\n"
|
||||
" -c query the ptp clock's capabilities\n"
|
||||
" -d name device to open\n"
|
||||
" -e val read 'val' external time stamp events\n"
|
||||
" -f val adjust the ptp clock frequency by 'val' ppb\n"
|
||||
" -g get the ptp clock time\n"
|
||||
" -h prints this message\n"
|
||||
" -p val enable output with a period of 'val' nanoseconds\n"
|
||||
" -P val enable or disable (val=1|0) the system clock PPS\n"
|
||||
" -s set the ptp clock time from the system time\n"
|
||||
" -S set the system time from the ptp clock time\n"
|
||||
" -t val shift the ptp clock time by 'val' seconds\n",
|
||||
progname);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct ptp_clock_caps caps;
|
||||
struct ptp_extts_event event;
|
||||
struct ptp_extts_request extts_request;
|
||||
struct ptp_perout_request perout_request;
|
||||
struct timespec ts;
|
||||
struct timex tx;
|
||||
|
||||
static timer_t timerid;
|
||||
struct itimerspec timeout;
|
||||
struct sigevent sigevent;
|
||||
|
||||
char *progname;
|
||||
int c, cnt, fd;
|
||||
|
||||
char *device = DEVICE;
|
||||
clockid_t clkid;
|
||||
int adjfreq = 0x7fffffff;
|
||||
int adjtime = 0;
|
||||
int capabilities = 0;
|
||||
int extts = 0;
|
||||
int gettime = 0;
|
||||
int oneshot = 0;
|
||||
int periodic = 0;
|
||||
int perout = -1;
|
||||
int pps = -1;
|
||||
int settime = 0;
|
||||
|
||||
progname = strrchr(argv[0], '/');
|
||||
progname = progname ? 1+progname : argv[0];
|
||||
while (EOF != (c = getopt(argc, argv, "a:A:cd:e:f:ghp:P:sSt:v"))) {
|
||||
switch (c) {
|
||||
case 'a':
|
||||
oneshot = atoi(optarg);
|
||||
break;
|
||||
case 'A':
|
||||
periodic = atoi(optarg);
|
||||
break;
|
||||
case 'c':
|
||||
capabilities = 1;
|
||||
break;
|
||||
case 'd':
|
||||
device = optarg;
|
||||
break;
|
||||
case 'e':
|
||||
extts = atoi(optarg);
|
||||
break;
|
||||
case 'f':
|
||||
adjfreq = atoi(optarg);
|
||||
break;
|
||||
case 'g':
|
||||
gettime = 1;
|
||||
break;
|
||||
case 'p':
|
||||
perout = atoi(optarg);
|
||||
break;
|
||||
case 'P':
|
||||
pps = atoi(optarg);
|
||||
break;
|
||||
case 's':
|
||||
settime = 1;
|
||||
break;
|
||||
case 'S':
|
||||
settime = 2;
|
||||
break;
|
||||
case 't':
|
||||
adjtime = atoi(optarg);
|
||||
break;
|
||||
case 'h':
|
||||
usage(progname);
|
||||
return 0;
|
||||
case '?':
|
||||
default:
|
||||
usage(progname);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
fd = open(device, O_RDWR);
|
||||
if (fd < 0) {
|
||||
fprintf(stderr, "opening %s: %s\n", device, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
clkid = get_clockid(fd);
|
||||
if (CLOCK_INVALID == clkid) {
|
||||
fprintf(stderr, "failed to read clock id\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (capabilities) {
|
||||
if (ioctl(fd, PTP_CLOCK_GETCAPS, &caps)) {
|
||||
perror("PTP_CLOCK_GETCAPS");
|
||||
} else {
|
||||
printf("capabilities:\n"
|
||||
" %d maximum frequency adjustment (ppb)\n"
|
||||
" %d programmable alarms\n"
|
||||
" %d external time stamp channels\n"
|
||||
" %d programmable periodic signals\n"
|
||||
" %d pulse per second\n",
|
||||
caps.max_adj,
|
||||
caps.n_alarm,
|
||||
caps.n_ext_ts,
|
||||
caps.n_per_out,
|
||||
caps.pps);
|
||||
}
|
||||
}
|
||||
|
||||
if (0x7fffffff != adjfreq) {
|
||||
memset(&tx, 0, sizeof(tx));
|
||||
tx.modes = ADJ_FREQUENCY;
|
||||
tx.freq = ppb_to_scaled_ppm(adjfreq);
|
||||
if (clock_adjtime(clkid, &tx)) {
|
||||
perror("clock_adjtime");
|
||||
} else {
|
||||
puts("frequency adjustment okay");
|
||||
}
|
||||
}
|
||||
|
||||
if (adjtime) {
|
||||
memset(&tx, 0, sizeof(tx));
|
||||
tx.modes = ADJ_SETOFFSET;
|
||||
tx.time.tv_sec = adjtime;
|
||||
tx.time.tv_usec = 0;
|
||||
if (clock_adjtime(clkid, &tx) < 0) {
|
||||
perror("clock_adjtime");
|
||||
} else {
|
||||
puts("time shift okay");
|
||||
}
|
||||
}
|
||||
|
||||
if (gettime) {
|
||||
if (clock_gettime(clkid, &ts)) {
|
||||
perror("clock_gettime");
|
||||
} else {
|
||||
printf("clock time: %ld.%09ld or %s",
|
||||
ts.tv_sec, ts.tv_nsec, ctime(&ts.tv_sec));
|
||||
}
|
||||
}
|
||||
|
||||
if (settime == 1) {
|
||||
clock_gettime(CLOCK_REALTIME, &ts);
|
||||
if (clock_settime(clkid, &ts)) {
|
||||
perror("clock_settime");
|
||||
} else {
|
||||
puts("set time okay");
|
||||
}
|
||||
}
|
||||
|
||||
if (settime == 2) {
|
||||
clock_gettime(clkid, &ts);
|
||||
if (clock_settime(CLOCK_REALTIME, &ts)) {
|
||||
perror("clock_settime");
|
||||
} else {
|
||||
puts("set time okay");
|
||||
}
|
||||
}
|
||||
|
||||
if (extts) {
|
||||
memset(&extts_request, 0, sizeof(extts_request));
|
||||
extts_request.index = 0;
|
||||
extts_request.flags = PTP_ENABLE_FEATURE;
|
||||
if (ioctl(fd, PTP_EXTTS_REQUEST, &extts_request)) {
|
||||
perror("PTP_EXTTS_REQUEST");
|
||||
extts = 0;
|
||||
} else {
|
||||
puts("external time stamp request okay");
|
||||
}
|
||||
for (; extts; extts--) {
|
||||
cnt = read(fd, &event, sizeof(event));
|
||||
if (cnt != sizeof(event)) {
|
||||
perror("read");
|
||||
break;
|
||||
}
|
||||
printf("event index %u at %lld.%09u\n", event.index,
|
||||
event.t.sec, event.t.nsec);
|
||||
fflush(stdout);
|
||||
}
|
||||
/* Disable the feature again. */
|
||||
extts_request.flags = 0;
|
||||
if (ioctl(fd, PTP_EXTTS_REQUEST, &extts_request)) {
|
||||
perror("PTP_EXTTS_REQUEST");
|
||||
}
|
||||
}
|
||||
|
||||
if (oneshot) {
|
||||
install_handler(SIGALRM, handle_alarm);
|
||||
/* Create a timer. */
|
||||
sigevent.sigev_notify = SIGEV_SIGNAL;
|
||||
sigevent.sigev_signo = SIGALRM;
|
||||
if (timer_create(clkid, &sigevent, &timerid)) {
|
||||
perror("timer_create");
|
||||
return -1;
|
||||
}
|
||||
/* Start the timer. */
|
||||
memset(&timeout, 0, sizeof(timeout));
|
||||
timeout.it_value.tv_sec = oneshot;
|
||||
if (timer_settime(timerid, 0, &timeout, NULL)) {
|
||||
perror("timer_settime");
|
||||
return -1;
|
||||
}
|
||||
pause();
|
||||
timer_delete(timerid);
|
||||
}
|
||||
|
||||
if (periodic) {
|
||||
install_handler(SIGALRM, handle_alarm);
|
||||
/* Create a timer. */
|
||||
sigevent.sigev_notify = SIGEV_SIGNAL;
|
||||
sigevent.sigev_signo = SIGALRM;
|
||||
if (timer_create(clkid, &sigevent, &timerid)) {
|
||||
perror("timer_create");
|
||||
return -1;
|
||||
}
|
||||
/* Start the timer. */
|
||||
memset(&timeout, 0, sizeof(timeout));
|
||||
timeout.it_interval.tv_sec = periodic;
|
||||
timeout.it_value.tv_sec = periodic;
|
||||
if (timer_settime(timerid, 0, &timeout, NULL)) {
|
||||
perror("timer_settime");
|
||||
return -1;
|
||||
}
|
||||
while (1) {
|
||||
pause();
|
||||
}
|
||||
timer_delete(timerid);
|
||||
}
|
||||
|
||||
if (perout >= 0) {
|
||||
if (clock_gettime(clkid, &ts)) {
|
||||
perror("clock_gettime");
|
||||
return -1;
|
||||
}
|
||||
memset(&perout_request, 0, sizeof(perout_request));
|
||||
perout_request.index = 0;
|
||||
perout_request.start.sec = ts.tv_sec + 2;
|
||||
perout_request.start.nsec = 0;
|
||||
perout_request.period.sec = 0;
|
||||
perout_request.period.nsec = perout;
|
||||
if (ioctl(fd, PTP_PEROUT_REQUEST, &perout_request)) {
|
||||
perror("PTP_PEROUT_REQUEST");
|
||||
} else {
|
||||
puts("periodic output request okay");
|
||||
}
|
||||
}
|
||||
|
||||
if (pps != -1) {
|
||||
int enable = pps ? 1 : 0;
|
||||
if (ioctl(fd, PTP_ENABLE_PPS, enable)) {
|
||||
perror("PTP_ENABLE_PPS");
|
||||
} else {
|
||||
puts("pps for system time request okay");
|
||||
}
|
||||
}
|
||||
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
# PTP 1588 clock support - User space test program
|
||||
#
|
||||
# Copyright (C) 2010 OMICRON electronics GmbH
|
||||
#
|
||||
# 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
CC = $(CROSS_COMPILE)gcc
|
||||
INC = -I$(KBUILD_OUTPUT)/usr/include
|
||||
CFLAGS = -Wall $(INC)
|
||||
LDLIBS = -lrt
|
||||
PROGS = testptp
|
||||
|
||||
all: $(PROGS)
|
||||
|
||||
testptp: testptp.o
|
||||
|
||||
clean:
|
||||
rm -f testptp.o
|
||||
|
||||
distclean: clean
|
||||
rm -f $(PROGS)
|
|
@ -1182,6 +1182,16 @@
|
|||
forge.net/> and explains these in detail, as well as
|
||||
some other issues.
|
||||
|
||||
There is also a related point-to-point only "ucast" transport.
|
||||
This is useful when your network does not support multicast, and
|
||||
all network connections are simple point to point links.
|
||||
|
||||
The full set of command line options for this transport are
|
||||
|
||||
|
||||
ethn=ucast,ethernet address,remote address,listen port,remote port
|
||||
|
||||
|
||||
|
||||
|
||||
66..66.. TTUUNN//TTAAPP wwiitthh tthhee uummll__nneett hheellppeerr
|
||||
|
|
|
@ -66,7 +66,7 @@ in some cases it is not really needed. Eg, vm_start is modified by
|
|||
expand_stack(), it is hard to come up with a destructive scenario without
|
||||
having the vmlist protection in this case.
|
||||
|
||||
The page_table_lock nests with the inode i_mmap_lock and the kmem cache
|
||||
The page_table_lock nests with the inode i_mmap_mutex and the kmem cache
|
||||
c_spinlock spinlocks. This is okay, since the kmem code asks for pages after
|
||||
dropping c_spinlock. The page_table_lock also nests with pagecache_lock and
|
||||
pagemap_lru_lock spinlocks, and no code asks for memory with these locks
|
||||
|
|
43
MAINTAINERS
43
MAINTAINERS
|
@ -287,35 +287,35 @@ F: sound/pci/ad1889.*
|
|||
|
||||
AD525X ANALOG DEVICES DIGITAL POTENTIOMETERS DRIVER
|
||||
M: Michael Hennerich <michael.hennerich@analog.com>
|
||||
L: device-driver-devel@blackfin.uclinux.org
|
||||
L: device-drivers-devel@blackfin.uclinux.org
|
||||
W: http://wiki.analog.com/AD5254
|
||||
S: Supported
|
||||
F: drivers/misc/ad525x_dpot.c
|
||||
|
||||
AD5398 CURRENT REGULATOR DRIVER (AD5398/AD5821)
|
||||
M: Michael Hennerich <michael.hennerich@analog.com>
|
||||
L: device-driver-devel@blackfin.uclinux.org
|
||||
L: device-drivers-devel@blackfin.uclinux.org
|
||||
W: http://wiki.analog.com/AD5398
|
||||
S: Supported
|
||||
F: drivers/regulator/ad5398.c
|
||||
|
||||
AD714X CAPACITANCE TOUCH SENSOR DRIVER (AD7142/3/7/8/7A)
|
||||
M: Michael Hennerich <michael.hennerich@analog.com>
|
||||
L: device-driver-devel@blackfin.uclinux.org
|
||||
L: device-drivers-devel@blackfin.uclinux.org
|
||||
W: http://wiki.analog.com/AD7142
|
||||
S: Supported
|
||||
F: drivers/input/misc/ad714x.c
|
||||
|
||||
AD7877 TOUCHSCREEN DRIVER
|
||||
M: Michael Hennerich <michael.hennerich@analog.com>
|
||||
L: device-driver-devel@blackfin.uclinux.org
|
||||
L: device-drivers-devel@blackfin.uclinux.org
|
||||
W: http://wiki.analog.com/AD7877
|
||||
S: Supported
|
||||
F: drivers/input/touchscreen/ad7877.c
|
||||
|
||||
AD7879 TOUCHSCREEN DRIVER (AD7879/AD7889)
|
||||
M: Michael Hennerich <michael.hennerich@analog.com>
|
||||
L: device-driver-devel@blackfin.uclinux.org
|
||||
L: device-drivers-devel@blackfin.uclinux.org
|
||||
W: http://wiki.analog.com/AD7879
|
||||
S: Supported
|
||||
F: drivers/input/touchscreen/ad7879.c
|
||||
|
@ -341,7 +341,7 @@ F: drivers/net/wireless/adm8211.*
|
|||
|
||||
ADP5520 BACKLIGHT DRIVER WITH IO EXPANDER (ADP5520/ADP5501)
|
||||
M: Michael Hennerich <michael.hennerich@analog.com>
|
||||
L: device-driver-devel@blackfin.uclinux.org
|
||||
L: device-drivers-devel@blackfin.uclinux.org
|
||||
W: http://wiki.analog.com/ADP5520
|
||||
S: Supported
|
||||
F: drivers/mfd/adp5520.c
|
||||
|
@ -352,7 +352,7 @@ F: drivers/input/keyboard/adp5520-keys.c
|
|||
|
||||
ADP5588 QWERTY KEYPAD AND IO EXPANDER DRIVER (ADP5588/ADP5587)
|
||||
M: Michael Hennerich <michael.hennerich@analog.com>
|
||||
L: device-driver-devel@blackfin.uclinux.org
|
||||
L: device-drivers-devel@blackfin.uclinux.org
|
||||
W: http://wiki.analog.com/ADP5588
|
||||
S: Supported
|
||||
F: drivers/input/keyboard/adp5588-keys.c
|
||||
|
@ -360,7 +360,7 @@ F: drivers/gpio/adp5588-gpio.c
|
|||
|
||||
ADP8860 BACKLIGHT DRIVER (ADP8860/ADP8861/ADP8863)
|
||||
M: Michael Hennerich <michael.hennerich@analog.com>
|
||||
L: device-driver-devel@blackfin.uclinux.org
|
||||
L: device-drivers-devel@blackfin.uclinux.org
|
||||
W: http://wiki.analog.com/ADP8860
|
||||
S: Supported
|
||||
F: drivers/video/backlight/adp8860_bl.c
|
||||
|
@ -387,7 +387,7 @@ F: drivers/hwmon/adt7475.c
|
|||
|
||||
ADXL34X THREE-AXIS DIGITAL ACCELEROMETER DRIVER (ADXL345/ADXL346)
|
||||
M: Michael Hennerich <michael.hennerich@analog.com>
|
||||
L: device-driver-devel@blackfin.uclinux.org
|
||||
L: device-drivers-devel@blackfin.uclinux.org
|
||||
W: http://wiki.analog.com/ADXL345
|
||||
S: Supported
|
||||
F: drivers/input/misc/adxl34x.c
|
||||
|
@ -483,6 +483,13 @@ F: drivers/tty/serial/altera_jtaguart.c
|
|||
F: include/linux/altera_uart.h
|
||||
F: include/linux/altera_jtaguart.h
|
||||
|
||||
AMD FAM15H PROCESSOR POWER MONITORING DRIVER
|
||||
M: Andreas Herrmann <andreas.herrmann3@amd.com>
|
||||
L: lm-sensors@lm-sensors.org
|
||||
S: Maintained
|
||||
F: Documentation/hwmon/fam15h_power
|
||||
F: drivers/hwmon/fam15h_power.c
|
||||
|
||||
AMD GEODE CS5536 USB DEVICE CONTROLLER DRIVER
|
||||
M: Thomas Dahlmann <dahlmann.thomas@arcor.de>
|
||||
L: linux-geode@lists.infradead.org (moderated for non-subscribers)
|
||||
|
@ -526,7 +533,7 @@ S: Maintained
|
|||
F: drivers/infiniband/hw/amso1100/
|
||||
|
||||
ANALOG DEVICES INC ASOC CODEC DRIVERS
|
||||
L: device-driver-devel@blackfin.uclinux.org
|
||||
L: device-drivers-devel@blackfin.uclinux.org
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
W: http://wiki.analog.com/
|
||||
S: Supported
|
||||
|
@ -2034,9 +2041,8 @@ F: net/ax25/ax25_timer.c
|
|||
F: net/ax25/sysctl_net_ax25.c
|
||||
|
||||
DAVICOM FAST ETHERNET (DMFE) NETWORK DRIVER
|
||||
M: Tobias Ringstrom <tori@unhappy.mine.nu>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
S: Orphan
|
||||
F: Documentation/networking/dmfe.txt
|
||||
F: drivers/net/tulip/dmfe.c
|
||||
|
||||
|
@ -3591,10 +3597,9 @@ F: Documentation/hwmon/k8temp
|
|||
F: drivers/hwmon/k8temp.c
|
||||
|
||||
KCONFIG
|
||||
M: Roman Zippel <zippel@linux-m68k.org>
|
||||
M: Michal Marek <mmarek@suse.cz>
|
||||
L: linux-kbuild@vger.kernel.org
|
||||
Q: http://patchwork.kernel.org/project/linux-kbuild/list/
|
||||
S: Maintained
|
||||
S: Odd Fixes
|
||||
F: Documentation/kbuild/kconfig-language.txt
|
||||
F: scripts/kconfig/
|
||||
|
||||
|
@ -3898,7 +3903,6 @@ F: drivers/*/*/*pasemi*
|
|||
LINUX SECURITY MODULE (LSM) FRAMEWORK
|
||||
M: Chris Wright <chrisw@sous-sol.org>
|
||||
L: linux-security-module@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/chrisw/lsm-2.6.git
|
||||
S: Supported
|
||||
|
||||
LIS3LV02D ACCELEROMETER DRIVER
|
||||
|
@ -6796,6 +6800,13 @@ L: lm-sensors@lm-sensors.org
|
|||
S: Maintained
|
||||
F: drivers/hwmon/vt8231.c
|
||||
|
||||
VUB300 USB to SDIO/SD/MMC bridge chip
|
||||
M: Tony Olech <tony.olech@elandigitalsystems.com>
|
||||
L: linux-mmc@vger.kernel.org
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/mmc/host/vub300.c
|
||||
|
||||
W1 DALLAS'S 1-WIRE BUS
|
||||
M: Evgeniy Polyakov <johnpol@2ka.mipt.ru>
|
||||
S: Maintained
|
||||
|
|
17
Makefile
17
Makefile
|
@ -220,6 +220,14 @@ ifeq ($(ARCH),sh64)
|
|||
SRCARCH := sh
|
||||
endif
|
||||
|
||||
# Additional ARCH settings for tile
|
||||
ifeq ($(ARCH),tilepro)
|
||||
SRCARCH := tile
|
||||
endif
|
||||
ifeq ($(ARCH),tilegx)
|
||||
SRCARCH := tile
|
||||
endif
|
||||
|
||||
# Where to locate arch specific headers
|
||||
hdr-arch := $(SRCARCH)
|
||||
|
||||
|
@ -1009,7 +1017,8 @@ include/generated/utsrelease.h: include/config/kernel.release FORCE
|
|||
|
||||
PHONY += headerdep
|
||||
headerdep:
|
||||
$(Q)find include/ -name '*.h' | xargs --max-args 1 scripts/headerdep.pl
|
||||
$(Q)find $(srctree)/include/ -name '*.h' | xargs --max-args 1 \
|
||||
$(srctree)/scripts/headerdep.pl -I$(srctree)/include
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
@ -1417,13 +1426,15 @@ tags TAGS cscope gtags: FORCE
|
|||
# Scripts to check various things for consistency
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
PHONY += includecheck versioncheck coccicheck namespacecheck export_report
|
||||
|
||||
includecheck:
|
||||
find * $(RCS_FIND_IGNORE) \
|
||||
find $(srctree)/* $(RCS_FIND_IGNORE) \
|
||||
-name '*.[hcS]' -type f -print | sort \
|
||||
| xargs $(PERL) -w $(srctree)/scripts/checkincludes.pl
|
||||
|
||||
versioncheck:
|
||||
find * $(RCS_FIND_IGNORE) \
|
||||
find $(srctree)/* $(RCS_FIND_IGNORE) \
|
||||
-name '*.[hcS]' -type f -print | sort \
|
||||
| xargs $(PERL) -w $(srctree)/scripts/checkversion.pl
|
||||
|
||||
|
|
|
@ -175,4 +175,7 @@ config HAVE_ARCH_JUMP_LABEL
|
|||
config HAVE_ARCH_MUTEX_CPU_RELAX
|
||||
bool
|
||||
|
||||
config HAVE_RCU_TABLE_FREE
|
||||
bool
|
||||
|
||||
source "kernel/gcov/Kconfig"
|
||||
|
|
|
@ -12,6 +12,7 @@ config ALPHA
|
|||
select GENERIC_IRQ_PROBE
|
||||
select AUTO_IRQ_AFFINITY if SMP
|
||||
select GENERIC_IRQ_SHOW
|
||||
select ARCH_WANT_OPTIONAL_GPIOLIB
|
||||
help
|
||||
The Alpha is a 64-bit general-purpose processor designed and
|
||||
marketed by the Digital Equipment Corporation of blessed memory,
|
||||
|
@ -51,6 +52,9 @@ config GENERIC_CALIBRATE_DELAY
|
|||
config GENERIC_CMOS_UPDATE
|
||||
def_bool y
|
||||
|
||||
config GENERIC_GPIO
|
||||
def_bool y
|
||||
|
||||
config ZONE_DMA
|
||||
bool
|
||||
default y
|
||||
|
|
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
* Generic GPIO API implementation for Alpha.
|
||||
*
|
||||
* A stright copy of that for PowerPC which was:
|
||||
*
|
||||
* Copyright (c) 2007-2008 MontaVista Software, Inc.
|
||||
*
|
||||
* Author: Anton Vorontsov <avorontsov@ru.mvista.com>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _ASM_ALPHA_GPIO_H
|
||||
#define _ASM_ALPHA_GPIO_H
|
||||
|
||||
#include <linux/errno.h>
|
||||
#include <asm-generic/gpio.h>
|
||||
|
||||
#ifdef CONFIG_GPIOLIB
|
||||
|
||||
/*
|
||||
* We don't (yet) implement inlined/rapid versions for on-chip gpios.
|
||||
* Just call gpiolib.
|
||||
*/
|
||||
static inline int gpio_get_value(unsigned int gpio)
|
||||
{
|
||||
return __gpio_get_value(gpio);
|
||||
}
|
||||
|
||||
static inline void gpio_set_value(unsigned int gpio, int value)
|
||||
{
|
||||
__gpio_set_value(gpio, value);
|
||||
}
|
||||
|
||||
static inline int gpio_cansleep(unsigned int gpio)
|
||||
{
|
||||
return __gpio_cansleep(gpio);
|
||||
}
|
||||
|
||||
static inline int gpio_to_irq(unsigned int gpio)
|
||||
{
|
||||
return __gpio_to_irq(gpio);
|
||||
}
|
||||
|
||||
static inline int irq_to_gpio(unsigned int irq)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_GPIOLIB */
|
||||
|
||||
#endif /* _ASM_ALPHA_GPIO_H */
|
|
@ -39,8 +39,6 @@ struct cpuinfo_alpha {
|
|||
|
||||
extern struct cpuinfo_alpha cpu_data[NR_CPUS];
|
||||
|
||||
#define PROC_CHANGE_PENALTY 20
|
||||
|
||||
#define hard_smp_processor_id() __hard_smp_processor_id()
|
||||
#define raw_smp_processor_id() (current_thread_info()->cpu)
|
||||
|
||||
|
|
|
@ -121,7 +121,7 @@ common_shutdown_1(void *generic_ptr)
|
|||
/* Wait for the secondaries to halt. */
|
||||
set_cpu_present(boot_cpuid, false);
|
||||
set_cpu_possible(boot_cpuid, false);
|
||||
while (cpus_weight(cpu_present_map))
|
||||
while (cpumask_weight(cpu_present_mask))
|
||||
barrier();
|
||||
#endif
|
||||
|
||||
|
|
|
@ -1257,7 +1257,7 @@ show_cpuinfo(struct seq_file *f, void *slot)
|
|||
#ifdef CONFIG_SMP
|
||||
seq_printf(f, "cpus active\t\t: %u\n"
|
||||
"cpu active mask\t\t: %016lx\n",
|
||||
num_online_cpus(), cpus_addr(cpu_possible_map)[0]);
|
||||
num_online_cpus(), cpumask_bits(cpu_possible_mask)[0]);
|
||||
#endif
|
||||
|
||||
show_cache_size (f, "L1 Icache", alpha_l1i_cacheshape);
|
||||
|
|
|
@ -451,7 +451,7 @@ setup_smp(void)
|
|||
}
|
||||
|
||||
printk(KERN_INFO "SMP: %d CPUs probed -- cpu_present_map = %lx\n",
|
||||
smp_num_probed, cpu_present_map.bits[0]);
|
||||
smp_num_probed, cpumask_bits(cpu_present_mask)[0]);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -629,8 +629,9 @@ smp_send_reschedule(int cpu)
|
|||
void
|
||||
smp_send_stop(void)
|
||||
{
|
||||
cpumask_t to_whom = cpu_possible_map;
|
||||
cpu_clear(smp_processor_id(), to_whom);
|
||||
cpumask_t to_whom;
|
||||
cpumask_copy(&to_whom, cpu_possible_mask);
|
||||
cpumask_clear_cpu(smp_processor_id(), &to_whom);
|
||||
#ifdef DEBUG_IPI_MSG
|
||||
if (hard_smp_processor_id() != boot_cpu_id)
|
||||
printk(KERN_WARNING "smp_send_stop: Not on boot cpu.\n");
|
||||
|
|
|
@ -140,7 +140,7 @@ cpu_set_irq_affinity(unsigned int irq, cpumask_t affinity)
|
|||
|
||||
for (cpu = 0; cpu < 4; cpu++) {
|
||||
unsigned long aff = cpu_irq_affinity[cpu];
|
||||
if (cpu_isset(cpu, affinity))
|
||||
if (cpumask_test_cpu(cpu, &affinity))
|
||||
aff |= 1UL << irq;
|
||||
else
|
||||
aff &= ~(1UL << irq);
|
||||
|
|
|
@ -65,10 +65,11 @@ titan_update_irq_hw(unsigned long mask)
|
|||
register int bcpu = boot_cpuid;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
cpumask_t cpm = cpu_present_map;
|
||||
cpumask_t cpm;
|
||||
volatile unsigned long *dim0, *dim1, *dim2, *dim3;
|
||||
unsigned long mask0, mask1, mask2, mask3, dummy;
|
||||
|
||||
cpumask_copy(&cpm, cpu_present_mask);
|
||||
mask &= ~isa_enable;
|
||||
mask0 = mask & titan_cpu_irq_affinity[0];
|
||||
mask1 = mask & titan_cpu_irq_affinity[1];
|
||||
|
@ -84,10 +85,10 @@ titan_update_irq_hw(unsigned long mask)
|
|||
dim1 = &cchip->dim1.csr;
|
||||
dim2 = &cchip->dim2.csr;
|
||||
dim3 = &cchip->dim3.csr;
|
||||
if (!cpu_isset(0, cpm)) dim0 = &dummy;
|
||||
if (!cpu_isset(1, cpm)) dim1 = &dummy;
|
||||
if (!cpu_isset(2, cpm)) dim2 = &dummy;
|
||||
if (!cpu_isset(3, cpm)) dim3 = &dummy;
|
||||
if (!cpumask_test_cpu(0, &cpm)) dim0 = &dummy;
|
||||
if (!cpumask_test_cpu(1, &cpm)) dim1 = &dummy;
|
||||
if (!cpumask_test_cpu(2, &cpm)) dim2 = &dummy;
|
||||
if (!cpumask_test_cpu(3, &cpm)) dim3 = &dummy;
|
||||
|
||||
*dim0 = mask0;
|
||||
*dim1 = mask1;
|
||||
|
@ -137,7 +138,7 @@ titan_cpu_set_irq_affinity(unsigned int irq, cpumask_t affinity)
|
|||
int cpu;
|
||||
|
||||
for (cpu = 0; cpu < 4; cpu++) {
|
||||
if (cpu_isset(cpu, affinity))
|
||||
if (cpumask_test_cpu(cpu, &affinity))
|
||||
titan_cpu_irq_affinity[cpu] |= 1UL << irq;
|
||||
else
|
||||
titan_cpu_irq_affinity[cpu] &= ~(1UL << irq);
|
||||
|
|
|
@ -32,8 +32,6 @@
|
|||
#include <asm/console.h>
|
||||
#include <asm/tlb.h>
|
||||
|
||||
DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
|
||||
|
||||
extern void die_if_kernel(char *,struct pt_regs *,long);
|
||||
|
||||
static struct pcb_struct original_pcb;
|
||||
|
|
|
@ -313,6 +313,7 @@ void __init paging_init(void)
|
|||
zones_size[ZONE_DMA] = dma_local_pfn;
|
||||
zones_size[ZONE_NORMAL] = (end_pfn - start_pfn) - dma_local_pfn;
|
||||
}
|
||||
node_set_state(nid, N_NORMAL_MEMORY);
|
||||
free_area_init_node(nid, zones_size, start_pfn, NULL);
|
||||
}
|
||||
|
||||
|
|
|
@ -63,13 +63,6 @@ config DEBUG_USER
|
|||
8 - SIGSEGV faults
|
||||
16 - SIGBUS faults
|
||||
|
||||
config DEBUG_STACK_USAGE
|
||||
bool "Enable stack utilization instrumentation"
|
||||
depends on DEBUG_KERNEL
|
||||
help
|
||||
Enables the display of the minimum amount of free stack which each
|
||||
task has ever had available in the sysrq-T output.
|
||||
|
||||
# These options are only for real kernel hackers who want to get their hands dirty.
|
||||
config DEBUG_LL
|
||||
bool "Kernel low-level debugging functions"
|
||||
|
|
|
@ -20,12 +20,6 @@
|
|||
|
||||
#define raw_smp_processor_id() (current_thread_info()->cpu)
|
||||
|
||||
/*
|
||||
* at the moment, there's not a big penalty for changing CPUs
|
||||
* (the >big< penalty is running SMP in the first place)
|
||||
*/
|
||||
#define PROC_CHANGE_PENALTY 15
|
||||
|
||||
struct seq_file;
|
||||
|
||||
/*
|
||||
|
|
|
@ -41,12 +41,12 @@
|
|||
*/
|
||||
#if defined(CONFIG_SMP) || defined(CONFIG_CPU_32v7)
|
||||
#define tlb_fast_mode(tlb) 0
|
||||
#define FREE_PTE_NR 500
|
||||
#else
|
||||
#define tlb_fast_mode(tlb) 1
|
||||
#define FREE_PTE_NR 0
|
||||
#endif
|
||||
|
||||
#define MMU_GATHER_BUNDLE 8
|
||||
|
||||
/*
|
||||
* TLB handling. This allows us to remove pages from the page
|
||||
* tables, and efficiently handle the TLB issues.
|
||||
|
@ -58,7 +58,9 @@ struct mmu_gather {
|
|||
unsigned long range_start;
|
||||
unsigned long range_end;
|
||||
unsigned int nr;
|
||||
struct page *pages[FREE_PTE_NR];
|
||||
unsigned int max;
|
||||
struct page **pages;
|
||||
struct page *local[MMU_GATHER_BUNDLE];
|
||||
};
|
||||
|
||||
DECLARE_PER_CPU(struct mmu_gather, mmu_gathers);
|
||||
|
@ -97,26 +99,37 @@ static inline void tlb_add_flush(struct mmu_gather *tlb, unsigned long addr)
|
|||
}
|
||||
}
|
||||
|
||||
static inline void __tlb_alloc_page(struct mmu_gather *tlb)
|
||||
{
|
||||
unsigned long addr = __get_free_pages(GFP_NOWAIT | __GFP_NOWARN, 0);
|
||||
|
||||
if (addr) {
|
||||
tlb->pages = (void *)addr;
|
||||
tlb->max = PAGE_SIZE / sizeof(struct page *);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void tlb_flush_mmu(struct mmu_gather *tlb)
|
||||
{
|
||||
tlb_flush(tlb);
|
||||
if (!tlb_fast_mode(tlb)) {
|
||||
free_pages_and_swap_cache(tlb->pages, tlb->nr);
|
||||
tlb->nr = 0;
|
||||
if (tlb->pages == tlb->local)
|
||||
__tlb_alloc_page(tlb);
|
||||
}
|
||||
}
|
||||
|
||||
static inline struct mmu_gather *
|
||||
tlb_gather_mmu(struct mm_struct *mm, unsigned int full_mm_flush)
|
||||
static inline void
|
||||
tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, unsigned int fullmm)
|
||||
{
|
||||
struct mmu_gather *tlb = &get_cpu_var(mmu_gathers);
|
||||
|
||||
tlb->mm = mm;
|
||||
tlb->fullmm = full_mm_flush;
|
||||
tlb->fullmm = fullmm;
|
||||
tlb->vma = NULL;
|
||||
tlb->max = ARRAY_SIZE(tlb->local);
|
||||
tlb->pages = tlb->local;
|
||||
tlb->nr = 0;
|
||||
|
||||
return tlb;
|
||||
__tlb_alloc_page(tlb);
|
||||
}
|
||||
|
||||
static inline void
|
||||
|
@ -127,7 +140,8 @@ tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end)
|
|||
/* keep the page table cache within bounds */
|
||||
check_pgt_cache();
|
||||
|
||||
put_cpu_var(mmu_gathers);
|
||||
if (tlb->pages != tlb->local)
|
||||
free_pages((unsigned long)tlb->pages, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -162,15 +176,22 @@ tlb_end_vma(struct mmu_gather *tlb, struct vm_area_struct *vma)
|
|||
tlb_flush(tlb);
|
||||
}
|
||||
|
||||
static inline void tlb_remove_page(struct mmu_gather *tlb, struct page *page)
|
||||
static inline int __tlb_remove_page(struct mmu_gather *tlb, struct page *page)
|
||||
{
|
||||
if (tlb_fast_mode(tlb)) {
|
||||
free_page_and_swap_cache(page);
|
||||
} else {
|
||||
tlb->pages[tlb->nr++] = page;
|
||||
if (tlb->nr >= FREE_PTE_NR)
|
||||
tlb_flush_mmu(tlb);
|
||||
return 1; /* avoid calling tlb_flush_mmu */
|
||||
}
|
||||
|
||||
tlb->pages[tlb->nr++] = page;
|
||||
VM_BUG_ON(tlb->nr > tlb->max);
|
||||
return tlb->max - tlb->nr;
|
||||
}
|
||||
|
||||
static inline void tlb_remove_page(struct mmu_gather *tlb, struct page *page)
|
||||
{
|
||||
if (!__tlb_remove_page(tlb, page))
|
||||
tlb_flush_mmu(tlb);
|
||||
}
|
||||
|
||||
static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte,
|
||||
|
|
|
@ -0,0 +1,78 @@
|
|||
/*
|
||||
* PTP 1588 clock using the IXP46X
|
||||
*
|
||||
* Copyright (C) 2010 OMICRON electronics GmbH
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef _IXP46X_TS_H_
|
||||
#define _IXP46X_TS_H_
|
||||
|
||||
#define DEFAULT_ADDEND 0xF0000029
|
||||
#define TICKS_NS_SHIFT 4
|
||||
|
||||
struct ixp46x_channel_ctl {
|
||||
u32 ch_control; /* 0x40 Time Synchronization Channel Control */
|
||||
u32 ch_event; /* 0x44 Time Synchronization Channel Event */
|
||||
u32 tx_snap_lo; /* 0x48 Transmit Snapshot Low Register */
|
||||
u32 tx_snap_hi; /* 0x4C Transmit Snapshot High Register */
|
||||
u32 rx_snap_lo; /* 0x50 Receive Snapshot Low Register */
|
||||
u32 rx_snap_hi; /* 0x54 Receive Snapshot High Register */
|
||||
u32 src_uuid_lo; /* 0x58 Source UUID0 Low Register */
|
||||
u32 src_uuid_hi; /* 0x5C Sequence Identifier/Source UUID0 High */
|
||||
};
|
||||
|
||||
struct ixp46x_ts_regs {
|
||||
u32 control; /* 0x00 Time Sync Control Register */
|
||||
u32 event; /* 0x04 Time Sync Event Register */
|
||||
u32 addend; /* 0x08 Time Sync Addend Register */
|
||||
u32 accum; /* 0x0C Time Sync Accumulator Register */
|
||||
u32 test; /* 0x10 Time Sync Test Register */
|
||||
u32 unused; /* 0x14 */
|
||||
u32 rsystime_lo; /* 0x18 RawSystemTime_Low Register */
|
||||
u32 rsystime_hi; /* 0x1C RawSystemTime_High Register */
|
||||
u32 systime_lo; /* 0x20 SystemTime_Low Register */
|
||||
u32 systime_hi; /* 0x24 SystemTime_High Register */
|
||||
u32 trgt_lo; /* 0x28 TargetTime_Low Register */
|
||||
u32 trgt_hi; /* 0x2C TargetTime_High Register */
|
||||
u32 asms_lo; /* 0x30 Auxiliary Slave Mode Snapshot Low */
|
||||
u32 asms_hi; /* 0x34 Auxiliary Slave Mode Snapshot High */
|
||||
u32 amms_lo; /* 0x38 Auxiliary Master Mode Snapshot Low */
|
||||
u32 amms_hi; /* 0x3C Auxiliary Master Mode Snapshot High */
|
||||
|
||||
struct ixp46x_channel_ctl channel[3];
|
||||
};
|
||||
|
||||
/* 0x00 Time Sync Control Register Bits */
|
||||
#define TSCR_AMM (1<<3)
|
||||
#define TSCR_ASM (1<<2)
|
||||
#define TSCR_TTM (1<<1)
|
||||
#define TSCR_RST (1<<0)
|
||||
|
||||
/* 0x04 Time Sync Event Register Bits */
|
||||
#define TSER_SNM (1<<3)
|
||||
#define TSER_SNS (1<<2)
|
||||
#define TTIPEND (1<<1)
|
||||
|
||||
/* 0x40 Time Synchronization Channel Control Register Bits */
|
||||
#define MASTER_MODE (1<<0)
|
||||
#define TIMESTAMP_ALL (1<<1)
|
||||
|
||||
/* 0x44 Time Synchronization Channel Event Register Bits */
|
||||
#define TX_SNAPSHOT_LOCKED (1<<0)
|
||||
#define RX_SNAPSHOT_LOCKED (1<<1)
|
||||
|
||||
#endif
|
|
@ -37,8 +37,8 @@
|
|||
#include <plat/common.h>
|
||||
#include <plat/dma.h>
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat/display.h>
|
||||
#include <plat/panel-generic-dpi.h>
|
||||
#include <video/omapdss.h>
|
||||
#include <video/omap-panel-generic-dpi.h>
|
||||
|
||||
#include <plat/gpmc-smc91x.h>
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
#include <plat/usb.h>
|
||||
#include <plat/mmc.h>
|
||||
#include <plat/omap4-keypad.h>
|
||||
#include <plat/display.h>
|
||||
#include <video/omapdss.h>
|
||||
|
||||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
|
@ -680,6 +680,15 @@ static struct omap_dss_device sdp4430_hdmi_device = {
|
|||
.name = "hdmi",
|
||||
.driver_name = "hdmi_panel",
|
||||
.type = OMAP_DISPLAY_TYPE_HDMI,
|
||||
.clocks = {
|
||||
.dispc = {
|
||||
.dispc_fclk_src = OMAP_DSS_CLK_SRC_FCK,
|
||||
},
|
||||
.hdmi = {
|
||||
.regn = 15,
|
||||
.regm2 = 1,
|
||||
},
|
||||
},
|
||||
.platform_enable = sdp4430_panel_enable_hdmi,
|
||||
.platform_disable = sdp4430_panel_disable_hdmi,
|
||||
.channel = OMAP_DSS_CHANNEL_DIGIT,
|
||||
|
|
|
@ -34,8 +34,8 @@
|
|||
#include <plat/board.h>
|
||||
#include <plat/common.h>
|
||||
#include <plat/usb.h>
|
||||
#include <plat/display.h>
|
||||
#include <plat/panel-generic-dpi.h>
|
||||
#include <video/omapdss.h>
|
||||
#include <video/omap-panel-generic-dpi.h>
|
||||
|
||||
#include "mux.h"
|
||||
#include "control.h"
|
||||
|
|
|
@ -45,8 +45,8 @@
|
|||
#include <plat/nand.h>
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat/usb.h>
|
||||
#include <plat/display.h>
|
||||
#include <plat/panel-generic-dpi.h>
|
||||
#include <video/omapdss.h>
|
||||
#include <video/omap-panel-generic-dpi.h>
|
||||
#include <plat/mcspi.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
|
|
|
@ -45,8 +45,8 @@
|
|||
#include <plat/gpmc.h>
|
||||
#include <plat/nand.h>
|
||||
#include <plat/usb.h>
|
||||
#include <plat/display.h>
|
||||
#include <plat/panel-generic-dpi.h>
|
||||
#include <video/omapdss.h>
|
||||
#include <video/omap-panel-generic-dpi.h>
|
||||
|
||||
#include <plat/mcspi.h>
|
||||
#include <linux/input/matrix_keypad.h>
|
||||
|
|
|
@ -31,8 +31,8 @@
|
|||
#include <plat/common.h>
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat/usb.h>
|
||||
#include <plat/display.h>
|
||||
#include <plat/panel-generic-dpi.h>
|
||||
#include <video/omapdss.h>
|
||||
#include <video/omap-panel-generic-dpi.h>
|
||||
#include <plat/onenand.h>
|
||||
|
||||
#include "mux.h"
|
||||
|
|
|
@ -41,8 +41,8 @@
|
|||
|
||||
#include <plat/board.h>
|
||||
#include <plat/common.h>
|
||||
#include <plat/display.h>
|
||||
#include <plat/panel-generic-dpi.h>
|
||||
#include <video/omapdss.h>
|
||||
#include <video/omap-panel-generic-dpi.h>
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat/nand.h>
|
||||
#include <plat/usb.h>
|
||||
|
|
|
@ -44,8 +44,8 @@
|
|||
#include <plat/usb.h>
|
||||
#include <plat/common.h>
|
||||
#include <plat/mcspi.h>
|
||||
#include <plat/display.h>
|
||||
#include <plat/panel-generic-dpi.h>
|
||||
#include <video/omapdss.h>
|
||||
#include <video/omap-panel-generic-dpi.h>
|
||||
|
||||
#include "mux.h"
|
||||
#include "sdram-micron-mt46h32m32lf-6.h"
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
#include <mach/hardware.h>
|
||||
#include <plat/mcspi.h>
|
||||
#include <plat/usb.h>
|
||||
#include <plat/display.h>
|
||||
#include <video/omapdss.h>
|
||||
#include <plat/nand.h>
|
||||
|
||||
#include "mux.h"
|
||||
|
|
|
@ -39,8 +39,8 @@
|
|||
#include <plat/gpmc.h>
|
||||
#include <plat/nand.h>
|
||||
#include <plat/usb.h>
|
||||
#include <plat/display.h>
|
||||
#include <plat/panel-generic-dpi.h>
|
||||
#include <video/omapdss.h>
|
||||
#include <video/omap-panel-generic-dpi.h>
|
||||
|
||||
#include <plat/mcspi.h>
|
||||
#include <linux/input/matrix_keypad.h>
|
||||
|
|
|
@ -34,13 +34,13 @@
|
|||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <plat/display.h>
|
||||
#include <video/omapdss.h>
|
||||
|
||||
#include <plat/board.h>
|
||||
#include <plat/common.h>
|
||||
#include <plat/usb.h>
|
||||
#include <plat/mmc.h>
|
||||
#include <plat/panel-generic-dpi.h>
|
||||
#include <video/omap-panel-generic-dpi.h>
|
||||
#include "timer-gp.h"
|
||||
|
||||
#include "hsmmc.h"
|
||||
|
|
|
@ -43,8 +43,8 @@
|
|||
|
||||
#include <plat/board.h>
|
||||
#include <plat/common.h>
|
||||
#include <plat/display.h>
|
||||
#include <plat/panel-generic-dpi.h>
|
||||
#include <video/omapdss.h>
|
||||
#include <video/omap-panel-generic-dpi.h>
|
||||
#include <mach/gpio.h>
|
||||
#include <plat/gpmc.h>
|
||||
#include <mach/hardware.h>
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
#include <linux/spi/spi.h>
|
||||
#include <linux/mm.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <plat/display.h>
|
||||
#include <video/omapdss.h>
|
||||
#include <plat/vram.h>
|
||||
#include <plat/mcspi.h>
|
||||
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
#include <linux/i2c/twl.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <plat/mcspi.h>
|
||||
#include <plat/display.h>
|
||||
#include <video/omapdss.h>
|
||||
|
||||
#define LCD_PANEL_RESET_GPIO_PROD 96
|
||||
#define LCD_PANEL_RESET_GPIO_PILOT 55
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
#include <linux/clk.h>
|
||||
#include <linux/err.h>
|
||||
|
||||
#include <plat/display.h>
|
||||
#include <video/omapdss.h>
|
||||
#include <plat/omap_hwmod.h>
|
||||
#include <plat/omap_device.h>
|
||||
|
||||
|
@ -56,37 +56,58 @@ static bool opt_clock_available(const char *clk_role)
|
|||
return false;
|
||||
}
|
||||
|
||||
struct omap_dss_hwmod_data {
|
||||
const char *oh_name;
|
||||
const char *dev_name;
|
||||
const int id;
|
||||
};
|
||||
|
||||
static const struct omap_dss_hwmod_data omap2_dss_hwmod_data[] __initdata = {
|
||||
{ "dss_core", "omapdss_dss", -1 },
|
||||
{ "dss_dispc", "omapdss_dispc", -1 },
|
||||
{ "dss_rfbi", "omapdss_rfbi", -1 },
|
||||
{ "dss_venc", "omapdss_venc", -1 },
|
||||
};
|
||||
|
||||
static const struct omap_dss_hwmod_data omap3_dss_hwmod_data[] __initdata = {
|
||||
{ "dss_core", "omapdss_dss", -1 },
|
||||
{ "dss_dispc", "omapdss_dispc", -1 },
|
||||
{ "dss_rfbi", "omapdss_rfbi", -1 },
|
||||
{ "dss_venc", "omapdss_venc", -1 },
|
||||
{ "dss_dsi1", "omapdss_dsi1", -1 },
|
||||
};
|
||||
|
||||
static const struct omap_dss_hwmod_data omap4_dss_hwmod_data[] __initdata = {
|
||||
{ "dss_core", "omapdss_dss", -1 },
|
||||
{ "dss_dispc", "omapdss_dispc", -1 },
|
||||
{ "dss_rfbi", "omapdss_rfbi", -1 },
|
||||
{ "dss_venc", "omapdss_venc", -1 },
|
||||
{ "dss_dsi1", "omapdss_dsi1", -1 },
|
||||
{ "dss_dsi2", "omapdss_dsi2", -1 },
|
||||
{ "dss_hdmi", "omapdss_hdmi", -1 },
|
||||
};
|
||||
|
||||
int __init omap_display_init(struct omap_dss_board_info *board_data)
|
||||
{
|
||||
int r = 0;
|
||||
struct omap_hwmod *oh;
|
||||
struct omap_device *od;
|
||||
int i;
|
||||
int i, oh_count;
|
||||
struct omap_display_platform_data pdata;
|
||||
|
||||
/*
|
||||
* omap: valid DSS hwmod names
|
||||
* omap2,3,4: dss_core, dss_dispc, dss_rfbi, dss_venc
|
||||
* omap3,4: dss_dsi1
|
||||
* omap4: dss_dsi2, dss_hdmi
|
||||
*/
|
||||
char *oh_name[] = { "dss_core", "dss_dispc", "dss_rfbi", "dss_venc",
|
||||
"dss_dsi1", "dss_dsi2", "dss_hdmi" };
|
||||
char *dev_name[] = { "omapdss_dss", "omapdss_dispc", "omapdss_rfbi",
|
||||
"omapdss_venc", "omapdss_dsi1", "omapdss_dsi2",
|
||||
"omapdss_hdmi" };
|
||||
int oh_count;
|
||||
const struct omap_dss_hwmod_data *curr_dss_hwmod;
|
||||
|
||||
memset(&pdata, 0, sizeof(pdata));
|
||||
|
||||
if (cpu_is_omap24xx())
|
||||
oh_count = ARRAY_SIZE(oh_name) - 3;
|
||||
/* last 3 hwmod dev in oh_name are not available for omap2 */
|
||||
else if (cpu_is_omap44xx())
|
||||
oh_count = ARRAY_SIZE(oh_name);
|
||||
else
|
||||
oh_count = ARRAY_SIZE(oh_name) - 2;
|
||||
/* last 2 hwmod dev in oh_name are not available for omap3 */
|
||||
if (cpu_is_omap24xx()) {
|
||||
curr_dss_hwmod = omap2_dss_hwmod_data;
|
||||
oh_count = ARRAY_SIZE(omap2_dss_hwmod_data);
|
||||
} else if (cpu_is_omap34xx()) {
|
||||
curr_dss_hwmod = omap3_dss_hwmod_data;
|
||||
oh_count = ARRAY_SIZE(omap3_dss_hwmod_data);
|
||||
} else {
|
||||
curr_dss_hwmod = omap4_dss_hwmod_data;
|
||||
oh_count = ARRAY_SIZE(omap4_dss_hwmod_data);
|
||||
}
|
||||
|
||||
/* opt_clks are always associated with dss hwmod */
|
||||
oh_core = omap_hwmod_lookup("dss_core");
|
||||
|
@ -100,19 +121,21 @@ int __init omap_display_init(struct omap_dss_board_info *board_data)
|
|||
pdata.opt_clock_available = opt_clock_available;
|
||||
|
||||
for (i = 0; i < oh_count; i++) {
|
||||
oh = omap_hwmod_lookup(oh_name[i]);
|
||||
oh = omap_hwmod_lookup(curr_dss_hwmod[i].oh_name);
|
||||
if (!oh) {
|
||||
pr_err("Could not look up %s\n", oh_name[i]);
|
||||
pr_err("Could not look up %s\n",
|
||||
curr_dss_hwmod[i].oh_name);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
od = omap_device_build(dev_name[i], -1, oh, &pdata,
|
||||
od = omap_device_build(curr_dss_hwmod[i].dev_name,
|
||||
curr_dss_hwmod[i].id, oh, &pdata,
|
||||
sizeof(struct omap_display_platform_data),
|
||||
omap_dss_latency,
|
||||
ARRAY_SIZE(omap_dss_latency), 0);
|
||||
|
||||
if (WARN((IS_ERR(od)), "Could not build omap_device for %s\n",
|
||||
oh_name[i]))
|
||||
curr_dss_hwmod[i].oh_name))
|
||||
return -ENODEV;
|
||||
}
|
||||
omap_display_device.dev.platform_data = board_data;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Defines for zoom boards
|
||||
*/
|
||||
#include <plat/display.h>
|
||||
#include <video/omapdss.h>
|
||||
|
||||
#define ZOOM_NAND_CS 0
|
||||
|
||||
|
|
|
@ -30,6 +30,11 @@ obj-$(CONFIG_ARCH_SH7377) += entry-intc.o
|
|||
obj-$(CONFIG_ARCH_SH7372) += entry-intc.o
|
||||
obj-$(CONFIG_ARCH_SH73A0) += entry-gic.o
|
||||
|
||||
# PM objects
|
||||
obj-$(CONFIG_SUSPEND) += suspend.o
|
||||
obj-$(CONFIG_CPU_IDLE) += cpuidle.o
|
||||
obj-$(CONFIG_ARCH_SH7372) += pm-sh7372.o sleep-sh7372.o
|
||||
|
||||
# Board objects
|
||||
obj-$(CONFIG_MACH_G3EVM) += board-g3evm.o
|
||||
obj-$(CONFIG_MACH_G4EVM) += board-g4evm.o
|
||||
|
|
|
@ -34,6 +34,8 @@
|
|||
#include <linux/input/sh_keysc.h>
|
||||
#include <linux/mmc/host.h>
|
||||
#include <linux/mmc/sh_mmcif.h>
|
||||
#include <linux/mmc/sh_mobile_sdhi.h>
|
||||
#include <linux/mfd/tmio.h>
|
||||
#include <linux/sh_clk.h>
|
||||
#include <video/sh_mobile_lcdc.h>
|
||||
#include <video/sh_mipi_dsi.h>
|
||||
|
@ -156,10 +158,19 @@ static struct resource sh_mmcif_resources[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct sh_mmcif_dma sh_mmcif_dma = {
|
||||
.chan_priv_rx = {
|
||||
.slave_id = SHDMA_SLAVE_MMCIF_RX,
|
||||
},
|
||||
.chan_priv_tx = {
|
||||
.slave_id = SHDMA_SLAVE_MMCIF_TX,
|
||||
},
|
||||
};
|
||||
static struct sh_mmcif_plat_data sh_mmcif_platdata = {
|
||||
.sup_pclk = 0,
|
||||
.ocr = MMC_VDD_165_195,
|
||||
.caps = MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE,
|
||||
.dma = &sh_mmcif_dma,
|
||||
};
|
||||
|
||||
static struct platform_device mmc_device = {
|
||||
|
@ -296,11 +307,13 @@ static struct platform_device lcdc0_device = {
|
|||
/* MIPI-DSI */
|
||||
static struct resource mipidsi0_resources[] = {
|
||||
[0] = {
|
||||
.name = "DSI0",
|
||||
.start = 0xfeab0000,
|
||||
.end = 0xfeab3fff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.name = "DSI0",
|
||||
.start = 0xfeab4000,
|
||||
.end = 0xfeab7fff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
|
@ -325,6 +338,89 @@ static struct platform_device mipidsi0_device = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct sh_mobile_sdhi_info sdhi0_info = {
|
||||
.dma_slave_tx = SHDMA_SLAVE_SDHI0_TX,
|
||||
.dma_slave_rx = SHDMA_SLAVE_SDHI0_RX,
|
||||
.tmio_caps = MMC_CAP_SD_HIGHSPEED,
|
||||
.tmio_ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29,
|
||||
};
|
||||
|
||||
static struct resource sdhi0_resources[] = {
|
||||
[0] = {
|
||||
.name = "SDHI0",
|
||||
.start = 0xee100000,
|
||||
.end = 0xee1000ff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = gic_spi(83),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
.start = gic_spi(84),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[3] = {
|
||||
.start = gic_spi(85),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device sdhi0_device = {
|
||||
.name = "sh_mobile_sdhi",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(sdhi0_resources),
|
||||
.resource = sdhi0_resources,
|
||||
.dev = {
|
||||
.platform_data = &sdhi0_info,
|
||||
},
|
||||
};
|
||||
|
||||
void ag5evm_sdhi1_set_pwr(struct platform_device *pdev, int state)
|
||||
{
|
||||
gpio_set_value(GPIO_PORT114, state);
|
||||
}
|
||||
|
||||
static struct sh_mobile_sdhi_info sh_sdhi1_platdata = {
|
||||
.dma_slave_tx = SHDMA_SLAVE_SDHI1_TX,
|
||||
.dma_slave_rx = SHDMA_SLAVE_SDHI1_RX,
|
||||
.tmio_flags = TMIO_MMC_WRPROTECT_DISABLE,
|
||||
.tmio_caps = MMC_CAP_NONREMOVABLE,
|
||||
.tmio_ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||
.set_pwr = ag5evm_sdhi1_set_pwr,
|
||||
};
|
||||
|
||||
static struct resource sdhi1_resources[] = {
|
||||
[0] = {
|
||||
.name = "SDHI1",
|
||||
.start = 0xee120000,
|
||||
.end = 0xee1200ff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = gic_spi(87),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
.start = gic_spi(88),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[3] = {
|
||||
.start = gic_spi(89),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device sdhi1_device = {
|
||||
.name = "sh_mobile_sdhi",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = &sh_sdhi1_platdata,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(sdhi1_resources),
|
||||
.resource = sdhi1_resources,
|
||||
};
|
||||
|
||||
static struct platform_device *ag5evm_devices[] __initdata = {
|
||||
ð_device,
|
||||
&keysc_device,
|
||||
|
@ -333,6 +429,8 @@ static struct platform_device *ag5evm_devices[] __initdata = {
|
|||
&irda_device,
|
||||
&lcdc0_device,
|
||||
&mipidsi0_device,
|
||||
&sdhi0_device,
|
||||
&sdhi1_device,
|
||||
};
|
||||
|
||||
static struct map_desc ag5evm_io_desc[] __initdata = {
|
||||
|
@ -454,6 +552,26 @@ static void __init ag5evm_init(void)
|
|||
/* MIPI-DSI clock setup */
|
||||
__raw_writel(0x2a809010, DSI0PHYCR);
|
||||
|
||||
/* enable SDHI0 on CN15 [SD I/F] */
|
||||
gpio_request(GPIO_FN_SDHICD0, NULL);
|
||||
gpio_request(GPIO_FN_SDHIWP0, NULL);
|
||||
gpio_request(GPIO_FN_SDHICMD0, NULL);
|
||||
gpio_request(GPIO_FN_SDHICLK0, NULL);
|
||||
gpio_request(GPIO_FN_SDHID0_3, NULL);
|
||||
gpio_request(GPIO_FN_SDHID0_2, NULL);
|
||||
gpio_request(GPIO_FN_SDHID0_1, NULL);
|
||||
gpio_request(GPIO_FN_SDHID0_0, NULL);
|
||||
|
||||
/* enable SDHI1 on CN4 [WLAN I/F] */
|
||||
gpio_request(GPIO_FN_SDHICLK1, NULL);
|
||||
gpio_request(GPIO_FN_SDHICMD1_PU, NULL);
|
||||
gpio_request(GPIO_FN_SDHID1_3_PU, NULL);
|
||||
gpio_request(GPIO_FN_SDHID1_2_PU, NULL);
|
||||
gpio_request(GPIO_FN_SDHID1_1_PU, NULL);
|
||||
gpio_request(GPIO_FN_SDHID1_0_PU, NULL);
|
||||
gpio_request(GPIO_PORT114, "sdhi1_power");
|
||||
gpio_direction_output(GPIO_PORT114, 0);
|
||||
|
||||
#ifdef CONFIG_CACHE_L2X0
|
||||
/* Shared attribute override enable, 64K*8way */
|
||||
l2x0_init(__io(0xf0100000), 0x00460000, 0xc2000fff);
|
||||
|
|
|
@ -316,8 +316,16 @@ static struct resource sdhi0_resources[] = {
|
|||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = evt2irq(0x0e00) /* SDHI0 */,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
.start = evt2irq(0x0e00) /* SDHI0_SDHI0I0 */,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
.start = evt2irq(0x0e20) /* SDHI0_SDHI0I1 */,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[3] = {
|
||||
.start = evt2irq(0x0e40) /* SDHI0_SDHI0I2 */,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -349,8 +357,16 @@ static struct resource sdhi1_resources[] = {
|
|||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = evt2irq(0x0e80),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
.start = evt2irq(0x0e80), /* SDHI1_SDHI1I0 */
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
.start = evt2irq(0x0ea0), /* SDHI1_SDHI1I1 */
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[3] = {
|
||||
.start = evt2irq(0x0ec0), /* SDHI1_SDHI1I2 */
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -980,11 +996,6 @@ static void __init hdmi_init_pm_clock(void)
|
|||
goto out;
|
||||
}
|
||||
|
||||
ret = clk_enable(&sh7372_pllc2_clk);
|
||||
if (ret < 0) {
|
||||
pr_err("Cannot enable pllc2 clock\n");
|
||||
goto out;
|
||||
}
|
||||
pr_debug("PLLC2 set frequency %lu\n", rate);
|
||||
|
||||
ret = clk_set_parent(hdmi_ick, &sh7372_pllc2_clk);
|
||||
|
@ -1343,6 +1354,7 @@ static void __init ap4evb_init(void)
|
|||
|
||||
hdmi_init_pm_clock();
|
||||
fsi_init_pm_clock();
|
||||
sh7372_pm_init();
|
||||
}
|
||||
|
||||
static void __init ap4evb_timer_init(void)
|
||||
|
|
|
@ -205,7 +205,7 @@ static struct resource sdhi0_resources[] = {
|
|||
[0] = {
|
||||
.name = "SDHI0",
|
||||
.start = 0xe6d50000,
|
||||
.end = 0xe6d50nff,
|
||||
.end = 0xe6d500ff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
|
|
|
@ -43,6 +43,7 @@
|
|||
#include <linux/sh_intc.h>
|
||||
#include <linux/tca6416_keypad.h>
|
||||
#include <linux/usb/r8a66597.h>
|
||||
#include <linux/usb/renesas_usbhs.h>
|
||||
|
||||
#include <video/sh_mobile_hdmi.h>
|
||||
#include <video/sh_mobile_lcdc.h>
|
||||
|
@ -143,7 +144,30 @@
|
|||
* open | external VBUS | Function
|
||||
*
|
||||
* *1
|
||||
* CN31 is used as Host in Linux.
|
||||
* CN31 is used as
|
||||
* CONFIG_USB_R8A66597_HCD Host
|
||||
* CONFIG_USB_RENESAS_USBHS Function
|
||||
*
|
||||
* CAUTION
|
||||
*
|
||||
* renesas_usbhs driver can use external interrupt mode
|
||||
* (which come from USB-PHY) or autonomy mode (it use own interrupt)
|
||||
* for detecting connection/disconnection when Function.
|
||||
* USB will be power OFF while it has been disconnecting
|
||||
* if external interrupt mode, and it is always power ON if autonomy mode,
|
||||
*
|
||||
* mackerel can not use external interrupt (IRQ7-PORT167) mode on "USB0",
|
||||
* because Touchscreen is using IRQ7-PORT40.
|
||||
* It is impossible to use IRQ7 demux on this board.
|
||||
*
|
||||
* We can use external interrupt mode USB-Function on "USB1".
|
||||
* USB1 can become Host by r8a66597, and become Function by renesas_usbhs.
|
||||
* But don't select both drivers in same time.
|
||||
* These uses same IRQ number for request_irq(), and aren't supporting
|
||||
* IRQF_SHARD / IORESOURCE_IRQ_SHAREABLE.
|
||||
*
|
||||
* Actually these are old/new version of USB driver.
|
||||
* This mean its register will be broken if it supports SHARD IRQ,
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -185,6 +209,7 @@
|
|||
* FIXME !!
|
||||
*
|
||||
* gpio_no_direction
|
||||
* gpio_pull_down
|
||||
* are quick_hack.
|
||||
*
|
||||
* current gpio frame work doesn't have
|
||||
|
@ -196,6 +221,16 @@ static void __init gpio_no_direction(u32 addr)
|
|||
__raw_writeb(0x00, addr);
|
||||
}
|
||||
|
||||
static void __init gpio_pull_down(u32 addr)
|
||||
{
|
||||
u8 data = __raw_readb(addr);
|
||||
|
||||
data &= 0x0F;
|
||||
data |= 0xA0;
|
||||
|
||||
__raw_writeb(data, addr);
|
||||
}
|
||||
|
||||
/* MTD */
|
||||
static struct mtd_partition nor_flash_partitions[] = {
|
||||
{
|
||||
|
@ -458,12 +493,6 @@ static void __init hdmi_init_pm_clock(void)
|
|||
goto out;
|
||||
}
|
||||
|
||||
ret = clk_enable(&sh7372_pllc2_clk);
|
||||
if (ret < 0) {
|
||||
pr_err("Cannot enable pllc2 clock\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
pr_debug("PLLC2 set frequency %lu\n", rate);
|
||||
|
||||
ret = clk_set_parent(hdmi_ick, &sh7372_pllc2_clk);
|
||||
|
@ -515,6 +544,157 @@ static struct platform_device usb1_host_device = {
|
|||
.resource = usb1_host_resources,
|
||||
};
|
||||
|
||||
/* USB1 (Function) */
|
||||
#define USB_PHY_MODE (1 << 4)
|
||||
#define USB_PHY_INT_EN ((1 << 3) | (1 << 2))
|
||||
#define USB_PHY_ON (1 << 1)
|
||||
#define USB_PHY_OFF (1 << 0)
|
||||
#define USB_PHY_INT_CLR (USB_PHY_ON | USB_PHY_OFF)
|
||||
|
||||
struct usbhs_private {
|
||||
unsigned int irq;
|
||||
unsigned int usbphyaddr;
|
||||
unsigned int usbcrcaddr;
|
||||
struct renesas_usbhs_platform_info info;
|
||||
};
|
||||
|
||||
#define usbhs_get_priv(pdev) \
|
||||
container_of(renesas_usbhs_get_info(pdev), \
|
||||
struct usbhs_private, info)
|
||||
|
||||
#define usbhs_is_connected(priv) \
|
||||
(!((1 << 7) & __raw_readw(priv->usbcrcaddr)))
|
||||
|
||||
static int usbhs1_get_id(struct platform_device *pdev)
|
||||
{
|
||||
return USBHS_GADGET;
|
||||
}
|
||||
|
||||
static int usbhs1_get_vbus(struct platform_device *pdev)
|
||||
{
|
||||
return usbhs_is_connected(usbhs_get_priv(pdev));
|
||||
}
|
||||
|
||||
static irqreturn_t usbhs1_interrupt(int irq, void *data)
|
||||
{
|
||||
struct platform_device *pdev = data;
|
||||
struct usbhs_private *priv = usbhs_get_priv(pdev);
|
||||
|
||||
dev_dbg(&pdev->dev, "%s\n", __func__);
|
||||
|
||||
renesas_usbhs_call_notify_hotplug(pdev);
|
||||
|
||||
/* clear status */
|
||||
__raw_writew(__raw_readw(priv->usbphyaddr) | USB_PHY_INT_CLR,
|
||||
priv->usbphyaddr);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int usbhs1_hardware_init(struct platform_device *pdev)
|
||||
{
|
||||
struct usbhs_private *priv = usbhs_get_priv(pdev);
|
||||
int ret;
|
||||
|
||||
irq_set_irq_type(priv->irq, IRQ_TYPE_LEVEL_HIGH);
|
||||
|
||||
/* clear interrupt status */
|
||||
__raw_writew(USB_PHY_MODE | USB_PHY_INT_CLR, priv->usbphyaddr);
|
||||
|
||||
ret = request_irq(priv->irq, usbhs1_interrupt, 0,
|
||||
dev_name(&pdev->dev), pdev);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "request_irq err\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* enable USB phy interrupt */
|
||||
__raw_writew(USB_PHY_MODE | USB_PHY_INT_EN, priv->usbphyaddr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void usbhs1_hardware_exit(struct platform_device *pdev)
|
||||
{
|
||||
struct usbhs_private *priv = usbhs_get_priv(pdev);
|
||||
|
||||
/* clear interrupt status */
|
||||
__raw_writew(USB_PHY_MODE | USB_PHY_INT_CLR, priv->usbphyaddr);
|
||||
|
||||
free_irq(priv->irq, pdev);
|
||||
}
|
||||
|
||||
static void usbhs1_phy_reset(struct platform_device *pdev)
|
||||
{
|
||||
struct usbhs_private *priv = usbhs_get_priv(pdev);
|
||||
|
||||
/* init phy */
|
||||
__raw_writew(0x8a0a, priv->usbcrcaddr);
|
||||
}
|
||||
|
||||
static u32 usbhs1_pipe_cfg[] = {
|
||||
USB_ENDPOINT_XFER_CONTROL,
|
||||
USB_ENDPOINT_XFER_ISOC,
|
||||
USB_ENDPOINT_XFER_ISOC,
|
||||
USB_ENDPOINT_XFER_BULK,
|
||||
USB_ENDPOINT_XFER_BULK,
|
||||
USB_ENDPOINT_XFER_BULK,
|
||||
USB_ENDPOINT_XFER_INT,
|
||||
USB_ENDPOINT_XFER_INT,
|
||||
USB_ENDPOINT_XFER_INT,
|
||||
USB_ENDPOINT_XFER_BULK,
|
||||
USB_ENDPOINT_XFER_BULK,
|
||||
USB_ENDPOINT_XFER_BULK,
|
||||
USB_ENDPOINT_XFER_BULK,
|
||||
USB_ENDPOINT_XFER_BULK,
|
||||
USB_ENDPOINT_XFER_BULK,
|
||||
USB_ENDPOINT_XFER_BULK,
|
||||
};
|
||||
|
||||
static struct usbhs_private usbhs1_private = {
|
||||
.irq = evt2irq(0x0300), /* IRQ8 */
|
||||
.usbphyaddr = 0xE60581E2, /* USBPHY1INTAP */
|
||||
.usbcrcaddr = 0xE6058130, /* USBCR4 */
|
||||
.info = {
|
||||
.platform_callback = {
|
||||
.hardware_init = usbhs1_hardware_init,
|
||||
.hardware_exit = usbhs1_hardware_exit,
|
||||
.phy_reset = usbhs1_phy_reset,
|
||||
.get_id = usbhs1_get_id,
|
||||
.get_vbus = usbhs1_get_vbus,
|
||||
},
|
||||
.driver_param = {
|
||||
.buswait_bwait = 4,
|
||||
.pipe_type = usbhs1_pipe_cfg,
|
||||
.pipe_size = ARRAY_SIZE(usbhs1_pipe_cfg),
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource usbhs1_resources[] = {
|
||||
[0] = {
|
||||
.name = "USBHS",
|
||||
.start = 0xE68B0000,
|
||||
.end = 0xE68B00E6 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = evt2irq(0x1ce0) /* USB1_USB1I0 */,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device usbhs1_device = {
|
||||
.name = "renesas_usbhs",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = &usbhs1_private.info,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(usbhs1_resources),
|
||||
.resource = usbhs1_resources,
|
||||
};
|
||||
|
||||
|
||||
/* LED */
|
||||
static struct gpio_led mackerel_leds[] = {
|
||||
{
|
||||
|
@ -690,7 +870,15 @@ static struct resource sdhi0_resources[] = {
|
|||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = evt2irq(0x0e00) /* SDHI0 */,
|
||||
.start = evt2irq(0x0e00) /* SDHI0_SDHI0I0 */,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
.start = evt2irq(0x0e20) /* SDHI0_SDHI0I1 */,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[3] = {
|
||||
.start = evt2irq(0x0e40) /* SDHI0_SDHI0I2 */,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
@ -705,7 +893,7 @@ static struct platform_device sdhi0_device = {
|
|||
},
|
||||
};
|
||||
|
||||
#if !defined(CONFIG_MMC_SH_MMCIF)
|
||||
#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
|
||||
/* SDHI1 */
|
||||
static struct sh_mobile_sdhi_info sdhi1_info = {
|
||||
.dma_slave_tx = SHDMA_SLAVE_SDHI1_TX,
|
||||
|
@ -725,7 +913,15 @@ static struct resource sdhi1_resources[] = {
|
|||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = evt2irq(0x0e80),
|
||||
.start = evt2irq(0x0e80), /* SDHI1_SDHI1I0 */
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
.start = evt2irq(0x0ea0), /* SDHI1_SDHI1I1 */
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[3] = {
|
||||
.start = evt2irq(0x0ec0), /* SDHI1_SDHI1I2 */
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
@ -768,7 +964,15 @@ static struct resource sdhi2_resources[] = {
|
|||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = evt2irq(0x1200),
|
||||
.start = evt2irq(0x1200), /* SDHI2_SDHI2I0 */
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
.start = evt2irq(0x1220), /* SDHI2_SDHI2I1 */
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[3] = {
|
||||
.start = evt2irq(0x1240), /* SDHI2_SDHI2I2 */
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
@ -803,6 +1007,15 @@ static struct resource sh_mmcif_resources[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct sh_mmcif_dma sh_mmcif_dma = {
|
||||
.chan_priv_rx = {
|
||||
.slave_id = SHDMA_SLAVE_MMCIF_RX,
|
||||
},
|
||||
.chan_priv_tx = {
|
||||
.slave_id = SHDMA_SLAVE_MMCIF_TX,
|
||||
},
|
||||
};
|
||||
|
||||
static struct sh_mmcif_plat_data sh_mmcif_plat = {
|
||||
.sup_pclk = 0,
|
||||
.ocr = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||
|
@ -810,6 +1023,7 @@ static struct sh_mmcif_plat_data sh_mmcif_plat = {
|
|||
MMC_CAP_8_BIT_DATA |
|
||||
MMC_CAP_NEEDS_POLL,
|
||||
.get_cd = slot_cn7_get_cd,
|
||||
.dma = &sh_mmcif_dma,
|
||||
};
|
||||
|
||||
static struct platform_device sh_mmcif_device = {
|
||||
|
@ -858,37 +1072,23 @@ static struct soc_camera_link camera_link = {
|
|||
.priv = &camera_info,
|
||||
};
|
||||
|
||||
static void dummy_release(struct device *dev)
|
||||
{
|
||||
}
|
||||
static struct platform_device *camera_device;
|
||||
|
||||
static struct platform_device camera_device = {
|
||||
.name = "soc_camera_platform",
|
||||
.dev = {
|
||||
.platform_data = &camera_info,
|
||||
.release = dummy_release,
|
||||
},
|
||||
};
|
||||
static void mackerel_camera_release(struct device *dev)
|
||||
{
|
||||
soc_camera_platform_release(&camera_device);
|
||||
}
|
||||
|
||||
static int mackerel_camera_add(struct soc_camera_link *icl,
|
||||
struct device *dev)
|
||||
{
|
||||
if (icl != &camera_link)
|
||||
return -ENODEV;
|
||||
|
||||
camera_info.dev = dev;
|
||||
|
||||
return platform_device_register(&camera_device);
|
||||
return soc_camera_platform_add(icl, dev, &camera_device, &camera_link,
|
||||
mackerel_camera_release, 0);
|
||||
}
|
||||
|
||||
static void mackerel_camera_del(struct soc_camera_link *icl)
|
||||
{
|
||||
if (icl != &camera_link)
|
||||
return;
|
||||
|
||||
platform_device_unregister(&camera_device);
|
||||
memset(&camera_device.dev.kobj, 0,
|
||||
sizeof(camera_device.dev.kobj));
|
||||
soc_camera_platform_del(icl, camera_device, &camera_link);
|
||||
}
|
||||
|
||||
static struct sh_mobile_ceu_info sh_mobile_ceu_info = {
|
||||
|
@ -935,12 +1135,13 @@ static struct platform_device *mackerel_devices[] __initdata = {
|
|||
&smc911x_device,
|
||||
&lcdc_device,
|
||||
&usb1_host_device,
|
||||
&usbhs1_device,
|
||||
&leds_device,
|
||||
&fsi_device,
|
||||
&fsi_ak4643_device,
|
||||
&fsi_hdmi_device,
|
||||
&sdhi0_device,
|
||||
#if !defined(CONFIG_MMC_SH_MMCIF)
|
||||
#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
|
||||
&sdhi1_device,
|
||||
#endif
|
||||
&sdhi2_device,
|
||||
|
@ -1030,6 +1231,7 @@ static void __init mackerel_map_io(void)
|
|||
|
||||
#define GPIO_PORT9CR 0xE6051009
|
||||
#define GPIO_PORT10CR 0xE605100A
|
||||
#define GPIO_PORT168CR 0xE60520A8
|
||||
#define SRCR4 0xe61580bc
|
||||
#define USCCR1 0xE6058144
|
||||
static void __init mackerel_init(void)
|
||||
|
@ -1088,6 +1290,7 @@ static void __init mackerel_init(void)
|
|||
gpio_request(GPIO_FN_OVCN_1_114, NULL);
|
||||
gpio_request(GPIO_FN_EXTLP_1, NULL);
|
||||
gpio_request(GPIO_FN_OVCN2_1, NULL);
|
||||
gpio_pull_down(GPIO_PORT168CR);
|
||||
|
||||
/* setup USB phy */
|
||||
__raw_writew(0x8a0a, 0xE6058130); /* USBCR4 */
|
||||
|
@ -1140,7 +1343,7 @@ static void __init mackerel_init(void)
|
|||
gpio_request(GPIO_FN_SDHID0_1, NULL);
|
||||
gpio_request(GPIO_FN_SDHID0_0, NULL);
|
||||
|
||||
#if !defined(CONFIG_MMC_SH_MMCIF)
|
||||
#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
|
||||
/* enable SDHI1 */
|
||||
gpio_request(GPIO_FN_SDHICMD1, NULL);
|
||||
gpio_request(GPIO_FN_SDHICLK1, NULL);
|
||||
|
@ -1216,6 +1419,7 @@ static void __init mackerel_init(void)
|
|||
platform_add_devices(mackerel_devices, ARRAY_SIZE(mackerel_devices));
|
||||
|
||||
hdmi_init_pm_clock();
|
||||
sh7372_pm_init();
|
||||
}
|
||||
|
||||
static void __init mackerel_timer_init(void)
|
||||
|
|
|
@ -44,6 +44,11 @@
|
|||
#define DSI1PCKCR 0xe6150098
|
||||
#define PLLC01CR 0xe6150028
|
||||
#define PLLC2CR 0xe615002c
|
||||
#define RMSTPCR0 0xe6150110
|
||||
#define RMSTPCR1 0xe6150114
|
||||
#define RMSTPCR2 0xe6150118
|
||||
#define RMSTPCR3 0xe615011c
|
||||
#define RMSTPCR4 0xe6150120
|
||||
#define SMSTPCR0 0xe6150130
|
||||
#define SMSTPCR1 0xe6150134
|
||||
#define SMSTPCR2 0xe6150138
|
||||
|
@ -421,9 +426,6 @@ static unsigned long fsidiv_recalc(struct clk *clk)
|
|||
|
||||
value = __raw_readl(clk->mapping->base);
|
||||
|
||||
if ((value & 0x3) != 0x3)
|
||||
return 0;
|
||||
|
||||
value >>= 16;
|
||||
if (value < 2)
|
||||
return 0;
|
||||
|
@ -504,7 +506,7 @@ static struct clk *late_main_clks[] = {
|
|||
enum { MSTP001,
|
||||
MSTP131, MSTP130,
|
||||
MSTP129, MSTP128, MSTP127, MSTP126, MSTP125,
|
||||
MSTP118, MSTP117, MSTP116,
|
||||
MSTP118, MSTP117, MSTP116, MSTP113,
|
||||
MSTP106, MSTP101, MSTP100,
|
||||
MSTP223,
|
||||
MSTP207, MSTP206, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200,
|
||||
|
@ -527,6 +529,7 @@ static struct clk mstp_clks[MSTP_NR] = {
|
|||
[MSTP118] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 18, 0), /* DSITX */
|
||||
[MSTP117] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 17, 0), /* LCDC1 */
|
||||
[MSTP116] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR1, 16, 0), /* IIC0 */
|
||||
[MSTP113] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR1, 13, 0), /* MERAM */
|
||||
[MSTP106] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 6, 0), /* JPU */
|
||||
[MSTP101] = MSTP(&div4_clks[DIV4_M1], SMSTPCR1, 1, 0), /* VPU */
|
||||
[MSTP100] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 0, 0), /* LCDC0 */
|
||||
|
@ -617,6 +620,7 @@ static struct clk_lookup lookups[] = {
|
|||
CLKDEV_DEV_ID("sh-mipi-dsi.0", &mstp_clks[MSTP118]), /* DSITX0 */
|
||||
CLKDEV_DEV_ID("sh_mobile_lcdc_fb.1", &mstp_clks[MSTP117]), /* LCDC1 */
|
||||
CLKDEV_DEV_ID("i2c-sh_mobile.0", &mstp_clks[MSTP116]), /* IIC0 */
|
||||
CLKDEV_DEV_ID("sh_mobile_meram.0", &mstp_clks[MSTP113]), /* MERAM */
|
||||
CLKDEV_DEV_ID("uio_pdrv_genirq.5", &mstp_clks[MSTP106]), /* JPU */
|
||||
CLKDEV_DEV_ID("uio_pdrv_genirq.0", &mstp_clks[MSTP101]), /* VPU */
|
||||
CLKDEV_DEV_ID("sh_mobile_lcdc_fb.0", &mstp_clks[MSTP100]), /* LCDC0 */
|
||||
|
@ -634,6 +638,7 @@ static struct clk_lookup lookups[] = {
|
|||
CLKDEV_DEV_ID("i2c-sh_mobile.1", &mstp_clks[MSTP323]), /* IIC1 */
|
||||
CLKDEV_DEV_ID("r8a66597_hcd.0", &mstp_clks[MSTP322]), /* USB0 */
|
||||
CLKDEV_DEV_ID("r8a66597_udc.0", &mstp_clks[MSTP322]), /* USB0 */
|
||||
CLKDEV_DEV_ID("renesas_usbhs.0", &mstp_clks[MSTP322]), /* USB0 */
|
||||
CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP314]), /* SDHI0 */
|
||||
CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]), /* SDHI1 */
|
||||
CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP312]), /* MMC */
|
||||
|
@ -644,6 +649,7 @@ static struct clk_lookup lookups[] = {
|
|||
CLKDEV_DEV_ID("i2c-sh_mobile.4", &mstp_clks[MSTP410]), /* IIC4 */
|
||||
CLKDEV_DEV_ID("r8a66597_hcd.1", &mstp_clks[MSTP406]), /* USB1 */
|
||||
CLKDEV_DEV_ID("r8a66597_udc.1", &mstp_clks[MSTP406]), /* USB1 */
|
||||
CLKDEV_DEV_ID("renesas_usbhs.1", &mstp_clks[MSTP406]), /* USB1 */
|
||||
CLKDEV_DEV_ID("sh_keysc.0", &mstp_clks[MSTP403]), /* KEYSC */
|
||||
|
||||
CLKDEV_ICK_ID("ick", "sh-mobile-hdmi", &div6_reparent_clks[DIV6_HDMI]),
|
||||
|
@ -655,6 +661,13 @@ void __init sh7372_clock_init(void)
|
|||
{
|
||||
int k, ret = 0;
|
||||
|
||||
/* make sure MSTP bits on the RT/SH4AL-DSP side are off */
|
||||
__raw_writel(0xe4ef8087, RMSTPCR0);
|
||||
__raw_writel(0xffffffff, RMSTPCR1);
|
||||
__raw_writel(0x37c7f7ff, RMSTPCR2);
|
||||
__raw_writel(0xffffffff, RMSTPCR3);
|
||||
__raw_writel(0xffe0fffd, RMSTPCR4);
|
||||
|
||||
for (k = 0; !ret && (k < ARRAY_SIZE(main_clks)); k++)
|
||||
ret = clk_register(main_clks[k]);
|
||||
|
||||
|
|
|
@ -266,7 +266,8 @@ enum { MSTP001,
|
|||
MSTP129, MSTP128, MSTP127, MSTP126, MSTP125, MSTP118, MSTP116, MSTP100,
|
||||
MSTP219,
|
||||
MSTP207, MSTP206, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200,
|
||||
MSTP331, MSTP329, MSTP325, MSTP323, MSTP312,
|
||||
MSTP331, MSTP329, MSTP325, MSTP323, MSTP318,
|
||||
MSTP314, MSTP313, MSTP312, MSTP311,
|
||||
MSTP411, MSTP410, MSTP403,
|
||||
MSTP_NR };
|
||||
|
||||
|
@ -295,7 +296,11 @@ static struct clk mstp_clks[MSTP_NR] = {
|
|||
[MSTP329] = MSTP(&r_clk, SMSTPCR3, 29, 0), /* CMT10 */
|
||||
[MSTP325] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR3, 25, 0), /* IrDA */
|
||||
[MSTP323] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 23, 0), /* IIC1 */
|
||||
[MSTP318] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 18, 0), /* SY-DMAC */
|
||||
[MSTP314] = MSTP(&div6_clks[DIV6_SDHI0], SMSTPCR3, 14, 0), /* SDHI0 */
|
||||
[MSTP313] = MSTP(&div6_clks[DIV6_SDHI1], SMSTPCR3, 13, 0), /* SDHI1 */
|
||||
[MSTP312] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 12, 0), /* MMCIF0 */
|
||||
[MSTP311] = MSTP(&div6_clks[DIV6_SDHI2], SMSTPCR3, 11, 0), /* SDHI2 */
|
||||
[MSTP411] = MSTP(&div4_clks[DIV4_HP], SMSTPCR4, 11, 0), /* IIC3 */
|
||||
[MSTP410] = MSTP(&div4_clks[DIV4_HP], SMSTPCR4, 10, 0), /* IIC4 */
|
||||
[MSTP403] = MSTP(&r_clk, SMSTPCR4, 3, 0), /* KEYSC */
|
||||
|
@ -313,6 +318,9 @@ static struct clk_lookup lookups[] = {
|
|||
CLKDEV_CON_ID("vck1_clk", &div6_clks[DIV6_VCK1]),
|
||||
CLKDEV_CON_ID("vck2_clk", &div6_clks[DIV6_VCK2]),
|
||||
CLKDEV_CON_ID("vck3_clk", &div6_clks[DIV6_VCK3]),
|
||||
CLKDEV_CON_ID("sdhi0_clk", &div6_clks[DIV6_SDHI0]),
|
||||
CLKDEV_CON_ID("sdhi1_clk", &div6_clks[DIV6_SDHI1]),
|
||||
CLKDEV_CON_ID("sdhi2_clk", &div6_clks[DIV6_SDHI2]),
|
||||
CLKDEV_ICK_ID("dsit_clk", "sh-mipi-dsi.0", &div6_clks[DIV6_DSIT]),
|
||||
CLKDEV_ICK_ID("dsit_clk", "sh-mipi-dsi.1", &div6_clks[DIV6_DSIT]),
|
||||
CLKDEV_ICK_ID("dsi0p_clk", "sh-mipi-dsi.0", &div6_clks[DIV6_DSI0P]),
|
||||
|
@ -341,7 +349,11 @@ static struct clk_lookup lookups[] = {
|
|||
CLKDEV_DEV_ID("sh_cmt.10", &mstp_clks[MSTP329]), /* CMT10 */
|
||||
CLKDEV_DEV_ID("sh_irda.0", &mstp_clks[MSTP325]), /* IrDA */
|
||||
CLKDEV_DEV_ID("i2c-sh_mobile.1", &mstp_clks[MSTP323]), /* I2C1 */
|
||||
CLKDEV_DEV_ID("sh-dma-engine.0", &mstp_clks[MSTP318]), /* SY-DMAC */
|
||||
CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP314]), /* SDHI0 */
|
||||
CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]), /* SDHI1 */
|
||||
CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP312]), /* MMCIF0 */
|
||||
CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP311]), /* SDHI2 */
|
||||
CLKDEV_DEV_ID("i2c-sh_mobile.3", &mstp_clks[MSTP411]), /* I2C3 */
|
||||
CLKDEV_DEV_ID("i2c-sh_mobile.4", &mstp_clks[MSTP410]), /* I2C4 */
|
||||
CLKDEV_DEV_ID("sh_keysc.0", &mstp_clks[MSTP403]), /* KEYSC */
|
||||
|
@ -351,6 +363,11 @@ void __init sh73a0_clock_init(void)
|
|||
{
|
||||
int k, ret = 0;
|
||||
|
||||
/* Set SDHI clocks to a known state */
|
||||
__raw_writel(0x108, SD0CKCR);
|
||||
__raw_writel(0x108, SD1CKCR);
|
||||
__raw_writel(0x108, SD2CKCR);
|
||||
|
||||
/* detect main clock parent */
|
||||
switch ((__raw_readl(CKSCR) >> 24) & 0x03) {
|
||||
case 0:
|
||||
|
|
|
@ -0,0 +1,92 @@
|
|||
/*
|
||||
* CPUIdle support code for SH-Mobile ARM
|
||||
*
|
||||
* Copyright (C) 2011 Magnus Damm
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#include <linux/pm.h>
|
||||
#include <linux/cpuidle.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/err.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
static void shmobile_enter_wfi(void)
|
||||
{
|
||||
cpu_do_idle();
|
||||
}
|
||||
|
||||
void (*shmobile_cpuidle_modes[CPUIDLE_STATE_MAX])(void) = {
|
||||
shmobile_enter_wfi, /* regular sleep mode */
|
||||
};
|
||||
|
||||
static int shmobile_cpuidle_enter(struct cpuidle_device *dev,
|
||||
struct cpuidle_state *state)
|
||||
{
|
||||
ktime_t before, after;
|
||||
int requested_state = state - &dev->states[0];
|
||||
|
||||
dev->last_state = &dev->states[requested_state];
|
||||
before = ktime_get();
|
||||
|
||||
local_irq_disable();
|
||||
local_fiq_disable();
|
||||
|
||||
shmobile_cpuidle_modes[requested_state]();
|
||||
|
||||
local_irq_enable();
|
||||
local_fiq_enable();
|
||||
|
||||
after = ktime_get();
|
||||
return ktime_to_ns(ktime_sub(after, before)) >> 10;
|
||||
}
|
||||
|
||||
static struct cpuidle_device shmobile_cpuidle_dev;
|
||||
static struct cpuidle_driver shmobile_cpuidle_driver = {
|
||||
.name = "shmobile_cpuidle",
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
void (*shmobile_cpuidle_setup)(struct cpuidle_device *dev);
|
||||
|
||||
static int shmobile_cpuidle_init(void)
|
||||
{
|
||||
struct cpuidle_device *dev = &shmobile_cpuidle_dev;
|
||||
struct cpuidle_state *state;
|
||||
int i;
|
||||
|
||||
cpuidle_register_driver(&shmobile_cpuidle_driver);
|
||||
|
||||
for (i = 0; i < CPUIDLE_STATE_MAX; i++) {
|
||||
dev->states[i].name[0] = '\0';
|
||||
dev->states[i].desc[0] = '\0';
|
||||
dev->states[i].enter = shmobile_cpuidle_enter;
|
||||
}
|
||||
|
||||
i = CPUIDLE_DRIVER_STATE_START;
|
||||
|
||||
state = &dev->states[i++];
|
||||
snprintf(state->name, CPUIDLE_NAME_LEN, "C1");
|
||||
strncpy(state->desc, "WFI", CPUIDLE_DESC_LEN);
|
||||
state->exit_latency = 1;
|
||||
state->target_residency = 1 * 2;
|
||||
state->power_usage = 3;
|
||||
state->flags = 0;
|
||||
state->flags |= CPUIDLE_FLAG_TIME_VALID;
|
||||
|
||||
dev->safe_state = state;
|
||||
dev->state_count = i;
|
||||
|
||||
if (shmobile_cpuidle_setup)
|
||||
shmobile_cpuidle_setup(dev);
|
||||
|
||||
cpuidle_register_device(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
late_initcall(shmobile_cpuidle_init);
|
|
@ -24,4 +24,4 @@
|
|||
.align 12
|
||||
ENTRY(shmobile_secondary_vector)
|
||||
ldr pc, 1f
|
||||
1: .long secondary_startup - PAGE_OFFSET + PHYS_OFFSET
|
||||
1: .long secondary_startup - PAGE_OFFSET + PLAT_PHYS_OFFSET
|
||||
|
|
|
@ -8,6 +8,10 @@ struct clk;
|
|||
extern int clk_init(void);
|
||||
extern void shmobile_handle_irq_intc(struct pt_regs *);
|
||||
extern void shmobile_handle_irq_gic(struct pt_regs *);
|
||||
extern struct platform_suspend_ops shmobile_suspend_ops;
|
||||
struct cpuidle_device;
|
||||
extern void (*shmobile_cpuidle_modes[])(void);
|
||||
extern void (*shmobile_cpuidle_setup)(struct cpuidle_device *dev);
|
||||
|
||||
extern void sh7367_init_irq(void);
|
||||
extern void sh7367_add_early_devices(void);
|
||||
|
@ -30,6 +34,9 @@ extern void sh7372_add_early_devices(void);
|
|||
extern void sh7372_add_standard_devices(void);
|
||||
extern void sh7372_clock_init(void);
|
||||
extern void sh7372_pinmux_init(void);
|
||||
extern void sh7372_pm_init(void);
|
||||
extern void sh7372_cpu_suspend(void);
|
||||
extern void sh7372_cpu_resume(void);
|
||||
extern struct clk sh7372_extal1_clk;
|
||||
extern struct clk sh7372_extal2_clk;
|
||||
|
||||
|
|
|
@ -87,8 +87,7 @@ WAIT 1, 0xFE40009C
|
|||
ED 0xFE400354, 0x01AD8002
|
||||
|
||||
LIST "SCIF0 - Serial port for earlyprintk"
|
||||
EB 0xE6053098, 0x11
|
||||
EB 0xE6053098, 0xe1
|
||||
EW 0xE6C40000, 0x0000
|
||||
EB 0xE6C40004, 0x19
|
||||
EW 0xE6C40008, 0x3000
|
||||
EW 0xE6C40008, 0x0030
|
||||
|
|
|
@ -87,8 +87,7 @@ WAIT 1, 0xFE40009C
|
|||
ED 0xFE400354, 0x01AD8002
|
||||
|
||||
LIST "SCIF0 - Serial port for earlyprintk"
|
||||
EB 0xE6053098, 0x11
|
||||
EB 0xE6053098, 0xe1
|
||||
EW 0xE6C40000, 0x0000
|
||||
EB 0xE6C40004, 0x19
|
||||
EW 0xE6C40008, 0x3000
|
||||
EW 0xE6C40008, 0x0030
|
||||
|
|
|
@ -435,6 +435,7 @@ enum {
|
|||
|
||||
/* DMA slave IDs */
|
||||
enum {
|
||||
SHDMA_SLAVE_INVALID,
|
||||
SHDMA_SLAVE_SCIF0_TX,
|
||||
SHDMA_SLAVE_SCIF0_RX,
|
||||
SHDMA_SLAVE_SCIF1_TX,
|
||||
|
|
|
@ -463,5 +463,35 @@ enum {
|
|||
GPIO_FN_FSIAIBT_PU,
|
||||
GPIO_FN_FSIAISLD_PU,
|
||||
};
|
||||
/* DMA slave IDs */
|
||||
enum {
|
||||
SHDMA_SLAVE_INVALID,
|
||||
SHDMA_SLAVE_SCIF0_TX,
|
||||
SHDMA_SLAVE_SCIF0_RX,
|
||||
SHDMA_SLAVE_SCIF1_TX,
|
||||
SHDMA_SLAVE_SCIF1_RX,
|
||||
SHDMA_SLAVE_SCIF2_TX,
|
||||
SHDMA_SLAVE_SCIF2_RX,
|
||||
SHDMA_SLAVE_SCIF3_TX,
|
||||
SHDMA_SLAVE_SCIF3_RX,
|
||||
SHDMA_SLAVE_SCIF4_TX,
|
||||
SHDMA_SLAVE_SCIF4_RX,
|
||||
SHDMA_SLAVE_SCIF5_TX,
|
||||
SHDMA_SLAVE_SCIF5_RX,
|
||||
SHDMA_SLAVE_SCIF6_TX,
|
||||
SHDMA_SLAVE_SCIF6_RX,
|
||||
SHDMA_SLAVE_SCIF7_TX,
|
||||
SHDMA_SLAVE_SCIF7_RX,
|
||||
SHDMA_SLAVE_SCIF8_TX,
|
||||
SHDMA_SLAVE_SCIF8_RX,
|
||||
SHDMA_SLAVE_SDHI0_TX,
|
||||
SHDMA_SLAVE_SDHI0_RX,
|
||||
SHDMA_SLAVE_SDHI1_TX,
|
||||
SHDMA_SLAVE_SDHI1_RX,
|
||||
SHDMA_SLAVE_SDHI2_TX,
|
||||
SHDMA_SLAVE_SDHI2_RX,
|
||||
SHDMA_SLAVE_MMCIF_TX,
|
||||
SHDMA_SLAVE_MMCIF_RX,
|
||||
};
|
||||
|
||||
#endif /* __ASM_SH73A0_H__ */
|
||||
|
|
|
@ -27,8 +27,6 @@
|
|||
|
||||
enum {
|
||||
UNUSED_INTCA = 0,
|
||||
ENABLED,
|
||||
DISABLED,
|
||||
|
||||
/* interrupt sources INTCA */
|
||||
IRQ0A, IRQ1A, IRQ2A, IRQ3A, IRQ4A, IRQ5A, IRQ6A, IRQ7A,
|
||||
|
@ -49,14 +47,14 @@ enum {
|
|||
MSIOF2, MSIOF1,
|
||||
SCIFA4, SCIFA5, SCIFB,
|
||||
FLCTL_FLSTEI, FLCTL_FLTENDI, FLCTL_FLTREQ0I, FLCTL_FLTREQ1I,
|
||||
SDHI0,
|
||||
SDHI1,
|
||||
SDHI0_SDHI0I0, SDHI0_SDHI0I1, SDHI0_SDHI0I2, SDHI0_SDHI0I3,
|
||||
SDHI1_SDHI1I0, SDHI1_SDHI1I1, SDHI1_SDHI1I2,
|
||||
IRREM,
|
||||
IRDA,
|
||||
TPU0,
|
||||
TTI20,
|
||||
DDM,
|
||||
SDHI2,
|
||||
SDHI2_SDHI2I0, SDHI2_SDHI2I1, SDHI2_SDHI2I2, SDHI2_SDHI2I3,
|
||||
RWDT0,
|
||||
DMAC1_1_DEI0, DMAC1_1_DEI1, DMAC1_1_DEI2, DMAC1_1_DEI3,
|
||||
DMAC1_2_DEI4, DMAC1_2_DEI5, DMAC1_2_DADERR,
|
||||
|
@ -84,7 +82,7 @@ enum {
|
|||
|
||||
/* interrupt groups INTCA */
|
||||
DMAC1_1, DMAC1_2, DMAC2_1, DMAC2_2, DMAC3_1, DMAC3_2, SHWYSTAT,
|
||||
AP_ARM1, AP_ARM2, SPU2, FLCTL, IIC1
|
||||
AP_ARM1, AP_ARM2, SPU2, FLCTL, IIC1, SDHI0, SDHI1, SDHI2
|
||||
};
|
||||
|
||||
static struct intc_vect intca_vectors[] __initdata = {
|
||||
|
@ -125,17 +123,17 @@ static struct intc_vect intca_vectors[] __initdata = {
|
|||
INTC_VECT(SCIFB, 0x0d60),
|
||||
INTC_VECT(FLCTL_FLSTEI, 0x0d80), INTC_VECT(FLCTL_FLTENDI, 0x0da0),
|
||||
INTC_VECT(FLCTL_FLTREQ0I, 0x0dc0), INTC_VECT(FLCTL_FLTREQ1I, 0x0de0),
|
||||
INTC_VECT(SDHI0, 0x0e00), INTC_VECT(SDHI0, 0x0e20),
|
||||
INTC_VECT(SDHI0, 0x0e40), INTC_VECT(SDHI0, 0x0e60),
|
||||
INTC_VECT(SDHI1, 0x0e80), INTC_VECT(SDHI1, 0x0ea0),
|
||||
INTC_VECT(SDHI1, 0x0ec0),
|
||||
INTC_VECT(SDHI0_SDHI0I0, 0x0e00), INTC_VECT(SDHI0_SDHI0I1, 0x0e20),
|
||||
INTC_VECT(SDHI0_SDHI0I2, 0x0e40), INTC_VECT(SDHI0_SDHI0I3, 0x0e60),
|
||||
INTC_VECT(SDHI1_SDHI1I0, 0x0e80), INTC_VECT(SDHI1_SDHI1I1, 0x0ea0),
|
||||
INTC_VECT(SDHI1_SDHI1I2, 0x0ec0),
|
||||
INTC_VECT(IRREM, 0x0f60),
|
||||
INTC_VECT(IRDA, 0x0480),
|
||||
INTC_VECT(TPU0, 0x04a0),
|
||||
INTC_VECT(TTI20, 0x1100),
|
||||
INTC_VECT(DDM, 0x1140),
|
||||
INTC_VECT(SDHI2, 0x1200), INTC_VECT(SDHI2, 0x1220),
|
||||
INTC_VECT(SDHI2, 0x1240), INTC_VECT(SDHI2, 0x1260),
|
||||
INTC_VECT(SDHI2_SDHI2I0, 0x1200), INTC_VECT(SDHI2_SDHI2I1, 0x1220),
|
||||
INTC_VECT(SDHI2_SDHI2I2, 0x1240), INTC_VECT(SDHI2_SDHI2I3, 0x1260),
|
||||
INTC_VECT(RWDT0, 0x1280),
|
||||
INTC_VECT(DMAC1_1_DEI0, 0x2000), INTC_VECT(DMAC1_1_DEI1, 0x2020),
|
||||
INTC_VECT(DMAC1_1_DEI2, 0x2040), INTC_VECT(DMAC1_1_DEI3, 0x2060),
|
||||
|
@ -195,6 +193,12 @@ static struct intc_group intca_groups[] __initdata = {
|
|||
INTC_GROUP(FLCTL, FLCTL_FLSTEI, FLCTL_FLTENDI,
|
||||
FLCTL_FLTREQ0I, FLCTL_FLTREQ1I),
|
||||
INTC_GROUP(IIC1, IIC1_ALI1, IIC1_TACKI1, IIC1_WAITI1, IIC1_DTEI1),
|
||||
INTC_GROUP(SDHI0, SDHI0_SDHI0I0, SDHI0_SDHI0I1,
|
||||
SDHI0_SDHI0I2, SDHI0_SDHI0I3),
|
||||
INTC_GROUP(SDHI1, SDHI1_SDHI1I0, SDHI1_SDHI1I1,
|
||||
SDHI1_SDHI1I2),
|
||||
INTC_GROUP(SDHI2, SDHI2_SDHI2I0, SDHI2_SDHI2I1,
|
||||
SDHI2_SDHI2I2, SDHI2_SDHI2I3),
|
||||
INTC_GROUP(SHWYSTAT, SHWYSTAT_RT, SHWYSTAT_HS, SHWYSTAT_COM),
|
||||
};
|
||||
|
||||
|
@ -230,10 +234,10 @@ static struct intc_mask_reg intca_mask_registers[] __initdata = {
|
|||
{ SCIFB, SCIFA5, SCIFA4, MSIOF1,
|
||||
0, 0, MSIOF2, 0 } },
|
||||
{ 0xe694009c, 0xe69400dc, 8, /* IMR7A / IMCR7A */
|
||||
{ DISABLED, ENABLED, ENABLED, ENABLED,
|
||||
{ SDHI0_SDHI0I3, SDHI0_SDHI0I2, SDHI0_SDHI0I1, SDHI0_SDHI0I0,
|
||||
FLCTL_FLTREQ1I, FLCTL_FLTREQ0I, FLCTL_FLTENDI, FLCTL_FLSTEI } },
|
||||
{ 0xe69400a0, 0xe69400e0, 8, /* IMR8A / IMCR8A */
|
||||
{ 0, ENABLED, ENABLED, ENABLED,
|
||||
{ 0, SDHI1_SDHI1I2, SDHI1_SDHI1I1, SDHI1_SDHI1I0,
|
||||
TTI20, USBHSDMAC0_USHDMI, 0, 0 } },
|
||||
{ 0xe69400a4, 0xe69400e4, 8, /* IMR9A / IMCR9A */
|
||||
{ CMT1_CMT13, CMT1_CMT12, CMT1_CMT11, CMT1_CMT10,
|
||||
|
@ -248,7 +252,7 @@ static struct intc_mask_reg intca_mask_registers[] __initdata = {
|
|||
{ 0, 0, TPU0, 0,
|
||||
0, 0, 0, 0 } },
|
||||
{ 0xe69400b4, 0xe69400f4, 8, /* IMR13A / IMCR13A */
|
||||
{ DISABLED, DISABLED, ENABLED, ENABLED,
|
||||
{ SDHI2_SDHI2I3, SDHI2_SDHI2I2, SDHI2_SDHI2I1, SDHI2_SDHI2I0,
|
||||
0, CMT3, 0, RWDT0 } },
|
||||
{ 0xe6950080, 0xe69500c0, 8, /* IMR0A3 / IMCR0A3 */
|
||||
{ SHWYSTAT_RT, SHWYSTAT_HS, SHWYSTAT_COM, 0,
|
||||
|
@ -354,14 +358,10 @@ static struct intc_mask_reg intca_ack_registers[] __initdata = {
|
|||
{ IRQ24A, IRQ25A, IRQ26A, IRQ27A, IRQ28A, IRQ29A, IRQ30A, IRQ31A } },
|
||||
};
|
||||
|
||||
static struct intc_desc intca_desc __initdata = {
|
||||
.name = "sh7372-intca",
|
||||
.force_enable = ENABLED,
|
||||
.force_disable = DISABLED,
|
||||
.hw = INTC_HW_DESC(intca_vectors, intca_groups,
|
||||
intca_mask_registers, intca_prio_registers,
|
||||
intca_sense_registers, intca_ack_registers),
|
||||
};
|
||||
static DECLARE_INTC_DESC_ACK(intca_desc, "sh7372-intca",
|
||||
intca_vectors, intca_groups,
|
||||
intca_mask_registers, intca_prio_registers,
|
||||
intca_sense_registers, intca_ack_registers);
|
||||
|
||||
enum {
|
||||
UNUSED_INTCS = 0,
|
||||
|
|
|
@ -0,0 +1,108 @@
|
|||
/*
|
||||
* sh7372 Power management support
|
||||
*
|
||||
* Copyright (C) 2011 Magnus Damm
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#include <linux/pm.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/cpuidle.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/slab.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/tlbflush.h>
|
||||
#include <mach/common.h>
|
||||
|
||||
#define SMFRAM 0xe6a70000
|
||||
#define SYSTBCR 0xe6150024
|
||||
#define SBAR 0xe6180020
|
||||
#define APARMBAREA 0xe6f10020
|
||||
|
||||
static void sh7372_enter_core_standby(void)
|
||||
{
|
||||
void __iomem *smfram = (void __iomem *)SMFRAM;
|
||||
|
||||
__raw_writel(0, APARMBAREA); /* translate 4k */
|
||||
__raw_writel(__pa(sh7372_cpu_resume), SBAR); /* set reset vector */
|
||||
__raw_writel(0x10, SYSTBCR); /* enable core standby */
|
||||
|
||||
__raw_writel(0, smfram + 0x3c); /* clear page table address */
|
||||
|
||||
sh7372_cpu_suspend();
|
||||
cpu_init();
|
||||
|
||||
/* if page table address is non-NULL then we have been powered down */
|
||||
if (__raw_readl(smfram + 0x3c)) {
|
||||
__raw_writel(__raw_readl(smfram + 0x40),
|
||||
__va(__raw_readl(smfram + 0x3c)));
|
||||
|
||||
flush_tlb_all();
|
||||
set_cr(__raw_readl(smfram + 0x38));
|
||||
}
|
||||
|
||||
__raw_writel(0, SYSTBCR); /* disable core standby */
|
||||
__raw_writel(0, SBAR); /* disable reset vector translation */
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CPU_IDLE
|
||||
static void sh7372_cpuidle_setup(struct cpuidle_device *dev)
|
||||
{
|
||||
struct cpuidle_state *state;
|
||||
int i = dev->state_count;
|
||||
|
||||
state = &dev->states[i];
|
||||
snprintf(state->name, CPUIDLE_NAME_LEN, "C2");
|
||||
strncpy(state->desc, "Core Standby Mode", CPUIDLE_DESC_LEN);
|
||||
state->exit_latency = 10;
|
||||
state->target_residency = 20 + 10;
|
||||
state->power_usage = 1; /* perhaps not */
|
||||
state->flags = 0;
|
||||
state->flags |= CPUIDLE_FLAG_TIME_VALID;
|
||||
shmobile_cpuidle_modes[i] = sh7372_enter_core_standby;
|
||||
|
||||
dev->state_count = i + 1;
|
||||
}
|
||||
|
||||
static void sh7372_cpuidle_init(void)
|
||||
{
|
||||
shmobile_cpuidle_setup = sh7372_cpuidle_setup;
|
||||
}
|
||||
#else
|
||||
static void sh7372_cpuidle_init(void) {}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SUSPEND
|
||||
static int sh7372_enter_suspend(suspend_state_t suspend_state)
|
||||
{
|
||||
sh7372_enter_core_standby();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void sh7372_suspend_init(void)
|
||||
{
|
||||
shmobile_suspend_ops.enter = sh7372_enter_suspend;
|
||||
}
|
||||
#else
|
||||
static void sh7372_suspend_init(void) {}
|
||||
#endif
|
||||
|
||||
#define DBGREG1 0xe6100020
|
||||
#define DBGREG9 0xe6100040
|
||||
|
||||
void __init sh7372_pm_init(void)
|
||||
{
|
||||
/* enable DBG hardware block to kick SYSC */
|
||||
__raw_writel(0x0000a500, DBGREG9);
|
||||
__raw_writel(0x0000a501, DBGREG9);
|
||||
__raw_writel(0x00000000, DBGREG1);
|
||||
|
||||
sh7372_suspend_init();
|
||||
sh7372_cpuidle_init();
|
||||
}
|
|
@ -22,6 +22,7 @@
|
|||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/uio_driver.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/io.h>
|
||||
|
@ -195,6 +196,214 @@ static struct platform_device cmt10_device = {
|
|||
.num_resources = ARRAY_SIZE(cmt10_resources),
|
||||
};
|
||||
|
||||
/* VPU */
|
||||
static struct uio_info vpu_platform_data = {
|
||||
.name = "VPU5",
|
||||
.version = "0",
|
||||
.irq = intcs_evt2irq(0x980),
|
||||
};
|
||||
|
||||
static struct resource vpu_resources[] = {
|
||||
[0] = {
|
||||
.name = "VPU",
|
||||
.start = 0xfe900000,
|
||||
.end = 0xfe902807,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device vpu_device = {
|
||||
.name = "uio_pdrv_genirq",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &vpu_platform_data,
|
||||
},
|
||||
.resource = vpu_resources,
|
||||
.num_resources = ARRAY_SIZE(vpu_resources),
|
||||
};
|
||||
|
||||
/* VEU0 */
|
||||
static struct uio_info veu0_platform_data = {
|
||||
.name = "VEU0",
|
||||
.version = "0",
|
||||
.irq = intcs_evt2irq(0x700),
|
||||
};
|
||||
|
||||
static struct resource veu0_resources[] = {
|
||||
[0] = {
|
||||
.name = "VEU0",
|
||||
.start = 0xfe920000,
|
||||
.end = 0xfe9200b7,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device veu0_device = {
|
||||
.name = "uio_pdrv_genirq",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = &veu0_platform_data,
|
||||
},
|
||||
.resource = veu0_resources,
|
||||
.num_resources = ARRAY_SIZE(veu0_resources),
|
||||
};
|
||||
|
||||
/* VEU1 */
|
||||
static struct uio_info veu1_platform_data = {
|
||||
.name = "VEU1",
|
||||
.version = "0",
|
||||
.irq = intcs_evt2irq(0x720),
|
||||
};
|
||||
|
||||
static struct resource veu1_resources[] = {
|
||||
[0] = {
|
||||
.name = "VEU1",
|
||||
.start = 0xfe924000,
|
||||
.end = 0xfe9240b7,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device veu1_device = {
|
||||
.name = "uio_pdrv_genirq",
|
||||
.id = 2,
|
||||
.dev = {
|
||||
.platform_data = &veu1_platform_data,
|
||||
},
|
||||
.resource = veu1_resources,
|
||||
.num_resources = ARRAY_SIZE(veu1_resources),
|
||||
};
|
||||
|
||||
/* VEU2 */
|
||||
static struct uio_info veu2_platform_data = {
|
||||
.name = "VEU2",
|
||||
.version = "0",
|
||||
.irq = intcs_evt2irq(0x740),
|
||||
};
|
||||
|
||||
static struct resource veu2_resources[] = {
|
||||
[0] = {
|
||||
.name = "VEU2",
|
||||
.start = 0xfe928000,
|
||||
.end = 0xfe9280b7,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device veu2_device = {
|
||||
.name = "uio_pdrv_genirq",
|
||||
.id = 3,
|
||||
.dev = {
|
||||
.platform_data = &veu2_platform_data,
|
||||
},
|
||||
.resource = veu2_resources,
|
||||
.num_resources = ARRAY_SIZE(veu2_resources),
|
||||
};
|
||||
|
||||
/* VEU3 */
|
||||
static struct uio_info veu3_platform_data = {
|
||||
.name = "VEU3",
|
||||
.version = "0",
|
||||
.irq = intcs_evt2irq(0x760),
|
||||
};
|
||||
|
||||
static struct resource veu3_resources[] = {
|
||||
[0] = {
|
||||
.name = "VEU3",
|
||||
.start = 0xfe92c000,
|
||||
.end = 0xfe92c0b7,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device veu3_device = {
|
||||
.name = "uio_pdrv_genirq",
|
||||
.id = 4,
|
||||
.dev = {
|
||||
.platform_data = &veu3_platform_data,
|
||||
},
|
||||
.resource = veu3_resources,
|
||||
.num_resources = ARRAY_SIZE(veu3_resources),
|
||||
};
|
||||
|
||||
/* VEU2H */
|
||||
static struct uio_info veu2h_platform_data = {
|
||||
.name = "VEU2H",
|
||||
.version = "0",
|
||||
.irq = intcs_evt2irq(0x520),
|
||||
};
|
||||
|
||||
static struct resource veu2h_resources[] = {
|
||||
[0] = {
|
||||
.name = "VEU2H",
|
||||
.start = 0xfe93c000,
|
||||
.end = 0xfe93c27b,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device veu2h_device = {
|
||||
.name = "uio_pdrv_genirq",
|
||||
.id = 5,
|
||||
.dev = {
|
||||
.platform_data = &veu2h_platform_data,
|
||||
},
|
||||
.resource = veu2h_resources,
|
||||
.num_resources = ARRAY_SIZE(veu2h_resources),
|
||||
};
|
||||
|
||||
/* JPU */
|
||||
static struct uio_info jpu_platform_data = {
|
||||
.name = "JPU",
|
||||
.version = "0",
|
||||
.irq = intcs_evt2irq(0x560),
|
||||
};
|
||||
|
||||
static struct resource jpu_resources[] = {
|
||||
[0] = {
|
||||
.name = "JPU",
|
||||
.start = 0xfe980000,
|
||||
.end = 0xfe9902d3,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device jpu_device = {
|
||||
.name = "uio_pdrv_genirq",
|
||||
.id = 6,
|
||||
.dev = {
|
||||
.platform_data = &jpu_platform_data,
|
||||
},
|
||||
.resource = jpu_resources,
|
||||
.num_resources = ARRAY_SIZE(jpu_resources),
|
||||
};
|
||||
|
||||
/* SPU1 */
|
||||
static struct uio_info spu1_platform_data = {
|
||||
.name = "SPU1",
|
||||
.version = "0",
|
||||
.irq = evt2irq(0xfc0),
|
||||
};
|
||||
|
||||
static struct resource spu1_resources[] = {
|
||||
[0] = {
|
||||
.name = "SPU1",
|
||||
.start = 0xfe300000,
|
||||
.end = 0xfe3fffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device spu1_device = {
|
||||
.name = "uio_pdrv_genirq",
|
||||
.id = 7,
|
||||
.dev = {
|
||||
.platform_data = &spu1_platform_data,
|
||||
},
|
||||
.resource = spu1_resources,
|
||||
.num_resources = ARRAY_SIZE(spu1_resources),
|
||||
};
|
||||
|
||||
static struct platform_device *sh7367_early_devices[] __initdata = {
|
||||
&scif0_device,
|
||||
&scif1_device,
|
||||
|
@ -206,10 +415,24 @@ static struct platform_device *sh7367_early_devices[] __initdata = {
|
|||
&cmt10_device,
|
||||
};
|
||||
|
||||
static struct platform_device *sh7367_devices[] __initdata = {
|
||||
&vpu_device,
|
||||
&veu0_device,
|
||||
&veu1_device,
|
||||
&veu2_device,
|
||||
&veu3_device,
|
||||
&veu2h_device,
|
||||
&jpu_device,
|
||||
&spu1_device,
|
||||
};
|
||||
|
||||
void __init sh7367_add_standard_devices(void)
|
||||
{
|
||||
platform_add_devices(sh7367_early_devices,
|
||||
ARRAY_SIZE(sh7367_early_devices));
|
||||
|
||||
platform_add_devices(sh7367_devices,
|
||||
ARRAY_SIZE(sh7367_devices));
|
||||
}
|
||||
|
||||
#define SYMSTPCR2 0xe6158048
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/uio_driver.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/io.h>
|
||||
|
@ -601,6 +602,214 @@ static struct platform_device dma2_device = {
|
|||
},
|
||||
};
|
||||
|
||||
/* VPU */
|
||||
static struct uio_info vpu_platform_data = {
|
||||
.name = "VPU5HG",
|
||||
.version = "0",
|
||||
.irq = intcs_evt2irq(0x980),
|
||||
};
|
||||
|
||||
static struct resource vpu_resources[] = {
|
||||
[0] = {
|
||||
.name = "VPU",
|
||||
.start = 0xfe900000,
|
||||
.end = 0xfe900157,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device vpu_device = {
|
||||
.name = "uio_pdrv_genirq",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &vpu_platform_data,
|
||||
},
|
||||
.resource = vpu_resources,
|
||||
.num_resources = ARRAY_SIZE(vpu_resources),
|
||||
};
|
||||
|
||||
/* VEU0 */
|
||||
static struct uio_info veu0_platform_data = {
|
||||
.name = "VEU0",
|
||||
.version = "0",
|
||||
.irq = intcs_evt2irq(0x700),
|
||||
};
|
||||
|
||||
static struct resource veu0_resources[] = {
|
||||
[0] = {
|
||||
.name = "VEU0",
|
||||
.start = 0xfe920000,
|
||||
.end = 0xfe9200cb,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device veu0_device = {
|
||||
.name = "uio_pdrv_genirq",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = &veu0_platform_data,
|
||||
},
|
||||
.resource = veu0_resources,
|
||||
.num_resources = ARRAY_SIZE(veu0_resources),
|
||||
};
|
||||
|
||||
/* VEU1 */
|
||||
static struct uio_info veu1_platform_data = {
|
||||
.name = "VEU1",
|
||||
.version = "0",
|
||||
.irq = intcs_evt2irq(0x720),
|
||||
};
|
||||
|
||||
static struct resource veu1_resources[] = {
|
||||
[0] = {
|
||||
.name = "VEU1",
|
||||
.start = 0xfe924000,
|
||||
.end = 0xfe9240cb,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device veu1_device = {
|
||||
.name = "uio_pdrv_genirq",
|
||||
.id = 2,
|
||||
.dev = {
|
||||
.platform_data = &veu1_platform_data,
|
||||
},
|
||||
.resource = veu1_resources,
|
||||
.num_resources = ARRAY_SIZE(veu1_resources),
|
||||
};
|
||||
|
||||
/* VEU2 */
|
||||
static struct uio_info veu2_platform_data = {
|
||||
.name = "VEU2",
|
||||
.version = "0",
|
||||
.irq = intcs_evt2irq(0x740),
|
||||
};
|
||||
|
||||
static struct resource veu2_resources[] = {
|
||||
[0] = {
|
||||
.name = "VEU2",
|
||||
.start = 0xfe928000,
|
||||
.end = 0xfe928307,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device veu2_device = {
|
||||
.name = "uio_pdrv_genirq",
|
||||
.id = 3,
|
||||
.dev = {
|
||||
.platform_data = &veu2_platform_data,
|
||||
},
|
||||
.resource = veu2_resources,
|
||||
.num_resources = ARRAY_SIZE(veu2_resources),
|
||||
};
|
||||
|
||||
/* VEU3 */
|
||||
static struct uio_info veu3_platform_data = {
|
||||
.name = "VEU3",
|
||||
.version = "0",
|
||||
.irq = intcs_evt2irq(0x760),
|
||||
};
|
||||
|
||||
static struct resource veu3_resources[] = {
|
||||
[0] = {
|
||||
.name = "VEU3",
|
||||
.start = 0xfe92c000,
|
||||
.end = 0xfe92c307,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device veu3_device = {
|
||||
.name = "uio_pdrv_genirq",
|
||||
.id = 4,
|
||||
.dev = {
|
||||
.platform_data = &veu3_platform_data,
|
||||
},
|
||||
.resource = veu3_resources,
|
||||
.num_resources = ARRAY_SIZE(veu3_resources),
|
||||
};
|
||||
|
||||
/* JPU */
|
||||
static struct uio_info jpu_platform_data = {
|
||||
.name = "JPU",
|
||||
.version = "0",
|
||||
.irq = intcs_evt2irq(0x560),
|
||||
};
|
||||
|
||||
static struct resource jpu_resources[] = {
|
||||
[0] = {
|
||||
.name = "JPU",
|
||||
.start = 0xfe980000,
|
||||
.end = 0xfe9902d3,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device jpu_device = {
|
||||
.name = "uio_pdrv_genirq",
|
||||
.id = 5,
|
||||
.dev = {
|
||||
.platform_data = &jpu_platform_data,
|
||||
},
|
||||
.resource = jpu_resources,
|
||||
.num_resources = ARRAY_SIZE(jpu_resources),
|
||||
};
|
||||
|
||||
/* SPU2DSP0 */
|
||||
static struct uio_info spu0_platform_data = {
|
||||
.name = "SPU2DSP0",
|
||||
.version = "0",
|
||||
.irq = evt2irq(0x1800),
|
||||
};
|
||||
|
||||
static struct resource spu0_resources[] = {
|
||||
[0] = {
|
||||
.name = "SPU2DSP0",
|
||||
.start = 0xfe200000,
|
||||
.end = 0xfe2fffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device spu0_device = {
|
||||
.name = "uio_pdrv_genirq",
|
||||
.id = 6,
|
||||
.dev = {
|
||||
.platform_data = &spu0_platform_data,
|
||||
},
|
||||
.resource = spu0_resources,
|
||||
.num_resources = ARRAY_SIZE(spu0_resources),
|
||||
};
|
||||
|
||||
/* SPU2DSP1 */
|
||||
static struct uio_info spu1_platform_data = {
|
||||
.name = "SPU2DSP1",
|
||||
.version = "0",
|
||||
.irq = evt2irq(0x1820),
|
||||
};
|
||||
|
||||
static struct resource spu1_resources[] = {
|
||||
[0] = {
|
||||
.name = "SPU2DSP1",
|
||||
.start = 0xfe300000,
|
||||
.end = 0xfe3fffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device spu1_device = {
|
||||
.name = "uio_pdrv_genirq",
|
||||
.id = 7,
|
||||
.dev = {
|
||||
.platform_data = &spu1_platform_data,
|
||||
},
|
||||
.resource = spu1_resources,
|
||||
.num_resources = ARRAY_SIZE(spu1_resources),
|
||||
};
|
||||
|
||||
static struct platform_device *sh7372_early_devices[] __initdata = {
|
||||
&scif0_device,
|
||||
&scif1_device,
|
||||
|
@ -620,6 +829,14 @@ static struct platform_device *sh7372_late_devices[] __initdata = {
|
|||
&dma0_device,
|
||||
&dma1_device,
|
||||
&dma2_device,
|
||||
&vpu_device,
|
||||
&veu0_device,
|
||||
&veu1_device,
|
||||
&veu2_device,
|
||||
&veu3_device,
|
||||
&jpu_device,
|
||||
&spu0_device,
|
||||
&spu1_device,
|
||||
};
|
||||
|
||||
void __init sh7372_add_standard_devices(void)
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/uio_driver.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/io.h>
|
||||
|
@ -38,7 +39,7 @@ static struct plat_sci_port scif0_platform_data = {
|
|||
.flags = UPF_BOOT_AUTOCONF,
|
||||
.scscr = SCSCR_RE | SCSCR_TE,
|
||||
.scbrr_algo_id = SCBRR_ALGO_4,
|
||||
.type = PORT_SCIF,
|
||||
.type = PORT_SCIFA,
|
||||
.irqs = { evt2irq(0xc00), evt2irq(0xc00),
|
||||
evt2irq(0xc00), evt2irq(0xc00) },
|
||||
};
|
||||
|
@ -57,7 +58,7 @@ static struct plat_sci_port scif1_platform_data = {
|
|||
.flags = UPF_BOOT_AUTOCONF,
|
||||
.scscr = SCSCR_RE | SCSCR_TE,
|
||||
.scbrr_algo_id = SCBRR_ALGO_4,
|
||||
.type = PORT_SCIF,
|
||||
.type = PORT_SCIFA,
|
||||
.irqs = { evt2irq(0xc20), evt2irq(0xc20),
|
||||
evt2irq(0xc20), evt2irq(0xc20) },
|
||||
};
|
||||
|
@ -76,7 +77,7 @@ static struct plat_sci_port scif2_platform_data = {
|
|||
.flags = UPF_BOOT_AUTOCONF,
|
||||
.scscr = SCSCR_RE | SCSCR_TE,
|
||||
.scbrr_algo_id = SCBRR_ALGO_4,
|
||||
.type = PORT_SCIF,
|
||||
.type = PORT_SCIFA,
|
||||
.irqs = { evt2irq(0xc40), evt2irq(0xc40),
|
||||
evt2irq(0xc40), evt2irq(0xc40) },
|
||||
};
|
||||
|
@ -95,7 +96,7 @@ static struct plat_sci_port scif3_platform_data = {
|
|||
.flags = UPF_BOOT_AUTOCONF,
|
||||
.scscr = SCSCR_RE | SCSCR_TE,
|
||||
.scbrr_algo_id = SCBRR_ALGO_4,
|
||||
.type = PORT_SCIF,
|
||||
.type = PORT_SCIFA,
|
||||
.irqs = { evt2irq(0xc60), evt2irq(0xc60),
|
||||
evt2irq(0xc60), evt2irq(0xc60) },
|
||||
};
|
||||
|
@ -114,7 +115,7 @@ static struct plat_sci_port scif4_platform_data = {
|
|||
.flags = UPF_BOOT_AUTOCONF,
|
||||
.scscr = SCSCR_RE | SCSCR_TE,
|
||||
.scbrr_algo_id = SCBRR_ALGO_4,
|
||||
.type = PORT_SCIF,
|
||||
.type = PORT_SCIFA,
|
||||
.irqs = { evt2irq(0xd20), evt2irq(0xd20),
|
||||
evt2irq(0xd20), evt2irq(0xd20) },
|
||||
};
|
||||
|
@ -133,7 +134,7 @@ static struct plat_sci_port scif5_platform_data = {
|
|||
.flags = UPF_BOOT_AUTOCONF,
|
||||
.scscr = SCSCR_RE | SCSCR_TE,
|
||||
.scbrr_algo_id = SCBRR_ALGO_4,
|
||||
.type = PORT_SCIF,
|
||||
.type = PORT_SCIFA,
|
||||
.irqs = { evt2irq(0xd40), evt2irq(0xd40),
|
||||
evt2irq(0xd40), evt2irq(0xd40) },
|
||||
};
|
||||
|
@ -152,7 +153,7 @@ static struct plat_sci_port scif6_platform_data = {
|
|||
.flags = UPF_BOOT_AUTOCONF,
|
||||
.scscr = SCSCR_RE | SCSCR_TE,
|
||||
.scbrr_algo_id = SCBRR_ALGO_4,
|
||||
.type = PORT_SCIF,
|
||||
.type = PORT_SCIFA,
|
||||
.irqs = { intcs_evt2irq(0x1a80), intcs_evt2irq(0x1a80),
|
||||
intcs_evt2irq(0x1a80), intcs_evt2irq(0x1a80) },
|
||||
};
|
||||
|
@ -171,7 +172,7 @@ static struct plat_sci_port scif7_platform_data = {
|
|||
.flags = UPF_BOOT_AUTOCONF,
|
||||
.scscr = SCSCR_RE | SCSCR_TE,
|
||||
.scbrr_algo_id = SCBRR_ALGO_4,
|
||||
.type = PORT_SCIF,
|
||||
.type = PORT_SCIFB,
|
||||
.irqs = { evt2irq(0xd60), evt2irq(0xd60),
|
||||
evt2irq(0xd60), evt2irq(0xd60) },
|
||||
};
|
||||
|
@ -215,6 +216,214 @@ static struct platform_device cmt10_device = {
|
|||
.num_resources = ARRAY_SIZE(cmt10_resources),
|
||||
};
|
||||
|
||||
/* VPU */
|
||||
static struct uio_info vpu_platform_data = {
|
||||
.name = "VPU5HG",
|
||||
.version = "0",
|
||||
.irq = intcs_evt2irq(0x980),
|
||||
};
|
||||
|
||||
static struct resource vpu_resources[] = {
|
||||
[0] = {
|
||||
.name = "VPU",
|
||||
.start = 0xfe900000,
|
||||
.end = 0xfe900157,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device vpu_device = {
|
||||
.name = "uio_pdrv_genirq",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &vpu_platform_data,
|
||||
},
|
||||
.resource = vpu_resources,
|
||||
.num_resources = ARRAY_SIZE(vpu_resources),
|
||||
};
|
||||
|
||||
/* VEU0 */
|
||||
static struct uio_info veu0_platform_data = {
|
||||
.name = "VEU0",
|
||||
.version = "0",
|
||||
.irq = intcs_evt2irq(0x700),
|
||||
};
|
||||
|
||||
static struct resource veu0_resources[] = {
|
||||
[0] = {
|
||||
.name = "VEU0",
|
||||
.start = 0xfe920000,
|
||||
.end = 0xfe9200cb,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device veu0_device = {
|
||||
.name = "uio_pdrv_genirq",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = &veu0_platform_data,
|
||||
},
|
||||
.resource = veu0_resources,
|
||||
.num_resources = ARRAY_SIZE(veu0_resources),
|
||||
};
|
||||
|
||||
/* VEU1 */
|
||||
static struct uio_info veu1_platform_data = {
|
||||
.name = "VEU1",
|
||||
.version = "0",
|
||||
.irq = intcs_evt2irq(0x720),
|
||||
};
|
||||
|
||||
static struct resource veu1_resources[] = {
|
||||
[0] = {
|
||||
.name = "VEU1",
|
||||
.start = 0xfe924000,
|
||||
.end = 0xfe9240cb,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device veu1_device = {
|
||||
.name = "uio_pdrv_genirq",
|
||||
.id = 2,
|
||||
.dev = {
|
||||
.platform_data = &veu1_platform_data,
|
||||
},
|
||||
.resource = veu1_resources,
|
||||
.num_resources = ARRAY_SIZE(veu1_resources),
|
||||
};
|
||||
|
||||
/* VEU2 */
|
||||
static struct uio_info veu2_platform_data = {
|
||||
.name = "VEU2",
|
||||
.version = "0",
|
||||
.irq = intcs_evt2irq(0x740),
|
||||
};
|
||||
|
||||
static struct resource veu2_resources[] = {
|
||||
[0] = {
|
||||
.name = "VEU2",
|
||||
.start = 0xfe928000,
|
||||
.end = 0xfe928307,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device veu2_device = {
|
||||
.name = "uio_pdrv_genirq",
|
||||
.id = 3,
|
||||
.dev = {
|
||||
.platform_data = &veu2_platform_data,
|
||||
},
|
||||
.resource = veu2_resources,
|
||||
.num_resources = ARRAY_SIZE(veu2_resources),
|
||||
};
|
||||
|
||||
/* VEU3 */
|
||||
static struct uio_info veu3_platform_data = {
|
||||
.name = "VEU3",
|
||||
.version = "0",
|
||||
.irq = intcs_evt2irq(0x760),
|
||||
};
|
||||
|
||||
static struct resource veu3_resources[] = {
|
||||
[0] = {
|
||||
.name = "VEU3",
|
||||
.start = 0xfe92c000,
|
||||
.end = 0xfe92c307,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device veu3_device = {
|
||||
.name = "uio_pdrv_genirq",
|
||||
.id = 4,
|
||||
.dev = {
|
||||
.platform_data = &veu3_platform_data,
|
||||
},
|
||||
.resource = veu3_resources,
|
||||
.num_resources = ARRAY_SIZE(veu3_resources),
|
||||
};
|
||||
|
||||
/* JPU */
|
||||
static struct uio_info jpu_platform_data = {
|
||||
.name = "JPU",
|
||||
.version = "0",
|
||||
.irq = intcs_evt2irq(0x560),
|
||||
};
|
||||
|
||||
static struct resource jpu_resources[] = {
|
||||
[0] = {
|
||||
.name = "JPU",
|
||||
.start = 0xfe980000,
|
||||
.end = 0xfe9902d3,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device jpu_device = {
|
||||
.name = "uio_pdrv_genirq",
|
||||
.id = 5,
|
||||
.dev = {
|
||||
.platform_data = &jpu_platform_data,
|
||||
},
|
||||
.resource = jpu_resources,
|
||||
.num_resources = ARRAY_SIZE(jpu_resources),
|
||||
};
|
||||
|
||||
/* SPU2DSP0 */
|
||||
static struct uio_info spu0_platform_data = {
|
||||
.name = "SPU2DSP0",
|
||||
.version = "0",
|
||||
.irq = evt2irq(0x1800),
|
||||
};
|
||||
|
||||
static struct resource spu0_resources[] = {
|
||||
[0] = {
|
||||
.name = "SPU2DSP0",
|
||||
.start = 0xfe200000,
|
||||
.end = 0xfe2fffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device spu0_device = {
|
||||
.name = "uio_pdrv_genirq",
|
||||
.id = 6,
|
||||
.dev = {
|
||||
.platform_data = &spu0_platform_data,
|
||||
},
|
||||
.resource = spu0_resources,
|
||||
.num_resources = ARRAY_SIZE(spu0_resources),
|
||||
};
|
||||
|
||||
/* SPU2DSP1 */
|
||||
static struct uio_info spu1_platform_data = {
|
||||
.name = "SPU2DSP1",
|
||||
.version = "0",
|
||||
.irq = evt2irq(0x1820),
|
||||
};
|
||||
|
||||
static struct resource spu1_resources[] = {
|
||||
[0] = {
|
||||
.name = "SPU2DSP1",
|
||||
.start = 0xfe300000,
|
||||
.end = 0xfe3fffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device spu1_device = {
|
||||
.name = "uio_pdrv_genirq",
|
||||
.id = 7,
|
||||
.dev = {
|
||||
.platform_data = &spu1_platform_data,
|
||||
},
|
||||
.resource = spu1_resources,
|
||||
.num_resources = ARRAY_SIZE(spu1_resources),
|
||||
};
|
||||
|
||||
static struct platform_device *sh7377_early_devices[] __initdata = {
|
||||
&scif0_device,
|
||||
&scif1_device,
|
||||
|
@ -227,10 +436,24 @@ static struct platform_device *sh7377_early_devices[] __initdata = {
|
|||
&cmt10_device,
|
||||
};
|
||||
|
||||
static struct platform_device *sh7377_devices[] __initdata = {
|
||||
&vpu_device,
|
||||
&veu0_device,
|
||||
&veu1_device,
|
||||
&veu2_device,
|
||||
&veu3_device,
|
||||
&jpu_device,
|
||||
&spu0_device,
|
||||
&spu1_device,
|
||||
};
|
||||
|
||||
void __init sh7377_add_standard_devices(void)
|
||||
{
|
||||
platform_add_devices(sh7377_early_devices,
|
||||
ARRAY_SIZE(sh7377_early_devices));
|
||||
|
||||
platform_add_devices(sh7377_devices,
|
||||
ARRAY_SIZE(sh7377_devices));
|
||||
}
|
||||
|
||||
#define SMSTPCR3 0xe615013c
|
||||
|
|
|
@ -27,9 +27,11 @@
|
|||
#include <linux/input.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/serial_sci.h>
|
||||
#include <linux/sh_dma.h>
|
||||
#include <linux/sh_intc.h>
|
||||
#include <linux/sh_timer.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/sh73a0.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
|
||||
|
@ -392,6 +394,242 @@ static struct platform_device i2c4_device = {
|
|||
.num_resources = ARRAY_SIZE(i2c4_resources),
|
||||
};
|
||||
|
||||
/* Transmit sizes and respective CHCR register values */
|
||||
enum {
|
||||
XMIT_SZ_8BIT = 0,
|
||||
XMIT_SZ_16BIT = 1,
|
||||
XMIT_SZ_32BIT = 2,
|
||||
XMIT_SZ_64BIT = 7,
|
||||
XMIT_SZ_128BIT = 3,
|
||||
XMIT_SZ_256BIT = 4,
|
||||
XMIT_SZ_512BIT = 5,
|
||||
};
|
||||
|
||||
/* log2(size / 8) - used to calculate number of transfers */
|
||||
#define TS_SHIFT { \
|
||||
[XMIT_SZ_8BIT] = 0, \
|
||||
[XMIT_SZ_16BIT] = 1, \
|
||||
[XMIT_SZ_32BIT] = 2, \
|
||||
[XMIT_SZ_64BIT] = 3, \
|
||||
[XMIT_SZ_128BIT] = 4, \
|
||||
[XMIT_SZ_256BIT] = 5, \
|
||||
[XMIT_SZ_512BIT] = 6, \
|
||||
}
|
||||
|
||||
#define TS_INDEX2VAL(i) ((((i) & 3) << 3) | (((i) & 0xc) << (20 - 2)))
|
||||
#define CHCR_TX(xmit_sz) (DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL((xmit_sz)))
|
||||
#define CHCR_RX(xmit_sz) (DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL((xmit_sz)))
|
||||
|
||||
static const struct sh_dmae_slave_config sh73a0_dmae_slaves[] = {
|
||||
{
|
||||
.slave_id = SHDMA_SLAVE_SCIF0_TX,
|
||||
.addr = 0xe6c40020,
|
||||
.chcr = CHCR_TX(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x21,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF0_RX,
|
||||
.addr = 0xe6c40024,
|
||||
.chcr = CHCR_RX(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x22,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF1_TX,
|
||||
.addr = 0xe6c50020,
|
||||
.chcr = CHCR_TX(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x25,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF1_RX,
|
||||
.addr = 0xe6c50024,
|
||||
.chcr = CHCR_RX(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x26,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF2_TX,
|
||||
.addr = 0xe6c60020,
|
||||
.chcr = CHCR_TX(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x29,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF2_RX,
|
||||
.addr = 0xe6c60024,
|
||||
.chcr = CHCR_RX(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x2a,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF3_TX,
|
||||
.addr = 0xe6c70020,
|
||||
.chcr = CHCR_TX(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x2d,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF3_RX,
|
||||
.addr = 0xe6c70024,
|
||||
.chcr = CHCR_RX(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x2e,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF4_TX,
|
||||
.addr = 0xe6c80020,
|
||||
.chcr = CHCR_TX(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x39,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF4_RX,
|
||||
.addr = 0xe6c80024,
|
||||
.chcr = CHCR_RX(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x3a,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF5_TX,
|
||||
.addr = 0xe6cb0020,
|
||||
.chcr = CHCR_TX(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x35,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF5_RX,
|
||||
.addr = 0xe6cb0024,
|
||||
.chcr = CHCR_RX(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x36,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF6_TX,
|
||||
.addr = 0xe6cc0020,
|
||||
.chcr = CHCR_TX(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x1d,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF6_RX,
|
||||
.addr = 0xe6cc0024,
|
||||
.chcr = CHCR_RX(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x1e,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF7_TX,
|
||||
.addr = 0xe6cd0020,
|
||||
.chcr = CHCR_TX(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x19,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF7_RX,
|
||||
.addr = 0xe6cd0024,
|
||||
.chcr = CHCR_RX(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x1a,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF8_TX,
|
||||
.addr = 0xe6c30040,
|
||||
.chcr = CHCR_TX(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x3d,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF8_RX,
|
||||
.addr = 0xe6c30060,
|
||||
.chcr = CHCR_RX(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x3e,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SDHI0_TX,
|
||||
.addr = 0xee100030,
|
||||
.chcr = CHCR_TX(XMIT_SZ_16BIT),
|
||||
.mid_rid = 0xc1,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SDHI0_RX,
|
||||
.addr = 0xee100030,
|
||||
.chcr = CHCR_RX(XMIT_SZ_16BIT),
|
||||
.mid_rid = 0xc2,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SDHI1_TX,
|
||||
.addr = 0xee120030,
|
||||
.chcr = CHCR_TX(XMIT_SZ_16BIT),
|
||||
.mid_rid = 0xc9,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SDHI1_RX,
|
||||
.addr = 0xee120030,
|
||||
.chcr = CHCR_RX(XMIT_SZ_16BIT),
|
||||
.mid_rid = 0xca,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SDHI2_TX,
|
||||
.addr = 0xee140030,
|
||||
.chcr = CHCR_TX(XMIT_SZ_16BIT),
|
||||
.mid_rid = 0xcd,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SDHI2_RX,
|
||||
.addr = 0xee140030,
|
||||
.chcr = CHCR_RX(XMIT_SZ_16BIT),
|
||||
.mid_rid = 0xce,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_MMCIF_TX,
|
||||
.addr = 0xe6bd0034,
|
||||
.chcr = CHCR_TX(XMIT_SZ_32BIT),
|
||||
.mid_rid = 0xd1,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_MMCIF_RX,
|
||||
.addr = 0xe6bd0034,
|
||||
.chcr = CHCR_RX(XMIT_SZ_32BIT),
|
||||
.mid_rid = 0xd2,
|
||||
},
|
||||
};
|
||||
|
||||
#define DMAE_CHANNEL(_offset) \
|
||||
{ \
|
||||
.offset = _offset - 0x20, \
|
||||
.dmars = _offset - 0x20 + 0x40, \
|
||||
}
|
||||
|
||||
static const struct sh_dmae_channel sh73a0_dmae_channels[] = {
|
||||
DMAE_CHANNEL(0x8000),
|
||||
DMAE_CHANNEL(0x8080),
|
||||
DMAE_CHANNEL(0x8100),
|
||||
DMAE_CHANNEL(0x8180),
|
||||
DMAE_CHANNEL(0x8200),
|
||||
DMAE_CHANNEL(0x8280),
|
||||
DMAE_CHANNEL(0x8300),
|
||||
DMAE_CHANNEL(0x8380),
|
||||
DMAE_CHANNEL(0x8400),
|
||||
DMAE_CHANNEL(0x8480),
|
||||
DMAE_CHANNEL(0x8500),
|
||||
DMAE_CHANNEL(0x8580),
|
||||
DMAE_CHANNEL(0x8600),
|
||||
DMAE_CHANNEL(0x8680),
|
||||
DMAE_CHANNEL(0x8700),
|
||||
DMAE_CHANNEL(0x8780),
|
||||
DMAE_CHANNEL(0x8800),
|
||||
DMAE_CHANNEL(0x8880),
|
||||
DMAE_CHANNEL(0x8900),
|
||||
DMAE_CHANNEL(0x8980),
|
||||
};
|
||||
|
||||
static const unsigned int ts_shift[] = TS_SHIFT;
|
||||
|
||||
static struct sh_dmae_pdata sh73a0_dmae_platform_data = {
|
||||
.slave = sh73a0_dmae_slaves,
|
||||
.slave_num = ARRAY_SIZE(sh73a0_dmae_slaves),
|
||||
.channel = sh73a0_dmae_channels,
|
||||
.channel_num = ARRAY_SIZE(sh73a0_dmae_channels),
|
||||
.ts_low_shift = 3,
|
||||
.ts_low_mask = 0x18,
|
||||
.ts_high_shift = (20 - 2), /* 2 bits for shifted low TS */
|
||||
.ts_high_mask = 0x00300000,
|
||||
.ts_shift = ts_shift,
|
||||
.ts_shift_num = ARRAY_SIZE(ts_shift),
|
||||
.dmaor_init = DMAOR_DME,
|
||||
};
|
||||
|
||||
static struct resource sh73a0_dmae_resources[] = {
|
||||
{
|
||||
/* Registers including DMAOR and channels including DMARSx */
|
||||
.start = 0xfe000020,
|
||||
.end = 0xfe008a00 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
/* DMA error IRQ */
|
||||
.start = gic_spi(129),
|
||||
.end = gic_spi(129),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
{
|
||||
/* IRQ for channels 0-19 */
|
||||
.start = gic_spi(109),
|
||||
.end = gic_spi(128),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device dma0_device = {
|
||||
.name = "sh-dma-engine",
|
||||
.id = 0,
|
||||
.resource = sh73a0_dmae_resources,
|
||||
.num_resources = ARRAY_SIZE(sh73a0_dmae_resources),
|
||||
.dev = {
|
||||
.platform_data = &sh73a0_dmae_platform_data,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device *sh73a0_early_devices[] __initdata = {
|
||||
&scif0_device,
|
||||
&scif1_device,
|
||||
|
@ -413,10 +651,16 @@ static struct platform_device *sh73a0_late_devices[] __initdata = {
|
|||
&i2c2_device,
|
||||
&i2c3_device,
|
||||
&i2c4_device,
|
||||
&dma0_device,
|
||||
};
|
||||
|
||||
#define SRCR2 0xe61580b0
|
||||
|
||||
void __init sh73a0_add_standard_devices(void)
|
||||
{
|
||||
/* Clear software reset bit on SY-DMAC module */
|
||||
__raw_writel(__raw_readl(SRCR2) & ~(1 << 18), SRCR2);
|
||||
|
||||
platform_add_devices(sh73a0_early_devices,
|
||||
ARRAY_SIZE(sh73a0_early_devices));
|
||||
platform_add_devices(sh73a0_late_devices,
|
||||
|
|
|
@ -0,0 +1,260 @@
|
|||
/*
|
||||
* sh7372 lowlevel sleep code for "Core Standby Mode"
|
||||
*
|
||||
* Copyright (C) 2011 Magnus Damm
|
||||
*
|
||||
* In "Core Standby Mode" the ARM core is off, but L2 cache is still on
|
||||
*
|
||||
* Based on mach-omap2/sleep34xx.S
|
||||
*
|
||||
* (C) Copyright 2007 Texas Instruments
|
||||
* Karthik Dasu <karthik-dp@ti.com>
|
||||
*
|
||||
* (C) Copyright 2004 Texas Instruments, <www.ti.com>
|
||||
* Richard Woodruff <r-woodruff2@ti.com>
|
||||
*
|
||||
* 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/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
|
||||
#define SMFRAM 0xe6a70000
|
||||
|
||||
.align
|
||||
kernel_flush:
|
||||
.word v7_flush_dcache_all
|
||||
|
||||
.align 3
|
||||
ENTRY(sh7372_cpu_suspend)
|
||||
stmfd sp!, {r0-r12, lr} @ save registers on stack
|
||||
|
||||
ldr r8, =SMFRAM
|
||||
|
||||
mov r4, sp @ Store sp
|
||||
mrs r5, spsr @ Store spsr
|
||||
mov r6, lr @ Store lr
|
||||
stmia r8!, {r4-r6}
|
||||
|
||||
mrc p15, 0, r4, c1, c0, 2 @ Coprocessor access control register
|
||||
mrc p15, 0, r5, c2, c0, 0 @ TTBR0
|
||||
mrc p15, 0, r6, c2, c0, 1 @ TTBR1
|
||||
mrc p15, 0, r7, c2, c0, 2 @ TTBCR
|
||||
stmia r8!, {r4-r7}
|
||||
|
||||
mrc p15, 0, r4, c3, c0, 0 @ Domain access Control Register
|
||||
mrc p15, 0, r5, c10, c2, 0 @ PRRR
|
||||
mrc p15, 0, r6, c10, c2, 1 @ NMRR
|
||||
stmia r8!,{r4-r6}
|
||||
|
||||
mrc p15, 0, r4, c13, c0, 1 @ Context ID
|
||||
mrc p15, 0, r5, c13, c0, 2 @ User r/w thread and process ID
|
||||
mrc p15, 0, r6, c12, c0, 0 @ Secure or NS vector base address
|
||||
mrs r7, cpsr @ Store current cpsr
|
||||
stmia r8!, {r4-r7}
|
||||
|
||||
mrc p15, 0, r4, c1, c0, 0 @ save control register
|
||||
stmia r8!, {r4}
|
||||
|
||||
/*
|
||||
* jump out to kernel flush routine
|
||||
* - reuse that code is better
|
||||
* - it executes in a cached space so is faster than refetch per-block
|
||||
* - should be faster and will change with kernel
|
||||
* - 'might' have to copy address, load and jump to it
|
||||
* Flush all data from the L1 data cache before disabling
|
||||
* SCTLR.C bit.
|
||||
*/
|
||||
ldr r1, kernel_flush
|
||||
mov lr, pc
|
||||
bx r1
|
||||
|
||||
/*
|
||||
* Clear the SCTLR.C bit to prevent further data cache
|
||||
* allocation. Clearing SCTLR.C would make all the data accesses
|
||||
* strongly ordered and would not hit the cache.
|
||||
*/
|
||||
mrc p15, 0, r0, c1, c0, 0
|
||||
bic r0, r0, #(1 << 2) @ Disable the C bit
|
||||
mcr p15, 0, r0, c1, c0, 0
|
||||
isb
|
||||
|
||||
/*
|
||||
* Invalidate L1 data cache. Even though only invalidate is
|
||||
* necessary exported flush API is used here. Doing clean
|
||||
* on already clean cache would be almost NOP.
|
||||
*/
|
||||
ldr r1, kernel_flush
|
||||
blx r1
|
||||
/*
|
||||
* The kernel doesn't interwork: v7_flush_dcache_all in particluar will
|
||||
* always return in Thumb state when CONFIG_THUMB2_KERNEL is enabled.
|
||||
* This sequence switches back to ARM. Note that .align may insert a
|
||||
* nop: bx pc needs to be word-aligned in order to work.
|
||||
*/
|
||||
THUMB( .thumb )
|
||||
THUMB( .align )
|
||||
THUMB( bx pc )
|
||||
THUMB( nop )
|
||||
.arm
|
||||
|
||||
/* Data memory barrier and Data sync barrier */
|
||||
dsb
|
||||
dmb
|
||||
|
||||
/*
|
||||
* ===================================
|
||||
* == WFI instruction => Enter idle ==
|
||||
* ===================================
|
||||
*/
|
||||
wfi @ wait for interrupt
|
||||
|
||||
/*
|
||||
* ===================================
|
||||
* == Resume path for non-OFF modes ==
|
||||
* ===================================
|
||||
*/
|
||||
mrc p15, 0, r0, c1, c0, 0
|
||||
tst r0, #(1 << 2) @ Check C bit enabled?
|
||||
orreq r0, r0, #(1 << 2) @ Enable the C bit if cleared
|
||||
mcreq p15, 0, r0, c1, c0, 0
|
||||
isb
|
||||
|
||||
/*
|
||||
* ===================================
|
||||
* == Exit point from non-OFF modes ==
|
||||
* ===================================
|
||||
*/
|
||||
ldmfd sp!, {r0-r12, pc} @ restore regs and return
|
||||
|
||||
.pool
|
||||
|
||||
.align 12
|
||||
.text
|
||||
.global sh7372_cpu_resume
|
||||
sh7372_cpu_resume:
|
||||
|
||||
mov r1, #0
|
||||
/*
|
||||
* Invalidate all instruction caches to PoU
|
||||
* and flush branch target cache
|
||||
*/
|
||||
mcr p15, 0, r1, c7, c5, 0
|
||||
|
||||
ldr r3, =SMFRAM
|
||||
|
||||
ldmia r3!, {r4-r6}
|
||||
mov sp, r4 @ Restore sp
|
||||
msr spsr_cxsf, r5 @ Restore spsr
|
||||
mov lr, r6 @ Restore lr
|
||||
|
||||
ldmia r3!, {r4-r7}
|
||||
mcr p15, 0, r4, c1, c0, 2 @ Coprocessor access Control Register
|
||||
mcr p15, 0, r5, c2, c0, 0 @ TTBR0
|
||||
mcr p15, 0, r6, c2, c0, 1 @ TTBR1
|
||||
mcr p15, 0, r7, c2, c0, 2 @ TTBCR
|
||||
|
||||
ldmia r3!,{r4-r6}
|
||||
mcr p15, 0, r4, c3, c0, 0 @ Domain access Control Register
|
||||
mcr p15, 0, r5, c10, c2, 0 @ PRRR
|
||||
mcr p15, 0, r6, c10, c2, 1 @ NMRR
|
||||
|
||||
ldmia r3!,{r4-r7}
|
||||
mcr p15, 0, r4, c13, c0, 1 @ Context ID
|
||||
mcr p15, 0, r5, c13, c0, 2 @ User r/w thread and process ID
|
||||
mrc p15, 0, r6, c12, c0, 0 @ Secure or NS vector base address
|
||||
msr cpsr, r7 @ store cpsr
|
||||
|
||||
/* Starting to enable MMU here */
|
||||
mrc p15, 0, r7, c2, c0, 2 @ Read TTBRControl
|
||||
/* Extract N (0:2) bits and decide whether to use TTBR0 or TTBR1 */
|
||||
and r7, #0x7
|
||||
cmp r7, #0x0
|
||||
beq usettbr0
|
||||
ttbr_error:
|
||||
/*
|
||||
* More work needs to be done to support N[0:2] value other than 0
|
||||
* So looping here so that the error can be detected
|
||||
*/
|
||||
b ttbr_error
|
||||
|
||||
.align
|
||||
cache_pred_disable_mask:
|
||||
.word 0xFFFFE7FB
|
||||
ttbrbit_mask:
|
||||
.word 0xFFFFC000
|
||||
table_index_mask:
|
||||
.word 0xFFF00000
|
||||
table_entry:
|
||||
.word 0x00000C02
|
||||
usettbr0:
|
||||
|
||||
mrc p15, 0, r2, c2, c0, 0
|
||||
ldr r5, ttbrbit_mask
|
||||
and r2, r5
|
||||
mov r4, pc
|
||||
ldr r5, table_index_mask
|
||||
and r4, r5 @ r4 = 31 to 20 bits of pc
|
||||
/* Extract the value to be written to table entry */
|
||||
ldr r6, table_entry
|
||||
/* r6 has the value to be written to table entry */
|
||||
add r6, r6, r4
|
||||
/* Getting the address of table entry to modify */
|
||||
lsr r4, #18
|
||||
/* r2 has the location which needs to be modified */
|
||||
add r2, r4
|
||||
ldr r4, [r2]
|
||||
str r6, [r2] /* modify the table entry */
|
||||
|
||||
mov r7, r6
|
||||
mov r5, r2
|
||||
mov r6, r4
|
||||
/* r5 = original page table address */
|
||||
/* r6 = original page table data */
|
||||
|
||||
mov r0, #0
|
||||
mcr p15, 0, r0, c7, c5, 4 @ Flush prefetch buffer
|
||||
mcr p15, 0, r0, c7, c5, 6 @ Invalidate branch predictor array
|
||||
mcr p15, 0, r0, c8, c5, 0 @ Invalidate instruction TLB
|
||||
mcr p15, 0, r0, c8, c6, 0 @ Invalidate data TLB
|
||||
|
||||
/*
|
||||
* Restore control register. This enables the MMU.
|
||||
* The caches and prediction are not enabled here, they
|
||||
* will be enabled after restoring the MMU table entry.
|
||||
*/
|
||||
ldmia r3!, {r4}
|
||||
stmia r3!, {r5} /* save original page table address */
|
||||
stmia r3!, {r6} /* save original page table data */
|
||||
stmia r3!, {r7} /* save modified page table data */
|
||||
|
||||
ldr r2, cache_pred_disable_mask
|
||||
and r4, r2
|
||||
mcr p15, 0, r4, c1, c0, 0
|
||||
dsb
|
||||
isb
|
||||
|
||||
ldr r0, =restoremmu_on
|
||||
bx r0
|
||||
|
||||
/*
|
||||
* ==============================
|
||||
* == Exit point from OFF mode ==
|
||||
* ==============================
|
||||
*/
|
||||
restoremmu_on:
|
||||
|
||||
ldmfd sp!, {r0-r12, pc} @ restore regs and return
|
|
@ -59,6 +59,11 @@ unsigned int __init sh73a0_get_core_count(void)
|
|||
{
|
||||
void __iomem *scu_base = scu_base_addr();
|
||||
|
||||
#ifdef CONFIG_HAVE_ARM_TWD
|
||||
/* twd_base needs to be initialized before percpu_timer_setup() */
|
||||
twd_base = (void __iomem *)0xf0000600;
|
||||
#endif
|
||||
|
||||
return scu_get_core_count(scu_base);
|
||||
}
|
||||
|
||||
|
@ -82,10 +87,6 @@ int __cpuinit sh73a0_boot_secondary(unsigned int cpu)
|
|||
|
||||
void __init sh73a0_smp_prepare_cpus(void)
|
||||
{
|
||||
#ifdef CONFIG_HAVE_ARM_TWD
|
||||
twd_base = (void __iomem *)0xf0000600;
|
||||
#endif
|
||||
|
||||
scu_enable(scu_base_addr());
|
||||
|
||||
/* Map the reset vector (in headsmp.S) */
|
||||
|
|
|
@ -0,0 +1,47 @@
|
|||
/*
|
||||
* Suspend-to-RAM support code for SH-Mobile ARM
|
||||
*
|
||||
* Copyright (C) 2011 Magnus Damm
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#include <linux/pm.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/err.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
static int shmobile_suspend_default_enter(suspend_state_t suspend_state)
|
||||
{
|
||||
cpu_do_idle();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int shmobile_suspend_begin(suspend_state_t state)
|
||||
{
|
||||
disable_hlt();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void shmobile_suspend_end(void)
|
||||
{
|
||||
enable_hlt();
|
||||
}
|
||||
|
||||
struct platform_suspend_ops shmobile_suspend_ops = {
|
||||
.begin = shmobile_suspend_begin,
|
||||
.end = shmobile_suspend_end,
|
||||
.enter = shmobile_suspend_default_enter,
|
||||
.valid = suspend_valid_only_mem,
|
||||
};
|
||||
|
||||
static int __init shmobile_suspend_init(void)
|
||||
{
|
||||
suspend_set_ops(&shmobile_suspend_ops);
|
||||
return 0;
|
||||
}
|
||||
late_initcall(shmobile_suspend_init);
|
|
@ -24,6 +24,7 @@ struct tegra_sdhci_platform_data {
|
|||
int wp_gpio;
|
||||
int power_gpio;
|
||||
int is_8bit;
|
||||
int pm_flags;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -12,9 +12,12 @@ menu "Ux500 SoC"
|
|||
|
||||
config UX500_SOC_DB5500
|
||||
bool "DB5500"
|
||||
select MFD_DB5500_PRCMU
|
||||
|
||||
config UX500_SOC_DB8500
|
||||
bool "DB8500"
|
||||
select MFD_DB8500_PRCMU
|
||||
select REGULATOR_DB8500_PRCMU
|
||||
|
||||
endmenu
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
obj-y := clock.o cpu.o devices.o devices-common.o \
|
||||
id.o usb.o
|
||||
obj-$(CONFIG_UX500_SOC_DB5500) += cpu-db5500.o dma-db5500.o
|
||||
obj-$(CONFIG_UX500_SOC_DB8500) += cpu-db8500.o devices-db8500.o prcmu.o
|
||||
obj-$(CONFIG_UX500_SOC_DB8500) += cpu-db8500.o devices-db8500.o
|
||||
obj-$(CONFIG_MACH_U8500) += board-mop500.o board-mop500-sdi.o \
|
||||
board-mop500-regulators.o \
|
||||
board-mop500-uib.o board-mop500-stuib.o \
|
||||
|
@ -17,4 +17,4 @@ obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
|
|||
obj-$(CONFIG_LOCAL_TIMERS) += localtimer.o
|
||||
obj-$(CONFIG_U5500_MODEM_IRQ) += modem-irq-db5500.o
|
||||
obj-$(CONFIG_U5500_MBOX) += mbox-db5500.o
|
||||
obj-$(CONFIG_CPU_FREQ) += cpufreq.o
|
||||
|
||||
|
|
|
@ -204,7 +204,7 @@ static struct i2c_board_info __initdata mop500_i2c2_devices[] = {
|
|||
},
|
||||
};
|
||||
|
||||
#define U8500_I2C_CONTROLLER(id, _slsu, _tft, _rft, clk, _sm) \
|
||||
#define U8500_I2C_CONTROLLER(id, _slsu, _tft, _rft, clk, t_out, _sm) \
|
||||
static struct nmk_i2c_controller u8500_i2c##id##_data = { \
|
||||
/* \
|
||||
* slave data setup time, which is \
|
||||
|
@ -219,19 +219,21 @@ static struct nmk_i2c_controller u8500_i2c##id##_data = { \
|
|||
.rft = _rft, \
|
||||
/* std. mode operation */ \
|
||||
.clk_freq = clk, \
|
||||
/* Slave response timeout(ms) */\
|
||||
.timeout = t_out, \
|
||||
.sm = _sm, \
|
||||
}
|
||||
|
||||
/*
|
||||
* The board uses 4 i2c controllers, initialize all of
|
||||
* them with slave data setup time of 250 ns,
|
||||
* Tx & Rx FIFO threshold values as 1 and standard
|
||||
* Tx & Rx FIFO threshold values as 8 and standard
|
||||
* mode of operation
|
||||
*/
|
||||
U8500_I2C_CONTROLLER(0, 0xe, 1, 1, 100000, I2C_FREQ_MODE_STANDARD);
|
||||
U8500_I2C_CONTROLLER(1, 0xe, 1, 1, 100000, I2C_FREQ_MODE_STANDARD);
|
||||
U8500_I2C_CONTROLLER(2, 0xe, 1, 1, 100000, I2C_FREQ_MODE_STANDARD);
|
||||
U8500_I2C_CONTROLLER(3, 0xe, 1, 1, 100000, I2C_FREQ_MODE_STANDARD);
|
||||
U8500_I2C_CONTROLLER(0, 0xe, 1, 8, 100000, 200, I2C_FREQ_MODE_FAST);
|
||||
U8500_I2C_CONTROLLER(1, 0xe, 1, 8, 100000, 200, I2C_FREQ_MODE_FAST);
|
||||
U8500_I2C_CONTROLLER(2, 0xe, 1, 8, 100000, 200, I2C_FREQ_MODE_FAST);
|
||||
U8500_I2C_CONTROLLER(3, 0xe, 1, 8, 100000, 200, I2C_FREQ_MODE_FAST);
|
||||
|
||||
static void __init mop500_i2c_init(void)
|
||||
{
|
||||
|
|
|
@ -188,6 +188,8 @@ void __init u5500_map_io(void)
|
|||
ux500_map_io();
|
||||
|
||||
iotable_init(u5500_io_desc, ARRAY_SIZE(u5500_io_desc));
|
||||
|
||||
_PRCMU_BASE = __io_address(U5500_PRCMU_BASE);
|
||||
}
|
||||
|
||||
static int usb_db5500_rx_dma_cfg[] = {
|
||||
|
|
|
@ -87,6 +87,8 @@ void __init u8500_map_io(void)
|
|||
iotable_init(u8500_v1_io_desc, ARRAY_SIZE(u8500_v1_io_desc));
|
||||
else if (cpu_is_u8500v2())
|
||||
iotable_init(u8500_v2_io_desc, ARRAY_SIZE(u8500_v2_io_desc));
|
||||
|
||||
_PRCMU_BASE = __io_address(U8500_PRCMU_BASE);
|
||||
}
|
||||
|
||||
static struct resource db8500_pmu_resources[] = {
|
||||
|
@ -129,9 +131,14 @@ static struct platform_device db8500_pmu_device = {
|
|||
.dev.platform_data = &db8500_pmu_platdata,
|
||||
};
|
||||
|
||||
static struct platform_device db8500_prcmu_device = {
|
||||
.name = "db8500-prcmu",
|
||||
};
|
||||
|
||||
static struct platform_device *platform_devs[] __initdata = {
|
||||
&u8500_dma40_device,
|
||||
&db8500_pmu_device,
|
||||
&db8500_prcmu_device,
|
||||
};
|
||||
|
||||
static resource_size_t __initdata db8500_gpio_base[] = {
|
||||
|
|
|
@ -8,6 +8,8 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/mfd/db8500-prcmu.h>
|
||||
#include <linux/mfd/db5500-prcmu.h>
|
||||
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/hardware/cache-l2x0.h>
|
||||
|
@ -19,10 +21,11 @@
|
|||
#include <mach/hardware.h>
|
||||
#include <mach/setup.h>
|
||||
#include <mach/devices.h>
|
||||
#include <mach/prcmu.h>
|
||||
|
||||
#include "clock.h"
|
||||
|
||||
void __iomem *_PRCMU_BASE;
|
||||
|
||||
#ifdef CONFIG_CACHE_L2X0
|
||||
static void __iomem *l2x0_base;
|
||||
#endif
|
||||
|
@ -47,6 +50,8 @@ void __init ux500_init_irq(void)
|
|||
* Init clocks here so that they are available for system timer
|
||||
* initialization.
|
||||
*/
|
||||
if (cpu_is_u5500())
|
||||
db5500_prcmu_early_init();
|
||||
if (cpu_is_u8500())
|
||||
prcmu_early_init();
|
||||
clk_init();
|
||||
|
|
|
@ -1,211 +0,0 @@
|
|||
/*
|
||||
* CPU frequency scaling for u8500
|
||||
* Inspired by linux/arch/arm/mach-davinci/cpufreq.c
|
||||
*
|
||||
* Copyright (C) STMicroelectronics 2009
|
||||
* Copyright (C) ST-Ericsson SA 2010
|
||||
*
|
||||
* License Terms: GNU General Public License v2
|
||||
*
|
||||
* Author: Sundar Iyer <sundar.iyer@stericsson.com>
|
||||
* Author: Martin Persson <martin.persson@stericsson.com>
|
||||
* Author: Jonas Aaberg <jonas.aberg@stericsson.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/cpufreq.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/prcmu.h>
|
||||
#include <mach/prcmu-defs.h>
|
||||
|
||||
#define DRIVER_NAME "cpufreq-u8500"
|
||||
#define CPUFREQ_NAME "u8500"
|
||||
|
||||
static struct device *dev;
|
||||
|
||||
static struct cpufreq_frequency_table freq_table[] = {
|
||||
[0] = {
|
||||
.index = 0,
|
||||
.frequency = 200000,
|
||||
},
|
||||
[1] = {
|
||||
.index = 1,
|
||||
.frequency = 300000,
|
||||
},
|
||||
[2] = {
|
||||
.index = 2,
|
||||
.frequency = 600000,
|
||||
},
|
||||
[3] = {
|
||||
/* Used for CPU_OPP_MAX, if available */
|
||||
.index = 3,
|
||||
.frequency = CPUFREQ_TABLE_END,
|
||||
},
|
||||
[4] = {
|
||||
.index = 4,
|
||||
.frequency = CPUFREQ_TABLE_END,
|
||||
},
|
||||
};
|
||||
|
||||
static enum prcmu_cpu_opp index2opp[] = {
|
||||
CPU_OPP_EXT_CLK,
|
||||
CPU_OPP_50,
|
||||
CPU_OPP_100,
|
||||
CPU_OPP_MAX
|
||||
};
|
||||
|
||||
static int u8500_cpufreq_verify_speed(struct cpufreq_policy *policy)
|
||||
{
|
||||
return cpufreq_frequency_table_verify(policy, freq_table);
|
||||
}
|
||||
|
||||
static int u8500_cpufreq_target(struct cpufreq_policy *policy,
|
||||
unsigned int target_freq,
|
||||
unsigned int relation)
|
||||
{
|
||||
struct cpufreq_freqs freqs;
|
||||
unsigned int index;
|
||||
int ret = 0;
|
||||
|
||||
/*
|
||||
* Ensure desired rate is within allowed range. Some govenors
|
||||
* (ondemand) will just pass target_freq=0 to get the minimum.
|
||||
*/
|
||||
if (target_freq < policy->cpuinfo.min_freq)
|
||||
target_freq = policy->cpuinfo.min_freq;
|
||||
if (target_freq > policy->cpuinfo.max_freq)
|
||||
target_freq = policy->cpuinfo.max_freq;
|
||||
|
||||
ret = cpufreq_frequency_table_target(policy, freq_table,
|
||||
target_freq, relation, &index);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Could not look up next frequency\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
freqs.old = policy->cur;
|
||||
freqs.new = freq_table[index].frequency;
|
||||
freqs.cpu = policy->cpu;
|
||||
|
||||
if (freqs.old == freqs.new) {
|
||||
dev_dbg(dev, "Current and target frequencies are equal\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
dev_dbg(dev, "transition: %u --> %u\n", freqs.old, freqs.new);
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
ret = prcmu_set_cpu_opp(index2opp[index]);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Failed to set OPP level\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static unsigned int u8500_cpufreq_getspeed(unsigned int cpu)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; prcmu_get_cpu_opp() != index2opp[i]; i++)
|
||||
;
|
||||
return freq_table[i].frequency;
|
||||
}
|
||||
|
||||
static int __cpuinit u8500_cpu_init(struct cpufreq_policy *policy)
|
||||
{
|
||||
int res;
|
||||
|
||||
BUILD_BUG_ON(ARRAY_SIZE(index2opp) + 1 != ARRAY_SIZE(freq_table));
|
||||
|
||||
if (cpu_is_u8500v2()) {
|
||||
freq_table[1].frequency = 400000;
|
||||
freq_table[2].frequency = 800000;
|
||||
if (prcmu_has_arm_maxopp())
|
||||
freq_table[3].frequency = 1000000;
|
||||
}
|
||||
|
||||
/* get policy fields based on the table */
|
||||
res = cpufreq_frequency_table_cpuinfo(policy, freq_table);
|
||||
if (!res)
|
||||
cpufreq_frequency_table_get_attr(freq_table, policy->cpu);
|
||||
else {
|
||||
dev_err(dev, "u8500-cpufreq : Failed to read policy table\n");
|
||||
return res;
|
||||
}
|
||||
|
||||
policy->min = policy->cpuinfo.min_freq;
|
||||
policy->max = policy->cpuinfo.max_freq;
|
||||
policy->cur = u8500_cpufreq_getspeed(policy->cpu);
|
||||
policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
|
||||
|
||||
/*
|
||||
* FIXME : Need to take time measurement across the target()
|
||||
* function with no/some/all drivers in the notification
|
||||
* list.
|
||||
*/
|
||||
policy->cpuinfo.transition_latency = 200 * 1000; /* in ns */
|
||||
|
||||
/* policy sharing between dual CPUs */
|
||||
cpumask_copy(policy->cpus, &cpu_present_map);
|
||||
|
||||
policy->shared_type = CPUFREQ_SHARED_TYPE_ALL;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static struct freq_attr *u8500_cpufreq_attr[] = {
|
||||
&cpufreq_freq_attr_scaling_available_freqs,
|
||||
NULL,
|
||||
};
|
||||
static int u8500_cpu_exit(struct cpufreq_policy *policy)
|
||||
{
|
||||
cpufreq_frequency_table_put_attr(policy->cpu);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct cpufreq_driver u8500_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.flags = CPUFREQ_STICKY,
|
||||
.verify = u8500_cpufreq_verify_speed,
|
||||
.target = u8500_cpufreq_target,
|
||||
.get = u8500_cpufreq_getspeed,
|
||||
.init = u8500_cpu_init,
|
||||
.exit = u8500_cpu_exit,
|
||||
.name = CPUFREQ_NAME,
|
||||
.attr = u8500_cpufreq_attr,
|
||||
};
|
||||
|
||||
static int __init u8500_cpufreq_probe(struct platform_device *pdev)
|
||||
{
|
||||
dev = &pdev->dev;
|
||||
return cpufreq_register_driver(&u8500_driver);
|
||||
}
|
||||
|
||||
static int __exit u8500_cpufreq_remove(struct platform_device *pdev)
|
||||
{
|
||||
return cpufreq_unregister_driver(&u8500_driver);
|
||||
}
|
||||
|
||||
static struct platform_driver u8500_cpufreq_driver = {
|
||||
.driver = {
|
||||
.name = DRIVER_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
.remove = __exit_p(u8500_cpufreq_remove),
|
||||
};
|
||||
|
||||
static int __init u8500_cpufreq_init(void)
|
||||
{
|
||||
return platform_driver_probe(&u8500_cpufreq_driver,
|
||||
&u8500_cpufreq_probe);
|
||||
}
|
||||
|
||||
device_initcall(u8500_cpufreq_init);
|
|
@ -17,6 +17,8 @@
|
|||
#define U5500_GIC_DIST_BASE 0xA0411000
|
||||
#define U5500_GIC_CPU_BASE 0xA0410100
|
||||
#define U5500_DMA_BASE 0x90030000
|
||||
#define U5500_STM_BASE 0x90020000
|
||||
#define U5500_STM_REG_BASE (U5500_STM_BASE + 0xF000)
|
||||
#define U5500_MCDE_BASE 0xA0400000
|
||||
#define U5500_MODEM_BASE 0xB0000000
|
||||
#define U5500_L2CC_BASE 0xA0412000
|
||||
|
@ -29,7 +31,9 @@
|
|||
#define U5500_NAND0_BASE 0x60000000
|
||||
#define U5500_NAND1_BASE 0x70000000
|
||||
#define U5500_TWD_BASE 0xa0410600
|
||||
#define U5500_ICN_BASE 0xA0040000
|
||||
#define U5500_B2R2_BASE 0xa0200000
|
||||
#define U5500_BOOT_ROM_BASE 0x90000000
|
||||
|
||||
#define U5500_FSMC_BASE (U5500_PER1_BASE + 0x0000)
|
||||
#define U5500_SDI0_BASE (U5500_PER1_BASE + 0x1000)
|
||||
|
@ -60,6 +64,7 @@
|
|||
#define U5500_MSP1_BASE (U5500_PER4_BASE + 0x9000)
|
||||
#define U5500_GPIO2_BASE (U5500_PER4_BASE + 0xA000)
|
||||
#define U5500_CDETECT_BASE (U5500_PER4_BASE + 0xF000)
|
||||
#define U5500_PRCMU_TCDM_BASE (U5500_PER4_BASE + 0x18000)
|
||||
|
||||
#define U5500_SPI0_BASE (U5500_PER5_BASE + 0x0000)
|
||||
#define U5500_SPI1_BASE (U5500_PER5_BASE + 0x1000)
|
||||
|
@ -83,7 +88,7 @@
|
|||
#define U5500_HASH0_BASE (U5500_PER6_BASE + 0x1000)
|
||||
#define U5500_HASH1_BASE (U5500_PER6_BASE + 0x2000)
|
||||
#define U5500_PKA_BASE (U5500_PER6_BASE + 0x4000)
|
||||
#define U5500_PKAM_BASE (U5500_PER6_BASE + 0x5000)
|
||||
#define U5500_PKAM_BASE (U5500_PER6_BASE + 0x5100)
|
||||
#define U5500_MTU0_BASE (U5500_PER6_BASE + 0x6000)
|
||||
#define U5500_MTU1_BASE (U5500_PER6_BASE + 0x7000)
|
||||
#define U5500_CR_BASE (U5500_PER6_BASE + 0x8000)
|
||||
|
@ -114,8 +119,19 @@
|
|||
#define U5500_MBOX2_LOCAL_START (U5500_MBOX_BASE + 0x20)
|
||||
#define U5500_MBOX2_LOCAL_END (U5500_MBOX_BASE + 0x3F)
|
||||
|
||||
#define U5500_ESRAM_BASE 0x40000000
|
||||
#define U5500_ACCCON_BASE_SEC (0xBFFF0000)
|
||||
#define U5500_ACCCON_BASE (0xBFFF1000)
|
||||
#define U5500_ACCCON_CPUVEC_RESET_ADDR_OFFSET (0x00000020)
|
||||
#define U5500_ACCCON_ACC_CPU_CTRL_OFFSET (0x000000BC)
|
||||
|
||||
#define U5500_ESRAM_BASE 0x40000000
|
||||
#define U5500_ESRAM_DMA_LCPA_OFFSET 0x10000
|
||||
#define U5500_DMA_LCPA_BASE (U5500_ESRAM_BASE + U5500_ESRAM_DMA_LCPA_OFFSET)
|
||||
|
||||
#define U5500_MCDE_SIZE 0x1000
|
||||
#define U5500_DSI_LINK_SIZE 0x1000
|
||||
#define U5500_DSI_LINK_COUNT 0x2
|
||||
#define U5500_DSI_LINK1_BASE (U5500_MCDE_BASE + U5500_MCDE_SIZE)
|
||||
#define U5500_DSI_LINK2_BASE (U5500_DSI_LINK1_BASE + U5500_DSI_LINK_SIZE)
|
||||
|
||||
#endif
|
||||
|
|
|
@ -15,8 +15,13 @@
|
|||
#define U8500_ESRAM_BANK2 (U8500_ESRAM_BANK1 + U8500_ESRAM_BANK_SIZE)
|
||||
#define U8500_ESRAM_BANK3 (U8500_ESRAM_BANK2 + U8500_ESRAM_BANK_SIZE)
|
||||
#define U8500_ESRAM_BANK4 (U8500_ESRAM_BANK3 + U8500_ESRAM_BANK_SIZE)
|
||||
/* Use bank 4 for DMA LCPA */
|
||||
#define U8500_DMA_LCPA_BASE U8500_ESRAM_BANK4
|
||||
/*
|
||||
* on V1 DMA uses 4KB for logical parameters position is right after the 64KB
|
||||
* reserved for security
|
||||
*/
|
||||
#define U8500_ESRAM_DMA_LCPA_OFFSET 0x10000
|
||||
|
||||
#define U8500_DMA_LCPA_BASE (U8500_ESRAM_BANK0 + U8500_ESRAM_DMA_LCPA_OFFSET)
|
||||
#define U8500_DMA_LCPA_BASE_ED (U8500_ESRAM_BANK4 + 0x4000)
|
||||
|
||||
#define U8500_PER3_BASE 0x80000000
|
||||
|
@ -27,9 +32,12 @@
|
|||
#define U8500_B2R2_BASE 0x80130000
|
||||
#define U8500_HSEM_BASE 0x80140000
|
||||
#define U8500_PER4_BASE 0x80150000
|
||||
#define U8500_TPIU_BASE 0x80190000
|
||||
#define U8500_ICN_BASE 0x81000000
|
||||
|
||||
#define U8500_BOOT_ROM_BASE 0x90000000
|
||||
/* ASIC ID is at 0xbf4 offset within this region */
|
||||
#define U8500_ASIC_ID_BASE 0x9001D000
|
||||
|
||||
#define U8500_PER6_BASE 0xa03c0000
|
||||
#define U8500_PER5_BASE 0xa03e0000
|
||||
|
@ -70,13 +78,15 @@
|
|||
|
||||
/* per6 base addresses */
|
||||
#define U8500_RNG_BASE (U8500_PER6_BASE + 0x0000)
|
||||
#define U8500_PKA_BASE (U8500_PER6_BASE + 0x1000)
|
||||
#define U8500_PKAM_BASE (U8500_PER6_BASE + 0x2000)
|
||||
#define U8500_HASH0_BASE (U8500_PER6_BASE + 0x1000)
|
||||
#define U8500_HASH1_BASE (U8500_PER6_BASE + 0x2000)
|
||||
#define U8500_PKA_BASE (U8500_PER6_BASE + 0x4000)
|
||||
#define U8500_PKAM_BASE (U8500_PER6_BASE + 0x5100)
|
||||
#define U8500_MTU0_BASE (U8500_PER6_BASE + 0x6000) /* v1 */
|
||||
#define U8500_MTU1_BASE (U8500_PER6_BASE + 0x7000) /* v1 */
|
||||
#define U8500_CR_BASE (U8500_PER6_BASE + 0x8000) /* v1 */
|
||||
#define U8500_CRYPTO0_BASE (U8500_PER6_BASE + 0xa000)
|
||||
#define U8500_CRYPTO1_BASE (U8500_PER6_BASE + 0xb000)
|
||||
#define U8500_CRYP0_BASE (U8500_PER6_BASE + 0xa000)
|
||||
#define U8500_CRYP1_BASE (U8500_PER6_BASE + 0xb000)
|
||||
#define U8500_CLKRST6_BASE (U8500_PER6_BASE + 0xf000)
|
||||
|
||||
/* per5 base addresses */
|
||||
|
@ -93,7 +103,8 @@
|
|||
#define U8500_DMC_BASE (U8500_PER4_BASE + 0x06000)
|
||||
#define U8500_PRCMU_BASE (U8500_PER4_BASE + 0x07000)
|
||||
#define U8500_PRCMU_TCDM_BASE_V1 (U8500_PER4_BASE + 0x0f000)
|
||||
#define U8500_PRCMU_TCDM_BASE (U8500_PER4_BASE + 0x68000)
|
||||
#define U8500_PRCMU_TCDM_BASE (U8500_PER4_BASE + 0x68000)
|
||||
#define U8500_PRCMU_TCPM_BASE (U8500_PER4_BASE + 0x60000)
|
||||
|
||||
/* per3 base addresses */
|
||||
#define U8500_FSMC_BASE (U8500_PER3_BASE + 0x0000)
|
||||
|
@ -124,6 +135,7 @@
|
|||
#define U8500_I2C1_BASE (U8500_PER1_BASE + 0x2000)
|
||||
#define U8500_MSP0_BASE (U8500_PER1_BASE + 0x3000)
|
||||
#define U8500_MSP1_BASE (U8500_PER1_BASE + 0x4000)
|
||||
#define U8500_MSP3_BASE (U8500_PER1_BASE + 0x5000)
|
||||
#define U8500_SDI0_BASE (U8500_PER1_BASE + 0x6000)
|
||||
#define U8500_I2C2_BASE (U8500_PER1_BASE + 0x8000)
|
||||
#define U8500_SPI3_BASE (U8500_PER1_BASE + 0x9000)
|
||||
|
@ -143,4 +155,15 @@
|
|||
#define U8500_GPIOBANK7_BASE (U8500_GPIO2_BASE + 0x80)
|
||||
#define U8500_GPIOBANK8_BASE U8500_GPIO3_BASE
|
||||
|
||||
#define U8500_MCDE_SIZE 0x1000
|
||||
#define U8500_DSI_LINK_SIZE 0x1000
|
||||
#define U8500_DSI_LINK1_BASE (U8500_MCDE_BASE + U8500_MCDE_SIZE)
|
||||
#define U8500_DSI_LINK2_BASE (U8500_DSI_LINK1_BASE + U8500_DSI_LINK_SIZE)
|
||||
#define U8500_DSI_LINK3_BASE (U8500_DSI_LINK2_BASE + U8500_DSI_LINK_SIZE)
|
||||
#define U8500_DSI_LINK_COUNT 0x3
|
||||
|
||||
/* Modem and APE physical addresses */
|
||||
#define U8500_MODEM_BASE 0xe000000
|
||||
#define U8500_APE_BASE 0x6000000
|
||||
|
||||
#endif
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <mach/id.h>
|
||||
extern void __iomem *_PRCMU_BASE;
|
||||
|
||||
#define ARRAY_AND_SIZE(x) (x), ARRAY_SIZE(x)
|
||||
|
||||
|
|
|
@ -75,6 +75,26 @@ static inline bool __attribute_const__ cpu_is_u8500v2(void)
|
|||
return cpu_is_u8500() && ((dbx500_revision() & 0xf0) == 0xB0);
|
||||
}
|
||||
|
||||
static inline bool cpu_is_u8500v20(void)
|
||||
{
|
||||
return cpu_is_u8500() && (dbx500_revision() == 0xB0);
|
||||
}
|
||||
|
||||
static inline bool cpu_is_u8500v21(void)
|
||||
{
|
||||
return cpu_is_u8500() && (dbx500_revision() == 0xB1);
|
||||
}
|
||||
|
||||
static inline bool cpu_is_u8500v20_or_later(void)
|
||||
{
|
||||
return cpu_is_u8500() && !cpu_is_u8500v10() && !cpu_is_u8500v11();
|
||||
}
|
||||
|
||||
static inline bool ux500_is_svp(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
#define ux500_unknown_soc() BUG()
|
||||
|
||||
#endif
|
||||
|
|
|
@ -50,6 +50,11 @@
|
|||
|
||||
#define MOP500_IRQ_END MOP500_NR_IRQS
|
||||
|
||||
/*
|
||||
* We may have several boards, but only one will run at a
|
||||
* time, so the one with most IRQs will bump this ahead,
|
||||
* but the IRQ_BOARD_START remains the same for either board.
|
||||
*/
|
||||
#if MOP500_IRQ_END > IRQ_BOARD_END
|
||||
#undef IRQ_BOARD_END
|
||||
#define IRQ_BOARD_END MOP500_IRQ_END
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
* Copyright (C) ST-Ericsson SA 2010
|
||||
*
|
||||
* License terms: GNU General Public License (GPL) version 2
|
||||
*/
|
||||
|
||||
#ifndef __MACH_IRQS_BOARD_U5500_H
|
||||
#define __MACH_IRQS_BOARD_U5500_H
|
||||
|
||||
#define AB5500_NR_IRQS 5
|
||||
#define IRQ_AB5500_BASE IRQ_BOARD_START
|
||||
#define IRQ_AB5500_END (IRQ_AB5500_BASE + AB5500_NR_IRQS)
|
||||
|
||||
#define U5500_IRQ_END IRQ_AB5500_END
|
||||
|
||||
#if IRQ_BOARD_END < U5500_IRQ_END
|
||||
#undef IRQ_BOARD_END
|
||||
#define IRQ_BOARD_END U5500_IRQ_END
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -83,4 +83,31 @@
|
|||
#define IRQ_DB5500_GPIO6 (IRQ_SHPI_START + 125)
|
||||
#define IRQ_DB5500_GPIO7 (IRQ_SHPI_START + 126)
|
||||
|
||||
#ifdef CONFIG_UX500_SOC_DB5500
|
||||
|
||||
/*
|
||||
* After the GPIO ones we reserve a range of IRQ:s in which virtual
|
||||
* IRQ:s representing modem IRQ:s can be allocated
|
||||
*/
|
||||
#define IRQ_MODEM_EVENTS_BASE IRQ_SOC_START
|
||||
#define IRQ_MODEM_EVENTS_NBR 72
|
||||
#define IRQ_MODEM_EVENTS_END (IRQ_MODEM_EVENTS_BASE + IRQ_MODEM_EVENTS_NBR)
|
||||
|
||||
/* List of virtual IRQ:s that are allocated from the range above */
|
||||
#define MBOX_PAIR0_VIRT_IRQ (IRQ_MODEM_EVENTS_BASE + 43)
|
||||
#define MBOX_PAIR1_VIRT_IRQ (IRQ_MODEM_EVENTS_BASE + 45)
|
||||
#define MBOX_PAIR2_VIRT_IRQ (IRQ_MODEM_EVENTS_BASE + 41)
|
||||
|
||||
/*
|
||||
* We may have several SoCs, but only one will run at a
|
||||
* time, so the one with most IRQs will bump this ahead,
|
||||
* but the IRQ_SOC_START remains the same for either SoC.
|
||||
*/
|
||||
#if IRQ_SOC_END < IRQ_MODEM_EVENTS_END
|
||||
#undef IRQ_SOC_END
|
||||
#define IRQ_SOC_END IRQ_MODEM_EVENTS_END
|
||||
#endif
|
||||
|
||||
#endif /* CONFIG_UX500_SOC_DB5500 */
|
||||
|
||||
#endif
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue