diff options
86 files changed, 2021 insertions, 1143 deletions
| @@ -381,6 +381,12 @@ LIST_pxa="$(boards_by_cpu pxa)"  LIST_ixp="$(boards_by_cpu ixp)"  ######################################################################### +## SPEAr Systems +######################################################################### + +LIST_spear="$(boards_by_soc spear)" + +#########################################################################  ## ARM groups  ######################################################################### @@ -293,7 +293,10 @@ LIBS-y += drivers/net/libnet.o  LIBS-y += drivers/net/phy/libphy.o  LIBS-y += drivers/pci/libpci.o  LIBS-y += drivers/pcmcia/libpcmcia.o -LIBS-y += drivers/power/libpower.o +LIBS-y += drivers/power/libpower.o \ +	drivers/power/fuel_gauge/libfuel_gauge.o \ +	drivers/power/pmic/libpmic.o \ +	drivers/power/battery/libbattery.o  LIBS-y += drivers/spi/libspi.o  LIBS-y += drivers/dfu/libdfu.o  ifeq ($(CPU),mpc83xx) @@ -811,7 +814,7 @@ clean:  	@rm -f $(obj)include/generated/asm-offsets.h  	@rm -f $(obj)$(CPUDIR)/$(SOC)/asm-offsets.s  	@rm -f $(TIMESTAMP_FILE) $(VERSION_FILE) -	@$(MAKE) -C doc/DocBook/ cleandocs +	@$(MAKE) -s -C doc/DocBook/ cleandocs  	@find $(OBJTREE) -type f \  		\( -name 'core' -o -name '*.bak' -o -name '*~' -o -name '*.su' \  		-o -name '*.o'	-o -name '*.a' -o -name '*.exe'	\) -print \ diff --git a/arch/arm/lib/board.c b/arch/arm/lib/board.c index 92cad9a6e..22a4d9cc0 100644 --- a/arch/arm/lib/board.c +++ b/arch/arm/lib/board.c @@ -224,6 +224,13 @@ int __arch_cpu_init(void)  int arch_cpu_init(void)  	__attribute__((weak, alias("__arch_cpu_init"))); +int __power_init_board(void) +{ +	return 0; +} +int power_init_board(void) +	__attribute__((weak, alias("__power_init_board"))); +  init_fnc_t *init_sequence[] = {  	arch_cpu_init,		/* basic arch cpu dependent setup */ @@ -525,6 +532,7 @@ void board_init_r(gd_t *id, ulong dest_addr)  #ifdef CONFIG_ARCH_EARLY_INIT_R  	arch_early_init_r();  #endif +	power_init_board();  #if !defined(CONFIG_SYS_NO_FLASH)  	puts("Flash: "); diff --git a/arch/microblaze/cpu/cache.c b/arch/microblaze/cpu/cache.c index d258a6938..ce066b96e 100644 --- a/arch/microblaze/cpu/cache.c +++ b/arch/microblaze/cpu/cache.c @@ -61,12 +61,7 @@ void	dcache_enable (void) {  void	dcache_disable(void) {  #ifdef XILINX_USE_DCACHE -#ifdef XILINX_DCACHE_BYTE_SIZE  	flush_cache(0, XILINX_DCACHE_BYTE_SIZE); -#else -#warning please rebuild BSPs and update configuration -	flush_cache(0, 32768); -#endif  #endif  	MSRCLR(0x80);  } diff --git a/arch/microblaze/cpu/start.S b/arch/microblaze/cpu/start.S index 8564c4e30..3da711d4d 100644 --- a/arch/microblaze/cpu/start.S +++ b/arch/microblaze/cpu/start.S @@ -132,6 +132,12 @@ _start:  	rsubi	r8, r10, 0x26  	sh	r6, r0, r8 +	/* Flush cache before enable cache */ +	addik	r5, r0, 0 +	addik	r6, r0, XILINX_DCACHE_BYTE_SIZE +flush:	bralid r15, flush_cache +	nop +  	/* enable instruction and data cache */  	mfs	r12, rmsr  	ori	r12, r12, 0xa0 diff --git a/arch/microblaze/cpu/u-boot.lds b/arch/microblaze/cpu/u-boot.lds index 4297b9344..fe3d97dad 100644 --- a/arch/microblaze/cpu/u-boot.lds +++ b/arch/microblaze/cpu/u-boot.lds @@ -45,7 +45,9 @@ SECTIONS  	.data ALIGN(0x4):  	{  		__data_start = .; +#ifdef CONFIG_OF_EMBED  		dts/libdts.o (.data) +#endif  		*(.data)  		__data_end = .;  	} diff --git a/arch/microblaze/include/asm/bitops.h b/arch/microblaze/include/asm/bitops.h index e8c835f7c..eafa2b576 100644 --- a/arch/microblaze/include/asm/bitops.h +++ b/arch/microblaze/include/asm/bitops.h @@ -319,7 +319,8 @@ extern __inline__ int ext2_test_bit(int nr, const volatile void * addr)  #define ext2_find_first_zero_bit(addr, size) \  	ext2_find_next_zero_bit((addr), (size), 0) -extern __inline__ unsigned long ext2_find_next_zero_bit(void *addr, unsigned long size, unsigned long offset) +static inline unsigned long ext2_find_next_zero_bit(void *addr, +				unsigned long size, unsigned long offset)  {  	unsigned long *p = ((unsigned long *) addr) + (offset >> 5);  	unsigned long result = offset & ~31UL; diff --git a/arch/microblaze/include/asm/byteorder.h b/arch/microblaze/include/asm/byteorder.h index b2757a41f..f3a471d1b 100644 --- a/arch/microblaze/include/asm/byteorder.h +++ b/arch/microblaze/include/asm/byteorder.h @@ -20,29 +20,6 @@  #ifdef __GNUC__ -/* This is effectively a dupe of the arch-independent byteswap -   code in include/linux/byteorder/swab.h, however we force a cast -   of the result up to 32 bits.  This in turn forces the compiler -   to explicitly clear the high 16 bits, which it wasn't doing otherwise. - -   I think this is a symptom of a bug in mb-gcc.  JW 20040303 -*/ - - -static __inline__ __u16 ___arch__swab16 (__u16 half_word) -{ -	/* 32 bit temp to cast result, forcing clearing of high word */ -	__u32 temp; - -	temp = ((half_word & 0x00FFU) << 8) | ((half_word & 0xFF00U) >> 8); - -	return (__u16) temp; -} - -#define __arch__swab16(x) ___arch__swab16(x) - -/* Microblaze has no arch-specific endian conversion insns */ -  #if !defined(__STRICT_ANSI__) || defined(__KERNEL__)  #  define __BYTEORDER_HAS_U64__  #  define __SWAB_64_THRU_32__ diff --git a/arch/microblaze/include/asm/posix_types.h b/arch/microblaze/include/asm/posix_types.h index 9a2cc663e..38dc5aa85 100644 --- a/arch/microblaze/include/asm/posix_types.h +++ b/arch/microblaze/include/asm/posix_types.h @@ -16,9 +16,6 @@  #ifndef __MICROBLAZE_POSIX_TYPES_H__  #define __MICROBLAZE_POSIX_TYPES_H__ -#include <asm/bitops.h> - -  typedef unsigned int	__kernel_dev_t;  typedef unsigned long	__kernel_ino_t;  typedef unsigned long long __kernel_ino64_t; diff --git a/arch/microblaze/lib/bootm.c b/arch/microblaze/lib/bootm.c index 95cee509d..66d21f4ef 100644 --- a/arch/microblaze/lib/bootm.c +++ b/arch/microblaze/lib/bootm.c @@ -70,12 +70,7 @@ int do_bootm_linux(int flag, int argc, char * const argv[], bootm_headers_t *ima  #endif  #ifdef XILINX_USE_DCACHE -#ifdef XILINX_DCACHE_BYTE_SIZE  	flush_cache(0, XILINX_DCACHE_BYTE_SIZE); -#else -#warning please rebuild BSPs and update configuration -	flush_cache(0, 32768); -#endif  #endif  	/*  	 * Linux Kernel Parameters (passing device tree): diff --git a/board/BuS/eb_cpu5282/Makefile b/board/BuS/eb_cpu5282/Makefile index 0f14699c5..ac860c134 100644 --- a/board/BuS/eb_cpu5282/Makefile +++ b/board/BuS/eb_cpu5282/Makefile @@ -25,7 +25,7 @@ include $(TOPDIR)/config.mk  LIB	= $(obj)lib$(BOARD).o -COBJS	= $(BOARD).o cfm_flash.o flash.o +COBJS	= $(BOARD).o  SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c)  OBJS	:= $(addprefix $(obj),$(COBJS)) diff --git a/board/BuS/eb_cpu5282/cfm_flash.c b/board/BuS/eb_cpu5282/cfm_flash.c deleted file mode 100644 index fe03b1758..000000000 --- a/board/BuS/eb_cpu5282/cfm_flash.c +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Basic Flash Driver for Freescale MCF 5281/5282 internal FLASH - * - * (C) Copyright 2005 BuS Elektronik GmbH & Co.KG <esw@bus-elektonik.de> - * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA - */ - -#include <common.h> -#include <asm/m5282.h> -#include  "cfm_flash.h" - -#if defined(CONFIG_M5281) || defined(CONFIG_M5282) - -#if (CONFIG_SYS_CLK>20000000) -	#define CFM_CLK  (((long) CONFIG_SYS_CLK / (400000 * 8) + 1) | 0x40) -#else -	#define CFM_CLK  ((long) CONFIG_SYS_CLK / 400000 + 1) -#endif - -#define cmf_backdoor_address(addr)	(((addr) & 0x0007FFFF) | 0x04000000 | \ -					 (CONFIG_SYS_MBAR & 0xC0000000)) - -void cfm_flash_print_info (flash_info_t * info) -{ -	printf ("Freescale: "); -	switch (info->flash_id & FLASH_TYPEMASK) { -	case FREESCALE_ID_MCF5281 & FLASH_TYPEMASK: -		printf ("MCF5281 internal FLASH\n"); -		break; -	case FREESCALE_ID_MCF5282 & FLASH_TYPEMASK: -		printf ("MCF5282 internal FLASH\n"); -		break; -	default: -		printf ("Unknown Chip Type\n"); -		break; -	} -} - -void cfm_flash_init (flash_info_t * info) -{ -	int sector; -	ulong protection; -	MCFCFM_MCR = 0; -	MCFCFM_CLKD = CFM_CLK; -	debug ("CFM Clock divider: %ld (%d Hz @ %ld Hz)\n",CFM_CLK,\ -		CONFIG_SYS_CLK / (2* ((CFM_CLK & 0x3F)+1) * (1+((CFM_CLK & 0x40)>>6)*7)),\ -		CONFIG_SYS_CLK); -	MCFCFM_SACC = 0; -	MCFCFM_DACC = 0; - -	if (MCFCFM_SEC & MCFCFM_SEC_KEYEN) -		puts("CFM backdoor access is enabled\n"); -	if (MCFCFM_SEC & MCFCFM_SEC_SECSTAT) -		puts("CFM securety is enabled\n"); - -	#ifdef CONFIG_M5281 -		info->flash_id = (FREESCALE_MANUFACT & FLASH_VENDMASK) | -				 (FREESCALE_ID_MCF5281 & FLASH_TYPEMASK); -		info->size = 256*1024; -		info->sector_count = 16; -	#else -		info->flash_id = (FREESCALE_MANUFACT & FLASH_VENDMASK) | -				 (FREESCALE_ID_MCF5282 & FLASH_TYPEMASK); -		info->size = 512*1024; -		info->sector_count = 32; -	#endif -	protection = MCFCFM_PROT; -	for (sector = 0; sector < info->sector_count; sector++) -	{ -		if (sector == 0) -		{ -			info->start[sector] = CONFIG_SYS_INT_FLASH_BASE; -		} -		else -		{ -			info->start[sector] = info->start[sector-1] + 0x04000; -		} -		info->protect[sector] = protection & 1; -		protection >>= 1; -	} -} - -int cfm_flash_readycheck(int checkblank) -{ -	int	rc; -	unsigned char state; - -	rc	= ERR_OK; -	while (!(MCFCFM_USTAT & MCFCFM_USTAT_CCIF)); -	state = MCFCFM_USTAT; -	if (state & MCFCFM_USTAT_ACCERR) -	{ -		debug ("%s(): CFM access error",__FUNCTION__); -		rc = ERR_PROG_ERROR; -	} -	if (state & MCFCFM_USTAT_PVIOL) -	{ -		debug ("%s(): CFM protection violation",__FUNCTION__); -		rc = ERR_PROTECTED; -	} -	if (checkblank) -	{ -		if (!(state & MCFCFM_USTAT_BLANK)) -		{ -			debug ("%s(): CFM erras error",__FUNCTION__); -			rc = ERR_NOT_ERASED; -		} -	} -	MCFCFM_USTAT = state & 0x34; /* reset state */ -	return rc; -} - -/* Erase 16KiB = 8 2KiB pages */ - -int cfm_flash_erase_sector (flash_info_t * info, int sector) -{ -	ulong address; -	int page; -	int rc; -	rc= ERR_OK; -	address = cmf_backdoor_address(info->start[sector]); -	for (page=0; (page<8) && (rc==ERR_OK); page++) -	{ -		*(volatile __u32*) address = 0; -		MCFCFM_CMD = MCFCFM_CMD_PGERS; -		MCFCFM_USTAT = MCFCFM_USTAT_CBEIF; -		rc = cfm_flash_readycheck(0); -		if (rc==ERR_OK) -		{ -			*(volatile __u32*) address = 0; -			MCFCFM_CMD = MCFCFM_CMD_PGERSVER; -			MCFCFM_USTAT = MCFCFM_USTAT_CBEIF; -			rc = cfm_flash_readycheck(1); -		} -		address += 0x800; -	} -	return rc; -} - -int cfm_flash_write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt) -{ -	int rc; -	ulong dest, data; - -	rc = ERR_OK; -	if (addr & 3) -	{ -		debug ("Byte and Word alignment not supported\n"); -		rc = ERR_ALIGN; -	} -	if (cnt & 3) -	{ -		debug ("Byte and Word transfer not supported\n"); -		rc = ERR_ALIGN; -	} -	dest = cmf_backdoor_address(addr); -	while ((cnt>=4) && (rc == ERR_OK)) -	{ -		data = *((volatile u32 *) src); -		*(volatile u32*) dest = data; -		MCFCFM_CMD = MCFCFM_CMD_PGM; -		MCFCFM_USTAT = MCFCFM_USTAT_CBEIF; -		rc = cfm_flash_readycheck(0); -		if (*(volatile u32*) addr != data) rc = ERR_PROG_ERROR; -		src +=4; -		dest +=4; -		addr +=4; -		cnt -=4; -	} -	return rc; -} - -#ifdef CONFIG_SYS_FLASH_PROTECTION - -int cfm_flash_protect(flash_info_t * info,long sector,int prot) -{ -	int rc; - -	rc= ERR_OK; -	if (prot) -	{ -		MCFCFM_PROT |= (1<<sector); -		info->protect[sector]=1; -	} -	else -	{ -		MCFCFM_PROT &= ~(1<<sector); -		info->protect[sector]=0; -	} -	return rc; -} - -#endif - -#endif diff --git a/board/BuS/eb_cpu5282/cfm_flash.h b/board/BuS/eb_cpu5282/cfm_flash.h deleted file mode 100644 index ed4e7943e..000000000 --- a/board/BuS/eb_cpu5282/cfm_flash.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Basic Flash Driver for Freescale MCF 5282 internal FLASH - * - * (C) Copyright 2005 BuS Elektronik GmbH & Co.KG <esw@bus-elektonik.de> - * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA - */ - -#ifndef __CFM_FLASH_H_ -#define __CFM_FLASH_H_ - -#define	FREESCALE_MANUFACT 0xFACFFACF -#define	FREESCALE_ID_MCF5281 0x5281 -#define	FREESCALE_ID_MCF5282 0x5282 - -extern void cfm_flash_print_info (flash_info_t * info); -extern int cfm_flash_erase_sector (flash_info_t * info, int sector); -extern void cfm_flash_init (flash_info_t * info); -extern int cfm_flash_write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt); -#ifdef CONFIG_SYS_FLASH_PROTECTION -extern int cfm_flash_protect(flash_info_t * info,long sector,int prot); -#endif - -#endif diff --git a/board/BuS/eb_cpu5282/eb_cpu5282.c b/board/BuS/eb_cpu5282/eb_cpu5282.c index d64ad1b70..f73431eff 100644 --- a/board/BuS/eb_cpu5282/eb_cpu5282.c +++ b/board/BuS/eb_cpu5282/eb_cpu5282.c @@ -35,18 +35,19 @@  DECLARE_GLOBAL_DATA_PTR; +#ifdef CONFIG_VIDEO  unsigned long display_width;  unsigned long display_height; +#endif  /*---------------------------------------------------------------------------*/  int checkboard (void)  { -	puts ("Board: MCF-EV1 + MCF-EV23 (BuS Elektronik GmbH & Co. KG)\n"); +	puts("Board: EB+CPU5282 (BuS Elektronik GmbH & Co. KG)\n");  #if (CONFIG_SYS_TEXT_BASE ==  CONFIG_SYS_INT_FLASH_BASE) -	puts ("       Boot from Internal FLASH\n"); +	puts("       Boot from Internal FLASH\n");  #endif -  	return 0;  } @@ -55,29 +56,39 @@ phys_size_t initdram (int board_type)  	int size, i;  	size = 0; -	MCFSDRAMC_DCR = MCFSDRAMC_DCR_RTIM_6 -			| MCFSDRAMC_DCR_RC ((15 * CONFIG_SYS_CLK) >> 4); +	MCFSDRAMC_DCR = MCFSDRAMC_DCR_RTIM_6 | +			MCFSDRAMC_DCR_RC((15 * CONFIG_SYS_CLK / 1000000) >> 4); +	asm (" nop");  #ifdef CONFIG_SYS_SDRAM_BASE0 - -	MCFSDRAMC_DACR0 = MCFSDRAMC_DACR_BASE (CONFIG_SYS_SDRAM_BASE0) -			| MCFSDRAMC_DACR_CASL (1) -			| MCFSDRAMC_DACR_CBM (3) -			| MCFSDRAMC_DACR_PS_16; +	MCFSDRAMC_DACR0 = MCFSDRAMC_DACR_BASE(CONFIG_SYS_SDRAM_BASE0)| +		MCFSDRAMC_DACR_CASL(1) | MCFSDRAMC_DACR_CBM(3) | +		MCFSDRAMC_DACR_PS_32; +	asm (" nop");  	MCFSDRAMC_DMR0 = MCFSDRAMC_DMR_BAM_16M | MCFSDRAMC_DMR_V; +	asm (" nop");  	MCFSDRAMC_DACR0 |= MCFSDRAMC_DACR_IP; +	asm (" nop"); +	for (i = 0; i < 10; i++) +		asm (" nop"); -	*(unsigned short *) (CONFIG_SYS_SDRAM_BASE0) = 0xA5A5; +	*(unsigned long *)(CONFIG_SYS_SDRAM_BASE0) = 0xA5A5A5A5; +	asm (" nop");  	MCFSDRAMC_DACR0 |= MCFSDRAMC_DACR_RE; +	asm (" nop"); +  	for (i = 0; i < 2000; i++)  		asm (" nop"); -	mbar_writeLong (MCFSDRAMC_DACR0, -			mbar_readLong (MCFSDRAMC_DACR0) | MCFSDRAMC_DACR_IMRS); -	*(unsigned int *) (CONFIG_SYS_SDRAM_BASE0 + 0x220) = 0xA5A5; -	size += CONFIG_SYS_SDRAM_SIZE * 1024 * 1024; + +	MCFSDRAMC_DACR0 |= MCFSDRAMC_DACR_IMRS; +	asm (" nop"); +	/* write SDRAM mode register */ +	*(unsigned long *)(CONFIG_SYS_SDRAM_BASE0 + 0x80440) = 0xA5A5A5A5; +	asm (" nop"); +	size += CONFIG_SYS_SDRAM_SIZE0 * 1024 * 1024;  #endif -#ifdef CONFIG_SYS_SDRAM_BASE1 +#ifdef CONFIG_SYS_SDRAM_BASE1xx  	MCFSDRAMC_DACR1 = MCFSDRAMC_DACR_BASE (CONFIG_SYS_SDRAM_BASE1)  			| MCFSDRAMC_DACR_CASL (1)  			| MCFSDRAMC_DACR_CBM (3) @@ -134,38 +145,74 @@ int testdram (void)  }  #endif +#if defined(CONFIG_HW_WATCHDOG) + +void hw_watchdog_init(void) +{ +	char *s; +	int enable; + +	enable = 1; +	s = getenv("watchdog"); +	if (s != NULL) +		if ((strncmp(s, "off", 3) == 0) || (strncmp(s, "0", 1) == 0)) +			enable = 0; +	if (enable) +		MCFGPTA_GPTDDR  |= (1<<2); +	else +		MCFGPTA_GPTDDR  &= ~(1<<2); +} + +void hw_watchdog_reset(void) +{ +	MCFGPTA_GPTPORT  ^= (1<<2); +} +#endif +  int misc_init_r(void)  {  #ifdef	CONFIG_HW_WATCHDOG  	hw_watchdog_init();  #endif -#ifndef CONFIG_VIDEO -	vcxk_init(16, 16); -#endif  	return 1;  } -#if defined(CONFIG_VIDEO) +void __led_toggle(led_id_t mask) +{ +	MCFGPTA_GPTPORT ^= (1 << 3); +} -/* - ****h* EB+CPU5282-T1/drv_video_init - * FUNCTION - *** - */ +void __led_init(led_id_t mask, int state) +{ +	__led_set(mask, state); +	MCFGPTA_GPTDDR  |= (1 << 3); +} + +void __led_set(led_id_t mask, int state) +{ +	if (state == STATUS_LED_ON) +		MCFGPTA_GPTPORT |= (1 << 3); +	else +		MCFGPTA_GPTPORT &= ~(1 << 3); +} + +#if defined(CONFIG_VIDEO)  int drv_video_init(void)  {  	char *s; +#ifdef CONFIG_SPLASH_SCREEN  	unsigned long splash; - +#endif  	printf("Init Video as "); - -	if ((s = getenv("displaywidth")) != NULL) +	s = getenv("displaywidth"); +	if (s != NULL)  		display_width = simple_strtoul(s, NULL, 10);  	else  		display_width = 256; -	if ((s = getenv("displayheight")) != NULL) +	s = getenv("displayheight"); +	if (s != NULL)  		display_height = simple_strtoul(s, NULL, 10);  	else  		display_height = 256; @@ -178,10 +225,9 @@ int drv_video_init(void)  	vcxk_init(display_width, display_height);  #ifdef CONFIG_SPLASH_SCREEN -	if ((s = getenv("splashimage")) != NULL) { -		debug("use splashimage: %s\n", s); +	s = getenv("splashimage"); +	if (s != NULL) {  		splash = simple_strtoul(s, NULL, 16); -		debug("use splashimage: %x\n", splash);  		vcxk_acknowledge_wait();  		video_display_bitmap(splash, 0, 0);  	} diff --git a/board/BuS/eb_cpu5282/flash.c b/board/BuS/eb_cpu5282/flash.c deleted file mode 100644 index 8b7f9578f..000000000 --- a/board/BuS/eb_cpu5282/flash.c +++ /dev/null @@ -1,415 +0,0 @@ -/* - * (C) Copyright 2005 - * BuS Elektronik GmbH & Co.KG <esw@bus-elektonik.de> - * - * Based On - * Wolfgang Denk, DENX Software Engineering, wd@denx.de. - * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA - */ - -#include <common.h> -#include  "cfm_flash.h" - -#define PHYS_FLASH_1 CONFIG_SYS_FLASH_BASE -#define FLASH_BANK_SIZE 0x200000 - -flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS]; - -void flash_print_info (flash_info_t * info) -{ -	int i; - -	switch (info->flash_id & FLASH_VENDMASK) { -	case (AMD_MANUFACT & FLASH_VENDMASK): -		printf ("AMD: "); -		switch (info->flash_id & FLASH_TYPEMASK) { -		case (AMD_ID_LV160B & FLASH_TYPEMASK): -			printf ("AM29LV160B (16Bit)\n"); -			break; -		default: -			printf ("Unknown Chip Type\n"); -			break; -		} -		break; -	case FREESCALE_MANUFACT & FLASH_VENDMASK: -		cfm_flash_print_info (info); -		break; -	default: -		printf ("Unknown Vendor "); -		break; -	} - -	puts ("  Size: "); -	if ((info->size >> 20) > 0) -	{ -		printf ("%ld MiB",info->size >> 20); -	} -	else -	{ -		printf ("%ld KiB",info->size >> 10); -	} -	printf (" in %d Sectors\n", info->sector_count); - -	printf ("  Sector Start Addresses:"); -	for (i = 0; i < info->sector_count; i++) { -		if ((i % 4) == 0) { -			printf ("\n    "); -		} -		printf ("%02d: %08lX%s  ", i,info->start[i], -			info->protect[i] ? " P" : "  "); -	} -	printf ("\n\n"); -} - -unsigned long flash_init (void) -{ -	int i, j; -	ulong size = 0; - -	for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i++) { -		ulong flashbase = 0; - -		switch (i) -		{ -		case 1: -			flash_info[i].flash_id = -				(AMD_MANUFACT & FLASH_VENDMASK) | -				(AMD_ID_LV160B & FLASH_TYPEMASK); -			flash_info[i].size = FLASH_BANK_SIZE; -			flash_info[i].sector_count = CONFIG_SYS_MAX_FLASH_SECT; -			memset (flash_info[i].protect, 0, CONFIG_SYS_MAX_FLASH_SECT); -			flashbase = PHYS_FLASH_1; -			for (j = 0; j < flash_info[i].sector_count; j++) { -				if (j == 0) { -					/* 1st is 16 KiB */ -					flash_info[i].start[j] = flashbase; -				} -				if ((j >= 1) && (j <= 2)) { -				/* 2nd and 3rd are 8 KiB */ -					flash_info[i].start[j] = -						flashbase + 0x4000 + 0x2000 * (j - 1); -				} -				if (j == 3) { -					/* 4th is 32 KiB */ -					flash_info[i].start[j] = flashbase + 0x8000; -				} -				if ((j >= 4) && (j <= 34)) { -					/* rest is 256 KiB */ -					flash_info[i].start[j] = -						flashbase + 0x10000 + 0x10000 * (j - 4); -				} -			} -			break; -		case 0: -			cfm_flash_init (&flash_info[i]); -			break; -		default: -			panic ("configured to many flash banks!\n"); -		} - -		size += flash_info[i].size; -	} - -	flash_protect (FLAG_PROTECT_SET, -		       CONFIG_SYS_FLASH_BASE, -		       CONFIG_SYS_FLASH_BASE + 0xffff, &flash_info[0]); - -	return size; -} - -#define CMD_READ_ARRAY		0x00F0 -#define CMD_UNLOCK1		0x00AA -#define CMD_UNLOCK2		0x0055 -#define CMD_ERASE_SETUP		0x0080 -#define CMD_ERASE_CONFIRM	0x0030 -#define CMD_PROGRAM		0x00A0 -#define CMD_UNLOCK_BYPASS	0x0020 - -#define MEM_FLASH_ADDR1		(*(volatile u16 *)(info->start[0] + (0x00000555<<1))) -#define MEM_FLASH_ADDR2		(*(volatile u16 *)(info->start[0] + (0x000002AA<<1))) - - -#define BIT_ERASE_DONE		0x0080 -#define BIT_RDY_MASK		0x0080 -#define BIT_PROGRAM_ERROR	0x0020 -#define BIT_TIMEOUT		0x80000000	/* our flag */ - -#define ERR_READY -1 - -int amd_flash_erase_sector(flash_info_t * info, int sector) -{ -	int state; -	ulong result; -	ulong start; - -	volatile u16 *addr = -				(volatile u16 *) (info->start[sector]); - -	MEM_FLASH_ADDR1 = CMD_UNLOCK1; -	MEM_FLASH_ADDR2 = CMD_UNLOCK2; -	MEM_FLASH_ADDR1 = CMD_ERASE_SETUP; - -	MEM_FLASH_ADDR1 = CMD_UNLOCK1; -	MEM_FLASH_ADDR2 = CMD_UNLOCK2; -	*addr = CMD_ERASE_CONFIRM; - -	/* wait until flash is ready */ -	state = 0; -	start = get_timer(0); - -	do { -		result = *addr; - -		/* check timeout */ -		if (get_timer(start) > CONFIG_SYS_FLASH_ERASE_TOUT) { -			MEM_FLASH_ADDR1 = CMD_READ_ARRAY; -			state = ERR_TIMOUT; -		} - -		if (!state && (result & 0xFFFF) & BIT_ERASE_DONE) -			state = ERR_READY; -	} -	while (!state); -	if (state == ERR_READY) -		state = ERR_OK; - -	MEM_FLASH_ADDR1 = CMD_READ_ARRAY; - -	return state; -} - -int flash_erase (flash_info_t * info, int s_first, int s_last) -{ -	int iflag, cflag; -	int sector; -	int rc; - -	rc = ERR_OK; - -	if (info->flash_id == FLASH_UNKNOWN) -	{ -		rc = ERR_UNKNOWN_FLASH_TYPE; -	} /* (info->flash_id == FLASH_UNKNOWN) */ - -	if ((s_first < 0) || (s_first > s_last) || s_last >= info->sector_count) -	{ -		rc = ERR_INVAL; -	} - -	cflag = icache_status (); -	icache_disable (); -	iflag = disable_interrupts (); - -	for (sector = s_first; (sector <= s_last) && (rc == ERR_OK); sector++) { - -		if (info->protect[sector]) -		{ -			putc('P'); /*  protected sector will not erase */ -		} -		else -		{ -			/* erase on unprotected sector */ -			puts("E\b"); -			switch (info->flash_id & FLASH_VENDMASK) -			{ -			case (AMD_MANUFACT & FLASH_VENDMASK): -				rc = amd_flash_erase_sector(info,sector); -				break; -			case (FREESCALE_MANUFACT & FLASH_VENDMASK): -				rc = cfm_flash_erase_sector(info,sector); -				break; -			default: -				return ERR_UNKNOWN_FLASH_VENDOR; -			} -			putc('.'); -		} -	} -	if (rc!=ERR_OK) -	{ -		printf ("\n   "); -		flash_perror (rc); -	} -	else -	{ -		printf (" done\n"); -	} - -	udelay (10000);	/* allow flash to settle - wait 10 ms */ - -	if (iflag) -		enable_interrupts (); - -	if (cflag) -		icache_enable (); - -	return rc; -} - -volatile static int amd_write_word (flash_info_t * info, ulong dest, u16 data) -{ -	volatile u16 *addr; -	ulong result; -	int cflag, iflag; -	int state; -	ulong start; - -	/* -	 * Check if Flash is (sufficiently) erased -	 */ -	addr = (volatile u16 *) dest; - -	result = *addr; -	if ((result & data) != data) -		return ERR_NOT_ERASED; - -	/* -	 * Disable interrupts which might cause a timeout -	 * here. Remember that our exception vectors are -	 * at address 0 in the flash, and we don't want a -	 * (ticker) exception to happen while the flash -	 * chip is in programming mode. -	 */ - -	cflag = icache_status (); -	icache_disable (); -	iflag = disable_interrupts (); - -	MEM_FLASH_ADDR1 = CMD_UNLOCK1; -	MEM_FLASH_ADDR2 = CMD_UNLOCK2; -	MEM_FLASH_ADDR1 = CMD_PROGRAM; -	*addr = data; - -	/* arm simple, non interrupt dependent timer */ -	start = get_timer(0); - -	/* wait until flash is ready */ -	state = 0; -	do { -		result = *addr; - -		/* check timeout */ -		if (get_timer(start) > CONFIG_SYS_FLASH_ERASE_TOUT) { -				state = ERR_TIMOUT; -		} -		if (!state && ((result & BIT_RDY_MASK) == (data & BIT_RDY_MASK))) -			state = ERR_READY; - -	} while (!state); - -	*addr = CMD_READ_ARRAY; - -	if (state == ERR_READY) -		state = ERR_OK; -	if ((*addr != data) && (state != ERR_TIMOUT)) -		state = ERR_PROG_ERROR; - -	if (iflag) -		enable_interrupts (); - -	if (cflag) -		icache_enable (); - -	return state; -} - -int amd_flash_write_buff(flash_info_t * info, uchar * src, ulong addr, ulong cnt) -{ -	int rc; -	ulong dest; -	u16 data; - -	rc = ERR_OK; -	if (addr & 1) -	{ -		debug ("Byte alignment not supported\n"); -		rc = ERR_ALIGN; -	} -	if (cnt & 1) -	{ -		debug ("Byte transfer not supported\n"); -		rc = ERR_ALIGN; -	} - -	dest = addr; -	while ((cnt>=2) && (rc == ERR_OK)) -	{ -		data = *((volatile u16 *) src); -		rc=amd_write_word (info,dest,data); -		src +=2; -		dest +=2; -		cnt -=2; -	} -	return rc; -} - -int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt) -{ -	int rc; - -	switch (info->flash_id & FLASH_VENDMASK) -	{ -		case (AMD_MANUFACT & FLASH_VENDMASK): -			rc = amd_flash_write_buff(info,src,addr,cnt); -			break; -		case (FREESCALE_MANUFACT & FLASH_VENDMASK): -			rc = cfm_flash_write_buff(info,src,addr,cnt); -			break; -		default: -			rc = ERR_UNKNOWN_FLASH_VENDOR; -	} -	return rc; - -} -int amd_flash_protect(flash_info_t * info,long sector,int prot) -{ -	int rc; -	rc= ERR_OK; -	if (prot) -	{ -		info->protect[sector]=1; -	} -	else -	{ -		info->protect[sector]=0; -	} -	return rc; -} - -#ifdef CONFIG_SYS_FLASH_PROTECTION - -int flash_real_protect(flash_info_t * info,long sector,int prot) -{ -	int rc; - -	switch (info->flash_id & FLASH_VENDMASK) -	{ -		case (AMD_MANUFACT & FLASH_VENDMASK): -			rc = amd_flash_protect(info,sector,prot); -			break; -		case (FREESCALE_MANUFACT & FLASH_VENDMASK): -			rc = cfm_flash_protect(info,sector,prot); -			break; -		default: -			rc = ERR_UNKNOWN_FLASH_VENDOR; -	} -	return rc; -} - -#endif diff --git a/board/davedenx/qong/qong.c b/board/davedenx/qong/qong.c index c41f11d60..a3079dbca 100644 --- a/board/davedenx/qong/qong.c +++ b/board/davedenx/qong/qong.c @@ -28,11 +28,12 @@  #include <asm/arch/sys_proto.h>  #include <asm/io.h>  #include <nand.h> -#include <pmic.h> +#include <power/pmic.h>  #include <fsl_pmic.h>  #include <asm/gpio.h>  #include "qong_fpga.h"  #include <watchdog.h> +#include <errno.h>  DECLARE_GLOBAL_DATA_PTR; @@ -172,10 +173,15 @@ int board_late_init(void)  {  	u32 val;  	struct pmic *p; +	int ret; -	pmic_init(); -	p = get_pmic(); +	ret = pmic_init(I2C_PMIC); +	if (ret) +		return ret; +	p = pmic_get("FSL_PMIC"); +	if (!p) +		return -ENODEV;  	/* Enable RTC battery */  	pmic_reg_read(p, REG_POWER_CTL0, &val);  	pmic_reg_write(p, REG_POWER_CTL0, val | COINCHEN); diff --git a/board/freescale/mx31pdk/mx31pdk.c b/board/freescale/mx31pdk/mx31pdk.c index 9f8bc53e7..bc60632aa 100644 --- a/board/freescale/mx31pdk/mx31pdk.c +++ b/board/freescale/mx31pdk/mx31pdk.c @@ -30,8 +30,9 @@  #include <asm/arch/imx-regs.h>  #include <asm/arch/sys_proto.h>  #include <watchdog.h> -#include <pmic.h> +#include <power/pmic.h>  #include <fsl_pmic.h> +#include <errno.h>  DECLARE_GLOBAL_DATA_PTR; @@ -83,10 +84,15 @@ int board_late_init(void)  {  	u32 val;  	struct pmic *p; +	int ret; -	pmic_init(); -	p = get_pmic(); +	ret = pmic_init(I2C_PMIC); +	if (ret) +		return ret; +	p = pmic_get("FSL_PMIC"); +	if (!p) +		return -ENODEV;  	/* Enable RTC battery */  	pmic_reg_read(p, REG_POWER_CTL0, &val);  	pmic_reg_write(p, REG_POWER_CTL0, val | COINCHEN); diff --git a/board/freescale/mx35pdk/mx35pdk.c b/board/freescale/mx35pdk/mx35pdk.c index a12531fb8..c835b0ede 100644 --- a/board/freescale/mx35pdk/mx35pdk.c +++ b/board/freescale/mx35pdk/mx35pdk.c @@ -31,7 +31,7 @@  #include <asm/arch/mx35_pins.h>  #include <asm/arch/iomux.h>  #include <i2c.h> -#include <pmic.h> +#include <power/pmic.h>  #include <fsl_pmic.h>  #include <mmc.h>  #include <fsl_esdhc.h> @@ -207,7 +207,9 @@ int board_init(void)  static inline int pmic_detect(void)  {  	unsigned int id; -	struct pmic *p = get_pmic(); +	struct pmic *p = pmic_get("FSL_PMIC"); +	if (!p) +		return -ENODEV;  	pmic_reg_read(p, REG_IDENTIFICATION, &id); @@ -231,10 +233,14 @@ int board_late_init(void)  	u8 val;  	u32 pmic_val;  	struct pmic *p; +	int ret; + +	ret = pmic_init(I2C_PMIC); +	if (ret) +		return ret; -	pmic_init();  	if (pmic_detect()) { -		p = get_pmic(); +		p = pmic_get("FSL_PMIC");  		mxc_request_iomux(MX35_PIN_WATCHDOG_RST, MUX_CONFIG_SION |  					MUX_CONFIG_ALT1); diff --git a/board/freescale/mx51evk/mx51evk.c b/board/freescale/mx51evk/mx51evk.c index bc9d96665..d1ef43189 100644 --- a/board/freescale/mx51evk/mx51evk.c +++ b/board/freescale/mx51evk/mx51evk.c @@ -34,7 +34,7 @@  #include <i2c.h>  #include <mmc.h>  #include <fsl_esdhc.h> -#include <pmic.h> +#include <power/pmic.h>  #include <fsl_pmic.h>  #include <mc13892.h>  #include <usb/ehci-fsl.h> @@ -247,9 +247,15 @@ static void power_init(void)  	unsigned int val;  	struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)MXC_CCM_BASE;  	struct pmic *p; +	int ret; + +	ret = pmic_init(I2C_PMIC); +	if (ret) +		return; -	pmic_init(); -	p = get_pmic(); +	p = pmic_get("FSL_PMIC"); +	if (!p) +		return;  	/* Write needed to Power Gate 2 register */  	pmic_reg_read(p, REG_POWER_MISC, &val); diff --git a/board/freescale/mx53evk/mx53evk.c b/board/freescale/mx53evk/mx53evk.c index bb4621d62..127350147 100644 --- a/board/freescale/mx53evk/mx53evk.c +++ b/board/freescale/mx53evk/mx53evk.c @@ -34,7 +34,7 @@  #include <i2c.h>  #include <mmc.h>  #include <fsl_esdhc.h> -#include <pmic.h> +#include <power/pmic.h>  #include <fsl_pmic.h>  #include <asm/gpio.h>  #include <mc13892.h> @@ -123,9 +123,15 @@ void power_init(void)  {  	unsigned int val;  	struct pmic *p; +	int ret; + +	ret = pmic_init(I2C_PMIC); +	if (ret) +		return; -	pmic_init(); -	p = get_pmic(); +	p = pmic_get("FSL_PMIC"); +	if (!p) +		return;  	/* Set VDDA to 1.25V */  	pmic_reg_read(p, REG_SW_2, &val); diff --git a/board/freescale/mx53loco/mx53loco.c b/board/freescale/mx53loco/mx53loco.c index f8f0503f9..81c511cdc 100644 --- a/board/freescale/mx53loco/mx53loco.c +++ b/board/freescale/mx53loco/mx53loco.c @@ -37,7 +37,7 @@  #include <mmc.h>  #include <fsl_esdhc.h>  #include <asm/gpio.h> -#include <pmic.h> +#include <power/pmic.h>  #include <dialog_pmic.h>  #include <fsl_pmic.h>  #include <linux/fb.h> @@ -345,10 +345,16 @@ static int power_init(void)  	unsigned int val;  	int ret = -1;  	struct pmic *p; +	int retval;  	if (!i2c_probe(CONFIG_SYS_DIALOG_PMIC_I2C_ADDR)) { -		pmic_dialog_init(); -		p = get_pmic(); +		retval = pmic_dialog_init(I2C_PMIC); +		if (retval) +			return retval; + +		p = pmic_get("DIALOG_PMIC"); +		if (!p) +			return -ENODEV;  		/* Set VDDA to 1.25V */  		val = DA9052_BUCKCORE_BCOREEN | DA_BUCKCORE_VBCORE_1_250V; @@ -364,8 +370,13 @@ static int power_init(void)  	}  	if (!i2c_probe(CONFIG_SYS_FSL_PMIC_I2C_ADDR)) { -		pmic_init(); -		p = get_pmic(); +		retval = pmic_init(I2C_PMIC); +		if (retval) +			return retval; + +		p = pmic_get("DIALOG_PMIC"); +		if (!p) +			return -ENODEV;  		/* Set VDDGP to 1.25V for 1GHz on SW1 */  		pmic_reg_read(p, REG_SW_0, &val); diff --git a/board/genesi/mx51_efikamx/efikamx.c b/board/genesi/mx51_efikamx/efikamx.c index c2b2823ef..69d41db53 100644 --- a/board/genesi/mx51_efikamx/efikamx.c +++ b/board/genesi/mx51_efikamx/efikamx.c @@ -33,7 +33,7 @@  #include <i2c.h>  #include <mmc.h>  #include <fsl_esdhc.h> -#include <pmic.h> +#include <power/pmic.h>  #include <fsl_pmic.h>  #include <mc13892.h> @@ -173,9 +173,15 @@ static void power_init(void)  	unsigned int val;  	struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)MXC_CCM_BASE;  	struct pmic *p; +	int ret; + +	ret = pmic_init(I2C_PMIC); +	if (ret) +		return; -	pmic_init(); -	p = get_pmic(); +	p = pmic_get("FSL_PMIC"); +	if (!p) +		return;  	/* Write needed to Power Gate 2 register */  	pmic_reg_read(p, REG_POWER_MISC, &val); diff --git a/board/hale/tt01/tt01.c b/board/hale/tt01/tt01.c index 143fcefed..0c2cb795d 100644 --- a/board/hale/tt01/tt01.c +++ b/board/hale/tt01/tt01.c @@ -25,12 +25,13 @@  #include <common.h>  #include <netdev.h>  #include <command.h> -#include <pmic.h> +#include <power/pmic.h>  #include <fsl_pmic.h>  #include <mc13783.h>  #include <asm/arch/clock.h>  #include <asm/arch/sys_proto.h>  #include <asm/io.h> +#include <errno.h>  DECLARE_GLOBAL_DATA_PTR; @@ -195,14 +196,21 @@ int board_mmc_init(bd_t *bis)  {  	u32 val;  	struct pmic *p; +	int ret;  	/*  	* this is the first driver to use the pmic, so call  	* pmic_init() here. board_late_init() is too late for  	* the MMC driver.  	*/ -	pmic_init(); -	p = get_pmic(); + +	ret = pmic_init(I2C_PMIC); +	if (ret) +		return ret; + +	p = pmic_get("FSL_PMIC"); +	if (!p) +		return -ENODEV;  	/* configure pins for SDHC1 only */  	mx31_gpio_mux(IOMUX_MODE(MUX_CTL_SD1_CLK, MUX_CTL_FUNC)); diff --git a/board/samsung/goni/goni.c b/board/samsung/goni/goni.c index e8fb1ea41..ff7696392 100644 --- a/board/samsung/goni/goni.c +++ b/board/samsung/goni/goni.c @@ -25,10 +25,10 @@  #include <common.h>  #include <asm/arch/gpio.h>  #include <asm/arch/mmc.h> -#include <pmic.h> +#include <power/pmic.h>  #include <usb/s3c_udc.h>  #include <asm/arch/cpu.h> -#include <max8998_pmic.h> +#include <power/max8998_pmic.h>  DECLARE_GLOBAL_DATA_PTR;  static struct s5pc110_gpio *s5pc110_gpio; @@ -41,9 +41,17 @@ int board_init(void)  	gd->bd->bi_arch_number = MACH_TYPE_GONI;  	gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100; -#if defined(CONFIG_PMIC) -	pmic_init(); -#endif +	return 0; +} + +int power_init_board(void) +{ +	int ret; + +	ret = pmic_init(I2C_5); +	if (ret) +		return ret; +  	return 0;  } @@ -108,7 +116,9 @@ static int s5pc1xx_phy_control(int on)  {  	int ret;  	static int status; -	struct pmic *p = get_pmic(); +	struct pmic *p = pmic_get("MAX8998_PMIC"); +	if (!p) +		return -ENODEV;  	if (pmic_probe(p))  		return -1; diff --git a/board/samsung/trats/trats.c b/board/samsung/trats/trats.c index e11a8922f..e54019098 100644 --- a/board/samsung/trats/trats.c +++ b/board/samsung/trats/trats.c @@ -34,10 +34,13 @@  #include <asm/arch/mipi_dsim.h>  #include <asm/arch/watchdog.h>  #include <asm/arch/power.h> -#include <pmic.h> +#include <power/pmic.h>  #include <usb/s3c_udc.h> -#include <max8997_pmic.h> +#include <power/max8997_pmic.h>  #include <libtizen.h> +#include <power/max8997_muic.h> +#include <power/battery.h> +#include <power/max17042_fg.h>  #include "setup.h" @@ -68,10 +71,6 @@ int board_init(void)  	check_hw_revision();  	printf("HW Revision:\t0x%x\n", board_rev); -#if defined(CONFIG_PMIC) -	pmic_init(); -#endif -  	return 0;  } @@ -90,6 +89,275 @@ void i2c_init_board(void)  	s5p_gpio_direction_output(&gpio2->y4, 1, 1);  } +static void trats_low_power_mode(void) +{ +	struct exynos4_clock *clk = +	    (struct exynos4_clock *)samsung_get_base_clock(); +	struct exynos4_power *pwr = +	    (struct exynos4_power *)samsung_get_base_power(); + +	/* Power down CORE1 */ +	/* LOCAL_PWR_CFG [1:0] 0x3 EN, 0x0 DIS */ +	writel(0x0, &pwr->arm_core1_configuration); + +	/* Change the APLL frequency */ +	/* ENABLE (1 enable) | LOCKED (1 locked)  */ +	/* [31]              | [29]               */ +	/* FSEL      | MDIV          | PDIV            | SDIV */ +	/* [27]      | [25:16]       | [13:8]          | [2:0]      */ +	writel(0xa0c80604, &clk->apll_con0); + +	/* Change CPU0 clock divider */ +	/* CORE2_RATIO  | APLL_RATIO   | PCLK_DBG_RATIO | ATB_RATIO  */ +	/* [30:28]      | [26:24]      | [22:20]        | [18:16]    */ +	/* PERIPH_RATIO | COREM1_RATIO | COREM0_RATIO   | CORE_RATIO */ +	/* [14:12]      | [10:8]       | [6:4]          | [2:0]      */ +	writel(0x00000100, &clk->div_cpu0); + +	/* CLK_DIV_STAT_CPU0 - wait until clock gets stable (0 = stable) */ +	while (readl(&clk->div_stat_cpu0) & 0x1111111) +		continue; + +	/* Change clock divider ratio for DMC */ +	/* DMCP_RATIO                  | DMCD_RATIO  */ +	/* [22:20]                     | [18:16]     */ +	/* DMC_RATIO | DPHY_RATIO | ACP_PCLK_RATIO   | ACP_RATIO */ +	/* [14:12]   | [10:8]     | [6:4]            | [2:0]     */ +	writel(0x13113117, &clk->div_dmc0); + +	/* CLK_DIV_STAT_DMC0 - wait until clock gets stable (0 = stable) */ +	while (readl(&clk->div_stat_dmc0) & 0x11111111) +		continue; + +	/* Turn off unnecessary power domains */ +	writel(0x0, &pwr->xxti_configuration);	/* XXTI */ +	writel(0x0, &pwr->cam_configuration);	/* CAM */ +	writel(0x0, &pwr->tv_configuration);    /* TV */ +	writel(0x0, &pwr->mfc_configuration);   /* MFC */ +	writel(0x0, &pwr->g3d_configuration);   /* G3D */ +	writel(0x0, &pwr->gps_configuration);   /* GPS */ +	writel(0x0, &pwr->gps_alive_configuration);	/* GPS_ALIVE */ + +	/* Turn off unnecessary clocks */ +	writel(0x0, &clk->gate_ip_cam);	/* CAM */ +	writel(0x0, &clk->gate_ip_tv);          /* TV */ +	writel(0x0, &clk->gate_ip_mfc);	/* MFC */ +	writel(0x0, &clk->gate_ip_g3d);	/* G3D */ +	writel(0x0, &clk->gate_ip_image);	/* IMAGE */ +	writel(0x0, &clk->gate_ip_gps);	/* GPS */ +} + +static int pmic_init_max8997(void) +{ +	struct pmic *p = pmic_get("MAX8997_PMIC"); +	int i = 0, ret = 0; +	u32 val; + +	if (pmic_probe(p)) +		return -1; + +	/* BUCK1 VARM: 1.2V */ +	val = (1200000 - 650000) / 25000; +	ret |= pmic_reg_write(p, MAX8997_REG_BUCK1DVS1, val); +	val = ENBUCK | ACTIVE_DISCHARGE;		/* DVS OFF */ +	ret |= pmic_reg_write(p, MAX8997_REG_BUCK1CTRL, val); + +	/* BUCK2 VINT: 1.1V */ +	val = (1100000 - 650000) / 25000; +	ret |= pmic_reg_write(p, MAX8997_REG_BUCK2DVS1, val); +	val = ENBUCK | ACTIVE_DISCHARGE;		/* DVS OFF */ +	ret |= pmic_reg_write(p, MAX8997_REG_BUCK2CTRL, val); + + +	/* BUCK3 G3D: 1.1V - OFF */ +	ret |= pmic_reg_read(p, MAX8997_REG_BUCK3CTRL, &val); +	val &= ~ENBUCK; +	ret |= pmic_reg_write(p, MAX8997_REG_BUCK3CTRL, val); + +	val = (1100000 - 750000) / 50000; +	ret |= pmic_reg_write(p, MAX8997_REG_BUCK3DVS, val); + +	/* BUCK4 CAMISP: 1.2V - OFF */ +	ret |= pmic_reg_read(p, MAX8997_REG_BUCK4CTRL, &val); +	val &= ~ENBUCK; +	ret |= pmic_reg_write(p, MAX8997_REG_BUCK4CTRL, val); + +	val = (1200000 - 650000) / 25000; +	ret |= pmic_reg_write(p, MAX8997_REG_BUCK4DVS, val); + +	/* BUCK5 VMEM: 1.2V */ +	val = (1200000 - 650000) / 25000; +	for (i = 0; i < 8; i++) +		ret |= pmic_reg_write(p, MAX8997_REG_BUCK5DVS1 + i, val); + +	val = ENBUCK | ACTIVE_DISCHARGE;		/* DVS OFF */ +	ret |= pmic_reg_write(p, MAX8997_REG_BUCK5CTRL, val); + +	/* BUCK6 CAM AF: 2.8V */ +	/* No Voltage Setting Register */ +	/* GNSLCT 3.0X */ +	val = GNSLCT; +	ret |= pmic_reg_write(p, MAX8997_REG_BUCK6CTRL, val); + +	/* BUCK7 VCC_SUB: 2.0V */ +	val = (2000000 - 750000) / 50000; +	ret |= pmic_reg_write(p, MAX8997_REG_BUCK7DVS, val); + +	/* LDO1 VADC: 3.3V */ +	val = max8997_reg_ldo(3300000) | DIS_LDO;	/* OFF */ +	ret |= pmic_reg_write(p, MAX8997_REG_LDO1CTRL, val); + +	/* LDO1 Disable active discharging */ +	ret |= pmic_reg_read(p, MAX8997_REG_LDO1CONFIG, &val); +	val &= ~LDO_ADE; +	ret |= pmic_reg_write(p, MAX8997_REG_LDO1CONFIG, val); + +	/* LDO2 VALIVE: 1.1V */ +	val = max8997_reg_ldo(1100000) | EN_LDO; +	ret |= pmic_reg_write(p, MAX8997_REG_LDO2CTRL, val); + +	/* LDO3 VUSB/MIPI: 1.1V */ +	val = max8997_reg_ldo(1100000) | DIS_LDO;	/* OFF */ +	ret |= pmic_reg_write(p, MAX8997_REG_LDO3CTRL, val); + +	/* LDO4 VMIPI: 1.8V */ +	val = max8997_reg_ldo(1800000) | DIS_LDO;	/* OFF */ +	ret |= pmic_reg_write(p, MAX8997_REG_LDO4CTRL, val); + +	/* LDO5 VHSIC: 1.2V */ +	val = max8997_reg_ldo(1200000) | DIS_LDO;	/* OFF */ +	ret |= pmic_reg_write(p, MAX8997_REG_LDO5CTRL, val); + +	/* LDO6 VCC_1.8V_PDA: 1.8V */ +	val = max8997_reg_ldo(1800000) | EN_LDO; +	ret |= pmic_reg_write(p, MAX8997_REG_LDO6CTRL, val); + +	/* LDO7 CAM_ISP: 1.8V */ +	val = max8997_reg_ldo(1800000) | DIS_LDO;	/* OFF */ +	ret |= pmic_reg_write(p, MAX8997_REG_LDO7CTRL, val); + +	/* LDO8 VDAC/VUSB: 3.3V */ +	val = max8997_reg_ldo(3300000) | DIS_LDO;	/* OFF */ +	ret |= pmic_reg_write(p, MAX8997_REG_LDO8CTRL, val); + +	/* LDO9 VCC_2.8V_PDA: 2.8V */ +	val = max8997_reg_ldo(2800000) | EN_LDO; +	ret |= pmic_reg_write(p, MAX8997_REG_LDO9CTRL, val); + +	/* LDO10 VPLL: 1.1V */ +	val = max8997_reg_ldo(1100000) | EN_LDO; +	ret |= pmic_reg_write(p, MAX8997_REG_LDO10CTRL, val); + +	/* LDO11 TOUCH: 2.8V */ +	val = max8997_reg_ldo(2800000) | DIS_LDO;	/* OFF */ +	ret |= pmic_reg_write(p, MAX8997_REG_LDO11CTRL, val); + +	/* LDO12 VTCAM: 1.8V */ +	val = max8997_reg_ldo(1800000) | DIS_LDO;	/* OFF */ +	ret |= pmic_reg_write(p, MAX8997_REG_LDO12CTRL, val); + +	/* LDO13 VCC_3.0_LCD: 3.0V */ +	val = max8997_reg_ldo(3000000) | DIS_LDO;	/* OFF */ +	ret |= pmic_reg_write(p, MAX8997_REG_LDO13CTRL, val); + +	/* LDO14 MOTOR: 3.0V */ +	val = max8997_reg_ldo(3000000) | DIS_LDO;	/* OFF */ +	ret |= pmic_reg_write(p, MAX8997_REG_LDO14CTRL, val); + +	/* LDO15 LED_A: 2.8V */ +	val = max8997_reg_ldo(2800000) | DIS_LDO;	/* OFF */ +	ret |= pmic_reg_write(p, MAX8997_REG_LDO15CTRL, val); + +	/* LDO16 CAM_SENSOR: 1.8V */ +	val = max8997_reg_ldo(1800000) | DIS_LDO;	/* OFF */ +	ret |= pmic_reg_write(p, MAX8997_REG_LDO16CTRL, val); + +	/* LDO17 VTF: 2.8V */ +	val = max8997_reg_ldo(2800000) | DIS_LDO;	/* OFF */ +	ret |= pmic_reg_write(p, MAX8997_REG_LDO17CTRL, val); + +	/* LDO18 TOUCH_LED 3.3V */ +	val = max8997_reg_ldo(3300000) | DIS_LDO;	/* OFF */ +	ret |= pmic_reg_write(p, MAX8997_REG_LDO18CTRL, val); + +	/* LDO21 VDDQ: 1.2V */ +	val = max8997_reg_ldo(1200000) | EN_LDO; +	ret |= pmic_reg_write(p, MAX8997_REG_LDO21CTRL, val); + +	/* SAFEOUT for both 1 and 2: 4.9V, Active discharge, Enable */ +	val = (SAFEOUT_4_90V << 0) | (SAFEOUT_4_90V << 2) | +		ACTDISSAFEO1 | ACTDISSAFEO2 | ENSAFEOUT1 | ENSAFEOUT2; +	ret |= pmic_reg_write(p, MAX8997_REG_SAFEOUTCTRL, val); + +	if (ret) { +		puts("MAX8997 PMIC setting error!\n"); +		return -1; +	} +	return 0; +} + +int power_init_board(void) +{ +	int chrg, ret; +	struct power_battery *pb; +	struct pmic *p_fg, *p_chrg, *p_muic, *p_bat; + +	ret = pmic_init(I2C_5); +	ret |= pmic_init_max8997(); +	ret |= power_fg_init(I2C_9); +	ret |= power_muic_init(I2C_5); +	ret |= power_bat_init(0); +	if (ret) +		return ret; + +	p_fg = pmic_get("MAX17042_FG"); +	if (!p_fg) { +		puts("MAX17042_FG: Not found\n"); +		return -ENODEV; +	} + +	p_chrg = pmic_get("MAX8997_PMIC"); +	if (!p_chrg) { +		puts("MAX8997_PMIC: Not found\n"); +		return -ENODEV; +	} + +	p_muic = pmic_get("MAX8997_MUIC"); +	if (!p_muic) { +		puts("MAX8997_MUIC: Not found\n"); +		return -ENODEV; +	} + +	p_bat = pmic_get("BAT_TRATS"); +	if (!p_bat) { +		puts("BAT_TRATS: Not found\n"); +		return -ENODEV; +	} + +	p_fg->parent =  p_bat; +	p_chrg->parent = p_bat; +	p_muic->parent = p_bat; + +	p_bat->low_power_mode = trats_low_power_mode; +	p_bat->pbat->battery_init(p_bat, p_fg, p_chrg, p_muic); + +	pb = p_bat->pbat; +	chrg = p_muic->chrg->chrg_type(p_muic); +	debug("CHARGER TYPE: %d\n", chrg); + +	if (!p_chrg->chrg->chrg_bat_present(p_chrg)) { +		puts("No battery detected\n"); +		return -1; +	} + +	p_fg->fg->fg_battery_check(p_fg, p_bat); + +	if (pb->bat->state == CHARGE && chrg == CHARGER_USB) +		puts("CHARGE Battery !\n"); + +	return 0; +} +  int dram_init(void)  {  	gd->ram_size = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE) + @@ -238,7 +506,9 @@ static int s5pc210_phy_control(int on)  {  	int ret = 0;  	u32 val = 0; -	struct pmic *p = get_pmic(); +	struct pmic *p = pmic_get("MAX8997_PMIC"); +	if (!p) +		return -ENODEV;  	if (pmic_probe(p))  		return -1; @@ -413,7 +683,9 @@ static void lcd_reset(void)  static int lcd_power(void)  {  	int ret = 0; -	struct pmic *p = get_pmic(); +	struct pmic *p = pmic_get("MAX8997_PMIC"); +	if (!p) +		return -ENODEV;  	if (pmic_probe(p))  		return 0; @@ -473,7 +745,9 @@ static struct mipi_dsim_lcd_device mipi_lcd_device = {  static int mipi_power(void)  {  	int ret = 0; -	struct pmic *p = get_pmic(); +	struct pmic *p = pmic_get("MAX8997_PMIC"); +	if (!p) +		return -ENODEV;  	if (pmic_probe(p))  		return 0; diff --git a/board/samsung/universal_c210/universal.c b/board/samsung/universal_c210/universal.c index 90fff5cf5..36a047217 100644 --- a/board/samsung/universal_c210/universal.c +++ b/board/samsung/universal_c210/universal.c @@ -27,10 +27,10 @@  #include <asm/arch/adc.h>  #include <asm/arch/gpio.h>  #include <asm/arch/mmc.h> -#include <pmic.h> +#include <power/pmic.h>  #include <usb/s3c_udc.h>  #include <asm/arch/cpu.h> -#include <max8998_pmic.h> +#include <power/max8998_pmic.h>  DECLARE_GLOBAL_DATA_PTR; @@ -58,16 +58,23 @@ int board_init(void)  	gd->bd->bi_arch_number = MACH_TYPE_UNIVERSAL_C210;  	gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100; -#if defined(CONFIG_PMIC) -	pmic_init(); -#endif -  	check_hw_revision();  	printf("HW Revision:\t0x%x\n", board_rev);  	return 0;  } +int power_init_board(void) +{ +	int ret; + +	ret = pmic_init(I2C_5); +	if (ret) +		return ret; + +	return 0; +} +  int dram_init(void)  {  	gd->ram_size = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE) + @@ -112,7 +119,9 @@ static unsigned short get_adc_value(int channel)  static int adc_power_control(int on)  {  	int ret; -	struct pmic *p = get_pmic(); +	struct pmic *p = pmic_get("MAX8998_PMIC"); +	if (!p) +		return -ENODEV;  	if (pmic_probe(p))  		return -1; @@ -280,7 +289,9 @@ int board_mmc_init(bd_t *bis)  static int s5pc210_phy_control(int on)  {  	int ret = 0; -	struct pmic *p = get_pmic(); +	struct pmic *p = pmic_get("MAX8998_PMIC"); +	if (!p) +		return -ENODEV;  	if (pmic_probe(p))  		return -1; diff --git a/board/ttcontrol/vision2/vision2.c b/board/ttcontrol/vision2/vision2.c index abdd1aac2..a471fec23 100644 --- a/board/ttcontrol/vision2/vision2.c +++ b/board/ttcontrol/vision2/vision2.c @@ -34,7 +34,7 @@  #include <asm/arch/sys_proto.h>  #include <i2c.h>  #include <mmc.h> -#include <pmic.h> +#include <power/pmic.h>  #include <fsl_esdhc.h>  #include <fsl_pmic.h>  #include <mc13892.h> @@ -306,9 +306,15 @@ static void power_init_mx51(void)  {  	unsigned int val;  	struct pmic *p; +	int ret; + +	ret = pmic_init(I2C_PMIC); +	if (ret) +		return; -	pmic_init(); -	p = get_pmic(); +	p = pmic_get("FSL_PMIC"); +	if (!p) +		return;  	/* Write needed to Power Gate 2 register */  	pmic_reg_read(p, REG_POWER_MISC, &val); diff --git a/boards.cfg b/boards.cfg index 4dd989383..7ae663c7d 100644 --- a/boards.cfg +++ b/boards.cfg @@ -372,7 +372,7 @@ M5235EVB                     m68k        mcf523x     m5235evb            freesca  M5235EVB_Flash32             m68k        mcf523x     m5235evb            freescale      -           M5235EVB:NORFLASH_PS32BIT,SYS_TEXT_BASE=0xFFC00000  cobra5272                    m68k        mcf52x2     cobra5272           -  idmr                         m68k        mcf52x2 -eb_cpu5282                   m68k        mcf52x2     eb_cpu5282          BuS            -           eb_cpu5282:SYS_TEXT_BASE=0xFFE00000 +eb_cpu5282                   m68k        mcf52x2     eb_cpu5282          BuS            -           eb_cpu5282:SYS_TEXT_BASE=0xFF000000  eb_cpu5282_internal          m68k        mcf52x2     eb_cpu5282          BuS            -           eb_cpu5282:SYS_TEXT_BASE=0xF0000000  TASREG                       m68k        mcf52x2     tasreg              esd  M5208EVBE                    m68k        mcf52x2     m5208evbe           freescale diff --git a/common/cmd_mmc.c b/common/cmd_mmc.c index 62a1c224d..4c19df727 100644 --- a/common/cmd_mmc.c +++ b/common/cmd_mmc.c @@ -144,7 +144,7 @@ static int do_mmcinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  U_BOOT_CMD(  	mmcinfo, 1, 0, do_mmcinfo,  	"display MMC info", -	"- dislay info of the current MMC device" +	"- display info of the current MMC device"  );  static int do_mmcops(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) diff --git a/common/command.c b/common/command.c index f51df26bf..50c84292c 100644 --- a/common/command.c +++ b/common/command.c @@ -40,15 +40,8 @@ int _do_help (cmd_tbl_t *cmd_start, int cmd_items, cmd_tbl_t * cmdtp, int  	int i;  	int rcode = 0; -	if (cmd_items > CONFIG_SYS_MAXARGS) { -		printf("%s: cmd_items %d exceeds hardcoded limit %d." -		       " Recompile with higher CONFIG_SYS_MAXARGS?\n", -		       __func__, cmd_items, CONFIG_SYS_MAXARGS); -		return -1; -	} -  	if (argc == 1) {	/*show list of commands */ -		cmd_tbl_t *cmd_array[CONFIG_SYS_MAXARGS]; +		cmd_tbl_t *cmd_array[cmd_items];  		int i, j, swaps;  		/* Make array of commands from .uboot_cmd section */ diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index 271463cf1..cdec88b8f 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -34,13 +34,6 @@ COBJS-$(CONFIG_NS87308) += ns87308.o  COBJS-$(CONFIG_PDSP188x) += pdsp188x.o  COBJS-$(CONFIG_STATUS_LED) += status_led.o  COBJS-$(CONFIG_TWL4030_LED) += twl4030_led.o -COBJS-$(CONFIG_PMIC) += pmic_core.o -COBJS-$(CONFIG_DIALOG_PMIC) += pmic_dialog.o -COBJS-$(CONFIG_PMIC_FSL) += pmic_fsl.o -COBJS-$(CONFIG_PMIC_I2C) += pmic_i2c.o -COBJS-$(CONFIG_PMIC_SPI) += pmic_spi.o -COBJS-$(CONFIG_PMIC_MAX8998) += pmic_max8998.o -COBJS-$(CONFIG_PMIC_MAX8997) += pmic_max8997.o  COBJS	:= $(COBJS-y)  SRCS	:= $(COBJS:.o=.c) diff --git a/drivers/misc/pmic_core.c b/drivers/misc/pmic_core.c deleted file mode 100644 index 5d62a56d3..000000000 --- a/drivers/misc/pmic_core.c +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (C) 2011 Samsung Electronics - * Lukasz Majewski <l.majewski@samsung.com> - * - * (C) Copyright 2010 - * Stefano Babic, DENX Software Engineering, sbabic@denx.de - * - * (C) Copyright 2008-2009 Freescale Semiconductor, Inc. - * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA - */ - -#include <common.h> -#include <linux/types.h> -#include <pmic.h> - -static struct pmic pmic; - -int check_reg(u32 reg) -{ -	if (reg >= pmic.number_of_regs) { -		printf("<reg num> = %d is invalid. Should be less than %d\n", -		       reg, pmic.number_of_regs); -		return -1; -	} -	return 0; -} - -int pmic_set_output(struct pmic *p, u32 reg, int out, int on) -{ -	u32 val; - -	if (pmic_reg_read(p, reg, &val)) -		return -1; - -	if (on) -		val |= out; -	else -		val &= ~out; - -	if (pmic_reg_write(p, reg, val)) -		return -1; - -	return 0; -} - -static void pmic_show_info(struct pmic *p) -{ -	printf("PMIC: %s\n", p->name); -} - -static void pmic_dump(struct pmic *p) -{ -	int i, ret; -	u32 val; - -	pmic_show_info(p); -	for (i = 0; i < p->number_of_regs; i++) { -		ret = pmic_reg_read(p, i, &val); -		if (ret) -			puts("PMIC: Registers dump failed\n"); - -		if (!(i % 8)) -			printf("\n0x%02x: ", i); - -		printf("%08x ", val); -	} -	puts("\n"); -} - -struct pmic *get_pmic(void) -{ -	return &pmic; -} - -int do_pmic(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) -{ -	u32 ret, reg, val; -	char *cmd; - -	struct pmic *p = &pmic; - -	/* at least two arguments please */ -	if (argc < 2) -		return cmd_usage(cmdtp); - -	cmd = argv[1]; -	if (strcmp(cmd, "dump") == 0) { -		pmic_dump(p); -		return 0; -	} - -	if (strcmp(cmd, "read") == 0) { -		if (argc < 3) -			return cmd_usage(cmdtp); - -		reg = simple_strtoul(argv[2], NULL, 16); - -		ret = pmic_reg_read(p, reg, &val); - -		if (ret) -			puts("PMIC: Register read failed\n"); - -		printf("\n0x%02x: 0x%08x\n", reg, val); - -		return 0; -	} - -	if (strcmp(cmd, "write") == 0) { -		if (argc < 4) -			return cmd_usage(cmdtp); - -		reg = simple_strtoul(argv[2], NULL, 16); -		val = simple_strtoul(argv[3], NULL, 16); - -		pmic_reg_write(p, reg, val); - -		return 0; -	} - -	/* No subcommand found */ -	return 1; -} - -U_BOOT_CMD( -	pmic,	CONFIG_SYS_MAXARGS, 1, do_pmic, -	"PMIC", -	"dump - dump PMIC registers\n" -	"pmic read <reg> - read register\n" -	"pmic write <reg> <value> - write register" -); diff --git a/drivers/power/Makefile b/drivers/power/Makefile index 6bf388cb7..8c7190156 100644 --- a/drivers/power/Makefile +++ b/drivers/power/Makefile @@ -23,7 +23,7 @@  include $(TOPDIR)/config.mk -LIB 	:= $(obj)libpower.o +LIB	:= $(obj)libpower.o  COBJS-$(CONFIG_FTPMU010_POWER)	+= ftpmu010.o  COBJS-$(CONFIG_TPS6586X_POWER)	+= tps6586x.o @@ -31,9 +31,15 @@ COBJS-$(CONFIG_TWL4030_POWER)	+= twl4030.o  COBJS-$(CONFIG_TWL6030_POWER)	+= twl6030.o  COBJS-$(CONFIG_TWL6035_POWER)	+= twl6035.o +COBJS-$(CONFIG_POWER) += power_core.o +COBJS-$(CONFIG_DIALOG_POWER) += power_dialog.o +COBJS-$(CONFIG_POWER_FSL) += power_fsl.o +COBJS-$(CONFIG_POWER_I2C) += power_i2c.o +COBJS-$(CONFIG_POWER_SPI) += power_spi.o +  COBJS	:= $(COBJS-y) -SRCS 	:= $(COBJS:.o=.c) -OBJS 	:= $(addprefix $(obj),$(COBJS)) +SRCS	:= $(COBJS:.o=.c) +OBJS	:= $(addprefix $(obj),$(COBJS))  all:	$(LIB) diff --git a/board/BuS/eb_cpu5282/config.mk b/drivers/power/battery/Makefile index 18fb84eb3..b17670123 100644 --- a/board/BuS/eb_cpu5282/config.mk +++ b/drivers/power/battery/Makefile @@ -1,7 +1,6 @@  # -# (C) Copyright 2000-2003 -# Wolfgang Denk, DENX Software Engineering, wd@denx.de. -# Coldfire contribution by Bernhard Kuhn <bkuhn@metrowerks.com> +# Copyright (C) 2012 Samsung Electronics +# Lukasz Majewski <l.majewski@samsung.com>  #  # See file CREDITS for list of people who contributed to this  # project. @@ -13,7 +12,7 @@  #  # This program is distributed in the hope that it will be useful,  # but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  # GNU General Public License for more details.  #  # You should have received a copy of the GNU General Public License @@ -22,6 +21,27 @@  # MA 02111-1307 USA  # -ifndef CONFIG_SYS_TEXT_BASE -CONFIG_SYS_TEXT_BASE = 0xFE000000 -endif +include $(TOPDIR)/config.mk + +LIB	:= $(obj)libbattery.o + +COBJS-$(CONFIG_POWER_BATTERY_TRATS) += bat_trats.o + +COBJS	:= $(COBJS-y) +SRCS	:= $(COBJS:.o=.c) +OBJS	:= $(addprefix $(obj),$(COBJS)) + +all:	$(LIB) + +$(LIB):	$(obj).depend $(OBJS) +	$(call cmd_link_o_target, $(OBJS)) + + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################## diff --git a/drivers/power/battery/bat_trats.c b/drivers/power/battery/bat_trats.c new file mode 100644 index 000000000..ca0d21465 --- /dev/null +++ b/drivers/power/battery/bat_trats.c @@ -0,0 +1,100 @@ +/* + *  Copyright (C) 2012 Samsung Electronics + *  Lukasz Majewski <l.majewski@samsung.com> + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <power/pmic.h> +#include <power/battery.h> +#include <power/max8997_pmic.h> +#include <errno.h> + +static struct battery battery_trats; + +static int power_battery_charge(struct pmic *bat) +{ +	struct power_battery *p_bat = bat->pbat; +	struct battery *battery = p_bat->bat; +	int k; + +	if (bat->chrg->chrg_state(p_bat->chrg, CHARGER_ENABLE, 450)) +		return -1; + +	for (k = 0; bat->chrg->chrg_bat_present(p_bat->chrg) && +		     bat->chrg->chrg_type(p_bat->muic) && +		     battery->state_of_chrg < 100; k++) { +		udelay(10000000); +		puts("."); +		bat->fg->fg_battery_update(p_bat->fg, bat); + +		if (k == 100) { +			debug(" %d [V]", battery->voltage_uV); +			puts("\n"); +			k = 0; +		} + +	} + +	bat->chrg->chrg_state(p_bat->chrg, CHARGER_DISABLE, 0); + +	return 0; +} + +static int power_battery_init_trats(struct pmic *bat_, +				    struct pmic *fg_, +				    struct pmic *chrg_, +				    struct pmic *muic_) +{ +	bat_->pbat->fg = fg_; +	bat_->pbat->chrg = chrg_; +	bat_->pbat->muic = muic_; + +	bat_->fg = fg_->fg; +	bat_->chrg = chrg_->chrg; +	bat_->chrg->chrg_type = muic_->chrg->chrg_type; +	return 0; +} + +static struct power_battery power_bat_trats = { +	.bat = &battery_trats, +	.battery_init = power_battery_init_trats, +	.battery_charge = power_battery_charge, +}; + +int power_bat_init(unsigned char bus) +{ +	static const char name[] = "BAT_TRATS"; +	struct pmic *p = pmic_alloc(); + +	if (!p) { +		printf("%s: POWER allocation error!\n", __func__); +		return -ENOMEM; +	} + +	debug("Board BAT init\n"); + +	p->interface = PMIC_NONE; +	p->name = name; +	p->bus = bus; + +	p->pbat = &power_bat_trats; +	return 0; +} diff --git a/drivers/power/fuel_gauge/Makefile b/drivers/power/fuel_gauge/Makefile new file mode 100644 index 000000000..da1541412 --- /dev/null +++ b/drivers/power/fuel_gauge/Makefile @@ -0,0 +1,47 @@ +# +# Copyright (C) 2012 Samsung Electronics +# Lukasz Majewski <l.majewski@samsung.com> +# +# See file CREDITS for list of people who contributed to this +# project. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# + +include $(TOPDIR)/config.mk + +LIB	:= $(obj)libfuel_gauge.o + +COBJS-$(CONFIG_POWER_FG_MAX17042) += fg_max17042.o + +COBJS	:= $(COBJS-y) +SRCS	:= $(COBJS:.o=.c) +OBJS	:= $(addprefix $(obj),$(COBJS)) + +all:	$(LIB) + +$(LIB):	$(obj).depend $(OBJS) +	$(call cmd_link_o_target, $(OBJS)) + + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################## diff --git a/drivers/power/fuel_gauge/fg_max17042.c b/drivers/power/fuel_gauge/fg_max17042.c new file mode 100644 index 000000000..9b7c184cb --- /dev/null +++ b/drivers/power/fuel_gauge/fg_max17042.c @@ -0,0 +1,250 @@ +/* + *  Copyright (C) 2012 Samsung Electronics + *  Lukasz Majewski <l.majewski@samsung.com> + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <power/pmic.h> +#include <power/max17042_fg.h> +#include <i2c.h> +#include <power/max8997_pmic.h> +#include <power/power_chrg.h> +#include <power/battery.h> +#include <power/fg_battery_cell_params.h> +#include <errno.h> + +static int fg_write_regs(struct pmic *p, u8 addr, u16 *data, int num) +{ +	int ret = 0; +	int i; + +	for (i = 0; i < num; i++, addr++) +		ret |= pmic_reg_write(p, addr, *(data + i)); + +	return ret; +} + +static int fg_read_regs(struct pmic *p, u8 addr, u16 *data, int num) +{ +	int ret = 0; +	int i; + +	for (i = 0; i < num; i++, addr++) +		ret |= pmic_reg_read(p, addr, (u32 *) (data + i)); + +	return ret; +} + +static int fg_write_and_verify(struct pmic *p, u8 addr, u16 data) +{ +	unsigned int val = data; +	int ret = 0; + +	ret |= pmic_reg_write(p, addr, val); +	ret |= pmic_reg_read(p, addr, &val); + +	if (ret) +		return ret; + +	if (((u16) val) == data) +		return 0; + +	return -1; +} + +static void por_fuelgauge_init(struct pmic *p) +{ +	u16 r_data0[16], r_data1[16], r_data2[16]; +	u32 rewrite_count = 5, i = 0; +	unsigned int val; +	int ret = 0; + +	/* Delay 500 ms */ +	mdelay(500); +	/* Initilize Configuration */ +	pmic_reg_write(p, MAX17042_CONFIG, 0x2310); + +rewrite_model: +	/* Unlock Model Access */ +	pmic_reg_write(p, MAX17042_MLOCKReg1, MODEL_UNLOCK1); +	pmic_reg_write(p, MAX17042_MLOCKReg2, MODEL_UNLOCK2); + +	/* Write/Read/Verify the Custom Model */ +	ret |= fg_write_regs(p, MAX17042_MODEL1, cell_character0, +			     ARRAY_SIZE(cell_character0)); +	ret |= fg_write_regs(p, MAX17042_MODEL2, cell_character1, +			     ARRAY_SIZE(cell_character1)); +	ret |= fg_write_regs(p, MAX17042_MODEL3, cell_character2, +			     ARRAY_SIZE(cell_character2)); + +	if (ret) { +		printf("%s: Cell parameters write failed!\n", __func__); +		return; +	} + +	ret |= fg_read_regs(p, MAX17042_MODEL1, r_data0, ARRAY_SIZE(r_data0)); +	ret |= fg_read_regs(p, MAX17042_MODEL2, r_data1, ARRAY_SIZE(r_data1)); +	ret |= fg_read_regs(p, MAX17042_MODEL3, r_data2, ARRAY_SIZE(r_data2)); + +	if (ret) +		printf("%s: Cell parameters read failed!\n", __func__); + +	for (i = 0; i < 16; i++) { +		if ((cell_character0[i] != r_data0[i]) +		    || (cell_character1[i] != r_data1[i]) +		    || (cell_character2[i] != r_data2[i])) +			goto rewrite_model; +		} + +	/* Lock model access */ +	pmic_reg_write(p, MAX17042_MLOCKReg1, MODEL_LOCK1); +	pmic_reg_write(p, MAX17042_MLOCKReg2, MODEL_LOCK2); + +	/* Verify the model access is locked */ +	ret |= fg_read_regs(p, MAX17042_MODEL1, r_data0, ARRAY_SIZE(r_data0)); +	ret |= fg_read_regs(p, MAX17042_MODEL2, r_data1, ARRAY_SIZE(r_data1)); +	ret |= fg_read_regs(p, MAX17042_MODEL3, r_data2, ARRAY_SIZE(r_data2)); + +	if (ret) { +		printf("%s: Cell parameters read failed!\n", __func__); +		return; +	} + +	for (i = 0; i < ARRAY_SIZE(r_data0); i++) { +		/* Check if model locked */ +		if (r_data0[i] || r_data1[i] || r_data2[i]) { +			/* Rewrite model data - prevent from endless loop */ +			if (rewrite_count--) { +				puts("FG - Lock model access failed!\n"); +				goto rewrite_model; +			} +		} +	} + +	/* Write Custom Parameters */ +	fg_write_and_verify(p, MAX17042_RCOMP0, RCOMP0); +	fg_write_and_verify(p, MAX17042_TEMPCO, TempCo); + +	/* Delay at least 350mS */ +	mdelay(350); + +	/* Initialization Complete */ +	pmic_reg_read(p, MAX17042_STATUS, &val); +	/* Write and Verify Status with POR bit Cleared */ +	fg_write_and_verify(p, MAX17042_STATUS, val & ~MAX17042_POR); + +	/* Delay at least 350 ms */ +	mdelay(350); +} + +static int power_update_battery(struct pmic *p, struct pmic *bat) +{ +	struct power_battery *pb = bat->pbat; +	unsigned int val; +	int ret = 0; + +	if (pmic_probe(p)) { +		puts("Can't find max17042 fuel gauge\n"); +		return -1; +	} + +	ret |= pmic_reg_read(p, MAX17042_VFSOC, &val); +	pb->bat->state_of_chrg = (val >> 8); + +	pmic_reg_read(p, MAX17042_VCELL, &val); +	debug("vfsoc: 0x%x\n", val); +	pb->bat->voltage_uV = ((val & 0xFFUL) >> 3) + ((val & 0xFF00) >> 3); +	pb->bat->voltage_uV = (pb->bat->voltage_uV * 625); + +	pmic_reg_read(p, 0x05, &val); +	pb->bat->capacity = val >> 2; + +	return ret; +} + +static int power_check_battery(struct pmic *p, struct pmic *bat) +{ +	struct power_battery *pb = bat->pbat; +	unsigned int val; +	int ret = 0; + +	if (pmic_probe(p)) { +		puts("Can't find max17042 fuel gauge\n"); +		return -1; +	} + +	ret |= pmic_reg_read(p, MAX17042_STATUS, &val); +	debug("fg status: 0x%x\n", val); + +	if (val == MAX17042_POR) +		por_fuelgauge_init(p); + +	ret |= pmic_reg_read(p, MAX17042_VERSION, &val); +	pb->bat->version = val; + +	power_update_battery(p, bat); +	debug("fg ver: 0x%x\n", pb->bat->version); +	printf("BAT: state_of_charge(SOC):%d%%\n", +	       pb->bat->state_of_chrg); + +	printf("     voltage: %d.%6.6d [V] (expected to be %d [mAh])\n", +	       pb->bat->voltage_uV / 1000000, +	       pb->bat->voltage_uV % 1000000, +	       pb->bat->capacity); + +	if (pb->bat->voltage_uV > 3850000) +		pb->bat->state = EXT_SOURCE; +	else if (pb->bat->voltage_uV < 3600000 || pb->bat->state_of_chrg < 5) +		pb->bat->state = CHARGE; +	else +		pb->bat->state = NORMAL; + +	return ret; +} + +static struct power_fg power_fg_ops = { +	.fg_battery_check = power_check_battery, +	.fg_battery_update = power_update_battery, +}; + +int power_fg_init(unsigned char bus) +{ +	static const char name[] = "MAX17042_FG"; +	struct pmic *p = pmic_alloc(); + +	if (!p) { +		printf("%s: POWER allocation error!\n", __func__); +		return -ENOMEM; +	} + +	debug("Board Fuel Gauge init\n"); + +	p->name = name; +	p->interface = PMIC_I2C; +	p->number_of_regs = FG_NUM_OF_REGS; +	p->hw.i2c.addr = MAX17042_I2C_ADDR; +	p->hw.i2c.tx_num = 2; +	p->sensor_byte_order = PMIC_SENSOR_BYTE_ORDER_BIG; +	p->bus = bus; + +	p->fg = &power_fg_ops; +	return 0; +} diff --git a/drivers/power/pmic/Makefile b/drivers/power/pmic/Makefile new file mode 100644 index 000000000..e19a9a819 --- /dev/null +++ b/drivers/power/pmic/Makefile @@ -0,0 +1,49 @@ +# +# Copyright (C) 2012 Samsung Electronics +# Lukasz Majewski <l.majewski@samsung.com> +# +# See file CREDITS for list of people who contributed to this +# project. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# + +include $(TOPDIR)/config.mk + +LIB	:= $(obj)libpmic.o + +COBJS-$(CONFIG_POWER_MAX8998) += pmic_max8998.o +COBJS-$(CONFIG_POWER_MAX8997) += pmic_max8997.o +COBJS-$(CONFIG_POWER_MUIC_MAX8997) += muic_max8997.o + +COBJS	:= $(COBJS-y) +SRCS	:= $(COBJS:.o=.c) +OBJS	:= $(addprefix $(obj),$(COBJS)) + +all:	$(LIB) + +$(LIB):	$(obj).depend $(OBJS) +	$(call cmd_link_o_target, $(OBJS)) + + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################## diff --git a/drivers/power/pmic/muic_max8997.c b/drivers/power/pmic/muic_max8997.c new file mode 100644 index 000000000..d5095c899 --- /dev/null +++ b/drivers/power/pmic/muic_max8997.c @@ -0,0 +1,90 @@ +/* + *  Copyright (C) 2012 Samsung Electronics + *  Lukasz Majewski <l.majewski@samsung.com> + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <power/pmic.h> +#include <power/power_chrg.h> +#include <power/max8997_muic.h> +#include <i2c.h> +#include <errno.h> + +static int power_chrg_get_type(struct pmic *p) +{ +	unsigned int val; +	unsigned char charge_type, charger; + +	if (pmic_probe(p)) +		return CHARGER_NO; + +	pmic_reg_read(p, MAX8997_MUIC_STATUS2, &val); +	charge_type = val & MAX8997_MUIC_CHG_MASK; + +	switch (charge_type) { +	case MAX8997_MUIC_CHG_NO: +		charger = CHARGER_NO; +		break; +	case MAX8997_MUIC_CHG_USB: +	case MAX8997_MUIC_CHG_USB_D: +		charger = CHARGER_USB; +		break; +	case MAX8997_MUIC_CHG_TA: +	case MAX8997_MUIC_CHG_TA_1A: +		charger = CHARGER_TA; +		break; +	case MAX8997_MUIC_CHG_TA_500: +		charger = CHARGER_TA_500; +		break; +	default: +		charger = CHARGER_UNKNOWN; +		break; +	} + +	return charger; +} + +static struct power_chrg power_chrg_muic_ops = { +	.chrg_type = power_chrg_get_type, +}; + +int power_muic_init(unsigned int bus) +{ +	static const char name[] = "MAX8997_MUIC"; +	struct pmic *p = pmic_alloc(); + +	if (!p) { +		printf("%s: POWER allocation error!\n", __func__); +		return -ENOMEM; +	} + +	debug("Board Micro USB Interface Controller init\n"); + +	p->name = name; +	p->interface = PMIC_I2C; +	p->number_of_regs = MUIC_NUM_OF_REGS; +	p->hw.i2c.addr = MAX8997_MUIC_I2C_ADDR; +	p->hw.i2c.tx_num = 1; +	p->bus = bus; + +	p->chrg = &power_chrg_muic_ops; +	return 0; +} diff --git a/drivers/power/pmic/pmic_max8997.c b/drivers/power/pmic/pmic_max8997.c new file mode 100644 index 000000000..4e5c6d647 --- /dev/null +++ b/drivers/power/pmic/pmic_max8997.c @@ -0,0 +1,123 @@ +/* + *  Copyright (C) 2012 Samsung Electronics + *  Lukasz Majewski <l.majewski@samsung.com> + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <power/pmic.h> +#include <power/max8997_pmic.h> +#include <i2c.h> +#include <errno.h> + +unsigned char max8997_reg_ldo(int uV) +{ +	unsigned char ret; +	if (uV <= 800000) +		return 0; +	if (uV >= 3950000) +		return MAX8997_LDO_MAX_VAL; +	ret = (uV - 800000) / 50000; +	if (ret > MAX8997_LDO_MAX_VAL) { +		printf("MAX8997 LDO SETTING ERROR (%duV) -> %u\n", uV, ret); +		ret = MAX8997_LDO_MAX_VAL; +	} + +	return ret; +} + +static int pmic_charger_state(struct pmic *p, int state, int current) +{ +	unsigned char fc; +	u32 val = 0; + +	if (pmic_probe(p)) +		return -1; + +	if (state == CHARGER_DISABLE) { +		puts("Disable the charger.\n"); +		pmic_reg_read(p, MAX8997_REG_MBCCTRL2, &val); +		val &= ~(MBCHOSTEN | VCHGR_FC); +		pmic_reg_write(p, MAX8997_REG_MBCCTRL2, val); + +		return -1; +	} + +	if (current < CHARGER_MIN_CURRENT || current > CHARGER_MAX_CURRENT) { +		printf("%s: Wrong charge current: %d [mA]\n", +		       __func__, current); +		return -1; +	} + +	fc = (current - CHARGER_MIN_CURRENT) / CHARGER_CURRENT_RESOLUTION; +	fc = fc & 0xf; /* up to 950 mA */ + +	printf("Enable the charger @ %d [mA]\n", fc * CHARGER_CURRENT_RESOLUTION +	       + CHARGER_MIN_CURRENT); + +	val = fc | MBCICHFCSET; +	pmic_reg_write(p, MAX8997_REG_MBCCTRL4, val); + +	pmic_reg_read(p, MAX8997_REG_MBCCTRL2, &val); +	val = MBCHOSTEN | VCHGR_FC; /* enable charger & fast charge */ +	pmic_reg_write(p, MAX8997_REG_MBCCTRL2, val); + +	return 0; +} + +static int pmic_charger_bat_present(struct pmic *p) +{ +	u32 val; + +	if (pmic_probe(p)) +		return -1; + +	pmic_reg_read(p, MAX8997_REG_STATUS4, &val); + +	return !(val & DETBAT); +} + +static struct power_chrg power_chrg_pmic_ops = { +	.chrg_bat_present = pmic_charger_bat_present, +	.chrg_state = pmic_charger_state, +}; + +int pmic_init(unsigned char bus) +{ +	static const char name[] = "MAX8997_PMIC"; +	struct pmic *p = pmic_alloc(); + +	if (!p) { +		printf("%s: POWER allocation error!\n", __func__); +		return -ENOMEM; +	} + +	debug("Board PMIC init\n"); + +	p->name = name; +	p->interface = PMIC_I2C; +	p->number_of_regs = PMIC_NUM_OF_REGS; +	p->hw.i2c.addr = MAX8997_I2C_ADDR; +	p->hw.i2c.tx_num = 1; +	p->bus = bus; + +	p->chrg = &power_chrg_pmic_ops; +	return 0; +} diff --git a/drivers/misc/pmic_max8998.c b/drivers/power/pmic/pmic_max8998.c index cc69fd708..452e1c8d8 100644 --- a/drivers/misc/pmic_max8998.c +++ b/drivers/power/pmic/pmic_max8998.c @@ -22,13 +22,19 @@   */  #include <common.h> -#include <pmic.h> -#include <max8998_pmic.h> +#include <power/pmic.h> +#include <power/max8998_pmic.h> +#include <errno.h> -int pmic_init(void) +int pmic_init(unsigned char bus)  { -	struct pmic *p = get_pmic();  	static const char name[] = "MAX8998_PMIC"; +	struct pmic *p = pmic_alloc(); + +	if (!p) { +		printf("%s: POWER allocation error!\n", __func__); +		return -ENOMEM; +	}  	puts("Board PMIC init\n"); @@ -37,7 +43,7 @@ int pmic_init(void)  	p->number_of_regs = PMIC_NUM_OF_REGS;  	p->hw.i2c.addr = MAX8998_I2C_ADDR;  	p->hw.i2c.tx_num = 1; -	p->bus = I2C_PMIC; +	p->bus = bus;  	return 0;  } diff --git a/drivers/power/power_core.c b/drivers/power/power_core.c new file mode 100644 index 000000000..90df2c58c --- /dev/null +++ b/drivers/power/power_core.c @@ -0,0 +1,232 @@ +/* + * Copyright (C) 2011 Samsung Electronics + * Lukasz Majewski <l.majewski@samsung.com> + * + * (C) Copyright 2010 + * Stefano Babic, DENX Software Engineering, sbabic@denx.de + * + * (C) Copyright 2008-2009 Freescale Semiconductor, Inc. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <malloc.h> +#include <linux/types.h> +#include <linux/list.h> +#include <power/pmic.h> + +static LIST_HEAD(pmic_list); + +int check_reg(struct pmic *p, u32 reg) +{ +	if (reg >= p->number_of_regs) { +		printf("<reg num> = %d is invalid. Should be less than %d\n", +		       reg, p->number_of_regs); +		return -1; +	} + +	return 0; +} + +int pmic_set_output(struct pmic *p, u32 reg, int out, int on) +{ +	u32 val; + +	if (pmic_reg_read(p, reg, &val)) +		return -1; + +	if (on) +		val |= out; +	else +		val &= ~out; + +	if (pmic_reg_write(p, reg, val)) +		return -1; + +	return 0; +} + +static void pmic_show_info(struct pmic *p) +{ +	printf("PMIC: %s\n", p->name); +} + +static int pmic_dump(struct pmic *p) +{ +	int i, ret; +	u32 val; + +	if (!p) { +		puts("Wrong PMIC name!\n"); +		return -1; +	} + +	pmic_show_info(p); +	for (i = 0; i < p->number_of_regs; i++) { +		ret = pmic_reg_read(p, i, &val); +		if (ret) +			puts("PMIC: Registers dump failed\n"); + +		if (!(i % 8)) +			printf("\n0x%02x: ", i); + +		printf("%08x ", val); +	} +	puts("\n"); +	return 0; +} + +struct pmic *pmic_alloc(void) +{ +	struct pmic *p; + +	p = calloc(sizeof(*p), 1); +	if (!p) { +		printf("%s: No available memory for allocation!\n", __func__); +		return NULL; +	} + +	list_add_tail(&p->list, &pmic_list); + +	debug("%s: new pmic struct: 0x%p\n", __func__, p); + +	return p; +} + +struct pmic *pmic_get(const char *s) +{ +	struct pmic *p; + +	list_for_each_entry(p, &pmic_list, list) { +		if (strcmp(p->name, s) == 0) { +			debug("%s: pmic %s -> 0x%p\n", __func__, p->name, p); +			return p; +		} +	} + +	return NULL; +} + +const char *power_get_interface(int interface) +{ +	const char *power_interface[] = {"I2C", "SPI", "|+|-|"}; +	return power_interface[interface]; +} + +static void pmic_list_names(void) +{ +	struct pmic *p; + +	puts("PMIC devices:\n"); +	list_for_each_entry(p, &pmic_list, list) { +		printf("name: %s bus: %s_%d\n", p->name, +		       power_get_interface(p->interface), p->bus); +	} +} + +int do_pmic(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ +	u32 ret, reg, val; +	char *cmd, *name; +	struct pmic *p; + +	/* at least two arguments please */ +	if (argc < 2) +		return CMD_RET_USAGE; + +	if (strcmp(argv[1], "list") == 0) { +		pmic_list_names(); +		return CMD_RET_SUCCESS; +	} + +	name = argv[1]; +	cmd = argv[2]; + +	debug("%s: name: %s cmd: %s\n", __func__, name, cmd); +	p = pmic_get(name); +	if (!p) +		return CMD_RET_FAILURE; + +	if (strcmp(cmd, "dump") == 0) { +		if (pmic_dump(p)) +			return CMD_RET_FAILURE; +		return CMD_RET_SUCCESS; +	} + +	if (strcmp(cmd, "read") == 0) { +		if (argc < 4) +			return CMD_RET_USAGE; + +		reg = simple_strtoul(argv[3], NULL, 16); +		ret = pmic_reg_read(p, reg, &val); + +		if (ret) +			puts("PMIC: Register read failed\n"); + +		printf("\n0x%02x: 0x%08x\n", reg, val); + +		return CMD_RET_SUCCESS; +	} + +	if (strcmp(cmd, "write") == 0) { +		if (argc < 5) +			return CMD_RET_USAGE; + +		reg = simple_strtoul(argv[3], NULL, 16); +		val = simple_strtoul(argv[4], NULL, 16); +		pmic_reg_write(p, reg, val); + +		return CMD_RET_SUCCESS; +	} + +	if (strcmp(cmd, "bat") == 0) { +		if (argc < 4) +			return CMD_RET_USAGE; + +		if (strcmp(argv[3], "state") == 0) +			p->fg->fg_battery_check(p->pbat->fg, p); + +		if (strcmp(argv[3], "charge") == 0) { +			if (p->pbat) { +				printf("PRINT BAT charge %s\n", p->name); +				if (p->low_power_mode) +					p->low_power_mode(); +				if (p->pbat->battery_charge) +					p->pbat->battery_charge(p); +			} +		} + +		return CMD_RET_SUCCESS; +	} + +	/* No subcommand found */ +	return CMD_RET_SUCCESS; +} + +U_BOOT_CMD( +	pmic,	CONFIG_SYS_MAXARGS, 1, do_pmic, +	"PMIC", +	"list - list available PMICs\n" +	"pmic name dump - dump named PMIC registers\n" +	"pmic name read <reg> - read register\n" +	"pmic name write <reg> <value> - write register\n" +	"pmic name bat state - write register\n" +	"pmic name bat charge - write register\n" +); diff --git a/drivers/misc/pmic_dialog.c b/drivers/power/power_dialog.c index e97af1d1d..d7ebd1583 100644 --- a/drivers/misc/pmic_dialog.c +++ b/drivers/power/power_dialog.c @@ -17,13 +17,19 @@   */  #include <common.h> -#include <pmic.h> +#include <power/pmic.h>  #include <dialog_pmic.h> +#include <errno.h> -int pmic_dialog_init(void) +int pmic_dialog_init(unsigned char bus)  { -	struct pmic *p = get_pmic();  	static const char name[] = "DIALOG_PMIC"; +	struct pmic *p = pmic_alloc(); + +	if (!p) { +		printf("%s: POWER allocation error!\n", __func__); +		return -ENOMEM; +	}  	p->name = name;  	p->number_of_regs = DIALOG_NUM_OF_REGS; @@ -31,7 +37,7 @@ int pmic_dialog_init(void)  	p->interface = PMIC_I2C;  	p->hw.i2c.addr = CONFIG_SYS_DIALOG_PMIC_I2C_ADDR;  	p->hw.i2c.tx_num = 1; -	p->bus = I2C_PMIC; +	p->bus = bus;  	return 0;  } diff --git a/drivers/misc/pmic_fsl.c b/drivers/power/power_fsl.c index 0ff75ed76..651f88f85 100644 --- a/drivers/misc/pmic_fsl.c +++ b/drivers/power/power_fsl.c @@ -23,25 +23,31 @@  #include <common.h>  #include <spi.h> -#include <pmic.h> +#include <power/pmic.h>  #include <fsl_pmic.h> +#include <errno.h> -#if defined(CONFIG_PMIC_SPI) +#if defined(CONFIG_POWER_SPI)  static u32 pmic_spi_prepare_tx(u32 reg, u32 *val, u32 write)  {  	return (write << 31) | (reg << 25) | (*val & 0x00FFFFFF);  }  #endif -int pmic_init(void) +int pmic_init(unsigned char bus)  { -	struct pmic *p = get_pmic();  	static const char name[] = "FSL_PMIC"; +	struct pmic *p = pmic_alloc(); + +	if (!p) { +		printf("%s: POWER allocation error!\n", __func__); +		return -ENOMEM; +	}  	p->name = name;  	p->number_of_regs = PMIC_NUM_OF_REGS; -#if defined(CONFIG_PMIC_SPI) +#if defined(CONFIG_POWER_SPI)  	p->interface = PMIC_SPI;  	p->bus = CONFIG_FSL_PMIC_BUS;  	p->hw.spi.cs = CONFIG_FSL_PMIC_CS; @@ -50,13 +56,13 @@ int pmic_init(void)  	p->hw.spi.bitlen = CONFIG_FSL_PMIC_BITLEN;  	p->hw.spi.flags = SPI_XFER_BEGIN | SPI_XFER_END;  	p->hw.spi.prepare_tx = pmic_spi_prepare_tx; -#elif defined(CONFIG_PMIC_I2C) +#elif defined(CONFIG_POWER_I2C)  	p->interface = PMIC_I2C;  	p->hw.i2c.addr = CONFIG_SYS_FSL_PMIC_I2C_ADDR;  	p->hw.i2c.tx_num = 3; -	p->bus = I2C_PMIC; +	p->bus = bus;  #else -#error "You must select CONFIG_PMIC_SPI or CONFIG_PMIC_I2C" +#error "You must select CONFIG_POWER_SPI or CONFIG_PMIC_I2C"  #endif  	return 0; diff --git a/drivers/misc/pmic_i2c.c b/drivers/power/power_i2c.c index 95a3365b9..3e5a784cf 100644 --- a/drivers/misc/pmic_i2c.c +++ b/drivers/power/power_i2c.c @@ -28,24 +28,40 @@  #include <common.h>  #include <linux/types.h> -#include <pmic.h> +#include <power/pmic.h>  #include <i2c.h> +#include <compiler.h>  int pmic_reg_write(struct pmic *p, u32 reg, u32 val)  {  	unsigned char buf[4] = { 0 }; -	if (check_reg(reg)) +	if (check_reg(p, reg))  		return -1;  	switch (pmic_i2c_tx_num) {  	case 3: -		buf[0] = (val >> 16) & 0xff; -		buf[1] = (val >> 8) & 0xff; -		buf[2] = val & 0xff; +		if (p->sensor_byte_order == PMIC_SENSOR_BYTE_ORDER_BIG) { +			buf[2] = (cpu_to_le32(val) >> 16) & 0xff; +			buf[1] = (cpu_to_le32(val) >> 8) & 0xff; +			buf[0] = cpu_to_le32(val) & 0xff; +		} else { +			buf[0] = (cpu_to_le32(val) >> 16) & 0xff; +			buf[1] = (cpu_to_le32(val) >> 8) & 0xff; +			buf[2] = cpu_to_le32(val) & 0xff; +		} +		break; +	case 2: +		if (p->sensor_byte_order == PMIC_SENSOR_BYTE_ORDER_BIG) { +			buf[1] = (cpu_to_le32(val) >> 8) & 0xff; +			buf[0] = cpu_to_le32(val) & 0xff; +		} else { +			buf[0] = (cpu_to_le32(val) >> 8) & 0xff; +			buf[1] = cpu_to_le32(val) & 0xff; +		}  		break;  	case 1: -		buf[0] = val & 0xff; +		buf[0] = cpu_to_le32(val) & 0xff;  		break;  	default:  		printf("%s: invalid tx_num: %d", __func__, pmic_i2c_tx_num); @@ -63,7 +79,7 @@ int pmic_reg_read(struct pmic *p, u32 reg, u32 *val)  	unsigned char buf[4] = { 0 };  	u32 ret_val = 0; -	if (check_reg(reg)) +	if (check_reg(p, reg))  		return -1;  	if (i2c_read(pmic_i2c_addr, reg, 1, buf, pmic_i2c_tx_num)) @@ -71,10 +87,21 @@ int pmic_reg_read(struct pmic *p, u32 reg, u32 *val)  	switch (pmic_i2c_tx_num) {  	case 3: -		ret_val = buf[0] << 16 | buf[1] << 8 | buf[2]; +		if (p->sensor_byte_order == PMIC_SENSOR_BYTE_ORDER_BIG) +			ret_val = le32_to_cpu(buf[2] << 16 +					      | buf[1] << 8 | buf[0]); +		else +			ret_val = le32_to_cpu(buf[0] << 16 | +					      buf[1] << 8 | buf[2]); +		break; +	case 2: +		if (p->sensor_byte_order == PMIC_SENSOR_BYTE_ORDER_BIG) +			ret_val = le32_to_cpu(buf[1] << 8 | buf[0]); +		else +			ret_val = le32_to_cpu(buf[0] << 8 | buf[1]);  		break;  	case 1: -		ret_val = buf[0]; +		ret_val = le32_to_cpu(buf[0]);  		break;  	default:  		printf("%s: invalid tx_num: %d", __func__, pmic_i2c_tx_num); @@ -88,7 +115,7 @@ int pmic_reg_read(struct pmic *p, u32 reg, u32 *val)  int pmic_probe(struct pmic *p)  {  	I2C_SET_BUS(p->bus); -	debug("PMIC:%s probed!\n", p->name); +	debug("Bus: %d PMIC:%s probed!\n", p->bus, p->name);  	if (i2c_probe(pmic_i2c_addr)) {  		printf("Can't find PMIC:%s\n", p->name);  		return -1; diff --git a/drivers/misc/pmic_spi.c b/drivers/power/power_spi.c index 5a0dd22e2..27488ea5d 100644 --- a/drivers/misc/pmic_spi.c +++ b/drivers/power/power_spi.c @@ -28,7 +28,7 @@  #include <common.h>  #include <linux/types.h> -#include <pmic.h> +#include <power/pmic.h>  #include <spi.h>  static struct spi_slave *slave; @@ -59,7 +59,7 @@ static u32 pmic_reg(struct pmic *p, u32 reg, u32 *val, u32 write)  			return -1;  	} -	if (check_reg(reg)) +	if (check_reg(p, reg))  		return -1;  	if (spi_claim_bus(slave)) diff --git a/drivers/rtc/mc13xxx-rtc.c b/drivers/rtc/mc13xxx-rtc.c index 70ea8a158..e79f4621d 100644 --- a/drivers/rtc/mc13xxx-rtc.c +++ b/drivers/rtc/mc13xxx-rtc.c @@ -23,16 +23,18 @@  #include <common.h>  #include <rtc.h>  #include <spi.h> -#include <pmic.h> +#include <power/pmic.h>  #include <fsl_pmic.h>  int rtc_get(struct rtc_time *rtc)  {  	u32 day1, day2, time;  	int tim, i = 0; -	struct pmic *p = get_pmic(); +	struct pmic *p = pmic_get("FSL_PMIC");  	int ret; +	if (!p) +		return -1;  	do {  		ret = pmic_reg_read(p, REG_RTC_DAY, &day1);  		if (ret < 0) @@ -61,7 +63,9 @@ int rtc_get(struct rtc_time *rtc)  int rtc_set(struct rtc_time *rtc)  {  	u32 time, day; -	struct pmic *p = get_pmic(); +	struct pmic *p = pmic_get("FSL_PMIC"); +	if (!p) +		return -1;  	time = mktime(rtc->tm_year, rtc->tm_mon, rtc->tm_mday,  		      rtc->tm_hour, rtc->tm_min, rtc->tm_sec); @@ -257,6 +257,7 @@ int do_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],  	unsigned long pos;  	int len_read;  	char buf[12]; +	unsigned long time;  	if (argc < 2)  		return CMD_RET_USAGE; @@ -293,11 +294,19 @@ int do_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],  	else  		pos = 0; +	time = get_timer(0);  	len_read = fs_read(filename, addr, pos, bytes); +	time = get_timer(time);  	if (len_read <= 0)  		return 1; -	printf("%d bytes read\n", len_read); +	printf("%d bytes read in %lu ms", len_read, time); +	if (time > 0) { +		puts(" ("); +		print_size(len_read / time * 1000, "/s"); +		puts(")"); +	} +	puts("\n");  	sprintf(buf, "0x%x", len_read);  	setenv("filesize", buf); diff --git a/fs/zfs/zfs.c b/fs/zfs/zfs.c index 2db45b192..1b73244c0 100644 --- a/fs/zfs/zfs.c +++ b/fs/zfs/zfs.c @@ -30,6 +30,7 @@  #include <linux/ctype.h>  #include <asm/byteorder.h>  #include "zfs_common.h" +#include "div64.h"  block_dev_desc_t *zfs_dev_desc; @@ -2115,7 +2116,8 @@ zfs_read(zfs_file_t file, char *buf, uint64_t len)  		/*  		 * Find requested blkid and the offset within that block.  		 */ -		uint64_t blkid = (file->offset + red) /	 blksz; +		uint64_t blkid = file->offset + red; +		blkid = do_div(blkid, blksz);  		free(data->file_buf);  		data->file_buf = 0; diff --git a/include/configs/PK1C20.h b/include/configs/PK1C20.h index 403fafa2f..aced85b66 100644 --- a/include/configs/PK1C20.h +++ b/include/configs/PK1C20.h @@ -142,6 +142,7 @@   *----------------------------------------------------------------------*/  #define CONFIG_SYS_LEDPIO_ADDR		0x02120870	/* LED PIO base addr	*/  #define CONFIG_STATUS_LED			/* Enable status driver */ +#define CONFIG_BOARD_SPECIFIC_LED  #define STATUS_LED_BIT		1		/* Bit-0 on PIO		*/  #define STATUS_LED_STATE	1		/* Blinking		*/ diff --git a/include/configs/eb_cpu5282.h b/include/configs/eb_cpu5282.h index 9ecc10bd1..5a0d321f7 100644 --- a/include/configs/eb_cpu5282.h +++ b/include/configs/eb_cpu5282.h @@ -38,7 +38,7 @@  #define CONFIG_MCFUART  #define CONFIG_SYS_UART_PORT		(0) -#define CONFIG_BAUDRATE 9600 +#define CONFIG_BAUDRATE			115200  #undef	CONFIG_MONITOR_IS_IN_RAM		/* starts uboot direct */ @@ -52,20 +52,24 @@  #define CONFIG_RESET_TO_RETRY  #define CONFIG_SPLASH_SCREEN +#define CONFIG_HW_WATCHDOG + +#define CONFIG_STATUS_LED +#define CONFIG_BOARD_SPECIFIC_LED +#define STATUS_LED_ACTIVE		0 +#define STATUS_LED_BIT			0x0008	/* Timer7 GPIO */ +#define STATUS_LED_BOOT			0 +#define STATUS_LED_PERIOD		(CONFIG_SYS_HZ / 2) +#define STATUS_LED_STATE		STATUS_LED_OFF +  /*----------------------------------------------------------------------*   * Configuration for environment					*   * Environment is in the second sector of the first 256k of flash	*   *----------------------------------------------------------------------*/ -#ifndef CONFIG_MONITOR_IS_IN_RAM -#define CONFIG_ENV_ADDR		0xF003C000	/* End of 256K */ -#define CONFIG_ENV_SECT_SIZE	0x4000 -#define CONFIG_ENV_IS_IN_FLASH	1 -#else -#define CONFIG_ENV_ADDR		0xFFE04000 -#define CONFIG_ENV_SECT_SIZE	0x2000 +#define CONFIG_ENV_ADDR		0xFF040000 +#define CONFIG_ENV_SECT_SIZE	0x00020000  #define CONFIG_ENV_IS_IN_FLASH	1 -#endif  /*   * BOOTP options @@ -78,26 +82,24 @@  /*   * Command line configuration.   */ +#define CONFIG_CMDLINE_EDITING  #include <config_cmd_default.h>  #undef CONFIG_CMD_LOADB +#define CONFIG_CMD_DATE +#define CONFIG_CMD_DHCP +#define CONFIG_CMD_I2C +#define CONFIG_CMD_LED  #define CONFIG_CMD_MII  #define CONFIG_CMD_NET  #define CONFIG_MCFTMR -  #define CONFIG_BOOTDELAY	5 -#define CONFIG_SYS_HUSH_PARSER -#define CONFIG_SYS_PROMPT_HUSH_PS2	"> "  #define CONFIG_SYS_PROMPT	"\nEB+CPU5282> "  #define	CONFIG_SYS_LONGHELP	1 -#if defined(CONFIG_CMD_KGDB)  #define	CONFIG_SYS_CBSIZE	1024	/* Console I/O Buffer Size	*/ -#else -#define	CONFIG_SYS_CBSIZE	256	/* Console I/O Buffer Size	*/ -#endif  #define	CONFIG_SYS_PBSIZE 	(CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16)  #define	CONFIG_SYS_MAXARGS	16	/* max number of command args	*/  #define CONFIG_SYS_BARGSIZE	CONFIG_SYS_CBSIZE @@ -112,12 +114,12 @@  /*----------------------------------------------------------------------*   * Clock and PLL Configuration						*   *----------------------------------------------------------------------*/ -#define CONFIG_SYS_HZ			10000000 -#define	CONFIG_SYS_CLK			58982400       /* 9,8304MHz * 6 */ +#define CONFIG_SYS_HZ			1000 +#define	CONFIG_SYS_CLK			80000000      /* 8MHz * 8 */ -/* PLL Configuration: Ext Clock * 6 (see table 9-4 of MCF user manual) */ +/* PLL Configuration: Ext Clock * 8 (see table 9-4 of MCF user manual) */ -#define CONFIG_SYS_MFD		0x01	/* PLL Multiplication Factor Devider */ +#define CONFIG_SYS_MFD		0x02	/* PLL Multiplication Factor Devider */  #define CONFIG_SYS_RFD		0x00	/* PLL Reduce Frecuency Devider */  /*----------------------------------------------------------------------* @@ -135,7 +137,6 @@  #define CONFIG_SYS_FEC0_MIIBASE		CONFIG_SYS_FEC0_IOBASE  #define MCFFEC_TOUT_LOOP		50000 -#define CONFIG_ETHADDR			00:CF:52:82:EB:01  #define CONFIG_OVERWRITE_ETHADDR_ONCE  /*------------------------------------------------------------------------- @@ -151,7 +152,7 @@   *-----------------------------------------------------------------------*/  #define CONFIG_SYS_INIT_RAM_ADDR	0x20000000 -#define CONFIG_SYS_INIT_RAM_SIZE		0x10000 +#define CONFIG_SYS_INIT_RAM_SIZE	0x10000  #define CONFIG_SYS_GBL_DATA_OFFSET	\  	(CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)  #define CONFIG_SYS_INIT_SP_OFFSET	CONFIG_SYS_GBL_DATA_OFFSET @@ -161,12 +162,11 @@   * (Set up by the startup code)   * Please note that CONFIG_SYS_SDRAM_BASE _must_ start at 0   */ -#define CONFIG_SYS_SDRAM_BASE1		0x00000000 -#define	CONFIG_SYS_SDRAM_SIZE1		16	/* SDRAM size in MB */ - -#define CONFIG_SYS_SDRAM_BASE		CONFIG_SYS_SDRAM_BASE1 -#define	CONFIG_SYS_SDRAM_SIZE		CONFIG_SYS_SDRAM_SIZE1 +#define CONFIG_SYS_SDRAM_BASE0		0x00000000 +#define	CONFIG_SYS_SDRAM_SIZE0		16	/* SDRAM size in MB */ +#define CONFIG_SYS_SDRAM_BASE		CONFIG_SYS_SDRAM_BASE0 +#define	CONFIG_SYS_SDRAM_SIZE		CONFIG_SYS_SDRAM_SIZE0  /* If M5282 port is fully implemented the monitor base will be behind   * the vector table. */ @@ -190,16 +190,24 @@  /*-----------------------------------------------------------------------   * FLASH organization   */ +#define CONFIG_FLASH_SHOW_PROGRESS	45  #define CONFIG_SYS_FLASH_BASE		CONFIG_SYS_CS0_BASE  #define	CONFIG_SYS_INT_FLASH_BASE	0xF0000000  #define CONFIG_SYS_INT_FLASH_ENABLE	0x21 -#define	CONFIG_SYS_MAX_FLASH_SECT	35 -#define	CONFIG_SYS_MAX_FLASH_BANKS	2 +#define	CONFIG_SYS_MAX_FLASH_SECT	128 +#define	CONFIG_SYS_MAX_FLASH_BANKS	1  #define	CONFIG_SYS_FLASH_ERASE_TOUT	10000000  #define	CONFIG_SYS_FLASH_PROTECTION +#define CONFIG_SYS_FLASH_CFI +#define CONFIG_FLASH_CFI_DRIVER +#define CONFIG_SYS_FLASH_SIZE		16*1024*1024 +#define CONFIG_SYS_FLASH_CFI_WIDTH	FLASH_CFI_16BIT + +#define CONFIG_SYS_FLASH_BANKS_LIST	{ CONFIG_SYS_FLASH_BASE } +  /*-----------------------------------------------------------------------   * Cache Configuration   */ @@ -221,12 +229,16 @@   * Memory bank definitions   */ -#define CONFIG_SYS_CS0_BASE		0xFFE00000 +#define CONFIG_SYS_CS0_BASE		0xFF000000  #define CONFIG_SYS_CS0_CTRL		0x00001980 -#define CONFIG_SYS_CS0_MASK		0x001F0001 +#define CONFIG_SYS_CS0_MASK		0x00FF0001 -#define CONFIG_SYS_CS3_BASE		0xE0000000 -#define CONFIG_SYS_CS0_CTRL		0x00001980 +#define CONFIG_SYS_CS2_BASE		0xE0000000 +#define CONFIG_SYS_CS2_CTRL		0x00001980 +#define CONFIG_SYS_CS2_MASK		0x000F0001 + +#define CONFIG_SYS_CS3_BASE		0xE0100000 +#define CONFIG_SYS_CS3_CTRL		0x00001980  #define CONFIG_SYS_CS3_MASK		0x000F0001  /*----------------------------------------------------------------------- @@ -248,24 +260,42 @@  #define CONFIG_SYS_PCDDR		0x0000000  #define CONFIG_SYS_PCDAT		0x0000000 +#define CONFIG_SYS_PASPAR		0x0F0F  #define CONFIG_SYS_PEHLPAR		0xC0  #define CONFIG_SYS_PUAPAR		0x0F  #define CONFIG_SYS_DDRUA		0x05  #define CONFIG_SYS_PJPAR		0xFF  /*----------------------------------------------------------------------- + * I2C + */ + +#define CONFIG_HARD_I2C +#define CONFIG_FSL_I2C + +#define CONFIG_SYS_I2C_OFFSET		0x00000300 +#define CONFIG_SYS_IMMR			CONFIG_SYS_MBAR + +#define CONFIG_SYS_I2C_SPEED		100000 +#define CONFIG_SYS_I2C_SLAVE		0 + +#ifdef CONFIG_CMD_DATE +#define CONFIG_RTC_DS1338 +#define CONFIG_I2C_RTC_ADDR		0x68 +#endif + +/*-----------------------------------------------------------------------   * VIDEO configuration   */  #define CONFIG_VIDEO  #ifdef CONFIG_VIDEO -#define	CONFIG_VIDEO_VCXK			1 +#define CONFIG_VIDEO_VCXK			1  #define CONFIG_SYS_VCXK_DEFAULT_LINEALIGN	2  #define	CONFIG_SYS_VCXK_DOUBLEBUFFERED		1 -#define CONFIG_SYS_VCXK_BASE			CONFIG_SYS_CS3_BASE -#define CONFIG_SYS_VCXK_AUTODETECT		1 +#define CONFIG_SYS_VCXK_BASE			CONFIG_SYS_CS2_BASE  #define CONFIG_SYS_VCXK_ACKNOWLEDGE_PORT	MCFGPTB_GPTPORT  #define CONFIG_SYS_VCXK_ACKNOWLEDGE_DDR		MCFGPTB_GPTDDR diff --git a/include/configs/imx31_litekit.h b/include/configs/imx31_litekit.h index 6ae764a2d..8fc394245 100644 --- a/include/configs/imx31_litekit.h +++ b/include/configs/imx31_litekit.h @@ -72,9 +72,9 @@  #define CONFIG_DEFAULT_SPI_MODE	(SPI_MODE_0 | SPI_CS_HIGH)  /* PMIC Controller */ -#define CONFIG_PMIC -#define CONFIG_PMIC_SPI -#define CONFIG_PMIC_FSL +#define CONFIG_POWER +#define CONFIG_POWER_SPI +#define CONFIG_POWER_FSL  #define CONFIG_FSL_PMIC_BUS	1  #define CONFIG_FSL_PMIC_CS	0  #define CONFIG_FSL_PMIC_CLK	1000000 diff --git a/include/configs/microblaze-generic.h b/include/configs/microblaze-generic.h index 721cd906a..eed38c165 100644 --- a/include/configs/microblaze-generic.h +++ b/include/configs/microblaze-generic.h @@ -287,6 +287,10 @@  # undef CONFIG_DCACHE  #endif +#ifndef XILINX_DCACHE_BYTE_SIZE +#define XILINX_DCACHE_BYTE_SIZE	32768 +#endif +  /*   * BOOTP options   */ diff --git a/include/configs/mx31ads.h b/include/configs/mx31ads.h index 9d9f4a782..9e4006b44 100644 --- a/include/configs/mx31ads.h +++ b/include/configs/mx31ads.h @@ -68,9 +68,9 @@  #define CONFIG_MXC_GPIO  /* PMIC Controller */ -#define CONFIG_PMIC -#define CONFIG_PMIC_SPI -#define CONFIG_PMIC_FSL +#define CONFIG_POWER +#define CONFIG_POWER_SPI +#define CONFIG_POWER_FSL  #define CONFIG_FSL_PMIC_BUS	1  #define CONFIG_FSL_PMIC_CS	0  #define CONFIG_FSL_PMIC_CLK	1000000 diff --git a/include/configs/mx31pdk.h b/include/configs/mx31pdk.h index 223b5b0bb..3b86c9ebf 100644 --- a/include/configs/mx31pdk.h +++ b/include/configs/mx31pdk.h @@ -69,9 +69,9 @@  #define CONFIG_DEFAULT_SPI_MODE	(SPI_MODE_0 | SPI_CS_HIGH)  /* PMIC Controller */ -#define CONFIG_PMIC -#define CONFIG_PMIC_SPI -#define CONFIG_PMIC_FSL +#define CONFIG_POWER +#define CONFIG_POWER_SPI +#define CONFIG_POWER_FSL  #define CONFIG_FSL_PMIC_BUS	1  #define CONFIG_FSL_PMIC_CS	2  #define CONFIG_FSL_PMIC_CLK	1000000 diff --git a/include/configs/mx35pdk.h b/include/configs/mx35pdk.h index 826c91249..342d53fee 100644 --- a/include/configs/mx35pdk.h +++ b/include/configs/mx35pdk.h @@ -65,9 +65,9 @@  /*   * PMIC Configs   */ -#define CONFIG_PMIC -#define CONFIG_PMIC_I2C -#define CONFIG_PMIC_FSL +#define CONFIG_POWER +#define CONFIG_POWER_I2C +#define CONFIG_POWER_FSL  #define CONFIG_SYS_FSL_PMIC_I2C_ADDR	0x08  #define CONFIG_RTC_MC13XXX diff --git a/include/configs/mx51_efikamx.h b/include/configs/mx51_efikamx.h index ffe771f2d..3c1c056fe 100644 --- a/include/configs/mx51_efikamx.h +++ b/include/configs/mx51_efikamx.h @@ -127,9 +127,9 @@  #endif  /* SPI PMIC */ -#define CONFIG_PMIC -#define CONFIG_PMIC_SPI -#define CONFIG_PMIC_FSL +#define CONFIG_POWER +#define CONFIG_POWER_SPI +#define CONFIG_POWER_FSL  #define CONFIG_FSL_PMIC_BUS		0  #define CONFIG_FSL_PMIC_CS		(0 | 120 << 8)  #define CONFIG_FSL_PMIC_CLK		25000000 diff --git a/include/configs/mx51evk.h b/include/configs/mx51evk.h index 225d359ec..f00cec280 100644 --- a/include/configs/mx51evk.h +++ b/include/configs/mx51evk.h @@ -69,9 +69,9 @@  #define CONFIG_MXC_SPI  /* PMIC Controller */ -#define CONFIG_PMIC -#define CONFIG_PMIC_SPI -#define CONFIG_PMIC_FSL +#define CONFIG_POWER +#define CONFIG_POWER_SPI +#define CONFIG_POWER_FSL  #define CONFIG_FSL_PMIC_BUS	0  #define CONFIG_FSL_PMIC_CS	0  #define CONFIG_FSL_PMIC_CLK	2500000 diff --git a/include/configs/mx53evk.h b/include/configs/mx53evk.h index d1f684cbc..1916b85e2 100644 --- a/include/configs/mx53evk.h +++ b/include/configs/mx53evk.h @@ -55,9 +55,9 @@  #define CONFIG_SYS_I2C_SPEED            100000  /* PMIC Configs */ -#define CONFIG_PMIC -#define CONFIG_PMIC_I2C -#define CONFIG_PMIC_FSL +#define CONFIG_POWER +#define CONFIG_POWER_I2C +#define CONFIG_POWER_FSL  #define CONFIG_SYS_FSL_PMIC_I2C_ADDR    8  #define CONFIG_RTC_MC13XXX diff --git a/include/configs/mx53loco.h b/include/configs/mx53loco.h index a1b27cef5..a1101762e 100644 --- a/include/configs/mx53loco.h +++ b/include/configs/mx53loco.h @@ -89,10 +89,10 @@  #define CONFIG_SYS_I2C_SPEED		100000  /* PMIC Controller */ -#define CONFIG_PMIC -#define CONFIG_PMIC_I2C -#define CONFIG_DIALOG_PMIC -#define CONFIG_PMIC_FSL +#define CONFIG_POWER +#define CONFIG_POWER_I2C +#define CONFIG_DIALOG_POWER +#define CONFIG_POWER_FSL  #define CONFIG_SYS_DIALOG_PMIC_I2C_ADDR	0x48  #define CONFIG_SYS_FSL_PMIC_I2C_ADDR	0x8 diff --git a/include/configs/nios2-generic.h b/include/configs/nios2-generic.h index 69ff3efb5..624bd5c7e 100644 --- a/include/configs/nios2-generic.h +++ b/include/configs/nios2-generic.h @@ -68,6 +68,7 @@  #define CONFIG_SYS_ALTERA_PIO_GPIO_NUM	LED_PIO_WIDTH  #define CONFIG_STATUS_LED		/* Enable status driver */ +#define CONFIG_BOARD_SPECIFIC_LED  #define CONFIG_GPIO_LED		/* Enable GPIO LED driver */  #define CONFIG_GPIO			/* Enable GPIO driver */ diff --git a/include/configs/qong.h b/include/configs/qong.h index e43a02110..d9bf2010b 100644 --- a/include/configs/qong.h +++ b/include/configs/qong.h @@ -58,9 +58,9 @@  #define CONFIG_DEFAULT_SPI_MODE	(SPI_MODE_0 | SPI_CS_HIGH)  #define CONFIG_RTC_MC13XXX -#define CONFIG_PMIC -#define CONFIG_PMIC_SPI -#define CONFIG_PMIC_FSL +#define CONFIG_POWER +#define CONFIG_POWER_SPI +#define CONFIG_POWER_FSL  #define CONFIG_FSL_PMIC_BUS	1  #define CONFIG_FSL_PMIC_CS	0  #define CONFIG_FSL_PMIC_CLK	100000 diff --git a/include/configs/s5p_goni.h b/include/configs/s5p_goni.h index 7e0b30293..56e83478f 100644 --- a/include/configs/s5p_goni.h +++ b/include/configs/s5p_goni.h @@ -215,9 +215,9 @@  #define CONFIG_SYS_CACHELINE_SIZE       64 -#define CONFIG_PMIC -#define CONFIG_PMIC_I2C -#define CONFIG_PMIC_MAX8998 +#define CONFIG_POWER +#define CONFIG_POWER_I2C +#define CONFIG_POWER_MAX8998  #include <asm/arch/gpio.h>  /* diff --git a/include/configs/s5pc210_universal.h b/include/configs/s5pc210_universal.h index 5fc613643..894f38bd7 100644 --- a/include/configs/s5pc210_universal.h +++ b/include/configs/s5pc210_universal.h @@ -253,9 +253,9 @@  #define CONFIG_I2C_MULTI_BUS  #define CONFIG_SYS_MAX_I2C_BUS	7 -#define CONFIG_PMIC -#define CONFIG_PMIC_I2C -#define CONFIG_PMIC_MAX8998 +#define CONFIG_POWER +#define CONFIG_POWER_I2C +#define CONFIG_POWER_MAX8998  #define CONFIG_USB_GADGET  #define CONFIG_USB_GADGET_S3C_UDC_OTG diff --git a/include/configs/trats.h b/include/configs/trats.h index d7808aa71..355029e8d 100644 --- a/include/configs/trats.h +++ b/include/configs/trats.h @@ -234,10 +234,16 @@  #define CONFIG_SOFT_I2C_GPIO_SDA get_multi_sda_pin()  #define I2C_INIT multi_i2c_init() -#define CONFIG_PMIC -#define CONFIG_PMIC_I2C -#define CONFIG_PMIC_MAX8997 +#define CONFIG_POWER +#define CONFIG_POWER_I2C +#define CONFIG_POWER_MAX8997 +#define CONFIG_POWER_FG +#define CONFIG_POWER_FG_MAX17042 +#define CONFIG_POWER_MUIC +#define CONFIG_POWER_MUIC_MAX8997 +#define CONFIG_POWER_BATTERY +#define CONFIG_POWER_BATTERY_TRATS  #define CONFIG_USB_GADGET  #define CONFIG_USB_GADGET_S3C_UDC_OTG  #define CONFIG_USB_GADGET_DUALSPEED diff --git a/include/configs/tt01.h b/include/configs/tt01.h index f46efa55f..9f8f240f8 100644 --- a/include/configs/tt01.h +++ b/include/configs/tt01.h @@ -149,9 +149,9 @@  #define CONFIG_MXC_GPIO  /* MC13783 connected to CSPI3 and SS0 */ -#define CONFIG_PMIC -#define CONFIG_PMIC_SPI -#define CONFIG_PMIC_FSL +#define CONFIG_POWER +#define CONFIG_POWER_SPI +#define CONFIG_POWER_FSL  #define CONFIG_FSL_PMIC_BUS		2  #define CONFIG_FSL_PMIC_CS		0 diff --git a/include/configs/vision2.h b/include/configs/vision2.h index 848df88e7..a72010ff2 100644 --- a/include/configs/vision2.h +++ b/include/configs/vision2.h @@ -87,9 +87,9 @@  #define CONFIG_ENV_IS_IN_SPI_FLASH  /* PMIC Controller */ -#define CONFIG_PMIC -#define CONFIG_PMIC_SPI -#define CONFIG_PMIC_FSL +#define CONFIG_POWER +#define CONFIG_POWER_SPI +#define CONFIG_POWER_FSL  #define CONFIG_FSL_PMIC_BUS	0  #define CONFIG_FSL_PMIC_CS	0  #define CONFIG_FSL_PMIC_CLK	2500000 diff --git a/include/nios2.h b/include/nios2.h index df8126a66..cbca0dc01 100644 --- a/include/nios2.h +++ b/include/nios2.h @@ -24,8 +24,6 @@  #ifndef __NIOS2_H__  #define __NIOS2_H__ -#include <linux/stringify.h> -  /*------------------------------------------------------------------------   * Control registers -- use with wrctl() & rdctl()   *----------------------------------------------------------------------*/ @@ -39,14 +37,8 @@   * Access to control regs   *----------------------------------------------------------------------*/ -#define rdctl(reg)\ -	({unsigned int val;\ -	asm volatile("rdctl %0, ctl" __stringify(reg) \ -		: "=r" (val) ); val;}) - -#define wrctl(reg,val)\ -	asm volatile( "wrctl ctl" _str_(reg) ",%0"\ -		: : "r" (val)) +#define rdctl(reg) __builtin_rdctl(reg) +#define wrctl(reg, val) __builtin_wrctl(reg, val)  /*------------------------------------------------------------------------   * Control reg bit masks diff --git a/drivers/misc/pmic_max8997.c b/include/power/battery.h index 62dbc0531..e2fec687d 100644 --- a/drivers/misc/pmic_max8997.c +++ b/include/power/battery.h @@ -21,23 +21,18 @@   * MA 02111-1307 USA   */ -#include <common.h> -#include <pmic.h> -#include <max8997_pmic.h> +#ifndef __POWER_BATTERY_H_ +#define __POWER_BATTERY_H_ -int pmic_init(void) -{ -	struct pmic *p = get_pmic(); -	static const char name[] = "MAX8997_PMIC"; +struct battery { +	unsigned int version; +	unsigned int state_of_chrg; +	unsigned int time_to_empty; +	unsigned int capacity; +	unsigned int voltage_uV; -	puts("Board PMIC init\n"); +	unsigned int state; +}; -	p->name = name; -	p->interface = PMIC_I2C; -	p->number_of_regs = PMIC_NUM_OF_REGS; -	p->hw.i2c.addr = MAX8997_I2C_ADDR; -	p->hw.i2c.tx_num = 1; -	p->bus = I2C_PMIC; - -	return 0; -} +int power_bat_init(unsigned char bus); +#endif /* __POWER_BATTERY_H_ */ diff --git a/include/power/fg_battery_cell_params.h b/include/power/fg_battery_cell_params.h new file mode 100644 index 000000000..7ddf6f2ff --- /dev/null +++ b/include/power/fg_battery_cell_params.h @@ -0,0 +1,90 @@ +/* + *  Copyright (C) 2012 Samsung Electronics + *  Lukasz Majewski <l.majewski@samsung.com> + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#ifndef __FG_BATTERY_CELL_PARAMS_H_ +#define __FG_BATTERY_CELL_PARAMS_H_ + +#if  defined(CONFIG_POWER_FG_MAX17042) && defined(CONFIG_TRATS) + +/* Cell characteristics - Exynos4 TRATS development board */ +/* Shall be written to addr 0x80h */ +u16 cell_character0[16] = { +	0xA2A0, +	0xB6E0, +	0xB850, +	0xBAD0, +	0xBB20, +	0xBB70, +	0xBBC0, +	0xBC20, +	0xBC80, +	0xBCE0, +	0xBD80, +	0xBE20, +	0xC090, +	0xC420, +	0xC910, +	0xD070 +}; + +/* Shall be written to addr 0x90h */ +u16 cell_character1[16] = { +	0x0090, +	0x1A50, +	0x02F0, +	0x2060, +	0x2060, +	0x2E60, +	0x26A0, +	0x2DB0, +	0x2DB0, +	0x1870, +	0x2A20, +	0x16F0, +	0x08F0, +	0x0D40, +	0x08C0, +	0x08C0 +}; + +/* Shall be written to addr 0xA0h */ +u16 cell_character2[16] = { +	0x0100, +	0x0100, +	0x0100, +	0x0100, +	0x0100, +	0x0100, +	0x0100, +	0x0100, +	0x0100, +	0x0100, +	0x0100, +	0x0100, +	0x0100, +	0x0100, +	0x0100, +	0x0100 +}; +#endif +#endif /* __FG_BATTERY_CELL_PARAMS_H_ */ diff --git a/include/power/max17042_fg.h b/include/power/max17042_fg.h new file mode 100644 index 000000000..1103a483f --- /dev/null +++ b/include/power/max17042_fg.h @@ -0,0 +1,74 @@ +/* + *  Copyright (C) 2012 Samsung Electronics + *  Lukasz Majewski <l.majewski@samsung.com> + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#ifndef __MAX17042_FG_H_ +#define __MAX17042_FG_H_ + +/* MAX 17042 registers */ +enum { +	MAX17042_STATUS         = 0x00, +	MAX17042_SOCREP         = 0x06, +	MAX17042_VCELL          = 0x09, +	MAX17042_CURRENT        = 0x0A, +	MAX17042_AVG_CURRENT	= 0x0B, +	MAX17042_SOCMIX	= 0x0D, +	MAX17042_SOCAV		= 0x0E, +	MAX17042_DESIGN_CAP	= 0x18, +	MAX17042_AVG_VCELL	= 0x19, +	MAX17042_CONFIG	= 0x1D, +	MAX17042_VERSION	= 0x21, +	MAX17042_LEARNCFG       = 0x28, +	MAX17042_FILTERCFG	= 0x29, +	MAX17042_RELAXCFG	= 0x2A, +	MAX17042_MISCCFG	= 0x2B, +	MAX17042_CGAIN		= 0x2E, +	MAX17042_COFF		= 0x2F, +	MAX17042_RCOMP0	= 0x38, +	MAX17042_TEMPCO	= 0x39, +	MAX17042_FSTAT		= 0x3D, +	MAX17042_MLOCKReg1	= 0x62, +	MAX17042_MLOCKReg2	= 0x63, +	MAX17042_MODEL1         = 0x80, +	MAX17042_MODEL2         = 0x90, +	MAX17042_MODEL3         = 0xA0, +	MAX17042_VFOCV		= 0xFB, +	MAX17042_VFSOC		= 0xFF, + +	FG_NUM_OF_REGS = 0x100, +}; + +#define RCOMP0			0x0060 +#define TempCo			0x1015 + + +#define MAX17042_POR (1 << 1) + +#define MODEL_UNLOCK1		0x0059 +#define MODEL_UNLOCK2		0x00c4 +#define MODEL_LOCK1		0x0000 +#define MODEL_LOCK2		0x0000 + +#define MAX17042_I2C_ADDR	(0x6C >> 1) + +int power_fg_init(unsigned char bus); +#endif /* __MAX17042_FG_H_ */ diff --git a/include/power/max8997_muic.h b/include/power/max8997_muic.h new file mode 100644 index 000000000..0149c1243 --- /dev/null +++ b/include/power/max8997_muic.h @@ -0,0 +1,61 @@ +/* + *  Copyright (C) 2012 Samsung Electronics + *  Lukasz Majewski <l.majewski@samsung.com> + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#ifndef __MAX8997_MUIC_H_ +#define __MAX8997_MUIC_H_ + +#include <power/power_chrg.h> + +/* MAX8997_MUIC_STATUS2 */ +#define MAX8997_MUIC_CHG_NO	0x00 +#define MAX8997_MUIC_CHG_USB	0x01 +#define MAX8997_MUIC_CHG_USB_D	0x02 +#define MAX8997_MUIC_CHG_TA	0x03 +#define MAX8997_MUIC_CHG_TA_500 0x04 +#define MAX8997_MUIC_CHG_TA_1A	0x05 +#define MAX8997_MUIC_CHG_MASK	0x07 + +/* MAX 8997 MUIC registers */ +enum { +	MAX8997_MUIC_ID         = 0x00, +	MAX8997_MUIC_INT1	= 0x01, +	MAX8997_MUIC_INT2	= 0x02, +	MAX8997_MUIC_INT3	= 0x03, +	MAX8997_MUIC_STATUS1	= 0x04, +	MAX8997_MUIC_STATUS2	= 0x05, +	MAX8997_MUIC_STATUS3	= 0x06, +	MAX8997_MUIC_INTMASK1	= 0x07, +	MAX8997_MUIC_INTMASK2	= 0x08, +	MAX8997_MUIC_INTMASK3	= 0x09, +	MAX8997_MUIC_CDETCTRL	= 0x0A, +	MAX8997_MUIC_CONTROL1	= 0x0C, +	MAX8997_MUIC_CONTROL2	= 0x0D, +	MAX8997_MUIC_CONTROL3	= 0x0E, + +	MUIC_NUM_OF_REGS = 0x0F, +}; + +#define MAX8997_MUIC_I2C_ADDR	(0x4A >> 1) + +int power_muic_init(unsigned int bus); +#endif /* __MAX8997_MUIC_H_ */ diff --git a/include/max8997_pmic.h b/include/power/max8997_pmic.h index 17ae24ea6..5d2d94df9 100644 --- a/include/max8997_pmic.h +++ b/include/power/max8997_pmic.h @@ -111,7 +111,7 @@ enum {  	MAX8997_REG_MBCCTRL6	= 0x55,  	MAX8997_REG_OTPCGHCVS	= 0x56, -	MAX8997_REG_SAFEOUTCTRL	= 0x5a, +	MAX8997_REG_SAFEOUTCTRL = 0x5a,  	MAX8997_REG_LBCNFG1	= 0x5e,  	MAX8997_REG_LBCNFG2	= 0x5f, @@ -171,9 +171,31 @@ enum {  	PMIC_NUM_OF_REGS = 0x9b,  }; +#define ACTDISSAFEO1 (1 << 4) +#define ACTDISSAFEO2 (1 << 5)  #define ENSAFEOUT1 (1 << 6)  #define ENSAFEOUT2 (1 << 7) +#define ENBUCK (1 << 0) +#define ACTIVE_DISCHARGE (1 << 3) +#define GNSLCT (1 << 2) +#define LDO_ADE (1 << 1) +#define SAFEOUT_4_85V 0x00 +#define SAFEOUT_4_90V 0x01 +#define SAFEOUT_4_95V 0x02 +#define SAFEOUT_3_30V 0x03 + +/* Charger */ +enum {CHARGER_ENABLE, CHARGER_DISABLE}; +#define DETBAT                  (1 << 2) +#define MBCICHFCSET             (1 << 4) +#define MBCHOSTEN               (1 << 6) +#define VCHGR_FC                (1 << 7) + +#define CHARGER_MIN_CURRENT 200 +#define CHARGER_MAX_CURRENT 950 +#define CHARGER_CURRENT_RESOLUTION 50 +  #define MAX8997_I2C_ADDR        (0xCC >> 1)  #define MAX8997_RTC_ADDR	(0x0C >> 1)  #define MAX8997_MUIC_ADDR	(0x4A >> 1) @@ -187,4 +209,6 @@ enum {  	EN_LDO = (0x3 << 6),  }; +#define MAX8997_LDO_MAX_VAL 0x3F +unsigned char max8997_reg_ldo(int uV);  #endif /* __MAX8997_PMIC_H_ */ diff --git a/include/max8998_pmic.h b/include/power/max8998_pmic.h index ca21f882c..ca21f882c 100644 --- a/include/max8998_pmic.h +++ b/include/power/max8998_pmic.h diff --git a/include/pmic.h b/include/power/pmic.h index 6a05b40ae..1ecfc0543 100644 --- a/include/pmic.h +++ b/include/power/pmic.h @@ -1,5 +1,5 @@  /* - *  Copyright (C) 2011 Samsung Electronics + *  Copyright (C) 2011-2012 Samsung Electronics   *  Lukasz Majewski <l.majewski@samsung.com>   *   * See file CREDITS for list of people who contributed to this @@ -24,9 +24,15 @@  #ifndef __CORE_PMIC_H_  #define __CORE_PMIC_H_ -enum { PMIC_I2C, PMIC_SPI, }; +#include <common.h> +#include <linux/list.h> +#include <i2c.h> +#include <power/power_chrg.h> + +enum { PMIC_I2C, PMIC_SPI, PMIC_NONE};  enum { I2C_PMIC, I2C_NUM, };  enum { PMIC_READ, PMIC_WRITE, }; +enum { PMIC_SENSOR_BYTE_ORDER_LITTLE, PMIC_SENSOR_BYTE_ORDER_BIG, };  struct p_i2c {  	unsigned char addr; @@ -43,21 +49,52 @@ struct p_spi {  	u32 (*prepare_tx)(u32 reg, u32 *val, u32 write);  }; +struct pmic; +struct power_fg { +	int (*fg_battery_check) (struct pmic *p, struct pmic *bat); +	int (*fg_battery_update) (struct pmic *p, struct pmic *bat); +}; + +struct power_chrg { +	int (*chrg_type) (struct pmic *p); +	int (*chrg_bat_present) (struct pmic *p); +	int (*chrg_state) (struct pmic *p, int state, int current); +}; + +struct power_battery { +	struct battery *bat; +	int (*battery_init) (struct pmic *bat, struct pmic *p1, +			     struct pmic *p2, struct pmic *p3); +	int (*battery_charge) (struct pmic *bat); +	/* Keep info about power devices involved with battery operation */ +	struct pmic *chrg, *fg, *muic; +}; +  struct pmic {  	const char *name;  	unsigned char bus;  	unsigned char interface; -	unsigned char number_of_regs; +	unsigned char sensor_byte_order; +	unsigned int number_of_regs;  	union hw {  		struct p_i2c i2c;  		struct p_spi spi;  	} hw; + +	void (*low_power_mode) (void); +	struct power_battery *pbat; +	struct power_chrg *chrg; +	struct power_fg *fg; + +	struct pmic *parent; +	struct list_head list;  }; -int pmic_init(void); -int pmic_dialog_init(void); -int check_reg(u32 reg); -struct pmic *get_pmic(void); +int pmic_init(unsigned char bus); +int pmic_dialog_init(unsigned char bus); +int check_reg(struct pmic *p, u32 reg); +struct pmic *pmic_alloc(void); +struct pmic *pmic_get(const char *s);  int pmic_probe(struct pmic *p);  int pmic_reg_read(struct pmic *p, u32 reg, u32 *val);  int pmic_reg_write(struct pmic *p, u32 reg, u32 val); diff --git a/arch/nios2/include/asm/status_led.h b/include/power/power_chrg.h index 20f8d9019..24c4cde73 100644 --- a/arch/nios2/include/asm/status_led.h +++ b/include/power/power_chrg.h @@ -1,6 +1,6 @@  /* - * (C) Copyright 2004, Psyent Corporation <www.psyent.com> - * Scott McNutt <smcnutt@psyent.com> + *  Copyright (C) 2012 Samsung Electronics + *  Lukasz Majewski <l.majewski@samsung.com>   *   * See file CREDITS for list of people who contributed to this   * project. @@ -12,7 +12,7 @@   *   * This program is distributed in the hope that it will be useful,   * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the   * GNU General Public License for more details.   *   * You should have received a copy of the GNU General Public License @@ -20,12 +20,24 @@   * Foundation, Inc., 59 Temple Place, Suite 330, Boston,   * MA 02111-1307 USA   */ -#ifndef __ASM_STATUS_LED_H__ -#define __ASM_STATUS_LED_H__ -typedef unsigned led_id_t; -extern void __led_init (led_id_t mask, int state); -extern void __led_set (led_id_t mask, int state); -inline void __led_toggle (led_id_t mask); +#ifndef __POWER_CHARGER_H_ +#define __POWER_CHARGER_H_ -#endif	/* __ASM_STATUS_LED_H__ */ +/* Type of available chargers */ +enum { +	CHARGER_NO = 0, +	CHARGER_TA, +	CHARGER_USB, +	CHARGER_TA_500, +	CHARGER_UNKNOWN, +}; + +enum { +	UNKNOWN, +	EXT_SOURCE, +	CHARGE, +	NORMAL, +}; + +#endif /* __POWER_CHARGER_H_ */ diff --git a/include/status_led.h b/include/status_led.h index da9fae920..27e912769 100644 --- a/include/status_led.h +++ b/include/status_led.h @@ -273,9 +273,6 @@ void status_led_set  (int led, int state);  #elif defined(CONFIG_STXXTC)  /* XXX empty just to avoid the error */  /************************************************************************/ -#elif defined(CONFIG_NIOS2) -/* XXX empty just to avoid the error */ -/************************************************************************/  #elif defined(CONFIG_V38B)  # define STATUS_LED_BIT		0x0010			/* Timer7 GPIO */ diff --git a/nand_spl/board/freescale/mpc8536ds/Makefile b/nand_spl/board/freescale/mpc8536ds/Makefile index e5388d89c..822ae7c01 100644 --- a/nand_spl/board/freescale/mpc8536ds/Makefile +++ b/nand_spl/board/freescale/mpc8536ds/Makefile @@ -67,7 +67,8 @@ $(nandobj)u-boot-spl:	$(OBJS) $(nandobj)u-boot-nand_spl.lds  # $(LDSCRIPT). The function make_u_boot_list is defined in helper.mk file.  $(eval $(call make_u_boot_list, $(LSTSCRIPT), $(OBJS)))  $(nandobj)u-boot-nand_spl.lds: $(LDSCRIPT) $(LSTSCRIPT) -	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -I$(obj) -ansi -D__ASSEMBLY__ -P - <$< >$@ +	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -I$(nandobj)/board/$(BOARDDIR) \ +		-ansi -D__ASSEMBLY__ -P - <$< >$@  # create symbolic links for common files diff --git a/nand_spl/board/freescale/mpc8569mds/Makefile b/nand_spl/board/freescale/mpc8569mds/Makefile index e5388d89c..822ae7c01 100644 --- a/nand_spl/board/freescale/mpc8569mds/Makefile +++ b/nand_spl/board/freescale/mpc8569mds/Makefile @@ -67,7 +67,8 @@ $(nandobj)u-boot-spl:	$(OBJS) $(nandobj)u-boot-nand_spl.lds  # $(LDSCRIPT). The function make_u_boot_list is defined in helper.mk file.  $(eval $(call make_u_boot_list, $(LSTSCRIPT), $(OBJS)))  $(nandobj)u-boot-nand_spl.lds: $(LDSCRIPT) $(LSTSCRIPT) -	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -I$(obj) -ansi -D__ASSEMBLY__ -P - <$< >$@ +	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -I$(nandobj)/board/$(BOARDDIR) \ +		-ansi -D__ASSEMBLY__ -P - <$< >$@  # create symbolic links for common files diff --git a/nand_spl/board/freescale/mpc8572ds/Makefile b/nand_spl/board/freescale/mpc8572ds/Makefile index e5388d89c..822ae7c01 100644 --- a/nand_spl/board/freescale/mpc8572ds/Makefile +++ b/nand_spl/board/freescale/mpc8572ds/Makefile @@ -67,7 +67,8 @@ $(nandobj)u-boot-spl:	$(OBJS) $(nandobj)u-boot-nand_spl.lds  # $(LDSCRIPT). The function make_u_boot_list is defined in helper.mk file.  $(eval $(call make_u_boot_list, $(LSTSCRIPT), $(OBJS)))  $(nandobj)u-boot-nand_spl.lds: $(LDSCRIPT) $(LSTSCRIPT) -	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -I$(obj) -ansi -D__ASSEMBLY__ -P - <$< >$@ +	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -I$(nandobj)/board/$(BOARDDIR) \ +		-ansi -D__ASSEMBLY__ -P - <$< >$@  # create symbolic links for common files diff --git a/nand_spl/board/freescale/mx31pdk/Makefile b/nand_spl/board/freescale/mx31pdk/Makefile index 43e72c42d..f67ed09d0 100644 --- a/nand_spl/board/freescale/mx31pdk/Makefile +++ b/nand_spl/board/freescale/mx31pdk/Makefile @@ -42,7 +42,8 @@ $(nandobj)u-boot-spl:	$(OBJS) $(nandobj)u-boot.lds  # $(LDSCRIPT). The function make_u_boot_list is defined in helper.mk file.  $(eval $(call make_u_boot_list, $(LSTSCRIPT), $(OBJS)))  $(nandobj)u-boot.lds: $(LDSCRIPT) $(LSTSCRIPT) -	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -I$(obj) -ansi -D__ASSEMBLY__ -P - <$< >$@ +	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -I$(nandobj)/board/$(BOARDDIR) \ +		-ansi -D__ASSEMBLY__ -P - <$< >$@  ######################################################################### diff --git a/nand_spl/board/freescale/p1010rdb/Makefile b/nand_spl/board/freescale/p1010rdb/Makefile index f270faae0..9dff94251 100644 --- a/nand_spl/board/freescale/p1010rdb/Makefile +++ b/nand_spl/board/freescale/p1010rdb/Makefile @@ -68,7 +68,8 @@ $(nandobj)u-boot-spl:	$(OBJS) $(nandobj)u-boot-nand_spl.lds  # $(LDSCRIPT). The function make_u_boot_list is defined in helper.mk file.  $(eval $(call make_u_boot_list, $(LSTSCRIPT), $(OBJS)))  $(nandobj)u-boot-nand_spl.lds: $(LDSCRIPT) $(LSTSCRIPT) -	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -I$(obj) -ansi -D__ASSEMBLY__ -P - <$< >$@ +	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -I$(nandobj)board/$(BOARDDIR) \ +		 -ansi -D__ASSEMBLY__ -P - <$< >$@  # create symbolic links for common files diff --git a/nand_spl/board/freescale/p1023rds/Makefile b/nand_spl/board/freescale/p1023rds/Makefile index b2882844b..7a87cf621 100644 --- a/nand_spl/board/freescale/p1023rds/Makefile +++ b/nand_spl/board/freescale/p1023rds/Makefile @@ -63,7 +63,8 @@ $(nandobj)u-boot-spl:	$(OBJS) $(nandobj)u-boot-nand_spl.lds  # $(LDSCRIPT). The function make_u_boot_list is defined in helper.mk file.  $(eval $(call make_u_boot_list, $(LSTSCRIPT), $(OBJS)))  $(nandobj)u-boot-nand_spl.lds: $(LDSCRIPT) $(LSTSCRIPT) -	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -I$(obj) -ansi -D__ASSEMBLY__ -P - <$< >$@ +	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -I$(nandobj)/board/$(BOARDDIR) \ +		-ansi -D__ASSEMBLY__ -P - <$< >$@  # create symbolic links for common files diff --git a/nand_spl/board/freescale/p1_p2_rdb/Makefile b/nand_spl/board/freescale/p1_p2_rdb/Makefile index e5388d89c..822ae7c01 100644 --- a/nand_spl/board/freescale/p1_p2_rdb/Makefile +++ b/nand_spl/board/freescale/p1_p2_rdb/Makefile @@ -67,7 +67,8 @@ $(nandobj)u-boot-spl:	$(OBJS) $(nandobj)u-boot-nand_spl.lds  # $(LDSCRIPT). The function make_u_boot_list is defined in helper.mk file.  $(eval $(call make_u_boot_list, $(LSTSCRIPT), $(OBJS)))  $(nandobj)u-boot-nand_spl.lds: $(LDSCRIPT) $(LSTSCRIPT) -	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -I$(obj) -ansi -D__ASSEMBLY__ -P - <$< >$@ +	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -I$(nandobj)/board/$(BOARDDIR) \ +		-ansi -D__ASSEMBLY__ -P - <$< >$@  # create symbolic links for common files diff --git a/nand_spl/board/karo/tx25/Makefile b/nand_spl/board/karo/tx25/Makefile index becf7fa99..b27189d9b 100644 --- a/nand_spl/board/karo/tx25/Makefile +++ b/nand_spl/board/karo/tx25/Makefile @@ -63,7 +63,8 @@ $(nandobj)u-boot-spl:	$(OBJS) $(nandobj)u-boot.lds  # $(LDSCRIPT). The function make_u_boot_list is defined in helper.mk file.  $(eval $(call make_u_boot_list, $(LSTSCRIPT), $(OBJS)))  $(nandobj)u-boot.lds: $(LDSCRIPT) $(LSTSCRIPT) -	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -I$(obj) -ansi -D__ASSEMBLY__ -P - <$< >$@ +	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -I$(nandobj)/board/$(BOARDDIR) \ +		-ansi -D__ASSEMBLY__ -P - <$< >$@  ######################################################################### diff --git a/tools/patman/series.py b/tools/patman/series.py index a283a2d1f..d2971f489 100644 --- a/tools/patman/series.py +++ b/tools/patman/series.py @@ -145,10 +145,11 @@ class Series(dict):          Return:              The change log as a list of strings, one per line -            Changes in v2: +            Changes in v4:              - Jog the dial back closer to the widget -            Changes in v1: +            Changes in v3: None +            Changes in v2:              - Fix the widget              - Jog the dial @@ -162,12 +163,16 @@ class Series(dict):                  if commit and this_commit != commit:                      continue                  out.append(text) -            if out: -                out = ['Changes in v%d:' % change] + out -                if need_blank: -                    out = [''] + out -                final += out -                need_blank = True +            line = 'Changes in v%d:' % change +            have_changes = len(out) > 0 +            if have_changes: +                out.insert(0, line) +            else: +                out = [line + ' None'] +            if need_blank: +                out.insert(0, '') +            final += out +            need_blank = have_changes          if self.changes:              final.append('')          return final |