mirror of
https://github.com/torvalds/linux.git
synced 2026-05-26 08:02:27 +02:00
imx-dt-3.7
- All imx53 board files are removed by the equal device tree support - The efikamx board files are removed to ease device tree migration - Remove dummy pinctrl state by setting up pinctrl in device tree -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iQEcBAABAgAGBQJQTvkKAAoJEFBXWFqHsHzOQvMIALgz2rEVpFWBvZTtH3oKc/iZ L2xK0cZ5BDDb0BhH/2v6BpMW2fXrag815W58gwKmM/e2WvK6BRKlEtddaYN2DvYA EXHesgUUehkWsUP29lhQO0SBOJPkEGUZ1m2DF1i5/6gENwLw3bVdd9Q+4Z271nxP TtXDyqjOmTjHXXfKo3r4PzDUcJoI5jgZpEzkBBZmGQKu5l9n8jb53F5v6dkecRa/ EaKRRhmn6aOc7e9NcsD1KowqRIHQMNI1emmjo46vTQlH+/pyD8SjQoz1GVXy8RGo 8uAnhf/aT5kX3JEvCxkJs9CDYavlfpueJ1/90klX6H60BScMzynA88RJtB2NlFE= =dkqZ -----END PGP SIGNATURE----- Merge tag 'imx-dt-3.7' into imx/dt-for-3.7-2
This commit is contained in:
commit
8f71fb87e2
|
|
@ -5,4 +5,15 @@ Contact: "Ike Panhc <ike.pan@canonical.com>"
|
|||
Description:
|
||||
Control the power of camera module. 1 means on, 0 means off.
|
||||
|
||||
What: /sys/devices/platform/ideapad/fan_mode
|
||||
Date: June 2012
|
||||
KernelVersion: 3.6
|
||||
Contact: "Maxim Mikityanskiy <maxtram95@gmail.com>"
|
||||
Description:
|
||||
Change fan mode
|
||||
There are four available modes:
|
||||
* 0 -> Super Silent Mode
|
||||
* 1 -> Standard Mode
|
||||
* 2 -> Dust Cleaning
|
||||
* 4 -> Efficient Thermal Dissipation Mode
|
||||
|
||||
|
|
|
|||
|
|
@ -125,7 +125,7 @@ the structure refers to a radio tuner the
|
|||
<constant>V4L2_TUNER_CAP_NORM</constant> flags can't be used.</para>
|
||||
<para>If multiple frequency bands are supported, then
|
||||
<structfield>capability</structfield> is the union of all
|
||||
<structfield>capability></structfield> fields of each &v4l2-frequency-band;.
|
||||
<structfield>capability</structfield> fields of each &v4l2-frequency-band;.
|
||||
</para></entry>
|
||||
</row>
|
||||
<row>
|
||||
|
|
|
|||
|
|
@ -9,9 +9,9 @@ Required properties:
|
|||
- regulators: list of regulators provided by this controller, must have
|
||||
property "regulator-compatible" to match their hardware counterparts:
|
||||
sm[0-2], ldo[0-9] and ldo_rtc
|
||||
- sm0-supply: The input supply for the SM0.
|
||||
- sm1-supply: The input supply for the SM1.
|
||||
- sm2-supply: The input supply for the SM2.
|
||||
- vin-sm0-supply: The input supply for the SM0.
|
||||
- vin-sm1-supply: The input supply for the SM1.
|
||||
- vin-sm2-supply: The input supply for the SM2.
|
||||
- vinldo01-supply: The input supply for the LDO1 and LDO2
|
||||
- vinldo23-supply: The input supply for the LDO2 and LDO3
|
||||
- vinldo4-supply: The input supply for the LDO4
|
||||
|
|
@ -30,9 +30,9 @@ Example:
|
|||
#gpio-cells = <2>;
|
||||
gpio-controller;
|
||||
|
||||
sm0-supply = <&some_reg>;
|
||||
sm1-supply = <&some_reg>;
|
||||
sm2-supply = <&some_reg>;
|
||||
vin-sm0-supply = <&some_reg>;
|
||||
vin-sm1-supply = <&some_reg>;
|
||||
vin-sm2-supply = <&some_reg>;
|
||||
vinldo01-supply = <...>;
|
||||
vinldo23-supply = <...>;
|
||||
vinldo4-supply = <...>;
|
||||
|
|
|
|||
|
|
@ -137,6 +137,17 @@ errors=panic|continue|remount-ro
|
|||
without doing anything or remount the partition in
|
||||
read-only mode (default behavior).
|
||||
|
||||
discard -- If set, issues discard/TRIM commands to the block
|
||||
device when blocks are freed. This is useful for SSD devices
|
||||
and sparse/thinly-provisoned LUNs.
|
||||
|
||||
nfs -- This option maintains an index (cache) of directory
|
||||
inodes by i_logstart which is used by the nfs-related code to
|
||||
improve look-ups.
|
||||
|
||||
Enable this only if you want to export the FAT filesystem
|
||||
over NFS
|
||||
|
||||
<bool>: 0,1,yes,no,true,false
|
||||
|
||||
TODO
|
||||
|
|
|
|||
|
|
@ -51,8 +51,23 @@ Built-in netconsole starts immediately after the TCP stack is
|
|||
initialized and attempts to bring up the supplied dev at the supplied
|
||||
address.
|
||||
|
||||
The remote host can run either 'netcat -u -l -p <port>',
|
||||
'nc -l -u <port>' or syslogd.
|
||||
The remote host has several options to receive the kernel messages,
|
||||
for example:
|
||||
|
||||
1) syslogd
|
||||
|
||||
2) netcat
|
||||
|
||||
On distributions using a BSD-based netcat version (e.g. Fedora,
|
||||
openSUSE and Ubuntu) the listening port must be specified without
|
||||
the -p switch:
|
||||
|
||||
'nc -u -l -p <port>' / 'nc -u -l <port>' or
|
||||
'netcat -u -l -p <port>' / 'netcat -u -l <port>'
|
||||
|
||||
3) socat
|
||||
|
||||
'socat udp-recv:<port> -'
|
||||
|
||||
Dynamic reconfiguration:
|
||||
========================
|
||||
|
|
|
|||
|
|
@ -840,9 +840,9 @@ static unsigned long i2c_pin_configs[] = {
|
|||
|
||||
static struct pinctrl_map __initdata mapping[] = {
|
||||
PIN_MAP_MUX_GROUP("foo-i2c.0", PINCTRL_STATE_DEFAULT, "pinctrl-foo", "i2c0", "i2c0"),
|
||||
PIN_MAP_MUX_CONFIGS_GROUP("foo-i2c.0", PINCTRL_STATE_DEFAULT, "pinctrl-foo", "i2c0", i2c_grp_configs),
|
||||
PIN_MAP_MUX_CONFIGS_PIN("foo-i2c.0", PINCTRL_STATE_DEFAULT, "pinctrl-foo", "i2c0scl", i2c_pin_configs),
|
||||
PIN_MAP_MUX_CONFIGS_PIN("foo-i2c.0", PINCTRL_STATE_DEFAULT, "pinctrl-foo", "i2c0sda", i2c_pin_configs),
|
||||
PIN_MAP_CONFIGS_GROUP("foo-i2c.0", PINCTRL_STATE_DEFAULT, "pinctrl-foo", "i2c0", i2c_grp_configs),
|
||||
PIN_MAP_CONFIGS_PIN("foo-i2c.0", PINCTRL_STATE_DEFAULT, "pinctrl-foo", "i2c0scl", i2c_pin_configs),
|
||||
PIN_MAP_CONFIGS_PIN("foo-i2c.0", PINCTRL_STATE_DEFAULT, "pinctrl-foo", "i2c0sda", i2c_pin_configs),
|
||||
};
|
||||
|
||||
Finally, some devices expect the mapping table to contain certain specific
|
||||
|
|
|
|||
|
|
@ -299,11 +299,17 @@ map_hugetlb.c.
|
|||
*******************************************************************
|
||||
|
||||
/*
|
||||
* hugepage-shm: see Documentation/vm/hugepage-shm.c
|
||||
* map_hugetlb: see tools/testing/selftests/vm/map_hugetlb.c
|
||||
*/
|
||||
|
||||
*******************************************************************
|
||||
|
||||
/*
|
||||
* hugepage-mmap: see Documentation/vm/hugepage-mmap.c
|
||||
* hugepage-shm: see tools/testing/selftests/vm/hugepage-shm.c
|
||||
*/
|
||||
|
||||
*******************************************************************
|
||||
|
||||
/*
|
||||
* hugepage-mmap: see tools/testing/selftests/vm/hugepage-mmap.c
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ Kernel driver w1_therm
|
|||
|
||||
Supported chips:
|
||||
* Maxim ds18*20 based temperature sensors.
|
||||
* Maxim ds1825 based temperature sensors.
|
||||
|
||||
Author: Evgeniy Polyakov <johnpol@2ka.mipt.ru>
|
||||
|
||||
|
|
@ -15,6 +16,7 @@ supported family codes:
|
|||
W1_THERM_DS18S20 0x10
|
||||
W1_THERM_DS1822 0x22
|
||||
W1_THERM_DS18B20 0x28
|
||||
W1_THERM_DS1825 0x3B
|
||||
|
||||
Support is provided through the sysfs w1_slave file. Each open and
|
||||
read sequence will initiate a temperature conversion then provide two
|
||||
|
|
|
|||
23
MAINTAINERS
23
MAINTAINERS
|
|
@ -2217,7 +2217,7 @@ S: Maintained
|
|||
F: drivers/scsi/tmscsim.*
|
||||
|
||||
DC395x SCSI driver
|
||||
M: Oliver Neukum <oliver@neukum.name>
|
||||
M: Oliver Neukum <oliver@neukum.org>
|
||||
M: Ali Akcaagac <aliakc@web.de>
|
||||
M: Jamie Lenehan <lenehan@twibble.org>
|
||||
W: http://twibble.org/dist/dc395x/
|
||||
|
|
@ -4537,7 +4537,7 @@ S: Supported
|
|||
F: arch/microblaze/
|
||||
|
||||
MICROTEK X6 SCANNER
|
||||
M: Oliver Neukum <oliver@neukum.name>
|
||||
M: Oliver Neukum <oliver@neukum.org>
|
||||
S: Maintained
|
||||
F: drivers/usb/image/microtek.*
|
||||
|
||||
|
|
@ -7076,7 +7076,7 @@ F: include/linux/mtd/ubi.h
|
|||
F: include/mtd/ubi-user.h
|
||||
|
||||
USB ACM DRIVER
|
||||
M: Oliver Neukum <oliver@neukum.name>
|
||||
M: Oliver Neukum <oliver@neukum.org>
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/usb/acm.txt
|
||||
|
|
@ -7097,7 +7097,7 @@ S: Supported
|
|||
F: drivers/block/ub.c
|
||||
|
||||
USB CDC ETHERNET DRIVER
|
||||
M: Oliver Neukum <oliver@neukum.name>
|
||||
M: Oliver Neukum <oliver@neukum.org>
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/net/usb/cdc_*.c
|
||||
|
|
@ -7170,7 +7170,7 @@ F: drivers/usb/host/isp116x*
|
|||
F: include/linux/usb/isp116x.h
|
||||
|
||||
USB KAWASAKI LSI DRIVER
|
||||
M: Oliver Neukum <oliver@neukum.name>
|
||||
M: Oliver Neukum <oliver@neukum.org>
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/usb/serial/kl5kusb105.*
|
||||
|
|
@ -7288,6 +7288,12 @@ W: http://www.connecttech.com
|
|||
S: Supported
|
||||
F: drivers/usb/serial/whiteheat*
|
||||
|
||||
USB SMSC75XX ETHERNET DRIVER
|
||||
M: Steve Glendinning <steve.glendinning@shawell.net>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/net/usb/smsc75xx.*
|
||||
|
||||
USB SMSC95XX ETHERNET DRIVER
|
||||
M: Steve Glendinning <steve.glendinning@shawell.net>
|
||||
L: netdev@vger.kernel.org
|
||||
|
|
@ -7670,23 +7676,28 @@ S: Supported
|
|||
F: Documentation/hwmon/wm83??
|
||||
F: arch/arm/mach-s3c64xx/mach-crag6410*
|
||||
F: drivers/clk/clk-wm83*.c
|
||||
F: drivers/extcon/extcon-arizona.c
|
||||
F: drivers/leds/leds-wm83*.c
|
||||
F: drivers/gpio/gpio-*wm*.c
|
||||
F: drivers/gpio/gpio-arizona.c
|
||||
F: drivers/hwmon/wm83??-hwmon.c
|
||||
F: drivers/input/misc/wm831x-on.c
|
||||
F: drivers/input/touchscreen/wm831x-ts.c
|
||||
F: drivers/input/touchscreen/wm97*.c
|
||||
F: drivers/mfd/wm8*.c
|
||||
F: drivers/mfd/arizona*
|
||||
F: drivers/mfd/wm*.c
|
||||
F: drivers/power/wm83*.c
|
||||
F: drivers/rtc/rtc-wm83*.c
|
||||
F: drivers/regulator/wm8*.c
|
||||
F: drivers/video/backlight/wm83*_bl.c
|
||||
F: drivers/watchdog/wm83*_wdt.c
|
||||
F: include/linux/mfd/arizona/
|
||||
F: include/linux/mfd/wm831x/
|
||||
F: include/linux/mfd/wm8350/
|
||||
F: include/linux/mfd/wm8400*
|
||||
F: include/linux/wm97xx.h
|
||||
F: include/sound/wm????.h
|
||||
F: sound/soc/codecs/arizona.?
|
||||
F: sound/soc/codecs/wm*
|
||||
|
||||
WORKQUEUE
|
||||
|
|
|
|||
2
Makefile
2
Makefile
|
|
@ -1,7 +1,7 @@
|
|||
VERSION = 3
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc2
|
||||
EXTRAVERSION = -rc3
|
||||
NAME = Saber-toothed Squirrel
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
|||
|
|
@ -18,6 +18,8 @@ config ALPHA
|
|||
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
||||
select GENERIC_SMP_IDLE_THREAD
|
||||
select GENERIC_CMOS_UPDATE
|
||||
select GENERIC_STRNCPY_FROM_USER
|
||||
select GENERIC_STRNLEN_USER
|
||||
help
|
||||
The Alpha is a 64-bit general-purpose processor designed and
|
||||
marketed by the Digital Equipment Corporation of blessed memory,
|
||||
|
|
|
|||
|
|
@ -14,8 +14,8 @@
|
|||
*/
|
||||
|
||||
|
||||
#define ATOMIC_INIT(i) ( (atomic_t) { (i) } )
|
||||
#define ATOMIC64_INIT(i) ( (atomic64_t) { (i) } )
|
||||
#define ATOMIC_INIT(i) { (i) }
|
||||
#define ATOMIC64_INIT(i) { (i) }
|
||||
|
||||
#define atomic_read(v) (*(volatile int *)&(v)->counter)
|
||||
#define atomic64_read(v) (*(volatile long *)&(v)->counter)
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
#ifndef __ASM_ALPHA_FPU_H
|
||||
#define __ASM_ALPHA_FPU_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <asm/special_insns.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Alpha floating-point control register defines:
|
||||
|
|
|
|||
|
|
@ -76,7 +76,10 @@ struct switch_stack {
|
|||
#define task_pt_regs(task) \
|
||||
((struct pt_regs *) (task_stack_page(task) + 2*PAGE_SIZE) - 1)
|
||||
|
||||
#define force_successful_syscall_return() (task_pt_regs(current)->r0 = 0)
|
||||
#define current_pt_regs() \
|
||||
((struct pt_regs *) ((char *)current_thread_info() + 2*PAGE_SIZE) - 1)
|
||||
|
||||
#define force_successful_syscall_return() (current_pt_regs()->r0 = 0)
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -76,9 +76,11 @@
|
|||
/* Instruct lower device to use last 4-bytes of skb data as FCS */
|
||||
#define SO_NOFCS 43
|
||||
|
||||
#ifdef __KERNEL__
|
||||
/* O_NONBLOCK clashes with the bits used for socket types. Therefore we
|
||||
* have to define SOCK_NONBLOCK to a different value here.
|
||||
*/
|
||||
#define SOCK_NONBLOCK 0x40000000
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* _ASM_SOCKET_H */
|
||||
|
|
|
|||
|
|
@ -433,36 +433,12 @@ clear_user(void __user *to, long len)
|
|||
#undef __module_address
|
||||
#undef __module_call
|
||||
|
||||
/* Returns: -EFAULT if exception before terminator, N if the entire
|
||||
buffer filled, else strlen. */
|
||||
#define user_addr_max() \
|
||||
(segment_eq(get_fs(), USER_DS) ? TASK_SIZE : ~0UL)
|
||||
|
||||
extern long __strncpy_from_user(char *__to, const char __user *__from, long __to_len);
|
||||
|
||||
extern inline long
|
||||
strncpy_from_user(char *to, const char __user *from, long n)
|
||||
{
|
||||
long ret = -EFAULT;
|
||||
if (__access_ok((unsigned long)from, 0, get_fs()))
|
||||
ret = __strncpy_from_user(to, from, n);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Returns: 0 if bad, string length+1 (memory size) of string if ok */
|
||||
extern long __strlen_user(const char __user *);
|
||||
|
||||
extern inline long strlen_user(const char __user *str)
|
||||
{
|
||||
return access_ok(VERIFY_READ,str,0) ? __strlen_user(str) : 0;
|
||||
}
|
||||
|
||||
/* Returns: 0 if exception before NUL or reaching the supplied limit (N),
|
||||
* a value greater than N if the limit would be exceeded, else strlen. */
|
||||
extern long __strnlen_user(const char __user *, long);
|
||||
|
||||
extern inline long strnlen_user(const char __user *str, long n)
|
||||
{
|
||||
return access_ok(VERIFY_READ,str,0) ? __strnlen_user(str, n) : 0;
|
||||
}
|
||||
extern long strncpy_from_user(char *dest, const char __user *src, long count);
|
||||
extern __must_check long strlen_user(const char __user *str);
|
||||
extern __must_check long strnlen_user(const char __user *str, long n);
|
||||
|
||||
/*
|
||||
* About the exception table:
|
||||
|
|
|
|||
|
|
@ -465,10 +465,12 @@
|
|||
#define __NR_setns 501
|
||||
#define __NR_accept4 502
|
||||
#define __NR_sendmmsg 503
|
||||
#define __NR_process_vm_readv 504
|
||||
#define __NR_process_vm_writev 505
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#define NR_SYSCALLS 504
|
||||
#define NR_SYSCALLS 506
|
||||
|
||||
#define __ARCH_WANT_OLD_READDIR
|
||||
#define __ARCH_WANT_STAT64
|
||||
|
|
|
|||
55
arch/alpha/include/asm/word-at-a-time.h
Normal file
55
arch/alpha/include/asm/word-at-a-time.h
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
#ifndef _ASM_WORD_AT_A_TIME_H
|
||||
#define _ASM_WORD_AT_A_TIME_H
|
||||
|
||||
#include <asm/compiler.h>
|
||||
|
||||
/*
|
||||
* word-at-a-time interface for Alpha.
|
||||
*/
|
||||
|
||||
/*
|
||||
* We do not use the word_at_a_time struct on Alpha, but it needs to be
|
||||
* implemented to humour the generic code.
|
||||
*/
|
||||
struct word_at_a_time {
|
||||
const unsigned long unused;
|
||||
};
|
||||
|
||||
#define WORD_AT_A_TIME_CONSTANTS { 0 }
|
||||
|
||||
/* Return nonzero if val has a zero */
|
||||
static inline unsigned long has_zero(unsigned long val, unsigned long *bits, const struct word_at_a_time *c)
|
||||
{
|
||||
unsigned long zero_locations = __kernel_cmpbge(0, val);
|
||||
*bits = zero_locations;
|
||||
return zero_locations;
|
||||
}
|
||||
|
||||
static inline unsigned long prep_zero_mask(unsigned long val, unsigned long bits, const struct word_at_a_time *c)
|
||||
{
|
||||
return bits;
|
||||
}
|
||||
|
||||
#define create_zero_mask(bits) (bits)
|
||||
|
||||
static inline unsigned long find_zero(unsigned long bits)
|
||||
{
|
||||
#if defined(CONFIG_ALPHA_EV6) && defined(CONFIG_ALPHA_EV67)
|
||||
/* Simple if have CIX instructions */
|
||||
return __kernel_cttz(bits);
|
||||
#else
|
||||
unsigned long t1, t2, t3;
|
||||
/* Retain lowest set bit only */
|
||||
bits &= -bits;
|
||||
/* Binary search for lowest set bit */
|
||||
t1 = bits & 0xf0;
|
||||
t2 = bits & 0xcc;
|
||||
t3 = bits & 0xaa;
|
||||
if (t1) t1 = 4;
|
||||
if (t2) t2 = 2;
|
||||
if (t3) t3 = 1;
|
||||
return t1 + t2 + t3;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* _ASM_WORD_AT_A_TIME_H */
|
||||
|
|
@ -52,7 +52,6 @@ EXPORT_SYMBOL(alpha_write_fp_reg_s);
|
|||
|
||||
/* entry.S */
|
||||
EXPORT_SYMBOL(kernel_thread);
|
||||
EXPORT_SYMBOL(kernel_execve);
|
||||
|
||||
/* Networking helper routines. */
|
||||
EXPORT_SYMBOL(csum_tcpudp_magic);
|
||||
|
|
@ -74,8 +73,6 @@ EXPORT_SYMBOL(alpha_fp_emul);
|
|||
*/
|
||||
EXPORT_SYMBOL(__copy_user);
|
||||
EXPORT_SYMBOL(__do_clear_user);
|
||||
EXPORT_SYMBOL(__strncpy_from_user);
|
||||
EXPORT_SYMBOL(__strnlen_user);
|
||||
|
||||
/*
|
||||
* SMP-specific symbols.
|
||||
|
|
|
|||
|
|
@ -663,58 +663,6 @@ kernel_thread:
|
|||
br ret_to_kernel
|
||||
.end kernel_thread
|
||||
|
||||
/*
|
||||
* kernel_execve(path, argv, envp)
|
||||
*/
|
||||
.align 4
|
||||
.globl kernel_execve
|
||||
.ent kernel_execve
|
||||
kernel_execve:
|
||||
/* We can be called from a module. */
|
||||
ldgp $gp, 0($27)
|
||||
lda $sp, -(32+SIZEOF_PT_REGS+8)($sp)
|
||||
.frame $sp, 32+SIZEOF_PT_REGS+8, $26, 0
|
||||
stq $26, 0($sp)
|
||||
stq $16, 8($sp)
|
||||
stq $17, 16($sp)
|
||||
stq $18, 24($sp)
|
||||
.prologue 1
|
||||
|
||||
lda $16, 32($sp)
|
||||
lda $17, 0
|
||||
lda $18, SIZEOF_PT_REGS
|
||||
bsr $26, memset !samegp
|
||||
|
||||
/* Avoid the HAE being gratuitously wrong, which would cause us
|
||||
to do the whole turn off interrupts thing and restore it. */
|
||||
ldq $2, alpha_mv+HAE_CACHE
|
||||
stq $2, 152+32($sp)
|
||||
|
||||
ldq $16, 8($sp)
|
||||
ldq $17, 16($sp)
|
||||
ldq $18, 24($sp)
|
||||
lda $19, 32($sp)
|
||||
bsr $26, do_execve !samegp
|
||||
|
||||
ldq $26, 0($sp)
|
||||
bne $0, 1f /* error! */
|
||||
|
||||
/* Move the temporary pt_regs struct from its current location
|
||||
to the top of the kernel stack frame. See copy_thread for
|
||||
details for a normal process. */
|
||||
lda $16, 0x4000 - SIZEOF_PT_REGS($8)
|
||||
lda $17, 32($sp)
|
||||
lda $18, SIZEOF_PT_REGS
|
||||
bsr $26, memmove !samegp
|
||||
|
||||
/* Take that over as our new stack frame and visit userland! */
|
||||
lda $sp, 0x4000 - SIZEOF_PT_REGS($8)
|
||||
br $31, ret_from_sys_call
|
||||
|
||||
1: lda $sp, 32+SIZEOF_PT_REGS+8($sp)
|
||||
ret
|
||||
.end kernel_execve
|
||||
|
||||
|
||||
/*
|
||||
* Special system calls. Most of these are special in that they either
|
||||
|
|
@ -796,115 +744,6 @@ sys_rt_sigreturn:
|
|||
br ret_from_sys_call
|
||||
.end sys_rt_sigreturn
|
||||
|
||||
.align 4
|
||||
.globl sys_sethae
|
||||
.ent sys_sethae
|
||||
sys_sethae:
|
||||
.prologue 0
|
||||
stq $16, 152($sp)
|
||||
ret
|
||||
.end sys_sethae
|
||||
|
||||
.align 4
|
||||
.globl osf_getpriority
|
||||
.ent osf_getpriority
|
||||
osf_getpriority:
|
||||
lda $sp, -16($sp)
|
||||
stq $26, 0($sp)
|
||||
.prologue 0
|
||||
|
||||
jsr $26, sys_getpriority
|
||||
|
||||
ldq $26, 0($sp)
|
||||
blt $0, 1f
|
||||
|
||||
/* Return value is the unbiased priority, i.e. 20 - prio.
|
||||
This does result in negative return values, so signal
|
||||
no error by writing into the R0 slot. */
|
||||
lda $1, 20
|
||||
stq $31, 16($sp)
|
||||
subl $1, $0, $0
|
||||
unop
|
||||
|
||||
1: lda $sp, 16($sp)
|
||||
ret
|
||||
.end osf_getpriority
|
||||
|
||||
.align 4
|
||||
.globl sys_getxuid
|
||||
.ent sys_getxuid
|
||||
sys_getxuid:
|
||||
.prologue 0
|
||||
ldq $2, TI_TASK($8)
|
||||
ldq $3, TASK_CRED($2)
|
||||
ldl $0, CRED_UID($3)
|
||||
ldl $1, CRED_EUID($3)
|
||||
stq $1, 80($sp)
|
||||
ret
|
||||
.end sys_getxuid
|
||||
|
||||
.align 4
|
||||
.globl sys_getxgid
|
||||
.ent sys_getxgid
|
||||
sys_getxgid:
|
||||
.prologue 0
|
||||
ldq $2, TI_TASK($8)
|
||||
ldq $3, TASK_CRED($2)
|
||||
ldl $0, CRED_GID($3)
|
||||
ldl $1, CRED_EGID($3)
|
||||
stq $1, 80($sp)
|
||||
ret
|
||||
.end sys_getxgid
|
||||
|
||||
.align 4
|
||||
.globl sys_getxpid
|
||||
.ent sys_getxpid
|
||||
sys_getxpid:
|
||||
.prologue 0
|
||||
ldq $2, TI_TASK($8)
|
||||
|
||||
/* See linux/kernel/timer.c sys_getppid for discussion
|
||||
about this loop. */
|
||||
ldq $3, TASK_GROUP_LEADER($2)
|
||||
ldq $4, TASK_REAL_PARENT($3)
|
||||
ldl $0, TASK_TGID($2)
|
||||
1: ldl $1, TASK_TGID($4)
|
||||
#ifdef CONFIG_SMP
|
||||
mov $4, $5
|
||||
mb
|
||||
ldq $3, TASK_GROUP_LEADER($2)
|
||||
ldq $4, TASK_REAL_PARENT($3)
|
||||
cmpeq $4, $5, $5
|
||||
beq $5, 1b
|
||||
#endif
|
||||
stq $1, 80($sp)
|
||||
ret
|
||||
.end sys_getxpid
|
||||
|
||||
.align 4
|
||||
.globl sys_alpha_pipe
|
||||
.ent sys_alpha_pipe
|
||||
sys_alpha_pipe:
|
||||
lda $sp, -16($sp)
|
||||
stq $26, 0($sp)
|
||||
.prologue 0
|
||||
|
||||
mov $31, $17
|
||||
lda $16, 8($sp)
|
||||
jsr $26, do_pipe_flags
|
||||
|
||||
ldq $26, 0($sp)
|
||||
bne $0, 1f
|
||||
|
||||
/* The return values are in $0 and $20. */
|
||||
ldl $1, 12($sp)
|
||||
ldl $0, 8($sp)
|
||||
|
||||
stq $1, 80+16($sp)
|
||||
1: lda $sp, 16($sp)
|
||||
ret
|
||||
.end sys_alpha_pipe
|
||||
|
||||
.align 4
|
||||
.globl sys_execve
|
||||
.ent sys_execve
|
||||
|
|
|
|||
|
|
@ -1404,3 +1404,52 @@ SYSCALL_DEFINE3(osf_writev, unsigned long, fd,
|
|||
}
|
||||
|
||||
#endif
|
||||
|
||||
SYSCALL_DEFINE2(osf_getpriority, int, which, int, who)
|
||||
{
|
||||
int prio = sys_getpriority(which, who);
|
||||
if (prio >= 0) {
|
||||
/* Return value is the unbiased priority, i.e. 20 - prio.
|
||||
This does result in negative return values, so signal
|
||||
no error */
|
||||
force_successful_syscall_return();
|
||||
prio = 20 - prio;
|
||||
}
|
||||
return prio;
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE0(getxuid)
|
||||
{
|
||||
current_pt_regs()->r20 = sys_geteuid();
|
||||
return sys_getuid();
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE0(getxgid)
|
||||
{
|
||||
current_pt_regs()->r20 = sys_getegid();
|
||||
return sys_getgid();
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE0(getxpid)
|
||||
{
|
||||
current_pt_regs()->r20 = sys_getppid();
|
||||
return sys_getpid();
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE0(alpha_pipe)
|
||||
{
|
||||
int fd[2];
|
||||
int res = do_pipe_flags(fd, 0);
|
||||
if (!res) {
|
||||
/* The return values are in $0 and $20. */
|
||||
current_pt_regs()->r20 = fd[1];
|
||||
res = fd[0];
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE1(sethae, unsigned long, val)
|
||||
{
|
||||
current_pt_regs()->hae = val;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -455,3 +455,22 @@ get_wchan(struct task_struct *p)
|
|||
}
|
||||
return pc;
|
||||
}
|
||||
|
||||
int kernel_execve(const char *path, const char *const argv[], const char *const envp[])
|
||||
{
|
||||
/* Avoid the HAE being gratuitously wrong, which would cause us
|
||||
to do the whole turn off interrupts thing and restore it. */
|
||||
struct pt_regs regs = {.hae = alpha_mv.hae_cache};
|
||||
int err = do_execve(path, argv, envp, ®s);
|
||||
if (!err) {
|
||||
struct pt_regs *p = current_pt_regs();
|
||||
/* copy regs to normal position and off to userland we go... */
|
||||
*p = regs;
|
||||
__asm__ __volatile__ (
|
||||
"mov %0, $sp;"
|
||||
"br $31, ret_from_sys_call"
|
||||
: : "r"(p));
|
||||
}
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(kernel_execve);
|
||||
|
|
|
|||
|
|
@ -111,7 +111,7 @@ sys_call_table:
|
|||
.quad sys_socket
|
||||
.quad sys_connect
|
||||
.quad sys_accept
|
||||
.quad osf_getpriority /* 100 */
|
||||
.quad sys_osf_getpriority /* 100 */
|
||||
.quad sys_send
|
||||
.quad sys_recv
|
||||
.quad sys_sigreturn
|
||||
|
|
@ -522,6 +522,8 @@ sys_call_table:
|
|||
.quad sys_setns
|
||||
.quad sys_accept4
|
||||
.quad sys_sendmmsg
|
||||
.quad sys_process_vm_readv
|
||||
.quad sys_process_vm_writev /* 505 */
|
||||
|
||||
.size sys_call_table, . - sys_call_table
|
||||
.type sys_call_table, @object
|
||||
|
|
|
|||
|
|
@ -31,8 +31,6 @@ lib-y = __divqu.o __remqu.o __divlu.o __remlu.o \
|
|||
$(ev6-y)memchr.o \
|
||||
$(ev6-y)copy_user.o \
|
||||
$(ev6-y)clear_user.o \
|
||||
$(ev6-y)strncpy_from_user.o \
|
||||
$(ev67-y)strlen_user.o \
|
||||
$(ev6-y)csum_ipv6_magic.o \
|
||||
$(ev6-y)clear_page.o \
|
||||
$(ev6-y)copy_page.o \
|
||||
|
|
|
|||
|
|
@ -1,424 +0,0 @@
|
|||
/*
|
||||
* arch/alpha/lib/ev6-strncpy_from_user.S
|
||||
* 21264 version contributed by Rick Gorton <rick.gorton@alpha-processor.com>
|
||||
*
|
||||
* Just like strncpy except in the return value:
|
||||
*
|
||||
* -EFAULT if an exception occurs before the terminator is copied.
|
||||
* N if the buffer filled.
|
||||
*
|
||||
* Otherwise the length of the string is returned.
|
||||
*
|
||||
* Much of the information about 21264 scheduling/coding comes from:
|
||||
* Compiler Writer's Guide for the Alpha 21264
|
||||
* abbreviated as 'CWG' in other comments here
|
||||
* ftp.digital.com/pub/Digital/info/semiconductor/literature/dsc-library.html
|
||||
* Scheduling notation:
|
||||
* E - either cluster
|
||||
* U - upper subcluster; U0 - subcluster U0; U1 - subcluster U1
|
||||
* L - lower subcluster; L0 - subcluster L0; L1 - subcluster L1
|
||||
* A bunch of instructions got moved and temp registers were changed
|
||||
* to aid in scheduling. Control flow was also re-arranged to eliminate
|
||||
* branches, and to provide longer code sequences to enable better scheduling.
|
||||
* A total rewrite (using byte load/stores for start & tail sequences)
|
||||
* is desirable, but very difficult to do without a from-scratch rewrite.
|
||||
* Save that for the future.
|
||||
*/
|
||||
|
||||
|
||||
#include <asm/errno.h>
|
||||
#include <asm/regdef.h>
|
||||
|
||||
|
||||
/* Allow an exception for an insn; exit if we get one. */
|
||||
#define EX(x,y...) \
|
||||
99: x,##y; \
|
||||
.section __ex_table,"a"; \
|
||||
.long 99b - .; \
|
||||
lda $31, $exception-99b($0); \
|
||||
.previous
|
||||
|
||||
|
||||
.set noat
|
||||
.set noreorder
|
||||
.text
|
||||
|
||||
.globl __strncpy_from_user
|
||||
.ent __strncpy_from_user
|
||||
.frame $30, 0, $26
|
||||
.prologue 0
|
||||
|
||||
.align 4
|
||||
__strncpy_from_user:
|
||||
and a0, 7, t3 # E : find dest misalignment
|
||||
beq a2, $zerolength # U :
|
||||
|
||||
/* Are source and destination co-aligned? */
|
||||
mov a0, v0 # E : save the string start
|
||||
xor a0, a1, t4 # E :
|
||||
EX( ldq_u t1, 0(a1) ) # L : Latency=3 load first quadword
|
||||
ldq_u t0, 0(a0) # L : load first (partial) aligned dest quadword
|
||||
|
||||
addq a2, t3, a2 # E : bias count by dest misalignment
|
||||
subq a2, 1, a3 # E :
|
||||
addq zero, 1, t10 # E :
|
||||
and t4, 7, t4 # E : misalignment between the two
|
||||
|
||||
and a3, 7, t6 # E : number of tail bytes
|
||||
sll t10, t6, t10 # E : t10 = bitmask of last count byte
|
||||
bne t4, $unaligned # U :
|
||||
lda t2, -1 # E : build a mask against false zero
|
||||
|
||||
/*
|
||||
* We are co-aligned; take care of a partial first word.
|
||||
* On entry to this basic block:
|
||||
* t0 == the first destination word for masking back in
|
||||
* t1 == the first source word.
|
||||
*/
|
||||
|
||||
srl a3, 3, a2 # E : a2 = loop counter = (count - 1)/8
|
||||
addq a1, 8, a1 # E :
|
||||
mskqh t2, a1, t2 # U : detection in the src word
|
||||
nop
|
||||
|
||||
/* Create the 1st output word and detect 0's in the 1st input word. */
|
||||
mskqh t1, a1, t3 # U :
|
||||
mskql t0, a1, t0 # U : assemble the first output word
|
||||
ornot t1, t2, t2 # E :
|
||||
nop
|
||||
|
||||
cmpbge zero, t2, t8 # E : bits set iff null found
|
||||
or t0, t3, t0 # E :
|
||||
beq a2, $a_eoc # U :
|
||||
bne t8, $a_eos # U : 2nd branch in a quad. Bad.
|
||||
|
||||
/* On entry to this basic block:
|
||||
* t0 == a source quad not containing a null.
|
||||
* a0 - current aligned destination address
|
||||
* a1 - current aligned source address
|
||||
* a2 - count of quadwords to move.
|
||||
* NOTE: Loop improvement - unrolling this is going to be
|
||||
* a huge win, since we're going to stall otherwise.
|
||||
* Fix this later. For _really_ large copies, look
|
||||
* at using wh64 on a look-ahead basis. See the code
|
||||
* in clear_user.S and copy_user.S.
|
||||
* Presumably, since (a0) and (a1) do not overlap (by C definition)
|
||||
* Lots of nops here:
|
||||
* - Separate loads from stores
|
||||
* - Keep it to 1 branch/quadpack so the branch predictor
|
||||
* can train.
|
||||
*/
|
||||
$a_loop:
|
||||
stq_u t0, 0(a0) # L :
|
||||
addq a0, 8, a0 # E :
|
||||
nop
|
||||
subq a2, 1, a2 # E :
|
||||
|
||||
EX( ldq_u t0, 0(a1) ) # L :
|
||||
addq a1, 8, a1 # E :
|
||||
cmpbge zero, t0, t8 # E : Stall 2 cycles on t0
|
||||
beq a2, $a_eoc # U :
|
||||
|
||||
beq t8, $a_loop # U :
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
|
||||
/* Take care of the final (partial) word store. At this point
|
||||
* the end-of-count bit is set in t8 iff it applies.
|
||||
*
|
||||
* On entry to this basic block we have:
|
||||
* t0 == the source word containing the null
|
||||
* t8 == the cmpbge mask that found it.
|
||||
*/
|
||||
$a_eos:
|
||||
negq t8, t12 # E : find low bit set
|
||||
and t8, t12, t12 # E :
|
||||
|
||||
/* We're doing a partial word store and so need to combine
|
||||
our source and original destination words. */
|
||||
ldq_u t1, 0(a0) # L :
|
||||
subq t12, 1, t6 # E :
|
||||
|
||||
or t12, t6, t8 # E :
|
||||
zapnot t0, t8, t0 # U : clear src bytes > null
|
||||
zap t1, t8, t1 # U : clear dst bytes <= null
|
||||
or t0, t1, t0 # E :
|
||||
|
||||
stq_u t0, 0(a0) # L :
|
||||
br $finish_up # L0 :
|
||||
nop
|
||||
nop
|
||||
|
||||
/* Add the end-of-count bit to the eos detection bitmask. */
|
||||
.align 4
|
||||
$a_eoc:
|
||||
or t10, t8, t8
|
||||
br $a_eos
|
||||
nop
|
||||
nop
|
||||
|
||||
|
||||
/* The source and destination are not co-aligned. Align the destination
|
||||
and cope. We have to be very careful about not reading too much and
|
||||
causing a SEGV. */
|
||||
|
||||
.align 4
|
||||
$u_head:
|
||||
/* We know just enough now to be able to assemble the first
|
||||
full source word. We can still find a zero at the end of it
|
||||
that prevents us from outputting the whole thing.
|
||||
|
||||
On entry to this basic block:
|
||||
t0 == the first dest word, unmasked
|
||||
t1 == the shifted low bits of the first source word
|
||||
t6 == bytemask that is -1 in dest word bytes */
|
||||
|
||||
EX( ldq_u t2, 8(a1) ) # L : load second src word
|
||||
addq a1, 8, a1 # E :
|
||||
mskql t0, a0, t0 # U : mask trailing garbage in dst
|
||||
extqh t2, a1, t4 # U :
|
||||
|
||||
or t1, t4, t1 # E : first aligned src word complete
|
||||
mskqh t1, a0, t1 # U : mask leading garbage in src
|
||||
or t0, t1, t0 # E : first output word complete
|
||||
or t0, t6, t6 # E : mask original data for zero test
|
||||
|
||||
cmpbge zero, t6, t8 # E :
|
||||
beq a2, $u_eocfin # U :
|
||||
bne t8, $u_final # U : bad news - 2nd branch in a quad
|
||||
lda t6, -1 # E : mask out the bits we have
|
||||
|
||||
mskql t6, a1, t6 # U : already seen
|
||||
stq_u t0, 0(a0) # L : store first output word
|
||||
or t6, t2, t2 # E :
|
||||
cmpbge zero, t2, t8 # E : find nulls in second partial
|
||||
|
||||
addq a0, 8, a0 # E :
|
||||
subq a2, 1, a2 # E :
|
||||
bne t8, $u_late_head_exit # U :
|
||||
nop
|
||||
|
||||
/* Finally, we've got all the stupid leading edge cases taken care
|
||||
of and we can set up to enter the main loop. */
|
||||
|
||||
extql t2, a1, t1 # U : position hi-bits of lo word
|
||||
EX( ldq_u t2, 8(a1) ) # L : read next high-order source word
|
||||
addq a1, 8, a1 # E :
|
||||
cmpbge zero, t2, t8 # E :
|
||||
|
||||
beq a2, $u_eoc # U :
|
||||
bne t8, $u_eos # U :
|
||||
nop
|
||||
nop
|
||||
|
||||
/* Unaligned copy main loop. In order to avoid reading too much,
|
||||
the loop is structured to detect zeros in aligned source words.
|
||||
This has, unfortunately, effectively pulled half of a loop
|
||||
iteration out into the head and half into the tail, but it does
|
||||
prevent nastiness from accumulating in the very thing we want
|
||||
to run as fast as possible.
|
||||
|
||||
On entry to this basic block:
|
||||
t1 == the shifted high-order bits from the previous source word
|
||||
t2 == the unshifted current source word
|
||||
|
||||
We further know that t2 does not contain a null terminator. */
|
||||
|
||||
/*
|
||||
* Extra nops here:
|
||||
* separate load quads from store quads
|
||||
* only one branch/quad to permit predictor training
|
||||
*/
|
||||
|
||||
.align 4
|
||||
$u_loop:
|
||||
extqh t2, a1, t0 # U : extract high bits for current word
|
||||
addq a1, 8, a1 # E :
|
||||
extql t2, a1, t3 # U : extract low bits for next time
|
||||
addq a0, 8, a0 # E :
|
||||
|
||||
or t0, t1, t0 # E : current dst word now complete
|
||||
EX( ldq_u t2, 0(a1) ) # L : load high word for next time
|
||||
subq a2, 1, a2 # E :
|
||||
nop
|
||||
|
||||
stq_u t0, -8(a0) # L : save the current word
|
||||
mov t3, t1 # E :
|
||||
cmpbge zero, t2, t8 # E : test new word for eos
|
||||
beq a2, $u_eoc # U :
|
||||
|
||||
beq t8, $u_loop # U :
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
|
||||
/* We've found a zero somewhere in the source word we just read.
|
||||
If it resides in the lower half, we have one (probably partial)
|
||||
word to write out, and if it resides in the upper half, we
|
||||
have one full and one partial word left to write out.
|
||||
|
||||
On entry to this basic block:
|
||||
t1 == the shifted high-order bits from the previous source word
|
||||
t2 == the unshifted current source word. */
|
||||
.align 4
|
||||
$u_eos:
|
||||
extqh t2, a1, t0 # U :
|
||||
or t0, t1, t0 # E : first (partial) source word complete
|
||||
cmpbge zero, t0, t8 # E : is the null in this first bit?
|
||||
nop
|
||||
|
||||
bne t8, $u_final # U :
|
||||
stq_u t0, 0(a0) # L : the null was in the high-order bits
|
||||
addq a0, 8, a0 # E :
|
||||
subq a2, 1, a2 # E :
|
||||
|
||||
.align 4
|
||||
$u_late_head_exit:
|
||||
extql t2, a1, t0 # U :
|
||||
cmpbge zero, t0, t8 # E :
|
||||
or t8, t10, t6 # E :
|
||||
cmoveq a2, t6, t8 # E :
|
||||
|
||||
/* Take care of a final (probably partial) result word.
|
||||
On entry to this basic block:
|
||||
t0 == assembled source word
|
||||
t8 == cmpbge mask that found the null. */
|
||||
.align 4
|
||||
$u_final:
|
||||
negq t8, t6 # E : isolate low bit set
|
||||
and t6, t8, t12 # E :
|
||||
ldq_u t1, 0(a0) # L :
|
||||
subq t12, 1, t6 # E :
|
||||
|
||||
or t6, t12, t8 # E :
|
||||
zapnot t0, t8, t0 # U : kill source bytes > null
|
||||
zap t1, t8, t1 # U : kill dest bytes <= null
|
||||
or t0, t1, t0 # E :
|
||||
|
||||
stq_u t0, 0(a0) # E :
|
||||
br $finish_up # U :
|
||||
nop
|
||||
nop
|
||||
|
||||
.align 4
|
||||
$u_eoc: # end-of-count
|
||||
extqh t2, a1, t0 # U :
|
||||
or t0, t1, t0 # E :
|
||||
cmpbge zero, t0, t8 # E :
|
||||
nop
|
||||
|
||||
.align 4
|
||||
$u_eocfin: # end-of-count, final word
|
||||
or t10, t8, t8 # E :
|
||||
br $u_final # U :
|
||||
nop
|
||||
nop
|
||||
|
||||
/* Unaligned copy entry point. */
|
||||
.align 4
|
||||
$unaligned:
|
||||
|
||||
srl a3, 3, a2 # U : a2 = loop counter = (count - 1)/8
|
||||
and a0, 7, t4 # E : find dest misalignment
|
||||
and a1, 7, t5 # E : find src misalignment
|
||||
mov zero, t0 # E :
|
||||
|
||||
/* Conditionally load the first destination word and a bytemask
|
||||
with 0xff indicating that the destination byte is sacrosanct. */
|
||||
|
||||
mov zero, t6 # E :
|
||||
beq t4, 1f # U :
|
||||
ldq_u t0, 0(a0) # L :
|
||||
lda t6, -1 # E :
|
||||
|
||||
mskql t6, a0, t6 # E :
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
|
||||
.align 4
|
||||
1:
|
||||
subq a1, t4, a1 # E : sub dest misalignment from src addr
|
||||
/* If source misalignment is larger than dest misalignment, we need
|
||||
extra startup checks to avoid SEGV. */
|
||||
cmplt t4, t5, t12 # E :
|
||||
extql t1, a1, t1 # U : shift src into place
|
||||
lda t2, -1 # E : for creating masks later
|
||||
|
||||
beq t12, $u_head # U :
|
||||
mskqh t2, t5, t2 # U : begin src byte validity mask
|
||||
cmpbge zero, t1, t8 # E : is there a zero?
|
||||
nop
|
||||
|
||||
extql t2, a1, t2 # U :
|
||||
or t8, t10, t5 # E : test for end-of-count too
|
||||
cmpbge zero, t2, t3 # E :
|
||||
cmoveq a2, t5, t8 # E : Latency=2, extra map slot
|
||||
|
||||
nop # E : goes with cmov
|
||||
andnot t8, t3, t8 # E :
|
||||
beq t8, $u_head # U :
|
||||
nop
|
||||
|
||||
/* At this point we've found a zero in the first partial word of
|
||||
the source. We need to isolate the valid source data and mask
|
||||
it into the original destination data. (Incidentally, we know
|
||||
that we'll need at least one byte of that original dest word.) */
|
||||
|
||||
ldq_u t0, 0(a0) # L :
|
||||
negq t8, t6 # E : build bitmask of bytes <= zero
|
||||
mskqh t1, t4, t1 # U :
|
||||
and t6, t8, t12 # E :
|
||||
|
||||
subq t12, 1, t6 # E :
|
||||
or t6, t12, t8 # E :
|
||||
zapnot t2, t8, t2 # U : prepare source word; mirror changes
|
||||
zapnot t1, t8, t1 # U : to source validity mask
|
||||
|
||||
andnot t0, t2, t0 # E : zero place for source to reside
|
||||
or t0, t1, t0 # E : and put it there
|
||||
stq_u t0, 0(a0) # L :
|
||||
nop
|
||||
|
||||
.align 4
|
||||
$finish_up:
|
||||
zapnot t0, t12, t4 # U : was last byte written null?
|
||||
and t12, 0xf0, t3 # E : binary search for the address of the
|
||||
cmovne t4, 1, t4 # E : Latency=2, extra map slot
|
||||
nop # E : with cmovne
|
||||
|
||||
and t12, 0xcc, t2 # E : last byte written
|
||||
and t12, 0xaa, t1 # E :
|
||||
cmovne t3, 4, t3 # E : Latency=2, extra map slot
|
||||
nop # E : with cmovne
|
||||
|
||||
bic a0, 7, t0
|
||||
cmovne t2, 2, t2 # E : Latency=2, extra map slot
|
||||
nop # E : with cmovne
|
||||
nop
|
||||
|
||||
cmovne t1, 1, t1 # E : Latency=2, extra map slot
|
||||
nop # E : with cmovne
|
||||
addq t0, t3, t0 # E :
|
||||
addq t1, t2, t1 # E :
|
||||
|
||||
addq t0, t1, t0 # E :
|
||||
addq t0, t4, t0 # add one if we filled the buffer
|
||||
subq t0, v0, v0 # find string length
|
||||
ret # L0 :
|
||||
|
||||
.align 4
|
||||
$zerolength:
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
clr v0
|
||||
|
||||
$exception:
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
ret
|
||||
|
||||
.end __strncpy_from_user
|
||||
|
|
@ -1,107 +0,0 @@
|
|||
/*
|
||||
* arch/alpha/lib/ev67-strlen_user.S
|
||||
* 21264 version contributed by Rick Gorton <rick.gorton@api-networks.com>
|
||||
*
|
||||
* Return the length of the string including the NULL terminator
|
||||
* (strlen+1) or zero if an error occurred.
|
||||
*
|
||||
* In places where it is critical to limit the processing time,
|
||||
* and the data is not trusted, strnlen_user() should be used.
|
||||
* It will return a value greater than its second argument if
|
||||
* that limit would be exceeded. This implementation is allowed
|
||||
* to access memory beyond the limit, but will not cross a page
|
||||
* boundary when doing so.
|
||||
*
|
||||
* Much of the information about 21264 scheduling/coding comes from:
|
||||
* Compiler Writer's Guide for the Alpha 21264
|
||||
* abbreviated as 'CWG' in other comments here
|
||||
* ftp.digital.com/pub/Digital/info/semiconductor/literature/dsc-library.html
|
||||
* Scheduling notation:
|
||||
* E - either cluster
|
||||
* U - upper subcluster; U0 - subcluster U0; U1 - subcluster U1
|
||||
* L - lower subcluster; L0 - subcluster L0; L1 - subcluster L1
|
||||
* Try not to change the actual algorithm if possible for consistency.
|
||||
*/
|
||||
|
||||
#include <asm/regdef.h>
|
||||
|
||||
|
||||
/* Allow an exception for an insn; exit if we get one. */
|
||||
#define EX(x,y...) \
|
||||
99: x,##y; \
|
||||
.section __ex_table,"a"; \
|
||||
.long 99b - .; \
|
||||
lda v0, $exception-99b(zero); \
|
||||
.previous
|
||||
|
||||
|
||||
.set noreorder
|
||||
.set noat
|
||||
.text
|
||||
|
||||
.globl __strlen_user
|
||||
.ent __strlen_user
|
||||
.frame sp, 0, ra
|
||||
|
||||
.align 4
|
||||
__strlen_user:
|
||||
ldah a1, 32767(zero) # do not use plain strlen_user() for strings
|
||||
# that might be almost 2 GB long; you should
|
||||
# be using strnlen_user() instead
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
|
||||
.globl __strnlen_user
|
||||
|
||||
.align 4
|
||||
__strnlen_user:
|
||||
.prologue 0
|
||||
EX( ldq_u t0, 0(a0) ) # L : load first quadword (a0 may be misaligned)
|
||||
lda t1, -1(zero) # E :
|
||||
|
||||
insqh t1, a0, t1 # U :
|
||||
andnot a0, 7, v0 # E :
|
||||
or t1, t0, t0 # E :
|
||||
subq a0, 1, a0 # E : get our +1 for the return
|
||||
|
||||
cmpbge zero, t0, t1 # E : t1 <- bitmask: bit i == 1 <==> i-th byte == 0
|
||||
subq a1, 7, t2 # E :
|
||||
subq a0, v0, t0 # E :
|
||||
bne t1, $found # U :
|
||||
|
||||
addq t2, t0, t2 # E :
|
||||
addq a1, 1, a1 # E :
|
||||
nop # E :
|
||||
nop # E :
|
||||
|
||||
.align 4
|
||||
$loop: ble t2, $limit # U :
|
||||
EX( ldq t0, 8(v0) ) # L :
|
||||
nop # E :
|
||||
nop # E :
|
||||
|
||||
cmpbge zero, t0, t1 # E :
|
||||
subq t2, 8, t2 # E :
|
||||
addq v0, 8, v0 # E : addr += 8
|
||||
beq t1, $loop # U :
|
||||
|
||||
$found: cttz t1, t2 # U0 :
|
||||
addq v0, t2, v0 # E :
|
||||
subq v0, a0, v0 # E :
|
||||
ret # L0 :
|
||||
|
||||
$exception:
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
ret
|
||||
|
||||
.align 4 # currently redundant
|
||||
$limit:
|
||||
nop
|
||||
nop
|
||||
subq a1, t2, v0
|
||||
ret
|
||||
|
||||
.end __strlen_user
|
||||
|
|
@ -1,91 +0,0 @@
|
|||
/*
|
||||
* arch/alpha/lib/strlen_user.S
|
||||
*
|
||||
* Return the length of the string including the NUL terminator
|
||||
* (strlen+1) or zero if an error occurred.
|
||||
*
|
||||
* In places where it is critical to limit the processing time,
|
||||
* and the data is not trusted, strnlen_user() should be used.
|
||||
* It will return a value greater than its second argument if
|
||||
* that limit would be exceeded. This implementation is allowed
|
||||
* to access memory beyond the limit, but will not cross a page
|
||||
* boundary when doing so.
|
||||
*/
|
||||
|
||||
#include <asm/regdef.h>
|
||||
|
||||
|
||||
/* Allow an exception for an insn; exit if we get one. */
|
||||
#define EX(x,y...) \
|
||||
99: x,##y; \
|
||||
.section __ex_table,"a"; \
|
||||
.long 99b - .; \
|
||||
lda v0, $exception-99b(zero); \
|
||||
.previous
|
||||
|
||||
|
||||
.set noreorder
|
||||
.set noat
|
||||
.text
|
||||
|
||||
.globl __strlen_user
|
||||
.ent __strlen_user
|
||||
.frame sp, 0, ra
|
||||
|
||||
.align 3
|
||||
__strlen_user:
|
||||
ldah a1, 32767(zero) # do not use plain strlen_user() for strings
|
||||
# that might be almost 2 GB long; you should
|
||||
# be using strnlen_user() instead
|
||||
|
||||
.globl __strnlen_user
|
||||
|
||||
.align 3
|
||||
__strnlen_user:
|
||||
.prologue 0
|
||||
|
||||
EX( ldq_u t0, 0(a0) ) # load first quadword (a0 may be misaligned)
|
||||
lda t1, -1(zero)
|
||||
insqh t1, a0, t1
|
||||
andnot a0, 7, v0
|
||||
or t1, t0, t0
|
||||
subq a0, 1, a0 # get our +1 for the return
|
||||
cmpbge zero, t0, t1 # t1 <- bitmask: bit i == 1 <==> i-th byte == 0
|
||||
subq a1, 7, t2
|
||||
subq a0, v0, t0
|
||||
bne t1, $found
|
||||
|
||||
addq t2, t0, t2
|
||||
addq a1, 1, a1
|
||||
|
||||
.align 3
|
||||
$loop: ble t2, $limit
|
||||
EX( ldq t0, 8(v0) )
|
||||
subq t2, 8, t2
|
||||
addq v0, 8, v0 # addr += 8
|
||||
cmpbge zero, t0, t1
|
||||
beq t1, $loop
|
||||
|
||||
$found: negq t1, t2 # clear all but least set bit
|
||||
and t1, t2, t1
|
||||
|
||||
and t1, 0xf0, t2 # binary search for that set bit
|
||||
and t1, 0xcc, t3
|
||||
and t1, 0xaa, t4
|
||||
cmovne t2, 4, t2
|
||||
cmovne t3, 2, t3
|
||||
cmovne t4, 1, t4
|
||||
addq t2, t3, t2
|
||||
addq v0, t4, v0
|
||||
addq v0, t2, v0
|
||||
nop # dual issue next two on ev4 and ev5
|
||||
subq v0, a0, v0
|
||||
$exception:
|
||||
ret
|
||||
|
||||
.align 3 # currently redundant
|
||||
$limit:
|
||||
subq a1, t2, v0
|
||||
ret
|
||||
|
||||
.end __strlen_user
|
||||
|
|
@ -1,339 +0,0 @@
|
|||
/*
|
||||
* arch/alpha/lib/strncpy_from_user.S
|
||||
* Contributed by Richard Henderson (rth@tamu.edu)
|
||||
*
|
||||
* Just like strncpy except in the return value:
|
||||
*
|
||||
* -EFAULT if an exception occurs before the terminator is copied.
|
||||
* N if the buffer filled.
|
||||
*
|
||||
* Otherwise the length of the string is returned.
|
||||
*/
|
||||
|
||||
|
||||
#include <asm/errno.h>
|
||||
#include <asm/regdef.h>
|
||||
|
||||
|
||||
/* Allow an exception for an insn; exit if we get one. */
|
||||
#define EX(x,y...) \
|
||||
99: x,##y; \
|
||||
.section __ex_table,"a"; \
|
||||
.long 99b - .; \
|
||||
lda $31, $exception-99b($0); \
|
||||
.previous
|
||||
|
||||
|
||||
.set noat
|
||||
.set noreorder
|
||||
.text
|
||||
|
||||
.globl __strncpy_from_user
|
||||
.ent __strncpy_from_user
|
||||
.frame $30, 0, $26
|
||||
.prologue 0
|
||||
|
||||
.align 3
|
||||
$aligned:
|
||||
/* On entry to this basic block:
|
||||
t0 == the first destination word for masking back in
|
||||
t1 == the first source word. */
|
||||
|
||||
/* Create the 1st output word and detect 0's in the 1st input word. */
|
||||
lda t2, -1 # e1 : build a mask against false zero
|
||||
mskqh t2, a1, t2 # e0 : detection in the src word
|
||||
mskqh t1, a1, t3 # e0 :
|
||||
ornot t1, t2, t2 # .. e1 :
|
||||
mskql t0, a1, t0 # e0 : assemble the first output word
|
||||
cmpbge zero, t2, t8 # .. e1 : bits set iff null found
|
||||
or t0, t3, t0 # e0 :
|
||||
beq a2, $a_eoc # .. e1 :
|
||||
bne t8, $a_eos # .. e1 :
|
||||
|
||||
/* On entry to this basic block:
|
||||
t0 == a source word not containing a null. */
|
||||
|
||||
$a_loop:
|
||||
stq_u t0, 0(a0) # e0 :
|
||||
addq a0, 8, a0 # .. e1 :
|
||||
EX( ldq_u t0, 0(a1) ) # e0 :
|
||||
addq a1, 8, a1 # .. e1 :
|
||||
subq a2, 1, a2 # e0 :
|
||||
cmpbge zero, t0, t8 # .. e1 (stall)
|
||||
beq a2, $a_eoc # e1 :
|
||||
beq t8, $a_loop # e1 :
|
||||
|
||||
/* Take care of the final (partial) word store. At this point
|
||||
the end-of-count bit is set in t8 iff it applies.
|
||||
|
||||
On entry to this basic block we have:
|
||||
t0 == the source word containing the null
|
||||
t8 == the cmpbge mask that found it. */
|
||||
|
||||
$a_eos:
|
||||
negq t8, t12 # e0 : find low bit set
|
||||
and t8, t12, t12 # e1 (stall)
|
||||
|
||||
/* For the sake of the cache, don't read a destination word
|
||||
if we're not going to need it. */
|
||||
and t12, 0x80, t6 # e0 :
|
||||
bne t6, 1f # .. e1 (zdb)
|
||||
|
||||
/* We're doing a partial word store and so need to combine
|
||||
our source and original destination words. */
|
||||
ldq_u t1, 0(a0) # e0 :
|
||||
subq t12, 1, t6 # .. e1 :
|
||||
or t12, t6, t8 # e0 :
|
||||
unop #
|
||||
zapnot t0, t8, t0 # e0 : clear src bytes > null
|
||||
zap t1, t8, t1 # .. e1 : clear dst bytes <= null
|
||||
or t0, t1, t0 # e1 :
|
||||
|
||||
1: stq_u t0, 0(a0)
|
||||
br $finish_up
|
||||
|
||||
/* Add the end-of-count bit to the eos detection bitmask. */
|
||||
$a_eoc:
|
||||
or t10, t8, t8
|
||||
br $a_eos
|
||||
|
||||
/*** The Function Entry Point ***/
|
||||
.align 3
|
||||
__strncpy_from_user:
|
||||
mov a0, v0 # save the string start
|
||||
beq a2, $zerolength
|
||||
|
||||
/* Are source and destination co-aligned? */
|
||||
xor a0, a1, t1 # e0 :
|
||||
and a0, 7, t0 # .. e1 : find dest misalignment
|
||||
and t1, 7, t1 # e0 :
|
||||
addq a2, t0, a2 # .. e1 : bias count by dest misalignment
|
||||
subq a2, 1, a2 # e0 :
|
||||
and a2, 7, t2 # e1 :
|
||||
srl a2, 3, a2 # e0 : a2 = loop counter = (count - 1)/8
|
||||
addq zero, 1, t10 # .. e1 :
|
||||
sll t10, t2, t10 # e0 : t10 = bitmask of last count byte
|
||||
bne t1, $unaligned # .. e1 :
|
||||
|
||||
/* We are co-aligned; take care of a partial first word. */
|
||||
|
||||
EX( ldq_u t1, 0(a1) ) # e0 : load first src word
|
||||
addq a1, 8, a1 # .. e1 :
|
||||
|
||||
beq t0, $aligned # avoid loading dest word if not needed
|
||||
ldq_u t0, 0(a0) # e0 :
|
||||
br $aligned # .. e1 :
|
||||
|
||||
|
||||
/* The source and destination are not co-aligned. Align the destination
|
||||
and cope. We have to be very careful about not reading too much and
|
||||
causing a SEGV. */
|
||||
|
||||
.align 3
|
||||
$u_head:
|
||||
/* We know just enough now to be able to assemble the first
|
||||
full source word. We can still find a zero at the end of it
|
||||
that prevents us from outputting the whole thing.
|
||||
|
||||
On entry to this basic block:
|
||||
t0 == the first dest word, unmasked
|
||||
t1 == the shifted low bits of the first source word
|
||||
t6 == bytemask that is -1 in dest word bytes */
|
||||
|
||||
EX( ldq_u t2, 8(a1) ) # e0 : load second src word
|
||||
addq a1, 8, a1 # .. e1 :
|
||||
mskql t0, a0, t0 # e0 : mask trailing garbage in dst
|
||||
extqh t2, a1, t4 # e0 :
|
||||
or t1, t4, t1 # e1 : first aligned src word complete
|
||||
mskqh t1, a0, t1 # e0 : mask leading garbage in src
|
||||
or t0, t1, t0 # e0 : first output word complete
|
||||
or t0, t6, t6 # e1 : mask original data for zero test
|
||||
cmpbge zero, t6, t8 # e0 :
|
||||
beq a2, $u_eocfin # .. e1 :
|
||||
bne t8, $u_final # e1 :
|
||||
|
||||
lda t6, -1 # e1 : mask out the bits we have
|
||||
mskql t6, a1, t6 # e0 : already seen
|
||||
stq_u t0, 0(a0) # e0 : store first output word
|
||||
or t6, t2, t2 # .. e1 :
|
||||
cmpbge zero, t2, t8 # e0 : find nulls in second partial
|
||||
addq a0, 8, a0 # .. e1 :
|
||||
subq a2, 1, a2 # e0 :
|
||||
bne t8, $u_late_head_exit # .. e1 :
|
||||
|
||||
/* Finally, we've got all the stupid leading edge cases taken care
|
||||
of and we can set up to enter the main loop. */
|
||||
|
||||
extql t2, a1, t1 # e0 : position hi-bits of lo word
|
||||
EX( ldq_u t2, 8(a1) ) # .. e1 : read next high-order source word
|
||||
addq a1, 8, a1 # e0 :
|
||||
cmpbge zero, t2, t8 # e1 (stall)
|
||||
beq a2, $u_eoc # e1 :
|
||||
bne t8, $u_eos # e1 :
|
||||
|
||||
/* Unaligned copy main loop. In order to avoid reading too much,
|
||||
the loop is structured to detect zeros in aligned source words.
|
||||
This has, unfortunately, effectively pulled half of a loop
|
||||
iteration out into the head and half into the tail, but it does
|
||||
prevent nastiness from accumulating in the very thing we want
|
||||
to run as fast as possible.
|
||||
|
||||
On entry to this basic block:
|
||||
t1 == the shifted high-order bits from the previous source word
|
||||
t2 == the unshifted current source word
|
||||
|
||||
We further know that t2 does not contain a null terminator. */
|
||||
|
||||
.align 3
|
||||
$u_loop:
|
||||
extqh t2, a1, t0 # e0 : extract high bits for current word
|
||||
addq a1, 8, a1 # .. e1 :
|
||||
extql t2, a1, t3 # e0 : extract low bits for next time
|
||||
addq a0, 8, a0 # .. e1 :
|
||||
or t0, t1, t0 # e0 : current dst word now complete
|
||||
EX( ldq_u t2, 0(a1) ) # .. e1 : load high word for next time
|
||||
stq_u t0, -8(a0) # e0 : save the current word
|
||||
mov t3, t1 # .. e1 :
|
||||
subq a2, 1, a2 # e0 :
|
||||
cmpbge zero, t2, t8 # .. e1 : test new word for eos
|
||||
beq a2, $u_eoc # e1 :
|
||||
beq t8, $u_loop # e1 :
|
||||
|
||||
/* We've found a zero somewhere in the source word we just read.
|
||||
If it resides in the lower half, we have one (probably partial)
|
||||
word to write out, and if it resides in the upper half, we
|
||||
have one full and one partial word left to write out.
|
||||
|
||||
On entry to this basic block:
|
||||
t1 == the shifted high-order bits from the previous source word
|
||||
t2 == the unshifted current source word. */
|
||||
$u_eos:
|
||||
extqh t2, a1, t0 # e0 :
|
||||
or t0, t1, t0 # e1 : first (partial) source word complete
|
||||
|
||||
cmpbge zero, t0, t8 # e0 : is the null in this first bit?
|
||||
bne t8, $u_final # .. e1 (zdb)
|
||||
|
||||
stq_u t0, 0(a0) # e0 : the null was in the high-order bits
|
||||
addq a0, 8, a0 # .. e1 :
|
||||
subq a2, 1, a2 # e1 :
|
||||
|
||||
$u_late_head_exit:
|
||||
extql t2, a1, t0 # .. e0 :
|
||||
cmpbge zero, t0, t8 # e0 :
|
||||
or t8, t10, t6 # e1 :
|
||||
cmoveq a2, t6, t8 # e0 :
|
||||
nop # .. e1 :
|
||||
|
||||
/* Take care of a final (probably partial) result word.
|
||||
On entry to this basic block:
|
||||
t0 == assembled source word
|
||||
t8 == cmpbge mask that found the null. */
|
||||
$u_final:
|
||||
negq t8, t6 # e0 : isolate low bit set
|
||||
and t6, t8, t12 # e1 :
|
||||
|
||||
and t12, 0x80, t6 # e0 : avoid dest word load if we can
|
||||
bne t6, 1f # .. e1 (zdb)
|
||||
|
||||
ldq_u t1, 0(a0) # e0 :
|
||||
subq t12, 1, t6 # .. e1 :
|
||||
or t6, t12, t8 # e0 :
|
||||
zapnot t0, t8, t0 # .. e1 : kill source bytes > null
|
||||
zap t1, t8, t1 # e0 : kill dest bytes <= null
|
||||
or t0, t1, t0 # e1 :
|
||||
|
||||
1: stq_u t0, 0(a0) # e0 :
|
||||
br $finish_up
|
||||
|
||||
$u_eoc: # end-of-count
|
||||
extqh t2, a1, t0
|
||||
or t0, t1, t0
|
||||
cmpbge zero, t0, t8
|
||||
|
||||
$u_eocfin: # end-of-count, final word
|
||||
or t10, t8, t8
|
||||
br $u_final
|
||||
|
||||
/* Unaligned copy entry point. */
|
||||
.align 3
|
||||
$unaligned:
|
||||
|
||||
EX( ldq_u t1, 0(a1) ) # e0 : load first source word
|
||||
|
||||
and a0, 7, t4 # .. e1 : find dest misalignment
|
||||
and a1, 7, t5 # e0 : find src misalignment
|
||||
|
||||
/* Conditionally load the first destination word and a bytemask
|
||||
with 0xff indicating that the destination byte is sacrosanct. */
|
||||
|
||||
mov zero, t0 # .. e1 :
|
||||
mov zero, t6 # e0 :
|
||||
beq t4, 1f # .. e1 :
|
||||
ldq_u t0, 0(a0) # e0 :
|
||||
lda t6, -1 # .. e1 :
|
||||
mskql t6, a0, t6 # e0 :
|
||||
1:
|
||||
subq a1, t4, a1 # .. e1 : sub dest misalignment from src addr
|
||||
|
||||
/* If source misalignment is larger than dest misalignment, we need
|
||||
extra startup checks to avoid SEGV. */
|
||||
|
||||
cmplt t4, t5, t12 # e1 :
|
||||
extql t1, a1, t1 # .. e0 : shift src into place
|
||||
lda t2, -1 # e0 : for creating masks later
|
||||
beq t12, $u_head # e1 :
|
||||
|
||||
mskqh t2, t5, t2 # e0 : begin src byte validity mask
|
||||
cmpbge zero, t1, t8 # .. e1 : is there a zero?
|
||||
extql t2, a1, t2 # e0 :
|
||||
or t8, t10, t5 # .. e1 : test for end-of-count too
|
||||
cmpbge zero, t2, t3 # e0 :
|
||||
cmoveq a2, t5, t8 # .. e1 :
|
||||
andnot t8, t3, t8 # e0 :
|
||||
beq t8, $u_head # .. e1 (zdb)
|
||||
|
||||
/* At this point we've found a zero in the first partial word of
|
||||
the source. We need to isolate the valid source data and mask
|
||||
it into the original destination data. (Incidentally, we know
|
||||
that we'll need at least one byte of that original dest word.) */
|
||||
|
||||
ldq_u t0, 0(a0) # e0 :
|
||||
negq t8, t6 # .. e1 : build bitmask of bytes <= zero
|
||||
mskqh t1, t4, t1 # e0 :
|
||||
and t6, t8, t12 # .. e1 :
|
||||
subq t12, 1, t6 # e0 :
|
||||
or t6, t12, t8 # e1 :
|
||||
|
||||
zapnot t2, t8, t2 # e0 : prepare source word; mirror changes
|
||||
zapnot t1, t8, t1 # .. e1 : to source validity mask
|
||||
|
||||
andnot t0, t2, t0 # e0 : zero place for source to reside
|
||||
or t0, t1, t0 # e1 : and put it there
|
||||
stq_u t0, 0(a0) # e0 :
|
||||
|
||||
$finish_up:
|
||||
zapnot t0, t12, t4 # was last byte written null?
|
||||
cmovne t4, 1, t4
|
||||
|
||||
and t12, 0xf0, t3 # binary search for the address of the
|
||||
and t12, 0xcc, t2 # last byte written
|
||||
and t12, 0xaa, t1
|
||||
bic a0, 7, t0
|
||||
cmovne t3, 4, t3
|
||||
cmovne t2, 2, t2
|
||||
cmovne t1, 1, t1
|
||||
addq t0, t3, t0
|
||||
addq t1, t2, t1
|
||||
addq t0, t1, t0
|
||||
addq t0, t4, t0 # add one if we filled the buffer
|
||||
|
||||
subq t0, v0, v0 # find string length
|
||||
ret
|
||||
|
||||
$zerolength:
|
||||
clr v0
|
||||
$exception:
|
||||
ret
|
||||
|
||||
.end __strncpy_from_user
|
||||
|
|
@ -89,6 +89,8 @@ do_page_fault(unsigned long address, unsigned long mmcsr,
|
|||
const struct exception_table_entry *fixup;
|
||||
int fault, si_code = SEGV_MAPERR;
|
||||
siginfo_t info;
|
||||
unsigned int flags = (FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE |
|
||||
(cause > 0 ? FAULT_FLAG_WRITE : 0));
|
||||
|
||||
/* As of EV6, a load into $31/$f31 is a prefetch, and never faults
|
||||
(or is suppressed by the PALcode). Support that for older CPUs
|
||||
|
|
@ -114,6 +116,7 @@ do_page_fault(unsigned long address, unsigned long mmcsr,
|
|||
goto vmalloc_fault;
|
||||
#endif
|
||||
|
||||
retry:
|
||||
down_read(&mm->mmap_sem);
|
||||
vma = find_vma(mm, address);
|
||||
if (!vma)
|
||||
|
|
@ -144,8 +147,11 @@ do_page_fault(unsigned long address, unsigned long mmcsr,
|
|||
/* If for any reason at all we couldn't handle the fault,
|
||||
make sure we exit gracefully rather than endlessly redo
|
||||
the fault. */
|
||||
fault = handle_mm_fault(mm, vma, address, cause > 0 ? FAULT_FLAG_WRITE : 0);
|
||||
up_read(&mm->mmap_sem);
|
||||
fault = handle_mm_fault(mm, vma, address, flags);
|
||||
|
||||
if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current))
|
||||
return;
|
||||
|
||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||
if (fault & VM_FAULT_OOM)
|
||||
goto out_of_memory;
|
||||
|
|
@ -153,10 +159,26 @@ do_page_fault(unsigned long address, unsigned long mmcsr,
|
|||
goto do_sigbus;
|
||||
BUG();
|
||||
}
|
||||
if (fault & VM_FAULT_MAJOR)
|
||||
current->maj_flt++;
|
||||
else
|
||||
current->min_flt++;
|
||||
|
||||
if (flags & FAULT_FLAG_ALLOW_RETRY) {
|
||||
if (fault & VM_FAULT_MAJOR)
|
||||
current->maj_flt++;
|
||||
else
|
||||
current->min_flt++;
|
||||
if (fault & VM_FAULT_RETRY) {
|
||||
flags &= ~FAULT_FLAG_ALLOW_RETRY;
|
||||
|
||||
/* No need to up_read(&mm->mmap_sem) as we would
|
||||
* have already released it in __lock_page_or_retry
|
||||
* in mm/filemap.c.
|
||||
*/
|
||||
|
||||
goto retry;
|
||||
}
|
||||
}
|
||||
|
||||
up_read(&mm->mmap_sem);
|
||||
|
||||
return;
|
||||
|
||||
/* Something tried to access memory that isn't in our memory map.
|
||||
|
|
@ -186,12 +208,14 @@ do_page_fault(unsigned long address, unsigned long mmcsr,
|
|||
/* We ran out of memory, or some other thing happened to us that
|
||||
made us unable to handle the page fault gracefully. */
|
||||
out_of_memory:
|
||||
up_read(&mm->mmap_sem);
|
||||
if (!user_mode(regs))
|
||||
goto no_context;
|
||||
pagefault_out_of_memory();
|
||||
return;
|
||||
|
||||
do_sigbus:
|
||||
up_read(&mm->mmap_sem);
|
||||
/* Send a sigbus, regardless of whether we were in kernel
|
||||
or user mode. */
|
||||
info.si_signo = SIGBUS;
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
#include <linux/smp.h>
|
||||
#include <linux/errno.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/special_insns.h>
|
||||
|
||||
#include "op_impl.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -38,7 +38,6 @@ config ARM
|
|||
select HARDIRQS_SW_RESEND
|
||||
select GENERIC_IRQ_PROBE
|
||||
select GENERIC_IRQ_SHOW
|
||||
select GENERIC_IRQ_PROBE
|
||||
select ARCH_WANT_IPC_PARSE_VERSION
|
||||
select HARDIRQS_SW_RESEND
|
||||
select CPU_PM if (SUSPEND || CPU_IDLE)
|
||||
|
|
@ -126,11 +125,6 @@ config TRACE_IRQFLAGS_SUPPORT
|
|||
bool
|
||||
default y
|
||||
|
||||
config GENERIC_LOCKBREAK
|
||||
bool
|
||||
default y
|
||||
depends on SMP && PREEMPT
|
||||
|
||||
config RWSEM_GENERIC_SPINLOCK
|
||||
bool
|
||||
default y
|
||||
|
|
|
|||
|
|
@ -23,10 +23,6 @@ memory {
|
|||
soc {
|
||||
aipi@10000000 { /* aipi */
|
||||
|
||||
wdog@10002000 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
serial@1000a000 {
|
||||
fsl,uart-has-rtscts;
|
||||
status = "okay";
|
||||
|
|
|
|||
|
|
@ -62,7 +62,6 @@ wdog@10002000 {
|
|||
compatible = "fsl,imx27-wdt", "fsl,imx21-wdt";
|
||||
reg = <0x10002000 0x4000>;
|
||||
interrupts = <27>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
uart1: serial@1000a000 {
|
||||
|
|
|
|||
|
|
@ -25,23 +25,31 @@ soc {
|
|||
aips@70000000 { /* aips-1 */
|
||||
spba@70000000 {
|
||||
esdhc@70004000 { /* ESDHC1 */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_esdhc1_1>;
|
||||
fsl,cd-internal;
|
||||
fsl,wp-internal;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
esdhc@70008000 { /* ESDHC2 */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_esdhc2_1>;
|
||||
cd-gpios = <&gpio1 6 0>;
|
||||
wp-gpios = <&gpio1 5 0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
uart3: serial@7000c000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_uart3_1>;
|
||||
fsl,uart-has-rtscts;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ecspi@70010000 { /* ECSPI1 */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_ecspi1_1>;
|
||||
fsl,spi-num-chipselects = <2>;
|
||||
cs-gpios = <&gpio4 24 0>, <&gpio4 25 0>;
|
||||
status = "okay";
|
||||
|
|
@ -169,31 +177,43 @@ ssi2: ssi@70014000 {
|
|||
};
|
||||
};
|
||||
|
||||
wdog@73f98000 { /* WDOG1 */
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
iomuxc@73fa8000 {
|
||||
compatible = "fsl,imx51-iomuxc-babbage";
|
||||
reg = <0x73fa8000 0x4000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_hog>;
|
||||
|
||||
hog {
|
||||
pinctrl_hog: hoggrp {
|
||||
fsl,pins = <
|
||||
694 0x20d5 /* MX51_PAD_GPIO1_0__SD1_CD */
|
||||
697 0x20d5 /* MX51_PAD_GPIO1_1__SD1_WP */
|
||||
737 0x100 /* MX51_PAD_GPIO1_5__GPIO1_5 */
|
||||
740 0x100 /* MX51_PAD_GPIO1_6__GPIO1_6 */
|
||||
121 0x5 /* MX51_PAD_EIM_A27__GPIO2_21 */
|
||||
402 0x85 /* MX51_PAD_CSPI1_SS0__GPIO4_24 */
|
||||
405 0x85 /* MX51_PAD_CSPI1_SS1__GPIO4_25 */
|
||||
>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
uart1: serial@73fbc000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_uart1_1>;
|
||||
fsl,uart-has-rtscts;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
uart2: serial@73fc0000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_uart2_1>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
aips@80000000 { /* aips-2 */
|
||||
sdma@83fb0000 {
|
||||
fsl,sdma-ram-script-name = "imx/sdma/sdma-imx51.bin";
|
||||
};
|
||||
|
||||
i2c@83fc4000 { /* I2C2 */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c2_1>;
|
||||
status = "okay";
|
||||
|
||||
sgtl5000: codec@0a {
|
||||
|
|
@ -206,10 +226,14 @@ sgtl5000: codec@0a {
|
|||
};
|
||||
|
||||
audmux@83fd0000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_audmux_1>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ethernet@83fec000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_fec_1>;
|
||||
phy-mode = "mii";
|
||||
status = "okay";
|
||||
};
|
||||
|
|
|
|||
|
|
@ -130,6 +130,34 @@ esdhc@70024000 { /* ESDHC4 */
|
|||
};
|
||||
};
|
||||
|
||||
usb@73f80000 {
|
||||
compatible = "fsl,imx51-usb", "fsl,imx27-usb";
|
||||
reg = <0x73f80000 0x0200>;
|
||||
interrupts = <18>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
usb@73f80200 {
|
||||
compatible = "fsl,imx51-usb", "fsl,imx27-usb";
|
||||
reg = <0x73f80200 0x0200>;
|
||||
interrupts = <14>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
usb@73f80400 {
|
||||
compatible = "fsl,imx51-usb", "fsl,imx27-usb";
|
||||
reg = <0x73f80400 0x0200>;
|
||||
interrupts = <16>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
usb@73f80600 {
|
||||
compatible = "fsl,imx51-usb", "fsl,imx27-usb";
|
||||
reg = <0x73f80600 0x0200>;
|
||||
interrupts = <17>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
gpio1: gpio@73f84000 {
|
||||
compatible = "fsl,imx51-gpio", "fsl,imx35-gpio";
|
||||
reg = <0x73f84000 0x4000>;
|
||||
|
|
@ -174,7 +202,6 @@ wdog@73f98000 { /* WDOG1 */
|
|||
compatible = "fsl,imx51-wdt", "fsl,imx21-wdt";
|
||||
reg = <0x73f98000 0x4000>;
|
||||
interrupts = <58>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
wdog@73f9c000 { /* WDOG2 */
|
||||
|
|
@ -184,6 +211,122 @@ wdog@73f9c000 { /* WDOG2 */
|
|||
status = "disabled";
|
||||
};
|
||||
|
||||
iomuxc@73fa8000 {
|
||||
compatible = "fsl,imx51-iomuxc";
|
||||
reg = <0x73fa8000 0x4000>;
|
||||
|
||||
audmux {
|
||||
pinctrl_audmux_1: audmuxgrp-1 {
|
||||
fsl,pins = <
|
||||
384 0x80000000 /* MX51_PAD_AUD3_BB_TXD__AUD3_TXD */
|
||||
386 0x80000000 /* MX51_PAD_AUD3_BB_RXD__AUD3_RXD */
|
||||
389 0x80000000 /* MX51_PAD_AUD3_BB_CK__AUD3_TXC */
|
||||
391 0x80000000 /* MX51_PAD_AUD3_BB_FS__AUD3_TXFS */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
fec {
|
||||
pinctrl_fec_1: fecgrp-1 {
|
||||
fsl,pins = <
|
||||
128 0x80000000 /* MX51_PAD_EIM_EB2__FEC_MDIO */
|
||||
134 0x80000000 /* MX51_PAD_EIM_EB3__FEC_RDATA1 */
|
||||
146 0x80000000 /* MX51_PAD_EIM_CS2__FEC_RDATA2 */
|
||||
152 0x80000000 /* MX51_PAD_EIM_CS3__FEC_RDATA3 */
|
||||
158 0x80000000 /* MX51_PAD_EIM_CS4__FEC_RX_ER */
|
||||
165 0x80000000 /* MX51_PAD_EIM_CS5__FEC_CRS */
|
||||
206 0x80000000 /* MX51_PAD_NANDF_RB2__FEC_COL */
|
||||
213 0x80000000 /* MX51_PAD_NANDF_RB3__FEC_RX_CLK */
|
||||
293 0x80000000 /* MX51_PAD_NANDF_D9__FEC_RDATA0 */
|
||||
298 0x80000000 /* MX51_PAD_NANDF_D8__FEC_TDATA0 */
|
||||
225 0x80000000 /* MX51_PAD_NANDF_CS2__FEC_TX_ER */
|
||||
231 0x80000000 /* MX51_PAD_NANDF_CS3__FEC_MDC */
|
||||
237 0x80000000 /* MX51_PAD_NANDF_CS4__FEC_TDATA1 */
|
||||
243 0x80000000 /* MX51_PAD_NANDF_CS5__FEC_TDATA2 */
|
||||
250 0x80000000 /* MX51_PAD_NANDF_CS6__FEC_TDATA3 */
|
||||
255 0x80000000 /* MX51_PAD_NANDF_CS7__FEC_TX_EN */
|
||||
260 0x80000000 /* MX51_PAD_NANDF_RDY_INT__FEC_TX_CLK */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
ecspi1 {
|
||||
pinctrl_ecspi1_1: ecspi1grp-1 {
|
||||
fsl,pins = <
|
||||
398 0x185 /* MX51_PAD_CSPI1_MISO__ECSPI1_MISO */
|
||||
394 0x185 /* MX51_PAD_CSPI1_MOSI__ECSPI1_MOSI */
|
||||
409 0x185 /* MX51_PAD_CSPI1_SCLK__ECSPI1_SCLK */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
esdhc1 {
|
||||
pinctrl_esdhc1_1: esdhc1grp-1 {
|
||||
fsl,pins = <
|
||||
666 0x400020d5 /* MX51_PAD_SD1_CMD__SD1_CMD */
|
||||
669 0x20d5 /* MX51_PAD_SD1_CLK__SD1_CLK */
|
||||
672 0x20d5 /* MX51_PAD_SD1_DATA0__SD1_DATA0 */
|
||||
678 0x20d5 /* MX51_PAD_SD1_DATA1__SD1_DATA1 */
|
||||
684 0x20d5 /* MX51_PAD_SD1_DATA2__SD1_DATA2 */
|
||||
691 0x20d5 /* MX51_PAD_SD1_DATA3__SD1_DATA3 */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
esdhc2 {
|
||||
pinctrl_esdhc2_1: esdhc2grp-1 {
|
||||
fsl,pins = <
|
||||
704 0x400020d5 /* MX51_PAD_SD2_CMD__SD2_CMD */
|
||||
707 0x20d5 /* MX51_PAD_SD2_CLK__SD2_CLK */
|
||||
710 0x20d5 /* MX51_PAD_SD2_DATA0__SD2_DATA0 */
|
||||
712 0x20d5 /* MX51_PAD_SD2_DATA1__SD2_DATA1 */
|
||||
715 0x20d5 /* MX51_PAD_SD2_DATA2__SD2_DATA2 */
|
||||
719 0x20d5 /* MX51_PAD_SD2_DATA3__SD2_DATA3 */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
i2c2 {
|
||||
pinctrl_i2c2_1: i2c2grp-1 {
|
||||
fsl,pins = <
|
||||
449 0x400001ed /* MX51_PAD_KEY_COL4__I2C2_SCL */
|
||||
454 0x400001ed /* MX51_PAD_KEY_COL5__I2C2_SDA */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
uart1 {
|
||||
pinctrl_uart1_1: uart1grp-1 {
|
||||
fsl,pins = <
|
||||
413 0x1c5 /* MX51_PAD_UART1_RXD__UART1_RXD */
|
||||
416 0x1c5 /* MX51_PAD_UART1_TXD__UART1_TXD */
|
||||
418 0x1c5 /* MX51_PAD_UART1_RTS__UART1_RTS */
|
||||
420 0x1c5 /* MX51_PAD_UART1_CTS__UART1_CTS */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
uart2 {
|
||||
pinctrl_uart2_1: uart2grp-1 {
|
||||
fsl,pins = <
|
||||
423 0x1c5 /* MX51_PAD_UART2_RXD__UART2_RXD */
|
||||
426 0x1c5 /* MX51_PAD_UART2_TXD__UART2_TXD */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
uart3 {
|
||||
pinctrl_uart3_1: uart3grp-1 {
|
||||
fsl,pins = <
|
||||
54 0x1c5 /* MX51_PAD_EIM_D25__UART3_RXD */
|
||||
59 0x1c5 /* MX51_PAD_EIM_D26__UART3_TXD */
|
||||
65 0x1c5 /* MX51_PAD_EIM_D27__UART3_RTS */
|
||||
49 0x1c5 /* MX51_PAD_EIM_D24__UART3_CTS */
|
||||
>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
uart1: serial@73fbc000 {
|
||||
compatible = "fsl,imx51-uart", "fsl,imx21-uart";
|
||||
reg = <0x73fbc000 0x4000>;
|
||||
|
|
@ -219,6 +362,7 @@ sdma@83fb0000 {
|
|||
compatible = "fsl,imx51-sdma", "fsl,imx35-sdma";
|
||||
reg = <0x83fb0000 0x4000>;
|
||||
interrupts = <6>;
|
||||
fsl,sdma-ram-script-name = "imx/sdma/sdma-imx51.bin";
|
||||
};
|
||||
|
||||
cspi@83fc0000 {
|
||||
|
|
|
|||
|
|
@ -25,31 +25,66 @@ soc {
|
|||
aips@50000000 { /* AIPS1 */
|
||||
spba@50000000 {
|
||||
esdhc@50004000 { /* ESDHC1 */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_esdhc1_2>;
|
||||
cd-gpios = <&gpio1 1 0>;
|
||||
wp-gpios = <&gpio1 9 0>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
wdog@53f98000 { /* WDOG1 */
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
iomuxc@53fa8000 {
|
||||
compatible = "fsl,imx53-iomuxc-ard";
|
||||
reg = <0x53fa8000 0x4000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_hog>;
|
||||
|
||||
hog {
|
||||
pinctrl_hog: hoggrp {
|
||||
fsl,pins = <
|
||||
1077 0x80000000 /* MX53_PAD_GPIO_1__GPIO1_1 */
|
||||
1085 0x80000000 /* MX53_PAD_GPIO_9__GPIO1_9 */
|
||||
486 0x80000000 /* MX53_PAD_EIM_EB3__GPIO2_31 */
|
||||
739 0x80000000 /* MX53_PAD_GPIO_10__GPIO4_0 */
|
||||
218 0x80000000 /* MX53_PAD_DISP0_DAT16__GPIO5_10 */
|
||||
226 0x80000000 /* MX53_PAD_DISP0_DAT17__GPIO5_11 */
|
||||
233 0x80000000 /* MX53_PAD_DISP0_DAT18__GPIO5_12 */
|
||||
241 0x80000000 /* MX53_PAD_DISP0_DAT19__GPIO5_13 */
|
||||
429 0x80000000 /* MX53_PAD_EIM_D16__EMI_WEIM_D_16 */
|
||||
435 0x80000000 /* MX53_PAD_EIM_D17__EMI_WEIM_D_17 */
|
||||
441 0x80000000 /* MX53_PAD_EIM_D18__EMI_WEIM_D_18 */
|
||||
448 0x80000000 /* MX53_PAD_EIM_D19__EMI_WEIM_D_19 */
|
||||
456 0x80000000 /* MX53_PAD_EIM_D20__EMI_WEIM_D_20 */
|
||||
464 0x80000000 /* MX53_PAD_EIM_D21__EMI_WEIM_D_21 */
|
||||
471 0x80000000 /* MX53_PAD_EIM_D22__EMI_WEIM_D_22 */
|
||||
477 0x80000000 /* MX53_PAD_EIM_D23__EMI_WEIM_D_23 */
|
||||
492 0x80000000 /* MX53_PAD_EIM_D24__EMI_WEIM_D_24 */
|
||||
500 0x80000000 /* MX53_PAD_EIM_D25__EMI_WEIM_D_25 */
|
||||
508 0x80000000 /* MX53_PAD_EIM_D26__EMI_WEIM_D_26 */
|
||||
516 0x80000000 /* MX53_PAD_EIM_D27__EMI_WEIM_D_27 */
|
||||
524 0x80000000 /* MX53_PAD_EIM_D28__EMI_WEIM_D_28 */
|
||||
532 0x80000000 /* MX53_PAD_EIM_D29__EMI_WEIM_D_29 */
|
||||
540 0x80000000 /* MX53_PAD_EIM_D30__EMI_WEIM_D_30 */
|
||||
548 0x80000000 /* MX53_PAD_EIM_D31__EMI_WEIM_D_31 */
|
||||
637 0x80000000 /* MX53_PAD_EIM_DA0__EMI_NAND_WEIM_DA_0 */
|
||||
642 0x80000000 /* MX53_PAD_EIM_DA1__EMI_NAND_WEIM_DA_1 */
|
||||
647 0x80000000 /* MX53_PAD_EIM_DA2__EMI_NAND_WEIM_DA_2 */
|
||||
652 0x80000000 /* MX53_PAD_EIM_DA3__EMI_NAND_WEIM_DA_3 */
|
||||
657 0x80000000 /* MX53_PAD_EIM_DA4__EMI_NAND_WEIM_DA_4 */
|
||||
662 0x80000000 /* MX53_PAD_EIM_DA5__EMI_NAND_WEIM_DA_5 */
|
||||
667 0x80000000 /* MX53_PAD_EIM_DA6__EMI_NAND_WEIM_DA_6 */
|
||||
611 0x80000000 /* MX53_PAD_EIM_OE__EMI_WEIM_OE */
|
||||
616 0x80000000 /* MX53_PAD_EIM_RW__EMI_WEIM_RW */
|
||||
607 0x80000000 /* MX53_PAD_EIM_CS1__EMI_WEIM_CS_1 */
|
||||
>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
uart1: serial@53fbc000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_uart1_2>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
aips@60000000 { /* AIPS2 */
|
||||
sdma@63fb0000 {
|
||||
fsl,sdma-ram-script-name = "imx/sdma/sdma-imx53.bin";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
eim-cs1@f4000000 {
|
||||
|
|
|
|||
|
|
@ -25,12 +25,16 @@ soc {
|
|||
aips@50000000 { /* AIPS1 */
|
||||
spba@50000000 {
|
||||
esdhc@50004000 { /* ESDHC1 */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_esdhc1_1>;
|
||||
cd-gpios = <&gpio3 13 0>;
|
||||
wp-gpios = <&gpio3 14 0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ecspi@50010000 { /* ECSPI1 */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_ecspi1_1>;
|
||||
fsl,spi-num-chipselects = <2>;
|
||||
cs-gpios = <&gpio2 30 0>, <&gpio3 19 0>;
|
||||
status = "okay";
|
||||
|
|
@ -56,32 +60,45 @@ partition@40000 {
|
|||
};
|
||||
|
||||
esdhc@50020000 { /* ESDHC3 */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_esdhc3_1>;
|
||||
cd-gpios = <&gpio3 11 0>;
|
||||
wp-gpios = <&gpio3 12 0>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
wdog@53f98000 { /* WDOG1 */
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
iomuxc@53fa8000 {
|
||||
compatible = "fsl,imx53-iomuxc-evk";
|
||||
reg = <0x53fa8000 0x4000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_hog>;
|
||||
|
||||
hog {
|
||||
pinctrl_hog: hoggrp {
|
||||
fsl,pins = <
|
||||
424 0x80000000 /* MX53_PAD_EIM_EB2__GPIO2_30 */
|
||||
449 0x80000000 /* MX53_PAD_EIM_D19__GPIO3_19 */
|
||||
693 0x80000000 /* MX53_PAD_EIM_DA11__GPIO3_11 */
|
||||
697 0x80000000 /* MX53_PAD_EIM_DA12__GPIO3_12 */
|
||||
701 0x80000000 /* MX53_PAD_EIM_DA13__GPIO3_13 */
|
||||
705 0x80000000 /* MX53_PAD_EIM_DA14__GPIO3_14 */
|
||||
868 0x80000000 /* MX53_PAD_PATA_DA_0__GPIO7_6 */
|
||||
873 0x80000000 /* MX53_PAD_PATA_DA_1__GPIO7_7 */
|
||||
>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
uart1: serial@53fbc000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_uart1_1>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
aips@60000000 { /* AIPS2 */
|
||||
sdma@63fb0000 {
|
||||
fsl,sdma-ram-script-name = "imx/sdma/sdma-imx53.bin";
|
||||
};
|
||||
|
||||
i2c@63fc4000 { /* I2C2 */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c2_1>;
|
||||
status = "okay";
|
||||
|
||||
pmic: mc13892@08 {
|
||||
|
|
@ -96,6 +113,8 @@ codec: sgtl5000@0a {
|
|||
};
|
||||
|
||||
ethernet@63fec000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_fec_1>;
|
||||
phy-mode = "rmii";
|
||||
phy-reset-gpios = <&gpio7 6 0>;
|
||||
status = "okay";
|
||||
|
|
|
|||
|
|
@ -25,6 +25,8 @@ soc {
|
|||
aips@50000000 { /* AIPS1 */
|
||||
spba@50000000 {
|
||||
esdhc@50004000 { /* ESDHC1 */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_esdhc1_1>;
|
||||
cd-gpios = <&gpio3 13 0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
|
@ -35,32 +37,46 @@ ssi2: ssi@50014000 {
|
|||
};
|
||||
|
||||
esdhc@50020000 { /* ESDHC3 */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_esdhc3_1>;
|
||||
cd-gpios = <&gpio3 11 0>;
|
||||
wp-gpios = <&gpio3 12 0>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
wdog@53f98000 { /* WDOG1 */
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
iomuxc@53fa8000 {
|
||||
compatible = "fsl,imx53-iomuxc-qsb";
|
||||
reg = <0x53fa8000 0x4000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_hog>;
|
||||
|
||||
hog {
|
||||
pinctrl_hog: hoggrp {
|
||||
fsl,pins = <
|
||||
1071 0x80000000 /* MX53_PAD_GPIO_0__CCM_SSI_EXT1_CLK */
|
||||
1141 0x80000000 /* MX53_PAD_GPIO_8__GPIO1_8 */
|
||||
982 0x80000000 /* MX53_PAD_PATA_DATA14__GPIO2_14 */
|
||||
989 0x80000000 /* MX53_PAD_PATA_DATA15__GPIO2_15 */
|
||||
693 0x80000000 /* MX53_PAD_EIM_DA11__GPIO3_11 */
|
||||
697 0x80000000 /* MX53_PAD_EIM_DA12__GPIO3_12 */
|
||||
701 0x80000000 /* MX53_PAD_EIM_DA13__GPIO3_13 */
|
||||
868 0x80000000 /* MX53_PAD_PATA_DA_0__GPIO7_6 */
|
||||
873 0x80000000 /* MX53_PAD_PATA_DA_1__GPIO7_7 */
|
||||
>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
uart1: serial@53fbc000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_uart1_1>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
aips@60000000 { /* AIPS2 */
|
||||
sdma@63fb0000 {
|
||||
fsl,sdma-ram-script-name = "imx/sdma/sdma-imx53.bin";
|
||||
};
|
||||
|
||||
i2c@63fc4000 { /* I2C2 */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c2_1>;
|
||||
status = "okay";
|
||||
|
||||
sgtl5000: codec@0a {
|
||||
|
|
@ -72,6 +88,8 @@ sgtl5000: codec@0a {
|
|||
};
|
||||
|
||||
i2c@63fc8000 { /* I2C1 */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c1_1>;
|
||||
status = "okay";
|
||||
|
||||
accelerometer: mma8450@1c {
|
||||
|
|
@ -158,10 +176,14 @@ ldo13 {
|
|||
};
|
||||
|
||||
audmux@63fd0000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_audmux_1>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ethernet@63fec000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_fec_1>;
|
||||
phy-mode = "rmii";
|
||||
phy-reset-gpios = <&gpio7 6 0>;
|
||||
status = "okay";
|
||||
|
|
|
|||
|
|
@ -25,22 +25,30 @@ soc {
|
|||
aips@50000000 { /* AIPS1 */
|
||||
spba@50000000 {
|
||||
esdhc@50004000 { /* ESDHC1 */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_esdhc1_1>;
|
||||
cd-gpios = <&gpio3 13 0>;
|
||||
wp-gpios = <&gpio4 11 0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
esdhc@50008000 { /* ESDHC2 */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_esdhc2_1>;
|
||||
non-removable;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
uart3: serial@5000c000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_uart3_1>;
|
||||
fsl,uart-has-rtscts;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ecspi@50010000 { /* ECSPI1 */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_ecspi1_1>;
|
||||
fsl,spi-num-chipselects = <2>;
|
||||
cs-gpios = <&gpio2 30 0>, <&gpio3 19 0>;
|
||||
status = "okay";
|
||||
|
|
@ -72,35 +80,49 @@ partition@40000 {
|
|||
};
|
||||
|
||||
esdhc@50020000 { /* ESDHC3 */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_esdhc3_1>;
|
||||
non-removable;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
wdog@53f98000 { /* WDOG1 */
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
iomuxc@53fa8000 {
|
||||
compatible = "fsl,imx53-iomuxc-smd";
|
||||
reg = <0x53fa8000 0x4000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_hog>;
|
||||
|
||||
hog {
|
||||
pinctrl_hog: hoggrp {
|
||||
fsl,pins = <
|
||||
982 0x80000000 /* MX53_PAD_PATA_DATA14__GPIO2_14 */
|
||||
989 0x80000000 /* MX53_PAD_PATA_DATA15__GPIO2_15 */
|
||||
424 0x80000000 /* MX53_PAD_EIM_EB2__GPIO2_30 */
|
||||
701 0x80000000 /* MX53_PAD_EIM_DA13__GPIO3_13 */
|
||||
449 0x80000000 /* MX53_PAD_EIM_D19__GPIO3_19 */
|
||||
43 0x80000000 /* MX53_PAD_KEY_ROW2__GPIO4_11 */
|
||||
868 0x80000000 /* MX53_PAD_PATA_DA_0__GPIO7_6 */
|
||||
>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
uart1: serial@53fbc000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_uart1_1>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
uart2: serial@53fc0000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_uart2_1>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
aips@60000000 { /* AIPS2 */
|
||||
sdma@63fb0000 {
|
||||
fsl,sdma-ram-script-name = "imx/sdma/sdma-imx53.bin";
|
||||
};
|
||||
|
||||
i2c@63fc4000 { /* I2C2 */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c2_1>;
|
||||
status = "okay";
|
||||
|
||||
codec: sgtl5000@0a {
|
||||
|
|
@ -120,6 +142,8 @@ touchkey: mpr121@5a {
|
|||
};
|
||||
|
||||
i2c@63fc8000 { /* I2C1 */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c1_1>;
|
||||
status = "okay";
|
||||
|
||||
accelerometer: mma8450@1c {
|
||||
|
|
@ -139,6 +163,8 @@ pmic: dialog@48 {
|
|||
};
|
||||
|
||||
ethernet@63fec000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_fec_1>;
|
||||
phy-mode = "rmii";
|
||||
phy-reset-gpios = <&gpio7 6 0>;
|
||||
status = "okay";
|
||||
|
|
|
|||
|
|
@ -135,6 +135,34 @@ esdhc@50024000 { /* ESDHC4 */
|
|||
};
|
||||
};
|
||||
|
||||
usb@53f80000 {
|
||||
compatible = "fsl,imx53-usb", "fsl,imx27-usb";
|
||||
reg = <0x53f80000 0x0200>;
|
||||
interrupts = <18>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
usb@53f80200 {
|
||||
compatible = "fsl,imx53-usb", "fsl,imx27-usb";
|
||||
reg = <0x53f80200 0x0200>;
|
||||
interrupts = <14>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
usb@53f80400 {
|
||||
compatible = "fsl,imx53-usb", "fsl,imx27-usb";
|
||||
reg = <0x53f80400 0x0200>;
|
||||
interrupts = <16>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
usb@53f80600 {
|
||||
compatible = "fsl,imx53-usb", "fsl,imx27-usb";
|
||||
reg = <0x53f80600 0x0200>;
|
||||
interrupts = <17>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
gpio1: gpio@53f84000 {
|
||||
compatible = "fsl,imx53-gpio", "fsl,imx35-gpio";
|
||||
reg = <0x53f84000 0x4000>;
|
||||
|
|
@ -179,7 +207,6 @@ wdog@53f98000 { /* WDOG1 */
|
|||
compatible = "fsl,imx53-wdt", "fsl,imx21-wdt";
|
||||
reg = <0x53f98000 0x4000>;
|
||||
interrupts = <58>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
wdog@53f9c000 { /* WDOG2 */
|
||||
|
|
@ -189,6 +216,161 @@ wdog@53f9c000 { /* WDOG2 */
|
|||
status = "disabled";
|
||||
};
|
||||
|
||||
iomuxc@53fa8000 {
|
||||
compatible = "fsl,imx53-iomuxc";
|
||||
reg = <0x53fa8000 0x4000>;
|
||||
|
||||
audmux {
|
||||
pinctrl_audmux_1: audmuxgrp-1 {
|
||||
fsl,pins = <
|
||||
10 0x80000000 /* MX53_PAD_KEY_COL0__AUDMUX_AUD5_TXC */
|
||||
17 0x80000000 /* MX53_PAD_KEY_ROW0__AUDMUX_AUD5_TXD */
|
||||
23 0x80000000 /* MX53_PAD_KEY_COL1__AUDMUX_AUD5_TXFS */
|
||||
30 0x80000000 /* MX53_PAD_KEY_ROW1__AUDMUX_AUD5_RXD */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
fec {
|
||||
pinctrl_fec_1: fecgrp-1 {
|
||||
fsl,pins = <
|
||||
820 0x80000000 /* MX53_PAD_FEC_MDC__FEC_MDC */
|
||||
779 0x80000000 /* MX53_PAD_FEC_MDIO__FEC_MDIO */
|
||||
786 0x80000000 /* MX53_PAD_FEC_REF_CLK__FEC_TX_CLK */
|
||||
791 0x80000000 /* MX53_PAD_FEC_RX_ER__FEC_RX_ER */
|
||||
796 0x80000000 /* MX53_PAD_FEC_CRS_DV__FEC_RX_DV */
|
||||
799 0x80000000 /* MX53_PAD_FEC_RXD1__FEC_RDATA_1 */
|
||||
804 0x80000000 /* MX53_PAD_FEC_RXD0__FEC_RDATA_0 */
|
||||
808 0x80000000 /* MX53_PAD_FEC_TX_EN__FEC_TX_EN */
|
||||
811 0x80000000 /* MX53_PAD_FEC_TXD1__FEC_TDATA_1 */
|
||||
816 0x80000000 /* MX53_PAD_FEC_TXD0__FEC_TDATA_0 */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
ecspi1 {
|
||||
pinctrl_ecspi1_1: ecspi1grp-1 {
|
||||
fsl,pins = <
|
||||
433 0x80000000 /* MX53_PAD_EIM_D16__ECSPI1_SCLK */
|
||||
439 0x80000000 /* MX53_PAD_EIM_D17__ECSPI1_MISO */
|
||||
445 0x80000000 /* MX53_PAD_EIM_D18__ECSPI1_MOSI */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
esdhc1 {
|
||||
pinctrl_esdhc1_1: esdhc1grp-1 {
|
||||
fsl,pins = <
|
||||
995 0x1d5 /* MX53_PAD_SD1_DATA0__ESDHC1_DAT0 */
|
||||
1000 0x1d5 /* MX53_PAD_SD1_DATA1__ESDHC1_DAT1 */
|
||||
1010 0x1d5 /* MX53_PAD_SD1_DATA2__ESDHC1_DAT2 */
|
||||
1024 0x1d5 /* MX53_PAD_SD1_DATA3__ESDHC1_DAT3 */
|
||||
1005 0x1d5 /* MX53_PAD_SD1_CMD__ESDHC1_CMD */
|
||||
1018 0x1d5 /* MX53_PAD_SD1_CLK__ESDHC1_CLK */
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_esdhc1_2: esdhc1grp-2 {
|
||||
fsl,pins = <
|
||||
995 0x1d5 /* MX53_PAD_SD1_DATA0__ESDHC1_DAT0 */
|
||||
1000 0x1d5 /* MX53_PAD_SD1_DATA1__ESDHC1_DAT1 */
|
||||
1010 0x1d5 /* MX53_PAD_SD1_DATA2__ESDHC1_DAT2 */
|
||||
1024 0x1d5 /* MX53_PAD_SD1_DATA3__ESDHC1_DAT3 */
|
||||
941 0x1d5 /* MX53_PAD_PATA_DATA8__ESDHC1_DAT4 */
|
||||
948 0x1d5 /* MX53_PAD_PATA_DATA9__ESDHC1_DAT5 */
|
||||
955 0x1d5 /* MX53_PAD_PATA_DATA10__ESDHC1_DAT6 */
|
||||
962 0x1d5 /* MX53_PAD_PATA_DATA11__ESDHC1_DAT7 */
|
||||
1005 0x1d5 /* MX53_PAD_SD1_CMD__ESDHC1_CMD */
|
||||
1018 0x1d5 /* MX53_PAD_SD1_CLK__ESDHC1_CLK */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
esdhc2 {
|
||||
pinctrl_esdhc2_1: esdhc2grp-1 {
|
||||
fsl,pins = <
|
||||
1038 0x1d5 /* MX53_PAD_SD2_CMD__ESDHC2_CMD */
|
||||
1032 0x1d5 /* MX53_PAD_SD2_CLK__ESDHC2_CLK */
|
||||
1062 0x1d5 /* MX53_PAD_SD2_DATA0__ESDHC2_DAT0 */
|
||||
1056 0x1d5 /* MX53_PAD_SD2_DATA1__ESDHC2_DAT1 */
|
||||
1050 0x1d5 /* MX53_PAD_SD2_DATA2__ESDHC2_DAT2 */
|
||||
1044 0x1d5 /* MX53_PAD_SD2_DATA3__ESDHC2_DAT3 */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
esdhc3 {
|
||||
pinctrl_esdhc3_1: esdhc3grp-1 {
|
||||
fsl,pins = <
|
||||
943 0x1d5 /* MX53_PAD_PATA_DATA8__ESDHC3_DAT0 */
|
||||
950 0x1d5 /* MX53_PAD_PATA_DATA9__ESDHC3_DAT1 */
|
||||
957 0x1d5 /* MX53_PAD_PATA_DATA10__ESDHC3_DAT2 */
|
||||
964 0x1d5 /* MX53_PAD_PATA_DATA11__ESDHC3_DAT3 */
|
||||
893 0x1d5 /* MX53_PAD_PATA_DATA0__ESDHC3_DAT4 */
|
||||
900 0x1d5 /* MX53_PAD_PATA_DATA1__ESDHC3_DAT5 */
|
||||
906 0x1d5 /* MX53_PAD_PATA_DATA2__ESDHC3_DAT6 */
|
||||
912 0x1d5 /* MX53_PAD_PATA_DATA3__ESDHC3_DAT7 */
|
||||
857 0x1d5 /* MX53_PAD_PATA_RESET_B__ESDHC3_CMD */
|
||||
863 0x1d5 /* MX53_PAD_PATA_IORDY__ESDHC3_CLK */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
i2c1 {
|
||||
pinctrl_i2c1_1: i2c1grp-1 {
|
||||
fsl,pins = <
|
||||
333 0xc0000000 /* MX53_PAD_CSI0_DAT8__I2C1_SDA */
|
||||
341 0xc0000000 /* MX53_PAD_CSI0_DAT9__I2C1_SCL */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
i2c2 {
|
||||
pinctrl_i2c2_1: i2c2grp-1 {
|
||||
fsl,pins = <
|
||||
61 0xc0000000 /* MX53_PAD_KEY_ROW3__I2C2_SDA */
|
||||
53 0xc0000000 /* MX53_PAD_KEY_COL3__I2C2_SCL */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
uart1 {
|
||||
pinctrl_uart1_1: uart1grp-1 {
|
||||
fsl,pins = <
|
||||
346 0x1c5 /* MX53_PAD_CSI0_DAT10__UART1_TXD_MUX */
|
||||
354 0x1c5 /* MX53_PAD_CSI0_DAT11__UART1_RXD_MUX */
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_uart1_2: uart1grp-2 {
|
||||
fsl,pins = <
|
||||
828 0x1c5 /* MX53_PAD_PATA_DIOW__UART1_TXD_MUX */
|
||||
832 0x1c5 /* MX53_PAD_PATA_DMACK__UART1_RXD_MUX */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
uart2 {
|
||||
pinctrl_uart2_1: uart2grp-1 {
|
||||
fsl,pins = <
|
||||
841 0x1c5 /* MX53_PAD_PATA_BUFFER_EN__UART2_RXD_MUX */
|
||||
836 0x1c5 /* MX53_PAD_PATA_DMARQ__UART2_TXD_MUX */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
uart3 {
|
||||
pinctrl_uart3_1: uart3grp-1 {
|
||||
fsl,pins = <
|
||||
884 0x1c5 /* MX53_PAD_PATA_CS_0__UART3_TXD_MUX */
|
||||
888 0x1c5 /* MX53_PAD_PATA_CS_1__UART3_RXD_MUX */
|
||||
875 0x1c5 /* MX53_PAD_PATA_DA_1__UART3_CTS */
|
||||
880 0x1c5 /* MX53_PAD_PATA_DA_2__UART3_RTS */
|
||||
>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
uart1: serial@53fbc000 {
|
||||
compatible = "fsl,imx53-uart", "fsl,imx21-uart";
|
||||
reg = <0x53fbc000 0x4000>;
|
||||
|
|
@ -203,6 +385,20 @@ uart2: serial@53fc0000 {
|
|||
status = "disabled";
|
||||
};
|
||||
|
||||
can1: can@53fc8000 {
|
||||
compatible = "fsl,imx53-flexcan", "fsl,p1010-flexcan";
|
||||
reg = <0x53fc8000 0x4000>;
|
||||
interrupts = <82>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
can2: can@53fcc000 {
|
||||
compatible = "fsl,imx53-flexcan", "fsl,p1010-flexcan";
|
||||
reg = <0x53fcc000 0x4000>;
|
||||
interrupts = <83>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
gpio5: gpio@53fdc000 {
|
||||
compatible = "fsl,imx53-gpio", "fsl,imx35-gpio";
|
||||
reg = <0x53fdc000 0x4000>;
|
||||
|
|
@ -277,6 +473,7 @@ sdma@63fb0000 {
|
|||
compatible = "fsl,imx53-sdma", "fsl,imx35-sdma";
|
||||
reg = <0x63fb0000 0x4000>;
|
||||
interrupts = <6>;
|
||||
fsl,sdma-ram-script-name = "imx/sdma/sdma-imx53.bin";
|
||||
};
|
||||
|
||||
cspi@63fc0000 {
|
||||
|
|
|
|||
|
|
@ -28,8 +28,27 @@ gpmi-nand@00112000 {
|
|||
status = "disabled"; /* gpmi nand conflicts with SD */
|
||||
};
|
||||
|
||||
aips-bus@02000000 { /* AIPS1 */
|
||||
iomuxc@020e0000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_hog>;
|
||||
|
||||
hog {
|
||||
pinctrl_hog: hoggrp {
|
||||
fsl,pins = <
|
||||
176 0x80000000 /* MX6Q_PAD_EIM_D25__GPIO_3_25 */
|
||||
1363 0x80000000 /* MX6Q_PAD_NANDF_CS0__GPIO_6_11 */
|
||||
1369 0x80000000 /* MX6Q_PAD_NANDF_CS1__GPIO_6_14 */
|
||||
>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
aips-bus@02100000 { /* AIPS2 */
|
||||
ethernet@02188000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_enet_2>;
|
||||
phy-mode = "rgmii";
|
||||
status = "okay";
|
||||
};
|
||||
|
|
@ -52,6 +71,8 @@ usdhc@0219c000 { /* uSDHC4 */
|
|||
};
|
||||
|
||||
uart4: serial@021f0000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_uart4_1>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -46,15 +46,20 @@ ssi1: ssi@02028000 {
|
|||
|
||||
iomuxc@020e0000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_gpio_hog>;
|
||||
pinctrl-0 = <&pinctrl_hog>;
|
||||
|
||||
gpios {
|
||||
pinctrl_gpio_hog: gpiohog {
|
||||
hog {
|
||||
pinctrl_hog: hoggrp {
|
||||
fsl,pins = <
|
||||
144 0x80000000 /* MX6Q_PAD_EIM_D22__GPIO_3_22 */
|
||||
121 0x80000000 /* MX6Q_PAD_EIM_D19__GPIO_3_19 */
|
||||
953 0x80000000 /* MX6Q_PAD_GPIO_0__CCM_CLKO */
|
||||
>;
|
||||
1450 0x80000000 /* MX6Q_PAD_NANDF_D6__GPIO_2_6 */
|
||||
1458 0x80000000 /* MX6Q_PAD_NANDF_D7__GPIO_2_7 */
|
||||
121 0x80000000 /* MX6Q_PAD_EIM_D19__GPIO_3_19 */
|
||||
144 0x80000000 /* MX6Q_PAD_EIM_D22__GPIO_3_22 */
|
||||
152 0x80000000 /* MX6Q_PAD_EIM_D23__GPIO_3_23 */
|
||||
1262 0x80000000 /* MX6Q_PAD_SD3_DAT5__GPIO_7_0 */
|
||||
1270 0x1f0b0 /* MX6Q_PAD_SD3_DAT4__GPIO_7_1 */
|
||||
953 0x80000000 /* MX6Q_PAD_GPIO_0__CCM_CLKO */
|
||||
>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
@ -71,12 +76,16 @@ usb@02184200 { /* USB1 */
|
|||
};
|
||||
|
||||
ethernet@02188000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_enet_1>;
|
||||
phy-mode = "rgmii";
|
||||
phy-reset-gpios = <&gpio3 23 0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
usdhc@02198000 { /* uSDHC3 */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_usdhc3_2>;
|
||||
cd-gpios = <&gpio7 0 0>;
|
||||
wp-gpios = <&gpio7 1 0>;
|
||||
vmmc-supply = <®_3p3v>;
|
||||
|
|
@ -84,6 +93,8 @@ usdhc@02198000 { /* uSDHC3 */
|
|||
};
|
||||
|
||||
usdhc@0219c000 { /* uSDHC4 */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_usdhc4_2>;
|
||||
cd-gpios = <&gpio2 6 0>;
|
||||
wp-gpios = <&gpio2 7 0>;
|
||||
vmmc-supply = <®_3p3v>;
|
||||
|
|
@ -99,7 +110,7 @@ audmux@021d8000 {
|
|||
uart2: serial@021e8000 {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_serial2_1>;
|
||||
pinctrl-0 = <&pinctrl_uart2_1>;
|
||||
};
|
||||
|
||||
i2c@021a0000 { /* I2C1 */
|
||||
|
|
|
|||
|
|
@ -22,28 +22,51 @@ memory {
|
|||
};
|
||||
|
||||
soc {
|
||||
|
||||
aips-bus@02000000 { /* AIPS1 */
|
||||
spba-bus@02000000 {
|
||||
uart1: serial@02020000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_uart1_1>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
iomuxc@020e0000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_hog>;
|
||||
|
||||
hog {
|
||||
pinctrl_hog: hoggrp {
|
||||
fsl,pins = <
|
||||
1402 0x80000000 /* MX6Q_PAD_NANDF_D0__GPIO_2_0 */
|
||||
1410 0x80000000 /* MX6Q_PAD_NANDF_D1__GPIO_2_1 */
|
||||
1418 0x80000000 /* MX6Q_PAD_NANDF_D2__GPIO_2_2 */
|
||||
1426 0x80000000 /* MX6Q_PAD_NANDF_D3__GPIO_2_3 */
|
||||
>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
aips-bus@02100000 { /* AIPS2 */
|
||||
ethernet@02188000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_enet_1>;
|
||||
phy-mode = "rgmii";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
usdhc@02194000 { /* uSDHC2 */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_usdhc2_1>;
|
||||
cd-gpios = <&gpio2 2 0>;
|
||||
wp-gpios = <&gpio2 3 0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
usdhc@02198000 { /* uSDHC3 */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_usdhc3_1>;
|
||||
cd-gpios = <&gpio2 0 0>;
|
||||
wp-gpios = <&gpio2 1 0>;
|
||||
status = "okay";
|
||||
|
|
|
|||
|
|
@ -362,7 +362,6 @@ wdog@020bc000 { /* WDOG1 */
|
|||
compatible = "fsl,imx6q-wdt", "fsl,imx21-wdt";
|
||||
reg = <0x020bc000 0x4000>;
|
||||
interrupts = <0 80 0x04>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
wdog@020c0000 { /* WDOG2 */
|
||||
|
|
@ -514,86 +513,199 @@ iomuxc@020e0000 {
|
|||
/* shared pinctrl settings */
|
||||
audmux {
|
||||
pinctrl_audmux_1: audmux-1 {
|
||||
fsl,pins = <18 0x80000000 /* MX6Q_PAD_SD2_DAT0__AUDMUX_AUD4_RXD */
|
||||
1586 0x80000000 /* MX6Q_PAD_SD2_DAT3__AUDMUX_AUD4_TXC */
|
||||
11 0x80000000 /* MX6Q_PAD_SD2_DAT2__AUDMUX_AUD4_TXD */
|
||||
3 0x80000000>; /* MX6Q_PAD_SD2_DAT1__AUDMUX_AUD4_TXFS */
|
||||
};
|
||||
};
|
||||
|
||||
gpmi-nand {
|
||||
pinctrl_gpmi_nand_1: gpmi-nand-1 {
|
||||
fsl,pins = <1328 0xb0b1 /* MX6Q_PAD_NANDF_CLE__RAWNAND_CLE */
|
||||
1336 0xb0b1 /* MX6Q_PAD_NANDF_ALE__RAWNAND_ALE */
|
||||
1344 0xb0b1 /* MX6Q_PAD_NANDF_WP_B__RAWNAND_RESETN */
|
||||
1352 0xb000 /* MX6Q_PAD_NANDF_RB0__RAWNAND_READY0 */
|
||||
1360 0xb0b1 /* MX6Q_PAD_NANDF_CS0__RAWNAND_CE0N */
|
||||
1365 0xb0b1 /* MX6Q_PAD_NANDF_CS1__RAWNAND_CE1N */
|
||||
1371 0xb0b1 /* MX6Q_PAD_NANDF_CS2__RAWNAND_CE2N */
|
||||
1378 0xb0b1 /* MX6Q_PAD_NANDF_CS3__RAWNAND_CE3N */
|
||||
1387 0xb0b1 /* MX6Q_PAD_SD4_CMD__RAWNAND_RDN */
|
||||
1393 0xb0b1 /* MX6Q_PAD_SD4_CLK__RAWNAND_WRN */
|
||||
1397 0xb0b1 /* MX6Q_PAD_NANDF_D0__RAWNAND_D0 */
|
||||
1405 0xb0b1 /* MX6Q_PAD_NANDF_D1__RAWNAND_D1 */
|
||||
1413 0xb0b1 /* MX6Q_PAD_NANDF_D2__RAWNAND_D2 */
|
||||
1421 0xb0b1 /* MX6Q_PAD_NANDF_D3__RAWNAND_D3 */
|
||||
1429 0xb0b1 /* MX6Q_PAD_NANDF_D4__RAWNAND_D4 */
|
||||
1437 0xb0b1 /* MX6Q_PAD_NANDF_D5__RAWNAND_D5 */
|
||||
1445 0xb0b1 /* MX6Q_PAD_NANDF_D6__RAWNAND_D6 */
|
||||
1453 0xb0b1 /* MX6Q_PAD_NANDF_D7__RAWNAND_D7 */
|
||||
1463 0x00b1>; /* MX6Q_PAD_SD4_DAT0__RAWNAND_DQS */
|
||||
};
|
||||
};
|
||||
|
||||
i2c1 {
|
||||
pinctrl_i2c1_1: i2c1grp-1 {
|
||||
fsl,pins = <137 0x4001b8b1 /* MX6Q_PAD_EIM_D21__I2C1_SCL */
|
||||
196 0x4001b8b1>; /* MX6Q_PAD_EIM_D28__I2C1_SDA */
|
||||
};
|
||||
};
|
||||
|
||||
serial2 {
|
||||
pinctrl_serial2_1: serial2grp-1 {
|
||||
fsl,pins = <183 0x1b0b1 /* MX6Q_PAD_EIM_D26__UART2_TXD */
|
||||
191 0x1b0b1>; /* MX6Q_PAD_EIM_D27__UART2_RXD */
|
||||
};
|
||||
};
|
||||
|
||||
usdhc3 {
|
||||
pinctrl_usdhc3_1: usdhc3grp-1 {
|
||||
fsl,pins = <1273 0x17059 /* MX6Q_PAD_SD3_CMD__USDHC3_CMD */
|
||||
1281 0x10059 /* MX6Q_PAD_SD3_CLK__USDHC3_CLK */
|
||||
1289 0x17059 /* MX6Q_PAD_SD3_DAT0__USDHC3_DAT0 */
|
||||
1297 0x17059 /* MX6Q_PAD_SD3_DAT1__USDHC3_DAT1 */
|
||||
1305 0x17059 /* MX6Q_PAD_SD3_DAT2__USDHC3_DAT2 */
|
||||
1312 0x17059 /* MX6Q_PAD_SD3_DAT3__USDHC3_DAT3 */
|
||||
1265 0x17059 /* MX6Q_PAD_SD3_DAT4__USDHC3_DAT4 */
|
||||
1257 0x17059 /* MX6Q_PAD_SD3_DAT5__USDHC3_DAT5 */
|
||||
1249 0x17059 /* MX6Q_PAD_SD3_DAT6__USDHC3_DAT6 */
|
||||
1241 0x17059>; /* MX6Q_PAD_SD3_DAT7__USDHC3_DAT7 */
|
||||
};
|
||||
};
|
||||
|
||||
usdhc4 {
|
||||
pinctrl_usdhc4_1: usdhc4grp-1 {
|
||||
fsl,pins = <1386 0x17059 /* MX6Q_PAD_SD4_CMD__USDHC4_CMD */
|
||||
1392 0x10059 /* MX6Q_PAD_SD4_CLK__USDHC4_CLK */
|
||||
1462 0x17059 /* MX6Q_PAD_SD4_DAT0__USDHC4_DAT0 */
|
||||
1470 0x17059 /* MX6Q_PAD_SD4_DAT1__USDHC4_DAT1 */
|
||||
1478 0x17059 /* MX6Q_PAD_SD4_DAT2__USDHC4_DAT2 */
|
||||
1486 0x17059 /* MX6Q_PAD_SD4_DAT3__USDHC4_DAT3 */
|
||||
1493 0x17059 /* MX6Q_PAD_SD4_DAT4__USDHC4_DAT4 */
|
||||
1501 0x17059 /* MX6Q_PAD_SD4_DAT5__USDHC4_DAT5 */
|
||||
1509 0x17059 /* MX6Q_PAD_SD4_DAT6__USDHC4_DAT6 */
|
||||
1517 0x17059>; /* MX6Q_PAD_SD4_DAT7__USDHC4_DAT7 */
|
||||
fsl,pins = <
|
||||
18 0x80000000 /* MX6Q_PAD_SD2_DAT0__AUDMUX_AUD4_RXD */
|
||||
1586 0x80000000 /* MX6Q_PAD_SD2_DAT3__AUDMUX_AUD4_TXC */
|
||||
11 0x80000000 /* MX6Q_PAD_SD2_DAT2__AUDMUX_AUD4_TXD */
|
||||
3 0x80000000 /* MX6Q_PAD_SD2_DAT1__AUDMUX_AUD4_TXFS */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
ecspi1 {
|
||||
pinctrl_ecspi1_1: ecspi1grp-1 {
|
||||
fsl,pins = <101 0x100b1 /* MX6Q_PAD_EIM_D17__ECSPI1_MISO */
|
||||
109 0x100b1 /* MX6Q_PAD_EIM_D18__ECSPI1_MOSI */
|
||||
94 0x100b1>; /* MX6Q_PAD_EIM_D16__ECSPI1_SCLK */
|
||||
fsl,pins = <
|
||||
101 0x100b1 /* MX6Q_PAD_EIM_D17__ECSPI1_MISO */
|
||||
109 0x100b1 /* MX6Q_PAD_EIM_D18__ECSPI1_MOSI */
|
||||
94 0x100b1 /* MX6Q_PAD_EIM_D16__ECSPI1_SCLK */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
enet {
|
||||
pinctrl_enet_1: enetgrp-1 {
|
||||
fsl,pins = <
|
||||
695 0x1b0b0 /* MX6Q_PAD_ENET_MDIO__ENET_MDIO */
|
||||
756 0x1b0b0 /* MX6Q_PAD_ENET_MDC__ENET_MDC */
|
||||
24 0x1b0b0 /* MX6Q_PAD_RGMII_TXC__ENET_RGMII_TXC */
|
||||
30 0x1b0b0 /* MX6Q_PAD_RGMII_TD0__ENET_RGMII_TD0 */
|
||||
34 0x1b0b0 /* MX6Q_PAD_RGMII_TD1__ENET_RGMII_TD1 */
|
||||
39 0x1b0b0 /* MX6Q_PAD_RGMII_TD2__ENET_RGMII_TD2 */
|
||||
44 0x1b0b0 /* MX6Q_PAD_RGMII_TD3__ENET_RGMII_TD3 */
|
||||
56 0x1b0b0 /* MX6Q_PAD_RGMII_TX_CTL__RGMII_TX_CTL */
|
||||
702 0x1b0b0 /* MX6Q_PAD_ENET_REF_CLK__ENET_TX_CLK */
|
||||
74 0x1b0b0 /* MX6Q_PAD_RGMII_RXC__ENET_RGMII_RXC */
|
||||
52 0x1b0b0 /* MX6Q_PAD_RGMII_RD0__ENET_RGMII_RD0 */
|
||||
61 0x1b0b0 /* MX6Q_PAD_RGMII_RD1__ENET_RGMII_RD1 */
|
||||
66 0x1b0b0 /* MX6Q_PAD_RGMII_RD2__ENET_RGMII_RD2 */
|
||||
70 0x1b0b0 /* MX6Q_PAD_RGMII_RD3__ENET_RGMII_RD3 */
|
||||
48 0x1b0b0 /* MX6Q_PAD_RGMII_RX_CTL__RGMII_RX_CTL */
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_enet_2: enetgrp-2 {
|
||||
fsl,pins = <
|
||||
890 0x1b0b0 /* MX6Q_PAD_KEY_COL1__ENET_MDIO */
|
||||
909 0x1b0b0 /* MX6Q_PAD_KEY_COL2__ENET_MDC */
|
||||
24 0x1b0b0 /* MX6Q_PAD_RGMII_TXC__ENET_RGMII_TXC */
|
||||
30 0x1b0b0 /* MX6Q_PAD_RGMII_TD0__ENET_RGMII_TD0 */
|
||||
34 0x1b0b0 /* MX6Q_PAD_RGMII_TD1__ENET_RGMII_TD1 */
|
||||
39 0x1b0b0 /* MX6Q_PAD_RGMII_TD2__ENET_RGMII_TD2 */
|
||||
44 0x1b0b0 /* MX6Q_PAD_RGMII_TD3__ENET_RGMII_TD3 */
|
||||
56 0x1b0b0 /* MX6Q_PAD_RGMII_TX_CTL__RGMII_TX_CTL */
|
||||
702 0x1b0b0 /* MX6Q_PAD_ENET_REF_CLK__ENET_TX_CLK */
|
||||
74 0x1b0b0 /* MX6Q_PAD_RGMII_RXC__ENET_RGMII_RXC */
|
||||
52 0x1b0b0 /* MX6Q_PAD_RGMII_RD0__ENET_RGMII_RD0 */
|
||||
61 0x1b0b0 /* MX6Q_PAD_RGMII_RD1__ENET_RGMII_RD1 */
|
||||
66 0x1b0b0 /* MX6Q_PAD_RGMII_RD2__ENET_RGMII_RD2 */
|
||||
70 0x1b0b0 /* MX6Q_PAD_RGMII_RD3__ENET_RGMII_RD3 */
|
||||
48 0x1b0b0 /* MX6Q_PAD_RGMII_RX_CTL__RGMII_RX_CTL */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
gpmi-nand {
|
||||
pinctrl_gpmi_nand_1: gpmi-nand-1 {
|
||||
fsl,pins = <
|
||||
1328 0xb0b1 /* MX6Q_PAD_NANDF_CLE__RAWNAND_CLE */
|
||||
1336 0xb0b1 /* MX6Q_PAD_NANDF_ALE__RAWNAND_ALE */
|
||||
1344 0xb0b1 /* MX6Q_PAD_NANDF_WP_B__RAWNAND_RESETN */
|
||||
1352 0xb000 /* MX6Q_PAD_NANDF_RB0__RAWNAND_READY0 */
|
||||
1360 0xb0b1 /* MX6Q_PAD_NANDF_CS0__RAWNAND_CE0N */
|
||||
1365 0xb0b1 /* MX6Q_PAD_NANDF_CS1__RAWNAND_CE1N */
|
||||
1371 0xb0b1 /* MX6Q_PAD_NANDF_CS2__RAWNAND_CE2N */
|
||||
1378 0xb0b1 /* MX6Q_PAD_NANDF_CS3__RAWNAND_CE3N */
|
||||
1387 0xb0b1 /* MX6Q_PAD_SD4_CMD__RAWNAND_RDN */
|
||||
1393 0xb0b1 /* MX6Q_PAD_SD4_CLK__RAWNAND_WRN */
|
||||
1397 0xb0b1 /* MX6Q_PAD_NANDF_D0__RAWNAND_D0 */
|
||||
1405 0xb0b1 /* MX6Q_PAD_NANDF_D1__RAWNAND_D1 */
|
||||
1413 0xb0b1 /* MX6Q_PAD_NANDF_D2__RAWNAND_D2 */
|
||||
1421 0xb0b1 /* MX6Q_PAD_NANDF_D3__RAWNAND_D3 */
|
||||
1429 0xb0b1 /* MX6Q_PAD_NANDF_D4__RAWNAND_D4 */
|
||||
1437 0xb0b1 /* MX6Q_PAD_NANDF_D5__RAWNAND_D5 */
|
||||
1445 0xb0b1 /* MX6Q_PAD_NANDF_D6__RAWNAND_D6 */
|
||||
1453 0xb0b1 /* MX6Q_PAD_NANDF_D7__RAWNAND_D7 */
|
||||
1463 0x00b1 /* MX6Q_PAD_SD4_DAT0__RAWNAND_DQS */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
i2c1 {
|
||||
pinctrl_i2c1_1: i2c1grp-1 {
|
||||
fsl,pins = <
|
||||
137 0x4001b8b1 /* MX6Q_PAD_EIM_D21__I2C1_SCL */
|
||||
196 0x4001b8b1 /* MX6Q_PAD_EIM_D28__I2C1_SDA */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
uart1 {
|
||||
pinctrl_uart1_1: uart1grp-1 {
|
||||
fsl,pins = <
|
||||
1140 0x1b0b1 /* MX6Q_PAD_CSI0_DAT10__UART1_TXD */
|
||||
1148 0x1b0b1 /* MX6Q_PAD_CSI0_DAT11__UART1_RXD */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
uart2 {
|
||||
pinctrl_uart2_1: uart2grp-1 {
|
||||
fsl,pins = <
|
||||
183 0x1b0b1 /* MX6Q_PAD_EIM_D26__UART2_TXD */
|
||||
191 0x1b0b1 /* MX6Q_PAD_EIM_D27__UART2_RXD */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
uart4 {
|
||||
pinctrl_uart4_1: uart4grp-1 {
|
||||
fsl,pins = <
|
||||
877 0x1b0b1 /* MX6Q_PAD_KEY_COL0__UART4_TXD */
|
||||
885 0x1b0b1 /* MX6Q_PAD_KEY_ROW0__UART4_RXD */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
usdhc2 {
|
||||
pinctrl_usdhc2_1: usdhc2grp-1 {
|
||||
fsl,pins = <
|
||||
1577 0x17059 /* MX6Q_PAD_SD2_CMD__USDHC2_CMD */
|
||||
1569 0x10059 /* MX6Q_PAD_SD2_CLK__USDHC2_CLK */
|
||||
16 0x17059 /* MX6Q_PAD_SD2_DAT0__USDHC2_DAT0 */
|
||||
0 0x17059 /* MX6Q_PAD_SD2_DAT1__USDHC2_DAT1 */
|
||||
8 0x17059 /* MX6Q_PAD_SD2_DAT2__USDHC2_DAT2 */
|
||||
1583 0x17059 /* MX6Q_PAD_SD2_DAT3__USDHC2_DAT3 */
|
||||
1430 0x17059 /* MX6Q_PAD_NANDF_D4__USDHC2_DAT4 */
|
||||
1438 0x17059 /* MX6Q_PAD_NANDF_D5__USDHC2_DAT5 */
|
||||
1446 0x17059 /* MX6Q_PAD_NANDF_D6__USDHC2_DAT6 */
|
||||
1454 0x17059 /* MX6Q_PAD_NANDF_D7__USDHC2_DAT7 */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
usdhc3 {
|
||||
pinctrl_usdhc3_1: usdhc3grp-1 {
|
||||
fsl,pins = <
|
||||
1273 0x17059 /* MX6Q_PAD_SD3_CMD__USDHC3_CMD */
|
||||
1281 0x10059 /* MX6Q_PAD_SD3_CLK__USDHC3_CLK */
|
||||
1289 0x17059 /* MX6Q_PAD_SD3_DAT0__USDHC3_DAT0 */
|
||||
1297 0x17059 /* MX6Q_PAD_SD3_DAT1__USDHC3_DAT1 */
|
||||
1305 0x17059 /* MX6Q_PAD_SD3_DAT2__USDHC3_DAT2 */
|
||||
1312 0x17059 /* MX6Q_PAD_SD3_DAT3__USDHC3_DAT3 */
|
||||
1265 0x17059 /* MX6Q_PAD_SD3_DAT4__USDHC3_DAT4 */
|
||||
1257 0x17059 /* MX6Q_PAD_SD3_DAT5__USDHC3_DAT5 */
|
||||
1249 0x17059 /* MX6Q_PAD_SD3_DAT6__USDHC3_DAT6 */
|
||||
1241 0x17059 /* MX6Q_PAD_SD3_DAT7__USDHC3_DAT7 */
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_usdhc3_2: usdhc3grp-2 {
|
||||
fsl,pins = <
|
||||
1273 0x17059 /* MX6Q_PAD_SD3_CMD__USDHC3_CMD */
|
||||
1281 0x10059 /* MX6Q_PAD_SD3_CLK__USDHC3_CLK */
|
||||
1289 0x17059 /* MX6Q_PAD_SD3_DAT0__USDHC3_DAT0 */
|
||||
1297 0x17059 /* MX6Q_PAD_SD3_DAT1__USDHC3_DAT1 */
|
||||
1305 0x17059 /* MX6Q_PAD_SD3_DAT2__USDHC3_DAT2 */
|
||||
1312 0x17059 /* MX6Q_PAD_SD3_DAT3__USDHC3_DAT3 */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
usdhc4 {
|
||||
pinctrl_usdhc4_1: usdhc4grp-1 {
|
||||
fsl,pins = <
|
||||
1386 0x17059 /* MX6Q_PAD_SD4_CMD__USDHC4_CMD */
|
||||
1392 0x10059 /* MX6Q_PAD_SD4_CLK__USDHC4_CLK */
|
||||
1462 0x17059 /* MX6Q_PAD_SD4_DAT0__USDHC4_DAT0 */
|
||||
1470 0x17059 /* MX6Q_PAD_SD4_DAT1__USDHC4_DAT1 */
|
||||
1478 0x17059 /* MX6Q_PAD_SD4_DAT2__USDHC4_DAT2 */
|
||||
1486 0x17059 /* MX6Q_PAD_SD4_DAT3__USDHC4_DAT3 */
|
||||
1493 0x17059 /* MX6Q_PAD_SD4_DAT4__USDHC4_DAT4 */
|
||||
1501 0x17059 /* MX6Q_PAD_SD4_DAT5__USDHC4_DAT5 */
|
||||
1509 0x17059 /* MX6Q_PAD_SD4_DAT6__USDHC4_DAT6 */
|
||||
1517 0x17059 /* MX6Q_PAD_SD4_DAT7__USDHC4_DAT7 */
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_usdhc4_2: usdhc4grp-2 {
|
||||
fsl,pins = <
|
||||
1386 0x17059 /* MX6Q_PAD_SD4_CMD__USDHC4_CMD */
|
||||
1392 0x10059 /* MX6Q_PAD_SD4_CLK__USDHC4_CLK */
|
||||
1462 0x17059 /* MX6Q_PAD_SD4_DAT0__USDHC4_DAT0 */
|
||||
1470 0x17059 /* MX6Q_PAD_SD4_DAT1__USDHC4_DAT1 */
|
||||
1478 0x17059 /* MX6Q_PAD_SD4_DAT2__USDHC4_DAT2 */
|
||||
1486 0x17059 /* MX6Q_PAD_SD4_DAT3__USDHC4_DAT3 */
|
||||
>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -32,9 +32,7 @@ CONFIG_MACH_VPR200=y
|
|||
CONFIG_MACH_IMX51_DT=y
|
||||
CONFIG_MACH_MX51_3DS=y
|
||||
CONFIG_MACH_EUKREA_CPUIMX51SD=y
|
||||
CONFIG_MACH_MX51_EFIKAMX=y
|
||||
CONFIG_MACH_MX51_EFIKASB=y
|
||||
CONFIG_MACH_IMX53_DT=y
|
||||
CONFIG_SOC_IMX53=y
|
||||
CONFIG_SOC_IMX6Q=y
|
||||
CONFIG_MXC_PWM=y
|
||||
CONFIG_SMP=y
|
||||
|
|
|
|||
|
|
@ -195,25 +195,6 @@ static inline pte_t *pmd_page_vaddr(pmd_t pmd)
|
|||
|
||||
#define pte_clear(mm,addr,ptep) set_pte_ext(ptep, __pte(0), 0)
|
||||
|
||||
#if __LINUX_ARM_ARCH__ < 6
|
||||
static inline void __sync_icache_dcache(pte_t pteval)
|
||||
{
|
||||
}
|
||||
#else
|
||||
extern void __sync_icache_dcache(pte_t pteval);
|
||||
#endif
|
||||
|
||||
static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
|
||||
pte_t *ptep, pte_t pteval)
|
||||
{
|
||||
if (addr >= TASK_SIZE)
|
||||
set_pte_ext(ptep, pteval, 0);
|
||||
else {
|
||||
__sync_icache_dcache(pteval);
|
||||
set_pte_ext(ptep, pteval, PTE_EXT_NG);
|
||||
}
|
||||
}
|
||||
|
||||
#define pte_none(pte) (!pte_val(pte))
|
||||
#define pte_present(pte) (pte_val(pte) & L_PTE_PRESENT)
|
||||
#define pte_write(pte) (!(pte_val(pte) & L_PTE_RDONLY))
|
||||
|
|
@ -226,6 +207,27 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
|
|||
((pte_val(pte) & (L_PTE_PRESENT | L_PTE_USER)) == \
|
||||
(L_PTE_PRESENT | L_PTE_USER))
|
||||
|
||||
#if __LINUX_ARM_ARCH__ < 6
|
||||
static inline void __sync_icache_dcache(pte_t pteval)
|
||||
{
|
||||
}
|
||||
#else
|
||||
extern void __sync_icache_dcache(pte_t pteval);
|
||||
#endif
|
||||
|
||||
static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
|
||||
pte_t *ptep, pte_t pteval)
|
||||
{
|
||||
unsigned long ext = 0;
|
||||
|
||||
if (addr < TASK_SIZE && pte_present_user(pteval)) {
|
||||
__sync_icache_dcache(pteval);
|
||||
ext |= PTE_EXT_NG;
|
||||
}
|
||||
|
||||
set_pte_ext(ptep, pteval, ext);
|
||||
}
|
||||
|
||||
#define PTE_BIT_FUNC(fn,op) \
|
||||
static inline pte_t pte_##fn(pte_t pte) { pte_val(pte) op; return pte; }
|
||||
|
||||
|
|
@ -251,13 +253,13 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
|
|||
*
|
||||
* 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
|
||||
* 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
|
||||
* <--------------- offset --------------------> <- type --> 0 0 0
|
||||
* <--------------- offset ----------------------> < type -> 0 0 0
|
||||
*
|
||||
* This gives us up to 63 swap files and 32GB per swap file. Note that
|
||||
* This gives us up to 31 swap files and 64GB per swap file. Note that
|
||||
* the offset field is always non-zero.
|
||||
*/
|
||||
#define __SWP_TYPE_SHIFT 3
|
||||
#define __SWP_TYPE_BITS 6
|
||||
#define __SWP_TYPE_BITS 5
|
||||
#define __SWP_TYPE_MASK ((1 << __SWP_TYPE_BITS) - 1)
|
||||
#define __SWP_OFFSET_SHIFT (__SWP_TYPE_BITS + __SWP_TYPE_SHIFT)
|
||||
|
||||
|
|
|
|||
|
|
@ -10,5 +10,7 @@
|
|||
|
||||
extern void sched_clock_postinit(void);
|
||||
extern void setup_sched_clock(u32 (*read)(void), int bits, unsigned long rate);
|
||||
extern void setup_sched_clock_needs_suspend(u32 (*read)(void), int bits,
|
||||
unsigned long rate);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -21,6 +21,8 @@ struct clock_data {
|
|||
u32 epoch_cyc_copy;
|
||||
u32 mult;
|
||||
u32 shift;
|
||||
bool suspended;
|
||||
bool needs_suspend;
|
||||
};
|
||||
|
||||
static void sched_clock_poll(unsigned long wrap_ticks);
|
||||
|
|
@ -49,6 +51,9 @@ static unsigned long long cyc_to_sched_clock(u32 cyc, u32 mask)
|
|||
u64 epoch_ns;
|
||||
u32 epoch_cyc;
|
||||
|
||||
if (cd.suspended)
|
||||
return cd.epoch_ns;
|
||||
|
||||
/*
|
||||
* Load the epoch_cyc and epoch_ns atomically. We do this by
|
||||
* ensuring that we always write epoch_cyc, epoch_ns and
|
||||
|
|
@ -98,6 +103,13 @@ static void sched_clock_poll(unsigned long wrap_ticks)
|
|||
update_sched_clock();
|
||||
}
|
||||
|
||||
void __init setup_sched_clock_needs_suspend(u32 (*read)(void), int bits,
|
||||
unsigned long rate)
|
||||
{
|
||||
setup_sched_clock(read, bits, rate);
|
||||
cd.needs_suspend = true;
|
||||
}
|
||||
|
||||
void __init setup_sched_clock(u32 (*read)(void), int bits, unsigned long rate)
|
||||
{
|
||||
unsigned long r, w;
|
||||
|
|
@ -169,11 +181,23 @@ void __init sched_clock_postinit(void)
|
|||
static int sched_clock_suspend(void)
|
||||
{
|
||||
sched_clock_poll(sched_clock_timer.data);
|
||||
if (cd.needs_suspend)
|
||||
cd.suspended = true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void sched_clock_resume(void)
|
||||
{
|
||||
if (cd.needs_suspend) {
|
||||
cd.epoch_cyc = read_sched_clock();
|
||||
cd.epoch_cyc_copy = cd.epoch_cyc;
|
||||
cd.suspended = false;
|
||||
}
|
||||
}
|
||||
|
||||
static struct syscore_ops sched_clock_ops = {
|
||||
.suspend = sched_clock_suspend,
|
||||
.resume = sched_clock_resume,
|
||||
};
|
||||
|
||||
static int __init sched_clock_syscore_init(void)
|
||||
|
|
|
|||
|
|
@ -321,7 +321,7 @@ void store_cpu_topology(unsigned int cpuid)
|
|||
* init_cpu_topology is called at boot when only one cpu is running
|
||||
* which prevent simultaneous write access to cpu_topology array
|
||||
*/
|
||||
void init_cpu_topology(void)
|
||||
void __init init_cpu_topology(void)
|
||||
{
|
||||
unsigned int cpu;
|
||||
|
||||
|
|
|
|||
|
|
@ -16,13 +16,30 @@ lib-y := backtrace.o changebit.o csumipv6.o csumpartial.o \
|
|||
call_with_stack.o
|
||||
|
||||
mmu-y := clear_user.o copy_page.o getuser.o putuser.o
|
||||
mmu-y += copy_from_user.o copy_to_user.o
|
||||
|
||||
# the code in uaccess.S is not preemption safe and
|
||||
# probably faster on ARMv3 only
|
||||
ifeq ($(CONFIG_PREEMPT),y)
|
||||
mmu-y += copy_from_user.o copy_to_user.o
|
||||
else
|
||||
ifneq ($(CONFIG_CPU_32v3),y)
|
||||
mmu-y += copy_from_user.o copy_to_user.o
|
||||
else
|
||||
mmu-y += uaccess.o
|
||||
endif
|
||||
endif
|
||||
|
||||
# using lib_ here won't override already available weak symbols
|
||||
obj-$(CONFIG_UACCESS_WITH_MEMCPY) += uaccess_with_memcpy.o
|
||||
|
||||
lib-$(CONFIG_MMU) += $(mmu-y)
|
||||
lib-y += io-readsw-armv4.o io-writesw-armv4.o
|
||||
lib-$(CONFIG_MMU) += $(mmu-y)
|
||||
|
||||
ifeq ($(CONFIG_CPU_32v3),y)
|
||||
lib-y += io-readsw-armv3.o io-writesw-armv3.o
|
||||
else
|
||||
lib-y += io-readsw-armv4.o io-writesw-armv4.o
|
||||
endif
|
||||
|
||||
lib-$(CONFIG_ARCH_RPC) += ecard.o io-acorn.o floppydma.o
|
||||
lib-$(CONFIG_ARCH_SHARK) += io-shark.o
|
||||
|
||||
|
|
|
|||
106
arch/arm/lib/io-readsw-armv3.S
Normal file
106
arch/arm/lib/io-readsw-armv3.S
Normal file
|
|
@ -0,0 +1,106 @@
|
|||
/*
|
||||
* linux/arch/arm/lib/io-readsw-armv3.S
|
||||
*
|
||||
* Copyright (C) 1995-2000 Russell King
|
||||
*
|
||||
* 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 <asm/assembler.h>
|
||||
|
||||
.Linsw_bad_alignment:
|
||||
adr r0, .Linsw_bad_align_msg
|
||||
mov r2, lr
|
||||
b panic
|
||||
.Linsw_bad_align_msg:
|
||||
.asciz "insw: bad buffer alignment (0x%p, lr=0x%08lX)\n"
|
||||
.align
|
||||
|
||||
.Linsw_align: tst r1, #1
|
||||
bne .Linsw_bad_alignment
|
||||
|
||||
ldr r3, [r0]
|
||||
strb r3, [r1], #1
|
||||
mov r3, r3, lsr #8
|
||||
strb r3, [r1], #1
|
||||
|
||||
subs r2, r2, #1
|
||||
moveq pc, lr
|
||||
|
||||
ENTRY(__raw_readsw)
|
||||
teq r2, #0 @ do we have to check for the zero len?
|
||||
moveq pc, lr
|
||||
tst r1, #3
|
||||
bne .Linsw_align
|
||||
|
||||
.Linsw_aligned: mov ip, #0xff
|
||||
orr ip, ip, ip, lsl #8
|
||||
stmfd sp!, {r4, r5, r6, lr}
|
||||
|
||||
subs r2, r2, #8
|
||||
bmi .Lno_insw_8
|
||||
|
||||
.Linsw_8_lp: ldr r3, [r0]
|
||||
and r3, r3, ip
|
||||
ldr r4, [r0]
|
||||
orr r3, r3, r4, lsl #16
|
||||
|
||||
ldr r4, [r0]
|
||||
and r4, r4, ip
|
||||
ldr r5, [r0]
|
||||
orr r4, r4, r5, lsl #16
|
||||
|
||||
ldr r5, [r0]
|
||||
and r5, r5, ip
|
||||
ldr r6, [r0]
|
||||
orr r5, r5, r6, lsl #16
|
||||
|
||||
ldr r6, [r0]
|
||||
and r6, r6, ip
|
||||
ldr lr, [r0]
|
||||
orr r6, r6, lr, lsl #16
|
||||
|
||||
stmia r1!, {r3 - r6}
|
||||
|
||||
subs r2, r2, #8
|
||||
bpl .Linsw_8_lp
|
||||
|
||||
tst r2, #7
|
||||
ldmeqfd sp!, {r4, r5, r6, pc}
|
||||
|
||||
.Lno_insw_8: tst r2, #4
|
||||
beq .Lno_insw_4
|
||||
|
||||
ldr r3, [r0]
|
||||
and r3, r3, ip
|
||||
ldr r4, [r0]
|
||||
orr r3, r3, r4, lsl #16
|
||||
|
||||
ldr r4, [r0]
|
||||
and r4, r4, ip
|
||||
ldr r5, [r0]
|
||||
orr r4, r4, r5, lsl #16
|
||||
|
||||
stmia r1!, {r3, r4}
|
||||
|
||||
.Lno_insw_4: tst r2, #2
|
||||
beq .Lno_insw_2
|
||||
|
||||
ldr r3, [r0]
|
||||
and r3, r3, ip
|
||||
ldr r4, [r0]
|
||||
orr r3, r3, r4, lsl #16
|
||||
|
||||
str r3, [r1], #4
|
||||
|
||||
.Lno_insw_2: tst r2, #1
|
||||
ldrne r3, [r0]
|
||||
strneb r3, [r1], #1
|
||||
movne r3, r3, lsr #8
|
||||
strneb r3, [r1]
|
||||
|
||||
ldmfd sp!, {r4, r5, r6, pc}
|
||||
|
||||
|
||||
126
arch/arm/lib/io-writesw-armv3.S
Normal file
126
arch/arm/lib/io-writesw-armv3.S
Normal file
|
|
@ -0,0 +1,126 @@
|
|||
/*
|
||||
* linux/arch/arm/lib/io-writesw-armv3.S
|
||||
*
|
||||
* Copyright (C) 1995-2000 Russell King
|
||||
*
|
||||
* 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 <asm/assembler.h>
|
||||
|
||||
.Loutsw_bad_alignment:
|
||||
adr r0, .Loutsw_bad_align_msg
|
||||
mov r2, lr
|
||||
b panic
|
||||
.Loutsw_bad_align_msg:
|
||||
.asciz "outsw: bad buffer alignment (0x%p, lr=0x%08lX)\n"
|
||||
.align
|
||||
|
||||
.Loutsw_align: tst r1, #1
|
||||
bne .Loutsw_bad_alignment
|
||||
|
||||
add r1, r1, #2
|
||||
|
||||
ldr r3, [r1, #-4]
|
||||
mov r3, r3, lsr #16
|
||||
orr r3, r3, r3, lsl #16
|
||||
str r3, [r0]
|
||||
subs r2, r2, #1
|
||||
moveq pc, lr
|
||||
|
||||
ENTRY(__raw_writesw)
|
||||
teq r2, #0 @ do we have to check for the zero len?
|
||||
moveq pc, lr
|
||||
tst r1, #3
|
||||
bne .Loutsw_align
|
||||
|
||||
stmfd sp!, {r4, r5, r6, lr}
|
||||
|
||||
subs r2, r2, #8
|
||||
bmi .Lno_outsw_8
|
||||
|
||||
.Loutsw_8_lp: ldmia r1!, {r3, r4, r5, r6}
|
||||
|
||||
mov ip, r3, lsl #16
|
||||
orr ip, ip, ip, lsr #16
|
||||
str ip, [r0]
|
||||
|
||||
mov ip, r3, lsr #16
|
||||
orr ip, ip, ip, lsl #16
|
||||
str ip, [r0]
|
||||
|
||||
mov ip, r4, lsl #16
|
||||
orr ip, ip, ip, lsr #16
|
||||
str ip, [r0]
|
||||
|
||||
mov ip, r4, lsr #16
|
||||
orr ip, ip, ip, lsl #16
|
||||
str ip, [r0]
|
||||
|
||||
mov ip, r5, lsl #16
|
||||
orr ip, ip, ip, lsr #16
|
||||
str ip, [r0]
|
||||
|
||||
mov ip, r5, lsr #16
|
||||
orr ip, ip, ip, lsl #16
|
||||
str ip, [r0]
|
||||
|
||||
mov ip, r6, lsl #16
|
||||
orr ip, ip, ip, lsr #16
|
||||
str ip, [r0]
|
||||
|
||||
mov ip, r6, lsr #16
|
||||
orr ip, ip, ip, lsl #16
|
||||
str ip, [r0]
|
||||
|
||||
subs r2, r2, #8
|
||||
bpl .Loutsw_8_lp
|
||||
|
||||
tst r2, #7
|
||||
ldmeqfd sp!, {r4, r5, r6, pc}
|
||||
|
||||
.Lno_outsw_8: tst r2, #4
|
||||
beq .Lno_outsw_4
|
||||
|
||||
ldmia r1!, {r3, r4}
|
||||
|
||||
mov ip, r3, lsl #16
|
||||
orr ip, ip, ip, lsr #16
|
||||
str ip, [r0]
|
||||
|
||||
mov ip, r3, lsr #16
|
||||
orr ip, ip, ip, lsl #16
|
||||
str ip, [r0]
|
||||
|
||||
mov ip, r4, lsl #16
|
||||
orr ip, ip, ip, lsr #16
|
||||
str ip, [r0]
|
||||
|
||||
mov ip, r4, lsr #16
|
||||
orr ip, ip, ip, lsl #16
|
||||
str ip, [r0]
|
||||
|
||||
.Lno_outsw_4: tst r2, #2
|
||||
beq .Lno_outsw_2
|
||||
|
||||
ldr r3, [r1], #4
|
||||
|
||||
mov ip, r3, lsl #16
|
||||
orr ip, ip, ip, lsr #16
|
||||
str ip, [r0]
|
||||
|
||||
mov ip, r3, lsr #16
|
||||
orr ip, ip, ip, lsl #16
|
||||
str ip, [r0]
|
||||
|
||||
.Lno_outsw_2: tst r2, #1
|
||||
|
||||
ldrne r3, [r1]
|
||||
|
||||
movne ip, r3, lsl #16
|
||||
orrne ip, ip, ip, lsr #16
|
||||
strne ip, [r0]
|
||||
|
||||
ldmfd sp!, {r4, r5, r6, pc}
|
||||
564
arch/arm/lib/uaccess.S
Normal file
564
arch/arm/lib/uaccess.S
Normal file
|
|
@ -0,0 +1,564 @@
|
|||
/*
|
||||
* linux/arch/arm/lib/uaccess.S
|
||||
*
|
||||
* Copyright (C) 1995, 1996,1997,1998 Russell King
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* Routines to block copy data to/from user memory
|
||||
* These are highly optimised both for the 4k page size
|
||||
* and for various alignments.
|
||||
*/
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/errno.h>
|
||||
#include <asm/domain.h>
|
||||
|
||||
.text
|
||||
|
||||
#define PAGE_SHIFT 12
|
||||
|
||||
/* Prototype: int __copy_to_user(void *to, const char *from, size_t n)
|
||||
* Purpose : copy a block to user memory from kernel memory
|
||||
* Params : to - user memory
|
||||
* : from - kernel memory
|
||||
* : n - number of bytes to copy
|
||||
* Returns : Number of bytes NOT copied.
|
||||
*/
|
||||
|
||||
.Lc2u_dest_not_aligned:
|
||||
rsb ip, ip, #4
|
||||
cmp ip, #2
|
||||
ldrb r3, [r1], #1
|
||||
USER( TUSER( strb) r3, [r0], #1) @ May fault
|
||||
ldrgeb r3, [r1], #1
|
||||
USER( TUSER( strgeb) r3, [r0], #1) @ May fault
|
||||
ldrgtb r3, [r1], #1
|
||||
USER( TUSER( strgtb) r3, [r0], #1) @ May fault
|
||||
sub r2, r2, ip
|
||||
b .Lc2u_dest_aligned
|
||||
|
||||
ENTRY(__copy_to_user)
|
||||
stmfd sp!, {r2, r4 - r7, lr}
|
||||
cmp r2, #4
|
||||
blt .Lc2u_not_enough
|
||||
ands ip, r0, #3
|
||||
bne .Lc2u_dest_not_aligned
|
||||
.Lc2u_dest_aligned:
|
||||
|
||||
ands ip, r1, #3
|
||||
bne .Lc2u_src_not_aligned
|
||||
/*
|
||||
* Seeing as there has to be at least 8 bytes to copy, we can
|
||||
* copy one word, and force a user-mode page fault...
|
||||
*/
|
||||
|
||||
.Lc2u_0fupi: subs r2, r2, #4
|
||||
addmi ip, r2, #4
|
||||
bmi .Lc2u_0nowords
|
||||
ldr r3, [r1], #4
|
||||
USER( TUSER( str) r3, [r0], #4) @ May fault
|
||||
mov ip, r0, lsl #32 - PAGE_SHIFT @ On each page, use a ld/st??t instruction
|
||||
rsb ip, ip, #0
|
||||
movs ip, ip, lsr #32 - PAGE_SHIFT
|
||||
beq .Lc2u_0fupi
|
||||
/*
|
||||
* ip = max no. of bytes to copy before needing another "strt" insn
|
||||
*/
|
||||
cmp r2, ip
|
||||
movlt ip, r2
|
||||
sub r2, r2, ip
|
||||
subs ip, ip, #32
|
||||
blt .Lc2u_0rem8lp
|
||||
|
||||
.Lc2u_0cpy8lp: ldmia r1!, {r3 - r6}
|
||||
stmia r0!, {r3 - r6} @ Shouldnt fault
|
||||
ldmia r1!, {r3 - r6}
|
||||
subs ip, ip, #32
|
||||
stmia r0!, {r3 - r6} @ Shouldnt fault
|
||||
bpl .Lc2u_0cpy8lp
|
||||
|
||||
.Lc2u_0rem8lp: cmn ip, #16
|
||||
ldmgeia r1!, {r3 - r6}
|
||||
stmgeia r0!, {r3 - r6} @ Shouldnt fault
|
||||
tst ip, #8
|
||||
ldmneia r1!, {r3 - r4}
|
||||
stmneia r0!, {r3 - r4} @ Shouldnt fault
|
||||
tst ip, #4
|
||||
ldrne r3, [r1], #4
|
||||
TUSER( strne) r3, [r0], #4 @ Shouldnt fault
|
||||
ands ip, ip, #3
|
||||
beq .Lc2u_0fupi
|
||||
.Lc2u_0nowords: teq ip, #0
|
||||
beq .Lc2u_finished
|
||||
.Lc2u_nowords: cmp ip, #2
|
||||
ldrb r3, [r1], #1
|
||||
USER( TUSER( strb) r3, [r0], #1) @ May fault
|
||||
ldrgeb r3, [r1], #1
|
||||
USER( TUSER( strgeb) r3, [r0], #1) @ May fault
|
||||
ldrgtb r3, [r1], #1
|
||||
USER( TUSER( strgtb) r3, [r0], #1) @ May fault
|
||||
b .Lc2u_finished
|
||||
|
||||
.Lc2u_not_enough:
|
||||
movs ip, r2
|
||||
bne .Lc2u_nowords
|
||||
.Lc2u_finished: mov r0, #0
|
||||
ldmfd sp!, {r2, r4 - r7, pc}
|
||||
|
||||
.Lc2u_src_not_aligned:
|
||||
bic r1, r1, #3
|
||||
ldr r7, [r1], #4
|
||||
cmp ip, #2
|
||||
bgt .Lc2u_3fupi
|
||||
beq .Lc2u_2fupi
|
||||
.Lc2u_1fupi: subs r2, r2, #4
|
||||
addmi ip, r2, #4
|
||||
bmi .Lc2u_1nowords
|
||||
mov r3, r7, pull #8
|
||||
ldr r7, [r1], #4
|
||||
orr r3, r3, r7, push #24
|
||||
USER( TUSER( str) r3, [r0], #4) @ May fault
|
||||
mov ip, r0, lsl #32 - PAGE_SHIFT
|
||||
rsb ip, ip, #0
|
||||
movs ip, ip, lsr #32 - PAGE_SHIFT
|
||||
beq .Lc2u_1fupi
|
||||
cmp r2, ip
|
||||
movlt ip, r2
|
||||
sub r2, r2, ip
|
||||
subs ip, ip, #16
|
||||
blt .Lc2u_1rem8lp
|
||||
|
||||
.Lc2u_1cpy8lp: mov r3, r7, pull #8
|
||||
ldmia r1!, {r4 - r7}
|
||||
subs ip, ip, #16
|
||||
orr r3, r3, r4, push #24
|
||||
mov r4, r4, pull #8
|
||||
orr r4, r4, r5, push #24
|
||||
mov r5, r5, pull #8
|
||||
orr r5, r5, r6, push #24
|
||||
mov r6, r6, pull #8
|
||||
orr r6, r6, r7, push #24
|
||||
stmia r0!, {r3 - r6} @ Shouldnt fault
|
||||
bpl .Lc2u_1cpy8lp
|
||||
|
||||
.Lc2u_1rem8lp: tst ip, #8
|
||||
movne r3, r7, pull #8
|
||||
ldmneia r1!, {r4, r7}
|
||||
orrne r3, r3, r4, push #24
|
||||
movne r4, r4, pull #8
|
||||
orrne r4, r4, r7, push #24
|
||||
stmneia r0!, {r3 - r4} @ Shouldnt fault
|
||||
tst ip, #4
|
||||
movne r3, r7, pull #8
|
||||
ldrne r7, [r1], #4
|
||||
orrne r3, r3, r7, push #24
|
||||
TUSER( strne) r3, [r0], #4 @ Shouldnt fault
|
||||
ands ip, ip, #3
|
||||
beq .Lc2u_1fupi
|
||||
.Lc2u_1nowords: mov r3, r7, get_byte_1
|
||||
teq ip, #0
|
||||
beq .Lc2u_finished
|
||||
cmp ip, #2
|
||||
USER( TUSER( strb) r3, [r0], #1) @ May fault
|
||||
movge r3, r7, get_byte_2
|
||||
USER( TUSER( strgeb) r3, [r0], #1) @ May fault
|
||||
movgt r3, r7, get_byte_3
|
||||
USER( TUSER( strgtb) r3, [r0], #1) @ May fault
|
||||
b .Lc2u_finished
|
||||
|
||||
.Lc2u_2fupi: subs r2, r2, #4
|
||||
addmi ip, r2, #4
|
||||
bmi .Lc2u_2nowords
|
||||
mov r3, r7, pull #16
|
||||
ldr r7, [r1], #4
|
||||
orr r3, r3, r7, push #16
|
||||
USER( TUSER( str) r3, [r0], #4) @ May fault
|
||||
mov ip, r0, lsl #32 - PAGE_SHIFT
|
||||
rsb ip, ip, #0
|
||||
movs ip, ip, lsr #32 - PAGE_SHIFT
|
||||
beq .Lc2u_2fupi
|
||||
cmp r2, ip
|
||||
movlt ip, r2
|
||||
sub r2, r2, ip
|
||||
subs ip, ip, #16
|
||||
blt .Lc2u_2rem8lp
|
||||
|
||||
.Lc2u_2cpy8lp: mov r3, r7, pull #16
|
||||
ldmia r1!, {r4 - r7}
|
||||
subs ip, ip, #16
|
||||
orr r3, r3, r4, push #16
|
||||
mov r4, r4, pull #16
|
||||
orr r4, r4, r5, push #16
|
||||
mov r5, r5, pull #16
|
||||
orr r5, r5, r6, push #16
|
||||
mov r6, r6, pull #16
|
||||
orr r6, r6, r7, push #16
|
||||
stmia r0!, {r3 - r6} @ Shouldnt fault
|
||||
bpl .Lc2u_2cpy8lp
|
||||
|
||||
.Lc2u_2rem8lp: tst ip, #8
|
||||
movne r3, r7, pull #16
|
||||
ldmneia r1!, {r4, r7}
|
||||
orrne r3, r3, r4, push #16
|
||||
movne r4, r4, pull #16
|
||||
orrne r4, r4, r7, push #16
|
||||
stmneia r0!, {r3 - r4} @ Shouldnt fault
|
||||
tst ip, #4
|
||||
movne r3, r7, pull #16
|
||||
ldrne r7, [r1], #4
|
||||
orrne r3, r3, r7, push #16
|
||||
TUSER( strne) r3, [r0], #4 @ Shouldnt fault
|
||||
ands ip, ip, #3
|
||||
beq .Lc2u_2fupi
|
||||
.Lc2u_2nowords: mov r3, r7, get_byte_2
|
||||
teq ip, #0
|
||||
beq .Lc2u_finished
|
||||
cmp ip, #2
|
||||
USER( TUSER( strb) r3, [r0], #1) @ May fault
|
||||
movge r3, r7, get_byte_3
|
||||
USER( TUSER( strgeb) r3, [r0], #1) @ May fault
|
||||
ldrgtb r3, [r1], #0
|
||||
USER( TUSER( strgtb) r3, [r0], #1) @ May fault
|
||||
b .Lc2u_finished
|
||||
|
||||
.Lc2u_3fupi: subs r2, r2, #4
|
||||
addmi ip, r2, #4
|
||||
bmi .Lc2u_3nowords
|
||||
mov r3, r7, pull #24
|
||||
ldr r7, [r1], #4
|
||||
orr r3, r3, r7, push #8
|
||||
USER( TUSER( str) r3, [r0], #4) @ May fault
|
||||
mov ip, r0, lsl #32 - PAGE_SHIFT
|
||||
rsb ip, ip, #0
|
||||
movs ip, ip, lsr #32 - PAGE_SHIFT
|
||||
beq .Lc2u_3fupi
|
||||
cmp r2, ip
|
||||
movlt ip, r2
|
||||
sub r2, r2, ip
|
||||
subs ip, ip, #16
|
||||
blt .Lc2u_3rem8lp
|
||||
|
||||
.Lc2u_3cpy8lp: mov r3, r7, pull #24
|
||||
ldmia r1!, {r4 - r7}
|
||||
subs ip, ip, #16
|
||||
orr r3, r3, r4, push #8
|
||||
mov r4, r4, pull #24
|
||||
orr r4, r4, r5, push #8
|
||||
mov r5, r5, pull #24
|
||||
orr r5, r5, r6, push #8
|
||||
mov r6, r6, pull #24
|
||||
orr r6, r6, r7, push #8
|
||||
stmia r0!, {r3 - r6} @ Shouldnt fault
|
||||
bpl .Lc2u_3cpy8lp
|
||||
|
||||
.Lc2u_3rem8lp: tst ip, #8
|
||||
movne r3, r7, pull #24
|
||||
ldmneia r1!, {r4, r7}
|
||||
orrne r3, r3, r4, push #8
|
||||
movne r4, r4, pull #24
|
||||
orrne r4, r4, r7, push #8
|
||||
stmneia r0!, {r3 - r4} @ Shouldnt fault
|
||||
tst ip, #4
|
||||
movne r3, r7, pull #24
|
||||
ldrne r7, [r1], #4
|
||||
orrne r3, r3, r7, push #8
|
||||
TUSER( strne) r3, [r0], #4 @ Shouldnt fault
|
||||
ands ip, ip, #3
|
||||
beq .Lc2u_3fupi
|
||||
.Lc2u_3nowords: mov r3, r7, get_byte_3
|
||||
teq ip, #0
|
||||
beq .Lc2u_finished
|
||||
cmp ip, #2
|
||||
USER( TUSER( strb) r3, [r0], #1) @ May fault
|
||||
ldrgeb r3, [r1], #1
|
||||
USER( TUSER( strgeb) r3, [r0], #1) @ May fault
|
||||
ldrgtb r3, [r1], #0
|
||||
USER( TUSER( strgtb) r3, [r0], #1) @ May fault
|
||||
b .Lc2u_finished
|
||||
ENDPROC(__copy_to_user)
|
||||
|
||||
.pushsection .fixup,"ax"
|
||||
.align 0
|
||||
9001: ldmfd sp!, {r0, r4 - r7, pc}
|
||||
.popsection
|
||||
|
||||
/* Prototype: unsigned long __copy_from_user(void *to,const void *from,unsigned long n);
|
||||
* Purpose : copy a block from user memory to kernel memory
|
||||
* Params : to - kernel memory
|
||||
* : from - user memory
|
||||
* : n - number of bytes to copy
|
||||
* Returns : Number of bytes NOT copied.
|
||||
*/
|
||||
.Lcfu_dest_not_aligned:
|
||||
rsb ip, ip, #4
|
||||
cmp ip, #2
|
||||
USER( TUSER( ldrb) r3, [r1], #1) @ May fault
|
||||
strb r3, [r0], #1
|
||||
USER( TUSER( ldrgeb) r3, [r1], #1) @ May fault
|
||||
strgeb r3, [r0], #1
|
||||
USER( TUSER( ldrgtb) r3, [r1], #1) @ May fault
|
||||
strgtb r3, [r0], #1
|
||||
sub r2, r2, ip
|
||||
b .Lcfu_dest_aligned
|
||||
|
||||
ENTRY(__copy_from_user)
|
||||
stmfd sp!, {r0, r2, r4 - r7, lr}
|
||||
cmp r2, #4
|
||||
blt .Lcfu_not_enough
|
||||
ands ip, r0, #3
|
||||
bne .Lcfu_dest_not_aligned
|
||||
.Lcfu_dest_aligned:
|
||||
ands ip, r1, #3
|
||||
bne .Lcfu_src_not_aligned
|
||||
|
||||
/*
|
||||
* Seeing as there has to be at least 8 bytes to copy, we can
|
||||
* copy one word, and force a user-mode page fault...
|
||||
*/
|
||||
|
||||
.Lcfu_0fupi: subs r2, r2, #4
|
||||
addmi ip, r2, #4
|
||||
bmi .Lcfu_0nowords
|
||||
USER( TUSER( ldr) r3, [r1], #4)
|
||||
str r3, [r0], #4
|
||||
mov ip, r1, lsl #32 - PAGE_SHIFT @ On each page, use a ld/st??t instruction
|
||||
rsb ip, ip, #0
|
||||
movs ip, ip, lsr #32 - PAGE_SHIFT
|
||||
beq .Lcfu_0fupi
|
||||
/*
|
||||
* ip = max no. of bytes to copy before needing another "strt" insn
|
||||
*/
|
||||
cmp r2, ip
|
||||
movlt ip, r2
|
||||
sub r2, r2, ip
|
||||
subs ip, ip, #32
|
||||
blt .Lcfu_0rem8lp
|
||||
|
||||
.Lcfu_0cpy8lp: ldmia r1!, {r3 - r6} @ Shouldnt fault
|
||||
stmia r0!, {r3 - r6}
|
||||
ldmia r1!, {r3 - r6} @ Shouldnt fault
|
||||
subs ip, ip, #32
|
||||
stmia r0!, {r3 - r6}
|
||||
bpl .Lcfu_0cpy8lp
|
||||
|
||||
.Lcfu_0rem8lp: cmn ip, #16
|
||||
ldmgeia r1!, {r3 - r6} @ Shouldnt fault
|
||||
stmgeia r0!, {r3 - r6}
|
||||
tst ip, #8
|
||||
ldmneia r1!, {r3 - r4} @ Shouldnt fault
|
||||
stmneia r0!, {r3 - r4}
|
||||
tst ip, #4
|
||||
TUSER( ldrne) r3, [r1], #4 @ Shouldnt fault
|
||||
strne r3, [r0], #4
|
||||
ands ip, ip, #3
|
||||
beq .Lcfu_0fupi
|
||||
.Lcfu_0nowords: teq ip, #0
|
||||
beq .Lcfu_finished
|
||||
.Lcfu_nowords: cmp ip, #2
|
||||
USER( TUSER( ldrb) r3, [r1], #1) @ May fault
|
||||
strb r3, [r0], #1
|
||||
USER( TUSER( ldrgeb) r3, [r1], #1) @ May fault
|
||||
strgeb r3, [r0], #1
|
||||
USER( TUSER( ldrgtb) r3, [r1], #1) @ May fault
|
||||
strgtb r3, [r0], #1
|
||||
b .Lcfu_finished
|
||||
|
||||
.Lcfu_not_enough:
|
||||
movs ip, r2
|
||||
bne .Lcfu_nowords
|
||||
.Lcfu_finished: mov r0, #0
|
||||
add sp, sp, #8
|
||||
ldmfd sp!, {r4 - r7, pc}
|
||||
|
||||
.Lcfu_src_not_aligned:
|
||||
bic r1, r1, #3
|
||||
USER( TUSER( ldr) r7, [r1], #4) @ May fault
|
||||
cmp ip, #2
|
||||
bgt .Lcfu_3fupi
|
||||
beq .Lcfu_2fupi
|
||||
.Lcfu_1fupi: subs r2, r2, #4
|
||||
addmi ip, r2, #4
|
||||
bmi .Lcfu_1nowords
|
||||
mov r3, r7, pull #8
|
||||
USER( TUSER( ldr) r7, [r1], #4) @ May fault
|
||||
orr r3, r3, r7, push #24
|
||||
str r3, [r0], #4
|
||||
mov ip, r1, lsl #32 - PAGE_SHIFT
|
||||
rsb ip, ip, #0
|
||||
movs ip, ip, lsr #32 - PAGE_SHIFT
|
||||
beq .Lcfu_1fupi
|
||||
cmp r2, ip
|
||||
movlt ip, r2
|
||||
sub r2, r2, ip
|
||||
subs ip, ip, #16
|
||||
blt .Lcfu_1rem8lp
|
||||
|
||||
.Lcfu_1cpy8lp: mov r3, r7, pull #8
|
||||
ldmia r1!, {r4 - r7} @ Shouldnt fault
|
||||
subs ip, ip, #16
|
||||
orr r3, r3, r4, push #24
|
||||
mov r4, r4, pull #8
|
||||
orr r4, r4, r5, push #24
|
||||
mov r5, r5, pull #8
|
||||
orr r5, r5, r6, push #24
|
||||
mov r6, r6, pull #8
|
||||
orr r6, r6, r7, push #24
|
||||
stmia r0!, {r3 - r6}
|
||||
bpl .Lcfu_1cpy8lp
|
||||
|
||||
.Lcfu_1rem8lp: tst ip, #8
|
||||
movne r3, r7, pull #8
|
||||
ldmneia r1!, {r4, r7} @ Shouldnt fault
|
||||
orrne r3, r3, r4, push #24
|
||||
movne r4, r4, pull #8
|
||||
orrne r4, r4, r7, push #24
|
||||
stmneia r0!, {r3 - r4}
|
||||
tst ip, #4
|
||||
movne r3, r7, pull #8
|
||||
USER( TUSER( ldrne) r7, [r1], #4) @ May fault
|
||||
orrne r3, r3, r7, push #24
|
||||
strne r3, [r0], #4
|
||||
ands ip, ip, #3
|
||||
beq .Lcfu_1fupi
|
||||
.Lcfu_1nowords: mov r3, r7, get_byte_1
|
||||
teq ip, #0
|
||||
beq .Lcfu_finished
|
||||
cmp ip, #2
|
||||
strb r3, [r0], #1
|
||||
movge r3, r7, get_byte_2
|
||||
strgeb r3, [r0], #1
|
||||
movgt r3, r7, get_byte_3
|
||||
strgtb r3, [r0], #1
|
||||
b .Lcfu_finished
|
||||
|
||||
.Lcfu_2fupi: subs r2, r2, #4
|
||||
addmi ip, r2, #4
|
||||
bmi .Lcfu_2nowords
|
||||
mov r3, r7, pull #16
|
||||
USER( TUSER( ldr) r7, [r1], #4) @ May fault
|
||||
orr r3, r3, r7, push #16
|
||||
str r3, [r0], #4
|
||||
mov ip, r1, lsl #32 - PAGE_SHIFT
|
||||
rsb ip, ip, #0
|
||||
movs ip, ip, lsr #32 - PAGE_SHIFT
|
||||
beq .Lcfu_2fupi
|
||||
cmp r2, ip
|
||||
movlt ip, r2
|
||||
sub r2, r2, ip
|
||||
subs ip, ip, #16
|
||||
blt .Lcfu_2rem8lp
|
||||
|
||||
|
||||
.Lcfu_2cpy8lp: mov r3, r7, pull #16
|
||||
ldmia r1!, {r4 - r7} @ Shouldnt fault
|
||||
subs ip, ip, #16
|
||||
orr r3, r3, r4, push #16
|
||||
mov r4, r4, pull #16
|
||||
orr r4, r4, r5, push #16
|
||||
mov r5, r5, pull #16
|
||||
orr r5, r5, r6, push #16
|
||||
mov r6, r6, pull #16
|
||||
orr r6, r6, r7, push #16
|
||||
stmia r0!, {r3 - r6}
|
||||
bpl .Lcfu_2cpy8lp
|
||||
|
||||
.Lcfu_2rem8lp: tst ip, #8
|
||||
movne r3, r7, pull #16
|
||||
ldmneia r1!, {r4, r7} @ Shouldnt fault
|
||||
orrne r3, r3, r4, push #16
|
||||
movne r4, r4, pull #16
|
||||
orrne r4, r4, r7, push #16
|
||||
stmneia r0!, {r3 - r4}
|
||||
tst ip, #4
|
||||
movne r3, r7, pull #16
|
||||
USER( TUSER( ldrne) r7, [r1], #4) @ May fault
|
||||
orrne r3, r3, r7, push #16
|
||||
strne r3, [r0], #4
|
||||
ands ip, ip, #3
|
||||
beq .Lcfu_2fupi
|
||||
.Lcfu_2nowords: mov r3, r7, get_byte_2
|
||||
teq ip, #0
|
||||
beq .Lcfu_finished
|
||||
cmp ip, #2
|
||||
strb r3, [r0], #1
|
||||
movge r3, r7, get_byte_3
|
||||
strgeb r3, [r0], #1
|
||||
USER( TUSER( ldrgtb) r3, [r1], #0) @ May fault
|
||||
strgtb r3, [r0], #1
|
||||
b .Lcfu_finished
|
||||
|
||||
.Lcfu_3fupi: subs r2, r2, #4
|
||||
addmi ip, r2, #4
|
||||
bmi .Lcfu_3nowords
|
||||
mov r3, r7, pull #24
|
||||
USER( TUSER( ldr) r7, [r1], #4) @ May fault
|
||||
orr r3, r3, r7, push #8
|
||||
str r3, [r0], #4
|
||||
mov ip, r1, lsl #32 - PAGE_SHIFT
|
||||
rsb ip, ip, #0
|
||||
movs ip, ip, lsr #32 - PAGE_SHIFT
|
||||
beq .Lcfu_3fupi
|
||||
cmp r2, ip
|
||||
movlt ip, r2
|
||||
sub r2, r2, ip
|
||||
subs ip, ip, #16
|
||||
blt .Lcfu_3rem8lp
|
||||
|
||||
.Lcfu_3cpy8lp: mov r3, r7, pull #24
|
||||
ldmia r1!, {r4 - r7} @ Shouldnt fault
|
||||
orr r3, r3, r4, push #8
|
||||
mov r4, r4, pull #24
|
||||
orr r4, r4, r5, push #8
|
||||
mov r5, r5, pull #24
|
||||
orr r5, r5, r6, push #8
|
||||
mov r6, r6, pull #24
|
||||
orr r6, r6, r7, push #8
|
||||
stmia r0!, {r3 - r6}
|
||||
subs ip, ip, #16
|
||||
bpl .Lcfu_3cpy8lp
|
||||
|
||||
.Lcfu_3rem8lp: tst ip, #8
|
||||
movne r3, r7, pull #24
|
||||
ldmneia r1!, {r4, r7} @ Shouldnt fault
|
||||
orrne r3, r3, r4, push #8
|
||||
movne r4, r4, pull #24
|
||||
orrne r4, r4, r7, push #8
|
||||
stmneia r0!, {r3 - r4}
|
||||
tst ip, #4
|
||||
movne r3, r7, pull #24
|
||||
USER( TUSER( ldrne) r7, [r1], #4) @ May fault
|
||||
orrne r3, r3, r7, push #8
|
||||
strne r3, [r0], #4
|
||||
ands ip, ip, #3
|
||||
beq .Lcfu_3fupi
|
||||
.Lcfu_3nowords: mov r3, r7, get_byte_3
|
||||
teq ip, #0
|
||||
beq .Lcfu_finished
|
||||
cmp ip, #2
|
||||
strb r3, [r0], #1
|
||||
USER( TUSER( ldrgeb) r3, [r1], #1) @ May fault
|
||||
strgeb r3, [r0], #1
|
||||
USER( TUSER( ldrgtb) r3, [r1], #1) @ May fault
|
||||
strgtb r3, [r0], #1
|
||||
b .Lcfu_finished
|
||||
ENDPROC(__copy_from_user)
|
||||
|
||||
.pushsection .fixup,"ax"
|
||||
.align 0
|
||||
/*
|
||||
* We took an exception. r0 contains a pointer to
|
||||
* the byte not copied.
|
||||
*/
|
||||
9001: ldr r2, [sp], #4 @ void *to
|
||||
sub r2, r0, r2 @ bytes copied
|
||||
ldr r1, [sp], #4 @ unsigned long count
|
||||
subs r4, r1, r2 @ bytes left to copy
|
||||
movne r1, r4
|
||||
blne __memzero
|
||||
mov r0, r4
|
||||
ldmfd sp!, {r4 - r7, pc}
|
||||
.popsection
|
||||
|
||||
|
|
@ -101,13 +101,8 @@ config SOC_IMX51
|
|||
select SOC_IMX5
|
||||
select ARCH_MX5
|
||||
select ARCH_MX51
|
||||
|
||||
config SOC_IMX53
|
||||
bool
|
||||
select SOC_IMX5
|
||||
select ARCH_MX5
|
||||
select ARCH_MX53
|
||||
select HAVE_CAN_FLEXCAN if CAN
|
||||
select PINCTRL
|
||||
select PINCTRL_IMX51
|
||||
|
||||
if ARCH_IMX_V4_V5
|
||||
|
||||
|
|
@ -561,7 +556,6 @@ config MACH_BUG
|
|||
config MACH_IMX31_DT
|
||||
bool "Support i.MX31 platforms from device tree"
|
||||
select SOC_IMX31
|
||||
select USE_OF
|
||||
help
|
||||
Include support for Freescale i.MX31 based platforms
|
||||
using the device tree for discovery.
|
||||
|
|
@ -737,95 +731,19 @@ config MACH_EUKREA_MBIMXSD51_BASEBOARD
|
|||
|
||||
endchoice
|
||||
|
||||
config MX51_EFIKA_COMMON
|
||||
bool
|
||||
select SOC_IMX51
|
||||
select IMX_HAVE_PLATFORM_IMX_UART
|
||||
select IMX_HAVE_PLATFORM_MXC_EHCI
|
||||
select IMX_HAVE_PLATFORM_PATA_IMX
|
||||
select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
|
||||
select IMX_HAVE_PLATFORM_SPI_IMX
|
||||
select MXC_ULPI if USB_ULPI
|
||||
comment "Device tree only"
|
||||
|
||||
config SOC_IMX53
|
||||
bool "i.MX53 support"
|
||||
select SOC_IMX5
|
||||
select ARCH_MX5
|
||||
select ARCH_MX53
|
||||
select HAVE_CAN_FLEXCAN if CAN
|
||||
select PINCTRL
|
||||
select PINCTRL_IMX53
|
||||
|
||||
config MACH_MX51_EFIKAMX
|
||||
bool "Support MX51 Genesi Efika MX nettop"
|
||||
select LEDS_GPIO_REGISTER
|
||||
select MX51_EFIKA_COMMON
|
||||
help
|
||||
Include support for Genesi Efika MX nettop. This includes specific
|
||||
configurations for the board and its peripherals.
|
||||
|
||||
config MACH_MX51_EFIKASB
|
||||
bool "Support MX51 Genesi Efika Smartbook"
|
||||
select LEDS_GPIO_REGISTER
|
||||
select MX51_EFIKA_COMMON
|
||||
help
|
||||
Include support for Genesi Efika Smartbook. This includes specific
|
||||
configurations for the board and its peripherals.
|
||||
|
||||
comment "i.MX53 machines:"
|
||||
|
||||
config MACH_IMX53_DT
|
||||
bool "Support i.MX53 platforms from device tree"
|
||||
select SOC_IMX53
|
||||
select MACH_MX53_ARD
|
||||
select MACH_MX53_EVK
|
||||
select MACH_MX53_LOCO
|
||||
select MACH_MX53_SMD
|
||||
help
|
||||
Include support for Freescale i.MX53 based platforms
|
||||
using the device tree for discovery
|
||||
|
||||
config MACH_MX53_EVK
|
||||
bool "Support MX53 EVK platforms"
|
||||
select SOC_IMX53
|
||||
select IMX_HAVE_PLATFORM_IMX2_WDT
|
||||
select IMX_HAVE_PLATFORM_IMX_UART
|
||||
select IMX_HAVE_PLATFORM_IMX_I2C
|
||||
select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
|
||||
select IMX_HAVE_PLATFORM_SPI_IMX
|
||||
select LEDS_GPIO_REGISTER
|
||||
help
|
||||
Include support for MX53 EVK platform. This includes specific
|
||||
configurations for the board and its peripherals.
|
||||
|
||||
config MACH_MX53_SMD
|
||||
bool "Support MX53 SMD platforms"
|
||||
select SOC_IMX53
|
||||
select IMX_HAVE_PLATFORM_IMX2_WDT
|
||||
select IMX_HAVE_PLATFORM_IMX_I2C
|
||||
select IMX_HAVE_PLATFORM_IMX_UART
|
||||
select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
|
||||
help
|
||||
Include support for MX53 SMD platform. This includes specific
|
||||
configurations for the board and its peripherals.
|
||||
|
||||
config MACH_MX53_LOCO
|
||||
bool "Support MX53 LOCO platforms"
|
||||
select SOC_IMX53
|
||||
select IMX_HAVE_PLATFORM_IMX2_WDT
|
||||
select IMX_HAVE_PLATFORM_IMX_I2C
|
||||
select IMX_HAVE_PLATFORM_IMX_UART
|
||||
select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
|
||||
select IMX_HAVE_PLATFORM_GPIO_KEYS
|
||||
select LEDS_GPIO_REGISTER
|
||||
help
|
||||
Include support for MX53 LOCO platform. This includes specific
|
||||
configurations for the board and its peripherals.
|
||||
|
||||
config MACH_MX53_ARD
|
||||
bool "Support MX53 ARD platforms"
|
||||
select SOC_IMX53
|
||||
select IMX_HAVE_PLATFORM_IMX2_WDT
|
||||
select IMX_HAVE_PLATFORM_IMX_I2C
|
||||
select IMX_HAVE_PLATFORM_IMX_UART
|
||||
select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
|
||||
select IMX_HAVE_PLATFORM_GPIO_KEYS
|
||||
help
|
||||
Include support for MX53 ARD platform. This includes specific
|
||||
configurations for the board and its peripherals.
|
||||
|
||||
comment "i.MX6 family:"
|
||||
This enables support for Freescale i.MX53 processor.
|
||||
|
||||
config SOC_IMX6Q
|
||||
bool "i.MX6 Quad support"
|
||||
|
|
|
|||
|
|
@ -83,16 +83,9 @@ endif
|
|||
# i.MX5 based machines
|
||||
obj-$(CONFIG_MACH_MX51_BABBAGE) += mach-mx51_babbage.o
|
||||
obj-$(CONFIG_MACH_MX51_3DS) += mach-mx51_3ds.o
|
||||
obj-$(CONFIG_MACH_MX53_EVK) += mach-mx53_evk.o
|
||||
obj-$(CONFIG_MACH_MX53_SMD) += mach-mx53_smd.o
|
||||
obj-$(CONFIG_MACH_MX53_LOCO) += mach-mx53_loco.o
|
||||
obj-$(CONFIG_MACH_MX53_ARD) += mach-mx53_ard.o
|
||||
obj-$(CONFIG_MACH_EUKREA_CPUIMX51SD) += mach-cpuimx51sd.o
|
||||
obj-$(CONFIG_MACH_EUKREA_MBIMXSD51_BASEBOARD) += eukrea_mbimxsd51-baseboard.o
|
||||
obj-$(CONFIG_MX51_EFIKA_COMMON) += mx51_efika.o
|
||||
obj-$(CONFIG_MACH_MX51_EFIKAMX) += mach-mx51_efikamx.o
|
||||
obj-$(CONFIG_MACH_MX51_EFIKASB) += mach-mx51_efikasb.o
|
||||
obj-$(CONFIG_MACH_MX50_RDP) += mach-mx50_rdp.o
|
||||
|
||||
obj-$(CONFIG_MACH_IMX51_DT) += imx51-dt.o
|
||||
obj-$(CONFIG_MACH_IMX53_DT) += imx53-dt.o
|
||||
obj-$(CONFIG_SOC_IMX53) += mach-imx53.o
|
||||
|
|
|
|||
|
|
@ -39,8 +39,12 @@ params_phys-$(CONFIG_SOC_IMX6Q) := 0x10000100
|
|||
initrd_phys-$(CONFIG_SOC_IMX6Q) := 0x10800000
|
||||
|
||||
dtb-$(CONFIG_MACH_IMX51_DT) += imx51-babbage.dtb
|
||||
dtb-$(CONFIG_MACH_IMX53_DT) += imx53-ard.dtb imx53-evk.dtb \
|
||||
imx53-qsb.dtb imx53-smd.dtb
|
||||
|
||||
dtb-$(CONFIG_SOC_IMX53) += imx53-ard.dtb \
|
||||
imx53-evk.dtb \
|
||||
imx53-qsb.dtb \
|
||||
imx53-smd.dtb \
|
||||
|
||||
dtb-$(CONFIG_SOC_IMX6Q) += imx6q-arm2.dtb \
|
||||
imx6q-sabrelite.dtb \
|
||||
imx6q-sabresd.dtb \
|
||||
|
|
|
|||
|
|
@ -1,48 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2010 Yong Shen. <Yong.Shen@linaro.org>
|
||||
*
|
||||
* 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 <mach/mx53.h>
|
||||
#include <mach/devices-common.h>
|
||||
|
||||
extern const struct imx_fec_data imx53_fec_data;
|
||||
#define imx53_add_fec(pdata) \
|
||||
imx_add_fec(&imx53_fec_data, pdata)
|
||||
|
||||
extern const struct imx_imx_uart_1irq_data imx53_imx_uart_data[];
|
||||
#define imx53_add_imx_uart(id, pdata) \
|
||||
imx_add_imx_uart_1irq(&imx53_imx_uart_data[id], pdata)
|
||||
|
||||
|
||||
extern const struct imx_imx_i2c_data imx53_imx_i2c_data[];
|
||||
#define imx53_add_imx_i2c(id, pdata) \
|
||||
imx_add_imx_i2c(&imx53_imx_i2c_data[id], pdata)
|
||||
|
||||
extern const struct imx_sdhci_esdhc_imx_data imx53_sdhci_esdhc_imx_data[];
|
||||
#define imx53_add_sdhci_esdhc_imx(id, pdata) \
|
||||
imx_add_sdhci_esdhc_imx(&imx53_sdhci_esdhc_imx_data[id], pdata)
|
||||
|
||||
extern const struct imx_spi_imx_data imx53_ecspi_data[];
|
||||
#define imx53_add_ecspi(id, pdata) \
|
||||
imx_add_spi_imx(&imx53_ecspi_data[id], pdata)
|
||||
|
||||
extern const struct imx_imx2_wdt_data imx53_imx2_wdt_data[];
|
||||
#define imx53_add_imx2_wdt(id) \
|
||||
imx_add_imx2_wdt(&imx53_imx2_wdt_data[id])
|
||||
|
||||
extern const struct imx_imx_ssi_data imx53_imx_ssi_data[];
|
||||
#define imx53_add_imx_ssi(id, pdata) \
|
||||
imx_add_imx_ssi(&imx53_imx_ssi_data[id], pdata)
|
||||
|
||||
extern const struct imx_imx_keypad_data imx53_imx_keypad_data;
|
||||
#define imx53_add_imx_keypad(pdata) \
|
||||
imx_add_imx_keypad(&imx53_imx_keypad_data, pdata)
|
||||
|
||||
extern const struct imx_pata_imx_data imx53_pata_imx_data;
|
||||
#define imx53_add_pata_imx() \
|
||||
imx_add_pata_imx(&imx53_pata_imx_data)
|
||||
|
||||
extern struct platform_device *__init imx53_add_ahci_imx(void);
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
#ifndef _EFIKA_H
|
||||
#define _EFIKA_H
|
||||
|
||||
#define EFIKA_WLAN_EN IMX_GPIO_NR(2, 16)
|
||||
#define EFIKA_WLAN_RESET IMX_GPIO_NR(2, 10)
|
||||
#define EFIKA_USB_PHY_RESET IMX_GPIO_NR(2, 9)
|
||||
|
||||
void __init efika_board_common_init(void);
|
||||
|
||||
#endif
|
||||
|
|
@ -13,7 +13,6 @@
|
|||
#include <linux/irq.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/pinctrl/machine.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/time.h>
|
||||
#include <mach/common.h>
|
||||
|
|
@ -44,27 +43,8 @@ static const struct of_dev_auxdata imx51_auxdata_lookup[] __initconst = {
|
|||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static const struct of_device_id imx51_iomuxc_of_match[] __initconst = {
|
||||
{ .compatible = "fsl,imx51-iomuxc-babbage", .data = imx51_babbage_common_init, },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static void __init imx51_dt_init(void)
|
||||
{
|
||||
struct device_node *node;
|
||||
const struct of_device_id *of_id;
|
||||
void (*func)(void);
|
||||
|
||||
pinctrl_provide_dummies();
|
||||
|
||||
node = of_find_matching_node(NULL, imx51_iomuxc_of_match);
|
||||
if (node) {
|
||||
of_id = of_match_node(imx51_iomuxc_of_match, node);
|
||||
func = of_id->data;
|
||||
func();
|
||||
of_node_put(node);
|
||||
}
|
||||
|
||||
of_platform_populate(NULL, of_default_bus_match_table,
|
||||
imx51_auxdata_lookup, NULL);
|
||||
}
|
||||
|
|
@ -79,7 +59,6 @@ static struct sys_timer imx51_timer = {
|
|||
};
|
||||
|
||||
static const char *imx51_dt_board_compat[] __initdata = {
|
||||
"fsl,imx51-babbage",
|
||||
"fsl,imx51",
|
||||
NULL
|
||||
};
|
||||
|
|
|
|||
|
|
@ -17,7 +17,6 @@
|
|||
#include <linux/irq.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/pinctrl/machine.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/time.h>
|
||||
#include <mach/common.h>
|
||||
|
|
@ -51,14 +50,6 @@ static const struct of_dev_auxdata imx53_auxdata_lookup[] __initconst = {
|
|||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static const struct of_device_id imx53_iomuxc_of_match[] __initconst = {
|
||||
{ .compatible = "fsl,imx53-iomuxc-ard", .data = imx53_ard_common_init, },
|
||||
{ .compatible = "fsl,imx53-iomuxc-evk", .data = imx53_evk_common_init, },
|
||||
{ .compatible = "fsl,imx53-iomuxc-qsb", .data = imx53_qsb_common_init, },
|
||||
{ .compatible = "fsl,imx53-iomuxc-smd", .data = imx53_smd_common_init, },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static void __init imx53_qsb_init(void)
|
||||
{
|
||||
struct clk *clk;
|
||||
|
|
@ -74,20 +65,6 @@ static void __init imx53_qsb_init(void)
|
|||
|
||||
static void __init imx53_dt_init(void)
|
||||
{
|
||||
struct device_node *node;
|
||||
const struct of_device_id *of_id;
|
||||
void (*func)(void);
|
||||
|
||||
pinctrl_provide_dummies();
|
||||
|
||||
node = of_find_matching_node(NULL, imx53_iomuxc_of_match);
|
||||
if (node) {
|
||||
of_id = of_match_node(imx53_iomuxc_of_match, node);
|
||||
func = of_id->data;
|
||||
func();
|
||||
of_node_put(node);
|
||||
}
|
||||
|
||||
if (of_machine_is_compatible("fsl,imx53-qsb"))
|
||||
imx53_qsb_init();
|
||||
|
||||
|
|
@ -105,10 +82,6 @@ static struct sys_timer imx53_timer = {
|
|||
};
|
||||
|
||||
static const char *imx53_dt_board_compat[] __initdata = {
|
||||
"fsl,imx53-ard",
|
||||
"fsl,imx53-evk",
|
||||
"fsl,imx53-qsb",
|
||||
"fsl,imx53-smd",
|
||||
"fsl,imx53",
|
||||
NULL
|
||||
};
|
||||
|
|
@ -22,7 +22,6 @@
|
|||
#include <linux/of_address.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/pinctrl/machine.h>
|
||||
#include <linux/phy.h>
|
||||
#include <linux/micrel_phy.h>
|
||||
#include <linux/mfd/anatop.h>
|
||||
|
|
@ -159,12 +158,6 @@ static void __init imx6q_usb_init(void)
|
|||
|
||||
static void __init imx6q_init_machine(void)
|
||||
{
|
||||
/*
|
||||
* This should be removed when all imx6q boards have pinctrl
|
||||
* states for devices defined in device tree.
|
||||
*/
|
||||
pinctrl_provide_dummies();
|
||||
|
||||
if (of_machine_is_compatible("fsl,imx6q-sabrelite"))
|
||||
imx6q_sabrelite_init();
|
||||
|
||||
|
|
@ -218,9 +211,6 @@ static struct sys_timer imx6q_timer = {
|
|||
};
|
||||
|
||||
static const char *imx6q_dt_compat[] __initdata = {
|
||||
"fsl,imx6q-arm2",
|
||||
"fsl,imx6q-sabrelite",
|
||||
"fsl,imx6q-sabresd",
|
||||
"fsl,imx6q",
|
||||
NULL,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,300 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2010 Linaro Limited
|
||||
*
|
||||
* based on code from the following
|
||||
* Copyright 2009-2010 Freescale Semiconductor, Inc. All Rights Reserved.
|
||||
* Copyright 2009-2010 Pegatron Corporation. All Rights Reserved.
|
||||
* Copyright 2009-2010 Genesi USA, Inc. All Rights Reserved.
|
||||
*
|
||||
* The code contained herein is licensed under the GNU General Public
|
||||
* License. You may obtain a copy of the GNU General Public License
|
||||
* Version 2 or later at the following locations:
|
||||
*
|
||||
* http://www.opensource.org/licenses/gpl-license.html
|
||||
* http://www.gnu.org/copyleft/gpl.html
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/spi/flash.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/mfd/mc13892.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
|
||||
#include <mach/common.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/iomux-mx51.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/system_info.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/time.h>
|
||||
|
||||
#include "devices-imx51.h"
|
||||
#include "efika.h"
|
||||
|
||||
#define EFIKAMX_PCBID0 IMX_GPIO_NR(3, 16)
|
||||
#define EFIKAMX_PCBID1 IMX_GPIO_NR(3, 17)
|
||||
#define EFIKAMX_PCBID2 IMX_GPIO_NR(3, 11)
|
||||
|
||||
#define EFIKAMX_BLUE_LED IMX_GPIO_NR(3, 13)
|
||||
#define EFIKAMX_GREEN_LED IMX_GPIO_NR(3, 14)
|
||||
#define EFIKAMX_RED_LED IMX_GPIO_NR(3, 15)
|
||||
|
||||
#define EFIKAMX_POWER_KEY IMX_GPIO_NR(2, 31)
|
||||
|
||||
/* board 1.1 doesn't have same reset gpio */
|
||||
#define EFIKAMX_RESET1_1 IMX_GPIO_NR(3, 2)
|
||||
#define EFIKAMX_RESET IMX_GPIO_NR(1, 4)
|
||||
|
||||
#define EFIKAMX_POWEROFF IMX_GPIO_NR(4, 13)
|
||||
|
||||
#define EFIKAMX_PMIC IMX_GPIO_NR(1, 6)
|
||||
|
||||
/* the pci ids pin have pull up. they're driven low according to board id */
|
||||
#define MX51_PAD_PCBID0 IOMUX_PAD(0x518, 0x130, 3, 0x0, 0, PAD_CTL_PUS_100K_UP)
|
||||
#define MX51_PAD_PCBID1 IOMUX_PAD(0x51C, 0x134, 3, 0x0, 0, PAD_CTL_PUS_100K_UP)
|
||||
#define MX51_PAD_PCBID2 IOMUX_PAD(0x504, 0x128, 3, 0x0, 0, PAD_CTL_PUS_100K_UP)
|
||||
#define MX51_PAD_PWRKEY IOMUX_PAD(0x48c, 0x0f8, 1, 0x0, 0, PAD_CTL_PUS_100K_UP | PAD_CTL_PKE)
|
||||
|
||||
static iomux_v3_cfg_t mx51efikamx_pads[] = {
|
||||
/* board id */
|
||||
MX51_PAD_PCBID0,
|
||||
MX51_PAD_PCBID1,
|
||||
MX51_PAD_PCBID2,
|
||||
|
||||
/* leds */
|
||||
MX51_PAD_CSI1_D9__GPIO3_13,
|
||||
MX51_PAD_CSI1_VSYNC__GPIO3_14,
|
||||
MX51_PAD_CSI1_HSYNC__GPIO3_15,
|
||||
|
||||
/* power key */
|
||||
MX51_PAD_PWRKEY,
|
||||
|
||||
/* reset */
|
||||
MX51_PAD_DI1_PIN13__GPIO3_2,
|
||||
MX51_PAD_GPIO1_4__GPIO1_4,
|
||||
|
||||
/* power off */
|
||||
MX51_PAD_CSI2_VSYNC__GPIO4_13,
|
||||
};
|
||||
|
||||
/* PCBID2 PCBID1 PCBID0 STATE
|
||||
1 1 1 ER1:rev1.1
|
||||
1 1 0 ER2:rev1.2
|
||||
1 0 1 ER3:rev1.3
|
||||
1 0 0 ER4:rev1.4
|
||||
*/
|
||||
static void __init mx51_efikamx_board_id(void)
|
||||
{
|
||||
int id;
|
||||
|
||||
/* things are taking time to settle */
|
||||
msleep(150);
|
||||
|
||||
gpio_request(EFIKAMX_PCBID0, "pcbid0");
|
||||
gpio_direction_input(EFIKAMX_PCBID0);
|
||||
gpio_request(EFIKAMX_PCBID1, "pcbid1");
|
||||
gpio_direction_input(EFIKAMX_PCBID1);
|
||||
gpio_request(EFIKAMX_PCBID2, "pcbid2");
|
||||
gpio_direction_input(EFIKAMX_PCBID2);
|
||||
|
||||
id = gpio_get_value(EFIKAMX_PCBID0) ? 1 : 0;
|
||||
id |= (gpio_get_value(EFIKAMX_PCBID1) ? 1 : 0) << 1;
|
||||
id |= (gpio_get_value(EFIKAMX_PCBID2) ? 1 : 0) << 2;
|
||||
|
||||
switch (id) {
|
||||
case 7:
|
||||
system_rev = 0x11;
|
||||
break;
|
||||
case 6:
|
||||
system_rev = 0x12;
|
||||
break;
|
||||
case 5:
|
||||
system_rev = 0x13;
|
||||
break;
|
||||
case 4:
|
||||
system_rev = 0x14;
|
||||
break;
|
||||
default:
|
||||
system_rev = 0x10;
|
||||
break;
|
||||
}
|
||||
|
||||
if ((system_rev == 0x10)
|
||||
|| (system_rev == 0x12)
|
||||
|| (system_rev == 0x14)) {
|
||||
printk(KERN_WARNING
|
||||
"EfikaMX: Unsupported board revision 1.%u!\n",
|
||||
system_rev & 0xf);
|
||||
}
|
||||
}
|
||||
|
||||
static struct gpio_led mx51_efikamx_leds[] __initdata = {
|
||||
{
|
||||
.name = "efikamx:green",
|
||||
.default_trigger = "default-on",
|
||||
.gpio = EFIKAMX_GREEN_LED,
|
||||
},
|
||||
{
|
||||
.name = "efikamx:red",
|
||||
.default_trigger = "ide-disk",
|
||||
.gpio = EFIKAMX_RED_LED,
|
||||
},
|
||||
{
|
||||
.name = "efikamx:blue",
|
||||
.default_trigger = "mmc0",
|
||||
.gpio = EFIKAMX_BLUE_LED,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct gpio_led_platform_data
|
||||
mx51_efikamx_leds_data __initconst = {
|
||||
.leds = mx51_efikamx_leds,
|
||||
.num_leds = ARRAY_SIZE(mx51_efikamx_leds),
|
||||
};
|
||||
|
||||
static struct esdhc_platform_data sd_pdata = {
|
||||
.cd_type = ESDHC_CD_CONTROLLER,
|
||||
.wp_type = ESDHC_WP_CONTROLLER,
|
||||
};
|
||||
|
||||
static struct gpio_keys_button mx51_efikamx_powerkey[] = {
|
||||
{
|
||||
.code = KEY_POWER,
|
||||
.gpio = EFIKAMX_POWER_KEY,
|
||||
.type = EV_PWR,
|
||||
.desc = "Power Button (CM)",
|
||||
.wakeup = 1,
|
||||
.debounce_interval = 10, /* ms */
|
||||
},
|
||||
};
|
||||
|
||||
static const struct gpio_keys_platform_data mx51_efikamx_powerkey_data __initconst = {
|
||||
.buttons = mx51_efikamx_powerkey,
|
||||
.nbuttons = ARRAY_SIZE(mx51_efikamx_powerkey),
|
||||
};
|
||||
|
||||
static void mx51_efikamx_restart(char mode, const char *cmd)
|
||||
{
|
||||
if (system_rev == 0x11)
|
||||
gpio_direction_output(EFIKAMX_RESET1_1, 0);
|
||||
else
|
||||
gpio_direction_output(EFIKAMX_RESET, 0);
|
||||
}
|
||||
|
||||
static struct regulator *pwgt1, *pwgt2, *coincell;
|
||||
|
||||
static void mx51_efikamx_power_off(void)
|
||||
{
|
||||
if (!IS_ERR(coincell))
|
||||
regulator_disable(coincell);
|
||||
|
||||
if (!IS_ERR(pwgt1) && !IS_ERR(pwgt2)) {
|
||||
regulator_disable(pwgt2);
|
||||
regulator_disable(pwgt1);
|
||||
}
|
||||
gpio_direction_output(EFIKAMX_POWEROFF, 1);
|
||||
}
|
||||
|
||||
static int __init mx51_efikamx_power_init(void)
|
||||
{
|
||||
pwgt1 = regulator_get(NULL, "pwgt1");
|
||||
pwgt2 = regulator_get(NULL, "pwgt2");
|
||||
if (!IS_ERR(pwgt1) && !IS_ERR(pwgt2)) {
|
||||
regulator_enable(pwgt1);
|
||||
regulator_enable(pwgt2);
|
||||
}
|
||||
gpio_request(EFIKAMX_POWEROFF, "poweroff");
|
||||
pm_power_off = mx51_efikamx_power_off;
|
||||
|
||||
/* enable coincell charger. maybe need a small power driver ? */
|
||||
coincell = regulator_get(NULL, "coincell");
|
||||
if (!IS_ERR(coincell)) {
|
||||
regulator_set_voltage(coincell, 3000000, 3000000);
|
||||
regulator_enable(coincell);
|
||||
}
|
||||
|
||||
regulator_has_full_constraints();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __init mx51_efikamx_init_late(void)
|
||||
{
|
||||
imx51_init_late();
|
||||
mx51_efikamx_power_init();
|
||||
}
|
||||
|
||||
static void __init mx51_efikamx_init(void)
|
||||
{
|
||||
imx51_soc_init();
|
||||
|
||||
mxc_iomux_v3_setup_multiple_pads(mx51efikamx_pads,
|
||||
ARRAY_SIZE(mx51efikamx_pads));
|
||||
efika_board_common_init();
|
||||
|
||||
mx51_efikamx_board_id();
|
||||
|
||||
/* on < 1.2 boards both SD controllers are used */
|
||||
if (system_rev < 0x12) {
|
||||
imx51_add_sdhci_esdhc_imx(0, NULL);
|
||||
imx51_add_sdhci_esdhc_imx(1, &sd_pdata);
|
||||
mx51_efikamx_leds[2].default_trigger = "mmc1";
|
||||
} else
|
||||
imx51_add_sdhci_esdhc_imx(0, &sd_pdata);
|
||||
|
||||
gpio_led_register_device(-1, &mx51_efikamx_leds_data);
|
||||
imx_add_gpio_keys(&mx51_efikamx_powerkey_data);
|
||||
|
||||
if (system_rev == 0x11) {
|
||||
gpio_request(EFIKAMX_RESET1_1, "reset");
|
||||
gpio_direction_output(EFIKAMX_RESET1_1, 1);
|
||||
} else {
|
||||
gpio_request(EFIKAMX_RESET, "reset");
|
||||
gpio_direction_output(EFIKAMX_RESET, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* enable wifi by default only on mx
|
||||
* sb and mx have same wlan pin but the value to enable it are
|
||||
* different :/
|
||||
*/
|
||||
gpio_request(EFIKA_WLAN_EN, "wlan_en");
|
||||
gpio_direction_output(EFIKA_WLAN_EN, 0);
|
||||
msleep(10);
|
||||
|
||||
gpio_request(EFIKA_WLAN_RESET, "wlan_rst");
|
||||
gpio_direction_output(EFIKA_WLAN_RESET, 0);
|
||||
msleep(10);
|
||||
gpio_set_value(EFIKA_WLAN_RESET, 1);
|
||||
}
|
||||
|
||||
static void __init mx51_efikamx_timer_init(void)
|
||||
{
|
||||
mx51_clocks_init(32768, 24000000, 22579200, 24576000);
|
||||
}
|
||||
|
||||
static struct sys_timer mx51_efikamx_timer = {
|
||||
.init = mx51_efikamx_timer_init,
|
||||
};
|
||||
|
||||
MACHINE_START(MX51_EFIKAMX, "Genesi Efika MX (Smarttop)")
|
||||
.atag_offset = 0x100,
|
||||
.map_io = mx51_map_io,
|
||||
.init_early = imx51_init_early,
|
||||
.init_irq = mx51_init_irq,
|
||||
.handle_irq = imx51_handle_irq,
|
||||
.timer = &mx51_efikamx_timer,
|
||||
.init_machine = mx51_efikamx_init,
|
||||
.init_late = mx51_efikamx_init_late,
|
||||
.restart = mx51_efikamx_restart,
|
||||
MACHINE_END
|
||||
|
|
@ -1,296 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) Arnaud Patard <arnaud.patard@rtp-net.org>
|
||||
*
|
||||
* based on code from the following
|
||||
* Copyright 2009-2010 Freescale Semiconductor, Inc. All Rights Reserved.
|
||||
* Copyright 2009-2010 Pegatron Corporation. All Rights Reserved.
|
||||
* Copyright 2009-2010 Genesi USA, Inc. All Rights Reserved.
|
||||
*
|
||||
* The code contained herein is licensed under the GNU General Public
|
||||
* License. You may obtain a copy of the GNU General Public License
|
||||
* Version 2 or later at the following locations:
|
||||
*
|
||||
* http://www.opensource.org/licenses/gpl-license.html
|
||||
* http://www.gnu.org/copyleft/gpl.html
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/spi/flash.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/mfd/mc13892.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <linux/usb/otg.h>
|
||||
#include <linux/usb/ulpi.h>
|
||||
#include <mach/ulpi.h>
|
||||
|
||||
#include <mach/common.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/iomux-mx51.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/system_info.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/time.h>
|
||||
|
||||
#include "devices-imx51.h"
|
||||
#include "efika.h"
|
||||
|
||||
#define EFIKASB_USBH2_STP IMX_GPIO_NR(2, 20)
|
||||
#define EFIKASB_GREEN_LED IMX_GPIO_NR(1, 3)
|
||||
#define EFIKASB_WHITE_LED IMX_GPIO_NR(2, 25)
|
||||
#define EFIKASB_PCBID0 IMX_GPIO_NR(2, 28)
|
||||
#define EFIKASB_PCBID1 IMX_GPIO_NR(2, 29)
|
||||
#define EFIKASB_PWRKEY IMX_GPIO_NR(2, 31)
|
||||
#define EFIKASB_LID IMX_GPIO_NR(3, 14)
|
||||
#define EFIKASB_POWEROFF IMX_GPIO_NR(4, 13)
|
||||
#define EFIKASB_RFKILL IMX_GPIO_NR(3, 1)
|
||||
|
||||
#define MX51_PAD_PWRKEY IOMUX_PAD(0x48c, 0x0f8, 1, 0x0, 0, PAD_CTL_PUS_100K_UP | PAD_CTL_PKE)
|
||||
#define MX51_PAD_SD1_CD IOMUX_PAD(0x47c, 0x0e8, 1, __NA_, 0, MX51_ESDHC_PAD_CTRL)
|
||||
|
||||
static iomux_v3_cfg_t mx51efikasb_pads[] = {
|
||||
/* USB HOST2 */
|
||||
MX51_PAD_EIM_D16__USBH2_DATA0,
|
||||
MX51_PAD_EIM_D17__USBH2_DATA1,
|
||||
MX51_PAD_EIM_D18__USBH2_DATA2,
|
||||
MX51_PAD_EIM_D19__USBH2_DATA3,
|
||||
MX51_PAD_EIM_D20__USBH2_DATA4,
|
||||
MX51_PAD_EIM_D21__USBH2_DATA5,
|
||||
MX51_PAD_EIM_D22__USBH2_DATA6,
|
||||
MX51_PAD_EIM_D23__USBH2_DATA7,
|
||||
MX51_PAD_EIM_A24__USBH2_CLK,
|
||||
MX51_PAD_EIM_A25__USBH2_DIR,
|
||||
MX51_PAD_EIM_A26__USBH2_STP,
|
||||
MX51_PAD_EIM_A27__USBH2_NXT,
|
||||
|
||||
/* leds */
|
||||
MX51_PAD_EIM_CS0__GPIO2_25,
|
||||
MX51_PAD_GPIO1_3__GPIO1_3,
|
||||
|
||||
/* pcb id */
|
||||
MX51_PAD_EIM_CS3__GPIO2_28,
|
||||
MX51_PAD_EIM_CS4__GPIO2_29,
|
||||
|
||||
/* lid */
|
||||
MX51_PAD_CSI1_VSYNC__GPIO3_14,
|
||||
|
||||
/* power key*/
|
||||
MX51_PAD_PWRKEY,
|
||||
|
||||
/* wifi/bt button */
|
||||
MX51_PAD_DI1_PIN12__GPIO3_1,
|
||||
|
||||
/* power off */
|
||||
MX51_PAD_CSI2_VSYNC__GPIO4_13,
|
||||
|
||||
/* wdog reset */
|
||||
MX51_PAD_GPIO1_4__WDOG1_WDOG_B,
|
||||
|
||||
/* BT */
|
||||
MX51_PAD_EIM_A17__GPIO2_11,
|
||||
|
||||
MX51_PAD_SD1_CD,
|
||||
};
|
||||
|
||||
static int initialize_usbh2_port(struct platform_device *pdev)
|
||||
{
|
||||
iomux_v3_cfg_t usbh2stp = MX51_PAD_EIM_A26__USBH2_STP;
|
||||
iomux_v3_cfg_t usbh2gpio = MX51_PAD_EIM_A26__GPIO2_20;
|
||||
|
||||
mxc_iomux_v3_setup_pad(usbh2gpio);
|
||||
gpio_request(EFIKASB_USBH2_STP, "usbh2_stp");
|
||||
gpio_direction_output(EFIKASB_USBH2_STP, 0);
|
||||
msleep(1);
|
||||
gpio_set_value(EFIKASB_USBH2_STP, 1);
|
||||
msleep(1);
|
||||
|
||||
gpio_free(EFIKASB_USBH2_STP);
|
||||
mxc_iomux_v3_setup_pad(usbh2stp);
|
||||
|
||||
mdelay(10);
|
||||
|
||||
return mx51_initialize_usb_hw(pdev->id, MXC_EHCI_ITC_NO_THRESHOLD);
|
||||
}
|
||||
|
||||
static struct mxc_usbh_platform_data usbh2_config __initdata = {
|
||||
.init = initialize_usbh2_port,
|
||||
.portsc = MXC_EHCI_MODE_ULPI,
|
||||
};
|
||||
|
||||
static void __init mx51_efikasb_usb(void)
|
||||
{
|
||||
usbh2_config.otg = imx_otg_ulpi_create(ULPI_OTG_DRVVBUS |
|
||||
ULPI_OTG_DRVVBUS_EXT | ULPI_OTG_EXTVBUSIND);
|
||||
if (usbh2_config.otg)
|
||||
imx51_add_mxc_ehci_hs(2, &usbh2_config);
|
||||
}
|
||||
|
||||
static const struct gpio_led mx51_efikasb_leds[] __initconst = {
|
||||
{
|
||||
.name = "efikasb:green",
|
||||
.default_trigger = "default-on",
|
||||
.gpio = EFIKASB_GREEN_LED,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.name = "efikasb:white",
|
||||
.default_trigger = "caps",
|
||||
.gpio = EFIKASB_WHITE_LED,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct gpio_led_platform_data
|
||||
mx51_efikasb_leds_data __initconst = {
|
||||
.leds = mx51_efikasb_leds,
|
||||
.num_leds = ARRAY_SIZE(mx51_efikasb_leds),
|
||||
};
|
||||
|
||||
static struct gpio_keys_button mx51_efikasb_keys[] = {
|
||||
{
|
||||
.code = KEY_POWER,
|
||||
.gpio = EFIKASB_PWRKEY,
|
||||
.type = EV_KEY,
|
||||
.desc = "Power Button",
|
||||
.wakeup = 1,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.code = SW_LID,
|
||||
.gpio = EFIKASB_LID,
|
||||
.type = EV_SW,
|
||||
.desc = "Lid Switch",
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.code = KEY_RFKILL,
|
||||
.gpio = EFIKASB_RFKILL,
|
||||
.type = EV_KEY,
|
||||
.desc = "rfkill",
|
||||
.active_low = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct gpio_keys_platform_data mx51_efikasb_keys_data __initconst = {
|
||||
.buttons = mx51_efikasb_keys,
|
||||
.nbuttons = ARRAY_SIZE(mx51_efikasb_keys),
|
||||
};
|
||||
|
||||
static struct esdhc_platform_data sd0_pdata = {
|
||||
#define EFIKASB_SD1_CD IMX_GPIO_NR(2, 27)
|
||||
.cd_gpio = EFIKASB_SD1_CD,
|
||||
.cd_type = ESDHC_CD_GPIO,
|
||||
.wp_type = ESDHC_WP_CONTROLLER,
|
||||
};
|
||||
|
||||
static struct esdhc_platform_data sd1_pdata = {
|
||||
.cd_type = ESDHC_CD_CONTROLLER,
|
||||
.wp_type = ESDHC_WP_CONTROLLER,
|
||||
};
|
||||
|
||||
static struct regulator *pwgt1, *pwgt2;
|
||||
|
||||
static void mx51_efikasb_power_off(void)
|
||||
{
|
||||
gpio_set_value(EFIKA_USB_PHY_RESET, 0);
|
||||
|
||||
if (!IS_ERR(pwgt1) && !IS_ERR(pwgt2)) {
|
||||
regulator_disable(pwgt2);
|
||||
regulator_disable(pwgt1);
|
||||
}
|
||||
gpio_direction_output(EFIKASB_POWEROFF, 1);
|
||||
}
|
||||
|
||||
static int __init mx51_efikasb_power_init(void)
|
||||
{
|
||||
pwgt1 = regulator_get(NULL, "pwgt1");
|
||||
pwgt2 = regulator_get(NULL, "pwgt2");
|
||||
if (!IS_ERR(pwgt1) && !IS_ERR(pwgt2)) {
|
||||
regulator_enable(pwgt1);
|
||||
regulator_enable(pwgt2);
|
||||
}
|
||||
gpio_request(EFIKASB_POWEROFF, "poweroff");
|
||||
pm_power_off = mx51_efikasb_power_off;
|
||||
|
||||
regulator_has_full_constraints();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __init mx51_efikasb_init_late(void)
|
||||
{
|
||||
imx51_init_late();
|
||||
mx51_efikasb_power_init();
|
||||
}
|
||||
|
||||
/* 01 R1.3 board
|
||||
10 R2.0 board */
|
||||
static void __init mx51_efikasb_board_id(void)
|
||||
{
|
||||
int id;
|
||||
|
||||
gpio_request(EFIKASB_PCBID0, "pcb id0");
|
||||
gpio_direction_input(EFIKASB_PCBID0);
|
||||
gpio_request(EFIKASB_PCBID1, "pcb id1");
|
||||
gpio_direction_input(EFIKASB_PCBID1);
|
||||
|
||||
id = gpio_get_value(EFIKASB_PCBID0) ? 1 : 0;
|
||||
id |= (gpio_get_value(EFIKASB_PCBID1) ? 1 : 0) << 1;
|
||||
|
||||
switch (id) {
|
||||
default:
|
||||
break;
|
||||
case 1:
|
||||
system_rev = 0x13;
|
||||
break;
|
||||
case 2:
|
||||
system_rev = 0x20;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void __init efikasb_board_init(void)
|
||||
{
|
||||
imx51_soc_init();
|
||||
|
||||
mxc_iomux_v3_setup_multiple_pads(mx51efikasb_pads,
|
||||
ARRAY_SIZE(mx51efikasb_pads));
|
||||
efika_board_common_init();
|
||||
|
||||
mx51_efikasb_board_id();
|
||||
mx51_efikasb_usb();
|
||||
imx51_add_sdhci_esdhc_imx(0, &sd0_pdata);
|
||||
imx51_add_sdhci_esdhc_imx(1, &sd1_pdata);
|
||||
|
||||
gpio_led_register_device(-1, &mx51_efikasb_leds_data);
|
||||
imx_add_gpio_keys(&mx51_efikasb_keys_data);
|
||||
}
|
||||
|
||||
static void __init mx51_efikasb_timer_init(void)
|
||||
{
|
||||
mx51_clocks_init(32768, 24000000, 22579200, 24576000);
|
||||
}
|
||||
|
||||
static struct sys_timer mx51_efikasb_timer = {
|
||||
.init = mx51_efikasb_timer_init,
|
||||
};
|
||||
|
||||
MACHINE_START(MX51_EFIKASB, "Genesi Efika MX (Smartbook)")
|
||||
.atag_offset = 0x100,
|
||||
.map_io = mx51_map_io,
|
||||
.init_early = imx51_init_early,
|
||||
.init_irq = mx51_init_irq,
|
||||
.handle_irq = imx51_handle_irq,
|
||||
.init_machine = efikasb_board_init,
|
||||
.init_late = mx51_efikasb_init_late,
|
||||
.timer = &mx51_efikasb_timer,
|
||||
.restart = mxc_restart,
|
||||
MACHINE_END
|
||||
|
|
@ -1,272 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* 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.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/smsc911x.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/regulator/fixed.h>
|
||||
|
||||
#include <mach/common.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/iomux-mx53.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/time.h>
|
||||
|
||||
#include "devices-imx53.h"
|
||||
|
||||
#define ARD_ETHERNET_INT_B IMX_GPIO_NR(2, 31)
|
||||
#define ARD_SD1_CD IMX_GPIO_NR(1, 1)
|
||||
#define ARD_SD1_WP IMX_GPIO_NR(1, 9)
|
||||
#define ARD_I2CPORTEXP_B IMX_GPIO_NR(2, 3)
|
||||
#define ARD_VOLUMEDOWN IMX_GPIO_NR(4, 0)
|
||||
#define ARD_HOME IMX_GPIO_NR(5, 10)
|
||||
#define ARD_BACK IMX_GPIO_NR(5, 11)
|
||||
#define ARD_PROG IMX_GPIO_NR(5, 12)
|
||||
#define ARD_VOLUMEUP IMX_GPIO_NR(5, 13)
|
||||
|
||||
static iomux_v3_cfg_t mx53_ard_pads[] = {
|
||||
/* UART1 */
|
||||
MX53_PAD_PATA_DIOW__UART1_TXD_MUX,
|
||||
MX53_PAD_PATA_DMACK__UART1_RXD_MUX,
|
||||
/* WEIM for CS1 */
|
||||
MX53_PAD_EIM_EB3__GPIO2_31, /* ETHERNET_INT_B */
|
||||
MX53_PAD_EIM_D16__EMI_WEIM_D_16,
|
||||
MX53_PAD_EIM_D17__EMI_WEIM_D_17,
|
||||
MX53_PAD_EIM_D18__EMI_WEIM_D_18,
|
||||
MX53_PAD_EIM_D19__EMI_WEIM_D_19,
|
||||
MX53_PAD_EIM_D20__EMI_WEIM_D_20,
|
||||
MX53_PAD_EIM_D21__EMI_WEIM_D_21,
|
||||
MX53_PAD_EIM_D22__EMI_WEIM_D_22,
|
||||
MX53_PAD_EIM_D23__EMI_WEIM_D_23,
|
||||
MX53_PAD_EIM_D24__EMI_WEIM_D_24,
|
||||
MX53_PAD_EIM_D25__EMI_WEIM_D_25,
|
||||
MX53_PAD_EIM_D26__EMI_WEIM_D_26,
|
||||
MX53_PAD_EIM_D27__EMI_WEIM_D_27,
|
||||
MX53_PAD_EIM_D28__EMI_WEIM_D_28,
|
||||
MX53_PAD_EIM_D29__EMI_WEIM_D_29,
|
||||
MX53_PAD_EIM_D30__EMI_WEIM_D_30,
|
||||
MX53_PAD_EIM_D31__EMI_WEIM_D_31,
|
||||
MX53_PAD_EIM_DA0__EMI_NAND_WEIM_DA_0,
|
||||
MX53_PAD_EIM_DA1__EMI_NAND_WEIM_DA_1,
|
||||
MX53_PAD_EIM_DA2__EMI_NAND_WEIM_DA_2,
|
||||
MX53_PAD_EIM_DA3__EMI_NAND_WEIM_DA_3,
|
||||
MX53_PAD_EIM_DA4__EMI_NAND_WEIM_DA_4,
|
||||
MX53_PAD_EIM_DA5__EMI_NAND_WEIM_DA_5,
|
||||
MX53_PAD_EIM_DA6__EMI_NAND_WEIM_DA_6,
|
||||
MX53_PAD_EIM_OE__EMI_WEIM_OE,
|
||||
MX53_PAD_EIM_RW__EMI_WEIM_RW,
|
||||
MX53_PAD_EIM_CS1__EMI_WEIM_CS_1,
|
||||
/* SDHC1 */
|
||||
MX53_PAD_SD1_CMD__ESDHC1_CMD,
|
||||
MX53_PAD_SD1_CLK__ESDHC1_CLK,
|
||||
MX53_PAD_SD1_DATA0__ESDHC1_DAT0,
|
||||
MX53_PAD_SD1_DATA1__ESDHC1_DAT1,
|
||||
MX53_PAD_SD1_DATA2__ESDHC1_DAT2,
|
||||
MX53_PAD_SD1_DATA3__ESDHC1_DAT3,
|
||||
MX53_PAD_PATA_DATA8__ESDHC1_DAT4,
|
||||
MX53_PAD_PATA_DATA9__ESDHC1_DAT5,
|
||||
MX53_PAD_PATA_DATA10__ESDHC1_DAT6,
|
||||
MX53_PAD_PATA_DATA11__ESDHC1_DAT7,
|
||||
MX53_PAD_GPIO_1__GPIO1_1,
|
||||
MX53_PAD_GPIO_9__GPIO1_9,
|
||||
/* I2C2 */
|
||||
MX53_PAD_EIM_EB2__I2C2_SCL,
|
||||
MX53_PAD_KEY_ROW3__I2C2_SDA,
|
||||
/* I2C3 */
|
||||
MX53_PAD_GPIO_3__I2C3_SCL,
|
||||
MX53_PAD_GPIO_16__I2C3_SDA,
|
||||
/* GPIO */
|
||||
MX53_PAD_DISP0_DAT16__GPIO5_10, /* home */
|
||||
MX53_PAD_DISP0_DAT17__GPIO5_11, /* back */
|
||||
MX53_PAD_DISP0_DAT18__GPIO5_12, /* prog */
|
||||
MX53_PAD_DISP0_DAT19__GPIO5_13, /* vol up */
|
||||
MX53_PAD_GPIO_10__GPIO4_0, /* vol down */
|
||||
};
|
||||
|
||||
#define GPIO_BUTTON(gpio_num, ev_code, act_low, descr, wake) \
|
||||
{ \
|
||||
.gpio = gpio_num, \
|
||||
.type = EV_KEY, \
|
||||
.code = ev_code, \
|
||||
.active_low = act_low, \
|
||||
.desc = "btn " descr, \
|
||||
.wakeup = wake, \
|
||||
}
|
||||
|
||||
static struct gpio_keys_button ard_buttons[] = {
|
||||
GPIO_BUTTON(ARD_HOME, KEY_HOME, 1, "home", 0),
|
||||
GPIO_BUTTON(ARD_BACK, KEY_BACK, 1, "back", 0),
|
||||
GPIO_BUTTON(ARD_PROG, KEY_PROGRAM, 1, "program", 0),
|
||||
GPIO_BUTTON(ARD_VOLUMEUP, KEY_VOLUMEUP, 1, "volume-up", 0),
|
||||
GPIO_BUTTON(ARD_VOLUMEDOWN, KEY_VOLUMEDOWN, 1, "volume-down", 0),
|
||||
};
|
||||
|
||||
static const struct gpio_keys_platform_data ard_button_data __initconst = {
|
||||
.buttons = ard_buttons,
|
||||
.nbuttons = ARRAY_SIZE(ard_buttons),
|
||||
};
|
||||
|
||||
static struct resource ard_smsc911x_resources[] = {
|
||||
{
|
||||
.start = MX53_CS1_64MB_BASE_ADDR,
|
||||
.end = MX53_CS1_64MB_BASE_ADDR + SZ_32M - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
/* irq number is run-time assigned */
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
struct smsc911x_platform_config ard_smsc911x_config = {
|
||||
.irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
|
||||
.irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL,
|
||||
.flags = SMSC911X_USE_32BIT,
|
||||
};
|
||||
|
||||
static struct platform_device ard_smsc_lan9220_device = {
|
||||
.name = "smsc911x",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(ard_smsc911x_resources),
|
||||
.resource = ard_smsc911x_resources,
|
||||
.dev = {
|
||||
.platform_data = &ard_smsc911x_config,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct esdhc_platform_data mx53_ard_sd1_data __initconst = {
|
||||
.cd_gpio = ARD_SD1_CD,
|
||||
.wp_gpio = ARD_SD1_WP,
|
||||
};
|
||||
|
||||
static struct imxi2c_platform_data mx53_ard_i2c2_data = {
|
||||
.bitrate = 50000,
|
||||
};
|
||||
|
||||
static struct imxi2c_platform_data mx53_ard_i2c3_data = {
|
||||
.bitrate = 400000,
|
||||
};
|
||||
|
||||
static void __init mx53_ard_io_init(void)
|
||||
{
|
||||
gpio_request(ARD_ETHERNET_INT_B, "eth-int-b");
|
||||
gpio_direction_input(ARD_ETHERNET_INT_B);
|
||||
|
||||
gpio_request(ARD_I2CPORTEXP_B, "i2cptexp-rst");
|
||||
gpio_direction_output(ARD_I2CPORTEXP_B, 1);
|
||||
}
|
||||
|
||||
/* Config CS1 settings for ethernet controller */
|
||||
static int weim_cs_config(void)
|
||||
{
|
||||
u32 reg;
|
||||
void __iomem *weim_base, *iomuxc_base;
|
||||
|
||||
weim_base = ioremap(MX53_WEIM_BASE_ADDR, SZ_4K);
|
||||
if (!weim_base)
|
||||
return -ENOMEM;
|
||||
|
||||
iomuxc_base = ioremap(MX53_IOMUXC_BASE_ADDR, SZ_4K);
|
||||
if (!iomuxc_base) {
|
||||
iounmap(weim_base);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* CS1 timings for LAN9220 */
|
||||
writel(0x20001, (weim_base + 0x18));
|
||||
writel(0x0, (weim_base + 0x1C));
|
||||
writel(0x16000202, (weim_base + 0x20));
|
||||
writel(0x00000002, (weim_base + 0x24));
|
||||
writel(0x16002082, (weim_base + 0x28));
|
||||
writel(0x00000000, (weim_base + 0x2C));
|
||||
writel(0x00000000, (weim_base + 0x90));
|
||||
|
||||
/* specify 64 MB on CS1 and CS0 on GPR1 */
|
||||
reg = readl(iomuxc_base + 0x4);
|
||||
reg &= ~0x3F;
|
||||
reg |= 0x1B;
|
||||
writel(reg, (iomuxc_base + 0x4));
|
||||
|
||||
iounmap(iomuxc_base);
|
||||
iounmap(weim_base);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct regulator_consumer_supply dummy_supplies[] = {
|
||||
REGULATOR_SUPPLY("vdd33a", "smsc911x"),
|
||||
REGULATOR_SUPPLY("vddvario", "smsc911x"),
|
||||
};
|
||||
|
||||
void __init imx53_ard_common_init(void)
|
||||
{
|
||||
mxc_iomux_v3_setup_multiple_pads(mx53_ard_pads,
|
||||
ARRAY_SIZE(mx53_ard_pads));
|
||||
weim_cs_config();
|
||||
}
|
||||
|
||||
static struct platform_device *devices[] __initdata = {
|
||||
&ard_smsc_lan9220_device,
|
||||
};
|
||||
|
||||
static void __init mx53_ard_board_init(void)
|
||||
{
|
||||
imx53_soc_init();
|
||||
imx53_add_imx_uart(0, NULL);
|
||||
|
||||
imx53_ard_common_init();
|
||||
mx53_ard_io_init();
|
||||
regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies));
|
||||
ard_smsc911x_resources[1].start = gpio_to_irq(ARD_ETHERNET_INT_B);
|
||||
ard_smsc911x_resources[1].end = gpio_to_irq(ARD_ETHERNET_INT_B);
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
|
||||
imx53_add_sdhci_esdhc_imx(0, &mx53_ard_sd1_data);
|
||||
imx53_add_imx2_wdt(0);
|
||||
imx53_add_imx_i2c(1, &mx53_ard_i2c2_data);
|
||||
imx53_add_imx_i2c(2, &mx53_ard_i2c3_data);
|
||||
imx_add_gpio_keys(&ard_button_data);
|
||||
imx53_add_ahci_imx();
|
||||
}
|
||||
|
||||
static void __init mx53_ard_timer_init(void)
|
||||
{
|
||||
mx53_clocks_init(32768, 24000000, 22579200, 0);
|
||||
}
|
||||
|
||||
static struct sys_timer mx53_ard_timer = {
|
||||
.init = mx53_ard_timer_init,
|
||||
};
|
||||
|
||||
MACHINE_START(MX53_ARD, "Freescale MX53 ARD Board")
|
||||
.map_io = mx53_map_io,
|
||||
.init_early = imx53_init_early,
|
||||
.init_irq = mx53_init_irq,
|
||||
.handle_irq = imx53_handle_irq,
|
||||
.timer = &mx53_ard_timer,
|
||||
.init_machine = mx53_ard_board_init,
|
||||
.init_late = imx53_init_late,
|
||||
.restart = mxc_restart,
|
||||
MACHINE_END
|
||||
|
|
@ -1,179 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Freescale Semiconductor, Inc. All Rights Reserved.
|
||||
* Copyright (C) 2010 Yong Shen. <Yong.Shen@linaro.org>
|
||||
*/
|
||||
|
||||
/*
|
||||
* 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.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/spi/flash.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <mach/common.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/time.h>
|
||||
#include <mach/iomux-mx53.h>
|
||||
|
||||
#define MX53_EVK_FEC_PHY_RST IMX_GPIO_NR(7, 6)
|
||||
#define EVK_ECSPI1_CS0 IMX_GPIO_NR(2, 30)
|
||||
#define EVK_ECSPI1_CS1 IMX_GPIO_NR(3, 19)
|
||||
#define MX53EVK_LED IMX_GPIO_NR(7, 7)
|
||||
|
||||
#include "devices-imx53.h"
|
||||
|
||||
static iomux_v3_cfg_t mx53_evk_pads[] = {
|
||||
MX53_PAD_CSI0_DAT10__UART1_TXD_MUX,
|
||||
MX53_PAD_CSI0_DAT11__UART1_RXD_MUX,
|
||||
|
||||
MX53_PAD_PATA_BUFFER_EN__UART2_RXD_MUX,
|
||||
MX53_PAD_PATA_DMARQ__UART2_TXD_MUX,
|
||||
MX53_PAD_PATA_DIOR__UART2_RTS,
|
||||
MX53_PAD_PATA_INTRQ__UART2_CTS,
|
||||
|
||||
MX53_PAD_PATA_CS_0__UART3_TXD_MUX,
|
||||
MX53_PAD_PATA_CS_1__UART3_RXD_MUX,
|
||||
|
||||
MX53_PAD_EIM_D16__ECSPI1_SCLK,
|
||||
MX53_PAD_EIM_D17__ECSPI1_MISO,
|
||||
MX53_PAD_EIM_D18__ECSPI1_MOSI,
|
||||
|
||||
/* ecspi chip select lines */
|
||||
MX53_PAD_EIM_EB2__GPIO2_30,
|
||||
MX53_PAD_EIM_D19__GPIO3_19,
|
||||
/* LED */
|
||||
MX53_PAD_PATA_DA_1__GPIO7_7,
|
||||
};
|
||||
|
||||
static const struct imxuart_platform_data mx53_evk_uart_pdata __initconst = {
|
||||
.flags = IMXUART_HAVE_RTSCTS,
|
||||
};
|
||||
|
||||
static const struct gpio_led mx53evk_leds[] __initconst = {
|
||||
{
|
||||
.name = "green",
|
||||
.default_trigger = "heartbeat",
|
||||
.gpio = MX53EVK_LED,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct gpio_led_platform_data mx53evk_leds_data __initconst = {
|
||||
.leds = mx53evk_leds,
|
||||
.num_leds = ARRAY_SIZE(mx53evk_leds),
|
||||
};
|
||||
|
||||
static inline void mx53_evk_init_uart(void)
|
||||
{
|
||||
imx53_add_imx_uart(0, NULL);
|
||||
imx53_add_imx_uart(1, &mx53_evk_uart_pdata);
|
||||
imx53_add_imx_uart(2, NULL);
|
||||
}
|
||||
|
||||
static const struct imxi2c_platform_data mx53_evk_i2c_data __initconst = {
|
||||
.bitrate = 100000,
|
||||
};
|
||||
|
||||
static inline void mx53_evk_fec_reset(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* reset FEC PHY */
|
||||
ret = gpio_request_one(MX53_EVK_FEC_PHY_RST, GPIOF_OUT_INIT_LOW,
|
||||
"fec-phy-reset");
|
||||
if (ret) {
|
||||
printk(KERN_ERR"failed to get GPIO_FEC_PHY_RESET: %d\n", ret);
|
||||
return;
|
||||
}
|
||||
msleep(1);
|
||||
gpio_set_value(MX53_EVK_FEC_PHY_RST, 1);
|
||||
}
|
||||
|
||||
static const struct fec_platform_data mx53_evk_fec_pdata __initconst = {
|
||||
.phy = PHY_INTERFACE_MODE_RMII,
|
||||
};
|
||||
|
||||
static struct spi_board_info mx53_evk_spi_board_info[] __initdata = {
|
||||
{
|
||||
.modalias = "mtd_dataflash",
|
||||
.max_speed_hz = 25000000,
|
||||
.bus_num = 0,
|
||||
.chip_select = 1,
|
||||
.mode = SPI_MODE_0,
|
||||
.platform_data = NULL,
|
||||
},
|
||||
};
|
||||
|
||||
static int mx53_evk_spi_cs[] = {
|
||||
EVK_ECSPI1_CS0,
|
||||
EVK_ECSPI1_CS1,
|
||||
};
|
||||
|
||||
static const struct spi_imx_master mx53_evk_spi_data __initconst = {
|
||||
.chipselect = mx53_evk_spi_cs,
|
||||
.num_chipselect = ARRAY_SIZE(mx53_evk_spi_cs),
|
||||
};
|
||||
|
||||
void __init imx53_evk_common_init(void)
|
||||
{
|
||||
mxc_iomux_v3_setup_multiple_pads(mx53_evk_pads,
|
||||
ARRAY_SIZE(mx53_evk_pads));
|
||||
}
|
||||
|
||||
static void __init mx53_evk_board_init(void)
|
||||
{
|
||||
imx53_soc_init();
|
||||
imx53_evk_common_init();
|
||||
|
||||
mx53_evk_init_uart();
|
||||
mx53_evk_fec_reset();
|
||||
imx53_add_fec(&mx53_evk_fec_pdata);
|
||||
|
||||
imx53_add_imx_i2c(0, &mx53_evk_i2c_data);
|
||||
imx53_add_imx_i2c(1, &mx53_evk_i2c_data);
|
||||
|
||||
imx53_add_sdhci_esdhc_imx(0, NULL);
|
||||
imx53_add_sdhci_esdhc_imx(1, NULL);
|
||||
|
||||
spi_register_board_info(mx53_evk_spi_board_info,
|
||||
ARRAY_SIZE(mx53_evk_spi_board_info));
|
||||
imx53_add_ecspi(0, &mx53_evk_spi_data);
|
||||
imx53_add_imx2_wdt(0);
|
||||
gpio_led_register_device(-1, &mx53evk_leds_data);
|
||||
}
|
||||
|
||||
static void __init mx53_evk_timer_init(void)
|
||||
{
|
||||
mx53_clocks_init(32768, 24000000, 22579200, 0);
|
||||
}
|
||||
|
||||
static struct sys_timer mx53_evk_timer = {
|
||||
.init = mx53_evk_timer_init,
|
||||
};
|
||||
|
||||
MACHINE_START(MX53_EVK, "Freescale MX53 EVK Board")
|
||||
.map_io = mx53_map_io,
|
||||
.init_early = imx53_init_early,
|
||||
.init_irq = mx53_init_irq,
|
||||
.handle_irq = imx53_handle_irq,
|
||||
.timer = &mx53_evk_timer,
|
||||
.init_machine = mx53_evk_board_init,
|
||||
.init_late = imx53_init_late,
|
||||
.restart = mxc_restart,
|
||||
MACHINE_END
|
||||
|
|
@ -1,321 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* 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.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/i2c.h>
|
||||
|
||||
#include <mach/common.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/iomux-mx53.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/time.h>
|
||||
|
||||
#include "devices-imx53.h"
|
||||
|
||||
#define MX53_LOCO_POWER IMX_GPIO_NR(1, 8)
|
||||
#define MX53_LOCO_UI1 IMX_GPIO_NR(2, 14)
|
||||
#define MX53_LOCO_UI2 IMX_GPIO_NR(2, 15)
|
||||
#define LOCO_FEC_PHY_RST IMX_GPIO_NR(7, 6)
|
||||
#define LOCO_LED IMX_GPIO_NR(7, 7)
|
||||
#define LOCO_SD3_CD IMX_GPIO_NR(3, 11)
|
||||
#define LOCO_SD3_WP IMX_GPIO_NR(3, 12)
|
||||
#define LOCO_SD1_CD IMX_GPIO_NR(3, 13)
|
||||
#define LOCO_ACCEL_EN IMX_GPIO_NR(6, 14)
|
||||
|
||||
static iomux_v3_cfg_t mx53_loco_pads[] = {
|
||||
/* FEC */
|
||||
MX53_PAD_FEC_MDC__FEC_MDC,
|
||||
MX53_PAD_FEC_MDIO__FEC_MDIO,
|
||||
MX53_PAD_FEC_REF_CLK__FEC_TX_CLK,
|
||||
MX53_PAD_FEC_RX_ER__FEC_RX_ER,
|
||||
MX53_PAD_FEC_CRS_DV__FEC_RX_DV,
|
||||
MX53_PAD_FEC_RXD1__FEC_RDATA_1,
|
||||
MX53_PAD_FEC_RXD0__FEC_RDATA_0,
|
||||
MX53_PAD_FEC_TX_EN__FEC_TX_EN,
|
||||
MX53_PAD_FEC_TXD1__FEC_TDATA_1,
|
||||
MX53_PAD_FEC_TXD0__FEC_TDATA_0,
|
||||
/* FEC_nRST */
|
||||
MX53_PAD_PATA_DA_0__GPIO7_6,
|
||||
/* FEC_nINT */
|
||||
MX53_PAD_PATA_DATA4__GPIO2_4,
|
||||
/* AUDMUX5 */
|
||||
MX53_PAD_KEY_COL0__AUDMUX_AUD5_TXC,
|
||||
MX53_PAD_KEY_ROW0__AUDMUX_AUD5_TXD,
|
||||
MX53_PAD_KEY_COL1__AUDMUX_AUD5_TXFS,
|
||||
MX53_PAD_KEY_ROW1__AUDMUX_AUD5_RXD,
|
||||
/* I2C1 */
|
||||
MX53_PAD_CSI0_DAT8__I2C1_SDA,
|
||||
MX53_PAD_CSI0_DAT9__I2C1_SCL,
|
||||
MX53_PAD_NANDF_CS1__GPIO6_14, /* Accelerometer Enable */
|
||||
/* I2C2 */
|
||||
MX53_PAD_KEY_COL3__I2C2_SCL,
|
||||
MX53_PAD_KEY_ROW3__I2C2_SDA,
|
||||
/* SD1 */
|
||||
MX53_PAD_SD1_CMD__ESDHC1_CMD,
|
||||
MX53_PAD_SD1_CLK__ESDHC1_CLK,
|
||||
MX53_PAD_SD1_DATA0__ESDHC1_DAT0,
|
||||
MX53_PAD_SD1_DATA1__ESDHC1_DAT1,
|
||||
MX53_PAD_SD1_DATA2__ESDHC1_DAT2,
|
||||
MX53_PAD_SD1_DATA3__ESDHC1_DAT3,
|
||||
/* SD1_CD */
|
||||
MX53_PAD_EIM_DA13__GPIO3_13,
|
||||
/* SD3 */
|
||||
MX53_PAD_PATA_DATA8__ESDHC3_DAT0,
|
||||
MX53_PAD_PATA_DATA9__ESDHC3_DAT1,
|
||||
MX53_PAD_PATA_DATA10__ESDHC3_DAT2,
|
||||
MX53_PAD_PATA_DATA11__ESDHC3_DAT3,
|
||||
MX53_PAD_PATA_DATA0__ESDHC3_DAT4,
|
||||
MX53_PAD_PATA_DATA1__ESDHC3_DAT5,
|
||||
MX53_PAD_PATA_DATA2__ESDHC3_DAT6,
|
||||
MX53_PAD_PATA_DATA3__ESDHC3_DAT7,
|
||||
MX53_PAD_PATA_IORDY__ESDHC3_CLK,
|
||||
MX53_PAD_PATA_RESET_B__ESDHC3_CMD,
|
||||
/* SD3_CD */
|
||||
MX53_PAD_EIM_DA11__GPIO3_11,
|
||||
/* SD3_WP */
|
||||
MX53_PAD_EIM_DA12__GPIO3_12,
|
||||
/* VGA */
|
||||
MX53_PAD_EIM_OE__IPU_DI1_PIN7,
|
||||
MX53_PAD_EIM_RW__IPU_DI1_PIN8,
|
||||
/* DISPLB */
|
||||
MX53_PAD_EIM_D20__IPU_SER_DISP0_CS,
|
||||
MX53_PAD_EIM_D21__IPU_DISPB0_SER_CLK,
|
||||
MX53_PAD_EIM_D22__IPU_DISPB0_SER_DIN,
|
||||
MX53_PAD_EIM_D23__IPU_DI0_D0_CS,
|
||||
/* DISP0_POWER_EN */
|
||||
MX53_PAD_EIM_D24__GPIO3_24,
|
||||
/* DISP0 DET INT */
|
||||
MX53_PAD_EIM_D31__GPIO3_31,
|
||||
/* LVDS */
|
||||
MX53_PAD_LVDS0_TX3_P__LDB_LVDS0_TX3,
|
||||
MX53_PAD_LVDS0_CLK_P__LDB_LVDS0_CLK,
|
||||
MX53_PAD_LVDS0_TX2_P__LDB_LVDS0_TX2,
|
||||
MX53_PAD_LVDS0_TX1_P__LDB_LVDS0_TX1,
|
||||
MX53_PAD_LVDS0_TX0_P__LDB_LVDS0_TX0,
|
||||
MX53_PAD_LVDS1_TX3_P__LDB_LVDS1_TX3,
|
||||
MX53_PAD_LVDS1_TX2_P__LDB_LVDS1_TX2,
|
||||
MX53_PAD_LVDS1_CLK_P__LDB_LVDS1_CLK,
|
||||
MX53_PAD_LVDS1_TX1_P__LDB_LVDS1_TX1,
|
||||
MX53_PAD_LVDS1_TX0_P__LDB_LVDS1_TX0,
|
||||
/* I2C1 */
|
||||
MX53_PAD_CSI0_DAT8__I2C1_SDA,
|
||||
MX53_PAD_CSI0_DAT9__I2C1_SCL,
|
||||
/* UART1 */
|
||||
MX53_PAD_CSI0_DAT10__UART1_TXD_MUX,
|
||||
MX53_PAD_CSI0_DAT11__UART1_RXD_MUX,
|
||||
/* CSI0 */
|
||||
MX53_PAD_CSI0_DAT12__IPU_CSI0_D_12,
|
||||
MX53_PAD_CSI0_DAT13__IPU_CSI0_D_13,
|
||||
MX53_PAD_CSI0_DAT14__IPU_CSI0_D_14,
|
||||
MX53_PAD_CSI0_DAT15__IPU_CSI0_D_15,
|
||||
MX53_PAD_CSI0_DAT16__IPU_CSI0_D_16,
|
||||
MX53_PAD_CSI0_DAT17__IPU_CSI0_D_17,
|
||||
MX53_PAD_CSI0_DAT18__IPU_CSI0_D_18,
|
||||
MX53_PAD_CSI0_DAT19__IPU_CSI0_D_19,
|
||||
MX53_PAD_CSI0_VSYNC__IPU_CSI0_VSYNC,
|
||||
MX53_PAD_CSI0_MCLK__IPU_CSI0_HSYNC,
|
||||
MX53_PAD_CSI0_PIXCLK__IPU_CSI0_PIXCLK,
|
||||
/* DISPLAY */
|
||||
MX53_PAD_DI0_DISP_CLK__IPU_DI0_DISP_CLK,
|
||||
MX53_PAD_DI0_PIN15__IPU_DI0_PIN15,
|
||||
MX53_PAD_DI0_PIN2__IPU_DI0_PIN2,
|
||||
MX53_PAD_DI0_PIN3__IPU_DI0_PIN3,
|
||||
MX53_PAD_DISP0_DAT0__IPU_DISP0_DAT_0,
|
||||
MX53_PAD_DISP0_DAT1__IPU_DISP0_DAT_1,
|
||||
MX53_PAD_DISP0_DAT2__IPU_DISP0_DAT_2,
|
||||
MX53_PAD_DISP0_DAT3__IPU_DISP0_DAT_3,
|
||||
MX53_PAD_DISP0_DAT4__IPU_DISP0_DAT_4,
|
||||
MX53_PAD_DISP0_DAT5__IPU_DISP0_DAT_5,
|
||||
MX53_PAD_DISP0_DAT6__IPU_DISP0_DAT_6,
|
||||
MX53_PAD_DISP0_DAT7__IPU_DISP0_DAT_7,
|
||||
MX53_PAD_DISP0_DAT8__IPU_DISP0_DAT_8,
|
||||
MX53_PAD_DISP0_DAT9__IPU_DISP0_DAT_9,
|
||||
MX53_PAD_DISP0_DAT10__IPU_DISP0_DAT_10,
|
||||
MX53_PAD_DISP0_DAT11__IPU_DISP0_DAT_11,
|
||||
MX53_PAD_DISP0_DAT12__IPU_DISP0_DAT_12,
|
||||
MX53_PAD_DISP0_DAT13__IPU_DISP0_DAT_13,
|
||||
MX53_PAD_DISP0_DAT14__IPU_DISP0_DAT_14,
|
||||
MX53_PAD_DISP0_DAT15__IPU_DISP0_DAT_15,
|
||||
MX53_PAD_DISP0_DAT16__IPU_DISP0_DAT_16,
|
||||
MX53_PAD_DISP0_DAT17__IPU_DISP0_DAT_17,
|
||||
MX53_PAD_DISP0_DAT18__IPU_DISP0_DAT_18,
|
||||
MX53_PAD_DISP0_DAT19__IPU_DISP0_DAT_19,
|
||||
MX53_PAD_DISP0_DAT20__IPU_DISP0_DAT_20,
|
||||
MX53_PAD_DISP0_DAT21__IPU_DISP0_DAT_21,
|
||||
MX53_PAD_DISP0_DAT22__IPU_DISP0_DAT_22,
|
||||
MX53_PAD_DISP0_DAT23__IPU_DISP0_DAT_23,
|
||||
/* Audio CLK*/
|
||||
MX53_PAD_GPIO_0__CCM_SSI_EXT1_CLK,
|
||||
/* PWM */
|
||||
MX53_PAD_GPIO_1__PWM2_PWMO,
|
||||
/* SPDIF */
|
||||
MX53_PAD_GPIO_7__SPDIF_PLOCK,
|
||||
MX53_PAD_GPIO_17__SPDIF_OUT1,
|
||||
/* GPIO */
|
||||
MX53_PAD_PATA_DA_1__GPIO7_7, /* LED */
|
||||
MX53_PAD_PATA_DA_2__GPIO7_8,
|
||||
MX53_PAD_PATA_DATA5__GPIO2_5,
|
||||
MX53_PAD_PATA_DATA6__GPIO2_6,
|
||||
MX53_PAD_PATA_DATA14__GPIO2_14,
|
||||
MX53_PAD_PATA_DATA15__GPIO2_15,
|
||||
MX53_PAD_PATA_INTRQ__GPIO7_2,
|
||||
MX53_PAD_EIM_WAIT__GPIO5_0,
|
||||
MX53_PAD_NANDF_WP_B__GPIO6_9,
|
||||
MX53_PAD_NANDF_RB0__GPIO6_10,
|
||||
MX53_PAD_NANDF_CS1__GPIO6_14,
|
||||
MX53_PAD_NANDF_CS2__GPIO6_15,
|
||||
MX53_PAD_NANDF_CS3__GPIO6_16,
|
||||
MX53_PAD_GPIO_5__GPIO1_5,
|
||||
MX53_PAD_GPIO_16__GPIO7_11,
|
||||
MX53_PAD_GPIO_8__GPIO1_8,
|
||||
};
|
||||
|
||||
#define GPIO_BUTTON(gpio_num, ev_code, act_low, descr, wake) \
|
||||
{ \
|
||||
.gpio = gpio_num, \
|
||||
.type = EV_KEY, \
|
||||
.code = ev_code, \
|
||||
.active_low = act_low, \
|
||||
.desc = "btn " descr, \
|
||||
.wakeup = wake, \
|
||||
}
|
||||
|
||||
static struct gpio_keys_button loco_buttons[] = {
|
||||
GPIO_BUTTON(MX53_LOCO_POWER, KEY_POWER, 1, "power", 0),
|
||||
GPIO_BUTTON(MX53_LOCO_UI1, KEY_VOLUMEUP, 1, "volume-up", 0),
|
||||
GPIO_BUTTON(MX53_LOCO_UI2, KEY_VOLUMEDOWN, 1, "volume-down", 0),
|
||||
};
|
||||
|
||||
static const struct gpio_keys_platform_data loco_button_data __initconst = {
|
||||
.buttons = loco_buttons,
|
||||
.nbuttons = ARRAY_SIZE(loco_buttons),
|
||||
};
|
||||
|
||||
static const struct esdhc_platform_data mx53_loco_sd1_data __initconst = {
|
||||
.cd_gpio = LOCO_SD1_CD,
|
||||
.cd_type = ESDHC_CD_GPIO,
|
||||
.wp_type = ESDHC_WP_NONE,
|
||||
};
|
||||
|
||||
static const struct esdhc_platform_data mx53_loco_sd3_data __initconst = {
|
||||
.cd_gpio = LOCO_SD3_CD,
|
||||
.wp_gpio = LOCO_SD3_WP,
|
||||
.cd_type = ESDHC_CD_GPIO,
|
||||
.wp_type = ESDHC_WP_GPIO,
|
||||
};
|
||||
|
||||
static inline void mx53_loco_fec_reset(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* reset FEC PHY */
|
||||
ret = gpio_request(LOCO_FEC_PHY_RST, "fec-phy-reset");
|
||||
if (ret) {
|
||||
printk(KERN_ERR"failed to get GPIO_FEC_PHY_RESET: %d\n", ret);
|
||||
return;
|
||||
}
|
||||
gpio_direction_output(LOCO_FEC_PHY_RST, 0);
|
||||
msleep(1);
|
||||
gpio_set_value(LOCO_FEC_PHY_RST, 1);
|
||||
}
|
||||
|
||||
static const struct fec_platform_data mx53_loco_fec_data __initconst = {
|
||||
.phy = PHY_INTERFACE_MODE_RMII,
|
||||
};
|
||||
|
||||
static const struct imxi2c_platform_data mx53_loco_i2c_data __initconst = {
|
||||
.bitrate = 100000,
|
||||
};
|
||||
|
||||
static const struct gpio_led mx53loco_leds[] __initconst = {
|
||||
{
|
||||
.name = "green",
|
||||
.default_trigger = "heartbeat",
|
||||
.gpio = LOCO_LED,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct gpio_led_platform_data mx53loco_leds_data __initconst = {
|
||||
.leds = mx53loco_leds,
|
||||
.num_leds = ARRAY_SIZE(mx53loco_leds),
|
||||
};
|
||||
|
||||
void __init imx53_qsb_common_init(void)
|
||||
{
|
||||
mxc_iomux_v3_setup_multiple_pads(mx53_loco_pads,
|
||||
ARRAY_SIZE(mx53_loco_pads));
|
||||
}
|
||||
|
||||
static struct i2c_board_info mx53loco_i2c_devices[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("mma8450", 0x1C),
|
||||
},
|
||||
};
|
||||
|
||||
static void __init mx53_loco_board_init(void)
|
||||
{
|
||||
int ret;
|
||||
imx53_soc_init();
|
||||
imx53_qsb_common_init();
|
||||
|
||||
imx53_add_imx_uart(0, NULL);
|
||||
mx53_loco_fec_reset();
|
||||
imx53_add_fec(&mx53_loco_fec_data);
|
||||
imx53_add_imx2_wdt(0);
|
||||
|
||||
ret = gpio_request_one(LOCO_ACCEL_EN, GPIOF_OUT_INIT_HIGH, "accel_en");
|
||||
if (ret)
|
||||
pr_err("Cannot request ACCEL_EN pin: %d\n", ret);
|
||||
|
||||
i2c_register_board_info(0, mx53loco_i2c_devices,
|
||||
ARRAY_SIZE(mx53loco_i2c_devices));
|
||||
imx53_add_imx_i2c(0, &mx53_loco_i2c_data);
|
||||
imx53_add_imx_i2c(1, &mx53_loco_i2c_data);
|
||||
imx53_add_sdhci_esdhc_imx(0, &mx53_loco_sd1_data);
|
||||
imx53_add_sdhci_esdhc_imx(2, &mx53_loco_sd3_data);
|
||||
imx_add_gpio_keys(&loco_button_data);
|
||||
gpio_led_register_device(-1, &mx53loco_leds_data);
|
||||
imx53_add_ahci_imx();
|
||||
}
|
||||
|
||||
static void __init mx53_loco_timer_init(void)
|
||||
{
|
||||
mx53_clocks_init(32768, 24000000, 0, 0);
|
||||
}
|
||||
|
||||
static struct sys_timer mx53_loco_timer = {
|
||||
.init = mx53_loco_timer_init,
|
||||
};
|
||||
|
||||
MACHINE_START(MX53_LOCO, "Freescale MX53 LOCO Board")
|
||||
.map_io = mx53_map_io,
|
||||
.init_early = imx53_init_early,
|
||||
.init_irq = mx53_init_irq,
|
||||
.handle_irq = imx53_handle_irq,
|
||||
.timer = &mx53_loco_timer,
|
||||
.init_machine = mx53_loco_board_init,
|
||||
.init_late = imx53_init_late,
|
||||
.restart = mxc_restart,
|
||||
MACHINE_END
|
||||
|
|
@ -1,168 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* 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.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/gpio.h>
|
||||
|
||||
#include <mach/common.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/iomux-mx53.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/time.h>
|
||||
|
||||
#include "devices-imx53.h"
|
||||
|
||||
#define SMD_FEC_PHY_RST IMX_GPIO_NR(7, 6)
|
||||
#define MX53_SMD_SATA_PWR_EN IMX_GPIO_NR(3, 3)
|
||||
|
||||
static iomux_v3_cfg_t mx53_smd_pads[] = {
|
||||
MX53_PAD_CSI0_DAT10__UART1_TXD_MUX,
|
||||
MX53_PAD_CSI0_DAT11__UART1_RXD_MUX,
|
||||
|
||||
MX53_PAD_PATA_BUFFER_EN__UART2_RXD_MUX,
|
||||
MX53_PAD_PATA_DMARQ__UART2_TXD_MUX,
|
||||
|
||||
MX53_PAD_PATA_CS_0__UART3_TXD_MUX,
|
||||
MX53_PAD_PATA_CS_1__UART3_RXD_MUX,
|
||||
MX53_PAD_PATA_DA_1__UART3_CTS,
|
||||
MX53_PAD_PATA_DA_2__UART3_RTS,
|
||||
/* I2C1 */
|
||||
MX53_PAD_CSI0_DAT8__I2C1_SDA,
|
||||
MX53_PAD_CSI0_DAT9__I2C1_SCL,
|
||||
/* SD1 */
|
||||
MX53_PAD_SD1_CMD__ESDHC1_CMD,
|
||||
MX53_PAD_SD1_CLK__ESDHC1_CLK,
|
||||
MX53_PAD_SD1_DATA0__ESDHC1_DAT0,
|
||||
MX53_PAD_SD1_DATA1__ESDHC1_DAT1,
|
||||
MX53_PAD_SD1_DATA2__ESDHC1_DAT2,
|
||||
MX53_PAD_SD1_DATA3__ESDHC1_DAT3,
|
||||
/* SD2 */
|
||||
MX53_PAD_SD2_CMD__ESDHC2_CMD,
|
||||
MX53_PAD_SD2_CLK__ESDHC2_CLK,
|
||||
MX53_PAD_SD2_DATA0__ESDHC2_DAT0,
|
||||
MX53_PAD_SD2_DATA1__ESDHC2_DAT1,
|
||||
MX53_PAD_SD2_DATA2__ESDHC2_DAT2,
|
||||
MX53_PAD_SD2_DATA3__ESDHC2_DAT3,
|
||||
/* SD3 */
|
||||
MX53_PAD_PATA_DATA8__ESDHC3_DAT0,
|
||||
MX53_PAD_PATA_DATA9__ESDHC3_DAT1,
|
||||
MX53_PAD_PATA_DATA10__ESDHC3_DAT2,
|
||||
MX53_PAD_PATA_DATA11__ESDHC3_DAT3,
|
||||
MX53_PAD_PATA_DATA0__ESDHC3_DAT4,
|
||||
MX53_PAD_PATA_DATA1__ESDHC3_DAT5,
|
||||
MX53_PAD_PATA_DATA2__ESDHC3_DAT6,
|
||||
MX53_PAD_PATA_DATA3__ESDHC3_DAT7,
|
||||
MX53_PAD_PATA_IORDY__ESDHC3_CLK,
|
||||
MX53_PAD_PATA_RESET_B__ESDHC3_CMD,
|
||||
};
|
||||
|
||||
static const struct imxuart_platform_data mx53_smd_uart_data __initconst = {
|
||||
.flags = IMXUART_HAVE_RTSCTS,
|
||||
};
|
||||
|
||||
static inline void mx53_smd_init_uart(void)
|
||||
{
|
||||
imx53_add_imx_uart(0, NULL);
|
||||
imx53_add_imx_uart(1, NULL);
|
||||
imx53_add_imx_uart(2, &mx53_smd_uart_data);
|
||||
}
|
||||
|
||||
static inline void mx53_smd_fec_reset(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* reset FEC PHY */
|
||||
ret = gpio_request(SMD_FEC_PHY_RST, "fec-phy-reset");
|
||||
if (ret) {
|
||||
printk(KERN_ERR"failed to get GPIO_FEC_PHY_RESET: %d\n", ret);
|
||||
return;
|
||||
}
|
||||
gpio_direction_output(SMD_FEC_PHY_RST, 0);
|
||||
msleep(1);
|
||||
gpio_set_value(SMD_FEC_PHY_RST, 1);
|
||||
}
|
||||
|
||||
static const struct fec_platform_data mx53_smd_fec_data __initconst = {
|
||||
.phy = PHY_INTERFACE_MODE_RMII,
|
||||
};
|
||||
|
||||
static const struct imxi2c_platform_data mx53_smd_i2c_data __initconst = {
|
||||
.bitrate = 100000,
|
||||
};
|
||||
|
||||
static inline void mx53_smd_ahci_pwr_on(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* Enable SATA PWR */
|
||||
ret = gpio_request_one(MX53_SMD_SATA_PWR_EN,
|
||||
GPIOF_DIR_OUT | GPIOF_INIT_HIGH, "ahci-sata-pwr");
|
||||
if (ret) {
|
||||
pr_err("failed to enable SATA_PWR_EN: %d\n", ret);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void __init imx53_smd_common_init(void)
|
||||
{
|
||||
mxc_iomux_v3_setup_multiple_pads(mx53_smd_pads,
|
||||
ARRAY_SIZE(mx53_smd_pads));
|
||||
}
|
||||
|
||||
static void __init mx53_smd_board_init(void)
|
||||
{
|
||||
imx53_soc_init();
|
||||
imx53_smd_common_init();
|
||||
|
||||
mx53_smd_init_uart();
|
||||
mx53_smd_fec_reset();
|
||||
imx53_add_fec(&mx53_smd_fec_data);
|
||||
imx53_add_imx2_wdt(0);
|
||||
imx53_add_imx_i2c(0, &mx53_smd_i2c_data);
|
||||
imx53_add_sdhci_esdhc_imx(0, NULL);
|
||||
imx53_add_sdhci_esdhc_imx(1, NULL);
|
||||
imx53_add_sdhci_esdhc_imx(2, NULL);
|
||||
mx53_smd_ahci_pwr_on();
|
||||
imx53_add_ahci_imx();
|
||||
}
|
||||
|
||||
static void __init mx53_smd_timer_init(void)
|
||||
{
|
||||
mx53_clocks_init(32768, 24000000, 22579200, 0);
|
||||
}
|
||||
|
||||
static struct sys_timer mx53_smd_timer = {
|
||||
.init = mx53_smd_timer_init,
|
||||
};
|
||||
|
||||
MACHINE_START(MX53_SMD, "Freescale MX53 SMD Board")
|
||||
.map_io = mx53_map_io,
|
||||
.init_early = imx53_init_early,
|
||||
.init_irq = mx53_init_irq,
|
||||
.handle_irq = imx53_handle_irq,
|
||||
.timer = &mx53_smd_timer,
|
||||
.init_machine = mx53_smd_board_init,
|
||||
.init_late = imx53_init_late,
|
||||
.restart = mxc_restart,
|
||||
MACHINE_END
|
||||
|
|
@ -128,25 +128,6 @@ static struct sdma_platform_data imx51_sdma_pdata __initdata = {
|
|||
.script_addrs = &imx51_sdma_script,
|
||||
};
|
||||
|
||||
static struct sdma_script_start_addrs imx53_sdma_script __initdata = {
|
||||
.ap_2_ap_addr = 642,
|
||||
.app_2_mcu_addr = 683,
|
||||
.mcu_2_app_addr = 747,
|
||||
.uart_2_mcu_addr = 817,
|
||||
.shp_2_mcu_addr = 891,
|
||||
.mcu_2_shp_addr = 960,
|
||||
.uartsh_2_mcu_addr = 1032,
|
||||
.spdif_2_mcu_addr = 1100,
|
||||
.mcu_2_spdif_addr = 1134,
|
||||
.firi_2_mcu_addr = 1193,
|
||||
.mcu_2_firi_addr = 1290,
|
||||
};
|
||||
|
||||
static struct sdma_platform_data imx53_sdma_pdata __initdata = {
|
||||
.fw_name = "sdma-imx53.bin",
|
||||
.script_addrs = &imx53_sdma_script,
|
||||
};
|
||||
|
||||
static const struct resource imx50_audmux_res[] __initconst = {
|
||||
DEFINE_RES_MEM(MX50_AUDMUX_BASE_ADDR, SZ_16K),
|
||||
};
|
||||
|
|
@ -155,10 +136,6 @@ static const struct resource imx51_audmux_res[] __initconst = {
|
|||
DEFINE_RES_MEM(MX51_AUDMUX_BASE_ADDR, SZ_16K),
|
||||
};
|
||||
|
||||
static const struct resource imx53_audmux_res[] __initconst = {
|
||||
DEFINE_RES_MEM(MX53_AUDMUX_BASE_ADDR, SZ_16K),
|
||||
};
|
||||
|
||||
void __init imx50_soc_init(void)
|
||||
{
|
||||
/* i.mx50 has the i.mx35 type gpio */
|
||||
|
|
@ -196,30 +173,6 @@ void __init imx51_soc_init(void)
|
|||
ARRAY_SIZE(imx51_audmux_res));
|
||||
}
|
||||
|
||||
void __init imx53_soc_init(void)
|
||||
{
|
||||
/* i.mx53 has the i.mx35 type gpio */
|
||||
mxc_register_gpio("imx35-gpio", 0, MX53_GPIO1_BASE_ADDR, SZ_16K, MX53_INT_GPIO1_LOW, MX53_INT_GPIO1_HIGH);
|
||||
mxc_register_gpio("imx35-gpio", 1, MX53_GPIO2_BASE_ADDR, SZ_16K, MX53_INT_GPIO2_LOW, MX53_INT_GPIO2_HIGH);
|
||||
mxc_register_gpio("imx35-gpio", 2, MX53_GPIO3_BASE_ADDR, SZ_16K, MX53_INT_GPIO3_LOW, MX53_INT_GPIO3_HIGH);
|
||||
mxc_register_gpio("imx35-gpio", 3, MX53_GPIO4_BASE_ADDR, SZ_16K, MX53_INT_GPIO4_LOW, MX53_INT_GPIO4_HIGH);
|
||||
mxc_register_gpio("imx35-gpio", 4, MX53_GPIO5_BASE_ADDR, SZ_16K, MX53_INT_GPIO5_LOW, MX53_INT_GPIO5_HIGH);
|
||||
mxc_register_gpio("imx35-gpio", 5, MX53_GPIO6_BASE_ADDR, SZ_16K, MX53_INT_GPIO6_LOW, MX53_INT_GPIO6_HIGH);
|
||||
mxc_register_gpio("imx35-gpio", 6, MX53_GPIO7_BASE_ADDR, SZ_16K, MX53_INT_GPIO7_LOW, MX53_INT_GPIO7_HIGH);
|
||||
|
||||
pinctrl_provide_dummies();
|
||||
/* i.mx53 has the i.mx35 type sdma */
|
||||
imx_add_imx_sdma("imx35-sdma", MX53_SDMA_BASE_ADDR, MX53_INT_SDMA, &imx53_sdma_pdata);
|
||||
|
||||
/* Setup AIPS registers */
|
||||
imx_set_aips(MX53_IO_ADDRESS(MX53_AIPS1_BASE_ADDR));
|
||||
imx_set_aips(MX53_IO_ADDRESS(MX53_AIPS2_BASE_ADDR));
|
||||
|
||||
/* i.mx53 has the i.mx31 type audmux */
|
||||
platform_device_register_simple("imx31-audmux", 0, imx53_audmux_res,
|
||||
ARRAY_SIZE(imx53_audmux_res));
|
||||
}
|
||||
|
||||
void __init imx51_init_late(void)
|
||||
{
|
||||
mx51_neon_fixup();
|
||||
|
|
|
|||
|
|
@ -1,633 +0,0 @@
|
|||
/*
|
||||
* based on code from the following
|
||||
* Copyright 2009-2010 Freescale Semiconductor, Inc. All Rights Reserved.
|
||||
* Copyright 2009-2010 Pegatron Corporation. All Rights Reserved.
|
||||
* Copyright 2009-2010 Genesi USA, Inc. All Rights Reserved.
|
||||
*
|
||||
* The code contained herein is licensed under the GNU General Public
|
||||
* License. You may obtain a copy of the GNU General Public License
|
||||
* Version 2 or later at the following locations:
|
||||
*
|
||||
* http://www.opensource.org/licenses/gpl-license.html
|
||||
* http://www.gnu.org/copyleft/gpl.html
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/spi/flash.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/mfd/mc13892.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
|
||||
#include <mach/common.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/iomux-mx51.h>
|
||||
|
||||
#include <linux/usb/otg.h>
|
||||
#include <linux/usb/ulpi.h>
|
||||
#include <mach/ulpi.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/time.h>
|
||||
|
||||
#include "devices-imx51.h"
|
||||
#include "efika.h"
|
||||
#include "cpu_op-mx51.h"
|
||||
|
||||
#define MX51_USB_CTRL_1_OFFSET 0x10
|
||||
#define MX51_USB_CTRL_UH1_EXT_CLK_EN (1 << 25)
|
||||
#define MX51_USB_PLL_DIV_19_2_MHZ 0x01
|
||||
|
||||
#define EFIKAMX_USB_HUB_RESET IMX_GPIO_NR(1, 5)
|
||||
#define EFIKAMX_USBH1_STP IMX_GPIO_NR(1, 27)
|
||||
|
||||
#define EFIKAMX_SPI_CS0 IMX_GPIO_NR(4, 24)
|
||||
#define EFIKAMX_SPI_CS1 IMX_GPIO_NR(4, 25)
|
||||
|
||||
#define EFIKAMX_PMIC IMX_GPIO_NR(1, 6)
|
||||
|
||||
static iomux_v3_cfg_t mx51efika_pads[] = {
|
||||
/* UART1 */
|
||||
MX51_PAD_UART1_RXD__UART1_RXD,
|
||||
MX51_PAD_UART1_TXD__UART1_TXD,
|
||||
MX51_PAD_UART1_RTS__UART1_RTS,
|
||||
MX51_PAD_UART1_CTS__UART1_CTS,
|
||||
|
||||
/* SD 1 */
|
||||
MX51_PAD_SD1_CMD__SD1_CMD,
|
||||
MX51_PAD_SD1_CLK__SD1_CLK,
|
||||
MX51_PAD_SD1_DATA0__SD1_DATA0,
|
||||
MX51_PAD_SD1_DATA1__SD1_DATA1,
|
||||
MX51_PAD_SD1_DATA2__SD1_DATA2,
|
||||
MX51_PAD_SD1_DATA3__SD1_DATA3,
|
||||
|
||||
/* SD 2 */
|
||||
MX51_PAD_SD2_CMD__SD2_CMD,
|
||||
MX51_PAD_SD2_CLK__SD2_CLK,
|
||||
MX51_PAD_SD2_DATA0__SD2_DATA0,
|
||||
MX51_PAD_SD2_DATA1__SD2_DATA1,
|
||||
MX51_PAD_SD2_DATA2__SD2_DATA2,
|
||||
MX51_PAD_SD2_DATA3__SD2_DATA3,
|
||||
|
||||
/* SD/MMC WP/CD */
|
||||
MX51_PAD_GPIO1_0__SD1_CD,
|
||||
MX51_PAD_GPIO1_1__SD1_WP,
|
||||
MX51_PAD_GPIO1_7__SD2_WP,
|
||||
MX51_PAD_GPIO1_8__SD2_CD,
|
||||
|
||||
/* spi */
|
||||
MX51_PAD_CSPI1_MOSI__ECSPI1_MOSI,
|
||||
MX51_PAD_CSPI1_MISO__ECSPI1_MISO,
|
||||
MX51_PAD_CSPI1_SS0__GPIO4_24,
|
||||
MX51_PAD_CSPI1_SS1__GPIO4_25,
|
||||
MX51_PAD_CSPI1_RDY__ECSPI1_RDY,
|
||||
MX51_PAD_CSPI1_SCLK__ECSPI1_SCLK,
|
||||
MX51_PAD_GPIO1_6__GPIO1_6,
|
||||
|
||||
/* USB HOST1 */
|
||||
MX51_PAD_USBH1_CLK__USBH1_CLK,
|
||||
MX51_PAD_USBH1_DIR__USBH1_DIR,
|
||||
MX51_PAD_USBH1_NXT__USBH1_NXT,
|
||||
MX51_PAD_USBH1_DATA0__USBH1_DATA0,
|
||||
MX51_PAD_USBH1_DATA1__USBH1_DATA1,
|
||||
MX51_PAD_USBH1_DATA2__USBH1_DATA2,
|
||||
MX51_PAD_USBH1_DATA3__USBH1_DATA3,
|
||||
MX51_PAD_USBH1_DATA4__USBH1_DATA4,
|
||||
MX51_PAD_USBH1_DATA5__USBH1_DATA5,
|
||||
MX51_PAD_USBH1_DATA6__USBH1_DATA6,
|
||||
MX51_PAD_USBH1_DATA7__USBH1_DATA7,
|
||||
|
||||
/* USB HUB RESET */
|
||||
MX51_PAD_GPIO1_5__GPIO1_5,
|
||||
|
||||
/* WLAN */
|
||||
MX51_PAD_EIM_A22__GPIO2_16,
|
||||
MX51_PAD_EIM_A16__GPIO2_10,
|
||||
|
||||
/* USB PHY RESET */
|
||||
MX51_PAD_EIM_D27__GPIO2_9,
|
||||
};
|
||||
|
||||
/* Serial ports */
|
||||
static const struct imxuart_platform_data uart_pdata = {
|
||||
.flags = IMXUART_HAVE_RTSCTS,
|
||||
};
|
||||
|
||||
/* This function is board specific as the bit mask for the plldiv will also
|
||||
* be different for other Freescale SoCs, thus a common bitmask is not
|
||||
* possible and cannot get place in /plat-mxc/ehci.c.
|
||||
*/
|
||||
static int initialize_otg_port(struct platform_device *pdev)
|
||||
{
|
||||
u32 v;
|
||||
void __iomem *usb_base;
|
||||
void __iomem *usbother_base;
|
||||
usb_base = ioremap(MX51_USB_OTG_BASE_ADDR, SZ_4K);
|
||||
if (!usb_base)
|
||||
return -ENOMEM;
|
||||
usbother_base = (void __iomem *)(usb_base + MX5_USBOTHER_REGS_OFFSET);
|
||||
|
||||
/* Set the PHY clock to 19.2MHz */
|
||||
v = __raw_readl(usbother_base + MXC_USB_PHY_CTR_FUNC2_OFFSET);
|
||||
v &= ~MX5_USB_UTMI_PHYCTRL1_PLLDIV_MASK;
|
||||
v |= MX51_USB_PLL_DIV_19_2_MHZ;
|
||||
__raw_writel(v, usbother_base + MXC_USB_PHY_CTR_FUNC2_OFFSET);
|
||||
iounmap(usb_base);
|
||||
|
||||
mdelay(10);
|
||||
|
||||
return mx51_initialize_usb_hw(pdev->id, MXC_EHCI_INTERNAL_PHY);
|
||||
}
|
||||
|
||||
static const struct mxc_usbh_platform_data dr_utmi_config __initconst = {
|
||||
.init = initialize_otg_port,
|
||||
.portsc = MXC_EHCI_UTMI_16BIT,
|
||||
};
|
||||
|
||||
static int initialize_usbh1_port(struct platform_device *pdev)
|
||||
{
|
||||
iomux_v3_cfg_t usbh1stp = MX51_PAD_USBH1_STP__USBH1_STP;
|
||||
iomux_v3_cfg_t usbh1gpio = MX51_PAD_USBH1_STP__GPIO1_27;
|
||||
u32 v;
|
||||
void __iomem *usb_base;
|
||||
void __iomem *socregs_base;
|
||||
|
||||
mxc_iomux_v3_setup_pad(usbh1gpio);
|
||||
gpio_request(EFIKAMX_USBH1_STP, "usbh1_stp");
|
||||
gpio_direction_output(EFIKAMX_USBH1_STP, 0);
|
||||
msleep(1);
|
||||
gpio_set_value(EFIKAMX_USBH1_STP, 1);
|
||||
msleep(1);
|
||||
|
||||
usb_base = ioremap(MX51_USB_OTG_BASE_ADDR, SZ_4K);
|
||||
socregs_base = (void __iomem *)(usb_base + MX5_USBOTHER_REGS_OFFSET);
|
||||
|
||||
/* The clock for the USBH1 ULPI port will come externally */
|
||||
/* from the PHY. */
|
||||
v = __raw_readl(socregs_base + MX51_USB_CTRL_1_OFFSET);
|
||||
__raw_writel(v | MX51_USB_CTRL_UH1_EXT_CLK_EN,
|
||||
socregs_base + MX51_USB_CTRL_1_OFFSET);
|
||||
|
||||
iounmap(usb_base);
|
||||
|
||||
gpio_free(EFIKAMX_USBH1_STP);
|
||||
mxc_iomux_v3_setup_pad(usbh1stp);
|
||||
|
||||
mdelay(10);
|
||||
|
||||
return mx51_initialize_usb_hw(pdev->id, MXC_EHCI_ITC_NO_THRESHOLD);
|
||||
}
|
||||
|
||||
static struct mxc_usbh_platform_data usbh1_config __initdata = {
|
||||
.init = initialize_usbh1_port,
|
||||
.portsc = MXC_EHCI_MODE_ULPI,
|
||||
};
|
||||
|
||||
static void mx51_efika_hubreset(void)
|
||||
{
|
||||
gpio_request(EFIKAMX_USB_HUB_RESET, "usb_hub_rst");
|
||||
gpio_direction_output(EFIKAMX_USB_HUB_RESET, 1);
|
||||
msleep(1);
|
||||
gpio_set_value(EFIKAMX_USB_HUB_RESET, 0);
|
||||
msleep(1);
|
||||
gpio_set_value(EFIKAMX_USB_HUB_RESET, 1);
|
||||
}
|
||||
|
||||
static void __init mx51_efika_usb(void)
|
||||
{
|
||||
mx51_efika_hubreset();
|
||||
|
||||
/* pulling it low, means no USB at all... */
|
||||
gpio_request(EFIKA_USB_PHY_RESET, "usb_phy_reset");
|
||||
gpio_direction_output(EFIKA_USB_PHY_RESET, 0);
|
||||
msleep(1);
|
||||
gpio_set_value(EFIKA_USB_PHY_RESET, 1);
|
||||
|
||||
usbh1_config.otg = imx_otg_ulpi_create(ULPI_OTG_DRVVBUS |
|
||||
ULPI_OTG_DRVVBUS_EXT | ULPI_OTG_EXTVBUSIND);
|
||||
|
||||
imx51_add_mxc_ehci_otg(&dr_utmi_config);
|
||||
if (usbh1_config.otg)
|
||||
imx51_add_mxc_ehci_hs(1, &usbh1_config);
|
||||
}
|
||||
|
||||
static struct mtd_partition mx51_efika_spi_nor_partitions[] = {
|
||||
{
|
||||
.name = "u-boot",
|
||||
.offset = 0,
|
||||
.size = SZ_256K,
|
||||
},
|
||||
{
|
||||
.name = "config",
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.size = SZ_64K,
|
||||
},
|
||||
};
|
||||
|
||||
static struct flash_platform_data mx51_efika_spi_flash_data = {
|
||||
.name = "spi_flash",
|
||||
.parts = mx51_efika_spi_nor_partitions,
|
||||
.nr_parts = ARRAY_SIZE(mx51_efika_spi_nor_partitions),
|
||||
.type = "sst25vf032b",
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply sw1_consumers[] = {
|
||||
{
|
||||
.supply = "cpu_vcc",
|
||||
}
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply vdig_consumers[] = {
|
||||
/* sgtl5000 */
|
||||
REGULATOR_SUPPLY("VDDA", "1-000a"),
|
||||
REGULATOR_SUPPLY("VDDD", "1-000a"),
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply vvideo_consumers[] = {
|
||||
/* sgtl5000 */
|
||||
REGULATOR_SUPPLY("VDDIO", "1-000a"),
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply vsd_consumers[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "sdhci-esdhc-imx51.0"),
|
||||
REGULATOR_SUPPLY("vmmc", "sdhci-esdhc-imx51.1"),
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply pwgt1_consumer[] = {
|
||||
{
|
||||
.supply = "pwgt1",
|
||||
}
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply pwgt2_consumer[] = {
|
||||
{
|
||||
.supply = "pwgt2",
|
||||
}
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply coincell_consumer[] = {
|
||||
{
|
||||
.supply = "coincell",
|
||||
}
|
||||
};
|
||||
|
||||
static struct regulator_init_data sw1_init = {
|
||||
.constraints = {
|
||||
.name = "SW1",
|
||||
.min_uV = 600000,
|
||||
.max_uV = 1375000,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
|
||||
.valid_modes_mask = 0,
|
||||
.always_on = 1,
|
||||
.boot_on = 1,
|
||||
.state_mem = {
|
||||
.uV = 850000,
|
||||
.mode = REGULATOR_MODE_NORMAL,
|
||||
.enabled = 1,
|
||||
},
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(sw1_consumers),
|
||||
.consumer_supplies = sw1_consumers,
|
||||
};
|
||||
|
||||
static struct regulator_init_data sw2_init = {
|
||||
.constraints = {
|
||||
.name = "SW2",
|
||||
.min_uV = 900000,
|
||||
.max_uV = 1850000,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
|
||||
.always_on = 1,
|
||||
.boot_on = 1,
|
||||
.state_mem = {
|
||||
.uV = 950000,
|
||||
.mode = REGULATOR_MODE_NORMAL,
|
||||
.enabled = 1,
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
static struct regulator_init_data sw3_init = {
|
||||
.constraints = {
|
||||
.name = "SW3",
|
||||
.min_uV = 1100000,
|
||||
.max_uV = 1850000,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
|
||||
.always_on = 1,
|
||||
.boot_on = 1,
|
||||
}
|
||||
};
|
||||
|
||||
static struct regulator_init_data sw4_init = {
|
||||
.constraints = {
|
||||
.name = "SW4",
|
||||
.min_uV = 1100000,
|
||||
.max_uV = 1850000,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
|
||||
.always_on = 1,
|
||||
.boot_on = 1,
|
||||
}
|
||||
};
|
||||
|
||||
static struct regulator_init_data viohi_init = {
|
||||
.constraints = {
|
||||
.name = "VIOHI",
|
||||
.boot_on = 1,
|
||||
.always_on = 1,
|
||||
}
|
||||
};
|
||||
|
||||
static struct regulator_init_data vusb_init = {
|
||||
.constraints = {
|
||||
.name = "VUSB",
|
||||
.boot_on = 1,
|
||||
.always_on = 1,
|
||||
}
|
||||
};
|
||||
|
||||
static struct regulator_init_data swbst_init = {
|
||||
.constraints = {
|
||||
.name = "SWBST",
|
||||
}
|
||||
};
|
||||
|
||||
static struct regulator_init_data vdig_init = {
|
||||
.constraints = {
|
||||
.name = "VDIG",
|
||||
.min_uV = 1050000,
|
||||
.max_uV = 1800000,
|
||||
.valid_ops_mask =
|
||||
REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS,
|
||||
.boot_on = 1,
|
||||
.always_on = 1,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(vdig_consumers),
|
||||
.consumer_supplies = vdig_consumers,
|
||||
};
|
||||
|
||||
static struct regulator_init_data vpll_init = {
|
||||
.constraints = {
|
||||
.name = "VPLL",
|
||||
.min_uV = 1050000,
|
||||
.max_uV = 1800000,
|
||||
.valid_ops_mask =
|
||||
REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS,
|
||||
.boot_on = 1,
|
||||
.always_on = 1,
|
||||
}
|
||||
};
|
||||
|
||||
static struct regulator_init_data vusb2_init = {
|
||||
.constraints = {
|
||||
.name = "VUSB2",
|
||||
.min_uV = 2400000,
|
||||
.max_uV = 2775000,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
|
||||
.boot_on = 1,
|
||||
.always_on = 1,
|
||||
}
|
||||
};
|
||||
|
||||
static struct regulator_init_data vvideo_init = {
|
||||
.constraints = {
|
||||
.name = "VVIDEO",
|
||||
.min_uV = 2775000,
|
||||
.max_uV = 2775000,
|
||||
.valid_ops_mask =
|
||||
REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS,
|
||||
.boot_on = 1,
|
||||
.apply_uV = 1,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(vvideo_consumers),
|
||||
.consumer_supplies = vvideo_consumers,
|
||||
};
|
||||
|
||||
static struct regulator_init_data vaudio_init = {
|
||||
.constraints = {
|
||||
.name = "VAUDIO",
|
||||
.min_uV = 2300000,
|
||||
.max_uV = 3000000,
|
||||
.valid_ops_mask =
|
||||
REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS,
|
||||
.boot_on = 1,
|
||||
}
|
||||
};
|
||||
|
||||
static struct regulator_init_data vsd_init = {
|
||||
.constraints = {
|
||||
.name = "VSD",
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 3150000,
|
||||
.valid_ops_mask =
|
||||
REGULATOR_CHANGE_VOLTAGE,
|
||||
.boot_on = 1,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(vsd_consumers),
|
||||
.consumer_supplies = vsd_consumers,
|
||||
};
|
||||
|
||||
static struct regulator_init_data vcam_init = {
|
||||
.constraints = {
|
||||
.name = "VCAM",
|
||||
.min_uV = 2500000,
|
||||
.max_uV = 3000000,
|
||||
.valid_ops_mask =
|
||||
REGULATOR_CHANGE_VOLTAGE |
|
||||
REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_STATUS,
|
||||
.valid_modes_mask = REGULATOR_MODE_FAST | REGULATOR_MODE_NORMAL,
|
||||
.boot_on = 1,
|
||||
}
|
||||
};
|
||||
|
||||
static struct regulator_init_data vgen1_init = {
|
||||
.constraints = {
|
||||
.name = "VGEN1",
|
||||
.min_uV = 1200000,
|
||||
.max_uV = 3150000,
|
||||
.valid_ops_mask =
|
||||
REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS,
|
||||
.boot_on = 1,
|
||||
.always_on = 1,
|
||||
}
|
||||
};
|
||||
|
||||
static struct regulator_init_data vgen2_init = {
|
||||
.constraints = {
|
||||
.name = "VGEN2",
|
||||
.min_uV = 1200000,
|
||||
.max_uV = 3150000,
|
||||
.valid_ops_mask =
|
||||
REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS,
|
||||
.boot_on = 1,
|
||||
.always_on = 1,
|
||||
}
|
||||
};
|
||||
|
||||
static struct regulator_init_data vgen3_init = {
|
||||
.constraints = {
|
||||
.name = "VGEN3",
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 2900000,
|
||||
.valid_ops_mask =
|
||||
REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS,
|
||||
.boot_on = 1,
|
||||
.always_on = 1,
|
||||
}
|
||||
};
|
||||
|
||||
static struct regulator_init_data gpo1_init = {
|
||||
.constraints = {
|
||||
.name = "GPO1",
|
||||
}
|
||||
};
|
||||
|
||||
static struct regulator_init_data gpo2_init = {
|
||||
.constraints = {
|
||||
.name = "GPO2",
|
||||
}
|
||||
};
|
||||
|
||||
static struct regulator_init_data gpo3_init = {
|
||||
.constraints = {
|
||||
.name = "GPO3",
|
||||
}
|
||||
};
|
||||
|
||||
static struct regulator_init_data gpo4_init = {
|
||||
.constraints = {
|
||||
.name = "GPO4",
|
||||
}
|
||||
};
|
||||
|
||||
static struct regulator_init_data pwgt1_init = {
|
||||
.constraints = {
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
.boot_on = 1,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(pwgt1_consumer),
|
||||
.consumer_supplies = pwgt1_consumer,
|
||||
};
|
||||
|
||||
static struct regulator_init_data pwgt2_init = {
|
||||
.constraints = {
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
.boot_on = 1,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(pwgt2_consumer),
|
||||
.consumer_supplies = pwgt2_consumer,
|
||||
};
|
||||
|
||||
static struct regulator_init_data vcoincell_init = {
|
||||
.constraints = {
|
||||
.name = "COINCELL",
|
||||
.min_uV = 3000000,
|
||||
.max_uV = 3000000,
|
||||
.valid_ops_mask =
|
||||
REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(coincell_consumer),
|
||||
.consumer_supplies = coincell_consumer,
|
||||
};
|
||||
|
||||
static struct mc13xxx_regulator_init_data mx51_efika_regulators[] = {
|
||||
{ .id = MC13892_SW1, .init_data = &sw1_init },
|
||||
{ .id = MC13892_SW2, .init_data = &sw2_init },
|
||||
{ .id = MC13892_SW3, .init_data = &sw3_init },
|
||||
{ .id = MC13892_SW4, .init_data = &sw4_init },
|
||||
{ .id = MC13892_SWBST, .init_data = &swbst_init },
|
||||
{ .id = MC13892_VIOHI, .init_data = &viohi_init },
|
||||
{ .id = MC13892_VPLL, .init_data = &vpll_init },
|
||||
{ .id = MC13892_VDIG, .init_data = &vdig_init },
|
||||
{ .id = MC13892_VSD, .init_data = &vsd_init },
|
||||
{ .id = MC13892_VUSB2, .init_data = &vusb2_init },
|
||||
{ .id = MC13892_VVIDEO, .init_data = &vvideo_init },
|
||||
{ .id = MC13892_VAUDIO, .init_data = &vaudio_init },
|
||||
{ .id = MC13892_VCAM, .init_data = &vcam_init },
|
||||
{ .id = MC13892_VGEN1, .init_data = &vgen1_init },
|
||||
{ .id = MC13892_VGEN2, .init_data = &vgen2_init },
|
||||
{ .id = MC13892_VGEN3, .init_data = &vgen3_init },
|
||||
{ .id = MC13892_VUSB, .init_data = &vusb_init },
|
||||
{ .id = MC13892_GPO1, .init_data = &gpo1_init },
|
||||
{ .id = MC13892_GPO2, .init_data = &gpo2_init },
|
||||
{ .id = MC13892_GPO3, .init_data = &gpo3_init },
|
||||
{ .id = MC13892_GPO4, .init_data = &gpo4_init },
|
||||
{ .id = MC13892_PWGT1SPI, .init_data = &pwgt1_init },
|
||||
{ .id = MC13892_PWGT2SPI, .init_data = &pwgt2_init },
|
||||
{ .id = MC13892_VCOINCELL, .init_data = &vcoincell_init },
|
||||
};
|
||||
|
||||
static struct mc13xxx_platform_data mx51_efika_mc13892_data = {
|
||||
.flags = MC13XXX_USE_RTC,
|
||||
.regulators = {
|
||||
.num_regulators = ARRAY_SIZE(mx51_efika_regulators),
|
||||
.regulators = mx51_efika_regulators,
|
||||
},
|
||||
};
|
||||
|
||||
static struct spi_board_info mx51_efika_spi_board_info[] __initdata = {
|
||||
{
|
||||
.modalias = "m25p80",
|
||||
.max_speed_hz = 25000000,
|
||||
.bus_num = 0,
|
||||
.chip_select = 1,
|
||||
.platform_data = &mx51_efika_spi_flash_data,
|
||||
.irq = -1,
|
||||
},
|
||||
{
|
||||
.modalias = "mc13892",
|
||||
.max_speed_hz = 1000000,
|
||||
.bus_num = 0,
|
||||
.chip_select = 0,
|
||||
.platform_data = &mx51_efika_mc13892_data,
|
||||
/* irq number is run-time assigned */
|
||||
},
|
||||
};
|
||||
|
||||
static int mx51_efika_spi_cs[] = {
|
||||
EFIKAMX_SPI_CS0,
|
||||
EFIKAMX_SPI_CS1,
|
||||
};
|
||||
|
||||
static const struct spi_imx_master mx51_efika_spi_pdata __initconst = {
|
||||
.chipselect = mx51_efika_spi_cs,
|
||||
.num_chipselect = ARRAY_SIZE(mx51_efika_spi_cs),
|
||||
};
|
||||
|
||||
void __init efika_board_common_init(void)
|
||||
{
|
||||
mxc_iomux_v3_setup_multiple_pads(mx51efika_pads,
|
||||
ARRAY_SIZE(mx51efika_pads));
|
||||
imx51_add_imx_uart(0, &uart_pdata);
|
||||
mx51_efika_usb();
|
||||
|
||||
/* FIXME: comes from original code. check this. */
|
||||
if (mx51_revision() < IMX_CHIP_REVISION_2_0)
|
||||
sw2_init.constraints.state_mem.uV = 1100000;
|
||||
else if (mx51_revision() == IMX_CHIP_REVISION_2_0) {
|
||||
sw2_init.constraints.state_mem.uV = 1250000;
|
||||
sw1_init.constraints.state_mem.uV = 1000000;
|
||||
}
|
||||
if (machine_is_mx51_efikasb())
|
||||
vgen1_init.constraints.max_uV = 1200000;
|
||||
|
||||
gpio_request(EFIKAMX_PMIC, "pmic irq");
|
||||
gpio_direction_input(EFIKAMX_PMIC);
|
||||
mx51_efika_spi_board_info[1].irq = gpio_to_irq(EFIKAMX_PMIC);
|
||||
spi_register_board_info(mx51_efika_spi_board_info,
|
||||
ARRAY_SIZE(mx51_efika_spi_board_info));
|
||||
imx51_add_ecspi(0, &mx51_efika_spi_pdata);
|
||||
|
||||
imx51_add_pata_imx();
|
||||
|
||||
#if defined(CONFIG_CPU_FREQ_IMX)
|
||||
get_cpu_op = mx51_get_cpu_op;
|
||||
#endif
|
||||
}
|
||||
|
|
@ -231,8 +231,6 @@ void __sync_icache_dcache(pte_t pteval)
|
|||
struct page *page;
|
||||
struct address_space *mapping;
|
||||
|
||||
if (!pte_present_user(pteval))
|
||||
return;
|
||||
if (cache_is_vipt_nonaliasing() && !pte_exec(pteval))
|
||||
/* only flush non-aliasing VIPT caches for exec mappings */
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -38,10 +38,10 @@ ENTRY(v7wbi_flush_user_tlb_range)
|
|||
dsb
|
||||
mov r0, r0, lsr #PAGE_SHIFT @ align address
|
||||
mov r1, r1, lsr #PAGE_SHIFT
|
||||
#ifdef CONFIG_ARM_ERRATA_720789
|
||||
mov r3, #0
|
||||
#else
|
||||
asid r3, r3 @ mask ASID
|
||||
#ifdef CONFIG_ARM_ERRATA_720789
|
||||
ALT_SMP(W(mov) r3, #0 )
|
||||
ALT_UP(W(nop) )
|
||||
#endif
|
||||
orr r0, r3, r0, lsl #PAGE_SHIFT @ Create initial MVA
|
||||
mov r1, r1, lsl #PAGE_SHIFT
|
||||
|
|
|
|||
|
|
@ -52,7 +52,6 @@ extern void imx31_soc_init(void);
|
|||
extern void imx35_soc_init(void);
|
||||
extern void imx50_soc_init(void);
|
||||
extern void imx51_soc_init(void);
|
||||
extern void imx53_soc_init(void);
|
||||
extern void imx51_init_late(void);
|
||||
extern void imx53_init_late(void);
|
||||
extern void epit_timer_init(void __iomem *base, int irq);
|
||||
|
|
@ -137,11 +136,6 @@ extern void imx_src_prepare_restart(void);
|
|||
extern void imx_gpc_init(void);
|
||||
extern void imx_gpc_pre_suspend(void);
|
||||
extern void imx_gpc_post_resume(void);
|
||||
extern void imx51_babbage_common_init(void);
|
||||
extern void imx53_ard_common_init(void);
|
||||
extern void imx53_evk_common_init(void);
|
||||
extern void imx53_qsb_common_init(void);
|
||||
extern void imx53_smd_common_init(void);
|
||||
extern int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode);
|
||||
extern void imx6q_clock_map_io(void);
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -719,8 +719,10 @@ static int __init vfp_init(void)
|
|||
if ((fmrx(MVFR1) & 0x000fff00) == 0x00011100)
|
||||
elf_hwcap |= HWCAP_NEON;
|
||||
#endif
|
||||
#ifdef CONFIG_VFPv3
|
||||
if ((fmrx(MVFR1) & 0xf0000000) == 0x10000000)
|
||||
elf_hwcap |= HWCAP_VFPv4;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@
|
|||
config C6X
|
||||
def_bool y
|
||||
select CLKDEV_LOOKUP
|
||||
select GENERIC_ATOMIC64
|
||||
select GENERIC_IRQ_SHOW
|
||||
select HAVE_ARCH_TRACEHOOK
|
||||
select HAVE_DMA_API_DEBUG
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Port on Texas Instruments TMS320C6x architecture
|
||||
*
|
||||
* Copyright (C) 2005, 2006, 2009, 2010 Texas Instruments Incorporated
|
||||
* Copyright (C) 2005, 2006, 2009, 2010, 2012 Texas Instruments Incorporated
|
||||
* Author: Aurelien Jacquiot (aurelien.jacquiot@jaluna.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
|
@ -16,9 +16,14 @@
|
|||
/*
|
||||
* Cache line size
|
||||
*/
|
||||
#define L1D_CACHE_BYTES 64
|
||||
#define L1P_CACHE_BYTES 32
|
||||
#define L2_CACHE_BYTES 128
|
||||
#define L1D_CACHE_SHIFT 6
|
||||
#define L1D_CACHE_BYTES (1 << L1D_CACHE_SHIFT)
|
||||
|
||||
#define L1P_CACHE_SHIFT 5
|
||||
#define L1P_CACHE_BYTES (1 << L1P_CACHE_SHIFT)
|
||||
|
||||
#define L2_CACHE_SHIFT 7
|
||||
#define L2_CACHE_BYTES (1 << L2_CACHE_SHIFT)
|
||||
|
||||
/*
|
||||
* L2 used as cache
|
||||
|
|
@ -29,7 +34,8 @@
|
|||
* For practical reasons the L1_CACHE_BYTES defines should not be smaller than
|
||||
* the L2 line size
|
||||
*/
|
||||
#define L1_CACHE_BYTES L2_CACHE_BYTES
|
||||
#define L1_CACHE_SHIFT L2_CACHE_SHIFT
|
||||
#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT)
|
||||
|
||||
#define L2_CACHE_ALIGN_LOW(x) \
|
||||
(((x) & ~(L2_CACHE_BYTES - 1)))
|
||||
|
|
|
|||
|
|
@ -234,5 +234,4 @@ CONFIG_CRYPTO_PCBC=m
|
|||
CONFIG_CRYPTO_MD5=y
|
||||
# CONFIG_CRYPTO_ANSI_CPRNG is not set
|
||||
CONFIG_CRC_T10DIF=y
|
||||
CONFIG_MISC_DEVICES=y
|
||||
CONFIG_INTEL_IOMMU=y
|
||||
|
|
|
|||
|
|
@ -209,4 +209,3 @@ CONFIG_MAGIC_SYSRQ=y
|
|||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_DEBUG_MUTEXES=y
|
||||
CONFIG_CRYPTO_MD5=y
|
||||
CONFIG_MISC_DEVICES=y
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ config M68K
|
|||
select HAVE_AOUT if MMU
|
||||
select HAVE_GENERIC_HARDIRQS
|
||||
select GENERIC_IRQ_SHOW
|
||||
select GENERIC_ATOMIC64
|
||||
select ARCH_HAVE_NMI_SAFE_CMPXCHG if RMW_INSNS
|
||||
select GENERIC_CPU_DEVICES
|
||||
select GENERIC_STRNCPY_FROM_USER if MMU
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ config COLDFIRE
|
|||
select CPU_HAS_NO_BITFIELDS
|
||||
select CPU_HAS_NO_MULDIV64
|
||||
select GENERIC_CSUM
|
||||
select HAVE_CLK
|
||||
|
||||
endchoice
|
||||
|
||||
|
|
@ -58,7 +59,6 @@ config MCPU32
|
|||
config M68020
|
||||
bool "68020 support"
|
||||
depends on MMU
|
||||
select GENERIC_ATOMIC64
|
||||
select CPU_HAS_ADDRESS_SPACES
|
||||
help
|
||||
If you anticipate running this kernel on a computer with a MC68020
|
||||
|
|
@ -69,7 +69,6 @@ config M68020
|
|||
config M68030
|
||||
bool "68030 support"
|
||||
depends on MMU && !MMU_SUN3
|
||||
select GENERIC_ATOMIC64
|
||||
select CPU_HAS_ADDRESS_SPACES
|
||||
help
|
||||
If you anticipate running this kernel on a computer with a MC68030
|
||||
|
|
@ -79,7 +78,6 @@ config M68030
|
|||
config M68040
|
||||
bool "68040 support"
|
||||
depends on MMU && !MMU_SUN3
|
||||
select GENERIC_ATOMIC64
|
||||
select CPU_HAS_ADDRESS_SPACES
|
||||
help
|
||||
If you anticipate running this kernel on a computer with a MC68LC040
|
||||
|
|
@ -90,7 +88,6 @@ config M68040
|
|||
config M68060
|
||||
bool "68060 support"
|
||||
depends on MMU && !MMU_SUN3
|
||||
select GENERIC_ATOMIC64
|
||||
select CPU_HAS_ADDRESS_SPACES
|
||||
help
|
||||
If you anticipate running this kernel on a computer with a MC68060
|
||||
|
|
|
|||
|
|
@ -27,6 +27,10 @@ ifeq ($(CONFIG_X86_32),y)
|
|||
|
||||
KBUILD_CFLAGS += -msoft-float -mregparm=3 -freg-struct-return
|
||||
|
||||
# Never want PIC in a 32-bit kernel, prevent breakage with GCC built
|
||||
# with nonstandard options
|
||||
KBUILD_CFLAGS += -fno-pic
|
||||
|
||||
# prevent gcc from keeping the stack 16 byte aligned
|
||||
KBUILD_CFLAGS += $(call cc-option,-mpreferred-stack-boundary=2)
|
||||
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ KBUILD_CFLAGS := $(LINUXINCLUDE) -g -Os -D_SETUP -D__KERNEL__ \
|
|||
-Wall -Wstrict-prototypes \
|
||||
-march=i386 -mregparm=3 \
|
||||
-include $(srctree)/$(src)/code16gcc.h \
|
||||
-fno-strict-aliasing -fomit-frame-pointer \
|
||||
-fno-strict-aliasing -fomit-frame-pointer -fno-pic \
|
||||
$(call cc-option, -ffreestanding) \
|
||||
$(call cc-option, -fno-toplevel-reorder,\
|
||||
$(call cc-option, -fno-unit-at-a-time)) \
|
||||
|
|
|
|||
|
|
@ -1356,6 +1356,16 @@ static void setup_ioapic_irq(unsigned int irq, struct irq_cfg *cfg,
|
|||
if (!IO_APIC_IRQ(irq))
|
||||
return;
|
||||
|
||||
/*
|
||||
* For legacy irqs, cfg->domain starts with cpu 0. Now that IO-APIC
|
||||
* can handle this irq and the apic driver is finialized at this point,
|
||||
* update the cfg->domain.
|
||||
*/
|
||||
if (irq < legacy_pic->nr_legacy_irqs &&
|
||||
cpumask_equal(cfg->domain, cpumask_of(0)))
|
||||
apic->vector_allocation_domain(0, cfg->domain,
|
||||
apic->target_cpus());
|
||||
|
||||
if (assign_irq_vector(irq, cfg, apic->target_cpus()))
|
||||
return;
|
||||
|
||||
|
|
|
|||
|
|
@ -144,6 +144,8 @@ static int __init x86_xsave_setup(char *s)
|
|||
{
|
||||
setup_clear_cpu_cap(X86_FEATURE_XSAVE);
|
||||
setup_clear_cpu_cap(X86_FEATURE_XSAVEOPT);
|
||||
setup_clear_cpu_cap(X86_FEATURE_AVX);
|
||||
setup_clear_cpu_cap(X86_FEATURE_AVX2);
|
||||
return 1;
|
||||
}
|
||||
__setup("noxsave", x86_xsave_setup);
|
||||
|
|
|
|||
|
|
@ -1522,8 +1522,16 @@ static struct perf_guest_switch_msr *intel_guest_get_msrs(int *nr)
|
|||
arr[0].msr = MSR_CORE_PERF_GLOBAL_CTRL;
|
||||
arr[0].host = x86_pmu.intel_ctrl & ~cpuc->intel_ctrl_guest_mask;
|
||||
arr[0].guest = x86_pmu.intel_ctrl & ~cpuc->intel_ctrl_host_mask;
|
||||
/*
|
||||
* If PMU counter has PEBS enabled it is not enough to disable counter
|
||||
* on a guest entry since PEBS memory write can overshoot guest entry
|
||||
* and corrupt guest memory. Disabling PEBS solves the problem.
|
||||
*/
|
||||
arr[1].msr = MSR_IA32_PEBS_ENABLE;
|
||||
arr[1].host = cpuc->pebs_enabled;
|
||||
arr[1].guest = 0;
|
||||
|
||||
*nr = 1;
|
||||
*nr = 2;
|
||||
return arr;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -796,7 +796,6 @@ static struct intel_uncore_type *nhm_msr_uncores[] = {
|
|||
|
||||
DEFINE_UNCORE_FORMAT_ATTR(event5, event, "config:1-5");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(counter, counter, "config:6-7");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(mm_cfg, mm_cfg, "config:63");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(match, match, "config1:0-63");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(mask, mask, "config2:0-63");
|
||||
|
||||
|
|
@ -902,16 +901,21 @@ static struct attribute_group nhmex_uncore_cbox_format_group = {
|
|||
.attrs = nhmex_uncore_cbox_formats_attr,
|
||||
};
|
||||
|
||||
/* msr offset for each instance of cbox */
|
||||
static unsigned nhmex_cbox_msr_offsets[] = {
|
||||
0x0, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x240, 0x2c0,
|
||||
};
|
||||
|
||||
static struct intel_uncore_type nhmex_uncore_cbox = {
|
||||
.name = "cbox",
|
||||
.num_counters = 6,
|
||||
.num_boxes = 8,
|
||||
.num_boxes = 10,
|
||||
.perf_ctr_bits = 48,
|
||||
.event_ctl = NHMEX_C0_MSR_PMON_EV_SEL0,
|
||||
.perf_ctr = NHMEX_C0_MSR_PMON_CTR0,
|
||||
.event_mask = NHMEX_PMON_RAW_EVENT_MASK,
|
||||
.box_ctl = NHMEX_C0_MSR_PMON_GLOBAL_CTL,
|
||||
.msr_offset = NHMEX_C_MSR_OFFSET,
|
||||
.msr_offsets = nhmex_cbox_msr_offsets,
|
||||
.pair_ctr_ctl = 1,
|
||||
.ops = &nhmex_uncore_ops,
|
||||
.format_group = &nhmex_uncore_cbox_format_group
|
||||
|
|
@ -1032,24 +1036,22 @@ static struct intel_uncore_type nhmex_uncore_bbox = {
|
|||
|
||||
static int nhmex_sbox_hw_config(struct intel_uncore_box *box, struct perf_event *event)
|
||||
{
|
||||
struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
|
||||
struct hw_perf_event_extra *reg2 = &event->hw.branch_reg;
|
||||
struct hw_perf_event *hwc = &event->hw;
|
||||
struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
|
||||
struct hw_perf_event_extra *reg2 = &hwc->branch_reg;
|
||||
|
||||
if (event->attr.config & NHMEX_S_PMON_MM_CFG_EN) {
|
||||
reg1->config = event->attr.config1;
|
||||
reg2->config = event->attr.config2;
|
||||
} else {
|
||||
reg1->config = ~0ULL;
|
||||
reg2->config = ~0ULL;
|
||||
}
|
||||
/* only TO_R_PROG_EV event uses the match/mask register */
|
||||
if ((hwc->config & NHMEX_PMON_CTL_EV_SEL_MASK) !=
|
||||
NHMEX_S_EVENT_TO_R_PROG_EV)
|
||||
return 0;
|
||||
|
||||
if (box->pmu->pmu_idx == 0)
|
||||
reg1->reg = NHMEX_S0_MSR_MM_CFG;
|
||||
else
|
||||
reg1->reg = NHMEX_S1_MSR_MM_CFG;
|
||||
|
||||
reg1->idx = 0;
|
||||
|
||||
reg1->config = event->attr.config1;
|
||||
reg2->config = event->attr.config2;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1059,8 +1061,8 @@ static void nhmex_sbox_msr_enable_event(struct intel_uncore_box *box, struct per
|
|||
struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
|
||||
struct hw_perf_event_extra *reg2 = &hwc->branch_reg;
|
||||
|
||||
wrmsrl(reg1->reg, 0);
|
||||
if (reg1->config != ~0ULL || reg2->config != ~0ULL) {
|
||||
if (reg1->idx != EXTRA_REG_NONE) {
|
||||
wrmsrl(reg1->reg, 0);
|
||||
wrmsrl(reg1->reg + 1, reg1->config);
|
||||
wrmsrl(reg1->reg + 2, reg2->config);
|
||||
wrmsrl(reg1->reg, NHMEX_S_PMON_MM_CFG_EN);
|
||||
|
|
@ -1074,7 +1076,6 @@ static struct attribute *nhmex_uncore_sbox_formats_attr[] = {
|
|||
&format_attr_edge.attr,
|
||||
&format_attr_inv.attr,
|
||||
&format_attr_thresh8.attr,
|
||||
&format_attr_mm_cfg.attr,
|
||||
&format_attr_match.attr,
|
||||
&format_attr_mask.attr,
|
||||
NULL,
|
||||
|
|
@ -1142,6 +1143,9 @@ static struct extra_reg nhmex_uncore_mbox_extra_regs[] = {
|
|||
EVENT_EXTRA_END
|
||||
};
|
||||
|
||||
/* Nehalem-EX or Westmere-EX ? */
|
||||
bool uncore_nhmex;
|
||||
|
||||
static bool nhmex_mbox_get_shared_reg(struct intel_uncore_box *box, int idx, u64 config)
|
||||
{
|
||||
struct intel_uncore_extra_reg *er;
|
||||
|
|
@ -1171,18 +1175,29 @@ static bool nhmex_mbox_get_shared_reg(struct intel_uncore_box *box, int idx, u64
|
|||
return false;
|
||||
|
||||
/* mask of the shared fields */
|
||||
mask = NHMEX_M_PMON_ZDP_CTL_FVC_MASK;
|
||||
if (uncore_nhmex)
|
||||
mask = NHMEX_M_PMON_ZDP_CTL_FVC_MASK;
|
||||
else
|
||||
mask = WSMEX_M_PMON_ZDP_CTL_FVC_MASK;
|
||||
er = &box->shared_regs[EXTRA_REG_NHMEX_M_ZDP_CTL_FVC];
|
||||
|
||||
raw_spin_lock_irqsave(&er->lock, flags);
|
||||
/* add mask of the non-shared field if it's in use */
|
||||
if (__BITS_VALUE(atomic_read(&er->ref), idx, 8))
|
||||
mask |= NHMEX_M_PMON_ZDP_CTL_FVC_EVENT_MASK(idx);
|
||||
if (__BITS_VALUE(atomic_read(&er->ref), idx, 8)) {
|
||||
if (uncore_nhmex)
|
||||
mask |= NHMEX_M_PMON_ZDP_CTL_FVC_EVENT_MASK(idx);
|
||||
else
|
||||
mask |= WSMEX_M_PMON_ZDP_CTL_FVC_EVENT_MASK(idx);
|
||||
}
|
||||
|
||||
if (!atomic_read(&er->ref) || !((er->config ^ config) & mask)) {
|
||||
atomic_add(1 << (idx * 8), &er->ref);
|
||||
mask = NHMEX_M_PMON_ZDP_CTL_FVC_MASK |
|
||||
NHMEX_M_PMON_ZDP_CTL_FVC_EVENT_MASK(idx);
|
||||
if (uncore_nhmex)
|
||||
mask = NHMEX_M_PMON_ZDP_CTL_FVC_MASK |
|
||||
NHMEX_M_PMON_ZDP_CTL_FVC_EVENT_MASK(idx);
|
||||
else
|
||||
mask = WSMEX_M_PMON_ZDP_CTL_FVC_MASK |
|
||||
WSMEX_M_PMON_ZDP_CTL_FVC_EVENT_MASK(idx);
|
||||
er->config &= ~mask;
|
||||
er->config |= (config & mask);
|
||||
ret = true;
|
||||
|
|
@ -1216,7 +1231,10 @@ u64 nhmex_mbox_alter_er(struct perf_event *event, int new_idx, bool modify)
|
|||
|
||||
/* get the non-shared control bits and shift them */
|
||||
idx = orig_idx - EXTRA_REG_NHMEX_M_ZDP_CTL_FVC;
|
||||
config &= NHMEX_M_PMON_ZDP_CTL_FVC_EVENT_MASK(idx);
|
||||
if (uncore_nhmex)
|
||||
config &= NHMEX_M_PMON_ZDP_CTL_FVC_EVENT_MASK(idx);
|
||||
else
|
||||
config &= WSMEX_M_PMON_ZDP_CTL_FVC_EVENT_MASK(idx);
|
||||
if (new_idx > orig_idx) {
|
||||
idx = new_idx - orig_idx;
|
||||
config <<= 3 * idx;
|
||||
|
|
@ -1226,6 +1244,10 @@ u64 nhmex_mbox_alter_er(struct perf_event *event, int new_idx, bool modify)
|
|||
}
|
||||
|
||||
/* add the shared control bits back */
|
||||
if (uncore_nhmex)
|
||||
config |= NHMEX_M_PMON_ZDP_CTL_FVC_MASK & reg1->config;
|
||||
else
|
||||
config |= WSMEX_M_PMON_ZDP_CTL_FVC_MASK & reg1->config;
|
||||
config |= NHMEX_M_PMON_ZDP_CTL_FVC_MASK & reg1->config;
|
||||
if (modify) {
|
||||
/* adjust the main event selector */
|
||||
|
|
@ -1264,7 +1286,8 @@ nhmex_mbox_get_constraint(struct intel_uncore_box *box, struct perf_event *event
|
|||
}
|
||||
|
||||
/* for the match/mask registers */
|
||||
if ((uncore_box_is_fake(box) || !reg2->alloc) &&
|
||||
if (reg2->idx != EXTRA_REG_NONE &&
|
||||
(uncore_box_is_fake(box) || !reg2->alloc) &&
|
||||
!nhmex_mbox_get_shared_reg(box, reg2->idx, reg2->config))
|
||||
goto fail;
|
||||
|
||||
|
|
@ -1278,7 +1301,8 @@ nhmex_mbox_get_constraint(struct intel_uncore_box *box, struct perf_event *event
|
|||
if (idx[0] != 0xff && idx[0] != __BITS_VALUE(reg1->idx, 0, 8))
|
||||
nhmex_mbox_alter_er(event, idx[0], true);
|
||||
reg1->alloc |= alloc;
|
||||
reg2->alloc = 1;
|
||||
if (reg2->idx != EXTRA_REG_NONE)
|
||||
reg2->alloc = 1;
|
||||
}
|
||||
return NULL;
|
||||
fail:
|
||||
|
|
@ -1342,9 +1366,6 @@ static int nhmex_mbox_hw_config(struct intel_uncore_box *box, struct perf_event
|
|||
struct extra_reg *er;
|
||||
unsigned msr;
|
||||
int reg_idx = 0;
|
||||
|
||||
if (WARN_ON_ONCE(reg1->idx != -1))
|
||||
return -EINVAL;
|
||||
/*
|
||||
* The mbox events may require 2 extra MSRs at the most. But only
|
||||
* the lower 32 bits in these MSRs are significant, so we can use
|
||||
|
|
@ -1355,11 +1376,6 @@ static int nhmex_mbox_hw_config(struct intel_uncore_box *box, struct perf_event
|
|||
continue;
|
||||
if (event->attr.config1 & ~er->valid_mask)
|
||||
return -EINVAL;
|
||||
if (er->idx == __BITS_VALUE(reg1->idx, 0, 8) ||
|
||||
er->idx == __BITS_VALUE(reg1->idx, 1, 8))
|
||||
continue;
|
||||
if (WARN_ON_ONCE(reg_idx >= 2))
|
||||
return -EINVAL;
|
||||
|
||||
msr = er->msr + type->msr_offset * box->pmu->pmu_idx;
|
||||
if (WARN_ON_ONCE(msr >= 0xffff || er->idx >= 0xff))
|
||||
|
|
@ -1368,6 +1384,8 @@ static int nhmex_mbox_hw_config(struct intel_uncore_box *box, struct perf_event
|
|||
/* always use the 32~63 bits to pass the PLD config */
|
||||
if (er->idx == EXTRA_REG_NHMEX_M_PLD)
|
||||
reg_idx = 1;
|
||||
else if (WARN_ON_ONCE(reg_idx > 0))
|
||||
return -EINVAL;
|
||||
|
||||
reg1->idx &= ~(0xff << (reg_idx * 8));
|
||||
reg1->reg &= ~(0xffff << (reg_idx * 16));
|
||||
|
|
@ -1376,17 +1394,21 @@ static int nhmex_mbox_hw_config(struct intel_uncore_box *box, struct perf_event
|
|||
reg1->config = event->attr.config1;
|
||||
reg_idx++;
|
||||
}
|
||||
/* use config2 to pass the filter config */
|
||||
reg2->idx = EXTRA_REG_NHMEX_M_FILTER;
|
||||
if (event->attr.config2 & NHMEX_M_PMON_MM_CFG_EN)
|
||||
reg2->config = event->attr.config2;
|
||||
else
|
||||
reg2->config = ~0ULL;
|
||||
if (box->pmu->pmu_idx == 0)
|
||||
reg2->reg = NHMEX_M0_MSR_PMU_MM_CFG;
|
||||
else
|
||||
reg2->reg = NHMEX_M1_MSR_PMU_MM_CFG;
|
||||
|
||||
/*
|
||||
* The mbox only provides ability to perform address matching
|
||||
* for the PLD events.
|
||||
*/
|
||||
if (reg_idx == 2) {
|
||||
reg2->idx = EXTRA_REG_NHMEX_M_FILTER;
|
||||
if (event->attr.config2 & NHMEX_M_PMON_MM_CFG_EN)
|
||||
reg2->config = event->attr.config2;
|
||||
else
|
||||
reg2->config = ~0ULL;
|
||||
if (box->pmu->pmu_idx == 0)
|
||||
reg2->reg = NHMEX_M0_MSR_PMU_MM_CFG;
|
||||
else
|
||||
reg2->reg = NHMEX_M1_MSR_PMU_MM_CFG;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1422,34 +1444,36 @@ static void nhmex_mbox_msr_enable_event(struct intel_uncore_box *box, struct per
|
|||
wrmsrl(__BITS_VALUE(reg1->reg, 1, 16),
|
||||
nhmex_mbox_shared_reg_config(box, idx));
|
||||
|
||||
wrmsrl(reg2->reg, 0);
|
||||
if (reg2->config != ~0ULL) {
|
||||
wrmsrl(reg2->reg + 1,
|
||||
reg2->config & NHMEX_M_PMON_ADDR_MATCH_MASK);
|
||||
wrmsrl(reg2->reg + 2, NHMEX_M_PMON_ADDR_MASK_MASK &
|
||||
(reg2->config >> NHMEX_M_PMON_ADDR_MASK_SHIFT));
|
||||
wrmsrl(reg2->reg, NHMEX_M_PMON_MM_CFG_EN);
|
||||
if (reg2->idx != EXTRA_REG_NONE) {
|
||||
wrmsrl(reg2->reg, 0);
|
||||
if (reg2->config != ~0ULL) {
|
||||
wrmsrl(reg2->reg + 1,
|
||||
reg2->config & NHMEX_M_PMON_ADDR_MATCH_MASK);
|
||||
wrmsrl(reg2->reg + 2, NHMEX_M_PMON_ADDR_MASK_MASK &
|
||||
(reg2->config >> NHMEX_M_PMON_ADDR_MASK_SHIFT));
|
||||
wrmsrl(reg2->reg, NHMEX_M_PMON_MM_CFG_EN);
|
||||
}
|
||||
}
|
||||
|
||||
wrmsrl(hwc->config_base, hwc->config | NHMEX_PMON_CTL_EN_BIT0);
|
||||
}
|
||||
|
||||
DEFINE_UNCORE_FORMAT_ATTR(count_mode, count_mode, "config:2-3");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(storage_mode, storage_mode, "config:4-5");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(wrap_mode, wrap_mode, "config:6");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(flag_mode, flag_mode, "config:7");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(inc_sel, inc_sel, "config:9-13");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(set_flag_sel, set_flag_sel, "config:19-21");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(filter_cfg, filter_cfg, "config2:63");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(filter_match, filter_match, "config2:0-33");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(filter_mask, filter_mask, "config2:34-61");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(dsp, dsp, "config1:0-31");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(thr, thr, "config1:0-31");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(fvc, fvc, "config1:0-31");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(pgt, pgt, "config1:0-31");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(map, map, "config1:0-31");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(iss, iss, "config1:0-31");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(pld, pld, "config1:32-63");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(count_mode, count_mode, "config:2-3");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(storage_mode, storage_mode, "config:4-5");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(wrap_mode, wrap_mode, "config:6");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(flag_mode, flag_mode, "config:7");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(inc_sel, inc_sel, "config:9-13");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(set_flag_sel, set_flag_sel, "config:19-21");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(filter_cfg_en, filter_cfg_en, "config2:63");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(filter_match, filter_match, "config2:0-33");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(filter_mask, filter_mask, "config2:34-61");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(dsp, dsp, "config1:0-31");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(thr, thr, "config1:0-31");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(fvc, fvc, "config1:0-31");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(pgt, pgt, "config1:0-31");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(map, map, "config1:0-31");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(iss, iss, "config1:0-31");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(pld, pld, "config1:32-63");
|
||||
|
||||
static struct attribute *nhmex_uncore_mbox_formats_attr[] = {
|
||||
&format_attr_count_mode.attr,
|
||||
|
|
@ -1458,7 +1482,7 @@ static struct attribute *nhmex_uncore_mbox_formats_attr[] = {
|
|||
&format_attr_flag_mode.attr,
|
||||
&format_attr_inc_sel.attr,
|
||||
&format_attr_set_flag_sel.attr,
|
||||
&format_attr_filter_cfg.attr,
|
||||
&format_attr_filter_cfg_en.attr,
|
||||
&format_attr_filter_match.attr,
|
||||
&format_attr_filter_mask.attr,
|
||||
&format_attr_dsp.attr,
|
||||
|
|
@ -1482,6 +1506,12 @@ static struct uncore_event_desc nhmex_uncore_mbox_events[] = {
|
|||
{ /* end: all zeroes */ },
|
||||
};
|
||||
|
||||
static struct uncore_event_desc wsmex_uncore_mbox_events[] = {
|
||||
INTEL_UNCORE_EVENT_DESC(bbox_cmds_read, "inc_sel=0xd,fvc=0x5000"),
|
||||
INTEL_UNCORE_EVENT_DESC(bbox_cmds_write, "inc_sel=0xd,fvc=0x5040"),
|
||||
{ /* end: all zeroes */ },
|
||||
};
|
||||
|
||||
static struct intel_uncore_ops nhmex_uncore_mbox_ops = {
|
||||
NHMEX_UNCORE_OPS_COMMON_INIT(),
|
||||
.enable_event = nhmex_mbox_msr_enable_event,
|
||||
|
|
@ -1513,7 +1543,7 @@ void nhmex_rbox_alter_er(struct intel_uncore_box *box, struct perf_event *event)
|
|||
struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
|
||||
int port;
|
||||
|
||||
/* adjust the main event selector */
|
||||
/* adjust the main event selector and extra register index */
|
||||
if (reg1->idx % 2) {
|
||||
reg1->idx--;
|
||||
hwc->config -= 1 << NHMEX_R_PMON_CTL_EV_SEL_SHIFT;
|
||||
|
|
@ -1522,29 +1552,17 @@ void nhmex_rbox_alter_er(struct intel_uncore_box *box, struct perf_event *event)
|
|||
hwc->config += 1 << NHMEX_R_PMON_CTL_EV_SEL_SHIFT;
|
||||
}
|
||||
|
||||
/* adjust address or config of extra register */
|
||||
/* adjust extra register config */
|
||||
port = reg1->idx / 6 + box->pmu->pmu_idx * 4;
|
||||
switch (reg1->idx % 6) {
|
||||
case 0:
|
||||
reg1->reg = NHMEX_R_MSR_PORTN_IPERF_CFG0(port);
|
||||
break;
|
||||
case 1:
|
||||
reg1->reg = NHMEX_R_MSR_PORTN_IPERF_CFG1(port);
|
||||
break;
|
||||
case 2:
|
||||
/* the 8~15 bits to the 0~7 bits */
|
||||
/* shift the 8~15 bits to the 0~7 bits */
|
||||
reg1->config >>= 8;
|
||||
break;
|
||||
case 3:
|
||||
/* the 0~7 bits to the 8~15 bits */
|
||||
/* shift the 0~7 bits to the 8~15 bits */
|
||||
reg1->config <<= 8;
|
||||
break;
|
||||
case 4:
|
||||
reg1->reg = NHMEX_R_MSR_PORTN_XBR_SET1_MM_CFG(port);
|
||||
break;
|
||||
case 5:
|
||||
reg1->reg = NHMEX_R_MSR_PORTN_XBR_SET2_MM_CFG(port);
|
||||
break;
|
||||
};
|
||||
}
|
||||
|
||||
|
|
@ -1671,7 +1689,7 @@ static int nhmex_rbox_hw_config(struct intel_uncore_box *box, struct perf_event
|
|||
struct hw_perf_event *hwc = &event->hw;
|
||||
struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
|
||||
struct hw_perf_event_extra *reg2 = &event->hw.branch_reg;
|
||||
int port, idx;
|
||||
int idx;
|
||||
|
||||
idx = (event->hw.config & NHMEX_R_PMON_CTL_EV_SEL_MASK) >>
|
||||
NHMEX_R_PMON_CTL_EV_SEL_SHIFT;
|
||||
|
|
@ -1681,27 +1699,11 @@ static int nhmex_rbox_hw_config(struct intel_uncore_box *box, struct perf_event
|
|||
reg1->idx = idx;
|
||||
reg1->config = event->attr.config1;
|
||||
|
||||
port = idx / 6 + box->pmu->pmu_idx * 4;
|
||||
idx %= 6;
|
||||
switch (idx) {
|
||||
case 0:
|
||||
reg1->reg = NHMEX_R_MSR_PORTN_IPERF_CFG0(port);
|
||||
break;
|
||||
case 1:
|
||||
reg1->reg = NHMEX_R_MSR_PORTN_IPERF_CFG1(port);
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
reg1->reg = NHMEX_R_MSR_PORTN_QLX_CFG(port);
|
||||
break;
|
||||
switch (idx % 6) {
|
||||
case 4:
|
||||
case 5:
|
||||
if (idx == 4)
|
||||
reg1->reg = NHMEX_R_MSR_PORTN_XBR_SET1_MM_CFG(port);
|
||||
else
|
||||
reg1->reg = NHMEX_R_MSR_PORTN_XBR_SET2_MM_CFG(port);
|
||||
reg2->config = event->attr.config2;
|
||||
hwc->config |= event->attr.config & (~0ULL << 32);
|
||||
reg2->config = event->attr.config2;
|
||||
break;
|
||||
};
|
||||
return 0;
|
||||
|
|
@ -1727,28 +1729,34 @@ static void nhmex_rbox_msr_enable_event(struct intel_uncore_box *box, struct per
|
|||
struct hw_perf_event *hwc = &event->hw;
|
||||
struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
|
||||
struct hw_perf_event_extra *reg2 = &hwc->branch_reg;
|
||||
int idx, er_idx;
|
||||
int idx, port;
|
||||
|
||||
idx = reg1->idx % 6;
|
||||
er_idx = idx;
|
||||
if (er_idx > 2)
|
||||
er_idx--;
|
||||
er_idx += (reg1->idx / 6) * 5;
|
||||
idx = reg1->idx;
|
||||
port = idx / 6 + box->pmu->pmu_idx * 4;
|
||||
|
||||
switch (idx) {
|
||||
switch (idx % 6) {
|
||||
case 0:
|
||||
wrmsrl(NHMEX_R_MSR_PORTN_IPERF_CFG0(port), reg1->config);
|
||||
break;
|
||||
case 1:
|
||||
wrmsrl(reg1->reg, reg1->config);
|
||||
wrmsrl(NHMEX_R_MSR_PORTN_IPERF_CFG1(port), reg1->config);
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
wrmsrl(reg1->reg, nhmex_rbox_shared_reg_config(box, er_idx));
|
||||
wrmsrl(NHMEX_R_MSR_PORTN_QLX_CFG(port),
|
||||
nhmex_rbox_shared_reg_config(box, 2 + (idx / 6) * 5));
|
||||
break;
|
||||
case 4:
|
||||
wrmsrl(NHMEX_R_MSR_PORTN_XBR_SET1_MM_CFG(port),
|
||||
hwc->config >> 32);
|
||||
wrmsrl(NHMEX_R_MSR_PORTN_XBR_SET1_MATCH(port), reg1->config);
|
||||
wrmsrl(NHMEX_R_MSR_PORTN_XBR_SET1_MASK(port), reg2->config);
|
||||
break;
|
||||
case 5:
|
||||
wrmsrl(reg1->reg, reg1->config);
|
||||
wrmsrl(reg1->reg + 1, hwc->config >> 32);
|
||||
wrmsrl(reg1->reg + 2, reg2->config);
|
||||
wrmsrl(NHMEX_R_MSR_PORTN_XBR_SET2_MM_CFG(port),
|
||||
hwc->config >> 32);
|
||||
wrmsrl(NHMEX_R_MSR_PORTN_XBR_SET2_MATCH(port), reg1->config);
|
||||
wrmsrl(NHMEX_R_MSR_PORTN_XBR_SET2_MASK(port), reg2->config);
|
||||
break;
|
||||
};
|
||||
|
||||
|
|
@ -1756,8 +1764,8 @@ static void nhmex_rbox_msr_enable_event(struct intel_uncore_box *box, struct per
|
|||
(hwc->config & NHMEX_R_PMON_CTL_EV_SEL_MASK));
|
||||
}
|
||||
|
||||
DEFINE_UNCORE_FORMAT_ATTR(xbr_match, xbr_match, "config:32-63");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(xbr_mm_cfg, xbr_mm_cfg, "config1:0-63");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(xbr_mm_cfg, xbr_mm_cfg, "config:32-63");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(xbr_match, xbr_match, "config1:0-63");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(xbr_mask, xbr_mask, "config2:0-63");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(qlx_cfg, qlx_cfg, "config1:0-15");
|
||||
DEFINE_UNCORE_FORMAT_ATTR(iperf_cfg, iperf_cfg, "config1:0-31");
|
||||
|
|
@ -2303,6 +2311,7 @@ int uncore_pmu_event_init(struct perf_event *event)
|
|||
event->hw.idx = -1;
|
||||
event->hw.last_tag = ~0ULL;
|
||||
event->hw.extra_reg.idx = EXTRA_REG_NONE;
|
||||
event->hw.branch_reg.idx = EXTRA_REG_NONE;
|
||||
|
||||
if (event->attr.config == UNCORE_FIXED_EVENT) {
|
||||
/* no fixed counter */
|
||||
|
|
@ -2373,7 +2382,7 @@ static void __init uncore_type_exit(struct intel_uncore_type *type)
|
|||
type->attr_groups[1] = NULL;
|
||||
}
|
||||
|
||||
static void uncore_types_exit(struct intel_uncore_type **types)
|
||||
static void __init uncore_types_exit(struct intel_uncore_type **types)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; types[i]; i++)
|
||||
|
|
@ -2814,7 +2823,13 @@ static int __init uncore_cpu_init(void)
|
|||
snbep_uncore_cbox.num_boxes = max_cores;
|
||||
msr_uncores = snbep_msr_uncores;
|
||||
break;
|
||||
case 46:
|
||||
case 46: /* Nehalem-EX */
|
||||
uncore_nhmex = true;
|
||||
case 47: /* Westmere-EX aka. Xeon E7 */
|
||||
if (!uncore_nhmex)
|
||||
nhmex_uncore_mbox.event_descs = wsmex_uncore_mbox_events;
|
||||
if (nhmex_uncore_cbox.num_boxes > max_cores)
|
||||
nhmex_uncore_cbox.num_boxes = max_cores;
|
||||
msr_uncores = nhmex_msr_uncores;
|
||||
break;
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -230,6 +230,7 @@
|
|||
#define NHMEX_S1_MSR_MASK 0xe5a
|
||||
|
||||
#define NHMEX_S_PMON_MM_CFG_EN (0x1ULL << 63)
|
||||
#define NHMEX_S_EVENT_TO_R_PROG_EV 0
|
||||
|
||||
/* NHM-EX Mbox */
|
||||
#define NHMEX_M0_MSR_GLOBAL_CTL 0xca0
|
||||
|
|
@ -275,18 +276,12 @@
|
|||
NHMEX_M_PMON_CTL_INC_SEL_MASK | \
|
||||
NHMEX_M_PMON_CTL_SET_FLAG_SEL_MASK)
|
||||
|
||||
|
||||
#define NHMEX_M_PMON_ZDP_CTL_FVC_FVID_MASK 0x1f
|
||||
#define NHMEX_M_PMON_ZDP_CTL_FVC_BCMD_MASK (0x7 << 5)
|
||||
#define NHMEX_M_PMON_ZDP_CTL_FVC_RSP_MASK (0x7 << 8)
|
||||
#define NHMEX_M_PMON_ZDP_CTL_FVC_PBOX_INIT_ERR (1 << 23)
|
||||
#define NHMEX_M_PMON_ZDP_CTL_FVC_MASK \
|
||||
(NHMEX_M_PMON_ZDP_CTL_FVC_FVID_MASK | \
|
||||
NHMEX_M_PMON_ZDP_CTL_FVC_BCMD_MASK | \
|
||||
NHMEX_M_PMON_ZDP_CTL_FVC_RSP_MASK | \
|
||||
NHMEX_M_PMON_ZDP_CTL_FVC_PBOX_INIT_ERR)
|
||||
#define NHMEX_M_PMON_ZDP_CTL_FVC_MASK (((1 << 11) - 1) | (1 << 23))
|
||||
#define NHMEX_M_PMON_ZDP_CTL_FVC_EVENT_MASK(n) (0x7 << (11 + 3 * (n)))
|
||||
|
||||
#define WSMEX_M_PMON_ZDP_CTL_FVC_MASK (((1 << 12) - 1) | (1 << 24))
|
||||
#define WSMEX_M_PMON_ZDP_CTL_FVC_EVENT_MASK(n) (0x7 << (12 + 3 * (n)))
|
||||
|
||||
/*
|
||||
* use the 9~13 bits to select event If the 7th bit is not set,
|
||||
* otherwise use the 19~21 bits to select event.
|
||||
|
|
@ -368,6 +363,7 @@ struct intel_uncore_type {
|
|||
unsigned num_shared_regs:8;
|
||||
unsigned single_fixed:1;
|
||||
unsigned pair_ctr_ctl:1;
|
||||
unsigned *msr_offsets;
|
||||
struct event_constraint unconstrainted;
|
||||
struct event_constraint *constraints;
|
||||
struct intel_uncore_pmu *pmus;
|
||||
|
|
@ -485,29 +481,31 @@ unsigned uncore_pci_perf_ctr(struct intel_uncore_box *box, int idx)
|
|||
return idx * 8 + box->pmu->type->perf_ctr;
|
||||
}
|
||||
|
||||
static inline
|
||||
unsigned uncore_msr_box_ctl(struct intel_uncore_box *box)
|
||||
static inline unsigned uncore_msr_box_offset(struct intel_uncore_box *box)
|
||||
{
|
||||
struct intel_uncore_pmu *pmu = box->pmu;
|
||||
return pmu->type->msr_offsets ?
|
||||
pmu->type->msr_offsets[pmu->pmu_idx] :
|
||||
pmu->type->msr_offset * pmu->pmu_idx;
|
||||
}
|
||||
|
||||
static inline unsigned uncore_msr_box_ctl(struct intel_uncore_box *box)
|
||||
{
|
||||
if (!box->pmu->type->box_ctl)
|
||||
return 0;
|
||||
return box->pmu->type->box_ctl +
|
||||
box->pmu->type->msr_offset * box->pmu->pmu_idx;
|
||||
return box->pmu->type->box_ctl + uncore_msr_box_offset(box);
|
||||
}
|
||||
|
||||
static inline
|
||||
unsigned uncore_msr_fixed_ctl(struct intel_uncore_box *box)
|
||||
static inline unsigned uncore_msr_fixed_ctl(struct intel_uncore_box *box)
|
||||
{
|
||||
if (!box->pmu->type->fixed_ctl)
|
||||
return 0;
|
||||
return box->pmu->type->fixed_ctl +
|
||||
box->pmu->type->msr_offset * box->pmu->pmu_idx;
|
||||
return box->pmu->type->fixed_ctl + uncore_msr_box_offset(box);
|
||||
}
|
||||
|
||||
static inline
|
||||
unsigned uncore_msr_fixed_ctr(struct intel_uncore_box *box)
|
||||
static inline unsigned uncore_msr_fixed_ctr(struct intel_uncore_box *box)
|
||||
{
|
||||
return box->pmu->type->fixed_ctr +
|
||||
box->pmu->type->msr_offset * box->pmu->pmu_idx;
|
||||
return box->pmu->type->fixed_ctr + uncore_msr_box_offset(box);
|
||||
}
|
||||
|
||||
static inline
|
||||
|
|
@ -515,7 +513,7 @@ unsigned uncore_msr_event_ctl(struct intel_uncore_box *box, int idx)
|
|||
{
|
||||
return box->pmu->type->event_ctl +
|
||||
(box->pmu->type->pair_ctr_ctl ? 2 * idx : idx) +
|
||||
box->pmu->type->msr_offset * box->pmu->pmu_idx;
|
||||
uncore_msr_box_offset(box);
|
||||
}
|
||||
|
||||
static inline
|
||||
|
|
@ -523,7 +521,7 @@ unsigned uncore_msr_perf_ctr(struct intel_uncore_box *box, int idx)
|
|||
{
|
||||
return box->pmu->type->perf_ctr +
|
||||
(box->pmu->type->pair_ctr_ctl ? 2 * idx : idx) +
|
||||
box->pmu->type->msr_offset * box->pmu->pmu_idx;
|
||||
uncore_msr_box_offset(box);
|
||||
}
|
||||
|
||||
static inline
|
||||
|
|
|
|||
|
|
@ -56,9 +56,16 @@ static int vma_shareable(struct vm_area_struct *vma, unsigned long addr)
|
|||
}
|
||||
|
||||
/*
|
||||
* search for a shareable pmd page for hugetlb.
|
||||
* Search for a shareable pmd page for hugetlb. In any case calls pmd_alloc()
|
||||
* and returns the corresponding pte. While this is not necessary for the
|
||||
* !shared pmd case because we can allocate the pmd later as well, it makes the
|
||||
* code much cleaner. pmd allocation is essential for the shared case because
|
||||
* pud has to be populated inside the same i_mmap_mutex section - otherwise
|
||||
* racing tasks could either miss the sharing (see huge_pte_offset) or select a
|
||||
* bad pmd for sharing.
|
||||
*/
|
||||
static void huge_pmd_share(struct mm_struct *mm, unsigned long addr, pud_t *pud)
|
||||
static pte_t *
|
||||
huge_pmd_share(struct mm_struct *mm, unsigned long addr, pud_t *pud)
|
||||
{
|
||||
struct vm_area_struct *vma = find_vma(mm, addr);
|
||||
struct address_space *mapping = vma->vm_file->f_mapping;
|
||||
|
|
@ -68,9 +75,10 @@ static void huge_pmd_share(struct mm_struct *mm, unsigned long addr, pud_t *pud)
|
|||
struct vm_area_struct *svma;
|
||||
unsigned long saddr;
|
||||
pte_t *spte = NULL;
|
||||
pte_t *pte;
|
||||
|
||||
if (!vma_shareable(vma, addr))
|
||||
return;
|
||||
return (pte_t *)pmd_alloc(mm, pud, addr);
|
||||
|
||||
mutex_lock(&mapping->i_mmap_mutex);
|
||||
vma_prio_tree_foreach(svma, &iter, &mapping->i_mmap, idx, idx) {
|
||||
|
|
@ -97,7 +105,9 @@ static void huge_pmd_share(struct mm_struct *mm, unsigned long addr, pud_t *pud)
|
|||
put_page(virt_to_page(spte));
|
||||
spin_unlock(&mm->page_table_lock);
|
||||
out:
|
||||
pte = (pte_t *)pmd_alloc(mm, pud, addr);
|
||||
mutex_unlock(&mapping->i_mmap_mutex);
|
||||
return pte;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -142,8 +152,9 @@ pte_t *huge_pte_alloc(struct mm_struct *mm,
|
|||
} else {
|
||||
BUG_ON(sz != PMD_SIZE);
|
||||
if (pud_none(*pud))
|
||||
huge_pmd_share(mm, addr, pud);
|
||||
pte = (pte_t *) pmd_alloc(mm, pud, addr);
|
||||
pte = huge_pmd_share(mm, addr, pud);
|
||||
else
|
||||
pte = (pte_t *)pmd_alloc(mm, pud, addr);
|
||||
}
|
||||
}
|
||||
BUG_ON(pte && !pte_none(*pte) && !pte_huge(*pte));
|
||||
|
|
|
|||
|
|
@ -919,13 +919,11 @@ static int change_page_attr_set_clr(unsigned long *addr, int numpages,
|
|||
|
||||
/*
|
||||
* On success we use clflush, when the CPU supports it to
|
||||
* avoid the wbindv. If the CPU does not support it, in the
|
||||
* error case, and during early boot (for EFI) we fall back
|
||||
* to cpa_flush_all (which uses wbinvd):
|
||||
* avoid the wbindv. If the CPU does not support it and in the
|
||||
* error case we fall back to cpa_flush_all (which uses
|
||||
* wbindv):
|
||||
*/
|
||||
if (early_boot_irqs_disabled)
|
||||
__cpa_flush_all((void *)(long)cache);
|
||||
else if (!ret && cpu_has_clflush) {
|
||||
if (!ret && cpu_has_clflush) {
|
||||
if (cpa.flags & (CPA_PAGES_ARRAY | CPA_ARRAY)) {
|
||||
cpa_flush_array(addr, numpages, cache,
|
||||
cpa.flags, pages);
|
||||
|
|
|
|||
|
|
@ -234,7 +234,22 @@ static efi_status_t __init phys_efi_set_virtual_address_map(
|
|||
return status;
|
||||
}
|
||||
|
||||
static int efi_set_rtc_mmss(unsigned long nowtime)
|
||||
static efi_status_t __init phys_efi_get_time(efi_time_t *tm,
|
||||
efi_time_cap_t *tc)
|
||||
{
|
||||
unsigned long flags;
|
||||
efi_status_t status;
|
||||
|
||||
spin_lock_irqsave(&rtc_lock, flags);
|
||||
efi_call_phys_prelog();
|
||||
status = efi_call_phys2(efi_phys.get_time, virt_to_phys(tm),
|
||||
virt_to_phys(tc));
|
||||
efi_call_phys_epilog();
|
||||
spin_unlock_irqrestore(&rtc_lock, flags);
|
||||
return status;
|
||||
}
|
||||
|
||||
int efi_set_rtc_mmss(unsigned long nowtime)
|
||||
{
|
||||
int real_seconds, real_minutes;
|
||||
efi_status_t status;
|
||||
|
|
@ -263,7 +278,7 @@ static int efi_set_rtc_mmss(unsigned long nowtime)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static unsigned long efi_get_time(void)
|
||||
unsigned long efi_get_time(void)
|
||||
{
|
||||
efi_status_t status;
|
||||
efi_time_t eft;
|
||||
|
|
@ -606,13 +621,18 @@ static int __init efi_runtime_init(void)
|
|||
}
|
||||
/*
|
||||
* We will only need *early* access to the following
|
||||
* EFI runtime service before set_virtual_address_map
|
||||
* two EFI runtime services before set_virtual_address_map
|
||||
* is invoked.
|
||||
*/
|
||||
efi_phys.get_time = (efi_get_time_t *)runtime->get_time;
|
||||
efi_phys.set_virtual_address_map =
|
||||
(efi_set_virtual_address_map_t *)
|
||||
runtime->set_virtual_address_map;
|
||||
|
||||
/*
|
||||
* Make efi_get_time can be called before entering
|
||||
* virtual mode.
|
||||
*/
|
||||
efi.get_time = phys_efi_get_time;
|
||||
early_iounmap(runtime, sizeof(efi_runtime_services_t));
|
||||
|
||||
return 0;
|
||||
|
|
@ -700,10 +720,12 @@ void __init efi_init(void)
|
|||
efi_enabled = 0;
|
||||
return;
|
||||
}
|
||||
#ifdef CONFIG_X86_32
|
||||
if (efi_native) {
|
||||
x86_platform.get_wallclock = efi_get_time;
|
||||
x86_platform.set_wallclock = efi_set_rtc_mmss;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if EFI_DEBUG
|
||||
print_efi_memmap();
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ KBUILD_CFLAGS := $(LINUXINCLUDE) -m32 -g -Os -D_SETUP -D__KERNEL__ -D_WAKEUP \
|
|||
-Wall -Wstrict-prototypes \
|
||||
-march=i386 -mregparm=3 \
|
||||
-include $(srctree)/$(src)/../../boot/code16gcc.h \
|
||||
-fno-strict-aliasing -fomit-frame-pointer \
|
||||
-fno-strict-aliasing -fomit-frame-pointer -fno-pic \
|
||||
$(call cc-option, -ffreestanding) \
|
||||
$(call cc-option, -fno-toplevel-reorder,\
|
||||
$(call cc-option, -fno-unit-at-a-time)) \
|
||||
|
|
|
|||
|
|
@ -60,8 +60,8 @@
|
|||
51 common getsockname sys_getsockname
|
||||
52 common getpeername sys_getpeername
|
||||
53 common socketpair sys_socketpair
|
||||
54 common setsockopt sys_setsockopt
|
||||
55 common getsockopt sys_getsockopt
|
||||
54 64 setsockopt sys_setsockopt
|
||||
55 64 getsockopt sys_getsockopt
|
||||
56 common clone stub_clone
|
||||
57 common fork stub_fork
|
||||
58 common vfork stub_vfork
|
||||
|
|
@ -353,3 +353,5 @@
|
|||
538 x32 sendmmsg compat_sys_sendmmsg
|
||||
539 x32 process_vm_readv compat_sys_process_vm_readv
|
||||
540 x32 process_vm_writev compat_sys_process_vm_writev
|
||||
541 x32 setsockopt compat_sys_setsockopt
|
||||
542 x32 getsockopt compat_sys_getsockopt
|
||||
|
|
|
|||
|
|
@ -387,6 +387,7 @@ acpi_get_table_with_size(char *signature,
|
|||
|
||||
return (AE_NOT_FOUND);
|
||||
}
|
||||
ACPI_EXPORT_SYMBOL(acpi_get_table_with_size)
|
||||
|
||||
acpi_status
|
||||
acpi_get_table(char *signature,
|
||||
|
|
|
|||
|
|
@ -1865,6 +1865,7 @@ int __dev_printk(const char *level, const struct device *dev,
|
|||
struct va_format *vaf)
|
||||
{
|
||||
char dict[128];
|
||||
const char *level_extra = "";
|
||||
size_t dictlen = 0;
|
||||
const char *subsys;
|
||||
|
||||
|
|
@ -1911,10 +1912,14 @@ int __dev_printk(const char *level, const struct device *dev,
|
|||
"DEVICE=+%s:%s", subsys, dev_name(dev));
|
||||
}
|
||||
skip:
|
||||
if (level[2])
|
||||
level_extra = &level[2]; /* skip past KERN_SOH "L" */
|
||||
|
||||
return printk_emit(0, level[1] - '0',
|
||||
dictlen ? dict : NULL, dictlen,
|
||||
"%s %s: %pV",
|
||||
dev_driver_string(dev), dev_name(dev), vaf);
|
||||
"%s %s: %s%pV",
|
||||
dev_driver_string(dev), dev_name(dev),
|
||||
level_extra, vaf);
|
||||
}
|
||||
EXPORT_SYMBOL(__dev_printk);
|
||||
|
||||
|
|
|
|||
|
|
@ -147,6 +147,8 @@ static int rpm_check_suspend_allowed(struct device *dev)
|
|||
|| (dev->power.request_pending
|
||||
&& dev->power.request == RPM_REQ_RESUME))
|
||||
retval = -EAGAIN;
|
||||
else if (__dev_pm_qos_read_value(dev) < 0)
|
||||
retval = -EPERM;
|
||||
else if (dev->power.runtime_status == RPM_SUSPENDED)
|
||||
retval = 1;
|
||||
|
||||
|
|
@ -388,7 +390,6 @@ static int rpm_suspend(struct device *dev, int rpmflags)
|
|||
goto repeat;
|
||||
}
|
||||
|
||||
dev->power.deferred_resume = false;
|
||||
if (dev->power.no_callbacks)
|
||||
goto no_callback; /* Assume success. */
|
||||
|
||||
|
|
@ -403,12 +404,6 @@ static int rpm_suspend(struct device *dev, int rpmflags)
|
|||
goto out;
|
||||
}
|
||||
|
||||
if (__dev_pm_qos_read_value(dev) < 0) {
|
||||
/* Negative PM QoS constraint means "never suspend". */
|
||||
retval = -EPERM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
__update_runtime_status(dev, RPM_SUSPENDING);
|
||||
|
||||
if (dev->pm_domain)
|
||||
|
|
@ -440,6 +435,7 @@ static int rpm_suspend(struct device *dev, int rpmflags)
|
|||
wake_up_all(&dev->power.wait_queue);
|
||||
|
||||
if (dev->power.deferred_resume) {
|
||||
dev->power.deferred_resume = false;
|
||||
rpm_resume(dev, 0);
|
||||
retval = -EAGAIN;
|
||||
goto out;
|
||||
|
|
@ -584,6 +580,7 @@ static int rpm_resume(struct device *dev, int rpmflags)
|
|||
|| dev->parent->power.runtime_status == RPM_ACTIVE) {
|
||||
atomic_inc(&dev->parent->power.child_count);
|
||||
spin_unlock(&dev->parent->power.lock);
|
||||
retval = 1;
|
||||
goto no_callback; /* Assume success. */
|
||||
}
|
||||
spin_unlock(&dev->parent->power.lock);
|
||||
|
|
@ -664,7 +661,7 @@ static int rpm_resume(struct device *dev, int rpmflags)
|
|||
}
|
||||
wake_up_all(&dev->power.wait_queue);
|
||||
|
||||
if (!retval)
|
||||
if (retval >= 0)
|
||||
rpm_idle(dev, RPM_ASYNC);
|
||||
|
||||
out:
|
||||
|
|
|
|||
|
|
@ -763,16 +763,7 @@ static void complete_scsi_command(CommandList_struct *c, int timeout,
|
|||
{
|
||||
case CMD_TARGET_STATUS:
|
||||
/* Pass it up to the upper layers... */
|
||||
if( ei->ScsiStatus)
|
||||
{
|
||||
#if 0
|
||||
printk(KERN_WARNING "cciss: cmd %p "
|
||||
"has SCSI Status = %x\n",
|
||||
c, ei->ScsiStatus);
|
||||
#endif
|
||||
cmd->result |= (ei->ScsiStatus << 1);
|
||||
}
|
||||
else { /* scsi status is zero??? How??? */
|
||||
if (!ei->ScsiStatus) {
|
||||
|
||||
/* Ordinarily, this case should never happen, but there is a bug
|
||||
in some released firmware revisions that allows it to happen
|
||||
|
|
|
|||
|
|
@ -79,6 +79,7 @@ static struct usb_device_id ath3k_table[] = {
|
|||
{ USB_DEVICE(0x13d3, 0x3362) },
|
||||
{ USB_DEVICE(0x0CF3, 0xE004) },
|
||||
{ USB_DEVICE(0x0930, 0x0219) },
|
||||
{ USB_DEVICE(0x0489, 0xe057) },
|
||||
|
||||
/* Atheros AR5BBU12 with sflash firmware */
|
||||
{ USB_DEVICE(0x0489, 0xE02C) },
|
||||
|
|
@ -104,6 +105,7 @@ static struct usb_device_id ath3k_blist_tbl[] = {
|
|||
{ USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 },
|
||||
|
||||
/* Atheros AR5BBU22 with sflash firmware */
|
||||
{ USB_DEVICE(0x0489, 0xE03C), .driver_info = BTUSB_ATH3012 },
|
||||
|
|
|
|||
|
|
@ -98,6 +98,7 @@ static struct usb_device_id btusb_table[] = {
|
|||
{ USB_DEVICE(0x0a5c, 0x21e6) },
|
||||
{ USB_DEVICE(0x0a5c, 0x21e8) },
|
||||
{ USB_DEVICE(0x0a5c, 0x21f3) },
|
||||
{ USB_DEVICE(0x0a5c, 0x21f4) },
|
||||
{ USB_DEVICE(0x413c, 0x8197) },
|
||||
|
||||
/* Foxconn - Hon Hai */
|
||||
|
|
@ -133,6 +134,7 @@ static struct usb_device_id blacklist_table[] = {
|
|||
{ USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 },
|
||||
|
||||
/* Atheros AR5BBU12 with sflash firmware */
|
||||
{ USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
|
||||
|
|
|
|||
|
|
@ -64,6 +64,7 @@
|
|||
#define I830_PTE_SYSTEM_CACHED 0x00000006
|
||||
/* GT PTE cache control fields */
|
||||
#define GEN6_PTE_UNCACHED 0x00000002
|
||||
#define HSW_PTE_UNCACHED 0x00000000
|
||||
#define GEN6_PTE_LLC 0x00000004
|
||||
#define GEN6_PTE_LLC_MLC 0x00000006
|
||||
#define GEN6_PTE_GFDT 0x00000008
|
||||
|
|
|
|||
|
|
@ -1156,6 +1156,30 @@ static bool gen6_check_flags(unsigned int flags)
|
|||
return true;
|
||||
}
|
||||
|
||||
static void haswell_write_entry(dma_addr_t addr, unsigned int entry,
|
||||
unsigned int flags)
|
||||
{
|
||||
unsigned int type_mask = flags & ~AGP_USER_CACHED_MEMORY_GFDT;
|
||||
unsigned int gfdt = flags & AGP_USER_CACHED_MEMORY_GFDT;
|
||||
u32 pte_flags;
|
||||
|
||||
if (type_mask == AGP_USER_MEMORY)
|
||||
pte_flags = HSW_PTE_UNCACHED | I810_PTE_VALID;
|
||||
else if (type_mask == AGP_USER_CACHED_MEMORY_LLC_MLC) {
|
||||
pte_flags = GEN6_PTE_LLC_MLC | I810_PTE_VALID;
|
||||
if (gfdt)
|
||||
pte_flags |= GEN6_PTE_GFDT;
|
||||
} else { /* set 'normal'/'cached' to LLC by default */
|
||||
pte_flags = GEN6_PTE_LLC | I810_PTE_VALID;
|
||||
if (gfdt)
|
||||
pte_flags |= GEN6_PTE_GFDT;
|
||||
}
|
||||
|
||||
/* gen6 has bit11-4 for physical addr bit39-32 */
|
||||
addr |= (addr >> 28) & 0xff0;
|
||||
writel(addr | pte_flags, intel_private.gtt + entry);
|
||||
}
|
||||
|
||||
static void gen6_write_entry(dma_addr_t addr, unsigned int entry,
|
||||
unsigned int flags)
|
||||
{
|
||||
|
|
@ -1382,6 +1406,15 @@ static const struct intel_gtt_driver sandybridge_gtt_driver = {
|
|||
.check_flags = gen6_check_flags,
|
||||
.chipset_flush = i9xx_chipset_flush,
|
||||
};
|
||||
static const struct intel_gtt_driver haswell_gtt_driver = {
|
||||
.gen = 6,
|
||||
.setup = i9xx_setup,
|
||||
.cleanup = gen6_cleanup,
|
||||
.write_entry = haswell_write_entry,
|
||||
.dma_mask_size = 40,
|
||||
.check_flags = gen6_check_flags,
|
||||
.chipset_flush = i9xx_chipset_flush,
|
||||
};
|
||||
static const struct intel_gtt_driver valleyview_gtt_driver = {
|
||||
.gen = 7,
|
||||
.setup = i9xx_setup,
|
||||
|
|
@ -1499,77 +1532,77 @@ static const struct intel_gtt_driver_description {
|
|||
{ PCI_DEVICE_ID_INTEL_VALLEYVIEW_IG,
|
||||
"ValleyView", &valleyview_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_D_GT1_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_D_GT2_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_D_GT2_PLUS_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_M_GT1_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_M_GT2_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_M_GT2_PLUS_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_S_GT1_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_S_GT2_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_S_GT2_PLUS_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_SDV_D_GT1_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_SDV_D_GT2_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_SDV_D_GT2_PLUS_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_SDV_M_GT1_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_SDV_M_GT2_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_SDV_M_GT2_PLUS_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_SDV_S_GT1_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_SDV_S_GT2_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_SDV_S_GT2_PLUS_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_ULT_D_GT1_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_ULT_D_GT2_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_ULT_D_GT2_PLUS_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_ULT_M_GT1_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_ULT_M_GT2_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_ULT_M_GT2_PLUS_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_ULT_S_GT1_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_ULT_S_GT2_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_ULT_S_GT2_PLUS_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_CRW_D_GT1_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_CRW_D_GT2_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_CRW_D_GT2_PLUS_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_CRW_M_GT1_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_CRW_M_GT2_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_CRW_M_GT2_PLUS_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_CRW_S_GT1_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_CRW_S_GT2_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_HASWELL_CRW_S_GT2_PLUS_IG,
|
||||
"Haswell", &sandybridge_gtt_driver },
|
||||
"Haswell", &haswell_gtt_driver },
|
||||
{ 0, NULL, NULL }
|
||||
};
|
||||
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user