18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci * arch/arm/mach-orion5x/irq.c
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * Core IRQ functions for Marvell Orion System On Chip
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * Maintainer: Tzachi Perelstein <tzachi@marvell.com>
78c2ecf20Sopenharmony_ci *
88c2ecf20Sopenharmony_ci * This file is licensed under the terms of the GNU General Public
98c2ecf20Sopenharmony_ci * License version 2.  This program is licensed "as is" without any
108c2ecf20Sopenharmony_ci * warranty of any kind, whether express or implied.
118c2ecf20Sopenharmony_ci */
128c2ecf20Sopenharmony_ci#include <linux/gpio.h>
138c2ecf20Sopenharmony_ci#include <linux/kernel.h>
148c2ecf20Sopenharmony_ci#include <linux/irq.h>
158c2ecf20Sopenharmony_ci#include <linux/io.h>
168c2ecf20Sopenharmony_ci#include <plat/orion-gpio.h>
178c2ecf20Sopenharmony_ci#include <plat/irq.h>
188c2ecf20Sopenharmony_ci#include <asm/exception.h>
198c2ecf20Sopenharmony_ci#include "bridge-regs.h"
208c2ecf20Sopenharmony_ci#include "common.h"
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_cistatic int __initdata gpio0_irqs[4] = {
238c2ecf20Sopenharmony_ci	IRQ_ORION5X_GPIO_0_7,
248c2ecf20Sopenharmony_ci	IRQ_ORION5X_GPIO_8_15,
258c2ecf20Sopenharmony_ci	IRQ_ORION5X_GPIO_16_23,
268c2ecf20Sopenharmony_ci	IRQ_ORION5X_GPIO_24_31,
278c2ecf20Sopenharmony_ci};
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_cistatic asmlinkage void
308c2ecf20Sopenharmony_ci__exception_irq_entry orion5x_legacy_handle_irq(struct pt_regs *regs)
318c2ecf20Sopenharmony_ci{
328c2ecf20Sopenharmony_ci	u32 stat;
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci	stat = readl_relaxed(MAIN_IRQ_CAUSE);
358c2ecf20Sopenharmony_ci	stat &= readl_relaxed(MAIN_IRQ_MASK);
368c2ecf20Sopenharmony_ci	if (stat) {
378c2ecf20Sopenharmony_ci		unsigned int hwirq = 1 + __fls(stat);
388c2ecf20Sopenharmony_ci		handle_IRQ(hwirq, regs);
398c2ecf20Sopenharmony_ci		return;
408c2ecf20Sopenharmony_ci	}
418c2ecf20Sopenharmony_ci}
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_civoid __init orion5x_init_irq(void)
448c2ecf20Sopenharmony_ci{
458c2ecf20Sopenharmony_ci	orion_irq_init(1, MAIN_IRQ_MASK);
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci	set_handle_irq(orion5x_legacy_handle_irq);
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci	/*
508c2ecf20Sopenharmony_ci	 * Initialize gpiolib for GPIOs 0-31.
518c2ecf20Sopenharmony_ci	 */
528c2ecf20Sopenharmony_ci	orion_gpio_init(NULL, 0, 32, GPIO_VIRT_BASE, 0,
538c2ecf20Sopenharmony_ci			IRQ_ORION5X_GPIO_START, gpio0_irqs);
548c2ecf20Sopenharmony_ci}
55