rockbox/firmware/target/arm/s5l8700/ipodnano2g/power-nano2g.c
Michael Sparmann bc56811a0e iPod Nano 2G and Classic: Fix power and charging detection.
This should allow FireWire charging to work on these devices.
It also adds charging state detection on the iPod Classic.

(cherry picked from commit fa86fec4fb)

On Classic (and probably Nano 2G), it seems that the 100/500mA limit
applies only to USB chargers, when FW is connected it supplies all the
power (even if USB is also connected) and USB current limit does not
affect to FW charging, therefore the limit is only set when USB is
connected.

Change-Id: I7c6bab1b6a0f295367999c45faeda6085c3fb091
Signed-off-by: Cástor Muñoz <cmvidal@gmail.com>
2016-02-14 15:42:54 +01:00

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 "s5l8700.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 */