diff options
| author | Geert Uytterhoeven <geert@linux-m68k.org> | 2009-04-05 13:15:10 +0200 | 
|---|---|---|
| committer | Geert Uytterhoeven <geert@linux-m68k.org> | 2010-05-26 19:51:10 +0200 | 
| commit | 0779c862e43e052c58a350a8bd2bf97e6908de04 (patch) | |
| tree | 108eadd3625738e7ad0db1446a96ade7d8939cc5 /arch/m68k/amiga | |
| parent | 6f8221c26be5d80f749b1b6c2e7c8456fefb5250 (diff) | |
| download | linux-0779c862e43e052c58a350a8bd2bf97e6908de04.tar.bz2 | |
m68k: amiga - RTC platform device conversion
The A2000 TOD is an Oki MSM6242B, while the A3000 TOD is a Ricoh RP5C01.
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Diffstat (limited to 'arch/m68k/amiga')
| -rw-r--r-- | arch/m68k/amiga/config.c | 174 | ||||
| -rw-r--r-- | arch/m68k/amiga/platform.c | 17 | 
2 files changed, 17 insertions, 174 deletions
| diff --git a/arch/m68k/amiga/config.c b/arch/m68k/amiga/config.c index d2cc35d98532..b1577f741fa8 100644 --- a/arch/m68k/amiga/config.c +++ b/arch/m68k/amiga/config.c @@ -97,10 +97,6 @@ static void amiga_get_model(char *model);  static void amiga_get_hardware_list(struct seq_file *m);  /* amiga specific timer functions */  static unsigned long amiga_gettimeoffset(void); -static int a3000_hwclk(int, struct rtc_time *); -static int a2000_hwclk(int, struct rtc_time *); -static int amiga_set_clock_mmss(unsigned long); -static unsigned int amiga_get_ss(void);  extern void amiga_mksound(unsigned int count, unsigned int ticks);  static void amiga_reset(void);  extern void amiga_init_sound(void); @@ -138,10 +134,6 @@ static struct {  	}  }; -static struct resource rtc_resource = { -	.start = 0x00dc0000, .end = 0x00dcffff -}; -  static struct resource ram_resource[NUM_MEMINFO]; @@ -387,15 +379,6 @@ void __init config_amiga(void)  	mach_get_model       = amiga_get_model;  	mach_get_hardware_list = amiga_get_hardware_list;  	mach_gettimeoffset   = amiga_gettimeoffset; -	if (AMIGAHW_PRESENT(A3000_CLK)) { -		mach_hwclk         = a3000_hwclk; -		rtc_resource.name = "A3000 RTC"; -		request_resource(&iomem_resource, &rtc_resource); -	} else /* if (AMIGAHW_PRESENT(A2000_CLK)) */ { -		mach_hwclk         = a2000_hwclk; -		rtc_resource.name = "A2000 RTC"; -		request_resource(&iomem_resource, &rtc_resource); -	}  	/*  	 * default MAX_DMA=0xffffffff on all machines. If we don't do so, the SCSI @@ -404,8 +387,6 @@ void __init config_amiga(void)  	 */  	mach_max_dma_address = 0xffffffff; -	mach_set_clock_mmss  = amiga_set_clock_mmss; -	mach_get_ss          = amiga_get_ss;  	mach_reset           = amiga_reset;  #if defined(CONFIG_INPUT_M68K_BEEP) || defined(CONFIG_INPUT_M68K_BEEP_MODULE)  	mach_beep            = amiga_mksound; @@ -530,161 +511,6 @@ static unsigned long amiga_gettimeoffset(void)  	return ticks + offset;  } -static int a3000_hwclk(int op, struct rtc_time *t) -{ -	tod_3000.cntrl1 = TOD3000_CNTRL1_HOLD; - -	if (!op) { /* read */ -		t->tm_sec  = tod_3000.second1 * 10 + tod_3000.second2; -		t->tm_min  = tod_3000.minute1 * 10 + tod_3000.minute2; -		t->tm_hour = tod_3000.hour1   * 10 + tod_3000.hour2; -		t->tm_mday = tod_3000.day1    * 10 + tod_3000.day2; -		t->tm_wday = tod_3000.weekday; -		t->tm_mon  = tod_3000.month1  * 10 + tod_3000.month2 - 1; -		t->tm_year = tod_3000.year1   * 10 + tod_3000.year2; -		if (t->tm_year <= 69) -			t->tm_year += 100; -	} else { -		tod_3000.second1 = t->tm_sec / 10; -		tod_3000.second2 = t->tm_sec % 10; -		tod_3000.minute1 = t->tm_min / 10; -		tod_3000.minute2 = t->tm_min % 10; -		tod_3000.hour1   = t->tm_hour / 10; -		tod_3000.hour2   = t->tm_hour % 10; -		tod_3000.day1    = t->tm_mday / 10; -		tod_3000.day2    = t->tm_mday % 10; -		if (t->tm_wday != -1) -			tod_3000.weekday = t->tm_wday; -		tod_3000.month1  = (t->tm_mon + 1) / 10; -		tod_3000.month2  = (t->tm_mon + 1) % 10; -		if (t->tm_year >= 100) -			t->tm_year -= 100; -		tod_3000.year1   = t->tm_year / 10; -		tod_3000.year2   = t->tm_year % 10; -	} - -	tod_3000.cntrl1 = TOD3000_CNTRL1_FREE; - -	return 0; -} - -static int a2000_hwclk(int op, struct rtc_time *t) -{ -	int cnt = 5; - -	tod_2000.cntrl1 = TOD2000_CNTRL1_HOLD; - -	while ((tod_2000.cntrl1 & TOD2000_CNTRL1_BUSY) && cnt) { -		tod_2000.cntrl1 &= ~TOD2000_CNTRL1_HOLD; -		udelay(70); -		tod_2000.cntrl1 |= TOD2000_CNTRL1_HOLD; -		--cnt; -	} - -	if (!cnt) -		printk(KERN_INFO "hwclk: timed out waiting for RTC (0x%x)\n", -			tod_2000.cntrl1); - -	if (!op) { /* read */ -		t->tm_sec  = tod_2000.second1     * 10 + tod_2000.second2; -		t->tm_min  = tod_2000.minute1     * 10 + tod_2000.minute2; -		t->tm_hour = (tod_2000.hour1 & 3) * 10 + tod_2000.hour2; -		t->tm_mday = tod_2000.day1        * 10 + tod_2000.day2; -		t->tm_wday = tod_2000.weekday; -		t->tm_mon  = tod_2000.month1      * 10 + tod_2000.month2 - 1; -		t->tm_year = tod_2000.year1       * 10 + tod_2000.year2; -		if (t->tm_year <= 69) -			t->tm_year += 100; - -		if (!(tod_2000.cntrl3 & TOD2000_CNTRL3_24HMODE)) { -			if (!(tod_2000.hour1 & TOD2000_HOUR1_PM) && t->tm_hour == 12) -				t->tm_hour = 0; -			else if ((tod_2000.hour1 & TOD2000_HOUR1_PM) && t->tm_hour != 12) -				t->tm_hour += 12; -		} -	} else { -		tod_2000.second1 = t->tm_sec / 10; -		tod_2000.second2 = t->tm_sec % 10; -		tod_2000.minute1 = t->tm_min / 10; -		tod_2000.minute2 = t->tm_min % 10; -		if (tod_2000.cntrl3 & TOD2000_CNTRL3_24HMODE) -			tod_2000.hour1 = t->tm_hour / 10; -		else if (t->tm_hour >= 12) -			tod_2000.hour1 = TOD2000_HOUR1_PM + -				(t->tm_hour - 12) / 10; -		else -			tod_2000.hour1 = t->tm_hour / 10; -		tod_2000.hour2   = t->tm_hour % 10; -		tod_2000.day1    = t->tm_mday / 10; -		tod_2000.day2    = t->tm_mday % 10; -		if (t->tm_wday != -1) -			tod_2000.weekday = t->tm_wday; -		tod_2000.month1  = (t->tm_mon + 1) / 10; -		tod_2000.month2  = (t->tm_mon + 1) % 10; -		if (t->tm_year >= 100) -			t->tm_year -= 100; -		tod_2000.year1   = t->tm_year / 10; -		tod_2000.year2   = t->tm_year % 10; -	} - -	tod_2000.cntrl1 &= ~TOD2000_CNTRL1_HOLD; - -	return 0; -} - -static int amiga_set_clock_mmss(unsigned long nowtime) -{ -	short real_seconds = nowtime % 60, real_minutes = (nowtime / 60) % 60; - -	if (AMIGAHW_PRESENT(A3000_CLK)) { -		tod_3000.cntrl1 = TOD3000_CNTRL1_HOLD; - -		tod_3000.second1 = real_seconds / 10; -		tod_3000.second2 = real_seconds % 10; -		tod_3000.minute1 = real_minutes / 10; -		tod_3000.minute2 = real_minutes % 10; - -		tod_3000.cntrl1 = TOD3000_CNTRL1_FREE; -	} else /* if (AMIGAHW_PRESENT(A2000_CLK)) */ { -		int cnt = 5; - -		tod_2000.cntrl1 |= TOD2000_CNTRL1_HOLD; - -		while ((tod_2000.cntrl1 & TOD2000_CNTRL1_BUSY) && cnt) { -			tod_2000.cntrl1 &= ~TOD2000_CNTRL1_HOLD; -			udelay(70); -			tod_2000.cntrl1 |= TOD2000_CNTRL1_HOLD; -			--cnt; -		} - -		if (!cnt) -			printk(KERN_INFO "set_clock_mmss: timed out waiting for RTC (0x%x)\n", tod_2000.cntrl1); - -		tod_2000.second1 = real_seconds / 10; -		tod_2000.second2 = real_seconds % 10; -		tod_2000.minute1 = real_minutes / 10; -		tod_2000.minute2 = real_minutes % 10; - -		tod_2000.cntrl1 &= ~TOD2000_CNTRL1_HOLD; -	} - -	return 0; -} - -static unsigned int amiga_get_ss(void) -{ -	unsigned int s; - -	if (AMIGAHW_PRESENT(A3000_CLK)) { -		tod_3000.cntrl1 = TOD3000_CNTRL1_HOLD; -		s = tod_3000.second1 * 10 + tod_3000.second2; -		tod_3000.cntrl1 = TOD3000_CNTRL1_FREE; -	} else /* if (AMIGAHW_PRESENT(A2000_CLK)) */ { -		s = tod_2000.second1 * 10 + tod_2000.second2; -	} -	return s; -} -  static NORET_TYPE void amiga_reset(void)      ATTRIB_NORET; diff --git a/arch/m68k/amiga/platform.c b/arch/m68k/amiga/platform.c index c985db029503..7fd8b41723ea 100644 --- a/arch/m68k/amiga/platform.c +++ b/arch/m68k/amiga/platform.c @@ -116,6 +116,13 @@ static const struct gayle_ide_platform_data a4000_ide_pdata __initconst = {  }; +static const struct resource amiga_rtc_resource __initconst = { +	.start	= 0x00dc0000, +	.end	= 0x00dcffff, +	.flags	= IORESOURCE_MEM, +}; + +  static int __init amiga_init_devices(void)  {  	struct platform_device *pdev; @@ -174,6 +181,16 @@ static int __init amiga_init_devices(void)  	if (AMIGAHW_PRESENT(AMI_PARALLEL))  		platform_device_register_simple("amiga-parallel", -1, NULL, 0); + +	/* real time clocks */ +	if (AMIGAHW_PRESENT(A2000_CLK)) +		platform_device_register_simple("rtc-msm6242", -1, +						&amiga_rtc_resource, 1); + +	if (AMIGAHW_PRESENT(A3000_CLK)) +		platform_device_register_simple("rtc-rp5c01", -1, +						&amiga_rtc_resource, 1); +  	return 0;  } |