Commit 7dac7102 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'for-4.4' of git://git.osdn.jp/gitroot/uclinux-h8/linux

Pull h8300 updates from Yoshinori Sato:
 "Some bug fixes"

* tag 'for-4.4' of git://git.osdn.jp/gitroot/uclinux-h8/linux:
  h8300: enable CLKSRC_OF
  h8300: Don't set CROSS_COMPILE unconditionally
  asm-generic: {get,put}_user ptr argument evaluate only 1 time
  h8300: bit io fix
  h8300: zImage fix
  h8300: register address fix
  h8300: Fix alignment for .data
  h8300: unaligned divcr register support.
parents 3370b69e f639eeb4
...@@ -16,6 +16,7 @@ config H8300 ...@@ -16,6 +16,7 @@ config H8300
select OF_EARLY_FLATTREE select OF_EARLY_FLATTREE
select HAVE_MEMBLOCK select HAVE_MEMBLOCK
select HAVE_DMA_ATTRS select HAVE_DMA_ATTRS
select CLKSRC_OF
config RWSEM_GENERIC_SPINLOCK config RWSEM_GENERIC_SPINLOCK
def_bool y def_bool y
......
...@@ -22,7 +22,9 @@ KBUILD_CFLAGS += -DUTS_SYSNAME=\"uClinux\" ...@@ -22,7 +22,9 @@ KBUILD_CFLAGS += -DUTS_SYSNAME=\"uClinux\"
KBUILD_AFLAGS += $(aflags-y) KBUILD_AFLAGS += $(aflags-y)
LDFLAGS += $(ldflags-y) LDFLAGS += $(ldflags-y)
ifeq ($(CROSS_COMPILE),)
CROSS_COMPILE := h8300-unknown-linux- CROSS_COMPILE := h8300-unknown-linux-
endif
core-y += arch/$(ARCH)/kernel/ arch/$(ARCH)/mm/ core-y += arch/$(ARCH)/kernel/ arch/$(ARCH)/mm/
ifneq '$(CONFIG_H8300_BUILTIN_DTB)' '""' ifneq '$(CONFIG_H8300_BUILTIN_DTB)' '""'
......
...@@ -14,11 +14,12 @@ OBJECTS = $(obj)/head.o $(obj)/misc.o ...@@ -14,11 +14,12 @@ OBJECTS = $(obj)/head.o $(obj)/misc.o
# in order to suppress error message. # in order to suppress error message.
# #
CONFIG_MEMORY_START ?= 0x00400000 CONFIG_MEMORY_START ?= 0x00400000
CONFIG_BOOT_LINK_OFFSET ?= 0x00140000 CONFIG_BOOT_LINK_OFFSET ?= 0x00280000
IMAGE_OFFSET := $(shell printf "0x%08x" $$(($(CONFIG_MEMORY_START)+$(CONFIG_BOOT_LINK_OFFSET)))) IMAGE_OFFSET := $(shell printf "0x%08x" $$(($(CONFIG_MEMORY_START)+$(CONFIG_BOOT_LINK_OFFSET))))
LIBGCC := $(shell $(CROSS-COMPILE)$(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name) LIBGCC := $(shell $(CROSS-COMPILE)$(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name)
LDFLAGS_vmlinux := -Ttext $(IMAGE_OFFSET) -estartup $(obj)/vmlinux.lds LDFLAGS_vmlinux := -Ttext $(IMAGE_OFFSET) -estartup -T $(obj)/vmlinux.lds \
--defsym output=$(CONFIG_MEMORY_START)
$(obj)/vmlinux: $(OBJECTS) $(obj)/piggy.o $(LIBGCC) FORCE $(obj)/vmlinux: $(OBJECTS) $(obj)/piggy.o $(LIBGCC) FORCE
$(call if_changed,ld) $(call if_changed,ld)
......
...@@ -9,8 +9,8 @@ ...@@ -9,8 +9,8 @@
.section .text..startup,"ax" .section .text..startup,"ax"
.global startup .global startup
startup: startup:
mov.l #startup, sp
mov.l er0, er4 mov.l er0, er4
mov.l er0, sp
mov.l #__sbss, er0 mov.l #__sbss, er0
mov.l #__ebss, er1 mov.l #__ebss, er1
sub.l er0, er1 sub.l er0, er1
...@@ -24,7 +24,7 @@ startup: ...@@ -24,7 +24,7 @@ startup:
bne 1b bne 1b
jsr @decompress_kernel jsr @decompress_kernel
mov.l er4, er0 mov.l er4, er0
jmp @0x400000 jmp @output
.align 9 .align 9
fake_headers_as_bzImage: fake_headers_as_bzImage:
......
...@@ -28,7 +28,7 @@ static unsigned long free_mem_end_ptr; ...@@ -28,7 +28,7 @@ static unsigned long free_mem_end_ptr;
extern char input_data[]; extern char input_data[];
extern int input_len; extern int input_len;
static unsigned char *output; extern char output[];
#define HEAP_SIZE 0x10000 #define HEAP_SIZE 0x10000
...@@ -56,15 +56,10 @@ void *memcpy(void *dest, const void *src, size_t n) ...@@ -56,15 +56,10 @@ void *memcpy(void *dest, const void *src, size_t n)
static void error(char *x) static void error(char *x)
{ {
while (1) while (1)
; /* Halt */ ; /* Halt */
} }
#define STACK_SIZE (4096)
long user_stack[STACK_SIZE];
long *stack_start = &user_stack[STACK_SIZE];
void decompress_kernel(void) void decompress_kernel(void)
{ {
free_mem_ptr = (unsigned long)&_end; free_mem_ptr = (unsigned long)&_end;
......
...@@ -27,6 +27,6 @@ SECTIONS ...@@ -27,6 +27,6 @@ SECTIONS
*(.bss*) *(.bss*)
. = ALIGN(0x4) ; . = ALIGN(0x4) ;
__ebss = . ; __ebss = . ;
__end = . ;
} }
_end = . ;
} }
...@@ -7,7 +7,7 @@ / { ...@@ -7,7 +7,7 @@ / {
chosen { chosen {
bootargs = "console=ttySC2,38400"; bootargs = "console=ttySC2,38400";
stdout-path = <&sci2>; stdout-path = &sci2;
}; };
aliases { aliases {
serial0 = &sci0; serial0 = &sci0;
...@@ -25,13 +25,13 @@ pllclk: pllclk { ...@@ -25,13 +25,13 @@ pllclk: pllclk {
compatible = "renesas,h8s2678-pll-clock"; compatible = "renesas,h8s2678-pll-clock";
clocks = <&xclk>; clocks = <&xclk>;
#clock-cells = <0>; #clock-cells = <0>;
reg = <0xfee03b 2>, <0xfee045 2>; reg = <0xffff3b 1>, <0xffff45 1>;
}; };
core_clk: core_clk { core_clk: core_clk {
compatible = "renesas,h8300-div-clock"; compatible = "renesas,h8300-div-clock";
clocks = <&pllclk>; clocks = <&pllclk>;
#clock-cells = <0>; #clock-cells = <0>;
reg = <0xfee03b 2>; reg = <0xffff3b 1>;
renesas,width = <3>; renesas,width = <3>;
}; };
fclk: fclk { fclk: fclk {
......
...@@ -36,20 +36,20 @@ static inline void ctrl_outl(unsigned long b, unsigned long addr) ...@@ -36,20 +36,20 @@ static inline void ctrl_outl(unsigned long b, unsigned long addr)
*(volatile unsigned long *)addr = b; *(volatile unsigned long *)addr = b;
} }
static inline void ctrl_bclr(int b, unsigned long addr) static inline void ctrl_bclr(int b, unsigned char *addr)
{ {
if (__builtin_constant_p(b)) if (__builtin_constant_p(b))
__asm__("bclr %1,%0" : : "WU"(addr), "i"(b)); __asm__("bclr %1,%0" : "+WU"(*addr): "i"(b));
else else
__asm__("bclr %w1,%0" : : "WU"(addr), "r"(b)); __asm__("bclr %w1,%0" : "+WU"(*addr): "r"(b));
} }
static inline void ctrl_bset(int b, unsigned long addr) static inline void ctrl_bset(int b, unsigned char *addr)
{ {
if (__builtin_constant_p(b)) if (__builtin_constant_p(b))
__asm__("bset %1,%0" : : "WU"(addr), "i"(b)); __asm__("bset %1,%0" : "+WU"(*addr): "i"(b));
else else
__asm__("bset %w1,%0" : : "WU"(addr), "r"(b)); __asm__("bset %w1,%0" : "+WU"(*addr): "r"(b));
} }
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
......
...@@ -13,6 +13,12 @@ ...@@ -13,6 +13,12 @@
#ifdef __KERNEL__ #ifdef __KERNEL__
/*
* Size of kernel stack for each process. This must be a power of 2...
*/
#define THREAD_SIZE_ORDER 1
#define THREAD_SIZE 8192 /* 2 pages */
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
/* /*
...@@ -46,14 +52,6 @@ struct thread_info { ...@@ -46,14 +52,6 @@ struct thread_info {
#define init_thread_info (init_thread_union.thread_info) #define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack) #define init_stack (init_thread_union.stack)
/*
* Size of kernel stack for each process. This must be a power of 2...
*/
#define THREAD_SIZE_ORDER 1
#define THREAD_SIZE 8192 /* 2 pages */
/* how to get the thread information struct from C */ /* how to get the thread information struct from C */
static inline struct thread_info *current_thread_info(void) static inline struct thread_info *current_thread_info(void)
{ {
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <linux/clk-provider.h> #include <linux/clk-provider.h>
#include <linux/memblock.h> #include <linux/memblock.h>
#include <linux/screen_info.h> #include <linux/screen_info.h>
#include <linux/clocksource.h>
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/irq.h> #include <asm/irq.h>
...@@ -252,4 +253,5 @@ void __init calibrate_delay(void) ...@@ -252,4 +253,5 @@ void __init calibrate_delay(void)
void __init time_init(void) void __init time_init(void)
{ {
of_clk_init(NULL); of_clk_init(NULL);
clocksource_probe();
} }
#include <asm-generic/vmlinux.lds.h> #include <asm-generic/vmlinux.lds.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/thread_info.h>
#define ROMTOP 0x000000 #define ROMTOP 0x000000
#define RAMTOP 0x400000 #define RAMTOP 0x400000
...@@ -42,11 +43,10 @@ SECTIONS ...@@ -42,11 +43,10 @@ SECTIONS
. = RAMTOP; . = RAMTOP;
_ramstart = .; _ramstart = .;
#define ADDR(x) ROMEND #define ADDR(x) ROMEND
#else
#endif #endif
_sdata = . ; _sdata = . ;
__data_start = . ; __data_start = . ;
RW_DATA_SECTION(0,0,0) RW_DATA_SECTION(0, PAGE_SIZE, THREAD_SIZE)
#if defined(CONFIG_ROMKERNEL) #if defined(CONFIG_ROMKERNEL)
#undef ADDR #undef ADDR
#endif #endif
......
...@@ -19,6 +19,7 @@ static void __init h8300_div_clk_setup(struct device_node *node) ...@@ -19,6 +19,7 @@ static void __init h8300_div_clk_setup(struct device_node *node)
const char *parent_name; const char *parent_name;
void __iomem *divcr = NULL; void __iomem *divcr = NULL;
int width; int width;
int offset;
num_parents = of_clk_get_parent_count(node); num_parents = of_clk_get_parent_count(node);
if (num_parents < 1) { if (num_parents < 1) {
...@@ -31,11 +32,14 @@ static void __init h8300_div_clk_setup(struct device_node *node) ...@@ -31,11 +32,14 @@ static void __init h8300_div_clk_setup(struct device_node *node)
pr_err("%s: failed to map divide register", clk_name); pr_err("%s: failed to map divide register", clk_name);
goto error; goto error;
} }
offset = (unsigned long)divcr & 3;
offset = (3 - offset) * 8;
divcr = (void *)((unsigned long)divcr & ~3);
parent_name = of_clk_get_parent_name(node, 0); parent_name = of_clk_get_parent_name(node, 0);
of_property_read_u32(node, "renesas,width", &width); of_property_read_u32(node, "renesas,width", &width);
clk = clk_register_divider(NULL, clk_name, parent_name, clk = clk_register_divider(NULL, clk_name, parent_name,
CLK_SET_RATE_GATE, divcr, 0, width, CLK_SET_RATE_GATE, divcr, offset, width,
CLK_DIVIDER_POWER_OF_TWO, &clklock); CLK_DIVIDER_POWER_OF_TWO, &clklock);
if (!IS_ERR(clk)) { if (!IS_ERR(clk)) {
of_clk_add_provider(node, of_clk_src_simple_get, clk); of_clk_add_provider(node, of_clk_src_simple_get, clk);
......
...@@ -163,9 +163,10 @@ static inline __must_check long __copy_to_user(void __user *to, ...@@ -163,9 +163,10 @@ static inline __must_check long __copy_to_user(void __user *to,
#define put_user(x, ptr) \ #define put_user(x, ptr) \
({ \ ({ \
void *__p = (ptr); \
might_fault(); \ might_fault(); \
access_ok(VERIFY_WRITE, ptr, sizeof(*ptr)) ? \ access_ok(VERIFY_WRITE, __p, sizeof(*ptr)) ? \
__put_user(x, ptr) : \ __put_user((x), ((__typeof__(*(ptr)) *)__p)) : \
-EFAULT; \ -EFAULT; \
}) })
...@@ -225,9 +226,10 @@ extern int __put_user_bad(void) __attribute__((noreturn)); ...@@ -225,9 +226,10 @@ extern int __put_user_bad(void) __attribute__((noreturn));
#define get_user(x, ptr) \ #define get_user(x, ptr) \
({ \ ({ \
const void *__p = (ptr); \
might_fault(); \ might_fault(); \
access_ok(VERIFY_READ, ptr, sizeof(*ptr)) ? \ access_ok(VERIFY_READ, __p, sizeof(*ptr)) ? \
__get_user(x, ptr) : \ __get_user((x), (__typeof__(*(ptr)) *)__p) : \
-EFAULT; \ -EFAULT; \
}) })
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment