Merge branches 'for-4.11/upstream-fixes', 'for-4.12/accutouch', 'for-4.12/cp2112', 'for-4.12/hid-core-null-state-handling', 'for-4.12/hiddev', 'for-4.12/i2c-hid', 'for-4.12/innomedia', 'for-4.12/logitech-hidpp-battery-power-supply', 'for-4.12/multitouch', 'for-4.12/nti', 'for-4.12/upstream' and 'for-4.12/wacom' into for-linus
This commit is contained in:
parent
d529a4ad91
c846fe9ce9
ac34b970a9
c3883fe064
733aca9030
d3d9adfe30
9547837bdc
a4bf6153b3
e9d0a26d34
07e88a35dc
959d973e98
149f6f6b8f
commit
18fc2163b8
|
@ -0,0 +1,25 @@
|
|||
What: /sys/class/devfreq-event/event(x)/
|
||||
Date: January 2017
|
||||
Contact: Chanwoo Choi <cw00.choi@samsung.com>
|
||||
Description:
|
||||
Provide a place in sysfs for the devfreq-event objects.
|
||||
This allows accessing various devfreq-event specific variables.
|
||||
The name of devfreq-event object denoted as 'event(x)' which
|
||||
includes the unique number of 'x' for each devfreq-event object.
|
||||
|
||||
What: /sys/class/devfreq-event/event(x)/name
|
||||
Date: January 2017
|
||||
Contact: Chanwoo Choi <cw00.choi@samsung.com>
|
||||
Description:
|
||||
The /sys/class/devfreq-event/event(x)/name attribute contains
|
||||
the name of the devfreq-event object. This attribute is
|
||||
read-only.
|
||||
|
||||
What: /sys/class/devfreq-event/event(x)/enable_count
|
||||
Date: January 2017
|
||||
Contact: Chanwoo Choi <cw00.choi@samsung.com>
|
||||
Description:
|
||||
The /sys/class/devfreq-event/event(x)/enable_count attribute
|
||||
contains the reference count to enable the devfreq-event
|
||||
object. If the device is enabled, the value of attribute is
|
||||
greater than zero.
|
|
@ -23,6 +23,23 @@ Description:
|
|||
If the LED does not support different brightness levels, this
|
||||
should be 1.
|
||||
|
||||
What: /sys/class/leds/<led>/brightness_hw_changed
|
||||
Date: January 2017
|
||||
KernelVersion: 4.11
|
||||
Description:
|
||||
Last hardware set brightness level for this LED. Some LEDs
|
||||
may be changed autonomously by hardware/firmware. Only LEDs
|
||||
where this happens and the driver can detect this, will have
|
||||
this file.
|
||||
|
||||
This file supports poll() to detect when the hardware changes
|
||||
the brightness.
|
||||
|
||||
Reading this file will return the last brightness level set
|
||||
by the hardware, this may be different from the current
|
||||
brightness. Reading this file when no hw brightness change
|
||||
event has happened will return an ENODATA error.
|
||||
|
||||
What: /sys/class/leds/<led>/trigger
|
||||
Date: March 2006
|
||||
KernelVersion: 2.6.17
|
||||
|
|
|
@ -62,18 +62,18 @@ Description:
|
|||
This value may be reset to 0 if the current protocol is altered.
|
||||
|
||||
What: /sys/class/rc/rcN/wakeup_protocols
|
||||
Date: Feb 2014
|
||||
KernelVersion: 3.15
|
||||
Date: Feb 2017
|
||||
KernelVersion: 4.11
|
||||
Contact: Mauro Carvalho Chehab <m.chehab@samsung.com>
|
||||
Description:
|
||||
Reading this file returns a list of available protocols to use
|
||||
for the wakeup filter, something like:
|
||||
"rc5 rc6 nec jvc [sony]"
|
||||
"rc-5 nec nec-x rc-6-0 rc-6-6a-24 [rc-6-6a-32] rc-6-mce"
|
||||
Note that protocol variants are listed, so "nec", "sony",
|
||||
"rc-5", "rc-6" have their different bit length encodings
|
||||
listed if available.
|
||||
The enabled wakeup protocol is shown in [] brackets.
|
||||
Writing "+proto" will add a protocol to the list of enabled
|
||||
wakeup protocols.
|
||||
Writing "-proto" will remove a protocol from the list of enabled
|
||||
wakeup protocols.
|
||||
Only one protocol can be selected at a time.
|
||||
Writing "proto" will use "proto" for wakeup events.
|
||||
Writing "none" will disable wakeup.
|
||||
Write fails with EINVAL if an invalid protocol combination or
|
||||
|
|
|
@ -2,7 +2,7 @@ What: /sys/devices/platform/hidma-*/chid
|
|||
/sys/devices/platform/QCOM8061:*/chid
|
||||
Date: Dec 2015
|
||||
KernelVersion: 4.4
|
||||
Contact: "Sinan Kaya <okaya@cudeaurora.org>"
|
||||
Contact: "Sinan Kaya <okaya@codeaurora.org>"
|
||||
Description:
|
||||
Contains the ID of the channel within the HIDMA instance.
|
||||
It is used to associate a given HIDMA channel with the
|
||||
|
|
|
@ -2,7 +2,7 @@ What: /sys/devices/platform/hidma-mgmt*/chanops/chan*/priority
|
|||
/sys/devices/platform/QCOM8060:*/chanops/chan*/priority
|
||||
Date: Nov 2015
|
||||
KernelVersion: 4.4
|
||||
Contact: "Sinan Kaya <okaya@cudeaurora.org>"
|
||||
Contact: "Sinan Kaya <okaya@codeaurora.org>"
|
||||
Description:
|
||||
Contains either 0 or 1 and indicates if the DMA channel is a
|
||||
low priority (0) or high priority (1) channel.
|
||||
|
@ -11,7 +11,7 @@ What: /sys/devices/platform/hidma-mgmt*/chanops/chan*/weight
|
|||
/sys/devices/platform/QCOM8060:*/chanops/chan*/weight
|
||||
Date: Nov 2015
|
||||
KernelVersion: 4.4
|
||||
Contact: "Sinan Kaya <okaya@cudeaurora.org>"
|
||||
Contact: "Sinan Kaya <okaya@codeaurora.org>"
|
||||
Description:
|
||||
Contains 0..15 and indicates the weight of the channel among
|
||||
equal priority channels during round robin scheduling.
|
||||
|
@ -20,7 +20,7 @@ What: /sys/devices/platform/hidma-mgmt*/chreset_timeout_cycles
|
|||
/sys/devices/platform/QCOM8060:*/chreset_timeout_cycles
|
||||
Date: Nov 2015
|
||||
KernelVersion: 4.4
|
||||
Contact: "Sinan Kaya <okaya@cudeaurora.org>"
|
||||
Contact: "Sinan Kaya <okaya@codeaurora.org>"
|
||||
Description:
|
||||
Contains the platform specific cycle value to wait after a
|
||||
reset command is issued. If the value is chosen too short,
|
||||
|
@ -32,7 +32,7 @@ What: /sys/devices/platform/hidma-mgmt*/dma_channels
|
|||
/sys/devices/platform/QCOM8060:*/dma_channels
|
||||
Date: Nov 2015
|
||||
KernelVersion: 4.4
|
||||
Contact: "Sinan Kaya <okaya@cudeaurora.org>"
|
||||
Contact: "Sinan Kaya <okaya@codeaurora.org>"
|
||||
Description:
|
||||
Contains the number of dma channels supported by one instance
|
||||
of HIDMA hardware. The value may change from chip to chip.
|
||||
|
@ -41,7 +41,7 @@ What: /sys/devices/platform/hidma-mgmt*/hw_version_major
|
|||
/sys/devices/platform/QCOM8060:*/hw_version_major
|
||||
Date: Nov 2015
|
||||
KernelVersion: 4.4
|
||||
Contact: "Sinan Kaya <okaya@cudeaurora.org>"
|
||||
Contact: "Sinan Kaya <okaya@codeaurora.org>"
|
||||
Description:
|
||||
Version number major for the hardware.
|
||||
|
||||
|
@ -49,7 +49,7 @@ What: /sys/devices/platform/hidma-mgmt*/hw_version_minor
|
|||
/sys/devices/platform/QCOM8060:*/hw_version_minor
|
||||
Date: Nov 2015
|
||||
KernelVersion: 4.4
|
||||
Contact: "Sinan Kaya <okaya@cudeaurora.org>"
|
||||
Contact: "Sinan Kaya <okaya@codeaurora.org>"
|
||||
Description:
|
||||
Version number minor for the hardware.
|
||||
|
||||
|
@ -57,7 +57,7 @@ What: /sys/devices/platform/hidma-mgmt*/max_rd_xactions
|
|||
/sys/devices/platform/QCOM8060:*/max_rd_xactions
|
||||
Date: Nov 2015
|
||||
KernelVersion: 4.4
|
||||
Contact: "Sinan Kaya <okaya@cudeaurora.org>"
|
||||
Contact: "Sinan Kaya <okaya@codeaurora.org>"
|
||||
Description:
|
||||
Contains a value between 0 and 31. Maximum number of
|
||||
read transactions that can be issued back to back.
|
||||
|
@ -69,7 +69,7 @@ What: /sys/devices/platform/hidma-mgmt*/max_read_request
|
|||
/sys/devices/platform/QCOM8060:*/max_read_request
|
||||
Date: Nov 2015
|
||||
KernelVersion: 4.4
|
||||
Contact: "Sinan Kaya <okaya@cudeaurora.org>"
|
||||
Contact: "Sinan Kaya <okaya@codeaurora.org>"
|
||||
Description:
|
||||
Size of each read request. The value needs to be a power
|
||||
of two and can be between 128 and 1024.
|
||||
|
@ -78,7 +78,7 @@ What: /sys/devices/platform/hidma-mgmt*/max_wr_xactions
|
|||
/sys/devices/platform/QCOM8060:*/max_wr_xactions
|
||||
Date: Nov 2015
|
||||
KernelVersion: 4.4
|
||||
Contact: "Sinan Kaya <okaya@cudeaurora.org>"
|
||||
Contact: "Sinan Kaya <okaya@codeaurora.org>"
|
||||
Description:
|
||||
Contains a value between 0 and 31. Maximum number of
|
||||
write transactions that can be issued back to back.
|
||||
|
@ -91,7 +91,7 @@ What: /sys/devices/platform/hidma-mgmt*/max_write_request
|
|||
/sys/devices/platform/QCOM8060:*/max_write_request
|
||||
Date: Nov 2015
|
||||
KernelVersion: 4.4
|
||||
Contact: "Sinan Kaya <okaya@cudeaurora.org>"
|
||||
Contact: "Sinan Kaya <okaya@codeaurora.org>"
|
||||
Description:
|
||||
Size of each write request. The value needs to be a power
|
||||
of two and can be between 128 and 1024.
|
||||
|
|
|
@ -59,28 +59,20 @@ button driver uses the following 3 modes in order not to trigger issues.
|
|||
If the userspace hasn't been prepared to ignore the unreliable "opened"
|
||||
events and the unreliable initial state notification, Linux users can use
|
||||
the following kernel parameters to handle the possible issues:
|
||||
A. button.lid_init_state=method:
|
||||
When this option is specified, the ACPI button driver reports the
|
||||
initial lid state using the returning value of the _LID control method
|
||||
and whether the "opened"/"closed" events are paired fully relies on the
|
||||
firmware implementation.
|
||||
This option can be used to fix some platforms where the returning value
|
||||
of the _LID control method is reliable but the initial lid state
|
||||
notification is missing.
|
||||
This option is the default behavior during the period the userspace
|
||||
isn't ready to handle the buggy AML tables.
|
||||
B. button.lid_init_state=open:
|
||||
A. button.lid_init_state=open:
|
||||
When this option is specified, the ACPI button driver always reports the
|
||||
initial lid state as "opened" and whether the "opened"/"closed" events
|
||||
are paired fully relies on the firmware implementation.
|
||||
This may fix some platforms where the returning value of the _LID
|
||||
control method is not reliable and the initial lid state notification is
|
||||
missing.
|
||||
This option is the default behavior during the period the userspace
|
||||
isn't ready to handle the buggy AML tables.
|
||||
|
||||
If the userspace has been prepared to ignore the unreliable "opened" events
|
||||
and the unreliable initial state notification, Linux users should always
|
||||
use the following kernel parameter:
|
||||
C. button.lid_init_state=ignore:
|
||||
B. button.lid_init_state=ignore:
|
||||
When this option is specified, the ACPI button driver never reports the
|
||||
initial lid state and there is a compensation mechanism implemented to
|
||||
ensure that the reliable "closed" notifications can always be delievered
|
||||
|
|
|
@ -4085,6 +4085,9 @@
|
|||
usbhid.mousepoll=
|
||||
[USBHID] The interval which mice are to be polled at.
|
||||
|
||||
usbhid.jspoll=
|
||||
[USBHID] The interval which joysticks are to be polled at.
|
||||
|
||||
usb-storage.delay_use=
|
||||
[UMS] The delay in seconds before a new device is
|
||||
scanned for Logical Units (default 1).
|
||||
|
|
|
@ -249,7 +249,6 @@ struct& cdrom_device_ops\ \{ \hidewidth\cr
|
|||
unsigned\ long);\cr
|
||||
\noalign{\medskip}
|
||||
&const\ int& capability;& capability flags \cr
|
||||
&int& n_minors;& number of active minor devices \cr
|
||||
\};\cr
|
||||
}
|
||||
$$
|
||||
|
@ -258,13 +257,7 @@ it should add a function pointer to this $struct$. When a particular
|
|||
function is not implemented, however, this $struct$ should contain a
|
||||
NULL instead. The $capability$ flags specify the capabilities of the
|
||||
\cdrom\ hardware and/or low-level \cdrom\ driver when a \cdrom\ drive
|
||||
is registered with the \UCD. The value $n_minors$ should be a positive
|
||||
value indicating the number of minor devices that are supported by
|
||||
the low-level device driver, normally~1. Although these two variables
|
||||
are `informative' rather than `operational,' they are included in
|
||||
$cdrom_device_ops$ because they describe the capability of the {\em
|
||||
driver\/} rather than the {\em drive}. Nomenclature has always been
|
||||
difficult in computer programming.
|
||||
is registered with the \UCD.
|
||||
|
||||
Note that most functions have fewer parameters than their
|
||||
$blkdev_fops$ counterparts. This is because very little of the
|
||||
|
|
|
@ -8,6 +8,8 @@
|
|||
|
||||
Dominik Brodowski <linux@brodo.de>
|
||||
David Kimdon <dwhedon@debian.org>
|
||||
Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
||||
Viresh Kumar <viresh.kumar@linaro.org>
|
||||
|
||||
|
||||
|
||||
|
@ -36,10 +38,11 @@ speed limits (like LCD drivers on ARM architecture). Additionally, the
|
|||
kernel "constant" loops_per_jiffy is updated on frequency changes
|
||||
here.
|
||||
|
||||
Reference counting is done by cpufreq_get_cpu and cpufreq_put_cpu,
|
||||
which make sure that the cpufreq processor driver is correctly
|
||||
registered with the core, and will not be unloaded until
|
||||
cpufreq_put_cpu is called.
|
||||
Reference counting of the cpufreq policies is done by cpufreq_cpu_get
|
||||
and cpufreq_cpu_put, which make sure that the cpufreq driver is
|
||||
correctly registered with the core, and will not be unloaded until
|
||||
cpufreq_put_cpu is called. That also ensures that the respective cpufreq
|
||||
policy doesn't get freed while being used.
|
||||
|
||||
2. CPUFreq notifiers
|
||||
====================
|
||||
|
@ -69,18 +72,16 @@ CPUFreq policy notifier is called twice for a policy transition:
|
|||
The phase is specified in the second argument to the notifier.
|
||||
|
||||
The third argument, a void *pointer, points to a struct cpufreq_policy
|
||||
consisting of five values: cpu, min, max, policy and max_cpu_freq. min
|
||||
and max are the lower and upper frequencies (in kHz) of the new
|
||||
policy, policy the new policy, cpu the number of the affected CPU; and
|
||||
max_cpu_freq the maximum supported CPU frequency. This value is given
|
||||
for informational purposes only.
|
||||
consisting of several values, including min, max (the lower and upper
|
||||
frequencies (in kHz) of the new policy).
|
||||
|
||||
|
||||
2.2 CPUFreq transition notifiers
|
||||
--------------------------------
|
||||
|
||||
These are notified twice when the CPUfreq driver switches the CPU core
|
||||
frequency and this change has any external implications.
|
||||
These are notified twice for each online CPU in the policy, when the
|
||||
CPUfreq driver switches the CPU core frequency and this change has no
|
||||
any external implications.
|
||||
|
||||
The second argument specifies the phase - CPUFREQ_PRECHANGE or
|
||||
CPUFREQ_POSTCHANGE.
|
||||
|
@ -90,6 +91,7 @@ values:
|
|||
cpu - number of the affected CPU
|
||||
old - old frequency
|
||||
new - new frequency
|
||||
flags - flags of the cpufreq driver
|
||||
|
||||
3. CPUFreq Table Generation with Operating Performance Point (OPP)
|
||||
==================================================================
|
||||
|
|
|
@ -9,6 +9,8 @@
|
|||
|
||||
|
||||
Dominik Brodowski <linux@brodo.de>
|
||||
Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
||||
Viresh Kumar <viresh.kumar@linaro.org>
|
||||
|
||||
|
||||
|
||||
|
@ -49,49 +51,65 @@ using cpufreq_register_driver()
|
|||
|
||||
What shall this struct cpufreq_driver contain?
|
||||
|
||||
cpufreq_driver.name - The name of this driver.
|
||||
.name - The name of this driver.
|
||||
|
||||
cpufreq_driver.init - A pointer to the per-CPU initialization
|
||||
function.
|
||||
.init - A pointer to the per-policy initialization function.
|
||||
|
||||
cpufreq_driver.verify - A pointer to a "verification" function.
|
||||
.verify - A pointer to a "verification" function.
|
||||
|
||||
cpufreq_driver.setpolicy _or_
|
||||
cpufreq_driver.target/
|
||||
target_index - See below on the differences.
|
||||
.setpolicy _or_ .fast_switch _or_ .target _or_ .target_index - See
|
||||
below on the differences.
|
||||
|
||||
And optionally
|
||||
|
||||
cpufreq_driver.exit - A pointer to a per-CPU cleanup
|
||||
function called during CPU_POST_DEAD
|
||||
phase of cpu hotplug process.
|
||||
.flags - Hints for the cpufreq core.
|
||||
|
||||
cpufreq_driver.stop_cpu - A pointer to a per-CPU stop function
|
||||
called during CPU_DOWN_PREPARE phase of
|
||||
cpu hotplug process.
|
||||
.driver_data - cpufreq driver specific data.
|
||||
|
||||
cpufreq_driver.resume - A pointer to a per-CPU resume function
|
||||
which is called with interrupts disabled
|
||||
and _before_ the pre-suspend frequency
|
||||
and/or policy is restored by a call to
|
||||
->target/target_index or ->setpolicy.
|
||||
.resolve_freq - Returns the most appropriate frequency for a target
|
||||
frequency. Doesn't change the frequency though.
|
||||
|
||||
cpufreq_driver.attr - A pointer to a NULL-terminated list of
|
||||
"struct freq_attr" which allow to
|
||||
export values to sysfs.
|
||||
.get_intermediate and target_intermediate - Used to switch to stable
|
||||
frequency while changing CPU frequency.
|
||||
|
||||
cpufreq_driver.get_intermediate
|
||||
and target_intermediate Used to switch to stable frequency while
|
||||
changing CPU frequency.
|
||||
.get - Returns current frequency of the CPU.
|
||||
|
||||
.bios_limit - Returns HW/BIOS max frequency limitations for the CPU.
|
||||
|
||||
.exit - A pointer to a per-policy cleanup function called during
|
||||
CPU_POST_DEAD phase of cpu hotplug process.
|
||||
|
||||
.stop_cpu - A pointer to a per-policy stop function called during
|
||||
CPU_DOWN_PREPARE phase of cpu hotplug process.
|
||||
|
||||
.suspend - A pointer to a per-policy suspend function which is called
|
||||
with interrupts disabled and _after_ the governor is stopped for the
|
||||
policy.
|
||||
|
||||
.resume - A pointer to a per-policy resume function which is called
|
||||
with interrupts disabled and _before_ the governor is started again.
|
||||
|
||||
.ready - A pointer to a per-policy ready function which is called after
|
||||
the policy is fully initialized.
|
||||
|
||||
.attr - A pointer to a NULL-terminated list of "struct freq_attr" which
|
||||
allow to export values to sysfs.
|
||||
|
||||
.boost_enabled - If set, boost frequencies are enabled.
|
||||
|
||||
.set_boost - A pointer to a per-policy function to enable/disable boost
|
||||
frequencies.
|
||||
|
||||
|
||||
1.2 Per-CPU Initialization
|
||||
--------------------------
|
||||
|
||||
Whenever a new CPU is registered with the device model, or after the
|
||||
cpufreq driver registers itself, the per-CPU initialization function
|
||||
cpufreq_driver.init is called. It takes a struct cpufreq_policy
|
||||
*policy as argument. What to do now?
|
||||
cpufreq driver registers itself, the per-policy initialization function
|
||||
cpufreq_driver.init is called if no cpufreq policy existed for the CPU.
|
||||
Note that the .init() and .exit() routines are called only once for the
|
||||
policy and not for each CPU managed by the policy. It takes a struct
|
||||
cpufreq_policy *policy as argument. What to do now?
|
||||
|
||||
If necessary, activate the CPUfreq support on your CPU.
|
||||
|
||||
|
@ -117,47 +135,45 @@ policy->governor must contain the "default policy" for
|
|||
cpufreq_driver.setpolicy or
|
||||
cpufreq_driver.target/target_index is called
|
||||
with these values.
|
||||
policy->cpus Update this with the masks of the
|
||||
(online + offline) CPUs that do DVFS
|
||||
along with this CPU (i.e. that share
|
||||
clock/voltage rails with it).
|
||||
|
||||
For setting some of these values (cpuinfo.min[max]_freq, policy->min[max]), the
|
||||
frequency table helpers might be helpful. See the section 2 for more information
|
||||
on them.
|
||||
|
||||
SMP systems normally have same clock source for a group of cpus. For these the
|
||||
.init() would be called only once for the first online cpu. Here the .init()
|
||||
routine must initialize policy->cpus with mask of all possible cpus (Online +
|
||||
Offline) that share the clock. Then the core would copy this mask onto
|
||||
policy->related_cpus and will reset policy->cpus to carry only online cpus.
|
||||
|
||||
|
||||
1.3 verify
|
||||
------------
|
||||
----------
|
||||
|
||||
When the user decides a new policy (consisting of
|
||||
"policy,governor,min,max") shall be set, this policy must be validated
|
||||
so that incompatible values can be corrected. For verifying these
|
||||
values, a frequency table helper and/or the
|
||||
cpufreq_verify_within_limits(struct cpufreq_policy *policy, unsigned
|
||||
int min_freq, unsigned int max_freq) function might be helpful. See
|
||||
section 2 for details on frequency table helpers.
|
||||
values cpufreq_verify_within_limits(struct cpufreq_policy *policy,
|
||||
unsigned int min_freq, unsigned int max_freq) function might be helpful.
|
||||
See section 2 for details on frequency table helpers.
|
||||
|
||||
You need to make sure that at least one valid frequency (or operating
|
||||
range) is within policy->min and policy->max. If necessary, increase
|
||||
policy->max first, and only if this is no solution, decrease policy->min.
|
||||
|
||||
|
||||
1.4 target/target_index or setpolicy?
|
||||
----------------------------
|
||||
1.4 target or target_index or setpolicy or fast_switch?
|
||||
-------------------------------------------------------
|
||||
|
||||
Most cpufreq drivers or even most cpu frequency scaling algorithms
|
||||
only allow the CPU to be set to one frequency. For these, you use the
|
||||
->target/target_index call.
|
||||
only allow the CPU frequency to be set to predefined fixed values. For
|
||||
these, you use the ->target(), ->target_index() or ->fast_switch()
|
||||
callbacks.
|
||||
|
||||
Some cpufreq-capable processors switch the frequency between certain
|
||||
limits on their own. These shall use the ->setpolicy call
|
||||
Some cpufreq capable processors switch the frequency between certain
|
||||
limits on their own. These shall use the ->setpolicy() callback.
|
||||
|
||||
|
||||
1.5. target/target_index
|
||||
-------------
|
||||
------------------------
|
||||
|
||||
The target_index call has two arguments: struct cpufreq_policy *policy,
|
||||
and unsigned int index (into the exposed frequency table).
|
||||
|
@ -186,9 +202,20 @@ actual frequency must be determined using the following rules:
|
|||
Here again the frequency table helper might assist you - see section 2
|
||||
for details.
|
||||
|
||||
1.6. fast_switch
|
||||
----------------
|
||||
|
||||
1.6 setpolicy
|
||||
---------------
|
||||
This function is used for frequency switching from scheduler's context.
|
||||
Not all drivers are expected to implement it, as sleeping from within
|
||||
this callback isn't allowed. This callback must be highly optimized to
|
||||
do switching as fast as possible.
|
||||
|
||||
This function has two arguments: struct cpufreq_policy *policy and
|
||||
unsigned int target_frequency.
|
||||
|
||||
|
||||
1.7 setpolicy
|
||||
-------------
|
||||
|
||||
The setpolicy call only takes a struct cpufreq_policy *policy as
|
||||
argument. You need to set the lower limit of the in-processor or
|
||||
|
@ -198,7 +225,7 @@ setting when policy->policy is CPUFREQ_POLICY_PERFORMANCE, and a
|
|||
powersaving-oriented setting when CPUFREQ_POLICY_POWERSAVE. Also check
|
||||
the reference implementation in drivers/cpufreq/longrun.c
|
||||
|
||||
1.7 get_intermediate and target_intermediate
|
||||
1.8 get_intermediate and target_intermediate
|
||||
--------------------------------------------
|
||||
|
||||
Only for drivers with target_index() and CPUFREQ_ASYNC_NOTIFICATION unset.
|
||||
|
@ -222,42 +249,36 @@ failures as core would send notifications for that.
|
|||
|
||||
As most cpufreq processors only allow for being set to a few specific
|
||||
frequencies, a "frequency table" with some functions might assist in
|
||||
some work of the processor driver. Such a "frequency table" consists
|
||||
of an array of struct cpufreq_frequency_table entries, with any value in
|
||||
"driver_data" you want to use, and the corresponding frequency in
|
||||
"frequency". At the end of the table, you need to add a
|
||||
cpufreq_frequency_table entry with frequency set to CPUFREQ_TABLE_END. And
|
||||
if you want to skip one entry in the table, set the frequency to
|
||||
CPUFREQ_ENTRY_INVALID. The entries don't need to be in ascending
|
||||
order.
|
||||
some work of the processor driver. Such a "frequency table" consists of
|
||||
an array of struct cpufreq_frequency_table entries, with driver specific
|
||||
values in "driver_data", the corresponding frequency in "frequency" and
|
||||
flags set. At the end of the table, you need to add a
|
||||
cpufreq_frequency_table entry with frequency set to CPUFREQ_TABLE_END.
|
||||
And if you want to skip one entry in the table, set the frequency to
|
||||
CPUFREQ_ENTRY_INVALID. The entries don't need to be in sorted in any
|
||||
particular order, but if they are cpufreq core will do DVFS a bit
|
||||
quickly for them as search for best match is faster.
|
||||
|
||||
By calling cpufreq_table_validate_and_show(struct cpufreq_policy *policy,
|
||||
struct cpufreq_frequency_table *table);
|
||||
the cpuinfo.min_freq and cpuinfo.max_freq values are detected, and
|
||||
policy->min and policy->max are set to the same values. This is
|
||||
helpful for the per-CPU initialization stage.
|
||||
By calling cpufreq_table_validate_and_show(), the cpuinfo.min_freq and
|
||||
cpuinfo.max_freq values are detected, and policy->min and policy->max
|
||||
are set to the same values. This is helpful for the per-CPU
|
||||
initialization stage.
|
||||
|
||||
int cpufreq_frequency_table_verify(struct cpufreq_policy *policy,
|
||||
struct cpufreq_frequency_table *table);
|
||||
assures that at least one valid frequency is within policy->min and
|
||||
policy->max, and all other criteria are met. This is helpful for the
|
||||
->verify call.
|
||||
cpufreq_frequency_table_verify() assures that at least one valid
|
||||
frequency is within policy->min and policy->max, and all other criteria
|
||||
are met. This is helpful for the ->verify call.
|
||||
|
||||
int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
|
||||
unsigned int target_freq,
|
||||
unsigned int relation);
|
||||
|
||||
is the corresponding frequency table helper for the ->target
|
||||
stage. Just pass the values to this function, and this function
|
||||
returns the number of the frequency table entry which contains
|
||||
the frequency the CPU shall be set to.
|
||||
cpufreq_frequency_table_target() is the corresponding frequency table
|
||||
helper for the ->target stage. Just pass the values to this function,
|
||||
and this function returns the of the frequency table entry which
|
||||
contains the frequency the CPU shall be set to.
|
||||
|
||||
The following macros can be used as iterators over cpufreq_frequency_table:
|
||||
|
||||
cpufreq_for_each_entry(pos, table) - iterates over all entries of frequency
|
||||
table.
|
||||
|
||||
cpufreq-for_each_valid_entry(pos, table) - iterates over all entries,
|
||||
cpufreq_for_each_valid_entry(pos, table) - iterates over all entries,
|
||||
excluding CPUFREQ_ENTRY_INVALID frequencies.
|
||||
Use arguments "pos" - a cpufreq_frequency_table * as a loop cursor and
|
||||
"table" - the cpufreq_frequency_table * you want to iterate over.
|
||||
|
|
|
@ -34,10 +34,10 @@ cpufreq stats provides following statistics (explained in detail below).
|
|||
- total_trans
|
||||
- trans_table
|
||||
|
||||
All the statistics will be from the time the stats driver has been inserted
|
||||
to the time when a read of a particular statistic is done. Obviously, stats
|
||||
driver will not have any information about the frequency transitions before
|
||||
the stats driver insertion.
|
||||
All the statistics will be from the time the stats driver has been inserted
|
||||
(or the time the stats were reset) to the time when a read of a particular
|
||||
statistic is done. Obviously, stats driver will not have any information
|
||||
about the frequency transitions before the stats driver insertion.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
<mysystem>:/sys/devices/system/cpu/cpu0/cpufreq/stats # ls -l
|
||||
|
@ -110,25 +110,13 @@ Config Main Menu
|
|||
CPU Frequency scaling --->
|
||||
[*] CPU Frequency scaling
|
||||
[*] CPU frequency translation statistics
|
||||
[*] CPU frequency translation statistics details
|
||||
|
||||
|
||||
"CPU Frequency scaling" (CONFIG_CPU_FREQ) should be enabled to configure
|
||||
cpufreq-stats.
|
||||
|
||||
"CPU frequency translation statistics" (CONFIG_CPU_FREQ_STAT) provides the
|
||||
basic statistics which includes time_in_state and total_trans.
|
||||
statistics which includes time_in_state, total_trans and trans_table.
|
||||
|
||||
"CPU frequency translation statistics details" (CONFIG_CPU_FREQ_STAT_DETAILS)
|
||||
provides fine grained cpufreq stats by trans_table. The reason for having a
|
||||
separate config option for trans_table is:
|
||||
- trans_table goes against the traditional /sysfs rule of one value per
|
||||
interface. It provides a whole bunch of value in a 2 dimensional matrix
|
||||
form.
|
||||
|
||||
Once these two options are enabled and your CPU supports cpufrequency, you
|
||||
Once this option is enabled and your CPU supports cpufrequency, you
|
||||
will be able to see the CPU frequency statistics in /sysfs.
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -10,6 +10,8 @@
|
|||
|
||||
Dominik Brodowski <linux@brodo.de>
|
||||
some additions and corrections by Nico Golde <nico@ngolde.de>
|
||||
Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
||||
Viresh Kumar <viresh.kumar@linaro.org>
|
||||
|
||||
|
||||
|
||||
|
@ -28,32 +30,27 @@ Contents:
|
|||
2.3 Userspace
|
||||
2.4 Ondemand
|
||||
2.5 Conservative
|
||||
2.6 Schedutil
|
||||
|
||||
3. The Governor Interface in the CPUfreq Core
|
||||
|
||||
4. References
|
||||
|
||||
|
||||
1. What Is A CPUFreq Governor?
|
||||
==============================
|
||||
|
||||
Most cpufreq drivers (except the intel_pstate and longrun) or even most
|
||||
cpu frequency scaling algorithms only offer the CPU to be set to one
|
||||
frequency. In order to offer dynamic frequency scaling, the cpufreq
|
||||
core must be able to tell these drivers of a "target frequency". So
|
||||
these specific drivers will be transformed to offer a "->target/target_index"
|
||||
call instead of the existing "->setpolicy" call. For "longrun", all
|
||||
stays the same, though.
|
||||
cpu frequency scaling algorithms only allow the CPU frequency to be set
|
||||
to predefined fixed values. In order to offer dynamic frequency
|
||||
scaling, the cpufreq core must be able to tell these drivers of a
|
||||
"target frequency". So these specific drivers will be transformed to
|
||||
offer a "->target/target_index/fast_switch()" call instead of the
|
||||
"->setpolicy()" call. For set_policy drivers, all stays the same,
|
||||
though.
|
||||
|
||||
How to decide what frequency within the CPUfreq policy should be used?
|
||||
That's done using "cpufreq governors". Two are already in this patch
|
||||
-- they're the already existing "powersave" and "performance" which
|
||||
set the frequency statically to the lowest or highest frequency,
|
||||
respectively. At least two more such governors will be ready for
|
||||
addition in the near future, but likely many more as there are various
|
||||
different theories and models about dynamic frequency scaling
|
||||
around. Using such a generic interface as cpufreq offers to scaling
|
||||
governors, these can be tested extensively, and the best one can be
|
||||
selected for each specific use.
|
||||
That's done using "cpufreq governors".
|
||||
|
||||
Basically, it's the following flow graph:
|
||||
|
||||
|
@ -71,7 +68,7 @@ CPU can be set to switch independently | CPU can only be set
|
|||
/ the limits of policy->{min,max}
|
||||
/ \
|
||||
/ \
|
||||
Using the ->setpolicy call, Using the ->target/target_index call,
|
||||
Using the ->setpolicy call, Using the ->target/target_index/fast_switch call,
|
||||
the limits and the the frequency closest
|
||||
"policy" is set. to target_freq is set.
|
||||
It is assured that it
|
||||
|
@ -109,114 +106,159 @@ directory.
|
|||
2.4 Ondemand
|
||||
------------
|
||||
|
||||
The CPUfreq governor "ondemand" sets the CPU depending on the
|
||||
current usage. To do this the CPU must have the capability to
|
||||
switch the frequency very quickly. There are a number of sysfs file
|
||||
accessible parameters:
|
||||
The CPUfreq governor "ondemand" sets the CPU frequency depending on the
|
||||
current system load. Load estimation is triggered by the scheduler
|
||||
through the update_util_data->func hook; when triggered, cpufreq checks
|
||||
the CPU-usage statistics over the last period and the governor sets the
|
||||
CPU accordingly. The CPU must have the capability to switch the
|
||||
frequency very quickly.
|
||||
|
||||
sampling_rate: measured in uS (10^-6 seconds), this is how often you
|
||||
want the kernel to look at the CPU usage and to make decisions on
|
||||
what to do about the frequency. Typically this is set to values of
|
||||
around '10000' or more. It's default value is (cmp. with users-guide.txt):
|
||||
transition_latency * 1000
|
||||
Be aware that transition latency is in ns and sampling_rate is in us, so you
|
||||
get the same sysfs value by default.
|
||||
Sampling rate should always get adjusted considering the transition latency
|
||||
To set the sampling rate 750 times as high as the transition latency
|
||||
in the bash (as said, 1000 is default), do:
|
||||
echo `$(($(cat cpuinfo_transition_latency) * 750 / 1000)) \
|
||||
>ondemand/sampling_rate
|
||||
Sysfs files:
|
||||
|
||||
sampling_rate_min:
|
||||
The sampling rate is limited by the HW transition latency:
|
||||
transition_latency * 100
|
||||
Or by kernel restrictions:
|
||||
If CONFIG_NO_HZ_COMMON is set, the limit is 10ms fixed.
|
||||
If CONFIG_NO_HZ_COMMON is not set or nohz=off boot parameter is used, the
|
||||
limits depend on the CONFIG_HZ option:
|
||||
HZ=1000: min=20000us (20ms)
|
||||
HZ=250: min=80000us (80ms)
|
||||
HZ=100: min=200000us (200ms)
|
||||
The highest value of kernel and HW latency restrictions is shown and
|
||||
used as the minimum sampling rate.
|
||||
* sampling_rate:
|
||||
|
||||
up_threshold: defines what the average CPU usage between the samplings
|
||||
of 'sampling_rate' needs to be for the kernel to make a decision on
|
||||
whether it should increase the frequency. For example when it is set
|
||||
to its default value of '95' it means that between the checking
|
||||
intervals the CPU needs to be on average more than 95% in use to then
|
||||
decide that the CPU frequency needs to be increased.
|
||||
Measured in uS (10^-6 seconds), this is how often you want the kernel
|
||||
to look at the CPU usage and to make decisions on what to do about the
|
||||
frequency. Typically this is set to values of around '10000' or more.
|
||||
It's default value is (cmp. with users-guide.txt): transition_latency
|
||||
* 1000. Be aware that transition latency is in ns and sampling_rate
|
||||
is in us, so you get the same sysfs value by default. Sampling rate
|
||||
should always get adjusted considering the transition latency to set
|
||||
the sampling rate 750 times as high as the transition latency in the
|
||||
bash (as said, 1000 is default), do:
|
||||
|
||||
ignore_nice_load: this parameter takes a value of '0' or '1'. When
|
||||
set to '0' (its default), all processes are counted towards the
|
||||
'cpu utilisation' value. When set to '1', the processes that are
|
||||
run with a 'nice' value will not count (and thus be ignored) in the
|
||||
overall usage calculation. This is useful if you are running a CPU
|
||||
intensive calculation on your laptop that you do not care how long it
|
||||
takes to complete as you can 'nice' it and prevent it from taking part
|
||||
in the deciding process of whether to increase your CPU frequency.
|
||||
$ echo `$(($(cat cpuinfo_transition_latency) * 750 / 1000)) > ondemand/sampling_rate
|
||||
|
||||
sampling_down_factor: this parameter controls the rate at which the
|
||||
kernel makes a decision on when to decrease the frequency while running
|
||||
at top speed. When set to 1 (the default) decisions to reevaluate load
|
||||
are made at the same interval regardless of current clock speed. But
|
||||
when set to greater than 1 (e.g. 100) it acts as a multiplier for the
|
||||
scheduling interval for reevaluating load when the CPU is at its top
|
||||
speed due to high load. This improves performance by reducing the overhead
|
||||
of load evaluation and helping the CPU stay at its top speed when truly
|
||||
busy, rather than shifting back and forth in speed. This tunable has no
|
||||
effect on behavior at lower speeds/lower CPU loads.
|
||||
* sampling_rate_min:
|
||||
|
||||
powersave_bias: this parameter takes a value between 0 to 1000. It
|
||||
defines the percentage (times 10) value of the target frequency that
|
||||
will be shaved off of the target. For example, when set to 100 -- 10%,
|
||||
when ondemand governor would have targeted 1000 MHz, it will target
|
||||
1000 MHz - (10% of 1000 MHz) = 900 MHz instead. This is set to 0
|
||||
(disabled) by default.
|
||||
When AMD frequency sensitivity powersave bias driver --
|
||||
drivers/cpufreq/amd_freq_sensitivity.c is loaded, this parameter
|
||||
defines the workload frequency sensitivity threshold in which a lower
|
||||
frequency is chosen instead of ondemand governor's original target.
|
||||
The frequency sensitivity is a hardware reported (on AMD Family 16h
|
||||
Processors and above) value between 0 to 100% that tells software how
|
||||
the performance of the workload running on a CPU will change when
|
||||
frequency changes. A workload with sensitivity of 0% (memory/IO-bound)
|
||||
will not perform any better on higher core frequency, whereas a
|
||||
workload with sensitivity of 100% (CPU-bound) will perform better
|
||||
higher the frequency. When the driver is loaded, this is set to 400
|
||||
by default -- for CPUs running workloads with sensitivity value below
|
||||
40%, a lower frequency is chosen. Unloading the driver or writing 0
|
||||
will disable this feature.
|
||||
The sampling rate is limited by the HW transition latency:
|
||||
transition_latency * 100
|
||||
|
||||
Or by kernel restrictions:
|
||||
- If CONFIG_NO_HZ_COMMON is set, the limit is 10ms fixed.
|
||||
- If CONFIG_NO_HZ_COMMON is not set or nohz=off boot parameter is
|
||||
used, the limits depend on the CONFIG_HZ option:
|
||||
HZ=1000: min=20000us (20ms)
|
||||
HZ=250: min=80000us (80ms)
|
||||
HZ=100: min=200000us (200ms)
|
||||
|
||||
The highest value of kernel and HW latency restrictions is shown and
|
||||
used as the minimum sampling rate.
|
||||
|
||||
* up_threshold:
|
||||
|
||||
This defines what the average CPU usage between the samplings of
|
||||
'sampling_rate' needs to be for the kernel to make a decision on
|
||||
whether it should increase the frequency. For example when it is set
|
||||
to its default value of '95' it means that between the checking
|
||||
intervals the CPU needs to be on average more than 95% in use to then
|
||||
decide that the CPU frequency needs to be increased.
|
||||
|
||||
* ignore_nice_load:
|
||||
|
||||
This parameter takes a value of '0' or '1'. When set to '0' (its
|
||||
default), all processes are counted towards the 'cpu utilisation'
|
||||
value. When set to '1', the processes that are run with a 'nice'
|
||||
value will not count (and thus be ignored) in the overall usage
|
||||
calculation. This is useful if you are running a CPU intensive
|
||||
calculation on your laptop that you do not care how long it takes to
|
||||
complete as you can 'nice' it and prevent it from taking part in the
|
||||
deciding process of whether to increase your CPU frequency.
|
||||
|
||||
* sampling_down_factor:
|
||||
|
||||
This parameter controls the rate at which the kernel makes a decision
|
||||
on when to decrease the frequency while running at top speed. When set
|
||||
to 1 (the default) decisions to reevaluate load are made at the same
|
||||
interval regardless of current clock speed. But when set to greater
|
||||
than 1 (e.g. 100) it acts as a multiplier for the scheduling interval
|
||||
for reevaluating load when the CPU is at its top speed due to high
|
||||
load. This improves performance by reducing the overhead of load
|
||||
evaluation and helping the CPU stay at its top speed when truly busy,
|
||||
rather than shifting back and forth in speed. This tunable has no
|
||||
effect on behavior at lower speeds/lower CPU loads.
|
||||
|
||||
* powersave_bias:
|
||||
|
||||
This parameter takes a value between 0 to 1000. It defines the
|
||||
percentage (times 10) value of the target frequency that will be
|
||||
shaved off of the target. For example, when set to 100 -- 10%, when
|
||||
ondemand governor would have targeted 1000 MHz, it will target
|
||||
1000 MHz - (10% of 1000 MHz) = 900 MHz instead. This is set to 0
|
||||
(disabled) by default.
|
||||
|
||||
When AMD frequency sensitivity powersave bias driver --
|
||||
drivers/cpufreq/amd_freq_sensitivity.c is loaded, this parameter
|
||||
defines the workload frequency sensitivity threshold in which a lower
|
||||
frequency is chosen instead of ondemand governor's original target.
|
||||
The frequency sensitivity is a hardware reported (on AMD Family 16h
|
||||
Processors and above) value between 0 to 100% that tells software how
|
||||
the performance of the workload running on a CPU will change when
|
||||
frequency changes. A workload with sensitivity of 0% (memory/IO-bound)
|
||||
will not perform any better on higher core frequency, whereas a
|
||||
workload with sensitivity of 100% (CPU-bound) will perform better
|
||||
higher the frequency. When the driver is loaded, this is set to 400 by
|
||||
default -- for CPUs running workloads with sensitivity value below
|
||||
40%, a lower frequency is chosen. Unloading the driver or writing 0
|
||||
will disable this feature.
|
||||
|
||||
|
||||
2.5 Conservative
|
||||
----------------
|
||||
|
||||
The CPUfreq governor "conservative", much like the "ondemand"
|
||||
governor, sets the CPU depending on the current usage. It differs in
|
||||
behaviour in that it gracefully increases and decreases the CPU speed
|
||||
rather than jumping to max speed the moment there is any load on the
|
||||
CPU. This behaviour more suitable in a battery powered environment.
|
||||
The governor is tweaked in the same manner as the "ondemand" governor
|
||||
through sysfs with the addition of:
|
||||
governor, sets the CPU frequency depending on the current usage. It
|
||||
differs in behaviour in that it gracefully increases and decreases the
|
||||
CPU speed rather than jumping to max speed the moment there is any load
|
||||
on the CPU. This behaviour is more suitable in a battery powered
|
||||
environment. The governor is tweaked in the same manner as the
|
||||
"ondemand" governor through sysfs with the addition of:
|
||||
|
||||
freq_step: this describes what percentage steps the cpu freq should be
|
||||
increased and decreased smoothly by. By default the cpu frequency will
|
||||
increase in 5% chunks of your maximum cpu frequency. You can change this
|
||||
value to anywhere between 0 and 100 where '0' will effectively lock your
|
||||
CPU at a speed regardless of its load whilst '100' will, in theory, make
|
||||
it behave identically to the "ondemand" governor.
|
||||
* freq_step:
|
||||
|
||||
down_threshold: same as the 'up_threshold' found for the "ondemand"
|
||||
governor but for the opposite direction. For example when set to its
|
||||
default value of '20' it means that if the CPU usage needs to be below
|
||||
20% between samples to have the frequency decreased.
|
||||
This describes what percentage steps the cpu freq should be increased
|
||||
and decreased smoothly by. By default the cpu frequency will increase
|
||||
in 5% chunks of your maximum cpu frequency. You can change this value
|
||||
to anywhere between 0 and 100 where '0' will effectively lock your CPU
|
||||
at a speed regardless of its load whilst '100' will, in theory, make
|
||||
it behave identically to the "ondemand" governor.
|
||||
|
||||
* down_threshold:
|
||||
|
||||
Same as the 'up_threshold' found for the "ondemand" governor but for
|
||||
the opposite direction. For example when set to its default value of
|
||||
'20' it means that if the CPU usage needs to be below 20% between
|
||||
samples to have the frequency decreased.
|
||||
|
||||
* sampling_down_factor:
|
||||
|
||||
Similar functionality as in "ondemand" governor. But in
|
||||
"conservative", it controls the rate at which the kernel makes a
|
||||
decision on when to decrease the frequency while running in any speed.
|
||||
Load for frequency increase is still evaluated every sampling rate.
|
||||
|
||||
|
||||
2.6 Schedutil
|
||||
-------------
|
||||
|
||||
The "schedutil" governor aims at better integration with the Linux
|
||||
kernel scheduler. Load estimation is achieved through the scheduler's
|
||||
Per-Entity Load Tracking (PELT) mechanism, which also provides
|
||||
information about the recent load [1]. This governor currently does
|
||||
load based DVFS only for tasks managed by CFS. RT and DL scheduler tasks
|
||||
are always run at the highest frequency. Unlike all the other
|
||||
governors, the code is located under the kernel/sched/ directory.
|
||||
|
||||
Sysfs files:
|
||||
|
||||
* rate_limit_us:
|
||||
|
||||
This contains a value in microseconds. The governor waits for
|
||||
rate_limit_us time before reevaluating the load again, after it has
|
||||
evaluated the load once.
|
||||
|
||||
For an in-depth comparison with the other governors refer to [2].
|
||||
|
||||
sampling_down_factor: similar functionality as in "ondemand" governor.
|
||||
But in "conservative", it controls the rate at which the kernel makes
|
||||
a decision on when to decrease the frequency while running in any
|
||||
speed. Load for frequency increase is still evaluated every
|
||||
sampling rate.
|
||||
|
||||
3. The Governor Interface in the CPUfreq Core
|
||||
=============================================
|
||||
|
@ -225,26 +267,10 @@ A new governor must register itself with the CPUfreq core using
|
|||
"cpufreq_register_governor". The struct cpufreq_governor, which has to
|
||||
be passed to that function, must contain the following values:
|
||||
|
||||
governor->name - A unique name for this governor
|
||||
governor->governor - The governor callback function
|
||||
governor->owner - .THIS_MODULE for the governor module (if
|
||||
appropriate)
|
||||
|
||||
The governor->governor callback is called with the current (or to-be-set)
|
||||
cpufreq_policy struct for that CPU, and an unsigned int event. The
|
||||
following events are currently defined:
|
||||
|
||||
CPUFREQ_GOV_START: This governor shall start its duty for the CPU
|
||||
policy->cpu
|
||||
CPUFREQ_GOV_STOP: This governor shall end its duty for the CPU
|
||||
policy->cpu
|
||||
CPUFREQ_GOV_LIMITS: The limits for CPU policy->cpu have changed to
|
||||
policy->min and policy->max.
|
||||
|
||||
If you need other "events" externally of your driver, _only_ use the
|
||||
cpufreq_governor_l(unsigned int cpu, unsigned int event) call to the
|
||||
CPUfreq core to ensure proper locking.
|
||||
governor->name - A unique name for this governor.
|
||||
governor->owner - .THIS_MODULE for the governor module (if appropriate).
|
||||
|
||||
plus a set of hooks to the functions implementing the governor's logic.
|
||||
|
||||
The CPUfreq governor may call the CPU processor driver using one of
|
||||
these two functions:
|
||||
|
@ -258,12 +284,18 @@ int __cpufreq_driver_target(struct cpufreq_policy *policy,
|
|||
unsigned int relation);
|
||||
|
||||
target_freq must be within policy->min and policy->max, of course.
|
||||
What's the difference between these two functions? When your governor
|
||||
still is in a direct code path of a call to governor->governor, the
|
||||
per-CPU cpufreq lock is still held in the cpufreq core, and there's
|
||||
no need to lock it again (in fact, this would cause a deadlock). So
|
||||
use __cpufreq_driver_target only in these cases. In all other cases
|
||||
(for example, when there's a "daemonized" function that wakes up
|
||||
every second), use cpufreq_driver_target to lock the cpufreq per-CPU
|
||||
lock before the command is passed to the cpufreq processor driver.
|
||||
What's the difference between these two functions? When your governor is
|
||||
in a direct code path of a call to governor callbacks, like
|
||||
governor->start(), the policy->rwsem is still held in the cpufreq core,
|
||||
and there's no need to lock it again (in fact, this would cause a
|
||||
deadlock). So use __cpufreq_driver_target only in these cases. In all
|
||||
other cases (for example, when there's a "daemonized" function that
|
||||
wakes up every second), use cpufreq_driver_target to take policy->rwsem
|
||||
before the command is passed to the cpufreq driver.
|
||||
|
||||
4. References
|
||||
=============
|
||||
|
||||
[1] Per-entity load tracking: https://lwn.net/Articles/531853/
|
||||
[2] Improvements in CPU frequency management: https://lwn.net/Articles/682391/
|
||||
|
||||
|
|
|
@ -18,16 +18,29 @@
|
|||
|
||||
Documents in this directory:
|
||||
----------------------------
|
||||
core.txt - General description of the CPUFreq core and
|
||||
of CPUFreq notifiers
|
||||
|
||||
cpu-drivers.txt - How to implement a new cpufreq processor driver
|
||||
amd-powernow.txt - AMD powernow driver specific file.
|
||||
|
||||
boost.txt - Frequency boosting support.
|
||||
|
||||
core.txt - General description of the CPUFreq core and
|
||||
of CPUFreq notifiers.
|
||||
|
||||
cpu-drivers.txt - How to implement a new cpufreq processor driver.
|
||||
|
||||
cpufreq-nforce2.txt - nVidia nForce2 platform specific file.
|
||||
|
||||
cpufreq-stats.txt - General description of sysfs cpufreq stats.
|
||||
|
||||
governors.txt - What are cpufreq governors and how to
|
||||
implement them?
|
||||
|
||||
index.txt - File index, Mailing list and Links (this document)
|
||||
|
||||
intel-pstate.txt - Intel pstate cpufreq driver specific file.
|
||||
|
||||
pcc-cpufreq.txt - PCC cpufreq driver specific file.
|
||||
|
||||
user-guide.txt - User Guide to CPUFreq
|
||||
|
||||
|
||||
|
@ -35,9 +48,7 @@ Mailing List
|
|||
------------
|
||||
There is a CPU frequency changing CVS commit and general list where
|
||||
you can report bugs, problems or submit patches. To post a message,
|
||||
send an email to linux-pm@vger.kernel.org, to subscribe go to
|
||||
http://vger.kernel.org/vger-lists.html#linux-pm and follow the
|
||||
instructions there.
|
||||
send an email to linux-pm@vger.kernel.org.
|
||||
|
||||
Links
|
||||
-----
|
||||
|
@ -48,7 +59,7 @@ how to access the CVS repository:
|
|||
* http://cvs.arm.linux.org.uk/
|
||||
|
||||
the CPUFreq Mailing list:
|
||||
* http://vger.kernel.org/vger-lists.html#cpufreq
|
||||
* http://vger.kernel.org/vger-lists.html#linux-pm
|
||||
|
||||
Clock and voltage scaling for the SA-1100:
|
||||
* http://www.lartmaker.nl/projects/scaling
|
||||
|
|
|
@ -85,6 +85,21 @@ Sysfs will show :
|
|||
Refer to "Intel® 64 and IA-32 Architectures Software Developer’s Manual
|
||||
Volume 3: System Programming Guide" to understand ratios.
|
||||
|
||||
There is one more sysfs attribute in /sys/devices/system/cpu/intel_pstate/
|
||||
that can be used for controlling the operation mode of the driver:
|
||||
|
||||
status: Three settings are possible:
|
||||
"off" - The driver is not in use at this time.
|
||||
"active" - The driver works as a P-state governor (default).
|
||||
"passive" - The driver works as a regular cpufreq one and collaborates
|
||||
with the generic cpufreq governors (it sets P-states as
|
||||
requested by those governors).
|
||||
The current setting is returned by reads from this attribute. Writing one
|
||||
of the above strings to it changes the operation mode as indicated by that
|
||||
string, if possible. If HW-managed P-states (HWP) are enabled, it is not
|
||||
possible to change the driver's operation mode and attempts to write to
|
||||
this attribute will fail.
|
||||
|
||||
cpufreq sysfs for Intel P-State
|
||||
|
||||
Since this driver registers with cpufreq, cpufreq sysfs is also presented.
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
Contents:
|
||||
---------
|
||||
1. Supported Architectures and Processors
|
||||
1.1 ARM
|
||||
1.1 ARM and ARM64
|
||||
1.2 x86
|
||||
1.3 sparc64
|
||||
1.4 ppc
|
||||
|
@ -37,16 +37,10 @@ Contents:
|
|||
1. Supported Architectures and Processors
|
||||
=========================================
|
||||
|
||||
1.1 ARM
|
||||
-------
|
||||
|
||||
The following ARM processors are supported by cpufreq:
|
||||
|
||||
ARM Integrator
|
||||
ARM-SA1100
|
||||
ARM-SA1110
|
||||
Intel PXA
|
||||
1.1 ARM and ARM64
|
||||
-----------------
|
||||
|
||||
Almost all ARM and ARM64 platforms support CPU frequency scaling.
|
||||
|
||||
1.2 x86
|
||||
-------
|
||||
|
@ -69,6 +63,7 @@ Transmeta Crusoe
|
|||
Transmeta Efficeon
|
||||
VIA Cyrix 3 / C3
|
||||
various processors on some ACPI 2.0-compatible systems [*]
|
||||
And many more
|
||||
|
||||
[*] Only if "ACPI Processor Performance States" are available
|
||||
to the ACPI<->BIOS interface.
|
||||
|
@ -147,10 +142,19 @@ mounted it at /sys, the cpufreq interface is located in a subdirectory
|
|||
"cpufreq" within the cpu-device directory
|
||||
(e.g. /sys/devices/system/cpu/cpu0/cpufreq/ for the first CPU).
|
||||
|
||||
affected_cpus : List of Online CPUs that require software
|
||||
coordination of frequency.
|
||||
|
||||
cpuinfo_cur_freq : Current frequency of the CPU as obtained from
|
||||
the hardware, in KHz. This is the frequency
|
||||
the CPU actually runs at.
|
||||
|
||||
cpuinfo_min_freq : this file shows the minimum operating
|
||||
frequency the processor can run at(in kHz)
|
||||
|
||||
cpuinfo_max_freq : this file shows the maximum operating
|
||||
frequency the processor can run at(in kHz)
|
||||
|
||||
cpuinfo_transition_latency The time it takes on this CPU to
|
||||
switch between two frequencies in nano
|
||||
seconds. If unknown or known to be
|
||||
|
@ -163,25 +167,30 @@ cpuinfo_transition_latency The time it takes on this CPU to
|
|||
userspace daemon. Make sure to not
|
||||
switch the frequency too often
|
||||
resulting in performance loss.
|
||||
scaling_driver : this file shows what cpufreq driver is
|
||||
used to set the frequency on this CPU
|
||||
|
||||
related_cpus : List of Online + Offline CPUs that need software
|
||||
coordination of frequency.
|
||||
|
||||
scaling_available_frequencies : List of available frequencies, in KHz.
|
||||
|
||||
scaling_available_governors : this file shows the CPUfreq governors
|
||||
available in this kernel. You can see the
|
||||
currently activated governor in
|
||||
|
||||
scaling_cur_freq : Current frequency of the CPU as determined by
|
||||
the governor and cpufreq core, in KHz. This is
|
||||
the frequency the kernel thinks the CPU runs
|
||||
at.
|
||||
|
||||
scaling_driver : this file shows what cpufreq driver is
|
||||
used to set the frequency on this CPU
|
||||
|
||||
scaling_governor, and by "echoing" the name of another
|
||||
governor you can change it. Please note
|
||||
that some governors won't load - they only
|
||||
work on some specific architectures or
|
||||
processors.
|
||||
|
||||
cpuinfo_cur_freq : Current frequency of the CPU as obtained from
|
||||
the hardware, in KHz. This is the frequency
|
||||
the CPU actually runs at.
|
||||
|
||||
scaling_available_frequencies : List of available frequencies, in KHz.
|
||||
|
||||
scaling_min_freq and
|
||||
scaling_max_freq show the current "policy limits" (in
|
||||
kHz). By echoing new values into these
|
||||
|
@ -190,16 +199,11 @@ scaling_max_freq show the current "policy limits" (in
|
|||
first set scaling_max_freq, then
|
||||
scaling_min_freq.
|
||||
|
||||
affected_cpus : List of Online CPUs that require software
|
||||
coordination of frequency.
|
||||
|
||||
related_cpus : List of Online + Offline CPUs that need software
|
||||
coordination of frequency.
|
||||
|
||||
scaling_cur_freq : Current frequency of the CPU as determined by
|
||||
the governor and cpufreq core, in KHz. This is
|
||||
the frequency the kernel thinks the CPU runs
|
||||
at.
|
||||
scaling_setspeed This can be read to get the currently programmed
|
||||
value by the governor. This can be written to
|
||||
change the current frequency for a group of
|
||||
CPUs, represented by a policy. This is supported
|
||||
currently only by the userspace governor.
|
||||
|
||||
bios_limit : If the BIOS tells the OS to limit a CPU to
|
||||
lower frequencies, the user can read out the
|
||||
|
|
|
@ -207,6 +207,10 @@ Optional feature arguments are:
|
|||
block, then the cache block is invalidated.
|
||||
To enable passthrough mode the cache must be clean.
|
||||
|
||||
metadata2 : use version 2 of the metadata. This stores the dirty bits
|
||||
in a separate btree, which improves speed of shutting
|
||||
down the cache.
|
||||
|
||||
A policy called 'default' is always registered. This is an alias for
|
||||
the policy we currently think is giving best all round performance.
|
||||
|
||||
|
|
|
@ -161,6 +161,15 @@ The target is named "raid" and it accepts the following parameters:
|
|||
the RAID type (i.e. the allocation algorithm) as well, e.g.
|
||||
changing from raid5_ls to raid5_n.
|
||||
|
||||
[journal_dev <dev>]
|
||||
This option adds a journal device to raid4/5/6 raid sets and
|
||||
uses it to close the 'write hole' caused by the non-atomic updates
|
||||
to the component devices which can cause data loss during recovery.
|
||||
The journal device is used as writethrough thus causing writes to
|
||||
be throttled versus non-journaled raid4/5/6 sets.
|
||||
Takeover/reshape is not possible with a raid4/5/6 journal device;
|
||||
it has to be deconfigured before requesting these.
|
||||
|
||||
<#raid_devs>: The number of devices composing the array.
|
||||
Each device consists of two entries. The first is the device
|
||||
containing the metadata (if any); the second is the one containing the
|
||||
|
@ -245,6 +254,9 @@ recovery. Here is a fuller description of the individual fields:
|
|||
<data_offset> The current data offset to the start of the user data on
|
||||
each component device of a raid set (see the respective
|
||||
raid parameter to support out-of-place reshaping).
|
||||
<journal_char> 'A' - active raid4/5/6 journal device.
|
||||
'D' - dead journal device.
|
||||
'-' - no journal device.
|
||||
|
||||
|
||||
Message Interface
|
||||
|
@ -314,3 +326,8 @@ Version History
|
|||
1.9.0 Add support for RAID level takeover/reshape/region size
|
||||
and set size reduction.
|
||||
1.9.1 Fix activation of existing RAID 4/10 mapped devices
|
||||
1.9.2 Don't emit '- -' on the status table line in case the constructor
|
||||
fails reading a superblock. Correctly emit 'maj:min1 maj:min2' and
|
||||
'D' on the status line. If '- -' is passed into the constructor, emit
|
||||
'- -' on the table line and '-' as the status line health character.
|
||||
1.10.0 Add support for raid4/5/6 journal device
|
||||
|
|
|
@ -0,0 +1,128 @@
|
|||
TI CPUFreq and OPP bindings
|
||||
================================
|
||||
|
||||
Certain TI SoCs, like those in the am335x, am437x, am57xx, and dra7xx
|
||||
families support different OPPs depending on the silicon variant in use.
|
||||
The ti-cpufreq driver can use revision and an efuse value from the SoC to
|
||||
provide the OPP framework with supported hardware information. This is
|
||||
used to determine which OPPs from the operating-points-v2 table get enabled
|
||||
when it is parsed by the OPP framework.
|
||||
|
||||
Required properties:
|
||||
--------------------
|
||||
In 'cpus' nodes:
|
||||
- operating-points-v2: Phandle to the operating-points-v2 table to use.
|
||||
|
||||
In 'operating-points-v2' table:
|
||||
- compatible: Should be
|
||||
- 'operating-points-v2-ti-cpu' for am335x, am43xx, and dra7xx/am57xx SoCs
|
||||
- syscon: A phandle pointing to a syscon node representing the control module
|
||||
register space of the SoC.
|
||||
|
||||
Optional properties:
|
||||
--------------------
|
||||
For each opp entry in 'operating-points-v2' table:
|
||||
- opp-supported-hw: Two bitfields indicating:
|
||||
1. Which revision of the SoC the OPP is supported by
|
||||
2. Which eFuse bits indicate this OPP is available
|
||||
|
||||
A bitwise AND is performed against these values and if any bit
|
||||
matches, the OPP gets enabled.
|
||||
|
||||
Example:
|
||||
--------
|
||||
|
||||
/* From arch/arm/boot/dts/am33xx.dtsi */
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
cpu@0 {
|
||||
compatible = "arm,cortex-a8";
|
||||
device_type = "cpu";
|
||||
reg = <0>;
|
||||
|
||||
operating-points-v2 = <&cpu0_opp_table>;
|
||||
|
||||
clocks = <&dpll_mpu_ck>;
|
||||
clock-names = "cpu";
|
||||
|
||||
clock-latency = <300000>; /* From omap-cpufreq driver */
|
||||
};
|
||||
};
|
||||
|
||||
/*
|
||||
* cpu0 has different OPPs depending on SoC revision and some on revisions
|
||||
* 0x2 and 0x4 have eFuse bits that indicate if they are available or not
|
||||
*/
|
||||
cpu0_opp_table: opp-table {
|
||||
compatible = "operating-points-v2-ti-cpu";
|
||||
syscon = <&scm_conf>;
|
||||
|
||||
/*
|
||||
* The three following nodes are marked with opp-suspend
|
||||
* because they can not be enabled simultaneously on a
|
||||
* single SoC.
|
||||
*/
|
||||
opp50@300000000 {
|
||||
opp-hz = /bits/ 64 <300000000>;
|
||||
opp-microvolt = <950000 931000 969000>;
|
||||
opp-supported-hw = <0x06 0x0010>;
|
||||
opp-suspend;
|
||||
};
|
||||
|
||||
opp100@275000000 {
|
||||
opp-hz = /bits/ 64 <275000000>;
|
||||
opp-microvolt = <1100000 1078000 1122000>;
|
||||
opp-supported-hw = <0x01 0x00FF>;
|
||||
opp-suspend;
|
||||
};
|
||||
|
||||
opp100@300000000 {
|
||||
opp-hz = /bits/ 64 <300000000>;
|
||||
opp-microvolt = <1100000 1078000 1122000>;
|
||||
opp-supported-hw = <0x06 0x0020>;
|
||||
opp-suspend;
|
||||
};
|
||||
|
||||
opp100@500000000 {
|
||||
opp-hz = /bits/ 64 <500000000>;
|
||||
opp-microvolt = <1100000 1078000 1122000>;
|
||||
opp-supported-hw = <0x01 0xFFFF>;
|
||||
};
|
||||
|
||||
opp100@600000000 {
|
||||
opp-hz = /bits/ 64 <600000000>;
|
||||
opp-microvolt = <1100000 1078000 1122000>;
|
||||
opp-supported-hw = <0x06 0x0040>;
|
||||
};
|
||||
|
||||
opp120@600000000 {
|
||||
opp-hz = /bits/ 64 <600000000>;
|
||||
opp-microvolt = <1200000 1176000 1224000>;
|
||||
opp-supported-hw = <0x01 0xFFFF>;
|
||||
};
|
||||
|
||||
opp120@720000000 {
|
||||
opp-hz = /bits/ 64 <720000000>;
|
||||
opp-microvolt = <1200000 1176000 1224000>;
|
||||
opp-supported-hw = <0x06 0x0080>;
|
||||
};
|
||||
|
||||
oppturbo@720000000 {
|
||||
opp-hz = /bits/ 64 <720000000>;
|
||||
opp-microvolt = <1260000 1234800 1285200>;
|
||||
opp-supported-hw = <0x01 0xFFFF>;
|
||||
};
|
||||
|
||||
oppturbo@800000000 {
|
||||
opp-hz = /bits/ 64 <800000000>;
|
||||
opp-microvolt = <1260000 1234800 1285200>;
|
||||
opp-supported-hw = <0x06 0x0100>;
|
||||
};
|
||||
|
||||
oppnitro@1000000000 {
|
||||
opp-hz = /bits/ 64 <1000000000>;
|
||||
opp-microvolt = <1325000 1298500 1351500>;
|
||||
opp-supported-hw = <0x04 0x0200>;
|
||||
};
|
||||
};
|
|
@ -123,6 +123,20 @@ Detailed correlation between sub-blocks and power line according to Exynos SoC:
|
|||
|--- FSYS
|
||||
|--- FSYS2
|
||||
|
||||
- In case of Exynos5433, there is VDD_INT power line as following:
|
||||
VDD_INT |--- G2D (parent device)
|
||||
|--- MSCL
|
||||
|--- GSCL
|
||||
|--- JPEG
|
||||
|--- MFC
|
||||
|--- HEVC
|
||||
|--- BUS0
|
||||
|--- BUS1
|
||||
|--- BUS2
|
||||
|--- PERIS (Fixed clock rate)
|
||||
|--- PERIC (Fixed clock rate)
|
||||
|--- FSYS (Fixed clock rate)
|
||||
|
||||
Example1:
|
||||
Show the AXI buses of Exynos3250 SoC. Exynos3250 divides the buses to
|
||||
power line (regulator). The MIF (Memory Interface) AXI bus is used to
|
||||
|
|
|
@ -40,8 +40,7 @@ Example:
|
|||
|
||||
DMA clients connected to the STM32 DMA controller must use the format
|
||||
described in the dma.txt file, using a five-cell specifier for each
|
||||
channel: a phandle plus four integer cells.
|
||||
The four cells in order are:
|
||||
channel: a phandle to the DMA controller plus the following four integer cells:
|
||||
|
||||
1. The channel id
|
||||
2. The request line number
|
||||
|
@ -61,7 +60,7 @@ The four cells in order are:
|
|||
0x1: medium
|
||||
0x2: high
|
||||
0x3: very high
|
||||
5. A 32bit mask specifying the DMA FIFO threshold configuration which are device
|
||||
4. A 32bit mask specifying the DMA FIFO threshold configuration which are device
|
||||
dependent:
|
||||
-bit 0-1: Fifo threshold
|
||||
0x0: 1/4 full FIFO
|
||||
|
|
|
@ -17,6 +17,22 @@ Required properties:
|
|||
- interrupt-parent: the phandle for the interrupt controller
|
||||
- interrupts: interrupt line
|
||||
|
||||
Additional optional properties:
|
||||
|
||||
Some devices may support additional optional properties to help with, e.g.,
|
||||
power sequencing. The following properties can be supported by one or more
|
||||
device-specific compatible properties, which should be used in addition to the
|
||||
"hid-over-i2c" string.
|
||||
|
||||
- compatible:
|
||||
* "wacom,w9013" (Wacom W9013 digitizer). Supports:
|
||||
- vdd-supply
|
||||
- post-power-on-delay-ms
|
||||
|
||||
- vdd-supply: phandle of the regulator that provides the supply voltage.
|
||||
- post-power-on-delay-ms: time required by the device after enabling its regulators
|
||||
before it is ready for communication. Must be used with 'vdd-supply'.
|
||||
|
||||
Example:
|
||||
|
||||
i2c-hid-dev@2c {
|
||||
|
|
|
@ -61,16 +61,24 @@ property can be omitted.
|
|||
|
||||
Examples:
|
||||
|
||||
system-status {
|
||||
label = "Status";
|
||||
linux,default-trigger = "heartbeat";
|
||||
...
|
||||
gpio-leds {
|
||||
compatible = "gpio-leds";
|
||||
|
||||
system-status {
|
||||
label = "Status";
|
||||
linux,default-trigger = "heartbeat";
|
||||
gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
};
|
||||
|
||||
camera-flash {
|
||||
label = "Flash";
|
||||
led-sources = <0>, <1>;
|
||||
led-max-microamp = <50000>;
|
||||
flash-max-microamp = <320000>;
|
||||
flash-max-timeout-us = <500000>;
|
||||
max77693-led {
|
||||
compatible = "maxim,max77693-led";
|
||||
|
||||
camera-flash {
|
||||
label = "Flash";
|
||||
led-sources = <0>, <1>;
|
||||
led-max-microamp = <50000>;
|
||||
flash-max-microamp = <320000>;
|
||||
flash-max-timeout-us = <500000>;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
Device tree bindings for IR LED connected through SPI bus which is used as
|
||||
remote controller.
|
||||
|
||||
The IR LED switch is connected to the MOSI line of the SPI device and the data
|
||||
are delivered thourgh that.
|
||||
|
||||
Required properties:
|
||||
- compatible: should be "ir-spi-led".
|
||||
|
||||
Optional properties:
|
||||
- duty-cycle: 8 bit balue that represents the percentage of one period
|
||||
in which the signal is active. It can be 50, 60, 70, 75, 80 or 90.
|
||||
- led-active-low: boolean value that specifies whether the output is
|
||||
negated with a NOT gate.
|
||||
- power-supply: specifies the power source. It can either be a regulator
|
||||
or a gpio which enables a regulator, i.e. a regulator-fixed as
|
||||
described in
|
||||
Documentation/devicetree/bindings/regulator/fixed-regulator.txt
|
||||
|
||||
Example:
|
||||
|
||||
irled@0 {
|
||||
compatible = "ir-spi-led";
|
||||
reg = <0x0>;
|
||||
spi-max-frequency = <5000000>;
|
||||
power-supply = <&vdd_led>;
|
||||
led-active-low;
|
||||
duty-cycle = /bits/ 8 <60>;
|
||||
};
|
|
@ -0,0 +1,21 @@
|
|||
Freescale Video Data Order Adapter
|
||||
==================================
|
||||
|
||||
The Video Data Order Adapter (VDOA) is present on the i.MX6q. Its sole purpose
|
||||
is to reorder video data from the macroblock tiled order produced by the CODA
|
||||
960 VPU to the conventional raster-scan order for scanout.
|
||||
|
||||
Required properties:
|
||||
- compatible: must be "fsl,imx6q-vdoa"
|
||||
- reg: the register base and size for the device registers
|
||||
- interrupts: the VDOA interrupt
|
||||
- clocks: the vdoa clock
|
||||
|
||||
Example:
|
||||
|
||||
vdoa@21e4000 {
|
||||
compatible = "fsl,imx6q-vdoa";
|
||||
reg = <0x021e4000 0x4000>;
|
||||
interrupts = <0 18 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clks IMX6QDL_CLK_VDOA>;
|
||||
};
|
|
@ -5,7 +5,8 @@ Required properties:
|
|||
- gpios: specifies GPIO used for IR signal reception.
|
||||
|
||||
Optional properties:
|
||||
- linux,rc-map-name: Linux specific remote control map name.
|
||||
- linux,rc-map-name: see rc.txt file in the same
|
||||
directory.
|
||||
|
||||
Example node:
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ Required properties:
|
|||
- clocks: clock phandle and specifier pair.
|
||||
|
||||
Optional properties:
|
||||
- linux,rc-map-name : Remote control map name.
|
||||
- linux,rc-map-name: see rc.txt file in the same directory.
|
||||
- hisilicon,power-syscon: DEPRECATED. Don't use this in new dts files.
|
||||
Provide correct clocks instead.
|
||||
|
||||
|
|
|
@ -0,0 +1,48 @@
|
|||
Toshiba et8ek8 5MP sensor
|
||||
|
||||
Toshiba et8ek8 5MP sensor is an image sensor found in Nokia N900 device
|
||||
|
||||
More detailed documentation can be found in
|
||||
Documentation/devicetree/bindings/media/video-interfaces.txt .
|
||||
|
||||
|
||||
Mandatory properties
|
||||
--------------------
|
||||
|
||||
- compatible: "toshiba,et8ek8"
|
||||
- reg: I2C address (0x3e, or an alternative address)
|
||||
- vana-supply: Analogue voltage supply (VANA), 2.8 volts
|
||||
- clocks: External clock to the sensor
|
||||
- clock-frequency: Frequency of the external clock to the sensor. Camera
|
||||
driver will set this frequency on the external clock. The clock frequency is
|
||||
a pre-determined frequency known to be suitable to the board.
|
||||
- reset-gpios: XSHUTDOWN GPIO. The XSHUTDOWN signal is active low. The sensor
|
||||
is in hardware standby mode when the signal is in the low state.
|
||||
|
||||
|
||||
Endpoint node mandatory properties
|
||||
----------------------------------
|
||||
|
||||
- remote-endpoint: A phandle to the bus receiver's endpoint node.
|
||||
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
&i2c3 {
|
||||
clock-frequency = <400000>;
|
||||
|
||||
cam1: camera@3e {
|
||||
compatible = "toshiba,et8ek8";
|
||||
reg = <0x3e>;
|
||||
vana-supply = <&vaux4>;
|
||||
clocks = <&isp 0>;
|
||||
clock-frequency = <9600000>;
|
||||
reset-gpio = <&gpio4 6 GPIO_ACTIVE_HIGH>; /* 102 */
|
||||
port {
|
||||
csi_cam1: endpoint {
|
||||
remote-endpoint = <&csi_out1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
|
@ -8,6 +8,9 @@ Required properties:
|
|||
- reg : physical base address and length of the device registers
|
||||
- interrupts : a single specifier for the interrupt from the device
|
||||
|
||||
Optional properties:
|
||||
- linux,rc-map-name: see rc.txt file in the same directory.
|
||||
|
||||
Example:
|
||||
|
||||
ir-receiver@c8100480 {
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
Device-Tree bindings for Mediatek consumer IR controller
|
||||
found in Mediatek SoC family
|
||||
|
||||
Required properties:
|
||||
- compatible : "mediatek,mt7623-cir"
|
||||
- clocks : list of clock specifiers, corresponding to
|
||||
entries in clock-names property;
|
||||
- clock-names : should contain "clk" entries;
|
||||
- interrupts : should contain IR IRQ number;
|
||||
- reg : should contain IO map address for IR.
|
||||
|
||||
Optional properties:
|
||||
- linux,rc-map-name : see rc.txt file in the same directory.
|
||||
|
||||
Example:
|
||||
|
||||
cir: cir@10013000 {
|
||||
compatible = "mediatek,mt7623-cir";
|
||||
reg = <0 0x10013000 0 0x1000>;
|
||||
interrupts = <GIC_SPI 87 IRQ_TYPE_LEVEL_LOW>;
|
||||
clocks = <&infracfg CLK_INFRA_IRRX>;
|
||||
clock-names = "clk";
|
||||
linux,rc-map-name = "rc-rc6-mce";
|
||||
};
|
|
@ -0,0 +1,117 @@
|
|||
The following properties are common to the infrared remote controllers:
|
||||
|
||||
- linux,rc-map-name: string, specifies the scancode/key mapping table
|
||||
defined in-kernel for the remote controller. Support values are:
|
||||
* "rc-adstech-dvb-t-pci"
|
||||
* "rc-alink-dtu-m"
|
||||
* "rc-anysee"
|
||||
* "rc-apac-viewcomp"
|
||||
* "rc-asus-pc39"
|
||||
* "rc-asus-ps3-100"
|
||||
* "rc-ati-tv-wonder-hd-600"
|
||||
* "rc-ati-x10"
|
||||
* "rc-avermedia-a16d"
|
||||
* "rc-avermedia-cardbus"
|
||||
* "rc-avermedia-dvbt"
|
||||
* "rc-avermedia-m135a"
|
||||
* "rc-avermedia-m733a-rm-k6"
|
||||
* "rc-avermedia-rm-ks"
|
||||
* "rc-avermedia"
|
||||
* "rc-avertv-303"
|
||||
* "rc-azurewave-ad-tu700"
|
||||
* "rc-behold-columbus"
|
||||
* "rc-behold"
|
||||
* "rc-budget-ci-old"
|
||||
* "rc-cec"
|
||||
* "rc-cinergy-1400"
|
||||
* "rc-cinergy"
|
||||
* "rc-delock-61959"
|
||||
* "rc-dib0700-nec"
|
||||
* "rc-dib0700-rc5"
|
||||
* "rc-digitalnow-tinytwin"
|
||||
* "rc-digittrade"
|
||||
* "rc-dm1105-nec"
|
||||
* "rc-dntv-live-dvbt-pro"
|
||||
* "rc-dntv-live-dvb-t"
|
||||
* "rc-dtt200u"
|
||||
* "rc-dvbsky"
|
||||
* "rc-empty"
|
||||
* "rc-em-terratec"
|
||||
* "rc-encore-enltv2"
|
||||
* "rc-encore-enltv-fm53"
|
||||
* "rc-encore-enltv"
|
||||
* "rc-evga-indtube"
|
||||
* "rc-eztv"
|
||||
* "rc-flydvb"
|
||||
* "rc-flyvideo"
|
||||
* "rc-fusionhdtv-mce"
|
||||
* "rc-gadmei-rm008z"
|
||||
* "rc-geekbox"
|
||||
* "rc-genius-tvgo-a11mce"
|
||||
* "rc-gotview7135"
|
||||
* "rc-hauppauge"
|
||||
* "rc-imon-mce"
|
||||
* "rc-imon-pad"
|
||||
* "rc-iodata-bctv7e"
|
||||
* "rc-it913x-v1"
|
||||
* "rc-it913x-v2"
|
||||
* "rc-kaiomy"
|
||||
* "rc-kworld-315u"
|
||||
* "rc-kworld-pc150u"
|
||||
* "rc-kworld-plus-tv-analog"
|
||||
* "rc-leadtek-y04g0051"
|
||||
* "rc-lirc"
|
||||
* "rc-lme2510"
|
||||
* "rc-manli"
|
||||
* "rc-medion-x10"
|
||||
* "rc-medion-x10-digitainer"
|
||||
* "rc-medion-x10-or2x"
|
||||
* "rc-msi-digivox-ii"
|
||||
* "rc-msi-digivox-iii"
|
||||
* "rc-msi-tvanywhere-plus"
|
||||
* "rc-msi-tvanywhere"
|
||||
* "rc-nebula"
|
||||
* "rc-nec-terratec-cinergy-xs"
|
||||
* "rc-norwood"
|
||||
* "rc-npgtech"
|
||||
* "rc-pctv-sedna"
|
||||
* "rc-pinnacle-color"
|
||||
* "rc-pinnacle-grey"
|
||||
* "rc-pinnacle-pctv-hd"
|
||||
* "rc-pixelview-new"
|
||||
* "rc-pixelview"
|
||||
* "rc-pixelview-002t"
|
||||
* "rc-pixelview-mk12"
|
||||
* "rc-powercolor-real-angel"
|
||||
* "rc-proteus-2309"
|
||||
* "rc-purpletv"
|
||||
* "rc-pv951"
|
||||
* "rc-hauppauge"
|
||||
* "rc-rc5-tv"
|
||||
* "rc-rc6-mce"
|
||||
* "rc-real-audio-220-32-keys"
|
||||
* "rc-reddo"
|
||||
* "rc-snapstream-firefly"
|
||||
* "rc-streamzap"
|
||||
* "rc-tbs-nec"
|
||||
* "rc-technisat-ts35"
|
||||
* "rc-technisat-usb2"
|
||||
* "rc-terratec-cinergy-c-pci"
|
||||
* "rc-terratec-cinergy-s2-hd"
|
||||
* "rc-terratec-cinergy-xs"
|
||||
* "rc-terratec-slim"
|
||||
* "rc-terratec-slim-2"
|
||||
* "rc-tevii-nec"
|
||||
* "rc-tivo"
|
||||
* "rc-total-media-in-hand"
|
||||
* "rc-total-media-in-hand-02"
|
||||
* "rc-trekstor"
|
||||
* "rc-tt-1500"
|
||||
* "rc-twinhan-dtv-cab-ci"
|
||||
* "rc-twinhan1027"
|
||||
* "rc-videomate-k100"
|
||||
* "rc-videomate-s350"
|
||||
* "rc-videomate-tv-pvr"
|
||||
* "rc-winfast"
|
||||
* "rc-winfast-usbii-deluxe"
|
||||
* "rc-su3000"
|
|
@ -0,0 +1,17 @@
|
|||
* STMicroelectronics DELTA multi-format video decoder
|
||||
|
||||
Required properties:
|
||||
- compatible: should be "st,st-delta".
|
||||
- clocks: from common clock binding: handle hardware IP needed clocks, the
|
||||
number of clocks may depend on the SoC type.
|
||||
See ../clock/clock-bindings.txt for details.
|
||||
- clock-names: names of the clocks listed in clocks property in the same order.
|
||||
|
||||
Example:
|
||||
delta0 {
|
||||
compatible = "st,st-delta";
|
||||
clock-names = "delta", "delta-st231", "delta-flash-promip";
|
||||
clocks = <&clk_s_c0_flexgen CLK_VID_DMU>,
|
||||
<&clk_s_c0_flexgen CLK_ST231_DMU>,
|
||||
<&clk_s_c0_flexgen CLK_FLASH_PROMIP>;
|
||||
};
|
|
@ -9,7 +9,7 @@ Required properties:
|
|||
- reg : should contain IO map address for IR.
|
||||
|
||||
Optional properties:
|
||||
- linux,rc-map-name : Remote control map name.
|
||||
- linux,rc-map-name: see rc.txt file in the same directory.
|
||||
- resets : phandle + reset specifier pair
|
||||
|
||||
Example:
|
||||
|
|
|
@ -0,0 +1,83 @@
|
|||
Texas Instruments VPIF
|
||||
----------------------
|
||||
|
||||
The TI Video Port InterFace (VPIF) is the primary component for video
|
||||
capture and display on the DA850/AM18x family of TI DaVinci/Sitara
|
||||
SoCs.
|
||||
|
||||
TI Document reference: SPRUH82C, Chapter 35
|
||||
http://www.ti.com/lit/pdf/spruh82
|
||||
|
||||
Required properties:
|
||||
- compatible: must be "ti,da850-vpif"
|
||||
- reg: physical base address and length of the registers set for the device;
|
||||
- interrupts: should contain IRQ line for the VPIF
|
||||
|
||||
Video Capture:
|
||||
|
||||
VPIF has a 16-bit parallel bus input, supporting 2 8-bit channels or a
|
||||
single 16-bit channel. It should contain at least one port child node
|
||||
with child 'endpoint' node. Please refer to the bindings defined in
|
||||
Documentation/devicetree/bindings/media/video-interfaces.txt.
|
||||
|
||||
Example using 2 8-bit input channels, one of which is connected to an
|
||||
I2C-connected TVP5147 decoder:
|
||||
|
||||
vpif: vpif@217000 {
|
||||
compatible = "ti,da850-vpif";
|
||||
reg = <0x217000 0x1000>;
|
||||
interrupts = <92>;
|
||||
|
||||
port {
|
||||
vpif_ch0: endpoint@0 {
|
||||
reg = <0>;
|
||||
bus-width = <8>;
|
||||
remote-endpoint = <&composite>;
|
||||
};
|
||||
|
||||
vpif_ch1: endpoint@1 {
|
||||
reg = <1>;
|
||||
bus-width = <8>;
|
||||
data-shift = <8>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
[ ... ]
|
||||
|
||||
&i2c0 {
|
||||
|
||||
tvp5147@5d {
|
||||
compatible = "ti,tvp5147";
|
||||
reg = <0x5d>;
|
||||
status = "okay";
|
||||
|
||||
port {
|
||||
composite: endpoint {
|
||||
hsync-active = <1>;
|
||||
vsync-active = <1>;
|
||||
pclk-sample = <0>;
|
||||
|
||||
/* VPIF channel 0 (lower 8-bits) */
|
||||
remote-endpoint = <&vpif_ch0>;
|
||||
bus-width = <8>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
Alternatively, an example when the bus is configured as a single
|
||||
16-bit input (e.g. for raw-capture mode):
|
||||
|
||||
vpif: vpif@217000 {
|
||||
compatible = "ti,da850-vpif";
|
||||
reg = <0x217000 0x1000>;
|
||||
interrupts = <92>;
|
||||
|
||||
port {
|
||||
vpif_ch0: endpoint {
|
||||
bus-width = <16>;
|
||||
};
|
||||
};
|
||||
};
|
|
@ -0,0 +1,10 @@
|
|||
Imagination Technologies' Pistachio SoC based Marduk Board
|
||||
==========================================================
|
||||
|
||||
Compatible string must be "img,pistachio-marduk", "img,pistachio"
|
||||
|
||||
Hardware and other related documentation is available at
|
||||
https://docs.creatordev.io/ci40/
|
||||
|
||||
It is also known as Creator Ci40. Marduk is legacy name and will
|
||||
be there for decades.
|
|
@ -17,7 +17,7 @@ Required properties:
|
|||
"core" - Main peripheral bus clock
|
||||
"clkin0" - Parent clock of internal mux
|
||||
"clkin1" - Other parent clock of internal mux
|
||||
The driver has an interal mux clock which switches between clkin0 and clkin1 depending on the
|
||||
The driver has an internal mux clock which switches between clkin0 and clkin1 depending on the
|
||||
clock rate requested by the MMC core.
|
||||
|
||||
Example:
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
* Marvell SD8787 power sequence provider
|
||||
|
||||
Required properties:
|
||||
- compatible: must be "mmc-pwrseq-sd8787".
|
||||
- powerdown-gpios: contains a power down GPIO specifier with the
|
||||
default active state
|
||||
- reset-gpios: contains a reset GPIO specifier with the default
|
||||
active state
|
||||
|
||||
Example:
|
||||
|
||||
wifi_pwrseq: wifi_pwrseq {
|
||||
compatible = "mmc-pwrseq-sd8787";
|
||||
powerdown-gpios = <&twl_gpio 0 GPIO_ACTIVE_LOW>;
|
||||
reset-gpios = <&twl_gpio 1 GPIO_ACTIVE_LOW>;
|
||||
}
|
|
@ -40,6 +40,7 @@ Optional properties:
|
|||
- cap-mmc-hw-reset: eMMC hardware reset is supported
|
||||
- cap-sdio-irq: enable SDIO IRQ signalling on this interface
|
||||
- full-pwr-cycle: full power cycle of the card is supported
|
||||
- mmc-ddr-3_3v: eMMC high-speed DDR mode(3.3V I/O) is supported
|
||||
- mmc-ddr-1_8v: eMMC high-speed DDR mode(1.8V I/O) is supported
|
||||
- mmc-ddr-1_2v: eMMC high-speed DDR mode(1.2V I/O) is supported
|
||||
- mmc-hs200-1_8v: eMMC HS200 mode(1.8V I/O) is supported
|
||||
|
|
|
@ -38,7 +38,7 @@ Optional properties:
|
|||
- bus-width: Number of data lines.
|
||||
See: Documentation/devicetree/bindings/mmc/mmc.txt.
|
||||
|
||||
- max-frequency: Can be 200MHz, 100Mz or 50MHz (default) and used for
|
||||
- max-frequency: Can be 200MHz, 100MHz or 50MHz (default) and used for
|
||||
configuring the CCONFIG3 in the mmcss.
|
||||
See: Documentation/devicetree/bindings/mmc/mmc.txt.
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@ host controllers refer to the mmc[1] bindings.
|
|||
|
||||
Optional properties:
|
||||
- sdhci-caps-mask: The sdhci capabilities register is incorrect. This 64bit
|
||||
property corresponds to the bits in the sdhci capabilty register. If the bit
|
||||
property corresponds to the bits in the sdhci capability register. If the bit
|
||||
is on in the mask then the bit is incorrect in the register and should be
|
||||
turned off, before applying sdhci-caps.
|
||||
- sdhci-caps: The sdhci capabilities register is incorrect. This 64bit
|
||||
|
|
|
@ -13,6 +13,7 @@ Required properties:
|
|||
* "allwinner,sun5i-a13-mmc"
|
||||
* "allwinner,sun7i-a20-mmc"
|
||||
* "allwinner,sun9i-a80-mmc"
|
||||
* "allwinner,sun50i-a64-emmc"
|
||||
* "allwinner,sun50i-a64-mmc"
|
||||
- reg : mmc controller base registers
|
||||
- clocks : a list with 4 phandle + clock specifier pairs
|
||||
|
|
|
@ -16,7 +16,7 @@ Required Properties:
|
|||
each child-node representing a supported slot. There should be atleast one
|
||||
child node representing a card slot. The name of the child node representing
|
||||
the slot is recommended to be slot@n where n is the unique number of the slot
|
||||
connnected to the controller. The following are optional properties which
|
||||
connected to the controller. The following are optional properties which
|
||||
can be included in the slot child node.
|
||||
|
||||
* reg: specifies the physical slot number. The valid values of this
|
||||
|
@ -75,6 +75,17 @@ Optional properties:
|
|||
* card-detect-delay: Delay in milli-seconds before detecting card after card
|
||||
insert event. The default value is 0.
|
||||
|
||||
* data-addr: Override fifo address with value provided by DT. The default FIFO reg
|
||||
offset is assumed as 0x100 (version < 0x240A) and 0x200(version >= 0x240A) by
|
||||
driver. If the controller does not follow this rule, please use this property
|
||||
to set fifo address in device tree.
|
||||
|
||||
* fifo-watermark-aligned: Data done irq is expected if data length is less than
|
||||
watermark in PIO mode. But fifo watermark is requested to be aligned with data
|
||||
length in some SoC so that TX/RX irq can be generated with data done irq. Add this
|
||||
watermark quirk to mark this requirement and force fifo watermark setting
|
||||
accordingly.
|
||||
|
||||
* vmmc-supply: The phandle to the regulator to use for vmmc. If this is
|
||||
specified we'll defer probe until we can find this regulator.
|
||||
|
||||
|
@ -102,6 +113,8 @@ board specific portions as listed below.
|
|||
interrupts = <0 75 0>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
data-addr = <0x200>;
|
||||
fifo-watermark-aligned;
|
||||
resets = <&rst 20>;
|
||||
reset-names = "reset";
|
||||
};
|
||||
|
|
|
@ -25,6 +25,19 @@ Required properties:
|
|||
"renesas,sdhi-r8a7795" - SDHI IP on R8A7795 SoC
|
||||
"renesas,sdhi-r8a7796" - SDHI IP on R8A7796 SoC
|
||||
|
||||
- clocks: Most controllers only have 1 clock source per channel. However, on
|
||||
some variations of this controller, the internal card detection
|
||||
logic that exists in this controller is sectioned off to be run by a
|
||||
separate second clock source to allow the main core clock to be turned
|
||||
off to save power.
|
||||
If 2 clocks are specified by the hardware, you must name them as
|
||||
"core" and "cd". If the controller only has 1 clock, naming is not
|
||||
required.
|
||||
Below is the number clocks for each supported SoC:
|
||||
1: SH73A0, R8A73A4, R8A7740, R8A7778, R8A7779, R8A7790
|
||||
R8A7791, R8A7792, R8A7793, R8A7794, R8A7795, R8A7796
|
||||
2: R7S72100
|
||||
|
||||
Optional properties:
|
||||
- toshiba,mmc-wrprotect-disable: write-protect detection is unavailable
|
||||
- pinctrl-names: should be "default", "state_uhs"
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
* ZTE specific extensions to the Synopsys Designware Mobile Storage
|
||||
Host Controller
|
||||
|
||||
The Synopsys designware mobile storage host controller is used to interface
|
||||
a SoC with storage medium such as eMMC or SD/MMC cards. This file documents
|
||||
differences between the core Synopsys dw mshc controller properties described
|
||||
by synopsys-dw-mshc.txt and the properties used by the ZTE specific
|
||||
extensions to the Synopsys Designware Mobile Storage Host Controller.
|
||||
|
||||
Required Properties:
|
||||
|
||||
* compatible: should be
|
||||
- "zte,zx296718-dw-mshc": for ZX SoCs
|
||||
|
||||
Example:
|
||||
|
||||
mmc1: mmc@1110000 {
|
||||
compatible = "zte,zx296718-dw-mshc";
|
||||
reg = <0x01110000 0x1000>;
|
||||
interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>;
|
||||
fifo-depth = <32>;
|
||||
data-addr = <0x200>;
|
||||
fifo-watermark-aligned;
|
||||
bus-width = <4>;
|
||||
clock-frequency = <50000000>;
|
||||
clocks = <&topcrm SD0_AHB>, <&topcrm SD0_WCLK>;
|
||||
clock-names = "biu", "ciu";
|
||||
num-slots = <1>;
|
||||
max-frequency = <50000000>;
|
||||
cap-sdio-irq;
|
||||
cap-sd-highspeed;
|
||||
status = "disabled";
|
||||
};
|
|
@ -1,4 +1,4 @@
|
|||
Marvell 8897/8997 (sd8897/sd8997/pcie8997) SDIO/PCIE devices
|
||||
Marvell 8787/8897/8997 (sd8787/sd8897/sd8997/pcie8997) SDIO/PCIE devices
|
||||
------
|
||||
|
||||
This node provides properties for controlling the Marvell SDIO/PCIE wireless device.
|
||||
|
@ -8,6 +8,7 @@ connects the device to the system.
|
|||
Required properties:
|
||||
|
||||
- compatible : should be one of the following:
|
||||
* "marvell,sd8787"
|
||||
* "marvell,sd8897"
|
||||
* "marvell,sd8997"
|
||||
* "pci11ab,2b42"
|
||||
|
@ -34,6 +35,9 @@ Optional properties:
|
|||
so that the wifi chip can wakeup host platform under certain condition.
|
||||
during system resume, the irq will be disabled to make sure
|
||||
unnecessary interrupt is not received.
|
||||
- vmmc-supply: a phandle of a regulator, supplying VCC to the card
|
||||
- mmc-pwrseq: phandle to the MMC power sequence node. See "mmc-pwrseq-*"
|
||||
for documentation of MMC power sequence bindings.
|
||||
|
||||
Example:
|
||||
|
||||
|
@ -46,6 +50,7 @@ so that firmware can wakeup host using this device side pin.
|
|||
&mmc3 {
|
||||
status = "okay";
|
||||
vmmc-supply = <&wlan_en_reg>;
|
||||
mmc-pwrseq = <&wifi_pwrseq>;
|
||||
bus-width = <4>;
|
||||
cap-power-off-card;
|
||||
keep-power-in-suspend;
|
||||
|
|
|
@ -23,6 +23,7 @@ Required properties:
|
|||
"allwinner,sun8i-h3-pinctrl"
|
||||
"allwinner,sun8i-h3-r-pinctrl"
|
||||
"allwinner,sun50i-a64-pinctrl"
|
||||
"allwinner,sun50i-h5-r-pinctrl"
|
||||
"nextthing,gr8-pinctrl"
|
||||
|
||||
- reg: Should contain the register physical address and length for the
|
||||
|
|
|
@ -19,7 +19,7 @@ iomuxc: iomuxc@30330000 {
|
|||
reg = <0x30330000 0x10000>;
|
||||
};
|
||||
|
||||
Pheriparials using pads from iomuxc-lpsr support low state retention power
|
||||
Peripherals using pads from iomuxc-lpsr support low state retention power
|
||||
state, under LPSR mode GPIO's state of pads are retain.
|
||||
|
||||
Please refer to fsl,imx-pinctrl.txt in this directory for common binding part
|
||||
|
|
|
@ -0,0 +1,46 @@
|
|||
* Marvell 98dx3236 pinctrl driver for mpp
|
||||
|
||||
Please refer to marvell,mvebu-pinctrl.txt in this directory for common binding
|
||||
part and usage
|
||||
|
||||
Required properties:
|
||||
- compatible: "marvell,98dx3236-pinctrl" or "marvell,98dx4251-pinctrl"
|
||||
- reg: register specifier of MPP registers
|
||||
|
||||
This driver supports all 98dx3236, 98dx3336 and 98dx4251 variants
|
||||
|
||||
name pins functions
|
||||
================================================================================
|
||||
mpp0 0 gpo, spi0(mosi), dev(ad8)
|
||||
mpp1 1 gpio, spi0(miso), dev(ad9)
|
||||
mpp2 2 gpo, spi0(sck), dev(ad10)
|
||||
mpp3 3 gpio, spi0(cs0), dev(ad11)
|
||||
mpp4 4 gpio, spi0(cs1), smi(mdc), dev(cs0)
|
||||
mpp5 5 gpio, pex(rsto), sd0(cmd), dev(bootcs)
|
||||
mpp6 6 gpo, sd0(clk), dev(a2)
|
||||
mpp7 7 gpio, sd0(d0), dev(ale0)
|
||||
mpp8 8 gpio, sd0(d1), dev(ale1)
|
||||
mpp9 9 gpio, sd0(d2), dev(ready0)
|
||||
mpp10 10 gpio, sd0(d3), dev(ad12)
|
||||
mpp11 11 gpio, uart1(rxd), uart0(cts), dev(ad13)
|
||||
mpp12 12 gpo, uart1(txd), uart0(rts), dev(ad14)
|
||||
mpp13 13 gpio, intr(out), dev(ad15)
|
||||
mpp14 14 gpio, i2c0(sck)
|
||||
mpp15 15 gpio, i2c0(sda)
|
||||
mpp16 16 gpo, dev(oe)
|
||||
mpp17 17 gpo, dev(clkout)
|
||||
mpp18 18 gpio, uart1(txd)
|
||||
mpp19 19 gpio, uart1(rxd), dev(rb)
|
||||
mpp20 20 gpo, dev(we0)
|
||||
mpp21 21 gpo, dev(ad0)
|
||||
mpp22 22 gpo, dev(ad1)
|
||||
mpp23 23 gpo, dev(ad2)
|
||||
mpp24 24 gpo, dev(ad3)
|
||||
mpp25 25 gpo, dev(ad4)
|
||||
mpp26 26 gpo, dev(ad5)
|
||||
mpp27 27 gpo, dev(ad6)
|
||||
mpp28 28 gpo, dev(ad7)
|
||||
mpp29 29 gpo, dev(a0)
|
||||
mpp30 30 gpo, dev(a1)
|
||||
mpp31 31 gpio, slv_smi(mdc), smi(mdc), dev(we1)
|
||||
mpp32 32 gpio, slv_smi(mdio), smi(mdio), dev(cs1)
|
|
@ -44,16 +44,16 @@ mpp16 16 gpio, sdio(d2), uart0(cts), uart1(rxd), mii(crs)
|
|||
mpp17 17 gpio, sdio(d3)
|
||||
mpp18 18 gpo, nand(io0)
|
||||
mpp19 19 gpo, nand(io1)
|
||||
mpp20 20 gpio, mii(rxerr)
|
||||
mpp21 21 gpio, audio(spdifi)
|
||||
mpp22 22 gpio, audio(spdifo)
|
||||
mpp23 23 gpio, audio(rmclk)
|
||||
mpp24 24 gpio, audio(bclk)
|
||||
mpp25 25 gpio, audio(sdo)
|
||||
mpp26 26 gpio, audio(lrclk)
|
||||
mpp27 27 gpio, audio(mclk)
|
||||
mpp28 28 gpio, audio(sdi)
|
||||
mpp29 29 gpio, audio(extclk)
|
||||
mpp35 35 gpio, mii(rxerr)
|
||||
mpp36 36 gpio, audio(spdifi)
|
||||
mpp37 37 gpio, audio(spdifo)
|
||||
mpp38 38 gpio, audio(rmclk)
|
||||
mpp39 39 gpio, audio(bclk)
|
||||
mpp40 40 gpio, audio(sdo)
|
||||
mpp41 41 gpio, audio(lrclk)
|
||||
mpp42 42 gpio, audio(mclk)
|
||||
mpp43 43 gpio, audio(sdi)
|
||||
mpp44 44 gpio, audio(extclk)
|
||||
|
||||
* Marvell Kirkwood 88f6190
|
||||
|
||||
|
|
|
@ -1,25 +1,38 @@
|
|||
======================
|
||||
Aspeed Pin Controllers
|
||||
----------------------
|
||||
======================
|
||||
|
||||
The Aspeed SoCs vary in functionality inside a generation but have a common mux
|
||||
device register layout.
|
||||
|
||||
Required properties:
|
||||
- compatible : Should be any one of the following:
|
||||
"aspeed,ast2400-pinctrl"
|
||||
"aspeed,g4-pinctrl"
|
||||
"aspeed,ast2500-pinctrl"
|
||||
"aspeed,g5-pinctrl"
|
||||
Required properties for g4:
|
||||
- compatible : Should be one of the following:
|
||||
"aspeed,ast2400-pinctrl"
|
||||
"aspeed,g4-pinctrl"
|
||||
|
||||
The pin controller node should be a child of a syscon node with the required
|
||||
Required properties for g5:
|
||||
- compatible : Should be one of the following:
|
||||
"aspeed,ast2500-pinctrl"
|
||||
"aspeed,g5-pinctrl"
|
||||
|
||||
- aspeed,external-nodes: A cell of phandles to external controller nodes:
|
||||
0: compatible with "aspeed,ast2500-gfx", "syscon"
|
||||
1: compatible with "aspeed,ast2500-lhc", "syscon"
|
||||
|
||||
The pin controller node should be the child of a syscon node with the required
|
||||
property:
|
||||
- compatible: "syscon", "simple-mfd"
|
||||
|
||||
- compatible : Should be one of the following:
|
||||
"aspeed,ast2400-scu", "syscon", "simple-mfd"
|
||||
"aspeed,g4-scu", "syscon", "simple-mfd"
|
||||
"aspeed,ast2500-scu", "syscon", "simple-mfd"
|
||||
"aspeed,g5-scu", "syscon", "simple-mfd"
|
||||
|
||||
Refer to the the bindings described in
|
||||
Documentation/devicetree/bindings/mfd/syscon.txt
|
||||
|
||||
Subnode Format
|
||||
--------------
|
||||
==============
|
||||
|
||||
The required properties of child nodes are (as defined in pinctrl-bindings):
|
||||
- function
|
||||
|
@ -31,26 +44,43 @@ supported:
|
|||
|
||||
aspeed,ast2400-pinctrl, aspeed,g4-pinctrl:
|
||||
|
||||
ACPI BMCINT DDCCLK DDCDAT FLACK FLBUSY FLWP GPID0 GPIE0 GPIE2 GPIE4 GPIE6 I2C10
|
||||
I2C11 I2C12 I2C13 I2C3 I2C4 I2C5 I2C6 I2C7 I2C8 I2C9 LPCPD LPCPME LPCSMI MDIO1
|
||||
MDIO2 NCTS1 NCTS3 NCTS4 NDCD1 NDCD3 NDCD4 NDSR1 NDSR3 NDTR1 NDTR3 NRI1 NRI3
|
||||
NRI4 NRTS1 NRTS3 PWM0 PWM1 PWM2 PWM3 PWM4 PWM5 PWM6 PWM7 RGMII1 RMII1 ROM16
|
||||
ROM8 ROMCS1 ROMCS2 ROMCS3 ROMCS4 RXD1 RXD3 RXD4 SD1 SGPMI SIOPBI SIOPBO TIMER3
|
||||
TIMER5 TIMER6 TIMER7 TIMER8 TXD1 TXD3 TXD4 UART6 VGAHS VGAVS VPI18 VPI24 VPI30
|
||||
VPO12 VPO24
|
||||
ACPI ADC0 ADC1 ADC10 ADC11 ADC12 ADC13 ADC14 ADC15 ADC2 ADC3 ADC4 ADC5 ADC6
|
||||
ADC7 ADC8 ADC9 BMCINT DDCCLK DDCDAT EXTRST FLACK FLBUSY FLWP GPID GPID0 GPID2
|
||||
GPID4 GPID6 GPIE0 GPIE2 GPIE4 GPIE6 I2C10 I2C11 I2C12 I2C13 I2C14 I2C3 I2C4
|
||||
I2C5 I2C6 I2C7 I2C8 I2C9 LPCPD LPCPME LPCRST LPCSMI MAC1LINK MAC2LINK MDIO1
|
||||
MDIO2 NCTS1 NCTS2 NCTS3 NCTS4 NDCD1 NDCD2 NDCD3 NDCD4 NDSR1 NDSR2 NDSR3 NDSR4
|
||||
NDTR1 NDTR2 NDTR3 NDTR4 NDTS4 NRI1 NRI2 NRI3 NRI4 NRTS1 NRTS2 NRTS3 OSCCLK PWM0
|
||||
PWM1 PWM2 PWM3 PWM4 PWM5 PWM6 PWM7 RGMII1 RGMII2 RMII1 RMII2 ROM16 ROM8 ROMCS1
|
||||
ROMCS2 ROMCS3 ROMCS4 RXD1 RXD2 RXD3 RXD4 SALT1 SALT2 SALT3 SALT4 SD1 SD2 SGPMCK
|
||||
SGPMI SGPMLD SGPMO SGPSCK SGPSI0 SGPSI1 SGPSLD SIOONCTRL SIOPBI SIOPBO SIOPWREQ
|
||||
SIOPWRGD SIOS3 SIOS5 SIOSCI SPI1 SPI1DEBUG SPI1PASSTHRU SPICS1 TIMER3 TIMER4
|
||||
TIMER5 TIMER6 TIMER7 TIMER8 TXD1 TXD2 TXD3 TXD4 UART6 USBCKI VGABIOS_ROM VGAHS
|
||||
VGAVS VPI18 VPI24 VPI30 VPO12 VPO24 WDTRST1 WDTRST2
|
||||
|
||||
aspeed,ast2500-pinctrl, aspeed,g5-pinctrl:
|
||||
|
||||
GPID0 GPID2 GPIE0 I2C10 I2C11 I2C12 I2C13 I2C14 I2C3 I2C4 I2C5 I2C6 I2C7 I2C8
|
||||
I2C9 MAC1LINK MDIO1 MDIO2 OSCCLK PEWAKE PWM0 PWM1 PWM2 PWM3 PWM4 PWM5 PWM6 PWM7
|
||||
RGMII1 RGMII2 RMII1 RMII2 SD1 SPI1 SPI1DEBUG SPI1PASSTHRU TIMER4 TIMER5 TIMER6
|
||||
TIMER7 TIMER8 VGABIOSROM
|
||||
ACPI ADC0 ADC1 ADC10 ADC11 ADC12 ADC13 ADC14 ADC15 ADC2 ADC3 ADC4 ADC5 ADC6
|
||||
ADC7 ADC8 ADC9 BMCINT DDCCLK DDCDAT ESPI FWSPICS1 FWSPICS2 GPID0 GPID2 GPID4
|
||||
GPID6 GPIE0 GPIE2 GPIE4 GPIE6 I2C10 I2C11 I2C12 I2C13 I2C14 I2C3 I2C4 I2C5 I2C6
|
||||
I2C7 I2C8 I2C9 LAD0 LAD1 LAD2 LAD3 LCLK LFRAME LPCHC LPCPD LPCPLUS LPCPME
|
||||
LPCRST LPCSMI LSIRQ MAC1LINK MAC2LINK MDIO1 MDIO2 NCTS1 NCTS2 NCTS3 NCTS4 NDCD1
|
||||
NDCD2 NDCD3 NDCD4 NDSR1 NDSR2 NDSR3 NDSR4 NDTR1 NDTR2 NDTR3 NDTR4 NRI1 NRI2
|
||||
NRI3 NRI4 NRTS1 NRTS2 NRTS3 NRTS4 OSCCLK PEWAKE PNOR PWM0 PWM1 PWM2 PWM3 PWM4
|
||||
PWM5 PWM6 PWM7 RGMII1 RGMII2 RMII1 RMII2 RXD1 RXD2 RXD3 RXD4 SALT1 SALT10
|
||||
SALT11 SALT12 SALT13 SALT14 SALT2 SALT3 SALT4 SALT5 SALT6 SALT7 SALT8 SALT9
|
||||
SCL1 SCL2 SD1 SD2 SDA1 SDA2 SGPS1 SGPS2 SIOONCTRL SIOPBI SIOPBO SIOPWREQ
|
||||
SIOPWRGD SIOS3 SIOS5 SIOSCI SPI1 SPI1CS1 SPI1DEBUG SPI1PASSTHRU SPI2CK SPI2CS0
|
||||
SPI2CS1 SPI2MISO SPI2MOSI TIMER3 TIMER4 TIMER5 TIMER6 TIMER7 TIMER8 TXD1 TXD2
|
||||
TXD3 TXD4 UART6 USBCKI VGABIOSROM VGAHS VGAVS VPI24 VPO WDTRST1 WDTRST2
|
||||
|
||||
Examples
|
||||
========
|
||||
|
||||
Examples:
|
||||
g4 Example
|
||||
----------
|
||||
|
||||
syscon: scu@1e6e2000 {
|
||||
compatible = "syscon", "simple-mfd";
|
||||
compatible = "aspeed,ast2400-scu", "syscon", "simple-mfd";
|
||||
reg = <0x1e6e2000 0x1a8>;
|
||||
|
||||
pinctrl: pinctrl {
|
||||
|
@ -63,5 +93,56 @@ syscon: scu@1e6e2000 {
|
|||
};
|
||||
};
|
||||
|
||||
g5 Example
|
||||
----------
|
||||
|
||||
ahb {
|
||||
apb {
|
||||
syscon: scu@1e6e2000 {
|
||||
compatible = "aspeed,ast2500-scu", "syscon", "simple-mfd";
|
||||
reg = <0x1e6e2000 0x1a8>;
|
||||
|
||||
pinctrl: pinctrl {
|
||||
compatible = "aspeed,g5-pinctrl";
|
||||
aspeed,external-nodes = <&gfx &lhc>;
|
||||
|
||||
pinctrl_i2c3_default: i2c3_default {
|
||||
function = "I2C3";
|
||||
groups = "I2C3";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
gfx: display@1e6e6000 {
|
||||
compatible = "aspeed,ast2500-gfx", "syscon";
|
||||
reg = <0x1e6e6000 0x1000>;
|
||||
};
|
||||
};
|
||||
|
||||
lpc: lpc@1e789000 {
|
||||
compatible = "aspeed,ast2500-lpc", "simple-mfd";
|
||||
reg = <0x1e789000 0x1000>;
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0x0 0x1e789000 0x1000>;
|
||||
|
||||
lpc_host: lpc-host@80 {
|
||||
compatible = "aspeed,ast2500-lpc-host", "simple-mfd", "syscon";
|
||||
reg = <0x80 0x1e0>;
|
||||
reg-io-width = <4>;
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0x0 0x80 0x1e0>;
|
||||
|
||||
lhc: lhc@20 {
|
||||
compatible = "aspeed,ast2500-lhc";
|
||||
reg = <0x20 0x24 0x48 0x8>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
Please refer to pinctrl-bindings.txt in this directory for details of the
|
||||
common pinctrl bindings used by client devices.
|
||||
|
|
|
@ -13,6 +13,7 @@ Required Properties:
|
|||
- "samsung,s3c2450-pinctrl": for S3C2450-compatible pin-controller,
|
||||
- "samsung,s3c64xx-pinctrl": for S3C64xx-compatible pin-controller,
|
||||
- "samsung,s5pv210-pinctrl": for S5PV210-compatible pin-controller,
|
||||
- "samsung,exynos3250-pinctrl": for Exynos3250 compatible pin-controller.
|
||||
- "samsung,exynos4210-pinctrl": for Exynos4210 compatible pin-controller.
|
||||
- "samsung,exynos4x12-pinctrl": for Exynos4x12 compatible pin-controller.
|
||||
- "samsung,exynos5250-pinctrl": for Exynos5250 compatible pin-controller.
|
||||
|
|
|
@ -8,8 +8,9 @@ controllers onto these pads.
|
|||
Pin controller node:
|
||||
Required properies:
|
||||
- compatible: value should be one of the following:
|
||||
(a) "st,stm32f429-pinctrl"
|
||||
(b) "st,stm32f746-pinctrl"
|
||||
"st,stm32f429-pinctrl"
|
||||
"st,stm32f746-pinctrl"
|
||||
"st,stm32h743-pinctrl"
|
||||
- #address-cells: The value of this property must be 1
|
||||
- #size-cells : The value of this property must be 1
|
||||
- ranges : defines mapping between pin controller node (parent) to
|
||||
|
@ -37,8 +38,23 @@ Optional properties:
|
|||
- st,syscfg: Should be phandle/offset pair. The phandle to the syscon node
|
||||
which includes IRQ mux selection register, and the offset of the IRQ mux
|
||||
selection register.
|
||||
- ngpios: Number of gpios in a bank (to use if bank gpio numbers is less
|
||||
than 16).
|
||||
- gpio-ranges: Define a dedicated mapping between a pin-controller and
|
||||
a gpio controller. Format is <&phandle a b c> with:
|
||||
-(phandle): phandle of pin-controller.
|
||||
-(a): gpio base offset in range.
|
||||
-(b): pin base offset in range.
|
||||
-(c): gpio count in range
|
||||
This entry has to be used either if there are holes inside a bank:
|
||||
GPIOB0/B1/B2/B14/B15 (see example 2)
|
||||
or if banks are not contiguous:
|
||||
GPIOA/B/C/E...
|
||||
NOTE: If "gpio-ranges" is used for a gpio controller, all gpio-controller
|
||||
have to use a "gpio-ranges" entry.
|
||||
More details in Documentation/devicetree/bindings/gpio/gpio.txt.
|
||||
|
||||
Example:
|
||||
Example 1:
|
||||
#include <dt-bindings/pinctrl/stm32f429-pinfunc.h>
|
||||
...
|
||||
|
||||
|
@ -60,6 +76,43 @@ Example:
|
|||
pin-functions nodes follow...
|
||||
};
|
||||
|
||||
Example 2:
|
||||
#include <dt-bindings/pinctrl/stm32f429-pinfunc.h>
|
||||
...
|
||||
|
||||
pinctrl: pin-controller {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "st,stm32f429-pinctrl";
|
||||
ranges = <0 0x40020000 0x3000>;
|
||||
pins-are-numbered;
|
||||
|
||||
gpioa: gpio@40020000 {
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
reg = <0x0 0x400>;
|
||||
resets = <&reset_ahb1 0>;
|
||||
st,bank-name = "GPIOA";
|
||||
gpio-ranges = <&pinctrl 0 0 16>;
|
||||
};
|
||||
|
||||
gpiob: gpio@40020400 {
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
reg = <0x0 0x400>;
|
||||
resets = <&reset_ahb1 0>;
|
||||
st,bank-name = "GPIOB";
|
||||
ngpios = 4;
|
||||
gpio-ranges = <&pinctrl 0 16 3>,
|
||||
<&pinctrl 14 30 2>;
|
||||
};
|
||||
|
||||
|
||||
...
|
||||
pin-functions nodes follow...
|
||||
};
|
||||
|
||||
|
||||
Contents of function subnode node:
|
||||
----------------------------------
|
||||
Subnode format
|
||||
|
|
|
@ -0,0 +1,47 @@
|
|||
* Pin configuration for TI IODELAY controller
|
||||
|
||||
TI dra7 based SoCs such as am57xx have a controller for setting the IO delay
|
||||
for each pin. For most part the IO delay values are programmed by the bootloader,
|
||||
but some pins need to be configured dynamically by the kernel such as the
|
||||
MMC pins.
|
||||
|
||||
Required Properties:
|
||||
|
||||
- compatible: Must be "ti,dra7-iodelay"
|
||||
- reg: Base address and length of the memory resource used
|
||||
- #address-cells: Number of address cells
|
||||
- #size-cells: Size of cells
|
||||
- #pinctrl-cells: Number of pinctrl cells, must be 2. See also
|
||||
Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
In the SoC specific dtsi file:
|
||||
|
||||
dra7_iodelay_core: padconf@4844a000 {
|
||||
compatible = "ti,dra7-iodelay";
|
||||
reg = <0x4844a000 0x0d1c>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
#pinctrl-cells = <2>;
|
||||
};
|
||||
|
||||
In board-specific file:
|
||||
|
||||
&dra7_iodelay_core {
|
||||
mmc2_iodelay_3v3_conf: mmc2_iodelay_3v3_conf {
|
||||
pinctrl-pin-array = <
|
||||
0x18c A_DELAY_PS(0) G_DELAY_PS(120) /* CFG_GPMC_A19_IN */
|
||||
0x1a4 A_DELAY_PS(265) G_DELAY_PS(360) /* CFG_GPMC_A20_IN */
|
||||
0x1b0 A_DELAY_PS(0) G_DELAY_PS(120) /* CFG_GPMC_A21_IN */
|
||||
0x1bc A_DELAY_PS(0) G_DELAY_PS(120) /* CFG_GPMC_A22_IN */
|
||||
0x1c8 A_DELAY_PS(287) G_DELAY_PS(420) /* CFG_GPMC_A23_IN */
|
||||
0x1d4 A_DELAY_PS(144) G_DELAY_PS(240) /* CFG_GPMC_A24_IN */
|
||||
0x1e0 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A25_IN */
|
||||
0x1ec A_DELAY_PS(120) G_DELAY_PS(0) /* CFG_GPMC_A26_IN */
|
||||
0x1f8 A_DELAY_PS(120) G_DELAY_PS(180) /* CFG_GPMC_A27_IN */
|
||||
0x360 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_CS1_IN */
|
||||
>;
|
||||
};
|
||||
};
|
|
@ -14,6 +14,7 @@ Optional properties:
|
|||
- anatop-delay-bit-shift: Bit shift for the step time register
|
||||
- anatop-delay-bit-width: Number of bits used in the step time register
|
||||
- vin-supply: The supply for this regulator
|
||||
- anatop-enable-bit: Regulator enable bit offset
|
||||
|
||||
Any property defined as part of the core regulator
|
||||
binding, defined in regulator.txt, can also be used.
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
Motorola CPCAP PMIC voltage regulators
|
||||
------------------------------------
|
||||
|
||||
Requires node properties:
|
||||
- "compatible" value one of:
|
||||
"motorola,cpcap-regulator"
|
||||
"motorola,mapphone-cpcap-regulator"
|
||||
|
||||
Required regulator properties:
|
||||
- "regulator-name"
|
||||
- "regulator-enable-ramp-delay"
|
||||
- "regulator-min-microvolt"
|
||||
- "regulator-max-microvolt"
|
||||
|
||||
Optional regulator properties:
|
||||
- "regulator-boot-on"
|
||||
|
||||
See Documentation/devicetree/bindings/regulator/regulator.txt
|
||||
for more details about the regulator properties.
|
||||
|
||||
Example:
|
||||
|
||||
cpcap_regulator: regulator {
|
||||
compatible = "motorola,cpcap-regulator";
|
||||
|
||||
cpcap_regulators: regulators {
|
||||
sw5: SW5 {
|
||||
regulator-min-microvolt = <5050000>;
|
||||
regulator-max-microvolt = <5050000>;
|
||||
regulator-enable-ramp-delay = <50000>;
|
||||
regulator-boot-on;
|
||||
};
|
||||
};
|
||||
};
|
|
@ -13,7 +13,7 @@ Optional properties:
|
|||
- startup-delay-us : Startup time in microseconds.
|
||||
- enable-active-high : Polarity of GPIO is active high (default is low).
|
||||
- regulator-type : Specifies what is being regulated, must be either
|
||||
"voltage" or "current", defaults to current.
|
||||
"voltage" or "current", defaults to voltage.
|
||||
|
||||
Any property defined as part of the core regulator binding defined in
|
||||
regulator.txt can also be used.
|
||||
|
|
|
@ -22,6 +22,7 @@ Regulator nodes are identified by their compatible:
|
|||
"qcom,rpm-pm8841-regulators"
|
||||
"qcom,rpm-pm8916-regulators"
|
||||
"qcom,rpm-pm8941-regulators"
|
||||
"qcom,rpm-pm8994-regulators"
|
||||
"qcom,rpm-pma8084-regulators"
|
||||
|
||||
- vdd_s1-supply:
|
||||
|
@ -68,6 +69,56 @@ Regulator nodes are identified by their compatible:
|
|||
Definition: reference to regulator supplying the input pin, as
|
||||
described in the data sheet
|
||||
|
||||
- vdd_s1-supply:
|
||||
- vdd_s2-supply:
|
||||
- vdd_s3-supply:
|
||||
- vdd_s4-supply:
|
||||
- vdd_s5-supply:
|
||||
- vdd_s6-supply:
|
||||
- vdd_s7-supply:
|
||||
- vdd_s8-supply:
|
||||
- vdd_s9-supply:
|
||||
- vdd_s10-supply:
|
||||
- vdd_s11-supply:
|
||||
- vdd_s12-supply:
|
||||
- vdd_l1-supply:
|
||||
- vdd_l2_l26_l28-supply:
|
||||
- vdd_l3_l11-supply:
|
||||
- vdd_l4_l27_l31-supply:
|
||||
- vdd_l5_l7-supply:
|
||||
- vdd_l6_l12_l32-supply:
|
||||
- vdd_l5_l7-supply:
|
||||
- vdd_l8_l16_l30-supply:
|
||||
- vdd_l9_l10_l18_l22-supply:
|
||||
- vdd_l9_l10_l18_l22-supply:
|
||||
- vdd_l3_l11-supply:
|
||||
- vdd_l6_l12_l32-supply:
|
||||
- vdd_l13_l19_l23_l24-supply:
|
||||
- vdd_l14_l15-supply:
|
||||
- vdd_l14_l15-supply:
|
||||
- vdd_l8_l16_l30-supply:
|
||||
- vdd_l17_l29-supply:
|
||||
- vdd_l9_l10_l18_l22-supply:
|
||||
- vdd_l13_l19_l23_l24-supply:
|
||||
- vdd_l20_l21-supply:
|
||||
- vdd_l20_l21-supply:
|
||||
- vdd_l9_l10_l18_l22-supply:
|
||||
- vdd_l13_l19_l23_l24-supply:
|
||||
- vdd_l13_l19_l23_l24-supply:
|
||||
- vdd_l25-supply:
|
||||
- vdd_l2_l26_l28-supply:
|
||||
- vdd_l4_l27_l31-supply:
|
||||
- vdd_l2_l26_l28-supply:
|
||||
- vdd_l17_l29-supply:
|
||||
- vdd_l8_l16_l30-supply:
|
||||
- vdd_l4_l27_l31-supply:
|
||||
- vdd_l6_l12_l32-supply:
|
||||
- vdd_lvs1_2-supply:
|
||||
Usage: optional (pm8994 only)
|
||||
Value type: <phandle>
|
||||
Definition: reference to regulator supplying the input pin, as
|
||||
described in the data sheet
|
||||
|
||||
- vdd_s1-supply:
|
||||
- vdd_s2-supply:
|
||||
- vdd_s3-supply:
|
||||
|
@ -113,6 +164,11 @@ pm8941:
|
|||
l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24, lvs1, lvs2,
|
||||
lvs3, 5vs1, 5vs2
|
||||
|
||||
pm8994:
|
||||
s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, l1, l2, l3, l4, l5,
|
||||
l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20,
|
||||
l21, l22, l23, l24, l25, l26, l27, l28, l29, l30, l31, l32, lvs1, lvs2
|
||||
|
||||
pma8084:
|
||||
s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, l1, l2, l3, l4, l5,
|
||||
l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20,
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
Lantiq Synchronous Serial Controller (SSC) SPI master driver
|
||||
|
||||
Required properties:
|
||||
- compatible: "lantiq,ase-spi", "lantiq,falcon-spi", "lantiq,xrx100-spi"
|
||||
- #address-cells: see spi-bus.txt
|
||||
- #size-cells: see spi-bus.txt
|
||||
- reg: address and length of the spi master registers
|
||||
- interrupts: should contain the "spi_rx", "spi_tx" and "spi_err" interrupt.
|
||||
|
||||
|
||||
Optional properties:
|
||||
- clocks: spi clock phandle
|
||||
- num-cs: see spi-bus.txt, set to 8 if unset
|
||||
- base-cs: the number of the first chip select, set to 1 if unset.
|
||||
|
||||
Example:
|
||||
|
||||
|
||||
spi: spi@E100800 {
|
||||
compatible = "lantiq,xrx200-spi", "lantiq,xrx100-spi";
|
||||
reg = <0xE100800 0x100>;
|
||||
interrupt-parent = <&icu0>;
|
||||
interrupts = <22 23 24>;
|
||||
interrupt-names = "spi_rx", "spi_tx", "spi_err";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
num-cs = <6>;
|
||||
base-cs = <1>;
|
||||
};
|
|
@ -31,6 +31,10 @@ Optional Properties:
|
|||
- rx-sample-delay-ns: nanoseconds to delay after the SCLK edge before sampling
|
||||
Rx data (may need to be fine tuned for high capacitance lines).
|
||||
No delay (0) by default.
|
||||
- pinctrl-names: Names for the pin configuration(s); may be "default" or
|
||||
"sleep", where the "sleep" configuration may describe the state
|
||||
the pins should be in during system suspend. See also
|
||||
pinctrl/pinctrl-bindings.txt.
|
||||
|
||||
|
||||
Example:
|
||||
|
@ -46,4 +50,7 @@ Example:
|
|||
interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&cru SCLK_SPI0>, <&cru PCLK_SPI0>;
|
||||
clock-names = "spiclk", "apb_pclk";
|
||||
pinctrl-0 = <&spi1_pins>;
|
||||
pinctrl-1 = <&spi1_sleep>;
|
||||
pinctrl-names = "default", "sleep";
|
||||
};
|
||||
|
|
|
@ -146,10 +146,11 @@ a pull-up resistor is needed on the outgoing rail to complete the circuit, and
|
|||
in the second case, a pull-down resistor is needed on the rail.
|
||||
|
||||
Hardware that supports open drain or open source or both, can implement a
|
||||
special callback in the gpio_chip: .set_single_ended() that takes an enum flag
|
||||
telling whether to configure the line as open drain, open source or push-pull.
|
||||
This will happen in response to the GPIO_OPEN_DRAIN or GPIO_OPEN_SOURCE flag
|
||||
set in the machine file, or coming from other hardware descriptions.
|
||||
special callback in the gpio_chip: .set_config() that takes a generic
|
||||
pinconf packed value telling whether to configure the line as open drain,
|
||||
open source or push-pull. This will happen in response to the
|
||||
GPIO_OPEN_DRAIN or GPIO_OPEN_SOURCE flag set in the machine file, or coming
|
||||
from other hardware descriptions.
|
||||
|
||||
If this state can not be configured in hardware, i.e. if the GPIO hardware does
|
||||
not support open drain/open source in hardware, the GPIO library will instead
|
||||
|
|
|
@ -65,6 +65,21 @@ LED subsystem core exposes following API for setting brightness:
|
|||
blinking, returns -EBUSY if software blink fallback is enabled.
|
||||
|
||||
|
||||
LED registration API
|
||||
====================
|
||||
|
||||
A driver wanting to register a LED classdev for use by other drivers /
|
||||
userspace needs to allocate and fill a led_classdev struct and then call
|
||||
[devm_]led_classdev_register. If the non devm version is used the driver
|
||||
must call led_classdev_unregister from its remove function before
|
||||
free-ing the led_classdev struct.
|
||||
|
||||
If the driver can detect hardware initiated brightness changes and thus
|
||||
wants to have a brightness_hw_changed attribute then the LED_BRIGHT_HW_CHANGED
|
||||
flag must be set in flags before registering. Calling
|
||||
led_classdev_notify_brightness_hw_changed on a classdev not registered with
|
||||
the LED_BRIGHT_HW_CHANGED flag is a bug and will trigger a WARN_ON.
|
||||
|
||||
Hardware accelerated blink of LEDs
|
||||
==================================
|
||||
|
||||
|
|
|
@ -162,13 +162,13 @@ framework provides a depth-first graph traversal API for that purpose.
|
|||
currently defined as 16.
|
||||
|
||||
Drivers initiate a graph traversal by calling
|
||||
:c:func:`media_entity_graph_walk_start()`
|
||||
:c:func:`media_graph_walk_start()`
|
||||
|
||||
The graph structure, provided by the caller, is initialized to start graph
|
||||
traversal at the given entity.
|
||||
|
||||
Drivers can then retrieve the next entity by calling
|
||||
:c:func:`media_entity_graph_walk_next()`
|
||||
:c:func:`media_graph_walk_next()`
|
||||
|
||||
When the graph traversal is complete the function will return ``NULL``.
|
||||
|
||||
|
@ -206,7 +206,7 @@ Pipelines and media streams
|
|||
|
||||
When starting streaming, drivers must notify all entities in the pipeline to
|
||||
prevent link states from being modified during streaming by calling
|
||||
:c:func:`media_entity_pipeline_start()`.
|
||||
:c:func:`media_pipeline_start()`.
|
||||
|
||||
The function will mark all entities connected to the given entity through
|
||||
enabled links, either directly or indirectly, as streaming.
|
||||
|
@ -218,17 +218,17 @@ in higher-level pipeline structures and can then access the
|
|||
pipeline through the struct :c:type:`media_entity`
|
||||
pipe field.
|
||||
|
||||
Calls to :c:func:`media_entity_pipeline_start()` can be nested.
|
||||
Calls to :c:func:`media_pipeline_start()` can be nested.
|
||||
The pipeline pointer must be identical for all nested calls to the function.
|
||||
|
||||
:c:func:`media_entity_pipeline_start()` may return an error. In that case,
|
||||
:c:func:`media_pipeline_start()` may return an error. In that case,
|
||||
it will clean up any of the changes it did by itself.
|
||||
|
||||
When stopping the stream, drivers must notify the entities with
|
||||
:c:func:`media_entity_pipeline_stop()`.
|
||||
:c:func:`media_pipeline_stop()`.
|
||||
|
||||
If multiple calls to :c:func:`media_entity_pipeline_start()` have been
|
||||
made the same number of :c:func:`media_entity_pipeline_stop()` calls
|
||||
If multiple calls to :c:func:`media_pipeline_start()` have been
|
||||
made the same number of :c:func:`media_pipeline_stop()` calls
|
||||
are required to stop streaming.
|
||||
The :c:type:`media_entity`.\ ``pipe`` field is reset to ``NULL`` on the last
|
||||
nested stop call.
|
||||
|
@ -245,7 +245,7 @@ operation must be done with the media_device graph_mutex held.
|
|||
Link validation
|
||||
^^^^^^^^^^^^^^^
|
||||
|
||||
Link validation is performed by :c:func:`media_entity_pipeline_start()`
|
||||
Link validation is performed by :c:func:`media_pipeline_start()`
|
||||
for any entity which has sink pads in the pipeline. The
|
||||
:c:type:`media_entity`.\ ``link_validate()`` callback is used for that
|
||||
purpose. In ``link_validate()`` callback, entity driver should check
|
||||
|
|
|
@ -94,9 +94,17 @@ Generic Error Codes
|
|||
- Permission denied. Can be returned if the device needs write
|
||||
permission, or some special capabilities is needed (e. g. root)
|
||||
|
||||
- .. row 11
|
||||
|
||||
- ``EIO``
|
||||
|
||||
- I/O error. Typically used when there are problems communicating with
|
||||
a hardware device. This could indicate broken or flaky hardware.
|
||||
It's a 'Something is wrong, I give up!' type of error.
|
||||
|
||||
.. note::
|
||||
|
||||
#. This list is not exaustive; ioctls may return other error codes.
|
||||
#. This list is not exhaustive; ioctls may return other error codes.
|
||||
Since errors may have side effects such as a driver reset,
|
||||
applications should abort on unexpected errors, or otherwise
|
||||
assume that the device is in a bad state.
|
||||
|
|
|
@ -92,15 +92,16 @@ This value may be reset to 0 if the current protocol is altered.
|
|||
Reading this file returns a list of available protocols to use for the
|
||||
wakeup filter, something like:
|
||||
|
||||
``rc5 rc6 nec jvc [sony]``
|
||||
``rc-5 nec nec-x rc-6-0 rc-6-6a-24 [rc-6-6a-32] rc-6-mce``
|
||||
|
||||
Note that protocol variants are listed, so "nec", "sony", "rc-5", "rc-6"
|
||||
have their different bit length encodings listed if available.
|
||||
|
||||
Note that all protocol variants are listed.
|
||||
|
||||
The enabled wakeup protocol is shown in [] brackets.
|
||||
|
||||
Writing "+proto" will add a protocol to the list of enabled wakeup
|
||||
protocols.
|
||||
|
||||
Writing "-proto" will remove a protocol from the list of enabled wakeup
|
||||
protocols.
|
||||
Only one protocol can be selected at a time.
|
||||
|
||||
Writing "proto" will use "proto" for wakeup events.
|
||||
|
||||
|
|
|
@ -79,9 +79,7 @@ int __init foo_probe(void)
|
|||
{
|
||||
struct pinctrl_dev *pctl;
|
||||
|
||||
pctl = pinctrl_register(&foo_desc, <PARENT>, NULL);
|
||||
if (!pctl)
|
||||
pr_err("could not register foo pin driver\n");
|
||||
return pinctrl_register_and_init(&foo_desc, <PARENT>, NULL, &pctl);
|
||||
}
|
||||
|
||||
To enable the pinctrl subsystem and the subgroups for PINMUX and PINCONF and
|
||||
|
|
|
@ -79,22 +79,6 @@ dependent subsystems such as cpufreq are left to the discretion of the SoC
|
|||
specific framework which uses the OPP library. Similar care needs to be taken
|
||||
care to refresh the cpufreq table in cases of these operations.
|
||||
|
||||
WARNING on OPP List locking mechanism:
|
||||
-------------------------------------------------
|
||||
OPP library uses RCU for exclusivity. RCU allows the query functions to operate
|
||||
in multiple contexts and this synchronization mechanism is optimal for a read
|
||||
intensive operations on data structure as the OPP library caters to.
|
||||
|
||||
To ensure that the data retrieved are sane, the users such as SoC framework
|
||||
should ensure that the section of code operating on OPP queries are locked
|
||||
using RCU read locks. The opp_find_freq_{exact,ceil,floor},
|
||||
opp_get_{voltage, freq, opp_count} fall into this category.
|
||||
|
||||
opp_{add,enable,disable} are updaters which use mutex and implement it's own
|
||||
RCU locking mechanisms. These functions should *NOT* be called under RCU locks
|
||||
and other contexts that prevent blocking functions in RCU or mutex operations
|
||||
from working.
|
||||
|
||||
2. Initial OPP List Registration
|
||||
================================
|
||||
The SoC implementation calls dev_pm_opp_add function iteratively to add OPPs per
|
||||
|
@ -137,15 +121,18 @@ functions return the matching pointer representing the opp if a match is
|
|||
found, else returns error. These errors are expected to be handled by standard
|
||||
error checks such as IS_ERR() and appropriate actions taken by the caller.
|
||||
|
||||
Callers of these functions shall call dev_pm_opp_put() after they have used the
|
||||
OPP. Otherwise the memory for the OPP will never get freed and result in
|
||||
memleak.
|
||||
|
||||
dev_pm_opp_find_freq_exact - Search for an OPP based on an *exact* frequency and
|
||||
availability. This function is especially useful to enable an OPP which
|
||||
is not available by default.
|
||||
Example: In a case when SoC framework detects a situation where a
|
||||
higher frequency could be made available, it can use this function to
|
||||
find the OPP prior to call the dev_pm_opp_enable to actually make it available.
|
||||
rcu_read_lock();
|
||||
opp = dev_pm_opp_find_freq_exact(dev, 1000000000, false);
|
||||
rcu_read_unlock();
|
||||
dev_pm_opp_put(opp);
|
||||
/* dont operate on the pointer.. just do a sanity check.. */
|
||||
if (IS_ERR(opp)) {
|
||||
pr_err("frequency not disabled!\n");
|
||||
|
@ -163,9 +150,8 @@ dev_pm_opp_find_freq_floor - Search for an available OPP which is *at most* the
|
|||
frequency.
|
||||
Example: To find the highest opp for a device:
|
||||
freq = ULONG_MAX;
|
||||
rcu_read_lock();
|
||||
dev_pm_opp_find_freq_floor(dev, &freq);
|
||||
rcu_read_unlock();
|
||||
opp = dev_pm_opp_find_freq_floor(dev, &freq);
|
||||
dev_pm_opp_put(opp);
|
||||
|
||||
dev_pm_opp_find_freq_ceil - Search for an available OPP which is *at least* the
|
||||
provided frequency. This function is useful while searching for a
|
||||
|
@ -173,17 +159,15 @@ dev_pm_opp_find_freq_ceil - Search for an available OPP which is *at least* the
|
|||
frequency.
|
||||
Example 1: To find the lowest opp for a device:
|
||||
freq = 0;
|
||||
rcu_read_lock();
|
||||
dev_pm_opp_find_freq_ceil(dev, &freq);
|
||||
rcu_read_unlock();
|
||||
opp = dev_pm_opp_find_freq_ceil(dev, &freq);
|
||||
dev_pm_opp_put(opp);
|
||||
Example 2: A simplified implementation of a SoC cpufreq_driver->target:
|
||||
soc_cpufreq_target(..)
|
||||
{
|
||||
/* Do stuff like policy checks etc. */
|
||||
/* Find the best frequency match for the req */
|
||||
rcu_read_lock();
|
||||
opp = dev_pm_opp_find_freq_ceil(dev, &freq);
|
||||
rcu_read_unlock();
|
||||
dev_pm_opp_put(opp);
|
||||
if (!IS_ERR(opp))
|
||||
soc_switch_to_freq_voltage(freq);
|
||||
else
|
||||
|
@ -208,9 +192,8 @@ dev_pm_opp_enable - Make a OPP available for operation.
|
|||
implementation might choose to do something as follows:
|
||||
if (cur_temp < temp_low_thresh) {
|
||||
/* Enable 1GHz if it was disabled */
|
||||
rcu_read_lock();
|
||||
opp = dev_pm_opp_find_freq_exact(dev, 1000000000, false);
|
||||
rcu_read_unlock();
|
||||
dev_pm_opp_put(opp);
|
||||
/* just error check */
|
||||
if (!IS_ERR(opp))
|
||||
ret = dev_pm_opp_enable(dev, 1000000000);
|
||||
|
@ -224,9 +207,8 @@ dev_pm_opp_disable - Make an OPP to be not available for operation
|
|||
choose to do something as follows:
|
||||
if (cur_temp > temp_high_thresh) {
|
||||
/* Disable 1GHz if it was enabled */
|
||||
rcu_read_lock();
|
||||
opp = dev_pm_opp_find_freq_exact(dev, 1000000000, true);
|
||||
rcu_read_unlock();
|
||||
dev_pm_opp_put(opp);
|
||||
/* just error check */
|
||||
if (!IS_ERR(opp))
|
||||
ret = dev_pm_opp_disable(dev, 1000000000);
|
||||
|
@ -249,10 +231,9 @@ dev_pm_opp_get_voltage - Retrieve the voltage represented by the opp pointer.
|
|||
soc_switch_to_freq_voltage(freq)
|
||||
{
|
||||
/* do things */
|
||||
rcu_read_lock();
|
||||
opp = dev_pm_opp_find_freq_ceil(dev, &freq);
|
||||
v = dev_pm_opp_get_voltage(opp);
|
||||
rcu_read_unlock();
|
||||
dev_pm_opp_put(opp);
|
||||
if (v)
|
||||
regulator_set_voltage(.., v);
|
||||
/* do other things */
|
||||
|
@ -266,12 +247,12 @@ dev_pm_opp_get_freq - Retrieve the freq represented by the opp pointer.
|
|||
{
|
||||
/* do things.. */
|
||||
max_freq = ULONG_MAX;
|
||||
rcu_read_lock();
|
||||
max_opp = dev_pm_opp_find_freq_floor(dev,&max_freq);
|
||||
requested_opp = dev_pm_opp_find_freq_ceil(dev,&freq);
|
||||
if (!IS_ERR(max_opp) && !IS_ERR(requested_opp))
|
||||
r = soc_test_validity(max_opp, requested_opp);
|
||||
rcu_read_unlock();
|
||||
dev_pm_opp_put(max_opp);
|
||||
dev_pm_opp_put(requested_opp);
|
||||
/* do other things */
|
||||
}
|
||||
soc_test_validity(..)
|
||||
|
@ -289,7 +270,6 @@ dev_pm_opp_get_opp_count - Retrieve the number of available opps for a device
|
|||
soc_notify_coproc_available_frequencies()
|
||||
{
|
||||
/* Do things */
|
||||
rcu_read_lock();
|
||||
num_available = dev_pm_opp_get_opp_count(dev);
|
||||
speeds = kzalloc(sizeof(u32) * num_available, GFP_KERNEL);
|
||||
/* populate the table in increasing order */
|
||||
|
@ -298,8 +278,8 @@ dev_pm_opp_get_opp_count - Retrieve the number of available opps for a device
|
|||
speeds[i] = freq;
|
||||
freq++;
|
||||
i++;
|
||||
dev_pm_opp_put(opp);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
soc_notify_coproc(AVAILABLE_FREQs, speeds, num_available);
|
||||
/* Do other things */
|
||||
|
|
|
@ -25,7 +25,7 @@ to be used subsequently to change to the one represented by that string.
|
|||
Consequently, there are two ways to cause the system to go into the
|
||||
Suspend-To-Idle sleep state. The first one is to write "freeze" directly to
|
||||
/sys/power/state. The second one is to write "s2idle" to /sys/power/mem_sleep
|
||||
and then to wrtie "mem" to /sys/power/state. Similarly, there are two ways
|
||||
and then to write "mem" to /sys/power/state. Similarly, there are two ways
|
||||
to cause the system to go into the Power-On Suspend sleep state (the strings to
|
||||
write to the control files in that case are "standby" or "shallow" and "mem",
|
||||
respectively) if that state is supported by the platform. In turn, there is
|
||||
|
|
|
@ -22,6 +22,13 @@ system, building their checks on top of the defined capability hooks.
|
|||
For more details on capabilities, see capabilities(7) in the Linux
|
||||
man-pages project.
|
||||
|
||||
A list of the active security modules can be found by reading
|
||||
/sys/kernel/security/lsm. This is a comma separated list, and
|
||||
will always include the capability module. The list reflects the
|
||||
order in which checks are made. The capability module will always
|
||||
be first, followed by any "minor" modules (e.g. Yama) and then
|
||||
the one "major" module (e.g. SELinux) if there is one configured.
|
||||
|
||||
Based on https://lkml.org/lkml/2007/10/26/215,
|
||||
a new LSM is accepted into the kernel when its intent (a description of
|
||||
what it tries to protect against and in what cases one would expect to
|
||||
|
|
|
@ -1,105 +0,0 @@
|
|||
Cirrus EP93xx SPI controller driver HOWTO
|
||||
=========================================
|
||||
|
||||
ep93xx_spi driver brings SPI master support for EP93xx SPI controller. Chip
|
||||
selects are implemented with GPIO lines.
|
||||
|
||||
NOTE: If possible, don't use SFRMOUT (SFRM1) signal as a chip select. It will
|
||||
not work correctly (it cannot be controlled by software). Use GPIO lines
|
||||
instead.
|
||||
|
||||
Sample configuration
|
||||
====================
|
||||
|
||||
Typically driver configuration is done in platform board files (the files under
|
||||
arch/arm/mach-ep93xx/*.c). In this example we configure MMC over SPI through
|
||||
this driver on TS-7260 board. You can adapt the code to suit your needs.
|
||||
|
||||
This example uses EGPIO9 as SD/MMC card chip select (this is wired in DIO1
|
||||
header on the board).
|
||||
|
||||
You need to select CONFIG_MMC_SPI to use mmc_spi driver.
|
||||
|
||||
arch/arm/mach-ep93xx/ts72xx.c:
|
||||
|
||||
...
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/spi/spi.h>
|
||||
|
||||
#include <linux/platform_data/spi-ep93xx.h>
|
||||
|
||||
/* this is our GPIO line used for chip select */
|
||||
#define MMC_CHIP_SELECT_GPIO EP93XX_GPIO_LINE_EGPIO9
|
||||
|
||||
static int ts72xx_mmc_spi_setup(struct spi_device *spi)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = gpio_request(MMC_CHIP_SELECT_GPIO, spi->modalias);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
gpio_direction_output(MMC_CHIP_SELECT_GPIO, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ts72xx_mmc_spi_cleanup(struct spi_device *spi)
|
||||
{
|
||||
gpio_set_value(MMC_CHIP_SELECT_GPIO, 1);
|
||||
gpio_direction_input(MMC_CHIP_SELECT_GPIO);
|
||||
gpio_free(MMC_CHIP_SELECT_GPIO);
|
||||
}
|
||||
|
||||
static void ts72xx_mmc_spi_cs_control(struct spi_device *spi, int value)
|
||||
{
|
||||
gpio_set_value(MMC_CHIP_SELECT_GPIO, value);
|
||||
}
|
||||
|
||||
static struct ep93xx_spi_chip_ops ts72xx_mmc_spi_ops = {
|
||||
.setup = ts72xx_mmc_spi_setup,
|
||||
.cleanup = ts72xx_mmc_spi_cleanup,
|
||||
.cs_control = ts72xx_mmc_spi_cs_control,
|
||||
};
|
||||
|
||||
static struct spi_board_info ts72xx_spi_devices[] __initdata = {
|
||||
{
|
||||
.modalias = "mmc_spi",
|
||||
.controller_data = &ts72xx_mmc_spi_ops,
|
||||
/*
|
||||
* We use 10 MHz even though the maximum is 7.4 MHz. The driver
|
||||
* will limit it automatically to max. frequency.
|
||||
*/
|
||||
.max_speed_hz = 10 * 1000 * 1000,
|
||||
.bus_num = 0,
|
||||
.chip_select = 0,
|
||||
.mode = SPI_MODE_0,
|
||||
},
|
||||
};
|
||||
|
||||
static struct ep93xx_spi_info ts72xx_spi_info = {
|
||||
.num_chipselect = ARRAY_SIZE(ts72xx_spi_devices),
|
||||
};
|
||||
|
||||
static void __init ts72xx_init_machine(void)
|
||||
{
|
||||
...
|
||||
ep93xx_register_spi(&ts72xx_spi_info, ts72xx_spi_devices,
|
||||
ARRAY_SIZE(ts72xx_spi_devices));
|
||||
}
|
||||
|
||||
The driver can use DMA for the transfers also. In this case ts72xx_spi_info
|
||||
becomes:
|
||||
|
||||
static struct ep93xx_spi_info ts72xx_spi_info = {
|
||||
.num_chipselect = ARRAY_SIZE(ts72xx_spi_devices),
|
||||
.use_dma = true;
|
||||
};
|
||||
|
||||
Note that CONFIG_EP93XX_DMA should be enabled as well.
|
||||
|
||||
Thanks to
|
||||
=========
|
||||
Martin Guy, H. Hartley Sweeten and others who helped me during development of
|
||||
the driver. Simplemachines.it donated me a Sim.One board which I used testing
|
||||
the driver on EP9307.
|
85
MAINTAINERS
85
MAINTAINERS
|
@ -2423,6 +2423,14 @@ W: https://linuxtv.org
|
|||
S: Supported
|
||||
F: drivers/media/platform/sti/bdisp
|
||||
|
||||
DELTA ST MEDIA DRIVER
|
||||
M: Hugues Fruchet <hugues.fruchet@st.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
W: https://linuxtv.org
|
||||
S: Supported
|
||||
F: drivers/media/platform/sti/delta
|
||||
|
||||
BEFS FILE SYSTEM
|
||||
M: Luis de Bethencourt <luisbg@osg.samsung.com>
|
||||
M: Salah Triki <salah.triki@gmail.com>
|
||||
|
@ -2692,6 +2700,13 @@ F: drivers/irqchip/irq-brcmstb*
|
|||
F: include/linux/bcm963xx_nvram.h
|
||||
F: include/linux/bcm963xx_tag.h
|
||||
|
||||
BROADCOM BMIPS CPUFREQ DRIVER
|
||||
M: Markus Mayer <mmayer@broadcom.com>
|
||||
M: bcm-kernel-feedback-list@broadcom.com
|
||||
L: linux-pm@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/cpufreq/bmips-cpufreq.c
|
||||
|
||||
BROADCOM TG3 GIGABIT ETHERNET DRIVER
|
||||
M: Siva Reddy Kallam <siva.kallam@broadcom.com>
|
||||
M: Prashant Sreedharan <prashant@broadcom.com>
|
||||
|
@ -5274,7 +5289,7 @@ M: Jaegeuk Kim <jaegeuk@kernel.org>
|
|||
L: linux-fsdevel@vger.kernel.org
|
||||
S: Supported
|
||||
F: fs/crypto/
|
||||
F: include/linux/fscrypto.h
|
||||
F: include/linux/fscrypt*.h
|
||||
|
||||
F2FS FILE SYSTEM
|
||||
M: Jaegeuk Kim <jaegeuk@kernel.org>
|
||||
|
@ -5731,16 +5746,6 @@ L: linux-parisc@vger.kernel.org
|
|||
S: Maintained
|
||||
F: sound/parisc/harmony.*
|
||||
|
||||
HD29L2 MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: https://linuxtv.org
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/anttip/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/dvb-frontends/hd29l2*
|
||||
|
||||
HEWLETT PACKARD ENTERPRISE ILO NMI WATCHDOG DRIVER
|
||||
M: Jimmy Vance <jimmy.vance@hpe.com>
|
||||
S: Supported
|
||||
|
@ -7700,6 +7705,12 @@ W: http://www.kernel.org/doc/man-pages
|
|||
L: linux-man@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
MARDUK (CREATOR CI40) DEVICE TREE SUPPORT
|
||||
M: Rahul Bedarkar <rahul.bedarkar@imgtec.com>
|
||||
L: linux-mips@linux-mips.org
|
||||
S: Maintained
|
||||
F: arch/mips/boot/dts/img/pistachio_marduk.dts
|
||||
|
||||
MARVELL 88E6XXX ETHERNET SWITCH FABRIC DRIVER
|
||||
M: Andrew Lunn <andrew@lunn.ch>
|
||||
M: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
|
||||
|
@ -8613,10 +8624,10 @@ S: Maintained
|
|||
F: drivers/net/ethernet/netronome/
|
||||
|
||||
NETWORK BLOCK DEVICE (NBD)
|
||||
M: Markus Pargmann <mpa@pengutronix.de>
|
||||
M: Josef Bacik <jbacik@fb.com>
|
||||
S: Maintained
|
||||
L: linux-block@vger.kernel.org
|
||||
L: nbd-general@lists.sourceforge.net
|
||||
T: git git://git.pengutronix.de/git/mpa/linux-nbd.git
|
||||
F: Documentation/blockdev/nbd.txt
|
||||
F: drivers/block/nbd.c
|
||||
F: include/uapi/linux/nbd.h
|
||||
|
@ -8812,6 +8823,22 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/lftan/nios2.git
|
|||
S: Maintained
|
||||
F: arch/nios2/
|
||||
|
||||
NOKIA N900 CAMERA SUPPORT (ET8EK8 SENSOR, AD5820 FOCUS)
|
||||
M: Pavel Machek <pavel@ucw.cz>
|
||||
M: Sakari Ailus <sakari.ailus@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/media/i2c/et8ek8
|
||||
F: drivers/media/i2c/ad5820.c
|
||||
|
||||
NOKIA N900 CAMERA SUPPORT (ET8EK8 SENSOR, AD5820 FOCUS)
|
||||
M: Pavel Machek <pavel@ucw.cz>
|
||||
M: Sakari Ailus <sakari.ailus@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/media/i2c/et8ek8
|
||||
F: drivers/media/i2c/ad5820.c
|
||||
|
||||
NOKIA N900 POWER SUPPLY DRIVERS
|
||||
R: Pali Rohár <pali.rohar@gmail.com>
|
||||
F: include/linux/power/bq2415x_charger.h
|
||||
|
@ -9788,7 +9815,7 @@ L: linux-mips@linux-mips.org
|
|||
S: Maintained
|
||||
F: arch/mips/pistachio/
|
||||
F: arch/mips/include/asm/mach-pistachio/
|
||||
F: arch/mips/boot/dts/pistachio/
|
||||
F: arch/mips/boot/dts/img/pistachio*
|
||||
F: arch/mips/configs/pistachio*_defconfig
|
||||
|
||||
PKTCDVD DRIVER
|
||||
|
@ -10887,7 +10914,6 @@ SYNOPSYS DESIGNWARE MMC/SD/SDIO DRIVER
|
|||
M: Jaehoon Chung <jh80.chung@samsung.com>
|
||||
L: linux-mmc@vger.kernel.org
|
||||
S: Maintained
|
||||
F: include/linux/mmc/dw_mmc.h
|
||||
F: drivers/mmc/host/dw_mmc*
|
||||
|
||||
SYSTEM TRACE MODULE CLASS
|
||||
|
@ -11090,6 +11116,17 @@ L: linux-mmc@vger.kernel.org
|
|||
S: Maintained
|
||||
F: drivers/mmc/host/sdhci-spear.c
|
||||
|
||||
SECURE ENCRYPTING DEVICE (SED) OPAL DRIVER
|
||||
M: Scott Bauer <scott.bauer@intel.com>
|
||||
M: Jonathan Derrick <jonathan.derrick@intel.com>
|
||||
M: Rafael Antognolli <rafael.antognolli@intel.com>
|
||||
L: linux-block@vger.kernel.org
|
||||
S: Supported
|
||||
F: block/sed*
|
||||
F: block/opal_proto.h
|
||||
F: include/linux/sed*
|
||||
F: include/uapi/linux/sed*
|
||||
|
||||
SECURITY SUBSYSTEM
|
||||
M: James Morris <james.l.morris@oracle.com>
|
||||
M: "Serge E. Hallyn" <serge@hallyn.com>
|
||||
|
@ -13637,6 +13674,24 @@ L: zd1211-devs@lists.sourceforge.net (subscribers-only)
|
|||
S: Maintained
|
||||
F: drivers/net/wireless/zydas/zd1211rw/
|
||||
|
||||
ZD1301_DEMOD MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: https://linuxtv.org/
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: https://patchwork.linuxtv.org/project/linux-media/list/
|
||||
S: Maintained
|
||||
F: drivers/media/dvb-frontends/zd1301_demod*
|
||||
|
||||
ZD1301 MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: https://linuxtv.org/
|
||||
W: http://palosaari.fi/linux/
|
||||
Q: https://patchwork.linuxtv.org/project/linux-media/list/
|
||||
S: Maintained
|
||||
F: drivers/media/usb/dvb-usb-v2/zd1301*
|
||||
|
||||
ZPOOL COMPRESSED PAGE STORAGE API
|
||||
M: Dan Streetman <ddstreet@ieee.org>
|
||||
L: linux-mm@kvack.org
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
#include <linux/sched.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/extable.h>
|
||||
#include <linux/kallsyms.h>
|
||||
#include <linux/ratelimit.h>
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
#include <linux/mman.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/extable.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
extern void die_if_kernel(char *,struct pt_regs *,long, unsigned long *);
|
||||
|
|
|
@ -8,7 +8,8 @@
|
|||
* Borrowed heavily from MIPS
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/extable.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
int fixup_exception(struct pt_regs *regs)
|
||||
|
|
|
@ -1166,8 +1166,10 @@
|
|||
};
|
||||
|
||||
vdoa@021e4000 {
|
||||
compatible = "fsl,imx6q-vdoa";
|
||||
reg = <0x021e4000 0x4000>;
|
||||
interrupts = <0 18 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clks IMX6QDL_CLK_VDOA>;
|
||||
};
|
||||
|
||||
uart2: serial@021e8000 {
|
||||
|
|
|
@ -1003,5 +1003,15 @@
|
|||
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
delta0 {
|
||||
compatible = "st,st-delta";
|
||||
clock-names = "delta",
|
||||
"delta-st231",
|
||||
"delta-flash-promip";
|
||||
clocks = <&clk_s_c0_flexgen CLK_VID_DMU>,
|
||||
<&clk_s_c0_flexgen CLK_ST231_DMU>,
|
||||
<&clk_s_c0_flexgen CLK_FLASH_PROMIP>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -24,7 +24,7 @@ CONFIG_ARM_APPENDED_DTB=y
|
|||
CONFIG_ARM_ATAG_DTB_COMPAT=y
|
||||
CONFIG_CMDLINE="root=/dev/ram0 rw ramdisk=8192 initrd=0x41000000,8M console=ttySAC1,115200 init=/linuxrc mem=256M"
|
||||
CONFIG_CPU_FREQ=y
|
||||
CONFIG_CPU_FREQ_STAT_DETAILS=y
|
||||
CONFIG_CPU_FREQ_STAT=y
|
||||
CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
|
||||
CONFIG_CPU_FREQ_GOV_POWERSAVE=m
|
||||
CONFIG_CPU_FREQ_GOV_USERSPACE=m
|
||||
|
|
|
@ -58,7 +58,7 @@ CONFIG_ZBOOT_ROM_BSS=0x0
|
|||
CONFIG_ARM_APPENDED_DTB=y
|
||||
CONFIG_ARM_ATAG_DTB_COMPAT=y
|
||||
CONFIG_CPU_FREQ=y
|
||||
CONFIG_CPU_FREQ_STAT_DETAILS=y
|
||||
CONFIG_CPU_FREQ_STAT=y
|
||||
CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
|
||||
CONFIG_CPU_IDLE=y
|
||||
CONFIG_ARM_KIRKWOOD_CPUIDLE=y
|
||||
|
|
|
@ -132,7 +132,7 @@ CONFIG_ARM_ATAG_DTB_COMPAT=y
|
|||
CONFIG_KEXEC=y
|
||||
CONFIG_EFI=y
|
||||
CONFIG_CPU_FREQ=y
|
||||
CONFIG_CPU_FREQ_STAT_DETAILS=y
|
||||
CONFIG_CPU_FREQ_STAT=y
|
||||
CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
|
||||
CONFIG_CPU_FREQ_GOV_POWERSAVE=m
|
||||
CONFIG_CPU_FREQ_GOV_USERSPACE=m
|
||||
|
@ -569,6 +569,7 @@ CONFIG_VIDEO_SAMSUNG_S5P_MFC=m
|
|||
CONFIG_VIDEO_SAMSUNG_EXYNOS_GSC=m
|
||||
CONFIG_VIDEO_STI_BDISP=m
|
||||
CONFIG_VIDEO_STI_HVA=m
|
||||
CONFIG_VIDEO_STI_DELTA=m
|
||||
CONFIG_VIDEO_RENESAS_JPU=m
|
||||
CONFIG_VIDEO_RENESAS_VSP1=m
|
||||
CONFIG_V4L_TEST_DRIVERS=y
|
||||
|
|
|
@ -44,7 +44,7 @@ CONFIG_ZBOOT_ROM_BSS=0x0
|
|||
CONFIG_ARM_APPENDED_DTB=y
|
||||
CONFIG_ARM_ATAG_DTB_COMPAT=y
|
||||
CONFIG_CPU_FREQ=y
|
||||
CONFIG_CPU_FREQ_STAT_DETAILS=y
|
||||
CONFIG_CPU_FREQ_STAT=y
|
||||
CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
|
||||
CONFIG_CPU_IDLE=y
|
||||
CONFIG_ARM_KIRKWOOD_CPUIDLE=y
|
||||
|
|
|
@ -97,7 +97,7 @@ CONFIG_ZBOOT_ROM_BSS=0x0
|
|||
CONFIG_CMDLINE="root=/dev/ram0 ro"
|
||||
CONFIG_KEXEC=y
|
||||
CONFIG_CPU_FREQ=y
|
||||
CONFIG_CPU_FREQ_STAT_DETAILS=y
|
||||
CONFIG_CPU_FREQ_STAT=y
|
||||
CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
|
||||
CONFIG_CPU_FREQ_GOV_POWERSAVE=m
|
||||
CONFIG_CPU_FREQ_GOV_USERSPACE=m
|
||||
|
|
|
@ -38,7 +38,7 @@ CONFIG_ZBOOT_ROM_BSS=0x0
|
|||
CONFIG_ARM_APPENDED_DTB=y
|
||||
CONFIG_KEXEC=y
|
||||
CONFIG_CPU_FREQ=y
|
||||
CONFIG_CPU_FREQ_STAT_DETAILS=y
|
||||
CONFIG_CPU_FREQ_STAT=y
|
||||
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
|
||||
CONFIG_CPU_FREQ_GOV_USERSPACE=y
|
||||
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <linux/gpio/machine.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/platform_data/at24.h>
|
||||
#include <linux/platform_data/pca953x.h>
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include <linux/videodev2.h>
|
||||
#include <linux/v4l2-dv-timings.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/leds.h>
|
||||
|
||||
#include <media/i2c/tvp514x.h>
|
||||
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
*/
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/platform_data/gpio-davinci.h>
|
||||
#include <linux/platform_data/i2c-davinci.h>
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio/machine.h>
|
||||
#include <linux/platform_data/gpio-davinci.h>
|
||||
|
|
|
@ -27,7 +27,6 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-gpio.h>
|
||||
#include <linux/spi/spi.h>
|
||||
|
@ -106,33 +105,10 @@ static struct cs4271_platform_data edb93xx_cs4271_data = {
|
|||
.gpio_nreset = -EINVAL, /* filled in later */
|
||||
};
|
||||
|
||||
static int edb93xx_cs4271_hw_setup(struct spi_device *spi)
|
||||
{
|
||||
return gpio_request_one(EP93XX_GPIO_LINE_EGPIO6,
|
||||
GPIOF_OUT_INIT_HIGH, spi->modalias);
|
||||
}
|
||||
|
||||
static void edb93xx_cs4271_hw_cleanup(struct spi_device *spi)
|
||||
{
|
||||
gpio_free(EP93XX_GPIO_LINE_EGPIO6);
|
||||
}
|
||||
|
||||
static void edb93xx_cs4271_hw_cs_control(struct spi_device *spi, int value)
|
||||
{
|
||||
gpio_set_value(EP93XX_GPIO_LINE_EGPIO6, value);
|
||||
}
|
||||
|
||||
static struct ep93xx_spi_chip_ops edb93xx_cs4271_hw = {
|
||||
.setup = edb93xx_cs4271_hw_setup,
|
||||
.cleanup = edb93xx_cs4271_hw_cleanup,
|
||||
.cs_control = edb93xx_cs4271_hw_cs_control,
|
||||
};
|
||||
|
||||
static struct spi_board_info edb93xx_spi_board_info[] __initdata = {
|
||||
{
|
||||
.modalias = "cs4271",
|
||||
.platform_data = &edb93xx_cs4271_data,
|
||||
.controller_data = &edb93xx_cs4271_hw,
|
||||
.max_speed_hz = 6000000,
|
||||
.bus_num = 0,
|
||||
.chip_select = 0,
|
||||
|
@ -140,8 +116,13 @@ static struct spi_board_info edb93xx_spi_board_info[] __initdata = {
|
|||
},
|
||||
};
|
||||
|
||||
static int edb93xx_spi_chipselects[] __initdata = {
|
||||
EP93XX_GPIO_LINE_EGPIO6,
|
||||
};
|
||||
|
||||
static struct ep93xx_spi_info edb93xx_spi_info __initdata = {
|
||||
.num_chipselect = ARRAY_SIZE(edb93xx_spi_board_info),
|
||||
.chipselect = edb93xx_spi_chipselects,
|
||||
.num_chipselect = ARRAY_SIZE(edb93xx_spi_chipselects),
|
||||
};
|
||||
|
||||
static void __init edb93xx_register_spi(void)
|
||||
|
|
|
@ -48,56 +48,6 @@ static struct ep93xxfb_mach_info __initdata simone_fb_info = {
|
|||
*/
|
||||
#define MMC_CARD_DETECT_GPIO EP93XX_GPIO_LINE_EGPIO0
|
||||
|
||||
/*
|
||||
* Up to v1.3, the Sim.One used SFRMOUT as SD card chip select, but this goes
|
||||
* low between multi-message command blocks. From v1.4, it uses a GPIO instead.
|
||||
* v1.3 parts will still work, since the signal on SFRMOUT is automatic.
|
||||
*/
|
||||
#define MMC_CHIP_SELECT_GPIO EP93XX_GPIO_LINE_EGPIO1
|
||||
|
||||
/*
|
||||
* MMC SPI chip select GPIO handling. If you are using SFRMOUT (SFRM1) signal,
|
||||
* you can leave these empty and pass NULL as .controller_data.
|
||||
*/
|
||||
|
||||
static int simone_mmc_spi_setup(struct spi_device *spi)
|
||||
{
|
||||
unsigned int gpio = MMC_CHIP_SELECT_GPIO;
|
||||
int err;
|
||||
|
||||
err = gpio_request(gpio, spi->modalias);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = gpio_direction_output(gpio, 1);
|
||||
if (err) {
|
||||
gpio_free(gpio);
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void simone_mmc_spi_cleanup(struct spi_device *spi)
|
||||
{
|
||||
unsigned int gpio = MMC_CHIP_SELECT_GPIO;
|
||||
|
||||
gpio_set_value(gpio, 1);
|
||||
gpio_direction_input(gpio);
|
||||
gpio_free(gpio);
|
||||
}
|
||||
|
||||
static void simone_mmc_spi_cs_control(struct spi_device *spi, int value)
|
||||
{
|
||||
gpio_set_value(MMC_CHIP_SELECT_GPIO, value);
|
||||
}
|
||||
|
||||
static struct ep93xx_spi_chip_ops simone_mmc_spi_ops = {
|
||||
.setup = simone_mmc_spi_setup,
|
||||
.cleanup = simone_mmc_spi_cleanup,
|
||||
.cs_control = simone_mmc_spi_cs_control,
|
||||
};
|
||||
|
||||
/*
|
||||
* MMC card detection GPIO setup.
|
||||
*/
|
||||
|
@ -152,7 +102,6 @@ static struct mmc_spi_platform_data simone_mmc_spi_data = {
|
|||
static struct spi_board_info simone_spi_devices[] __initdata = {
|
||||
{
|
||||
.modalias = "mmc_spi",
|
||||
.controller_data = &simone_mmc_spi_ops,
|
||||
.platform_data = &simone_mmc_spi_data,
|
||||
/*
|
||||
* We use 10 MHz even though the maximum is 3.7 MHz. The driver
|
||||
|
@ -165,8 +114,18 @@ static struct spi_board_info simone_spi_devices[] __initdata = {
|
|||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* Up to v1.3, the Sim.One used SFRMOUT as SD card chip select, but this goes
|
||||
* low between multi-message command blocks. From v1.4, it uses a GPIO instead.
|
||||
* v1.3 parts will still work, since the signal on SFRMOUT is automatic.
|
||||
*/
|
||||
static int simone_spi_chipselects[] __initdata = {
|
||||
EP93XX_GPIO_LINE_EGPIO1,
|
||||
};
|
||||
|
||||
static struct ep93xx_spi_info simone_spi_info __initdata = {
|
||||
.num_chipselect = ARRAY_SIZE(simone_spi_devices),
|
||||
.chipselect = simone_spi_chipselects,
|
||||
.num_chipselect = ARRAY_SIZE(simone_spi_chipselects),
|
||||
.use_dma = 1,
|
||||
};
|
||||
|
||||
|
|
|
@ -175,33 +175,9 @@ static struct cs4271_platform_data vision_cs4271_data = {
|
|||
.gpio_nreset = EP93XX_GPIO_LINE_H(2),
|
||||
};
|
||||
|
||||
static int vision_cs4271_hw_setup(struct spi_device *spi)
|
||||
{
|
||||
return gpio_request_one(EP93XX_GPIO_LINE_EGPIO6,
|
||||
GPIOF_OUT_INIT_HIGH, spi->modalias);
|
||||
}
|
||||
|
||||
static void vision_cs4271_hw_cleanup(struct spi_device *spi)
|
||||
{
|
||||
gpio_free(EP93XX_GPIO_LINE_EGPIO6);
|
||||
}
|
||||
|
||||
static void vision_cs4271_hw_cs_control(struct spi_device *spi, int value)
|
||||
{
|
||||
gpio_set_value(EP93XX_GPIO_LINE_EGPIO6, value);
|
||||
}
|
||||
|
||||
static struct ep93xx_spi_chip_ops vision_cs4271_hw = {
|
||||
.setup = vision_cs4271_hw_setup,
|
||||
.cleanup = vision_cs4271_hw_cleanup,
|
||||
.cs_control = vision_cs4271_hw_cs_control,
|
||||
};
|
||||
|
||||
/*************************************************************************
|
||||
* SPI Flash
|
||||
*************************************************************************/
|
||||
#define VISION_SPI_FLASH_CS EP93XX_GPIO_LINE_EGPIO7
|
||||
|
||||
static struct mtd_partition vision_spi_flash_partitions[] = {
|
||||
{
|
||||
.name = "SPI bootstrap",
|
||||
|
@ -224,68 +200,20 @@ static struct flash_platform_data vision_spi_flash_data = {
|
|||
.nr_parts = ARRAY_SIZE(vision_spi_flash_partitions),
|
||||
};
|
||||
|
||||
static int vision_spi_flash_hw_setup(struct spi_device *spi)
|
||||
{
|
||||
return gpio_request_one(VISION_SPI_FLASH_CS, GPIOF_INIT_HIGH,
|
||||
spi->modalias);
|
||||
}
|
||||
|
||||
static void vision_spi_flash_hw_cleanup(struct spi_device *spi)
|
||||
{
|
||||
gpio_free(VISION_SPI_FLASH_CS);
|
||||
}
|
||||
|
||||
static void vision_spi_flash_hw_cs_control(struct spi_device *spi, int value)
|
||||
{
|
||||
gpio_set_value(VISION_SPI_FLASH_CS, value);
|
||||
}
|
||||
|
||||
static struct ep93xx_spi_chip_ops vision_spi_flash_hw = {
|
||||
.setup = vision_spi_flash_hw_setup,
|
||||
.cleanup = vision_spi_flash_hw_cleanup,
|
||||
.cs_control = vision_spi_flash_hw_cs_control,
|
||||
};
|
||||
|
||||
/*************************************************************************
|
||||
* SPI SD/MMC host
|
||||
*************************************************************************/
|
||||
#define VISION_SPI_MMC_CS EP93XX_GPIO_LINE_G(2)
|
||||
#define VISION_SPI_MMC_WP EP93XX_GPIO_LINE_F(0)
|
||||
#define VISION_SPI_MMC_CD EP93XX_GPIO_LINE_EGPIO15
|
||||
|
||||
static struct mmc_spi_platform_data vision_spi_mmc_data = {
|
||||
.detect_delay = 100,
|
||||
.powerup_msecs = 100,
|
||||
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||
.flags = MMC_SPI_USE_CD_GPIO | MMC_SPI_USE_RO_GPIO,
|
||||
.cd_gpio = VISION_SPI_MMC_CD,
|
||||
.cd_gpio = EP93XX_GPIO_LINE_EGPIO15,
|
||||
.cd_debounce = 1,
|
||||
.ro_gpio = VISION_SPI_MMC_WP,
|
||||
.ro_gpio = EP93XX_GPIO_LINE_F(0),
|
||||
.caps2 = MMC_CAP2_RO_ACTIVE_HIGH,
|
||||
};
|
||||
|
||||
static int vision_spi_mmc_hw_setup(struct spi_device *spi)
|
||||
{
|
||||
return gpio_request_one(VISION_SPI_MMC_CS, GPIOF_INIT_HIGH,
|
||||
spi->modalias);
|
||||
}
|
||||
|
||||
static void vision_spi_mmc_hw_cleanup(struct spi_device *spi)
|
||||
{
|
||||
gpio_free(VISION_SPI_MMC_CS);
|
||||
}
|
||||
|
||||
static void vision_spi_mmc_hw_cs_control(struct spi_device *spi, int value)
|
||||
{
|
||||
gpio_set_value(VISION_SPI_MMC_CS, value);
|
||||
}
|
||||
|
||||
static struct ep93xx_spi_chip_ops vision_spi_mmc_hw = {
|
||||
.setup = vision_spi_mmc_hw_setup,
|
||||
.cleanup = vision_spi_mmc_hw_cleanup,
|
||||
.cs_control = vision_spi_mmc_hw_cs_control,
|
||||
};
|
||||
|
||||
/*************************************************************************
|
||||
* SPI Bus
|
||||
*************************************************************************/
|
||||
|
@ -293,7 +221,6 @@ static struct spi_board_info vision_spi_board_info[] __initdata = {
|
|||
{
|
||||
.modalias = "cs4271",
|
||||
.platform_data = &vision_cs4271_data,
|
||||
.controller_data = &vision_cs4271_hw,
|
||||
.max_speed_hz = 6000000,
|
||||
.bus_num = 0,
|
||||
.chip_select = 0,
|
||||
|
@ -301,7 +228,6 @@ static struct spi_board_info vision_spi_board_info[] __initdata = {
|
|||
}, {
|
||||
.modalias = "sst25l",
|
||||
.platform_data = &vision_spi_flash_data,
|
||||
.controller_data = &vision_spi_flash_hw,
|
||||
.max_speed_hz = 20000000,
|
||||
.bus_num = 0,
|
||||
.chip_select = 1,
|
||||
|
@ -309,7 +235,6 @@ static struct spi_board_info vision_spi_board_info[] __initdata = {
|
|||
}, {
|
||||
.modalias = "mmc_spi",
|
||||
.platform_data = &vision_spi_mmc_data,
|
||||
.controller_data = &vision_spi_mmc_hw,
|
||||
.max_speed_hz = 20000000,
|
||||
.bus_num = 0,
|
||||
.chip_select = 2,
|
||||
|
@ -317,8 +242,15 @@ static struct spi_board_info vision_spi_board_info[] __initdata = {
|
|||
},
|
||||
};
|
||||
|
||||
static int vision_spi_chipselects[] __initdata = {
|
||||
EP93XX_GPIO_LINE_EGPIO6,
|
||||
EP93XX_GPIO_LINE_EGPIO7,
|
||||
EP93XX_GPIO_LINE_G(2),
|
||||
};
|
||||
|
||||
static struct ep93xx_spi_info vision_spi_master __initdata = {
|
||||
.num_chipselect = ARRAY_SIZE(vision_spi_board_info),
|
||||
.chipselect = vision_spi_chipselects,
|
||||
.num_chipselect = ARRAY_SIZE(vision_spi_chipselects),
|
||||
.use_dma = 1,
|
||||
};
|
||||
|
||||
|
|
|
@ -57,7 +57,6 @@ struct exynos_wkup_irq {
|
|||
struct exynos_pm_data {
|
||||
const struct exynos_wkup_irq *wkup_irq;
|
||||
unsigned int wake_disable_mask;
|
||||
unsigned int *release_ret_regs;
|
||||
|
||||
void (*pm_prepare)(void);
|
||||
void (*pm_resume_prepare)(void);
|
||||
|
@ -95,47 +94,6 @@ static const struct exynos_wkup_irq exynos5250_wkup_irq[] = {
|
|||
{ /* sentinel */ },
|
||||
};
|
||||
|
||||
static unsigned int exynos_release_ret_regs[] = {
|
||||
S5P_PAD_RET_MAUDIO_OPTION,
|
||||
S5P_PAD_RET_GPIO_OPTION,
|
||||
S5P_PAD_RET_UART_OPTION,
|
||||
S5P_PAD_RET_MMCA_OPTION,
|
||||
S5P_PAD_RET_MMCB_OPTION,
|
||||
S5P_PAD_RET_EBIA_OPTION,
|
||||
S5P_PAD_RET_EBIB_OPTION,
|
||||
REG_TABLE_END,
|
||||
};
|
||||
|
||||
static unsigned int exynos3250_release_ret_regs[] = {
|
||||
S5P_PAD_RET_MAUDIO_OPTION,
|
||||
S5P_PAD_RET_GPIO_OPTION,
|
||||
S5P_PAD_RET_UART_OPTION,
|
||||
S5P_PAD_RET_MMCA_OPTION,
|
||||
S5P_PAD_RET_MMCB_OPTION,
|
||||
S5P_PAD_RET_EBIA_OPTION,
|
||||
S5P_PAD_RET_EBIB_OPTION,
|
||||
S5P_PAD_RET_MMC2_OPTION,
|
||||
S5P_PAD_RET_SPI_OPTION,
|
||||
REG_TABLE_END,
|
||||
};
|
||||
|
||||
static unsigned int exynos5420_release_ret_regs[] = {
|
||||
EXYNOS_PAD_RET_DRAM_OPTION,
|
||||
EXYNOS_PAD_RET_MAUDIO_OPTION,
|
||||
EXYNOS_PAD_RET_JTAG_OPTION,
|
||||
EXYNOS5420_PAD_RET_GPIO_OPTION,
|
||||
EXYNOS5420_PAD_RET_UART_OPTION,
|
||||
EXYNOS5420_PAD_RET_MMCA_OPTION,
|
||||
EXYNOS5420_PAD_RET_MMCB_OPTION,
|
||||
EXYNOS5420_PAD_RET_MMCC_OPTION,
|
||||
EXYNOS5420_PAD_RET_HSI_OPTION,
|
||||
EXYNOS_PAD_RET_EBIA_OPTION,
|
||||
EXYNOS_PAD_RET_EBIB_OPTION,
|
||||
EXYNOS5420_PAD_RET_SPI_OPTION,
|
||||
EXYNOS5420_PAD_RET_DRAM_COREBLK_OPTION,
|
||||
REG_TABLE_END,
|
||||
};
|
||||
|
||||
static int exynos_irq_set_wake(struct irq_data *data, unsigned int state)
|
||||
{
|
||||
const struct exynos_wkup_irq *wkup_irq;
|
||||
|
@ -442,15 +400,6 @@ static int exynos5420_pm_suspend(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void exynos_pm_release_retention(void)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; (pm_data->release_ret_regs[i] != REG_TABLE_END); i++)
|
||||
pmu_raw_writel(EXYNOS_WAKEUP_FROM_LOWPWR,
|
||||
pm_data->release_ret_regs[i]);
|
||||
}
|
||||
|
||||
static void exynos_pm_resume(void)
|
||||
{
|
||||
u32 cpuid = read_cpuid_part();
|
||||
|
@ -458,9 +407,6 @@ static void exynos_pm_resume(void)
|
|||
if (exynos_pm_central_resume())
|
||||
goto early_wakeup;
|
||||
|
||||
/* For release retention */
|
||||
exynos_pm_release_retention();
|
||||
|
||||
if (cpuid == ARM_CPU_PART_CORTEX_A9)
|
||||
scu_enable(S5P_VA_SCU);
|
||||
|
||||
|
@ -482,9 +428,6 @@ static void exynos3250_pm_resume(void)
|
|||
if (exynos_pm_central_resume())
|
||||
goto early_wakeup;
|
||||
|
||||
/* For release retention */
|
||||
exynos_pm_release_retention();
|
||||
|
||||
pmu_raw_writel(S5P_USE_STANDBY_WFI_ALL, S5P_CENTRAL_SEQ_OPTION);
|
||||
|
||||
if (call_firmware_op(resume) == -ENOSYS
|
||||
|
@ -522,9 +465,6 @@ static void exynos5420_pm_resume(void)
|
|||
if (exynos_pm_central_resume())
|
||||
goto early_wakeup;
|
||||
|
||||
/* For release retention */
|
||||
exynos_pm_release_retention();
|
||||
|
||||
pmu_raw_writel(exynos_pmu_spare3, S5P_PMU_SPARE3);
|
||||
|
||||
early_wakeup:
|
||||
|
@ -637,7 +577,6 @@ static const struct platform_suspend_ops exynos_suspend_ops = {
|
|||
static const struct exynos_pm_data exynos3250_pm_data = {
|
||||
.wkup_irq = exynos3250_wkup_irq,
|
||||
.wake_disable_mask = ((0xFF << 8) | (0x1F << 1)),
|
||||
.release_ret_regs = exynos3250_release_ret_regs,
|
||||
.pm_suspend = exynos_pm_suspend,
|
||||
.pm_resume = exynos3250_pm_resume,
|
||||
.pm_prepare = exynos3250_pm_prepare,
|
||||
|
@ -647,7 +586,6 @@ static const struct exynos_pm_data exynos3250_pm_data = {
|
|||
static const struct exynos_pm_data exynos4_pm_data = {
|
||||
.wkup_irq = exynos4_wkup_irq,
|
||||
.wake_disable_mask = ((0xFF << 8) | (0x1F << 1)),
|
||||
.release_ret_regs = exynos_release_ret_regs,
|
||||
.pm_suspend = exynos_pm_suspend,
|
||||
.pm_resume = exynos_pm_resume,
|
||||
.pm_prepare = exynos_pm_prepare,
|
||||
|
@ -657,7 +595,6 @@ static const struct exynos_pm_data exynos4_pm_data = {
|
|||
static const struct exynos_pm_data exynos5250_pm_data = {
|
||||
.wkup_irq = exynos5250_wkup_irq,
|
||||
.wake_disable_mask = ((0xFF << 8) | (0x1F << 1)),
|
||||
.release_ret_regs = exynos_release_ret_regs,
|
||||
.pm_suspend = exynos_pm_suspend,
|
||||
.pm_resume = exynos_pm_resume,
|
||||
.pm_prepare = exynos_pm_prepare,
|
||||
|
@ -667,7 +604,6 @@ static const struct exynos_pm_data exynos5250_pm_data = {
|
|||
static const struct exynos_pm_data exynos5420_pm_data = {
|
||||
.wkup_irq = exynos5250_wkup_irq,
|
||||
.wake_disable_mask = (0x7F << 7) | (0x1F << 1),
|
||||
.release_ret_regs = exynos5420_release_ret_regs,
|
||||
.pm_resume_prepare = exynos5420_prepare_pm_resume,
|
||||
.pm_resume = exynos5420_pm_resume,
|
||||
.pm_suspend = exynos5420_pm_suspend,
|
||||
|
|
|
@ -484,15 +484,15 @@ static struct pwm_omap_dmtimer_pdata pwm_dmtimer_pdata = {
|
|||
};
|
||||
#endif
|
||||
|
||||
static struct lirc_rx51_platform_data __maybe_unused rx51_lirc_data = {
|
||||
static struct ir_rx51_platform_data __maybe_unused rx51_ir_data = {
|
||||
.set_max_mpu_wakeup_lat = omap_pm_set_max_mpu_wakeup_lat,
|
||||
};
|
||||
|
||||
static struct platform_device __maybe_unused rx51_lirc_device = {
|
||||
.name = "lirc_rx51",
|
||||
static struct platform_device __maybe_unused rx51_ir_device = {
|
||||
.name = "ir_rx51",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &rx51_lirc_data,
|
||||
.platform_data = &rx51_ir_data,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -533,7 +533,7 @@ static struct of_dev_auxdata omap_auxdata_lookup[] __initdata = {
|
|||
&omap3_iommu_pdata),
|
||||
OF_DEV_AUXDATA("ti,omap3-hsmmc", 0x4809c000, "4809c000.mmc", &mmc_pdata[0]),
|
||||
OF_DEV_AUXDATA("ti,omap3-hsmmc", 0x480b4000, "480b4000.mmc", &mmc_pdata[1]),
|
||||
OF_DEV_AUXDATA("nokia,n900-ir", 0, "n900-ir", &rx51_lirc_data),
|
||||
OF_DEV_AUXDATA("nokia,n900-ir", 0, "n900-ir", &rx51_ir_data),
|
||||
/* Only on am3517 */
|
||||
OF_DEV_AUXDATA("ti,davinci_mdio", 0x5c030000, "davinci_mdio.0", NULL),
|
||||
OF_DEV_AUXDATA("ti,am3517-emac", 0x5c000000, "davinci_emac.0",
|
||||
|
|
|
@ -130,17 +130,16 @@ static int __init omap2_set_init_voltage(char *vdd_name, char *clk_name,
|
|||
freq = clk_get_rate(clk);
|
||||
clk_put(clk);
|
||||
|
||||
rcu_read_lock();
|
||||
opp = dev_pm_opp_find_freq_ceil(dev, &freq);
|
||||
if (IS_ERR(opp)) {
|
||||
rcu_read_unlock();
|
||||
pr_err("%s: unable to find boot up OPP for vdd_%s\n",
|
||||
__func__, vdd_name);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
bootup_volt = dev_pm_opp_get_voltage(opp);
|
||||
rcu_read_unlock();
|
||||
dev_pm_opp_put(opp);
|
||||
|
||||
if (!bootup_volt) {
|
||||
pr_err("%s: unable to find voltage corresponding to the bootup OPP for vdd_%s\n",
|
||||
__func__, vdd_name);
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/fb.h>
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include <linux/gpio.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include <linux/major.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/mmc/host.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/pm.h>
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/bitops.h>
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include <linux/irq.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/usb/gpio_vbus.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
|
||||
#include <linux/cpufreq.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/gpio.h>
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/gpio.h>
|
||||
|
|
|
@ -155,13 +155,6 @@ static const struct platform_suspend_ops s5pv210_suspend_ops = {
|
|||
*/
|
||||
static void s5pv210_pm_resume(void)
|
||||
{
|
||||
u32 tmp;
|
||||
|
||||
tmp = __raw_readl(S5P_OTHERS);
|
||||
tmp |= (S5P_OTHERS_RET_IO | S5P_OTHERS_RET_CF |\
|
||||
S5P_OTHERS_RET_MMC | S5P_OTHERS_RET_UART);
|
||||
__raw_writel(tmp , S5P_OTHERS);
|
||||
|
||||
s3c_pm_do_restore_core(s5pv210_core_save, ARRAY_SIZE(s5pv210_core_save));
|
||||
}
|
||||
|
||||
|
|
|
@ -188,10 +188,6 @@
|
|||
#define S5P_SLEEP_CFG_USBOSC_EN (1 << 1)
|
||||
|
||||
/* OTHERS Resgister */
|
||||
#define S5P_OTHERS_RET_IO (1 << 31)
|
||||
#define S5P_OTHERS_RET_CF (1 << 30)
|
||||
#define S5P_OTHERS_RET_MMC (1 << 29)
|
||||
#define S5P_OTHERS_RET_UART (1 << 28)
|
||||
#define S5P_OTHERS_USB_SIG_MASK (1 << 16)
|
||||
|
||||
/* S5P_DAC_CONTROL */
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* linux/arch/arm/mm/extable.c
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
#include <linux/extable.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
int fixup_exception(struct pt_regs *regs)
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue