Merge branch 'master' of /pub/scm/linux/kernel/git/torvalds/linux-2.6
This commit is contained in:
Коммит
ddcc959634
|
@ -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)
|
||||
When: September 2005
|
||||
Why: Replaced by io_remap_pfn_range() which allows more memory space
|
||||
|
|
|
@ -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
|
||||
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
|
||||
P: Jeff Garzik
|
||||
M: jgarzik@pobox.com
|
||||
|
@ -1813,13 +1819,6 @@ M: hch@infradead.org
|
|||
L: linux-abi-devel@lists.sourceforge.net
|
||||
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)
|
||||
P: Thomas Sailer
|
||||
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 */
|
||||
|
||||
#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,
|
||||
PCI_SLOT(dev->devfn),
|
||||
PCI_FUNC(dev->devfn),
|
||||
hose->index,
|
||||
pci_pretty_name (dev));
|
||||
hose->index);
|
||||
printk(" %d message(s) from 0x%04x\n",
|
||||
1 << ((msg_ctl & PCI_MSI_FLAGS_QSIZE) >> 4),
|
||||
msg_dat);
|
||||
|
|
|
@ -541,6 +541,103 @@ locomo_init_one_child(struct locomo *lchip, struct locomo_dev_info *info)
|
|||
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.
|
||||
* @phys_addr: physical address of device.
|
||||
|
@ -707,6 +804,10 @@ static struct device_driver locomo_device_driver = {
|
|||
.bus = &platform_bus_type,
|
||||
.probe = locomo_probe,
|
||||
.remove = locomo_remove,
|
||||
#ifdef CONFIG_PM
|
||||
.suspend = locomo_suspend,
|
||||
.resume = locomo_resume,
|
||||
#endif
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.12-git4
|
||||
# Wed Jun 22 15:56:42 2005
|
||||
# Linux kernel version: 2.6.13-git8
|
||||
# Thu Sep 8 19:24:02 2005
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -22,6 +22,7 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
|
|||
# General setup
|
||||
#
|
||||
CONFIG_LOCALVERSION=""
|
||||
CONFIG_LOCALVERSION_AUTO=y
|
||||
CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
# CONFIG_POSIX_MQUEUE is not set
|
||||
|
@ -31,6 +32,7 @@ CONFIG_SYSCTL=y
|
|||
# CONFIG_HOTPLUG is not set
|
||||
CONFIG_KOBJECT_UEVENT=y
|
||||
# CONFIG_IKCONFIG is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
|
@ -88,7 +90,9 @@ CONFIG_ARCH_S3C2410=y
|
|||
#
|
||||
# S3C24XX Implementations
|
||||
#
|
||||
CONFIG_MACH_ANUBIS=y
|
||||
CONFIG_ARCH_BAST=y
|
||||
CONFIG_BAST_PC104_IRQ=y
|
||||
CONFIG_ARCH_H1940=y
|
||||
CONFIG_MACH_N30=y
|
||||
CONFIG_ARCH_SMDK2410=y
|
||||
|
@ -112,6 +116,7 @@ CONFIG_S3C2410_DMA=y
|
|||
# CONFIG_S3C2410_DMA_DEBUG is not set
|
||||
# CONFIG_S3C2410_PM_DEBUG is not set
|
||||
# CONFIG_S3C2410_PM_CHECK is not set
|
||||
CONFIG_PM_SIMTEC=y
|
||||
CONFIG_S3C2410_LOWLEVEL_UART_PORT=0
|
||||
|
||||
#
|
||||
|
@ -149,7 +154,15 @@ CONFIG_ISA_DMA_API=y
|
|||
#
|
||||
# CONFIG_SMP 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
|
||||
|
||||
#
|
||||
|
@ -185,6 +198,74 @@ CONFIG_BINFMT_AOUT=y
|
|||
CONFIG_PM=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
|
||||
#
|
||||
|
@ -258,6 +339,7 @@ CONFIG_MTD_ROM=y
|
|||
# CONFIG_MTD_IMPA7 is not set
|
||||
CONFIG_MTD_BAST=y
|
||||
CONFIG_MTD_BAST_MAXSIZE=4
|
||||
# CONFIG_MTD_PLATRAM is not set
|
||||
|
||||
#
|
||||
# Self-contained MTD device drivers
|
||||
|
@ -312,7 +394,6 @@ CONFIG_BLK_DEV_RAM=y
|
|||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=4096
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
|
||||
#
|
||||
|
@ -354,6 +435,7 @@ CONFIG_BLK_DEV_IDE_BAST=y
|
|||
#
|
||||
# SCSI device support
|
||||
#
|
||||
# CONFIG_RAID_ATTRS 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_DUMMY is not set
|
||||
# CONFIG_BONDING is not set
|
||||
# CONFIG_EQUALIZER is not set
|
||||
# CONFIG_TUN is not set
|
||||
|
||||
#
|
||||
# PHY device support
|
||||
#
|
||||
# CONFIG_PHYLIB is not set
|
||||
|
||||
#
|
||||
# Ethernet (10 or 100Mbit)
|
||||
#
|
||||
|
@ -480,6 +505,8 @@ CONFIG_DM9000=m
|
|||
# CONFIG_SLIP is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
# CONFIG_NETCONSOLE is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
|
@ -562,7 +589,6 @@ CONFIG_SERIAL_8250_EXTENDED=y
|
|||
CONFIG_SERIAL_8250_MANY_PORTS=y
|
||||
CONFIG_SERIAL_8250_SHARE_IRQ=y
|
||||
# CONFIG_SERIAL_8250_DETECT_IRQ is not set
|
||||
# CONFIG_SERIAL_8250_MULTIPORT is not set
|
||||
# CONFIG_SERIAL_8250_RSA is not set
|
||||
|
||||
#
|
||||
|
@ -605,7 +631,6 @@ CONFIG_S3C2410_RTC=y
|
|||
#
|
||||
# Ftape, the floppy tape device driver
|
||||
#
|
||||
# CONFIG_DRM is not set
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
|
||||
#
|
||||
|
@ -628,7 +653,7 @@ CONFIG_I2C_ALGOBIT=m
|
|||
#
|
||||
# I2C Hardware Bus support
|
||||
#
|
||||
# CONFIG_I2C_ISA is not set
|
||||
CONFIG_I2C_ISA=m
|
||||
# CONFIG_I2C_PARPORT is not set
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
CONFIG_I2C_S3C2410=y
|
||||
|
@ -636,14 +661,33 @@ CONFIG_I2C_S3C2410=y
|
|||
# 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_ADM1025 is not set
|
||||
# CONFIG_SENSORS_ADM1026 is not set
|
||||
# CONFIG_SENSORS_ADM1031 is not set
|
||||
# CONFIG_SENSORS_ADM9240 is not set
|
||||
# CONFIG_SENSORS_ASB100 is not set
|
||||
# CONFIG_SENSORS_ATXP1 is not set
|
||||
# CONFIG_SENSORS_DS1621 is not set
|
||||
# CONFIG_SENSORS_FSCHER 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_MAX1619 is not set
|
||||
# CONFIG_SENSORS_PC87360 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_SMSC47M1 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_W83781D is not set
|
||||
# CONFIG_SENSORS_W83792D is not set
|
||||
# CONFIG_SENSORS_W83L785TS is not set
|
||||
# CONFIG_SENSORS_W83627HF 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
|
||||
# CONFIG_SENSORS_W83627EHF is not set
|
||||
# CONFIG_HWMON_DEBUG_CHIP is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia Capabilities Port drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
|
@ -731,7 +769,7 @@ CONFIG_DUMMY_CONSOLE=y
|
|||
# USB support
|
||||
#
|
||||
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
|
||||
|
||||
#
|
||||
|
@ -749,6 +787,7 @@ CONFIG_USB_ARCH_HAS_HCD=y
|
|||
#
|
||||
CONFIG_EXT2_FS=y
|
||||
# CONFIG_EXT2_FS_XATTR is not set
|
||||
# CONFIG_EXT2_FS_XIP is not set
|
||||
CONFIG_EXT3_FS=y
|
||||
CONFIG_EXT3_FS_XATTR=y
|
||||
# CONFIG_EXT3_FS_POSIX_ACL is not set
|
||||
|
@ -758,6 +797,7 @@ CONFIG_JBD=y
|
|||
CONFIG_FS_MBCACHE=y
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
# CONFIG_FS_POSIX_ACL is not set
|
||||
|
||||
#
|
||||
# XFS support
|
||||
|
@ -765,6 +805,7 @@ CONFIG_FS_MBCACHE=y
|
|||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
CONFIG_ROMFS_FS=y
|
||||
CONFIG_INOTIFY=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
|
@ -791,11 +832,11 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
|
|||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_SYSFS=y
|
||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||
# CONFIG_TMPFS is not set
|
||||
# CONFIG_HUGETLBFS is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_RELAYFS_FS is not set
|
||||
|
||||
#
|
||||
# Miscellaneous filesystems
|
||||
|
@ -812,8 +853,7 @@ CONFIG_JFFS_FS_VERBOSE=0
|
|||
# CONFIG_JFFS_PROC_FS is not set
|
||||
CONFIG_JFFS2_FS=y
|
||||
CONFIG_JFFS2_FS_DEBUG=0
|
||||
# CONFIG_JFFS2_FS_NAND is not set
|
||||
# CONFIG_JFFS2_FS_NOR_ECC is not set
|
||||
CONFIG_JFFS2_FS_WRITEBUFFER=y
|
||||
# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
|
||||
CONFIG_JFFS2_ZLIB=y
|
||||
CONFIG_JFFS2_RTIME=y
|
||||
|
@ -835,6 +875,7 @@ CONFIG_NFS_FS=y
|
|||
# CONFIG_NFSD is not set
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_LOCKD=y
|
||||
CONFIG_NFS_COMMON=y
|
||||
CONFIG_SUNRPC=y
|
||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||
|
@ -920,6 +961,7 @@ CONFIG_NLS_DEFAULT="iso8859-1"
|
|||
CONFIG_DEBUG_KERNEL=y
|
||||
# CONFIG_MAGIC_SYSRQ is not set
|
||||
CONFIG_LOG_BUF_SHIFT=16
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB 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 = {
|
||||
.name = "serial8250",
|
||||
.id = 0,
|
||||
.id = PLAT8250_DEV_PLATFORM,
|
||||
.dev = {
|
||||
.platform_data = serial_platform_data,
|
||||
},
|
||||
|
|
|
@ -219,7 +219,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
|
|||
|
||||
static struct platform_device serial_device = {
|
||||
.name = "serial8250",
|
||||
.id = 0,
|
||||
.id = PLAT8250_DEV_PLATFORM,
|
||||
.dev = {
|
||||
.platform_data = serial_platform_data,
|
||||
},
|
||||
|
|
|
@ -52,7 +52,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
|
|||
|
||||
static struct platform_device serial_device = {
|
||||
.name = "serial8250",
|
||||
.id = 0,
|
||||
.id = PLAT8250_DEV_PLATFORM,
|
||||
.dev = {
|
||||
.platform_data = serial_platform_data,
|
||||
},
|
||||
|
|
|
@ -34,7 +34,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
|
|||
|
||||
static struct platform_device serial_device = {
|
||||
.name = "serial8250",
|
||||
.id = 0,
|
||||
.id = PLAT8250_DEV_PLATFORM,
|
||||
.dev = {
|
||||
.platform_data = serial_platform_data,
|
||||
},
|
||||
|
|
|
@ -90,7 +90,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
|
|||
|
||||
static struct platform_device serial_device = {
|
||||
.name = "serial8250",
|
||||
.id = 0,
|
||||
.id = PLAT8250_DEV_PLATFORM,
|
||||
.dev = {
|
||||
.platform_data = serial_platform_data,
|
||||
},
|
||||
|
|
|
@ -174,7 +174,7 @@ static struct resource ixp2000_uart_resource = {
|
|||
|
||||
static struct platform_device ixp2000_serial_device = {
|
||||
.name = "serial8250",
|
||||
.id = 0,
|
||||
.id = PLAT8250_DEV_PLATFORM,
|
||||
.dev = {
|
||||
.platform_data = ixp2000_serial_port,
|
||||
},
|
||||
|
|
|
@ -66,7 +66,7 @@ static struct plat_serial8250_port coyote_uart_data[] = {
|
|||
|
||||
static struct platform_device coyote_uart = {
|
||||
.name = "serial8250",
|
||||
.id = 0,
|
||||
.id = PLAT8250_DEV_PLATFORM,
|
||||
.dev = {
|
||||
.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 = {
|
||||
.name = "serial8250",
|
||||
.id = 0,
|
||||
.id = PLAT8250_DEV_PLATFORM,
|
||||
.dev = {
|
||||
.platform_data = gtwx5715_uart_platform_data,
|
||||
},
|
||||
|
|
|
@ -96,7 +96,7 @@ static struct plat_serial8250_port ixdp425_uart_data[] = {
|
|||
|
||||
static struct platform_device ixdp425_uart = {
|
||||
.name = "serial8250",
|
||||
.id = 0,
|
||||
.id = PLAT8250_DEV_PLATFORM,
|
||||
.dev.platform_data = ixdp425_uart_data,
|
||||
.num_resources = 2,
|
||||
.resource = ixdp425_uart_resources
|
||||
|
|
|
@ -47,6 +47,14 @@ config MACH_OMAP_OSK
|
|||
TI OMAP 5912 OSK (OMAP Starter Kit) board support. Say Y here
|
||||
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
|
||||
bool "TI Perseus2"
|
||||
depends on ARCH_OMAP1 && ARCH_OMAP730
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
#
|
||||
|
||||
# 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
|
||||
|
||||
# Specific board support
|
||||
|
@ -23,6 +23,7 @@ endif
|
|||
|
||||
# LEDs support
|
||||
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_PERSEUS2) += leds-h2p2-debug.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)
|
||||
static struct omap_usb_config generic1610_usb_config __initdata = {
|
||||
#ifdef CONFIG_USB_OTG
|
||||
.otg = 1,
|
||||
#endif
|
||||
.register_host = 1,
|
||||
.register_dev = 1,
|
||||
.hmc_mode = 16,
|
||||
.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
|
||||
|
||||
static struct omap_board_config_kernel generic_config[] = {
|
||||
{ OMAP_TAG_USB, NULL },
|
||||
{ OMAP_TAG_MMC, &generic_mmc_config },
|
||||
};
|
||||
|
||||
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.
|
||||
* 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;
|
||||
}
|
||||
#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_size = ARRAY_SIZE(generic_config);
|
||||
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)
|
||||
{
|
||||
omap_map_common_io()
|
||||
omap_map_common_io();
|
||||
}
|
||||
|
||||
MACHINE_START(OMAP_GENERIC, "Generic OMAP1510/1610/1710")
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#include <asm/mach/map.h>
|
||||
|
||||
#include <asm/arch/gpio.h>
|
||||
#include <asm/arch/mux.h>
|
||||
#include <asm/arch/tc.h>
|
||||
#include <asm/arch/usb.h>
|
||||
#include <asm/arch/common.h>
|
||||
|
@ -80,8 +81,7 @@ static struct flash_platform_data h2_flash_data = {
|
|||
};
|
||||
|
||||
static struct resource h2_flash_resource = {
|
||||
.start = OMAP_CS2B_PHYS,
|
||||
.end = OMAP_CS2B_PHYS + OMAP_CS2B_SIZE - 1,
|
||||
/* This is on CS3, wherever it's mapped */
|
||||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
|
||||
|
@ -126,10 +126,9 @@ static void __init h2_init_smc91x(void)
|
|||
printk("Error requesting gpio 0 for smc91x irq\n");
|
||||
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_gpio_init();
|
||||
|
@ -152,9 +151,13 @@ static struct omap_usb_config h2_usb_config __initdata = {
|
|||
};
|
||||
|
||||
static struct omap_mmc_config h2_mmc_config __initdata = {
|
||||
.mmc_blocks = 1,
|
||||
.mmc1_power_pin = -1, /* tps65010 gpio3 */
|
||||
.mmc1_switch_pin = OMAP_MPUIO(1),
|
||||
.mmc [0] = {
|
||||
.enabled = 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[] = {
|
||||
|
@ -164,6 +167,16 @@ static struct omap_board_config_kernel h2_config[] = {
|
|||
|
||||
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));
|
||||
omap_board_config = 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 = {
|
||||
.start = OMAP_CS2B_PHYS,
|
||||
.end = OMAP_CS2B_PHYS + OMAP_CS2B_SIZE - 1,
|
||||
/* This is on CS3, wherever it's mapped */
|
||||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
|
||||
|
@ -161,13 +160,26 @@ static struct omap_usb_config h3_usb_config __initdata = {
|
|||
.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[] = {
|
||||
{ OMAP_TAG_USB, &h3_usb_config },
|
||||
{ OMAP_TAG_MMC, &h3_mmc_config },
|
||||
};
|
||||
|
||||
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));
|
||||
omap_board_config = h3_config;
|
||||
omap_board_config_size = ARRAY_SIZE(h3_config);
|
||||
}
|
||||
|
||||
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");
|
||||
return;
|
||||
}
|
||||
omap_set_gpio_edge_ctrl(40, OMAP_GPIO_FALLING_EDGE);
|
||||
}
|
||||
|
||||
void h3_init_irq(void)
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include <asm/mach/flash.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <asm/arch/mux.h>
|
||||
#include <asm/arch/fpga.h>
|
||||
#include <asm/arch/gpio.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");
|
||||
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
|
||||
|
||||
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[] = {
|
||||
{ OMAP_TAG_USB, NULL },
|
||||
{ OMAP_TAG_MMC, &innovator_mmc_config },
|
||||
};
|
||||
|
||||
static void __init innovator_init(void)
|
||||
|
|
|
@ -75,16 +75,15 @@ static void __init netstar_init(void)
|
|||
mdelay(50); /* 50ms until PHY ready */
|
||||
/* smc91x interrupt pin */
|
||||
omap_request_gpio(8);
|
||||
omap_set_gpio_edge_ctrl(8, OMAP_GPIO_RISING_EDGE);
|
||||
|
||||
omap_request_gpio(12);
|
||||
omap_request_gpio(13);
|
||||
omap_request_gpio(14);
|
||||
omap_request_gpio(15);
|
||||
omap_set_gpio_edge_ctrl(12, OMAP_GPIO_FALLING_EDGE);
|
||||
omap_set_gpio_edge_ctrl(13, OMAP_GPIO_FALLING_EDGE);
|
||||
omap_set_gpio_edge_ctrl(14, OMAP_GPIO_FALLING_EDGE);
|
||||
omap_set_gpio_edge_ctrl(15, OMAP_GPIO_FALLING_EDGE);
|
||||
set_irq_type(OMAP_GPIO_IRQ(12), IRQT_FALLING);
|
||||
set_irq_type(OMAP_GPIO_IRQ(13), IRQT_FALLING);
|
||||
set_irq_type(OMAP_GPIO_IRQ(14), IRQT_FALLING);
|
||||
set_irq_type(OMAP_GPIO_IRQ(15), IRQT_FALLING);
|
||||
|
||||
platform_add_devices(netstar_devices, ARRAY_SIZE(netstar_devices));
|
||||
|
||||
|
|
|
@ -29,11 +29,16 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/init.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/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/flash.h>
|
||||
|
||||
#include <asm/arch/gpio.h>
|
||||
#include <asm/arch/usb.h>
|
||||
|
@ -41,12 +46,56 @@
|
|||
#include <asm/arch/tc.h>
|
||||
#include <asm/arch/common.h>
|
||||
|
||||
static struct map_desc osk5912_io_desc[] __initdata = {
|
||||
{ OMAP_OSK_NOR_FLASH_BASE, OMAP_OSK_NOR_FLASH_START, OMAP_OSK_NOR_FLASH_SIZE,
|
||||
MT_DEVICE },
|
||||
static int __initdata osk_serial_ports[OMAP_MAX_NR_PORTS] = {1, 0, 0};
|
||||
|
||||
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[] = {
|
||||
[0] = {
|
||||
|
@ -86,9 +135,16 @@ static struct platform_device osk5912_cf_device = {
|
|||
.resource = osk5912_cf_resources,
|
||||
};
|
||||
|
||||
static struct platform_device osk5912_mcbsp1_device = {
|
||||
.name = "omap_mcbsp",
|
||||
.id = 1,
|
||||
};
|
||||
|
||||
static struct platform_device *osk5912_devices[] __initdata = {
|
||||
&osk5912_flash_device,
|
||||
&osk5912_smc91x_device,
|
||||
&osk5912_cf_device,
|
||||
&osk5912_mcbsp1_device,
|
||||
};
|
||||
|
||||
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");
|
||||
return;
|
||||
}
|
||||
omap_set_gpio_edge_ctrl(0, OMAP_GPIO_RISING_EDGE);
|
||||
|
||||
/* Check EMIFS wait states to fix errors with SMC_GET_PKT_HDR */
|
||||
EMIFS_CCS(1) |= 0x2;
|
||||
|
@ -110,11 +165,11 @@ static void __init osk_init_cf(void)
|
|||
printk("Error requesting gpio 62 for CF irq\n");
|
||||
return;
|
||||
}
|
||||
/* it's really active-low */
|
||||
omap_set_gpio_edge_ctrl(62, OMAP_GPIO_FALLING_EDGE);
|
||||
/* the CF I/O IRQ is really active-low */
|
||||
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_gpio_init();
|
||||
|
@ -142,18 +197,69 @@ static struct omap_board_config_kernel osk_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)
|
||||
{
|
||||
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));
|
||||
omap_board_config = osk_config;
|
||||
omap_board_config_size = ARRAY_SIZE(osk_config);
|
||||
USB_TRANSCEIVER_CTRL_REG |= (3 << 1);
|
||||
|
||||
osk_mistral_init();
|
||||
}
|
||||
|
||||
static void __init osk_map_io(void)
|
||||
{
|
||||
omap_map_common_io();
|
||||
iotable_init(osk5912_io_desc, ARRAY_SIZE(osk5912_io_desc));
|
||||
omap_serial_init(osk_serial_ports);
|
||||
}
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include <asm/mach/flash.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <asm/arch/tc.h>
|
||||
#include <asm/arch/gpio.h>
|
||||
#include <asm/arch/mux.h>
|
||||
#include <asm/arch/fpga.h>
|
||||
|
@ -83,8 +84,8 @@ static struct flash_platform_data p2_flash_data = {
|
|||
};
|
||||
|
||||
static struct resource p2_flash_resource = {
|
||||
.start = OMAP_FLASH_0_START,
|
||||
.end = OMAP_FLASH_0_START + OMAP_FLASH_0_SIZE - 1,
|
||||
.start = OMAP_CS0_PHYS,
|
||||
.end = OMAP_CS0_PHYS + SZ_32M - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
|
||||
|
|
|
@ -25,13 +25,14 @@
|
|||
#include <asm/hardware.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/flash.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/gpio.h>
|
||||
#include <asm/arch/mux.h>
|
||||
#include <asm/arch/tc.h>
|
||||
#include <asm/arch/usb.h>
|
||||
|
||||
extern void omap_init_time(void);
|
||||
extern int omap_gpio_init(void);
|
||||
|
@ -74,7 +75,7 @@ static struct plat_serial8250_port voiceblue_ports[] = {
|
|||
|
||||
static struct platform_device serial_device = {
|
||||
.name = "serial8250",
|
||||
.id = 1,
|
||||
.id = PLAT8250_DEV_PLATFORM1,
|
||||
.dev = {
|
||||
.platform_data = voiceblue_ports,
|
||||
},
|
||||
|
@ -86,6 +87,27 @@ static int __init ext_uart_init(void)
|
|||
}
|
||||
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[] = {
|
||||
[0] = {
|
||||
.start = OMAP_CS2_PHYS + 0x300,
|
||||
|
@ -107,6 +129,7 @@ static struct platform_device voiceblue_smc91x_device = {
|
|||
};
|
||||
|
||||
static struct platform_device *voiceblue_devices[] __initdata = {
|
||||
&voiceblue_flash_device,
|
||||
&voiceblue_smc91x_device,
|
||||
};
|
||||
|
||||
|
@ -119,8 +142,17 @@ static struct omap_usb_config voiceblue_usb_config __initdata = {
|
|||
.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[] = {
|
||||
{ OMAP_TAG_USB, &voiceblue_usb_config },
|
||||
{ OMAP_TAG_MMC, &voiceblue_mmc_config },
|
||||
};
|
||||
|
||||
static void __init voiceblue_init_irq(void)
|
||||
|
@ -131,9 +163,6 @@ static void __init voiceblue_init_irq(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 */
|
||||
omap_request_gpio(0);
|
||||
/* smc91x reset */
|
||||
|
@ -145,7 +174,6 @@ static void __init voiceblue_init(void)
|
|||
mdelay(50); /* 50ms until PHY ready */
|
||||
/* smc91x interrupt pin */
|
||||
omap_request_gpio(8);
|
||||
omap_set_gpio_edge_ctrl(8, OMAP_GPIO_RISING_EDGE);
|
||||
/* 16C554 reset*/
|
||||
omap_request_gpio(6);
|
||||
omap_set_gpio_direction(6, 0);
|
||||
|
@ -155,14 +183,19 @@ static void __init voiceblue_init(void)
|
|||
omap_request_gpio(13);
|
||||
omap_request_gpio(14);
|
||||
omap_request_gpio(15);
|
||||
omap_set_gpio_edge_ctrl(12, OMAP_GPIO_RISING_EDGE);
|
||||
omap_set_gpio_edge_ctrl(13, OMAP_GPIO_RISING_EDGE);
|
||||
omap_set_gpio_edge_ctrl(14, OMAP_GPIO_RISING_EDGE);
|
||||
omap_set_gpio_edge_ctrl(15, OMAP_GPIO_RISING_EDGE);
|
||||
set_irq_type(OMAP_GPIO_IRQ(12), IRQT_RISING);
|
||||
set_irq_type(OMAP_GPIO_IRQ(13), IRQT_RISING);
|
||||
set_irq_type(OMAP_GPIO_IRQ(14), IRQT_RISING);
|
||||
set_irq_type(OMAP_GPIO_IRQ(15), IRQT_RISING);
|
||||
|
||||
platform_add_devices(voiceblue_devices, ARRAY_SIZE(voiceblue_devices));
|
||||
omap_board_config = 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};
|
||||
|
@ -184,9 +217,9 @@ static int panic_event(struct notifier_block *this, unsigned long event,
|
|||
if (test_and_set_bit(MACHINE_PANICED, &machine_state))
|
||||
return NOTIFY_DONE;
|
||||
|
||||
/* Flash Power LED
|
||||
* (TODO: Enable clock right way (enabled in bootloader already)) */
|
||||
/* Flash power LED */
|
||||
omap_writeb(0x78, OMAP_LPG1_LCR);
|
||||
omap_writeb(0x01, OMAP_LPG1_PMR); /* Enable clock */
|
||||
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
@ -195,15 +228,14 @@ static struct notifier_block panic_block = {
|
|||
.notifier_call = panic_event,
|
||||
};
|
||||
|
||||
static int __init setup_notifier(void)
|
||||
static int __init voiceblue_setup(void)
|
||||
{
|
||||
/* Setup panic notifier */
|
||||
notifier_chain_register(&panic_notifier_list, &panic_block);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
postcore_initcall(setup_notifier);
|
||||
postcore_initcall(voiceblue_setup);
|
||||
|
||||
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
|
||||
*
|
||||
|
@ -181,7 +181,7 @@ void omap1510_fpga_init_irq(void)
|
|||
*/
|
||||
omap_request_gpio(13);
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
|
||||
extern int clk_init(void);
|
||||
extern void omap_check_revision(void);
|
||||
extern void omap_sram_init(void);
|
||||
|
||||
/*
|
||||
* 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 = {
|
||||
{ OMAP730_DSP_BASE, OMAP730_DSP_START, OMAP730_DSP_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
|
||||
|
||||
|
@ -40,27 +40,13 @@ static struct map_desc omap730_io_desc[] __initdata = {
|
|||
static struct map_desc omap1510_io_desc[] __initdata = {
|
||||
{ OMAP1510_DSP_BASE, OMAP1510_DSP_START, OMAP1510_DSP_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
|
||||
|
||||
#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_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
|
||||
|
||||
|
@ -86,14 +72,13 @@ static void __init _omap_map_io(void)
|
|||
}
|
||||
#endif
|
||||
#if defined(CONFIG_ARCH_OMAP16XX)
|
||||
if (cpu_is_omap1610() || cpu_is_omap1710()) {
|
||||
iotable_init(omap1610_io_desc, ARRAY_SIZE(omap1610_io_desc));
|
||||
}
|
||||
if (cpu_is_omap5912()) {
|
||||
iotable_init(omap5912_io_desc, ARRAY_SIZE(omap5912_io_desc));
|
||||
if (cpu_is_omap16xx()) {
|
||||
iotable_init(omap16xx_io_desc, ARRAY_SIZE(omap16xx_io_desc));
|
||||
}
|
||||
#endif
|
||||
|
||||
omap_sram_init();
|
||||
|
||||
/* REVISIT: Refer to OMAP5910 Errata, Advisory SYS_1: "Timeout Abort
|
||||
* 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
|
||||
*/
|
||||
void omap_map_common_io(void)
|
||||
void __init omap_map_common_io(void)
|
||||
{
|
||||
if (!initialized)
|
||||
_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
|
||||
*
|
||||
|
|
|
@ -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
|
||||
*
|
||||
|
@ -13,6 +13,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/version.h>
|
||||
|
||||
#include <asm/io.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/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
|
||||
*/
|
||||
|
@ -64,7 +64,7 @@ static void tps_work(void *unused)
|
|||
|
||||
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
|
||||
* 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;
|
||||
break;
|
||||
|
||||
#ifdef CONFIG_FB_OMAP
|
||||
#ifdef CONFIG_OMAP_OSK_MISTRAL
|
||||
|
||||
case led_timer:
|
||||
hw_led_state ^= TIMER_LED;
|
||||
|
@ -144,7 +144,7 @@ void osk_leds_event(led_event_t evt)
|
|||
mistral_setled();
|
||||
break;
|
||||
|
||||
#endif /* CONFIG_FB_OMAP */
|
||||
#endif /* CONFIG_OMAP_OSK_MISTRAL */
|
||||
|
||||
/* "green" == tps LED1 (leftmost, normally power-good)
|
||||
* 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
|
||||
*/
|
||||
|
@ -20,7 +20,9 @@ omap_leds_init(void)
|
|||
if (machine_is_omap_innovator())
|
||||
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;
|
||||
|
||||
else if (machine_is_omap_osk())
|
||||
|
@ -30,8 +32,12 @@ omap_leds_init(void)
|
|||
return -1;
|
||||
|
||||
if (machine_is_omap_h2()
|
||||
|| machine_is_omap_h3()
|
||||
|| 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
|
||||
* the LPG (works even in deep sleep!), to drive a bicolor
|
||||
|
|
|
@ -24,7 +24,11 @@
|
|||
|
||||
#include <asm/arch/board.h>
|
||||
#include <asm/arch/mux.h>
|
||||
#include <asm/arch/gpio.h>
|
||||
#include <asm/arch/fpga.h>
|
||||
#ifdef CONFIG_PM
|
||||
#include <asm/arch/pm.h>
|
||||
#endif
|
||||
|
||||
static struct clk * uart1_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 = {
|
||||
.name = "serial8250",
|
||||
.id = 0,
|
||||
.id = PLAT8250_DEV_PLATFORM,
|
||||
.dev = {
|
||||
.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)
|
||||
{
|
||||
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_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
|
||||
|
@ -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)
|
||||
{
|
||||
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;
|
||||
|
||||
/*
|
||||
|
@ -314,6 +316,15 @@ static unsigned long omap_32k_timer_gettimeoffset(void)
|
|||
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
|
||||
* 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();
|
||||
|
||||
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;
|
||||
timer_tick(regs);
|
||||
}
|
||||
|
|
|
@ -140,7 +140,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
|
|||
|
||||
static struct platform_device serial_device = {
|
||||
.name = "serial8250",
|
||||
.id = 0,
|
||||
.id = PLAT8250_DEV_PLATFORM,
|
||||
.dev = {
|
||||
.platform_data = serial_platform_data,
|
||||
},
|
||||
|
|
|
@ -381,7 +381,7 @@ static struct plat_serial8250_port bast_sio_data[] = {
|
|||
|
||||
static struct platform_device bast_sio = {
|
||||
.name = "serial8250",
|
||||
.id = 0,
|
||||
.id = PLAT8250_DEV_PLATFORM,
|
||||
.dev = {
|
||||
.platform_data = &bast_sio_data,
|
||||
},
|
||||
|
|
|
@ -221,7 +221,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
|
|||
|
||||
static struct platform_device serial_device = {
|
||||
.name = "serial8250",
|
||||
.id = 0,
|
||||
.id = PLAT8250_DEV_PLATFORM,
|
||||
.dev = {
|
||||
.platform_data = serial_platform_data,
|
||||
},
|
||||
|
|
|
@ -41,7 +41,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
|
|||
|
||||
static struct platform_device serial_device = {
|
||||
.name = "serial8250",
|
||||
.id = 0,
|
||||
.id = PLAT8250_DEV_PLATFORM,
|
||||
.dev = {
|
||||
.platform_data = serial_platform_data,
|
||||
},
|
||||
|
|
|
@ -16,6 +16,58 @@
|
|||
#include <asm/tlbflush.h>
|
||||
|
||||
#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 TOP_PTE(x) pte_offset_kernel(top_pmd, x)
|
||||
|
|
|
@ -467,11 +467,11 @@ static void __init longhaul_setup_voltagescaling(void)
|
|||
}
|
||||
|
||||
if (vrmrev==0) {
|
||||
dprintk ("VRM 8.5 \n");
|
||||
dprintk ("VRM 8.5\n");
|
||||
memcpy (voltage_table, vrm85scales, sizeof(voltage_table));
|
||||
numvscales = (voltage_table[maxvid]-voltage_table[minvid])/25;
|
||||
} else {
|
||||
dprintk ("Mobile VRM \n");
|
||||
dprintk ("Mobile VRM\n");
|
||||
memcpy (voltage_table, mobilevrmscales, sizeof(voltage_table));
|
||||
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) {
|
||||
/* 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);
|
||||
#ifndef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI
|
||||
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++) {
|
||||
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);
|
||||
result = -EINVAL;
|
||||
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) {
|
||||
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 = 0;
|
||||
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))
|
||||
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)) {
|
||||
centrino_driver.flags |= CPUFREQ_CONST_LOOPS;
|
||||
}
|
||||
|
@ -513,6 +506,13 @@ static int centrino_cpu_init(struct cpufreq_policy *policy)
|
|||
if (policy->cpu != 0)
|
||||
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]) {
|
||||
dprintk(KERN_INFO PFX "found unsupported CPU with "
|
||||
"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;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
* interfaces on this platform.
|
||||
*/
|
||||
if (remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
|
||||
vma->vm_end - vma->vm_start,
|
||||
vma->vm_page_prot))
|
||||
if (io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
|
||||
vma->vm_end - vma->vm_start,
|
||||
vma->vm_page_prot))
|
||||
return -EAGAIN;
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -339,12 +339,6 @@ config IA64_PALINFO
|
|||
To use this option, you have to ensure that the "/proc file system
|
||||
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 "fs/Kconfig.binfmt"
|
||||
|
|
|
@ -111,7 +111,6 @@ CONFIG_COMPAT=y
|
|||
CONFIG_IA64_MCA_RECOVERY=y
|
||||
CONFIG_PERFMON=y
|
||||
CONFIG_IA64_PALINFO=y
|
||||
CONFIG_ACPI_DEALLOCATE_IRQ=y
|
||||
|
||||
#
|
||||
# Firmware Drivers
|
||||
|
|
|
@ -109,7 +109,6 @@ CONFIG_COMPAT=y
|
|||
CONFIG_IA64_MCA_RECOVERY=y
|
||||
CONFIG_PERFMON=y
|
||||
CONFIG_IA64_PALINFO=y
|
||||
CONFIG_ACPI_DEALLOCATE_IRQ=y
|
||||
|
||||
#
|
||||
# Firmware Drivers
|
||||
|
|
|
@ -109,7 +109,6 @@ CONFIG_COMPAT=y
|
|||
CONFIG_IA64_MCA_RECOVERY=y
|
||||
CONFIG_PERFMON=y
|
||||
CONFIG_IA64_PALINFO=y
|
||||
CONFIG_ACPI_DEALLOCATE_IRQ=y
|
||||
|
||||
#
|
||||
# Firmware Drivers
|
||||
|
|
|
@ -99,7 +99,6 @@ CONFIG_COMPAT=y
|
|||
CONFIG_IA64_MCA_RECOVERY=y
|
||||
CONFIG_PERFMON=y
|
||||
CONFIG_IA64_PALINFO=y
|
||||
CONFIG_ACPI_DEALLOCATE_IRQ=y
|
||||
|
||||
#
|
||||
# Firmware Drivers
|
||||
|
@ -335,7 +334,7 @@ CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
|
|||
CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
|
||||
# CONFIG_SCSI_SYM53C8XX_IOMAPPED 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_1280=y
|
||||
# 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);
|
||||
|
||||
#ifdef CONFIG_ACPI_DEALLOCATE_IRQ
|
||||
void acpi_unregister_gsi(u32 gsi)
|
||||
{
|
||||
iosapic_unregister_intr(gsi);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(acpi_unregister_gsi);
|
||||
#endif /* CONFIG_ACPI_DEALLOCATE_IRQ */
|
||||
|
||||
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
|
||||
;;
|
||||
.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
|
||||
mov IA64_KR(CURRENT)=in0 // update "current" application register
|
||||
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...
|
||||
;;
|
||||
itr.d dtr[r25]=r23 // wire in new mapping...
|
||||
ssm psr.ic // reenable the psr.ic bit
|
||||
;;
|
||||
srlz.d
|
||||
br.cond.sptk .done
|
||||
END(ia64_switch_to)
|
||||
|
||||
|
|
|
@ -782,7 +782,6 @@ again:
|
|||
return vector;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI_DEALLOCATE_IRQ
|
||||
void
|
||||
iosapic_unregister_intr (unsigned int gsi)
|
||||
{
|
||||
|
@ -865,7 +864,6 @@ iosapic_unregister_intr (unsigned int gsi)
|
|||
spin_unlock(&iosapic_lock);
|
||||
spin_unlock_irqrestore(&idesc->lock, flags);
|
||||
}
|
||||
#endif /* CONFIG_ACPI_DEALLOCATE_IRQ */
|
||||
|
||||
/*
|
||||
* 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
|
||||
;;
|
||||
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
|
||||
;;
|
||||
(p8) mov A = 0; // A shouldn't be negative, cap it
|
||||
;;
|
||||
sub C = A, B
|
||||
sub D = saved_in2, A
|
||||
;;
|
||||
|
|
|
@ -230,9 +230,6 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re
|
|||
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
|
||||
* 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))
|
||||
return;
|
||||
|
||||
if (ia64_done_with_exception(regs))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Oops. The kernel tried to access some bad page. We'll have to terminate things
|
||||
* with extreme prejudice.
|
||||
|
|
|
@ -498,13 +498,11 @@ pcibios_enable_device (struct pci_dev *dev, int mask)
|
|||
return acpi_pci_irq_enable(dev);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI_DEALLOCATE_IRQ
|
||||
void
|
||||
pcibios_disable_device (struct pci_dev *dev)
|
||||
{
|
||||
acpi_pci_irq_disable(dev);
|
||||
}
|
||||
#endif /* CONFIG_ACPI_DEALLOCATE_IRQ */
|
||||
|
||||
void
|
||||
pcibios_align_resource (void *data, struct resource *res,
|
||||
|
|
|
@ -56,7 +56,7 @@
|
|||
|
||||
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];
|
||||
|
||||
|
|
|
@ -885,6 +885,10 @@ xpc_init(void)
|
|||
pid_t pid;
|
||||
|
||||
|
||||
if (!ia64_platform_is("sn2")) {
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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
|
||||
|
|
|
@ -636,6 +636,10 @@ xpnet_init(void)
|
|||
int result = -ENOMEM;
|
||||
|
||||
|
||||
if (!ia64_platform_is("sn2")) {
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
#if 0
|
||||
volatile unsigned long *pivrp;
|
||||
#if defined (CONFIG_MOD5272)
|
||||
volatile unsigned char *pivrp;
|
||||
|
||||
/* 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;
|
||||
#endif
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@ endif
|
|||
obj-$(CONFIG_COLDFIRE) += entry.o vectors.o ints.o
|
||||
obj-$(CONFIG_M5206) += timers.o
|
||||
obj-$(CONFIG_M5206e) += timers.o
|
||||
obj-$(CONFIG_M523x) += pit.o
|
||||
obj-$(CONFIG_M5249) += timers.o
|
||||
obj-$(CONFIG_M527x) += pit.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) 1999 D. Jeff Dionne
|
||||
|
@ -11,6 +13,8 @@
|
|||
* VZ Support/Fixes Evan Stawnyczy <e@lineo.ca>
|
||||
*/
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
#include <asm/dbg.h>
|
||||
#include <stdarg.h>
|
||||
#include <linux/config.h>
|
||||
|
@ -29,76 +33,16 @@
|
|||
#include <asm/machdep.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 */
|
||||
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)
|
||||
void m68328_reset (void)
|
||||
{
|
||||
local_irq_disable();
|
||||
asm volatile ("moveal #0x10c00000, %a0;\n\t"
|
||||
|
@ -108,18 +52,22 @@ void BSP_reset (void)
|
|||
"jmp (%a0);");
|
||||
}
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
void config_BSP(char *command, int len)
|
||||
{
|
||||
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/Pilot support Bernhard Kuhn <kuhn@lpr.e-technik.tu-muenchen.de>\n");
|
||||
|
||||
mach_sched_init = BSP_sched_init;
|
||||
mach_tick = BSP_tick;
|
||||
mach_gettimeoffset = BSP_gettimeoffset;
|
||||
mach_gettod = BSP_gettod;
|
||||
mach_sched_init = m68328_timer_init;
|
||||
mach_tick = m68328_timer_tick;
|
||||
mach_gettimeoffset = m68328_timer_gettimeoffset;
|
||||
mach_gettod = m68328_timer_gettod;
|
||||
mach_hwclk = NULL;
|
||||
mach_set_clock_mmss = NULL;
|
||||
mach_reset = BSP_reset;
|
||||
mach_reset = m68328_reset;
|
||||
*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) 1999 D. Jeff Dionne
|
||||
|
@ -9,6 +11,8 @@
|
|||
* for more details.
|
||||
*/
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <linux/config.h>
|
||||
#include <linux/types.h>
|
||||
|
@ -20,68 +24,22 @@
|
|||
#include <asm/setup.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/MC68EZ328.h>
|
||||
#ifdef CONFIG_UCSIMM
|
||||
#include <asm/bootstd.h>
|
||||
#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)
|
||||
{
|
||||
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)
|
||||
void m68ez328_reset(void)
|
||||
{
|
||||
local_irq_disable();
|
||||
asm volatile ("
|
||||
|
@ -93,6 +51,8 @@ void BSP_reset (void)
|
|||
");
|
||||
}
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
unsigned char *cs8900a_hwaddr;
|
||||
static int errno;
|
||||
|
||||
|
@ -119,11 +79,13 @@ void config_BSP(char *command, int len)
|
|||
else command[0] = 0;
|
||||
#endif
|
||||
|
||||
mach_sched_init = BSP_sched_init;
|
||||
mach_tick = BSP_tick;
|
||||
mach_gettimeoffset = BSP_gettimeoffset;
|
||||
mach_gettod = BSP_gettod;
|
||||
mach_sched_init = m68328_timer_init;
|
||||
mach_tick = m68328_timer_tick;
|
||||
mach_gettimeoffset = m68328_timer_gettimeoffset;
|
||||
mach_gettod = m68328_timer_gettod;
|
||||
mach_hwclk = 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) 1999 D. Jeff Dionne
|
||||
|
@ -10,6 +12,8 @@
|
|||
* for more details.
|
||||
*/
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
|
@ -25,66 +29,25 @@
|
|||
#include <asm/irq.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/MC68VZ328.h>
|
||||
#include <asm/bootstd.h>
|
||||
|
||||
#ifdef CONFIG_INIT_LCD
|
||||
#include "screen.h"
|
||||
#include "bootlogo.h"
|
||||
#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
|
||||
dragen2_sched_init(irqreturn_t (*timer_routine) (int, void *, struct pt_regs *))
|
||||
{
|
||||
/* disable timer 1 */
|
||||
TCTL = 0;
|
||||
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);
|
||||
|
||||
/* set ISR */
|
||||
if (request_irq(TMR_IRQ_NUM, timer_routine, IRQ_FLG_LOCK, "timer", NULL))
|
||||
panic("Unable to attach timer interrupt\n");
|
||||
/***************************************************************************/
|
||||
/* Init Drangon Engine hardware */
|
||||
/***************************************************************************/
|
||||
#if defined(CONFIG_DRAGEN2)
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
||||
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)
|
||||
static void m68vz328_reset(void)
|
||||
{
|
||||
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
|
||||
SCR = 0x10; /* allow user access to internal registers */
|
||||
|
@ -170,6 +133,60 @@ static void init_hardware(void)
|
|||
#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)
|
||||
{
|
||||
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);
|
||||
#endif
|
||||
|
||||
init_hardware();
|
||||
init_hardware(command, size);
|
||||
|
||||
mach_sched_init = (void *)dragen2_sched_init;
|
||||
mach_tick = dragen2_tick;
|
||||
mach_gettimeoffset = dragen2_gettimeoffset;
|
||||
mach_reset = dragen2_reset;
|
||||
mach_gettod = dragen2_gettod;
|
||||
mach_sched_init = (void *) m68328_timer_init;
|
||||
mach_tick = m68328_timer_tick;
|
||||
mach_gettimeoffset = m68328_timer_gettimeoffset;
|
||||
mach_gettod = m68328_timer_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)) {
|
||||
dev->vendor = 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);
|
||||
|
|
|
@ -140,12 +140,12 @@ struct platform_device ppc_sys_platform_devices[] = {
|
|||
},
|
||||
[MPC10X_UART0] = {
|
||||
.name = "serial8250",
|
||||
.id = 0,
|
||||
.id = PLAT8250_DEV_PLATFORM,
|
||||
.dev.platform_data = serial_plat_uart0,
|
||||
},
|
||||
[MPC10X_UART1] = {
|
||||
.name = "serial8250",
|
||||
.id = 1,
|
||||
.id = PLAT8250_DEV_PLATFORM1,
|
||||
.dev.platform_data = serial_plat_uart1,
|
||||
},
|
||||
|
||||
|
|
|
@ -165,7 +165,7 @@ struct platform_device ppc_sys_platform_devices[] = {
|
|||
},
|
||||
[MPC83xx_DUART] = {
|
||||
.name = "serial8250",
|
||||
.id = 0,
|
||||
.id = PLAT8250_DEV_PLATFORM,
|
||||
.dev.platform_data = serial_platform_data,
|
||||
},
|
||||
[MPC83xx_SEC2] = {
|
||||
|
|
|
@ -282,7 +282,7 @@ struct platform_device ppc_sys_platform_devices[] = {
|
|||
},
|
||||
[MPC85xx_DUART] = {
|
||||
.name = "serial8250",
|
||||
.id = 0,
|
||||
.id = PLAT8250_DEV_PLATFORM,
|
||||
.dev.platform_data = serial_platform_data,
|
||||
},
|
||||
[MPC85xx_PERFMON] = {
|
||||
|
|
|
@ -202,10 +202,9 @@ static void pci_addr_cache_print(struct pci_io_addr_cache *cache)
|
|||
while (n) {
|
||||
struct pci_io_addr_range *piar;
|
||||
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->addr_lo, piar->addr_hi, pci_name(piar->pcidev),
|
||||
pci_pretty_name(piar->pcidev));
|
||||
piar->addr_lo, piar->addr_hi, pci_name(piar->pcidev));
|
||||
cnt++;
|
||||
n = rb_next(n);
|
||||
}
|
||||
|
@ -260,8 +259,8 @@ static void __pci_addr_cache_insert_device(struct pci_dev *dev)
|
|||
|
||||
dn = pci_device_to_OF_node(dev);
|
||||
if (!dn) {
|
||||
printk(KERN_WARNING "PCI: no pci dn found for dev=%s %s\n",
|
||||
pci_name(dev), pci_pretty_name(dev));
|
||||
printk(KERN_WARNING "PCI: no pci dn found for dev=%s\n",
|
||||
pci_name(dev));
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -269,8 +268,8 @@ static void __pci_addr_cache_insert_device(struct pci_dev *dev)
|
|||
if (!(dn->eeh_mode & EEH_MODE_SUPPORTED) ||
|
||||
dn->eeh_mode & EEH_MODE_NOCHECK) {
|
||||
#ifdef DEBUG
|
||||
printk(KERN_INFO "PCI: skip building address cache for=%s %s\n",
|
||||
pci_name(dev), pci_pretty_name(dev));
|
||||
printk(KERN_INFO "PCI: skip building address cache for=%s\n",
|
||||
pci_name(dev));
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
@ -447,12 +446,12 @@ static void eeh_panic(struct pci_dev *dev, int reset_state)
|
|||
* in light of potential corruption, we can use it here.
|
||||
*/
|
||||
if (panic_on_oops)
|
||||
panic("EEH: MMIO failure (%d) on device:%s %s\n", reset_state,
|
||||
pci_name(dev), pci_pretty_name(dev));
|
||||
panic("EEH: MMIO failure (%d) on device:%s\n", reset_state,
|
||||
pci_name(dev));
|
||||
else {
|
||||
__get_cpu_var(ignored_failures)++;
|
||||
printk(KERN_INFO "EEH: Ignored MMIO failure (%d) on device:%s %s\n",
|
||||
reset_state, pci_name(dev), pci_pretty_name(dev));
|
||||
printk(KERN_INFO "EEH: Ignored MMIO failure (%d) on device:%s\n",
|
||||
reset_state, pci_name(dev));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -482,8 +481,8 @@ static void eeh_event_handler(void *dummy)
|
|||
break;
|
||||
|
||||
printk(KERN_INFO "EEH: MMIO failure (%d), notifiying device "
|
||||
"%s %s\n", event->reset_state,
|
||||
pci_name(event->dev), pci_pretty_name(event->dev));
|
||||
"%s\n", event->reset_state,
|
||||
pci_name(event->dev));
|
||||
|
||||
atomic_set(&eeh_fail_count, 0);
|
||||
notifier_call_chain (&eeh_notifier_chain,
|
||||
|
@ -851,8 +850,7 @@ void eeh_add_device_late(struct pci_dev *dev)
|
|||
return;
|
||||
|
||||
#ifdef DEBUG
|
||||
printk(KERN_DEBUG "EEH: adding device %s %s\n", pci_name(dev),
|
||||
pci_pretty_name(dev));
|
||||
printk(KERN_DEBUG "EEH: adding device %s\n", pci_name(dev));
|
||||
#endif
|
||||
|
||||
pci_addr_cache_insert_device (dev);
|
||||
|
@ -873,8 +871,7 @@ void eeh_remove_device(struct pci_dev *dev)
|
|||
|
||||
/* Unregister the device with the EEH/PCI address search system */
|
||||
#ifdef DEBUG
|
||||
printk(KERN_DEBUG "EEH: remove device %s %s\n", pci_name(dev),
|
||||
pci_pretty_name(dev));
|
||||
printk(KERN_DEBUG "EEH: remove device %s\n", pci_name(dev));
|
||||
#endif
|
||||
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 ",
|
||||
count, bus, PCI_SLOT(PciDev->devfn), PciDev->vendor,
|
||||
frame, card);
|
||||
if (pci_class_name(PciDev->class >> 8) == 0)
|
||||
printk("0x%04X\n", (int)(PciDev->class >> 8));
|
||||
else
|
||||
printk("%s\n", pci_class_name(PciDev->class >> 8));
|
||||
printk("0x%04X\n", (int)(PciDev->class >> 8));
|
||||
}
|
||||
|
|
|
@ -84,7 +84,6 @@ static void fixup_broken_pcnet32(struct pci_dev* dev)
|
|||
if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) {
|
||||
dev->vendor = 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);
|
||||
|
|
|
@ -1283,7 +1283,7 @@ void __init generic_find_legacy_serial_ports(u64 *physport,
|
|||
|
||||
static struct platform_device serial_device = {
|
||||
.name = "serial8250",
|
||||
.id = 0,
|
||||
.id = PLAT8250_DEV_PLATFORM,
|
||||
.dev = {
|
||||
.platform_data = serial_ports,
|
||||
},
|
||||
|
|
|
@ -359,134 +359,17 @@ void pcibios_fixup_bus(struct pci_bus *pbus)
|
|||
pbus->resource[1] = &pbm->mem_space;
|
||||
}
|
||||
|
||||
int pci_claim_resource(struct pci_dev *pdev, int resource)
|
||||
struct resource *pcibios_select_root(struct pci_dev *pdev, struct resource *r)
|
||||
{
|
||||
struct pci_pbm_info *pbm = pdev->bus->sysdata;
|
||||
struct resource *res = &pdev->resource[resource];
|
||||
struct resource *root;
|
||||
struct resource *root = NULL;
|
||||
|
||||
if (!pbm)
|
||||
return -EINVAL;
|
||||
|
||||
if (res->flags & IORESOURCE_IO)
|
||||
if (r->flags & IORESOURCE_IO)
|
||||
root = &pbm->io_space;
|
||||
else
|
||||
if (r->flags & IORESOURCE_MEM)
|
||||
root = &pbm->mem_space;
|
||||
|
||||
pbm->parent->resource_adjust(pdev, res, root);
|
||||
|
||||
return request_resource(root, res);
|
||||
}
|
||||
|
||||
/*
|
||||
* Given the PCI bus a device resides on, try to
|
||||
* find an acceptable resource allocation for a
|
||||
* specific device resource..
|
||||
*/
|
||||
static int pci_assign_bus_resource(const struct pci_bus *bus,
|
||||
struct pci_dev *dev,
|
||||
struct resource *res,
|
||||
unsigned long size,
|
||||
unsigned long min,
|
||||
int resno)
|
||||
{
|
||||
unsigned int type_mask;
|
||||
int i;
|
||||
|
||||
type_mask = IORESOURCE_IO | IORESOURCE_MEM;
|
||||
for (i = 0 ; i < 4; i++) {
|
||||
struct resource *r = bus->resource[i];
|
||||
if (!r)
|
||||
continue;
|
||||
|
||||
/* type_mask must match */
|
||||
if ((res->flags ^ r->flags) & type_mask)
|
||||
continue;
|
||||
|
||||
/* Ok, try it out.. */
|
||||
if (allocate_resource(r, res, size, min, -1, size, NULL, NULL) < 0)
|
||||
continue;
|
||||
|
||||
/* PCI config space updated by caller. */
|
||||
return 0;
|
||||
}
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
int pci_assign_resource(struct pci_dev *pdev, int resource)
|
||||
{
|
||||
struct pcidev_cookie *pcp = pdev->sysdata;
|
||||
struct pci_pbm_info *pbm = pcp->pbm;
|
||||
struct resource *res = &pdev->resource[resource];
|
||||
unsigned long min, size;
|
||||
int err;
|
||||
|
||||
if (res->flags & IORESOURCE_IO)
|
||||
min = pbm->io_space.start + 0x400UL;
|
||||
else
|
||||
min = pbm->mem_space.start;
|
||||
|
||||
size = res->end - res->start + 1;
|
||||
|
||||
err = pci_assign_bus_resource(pdev->bus, pdev, res, size, min, resource);
|
||||
|
||||
if (err < 0) {
|
||||
printk("PCI: Failed to allocate resource %d for %s\n",
|
||||
resource, pci_name(pdev));
|
||||
} else {
|
||||
/* Update PCI config space. */
|
||||
pbm->parent->base_address_update(pdev, resource);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Sort resources by alignment */
|
||||
void pdev_sort_resources(struct pci_dev *dev, struct resource_list *head)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < PCI_NUM_RESOURCES; i++) {
|
||||
struct resource *r;
|
||||
struct resource_list *list, *tmp;
|
||||
unsigned long r_align;
|
||||
|
||||
r = &dev->resource[i];
|
||||
r_align = r->end - r->start;
|
||||
|
||||
if (!(r->flags) || r->parent)
|
||||
continue;
|
||||
if (!r_align) {
|
||||
printk(KERN_WARNING "PCI: Ignore bogus resource %d "
|
||||
"[%lx:%lx] of %s\n",
|
||||
i, r->start, r->end, pci_name(dev));
|
||||
continue;
|
||||
}
|
||||
r_align = (i < PCI_BRIDGE_RESOURCES) ? r_align + 1 : r->start;
|
||||
for (list = head; ; list = list->next) {
|
||||
unsigned long align = 0;
|
||||
struct resource_list *ln = list->next;
|
||||
int idx;
|
||||
|
||||
if (ln) {
|
||||
idx = ln->res - &ln->dev->resource[0];
|
||||
align = (idx < PCI_BRIDGE_RESOURCES) ?
|
||||
ln->res->end - ln->res->start + 1 :
|
||||
ln->res->start;
|
||||
}
|
||||
if (r_align > align) {
|
||||
tmp = kmalloc(sizeof(*tmp), GFP_KERNEL);
|
||||
if (!tmp)
|
||||
panic("pdev_sort_resources(): "
|
||||
"kmalloc() failed!\n");
|
||||
tmp->next = ln;
|
||||
tmp->res = r;
|
||||
tmp->dev = dev;
|
||||
list->next = tmp;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return root;
|
||||
}
|
||||
|
||||
void pcibios_update_irq(struct pci_dev *pdev, int irq)
|
||||
|
|
|
@ -307,7 +307,7 @@ static unsigned char psycho_pil_table[] = {
|
|||
/*0x32*/15, /* Power Management */
|
||||
};
|
||||
|
||||
static int __init psycho_ino_to_pil(struct pci_dev *pdev, unsigned int ino)
|
||||
static int psycho_ino_to_pil(struct pci_dev *pdev, unsigned int ino)
|
||||
{
|
||||
int ret;
|
||||
|
||||
|
@ -344,9 +344,9 @@ static int __init psycho_ino_to_pil(struct pci_dev *pdev, unsigned int ino)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static unsigned int __init psycho_irq_build(struct pci_pbm_info *pbm,
|
||||
struct pci_dev *pdev,
|
||||
unsigned int ino)
|
||||
static unsigned int psycho_irq_build(struct pci_pbm_info *pbm,
|
||||
struct pci_dev *pdev,
|
||||
unsigned int ino)
|
||||
{
|
||||
struct ino_bucket *bucket;
|
||||
unsigned long imap, iclr;
|
||||
|
@ -1024,7 +1024,7 @@ static irqreturn_t psycho_pcierr_intr(int irq, void *dev_id, struct pt_regs *reg
|
|||
#define PSYCHO_CE_INO 0x2f
|
||||
#define PSYCHO_PCIERR_A_INO 0x30
|
||||
#define PSYCHO_PCIERR_B_INO 0x31
|
||||
static void __init psycho_register_error_handlers(struct pci_controller_info *p)
|
||||
static void psycho_register_error_handlers(struct pci_controller_info *p)
|
||||
{
|
||||
struct pci_pbm_info *pbm = &p->pbm_A; /* arbitrary */
|
||||
unsigned long base = p->pbm_A.controller_regs;
|
||||
|
@ -1091,15 +1091,15 @@ static void __init psycho_register_error_handlers(struct pci_controller_info *p)
|
|||
}
|
||||
|
||||
/* PSYCHO boot time probing and initialization. */
|
||||
static void __init psycho_resource_adjust(struct pci_dev *pdev,
|
||||
struct resource *res,
|
||||
struct resource *root)
|
||||
static void psycho_resource_adjust(struct pci_dev *pdev,
|
||||
struct resource *res,
|
||||
struct resource *root)
|
||||
{
|
||||
res->start += root->start;
|
||||
res->end += root->start;
|
||||
}
|
||||
|
||||
static void __init psycho_base_address_update(struct pci_dev *pdev, int resource)
|
||||
static void psycho_base_address_update(struct pci_dev *pdev, int resource)
|
||||
{
|
||||
struct pcidev_cookie *pcp = pdev->sysdata;
|
||||
struct pci_pbm_info *pbm = pcp->pbm;
|
||||
|
@ -1144,7 +1144,7 @@ static void __init psycho_base_address_update(struct pci_dev *pdev, int resource
|
|||
pci_write_config_dword(pdev, where + 4, 0);
|
||||
}
|
||||
|
||||
static void __init pbm_config_busmastering(struct pci_pbm_info *pbm)
|
||||
static void pbm_config_busmastering(struct pci_pbm_info *pbm)
|
||||
{
|
||||
u8 *addr;
|
||||
|
||||
|
@ -1161,8 +1161,8 @@ static void __init pbm_config_busmastering(struct pci_pbm_info *pbm)
|
|||
pci_config_write8(addr, 64);
|
||||
}
|
||||
|
||||
static void __init pbm_scan_bus(struct pci_controller_info *p,
|
||||
struct pci_pbm_info *pbm)
|
||||
static void pbm_scan_bus(struct pci_controller_info *p,
|
||||
struct pci_pbm_info *pbm)
|
||||
{
|
||||
struct pcidev_cookie *cookie = kmalloc(sizeof(*cookie), GFP_KERNEL);
|
||||
|
||||
|
@ -1189,7 +1189,7 @@ static void __init pbm_scan_bus(struct pci_controller_info *p,
|
|||
pci_setup_busmastering(pbm, pbm->pci_bus);
|
||||
}
|
||||
|
||||
static void __init psycho_scan_bus(struct pci_controller_info *p)
|
||||
static void psycho_scan_bus(struct pci_controller_info *p)
|
||||
{
|
||||
pbm_config_busmastering(&p->pbm_B);
|
||||
p->pbm_B.is_66mhz_capable = 0;
|
||||
|
@ -1204,7 +1204,7 @@ static void __init psycho_scan_bus(struct pci_controller_info *p)
|
|||
psycho_register_error_handlers(p);
|
||||
}
|
||||
|
||||
static void __init psycho_iommu_init(struct pci_controller_info *p)
|
||||
static void psycho_iommu_init(struct pci_controller_info *p)
|
||||
{
|
||||
struct pci_iommu *iommu = p->pbm_A.iommu;
|
||||
unsigned long tsbbase, i;
|
||||
|
@ -1327,8 +1327,8 @@ static void psycho_controller_hwinit(struct pci_controller_info *p)
|
|||
psycho_write(p->pbm_A.controller_regs + PSYCHO_PCIB_DIAG, tmp);
|
||||
}
|
||||
|
||||
static void __init pbm_register_toplevel_resources(struct pci_controller_info *p,
|
||||
struct pci_pbm_info *pbm)
|
||||
static void pbm_register_toplevel_resources(struct pci_controller_info *p,
|
||||
struct pci_pbm_info *pbm)
|
||||
{
|
||||
char *name = pbm->name;
|
||||
|
||||
|
@ -1481,7 +1481,7 @@ static void psycho_pbm_init(struct pci_controller_info *p,
|
|||
|
||||
#define PSYCHO_CONFIGSPACE 0x001000000UL
|
||||
|
||||
void __init psycho_init(int node, char *model_name)
|
||||
void psycho_init(int node, char *model_name)
|
||||
{
|
||||
struct linux_prom64_registers pr_regs[3];
|
||||
struct pci_controller_info *p;
|
||||
|
|
|
@ -554,7 +554,7 @@ static unsigned char sabre_pil_table[] = {
|
|||
/*0x32*/15, /* Power Management */
|
||||
};
|
||||
|
||||
static int __init sabre_ino_to_pil(struct pci_dev *pdev, unsigned int ino)
|
||||
static int sabre_ino_to_pil(struct pci_dev *pdev, unsigned int ino)
|
||||
{
|
||||
int ret;
|
||||
|
||||
|
@ -612,9 +612,9 @@ static void sabre_wsync_handler(struct ino_bucket *bucket, void *_arg1, void *_a
|
|||
sabre_read(sync_reg);
|
||||
}
|
||||
|
||||
static unsigned int __init sabre_irq_build(struct pci_pbm_info *pbm,
|
||||
struct pci_dev *pdev,
|
||||
unsigned int ino)
|
||||
static unsigned int sabre_irq_build(struct pci_pbm_info *pbm,
|
||||
struct pci_dev *pdev,
|
||||
unsigned int ino)
|
||||
{
|
||||
struct ino_bucket *bucket;
|
||||
unsigned long imap, iclr;
|
||||
|
@ -1009,7 +1009,7 @@ static irqreturn_t sabre_pcierr_intr(int irq, void *dev_id, struct pt_regs *regs
|
|||
#define SABRE_UE_INO 0x2e
|
||||
#define SABRE_CE_INO 0x2f
|
||||
#define SABRE_PCIERR_INO 0x30
|
||||
static void __init sabre_register_error_handlers(struct pci_controller_info *p)
|
||||
static void sabre_register_error_handlers(struct pci_controller_info *p)
|
||||
{
|
||||
struct pci_pbm_info *pbm = &p->pbm_A; /* arbitrary */
|
||||
unsigned long base = pbm->controller_regs;
|
||||
|
@ -1056,9 +1056,9 @@ static void __init sabre_register_error_handlers(struct pci_controller_info *p)
|
|||
sabre_write(base + SABRE_PCICTRL, tmp);
|
||||
}
|
||||
|
||||
static void __init sabre_resource_adjust(struct pci_dev *pdev,
|
||||
struct resource *res,
|
||||
struct resource *root)
|
||||
static void sabre_resource_adjust(struct pci_dev *pdev,
|
||||
struct resource *res,
|
||||
struct resource *root)
|
||||
{
|
||||
struct pci_pbm_info *pbm = pdev->bus->sysdata;
|
||||
unsigned long base;
|
||||
|
@ -1072,7 +1072,7 @@ static void __init sabre_resource_adjust(struct pci_dev *pdev,
|
|||
res->end += base;
|
||||
}
|
||||
|
||||
static void __init sabre_base_address_update(struct pci_dev *pdev, int resource)
|
||||
static void sabre_base_address_update(struct pci_dev *pdev, int resource)
|
||||
{
|
||||
struct pcidev_cookie *pcp = pdev->sysdata;
|
||||
struct pci_pbm_info *pbm = pcp->pbm;
|
||||
|
@ -1118,7 +1118,7 @@ static void __init sabre_base_address_update(struct pci_dev *pdev, int resource)
|
|||
pci_write_config_dword(pdev, where + 4, 0);
|
||||
}
|
||||
|
||||
static void __init apb_init(struct pci_controller_info *p, struct pci_bus *sabre_bus)
|
||||
static void apb_init(struct pci_controller_info *p, struct pci_bus *sabre_bus)
|
||||
{
|
||||
struct pci_dev *pdev;
|
||||
|
||||
|
@ -1181,7 +1181,7 @@ static struct pcidev_cookie *alloc_bridge_cookie(struct pci_pbm_info *pbm)
|
|||
return cookie;
|
||||
}
|
||||
|
||||
static void __init sabre_scan_bus(struct pci_controller_info *p)
|
||||
static void sabre_scan_bus(struct pci_controller_info *p)
|
||||
{
|
||||
static int once;
|
||||
struct pci_bus *sabre_bus, *pbus;
|
||||
|
@ -1262,9 +1262,9 @@ static void __init sabre_scan_bus(struct pci_controller_info *p)
|
|||
sabre_register_error_handlers(p);
|
||||
}
|
||||
|
||||
static void __init sabre_iommu_init(struct pci_controller_info *p,
|
||||
int tsbsize, unsigned long dvma_offset,
|
||||
u32 dma_mask)
|
||||
static void sabre_iommu_init(struct pci_controller_info *p,
|
||||
int tsbsize, unsigned long dvma_offset,
|
||||
u32 dma_mask)
|
||||
{
|
||||
struct pci_iommu *iommu = p->pbm_A.iommu;
|
||||
unsigned long tsbbase, i, order;
|
||||
|
@ -1345,8 +1345,8 @@ static void __init sabre_iommu_init(struct pci_controller_info *p,
|
|||
}
|
||||
}
|
||||
|
||||
static void __init pbm_register_toplevel_resources(struct pci_controller_info *p,
|
||||
struct pci_pbm_info *pbm)
|
||||
static void pbm_register_toplevel_resources(struct pci_controller_info *p,
|
||||
struct pci_pbm_info *pbm)
|
||||
{
|
||||
char *name = pbm->name;
|
||||
unsigned long ibase = p->pbm_A.controller_regs + SABRE_IOSPACE;
|
||||
|
@ -1415,7 +1415,7 @@ static void __init pbm_register_toplevel_resources(struct pci_controller_info *p
|
|||
&pbm->mem_space);
|
||||
}
|
||||
|
||||
static void __init sabre_pbm_init(struct pci_controller_info *p, int sabre_node, u32 dma_begin)
|
||||
static void sabre_pbm_init(struct pci_controller_info *p, int sabre_node, u32 dma_begin)
|
||||
{
|
||||
struct pci_pbm_info *pbm;
|
||||
char namebuf[128];
|
||||
|
@ -1552,7 +1552,7 @@ static void __init sabre_pbm_init(struct pci_controller_info *p, int sabre_node,
|
|||
}
|
||||
}
|
||||
|
||||
void __init sabre_init(int pnode, char *model_name)
|
||||
void sabre_init(int pnode, char *model_name)
|
||||
{
|
||||
struct linux_prom64_registers pr_regs[2];
|
||||
struct pci_controller_info *p;
|
||||
|
|
|
@ -285,7 +285,7 @@ static unsigned char schizo_pil_table[] = {
|
|||
/*0x3f*/0, /* Reserved for NewLink */
|
||||
};
|
||||
|
||||
static int __init schizo_ino_to_pil(struct pci_dev *pdev, unsigned int ino)
|
||||
static int schizo_ino_to_pil(struct pci_dev *pdev, unsigned int ino)
|
||||
{
|
||||
int ret;
|
||||
|
||||
|
@ -1221,7 +1221,7 @@ static irqreturn_t schizo_safarierr_intr(int irq, void *dev_id, struct pt_regs *
|
|||
* PCI bus units of the same Tomatillo. I still have not really
|
||||
* figured this out...
|
||||
*/
|
||||
static void __init tomatillo_register_error_handlers(struct pci_controller_info *p)
|
||||
static void tomatillo_register_error_handlers(struct pci_controller_info *p)
|
||||
{
|
||||
struct pci_pbm_info *pbm;
|
||||
unsigned int irq;
|
||||
|
@ -1359,7 +1359,7 @@ static void __init tomatillo_register_error_handlers(struct pci_controller_info
|
|||
(SCHIZO_SAFIRQCTRL_EN | (BUS_ERROR_UNMAP)));
|
||||
}
|
||||
|
||||
static void __init schizo_register_error_handlers(struct pci_controller_info *p)
|
||||
static void schizo_register_error_handlers(struct pci_controller_info *p)
|
||||
{
|
||||
struct pci_pbm_info *pbm;
|
||||
unsigned int irq;
|
||||
|
@ -1505,7 +1505,7 @@ static void __init schizo_register_error_handlers(struct pci_controller_info *p)
|
|||
(SCHIZO_SAFIRQCTRL_EN | (BUS_ERROR_UNMAP)));
|
||||
}
|
||||
|
||||
static void __init pbm_config_busmastering(struct pci_pbm_info *pbm)
|
||||
static void pbm_config_busmastering(struct pci_pbm_info *pbm)
|
||||
{
|
||||
u8 *addr;
|
||||
|
||||
|
@ -1522,8 +1522,8 @@ static void __init pbm_config_busmastering(struct pci_pbm_info *pbm)
|
|||
pci_config_write8(addr, 64);
|
||||
}
|
||||
|
||||
static void __init pbm_scan_bus(struct pci_controller_info *p,
|
||||
struct pci_pbm_info *pbm)
|
||||
static void pbm_scan_bus(struct pci_controller_info *p,
|
||||
struct pci_pbm_info *pbm)
|
||||
{
|
||||
struct pcidev_cookie *cookie = kmalloc(sizeof(*cookie), GFP_KERNEL);
|
||||
|
||||
|
@ -1550,8 +1550,8 @@ static void __init pbm_scan_bus(struct pci_controller_info *p,
|
|||
pci_setup_busmastering(pbm, pbm->pci_bus);
|
||||
}
|
||||
|
||||
static void __init __schizo_scan_bus(struct pci_controller_info *p,
|
||||
int chip_type)
|
||||
static void __schizo_scan_bus(struct pci_controller_info *p,
|
||||
int chip_type)
|
||||
{
|
||||
if (!p->pbm_B.prom_node || !p->pbm_A.prom_node) {
|
||||
printk("PCI: Only one PCI bus module of controller found.\n");
|
||||
|
@ -1577,17 +1577,17 @@ static void __init __schizo_scan_bus(struct pci_controller_info *p,
|
|||
schizo_register_error_handlers(p);
|
||||
}
|
||||
|
||||
static void __init schizo_scan_bus(struct pci_controller_info *p)
|
||||
static void schizo_scan_bus(struct pci_controller_info *p)
|
||||
{
|
||||
__schizo_scan_bus(p, PBM_CHIP_TYPE_SCHIZO);
|
||||
}
|
||||
|
||||
static void __init tomatillo_scan_bus(struct pci_controller_info *p)
|
||||
static void tomatillo_scan_bus(struct pci_controller_info *p)
|
||||
{
|
||||
__schizo_scan_bus(p, PBM_CHIP_TYPE_TOMATILLO);
|
||||
}
|
||||
|
||||
static void __init schizo_base_address_update(struct pci_dev *pdev, int resource)
|
||||
static void schizo_base_address_update(struct pci_dev *pdev, int resource)
|
||||
{
|
||||
struct pcidev_cookie *pcp = pdev->sysdata;
|
||||
struct pci_pbm_info *pbm = pcp->pbm;
|
||||
|
@ -1632,9 +1632,9 @@ static void __init schizo_base_address_update(struct pci_dev *pdev, int resource
|
|||
pci_write_config_dword(pdev, where + 4, 0);
|
||||
}
|
||||
|
||||
static void __init schizo_resource_adjust(struct pci_dev *pdev,
|
||||
struct resource *res,
|
||||
struct resource *root)
|
||||
static void schizo_resource_adjust(struct pci_dev *pdev,
|
||||
struct resource *res,
|
||||
struct resource *root)
|
||||
{
|
||||
res->start += root->start;
|
||||
res->end += root->start;
|
||||
|
@ -1702,8 +1702,8 @@ static void schizo_determine_mem_io_space(struct pci_pbm_info *pbm)
|
|||
pbm->mem_space.start);
|
||||
}
|
||||
|
||||
static void __init pbm_register_toplevel_resources(struct pci_controller_info *p,
|
||||
struct pci_pbm_info *pbm)
|
||||
static void pbm_register_toplevel_resources(struct pci_controller_info *p,
|
||||
struct pci_pbm_info *pbm)
|
||||
{
|
||||
pbm->io_space.name = pbm->mem_space.name = pbm->name;
|
||||
|
||||
|
@ -1932,7 +1932,7 @@ static void schizo_pbm_iommu_init(struct pci_pbm_info *pbm)
|
|||
#define TOMATILLO_PCI_IOC_TDIAG (0x2250UL)
|
||||
#define TOMATILLO_PCI_IOC_DDIAG (0x2290UL)
|
||||
|
||||
static void __init schizo_pbm_hw_init(struct pci_pbm_info *pbm)
|
||||
static void schizo_pbm_hw_init(struct pci_pbm_info *pbm)
|
||||
{
|
||||
u64 tmp;
|
||||
|
||||
|
@ -1986,9 +1986,9 @@ static void __init schizo_pbm_hw_init(struct pci_pbm_info *pbm)
|
|||
}
|
||||
}
|
||||
|
||||
static void __init schizo_pbm_init(struct pci_controller_info *p,
|
||||
int prom_node, u32 portid,
|
||||
int chip_type)
|
||||
static void schizo_pbm_init(struct pci_controller_info *p,
|
||||
int prom_node, u32 portid,
|
||||
int chip_type)
|
||||
{
|
||||
struct linux_prom64_registers pr_regs[4];
|
||||
unsigned int busrange[2];
|
||||
|
@ -2145,7 +2145,7 @@ static inline int portid_compare(u32 x, u32 y, int chip_type)
|
|||
return (x == y);
|
||||
}
|
||||
|
||||
static void __init __schizo_init(int node, char *model_name, int chip_type)
|
||||
static void __schizo_init(int node, char *model_name, int chip_type)
|
||||
{
|
||||
struct pci_controller_info *p;
|
||||
struct pci_iommu *iommu;
|
||||
|
@ -2213,17 +2213,17 @@ static void __init __schizo_init(int node, char *model_name, int chip_type)
|
|||
schizo_pbm_init(p, node, portid, chip_type);
|
||||
}
|
||||
|
||||
void __init schizo_init(int node, char *model_name)
|
||||
void schizo_init(int node, char *model_name)
|
||||
{
|
||||
__schizo_init(node, model_name, PBM_CHIP_TYPE_SCHIZO);
|
||||
}
|
||||
|
||||
void __init schizo_plus_init(int node, char *model_name)
|
||||
void schizo_plus_init(int node, char *model_name)
|
||||
{
|
||||
__schizo_init(node, model_name, PBM_CHIP_TYPE_SCHIZO_PLUS);
|
||||
}
|
||||
|
||||
void __init tomatillo_init(int node, char *model_name)
|
||||
void tomatillo_init(int node, char *model_name)
|
||||
{
|
||||
__schizo_init(node, model_name, PBM_CHIP_TYPE_TOMATILLO);
|
||||
}
|
||||
|
|
|
@ -403,12 +403,3 @@ EXPORT_SYMBOL(xor_vis_4);
|
|||
EXPORT_SYMBOL(xor_vis_5);
|
||||
|
||||
EXPORT_SYMBOL(prom_palette);
|
||||
|
||||
/* memory barriers */
|
||||
EXPORT_SYMBOL(mb);
|
||||
EXPORT_SYMBOL(rmb);
|
||||
EXPORT_SYMBOL(wmb);
|
||||
EXPORT_SYMBOL(membar_storeload);
|
||||
EXPORT_SYMBOL(membar_storeload_storestore);
|
||||
EXPORT_SYMBOL(membar_storeload_loadload);
|
||||
EXPORT_SYMBOL(membar_storestore_loadstore);
|
||||
|
|
|
@ -12,7 +12,7 @@ lib-y := PeeCeeI.o copy_page.o clear_page.o strlen.o strncmp.o \
|
|||
U1memcpy.o U1copy_from_user.o U1copy_to_user.o \
|
||||
U3memcpy.o U3copy_from_user.o U3copy_to_user.o U3patch.o \
|
||||
copy_in_user.o user_fixup.o memmove.o \
|
||||
mcount.o ipcsum.o rwsem.o xor.o find_bit.o delay.o mb.o
|
||||
mcount.o ipcsum.o rwsem.o xor.o find_bit.o delay.o
|
||||
|
||||
lib-$(CONFIG_DEBUG_SPINLOCK) += debuglocks.o
|
||||
lib-$(CONFIG_HAVE_DEC_LOCK) += dec_and_lock.o
|
||||
|
|
|
@ -1,73 +0,0 @@
|
|||
/* mb.S: Out of line memory barriers.
|
||||
*
|
||||
* Copyright (C) 2005 David S. Miller (davem@davemloft.net)
|
||||
*/
|
||||
|
||||
/* These are here in an effort to more fully work around
|
||||
* Spitfire Errata #51. Essentially, if a memory barrier
|
||||
* occurs soon after a mispredicted branch, the chip can stop
|
||||
* executing instructions until a trap occurs. Therefore, if
|
||||
* interrupts are disabled, the chip can hang forever.
|
||||
*
|
||||
* It used to be believed that the memory barrier had to be
|
||||
* right in the delay slot, but a case has been traced
|
||||
* recently wherein the memory barrier was one instruction
|
||||
* after the branch delay slot and the chip still hung. The
|
||||
* offending sequence was the following in sym_wakeup_done()
|
||||
* of the sym53c8xx_2 driver:
|
||||
*
|
||||
* call sym_ccb_from_dsa, 0
|
||||
* movge %icc, 0, %l0
|
||||
* brz,pn %o0, .LL1303
|
||||
* mov %o0, %l2
|
||||
* membar #LoadLoad
|
||||
*
|
||||
* The branch has to be mispredicted for the bug to occur.
|
||||
* Therefore, we put the memory barrier explicitly into a
|
||||
* "branch always, predicted taken" delay slot to avoid the
|
||||
* problem case.
|
||||
*/
|
||||
|
||||
.text
|
||||
|
||||
99: retl
|
||||
nop
|
||||
|
||||
.globl mb
|
||||
mb: ba,pt %xcc, 99b
|
||||
membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad
|
||||
.size mb, .-mb
|
||||
|
||||
.globl rmb
|
||||
rmb: ba,pt %xcc, 99b
|
||||
membar #LoadLoad
|
||||
.size rmb, .-rmb
|
||||
|
||||
.globl wmb
|
||||
wmb: ba,pt %xcc, 99b
|
||||
membar #StoreStore
|
||||
.size wmb, .-wmb
|
||||
|
||||
.globl membar_storeload
|
||||
membar_storeload:
|
||||
ba,pt %xcc, 99b
|
||||
membar #StoreLoad
|
||||
.size membar_storeload, .-membar_storeload
|
||||
|
||||
.globl membar_storeload_storestore
|
||||
membar_storeload_storestore:
|
||||
ba,pt %xcc, 99b
|
||||
membar #StoreLoad | #StoreStore
|
||||
.size membar_storeload_storestore, .-membar_storeload_storestore
|
||||
|
||||
.globl membar_storeload_loadload
|
||||
membar_storeload_loadload:
|
||||
ba,pt %xcc, 99b
|
||||
membar #StoreLoad | #LoadLoad
|
||||
.size membar_storeload_loadload, .-membar_storeload_loadload
|
||||
|
||||
.globl membar_storestore_loadstore
|
||||
membar_storestore_loadstore:
|
||||
ba,pt %xcc, 99b
|
||||
membar #StoreStore | #LoadStore
|
||||
.size membar_storestore_loadstore, .-membar_storestore_loadstore
|
|
@ -16,9 +16,10 @@
|
|||
* -- verify the 13 conditions and do bulk resets
|
||||
* -- kill last_pipe and simply do two-state clearing on both pipes
|
||||
* -- verify protocol (bulk) from USB descriptors (maybe...)
|
||||
* -- highmem and sg
|
||||
* -- highmem
|
||||
* -- move top_sense and work_bcs into separate allocations (if they survive)
|
||||
* for cache purists and esoteric architectures.
|
||||
* -- Allocate structure for LUN 0 before the first ub_sync_tur, avoid NULL. ?
|
||||
* -- prune comments, they are too volumnous
|
||||
* -- Exterminate P3 printks
|
||||
* -- Resove XXX's
|
||||
|
@ -171,7 +172,7 @@ struct bulk_cs_wrap {
|
|||
*/
|
||||
struct ub_dev;
|
||||
|
||||
#define UB_MAX_REQ_SG 1
|
||||
#define UB_MAX_REQ_SG 4
|
||||
#define UB_MAX_SECTORS 64
|
||||
|
||||
/*
|
||||
|
@ -234,13 +235,10 @@ struct ub_scsi_cmd {
|
|||
|
||||
int stat_count; /* Retries getting status. */
|
||||
|
||||
/*
|
||||
* We do not support transfers from highmem pages
|
||||
* because the underlying USB framework does not do what we need.
|
||||
*/
|
||||
char *data; /* Requested buffer */
|
||||
unsigned int len; /* Requested length */
|
||||
// struct scatterlist sgv[UB_MAX_REQ_SG];
|
||||
unsigned int current_sg;
|
||||
unsigned int nsg; /* sgv[nsg] */
|
||||
struct scatterlist sgv[UB_MAX_REQ_SG];
|
||||
|
||||
struct ub_lun *lun;
|
||||
void (*done)(struct ub_dev *, struct ub_scsi_cmd *);
|
||||
|
@ -389,17 +387,18 @@ struct ub_dev {
|
|||
struct bulk_cs_wrap work_bcs;
|
||||
struct usb_ctrlrequest work_cr;
|
||||
|
||||
int sg_stat[UB_MAX_REQ_SG+1];
|
||||
struct ub_scsi_trace tr;
|
||||
};
|
||||
|
||||
/*
|
||||
*/
|
||||
static void ub_cleanup(struct ub_dev *sc);
|
||||
static int ub_bd_rq_fn_1(struct ub_lun *lun, struct request *rq);
|
||||
static int ub_request_fn_1(struct ub_lun *lun, struct request *rq);
|
||||
static int ub_cmd_build_block(struct ub_dev *sc, struct ub_lun *lun,
|
||||
struct ub_scsi_cmd *cmd, struct request *rq);
|
||||
static int ub_cmd_build_packet(struct ub_dev *sc, struct ub_scsi_cmd *cmd,
|
||||
struct request *rq);
|
||||
static int ub_cmd_build_packet(struct ub_dev *sc, struct ub_lun *lun,
|
||||
struct ub_scsi_cmd *cmd, struct request *rq);
|
||||
static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd);
|
||||
static void ub_end_rq(struct request *rq, int uptodate);
|
||||
static int ub_submit_scsi(struct ub_dev *sc, struct ub_scsi_cmd *cmd);
|
||||
|
@ -407,6 +406,7 @@ static void ub_urb_complete(struct urb *urb, struct pt_regs *pt);
|
|||
static void ub_scsi_action(unsigned long _dev);
|
||||
static void ub_scsi_dispatch(struct ub_dev *sc);
|
||||
static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd);
|
||||
static void ub_data_start(struct ub_dev *sc, struct ub_scsi_cmd *cmd);
|
||||
static void ub_state_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd, int rc);
|
||||
static int __ub_state_stat(struct ub_dev *sc, struct ub_scsi_cmd *cmd);
|
||||
static void ub_state_stat(struct ub_dev *sc, struct ub_scsi_cmd *cmd);
|
||||
|
@ -500,7 +500,8 @@ static void ub_cmdtr_sense(struct ub_dev *sc, struct ub_scsi_cmd *cmd,
|
|||
}
|
||||
}
|
||||
|
||||
static ssize_t ub_diag_show(struct device *dev, struct device_attribute *attr, char *page)
|
||||
static ssize_t ub_diag_show(struct device *dev, struct device_attribute *attr,
|
||||
char *page)
|
||||
{
|
||||
struct usb_interface *intf;
|
||||
struct ub_dev *sc;
|
||||
|
@ -523,6 +524,13 @@ static ssize_t ub_diag_show(struct device *dev, struct device_attribute *attr, c
|
|||
cnt += sprintf(page + cnt,
|
||||
"qlen %d qmax %d\n",
|
||||
sc->cmd_queue.qlen, sc->cmd_queue.qmax);
|
||||
cnt += sprintf(page + cnt,
|
||||
"sg %d %d %d %d %d\n",
|
||||
sc->sg_stat[0],
|
||||
sc->sg_stat[1],
|
||||
sc->sg_stat[2],
|
||||
sc->sg_stat[3],
|
||||
sc->sg_stat[4]);
|
||||
|
||||
list_for_each (p, &sc->luns) {
|
||||
lun = list_entry(p, struct ub_lun, link);
|
||||
|
@ -744,20 +752,20 @@ static struct ub_scsi_cmd *ub_cmdq_pop(struct ub_dev *sc)
|
|||
* The request function is our main entry point
|
||||
*/
|
||||
|
||||
static void ub_bd_rq_fn(request_queue_t *q)
|
||||
static void ub_request_fn(request_queue_t *q)
|
||||
{
|
||||
struct ub_lun *lun = q->queuedata;
|
||||
struct request *rq;
|
||||
|
||||
while ((rq = elv_next_request(q)) != NULL) {
|
||||
if (ub_bd_rq_fn_1(lun, rq) != 0) {
|
||||
if (ub_request_fn_1(lun, rq) != 0) {
|
||||
blk_stop_queue(q);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int ub_bd_rq_fn_1(struct ub_lun *lun, struct request *rq)
|
||||
static int ub_request_fn_1(struct ub_lun *lun, struct request *rq)
|
||||
{
|
||||
struct ub_dev *sc = lun->udev;
|
||||
struct ub_scsi_cmd *cmd;
|
||||
|
@ -774,9 +782,8 @@ static int ub_bd_rq_fn_1(struct ub_lun *lun, struct request *rq)
|
|||
memset(cmd, 0, sizeof(struct ub_scsi_cmd));
|
||||
|
||||
blkdev_dequeue_request(rq);
|
||||
|
||||
if (blk_pc_request(rq)) {
|
||||
rc = ub_cmd_build_packet(sc, cmd, rq);
|
||||
rc = ub_cmd_build_packet(sc, lun, cmd, rq);
|
||||
} else {
|
||||
rc = ub_cmd_build_block(sc, lun, cmd, rq);
|
||||
}
|
||||
|
@ -791,7 +798,7 @@ static int ub_bd_rq_fn_1(struct ub_lun *lun, struct request *rq)
|
|||
cmd->back = rq;
|
||||
|
||||
cmd->tag = sc->tagcnt++;
|
||||
if ((rc = ub_submit_scsi(sc, cmd)) != 0) {
|
||||
if (ub_submit_scsi(sc, cmd) != 0) {
|
||||
ub_put_cmd(lun, cmd);
|
||||
ub_end_rq(rq, 0);
|
||||
return 0;
|
||||
|
@ -804,58 +811,31 @@ static int ub_cmd_build_block(struct ub_dev *sc, struct ub_lun *lun,
|
|||
struct ub_scsi_cmd *cmd, struct request *rq)
|
||||
{
|
||||
int ub_dir;
|
||||
#if 0 /* We use rq->buffer for now */
|
||||
struct scatterlist *sg;
|
||||
int n_elem;
|
||||
#endif
|
||||
unsigned int block, nblks;
|
||||
|
||||
if (rq_data_dir(rq) == WRITE)
|
||||
ub_dir = UB_DIR_WRITE;
|
||||
else
|
||||
ub_dir = UB_DIR_READ;
|
||||
cmd->dir = ub_dir;
|
||||
|
||||
/*
|
||||
* get scatterlist from block layer
|
||||
*/
|
||||
#if 0 /* We use rq->buffer for now */
|
||||
sg = &cmd->sgv[0];
|
||||
n_elem = blk_rq_map_sg(q, rq, sg);
|
||||
n_elem = blk_rq_map_sg(lun->disk->queue, rq, &cmd->sgv[0]);
|
||||
if (n_elem <= 0) {
|
||||
ub_put_cmd(lun, cmd);
|
||||
ub_end_rq(rq, 0);
|
||||
blk_start_queue(q);
|
||||
return 0; /* request with no s/g entries? */
|
||||
printk(KERN_INFO "%s: failed request map (%d)\n",
|
||||
sc->name, n_elem); /* P3 */
|
||||
return -1; /* request with no s/g entries? */
|
||||
}
|
||||
|
||||
if (n_elem != 1) { /* Paranoia */
|
||||
if (n_elem > UB_MAX_REQ_SG) { /* Paranoia */
|
||||
printk(KERN_WARNING "%s: request with %d segments\n",
|
||||
sc->name, n_elem);
|
||||
ub_put_cmd(lun, cmd);
|
||||
ub_end_rq(rq, 0);
|
||||
blk_start_queue(q);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* XXX Unfortunately, this check does not work. It is quite possible
|
||||
* to get bogus non-null rq->buffer if you allow sg by mistake.
|
||||
*/
|
||||
if (rq->buffer == NULL) {
|
||||
/*
|
||||
* This must not happen if we set the queue right.
|
||||
* The block level must create bounce buffers for us.
|
||||
*/
|
||||
static int do_print = 1;
|
||||
if (do_print) {
|
||||
printk(KERN_WARNING "%s: unmapped block request"
|
||||
" flags 0x%lx sectors %lu\n",
|
||||
sc->name, rq->flags, rq->nr_sectors);
|
||||
do_print = 0;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
cmd->nsg = n_elem;
|
||||
sc->sg_stat[n_elem]++;
|
||||
|
||||
/*
|
||||
* build the command
|
||||
|
@ -876,30 +856,15 @@ static int ub_cmd_build_block(struct ub_dev *sc, struct ub_lun *lun,
|
|||
cmd->cdb[8] = nblks;
|
||||
cmd->cdb_len = 10;
|
||||
|
||||
cmd->dir = ub_dir;
|
||||
cmd->data = rq->buffer;
|
||||
cmd->len = rq->nr_sectors * 512;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ub_cmd_build_packet(struct ub_dev *sc, struct ub_scsi_cmd *cmd,
|
||||
struct request *rq)
|
||||
static int ub_cmd_build_packet(struct ub_dev *sc, struct ub_lun *lun,
|
||||
struct ub_scsi_cmd *cmd, struct request *rq)
|
||||
{
|
||||
|
||||
if (rq->data_len != 0 && rq->data == NULL) {
|
||||
static int do_print = 1;
|
||||
if (do_print) {
|
||||
printk(KERN_WARNING "%s: unmapped packet request"
|
||||
" flags 0x%lx length %d\n",
|
||||
sc->name, rq->flags, rq->data_len);
|
||||
do_print = 0;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
memcpy(&cmd->cdb, rq->cmd, rq->cmd_len);
|
||||
cmd->cdb_len = rq->cmd_len;
|
||||
int n_elem;
|
||||
|
||||
if (rq->data_len == 0) {
|
||||
cmd->dir = UB_DIR_NONE;
|
||||
|
@ -908,8 +873,29 @@ static int ub_cmd_build_packet(struct ub_dev *sc, struct ub_scsi_cmd *cmd,
|
|||
cmd->dir = UB_DIR_WRITE;
|
||||
else
|
||||
cmd->dir = UB_DIR_READ;
|
||||
|
||||
}
|
||||
cmd->data = rq->data;
|
||||
|
||||
/*
|
||||
* get scatterlist from block layer
|
||||
*/
|
||||
n_elem = blk_rq_map_sg(lun->disk->queue, rq, &cmd->sgv[0]);
|
||||
if (n_elem < 0) {
|
||||
printk(KERN_INFO "%s: failed request map (%d)\n",
|
||||
sc->name, n_elem); /* P3 */
|
||||
return -1;
|
||||
}
|
||||
if (n_elem > UB_MAX_REQ_SG) { /* Paranoia */
|
||||
printk(KERN_WARNING "%s: request with %d segments\n",
|
||||
sc->name, n_elem);
|
||||
return -1;
|
||||
}
|
||||
cmd->nsg = n_elem;
|
||||
sc->sg_stat[n_elem]++;
|
||||
|
||||
memcpy(&cmd->cdb, rq->cmd, rq->cmd_len);
|
||||
cmd->cdb_len = rq->cmd_len;
|
||||
|
||||
cmd->len = rq->data_len;
|
||||
|
||||
return 0;
|
||||
|
@ -919,24 +905,34 @@ static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
|
|||
{
|
||||
struct request *rq = cmd->back;
|
||||
struct ub_lun *lun = cmd->lun;
|
||||
struct gendisk *disk = lun->disk;
|
||||
request_queue_t *q = disk->queue;
|
||||
int uptodate;
|
||||
|
||||
if (blk_pc_request(rq)) {
|
||||
/* UB_SENSE_SIZE is smaller than SCSI_SENSE_BUFFERSIZE */
|
||||
memcpy(rq->sense, sc->top_sense, UB_SENSE_SIZE);
|
||||
rq->sense_len = UB_SENSE_SIZE;
|
||||
}
|
||||
|
||||
if (cmd->error == 0)
|
||||
if (cmd->error == 0) {
|
||||
uptodate = 1;
|
||||
else
|
||||
|
||||
if (blk_pc_request(rq)) {
|
||||
if (cmd->act_len >= rq->data_len)
|
||||
rq->data_len = 0;
|
||||
else
|
||||
rq->data_len -= cmd->act_len;
|
||||
}
|
||||
} else {
|
||||
uptodate = 0;
|
||||
|
||||
if (blk_pc_request(rq)) {
|
||||
/* UB_SENSE_SIZE is smaller than SCSI_SENSE_BUFFERSIZE */
|
||||
memcpy(rq->sense, sc->top_sense, UB_SENSE_SIZE);
|
||||
rq->sense_len = UB_SENSE_SIZE;
|
||||
if (sc->top_sense[0] != 0)
|
||||
rq->errors = SAM_STAT_CHECK_CONDITION;
|
||||
else
|
||||
rq->errors = DID_ERROR << 16;
|
||||
}
|
||||
}
|
||||
|
||||
ub_put_cmd(lun, cmd);
|
||||
ub_end_rq(rq, uptodate);
|
||||
blk_start_queue(q);
|
||||
blk_start_queue(lun->disk->queue);
|
||||
}
|
||||
|
||||
static void ub_end_rq(struct request *rq, int uptodate)
|
||||
|
@ -1014,7 +1010,7 @@ static int ub_scsi_cmd_start(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
|
|||
sc->last_pipe = sc->send_bulk_pipe;
|
||||
usb_fill_bulk_urb(&sc->work_urb, sc->dev, sc->send_bulk_pipe,
|
||||
bcb, US_BULK_CB_WRAP_LEN, ub_urb_complete, sc);
|
||||
sc->work_urb.transfer_flags = URB_ASYNC_UNLINK;
|
||||
sc->work_urb.transfer_flags = 0;
|
||||
|
||||
/* Fill what we shouldn't be filling, because usb-storage did so. */
|
||||
sc->work_urb.actual_length = 0;
|
||||
|
@ -1103,7 +1099,6 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
|
|||
{
|
||||
struct urb *urb = &sc->work_urb;
|
||||
struct bulk_cs_wrap *bcs;
|
||||
int pipe;
|
||||
int rc;
|
||||
|
||||
if (atomic_read(&sc->poison)) {
|
||||
|
@ -1204,38 +1199,13 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
|
|||
goto Bad_End;
|
||||
}
|
||||
|
||||
if (cmd->dir == UB_DIR_NONE) {
|
||||
if (cmd->dir == UB_DIR_NONE || cmd->nsg < 1) {
|
||||
ub_state_stat(sc, cmd);
|
||||
return;
|
||||
}
|
||||
|
||||
UB_INIT_COMPLETION(sc->work_done);
|
||||
|
||||
if (cmd->dir == UB_DIR_READ)
|
||||
pipe = sc->recv_bulk_pipe;
|
||||
else
|
||||
pipe = sc->send_bulk_pipe;
|
||||
sc->last_pipe = pipe;
|
||||
usb_fill_bulk_urb(&sc->work_urb, sc->dev, pipe,
|
||||
cmd->data, cmd->len, ub_urb_complete, sc);
|
||||
sc->work_urb.transfer_flags = URB_ASYNC_UNLINK;
|
||||
sc->work_urb.actual_length = 0;
|
||||
sc->work_urb.error_count = 0;
|
||||
sc->work_urb.status = 0;
|
||||
|
||||
if ((rc = usb_submit_urb(&sc->work_urb, GFP_ATOMIC)) != 0) {
|
||||
/* XXX Clear stalls */
|
||||
printk("ub: data #%d submit failed (%d)\n", cmd->tag, rc); /* P3 */
|
||||
ub_complete(&sc->work_done);
|
||||
ub_state_done(sc, cmd, rc);
|
||||
return;
|
||||
}
|
||||
|
||||
sc->work_timer.expires = jiffies + UB_DATA_TIMEOUT;
|
||||
add_timer(&sc->work_timer);
|
||||
|
||||
cmd->state = UB_CMDST_DATA;
|
||||
ub_cmdtr_state(sc, cmd);
|
||||
// udelay(125); // usb-storage has this
|
||||
ub_data_start(sc, cmd);
|
||||
|
||||
} else if (cmd->state == UB_CMDST_DATA) {
|
||||
if (urb->status == -EPIPE) {
|
||||
|
@ -1257,16 +1227,22 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
|
|||
if (urb->status == -EOVERFLOW) {
|
||||
/*
|
||||
* A babble? Failure, but we must transfer CSW now.
|
||||
* XXX This is going to end in perpetual babble. Reset.
|
||||
*/
|
||||
cmd->error = -EOVERFLOW; /* A cheap trick... */
|
||||
} else {
|
||||
if (urb->status != 0)
|
||||
goto Bad_End;
|
||||
ub_state_stat(sc, cmd);
|
||||
return;
|
||||
}
|
||||
if (urb->status != 0)
|
||||
goto Bad_End;
|
||||
|
||||
cmd->act_len = urb->actual_length;
|
||||
cmd->act_len += urb->actual_length;
|
||||
ub_cmdtr_act_len(sc, cmd);
|
||||
|
||||
if (++cmd->current_sg < cmd->nsg) {
|
||||
ub_data_start(sc, cmd);
|
||||
return;
|
||||
}
|
||||
ub_state_stat(sc, cmd);
|
||||
|
||||
} else if (cmd->state == UB_CMDST_STAT) {
|
||||
|
@ -1399,6 +1375,46 @@ Bad_End: /* Little Excel is dead */
|
|||
ub_state_done(sc, cmd, -EIO);
|
||||
}
|
||||
|
||||
/*
|
||||
* Factorization helper for the command state machine:
|
||||
* Initiate a data segment transfer.
|
||||
*/
|
||||
static void ub_data_start(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
|
||||
{
|
||||
struct scatterlist *sg = &cmd->sgv[cmd->current_sg];
|
||||
int pipe;
|
||||
int rc;
|
||||
|
||||
UB_INIT_COMPLETION(sc->work_done);
|
||||
|
||||
if (cmd->dir == UB_DIR_READ)
|
||||
pipe = sc->recv_bulk_pipe;
|
||||
else
|
||||
pipe = sc->send_bulk_pipe;
|
||||
sc->last_pipe = pipe;
|
||||
usb_fill_bulk_urb(&sc->work_urb, sc->dev, pipe,
|
||||
page_address(sg->page) + sg->offset, sg->length,
|
||||
ub_urb_complete, sc);
|
||||
sc->work_urb.transfer_flags = 0;
|
||||
sc->work_urb.actual_length = 0;
|
||||
sc->work_urb.error_count = 0;
|
||||
sc->work_urb.status = 0;
|
||||
|
||||
if ((rc = usb_submit_urb(&sc->work_urb, GFP_ATOMIC)) != 0) {
|
||||
/* XXX Clear stalls */
|
||||
printk("ub: data #%d submit failed (%d)\n", cmd->tag, rc); /* P3 */
|
||||
ub_complete(&sc->work_done);
|
||||
ub_state_done(sc, cmd, rc);
|
||||
return;
|
||||
}
|
||||
|
||||
sc->work_timer.expires = jiffies + UB_DATA_TIMEOUT;
|
||||
add_timer(&sc->work_timer);
|
||||
|
||||
cmd->state = UB_CMDST_DATA;
|
||||
ub_cmdtr_state(sc, cmd);
|
||||
}
|
||||
|
||||
/*
|
||||
* Factorization helper for the command state machine:
|
||||
* Finish the command.
|
||||
|
@ -1426,7 +1442,7 @@ static int __ub_state_stat(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
|
|||
sc->last_pipe = sc->recv_bulk_pipe;
|
||||
usb_fill_bulk_urb(&sc->work_urb, sc->dev, sc->recv_bulk_pipe,
|
||||
&sc->work_bcs, US_BULK_CS_WRAP_LEN, ub_urb_complete, sc);
|
||||
sc->work_urb.transfer_flags = URB_ASYNC_UNLINK;
|
||||
sc->work_urb.transfer_flags = 0;
|
||||
sc->work_urb.actual_length = 0;
|
||||
sc->work_urb.error_count = 0;
|
||||
sc->work_urb.status = 0;
|
||||
|
@ -1484,6 +1500,7 @@ static void ub_state_stat_counted(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
|
|||
static void ub_state_sense(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
|
||||
{
|
||||
struct ub_scsi_cmd *scmd;
|
||||
struct scatterlist *sg;
|
||||
int rc;
|
||||
|
||||
if (cmd->cdb[0] == REQUEST_SENSE) {
|
||||
|
@ -1492,12 +1509,17 @@ static void ub_state_sense(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
|
|||
}
|
||||
|
||||
scmd = &sc->top_rqs_cmd;
|
||||
memset(scmd, 0, sizeof(struct ub_scsi_cmd));
|
||||
scmd->cdb[0] = REQUEST_SENSE;
|
||||
scmd->cdb[4] = UB_SENSE_SIZE;
|
||||
scmd->cdb_len = 6;
|
||||
scmd->dir = UB_DIR_READ;
|
||||
scmd->state = UB_CMDST_INIT;
|
||||
scmd->data = sc->top_sense;
|
||||
scmd->nsg = 1;
|
||||
sg = &scmd->sgv[0];
|
||||
sg->page = virt_to_page(sc->top_sense);
|
||||
sg->offset = (unsigned int)sc->top_sense & (PAGE_SIZE-1);
|
||||
sg->length = UB_SENSE_SIZE;
|
||||
scmd->len = UB_SENSE_SIZE;
|
||||
scmd->lun = cmd->lun;
|
||||
scmd->done = ub_top_sense_done;
|
||||
|
@ -1541,7 +1563,7 @@ static int ub_submit_clear_stall(struct ub_dev *sc, struct ub_scsi_cmd *cmd,
|
|||
|
||||
usb_fill_control_urb(&sc->work_urb, sc->dev, sc->send_ctrl_pipe,
|
||||
(unsigned char*) cr, NULL, 0, ub_urb_complete, sc);
|
||||
sc->work_urb.transfer_flags = URB_ASYNC_UNLINK;
|
||||
sc->work_urb.transfer_flags = 0;
|
||||
sc->work_urb.actual_length = 0;
|
||||
sc->work_urb.error_count = 0;
|
||||
sc->work_urb.status = 0;
|
||||
|
@ -1560,7 +1582,7 @@ static int ub_submit_clear_stall(struct ub_dev *sc, struct ub_scsi_cmd *cmd,
|
|||
*/
|
||||
static void ub_top_sense_done(struct ub_dev *sc, struct ub_scsi_cmd *scmd)
|
||||
{
|
||||
unsigned char *sense = scmd->data;
|
||||
unsigned char *sense = sc->top_sense;
|
||||
struct ub_scsi_cmd *cmd;
|
||||
|
||||
/*
|
||||
|
@ -1852,6 +1874,7 @@ static int ub_sync_read_cap(struct ub_dev *sc, struct ub_lun *lun,
|
|||
struct ub_capacity *ret)
|
||||
{
|
||||
struct ub_scsi_cmd *cmd;
|
||||
struct scatterlist *sg;
|
||||
char *p;
|
||||
enum { ALLOC_SIZE = sizeof(struct ub_scsi_cmd) + 8 };
|
||||
unsigned long flags;
|
||||
|
@ -1872,7 +1895,11 @@ static int ub_sync_read_cap(struct ub_dev *sc, struct ub_lun *lun,
|
|||
cmd->cdb_len = 10;
|
||||
cmd->dir = UB_DIR_READ;
|
||||
cmd->state = UB_CMDST_INIT;
|
||||
cmd->data = p;
|
||||
cmd->nsg = 1;
|
||||
sg = &cmd->sgv[0];
|
||||
sg->page = virt_to_page(p);
|
||||
sg->offset = (unsigned int)p & (PAGE_SIZE-1);
|
||||
sg->length = 8;
|
||||
cmd->len = 8;
|
||||
cmd->lun = lun;
|
||||
cmd->done = ub_probe_done;
|
||||
|
@ -2289,7 +2316,7 @@ static int ub_probe_lun(struct ub_dev *sc, int lnum)
|
|||
disk->driverfs_dev = &sc->intf->dev; /* XXX Many to one ok? */
|
||||
|
||||
rc = -ENOMEM;
|
||||
if ((q = blk_init_queue(ub_bd_rq_fn, &sc->lock)) == NULL)
|
||||
if ((q = blk_init_queue(ub_request_fn, &sc->lock)) == NULL)
|
||||
goto err_blkqinit;
|
||||
|
||||
disk->queue = q;
|
||||
|
|
|
@ -429,7 +429,7 @@ static int __devinit uli_agp_init(struct pci_dev *pdev)
|
|||
struct pci_dev *dev1;
|
||||
int i;
|
||||
unsigned size = amd64_fetch_size();
|
||||
printk(KERN_INFO "Setting up ULi AGP. \n");
|
||||
printk(KERN_INFO "Setting up ULi AGP.\n");
|
||||
dev1 = pci_find_slot ((unsigned int)pdev->bus->number,PCI_DEVFN(0,0));
|
||||
if (dev1 == NULL) {
|
||||
printk(KERN_INFO PFX "Detected a ULi chipset, "
|
||||
|
|
|
@ -319,7 +319,6 @@ int agp_copy_info(struct agp_bridge_data *bridge, struct agp_kern_info *info)
|
|||
info->mode = bridge->mode & ~AGP3_RESERVED_MASK;
|
||||
else
|
||||
info->mode = bridge->mode & ~AGP2_RESERVED_MASK;
|
||||
info->mode = bridge->mode;
|
||||
info->aper_base = bridge->gart_bus_addr;
|
||||
info->aper_size = agp_return_size();
|
||||
info->max_memory = bridge->max_memory_agp;
|
||||
|
@ -356,7 +355,7 @@ int agp_bind_memory(struct agp_memory *curr, off_t pg_start)
|
|||
return -EINVAL;
|
||||
|
||||
if (curr->is_bound == TRUE) {
|
||||
printk (KERN_INFO PFX "memory %p is already bound!\n", curr);
|
||||
printk(KERN_INFO PFX "memory %p is already bound!\n", curr);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (curr->is_flushed == FALSE) {
|
||||
|
@ -391,7 +390,7 @@ int agp_unbind_memory(struct agp_memory *curr)
|
|||
return -EINVAL;
|
||||
|
||||
if (curr->is_bound != TRUE) {
|
||||
printk (KERN_INFO PFX "memory %p was not bound!\n", curr);
|
||||
printk(KERN_INFO PFX "memory %p was not bound!\n", curr);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -415,7 +414,7 @@ static void agp_v2_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_
|
|||
u32 tmp;
|
||||
|
||||
if (*requested_mode & AGP2_RESERVED_MASK) {
|
||||
printk (KERN_INFO PFX "reserved bits set in mode 0x%x. Fixed.\n", *requested_mode);
|
||||
printk(KERN_INFO PFX "reserved bits set in mode 0x%x. Fixed.\n", *requested_mode);
|
||||
*requested_mode &= ~AGP2_RESERVED_MASK;
|
||||
}
|
||||
|
||||
|
@ -423,7 +422,7 @@ static void agp_v2_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_
|
|||
tmp = *requested_mode & 7;
|
||||
switch (tmp) {
|
||||
case 0:
|
||||
printk (KERN_INFO PFX "%s tried to set rate=x0. Setting to x1 mode.\n", current->comm);
|
||||
printk(KERN_INFO PFX "%s tried to set rate=x0. Setting to x1 mode.\n", current->comm);
|
||||
*requested_mode |= AGPSTAT2_1X;
|
||||
break;
|
||||
case 1:
|
||||
|
@ -493,18 +492,18 @@ static void agp_v3_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_
|
|||
u32 tmp;
|
||||
|
||||
if (*requested_mode & AGP3_RESERVED_MASK) {
|
||||
printk (KERN_INFO PFX "reserved bits set in mode 0x%x. Fixed.\n", *requested_mode);
|
||||
printk(KERN_INFO PFX "reserved bits set in mode 0x%x. Fixed.\n", *requested_mode);
|
||||
*requested_mode &= ~AGP3_RESERVED_MASK;
|
||||
}
|
||||
|
||||
/* Check the speed bits make sense. */
|
||||
tmp = *requested_mode & 7;
|
||||
if (tmp == 0) {
|
||||
printk (KERN_INFO PFX "%s tried to set rate=x0. Setting to AGP3 x4 mode.\n", current->comm);
|
||||
printk(KERN_INFO PFX "%s tried to set rate=x0. Setting to AGP3 x4 mode.\n", current->comm);
|
||||
*requested_mode |= AGPSTAT3_4X;
|
||||
}
|
||||
if (tmp >= 3) {
|
||||
printk (KERN_INFO PFX "%s tried to set rate=x%d. Setting to AGP3 x8 mode.\n", current->comm, tmp * 4);
|
||||
printk(KERN_INFO PFX "%s tried to set rate=x%d. Setting to AGP3 x8 mode.\n", current->comm, tmp * 4);
|
||||
*requested_mode = (*requested_mode & ~7) | AGPSTAT3_8X;
|
||||
}
|
||||
|
||||
|
@ -533,7 +532,7 @@ static void agp_v3_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_
|
|||
* AGP2.x 4x -> AGP3.0 4x.
|
||||
*/
|
||||
if (*requested_mode & AGPSTAT2_4X) {
|
||||
printk (KERN_INFO PFX "%s passes broken AGP3 flags (%x). Fixed.\n",
|
||||
printk(KERN_INFO PFX "%s passes broken AGP3 flags (%x). Fixed.\n",
|
||||
current->comm, *requested_mode);
|
||||
*requested_mode &= ~AGPSTAT2_4X;
|
||||
*requested_mode |= AGPSTAT3_4X;
|
||||
|
@ -544,7 +543,7 @@ static void agp_v3_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_
|
|||
* but have been passed an AGP 2.x mode.
|
||||
* Convert AGP 1x,2x,4x -> AGP 3.0 4x.
|
||||
*/
|
||||
printk (KERN_INFO PFX "%s passes broken AGP2 flags (%x) in AGP3 mode. Fixed.\n",
|
||||
printk(KERN_INFO PFX "%s passes broken AGP2 flags (%x) in AGP3 mode. Fixed.\n",
|
||||
current->comm, *requested_mode);
|
||||
*requested_mode &= ~(AGPSTAT2_4X | AGPSTAT2_2X | AGPSTAT2_1X);
|
||||
*requested_mode |= AGPSTAT3_4X;
|
||||
|
@ -554,13 +553,13 @@ static void agp_v3_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_
|
|||
if (!(*bridge_agpstat & AGPSTAT3_8X)) {
|
||||
*bridge_agpstat &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD);
|
||||
*bridge_agpstat |= AGPSTAT3_4X;
|
||||
printk ("%s requested AGPx8 but bridge not capable.\n", current->comm);
|
||||
printk(KERN_INFO PFX "%s requested AGPx8 but bridge not capable.\n", current->comm);
|
||||
return;
|
||||
}
|
||||
if (!(*vga_agpstat & AGPSTAT3_8X)) {
|
||||
*bridge_agpstat &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD);
|
||||
*bridge_agpstat |= AGPSTAT3_4X;
|
||||
printk ("%s requested AGPx8 but graphic card not capable.\n", current->comm);
|
||||
printk(KERN_INFO PFX "%s requested AGPx8 but graphic card not capable.\n", current->comm);
|
||||
return;
|
||||
}
|
||||
/* All set, bridge & device can do AGP x8*/
|
||||
|
@ -578,13 +577,13 @@ static void agp_v3_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_
|
|||
if ((*bridge_agpstat & AGPSTAT3_4X) && (*vga_agpstat & AGPSTAT3_4X))
|
||||
*bridge_agpstat |= AGPSTAT3_4X;
|
||||
else {
|
||||
printk (KERN_INFO PFX "Badness. Don't know which AGP mode to set. "
|
||||
printk(KERN_INFO PFX "Badness. Don't know which AGP mode to set. "
|
||||
"[bridge_agpstat:%x vga_agpstat:%x fell back to:- bridge_agpstat:%x vga_agpstat:%x]\n",
|
||||
origbridge, origvga, *bridge_agpstat, *vga_agpstat);
|
||||
if (!(*bridge_agpstat & AGPSTAT3_4X))
|
||||
printk (KERN_INFO PFX "Bridge couldn't do AGP x4.\n");
|
||||
printk(KERN_INFO PFX "Bridge couldn't do AGP x4.\n");
|
||||
if (!(*vga_agpstat & AGPSTAT3_4X))
|
||||
printk (KERN_INFO PFX "Graphic card couldn't do AGP x4.\n");
|
||||
printk(KERN_INFO PFX "Graphic card couldn't do AGP x4.\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -622,7 +621,7 @@ u32 agp_collect_device_status(struct agp_bridge_data *bridge, u32 requested_mode
|
|||
for (;;) {
|
||||
device = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, device);
|
||||
if (!device) {
|
||||
printk (KERN_INFO PFX "Couldn't find an AGP VGA controller.\n");
|
||||
printk(KERN_INFO PFX "Couldn't find an AGP VGA controller.\n");
|
||||
return 0;
|
||||
}
|
||||
cap_ptr = pci_find_capability(device, PCI_CAP_ID_AGP);
|
||||
|
@ -734,7 +733,7 @@ void agp_generic_enable(struct agp_bridge_data *bridge, u32 requested_mode)
|
|||
pci_write_config_dword(bridge->dev,
|
||||
bridge->capndx+AGPCTRL, temp);
|
||||
|
||||
printk (KERN_INFO PFX "Device is in legacy mode,"
|
||||
printk(KERN_INFO PFX "Device is in legacy mode,"
|
||||
" falling back to 2.x\n");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1071,5 +1071,9 @@ extern void *drm_calloc(size_t nmemb, size_t size, int area);
|
|||
extern unsigned long drm_core_get_map_ofs(drm_map_t *map);
|
||||
extern unsigned long drm_core_get_reg_ofs(struct drm_device *dev);
|
||||
|
||||
#ifndef pci_pretty_name
|
||||
#define pci_pretty_name(dev) ""
|
||||
#endif
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif
|
||||
|
|
|
@ -627,7 +627,7 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
|
|||
|
||||
ret = kobject_register(&policy->kobj);
|
||||
if (ret)
|
||||
goto err_out;
|
||||
goto err_out_driver_exit;
|
||||
|
||||
/* set up files for this cpu device */
|
||||
drv_attr = cpufreq_driver->attr;
|
||||
|
@ -673,6 +673,10 @@ err_out_unregister:
|
|||
kobject_unregister(&policy->kobj);
|
||||
wait_for_completion(&policy->kobj_unregister);
|
||||
|
||||
err_out_driver_exit:
|
||||
if (cpufreq_driver->exit)
|
||||
cpufreq_driver->exit(policy);
|
||||
|
||||
err_out:
|
||||
kfree(policy);
|
||||
|
||||
|
|
|
@ -144,6 +144,22 @@ config I2C_I810
|
|||
This driver can also be built as a module. If so, the module
|
||||
will be called i2c-i810.
|
||||
|
||||
config I2C_PXA
|
||||
tristate "Intel PXA2XX I2C adapter (EXPERIMENTAL)"
|
||||
depends on I2C && EXPERIMENTAL && ARCH_PXA
|
||||
help
|
||||
If you have devices in the PXA I2C bus, say yes to this option.
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called i2c-pxa.
|
||||
|
||||
config I2C_PXA_SLAVE
|
||||
bool "Intel PXA2XX I2C Slave comms support"
|
||||
depends on I2C_PXA
|
||||
help
|
||||
Support I2C slave mode communications on the PXA I2C bus. This
|
||||
is necessary for systems where the PXA may be a target on the
|
||||
I2C bus.
|
||||
|
||||
config I2C_PIIX4
|
||||
tristate "Intel PIIX4"
|
||||
depends on I2C && PCI
|
||||
|
|
|
@ -28,6 +28,7 @@ obj-$(CONFIG_I2C_PARPORT_LIGHT) += i2c-parport-light.o
|
|||
obj-$(CONFIG_I2C_PCA_ISA) += i2c-pca-isa.o
|
||||
obj-$(CONFIG_I2C_PIIX4) += i2c-piix4.o
|
||||
obj-$(CONFIG_I2C_PROSAVAGE) += i2c-prosavage.o
|
||||
obj-$(CONFIG_I2C_PXA) += i2c-pxa.o
|
||||
obj-$(CONFIG_I2C_RPXLITE) += i2c-rpx.o
|
||||
obj-$(CONFIG_I2C_S3C2410) += i2c-s3c2410.o
|
||||
obj-$(CONFIG_I2C_SAVAGE4) += i2c-savage4.o
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -937,12 +937,12 @@ static int __devinit mthca_init_one(struct pci_dev *pdev,
|
|||
++mthca_version_printed;
|
||||
}
|
||||
|
||||
printk(KERN_INFO PFX "Initializing %s (%s)\n",
|
||||
pci_pretty_name(pdev), pci_name(pdev));
|
||||
printk(KERN_INFO PFX "Initializing %s\n",
|
||||
pci_name(pdev));
|
||||
|
||||
if (id->driver_data >= ARRAY_SIZE(mthca_hca_table)) {
|
||||
printk(KERN_ERR PFX "%s (%s) has invalid driver data %lx\n",
|
||||
pci_pretty_name(pdev), pci_name(pdev), id->driver_data);
|
||||
printk(KERN_ERR PFX "%s has invalid driver data %lx\n",
|
||||
pci_name(pdev), id->driver_data);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
|
|
@ -71,8 +71,8 @@ int mthca_reset(struct mthca_dev *mdev)
|
|||
bridge)) != NULL) {
|
||||
if (bridge->hdr_type == PCI_HEADER_TYPE_BRIDGE &&
|
||||
bridge->subordinate == mdev->pdev->bus) {
|
||||
mthca_dbg(mdev, "Found bridge: %s (%s)\n",
|
||||
pci_pretty_name(bridge), pci_name(bridge));
|
||||
mthca_dbg(mdev, "Found bridge: %s\n",
|
||||
pci_name(bridge));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -83,8 +83,8 @@ int mthca_reset(struct mthca_dev *mdev)
|
|||
* assume we're in no-bridge mode and hope for
|
||||
* the best.
|
||||
*/
|
||||
mthca_warn(mdev, "No bridge found for %s (%s)\n",
|
||||
pci_pretty_name(mdev->pdev), pci_name(mdev->pdev));
|
||||
mthca_warn(mdev, "No bridge found for %s\n",
|
||||
pci_name(mdev->pdev));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1079,13 +1079,17 @@ static void mmc_setup(struct mmc_host *host)
|
|||
/**
|
||||
* mmc_detect_change - process change of state on a MMC socket
|
||||
* @host: host which changed state.
|
||||
* @delay: optional delay to wait before detection (jiffies)
|
||||
*
|
||||
* All we know is that card(s) have been inserted or removed
|
||||
* from the socket(s). We don't know which socket or cards.
|
||||
*/
|
||||
void mmc_detect_change(struct mmc_host *host)
|
||||
void mmc_detect_change(struct mmc_host *host, unsigned long delay)
|
||||
{
|
||||
schedule_work(&host->detect);
|
||||
if (delay)
|
||||
schedule_delayed_work(&host->detect, delay);
|
||||
else
|
||||
schedule_work(&host->detect);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(mmc_detect_change);
|
||||
|
@ -1189,7 +1193,7 @@ int mmc_add_host(struct mmc_host *host)
|
|||
ret = mmc_add_host_sysfs(host);
|
||||
if (ret == 0) {
|
||||
mmc_power_off(host);
|
||||
mmc_detect_change(host);
|
||||
mmc_detect_change(host, 0);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
@ -1259,7 +1263,7 @@ EXPORT_SYMBOL(mmc_suspend_host);
|
|||
*/
|
||||
int mmc_resume_host(struct mmc_host *host)
|
||||
{
|
||||
mmc_detect_change(host);
|
||||
mmc_detect_change(host, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -442,7 +442,7 @@ static void mmci_check_status(unsigned long data)
|
|||
|
||||
status = host->plat->status(mmc_dev(host->mmc));
|
||||
if (status ^ host->oldstat)
|
||||
mmc_detect_change(host->mmc);
|
||||
mmc_detect_change(host->mmc, 0);
|
||||
|
||||
host->oldstat = status;
|
||||
mod_timer(&host->timer, jiffies + HZ);
|
||||
|
|
|
@ -423,7 +423,9 @@ static void pxamci_dma_irq(int dma, void *devid, struct pt_regs *regs)
|
|||
|
||||
static irqreturn_t pxamci_detect_irq(int irq, void *devid, struct pt_regs *regs)
|
||||
{
|
||||
mmc_detect_change(devid);
|
||||
struct pxamci_host *host = mmc_priv(devid);
|
||||
|
||||
mmc_detect_change(devid, host->pdata->detect_delay);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
|
|
@ -1122,7 +1122,7 @@ static void wbsd_detect_card(unsigned long data)
|
|||
|
||||
DBG("Executing card detection\n");
|
||||
|
||||
mmc_detect_change(host->mmc);
|
||||
mmc_detect_change(host->mmc, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1198,7 +1198,7 @@ static void wbsd_tasklet_card(unsigned long param)
|
|||
*/
|
||||
spin_unlock(&host->lock);
|
||||
|
||||
mmc_detect_change(host->mmc);
|
||||
mmc_detect_change(host->mmc, 0);
|
||||
}
|
||||
else
|
||||
spin_unlock(&host->lock);
|
||||
|
|
|
@ -14,8 +14,8 @@
|
|||
|
||||
#define DRV_MODULE_NAME "bnx2"
|
||||
#define PFX DRV_MODULE_NAME ": "
|
||||
#define DRV_MODULE_VERSION "1.2.20"
|
||||
#define DRV_MODULE_RELDATE "August 22, 2005"
|
||||
#define DRV_MODULE_VERSION "1.2.21"
|
||||
#define DRV_MODULE_RELDATE "September 7, 2005"
|
||||
|
||||
#define RUN_AT(x) (jiffies + (x))
|
||||
|
||||
|
@ -1533,6 +1533,7 @@ bnx2_msi(int irq, void *dev_instance, struct pt_regs *regs)
|
|||
struct net_device *dev = dev_instance;
|
||||
struct bnx2 *bp = dev->priv;
|
||||
|
||||
prefetch(bp->status_blk);
|
||||
REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
|
||||
BNX2_PCICFG_INT_ACK_CMD_USE_INT_HC_PARAM |
|
||||
BNX2_PCICFG_INT_ACK_CMD_MASK_INT);
|
||||
|
@ -1558,7 +1559,7 @@ bnx2_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
|
|||
* When using MSI, the MSI message will always complete after
|
||||
* the status block write.
|
||||
*/
|
||||
if ((bp->status_blk->status_idx == bp->last_status_idx) ||
|
||||
if ((bp->status_blk->status_idx == bp->last_status_idx) &&
|
||||
(REG_RD(bp, BNX2_PCICFG_MISC_STATUS) &
|
||||
BNX2_PCICFG_MISC_STATUS_INTA_VALUE))
|
||||
return IRQ_NONE;
|
||||
|
|
|
@ -50,6 +50,7 @@
|
|||
#endif
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/crc32.h>
|
||||
#include <linux/prefetch.h>
|
||||
|
||||
/* Hardware data structures and register definitions automatically
|
||||
* generated from RTL code. Do not modify.
|
||||
|
|
|
@ -267,7 +267,7 @@ static void irda_usb_change_speed_xbofs(struct irda_usb_cb *self)
|
|||
frame, IRDA_USB_SPEED_MTU,
|
||||
speed_bulk_callback, self);
|
||||
urb->transfer_buffer_length = USB_IRDA_HEADER;
|
||||
urb->transfer_flags = URB_ASYNC_UNLINK;
|
||||
urb->transfer_flags = 0;
|
||||
|
||||
/* Irq disabled -> GFP_ATOMIC */
|
||||
if ((ret = usb_submit_urb(urb, GFP_ATOMIC))) {
|
||||
|
@ -401,15 +401,12 @@ static int irda_usb_hard_xmit(struct sk_buff *skb, struct net_device *netdev)
|
|||
skb->data, IRDA_SKB_MAX_MTU,
|
||||
write_bulk_callback, skb);
|
||||
urb->transfer_buffer_length = skb->len;
|
||||
/* Note : unlink *must* be Asynchronous because of the code in
|
||||
* irda_usb_net_timeout() -> call in irq - Jean II */
|
||||
urb->transfer_flags = URB_ASYNC_UNLINK;
|
||||
/* This flag (URB_ZERO_PACKET) indicates that what we send is not
|
||||
* a continuous stream of data but separate packets.
|
||||
* In this case, the USB layer will insert an empty USB frame (TD)
|
||||
* after each of our packets that is exact multiple of the frame size.
|
||||
* This is how the dongle will detect the end of packet - Jean II */
|
||||
urb->transfer_flags |= URB_ZERO_PACKET;
|
||||
urb->transfer_flags = URB_ZERO_PACKET;
|
||||
|
||||
/* Generate min turn time. FIXME: can we do better than this? */
|
||||
/* Trying to a turnaround time at this level is trying to measure
|
||||
|
@ -630,8 +627,6 @@ static void irda_usb_net_timeout(struct net_device *netdev)
|
|||
* in completion handler, because urb->status will
|
||||
* be -ENOENT. We will fix that at the next watchdog,
|
||||
* leaving more time to USB to recover...
|
||||
* Also, we are in interrupt, so we need to have
|
||||
* URB_ASYNC_UNLINK to work properly...
|
||||
* Jean II */
|
||||
done = 1;
|
||||
break;
|
||||
|
@ -1008,9 +1003,7 @@ static int irda_usb_net_close(struct net_device *netdev)
|
|||
}
|
||||
}
|
||||
/* Cancel Tx and speed URB - need to be synchronous to avoid races */
|
||||
self->tx_urb->transfer_flags &= ~URB_ASYNC_UNLINK;
|
||||
usb_kill_urb(self->tx_urb);
|
||||
self->speed_urb->transfer_flags &= ~URB_ASYNC_UNLINK;
|
||||
usb_kill_urb(self->speed_urb);
|
||||
|
||||
/* Stop and remove instance of IrLAP */
|
||||
|
@ -1521,9 +1514,7 @@ static void irda_usb_disconnect(struct usb_interface *intf)
|
|||
usb_kill_urb(self->rx_urb[i]);
|
||||
/* Cancel Tx and speed URB.
|
||||
* Toggle flags to make sure it's synchronous. */
|
||||
self->tx_urb->transfer_flags &= ~URB_ASYNC_UNLINK;
|
||||
usb_kill_urb(self->tx_urb);
|
||||
self->speed_urb->transfer_flags &= ~URB_ASYNC_UNLINK;
|
||||
usb_kill_urb(self->speed_urb);
|
||||
}
|
||||
|
||||
|
|
|
@ -69,14 +69,8 @@ typedef void irqreturn_t;
|
|||
|
||||
#else /* 2.5 or later */
|
||||
|
||||
/* recent 2.5/2.6 stores pci device names at varying places ;-) */
|
||||
#ifdef CONFIG_PCI_NAMES
|
||||
/* human readable name */
|
||||
#define PCIDEV_NAME(pdev) ((pdev)->pretty_name)
|
||||
#else
|
||||
/* whatever we get from the associated struct device - bus:slot:dev.fn id */
|
||||
#define PCIDEV_NAME(pdev) (pci_name(pdev))
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -3010,7 +3010,7 @@ static int __init parport_pc_init_superio (int autoirq, int autodma)
|
|||
struct pci_dev *pdev = NULL;
|
||||
int ret = 0;
|
||||
|
||||
while ((pdev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pdev)) != NULL) {
|
||||
for_each_pci_dev(pdev) {
|
||||
id = pci_match_id(parport_pc_pci_tbl, pdev);
|
||||
if (id == NULL || id->driver_data >= last_sio)
|
||||
continue;
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче