mirror of https://gitee.com/openkylin/linux.git
Merge gregkh@master.kernel.org:/pub/scm/linux/kernel/git/gregkh/driver-2.6
This commit is contained in:
commit
8ccc457722
|
@ -25,15 +25,6 @@ Who: Pavel Machek <pavel@suse.cz>
|
||||||
|
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
What: PCI Name Database (CONFIG_PCI_NAMES)
|
|
||||||
When: July 2005
|
|
||||||
Why: It bloats the kernel unnecessarily, and is handled by userspace better
|
|
||||||
(pciutils supports it.) Will eliminate the need to try to keep the
|
|
||||||
pci.ids file in sync with the sf.net database all of the time.
|
|
||||||
Who: Greg Kroah-Hartman <gregkh@suse.de>
|
|
||||||
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
What: io_remap_page_range() (macro or function)
|
What: io_remap_page_range() (macro or function)
|
||||||
When: September 2005
|
When: September 2005
|
||||||
Why: Replaced by io_remap_pfn_range() which allows more memory space
|
Why: Replaced by io_remap_pfn_range() which allows more memory space
|
||||||
|
|
|
@ -439,6 +439,18 @@ ChangeLog
|
||||||
|
|
||||||
Note, a technical ChangeLog aimed at kernel hackers is in fs/ntfs/ChangeLog.
|
Note, a technical ChangeLog aimed at kernel hackers is in fs/ntfs/ChangeLog.
|
||||||
|
|
||||||
|
2.1.24:
|
||||||
|
- Support journals ($LogFile) which have been modified by chkdsk. This
|
||||||
|
means users can boot into Windows after we marked the volume dirty.
|
||||||
|
The Windows boot will run chkdsk and then reboot. The user can then
|
||||||
|
immediately boot into Linux rather than having to do a full Windows
|
||||||
|
boot first before rebooting into Linux and we will recognize such a
|
||||||
|
journal and empty it as it is clean by definition.
|
||||||
|
- Support journals ($LogFile) with only one restart page as well as
|
||||||
|
journals with two different restart pages. We sanity check both and
|
||||||
|
either use the only sane one or the more recent one of the two in the
|
||||||
|
case that both are valid.
|
||||||
|
- Lots of bug fixes and enhancements across the board.
|
||||||
2.1.23:
|
2.1.23:
|
||||||
- Stamp the user space journal, aka transaction log, aka $UsnJrnl, if
|
- Stamp the user space journal, aka transaction log, aka $UsnJrnl, if
|
||||||
it is present and active thus telling Windows and applications using
|
it is present and active thus telling Windows and applications using
|
||||||
|
|
|
@ -0,0 +1,203 @@
|
||||||
|
Driver documentation for yealink usb-p1k phones
|
||||||
|
|
||||||
|
0. Status
|
||||||
|
~~~~~~~~~
|
||||||
|
|
||||||
|
The p1k is a relatively cheap usb 1.1 phone with:
|
||||||
|
- keyboard full support, yealink.ko / input event API
|
||||||
|
- LCD full support, yealink.ko / sysfs API
|
||||||
|
- LED full support, yealink.ko / sysfs API
|
||||||
|
- dialtone full support, yealink.ko / sysfs API
|
||||||
|
- ringtone full support, yealink.ko / sysfs API
|
||||||
|
- audio playback full support, snd_usb_audio.ko / alsa API
|
||||||
|
- audio record full support, snd_usb_audio.ko / alsa API
|
||||||
|
|
||||||
|
For vendor documentation see http://www.yealink.com
|
||||||
|
|
||||||
|
|
||||||
|
1. Compilation (stand alone version)
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Currently only kernel 2.6.x.y versions are supported.
|
||||||
|
In order to build the yealink.ko module do:
|
||||||
|
|
||||||
|
make
|
||||||
|
|
||||||
|
If you encounter problems please check if in the MAKE_OPTS variable in
|
||||||
|
the Makefile is pointing to the location where your kernel sources
|
||||||
|
are located, default /usr/src/linux.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2. keyboard features
|
||||||
|
~~~~~~~~~~~~~~~~~~~~
|
||||||
|
The current mapping in the kernel is provided by the map_p1k_to_key
|
||||||
|
function:
|
||||||
|
|
||||||
|
Physical USB-P1K button layout input events
|
||||||
|
|
||||||
|
|
||||||
|
up up
|
||||||
|
IN OUT left, right
|
||||||
|
down down
|
||||||
|
|
||||||
|
pickup C hangup enter, backspace, escape
|
||||||
|
1 2 3 1, 2, 3
|
||||||
|
4 5 6 4, 5, 6,
|
||||||
|
7 8 9 7, 8, 9,
|
||||||
|
* 0 # *, 0, #,
|
||||||
|
|
||||||
|
The "up" and "down" keys, are symbolised by arrows on the button.
|
||||||
|
The "pickup" and "hangup" keys are symbolised by a green and red phone
|
||||||
|
on the button.
|
||||||
|
|
||||||
|
|
||||||
|
3. LCD features
|
||||||
|
~~~~~~~~~~~~~~~
|
||||||
|
The LCD is divided and organised as a 3 line display:
|
||||||
|
|
||||||
|
|[] [][] [][] [][] in |[][]
|
||||||
|
|[] M [][] D [][] : [][] out |[][]
|
||||||
|
store
|
||||||
|
|
||||||
|
NEW REP SU MO TU WE TH FR SA
|
||||||
|
|
||||||
|
[] [] [] [] [] [] [] [] [] [] [] []
|
||||||
|
[] [] [] [] [] [] [] [] [] [] [] []
|
||||||
|
|
||||||
|
|
||||||
|
Line 1 Format (see below) : 18.e8.M8.88...188
|
||||||
|
Icon names : M D : IN OUT STORE
|
||||||
|
Line 2 Format : .........
|
||||||
|
Icon name : NEW REP SU MO TU WE TH FR SA
|
||||||
|
Line 3 Format : 888888888888
|
||||||
|
|
||||||
|
|
||||||
|
Format description:
|
||||||
|
From a user space perspective the world is seperated in "digits" and "icons".
|
||||||
|
A digit can have a character set, an icon can only be ON or OFF.
|
||||||
|
|
||||||
|
Format specifier
|
||||||
|
'8' : Generic 7 segment digit with individual addressable segments
|
||||||
|
|
||||||
|
Reduced capabillity 7 segm digit, when segments are hard wired together.
|
||||||
|
'1' : 2 segments digit only able to produce a 1.
|
||||||
|
'e' : Most significant day of the month digit,
|
||||||
|
able to produce at least 1 2 3.
|
||||||
|
'M' : Most significant minute digit,
|
||||||
|
able to produce at least 0 1 2 3 4 5.
|
||||||
|
|
||||||
|
Icons or pictograms:
|
||||||
|
'.' : For example like AM, PM, SU, a 'dot' .. or other single segment
|
||||||
|
elements.
|
||||||
|
|
||||||
|
|
||||||
|
4. Driver usage
|
||||||
|
~~~~~~~~~~~~~~~
|
||||||
|
For userland the following interfaces are available using the sysfs interface:
|
||||||
|
/sys/.../
|
||||||
|
line1 Read/Write, lcd line1
|
||||||
|
line2 Read/Write, lcd line2
|
||||||
|
line3 Read/Write, lcd line3
|
||||||
|
|
||||||
|
get_icons Read, returns a set of available icons.
|
||||||
|
hide_icon Write, hide the element by writing the icon name.
|
||||||
|
show_icon Write, display the element by writing the icon name.
|
||||||
|
|
||||||
|
map_seg7 Read/Write, the 7 segments char set, common for all
|
||||||
|
yealink phones. (see map_to_7segment.h)
|
||||||
|
|
||||||
|
ringtone Write, upload binary representation of a ringtone,
|
||||||
|
see yealink.c. status EXPERIMENTAL due to potential
|
||||||
|
races between async. and sync usb calls.
|
||||||
|
|
||||||
|
|
||||||
|
4.1 lineX
|
||||||
|
~~~~~~~~~
|
||||||
|
Reading /sys/../lineX will return the format string with its current value:
|
||||||
|
|
||||||
|
Example:
|
||||||
|
cat ./line3
|
||||||
|
888888888888
|
||||||
|
Linux Rocks!
|
||||||
|
|
||||||
|
Writing to /sys/../lineX will set the coresponding LCD line.
|
||||||
|
- Excess characters are ignored.
|
||||||
|
- If less characters are written than allowed, the remaining digits are
|
||||||
|
unchanged.
|
||||||
|
- The tab '\t'and '\n' char does not overwrite the original content.
|
||||||
|
- Writing a space to an icon will always hide its content.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
date +"%m.%e.%k:%M" | sed 's/^0/ /' > ./line1
|
||||||
|
|
||||||
|
Will update the LCD with the current date & time.
|
||||||
|
|
||||||
|
|
||||||
|
4.2 get_icons
|
||||||
|
~~~~~~~~~~~~~
|
||||||
|
Reading will return all available icon names and its current settings:
|
||||||
|
|
||||||
|
cat ./get_icons
|
||||||
|
on M
|
||||||
|
on D
|
||||||
|
on :
|
||||||
|
IN
|
||||||
|
OUT
|
||||||
|
STORE
|
||||||
|
NEW
|
||||||
|
REP
|
||||||
|
SU
|
||||||
|
MO
|
||||||
|
TU
|
||||||
|
WE
|
||||||
|
TH
|
||||||
|
FR
|
||||||
|
SA
|
||||||
|
LED
|
||||||
|
DIALTONE
|
||||||
|
RINGTONE
|
||||||
|
|
||||||
|
|
||||||
|
4.3 show/hide icons
|
||||||
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
Writing to these files will update the state of the icon.
|
||||||
|
Only one icon at a time can be updated.
|
||||||
|
|
||||||
|
If an icon is also on a ./lineX the corresponding value is
|
||||||
|
updated with the first letter of the icon.
|
||||||
|
|
||||||
|
Example - light up the store icon:
|
||||||
|
echo -n "STORE" > ./show_icon
|
||||||
|
|
||||||
|
cat ./line1
|
||||||
|
18.e8.M8.88...188
|
||||||
|
S
|
||||||
|
|
||||||
|
Example - sound the ringtone for 10 seconds:
|
||||||
|
echo -n RINGTONE > /sys/..../show_icon
|
||||||
|
sleep 10
|
||||||
|
echo -n RINGTONE > /sys/..../hide_icon
|
||||||
|
|
||||||
|
|
||||||
|
5. Sound features
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
Sound is supported by the ALSA driver: snd_usb_audio
|
||||||
|
|
||||||
|
One 16-bit channel with sample and playback rates of 8000 Hz is the practical
|
||||||
|
limit of the device.
|
||||||
|
|
||||||
|
Example - recording test:
|
||||||
|
arecord -v -d 10 -r 8000 -f S16_LE -t wav foobar.wav
|
||||||
|
|
||||||
|
Example - playback test:
|
||||||
|
aplay foobar.wav
|
||||||
|
|
||||||
|
|
||||||
|
6. Credits & Acknowledgments
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
- Olivier Vandorpe, for starting the usbb2k-api project doing much of
|
||||||
|
the reverse engineering.
|
||||||
|
- Martin Diehl, for pointing out how to handle USB memory allocation.
|
||||||
|
- Dmitry Torokhov, for the numerous code reviews and suggestions.
|
||||||
|
|
13
MAINTAINERS
13
MAINTAINERS
|
@ -116,6 +116,12 @@ M: ajk@iehk.rwth-aachen.de
|
||||||
L: linux-hams@vger.kernel.org
|
L: linux-hams@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
YEALINK PHONE DRIVER
|
||||||
|
P: Henk Vergonet
|
||||||
|
M: Henk.Vergonet@gmail.com
|
||||||
|
L: usbb2k-api-dev@nongnu.org
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
8139CP 10/100 FAST ETHERNET DRIVER
|
8139CP 10/100 FAST ETHERNET DRIVER
|
||||||
P: Jeff Garzik
|
P: Jeff Garzik
|
||||||
M: jgarzik@pobox.com
|
M: jgarzik@pobox.com
|
||||||
|
@ -1813,13 +1819,6 @@ M: hch@infradead.org
|
||||||
L: linux-abi-devel@lists.sourceforge.net
|
L: linux-abi-devel@lists.sourceforge.net
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
PCI ID DATABASE
|
|
||||||
P: Martin Mares
|
|
||||||
M: mj@ucw.cz
|
|
||||||
L: pciids-devel@lists.sourceforge.net
|
|
||||||
W: http://pciids.sourceforge.net/
|
|
||||||
S: Maintained
|
|
||||||
|
|
||||||
PCI SOUND DRIVERS (ES1370, ES1371 and SONICVIBES)
|
PCI SOUND DRIVERS (ES1370, ES1371 and SONICVIBES)
|
||||||
P: Thomas Sailer
|
P: Thomas Sailer
|
||||||
M: sailer@ife.ee.ethz.ch
|
M: sailer@ife.ee.ethz.ch
|
||||||
|
|
|
@ -373,12 +373,11 @@ marvel_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
irq += 0x80; /* offset for lsi */
|
irq += 0x80; /* offset for lsi */
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
printk("PCI:%d:%d:%d (hose %d) [%s] is using MSI\n",
|
printk("PCI:%d:%d:%d (hose %d) is using MSI\n",
|
||||||
dev->bus->number,
|
dev->bus->number,
|
||||||
PCI_SLOT(dev->devfn),
|
PCI_SLOT(dev->devfn),
|
||||||
PCI_FUNC(dev->devfn),
|
PCI_FUNC(dev->devfn),
|
||||||
hose->index,
|
hose->index);
|
||||||
pci_pretty_name (dev));
|
|
||||||
printk(" %d message(s) from 0x%04x\n",
|
printk(" %d message(s) from 0x%04x\n",
|
||||||
1 << ((msg_ctl & PCI_MSI_FLAGS_QSIZE) >> 4),
|
1 << ((msg_ctl & PCI_MSI_FLAGS_QSIZE) >> 4),
|
||||||
msg_dat);
|
msg_dat);
|
||||||
|
|
|
@ -541,6 +541,103 @@ locomo_init_one_child(struct locomo *lchip, struct locomo_dev_info *info)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_PM
|
||||||
|
|
||||||
|
struct locomo_save_data {
|
||||||
|
u16 LCM_GPO;
|
||||||
|
u16 LCM_SPICT;
|
||||||
|
u16 LCM_GPE;
|
||||||
|
u16 LCM_ASD;
|
||||||
|
u16 LCM_SPIMD;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int locomo_suspend(struct device *dev, u32 pm_message_t, u32 level)
|
||||||
|
{
|
||||||
|
struct locomo *lchip = dev_get_drvdata(dev);
|
||||||
|
struct locomo_save_data *save;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
if (level != SUSPEND_DISABLE)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
save = kmalloc(sizeof(struct locomo_save_data), GFP_KERNEL);
|
||||||
|
if (!save)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
dev->power.saved_state = (void *) save;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&lchip->lock, flags);
|
||||||
|
|
||||||
|
save->LCM_GPO = locomo_readl(lchip->base + LOCOMO_GPO); /* GPIO */
|
||||||
|
locomo_writel(0x00, lchip->base + LOCOMO_GPO);
|
||||||
|
save->LCM_SPICT = locomo_readl(lchip->base + LOCOMO_SPICT); /* SPI */
|
||||||
|
locomo_writel(0x40, lchip->base + LOCOMO_SPICT);
|
||||||
|
save->LCM_GPE = locomo_readl(lchip->base + LOCOMO_GPE); /* GPIO */
|
||||||
|
locomo_writel(0x00, lchip->base + LOCOMO_GPE);
|
||||||
|
save->LCM_ASD = locomo_readl(lchip->base + LOCOMO_ASD); /* ADSTART */
|
||||||
|
locomo_writel(0x00, lchip->base + LOCOMO_ASD);
|
||||||
|
save->LCM_SPIMD = locomo_readl(lchip->base + LOCOMO_SPIMD); /* SPI */
|
||||||
|
locomo_writel(0x3C14, lchip->base + LOCOMO_SPIMD);
|
||||||
|
|
||||||
|
locomo_writel(0x00, lchip->base + LOCOMO_PAIF);
|
||||||
|
locomo_writel(0x00, lchip->base + LOCOMO_DAC);
|
||||||
|
locomo_writel(0x00, lchip->base + LOCOMO_BACKLIGHT + LOCOMO_TC);
|
||||||
|
|
||||||
|
if ( (locomo_readl(lchip->base + LOCOMO_LED + LOCOMO_LPT0) & 0x88) && (locomo_readl(lchip->base + LOCOMO_LED + LOCOMO_LPT1) & 0x88) )
|
||||||
|
locomo_writel(0x00, lchip->base + LOCOMO_C32K); /* CLK32 off */
|
||||||
|
else
|
||||||
|
/* 18MHz already enabled, so no wait */
|
||||||
|
locomo_writel(0xc1, lchip->base + LOCOMO_C32K); /* CLK32 on */
|
||||||
|
|
||||||
|
locomo_writel(0x00, lchip->base + LOCOMO_TADC); /* 18MHz clock off*/
|
||||||
|
locomo_writel(0x00, lchip->base + LOCOMO_AUDIO + LOCOMO_ACC); /* 22MHz/24MHz clock off */
|
||||||
|
locomo_writel(0x00, lchip->base + LOCOMO_FRONTLIGHT + LOCOMO_ALS); /* FL */
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(&lchip->lock, flags);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int locomo_resume(struct device *dev, u32 level)
|
||||||
|
{
|
||||||
|
struct locomo *lchip = dev_get_drvdata(dev);
|
||||||
|
struct locomo_save_data *save;
|
||||||
|
unsigned long r;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
if (level != RESUME_ENABLE)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
save = (struct locomo_save_data *) dev->power.saved_state;
|
||||||
|
if (!save)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&lchip->lock, flags);
|
||||||
|
|
||||||
|
locomo_writel(save->LCM_GPO, lchip->base + LOCOMO_GPO);
|
||||||
|
locomo_writel(save->LCM_SPICT, lchip->base + LOCOMO_SPICT);
|
||||||
|
locomo_writel(save->LCM_GPE, lchip->base + LOCOMO_GPE);
|
||||||
|
locomo_writel(save->LCM_ASD, lchip->base + LOCOMO_ASD);
|
||||||
|
locomo_writel(save->LCM_SPIMD, lchip->base + LOCOMO_SPIMD);
|
||||||
|
|
||||||
|
locomo_writel(0x00, lchip->base + LOCOMO_C32K);
|
||||||
|
locomo_writel(0x90, lchip->base + LOCOMO_TADC);
|
||||||
|
|
||||||
|
locomo_writel(0, lchip->base + LOCOMO_KEYBOARD + LOCOMO_KSC);
|
||||||
|
r = locomo_readl(lchip->base + LOCOMO_KEYBOARD + LOCOMO_KIC);
|
||||||
|
r &= 0xFEFF;
|
||||||
|
locomo_writel(r, lchip->base + LOCOMO_KEYBOARD + LOCOMO_KIC);
|
||||||
|
locomo_writel(0x1, lchip->base + LOCOMO_KEYBOARD + LOCOMO_KCMD);
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(&lchip->lock, flags);
|
||||||
|
|
||||||
|
dev->power.saved_state = NULL;
|
||||||
|
kfree(save);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* locomo_probe - probe for a single LoCoMo chip.
|
* locomo_probe - probe for a single LoCoMo chip.
|
||||||
* @phys_addr: physical address of device.
|
* @phys_addr: physical address of device.
|
||||||
|
@ -707,6 +804,10 @@ static struct device_driver locomo_device_driver = {
|
||||||
.bus = &platform_bus_type,
|
.bus = &platform_bus_type,
|
||||||
.probe = locomo_probe,
|
.probe = locomo_probe,
|
||||||
.remove = locomo_remove,
|
.remove = locomo_remove,
|
||||||
|
#ifdef CONFIG_PM
|
||||||
|
.suspend = locomo_suspend,
|
||||||
|
.resume = locomo_resume,
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.12-git4
|
# Linux kernel version: 2.6.13-git8
|
||||||
# Wed Jun 22 15:56:42 2005
|
# Thu Sep 8 19:24:02 2005
|
||||||
#
|
#
|
||||||
CONFIG_ARM=y
|
CONFIG_ARM=y
|
||||||
CONFIG_MMU=y
|
CONFIG_MMU=y
|
||||||
|
@ -22,6 +22,7 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||||
# General setup
|
# General setup
|
||||||
#
|
#
|
||||||
CONFIG_LOCALVERSION=""
|
CONFIG_LOCALVERSION=""
|
||||||
|
CONFIG_LOCALVERSION_AUTO=y
|
||||||
CONFIG_SWAP=y
|
CONFIG_SWAP=y
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
# CONFIG_POSIX_MQUEUE is not set
|
# CONFIG_POSIX_MQUEUE is not set
|
||||||
|
@ -31,6 +32,7 @@ CONFIG_SYSCTL=y
|
||||||
# CONFIG_HOTPLUG is not set
|
# CONFIG_HOTPLUG is not set
|
||||||
CONFIG_KOBJECT_UEVENT=y
|
CONFIG_KOBJECT_UEVENT=y
|
||||||
# CONFIG_IKCONFIG is not set
|
# CONFIG_IKCONFIG is not set
|
||||||
|
CONFIG_INITRAMFS_SOURCE=""
|
||||||
# CONFIG_EMBEDDED is not set
|
# CONFIG_EMBEDDED is not set
|
||||||
CONFIG_KALLSYMS=y
|
CONFIG_KALLSYMS=y
|
||||||
# CONFIG_KALLSYMS_ALL is not set
|
# CONFIG_KALLSYMS_ALL is not set
|
||||||
|
@ -88,7 +90,9 @@ CONFIG_ARCH_S3C2410=y
|
||||||
#
|
#
|
||||||
# S3C24XX Implementations
|
# S3C24XX Implementations
|
||||||
#
|
#
|
||||||
|
CONFIG_MACH_ANUBIS=y
|
||||||
CONFIG_ARCH_BAST=y
|
CONFIG_ARCH_BAST=y
|
||||||
|
CONFIG_BAST_PC104_IRQ=y
|
||||||
CONFIG_ARCH_H1940=y
|
CONFIG_ARCH_H1940=y
|
||||||
CONFIG_MACH_N30=y
|
CONFIG_MACH_N30=y
|
||||||
CONFIG_ARCH_SMDK2410=y
|
CONFIG_ARCH_SMDK2410=y
|
||||||
|
@ -112,6 +116,7 @@ CONFIG_S3C2410_DMA=y
|
||||||
# CONFIG_S3C2410_DMA_DEBUG is not set
|
# CONFIG_S3C2410_DMA_DEBUG is not set
|
||||||
# CONFIG_S3C2410_PM_DEBUG is not set
|
# CONFIG_S3C2410_PM_DEBUG is not set
|
||||||
# CONFIG_S3C2410_PM_CHECK is not set
|
# CONFIG_S3C2410_PM_CHECK is not set
|
||||||
|
CONFIG_PM_SIMTEC=y
|
||||||
CONFIG_S3C2410_LOWLEVEL_UART_PORT=0
|
CONFIG_S3C2410_LOWLEVEL_UART_PORT=0
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -149,7 +154,15 @@ CONFIG_ISA_DMA_API=y
|
||||||
#
|
#
|
||||||
# CONFIG_SMP is not set
|
# CONFIG_SMP is not set
|
||||||
# CONFIG_PREEMPT is not set
|
# CONFIG_PREEMPT is not set
|
||||||
# CONFIG_DISCONTIGMEM is not set
|
# CONFIG_NO_IDLE_HZ is not set
|
||||||
|
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||||
|
CONFIG_SELECT_MEMORY_MODEL=y
|
||||||
|
CONFIG_FLATMEM_MANUAL=y
|
||||||
|
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||||
|
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||||
|
CONFIG_FLATMEM=y
|
||||||
|
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||||
|
# CONFIG_SPARSEMEM_STATIC is not set
|
||||||
CONFIG_ALIGNMENT_TRAP=y
|
CONFIG_ALIGNMENT_TRAP=y
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -185,6 +198,74 @@ CONFIG_BINFMT_AOUT=y
|
||||||
CONFIG_PM=y
|
CONFIG_PM=y
|
||||||
CONFIG_APM=y
|
CONFIG_APM=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Networking
|
||||||
|
#
|
||||||
|
CONFIG_NET=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Networking options
|
||||||
|
#
|
||||||
|
# CONFIG_PACKET is not set
|
||||||
|
CONFIG_UNIX=y
|
||||||
|
# CONFIG_NET_KEY is not set
|
||||||
|
CONFIG_INET=y
|
||||||
|
# CONFIG_IP_MULTICAST is not set
|
||||||
|
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||||
|
CONFIG_IP_FIB_HASH=y
|
||||||
|
CONFIG_IP_PNP=y
|
||||||
|
# CONFIG_IP_PNP_DHCP is not set
|
||||||
|
CONFIG_IP_PNP_BOOTP=y
|
||||||
|
# CONFIG_IP_PNP_RARP is not set
|
||||||
|
# CONFIG_NET_IPIP is not set
|
||||||
|
# CONFIG_NET_IPGRE is not set
|
||||||
|
# CONFIG_ARPD is not set
|
||||||
|
# CONFIG_SYN_COOKIES is not set
|
||||||
|
# CONFIG_INET_AH is not set
|
||||||
|
# CONFIG_INET_ESP is not set
|
||||||
|
# CONFIG_INET_IPCOMP is not set
|
||||||
|
# CONFIG_INET_TUNNEL is not set
|
||||||
|
CONFIG_INET_DIAG=y
|
||||||
|
CONFIG_INET_TCP_DIAG=y
|
||||||
|
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||||
|
CONFIG_TCP_CONG_BIC=y
|
||||||
|
# CONFIG_IPV6 is not set
|
||||||
|
# CONFIG_NETFILTER is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# DCCP Configuration (EXPERIMENTAL)
|
||||||
|
#
|
||||||
|
# CONFIG_IP_DCCP is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# SCTP Configuration (EXPERIMENTAL)
|
||||||
|
#
|
||||||
|
# CONFIG_IP_SCTP is not set
|
||||||
|
# CONFIG_ATM is not set
|
||||||
|
# CONFIG_BRIDGE is not set
|
||||||
|
# CONFIG_VLAN_8021Q is not set
|
||||||
|
# CONFIG_DECNET is not set
|
||||||
|
# CONFIG_LLC2 is not set
|
||||||
|
# CONFIG_IPX is not set
|
||||||
|
# CONFIG_ATALK is not set
|
||||||
|
# CONFIG_X25 is not set
|
||||||
|
# CONFIG_LAPB is not set
|
||||||
|
# CONFIG_NET_DIVERT is not set
|
||||||
|
# CONFIG_ECONET is not set
|
||||||
|
# CONFIG_WAN_ROUTER is not set
|
||||||
|
# CONFIG_NET_SCHED is not set
|
||||||
|
# CONFIG_NET_CLS_ROUTE is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Network testing
|
||||||
|
#
|
||||||
|
# CONFIG_NET_PKTGEN is not set
|
||||||
|
# CONFIG_NETFILTER_NETLINK is not set
|
||||||
|
# CONFIG_HAMRADIO is not set
|
||||||
|
# CONFIG_IRDA is not set
|
||||||
|
# CONFIG_BT is not set
|
||||||
|
# CONFIG_IEEE80211 is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Device Drivers
|
# Device Drivers
|
||||||
#
|
#
|
||||||
|
@ -258,6 +339,7 @@ CONFIG_MTD_ROM=y
|
||||||
# CONFIG_MTD_IMPA7 is not set
|
# CONFIG_MTD_IMPA7 is not set
|
||||||
CONFIG_MTD_BAST=y
|
CONFIG_MTD_BAST=y
|
||||||
CONFIG_MTD_BAST_MAXSIZE=4
|
CONFIG_MTD_BAST_MAXSIZE=4
|
||||||
|
# CONFIG_MTD_PLATRAM is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Self-contained MTD device drivers
|
# Self-contained MTD device drivers
|
||||||
|
@ -312,7 +394,6 @@ CONFIG_BLK_DEV_RAM=y
|
||||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||||
CONFIG_BLK_DEV_RAM_SIZE=4096
|
CONFIG_BLK_DEV_RAM_SIZE=4096
|
||||||
CONFIG_BLK_DEV_INITRD=y
|
CONFIG_BLK_DEV_INITRD=y
|
||||||
CONFIG_INITRAMFS_SOURCE=""
|
|
||||||
# CONFIG_CDROM_PKTCDVD is not set
|
# CONFIG_CDROM_PKTCDVD is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -354,6 +435,7 @@ CONFIG_BLK_DEV_IDE_BAST=y
|
||||||
#
|
#
|
||||||
# SCSI device support
|
# SCSI device support
|
||||||
#
|
#
|
||||||
|
# CONFIG_RAID_ATTRS is not set
|
||||||
# CONFIG_SCSI is not set
|
# CONFIG_SCSI is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -376,76 +458,19 @@ CONFIG_BLK_DEV_IDE_BAST=y
|
||||||
#
|
#
|
||||||
|
|
||||||
#
|
#
|
||||||
# Networking support
|
# Network device support
|
||||||
#
|
#
|
||||||
CONFIG_NET=y
|
|
||||||
|
|
||||||
#
|
|
||||||
# Networking options
|
|
||||||
#
|
|
||||||
# CONFIG_PACKET is not set
|
|
||||||
CONFIG_UNIX=y
|
|
||||||
# CONFIG_NET_KEY is not set
|
|
||||||
CONFIG_INET=y
|
|
||||||
CONFIG_IP_FIB_HASH=y
|
|
||||||
# CONFIG_IP_FIB_TRIE is not set
|
|
||||||
# CONFIG_IP_MULTICAST is not set
|
|
||||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
|
||||||
CONFIG_IP_PNP=y
|
|
||||||
# CONFIG_IP_PNP_DHCP is not set
|
|
||||||
CONFIG_IP_PNP_BOOTP=y
|
|
||||||
# CONFIG_IP_PNP_RARP is not set
|
|
||||||
# CONFIG_NET_IPIP is not set
|
|
||||||
# CONFIG_NET_IPGRE is not set
|
|
||||||
# CONFIG_ARPD is not set
|
|
||||||
# CONFIG_SYN_COOKIES is not set
|
|
||||||
# CONFIG_INET_AH is not set
|
|
||||||
# CONFIG_INET_ESP is not set
|
|
||||||
# CONFIG_INET_IPCOMP is not set
|
|
||||||
# CONFIG_INET_TUNNEL is not set
|
|
||||||
CONFIG_IP_TCPDIAG=y
|
|
||||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
|
||||||
# CONFIG_IPV6 is not set
|
|
||||||
# CONFIG_NETFILTER is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# SCTP Configuration (EXPERIMENTAL)
|
|
||||||
#
|
|
||||||
# CONFIG_IP_SCTP is not set
|
|
||||||
# CONFIG_ATM is not set
|
|
||||||
# CONFIG_BRIDGE is not set
|
|
||||||
# CONFIG_VLAN_8021Q is not set
|
|
||||||
# CONFIG_DECNET is not set
|
|
||||||
# CONFIG_LLC2 is not set
|
|
||||||
# CONFIG_IPX is not set
|
|
||||||
# CONFIG_ATALK is not set
|
|
||||||
# CONFIG_X25 is not set
|
|
||||||
# CONFIG_LAPB is not set
|
|
||||||
# CONFIG_NET_DIVERT is not set
|
|
||||||
# CONFIG_ECONET is not set
|
|
||||||
# CONFIG_WAN_ROUTER is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# QoS and/or fair queueing
|
|
||||||
#
|
|
||||||
# CONFIG_NET_SCHED is not set
|
|
||||||
# CONFIG_NET_CLS_ROUTE is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Network testing
|
|
||||||
#
|
|
||||||
# CONFIG_NET_PKTGEN is not set
|
|
||||||
# CONFIG_NETPOLL is not set
|
|
||||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
|
||||||
# CONFIG_HAMRADIO is not set
|
|
||||||
# CONFIG_IRDA is not set
|
|
||||||
# CONFIG_BT is not set
|
|
||||||
CONFIG_NETDEVICES=y
|
CONFIG_NETDEVICES=y
|
||||||
# CONFIG_DUMMY is not set
|
# CONFIG_DUMMY is not set
|
||||||
# CONFIG_BONDING is not set
|
# CONFIG_BONDING is not set
|
||||||
# CONFIG_EQUALIZER is not set
|
# CONFIG_EQUALIZER is not set
|
||||||
# CONFIG_TUN is not set
|
# CONFIG_TUN is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# PHY device support
|
||||||
|
#
|
||||||
|
# CONFIG_PHYLIB is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Ethernet (10 or 100Mbit)
|
# Ethernet (10 or 100Mbit)
|
||||||
#
|
#
|
||||||
|
@ -480,6 +505,8 @@ CONFIG_DM9000=m
|
||||||
# CONFIG_SLIP is not set
|
# CONFIG_SLIP is not set
|
||||||
# CONFIG_SHAPER is not set
|
# CONFIG_SHAPER is not set
|
||||||
# CONFIG_NETCONSOLE is not set
|
# CONFIG_NETCONSOLE is not set
|
||||||
|
# CONFIG_NETPOLL is not set
|
||||||
|
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# ISDN subsystem
|
# ISDN subsystem
|
||||||
|
@ -562,7 +589,6 @@ CONFIG_SERIAL_8250_EXTENDED=y
|
||||||
CONFIG_SERIAL_8250_MANY_PORTS=y
|
CONFIG_SERIAL_8250_MANY_PORTS=y
|
||||||
CONFIG_SERIAL_8250_SHARE_IRQ=y
|
CONFIG_SERIAL_8250_SHARE_IRQ=y
|
||||||
# CONFIG_SERIAL_8250_DETECT_IRQ is not set
|
# CONFIG_SERIAL_8250_DETECT_IRQ is not set
|
||||||
# CONFIG_SERIAL_8250_MULTIPORT is not set
|
|
||||||
# CONFIG_SERIAL_8250_RSA is not set
|
# CONFIG_SERIAL_8250_RSA is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -605,7 +631,6 @@ CONFIG_S3C2410_RTC=y
|
||||||
#
|
#
|
||||||
# Ftape, the floppy tape device driver
|
# Ftape, the floppy tape device driver
|
||||||
#
|
#
|
||||||
# CONFIG_DRM is not set
|
|
||||||
# CONFIG_RAW_DRIVER is not set
|
# CONFIG_RAW_DRIVER is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -628,7 +653,7 @@ CONFIG_I2C_ALGOBIT=m
|
||||||
#
|
#
|
||||||
# I2C Hardware Bus support
|
# I2C Hardware Bus support
|
||||||
#
|
#
|
||||||
# CONFIG_I2C_ISA is not set
|
CONFIG_I2C_ISA=m
|
||||||
# CONFIG_I2C_PARPORT is not set
|
# CONFIG_I2C_PARPORT is not set
|
||||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||||
CONFIG_I2C_S3C2410=y
|
CONFIG_I2C_S3C2410=y
|
||||||
|
@ -636,14 +661,33 @@ CONFIG_I2C_S3C2410=y
|
||||||
# CONFIG_I2C_PCA_ISA is not set
|
# CONFIG_I2C_PCA_ISA is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Hardware Sensors Chip support
|
# Miscellaneous I2C Chip support
|
||||||
#
|
#
|
||||||
CONFIG_I2C_SENSOR=m
|
# CONFIG_SENSORS_DS1337 is not set
|
||||||
|
# CONFIG_SENSORS_DS1374 is not set
|
||||||
|
CONFIG_SENSORS_EEPROM=m
|
||||||
|
# CONFIG_SENSORS_PCF8574 is not set
|
||||||
|
# CONFIG_SENSORS_PCA9539 is not set
|
||||||
|
# CONFIG_SENSORS_PCF8591 is not set
|
||||||
|
# CONFIG_SENSORS_RTC8564 is not set
|
||||||
|
# CONFIG_SENSORS_MAX6875 is not set
|
||||||
|
# CONFIG_I2C_DEBUG_CORE is not set
|
||||||
|
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||||
|
# CONFIG_I2C_DEBUG_BUS is not set
|
||||||
|
# CONFIG_I2C_DEBUG_CHIP is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Hardware Monitoring support
|
||||||
|
#
|
||||||
|
CONFIG_HWMON=y
|
||||||
|
CONFIG_HWMON_VID=m
|
||||||
# CONFIG_SENSORS_ADM1021 is not set
|
# CONFIG_SENSORS_ADM1021 is not set
|
||||||
# CONFIG_SENSORS_ADM1025 is not set
|
# CONFIG_SENSORS_ADM1025 is not set
|
||||||
# CONFIG_SENSORS_ADM1026 is not set
|
# CONFIG_SENSORS_ADM1026 is not set
|
||||||
# CONFIG_SENSORS_ADM1031 is not set
|
# CONFIG_SENSORS_ADM1031 is not set
|
||||||
|
# CONFIG_SENSORS_ADM9240 is not set
|
||||||
# CONFIG_SENSORS_ASB100 is not set
|
# CONFIG_SENSORS_ASB100 is not set
|
||||||
|
# CONFIG_SENSORS_ATXP1 is not set
|
||||||
# CONFIG_SENSORS_DS1621 is not set
|
# CONFIG_SENSORS_DS1621 is not set
|
||||||
# CONFIG_SENSORS_FSCHER is not set
|
# CONFIG_SENSORS_FSCHER is not set
|
||||||
# CONFIG_SENSORS_FSCPOS is not set
|
# CONFIG_SENSORS_FSCPOS is not set
|
||||||
|
@ -662,29 +706,23 @@ CONFIG_SENSORS_LM85=m
|
||||||
# CONFIG_SENSORS_LM92 is not set
|
# CONFIG_SENSORS_LM92 is not set
|
||||||
# CONFIG_SENSORS_MAX1619 is not set
|
# CONFIG_SENSORS_MAX1619 is not set
|
||||||
# CONFIG_SENSORS_PC87360 is not set
|
# CONFIG_SENSORS_PC87360 is not set
|
||||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
|
||||||
# CONFIG_SENSORS_SMSC47M1 is not set
|
# CONFIG_SENSORS_SMSC47M1 is not set
|
||||||
|
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||||
# CONFIG_SENSORS_W83781D is not set
|
# CONFIG_SENSORS_W83781D is not set
|
||||||
|
# CONFIG_SENSORS_W83792D is not set
|
||||||
# CONFIG_SENSORS_W83L785TS is not set
|
# CONFIG_SENSORS_W83L785TS is not set
|
||||||
# CONFIG_SENSORS_W83627HF is not set
|
# CONFIG_SENSORS_W83627HF is not set
|
||||||
|
# CONFIG_SENSORS_W83627EHF is not set
|
||||||
#
|
# CONFIG_HWMON_DEBUG_CHIP is not set
|
||||||
# Other I2C Chip support
|
|
||||||
#
|
|
||||||
# CONFIG_SENSORS_DS1337 is not set
|
|
||||||
CONFIG_SENSORS_EEPROM=m
|
|
||||||
# CONFIG_SENSORS_PCF8574 is not set
|
|
||||||
# CONFIG_SENSORS_PCF8591 is not set
|
|
||||||
# CONFIG_SENSORS_RTC8564 is not set
|
|
||||||
# CONFIG_I2C_DEBUG_CORE is not set
|
|
||||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
|
||||||
# CONFIG_I2C_DEBUG_BUS is not set
|
|
||||||
# CONFIG_I2C_DEBUG_CHIP is not set
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Misc devices
|
# Misc devices
|
||||||
#
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# Multimedia Capabilities Port drivers
|
||||||
|
#
|
||||||
|
|
||||||
#
|
#
|
||||||
# Multimedia devices
|
# Multimedia devices
|
||||||
#
|
#
|
||||||
|
@ -731,7 +769,7 @@ CONFIG_DUMMY_CONSOLE=y
|
||||||
# USB support
|
# USB support
|
||||||
#
|
#
|
||||||
CONFIG_USB_ARCH_HAS_HCD=y
|
CONFIG_USB_ARCH_HAS_HCD=y
|
||||||
# CONFIG_USB_ARCH_HAS_OHCI is not set
|
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||||
# CONFIG_USB is not set
|
# CONFIG_USB is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -749,6 +787,7 @@ CONFIG_USB_ARCH_HAS_HCD=y
|
||||||
#
|
#
|
||||||
CONFIG_EXT2_FS=y
|
CONFIG_EXT2_FS=y
|
||||||
# CONFIG_EXT2_FS_XATTR is not set
|
# CONFIG_EXT2_FS_XATTR is not set
|
||||||
|
# CONFIG_EXT2_FS_XIP is not set
|
||||||
CONFIG_EXT3_FS=y
|
CONFIG_EXT3_FS=y
|
||||||
CONFIG_EXT3_FS_XATTR=y
|
CONFIG_EXT3_FS_XATTR=y
|
||||||
# CONFIG_EXT3_FS_POSIX_ACL is not set
|
# CONFIG_EXT3_FS_POSIX_ACL is not set
|
||||||
|
@ -758,6 +797,7 @@ CONFIG_JBD=y
|
||||||
CONFIG_FS_MBCACHE=y
|
CONFIG_FS_MBCACHE=y
|
||||||
# CONFIG_REISERFS_FS is not set
|
# CONFIG_REISERFS_FS is not set
|
||||||
# CONFIG_JFS_FS is not set
|
# CONFIG_JFS_FS is not set
|
||||||
|
# CONFIG_FS_POSIX_ACL is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# XFS support
|
# XFS support
|
||||||
|
@ -765,6 +805,7 @@ CONFIG_FS_MBCACHE=y
|
||||||
# CONFIG_XFS_FS is not set
|
# CONFIG_XFS_FS is not set
|
||||||
# CONFIG_MINIX_FS is not set
|
# CONFIG_MINIX_FS is not set
|
||||||
CONFIG_ROMFS_FS=y
|
CONFIG_ROMFS_FS=y
|
||||||
|
CONFIG_INOTIFY=y
|
||||||
# CONFIG_QUOTA is not set
|
# CONFIG_QUOTA is not set
|
||||||
CONFIG_DNOTIFY=y
|
CONFIG_DNOTIFY=y
|
||||||
# CONFIG_AUTOFS_FS is not set
|
# CONFIG_AUTOFS_FS is not set
|
||||||
|
@ -791,11 +832,11 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
|
||||||
#
|
#
|
||||||
CONFIG_PROC_FS=y
|
CONFIG_PROC_FS=y
|
||||||
CONFIG_SYSFS=y
|
CONFIG_SYSFS=y
|
||||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
|
||||||
# CONFIG_TMPFS is not set
|
# CONFIG_TMPFS is not set
|
||||||
# CONFIG_HUGETLBFS is not set
|
# CONFIG_HUGETLBFS is not set
|
||||||
# CONFIG_HUGETLB_PAGE is not set
|
# CONFIG_HUGETLB_PAGE is not set
|
||||||
CONFIG_RAMFS=y
|
CONFIG_RAMFS=y
|
||||||
|
# CONFIG_RELAYFS_FS is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Miscellaneous filesystems
|
# Miscellaneous filesystems
|
||||||
|
@ -812,8 +853,7 @@ CONFIG_JFFS_FS_VERBOSE=0
|
||||||
# CONFIG_JFFS_PROC_FS is not set
|
# CONFIG_JFFS_PROC_FS is not set
|
||||||
CONFIG_JFFS2_FS=y
|
CONFIG_JFFS2_FS=y
|
||||||
CONFIG_JFFS2_FS_DEBUG=0
|
CONFIG_JFFS2_FS_DEBUG=0
|
||||||
# CONFIG_JFFS2_FS_NAND is not set
|
CONFIG_JFFS2_FS_WRITEBUFFER=y
|
||||||
# CONFIG_JFFS2_FS_NOR_ECC is not set
|
|
||||||
# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
|
# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
|
||||||
CONFIG_JFFS2_ZLIB=y
|
CONFIG_JFFS2_ZLIB=y
|
||||||
CONFIG_JFFS2_RTIME=y
|
CONFIG_JFFS2_RTIME=y
|
||||||
|
@ -835,6 +875,7 @@ CONFIG_NFS_FS=y
|
||||||
# CONFIG_NFSD is not set
|
# CONFIG_NFSD is not set
|
||||||
CONFIG_ROOT_NFS=y
|
CONFIG_ROOT_NFS=y
|
||||||
CONFIG_LOCKD=y
|
CONFIG_LOCKD=y
|
||||||
|
CONFIG_NFS_COMMON=y
|
||||||
CONFIG_SUNRPC=y
|
CONFIG_SUNRPC=y
|
||||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||||
|
@ -920,6 +961,7 @@ CONFIG_NLS_DEFAULT="iso8859-1"
|
||||||
CONFIG_DEBUG_KERNEL=y
|
CONFIG_DEBUG_KERNEL=y
|
||||||
# CONFIG_MAGIC_SYSRQ is not set
|
# CONFIG_MAGIC_SYSRQ is not set
|
||||||
CONFIG_LOG_BUF_SHIFT=16
|
CONFIG_LOG_BUF_SHIFT=16
|
||||||
|
CONFIG_DETECT_SOFTLOCKUP=y
|
||||||
# CONFIG_SCHEDSTATS is not set
|
# CONFIG_SCHEDSTATS is not set
|
||||||
# CONFIG_DEBUG_SLAB is not set
|
# CONFIG_DEBUG_SLAB is not set
|
||||||
# CONFIG_DEBUG_SPINLOCK is not set
|
# CONFIG_DEBUG_SPINLOCK is not set
|
||||||
|
|
|
@ -354,7 +354,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
|
||||||
|
|
||||||
static struct platform_device serial_device = {
|
static struct platform_device serial_device = {
|
||||||
.name = "serial8250",
|
.name = "serial8250",
|
||||||
.id = 0,
|
.id = PLAT8250_DEV_PLATFORM,
|
||||||
.dev = {
|
.dev = {
|
||||||
.platform_data = serial_platform_data,
|
.platform_data = serial_platform_data,
|
||||||
},
|
},
|
||||||
|
|
|
@ -219,7 +219,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
|
||||||
|
|
||||||
static struct platform_device serial_device = {
|
static struct platform_device serial_device = {
|
||||||
.name = "serial8250",
|
.name = "serial8250",
|
||||||
.id = 0,
|
.id = PLAT8250_DEV_PLATFORM,
|
||||||
.dev = {
|
.dev = {
|
||||||
.platform_data = serial_platform_data,
|
.platform_data = serial_platform_data,
|
||||||
},
|
},
|
||||||
|
|
|
@ -52,7 +52,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
|
||||||
|
|
||||||
static struct platform_device serial_device = {
|
static struct platform_device serial_device = {
|
||||||
.name = "serial8250",
|
.name = "serial8250",
|
||||||
.id = 0,
|
.id = PLAT8250_DEV_PLATFORM,
|
||||||
.dev = {
|
.dev = {
|
||||||
.platform_data = serial_platform_data,
|
.platform_data = serial_platform_data,
|
||||||
},
|
},
|
||||||
|
|
|
@ -34,7 +34,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
|
||||||
|
|
||||||
static struct platform_device serial_device = {
|
static struct platform_device serial_device = {
|
||||||
.name = "serial8250",
|
.name = "serial8250",
|
||||||
.id = 0,
|
.id = PLAT8250_DEV_PLATFORM,
|
||||||
.dev = {
|
.dev = {
|
||||||
.platform_data = serial_platform_data,
|
.platform_data = serial_platform_data,
|
||||||
},
|
},
|
||||||
|
|
|
@ -90,7 +90,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
|
||||||
|
|
||||||
static struct platform_device serial_device = {
|
static struct platform_device serial_device = {
|
||||||
.name = "serial8250",
|
.name = "serial8250",
|
||||||
.id = 0,
|
.id = PLAT8250_DEV_PLATFORM,
|
||||||
.dev = {
|
.dev = {
|
||||||
.platform_data = serial_platform_data,
|
.platform_data = serial_platform_data,
|
||||||
},
|
},
|
||||||
|
|
|
@ -174,7 +174,7 @@ static struct resource ixp2000_uart_resource = {
|
||||||
|
|
||||||
static struct platform_device ixp2000_serial_device = {
|
static struct platform_device ixp2000_serial_device = {
|
||||||
.name = "serial8250",
|
.name = "serial8250",
|
||||||
.id = 0,
|
.id = PLAT8250_DEV_PLATFORM,
|
||||||
.dev = {
|
.dev = {
|
||||||
.platform_data = ixp2000_serial_port,
|
.platform_data = ixp2000_serial_port,
|
||||||
},
|
},
|
||||||
|
|
|
@ -66,7 +66,7 @@ static struct plat_serial8250_port coyote_uart_data[] = {
|
||||||
|
|
||||||
static struct platform_device coyote_uart = {
|
static struct platform_device coyote_uart = {
|
||||||
.name = "serial8250",
|
.name = "serial8250",
|
||||||
.id = 0,
|
.id = PLAT8250_DEV_PLATFORM,
|
||||||
.dev = {
|
.dev = {
|
||||||
.platform_data = coyote_uart_data,
|
.platform_data = coyote_uart_data,
|
||||||
},
|
},
|
||||||
|
|
|
@ -93,7 +93,7 @@ static struct plat_serial8250_port gtwx5715_uart_platform_data[] = {
|
||||||
|
|
||||||
static struct platform_device gtwx5715_uart_device = {
|
static struct platform_device gtwx5715_uart_device = {
|
||||||
.name = "serial8250",
|
.name = "serial8250",
|
||||||
.id = 0,
|
.id = PLAT8250_DEV_PLATFORM,
|
||||||
.dev = {
|
.dev = {
|
||||||
.platform_data = gtwx5715_uart_platform_data,
|
.platform_data = gtwx5715_uart_platform_data,
|
||||||
},
|
},
|
||||||
|
|
|
@ -96,7 +96,7 @@ static struct plat_serial8250_port ixdp425_uart_data[] = {
|
||||||
|
|
||||||
static struct platform_device ixdp425_uart = {
|
static struct platform_device ixdp425_uart = {
|
||||||
.name = "serial8250",
|
.name = "serial8250",
|
||||||
.id = 0,
|
.id = PLAT8250_DEV_PLATFORM,
|
||||||
.dev.platform_data = ixdp425_uart_data,
|
.dev.platform_data = ixdp425_uart_data,
|
||||||
.num_resources = 2,
|
.num_resources = 2,
|
||||||
.resource = ixdp425_uart_resources
|
.resource = ixdp425_uart_resources
|
||||||
|
|
|
@ -47,6 +47,14 @@ config MACH_OMAP_OSK
|
||||||
TI OMAP 5912 OSK (OMAP Starter Kit) board support. Say Y here
|
TI OMAP 5912 OSK (OMAP Starter Kit) board support. Say Y here
|
||||||
if you have such a board.
|
if you have such a board.
|
||||||
|
|
||||||
|
config OMAP_OSK_MISTRAL
|
||||||
|
bool "Mistral QVGA board Support"
|
||||||
|
depends on MACH_OMAP_OSK
|
||||||
|
help
|
||||||
|
The OSK supports an optional add-on board with a Quarter-VGA
|
||||||
|
touchscreen, PDA-ish buttons, a resume button, bicolor LED,
|
||||||
|
and camera connector. Say Y here if you have this board.
|
||||||
|
|
||||||
config MACH_OMAP_PERSEUS2
|
config MACH_OMAP_PERSEUS2
|
||||||
bool "TI Perseus2"
|
bool "TI Perseus2"
|
||||||
depends on ARCH_OMAP1 && ARCH_OMAP730
|
depends on ARCH_OMAP1 && ARCH_OMAP730
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
# Common support
|
# Common support
|
||||||
obj-y := io.o id.o irq.o time.o serial.o
|
obj-y := io.o id.o irq.o time.o serial.o devices.o
|
||||||
led-y := leds.o
|
led-y := leds.o
|
||||||
|
|
||||||
# Specific board support
|
# Specific board support
|
||||||
|
@ -23,6 +23,7 @@ endif
|
||||||
|
|
||||||
# LEDs support
|
# LEDs support
|
||||||
led-$(CONFIG_MACH_OMAP_H2) += leds-h2p2-debug.o
|
led-$(CONFIG_MACH_OMAP_H2) += leds-h2p2-debug.o
|
||||||
|
led-$(CONFIG_MACH_OMAP_H3) += leds-h2p2-debug.o
|
||||||
led-$(CONFIG_MACH_OMAP_INNOVATOR) += leds-innovator.o
|
led-$(CONFIG_MACH_OMAP_INNOVATOR) += leds-innovator.o
|
||||||
led-$(CONFIG_MACH_OMAP_PERSEUS2) += leds-h2p2-debug.o
|
led-$(CONFIG_MACH_OMAP_PERSEUS2) += leds-h2p2-debug.o
|
||||||
led-$(CONFIG_MACH_OMAP_OSK) += leds-osk.o
|
led-$(CONFIG_MACH_OMAP_OSK) += leds-osk.o
|
||||||
|
|
|
@ -48,19 +48,43 @@ static struct omap_usb_config generic1510_usb_config __initdata = {
|
||||||
|
|
||||||
#if defined(CONFIG_ARCH_OMAP16XX)
|
#if defined(CONFIG_ARCH_OMAP16XX)
|
||||||
static struct omap_usb_config generic1610_usb_config __initdata = {
|
static struct omap_usb_config generic1610_usb_config __initdata = {
|
||||||
|
#ifdef CONFIG_USB_OTG
|
||||||
|
.otg = 1,
|
||||||
|
#endif
|
||||||
.register_host = 1,
|
.register_host = 1,
|
||||||
.register_dev = 1,
|
.register_dev = 1,
|
||||||
.hmc_mode = 16,
|
.hmc_mode = 16,
|
||||||
.pins[0] = 6,
|
.pins[0] = 6,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct omap_mmc_config generic_mmc_config __initdata = {
|
||||||
|
.mmc [0] = {
|
||||||
|
.enabled = 0,
|
||||||
|
.wire4 = 0,
|
||||||
|
.wp_pin = -1,
|
||||||
|
.power_pin = -1,
|
||||||
|
.switch_pin = -1,
|
||||||
|
},
|
||||||
|
.mmc [1] = {
|
||||||
|
.enabled = 0,
|
||||||
|
.wire4 = 0,
|
||||||
|
.wp_pin = -1,
|
||||||
|
.power_pin = -1,
|
||||||
|
.switch_pin = -1,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct omap_board_config_kernel generic_config[] = {
|
static struct omap_board_config_kernel generic_config[] = {
|
||||||
{ OMAP_TAG_USB, NULL },
|
{ OMAP_TAG_USB, NULL },
|
||||||
|
{ OMAP_TAG_MMC, &generic_mmc_config },
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init omap_generic_init(void)
|
static void __init omap_generic_init(void)
|
||||||
{
|
{
|
||||||
|
const struct omap_uart_config *uart_conf;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make sure the serial ports are muxed on at this point.
|
* Make sure the serial ports are muxed on at this point.
|
||||||
* You have to mux them off in device drivers later on
|
* You have to mux them off in device drivers later on
|
||||||
|
@ -76,6 +100,18 @@ static void __init omap_generic_init(void)
|
||||||
generic_config[0].data = &generic1610_usb_config;
|
generic_config[0].data = &generic1610_usb_config;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
uart_conf = omap_get_config(OMAP_TAG_UART, struct omap_uart_config);
|
||||||
|
if (uart_conf != NULL) {
|
||||||
|
unsigned int enabled_ports, i;
|
||||||
|
|
||||||
|
enabled_ports = uart_conf->enabled_uarts;
|
||||||
|
for (i = 0; i < 3; i++) {
|
||||||
|
if (!(enabled_ports & (1 << i)))
|
||||||
|
generic_serial_ports[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
omap_board_config = generic_config;
|
omap_board_config = generic_config;
|
||||||
omap_board_config_size = ARRAY_SIZE(generic_config);
|
omap_board_config_size = ARRAY_SIZE(generic_config);
|
||||||
omap_serial_init(generic_serial_ports);
|
omap_serial_init(generic_serial_ports);
|
||||||
|
@ -83,7 +119,7 @@ static void __init omap_generic_init(void)
|
||||||
|
|
||||||
static void __init omap_generic_map_io(void)
|
static void __init omap_generic_map_io(void)
|
||||||
{
|
{
|
||||||
omap_map_common_io()
|
omap_map_common_io();
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(OMAP_GENERIC, "Generic OMAP1510/1610/1710")
|
MACHINE_START(OMAP_GENERIC, "Generic OMAP1510/1610/1710")
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
|
|
||||||
#include <asm/arch/gpio.h>
|
#include <asm/arch/gpio.h>
|
||||||
|
#include <asm/arch/mux.h>
|
||||||
#include <asm/arch/tc.h>
|
#include <asm/arch/tc.h>
|
||||||
#include <asm/arch/usb.h>
|
#include <asm/arch/usb.h>
|
||||||
#include <asm/arch/common.h>
|
#include <asm/arch/common.h>
|
||||||
|
@ -80,8 +81,7 @@ static struct flash_platform_data h2_flash_data = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct resource h2_flash_resource = {
|
static struct resource h2_flash_resource = {
|
||||||
.start = OMAP_CS2B_PHYS,
|
/* This is on CS3, wherever it's mapped */
|
||||||
.end = OMAP_CS2B_PHYS + OMAP_CS2B_SIZE - 1,
|
|
||||||
.flags = IORESOURCE_MEM,
|
.flags = IORESOURCE_MEM,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -126,10 +126,9 @@ static void __init h2_init_smc91x(void)
|
||||||
printk("Error requesting gpio 0 for smc91x irq\n");
|
printk("Error requesting gpio 0 for smc91x irq\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
omap_set_gpio_edge_ctrl(0, OMAP_GPIO_FALLING_EDGE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void h2_init_irq(void)
|
static void __init h2_init_irq(void)
|
||||||
{
|
{
|
||||||
omap_init_irq();
|
omap_init_irq();
|
||||||
omap_gpio_init();
|
omap_gpio_init();
|
||||||
|
@ -152,9 +151,13 @@ static struct omap_usb_config h2_usb_config __initdata = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct omap_mmc_config h2_mmc_config __initdata = {
|
static struct omap_mmc_config h2_mmc_config __initdata = {
|
||||||
.mmc_blocks = 1,
|
.mmc [0] = {
|
||||||
.mmc1_power_pin = -1, /* tps65010 gpio3 */
|
.enabled = 1,
|
||||||
.mmc1_switch_pin = OMAP_MPUIO(1),
|
.wire4 = 1,
|
||||||
|
.wp_pin = OMAP_MPUIO(3),
|
||||||
|
.power_pin = -1, /* tps65010 gpio3 */
|
||||||
|
.switch_pin = OMAP_MPUIO(1),
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct omap_board_config_kernel h2_config[] = {
|
static struct omap_board_config_kernel h2_config[] = {
|
||||||
|
@ -164,6 +167,16 @@ static struct omap_board_config_kernel h2_config[] = {
|
||||||
|
|
||||||
static void __init h2_init(void)
|
static void __init h2_init(void)
|
||||||
{
|
{
|
||||||
|
/* NOTE: revC boards support NAND-boot, which can put NOR on CS2B
|
||||||
|
* and NAND (either 16bit or 8bit) on CS3.
|
||||||
|
*/
|
||||||
|
h2_flash_resource.end = h2_flash_resource.start = omap_cs3_phys();
|
||||||
|
h2_flash_resource.end += SZ_32M - 1;
|
||||||
|
|
||||||
|
/* MMC: card detect and WP */
|
||||||
|
// omap_cfg_reg(U19_ARMIO1); /* CD */
|
||||||
|
omap_cfg_reg(BALLOUT_V8_ARMIO3); /* WP */
|
||||||
|
|
||||||
platform_add_devices(h2_devices, ARRAY_SIZE(h2_devices));
|
platform_add_devices(h2_devices, ARRAY_SIZE(h2_devices));
|
||||||
omap_board_config = h2_config;
|
omap_board_config = h2_config;
|
||||||
omap_board_config_size = ARRAY_SIZE(h2_config);
|
omap_board_config_size = ARRAY_SIZE(h2_config);
|
||||||
|
|
|
@ -82,8 +82,7 @@ static struct flash_platform_data h3_flash_data = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct resource h3_flash_resource = {
|
static struct resource h3_flash_resource = {
|
||||||
.start = OMAP_CS2B_PHYS,
|
/* This is on CS3, wherever it's mapped */
|
||||||
.end = OMAP_CS2B_PHYS + OMAP_CS2B_SIZE - 1,
|
|
||||||
.flags = IORESOURCE_MEM,
|
.flags = IORESOURCE_MEM,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -161,13 +160,26 @@ static struct omap_usb_config h3_usb_config __initdata = {
|
||||||
.pins[1] = 3,
|
.pins[1] = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct omap_mmc_config h3_mmc_config __initdata = {
|
||||||
|
.mmc[0] = {
|
||||||
|
.enabled = 1,
|
||||||
|
.power_pin = -1, /* tps65010 GPIO4 */
|
||||||
|
.switch_pin = OMAP_MPUIO(1),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct omap_board_config_kernel h3_config[] = {
|
static struct omap_board_config_kernel h3_config[] = {
|
||||||
{ OMAP_TAG_USB, &h3_usb_config },
|
{ OMAP_TAG_USB, &h3_usb_config },
|
||||||
|
{ OMAP_TAG_MMC, &h3_mmc_config },
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init h3_init(void)
|
static void __init h3_init(void)
|
||||||
{
|
{
|
||||||
|
h3_flash_resource.end = h3_flash_resource.start = omap_cs3_phys();
|
||||||
|
h3_flash_resource.end += OMAP_CS3_SIZE - 1;
|
||||||
(void) platform_add_devices(devices, ARRAY_SIZE(devices));
|
(void) platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||||
|
omap_board_config = h3_config;
|
||||||
|
omap_board_config_size = ARRAY_SIZE(h3_config);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init h3_init_smc91x(void)
|
static void __init h3_init_smc91x(void)
|
||||||
|
@ -177,7 +189,6 @@ static void __init h3_init_smc91x(void)
|
||||||
printk("Error requesting gpio 40 for smc91x irq\n");
|
printk("Error requesting gpio 40 for smc91x irq\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
omap_set_gpio_edge_ctrl(40, OMAP_GPIO_FALLING_EDGE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void h3_init_irq(void)
|
void h3_init_irq(void)
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include <asm/mach/flash.h>
|
#include <asm/mach/flash.h>
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
|
|
||||||
|
#include <asm/arch/mux.h>
|
||||||
#include <asm/arch/fpga.h>
|
#include <asm/arch/fpga.h>
|
||||||
#include <asm/arch/gpio.h>
|
#include <asm/arch/gpio.h>
|
||||||
#include <asm/arch/tc.h>
|
#include <asm/arch/tc.h>
|
||||||
|
@ -173,7 +174,6 @@ static void __init innovator_init_smc91x(void)
|
||||||
printk("Error requesting gpio 0 for smc91x irq\n");
|
printk("Error requesting gpio 0 for smc91x irq\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
omap_set_gpio_edge_ctrl(0, OMAP_GPIO_RISING_EDGE);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -220,8 +220,19 @@ static struct omap_usb_config h2_usb_config __initdata = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static struct omap_mmc_config innovator_mmc_config __initdata = {
|
||||||
|
.mmc [0] = {
|
||||||
|
.enabled = 1,
|
||||||
|
.wire4 = 1,
|
||||||
|
.wp_pin = OMAP_MPUIO(3),
|
||||||
|
.power_pin = -1, /* FPGA F3 UIO42 */
|
||||||
|
.switch_pin = -1, /* FPGA F4 UIO43 */
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct omap_board_config_kernel innovator_config[] = {
|
static struct omap_board_config_kernel innovator_config[] = {
|
||||||
{ OMAP_TAG_USB, NULL },
|
{ OMAP_TAG_USB, NULL },
|
||||||
|
{ OMAP_TAG_MMC, &innovator_mmc_config },
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init innovator_init(void)
|
static void __init innovator_init(void)
|
||||||
|
|
|
@ -75,16 +75,15 @@ static void __init netstar_init(void)
|
||||||
mdelay(50); /* 50ms until PHY ready */
|
mdelay(50); /* 50ms until PHY ready */
|
||||||
/* smc91x interrupt pin */
|
/* smc91x interrupt pin */
|
||||||
omap_request_gpio(8);
|
omap_request_gpio(8);
|
||||||
omap_set_gpio_edge_ctrl(8, OMAP_GPIO_RISING_EDGE);
|
|
||||||
|
|
||||||
omap_request_gpio(12);
|
omap_request_gpio(12);
|
||||||
omap_request_gpio(13);
|
omap_request_gpio(13);
|
||||||
omap_request_gpio(14);
|
omap_request_gpio(14);
|
||||||
omap_request_gpio(15);
|
omap_request_gpio(15);
|
||||||
omap_set_gpio_edge_ctrl(12, OMAP_GPIO_FALLING_EDGE);
|
set_irq_type(OMAP_GPIO_IRQ(12), IRQT_FALLING);
|
||||||
omap_set_gpio_edge_ctrl(13, OMAP_GPIO_FALLING_EDGE);
|
set_irq_type(OMAP_GPIO_IRQ(13), IRQT_FALLING);
|
||||||
omap_set_gpio_edge_ctrl(14, OMAP_GPIO_FALLING_EDGE);
|
set_irq_type(OMAP_GPIO_IRQ(14), IRQT_FALLING);
|
||||||
omap_set_gpio_edge_ctrl(15, OMAP_GPIO_FALLING_EDGE);
|
set_irq_type(OMAP_GPIO_IRQ(15), IRQT_FALLING);
|
||||||
|
|
||||||
platform_add_devices(netstar_devices, ARRAY_SIZE(netstar_devices));
|
platform_add_devices(netstar_devices, ARRAY_SIZE(netstar_devices));
|
||||||
|
|
||||||
|
|
|
@ -29,11 +29,16 @@
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
|
#include <linux/interrupt.h>
|
||||||
|
|
||||||
|
#include <linux/mtd/mtd.h>
|
||||||
|
#include <linux/mtd/partitions.h>
|
||||||
|
|
||||||
#include <asm/hardware.h>
|
#include <asm/hardware.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
|
#include <asm/mach/flash.h>
|
||||||
|
|
||||||
#include <asm/arch/gpio.h>
|
#include <asm/arch/gpio.h>
|
||||||
#include <asm/arch/usb.h>
|
#include <asm/arch/usb.h>
|
||||||
|
@ -41,12 +46,56 @@
|
||||||
#include <asm/arch/tc.h>
|
#include <asm/arch/tc.h>
|
||||||
#include <asm/arch/common.h>
|
#include <asm/arch/common.h>
|
||||||
|
|
||||||
static struct map_desc osk5912_io_desc[] __initdata = {
|
static int __initdata osk_serial_ports[OMAP_MAX_NR_PORTS] = {1, 0, 0};
|
||||||
{ OMAP_OSK_NOR_FLASH_BASE, OMAP_OSK_NOR_FLASH_START, OMAP_OSK_NOR_FLASH_SIZE,
|
|
||||||
MT_DEVICE },
|
static struct mtd_partition osk_partitions[] = {
|
||||||
|
/* bootloader (U-Boot, etc) in first sector */
|
||||||
|
{
|
||||||
|
.name = "bootloader",
|
||||||
|
.offset = 0,
|
||||||
|
.size = SZ_128K,
|
||||||
|
.mask_flags = MTD_WRITEABLE, /* force read-only */
|
||||||
|
},
|
||||||
|
/* bootloader params in the next sector */
|
||||||
|
{
|
||||||
|
.name = "params",
|
||||||
|
.offset = MTDPART_OFS_APPEND,
|
||||||
|
.size = SZ_128K,
|
||||||
|
.mask_flags = 0,
|
||||||
|
}, {
|
||||||
|
.name = "kernel",
|
||||||
|
.offset = MTDPART_OFS_APPEND,
|
||||||
|
.size = SZ_2M,
|
||||||
|
.mask_flags = 0
|
||||||
|
}, {
|
||||||
|
.name = "filesystem",
|
||||||
|
.offset = MTDPART_OFS_APPEND,
|
||||||
|
.size = MTDPART_SIZ_FULL,
|
||||||
|
.mask_flags = 0
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __initdata osk_serial_ports[OMAP_MAX_NR_PORTS] = {1, 0, 0};
|
static struct flash_platform_data osk_flash_data = {
|
||||||
|
.map_name = "cfi_probe",
|
||||||
|
.width = 2,
|
||||||
|
.parts = osk_partitions,
|
||||||
|
.nr_parts = ARRAY_SIZE(osk_partitions),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct resource osk_flash_resource = {
|
||||||
|
/* this is on CS3, wherever it's mapped */
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device osk5912_flash_device = {
|
||||||
|
.name = "omapflash",
|
||||||
|
.id = 0,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &osk_flash_data,
|
||||||
|
},
|
||||||
|
.num_resources = 1,
|
||||||
|
.resource = &osk_flash_resource,
|
||||||
|
};
|
||||||
|
|
||||||
static struct resource osk5912_smc91x_resources[] = {
|
static struct resource osk5912_smc91x_resources[] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
|
@ -86,9 +135,16 @@ static struct platform_device osk5912_cf_device = {
|
||||||
.resource = osk5912_cf_resources,
|
.resource = osk5912_cf_resources,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct platform_device osk5912_mcbsp1_device = {
|
||||||
|
.name = "omap_mcbsp",
|
||||||
|
.id = 1,
|
||||||
|
};
|
||||||
|
|
||||||
static struct platform_device *osk5912_devices[] __initdata = {
|
static struct platform_device *osk5912_devices[] __initdata = {
|
||||||
|
&osk5912_flash_device,
|
||||||
&osk5912_smc91x_device,
|
&osk5912_smc91x_device,
|
||||||
&osk5912_cf_device,
|
&osk5912_cf_device,
|
||||||
|
&osk5912_mcbsp1_device,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init osk_init_smc91x(void)
|
static void __init osk_init_smc91x(void)
|
||||||
|
@ -97,7 +153,6 @@ static void __init osk_init_smc91x(void)
|
||||||
printk("Error requesting gpio 0 for smc91x irq\n");
|
printk("Error requesting gpio 0 for smc91x irq\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
omap_set_gpio_edge_ctrl(0, OMAP_GPIO_RISING_EDGE);
|
|
||||||
|
|
||||||
/* Check EMIFS wait states to fix errors with SMC_GET_PKT_HDR */
|
/* Check EMIFS wait states to fix errors with SMC_GET_PKT_HDR */
|
||||||
EMIFS_CCS(1) |= 0x2;
|
EMIFS_CCS(1) |= 0x2;
|
||||||
|
@ -110,11 +165,11 @@ static void __init osk_init_cf(void)
|
||||||
printk("Error requesting gpio 62 for CF irq\n");
|
printk("Error requesting gpio 62 for CF irq\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* it's really active-low */
|
/* the CF I/O IRQ is really active-low */
|
||||||
omap_set_gpio_edge_ctrl(62, OMAP_GPIO_FALLING_EDGE);
|
set_irq_type(OMAP_GPIO_IRQ(62), IRQT_FALLING);
|
||||||
}
|
}
|
||||||
|
|
||||||
void osk_init_irq(void)
|
static void __init osk_init_irq(void)
|
||||||
{
|
{
|
||||||
omap_init_irq();
|
omap_init_irq();
|
||||||
omap_gpio_init();
|
omap_gpio_init();
|
||||||
|
@ -142,18 +197,69 @@ static struct omap_board_config_kernel osk_config[] = {
|
||||||
{ OMAP_TAG_USB, &osk_usb_config },
|
{ OMAP_TAG_USB, &osk_usb_config },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_OMAP_OSK_MISTRAL
|
||||||
|
|
||||||
|
#ifdef CONFIG_PM
|
||||||
|
static irqreturn_t
|
||||||
|
osk_mistral_wake_interrupt(int irq, void *ignored, struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
return IRQ_HANDLED;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void __init osk_mistral_init(void)
|
||||||
|
{
|
||||||
|
/* FIXME here's where to feed in framebuffer, touchpad, and
|
||||||
|
* keyboard setup ... not in the drivers for those devices!
|
||||||
|
*
|
||||||
|
* NOTE: we could actually tell if there's a Mistral board
|
||||||
|
* attached, e.g. by trying to read something from the ads7846.
|
||||||
|
* But this is too early for that...
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* the sideways button (SW1) is for use as a "wakeup" button */
|
||||||
|
omap_cfg_reg(N15_1610_MPUIO2);
|
||||||
|
if (omap_request_gpio(OMAP_MPUIO(2)) == 0) {
|
||||||
|
int ret = 0;
|
||||||
|
omap_set_gpio_direction(OMAP_MPUIO(2), 1);
|
||||||
|
set_irq_type(OMAP_GPIO_IRQ(OMAP_MPUIO(2)), IRQT_RISING);
|
||||||
|
#ifdef CONFIG_PM
|
||||||
|
/* share the IRQ in case someone wants to use the
|
||||||
|
* button for more than wakeup from system sleep.
|
||||||
|
*/
|
||||||
|
ret = request_irq(OMAP_GPIO_IRQ(OMAP_MPUIO(2)),
|
||||||
|
&osk_mistral_wake_interrupt,
|
||||||
|
SA_SHIRQ, "mistral_wakeup",
|
||||||
|
&osk_mistral_wake_interrupt);
|
||||||
|
if (ret != 0) {
|
||||||
|
omap_free_gpio(OMAP_MPUIO(2));
|
||||||
|
printk(KERN_ERR "OSK+Mistral: no wakeup irq, %d?\n",
|
||||||
|
ret);
|
||||||
|
} else
|
||||||
|
enable_irq_wake(OMAP_GPIO_IRQ(OMAP_MPUIO(2)));
|
||||||
|
#endif
|
||||||
|
} else
|
||||||
|
printk(KERN_ERR "OSK+Mistral: wakeup button is awol\n");
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static void __init osk_mistral_init(void) { }
|
||||||
|
#endif
|
||||||
|
|
||||||
static void __init osk_init(void)
|
static void __init osk_init(void)
|
||||||
{
|
{
|
||||||
|
osk_flash_resource.end = osk_flash_resource.start = omap_cs3_phys();
|
||||||
|
osk_flash_resource.end += SZ_32M - 1;
|
||||||
platform_add_devices(osk5912_devices, ARRAY_SIZE(osk5912_devices));
|
platform_add_devices(osk5912_devices, ARRAY_SIZE(osk5912_devices));
|
||||||
omap_board_config = osk_config;
|
omap_board_config = osk_config;
|
||||||
omap_board_config_size = ARRAY_SIZE(osk_config);
|
omap_board_config_size = ARRAY_SIZE(osk_config);
|
||||||
USB_TRANSCEIVER_CTRL_REG |= (3 << 1);
|
USB_TRANSCEIVER_CTRL_REG |= (3 << 1);
|
||||||
|
|
||||||
|
osk_mistral_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init osk_map_io(void)
|
static void __init osk_map_io(void)
|
||||||
{
|
{
|
||||||
omap_map_common_io();
|
omap_map_common_io();
|
||||||
iotable_init(osk5912_io_desc, ARRAY_SIZE(osk5912_io_desc));
|
|
||||||
omap_serial_init(osk_serial_ports);
|
omap_serial_init(osk_serial_ports);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include <asm/mach/flash.h>
|
#include <asm/mach/flash.h>
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
|
|
||||||
|
#include <asm/arch/tc.h>
|
||||||
#include <asm/arch/gpio.h>
|
#include <asm/arch/gpio.h>
|
||||||
#include <asm/arch/mux.h>
|
#include <asm/arch/mux.h>
|
||||||
#include <asm/arch/fpga.h>
|
#include <asm/arch/fpga.h>
|
||||||
|
@ -83,8 +84,8 @@ static struct flash_platform_data p2_flash_data = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct resource p2_flash_resource = {
|
static struct resource p2_flash_resource = {
|
||||||
.start = OMAP_FLASH_0_START,
|
.start = OMAP_CS0_PHYS,
|
||||||
.end = OMAP_FLASH_0_START + OMAP_FLASH_0_SIZE - 1,
|
.end = OMAP_CS0_PHYS + SZ_32M - 1,
|
||||||
.flags = IORESOURCE_MEM,
|
.flags = IORESOURCE_MEM,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -25,13 +25,14 @@
|
||||||
#include <asm/hardware.h>
|
#include <asm/hardware.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
|
#include <asm/mach/flash.h>
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
|
|
||||||
#include <asm/arch/gpio.h>
|
|
||||||
#include <asm/arch/tc.h>
|
|
||||||
#include <asm/arch/mux.h>
|
|
||||||
#include <asm/arch/usb.h>
|
|
||||||
#include <asm/arch/common.h>
|
#include <asm/arch/common.h>
|
||||||
|
#include <asm/arch/gpio.h>
|
||||||
|
#include <asm/arch/mux.h>
|
||||||
|
#include <asm/arch/tc.h>
|
||||||
|
#include <asm/arch/usb.h>
|
||||||
|
|
||||||
extern void omap_init_time(void);
|
extern void omap_init_time(void);
|
||||||
extern int omap_gpio_init(void);
|
extern int omap_gpio_init(void);
|
||||||
|
@ -74,7 +75,7 @@ static struct plat_serial8250_port voiceblue_ports[] = {
|
||||||
|
|
||||||
static struct platform_device serial_device = {
|
static struct platform_device serial_device = {
|
||||||
.name = "serial8250",
|
.name = "serial8250",
|
||||||
.id = 1,
|
.id = PLAT8250_DEV_PLATFORM1,
|
||||||
.dev = {
|
.dev = {
|
||||||
.platform_data = voiceblue_ports,
|
.platform_data = voiceblue_ports,
|
||||||
},
|
},
|
||||||
|
@ -86,6 +87,27 @@ static int __init ext_uart_init(void)
|
||||||
}
|
}
|
||||||
arch_initcall(ext_uart_init);
|
arch_initcall(ext_uart_init);
|
||||||
|
|
||||||
|
static struct flash_platform_data voiceblue_flash_data = {
|
||||||
|
.map_name = "cfi_probe",
|
||||||
|
.width = 2,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct resource voiceblue_flash_resource = {
|
||||||
|
.start = OMAP_CS0_PHYS,
|
||||||
|
.end = OMAP_CS0_PHYS + SZ_32M - 1,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device voiceblue_flash_device = {
|
||||||
|
.name = "omapflash",
|
||||||
|
.id = 0,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &voiceblue_flash_data,
|
||||||
|
},
|
||||||
|
.num_resources = 1,
|
||||||
|
.resource = &voiceblue_flash_resource,
|
||||||
|
};
|
||||||
|
|
||||||
static struct resource voiceblue_smc91x_resources[] = {
|
static struct resource voiceblue_smc91x_resources[] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
.start = OMAP_CS2_PHYS + 0x300,
|
.start = OMAP_CS2_PHYS + 0x300,
|
||||||
|
@ -107,6 +129,7 @@ static struct platform_device voiceblue_smc91x_device = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device *voiceblue_devices[] __initdata = {
|
static struct platform_device *voiceblue_devices[] __initdata = {
|
||||||
|
&voiceblue_flash_device,
|
||||||
&voiceblue_smc91x_device,
|
&voiceblue_smc91x_device,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -119,8 +142,17 @@ static struct omap_usb_config voiceblue_usb_config __initdata = {
|
||||||
.pins[2] = 6,
|
.pins[2] = 6,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct omap_mmc_config voiceblue_mmc_config __initdata = {
|
||||||
|
.mmc[0] = {
|
||||||
|
.enabled = 1,
|
||||||
|
.power_pin = 2,
|
||||||
|
.switch_pin = -1,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct omap_board_config_kernel voiceblue_config[] = {
|
static struct omap_board_config_kernel voiceblue_config[] = {
|
||||||
{ OMAP_TAG_USB, &voiceblue_usb_config },
|
{ OMAP_TAG_USB, &voiceblue_usb_config },
|
||||||
|
{ OMAP_TAG_MMC, &voiceblue_mmc_config },
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init voiceblue_init_irq(void)
|
static void __init voiceblue_init_irq(void)
|
||||||
|
@ -131,9 +163,6 @@ static void __init voiceblue_init_irq(void)
|
||||||
|
|
||||||
static void __init voiceblue_init(void)
|
static void __init voiceblue_init(void)
|
||||||
{
|
{
|
||||||
/* There is a good chance board is going up, so enable Power LED
|
|
||||||
* (it is connected through invertor) */
|
|
||||||
omap_writeb(0x00, OMAP_LPG1_LCR);
|
|
||||||
/* Watchdog */
|
/* Watchdog */
|
||||||
omap_request_gpio(0);
|
omap_request_gpio(0);
|
||||||
/* smc91x reset */
|
/* smc91x reset */
|
||||||
|
@ -145,7 +174,6 @@ static void __init voiceblue_init(void)
|
||||||
mdelay(50); /* 50ms until PHY ready */
|
mdelay(50); /* 50ms until PHY ready */
|
||||||
/* smc91x interrupt pin */
|
/* smc91x interrupt pin */
|
||||||
omap_request_gpio(8);
|
omap_request_gpio(8);
|
||||||
omap_set_gpio_edge_ctrl(8, OMAP_GPIO_RISING_EDGE);
|
|
||||||
/* 16C554 reset*/
|
/* 16C554 reset*/
|
||||||
omap_request_gpio(6);
|
omap_request_gpio(6);
|
||||||
omap_set_gpio_direction(6, 0);
|
omap_set_gpio_direction(6, 0);
|
||||||
|
@ -155,14 +183,19 @@ static void __init voiceblue_init(void)
|
||||||
omap_request_gpio(13);
|
omap_request_gpio(13);
|
||||||
omap_request_gpio(14);
|
omap_request_gpio(14);
|
||||||
omap_request_gpio(15);
|
omap_request_gpio(15);
|
||||||
omap_set_gpio_edge_ctrl(12, OMAP_GPIO_RISING_EDGE);
|
set_irq_type(OMAP_GPIO_IRQ(12), IRQT_RISING);
|
||||||
omap_set_gpio_edge_ctrl(13, OMAP_GPIO_RISING_EDGE);
|
set_irq_type(OMAP_GPIO_IRQ(13), IRQT_RISING);
|
||||||
omap_set_gpio_edge_ctrl(14, OMAP_GPIO_RISING_EDGE);
|
set_irq_type(OMAP_GPIO_IRQ(14), IRQT_RISING);
|
||||||
omap_set_gpio_edge_ctrl(15, OMAP_GPIO_RISING_EDGE);
|
set_irq_type(OMAP_GPIO_IRQ(15), IRQT_RISING);
|
||||||
|
|
||||||
platform_add_devices(voiceblue_devices, ARRAY_SIZE(voiceblue_devices));
|
platform_add_devices(voiceblue_devices, ARRAY_SIZE(voiceblue_devices));
|
||||||
omap_board_config = voiceblue_config;
|
omap_board_config = voiceblue_config;
|
||||||
omap_board_config_size = ARRAY_SIZE(voiceblue_config);
|
omap_board_config_size = ARRAY_SIZE(voiceblue_config);
|
||||||
|
|
||||||
|
/* There is a good chance board is going up, so enable power LED
|
||||||
|
* (it is connected through invertor) */
|
||||||
|
omap_writeb(0x00, OMAP_LPG1_LCR);
|
||||||
|
omap_writeb(0x00, OMAP_LPG1_PMR); /* Disable clock */
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __initdata omap_serial_ports[OMAP_MAX_NR_PORTS] = {1, 1, 1};
|
static int __initdata omap_serial_ports[OMAP_MAX_NR_PORTS] = {1, 1, 1};
|
||||||
|
@ -184,9 +217,9 @@ static int panic_event(struct notifier_block *this, unsigned long event,
|
||||||
if (test_and_set_bit(MACHINE_PANICED, &machine_state))
|
if (test_and_set_bit(MACHINE_PANICED, &machine_state))
|
||||||
return NOTIFY_DONE;
|
return NOTIFY_DONE;
|
||||||
|
|
||||||
/* Flash Power LED
|
/* Flash power LED */
|
||||||
* (TODO: Enable clock right way (enabled in bootloader already)) */
|
|
||||||
omap_writeb(0x78, OMAP_LPG1_LCR);
|
omap_writeb(0x78, OMAP_LPG1_LCR);
|
||||||
|
omap_writeb(0x01, OMAP_LPG1_PMR); /* Enable clock */
|
||||||
|
|
||||||
return NOTIFY_DONE;
|
return NOTIFY_DONE;
|
||||||
}
|
}
|
||||||
|
@ -195,15 +228,14 @@ static struct notifier_block panic_block = {
|
||||||
.notifier_call = panic_event,
|
.notifier_call = panic_event,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init setup_notifier(void)
|
static int __init voiceblue_setup(void)
|
||||||
{
|
{
|
||||||
/* Setup panic notifier */
|
/* Setup panic notifier */
|
||||||
notifier_chain_register(&panic_notifier_list, &panic_block);
|
notifier_chain_register(&panic_notifier_list, &panic_block);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
postcore_initcall(voiceblue_setup);
|
||||||
postcore_initcall(setup_notifier);
|
|
||||||
|
|
||||||
static int wdt_gpio_state;
|
static int wdt_gpio_state;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,351 @@
|
||||||
|
/*
|
||||||
|
* linux/arch/arm/mach-omap1/devices.c
|
||||||
|
*
|
||||||
|
* OMAP1 platform device setup/initialization
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/config.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/device.h>
|
||||||
|
|
||||||
|
#include <asm/hardware.h>
|
||||||
|
#include <asm/io.h>
|
||||||
|
#include <asm/mach-types.h>
|
||||||
|
#include <asm/mach/map.h>
|
||||||
|
|
||||||
|
#include <asm/arch/tc.h>
|
||||||
|
#include <asm/arch/board.h>
|
||||||
|
#include <asm/arch/mux.h>
|
||||||
|
#include <asm/arch/gpio.h>
|
||||||
|
|
||||||
|
|
||||||
|
static void omap_nop_release(struct device *dev)
|
||||||
|
{
|
||||||
|
/* Nothing */
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if defined(CONFIG_I2C_OMAP) || defined(CONFIG_I2C_OMAP_MODULE)
|
||||||
|
|
||||||
|
#define OMAP_I2C_BASE 0xfffb3800
|
||||||
|
|
||||||
|
static struct resource i2c_resources[] = {
|
||||||
|
{
|
||||||
|
.start = OMAP_I2C_BASE,
|
||||||
|
.end = OMAP_I2C_BASE + 0x3f,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = INT_I2C,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
/* DMA not used; works around erratum writing to non-empty i2c fifo */
|
||||||
|
|
||||||
|
static struct platform_device omap_i2c_device = {
|
||||||
|
.name = "i2c_omap",
|
||||||
|
.id = -1,
|
||||||
|
.dev = {
|
||||||
|
.release = omap_nop_release,
|
||||||
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(i2c_resources),
|
||||||
|
.resource = i2c_resources,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void omap_init_i2c(void)
|
||||||
|
{
|
||||||
|
/* FIXME define and use a boot tag, in case of boards that
|
||||||
|
* either don't wire up I2C, or chips that mux it differently...
|
||||||
|
* it can include clocking and address info, maybe more.
|
||||||
|
*/
|
||||||
|
omap_cfg_reg(I2C_SCL);
|
||||||
|
omap_cfg_reg(I2C_SDA);
|
||||||
|
|
||||||
|
(void) platform_device_register(&omap_i2c_device);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline void omap_init_i2c(void) {}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if defined(CONFIG_OMAP1610_IR) || defined(CONFIG_OMAP161O_IR_MODULE)
|
||||||
|
|
||||||
|
static u64 irda_dmamask = 0xffffffff;
|
||||||
|
|
||||||
|
static struct platform_device omap1610ir_device = {
|
||||||
|
.name = "omap1610-ir",
|
||||||
|
.id = -1,
|
||||||
|
.dev = {
|
||||||
|
.release = omap_nop_release,
|
||||||
|
.dma_mask = &irda_dmamask,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static void omap_init_irda(void)
|
||||||
|
{
|
||||||
|
/* FIXME define and use a boot tag, members something like:
|
||||||
|
* u8 uart; // uart1, or uart3
|
||||||
|
* ... but driver only handles uart3 for now
|
||||||
|
* s16 fir_sel; // gpio for SIR vs FIR
|
||||||
|
* ... may prefer a callback for SIR/MIR/FIR mode select;
|
||||||
|
* while h2 uses a GPIO, H3 uses a gpio expander
|
||||||
|
*/
|
||||||
|
if (machine_is_omap_h2()
|
||||||
|
|| machine_is_omap_h3())
|
||||||
|
(void) platform_device_register(&omap1610ir_device);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline void omap_init_irda(void) {}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE)
|
||||||
|
|
||||||
|
#define OMAP_MMC1_BASE 0xfffb7800
|
||||||
|
#define OMAP_MMC2_BASE 0xfffb7c00 /* omap16xx only */
|
||||||
|
|
||||||
|
static struct omap_mmc_conf mmc1_conf;
|
||||||
|
|
||||||
|
static u64 mmc1_dmamask = 0xffffffff;
|
||||||
|
|
||||||
|
static struct resource mmc1_resources[] = {
|
||||||
|
{
|
||||||
|
.start = IO_ADDRESS(OMAP_MMC1_BASE),
|
||||||
|
.end = IO_ADDRESS(OMAP_MMC1_BASE) + 0x7f,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = INT_MMC,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device mmc_omap_device1 = {
|
||||||
|
.name = "mmci-omap",
|
||||||
|
.id = 1,
|
||||||
|
.dev = {
|
||||||
|
.release = omap_nop_release,
|
||||||
|
.dma_mask = &mmc1_dmamask,
|
||||||
|
.platform_data = &mmc1_conf,
|
||||||
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(mmc1_resources),
|
||||||
|
.resource = mmc1_resources,
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_OMAP16XX
|
||||||
|
|
||||||
|
static struct omap_mmc_conf mmc2_conf;
|
||||||
|
|
||||||
|
static u64 mmc2_dmamask = 0xffffffff;
|
||||||
|
|
||||||
|
static struct resource mmc2_resources[] = {
|
||||||
|
{
|
||||||
|
.start = IO_ADDRESS(OMAP_MMC2_BASE),
|
||||||
|
.end = IO_ADDRESS(OMAP_MMC2_BASE) + 0x7f,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = INT_1610_MMC2,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device mmc_omap_device2 = {
|
||||||
|
.name = "mmci-omap",
|
||||||
|
.id = 2,
|
||||||
|
.dev = {
|
||||||
|
.release = omap_nop_release,
|
||||||
|
.dma_mask = &mmc2_dmamask,
|
||||||
|
.platform_data = &mmc2_conf,
|
||||||
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(mmc2_resources),
|
||||||
|
.resource = mmc2_resources,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void __init omap_init_mmc(void)
|
||||||
|
{
|
||||||
|
const struct omap_mmc_config *mmc_conf;
|
||||||
|
const struct omap_mmc_conf *mmc;
|
||||||
|
|
||||||
|
/* NOTE: assumes MMC was never (wrongly) enabled */
|
||||||
|
mmc_conf = omap_get_config(OMAP_TAG_MMC, struct omap_mmc_config);
|
||||||
|
if (!mmc_conf)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* block 1 is always available and has just one pinout option */
|
||||||
|
mmc = &mmc_conf->mmc[0];
|
||||||
|
if (mmc->enabled) {
|
||||||
|
omap_cfg_reg(MMC_CMD);
|
||||||
|
omap_cfg_reg(MMC_CLK);
|
||||||
|
omap_cfg_reg(MMC_DAT0);
|
||||||
|
if (cpu_is_omap1710()) {
|
||||||
|
omap_cfg_reg(M15_1710_MMC_CLKI);
|
||||||
|
omap_cfg_reg(P19_1710_MMC_CMDDIR);
|
||||||
|
omap_cfg_reg(P20_1710_MMC_DATDIR0);
|
||||||
|
}
|
||||||
|
if (mmc->wire4) {
|
||||||
|
omap_cfg_reg(MMC_DAT1);
|
||||||
|
/* NOTE: DAT2 can be on W10 (here) or M15 */
|
||||||
|
if (!mmc->nomux)
|
||||||
|
omap_cfg_reg(MMC_DAT2);
|
||||||
|
omap_cfg_reg(MMC_DAT3);
|
||||||
|
}
|
||||||
|
mmc1_conf = *mmc;
|
||||||
|
(void) platform_device_register(&mmc_omap_device1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_OMAP16XX
|
||||||
|
/* block 2 is on newer chips, and has many pinout options */
|
||||||
|
mmc = &mmc_conf->mmc[1];
|
||||||
|
if (mmc->enabled) {
|
||||||
|
if (!mmc->nomux) {
|
||||||
|
omap_cfg_reg(Y8_1610_MMC2_CMD);
|
||||||
|
omap_cfg_reg(Y10_1610_MMC2_CLK);
|
||||||
|
omap_cfg_reg(R18_1610_MMC2_CLKIN);
|
||||||
|
omap_cfg_reg(W8_1610_MMC2_DAT0);
|
||||||
|
if (mmc->wire4) {
|
||||||
|
omap_cfg_reg(V8_1610_MMC2_DAT1);
|
||||||
|
omap_cfg_reg(W15_1610_MMC2_DAT2);
|
||||||
|
omap_cfg_reg(R10_1610_MMC2_DAT3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* These are needed for the level shifter */
|
||||||
|
omap_cfg_reg(V9_1610_MMC2_CMDDIR);
|
||||||
|
omap_cfg_reg(V5_1610_MMC2_DATDIR0);
|
||||||
|
omap_cfg_reg(W19_1610_MMC2_DATDIR1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Feedback clock must be set on OMAP-1710 MMC2 */
|
||||||
|
if (cpu_is_omap1710())
|
||||||
|
omap_writel(omap_readl(MOD_CONF_CTRL_1) | (1 << 24),
|
||||||
|
MOD_CONF_CTRL_1);
|
||||||
|
mmc2_conf = *mmc;
|
||||||
|
(void) platform_device_register(&mmc_omap_device2);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline void omap_init_mmc(void) {}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_OMAP_RTC) || defined(CONFIG_OMAP_RTC)
|
||||||
|
|
||||||
|
#define OMAP_RTC_BASE 0xfffb4800
|
||||||
|
|
||||||
|
static struct resource rtc_resources[] = {
|
||||||
|
{
|
||||||
|
.start = OMAP_RTC_BASE,
|
||||||
|
.end = OMAP_RTC_BASE + 0x5f,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = INT_RTC_TIMER,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = INT_RTC_ALARM,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device omap_rtc_device = {
|
||||||
|
.name = "omap_rtc",
|
||||||
|
.id = -1,
|
||||||
|
.dev = {
|
||||||
|
.release = omap_nop_release,
|
||||||
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(rtc_resources),
|
||||||
|
.resource = rtc_resources,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void omap_init_rtc(void)
|
||||||
|
{
|
||||||
|
(void) platform_device_register(&omap_rtc_device);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline void omap_init_rtc(void) {}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if defined(CONFIG_OMAP16XX_WATCHDOG) || defined(CONFIG_OMAP16XX_WATCHDOG_MODULE)
|
||||||
|
|
||||||
|
#define OMAP_WDT_BASE 0xfffeb000
|
||||||
|
|
||||||
|
static struct resource wdt_resources[] = {
|
||||||
|
{
|
||||||
|
.start = OMAP_WDT_BASE,
|
||||||
|
.end = OMAP_WDT_BASE + 0x4f,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device omap_wdt_device = {
|
||||||
|
.name = "omap1610_wdt",
|
||||||
|
.id = -1,
|
||||||
|
.dev = {
|
||||||
|
.release = omap_nop_release,
|
||||||
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(wdt_resources),
|
||||||
|
.resource = wdt_resources,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void omap_init_wdt(void)
|
||||||
|
{
|
||||||
|
(void) platform_device_register(&omap_wdt_device);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline void omap_init_wdt(void) {}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This gets called after board-specific INIT_MACHINE, and initializes most
|
||||||
|
* on-chip peripherals accessible on this board (except for few like USB):
|
||||||
|
*
|
||||||
|
* (a) Does any "standard config" pin muxing needed. Board-specific
|
||||||
|
* code will have muxed GPIO pins and done "nonstandard" setup;
|
||||||
|
* that code could live in the boot loader.
|
||||||
|
* (b) Populating board-specific platform_data with the data drivers
|
||||||
|
* rely on to handle wiring variations.
|
||||||
|
* (c) Creating platform devices as meaningful on this board and
|
||||||
|
* with this kernel configuration.
|
||||||
|
*
|
||||||
|
* Claiming GPIOs, and setting their direction and initial values, is the
|
||||||
|
* responsibility of the device drivers. So is responding to probe().
|
||||||
|
*
|
||||||
|
* Board-specific knowlege like creating devices or pin setup is to be
|
||||||
|
* kept out of drivers as much as possible. In particular, pin setup
|
||||||
|
* may be handled by the boot loader, and drivers should expect it will
|
||||||
|
* normally have been done by the time they're probed.
|
||||||
|
*/
|
||||||
|
static int __init omap_init_devices(void)
|
||||||
|
{
|
||||||
|
/* please keep these calls, and their implementations above,
|
||||||
|
* in alphabetical order so they're easier to sort through.
|
||||||
|
*/
|
||||||
|
omap_init_i2c();
|
||||||
|
omap_init_irda();
|
||||||
|
omap_init_mmc();
|
||||||
|
omap_init_rtc();
|
||||||
|
omap_init_wdt();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
arch_initcall(omap_init_devices);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* linux/arch/arm/mach-omap/fpga.c
|
* linux/arch/arm/mach-omap1/fpga.c
|
||||||
*
|
*
|
||||||
* Interrupt handler for OMAP-1510 Innovator FPGA
|
* Interrupt handler for OMAP-1510 Innovator FPGA
|
||||||
*
|
*
|
||||||
|
@ -181,7 +181,7 @@ void omap1510_fpga_init_irq(void)
|
||||||
*/
|
*/
|
||||||
omap_request_gpio(13);
|
omap_request_gpio(13);
|
||||||
omap_set_gpio_direction(13, 1);
|
omap_set_gpio_direction(13, 1);
|
||||||
omap_set_gpio_edge_ctrl(13, OMAP_GPIO_RISING_EDGE);
|
set_irq_type(OMAP_GPIO_IRQ(13), IRQT_RISING);
|
||||||
set_irq_chained_handler(OMAP1510_INT_FPGA, innovator_fpga_IRQ_demux);
|
set_irq_chained_handler(OMAP1510_INT_FPGA, innovator_fpga_IRQ_demux);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
extern int clk_init(void);
|
extern int clk_init(void);
|
||||||
extern void omap_check_revision(void);
|
extern void omap_check_revision(void);
|
||||||
|
extern void omap_sram_init(void);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The machine specific code may provide the extra mapping besides the
|
* The machine specific code may provide the extra mapping besides the
|
||||||
|
@ -32,7 +33,6 @@ static struct map_desc omap_io_desc[] __initdata = {
|
||||||
static struct map_desc omap730_io_desc[] __initdata = {
|
static struct map_desc omap730_io_desc[] __initdata = {
|
||||||
{ OMAP730_DSP_BASE, OMAP730_DSP_START, OMAP730_DSP_SIZE, MT_DEVICE },
|
{ OMAP730_DSP_BASE, OMAP730_DSP_START, OMAP730_DSP_SIZE, MT_DEVICE },
|
||||||
{ OMAP730_DSPREG_BASE, OMAP730_DSPREG_START, OMAP730_DSPREG_SIZE, MT_DEVICE },
|
{ OMAP730_DSPREG_BASE, OMAP730_DSPREG_START, OMAP730_DSPREG_SIZE, MT_DEVICE },
|
||||||
{ OMAP730_SRAM_BASE, OMAP730_SRAM_START, OMAP730_SRAM_SIZE, MT_DEVICE }
|
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -40,27 +40,13 @@ static struct map_desc omap730_io_desc[] __initdata = {
|
||||||
static struct map_desc omap1510_io_desc[] __initdata = {
|
static struct map_desc omap1510_io_desc[] __initdata = {
|
||||||
{ OMAP1510_DSP_BASE, OMAP1510_DSP_START, OMAP1510_DSP_SIZE, MT_DEVICE },
|
{ OMAP1510_DSP_BASE, OMAP1510_DSP_START, OMAP1510_DSP_SIZE, MT_DEVICE },
|
||||||
{ OMAP1510_DSPREG_BASE, OMAP1510_DSPREG_START, OMAP1510_DSPREG_SIZE, MT_DEVICE },
|
{ OMAP1510_DSPREG_BASE, OMAP1510_DSPREG_START, OMAP1510_DSPREG_SIZE, MT_DEVICE },
|
||||||
{ OMAP1510_SRAM_BASE, OMAP1510_SRAM_START, OMAP1510_SRAM_SIZE, MT_DEVICE }
|
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_ARCH_OMAP16XX)
|
#if defined(CONFIG_ARCH_OMAP16XX)
|
||||||
static struct map_desc omap1610_io_desc[] __initdata = {
|
static struct map_desc omap16xx_io_desc[] __initdata = {
|
||||||
{ OMAP16XX_DSP_BASE, OMAP16XX_DSP_START, OMAP16XX_DSP_SIZE, MT_DEVICE },
|
{ OMAP16XX_DSP_BASE, OMAP16XX_DSP_START, OMAP16XX_DSP_SIZE, MT_DEVICE },
|
||||||
{ OMAP16XX_DSPREG_BASE, OMAP16XX_DSPREG_START, OMAP16XX_DSPREG_SIZE, MT_DEVICE },
|
{ OMAP16XX_DSPREG_BASE, OMAP16XX_DSPREG_START, OMAP16XX_DSPREG_SIZE, MT_DEVICE },
|
||||||
{ OMAP16XX_SRAM_BASE, OMAP16XX_SRAM_START, OMAP1610_SRAM_SIZE, MT_DEVICE }
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct map_desc omap5912_io_desc[] __initdata = {
|
|
||||||
{ OMAP16XX_DSP_BASE, OMAP16XX_DSP_START, OMAP16XX_DSP_SIZE, MT_DEVICE },
|
|
||||||
{ OMAP16XX_DSPREG_BASE, OMAP16XX_DSPREG_START, OMAP16XX_DSPREG_SIZE, MT_DEVICE },
|
|
||||||
/*
|
|
||||||
* The OMAP5912 has 250kByte internal SRAM. Because the mapping is baseed on page
|
|
||||||
* size (4kByte), it seems that the last 2kByte (=0x800) of the 250kByte are not mapped.
|
|
||||||
* Add additional 2kByte (0x800) so that the last page is mapped and the last 2kByte
|
|
||||||
* can be used.
|
|
||||||
*/
|
|
||||||
{ OMAP16XX_SRAM_BASE, OMAP16XX_SRAM_START, OMAP5912_SRAM_SIZE + 0x800, MT_DEVICE }
|
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -86,14 +72,13 @@ static void __init _omap_map_io(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_ARCH_OMAP16XX)
|
#if defined(CONFIG_ARCH_OMAP16XX)
|
||||||
if (cpu_is_omap1610() || cpu_is_omap1710()) {
|
if (cpu_is_omap16xx()) {
|
||||||
iotable_init(omap1610_io_desc, ARRAY_SIZE(omap1610_io_desc));
|
iotable_init(omap16xx_io_desc, ARRAY_SIZE(omap16xx_io_desc));
|
||||||
}
|
|
||||||
if (cpu_is_omap5912()) {
|
|
||||||
iotable_init(omap5912_io_desc, ARRAY_SIZE(omap5912_io_desc));
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
omap_sram_init();
|
||||||
|
|
||||||
/* REVISIT: Refer to OMAP5910 Errata, Advisory SYS_1: "Timeout Abort
|
/* REVISIT: Refer to OMAP5910 Errata, Advisory SYS_1: "Timeout Abort
|
||||||
* on a Posted Write in the TIPB Bridge".
|
* on a Posted Write in the TIPB Bridge".
|
||||||
*/
|
*/
|
||||||
|
@ -108,8 +93,9 @@ static void __init _omap_map_io(void)
|
||||||
/*
|
/*
|
||||||
* This should only get called from board specific init
|
* This should only get called from board specific init
|
||||||
*/
|
*/
|
||||||
void omap_map_common_io(void)
|
void __init omap_map_common_io(void)
|
||||||
{
|
{
|
||||||
if (!initialized)
|
if (!initialized)
|
||||||
_omap_map_io();
|
_omap_map_io();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* linux/arch/arm/mach-omap/irq.c
|
* linux/arch/arm/mach-omap1/irq.c
|
||||||
*
|
*
|
||||||
* Interrupt handler for all OMAP boards
|
* Interrupt handler for all OMAP boards
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* linux/arch/arm/mach-omap/leds-h2p2-debug.c
|
* linux/arch/arm/mach-omap1/leds-h2p2-debug.c
|
||||||
*
|
*
|
||||||
* Copyright 2003 by Texas Instruments Incorporated
|
* Copyright 2003 by Texas Instruments Incorporated
|
||||||
*
|
*
|
||||||
|
@ -13,6 +13,7 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/kernel_stat.h>
|
#include <linux/kernel_stat.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
|
#include <linux/version.h>
|
||||||
|
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/hardware.h>
|
#include <asm/hardware.h>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* linux/arch/arm/mach-omap/leds-innovator.c
|
* linux/arch/arm/mach-omap1/leds-innovator.c
|
||||||
*/
|
*/
|
||||||
#include <linux/config.h>
|
#include <linux/config.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* linux/arch/arm/mach-omap/leds-osk.c
|
* linux/arch/arm/mach-omap1/leds-osk.c
|
||||||
*
|
*
|
||||||
* LED driver for OSK, and optionally Mistral QVGA, boards
|
* LED driver for OSK, and optionally Mistral QVGA, boards
|
||||||
*/
|
*/
|
||||||
|
@ -64,7 +64,7 @@ static void tps_work(void *unused)
|
||||||
|
|
||||||
static DECLARE_WORK(work, tps_work, NULL);
|
static DECLARE_WORK(work, tps_work, NULL);
|
||||||
|
|
||||||
#ifdef CONFIG_FB_OMAP
|
#ifdef CONFIG_OMAP_OSK_MISTRAL
|
||||||
|
|
||||||
/* For now, all system indicators require the Mistral board, since that
|
/* For now, all system indicators require the Mistral board, since that
|
||||||
* LED can be manipulated without a task context. This LED is either red,
|
* LED can be manipulated without a task context. This LED is either red,
|
||||||
|
@ -127,7 +127,7 @@ void osk_leds_event(led_event_t evt)
|
||||||
hw_led_state = 0;
|
hw_led_state = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef CONFIG_FB_OMAP
|
#ifdef CONFIG_OMAP_OSK_MISTRAL
|
||||||
|
|
||||||
case led_timer:
|
case led_timer:
|
||||||
hw_led_state ^= TIMER_LED;
|
hw_led_state ^= TIMER_LED;
|
||||||
|
@ -144,7 +144,7 @@ void osk_leds_event(led_event_t evt)
|
||||||
mistral_setled();
|
mistral_setled();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#endif /* CONFIG_FB_OMAP */
|
#endif /* CONFIG_OMAP_OSK_MISTRAL */
|
||||||
|
|
||||||
/* "green" == tps LED1 (leftmost, normally power-good)
|
/* "green" == tps LED1 (leftmost, normally power-good)
|
||||||
* works only with DC adapter, not on battery power!
|
* works only with DC adapter, not on battery power!
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* linux/arch/arm/mach-omap/leds.c
|
* linux/arch/arm/mach-omap1/leds.c
|
||||||
*
|
*
|
||||||
* OMAP LEDs dispatcher
|
* OMAP LEDs dispatcher
|
||||||
*/
|
*/
|
||||||
|
@ -20,7 +20,9 @@ omap_leds_init(void)
|
||||||
if (machine_is_omap_innovator())
|
if (machine_is_omap_innovator())
|
||||||
leds_event = innovator_leds_event;
|
leds_event = innovator_leds_event;
|
||||||
|
|
||||||
else if (machine_is_omap_h2() || machine_is_omap_perseus2())
|
else if (machine_is_omap_h2()
|
||||||
|
|| machine_is_omap_h3()
|
||||||
|
|| machine_is_omap_perseus2())
|
||||||
leds_event = h2p2_dbg_leds_event;
|
leds_event = h2p2_dbg_leds_event;
|
||||||
|
|
||||||
else if (machine_is_omap_osk())
|
else if (machine_is_omap_osk())
|
||||||
|
@ -30,8 +32,12 @@ omap_leds_init(void)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (machine_is_omap_h2()
|
if (machine_is_omap_h2()
|
||||||
|
|| machine_is_omap_h3()
|
||||||
|| machine_is_omap_perseus2()
|
|| machine_is_omap_perseus2()
|
||||||
|| machine_is_omap_osk()) {
|
#ifdef CONFIG_OMAP_OSK_MISTRAL
|
||||||
|
|| machine_is_omap_osk()
|
||||||
|
#endif
|
||||||
|
) {
|
||||||
|
|
||||||
/* LED1/LED2 pins can be used as GPIO (as done here), or by
|
/* LED1/LED2 pins can be used as GPIO (as done here), or by
|
||||||
* the LPG (works even in deep sleep!), to drive a bicolor
|
* the LPG (works even in deep sleep!), to drive a bicolor
|
||||||
|
|
|
@ -24,7 +24,11 @@
|
||||||
|
|
||||||
#include <asm/arch/board.h>
|
#include <asm/arch/board.h>
|
||||||
#include <asm/arch/mux.h>
|
#include <asm/arch/mux.h>
|
||||||
|
#include <asm/arch/gpio.h>
|
||||||
#include <asm/arch/fpga.h>
|
#include <asm/arch/fpga.h>
|
||||||
|
#ifdef CONFIG_PM
|
||||||
|
#include <asm/arch/pm.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
static struct clk * uart1_ck = NULL;
|
static struct clk * uart1_ck = NULL;
|
||||||
static struct clk * uart2_ck = NULL;
|
static struct clk * uart2_ck = NULL;
|
||||||
|
@ -94,7 +98,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
|
||||||
|
|
||||||
static struct platform_device serial_device = {
|
static struct platform_device serial_device = {
|
||||||
.name = "serial8250",
|
.name = "serial8250",
|
||||||
.id = 0,
|
.id = PLAT8250_DEV_PLATFORM,
|
||||||
.dev = {
|
.dev = {
|
||||||
.platform_data = serial_platform_data,
|
.platform_data = serial_platform_data,
|
||||||
},
|
},
|
||||||
|
@ -193,6 +197,86 @@ void __init omap_serial_init(int ports[OMAP_MAX_NR_PORTS])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_OMAP_SERIAL_WAKE
|
||||||
|
|
||||||
|
static irqreturn_t omap_serial_wake_interrupt(int irq, void *dev_id,
|
||||||
|
struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
/* Need to do something with serial port right after wake-up? */
|
||||||
|
return IRQ_HANDLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Reroutes serial RX lines to GPIO lines for the duration of
|
||||||
|
* sleep to allow waking up the device from serial port even
|
||||||
|
* in deep sleep.
|
||||||
|
*/
|
||||||
|
void omap_serial_wake_trigger(int enable)
|
||||||
|
{
|
||||||
|
if (!cpu_is_omap16xx())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (uart1_ck != NULL) {
|
||||||
|
if (enable)
|
||||||
|
omap_cfg_reg(V14_16XX_GPIO37);
|
||||||
|
else
|
||||||
|
omap_cfg_reg(V14_16XX_UART1_RX);
|
||||||
|
}
|
||||||
|
if (uart2_ck != NULL) {
|
||||||
|
if (enable)
|
||||||
|
omap_cfg_reg(R9_16XX_GPIO18);
|
||||||
|
else
|
||||||
|
omap_cfg_reg(R9_16XX_UART2_RX);
|
||||||
|
}
|
||||||
|
if (uart3_ck != NULL) {
|
||||||
|
if (enable)
|
||||||
|
omap_cfg_reg(L14_16XX_GPIO49);
|
||||||
|
else
|
||||||
|
omap_cfg_reg(L14_16XX_UART3_RX);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __init omap_serial_set_port_wakeup(int gpio_nr)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = omap_request_gpio(gpio_nr);
|
||||||
|
if (ret < 0) {
|
||||||
|
printk(KERN_ERR "Could not request UART wake GPIO: %i\n",
|
||||||
|
gpio_nr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
omap_set_gpio_direction(gpio_nr, 1);
|
||||||
|
set_irq_type(OMAP_GPIO_IRQ(gpio_nr), IRQT_RISING);
|
||||||
|
ret = request_irq(OMAP_GPIO_IRQ(gpio_nr), &omap_serial_wake_interrupt,
|
||||||
|
0, "serial wakeup", NULL);
|
||||||
|
if (ret) {
|
||||||
|
omap_free_gpio(gpio_nr);
|
||||||
|
printk(KERN_ERR "No interrupt for UART wake GPIO: %i\n",
|
||||||
|
gpio_nr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
enable_irq_wake(OMAP_GPIO_IRQ(gpio_nr));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __init omap_serial_wakeup_init(void)
|
||||||
|
{
|
||||||
|
if (!cpu_is_omap16xx())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (uart1_ck != NULL)
|
||||||
|
omap_serial_set_port_wakeup(37);
|
||||||
|
if (uart2_ck != NULL)
|
||||||
|
omap_serial_set_port_wakeup(18);
|
||||||
|
if (uart3_ck != NULL)
|
||||||
|
omap_serial_set_port_wakeup(49);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
late_initcall(omap_serial_wakeup_init);
|
||||||
|
|
||||||
|
#endif /* CONFIG_OMAP_SERIAL_WAKE */
|
||||||
|
|
||||||
static int __init omap_init(void)
|
static int __init omap_init(void)
|
||||||
{
|
{
|
||||||
return platform_device_register(&serial_device);
|
return platform_device_register(&serial_device);
|
||||||
|
|
|
@ -247,13 +247,6 @@ unsigned long long sched_clock(void)
|
||||||
#define OMAP_32K_TIMER_TCR 0x04
|
#define OMAP_32K_TIMER_TCR 0x04
|
||||||
|
|
||||||
#define OMAP_32K_TICKS_PER_HZ (32768 / HZ)
|
#define OMAP_32K_TICKS_PER_HZ (32768 / HZ)
|
||||||
#if (32768 % HZ) != 0
|
|
||||||
/* We cannot ignore modulo.
|
|
||||||
* Potential error can be as high as several percent.
|
|
||||||
*/
|
|
||||||
#define OMAP_32K_TICK_MODULO (32768 % HZ)
|
|
||||||
static unsigned modulo_count = 0; /* Counts 1/HZ units */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TRM says 1 / HZ = ( TVR + 1) / 32768, so TRV = (32768 / HZ) - 1
|
* TRM says 1 / HZ = ( TVR + 1) / 32768, so TRV = (32768 / HZ) - 1
|
||||||
|
@ -296,13 +289,22 @@ static inline void omap_32k_timer_stop(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Rounds down to nearest usec
|
* Rounds down to nearest usec. Note that this will overflow for larger values.
|
||||||
*/
|
*/
|
||||||
static inline unsigned long omap_32k_ticks_to_usecs(unsigned long ticks_32k)
|
static inline unsigned long omap_32k_ticks_to_usecs(unsigned long ticks_32k)
|
||||||
{
|
{
|
||||||
return (ticks_32k * 5*5*5*5*5*5) >> 9;
|
return (ticks_32k * 5*5*5*5*5*5) >> 9;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Rounds down to nearest nsec.
|
||||||
|
*/
|
||||||
|
static inline unsigned long long
|
||||||
|
omap_32k_ticks_to_nsecs(unsigned long ticks_32k)
|
||||||
|
{
|
||||||
|
return (unsigned long long) ticks_32k * 1000 * 5*5*5*5*5*5 >> 9;
|
||||||
|
}
|
||||||
|
|
||||||
static unsigned long omap_32k_last_tick = 0;
|
static unsigned long omap_32k_last_tick = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -314,6 +316,15 @@ static unsigned long omap_32k_timer_gettimeoffset(void)
|
||||||
return omap_32k_ticks_to_usecs(now - omap_32k_last_tick);
|
return omap_32k_ticks_to_usecs(now - omap_32k_last_tick);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns current time from boot in nsecs. It's OK for this to wrap
|
||||||
|
* around for now, as it's just a relative time stamp.
|
||||||
|
*/
|
||||||
|
unsigned long long sched_clock(void)
|
||||||
|
{
|
||||||
|
return omap_32k_ticks_to_nsecs(omap_32k_sync_timer_read());
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Timer interrupt for 32KHz timer. When dynamic tick is enabled, this
|
* Timer interrupt for 32KHz timer. When dynamic tick is enabled, this
|
||||||
* function is also called from other interrupts to remove latency
|
* function is also called from other interrupts to remove latency
|
||||||
|
@ -330,19 +341,6 @@ static irqreturn_t omap_32k_timer_interrupt(int irq, void *dev_id,
|
||||||
now = omap_32k_sync_timer_read();
|
now = omap_32k_sync_timer_read();
|
||||||
|
|
||||||
while (now - omap_32k_last_tick >= OMAP_32K_TICKS_PER_HZ) {
|
while (now - omap_32k_last_tick >= OMAP_32K_TICKS_PER_HZ) {
|
||||||
#ifdef OMAP_32K_TICK_MODULO
|
|
||||||
/* Modulo addition may put omap_32k_last_tick ahead of now
|
|
||||||
* and cause unwanted repetition of the while loop.
|
|
||||||
*/
|
|
||||||
if (unlikely(now - omap_32k_last_tick == ~0))
|
|
||||||
break;
|
|
||||||
|
|
||||||
modulo_count += OMAP_32K_TICK_MODULO;
|
|
||||||
if (modulo_count > HZ) {
|
|
||||||
++omap_32k_last_tick;
|
|
||||||
modulo_count -= HZ;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
omap_32k_last_tick += OMAP_32K_TICKS_PER_HZ;
|
omap_32k_last_tick += OMAP_32K_TICKS_PER_HZ;
|
||||||
timer_tick(regs);
|
timer_tick(regs);
|
||||||
}
|
}
|
||||||
|
|
|
@ -140,7 +140,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
|
||||||
|
|
||||||
static struct platform_device serial_device = {
|
static struct platform_device serial_device = {
|
||||||
.name = "serial8250",
|
.name = "serial8250",
|
||||||
.id = 0,
|
.id = PLAT8250_DEV_PLATFORM,
|
||||||
.dev = {
|
.dev = {
|
||||||
.platform_data = serial_platform_data,
|
.platform_data = serial_platform_data,
|
||||||
},
|
},
|
||||||
|
|
|
@ -381,7 +381,7 @@ static struct plat_serial8250_port bast_sio_data[] = {
|
||||||
|
|
||||||
static struct platform_device bast_sio = {
|
static struct platform_device bast_sio = {
|
||||||
.name = "serial8250",
|
.name = "serial8250",
|
||||||
.id = 0,
|
.id = PLAT8250_DEV_PLATFORM,
|
||||||
.dev = {
|
.dev = {
|
||||||
.platform_data = &bast_sio_data,
|
.platform_data = &bast_sio_data,
|
||||||
},
|
},
|
||||||
|
|
|
@ -221,7 +221,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
|
||||||
|
|
||||||
static struct platform_device serial_device = {
|
static struct platform_device serial_device = {
|
||||||
.name = "serial8250",
|
.name = "serial8250",
|
||||||
.id = 0,
|
.id = PLAT8250_DEV_PLATFORM,
|
||||||
.dev = {
|
.dev = {
|
||||||
.platform_data = serial_platform_data,
|
.platform_data = serial_platform_data,
|
||||||
},
|
},
|
||||||
|
|
|
@ -41,7 +41,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
|
||||||
|
|
||||||
static struct platform_device serial_device = {
|
static struct platform_device serial_device = {
|
||||||
.name = "serial8250",
|
.name = "serial8250",
|
||||||
.id = 0,
|
.id = PLAT8250_DEV_PLATFORM,
|
||||||
.dev = {
|
.dev = {
|
||||||
.platform_data = serial_platform_data,
|
.platform_data = serial_platform_data,
|
||||||
},
|
},
|
||||||
|
|
|
@ -16,6 +16,58 @@
|
||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
|
|
||||||
#ifdef CONFIG_CPU_CACHE_VIPT
|
#ifdef CONFIG_CPU_CACHE_VIPT
|
||||||
|
|
||||||
|
void flush_cache_mm(struct mm_struct *mm)
|
||||||
|
{
|
||||||
|
if (cache_is_vivt()) {
|
||||||
|
if (cpu_isset(smp_processor_id(), mm->cpu_vm_mask))
|
||||||
|
__cpuc_flush_user_all();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cache_is_vipt_aliasing()) {
|
||||||
|
asm( "mcr p15, 0, %0, c7, c14, 0\n"
|
||||||
|
" mcr p15, 0, %0, c7, c5, 0\n"
|
||||||
|
" mcr p15, 0, %0, c7, c10, 4"
|
||||||
|
:
|
||||||
|
: "r" (0)
|
||||||
|
: "cc");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end)
|
||||||
|
{
|
||||||
|
if (cache_is_vivt()) {
|
||||||
|
if (cpu_isset(smp_processor_id(), vma->vm_mm->cpu_vm_mask))
|
||||||
|
__cpuc_flush_user_range(start & PAGE_MASK, PAGE_ALIGN(end),
|
||||||
|
vma->vm_flags);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cache_is_vipt_aliasing()) {
|
||||||
|
asm( "mcr p15, 0, %0, c7, c14, 0\n"
|
||||||
|
" mcr p15, 0, %0, c7, c5, 0\n"
|
||||||
|
" mcr p15, 0, %0, c7, c10, 4"
|
||||||
|
:
|
||||||
|
: "r" (0)
|
||||||
|
: "cc");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsigned long pfn)
|
||||||
|
{
|
||||||
|
if (cache_is_vivt()) {
|
||||||
|
if (cpu_isset(smp_processor_id(), vma->vm_mm->cpu_vm_mask)) {
|
||||||
|
unsigned long addr = user_addr & PAGE_MASK;
|
||||||
|
__cpuc_flush_user_range(addr, addr + PAGE_SIZE, vma->vm_flags);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cache_is_vipt_aliasing())
|
||||||
|
flush_pfn_alias(pfn, user_addr);
|
||||||
|
}
|
||||||
|
|
||||||
#define ALIAS_FLUSH_START 0xffff4000
|
#define ALIAS_FLUSH_START 0xffff4000
|
||||||
|
|
||||||
#define TOP_PTE(x) pte_offset_kernel(top_pmd, x)
|
#define TOP_PTE(x) pte_offset_kernel(top_pmd, x)
|
||||||
|
|
|
@ -467,11 +467,11 @@ static void __init longhaul_setup_voltagescaling(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vrmrev==0) {
|
if (vrmrev==0) {
|
||||||
dprintk ("VRM 8.5 \n");
|
dprintk ("VRM 8.5\n");
|
||||||
memcpy (voltage_table, vrm85scales, sizeof(voltage_table));
|
memcpy (voltage_table, vrm85scales, sizeof(voltage_table));
|
||||||
numvscales = (voltage_table[maxvid]-voltage_table[minvid])/25;
|
numvscales = (voltage_table[maxvid]-voltage_table[minvid])/25;
|
||||||
} else {
|
} else {
|
||||||
dprintk ("Mobile VRM \n");
|
dprintk ("Mobile VRM\n");
|
||||||
memcpy (voltage_table, mobilevrmscales, sizeof(voltage_table));
|
memcpy (voltage_table, mobilevrmscales, sizeof(voltage_table));
|
||||||
numvscales = (voltage_table[maxvid]-voltage_table[minvid])/5;
|
numvscales = (voltage_table[maxvid]-voltage_table[minvid])/5;
|
||||||
}
|
}
|
||||||
|
|
|
@ -259,7 +259,7 @@ static int centrino_cpu_init_table(struct cpufreq_policy *policy)
|
||||||
|
|
||||||
if (model->op_points == NULL) {
|
if (model->op_points == NULL) {
|
||||||
/* Matched a non-match */
|
/* Matched a non-match */
|
||||||
dprintk(KERN_INFO PFX "no table support for CPU model \"%s\": \n",
|
dprintk(KERN_INFO PFX "no table support for CPU model \"%s\"\n",
|
||||||
cpu->x86_model_id);
|
cpu->x86_model_id);
|
||||||
#ifndef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI
|
#ifndef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI
|
||||||
dprintk(KERN_INFO PFX "try compiling with CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI enabled\n");
|
dprintk(KERN_INFO PFX "try compiling with CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI enabled\n");
|
||||||
|
@ -402,7 +402,7 @@ static int centrino_cpu_init_acpi(struct cpufreq_policy *policy)
|
||||||
|
|
||||||
for (i=0; i<p.state_count; i++) {
|
for (i=0; i<p.state_count; i++) {
|
||||||
if (p.states[i].control != p.states[i].status) {
|
if (p.states[i].control != p.states[i].status) {
|
||||||
dprintk("Different control (%x) and status values (%x)\n",
|
dprintk("Different control (%llu) and status values (%llu)\n",
|
||||||
p.states[i].control, p.states[i].status);
|
p.states[i].control, p.states[i].status);
|
||||||
result = -EINVAL;
|
result = -EINVAL;
|
||||||
goto err_unreg;
|
goto err_unreg;
|
||||||
|
@ -415,7 +415,7 @@ static int centrino_cpu_init_acpi(struct cpufreq_policy *policy)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p.states[i].core_frequency > p.states[0].core_frequency) {
|
if (p.states[i].core_frequency > p.states[0].core_frequency) {
|
||||||
dprintk("P%u has larger frequency (%u) than P0 (%u), skipping\n", i,
|
dprintk("P%u has larger frequency (%llu) than P0 (%llu), skipping\n", i,
|
||||||
p.states[i].core_frequency, p.states[0].core_frequency);
|
p.states[i].core_frequency, p.states[0].core_frequency);
|
||||||
p.states[i].core_frequency = 0;
|
p.states[i].core_frequency = 0;
|
||||||
continue;
|
continue;
|
||||||
|
@ -498,13 +498,6 @@ static int centrino_cpu_init(struct cpufreq_policy *policy)
|
||||||
if (cpu->x86_vendor != X86_VENDOR_INTEL || !cpu_has(cpu, X86_FEATURE_EST))
|
if (cpu->x86_vendor != X86_VENDOR_INTEL || !cpu_has(cpu, X86_FEATURE_EST))
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
for (i = 0; i < N_IDS; i++)
|
|
||||||
if (centrino_verify_cpu_id(cpu, &cpu_ids[i]))
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (i != N_IDS)
|
|
||||||
centrino_cpu[policy->cpu] = &cpu_ids[i];
|
|
||||||
|
|
||||||
if (is_const_loops_cpu(policy->cpu)) {
|
if (is_const_loops_cpu(policy->cpu)) {
|
||||||
centrino_driver.flags |= CPUFREQ_CONST_LOOPS;
|
centrino_driver.flags |= CPUFREQ_CONST_LOOPS;
|
||||||
}
|
}
|
||||||
|
@ -513,6 +506,13 @@ static int centrino_cpu_init(struct cpufreq_policy *policy)
|
||||||
if (policy->cpu != 0)
|
if (policy->cpu != 0)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
|
for (i = 0; i < N_IDS; i++)
|
||||||
|
if (centrino_verify_cpu_id(cpu, &cpu_ids[i]))
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (i != N_IDS)
|
||||||
|
centrino_cpu[policy->cpu] = &cpu_ids[i];
|
||||||
|
|
||||||
if (!centrino_cpu[policy->cpu]) {
|
if (!centrino_cpu[policy->cpu]) {
|
||||||
dprintk(KERN_INFO PFX "found unsupported CPU with "
|
dprintk(KERN_INFO PFX "found unsupported CPU with "
|
||||||
"Enhanced SpeedStep: send /proc/cpuinfo to "
|
"Enhanced SpeedStep: send /proc/cpuinfo to "
|
||||||
|
|
|
@ -99,7 +99,7 @@ static int speedstep_smi_get_freqs (unsigned int *low, unsigned int *high)
|
||||||
u32 function = GET_SPEEDSTEP_FREQS;
|
u32 function = GET_SPEEDSTEP_FREQS;
|
||||||
|
|
||||||
if (!(ist_info.event & 0xFFFF)) {
|
if (!(ist_info.event & 0xFFFF)) {
|
||||||
dprintk("bug #1422 -- can't read freqs from BIOS\n", result);
|
dprintk("bug #1422 -- can't read freqs from BIOS\n");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1634,9 +1634,9 @@ void disable_IO_APIC(void)
|
||||||
clear_IO_APIC();
|
clear_IO_APIC();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the i82559 is routed through an IOAPIC
|
* If the i8259 is routed through an IOAPIC
|
||||||
* Put that IOAPIC in virtual wire mode
|
* Put that IOAPIC in virtual wire mode
|
||||||
* so legacy interrups can be delivered.
|
* so legacy interrupts can be delivered.
|
||||||
*/
|
*/
|
||||||
pin = find_isa_irq_pin(0, mp_ExtINT);
|
pin = find_isa_irq_pin(0, mp_ExtINT);
|
||||||
if (pin != -1) {
|
if (pin != -1) {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
struct sigframe
|
struct sigframe
|
||||||
{
|
{
|
||||||
char *pretcode;
|
char __user *pretcode;
|
||||||
int sig;
|
int sig;
|
||||||
struct sigcontext sc;
|
struct sigcontext sc;
|
||||||
struct _fpstate fpstate;
|
struct _fpstate fpstate;
|
||||||
|
@ -10,10 +10,10 @@ struct sigframe
|
||||||
|
|
||||||
struct rt_sigframe
|
struct rt_sigframe
|
||||||
{
|
{
|
||||||
char *pretcode;
|
char __user *pretcode;
|
||||||
int sig;
|
int sig;
|
||||||
struct siginfo *pinfo;
|
struct siginfo __user *pinfo;
|
||||||
void *puc;
|
void __user *puc;
|
||||||
struct siginfo info;
|
struct siginfo info;
|
||||||
struct ucontext uc;
|
struct ucontext uc;
|
||||||
struct _fpstate fpstate;
|
struct _fpstate fpstate;
|
||||||
|
|
|
@ -283,9 +283,9 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
|
||||||
/* Write-combine setting is ignored, it is changed via the mtrr
|
/* Write-combine setting is ignored, it is changed via the mtrr
|
||||||
* interfaces on this platform.
|
* interfaces on this platform.
|
||||||
*/
|
*/
|
||||||
if (remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
|
if (io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
|
||||||
vma->vm_end - vma->vm_start,
|
vma->vm_end - vma->vm_start,
|
||||||
vma->vm_page_prot))
|
vma->vm_page_prot))
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -339,12 +339,6 @@ config IA64_PALINFO
|
||||||
To use this option, you have to ensure that the "/proc file system
|
To use this option, you have to ensure that the "/proc file system
|
||||||
support" (CONFIG_PROC_FS) is enabled, too.
|
support" (CONFIG_PROC_FS) is enabled, too.
|
||||||
|
|
||||||
config ACPI_DEALLOCATE_IRQ
|
|
||||||
bool
|
|
||||||
depends on ACPI
|
|
||||||
depends on IOSAPIC && EXPERIMENTAL
|
|
||||||
default y
|
|
||||||
|
|
||||||
source "drivers/firmware/Kconfig"
|
source "drivers/firmware/Kconfig"
|
||||||
|
|
||||||
source "fs/Kconfig.binfmt"
|
source "fs/Kconfig.binfmt"
|
||||||
|
|
|
@ -111,7 +111,6 @@ CONFIG_COMPAT=y
|
||||||
CONFIG_IA64_MCA_RECOVERY=y
|
CONFIG_IA64_MCA_RECOVERY=y
|
||||||
CONFIG_PERFMON=y
|
CONFIG_PERFMON=y
|
||||||
CONFIG_IA64_PALINFO=y
|
CONFIG_IA64_PALINFO=y
|
||||||
CONFIG_ACPI_DEALLOCATE_IRQ=y
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Firmware Drivers
|
# Firmware Drivers
|
||||||
|
|
|
@ -109,7 +109,6 @@ CONFIG_COMPAT=y
|
||||||
CONFIG_IA64_MCA_RECOVERY=y
|
CONFIG_IA64_MCA_RECOVERY=y
|
||||||
CONFIG_PERFMON=y
|
CONFIG_PERFMON=y
|
||||||
CONFIG_IA64_PALINFO=y
|
CONFIG_IA64_PALINFO=y
|
||||||
CONFIG_ACPI_DEALLOCATE_IRQ=y
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Firmware Drivers
|
# Firmware Drivers
|
||||||
|
|
|
@ -109,7 +109,6 @@ CONFIG_COMPAT=y
|
||||||
CONFIG_IA64_MCA_RECOVERY=y
|
CONFIG_IA64_MCA_RECOVERY=y
|
||||||
CONFIG_PERFMON=y
|
CONFIG_PERFMON=y
|
||||||
CONFIG_IA64_PALINFO=y
|
CONFIG_IA64_PALINFO=y
|
||||||
CONFIG_ACPI_DEALLOCATE_IRQ=y
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Firmware Drivers
|
# Firmware Drivers
|
||||||
|
|
|
@ -99,7 +99,6 @@ CONFIG_COMPAT=y
|
||||||
CONFIG_IA64_MCA_RECOVERY=y
|
CONFIG_IA64_MCA_RECOVERY=y
|
||||||
CONFIG_PERFMON=y
|
CONFIG_PERFMON=y
|
||||||
CONFIG_IA64_PALINFO=y
|
CONFIG_IA64_PALINFO=y
|
||||||
CONFIG_ACPI_DEALLOCATE_IRQ=y
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Firmware Drivers
|
# Firmware Drivers
|
||||||
|
@ -335,7 +334,7 @@ CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
|
||||||
CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
|
CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
|
||||||
# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set
|
# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set
|
||||||
# CONFIG_SCSI_IPR is not set
|
# CONFIG_SCSI_IPR is not set
|
||||||
CONFIG_SCSI_QLOGIC_FC=y
|
# CONFIG_SCSI_QLOGIC_FC is not set
|
||||||
# CONFIG_SCSI_QLOGIC_FC_FIRMWARE is not set
|
# CONFIG_SCSI_QLOGIC_FC_FIRMWARE is not set
|
||||||
CONFIG_SCSI_QLOGIC_1280=y
|
CONFIG_SCSI_QLOGIC_1280=y
|
||||||
# CONFIG_SCSI_QLOGIC_1280_1040 is not set
|
# CONFIG_SCSI_QLOGIC_1280_1040 is not set
|
||||||
|
|
|
@ -583,14 +583,12 @@ int acpi_register_gsi(u32 gsi, int edge_level, int active_high_low)
|
||||||
|
|
||||||
EXPORT_SYMBOL(acpi_register_gsi);
|
EXPORT_SYMBOL(acpi_register_gsi);
|
||||||
|
|
||||||
#ifdef CONFIG_ACPI_DEALLOCATE_IRQ
|
|
||||||
void acpi_unregister_gsi(u32 gsi)
|
void acpi_unregister_gsi(u32 gsi)
|
||||||
{
|
{
|
||||||
iosapic_unregister_intr(gsi);
|
iosapic_unregister_intr(gsi);
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(acpi_unregister_gsi);
|
EXPORT_SYMBOL(acpi_unregister_gsi);
|
||||||
#endif /* CONFIG_ACPI_DEALLOCATE_IRQ */
|
|
||||||
|
|
||||||
static int __init acpi_parse_fadt(unsigned long phys_addr, unsigned long size)
|
static int __init acpi_parse_fadt(unsigned long phys_addr, unsigned long size)
|
||||||
{
|
{
|
||||||
|
|
|
@ -204,9 +204,6 @@ GLOBAL_ENTRY(ia64_switch_to)
|
||||||
(p6) br.cond.dpnt .map
|
(p6) br.cond.dpnt .map
|
||||||
;;
|
;;
|
||||||
.done:
|
.done:
|
||||||
(p6) ssm psr.ic // if we had to map, reenable the psr.ic bit FIRST!!!
|
|
||||||
;;
|
|
||||||
(p6) srlz.d
|
|
||||||
ld8 sp=[r21] // load kernel stack pointer of new task
|
ld8 sp=[r21] // load kernel stack pointer of new task
|
||||||
mov IA64_KR(CURRENT)=in0 // update "current" application register
|
mov IA64_KR(CURRENT)=in0 // update "current" application register
|
||||||
mov r8=r13 // return pointer to previously running task
|
mov r8=r13 // return pointer to previously running task
|
||||||
|
@ -234,6 +231,9 @@ GLOBAL_ENTRY(ia64_switch_to)
|
||||||
mov IA64_KR(CURRENT_STACK)=r26 // remember last page we mapped...
|
mov IA64_KR(CURRENT_STACK)=r26 // remember last page we mapped...
|
||||||
;;
|
;;
|
||||||
itr.d dtr[r25]=r23 // wire in new mapping...
|
itr.d dtr[r25]=r23 // wire in new mapping...
|
||||||
|
ssm psr.ic // reenable the psr.ic bit
|
||||||
|
;;
|
||||||
|
srlz.d
|
||||||
br.cond.sptk .done
|
br.cond.sptk .done
|
||||||
END(ia64_switch_to)
|
END(ia64_switch_to)
|
||||||
|
|
||||||
|
|
|
@ -782,7 +782,6 @@ iosapic_register_intr (unsigned int gsi,
|
||||||
return vector;
|
return vector;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_ACPI_DEALLOCATE_IRQ
|
|
||||||
void
|
void
|
||||||
iosapic_unregister_intr (unsigned int gsi)
|
iosapic_unregister_intr (unsigned int gsi)
|
||||||
{
|
{
|
||||||
|
@ -865,7 +864,6 @@ iosapic_unregister_intr (unsigned int gsi)
|
||||||
spin_unlock(&iosapic_lock);
|
spin_unlock(&iosapic_lock);
|
||||||
spin_unlock_irqrestore(&idesc->lock, flags);
|
spin_unlock_irqrestore(&idesc->lock, flags);
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_ACPI_DEALLOCATE_IRQ */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ACPI calls this when it finds an entry for a platform interrupt.
|
* ACPI calls this when it finds an entry for a platform interrupt.
|
||||||
|
|
|
@ -625,8 +625,11 @@ EK(.ex_handler, (p17) st8 [dst1]=r39,8); \
|
||||||
clrrrb
|
clrrrb
|
||||||
;;
|
;;
|
||||||
alloc saved_pfs_stack=ar.pfs,3,3,3,0
|
alloc saved_pfs_stack=ar.pfs,3,3,3,0
|
||||||
|
cmp.lt p8,p0=A,r0
|
||||||
sub B = dst0, saved_in0 // how many byte copied so far
|
sub B = dst0, saved_in0 // how many byte copied so far
|
||||||
;;
|
;;
|
||||||
|
(p8) mov A = 0; // A shouldn't be negative, cap it
|
||||||
|
;;
|
||||||
sub C = A, B
|
sub C = A, B
|
||||||
sub D = saved_in2, A
|
sub D = saved_in2, A
|
||||||
;;
|
;;
|
||||||
|
|
|
@ -230,9 +230,6 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ia64_done_with_exception(regs))
|
|
||||||
return;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Since we have no vma's for region 5, we might get here even if the address is
|
* Since we have no vma's for region 5, we might get here even if the address is
|
||||||
* valid, due to the VHPT walker inserting a non present translation that becomes
|
* valid, due to the VHPT walker inserting a non present translation that becomes
|
||||||
|
@ -243,6 +240,9 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re
|
||||||
if (REGION_NUMBER(address) == 5 && mapped_kernel_page_is_present(address))
|
if (REGION_NUMBER(address) == 5 && mapped_kernel_page_is_present(address))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (ia64_done_with_exception(regs))
|
||||||
|
return;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Oops. The kernel tried to access some bad page. We'll have to terminate things
|
* Oops. The kernel tried to access some bad page. We'll have to terminate things
|
||||||
* with extreme prejudice.
|
* with extreme prejudice.
|
||||||
|
|
|
@ -498,13 +498,11 @@ pcibios_enable_device (struct pci_dev *dev, int mask)
|
||||||
return acpi_pci_irq_enable(dev);
|
return acpi_pci_irq_enable(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_ACPI_DEALLOCATE_IRQ
|
|
||||||
void
|
void
|
||||||
pcibios_disable_device (struct pci_dev *dev)
|
pcibios_disable_device (struct pci_dev *dev)
|
||||||
{
|
{
|
||||||
acpi_pci_irq_disable(dev);
|
acpi_pci_irq_disable(dev);
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_ACPI_DEALLOCATE_IRQ */
|
|
||||||
|
|
||||||
void
|
void
|
||||||
pcibios_align_resource (void *data, struct resource *res,
|
pcibios_align_resource (void *data, struct resource *res,
|
||||||
|
|
|
@ -56,7 +56,7 @@
|
||||||
|
|
||||||
DEFINE_PER_CPU(struct pda_s, pda_percpu);
|
DEFINE_PER_CPU(struct pda_s, pda_percpu);
|
||||||
|
|
||||||
#define MAX_PHYS_MEMORY (1UL << 49) /* 1 TB */
|
#define MAX_PHYS_MEMORY (1UL << IA64_MAX_PHYS_BITS) /* Max physical address supported */
|
||||||
|
|
||||||
lboard_t *root_lboard[MAX_COMPACT_NODES];
|
lboard_t *root_lboard[MAX_COMPACT_NODES];
|
||||||
|
|
||||||
|
|
|
@ -885,6 +885,10 @@ xpc_init(void)
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
|
|
||||||
|
|
||||||
|
if (!ia64_platform_is("sn2")) {
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* xpc_remote_copy_buffer is used as a temporary buffer for bte_copy'ng
|
* xpc_remote_copy_buffer is used as a temporary buffer for bte_copy'ng
|
||||||
* both a partition's reserved page and its XPC variables. Its size was
|
* both a partition's reserved page and its XPC variables. Its size was
|
||||||
|
|
|
@ -636,6 +636,10 @@ xpnet_init(void)
|
||||||
int result = -ENOMEM;
|
int result = -ENOMEM;
|
||||||
|
|
||||||
|
|
||||||
|
if (!ia64_platform_is("sn2")) {
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
dev_info(xpnet, "registering network device %s\n", XPNET_DEVICE_NAME);
|
dev_info(xpnet, "registering network device %s\n", XPNET_DEVICE_NAME);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
#
|
||||||
|
# Makefile for the m68knommu linux kernel.
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# If you want to play with the HW breakpoints then you will
|
||||||
|
# need to add define this, which will give you a stack backtrace
|
||||||
|
# on the console port whenever a DBG interrupt occurs. You have to
|
||||||
|
# set up you HW breakpoints to trigger a DBG interrupt:
|
||||||
|
#
|
||||||
|
# EXTRA_CFLAGS += -DTRAP_DBG_INTERRUPT
|
||||||
|
# EXTRA_AFLAGS += -DTRAP_DBG_INTERRUPT
|
||||||
|
#
|
||||||
|
|
||||||
|
ifdef CONFIG_FULLDEBUG
|
||||||
|
AFLAGS += -DDEBUGGER_COMPATIBLE_CACHE=1
|
||||||
|
endif
|
||||||
|
|
||||||
|
obj-y := config.o
|
|
@ -104,11 +104,11 @@ int mcf_timerirqpending(int timer)
|
||||||
|
|
||||||
void config_BSP(char *commandp, int size)
|
void config_BSP(char *commandp, int size)
|
||||||
{
|
{
|
||||||
#if 0
|
#if defined (CONFIG_MOD5272)
|
||||||
volatile unsigned long *pivrp;
|
volatile unsigned char *pivrp;
|
||||||
|
|
||||||
/* Set base of device vectors to be 64 */
|
/* Set base of device vectors to be 64 */
|
||||||
pivrp = (volatile unsigned long *) (MCF_MBAR + MCFSIM_PIVR);
|
pivrp = (volatile unsigned char *) (MCF_MBAR + MCFSIM_PIVR);
|
||||||
*pivrp = 0x40;
|
*pivrp = 0x40;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@ endif
|
||||||
obj-$(CONFIG_COLDFIRE) += entry.o vectors.o ints.o
|
obj-$(CONFIG_COLDFIRE) += entry.o vectors.o ints.o
|
||||||
obj-$(CONFIG_M5206) += timers.o
|
obj-$(CONFIG_M5206) += timers.o
|
||||||
obj-$(CONFIG_M5206e) += timers.o
|
obj-$(CONFIG_M5206e) += timers.o
|
||||||
|
obj-$(CONFIG_M523x) += pit.o
|
||||||
obj-$(CONFIG_M5249) += timers.o
|
obj-$(CONFIG_M5249) += timers.o
|
||||||
obj-$(CONFIG_M527x) += pit.o
|
obj-$(CONFIG_M527x) += pit.o
|
||||||
obj-$(CONFIG_M5272) += timers.o
|
obj-$(CONFIG_M5272) += timers.o
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* linux/arch/$(ARCH)/platform/$(PLATFORM)/config.c
|
* linux/arch/m68knommu/platform/68328/config.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1993 Hamish Macdonald
|
* Copyright (C) 1993 Hamish Macdonald
|
||||||
* Copyright (C) 1999 D. Jeff Dionne
|
* Copyright (C) 1999 D. Jeff Dionne
|
||||||
|
@ -11,6 +13,8 @@
|
||||||
* VZ Support/Fixes Evan Stawnyczy <e@lineo.ca>
|
* VZ Support/Fixes Evan Stawnyczy <e@lineo.ca>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
#include <asm/dbg.h>
|
#include <asm/dbg.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <linux/config.h>
|
#include <linux/config.h>
|
||||||
|
@ -29,76 +33,16 @@
|
||||||
#include <asm/machdep.h>
|
#include <asm/machdep.h>
|
||||||
#include <asm/MC68328.h>
|
#include <asm/MC68328.h>
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
void BSP_sched_init(irqreturn_t (*timer_routine)(int, void *, struct pt_regs *))
|
void m68328_timer_init(irqreturn_t (*timer_routine) (int, void *, struct pt_regs *));
|
||||||
{
|
void m68328_timer_tick(void);
|
||||||
|
unsigned long m68328_timer_gettimeoffset(void);
|
||||||
|
void m68328_timer_gettod(int *year, int *mon, int *day, int *hour, int *min, int *sec);
|
||||||
|
|
||||||
#ifdef CONFIG_XCOPILOT_BUGS
|
/***************************************************************************/
|
||||||
/*
|
|
||||||
* The only thing I know is that CLK32 is not available on Xcopilot
|
|
||||||
* I have little idea about what frequency SYSCLK has on Xcopilot.
|
|
||||||
* The values for prescaler and compare registers were simply
|
|
||||||
* taken from the original source
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Restart mode, Enable int, SYSCLK, Enable timer */
|
void m68328_reset (void)
|
||||||
TCTL2 = TCTL_OM | TCTL_IRQEN | TCTL_CLKSOURCE_SYSCLK | TCTL_TEN;
|
|
||||||
/* Set prescaler */
|
|
||||||
TPRER2 = 2;
|
|
||||||
/* Set compare register */
|
|
||||||
TCMP2 = 0xd7e4;
|
|
||||||
#else
|
|
||||||
/* Restart mode, Enable int, 32KHz, Enable timer */
|
|
||||||
TCTL2 = TCTL_OM | TCTL_IRQEN | TCTL_CLKSOURCE_32KHZ | TCTL_TEN;
|
|
||||||
/* Set prescaler (Divide 32KHz by 32)*/
|
|
||||||
TPRER2 = 31;
|
|
||||||
/* Set compare register 32Khz / 32 / 10 = 100 */
|
|
||||||
TCMP2 = 10;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
request_irq(TMR2_IRQ_NUM, timer_routine, IRQ_FLG_LOCK, "timer", NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void BSP_tick(void)
|
|
||||||
{
|
|
||||||
/* Reset Timer2 */
|
|
||||||
TSTAT2 &= 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long BSP_gettimeoffset (void)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void BSP_gettod (int *yearp, int *monp, int *dayp,
|
|
||||||
int *hourp, int *minp, int *secp)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
int BSP_hwclk(int op, struct hwclk_time *t)
|
|
||||||
{
|
|
||||||
if (!op) {
|
|
||||||
/* read */
|
|
||||||
} else {
|
|
||||||
/* write */
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int BSP_set_clock_mmss (unsigned long nowtime)
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
short real_seconds = nowtime % 60, real_minutes = (nowtime / 60) % 60;
|
|
||||||
|
|
||||||
tod->second1 = real_seconds / 10;
|
|
||||||
tod->second2 = real_seconds % 10;
|
|
||||||
tod->minute1 = real_minutes / 10;
|
|
||||||
tod->minute2 = real_minutes % 10;
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void BSP_reset (void)
|
|
||||||
{
|
{
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
asm volatile ("moveal #0x10c00000, %a0;\n\t"
|
asm volatile ("moveal #0x10c00000, %a0;\n\t"
|
||||||
|
@ -108,18 +52,22 @@ void BSP_reset (void)
|
||||||
"jmp (%a0);");
|
"jmp (%a0);");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
void config_BSP(char *command, int len)
|
void config_BSP(char *command, int len)
|
||||||
{
|
{
|
||||||
printk(KERN_INFO "\n68328 support D. Jeff Dionne <jeff@uclinux.org>\n");
|
printk(KERN_INFO "\n68328 support D. Jeff Dionne <jeff@uclinux.org>\n");
|
||||||
printk(KERN_INFO "68328 support Kenneth Albanowski <kjahds@kjshds.com>\n");
|
printk(KERN_INFO "68328 support Kenneth Albanowski <kjahds@kjshds.com>\n");
|
||||||
printk(KERN_INFO "68328/Pilot support Bernhard Kuhn <kuhn@lpr.e-technik.tu-muenchen.de>\n");
|
printk(KERN_INFO "68328/Pilot support Bernhard Kuhn <kuhn@lpr.e-technik.tu-muenchen.de>\n");
|
||||||
|
|
||||||
mach_sched_init = BSP_sched_init;
|
mach_sched_init = m68328_timer_init;
|
||||||
mach_tick = BSP_tick;
|
mach_tick = m68328_timer_tick;
|
||||||
mach_gettimeoffset = BSP_gettimeoffset;
|
mach_gettimeoffset = m68328_timer_gettimeoffset;
|
||||||
mach_gettod = BSP_gettod;
|
mach_gettod = m68328_timer_gettod;
|
||||||
mach_hwclk = NULL;
|
mach_hwclk = NULL;
|
||||||
mach_set_clock_mmss = NULL;
|
mach_set_clock_mmss = NULL;
|
||||||
mach_reset = BSP_reset;
|
mach_reset = m68328_reset;
|
||||||
*command = '\0';
|
*command = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
|
|
@ -0,0 +1,106 @@
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* linux/arch/m68knommu/platform/68328/timers.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 1993 Hamish Macdonald
|
||||||
|
* Copyright (C) 1999 D. Jeff Dionne
|
||||||
|
* Copyright (C) 2001 Georges Menie, Ken Desmet
|
||||||
|
*
|
||||||
|
* This file is subject to the terms and conditions of the GNU General Public
|
||||||
|
* License. See the file COPYING in the main directory of this archive
|
||||||
|
* for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
|
#include <linux/config.h>
|
||||||
|
#include <linux/types.h>
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/mm.h>
|
||||||
|
#include <asm/setup.h>
|
||||||
|
#include <asm/system.h>
|
||||||
|
#include <asm/pgtable.h>
|
||||||
|
#include <asm/irq.h>
|
||||||
|
#include <asm/machdep.h>
|
||||||
|
#include <asm/MC68VZ328.h>
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
|
#if defined(CONFIG_DRAGEN2)
|
||||||
|
/* with a 33.16 MHz clock, this will give usec resolution to the time functions */
|
||||||
|
#define CLOCK_SOURCE TCTL_CLKSOURCE_SYSCLK
|
||||||
|
#define CLOCK_PRE 7
|
||||||
|
#define TICKS_PER_JIFFY 41450
|
||||||
|
|
||||||
|
#elif defined(CONFIG_XCOPILOT_BUGS)
|
||||||
|
/*
|
||||||
|
* The only thing I know is that CLK32 is not available on Xcopilot
|
||||||
|
* I have little idea about what frequency SYSCLK has on Xcopilot.
|
||||||
|
* The values for prescaler and compare registers were simply
|
||||||
|
* taken from the original source
|
||||||
|
*/
|
||||||
|
#define CLOCK_SOURCE TCTL_CLKSOURCE_SYSCLK
|
||||||
|
#define CLOCK_PRE 2
|
||||||
|
#define TICKS_PER_JIFFY 0xd7e4
|
||||||
|
|
||||||
|
#else
|
||||||
|
/* default to using the 32Khz clock */
|
||||||
|
#define CLOCK_SOURCE TCTL_CLKSOURCE_32KHZ
|
||||||
|
#define CLOCK_PRE 31
|
||||||
|
#define TICKS_PER_JIFFY 10
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
|
void m68328_timer_init(irqreturn_t (*timer_routine) (int, void *, struct pt_regs *))
|
||||||
|
{
|
||||||
|
/* disable timer 1 */
|
||||||
|
TCTL = 0;
|
||||||
|
|
||||||
|
/* set ISR */
|
||||||
|
if (request_irq(TMR_IRQ_NUM, timer_routine, IRQ_FLG_LOCK, "timer", NULL))
|
||||||
|
panic("Unable to attach timer interrupt\n");
|
||||||
|
|
||||||
|
/* Restart mode, Enable int, Set clock source */
|
||||||
|
TCTL = TCTL_OM | TCTL_IRQEN | CLOCK_SOURCE;
|
||||||
|
TPRER = CLOCK_PRE;
|
||||||
|
TCMP = TICKS_PER_JIFFY;
|
||||||
|
|
||||||
|
/* Enable timer 1 */
|
||||||
|
TCTL |= TCTL_TEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
|
void m68328_timer_tick(void)
|
||||||
|
{
|
||||||
|
/* Reset Timer1 */
|
||||||
|
TSTAT &= 0;
|
||||||
|
}
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
|
unsigned long m68328_timer_gettimeoffset(void)
|
||||||
|
{
|
||||||
|
unsigned long ticks = TCN, offset = 0;
|
||||||
|
|
||||||
|
/* check for pending interrupt */
|
||||||
|
if (ticks < (TICKS_PER_JIFFY >> 1) && (ISR & (1 << TMR_IRQ_NUM)))
|
||||||
|
offset = 1000000 / HZ;
|
||||||
|
ticks = (ticks * 1000000 / HZ) / TICKS_PER_JIFFY;
|
||||||
|
return ticks + offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
|
void m68328_timer_gettod(int *year, int *mon, int *day, int *hour, int *min, int *sec)
|
||||||
|
{
|
||||||
|
long now = RTCTIME;
|
||||||
|
|
||||||
|
*year = *mon = *day = 1;
|
||||||
|
*hour = (now >> 24) % 24;
|
||||||
|
*min = (now >> 16) % 60;
|
||||||
|
*sec = now % 60;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***************************************************************************/
|
|
@ -1,5 +1,7 @@
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* linux/arch/$(ARCH)/platform/$(PLATFORM)/config.c
|
* linux/arch/m68knommu/platform/68EZ328/config.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1993 Hamish Macdonald
|
* Copyright (C) 1993 Hamish Macdonald
|
||||||
* Copyright (C) 1999 D. Jeff Dionne
|
* Copyright (C) 1999 D. Jeff Dionne
|
||||||
|
@ -9,6 +11,8 @@
|
||||||
* for more details.
|
* for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <linux/config.h>
|
#include <linux/config.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
@ -20,68 +24,22 @@
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
#include <asm/irq.h>
|
|
||||||
#include <asm/machdep.h>
|
#include <asm/machdep.h>
|
||||||
#include <asm/MC68EZ328.h>
|
#include <asm/MC68EZ328.h>
|
||||||
#ifdef CONFIG_UCSIMM
|
#ifdef CONFIG_UCSIMM
|
||||||
#include <asm/bootstd.h>
|
#include <asm/bootstd.h>
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_PILOT
|
|
||||||
#include "PalmV/romfs.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void BSP_sched_init(void (*timer_routine)(int, void *, struct pt_regs *))
|
/***************************************************************************/
|
||||||
{
|
|
||||||
/* Restart mode, Enable int, 32KHz, Enable timer */
|
|
||||||
TCTL = TCTL_OM | TCTL_IRQEN | TCTL_CLKSOURCE_32KHZ | TCTL_TEN;
|
|
||||||
/* Set prescaler (Divide 32KHz by 32)*/
|
|
||||||
TPRER = 31;
|
|
||||||
/* Set compare register 32Khz / 32 / 10 = 100 */
|
|
||||||
TCMP = 10;
|
|
||||||
|
|
||||||
request_irq(TMR_IRQ_NUM, timer_routine, IRQ_FLG_LOCK, "timer", NULL);
|
void m68328_timer_init(irqreturn_t (*timer_routine) (int, void *, struct pt_regs *));
|
||||||
}
|
void m68328_timer_tick(void);
|
||||||
|
unsigned long m68328_timer_gettimeoffset(void);
|
||||||
|
void m68328_timer_gettod(int *year, int *mon, int *day, int *hour, int *min, int *sec);
|
||||||
|
|
||||||
void BSP_tick(void)
|
/***************************************************************************/
|
||||||
{
|
|
||||||
/* Reset Timer1 */
|
|
||||||
TSTAT &= 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long BSP_gettimeoffset (void)
|
void m68ez328_reset(void)
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void BSP_gettod (int *yearp, int *monp, int *dayp,
|
|
||||||
int *hourp, int *minp, int *secp)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
int BSP_hwclk(int op, struct hwclk_time *t)
|
|
||||||
{
|
|
||||||
if (!op) {
|
|
||||||
/* read */
|
|
||||||
} else {
|
|
||||||
/* write */
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int BSP_set_clock_mmss (unsigned long nowtime)
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
short real_seconds = nowtime % 60, real_minutes = (nowtime / 60) % 60;
|
|
||||||
|
|
||||||
tod->second1 = real_seconds / 10;
|
|
||||||
tod->second2 = real_seconds % 10;
|
|
||||||
tod->minute1 = real_minutes / 10;
|
|
||||||
tod->minute2 = real_minutes % 10;
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void BSP_reset (void)
|
|
||||||
{
|
{
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
asm volatile ("
|
asm volatile ("
|
||||||
|
@ -93,6 +51,8 @@ void BSP_reset (void)
|
||||||
");
|
");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
unsigned char *cs8900a_hwaddr;
|
unsigned char *cs8900a_hwaddr;
|
||||||
static int errno;
|
static int errno;
|
||||||
|
|
||||||
|
@ -119,11 +79,13 @@ void config_BSP(char *command, int len)
|
||||||
else command[0] = 0;
|
else command[0] = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
mach_sched_init = BSP_sched_init;
|
mach_sched_init = m68328_timer_init;
|
||||||
mach_tick = BSP_tick;
|
mach_tick = m68328_timer_tick;
|
||||||
mach_gettimeoffset = BSP_gettimeoffset;
|
mach_gettimeoffset = m68328_timer_gettimeoffset;
|
||||||
mach_gettod = BSP_gettod;
|
mach_gettod = m68328_timer_gettod;
|
||||||
mach_hwclk = NULL;
|
mach_hwclk = NULL;
|
||||||
mach_set_clock_mmss = NULL;
|
mach_set_clock_mmss = NULL;
|
||||||
mach_reset = BSP_reset;
|
mach_reset = m68ez328_reset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* linux/arch/m68knommu/platform/MC68VZ328/de2/config.c
|
* linux/arch/m68knommu/platform/68VZ328/config.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1993 Hamish Macdonald
|
* Copyright (C) 1993 Hamish Macdonald
|
||||||
* Copyright (C) 1999 D. Jeff Dionne
|
* Copyright (C) 1999 D. Jeff Dionne
|
||||||
|
@ -10,6 +12,8 @@
|
||||||
* for more details.
|
* for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
#include <linux/config.h>
|
#include <linux/config.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
@ -25,66 +29,25 @@
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include <asm/machdep.h>
|
#include <asm/machdep.h>
|
||||||
#include <asm/MC68VZ328.h>
|
#include <asm/MC68VZ328.h>
|
||||||
|
#include <asm/bootstd.h>
|
||||||
|
|
||||||
#ifdef CONFIG_INIT_LCD
|
#ifdef CONFIG_INIT_LCD
|
||||||
#include "screen.h"
|
#include "bootlogo.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* with a 33.16 MHz clock, this will give usec resolution to the time functions */
|
/***************************************************************************/
|
||||||
#define CLOCK_SOURCE TCTL_CLKSOURCE_SYSCLK
|
|
||||||
#define CLOCK_PRE 7
|
|
||||||
#define TICKS_PER_JIFFY 41450
|
|
||||||
|
|
||||||
static void
|
void m68328_timer_init(irqreturn_t (*timer_routine) (int, void *, struct pt_regs *));
|
||||||
dragen2_sched_init(irqreturn_t (*timer_routine) (int, void *, struct pt_regs *))
|
void m68328_timer_tick(void);
|
||||||
{
|
unsigned long m68328_timer_gettimeoffset(void);
|
||||||
/* disable timer 1 */
|
void m68328_timer_gettod(int *year, int *mon, int *day, int *hour, int *min, int *sec);
|
||||||
TCTL = 0;
|
|
||||||
|
|
||||||
/* set ISR */
|
/***************************************************************************/
|
||||||
if (request_irq(TMR_IRQ_NUM, timer_routine, IRQ_FLG_LOCK, "timer", NULL))
|
/* Init Drangon Engine hardware */
|
||||||
panic("Unable to attach timer interrupt\n");
|
/***************************************************************************/
|
||||||
|
#if defined(CONFIG_DRAGEN2)
|
||||||
|
|
||||||
/* Restart mode, Enable int, Set clock source */
|
static void m68vz328_reset(void)
|
||||||
TCTL = TCTL_OM | TCTL_IRQEN | CLOCK_SOURCE;
|
|
||||||
TPRER = CLOCK_PRE;
|
|
||||||
TCMP = TICKS_PER_JIFFY;
|
|
||||||
|
|
||||||
/* Enable timer 1 */
|
|
||||||
TCTL |= TCTL_TEN;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dragen2_tick(void)
|
|
||||||
{
|
|
||||||
/* Reset Timer1 */
|
|
||||||
TSTAT &= 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned long dragen2_gettimeoffset(void)
|
|
||||||
{
|
|
||||||
unsigned long ticks = TCN, offset = 0;
|
|
||||||
|
|
||||||
/* check for pending interrupt */
|
|
||||||
if (ticks < (TICKS_PER_JIFFY >> 1) && (ISR & (1 << TMR_IRQ_NUM)))
|
|
||||||
offset = 1000000 / HZ;
|
|
||||||
|
|
||||||
ticks = (ticks * 1000000 / HZ) / TICKS_PER_JIFFY;
|
|
||||||
|
|
||||||
return ticks + offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dragen2_gettod(int *year, int *mon, int *day, int *hour,
|
|
||||||
int *min, int *sec)
|
|
||||||
{
|
|
||||||
long now = RTCTIME;
|
|
||||||
|
|
||||||
*year = *mon = *day = 1;
|
|
||||||
*hour = (now >> 24) % 24;
|
|
||||||
*min = (now >> 16) % 60;
|
|
||||||
*sec = now % 60;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dragen2_reset(void)
|
|
||||||
{
|
{
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
|
|
||||||
|
@ -103,7 +66,7 @@ static void dragen2_reset(void)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void init_hardware(void)
|
static void init_hardware(char *command, int size)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_DIRECT_IO_ACCESS
|
#ifdef CONFIG_DIRECT_IO_ACCESS
|
||||||
SCR = 0x10; /* allow user access to internal registers */
|
SCR = 0x10; /* allow user access to internal registers */
|
||||||
|
@ -170,6 +133,60 @@ static void init_hardware(void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
/* Init RT-Control uCdimm hardware */
|
||||||
|
/***************************************************************************/
|
||||||
|
#elif defined(CONFIG_UCDIMM)
|
||||||
|
|
||||||
|
static void m68vz328_reset(void)
|
||||||
|
{
|
||||||
|
local_irq_disable();
|
||||||
|
asm volatile ("
|
||||||
|
moveal #0x10c00000, %a0;
|
||||||
|
moveb #0, 0xFFFFF300;
|
||||||
|
moveal 0(%a0), %sp;
|
||||||
|
moveal 4(%a0), %a0;
|
||||||
|
jmp (%a0);
|
||||||
|
");
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char *cs8900a_hwaddr;
|
||||||
|
static int errno;
|
||||||
|
|
||||||
|
_bsc0(char *, getserialnum)
|
||||||
|
_bsc1(unsigned char *, gethwaddr, int, a)
|
||||||
|
_bsc1(char *, getbenv, char *, a)
|
||||||
|
|
||||||
|
static void init_hardware(char *command, int size)
|
||||||
|
{
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
printk(KERN_INFO "uCdimm serial string [%s]\n", getserialnum());
|
||||||
|
p = cs8900a_hwaddr = gethwaddr(0);
|
||||||
|
printk(KERN_INFO "uCdimm hwaddr %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
|
||||||
|
p[0], p[1], p[2], p[3], p[4], p[5]);
|
||||||
|
p = getbenv("APPEND");
|
||||||
|
if (p)
|
||||||
|
strcpy(p, command);
|
||||||
|
else
|
||||||
|
command[0] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
#else
|
||||||
|
|
||||||
|
static void m68vz328_reset(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void init_hardware(char *command, int size)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
#endif
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
void config_BSP(char *command, int size)
|
void config_BSP(char *command, int size)
|
||||||
{
|
{
|
||||||
printk(KERN_INFO "68VZ328 DragonBallVZ support (c) 2001 Lineo, Inc.\n");
|
printk(KERN_INFO "68VZ328 DragonBallVZ support (c) 2001 Lineo, Inc.\n");
|
||||||
|
@ -181,11 +198,13 @@ void config_BSP(char *command, int size)
|
||||||
memset(command, 0, size);
|
memset(command, 0, size);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
init_hardware();
|
init_hardware(command, size);
|
||||||
|
|
||||||
mach_sched_init = (void *)dragen2_sched_init;
|
mach_sched_init = (void *) m68328_timer_init;
|
||||||
mach_tick = dragen2_tick;
|
mach_tick = m68328_timer_tick;
|
||||||
mach_gettimeoffset = dragen2_gettimeoffset;
|
mach_gettimeoffset = m68328_timer_gettimeoffset;
|
||||||
mach_reset = dragen2_reset;
|
mach_gettod = m68328_timer_gettod;
|
||||||
mach_gettod = dragen2_gettod;
|
mach_reset = m68vz328_reset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***************************************************************************/
|
|
@ -1,117 +0,0 @@
|
||||||
/*
|
|
||||||
* linux/arch/m68knommu/platform/68VZ328/ucdimm/config.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 1993 Hamish Macdonald
|
|
||||||
* Copyright (C) 1999 D. Jeff Dionne
|
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file COPYING in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <linux/config.h>
|
|
||||||
#include <linux/types.h>
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/mm.h>
|
|
||||||
#include <linux/tty.h>
|
|
||||||
#include <linux/console.h>
|
|
||||||
|
|
||||||
#include <asm/setup.h>
|
|
||||||
#include <asm/system.h>
|
|
||||||
#include <asm/pgtable.h>
|
|
||||||
#include <asm/irq.h>
|
|
||||||
#include <asm/machdep.h>
|
|
||||||
#include <asm/MC68VZ328.h>
|
|
||||||
#include <asm/bootstd.h>
|
|
||||||
|
|
||||||
void BSP_sched_init(void (*timer_routine)(int, void *, struct pt_regs *))
|
|
||||||
{
|
|
||||||
/* Restart mode, Enable int, 32KHz, Enable timer */
|
|
||||||
TCTL = TCTL_OM | TCTL_IRQEN | TCTL_CLKSOURCE_32KHZ | TCTL_TEN;
|
|
||||||
/* Set prescaler (Divide 32KHz by 32)*/
|
|
||||||
TPRER = 31;
|
|
||||||
/* Set compare register 32Khz / 32 / 10 = 100 */
|
|
||||||
TCMP = 10;
|
|
||||||
|
|
||||||
request_irq(TMR_IRQ_NUM, timer_routine, IRQ_FLG_LOCK, "timer", NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void BSP_tick(void)
|
|
||||||
{
|
|
||||||
/* Reset Timer1 */
|
|
||||||
TSTAT &= 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long BSP_gettimeoffset (void)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void BSP_gettod (int *yearp, int *monp, int *dayp,
|
|
||||||
int *hourp, int *minp, int *secp)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
int BSP_hwclk(int op, struct hwclk_time *t)
|
|
||||||
{
|
|
||||||
if (!op) {
|
|
||||||
/* read */
|
|
||||||
} else {
|
|
||||||
/* write */
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int BSP_set_clock_mmss (unsigned long nowtime)
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
short real_seconds = nowtime % 60, real_minutes = (nowtime / 60) % 60;
|
|
||||||
|
|
||||||
tod->second1 = real_seconds / 10;
|
|
||||||
tod->second2 = real_seconds % 10;
|
|
||||||
tod->minute1 = real_minutes / 10;
|
|
||||||
tod->minute2 = real_minutes % 10;
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void BSP_reset (void)
|
|
||||||
{
|
|
||||||
local_irq_disable();
|
|
||||||
asm volatile ("
|
|
||||||
moveal #0x10c00000, %a0;
|
|
||||||
moveb #0, 0xFFFFF300;
|
|
||||||
moveal 0(%a0), %sp;
|
|
||||||
moveal 4(%a0), %a0;
|
|
||||||
jmp (%a0);
|
|
||||||
");
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char *cs8900a_hwaddr;
|
|
||||||
static int errno;
|
|
||||||
|
|
||||||
_bsc0(char *, getserialnum)
|
|
||||||
_bsc1(unsigned char *, gethwaddr, int, a)
|
|
||||||
_bsc1(char *, getbenv, char *, a)
|
|
||||||
|
|
||||||
void config_BSP(char *command, int len)
|
|
||||||
{
|
|
||||||
unsigned char *p;
|
|
||||||
|
|
||||||
printk(KERN_INFO "\n68VZ328 DragonBallVZ support (c) 2001 Lineo, Inc.\n");
|
|
||||||
|
|
||||||
printk(KERN_INFO "uCdimm serial string [%s]\n",getserialnum());
|
|
||||||
p = cs8900a_hwaddr = gethwaddr(0);
|
|
||||||
printk(KERN_INFO "uCdimm hwaddr %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
|
|
||||||
p[0], p[1], p[2], p[3], p[4], p[5]);
|
|
||||||
p = getbenv("APPEND");
|
|
||||||
if (p) strcpy(p,command);
|
|
||||||
else command[0] = 0;
|
|
||||||
|
|
||||||
mach_sched_init = BSP_sched_init;
|
|
||||||
mach_tick = BSP_tick;
|
|
||||||
mach_gettimeoffset = BSP_gettimeoffset;
|
|
||||||
mach_gettod = BSP_gettod;
|
|
||||||
mach_reset = BSP_reset;
|
|
||||||
}
|
|
|
@ -80,7 +80,6 @@ fixup_broken_pcnet32(struct pci_dev* dev)
|
||||||
if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) {
|
if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) {
|
||||||
dev->vendor = PCI_VENDOR_ID_AMD;
|
dev->vendor = PCI_VENDOR_ID_AMD;
|
||||||
pci_write_config_word(dev, PCI_VENDOR_ID, PCI_VENDOR_ID_AMD);
|
pci_write_config_word(dev, PCI_VENDOR_ID, PCI_VENDOR_ID_AMD);
|
||||||
pci_name_device(dev);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TRIDENT, PCI_ANY_ID, fixup_broken_pcnet32);
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TRIDENT, PCI_ANY_ID, fixup_broken_pcnet32);
|
||||||
|
|
|
@ -41,10 +41,6 @@
|
||||||
#include <asm/ipc.h>
|
#include <asm/ipc.h>
|
||||||
#include <asm/semaphore.h>
|
#include <asm/semaphore.h>
|
||||||
|
|
||||||
void
|
|
||||||
check_bugs(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* sys_ipc() is the de-multiplexer for the SysV IPC calls..
|
* sys_ipc() is the de-multiplexer for the SysV IPC calls..
|
||||||
|
|
|
@ -140,12 +140,12 @@ struct platform_device ppc_sys_platform_devices[] = {
|
||||||
},
|
},
|
||||||
[MPC10X_UART0] = {
|
[MPC10X_UART0] = {
|
||||||
.name = "serial8250",
|
.name = "serial8250",
|
||||||
.id = 0,
|
.id = PLAT8250_DEV_PLATFORM,
|
||||||
.dev.platform_data = serial_plat_uart0,
|
.dev.platform_data = serial_plat_uart0,
|
||||||
},
|
},
|
||||||
[MPC10X_UART1] = {
|
[MPC10X_UART1] = {
|
||||||
.name = "serial8250",
|
.name = "serial8250",
|
||||||
.id = 1,
|
.id = PLAT8250_DEV_PLATFORM1,
|
||||||
.dev.platform_data = serial_plat_uart1,
|
.dev.platform_data = serial_plat_uart1,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -165,7 +165,7 @@ struct platform_device ppc_sys_platform_devices[] = {
|
||||||
},
|
},
|
||||||
[MPC83xx_DUART] = {
|
[MPC83xx_DUART] = {
|
||||||
.name = "serial8250",
|
.name = "serial8250",
|
||||||
.id = 0,
|
.id = PLAT8250_DEV_PLATFORM,
|
||||||
.dev.platform_data = serial_platform_data,
|
.dev.platform_data = serial_platform_data,
|
||||||
},
|
},
|
||||||
[MPC83xx_SEC2] = {
|
[MPC83xx_SEC2] = {
|
||||||
|
|
|
@ -282,7 +282,7 @@ struct platform_device ppc_sys_platform_devices[] = {
|
||||||
},
|
},
|
||||||
[MPC85xx_DUART] = {
|
[MPC85xx_DUART] = {
|
||||||
.name = "serial8250",
|
.name = "serial8250",
|
||||||
.id = 0,
|
.id = PLAT8250_DEV_PLATFORM,
|
||||||
.dev.platform_data = serial_platform_data,
|
.dev.platform_data = serial_platform_data,
|
||||||
},
|
},
|
||||||
[MPC85xx_PERFMON] = {
|
[MPC85xx_PERFMON] = {
|
||||||
|
|
|
@ -89,11 +89,12 @@ drivers-$(CONFIG_OPROFILE) += arch/ppc64/oprofile/
|
||||||
|
|
||||||
boot := arch/ppc64/boot
|
boot := arch/ppc64/boot
|
||||||
|
|
||||||
boottarget-$(CONFIG_PPC_PSERIES) := zImage zImage.initrd
|
boottargets-$(CONFIG_PPC_PSERIES) += zImage zImage.initrd
|
||||||
boottarget-$(CONFIG_PPC_MAPLE) := zImage zImage.initrd
|
boottargets-$(CONFIG_PPC_PMAC) += zImage.vmode zImage.initrd.vmode
|
||||||
boottarget-$(CONFIG_PPC_ISERIES) := vmlinux.sminitrd vmlinux.initrd vmlinux.sm
|
boottargets-$(CONFIG_PPC_MAPLE) += zImage zImage.initrd
|
||||||
boottarget-$(CONFIG_PPC_BPA) := zImage zImage.initrd
|
boottargets-$(CONFIG_PPC_ISERIES) += vmlinux.sminitrd vmlinux.initrd vmlinux.sm
|
||||||
$(boottarget-y): vmlinux
|
boottargets-$(CONFIG_PPC_BPA) += zImage zImage.initrd
|
||||||
|
$(boottargets-y): vmlinux
|
||||||
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
||||||
|
|
||||||
bootimage-$(CONFIG_PPC_PSERIES) := $(boot)/zImage
|
bootimage-$(CONFIG_PPC_PSERIES) := $(boot)/zImage
|
||||||
|
@ -131,10 +132,12 @@ include3/asm:
|
||||||
$(Q)ln -fsn $(srctree)/include/asm-powerpc include3/asm
|
$(Q)ln -fsn $(srctree)/include/asm-powerpc include3/asm
|
||||||
|
|
||||||
define archhelp
|
define archhelp
|
||||||
echo '* zImage - Compressed kernel image (arch/$(ARCH)/boot/zImage)'
|
echo ' zImage.vmode - Compressed kernel image (arch/$(ARCH)/boot/zImage.vmode)'
|
||||||
echo ' zImage.initrd- Compressed kernel image with initrd attached,'
|
echo ' zImage.initrd.vmode - Compressed kernel image with initrd attached,'
|
||||||
echo ' sourced from arch/$(ARCH)/boot/ramdisk.image.gz'
|
echo ' sourced from arch/$(ARCH)/boot/ramdisk.image.gz'
|
||||||
echo ' (arch/$(ARCH)/boot/zImage.initrd)'
|
echo ' (arch/$(ARCH)/boot/zImage.initrd.vmode)'
|
||||||
|
echo ' zImage - zImage for pSeries machines'
|
||||||
|
echo ' zImage.initrd - zImage with initrd for pSeries machines'
|
||||||
endef
|
endef
|
||||||
|
|
||||||
CLEAN_FILES += include/asm-ppc64/offsets.h
|
CLEAN_FILES += include/asm-ppc64/offsets.h
|
||||||
|
|
|
@ -37,6 +37,9 @@ quiet_cmd_bootcc = BOOTCC $@
|
||||||
quiet_cmd_bootas = BOOTAS $@
|
quiet_cmd_bootas = BOOTAS $@
|
||||||
cmd_bootas = $(CROSS32CC) -Wp,-MD,$(depfile) $(BOOTAFLAGS) -c -o $@ $<
|
cmd_bootas = $(CROSS32CC) -Wp,-MD,$(depfile) $(BOOTAFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
|
quiet_cmd_bootld = BOOTLD $@
|
||||||
|
cmd_bootld = $(CROSS32LD) $(BOOTLFLAGS) -o $@ $(2)
|
||||||
|
|
||||||
$(patsubst %.c,%.o, $(filter %.c, $(src-boot))): %.o: %.c
|
$(patsubst %.c,%.o, $(filter %.c, $(src-boot))): %.o: %.c
|
||||||
$(call if_changed_dep,bootcc)
|
$(call if_changed_dep,bootcc)
|
||||||
$(patsubst %.S,%.o, $(filter %.S, $(src-boot))): %.o: %.S
|
$(patsubst %.S,%.o, $(filter %.S, $(src-boot))): %.o: %.S
|
||||||
|
@ -53,7 +56,7 @@ src-sec = $(foreach section, $(1), $(patsubst %,$(obj)/kernel-%.c, $(section)))
|
||||||
gz-sec = $(foreach section, $(1), $(patsubst %,$(obj)/kernel-%.gz, $(section)))
|
gz-sec = $(foreach section, $(1), $(patsubst %,$(obj)/kernel-%.gz, $(section)))
|
||||||
|
|
||||||
hostprogs-y := addnote addRamDisk
|
hostprogs-y := addnote addRamDisk
|
||||||
targets += zImage zImage.initrd imagesize.c \
|
targets += zImage.vmode zImage.initrd.vmode zImage zImage.initrd imagesize.c \
|
||||||
$(patsubst $(obj)/%,%, $(call obj-sec, $(required) $(initrd))) \
|
$(patsubst $(obj)/%,%, $(call obj-sec, $(required) $(initrd))) \
|
||||||
$(patsubst $(obj)/%,%, $(call src-sec, $(required) $(initrd))) \
|
$(patsubst $(obj)/%,%, $(call src-sec, $(required) $(initrd))) \
|
||||||
$(patsubst $(obj)/%,%, $(call gz-sec, $(required) $(initrd))) \
|
$(patsubst $(obj)/%,%, $(call gz-sec, $(required) $(initrd))) \
|
||||||
|
@ -63,7 +66,7 @@ extra-y := initrd.o
|
||||||
quiet_cmd_ramdisk = RAMDISK $@
|
quiet_cmd_ramdisk = RAMDISK $@
|
||||||
cmd_ramdisk = $(obj)/addRamDisk $(obj)/ramdisk.image.gz $< $@
|
cmd_ramdisk = $(obj)/addRamDisk $(obj)/ramdisk.image.gz $< $@
|
||||||
|
|
||||||
quiet_cmd_stripvm = STRIP $@
|
quiet_cmd_stripvm = STRIP $@
|
||||||
cmd_stripvm = $(STRIP) -s $< -o $@
|
cmd_stripvm = $(STRIP) -s $< -o $@
|
||||||
|
|
||||||
vmlinux.strip: vmlinux FORCE
|
vmlinux.strip: vmlinux FORCE
|
||||||
|
@ -71,12 +74,20 @@ vmlinux.strip: vmlinux FORCE
|
||||||
$(obj)/vmlinux.initrd: vmlinux.strip $(obj)/addRamDisk $(obj)/ramdisk.image.gz FORCE
|
$(obj)/vmlinux.initrd: vmlinux.strip $(obj)/addRamDisk $(obj)/ramdisk.image.gz FORCE
|
||||||
$(call if_changed,ramdisk)
|
$(call if_changed,ramdisk)
|
||||||
|
|
||||||
addsection = $(CROSS32OBJCOPY) $(1) \
|
quiet_cmd_addsection = ADDSEC $@
|
||||||
--add-section=.kernel:$(strip $(patsubst $(obj)/kernel-%.o,%, $(1)))=$(patsubst %.o,%.gz, $(1)) \
|
cmd_addsection = $(CROSS32OBJCOPY) $@ \
|
||||||
--set-section-flags=.kernel:$(strip $(patsubst $(obj)/kernel-%.o,%, $(1)))=$(OBJCOPYFLAGS)
|
--add-section=.kernel:$(strip $(patsubst $(obj)/kernel-%.o,%, $@))=$(patsubst %.o,%.gz, $@) \
|
||||||
|
--set-section-flags=.kernel:$(strip $(patsubst $(obj)/kernel-%.o,%, $@))=$(OBJCOPYFLAGS)
|
||||||
|
|
||||||
quiet_cmd_addnote = ADDNOTE $@
|
quiet_cmd_imagesize = GENSIZE $@
|
||||||
cmd_addnote = $(CROSS32LD) $(BOOTLFLAGS) -o $@ $(obj-boot) && $(obj)/addnote $@
|
cmd_imagesize = ls -l vmlinux.strip | \
|
||||||
|
awk '{printf "/* generated -- do not edit! */\n" "unsigned long vmlinux_filesize = %d;\n", $$5}' \
|
||||||
|
> $(obj)/imagesize.c && \
|
||||||
|
$(CROSS_COMPILE)nm -n vmlinux | tail -n 1 | \
|
||||||
|
awk '{printf "unsigned long vmlinux_memsize = 0x%s;\n", substr($$1,8)}' >> $(obj)/imagesize.c
|
||||||
|
|
||||||
|
quiet_cmd_addnote = ADDNOTE $@
|
||||||
|
cmd_addnote = $(obj)/addnote $@
|
||||||
|
|
||||||
$(call gz-sec, $(required)): $(obj)/kernel-%.gz: % FORCE
|
$(call gz-sec, $(required)): $(obj)/kernel-%.gz: % FORCE
|
||||||
$(call if_changed,gzip)
|
$(call if_changed,gzip)
|
||||||
|
@ -85,28 +96,30 @@ $(obj)/kernel-initrd.gz: $(obj)/ramdisk.image.gz
|
||||||
cp -f $(obj)/ramdisk.image.gz $@
|
cp -f $(obj)/ramdisk.image.gz $@
|
||||||
|
|
||||||
$(call src-sec, $(required) $(initrd)): $(obj)/kernel-%.c: $(obj)/kernel-%.gz FORCE
|
$(call src-sec, $(required) $(initrd)): $(obj)/kernel-%.c: $(obj)/kernel-%.gz FORCE
|
||||||
touch $@
|
@touch $@
|
||||||
|
|
||||||
$(call obj-sec, $(required) $(initrd)): $(obj)/kernel-%.o: $(obj)/kernel-%.c FORCE
|
$(call obj-sec, $(required) $(initrd)): $(obj)/kernel-%.o: $(obj)/kernel-%.c FORCE
|
||||||
$(call if_changed_dep,bootcc)
|
$(call if_changed_dep,bootcc)
|
||||||
$(call addsection, $@)
|
$(call cmd,addsection)
|
||||||
|
|
||||||
$(obj)/zImage: obj-boot += $(call obj-sec, $(required))
|
$(obj)/zImage.vmode: obj-boot += $(call obj-sec, $(required))
|
||||||
$(obj)/zImage: $(call obj-sec, $(required)) $(obj-boot) $(obj)/addnote FORCE
|
$(obj)/zImage.vmode: $(call obj-sec, $(required)) $(obj-boot) FORCE
|
||||||
|
$(call cmd,bootld,$(obj-boot))
|
||||||
|
|
||||||
|
$(obj)/zImage.initrd.vmode: obj-boot += $(call obj-sec, $(required) $(initrd))
|
||||||
|
$(obj)/zImage.initrd.vmode: $(call obj-sec, $(required) $(initrd)) $(obj-boot) FORCE
|
||||||
|
$(call cmd,bootld,$(obj-boot))
|
||||||
|
|
||||||
|
$(obj)/zImage: $(obj)/zImage.vmode $(obj)/addnote FORCE
|
||||||
|
@cp -f $< $@
|
||||||
$(call if_changed,addnote)
|
$(call if_changed,addnote)
|
||||||
|
|
||||||
$(obj)/zImage.initrd: obj-boot += $(call obj-sec, $(required) $(initrd))
|
$(obj)/zImage.initrd: $(obj)/zImage.initrd.vmode $(obj)/addnote FORCE
|
||||||
$(obj)/zImage.initrd: $(call obj-sec, $(required) $(initrd)) $(obj-boot) $(obj)/addnote FORCE
|
@cp -f $< $@
|
||||||
$(call if_changed,addnote)
|
$(call if_changed,addnote)
|
||||||
|
|
||||||
$(obj)/imagesize.c: vmlinux.strip
|
$(obj)/imagesize.c: vmlinux.strip
|
||||||
@echo Generating $@
|
$(call cmd,imagesize)
|
||||||
ls -l vmlinux.strip | \
|
|
||||||
awk '{printf "/* generated -- do not edit! */\n" \
|
|
||||||
"unsigned long vmlinux_filesize = %d;\n", $$5}' > $(obj)/imagesize.c
|
|
||||||
$(CROSS_COMPILE)nm -n vmlinux | tail -n 1 | \
|
|
||||||
awk '{printf "unsigned long vmlinux_memsize = 0x%s;\n", substr($$1,8)}' \
|
|
||||||
>> $(obj)/imagesize.c
|
|
||||||
|
|
||||||
install: $(CONFIGURE) $(BOOTIMAGE)
|
install: $(CONFIGURE) $(BOOTIMAGE)
|
||||||
sh -x $(srctree)/$(src)/install.sh "$(KERNELRELEASE)" vmlinux System.map "$(INSTALL_PATH)" "$(BOOTIMAGE)"
|
sh -x $(srctree)/$(src)/install.sh "$(KERNELRELEASE)" vmlinux System.map "$(INSTALL_PATH)" "$(BOOTIMAGE)"
|
||||||
|
|
|
@ -23,7 +23,8 @@ extern void flush_cache(void *, unsigned long);
|
||||||
|
|
||||||
/* Value picked to match that used by yaboot */
|
/* Value picked to match that used by yaboot */
|
||||||
#define PROG_START 0x01400000
|
#define PROG_START 0x01400000
|
||||||
#define RAM_END (256<<20) // Fixme: use OF */
|
#define RAM_END (512<<20) // Fixme: use OF */
|
||||||
|
#define ONE_MB 0x100000
|
||||||
|
|
||||||
static char *avail_ram;
|
static char *avail_ram;
|
||||||
static char *begin_avail, *end_avail;
|
static char *begin_avail, *end_avail;
|
||||||
|
@ -32,6 +33,7 @@ static unsigned int heap_use;
|
||||||
static unsigned int heap_max;
|
static unsigned int heap_max;
|
||||||
|
|
||||||
extern char _start[];
|
extern char _start[];
|
||||||
|
extern char _end[];
|
||||||
extern char _vmlinux_start[];
|
extern char _vmlinux_start[];
|
||||||
extern char _vmlinux_end[];
|
extern char _vmlinux_end[];
|
||||||
extern char _initrd_start[];
|
extern char _initrd_start[];
|
||||||
|
@ -58,13 +60,13 @@ typedef void (*kernel_entry_t)( unsigned long,
|
||||||
|
|
||||||
#undef DEBUG
|
#undef DEBUG
|
||||||
|
|
||||||
static unsigned long claim_base = PROG_START;
|
static unsigned long claim_base;
|
||||||
|
|
||||||
static unsigned long try_claim(unsigned long size)
|
static unsigned long try_claim(unsigned long size)
|
||||||
{
|
{
|
||||||
unsigned long addr = 0;
|
unsigned long addr = 0;
|
||||||
|
|
||||||
for(; claim_base < RAM_END; claim_base += 0x100000) {
|
for(; claim_base < RAM_END; claim_base += ONE_MB) {
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf(" trying: 0x%08lx\n\r", claim_base);
|
printf(" trying: 0x%08lx\n\r", claim_base);
|
||||||
#endif
|
#endif
|
||||||
|
@ -95,7 +97,26 @@ void start(unsigned long a1, unsigned long a2, void *promptr)
|
||||||
if (getprop(chosen_handle, "stdin", &stdin, sizeof(stdin)) != 4)
|
if (getprop(chosen_handle, "stdin", &stdin, sizeof(stdin)) != 4)
|
||||||
exit();
|
exit();
|
||||||
|
|
||||||
printf("\n\rzImage starting: loaded at 0x%x\n\r", (unsigned)_start);
|
printf("\n\rzImage starting: loaded at 0x%lx\n\r", (unsigned long) _start);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The first available claim_base must be above the end of the
|
||||||
|
* the loaded kernel wrapper file (_start to _end includes the
|
||||||
|
* initrd image if it is present) and rounded up to a nice
|
||||||
|
* 1 MB boundary for good measure.
|
||||||
|
*/
|
||||||
|
|
||||||
|
claim_base = _ALIGN_UP((unsigned long)_end, ONE_MB);
|
||||||
|
|
||||||
|
#if defined(PROG_START)
|
||||||
|
/*
|
||||||
|
* Maintain a "magic" minimum address. This keeps some older
|
||||||
|
* firmware platforms running.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (claim_base < PROG_START)
|
||||||
|
claim_base = PROG_START;
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now we try to claim some memory for the kernel itself
|
* Now we try to claim some memory for the kernel itself
|
||||||
|
@ -105,7 +126,7 @@ void start(unsigned long a1, unsigned long a2, void *promptr)
|
||||||
* size... In practice we add 1Mb, that is enough, but we should really
|
* size... In practice we add 1Mb, that is enough, but we should really
|
||||||
* consider fixing the Makefile to put a _raw_ kernel in there !
|
* consider fixing the Makefile to put a _raw_ kernel in there !
|
||||||
*/
|
*/
|
||||||
vmlinux_memsize += 0x100000;
|
vmlinux_memsize += ONE_MB;
|
||||||
printf("Allocating 0x%lx bytes for kernel ...\n\r", vmlinux_memsize);
|
printf("Allocating 0x%lx bytes for kernel ...\n\r", vmlinux_memsize);
|
||||||
vmlinux.addr = try_claim(vmlinux_memsize);
|
vmlinux.addr = try_claim(vmlinux_memsize);
|
||||||
if (vmlinux.addr == 0) {
|
if (vmlinux.addr == 0) {
|
||||||
|
|
|
@ -205,6 +205,18 @@ static struct iic_regs __iomem *find_iic(int cpu)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
|
|
||||||
|
/* Use the highest interrupt priorities for IPI */
|
||||||
|
static inline int iic_ipi_to_irq(int ipi)
|
||||||
|
{
|
||||||
|
return IIC_IPI_OFFSET + IIC_NUM_IPIS - 1 - ipi;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int iic_irq_to_ipi(int irq)
|
||||||
|
{
|
||||||
|
return IIC_NUM_IPIS - 1 - (irq - IIC_IPI_OFFSET);
|
||||||
|
}
|
||||||
|
|
||||||
void iic_setup_cpu(void)
|
void iic_setup_cpu(void)
|
||||||
{
|
{
|
||||||
out_be64(&__get_cpu_var(iic).regs->prio, 0xff);
|
out_be64(&__get_cpu_var(iic).regs->prio, 0xff);
|
||||||
|
@ -212,18 +224,20 @@ void iic_setup_cpu(void)
|
||||||
|
|
||||||
void iic_cause_IPI(int cpu, int mesg)
|
void iic_cause_IPI(int cpu, int mesg)
|
||||||
{
|
{
|
||||||
out_be64(&per_cpu(iic, cpu).regs->generate, mesg);
|
out_be64(&per_cpu(iic, cpu).regs->generate, (IIC_NUM_IPIS - 1 - mesg) << 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
static irqreturn_t iic_ipi_action(int irq, void *dev_id, struct pt_regs *regs)
|
static irqreturn_t iic_ipi_action(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
smp_message_recv(iic_irq_to_ipi(irq), regs);
|
||||||
smp_message_recv(irq - IIC_IPI_OFFSET, regs);
|
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void iic_request_ipi(int irq, const char *name)
|
static void iic_request_ipi(int ipi, const char *name)
|
||||||
{
|
{
|
||||||
|
int irq;
|
||||||
|
|
||||||
|
irq = iic_ipi_to_irq(ipi);
|
||||||
/* IPIs are marked SA_INTERRUPT as they must run with irqs
|
/* IPIs are marked SA_INTERRUPT as they must run with irqs
|
||||||
* disabled */
|
* disabled */
|
||||||
get_irq_desc(irq)->handler = &iic_pic;
|
get_irq_desc(irq)->handler = &iic_pic;
|
||||||
|
@ -233,10 +247,10 @@ static void iic_request_ipi(int irq, const char *name)
|
||||||
|
|
||||||
void iic_request_IPIs(void)
|
void iic_request_IPIs(void)
|
||||||
{
|
{
|
||||||
iic_request_ipi(IIC_IPI_OFFSET + PPC_MSG_CALL_FUNCTION, "IPI-call");
|
iic_request_ipi(PPC_MSG_CALL_FUNCTION, "IPI-call");
|
||||||
iic_request_ipi(IIC_IPI_OFFSET + PPC_MSG_RESCHEDULE, "IPI-resched");
|
iic_request_ipi(PPC_MSG_RESCHEDULE, "IPI-resched");
|
||||||
#ifdef CONFIG_DEBUGGER
|
#ifdef CONFIG_DEBUGGER
|
||||||
iic_request_ipi(IIC_IPI_OFFSET + PPC_MSG_DEBUGGER_BREAK, "IPI-debug");
|
iic_request_ipi(PPC_MSG_DEBUGGER_BREAK, "IPI-debug");
|
||||||
#endif /* CONFIG_DEBUGGER */
|
#endif /* CONFIG_DEBUGGER */
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_SMP */
|
#endif /* CONFIG_SMP */
|
||||||
|
|
|
@ -202,10 +202,9 @@ static void pci_addr_cache_print(struct pci_io_addr_cache *cache)
|
||||||
while (n) {
|
while (n) {
|
||||||
struct pci_io_addr_range *piar;
|
struct pci_io_addr_range *piar;
|
||||||
piar = rb_entry(n, struct pci_io_addr_range, rb_node);
|
piar = rb_entry(n, struct pci_io_addr_range, rb_node);
|
||||||
printk(KERN_DEBUG "PCI: %s addr range %d [%lx-%lx]: %s %s\n",
|
printk(KERN_DEBUG "PCI: %s addr range %d [%lx-%lx]: %s\n",
|
||||||
(piar->flags & IORESOURCE_IO) ? "i/o" : "mem", cnt,
|
(piar->flags & IORESOURCE_IO) ? "i/o" : "mem", cnt,
|
||||||
piar->addr_lo, piar->addr_hi, pci_name(piar->pcidev),
|
piar->addr_lo, piar->addr_hi, pci_name(piar->pcidev));
|
||||||
pci_pretty_name(piar->pcidev));
|
|
||||||
cnt++;
|
cnt++;
|
||||||
n = rb_next(n);
|
n = rb_next(n);
|
||||||
}
|
}
|
||||||
|
@ -255,22 +254,24 @@ pci_addr_cache_insert(struct pci_dev *dev, unsigned long alo,
|
||||||
static void __pci_addr_cache_insert_device(struct pci_dev *dev)
|
static void __pci_addr_cache_insert_device(struct pci_dev *dev)
|
||||||
{
|
{
|
||||||
struct device_node *dn;
|
struct device_node *dn;
|
||||||
|
struct pci_dn *pdn;
|
||||||
int i;
|
int i;
|
||||||
int inserted = 0;
|
int inserted = 0;
|
||||||
|
|
||||||
dn = pci_device_to_OF_node(dev);
|
dn = pci_device_to_OF_node(dev);
|
||||||
if (!dn) {
|
if (!dn) {
|
||||||
printk(KERN_WARNING "PCI: no pci dn found for dev=%s %s\n",
|
printk(KERN_WARNING "PCI: no pci dn found for dev=%s\n",
|
||||||
pci_name(dev), pci_pretty_name(dev));
|
pci_name(dev));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Skip any devices for which EEH is not enabled. */
|
/* Skip any devices for which EEH is not enabled. */
|
||||||
if (!(dn->eeh_mode & EEH_MODE_SUPPORTED) ||
|
pdn = dn->data;
|
||||||
dn->eeh_mode & EEH_MODE_NOCHECK) {
|
if (!(pdn->eeh_mode & EEH_MODE_SUPPORTED) ||
|
||||||
|
pdn->eeh_mode & EEH_MODE_NOCHECK) {
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printk(KERN_INFO "PCI: skip building address cache for=%s %s\n",
|
printk(KERN_INFO "PCI: skip building address cache for=%s\n",
|
||||||
pci_name(dev), pci_pretty_name(dev));
|
pci_name(dev));
|
||||||
#endif
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -416,6 +417,7 @@ int eeh_unregister_notifier(struct notifier_block *nb)
|
||||||
static int read_slot_reset_state(struct device_node *dn, int rets[])
|
static int read_slot_reset_state(struct device_node *dn, int rets[])
|
||||||
{
|
{
|
||||||
int token, outputs;
|
int token, outputs;
|
||||||
|
struct pci_dn *pdn = dn->data;
|
||||||
|
|
||||||
if (ibm_read_slot_reset_state2 != RTAS_UNKNOWN_SERVICE) {
|
if (ibm_read_slot_reset_state2 != RTAS_UNKNOWN_SERVICE) {
|
||||||
token = ibm_read_slot_reset_state2;
|
token = ibm_read_slot_reset_state2;
|
||||||
|
@ -425,8 +427,8 @@ static int read_slot_reset_state(struct device_node *dn, int rets[])
|
||||||
outputs = 3;
|
outputs = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
return rtas_call(token, 3, outputs, rets, dn->eeh_config_addr,
|
return rtas_call(token, 3, outputs, rets, pdn->eeh_config_addr,
|
||||||
BUID_HI(dn->phb->buid), BUID_LO(dn->phb->buid));
|
BUID_HI(pdn->phb->buid), BUID_LO(pdn->phb->buid));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -447,12 +449,12 @@ static void eeh_panic(struct pci_dev *dev, int reset_state)
|
||||||
* in light of potential corruption, we can use it here.
|
* in light of potential corruption, we can use it here.
|
||||||
*/
|
*/
|
||||||
if (panic_on_oops)
|
if (panic_on_oops)
|
||||||
panic("EEH: MMIO failure (%d) on device:%s %s\n", reset_state,
|
panic("EEH: MMIO failure (%d) on device:%s\n", reset_state,
|
||||||
pci_name(dev), pci_pretty_name(dev));
|
pci_name(dev));
|
||||||
else {
|
else {
|
||||||
__get_cpu_var(ignored_failures)++;
|
__get_cpu_var(ignored_failures)++;
|
||||||
printk(KERN_INFO "EEH: Ignored MMIO failure (%d) on device:%s %s\n",
|
printk(KERN_INFO "EEH: Ignored MMIO failure (%d) on device:%s\n",
|
||||||
reset_state, pci_name(dev), pci_pretty_name(dev));
|
reset_state, pci_name(dev));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -482,8 +484,8 @@ static void eeh_event_handler(void *dummy)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
printk(KERN_INFO "EEH: MMIO failure (%d), notifiying device "
|
printk(KERN_INFO "EEH: MMIO failure (%d), notifiying device "
|
||||||
"%s %s\n", event->reset_state,
|
"%s\n", event->reset_state,
|
||||||
pci_name(event->dev), pci_pretty_name(event->dev));
|
pci_name(event->dev));
|
||||||
|
|
||||||
atomic_set(&eeh_fail_count, 0);
|
atomic_set(&eeh_fail_count, 0);
|
||||||
notifier_call_chain (&eeh_notifier_chain,
|
notifier_call_chain (&eeh_notifier_chain,
|
||||||
|
@ -535,6 +537,7 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev)
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int rc, reset_state;
|
int rc, reset_state;
|
||||||
struct eeh_event *event;
|
struct eeh_event *event;
|
||||||
|
struct pci_dn *pdn;
|
||||||
|
|
||||||
__get_cpu_var(total_mmio_ffs)++;
|
__get_cpu_var(total_mmio_ffs)++;
|
||||||
|
|
||||||
|
@ -543,14 +546,15 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev)
|
||||||
|
|
||||||
if (!dn)
|
if (!dn)
|
||||||
return 0;
|
return 0;
|
||||||
|
pdn = dn->data;
|
||||||
|
|
||||||
/* Access to IO BARs might get this far and still not want checking. */
|
/* Access to IO BARs might get this far and still not want checking. */
|
||||||
if (!(dn->eeh_mode & EEH_MODE_SUPPORTED) ||
|
if (!pdn->eeh_capable || !(pdn->eeh_mode & EEH_MODE_SUPPORTED) ||
|
||||||
dn->eeh_mode & EEH_MODE_NOCHECK) {
|
pdn->eeh_mode & EEH_MODE_NOCHECK) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!dn->eeh_config_addr) {
|
if (!pdn->eeh_config_addr) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -558,7 +562,7 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev)
|
||||||
* If we already have a pending isolation event for this
|
* If we already have a pending isolation event for this
|
||||||
* slot, we know it's bad already, we don't need to check...
|
* slot, we know it's bad already, we don't need to check...
|
||||||
*/
|
*/
|
||||||
if (dn->eeh_mode & EEH_MODE_ISOLATED) {
|
if (pdn->eeh_mode & EEH_MODE_ISOLATED) {
|
||||||
atomic_inc(&eeh_fail_count);
|
atomic_inc(&eeh_fail_count);
|
||||||
if (atomic_read(&eeh_fail_count) >= EEH_MAX_FAILS) {
|
if (atomic_read(&eeh_fail_count) >= EEH_MAX_FAILS) {
|
||||||
/* re-read the slot reset state */
|
/* re-read the slot reset state */
|
||||||
|
@ -583,7 +587,7 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* prevent repeated reports of this failure */
|
/* prevent repeated reports of this failure */
|
||||||
dn->eeh_mode |= EEH_MODE_ISOLATED;
|
pdn->eeh_mode |= EEH_MODE_ISOLATED;
|
||||||
|
|
||||||
reset_state = rets[0];
|
reset_state = rets[0];
|
||||||
|
|
||||||
|
@ -591,9 +595,9 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev)
|
||||||
memset(slot_errbuf, 0, eeh_error_buf_size);
|
memset(slot_errbuf, 0, eeh_error_buf_size);
|
||||||
|
|
||||||
rc = rtas_call(ibm_slot_error_detail,
|
rc = rtas_call(ibm_slot_error_detail,
|
||||||
8, 1, NULL, dn->eeh_config_addr,
|
8, 1, NULL, pdn->eeh_config_addr,
|
||||||
BUID_HI(dn->phb->buid),
|
BUID_HI(pdn->phb->buid),
|
||||||
BUID_LO(dn->phb->buid), NULL, 0,
|
BUID_LO(pdn->phb->buid), NULL, 0,
|
||||||
virt_to_phys(slot_errbuf),
|
virt_to_phys(slot_errbuf),
|
||||||
eeh_error_buf_size,
|
eeh_error_buf_size,
|
||||||
1 /* Temporary Error */);
|
1 /* Temporary Error */);
|
||||||
|
@ -680,8 +684,9 @@ static void *early_enable_eeh(struct device_node *dn, void *data)
|
||||||
u32 *device_id = (u32 *)get_property(dn, "device-id", NULL);
|
u32 *device_id = (u32 *)get_property(dn, "device-id", NULL);
|
||||||
u32 *regs;
|
u32 *regs;
|
||||||
int enable;
|
int enable;
|
||||||
|
struct pci_dn *pdn = dn->data;
|
||||||
|
|
||||||
dn->eeh_mode = 0;
|
pdn->eeh_mode = 0;
|
||||||
|
|
||||||
if (status && strcmp(status, "ok") != 0)
|
if (status && strcmp(status, "ok") != 0)
|
||||||
return NULL; /* ignore devices with bad status */
|
return NULL; /* ignore devices with bad status */
|
||||||
|
@ -692,7 +697,7 @@ static void *early_enable_eeh(struct device_node *dn, void *data)
|
||||||
|
|
||||||
/* There is nothing to check on PCI to ISA bridges */
|
/* There is nothing to check on PCI to ISA bridges */
|
||||||
if (dn->type && !strcmp(dn->type, "isa")) {
|
if (dn->type && !strcmp(dn->type, "isa")) {
|
||||||
dn->eeh_mode |= EEH_MODE_NOCHECK;
|
pdn->eeh_mode |= EEH_MODE_NOCHECK;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -709,7 +714,7 @@ static void *early_enable_eeh(struct device_node *dn, void *data)
|
||||||
enable = 0;
|
enable = 0;
|
||||||
|
|
||||||
if (!enable)
|
if (!enable)
|
||||||
dn->eeh_mode |= EEH_MODE_NOCHECK;
|
pdn->eeh_mode |= EEH_MODE_NOCHECK;
|
||||||
|
|
||||||
/* Ok... see if this device supports EEH. Some do, some don't,
|
/* Ok... see if this device supports EEH. Some do, some don't,
|
||||||
* and the only way to find out is to check each and every one. */
|
* and the only way to find out is to check each and every one. */
|
||||||
|
@ -722,8 +727,8 @@ static void *early_enable_eeh(struct device_node *dn, void *data)
|
||||||
EEH_ENABLE);
|
EEH_ENABLE);
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
eeh_subsystem_enabled = 1;
|
eeh_subsystem_enabled = 1;
|
||||||
dn->eeh_mode |= EEH_MODE_SUPPORTED;
|
pdn->eeh_mode |= EEH_MODE_SUPPORTED;
|
||||||
dn->eeh_config_addr = regs[0];
|
pdn->eeh_config_addr = regs[0];
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printk(KERN_DEBUG "EEH: %s: eeh enabled\n", dn->full_name);
|
printk(KERN_DEBUG "EEH: %s: eeh enabled\n", dn->full_name);
|
||||||
#endif
|
#endif
|
||||||
|
@ -731,10 +736,11 @@ static void *early_enable_eeh(struct device_node *dn, void *data)
|
||||||
|
|
||||||
/* This device doesn't support EEH, but it may have an
|
/* This device doesn't support EEH, but it may have an
|
||||||
* EEH parent, in which case we mark it as supported. */
|
* EEH parent, in which case we mark it as supported. */
|
||||||
if (dn->parent && (dn->parent->eeh_mode & EEH_MODE_SUPPORTED)) {
|
if (dn->parent && dn->parent->data
|
||||||
|
&& (PCI_DN(dn->parent)->eeh_mode & EEH_MODE_SUPPORTED)) {
|
||||||
/* Parent supports EEH. */
|
/* Parent supports EEH. */
|
||||||
dn->eeh_mode |= EEH_MODE_SUPPORTED;
|
pdn->eeh_mode |= EEH_MODE_SUPPORTED;
|
||||||
dn->eeh_config_addr = dn->parent->eeh_config_addr;
|
pdn->eeh_config_addr = PCI_DN(dn->parent)->eeh_config_addr;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -791,11 +797,13 @@ void __init eeh_init(void)
|
||||||
for (phb = of_find_node_by_name(NULL, "pci"); phb;
|
for (phb = of_find_node_by_name(NULL, "pci"); phb;
|
||||||
phb = of_find_node_by_name(phb, "pci")) {
|
phb = of_find_node_by_name(phb, "pci")) {
|
||||||
unsigned long buid;
|
unsigned long buid;
|
||||||
|
struct pci_dn *pci;
|
||||||
|
|
||||||
buid = get_phb_buid(phb);
|
buid = get_phb_buid(phb);
|
||||||
if (buid == 0)
|
if (buid == 0 || phb->data == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
pci = phb->data;
|
||||||
info.buid_lo = BUID_LO(buid);
|
info.buid_lo = BUID_LO(buid);
|
||||||
info.buid_hi = BUID_HI(buid);
|
info.buid_hi = BUID_HI(buid);
|
||||||
traverse_pci_devices(phb, early_enable_eeh, &info);
|
traverse_pci_devices(phb, early_enable_eeh, &info);
|
||||||
|
@ -824,9 +832,9 @@ void eeh_add_device_early(struct device_node *dn)
|
||||||
struct pci_controller *phb;
|
struct pci_controller *phb;
|
||||||
struct eeh_early_enable_info info;
|
struct eeh_early_enable_info info;
|
||||||
|
|
||||||
if (!dn)
|
if (!dn || !dn->data)
|
||||||
return;
|
return;
|
||||||
phb = dn->phb;
|
phb = PCI_DN(dn)->phb;
|
||||||
if (NULL == phb || 0 == phb->buid) {
|
if (NULL == phb || 0 == phb->buid) {
|
||||||
printk(KERN_WARNING "EEH: Expected buid but found none\n");
|
printk(KERN_WARNING "EEH: Expected buid but found none\n");
|
||||||
return;
|
return;
|
||||||
|
@ -851,8 +859,7 @@ void eeh_add_device_late(struct pci_dev *dev)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printk(KERN_DEBUG "EEH: adding device %s %s\n", pci_name(dev),
|
printk(KERN_DEBUG "EEH: adding device %s\n", pci_name(dev));
|
||||||
pci_pretty_name(dev));
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
pci_addr_cache_insert_device (dev);
|
pci_addr_cache_insert_device (dev);
|
||||||
|
@ -873,8 +880,7 @@ void eeh_remove_device(struct pci_dev *dev)
|
||||||
|
|
||||||
/* Unregister the device with the EEH/PCI address search system */
|
/* Unregister the device with the EEH/PCI address search system */
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printk(KERN_DEBUG "EEH: remove device %s %s\n", pci_name(dev),
|
printk(KERN_DEBUG "EEH: remove device %s\n", pci_name(dev));
|
||||||
pci_pretty_name(dev));
|
|
||||||
#endif
|
#endif
|
||||||
pci_addr_cache_remove_device(dev);
|
pci_addr_cache_remove_device(dev);
|
||||||
}
|
}
|
||||||
|
|
|
@ -264,8 +264,5 @@ void __init iSeries_Device_Information(struct pci_dev *PciDev, int count)
|
||||||
printk("%d. PCI: Bus%3d, Device%3d, Vendor %04X Frame%3d, Card %4s ",
|
printk("%d. PCI: Bus%3d, Device%3d, Vendor %04X Frame%3d, Card %4s ",
|
||||||
count, bus, PCI_SLOT(PciDev->devfn), PciDev->vendor,
|
count, bus, PCI_SLOT(PciDev->devfn), PciDev->vendor,
|
||||||
frame, card);
|
frame, card);
|
||||||
if (pci_class_name(PciDev->class >> 8) == 0)
|
printk("0x%04X\n", (int)(PciDev->class >> 8));
|
||||||
printk("0x%04X\n", (int)(PciDev->class >> 8));
|
|
||||||
else
|
|
||||||
printk("%s\n", pci_class_name(PciDev->class >> 8));
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,13 +22,23 @@ unsigned int fastcall ioread16(void __iomem *addr)
|
||||||
{
|
{
|
||||||
return readw(addr);
|
return readw(addr);
|
||||||
}
|
}
|
||||||
|
unsigned int fastcall ioread16be(void __iomem *addr)
|
||||||
|
{
|
||||||
|
return in_be16(addr);
|
||||||
|
}
|
||||||
unsigned int fastcall ioread32(void __iomem *addr)
|
unsigned int fastcall ioread32(void __iomem *addr)
|
||||||
{
|
{
|
||||||
return readl(addr);
|
return readl(addr);
|
||||||
}
|
}
|
||||||
|
unsigned int fastcall ioread32be(void __iomem *addr)
|
||||||
|
{
|
||||||
|
return in_be32(addr);
|
||||||
|
}
|
||||||
EXPORT_SYMBOL(ioread8);
|
EXPORT_SYMBOL(ioread8);
|
||||||
EXPORT_SYMBOL(ioread16);
|
EXPORT_SYMBOL(ioread16);
|
||||||
|
EXPORT_SYMBOL(ioread16be);
|
||||||
EXPORT_SYMBOL(ioread32);
|
EXPORT_SYMBOL(ioread32);
|
||||||
|
EXPORT_SYMBOL(ioread32be);
|
||||||
|
|
||||||
void fastcall iowrite8(u8 val, void __iomem *addr)
|
void fastcall iowrite8(u8 val, void __iomem *addr)
|
||||||
{
|
{
|
||||||
|
@ -38,13 +48,23 @@ void fastcall iowrite16(u16 val, void __iomem *addr)
|
||||||
{
|
{
|
||||||
writew(val, addr);
|
writew(val, addr);
|
||||||
}
|
}
|
||||||
|
void fastcall iowrite16be(u16 val, void __iomem *addr)
|
||||||
|
{
|
||||||
|
out_be16(addr, val);
|
||||||
|
}
|
||||||
void fastcall iowrite32(u32 val, void __iomem *addr)
|
void fastcall iowrite32(u32 val, void __iomem *addr)
|
||||||
{
|
{
|
||||||
writel(val, addr);
|
writel(val, addr);
|
||||||
}
|
}
|
||||||
|
void fastcall iowrite32be(u32 val, void __iomem *addr)
|
||||||
|
{
|
||||||
|
out_be32(addr, val);
|
||||||
|
}
|
||||||
EXPORT_SYMBOL(iowrite8);
|
EXPORT_SYMBOL(iowrite8);
|
||||||
EXPORT_SYMBOL(iowrite16);
|
EXPORT_SYMBOL(iowrite16);
|
||||||
|
EXPORT_SYMBOL(iowrite16be);
|
||||||
EXPORT_SYMBOL(iowrite32);
|
EXPORT_SYMBOL(iowrite32);
|
||||||
|
EXPORT_SYMBOL(iowrite32be);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* These are the "repeat read/write" functions. Note the
|
* These are the "repeat read/write" functions. Note the
|
||||||
|
@ -56,15 +76,15 @@ EXPORT_SYMBOL(iowrite32);
|
||||||
*/
|
*/
|
||||||
void ioread8_rep(void __iomem *addr, void *dst, unsigned long count)
|
void ioread8_rep(void __iomem *addr, void *dst, unsigned long count)
|
||||||
{
|
{
|
||||||
_insb((u8 __force *) addr, dst, count);
|
_insb((u8 __iomem *) addr, dst, count);
|
||||||
}
|
}
|
||||||
void ioread16_rep(void __iomem *addr, void *dst, unsigned long count)
|
void ioread16_rep(void __iomem *addr, void *dst, unsigned long count)
|
||||||
{
|
{
|
||||||
_insw_ns((u16 __force *) addr, dst, count);
|
_insw_ns((u16 __iomem *) addr, dst, count);
|
||||||
}
|
}
|
||||||
void ioread32_rep(void __iomem *addr, void *dst, unsigned long count)
|
void ioread32_rep(void __iomem *addr, void *dst, unsigned long count)
|
||||||
{
|
{
|
||||||
_insl_ns((u32 __force *) addr, dst, count);
|
_insl_ns((u32 __iomem *) addr, dst, count);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ioread8_rep);
|
EXPORT_SYMBOL(ioread8_rep);
|
||||||
EXPORT_SYMBOL(ioread16_rep);
|
EXPORT_SYMBOL(ioread16_rep);
|
||||||
|
@ -72,15 +92,15 @@ EXPORT_SYMBOL(ioread32_rep);
|
||||||
|
|
||||||
void iowrite8_rep(void __iomem *addr, const void *src, unsigned long count)
|
void iowrite8_rep(void __iomem *addr, const void *src, unsigned long count)
|
||||||
{
|
{
|
||||||
_outsb((u8 __force *) addr, src, count);
|
_outsb((u8 __iomem *) addr, src, count);
|
||||||
}
|
}
|
||||||
void iowrite16_rep(void __iomem *addr, const void *src, unsigned long count)
|
void iowrite16_rep(void __iomem *addr, const void *src, unsigned long count)
|
||||||
{
|
{
|
||||||
_outsw_ns((u16 __force *) addr, src, count);
|
_outsw_ns((u16 __iomem *) addr, src, count);
|
||||||
}
|
}
|
||||||
void iowrite32_rep(void __iomem *addr, const void *src, unsigned long count)
|
void iowrite32_rep(void __iomem *addr, const void *src, unsigned long count)
|
||||||
{
|
{
|
||||||
_outsl_ns((u32 __force *) addr, src, count);
|
_outsl_ns((u32 __iomem *) addr, src, count);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(iowrite8_rep);
|
EXPORT_SYMBOL(iowrite8_rep);
|
||||||
EXPORT_SYMBOL(iowrite16_rep);
|
EXPORT_SYMBOL(iowrite16_rep);
|
||||||
|
|
|
@ -438,7 +438,8 @@ struct iommu_table *iommu_init_table(struct iommu_table *tbl)
|
||||||
|
|
||||||
void iommu_free_table(struct device_node *dn)
|
void iommu_free_table(struct device_node *dn)
|
||||||
{
|
{
|
||||||
struct iommu_table *tbl = dn->iommu_table;
|
struct pci_dn *pdn = dn->data;
|
||||||
|
struct iommu_table *tbl = pdn->iommu_table;
|
||||||
unsigned long bitmap_sz, i;
|
unsigned long bitmap_sz, i;
|
||||||
unsigned int order;
|
unsigned int order;
|
||||||
|
|
||||||
|
|
|
@ -447,9 +447,9 @@ void __init maple_pci_init(void)
|
||||||
*/
|
*/
|
||||||
if (u3_agp) {
|
if (u3_agp) {
|
||||||
struct device_node *np = u3_agp->arch_data;
|
struct device_node *np = u3_agp->arch_data;
|
||||||
np->busno = 0xf0;
|
PCI_DN(np)->busno = 0xf0;
|
||||||
for (np = np->child; np; np = np->sibling)
|
for (np = np->child; np; np = np->sibling)
|
||||||
np->busno = 0xf0;
|
PCI_DN(np)->busno = 0xf0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Tell pci.c to use the common resource allocation mecanism */
|
/* Tell pci.c to use the common resource allocation mecanism */
|
||||||
|
|
|
@ -1431,9 +1431,9 @@ _GLOBAL(sys_call_table)
|
||||||
.llong .sys_ni_syscall /* 195 - 32bit only stat64 */
|
.llong .sys_ni_syscall /* 195 - 32bit only stat64 */
|
||||||
.llong .sys_ni_syscall /* 32bit only lstat64 */
|
.llong .sys_ni_syscall /* 32bit only lstat64 */
|
||||||
.llong .sys_ni_syscall /* 32bit only fstat64 */
|
.llong .sys_ni_syscall /* 32bit only fstat64 */
|
||||||
.llong .sys_ni_syscall /* 32bit only pciconfig_read */
|
.llong .sys_pciconfig_read
|
||||||
.llong .sys_ni_syscall /* 32bit only pciconfig_write */
|
.llong .sys_pciconfig_write
|
||||||
.llong .sys_ni_syscall /* 32bit only pciconfig_iobase */
|
.llong .sys_pciconfig_iobase /* 200 - pciconfig_iobase */
|
||||||
.llong .sys_ni_syscall /* reserved for MacOnLinux */
|
.llong .sys_ni_syscall /* reserved for MacOnLinux */
|
||||||
.llong .sys_getdents64
|
.llong .sys_getdents64
|
||||||
.llong .sys_pivot_root
|
.llong .sys_pivot_root
|
||||||
|
|
|
@ -295,7 +295,7 @@ static void iommu_table_setparms_lpar(struct pci_controller *phb,
|
||||||
struct iommu_table *tbl,
|
struct iommu_table *tbl,
|
||||||
unsigned int *dma_window)
|
unsigned int *dma_window)
|
||||||
{
|
{
|
||||||
tbl->it_busno = dn->bussubno;
|
tbl->it_busno = PCI_DN(dn)->bussubno;
|
||||||
|
|
||||||
/* TODO: Parse field size properties properly. */
|
/* TODO: Parse field size properties properly. */
|
||||||
tbl->it_size = (((unsigned long)dma_window[4] << 32) |
|
tbl->it_size = (((unsigned long)dma_window[4] << 32) |
|
||||||
|
@ -311,6 +311,7 @@ static void iommu_table_setparms_lpar(struct pci_controller *phb,
|
||||||
static void iommu_bus_setup_pSeries(struct pci_bus *bus)
|
static void iommu_bus_setup_pSeries(struct pci_bus *bus)
|
||||||
{
|
{
|
||||||
struct device_node *dn, *pdn;
|
struct device_node *dn, *pdn;
|
||||||
|
struct pci_dn *pci;
|
||||||
struct iommu_table *tbl;
|
struct iommu_table *tbl;
|
||||||
|
|
||||||
DBG("iommu_bus_setup_pSeries, bus %p, bus->self %p\n", bus, bus->self);
|
DBG("iommu_bus_setup_pSeries, bus %p, bus->self %p\n", bus, bus->self);
|
||||||
|
@ -325,6 +326,7 @@ static void iommu_bus_setup_pSeries(struct pci_bus *bus)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
dn = pci_bus_to_OF_node(bus);
|
dn = pci_bus_to_OF_node(bus);
|
||||||
|
pci = dn->data;
|
||||||
|
|
||||||
if (!bus->self) {
|
if (!bus->self) {
|
||||||
/* Root bus */
|
/* Root bus */
|
||||||
|
@ -341,18 +343,18 @@ static void iommu_bus_setup_pSeries(struct pci_bus *bus)
|
||||||
* alltogether. This leaves 768MB for the window.
|
* alltogether. This leaves 768MB for the window.
|
||||||
*/
|
*/
|
||||||
DBG("PHB has io-hole, reserving 256MB\n");
|
DBG("PHB has io-hole, reserving 256MB\n");
|
||||||
dn->phb->dma_window_size = 3 << 28;
|
pci->phb->dma_window_size = 3 << 28;
|
||||||
dn->phb->dma_window_base_cur = 1 << 28;
|
pci->phb->dma_window_base_cur = 1 << 28;
|
||||||
} else {
|
} else {
|
||||||
/* 1GB window by default */
|
/* 1GB window by default */
|
||||||
dn->phb->dma_window_size = 1 << 30;
|
pci->phb->dma_window_size = 1 << 30;
|
||||||
dn->phb->dma_window_base_cur = 0;
|
pci->phb->dma_window_base_cur = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
tbl = kmalloc(sizeof(struct iommu_table), GFP_KERNEL);
|
tbl = kmalloc(sizeof(struct iommu_table), GFP_KERNEL);
|
||||||
|
|
||||||
iommu_table_setparms(dn->phb, dn, tbl);
|
iommu_table_setparms(pci->phb, dn, tbl);
|
||||||
dn->iommu_table = iommu_init_table(tbl);
|
pci->iommu_table = iommu_init_table(tbl);
|
||||||
} else {
|
} else {
|
||||||
/* Do a 128MB table at root. This is used for the IDE
|
/* Do a 128MB table at root. This is used for the IDE
|
||||||
* controller on some SMP-mode POWER4 machines. It
|
* controller on some SMP-mode POWER4 machines. It
|
||||||
|
@ -363,16 +365,16 @@ static void iommu_bus_setup_pSeries(struct pci_bus *bus)
|
||||||
* Allocate at offset 128MB to avoid having to deal
|
* Allocate at offset 128MB to avoid having to deal
|
||||||
* with ISA holes; 128MB table for IDE is plenty.
|
* with ISA holes; 128MB table for IDE is plenty.
|
||||||
*/
|
*/
|
||||||
dn->phb->dma_window_size = 1 << 27;
|
pci->phb->dma_window_size = 1 << 27;
|
||||||
dn->phb->dma_window_base_cur = 1 << 27;
|
pci->phb->dma_window_base_cur = 1 << 27;
|
||||||
|
|
||||||
tbl = kmalloc(sizeof(struct iommu_table), GFP_KERNEL);
|
tbl = kmalloc(sizeof(struct iommu_table), GFP_KERNEL);
|
||||||
|
|
||||||
iommu_table_setparms(dn->phb, dn, tbl);
|
iommu_table_setparms(pci->phb, dn, tbl);
|
||||||
dn->iommu_table = iommu_init_table(tbl);
|
pci->iommu_table = iommu_init_table(tbl);
|
||||||
|
|
||||||
/* All child buses have 256MB tables */
|
/* All child buses have 256MB tables */
|
||||||
dn->phb->dma_window_size = 1 << 28;
|
pci->phb->dma_window_size = 1 << 28;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
pdn = pci_bus_to_OF_node(bus->parent);
|
pdn = pci_bus_to_OF_node(bus->parent);
|
||||||
|
@ -386,12 +388,12 @@ static void iommu_bus_setup_pSeries(struct pci_bus *bus)
|
||||||
|
|
||||||
tbl = kmalloc(sizeof(struct iommu_table), GFP_KERNEL);
|
tbl = kmalloc(sizeof(struct iommu_table), GFP_KERNEL);
|
||||||
|
|
||||||
iommu_table_setparms(dn->phb, dn, tbl);
|
iommu_table_setparms(pci->phb, dn, tbl);
|
||||||
|
|
||||||
dn->iommu_table = iommu_init_table(tbl);
|
pci->iommu_table = iommu_init_table(tbl);
|
||||||
} else {
|
} else {
|
||||||
/* Lower than first child or under python, use parent table */
|
/* Lower than first child or under python, use parent table */
|
||||||
dn->iommu_table = pdn->iommu_table;
|
pci->iommu_table = PCI_DN(pdn)->iommu_table;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -401,6 +403,7 @@ static void iommu_bus_setup_pSeriesLP(struct pci_bus *bus)
|
||||||
{
|
{
|
||||||
struct iommu_table *tbl;
|
struct iommu_table *tbl;
|
||||||
struct device_node *dn, *pdn;
|
struct device_node *dn, *pdn;
|
||||||
|
struct pci_dn *ppci;
|
||||||
unsigned int *dma_window = NULL;
|
unsigned int *dma_window = NULL;
|
||||||
|
|
||||||
DBG("iommu_bus_setup_pSeriesLP, bus %p, bus->self %p\n", bus, bus->self);
|
DBG("iommu_bus_setup_pSeriesLP, bus %p, bus->self %p\n", bus, bus->self);
|
||||||
|
@ -419,22 +422,24 @@ static void iommu_bus_setup_pSeriesLP(struct pci_bus *bus)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!pdn->iommu_table) {
|
ppci = pdn->data;
|
||||||
|
if (!ppci->iommu_table) {
|
||||||
/* Bussubno hasn't been copied yet.
|
/* Bussubno hasn't been copied yet.
|
||||||
* Do it now because iommu_table_setparms_lpar needs it.
|
* Do it now because iommu_table_setparms_lpar needs it.
|
||||||
*/
|
*/
|
||||||
pdn->bussubno = bus->number;
|
|
||||||
|
ppci->bussubno = bus->number;
|
||||||
|
|
||||||
tbl = (struct iommu_table *)kmalloc(sizeof(struct iommu_table),
|
tbl = (struct iommu_table *)kmalloc(sizeof(struct iommu_table),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
|
|
||||||
iommu_table_setparms_lpar(pdn->phb, pdn, tbl, dma_window);
|
iommu_table_setparms_lpar(ppci->phb, pdn, tbl, dma_window);
|
||||||
|
|
||||||
pdn->iommu_table = iommu_init_table(tbl);
|
ppci->iommu_table = iommu_init_table(tbl);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pdn != dn)
|
if (pdn != dn)
|
||||||
dn->iommu_table = pdn->iommu_table;
|
PCI_DN(dn)->iommu_table = ppci->iommu_table;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -449,11 +454,11 @@ static void iommu_dev_setup_pSeries(struct pci_dev *dev)
|
||||||
*/
|
*/
|
||||||
mydn = dn = pci_device_to_OF_node(dev);
|
mydn = dn = pci_device_to_OF_node(dev);
|
||||||
|
|
||||||
while (dn && dn->iommu_table == NULL)
|
while (dn && dn->data && PCI_DN(dn)->iommu_table == NULL)
|
||||||
dn = dn->parent;
|
dn = dn->parent;
|
||||||
|
|
||||||
if (dn) {
|
if (dn && dn->data) {
|
||||||
mydn->iommu_table = dn->iommu_table;
|
PCI_DN(mydn)->iommu_table = PCI_DN(dn)->iommu_table;
|
||||||
} else {
|
} else {
|
||||||
DBG("iommu_dev_setup_pSeries, dev %p (%s) has no iommu table\n", dev, dev->pretty_name);
|
DBG("iommu_dev_setup_pSeries, dev %p (%s) has no iommu table\n", dev, dev->pretty_name);
|
||||||
}
|
}
|
||||||
|
@ -463,10 +468,11 @@ static int iommu_reconfig_notifier(struct notifier_block *nb, unsigned long acti
|
||||||
{
|
{
|
||||||
int err = NOTIFY_OK;
|
int err = NOTIFY_OK;
|
||||||
struct device_node *np = node;
|
struct device_node *np = node;
|
||||||
|
struct pci_dn *pci = np->data;
|
||||||
|
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case PSERIES_RECONFIG_REMOVE:
|
case PSERIES_RECONFIG_REMOVE:
|
||||||
if (np->iommu_table &&
|
if (pci->iommu_table &&
|
||||||
get_property(np, "ibm,dma-window", NULL))
|
get_property(np, "ibm,dma-window", NULL))
|
||||||
iommu_free_table(np);
|
iommu_free_table(np);
|
||||||
break;
|
break;
|
||||||
|
@ -486,6 +492,7 @@ static void iommu_dev_setup_pSeriesLP(struct pci_dev *dev)
|
||||||
struct device_node *pdn, *dn;
|
struct device_node *pdn, *dn;
|
||||||
struct iommu_table *tbl;
|
struct iommu_table *tbl;
|
||||||
int *dma_window = NULL;
|
int *dma_window = NULL;
|
||||||
|
struct pci_dn *pci;
|
||||||
|
|
||||||
DBG("iommu_dev_setup_pSeriesLP, dev %p (%s)\n", dev, dev->pretty_name);
|
DBG("iommu_dev_setup_pSeriesLP, dev %p (%s)\n", dev, dev->pretty_name);
|
||||||
|
|
||||||
|
@ -497,8 +504,10 @@ static void iommu_dev_setup_pSeriesLP(struct pci_dev *dev)
|
||||||
*/
|
*/
|
||||||
dn = pci_device_to_OF_node(dev);
|
dn = pci_device_to_OF_node(dev);
|
||||||
|
|
||||||
for (pdn = dn; pdn && !pdn->iommu_table; pdn = pdn->parent) {
|
for (pdn = dn; pdn && pdn->data && !PCI_DN(pdn)->iommu_table;
|
||||||
dma_window = (unsigned int *)get_property(pdn, "ibm,dma-window", NULL);
|
pdn = pdn->parent) {
|
||||||
|
dma_window = (unsigned int *)
|
||||||
|
get_property(pdn, "ibm,dma-window", NULL);
|
||||||
if (dma_window)
|
if (dma_window)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -515,20 +524,21 @@ static void iommu_dev_setup_pSeriesLP(struct pci_dev *dev)
|
||||||
DBG("Found DMA window, allocating table\n");
|
DBG("Found DMA window, allocating table\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!pdn->iommu_table) {
|
pci = pdn->data;
|
||||||
|
if (!pci->iommu_table) {
|
||||||
/* iommu_table_setparms_lpar needs bussubno. */
|
/* iommu_table_setparms_lpar needs bussubno. */
|
||||||
pdn->bussubno = pdn->phb->bus->number;
|
pci->bussubno = pci->phb->bus->number;
|
||||||
|
|
||||||
tbl = (struct iommu_table *)kmalloc(sizeof(struct iommu_table),
|
tbl = (struct iommu_table *)kmalloc(sizeof(struct iommu_table),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
|
|
||||||
iommu_table_setparms_lpar(pdn->phb, pdn, tbl, dma_window);
|
iommu_table_setparms_lpar(pci->phb, pdn, tbl, dma_window);
|
||||||
|
|
||||||
pdn->iommu_table = iommu_init_table(tbl);
|
pci->iommu_table = iommu_init_table(tbl);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pdn != dn)
|
if (pdn != dn)
|
||||||
dn->iommu_table = pdn->iommu_table;
|
PCI_DN(dn)->iommu_table = pci->iommu_table;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void iommu_bus_setup_null(struct pci_bus *b) { }
|
static void iommu_bus_setup_null(struct pci_bus *b) { }
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#include <linux/bootmem.h>
|
#include <linux/bootmem.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
|
#include <linux/syscalls.h>
|
||||||
|
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
|
@ -84,7 +85,6 @@ static void fixup_broken_pcnet32(struct pci_dev* dev)
|
||||||
if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) {
|
if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) {
|
||||||
dev->vendor = PCI_VENDOR_ID_AMD;
|
dev->vendor = PCI_VENDOR_ID_AMD;
|
||||||
pci_write_config_word(dev, PCI_VENDOR_ID, PCI_VENDOR_ID_AMD);
|
pci_write_config_word(dev, PCI_VENDOR_ID, PCI_VENDOR_ID_AMD);
|
||||||
pci_name_device(dev);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TRIDENT, PCI_ANY_ID, fixup_broken_pcnet32);
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TRIDENT, PCI_ANY_ID, fixup_broken_pcnet32);
|
||||||
|
@ -838,9 +838,11 @@ int pcibios_scan_all_fns(struct pci_bus *bus, int devfn)
|
||||||
* device tree. If they are then we need to scan all the
|
* device tree. If they are then we need to scan all the
|
||||||
* functions of this slot.
|
* functions of this slot.
|
||||||
*/
|
*/
|
||||||
for (dn = busdn->child; dn; dn = dn->sibling)
|
for (dn = busdn->child; dn; dn = dn->sibling) {
|
||||||
if ((dn->devfn >> 3) == (devfn >> 3))
|
struct pci_dn *pdn = dn->data;
|
||||||
|
if (pdn && (pdn->devfn >> 3) == (devfn >> 3))
|
||||||
return 1;
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -983,3 +985,62 @@ void pci_resource_to_user(const struct pci_dev *dev, int bar,
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_PPC_MULTIPLATFORM */
|
#endif /* CONFIG_PPC_MULTIPLATFORM */
|
||||||
|
|
||||||
|
|
||||||
|
#define IOBASE_BRIDGE_NUMBER 0
|
||||||
|
#define IOBASE_MEMORY 1
|
||||||
|
#define IOBASE_IO 2
|
||||||
|
#define IOBASE_ISA_IO 3
|
||||||
|
#define IOBASE_ISA_MEM 4
|
||||||
|
|
||||||
|
long sys_pciconfig_iobase(long which, unsigned long in_bus,
|
||||||
|
unsigned long in_devfn)
|
||||||
|
{
|
||||||
|
struct pci_controller* hose;
|
||||||
|
struct list_head *ln;
|
||||||
|
struct pci_bus *bus = NULL;
|
||||||
|
struct device_node *hose_node;
|
||||||
|
|
||||||
|
/* Argh ! Please forgive me for that hack, but that's the
|
||||||
|
* simplest way to get existing XFree to not lockup on some
|
||||||
|
* G5 machines... So when something asks for bus 0 io base
|
||||||
|
* (bus 0 is HT root), we return the AGP one instead.
|
||||||
|
*/
|
||||||
|
#ifdef CONFIG_PPC_PMAC
|
||||||
|
if (systemcfg->platform == PLATFORM_POWERMAC &&
|
||||||
|
machine_is_compatible("MacRISC4"))
|
||||||
|
if (in_bus == 0)
|
||||||
|
in_bus = 0xf0;
|
||||||
|
#endif /* CONFIG_PPC_PMAC */
|
||||||
|
|
||||||
|
/* That syscall isn't quite compatible with PCI domains, but it's
|
||||||
|
* used on pre-domains setup. We return the first match
|
||||||
|
*/
|
||||||
|
|
||||||
|
for (ln = pci_root_buses.next; ln != &pci_root_buses; ln = ln->next) {
|
||||||
|
bus = pci_bus_b(ln);
|
||||||
|
if (in_bus >= bus->number && in_bus < (bus->number + bus->subordinate))
|
||||||
|
break;
|
||||||
|
bus = NULL;
|
||||||
|
}
|
||||||
|
if (bus == NULL || bus->sysdata == NULL)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
hose_node = (struct device_node *)bus->sysdata;
|
||||||
|
hose = PCI_DN(hose_node)->phb;
|
||||||
|
|
||||||
|
switch (which) {
|
||||||
|
case IOBASE_BRIDGE_NUMBER:
|
||||||
|
return (long)hose->first_busno;
|
||||||
|
case IOBASE_MEMORY:
|
||||||
|
return (long)hose->pci_mem_offset;
|
||||||
|
case IOBASE_IO:
|
||||||
|
return (long)hose->io_base_phys;
|
||||||
|
case IOBASE_ISA_IO:
|
||||||
|
return (long)isa_io_base;
|
||||||
|
case IOBASE_ISA_MEM:
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
|
|
@ -34,7 +34,6 @@ void *traverse_pci_devices(struct device_node *start, traverse_func pre,
|
||||||
|
|
||||||
void pci_devs_phb_init(void);
|
void pci_devs_phb_init(void);
|
||||||
void pci_devs_phb_init_dynamic(struct pci_controller *phb);
|
void pci_devs_phb_init_dynamic(struct pci_controller *phb);
|
||||||
struct device_node *fetch_dev_dn(struct pci_dev *dev);
|
|
||||||
|
|
||||||
/* PCI address cache management routines */
|
/* PCI address cache management routines */
|
||||||
void pci_addr_cache_insert_device(struct pci_dev *dev);
|
void pci_addr_cache_insert_device(struct pci_dev *dev);
|
||||||
|
|
|
@ -23,6 +23,8 @@
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
|
#include <linux/bootmem.h>
|
||||||
|
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/prom.h>
|
#include <asm/prom.h>
|
||||||
|
@ -40,16 +42,26 @@ static void * __devinit update_dn_pci_info(struct device_node *dn, void *data)
|
||||||
struct pci_controller *phb = data;
|
struct pci_controller *phb = data;
|
||||||
int *type = (int *)get_property(dn, "ibm,pci-config-space-type", NULL);
|
int *type = (int *)get_property(dn, "ibm,pci-config-space-type", NULL);
|
||||||
u32 *regs;
|
u32 *regs;
|
||||||
|
struct pci_dn *pdn;
|
||||||
|
|
||||||
dn->phb = phb;
|
if (phb->is_dynamic)
|
||||||
|
pdn = kmalloc(sizeof(*pdn), GFP_KERNEL);
|
||||||
|
else
|
||||||
|
pdn = alloc_bootmem(sizeof(*pdn));
|
||||||
|
if (pdn == NULL)
|
||||||
|
return NULL;
|
||||||
|
memset(pdn, 0, sizeof(*pdn));
|
||||||
|
dn->data = pdn;
|
||||||
|
pdn->node = dn;
|
||||||
|
pdn->phb = phb;
|
||||||
regs = (u32 *)get_property(dn, "reg", NULL);
|
regs = (u32 *)get_property(dn, "reg", NULL);
|
||||||
if (regs) {
|
if (regs) {
|
||||||
/* First register entry is addr (00BBSS00) */
|
/* First register entry is addr (00BBSS00) */
|
||||||
dn->busno = (regs[0] >> 16) & 0xff;
|
pdn->busno = (regs[0] >> 16) & 0xff;
|
||||||
dn->devfn = (regs[0] >> 8) & 0xff;
|
pdn->devfn = (regs[0] >> 8) & 0xff;
|
||||||
}
|
}
|
||||||
|
|
||||||
dn->pci_ext_config_space = (type && *type == 1);
|
pdn->pci_ext_config_space = (type && *type == 1);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,10 +124,15 @@ void *traverse_pci_devices(struct device_node *start, traverse_func pre,
|
||||||
void __devinit pci_devs_phb_init_dynamic(struct pci_controller *phb)
|
void __devinit pci_devs_phb_init_dynamic(struct pci_controller *phb)
|
||||||
{
|
{
|
||||||
struct device_node * dn = (struct device_node *) phb->arch_data;
|
struct device_node * dn = (struct device_node *) phb->arch_data;
|
||||||
|
struct pci_dn *pdn;
|
||||||
|
|
||||||
/* PHB nodes themselves must not match */
|
/* PHB nodes themselves must not match */
|
||||||
dn->devfn = dn->busno = -1;
|
update_dn_pci_info(dn, phb);
|
||||||
dn->phb = phb;
|
pdn = dn->data;
|
||||||
|
if (pdn) {
|
||||||
|
pdn->devfn = pdn->busno = -1;
|
||||||
|
pdn->phb = phb;
|
||||||
|
}
|
||||||
|
|
||||||
/* Update dn->phb ptrs for new phb and children devices */
|
/* Update dn->phb ptrs for new phb and children devices */
|
||||||
traverse_pci_devices(dn, update_dn_pci_info, phb);
|
traverse_pci_devices(dn, update_dn_pci_info, phb);
|
||||||
|
@ -123,14 +140,17 @@ void __devinit pci_devs_phb_init_dynamic(struct pci_controller *phb)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Traversal func that looks for a <busno,devfcn> value.
|
* Traversal func that looks for a <busno,devfcn> value.
|
||||||
* If found, the device_node is returned (thus terminating the traversal).
|
* If found, the pci_dn is returned (thus terminating the traversal).
|
||||||
*/
|
*/
|
||||||
static void *is_devfn_node(struct device_node *dn, void *data)
|
static void *is_devfn_node(struct device_node *dn, void *data)
|
||||||
{
|
{
|
||||||
int busno = ((unsigned long)data >> 8) & 0xff;
|
int busno = ((unsigned long)data >> 8) & 0xff;
|
||||||
int devfn = ((unsigned long)data) & 0xff;
|
int devfn = ((unsigned long)data) & 0xff;
|
||||||
|
struct pci_dn *pci = dn->data;
|
||||||
|
|
||||||
return ((devfn == dn->devfn) && (busno == dn->busno)) ? dn : NULL;
|
if (pci && (devfn == pci->devfn) && (busno == pci->busno))
|
||||||
|
return dn;
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -149,13 +169,10 @@ static void *is_devfn_node(struct device_node *dn, void *data)
|
||||||
struct device_node *fetch_dev_dn(struct pci_dev *dev)
|
struct device_node *fetch_dev_dn(struct pci_dev *dev)
|
||||||
{
|
{
|
||||||
struct device_node *orig_dn = dev->sysdata;
|
struct device_node *orig_dn = dev->sysdata;
|
||||||
struct pci_controller *phb = orig_dn->phb; /* assume same phb as orig_dn */
|
|
||||||
struct device_node *phb_dn;
|
|
||||||
struct device_node *dn;
|
struct device_node *dn;
|
||||||
unsigned long searchval = (dev->bus->number << 8) | dev->devfn;
|
unsigned long searchval = (dev->bus->number << 8) | dev->devfn;
|
||||||
|
|
||||||
phb_dn = phb->arch_data;
|
dn = traverse_pci_devices(orig_dn, is_devfn_node, (void *)searchval);
|
||||||
dn = traverse_pci_devices(phb_dn, is_devfn_node, (void *)searchval);
|
|
||||||
if (dn)
|
if (dn)
|
||||||
dev->sysdata = dn;
|
dev->sysdata = dn;
|
||||||
return dn;
|
return dn;
|
||||||
|
@ -165,11 +182,13 @@ EXPORT_SYMBOL(fetch_dev_dn);
|
||||||
static int pci_dn_reconfig_notifier(struct notifier_block *nb, unsigned long action, void *node)
|
static int pci_dn_reconfig_notifier(struct notifier_block *nb, unsigned long action, void *node)
|
||||||
{
|
{
|
||||||
struct device_node *np = node;
|
struct device_node *np = node;
|
||||||
|
struct pci_dn *pci;
|
||||||
int err = NOTIFY_OK;
|
int err = NOTIFY_OK;
|
||||||
|
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case PSERIES_RECONFIG_ADD:
|
case PSERIES_RECONFIG_ADD:
|
||||||
update_dn_pci_info(np, np->parent->phb);
|
pci = np->parent->data;
|
||||||
|
update_dn_pci_info(np, pci->phb);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
err = NOTIFY_DONE;
|
err = NOTIFY_DONE;
|
||||||
|
|
|
@ -66,7 +66,7 @@ static inline struct iommu_table *devnode_table(struct device *dev)
|
||||||
#endif /* CONFIG_PPC_ISERIES */
|
#endif /* CONFIG_PPC_ISERIES */
|
||||||
|
|
||||||
#ifdef CONFIG_PPC_MULTIPLATFORM
|
#ifdef CONFIG_PPC_MULTIPLATFORM
|
||||||
return PCI_GET_DN(pdev)->iommu_table;
|
return PCI_DN(PCI_GET_DN(pdev))->iommu_table;
|
||||||
#endif /* CONFIG_PPC_MULTIPLATFORM */
|
#endif /* CONFIG_PPC_MULTIPLATFORM */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -674,6 +674,7 @@ void __init pmac_check_ht_link(void)
|
||||||
#if 0 /* Disabled for now */
|
#if 0 /* Disabled for now */
|
||||||
u32 ufreq, freq, ucfg, cfg;
|
u32 ufreq, freq, ucfg, cfg;
|
||||||
struct device_node *pcix_node;
|
struct device_node *pcix_node;
|
||||||
|
struct pci_dn *pdn;
|
||||||
u8 px_bus, px_devfn;
|
u8 px_bus, px_devfn;
|
||||||
struct pci_controller *px_hose;
|
struct pci_controller *px_hose;
|
||||||
|
|
||||||
|
@ -687,9 +688,10 @@ void __init pmac_check_ht_link(void)
|
||||||
printk("No PCI-X bridge found\n");
|
printk("No PCI-X bridge found\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
px_hose = pcix_node->phb;
|
pdn = pcix_node->data;
|
||||||
px_bus = pcix_node->busno;
|
px_hose = pdn->phb;
|
||||||
px_devfn = pcix_node->devfn;
|
px_bus = pdn->busno;
|
||||||
|
px_devfn = pdn->devfn;
|
||||||
|
|
||||||
early_read_config_dword(px_hose, px_bus, px_devfn, 0xc4, &cfg);
|
early_read_config_dword(px_hose, px_bus, px_devfn, 0xc4, &cfg);
|
||||||
early_read_config_dword(px_hose, px_bus, px_devfn, 0xcc, &freq);
|
early_read_config_dword(px_hose, px_bus, px_devfn, 0xcc, &freq);
|
||||||
|
|
|
@ -242,7 +242,7 @@ static int u3_ht_skip_device(struct pci_controller *hose,
|
||||||
else
|
else
|
||||||
busdn = hose->arch_data;
|
busdn = hose->arch_data;
|
||||||
for (dn = busdn->child; dn; dn = dn->sibling)
|
for (dn = busdn->child; dn; dn = dn->sibling)
|
||||||
if (dn->devfn == devfn)
|
if (dn->data && PCI_DN(dn)->devfn == devfn)
|
||||||
break;
|
break;
|
||||||
if (dn == NULL)
|
if (dn == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -746,9 +746,9 @@ void __init pmac_pci_init(void)
|
||||||
*/
|
*/
|
||||||
if (u3_agp) {
|
if (u3_agp) {
|
||||||
struct device_node *np = u3_agp->arch_data;
|
struct device_node *np = u3_agp->arch_data;
|
||||||
np->busno = 0xf0;
|
PCI_DN(np)->busno = 0xf0;
|
||||||
for (np = np->child; np; np = np->sibling)
|
for (np = np->child; np; np = np->sibling)
|
||||||
np->busno = 0xf0;
|
PCI_DN(np)->busno = 0xf0;
|
||||||
}
|
}
|
||||||
|
|
||||||
pmac_check_ht_link();
|
pmac_check_ht_link();
|
||||||
|
|
|
@ -1733,6 +1733,7 @@ static void of_node_release(struct kref *kref)
|
||||||
kfree(node->intrs);
|
kfree(node->intrs);
|
||||||
kfree(node->addrs);
|
kfree(node->addrs);
|
||||||
kfree(node->full_name);
|
kfree(node->full_name);
|
||||||
|
kfree(node->data);
|
||||||
kfree(node);
|
kfree(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,7 @@ static int write_pci_config;
|
||||||
static int ibm_read_pci_config;
|
static int ibm_read_pci_config;
|
||||||
static int ibm_write_pci_config;
|
static int ibm_write_pci_config;
|
||||||
|
|
||||||
static int config_access_valid(struct device_node *dn, int where)
|
static int config_access_valid(struct pci_dn *dn, int where)
|
||||||
{
|
{
|
||||||
if (where < 256)
|
if (where < 256)
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -78,15 +78,17 @@ static int rtas_read_config(struct device_node *dn, int where, int size, u32 *va
|
||||||
int returnval = -1;
|
int returnval = -1;
|
||||||
unsigned long buid, addr;
|
unsigned long buid, addr;
|
||||||
int ret;
|
int ret;
|
||||||
|
struct pci_dn *pdn;
|
||||||
|
|
||||||
if (!dn)
|
if (!dn || !dn->data)
|
||||||
return PCIBIOS_DEVICE_NOT_FOUND;
|
return PCIBIOS_DEVICE_NOT_FOUND;
|
||||||
if (!config_access_valid(dn, where))
|
pdn = dn->data;
|
||||||
|
if (!config_access_valid(pdn, where))
|
||||||
return PCIBIOS_BAD_REGISTER_NUMBER;
|
return PCIBIOS_BAD_REGISTER_NUMBER;
|
||||||
|
|
||||||
addr = ((where & 0xf00) << 20) | (dn->busno << 16) |
|
addr = ((where & 0xf00) << 20) | (pdn->busno << 16) |
|
||||||
(dn->devfn << 8) | (where & 0xff);
|
(pdn->devfn << 8) | (where & 0xff);
|
||||||
buid = dn->phb->buid;
|
buid = pdn->phb->buid;
|
||||||
if (buid) {
|
if (buid) {
|
||||||
ret = rtas_call(ibm_read_pci_config, 4, 2, &returnval,
|
ret = rtas_call(ibm_read_pci_config, 4, 2, &returnval,
|
||||||
addr, buid >> 32, buid & 0xffffffff, size);
|
addr, buid >> 32, buid & 0xffffffff, size);
|
||||||
|
@ -98,8 +100,8 @@ static int rtas_read_config(struct device_node *dn, int where, int size, u32 *va
|
||||||
if (ret)
|
if (ret)
|
||||||
return PCIBIOS_DEVICE_NOT_FOUND;
|
return PCIBIOS_DEVICE_NOT_FOUND;
|
||||||
|
|
||||||
if (returnval == EEH_IO_ERROR_VALUE(size)
|
if (returnval == EEH_IO_ERROR_VALUE(size) &&
|
||||||
&& eeh_dn_check_failure (dn, NULL))
|
eeh_dn_check_failure (dn, NULL))
|
||||||
return PCIBIOS_DEVICE_NOT_FOUND;
|
return PCIBIOS_DEVICE_NOT_FOUND;
|
||||||
|
|
||||||
return PCIBIOS_SUCCESSFUL;
|
return PCIBIOS_SUCCESSFUL;
|
||||||
|
@ -118,24 +120,28 @@ static int rtas_pci_read_config(struct pci_bus *bus,
|
||||||
|
|
||||||
/* Search only direct children of the bus */
|
/* Search only direct children of the bus */
|
||||||
for (dn = busdn->child; dn; dn = dn->sibling)
|
for (dn = busdn->child; dn; dn = dn->sibling)
|
||||||
if (dn->devfn == devfn && of_device_available(dn))
|
if (dn->data && PCI_DN(dn)->devfn == devfn
|
||||||
|
&& of_device_available(dn))
|
||||||
return rtas_read_config(dn, where, size, val);
|
return rtas_read_config(dn, where, size, val);
|
||||||
|
|
||||||
return PCIBIOS_DEVICE_NOT_FOUND;
|
return PCIBIOS_DEVICE_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rtas_write_config(struct device_node *dn, int where, int size, u32 val)
|
int rtas_write_config(struct device_node *dn, int where, int size, u32 val)
|
||||||
{
|
{
|
||||||
unsigned long buid, addr;
|
unsigned long buid, addr;
|
||||||
int ret;
|
int ret;
|
||||||
|
struct pci_dn *pdn;
|
||||||
|
|
||||||
if (!dn)
|
if (!dn || !dn->data)
|
||||||
return PCIBIOS_DEVICE_NOT_FOUND;
|
return PCIBIOS_DEVICE_NOT_FOUND;
|
||||||
if (!config_access_valid(dn, where))
|
pdn = dn->data;
|
||||||
|
if (!config_access_valid(pdn, where))
|
||||||
return PCIBIOS_BAD_REGISTER_NUMBER;
|
return PCIBIOS_BAD_REGISTER_NUMBER;
|
||||||
|
|
||||||
addr = ((where & 0xf00) << 20) | (dn->busno << 16) |
|
addr = ((where & 0xf00) << 20) | (pdn->busno << 16) |
|
||||||
(dn->devfn << 8) | (where & 0xff);
|
(pdn->devfn << 8) | (where & 0xff);
|
||||||
buid = dn->phb->buid;
|
buid = pdn->phb->buid;
|
||||||
if (buid) {
|
if (buid) {
|
||||||
ret = rtas_call(ibm_write_pci_config, 5, 1, NULL, addr, buid >> 32, buid & 0xffffffff, size, (ulong) val);
|
ret = rtas_call(ibm_write_pci_config, 5, 1, NULL, addr, buid >> 32, buid & 0xffffffff, size, (ulong) val);
|
||||||
} else {
|
} else {
|
||||||
|
@ -161,7 +167,8 @@ static int rtas_pci_write_config(struct pci_bus *bus,
|
||||||
|
|
||||||
/* Search only direct children of the bus */
|
/* Search only direct children of the bus */
|
||||||
for (dn = busdn->child; dn; dn = dn->sibling)
|
for (dn = busdn->child; dn; dn = dn->sibling)
|
||||||
if (dn->devfn == devfn && of_device_available(dn))
|
if (dn->data && PCI_DN(dn)->devfn == devfn
|
||||||
|
&& of_device_available(dn))
|
||||||
return rtas_write_config(dn, where, size, val);
|
return rtas_write_config(dn, where, size, val);
|
||||||
return PCIBIOS_DEVICE_NOT_FOUND;
|
return PCIBIOS_DEVICE_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1283,7 +1283,7 @@ void __init generic_find_legacy_serial_ports(u64 *physport,
|
||||||
|
|
||||||
static struct platform_device serial_device = {
|
static struct platform_device serial_device = {
|
||||||
.name = "serial8250",
|
.name = "serial8250",
|
||||||
.id = 0,
|
.id = PLAT8250_DEV_PLATFORM,
|
||||||
.dev = {
|
.dev = {
|
||||||
.platform_data = serial_ports,
|
.platform_data = serial_ports,
|
||||||
},
|
},
|
||||||
|
|
|
@ -708,62 +708,9 @@ asmlinkage int sys32_pciconfig_write(u32 bus, u32 dfn, u32 off, u32 len, u32 ubu
|
||||||
compat_ptr(ubuf));
|
compat_ptr(ubuf));
|
||||||
}
|
}
|
||||||
|
|
||||||
#define IOBASE_BRIDGE_NUMBER 0
|
|
||||||
#define IOBASE_MEMORY 1
|
|
||||||
#define IOBASE_IO 2
|
|
||||||
#define IOBASE_ISA_IO 3
|
|
||||||
#define IOBASE_ISA_MEM 4
|
|
||||||
|
|
||||||
asmlinkage int sys32_pciconfig_iobase(u32 which, u32 in_bus, u32 in_devfn)
|
asmlinkage int sys32_pciconfig_iobase(u32 which, u32 in_bus, u32 in_devfn)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_PCI
|
return sys_pciconfig_iobase(which, in_bus, in_devfn);
|
||||||
struct pci_controller* hose;
|
|
||||||
struct list_head *ln;
|
|
||||||
struct pci_bus *bus = NULL;
|
|
||||||
struct device_node *hose_node;
|
|
||||||
|
|
||||||
/* Argh ! Please forgive me for that hack, but that's the
|
|
||||||
* simplest way to get existing XFree to not lockup on some
|
|
||||||
* G5 machines... So when something asks for bus 0 io base
|
|
||||||
* (bus 0 is HT root), we return the AGP one instead.
|
|
||||||
*/
|
|
||||||
#ifdef CONFIG_PPC_PMAC
|
|
||||||
if (systemcfg->platform == PLATFORM_POWERMAC &&
|
|
||||||
machine_is_compatible("MacRISC4"))
|
|
||||||
if (in_bus == 0)
|
|
||||||
in_bus = 0xf0;
|
|
||||||
#endif /* CONFIG_PPC_PMAC */
|
|
||||||
|
|
||||||
/* That syscall isn't quite compatible with PCI domains, but it's
|
|
||||||
* used on pre-domains setup. We return the first match
|
|
||||||
*/
|
|
||||||
|
|
||||||
for (ln = pci_root_buses.next; ln != &pci_root_buses; ln = ln->next) {
|
|
||||||
bus = pci_bus_b(ln);
|
|
||||||
if (in_bus >= bus->number && in_bus < (bus->number + bus->subordinate))
|
|
||||||
break;
|
|
||||||
bus = NULL;
|
|
||||||
}
|
|
||||||
if (bus == NULL || bus->sysdata == NULL)
|
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
hose_node = (struct device_node *)bus->sysdata;
|
|
||||||
hose = hose_node->phb;
|
|
||||||
|
|
||||||
switch (which) {
|
|
||||||
case IOBASE_BRIDGE_NUMBER:
|
|
||||||
return (long)hose->first_busno;
|
|
||||||
case IOBASE_MEMORY:
|
|
||||||
return (long)hose->pci_mem_offset;
|
|
||||||
case IOBASE_IO:
|
|
||||||
return (long)hose->io_base_phys;
|
|
||||||
case IOBASE_ISA_IO:
|
|
||||||
return (long)isa_io_base;
|
|
||||||
case IOBASE_ISA_MEM:
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_PCI */
|
|
||||||
return -EOPNOTSUPP;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -46,10 +46,6 @@
|
||||||
|
|
||||||
extern unsigned long wall_jiffies;
|
extern unsigned long wall_jiffies;
|
||||||
|
|
||||||
void
|
|
||||||
check_bugs(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* sys_ipc() is the de-multiplexer for the SysV IPC calls..
|
* sys_ipc() is the de-multiplexer for the SysV IPC calls..
|
||||||
|
|
|
@ -276,7 +276,7 @@ static void iommu_dev_setup_u3(struct pci_dev *dev)
|
||||||
dn = pci_device_to_OF_node(dev);
|
dn = pci_device_to_OF_node(dev);
|
||||||
|
|
||||||
if (dn)
|
if (dn)
|
||||||
dn->iommu_table = &iommu_table_u3;
|
PCI_DN(dn)->iommu_table = &iommu_table_u3;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void iommu_bus_setup_u3(struct pci_bus *bus)
|
static void iommu_bus_setup_u3(struct pci_bus *bus)
|
||||||
|
@ -291,7 +291,7 @@ static void iommu_bus_setup_u3(struct pci_bus *bus)
|
||||||
dn = pci_bus_to_OF_node(bus);
|
dn = pci_bus_to_OF_node(bus);
|
||||||
|
|
||||||
if (dn)
|
if (dn)
|
||||||
dn->iommu_table = &iommu_table_u3;
|
PCI_DN(dn)->iommu_table = &iommu_table_u3;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void iommu_dev_setup_null(struct pci_dev *dev) { }
|
static void iommu_dev_setup_null(struct pci_dev *dev) { }
|
||||||
|
|
|
@ -158,14 +158,20 @@ static struct console udbg_console = {
|
||||||
.index = -1,
|
.index = -1,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int early_console_initialized;
|
||||||
|
|
||||||
void __init disable_early_printk(void)
|
void __init disable_early_printk(void)
|
||||||
{
|
{
|
||||||
|
if (!early_console_initialized)
|
||||||
|
return;
|
||||||
unregister_console(&udbg_console);
|
unregister_console(&udbg_console);
|
||||||
|
early_console_initialized = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* called by setup_system */
|
/* called by setup_system */
|
||||||
void register_early_udbg_console(void)
|
void register_early_udbg_console(void)
|
||||||
{
|
{
|
||||||
|
early_console_initialized = 1;
|
||||||
register_console(&udbg_console);
|
register_console(&udbg_console);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -554,12 +554,12 @@ void __init do_init_bootmem(void)
|
||||||
* present.
|
* present.
|
||||||
*/
|
*/
|
||||||
for (i=0; i < lmb.memory.cnt; i++)
|
for (i=0; i < lmb.memory.cnt; i++)
|
||||||
free_bootmem(lmb_start_pfn(&lmb.memory, i),
|
free_bootmem(lmb.memory.region[i].base,
|
||||||
lmb_size_bytes(&lmb.memory, i));
|
lmb_size_bytes(&lmb.memory, i));
|
||||||
|
|
||||||
/* reserve the sections we're already using */
|
/* reserve the sections we're already using */
|
||||||
for (i=0; i < lmb.reserved.cnt; i++)
|
for (i=0; i < lmb.reserved.cnt; i++)
|
||||||
reserve_bootmem(lmb_start_pfn(&lmb.reserved, i),
|
reserve_bootmem(lmb.reserved.region[i].base,
|
||||||
lmb_size_bytes(&lmb.reserved, i));
|
lmb_size_bytes(&lmb.reserved, i));
|
||||||
|
|
||||||
for (i=0; i < lmb.memory.cnt; i++)
|
for (i=0; i < lmb.memory.cnt; i++)
|
||||||
|
|
|
@ -19,6 +19,7 @@ CFLAGS += -m31
|
||||||
AFLAGS += -m31
|
AFLAGS += -m31
|
||||||
UTS_MACHINE := s390
|
UTS_MACHINE := s390
|
||||||
STACK_SIZE := 8192
|
STACK_SIZE := 8192
|
||||||
|
CHECKFLAGS += -D__s390__
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef CONFIG_ARCH_S390X
|
ifdef CONFIG_ARCH_S390X
|
||||||
|
@ -28,6 +29,7 @@ CFLAGS += -m64
|
||||||
AFLAGS += -m64
|
AFLAGS += -m64
|
||||||
UTS_MACHINE := s390x
|
UTS_MACHINE := s390x
|
||||||
STACK_SIZE := 16384
|
STACK_SIZE := 16384
|
||||||
|
CHECKFLAGS += -D__s390__ -D__s390x__
|
||||||
endif
|
endif
|
||||||
|
|
||||||
cflags-$(CONFIG_MARCH_G5) += $(call cc-option,-march=g5)
|
cflags-$(CONFIG_MARCH_G5) += $(call cc-option,-march=g5)
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue