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