Merge branch 'at91' into devel
This commit is contained in:
commit
9e165acf1b
|
@ -144,8 +144,8 @@ prototypes:
|
||||||
void (*kill_sb) (struct super_block *);
|
void (*kill_sb) (struct super_block *);
|
||||||
locking rules:
|
locking rules:
|
||||||
may block BKL
|
may block BKL
|
||||||
get_sb yes yes
|
get_sb yes no
|
||||||
kill_sb yes yes
|
kill_sb yes no
|
||||||
|
|
||||||
->get_sb() returns error or 0 with locked superblock attached to the vfsmount
|
->get_sb() returns error or 0 with locked superblock attached to the vfsmount
|
||||||
(exclusive on ->s_umount).
|
(exclusive on ->s_umount).
|
||||||
|
@ -409,12 +409,12 @@ ioctl: yes (see below)
|
||||||
unlocked_ioctl: no (see below)
|
unlocked_ioctl: no (see below)
|
||||||
compat_ioctl: no
|
compat_ioctl: no
|
||||||
mmap: no
|
mmap: no
|
||||||
open: maybe (see below)
|
open: no
|
||||||
flush: no
|
flush: no
|
||||||
release: no
|
release: no
|
||||||
fsync: no (see below)
|
fsync: no (see below)
|
||||||
aio_fsync: no
|
aio_fsync: no
|
||||||
fasync: yes (see below)
|
fasync: no
|
||||||
lock: yes
|
lock: yes
|
||||||
readv: no
|
readv: no
|
||||||
writev: no
|
writev: no
|
||||||
|
@ -431,13 +431,6 @@ For many filesystems, it is probably safe to acquire the inode
|
||||||
semaphore. Note some filesystems (i.e. remote ones) provide no
|
semaphore. Note some filesystems (i.e. remote ones) provide no
|
||||||
protection for i_size so you will need to use the BKL.
|
protection for i_size so you will need to use the BKL.
|
||||||
|
|
||||||
->open() locking is in-transit: big lock partially moved into the methods.
|
|
||||||
The only exception is ->open() in the instances of file_operations that never
|
|
||||||
end up in ->i_fop/->proc_fops, i.e. ones that belong to character devices
|
|
||||||
(chrdev_open() takes lock before replacing ->f_op and calling the secondary
|
|
||||||
method. As soon as we fix the handling of module reference counters all
|
|
||||||
instances of ->open() will be called without the BKL.
|
|
||||||
|
|
||||||
Note: ext2_release() was *the* source of contention on fs-intensive
|
Note: ext2_release() was *the* source of contention on fs-intensive
|
||||||
loads and dropping BKL on ->release() helps to get rid of that (we still
|
loads and dropping BKL on ->release() helps to get rid of that (we still
|
||||||
grab BKL for cases when we close a file that had been opened r/w, but that
|
grab BKL for cases when we close a file that had been opened r/w, but that
|
||||||
|
|
|
@ -44,7 +44,7 @@ detailed description):
|
||||||
- LCD brightness control
|
- LCD brightness control
|
||||||
- Volume control
|
- Volume control
|
||||||
- Fan control and monitoring: fan speed, fan enable/disable
|
- Fan control and monitoring: fan speed, fan enable/disable
|
||||||
- Experimental: WAN enable and disable
|
- WAN enable and disable
|
||||||
|
|
||||||
A compatibility table by model and feature is maintained on the web
|
A compatibility table by model and feature is maintained on the web
|
||||||
site, http://ibm-acpi.sf.net/. I appreciate any success or failure
|
site, http://ibm-acpi.sf.net/. I appreciate any success or failure
|
||||||
|
@ -1375,18 +1375,13 @@ with EINVAL, try to set pwm1_enable to 1 and pwm1 to at least 128 (255
|
||||||
would be the safest choice, though).
|
would be the safest choice, though).
|
||||||
|
|
||||||
|
|
||||||
EXPERIMENTAL: WAN
|
WAN
|
||||||
-----------------
|
---
|
||||||
|
|
||||||
procfs: /proc/acpi/ibm/wan
|
procfs: /proc/acpi/ibm/wan
|
||||||
sysfs device attribute: wwan_enable (deprecated)
|
sysfs device attribute: wwan_enable (deprecated)
|
||||||
sysfs rfkill class: switch "tpacpi_wwan_sw"
|
sysfs rfkill class: switch "tpacpi_wwan_sw"
|
||||||
|
|
||||||
This feature is marked EXPERIMENTAL because the implementation
|
|
||||||
directly accesses hardware registers and may not work as expected. USE
|
|
||||||
WITH CAUTION! To use this feature, you need to supply the
|
|
||||||
experimental=1 parameter when loading the module.
|
|
||||||
|
|
||||||
This feature shows the presence and current state of a W-WAN (Sierra
|
This feature shows the presence and current state of a W-WAN (Sierra
|
||||||
Wireless EV-DO) device.
|
Wireless EV-DO) device.
|
||||||
|
|
||||||
|
|
|
@ -3,3 +3,4 @@
|
||||||
2 -> Hauppauge HVR850 (au0828) [2040:7240]
|
2 -> Hauppauge HVR850 (au0828) [2040:7240]
|
||||||
3 -> DViCO FusionHDTV USB (au0828) [0fe9:d620]
|
3 -> DViCO FusionHDTV USB (au0828) [0fe9:d620]
|
||||||
4 -> Hauppauge HVR950Q rev xxF8 (au0828) [2040:7201,2040:7211,2040:7281]
|
4 -> Hauppauge HVR950Q rev xxF8 (au0828) [2040:7201,2040:7211,2040:7281]
|
||||||
|
5 -> Hauppauge Woodbury (au0828) [2040:8200]
|
||||||
|
|
|
@ -88,14 +88,14 @@ zc3xx 0471:0325 Philips SPC 200 NC
|
||||||
zc3xx 0471:0326 Philips SPC 300 NC
|
zc3xx 0471:0326 Philips SPC 300 NC
|
||||||
sonixj 0471:0327 Philips SPC 600 NC
|
sonixj 0471:0327 Philips SPC 600 NC
|
||||||
sonixj 0471:0328 Philips SPC 700 NC
|
sonixj 0471:0328 Philips SPC 700 NC
|
||||||
zc3xx 0471:032d Philips spc210nc
|
zc3xx 0471:032d Philips SPC 210 NC
|
||||||
zc3xx 0471:032e Philips spc315nc
|
zc3xx 0471:032e Philips SPC 315 NC
|
||||||
sonixj 0471:0330 Philips SPC 710NC
|
sonixj 0471:0330 Philips SPC 710 NC
|
||||||
spca501 0497:c001 Smile International
|
spca501 0497:c001 Smile International
|
||||||
sunplus 04a5:3003 Benq DC 1300
|
sunplus 04a5:3003 Benq DC 1300
|
||||||
sunplus 04a5:3008 Benq DC 1500
|
sunplus 04a5:3008 Benq DC 1500
|
||||||
sunplus 04a5:300a Benq DC3410
|
sunplus 04a5:300a Benq DC 3410
|
||||||
spca500 04a5:300c Benq DC1016
|
spca500 04a5:300c Benq DC 1016
|
||||||
sunplus 04f1:1001 JVC GC A50
|
sunplus 04f1:1001 JVC GC A50
|
||||||
spca561 04fc:0561 Flexcam 100
|
spca561 04fc:0561 Flexcam 100
|
||||||
sunplus 04fc:500c Sunplus CA500C
|
sunplus 04fc:500c Sunplus CA500C
|
||||||
|
@ -175,19 +175,21 @@ sunplus 08ca:2060 Aiptek PocketDV5300
|
||||||
tv8532 0923:010f ICM532 cams
|
tv8532 0923:010f ICM532 cams
|
||||||
mars 093a:050f Mars-Semi Pc-Camera
|
mars 093a:050f Mars-Semi Pc-Camera
|
||||||
pac207 093a:2460 PAC207 Qtec Webcam 100
|
pac207 093a:2460 PAC207 Qtec Webcam 100
|
||||||
pac207 093a:2463 Philips spc200nc pac207
|
pac207 093a:2463 Philips SPC 220 NC
|
||||||
pac207 093a:2464 Labtec Webcam 1200
|
pac207 093a:2464 Labtec Webcam 1200
|
||||||
pac207 093a:2468 PAC207
|
pac207 093a:2468 PAC207
|
||||||
pac207 093a:2470 Genius GF112
|
pac207 093a:2470 Genius GF112
|
||||||
pac207 093a:2471 PAC207 Genius VideoCam ge111
|
pac207 093a:2471 Genius VideoCam ge111
|
||||||
pac207 093a:2472 PAC207 Genius VideoCam ge110
|
pac207 093a:2472 Genius VideoCam ge110
|
||||||
pac7311 093a:2600 PAC7311 Typhoon
|
pac7311 093a:2600 PAC7311 Typhoon
|
||||||
pac7311 093a:2601 PAC7311 Phillips SPC610NC
|
pac7311 093a:2601 Philips SPC 610 NC
|
||||||
pac7311 093a:2603 PAC7312
|
pac7311 093a:2603 PAC7312
|
||||||
pac7311 093a:2608 PAC7311 Trust WB-3300p
|
pac7311 093a:2608 Trust WB-3300p
|
||||||
pac7311 093a:260e PAC7311 Gigaware VGA PC Camera, Trust WB-3350p, SIGMA cam 2350
|
pac7311 093a:260e Gigaware VGA PC Camera, Trust WB-3350p, SIGMA cam 2350
|
||||||
pac7311 093a:260f PAC7311 SnakeCam
|
pac7311 093a:260f SnakeCam
|
||||||
pac7311 093a:2621 PAC731x
|
pac7311 093a:2621 PAC731x
|
||||||
|
pac7311 093a:2624 PAC7302
|
||||||
|
pac7311 093a:2626 Labtec 2200
|
||||||
zc3xx 0ac8:0302 Z-star Vimicro zc0302
|
zc3xx 0ac8:0302 Z-star Vimicro zc0302
|
||||||
vc032x 0ac8:0321 Vimicro generic vc0321
|
vc032x 0ac8:0321 Vimicro generic vc0321
|
||||||
vc032x 0ac8:0323 Vimicro Vc0323
|
vc032x 0ac8:0323 Vimicro Vc0323
|
||||||
|
@ -220,6 +222,7 @@ sonixj 0c45:60c0 Sangha Sn535
|
||||||
sonixj 0c45:60ec SN9C105+MO4000
|
sonixj 0c45:60ec SN9C105+MO4000
|
||||||
sonixj 0c45:60fb Surfer NoName
|
sonixj 0c45:60fb Surfer NoName
|
||||||
sonixj 0c45:60fc LG-LIC300
|
sonixj 0c45:60fc LG-LIC300
|
||||||
|
sonixj 0c45:6128 Microdia/Sonix SNP325
|
||||||
sonixj 0c45:612a Avant Camera
|
sonixj 0c45:612a Avant Camera
|
||||||
sonixj 0c45:612c Typhoon Rasy Cam 1.3MPix
|
sonixj 0c45:612c Typhoon Rasy Cam 1.3MPix
|
||||||
sonixj 0c45:6130 Sonix Pccam
|
sonixj 0c45:6130 Sonix Pccam
|
||||||
|
@ -234,7 +237,7 @@ zc3xx 10fd:0128 Typhoon Webshot II USB 300k 0x0128
|
||||||
spca561 10fd:7e50 FlyCam Usb 100
|
spca561 10fd:7e50 FlyCam Usb 100
|
||||||
zc3xx 10fd:8050 Typhoon Webshot II USB 300k
|
zc3xx 10fd:8050 Typhoon Webshot II USB 300k
|
||||||
spca501 1776:501c Arowana 300K CMOS Camera
|
spca501 1776:501c Arowana 300K CMOS Camera
|
||||||
t613 17a1:0128 T613/TAS5130A
|
t613 17a1:0128 TASCORP JPEG Webcam, NGS Cyclops
|
||||||
vc032x 17ef:4802 Lenovo Vc0323+MI1310_SOC
|
vc032x 17ef:4802 Lenovo Vc0323+MI1310_SOC
|
||||||
pac207 2001:f115 D-Link DSB-C120
|
pac207 2001:f115 D-Link DSB-C120
|
||||||
spca500 2899:012c Toptro Industrial
|
spca500 2899:012c Toptro Industrial
|
||||||
|
|
15
MAINTAINERS
15
MAINTAINERS
|
@ -222,8 +222,7 @@ W: http://code.google.com/p/aceracpi
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
ACPI
|
ACPI
|
||||||
P: Andi Kleen
|
P: Len Brown
|
||||||
M: ak@linux.intel.com
|
|
||||||
M: lenb@kernel.org
|
M: lenb@kernel.org
|
||||||
L: linux-acpi@vger.kernel.org
|
L: linux-acpi@vger.kernel.org
|
||||||
W: http://www.lesswatts.org/projects/acpi/
|
W: http://www.lesswatts.org/projects/acpi/
|
||||||
|
@ -467,6 +466,12 @@ M: kernel@wantstofly.org
|
||||||
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
ARM/AFEB9260 MACHINE SUPPORT
|
||||||
|
P: Sergey Lapin
|
||||||
|
M: slapin@ossfans.org
|
||||||
|
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
ARM/AJECO 1ARM MACHINE SUPPORT
|
ARM/AJECO 1ARM MACHINE SUPPORT
|
||||||
P: Lennert Buytenhek
|
P: Lennert Buytenhek
|
||||||
M: kernel@wantstofly.org
|
M: kernel@wantstofly.org
|
||||||
|
@ -751,11 +756,13 @@ P: Ville Syrjala
|
||||||
M: syrjala@sci.fi
|
M: syrjala@sci.fi
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
ATL1 ETHERNET DRIVER
|
ATLX ETHERNET DRIVERS
|
||||||
P: Jay Cliburn
|
P: Jay Cliburn
|
||||||
M: jcliburn@gmail.com
|
M: jcliburn@gmail.com
|
||||||
P: Chris Snook
|
P: Chris Snook
|
||||||
M: csnook@redhat.com
|
M: csnook@redhat.com
|
||||||
|
P: Jie Yang
|
||||||
|
M: jie.yang@atheros.com
|
||||||
L: atl1-devel@lists.sourceforge.net
|
L: atl1-devel@lists.sourceforge.net
|
||||||
W: http://sourceforge.net/projects/atl1
|
W: http://sourceforge.net/projects/atl1
|
||||||
W: http://atl1.sourceforge.net
|
W: http://atl1.sourceforge.net
|
||||||
|
@ -1594,7 +1601,7 @@ S: Supported
|
||||||
EMBEDDED LINUX
|
EMBEDDED LINUX
|
||||||
P: Paul Gortmaker
|
P: Paul Gortmaker
|
||||||
M: paul.gortmaker@windriver.com
|
M: paul.gortmaker@windriver.com
|
||||||
P David Woodhouse
|
P: David Woodhouse
|
||||||
M: dwmw2@infradead.org
|
M: dwmw2@infradead.org
|
||||||
L: linux-embedded@vger.kernel.org
|
L: linux-embedded@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
||||||
VERSION = 2
|
VERSION = 2
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 27
|
SUBLEVEL = 27
|
||||||
EXTRAVERSION = -rc5
|
EXTRAVERSION = -rc6
|
||||||
NAME = Rotary Wombat
|
NAME = Rotary Wombat
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -496,6 +496,7 @@ CONFIG_INPUT_TOUCHSCREEN=y
|
||||||
# CONFIG_TOUCHSCREEN_PENMOUNT is not set
|
# CONFIG_TOUCHSCREEN_PENMOUNT is not set
|
||||||
# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
|
# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
|
||||||
# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
|
# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
|
||||||
|
CONFIG_TOUCHSCREEN_ATMEL_TSADCC=y
|
||||||
# CONFIG_TOUCHSCREEN_UCB1400 is not set
|
# CONFIG_TOUCHSCREEN_UCB1400 is not set
|
||||||
# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
|
# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
|
||||||
# CONFIG_INPUT_MISC is not set
|
# CONFIG_INPUT_MISC is not set
|
||||||
|
|
|
@ -18,15 +18,7 @@
|
||||||
#include <linux/compiler.h>
|
#include <linux/compiler.h>
|
||||||
#include <asm/types.h>
|
#include <asm/types.h>
|
||||||
|
|
||||||
#ifdef __ARMEB__
|
static inline __attribute_const__ __u32 ___arch__swab32(__u32 x)
|
||||||
# define __BIG_ENDIAN
|
|
||||||
#else
|
|
||||||
# define __LITTLE_ENDIAN
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define __SWAB_64_THRU_32__
|
|
||||||
|
|
||||||
static inline __attribute_const__ __u32 __arch_swab32(__u32 x)
|
|
||||||
{
|
{
|
||||||
__u32 t;
|
__u32 t;
|
||||||
|
|
||||||
|
@ -48,8 +40,19 @@ static inline __attribute_const__ __u32 __arch_swab32(__u32 x)
|
||||||
|
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
#define __arch_swab32 __arch_swab32
|
|
||||||
|
|
||||||
#include <linux/byteorder.h>
|
#define __arch__swab32(x) ___arch__swab32(x)
|
||||||
|
|
||||||
|
#if !defined(__STRICT_ANSI__) || defined(__KERNEL__)
|
||||||
|
# define __BYTEORDER_HAS_U64__
|
||||||
|
# define __SWAB_64_THRU_32__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __ARMEB__
|
||||||
|
#include <linux/byteorder/big_endian.h>
|
||||||
|
#else
|
||||||
|
#include <linux/byteorder/little_endian.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -175,6 +175,15 @@ config MACH_SAM9_L9260
|
||||||
Select this if you are using Olimex's SAM9-L9260 board based on the Atmel AT91SAM9260.
|
Select this if you are using Olimex's SAM9-L9260 board based on the Atmel AT91SAM9260.
|
||||||
<http://www.olimex.com/dev/sam9-L9260.html>
|
<http://www.olimex.com/dev/sam9-L9260.html>
|
||||||
|
|
||||||
|
config MACH_AFEB9260
|
||||||
|
bool "Custom afeb9260 board v1"
|
||||||
|
depends on ARCH_AT91SAM9260
|
||||||
|
help
|
||||||
|
Select this if you are using custom afeb9260 board based on
|
||||||
|
open hardware design. Select this for revision 1 of the board.
|
||||||
|
<svn://194.85.238.22/home/users/george/svn/arm9eb>
|
||||||
|
<http://groups.google.com/group/arm9fpga-evolution-board>
|
||||||
|
|
||||||
config MACH_USB_A9260
|
config MACH_USB_A9260
|
||||||
bool "CALAO USB-A9260"
|
bool "CALAO USB-A9260"
|
||||||
depends on ARCH_AT91SAM9260
|
depends on ARCH_AT91SAM9260
|
||||||
|
@ -314,6 +323,19 @@ config AT91_PROGRAMMABLE_CLOCKS
|
||||||
Select this if you need to program one or more of the PCK0..PCK3
|
Select this if you need to program one or more of the PCK0..PCK3
|
||||||
programmable clock outputs.
|
programmable clock outputs.
|
||||||
|
|
||||||
|
config AT91_SLOW_CLOCK
|
||||||
|
bool "Suspend-to-RAM disables main oscillator"
|
||||||
|
depends on SUSPEND
|
||||||
|
help
|
||||||
|
Select this if you want Suspend-to-RAM to save the most power
|
||||||
|
possible (without powering off the CPU) by disabling the PLLs
|
||||||
|
and main oscillator so that only the 32 KiHz clock is available.
|
||||||
|
|
||||||
|
When only that slow-clock is available, some peripherals lose
|
||||||
|
functionality. Many can't issue wakeup events unless faster
|
||||||
|
clocks are available. Some lose their operating state and
|
||||||
|
need to be completely re-initialized.
|
||||||
|
|
||||||
config AT91_TIMER_HZ
|
config AT91_TIMER_HZ
|
||||||
int "Kernel HZ (jiffies per second)"
|
int "Kernel HZ (jiffies per second)"
|
||||||
range 32 1024
|
range 32 1024
|
||||||
|
|
|
@ -39,6 +39,7 @@ obj-$(CONFIG_MACH_CAM60) += board-cam60.o
|
||||||
obj-$(CONFIG_MACH_SAM9_L9260) += board-sam9-l9260.o
|
obj-$(CONFIG_MACH_SAM9_L9260) += board-sam9-l9260.o
|
||||||
obj-$(CONFIG_MACH_USB_A9260) += board-usb-a9260.o
|
obj-$(CONFIG_MACH_USB_A9260) += board-usb-a9260.o
|
||||||
obj-$(CONFIG_MACH_QIL_A9260) += board-qil-a9260.o
|
obj-$(CONFIG_MACH_QIL_A9260) += board-qil-a9260.o
|
||||||
|
obj-$(CONFIG_MACH_AFEB9260) += board-afeb-9260v1.o
|
||||||
|
|
||||||
# AT91SAM9261 board-specific support
|
# AT91SAM9261 board-specific support
|
||||||
obj-$(CONFIG_MACH_AT91SAM9261EK) += board-sam9261ek.o
|
obj-$(CONFIG_MACH_AT91SAM9261EK) += board-sam9261ek.o
|
||||||
|
@ -64,6 +65,7 @@ obj-y += leds.o
|
||||||
|
|
||||||
# Power Management
|
# Power Management
|
||||||
obj-$(CONFIG_PM) += pm.o
|
obj-$(CONFIG_PM) += pm.o
|
||||||
|
obj-$(CONFIG_AT91_SLOW_CLOCK) += pm_slowclock.o
|
||||||
|
|
||||||
ifeq ($(CONFIG_PM_DEBUG),y)
|
ifeq ($(CONFIG_PM_DEBUG),y)
|
||||||
CFLAGS_pm.o += -DDEBUG
|
CFLAGS_pm.o += -DDEBUG
|
||||||
|
|
|
@ -141,8 +141,8 @@ static struct clk tcb_clk = {
|
||||||
.pmc_mask = 1 << AT91CAP9_ID_TCB,
|
.pmc_mask = 1 << AT91CAP9_ID_TCB,
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
.type = CLK_TYPE_PERIPHERAL,
|
||||||
};
|
};
|
||||||
static struct clk pwmc_clk = {
|
static struct clk pwm_clk = {
|
||||||
.name = "pwmc_clk",
|
.name = "pwm_clk",
|
||||||
.pmc_mask = 1 << AT91CAP9_ID_PWMC,
|
.pmc_mask = 1 << AT91CAP9_ID_PWMC,
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
.type = CLK_TYPE_PERIPHERAL,
|
||||||
};
|
};
|
||||||
|
@ -207,7 +207,7 @@ static struct clk *periph_clocks[] __initdata = {
|
||||||
&ssc1_clk,
|
&ssc1_clk,
|
||||||
&ac97_clk,
|
&ac97_clk,
|
||||||
&tcb_clk,
|
&tcb_clk,
|
||||||
&pwmc_clk,
|
&pwm_clk,
|
||||||
&macb_clk,
|
&macb_clk,
|
||||||
&aestdes_clk,
|
&aestdes_clk,
|
||||||
&adc_clk,
|
&adc_clk,
|
||||||
|
|
|
@ -718,6 +718,60 @@ static void __init at91_add_device_watchdog(void) {}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------
|
||||||
|
* PWM
|
||||||
|
* --------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if defined(CONFIG_ATMEL_PWM)
|
||||||
|
static u32 pwm_mask;
|
||||||
|
|
||||||
|
static struct resource pwm_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = AT91CAP9_BASE_PWMC,
|
||||||
|
.end = AT91CAP9_BASE_PWMC + SZ_16K - 1,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = AT91CAP9_ID_PWMC,
|
||||||
|
.end = AT91CAP9_ID_PWMC,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device at91cap9_pwm0_device = {
|
||||||
|
.name = "atmel_pwm",
|
||||||
|
.id = -1,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &pwm_mask,
|
||||||
|
},
|
||||||
|
.resource = pwm_resources,
|
||||||
|
.num_resources = ARRAY_SIZE(pwm_resources),
|
||||||
|
};
|
||||||
|
|
||||||
|
void __init at91_add_device_pwm(u32 mask)
|
||||||
|
{
|
||||||
|
if (mask & (1 << AT91_PWM0))
|
||||||
|
at91_set_A_periph(AT91_PIN_PB19, 1); /* enable PWM0 */
|
||||||
|
|
||||||
|
if (mask & (1 << AT91_PWM1))
|
||||||
|
at91_set_B_periph(AT91_PIN_PB8, 1); /* enable PWM1 */
|
||||||
|
|
||||||
|
if (mask & (1 << AT91_PWM2))
|
||||||
|
at91_set_B_periph(AT91_PIN_PC29, 1); /* enable PWM2 */
|
||||||
|
|
||||||
|
if (mask & (1 << AT91_PWM3))
|
||||||
|
at91_set_B_periph(AT91_PIN_PA11, 1); /* enable PWM3 */
|
||||||
|
|
||||||
|
pwm_mask = mask;
|
||||||
|
|
||||||
|
platform_device_register(&at91cap9_pwm0_device);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
void __init at91_add_device_pwm(u32 mask) {}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
/* --------------------------------------------------------------------
|
||||||
* AC97
|
* AC97
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
|
|
@ -129,8 +129,8 @@ static struct clk tcb_clk = {
|
||||||
.pmc_mask = 1 << AT91SAM9263_ID_TCB,
|
.pmc_mask = 1 << AT91SAM9263_ID_TCB,
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
.type = CLK_TYPE_PERIPHERAL,
|
||||||
};
|
};
|
||||||
static struct clk pwmc_clk = {
|
static struct clk pwm_clk = {
|
||||||
.name = "pwmc_clk",
|
.name = "pwm_clk",
|
||||||
.pmc_mask = 1 << AT91SAM9263_ID_PWMC,
|
.pmc_mask = 1 << AT91SAM9263_ID_PWMC,
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
.type = CLK_TYPE_PERIPHERAL,
|
||||||
};
|
};
|
||||||
|
@ -187,7 +187,7 @@ static struct clk *periph_clocks[] __initdata = {
|
||||||
&ssc1_clk,
|
&ssc1_clk,
|
||||||
&ac97_clk,
|
&ac97_clk,
|
||||||
&tcb_clk,
|
&tcb_clk,
|
||||||
&pwmc_clk,
|
&pwm_clk,
|
||||||
&macb_clk,
|
&macb_clk,
|
||||||
&twodge_clk,
|
&twodge_clk,
|
||||||
&udc_clk,
|
&udc_clk,
|
||||||
|
|
|
@ -885,6 +885,59 @@ static void __init at91_add_device_watchdog(void) {}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------
|
||||||
|
* PWM
|
||||||
|
* --------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if defined(CONFIG_ATMEL_PWM)
|
||||||
|
static u32 pwm_mask;
|
||||||
|
|
||||||
|
static struct resource pwm_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = AT91SAM9263_BASE_PWMC,
|
||||||
|
.end = AT91SAM9263_BASE_PWMC + SZ_16K - 1,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = AT91SAM9263_ID_PWMC,
|
||||||
|
.end = AT91SAM9263_ID_PWMC,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device at91sam9263_pwm0_device = {
|
||||||
|
.name = "atmel_pwm",
|
||||||
|
.id = -1,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &pwm_mask,
|
||||||
|
},
|
||||||
|
.resource = pwm_resources,
|
||||||
|
.num_resources = ARRAY_SIZE(pwm_resources),
|
||||||
|
};
|
||||||
|
|
||||||
|
void __init at91_add_device_pwm(u32 mask)
|
||||||
|
{
|
||||||
|
if (mask & (1 << AT91_PWM0))
|
||||||
|
at91_set_B_periph(AT91_PIN_PB7, 1); /* enable PWM0 */
|
||||||
|
|
||||||
|
if (mask & (1 << AT91_PWM1))
|
||||||
|
at91_set_B_periph(AT91_PIN_PB8, 1); /* enable PWM1 */
|
||||||
|
|
||||||
|
if (mask & (1 << AT91_PWM2))
|
||||||
|
at91_set_B_periph(AT91_PIN_PC29, 1); /* enable PWM2 */
|
||||||
|
|
||||||
|
if (mask & (1 << AT91_PWM3))
|
||||||
|
at91_set_B_periph(AT91_PIN_PB29, 1); /* enable PWM3 */
|
||||||
|
|
||||||
|
pwm_mask = mask;
|
||||||
|
|
||||||
|
platform_device_register(&at91sam9263_pwm0_device);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
void __init at91_add_device_pwm(u32 mask) {}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
/* --------------------------------------------------------------------
|
||||||
* SSC -- Synchronous Serial Controller
|
* SSC -- Synchronous Serial Controller
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
|
|
@ -131,8 +131,8 @@ static struct clk tc2_clk = {
|
||||||
.pmc_mask = 1 << AT91SAM9RL_ID_TC2,
|
.pmc_mask = 1 << AT91SAM9RL_ID_TC2,
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
.type = CLK_TYPE_PERIPHERAL,
|
||||||
};
|
};
|
||||||
static struct clk pwmc_clk = {
|
static struct clk pwm_clk = {
|
||||||
.name = "pwmc_clk",
|
.name = "pwm_clk",
|
||||||
.pmc_mask = 1 << AT91SAM9RL_ID_PWMC,
|
.pmc_mask = 1 << AT91SAM9RL_ID_PWMC,
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
.type = CLK_TYPE_PERIPHERAL,
|
||||||
};
|
};
|
||||||
|
@ -180,7 +180,7 @@ static struct clk *periph_clocks[] __initdata = {
|
||||||
&tc0_clk,
|
&tc0_clk,
|
||||||
&tc1_clk,
|
&tc1_clk,
|
||||||
&tc2_clk,
|
&tc2_clk,
|
||||||
&pwmc_clk,
|
&pwm_clk,
|
||||||
&tsc_clk,
|
&tsc_clk,
|
||||||
&dma_clk,
|
&dma_clk,
|
||||||
&udphs_clk,
|
&udphs_clk,
|
||||||
|
|
|
@ -526,6 +526,51 @@ static void __init at91_add_device_tc(void) { }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------
|
||||||
|
* Touchscreen
|
||||||
|
* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#if defined(CONFIG_TOUCHSCREEN_ATMEL_TSADCC) || defined(CONFIG_TOUCHSCREEN_ATMEL_TSADCC_MODULE)
|
||||||
|
static u64 tsadcc_dmamask = DMA_BIT_MASK(32);
|
||||||
|
|
||||||
|
static struct resource tsadcc_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = AT91SAM9RL_BASE_TSC,
|
||||||
|
.end = AT91SAM9RL_BASE_TSC + SZ_16K - 1,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = AT91SAM9RL_ID_TSC,
|
||||||
|
.end = AT91SAM9RL_ID_TSC,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device at91sam9rl_tsadcc_device = {
|
||||||
|
.name = "atmel_tsadcc",
|
||||||
|
.id = -1,
|
||||||
|
.dev = {
|
||||||
|
.dma_mask = &tsadcc_dmamask,
|
||||||
|
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||||
|
},
|
||||||
|
.resource = tsadcc_resources,
|
||||||
|
.num_resources = ARRAY_SIZE(tsadcc_resources),
|
||||||
|
};
|
||||||
|
|
||||||
|
void __init at91_add_device_tsadcc(void)
|
||||||
|
{
|
||||||
|
at91_set_A_periph(AT91_PIN_PA17, 0); /* AD0_XR */
|
||||||
|
at91_set_A_periph(AT91_PIN_PA18, 0); /* AD1_XL */
|
||||||
|
at91_set_A_periph(AT91_PIN_PA19, 0); /* AD2_YT */
|
||||||
|
at91_set_A_periph(AT91_PIN_PA20, 0); /* AD3_TB */
|
||||||
|
|
||||||
|
platform_device_register(&at91sam9rl_tsadcc_device);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
void __init at91_add_device_tsadcc(void) {}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
/* --------------------------------------------------------------------
|
||||||
* RTC
|
* RTC
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
@ -591,6 +636,59 @@ static void __init at91_add_device_watchdog(void) {}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------
|
||||||
|
* PWM
|
||||||
|
* --------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if defined(CONFIG_ATMEL_PWM)
|
||||||
|
static u32 pwm_mask;
|
||||||
|
|
||||||
|
static struct resource pwm_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = AT91SAM9RL_BASE_PWMC,
|
||||||
|
.end = AT91SAM9RL_BASE_PWMC + SZ_16K - 1,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = AT91SAM9RL_ID_PWMC,
|
||||||
|
.end = AT91SAM9RL_ID_PWMC,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device at91sam9rl_pwm0_device = {
|
||||||
|
.name = "atmel_pwm",
|
||||||
|
.id = -1,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &pwm_mask,
|
||||||
|
},
|
||||||
|
.resource = pwm_resources,
|
||||||
|
.num_resources = ARRAY_SIZE(pwm_resources),
|
||||||
|
};
|
||||||
|
|
||||||
|
void __init at91_add_device_pwm(u32 mask)
|
||||||
|
{
|
||||||
|
if (mask & (1 << AT91_PWM0))
|
||||||
|
at91_set_B_periph(AT91_PIN_PB8, 1); /* enable PWM0 */
|
||||||
|
|
||||||
|
if (mask & (1 << AT91_PWM1))
|
||||||
|
at91_set_B_periph(AT91_PIN_PB9, 1); /* enable PWM1 */
|
||||||
|
|
||||||
|
if (mask & (1 << AT91_PWM2))
|
||||||
|
at91_set_B_periph(AT91_PIN_PD5, 1); /* enable PWM2 */
|
||||||
|
|
||||||
|
if (mask & (1 << AT91_PWM3))
|
||||||
|
at91_set_B_periph(AT91_PIN_PD8, 1); /* enable PWM3 */
|
||||||
|
|
||||||
|
pwm_mask = mask;
|
||||||
|
|
||||||
|
platform_device_register(&at91sam9rl_pwm0_device);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
void __init at91_add_device_pwm(u32 mask) {}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
/* --------------------------------------------------------------------
|
||||||
* SSC -- Synchronous Serial Controller
|
* SSC -- Synchronous Serial Controller
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
|
|
@ -0,0 +1,210 @@
|
||||||
|
/*
|
||||||
|
* linux/arch/arm/mach-at91/board-afeb-9260v1.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2005 SAN People
|
||||||
|
* Copyright (C) 2006 Atmel
|
||||||
|
* Copyright (C) 2008 Sergey Lapin
|
||||||
|
*
|
||||||
|
* A custom board designed as open hardware; PCBs and various information
|
||||||
|
* is available at http://groups.google.com/group/arm9fpga-evolution-board/
|
||||||
|
* Subversion repository: svn://194.85.238.22/home/users/george/svn/arm9eb
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/types.h>
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/mm.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/spi/spi.h>
|
||||||
|
#include <linux/clk.h>
|
||||||
|
#include <linux/dma-mapping.h>
|
||||||
|
|
||||||
|
#include <mach/hardware.h>
|
||||||
|
#include <asm/setup.h>
|
||||||
|
#include <asm/mach-types.h>
|
||||||
|
#include <asm/irq.h>
|
||||||
|
|
||||||
|
#include <asm/mach/arch.h>
|
||||||
|
#include <asm/mach/map.h>
|
||||||
|
#include <asm/mach/irq.h>
|
||||||
|
|
||||||
|
#include <mach/board.h>
|
||||||
|
#include <mach/gpio.h>
|
||||||
|
|
||||||
|
#include "generic.h"
|
||||||
|
|
||||||
|
|
||||||
|
static void __init afeb9260_map_io(void)
|
||||||
|
{
|
||||||
|
/* Initialize processor: 18.432 MHz crystal */
|
||||||
|
at91sam9260_initialize(18432000);
|
||||||
|
|
||||||
|
/* DGBU on ttyS0. (Rx & Tx only) */
|
||||||
|
at91_register_uart(0, 0, 0);
|
||||||
|
|
||||||
|
/* USART0 on ttyS1. (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI) */
|
||||||
|
at91_register_uart(AT91SAM9260_ID_US0, 1,
|
||||||
|
ATMEL_UART_CTS | ATMEL_UART_RTS
|
||||||
|
| ATMEL_UART_DTR | ATMEL_UART_DSR
|
||||||
|
| ATMEL_UART_DCD | ATMEL_UART_RI);
|
||||||
|
|
||||||
|
/* USART1 on ttyS2. (Rx, Tx, RTS, CTS) */
|
||||||
|
at91_register_uart(AT91SAM9260_ID_US1, 2,
|
||||||
|
ATMEL_UART_CTS | ATMEL_UART_RTS);
|
||||||
|
|
||||||
|
/* set serial console to ttyS0 (ie, DBGU) */
|
||||||
|
at91_set_serial_console(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __init afeb9260_init_irq(void)
|
||||||
|
{
|
||||||
|
at91sam9260_init_interrupts(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* USB Host port
|
||||||
|
*/
|
||||||
|
static struct at91_usbh_data __initdata afeb9260_usbh_data = {
|
||||||
|
.ports = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* USB Device port
|
||||||
|
*/
|
||||||
|
static struct at91_udc_data __initdata afeb9260_udc_data = {
|
||||||
|
.vbus_pin = AT91_PIN_PC5,
|
||||||
|
.pullup_pin = 0, /* pull-up driven by UDC */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SPI devices.
|
||||||
|
*/
|
||||||
|
static struct spi_board_info afeb9260_spi_devices[] = {
|
||||||
|
{ /* DataFlash chip */
|
||||||
|
.modalias = "mtd_dataflash",
|
||||||
|
.chip_select = 1,
|
||||||
|
.max_speed_hz = 15 * 1000 * 1000,
|
||||||
|
.bus_num = 0,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MACB Ethernet device
|
||||||
|
*/
|
||||||
|
static struct at91_eth_data __initdata afeb9260_macb_data = {
|
||||||
|
.phy_irq_pin = AT91_PIN_PA9,
|
||||||
|
.is_rmii = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NAND flash
|
||||||
|
*/
|
||||||
|
static struct mtd_partition __initdata afeb9260_nand_partition[] = {
|
||||||
|
{
|
||||||
|
.name = "bootloader",
|
||||||
|
.offset = 0,
|
||||||
|
.size = (640 * SZ_1K),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "kernel",
|
||||||
|
.offset = MTDPART_OFS_NXTBLK,
|
||||||
|
.size = SZ_2M,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "rootfs",
|
||||||
|
.offset = MTDPART_OFS_NXTBLK,
|
||||||
|
.size = MTDPART_SIZ_FULL,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct mtd_partition * __init nand_partitions(int size, int *num_partitions)
|
||||||
|
{
|
||||||
|
*num_partitions = ARRAY_SIZE(afeb9260_nand_partition);
|
||||||
|
return afeb9260_nand_partition;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct atmel_nand_data __initdata afeb9260_nand_data = {
|
||||||
|
.ale = 21,
|
||||||
|
.cle = 22,
|
||||||
|
.rdy_pin = AT91_PIN_PC13,
|
||||||
|
.enable_pin = AT91_PIN_PC14,
|
||||||
|
.partition_info = nand_partitions,
|
||||||
|
.bus_width_16 = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MCI (SD/MMC)
|
||||||
|
*/
|
||||||
|
static struct at91_mmc_data __initdata afeb9260_mmc_data = {
|
||||||
|
.slot_b = 1,
|
||||||
|
.wire4 = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static struct i2c_board_info __initdata afeb9260_i2c_devices[] = {
|
||||||
|
{
|
||||||
|
I2C_BOARD_INFO("fm3130", 0x68),
|
||||||
|
I2C_BOARD_INFO("24c64", 0x50),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static void __init afeb9260_board_init(void)
|
||||||
|
{
|
||||||
|
/* Serial */
|
||||||
|
at91_add_device_serial();
|
||||||
|
/* USB Host */
|
||||||
|
at91_add_device_usbh(&afeb9260_usbh_data);
|
||||||
|
/* USB Device */
|
||||||
|
at91_add_device_udc(&afeb9260_udc_data);
|
||||||
|
/* SPI */
|
||||||
|
at91_add_device_spi(afeb9260_spi_devices,
|
||||||
|
ARRAY_SIZE(afeb9260_spi_devices));
|
||||||
|
/* NAND */
|
||||||
|
at91_add_device_nand(&afeb9260_nand_data);
|
||||||
|
/* Ethernet */
|
||||||
|
at91_add_device_eth(&afeb9260_macb_data);
|
||||||
|
|
||||||
|
/* Standard function's pin assignments are not
|
||||||
|
* appropriate for us and generic code provide
|
||||||
|
* no API to configure these pins any other way */
|
||||||
|
at91_set_B_periph(AT91_PIN_PA10, 0); /* ETX2 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PA11, 0); /* ETX3 */
|
||||||
|
/* MMC */
|
||||||
|
at91_add_device_mmc(0, &afeb9260_mmc_data);
|
||||||
|
/* I2C */
|
||||||
|
at91_add_device_i2c(afeb9260_i2c_devices,
|
||||||
|
ARRAY_SIZE(afeb9260_i2c_devices));
|
||||||
|
}
|
||||||
|
|
||||||
|
MACHINE_START(AFEB9260, "Custom afeb9260 board")
|
||||||
|
/* Maintainer: Sergey Lapin <slapin@ossfans.org> */
|
||||||
|
.phys_io = AT91_BASE_SYS,
|
||||||
|
.io_pg_offst = (AT91_VA_BASE_SYS >> 18) & 0xfffc,
|
||||||
|
.boot_params = AT91_SDRAM_BASE + 0x100,
|
||||||
|
.timer = &at91sam926x_timer,
|
||||||
|
.map_io = afeb9260_map_io,
|
||||||
|
.init_irq = afeb9260_init_irq,
|
||||||
|
.init_machine = afeb9260_board_init,
|
||||||
|
MACHINE_END
|
||||||
|
|
|
@ -214,7 +214,7 @@ static struct physmap_flash_data cap9adk_nor_data = {
|
||||||
};
|
};
|
||||||
|
|
||||||
#define NOR_BASE AT91_CHIPSELECT_0
|
#define NOR_BASE AT91_CHIPSELECT_0
|
||||||
#define NOR_SIZE 0x800000
|
#define NOR_SIZE SZ_8M
|
||||||
|
|
||||||
static struct resource nor_flash_resources[] = {
|
static struct resource nor_flash_resources[] = {
|
||||||
{
|
{
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
|
@ -34,6 +33,7 @@
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
#include <asm/mach/irq.h>
|
#include <asm/mach/irq.h>
|
||||||
|
|
||||||
|
#include <mach/hardware.h>
|
||||||
#include <mach/board.h>
|
#include <mach/board.h>
|
||||||
#include <mach/gpio.h>
|
#include <mach/gpio.h>
|
||||||
|
|
||||||
|
@ -114,6 +114,30 @@ static struct spi_board_info carmeva_spi_devices[] = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct gpio_led carmeva_leds[] = {
|
||||||
|
{ /* "user led 1", LED9 */
|
||||||
|
.name = "led9",
|
||||||
|
.gpio = AT91_PIN_PA21,
|
||||||
|
.active_low = 1,
|
||||||
|
.default_trigger = "heartbeat",
|
||||||
|
},
|
||||||
|
{ /* "user led 2", LED10 */
|
||||||
|
.name = "led10",
|
||||||
|
.gpio = AT91_PIN_PA25,
|
||||||
|
.active_low = 1,
|
||||||
|
},
|
||||||
|
{ /* "user led 3", LED11 */
|
||||||
|
.name = "led11",
|
||||||
|
.gpio = AT91_PIN_PA26,
|
||||||
|
.active_low = 1,
|
||||||
|
},
|
||||||
|
{ /* "user led 4", LED12 */
|
||||||
|
.name = "led12",
|
||||||
|
.gpio = AT91_PIN_PA18,
|
||||||
|
.active_low = 1,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
static void __init carmeva_board_init(void)
|
static void __init carmeva_board_init(void)
|
||||||
{
|
{
|
||||||
/* Serial */
|
/* Serial */
|
||||||
|
@ -132,6 +156,8 @@ static void __init carmeva_board_init(void)
|
||||||
// at91_add_device_cf(&carmeva_cf_data);
|
// at91_add_device_cf(&carmeva_cf_data);
|
||||||
/* MMC */
|
/* MMC */
|
||||||
at91_add_device_mmc(0, &carmeva_mmc_data);
|
at91_add_device_mmc(0, &carmeva_mmc_data);
|
||||||
|
/* LEDs */
|
||||||
|
at91_gpio_leds(carmeva_leds, ARRAY_SIZE(carmeva_leds));
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(CARMEVA, "Carmeva")
|
MACHINE_START(CARMEVA, "Carmeva")
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
#include <linux/input.h>
|
#include <linux/input.h>
|
||||||
#include <linux/gpio_keys.h>
|
#include <linux/gpio_keys.h>
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
|
@ -37,6 +36,7 @@
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
#include <asm/mach/irq.h>
|
#include <asm/mach/irq.h>
|
||||||
|
|
||||||
|
#include <mach/hardware.h>
|
||||||
#include <mach/board.h>
|
#include <mach/board.h>
|
||||||
#include <mach/gpio.h>
|
#include <mach/gpio.h>
|
||||||
|
|
||||||
|
@ -114,7 +114,7 @@ static struct spi_board_info csb337_spi_devices[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
#define CSB_FLASH_BASE AT91_CHIPSELECT_0
|
#define CSB_FLASH_BASE AT91_CHIPSELECT_0
|
||||||
#define CSB_FLASH_SIZE 0x800000
|
#define CSB_FLASH_SIZE SZ_8M
|
||||||
|
|
||||||
static struct mtd_partition csb_flash_partitions[] = {
|
static struct mtd_partition csb_flash_partitions[] = {
|
||||||
{
|
{
|
||||||
|
@ -193,11 +193,11 @@ static struct platform_device csb300_button_device = {
|
||||||
|
|
||||||
static void __init csb300_add_device_buttons(void)
|
static void __init csb300_add_device_buttons(void)
|
||||||
{
|
{
|
||||||
at91_set_gpio_input(AT91_PIN_PB29, 0); /* sw0 */
|
at91_set_gpio_input(AT91_PIN_PB29, 1); /* sw0 */
|
||||||
at91_set_deglitch(AT91_PIN_PB29, 1);
|
at91_set_deglitch(AT91_PIN_PB29, 1);
|
||||||
at91_set_gpio_input(AT91_PIN_PB28, 0); /* sw1 */
|
at91_set_gpio_input(AT91_PIN_PB28, 1); /* sw1 */
|
||||||
at91_set_deglitch(AT91_PIN_PB28, 1);
|
at91_set_deglitch(AT91_PIN_PB28, 1);
|
||||||
at91_set_gpio_input(AT91_PIN_PA21, 0); /* sw2 */
|
at91_set_gpio_input(AT91_PIN_PA21, 1); /* sw2 */
|
||||||
at91_set_deglitch(AT91_PIN_PA21, 1);
|
at91_set_deglitch(AT91_PIN_PA21, 1);
|
||||||
|
|
||||||
platform_device_register(&csb300_button_device);
|
platform_device_register(&csb300_button_device);
|
||||||
|
@ -224,7 +224,7 @@ static struct gpio_led csb_leds[] = {
|
||||||
.gpio = AT91_PIN_PB0,
|
.gpio = AT91_PIN_PB0,
|
||||||
.active_low = 1,
|
.active_low = 1,
|
||||||
.default_trigger = "ide-disk",
|
.default_trigger = "ide-disk",
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/mtd/physmap.h>
|
#include <linux/mtd/physmap.h>
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
|
@ -34,6 +33,7 @@
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
#include <asm/mach/irq.h>
|
#include <asm/mach/irq.h>
|
||||||
|
|
||||||
|
#include <mach/hardware.h>
|
||||||
#include <mach/board.h>
|
#include <mach/board.h>
|
||||||
#include <mach/gpio.h>
|
#include <mach/gpio.h>
|
||||||
|
|
||||||
|
@ -72,7 +72,7 @@ static struct at91_udc_data __initdata csb637_udc_data = {
|
||||||
};
|
};
|
||||||
|
|
||||||
#define CSB_FLASH_BASE AT91_CHIPSELECT_0
|
#define CSB_FLASH_BASE AT91_CHIPSELECT_0
|
||||||
#define CSB_FLASH_SIZE 0x1000000
|
#define CSB_FLASH_SIZE SZ_16M
|
||||||
|
|
||||||
static struct mtd_partition csb_flash_partitions[] = {
|
static struct mtd_partition csb_flash_partitions[] = {
|
||||||
{
|
{
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
#include <linux/spi/spi.h>
|
#include <linux/spi/spi.h>
|
||||||
#include <linux/mtd/physmap.h>
|
#include <linux/mtd/physmap.h>
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
|
@ -38,6 +37,7 @@
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
#include <asm/mach/irq.h>
|
#include <asm/mach/irq.h>
|
||||||
|
|
||||||
|
#include <mach/hardware.h>
|
||||||
#include <mach/board.h>
|
#include <mach/board.h>
|
||||||
#include <mach/gpio.h>
|
#include <mach/gpio.h>
|
||||||
#include <mach/at91rm9200_mc.h>
|
#include <mach/at91rm9200_mc.h>
|
||||||
|
@ -157,7 +157,7 @@ static struct atmel_nand_data __initdata dk_nand_data = {
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DK_FLASH_BASE AT91_CHIPSELECT_0
|
#define DK_FLASH_BASE AT91_CHIPSELECT_0
|
||||||
#define DK_FLASH_SIZE 0x200000
|
#define DK_FLASH_SIZE SZ_2M
|
||||||
|
|
||||||
static struct physmap_flash_data dk_flash_data = {
|
static struct physmap_flash_data dk_flash_data = {
|
||||||
.width = 2,
|
.width = 2,
|
||||||
|
|
|
@ -86,7 +86,7 @@ static struct mtd_partition __initdata my_flash0_partitions[] =
|
||||||
{ /* 0x8400 */
|
{ /* 0x8400 */
|
||||||
.name = "Darrell-loader",
|
.name = "Darrell-loader",
|
||||||
.offset = 0,
|
.offset = 0,
|
||||||
.size = 12* 1056,
|
.size = 12 * 1056,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "U-boot",
|
.name = "U-boot",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
#include <linux/spi/spi.h>
|
#include <linux/spi/spi.h>
|
||||||
#include <linux/mtd/physmap.h>
|
#include <linux/mtd/physmap.h>
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
|
@ -38,6 +37,7 @@
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
#include <asm/mach/irq.h>
|
#include <asm/mach/irq.h>
|
||||||
|
|
||||||
|
#include <mach/hardware.h>
|
||||||
#include <mach/board.h>
|
#include <mach/board.h>
|
||||||
#include <mach/gpio.h>
|
#include <mach/gpio.h>
|
||||||
#include <mach/at91rm9200_mc.h>
|
#include <mach/at91rm9200_mc.h>
|
||||||
|
@ -116,7 +116,7 @@ static struct i2c_board_info __initdata ek_i2c_devices[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
#define EK_FLASH_BASE AT91_CHIPSELECT_0
|
#define EK_FLASH_BASE AT91_CHIPSELECT_0
|
||||||
#define EK_FLASH_SIZE 0x200000
|
#define EK_FLASH_SIZE SZ_2M
|
||||||
|
|
||||||
static struct physmap_flash_data ek_flash_data = {
|
static struct physmap_flash_data ek_flash_data = {
|
||||||
.width = 2,
|
.width = 2,
|
||||||
|
|
|
@ -105,7 +105,7 @@ static struct at91_mmc_data __initdata picotux200_mmc_data = {
|
||||||
// };
|
// };
|
||||||
|
|
||||||
#define PICOTUX200_FLASH_BASE AT91_CHIPSELECT_0
|
#define PICOTUX200_FLASH_BASE AT91_CHIPSELECT_0
|
||||||
#define PICOTUX200_FLASH_SIZE 0x400000
|
#define PICOTUX200_FLASH_SIZE SZ_4M
|
||||||
|
|
||||||
static struct physmap_flash_data picotux200_flash_data = {
|
static struct physmap_flash_data picotux200_flash_data = {
|
||||||
.width = 2,
|
.width = 2,
|
||||||
|
|
|
@ -30,7 +30,6 @@
|
||||||
#include <linux/input.h>
|
#include <linux/input.h>
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
|
@ -39,6 +38,7 @@
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
#include <asm/mach/irq.h>
|
#include <asm/mach/irq.h>
|
||||||
|
|
||||||
|
#include <mach/hardware.h>
|
||||||
#include <mach/board.h>
|
#include <mach/board.h>
|
||||||
#include <mach/gpio.h>
|
#include <mach/gpio.h>
|
||||||
#include <mach/at91_shdwc.h>
|
#include <mach/at91_shdwc.h>
|
||||||
|
@ -119,18 +119,18 @@ static struct at91_eth_data __initdata ek_macb_data = {
|
||||||
static struct mtd_partition __initdata ek_nand_partition[] = {
|
static struct mtd_partition __initdata ek_nand_partition[] = {
|
||||||
{
|
{
|
||||||
.name = "Uboot & Kernel",
|
.name = "Uboot & Kernel",
|
||||||
.offset = 0x00000000,
|
.offset = 0,
|
||||||
.size = 16 * 1024 * 1024,
|
.size = SZ_16M,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Root FS",
|
.name = "Root FS",
|
||||||
.offset = 0x01000000,
|
.offset = MTDPART_OFS_NXTBLK,
|
||||||
.size = 120 * 1024 * 1024,
|
.size = 120 * SZ_1M,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "FS",
|
.name = "FS",
|
||||||
.offset = 0x08800000,
|
.offset = MTDPART_OFS_NXTBLK,
|
||||||
.size = 120 * 1024 * 1024,
|
.size = 120 * SZ_1M,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -126,11 +126,11 @@ static struct mtd_partition __initdata ek_nand_partition[] = {
|
||||||
{
|
{
|
||||||
.name = "Bootloader Area",
|
.name = "Bootloader Area",
|
||||||
.offset = 0,
|
.offset = 0,
|
||||||
.size = 10 * 1024 * 1024,
|
.size = 10 * SZ_1M,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "User Area",
|
.name = "User Area",
|
||||||
.offset = 10 * 1024 * 1024,
|
.offset = MTDPART_OFS_NXTBLK,
|
||||||
.size = MTDPART_SIZ_FULL,
|
.size = MTDPART_SIZ_FULL,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -27,8 +27,10 @@
|
||||||
#include <linux/spi/spi.h>
|
#include <linux/spi/spi.h>
|
||||||
#include <linux/spi/at73c213.h>
|
#include <linux/spi/at73c213.h>
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
|
#include <linux/i2c/at24.h>
|
||||||
|
#include <linux/gpio_keys.h>
|
||||||
|
#include <linux/input.h>
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
|
@ -37,6 +39,7 @@
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
#include <asm/mach/irq.h>
|
#include <asm/mach/irq.h>
|
||||||
|
|
||||||
|
#include <mach/hardware.h>
|
||||||
#include <mach/board.h>
|
#include <mach/board.h>
|
||||||
#include <mach/gpio.h>
|
#include <mach/gpio.h>
|
||||||
|
|
||||||
|
@ -163,11 +166,11 @@ static struct mtd_partition __initdata ek_nand_partition[] = {
|
||||||
{
|
{
|
||||||
.name = "Partition 1",
|
.name = "Partition 1",
|
||||||
.offset = 0,
|
.offset = 0,
|
||||||
.size = 256 * 1024,
|
.size = SZ_256K,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Partition 2",
|
.name = "Partition 2",
|
||||||
.offset = 256 * 1024,
|
.offset = MTDPART_OFS_NXTBLK,
|
||||||
.size = MTDPART_SIZ_FULL,
|
.size = MTDPART_SIZ_FULL,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -222,6 +225,73 @@ static struct gpio_led ek_leds[] = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* I2C devices
|
||||||
|
*/
|
||||||
|
static struct at24_platform_data at24c512 = {
|
||||||
|
.byte_len = SZ_512K / 8,
|
||||||
|
.page_size = 128,
|
||||||
|
.flags = AT24_FLAG_ADDR16,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct i2c_board_info __initdata ek_i2c_devices[] = {
|
||||||
|
{
|
||||||
|
I2C_BOARD_INFO("24c512", 0x50),
|
||||||
|
.platform_data = &at24c512,
|
||||||
|
},
|
||||||
|
/* more devices can be added using expansion connectors */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* GPIO Buttons
|
||||||
|
*/
|
||||||
|
#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
|
||||||
|
static struct gpio_keys_button ek_buttons[] = {
|
||||||
|
{
|
||||||
|
.gpio = AT91_PIN_PA30,
|
||||||
|
.code = BTN_3,
|
||||||
|
.desc = "Button 3",
|
||||||
|
.active_low = 1,
|
||||||
|
.wakeup = 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.gpio = AT91_PIN_PA31,
|
||||||
|
.code = BTN_4,
|
||||||
|
.desc = "Button 4",
|
||||||
|
.active_low = 1,
|
||||||
|
.wakeup = 1,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct gpio_keys_platform_data ek_button_data = {
|
||||||
|
.buttons = ek_buttons,
|
||||||
|
.nbuttons = ARRAY_SIZE(ek_buttons),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device ek_button_device = {
|
||||||
|
.name = "gpio-keys",
|
||||||
|
.id = -1,
|
||||||
|
.num_resources = 0,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &ek_button_data,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static void __init ek_add_device_buttons(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_input(AT91_PIN_PA30, 1); /* btn3 */
|
||||||
|
at91_set_deglitch(AT91_PIN_PA30, 1);
|
||||||
|
at91_set_gpio_input(AT91_PIN_PA31, 1); /* btn4 */
|
||||||
|
at91_set_deglitch(AT91_PIN_PA31, 1);
|
||||||
|
|
||||||
|
platform_device_register(&ek_button_device);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static void __init ek_add_device_buttons(void) {}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static void __init ek_board_init(void)
|
static void __init ek_board_init(void)
|
||||||
{
|
{
|
||||||
/* Serial */
|
/* Serial */
|
||||||
|
@ -239,12 +309,14 @@ static void __init ek_board_init(void)
|
||||||
/* MMC */
|
/* MMC */
|
||||||
at91_add_device_mmc(0, &ek_mmc_data);
|
at91_add_device_mmc(0, &ek_mmc_data);
|
||||||
/* I2C */
|
/* I2C */
|
||||||
at91_add_device_i2c(NULL, 0);
|
at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices));
|
||||||
/* SSC (to AT73C213) */
|
/* SSC (to AT73C213) */
|
||||||
at73c213_set_clk(&at73c213_data);
|
at73c213_set_clk(&at73c213_data);
|
||||||
at91_add_device_ssc(AT91SAM9260_ID_SSC, ATMEL_SSC_TX);
|
at91_add_device_ssc(AT91SAM9260_ID_SSC, ATMEL_SSC_TX);
|
||||||
/* LEDs */
|
/* LEDs */
|
||||||
at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
|
at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
|
||||||
|
/* Push Buttons */
|
||||||
|
ek_add_device_buttons();
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(AT91SAM9260EK, "Atmel AT91SAM9260-EK")
|
MACHINE_START(AT91SAM9260EK, "Atmel AT91SAM9260-EK")
|
||||||
|
|
|
@ -35,7 +35,6 @@
|
||||||
|
|
||||||
#include <video/atmel_lcdc.h>
|
#include <video/atmel_lcdc.h>
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
|
@ -44,6 +43,7 @@
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
#include <asm/mach/irq.h>
|
#include <asm/mach/irq.h>
|
||||||
|
|
||||||
|
#include <mach/hardware.h>
|
||||||
#include <mach/board.h>
|
#include <mach/board.h>
|
||||||
#include <mach/gpio.h>
|
#include <mach/gpio.h>
|
||||||
#include <mach/at91sam9_smc.h>
|
#include <mach/at91sam9_smc.h>
|
||||||
|
@ -168,11 +168,11 @@ static struct mtd_partition __initdata ek_nand_partition[] = {
|
||||||
{
|
{
|
||||||
.name = "Partition 1",
|
.name = "Partition 1",
|
||||||
.offset = 0,
|
.offset = 0,
|
||||||
.size = 256 * 1024,
|
.size = SZ_256K,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Partition 2",
|
.name = "Partition 2",
|
||||||
.offset = 256 * 1024 ,
|
.offset = MTDPART_OFS_NXTBLK,
|
||||||
.size = MTDPART_SIZ_FULL,
|
.size = MTDPART_SIZ_FULL,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -435,24 +435,28 @@ static struct gpio_keys_button ek_buttons[] = {
|
||||||
.code = BTN_0,
|
.code = BTN_0,
|
||||||
.desc = "Button 0",
|
.desc = "Button 0",
|
||||||
.active_low = 1,
|
.active_low = 1,
|
||||||
|
.wakeup = 1,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.gpio = AT91_PIN_PA26,
|
.gpio = AT91_PIN_PA26,
|
||||||
.code = BTN_1,
|
.code = BTN_1,
|
||||||
.desc = "Button 1",
|
.desc = "Button 1",
|
||||||
.active_low = 1,
|
.active_low = 1,
|
||||||
|
.wakeup = 1,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.gpio = AT91_PIN_PA25,
|
.gpio = AT91_PIN_PA25,
|
||||||
.code = BTN_2,
|
.code = BTN_2,
|
||||||
.desc = "Button 2",
|
.desc = "Button 2",
|
||||||
.active_low = 1,
|
.active_low = 1,
|
||||||
|
.wakeup = 1,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.gpio = AT91_PIN_PA24,
|
.gpio = AT91_PIN_PA24,
|
||||||
.code = BTN_3,
|
.code = BTN_3,
|
||||||
.desc = "Button 3",
|
.desc = "Button 3",
|
||||||
.active_low = 1,
|
.active_low = 1,
|
||||||
|
.wakeup = 1,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -472,13 +476,13 @@ static struct platform_device ek_button_device = {
|
||||||
|
|
||||||
static void __init ek_add_device_buttons(void)
|
static void __init ek_add_device_buttons(void)
|
||||||
{
|
{
|
||||||
at91_set_gpio_input(AT91_PIN_PA27, 0); /* btn0 */
|
at91_set_gpio_input(AT91_PIN_PA27, 1); /* btn0 */
|
||||||
at91_set_deglitch(AT91_PIN_PA27, 1);
|
at91_set_deglitch(AT91_PIN_PA27, 1);
|
||||||
at91_set_gpio_input(AT91_PIN_PA26, 0); /* btn1 */
|
at91_set_gpio_input(AT91_PIN_PA26, 1); /* btn1 */
|
||||||
at91_set_deglitch(AT91_PIN_PA26, 1);
|
at91_set_deglitch(AT91_PIN_PA26, 1);
|
||||||
at91_set_gpio_input(AT91_PIN_PA25, 0); /* btn2 */
|
at91_set_gpio_input(AT91_PIN_PA25, 1); /* btn2 */
|
||||||
at91_set_deglitch(AT91_PIN_PA25, 1);
|
at91_set_deglitch(AT91_PIN_PA25, 1);
|
||||||
at91_set_gpio_input(AT91_PIN_PA24, 0); /* btn3 */
|
at91_set_gpio_input(AT91_PIN_PA24, 1); /* btn3 */
|
||||||
at91_set_deglitch(AT91_PIN_PA24, 1);
|
at91_set_deglitch(AT91_PIN_PA24, 1);
|
||||||
|
|
||||||
platform_device_register(&ek_button_device);
|
platform_device_register(&ek_button_device);
|
||||||
|
|
|
@ -26,13 +26,14 @@
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/spi/spi.h>
|
#include <linux/spi/spi.h>
|
||||||
#include <linux/spi/ads7846.h>
|
#include <linux/spi/ads7846.h>
|
||||||
|
#include <linux/i2c/at24.h>
|
||||||
#include <linux/fb.h>
|
#include <linux/fb.h>
|
||||||
#include <linux/gpio_keys.h>
|
#include <linux/gpio_keys.h>
|
||||||
#include <linux/input.h>
|
#include <linux/input.h>
|
||||||
|
#include <linux/leds.h>
|
||||||
|
|
||||||
#include <video/atmel_lcdc.h>
|
#include <video/atmel_lcdc.h>
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
|
@ -41,6 +42,7 @@
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
#include <asm/mach/irq.h>
|
#include <asm/mach/irq.h>
|
||||||
|
|
||||||
|
#include <mach/hardware.h>
|
||||||
#include <mach/board.h>
|
#include <mach/board.h>
|
||||||
#include <mach/gpio.h>
|
#include <mach/gpio.h>
|
||||||
#include <mach/at91sam9_smc.h>
|
#include <mach/at91sam9_smc.h>
|
||||||
|
@ -172,11 +174,11 @@ static struct mtd_partition __initdata ek_nand_partition[] = {
|
||||||
{
|
{
|
||||||
.name = "Partition 1",
|
.name = "Partition 1",
|
||||||
.offset = 0,
|
.offset = 0,
|
||||||
.size = 64 * 1024 * 1024,
|
.size = SZ_64M,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Partition 2",
|
.name = "Partition 2",
|
||||||
.offset = 64 * 1024 * 1024,
|
.offset = MTDPART_OFS_NXTBLK,
|
||||||
.size = MTDPART_SIZ_FULL,
|
.size = MTDPART_SIZ_FULL,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -202,13 +204,31 @@ static struct atmel_nand_data __initdata ek_nand_data = {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* I2C devices
|
||||||
|
*/
|
||||||
|
static struct at24_platform_data at24c512 = {
|
||||||
|
.byte_len = SZ_512K / 8,
|
||||||
|
.page_size = 128,
|
||||||
|
.flags = AT24_FLAG_ADDR16,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static struct i2c_board_info __initdata ek_i2c_devices[] = {
|
||||||
|
{
|
||||||
|
I2C_BOARD_INFO("24c512", 0x50),
|
||||||
|
.platform_data = &at24c512,
|
||||||
|
},
|
||||||
|
/* more devices can be added using expansion connectors */
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* LCD Controller
|
* LCD Controller
|
||||||
*/
|
*/
|
||||||
#if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE)
|
#if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE)
|
||||||
static struct fb_videomode at91_tft_vga_modes[] = {
|
static struct fb_videomode at91_tft_vga_modes[] = {
|
||||||
{
|
{
|
||||||
.name = "TX09D50VM1CCA @ 60",
|
.name = "TX09D50VM1CCA @ 60",
|
||||||
.refresh = 60,
|
.refresh = 60,
|
||||||
.xres = 240, .yres = 320,
|
.xres = 240, .yres = 320,
|
||||||
.pixclock = KHZ2PICOS(4965),
|
.pixclock = KHZ2PICOS(4965),
|
||||||
|
@ -224,7 +244,7 @@ static struct fb_videomode at91_tft_vga_modes[] = {
|
||||||
|
|
||||||
static struct fb_monspecs at91fb_default_monspecs = {
|
static struct fb_monspecs at91fb_default_monspecs = {
|
||||||
.manufacturer = "HIT",
|
.manufacturer = "HIT",
|
||||||
.monitor = "TX09D70VM1CCA",
|
.monitor = "TX09D70VM1CCA",
|
||||||
|
|
||||||
.modedb = at91_tft_vga_modes,
|
.modedb = at91_tft_vga_modes,
|
||||||
.modedb_len = ARRAY_SIZE(at91_tft_vga_modes),
|
.modedb_len = ARRAY_SIZE(at91_tft_vga_modes),
|
||||||
|
@ -235,7 +255,7 @@ static struct fb_monspecs at91fb_default_monspecs = {
|
||||||
};
|
};
|
||||||
|
|
||||||
#define AT91SAM9263_DEFAULT_LCDCON2 (ATMEL_LCDC_MEMOR_LITTLE \
|
#define AT91SAM9263_DEFAULT_LCDCON2 (ATMEL_LCDC_MEMOR_LITTLE \
|
||||||
| ATMEL_LCDC_DISTYPE_TFT \
|
| ATMEL_LCDC_DISTYPE_TFT \
|
||||||
| ATMEL_LCDC_CLKMOD_ALWAYSACTIVE)
|
| ATMEL_LCDC_CLKMOD_ALWAYSACTIVE)
|
||||||
|
|
||||||
static void at91_lcdc_power_control(int on)
|
static void at91_lcdc_power_control(int on)
|
||||||
|
@ -277,7 +297,7 @@ static struct gpio_keys_button ek_buttons[] = {
|
||||||
.active_low = 1,
|
.active_low = 1,
|
||||||
.desc = "right_click",
|
.desc = "right_click",
|
||||||
.wakeup = 1,
|
.wakeup = 1,
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct gpio_keys_platform_data ek_button_data = {
|
static struct gpio_keys_platform_data ek_button_data = {
|
||||||
|
@ -296,9 +316,9 @@ static struct platform_device ek_button_device = {
|
||||||
|
|
||||||
static void __init ek_add_device_buttons(void)
|
static void __init ek_add_device_buttons(void)
|
||||||
{
|
{
|
||||||
at91_set_GPIO_periph(AT91_PIN_PC5, 0); /* left button */
|
at91_set_GPIO_periph(AT91_PIN_PC5, 1); /* left button */
|
||||||
at91_set_deglitch(AT91_PIN_PC5, 1);
|
at91_set_deglitch(AT91_PIN_PC5, 1);
|
||||||
at91_set_GPIO_periph(AT91_PIN_PC4, 0); /* right button */
|
at91_set_GPIO_periph(AT91_PIN_PC4, 1); /* right button */
|
||||||
at91_set_deglitch(AT91_PIN_PC4, 1);
|
at91_set_deglitch(AT91_PIN_PC4, 1);
|
||||||
|
|
||||||
platform_device_register(&ek_button_device);
|
platform_device_register(&ek_button_device);
|
||||||
|
@ -320,25 +340,32 @@ static struct atmel_ac97_data ek_ac97_data = {
|
||||||
* LEDs ... these could all be PWM-driven, for variable brightness
|
* LEDs ... these could all be PWM-driven, for variable brightness
|
||||||
*/
|
*/
|
||||||
static struct gpio_led ek_leds[] = {
|
static struct gpio_led ek_leds[] = {
|
||||||
{ /* "left" led, green, userled1, pwm1 */
|
{ /* "right" led, green, userled2 (could be driven by pwm2) */
|
||||||
.name = "ds1",
|
|
||||||
.gpio = AT91_PIN_PB8,
|
|
||||||
.active_low = 1,
|
|
||||||
.default_trigger = "mmc0",
|
|
||||||
},
|
|
||||||
{ /* "right" led, green, userled2, pwm2 */
|
|
||||||
.name = "ds2",
|
.name = "ds2",
|
||||||
.gpio = AT91_PIN_PC29,
|
.gpio = AT91_PIN_PC29,
|
||||||
.active_low = 1,
|
.active_low = 1,
|
||||||
.default_trigger = "nand-disk",
|
.default_trigger = "nand-disk",
|
||||||
},
|
},
|
||||||
{ /* "power" led, yellow, pwm0 */
|
{ /* "power" led, yellow (could be driven by pwm0) */
|
||||||
.name = "ds3",
|
.name = "ds3",
|
||||||
.gpio = AT91_PIN_PB7,
|
.gpio = AT91_PIN_PB7,
|
||||||
.default_trigger = "heartbeat",
|
.default_trigger = "heartbeat",
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PWM Leds
|
||||||
|
*/
|
||||||
|
static struct gpio_led ek_pwm_led[] = {
|
||||||
|
/* For now only DS1 is PWM-driven (by pwm1) */
|
||||||
|
{
|
||||||
|
.name = "ds1",
|
||||||
|
.gpio = 1, /* is PWM channel number */
|
||||||
|
.active_low = 1,
|
||||||
|
.default_trigger = "none",
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
static void __init ek_board_init(void)
|
static void __init ek_board_init(void)
|
||||||
{
|
{
|
||||||
|
@ -360,7 +387,7 @@ static void __init ek_board_init(void)
|
||||||
/* NAND */
|
/* NAND */
|
||||||
at91_add_device_nand(&ek_nand_data);
|
at91_add_device_nand(&ek_nand_data);
|
||||||
/* I2C */
|
/* I2C */
|
||||||
at91_add_device_i2c(NULL, 0);
|
at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices));
|
||||||
/* LCD Controller */
|
/* LCD Controller */
|
||||||
at91_add_device_lcdc(&ek_lcdc_data);
|
at91_add_device_lcdc(&ek_lcdc_data);
|
||||||
/* Push Buttons */
|
/* Push Buttons */
|
||||||
|
@ -369,6 +396,7 @@ static void __init ek_board_init(void)
|
||||||
at91_add_device_ac97(&ek_ac97_data);
|
at91_add_device_ac97(&ek_ac97_data);
|
||||||
/* LEDs */
|
/* LEDs */
|
||||||
at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
|
at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
|
||||||
|
at91_pwm_leds(ek_pwm_led, ARRAY_SIZE(ek_pwm_led));
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(AT91SAM9263EK, "Atmel AT91SAM9263-EK")
|
MACHINE_START(AT91SAM9263EK, "Atmel AT91SAM9263-EK")
|
||||||
|
|
|
@ -122,16 +122,16 @@ static struct mtd_partition __initdata ek_nand_partition[] = {
|
||||||
{
|
{
|
||||||
.name = "Bootstrap",
|
.name = "Bootstrap",
|
||||||
.offset = 0,
|
.offset = 0,
|
||||||
.size = 4 * 1024 * 1024,
|
.size = 4 * SZ_1M,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Partition 1",
|
.name = "Partition 1",
|
||||||
.offset = 4 * 1024 * 1024,
|
.offset = MTDPART_OFS_NXTBLK,
|
||||||
.size = 60 * 1024 * 1024,
|
.size = 60 * SZ_1M,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Partition 2",
|
.name = "Partition 2",
|
||||||
.offset = 64 * 1024 * 1024,
|
.offset = MTDPART_OFS_NXTBLK,
|
||||||
.size = MTDPART_SIZ_FULL,
|
.size = MTDPART_SIZ_FULL,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
|
|
||||||
#include <video/atmel_lcdc.h>
|
#include <video/atmel_lcdc.h>
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
|
@ -27,6 +26,7 @@
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
#include <asm/mach/irq.h>
|
#include <asm/mach/irq.h>
|
||||||
|
|
||||||
|
#include <mach/hardware.h>
|
||||||
#include <mach/board.h>
|
#include <mach/board.h>
|
||||||
#include <mach/gpio.h>
|
#include <mach/gpio.h>
|
||||||
#include <mach/at91sam9_smc.h>
|
#include <mach/at91sam9_smc.h>
|
||||||
|
@ -81,11 +81,11 @@ static struct mtd_partition __initdata ek_nand_partition[] = {
|
||||||
{
|
{
|
||||||
.name = "Partition 1",
|
.name = "Partition 1",
|
||||||
.offset = 0,
|
.offset = 0,
|
||||||
.size = 256 * 1024,
|
.size = SZ_256K,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Partition 2",
|
.name = "Partition 2",
|
||||||
.offset = 256 * 1024 ,
|
.offset = MTDPART_OFS_NXTBLK,
|
||||||
.size = MTDPART_SIZ_FULL,
|
.size = MTDPART_SIZ_FULL,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -195,6 +195,8 @@ static void __init ek_board_init(void)
|
||||||
at91_add_device_mmc(0, &ek_mmc_data);
|
at91_add_device_mmc(0, &ek_mmc_data);
|
||||||
/* LCD Controller */
|
/* LCD Controller */
|
||||||
at91_add_device_lcdc(&ek_lcdc_data);
|
at91_add_device_lcdc(&ek_lcdc_data);
|
||||||
|
/* Touch Screen Controller */
|
||||||
|
at91_add_device_tsadcc();
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(AT91SAM9RLEK, "Atmel AT91SAM9RL-EK")
|
MACHINE_START(AT91SAM9RLEK, "Atmel AT91SAM9RL-EK")
|
||||||
|
|
|
@ -30,7 +30,6 @@
|
||||||
#include <linux/input.h>
|
#include <linux/input.h>
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
|
@ -39,6 +38,7 @@
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
#include <asm/mach/irq.h>
|
#include <asm/mach/irq.h>
|
||||||
|
|
||||||
|
#include <mach/hardware.h>
|
||||||
#include <mach/board.h>
|
#include <mach/board.h>
|
||||||
#include <mach/gpio.h>
|
#include <mach/gpio.h>
|
||||||
#include <mach/at91_shdwc.h>
|
#include <mach/at91_shdwc.h>
|
||||||
|
@ -93,18 +93,18 @@ static struct at91_eth_data __initdata ek_macb_data = {
|
||||||
static struct mtd_partition __initdata ek_nand_partition[] = {
|
static struct mtd_partition __initdata ek_nand_partition[] = {
|
||||||
{
|
{
|
||||||
.name = "Uboot & Kernel",
|
.name = "Uboot & Kernel",
|
||||||
.offset = 0x00000000,
|
.offset = 0,
|
||||||
.size = 16 * 1024 * 1024,
|
.size = SZ_16M,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Root FS",
|
.name = "Root FS",
|
||||||
.offset = 0x01000000,
|
.offset = MTDPART_OFS_NXTBLK,
|
||||||
.size = 120 * 1024 * 1024,
|
.size = 120 * SZ_1M,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "FS",
|
.name = "FS",
|
||||||
.offset = 0x08800000,
|
.offset = MTDPART_OFS_NXTBLK,
|
||||||
.size = 120 * 1024 * 1024,
|
.size = 120 * SZ_1M,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
#include <linux/gpio_keys.h>
|
#include <linux/gpio_keys.h>
|
||||||
#include <linux/input.h>
|
#include <linux/input.h>
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
|
@ -38,6 +37,7 @@
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
#include <asm/mach/irq.h>
|
#include <asm/mach/irq.h>
|
||||||
|
|
||||||
|
#include <mach/hardware.h>
|
||||||
#include <mach/board.h>
|
#include <mach/board.h>
|
||||||
#include <mach/gpio.h>
|
#include <mach/gpio.h>
|
||||||
#include <mach/at91_shdwc.h>
|
#include <mach/at91_shdwc.h>
|
||||||
|
@ -106,18 +106,18 @@ static struct at91_eth_data __initdata ek_macb_data = {
|
||||||
static struct mtd_partition __initdata ek_nand_partition[] = {
|
static struct mtd_partition __initdata ek_nand_partition[] = {
|
||||||
{
|
{
|
||||||
.name = "Linux Kernel",
|
.name = "Linux Kernel",
|
||||||
.offset = 0x00000000,
|
.offset = 0,
|
||||||
.size = 16 * 1024 * 1024,
|
.size = SZ_16M,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Root FS",
|
.name = "Root FS",
|
||||||
.offset = 0x01000000,
|
.offset = MTDPART_OFS_NXTBLK,
|
||||||
.size = 120 * 1024 * 1024,
|
.size = 120 * SZ_1M,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "FS",
|
.name = "FS",
|
||||||
.offset = 0x08800000,
|
.offset = MTDPART_OFS_NXTBLK,
|
||||||
.size = 120 * 1024 * 1024,
|
.size = 120 * SZ_1M,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,6 @@
|
||||||
#include <linux/gpio_keys.h>
|
#include <linux/gpio_keys.h>
|
||||||
#include <linux/input.h>
|
#include <linux/input.h>
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
|
@ -42,6 +41,7 @@
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
#include <asm/mach/irq.h>
|
#include <asm/mach/irq.h>
|
||||||
|
|
||||||
|
#include <mach/hardware.h>
|
||||||
#include <mach/board.h>
|
#include <mach/board.h>
|
||||||
#include <mach/gpio.h>
|
#include <mach/gpio.h>
|
||||||
#include <mach/at91rm9200_mc.h>
|
#include <mach/at91rm9200_mc.h>
|
||||||
|
@ -150,27 +150,27 @@ static struct mtd_partition __initdata yl9200_nand_partition[] = {
|
||||||
{
|
{
|
||||||
.name = "AT91 NAND partition 1, boot",
|
.name = "AT91 NAND partition 1, boot",
|
||||||
.offset = 0,
|
.offset = 0,
|
||||||
.size = 1 * SZ_256K
|
.size = SZ_256K
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "AT91 NAND partition 2, kernel",
|
.name = "AT91 NAND partition 2, kernel",
|
||||||
.offset = 1 * SZ_256K,
|
.offset = MTDPART_OFS_NXTBLK,
|
||||||
.size = 2 * SZ_1M - 1 * SZ_256K
|
.size = (2 * SZ_1M) - SZ_256K
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "AT91 NAND partition 3, filesystem",
|
.name = "AT91 NAND partition 3, filesystem",
|
||||||
.offset = 2 * SZ_1M,
|
.offset = MTDPART_OFS_NXTBLK,
|
||||||
.size = 14 * SZ_1M
|
.size = 14 * SZ_1M
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "AT91 NAND partition 4, storage",
|
.name = "AT91 NAND partition 4, storage",
|
||||||
.offset = 16 * SZ_1M,
|
.offset = MTDPART_OFS_NXTBLK,
|
||||||
.size = 16 * SZ_1M
|
.size = SZ_16M
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "AT91 NAND partition 5, ext-fs",
|
.name = "AT91 NAND partition 5, ext-fs",
|
||||||
.offset = 32 * SZ_1M,
|
.offset = MTDPART_OFS_NXTBLK,
|
||||||
.size = 32 * SZ_1M
|
.size = SZ_32M
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -193,24 +193,24 @@ static struct atmel_nand_data __initdata yl9200_nand_data = {
|
||||||
* NOR Flash
|
* NOR Flash
|
||||||
*/
|
*/
|
||||||
#define YL9200_FLASH_BASE AT91_CHIPSELECT_0
|
#define YL9200_FLASH_BASE AT91_CHIPSELECT_0
|
||||||
#define YL9200_FLASH_SIZE 0x1000000
|
#define YL9200_FLASH_SIZE SZ_16M
|
||||||
|
|
||||||
static struct mtd_partition yl9200_flash_partitions[] = {
|
static struct mtd_partition yl9200_flash_partitions[] = {
|
||||||
{
|
{
|
||||||
.name = "Bootloader",
|
.name = "Bootloader",
|
||||||
.size = 0x00040000,
|
|
||||||
.offset = 0,
|
.offset = 0,
|
||||||
|
.size = SZ_256K,
|
||||||
.mask_flags = MTD_WRITEABLE, /* force read-only */
|
.mask_flags = MTD_WRITEABLE, /* force read-only */
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Kernel",
|
.name = "Kernel",
|
||||||
.size = 0x001C0000,
|
.offset = MTDPART_OFS_NXTBLK,
|
||||||
.offset = 0x00040000,
|
.size = (2 * SZ_1M) - SZ_256K
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Filesystem",
|
.name = "Filesystem",
|
||||||
.size = MTDPART_SIZ_FULL,
|
.offset = MTDPART_OFS_NXTBLK,
|
||||||
.offset = 0x00200000
|
.size = MTDPART_SIZ_FULL
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -390,10 +390,6 @@ static struct spi_board_info yl9200_spi_devices[] = {
|
||||||
#if defined(CONFIG_FB_S1D135XX) || defined(CONFIG_FB_S1D13XXX_MODULE)
|
#if defined(CONFIG_FB_S1D135XX) || defined(CONFIG_FB_S1D13XXX_MODULE)
|
||||||
#include <video/s1d13xxxfb.h>
|
#include <video/s1d13xxxfb.h>
|
||||||
|
|
||||||
#define AT91_FB_REG_BASE 0x80000000L
|
|
||||||
#define AT91_FB_REG_SIZE 0x200
|
|
||||||
#define AT91_FB_VMEM_BASE 0x80200000L
|
|
||||||
#define AT91_FB_VMEM_SIZE 0x200000L
|
|
||||||
|
|
||||||
static void __init yl9200_init_video(void)
|
static void __init yl9200_init_video(void)
|
||||||
{
|
{
|
||||||
|
@ -516,29 +512,33 @@ static struct s1d13xxxfb_regval yl9200_s1dfb_initregs[] =
|
||||||
{S1DREG_COM_DISP_MODE, 0x01}, /* Display Mode Register, LCD only*/
|
{S1DREG_COM_DISP_MODE, 0x01}, /* Display Mode Register, LCD only*/
|
||||||
};
|
};
|
||||||
|
|
||||||
static u64 s1dfb_dmamask = DMA_BIT_MASK(32);
|
|
||||||
|
|
||||||
static struct s1d13xxxfb_pdata yl9200_s1dfb_pdata = {
|
static struct s1d13xxxfb_pdata yl9200_s1dfb_pdata = {
|
||||||
.initregs = yl9200_s1dfb_initregs,
|
.initregs = yl9200_s1dfb_initregs,
|
||||||
.initregssize = ARRAY_SIZE(yl9200_s1dfb_initregs),
|
.initregssize = ARRAY_SIZE(yl9200_s1dfb_initregs),
|
||||||
.platform_init_video = yl9200_init_video,
|
.platform_init_video = yl9200_init_video,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define YL9200_FB_REG_BASE AT91_CHIPSELECT_7
|
||||||
|
#define YL9200_FB_VMEM_BASE YL9200_FB_REG_BASE + SZ_2M
|
||||||
|
#define YL9200_FB_VMEM_SIZE SZ_2M
|
||||||
|
|
||||||
static struct resource yl9200_s1dfb_resource[] = {
|
static struct resource yl9200_s1dfb_resource[] = {
|
||||||
[0] = { /* video mem */
|
[0] = { /* video mem */
|
||||||
.name = "s1d13xxxfb memory",
|
.name = "s1d13xxxfb memory",
|
||||||
.start = AT91_FB_VMEM_BASE,
|
.start = YL9200_FB_VMEM_BASE,
|
||||||
.end = AT91_FB_VMEM_BASE + AT91_FB_VMEM_SIZE -1,
|
.end = YL9200_FB_VMEM_BASE + YL9200_FB_VMEM_SIZE -1,
|
||||||
.flags = IORESOURCE_MEM,
|
.flags = IORESOURCE_MEM,
|
||||||
},
|
},
|
||||||
[1] = { /* video registers */
|
[1] = { /* video registers */
|
||||||
.name = "s1d13xxxfb registers",
|
.name = "s1d13xxxfb registers",
|
||||||
.start = AT91_FB_REG_BASE,
|
.start = YL9200_FB_REG_BASE,
|
||||||
.end = AT91_FB_REG_BASE + AT91_FB_REG_SIZE -1,
|
.end = YL9200_FB_REG_BASE + SZ_512 -1,
|
||||||
.flags = IORESOURCE_MEM,
|
.flags = IORESOURCE_MEM,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static u64 s1dfb_dmamask = DMA_BIT_MASK(32);
|
||||||
|
|
||||||
static struct platform_device yl9200_s1dfb_device = {
|
static struct platform_device yl9200_s1dfb_device = {
|
||||||
.name = "s1d13806fb",
|
.name = "s1d13806fb",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
/*
|
/*
|
||||||
* arch/arm/mach-at91/include/mach/at91_pit.h
|
* arch/arm/mach-at91/include/mach/at91_pit.h
|
||||||
*
|
*
|
||||||
|
* Copyright (C) 2007 Andrew Victor
|
||||||
|
* Copyright (C) 2007 Atmel Corporation.
|
||||||
|
*
|
||||||
* Periodic Interval Timer (PIT) - System peripherals regsters.
|
* Periodic Interval Timer (PIT) - System peripherals regsters.
|
||||||
* Based on AT91SAM9261 datasheet revision D.
|
* Based on AT91SAM9261 datasheet revision D.
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
/*
|
/*
|
||||||
* arch/arm/mach-at91/include/mach/at91_rstc.h
|
* arch/arm/mach-at91/include/mach/at91_rstc.h
|
||||||
*
|
*
|
||||||
|
* Copyright (C) 2007 Andrew Victor
|
||||||
|
* Copyright (C) 2007 Atmel Corporation.
|
||||||
|
*
|
||||||
* Reset Controller (RSTC) - System peripherals regsters.
|
* Reset Controller (RSTC) - System peripherals regsters.
|
||||||
* Based on AT91SAM9261 datasheet revision D.
|
* Based on AT91SAM9261 datasheet revision D.
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
/*
|
/*
|
||||||
* arch/arm/mach-at91/include/mach/at91_rtt.h
|
* arch/arm/mach-at91/include/mach/at91_rtt.h
|
||||||
*
|
*
|
||||||
|
* Copyright (C) 2007 Andrew Victor
|
||||||
|
* Copyright (C) 2007 Atmel Corporation.
|
||||||
|
*
|
||||||
* Real-time Timer (RTT) - System peripherals regsters.
|
* Real-time Timer (RTT) - System peripherals regsters.
|
||||||
* Based on AT91SAM9261 datasheet revision D.
|
* Based on AT91SAM9261 datasheet revision D.
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
/*
|
/*
|
||||||
* arch/arm/mach-at91/include/mach/at91_shdwc.h
|
* arch/arm/mach-at91/include/mach/at91_shdwc.h
|
||||||
*
|
*
|
||||||
|
* Copyright (C) 2007 Andrew Victor
|
||||||
|
* Copyright (C) 2007 Atmel Corporation.
|
||||||
|
*
|
||||||
* Shutdown Controller (SHDWC) - System peripherals regsters.
|
* Shutdown Controller (SHDWC) - System peripherals regsters.
|
||||||
* Based on AT91SAM9261 datasheet revision D.
|
* Based on AT91SAM9261 datasheet revision D.
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
/*
|
/*
|
||||||
* arch/arm/mach-at91/include/mach/at91_wdt.h
|
* arch/arm/mach-at91/include/mach/at91_wdt.h
|
||||||
*
|
*
|
||||||
|
* Copyright (C) 2007 Andrew Victor
|
||||||
|
* Copyright (C) 2007 Atmel Corporation.
|
||||||
|
*
|
||||||
* Watchdog Timer (WDT) - System peripherals regsters.
|
* Watchdog Timer (WDT) - System peripherals regsters.
|
||||||
* Based on AT91SAM9261 datasheet revision D.
|
* Based on AT91SAM9261 datasheet revision D.
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
/*
|
/*
|
||||||
* arch/arm/mach-at91/include/mach/at91cap9_ddrsdr.h
|
* arch/arm/mach-at91/include/mach/at91cap9_ddrsdr.h
|
||||||
*
|
*
|
||||||
|
* (C) 2008 Andrew Victor
|
||||||
|
*
|
||||||
* DDR/SDR Controller (DDRSDRC) - System peripherals registers.
|
* DDR/SDR Controller (DDRSDRC) - System peripherals registers.
|
||||||
* Based on AT91CAP9 datasheet revision B.
|
* Based on AT91CAP9 datasheet revision B.
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
/*
|
/*
|
||||||
* arch/arm/mach-at91/include/mach/at91sam9260_matrix.h
|
* arch/arm/mach-at91/include/mach/at91sam9260_matrix.h
|
||||||
*
|
*
|
||||||
|
* Copyright (C) 2007 Atmel Corporation.
|
||||||
|
*
|
||||||
* Memory Controllers (MATRIX, EBI) - System peripherals registers.
|
* Memory Controllers (MATRIX, EBI) - System peripherals registers.
|
||||||
* Based on AT91SAM9260 datasheet revision B.
|
* Based on AT91SAM9260 datasheet revision B.
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
/*
|
/*
|
||||||
* arch/arm/mach-at91/include/mach/at91sam9261_matrix.h
|
* arch/arm/mach-at91/include/mach/at91sam9261_matrix.h
|
||||||
*
|
*
|
||||||
|
* Copyright (C) 2007 Atmel Corporation.
|
||||||
|
*
|
||||||
* Memory Controllers (MATRIX, EBI) - System peripherals registers.
|
* Memory Controllers (MATRIX, EBI) - System peripherals registers.
|
||||||
* Based on AT91SAM9261 datasheet revision D.
|
* Based on AT91SAM9261 datasheet revision D.
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
/*
|
/*
|
||||||
* arch/arm/mach-at91/include/mach/at91sam9_sdramc.h
|
* arch/arm/mach-at91/include/mach/at91sam9_sdramc.h
|
||||||
*
|
*
|
||||||
|
* Copyright (C) 2007 Andrew Victor
|
||||||
|
* Copyright (C) 2007 Atmel Corporation.
|
||||||
|
*
|
||||||
* SDRAM Controllers (SDRAMC) - System peripherals registers.
|
* SDRAM Controllers (SDRAMC) - System peripherals registers.
|
||||||
* Based on AT91SAM9261 datasheet revision D.
|
* Based on AT91SAM9261 datasheet revision D.
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
/*
|
/*
|
||||||
* arch/arm/mach-at91/include/mach/at91sam9_smc.h
|
* arch/arm/mach-at91/include/mach/at91sam9_smc.h
|
||||||
*
|
*
|
||||||
|
* Copyright (C) 2007 Andrew Victor
|
||||||
|
* Copyright (C) 2007 Atmel Corporation.
|
||||||
|
*
|
||||||
* Static Memory Controllers (SMC) - System peripherals registers.
|
* Static Memory Controllers (SMC) - System peripherals registers.
|
||||||
* Based on AT91SAM9261 datasheet revision D.
|
* Based on AT91SAM9261 datasheet revision D.
|
||||||
*
|
*
|
||||||
|
|
|
@ -132,6 +132,16 @@ struct atmel_uart_data {
|
||||||
};
|
};
|
||||||
extern void __init at91_add_device_serial(void);
|
extern void __init at91_add_device_serial(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PWM
|
||||||
|
*/
|
||||||
|
#define AT91_PWM0 0
|
||||||
|
#define AT91_PWM1 1
|
||||||
|
#define AT91_PWM2 2
|
||||||
|
#define AT91_PWM3 3
|
||||||
|
|
||||||
|
extern void __init at91_add_device_pwm(u32 mask);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SSC -- accessed through ssc_request(id). Drivers don't bind to SSC
|
* SSC -- accessed through ssc_request(id). Drivers don't bind to SSC
|
||||||
* platform devices. Their SSC ID is part of their configuration data,
|
* platform devices. Their SSC ID is part of their configuration data,
|
||||||
|
@ -162,9 +172,13 @@ extern void __init at91_add_device_ac97(struct atmel_ac97_data *data);
|
||||||
/* ISI */
|
/* ISI */
|
||||||
extern void __init at91_add_device_isi(void);
|
extern void __init at91_add_device_isi(void);
|
||||||
|
|
||||||
|
/* Touchscreen Controller */
|
||||||
|
extern void __init at91_add_device_tsadcc(void);
|
||||||
|
|
||||||
/* LEDs */
|
/* LEDs */
|
||||||
extern void __init at91_init_leds(u8 cpu_led, u8 timer_led);
|
extern void __init at91_init_leds(u8 cpu_led, u8 timer_led);
|
||||||
extern void __init at91_gpio_leds(struct gpio_led *leds, int nr);
|
extern void __init at91_gpio_leds(struct gpio_led *leds, int nr);
|
||||||
|
extern void __init at91_pwm_leds(struct gpio_led *leds, int nr);
|
||||||
|
|
||||||
/* FIXME: this needs a better location, but gets stuff building again */
|
/* FIXME: this needs a better location, but gets stuff building again */
|
||||||
extern int at91_suspend_entering_slow_clock(void);
|
extern int at91_suspend_entering_slow_clock(void);
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
#include <mach/board.h>
|
#include <mach/board.h>
|
||||||
#include <mach/gpio.h>
|
#include <mach/gpio.h>
|
||||||
|
@ -21,15 +22,13 @@
|
||||||
|
|
||||||
#if defined(CONFIG_NEW_LEDS)
|
#if defined(CONFIG_NEW_LEDS)
|
||||||
|
|
||||||
#include <linux/platform_device.h>
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* New cross-platform LED support.
|
* New cross-platform LED support.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static struct gpio_led_platform_data led_data;
|
static struct gpio_led_platform_data led_data;
|
||||||
|
|
||||||
static struct platform_device at91_leds = {
|
static struct platform_device at91_gpio_leds_device = {
|
||||||
.name = "leds-gpio",
|
.name = "leds-gpio",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
.dev.platform_data = &led_data,
|
.dev.platform_data = &led_data,
|
||||||
|
@ -47,7 +46,7 @@ void __init at91_gpio_leds(struct gpio_led *leds, int nr)
|
||||||
|
|
||||||
led_data.leds = leds;
|
led_data.leds = leds;
|
||||||
led_data.num_leds = nr;
|
led_data.num_leds = nr;
|
||||||
platform_device_register(&at91_leds);
|
platform_device_register(&at91_gpio_leds_device);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
@ -55,6 +54,44 @@ void __init at91_gpio_leds(struct gpio_led *leds, int nr) {}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#if defined (CONFIG_LEDS_ATMEL_PWM)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PWM Leds
|
||||||
|
*/
|
||||||
|
|
||||||
|
static struct gpio_led_platform_data pwm_led_data;
|
||||||
|
|
||||||
|
static struct platform_device at91_pwm_leds_device = {
|
||||||
|
.name = "leds-atmel-pwm",
|
||||||
|
.id = -1,
|
||||||
|
.dev.platform_data = &pwm_led_data,
|
||||||
|
};
|
||||||
|
|
||||||
|
void __init at91_pwm_leds(struct gpio_led *leds, int nr)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
u32 pwm_mask = 0;
|
||||||
|
|
||||||
|
if (!nr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (i = 0; i < nr; i++)
|
||||||
|
pwm_mask |= (1 << leds[i].gpio);
|
||||||
|
|
||||||
|
pwm_led_data.leds = leds;
|
||||||
|
pwm_led_data.num_leds = nr;
|
||||||
|
|
||||||
|
at91_add_device_pwm(pwm_mask);
|
||||||
|
platform_device_register(&at91_pwm_leds_device);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
void __init at91_pwm_leds(struct gpio_led *leds, int nr){}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
#if defined(CONFIG_LEDS)
|
#if defined(CONFIG_LEDS)
|
||||||
|
|
|
@ -0,0 +1,283 @@
|
||||||
|
/*
|
||||||
|
* arch/arm/mach-at91/pm_slow_clock.S
|
||||||
|
*
|
||||||
|
* Copyright (C) 2006 Savin Zlobec
|
||||||
|
*
|
||||||
|
* AT91SAM9 support:
|
||||||
|
* Copyright (C) 2007 Anti Sullin <anti.sullin@artecdesign.ee
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/linkage.h>
|
||||||
|
#include <mach/hardware.h>
|
||||||
|
#include <mach/at91_pmc.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_AT91RM9200
|
||||||
|
#include <mach/at91rm9200_mc.h>
|
||||||
|
#elif defined(CONFIG_ARCH_AT91CAP9)
|
||||||
|
#include <mach/at91cap9_ddrsdr.h>
|
||||||
|
#else
|
||||||
|
#include <mach/at91sam9_sdramc.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_AT91SAM9263
|
||||||
|
/*
|
||||||
|
* FIXME either or both the SDRAM controllers (EB0, EB1) might be in use;
|
||||||
|
* handle those cases both here and in the Suspend-To-RAM support.
|
||||||
|
*/
|
||||||
|
#define AT91_SDRAMC AT91_SDRAMC0
|
||||||
|
#warning Assuming EB1 SDRAM controller is *NOT* used
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When SLOWDOWN_MASTER_CLOCK is defined we will also slow down the Master
|
||||||
|
* clock during suspend by adjusting its prescalar and divisor.
|
||||||
|
* NOTE: This hasn't been shown to be stable on SAM9s; and on the RM9200 there
|
||||||
|
* are errata regarding adjusting the prescalar and divisor.
|
||||||
|
*/
|
||||||
|
#undef SLOWDOWN_MASTER_CLOCK
|
||||||
|
|
||||||
|
#define MCKRDY_TIMEOUT 1000
|
||||||
|
#define MOSCRDY_TIMEOUT 1000
|
||||||
|
#define PLLALOCK_TIMEOUT 1000
|
||||||
|
#define PLLBLOCK_TIMEOUT 1000
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wait until master clock is ready (after switching master clock source)
|
||||||
|
*/
|
||||||
|
.macro wait_mckrdy
|
||||||
|
mov r4, #MCKRDY_TIMEOUT
|
||||||
|
1: sub r4, r4, #1
|
||||||
|
cmp r4, #0
|
||||||
|
beq 2f
|
||||||
|
ldr r3, [r1, #(AT91_PMC_SR - AT91_PMC)]
|
||||||
|
tst r3, #AT91_PMC_MCKRDY
|
||||||
|
beq 1b
|
||||||
|
2:
|
||||||
|
.endm
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wait until master oscillator has stabilized.
|
||||||
|
*/
|
||||||
|
.macro wait_moscrdy
|
||||||
|
mov r4, #MOSCRDY_TIMEOUT
|
||||||
|
1: sub r4, r4, #1
|
||||||
|
cmp r4, #0
|
||||||
|
beq 2f
|
||||||
|
ldr r3, [r1, #(AT91_PMC_SR - AT91_PMC)]
|
||||||
|
tst r3, #AT91_PMC_MOSCS
|
||||||
|
beq 1b
|
||||||
|
2:
|
||||||
|
.endm
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wait until PLLA has locked.
|
||||||
|
*/
|
||||||
|
.macro wait_pllalock
|
||||||
|
mov r4, #PLLALOCK_TIMEOUT
|
||||||
|
1: sub r4, r4, #1
|
||||||
|
cmp r4, #0
|
||||||
|
beq 2f
|
||||||
|
ldr r3, [r1, #(AT91_PMC_SR - AT91_PMC)]
|
||||||
|
tst r3, #AT91_PMC_LOCKA
|
||||||
|
beq 1b
|
||||||
|
2:
|
||||||
|
.endm
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wait until PLLB has locked.
|
||||||
|
*/
|
||||||
|
.macro wait_pllblock
|
||||||
|
mov r4, #PLLBLOCK_TIMEOUT
|
||||||
|
1: sub r4, r4, #1
|
||||||
|
cmp r4, #0
|
||||||
|
beq 2f
|
||||||
|
ldr r3, [r1, #(AT91_PMC_SR - AT91_PMC)]
|
||||||
|
tst r3, #AT91_PMC_LOCKB
|
||||||
|
beq 1b
|
||||||
|
2:
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.text
|
||||||
|
|
||||||
|
ENTRY(at91_slow_clock)
|
||||||
|
/* Save registers on stack */
|
||||||
|
stmfd sp!, {r0 - r12, lr}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Register usage:
|
||||||
|
* R1 = Base address of AT91_PMC
|
||||||
|
* R2 = Base address of AT91_SDRAMC (or AT91_SYS on AT91RM9200)
|
||||||
|
* R3 = temporary register
|
||||||
|
* R4 = temporary register
|
||||||
|
*/
|
||||||
|
ldr r1, .at91_va_base_pmc
|
||||||
|
ldr r2, .at91_va_base_sdramc
|
||||||
|
|
||||||
|
/* Drain write buffer */
|
||||||
|
mcr p15, 0, r0, c7, c10, 4
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_AT91RM9200
|
||||||
|
/* Put SDRAM in self-refresh mode */
|
||||||
|
mov r3, #1
|
||||||
|
str r3, [r2, #AT91_SDRAMC_SRR]
|
||||||
|
#elif defined(CONFIG_ARCH_AT91CAP9)
|
||||||
|
/* Enable SDRAM self-refresh mode */
|
||||||
|
ldr r3, [r2, #AT91_DDRSDRC_LPR - AT91_DDRSDRC]
|
||||||
|
str r3, .saved_sam9_lpr
|
||||||
|
|
||||||
|
mov r3, #AT91_DDRSDRC_LPCB_SELF_REFRESH
|
||||||
|
str r3, [r2, #AT91_DDRSDRC_LPR - AT91_DDRSDRC]
|
||||||
|
#else
|
||||||
|
/* Enable SDRAM self-refresh mode */
|
||||||
|
ldr r3, [r2, #AT91_SDRAMC_LPR - AT91_SDRAMC]
|
||||||
|
str r3, .saved_sam9_lpr
|
||||||
|
|
||||||
|
mov r3, #AT91_SDRAMC_LPCB_SELF_REFRESH
|
||||||
|
str r3, [r2, #AT91_SDRAMC_LPR - AT91_SDRAMC]
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Save Master clock setting */
|
||||||
|
ldr r3, [r1, #(AT91_PMC_MCKR - AT91_PMC)]
|
||||||
|
str r3, .saved_mckr
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the Master clock source to slow clock
|
||||||
|
*/
|
||||||
|
bic r3, r3, #AT91_PMC_CSS
|
||||||
|
str r3, [r1, #(AT91_PMC_MCKR - AT91_PMC)]
|
||||||
|
|
||||||
|
wait_mckrdy
|
||||||
|
|
||||||
|
#ifdef SLOWDOWN_MASTER_CLOCK
|
||||||
|
/*
|
||||||
|
* Set the Master Clock PRES and MDIV fields.
|
||||||
|
*
|
||||||
|
* See AT91RM9200 errata #27 and #28 for details.
|
||||||
|
*/
|
||||||
|
mov r3, #0
|
||||||
|
str r3, [r1, #(AT91_PMC_MCKR - AT91_PMC)]
|
||||||
|
|
||||||
|
wait_mckrdy
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Save PLLA setting and disable it */
|
||||||
|
ldr r3, [r1, #(AT91_CKGR_PLLAR - AT91_PMC)]
|
||||||
|
str r3, .saved_pllar
|
||||||
|
|
||||||
|
mov r3, #AT91_PMC_PLLCOUNT
|
||||||
|
orr r3, r3, #(1 << 29) /* bit 29 always set */
|
||||||
|
str r3, [r1, #(AT91_CKGR_PLLAR - AT91_PMC)]
|
||||||
|
|
||||||
|
wait_pllalock
|
||||||
|
|
||||||
|
/* Save PLLB setting and disable it */
|
||||||
|
ldr r3, [r1, #(AT91_CKGR_PLLBR - AT91_PMC)]
|
||||||
|
str r3, .saved_pllbr
|
||||||
|
|
||||||
|
mov r3, #AT91_PMC_PLLCOUNT
|
||||||
|
str r3, [r1, #(AT91_CKGR_PLLBR - AT91_PMC)]
|
||||||
|
|
||||||
|
wait_pllblock
|
||||||
|
|
||||||
|
/* Turn off the main oscillator */
|
||||||
|
ldr r3, [r1, #(AT91_CKGR_MOR - AT91_PMC)]
|
||||||
|
bic r3, r3, #AT91_PMC_MOSCEN
|
||||||
|
str r3, [r1, #(AT91_CKGR_MOR - AT91_PMC)]
|
||||||
|
|
||||||
|
/* Wait for interrupt */
|
||||||
|
mcr p15, 0, r0, c7, c0, 4
|
||||||
|
|
||||||
|
/* Turn on the main oscillator */
|
||||||
|
ldr r3, [r1, #(AT91_CKGR_MOR - AT91_PMC)]
|
||||||
|
orr r3, r3, #AT91_PMC_MOSCEN
|
||||||
|
str r3, [r1, #(AT91_CKGR_MOR - AT91_PMC)]
|
||||||
|
|
||||||
|
wait_moscrdy
|
||||||
|
|
||||||
|
/* Restore PLLB setting */
|
||||||
|
ldr r3, .saved_pllbr
|
||||||
|
str r3, [r1, #(AT91_CKGR_PLLBR - AT91_PMC)]
|
||||||
|
|
||||||
|
wait_pllblock
|
||||||
|
|
||||||
|
/* Restore PLLA setting */
|
||||||
|
ldr r3, .saved_pllar
|
||||||
|
str r3, [r1, #(AT91_CKGR_PLLAR - AT91_PMC)]
|
||||||
|
|
||||||
|
wait_pllalock
|
||||||
|
|
||||||
|
#ifdef SLOWDOWN_MASTER_CLOCK
|
||||||
|
/*
|
||||||
|
* First set PRES if it was not 0,
|
||||||
|
* than set CSS and MDIV fields.
|
||||||
|
*
|
||||||
|
* See AT91RM9200 errata #27 and #28 for details.
|
||||||
|
*/
|
||||||
|
ldr r3, .saved_mckr
|
||||||
|
tst r3, #AT91_PMC_PRES
|
||||||
|
beq 2f
|
||||||
|
and r3, r3, #AT91_PMC_PRES
|
||||||
|
str r3, [r1, #(AT91_PMC_MCKR - AT91_PMC)]
|
||||||
|
|
||||||
|
wait_mckrdy
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Restore master clock setting
|
||||||
|
*/
|
||||||
|
2: ldr r3, .saved_mckr
|
||||||
|
str r3, [r1, #(AT91_PMC_MCKR - AT91_PMC)]
|
||||||
|
|
||||||
|
wait_mckrdy
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_AT91RM9200
|
||||||
|
/* Do nothing - self-refresh is automatically disabled. */
|
||||||
|
#elif defined(CONFIG_ARCH_AT91CAP9)
|
||||||
|
/* Restore LPR on AT91CAP9 */
|
||||||
|
ldr r3, .saved_sam9_lpr
|
||||||
|
str r3, [r2, #AT91_DDRSDRC_LPR - AT91_DDRSDRC]
|
||||||
|
#else
|
||||||
|
/* Restore LPR on AT91SAM9 */
|
||||||
|
ldr r3, .saved_sam9_lpr
|
||||||
|
str r3, [r2, #AT91_SDRAMC_LPR - AT91_SDRAMC]
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Restore registers, and return */
|
||||||
|
ldmfd sp!, {r0 - r12, pc}
|
||||||
|
|
||||||
|
|
||||||
|
.saved_mckr:
|
||||||
|
.word 0
|
||||||
|
|
||||||
|
.saved_pllar:
|
||||||
|
.word 0
|
||||||
|
|
||||||
|
.saved_pllbr:
|
||||||
|
.word 0
|
||||||
|
|
||||||
|
.saved_sam9_lpr:
|
||||||
|
.word 0
|
||||||
|
|
||||||
|
.at91_va_base_pmc:
|
||||||
|
.word AT91_VA_BASE_SYS + AT91_PMC
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_AT91RM9200
|
||||||
|
.at91_va_base_sdramc:
|
||||||
|
.word AT91_VA_BASE_SYS
|
||||||
|
#elif defined(CONFIG_ARCH_AT91CAP9)
|
||||||
|
.at91_va_base_sdramc:
|
||||||
|
.word AT91_VA_BASE_SYS + AT91_DDRSDRC
|
||||||
|
#else
|
||||||
|
.at91_va_base_sdramc:
|
||||||
|
.word AT91_VA_BASE_SYS + AT91_SDRAMC
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ENTRY(at91_slow_clock_sz)
|
||||||
|
.word .-at91_slow_clock
|
|
@ -4,6 +4,8 @@
|
||||||
* to extract and format the required data.
|
* to extract and format the required data.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <linux/mm.h>
|
||||||
|
#include <linux/sched.h>
|
||||||
#include <linux/thread_info.h>
|
#include <linux/thread_info.h>
|
||||||
#include <linux/kbuild.h>
|
#include <linux/kbuild.h>
|
||||||
|
|
||||||
|
@ -17,4 +19,8 @@ void foo(void)
|
||||||
OFFSET(TI_rar_saved, thread_info, rar_saved);
|
OFFSET(TI_rar_saved, thread_info, rar_saved);
|
||||||
OFFSET(TI_rsr_saved, thread_info, rsr_saved);
|
OFFSET(TI_rsr_saved, thread_info, rsr_saved);
|
||||||
OFFSET(TI_restart_block, thread_info, restart_block);
|
OFFSET(TI_restart_block, thread_info, restart_block);
|
||||||
|
BLANK();
|
||||||
|
OFFSET(TSK_active_mm, task_struct, active_mm);
|
||||||
|
BLANK();
|
||||||
|
OFFSET(MM_pgd, mm_struct, pgd);
|
||||||
}
|
}
|
||||||
|
|
|
@ -334,9 +334,64 @@ save_full_context_ex:
|
||||||
|
|
||||||
/* Low-level exception handlers */
|
/* Low-level exception handlers */
|
||||||
handle_critical:
|
handle_critical:
|
||||||
|
/*
|
||||||
|
* AT32AP700x errata:
|
||||||
|
*
|
||||||
|
* After a Java stack overflow or underflow trap, any CPU
|
||||||
|
* memory access may cause erratic behavior. This will happen
|
||||||
|
* when the four least significant bits of the JOSP system
|
||||||
|
* register contains any value between 9 and 15 (inclusive).
|
||||||
|
*
|
||||||
|
* Possible workarounds:
|
||||||
|
* - Don't use the Java Extension Module
|
||||||
|
* - Ensure that the stack overflow and underflow trap
|
||||||
|
* handlers do not do any memory access or trigger any
|
||||||
|
* exceptions before the overflow/underflow condition is
|
||||||
|
* cleared (by incrementing or decrementing the JOSP)
|
||||||
|
* - Make sure that JOSP does not contain any problematic
|
||||||
|
* value before doing any exception or interrupt
|
||||||
|
* processing.
|
||||||
|
* - Set up a critical exception handler which writes a
|
||||||
|
* known-to-be-safe value, e.g. 4, to JOSP before doing
|
||||||
|
* any further processing.
|
||||||
|
*
|
||||||
|
* We'll use the last workaround for now since we cannot
|
||||||
|
* guarantee that user space processes don't use Java mode.
|
||||||
|
* Non-well-behaving userland will be terminated with extreme
|
||||||
|
* prejudice.
|
||||||
|
*/
|
||||||
|
#ifdef CONFIG_CPU_AT32AP700X
|
||||||
|
/*
|
||||||
|
* There's a chance we can't touch memory, so temporarily
|
||||||
|
* borrow PTBR to save the stack pointer while we fix things
|
||||||
|
* up...
|
||||||
|
*/
|
||||||
|
mtsr SYSREG_PTBR, sp
|
||||||
|
mov sp, 4
|
||||||
|
mtsr SYSREG_JOSP, sp
|
||||||
|
mfsr sp, SYSREG_PTBR
|
||||||
|
sub pc, -2
|
||||||
|
|
||||||
|
/* Push most of pt_regs on stack. We'll do the rest later */
|
||||||
sub sp, 4
|
sub sp, 4
|
||||||
stmts --sp, r0-lr
|
pushm r0-r12
|
||||||
rcall save_full_context_ex
|
|
||||||
|
/* PTBR mirrors current_thread_info()->task->active_mm->pgd */
|
||||||
|
get_thread_info r0
|
||||||
|
ld.w r1, r0[TI_task]
|
||||||
|
ld.w r2, r1[TSK_active_mm]
|
||||||
|
ld.w r3, r2[MM_pgd]
|
||||||
|
mtsr SYSREG_PTBR, r3
|
||||||
|
#else
|
||||||
|
sub sp, 4
|
||||||
|
pushm r0-r12
|
||||||
|
#endif
|
||||||
|
sub r0, sp, -(14 * 4)
|
||||||
|
mov r1, lr
|
||||||
|
mfsr r2, SYSREG_RAR_EX
|
||||||
|
mfsr r3, SYSREG_RSR_EX
|
||||||
|
pushm r0-r3
|
||||||
|
|
||||||
mfsr r12, SYSREG_ECR
|
mfsr r12, SYSREG_ECR
|
||||||
mov r11, sp
|
mov r11, sp
|
||||||
rcall do_critical_exception
|
rcall do_critical_exception
|
||||||
|
|
|
@ -134,7 +134,7 @@ pm_standby:
|
||||||
mov r11, SDRAMC_LPR_LPCB_SELF_RFR
|
mov r11, SDRAMC_LPR_LPCB_SELF_RFR
|
||||||
bfins r10, r11, 0, 2 /* LPCB <- self Refresh */
|
bfins r10, r11, 0, 2 /* LPCB <- self Refresh */
|
||||||
sync 0 /* flush write buffer */
|
sync 0 /* flush write buffer */
|
||||||
st.w r12[SDRAMC_LPR], r11 /* put SDRAM in self-refresh mode */
|
st.w r12[SDRAMC_LPR], r10 /* put SDRAM in self-refresh mode */
|
||||||
ld.w r11, r12[SDRAMC_LPR]
|
ld.w r11, r12[SDRAMC_LPR]
|
||||||
unmask_interrupts
|
unmask_interrupts
|
||||||
sleep CPU_SLEEP_FROZEN
|
sleep CPU_SLEEP_FROZEN
|
||||||
|
|
|
@ -21,5 +21,8 @@ extern char __start_gate_brl_fsys_bubble_down_patchlist[], __end_gate_brl_fsys_b
|
||||||
extern char __start_unwind[], __end_unwind[];
|
extern char __start_unwind[], __end_unwind[];
|
||||||
extern char __start_ivt_text[], __end_ivt_text[];
|
extern char __start_ivt_text[], __end_ivt_text[];
|
||||||
|
|
||||||
|
#undef dereference_function_descriptor
|
||||||
|
void *dereference_function_descriptor(void *);
|
||||||
|
|
||||||
#endif /* _ASM_IA64_SECTIONS_H */
|
#endif /* _ASM_IA64_SECTIONS_H */
|
||||||
|
|
||||||
|
|
|
@ -31,9 +31,11 @@
|
||||||
#include <linux/elf.h>
|
#include <linux/elf.h>
|
||||||
#include <linux/moduleloader.h>
|
#include <linux/moduleloader.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
|
#include <linux/uaccess.h>
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
|
|
||||||
#include <asm/patch.h>
|
#include <asm/patch.h>
|
||||||
|
#include <asm/sections.h>
|
||||||
#include <asm/unaligned.h>
|
#include <asm/unaligned.h>
|
||||||
|
|
||||||
#define ARCH_MODULE_DEBUG 0
|
#define ARCH_MODULE_DEBUG 0
|
||||||
|
@ -941,3 +943,13 @@ module_arch_cleanup (struct module *mod)
|
||||||
if (mod->arch.core_unw_table)
|
if (mod->arch.core_unw_table)
|
||||||
unw_remove_unwind_table(mod->arch.core_unw_table);
|
unw_remove_unwind_table(mod->arch.core_unw_table);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *dereference_function_descriptor(void *ptr)
|
||||||
|
{
|
||||||
|
struct fdesc *desc = ptr;
|
||||||
|
void *p;
|
||||||
|
|
||||||
|
if (!probe_kernel_address(&desc->ip, p))
|
||||||
|
ptr = p;
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
|
@ -1886,6 +1886,15 @@ config STACKTRACE_SUPPORT
|
||||||
|
|
||||||
source "init/Kconfig"
|
source "init/Kconfig"
|
||||||
|
|
||||||
|
config PROBE_INITRD_HEADER
|
||||||
|
bool "Probe initrd header created by addinitrd"
|
||||||
|
depends on BLK_DEV_INITRD
|
||||||
|
help
|
||||||
|
Probe initrd header at the last page of kernel image.
|
||||||
|
Say Y here if you are using arch/mips/boot/addinitrd.c to
|
||||||
|
add initrd or initramfs image to the kernel image.
|
||||||
|
Otherwise, say N.
|
||||||
|
|
||||||
menu "Bus options (PCI, PCMCIA, EISA, ISA, TC)"
|
menu "Bus options (PCI, PCMCIA, EISA, ISA, TC)"
|
||||||
|
|
||||||
config HW_HAS_EISA
|
config HW_HAS_EISA
|
||||||
|
|
|
@ -160,30 +160,33 @@ early_param("rd_size", rd_size_early);
|
||||||
static unsigned long __init init_initrd(void)
|
static unsigned long __init init_initrd(void)
|
||||||
{
|
{
|
||||||
unsigned long end;
|
unsigned long end;
|
||||||
u32 *initrd_header;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Board specific code or command line parser should have
|
* Board specific code or command line parser should have
|
||||||
* already set up initrd_start and initrd_end. In these cases
|
* already set up initrd_start and initrd_end. In these cases
|
||||||
* perfom sanity checks and use them if all looks good.
|
* perfom sanity checks and use them if all looks good.
|
||||||
*/
|
*/
|
||||||
if (initrd_start && initrd_end > initrd_start)
|
if (!initrd_start || initrd_end <= initrd_start) {
|
||||||
goto sanitize;
|
#ifdef CONFIG_PROBE_INITRD_HEADER
|
||||||
|
u32 *initrd_header;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* See if initrd has been added to the kernel image by
|
* See if initrd has been added to the kernel image by
|
||||||
* arch/mips/boot/addinitrd.c. In that case a header is
|
* arch/mips/boot/addinitrd.c. In that case a header is
|
||||||
* prepended to initrd and is made up by 8 bytes. The fisrt
|
* prepended to initrd and is made up by 8 bytes. The first
|
||||||
* word is a magic number and the second one is the size of
|
* word is a magic number and the second one is the size of
|
||||||
* initrd. Initrd start must be page aligned in any cases.
|
* initrd. Initrd start must be page aligned in any cases.
|
||||||
*/
|
*/
|
||||||
initrd_header = __va(PAGE_ALIGN(__pa_symbol(&_end) + 8)) - 8;
|
initrd_header = __va(PAGE_ALIGN(__pa_symbol(&_end) + 8)) - 8;
|
||||||
if (initrd_header[0] != 0x494E5244)
|
if (initrd_header[0] != 0x494E5244)
|
||||||
|
goto disable;
|
||||||
|
initrd_start = (unsigned long)(initrd_header + 2);
|
||||||
|
initrd_end = initrd_start + initrd_header[1];
|
||||||
|
#else
|
||||||
goto disable;
|
goto disable;
|
||||||
initrd_start = (unsigned long)(initrd_header + 2);
|
#endif
|
||||||
initrd_end = initrd_start + initrd_header[1];
|
}
|
||||||
|
|
||||||
sanitize:
|
|
||||||
if (initrd_start & ~PAGE_MASK) {
|
if (initrd_start & ~PAGE_MASK) {
|
||||||
pr_err("initrd start must be page aligned\n");
|
pr_err("initrd start must be page aligned\n");
|
||||||
goto disable;
|
goto disable;
|
||||||
|
|
|
@ -373,8 +373,8 @@ void __noreturn die(const char * str, const struct pt_regs * regs)
|
||||||
do_exit(SIGSEGV);
|
do_exit(SIGSEGV);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern const struct exception_table_entry __start___dbe_table[];
|
extern struct exception_table_entry __start___dbe_table[];
|
||||||
extern const struct exception_table_entry __stop___dbe_table[];
|
extern struct exception_table_entry __stop___dbe_table[];
|
||||||
|
|
||||||
__asm__(
|
__asm__(
|
||||||
" .section __dbe_table, \"a\"\n"
|
" .section __dbe_table, \"a\"\n"
|
||||||
|
@ -1200,7 +1200,7 @@ void *set_except_vector(int n, void *addr)
|
||||||
if (n == 0 && cpu_has_divec) {
|
if (n == 0 && cpu_has_divec) {
|
||||||
*(u32 *)(ebase + 0x200) = 0x08000000 |
|
*(u32 *)(ebase + 0x200) = 0x08000000 |
|
||||||
(0x03ffffff & (handler >> 2));
|
(0x03ffffff & (handler >> 2));
|
||||||
flush_icache_range(ebase + 0x200, ebase + 0x204);
|
local_flush_icache_range(ebase + 0x200, ebase + 0x204);
|
||||||
}
|
}
|
||||||
return (void *)old_handler;
|
return (void *)old_handler;
|
||||||
}
|
}
|
||||||
|
@ -1283,7 +1283,8 @@ static void *set_vi_srs_handler(int n, vi_handler_t addr, int srs)
|
||||||
*w = (*w & 0xffff0000) | (((u32)handler >> 16) & 0xffff);
|
*w = (*w & 0xffff0000) | (((u32)handler >> 16) & 0xffff);
|
||||||
w = (u32 *)(b + ori_offset);
|
w = (u32 *)(b + ori_offset);
|
||||||
*w = (*w & 0xffff0000) | ((u32)handler & 0xffff);
|
*w = (*w & 0xffff0000) | ((u32)handler & 0xffff);
|
||||||
flush_icache_range((unsigned long)b, (unsigned long)(b+handler_len));
|
local_flush_icache_range((unsigned long)b,
|
||||||
|
(unsigned long)(b+handler_len));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/*
|
/*
|
||||||
|
@ -1295,7 +1296,8 @@ static void *set_vi_srs_handler(int n, vi_handler_t addr, int srs)
|
||||||
w = (u32 *)b;
|
w = (u32 *)b;
|
||||||
*w++ = 0x08000000 | (((u32)handler >> 2) & 0x03fffff); /* j handler */
|
*w++ = 0x08000000 | (((u32)handler >> 2) & 0x03fffff); /* j handler */
|
||||||
*w = 0;
|
*w = 0;
|
||||||
flush_icache_range((unsigned long)b, (unsigned long)(b+8));
|
local_flush_icache_range((unsigned long)b,
|
||||||
|
(unsigned long)(b+8));
|
||||||
}
|
}
|
||||||
|
|
||||||
return (void *)old_handler;
|
return (void *)old_handler;
|
||||||
|
@ -1515,7 +1517,7 @@ void __cpuinit per_cpu_trap_init(void)
|
||||||
void __init set_handler(unsigned long offset, void *addr, unsigned long size)
|
void __init set_handler(unsigned long offset, void *addr, unsigned long size)
|
||||||
{
|
{
|
||||||
memcpy((void *)(ebase + offset), addr, size);
|
memcpy((void *)(ebase + offset), addr, size);
|
||||||
flush_icache_range(ebase + offset, ebase + offset + size);
|
local_flush_icache_range(ebase + offset, ebase + offset + size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static char panic_null_cerr[] __cpuinitdata =
|
static char panic_null_cerr[] __cpuinitdata =
|
||||||
|
@ -1680,6 +1682,8 @@ void __init trap_init(void)
|
||||||
signal32_init();
|
signal32_init();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
flush_icache_range(ebase, ebase + 0x400);
|
local_flush_icache_range(ebase, ebase + 0x400);
|
||||||
flush_tlb_handlers();
|
flush_tlb_handlers();
|
||||||
|
|
||||||
|
sort_extable(__start___dbe_table, __stop___dbe_table);
|
||||||
}
|
}
|
||||||
|
|
|
@ -320,6 +320,7 @@ void __cpuinit r3k_cache_init(void)
|
||||||
flush_cache_range = r3k_flush_cache_range;
|
flush_cache_range = r3k_flush_cache_range;
|
||||||
flush_cache_page = r3k_flush_cache_page;
|
flush_cache_page = r3k_flush_cache_page;
|
||||||
flush_icache_range = r3k_flush_icache_range;
|
flush_icache_range = r3k_flush_icache_range;
|
||||||
|
local_flush_icache_range = r3k_flush_icache_range;
|
||||||
|
|
||||||
flush_cache_sigtramp = r3k_flush_cache_sigtramp;
|
flush_cache_sigtramp = r3k_flush_cache_sigtramp;
|
||||||
local_flush_data_cache_page = local_r3k_flush_data_cache_page;
|
local_flush_data_cache_page = local_r3k_flush_data_cache_page;
|
||||||
|
|
|
@ -543,12 +543,8 @@ struct flush_icache_range_args {
|
||||||
unsigned long end;
|
unsigned long end;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline void local_r4k_flush_icache_range(void *args)
|
static inline void local_r4k_flush_icache_range(unsigned long start, unsigned long end)
|
||||||
{
|
{
|
||||||
struct flush_icache_range_args *fir_args = args;
|
|
||||||
unsigned long start = fir_args->start;
|
|
||||||
unsigned long end = fir_args->end;
|
|
||||||
|
|
||||||
if (!cpu_has_ic_fills_f_dc) {
|
if (!cpu_has_ic_fills_f_dc) {
|
||||||
if (end - start >= dcache_size) {
|
if (end - start >= dcache_size) {
|
||||||
r4k_blast_dcache();
|
r4k_blast_dcache();
|
||||||
|
@ -564,6 +560,15 @@ static inline void local_r4k_flush_icache_range(void *args)
|
||||||
protected_blast_icache_range(start, end);
|
protected_blast_icache_range(start, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void local_r4k_flush_icache_range_ipi(void *args)
|
||||||
|
{
|
||||||
|
struct flush_icache_range_args *fir_args = args;
|
||||||
|
unsigned long start = fir_args->start;
|
||||||
|
unsigned long end = fir_args->end;
|
||||||
|
|
||||||
|
local_r4k_flush_icache_range(start, end);
|
||||||
|
}
|
||||||
|
|
||||||
static void r4k_flush_icache_range(unsigned long start, unsigned long end)
|
static void r4k_flush_icache_range(unsigned long start, unsigned long end)
|
||||||
{
|
{
|
||||||
struct flush_icache_range_args args;
|
struct flush_icache_range_args args;
|
||||||
|
@ -571,7 +576,7 @@ static void r4k_flush_icache_range(unsigned long start, unsigned long end)
|
||||||
args.start = start;
|
args.start = start;
|
||||||
args.end = end;
|
args.end = end;
|
||||||
|
|
||||||
r4k_on_each_cpu(local_r4k_flush_icache_range, &args, 1);
|
r4k_on_each_cpu(local_r4k_flush_icache_range_ipi, &args, 1);
|
||||||
instruction_hazard();
|
instruction_hazard();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1375,6 +1380,7 @@ void __cpuinit r4k_cache_init(void)
|
||||||
local_flush_data_cache_page = local_r4k_flush_data_cache_page;
|
local_flush_data_cache_page = local_r4k_flush_data_cache_page;
|
||||||
flush_data_cache_page = r4k_flush_data_cache_page;
|
flush_data_cache_page = r4k_flush_data_cache_page;
|
||||||
flush_icache_range = r4k_flush_icache_range;
|
flush_icache_range = r4k_flush_icache_range;
|
||||||
|
local_flush_icache_range = local_r4k_flush_icache_range;
|
||||||
|
|
||||||
#if defined(CONFIG_DMA_NONCOHERENT)
|
#if defined(CONFIG_DMA_NONCOHERENT)
|
||||||
if (coherentio) {
|
if (coherentio) {
|
||||||
|
|
|
@ -362,6 +362,7 @@ void __cpuinit tx39_cache_init(void)
|
||||||
flush_cache_range = (void *) tx39h_flush_icache_all;
|
flush_cache_range = (void *) tx39h_flush_icache_all;
|
||||||
flush_cache_page = (void *) tx39h_flush_icache_all;
|
flush_cache_page = (void *) tx39h_flush_icache_all;
|
||||||
flush_icache_range = (void *) tx39h_flush_icache_all;
|
flush_icache_range = (void *) tx39h_flush_icache_all;
|
||||||
|
local_flush_icache_range = (void *) tx39h_flush_icache_all;
|
||||||
|
|
||||||
flush_cache_sigtramp = (void *) tx39h_flush_icache_all;
|
flush_cache_sigtramp = (void *) tx39h_flush_icache_all;
|
||||||
local_flush_data_cache_page = (void *) tx39h_flush_icache_all;
|
local_flush_data_cache_page = (void *) tx39h_flush_icache_all;
|
||||||
|
@ -390,6 +391,7 @@ void __cpuinit tx39_cache_init(void)
|
||||||
flush_cache_range = tx39_flush_cache_range;
|
flush_cache_range = tx39_flush_cache_range;
|
||||||
flush_cache_page = tx39_flush_cache_page;
|
flush_cache_page = tx39_flush_cache_page;
|
||||||
flush_icache_range = tx39_flush_icache_range;
|
flush_icache_range = tx39_flush_icache_range;
|
||||||
|
local_flush_icache_range = tx39_flush_icache_range;
|
||||||
|
|
||||||
flush_cache_sigtramp = tx39_flush_cache_sigtramp;
|
flush_cache_sigtramp = tx39_flush_cache_sigtramp;
|
||||||
local_flush_data_cache_page = local_tx39_flush_data_cache_page;
|
local_flush_data_cache_page = local_tx39_flush_data_cache_page;
|
||||||
|
|
|
@ -29,6 +29,7 @@ void (*flush_cache_range)(struct vm_area_struct *vma, unsigned long start,
|
||||||
void (*flush_cache_page)(struct vm_area_struct *vma, unsigned long page,
|
void (*flush_cache_page)(struct vm_area_struct *vma, unsigned long page,
|
||||||
unsigned long pfn);
|
unsigned long pfn);
|
||||||
void (*flush_icache_range)(unsigned long start, unsigned long end);
|
void (*flush_icache_range)(unsigned long start, unsigned long end);
|
||||||
|
void (*local_flush_icache_range)(unsigned long start, unsigned long end);
|
||||||
|
|
||||||
void (*__flush_cache_vmap)(void);
|
void (*__flush_cache_vmap)(void);
|
||||||
void (*__flush_cache_vunmap)(void);
|
void (*__flush_cache_vunmap)(void);
|
||||||
|
|
|
@ -1273,10 +1273,10 @@ void __cpuinit build_tlb_refill_handler(void)
|
||||||
|
|
||||||
void __cpuinit flush_tlb_handlers(void)
|
void __cpuinit flush_tlb_handlers(void)
|
||||||
{
|
{
|
||||||
flush_icache_range((unsigned long)handle_tlbl,
|
local_flush_icache_range((unsigned long)handle_tlbl,
|
||||||
(unsigned long)handle_tlbl + sizeof(handle_tlbl));
|
(unsigned long)handle_tlbl + sizeof(handle_tlbl));
|
||||||
flush_icache_range((unsigned long)handle_tlbs,
|
local_flush_icache_range((unsigned long)handle_tlbs,
|
||||||
(unsigned long)handle_tlbs + sizeof(handle_tlbs));
|
(unsigned long)handle_tlbs + sizeof(handle_tlbs));
|
||||||
flush_icache_range((unsigned long)handle_tlbm,
|
local_flush_icache_range((unsigned long)handle_tlbm,
|
||||||
(unsigned long)handle_tlbm + sizeof(handle_tlbm));
|
(unsigned long)handle_tlbm + sizeof(handle_tlbm));
|
||||||
}
|
}
|
||||||
|
|
|
@ -150,7 +150,7 @@ static int __init sgiseeq_devinit(void)
|
||||||
return res;
|
return res;
|
||||||
|
|
||||||
/* Second HPC is missing? */
|
/* Second HPC is missing? */
|
||||||
if (!ip22_is_fullhouse() ||
|
if (ip22_is_fullhouse() ||
|
||||||
get_dbe(tmp, (unsigned int *)&hpc3c1->pbdma[1]))
|
get_dbe(tmp, (unsigned int *)&hpc3c1->pbdma[1]))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,7 @@ txx9_reg_res_init(unsigned int pcode, unsigned long base, unsigned long size)
|
||||||
txx9_ce_res[i].name = txx9_ce_res_name[i];
|
txx9_ce_res[i].name = txx9_ce_res_name[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
txx9_pcode = pcode;
|
||||||
sprintf(txx9_pcode_str, "TX%x", pcode);
|
sprintf(txx9_pcode_str, "TX%x", pcode);
|
||||||
if (base) {
|
if (base) {
|
||||||
txx9_reg_res.start = base & 0xfffffffffULL;
|
txx9_reg_res.start = base & 0xfffffffffULL;
|
||||||
|
|
|
@ -47,7 +47,9 @@
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/bug.h>
|
#include <linux/bug.h>
|
||||||
|
#include <linux/uaccess.h>
|
||||||
|
|
||||||
|
#include <asm/sections.h>
|
||||||
#include <asm/unwind.h>
|
#include <asm/unwind.h>
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -860,3 +862,15 @@ void module_arch_cleanup(struct module *mod)
|
||||||
deregister_unwind_table(mod);
|
deregister_unwind_table(mod);
|
||||||
module_bug_cleanup(mod);
|
module_bug_cleanup(mod);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_64BIT
|
||||||
|
void *dereference_function_descriptor(void *ptr)
|
||||||
|
{
|
||||||
|
Elf64_Fdesc *desc = ptr;
|
||||||
|
void *p;
|
||||||
|
|
||||||
|
if (!probe_kernel_address(&desc->addr, p))
|
||||||
|
ptr = p;
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -116,6 +116,11 @@ ifeq ($(CONFIG_6xx),y)
|
||||||
KBUILD_CFLAGS += -mcpu=powerpc
|
KBUILD_CFLAGS += -mcpu=powerpc
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# Work around a gcc code-gen bug with -fno-omit-frame-pointer.
|
||||||
|
ifeq ($(CONFIG_FTRACE),y)
|
||||||
|
KBUILD_CFLAGS += -mno-sched-epilog
|
||||||
|
endif
|
||||||
|
|
||||||
cpu-as-$(CONFIG_4xx) += -Wa,-m405
|
cpu-as-$(CONFIG_4xx) += -Wa,-m405
|
||||||
cpu-as-$(CONFIG_6xx) += -Wa,-maltivec
|
cpu-as-$(CONFIG_6xx) += -Wa,-maltivec
|
||||||
cpu-as-$(CONFIG_POWER4) += -Wa,-maltivec
|
cpu-as-$(CONFIG_POWER4) += -Wa,-maltivec
|
||||||
|
|
|
@ -49,7 +49,7 @@ zlib := inffast.c inflate.c inftrees.c
|
||||||
zlibheader := inffast.h inffixed.h inflate.h inftrees.h infutil.h
|
zlibheader := inffast.h inffixed.h inflate.h inftrees.h infutil.h
|
||||||
zliblinuxheader := zlib.h zconf.h zutil.h
|
zliblinuxheader := zlib.h zconf.h zutil.h
|
||||||
|
|
||||||
$(addprefix $(obj)/,$(zlib) gunzip_util.o main.o): \
|
$(addprefix $(obj)/,$(zlib) cuboot-c2k.o gunzip_util.o main.o prpmc2800.o): \
|
||||||
$(addprefix $(obj)/,$(zliblinuxheader)) $(addprefix $(obj)/,$(zlibheader))
|
$(addprefix $(obj)/,$(zliblinuxheader)) $(addprefix $(obj)/,$(zlibheader))
|
||||||
|
|
||||||
src-libfdt := fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c
|
src-libfdt := fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c
|
||||||
|
|
|
@ -153,12 +153,10 @@
|
||||||
#define __S110 PAGE_SHARED_X
|
#define __S110 PAGE_SHARED_X
|
||||||
#define __S111 PAGE_SHARED_X
|
#define __S111 PAGE_SHARED_X
|
||||||
|
|
||||||
#ifdef CONFIG_HUGETLB_PAGE
|
#ifdef CONFIG_PPC_MM_SLICES
|
||||||
|
|
||||||
#define HAVE_ARCH_UNMAPPED_AREA
|
#define HAVE_ARCH_UNMAPPED_AREA
|
||||||
#define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN
|
#define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN
|
||||||
|
#endif /* CONFIG_PPC_MM_SLICES */
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,9 @@ static inline int in_kernel_text(unsigned long addr)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef dereference_function_descriptor
|
||||||
|
void *dereference_function_descriptor(void *);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
|
|
|
@ -14,12 +14,13 @@ endif
|
||||||
|
|
||||||
ifdef CONFIG_FTRACE
|
ifdef CONFIG_FTRACE
|
||||||
# Do not trace early boot code
|
# Do not trace early boot code
|
||||||
CFLAGS_REMOVE_cputable.o = -pg
|
CFLAGS_REMOVE_cputable.o = -pg -mno-sched-epilog
|
||||||
CFLAGS_REMOVE_prom_init.o = -pg
|
CFLAGS_REMOVE_prom_init.o = -pg -mno-sched-epilog
|
||||||
|
CFLAGS_REMOVE_btext.o = -pg -mno-sched-epilog
|
||||||
|
|
||||||
ifdef CONFIG_DYNAMIC_FTRACE
|
ifdef CONFIG_DYNAMIC_FTRACE
|
||||||
# dynamic ftrace setup.
|
# dynamic ftrace setup.
|
||||||
CFLAGS_REMOVE_ftrace.o = -pg
|
CFLAGS_REMOVE_ftrace.o = -pg -mno-sched-epilog
|
||||||
endif
|
endif
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -647,7 +647,7 @@ static int emulate_vsx(unsigned char __user *addr, unsigned int reg,
|
||||||
unsigned int flags, unsigned int length)
|
unsigned int flags, unsigned int length)
|
||||||
{
|
{
|
||||||
char *ptr = (char *) ¤t->thread.TS_FPR(reg);
|
char *ptr = (char *) ¤t->thread.TS_FPR(reg);
|
||||||
int ret;
|
int ret = 0;
|
||||||
|
|
||||||
flush_vsx_to_thread(current);
|
flush_vsx_to_thread(current);
|
||||||
|
|
||||||
|
|
|
@ -158,7 +158,7 @@ _GLOBAL(power_save_ppc32_restore)
|
||||||
stw r9,_NIP(r11) /* make it do a blr */
|
stw r9,_NIP(r11) /* make it do a blr */
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
mfspr r12,SPRN_SPRG3
|
rlwinm r12,r11,0,0,31-THREAD_SHIFT
|
||||||
lwz r11,TI_CPU(r12) /* get cpu number * 4 */
|
lwz r11,TI_CPU(r12) /* get cpu number * 4 */
|
||||||
slwi r11,r11,2
|
slwi r11,r11,2
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -84,10 +84,11 @@ _GLOBAL(power_save_ppc32_restore)
|
||||||
stw r9,_NIP(r11) /* make it do a blr */
|
stw r9,_NIP(r11) /* make it do a blr */
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
mfspr r12,SPRN_SPRG3
|
rlwinm r12,r1,0,0,31-THREAD_SHIFT
|
||||||
lwz r11,TI_CPU(r12) /* get cpu number * 4 */
|
lwz r11,TI_CPU(r12) /* get cpu number * 4 */
|
||||||
slwi r11,r11,2
|
slwi r11,r11,2
|
||||||
#else
|
#else
|
||||||
li r11,0
|
li r11,0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
b transfer_to_handler_cont
|
b transfer_to_handler_cont
|
||||||
|
|
|
@ -21,8 +21,9 @@
|
||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
#include <linux/bug.h>
|
#include <linux/bug.h>
|
||||||
|
#include <linux/uaccess.h>
|
||||||
#include <asm/module.h>
|
#include <asm/module.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/sections.h>
|
||||||
#include <asm/firmware.h>
|
#include <asm/firmware.h>
|
||||||
#include <asm/code-patching.h>
|
#include <asm/code-patching.h>
|
||||||
#include <linux/sort.h>
|
#include <linux/sort.h>
|
||||||
|
@ -451,3 +452,13 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *dereference_function_descriptor(void *ptr)
|
||||||
|
{
|
||||||
|
struct ppc64_opd_entry *desc = ptr;
|
||||||
|
void *p;
|
||||||
|
|
||||||
|
if (!probe_kernel_address(&desc->funcaddr, p))
|
||||||
|
ptr = p;
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
|
@ -66,11 +66,12 @@ SECTIONS
|
||||||
__got2_end = .;
|
__got2_end = .;
|
||||||
#endif /* CONFIG_PPC32 */
|
#endif /* CONFIG_PPC32 */
|
||||||
|
|
||||||
. = ALIGN(PAGE_SIZE);
|
|
||||||
_etext = .;
|
|
||||||
PROVIDE32 (etext = .);
|
|
||||||
} :kernel
|
} :kernel
|
||||||
|
|
||||||
|
. = ALIGN(PAGE_SIZE);
|
||||||
|
_etext = .;
|
||||||
|
PROVIDE32 (etext = .);
|
||||||
|
|
||||||
/* Read-only data */
|
/* Read-only data */
|
||||||
RODATA
|
RODATA
|
||||||
|
|
||||||
|
|
|
@ -191,12 +191,17 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
|
||||||
unsigned long hash, hpteg;
|
unsigned long hash, hpteg;
|
||||||
unsigned long vsid = get_kernel_vsid(vaddr, ssize);
|
unsigned long vsid = get_kernel_vsid(vaddr, ssize);
|
||||||
unsigned long va = hpt_va(vaddr, vsid, ssize);
|
unsigned long va = hpt_va(vaddr, vsid, ssize);
|
||||||
|
unsigned long tprot = prot;
|
||||||
|
|
||||||
|
/* Make kernel text executable */
|
||||||
|
if (in_kernel_text(vaddr))
|
||||||
|
tprot &= ~HPTE_R_N;
|
||||||
|
|
||||||
hash = hpt_hash(va, shift, ssize);
|
hash = hpt_hash(va, shift, ssize);
|
||||||
hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP);
|
hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP);
|
||||||
|
|
||||||
BUG_ON(!ppc_md.hpte_insert);
|
BUG_ON(!ppc_md.hpte_insert);
|
||||||
ret = ppc_md.hpte_insert(hpteg, va, paddr, prot,
|
ret = ppc_md.hpte_insert(hpteg, va, paddr, tprot,
|
||||||
HPTE_V_BOLTED, psize, ssize);
|
HPTE_V_BOLTED, psize, ssize);
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
@ -584,7 +589,7 @@ void __init htab_initialize(void)
|
||||||
{
|
{
|
||||||
unsigned long table;
|
unsigned long table;
|
||||||
unsigned long pteg_count;
|
unsigned long pteg_count;
|
||||||
unsigned long prot, tprot;
|
unsigned long prot;
|
||||||
unsigned long base = 0, size = 0, limit;
|
unsigned long base = 0, size = 0, limit;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -660,10 +665,9 @@ void __init htab_initialize(void)
|
||||||
for (i=0; i < lmb.memory.cnt; i++) {
|
for (i=0; i < lmb.memory.cnt; i++) {
|
||||||
base = (unsigned long)__va(lmb.memory.region[i].base);
|
base = (unsigned long)__va(lmb.memory.region[i].base);
|
||||||
size = lmb.memory.region[i].size;
|
size = lmb.memory.region[i].size;
|
||||||
tprot = prot | (in_kernel_text(base) ? _PAGE_EXEC : 0);
|
|
||||||
|
|
||||||
DBG("creating mapping for region: %lx..%lx (prot: %x)\n",
|
DBG("creating mapping for region: %lx..%lx (prot: %x)\n",
|
||||||
base, size, tprot);
|
base, size, prot);
|
||||||
|
|
||||||
#ifdef CONFIG_U3_DART
|
#ifdef CONFIG_U3_DART
|
||||||
/* Do not map the DART space. Fortunately, it will be aligned
|
/* Do not map the DART space. Fortunately, it will be aligned
|
||||||
|
@ -680,21 +684,21 @@ void __init htab_initialize(void)
|
||||||
unsigned long dart_table_end = dart_tablebase + 16 * MB;
|
unsigned long dart_table_end = dart_tablebase + 16 * MB;
|
||||||
if (base != dart_tablebase)
|
if (base != dart_tablebase)
|
||||||
BUG_ON(htab_bolt_mapping(base, dart_tablebase,
|
BUG_ON(htab_bolt_mapping(base, dart_tablebase,
|
||||||
__pa(base), tprot,
|
__pa(base), prot,
|
||||||
mmu_linear_psize,
|
mmu_linear_psize,
|
||||||
mmu_kernel_ssize));
|
mmu_kernel_ssize));
|
||||||
if ((base + size) > dart_table_end)
|
if ((base + size) > dart_table_end)
|
||||||
BUG_ON(htab_bolt_mapping(dart_tablebase+16*MB,
|
BUG_ON(htab_bolt_mapping(dart_tablebase+16*MB,
|
||||||
base + size,
|
base + size,
|
||||||
__pa(dart_table_end),
|
__pa(dart_table_end),
|
||||||
tprot,
|
prot,
|
||||||
mmu_linear_psize,
|
mmu_linear_psize,
|
||||||
mmu_kernel_ssize));
|
mmu_kernel_ssize));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_U3_DART */
|
#endif /* CONFIG_U3_DART */
|
||||||
BUG_ON(htab_bolt_mapping(base, base + size, __pa(base),
|
BUG_ON(htab_bolt_mapping(base, base + size, __pa(base),
|
||||||
tprot, mmu_linear_psize, mmu_kernel_ssize));
|
prot, mmu_linear_psize, mmu_kernel_ssize));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -643,9 +643,10 @@ static struct spu *find_victim(struct spu_context *ctx)
|
||||||
!(tmp->flags & SPU_CREATE_NOSCHED) &&
|
!(tmp->flags & SPU_CREATE_NOSCHED) &&
|
||||||
(!victim || tmp->prio > victim->prio)) {
|
(!victim || tmp->prio > victim->prio)) {
|
||||||
victim = spu->ctx;
|
victim = spu->ctx;
|
||||||
get_spu_context(victim);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (victim)
|
||||||
|
get_spu_context(victim);
|
||||||
mutex_unlock(&cbe_spu_info[node].list_mutex);
|
mutex_unlock(&cbe_spu_info[node].list_mutex);
|
||||||
|
|
||||||
if (victim) {
|
if (victim) {
|
||||||
|
@ -727,17 +728,33 @@ static void spu_schedule(struct spu *spu, struct spu_context *ctx)
|
||||||
/* not a candidate for interruptible because it's called either
|
/* not a candidate for interruptible because it's called either
|
||||||
from the scheduler thread or from spu_deactivate */
|
from the scheduler thread or from spu_deactivate */
|
||||||
mutex_lock(&ctx->state_mutex);
|
mutex_lock(&ctx->state_mutex);
|
||||||
__spu_schedule(spu, ctx);
|
if (ctx->state == SPU_STATE_SAVED)
|
||||||
|
__spu_schedule(spu, ctx);
|
||||||
spu_release(ctx);
|
spu_release(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void spu_unschedule(struct spu *spu, struct spu_context *ctx)
|
/**
|
||||||
|
* spu_unschedule - remove a context from a spu, and possibly release it.
|
||||||
|
* @spu: The SPU to unschedule from
|
||||||
|
* @ctx: The context currently scheduled on the SPU
|
||||||
|
* @free_spu Whether to free the SPU for other contexts
|
||||||
|
*
|
||||||
|
* Unbinds the context @ctx from the SPU @spu. If @free_spu is non-zero, the
|
||||||
|
* SPU is made available for other contexts (ie, may be returned by
|
||||||
|
* spu_get_idle). If this is zero, the caller is expected to schedule another
|
||||||
|
* context to this spu.
|
||||||
|
*
|
||||||
|
* Should be called with ctx->state_mutex held.
|
||||||
|
*/
|
||||||
|
static void spu_unschedule(struct spu *spu, struct spu_context *ctx,
|
||||||
|
int free_spu)
|
||||||
{
|
{
|
||||||
int node = spu->node;
|
int node = spu->node;
|
||||||
|
|
||||||
mutex_lock(&cbe_spu_info[node].list_mutex);
|
mutex_lock(&cbe_spu_info[node].list_mutex);
|
||||||
cbe_spu_info[node].nr_active--;
|
cbe_spu_info[node].nr_active--;
|
||||||
spu->alloc_state = SPU_FREE;
|
if (free_spu)
|
||||||
|
spu->alloc_state = SPU_FREE;
|
||||||
spu_unbind_context(spu, ctx);
|
spu_unbind_context(spu, ctx);
|
||||||
ctx->stats.invol_ctx_switch++;
|
ctx->stats.invol_ctx_switch++;
|
||||||
spu->stats.invol_ctx_switch++;
|
spu->stats.invol_ctx_switch++;
|
||||||
|
@ -837,7 +854,7 @@ static int __spu_deactivate(struct spu_context *ctx, int force, int max_prio)
|
||||||
if (spu) {
|
if (spu) {
|
||||||
new = grab_runnable_context(max_prio, spu->node);
|
new = grab_runnable_context(max_prio, spu->node);
|
||||||
if (new || force) {
|
if (new || force) {
|
||||||
spu_unschedule(spu, ctx);
|
spu_unschedule(spu, ctx, new == NULL);
|
||||||
if (new) {
|
if (new) {
|
||||||
if (new->flags & SPU_CREATE_NOSCHED)
|
if (new->flags & SPU_CREATE_NOSCHED)
|
||||||
wake_up(&new->stop_wq);
|
wake_up(&new->stop_wq);
|
||||||
|
@ -910,7 +927,7 @@ static noinline void spusched_tick(struct spu_context *ctx)
|
||||||
|
|
||||||
new = grab_runnable_context(ctx->prio + 1, spu->node);
|
new = grab_runnable_context(ctx->prio + 1, spu->node);
|
||||||
if (new) {
|
if (new) {
|
||||||
spu_unschedule(spu, ctx);
|
spu_unschedule(spu, ctx, 0);
|
||||||
if (test_bit(SPU_SCHED_SPU_RUN, &ctx->sched_flags))
|
if (test_bit(SPU_SCHED_SPU_RUN, &ctx->sched_flags))
|
||||||
spu_add_to_rq(ctx);
|
spu_add_to_rq(ctx);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -2,7 +2,7 @@ CFLAGS_bootx_init.o += -fPIC
|
||||||
|
|
||||||
ifdef CONFIG_FTRACE
|
ifdef CONFIG_FTRACE
|
||||||
# Do not trace early boot code
|
# Do not trace early boot code
|
||||||
CFLAGS_REMOVE_bootx_init.o = -pg
|
CFLAGS_REMOVE_bootx_init.o = -pg -mno-sched-epilog
|
||||||
endif
|
endif
|
||||||
|
|
||||||
obj-y += pic.o setup.o time.o feature.o pci.o \
|
obj-y += pic.o setup.o time.o feature.o pci.o \
|
||||||
|
|
|
@ -42,6 +42,7 @@ struct user_regs_struct32
|
||||||
u32 gprs[NUM_GPRS];
|
u32 gprs[NUM_GPRS];
|
||||||
u32 acrs[NUM_ACRS];
|
u32 acrs[NUM_ACRS];
|
||||||
u32 orig_gpr2;
|
u32 orig_gpr2;
|
||||||
|
/* nb: there's a 4-byte hole here */
|
||||||
s390_fp_regs fp_regs;
|
s390_fp_regs fp_regs;
|
||||||
/*
|
/*
|
||||||
* These per registers are in here so that gdb can modify them
|
* These per registers are in here so that gdb can modify them
|
||||||
|
|
|
@ -170,6 +170,13 @@ static unsigned long __peek_user(struct task_struct *child, addr_t addr)
|
||||||
*/
|
*/
|
||||||
tmp = (addr_t) task_pt_regs(child)->orig_gpr2;
|
tmp = (addr_t) task_pt_regs(child)->orig_gpr2;
|
||||||
|
|
||||||
|
} else if (addr < (addr_t) &dummy->regs.fp_regs) {
|
||||||
|
/*
|
||||||
|
* prevent reads of padding hole between
|
||||||
|
* orig_gpr2 and fp_regs on s390.
|
||||||
|
*/
|
||||||
|
tmp = 0;
|
||||||
|
|
||||||
} else if (addr < (addr_t) (&dummy->regs.fp_regs + 1)) {
|
} else if (addr < (addr_t) (&dummy->regs.fp_regs + 1)) {
|
||||||
/*
|
/*
|
||||||
* floating point regs. are stored in the thread structure
|
* floating point regs. are stored in the thread structure
|
||||||
|
@ -270,6 +277,13 @@ static int __poke_user(struct task_struct *child, addr_t addr, addr_t data)
|
||||||
*/
|
*/
|
||||||
task_pt_regs(child)->orig_gpr2 = data;
|
task_pt_regs(child)->orig_gpr2 = data;
|
||||||
|
|
||||||
|
} else if (addr < (addr_t) &dummy->regs.fp_regs) {
|
||||||
|
/*
|
||||||
|
* prevent writes of padding hole between
|
||||||
|
* orig_gpr2 and fp_regs on s390.
|
||||||
|
*/
|
||||||
|
return 0;
|
||||||
|
|
||||||
} else if (addr < (addr_t) (&dummy->regs.fp_regs + 1)) {
|
} else if (addr < (addr_t) (&dummy->regs.fp_regs + 1)) {
|
||||||
/*
|
/*
|
||||||
* floating point regs. are stored in the thread structure
|
* floating point regs. are stored in the thread structure
|
||||||
|
@ -428,6 +442,13 @@ static u32 __peek_user_compat(struct task_struct *child, addr_t addr)
|
||||||
*/
|
*/
|
||||||
tmp = *(__u32*)((addr_t) &task_pt_regs(child)->orig_gpr2 + 4);
|
tmp = *(__u32*)((addr_t) &task_pt_regs(child)->orig_gpr2 + 4);
|
||||||
|
|
||||||
|
} else if (addr < (addr_t) &dummy32->regs.fp_regs) {
|
||||||
|
/*
|
||||||
|
* prevent reads of padding hole between
|
||||||
|
* orig_gpr2 and fp_regs on s390.
|
||||||
|
*/
|
||||||
|
tmp = 0;
|
||||||
|
|
||||||
} else if (addr < (addr_t) (&dummy32->regs.fp_regs + 1)) {
|
} else if (addr < (addr_t) (&dummy32->regs.fp_regs + 1)) {
|
||||||
/*
|
/*
|
||||||
* floating point regs. are stored in the thread structure
|
* floating point regs. are stored in the thread structure
|
||||||
|
@ -514,6 +535,13 @@ static int __poke_user_compat(struct task_struct *child,
|
||||||
*/
|
*/
|
||||||
*(__u32*)((addr_t) &task_pt_regs(child)->orig_gpr2 + 4) = tmp;
|
*(__u32*)((addr_t) &task_pt_regs(child)->orig_gpr2 + 4) = tmp;
|
||||||
|
|
||||||
|
} else if (addr < (addr_t) &dummy32->regs.fp_regs) {
|
||||||
|
/*
|
||||||
|
* prevent writess of padding hole between
|
||||||
|
* orig_gpr2 and fp_regs on s390.
|
||||||
|
*/
|
||||||
|
return 0;
|
||||||
|
|
||||||
} else if (addr < (addr_t) (&dummy32->regs.fp_regs + 1)) {
|
} else if (addr < (addr_t) (&dummy32->regs.fp_regs + 1)) {
|
||||||
/*
|
/*
|
||||||
* floating point regs. are stored in the thread structure
|
* floating point regs. are stored in the thread structure
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.26
|
# Linux kernel version: 2.6.27-rc4
|
||||||
# Wed Jul 30 01:18:59 2008
|
# Tue Aug 26 14:21:17 2008
|
||||||
#
|
#
|
||||||
CONFIG_SUPERH=y
|
CONFIG_SUPERH=y
|
||||||
CONFIG_SUPERH32=y
|
CONFIG_SUPERH32=y
|
||||||
|
@ -11,6 +11,7 @@ CONFIG_GENERIC_BUG=y
|
||||||
CONFIG_GENERIC_FIND_NEXT_BIT=y
|
CONFIG_GENERIC_FIND_NEXT_BIT=y
|
||||||
CONFIG_GENERIC_HWEIGHT=y
|
CONFIG_GENERIC_HWEIGHT=y
|
||||||
CONFIG_GENERIC_HARDIRQS=y
|
CONFIG_GENERIC_HARDIRQS=y
|
||||||
|
CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
|
||||||
CONFIG_GENERIC_IRQ_PROBE=y
|
CONFIG_GENERIC_IRQ_PROBE=y
|
||||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||||
CONFIG_GENERIC_TIME=y
|
CONFIG_GENERIC_TIME=y
|
||||||
|
@ -20,7 +21,6 @@ CONFIG_LOCKDEP_SUPPORT=y
|
||||||
# CONFIG_ARCH_HAS_ILOG2_U32 is not set
|
# CONFIG_ARCH_HAS_ILOG2_U32 is not set
|
||||||
# CONFIG_ARCH_HAS_ILOG2_U64 is not set
|
# CONFIG_ARCH_HAS_ILOG2_U64 is not set
|
||||||
CONFIG_ARCH_NO_VIRT_TO_BUS=y
|
CONFIG_ARCH_NO_VIRT_TO_BUS=y
|
||||||
CONFIG_ARCH_SUPPORTS_AOUT=y
|
|
||||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -58,7 +58,6 @@ CONFIG_SYSCTL=y
|
||||||
CONFIG_EMBEDDED=y
|
CONFIG_EMBEDDED=y
|
||||||
CONFIG_UID16=y
|
CONFIG_UID16=y
|
||||||
CONFIG_SYSCTL_SYSCALL=y
|
CONFIG_SYSCTL_SYSCALL=y
|
||||||
CONFIG_SYSCTL_SYSCALL_CHECK=y
|
|
||||||
# CONFIG_KALLSYMS is not set
|
# CONFIG_KALLSYMS is not set
|
||||||
CONFIG_HOTPLUG=y
|
CONFIG_HOTPLUG=y
|
||||||
CONFIG_PRINTK=y
|
CONFIG_PRINTK=y
|
||||||
|
@ -89,6 +88,7 @@ CONFIG_HAVE_OPROFILE=y
|
||||||
# CONFIG_USE_GENERIC_SMP_HELPERS is not set
|
# CONFIG_USE_GENERIC_SMP_HELPERS is not set
|
||||||
CONFIG_HAVE_CLK=y
|
CONFIG_HAVE_CLK=y
|
||||||
CONFIG_PROC_PAGE_MONITOR=y
|
CONFIG_PROC_PAGE_MONITOR=y
|
||||||
|
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
|
||||||
CONFIG_SLABINFO=y
|
CONFIG_SLABINFO=y
|
||||||
CONFIG_RT_MUTEXES=y
|
CONFIG_RT_MUTEXES=y
|
||||||
# CONFIG_TINY_SHMEM is not set
|
# CONFIG_TINY_SHMEM is not set
|
||||||
|
@ -261,9 +261,10 @@ CONFIG_HZ_250=y
|
||||||
# CONFIG_HZ_300 is not set
|
# CONFIG_HZ_300 is not set
|
||||||
# CONFIG_HZ_1000 is not set
|
# CONFIG_HZ_1000 is not set
|
||||||
CONFIG_HZ=250
|
CONFIG_HZ=250
|
||||||
# CONFIG_SCHED_HRTICK is not set
|
CONFIG_SCHED_HRTICK=y
|
||||||
# CONFIG_KEXEC is not set
|
# CONFIG_KEXEC is not set
|
||||||
# CONFIG_CRASH_DUMP is not set
|
# CONFIG_CRASH_DUMP is not set
|
||||||
|
CONFIG_SECCOMP=y
|
||||||
# CONFIG_PREEMPT_NONE is not set
|
# CONFIG_PREEMPT_NONE is not set
|
||||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||||
CONFIG_PREEMPT=y
|
CONFIG_PREEMPT=y
|
||||||
|
@ -289,10 +290,6 @@ CONFIG_CMDLINE="console=tty1 console=ttySC5,38400 root=/dev/nfs ip=dhcp"
|
||||||
#
|
#
|
||||||
CONFIG_BINFMT_ELF=y
|
CONFIG_BINFMT_ELF=y
|
||||||
# CONFIG_BINFMT_MISC is not set
|
# CONFIG_BINFMT_MISC is not set
|
||||||
|
|
||||||
#
|
|
||||||
# Networking
|
|
||||||
#
|
|
||||||
CONFIG_NET=y
|
CONFIG_NET=y
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -647,6 +644,7 @@ CONFIG_SSB_POSSIBLE=y
|
||||||
# CONFIG_MFD_CORE is not set
|
# CONFIG_MFD_CORE is not set
|
||||||
# CONFIG_MFD_SM501 is not set
|
# CONFIG_MFD_SM501 is not set
|
||||||
# CONFIG_HTC_PASIC3 is not set
|
# CONFIG_HTC_PASIC3 is not set
|
||||||
|
# CONFIG_MFD_TMIO is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Multimedia devices
|
# Multimedia devices
|
||||||
|
@ -690,7 +688,10 @@ CONFIG_DUMMY_CONSOLE=y
|
||||||
# CONFIG_ACCESSIBILITY is not set
|
# CONFIG_ACCESSIBILITY is not set
|
||||||
# CONFIG_RTC_CLASS is not set
|
# CONFIG_RTC_CLASS is not set
|
||||||
# CONFIG_DMADEVICES is not set
|
# CONFIG_DMADEVICES is not set
|
||||||
# CONFIG_UIO is not set
|
CONFIG_UIO=y
|
||||||
|
# CONFIG_UIO_PDRV is not set
|
||||||
|
CONFIG_UIO_PDRV_GENIRQ=y
|
||||||
|
# CONFIG_UIO_SMX is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# File systems
|
# File systems
|
||||||
|
@ -854,6 +855,7 @@ CONFIG_FRAME_WARN=1024
|
||||||
# CONFIG_DEBUG_KERNEL is not set
|
# CONFIG_DEBUG_KERNEL is not set
|
||||||
# CONFIG_DEBUG_BUGVERBOSE is not set
|
# CONFIG_DEBUG_BUGVERBOSE is not set
|
||||||
# CONFIG_DEBUG_MEMORY_INIT is not set
|
# CONFIG_DEBUG_MEMORY_INIT is not set
|
||||||
|
CONFIG_SYSCTL_SYSCALL_CHECK=y
|
||||||
# CONFIG_SAMPLES is not set
|
# CONFIG_SAMPLES is not set
|
||||||
# CONFIG_SH_STANDARD_BIOS is not set
|
# CONFIG_SH_STANDARD_BIOS is not set
|
||||||
# CONFIG_EARLY_SCIF_CONSOLE is not set
|
# CONFIG_EARLY_SCIF_CONSOLE is not set
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.26
|
# Linux kernel version: 2.6.27-rc4
|
||||||
# Wed Jul 30 01:44:41 2008
|
# Tue Aug 26 14:18:17 2008
|
||||||
#
|
#
|
||||||
CONFIG_SUPERH=y
|
CONFIG_SUPERH=y
|
||||||
CONFIG_SUPERH32=y
|
CONFIG_SUPERH32=y
|
||||||
|
@ -11,6 +11,7 @@ CONFIG_GENERIC_BUG=y
|
||||||
CONFIG_GENERIC_FIND_NEXT_BIT=y
|
CONFIG_GENERIC_FIND_NEXT_BIT=y
|
||||||
CONFIG_GENERIC_HWEIGHT=y
|
CONFIG_GENERIC_HWEIGHT=y
|
||||||
CONFIG_GENERIC_HARDIRQS=y
|
CONFIG_GENERIC_HARDIRQS=y
|
||||||
|
CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
|
||||||
CONFIG_GENERIC_IRQ_PROBE=y
|
CONFIG_GENERIC_IRQ_PROBE=y
|
||||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||||
CONFIG_GENERIC_TIME=y
|
CONFIG_GENERIC_TIME=y
|
||||||
|
@ -21,7 +22,6 @@ CONFIG_LOCKDEP_SUPPORT=y
|
||||||
# CONFIG_ARCH_HAS_ILOG2_U32 is not set
|
# CONFIG_ARCH_HAS_ILOG2_U32 is not set
|
||||||
# CONFIG_ARCH_HAS_ILOG2_U64 is not set
|
# CONFIG_ARCH_HAS_ILOG2_U64 is not set
|
||||||
CONFIG_ARCH_NO_VIRT_TO_BUS=y
|
CONFIG_ARCH_NO_VIRT_TO_BUS=y
|
||||||
CONFIG_ARCH_SUPPORTS_AOUT=y
|
|
||||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -87,6 +87,7 @@ CONFIG_HAVE_OPROFILE=y
|
||||||
# CONFIG_USE_GENERIC_SMP_HELPERS is not set
|
# CONFIG_USE_GENERIC_SMP_HELPERS is not set
|
||||||
CONFIG_HAVE_CLK=y
|
CONFIG_HAVE_CLK=y
|
||||||
CONFIG_PROC_PAGE_MONITOR=y
|
CONFIG_PROC_PAGE_MONITOR=y
|
||||||
|
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
|
||||||
CONFIG_SLABINFO=y
|
CONFIG_SLABINFO=y
|
||||||
CONFIG_RT_MUTEXES=y
|
CONFIG_RT_MUTEXES=y
|
||||||
# CONFIG_TINY_SHMEM is not set
|
# CONFIG_TINY_SHMEM is not set
|
||||||
|
@ -270,6 +271,7 @@ CONFIG_HZ=250
|
||||||
# CONFIG_SCHED_HRTICK is not set
|
# CONFIG_SCHED_HRTICK is not set
|
||||||
# CONFIG_KEXEC is not set
|
# CONFIG_KEXEC is not set
|
||||||
# CONFIG_CRASH_DUMP is not set
|
# CONFIG_CRASH_DUMP is not set
|
||||||
|
CONFIG_SECCOMP=y
|
||||||
CONFIG_PREEMPT_NONE=y
|
CONFIG_PREEMPT_NONE=y
|
||||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||||
# CONFIG_PREEMPT is not set
|
# CONFIG_PREEMPT is not set
|
||||||
|
@ -294,10 +296,6 @@ CONFIG_CMDLINE="console=ttySC0,115200 earlyprintk=serial ip=on"
|
||||||
#
|
#
|
||||||
CONFIG_BINFMT_ELF=y
|
CONFIG_BINFMT_ELF=y
|
||||||
# CONFIG_BINFMT_MISC is not set
|
# CONFIG_BINFMT_MISC is not set
|
||||||
|
|
||||||
#
|
|
||||||
# Networking
|
|
||||||
#
|
|
||||||
CONFIG_NET=y
|
CONFIG_NET=y
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -649,6 +647,7 @@ CONFIG_HW_RANDOM=y
|
||||||
CONFIG_I2C=y
|
CONFIG_I2C=y
|
||||||
CONFIG_I2C_BOARDINFO=y
|
CONFIG_I2C_BOARDINFO=y
|
||||||
# CONFIG_I2C_CHARDEV is not set
|
# CONFIG_I2C_CHARDEV is not set
|
||||||
|
CONFIG_I2C_HELPER_AUTO=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# I2C Hardware Bus support
|
# I2C Hardware Bus support
|
||||||
|
@ -709,6 +708,7 @@ CONFIG_SSB_POSSIBLE=y
|
||||||
# CONFIG_MFD_CORE is not set
|
# CONFIG_MFD_CORE is not set
|
||||||
# CONFIG_MFD_SM501 is not set
|
# CONFIG_MFD_SM501 is not set
|
||||||
# CONFIG_HTC_PASIC3 is not set
|
# CONFIG_HTC_PASIC3 is not set
|
||||||
|
# CONFIG_MFD_TMIO is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Multimedia devices
|
# Multimedia devices
|
||||||
|
@ -755,6 +755,8 @@ CONFIG_USB_ARCH_HAS_HCD=y
|
||||||
# CONFIG_USB is not set
|
# CONFIG_USB is not set
|
||||||
# CONFIG_USB_OTG_WHITELIST is not set
|
# CONFIG_USB_OTG_WHITELIST is not set
|
||||||
# CONFIG_USB_OTG_BLACKLIST_HUB is not set
|
# CONFIG_USB_OTG_BLACKLIST_HUB is not set
|
||||||
|
# CONFIG_USB_MUSB_HDRC is not set
|
||||||
|
# CONFIG_USB_GADGET_MUSB_HDRC is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
|
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
|
||||||
|
@ -842,7 +844,10 @@ CONFIG_RTC_DRV_RS5C372=y
|
||||||
#
|
#
|
||||||
CONFIG_RTC_DRV_SH=y
|
CONFIG_RTC_DRV_SH=y
|
||||||
# CONFIG_DMADEVICES is not set
|
# CONFIG_DMADEVICES is not set
|
||||||
# CONFIG_UIO is not set
|
CONFIG_UIO=y
|
||||||
|
# CONFIG_UIO_PDRV is not set
|
||||||
|
CONFIG_UIO_PDRV_GENIRQ=y
|
||||||
|
# CONFIG_UIO_SMX is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# File systems
|
# File systems
|
||||||
|
|
|
@ -76,4 +76,6 @@ extern long __put_user_asm_l(void *, long);
|
||||||
extern long __put_user_asm_q(void *, long);
|
extern long __put_user_asm_q(void *, long);
|
||||||
extern void __put_user_unknown(void);
|
extern void __put_user_unknown(void);
|
||||||
|
|
||||||
|
extern long __strnlen_user(const char *__s, long __n);
|
||||||
|
|
||||||
#endif /* __ASM_SH_UACCESS_64_H */
|
#endif /* __ASM_SH_UACCESS_64_H */
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* arch/sh/kernel/cpu/sh5/entry.S
|
* arch/sh/kernel/cpu/sh5/entry.S
|
||||||
*
|
*
|
||||||
* Copyright (C) 2000, 2001 Paolo Alberelli
|
* Copyright (C) 2000, 2001 Paolo Alberelli
|
||||||
* Copyright (C) 2004 - 2007 Paul Mundt
|
* Copyright (C) 2004 - 2008 Paul Mundt
|
||||||
* Copyright (C) 2003, 2004 Richard Curnow
|
* Copyright (C) 2003, 2004 Richard Curnow
|
||||||
*
|
*
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
* This file is subject to the terms and conditions of the GNU General Public
|
||||||
|
@ -923,6 +923,8 @@ ret_from_exception:
|
||||||
blink tr0, ZERO
|
blink tr0, ZERO
|
||||||
|
|
||||||
resume_kernel:
|
resume_kernel:
|
||||||
|
CLI()
|
||||||
|
|
||||||
pta restore_all, tr0
|
pta restore_all, tr0
|
||||||
|
|
||||||
getcon KCR0, r6
|
getcon KCR0, r6
|
||||||
|
@ -939,19 +941,11 @@ need_resched:
|
||||||
andi r7, 0xf0, r7
|
andi r7, 0xf0, r7
|
||||||
bne r7, ZERO, tr0
|
bne r7, ZERO, tr0
|
||||||
|
|
||||||
movi ((PREEMPT_ACTIVE >> 16) & 65535), r8
|
movi preempt_schedule_irq, r7
|
||||||
shori (PREEMPT_ACTIVE & 65535), r8
|
|
||||||
st.l r6, TI_PRE_COUNT, r8
|
|
||||||
|
|
||||||
STI()
|
|
||||||
movi schedule, r7
|
|
||||||
ori r7, 1, r7
|
ori r7, 1, r7
|
||||||
ptabs r7, tr1
|
ptabs r7, tr1
|
||||||
blink tr1, LINK
|
blink tr1, LINK
|
||||||
|
|
||||||
st.l r6, TI_PRE_COUNT, ZERO
|
|
||||||
CLI()
|
|
||||||
|
|
||||||
pta need_resched, tr1
|
pta need_resched, tr1
|
||||||
blink tr1, ZERO
|
blink tr1, ZERO
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -92,6 +92,7 @@ ENTRY(ret_from_irq)
|
||||||
bra resume_userspace
|
bra resume_userspace
|
||||||
nop
|
nop
|
||||||
ENTRY(resume_kernel)
|
ENTRY(resume_kernel)
|
||||||
|
cli
|
||||||
mov.l @(TI_PRE_COUNT,r8), r0 ! current_thread_info->preempt_count
|
mov.l @(TI_PRE_COUNT,r8), r0 ! current_thread_info->preempt_count
|
||||||
tst r0, r0
|
tst r0, r0
|
||||||
bf noresched
|
bf noresched
|
||||||
|
@ -105,28 +106,9 @@ need_resched:
|
||||||
and #0xf0, r0 ! interrupts off (exception path)?
|
and #0xf0, r0 ! interrupts off (exception path)?
|
||||||
cmp/eq #0xf0, r0
|
cmp/eq #0xf0, r0
|
||||||
bt noresched
|
bt noresched
|
||||||
|
|
||||||
mov.l 1f, r0
|
|
||||||
mov.l r0, @(TI_PRE_COUNT,r8)
|
|
||||||
|
|
||||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
|
||||||
mov.l 3f, r0
|
mov.l 3f, r0
|
||||||
jsr @r0
|
jsr @r0 ! call preempt_schedule_irq
|
||||||
nop
|
nop
|
||||||
#endif
|
|
||||||
sti
|
|
||||||
mov.l 2f, r0
|
|
||||||
jsr @r0
|
|
||||||
nop
|
|
||||||
mov #0, r0
|
|
||||||
mov.l r0, @(TI_PRE_COUNT,r8)
|
|
||||||
cli
|
|
||||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
|
||||||
mov.l 4f, r0
|
|
||||||
jsr @r0
|
|
||||||
nop
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bra need_resched
|
bra need_resched
|
||||||
nop
|
nop
|
||||||
|
|
||||||
|
@ -137,10 +119,7 @@ noresched:
|
||||||
.align 2
|
.align 2
|
||||||
1: .long PREEMPT_ACTIVE
|
1: .long PREEMPT_ACTIVE
|
||||||
2: .long schedule
|
2: .long schedule
|
||||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
3: .long preempt_schedule_irq
|
||||||
3: .long trace_hardirqs_on
|
|
||||||
4: .long trace_hardirqs_off
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ENTRY(resume_userspace)
|
ENTRY(resume_userspace)
|
||||||
|
|
|
@ -102,7 +102,7 @@ void machine_kexec(struct kimage *image)
|
||||||
|
|
||||||
/* now call it */
|
/* now call it */
|
||||||
rnk = (relocate_new_kernel_t) reboot_code_buffer;
|
rnk = (relocate_new_kernel_t) reboot_code_buffer;
|
||||||
(*rnk)(page_list, reboot_code_buffer, image->start, vbr_reg);
|
(*rnk)(page_list, reboot_code_buffer, P2SEGADDR(image->start), vbr_reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void arch_crash_save_vmcoreinfo(void)
|
void arch_crash_save_vmcoreinfo(void)
|
||||||
|
|
|
@ -131,6 +131,8 @@ void user_enable_single_step(struct task_struct *child)
|
||||||
|
|
||||||
void user_disable_single_step(struct task_struct *child)
|
void user_disable_single_step(struct task_struct *child)
|
||||||
{
|
{
|
||||||
|
struct pt_regs *regs = child->thread.uregs;
|
||||||
|
|
||||||
regs->sr &= ~SR_SSTEP;
|
regs->sr &= ~SR_SSTEP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -171,6 +171,7 @@ static void __init reserve_crashkernel(void)
|
||||||
(unsigned long)(free_mem >> 20));
|
(unsigned long)(free_mem >> 20));
|
||||||
crashk_res.start = crash_base;
|
crashk_res.start = crash_base;
|
||||||
crashk_res.end = crash_base + crash_size - 1;
|
crashk_res.end = crash_base + crash_size - 1;
|
||||||
|
insert_resource(&iomem_resource, &crashk_res);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -204,11 +205,6 @@ void __init __add_active_range(unsigned int nid, unsigned long start_pfn,
|
||||||
request_resource(res, &data_resource);
|
request_resource(res, &data_resource);
|
||||||
request_resource(res, &bss_resource);
|
request_resource(res, &bss_resource);
|
||||||
|
|
||||||
#ifdef CONFIG_KEXEC
|
|
||||||
if (crashk_res.start != crashk_res.end)
|
|
||||||
request_resource(res, &crashk_res);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
add_active_range(nid, start_pfn, end_pfn);
|
add_active_range(nid, start_pfn, end_pfn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -170,7 +170,7 @@ asmlinkage int sys_ipc(uint call, int first, int second,
|
||||||
version = call >> 16; /* hack for backward compatibility */
|
version = call >> 16; /* hack for backward compatibility */
|
||||||
call &= 0xffff;
|
call &= 0xffff;
|
||||||
|
|
||||||
if (call <= SEMCTL)
|
if (call <= SEMTIMEDOP)
|
||||||
switch (call) {
|
switch (call) {
|
||||||
case SEMOP:
|
case SEMOP:
|
||||||
return sys_semtimedop(first,
|
return sys_semtimedop(first,
|
||||||
|
|
|
@ -101,7 +101,7 @@ static int __init memchunk_setup(char *str)
|
||||||
}
|
}
|
||||||
__setup("memchunk.", memchunk_setup);
|
__setup("memchunk.", memchunk_setup);
|
||||||
|
|
||||||
static void memchunk_cmdline_override(char *name, unsigned long *sizep)
|
static void __init memchunk_cmdline_override(char *name, unsigned long *sizep)
|
||||||
{
|
{
|
||||||
char *p = boot_command_line;
|
char *p = boot_command_line;
|
||||||
int k = strlen(name);
|
int k = strlen(name);
|
||||||
|
@ -118,8 +118,8 @@ static void memchunk_cmdline_override(char *name, unsigned long *sizep)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int platform_resource_setup_memory(struct platform_device *pdev,
|
int __init platform_resource_setup_memory(struct platform_device *pdev,
|
||||||
char *name, unsigned long memsize)
|
char *name, unsigned long memsize)
|
||||||
{
|
{
|
||||||
struct resource *r;
|
struct resource *r;
|
||||||
dma_addr_t dma_handle;
|
dma_addr_t dma_handle;
|
||||||
|
|
|
@ -792,6 +792,8 @@ void fixup_irqs(void)
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&irq_desc[irq].lock, flags);
|
spin_unlock_irqrestore(&irq_desc[irq].lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tick_ops->disable_irq();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -80,8 +80,6 @@ void smp_bogo(struct seq_file *m)
|
||||||
i, cpu_data(i).clock_tick);
|
i, cpu_data(i).clock_tick);
|
||||||
}
|
}
|
||||||
|
|
||||||
static __cacheline_aligned_in_smp DEFINE_SPINLOCK(call_lock);
|
|
||||||
|
|
||||||
extern void setup_sparc64_timer(void);
|
extern void setup_sparc64_timer(void);
|
||||||
|
|
||||||
static volatile unsigned long callin_flag = 0;
|
static volatile unsigned long callin_flag = 0;
|
||||||
|
@ -120,9 +118,9 @@ void __cpuinit smp_callin(void)
|
||||||
while (!cpu_isset(cpuid, smp_commenced_mask))
|
while (!cpu_isset(cpuid, smp_commenced_mask))
|
||||||
rmb();
|
rmb();
|
||||||
|
|
||||||
spin_lock(&call_lock);
|
ipi_call_lock();
|
||||||
cpu_set(cpuid, cpu_online_map);
|
cpu_set(cpuid, cpu_online_map);
|
||||||
spin_unlock(&call_lock);
|
ipi_call_unlock();
|
||||||
|
|
||||||
/* idle thread is expected to have preempt disabled */
|
/* idle thread is expected to have preempt disabled */
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
|
@ -1305,10 +1303,6 @@ int __cpu_disable(void)
|
||||||
c->core_id = 0;
|
c->core_id = 0;
|
||||||
c->proc_id = -1;
|
c->proc_id = -1;
|
||||||
|
|
||||||
spin_lock(&call_lock);
|
|
||||||
cpu_clear(cpu, cpu_online_map);
|
|
||||||
spin_unlock(&call_lock);
|
|
||||||
|
|
||||||
smp_wmb();
|
smp_wmb();
|
||||||
|
|
||||||
/* Make sure no interrupts point to this cpu. */
|
/* Make sure no interrupts point to this cpu. */
|
||||||
|
@ -1318,6 +1312,10 @@ int __cpu_disable(void)
|
||||||
mdelay(1);
|
mdelay(1);
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
|
|
||||||
|
ipi_call_lock();
|
||||||
|
cpu_clear(cpu, cpu_online_map);
|
||||||
|
ipi_call_unlock();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -382,14 +382,17 @@ config X86_OOSTORE
|
||||||
# P6_NOPs are a relatively minor optimization that require a family >=
|
# P6_NOPs are a relatively minor optimization that require a family >=
|
||||||
# 6 processor, except that it is broken on certain VIA chips.
|
# 6 processor, except that it is broken on certain VIA chips.
|
||||||
# Furthermore, AMD chips prefer a totally different sequence of NOPs
|
# Furthermore, AMD chips prefer a totally different sequence of NOPs
|
||||||
# (which work on all CPUs). As a result, disallow these if we're
|
# (which work on all CPUs). In addition, it looks like Virtual PC
|
||||||
# compiling X86_GENERIC but not X86_64 (these NOPs do work on all
|
# does not understand them.
|
||||||
# x86-64 capable chips); the list of processors in the right-hand clause
|
#
|
||||||
# are the cores that benefit from this optimization.
|
# As a result, disallow these if we're not compiling for X86_64 (these
|
||||||
|
# NOPs do work on all x86-64 capable chips); the list of processors in
|
||||||
|
# the right-hand clause are the cores that benefit from this optimization.
|
||||||
#
|
#
|
||||||
config X86_P6_NOP
|
config X86_P6_NOP
|
||||||
def_bool y
|
def_bool y
|
||||||
depends on (X86_64 || !X86_GENERIC) && (M686 || MPENTIUMII || MPENTIUMIII || MPENTIUMM || MCORE2 || MPENTIUM4 || MPSC)
|
depends on X86_64
|
||||||
|
depends on (MCORE2 || MPENTIUM4 || MPSC)
|
||||||
|
|
||||||
config X86_TSC
|
config X86_TSC
|
||||||
def_bool y
|
def_bool y
|
||||||
|
|
|
@ -38,12 +38,12 @@ static const u32 req_flags[NCAPINTS] =
|
||||||
{
|
{
|
||||||
REQUIRED_MASK0,
|
REQUIRED_MASK0,
|
||||||
REQUIRED_MASK1,
|
REQUIRED_MASK1,
|
||||||
REQUIRED_MASK2,
|
0, /* REQUIRED_MASK2 not implemented in this file */
|
||||||
REQUIRED_MASK3,
|
0, /* REQUIRED_MASK3 not implemented in this file */
|
||||||
REQUIRED_MASK4,
|
REQUIRED_MASK4,
|
||||||
REQUIRED_MASK5,
|
0, /* REQUIRED_MASK5 not implemented in this file */
|
||||||
REQUIRED_MASK6,
|
REQUIRED_MASK6,
|
||||||
REQUIRED_MASK7,
|
0, /* REQUIRED_MASK7 not implemented in this file */
|
||||||
};
|
};
|
||||||
|
|
||||||
#define A32(a, b, c, d) (((d) << 24)+((c) << 16)+((b) << 8)+(a))
|
#define A32(a, b, c, d) (((d) << 24)+((c) << 16)+((b) << 8)+(a))
|
||||||
|
|
|
@ -145,35 +145,25 @@ static const unsigned char *const p6_nops[ASM_NOP_MAX+1] = {
|
||||||
extern char __vsyscall_0;
|
extern char __vsyscall_0;
|
||||||
const unsigned char *const *find_nop_table(void)
|
const unsigned char *const *find_nop_table(void)
|
||||||
{
|
{
|
||||||
return boot_cpu_data.x86_vendor != X86_VENDOR_INTEL ||
|
if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
|
||||||
boot_cpu_data.x86 < 6 ? k8_nops : p6_nops;
|
boot_cpu_has(X86_FEATURE_NOPL))
|
||||||
|
return p6_nops;
|
||||||
|
else
|
||||||
|
return k8_nops;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else /* CONFIG_X86_64 */
|
#else /* CONFIG_X86_64 */
|
||||||
|
|
||||||
static const struct nop {
|
|
||||||
int cpuid;
|
|
||||||
const unsigned char *const *noptable;
|
|
||||||
} noptypes[] = {
|
|
||||||
{ X86_FEATURE_K8, k8_nops },
|
|
||||||
{ X86_FEATURE_K7, k7_nops },
|
|
||||||
{ X86_FEATURE_P4, p6_nops },
|
|
||||||
{ X86_FEATURE_P3, p6_nops },
|
|
||||||
{ -1, NULL }
|
|
||||||
};
|
|
||||||
|
|
||||||
const unsigned char *const *find_nop_table(void)
|
const unsigned char *const *find_nop_table(void)
|
||||||
{
|
{
|
||||||
const unsigned char *const *noptable = intel_nops;
|
if (boot_cpu_has(X86_FEATURE_K8))
|
||||||
int i;
|
return k8_nops;
|
||||||
|
else if (boot_cpu_has(X86_FEATURE_K7))
|
||||||
for (i = 0; noptypes[i].cpuid >= 0; i++) {
|
return k7_nops;
|
||||||
if (boot_cpu_has(noptypes[i].cpuid)) {
|
else if (boot_cpu_has(X86_FEATURE_NOPL))
|
||||||
noptable = noptypes[i].noptable;
|
return p6_nops;
|
||||||
break;
|
else
|
||||||
}
|
return intel_nops;
|
||||||
}
|
|
||||||
return noptable;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_X86_64 */
|
#endif /* CONFIG_X86_64 */
|
||||||
|
|
|
@ -31,6 +31,11 @@ static void __cpuinit early_init_amd(struct cpuinfo_x86 *c)
|
||||||
if (c->x86_power & (1<<8))
|
if (c->x86_power & (1<<8))
|
||||||
set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC);
|
set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set MTRR capability flag if appropriate */
|
||||||
|
if (c->x86_model == 13 || c->x86_model == 9 ||
|
||||||
|
(c->x86_model == 8 && c->x86_mask >= 8))
|
||||||
|
set_cpu_cap(c, X86_FEATURE_K6_MTRR);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __cpuinit init_amd(struct cpuinfo_x86 *c)
|
static void __cpuinit init_amd(struct cpuinfo_x86 *c)
|
||||||
|
@ -166,10 +171,6 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)
|
||||||
mbytes);
|
mbytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set MTRR capability flag if appropriate */
|
|
||||||
if (c->x86_model == 13 || c->x86_model == 9 ||
|
|
||||||
(c->x86_model == 8 && c->x86_mask >= 8))
|
|
||||||
set_cpu_cap(c, X86_FEATURE_K6_MTRR);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -314,6 +314,16 @@ enum {
|
||||||
EAMD3D = 1<<20,
|
EAMD3D = 1<<20,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void __cpuinit early_init_centaur(struct cpuinfo_x86 *c)
|
||||||
|
{
|
||||||
|
switch (c->x86) {
|
||||||
|
case 5:
|
||||||
|
/* Emulate MTRRs using Centaur's MCR. */
|
||||||
|
set_cpu_cap(c, X86_FEATURE_CENTAUR_MCR);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void __cpuinit init_centaur(struct cpuinfo_x86 *c)
|
static void __cpuinit init_centaur(struct cpuinfo_x86 *c)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -462,6 +472,7 @@ centaur_size_cache(struct cpuinfo_x86 *c, unsigned int size)
|
||||||
static struct cpu_dev centaur_cpu_dev __cpuinitdata = {
|
static struct cpu_dev centaur_cpu_dev __cpuinitdata = {
|
||||||
.c_vendor = "Centaur",
|
.c_vendor = "Centaur",
|
||||||
.c_ident = { "CentaurHauls" },
|
.c_ident = { "CentaurHauls" },
|
||||||
|
.c_early_init = early_init_centaur,
|
||||||
.c_init = init_centaur,
|
.c_init = init_centaur,
|
||||||
.c_size_cache = centaur_size_cache,
|
.c_size_cache = centaur_size_cache,
|
||||||
};
|
};
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include <asm/mtrr.h>
|
#include <asm/mtrr.h>
|
||||||
#include <asm/mce.h>
|
#include <asm/mce.h>
|
||||||
#include <asm/pat.h>
|
#include <asm/pat.h>
|
||||||
|
#include <asm/asm.h>
|
||||||
#ifdef CONFIG_X86_LOCAL_APIC
|
#ifdef CONFIG_X86_LOCAL_APIC
|
||||||
#include <asm/mpspec.h>
|
#include <asm/mpspec.h>
|
||||||
#include <asm/apic.h>
|
#include <asm/apic.h>
|
||||||
|
@ -334,11 +335,40 @@ static void __init early_cpu_detect(void)
|
||||||
|
|
||||||
get_cpu_vendor(c, 1);
|
get_cpu_vendor(c, 1);
|
||||||
|
|
||||||
|
early_get_cap(c);
|
||||||
|
|
||||||
if (c->x86_vendor != X86_VENDOR_UNKNOWN &&
|
if (c->x86_vendor != X86_VENDOR_UNKNOWN &&
|
||||||
cpu_devs[c->x86_vendor]->c_early_init)
|
cpu_devs[c->x86_vendor]->c_early_init)
|
||||||
cpu_devs[c->x86_vendor]->c_early_init(c);
|
cpu_devs[c->x86_vendor]->c_early_init(c);
|
||||||
|
}
|
||||||
|
|
||||||
early_get_cap(c);
|
/*
|
||||||
|
* The NOPL instruction is supposed to exist on all CPUs with
|
||||||
|
* family >= 6, unfortunately, that's not true in practice because
|
||||||
|
* of early VIA chips and (more importantly) broken virtualizers that
|
||||||
|
* are not easy to detect. Hence, probe for it based on first
|
||||||
|
* principles.
|
||||||
|
*/
|
||||||
|
static void __cpuinit detect_nopl(struct cpuinfo_x86 *c)
|
||||||
|
{
|
||||||
|
const u32 nopl_signature = 0x888c53b1; /* Random number */
|
||||||
|
u32 has_nopl = nopl_signature;
|
||||||
|
|
||||||
|
clear_cpu_cap(c, X86_FEATURE_NOPL);
|
||||||
|
if (c->x86 >= 6) {
|
||||||
|
asm volatile("\n"
|
||||||
|
"1: .byte 0x0f,0x1f,0xc0\n" /* nopl %eax */
|
||||||
|
"2:\n"
|
||||||
|
" .section .fixup,\"ax\"\n"
|
||||||
|
"3: xor %0,%0\n"
|
||||||
|
" jmp 2b\n"
|
||||||
|
" .previous\n"
|
||||||
|
_ASM_EXTABLE(1b,3b)
|
||||||
|
: "+a" (has_nopl));
|
||||||
|
|
||||||
|
if (has_nopl == nopl_signature)
|
||||||
|
set_cpu_cap(c, X86_FEATURE_NOPL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __cpuinit generic_identify(struct cpuinfo_x86 *c)
|
static void __cpuinit generic_identify(struct cpuinfo_x86 *c)
|
||||||
|
@ -395,8 +425,8 @@ static void __cpuinit generic_identify(struct cpuinfo_x86 *c)
|
||||||
}
|
}
|
||||||
|
|
||||||
init_scattered_cpuid_features(c);
|
init_scattered_cpuid_features(c);
|
||||||
|
detect_nopl(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __cpuinit squash_the_stupid_serial_number(struct cpuinfo_x86 *c)
|
static void __cpuinit squash_the_stupid_serial_number(struct cpuinfo_x86 *c)
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include <asm/mtrr.h>
|
#include <asm/mtrr.h>
|
||||||
#include <asm/mce.h>
|
#include <asm/mce.h>
|
||||||
#include <asm/pat.h>
|
#include <asm/pat.h>
|
||||||
|
#include <asm/asm.h>
|
||||||
#include <asm/numa.h>
|
#include <asm/numa.h>
|
||||||
#ifdef CONFIG_X86_LOCAL_APIC
|
#ifdef CONFIG_X86_LOCAL_APIC
|
||||||
#include <asm/mpspec.h>
|
#include <asm/mpspec.h>
|
||||||
|
@ -215,6 +216,39 @@ static void __init early_cpu_support_print(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The NOPL instruction is supposed to exist on all CPUs with
|
||||||
|
* family >= 6, unfortunately, that's not true in practice because
|
||||||
|
* of early VIA chips and (more importantly) broken virtualizers that
|
||||||
|
* are not easy to detect. Hence, probe for it based on first
|
||||||
|
* principles.
|
||||||
|
*
|
||||||
|
* Note: no 64-bit chip is known to lack these, but put the code here
|
||||||
|
* for consistency with 32 bits, and to make it utterly trivial to
|
||||||
|
* diagnose the problem should it ever surface.
|
||||||
|
*/
|
||||||
|
static void __cpuinit detect_nopl(struct cpuinfo_x86 *c)
|
||||||
|
{
|
||||||
|
const u32 nopl_signature = 0x888c53b1; /* Random number */
|
||||||
|
u32 has_nopl = nopl_signature;
|
||||||
|
|
||||||
|
clear_cpu_cap(c, X86_FEATURE_NOPL);
|
||||||
|
if (c->x86 >= 6) {
|
||||||
|
asm volatile("\n"
|
||||||
|
"1: .byte 0x0f,0x1f,0xc0\n" /* nopl %eax */
|
||||||
|
"2:\n"
|
||||||
|
" .section .fixup,\"ax\"\n"
|
||||||
|
"3: xor %0,%0\n"
|
||||||
|
" jmp 2b\n"
|
||||||
|
" .previous\n"
|
||||||
|
_ASM_EXTABLE(1b,3b)
|
||||||
|
: "+a" (has_nopl));
|
||||||
|
|
||||||
|
if (has_nopl == nopl_signature)
|
||||||
|
set_cpu_cap(c, X86_FEATURE_NOPL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void __cpuinit early_identify_cpu(struct cpuinfo_x86 *c);
|
static void __cpuinit early_identify_cpu(struct cpuinfo_x86 *c);
|
||||||
|
|
||||||
void __init early_cpu_init(void)
|
void __init early_cpu_init(void)
|
||||||
|
@ -313,6 +347,8 @@ static void __cpuinit early_identify_cpu(struct cpuinfo_x86 *c)
|
||||||
c->x86_phys_bits = eax & 0xff;
|
c->x86_phys_bits = eax & 0xff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
detect_nopl(c);
|
||||||
|
|
||||||
if (c->x86_vendor != X86_VENDOR_UNKNOWN &&
|
if (c->x86_vendor != X86_VENDOR_UNKNOWN &&
|
||||||
cpu_devs[c->x86_vendor]->c_early_init)
|
cpu_devs[c->x86_vendor]->c_early_init)
|
||||||
cpu_devs[c->x86_vendor]->c_early_init(c);
|
cpu_devs[c->x86_vendor]->c_early_init(c);
|
||||||
|
@ -493,17 +529,20 @@ void pda_init(int cpu)
|
||||||
/* others are initialized in smpboot.c */
|
/* others are initialized in smpboot.c */
|
||||||
pda->pcurrent = &init_task;
|
pda->pcurrent = &init_task;
|
||||||
pda->irqstackptr = boot_cpu_stack;
|
pda->irqstackptr = boot_cpu_stack;
|
||||||
|
pda->irqstackptr += IRQSTACKSIZE - 64;
|
||||||
} else {
|
} else {
|
||||||
pda->irqstackptr = (char *)
|
if (!pda->irqstackptr) {
|
||||||
__get_free_pages(GFP_ATOMIC, IRQSTACK_ORDER);
|
pda->irqstackptr = (char *)
|
||||||
if (!pda->irqstackptr)
|
__get_free_pages(GFP_ATOMIC, IRQSTACK_ORDER);
|
||||||
panic("cannot allocate irqstack for cpu %d", cpu);
|
if (!pda->irqstackptr)
|
||||||
|
panic("cannot allocate irqstack for cpu %d",
|
||||||
|
cpu);
|
||||||
|
pda->irqstackptr += IRQSTACKSIZE - 64;
|
||||||
|
}
|
||||||
|
|
||||||
if (pda->nodenumber == 0 && cpu_to_node(cpu) != NUMA_NO_NODE)
|
if (pda->nodenumber == 0 && cpu_to_node(cpu) != NUMA_NO_NODE)
|
||||||
pda->nodenumber = cpu_to_node(cpu);
|
pda->nodenumber = cpu_to_node(cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
pda->irqstackptr += IRQSTACKSIZE-64;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char boot_exception_stacks[(N_EXCEPTION_STACKS - 1) * EXCEPTION_STKSZ +
|
char boot_exception_stacks[(N_EXCEPTION_STACKS - 1) * EXCEPTION_STKSZ +
|
||||||
|
@ -601,19 +640,22 @@ void __cpuinit cpu_init(void)
|
||||||
/*
|
/*
|
||||||
* set up and load the per-CPU TSS
|
* set up and load the per-CPU TSS
|
||||||
*/
|
*/
|
||||||
for (v = 0; v < N_EXCEPTION_STACKS; v++) {
|
if (!orig_ist->ist[0]) {
|
||||||
static const unsigned int order[N_EXCEPTION_STACKS] = {
|
static const unsigned int order[N_EXCEPTION_STACKS] = {
|
||||||
[0 ... N_EXCEPTION_STACKS - 1] = EXCEPTION_STACK_ORDER,
|
[0 ... N_EXCEPTION_STACKS - 1] = EXCEPTION_STACK_ORDER,
|
||||||
[DEBUG_STACK - 1] = DEBUG_STACK_ORDER
|
[DEBUG_STACK - 1] = DEBUG_STACK_ORDER
|
||||||
};
|
};
|
||||||
if (cpu) {
|
for (v = 0; v < N_EXCEPTION_STACKS; v++) {
|
||||||
estacks = (char *)__get_free_pages(GFP_ATOMIC, order[v]);
|
if (cpu) {
|
||||||
if (!estacks)
|
estacks = (char *)__get_free_pages(GFP_ATOMIC, order[v]);
|
||||||
panic("Cannot allocate exception stack %ld %d\n",
|
if (!estacks)
|
||||||
v, cpu);
|
panic("Cannot allocate exception "
|
||||||
|
"stack %ld %d\n", v, cpu);
|
||||||
|
}
|
||||||
|
estacks += PAGE_SIZE << order[v];
|
||||||
|
orig_ist->ist[v] = t->x86_tss.ist[v] =
|
||||||
|
(unsigned long)estacks;
|
||||||
}
|
}
|
||||||
estacks += PAGE_SIZE << order[v];
|
|
||||||
orig_ist->ist[v] = t->x86_tss.ist[v] = (unsigned long)estacks;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
t->x86_tss.io_bitmap_base = offsetof(struct tss_struct, io_bitmap);
|
t->x86_tss.io_bitmap_base = offsetof(struct tss_struct, io_bitmap);
|
||||||
|
|
|
@ -15,13 +15,11 @@
|
||||||
/*
|
/*
|
||||||
* Read NSC/Cyrix DEVID registers (DIR) to get more detailed info. about the CPU
|
* Read NSC/Cyrix DEVID registers (DIR) to get more detailed info. about the CPU
|
||||||
*/
|
*/
|
||||||
static void __cpuinit do_cyrix_devid(unsigned char *dir0, unsigned char *dir1)
|
static void __cpuinit __do_cyrix_devid(unsigned char *dir0, unsigned char *dir1)
|
||||||
{
|
{
|
||||||
unsigned char ccr2, ccr3;
|
unsigned char ccr2, ccr3;
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
/* we test for DEVID by checking whether CCR3 is writable */
|
/* we test for DEVID by checking whether CCR3 is writable */
|
||||||
local_irq_save(flags);
|
|
||||||
ccr3 = getCx86(CX86_CCR3);
|
ccr3 = getCx86(CX86_CCR3);
|
||||||
setCx86(CX86_CCR3, ccr3 ^ 0x80);
|
setCx86(CX86_CCR3, ccr3 ^ 0x80);
|
||||||
getCx86(0xc0); /* dummy to change bus */
|
getCx86(0xc0); /* dummy to change bus */
|
||||||
|
@ -44,9 +42,16 @@ static void __cpuinit do_cyrix_devid(unsigned char *dir0, unsigned char *dir1)
|
||||||
*dir0 = getCx86(CX86_DIR0);
|
*dir0 = getCx86(CX86_DIR0);
|
||||||
*dir1 = getCx86(CX86_DIR1);
|
*dir1 = getCx86(CX86_DIR1);
|
||||||
}
|
}
|
||||||
local_irq_restore(flags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void __cpuinit do_cyrix_devid(unsigned char *dir0, unsigned char *dir1)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
local_irq_save(flags);
|
||||||
|
__do_cyrix_devid(dir0, dir1);
|
||||||
|
local_irq_restore(flags);
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* Cx86_dir0_msb is a HACK needed by check_cx686_cpuid/slop in bugs.h in
|
* Cx86_dir0_msb is a HACK needed by check_cx686_cpuid/slop in bugs.h in
|
||||||
* order to identify the Cyrix CPU model after we're out of setup.c
|
* order to identify the Cyrix CPU model after we're out of setup.c
|
||||||
|
@ -161,6 +166,24 @@ static void __cpuinit geode_configure(void)
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void __cpuinit early_init_cyrix(struct cpuinfo_x86 *c)
|
||||||
|
{
|
||||||
|
unsigned char dir0, dir0_msn, dir1 = 0;
|
||||||
|
|
||||||
|
__do_cyrix_devid(&dir0, &dir1);
|
||||||
|
dir0_msn = dir0 >> 4; /* identifies CPU "family" */
|
||||||
|
|
||||||
|
switch (dir0_msn) {
|
||||||
|
case 3: /* 6x86/6x86L */
|
||||||
|
/* Emulate MTRRs using Cyrix's ARRs. */
|
||||||
|
set_cpu_cap(c, X86_FEATURE_CYRIX_ARR);
|
||||||
|
break;
|
||||||
|
case 5: /* 6x86MX/M II */
|
||||||
|
/* Emulate MTRRs using Cyrix's ARRs. */
|
||||||
|
set_cpu_cap(c, X86_FEATURE_CYRIX_ARR);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void __cpuinit init_cyrix(struct cpuinfo_x86 *c)
|
static void __cpuinit init_cyrix(struct cpuinfo_x86 *c)
|
||||||
{
|
{
|
||||||
|
@ -416,6 +439,7 @@ static void __cpuinit cyrix_identify(struct cpuinfo_x86 *c)
|
||||||
static struct cpu_dev cyrix_cpu_dev __cpuinitdata = {
|
static struct cpu_dev cyrix_cpu_dev __cpuinitdata = {
|
||||||
.c_vendor = "Cyrix",
|
.c_vendor = "Cyrix",
|
||||||
.c_ident = { "CyrixInstead" },
|
.c_ident = { "CyrixInstead" },
|
||||||
|
.c_early_init = early_init_cyrix,
|
||||||
.c_init = init_cyrix,
|
.c_init = init_cyrix,
|
||||||
.c_identify = cyrix_identify,
|
.c_identify = cyrix_identify,
|
||||||
};
|
};
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue