Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 309047
b: refs/heads/master
c: d22ce25
h: refs/heads/master
i:
  309045: 62e6798
  309043: 2757c46
  309039: 73820ba
v: v3
  • Loading branch information
Gabor Juhos authored and Ralf Baechle committed May 15, 2012
1 parent 6547af4 commit 4f00e2b
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 5 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f8365ec4e1b945f70a86e9514dd67ba5f9f2915b
refs/heads/master: d22ce25f870dff2521d352e20d0fd2a7598fbf87
72 changes: 68 additions & 4 deletions trunk/arch/mips/ath79/pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,43 @@
* by the Free Software Foundation.
*/

#include <linux/init.h>
#include <linux/pci.h>
#include <asm/mach-ath79/ath79.h>
#include <asm/mach-ath79/irq.h>
#include <asm/mach-ath79/pci.h>
#include "pci.h"

static int (*ath79_pci_plat_dev_init)(struct pci_dev *dev);
static const struct ath79_pci_irq *ath79_pci_irq_map __initdata;
static unsigned ath79_pci_nr_irqs __initdata;
static struct ar724x_pci_data *pci_data;
static int pci_data_size;

static const struct ath79_pci_irq ar71xx_pci_irq_map[] __initconst = {
{
.slot = 17,
.pin = 1,
.irq = ATH79_PCI_IRQ(0),
}, {
.slot = 18,
.pin = 1,
.irq = ATH79_PCI_IRQ(1),
}, {
.slot = 19,
.pin = 1,
.irq = ATH79_PCI_IRQ(2),
}
};

static const struct ath79_pci_irq ar724x_pci_irq_map[] __initconst = {
{
.slot = 0,
.pin = 1,
.irq = ATH79_PCI_IRQ(0),
}
};

void ar724x_pci_add_data(struct ar724x_pci_data *data, int size)
{
pci_data = data;
Expand All @@ -26,13 +53,40 @@ void ar724x_pci_add_data(struct ar724x_pci_data *data, int size)

int __init pcibios_map_irq(const struct pci_dev *dev, uint8_t slot, uint8_t pin)
{
unsigned int devfn = dev->devfn;
int irq = -1;
int i;

if (ath79_pci_nr_irqs == 0 ||
ath79_pci_irq_map == NULL) {
if (soc_is_ar71xx()) {
ath79_pci_irq_map = ar71xx_pci_irq_map;
ath79_pci_nr_irqs = ARRAY_SIZE(ar71xx_pci_irq_map);
} else if (soc_is_ar724x()) {
ath79_pci_irq_map = ar724x_pci_irq_map;
ath79_pci_nr_irqs = ARRAY_SIZE(ar724x_pci_irq_map);
} else {
pr_crit("pci %s: invalid irq map\n",
pci_name((struct pci_dev *) dev));
return irq;
}
}

for (i = 0; i < ath79_pci_nr_irqs; i++) {
const struct ath79_pci_irq *entry;

if (devfn > pci_data_size - 1)
return irq;
entry = &ath79_pci_irq_map[i];
if (entry->slot == slot && entry->pin == pin) {
irq = entry->irq;
break;
}
}

irq = pci_data[devfn].irq;
if (irq < 0)
pr_crit("pci %s: no irq found for pin %u\n",
pci_name((struct pci_dev *) dev), pin);
else
pr_info("pci %s: using irq %d for pin %u\n",
pci_name((struct pci_dev *) dev), irq, pin);

return irq;
}
Expand All @@ -45,13 +99,23 @@ int pcibios_plat_dev_init(struct pci_dev *dev)
return 0;
}

void __init ath79_pci_set_irq_map(unsigned nr_irqs,
const struct ath79_pci_irq *map)
{
ath79_pci_nr_irqs = nr_irqs;
ath79_pci_irq_map = map;
}

void __init ath79_pci_set_plat_dev_init(int (*func)(struct pci_dev *dev))
{
ath79_pci_plat_dev_init = func;
}

int __init ath79_register_pci(void)
{
if (soc_is_ar71xx())
return ar71xx_pcibios_init();

if (soc_is_ar724x())
return ar724x_pcibios_init(ATH79_CPU_IRQ_IP2);

Expand Down
9 changes: 9 additions & 0 deletions trunk/arch/mips/ath79/pci.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,22 @@ struct ar724x_pci_data {
int irq;
};

struct ath79_pci_irq {
u8 slot;
u8 pin;
int irq;
};

void ar724x_pci_add_data(struct ar724x_pci_data *data, int size);

#ifdef CONFIG_PCI
void ath79_pci_set_irq_map(unsigned nr_irqs, const struct ath79_pci_irq *map);
void ath79_pci_set_plat_dev_init(int (*func)(struct pci_dev *dev));
int ath79_register_pci(void);
#else
static inline void
ath79_pci_set_irq_map(unsigned nr_irqs, const struct ath79_pci_irq *map) {}
static inline void
ath79_pci_set_plat_dev_init(int (*func)(struct pci_dev *)) {}
static inline int ath79_register_pci(void) { return 0; }
#endif
Expand Down

0 comments on commit 4f00e2b

Please sign in to comment.