h8300 update timer handler - misc update
PATCH 3/3 h8300 update timer handler - misc update
- Update selection
- Update common timer handler
- Add support functions
Signed-off-by Yoshinori Sato <[email protected]>
arch/h8300/Kconfig.cpu +50 -65
@@ -1,5 +1,7 @@ menu "Processor type and features" +source "kernel/time/Kconfig" + choice prompt "H8/300 platform" default H8300H_GENERIC
@@ -11,6 +13,7 @@ config H8300H_GENERIC config H8300H_AKI3068NET bool "AE-3068/69" + select CONFIG_H83068 help AKI-H8/3068F / AKI-H8/3069F Flashmicom LAN Board Support More Information. (Japanese Only)
@@ -21,6 +24,7 @@ config H8300H_AKI3068NET config H8300H_H8MAX bool "H8MAX" + select CONFIG_H83068 help H8MAX Evaluation Board Support More Information. (Japanese Only)
@@ -28,6 +32,7 @@ config H8300H_H8MAX config H8300H_SIM bool "H8/300H Simulator" + select CONFIG_H83007 help GDB Simulator Support More Information.
@@ -40,6 +45,7 @@ config H8S_GENERIC config H8S_EDOSK2674 bool "EDOSK-2674" + select CONFIG_H8S2768 help Renesas EDOSK-2674 Evaluation Board Support More Information.
@@ -55,44 +61,37 @@ config H8S_SIM endchoice -if (H8300H_GENERIC || H8S_GENERIC) -menu "Detail Selection" -if (H8300H_GENERIC) choice prompt "CPU Selection" config H83002 bool "H8/3001,3002,3003" + select CPU_H8300H config H83007 bool "H8/3006,3007" + select CPU_H8300H config H83048 bool "H8/3044,3045,3046,3047,3048,3052" + select CPU_H8300H config H83068 bool "H8/3065,3066,3067,3068,3069" -endchoice -endif - -if (H8S_GENERIC) -choice - prompt "CPU Selection" + select CPU_H8300H config H8S2678 bool "H8S/2670,2673,2674R,2675,2676" + select CPU_H8S + endchoice -endif config CPU_CLOCK int "CPU Clock Frequency (/1KHz)" default "20000" help CPU Clock Frequency divide to 1000 -endmenu -endif -if (H8300H_GENERIC || H8S_GENERIC || H8300H_SIM || H8S_SIM || H8S_EDOSK2674) choice prompt "Kernel executes from" ---help---
@@ -107,75 +106,61 @@ config ROMKERNEL bool "ROM" help The kernel will be resident in FLASH/ROM when running. - endchoice -endif -if (H8300H_AKI3068NET) -config H83068 - bool - default y -config CPU_CLOCK - int - default "20000" - -config RAMKERNEL +config CPU_H8300H bool + depends on (H83002 || H83007 || H83048 || H83068) default y -endif -if (H8300H_H8MAX) -config H83068 +config CPU_H8S bool + depends on H8S2678 default y -config CPU_CLOCK - int - default 25000 +choice + prompt "Timer" +config H8300_TIMER8 + bool "8bit timer (2ch cascade)" + depends on (H83007 || H83068 || H8S2678) -config RAMKERNEL - bool - default y -endif +config H8300_TIMER16 + bool "16bit timer" + depends on (H83007 || H83068) -if (H8300H_SIM) -config H83007 - bool - default y +config H8300_ITU + bool "ITU" + depends on (H83002 || H83048) -config CPU_CLOCK - int - default "16000" -endif +config H8300_TPU + bool "TPU" + depends on H8S2678 +endchoice -if (H8S_EDOSK2674) -config H8S2678 - bool - default y -config CPU_CLOCK - int - default 33000 +if H8300_TIMER8 +choice + prompt "Timer Channel" +config H8300_TIMER8_CH0 + bool "Channel 0" +config H8300_TIMER8_CH2 + bool "Channel 2" + depends on CPU_H8300H +endchoice endif -if (H8S_SIM) -config H8S2678 - bool - default y -config CPU_CLOCK - int - default 33000 -endif +config H8300_TIMER16_CH + int "16bit timer channel (0 - 2)" + depends on H8300_TIMER16 + range 0 2 -config CPU_H8300H - bool - depends on (H83002 || H83007 || H83048 || H83068) - default y +config H8300_ITU_CH + int "ITU channel" + depends on H8300_ITU -config CPU_H8S - bool - depends on H8S2678 - default y +config H8300_TPU_CH + int "TPU channel" + depends on H8300_TPU config PREEMPT bool "Preemptible Kernel"
arch/h8300/kernel/Makefile +1 -1
@@ -7,6 +7,6 @@ extra-y := vmlinux.lds obj-y := process.o traps.o ptrace.o irq.o \ sys_h8300.o time.o signal.o \ setup.o gpio.o init_task.o syscalls.o \ - entry.o + entry.o timer/ obj-$(CONFIG_MODULES) += module.o h8300_ksyms.o
arch/h8300/kernel/time.c +12 -17
@@ -27,27 +27,21 @@#include <linux/profile.h> #include <asm/io.h> -#include <asm/target_time.h> +#include <asm/timer.h> #define TICK_SIZE (tick_nsec / 1000) -/* -* timer_interrupt() needs to keep up the real-time clock, -* as well as call the "do_timer()" routine every clocktick -*/ -static void timer_interrupt (int irq,void *dummy,struct pt_regs * regs) +void h8300_timer_tick (void ) { -/* may need to kick the hardware timer */ -platform_timer_eoi (); - +if (current->pid) +profile_tick (CPU_PROFILING ); +write_seqlock (&xtime_lock);do_timer (1 ); -#ifndef CONFIG_SMP -update_process_times (user_mode (regs)); -#endif -profile_tick (CPU_PROFILING ); +write_sequnlock (&xtime_lock); +update_process_times (user_mode (get_irq_regs ())); } -void time_init (void ) +void __init time_init (void ) {unsigned int year, mon, day, hour, min, sec;
@@ -57,12 +51,13 @@ year =1980 ; mon = day =1 ; hour = min = sec =0 ; -platform_gettod (&year, &mon, &day, &hour, &min, &sec); - +#ifdef CONFIG_H8300_GETTOD +h8300_gettod (&year, &mon, &day, &hour, &min, &sec); +#endif if ((year +=1900 ) <1970 ) year +=100 ; xtime.tv_sec =mktime (year, mon, day, hour, min, sec); xtime.tv_nsec =0 ; -platform_timer_setup (timer_interrupt); +h8300_timer_setup (); }
include/asm-h8300/io.h +34 -0
@@ -295,6 +295,40 @@ 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) +{ +if (__builtin_constant_p (b)) +switch (b) { +case 0 : __asm__("bclr #0,@%0" ::"r" (addr));break ; +case 1 : __asm__("bclr #1,@%0" ::"r" (addr));break ; +case 2 : __asm__("bclr #2,@%0" ::"r" (addr));break ; +case 3 : __asm__("bclr #3,@%0" ::"r" (addr));break ; +case 4 : __asm__("bclr #4,@%0" ::"r" (addr));break ; +case 5 : __asm__("bclr #5,@%0" ::"r" (addr));break ; +case 6 : __asm__("bclr #6,@%0" ::"r" (addr));break ; +case 7 : __asm__("bclr #7,@%0" ::"r" (addr));break ; + } +else + __asm__("bclr %w0,@%1" ::"r" (b),"r" (addr)); +} + +static __inline__void ctrl_bset (int b,unsigned long addr) +{ +if (__builtin_constant_p (b)) +switch (b) { +case 0 : __asm__("bset #0,@%0" ::"r" (addr));break ; +case 1 : __asm__("bset #1,@%0" ::"r" (addr));break ; +case 2 : __asm__("bset #2,@%0" ::"r" (addr));break ; +case 3 : __asm__("bset #3,@%0" ::"r" (addr));break ; +case 4 : __asm__("bset #4,@%0" ::"r" (addr));break ; +case 5 : __asm__("bset #5,@%0" ::"r" (addr));break ; +case 6 : __asm__("bset #6,@%0" ::"r" (addr));break ; +case 7 : __asm__("bset #7,@%0" ::"r" (addr));break ; + } +else + __asm__("bset %w0,@%1" ::"r" (b),"r" (addr)); +} +/* Pages to physical address... */ #define page_to_phys (page) ((page - mem_map) << PAGE_SHIFT)#define page_to_bus (page) ((page - mem_map) << PAGE_SHIFT)
Signature · 2 lines
Yoshinori Sato <[email protected]>