Commit 6886059f authored by Olof Johansson's avatar Olof Johansson
Browse files

Merge tag 'omap-for-v3.13/fixes-for-merge-window-take2' of...

Merge tag 'omap-for-v3.13/fixes-for-merge-window-take2' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap into fixes

Few clock fixes, a runtime PM fix, and pinctrl-single fix along
with few other fixes that popped up during the merge window.

* tag 'omap-for-v3.13/fixes-for-merge-window-take2' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap:
  ARM: OMAP2+: Fix build for dra7xx without omap4 and 5
  ARM: OMAP2+: omap_device: maintain sane runtime pm status around suspend/resume
  doc: devicetree: Add bindings documentation for omap-des driver
  ARM: dts: doc: Document missing compatible property for omap-sham driver
  ARM: OMAP3: Beagle: fix return value check in beagle_opp_init()
  ARM: OMAP: devicetree: fix SPI node compatible property syntax items
  pinctrl: single: call pcs_soc->rearm() whenever IRQ mask is changed
  ARM: OMAP2+: smsc911x: fix return value check in gpmc_smsc911x_init()
  + sync with newer trunk
parents ca439c9b 26273e02
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -3152,6 +3152,11 @@ N: Dipankar Sarma
E: dipankar@in.ibm.com
E: dipankar@in.ibm.com
D: RCU
D: RCU


N: Yoshinori Sato
E: ysato@users.sourceforge.jp
D: uClinux for Renesas H8/300 (H8300)
D: http://uclinux-h8.sourceforge.jp/

N: Hannu Savolainen
N: Hannu Savolainen
E: hannu@opensound.com
E: hannu@opensound.com
D: Maintainer of the sound drivers until 2.1.x days.
D: Maintainer of the sound drivers until 2.1.x days.
+4 −1
Original line number Original line Diff line number Diff line
@@ -87,7 +87,10 @@ X!Iinclude/linux/kobject.h
!Ekernel/printk/printk.c
!Ekernel/printk/printk.c
!Ekernel/panic.c
!Ekernel/panic.c
!Ekernel/sys.c
!Ekernel/sys.c
!Ekernel/rcupdate.c
!Ekernel/rcu/srcu.c
!Ekernel/rcu/tree.c
!Ekernel/rcu/tree_plugin.h
!Ekernel/rcu/update.c
     </sect1>
     </sect1>


     <sect1><title>Device Resource Management</title>
     <sect1><title>Device Resource Management</title>
+32 −32
Original line number Original line Diff line number Diff line
@@ -87,7 +87,7 @@
  <chapter id="rationale">
  <chapter id="rationale">
    <title>Rationale</title>
    <title>Rationale</title>
	<para>
	<para>
	The original implementation of interrupt handling in Linux is using
	The original implementation of interrupt handling in Linux uses
	the __do_IRQ() super-handler, which is able to deal with every
	the __do_IRQ() super-handler, which is able to deal with every
	type of interrupt logic.
	type of interrupt logic.
	</para>
	</para>
@@ -111,7 +111,7 @@
	</itemizedlist>
	</itemizedlist>
	</para>
	</para>
	<para>
	<para>
	This split implementation of highlevel IRQ handlers allows us to
	This split implementation of high-level IRQ handlers allows us to
	optimize the flow of the interrupt handling for each specific
	optimize the flow of the interrupt handling for each specific
	interrupt type. This reduces complexity in that particular code path
	interrupt type. This reduces complexity in that particular code path
	and allows the optimized handling of a given type.
	and allows the optimized handling of a given type.
@@ -120,10 +120,10 @@
	The original general IRQ implementation used hw_interrupt_type
	The original general IRQ implementation used hw_interrupt_type
	structures and their ->ack(), ->end() [etc.] callbacks to
	structures and their ->ack(), ->end() [etc.] callbacks to
	differentiate the flow control in the super-handler. This leads to
	differentiate the flow control in the super-handler. This leads to
	a mix of flow logic and lowlevel hardware logic, and it also leads
	a mix of flow logic and low-level hardware logic, and it also leads
	to unnecessary code duplication: for example in i386, there is a
	to unnecessary code duplication: for example in i386, there is an
	ioapic_level_irq and a ioapic_edge_irq irq-type which share many
	ioapic_level_irq and an ioapic_edge_irq IRQ-type which share many
	of the lowlevel details but have different flow handling.
	of the low-level details but have different flow handling.
	</para>
	</para>
	<para>
	<para>
	A more natural abstraction is the clean separation of the
	A more natural abstraction is the clean separation of the
@@ -132,23 +132,23 @@
	<para>
	<para>
	Analysing a couple of architecture's IRQ subsystem implementations
	Analysing a couple of architecture's IRQ subsystem implementations
	reveals that most of them can use a generic set of 'irq flow'
	reveals that most of them can use a generic set of 'irq flow'
	methods and only need to add the chip level specific code.
	methods and only need to add the chip-level specific code.
	The separation is also valuable for (sub)architectures
	The separation is also valuable for (sub)architectures
	which need specific quirks in the irq flow itself but not in the
	which need specific quirks in the IRQ flow itself but not in the
	chip-details - and thus provides a more transparent IRQ subsystem
	chip details - and thus provides a more transparent IRQ subsystem
	design.
	design.
	</para>
	</para>
	<para>
	<para>
	Each interrupt descriptor is assigned its own highlevel flow
	Each interrupt descriptor is assigned its own high-level flow
	handler, which is normally one of the generic
	handler, which is normally one of the generic
	implementations. (This highlevel flow handler implementation also
	implementations. (This high-level flow handler implementation also
	makes it simple to provide demultiplexing handlers which can be
	makes it simple to provide demultiplexing handlers which can be
	found in embedded platforms on various architectures.)
	found in embedded platforms on various architectures.)
	</para>
	</para>
	<para>
	<para>
	The separation makes the generic interrupt handling layer more
	The separation makes the generic interrupt handling layer more
	flexible and extensible. For example, an (sub)architecture can
	flexible and extensible. For example, an (sub)architecture can
	use a generic irq-flow implementation for 'level type' interrupts
	use a generic IRQ-flow implementation for 'level type' interrupts
	and add a (sub)architecture specific 'edge type' implementation.
	and add a (sub)architecture specific 'edge type' implementation.
	</para>
	</para>
	<para>
	<para>
@@ -172,9 +172,9 @@
    <para>
    <para>
	There are three main levels of abstraction in the interrupt code:
	There are three main levels of abstraction in the interrupt code:
	<orderedlist>
	<orderedlist>
	  <listitem><para>Highlevel driver API</para></listitem>
	  <listitem><para>High-level driver API</para></listitem>
	  <listitem><para>Highlevel IRQ flow handlers</para></listitem>
	  <listitem><para>High-level IRQ flow handlers</para></listitem>
	  <listitem><para>Chiplevel hardware encapsulation</para></listitem>
	  <listitem><para>Chip-level hardware encapsulation</para></listitem>
	</orderedlist>
	</orderedlist>
    </para>
    </para>
    <sect1 id="Interrupt_control_flow">
    <sect1 id="Interrupt_control_flow">
@@ -189,16 +189,16 @@
	which are assigned to this interrupt.
	which are assigned to this interrupt.
	</para>
	</para>
	<para>
	<para>
	Whenever an interrupt triggers, the lowlevel arch code calls into
	Whenever an interrupt triggers, the low-level architecture code calls
	the generic interrupt code by calling desc->handle_irq().
	into the generic interrupt code by calling desc->handle_irq().
	This highlevel IRQ handling function only uses desc->irq_data.chip
	This high-level IRQ handling function only uses desc->irq_data.chip
	primitives referenced by the assigned chip descriptor structure.
	primitives referenced by the assigned chip descriptor structure.
	</para>
	</para>
    </sect1>
    </sect1>
    <sect1 id="Highlevel_Driver_API">
    <sect1 id="Highlevel_Driver_API">
	<title>Highlevel Driver API</title>
	<title>High-level Driver API</title>
	<para>
	<para>
	  The highlevel Driver API consists of following functions:
	  The high-level Driver API consists of following functions:
	  <itemizedlist>
	  <itemizedlist>
	  <listitem><para>request_irq()</para></listitem>
	  <listitem><para>request_irq()</para></listitem>
	  <listitem><para>free_irq()</para></listitem>
	  <listitem><para>free_irq()</para></listitem>
@@ -216,7 +216,7 @@
	</para>
	</para>
    </sect1>
    </sect1>
    <sect1 id="Highlevel_IRQ_flow_handlers">
    <sect1 id="Highlevel_IRQ_flow_handlers">
	<title>Highlevel IRQ flow handlers</title>
	<title>High-level IRQ flow handlers</title>
	<para>
	<para>
	  The generic layer provides a set of pre-defined irq-flow methods:
	  The generic layer provides a set of pre-defined irq-flow methods:
	  <itemizedlist>
	  <itemizedlist>
@@ -228,7 +228,7 @@
	  <listitem><para>handle_edge_eoi_irq</para></listitem>
	  <listitem><para>handle_edge_eoi_irq</para></listitem>
	  <listitem><para>handle_bad_irq</para></listitem>
	  <listitem><para>handle_bad_irq</para></listitem>
	  </itemizedlist>
	  </itemizedlist>
	  The interrupt flow handlers (either predefined or architecture
	  The interrupt flow handlers (either pre-defined or architecture
	  specific) are assigned to specific interrupts by the architecture
	  specific) are assigned to specific interrupts by the architecture
	  either during bootup or during device initialization.
	  either during bootup or during device initialization.
	</para>
	</para>
@@ -297,7 +297,7 @@ desc->irq_data.chip->irq_unmask();
		<para>
		<para>
		handle_fasteoi_irq provides a generic implementation
		handle_fasteoi_irq provides a generic implementation
		for interrupts, which only need an EOI at the end of
		for interrupts, which only need an EOI at the end of
		the handler
		the handler.
		</para>
		</para>
		<para>
		<para>
		The following control flow is implemented (simplified excerpt):
		The following control flow is implemented (simplified excerpt):
@@ -394,7 +394,7 @@ if (desc->irq_data.chip->irq_eoi)
	The generic functions are intended for 'clean' architectures and chips,
	The generic functions are intended for 'clean' architectures and chips,
	which have no platform-specific IRQ handling quirks. If an architecture
	which have no platform-specific IRQ handling quirks. If an architecture
	needs to implement quirks on the 'flow' level then it can do so by
	needs to implement quirks on the 'flow' level then it can do so by
	overriding the highlevel irq-flow handler.
	overriding the high-level irq-flow handler.
	</para>
	</para>
	</sect2>
	</sect2>
	<sect2 id="Delayed_interrupt_disable">
	<sect2 id="Delayed_interrupt_disable">
@@ -419,9 +419,9 @@ if (desc->irq_data.chip->irq_eoi)
	</sect2>
	</sect2>
    </sect1>
    </sect1>
    <sect1 id="Chiplevel_hardware_encapsulation">
    <sect1 id="Chiplevel_hardware_encapsulation">
	<title>Chiplevel hardware encapsulation</title>
	<title>Chip-level hardware encapsulation</title>
	<para>
	<para>
	The chip level hardware descriptor structure irq_chip
	The chip-level hardware descriptor structure irq_chip
	contains all the direct chip relevant functions, which
	contains all the direct chip relevant functions, which
	can be utilized by the irq flow implementations.
	can be utilized by the irq flow implementations.
	  <itemizedlist>
	  <itemizedlist>
@@ -429,14 +429,14 @@ if (desc->irq_data.chip->irq_eoi)
	  <listitem><para>irq_mask_ack() - Optional, recommended for performance</para></listitem>
	  <listitem><para>irq_mask_ack() - Optional, recommended for performance</para></listitem>
	  <listitem><para>irq_mask()</para></listitem>
	  <listitem><para>irq_mask()</para></listitem>
	  <listitem><para>irq_unmask()</para></listitem>
	  <listitem><para>irq_unmask()</para></listitem>
	  <listitem><para>irq_eoi() - Optional, required for eoi flow handlers</para></listitem>
	  <listitem><para>irq_eoi() - Optional, required for EOI flow handlers</para></listitem>
	  <listitem><para>irq_retrigger() - Optional</para></listitem>
	  <listitem><para>irq_retrigger() - Optional</para></listitem>
	  <listitem><para>irq_set_type() - Optional</para></listitem>
	  <listitem><para>irq_set_type() - Optional</para></listitem>
	  <listitem><para>irq_set_wake() - Optional</para></listitem>
	  <listitem><para>irq_set_wake() - Optional</para></listitem>
	  </itemizedlist>
	  </itemizedlist>
	These primitives are strictly intended to mean what they say: ack means
	These primitives are strictly intended to mean what they say: ack means
	ACK, masking means masking of an IRQ line, etc. It is up to the flow
	ACK, masking means masking of an IRQ line, etc. It is up to the flow
	handler(s) to use these basic units of lowlevel functionality.
	handler(s) to use these basic units of low-level functionality.
	</para>
	</para>
    </sect1>
    </sect1>
  </chapter>
  </chapter>
@@ -445,7 +445,7 @@ if (desc->irq_data.chip->irq_eoi)
     <title>__do_IRQ entry point</title>
     <title>__do_IRQ entry point</title>
     <para>
     <para>
	The original implementation __do_IRQ() was an alternative entry
	The original implementation __do_IRQ() was an alternative entry
	point for all types of interrupts. It not longer exists.
	point for all types of interrupts. It no longer exists.
     </para>
     </para>
     <para>
     <para>
	This handler turned out to be not suitable for all
	This handler turned out to be not suitable for all
@@ -468,11 +468,11 @@ if (desc->irq_data.chip->irq_eoi)
  <chapter id="genericchip">
  <chapter id="genericchip">
     <title>Generic interrupt chip</title>
     <title>Generic interrupt chip</title>
     <para>
     <para>
       To avoid copies of identical implementations of irq chips the
       To avoid copies of identical implementations of IRQ chips the
       core provides a configurable generic interrupt chip
       core provides a configurable generic interrupt chip
       implementation. Developers should check carefuly whether the
       implementation. Developers should check carefuly whether the
       generic chip fits their needs before implementing the same
       generic chip fits their needs before implementing the same
       functionality slightly different themself.
       functionality slightly differently themselves.
     </para>
     </para>
!Ekernel/irq/generic-chip.c
!Ekernel/irq/generic-chip.c
  </chapter>
  </chapter>
+2 −2
Original line number Original line Diff line number Diff line
@@ -202,8 +202,8 @@ over a rather long period of time, but improvements are always welcome!
	updater uses call_rcu_sched() or synchronize_sched(), then
	updater uses call_rcu_sched() or synchronize_sched(), then
	the corresponding readers must disable preemption, possibly
	the corresponding readers must disable preemption, possibly
	by calling rcu_read_lock_sched() and rcu_read_unlock_sched().
	by calling rcu_read_lock_sched() and rcu_read_unlock_sched().
	If the updater uses synchronize_srcu() or call_srcu(),
	If the updater uses synchronize_srcu() or call_srcu(), then
	the the corresponding readers must use srcu_read_lock() and
	the corresponding readers must use srcu_read_lock() and
	srcu_read_unlock(), and with the same srcu_struct.  The rules for
	srcu_read_unlock(), and with the same srcu_struct.  The rules for
	the expedited primitives are the same as for their non-expedited
	the expedited primitives are the same as for their non-expedited
	counterparts.  Mixing things up will result in confusion and
	counterparts.  Mixing things up will result in confusion and
+15 −7
Original line number Original line Diff line number Diff line
@@ -12,12 +12,12 @@ CONFIG_RCU_CPU_STALL_TIMEOUT
	This kernel configuration parameter defines the period of time
	This kernel configuration parameter defines the period of time
	that RCU will wait from the beginning of a grace period until it
	that RCU will wait from the beginning of a grace period until it
	issues an RCU CPU stall warning.  This time period is normally
	issues an RCU CPU stall warning.  This time period is normally
	sixty seconds.
	21 seconds.


	This configuration parameter may be changed at runtime via the
	This configuration parameter may be changed at runtime via the
	/sys/module/rcutree/parameters/rcu_cpu_stall_timeout, however
	/sys/module/rcutree/parameters/rcu_cpu_stall_timeout, however
	this parameter is checked only at the beginning of a cycle.
	this parameter is checked only at the beginning of a cycle.
	So if you are 30 seconds into a 70-second stall, setting this
	So if you are 10 seconds into a 40-second stall, setting this
	sysfs parameter to (say) five will shorten the timeout for the
	sysfs parameter to (say) five will shorten the timeout for the
	-next- stall, or the following warning for the current stall
	-next- stall, or the following warning for the current stall
	(assuming the stall lasts long enough).  It will not affect the
	(assuming the stall lasts long enough).  It will not affect the
@@ -32,7 +32,7 @@ CONFIG_RCU_CPU_STALL_VERBOSE
	also dump the stacks of any tasks that are blocking the current
	also dump the stacks of any tasks that are blocking the current
	RCU-preempt grace period.
	RCU-preempt grace period.


RCU_CPU_STALL_INFO
CONFIG_RCU_CPU_STALL_INFO


	This kernel configuration parameter causes the stall warning to
	This kernel configuration parameter causes the stall warning to
	print out additional per-CPU diagnostic information, including
	print out additional per-CPU diagnostic information, including
@@ -43,7 +43,8 @@ RCU_STALL_DELAY_DELTA
	Although the lockdep facility is extremely useful, it does add
	Although the lockdep facility is extremely useful, it does add
	some overhead.  Therefore, under CONFIG_PROVE_RCU, the
	some overhead.  Therefore, under CONFIG_PROVE_RCU, the
	RCU_STALL_DELAY_DELTA macro allows five extra seconds before
	RCU_STALL_DELAY_DELTA macro allows five extra seconds before
	giving an RCU CPU stall warning message.
	giving an RCU CPU stall warning message.  (This is a cpp
	macro, not a kernel configuration parameter.)


RCU_STALL_RAT_DELAY
RCU_STALL_RAT_DELAY


@@ -52,7 +53,8 @@ RCU_STALL_RAT_DELAY
	However, if the offending CPU does not detect its own stall in
	However, if the offending CPU does not detect its own stall in
	the number of jiffies specified by RCU_STALL_RAT_DELAY, then
	the number of jiffies specified by RCU_STALL_RAT_DELAY, then
	some other CPU will complain.  This delay is normally set to
	some other CPU will complain.  This delay is normally set to
	two jiffies.
	two jiffies.  (This is a cpp macro, not a kernel configuration
	parameter.)


When a CPU detects that it is stalling, it will print a message similar
When a CPU detects that it is stalling, it will print a message similar
to the following:
to the following:
@@ -86,7 +88,12 @@ printing, there will be a spurious stall-warning message:


INFO: rcu_bh_state detected stalls on CPUs/tasks: { } (detected by 4, 2502 jiffies)
INFO: rcu_bh_state detected stalls on CPUs/tasks: { } (detected by 4, 2502 jiffies)


This is rare, but does happen from time to time in real life.
This is rare, but does happen from time to time in real life.  It is also
possible for a zero-jiffy stall to be flagged in this case, depending
on how the stall warning and the grace-period initialization happen to
interact.  Please note that it is not possible to entirely eliminate this
sort of false positive without resorting to things like stop_machine(),
which is overkill for this sort of problem.


If the CONFIG_RCU_CPU_STALL_INFO kernel configuration parameter is set,
If the CONFIG_RCU_CPU_STALL_INFO kernel configuration parameter is set,
more information is printed with the stall-warning message, for example:
more information is printed with the stall-warning message, for example:
@@ -216,4 +223,5 @@ that portion of the stack which remains the same from trace to trace.
If you can reliably trigger the stall, ftrace can be quite helpful.
If you can reliably trigger the stall, ftrace can be quite helpful.


RCU bugs can often be debugged with the help of CONFIG_RCU_TRACE
RCU bugs can often be debugged with the help of CONFIG_RCU_TRACE
and with RCU's event tracing.
and with RCU's event tracing.  For information on RCU's event tracing,
see include/trace/events/rcu.h.
Loading