18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * arch/arm/mach-orion5x/rd88f5182-setup.c 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Marvell Orion-NAS Reference Design Setup 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * Maintainer: Ronen Shitrit <rshitrit@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/init.h> 158c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 168c2ecf20Sopenharmony_ci#include <linux/pci.h> 178c2ecf20Sopenharmony_ci#include <linux/irq.h> 188c2ecf20Sopenharmony_ci#include <asm/mach-types.h> 198c2ecf20Sopenharmony_ci#include <asm/mach/arch.h> 208c2ecf20Sopenharmony_ci#include <asm/mach/pci.h> 218c2ecf20Sopenharmony_ci#include "common.h" 228c2ecf20Sopenharmony_ci#include "orion5x.h" 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci/***************************************************************************** 258c2ecf20Sopenharmony_ci * RD-88F5182 Info 268c2ecf20Sopenharmony_ci ****************************************************************************/ 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci/* 298c2ecf20Sopenharmony_ci * PCI 308c2ecf20Sopenharmony_ci */ 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci#define RD88F5182_PCI_SLOT0_OFFS 7 338c2ecf20Sopenharmony_ci#define RD88F5182_PCI_SLOT0_IRQ_A_PIN 7 348c2ecf20Sopenharmony_ci#define RD88F5182_PCI_SLOT0_IRQ_B_PIN 6 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci/***************************************************************************** 378c2ecf20Sopenharmony_ci * PCI 388c2ecf20Sopenharmony_ci ****************************************************************************/ 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_cistatic void __init rd88f5182_pci_preinit(void) 418c2ecf20Sopenharmony_ci{ 428c2ecf20Sopenharmony_ci int pin; 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci /* 458c2ecf20Sopenharmony_ci * Configure PCI GPIO IRQ pins 468c2ecf20Sopenharmony_ci */ 478c2ecf20Sopenharmony_ci pin = RD88F5182_PCI_SLOT0_IRQ_A_PIN; 488c2ecf20Sopenharmony_ci if (gpio_request(pin, "PCI IntA") == 0) { 498c2ecf20Sopenharmony_ci if (gpio_direction_input(pin) == 0) { 508c2ecf20Sopenharmony_ci irq_set_irq_type(gpio_to_irq(pin), IRQ_TYPE_LEVEL_LOW); 518c2ecf20Sopenharmony_ci } else { 528c2ecf20Sopenharmony_ci printk(KERN_ERR "rd88f5182_pci_preinit failed to " 538c2ecf20Sopenharmony_ci "set_irq_type pin %d\n", pin); 548c2ecf20Sopenharmony_ci gpio_free(pin); 558c2ecf20Sopenharmony_ci } 568c2ecf20Sopenharmony_ci } else { 578c2ecf20Sopenharmony_ci printk(KERN_ERR "rd88f5182_pci_preinit failed to request gpio %d\n", pin); 588c2ecf20Sopenharmony_ci } 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci pin = RD88F5182_PCI_SLOT0_IRQ_B_PIN; 618c2ecf20Sopenharmony_ci if (gpio_request(pin, "PCI IntB") == 0) { 628c2ecf20Sopenharmony_ci if (gpio_direction_input(pin) == 0) { 638c2ecf20Sopenharmony_ci irq_set_irq_type(gpio_to_irq(pin), IRQ_TYPE_LEVEL_LOW); 648c2ecf20Sopenharmony_ci } else { 658c2ecf20Sopenharmony_ci printk(KERN_ERR "rd88f5182_pci_preinit failed to " 668c2ecf20Sopenharmony_ci "set_irq_type pin %d\n", pin); 678c2ecf20Sopenharmony_ci gpio_free(pin); 688c2ecf20Sopenharmony_ci } 698c2ecf20Sopenharmony_ci } else { 708c2ecf20Sopenharmony_ci printk(KERN_ERR "rd88f5182_pci_preinit failed to gpio_request %d\n", pin); 718c2ecf20Sopenharmony_ci } 728c2ecf20Sopenharmony_ci} 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_cistatic int __init rd88f5182_pci_map_irq(const struct pci_dev *dev, u8 slot, 758c2ecf20Sopenharmony_ci u8 pin) 768c2ecf20Sopenharmony_ci{ 778c2ecf20Sopenharmony_ci int irq; 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci /* 808c2ecf20Sopenharmony_ci * Check for devices with hard-wired IRQs. 818c2ecf20Sopenharmony_ci */ 828c2ecf20Sopenharmony_ci irq = orion5x_pci_map_irq(dev, slot, pin); 838c2ecf20Sopenharmony_ci if (irq != -1) 848c2ecf20Sopenharmony_ci return irq; 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci /* 878c2ecf20Sopenharmony_ci * PCI IRQs are connected via GPIOs 888c2ecf20Sopenharmony_ci */ 898c2ecf20Sopenharmony_ci switch (slot - RD88F5182_PCI_SLOT0_OFFS) { 908c2ecf20Sopenharmony_ci case 0: 918c2ecf20Sopenharmony_ci if (pin == 1) 928c2ecf20Sopenharmony_ci return gpio_to_irq(RD88F5182_PCI_SLOT0_IRQ_A_PIN); 938c2ecf20Sopenharmony_ci else 948c2ecf20Sopenharmony_ci return gpio_to_irq(RD88F5182_PCI_SLOT0_IRQ_B_PIN); 958c2ecf20Sopenharmony_ci default: 968c2ecf20Sopenharmony_ci return -1; 978c2ecf20Sopenharmony_ci } 988c2ecf20Sopenharmony_ci} 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_cistatic struct hw_pci rd88f5182_pci __initdata = { 1018c2ecf20Sopenharmony_ci .nr_controllers = 2, 1028c2ecf20Sopenharmony_ci .preinit = rd88f5182_pci_preinit, 1038c2ecf20Sopenharmony_ci .setup = orion5x_pci_sys_setup, 1048c2ecf20Sopenharmony_ci .scan = orion5x_pci_sys_scan_bus, 1058c2ecf20Sopenharmony_ci .map_irq = rd88f5182_pci_map_irq, 1068c2ecf20Sopenharmony_ci}; 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_cistatic int __init rd88f5182_pci_init(void) 1098c2ecf20Sopenharmony_ci{ 1108c2ecf20Sopenharmony_ci if (of_machine_is_compatible("marvell,rd-88f5182-nas")) 1118c2ecf20Sopenharmony_ci pci_common_init(&rd88f5182_pci); 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_ci return 0; 1148c2ecf20Sopenharmony_ci} 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_cisubsys_initcall(rd88f5182_pci_init); 117