aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sh
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sh')
-rw-r--r--arch/sh/boards/board-ap325rxa.c11
-rw-r--r--arch/sh/configs/ap325rxa_defconfig27
-rw-r--r--arch/sh/configs/migor_defconfig42
-rw-r--r--arch/sh/include/asm/mutex-llsc.h21
-rw-r--r--arch/sh/include/asm/syscall_32.h22
-rw-r--r--arch/sh/include/asm/syscall_64.h22
-rw-r--r--arch/sh/kernel/cpu/sh2a/clock-sh7201.c4
-rw-r--r--arch/sh/kernel/cpu/sh4/fpu.c2
-rw-r--r--arch/sh/kernel/setup.c8
-rw-r--r--arch/sh/kernel/signal_32.c4
-rw-r--r--arch/sh/kernel/signal_64.c4
-rw-r--r--arch/sh/lib/checksum.S69
12 files changed, 137 insertions, 99 deletions
diff --git a/arch/sh/boards/board-ap325rxa.c b/arch/sh/boards/board-ap325rxa.c
index caf4c33f4e84..15b6d450fbf0 100644
--- a/arch/sh/boards/board-ap325rxa.c
+++ b/arch/sh/boards/board-ap325rxa.c
@@ -22,6 +22,7 @@
22#include <linux/gpio.h> 22#include <linux/gpio.h>
23#include <linux/spi/spi.h> 23#include <linux/spi/spi.h>
24#include <linux/spi/spi_gpio.h> 24#include <linux/spi/spi_gpio.h>
25#include <media/soc_camera.h>
25#include <media/soc_camera_platform.h> 26#include <media/soc_camera_platform.h>
26#include <media/sh_mobile_ceu.h> 27#include <media/sh_mobile_ceu.h>
27#include <video/sh_mobile_lcdc.h> 28#include <video/sh_mobile_lcdc.h>
@@ -216,6 +217,12 @@ static struct platform_device lcdc_device = {
216 }, 217 },
217}; 218};
218 219
220static void camera_power(int val)
221{
222 gpio_set_value(GPIO_PTZ5, val); /* RST_CAM/RSTB */
223 mdelay(10);
224}
225
219#ifdef CONFIG_I2C 226#ifdef CONFIG_I2C
220static unsigned char camera_ncm03j_magic[] = 227static unsigned char camera_ncm03j_magic[] =
221{ 228{
@@ -245,9 +252,11 @@ static int camera_set_capture(struct soc_camera_platform_info *info,
245 int ret = 0; 252 int ret = 0;
246 int i; 253 int i;
247 254
255 camera_power(0);
248 if (!enable) 256 if (!enable)
249 return 0; /* no disable for now */ 257 return 0; /* no disable for now */
250 258
259 camera_power(1);
251 for (i = 0; i < ARRAY_SIZE(camera_ncm03j_magic); i += 2) { 260 for (i = 0; i < ARRAY_SIZE(camera_ncm03j_magic); i += 2) {
252 u_int8_t buf[8]; 261 u_int8_t buf[8];
253 262
@@ -426,7 +435,7 @@ static int __init ap325rxa_devices_setup(void)
426 gpio_request(GPIO_PTZ6, NULL); 435 gpio_request(GPIO_PTZ6, NULL);
427 gpio_direction_output(GPIO_PTZ6, 0); /* STBY_CAM */ 436 gpio_direction_output(GPIO_PTZ6, 0); /* STBY_CAM */
428 gpio_request(GPIO_PTZ5, NULL); 437 gpio_request(GPIO_PTZ5, NULL);
429 gpio_direction_output(GPIO_PTZ5, 1); /* RST_CAM */ 438 gpio_direction_output(GPIO_PTZ5, 0); /* RST_CAM */
430 gpio_request(GPIO_PTZ4, NULL); 439 gpio_request(GPIO_PTZ4, NULL);
431 gpio_direction_output(GPIO_PTZ4, 0); /* SADDR */ 440 gpio_direction_output(GPIO_PTZ4, 0); /* SADDR */
432 441
diff --git a/arch/sh/configs/ap325rxa_defconfig b/arch/sh/configs/ap325rxa_defconfig
index 5c423fa8e6b8..352f87d50fdc 100644
--- a/arch/sh/configs/ap325rxa_defconfig
+++ b/arch/sh/configs/ap325rxa_defconfig
@@ -1,7 +1,7 @@
1# 1#
2# Automatically generated make config: don't edit 2# Automatically generated make config: don't edit
3# Linux kernel version: 2.6.28 3# Linux kernel version: 2.6.29-rc2
4# Fri Jan 9 16:54:19 2009 4# Tue Jan 27 11:45:08 2009
5# 5#
6CONFIG_SUPERH=y 6CONFIG_SUPERH=y
7CONFIG_SUPERH32=y 7CONFIG_SUPERH32=y
@@ -45,12 +45,12 @@ CONFIG_BSD_PROCESS_ACCT=y
45# CONFIG_AUDIT is not set 45# CONFIG_AUDIT is not set
46# CONFIG_IKCONFIG is not set 46# CONFIG_IKCONFIG is not set
47CONFIG_LOG_BUF_SHIFT=14 47CONFIG_LOG_BUF_SHIFT=14
48# CONFIG_CGROUPS is not set
49CONFIG_GROUP_SCHED=y 48CONFIG_GROUP_SCHED=y
50CONFIG_FAIR_GROUP_SCHED=y 49CONFIG_FAIR_GROUP_SCHED=y
51# CONFIG_RT_GROUP_SCHED is not set 50# CONFIG_RT_GROUP_SCHED is not set
52CONFIG_USER_SCHED=y 51CONFIG_USER_SCHED=y
53# CONFIG_CGROUP_SCHED is not set 52# CONFIG_CGROUP_SCHED is not set
53# CONFIG_CGROUPS is not set
54CONFIG_SYSFS_DEPRECATED=y 54CONFIG_SYSFS_DEPRECATED=y
55CONFIG_SYSFS_DEPRECATED_V2=y 55CONFIG_SYSFS_DEPRECATED_V2=y
56# CONFIG_RELAY is not set 56# CONFIG_RELAY is not set
@@ -378,6 +378,7 @@ CONFIG_WIRELESS=y
378# CONFIG_WIRELESS_EXT is not set 378# CONFIG_WIRELESS_EXT is not set
379# CONFIG_LIB80211 is not set 379# CONFIG_LIB80211 is not set
380# CONFIG_MAC80211 is not set 380# CONFIG_MAC80211 is not set
381# CONFIG_WIMAX is not set
381# CONFIG_RFKILL is not set 382# CONFIG_RFKILL is not set
382# CONFIG_NET_9P is not set 383# CONFIG_NET_9P is not set
383 384
@@ -400,6 +401,7 @@ CONFIG_MTD=y
400# CONFIG_MTD_DEBUG is not set 401# CONFIG_MTD_DEBUG is not set
401CONFIG_MTD_CONCAT=y 402CONFIG_MTD_CONCAT=y
402CONFIG_MTD_PARTITIONS=y 403CONFIG_MTD_PARTITIONS=y
404# CONFIG_MTD_TESTS is not set
403# CONFIG_MTD_REDBOOT_PARTS is not set 405# CONFIG_MTD_REDBOOT_PARTS is not set
404CONFIG_MTD_CMDLINE_PARTS=y 406CONFIG_MTD_CMDLINE_PARTS=y
405# CONFIG_MTD_AR7_PARTS is not set 407# CONFIG_MTD_AR7_PARTS is not set
@@ -447,9 +449,7 @@ CONFIG_MTD_CFI_UTIL=y
447# 449#
448# CONFIG_MTD_COMPLEX_MAPPINGS is not set 450# CONFIG_MTD_COMPLEX_MAPPINGS is not set
449CONFIG_MTD_PHYSMAP=y 451CONFIG_MTD_PHYSMAP=y
450CONFIG_MTD_PHYSMAP_START=0xffffffff 452# CONFIG_MTD_PHYSMAP_COMPAT is not set
451CONFIG_MTD_PHYSMAP_LEN=0
452CONFIG_MTD_PHYSMAP_BANKWIDTH=0
453# CONFIG_MTD_PLATRAM is not set 453# CONFIG_MTD_PLATRAM is not set
454 454
455# 455#
@@ -480,6 +480,12 @@ CONFIG_MTD_NAND_SH_FLCTL=y
480# CONFIG_MTD_ONENAND is not set 480# CONFIG_MTD_ONENAND is not set
481 481
482# 482#
483# LPDDR flash memory drivers
484#
485# CONFIG_MTD_LPDDR is not set
486# CONFIG_MTD_QINFO_PROBE is not set
487
488#
483# UBI - Unsorted block images 489# UBI - Unsorted block images
484# 490#
485CONFIG_MTD_UBI=y 491CONFIG_MTD_UBI=y
@@ -607,6 +613,10 @@ CONFIG_SMSC911X=y
607# CONFIG_WLAN_PRE80211 is not set 613# CONFIG_WLAN_PRE80211 is not set
608# CONFIG_WLAN_80211 is not set 614# CONFIG_WLAN_80211 is not set
609# CONFIG_IWLWIFI_LEDS is not set 615# CONFIG_IWLWIFI_LEDS is not set
616
617#
618# Enable WiMAX (Networking options) to see the WiMAX drivers
619#
610# CONFIG_WAN is not set 620# CONFIG_WAN is not set
611# CONFIG_PPP is not set 621# CONFIG_PPP is not set
612# CONFIG_SLIP is not set 622# CONFIG_SLIP is not set
@@ -790,6 +800,7 @@ CONFIG_SSB_POSSIBLE=y
790# CONFIG_PMIC_DA903X is not set 800# CONFIG_PMIC_DA903X is not set
791# CONFIG_MFD_WM8400 is not set 801# CONFIG_MFD_WM8400 is not set
792# CONFIG_MFD_WM8350_I2C is not set 802# CONFIG_MFD_WM8350_I2C is not set
803# CONFIG_MFD_PCF50633 is not set
793# CONFIG_REGULATOR is not set 804# CONFIG_REGULATOR is not set
794 805
795# 806#
@@ -837,7 +848,7 @@ CONFIG_SOC_CAMERA=y
837# CONFIG_SOC_CAMERA_MT9V022 is not set 848# CONFIG_SOC_CAMERA_MT9V022 is not set
838# CONFIG_SOC_CAMERA_TW9910 is not set 849# CONFIG_SOC_CAMERA_TW9910 is not set
839CONFIG_SOC_CAMERA_PLATFORM=y 850CONFIG_SOC_CAMERA_PLATFORM=y
840# CONFIG_SOC_CAMERA_OV772X is not set 851CONFIG_SOC_CAMERA_OV772X=y
841CONFIG_VIDEO_SH_MOBILE_CEU=y 852CONFIG_VIDEO_SH_MOBILE_CEU=y
842# CONFIG_RADIO_ADAPTERS is not set 853# CONFIG_RADIO_ADAPTERS is not set
843# CONFIG_DAB is not set 854# CONFIG_DAB is not set
@@ -1012,6 +1023,7 @@ CONFIG_FS_POSIX_ACL=y
1012CONFIG_FILE_LOCKING=y 1023CONFIG_FILE_LOCKING=y
1013# CONFIG_XFS_FS is not set 1024# CONFIG_XFS_FS is not set
1014# CONFIG_OCFS2_FS is not set 1025# CONFIG_OCFS2_FS is not set
1026# CONFIG_BTRFS_FS is not set
1015CONFIG_DNOTIFY=y 1027CONFIG_DNOTIFY=y
1016CONFIG_INOTIFY=y 1028CONFIG_INOTIFY=y
1017CONFIG_INOTIFY_USER=y 1029CONFIG_INOTIFY_USER=y
@@ -1060,6 +1072,7 @@ CONFIG_MISC_FILESYSTEMS=y
1060# CONFIG_JFFS2_FS is not set 1072# CONFIG_JFFS2_FS is not set
1061# CONFIG_UBIFS_FS is not set 1073# CONFIG_UBIFS_FS is not set
1062# CONFIG_CRAMFS is not set 1074# CONFIG_CRAMFS is not set
1075# CONFIG_SQUASHFS is not set
1063# CONFIG_VXFS_FS is not set 1076# CONFIG_VXFS_FS is not set
1064# CONFIG_MINIX_FS is not set 1077# CONFIG_MINIX_FS is not set
1065# CONFIG_OMFS_FS is not set 1078# CONFIG_OMFS_FS is not set
diff --git a/arch/sh/configs/migor_defconfig b/arch/sh/configs/migor_defconfig
index 7758263514bc..678576796bdf 100644
--- a/arch/sh/configs/migor_defconfig
+++ b/arch/sh/configs/migor_defconfig
@@ -1,7 +1,7 @@
1# 1#
2# Automatically generated make config: don't edit 2# Automatically generated make config: don't edit
3# Linux kernel version: 2.6.28 3# Linux kernel version: 2.6.29-rc1
4# Fri Jan 9 17:09:35 2009 4# Thu Jan 22 09:16:16 2009
5# 5#
6CONFIG_SUPERH=y 6CONFIG_SUPERH=y
7CONFIG_SUPERH32=y 7CONFIG_SUPERH32=y
@@ -45,8 +45,12 @@ CONFIG_SYSVIPC_SYSCTL=y
45CONFIG_IKCONFIG=y 45CONFIG_IKCONFIG=y
46CONFIG_IKCONFIG_PROC=y 46CONFIG_IKCONFIG_PROC=y
47CONFIG_LOG_BUF_SHIFT=14 47CONFIG_LOG_BUF_SHIFT=14
48# CONFIG_CGROUPS is not set
49# CONFIG_GROUP_SCHED is not set 48# CONFIG_GROUP_SCHED is not set
49
50#
51# Control Group support
52#
53# CONFIG_CGROUPS is not set
50CONFIG_SYSFS_DEPRECATED=y 54CONFIG_SYSFS_DEPRECATED=y
51CONFIG_SYSFS_DEPRECATED_V2=y 55CONFIG_SYSFS_DEPRECATED_V2=y
52# CONFIG_RELAY is not set 56# CONFIG_RELAY is not set
@@ -389,6 +393,7 @@ CONFIG_WIRELESS_EXT=y
389CONFIG_WIRELESS_EXT_SYSFS=y 393CONFIG_WIRELESS_EXT_SYSFS=y
390# CONFIG_LIB80211 is not set 394# CONFIG_LIB80211 is not set
391# CONFIG_MAC80211 is not set 395# CONFIG_MAC80211 is not set
396# CONFIG_WIMAX is not set
392# CONFIG_RFKILL is not set 397# CONFIG_RFKILL is not set
393# CONFIG_NET_9P is not set 398# CONFIG_NET_9P is not set
394 399
@@ -411,6 +416,7 @@ CONFIG_MTD=y
411# CONFIG_MTD_DEBUG is not set 416# CONFIG_MTD_DEBUG is not set
412CONFIG_MTD_CONCAT=y 417CONFIG_MTD_CONCAT=y
413CONFIG_MTD_PARTITIONS=y 418CONFIG_MTD_PARTITIONS=y
419# CONFIG_MTD_TESTS is not set
414# CONFIG_MTD_REDBOOT_PARTS is not set 420# CONFIG_MTD_REDBOOT_PARTS is not set
415CONFIG_MTD_CMDLINE_PARTS=y 421CONFIG_MTD_CMDLINE_PARTS=y
416# CONFIG_MTD_AR7_PARTS is not set 422# CONFIG_MTD_AR7_PARTS is not set
@@ -458,9 +464,7 @@ CONFIG_MTD_CFI_UTIL=y
458# 464#
459# CONFIG_MTD_COMPLEX_MAPPINGS is not set 465# CONFIG_MTD_COMPLEX_MAPPINGS is not set
460CONFIG_MTD_PHYSMAP=y 466CONFIG_MTD_PHYSMAP=y
461CONFIG_MTD_PHYSMAP_START=0xffffffff 467# CONFIG_MTD_PHYSMAP_COMPAT is not set
462CONFIG_MTD_PHYSMAP_LEN=0
463CONFIG_MTD_PHYSMAP_BANKWIDTH=0
464# CONFIG_MTD_PLATRAM is not set 468# CONFIG_MTD_PLATRAM is not set
465 469
466# 470#
@@ -488,6 +492,12 @@ CONFIG_MTD_NAND_PLATFORM=y
488# CONFIG_MTD_ONENAND is not set 492# CONFIG_MTD_ONENAND is not set
489 493
490# 494#
495# LPDDR flash memory drivers
496#
497# CONFIG_MTD_LPDDR is not set
498# CONFIG_MTD_QINFO_PROBE is not set
499
500#
491# UBI - Unsorted block images 501# UBI - Unsorted block images
492# 502#
493# CONFIG_MTD_UBI is not set 503# CONFIG_MTD_UBI is not set
@@ -587,6 +597,10 @@ CONFIG_SMC91X=y
587# CONFIG_WLAN_PRE80211 is not set 597# CONFIG_WLAN_PRE80211 is not set
588# CONFIG_WLAN_80211 is not set 598# CONFIG_WLAN_80211 is not set
589# CONFIG_IWLWIFI_LEDS is not set 599# CONFIG_IWLWIFI_LEDS is not set
600
601#
602# Enable WiMAX (Networking options) to see the WiMAX drivers
603#
590# CONFIG_WAN is not set 604# CONFIG_WAN is not set
591# CONFIG_PPP is not set 605# CONFIG_PPP is not set
592# CONFIG_SLIP is not set 606# CONFIG_SLIP is not set
@@ -761,6 +775,7 @@ CONFIG_SSB_POSSIBLE=y
761# CONFIG_PMIC_DA903X is not set 775# CONFIG_PMIC_DA903X is not set
762# CONFIG_MFD_WM8400 is not set 776# CONFIG_MFD_WM8400 is not set
763# CONFIG_MFD_WM8350_I2C is not set 777# CONFIG_MFD_WM8350_I2C is not set
778# CONFIG_MFD_PCF50633 is not set
764# CONFIG_REGULATOR is not set 779# CONFIG_REGULATOR is not set
765 780
766# 781#
@@ -806,9 +821,9 @@ CONFIG_SOC_CAMERA=y
806# CONFIG_SOC_CAMERA_MT9M111 is not set 821# CONFIG_SOC_CAMERA_MT9M111 is not set
807# CONFIG_SOC_CAMERA_MT9T031 is not set 822# CONFIG_SOC_CAMERA_MT9T031 is not set
808# CONFIG_SOC_CAMERA_MT9V022 is not set 823# CONFIG_SOC_CAMERA_MT9V022 is not set
809# CONFIG_SOC_CAMERA_TW9910 is not set 824CONFIG_SOC_CAMERA_TW9910=y
810CONFIG_SOC_CAMERA_PLATFORM=y 825# CONFIG_SOC_CAMERA_PLATFORM is not set
811# CONFIG_SOC_CAMERA_OV772X is not set 826CONFIG_SOC_CAMERA_OV772X=y
812CONFIG_VIDEO_SH_MOBILE_CEU=y 827CONFIG_VIDEO_SH_MOBILE_CEU=y
813# CONFIG_RADIO_ADAPTERS is not set 828# CONFIG_RADIO_ADAPTERS is not set
814# CONFIG_DAB is not set 829# CONFIG_DAB is not set
@@ -866,11 +881,13 @@ CONFIG_USB_GADGET_SELECTED=y
866# CONFIG_USB_GADGET_PXA25X is not set 881# CONFIG_USB_GADGET_PXA25X is not set
867# CONFIG_USB_GADGET_PXA27X is not set 882# CONFIG_USB_GADGET_PXA27X is not set
868# CONFIG_USB_GADGET_S3C2410 is not set 883# CONFIG_USB_GADGET_S3C2410 is not set
884# CONFIG_USB_GADGET_IMX is not set
869CONFIG_USB_GADGET_M66592=y 885CONFIG_USB_GADGET_M66592=y
870CONFIG_USB_M66592=y 886CONFIG_USB_M66592=y
871CONFIG_SUPERH_BUILT_IN_M66592=y 887CONFIG_SUPERH_BUILT_IN_M66592=y
872# CONFIG_USB_GADGET_AMD5536UDC is not set 888# CONFIG_USB_GADGET_AMD5536UDC is not set
873# CONFIG_USB_GADGET_FSL_QE is not set 889# CONFIG_USB_GADGET_FSL_QE is not set
890# CONFIG_USB_GADGET_CI13XXX is not set
874# CONFIG_USB_GADGET_NET2280 is not set 891# CONFIG_USB_GADGET_NET2280 is not set
875# CONFIG_USB_GADGET_GOKU is not set 892# CONFIG_USB_GADGET_GOKU is not set
876# CONFIG_USB_GADGET_DUMMY_HCD is not set 893# CONFIG_USB_GADGET_DUMMY_HCD is not set
@@ -883,6 +900,11 @@ CONFIG_USB_G_SERIAL=y
883# CONFIG_USB_MIDI_GADGET is not set 900# CONFIG_USB_MIDI_GADGET is not set
884# CONFIG_USB_G_PRINTER is not set 901# CONFIG_USB_G_PRINTER is not set
885# CONFIG_USB_CDC_COMPOSITE is not set 902# CONFIG_USB_CDC_COMPOSITE is not set
903
904#
905# OTG and related infrastructure
906#
907# CONFIG_USB_GPIO_VBUS is not set
886# CONFIG_MMC is not set 908# CONFIG_MMC is not set
887# CONFIG_MEMSTICK is not set 909# CONFIG_MEMSTICK is not set
888# CONFIG_NEW_LEDS is not set 910# CONFIG_NEW_LEDS is not set
@@ -961,6 +983,7 @@ CONFIG_UIO_PDRV_GENIRQ=y
961CONFIG_FILE_LOCKING=y 983CONFIG_FILE_LOCKING=y
962# CONFIG_XFS_FS is not set 984# CONFIG_XFS_FS is not set
963# CONFIG_OCFS2_FS is not set 985# CONFIG_OCFS2_FS is not set
986# CONFIG_BTRFS_FS is not set
964# CONFIG_DNOTIFY is not set 987# CONFIG_DNOTIFY is not set
965# CONFIG_INOTIFY is not set 988# CONFIG_INOTIFY is not set
966# CONFIG_QUOTA is not set 989# CONFIG_QUOTA is not set
@@ -1004,6 +1027,7 @@ CONFIG_MISC_FILESYSTEMS=y
1004# CONFIG_EFS_FS is not set 1027# CONFIG_EFS_FS is not set
1005# CONFIG_JFFS2_FS is not set 1028# CONFIG_JFFS2_FS is not set
1006# CONFIG_CRAMFS is not set 1029# CONFIG_CRAMFS is not set
1030# CONFIG_SQUASHFS is not set
1007# CONFIG_VXFS_FS is not set 1031# CONFIG_VXFS_FS is not set
1008# CONFIG_MINIX_FS is not set 1032# CONFIG_MINIX_FS is not set
1009# CONFIG_OMFS_FS is not set 1033# CONFIG_OMFS_FS is not set
diff --git a/arch/sh/include/asm/mutex-llsc.h b/arch/sh/include/asm/mutex-llsc.h
index ee839ee58ac8..090358a7e1bb 100644
--- a/arch/sh/include/asm/mutex-llsc.h
+++ b/arch/sh/include/asm/mutex-llsc.h
@@ -21,38 +21,36 @@
21static inline void 21static inline void
22__mutex_fastpath_lock(atomic_t *count, void (*fail_fn)(atomic_t *)) 22__mutex_fastpath_lock(atomic_t *count, void (*fail_fn)(atomic_t *))
23{ 23{
24 int __ex_flag, __res; 24 int __done, __res;
25 25
26 __asm__ __volatile__ ( 26 __asm__ __volatile__ (
27 "movli.l @%2, %0 \n" 27 "movli.l @%2, %0 \n"
28 "add #-1, %0 \n" 28 "add #-1, %0 \n"
29 "movco.l %0, @%2 \n" 29 "movco.l %0, @%2 \n"
30 "movt %1 \n" 30 "movt %1 \n"
31 : "=&z" (__res), "=&r" (__ex_flag) 31 : "=&z" (__res), "=&r" (__done)
32 : "r" (&(count)->counter) 32 : "r" (&(count)->counter)
33 : "t"); 33 : "t");
34 34
35 __res |= !__ex_flag; 35 if (unlikely(!__done || __res != 0))
36 if (unlikely(__res != 0))
37 fail_fn(count); 36 fail_fn(count);
38} 37}
39 38
40static inline int 39static inline int
41__mutex_fastpath_lock_retval(atomic_t *count, int (*fail_fn)(atomic_t *)) 40__mutex_fastpath_lock_retval(atomic_t *count, int (*fail_fn)(atomic_t *))
42{ 41{
43 int __ex_flag, __res; 42 int __done, __res;
44 43
45 __asm__ __volatile__ ( 44 __asm__ __volatile__ (
46 "movli.l @%2, %0 \n" 45 "movli.l @%2, %0 \n"
47 "add #-1, %0 \n" 46 "add #-1, %0 \n"
48 "movco.l %0, @%2 \n" 47 "movco.l %0, @%2 \n"
49 "movt %1 \n" 48 "movt %1 \n"
50 : "=&z" (__res), "=&r" (__ex_flag) 49 : "=&z" (__res), "=&r" (__done)
51 : "r" (&(count)->counter) 50 : "r" (&(count)->counter)
52 : "t"); 51 : "t");
53 52
54 __res |= !__ex_flag; 53 if (unlikely(!__done || __res != 0))
55 if (unlikely(__res != 0))
56 __res = fail_fn(count); 54 __res = fail_fn(count);
57 55
58 return __res; 56 return __res;
@@ -61,19 +59,18 @@ __mutex_fastpath_lock_retval(atomic_t *count, int (*fail_fn)(atomic_t *))
61static inline void 59static inline void
62__mutex_fastpath_unlock(atomic_t *count, void (*fail_fn)(atomic_t *)) 60__mutex_fastpath_unlock(atomic_t *count, void (*fail_fn)(atomic_t *))
63{ 61{
64 int __ex_flag, __res; 62 int __done, __res;
65 63
66 __asm__ __volatile__ ( 64 __asm__ __volatile__ (
67 "movli.l @%2, %0 \n\t" 65 "movli.l @%2, %0 \n\t"
68 "add #1, %0 \n\t" 66 "add #1, %0 \n\t"
69 "movco.l %0, @%2 \n\t" 67 "movco.l %0, @%2 \n\t"
70 "movt %1 \n\t" 68 "movt %1 \n\t"
71 : "=&z" (__res), "=&r" (__ex_flag) 69 : "=&z" (__res), "=&r" (__done)
72 : "r" (&(count)->counter) 70 : "r" (&(count)->counter)
73 : "t"); 71 : "t");
74 72
75 __res |= !__ex_flag; 73 if (unlikely(!__done || __res <= 0))
76 if (unlikely(__res <= 0))
77 fail_fn(count); 74 fail_fn(count);
78} 75}
79 76
diff --git a/arch/sh/include/asm/syscall_32.h b/arch/sh/include/asm/syscall_32.h
index 05a868a71ef5..5bc34681d994 100644
--- a/arch/sh/include/asm/syscall_32.h
+++ b/arch/sh/include/asm/syscall_32.h
@@ -21,23 +21,10 @@ static inline void syscall_rollback(struct task_struct *task,
21 */ 21 */
22} 22}
23 23
24static inline bool syscall_has_error(struct pt_regs *regs)
25{
26 return (regs->sr & 0x1) ? true : false;
27}
28static inline void syscall_set_error(struct pt_regs *regs)
29{
30 regs->sr |= 0x1;
31}
32static inline void syscall_clear_error(struct pt_regs *regs)
33{
34 regs->sr &= ~0x1;
35}
36
37static inline long syscall_get_error(struct task_struct *task, 24static inline long syscall_get_error(struct task_struct *task,
38 struct pt_regs *regs) 25 struct pt_regs *regs)
39{ 26{
40 return syscall_has_error(regs) ? regs->regs[0] : 0; 27 return IS_ERR_VALUE(regs->regs[0]) ? regs->regs[0] : 0;
41} 28}
42 29
43static inline long syscall_get_return_value(struct task_struct *task, 30static inline long syscall_get_return_value(struct task_struct *task,
@@ -50,13 +37,10 @@ static inline void syscall_set_return_value(struct task_struct *task,
50 struct pt_regs *regs, 37 struct pt_regs *regs,
51 int error, long val) 38 int error, long val)
52{ 39{
53 if (error) { 40 if (error)
54 syscall_set_error(regs);
55 regs->regs[0] = -error; 41 regs->regs[0] = -error;
56 } else { 42 else
57 syscall_clear_error(regs);
58 regs->regs[0] = val; 43 regs->regs[0] = val;
59 }
60} 44}
61 45
62static inline void syscall_get_arguments(struct task_struct *task, 46static inline void syscall_get_arguments(struct task_struct *task,
diff --git a/arch/sh/include/asm/syscall_64.h b/arch/sh/include/asm/syscall_64.h
index e1143b9784d6..c3561ca72bee 100644
--- a/arch/sh/include/asm/syscall_64.h
+++ b/arch/sh/include/asm/syscall_64.h
@@ -21,23 +21,10 @@ static inline void syscall_rollback(struct task_struct *task,
21 */ 21 */
22} 22}
23 23
24static inline bool syscall_has_error(struct pt_regs *regs)
25{
26 return (regs->sr & 0x1) ? true : false;
27}
28static inline void syscall_set_error(struct pt_regs *regs)
29{
30 regs->sr |= 0x1;
31}
32static inline void syscall_clear_error(struct pt_regs *regs)
33{
34 regs->sr &= ~0x1;
35}
36
37static inline long syscall_get_error(struct task_struct *task, 24static inline long syscall_get_error(struct task_struct *task,
38 struct pt_regs *regs) 25 struct pt_regs *regs)
39{ 26{
40 return syscall_has_error(regs) ? regs->regs[9] : 0; 27 return IS_ERR_VALUE(regs->regs[9]) ? regs->regs[9] : 0;
41} 28}
42 29
43static inline long syscall_get_return_value(struct task_struct *task, 30static inline long syscall_get_return_value(struct task_struct *task,
@@ -50,13 +37,10 @@ static inline void syscall_set_return_value(struct task_struct *task,
50 struct pt_regs *regs, 37 struct pt_regs *regs,
51 int error, long val) 38 int error, long val)
52{ 39{
53 if (error) { 40 if (error)
54 syscall_set_error(regs);
55 regs->regs[9] = -error; 41 regs->regs[9] = -error;
56 } else { 42 else
57 syscall_clear_error(regs);
58 regs->regs[9] = val; 43 regs->regs[9] = val;
59 }
60} 44}
61 45
62static inline void syscall_get_arguments(struct task_struct *task, 46static inline void syscall_get_arguments(struct task_struct *task,
diff --git a/arch/sh/kernel/cpu/sh2a/clock-sh7201.c b/arch/sh/kernel/cpu/sh2a/clock-sh7201.c
index 020a96fe961a..4a5e59732334 100644
--- a/arch/sh/kernel/cpu/sh2a/clock-sh7201.c
+++ b/arch/sh/kernel/cpu/sh2a/clock-sh7201.c
@@ -18,8 +18,8 @@
18#include <asm/freq.h> 18#include <asm/freq.h>
19#include <asm/io.h> 19#include <asm/io.h>
20 20
21const static int pll1rate[]={1,2,3,4,6,8}; 21static const int pll1rate[]={1,2,3,4,6,8};
22const static int pfc_divisors[]={1,2,3,4,6,8,12}; 22static const int pfc_divisors[]={1,2,3,4,6,8,12};
23#define ifc_divisors pfc_divisors 23#define ifc_divisors pfc_divisors
24 24
25#if (CONFIG_SH_CLK_MD == 0) 25#if (CONFIG_SH_CLK_MD == 0)
diff --git a/arch/sh/kernel/cpu/sh4/fpu.c b/arch/sh/kernel/cpu/sh4/fpu.c
index 2780917c0088..e3ea5411da6d 100644
--- a/arch/sh/kernel/cpu/sh4/fpu.c
+++ b/arch/sh/kernel/cpu/sh4/fpu.c
@@ -423,7 +423,7 @@ static int ieee_fpe_handler(struct pt_regs *regs)
423 int m; 423 int m;
424 unsigned int hx; 424 unsigned int hx;
425 425
426 m = (finsn >> 9) & 0x7; 426 m = (finsn >> 8) & 0x7;
427 hx = tsk->thread.fpu.hard.fp_regs[m]; 427 hx = tsk->thread.fpu.hard.fp_regs[m];
428 428
429 if ((tsk->thread.fpu.hard.fpscr & FPSCR_CAUSE_ERROR) 429 if ((tsk->thread.fpu.hard.fpscr & FPSCR_CAUSE_ERROR)
diff --git a/arch/sh/kernel/setup.c b/arch/sh/kernel/setup.c
index 534247508572..370d2cfa34eb 100644
--- a/arch/sh/kernel/setup.c
+++ b/arch/sh/kernel/setup.c
@@ -262,11 +262,11 @@ void __init setup_bootmem_allocator(unsigned long free_pfn)
262 BOOTMEM_DEFAULT); 262 BOOTMEM_DEFAULT);
263 263
264 /* 264 /*
265 * reserve physical page 0 - it's a special BIOS page on many boxes, 265 * Reserve physical pages below CONFIG_ZERO_PAGE_OFFSET.
266 * enabling clean reboots, SMP operation, laptop functions.
267 */ 266 */
268 reserve_bootmem(__MEMORY_START, CONFIG_ZERO_PAGE_OFFSET, 267 if (CONFIG_ZERO_PAGE_OFFSET != 0)
269 BOOTMEM_DEFAULT); 268 reserve_bootmem(__MEMORY_START, CONFIG_ZERO_PAGE_OFFSET,
269 BOOTMEM_DEFAULT);
270 270
271 sparse_memory_present_with_active_regions(0); 271 sparse_memory_present_with_active_regions(0);
272 272
diff --git a/arch/sh/kernel/signal_32.c b/arch/sh/kernel/signal_32.c
index 77c21bde376a..17784e19ae34 100644
--- a/arch/sh/kernel/signal_32.c
+++ b/arch/sh/kernel/signal_32.c
@@ -510,7 +510,6 @@ handle_syscall_restart(unsigned long save_r0, struct pt_regs *regs,
510 case -ERESTARTNOHAND: 510 case -ERESTARTNOHAND:
511 no_system_call_restart: 511 no_system_call_restart:
512 regs->regs[0] = -EINTR; 512 regs->regs[0] = -EINTR;
513 regs->sr |= 1;
514 break; 513 break;
515 514
516 case -ERESTARTSYS: 515 case -ERESTARTSYS:
@@ -589,8 +588,7 @@ static void do_signal(struct pt_regs *regs, unsigned int save_r0)
589 588
590 signr = get_signal_to_deliver(&info, &ka, regs, NULL); 589 signr = get_signal_to_deliver(&info, &ka, regs, NULL);
591 if (signr > 0) { 590 if (signr > 0) {
592 if (regs->sr & 1) 591 handle_syscall_restart(save_r0, regs, &ka.sa);
593 handle_syscall_restart(save_r0, regs, &ka.sa);
594 592
595 /* Whee! Actually deliver the signal. */ 593 /* Whee! Actually deliver the signal. */
596 if (handle_signal(signr, &ka, &info, oldset, 594 if (handle_signal(signr, &ka, &info, oldset,
diff --git a/arch/sh/kernel/signal_64.c b/arch/sh/kernel/signal_64.c
index b22fdfaaa191..0663a0ee6021 100644
--- a/arch/sh/kernel/signal_64.c
+++ b/arch/sh/kernel/signal_64.c
@@ -60,7 +60,6 @@ handle_syscall_restart(struct pt_regs *regs, struct sigaction *sa)
60 case -ERESTARTNOHAND: 60 case -ERESTARTNOHAND:
61 no_system_call_restart: 61 no_system_call_restart:
62 regs->regs[REG_RET] = -EINTR; 62 regs->regs[REG_RET] = -EINTR;
63 regs->sr |= 1;
64 break; 63 break;
65 64
66 case -ERESTARTSYS: 65 case -ERESTARTSYS:
@@ -109,8 +108,7 @@ static int do_signal(struct pt_regs *regs, sigset_t *oldset)
109 108
110 signr = get_signal_to_deliver(&info, &ka, regs, 0); 109 signr = get_signal_to_deliver(&info, &ka, regs, 0);
111 if (signr > 0) { 110 if (signr > 0) {
112 if (regs->sr & 1) 111 handle_syscall_restart(regs, &ka.sa);
113 handle_syscall_restart(regs, &ka.sa);
114 112
115 /* Whee! Actually deliver the signal. */ 113 /* Whee! Actually deliver the signal. */
116 if (handle_signal(signr, &info, &ka, oldset, regs) == 0) { 114 if (handle_signal(signr, &info, &ka, oldset, regs) == 0) {
diff --git a/arch/sh/lib/checksum.S b/arch/sh/lib/checksum.S
index cbdd0d40e545..356c8ec92893 100644
--- a/arch/sh/lib/checksum.S
+++ b/arch/sh/lib/checksum.S
@@ -36,8 +36,7 @@
36 */ 36 */
37 37
38/* 38/*
39 * unsigned int csum_partial(const unsigned char *buf, int len, 39 * asmlinkage __wsum csum_partial(const void *buf, int len, __wsum sum);
40 * unsigned int sum);
41 */ 40 */
42 41
43.text 42.text
@@ -49,11 +48,31 @@ ENTRY(csum_partial)
49 * Fortunately, it is easy to convert 2-byte alignment to 4-byte 48 * Fortunately, it is easy to convert 2-byte alignment to 4-byte
50 * alignment for the unrolled loop. 49 * alignment for the unrolled loop.
51 */ 50 */
52 mov r5, r1
53 mov r4, r0 51 mov r4, r0
54 tst #2, r0 ! Check alignment. 52 tst #3, r0 ! Check alignment.
55 bt 2f ! Jump if alignment is ok. 53 bt/s 2f ! Jump if alignment is ok.
54 mov r4, r7 ! Keep a copy to check for alignment
56 ! 55 !
56 tst #1, r0 ! Check alignment.
57 bt 21f ! Jump if alignment is boundary of 2bytes.
58
59 ! buf is odd
60 tst r5, r5
61 add #-1, r5
62 bt 9f
63 mov.b @r4+, r0
64 extu.b r0, r0
65 addc r0, r6 ! t=0 from previous tst
66 mov r6, r0
67 shll8 r6
68 shlr16 r0
69 shlr8 r0
70 or r0, r6
71 mov r4, r0
72 tst #2, r0
73 bt 2f
7421:
75 ! buf is 2 byte aligned (len could be 0)
57 add #-2, r5 ! Alignment uses up two bytes. 76 add #-2, r5 ! Alignment uses up two bytes.
58 cmp/pz r5 ! 77 cmp/pz r5 !
59 bt/s 1f ! Jump if we had at least two bytes. 78 bt/s 1f ! Jump if we had at least two bytes.
@@ -61,16 +80,17 @@ ENTRY(csum_partial)
61 bra 6f 80 bra 6f
62 add #2, r5 ! r5 was < 2. Deal with it. 81 add #2, r5 ! r5 was < 2. Deal with it.
631: 821:
64 mov r5, r1 ! Save new len for later use.
65 mov.w @r4+, r0 83 mov.w @r4+, r0
66 extu.w r0, r0 84 extu.w r0, r0
67 addc r0, r6 85 addc r0, r6
68 bf 2f 86 bf 2f
69 add #1, r6 87 add #1, r6
702: 882:
89 ! buf is 4 byte aligned (len could be 0)
90 mov r5, r1
71 mov #-5, r0 91 mov #-5, r0
72 shld r0, r5 92 shld r0, r1
73 tst r5, r5 93 tst r1, r1
74 bt/s 4f ! if it's =0, go to 4f 94 bt/s 4f ! if it's =0, go to 4f
75 clrt 95 clrt
76 .align 2 96 .align 2
@@ -92,30 +112,31 @@ ENTRY(csum_partial)
92 addc r0, r6 112 addc r0, r6
93 addc r2, r6 113 addc r2, r6
94 movt r0 114 movt r0
95 dt r5 115 dt r1
96 bf/s 3b 116 bf/s 3b
97 cmp/eq #1, r0 117 cmp/eq #1, r0
98 ! here, we know r5==0 118 ! here, we know r1==0
99 addc r5, r6 ! add carry to r6 119 addc r1, r6 ! add carry to r6
1004: 1204:
101 mov r1, r0 121 mov r5, r0
102 and #0x1c, r0 122 and #0x1c, r0
103 tst r0, r0 123 tst r0, r0
104 bt/s 6f 124 bt 6f
105 mov r0, r5 125 ! 4 bytes or more remaining
106 shlr2 r5 126 mov r0, r1
127 shlr2 r1
107 mov #0, r2 128 mov #0, r2
1085: 1295:
109 addc r2, r6 130 addc r2, r6
110 mov.l @r4+, r2 131 mov.l @r4+, r2
111 movt r0 132 movt r0
112 dt r5 133 dt r1
113 bf/s 5b 134 bf/s 5b
114 cmp/eq #1, r0 135 cmp/eq #1, r0
115 addc r2, r6 136 addc r2, r6
116 addc r5, r6 ! r5==0 here, so it means add carry-bit 137 addc r1, r6 ! r1==0 here, so it means add carry-bit
1176: 1386:
118 mov r1, r5 139 ! 3 bytes or less remaining
119 mov #3, r0 140 mov #3, r0
120 and r0, r5 141 and r0, r5
121 tst r5, r5 142 tst r5, r5
@@ -139,8 +160,18 @@ ENTRY(csum_partial)
1398: 1608:
140 addc r0, r6 161 addc r0, r6
141 mov #0, r0 162 mov #0, r0
142 addc r0, r6 163 addc r0, r6
1439: 1649:
165 ! Check if the buffer was misaligned, if so realign sum
166 mov r7, r0
167 tst #1, r0
168 bt 10f
169 mov r6, r0
170 shll8 r6
171 shlr16 r0
172 shlr8 r0
173 or r0, r6
17410:
144 rts 175 rts
145 mov r6, r0 176 mov r6, r0
146 177