1. 25 7月, 2012 1 次提交
    • G
      irqdomain: eliminate slow-path revmap lookups · 4c0946c4
      Grant Likely 提交于
      With the current state of irq_domain, the reverse map is always updated
      when new IRQs get mapped.  This means that the irq_find_mapping() function
      can be simplified to execute the revmap lookup functions unconditionally
      
      This patch adds lookup functions for the revmaps that don't yet have one
      and removes the slow path lookup code path.
      
      v8: Broke out unrelated changes into separate patches.  Rebased on Paul's irq
          association patches.
      v7: Rebased to irqdomain/next for v3.4 and applied before the removal of 'hint'
      v6: Remove the slow path entirely.  The only place where the slow path
          could get called is for a linear mapping if the hwirq number is larger
          than the linear revmap size.  There shouldn't be any interrupt
          controllers that do that.
      v5: rewrite to not use a ->revmap() callback.  It is simpler, smaller,
          safer and faster to open code each of the revmap lookups directly into
          irq_find_mapping() via a switch statement.
      v4: Fix build failure on incorrect variable reference.
      Signed-off-by: NGrant Likely <grant.likely@secretlab.ca>
      Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Milton Miller <miltonm@bga.com>
      Cc: Paul Mundt <lethal@linux-sh.org>
      Cc: Rob Herring <rob.herring@calxeda.com>
      4c0946c4
  2. 23 7月, 2012 2 次提交
  3. 11 7月, 2012 7 次提交
    • G
      irqdomain: Fix irq_create_direct_mapping() to test irq_domain type. · 9844a552
      Grant Likely 提交于
      irq_create_direct_mapping can only be used with the NOMAP type.  Make
      the function test to ensure it is passed the correct type of
      irq_domain.
      Signed-off-by: NGrant Likely <grant.likely@secretlab.ca>
      Cc: Paul Mundt <lethal@linux-sh.org>
      Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Rob Herring <rob.herring@calxeda.com>
      9844a552
    • G
      irqdomain: Eliminate dedicated radix lookup functions · d6b0d1f7
      Grant Likely 提交于
      In preparation to remove the slow revmap path, eliminate the public
      radix revmap lookup functions.  This simplifies the code and makes the
      slowpath removal patch a lot simpler.
      Signed-off-by: NGrant Likely <grant.likely@secretlab.ca>
      Cc: Paul Mundt <lethal@linux-sh.org>
      Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Rob Herring <rob.herring@calxeda.com>
      d6b0d1f7
    • G
      irqdomain: Support for static IRQ mapping and association. · 98aa468e
      Grant Likely 提交于
      This adds a new strict mapping API for supporting creation of linux IRQs
      at existing positions within the domain. The new routines are as follows:
      
      For dynamic allocation and insertion to specified ranges:
      
      	- irq_create_identity_mapping()
      	- irq_create_strict_mappings()
      
      These will allocate and associate a range of linux IRQs at the specified
      location. This can be used by controllers that have their own static linux IRQ
      definitions to map a hwirq range to, as well as for platforms that wish to
      establish 1:1 identity mapping between linux and hwirq space.
      
      For insertion to specified ranges by platforms that do their own irq_desc
      management:
      
      	- irq_domain_associate()
      	- irq_domain_associate_many()
      
      These in turn call back in to the domain's ->map() routine, for further
      processing by the platform. Disassociation of IRQs get handled through
      irq_dispose_mapping() as normal.
      
      With these in place it should be possible to begin migration of legacy IRQ
      domains to linear ones, without requiring special handling for static vs
      dynamic IRQ definitions in DT vs non-DT paths. This also makes it possible
      for domains with static mappings to adopt whichever tree model best fits
      their needs, rather than simply restricting them to linear revmaps.
      Signed-off-by: NPaul Mundt <lethal@linux-sh.org>
      [grant.likely: Reorganized irq_domain_associate{,_many} to have all logic in one place]
      [grant.likely: Add error checking for unallocated irq_descs at associate time]
      Signed-off-by: NGrant Likely <grant.likely@secretlab.ca>
      Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Rob Herring <rob.herring@calxeda.com>
      98aa468e
    • G
      irqdomain: Always update revmap when setting up a virq · 2a71a1a9
      Grant Likely 提交于
      At irq_setup_virq() time all of the data needed to update the reverse
      map is available, but the current code ignores it and relies upon the
      slow path to insert revmap records.  This patch adds revmap updating
      to the setup path so the slow path will no longer be necessary.
      Signed-off-by: NGrant Likely <grant.likely@secretlab.ca>
      Cc: Paul Mundt <lethal@linux-sh.org>
      Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Rob Herring <rob.herring@calxeda.com>
      2a71a1a9
    • G
      irqdomain: Split disassociating code into separate function · 913af207
      Grant Likely 提交于
      This patch moves the irq disassociation code out into a separate
      function in preparation to extend irq_setup_virq to handle multiple
      irqs and rename it for use by interrupt controller drivers.  The new
      function will be used by irq_setup_virq() in its error path.
      Signed-off-by: NGrant Likely <grant.likely@secretlab.ca>
      Acked-by: NBenjamin Herrenschmidt <benh@kernel.crashing.org>
      Cc: Paul Mundt <lethal@linux-sh.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Rob Herring <rob.herring@calxeda.com>
      913af207
    • D
      irq_domain: correct a minor wrong comment for linear revmap · 22076c77
      Dong Aisheng 提交于
      The revmap type should be linear for irq_domain_add_linear function.
      Signed-off-by: NDong Aisheng <dong.aisheng@linaro.org>
      Signed-off-by: NGrant Likely <grant.likely@secretlab.ca>
      22076c77
    • M
      irq_domain: Standardise legacy/linear domain selection · 781d0f46
      Mark Brown 提交于
      A large proportion of interrupt controllers that support legacy mappings
      do so because non-DT systems need to use fixed IRQ numbers when registering
      devices via buses but can otherwise use a linear mapping. The interrupt
      controller itself typically is not affected by the mapping used and best
      practice is to use a linear mapping where possible so drivers frequently
      select at runtime depending on if a legacy range has been allocated to
      them.
      
      Standardise this behaviour by providing irq_domain_register_simple() which
      will allocate a linear mapping unless a positive first_irq is provided in
      which case it will fall back to a legacy mapping. This helps make best
      practice for irq_domain adoption clearer.
      Signed-off-by: NMark Brown <broonie@opensource.wolfsonmicro.com>
      Signed-off-by: NGrant Likely <grant.likely@secretlab.ca>
      781d0f46
  4. 06 7月, 2012 1 次提交
  5. 18 6月, 2012 1 次提交
  6. 16 6月, 2012 3 次提交
    • G
      irqdomain: Remove unnecessary test for IRQ_DOMAIN_MAP_LEGACY · 73255704
      Grant Likely 提交于
      Where irq_domain_associate() is called in irq_create_mapping, there is
      no need to test for IRQ_DOMAIN_MAP_LEGACY because it is already tested
      for earlier in the routine.
      Signed-off-by: NGrant Likely <grant.likely@secretlab.ca>
      Cc: Paul Mundt <lethal@linux-sh.org>
      Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Rob Herring <rob.herring@calxeda.com>
      73255704
    • P
      irqdomain: Simple NUMA awareness. · 5ca4db61
      Paul Mundt 提交于
      While common irqdesc allocation is node aware, the irqdomain code is not.
      
      Presently we observe a number of regressions/inconsistencies on
      NUMA-capable platforms:
      
      - Platforms using irqdomains with legacy mappings, where the
        irq_descs are allocated node-local and the irqdomain data
        structure is not.
      
      - Drivers implementing irqdomains will lose node locality
        regardless of the underlying struct device's node id.
      
      This plugs in NUMA node id proliferation across the various allocation
      callsites by way of_node_to_nid() node lookup. While of_node_to_nid()
      does the right thing for OF-capable platforms it doesn't presently handle
      the non-DT case. This is trivially dealt with by simply wraping in to
      numa_node_id() unconditionally.
      Signed-off-by: NPaul Mundt <lethal@linux-sh.org>
      Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Rob Herring <rob.herring@calxeda.com>
      Signed-off-by: NGrant Likely <grant.likely@secretlab.ca>
      5ca4db61
    • G
      devicetree: add helper inline for retrieving a node's full name · efd68e72
      Grant Likely 提交于
      The pattern (np ? np->full_name : "<none>") is rather common in the
      kernel, but can also make for quite long lines.  This patch adds a new
      inline function, of_node_full_name() so that the test for a valid node
      pointer doesn't need to be open coded at all call sites.
      Signed-off-by: NGrant Likely <grant.likely@secretlab.ca>
      Cc: Paul Mundt <lethal@linux-sh.org>
      Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      efd68e72
  7. 01 6月, 2012 1 次提交
  8. 25 5月, 2012 2 次提交
  9. 24 5月, 2012 1 次提交
    • O
      genirq: reimplement exit_irq_thread() hook via task_work_add() · 4d1d61a6
      Oleg Nesterov 提交于
      exit_irq_thread() and task->irq_thread are needed to handle the unexpected
      (and unlikely) exit of irq-thread.
      
      We can use task_work instead and make this all private to
      kernel/irq/manage.c, cleanup plus micro-optimization.
      
      1. rename exit_irq_thread() to irq_thread_dtor(), make it
         static, and move it up before irq_thread().
      
      2. change irq_thread() to do task_work_add(irq_thread_dtor)
         at the start and task_work_cancel() before return.
      
         tracehook_notify_resume() can never play with kthreads,
         only do_exit()->exit_task_work() can call the callback
         and this is what we want.
      
      3. remove task_struct->irq_thread and the special hook
         in do_exit().
      Signed-off-by: NOleg Nesterov <oleg@redhat.com>
      Reviewed-by: NThomas Gleixner <tglx@linutronix.de>
      Cc: David Howells <dhowells@redhat.com>
      Cc: Richard Kuo <rkuo@codeaurora.org>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Cc: Alexander Gordeev <agordeev@redhat.com>
      Cc: Chris Zankel <chris@zankel.net>
      Cc: David Smith <dsmith@redhat.com>
      Cc: "Frank Ch. Eigler" <fche@redhat.com>
      Cc: Geert Uytterhoeven <geert@linux-m68k.org>
      Cc: Larry Woodman <lwoodman@redhat.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Tejun Heo <tj@kernel.org>
      Cc: Ingo Molnar <mingo@elte.hu>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
      4d1d61a6
  10. 22 5月, 2012 1 次提交
  11. 20 5月, 2012 5 次提交
  12. 15 5月, 2012 1 次提交
    • J
      genirq: export handle_edge_irq() and irq_to_desc() · 3911ff30
      Jiri Kosina 提交于
      Export handle_edge_irq() and irq_to_desc() to modules to allow them to
      do things such as
      
      	__irq_set_handler_locked(...., handle_edge_irq);
      
      This fixes
      
      	ERROR: "handle_edge_irq" [drivers/gpio/gpio-pch.ko] undefined!
      	ERROR: "irq_to_desc" [drivers/gpio/gpio-pch.ko] undefined!
      
      when gpio-pch is being built as a module.
      
      This was introduced by commit df9541a6 ("gpio: pch9: Use proper flow
      type handlers") that added
      
      	__irq_set_handler_locked(d->irq, handle_edge_irq);
      
      but handle_edge_irq() was not exported for modules (and inlined
      __irq_set_handler_locked() requires irq_to_desc() exported as well)
      Signed-off-by: NJiri Kosina <jkosina@suse.cz>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      3911ff30
  13. 05 5月, 2012 2 次提交
    • T
      genirq: Do not consider disabled wakeup irqs · 9c6079aa
      Thomas Gleixner 提交于
      If an wakeup interrupt has been disabled before the suspend code
      disables all interrupts then we have to ignore the pending flag.
      
      Otherwise we would abort suspend over and over as nothing clears the
      pending flag because the interrupt is disabled.
      Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
      Cc: NeilBrown <neilb@suse.de>
      9c6079aa
    • T
      genirq: Allow check_wakeup_irqs to notice level-triggered interrupts · d4dc0f90
      Thomas Gleixner 提交于
      Level triggered interrupts do not cause IRQS_PENDING to be set when
      they fire while "disabled" as the 'pending' state is always present in
      the level - they automatically refire where re-enabled.
      
      However the IRQS_PENDING flag is also used to abort a suspend cycle -
      if any 'is_wakeup_set' interrupt is PENDING, check_wakeup_irqs() will
      cause suspend to abort. Without IRQS_PENDING, suspend won't abort.
      
      Consequently, level-triggered interrupts that fire during the 'noirq'
      phase of suspend do not currently abort suspend.
      
      So set IRQS_PENDING even for level triggered interrupts, and make sure
      to clear the flag in check_irq_resend.
      
      [ Changelog by courtesy of Neil ]
      Tested-by: NNeilBrown <neilb@suse.de>
      Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
      d4dc0f90
  14. 24 4月, 2012 1 次提交
    • P
      irq: hide debug macros so they don't collide with others. · 9f3045ec
      Paul Gortmaker 提交于
      The file kernel/irq/debug.h temporarily defines P, PS, PD
      and then undefines them.  However these names aren't really
      "internal" enough, and collide with other more legit users
      such as the ones in the xtensa arch, causing:
      
      In file included from kernel/irq/internals.h:58:0,
                       from kernel/irq/irqdesc.c:18:
      kernel/irq/debug.h:8:0: warning: "PS" redefined [enabled by default]
      arch/xtensa/include/asm/regs.h:59:0: note: this is the location of the previous definition
      
      Add a handful of underscores to do a better job of hiding these
      temporary macros.
      
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Signed-off-by: NPaul Gortmaker <paul.gortmaker@windriver.com>
      9f3045ec
  15. 19 4月, 2012 2 次提交
    • T
      genirq: Be more informative on irq type mismatch · f5d89470
      Thomas Gleixner 提交于
      We require that shared interrupts agree on a few flag settings. Right
      now we silently return with an error code without giving any hint why
      we reject it.
      
      Make the printout unconditionally and actually useful by printing the
      flags of the new and the already registered action.
      
      Convert all printks to pr_* and use a proper prefix while at it.
      Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
      f5d89470
    • T
      genirq: Reject bogus threaded irq requests · 1c6c6952
      Thomas Gleixner 提交于
      Requesting a threaded interrupt without a primary handler and without
      IRQF_ONESHOT set is dangerous.
      
      The core will use the default primary handler for it, which merily
      wakes the thread. For a level type interrupt this results in an
      interrupt storm, because the interrupt line is reenabled after the
      primary handler runs. The device has still the line asserted, which
      brings us back into the primary handler.
      
      While this works for edge type interrupts, we play it safe and reject
      unconditionally because we can't say for sure which type this
      interrupt really has. The type flags are unreliable as the underlying
      chip implementation can override them. And we cannot assume that
      developers using that interface know what they are doing.
      Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
      1c6c6952
  16. 13 4月, 2012 1 次提交
  17. 12 4月, 2012 1 次提交
    • G
      irq_domain: Move irq_virq_count into NOMAP revmap · 6fa6c8e2
      Grant Likely 提交于
      This patch replaces the old global setting of irq_virq_count that is only
      used by the NOMAP mapping and instead uses a revmap_data property so that
      the maximum NOMAP allocation can be set per NOMAP irq_domain.
      
      There is exactly one user of irq_virq_count in-tree right now: PS3.
      Also, irq_virq_count is only useful for the NOMAP mapping.  So,
      instead of having a single global irq_virq_count values, this change
      drops it entirely and added a max_irq argument to irq_domain_add_nomap().
      That makes it a property of an individual nomap irq domain instead of
      a global system settting.
      Signed-off-by: NGrant Likely <grant.likely@secretlab.ca>
      Tested-by: NBenjamin Herrenschmidt <benh@kernel.crashing.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Milton Miller <miltonm@bga.com>
      6fa6c8e2
  18. 11 4月, 2012 3 次提交
  19. 31 3月, 2012 1 次提交
  20. 30 3月, 2012 1 次提交
  21. 29 3月, 2012 2 次提交