All of lore.kernel.org
 help / color / mirror / Atom feed
From: shawn.guo@linaro.org (Shawn Guo)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v8 5/9] ARM: irqchip: mxs: add Alpascale ASM9260 support
Date: Tue, 4 Nov 2014 21:03:23 +0800	[thread overview]
Message-ID: <20141104130320.GB21210@tiger> (raw)
In-Reply-To: <1413888020-8790-6-git-send-email-linux@rempel-privat.de>

Thanks Jason for pointing me the thread.

On Tue, Oct 21, 2014 at 12:40:16PM +0200, Oleksij Rempel wrote:
> Freescale iMX23/iMX28 and Alphascale ASM9260 have similar
> interrupt collectors. It makes easy to reuse irq-mxs code for ASM9260.
> Differences between this devices are fallowing:
> - different register offsets
> - different count of intterupt lines per register
> - ASM9260 don't provide reset bit
> - ASM9260 don't support FIQ.
> 
> Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
> ---
>  drivers/irqchip/Kconfig                    |   9 +++
>  drivers/irqchip/Makefile                   |   2 +-
>  drivers/irqchip/alphascale_asm9260-icoll.h | 109 +++++++++++++++++++++++++++++
>  drivers/irqchip/irq-mxs.c                  | 105 ++++++++++++++++++++++++---
>  4 files changed, 216 insertions(+), 9 deletions(-)
>  create mode 100644 drivers/irqchip/alphascale_asm9260-icoll.h
> 
> diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
> index b8632bf..10470cb 100644
> --- a/drivers/irqchip/Kconfig
> +++ b/drivers/irqchip/Kconfig
> @@ -113,3 +113,12 @@ config IRQ_CROSSBAR
>  	  The primary irqchip invokes the crossbar's callback which inturn allocates
>  	  a free irq and configures the IP. Thus the peripheral interrupts are
>  	  routed to one of the free irqchip interrupt lines.
> +
> +config IRQ_MXS
> +	bool "MXS interrupt controller"
> +	select IRQ_DOMAIN
> +	select STMP_DEVICE
> +	default y if MACH_ASM9260 || CONFIG_ARCH_MXS

s/CONFIG_ARCH_MXS/ARCH_MXS

Even with this change, the 'default y' doesn't seem to work for me.

> +	help
> +	  Support for interrupt controller present in Freescale iMX23/iMX28 and
> +	  Alphascale ASM9260 SoCs.

...

> diff --git a/drivers/irqchip/irq-mxs.c b/drivers/irqchip/irq-mxs.c
> index 681125d..8c5c3d2 100644
> --- a/drivers/irqchip/irq-mxs.c
> +++ b/drivers/irqchip/irq-mxs.c
> @@ -1,5 +1,7 @@
>  /*
>   * Copyright (C) 2009-2010 Freescale Semiconductor, Inc. All Rights Reserved.
> + * Copyright (C) 2014 Oleksij Rempel <linux@rempel-privat.de>
> + *	Add Alphascale ASM9260 support.
>   *
>   * This program is free software; you can redistribute it and/or modify
>   * it under the terms of the GNU General Public License as published by
> @@ -28,6 +30,7 @@
>  #include <asm/exception.h>
>  
>  #include "irqchip.h"
> +#include "alphascale_asm9260-icoll.h"
>  
>  /*
>   * this device provide 4 offsets for each register:
> @@ -63,6 +66,33 @@ struct icoll_priv {
>  
>  static struct icoll_priv icoll_priv;
>  static struct irq_domain *icoll_domain;
> +static DEFINE_RAW_SPINLOCK(icoll_lock);
> +
> +/* calculate bit offset depending on number of intterupt per register */
> +static u32 icoll_intr_bitshift(struct irq_data *d, u32 bit)
> +{
> +	/*
> +	 * We expect intr_per_reg to be 4 or 1, it means
> +	 * "n" will be 3 or 0.
> +	 */
> +	int n = icoll_priv.intr_per_reg - 1;
> +
> +	/*
> +	 * If n = 0, "bit" is never shifted.
> +	 * If n = 3, mask lower part of hwirq to convert it
> +	 * in 0, 1, 2 or 3 and then multiply it by 8 (or shift by 3)
> +	 */
> +	return bit << ((d->hwirq & n) << n);
> +}
> +
> +/* calculate mem offset depending on number of intterupt per register */
> +static void __iomem *icoll_intr_reg(struct irq_data *d)
> +{
> +	int n = icoll_priv.intr_per_reg >> 1;
> +
> +	/* offset = hwirq / intr_per_reg * 0x10 */
> +	return icoll_priv.intr + ((d->hwirq >> n) * 0x10);
> +}
>  
>  static void icoll_ack_irq(struct irq_data *d)
>  {
> @@ -77,14 +107,21 @@ static void icoll_ack_irq(struct irq_data *d)
>  
>  static void icoll_mask_irq(struct irq_data *d)
>  {
> -	__raw_writel(BM_ICOLL_INTR_ENABLE,
> -			icoll_priv.intr + CLR_REG + HW_ICOLL_INTERRUPTn(d->hwirq));
> +	__raw_writel(icoll_intr_bitshift(d, BM_ICOLL_INTR_ENABLE),
> +			icoll_intr_reg(d) + CLR_REG);
>  }
>  
>  static void icoll_unmask_irq(struct irq_data *d)
>  {
> -	__raw_writel(BM_ICOLL_INTR_ENABLE,
> -			icoll_priv.intr + SET_REG + HW_ICOLL_INTERRUPTn(d->hwirq));
> +	raw_spin_lock(&icoll_lock);
> +	if (icoll_priv.clear)
> +		__raw_writel(ASM9260_BM_CLEAR_BIT(d->hwirq),
> +				icoll_priv.clear +
> +				ASM9260_HW_ICOLL_CLEARn(d->hwirq));
> +
> +	__raw_writel(icoll_intr_bitshift(d, BM_ICOLL_INTR_ENABLE),
> +			icoll_intr_reg(d) + SET_REG);
> +	raw_spin_unlock(&icoll_lock);
>  }
>  
>  static struct irq_chip mxs_icoll_chip = {
> @@ -116,12 +153,34 @@ static struct irq_domain_ops icoll_irq_domain_ops = {
>  	.xlate = irq_domain_xlate_onecell,
>  };
>  
> +static void __init icoll_add_domain(struct device_node *np,
> +			  int num)
> +{
> +	icoll_domain = irq_domain_add_linear(np, num,
> +					     &icoll_irq_domain_ops, NULL);
> +
> +	if (!icoll_domain)
> +		panic("%s: unable add irq domain", np->full_name);
> +	irq_set_default_host(icoll_domain);
> +	set_handle_irq(icoll_handle_irq);
> +}
> +
> +static void __iomem * __init icoll_init_iobase(struct device_node *np)
> +{
> +	void __iomem *icoll_base;
> +
> +	icoll_base = of_io_request_and_map(np, 0, np->name);

  LD      kernel/built-in.o
../drivers/irqchip/irq-mxs.c: In function ?icoll_init_iobase?:
../drivers/irqchip/irq-mxs.c:172:2: warning: passing argument 3 of ?of_io_request_and_map? discards ?const? qualifier from pointer target type [enabled by default]
In file included from ../drivers/irqchip/irq-mxs.c:27:0:
../include/linux/of_address.h:108:15: note: expected ?char *? but argument is of type ?const char *?

Shawn

> +	if (!icoll_base)
> +		panic("%s: unable to map resource", np->full_name);
> +	return icoll_base;
> +}
> +
>  static int __init icoll_of_init(struct device_node *np,
>  			  struct device_node *interrupt_parent)
>  {
> -	void __iomem *icoll_base = of_iomap(np, 0);
> -	WARN_ON(!icoll_base);
> +	void __iomem *icoll_base;
>  
> +	icoll_base		= icoll_init_iobase(np);
>  	icoll_priv.vector	= icoll_base + HW_ICOLL_VECTOR;
>  	icoll_priv.levelack	= icoll_base + HW_ICOLL_LEVELACK;
>  	icoll_priv.ctrl		= icoll_base + HW_ICOLL_CTRL;
> @@ -136,8 +195,38 @@ static int __init icoll_of_init(struct device_node *np,
>  	 */
>  	stmp_reset_block(icoll_priv.ctrl);
>  
> -	icoll_domain = irq_domain_add_linear(np, ICOLL_NUM_IRQS,
> -					     &icoll_irq_domain_ops, NULL);
> +	icoll_add_domain(np, ICOLL_NUM_IRQS);
> +
>  	return icoll_domain ? 0 : -ENODEV;
>  }
>  IRQCHIP_DECLARE(mxs, "fsl,icoll", icoll_of_init);
> +
> +static int __init asm9260_of_init(struct device_node *np,
> +			  struct device_node *interrupt_parent)
> +{
> +	void __iomem *icoll_base;
> +	int i;
> +
> +	icoll_base = icoll_init_iobase(np);
> +	icoll_priv.vector	= icoll_base + ASM9260_HW_ICOLL_VECTOR;
> +	icoll_priv.levelack	= icoll_base + ASM9260_HW_ICOLL_LEVELACK;
> +	icoll_priv.ctrl		= icoll_base + ASM9260_HW_ICOLL_CTRL;
> +	icoll_priv.stat		= icoll_base + ASM9260_HW_ICOLL_STAT_OFFSET;
> +	icoll_priv.intr		= icoll_base + ASM9260_HW_ICOLL_INTERRUPT0;
> +	icoll_priv.intr_per_reg	= 4;
> +	icoll_priv.clear	= icoll_base + ASM9260_HW_ICOLL_CLEAR0;
> +
> +	writel_relaxed(ASM9260_BM_CTRL_IRQ_ENABLE,
> +			icoll_priv.ctrl);
> +	/*
> +	 * ASM9260 don't provide reset bit. So, we need to set level 0
> +	 * manually.
> +	 */
> +	for (i = 0; i < 16 * 0x10; i += 0x10)
> +		writel(0, icoll_priv.intr + i);
> +
> +	icoll_add_domain(np, ASM9260_NUM_IRQS);
> +
> +	return icoll_domain ? 0 : -ENODEV;
> +}
> +IRQCHIP_DECLARE(asm9260, "alphascale,asm9260-icoll", asm9260_of_init);
> -- 
> 1.9.1
> 
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  parent reply	other threads:[~2014-11-04 13:03 UTC|newest]

Thread overview: 81+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-21 10:40 [PATCH v8 0/9] initial suport for Alphascale ASM9260 Oleksij Rempel
2014-10-21 10:40 ` [PATCH v8 1/9] ARM: add mach-asm9260 Oleksij Rempel
2014-10-21 10:40 ` [PATCH v8 2/9] ARM: add lolevel debug support for asm9260 Oleksij Rempel
2014-10-21 10:40 ` [PATCH v8 3/9] ARM: clk: add clk-asm9260 driver Oleksij Rempel
2014-10-21 10:40 ` [PATCH v8 4/9] ARM: irqchip: mxs: prepare driver for HW with different offsets Oleksij Rempel
2014-10-21 10:40 ` [PATCH v8 5/9] ARM: irqchip: mxs: add Alpascale ASM9260 support Oleksij Rempel
2014-11-02  2:19   ` Jason Cooper
2014-11-04 13:03   ` Shawn Guo [this message]
2014-11-04 13:13     ` Russell King - ARM Linux
2014-11-04 13:15       ` Oleksij Rempel
2014-11-04 13:16     ` Oleksij Rempel
2014-11-04 19:12     ` [PATCH v2] " Oleksij Rempel
2014-11-04 20:20       ` Thomas Gleixner
2014-11-04 20:27         ` Oleksij Rempel
2014-11-04 21:13           ` Thomas Gleixner
2014-10-21 10:40 ` [PATCH v8 6/9] ARM: clocksource: add asm9260_timer driver Oleksij Rempel
2014-10-21 10:40 ` [PATCH v8 7/9] ARM: dts: add DT for Alphascale ASM9260 SoC Oleksij Rempel
2014-10-21 10:40 ` [PATCH v8 8/9] ARM: add alphascale,acc.txt bindings documentation Oleksij Rempel
2014-10-21 10:40 ` [PATCH v8 9/9] add Alphascale to vendor-prefixes.txt Oleksij Rempel
2014-10-26 14:39 ` [PATCH v8 0/9] initial suport for Alphascale ASM9260 Oleksij Rempel
2014-10-26 15:26   ` Thomas Gleixner
2014-11-02  2:11   ` Jason Cooper
2014-11-02  6:51     ` Oleksij Rempel
2014-11-02 18:31       ` Jason Cooper
2014-11-02 19:56         ` Oleksij Rempel
2014-11-02 20:34           ` Jason Cooper
2014-11-03 14:14             ` [PATCH v3 0/2] " Oleksij Rempel
2014-11-03 14:14               ` [PATCH v3 1/2] ARM: add mach-asm9260 Oleksij Rempel
2014-11-03 14:14               ` [PATCH v3 2/2] ARM: add lolevel debug support for asm9260 Oleksij Rempel
2014-11-03 14:46                 ` Rob Herring
2014-11-04  7:34                   ` [PATCH v4] " Oleksij Rempel
2014-11-24 11:08                     ` [PATCH v4 0/2] initial suport for Alphascale ASM9260 Oleksij Rempel
2014-11-24 11:08                       ` [PATCH v4 1/2] ARM: add mach-asm9260 Oleksij Rempel
2014-11-24 11:08                       ` [PATCH v4 2/2] ARM: add lolevel debug support for asm9260 Oleksij Rempel
2014-11-28 14:09                       ` [PATCH v4 0/2] initial suport for Alphascale ASM9260 Arnd Bergmann
2014-11-28 14:13                         ` Oleksij Rempel
2014-11-28 15:05                         ` [PATCH] suport for Alphascale ASM9260, part 2 Oleksij Rempel
2014-11-28 15:05                           ` [PATCH] ARM: clk: add clk-asm9260 driver Oleksij Rempel
2014-11-28 16:34                           ` [PATCH] suport for Alphascale ASM9260, part 2 Arnd Bergmann
2015-01-08  8:59                           ` [PATCH] clk support for Alphascale asm9260 Oleksij Rempel
2015-01-08  8:59                             ` Oleksij Rempel
2015-01-08  8:59                             ` [PATCH] ARM: clk: add clk-asm9260 driver Oleksij Rempel
2015-01-08  8:59                               ` Oleksij Rempel
2015-01-14 23:02                               ` Mike Turquette
2015-01-14 23:02                                 ` Mike Turquette
2015-01-15  9:45                                 ` Oleksij Rempel
2015-01-15  9:45                                   ` Oleksij Rempel
2015-01-19 17:22                                   ` Mike Turquette
2015-01-19 17:22                                     ` Mike Turquette
2015-01-20  9:23                                     ` [PATCH v2] " Oleksij Rempel
2015-01-20 18:13                                       ` Mike Turquette
2014-11-28 16:50                         ` [PATCH 0/2] suport for Alphascale ASM9260, part 3 Oleksij Rempel
2014-11-28 16:50                           ` [PATCH 1/2] ARM: irqchip: mxs: prepare driver for HW with different offsets Oleksij Rempel
2014-11-28 16:50                           ` [PATCH 2/2] ARM: irqchip: mxs: add Alpascale ASM9260 support Oleksij Rempel
2015-09-17 13:17                             ` Oleksij Rempel
2015-09-17 14:29                               ` Thomas Gleixner
2015-01-08  9:01                           ` [PATCH 0/2] suport for Alphascale ASM9260, part 3 Oleksij Rempel
2014-11-28 16:54                         ` [PATCH 0/4] suport for Alphascale ASM9260, part 4 Oleksij Rempel
2014-11-28 16:54                           ` [PATCH 1/4] ARM: clocksource: add asm9260_timer driver Oleksij Rempel
2015-01-08  9:07                             ` [PATCH] clocksource driver for Alphascale asm9260 Oleksij Rempel
2015-01-08  9:07                               ` Oleksij Rempel
2015-01-08  9:07                               ` [PATCH] ARM: clocksource: add asm9260_timer driver Oleksij Rempel
2015-01-08  9:07                                 ` Oleksij Rempel
2015-01-20 13:56                                 ` Daniel Lezcano
2015-01-20 13:56                                   ` Daniel Lezcano
2015-01-27  7:27                                   ` [PATCH] ARM: clocksource: fix compile of asm9260_timer driver on ARCH=parisc Oleksij Rempel
2015-01-27  8:49                                     ` Daniel Lezcano
2015-01-27  8:51                                       ` Oleksij Rempel
2015-01-27  9:05                                         ` Daniel Lezcano
2014-11-28 16:54                           ` [PATCH 2/4] ARM: dts: add DT for Alphascale ASM9260 SoC Oleksij Rempel
2014-11-28 16:54                           ` [PATCH 3/4] ARM: add alphascale,acc.txt bindings documentation Oleksij Rempel
2014-11-28 16:54                           ` [PATCH 4/4] add Alphascale to vendor-prefixes.txt Oleksij Rempel
2015-01-06 11:06                           ` [PATCH 0/4] suport for Alphascale ASM9260, part 4 Oleksij Rempel
2015-01-06 14:11                             ` Arnd Bergmann
2015-01-08  9:16                               ` [PATCH 0/3] [MERGE REQUEST] DT support for Alphascale asm9260 Oleksij Rempel
2015-01-08  9:16                                 ` [PATCH 1/3] ARM: dts: add DT for Alphascale ASM9260 SoC Oleksij Rempel
2015-01-08  9:16                                 ` [PATCH 2/3] ARM: add alphascale,acc.txt bindings documentation Oleksij Rempel
2015-01-08  9:16                                 ` [PATCH 3/3] add Alphascale to vendor-prefixes.txt Oleksij Rempel
2015-01-20  0:30                                 ` [PATCH 0/3] [MERGE REQUEST] DT support for Alphascale asm9260 Olof Johansson
2015-01-20  9:19                                   ` Oleksij Rempel
2014-11-05  7:13                   ` [PATCH v3 2/2] ARM: add lolevel debug support for asm9260 Oleksij Rempel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20141104130320.GB21210@tiger \
    --to=shawn.guo@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.