Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 81d423e2 authored by Yoshinori Sato's avatar Yoshinori Sato Committed by Linus Torvalds
Browse files

h8300: update timer handler - misc update



- Update selection
- Update common timer handler
- Add support functions

Signed-off-by: default avatarYoshinori Sato <ysato@users.sourceforge.jp>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent e0b0f9e4
Loading
Loading
Loading
Loading
+50 −65
Original line number Diff line number Diff line
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"
+34 −0
Original line number Diff line number Diff line
@@ -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)
+1 −1
Original line number Diff line number Diff line
@@ -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 
+12 −17
Original line number Diff line number Diff line
@@ -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();

	do_timer(1);
#ifndef CONFIG_SMP
	update_process_times(user_mode(regs));
#endif
	if (current->pid)
		profile_tick(CPU_PROFILING);
	write_seqlock(&xtime_lock);
	do_timer(1);
	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 @@ void time_init(void)
	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();
}