diff --git a/arch/sparc/cpu/leon2/cpu_init.c b/arch/sparc/cpu/leon2/cpu_init.c
index b4d91e5..9dfb99c 100644
--- a/arch/sparc/cpu/leon2/cpu_init.c
+++ b/arch/sparc/cpu/leon2/cpu_init.c
@@ -14,9 +14,6 @@
 
 #include <config.h>
 
-#define TIMER_BASE_CLK 1000000
-#define US_PER_TICK (1000000 / CONFIG_SYS_HZ)
-
 DECLARE_GLOBAL_DATA_PTR;
 
 /*
@@ -77,48 +74,8 @@
 	return 0;
 }
 
-/* Uses Timer 0 to get accurate
- * pauses. Max 2 raised to 32 ticks
- *
- */
-void cpu_wait_ticks(unsigned long ticks)
-{
-	unsigned long start = get_timer(0);
-	while (get_timer(start) < ticks) ;
-}
-
-/* initiate and setup timer0 interrupt to configured HZ. Base clock is 1MHz.
- * Return irq number for timer int or a negative number for
- * dealing with self
- */
-int timer_interrupt_init_cpu(void)
-{
-	LEON2_regs *leon2 = (LEON2_regs *) LEON2_PREGS;
-
-	/* SYS_HZ ticks per second */
-	leon2->Timer_Counter_1 = 0;
-	leon2->Timer_Reload_1 = (TIMER_BASE_CLK / CONFIG_SYS_HZ) - 1;
-	leon2->Timer_Control_1 =
-	    (LEON2_TIMER_CTRL_EN | LEON2_TIMER_CTRL_RS | LEON2_TIMER_CTRL_LD);
-
-	return LEON2_TIMER1_IRQNO;
-}
-
-/*
- * This function is intended for SHORT delays only.
+/* initiate and setup timer0 to configured HZ. Base clock is 1MHz.
  */
-unsigned long cpu_usec2ticks(unsigned long usec)
-{
-	if (usec < US_PER_TICK)
-		return 1;
-	return usec / US_PER_TICK;
-}
-
-unsigned long cpu_ticks2usec(unsigned long ticks)
-{
-	return ticks * US_PER_TICK;
-}
-
 int timer_init(void)
 {
 	LEON2_regs *leon2 = (LEON2_regs *)LEON2_PREGS;
diff --git a/arch/sparc/cpu/leon2/interrupts.c b/arch/sparc/cpu/leon2/interrupts.c
index f78ec8a..602e4a6 100644
--- a/arch/sparc/cpu/leon2/interrupts.c
+++ b/arch/sparc/cpu/leon2/interrupts.c
@@ -118,20 +118,6 @@
 
 /****************************************************************************/
 
-/* Handle Timer 0 IRQ */
-void timer_interrupt_cpu(void *arg)
-{
-	LEON2_regs *leon2 = (LEON2_regs *) LEON2_PREGS;
-
-	leon2->Timer_Control_1 =
-	    (LEON2_TIMER_CTRL_EN | LEON2_TIMER_CTRL_RS | LEON2_TIMER_CTRL_LD);
-
-	/* nothing to do here */
-	return;
-}
-
-/****************************************************************************/
-
 /*
  * Install and free a interrupt handler.
  */
diff --git a/arch/sparc/cpu/leon3/cpu_init.c b/arch/sparc/cpu/leon3/cpu_init.c
index 9e294bf..f25388c 100644
--- a/arch/sparc/cpu/leon3/cpu_init.c
+++ b/arch/sparc/cpu/leon3/cpu_init.c
@@ -11,7 +11,6 @@
 #include <asm/asi.h>
 #include <asm/leon.h>
 #include <asm/io.h>
-#include <asm/irq.h>
 #include <ambapp.h>
 #include <grlib/irqmp.h>
 #include <grlib/gptimer.h>
@@ -29,9 +28,6 @@
 #define CONFIG_SYS_GRLIB_GPTIMER_INDEX 0
 #endif
 
-#define TIMER_BASE_CLK 1000000
-#define US_PER_TICK (1000000 / CONFIG_SYS_HZ)
-
 DECLARE_GLOBAL_DATA_PTR;
 
 ambapp_dev_irqmp *irqmp = NULL;
@@ -142,63 +138,7 @@
 	return 0;
 }
 
-/* Busy wait a number of ms */
-void cpu_wait_ms_busy(unsigned long ms)
-{
-	unsigned int ms_delay;
-	volatile unsigned int tmp;
-
-	/* ~10-20 cycles per decrement */
-	ms_delay = leon_cpu_freq / (1000 * 10);
-	do {
-		/* Wait ~1ms */
-		tmp = ms_delay;
-		while (tmp-- > 0)
 			;
-	} while (--ms > 0);
-}
-
-/* Uses Timer 0 to get accurate
- * pauses. Max 2 raised to 32 ticks
- *
- */
-void cpu_wait_ticks(unsigned long ticks)
-{
-	unsigned long start;
-
-	if (interrupt_is_enabled()) {
-		start = get_timer(0);
-		while (get_timer(start) < ticks)
-			;
-	} else {
-		/* Interrupts disabled, this means that we cannot
-		 * use get_timer(), it relies on IRQ. Instead the
-		 * CPU frequency is used.
-		 */
-		cpu_wait_ms_busy(ticks2usec(ticks) / 1000);
-	}
-}
-
-int timer_interrupt_init_cpu(void)
-{
-	return -1;
-}
-
-/*
- * This function is intended for SHORT delays only.
- */
-unsigned long cpu_usec2ticks(unsigned long usec)
-{
-	if (usec < US_PER_TICK)
-		return 1;
-	return usec / US_PER_TICK;
-}
-
-unsigned long cpu_ticks2usec(unsigned long ticks)
-{
-	return ticks * US_PER_TICK;
-}
-
 int timer_init(void)
 {
 	ambapp_dev_gptimer_element *tmr;
diff --git a/arch/sparc/cpu/leon3/interrupts.c b/arch/sparc/cpu/leon3/interrupts.c
index 2312b58..00c3288 100644
--- a/arch/sparc/cpu/leon3/interrupts.c
+++ b/arch/sparc/cpu/leon3/interrupts.c
@@ -124,17 +124,6 @@
 
 /****************************************************************************/
 
-/* Handle Timer 0 IRQ */
-void timer_interrupt_cpu(void *arg)
-{
-	gptimer->e[0].ctrl = (GPTIMER_CTRL_EN | GPTIMER_CTRL_RS |
-			      GPTIMER_CTRL_LD | GPTIMER_CTRL_IE);
-	/* nothing to do here */
-	return;
-}
-
-/****************************************************************************/
-
 /*
  * Install and free a interrupt handler.
  */
diff --git a/arch/sparc/include/asm/u-boot.h b/arch/sparc/include/asm/u-boot.h
index 4c4b5f2..9b9a71d5 100644
--- a/arch/sparc/include/asm/u-boot.h
+++ b/arch/sparc/include/asm/u-boot.h
@@ -2,56 +2,23 @@
  * (C) Copyright 2000 - 2002
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  *
- * (C) Copyright 2007, From asm-ppc/u-boot.h
- * Daniel Hellstrom, Gaisler Research, daniel@gaisler.com.
+ * (C) Copyright 2007, 2015
+ * Daniel Hellstrom, Cobham Gaisler, daniel@gaisler.com.
  *
  * SPDX-License-Identifier:	GPL-2.0+
- ********************************************************************
- * NOTE: This header file defines an interface to U-Boot. Including
- * this (unmodified) header file in another file is considered normal
- * use of U-Boot, and does *not* fall under the heading of "derived
- * work".
- ********************************************************************
  */
 
 #ifndef __U_BOOT_H__
 #define __U_BOOT_H__
 
-#ifdef CONFIG_SYS_GENERIC_BOARD
-/* Use the generic board which requires a unified bd_info */
-#include <asm-generic/u-boot.h>
-#else
-
-/*
- * Currently, this Board information is not passed to
+/* Currently, this board information is not passed to
  * Linux kernel from U-Boot, but may be passed to other
  * Operating systems. This is because U-boot emulates
  * a SUN PROM loader (from Linux point of view).
- *
- * include/asm-sparc/u-boot.h
  */
-
-#ifndef __ASSEMBLY__
-
-typedef struct bd_info {
-	unsigned long bi_memstart;	/* start of DRAM memory */
-	phys_size_t bi_memsize;		/* size  of DRAM memory in bytes */
-	unsigned long bi_flashstart;	/* start of FLASH memory */
-	unsigned long bi_flashsize;	/* size  of FLASH memory */
-	unsigned long bi_flashoffset;	/* reserved area for startup monitor */
-	unsigned long bi_sramstart;	/* start of SRAM memory */
-	unsigned long bi_sramsize;	/* size  of SRAM memory */
-	unsigned long bi_bootflags;	/* boot / reboot flag (for LynxOS) */
-	unsigned short bi_ethspeed;	/* Ethernet speed in Mbps */
-	unsigned long bi_intfreq;	/* Internal Freq, in MHz */
-	unsigned long bi_busfreq;	/* Bus Freq, in MHz */
-} bd_t;
-
-#endif				/* __ASSEMBLY__ */
-
-#endif /* !CONFIG_SYS_GENERIC_BOARD */
+#include <asm-generic/u-boot.h>
 
 /* For image.h:image_check_target_arch() */
 #define IH_ARCH_DEFAULT IH_ARCH_SPARC
 
-#endif				/* __U_BOOT_H__ */
+#endif
diff --git a/arch/sparc/lib/Makefile b/arch/sparc/lib/Makefile
index 6bddd4c..6b7ad6d 100644
--- a/arch/sparc/lib/Makefile
+++ b/arch/sparc/lib/Makefile
@@ -5,9 +5,5 @@
 # SPDX-License-Identifier:	GPL-2.0+
 #
 
-obj-y = cache.o interrupts.o time.o
+obj-y = cache.o interrupts.o
 obj-$(CONFIG_CMD_BOOTM) += bootm.o
-
-ifndef CONFIG_SYS_GENERIC_BOARD
-obj-y += board.o
-endif
diff --git a/arch/sparc/lib/board.c b/arch/sparc/lib/board.c
deleted file mode 100644
index 10475d1..0000000
--- a/arch/sparc/lib/board.c
+++ /dev/null
@@ -1,398 +0,0 @@
-/* SPARC Board initialization
- *
- * (C) Copyright 2000-2006
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * (C) Copyright 2007
- * Daniel Hellstrom, Gaisler Research, daniel@gaisler.com.
- *
- * SPDX-License-Identifier:	GPL-2.0+
- */
-
-#include <common.h>
-#include <command.h>
-#include <console.h>
-#include <malloc.h>
-#include <stdio_dev.h>
-#include <config.h>
-#if defined(CONFIG_CMD_IDE)
-#include <ide.h>
-#endif
-#ifdef CONFIG_STATUS_LED
-#include <status_led.h>
-#endif
-#include <net.h>
-#include <serial.h>
-#include <version.h>
-#if defined(CONFIG_POST)
-#include <post.h>
-#endif
-#ifdef CONFIG_PS2KBD
-#include <keyboard.h>
-#endif
-#ifdef CONFIG_CMD_AMBAPP
-#include <ambapp.h>
-#endif
-
-#ifdef CONFIG_BITBANGMII
-#include <miiphy.h>
-#endif
-
-DECLARE_GLOBAL_DATA_PTR;
-
-/* Debug options
-#define DEBUG_INIT_SEQUENCE
-#define DEBUG_MEM_LAYOUT
-#define DEBUG_COMMANDS
-*/
-
-extern void timer_interrupt_init(void);
-extern int do_ambapp_print(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[]);
-extern int prom_init(void);
-
-#if defined(CONFIG__CMD_DOC)
-void doc_init(void);
-#endif
-
-#if !defined(CONFIG_SYS_NO_FLASH)
-static char *failed = "*** failed ***\n";
-#endif
-
-#include <environment.h>
-
-ulong monitor_flash_len;
-
-/************************************************************************
- * Init Utilities							*
- ************************************************************************
- * Some of this code should be moved into the core functions,
- * but let's get it working (again) first...
- */
-
-static int init_baudrate(void)
-{
-	gd->baudrate = getenv_ulong("baudrate", 10, CONFIG_BAUDRATE);
-	return 0;
-}
-
-/***********************************************************************/
-
-/*
- * All attempts to come up with a "common" initialization sequence
- * that works for all boards and architectures failed: some of the
- * requirements are just _too_ different. To get rid of the resulting
- * mess of board dependend #ifdef'ed code we now make the whole
- * initialization sequence configurable to the user.
- *
- * The requirements for any new initalization function is simple: it
- * receives a pointer to the "global data" structure as it's only
- * argument, and returns an integer return code, where 0 means
- * "continue" and != 0 means "fatal error, hang the system".
- */
-typedef int (init_fnc_t) (void);
-
-#define WATCHDOG_RESET(x)
-
-/************************************************************************
- * Initialization sequence						*
- ************************************************************************
- */
-
-init_fnc_t *init_sequence[] = {
-
-#if defined(CONFIG_BOARD_EARLY_INIT_F)
-	board_early_init_f,
-#endif
-	serial_init,
-
-	init_timebase,
-
-#if defined(CONFIG_CMD_AMBAPP)
-	ambapp_init_reloc,
-#endif
-
-	env_init,
-
-	init_baudrate,
-
-	console_init_f,
-	display_options,
-
-	checkcpu,
-	checkboard,
-#if defined(CONFIG_MISC_INIT_F)
-	misc_init_f,
-#endif
-
-#ifdef CONFIG_POST
-	post_init_f,
-#endif
-
-	NULL,			/* Terminate this list,
-				 * beware: this list will be relocated
-				 * which means that NULL will become
-				 * NULL+RELOC_OFFSET. We simply make
-				 * NULL be -RELOC_OFFSET instead.
-				 */
-};
-
-/************************************************************************
- *
- * This is the SPARC board initialization routine, running from RAM.
- *
- ************************************************************************
- */
-#ifdef DEBUG_INIT_SEQUENCE
-char *str_init_seq = "INIT_SEQ 00\n";
-char *str_init_seq_done = "\n\rInit sequence done...\r\n\r\n";
-#endif
-
-void board_init_f(ulong bootflag)
-{
-	bd_t *bd;
-	init_fnc_t **init_fnc_ptr;
-	int j;
-
-#ifndef CONFIG_SYS_NO_FLASH
-	ulong flash_size;
-#endif
-
-	gd = (gd_t *) (CONFIG_SYS_GBL_DATA_OFFSET);
-
-	/* Clear initial global data */
-	memset((void *)gd, 0, sizeof(gd_t));
-
-	gd->bd = (bd_t *) (gd + 1);	/* At end of global data */
-	gd->baudrate = CONFIG_BAUDRATE;
-	gd->cpu_clk = CONFIG_SYS_CLK_FREQ;
-
-	bd = gd->bd;
-	bd->bi_memstart = CONFIG_SYS_RAM_BASE;
-	bd->bi_memsize = CONFIG_SYS_RAM_SIZE;
-	bd->bi_flashstart = CONFIG_SYS_FLASH_BASE;
-#if	defined(CONFIG_SYS_SRAM_BASE) && defined(CONFIG_SYS_SRAM_SIZE)
-	bd->bi_sramstart = CONFIG_SYS_SRAM_BASE;
-	bd->bi_sramsize = CONFIG_SYS_SRAM_SIZE;
-#endif
-	bd->bi_bootflags = bootflag;	/* boot / reboot flag (for LynxOS)    */
-
-	gd->flags |= GD_FLG_RELOC;	/* tell others: relocation done */
-	gd->reloc_off = CONFIG_SYS_RELOC_MONITOR_BASE - CONFIG_SYS_MONITOR_BASE;
-
-	for (init_fnc_ptr = init_sequence, j = 0; *init_fnc_ptr;
-	     ++init_fnc_ptr, j++) {
-#ifdef DEBUG_INIT_SEQUENCE
-		if (j > 9)
-			str_init_seq[9] = '0' + (j / 10);
-		str_init_seq[10] = '0' + (j - (j / 10) * 10);
-		serial_puts(str_init_seq);
-#endif
-		if ((*init_fnc_ptr + gd->reloc_off) () != 0) {
-			hang();
-		}
-	}
-#ifdef DEBUG_INIT_SEQUENCE
-	serial_puts(str_init_seq_done);
-#endif
-
-	/*
-	 * Now that we have DRAM mapped and working, we can
-	 * relocate the code and continue running from DRAM.
-	 *
-	 * Reserve memory at end of RAM for (top down in that order):
-	 *  - kernel log buffer
-	 *  - protected RAM
-	 *  - LCD framebuffer
-	 *  - monitor code
-	 *  - board info struct
-	 */
-#ifdef DEBUG_MEM_LAYOUT
-	printf("CONFIG_SYS_MONITOR_BASE:       0x%lx\n", CONFIG_SYS_MONITOR_BASE);
-	printf("CONFIG_ENV_ADDR:           0x%lx\n", CONFIG_ENV_ADDR);
-	printf("CONFIG_SYS_RELOC_MONITOR_BASE: 0x%lx (%d)\n", CONFIG_SYS_RELOC_MONITOR_BASE,
-	       CONFIG_SYS_MONITOR_LEN);
-	printf("CONFIG_SYS_MALLOC_BASE:        0x%lx (%d)\n", CONFIG_SYS_MALLOC_BASE,
-	       CONFIG_SYS_MALLOC_LEN);
-	printf("CONFIG_SYS_INIT_SP_OFFSET:     0x%lx (%d)\n", CONFIG_SYS_INIT_SP_OFFSET,
-	       CONFIG_SYS_STACK_SIZE);
-	printf("CONFIG_SYS_PROM_OFFSET:        0x%lx (%d)\n", CONFIG_SYS_PROM_OFFSET,
-	       CONFIG_SYS_PROM_SIZE);
-	printf("CONFIG_SYS_GBL_DATA_OFFSET:    0x%lx (%d)\n", CONFIG_SYS_GBL_DATA_OFFSET,
-	       GENERATED_GBL_DATA_SIZE);
-#endif
-
-#ifdef CONFIG_POST
-	post_bootmode_init();
-	post_run(NULL, POST_ROM | post_bootmode_get(0));
-#endif
-
-#if defined(CONFIG_NEEDS_MANUAL_RELOC)
-	/*
-	 * We have to relocate the command table manually
-	 */
-	fixup_cmdtable(ll_entry_start(cmd_tbl_t, cmd),
-			ll_entry_count(cmd_tbl_t, cmd));
-#endif /* defined(CONFIG_NEEDS_MANUAL_RELOC) */
-
-#if defined(CONFIG_CMD_AMBAPP) && defined(CONFIG_SYS_AMBAPP_PRINT_ON_STARTUP)
-	puts("AMBA:\n");
-	do_ambapp_print(NULL, 0, 0, NULL);
-#endif
-
-	/* initialize higher level parts of CPU like time base and timers */
-	cpu_init_r();
-
-	/* start timer */
-	timer_interrupt_init();
-
-	/*
-	 * Enable Interrupts before any calls to udelay,
-	 * the flash driver may use udelay resulting in
-	 * a hang if not timer0 IRQ is enabled.
-	 */
-	interrupt_init();
-
-	/* The Malloc area is immediately below the monitor copy in RAM */
-	mem_malloc_init(CONFIG_SYS_MALLOC_BASE,
-			CONFIG_SYS_MALLOC_END - CONFIG_SYS_MALLOC_BASE);
-
-#if !defined(CONFIG_SYS_NO_FLASH)
-	puts("Flash: ");
-
-	if ((flash_size = flash_init()) > 0) {
-# ifdef CONFIG_SYS_FLASH_CHECKSUM
-		print_size(flash_size, "");
-		/*
-		 * Compute and print flash CRC if flashchecksum is set to 'y'
-		 *
-		 * NOTE: Maybe we should add some WATCHDOG_RESET()? XXX
-		 */
-		if (getenv_yesno("flashchecksum") == 1) {
-			printf("  CRC: %08lX",
-			       crc32(0, (const unsigned char *)CONFIG_SYS_FLASH_BASE,
-				     flash_size)
-			    );
-		}
-		putc('\n');
-# else				/* !CONFIG_SYS_FLASH_CHECKSUM */
-		print_size(flash_size, "\n");
-# endif				/* CONFIG_SYS_FLASH_CHECKSUM */
-	} else {
-		puts(failed);
-		hang();
-	}
-
-	bd->bi_flashstart = CONFIG_SYS_FLASH_BASE;	/* update start of FLASH memory    */
-	bd->bi_flashsize = flash_size;	/* size of FLASH memory (final value) */
-#if CONFIG_SYS_MONITOR_BASE == CONFIG_SYS_FLASH_BASE
-	bd->bi_flashoffset = monitor_flash_len;	/* reserved area for startup monitor  */
-#else
-	bd->bi_flashoffset = 0;
-#endif
-#else				/* CONFIG_SYS_NO_FLASH */
-	bd->bi_flashsize = 0;
-	bd->bi_flashstart = 0;
-	bd->bi_flashoffset = 0;
-#endif				/* !CONFIG_SYS_NO_FLASH */
-
-#ifdef CONFIG_SPI
-# if !defined(CONFIG_ENV_IS_IN_EEPROM)
-	spi_init_f();
-# endif
-	spi_init_r();
-#endif
-
-	/* relocate environment function pointers etc. */
-	env_relocate();
-
-#if defined(CONFIG_BOARD_LATE_INIT)
-	board_late_init();
-#endif
-
-#ifdef CONFIG_ID_EEPROM
-	mac_read_from_eeprom();
-#endif
-
-#if defined(CONFIG_PCI)
-	/*
-	 * Do pci configuration
-	 */
-	pci_init();
-#endif
-
-	/* Initialize stdio devices */
-	stdio_init();
-
-	/* Initialize the jump table for applications */
-	jumptable_init();
-
-	/* Initialize the console (after the relocation and devices init) */
-	console_init_r();
-
-#ifdef CONFIG_STATUS_LED
-	status_led_set(STATUS_LED_BOOT, STATUS_LED_BLINKING);
-#endif
-
-	udelay(20);
-
-	/* Initialize from environment */
-	load_addr = getenv_ulong("loadaddr", 16, load_addr);
-
-	WATCHDOG_RESET();
-
-#if defined(CONFIG_CMD_DOC)
-	WATCHDOG_RESET();
-	puts("DOC:   ");
-	doc_init();
-#endif
-
-#ifdef CONFIG_BITBANGMII
-	bb_miiphy_init();
-#endif
-#if defined(CONFIG_CMD_NET)
-	WATCHDOG_RESET();
-	puts("Net:   ");
-	eth_initialize();
-#endif
-
-#if defined(CONFIG_CMD_NET) && defined(CONFIG_RESET_PHY_R)
-	WATCHDOG_RESET();
-	debug("Reset Ethernet PHY\n");
-	reset_phy();
-#endif
-
-#ifdef CONFIG_POST
-	post_run(NULL, POST_RAM | post_bootmode_get(0));
-#endif
-
-#if defined(CONFIG_CMD_IDE)
-	WATCHDOG_RESET();
-	puts("IDE:   ");
-	ide_init();
-#endif /* CONFIG_CMD_IDE */
-
-#ifdef CONFIG_LAST_STAGE_INIT
-	WATCHDOG_RESET();
-	/*
-	 * Some parts can be only initialized if all others (like
-	 * Interrupts) are up and running (i.e. the PC-style ISA
-	 * keyboard).
-	 */
-	last_stage_init();
-#endif
-
-#ifdef CONFIG_PS2KBD
-	puts("PS/2:  ");
-	kbd_init();
-#endif
-	prom_init();
-
-	/* main_loop */
-	for (;;) {
-		WATCHDOG_RESET();
-		main_loop();
-	}
-
-}
-
-/************************************************************************/
diff --git a/arch/sparc/lib/interrupts.c b/arch/sparc/lib/interrupts.c
index fab26c6..cb73d17 100644
--- a/arch/sparc/lib/interrupts.c
+++ b/arch/sparc/lib/interrupts.c
@@ -66,33 +66,3 @@
 
 	return ret;
 }
-
-/* timer interrupt/overflow counter */
-static volatile ulong timestamp = 0;
-
-/* regs can not be used here! regs is actually the pointer given in
- * irq_install_handler
- */
-void timer_interrupt(struct pt_regs *regs)
-{
-	/* call cpu specific function from $(CPU)/interrupts.c */
-	timer_interrupt_cpu((void *)regs);
-
-	timestamp++;
-}
-
-void timer_interrupt_init(void)
-{
-	int irq;
-
-	timestamp = 0;
-
-	irq = timer_interrupt_init_cpu();
-
-	if (irq < 0) {
-		/* cpu specific code handled the interrupt registration it self */
-		return;
-	}
-	/* register interrupt handler for timer */
-	irq_install_handler(irq, (void (*)(void *))timer_interrupt, NULL);
-}
diff --git a/arch/sparc/lib/time.c b/arch/sparc/lib/time.c
deleted file mode 100644
index 50a09ad..0000000
--- a/arch/sparc/lib/time.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * (C) Copyright 2000, 2001
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * (C) Copyright 2007
- * Daniel Hellstrom, Gaisler Research, daniel@gaisler.com.
- *
- * SPDX-License-Identifier:	GPL-2.0+
- */
-
-#include <common.h>
-
-/* Implemented by SPARC CPUs */
-extern void cpu_wait_ticks(unsigned long ticks);
-extern unsigned long cpu_usec2ticks(unsigned long usec);
-extern unsigned long cpu_ticks2usec(unsigned long ticks);
-
-/* ------------------------------------------------------------------------- */
-
-void wait_ticks(unsigned long ticks)
-{
-	cpu_wait_ticks(ticks);
-}
-
-/*
- * This function is intended for SHORT delays only.
- */
-unsigned long usec2ticks(unsigned long usec)
-{
-	return cpu_usec2ticks(usec);
-}
-
-/* ------------------------------------------------------------------------- */
-
-/*
- * We implement the delay by converting the delay (the number of
- * microseconds to wait) into a number of time base ticks; then we
- * watch the time base until it has incremented by that amount.
- */
-void __udelay(unsigned long usec)
-{
-	ulong ticks = usec2ticks(usec);
-
-	wait_ticks(ticks);
-}
-
-/* ------------------------------------------------------------------------- */
-
-unsigned long ticks2usec(unsigned long ticks)
-{
-	return cpu_ticks2usec(ticks);
-}
-
-/* ------------------------------------------------------------------------- */
-
-int init_timebase(void)
-{
-
-	return (0);
-}
-
-/* ------------------------------------------------------------------------- */
