diff options
Diffstat (limited to 'arch/blackfin/kernel')
| -rw-r--r-- | arch/blackfin/kernel/Makefile | 2 | ||||
| -rw-r--r-- | arch/blackfin/kernel/bfin_dma.c | 146 | ||||
| -rw-r--r-- | arch/blackfin/kernel/bfin_gpio.c | 28 | ||||
| -rw-r--r-- | arch/blackfin/kernel/cplb-nompu/cplbinit.c | 4 | ||||
| -rw-r--r-- | arch/blackfin/kernel/cplb-nompu/cplbmgr.c | 6 | ||||
| -rw-r--r-- | arch/blackfin/kernel/debug-mmrs.c | 9 | ||||
| -rw-r--r-- | arch/blackfin/kernel/entry.S | 10 | ||||
| -rw-r--r-- | arch/blackfin/kernel/gptimers.c | 85 | ||||
| -rw-r--r-- | arch/blackfin/kernel/init_task.c | 32 | ||||
| -rw-r--r-- | arch/blackfin/kernel/process.c | 8 | ||||
| -rw-r--r-- | arch/blackfin/kernel/reboot.c | 6 | ||||
| -rw-r--r-- | arch/blackfin/kernel/setup.c | 132 | ||||
| -rw-r--r-- | arch/blackfin/kernel/shadow_console.c | 6 | ||||
| -rw-r--r-- | arch/blackfin/kernel/time-ts.c | 27 | 
14 files changed, 375 insertions, 126 deletions
diff --git a/arch/blackfin/kernel/Makefile b/arch/blackfin/kernel/Makefile index 9a0d6d70644..08e6625106b 100644 --- a/arch/blackfin/kernel/Makefile +++ b/arch/blackfin/kernel/Makefile @@ -2,7 +2,7 @@  # arch/blackfin/kernel/Makefile  # -extra-y := init_task.o vmlinux.lds +extra-y := vmlinux.lds  obj-y := \  	entry.o process.o bfin_ksyms.o ptrace.o setup.o signal.o \ diff --git a/arch/blackfin/kernel/bfin_dma.c b/arch/blackfin/kernel/bfin_dma.c index 40c2ed61258..c166939ffb2 100644 --- a/arch/blackfin/kernel/bfin_dma.c +++ b/arch/blackfin/kernel/bfin_dma.c @@ -45,9 +45,15 @@ static int __init blackfin_dma_init(void)  		atomic_set(&dma_ch[i].chan_status, 0);  		dma_ch[i].regs = dma_io_base_addr[i];  	} +#ifdef CH_MEM_STREAM3_SRC +	/* Mark MEMDMA Channel 3 as requested since we're using it internally */ +	request_dma(CH_MEM_STREAM3_DEST, "Blackfin dma_memcpy"); +	request_dma(CH_MEM_STREAM3_SRC, "Blackfin dma_memcpy"); +#else  	/* Mark MEMDMA Channel 0 as requested since we're using it internally */  	request_dma(CH_MEM_STREAM0_DEST, "Blackfin dma_memcpy");  	request_dma(CH_MEM_STREAM0_SRC, "Blackfin dma_memcpy"); +#endif  #if defined(CONFIG_DEB_DMA_URGENT)  	bfin_write_EBIU_DDRQUE(bfin_read_EBIU_DDRQUE() @@ -84,7 +90,8 @@ static const struct file_operations proc_dma_operations = {  static int __init proc_dma_init(void)  { -	return proc_create("dma", 0, NULL, &proc_dma_operations) != NULL; +	proc_create("dma", 0, NULL, &proc_dma_operations); +	return 0;  }  late_initcall(proc_dma_init);  #endif @@ -204,6 +211,7 @@ EXPORT_SYMBOL(free_dma);  # ifndef MAX_DMA_SUSPEND_CHANNELS  #  define MAX_DMA_SUSPEND_CHANNELS MAX_DMA_CHANNELS  # endif +# ifndef CONFIG_BF60x  int blackfin_dma_suspend(void)  {  	int i; @@ -213,7 +221,6 @@ int blackfin_dma_suspend(void)  			printk(KERN_ERR "DMA Channel %d failed to suspend\n", i);  			return -EBUSY;  		} -  		if (i < MAX_DMA_SUSPEND_CHANNELS)  			dma_ch[i].saved_peripheral_map = dma_ch[i].regs->peripheral_map;  	} @@ -230,7 +237,6 @@ void blackfin_dma_resume(void)  	for (i = 0; i < MAX_DMA_CHANNELS; ++i) {  		dma_ch[i].regs->cfg = 0; -  		if (i < MAX_DMA_SUSPEND_CHANNELS)  			dma_ch[i].regs->peripheral_map = dma_ch[i].saved_peripheral_map;  	} @@ -238,6 +244,16 @@ void blackfin_dma_resume(void)  	bfin_write_DMAC_TC_PER(0x0111);  #endif  } +# else +int blackfin_dma_suspend(void) +{ +	return 0; +} + +void blackfin_dma_resume(void) +{ +} +#endif  #endif  /** @@ -279,10 +295,10 @@ void __init early_dma_memcpy(void *pdst, const void *psrc, size_t size)  			src_ch = (struct dma_register *)MDMA_S0_NEXT_DESC_PTR;  		} -		if (!bfin_read16(&src_ch->cfg)) +		if (!DMA_MMR_READ(&src_ch->cfg))  			break; -		else if (bfin_read16(&dst_ch->irq_status) & DMA_DONE) { -			bfin_write16(&src_ch->cfg, 0); +		else if (DMA_MMR_READ(&dst_ch->irq_status) & DMA_DONE) { +			DMA_MMR_WRITE(&src_ch->cfg, 0);  			break;  		}  	} @@ -295,22 +311,31 @@ void __init early_dma_memcpy(void *pdst, const void *psrc, size_t size)  	/* Destination */  	bfin_write32(&dst_ch->start_addr, dst); -	bfin_write16(&dst_ch->x_count, size >> 2); -	bfin_write16(&dst_ch->x_modify, 1 << 2); -	bfin_write16(&dst_ch->irq_status, DMA_DONE | DMA_ERR); +	DMA_MMR_WRITE(&dst_ch->x_count, size >> 2); +	DMA_MMR_WRITE(&dst_ch->x_modify, 1 << 2); +	DMA_MMR_WRITE(&dst_ch->irq_status, DMA_DONE | DMA_ERR);  	/* Source */  	bfin_write32(&src_ch->start_addr, src); -	bfin_write16(&src_ch->x_count, size >> 2); -	bfin_write16(&src_ch->x_modify, 1 << 2); -	bfin_write16(&src_ch->irq_status, DMA_DONE | DMA_ERR); +	DMA_MMR_WRITE(&src_ch->x_count, size >> 2); +	DMA_MMR_WRITE(&src_ch->x_modify, 1 << 2); +	DMA_MMR_WRITE(&src_ch->irq_status, DMA_DONE | DMA_ERR);  	/* Enable */ -	bfin_write16(&src_ch->cfg, DMAEN | WDSIZE_32); -	bfin_write16(&dst_ch->cfg, WNR | DI_EN | DMAEN | WDSIZE_32); +	DMA_MMR_WRITE(&src_ch->cfg, DMAEN | WDSIZE_32); +	DMA_MMR_WRITE(&dst_ch->cfg, WNR | DI_EN_X | DMAEN | WDSIZE_32);  	/* Since we are atomic now, don't use the workaround ssync */  	__builtin_bfin_ssync(); + +#ifdef CONFIG_BF60x +	/* Work around a possible MDMA anomaly. Running 2 MDMA channels to +	 * transfer DDR data to L1 SRAM may corrupt data. +	 * Should be reverted after this issue is root caused. +	 */ +	while (!(DMA_MMR_READ(&dst_ch->irq_status) & DMA_DONE)) +		continue; +#endif  }  void __init early_dma_memcpy_done(void) @@ -336,6 +361,42 @@ void __init early_dma_memcpy_done(void)  	__builtin_bfin_ssync();  } +#ifdef CH_MEM_STREAM3_SRC +#define bfin_read_MDMA_S_CONFIG bfin_read_MDMA_S3_CONFIG +#define bfin_write_MDMA_S_CONFIG bfin_write_MDMA_S3_CONFIG +#define bfin_write_MDMA_S_START_ADDR bfin_write_MDMA_S3_START_ADDR +#define bfin_write_MDMA_S_IRQ_STATUS bfin_write_MDMA_S3_IRQ_STATUS +#define bfin_write_MDMA_S_X_COUNT bfin_write_MDMA_S3_X_COUNT +#define bfin_write_MDMA_S_X_MODIFY bfin_write_MDMA_S3_X_MODIFY +#define bfin_write_MDMA_S_Y_COUNT bfin_write_MDMA_S3_Y_COUNT +#define bfin_write_MDMA_S_Y_MODIFY bfin_write_MDMA_S3_Y_MODIFY +#define bfin_write_MDMA_D_CONFIG bfin_write_MDMA_D3_CONFIG +#define bfin_write_MDMA_D_START_ADDR bfin_write_MDMA_D3_START_ADDR +#define bfin_read_MDMA_D_IRQ_STATUS bfin_read_MDMA_D3_IRQ_STATUS +#define bfin_write_MDMA_D_IRQ_STATUS bfin_write_MDMA_D3_IRQ_STATUS +#define bfin_write_MDMA_D_X_COUNT bfin_write_MDMA_D3_X_COUNT +#define bfin_write_MDMA_D_X_MODIFY bfin_write_MDMA_D3_X_MODIFY +#define bfin_write_MDMA_D_Y_COUNT bfin_write_MDMA_D3_Y_COUNT +#define bfin_write_MDMA_D_Y_MODIFY bfin_write_MDMA_D3_Y_MODIFY +#else +#define bfin_read_MDMA_S_CONFIG bfin_read_MDMA_S0_CONFIG +#define bfin_write_MDMA_S_CONFIG bfin_write_MDMA_S0_CONFIG +#define bfin_write_MDMA_S_START_ADDR bfin_write_MDMA_S0_START_ADDR +#define bfin_write_MDMA_S_IRQ_STATUS bfin_write_MDMA_S0_IRQ_STATUS +#define bfin_write_MDMA_S_X_COUNT bfin_write_MDMA_S0_X_COUNT +#define bfin_write_MDMA_S_X_MODIFY bfin_write_MDMA_S0_X_MODIFY +#define bfin_write_MDMA_S_Y_COUNT bfin_write_MDMA_S0_Y_COUNT +#define bfin_write_MDMA_S_Y_MODIFY bfin_write_MDMA_S0_Y_MODIFY +#define bfin_write_MDMA_D_CONFIG bfin_write_MDMA_D0_CONFIG +#define bfin_write_MDMA_D_START_ADDR bfin_write_MDMA_D0_START_ADDR +#define bfin_read_MDMA_D_IRQ_STATUS bfin_read_MDMA_D0_IRQ_STATUS +#define bfin_write_MDMA_D_IRQ_STATUS bfin_write_MDMA_D0_IRQ_STATUS +#define bfin_write_MDMA_D_X_COUNT bfin_write_MDMA_D0_X_COUNT +#define bfin_write_MDMA_D_X_MODIFY bfin_write_MDMA_D0_X_MODIFY +#define bfin_write_MDMA_D_Y_COUNT bfin_write_MDMA_D0_Y_COUNT +#define bfin_write_MDMA_D_Y_MODIFY bfin_write_MDMA_D0_Y_MODIFY +#endif +  /**   *	__dma_memcpy - program the MDMA registers   * @@ -358,8 +419,8 @@ static void __dma_memcpy(u32 daddr, s16 dmod, u32 saddr, s16 smod, size_t cnt, u  	 */  	__builtin_bfin_ssync(); -	if (bfin_read_MDMA_S0_CONFIG()) -		while (!(bfin_read_MDMA_D0_IRQ_STATUS() & DMA_DONE)) +	if (bfin_read_MDMA_S_CONFIG()) +		while (!(bfin_read_MDMA_D_IRQ_STATUS() & DMA_DONE))  			continue;  	if (conf & DMA2D) { @@ -374,39 +435,42 @@ static void __dma_memcpy(u32 daddr, s16 dmod, u32 saddr, s16 smod, size_t cnt, u  		u32 shift = abs(dmod) >> 1;  		size_t ycnt = cnt >> (16 - shift);  		cnt = 1 << (16 - shift); -		bfin_write_MDMA_D0_Y_COUNT(ycnt); -		bfin_write_MDMA_S0_Y_COUNT(ycnt); -		bfin_write_MDMA_D0_Y_MODIFY(dmod); -		bfin_write_MDMA_S0_Y_MODIFY(smod); +		bfin_write_MDMA_D_Y_COUNT(ycnt); +		bfin_write_MDMA_S_Y_COUNT(ycnt); +		bfin_write_MDMA_D_Y_MODIFY(dmod); +		bfin_write_MDMA_S_Y_MODIFY(smod);  	} -	bfin_write_MDMA_D0_START_ADDR(daddr); -	bfin_write_MDMA_D0_X_COUNT(cnt); -	bfin_write_MDMA_D0_X_MODIFY(dmod); -	bfin_write_MDMA_D0_IRQ_STATUS(DMA_DONE | DMA_ERR); +	bfin_write_MDMA_D_START_ADDR(daddr); +	bfin_write_MDMA_D_X_COUNT(cnt); +	bfin_write_MDMA_D_X_MODIFY(dmod); +	bfin_write_MDMA_D_IRQ_STATUS(DMA_DONE | DMA_ERR); -	bfin_write_MDMA_S0_START_ADDR(saddr); -	bfin_write_MDMA_S0_X_COUNT(cnt); -	bfin_write_MDMA_S0_X_MODIFY(smod); -	bfin_write_MDMA_S0_IRQ_STATUS(DMA_DONE | DMA_ERR); +	bfin_write_MDMA_S_START_ADDR(saddr); +	bfin_write_MDMA_S_X_COUNT(cnt); +	bfin_write_MDMA_S_X_MODIFY(smod); +	bfin_write_MDMA_S_IRQ_STATUS(DMA_DONE | DMA_ERR); -	bfin_write_MDMA_S0_CONFIG(DMAEN | conf); -	bfin_write_MDMA_D0_CONFIG(WNR | DI_EN | DMAEN | conf); +	bfin_write_MDMA_S_CONFIG(DMAEN | conf); +	if (conf & DMA2D) +		bfin_write_MDMA_D_CONFIG(WNR | DI_EN_Y | DMAEN | conf); +	else +		bfin_write_MDMA_D_CONFIG(WNR | DI_EN_X | DMAEN | conf);  	spin_unlock_irqrestore(&mdma_lock, flags);  	SSYNC(); -	while (!(bfin_read_MDMA_D0_IRQ_STATUS() & DMA_DONE)) -		if (bfin_read_MDMA_S0_CONFIG()) +	while (!(bfin_read_MDMA_D_IRQ_STATUS() & DMA_DONE)) +		if (bfin_read_MDMA_S_CONFIG())  			continue;  		else  			return; -	bfin_write_MDMA_D0_IRQ_STATUS(DMA_DONE | DMA_ERR); +	bfin_write_MDMA_D_IRQ_STATUS(DMA_DONE | DMA_ERR); -	bfin_write_MDMA_S0_CONFIG(0); -	bfin_write_MDMA_D0_CONFIG(0); +	bfin_write_MDMA_S_CONFIG(0); +	bfin_write_MDMA_D_CONFIG(0);  }  /** @@ -448,8 +512,10 @@ static void *_dma_memcpy(void *pdst, const void *psrc, size_t size)  	}  	size >>= shift; +#ifndef DMA_MMR_SIZE_32  	if (size > 0x10000)  		conf |= DMA2D; +#endif  	__dma_memcpy(dst, mod, src, mod, size, conf); @@ -488,6 +554,9 @@ EXPORT_SYMBOL(dma_memcpy);   */  void *dma_memcpy_nocache(void *pdst, const void *psrc, size_t size)  { +#ifdef DMA_MMR_SIZE_32 +	_dma_memcpy(pdst, psrc, size); +#else  	size_t bulk, rest;  	bulk = size & ~0xffff; @@ -495,6 +564,7 @@ void *dma_memcpy_nocache(void *pdst, const void *psrc, size_t size)  	if (bulk)  		_dma_memcpy(pdst, psrc, bulk);  	_dma_memcpy(pdst + bulk, psrc + bulk, rest); +#endif  	return pdst;  }  EXPORT_SYMBOL(dma_memcpy_nocache); @@ -514,14 +584,14 @@ void *safe_dma_memcpy(void *dst, const void *src, size_t size)  }  EXPORT_SYMBOL(safe_dma_memcpy); -static void _dma_out(unsigned long addr, unsigned long buf, unsigned short len, +static void _dma_out(unsigned long addr, unsigned long buf, unsigned DMA_MMR_SIZE_TYPE len,                       u16 size, u16 dma_size)  {  	blackfin_dcache_flush_range(buf, buf + len * size);  	__dma_memcpy(addr, 0, buf, size, len, dma_size);  } -static void _dma_in(unsigned long addr, unsigned long buf, unsigned short len, +static void _dma_in(unsigned long addr, unsigned long buf, unsigned DMA_MMR_SIZE_TYPE len,                      u16 size, u16 dma_size)  {  	blackfin_dcache_invalidate_range(buf, buf + len * size); @@ -529,7 +599,7 @@ static void _dma_in(unsigned long addr, unsigned long buf, unsigned short len,  }  #define MAKE_DMA_IO(io, bwl, isize, dmasize, cnst) \ -void dma_##io##s##bwl(unsigned long addr, cnst void *buf, unsigned short len) \ +void dma_##io##s##bwl(unsigned long addr, cnst void *buf, unsigned DMA_MMR_SIZE_TYPE len) \  { \  	_dma_##io(addr, (unsigned long)buf, len, isize, WDSIZE_##dmasize); \  } \ diff --git a/arch/blackfin/kernel/bfin_gpio.c b/arch/blackfin/kernel/bfin_gpio.c index 02796b88443..83139aaf307 100644 --- a/arch/blackfin/kernel/bfin_gpio.c +++ b/arch/blackfin/kernel/bfin_gpio.c @@ -58,7 +58,7 @@ static struct gpio_port_t * const gpio_array[] = {  	(struct gpio_port_t *) FIO0_FLAG_D,  	(struct gpio_port_t *) FIO1_FLAG_D,  	(struct gpio_port_t *) FIO2_FLAG_D, -#elif defined(CONFIG_BF54x) +#elif defined(CONFIG_BF54x) || defined(CONFIG_BF60x)   	(struct gpio_port_t *)PORTA_FER,  	(struct gpio_port_t *)PORTB_FER,  	(struct gpio_port_t *)PORTC_FER, @@ -66,9 +66,11 @@ static struct gpio_port_t * const gpio_array[] = {  	(struct gpio_port_t *)PORTE_FER,  	(struct gpio_port_t *)PORTF_FER,  	(struct gpio_port_t *)PORTG_FER, +# if defined(CONFIG_BF54x)  	(struct gpio_port_t *)PORTH_FER,  	(struct gpio_port_t *)PORTI_FER,  	(struct gpio_port_t *)PORTJ_FER, +# endif  #else  # error no gpio arrays defined  #endif @@ -210,7 +212,7 @@ static void port_setup(unsigned gpio, unsigned short usage)  	else  		*port_fer[gpio_bank(gpio)] |= gpio_bit(gpio);  	SSYNC(); -#elif defined(CONFIG_BF54x) +#elif defined(CONFIG_BF54x) || defined(CONFIG_BF60x)  	if (usage == GPIO_USAGE)  		gpio_array[gpio_bank(gpio)]->port_fer &= ~gpio_bit(gpio);  	else @@ -299,7 +301,7 @@ static void portmux_setup(unsigned short per)  	pmux |= (function << offset);  	bfin_write_PORT_MUX(pmux);  } -#elif defined(CONFIG_BF54x) +#elif defined(CONFIG_BF54x) || defined(CONFIG_BF60x)  inline void portmux_setup(unsigned short per)  {  	u16 ident = P_IDENT(per); @@ -377,7 +379,7 @@ static int portmux_group_check(unsigned short per)  }  #endif -#ifndef CONFIG_BF54x +#if !(defined(CONFIG_BF54x) || defined(CONFIG_BF60x))  /***********************************************************  *  * FUNCTIONS: Blackfin General Purpose Ports Access Functions @@ -680,7 +682,7 @@ void bfin_gpio_pm_hibernate_restore(void)  #endif -#else /* CONFIG_BF54x */ +#else /* CONFIG_BF54x || CONFIG_BF60x */  #ifdef CONFIG_PM  int bfin_pm_standby_ctrl(unsigned ctrl) @@ -726,7 +728,7 @@ unsigned short get_gpio_dir(unsigned gpio)  }  EXPORT_SYMBOL(get_gpio_dir); -#endif /* CONFIG_BF54x */ +#endif /* CONFIG_BF54x || CONFIG_BF60x */  /***********************************************************  * @@ -783,7 +785,7 @@ int peripheral_request(unsigned short per, const char *label)  		 * be requested and used by several drivers  		 */ -#ifdef CONFIG_BF54x +#if defined(CONFIG_BF54x) || defined(CONFIG_BF60x)  		if (!((per & P_MAYSHARE) && get_portmux(per) == P_FUNCT2MUX(per))) {  #else  		if (!(per & P_MAYSHARE)) { @@ -937,7 +939,7 @@ int bfin_gpio_request(unsigned gpio, const char *label)  		printk(KERN_NOTICE "bfin-gpio: GPIO %d is already reserved as gpio-irq!"  		       " (Documentation/blackfin/bfin-gpio-notes.txt)\n", gpio);  	} -#ifndef CONFIG_BF54x +#if !(defined(CONFIG_BF54x) || defined(CONFIG_BF60x))  	else {	/* Reset POLAR setting when acquiring a gpio for the first time */  		set_gpio_polar(gpio, 0);  	} @@ -1110,7 +1112,7 @@ void bfin_gpio_irq_free(unsigned gpio)  static inline void __bfin_gpio_direction_input(unsigned gpio)  { -#ifdef CONFIG_BF54x +#if defined(CONFIG_BF54x) || defined(CONFIG_BF60x)  	gpio_array[gpio_bank(gpio)]->dir_clear = gpio_bit(gpio);  #else  	gpio_array[gpio_bank(gpio)]->dir &= ~gpio_bit(gpio); @@ -1138,13 +1140,13 @@ EXPORT_SYMBOL(bfin_gpio_direction_input);  void bfin_gpio_irq_prepare(unsigned gpio)  { -#ifdef CONFIG_BF54x +#if defined(CONFIG_BF54x) || defined(CONFIG_BF60x)  	unsigned long flags;  #endif  	port_setup(gpio, GPIO_USAGE); -#ifdef CONFIG_BF54x +#if defined(CONFIG_BF54x) || defined(CONFIG_BF60x)  	flags = hard_local_irq_save();  	__bfin_gpio_direction_input(gpio);  	hard_local_irq_restore(flags); @@ -1173,7 +1175,7 @@ int bfin_gpio_direction_output(unsigned gpio, int value)  	gpio_array[gpio_bank(gpio)]->inen &= ~gpio_bit(gpio);  	gpio_set_value(gpio, value); -#ifdef CONFIG_BF54x +#if defined(CONFIG_BF54x) || defined(CONFIG_BF60x)  	gpio_array[gpio_bank(gpio)]->dir_set = gpio_bit(gpio);  #else  	gpio_array[gpio_bank(gpio)]->dir |= gpio_bit(gpio); @@ -1188,7 +1190,7 @@ EXPORT_SYMBOL(bfin_gpio_direction_output);  int bfin_gpio_get_value(unsigned gpio)  { -#ifdef CONFIG_BF54x +#if defined(CONFIG_BF54x) || defined(CONFIG_BF60x)  	return (1 & (gpio_array[gpio_bank(gpio)]->data >> gpio_sub_n(gpio)));  #else  	unsigned long flags; diff --git a/arch/blackfin/kernel/cplb-nompu/cplbinit.c b/arch/blackfin/kernel/cplb-nompu/cplbinit.c index 886e00014d7..3e366dc2d6e 100644 --- a/arch/blackfin/kernel/cplb-nompu/cplbinit.c +++ b/arch/blackfin/kernel/cplb-nompu/cplbinit.c @@ -139,7 +139,7 @@ void __init generate_cplb_tables_all(void)  	dcplb_bounds[i_d].eaddr = BOOT_ROM_START;  	dcplb_bounds[i_d++].data = 0;  	/* BootROM -- largest one should be less than 1 meg.  */ -	dcplb_bounds[i_d].eaddr = BOOT_ROM_START + (1 * 1024 * 1024); +	dcplb_bounds[i_d].eaddr = BOOT_ROM_START + BOOT_ROM_LENGTH;  	dcplb_bounds[i_d++].data = SDRAM_DGENERIC;  	if (L2_LENGTH) {  		/* Addressing hole up to L2 SRAM.  */ @@ -178,7 +178,7 @@ void __init generate_cplb_tables_all(void)  	icplb_bounds[i_i].eaddr = BOOT_ROM_START;  	icplb_bounds[i_i++].data = 0;  	/* BootROM -- largest one should be less than 1 meg.  */ -	icplb_bounds[i_i].eaddr = BOOT_ROM_START + (1 * 1024 * 1024); +	icplb_bounds[i_i].eaddr = BOOT_ROM_START + BOOT_ROM_LENGTH;  	icplb_bounds[i_i++].data = SDRAM_IGENERIC;  	if (L2_LENGTH) { diff --git a/arch/blackfin/kernel/cplb-nompu/cplbmgr.c b/arch/blackfin/kernel/cplb-nompu/cplbmgr.c index 5b88861d618..e854f9066cb 100644 --- a/arch/blackfin/kernel/cplb-nompu/cplbmgr.c +++ b/arch/blackfin/kernel/cplb-nompu/cplbmgr.c @@ -179,6 +179,12 @@ MGR_ATTR static int dcplb_miss(int cpu)  		addr = addr1;  	} +#ifdef CONFIG_BF60x +	if ((addr >= ASYNC_BANK0_BASE) +		&& (addr < ASYNC_BANK3_BASE + ASYNC_BANK3_SIZE)) +		d_data |= PAGE_SIZE_64MB; +#endif +  	/* Pick entry to evict */  	idx = evict_one_dcplb(cpu); diff --git a/arch/blackfin/kernel/debug-mmrs.c b/arch/blackfin/kernel/debug-mmrs.c index 92f66482628..01232a13470 100644 --- a/arch/blackfin/kernel/debug-mmrs.c +++ b/arch/blackfin/kernel/debug-mmrs.c @@ -105,6 +105,7 @@ DEFINE_SYSREG(seqstat, , );  DEFINE_SYSREG(syscfg, , CSYNC());  #define D_SYSREG(sr) debugfs_create_file(#sr, S_IRUSR|S_IWUSR, parent, NULL, &fops_sysreg_##sr) +#ifndef CONFIG_BF60x  /*   * CAN   */ @@ -223,8 +224,10 @@ bfin_debug_mmrs_dma(struct dentry *parent, unsigned long base, int num, char mdm  	__DMA(CURR_DESC_PTR, curr_desc_ptr);  	__DMA(CURR_ADDR, curr_addr);  	__DMA(IRQ_STATUS, irq_status); +#ifndef CONFIG_BF60x  	if (strcmp(pfx, "IMDMA") != 0)  		__DMA(PERIPHERAL_MAP, peripheral_map); +#endif  	__DMA(CURR_X_COUNT, curr_x_count);  	__DMA(CURR_Y_COUNT, curr_y_count);  } @@ -568,7 +571,7 @@ bfin_debug_mmrs_uart(struct dentry *parent, unsigned long base, int num)  #endif  }  #define UART(num) bfin_debug_mmrs_uart(parent, UART##num##_DLL, num) - +#endif /* CONFIG_BF60x */  /*   * The actual debugfs generation   */ @@ -740,7 +743,7 @@ static int __init bfin_debug_mmrs_init(void)  	D32(WPDACNT0);  	D32(WPDACNT1);  	D32(WPSTAT); - +#ifndef CONFIG_BF60x  	/* System MMRs */  #ifdef ATAPI_CONTROL  	parent = debugfs_create_dir("atapi", top); @@ -1873,7 +1876,7 @@ static int __init bfin_debug_mmrs_init(void)  	}  #endif	/* BF54x */ - +#endif /* CONFIG_BF60x */  	debug_mmrs_dentry = top;  	return 0; diff --git a/arch/blackfin/kernel/entry.S b/arch/blackfin/kernel/entry.S index 686478f5f66..f33792cc1a0 100644 --- a/arch/blackfin/kernel/entry.S +++ b/arch/blackfin/kernel/entry.S @@ -64,16 +64,6 @@ ENTRY(_ret_from_fork)  	jump (p0);  ENDPROC(_ret_from_fork) -ENTRY(_sys_fork) -	r0 = -EINVAL; -#if (ANOMALY_05000371) -	nop; -	nop; -	nop; -#endif -	rts; -ENDPROC(_sys_fork) -  ENTRY(_sys_vfork)  	r0 = sp;  	r0 += 24; diff --git a/arch/blackfin/kernel/gptimers.c b/arch/blackfin/kernel/gptimers.c index 06459f4bf43..d776773d386 100644 --- a/arch/blackfin/kernel/gptimers.c +++ b/arch/blackfin/kernel/gptimers.c @@ -23,7 +23,11 @@  		printk(KERN_DEBUG "%s:%s:%i: Assertion failed: " #expr "\n", __FILE__, __func__, __LINE__);  #endif -#define BFIN_TIMER_NUM_GROUP  (BFIN_TIMER_OCTET(MAX_BLACKFIN_GPTIMERS - 1) + 1) +#ifndef CONFIG_BF60x +# define BFIN_TIMER_NUM_GROUP  (BFIN_TIMER_OCTET(MAX_BLACKFIN_GPTIMERS - 1) + 1) +#else +# define BFIN_TIMER_NUM_GROUP  1 +#endif  static struct bfin_gptimer_regs * const timer_regs[MAX_BLACKFIN_GPTIMERS] =  { @@ -158,6 +162,74 @@ uint32_t get_gptimer_count(unsigned int timer_id)  }  EXPORT_SYMBOL(get_gptimer_count); +#ifdef CONFIG_BF60x +void set_gptimer_delay(unsigned int timer_id, uint32_t delay) +{ +	tassert(timer_id < MAX_BLACKFIN_GPTIMERS); +	bfin_write(&timer_regs[timer_id]->delay, delay); +	SSYNC(); +} +EXPORT_SYMBOL(set_gptimer_delay); + +uint32_t get_gptimer_delay(unsigned int timer_id) +{ +	tassert(timer_id < MAX_BLACKFIN_GPTIMERS); +	return bfin_read(&timer_regs[timer_id]->delay); +} +EXPORT_SYMBOL(get_gptimer_delay); +#endif + +#ifdef CONFIG_BF60x +int get_gptimer_intr(unsigned int timer_id) +{ +	tassert(timer_id < MAX_BLACKFIN_GPTIMERS); +	return !!(bfin_read(&group_regs[BFIN_TIMER_OCTET(timer_id)]->data_ilat) & timil_mask[timer_id]); +} +EXPORT_SYMBOL(get_gptimer_intr); + +void clear_gptimer_intr(unsigned int timer_id) +{ +	tassert(timer_id < MAX_BLACKFIN_GPTIMERS); +	bfin_write(&group_regs[BFIN_TIMER_OCTET(timer_id)]->data_ilat, timil_mask[timer_id]); +} +EXPORT_SYMBOL(clear_gptimer_intr); + +int get_gptimer_over(unsigned int timer_id) +{ +	tassert(timer_id < MAX_BLACKFIN_GPTIMERS); +	return !!(bfin_read(&group_regs[BFIN_TIMER_OCTET(timer_id)]->stat_ilat) & tovf_mask[timer_id]); +} +EXPORT_SYMBOL(get_gptimer_over); + +void clear_gptimer_over(unsigned int timer_id) +{ +	tassert(timer_id < MAX_BLACKFIN_GPTIMERS); +	bfin_write(&group_regs[BFIN_TIMER_OCTET(timer_id)]->stat_ilat, tovf_mask[timer_id]); +} +EXPORT_SYMBOL(clear_gptimer_over); + +int get_gptimer_run(unsigned int timer_id) +{ +	tassert(timer_id < MAX_BLACKFIN_GPTIMERS); +	return !!(bfin_read(&group_regs[BFIN_TIMER_OCTET(timer_id)]->run) & trun_mask[timer_id]); +} +EXPORT_SYMBOL(get_gptimer_run); + +uint32_t get_gptimer_status(unsigned int group) +{ +	tassert(group < BFIN_TIMER_NUM_GROUP); +	return bfin_read(&group_regs[group]->data_ilat); +} +EXPORT_SYMBOL(get_gptimer_status); + +void set_gptimer_status(unsigned int group, uint32_t value) +{ +	tassert(group < BFIN_TIMER_NUM_GROUP); +	bfin_write(&group_regs[group]->data_ilat, value); +	SSYNC(); +} +EXPORT_SYMBOL(set_gptimer_status); +#else  uint32_t get_gptimer_status(unsigned int group)  {  	tassert(group < BFIN_TIMER_NUM_GROUP); @@ -212,6 +284,7 @@ int get_gptimer_run(unsigned int timer_id)  	return !!(read_gptimer_status(timer_id) & trun_mask[timer_id]);  }  EXPORT_SYMBOL(get_gptimer_run); +#endif  void set_gptimer_config(unsigned int timer_id, uint16_t config)  { @@ -231,6 +304,12 @@ EXPORT_SYMBOL(get_gptimer_config);  void enable_gptimers(uint16_t mask)  {  	int i; +#ifdef CONFIG_BF60x +	uint16_t imask; +	imask = bfin_read16(TIMER_DATA_IMSK); +	imask &= ~mask; +	bfin_write16(TIMER_DATA_IMSK, imask); +#endif  	tassert((mask & ~BLACKFIN_GPTIMER_IDMASK) == 0);  	for (i = 0; i < BFIN_TIMER_NUM_GROUP; ++i) {  		bfin_write(&group_regs[i]->enable, mask & 0xFF); @@ -253,12 +332,16 @@ static void _disable_gptimers(uint16_t mask)  void disable_gptimers(uint16_t mask)  { +#ifndef CONFIG_BF60x  	int i;  	_disable_gptimers(mask);  	for (i = 0; i < MAX_BLACKFIN_GPTIMERS; ++i)  		if (mask & (1 << i))  			bfin_write(&group_regs[BFIN_TIMER_OCTET(i)]->status, trun_mask[i]);  	SSYNC(); +#else +	_disable_gptimers(mask); +#endif  }  EXPORT_SYMBOL(disable_gptimers); diff --git a/arch/blackfin/kernel/init_task.c b/arch/blackfin/kernel/init_task.c deleted file mode 100644 index d3970e8acd1..00000000000 --- a/arch/blackfin/kernel/init_task.c +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2004-2009 Analog Devices Inc. - * - * Licensed under the GPL-2 or later - */ - -#include <linux/mm.h> -#include <linux/module.h> -#include <linux/init_task.h> -#include <linux/mqueue.h> -#include <linux/fs.h> - -static struct signal_struct init_signals = INIT_SIGNALS(init_signals); -static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); -/* - * Initial task structure. - * - * All other task structs will be allocated on slabs in fork.c - */ -struct task_struct init_task = INIT_TASK(init_task); -EXPORT_SYMBOL(init_task); - -/* - * Initial thread structure. - * - * We need to make sure that this is 8192-byte aligned due to the - * way process stacks are handled. This is done by having a special - * "init_task" linker map entry. - */ -union thread_union init_thread_union -    __init_task_data = { -INIT_THREAD_INFO(init_task)}; diff --git a/arch/blackfin/kernel/process.c b/arch/blackfin/kernel/process.c index c0f4fe287eb..2e3994b2016 100644 --- a/arch/blackfin/kernel/process.c +++ b/arch/blackfin/kernel/process.c @@ -95,7 +95,9 @@ void cpu_idle(void)  			idle();  		rcu_idle_exit();  		tick_nohz_idle_exit(); -		schedule_preempt_disabled(); +		preempt_enable_no_resched(); +		schedule(); +		preempt_disable();  	}  } @@ -329,12 +331,16 @@ int in_mem_const(unsigned long addr, unsigned long size,  {  	return in_mem_const_off(addr, size, 0, const_addr, const_size);  } +#ifdef CONFIG_BF60x +#define ASYNC_ENABLED(bnum, bctlnum)	1 +#else  #define ASYNC_ENABLED(bnum, bctlnum) \  ({ \  	(bfin_read_EBIU_AMGCTL() & 0xe) < ((bnum + 1) << 1) ? 0 : \  	bfin_read_EBIU_AMBCTL##bctlnum() & B##bnum##RDYEN ? 0 : \  	1; \  }) +#endif  /*   * We can't read EBIU banks that aren't enabled or we end up hanging   * on the access to the async space.  Make sure we validate accesses diff --git a/arch/blackfin/kernel/reboot.c b/arch/blackfin/kernel/reboot.c index b0434f89e8d..5272e6eefd9 100644 --- a/arch/blackfin/kernel/reboot.c +++ b/arch/blackfin/kernel/reboot.c @@ -22,6 +22,7 @@  __attribute__ ((__l1_text__, __noreturn__))  static void bfin_reset(void)  { +#ifndef CONFIG_BF60x  	if (!ANOMALY_05000353 && !ANOMALY_05000386)  		bfrom_SoftReset((void *)(L1_SCRATCH_START + L1_SCRATCH_LENGTH - 20)); @@ -57,7 +58,6 @@ static void bfin_reset(void)  	if (__SILICON_REVISION__ < 1 && bfin_revid() < 1)  		bfin_read_SWRST();  #endif -  	/* Wait for the SWRST write to complete.  Cannot rely on SSYNC  	 * though as the System state is all reset now.  	 */ @@ -72,6 +72,10 @@ static void bfin_reset(void)  	while (1)  		/* Issue core reset */  		asm("raise 1"); +#else +	while (1) +		bfin_write_RCU0_CTL(0x1); +#endif  }  __attribute__((weak)) diff --git a/arch/blackfin/kernel/setup.c b/arch/blackfin/kernel/setup.c index 2ad747e909f..ada8f0fc71e 100644 --- a/arch/blackfin/kernel/setup.c +++ b/arch/blackfin/kernel/setup.c @@ -25,12 +25,16 @@  #include <asm/cacheflush.h>  #include <asm/blackfin.h>  #include <asm/cplbinit.h> +#include <asm/clocks.h>  #include <asm/div64.h>  #include <asm/cpu.h>  #include <asm/fixed_code.h>  #include <asm/early_printk.h>  #include <asm/irq_handler.h>  #include <asm/pda.h> +#ifdef CONFIG_BF60x +#include <mach/pm.h> +#endif  u16 _bfin_swrst;  EXPORT_SYMBOL(_bfin_swrst); @@ -550,7 +554,6 @@ static __init void memory_setup(void)  {  #ifdef CONFIG_MTD_UCLINUX  	unsigned long mtd_phys = 0; -	unsigned long n;  #endif  	unsigned long max_mem; @@ -594,9 +597,9 @@ static __init void memory_setup(void)  	mtd_size = PAGE_ALIGN(*((unsigned long *)(mtd_phys + 8)));  # if defined(CONFIG_EXT2_FS) || defined(CONFIG_EXT3_FS) -	n = ext2_image_size((void *)(mtd_phys + 0x400)); -	if (n) -		mtd_size = PAGE_ALIGN(n * 1024); +	if (*((unsigned short *)(mtd_phys + 0x438)) == EXT2_SUPER_MAGIC) +		mtd_size = +		    PAGE_ALIGN(*((unsigned long *)(mtd_phys + 0x404)) << 10);  # endif  # if defined(CONFIG_CRAMFS) @@ -612,7 +615,8 @@ static __init void memory_setup(void)  		/* ROM_FS is XIP, so if we found it, we need to limit memory */  		if (memory_end > max_mem) { -			pr_info("Limiting kernel memory to %liMB due to anomaly 05000263\n", max_mem >> 20); +			pr_info("Limiting kernel memory to %liMB due to anomaly 05000263\n", +				(max_mem - CONFIG_PHY_RAM_BASE_ADDRESS) >> 20);  			memory_end = max_mem;  		}  	} @@ -642,7 +646,8 @@ static __init void memory_setup(void)  	 * doesn't exist, or we don't need to - then dont.  	 */  	if (memory_end > max_mem) { -		pr_info("Limiting kernel memory to %liMB due to anomaly 05000263\n", max_mem >> 20); +		pr_info("Limiting kernel memory to %liMB due to anomaly 05000263\n", +				(max_mem - CONFIG_PHY_RAM_BASE_ADDRESS) >> 20);  		memory_end = max_mem;  	} @@ -661,8 +666,8 @@ static __init void memory_setup(void)  	init_mm.end_data = (unsigned long)_edata;  	init_mm.brk = (unsigned long)0; -	printk(KERN_INFO "Board Memory: %ldMB\n", physical_mem_end >> 20); -	printk(KERN_INFO "Kernel Managed Memory: %ldMB\n", _ramend >> 20); +	printk(KERN_INFO "Board Memory: %ldMB\n", (physical_mem_end - CONFIG_PHY_RAM_BASE_ADDRESS) >> 20); +	printk(KERN_INFO "Kernel Managed Memory: %ldMB\n", (_ramend - CONFIG_PHY_RAM_BASE_ADDRESS) >> 20);  	printk(KERN_INFO "Memory map:\n"  	       "  fixedcode = 0x%p-0x%p\n" @@ -705,7 +710,7 @@ void __init find_min_max_pfn(void)  	int i;  	max_pfn = 0; -	min_low_pfn = memory_end; +	min_low_pfn = PFN_DOWN(memory_end);  	for (i = 0; i < bfin_memmap.nr_map; i++) {  		unsigned long start, end; @@ -748,8 +753,7 @@ static __init void setup_bootmem_allocator(void)  	/* pfn of the first usable page frame after kernel image*/  	if (min_low_pfn < memory_start >> PAGE_SHIFT)  		min_low_pfn = memory_start >> PAGE_SHIFT; - -	start_pfn = PAGE_OFFSET >> PAGE_SHIFT; +	start_pfn = CONFIG_PHY_RAM_BASE_ADDRESS >> PAGE_SHIFT;  	end_pfn = memory_end >> PAGE_SHIFT;  	/* @@ -794,8 +798,8 @@ static __init void setup_bootmem_allocator(void)  	}  	/* reserve memory before memory_start, including bootmap */ -	reserve_bootmem(PAGE_OFFSET, -		memory_start + bootmap_size + PAGE_SIZE - 1 - PAGE_OFFSET, +	reserve_bootmem(CONFIG_PHY_RAM_BASE_ADDRESS, +		memory_start + bootmap_size + PAGE_SIZE - 1 - CONFIG_PHY_RAM_BASE_ADDRESS,  		BOOTMEM_DEFAULT);  } @@ -844,13 +848,40 @@ static inline int __init get_mem_size(void)  		break;  	}  	switch (ddrctl & 0x30000) { -		case DEVWD_4:  ret *= 2; -		case DEVWD_8:  ret *= 2; -		case DEVWD_16: break; +	case DEVWD_4: +		ret *= 2; +	case DEVWD_8: +		ret *= 2; +	case DEVWD_16: +		break;  	}  	if ((ddrctl & 0xc000) == 0x4000)  		ret *= 2;  	return ret; +#elif defined(CONFIG_BF60x) +	u32 ddrctl = bfin_read_DMC0_CFG(); +	int ret; +	switch (ddrctl & 0xf00) { +	case DEVSZ_64: +		ret = 64 / 8; +		break; +	case DEVSZ_128: +		ret = 128 / 8; +		break; +	case DEVSZ_256: +		ret = 256 / 8; +		break; +	case DEVSZ_512: +		ret = 512 / 8; +		break; +	case DEVSZ_1G: +		ret = 1024 / 8; +		break; +	case DEVSZ_2G: +		ret = 2048 / 8; +		break; +	} +	return ret;  #endif  	BUG();  } @@ -860,6 +891,22 @@ void __init native_machine_early_platform_add_devices(void)  {  } +#ifdef CONFIG_BF60x +static inline u_long bfin_get_clk(char *name) +{ +	struct clk *clk; +	u_long clk_rate; + +	clk = clk_get(NULL, name); +	if (IS_ERR(clk)) +		return 0; + +	clk_rate = clk_get_rate(clk); +	clk_put(clk); +	return clk_rate; +} +#endif +  void __init setup_arch(char **cmdline_p)  {  	u32 mmr; @@ -870,6 +917,7 @@ void __init setup_arch(char **cmdline_p)  	enable_shadow_console();  	/* Check to make sure we are running on the right processor */ +	mmr =  bfin_cpuid();  	if (unlikely(CPUID != bfin_cpuid()))  		printk(KERN_ERR "ERROR: Not running on ADSP-%s: unknown CPUID 0x%04x Rev 0.%d\n",  			CPU, bfin_cpuid(), bfin_revid()); @@ -890,6 +938,10 @@ void __init setup_arch(char **cmdline_p)  	memset(&bfin_memmap, 0, sizeof(bfin_memmap)); +#ifdef CONFIG_BF60x +	/* Should init clock device before parse command early */ +	clk_init(); +#endif  	/* If the user does not specify things on the command line, use  	 * what the bootloader set things up as  	 */ @@ -904,6 +956,7 @@ void __init setup_arch(char **cmdline_p)  	memory_setup(); +#ifndef CONFIG_BF60x  	/* Initialize Async memory banks */  	bfin_write_EBIU_AMBCTL0(AMBCTL0VAL);  	bfin_write_EBIU_AMBCTL1(AMBCTL1VAL); @@ -913,6 +966,7 @@ void __init setup_arch(char **cmdline_p)  	bfin_write_EBIU_MODE(CONFIG_EBIU_MODEVAL);  	bfin_write_EBIU_FCTL(CONFIG_EBIU_FCTLVAL);  #endif +#endif  #ifdef CONFIG_BFIN_HYSTERESIS_CONTROL  	bfin_write_PORTF_HYSTERESIS(HYST_PORTF_0_15);  	bfin_write_PORTG_HYSTERESIS(HYST_PORTG_0_15); @@ -938,7 +992,7 @@ void __init setup_arch(char **cmdline_p)  	printk(KERN_INFO "Hardware Trace %s and %sabled\n",  		(mmr & 0x1) ? "active" : "off",  		(mmr & 0x2) ? "en" : "dis"); - +#ifndef CONFIG_BF60x  	mmr = bfin_read_SYSCR();  	printk(KERN_INFO "Boot Mode: %i\n", mmr & 0xF); @@ -980,7 +1034,7 @@ void __init setup_arch(char **cmdline_p)  		printk(KERN_INFO "Recovering from Watchdog event\n");  	else if (_bfin_swrst & RESET_SOFTWARE)  		printk(KERN_NOTICE "Reset caused by Software reset\n"); - +#endif  	printk(KERN_INFO "Blackfin support (C) 2004-2010 Analog Devices, Inc.\n");  	if (bfin_compiled_revid() == 0xffff)  		printk(KERN_INFO "Compiled for ADSP-%s Rev any, running on 0.%d\n", CPU, bfin_revid()); @@ -1008,8 +1062,13 @@ void __init setup_arch(char **cmdline_p)  	printk(KERN_INFO "Blackfin Linux support by http://blackfin.uclinux.org/\n"); +#ifdef CONFIG_BF60x +	printk(KERN_INFO "Processor Speed: %lu MHz core clock, %lu MHz SCLk, %lu MHz SCLK0, %lu MHz SCLK1 and %lu MHz DCLK\n", +		cclk / 1000000, bfin_get_clk("SYSCLK") / 1000000, get_sclk0() / 1000000, get_sclk1() / 1000000, get_dclk() / 1000000); +#else  	printk(KERN_INFO "Processor Speed: %lu MHz core clock and %lu MHz System Clock\n",  	       cclk / 1000000, sclk / 1000000); +#endif  	setup_bootmem_allocator(); @@ -1060,10 +1119,12 @@ subsys_initcall(topology_init);  /* Get the input clock frequency */  static u_long cached_clkin_hz = CONFIG_CLKIN_HZ; +#ifndef CONFIG_BF60x  static u_long get_clkin_hz(void)  {  	return cached_clkin_hz;  } +#endif  static int __init early_init_clkin_hz(char *buf)  {  	cached_clkin_hz = simple_strtoul(buf, NULL, 0); @@ -1075,6 +1136,7 @@ static int __init early_init_clkin_hz(char *buf)  }  early_param("clkin_hz=", early_init_clkin_hz); +#ifndef CONFIG_BF60x  /* Get the voltage input multiplier */  static u_long get_vco(void)  { @@ -1097,10 +1159,14 @@ static u_long get_vco(void)  	cached_vco *= msel;  	return cached_vco;  } +#endif  /* Get the Core clock */  u_long get_cclk(void)  { +#ifdef CONFIG_BF60x +	return bfin_get_clk("CCLK"); +#else  	static u_long cached_cclk_pll_div, cached_cclk;  	u_long csel, ssel; @@ -1120,12 +1186,39 @@ u_long get_cclk(void)  	else  		cached_cclk = get_vco() >> csel;  	return cached_cclk; +#endif  }  EXPORT_SYMBOL(get_cclk); -/* Get the System clock */ +#ifdef CONFIG_BF60x +/* Get the bf60x clock of SCLK0 domain */ +u_long get_sclk0(void) +{ +	return bfin_get_clk("SCLK0"); +} +EXPORT_SYMBOL(get_sclk0); + +/* Get the bf60x clock of SCLK1 domain */ +u_long get_sclk1(void) +{ +	return bfin_get_clk("SCLK1"); +} +EXPORT_SYMBOL(get_sclk1); + +/* Get the bf60x DRAM clock */ +u_long get_dclk(void) +{ +	return bfin_get_clk("DCLK"); +} +EXPORT_SYMBOL(get_dclk); +#endif + +/* Get the default system clock */  u_long get_sclk(void)  { +#ifdef CONFIG_BF60x +	return get_sclk0(); +#else  	static u_long cached_sclk;  	u_long ssel; @@ -1146,6 +1239,7 @@ u_long get_sclk(void)  	cached_sclk = get_vco() / ssel;  	return cached_sclk; +#endif  }  EXPORT_SYMBOL(get_sclk); diff --git a/arch/blackfin/kernel/shadow_console.c b/arch/blackfin/kernel/shadow_console.c index 557e9fef406..aeb8343eeb0 100644 --- a/arch/blackfin/kernel/shadow_console.c +++ b/arch/blackfin/kernel/shadow_console.c @@ -15,9 +15,9 @@  #include <asm/irq_handler.h>  #include <asm/early_printk.h> -#define SHADOW_CONSOLE_START		(0x500) -#define SHADOW_CONSOLE_END		(0x1000) -#define SHADOW_CONSOLE_MAGIC_LOC	(0x4F0) +#define SHADOW_CONSOLE_START		(CONFIG_PHY_RAM_BASE_ADDRESS + 0x500) +#define SHADOW_CONSOLE_END		(CONFIG_PHY_RAM_BASE_ADDRESS + 0x1000) +#define SHADOW_CONSOLE_MAGIC_LOC	(CONFIG_PHY_RAM_BASE_ADDRESS + 0x4F0)  #define SHADOW_CONSOLE_MAGIC		(0xDEADBEEF)  static __initdata char *shadow_console_buffer = (char *)SHADOW_CONSOLE_START; diff --git a/arch/blackfin/kernel/time-ts.c b/arch/blackfin/kernel/time-ts.c index d98f2d69b0c..f608f02f29a 100644 --- a/arch/blackfin/kernel/time-ts.c +++ b/arch/blackfin/kernel/time-ts.c @@ -66,8 +66,14 @@ void __init setup_gptimer0(void)  {  	disable_gptimers(TIMER0bit); +#ifdef CONFIG_BF60x +	bfin_write16(TIMER_DATA_IMSK, 0); +	set_gptimer_config(TIMER0_id,  TIMER_OUT_DIS +		| TIMER_MODE_PWM_CONT | TIMER_PULSE_HI | TIMER_IRQ_PER); +#else  	set_gptimer_config(TIMER0_id, \  		TIMER_OUT_DIS | TIMER_PERIOD_CNT | TIMER_MODE_PWM); +#endif  	set_gptimer_period(TIMER0_id, -1);  	set_gptimer_pwidth(TIMER0_id, -2);  	SSYNC(); @@ -135,9 +141,15 @@ static void bfin_gptmr0_set_mode(enum clock_event_mode mode,  {  	switch (mode) {  	case CLOCK_EVT_MODE_PERIODIC: { +#ifndef CONFIG_BF60x  		set_gptimer_config(TIMER0_id, \  			TIMER_OUT_DIS | TIMER_IRQ_ENA | \  			TIMER_PERIOD_CNT | TIMER_MODE_PWM); +#else +		set_gptimer_config(TIMER0_id,  TIMER_OUT_DIS +			| TIMER_MODE_PWM_CONT | TIMER_PULSE_HI | TIMER_IRQ_PER); +#endif +  		set_gptimer_period(TIMER0_id, get_sclk() / HZ);  		set_gptimer_pwidth(TIMER0_id, get_sclk() / HZ - 1);  		enable_gptimers(TIMER0bit); @@ -145,8 +157,14 @@ static void bfin_gptmr0_set_mode(enum clock_event_mode mode,  	}  	case CLOCK_EVT_MODE_ONESHOT:  		disable_gptimers(TIMER0bit); +#ifndef CONFIG_BF60x  		set_gptimer_config(TIMER0_id, \  			TIMER_OUT_DIS | TIMER_IRQ_ENA | TIMER_MODE_PWM); +#else +		set_gptimer_config(TIMER0_id, TIMER_OUT_DIS | TIMER_MODE_PWM +			| TIMER_PULSE_HI | TIMER_IRQ_WID_DLY); +#endif +  		set_gptimer_period(TIMER0_id, 0);  		break;  	case CLOCK_EVT_MODE_UNUSED: @@ -160,7 +178,7 @@ static void bfin_gptmr0_set_mode(enum clock_event_mode mode,  static void bfin_gptmr0_ack(void)  { -	set_gptimer_status(TIMER_GROUP1, TIMER_STATUS_TIMIL0); +	clear_gptimer_intr(TIMER0_id);  }  static void __init bfin_gptmr0_init(void) @@ -197,7 +215,7 @@ static struct clock_event_device clockevent_gptmr0 = {  	.rating		= 300,  	.irq		= IRQ_TIMER0,  	.shift		= 32, -	.features	= CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, +	.features 	= CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,  	.set_next_event = bfin_gptmr0_set_next_event,  	.set_mode	= bfin_gptmr0_set_mode,  }; @@ -312,6 +330,11 @@ void bfin_coretmr_clockevent_init(void)  #endif +#ifdef CONFIG_SMP +	evt->broadcast = smp_timer_broadcast; +#endif + +  	evt->name = "bfin_core_timer";  	evt->rating = 350;  	evt->irq = -1;  |