Merge branch 'agust@denx.de' of git://git.denx.de/u-boot-staging
This commit is contained in:
commit
bb367b95f9
6
MAKEALL
6
MAKEALL
@ -380,6 +380,12 @@ LIST_pxa="$(boards_by_cpu pxa)"
|
||||
|
||||
LIST_ixp="$(boards_by_cpu ixp)"
|
||||
|
||||
#########################################################################
|
||||
## SPEAr Systems
|
||||
#########################################################################
|
||||
|
||||
LIST_spear="$(boards_by_soc spear)"
|
||||
|
||||
#########################################################################
|
||||
## ARM groups
|
||||
#########################################################################
|
||||
|
7
Makefile
7
Makefile
@ -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 \
|
||||
|
@ -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: ");
|
||||
|
@ -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))
|
||||
|
@ -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
|
@ -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
|
@ -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;
|
||||
}
|
||||
|
||||
void __led_toggle(led_id_t mask)
|
||||
{
|
||||
MCFGPTA_GPTPORT ^= (1 << 3);
|
||||
}
|
||||
|
||||
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)
|
||||
|
||||
/*
|
||||
****h* EB+CPU5282-T1/drv_video_init
|
||||
* FUNCTION
|
||||
***
|
||||
*/
|
||||
|
||||
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);
|
||||
}
|
||||
|
@ -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
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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>
|
||||
#include <usb/ehci-fsl.h>
|
||||
@ -252,9 +252,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;
|
||||
|
||||
pmic_init();
|
||||
p = get_pmic();
|
||||
ret = pmic_init(I2C_PMIC);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
p = pmic_get("FSL_PMIC");
|
||||
if (!p)
|
||||
return;
|
||||
|
||||
/* Write needed to Power Gate 2 register */
|
||||
pmic_reg_read(p, REG_POWER_MISC, &val);
|
||||
|
@ -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;
|
||||
|
||||
pmic_init();
|
||||
p = get_pmic();
|
||||
ret = pmic_init(I2C_PMIC);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
p = pmic_get("FSL_PMIC");
|
||||
if (!p)
|
||||
return;
|
||||
|
||||
/* Set VDDA to 1.25V */
|
||||
pmic_reg_read(p, REG_SW_2, &val);
|
||||
|
@ -36,7 +36,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>
|
||||
@ -344,10 +344,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;
|
||||
@ -363,8 +369,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);
|
||||
|
@ -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;
|
||||
|
||||
pmic_init();
|
||||
p = get_pmic();
|
||||
ret = pmic_init(I2C_PMIC);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
p = pmic_get("FSL_PMIC");
|
||||
if (!p)
|
||||
return;
|
||||
|
||||
/* Write needed to Power Gate 2 register */
|
||||
pmic_reg_read(p, REG_POWER_MISC, &val);
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
pmic_init();
|
||||
p = get_pmic();
|
||||
ret = pmic_init(I2C_PMIC);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
p = pmic_get("FSL_PMIC");
|
||||
if (!p)
|
||||
return;
|
||||
|
||||
/* Write needed to Power Gate 2 register */
|
||||
pmic_reg_read(p, REG_POWER_MISC, &val);
|
||||
|
@ -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
|
||||
|
@ -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[])
|
||||
|
@ -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)
|
||||
|
@ -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"
|
||||
);
|
@ -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)
|
||||
|
||||
|
@ -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
|
||||
|
||||
########################################################################
|
100
drivers/power/battery/bat_trats.c
Normal file
100
drivers/power/battery/bat_trats.c
Normal file
@ -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;
|
||||
}
|
47
drivers/power/fuel_gauge/Makefile
Normal file
47
drivers/power/fuel_gauge/Makefile
Normal file
@ -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
|
||||
|
||||
########################################################################
|
250
drivers/power/fuel_gauge/fg_max17042.c
Normal file
250
drivers/power/fuel_gauge/fg_max17042.c
Normal file
@ -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;
|
||||
}
|
49
drivers/power/pmic/Makefile
Normal file
49
drivers/power/pmic/Makefile
Normal file
@ -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
|
||||
|
||||
########################################################################
|
90
drivers/power/pmic/muic_max8997.c
Normal file
90
drivers/power/pmic/muic_max8997.c
Normal file
@ -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;
|
||||
}
|
123
drivers/power/pmic/pmic_max8997.c
Normal file
123
drivers/power/pmic/pmic_max8997.c
Normal file
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
232
drivers/power/power_core.c
Normal file
232
drivers/power/power_core.c
Normal file
@ -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"
|
||||
);
|
@ -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;
|
||||
}
|
@ -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;
|
@ -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;
|
@ -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))
|
@ -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);
|
||||
|
11
fs/fs.c
11
fs/fs.c
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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_ADDR 0xFF040000
|
||||
#define CONFIG_ENV_SECT_SIZE 0x00020000
|
||||
#define CONFIG_ENV_IS_IN_FLASH 1
|
||||
#else
|
||||
#define CONFIG_ENV_ADDR 0xFFE04000
|
||||
#define CONFIG_ENV_SECT_SIZE 0x2000
|
||||
#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,11 +260,30 @@
|
||||
#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
|
||||
*/
|
||||
@ -260,12 +291,11 @@
|
||||
#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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
/*
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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_ */
|
90
include/power/fg_battery_cell_params.h
Normal file
90
include/power/fg_battery_cell_params.h
Normal file
@ -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_ */
|
74
include/power/max17042_fg.h
Normal file
74
include/power/max17042_fg.h
Normal file
@ -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_ */
|
61
include/power/max8997_muic.h
Normal file
61
include/power/max8997_muic.h
Normal file
@ -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_ */
|
@ -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_ */
|
@ -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);
|
43
include/power/power_chrg.h
Normal file
43
include/power/power_chrg.h
Normal file
@ -0,0 +1,43 @@
|
||||
/*
|
||||
* 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 __POWER_CHARGER_H_
|
||||
#define __POWER_CHARGER_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_ */
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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 - <$< >$@
|
||||
|
||||
#########################################################################
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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 - <$< >$@
|
||||
|
||||
#########################################################################
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user