From daee722455d6459d0a7a5a3fcc1555d22144ad41 Mon Sep 17 00:00:00 2001 From: Cástor Muñoz Date: Wed, 25 May 2016 23:43:26 +0200 Subject: iPod Classic: use PMU interrupts to detect USB and FW Change-Id: I9be733e1a943ddeb99335d362f81f74879eeb94b --- firmware/target/arm/s5l8700/usb-nano2g-6g.c | 32 +++++++++++++++++++++-- firmware/target/arm/s5l8702/debug-s5l8702.c | 2 +- firmware/target/arm/s5l8702/ipod6g/pmu-ipod6g.c | 11 +++----- firmware/target/arm/s5l8702/ipod6g/pmu-target.h | 1 - firmware/target/arm/s5l8702/ipod6g/power-ipod6g.c | 17 +++++------- firmware/target/arm/s5l8702/system-target.h | 3 +++ 6 files changed, 44 insertions(+), 22 deletions(-) (limited to 'firmware') diff --git a/firmware/target/arm/s5l8700/usb-nano2g-6g.c b/firmware/target/arm/s5l8700/usb-nano2g-6g.c index db397f8fd5..7d48a5cabd 100644 --- a/firmware/target/arm/s5l8700/usb-nano2g-6g.c +++ b/firmware/target/arm/s5l8700/usb-nano2g-6g.c @@ -27,7 +27,6 @@ #ifdef HAVE_USBSTACK #include "usb_core.h" #include "usb_drv.h" -#include "power.h" void usb_enable(bool on) { @@ -35,6 +34,9 @@ void usb_enable(bool on) else usb_core_exit(); } +#if CONFIG_CPU==S5L8701 +#include "power.h" + int usb_detect(void) { if (power_input_status() & POWER_INPUT_USB) @@ -42,6 +44,31 @@ int usb_detect(void) return USB_EXTRACTED; } +#elif CONFIG_CPU==S5L8702 +static int usb_status = USB_EXTRACTED; + +int usb_detect(void) +{ + return usb_status; +} + +void usb_insert_int(void) +{ + usb_status = USB_INSERTED; +#ifdef USB_STATUS_BY_EVENT + usb_status_event(USB_INSERTED); +#endif +} + +void usb_remove_int(void) +{ + usb_status = USB_EXTRACTED; +#ifdef USB_STATUS_BY_EVENT + usb_status_event(USB_EXTRACTED); +#endif +} +#endif /* S5L8702 */ + void usb_init_device(void) { /* Power up the core clocks to allow writing @@ -59,7 +86,8 @@ void usb_init_device(void) usb_drv_exit(); } -#else + +#else /* !HAVE_STACK */ void usb_enable(bool on) { (void)on; diff --git a/firmware/target/arm/s5l8702/debug-s5l8702.c b/firmware/target/arm/s5l8702/debug-s5l8702.c index b274b5fc0a..cead1b7219 100644 --- a/firmware/target/arm/s5l8702/debug-s5l8702.c +++ b/firmware/target/arm/s5l8702/debug-s5l8702.c @@ -122,7 +122,7 @@ bool dbg_hw_info(void) _DEBUG_PRINTF("brightness value: %d", pmu_read(0x28)); line++; _DEBUG_PRINTF("USB present: %s", - pmu_usb_present() ? "true" : "false"); + (power_input_status() & POWER_INPUT_USB) ? "true" : "false"); #if CONFIG_CHARGING _DEBUG_PRINTF("FW present: %s", pmu_firewire_present() ? "true" : "false"); diff --git a/firmware/target/arm/s5l8702/ipod6g/pmu-ipod6g.c b/firmware/target/arm/s5l8702/ipod6g/pmu-ipod6g.c index 4200308861..c439a30fc1 100644 --- a/firmware/target/arm/s5l8702/ipod6g/pmu-ipod6g.c +++ b/firmware/target/arm/s5l8702/ipod6g/pmu-ipod6g.c @@ -161,18 +161,12 @@ static struct eint_handler pmu_eint = { }; static int pmu_input_holdswitch; -static int pmu_input_usb; int pmu_holdswitch_locked(void) { return pmu_input_holdswitch; } -int pmu_usb_present(void) -{ - return pmu_input_usb; -} - #ifdef IPOD_ACCESSORY_PROTOCOL static int pmu_input_accessory; @@ -206,7 +200,10 @@ static void pmu_read_inputs_gpio(void) static void pmu_read_inputs_ooc(void) { unsigned char oocstat = pmu_read(PCF5063X_REG_OOCSTAT); - pmu_input_usb = !!(oocstat & PCF5063X_OOCSTAT_EXTON2); + if (oocstat & PCF5063X_OOCSTAT_EXTON2) + usb_insert_int(); + else + usb_remove_int(); #ifdef IPOD_ACCESSORY_PROTOCOL pmu_input_accessory = !(oocstat & PCF5063X_OOCSTAT_EXTON3); #endif diff --git a/firmware/target/arm/s5l8702/ipod6g/pmu-target.h b/firmware/target/arm/s5l8702/ipod6g/pmu-target.h index 2274b4061f..5552e2196a 100644 --- a/firmware/target/arm/s5l8702/ipod6g/pmu-target.h +++ b/firmware/target/arm/s5l8702/ipod6g/pmu-target.h @@ -92,7 +92,6 @@ void pmu_write_rtc(unsigned char* buffer); void pmu_hdd_power(bool on); int pmu_holdswitch_locked(void); -int pmu_usb_present(void); #if CONFIG_CHARGING int pmu_firewire_present(void); #endif diff --git a/firmware/target/arm/s5l8702/ipod6g/power-ipod6g.c b/firmware/target/arm/s5l8702/ipod6g/power-ipod6g.c index d3224d2a66..1a8e1e1a7e 100644 --- a/firmware/target/arm/s5l8702/ipod6g/power-ipod6g.c +++ b/firmware/target/arm/s5l8702/ipod6g/power-ipod6g.c @@ -119,17 +119,12 @@ void usb_charging_maxcurrent_change(int maxcurrent) 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; + unsigned int status = POWER_INPUT_NONE; + if (usb_detect() == USB_INSERTED) + status |= POWER_INPUT_USB_CHARGER; + if (pmu_firewire_present()) + status |= POWER_INPUT_MAIN_CHARGER; + return status; } bool charging_state(void) diff --git a/firmware/target/arm/s5l8702/system-target.h b/firmware/target/arm/s5l8702/system-target.h index b40d563e46..d3db7476ee 100644 --- a/firmware/target/arm/s5l8702/system-target.h +++ b/firmware/target/arm/s5l8702/system-target.h @@ -47,6 +47,9 @@ static inline void udelay(unsigned usecs) while (TIME_BEFORE(USEC_TIMER, stop)); } +void usb_insert_int(void); +void usb_remove_int(void); + #ifdef BOOTLOADER void system_preinit(void); #endif -- cgit v1.2.3