-
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.
Support for Toshiba's RBHMA4500 eval board for the TX4938.
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
- Loading branch information
Ralf Baechle
committed
Oct 29, 2005
1 parent
1329404
commit 23fbee9
Showing
24 changed files
with
4,118 additions
and
0 deletions.
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
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
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,92 @@ | ||
/* | ||
* Toshiba rbtx4938 pci routines | ||
* Copyright (C) 2000-2001 Toshiba Corporation | ||
* | ||
* 2003-2005 (c) MontaVista Software, Inc. This file is licensed under the | ||
* terms of the GNU General Public License version 2. This program is | ||
* licensed "as is" without any warranty of any kind, whether express | ||
* or implied. | ||
* | ||
* Support for TX4938 in 2.6 - Manish Lachwani (mlachwani@mvista.com) | ||
*/ | ||
#include <linux/types.h> | ||
#include <linux/pci.h> | ||
#include <linux/kernel.h> | ||
#include <linux/init.h> | ||
|
||
#include <asm/tx4938/rbtx4938.h> | ||
|
||
extern struct pci_controller tx4938_pci_controller[]; | ||
|
||
int pci_get_irq(struct pci_dev *dev, int pin) | ||
{ | ||
int irq = pin; | ||
u8 slot = PCI_SLOT(dev->devfn); | ||
struct pci_controller *controller = (struct pci_controller *)dev->sysdata; | ||
|
||
if (controller == &tx4938_pci_controller[1]) { | ||
/* TX4938 PCIC1 */ | ||
switch (slot) { | ||
case TX4938_PCIC_IDSEL_AD_TO_SLOT(31): | ||
if (tx4938_ccfgptr->pcfg & TX4938_PCFG_ETH0_SEL) | ||
return RBTX4938_IRQ_IRC + TX4938_IR_ETH0; | ||
break; | ||
case TX4938_PCIC_IDSEL_AD_TO_SLOT(30): | ||
if (tx4938_ccfgptr->pcfg & TX4938_PCFG_ETH1_SEL) | ||
return RBTX4938_IRQ_IRC + TX4938_IR_ETH1; | ||
break; | ||
} | ||
return 0; | ||
} | ||
|
||
/* IRQ rotation */ | ||
irq--; /* 0-3 */ | ||
if (dev->bus->parent == NULL && | ||
(slot == TX4938_PCIC_IDSEL_AD_TO_SLOT(23))) { | ||
/* PCI CardSlot (IDSEL=A23) */ | ||
/* PCIA => PCIA (IDSEL=A23) */ | ||
irq = (irq + 0 + slot) % 4; | ||
} else { | ||
/* PCI Backplane */ | ||
irq = (irq + 33 - slot) % 4; | ||
} | ||
irq++; /* 1-4 */ | ||
|
||
switch (irq) { | ||
case 1: | ||
irq = RBTX4938_IRQ_IOC_PCIA; | ||
break; | ||
case 2: | ||
irq = RBTX4938_IRQ_IOC_PCIB; | ||
break; | ||
case 3: | ||
irq = RBTX4938_IRQ_IOC_PCIC; | ||
break; | ||
case 4: | ||
irq = RBTX4938_IRQ_IOC_PCID; | ||
break; | ||
} | ||
return irq; | ||
} | ||
|
||
int __init pcibios_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | ||
{ | ||
unsigned char irq = 0; | ||
|
||
irq = pci_get_irq(dev, pin); | ||
|
||
printk(KERN_INFO "PCI: 0x%02x:0x%02x(0x%02x,0x%02x) IRQ=%d\n", | ||
dev->bus->number, dev->devfn, PCI_SLOT(dev->devfn), | ||
PCI_FUNC(dev->devfn), irq); | ||
|
||
return irq; | ||
} | ||
|
||
/* | ||
* Do platform specific device initialization at pci_enable_device() time | ||
*/ | ||
int pcibios_plat_dev_init(struct pci_dev *dev) | ||
{ | ||
return 0; | ||
} | ||
|
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,198 @@ | ||
/* | ||
* Define the pci_ops for the Toshiba rbtx4938 | ||
* Copyright (C) 2000-2001 Toshiba Corporation | ||
* | ||
* 2003-2005 (c) MontaVista Software, Inc. This file is licensed under the | ||
* terms of the GNU General Public License version 2. This program is | ||
* licensed "as is" without any warranty of any kind, whether express | ||
* or implied. | ||
* | ||
* Support for TX4938 in 2.6 - Manish Lachwani (mlachwani@mvista.com) | ||
*/ | ||
#include <linux/types.h> | ||
#include <linux/pci.h> | ||
#include <linux/kernel.h> | ||
#include <linux/init.h> | ||
|
||
#include <asm/addrspace.h> | ||
#include <asm/tx4938/rbtx4938.h> | ||
|
||
/* initialize in setup */ | ||
struct resource pci_io_resource = { | ||
.name = "pci IO space", | ||
.start = 0, | ||
.end = 0, | ||
.flags = IORESOURCE_IO | ||
}; | ||
|
||
/* initialize in setup */ | ||
struct resource pci_mem_resource = { | ||
.name = "pci memory space", | ||
.start = 0, | ||
.end = 0, | ||
.flags = IORESOURCE_MEM | ||
}; | ||
|
||
struct resource tx4938_pcic1_pci_io_resource = { | ||
.name = "PCI1 IO", | ||
.start = 0, | ||
.end = 0, | ||
.flags = IORESOURCE_IO | ||
}; | ||
struct resource tx4938_pcic1_pci_mem_resource = { | ||
.name = "PCI1 mem", | ||
.start = 0, | ||
.end = 0, | ||
.flags = IORESOURCE_MEM | ||
}; | ||
|
||
static int mkaddr(int bus, int dev_fn, int where, int *flagsp) | ||
{ | ||
if (bus > 0) { | ||
/* Type 1 configuration */ | ||
tx4938_pcicptr->g2pcfgadrs = ((bus & 0xff) << 0x10) | | ||
((dev_fn & 0xff) << 0x08) | (where & 0xfc) | 1; | ||
} else { | ||
if (dev_fn >= PCI_DEVFN(TX4938_PCIC_MAX_DEVNU, 0)) | ||
return -1; | ||
|
||
/* Type 0 configuration */ | ||
tx4938_pcicptr->g2pcfgadrs = ((bus & 0xff) << 0x10) | | ||
((dev_fn & 0xff) << 0x08) | (where & 0xfc); | ||
} | ||
/* clear M_ABORT and Disable M_ABORT Int. */ | ||
tx4938_pcicptr->pcistatus = | ||
(tx4938_pcicptr->pcistatus & 0x0000ffff) | | ||
(PCI_STATUS_REC_MASTER_ABORT << 16); | ||
tx4938_pcicptr->pcimask &= ~PCI_STATUS_REC_MASTER_ABORT; | ||
|
||
return 0; | ||
} | ||
|
||
static int check_abort(int flags) | ||
{ | ||
int code = PCIBIOS_SUCCESSFUL; | ||
/* wait write cycle completion before checking error status */ | ||
while (tx4938_pcicptr->pcicstatus & TX4938_PCIC_PCICSTATUS_IWB) | ||
; | ||
if (tx4938_pcicptr->pcistatus & (PCI_STATUS_REC_MASTER_ABORT << 16)) { | ||
tx4938_pcicptr->pcistatus = | ||
(tx4938_pcicptr-> | ||
pcistatus & 0x0000ffff) | (PCI_STATUS_REC_MASTER_ABORT | ||
<< 16); | ||
tx4938_pcicptr->pcimask |= PCI_STATUS_REC_MASTER_ABORT; | ||
code = PCIBIOS_DEVICE_NOT_FOUND; | ||
} | ||
return code; | ||
} | ||
|
||
static int tx4938_pcibios_read_config(struct pci_bus *bus, unsigned int devfn, | ||
int where, int size, u32 * val) | ||
{ | ||
int flags, retval, dev, busno, func; | ||
|
||
dev = PCI_SLOT(devfn); | ||
func = PCI_FUNC(devfn); | ||
|
||
/* check if the bus is top-level */ | ||
if (bus->parent != NULL) | ||
busno = bus->number; | ||
else { | ||
busno = 0; | ||
} | ||
|
||
if (mkaddr(busno, devfn, where, &flags)) | ||
return -1; | ||
|
||
switch (size) { | ||
case 1: | ||
*val = *(volatile u8 *) ((ulong) & tx4938_pcicptr->g2pcfgdata | | ||
#ifdef __BIG_ENDIAN | ||
((where & 3) ^ 3)); | ||
#else | ||
(where & 3)); | ||
#endif | ||
break; | ||
case 2: | ||
*val = *(volatile u16 *) ((ulong) & tx4938_pcicptr->g2pcfgdata | | ||
#ifdef __BIG_ENDIAN | ||
((where & 3) ^ 2)); | ||
#else | ||
(where & 3)); | ||
#endif | ||
break; | ||
case 4: | ||
*val = tx4938_pcicptr->g2pcfgdata; | ||
break; | ||
} | ||
|
||
retval = check_abort(flags); | ||
if (retval == PCIBIOS_DEVICE_NOT_FOUND) | ||
*val = 0xffffffff; | ||
|
||
return retval; | ||
} | ||
|
||
static int tx4938_pcibios_write_config(struct pci_bus *bus, unsigned int devfn, int where, | ||
int size, u32 val) | ||
{ | ||
int flags, dev, busno, func; | ||
|
||
busno = bus->number; | ||
dev = PCI_SLOT(devfn); | ||
func = PCI_FUNC(devfn); | ||
|
||
/* check if the bus is top-level */ | ||
if (bus->parent != NULL) { | ||
busno = bus->number; | ||
} else { | ||
busno = 0; | ||
} | ||
|
||
if (mkaddr(busno, devfn, where, &flags)) | ||
return -1; | ||
|
||
switch (size) { | ||
case 1: | ||
*(volatile u8 *) ((ulong) & tx4938_pcicptr->g2pcfgdata | | ||
#ifdef __BIG_ENDIAN | ||
((where & 3) ^ 3)) = val; | ||
#else | ||
(where & 3)) = val; | ||
#endif | ||
break; | ||
case 2: | ||
*(volatile u16 *) ((ulong) & tx4938_pcicptr->g2pcfgdata | | ||
#ifdef __BIG_ENDIAN | ||
((where & 0x3) ^ 0x2)) = val; | ||
#else | ||
(where & 3)) = val; | ||
#endif | ||
break; | ||
case 4: | ||
tx4938_pcicptr->g2pcfgdata = val; | ||
break; | ||
} | ||
|
||
return check_abort(flags); | ||
} | ||
|
||
struct pci_ops tx4938_pci_ops = { | ||
tx4938_pcibios_read_config, | ||
tx4938_pcibios_write_config | ||
}; | ||
|
||
struct pci_controller tx4938_pci_controller[] = { | ||
/* h/w only supports devices 0x00 to 0x14 */ | ||
{ | ||
.pci_ops = &tx4938_pci_ops, | ||
.io_resource = &pci_io_resource, | ||
.mem_resource = &pci_mem_resource, | ||
}, | ||
/* h/w only supports devices 0x00 to 0x14 */ | ||
{ | ||
.pci_ops = &tx4938_pci_ops, | ||
.io_resource = &tx4938_pcic1_pci_io_resource, | ||
.mem_resource = &tx4938_pcic1_pci_mem_resource, | ||
} | ||
}; |
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,24 @@ | ||
if TOSHIBA_RBTX4938 | ||
|
||
comment "Multiplex Pin Select" | ||
choice | ||
prompt "PIO[58:61]" | ||
default TOSHIBA_RBTX4938_MPLEX_PIO58_61 | ||
|
||
config TOSHIBA_RBTX4938_MPLEX_PIO58_61 | ||
bool "PIO" | ||
config TOSHIBA_RBTX4938_MPLEX_NAND | ||
bool "NAND" | ||
config TOSHIBA_RBTX4938_MPLEX_ATA | ||
bool "ATA" | ||
|
||
endchoice | ||
|
||
config TX4938_NAND_BOOT | ||
depends on EXPERIMENTAL && TOSHIBA_RBTX4938_MPLEX_NAND | ||
bool "NAND Boot Support (EXPERIMENTAL)" | ||
help | ||
This is only for Toshiba RBTX4938 reference board, which has NAND IPL. | ||
Select this option if you need to use NAND boot. | ||
|
||
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
# | ||
# Makefile for common code for Toshiba TX4927 based systems | ||
# | ||
# Note! Dependencies are done automagically by 'make dep', which also | ||
# removes any old dependencies. DON'T put your own dependencies here | ||
# unless it's something special (ie not a .c file). | ||
# | ||
|
||
obj-y += prom.o setup.o irq.o irq_handler.o rtc_rx5c348.o | ||
obj-$(CONFIG_KGDB) += dbgio.o | ||
|
Oops, something went wrong.