Merge remote-tracking branch 'h8300/h8300-next'
authorStephen Rothwell <sfr@canb.auug.org.au>
Wed, 4 Nov 2015 23:25:55 +0000 (10:25 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Wed, 4 Nov 2015 23:25:55 +0000 (10:25 +1100)
12 files changed:
arch/h8300/Makefile
arch/h8300/boot/compressed/Makefile
arch/h8300/boot/compressed/head.S
arch/h8300/boot/compressed/misc.c
arch/h8300/boot/compressed/vmlinux.lds
arch/h8300/boot/dts/edosk2674.dts
arch/h8300/include/asm/io.h
arch/h8300/include/asm/thread_info.h
arch/h8300/kernel/vmlinux.lds.S
drivers/clk/h8300/clk-div.c
drivers/clocksource/h8300_timer8.c
include/asm-generic/uaccess.h

index 0d2d96e..e1c02ca 100644 (file)
@@ -22,7 +22,9 @@ KBUILD_CFLAGS += -DUTS_SYSNAME=\"uClinux\"
 KBUILD_AFLAGS += $(aflags-y)
 LDFLAGS += $(ldflags-y)
 
+ifeq ($(CROSS_COMPILE),)
 CROSS_COMPILE := h8300-unknown-linux-
+endif
 
 core-y += arch/$(ARCH)/kernel/ arch/$(ARCH)/mm/
 ifneq '$(CONFIG_H8300_BUILTIN_DTB)' '""'
index 87d03b7..d7bc3fa 100644 (file)
@@ -14,11 +14,12 @@ OBJECTS = $(obj)/head.o $(obj)/misc.o
 # in order to suppress error message.
 #
 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))))
 
 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
        $(call if_changed,ld)
index 74c0d8c..0436350 100644 (file)
@@ -9,8 +9,8 @@
        .section        .text..startup,"ax"
        .global startup
 startup:
+       mov.l   #startup, sp
        mov.l   er0, er4
-       mov.l   er0, sp
        mov.l   #__sbss, er0
        mov.l   #__ebss, er1
        sub.l   er0, er1
@@ -24,7 +24,7 @@ startup:
        bne     1b
        jsr     @decompress_kernel
        mov.l   er4, er0
-       jmp     @0x400000
+       jmp     @output
 
        .align  9
 fake_headers_as_bzImage:
index c4f2cfc..6029c53 100644 (file)
@@ -28,7 +28,7 @@ static unsigned long free_mem_end_ptr;
 
 extern char input_data[];
 extern int input_len;
-static unsigned char *output;
+extern char output[];
 
 #define HEAP_SIZE             0x10000
 
@@ -56,15 +56,10 @@ void *memcpy(void *dest, const void *src, size_t n)
 
 static void error(char *x)
 {
-
        while (1)
                ;       /* Halt */
 }
 
-#define STACK_SIZE (4096)
-long user_stack[STACK_SIZE];
-long *stack_start = &user_stack[STACK_SIZE];
-
 void decompress_kernel(void)
 {
        free_mem_ptr = (unsigned long)&_end;
index a0a3a0e..44fd209 100644 (file)
@@ -27,6 +27,6 @@ SECTIONS
                 *(.bss*)
         . = ALIGN(0x4) ;
         __ebss = . ;
-        __end = . ;
         }
+        _end = . ;
 }
index dfb5c10..4ce9fa8 100644 (file)
@@ -7,7 +7,7 @@
 
        chosen {
                bootargs = "console=ttySC2,38400";
-               stdout-path = <&sci2>;
+               stdout-path = &sci2;
        };
        aliases {
                serial0 = &sci0;
                compatible = "renesas,h8s2678-pll-clock";
                clocks = <&xclk>;
                #clock-cells = <0>;
-               reg = <0xfee03b 2>, <0xfee045 2>;
+               reg = <0xffff3b 1>, <0xffff45 1>;
        };
        core_clk: core_clk {
                compatible = "renesas,h8300-div-clock";
                clocks = <&pllclk>;
                #clock-cells = <0>;
-               reg = <0xfee03b 2>;
+               reg = <0xffff3b 1>;
                renesas,width = <3>;
        };
        fclk: fclk {
index 1d09b2f..bb837cd 100644 (file)
@@ -36,20 +36,20 @@ static inline void ctrl_outl(unsigned long b, unsigned long addr)
        *(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))
-               __asm__("bclr %1,%0" : : "WU"(addr), "i"(b));
+               __asm__("bclr %1,%0" : "+WU"(*addr): "i"(b));
        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))
-               __asm__("bset %1,%0" : : "WU"(addr), "i"(b));
+               __asm__("bset %1,%0" : "+WU"(*addr): "i"(b));
        else
-               __asm__("bset %w1,%0" : : "WU"(addr), "r"(b));
+               __asm__("bset %w1,%0" : "+WU"(*addr): "r"(b));
 }
 
 #endif /* __KERNEL__ */
index 544c307..b408fe6 100644 (file)
 
 #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__
 
 /*
@@ -46,14 +52,6 @@ struct thread_info {
 #define init_thread_info       (init_thread_union.thread_info)
 #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 */
 static inline struct thread_info *current_thread_info(void)
 {
index 7c302dc..cb5dfb0 100644 (file)
@@ -1,5 +1,6 @@
 #include <asm-generic/vmlinux.lds.h>
 #include <asm/page.h>
+#include <asm/thread_info.h>
 
 #define ROMTOP 0x000000
 #define RAMTOP 0x400000
@@ -42,11 +43,10 @@ SECTIONS
        . = RAMTOP;
        _ramstart = .;
 #define ADDR(x) ROMEND
-#else
 #endif
        _sdata = . ;
        __data_start = . ;
-       RW_DATA_SECTION(0,0,0)
+       RW_DATA_SECTION(0, PAGE_SIZE, THREAD_SIZE)
 #if defined(CONFIG_ROMKERNEL)
 #undef ADDR
 #endif
index 1dd5d14..d71d011 100644 (file)
@@ -19,6 +19,7 @@ static void __init h8300_div_clk_setup(struct device_node *node)
        const char *parent_name;
        void __iomem *divcr = NULL;
        int width;
+       int offset;
 
        num_parents = of_clk_get_parent_count(node);
        if (num_parents < 1) {
@@ -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);
                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);
        of_property_read_u32(node, "renesas,width", &width);
        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);
        if (!IS_ERR(clk)) {
                of_clk_add_provider(node, of_clk_src_simple_get, clk);
index 44375d8..6998486 100644 (file)
@@ -100,11 +100,12 @@ static void timer8_set_next(struct timer8_priv *p, unsigned long delta)
                dev_warn(&p->pdev->dev, "delta out of range\n");
        now = timer8_get_counter(p);
        p->tcora = delta;
-       ctrl_outb(ctrl_inb(p->mapbase + _8TCR) 0x40, p->mapbase + _8TCR);
+       ctrl_outb(ctrl_inb(p->mapbase + _8TCR) & ~0x40, p->mapbase + _8TCR);
        if (delta > now)
                ctrl_outw(delta, p->mapbase + TCORA);
        else
                ctrl_outw(now + 1, p->mapbase + TCORA);
+       ctrl_outb(ctrl_inb(p->mapbase + _8TCR) | 0x40, p->mapbase + _8TCR);
 
        raw_spin_unlock_irqrestore(&p->lock, flags);
 }
@@ -146,6 +147,7 @@ static void timer8_stop(struct timer8_priv *p)
        raw_spin_lock_irqsave(&p->lock, flags);
 
        ctrl_outw(0x0000, p->mapbase + _8TCR);
+       ctrl_outw(0x0000, p->mapbase + _8TCNT);
 
        raw_spin_unlock_irqrestore(&p->lock, flags);
 }
@@ -165,7 +167,6 @@ static void timer8_clock_event_start(struct timer8_priv *p, int periodic)
        ced->mult = div_sc(p->rate, NSEC_PER_SEC, ced->shift);
        ced->max_delta_ns = clockevent_delta2ns(0xffff, ced);
        ced->min_delta_ns = clockevent_delta2ns(0x0001, ced);
-
        timer8_set_next(p, periodic?(p->rate + HZ/2) / HZ:0x10000);
 }
 
index 72d8803..1bfa602 100644 (file)
@@ -163,9 +163,10 @@ static inline __must_check long __copy_to_user(void __user *to,
 
 #define put_user(x, ptr)                                       \
 ({                                                             \
+       void *__p = (ptr);                                      \
        might_fault();                                          \
-       access_ok(VERIFY_WRITE, ptr, sizeof(*ptr)) ?            \
-               __put_user(x, ptr) :                            \
+       access_ok(VERIFY_WRITE, __p, sizeof(*ptr)) ?            \
+               __put_user((x), ((__typeof__(*(ptr)) *)__p)) :  \
                -EFAULT;                                        \
 })
 
@@ -225,9 +226,10 @@ extern int __put_user_bad(void) __attribute__((noreturn));
 
 #define get_user(x, ptr)                                       \
 ({                                                             \
+       const void *__p = (ptr);                                \
        might_fault();                                          \
-       access_ok(VERIFY_READ, ptr, sizeof(*ptr)) ?             \
-               __get_user(x, ptr) :                            \
+       access_ok(VERIFY_READ, __p, sizeof(*ptr)) ?             \
+               __get_user((x), (__typeof__(*(ptr)) *)__p) :    \
                -EFAULT;                                        \
 })