Path: blob/master/arch/arm/mach-orion5x/board-rd88f5182.c
26292 views
// SPDX-License-Identifier: GPL-2.0-only1/*2* arch/arm/mach-orion5x/rd88f5182-setup.c3*4* Marvell Orion-NAS Reference Design Setup5*6* Maintainer: Ronen Shitrit <[email protected]>7*/8#include <linux/gpio.h>9#include <linux/kernel.h>10#include <linux/init.h>11#include <linux/of.h>12#include <linux/platform_device.h>13#include <linux/pci.h>14#include <linux/irq.h>15#include <asm/mach-types.h>16#include <asm/mach/arch.h>17#include <asm/mach/pci.h>18#include "common.h"19#include "orion5x.h"2021/*****************************************************************************22* RD-88F5182 Info23****************************************************************************/2425/*26* PCI27*/2829#define RD88F5182_PCI_SLOT0_OFFS 730#define RD88F5182_PCI_SLOT0_IRQ_A_PIN 731#define RD88F5182_PCI_SLOT0_IRQ_B_PIN 63233/*****************************************************************************34* PCI35****************************************************************************/3637static void __init rd88f5182_pci_preinit(void)38{39int pin;4041/*42* Configure PCI GPIO IRQ pins43*/44pin = RD88F5182_PCI_SLOT0_IRQ_A_PIN;45if (gpio_request(pin, "PCI IntA") == 0) {46if (gpio_direction_input(pin) == 0) {47irq_set_irq_type(gpio_to_irq(pin), IRQ_TYPE_LEVEL_LOW);48} else {49printk(KERN_ERR "rd88f5182_pci_preinit failed to "50"set_irq_type pin %d\n", pin);51gpio_free(pin);52}53} else {54printk(KERN_ERR "rd88f5182_pci_preinit failed to request gpio %d\n", pin);55}5657pin = RD88F5182_PCI_SLOT0_IRQ_B_PIN;58if (gpio_request(pin, "PCI IntB") == 0) {59if (gpio_direction_input(pin) == 0) {60irq_set_irq_type(gpio_to_irq(pin), IRQ_TYPE_LEVEL_LOW);61} else {62printk(KERN_ERR "rd88f5182_pci_preinit failed to "63"set_irq_type pin %d\n", pin);64gpio_free(pin);65}66} else {67printk(KERN_ERR "rd88f5182_pci_preinit failed to gpio_request %d\n", pin);68}69}7071static int __init rd88f5182_pci_map_irq(const struct pci_dev *dev, u8 slot,72u8 pin)73{74int irq;7576/*77* Check for devices with hard-wired IRQs.78*/79irq = orion5x_pci_map_irq(dev, slot, pin);80if (irq != -1)81return irq;8283/*84* PCI IRQs are connected via GPIOs85*/86switch (slot - RD88F5182_PCI_SLOT0_OFFS) {87case 0:88if (pin == 1)89return gpio_to_irq(RD88F5182_PCI_SLOT0_IRQ_A_PIN);90else91return gpio_to_irq(RD88F5182_PCI_SLOT0_IRQ_B_PIN);92default:93return -1;94}95}9697static struct hw_pci rd88f5182_pci __initdata = {98.nr_controllers = 2,99.preinit = rd88f5182_pci_preinit,100.setup = orion5x_pci_sys_setup,101.scan = orion5x_pci_sys_scan_bus,102.map_irq = rd88f5182_pci_map_irq,103};104105static int __init rd88f5182_pci_init(void)106{107if (of_machine_is_compatible("marvell,rd-88f5182-nas"))108pci_common_init(&rd88f5182_pci);109110return 0;111}112113subsys_initcall(rd88f5182_pci_init);114115116