Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1474821 > unrolled thread
| Started by | Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> |
|---|---|
| First post | 2016-09-02 02:40 +0200 |
| Last post | 2016-09-02 15:40 +0200 |
| Articles | 19 — 4 participants |
Back to article view | Back to linux.kernel
[Patch v4 00/12] microblaze/MIPS: xilfpga: intc and peripheral Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> - 2016-09-02 02:40 +0200
[Patch v4 10/12] net: ethernet: xilinx: Enable emaclite for MIPS Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> - 2016-09-02 02:40 +0200
[Patch v4 05/12] MIPS: xilfpga: Use irqchip_init instead of the legacy way Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> - 2016-09-02 02:40 +0200
[Patch v4 11/12] MIPS: xilfpga: Add DT node for AXI emaclite Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> - 2016-09-02 02:40 +0200
[Patch v4 02/12] irqchip: axi-intc: Clean up irqdomain argument and read/write Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> - 2016-09-02 02:40 +0200
Re: [Patch v4 02/12] irqchip: axi-intc: Clean up irqdomain argument and read/write kbuild test robot <lkp@intel.com> - 2016-09-02 03:30 +0200
[Patch v4 03/12] irqchip: axi-intc: Rename get_irq to xintc_get_irq Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> - 2016-09-02 02:40 +0200
[Patch v4 07/12] MIPS: xilfpga: Update DT node and specify uart irq Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> - 2016-09-02 02:50 +0200
[Patch v4 04/12] irqchip: axi-intc: Add support for parent intc Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> - 2016-09-02 02:50 +0200
[Patch v4 08/12] MIPS: Xilfpga: Add DT node for AXI I2C Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> - 2016-09-02 02:50 +0200
[Patch v4 09/12] net: ethernet: xilinx: Generate random mac if none found Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> - 2016-09-02 02:50 +0200
[Patch v4 12/12] MIPS: xilfpga: Update defconfig Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> - 2016-09-02 02:50 +0200
[Patch v4 01/12] microblaze: irqchip: Move intc driver to irqchip Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> - 2016-09-02 02:50 +0200
Re: [Patch v4 01/12] microblaze: irqchip: Move intc driver to irqchip Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> - 2016-09-02 12:00 +0200
Re: [Patch v4 01/12] microblaze: irqchip: Move intc driver to irqchip Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> - 2016-09-02 12:10 +0200
Re: [Patch v4 01/12] microblaze: irqchip: Move intc driver to irqchip Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> - 2016-09-02 13:50 +0200
Re: [Patch v4 01/12] microblaze: irqchip: Move intc driver to irqchip Jason Cooper <jason@lakedaemon.net> - 2016-09-02 14:50 +0200
Re: [Patch v4 01/12] microblaze: irqchip: Move intc driver to irqchip Jason Cooper <jason@lakedaemon.net> - 2016-09-02 15:30 +0200
Re: [Patch v4 01/12] microblaze: irqchip: Move intc driver to irqchip Marc Zyngier <marc.zyngier@arm.com> - 2016-09-02 15:40 +0200
| From | Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> |
|---|---|
| Date | 2016-09-02 02:40 +0200 |
| Subject | [Patch v4 00/12] microblaze/MIPS: xilfpga: intc and peripheral |
| Message-ID | <scIlj-7GM-7@gated-at.bofh.it> |
Hi, The MIPS based Xilfpga platform uses the axi interrupt controller daisy chained to the MIPS microAptiv cpu interrupt controller. This patch series moves the axi interrupt controller driver out of arch/microblaze to drivers/irqchip and then cleans it up a bit. This makes it usable by MIPS. The rest of the series basically enables drivers and adds dt nodes. Would make sense for this to go via the MIPS tree. Hence, ACKs from microblaze. irqchip and net welcome. Compile tested on microblaze-el only! Based on v4.8-rc4 Regards, ZubairLK V3 -> V4 Better error handling Some minor fixups V2 -> V3 Cleanup the interrupt controller driver a bit based on feedback Rebase to v4.8-rc4 V1 -> V2 Resubmitting without truncating the diff output for file moves Removed accidental local mac address entry Individual logs have more detail Zubair Lutfullah Kakakhel (12): microblaze: irqchip: Move intc driver to irqchip irqchip: axi-intc: Clean up irqdomain argument and read/write irqchip: axi-intc: Rename get_irq to xintc_get_irq irqchip: axi-intc: Add support for parent intc MIPS: xilfpga: Use irqchip_init instead of the legacy way MIPS: xilfpga: Use Xilinx AXI Interrupt Controller MIPS: xilfpga: Update DT node and specify uart irq MIPS: Xilfpga: Add DT node for AXI I2C net: ethernet: xilinx: Generate random mac if none found net: ethernet: xilinx: Enable emaclite for MIPS MIPS: xilfpga: Add DT node for AXI emaclite MIPS: xilfpga: Update defconfig arch/microblaze/Kconfig | 1 + arch/microblaze/include/asm/irq.h | 2 +- arch/microblaze/kernel/Makefile | 2 +- arch/microblaze/kernel/intc.c | 196 -------------------- arch/microblaze/kernel/irq.c | 4 +- arch/mips/Kconfig | 1 + arch/mips/boot/dts/xilfpga/nexys4ddr.dts | 63 +++++++ arch/mips/configs/xilfpga_defconfig | 37 +++- arch/mips/xilfpga/intc.c | 7 +- drivers/irqchip/Kconfig | 4 + drivers/irqchip/Makefile | 1 + drivers/irqchip/irq-axi-intc.c | 252 ++++++++++++++++++++++++++ drivers/net/ethernet/xilinx/Kconfig | 4 +- drivers/net/ethernet/xilinx/xilinx_emaclite.c | 8 +- 14 files changed, 371 insertions(+), 211 deletions(-) delete mode 100644 arch/microblaze/kernel/intc.c create mode 100644 drivers/irqchip/irq-axi-intc.c -- 1.9.1
[toc] | [next] | [standalone]
| From | Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> |
|---|---|
| Date | 2016-09-02 02:40 +0200 |
| Subject | [Patch v4 10/12] net: ethernet: xilinx: Enable emaclite for MIPS |
| Message-ID | <scKGt-BN-15@gated-at.bofh.it> |
| In reply to | #1474821 |
The MIPS based xilfpga platform uses this driver. Enable it for MIPS Signed-off-by: Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> --- V3 -> V4 Removed unnecesary braces V2 -> V3 No change V1 -> V2 No change --- drivers/net/ethernet/xilinx/Kconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/xilinx/Kconfig b/drivers/net/ethernet/xilinx/Kconfig index 4f5c024..6d68c8a 100644 --- a/drivers/net/ethernet/xilinx/Kconfig +++ b/drivers/net/ethernet/xilinx/Kconfig @@ -5,7 +5,7 @@ config NET_VENDOR_XILINX bool "Xilinx devices" default y - depends on PPC || PPC32 || MICROBLAZE || ARCH_ZYNQ + depends on PPC || PPC32 || MICROBLAZE || ARCH_ZYNQ || MIPS ---help--- If you have a network (Ethernet) card belonging to this class, say Y. @@ -18,7 +18,7 @@ if NET_VENDOR_XILINX config XILINX_EMACLITE tristate "Xilinx 10/100 Ethernet Lite support" - depends on (PPC32 || MICROBLAZE || ARCH_ZYNQ) + depends on PPC32 || MICROBLAZE || ARCH_ZYNQ || MIPS select PHYLIB ---help--- This driver supports the 10/100 Ethernet Lite from Xilinx. -- 1.9.1
[toc] | [prev] | [next] | [standalone]
| From | Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> |
|---|---|
| Date | 2016-09-02 02:40 +0200 |
| Subject | [Patch v4 05/12] MIPS: xilfpga: Use irqchip_init instead of the legacy way |
| Message-ID | <scKGt-BN-11@gated-at.bofh.it> |
| In reply to | #1474821 |
This prepares the code use the Xilinx AXI Interrupt Controller
driver now available in drivers/irqchip/irq-axi-intc.c
Signed-off-by: Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com>
---
V3 -> V4
Corrected commit message. Was irq-xilinx.c. Now irq-axi-intc.c
V2 -> V3
No change
V1 -> V2
No change
---
arch/mips/xilfpga/intc.c | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/arch/mips/xilfpga/intc.c b/arch/mips/xilfpga/intc.c
index c4d1a71..a127cca 100644
--- a/arch/mips/xilfpga/intc.c
+++ b/arch/mips/xilfpga/intc.c
@@ -11,15 +11,12 @@
#include <linux/of.h>
#include <linux/of_irq.h>
+#include <linux/irqchip.h>
#include <asm/irq_cpu.h>
-static struct of_device_id of_irq_ids[] __initdata = {
- { .compatible = "mti,cpu-interrupt-controller", .data = mips_cpu_irq_of_init },
- {},
-};
void __init arch_init_irq(void)
{
- of_irq_init(of_irq_ids);
+ irqchip_init();
}
--
1.9.1
[toc] | [prev] | [next] | [standalone]
| From | Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> |
|---|---|
| Date | 2016-09-02 02:40 +0200 |
| Subject | [Patch v4 11/12] MIPS: xilfpga: Add DT node for AXI emaclite |
| Message-ID | <scKGt-BN-21@gated-at.bofh.it> |
| In reply to | #1474821 |
The xilfpga platform has a Xilinx AXI emaclite block.
Add the DT node to use it.
Signed-off-by: Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com>
---
V3 -> V4
No change
V2 -> V3
No change
V1 -> V2
Removed accidental local-mac-address entry
---
arch/mips/boot/dts/xilfpga/nexys4ddr.dts | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/arch/mips/boot/dts/xilfpga/nexys4ddr.dts b/arch/mips/boot/dts/xilfpga/nexys4ddr.dts
index f5ebab8..09a62f2 100644
--- a/arch/mips/boot/dts/xilfpga/nexys4ddr.dts
+++ b/arch/mips/boot/dts/xilfpga/nexys4ddr.dts
@@ -42,6 +42,32 @@
xlnx,tri-default = <0xffffffff>;
} ;
+ axi_ethernetlite: ethernet@10e00000 {
+ compatible = "xlnx,xps-ethernetlite-3.00.a";
+ device_type = "network";
+ interrupt-parent = <&axi_intc>;
+ interrupts = <1>;
+ phy-handle = <&phy0>;
+ reg = <0x10e00000 0x10000>;
+ xlnx,duplex = <0x1>;
+ xlnx,include-global-buffers = <0x1>;
+ xlnx,include-internal-loopback = <0x0>;
+ xlnx,include-mdio = <0x1>;
+ xlnx,instance = "axi_ethernetlite_inst";
+ xlnx,rx-ping-pong = <0x1>;
+ xlnx,s-axi-id-width = <0x1>;
+ xlnx,tx-ping-pong = <0x1>;
+ xlnx,use-internal = <0x0>;
+ mdio {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ phy0: phy@1 {
+ device_type = "ethernet-phy";
+ reg = <1>;
+ };
+ };
+ };
+
axi_uart16550: serial@10400000 {
compatible = "ns16550a";
reg = <0x10400000 0x10000>;
--
1.9.1
[toc] | [prev] | [next] | [standalone]
| From | Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> |
|---|---|
| Date | 2016-09-02 02:40 +0200 |
| Subject | [Patch v4 02/12] irqchip: axi-intc: Clean up irqdomain argument and read/write |
| Message-ID | <scIlj-7GM-13@gated-at.bofh.it> |
| In reply to | #1474821 |
The drivers read/write function handling is a bit quirky.
And the irqmask is passed directly to the handler.
Add a new irqchip struct to pass to the handler and
cleanup read/write handling.
Signed-off-by: Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com>
---
V3 -> V4
Better error handling for kzalloc
Erroring out if the axi intc is probed twice as that isn't
supported
V2 -> V3
New patch. Cleans up driver structure
---
drivers/irqchip/irq-axi-intc.c | 101 +++++++++++++++++++++++++++--------------
1 file changed, 68 insertions(+), 33 deletions(-)
diff --git a/drivers/irqchip/irq-axi-intc.c b/drivers/irqchip/irq-axi-intc.c
index 90bec7d..7ab0762 100644
--- a/drivers/irqchip/irq-axi-intc.c
+++ b/drivers/irqchip/irq-axi-intc.c
@@ -16,8 +16,6 @@
#include <linux/io.h>
#include <linux/bug.h>
-static void __iomem *intc_baseaddr;
-
/* No one else should require these constants, so define them locally here. */
#define ISR 0x00 /* Interrupt Status Register */
#define IPR 0x04 /* Interrupt Pending Register */
@@ -31,8 +29,16 @@ static void __iomem *intc_baseaddr;
#define MER_ME (1<<0)
#define MER_HIE (1<<1)
-static unsigned int (*read_fn)(void __iomem *);
-static void (*write_fn)(u32, void __iomem *);
+struct xintc_irq_chip {
+ void __iomem *base;
+ struct irq_domain *domain;
+ struct irq_chip chip;
+ u32 intr_mask;
+ unsigned int (*read)(void __iomem *iomem);
+ void (*write)(u32 data, void __iomem *iomem);
+};
+
+static struct xintc_irq_chip *xintc_irqc;
static void intc_write32(u32 val, void __iomem *addr)
{
@@ -54,6 +60,18 @@ static unsigned int intc_read32_be(void __iomem *addr)
return ioread32be(addr);
}
+static inline unsigned int xintc_read(struct xintc_irq_chip *xintc_irqc,
+ int reg)
+{
+ return xintc_irqc->read(xintc_irqc->base + reg);
+}
+
+static inline void xintc_write(struct xintc_irq_chip *xintc_irqc,
+ int reg, u32 data)
+{
+ xintc_irqc->write(data, xintc_irqc->base + reg);
+}
+
static void intc_enable_or_unmask(struct irq_data *d)
{
unsigned long mask = 1 << d->hwirq;
@@ -65,21 +83,21 @@ static void intc_enable_or_unmask(struct irq_data *d)
* acks the irq before calling the interrupt handler
*/
if (irqd_is_level_type(d))
- write_fn(mask, intc_baseaddr + IAR);
+ xintc_write(xintc_irqc, IAR, mask);
- write_fn(mask, intc_baseaddr + SIE);
+ xintc_write(xintc_irqc, SIE, mask);
}
static void intc_disable_or_mask(struct irq_data *d)
{
pr_debug("disable: %ld\n", d->hwirq);
- write_fn(1 << d->hwirq, intc_baseaddr + CIE);
+ xintc_write(xintc_irqc, CIE, 1 << d->hwirq);
}
static void intc_ack(struct irq_data *d)
{
pr_debug("ack: %ld\n", d->hwirq);
- write_fn(1 << d->hwirq, intc_baseaddr + IAR);
+ xintc_write(xintc_irqc, IAR, 1 << d->hwirq);
}
static void intc_mask_ack(struct irq_data *d)
@@ -87,8 +105,8 @@ static void intc_mask_ack(struct irq_data *d)
unsigned long mask = 1 << d->hwirq;
pr_debug("disable_and_ack: %ld\n", d->hwirq);
- write_fn(mask, intc_baseaddr + CIE);
- write_fn(mask, intc_baseaddr + IAR);
+ xintc_write(xintc_irqc, CIE, mask);
+ xintc_write(xintc_irqc, IAR, mask);
}
static struct irq_chip intc_dev = {
@@ -105,7 +123,7 @@ unsigned int get_irq(void)
{
unsigned int hwirq, irq = -1;
- hwirq = read_fn(intc_baseaddr + IVR);
+ hwirq = xintc_read(xintc_irqc, IVR);
if (hwirq != -1U)
irq = irq_find_mapping(root_domain, hwirq);
@@ -116,7 +134,8 @@ unsigned int get_irq(void)
static int xintc_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw)
{
- u32 intr_mask = (u32)d->host_data;
+ struct xintc_irq_chip *irqc = d->host_data;
+ u32 intr_mask = irqc->intr_mask;
if (intr_mask & (1 << hw)) {
irq_set_chip_and_handler_name(irq, &intc_dev,
@@ -138,59 +157,75 @@ static const struct irq_domain_ops xintc_irq_domain_ops = {
static int __init xilinx_intc_of_init(struct device_node *intc,
struct device_node *parent)
{
- u32 nr_irq, intr_mask;
+ u32 nr_irq;
int ret;
+ struct xintc_irq_chip *irqc;
+
+ irqc = kzalloc(sizeof(*irqc), GFP_KERNEL);
+ if (!irqc)
+ return -ENOMEM;
- intc_baseaddr = of_iomap(intc, 0);
- BUG_ON(!intc_baseaddr);
+ if (xintc_irqc) {
+ pr_err("%s: Multiple instances of axi_intc aren't supported\n");
+ ret = -EINVAL;
+ goto err_alloc;
+ } else {
+ xintc_irqc = irqc;
+ }
+
+ irqc->base = of_iomap(intc, 0);
+ BUG_ON(!irqc->base);
ret = of_property_read_u32(intc, "xlnx,num-intr-inputs", &nr_irq);
if (ret < 0) {
pr_err("%s: unable to read xlnx,num-intr-inputs\n", __func__);
- return ret;
+ goto err_alloc;
}
- ret = of_property_read_u32(intc, "xlnx,kind-of-intr", &intr_mask);
+ ret = of_property_read_u32(intc, "xlnx,kind-of-intr", &irqc->intr_mask);
if (ret < 0) {
pr_err("%s: unable to read xlnx,kind-of-intr\n", __func__);
- return ret;
+ goto err_alloc;
}
- if (intr_mask >> nr_irq)
+ if (irqc->intr_mask >> nr_irq)
pr_warn("%s: mismatch in kind-of-intr param\n", __func__);
pr_info("%s: num_irq=%d, edge=0x%x\n",
- intc->full_name, nr_irq, intr_mask);
+ intc->full_name, nr_irq, irqc->intr_mask);
- write_fn = intc_write32;
- read_fn = intc_read32;
+ irqc->read = intc_read32;
+ irqc->write = intc_write32;
/*
* Disable all external interrupts until they are
* explicity requested.
*/
- write_fn(0, intc_baseaddr + IER);
+ xintc_write(irqc, IER, 0);
/* Acknowledge any pending interrupts just in case. */
- write_fn(0xffffffff, intc_baseaddr + IAR);
+ xintc_write(irqc, IAR, 0xffffffff);
/* Turn on the Master Enable. */
- write_fn(MER_HIE | MER_ME, intc_baseaddr + MER);
- if (!(read_fn(intc_baseaddr + MER) & (MER_HIE | MER_ME))) {
- write_fn = intc_write32_be;
- read_fn = intc_read32_be;
- write_fn(MER_HIE | MER_ME, intc_baseaddr + MER);
+ xintc_write(irqc, MER, MER_HIE | MER_ME);
+ if (!(xintc_read(irqc, MER) & (MER_HIE | MER_ME))) {
+ irqc->read = intc_read32_be;
+ irqc->write = intc_write32_be;
+ xintc_write(irqc, MER, MER_HIE | MER_ME);
}
- /* Yeah, okay, casting the intr_mask to a void* is butt-ugly, but I'm
- * lazy and Michal can clean it up to something nicer when he tests
- * and commits this patch. ~~gcl */
root_domain = irq_domain_add_linear(intc, nr_irq, &xintc_irq_domain_ops,
- (void *)intr_mask);
+ irqc);
irq_set_default_host(root_domain);
return 0;
+
+err_alloc:
+ xintc_irqc = NULL;
+ kfree(irqc);
+ return ret;
+
}
IRQCHIP_DECLARE(xilinx_intc, "xlnx,xps-intc-1.00.a", xilinx_intc_of_init);
--
1.9.1
[toc] | [prev] | [next] | [standalone]
| From | kbuild test robot <lkp@intel.com> |
|---|---|
| Date | 2016-09-02 03:30 +0200 |
| Subject | Re: [Patch v4 02/12] irqchip: axi-intc: Clean up irqdomain argument and read/write |
| Message-ID | <scLsR-17o-1@gated-at.bofh.it> |
| In reply to | #1474825 |
[Multipart message — attachments visible in raw view] — view raw
Hi Zubair,
[auto build test WARNING on tip/irq/core]
[also build test WARNING on v4.8-rc4 next-20160825]
[cannot apply to linus/master linux/master]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
[Suggest to use git(>=2.9.0) format-patch --base=<commit> (or --base=auto for convenience) to record what (public, well-known) commit your patch series was built on]
[Check https://git-scm.com/docs/git-format-patch for more information]
url: https://github.com/0day-ci/linux/commits/Zubair-Lutfullah-Kakakhel/microblaze-MIPS-xilfpga-intc-and-peripheral/20160902-084739
config: microblaze-mmu_defconfig (attached as .config)
compiler: microblaze-linux-gcc (GCC) 4.9.0
reproduce:
wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=microblaze
All warnings (new ones prefixed by >>):
drivers/irqchip/irq-axi-intc.c: In function 'xilinx_intc_of_init':
>> drivers/irqchip/irq-axi-intc.c:169:3: warning: format '%s' expects a matching 'char *' argument [-Wformat=]
pr_err("%s: Multiple instances of axi_intc aren't supported\n");
^
vim +169 drivers/irqchip/irq-axi-intc.c
153 .xlate = irq_domain_xlate_onetwocell,
154 .map = xintc_map,
155 };
156
157 static int __init xilinx_intc_of_init(struct device_node *intc,
158 struct device_node *parent)
159 {
160 u32 nr_irq;
161 int ret;
162 struct xintc_irq_chip *irqc;
163
164 irqc = kzalloc(sizeof(*irqc), GFP_KERNEL);
165 if (!irqc)
166 return -ENOMEM;
167
168 if (xintc_irqc) {
> 169 pr_err("%s: Multiple instances of axi_intc aren't supported\n");
170 ret = -EINVAL;
171 goto err_alloc;
172 } else {
173 xintc_irqc = irqc;
174 }
175
176 irqc->base = of_iomap(intc, 0);
177 BUG_ON(!irqc->base);
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[toc] | [prev] | [next] | [standalone]
| From | Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> |
|---|---|
| Date | 2016-09-02 02:40 +0200 |
| Subject | [Patch v4 03/12] irqchip: axi-intc: Rename get_irq to xintc_get_irq |
| Message-ID | <scKGt-BN-19@gated-at.bofh.it> |
| In reply to | #1474821 |
Now that the driver is generic and used by multiple archs,
get_irq is too generic.
Rename get_irq to xintc_get_irq to avoid any conflicts
Signed-off-by: Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com>
---
V3 -> V4
New patch.
---
arch/microblaze/include/asm/irq.h | 2 +-
arch/microblaze/kernel/irq.c | 4 ++--
drivers/irqchip/irq-axi-intc.c | 4 ++--
3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/arch/microblaze/include/asm/irq.h b/arch/microblaze/include/asm/irq.h
index bab3b13..d785def 100644
--- a/arch/microblaze/include/asm/irq.h
+++ b/arch/microblaze/include/asm/irq.h
@@ -16,6 +16,6 @@ struct pt_regs;
extern void do_IRQ(struct pt_regs *regs);
/* should be defined in each interrupt controller driver */
-extern unsigned int get_irq(void);
+extern unsigned int xintc_get_irq(void);
#endif /* _ASM_MICROBLAZE_IRQ_H */
diff --git a/arch/microblaze/kernel/irq.c b/arch/microblaze/kernel/irq.c
index 11e24de..903dad8 100644
--- a/arch/microblaze/kernel/irq.c
+++ b/arch/microblaze/kernel/irq.c
@@ -29,12 +29,12 @@ void __irq_entry do_IRQ(struct pt_regs *regs)
trace_hardirqs_off();
irq_enter();
- irq = get_irq();
+ irq = xintc_get_irq();
next_irq:
BUG_ON(!irq);
generic_handle_irq(irq);
- irq = get_irq();
+ irq = xintc_get_irq();
if (irq != -1U) {
pr_debug("next irq: %d\n", irq);
++concurrent_irq;
diff --git a/drivers/irqchip/irq-axi-intc.c b/drivers/irqchip/irq-axi-intc.c
index 7ab0762..ac31548 100644
--- a/drivers/irqchip/irq-axi-intc.c
+++ b/drivers/irqchip/irq-axi-intc.c
@@ -119,7 +119,7 @@ static struct irq_chip intc_dev = {
static struct irq_domain *root_domain;
-unsigned int get_irq(void)
+unsigned int xintc_get_irq(void)
{
unsigned int hwirq, irq = -1;
@@ -127,7 +127,7 @@ unsigned int get_irq(void)
if (hwirq != -1U)
irq = irq_find_mapping(root_domain, hwirq);
- pr_debug("get_irq: hwirq=%d, irq=%d\n", hwirq, irq);
+ pr_debug("xintc_get_irq: hwirq=%d, irq=%d\n", hwirq, irq);
return irq;
}
--
1.9.1
[toc] | [prev] | [next] | [standalone]
| From | Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> |
|---|---|
| Date | 2016-09-02 02:50 +0200 |
| Subject | [Patch v4 07/12] MIPS: xilfpga: Update DT node and specify uart irq |
| Message-ID | <scKQ9-Fd-7@gated-at.bofh.it> |
| In reply to | #1474821 |
Update the DT node with the UART irq Signed-off-by: Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> --- V3 -> V4 No change V2 -> V3 No change V1 -> V2 No change --- arch/mips/boot/dts/xilfpga/nexys4ddr.dts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/arch/mips/boot/dts/xilfpga/nexys4ddr.dts b/arch/mips/boot/dts/xilfpga/nexys4ddr.dts index 8db660b..d285c8d 100644 --- a/arch/mips/boot/dts/xilfpga/nexys4ddr.dts +++ b/arch/mips/boot/dts/xilfpga/nexys4ddr.dts @@ -50,6 +50,9 @@ reg-offset = <0x1000>; clocks = <&ext>; + + interrupt-parent = <&axi_intc>; + interrupts = <0>; }; }; -- 1.9.1
[toc] | [prev] | [next] | [standalone]
| From | Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> |
|---|---|
| Date | 2016-09-02 02:50 +0200 |
| Subject | [Patch v4 04/12] irqchip: axi-intc: Add support for parent intc |
| Message-ID | <scIlj-7GM-9@gated-at.bofh.it> |
| In reply to | #1474821 |
The MIPS based xilfpga platform has the following IRQ structure
Peripherals --> xilinx_intcontroller -> mips_cpu_int controller
Add support for the driver to chain the irq handler
Signed-off-by: Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com>
---
V3 -> V4
Clean up if/else when a parent is found
Pass irqchip structure to handler as data
V2 -> V3
Reused existing parent node instead of finding again.
Cleanup up handler based on review
V1 -> V2
No change
---
drivers/irqchip/irq-axi-intc.c | 25 +++++++++++++++++++++++--
1 file changed, 23 insertions(+), 2 deletions(-)
diff --git a/drivers/irqchip/irq-axi-intc.c b/drivers/irqchip/irq-axi-intc.c
index ac31548..683b1f7 100644
--- a/drivers/irqchip/irq-axi-intc.c
+++ b/drivers/irqchip/irq-axi-intc.c
@@ -15,6 +15,7 @@
#include <linux/of_address.h>
#include <linux/io.h>
#include <linux/bug.h>
+#include <linux/of_irq.h>
/* No one else should require these constants, so define them locally here. */
#define ISR 0x00 /* Interrupt Status Register */
@@ -154,11 +155,23 @@ static const struct irq_domain_ops xintc_irq_domain_ops = {
.map = xintc_map,
};
+static void xil_intc_irq_handler(struct irq_desc *desc)
+{
+ u32 pending;
+
+ do {
+ pending = xintc_get_irq();
+ if (pending == -1U)
+ break;
+ generic_handle_irq(pending);
+ } while (true);
+}
+
static int __init xilinx_intc_of_init(struct device_node *intc,
struct device_node *parent)
{
u32 nr_irq;
- int ret;
+ int ret, irq;
struct xintc_irq_chip *irqc;
irqc = kzalloc(sizeof(*irqc), GFP_KERNEL);
@@ -217,7 +230,15 @@ static int __init xilinx_intc_of_init(struct device_node *intc,
root_domain = irq_domain_add_linear(intc, nr_irq, &xintc_irq_domain_ops,
irqc);
- irq_set_default_host(root_domain);
+ if (parent) {
+ irq = irq_of_parse_and_map(intc, 0);
+ if (irq)
+ irq_set_chained_handler_and_data(irq,
+ xil_intc_irq_handler,
+ irqc);
+
+ } else
+ irq_set_default_host(root_domain);
return 0;
--
1.9.1
[toc] | [prev] | [next] | [standalone]
| From | Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> |
|---|---|
| Date | 2016-09-02 02:50 +0200 |
| Subject | [Patch v4 08/12] MIPS: Xilfpga: Add DT node for AXI I2C |
| Message-ID | <scKQ9-Fd-9@gated-at.bofh.it> |
| In reply to | #1474821 |
The xilfpga platform has an AXI I2C Bus master with a temperature
sensor connected to it.
Add the device tree node to use them.
Signed-off-by: Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com>
---
V3 -> V4
changed compatible string from "adt7420" to "adi,adt7420"
V2 -> V3
No change
V1 -> V2
No change
---
arch/mips/boot/dts/xilfpga/nexys4ddr.dts | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/arch/mips/boot/dts/xilfpga/nexys4ddr.dts b/arch/mips/boot/dts/xilfpga/nexys4ddr.dts
index d285c8d..f5ebab8 100644
--- a/arch/mips/boot/dts/xilfpga/nexys4ddr.dts
+++ b/arch/mips/boot/dts/xilfpga/nexys4ddr.dts
@@ -54,6 +54,28 @@
interrupt-parent = <&axi_intc>;
interrupts = <0>;
};
+
+ axi_i2c: i2c@10A00000 {
+ compatible = "xlnx,xps-iic-2.00.a";
+ interrupt-parent = <&axi_intc>;
+ interrupts = <4>;
+ reg = < 0x10A00000 0x10000 >;
+ clocks = <&ext>;
+ xlnx,clk-freq = <0x5f5e100>;
+ xlnx,family = "Artix7";
+ xlnx,gpo-width = <0x1>;
+ xlnx,iic-freq = <0x186a0>;
+ xlnx,scl-inertial-delay = <0x0>;
+ xlnx,sda-inertial-delay = <0x0>;
+ xlnx,ten-bit-adr = <0x0>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ ad7420@4B {
+ compatible = "adi,adt7420";
+ reg = <0x4B>;
+ };
+ } ;
};
&ext {
--
1.9.1
[toc] | [prev] | [next] | [standalone]
| From | Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> |
|---|---|
| Date | 2016-09-02 02:50 +0200 |
| Subject | [Patch v4 09/12] net: ethernet: xilinx: Generate random mac if none found |
| Message-ID | <scKQa-Fd-21@gated-at.bofh.it> |
| In reply to | #1474821 |
At the moment, if the emaclite device doesn't find a mac address
from any source, it simply uses 0x0 with a warning printed.
Instead of using a 0x0 mac address, use a randomly generated one.
Signed-off-by: Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com>
---
V3 -> V4
Curly braces after if check for correct styling
V2 -> V3
No change
V1 -> V2
New patch
---
drivers/net/ethernet/xilinx/xilinx_emaclite.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/drivers/net/ethernet/xilinx/xilinx_emaclite.c b/drivers/net/ethernet/xilinx/xilinx_emaclite.c
index 3cee84a..efc8d2e 100644
--- a/drivers/net/ethernet/xilinx/xilinx_emaclite.c
+++ b/drivers/net/ethernet/xilinx/xilinx_emaclite.c
@@ -1131,11 +1131,13 @@ static int xemaclite_of_probe(struct platform_device *ofdev)
lp->rx_ping_pong = get_bool(ofdev, "xlnx,rx-ping-pong");
mac_address = of_get_mac_address(ofdev->dev.of_node);
- if (mac_address)
+ if (mac_address) {
/* Set the MAC address. */
memcpy(ndev->dev_addr, mac_address, ETH_ALEN);
- else
- dev_warn(dev, "No MAC address found\n");
+ } else {
+ dev_warn(dev, "No MAC address found. Generating Random one\n");
+ eth_hw_addr_random(ndev);
+ }
/* Clear the Tx CSR's in case this is a restart */
__raw_writel(0, lp->base_addr + XEL_TSR_OFFSET);
--
1.9.1
[toc] | [prev] | [next] | [standalone]
| From | Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> |
|---|---|
| Date | 2016-09-02 02:50 +0200 |
| Subject | [Patch v4 12/12] MIPS: xilfpga: Update defconfig |
| Message-ID | <scKQ9-Fd-15@gated-at.bofh.it> |
| In reply to | #1474821 |
Update defconfig to enable emaclite, i2c, temp sensor found on the xilfpga platform Signed-off-by: Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> --- V3 -> V4 No change V2 -> V3 No change V1 -> V2 No change --- arch/mips/configs/xilfpga_defconfig | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/arch/mips/configs/xilfpga_defconfig b/arch/mips/configs/xilfpga_defconfig index ed1dce3..829c637 100644 --- a/arch/mips/configs/xilfpga_defconfig +++ b/arch/mips/configs/xilfpga_defconfig @@ -7,6 +7,12 @@ CONFIG_EMBEDDED=y CONFIG_SLAB=y # CONFIG_BLOCK is not set # CONFIG_SUSPEND is not set +CONFIG_NET=y +CONFIG_PACKET=y +CONFIG_UNIX=y +CONFIG_INET=y +# CONFIG_IPV6 is not set +# CONFIG_WIRELESS is not set # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y @@ -14,6 +20,30 @@ CONFIG_DEVTMPFS_MOUNT=y # CONFIG_PREVENT_FIRMWARE_BUILD is not set # CONFIG_FW_LOADER is not set # CONFIG_ALLOW_DEV_COREDUMP is not set +CONFIG_NETDEVICES=y +# CONFIG_NET_CORE is not set +# CONFIG_NET_VENDOR_ARC is not set +# CONFIG_NET_CADENCE is not set +# CONFIG_NET_VENDOR_BROADCOM is not set +# CONFIG_NET_VENDOR_EZCHIP is not set +# CONFIG_NET_VENDOR_INTEL is not set +# CONFIG_NET_VENDOR_MARVELL is not set +# CONFIG_NET_VENDOR_MICREL is not set +# CONFIG_NET_VENDOR_NATSEMI is not set +# CONFIG_NET_VENDOR_NETRONOME is not set +# CONFIG_NET_VENDOR_QUALCOMM is not set +# CONFIG_NET_VENDOR_RENESAS is not set +# CONFIG_NET_VENDOR_ROCKER is not set +# CONFIG_NET_VENDOR_SAMSUNG is not set +# CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_SMSC is not set +# CONFIG_NET_VENDOR_STMICRO is not set +# CONFIG_NET_VENDOR_SYNOPSYS is not set +# CONFIG_NET_VENDOR_VIA is not set +# CONFIG_NET_VENDOR_WIZNET is not set +CONFIG_XILINX_EMACLITE=y +CONFIG_SMSC_PHY=y +# CONFIG_WLAN is not set # CONFIG_INPUT_MOUSEDEV is not set # CONFIG_INPUT_KEYBOARD is not set # CONFIG_INPUT_MOUSE is not set @@ -25,13 +55,18 @@ CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_OF_PLATFORM=y # CONFIG_HW_RANDOM is not set +CONFIG_I2C=y +CONFIG_I2C_CHARDEV=y +# CONFIG_I2C_HELPER_AUTO is not set +CONFIG_I2C_XILINX=y CONFIG_GPIO_SYSFS=y CONFIG_GPIO_XILINX=y -# CONFIG_HWMON is not set +CONFIG_SENSORS_ADT7410=y # CONFIG_USB_SUPPORT is not set # CONFIG_MIPS_PLATFORM_DEVICES is not set # CONFIG_IOMMU_SUPPORT is not set # CONFIG_PROC_PAGE_MONITOR is not set +CONFIG_TMPFS=y # CONFIG_MISC_FILESYSTEMS is not set CONFIG_PANIC_ON_OOPS=y # CONFIG_SCHED_DEBUG is not set -- 1.9.1
[toc] | [prev] | [next] | [standalone]
| From | Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> |
|---|---|
| Date | 2016-09-02 02:50 +0200 |
| Subject | [Patch v4 01/12] microblaze: irqchip: Move intc driver to irqchip |
| Message-ID | <scKQ9-Fd-17@gated-at.bofh.it> |
| In reply to | #1474821 |
The Xilinx AXI Interrupt Controller IP block is used by the MIPS
based xilfpga platform.
Move the interrupt controller code out of arch/microblaze so that
it can be used by everyone
Signed-off-by: Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com>
---
V3 -> V4
No change
V2 -> V3
No change here. Cleanup patches follow after this patch.
Its debatable to cleanup before/after move. Decided to place cleanup
after move to put history in new place.
V1 -> V2
Renamed irq-xilinx to irq-axi-intc
Renamed CONFIG_XILINX_INTC to CONFIG_XILINX_AXI_INTC
Patch is now without rename flag so as to facilitate review
---
arch/microblaze/Kconfig | 1 +
arch/microblaze/kernel/Makefile | 2 +-
arch/microblaze/kernel/intc.c | 196 ----------------------------------------
drivers/irqchip/Kconfig | 4 +
drivers/irqchip/Makefile | 1 +
drivers/irqchip/irq-axi-intc.c | 196 ++++++++++++++++++++++++++++++++++++++++
6 files changed, 203 insertions(+), 197 deletions(-)
delete mode 100644 arch/microblaze/kernel/intc.c
create mode 100644 drivers/irqchip/irq-axi-intc.c
diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig
index 86f6572..a9ddcaa 100644
--- a/arch/microblaze/Kconfig
+++ b/arch/microblaze/Kconfig
@@ -27,6 +27,7 @@ config MICROBLAZE
select HAVE_MEMBLOCK_NODE_MAP
select HAVE_OPROFILE
select IRQ_DOMAIN
+ select XILINX_AXI_INTC
select MODULES_USE_ELF_RELA
select OF
select OF_EARLY_FLATTREE
diff --git a/arch/microblaze/kernel/Makefile b/arch/microblaze/kernel/Makefile
index f08baca..e098381 100644
--- a/arch/microblaze/kernel/Makefile
+++ b/arch/microblaze/kernel/Makefile
@@ -15,7 +15,7 @@ endif
extra-y := head.o vmlinux.lds
obj-y += dma.o exceptions.o \
- hw_exception_handler.o intc.o irq.o \
+ hw_exception_handler.o irq.o \
platform.o process.o prom.o ptrace.o \
reset.o setup.o signal.o sys_microblaze.o timer.o traps.o unwind.o
diff --git a/arch/microblaze/kernel/intc.c b/arch/microblaze/kernel/intc.c
deleted file mode 100644
index 90bec7d..0000000
--- a/arch/microblaze/kernel/intc.c
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Copyright (C) 2007-2013 Michal Simek <monstr@monstr.eu>
- * Copyright (C) 2012-2013 Xilinx, Inc.
- * Copyright (C) 2007-2009 PetaLogix
- * Copyright (C) 2006 Atmark Techno, Inc.
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- */
-
-#include <linux/irqdomain.h>
-#include <linux/irq.h>
-#include <linux/irqchip.h>
-#include <linux/of_address.h>
-#include <linux/io.h>
-#include <linux/bug.h>
-
-static void __iomem *intc_baseaddr;
-
-/* No one else should require these constants, so define them locally here. */
-#define ISR 0x00 /* Interrupt Status Register */
-#define IPR 0x04 /* Interrupt Pending Register */
-#define IER 0x08 /* Interrupt Enable Register */
-#define IAR 0x0c /* Interrupt Acknowledge Register */
-#define SIE 0x10 /* Set Interrupt Enable bits */
-#define CIE 0x14 /* Clear Interrupt Enable bits */
-#define IVR 0x18 /* Interrupt Vector Register */
-#define MER 0x1c /* Master Enable Register */
-
-#define MER_ME (1<<0)
-#define MER_HIE (1<<1)
-
-static unsigned int (*read_fn)(void __iomem *);
-static void (*write_fn)(u32, void __iomem *);
-
-static void intc_write32(u32 val, void __iomem *addr)
-{
- iowrite32(val, addr);
-}
-
-static unsigned int intc_read32(void __iomem *addr)
-{
- return ioread32(addr);
-}
-
-static void intc_write32_be(u32 val, void __iomem *addr)
-{
- iowrite32be(val, addr);
-}
-
-static unsigned int intc_read32_be(void __iomem *addr)
-{
- return ioread32be(addr);
-}
-
-static void intc_enable_or_unmask(struct irq_data *d)
-{
- unsigned long mask = 1 << d->hwirq;
-
- pr_debug("enable_or_unmask: %ld\n", d->hwirq);
-
- /* ack level irqs because they can't be acked during
- * ack function since the handle_level_irq function
- * acks the irq before calling the interrupt handler
- */
- if (irqd_is_level_type(d))
- write_fn(mask, intc_baseaddr + IAR);
-
- write_fn(mask, intc_baseaddr + SIE);
-}
-
-static void intc_disable_or_mask(struct irq_data *d)
-{
- pr_debug("disable: %ld\n", d->hwirq);
- write_fn(1 << d->hwirq, intc_baseaddr + CIE);
-}
-
-static void intc_ack(struct irq_data *d)
-{
- pr_debug("ack: %ld\n", d->hwirq);
- write_fn(1 << d->hwirq, intc_baseaddr + IAR);
-}
-
-static void intc_mask_ack(struct irq_data *d)
-{
- unsigned long mask = 1 << d->hwirq;
-
- pr_debug("disable_and_ack: %ld\n", d->hwirq);
- write_fn(mask, intc_baseaddr + CIE);
- write_fn(mask, intc_baseaddr + IAR);
-}
-
-static struct irq_chip intc_dev = {
- .name = "Xilinx INTC",
- .irq_unmask = intc_enable_or_unmask,
- .irq_mask = intc_disable_or_mask,
- .irq_ack = intc_ack,
- .irq_mask_ack = intc_mask_ack,
-};
-
-static struct irq_domain *root_domain;
-
-unsigned int get_irq(void)
-{
- unsigned int hwirq, irq = -1;
-
- hwirq = read_fn(intc_baseaddr + IVR);
- if (hwirq != -1U)
- irq = irq_find_mapping(root_domain, hwirq);
-
- pr_debug("get_irq: hwirq=%d, irq=%d\n", hwirq, irq);
-
- return irq;
-}
-
-static int xintc_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw)
-{
- u32 intr_mask = (u32)d->host_data;
-
- if (intr_mask & (1 << hw)) {
- irq_set_chip_and_handler_name(irq, &intc_dev,
- handle_edge_irq, "edge");
- irq_clear_status_flags(irq, IRQ_LEVEL);
- } else {
- irq_set_chip_and_handler_name(irq, &intc_dev,
- handle_level_irq, "level");
- irq_set_status_flags(irq, IRQ_LEVEL);
- }
- return 0;
-}
-
-static const struct irq_domain_ops xintc_irq_domain_ops = {
- .xlate = irq_domain_xlate_onetwocell,
- .map = xintc_map,
-};
-
-static int __init xilinx_intc_of_init(struct device_node *intc,
- struct device_node *parent)
-{
- u32 nr_irq, intr_mask;
- int ret;
-
- intc_baseaddr = of_iomap(intc, 0);
- BUG_ON(!intc_baseaddr);
-
- ret = of_property_read_u32(intc, "xlnx,num-intr-inputs", &nr_irq);
- if (ret < 0) {
- pr_err("%s: unable to read xlnx,num-intr-inputs\n", __func__);
- return ret;
- }
-
- ret = of_property_read_u32(intc, "xlnx,kind-of-intr", &intr_mask);
- if (ret < 0) {
- pr_err("%s: unable to read xlnx,kind-of-intr\n", __func__);
- return ret;
- }
-
- if (intr_mask >> nr_irq)
- pr_warn("%s: mismatch in kind-of-intr param\n", __func__);
-
- pr_info("%s: num_irq=%d, edge=0x%x\n",
- intc->full_name, nr_irq, intr_mask);
-
- write_fn = intc_write32;
- read_fn = intc_read32;
-
- /*
- * Disable all external interrupts until they are
- * explicity requested.
- */
- write_fn(0, intc_baseaddr + IER);
-
- /* Acknowledge any pending interrupts just in case. */
- write_fn(0xffffffff, intc_baseaddr + IAR);
-
- /* Turn on the Master Enable. */
- write_fn(MER_HIE | MER_ME, intc_baseaddr + MER);
- if (!(read_fn(intc_baseaddr + MER) & (MER_HIE | MER_ME))) {
- write_fn = intc_write32_be;
- read_fn = intc_read32_be;
- write_fn(MER_HIE | MER_ME, intc_baseaddr + MER);
- }
-
- /* Yeah, okay, casting the intr_mask to a void* is butt-ugly, but I'm
- * lazy and Michal can clean it up to something nicer when he tests
- * and commits this patch. ~~gcl */
- root_domain = irq_domain_add_linear(intc, nr_irq, &xintc_irq_domain_ops,
- (void *)intr_mask);
-
- irq_set_default_host(root_domain);
-
- return 0;
-}
-
-IRQCHIP_DECLARE(xilinx_intc, "xlnx,xps-intc-1.00.a", xilinx_intc_of_init);
diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
index 7f87289..4429888 100644
--- a/drivers/irqchip/Kconfig
+++ b/drivers/irqchip/Kconfig
@@ -203,6 +203,10 @@ config XTENSA_MX
bool
select IRQ_DOMAIN
+config XILINX_AXI_INTC
+ bool
+ select IRQ_DOMAIN
+
config IRQ_CROSSBAR
bool
help
diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile
index 4c203b6..bf21f55 100644
--- a/drivers/irqchip/Makefile
+++ b/drivers/irqchip/Makefile
@@ -51,6 +51,7 @@ obj-$(CONFIG_TB10X_IRQC) += irq-tb10x.o
obj-$(CONFIG_TS4800_IRQ) += irq-ts4800.o
obj-$(CONFIG_XTENSA) += irq-xtensa-pic.o
obj-$(CONFIG_XTENSA_MX) += irq-xtensa-mx.o
+obj-$(CONFIG_XILINX_AXI_INTC) += irq-axi-intc.o
obj-$(CONFIG_IRQ_CROSSBAR) += irq-crossbar.o
obj-$(CONFIG_SOC_VF610) += irq-vf610-mscm-ir.o
obj-$(CONFIG_BCM6345_L1_IRQ) += irq-bcm6345-l1.o
diff --git a/drivers/irqchip/irq-axi-intc.c b/drivers/irqchip/irq-axi-intc.c
new file mode 100644
index 0000000..90bec7d
--- /dev/null
+++ b/drivers/irqchip/irq-axi-intc.c
@@ -0,0 +1,196 @@
+/*
+ * Copyright (C) 2007-2013 Michal Simek <monstr@monstr.eu>
+ * Copyright (C) 2012-2013 Xilinx, Inc.
+ * Copyright (C) 2007-2009 PetaLogix
+ * Copyright (C) 2006 Atmark Techno, Inc.
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+
+#include <linux/irqdomain.h>
+#include <linux/irq.h>
+#include <linux/irqchip.h>
+#include <linux/of_address.h>
+#include <linux/io.h>
+#include <linux/bug.h>
+
+static void __iomem *intc_baseaddr;
+
+/* No one else should require these constants, so define them locally here. */
+#define ISR 0x00 /* Interrupt Status Register */
+#define IPR 0x04 /* Interrupt Pending Register */
+#define IER 0x08 /* Interrupt Enable Register */
+#define IAR 0x0c /* Interrupt Acknowledge Register */
+#define SIE 0x10 /* Set Interrupt Enable bits */
+#define CIE 0x14 /* Clear Interrupt Enable bits */
+#define IVR 0x18 /* Interrupt Vector Register */
+#define MER 0x1c /* Master Enable Register */
+
+#define MER_ME (1<<0)
+#define MER_HIE (1<<1)
+
+static unsigned int (*read_fn)(void __iomem *);
+static void (*write_fn)(u32, void __iomem *);
+
+static void intc_write32(u32 val, void __iomem *addr)
+{
+ iowrite32(val, addr);
+}
+
+static unsigned int intc_read32(void __iomem *addr)
+{
+ return ioread32(addr);
+}
+
+static void intc_write32_be(u32 val, void __iomem *addr)
+{
+ iowrite32be(val, addr);
+}
+
+static unsigned int intc_read32_be(void __iomem *addr)
+{
+ return ioread32be(addr);
+}
+
+static void intc_enable_or_unmask(struct irq_data *d)
+{
+ unsigned long mask = 1 << d->hwirq;
+
+ pr_debug("enable_or_unmask: %ld\n", d->hwirq);
+
+ /* ack level irqs because they can't be acked during
+ * ack function since the handle_level_irq function
+ * acks the irq before calling the interrupt handler
+ */
+ if (irqd_is_level_type(d))
+ write_fn(mask, intc_baseaddr + IAR);
+
+ write_fn(mask, intc_baseaddr + SIE);
+}
+
+static void intc_disable_or_mask(struct irq_data *d)
+{
+ pr_debug("disable: %ld\n", d->hwirq);
+ write_fn(1 << d->hwirq, intc_baseaddr + CIE);
+}
+
+static void intc_ack(struct irq_data *d)
+{
+ pr_debug("ack: %ld\n", d->hwirq);
+ write_fn(1 << d->hwirq, intc_baseaddr + IAR);
+}
+
+static void intc_mask_ack(struct irq_data *d)
+{
+ unsigned long mask = 1 << d->hwirq;
+
+ pr_debug("disable_and_ack: %ld\n", d->hwirq);
+ write_fn(mask, intc_baseaddr + CIE);
+ write_fn(mask, intc_baseaddr + IAR);
+}
+
+static struct irq_chip intc_dev = {
+ .name = "Xilinx INTC",
+ .irq_unmask = intc_enable_or_unmask,
+ .irq_mask = intc_disable_or_mask,
+ .irq_ack = intc_ack,
+ .irq_mask_ack = intc_mask_ack,
+};
+
+static struct irq_domain *root_domain;
+
+unsigned int get_irq(void)
+{
+ unsigned int hwirq, irq = -1;
+
+ hwirq = read_fn(intc_baseaddr + IVR);
+ if (hwirq != -1U)
+ irq = irq_find_mapping(root_domain, hwirq);
+
+ pr_debug("get_irq: hwirq=%d, irq=%d\n", hwirq, irq);
+
+ return irq;
+}
+
+static int xintc_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw)
+{
+ u32 intr_mask = (u32)d->host_data;
+
+ if (intr_mask & (1 << hw)) {
+ irq_set_chip_and_handler_name(irq, &intc_dev,
+ handle_edge_irq, "edge");
+ irq_clear_status_flags(irq, IRQ_LEVEL);
+ } else {
+ irq_set_chip_and_handler_name(irq, &intc_dev,
+ handle_level_irq, "level");
+ irq_set_status_flags(irq, IRQ_LEVEL);
+ }
+ return 0;
+}
+
+static const struct irq_domain_ops xintc_irq_domain_ops = {
+ .xlate = irq_domain_xlate_onetwocell,
+ .map = xintc_map,
+};
+
+static int __init xilinx_intc_of_init(struct device_node *intc,
+ struct device_node *parent)
+{
+ u32 nr_irq, intr_mask;
+ int ret;
+
+ intc_baseaddr = of_iomap(intc, 0);
+ BUG_ON(!intc_baseaddr);
+
+ ret = of_property_read_u32(intc, "xlnx,num-intr-inputs", &nr_irq);
+ if (ret < 0) {
+ pr_err("%s: unable to read xlnx,num-intr-inputs\n", __func__);
+ return ret;
+ }
+
+ ret = of_property_read_u32(intc, "xlnx,kind-of-intr", &intr_mask);
+ if (ret < 0) {
+ pr_err("%s: unable to read xlnx,kind-of-intr\n", __func__);
+ return ret;
+ }
+
+ if (intr_mask >> nr_irq)
+ pr_warn("%s: mismatch in kind-of-intr param\n", __func__);
+
+ pr_info("%s: num_irq=%d, edge=0x%x\n",
+ intc->full_name, nr_irq, intr_mask);
+
+ write_fn = intc_write32;
+ read_fn = intc_read32;
+
+ /*
+ * Disable all external interrupts until they are
+ * explicity requested.
+ */
+ write_fn(0, intc_baseaddr + IER);
+
+ /* Acknowledge any pending interrupts just in case. */
+ write_fn(0xffffffff, intc_baseaddr + IAR);
+
+ /* Turn on the Master Enable. */
+ write_fn(MER_HIE | MER_ME, intc_baseaddr + MER);
+ if (!(read_fn(intc_baseaddr + MER) & (MER_HIE | MER_ME))) {
+ write_fn = intc_write32_be;
+ read_fn = intc_read32_be;
+ write_fn(MER_HIE | MER_ME, intc_baseaddr + MER);
+ }
+
+ /* Yeah, okay, casting the intr_mask to a void* is butt-ugly, but I'm
+ * lazy and Michal can clean it up to something nicer when he tests
+ * and commits this patch. ~~gcl */
+ root_domain = irq_domain_add_linear(intc, nr_irq, &xintc_irq_domain_ops,
+ (void *)intr_mask);
+
+ irq_set_default_host(root_domain);
+
+ return 0;
+}
+
+IRQCHIP_DECLARE(xilinx_intc, "xlnx,xps-intc-1.00.a", xilinx_intc_of_init);
--
1.9.1
[toc] | [prev] | [next] | [standalone]
| From | Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> |
|---|---|
| Date | 2016-09-02 12:00 +0200 |
| Subject | Re: [Patch v4 01/12] microblaze: irqchip: Move intc driver to irqchip |
| Message-ID | <scTqq-6ej-33@gated-at.bofh.it> |
| In reply to | #1474833 |
Hi, On 09/02/2016 06:56 AM, Michal Simek wrote: > On 1.9.2016 18:50, Zubair Lutfullah Kakakhel wrote: >> The Xilinx AXI Interrupt Controller IP block is used by the MIPS >> based xilfpga platform. >> >> Move the interrupt controller code out of arch/microblaze so that >> it can be used by everyone > > if this is just move that you should setup your git right that it won't > be remove on one side and add on other side. > > It should look like this when git mv is used and git setup is right. That was how I structured it in the first patch. However irqchip maintainers requested to not do that and show the entire diff for cleanup/review. Regards, ZubairLK > > diff --git a/Makefile b/Makefile2 > similarity index 100% > rename from Makefile > rename to Makefile2 > > Thanks, > Michal >
[toc] | [prev] | [next] | [standalone]
| From | Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> |
|---|---|
| Date | 2016-09-02 12:10 +0200 |
| Subject | Re: [Patch v4 01/12] microblaze: irqchip: Move intc driver to irqchip |
| Message-ID | <scTA7-6xn-81@gated-at.bofh.it> |
| In reply to | #1474833 |
Hi, On 09/02/2016 07:25 AM, Michal Simek wrote: > On 1.9.2016 18:50, Zubair Lutfullah Kakakhel wrote: >> The Xilinx AXI Interrupt Controller IP block is used by the MIPS >> based xilfpga platform. >> >> Move the interrupt controller code out of arch/microblaze so that >> it can be used by everyone >> >> Signed-off-by: Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> >> >> --- >> V3 -> V4 >> No change >> >> V2 -> V3 >> No change here. Cleanup patches follow after this patch. >> Its debatable to cleanup before/after move. Decided to place cleanup >> after move to put history in new place. >> >> V1 -> V2 >> >> Renamed irq-xilinx to irq-axi-intc >> Renamed CONFIG_XILINX_INTC to CONFIG_XILINX_AXI_INTC > > > I see that this was suggested by Jason Cooper but using axi name here is > not correct. > There is xps-intc name which is the name used on old OPB hardware > designs. It means this driver can be still used only on system which > uses it. Wouldn't axi-intc be more suitable moving forwards? The IP block is now known as axi intc for 5 years as far as I can tell. Searching "axi intc" online results in the right docs for current and future platforms. The binding is still xps-intc as that won't change. So older systems should still be able to find their way. > Also there is another copy of this driver in the tree which was using > old ppc405 and ppc440 xilinx platforms. > > arch/powerpc/include/asm/xilinx_intc.h > arch/powerpc/sysdev/xilinx_intc.c > > These should be also removed by moving this driver to generic folder. I didn't know about that drivers existence. This patch series already touches microblaze, mips and irqchip. Both microblaze and mips platforms using this driver are little-endian. Adding a big-endian powerpc driver + platform to the mix is going to complicate the series further and make it super hard to synchronize various subsystems, test stuff, and then move the drivers without breakage. I'd highly recommend letting this move happen. And then the powerpc driver can transition over time to this driver. Regards, ZubairLK > > Thanks, > Michal >
[toc] | [prev] | [next] | [standalone]
| From | Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> |
|---|---|
| Date | 2016-09-02 13:50 +0200 |
| Subject | Re: [Patch v4 01/12] microblaze: irqchip: Move intc driver to irqchip |
| Message-ID | <scV8S-7oO-17@gated-at.bofh.it> |
| In reply to | #1474997 |
Hi, Thanks for the valuable feedback. Comments inline On 09/02/2016 11:27 AM, Michal Simek wrote: > On 2.9.2016 12:06, Zubair Lutfullah Kakakhel wrote: >> Hi, >> >> On 09/02/2016 07:25 AM, Michal Simek wrote: >>> On 1.9.2016 18:50, Zubair Lutfullah Kakakhel wrote: >>>> The Xilinx AXI Interrupt Controller IP block is used by the MIPS >>>> based xilfpga platform. >>>> >>>> Move the interrupt controller code out of arch/microblaze so that >>>> it can be used by everyone >>>> >>>> Signed-off-by: Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> >>>> >>>> --- >>>> V3 -> V4 >>>> No change >>>> >>>> V2 -> V3 >>>> No change here. Cleanup patches follow after this patch. >>>> Its debatable to cleanup before/after move. Decided to place cleanup >>>> after move to put history in new place. >>>> >>>> V1 -> V2 >>>> >>>> Renamed irq-xilinx to irq-axi-intc >>>> Renamed CONFIG_XILINX_INTC to CONFIG_XILINX_AXI_INTC >>> >>> >>> I see that this was suggested by Jason Cooper but using axi name here is >>> not correct. >>> There is xps-intc name which is the name used on old OPB hardware >>> designs. It means this driver can be still used only on system which >>> uses it. >> >> Wouldn't axi-intc be more suitable moving forwards? >> The IP block is now known as axi intc for 5 years as far as I can tell. >> >> Searching "axi intc" online results in the right docs for current and >> future platforms. > > yes but we still should support older platform and it is more then this. > This is soft-IP core and in future when there is new bus then IP will > just change bus interface, etc. That makes sense. I'll rename the driver to irq-xps-intc.c and CONFIG_XILINX_XPS_INTC Please shout now if anybody has issues with this. Regards, ZubairLK
[toc] | [prev] | [next] | [standalone]
| From | Jason Cooper <jason@lakedaemon.net> |
|---|---|
| Date | 2016-09-02 14:50 +0200 |
| Subject | Re: [Patch v4 01/12] microblaze: irqchip: Move intc driver to irqchip |
| Message-ID | <scW4V-7YZ-17@gated-at.bofh.it> |
| In reply to | #1475073 |
Hi Michal, On Fri, Sep 02, 2016 at 02:06:40PM +0200, Michal Simek wrote: > On 2.9.2016 13:46, Zubair Lutfullah Kakakhel wrote: > > On 09/02/2016 11:27 AM, Michal Simek wrote: > >> On 2.9.2016 12:06, Zubair Lutfullah Kakakhel wrote: > >>> On 09/02/2016 07:25 AM, Michal Simek wrote: > >>>> On 1.9.2016 18:50, Zubair Lutfullah Kakakhel wrote: > >>>>> V1 -> V2 > >>>>> > >>>>> Renamed irq-xilinx to irq-axi-intc > >>>>> Renamed CONFIG_XILINX_INTC to CONFIG_XILINX_AXI_INTC > >>>> > >>>> > >>>> I see that this was suggested by Jason Cooper but using axi name > >>>> here is > >>>> not correct. > >>>> There is xps-intc name which is the name used on old OPB hardware > >>>> designs. It means this driver can be still used only on system which > >>>> uses it. > >>> > >>> Wouldn't axi-intc be more suitable moving forwards? > >>> The IP block is now known as axi intc for 5 years as far as I can tell. > >>> > >>> Searching "axi intc" online results in the right docs for current and > >>> future platforms. Please add links to the relevant docs in the comments of the code. > >> > >> yes but we still should support older platform and it is more then this. > >> This is soft-IP core and in future when there is new bus then IP will > >> just change bus interface, etc. > > > > That makes sense. I'll rename the driver to irq-xps-intc.c > > and CONFIG_XILINX_XPS_INTC > > > > Please shout now if anybody has issues with this. > > XPS was shortcut for design tools. You had CONFIG_XILINX_INTC which is > IMHO the best name you can have. Michal, thanks for the background info! Zubair, any problem with CONFIG_XILINX_INTC/irq-xilinx-intc.c ? thx, Jason.
[toc] | [prev] | [next] | [standalone]
| From | Jason Cooper <jason@lakedaemon.net> |
|---|---|
| Date | 2016-09-02 15:30 +0200 |
| Subject | Re: [Patch v4 01/12] microblaze: irqchip: Move intc driver to irqchip |
| Message-ID | <scWHE-8rj-11@gated-at.bofh.it> |
| In reply to | #1474997 |
Hi Michal, Zubair, On Fri, Sep 02, 2016 at 12:27:54PM +0200, Michal Simek wrote: > On 2.9.2016 12:06, Zubair Lutfullah Kakakhel wrote: > > On 09/02/2016 07:25 AM, Michal Simek wrote: ... > >> Also there is another copy of this driver in the tree which was using > >> old ppc405 and ppc440 xilinx platforms. > >> > >> arch/powerpc/include/asm/xilinx_intc.h > >> arch/powerpc/sysdev/xilinx_intc.c > >> > >> These should be also removed by moving this driver to generic folder. > > > > I didn't know about that drivers existence. > > > > This patch series already touches microblaze, mips and irqchip. > > Both microblaze and mips platforms using this driver are little-endian. > > MB is big ending too and as you see there is big endian support in the > driver already. > > > > > Adding a big-endian powerpc driver + platform to the mix is going to > > complicate the series further and make it super hard to synchronize > > various subsystems, test stuff, and then move the drivers without > > breakage. The whole point of Linus' push to move drivers out of arch/ is to reduce code duplication and create more robust drivers. > > I'd highly recommend letting this move happen. And then the powerpc > > driver can transition over time to this driver. I've seen this argument before, and despite everyone's best intentions, it never happens. :( We have linux-next, 0-day and other resources to test these sorts of changes and catch errors before they hit mainline. Let's take our time and do it right. thx, Jason.
[toc] | [prev] | [next] | [standalone]
| From | Marc Zyngier <marc.zyngier@arm.com> |
|---|---|
| Date | 2016-09-02 15:40 +0200 |
| Subject | Re: [Patch v4 01/12] microblaze: irqchip: Move intc driver to irqchip |
| Message-ID | <scWRj-8uq-1@gated-at.bofh.it> |
| In reply to | #1474997 |
On 02/09/16 11:06, Zubair Lutfullah Kakakhel wrote: > Hi, > > On 09/02/2016 07:25 AM, Michal Simek wrote: >> On 1.9.2016 18:50, Zubair Lutfullah Kakakhel wrote: >>> The Xilinx AXI Interrupt Controller IP block is used by the MIPS >>> based xilfpga platform. >>> >>> Move the interrupt controller code out of arch/microblaze so that >>> it can be used by everyone >>> >>> Signed-off-by: Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> >>> >>> --- >>> V3 -> V4 >>> No change >>> >>> V2 -> V3 >>> No change here. Cleanup patches follow after this patch. >>> Its debatable to cleanup before/after move. Decided to place cleanup >>> after move to put history in new place. >>> >>> V1 -> V2 >>> >>> Renamed irq-xilinx to irq-axi-intc >>> Renamed CONFIG_XILINX_INTC to CONFIG_XILINX_AXI_INTC >> >> >> I see that this was suggested by Jason Cooper but using axi name here is >> not correct. >> There is xps-intc name which is the name used on old OPB hardware >> designs. It means this driver can be still used only on system which >> uses it. > > Wouldn't axi-intc be more suitable moving forwards? > The IP block is now known as axi intc for 5 years as far as I can tell. > > Searching "axi intc" online results in the right docs for current and > future platforms. > > The binding is still xps-intc as that won't change. So older systems > should still be able to find their way. > >> Also there is another copy of this driver in the tree which was using >> old ppc405 and ppc440 xilinx platforms. >> >> arch/powerpc/include/asm/xilinx_intc.h >> arch/powerpc/sysdev/xilinx_intc.c >> >> These should be also removed by moving this driver to generic folder. > > I didn't know about that drivers existence. > > This patch series already touches microblaze, mips and irqchip. > Both microblaze and mips platforms using this driver are little-endian. > > Adding a big-endian powerpc driver + platform to the mix is going to complicate > the series further and make it super hard to synchronize various subsystems, > test stuff, and then move the drivers without breakage. > > I'd highly recommend letting this move happen. And then the powerpc driver can > transition over time to this driver. In my experience, doing something later means not doing it. Since you're motivated enough to make this driver common to two architectures, doing it for 3 shouldn't be that hard. This will force you to have separate series, but that's hardly an issue. Thanks, M. -- Jazz is not dead. It just smells funny...
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web