Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8d3fdf31 authored by Krzysztof Hałasa's avatar Krzysztof Hałasa
Browse files

IXP4xx: Introduce IXP4XX_GPIO_IRQ(n) macro and convert IXP4xx platform files.



Signed-off-by: default avatarKrzysztof Hałasa <khc@pm.waw.pl>
parent a8b7b340
Loading
Loading
Loading
Loading
+20 −30
Original line number Diff line number Diff line
@@ -27,49 +27,40 @@
#include <mach/hardware.h>
#include <asm/mach-types.h>

#define AVILA_PCI_MAX_DEV	4
#define LOFT_PCI_MAX_DEV	6
#define AVILA_PCI_IRQ_LINES	4
#define AVILA_MAX_DEV	4
#define LOFT_MAX_DEV	6
#define IRQ_LINES	4

/* PCI controller GPIO to IRQ pin mappings */
#define AVILA_PCI_INTA_PIN	11
#define AVILA_PCI_INTB_PIN	10
#define AVILA_PCI_INTC_PIN	9
#define AVILA_PCI_INTD_PIN	8

#define IRQ_AVILA_PCI_INTA	IRQ_IXP4XX_GPIO11
#define IRQ_AVILA_PCI_INTB	IRQ_IXP4XX_GPIO10
#define IRQ_AVILA_PCI_INTC	IRQ_IXP4XX_GPIO9
#define IRQ_AVILA_PCI_INTD	IRQ_IXP4XX_GPIO8
#define INTA		11
#define INTB		10
#define INTC		9
#define INTD		8

void __init avila_pci_preinit(void)
{
	set_irq_type(IRQ_AVILA_PCI_INTA, IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IRQ_AVILA_PCI_INTB, IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IRQ_AVILA_PCI_INTC, IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IRQ_AVILA_PCI_INTD, IRQ_TYPE_LEVEL_LOW);

	set_irq_type(IXP4XX_GPIO_IRQ(INTA), IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IXP4XX_GPIO_IRQ(INTB), IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IXP4XX_GPIO_IRQ(INTC), IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IXP4XX_GPIO_IRQ(INTD), IRQ_TYPE_LEVEL_LOW);
	ixp4xx_pci_preinit();
}

static int __init avila_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
{
	static int pci_irq_table[AVILA_PCI_IRQ_LINES] = {
		IRQ_AVILA_PCI_INTA,
		IRQ_AVILA_PCI_INTB,
		IRQ_AVILA_PCI_INTC,
		IRQ_AVILA_PCI_INTD
	static int pci_irq_table[IRQ_LINES] = {
		IXP4XX_GPIO_IRQ(INTA),
		IXP4XX_GPIO_IRQ(INTB),
		IXP4XX_GPIO_IRQ(INTC),
		IXP4XX_GPIO_IRQ(INTD)
	};

	int irq = -1;

	if (slot >= 1 &&
	slot <= (machine_is_loft() ? LOFT_PCI_MAX_DEV : AVILA_PCI_MAX_DEV) &&
		pin >= 1 && pin <= AVILA_PCI_IRQ_LINES) {
		irq = pci_irq_table[(slot + pin - 2) % 4];
	}
	    slot <= (machine_is_loft() ? LOFT_MAX_DEV : AVILA_MAX_DEV) &&
	    pin >= 1 && pin <= IRQ_LINES)
		return pci_irq_table[(slot + pin - 2) % 4];

	return irq;
	return -1;
}

struct hw_pci avila_pci __initdata = {
@@ -89,4 +80,3 @@ int __init avila_pci_init(void)
}

subsys_initcall(avila_pci_init);
+10 −14
Original line number Diff line number Diff line
@@ -23,30 +23,26 @@
#include <asm/irq.h>
#include <asm/mach/pci.h>

#define COYOTE_PCI_SLOT0_DEVID	14
#define COYOTE_PCI_SLOT1_DEVID	15
#define SLOT0_DEVID	14
#define SLOT1_DEVID	15

/* PCI controller GPIO to IRQ pin mappings */
#define COYOTE_PCI_SLOT0_PIN	6
#define COYOTE_PCI_SLOT1_PIN	11

#define IRQ_COYOTE_PCI_SLOT0	IRQ_IXP4XX_GPIO6
#define IRQ_COYOTE_PCI_SLOT1	IRQ_IXP4XX_GPIO11
#define SLOT0_INTA	6
#define SLOT1_INTA	11

void __init coyote_pci_preinit(void)
{
	set_irq_type(IRQ_COYOTE_PCI_SLOT0, IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IRQ_COYOTE_PCI_SLOT1, IRQ_TYPE_LEVEL_LOW);

	set_irq_type(IXP4XX_GPIO_IRQ(SLOT0_INTA), IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IXP4XX_GPIO_IRQ(SLOT1_INTA), IRQ_TYPE_LEVEL_LOW);
	ixp4xx_pci_preinit();
}

static int __init coyote_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
{
	if (slot == COYOTE_PCI_SLOT0_DEVID)
		return IRQ_COYOTE_PCI_SLOT0;
	else if (slot == COYOTE_PCI_SLOT1_DEVID)
		return IRQ_COYOTE_PCI_SLOT1;
	if (slot == SLOT0_DEVID)
		return IXP4XX_GPIO_IRQ(SLOT0_INTA);
	else if (slot == SLOT1_DEVID)
		return IXP4XX_GPIO_IRQ(SLOT1_INTA);
	else return -1;
}

+23 −34
Original line number Diff line number Diff line
@@ -22,53 +22,42 @@
#include <asm/mach/pci.h>
#include <asm/mach-types.h>

#define DSMG600_PCI_MAX_DEV	4
#define DSMG600_PCI_IRQ_LINES	3
#define MAX_DEV		4
#define IRQ_LINES	3

/* PCI controller GPIO to IRQ pin mappings */
#define DSMG600_PCI_INTA_PIN	11
#define DSMG600_PCI_INTB_PIN	10
#define DSMG600_PCI_INTC_PIN	9
#define DSMG600_PCI_INTD_PIN	8
#define DSMG600_PCI_INTE_PIN	7
#define DSMG600_PCI_INTF_PIN	6

#define IRQ_DSMG600_PCI_INTA	IRQ_IXP4XX_GPIO11
#define IRQ_DSMG600_PCI_INTB	IRQ_IXP4XX_GPIO10
#define IRQ_DSMG600_PCI_INTC	IRQ_IXP4XX_GPIO9
#define IRQ_DSMG600_PCI_INTD	IRQ_IXP4XX_GPIO8
#define IRQ_DSMG600_PCI_INTE	IRQ_IXP4XX_GPIO7
#define IRQ_DSMG600_PCI_INTF	IRQ_IXP4XX_GPIO6
#define INTA		11
#define INTB		10
#define INTC		9
#define INTD		8
#define INTE		7
#define INTF		6

void __init dsmg600_pci_preinit(void)
{
	set_irq_type(IRQ_DSMG600_PCI_INTA, IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IRQ_DSMG600_PCI_INTB, IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IRQ_DSMG600_PCI_INTC, IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IRQ_DSMG600_PCI_INTD, IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IRQ_DSMG600_PCI_INTE, IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IRQ_DSMG600_PCI_INTF, IRQ_TYPE_LEVEL_LOW);

	set_irq_type(IXP4XX_GPIO_IRQ(INTA), IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IXP4XX_GPIO_IRQ(INTB), IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IXP4XX_GPIO_IRQ(INTC), IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IXP4XX_GPIO_IRQ(INTD), IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IXP4XX_GPIO_IRQ(INTE), IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IXP4XX_GPIO_IRQ(INTF), IRQ_TYPE_LEVEL_LOW);
	ixp4xx_pci_preinit();
}

static int __init dsmg600_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
{
	static int pci_irq_table[DSMG600_PCI_MAX_DEV][DSMG600_PCI_IRQ_LINES] =
	{
		{ IRQ_DSMG600_PCI_INTE, -1, -1 },
		{ IRQ_DSMG600_PCI_INTA, -1, -1 },
		{ IRQ_DSMG600_PCI_INTB, IRQ_DSMG600_PCI_INTC, IRQ_DSMG600_PCI_INTD },
		{ IRQ_DSMG600_PCI_INTF, -1, -1 },
	static int pci_irq_table[MAX_DEV][IRQ_LINES] = {
		{ IXP4XX_GPIO_IRQ(INTE), -1, -1 },
		{ IXP4XX_GPIO_IRQ(INTA), -1, -1 },
		{ IXP4XX_GPIO_IRQ(INTB), IXP4XX_GPIO_IRQ(INTC),
		  IXP4XX_GPIO_IRQ(INTD) },
		{ IXP4XX_GPIO_IRQ(INTF), -1, -1 },
	};

	int irq = -1;

	if (slot >= 1 && slot <= DSMG600_PCI_MAX_DEV &&
		pin >= 1 && pin <= DSMG600_PCI_IRQ_LINES)
		irq = pci_irq_table[slot-1][pin-1];
	if (slot >= 1 && slot <= MAX_DEV && pin >= 1 && pin <= IRQ_LINES)
		return pci_irq_table[slot - 1][pin - 1];

	return irq;
	return -1;
}

struct hw_pci __initdata dsmg600_pci = {
+15 −20
Original line number Diff line number Diff line
@@ -22,40 +22,35 @@
#include <asm/mach/pci.h>
#include <asm/mach-types.h>

#define FSG_PCI_MAX_DEV		3
#define FSG_PCI_IRQ_LINES	3
#define MAX_DEV		3
#define IRQ_LINES	3

/* PCI controller GPIO to IRQ pin mappings */
#define FSG_PCI_INTA_PIN	6
#define FSG_PCI_INTB_PIN	7
#define FSG_PCI_INTC_PIN	5
#define IRQ_FSG_PCI_INTA	IRQ_IXP4XX_GPIO6
#define IRQ_FSG_PCI_INTB	IRQ_IXP4XX_GPIO7
#define IRQ_FSG_PCI_INTC	IRQ_IXP4XX_GPIO5
#define INTA	6
#define INTB	7
#define INTC	5

void __init fsg_pci_preinit(void)
{
	set_irq_type(IRQ_FSG_PCI_INTA, IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IRQ_FSG_PCI_INTB, IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IRQ_FSG_PCI_INTC, IRQ_TYPE_LEVEL_LOW);

	set_irq_type(IXP4XX_GPIO_IRQ(INTA), IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IXP4XX_GPIO_IRQ(INTB), IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IXP4XX_GPIO_IRQ(INTC), IRQ_TYPE_LEVEL_LOW);
	ixp4xx_pci_preinit();
}

static int __init fsg_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
{
	static int pci_irq_table[FSG_PCI_IRQ_LINES] = {
		IRQ_FSG_PCI_INTC,
		IRQ_FSG_PCI_INTB,
		IRQ_FSG_PCI_INTA,
	static int pci_irq_table[IRQ_LINES] = {
		IXP4XX_GPIO_IRQ(INTC),
		IXP4XX_GPIO_IRQ(INTB),
		IXP4XX_GPIO_IRQ(INTA),
	};

	int irq = -1;
	slot = slot - 11;
	slot -= 11;

	if (slot >= 1 && slot <= FSG_PCI_MAX_DEV &&
	    pin >= 1 && pin <= FSG_PCI_IRQ_LINES)
		irq = pci_irq_table[(slot - 1)];
	if (slot >= 1 && slot <= MAX_DEV && pin >= 1 && pin <= IRQ_LINES)
		irq = pci_irq_table[slot - 1];
	printk(KERN_INFO "%s: Mapped slot %d pin %d to IRQ %d\n",
	       __func__, slot, pin, irq);

+22 −23
Original line number Diff line number Diff line
@@ -17,29 +17,28 @@
#include <asm/mach/flash.h>
#include <asm/mach/pci.h>

#define xgpio_irq(n)		(IRQ_IXP4XX_GPIO ## n)
#define gpio_irq(n)		xgpio_irq(n)

#define SLOT_ETHA		0x0B	/* IDSEL = AD21 */
#define SLOT_ETHB		0x0C	/* IDSEL = AD20 */
#define SLOT_MPCI		0x0D	/* IDSEL = AD19 */
#define SLOT_NEC		0x0E	/* IDSEL = AD18 */

#define IRQ_ETHA		IRQ_IXP4XX_GPIO4
#define IRQ_ETHB		IRQ_IXP4XX_GPIO5
#define IRQ_NEC			IRQ_IXP4XX_GPIO3
#define IRQ_MPCI		IRQ_IXP4XX_GPIO12

/* GPIO lines */
#define GPIO_SCL		0
#define GPIO_SDA		1
#define GPIO_STR		2
#define GPIO_IRQ_NEC		3
#define GPIO_IRQ_ETHA		4
#define GPIO_IRQ_ETHB		5
#define GPIO_HSS0_DCD_N		6
#define GPIO_HSS1_DCD_N		7
#define GPIO_UART0_DCD		8
#define GPIO_UART1_DCD		9
#define GPIO_HSS0_CTS_N		10
#define GPIO_HSS1_CTS_N		11
#define GPIO_IRQ_MPCI		12
#define GPIO_HSS1_RTS_N		13
#define GPIO_HSS0_RTS_N		14
/* GPIO15 is not connected */

/* Control outputs from 74HC4094 */
#define CONTROL_HSS0_CLK_INT	0
@@ -152,7 +151,7 @@ static int hss_set_clock(int port, unsigned int clock_type)

static irqreturn_t hss_dcd_irq(int irq, void *pdev)
{
	int i, port = (irq == gpio_irq(GPIO_HSS1_DCD_N));
	int i, port = (irq == IXP4XX_GPIO_IRQ(GPIO_HSS1_DCD_N));
	gpio_line_get(port ? GPIO_HSS1_DCD_N : GPIO_HSS0_DCD_N, &i);
	set_carrier_cb_tab[port](pdev, !i);
	return IRQ_HANDLED;
@@ -165,9 +164,9 @@ static int hss_open(int port, void *pdev,
	int i, irq;

	if (!port)
		irq = gpio_irq(GPIO_HSS0_DCD_N);
		irq = IXP4XX_GPIO_IRQ(GPIO_HSS0_DCD_N);
	else
		irq = gpio_irq(GPIO_HSS1_DCD_N);
		irq = IXP4XX_GPIO_IRQ(GPIO_HSS1_DCD_N);

	gpio_line_get(port ? GPIO_HSS1_DCD_N : GPIO_HSS0_DCD_N, &i);
	set_carrier_cb(pdev, !i);
@@ -188,8 +187,8 @@ static int hss_open(int port, void *pdev,

static void hss_close(int port, void *pdev)
{
	free_irq(port ? gpio_irq(GPIO_HSS1_DCD_N) : gpio_irq(GPIO_HSS0_DCD_N),
		 pdev);
	free_irq(port ? IXP4XX_GPIO_IRQ(GPIO_HSS1_DCD_N) :
		 IXP4XX_GPIO_IRQ(GPIO_HSS0_DCD_N), pdev);
	set_carrier_cb_tab[!!port] = NULL; /* catch bugs */

	set_control(port ? CONTROL_HSS1_DTR_N : CONTROL_HSS0_DTR_N, 1);
@@ -421,8 +420,8 @@ static void __init gmlr_init(void)
	gpio_line_config(GPIO_HSS1_RTS_N, IXP4XX_GPIO_OUT);
	gpio_line_config(GPIO_HSS0_DCD_N, IXP4XX_GPIO_IN);
	gpio_line_config(GPIO_HSS1_DCD_N, IXP4XX_GPIO_IN);
	set_irq_type(gpio_irq(GPIO_HSS0_DCD_N), IRQ_TYPE_EDGE_BOTH);
	set_irq_type(gpio_irq(GPIO_HSS1_DCD_N), IRQ_TYPE_EDGE_BOTH);
	set_irq_type(IXP4XX_GPIO_IRQ(GPIO_HSS0_DCD_N), IRQ_TYPE_EDGE_BOTH);
	set_irq_type(IXP4XX_GPIO_IRQ(GPIO_HSS1_DCD_N), IRQ_TYPE_EDGE_BOTH);

	set_control(CONTROL_HSS0_DTR_N, 1);
	set_control(CONTROL_HSS1_DTR_N, 1);
@@ -442,10 +441,10 @@ static void __init gmlr_init(void)
#ifdef CONFIG_PCI
static void __init gmlr_pci_preinit(void)
{
	set_irq_type(IRQ_ETHA, IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IRQ_ETHB, IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IRQ_NEC, IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IRQ_MPCI, IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IXP4XX_GPIO_IRQ(GPIO_IRQ_ETHA), IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IXP4XX_GPIO_IRQ(GPIO_IRQ_ETHB), IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IXP4XX_GPIO_IRQ(GPIO_IRQ_NEC), IRQ_TYPE_LEVEL_LOW);
	set_irq_type(IXP4XX_GPIO_IRQ(GPIO_IRQ_MPCI), IRQ_TYPE_LEVEL_LOW);
	ixp4xx_pci_preinit();
}

@@ -466,10 +465,10 @@ static void __init gmlr_pci_postinit(void)
static int __init gmlr_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
{
	switch(slot) {
	case SLOT_ETHA:	return IRQ_ETHA;
	case SLOT_ETHB:	return IRQ_ETHB;
	case SLOT_NEC:	return IRQ_NEC;
	default:	return IRQ_MPCI;
	case SLOT_ETHA:	return IXP4XX_GPIO_IRQ(GPIO_IRQ_ETHA);
	case SLOT_ETHB:	return IXP4XX_GPIO_IRQ(GPIO_IRQ_ETHB);
	case SLOT_NEC:	return IXP4XX_GPIO_IRQ(GPIO_IRQ_NEC);
	default:	return IXP4XX_GPIO_IRQ(GPIO_IRQ_MPCI);
	}
}

Loading