-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
yaml --- r: 245284 b: refs/heads/master c: e47d488 h: refs/heads/master v: v3
- Loading branch information
John Crispin
authored and
Ralf Baechle
committed
May 19, 2011
1 parent
ef6cad6
commit 7142566
Showing
6 changed files
with
479 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: 8ec6d93508f705dacafd5fcd058c69ef405002f9 | ||
refs/heads/master: e47d488935ed0b2dd3d59d3ba4e13956ff6849c0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
/* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License version 2 as published | ||
* by the Free Software Foundation. | ||
* | ||
* Copyright (C) 2010 John Crispin <blogic@openwrt.org> | ||
*/ | ||
|
||
#ifndef _LANTIQ_PLATFORM_H__ | ||
#define _LANTIQ_PLATFORM_H__ | ||
|
||
#include <linux/mtd/partitions.h> | ||
|
||
/* struct used to pass info to the pci core */ | ||
enum { | ||
PCI_CLOCK_INT = 0, | ||
PCI_CLOCK_EXT | ||
}; | ||
|
||
#define PCI_EXIN0 0x0001 | ||
#define PCI_EXIN1 0x0002 | ||
#define PCI_EXIN2 0x0004 | ||
#define PCI_EXIN3 0x0008 | ||
#define PCI_EXIN4 0x0010 | ||
#define PCI_EXIN5 0x0020 | ||
#define PCI_EXIN_MAX 6 | ||
|
||
#define PCI_GNT1 0x0040 | ||
#define PCI_GNT2 0x0080 | ||
#define PCI_GNT3 0x0100 | ||
#define PCI_GNT4 0x0200 | ||
|
||
#define PCI_REQ1 0x0400 | ||
#define PCI_REQ2 0x0800 | ||
#define PCI_REQ3 0x1000 | ||
#define PCI_REQ4 0x2000 | ||
#define PCI_REQ_SHIFT 10 | ||
#define PCI_REQ_MASK 0xf | ||
|
||
struct ltq_pci_data { | ||
int clock; | ||
int gpio; | ||
int irq[16]; | ||
}; | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
/* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License version 2 as published | ||
* by the Free Software Foundation. | ||
* | ||
* Copyright (C) 2010 John Crispin <blogic@openwrt.org> | ||
*/ | ||
|
||
#include <linux/types.h> | ||
#include <linux/pci.h> | ||
#include <linux/kernel.h> | ||
#include <linux/init.h> | ||
#include <linux/delay.h> | ||
#include <linux/mm.h> | ||
#include <asm/addrspace.h> | ||
#include <linux/vmalloc.h> | ||
|
||
#include <lantiq_soc.h> | ||
|
||
#include "pci-lantiq.h" | ||
|
||
#define LTQ_PCI_CFG_BUSNUM_SHF 16 | ||
#define LTQ_PCI_CFG_DEVNUM_SHF 11 | ||
#define LTQ_PCI_CFG_FUNNUM_SHF 8 | ||
|
||
#define PCI_ACCESS_READ 0 | ||
#define PCI_ACCESS_WRITE 1 | ||
|
||
static int ltq_pci_config_access(unsigned char access_type, struct pci_bus *bus, | ||
unsigned int devfn, unsigned int where, u32 *data) | ||
{ | ||
unsigned long cfg_base; | ||
unsigned long flags; | ||
u32 temp; | ||
|
||
/* we support slot from 0 to 15 dev_fn & 0x68 (AD29) is the | ||
SoC itself */ | ||
if ((bus->number != 0) || ((devfn & 0xf8) > 0x78) | ||
|| ((devfn & 0xf8) == 0) || ((devfn & 0xf8) == 0x68)) | ||
return 1; | ||
|
||
spin_lock_irqsave(&ebu_lock, flags); | ||
|
||
cfg_base = (unsigned long) ltq_pci_mapped_cfg; | ||
cfg_base |= (bus->number << LTQ_PCI_CFG_BUSNUM_SHF) | (devfn << | ||
LTQ_PCI_CFG_FUNNUM_SHF) | (where & ~0x3); | ||
|
||
/* Perform access */ | ||
if (access_type == PCI_ACCESS_WRITE) { | ||
ltq_w32(swab32(*data), ((u32 *)cfg_base)); | ||
} else { | ||
*data = ltq_r32(((u32 *)(cfg_base))); | ||
*data = swab32(*data); | ||
} | ||
wmb(); | ||
|
||
/* clean possible Master abort */ | ||
cfg_base = (unsigned long) ltq_pci_mapped_cfg; | ||
cfg_base |= (0x0 << LTQ_PCI_CFG_FUNNUM_SHF) + 4; | ||
temp = ltq_r32(((u32 *)(cfg_base))); | ||
temp = swab32(temp); | ||
cfg_base = (unsigned long) ltq_pci_mapped_cfg; | ||
cfg_base |= (0x68 << LTQ_PCI_CFG_FUNNUM_SHF) + 4; | ||
ltq_w32(temp, ((u32 *)cfg_base)); | ||
|
||
spin_unlock_irqrestore(&ebu_lock, flags); | ||
|
||
if (((*data) == 0xffffffff) && (access_type == PCI_ACCESS_READ)) | ||
return 1; | ||
|
||
return 0; | ||
} | ||
|
||
int ltq_pci_read_config_dword(struct pci_bus *bus, unsigned int devfn, | ||
int where, int size, u32 *val) | ||
{ | ||
u32 data = 0; | ||
|
||
if (ltq_pci_config_access(PCI_ACCESS_READ, bus, devfn, where, &data)) | ||
return PCIBIOS_DEVICE_NOT_FOUND; | ||
|
||
if (size == 1) | ||
*val = (data >> ((where & 3) << 3)) & 0xff; | ||
else if (size == 2) | ||
*val = (data >> ((where & 3) << 3)) & 0xffff; | ||
else | ||
*val = data; | ||
|
||
return PCIBIOS_SUCCESSFUL; | ||
} | ||
|
||
int ltq_pci_write_config_dword(struct pci_bus *bus, unsigned int devfn, | ||
int where, int size, u32 val) | ||
{ | ||
u32 data = 0; | ||
|
||
if (size == 4) { | ||
data = val; | ||
} else { | ||
if (ltq_pci_config_access(PCI_ACCESS_READ, bus, | ||
devfn, where, &data)) | ||
return PCIBIOS_DEVICE_NOT_FOUND; | ||
|
||
if (size == 1) | ||
data = (data & ~(0xff << ((where & 3) << 3))) | | ||
(val << ((where & 3) << 3)); | ||
else if (size == 2) | ||
data = (data & ~(0xffff << ((where & 3) << 3))) | | ||
(val << ((where & 3) << 3)); | ||
} | ||
|
||
if (ltq_pci_config_access(PCI_ACCESS_WRITE, bus, devfn, where, &data)) | ||
return PCIBIOS_DEVICE_NOT_FOUND; | ||
|
||
return PCIBIOS_SUCCESSFUL; | ||
} |
Oops, something went wrong.