98bd2231ec
PMU interrupts are used to detect USB Vbus, wall adaptor, accessories and holdswitch. A thread is needed to poll the PMU throught I2C, ATM it does nothing but showing the state of the inputs on the HW debug menu, funcionallity for each individual input will be added in next patches. Change-Id: If93bf2044d1052729237a7fd1431c8493e09f1c7
139 lines
4.5 KiB
C
139 lines
4.5 KiB
C
/***************************************************************************
|
|
* __________ __ ___.
|
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
* \/ \/ \/ \/ \/
|
|
* $Id: power-nano2g.c 28190 2010-10-01 18:09:10Z Buschel $
|
|
*
|
|
* 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 "s5l8702.h"
|
|
#include "power.h"
|
|
#include "panic.h"
|
|
#include "pmu-target.h"
|
|
#include "usb_core.h" /* for usb_charging_maxcurrent_change */
|
|
|
|
static int idepowered;
|
|
|
|
void power_off(void)
|
|
{
|
|
/* USB inserted or EXTON1 */
|
|
pmu_set_wake_condition(
|
|
PCF5063X_OOCWAKE_EXTON2 | PCF5063X_OOCWAKE_EXTON1);
|
|
pmu_enter_standby();
|
|
|
|
while(1);
|
|
}
|
|
|
|
void power_init(void)
|
|
{
|
|
pmu_init();
|
|
|
|
idepowered = false;
|
|
|
|
/* DOWN1CTL: CPU DVM step time = 30us (default: no DVM) */
|
|
pmu_write(0x20, 2);
|
|
|
|
/* USB power configuration:
|
|
*
|
|
* GPIO C0 is probably related to the LTC4066's CLPROG
|
|
* pin (see datasheet). Setting it high allows to double
|
|
* the maximum current selected by HPWR:
|
|
*
|
|
* GPIO B6 GPIO C0 USB current
|
|
* HPWR CLPROG ??? limit (mA)
|
|
* ------- ---------- -----------
|
|
* 0 0 100
|
|
* 1 0 500
|
|
* 0 1 200
|
|
* 1 1 1000 ??? (max.seen ~750mA)
|
|
*
|
|
* USB current limit includes battery charge and device
|
|
* consumption. Battery charge has it's own limit at
|
|
* 330~340 mA (configured using RPROG).
|
|
*
|
|
* Setting either of GPIO C1 or GPIO C2 disables battery
|
|
* charge, power needed for device consumptiom is drained
|
|
* from USB or AC adaptor when present. If external power
|
|
* is not present or it is insufficient or limited,
|
|
* additional required power is drained from battery.
|
|
*/
|
|
PCONB = (PCONB & 0x000000ff)
|
|
| (0xe << 8) /* route D+ to ADC2: off */
|
|
| (0xe << 12) /* route D- to ADC2: off */
|
|
| (0x0 << 16) /* USB related input, POL pin ??? */
|
|
| (0x0 << 20) /* USB related input, !CHRG pin ??? */
|
|
| (0xe << 24) /* HPWR: 100mA */
|
|
| (0xe << 28); /* USB suspend: off */
|
|
|
|
PCONC = (PCONC & 0xffff0000)
|
|
| (0xe << 0) /* double HPWR limit: off */
|
|
| (0xe << 4) /* disable battery charge: off */
|
|
| (0xe << 8) /* disable battery charge: off */
|
|
| (0x0 << 12); /* USB inserted/not inserted */
|
|
}
|
|
|
|
void ide_power_enable(bool on)
|
|
{
|
|
idepowered = on;
|
|
pmu_hdd_power(on);
|
|
}
|
|
|
|
bool ide_powered()
|
|
{
|
|
return idepowered;
|
|
}
|
|
|
|
#if CONFIG_CHARGING
|
|
|
|
#ifdef HAVE_USB_CHARGING_ENABLE
|
|
void usb_charging_maxcurrent_change(int maxcurrent)
|
|
{
|
|
bool suspend_charging = (maxcurrent < 100);
|
|
bool fast_charging = (maxcurrent >= 500);
|
|
|
|
/* This GPIO is connected to the LTC4066's SUSP pin */
|
|
/* Setting it high prevents any power being drawn over USB */
|
|
/* which supports USB suspend */
|
|
GPIOCMD = 0xb070e | (suspend_charging ? 1 : 0);
|
|
|
|
/* This GPIO is connected to the LTC4066's HPWR pin */
|
|
/* Setting it low limits current to 100mA, setting it high allows 500mA */
|
|
GPIOCMD = 0xb060e | (fast_charging ? 1 : 0);
|
|
}
|
|
#endif
|
|
|
|
unsigned int power_input_status(void)
|
|
{
|
|
/* This checks if USB Vbus is present. */
|
|
if (!(PDAT(12) & 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 (PDAT(11) & 0x20) return POWER_INPUT_NONE;
|
|
|
|
/* Looks like we have FireWire power. */
|
|
return POWER_INPUT_MAIN_CHARGER;
|
|
}
|
|
|
|
bool charging_state(void)
|
|
{
|
|
return (PDAT(11) & 0x10) ? 0 : 1;
|
|
}
|
|
#endif /* CONFIG_CHARGING */
|