mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-12-08 20:55:17 -05:00
This is part of the preparation to add support for iPod Nano 3G and Nano 4G. There are some optimisations left, like merging similar blocks of registers that share the same layout, but the base address have changed between SoC generations. Change-Id: I4f06727b4061977141b65d39ae19591bd5b29680
81 lines
2.5 KiB
C
81 lines
2.5 KiB
C
/***************************************************************************
|
|
* __________ __ ___.
|
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
* \/ \/ \/ \/ \/
|
|
* $Id$
|
|
*
|
|
* Copyright © 2009 Bertrik Sikken
|
|
*
|
|
* 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
* KIND, either express or implied.
|
|
*
|
|
****************************************************************************/
|
|
#include <stdbool.h>
|
|
#include "config.h"
|
|
#include "inttypes.h"
|
|
#include "s5l87xx.h"
|
|
#include "power.h"
|
|
#include "panic.h"
|
|
#include "pmu-target.h"
|
|
#include "usb_core.h" /* for usb_charging_maxcurrent_change */
|
|
|
|
void power_off(void)
|
|
{
|
|
pmu_ldo_on_in_standby(0, 0);
|
|
pmu_ldo_on_in_standby(1, 0);
|
|
pmu_ldo_on_in_standby(2, 0);
|
|
pmu_ldo_on_in_standby(3, 0);
|
|
pmu_ldo_on_in_standby(4, 0);
|
|
pmu_ldo_on_in_standby(5, 0);
|
|
pmu_ldo_on_in_standby(6, 0);
|
|
pmu_ldo_on_in_standby(7, 0);
|
|
pmu_set_wake_condition(0x42); /* USB inserted or EXTON1 */
|
|
pmu_enter_standby();
|
|
|
|
while(1);
|
|
}
|
|
|
|
void power_init(void)
|
|
{
|
|
pmu_write(0x1e, 0xf); /* Vcore = 1.000V */
|
|
pmu_ldo_set_voltage(2, 0x13); /* LCD = 2.800V */
|
|
}
|
|
|
|
#if CONFIG_CHARGING
|
|
|
|
#ifdef HAVE_USB_CHARGING_ENABLE
|
|
void usb_charging_maxcurrent_change(int maxcurrent)
|
|
{
|
|
bool on = (maxcurrent >= 500);
|
|
PDAT11 = (PDAT11 & ~1) | (on ? 1 : 0);
|
|
}
|
|
#endif
|
|
|
|
unsigned int power_input_status(void)
|
|
{
|
|
/* This checks if USB Vbus is present. */
|
|
if (!(PDAT14 & 0x8)) return POWER_INPUT_USB_CHARGER;
|
|
|
|
/* If USB Vbus is not present, check if we have a positive power balance
|
|
regardless. This would indicate FireWire charging. Note that this will
|
|
drop to POWER_INPUT_NONE if FireWire isn't able to supply enough current
|
|
for device operation, e.g. during disk spinup. */
|
|
if (PDAT11 & 0x20) return POWER_INPUT_NONE;
|
|
|
|
/* Looks like we have FireWire power. */
|
|
return POWER_INPUT_MAIN_CHARGER;
|
|
}
|
|
|
|
bool charging_state(void)
|
|
{
|
|
return (PDAT11 & 0x10) ? 0 : 1;
|
|
}
|
|
#endif /* CONFIG_CHARGING */
|