mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-26 03:40:55 +07:00
Merge branch 'at91' into devel
This commit is contained in:
commit
9e165acf1b
@ -144,8 +144,8 @@ prototypes:
|
||||
void (*kill_sb) (struct super_block *);
|
||||
locking rules:
|
||||
may block BKL
|
||||
get_sb yes yes
|
||||
kill_sb yes yes
|
||||
get_sb yes no
|
||||
kill_sb yes no
|
||||
|
||||
->get_sb() returns error or 0 with locked superblock attached to the vfsmount
|
||||
(exclusive on ->s_umount).
|
||||
@ -409,12 +409,12 @@ ioctl: yes (see below)
|
||||
unlocked_ioctl: no (see below)
|
||||
compat_ioctl: no
|
||||
mmap: no
|
||||
open: maybe (see below)
|
||||
open: no
|
||||
flush: no
|
||||
release: no
|
||||
fsync: no (see below)
|
||||
aio_fsync: no
|
||||
fasync: yes (see below)
|
||||
fasync: no
|
||||
lock: yes
|
||||
readv: 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
|
||||
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
|
||||
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
|
||||
|
@ -44,7 +44,7 @@ detailed description):
|
||||
- LCD brightness control
|
||||
- Volume control
|
||||
- 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
|
||||
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).
|
||||
|
||||
|
||||
EXPERIMENTAL: WAN
|
||||
-----------------
|
||||
WAN
|
||||
---
|
||||
|
||||
procfs: /proc/acpi/ibm/wan
|
||||
sysfs device attribute: wwan_enable (deprecated)
|
||||
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
|
||||
Wireless EV-DO) device.
|
||||
|
||||
|
@ -3,3 +3,4 @@
|
||||
2 -> Hauppauge HVR850 (au0828) [2040:7240]
|
||||
3 -> DViCO FusionHDTV USB (au0828) [0fe9:d620]
|
||||
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
|
||||
sonixj 0471:0327 Philips SPC 600 NC
|
||||
sonixj 0471:0328 Philips SPC 700 NC
|
||||
zc3xx 0471:032d Philips spc210nc
|
||||
zc3xx 0471:032e Philips spc315nc
|
||||
sonixj 0471:0330 Philips SPC 710NC
|
||||
zc3xx 0471:032d Philips SPC 210 NC
|
||||
zc3xx 0471:032e Philips SPC 315 NC
|
||||
sonixj 0471:0330 Philips SPC 710 NC
|
||||
spca501 0497:c001 Smile International
|
||||
sunplus 04a5:3003 Benq DC 1300
|
||||
sunplus 04a5:3008 Benq DC 1500
|
||||
sunplus 04a5:300a Benq DC3410
|
||||
spca500 04a5:300c Benq DC1016
|
||||
sunplus 04a5:300a Benq DC 3410
|
||||
spca500 04a5:300c Benq DC 1016
|
||||
sunplus 04f1:1001 JVC GC A50
|
||||
spca561 04fc:0561 Flexcam 100
|
||||
sunplus 04fc:500c Sunplus CA500C
|
||||
@ -175,19 +175,21 @@ sunplus 08ca:2060 Aiptek PocketDV5300
|
||||
tv8532 0923:010f ICM532 cams
|
||||
mars 093a:050f Mars-Semi Pc-Camera
|
||||
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:2468 PAC207
|
||||
pac207 093a:2470 Genius GF112
|
||||
pac207 093a:2471 PAC207 Genius VideoCam ge111
|
||||
pac207 093a:2472 PAC207 Genius VideoCam ge110
|
||||
pac207 093a:2471 Genius VideoCam ge111
|
||||
pac207 093a:2472 Genius VideoCam ge110
|
||||
pac7311 093a:2600 PAC7311 Typhoon
|
||||
pac7311 093a:2601 PAC7311 Phillips SPC610NC
|
||||
pac7311 093a:2601 Philips SPC 610 NC
|
||||
pac7311 093a:2603 PAC7312
|
||||
pac7311 093a:2608 PAC7311 Trust WB-3300p
|
||||
pac7311 093a:260e PAC7311 Gigaware VGA PC Camera, Trust WB-3350p, SIGMA cam 2350
|
||||
pac7311 093a:260f PAC7311 SnakeCam
|
||||
pac7311 093a:2608 Trust WB-3300p
|
||||
pac7311 093a:260e Gigaware VGA PC Camera, Trust WB-3350p, SIGMA cam 2350
|
||||
pac7311 093a:260f SnakeCam
|
||||
pac7311 093a:2621 PAC731x
|
||||
pac7311 093a:2624 PAC7302
|
||||
pac7311 093a:2626 Labtec 2200
|
||||
zc3xx 0ac8:0302 Z-star Vimicro zc0302
|
||||
vc032x 0ac8:0321 Vimicro generic vc0321
|
||||
vc032x 0ac8:0323 Vimicro Vc0323
|
||||
@ -220,6 +222,7 @@ sonixj 0c45:60c0 Sangha Sn535
|
||||
sonixj 0c45:60ec SN9C105+MO4000
|
||||
sonixj 0c45:60fb Surfer NoName
|
||||
sonixj 0c45:60fc LG-LIC300
|
||||
sonixj 0c45:6128 Microdia/Sonix SNP325
|
||||
sonixj 0c45:612a Avant Camera
|
||||
sonixj 0c45:612c Typhoon Rasy Cam 1.3MPix
|
||||
sonixj 0c45:6130 Sonix Pccam
|
||||
@ -234,7 +237,7 @@ zc3xx 10fd:0128 Typhoon Webshot II USB 300k 0x0128
|
||||
spca561 10fd:7e50 FlyCam Usb 100
|
||||
zc3xx 10fd:8050 Typhoon Webshot II USB 300k
|
||||
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
|
||||
pac207 2001:f115 D-Link DSB-C120
|
||||
spca500 2899:012c Toptro Industrial
|
||||
|
15
MAINTAINERS
15
MAINTAINERS
@ -222,8 +222,7 @@ W: http://code.google.com/p/aceracpi
|
||||
S: Maintained
|
||||
|
||||
ACPI
|
||||
P: Andi Kleen
|
||||
M: ak@linux.intel.com
|
||||
P: Len Brown
|
||||
M: lenb@kernel.org
|
||||
L: linux-acpi@vger.kernel.org
|
||||
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)
|
||||
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
|
||||
P: Lennert Buytenhek
|
||||
M: kernel@wantstofly.org
|
||||
@ -751,11 +756,13 @@ P: Ville Syrjala
|
||||
M: syrjala@sci.fi
|
||||
S: Maintained
|
||||
|
||||
ATL1 ETHERNET DRIVER
|
||||
ATLX ETHERNET DRIVERS
|
||||
P: Jay Cliburn
|
||||
M: jcliburn@gmail.com
|
||||
P: Chris Snook
|
||||
M: csnook@redhat.com
|
||||
P: Jie Yang
|
||||
M: jie.yang@atheros.com
|
||||
L: atl1-devel@lists.sourceforge.net
|
||||
W: http://sourceforge.net/projects/atl1
|
||||
W: http://atl1.sourceforge.net
|
||||
@ -1594,7 +1601,7 @@ S: Supported
|
||||
EMBEDDED LINUX
|
||||
P: Paul Gortmaker
|
||||
M: paul.gortmaker@windriver.com
|
||||
P David Woodhouse
|
||||
P: David Woodhouse
|
||||
M: dwmw2@infradead.org
|
||||
L: linux-embedded@vger.kernel.org
|
||||
S: Maintained
|
||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 27
|
||||
EXTRAVERSION = -rc5
|
||||
EXTRAVERSION = -rc6
|
||||
NAME = Rotary Wombat
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
1259
arch/arm/configs/afeb9260_defconfig
Normal file
1259
arch/arm/configs/afeb9260_defconfig
Normal file
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_TOUCHRIGHT is not set
|
||||
# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
|
||||
CONFIG_TOUCHSCREEN_ATMEL_TSADCC=y
|
||||
# CONFIG_TOUCHSCREEN_UCB1400 is not set
|
||||
# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
|
||||
# CONFIG_INPUT_MISC is not set
|
||||
|
@ -18,15 +18,7 @@
|
||||
#include <linux/compiler.h>
|
||||
#include <asm/types.h>
|
||||
|
||||
#ifdef __ARMEB__
|
||||
# define __BIG_ENDIAN
|
||||
#else
|
||||
# define __LITTLE_ENDIAN
|
||||
#endif
|
||||
|
||||
#define __SWAB_64_THRU_32__
|
||||
|
||||
static inline __attribute_const__ __u32 __arch_swab32(__u32 x)
|
||||
static inline __attribute_const__ __u32 ___arch__swab32(__u32 x)
|
||||
{
|
||||
__u32 t;
|
||||
|
||||
@ -48,8 +40,19 @@ static inline __attribute_const__ __u32 __arch_swab32(__u32 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
|
||||
|
||||
|
@ -175,6 +175,15 @@ config MACH_SAM9_L9260
|
||||
Select this if you are using Olimex's SAM9-L9260 board based on the Atmel AT91SAM9260.
|
||||
<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
|
||||
bool "CALAO USB-A9260"
|
||||
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
|
||||
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
|
||||
int "Kernel HZ (jiffies per second)"
|
||||
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_USB_A9260) += board-usb-a9260.o
|
||||
obj-$(CONFIG_MACH_QIL_A9260) += board-qil-a9260.o
|
||||
obj-$(CONFIG_MACH_AFEB9260) += board-afeb-9260v1.o
|
||||
|
||||
# AT91SAM9261 board-specific support
|
||||
obj-$(CONFIG_MACH_AT91SAM9261EK) += board-sam9261ek.o
|
||||
@ -64,6 +65,7 @@ obj-y += leds.o
|
||||
|
||||
# Power Management
|
||||
obj-$(CONFIG_PM) += pm.o
|
||||
obj-$(CONFIG_AT91_SLOW_CLOCK) += pm_slowclock.o
|
||||
|
||||
ifeq ($(CONFIG_PM_DEBUG),y)
|
||||
CFLAGS_pm.o += -DDEBUG
|
||||
|
@ -141,8 +141,8 @@ static struct clk tcb_clk = {
|
||||
.pmc_mask = 1 << AT91CAP9_ID_TCB,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk pwmc_clk = {
|
||||
.name = "pwmc_clk",
|
||||
static struct clk pwm_clk = {
|
||||
.name = "pwm_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_PWMC,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
@ -207,7 +207,7 @@ static struct clk *periph_clocks[] __initdata = {
|
||||
&ssc1_clk,
|
||||
&ac97_clk,
|
||||
&tcb_clk,
|
||||
&pwmc_clk,
|
||||
&pwm_clk,
|
||||
&macb_clk,
|
||||
&aestdes_clk,
|
||||
&adc_clk,
|
||||
|
@ -718,6 +718,60 @@ static void __init at91_add_device_watchdog(void) {}
|
||||
#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
|
||||
* -------------------------------------------------------------------- */
|
||||
|
@ -129,8 +129,8 @@ static struct clk tcb_clk = {
|
||||
.pmc_mask = 1 << AT91SAM9263_ID_TCB,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk pwmc_clk = {
|
||||
.name = "pwmc_clk",
|
||||
static struct clk pwm_clk = {
|
||||
.name = "pwm_clk",
|
||||
.pmc_mask = 1 << AT91SAM9263_ID_PWMC,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
@ -187,7 +187,7 @@ static struct clk *periph_clocks[] __initdata = {
|
||||
&ssc1_clk,
|
||||
&ac97_clk,
|
||||
&tcb_clk,
|
||||
&pwmc_clk,
|
||||
&pwm_clk,
|
||||
&macb_clk,
|
||||
&twodge_clk,
|
||||
&udc_clk,
|
||||
|
@ -885,6 +885,59 @@ static void __init at91_add_device_watchdog(void) {}
|
||||
#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
|
||||
* -------------------------------------------------------------------- */
|
||||
|
@ -131,8 +131,8 @@ static struct clk tc2_clk = {
|
||||
.pmc_mask = 1 << AT91SAM9RL_ID_TC2,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk pwmc_clk = {
|
||||
.name = "pwmc_clk",
|
||||
static struct clk pwm_clk = {
|
||||
.name = "pwm_clk",
|
||||
.pmc_mask = 1 << AT91SAM9RL_ID_PWMC,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
@ -180,7 +180,7 @@ static struct clk *periph_clocks[] __initdata = {
|
||||
&tc0_clk,
|
||||
&tc1_clk,
|
||||
&tc2_clk,
|
||||
&pwmc_clk,
|
||||
&pwm_clk,
|
||||
&tsc_clk,
|
||||
&dma_clk,
|
||||
&udphs_clk,
|
||||
|
@ -526,6 +526,51 @@ static void __init at91_add_device_tc(void) { }
|
||||
#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
|
||||
* -------------------------------------------------------------------- */
|
||||
@ -591,6 +636,59 @@ static void __init at91_add_device_watchdog(void) {}
|
||||
#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
|
||||
* -------------------------------------------------------------------- */
|
||||
|
210
arch/arm/mach-at91/board-afeb-9260v1.c
Normal file
210
arch/arm/mach-at91/board-afeb-9260v1.c
Normal file
@ -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_SIZE 0x800000
|
||||
#define NOR_SIZE SZ_8M
|
||||
|
||||
static struct resource nor_flash_resources[] = {
|
||||
{
|
||||
|
@ -25,7 +25,6 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/irq.h>
|
||||
@ -34,6 +33,7 @@
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/board.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)
|
||||
{
|
||||
/* Serial */
|
||||
@ -132,6 +156,8 @@ static void __init carmeva_board_init(void)
|
||||
// at91_add_device_cf(&carmeva_cf_data);
|
||||
/* MMC */
|
||||
at91_add_device_mmc(0, &carmeva_mmc_data);
|
||||
/* LEDs */
|
||||
at91_gpio_leds(carmeva_leds, ARRAY_SIZE(carmeva_leds));
|
||||
}
|
||||
|
||||
MACHINE_START(CARMEVA, "Carmeva")
|
||||
|
@ -28,7 +28,6 @@
|
||||
#include <linux/input.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/irq.h>
|
||||
@ -37,6 +36,7 @@
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/board.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_SIZE 0x800000
|
||||
#define CSB_FLASH_SIZE SZ_8M
|
||||
|
||||
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)
|
||||
{
|
||||
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_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_gpio_input(AT91_PIN_PA21, 0); /* sw2 */
|
||||
at91_set_gpio_input(AT91_PIN_PA21, 1); /* sw2 */
|
||||
at91_set_deglitch(AT91_PIN_PA21, 1);
|
||||
|
||||
platform_device_register(&csb300_button_device);
|
||||
@ -224,7 +224,7 @@ static struct gpio_led csb_leds[] = {
|
||||
.gpio = AT91_PIN_PB0,
|
||||
.active_low = 1,
|
||||
.default_trigger = "ide-disk",
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
@ -25,7 +25,6 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/irq.h>
|
||||
@ -34,6 +33,7 @@
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/board.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_SIZE 0x1000000
|
||||
#define CSB_FLASH_SIZE SZ_16M
|
||||
|
||||
static struct mtd_partition csb_flash_partitions[] = {
|
||||
{
|
||||
|
@ -29,7 +29,6 @@
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/irq.h>
|
||||
@ -38,6 +37,7 @@
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/board.h>
|
||||
#include <mach/gpio.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_SIZE 0x200000
|
||||
#define DK_FLASH_SIZE SZ_2M
|
||||
|
||||
static struct physmap_flash_data dk_flash_data = {
|
||||
.width = 2,
|
||||
|
@ -86,7 +86,7 @@ static struct mtd_partition __initdata my_flash0_partitions[] =
|
||||
{ /* 0x8400 */
|
||||
.name = "Darrell-loader",
|
||||
.offset = 0,
|
||||
.size = 12* 1056,
|
||||
.size = 12 * 1056,
|
||||
},
|
||||
{
|
||||
.name = "U-boot",
|
||||
|
@ -29,7 +29,6 @@
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/irq.h>
|
||||
@ -38,6 +37,7 @@
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/board.h>
|
||||
#include <mach/gpio.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_SIZE 0x200000
|
||||
#define EK_FLASH_SIZE SZ_2M
|
||||
|
||||
static struct physmap_flash_data ek_flash_data = {
|
||||
.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_SIZE 0x400000
|
||||
#define PICOTUX200_FLASH_SIZE SZ_4M
|
||||
|
||||
static struct physmap_flash_data picotux200_flash_data = {
|
||||
.width = 2,
|
||||
|
@ -30,7 +30,6 @@
|
||||
#include <linux/input.h>
|
||||
#include <linux/clk.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/irq.h>
|
||||
@ -39,6 +38,7 @@
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/board.h>
|
||||
#include <mach/gpio.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[] = {
|
||||
{
|
||||
.name = "Uboot & Kernel",
|
||||
.offset = 0x00000000,
|
||||
.size = 16 * 1024 * 1024,
|
||||
.offset = 0,
|
||||
.size = SZ_16M,
|
||||
},
|
||||
{
|
||||
.name = "Root FS",
|
||||
.offset = 0x01000000,
|
||||
.size = 120 * 1024 * 1024,
|
||||
.offset = MTDPART_OFS_NXTBLK,
|
||||
.size = 120 * SZ_1M,
|
||||
},
|
||||
{
|
||||
.name = "FS",
|
||||
.offset = 0x08800000,
|
||||
.size = 120 * 1024 * 1024,
|
||||
.offset = MTDPART_OFS_NXTBLK,
|
||||
.size = 120 * SZ_1M,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -126,11 +126,11 @@ static struct mtd_partition __initdata ek_nand_partition[] = {
|
||||
{
|
||||
.name = "Bootloader Area",
|
||||
.offset = 0,
|
||||
.size = 10 * 1024 * 1024,
|
||||
.size = 10 * SZ_1M,
|
||||
},
|
||||
{
|
||||
.name = "User Area",
|
||||
.offset = 10 * 1024 * 1024,
|
||||
.offset = MTDPART_OFS_NXTBLK,
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
},
|
||||
};
|
||||
|
@ -27,8 +27,10 @@
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/at73c213.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/mach-types.h>
|
||||
#include <asm/irq.h>
|
||||
@ -37,6 +39,7 @@
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/board.h>
|
||||
#include <mach/gpio.h>
|
||||
|
||||
@ -163,11 +166,11 @@ static struct mtd_partition __initdata ek_nand_partition[] = {
|
||||
{
|
||||
.name = "Partition 1",
|
||||
.offset = 0,
|
||||
.size = 256 * 1024,
|
||||
.size = SZ_256K,
|
||||
},
|
||||
{
|
||||
.name = "Partition 2",
|
||||
.offset = 256 * 1024,
|
||||
.offset = MTDPART_OFS_NXTBLK,
|
||||
.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)
|
||||
{
|
||||
/* Serial */
|
||||
@ -239,12 +309,14 @@ static void __init ek_board_init(void)
|
||||
/* MMC */
|
||||
at91_add_device_mmc(0, &ek_mmc_data);
|
||||
/* I2C */
|
||||
at91_add_device_i2c(NULL, 0);
|
||||
at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices));
|
||||
/* SSC (to AT73C213) */
|
||||
at73c213_set_clk(&at73c213_data);
|
||||
at91_add_device_ssc(AT91SAM9260_ID_SSC, ATMEL_SSC_TX);
|
||||
/* LEDs */
|
||||
at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
|
||||
/* Push Buttons */
|
||||
ek_add_device_buttons();
|
||||
}
|
||||
|
||||
MACHINE_START(AT91SAM9260EK, "Atmel AT91SAM9260-EK")
|
||||
|
@ -35,7 +35,6 @@
|
||||
|
||||
#include <video/atmel_lcdc.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/irq.h>
|
||||
@ -44,6 +43,7 @@
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/board.h>
|
||||
#include <mach/gpio.h>
|
||||
#include <mach/at91sam9_smc.h>
|
||||
@ -168,11 +168,11 @@ static struct mtd_partition __initdata ek_nand_partition[] = {
|
||||
{
|
||||
.name = "Partition 1",
|
||||
.offset = 0,
|
||||
.size = 256 * 1024,
|
||||
.size = SZ_256K,
|
||||
},
|
||||
{
|
||||
.name = "Partition 2",
|
||||
.offset = 256 * 1024 ,
|
||||
.offset = MTDPART_OFS_NXTBLK,
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
},
|
||||
};
|
||||
@ -435,24 +435,28 @@ static struct gpio_keys_button ek_buttons[] = {
|
||||
.code = BTN_0,
|
||||
.desc = "Button 0",
|
||||
.active_low = 1,
|
||||
.wakeup = 1,
|
||||
},
|
||||
{
|
||||
.gpio = AT91_PIN_PA26,
|
||||
.code = BTN_1,
|
||||
.desc = "Button 1",
|
||||
.active_low = 1,
|
||||
.wakeup = 1,
|
||||
},
|
||||
{
|
||||
.gpio = AT91_PIN_PA25,
|
||||
.code = BTN_2,
|
||||
.desc = "Button 2",
|
||||
.active_low = 1,
|
||||
.wakeup = 1,
|
||||
},
|
||||
{
|
||||
.gpio = AT91_PIN_PA24,
|
||||
.code = BTN_3,
|
||||
.desc = "Button 3",
|
||||
.active_low = 1,
|
||||
.wakeup = 1,
|
||||
}
|
||||
};
|
||||
|
||||
@ -472,13 +476,13 @@ static struct platform_device ek_button_device = {
|
||||
|
||||
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_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_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_gpio_input(AT91_PIN_PA24, 0); /* btn3 */
|
||||
at91_set_gpio_input(AT91_PIN_PA24, 1); /* btn3 */
|
||||
at91_set_deglitch(AT91_PIN_PA24, 1);
|
||||
|
||||
platform_device_register(&ek_button_device);
|
||||
|
@ -26,13 +26,14 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/ads7846.h>
|
||||
#include <linux/i2c/at24.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/leds.h>
|
||||
|
||||
#include <video/atmel_lcdc.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/irq.h>
|
||||
@ -41,6 +42,7 @@
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/board.h>
|
||||
#include <mach/gpio.h>
|
||||
#include <mach/at91sam9_smc.h>
|
||||
@ -172,11 +174,11 @@ static struct mtd_partition __initdata ek_nand_partition[] = {
|
||||
{
|
||||
.name = "Partition 1",
|
||||
.offset = 0,
|
||||
.size = 64 * 1024 * 1024,
|
||||
.size = SZ_64M,
|
||||
},
|
||||
{
|
||||
.name = "Partition 2",
|
||||
.offset = 64 * 1024 * 1024,
|
||||
.offset = MTDPART_OFS_NXTBLK,
|
||||
.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
|
||||
*/
|
||||
#if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE)
|
||||
static struct fb_videomode at91_tft_vga_modes[] = {
|
||||
{
|
||||
.name = "TX09D50VM1CCA @ 60",
|
||||
.name = "TX09D50VM1CCA @ 60",
|
||||
.refresh = 60,
|
||||
.xres = 240, .yres = 320,
|
||||
.pixclock = KHZ2PICOS(4965),
|
||||
@ -224,7 +244,7 @@ static struct fb_videomode at91_tft_vga_modes[] = {
|
||||
|
||||
static struct fb_monspecs at91fb_default_monspecs = {
|
||||
.manufacturer = "HIT",
|
||||
.monitor = "TX09D70VM1CCA",
|
||||
.monitor = "TX09D70VM1CCA",
|
||||
|
||||
.modedb = 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 \
|
||||
| ATMEL_LCDC_DISTYPE_TFT \
|
||||
| ATMEL_LCDC_DISTYPE_TFT \
|
||||
| ATMEL_LCDC_CLKMOD_ALWAYSACTIVE)
|
||||
|
||||
static void at91_lcdc_power_control(int on)
|
||||
@ -277,7 +297,7 @@ static struct gpio_keys_button ek_buttons[] = {
|
||||
.active_low = 1,
|
||||
.desc = "right_click",
|
||||
.wakeup = 1,
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
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)
|
||||
{
|
||||
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_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);
|
||||
|
||||
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
|
||||
*/
|
||||
static struct gpio_led ek_leds[] = {
|
||||
{ /* "left" led, green, userled1, pwm1 */
|
||||
.name = "ds1",
|
||||
.gpio = AT91_PIN_PB8,
|
||||
.active_low = 1,
|
||||
.default_trigger = "mmc0",
|
||||
},
|
||||
{ /* "right" led, green, userled2, pwm2 */
|
||||
{ /* "right" led, green, userled2 (could be driven by pwm2) */
|
||||
.name = "ds2",
|
||||
.gpio = AT91_PIN_PC29,
|
||||
.active_low = 1,
|
||||
.default_trigger = "nand-disk",
|
||||
},
|
||||
{ /* "power" led, yellow, pwm0 */
|
||||
{ /* "power" led, yellow (could be driven by pwm0) */
|
||||
.name = "ds3",
|
||||
.gpio = AT91_PIN_PB7,
|
||||
.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)
|
||||
{
|
||||
@ -360,7 +387,7 @@ static void __init ek_board_init(void)
|
||||
/* NAND */
|
||||
at91_add_device_nand(&ek_nand_data);
|
||||
/* I2C */
|
||||
at91_add_device_i2c(NULL, 0);
|
||||
at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices));
|
||||
/* LCD Controller */
|
||||
at91_add_device_lcdc(&ek_lcdc_data);
|
||||
/* Push Buttons */
|
||||
@ -369,6 +396,7 @@ static void __init ek_board_init(void)
|
||||
at91_add_device_ac97(&ek_ac97_data);
|
||||
/* 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")
|
||||
|
@ -122,16 +122,16 @@ static struct mtd_partition __initdata ek_nand_partition[] = {
|
||||
{
|
||||
.name = "Bootstrap",
|
||||
.offset = 0,
|
||||
.size = 4 * 1024 * 1024,
|
||||
.size = 4 * SZ_1M,
|
||||
},
|
||||
{
|
||||
.name = "Partition 1",
|
||||
.offset = 4 * 1024 * 1024,
|
||||
.size = 60 * 1024 * 1024,
|
||||
.offset = MTDPART_OFS_NXTBLK,
|
||||
.size = 60 * SZ_1M,
|
||||
},
|
||||
{
|
||||
.name = "Partition 2",
|
||||
.offset = 64 * 1024 * 1024,
|
||||
.offset = MTDPART_OFS_NXTBLK,
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
},
|
||||
};
|
||||
|
@ -18,7 +18,6 @@
|
||||
|
||||
#include <video/atmel_lcdc.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/irq.h>
|
||||
@ -27,6 +26,7 @@
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/board.h>
|
||||
#include <mach/gpio.h>
|
||||
#include <mach/at91sam9_smc.h>
|
||||
@ -81,11 +81,11 @@ static struct mtd_partition __initdata ek_nand_partition[] = {
|
||||
{
|
||||
.name = "Partition 1",
|
||||
.offset = 0,
|
||||
.size = 256 * 1024,
|
||||
.size = SZ_256K,
|
||||
},
|
||||
{
|
||||
.name = "Partition 2",
|
||||
.offset = 256 * 1024 ,
|
||||
.offset = MTDPART_OFS_NXTBLK,
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
},
|
||||
};
|
||||
@ -195,6 +195,8 @@ static void __init ek_board_init(void)
|
||||
at91_add_device_mmc(0, &ek_mmc_data);
|
||||
/* LCD Controller */
|
||||
at91_add_device_lcdc(&ek_lcdc_data);
|
||||
/* Touch Screen Controller */
|
||||
at91_add_device_tsadcc();
|
||||
}
|
||||
|
||||
MACHINE_START(AT91SAM9RLEK, "Atmel AT91SAM9RL-EK")
|
||||
|
@ -30,7 +30,6 @@
|
||||
#include <linux/input.h>
|
||||
#include <linux/clk.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/irq.h>
|
||||
@ -39,6 +38,7 @@
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/board.h>
|
||||
#include <mach/gpio.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[] = {
|
||||
{
|
||||
.name = "Uboot & Kernel",
|
||||
.offset = 0x00000000,
|
||||
.size = 16 * 1024 * 1024,
|
||||
.offset = 0,
|
||||
.size = SZ_16M,
|
||||
},
|
||||
{
|
||||
.name = "Root FS",
|
||||
.offset = 0x01000000,
|
||||
.size = 120 * 1024 * 1024,
|
||||
.offset = MTDPART_OFS_NXTBLK,
|
||||
.size = 120 * SZ_1M,
|
||||
},
|
||||
{
|
||||
.name = "FS",
|
||||
.offset = 0x08800000,
|
||||
.size = 120 * 1024 * 1024,
|
||||
.offset = MTDPART_OFS_NXTBLK,
|
||||
.size = 120 * SZ_1M,
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -29,7 +29,6 @@
|
||||
#include <linux/gpio_keys.h>
|
||||
#include <linux/input.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/irq.h>
|
||||
@ -38,6 +37,7 @@
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/board.h>
|
||||
#include <mach/gpio.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[] = {
|
||||
{
|
||||
.name = "Linux Kernel",
|
||||
.offset = 0x00000000,
|
||||
.size = 16 * 1024 * 1024,
|
||||
.offset = 0,
|
||||
.size = SZ_16M,
|
||||
},
|
||||
{
|
||||
.name = "Root FS",
|
||||
.offset = 0x01000000,
|
||||
.size = 120 * 1024 * 1024,
|
||||
.offset = MTDPART_OFS_NXTBLK,
|
||||
.size = 120 * SZ_1M,
|
||||
},
|
||||
{
|
||||
.name = "FS",
|
||||
.offset = 0x08800000,
|
||||
.size = 120 * 1024 * 1024,
|
||||
.offset = MTDPART_OFS_NXTBLK,
|
||||
.size = 120 * SZ_1M,
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -33,7 +33,6 @@
|
||||
#include <linux/gpio_keys.h>
|
||||
#include <linux/input.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/irq.h>
|
||||
@ -42,6 +41,7 @@
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/board.h>
|
||||
#include <mach/gpio.h>
|
||||
#include <mach/at91rm9200_mc.h>
|
||||
@ -150,27 +150,27 @@ static struct mtd_partition __initdata yl9200_nand_partition[] = {
|
||||
{
|
||||
.name = "AT91 NAND partition 1, boot",
|
||||
.offset = 0,
|
||||
.size = 1 * SZ_256K
|
||||
.size = SZ_256K
|
||||
},
|
||||
{
|
||||
.name = "AT91 NAND partition 2, kernel",
|
||||
.offset = 1 * SZ_256K,
|
||||
.size = 2 * SZ_1M - 1 * SZ_256K
|
||||
.offset = MTDPART_OFS_NXTBLK,
|
||||
.size = (2 * SZ_1M) - SZ_256K
|
||||
},
|
||||
{
|
||||
.name = "AT91 NAND partition 3, filesystem",
|
||||
.offset = 2 * SZ_1M,
|
||||
.offset = MTDPART_OFS_NXTBLK,
|
||||
.size = 14 * SZ_1M
|
||||
},
|
||||
{
|
||||
.name = "AT91 NAND partition 4, storage",
|
||||
.offset = 16 * SZ_1M,
|
||||
.size = 16 * SZ_1M
|
||||
.offset = MTDPART_OFS_NXTBLK,
|
||||
.size = SZ_16M
|
||||
},
|
||||
{
|
||||
.name = "AT91 NAND partition 5, ext-fs",
|
||||
.offset = 32 * SZ_1M,
|
||||
.size = 32 * SZ_1M
|
||||
.offset = MTDPART_OFS_NXTBLK,
|
||||
.size = SZ_32M
|
||||
}
|
||||
};
|
||||
|
||||
@ -193,24 +193,24 @@ static struct atmel_nand_data __initdata yl9200_nand_data = {
|
||||
* NOR Flash
|
||||
*/
|
||||
#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[] = {
|
||||
{
|
||||
.name = "Bootloader",
|
||||
.size = 0x00040000,
|
||||
.offset = 0,
|
||||
.size = SZ_256K,
|
||||
.mask_flags = MTD_WRITEABLE, /* force read-only */
|
||||
},
|
||||
{
|
||||
.name = "Kernel",
|
||||
.size = 0x001C0000,
|
||||
.offset = 0x00040000,
|
||||
.offset = MTDPART_OFS_NXTBLK,
|
||||
.size = (2 * SZ_1M) - SZ_256K
|
||||
},
|
||||
{
|
||||
.name = "Filesystem",
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
.offset = 0x00200000
|
||||
.offset = MTDPART_OFS_NXTBLK,
|
||||
.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)
|
||||
#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)
|
||||
{
|
||||
@ -516,29 +512,33 @@ static struct s1d13xxxfb_regval yl9200_s1dfb_initregs[] =
|
||||
{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 = {
|
||||
.initregs = yl9200_s1dfb_initregs,
|
||||
.initregssize = ARRAY_SIZE(yl9200_s1dfb_initregs),
|
||||
.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[] = {
|
||||
[0] = { /* video mem */
|
||||
.name = "s1d13xxxfb memory",
|
||||
.start = AT91_FB_VMEM_BASE,
|
||||
.end = AT91_FB_VMEM_BASE + AT91_FB_VMEM_SIZE -1,
|
||||
.start = YL9200_FB_VMEM_BASE,
|
||||
.end = YL9200_FB_VMEM_BASE + YL9200_FB_VMEM_SIZE -1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = { /* video registers */
|
||||
.name = "s1d13xxxfb registers",
|
||||
.start = AT91_FB_REG_BASE,
|
||||
.end = AT91_FB_REG_BASE + AT91_FB_REG_SIZE -1,
|
||||
.start = YL9200_FB_REG_BASE,
|
||||
.end = YL9200_FB_REG_BASE + SZ_512 -1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static u64 s1dfb_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device yl9200_s1dfb_device = {
|
||||
.name = "s1d13806fb",
|
||||
.id = -1,
|
||||
|
@ -1,6 +1,9 @@
|
||||
/*
|
||||
* 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.
|
||||
* Based on AT91SAM9261 datasheet revision D.
|
||||
*
|
||||
|
@ -1,6 +1,9 @@
|
||||
/*
|
||||
* 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.
|
||||
* Based on AT91SAM9261 datasheet revision D.
|
||||
*
|
||||
|
@ -1,6 +1,9 @@
|
||||
/*
|
||||
* 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.
|
||||
* Based on AT91SAM9261 datasheet revision D.
|
||||
*
|
||||
|
@ -1,6 +1,9 @@
|
||||
/*
|
||||
* 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.
|
||||
* Based on AT91SAM9261 datasheet revision D.
|
||||
*
|
||||
|
@ -1,6 +1,9 @@
|
||||
/*
|
||||
* 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.
|
||||
* Based on AT91SAM9261 datasheet revision D.
|
||||
*
|
||||
|
@ -1,6 +1,8 @@
|
||||
/*
|
||||
* arch/arm/mach-at91/include/mach/at91cap9_ddrsdr.h
|
||||
*
|
||||
* (C) 2008 Andrew Victor
|
||||
*
|
||||
* DDR/SDR Controller (DDRSDRC) - System peripherals registers.
|
||||
* Based on AT91CAP9 datasheet revision B.
|
||||
*
|
||||
|
@ -1,6 +1,8 @@
|
||||
/*
|
||||
* arch/arm/mach-at91/include/mach/at91sam9260_matrix.h
|
||||
*
|
||||
* Copyright (C) 2007 Atmel Corporation.
|
||||
*
|
||||
* Memory Controllers (MATRIX, EBI) - System peripherals registers.
|
||||
* Based on AT91SAM9260 datasheet revision B.
|
||||
*
|
||||
|
@ -1,6 +1,8 @@
|
||||
/*
|
||||
* arch/arm/mach-at91/include/mach/at91sam9261_matrix.h
|
||||
*
|
||||
* Copyright (C) 2007 Atmel Corporation.
|
||||
*
|
||||
* Memory Controllers (MATRIX, EBI) - System peripherals registers.
|
||||
* Based on AT91SAM9261 datasheet revision D.
|
||||
*
|
||||
|
@ -1,6 +1,9 @@
|
||||
/*
|
||||
* 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.
|
||||
* Based on AT91SAM9261 datasheet revision D.
|
||||
*
|
||||
|
@ -1,6 +1,9 @@
|
||||
/*
|
||||
* 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.
|
||||
* Based on AT91SAM9261 datasheet revision D.
|
||||
*
|
||||
|
@ -132,6 +132,16 @@ struct atmel_uart_data {
|
||||
};
|
||||
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
|
||||
* 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 */
|
||||
extern void __init at91_add_device_isi(void);
|
||||
|
||||
/* Touchscreen Controller */
|
||||
extern void __init at91_add_device_tsadcc(void);
|
||||
|
||||
/* LEDs */
|
||||
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_pwm_leds(struct gpio_led *leds, int nr);
|
||||
|
||||
/* FIXME: this needs a better location, but gets stuff building again */
|
||||
extern int at91_suspend_entering_slow_clock(void);
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <mach/board.h>
|
||||
#include <mach/gpio.h>
|
||||
@ -21,15 +22,13 @@
|
||||
|
||||
#if defined(CONFIG_NEW_LEDS)
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
/*
|
||||
* New cross-platform LED support.
|
||||
*/
|
||||
|
||||
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",
|
||||
.id = -1,
|
||||
.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.num_leds = nr;
|
||||
platform_device_register(&at91_leds);
|
||||
platform_device_register(&at91_gpio_leds_device);
|
||||
}
|
||||
|
||||
#else
|
||||
@ -55,6 +54,44 @@ void __init at91_gpio_leds(struct gpio_led *leds, int nr) {}
|
||||
#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)
|
||||
|
283
arch/arm/mach-at91/pm_slowclock.S
Normal file
283
arch/arm/mach-at91/pm_slowclock.S
Normal file
@ -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.
|
||||
*/
|
||||
|
||||
#include <linux/mm.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/thread_info.h>
|
||||
#include <linux/kbuild.h>
|
||||
|
||||
@ -17,4 +19,8 @@ void foo(void)
|
||||
OFFSET(TI_rar_saved, thread_info, rar_saved);
|
||||
OFFSET(TI_rsr_saved, thread_info, rsr_saved);
|
||||
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 */
|
||||
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
|
||||
stmts --sp, r0-lr
|
||||
rcall save_full_context_ex
|
||||
pushm r0-r12
|
||||
|
||||
/* 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
|
||||
mov r11, sp
|
||||
rcall do_critical_exception
|
||||
|
@ -134,7 +134,7 @@ pm_standby:
|
||||
mov r11, SDRAMC_LPR_LPCB_SELF_RFR
|
||||
bfins r10, r11, 0, 2 /* LPCB <- self Refresh */
|
||||
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]
|
||||
unmask_interrupts
|
||||
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_ivt_text[], __end_ivt_text[];
|
||||
|
||||
#undef dereference_function_descriptor
|
||||
void *dereference_function_descriptor(void *);
|
||||
|
||||
#endif /* _ASM_IA64_SECTIONS_H */
|
||||
|
||||
|
@ -31,9 +31,11 @@
|
||||
#include <linux/elf.h>
|
||||
#include <linux/moduleloader.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/vmalloc.h>
|
||||
|
||||
#include <asm/patch.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/unaligned.h>
|
||||
|
||||
#define ARCH_MODULE_DEBUG 0
|
||||
@ -941,3 +943,13 @@ module_arch_cleanup (struct module *mod)
|
||||
if (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"
|
||||
|
||||
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)"
|
||||
|
||||
config HW_HAS_EISA
|
||||
|
@ -160,30 +160,33 @@ early_param("rd_size", rd_size_early);
|
||||
static unsigned long __init init_initrd(void)
|
||||
{
|
||||
unsigned long end;
|
||||
u32 *initrd_header;
|
||||
|
||||
/*
|
||||
* Board specific code or command line parser should have
|
||||
* already set up initrd_start and initrd_end. In these cases
|
||||
* perfom sanity checks and use them if all looks good.
|
||||
*/
|
||||
if (initrd_start && initrd_end > initrd_start)
|
||||
goto sanitize;
|
||||
if (!initrd_start || initrd_end <= initrd_start) {
|
||||
#ifdef CONFIG_PROBE_INITRD_HEADER
|
||||
u32 *initrd_header;
|
||||
|
||||
/*
|
||||
* See if initrd has been added to the kernel image by
|
||||
* arch/mips/boot/addinitrd.c. In that case a header is
|
||||
* prepended to initrd and is made up by 8 bytes. The fisrt
|
||||
* word is a magic number and the second one is the size of
|
||||
* initrd. Initrd start must be page aligned in any cases.
|
||||
*/
|
||||
initrd_header = __va(PAGE_ALIGN(__pa_symbol(&_end) + 8)) - 8;
|
||||
if (initrd_header[0] != 0x494E5244)
|
||||
/*
|
||||
* See if initrd has been added to the kernel image by
|
||||
* arch/mips/boot/addinitrd.c. In that case a header is
|
||||
* 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
|
||||
* initrd. Initrd start must be page aligned in any cases.
|
||||
*/
|
||||
initrd_header = __va(PAGE_ALIGN(__pa_symbol(&_end) + 8)) - 8;
|
||||
if (initrd_header[0] != 0x494E5244)
|
||||
goto disable;
|
||||
initrd_start = (unsigned long)(initrd_header + 2);
|
||||
initrd_end = initrd_start + initrd_header[1];
|
||||
#else
|
||||
goto disable;
|
||||
initrd_start = (unsigned long)(initrd_header + 2);
|
||||
initrd_end = initrd_start + initrd_header[1];
|
||||
#endif
|
||||
}
|
||||
|
||||
sanitize:
|
||||
if (initrd_start & ~PAGE_MASK) {
|
||||
pr_err("initrd start must be page aligned\n");
|
||||
goto disable;
|
||||
|
@ -373,8 +373,8 @@ void __noreturn die(const char * str, const struct pt_regs * regs)
|
||||
do_exit(SIGSEGV);
|
||||
}
|
||||
|
||||
extern const struct exception_table_entry __start___dbe_table[];
|
||||
extern const struct exception_table_entry __stop___dbe_table[];
|
||||
extern struct exception_table_entry __start___dbe_table[];
|
||||
extern struct exception_table_entry __stop___dbe_table[];
|
||||
|
||||
__asm__(
|
||||
" .section __dbe_table, \"a\"\n"
|
||||
@ -1200,7 +1200,7 @@ void *set_except_vector(int n, void *addr)
|
||||
if (n == 0 && cpu_has_divec) {
|
||||
*(u32 *)(ebase + 0x200) = 0x08000000 |
|
||||
(0x03ffffff & (handler >> 2));
|
||||
flush_icache_range(ebase + 0x200, ebase + 0x204);
|
||||
local_flush_icache_range(ebase + 0x200, ebase + 0x204);
|
||||
}
|
||||
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 = (u32 *)(b + ori_offset);
|
||||
*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 {
|
||||
/*
|
||||
@ -1295,7 +1296,8 @@ static void *set_vi_srs_handler(int n, vi_handler_t addr, int srs)
|
||||
w = (u32 *)b;
|
||||
*w++ = 0x08000000 | (((u32)handler >> 2) & 0x03fffff); /* j handler */
|
||||
*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;
|
||||
@ -1515,7 +1517,7 @@ void __cpuinit per_cpu_trap_init(void)
|
||||
void __init set_handler(unsigned long offset, void *addr, unsigned long 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 =
|
||||
@ -1680,6 +1682,8 @@ void __init trap_init(void)
|
||||
signal32_init();
|
||||
#endif
|
||||
|
||||
flush_icache_range(ebase, ebase + 0x400);
|
||||
local_flush_icache_range(ebase, ebase + 0x400);
|
||||
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_page = r3k_flush_cache_page;
|
||||
flush_icache_range = r3k_flush_icache_range;
|
||||
local_flush_icache_range = r3k_flush_icache_range;
|
||||
|
||||
flush_cache_sigtramp = r3k_flush_cache_sigtramp;
|
||||
local_flush_data_cache_page = local_r3k_flush_data_cache_page;
|
||||
|
@ -543,12 +543,8 @@ struct flush_icache_range_args {
|
||||
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 (end - start >= dcache_size) {
|
||||
r4k_blast_dcache();
|
||||
@ -564,6 +560,15 @@ static inline void local_r4k_flush_icache_range(void *args)
|
||||
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)
|
||||
{
|
||||
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.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();
|
||||
}
|
||||
|
||||
@ -1375,6 +1380,7 @@ void __cpuinit r4k_cache_init(void)
|
||||
local_flush_data_cache_page = local_r4k_flush_data_cache_page;
|
||||
flush_data_cache_page = r4k_flush_data_cache_page;
|
||||
flush_icache_range = r4k_flush_icache_range;
|
||||
local_flush_icache_range = local_r4k_flush_icache_range;
|
||||
|
||||
#if defined(CONFIG_DMA_NONCOHERENT)
|
||||
if (coherentio) {
|
||||
|
@ -362,6 +362,7 @@ void __cpuinit tx39_cache_init(void)
|
||||
flush_cache_range = (void *) tx39h_flush_icache_all;
|
||||
flush_cache_page = (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;
|
||||
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_page = tx39_flush_cache_page;
|
||||
flush_icache_range = tx39_flush_icache_range;
|
||||
local_flush_icache_range = tx39_flush_icache_range;
|
||||
|
||||
flush_cache_sigtramp = tx39_flush_cache_sigtramp;
|
||||
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,
|
||||
unsigned long pfn);
|
||||
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_vunmap)(void);
|
||||
|
@ -1273,10 +1273,10 @@ void __cpuinit build_tlb_refill_handler(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));
|
||||
flush_icache_range((unsigned long)handle_tlbs,
|
||||
local_flush_icache_range((unsigned long)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));
|
||||
}
|
||||
|
@ -150,7 +150,7 @@ static int __init sgiseeq_devinit(void)
|
||||
return res;
|
||||
|
||||
/* Second HPC is missing? */
|
||||
if (!ip22_is_fullhouse() ||
|
||||
if (ip22_is_fullhouse() ||
|
||||
get_dbe(tmp, (unsigned int *)&hpc3c1->pbdma[1]))
|
||||
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_pcode = pcode;
|
||||
sprintf(txx9_pcode_str, "TX%x", pcode);
|
||||
if (base) {
|
||||
txx9_reg_res.start = base & 0xfffffffffULL;
|
||||
|
@ -47,7 +47,9 @@
|
||||
#include <linux/string.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
#include <asm/sections.h>
|
||||
#include <asm/unwind.h>
|
||||
|
||||
#if 0
|
||||
@ -860,3 +862,15 @@ void module_arch_cleanup(struct module *mod)
|
||||
deregister_unwind_table(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
|
||||
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_6xx) += -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
|
||||
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))
|
||||
|
||||
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 __S111 PAGE_SHARED_X
|
||||
|
||||
#ifdef CONFIG_HUGETLB_PAGE
|
||||
|
||||
#ifdef CONFIG_PPC_MM_SLICES
|
||||
#define HAVE_ARCH_UNMAPPED_AREA
|
||||
#define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN
|
||||
|
||||
#endif
|
||||
#endif /* CONFIG_PPC_MM_SLICES */
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
|
@ -16,6 +16,9 @@ static inline int in_kernel_text(unsigned long addr)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#undef dereference_function_descriptor
|
||||
void *dereference_function_descriptor(void *);
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
@ -14,12 +14,13 @@ endif
|
||||
|
||||
ifdef CONFIG_FTRACE
|
||||
# Do not trace early boot code
|
||||
CFLAGS_REMOVE_cputable.o = -pg
|
||||
CFLAGS_REMOVE_prom_init.o = -pg
|
||||
CFLAGS_REMOVE_cputable.o = -pg -mno-sched-epilog
|
||||
CFLAGS_REMOVE_prom_init.o = -pg -mno-sched-epilog
|
||||
CFLAGS_REMOVE_btext.o = -pg -mno-sched-epilog
|
||||
|
||||
ifdef CONFIG_DYNAMIC_FTRACE
|
||||
# dynamic ftrace setup.
|
||||
CFLAGS_REMOVE_ftrace.o = -pg
|
||||
CFLAGS_REMOVE_ftrace.o = -pg -mno-sched-epilog
|
||||
endif
|
||||
|
||||
endif
|
||||
|
@ -647,7 +647,7 @@ static int emulate_vsx(unsigned char __user *addr, unsigned int reg,
|
||||
unsigned int flags, unsigned int length)
|
||||
{
|
||||
char *ptr = (char *) ¤t->thread.TS_FPR(reg);
|
||||
int ret;
|
||||
int ret = 0;
|
||||
|
||||
flush_vsx_to_thread(current);
|
||||
|
||||
|
@ -158,7 +158,7 @@ _GLOBAL(power_save_ppc32_restore)
|
||||
stw r9,_NIP(r11) /* make it do a blr */
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
mfspr r12,SPRN_SPRG3
|
||||
rlwinm r12,r11,0,0,31-THREAD_SHIFT
|
||||
lwz r11,TI_CPU(r12) /* get cpu number * 4 */
|
||||
slwi r11,r11,2
|
||||
#else
|
||||
|
@ -84,10 +84,11 @@ _GLOBAL(power_save_ppc32_restore)
|
||||
stw r9,_NIP(r11) /* make it do a blr */
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
mfspr r12,SPRN_SPRG3
|
||||
rlwinm r12,r1,0,0,31-THREAD_SHIFT
|
||||
lwz r11,TI_CPU(r12) /* get cpu number * 4 */
|
||||
slwi r11,r11,2
|
||||
#else
|
||||
li r11,0
|
||||
#endif
|
||||
|
||||
b transfer_to_handler_cont
|
||||
|
@ -21,8 +21,9 @@
|
||||
#include <linux/err.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <asm/module.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/firmware.h>
|
||||
#include <asm/code-patching.h>
|
||||
#include <linux/sort.h>
|
||||
@ -451,3 +452,13 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
|
||||
|
||||
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 = .;
|
||||
#endif /* CONFIG_PPC32 */
|
||||
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
_etext = .;
|
||||
PROVIDE32 (etext = .);
|
||||
} :kernel
|
||||
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
_etext = .;
|
||||
PROVIDE32 (etext = .);
|
||||
|
||||
/* Read-only data */
|
||||
RODATA
|
||||
|
||||
|
@ -191,12 +191,17 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
|
||||
unsigned long hash, hpteg;
|
||||
unsigned long vsid = get_kernel_vsid(vaddr, 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);
|
||||
hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP);
|
||||
|
||||
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);
|
||||
|
||||
if (ret < 0)
|
||||
@ -584,7 +589,7 @@ void __init htab_initialize(void)
|
||||
{
|
||||
unsigned long table;
|
||||
unsigned long pteg_count;
|
||||
unsigned long prot, tprot;
|
||||
unsigned long prot;
|
||||
unsigned long base = 0, size = 0, limit;
|
||||
int i;
|
||||
|
||||
@ -660,10 +665,9 @@ void __init htab_initialize(void)
|
||||
for (i=0; i < lmb.memory.cnt; i++) {
|
||||
base = (unsigned long)__va(lmb.memory.region[i].base);
|
||||
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",
|
||||
base, size, tprot);
|
||||
base, size, prot);
|
||||
|
||||
#ifdef CONFIG_U3_DART
|
||||
/* 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;
|
||||
if (base != dart_tablebase)
|
||||
BUG_ON(htab_bolt_mapping(base, dart_tablebase,
|
||||
__pa(base), tprot,
|
||||
__pa(base), prot,
|
||||
mmu_linear_psize,
|
||||
mmu_kernel_ssize));
|
||||
if ((base + size) > dart_table_end)
|
||||
BUG_ON(htab_bolt_mapping(dart_tablebase+16*MB,
|
||||
base + size,
|
||||
__pa(dart_table_end),
|
||||
tprot,
|
||||
prot,
|
||||
mmu_linear_psize,
|
||||
mmu_kernel_ssize));
|
||||
continue;
|
||||
}
|
||||
#endif /* CONFIG_U3_DART */
|
||||
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) &&
|
||||
(!victim || tmp->prio > victim->prio)) {
|
||||
victim = spu->ctx;
|
||||
get_spu_context(victim);
|
||||
}
|
||||
}
|
||||
if (victim)
|
||||
get_spu_context(victim);
|
||||
mutex_unlock(&cbe_spu_info[node].list_mutex);
|
||||
|
||||
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
|
||||
from the scheduler thread or from spu_deactivate */
|
||||
mutex_lock(&ctx->state_mutex);
|
||||
__spu_schedule(spu, ctx);
|
||||
if (ctx->state == SPU_STATE_SAVED)
|
||||
__spu_schedule(spu, 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;
|
||||
|
||||
mutex_lock(&cbe_spu_info[node].list_mutex);
|
||||
cbe_spu_info[node].nr_active--;
|
||||
spu->alloc_state = SPU_FREE;
|
||||
if (free_spu)
|
||||
spu->alloc_state = SPU_FREE;
|
||||
spu_unbind_context(spu, ctx);
|
||||
ctx->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) {
|
||||
new = grab_runnable_context(max_prio, spu->node);
|
||||
if (new || force) {
|
||||
spu_unschedule(spu, ctx);
|
||||
spu_unschedule(spu, ctx, new == NULL);
|
||||
if (new) {
|
||||
if (new->flags & SPU_CREATE_NOSCHED)
|
||||
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);
|
||||
if (new) {
|
||||
spu_unschedule(spu, ctx);
|
||||
spu_unschedule(spu, ctx, 0);
|
||||
if (test_bit(SPU_SCHED_SPU_RUN, &ctx->sched_flags))
|
||||
spu_add_to_rq(ctx);
|
||||
} else {
|
||||
|
@ -2,7 +2,7 @@ CFLAGS_bootx_init.o += -fPIC
|
||||
|
||||
ifdef CONFIG_FTRACE
|
||||
# Do not trace early boot code
|
||||
CFLAGS_REMOVE_bootx_init.o = -pg
|
||||
CFLAGS_REMOVE_bootx_init.o = -pg -mno-sched-epilog
|
||||
endif
|
||||
|
||||
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 acrs[NUM_ACRS];
|
||||
u32 orig_gpr2;
|
||||
/* nb: there's a 4-byte hole here */
|
||||
s390_fp_regs fp_regs;
|
||||
/*
|
||||
* 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;
|
||||
|
||||
} 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)) {
|
||||
/*
|
||||
* 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;
|
||||
|
||||
} 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)) {
|
||||
/*
|
||||
* 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);
|
||||
|
||||
} 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)) {
|
||||
/*
|
||||
* 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;
|
||||
|
||||
} 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)) {
|
||||
/*
|
||||
* floating point regs. are stored in the thread structure
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.26
|
||||
# Wed Jul 30 01:18:59 2008
|
||||
# Linux kernel version: 2.6.27-rc4
|
||||
# Tue Aug 26 14:21:17 2008
|
||||
#
|
||||
CONFIG_SUPERH=y
|
||||
CONFIG_SUPERH32=y
|
||||
@ -11,6 +11,7 @@ CONFIG_GENERIC_BUG=y
|
||||
CONFIG_GENERIC_FIND_NEXT_BIT=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
|
||||
CONFIG_GENERIC_IRQ_PROBE=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=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_U64 is not set
|
||||
CONFIG_ARCH_NO_VIRT_TO_BUS=y
|
||||
CONFIG_ARCH_SUPPORTS_AOUT=y
|
||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
|
||||
#
|
||||
@ -58,7 +58,6 @@ CONFIG_SYSCTL=y
|
||||
CONFIG_EMBEDDED=y
|
||||
CONFIG_UID16=y
|
||||
CONFIG_SYSCTL_SYSCALL=y
|
||||
CONFIG_SYSCTL_SYSCALL_CHECK=y
|
||||
# CONFIG_KALLSYMS is not set
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_PRINTK=y
|
||||
@ -89,6 +88,7 @@ CONFIG_HAVE_OPROFILE=y
|
||||
# CONFIG_USE_GENERIC_SMP_HELPERS is not set
|
||||
CONFIG_HAVE_CLK=y
|
||||
CONFIG_PROC_PAGE_MONITOR=y
|
||||
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
|
||||
CONFIG_SLABINFO=y
|
||||
CONFIG_RT_MUTEXES=y
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
@ -261,9 +261,10 @@ CONFIG_HZ_250=y
|
||||
# CONFIG_HZ_300 is not set
|
||||
# CONFIG_HZ_1000 is not set
|
||||
CONFIG_HZ=250
|
||||
# CONFIG_SCHED_HRTICK is not set
|
||||
CONFIG_SCHED_HRTICK=y
|
||||
# CONFIG_KEXEC is not set
|
||||
# CONFIG_CRASH_DUMP is not set
|
||||
CONFIG_SECCOMP=y
|
||||
# CONFIG_PREEMPT_NONE is not set
|
||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||
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_MISC is not set
|
||||
|
||||
#
|
||||
# Networking
|
||||
#
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
@ -647,6 +644,7 @@ CONFIG_SSB_POSSIBLE=y
|
||||
# CONFIG_MFD_CORE is not set
|
||||
# CONFIG_MFD_SM501 is not set
|
||||
# CONFIG_HTC_PASIC3 is not set
|
||||
# CONFIG_MFD_TMIO is not set
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
@ -690,7 +688,10 @@ CONFIG_DUMMY_CONSOLE=y
|
||||
# CONFIG_ACCESSIBILITY is not set
|
||||
# CONFIG_RTC_CLASS 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
|
||||
@ -854,6 +855,7 @@ CONFIG_FRAME_WARN=1024
|
||||
# CONFIG_DEBUG_KERNEL is not set
|
||||
# CONFIG_DEBUG_BUGVERBOSE is not set
|
||||
# CONFIG_DEBUG_MEMORY_INIT is not set
|
||||
CONFIG_SYSCTL_SYSCALL_CHECK=y
|
||||
# CONFIG_SAMPLES is not set
|
||||
# CONFIG_SH_STANDARD_BIOS is not set
|
||||
# CONFIG_EARLY_SCIF_CONSOLE is not set
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.26
|
||||
# Wed Jul 30 01:44:41 2008
|
||||
# Linux kernel version: 2.6.27-rc4
|
||||
# Tue Aug 26 14:18:17 2008
|
||||
#
|
||||
CONFIG_SUPERH=y
|
||||
CONFIG_SUPERH32=y
|
||||
@ -11,6 +11,7 @@ CONFIG_GENERIC_BUG=y
|
||||
CONFIG_GENERIC_FIND_NEXT_BIT=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
|
||||
CONFIG_GENERIC_IRQ_PROBE=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=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_U64 is not set
|
||||
CONFIG_ARCH_NO_VIRT_TO_BUS=y
|
||||
CONFIG_ARCH_SUPPORTS_AOUT=y
|
||||
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_HAVE_CLK=y
|
||||
CONFIG_PROC_PAGE_MONITOR=y
|
||||
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
|
||||
CONFIG_SLABINFO=y
|
||||
CONFIG_RT_MUTEXES=y
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
@ -270,6 +271,7 @@ CONFIG_HZ=250
|
||||
# CONFIG_SCHED_HRTICK is not set
|
||||
# CONFIG_KEXEC is not set
|
||||
# CONFIG_CRASH_DUMP is not set
|
||||
CONFIG_SECCOMP=y
|
||||
CONFIG_PREEMPT_NONE=y
|
||||
# CONFIG_PREEMPT_VOLUNTARY 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_MISC is not set
|
||||
|
||||
#
|
||||
# Networking
|
||||
#
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
@ -649,6 +647,7 @@ CONFIG_HW_RANDOM=y
|
||||
CONFIG_I2C=y
|
||||
CONFIG_I2C_BOARDINFO=y
|
||||
# CONFIG_I2C_CHARDEV is not set
|
||||
CONFIG_I2C_HELPER_AUTO=y
|
||||
|
||||
#
|
||||
# I2C Hardware Bus support
|
||||
@ -709,6 +708,7 @@ CONFIG_SSB_POSSIBLE=y
|
||||
# CONFIG_MFD_CORE is not set
|
||||
# CONFIG_MFD_SM501 is not set
|
||||
# CONFIG_HTC_PASIC3 is not set
|
||||
# CONFIG_MFD_TMIO is not set
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
@ -755,6 +755,8 @@ CONFIG_USB_ARCH_HAS_HCD=y
|
||||
# CONFIG_USB is not set
|
||||
# CONFIG_USB_OTG_WHITELIST 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'
|
||||
@ -842,7 +844,10 @@ CONFIG_RTC_DRV_RS5C372=y
|
||||
#
|
||||
CONFIG_RTC_DRV_SH=y
|
||||
# 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
|
||||
|
@ -76,4 +76,6 @@ extern long __put_user_asm_l(void *, long);
|
||||
extern long __put_user_asm_q(void *, long);
|
||||
extern void __put_user_unknown(void);
|
||||
|
||||
extern long __strnlen_user(const char *__s, long __n);
|
||||
|
||||
#endif /* __ASM_SH_UACCESS_64_H */
|
||||
|
@ -2,7 +2,7 @@
|
||||
* arch/sh/kernel/cpu/sh5/entry.S
|
||||
*
|
||||
* Copyright (C) 2000, 2001 Paolo Alberelli
|
||||
* Copyright (C) 2004 - 2007 Paul Mundt
|
||||
* Copyright (C) 2004 - 2008 Paul Mundt
|
||||
* Copyright (C) 2003, 2004 Richard Curnow
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
@ -923,6 +923,8 @@ ret_from_exception:
|
||||
blink tr0, ZERO
|
||||
|
||||
resume_kernel:
|
||||
CLI()
|
||||
|
||||
pta restore_all, tr0
|
||||
|
||||
getcon KCR0, r6
|
||||
@ -939,19 +941,11 @@ need_resched:
|
||||
andi r7, 0xf0, r7
|
||||
bne r7, ZERO, tr0
|
||||
|
||||
movi ((PREEMPT_ACTIVE >> 16) & 65535), r8
|
||||
shori (PREEMPT_ACTIVE & 65535), r8
|
||||
st.l r6, TI_PRE_COUNT, r8
|
||||
|
||||
STI()
|
||||
movi schedule, r7
|
||||
movi preempt_schedule_irq, r7
|
||||
ori r7, 1, r7
|
||||
ptabs r7, tr1
|
||||
blink tr1, LINK
|
||||
|
||||
st.l r6, TI_PRE_COUNT, ZERO
|
||||
CLI()
|
||||
|
||||
pta need_resched, tr1
|
||||
blink tr1, ZERO
|
||||
#endif
|
||||
|
@ -92,6 +92,7 @@ ENTRY(ret_from_irq)
|
||||
bra resume_userspace
|
||||
nop
|
||||
ENTRY(resume_kernel)
|
||||
cli
|
||||
mov.l @(TI_PRE_COUNT,r8), r0 ! current_thread_info->preempt_count
|
||||
tst r0, r0
|
||||
bf noresched
|
||||
@ -105,28 +106,9 @@ need_resched:
|
||||
and #0xf0, r0 ! interrupts off (exception path)?
|
||||
cmp/eq #0xf0, r0
|
||||
bt noresched
|
||||
|
||||
mov.l 1f, r0
|
||||
mov.l r0, @(TI_PRE_COUNT,r8)
|
||||
|
||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
||||
mov.l 3f, r0
|
||||
jsr @r0
|
||||
jsr @r0 ! call preempt_schedule_irq
|
||||
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
|
||||
nop
|
||||
|
||||
@ -137,10 +119,7 @@ noresched:
|
||||
.align 2
|
||||
1: .long PREEMPT_ACTIVE
|
||||
2: .long schedule
|
||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
||||
3: .long trace_hardirqs_on
|
||||
4: .long trace_hardirqs_off
|
||||
#endif
|
||||
3: .long preempt_schedule_irq
|
||||
#endif
|
||||
|
||||
ENTRY(resume_userspace)
|
||||
|
@ -102,7 +102,7 @@ void machine_kexec(struct kimage *image)
|
||||
|
||||
/* now call it */
|
||||
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)
|
||||
|
@ -131,6 +131,8 @@ void user_enable_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;
|
||||
}
|
||||
|
||||
|
@ -171,6 +171,7 @@ static void __init reserve_crashkernel(void)
|
||||
(unsigned long)(free_mem >> 20));
|
||||
crashk_res.start = crash_base;
|
||||
crashk_res.end = crash_base + crash_size - 1;
|
||||
insert_resource(&iomem_resource, &crashk_res);
|
||||
}
|
||||
}
|
||||
#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, &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);
|
||||
}
|
||||
|
||||
|
@ -170,7 +170,7 @@ asmlinkage int sys_ipc(uint call, int first, int second,
|
||||
version = call >> 16; /* hack for backward compatibility */
|
||||
call &= 0xffff;
|
||||
|
||||
if (call <= SEMCTL)
|
||||
if (call <= SEMTIMEDOP)
|
||||
switch (call) {
|
||||
case SEMOP:
|
||||
return sys_semtimedop(first,
|
||||
|
@ -101,7 +101,7 @@ static int __init memchunk_setup(char *str)
|
||||
}
|
||||
__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;
|
||||
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,
|
||||
char *name, unsigned long memsize)
|
||||
int __init platform_resource_setup_memory(struct platform_device *pdev,
|
||||
char *name, unsigned long memsize)
|
||||
{
|
||||
struct resource *r;
|
||||
dma_addr_t dma_handle;
|
||||
|
@ -792,6 +792,8 @@ void fixup_irqs(void)
|
||||
}
|
||||
spin_unlock_irqrestore(&irq_desc[irq].lock, flags);
|
||||
}
|
||||
|
||||
tick_ops->disable_irq();
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -80,8 +80,6 @@ void smp_bogo(struct seq_file *m)
|
||||
i, cpu_data(i).clock_tick);
|
||||
}
|
||||
|
||||
static __cacheline_aligned_in_smp DEFINE_SPINLOCK(call_lock);
|
||||
|
||||
extern void setup_sparc64_timer(void);
|
||||
|
||||
static volatile unsigned long callin_flag = 0;
|
||||
@ -120,9 +118,9 @@ void __cpuinit smp_callin(void)
|
||||
while (!cpu_isset(cpuid, smp_commenced_mask))
|
||||
rmb();
|
||||
|
||||
spin_lock(&call_lock);
|
||||
ipi_call_lock();
|
||||
cpu_set(cpuid, cpu_online_map);
|
||||
spin_unlock(&call_lock);
|
||||
ipi_call_unlock();
|
||||
|
||||
/* idle thread is expected to have preempt disabled */
|
||||
preempt_disable();
|
||||
@ -1305,10 +1303,6 @@ int __cpu_disable(void)
|
||||
c->core_id = 0;
|
||||
c->proc_id = -1;
|
||||
|
||||
spin_lock(&call_lock);
|
||||
cpu_clear(cpu, cpu_online_map);
|
||||
spin_unlock(&call_lock);
|
||||
|
||||
smp_wmb();
|
||||
|
||||
/* Make sure no interrupts point to this cpu. */
|
||||
@ -1318,6 +1312,10 @@ int __cpu_disable(void)
|
||||
mdelay(1);
|
||||
local_irq_disable();
|
||||
|
||||
ipi_call_lock();
|
||||
cpu_clear(cpu, cpu_online_map);
|
||||
ipi_call_unlock();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -382,14 +382,17 @@ config X86_OOSTORE
|
||||
# P6_NOPs are a relatively minor optimization that require a family >=
|
||||
# 6 processor, except that it is broken on certain VIA chips.
|
||||
# Furthermore, AMD chips prefer a totally different sequence of NOPs
|
||||
# (which work on all CPUs). As a result, disallow these if we're
|
||||
# compiling X86_GENERIC but not 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.
|
||||
# (which work on all CPUs). In addition, it looks like Virtual PC
|
||||
# does not understand them.
|
||||
#
|
||||
# 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
|
||||
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
|
||||
def_bool y
|
||||
|
@ -38,12 +38,12 @@ static const u32 req_flags[NCAPINTS] =
|
||||
{
|
||||
REQUIRED_MASK0,
|
||||
REQUIRED_MASK1,
|
||||
REQUIRED_MASK2,
|
||||
REQUIRED_MASK3,
|
||||
0, /* REQUIRED_MASK2 not implemented in this file */
|
||||
0, /* REQUIRED_MASK3 not implemented in this file */
|
||||
REQUIRED_MASK4,
|
||||
REQUIRED_MASK5,
|
||||
0, /* REQUIRED_MASK5 not implemented in this file */
|
||||
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))
|
||||
|
@ -145,35 +145,25 @@ static const unsigned char *const p6_nops[ASM_NOP_MAX+1] = {
|
||||
extern char __vsyscall_0;
|
||||
const unsigned char *const *find_nop_table(void)
|
||||
{
|
||||
return boot_cpu_data.x86_vendor != X86_VENDOR_INTEL ||
|
||||
boot_cpu_data.x86 < 6 ? k8_nops : p6_nops;
|
||||
if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
|
||||
boot_cpu_has(X86_FEATURE_NOPL))
|
||||
return p6_nops;
|
||||
else
|
||||
return k8_nops;
|
||||
}
|
||||
|
||||
#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 *noptable = intel_nops;
|
||||
int i;
|
||||
|
||||
for (i = 0; noptypes[i].cpuid >= 0; i++) {
|
||||
if (boot_cpu_has(noptypes[i].cpuid)) {
|
||||
noptable = noptypes[i].noptable;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return noptable;
|
||||
if (boot_cpu_has(X86_FEATURE_K8))
|
||||
return k8_nops;
|
||||
else if (boot_cpu_has(X86_FEATURE_K7))
|
||||
return k7_nops;
|
||||
else if (boot_cpu_has(X86_FEATURE_NOPL))
|
||||
return p6_nops;
|
||||
else
|
||||
return intel_nops;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_X86_64 */
|
||||
|
@ -31,6 +31,11 @@ static void __cpuinit early_init_amd(struct cpuinfo_x86 *c)
|
||||
if (c->x86_power & (1<<8))
|
||||
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)
|
||||
@ -166,10 +171,6 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -314,6 +314,16 @@ enum {
|
||||
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)
|
||||
{
|
||||
|
||||
@ -462,6 +472,7 @@ centaur_size_cache(struct cpuinfo_x86 *c, unsigned int size)
|
||||
static struct cpu_dev centaur_cpu_dev __cpuinitdata = {
|
||||
.c_vendor = "Centaur",
|
||||
.c_ident = { "CentaurHauls" },
|
||||
.c_early_init = early_init_centaur,
|
||||
.c_init = init_centaur,
|
||||
.c_size_cache = centaur_size_cache,
|
||||
};
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include <asm/mtrr.h>
|
||||
#include <asm/mce.h>
|
||||
#include <asm/pat.h>
|
||||
#include <asm/asm.h>
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
#include <asm/mpspec.h>
|
||||
#include <asm/apic.h>
|
||||
@ -334,11 +335,40 @@ static void __init early_cpu_detect(void)
|
||||
|
||||
get_cpu_vendor(c, 1);
|
||||
|
||||
early_get_cap(c);
|
||||
|
||||
if (c->x86_vendor != X86_VENDOR_UNKNOWN &&
|
||||
cpu_devs[c->x86_vendor]->c_early_init)
|
||||
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)
|
||||
@ -395,8 +425,8 @@ static void __cpuinit generic_identify(struct cpuinfo_x86 *c)
|
||||
}
|
||||
|
||||
init_scattered_cpuid_features(c);
|
||||
detect_nopl(c);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void __cpuinit squash_the_stupid_serial_number(struct cpuinfo_x86 *c)
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include <asm/mtrr.h>
|
||||
#include <asm/mce.h>
|
||||
#include <asm/pat.h>
|
||||
#include <asm/asm.h>
|
||||
#include <asm/numa.h>
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
#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);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
detect_nopl(c);
|
||||
|
||||
if (c->x86_vendor != X86_VENDOR_UNKNOWN &&
|
||||
cpu_devs[c->x86_vendor]->c_early_init)
|
||||
cpu_devs[c->x86_vendor]->c_early_init(c);
|
||||
@ -493,17 +529,20 @@ void pda_init(int cpu)
|
||||
/* others are initialized in smpboot.c */
|
||||
pda->pcurrent = &init_task;
|
||||
pda->irqstackptr = boot_cpu_stack;
|
||||
pda->irqstackptr += IRQSTACKSIZE - 64;
|
||||
} else {
|
||||
pda->irqstackptr = (char *)
|
||||
__get_free_pages(GFP_ATOMIC, IRQSTACK_ORDER);
|
||||
if (!pda->irqstackptr)
|
||||
panic("cannot allocate irqstack for cpu %d", cpu);
|
||||
if (!pda->irqstackptr) {
|
||||
pda->irqstackptr = (char *)
|
||||
__get_free_pages(GFP_ATOMIC, IRQSTACK_ORDER);
|
||||
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)
|
||||
pda->nodenumber = cpu_to_node(cpu);
|
||||
}
|
||||
|
||||
pda->irqstackptr += IRQSTACKSIZE-64;
|
||||
}
|
||||
|
||||
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
|
||||
*/
|
||||
for (v = 0; v < N_EXCEPTION_STACKS; v++) {
|
||||
if (!orig_ist->ist[0]) {
|
||||
static const unsigned int order[N_EXCEPTION_STACKS] = {
|
||||
[0 ... N_EXCEPTION_STACKS - 1] = EXCEPTION_STACK_ORDER,
|
||||
[DEBUG_STACK - 1] = DEBUG_STACK_ORDER
|
||||
[0 ... N_EXCEPTION_STACKS - 1] = EXCEPTION_STACK_ORDER,
|
||||
[DEBUG_STACK - 1] = DEBUG_STACK_ORDER
|
||||
};
|
||||
if (cpu) {
|
||||
estacks = (char *)__get_free_pages(GFP_ATOMIC, order[v]);
|
||||
if (!estacks)
|
||||
panic("Cannot allocate exception stack %ld %d\n",
|
||||
v, cpu);
|
||||
for (v = 0; v < N_EXCEPTION_STACKS; v++) {
|
||||
if (cpu) {
|
||||
estacks = (char *)__get_free_pages(GFP_ATOMIC, order[v]);
|
||||
if (!estacks)
|
||||
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);
|
||||
|
@ -15,13 +15,11 @@
|
||||
/*
|
||||
* 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 long flags;
|
||||
|
||||
/* we test for DEVID by checking whether CCR3 is writable */
|
||||
local_irq_save(flags);
|
||||
ccr3 = getCx86(CX86_CCR3);
|
||||
setCx86(CX86_CCR3, ccr3 ^ 0x80);
|
||||
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);
|
||||
*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
|
||||
* 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);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
@ -416,6 +439,7 @@ static void __cpuinit cyrix_identify(struct cpuinfo_x86 *c)
|
||||
static struct cpu_dev cyrix_cpu_dev __cpuinitdata = {
|
||||
.c_vendor = "Cyrix",
|
||||
.c_ident = { "CyrixInstead" },
|
||||
.c_early_init = early_init_cyrix,
|
||||
.c_init = init_cyrix,
|
||||
.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
Block a user