From 5a8da163c842b08c6dbf1df6921507ec2fd5a534 Mon Sep 17 00:00:00 2001 From: Michael Sevakis Date: Mon, 2 Jan 2012 18:32:35 +0000 Subject: i.MX31 - Dethreading operations continue Dispense with "pmic" thread and process PMIC events directly within ISR. Add sense bit reading as part of the handling. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@31528 a1c6a512-1295-4272-9138-f99709370657 --- .../target/arm/imx31/gigabeat-s/adc-gigabeat-s.c | 4 +-- .../arm/imx31/gigabeat-s/button-gigabeat-s.c | 33 +++++++++------------- .../arm/imx31/gigabeat-s/headphone-gigabeat-s.c | 4 +-- .../arm/imx31/gigabeat-s/mc13783-gigabeat-s.c | 15 ++++++---- .../target/arm/imx31/gigabeat-s/power-gigabeat-s.c | 31 +++++++++++--------- .../target/arm/imx31/gigabeat-s/usb-gigabeat-s.c | 17 +++++++---- 6 files changed, 57 insertions(+), 47 deletions(-) (limited to 'firmware/target/arm/imx31/gigabeat-s') diff --git a/firmware/target/arm/imx31/gigabeat-s/adc-gigabeat-s.c b/firmware/target/arm/imx31/gigabeat-s/adc-gigabeat-s.c index eb30919077..b46fc2f63f 100644 --- a/firmware/target/arm/imx31/gigabeat-s/adc-gigabeat-s.c +++ b/firmware/target/arm/imx31/gigabeat-s/adc-gigabeat-s.c @@ -110,7 +110,7 @@ bool adc_enable_channel(int channel, bool enable) != MC13783_DATA_ERROR; } -/* Called by mc13783 interrupt thread when conversion is complete */ +/* ADC conversion complete event - called from PMIC ISR */ void adc_done(void) { semaphore_release(&adc_done_signal); @@ -132,5 +132,5 @@ void adc_init(void) /* Enable ADCDONE event */ mc13783_write(MC13783_INTERRUPT_STATUS0, MC13783_ADCDONEI); - mc13783_enable_event(MC13783_ADCDONE_EVENT); + mc13783_enable_event(MC13783_ADCDONE_EVENT, true); } diff --git a/firmware/target/arm/imx31/gigabeat-s/button-gigabeat-s.c b/firmware/target/arm/imx31/gigabeat-s/button-gigabeat-s.c index 90db00dcc3..11d1d5a0b4 100644 --- a/firmware/target/arm/imx31/gigabeat-s/button-gigabeat-s.c +++ b/firmware/target/arm/imx31/gigabeat-s/button-gigabeat-s.c @@ -35,7 +35,7 @@ static bool initialized = false; #endif -static int ext_btn = BUTTON_NONE; /* Buttons not on KPP */ +static unsigned long ext_btn = BUTTON_NONE; /* Buttons not on KPP */ static bool hold_button = false; #ifndef BOOTLOADER static bool hold_button_old = false; @@ -150,24 +150,16 @@ int button_read_device(void) #endif } -/* This is called from the mc13783 interrupt thread */ -void button_power_event(void) +/* Helper to update the power button status */ +static void power_button_update(bool pressed) { - bool pressed = - (mc13783_read(MC13783_INTERRUPT_SENSE1) & MC13783_ONOFD1S) == 0; - - int oldlevel = disable_irq_save(); - - if (pressed) - { - ext_btn |= BUTTON_POWER; - } - else - { - ext_btn &= ~BUTTON_POWER; - } + bitmod32(&ext_btn, pressed ? BUTTON_POWER : 0, BUTTON_POWER); +} - restore_irq(oldlevel); +/* Power button event - called from PMIC ISR */ +void button_power_event(void) +{ + power_button_update(!mc13783_event_sense(MC13783_ONOFD1_EVENT)); } void button_init_device(void) @@ -203,8 +195,9 @@ void button_init_device(void) * 6. Set the KDIE control bit bit. */ KPP_KPSR = KPP_KPSR_KRSS | KPP_KPSR_KDSC | KPP_KPSR_KPKD; - button_power_event(); - mc13783_enable_event(MC13783_ONOFD1_EVENT); + power_button_update(!(mc13783_read(MC13783_INTERRUPT_SENSE1) + & MC13783_ONOFD1S)); + mc13783_enable_event(MC13783_ONOFD1_EVENT, true); #ifdef HAVE_HEADPHONE_DETECTION headphone_init(); @@ -220,7 +213,7 @@ void button_close_device(void) /* Assumes HP detection is not available */ initialized = false; - mc13783_disable_event(MC13783_ONOFD1_EVENT); + mc13783_enable_event(MC13783_ONOFD1_EVENT, true); ext_btn = BUTTON_NONE; } #endif /* BUTTON_DRIVER_CLOSE */ diff --git a/firmware/target/arm/imx31/gigabeat-s/headphone-gigabeat-s.c b/firmware/target/arm/imx31/gigabeat-s/headphone-gigabeat-s.c index 6e76615308..4e1792d467 100644 --- a/firmware/target/arm/imx31/gigabeat-s/headphone-gigabeat-s.c +++ b/firmware/target/arm/imx31/gigabeat-s/headphone-gigabeat-s.c @@ -171,7 +171,7 @@ static void headphone_thread(void) } } -/* This is called from the mc13783 interrupt thread */ +/* HP plugged/unplugged event - called from PMIC ISR */ void headphone_detect_event(void) { /* Trigger the thread immediately. */ @@ -197,5 +197,5 @@ void INIT_ATTR headphone_init(void) /* Initially poll and then enable PMIC event */ headphone_detect_event(); - mc13783_enable_event(MC13783_ONOFD2_EVENT); + mc13783_enable_event(MC13783_ONOFD2_EVENT, true); } diff --git a/firmware/target/arm/imx31/gigabeat-s/mc13783-gigabeat-s.c b/firmware/target/arm/imx31/gigabeat-s/mc13783-gigabeat-s.c index 12009fae06..6ae8c23c48 100644 --- a/firmware/target/arm/imx31/gigabeat-s/mc13783-gigabeat-s.c +++ b/firmware/target/arm/imx31/gigabeat-s/mc13783-gigabeat-s.c @@ -55,28 +55,33 @@ const struct mc13783_event mc13783_events[MC13783_NUM_EVENTS] = { [MC13783_ADCDONE_EVENT] = /* ADC conversion complete */ { - .int_id = MC13783_INT_ID_ADCDONE, + .int_id = MC13783_INT_ID_ADCDONE, + .sense = 0, .callback = adc_done, }, [MC13783_ONOFD1_EVENT] = /* Power button */ { - .int_id = MC13783_INT_ID_ONOFD1, + .int_id = MC13783_INT_ID_ONOFD1, + .sense = MC13783_ONOFD1S, .callback = button_power_event, }, [MC13783_SE1_EVENT] = /* Main charger detection */ { - .int_id = MC13783_INT_ID_SE1, + .int_id = MC13783_INT_ID_SE1, + .sense = MC13783_SE1S, .callback = charger_main_detect_event, }, [MC13783_USB_EVENT] = /* USB insertion/USB charger detection */ { - .int_id = MC13783_INT_ID_USB, + .int_id = MC13783_INT_ID_USB, + .sense = MC13783_USB4V4S, .callback = usb_connect_event, }, #ifdef HAVE_HEADPHONE_DETECTION [MC13783_ONOFD2_EVENT] = /* Headphone jack */ { - .int_id = MC13783_INT_ID_ONOFD2, + .int_id = MC13783_INT_ID_ONOFD2, + .sense = 0, .callback = headphone_detect_event, }, #endif diff --git a/firmware/target/arm/imx31/gigabeat-s/power-gigabeat-s.c b/firmware/target/arm/imx31/gigabeat-s/power-gigabeat-s.c index 11276a6c3a..5b255a0e27 100644 --- a/firmware/target/arm/imx31/gigabeat-s/power-gigabeat-s.c +++ b/firmware/target/arm/imx31/gigabeat-s/power-gigabeat-s.c @@ -33,7 +33,7 @@ #include "fmradio_i2c.h" #endif -static unsigned int power_status = POWER_INPUT_NONE; +static unsigned long power_status = POWER_INPUT_NONE; /* Detect which power sources are present. */ unsigned int power_input_status(void) @@ -58,24 +58,28 @@ void usb_charging_maxcurrent_change(int maxcurrent) /* Nothing to do */ } -/* Detect changes in presence of the AC adaptor. */ +/* Helper to update the charger status */ +static void update_main_charger(bool present) +{ + bitmod32(&power_status, present ? POWER_INPUT_MAIN_CHARGER : 0, + POWER_INPUT_MAIN_CHARGER); +} + +/* Detect changes in presence of the AC adaptor. Called from PMIC ISR. */ void charger_main_detect_event(void) { - if (mc13783_read(MC13783_INTERRUPT_SENSE0) & MC13783_SE1S) - power_status |= POWER_INPUT_MAIN_CHARGER; - else - power_status &= ~POWER_INPUT_MAIN_CHARGER; + update_main_charger(mc13783_event_sense(MC13783_INT_ID_SE1) + & MC13783_SE1S); } -/* Detect changes in USB bus power. Called from usb connect event handler. */ +/* Detect changes in USB bus power. Called from usb connect event ISR. */ void charger_usb_detect_event(int status) { /* USB plugged does not imply charging is possible or even * powering the device to maintain the battery. */ - if (status == USB_INSERTED) - power_status |= POWER_INPUT_USB_CHARGER; - else - power_status &= ~POWER_INPUT_USB_CHARGER; + bitmod32(&power_status, + status == USB_INSERTED ? POWER_INPUT_USB_CHARGER : 0, + POWER_INPUT_USB_CHARGER); } /* charging_state is implemented in powermgmt-imx31.c */ @@ -152,8 +156,9 @@ void power_init(void) #endif /* Poll initial state */ - charger_main_detect_event(); + update_main_charger(mc13783_read(MC13783_INTERRUPT_SENSE0) + & MC13783_SE1S); /* Enable detect event */ - mc13783_enable_event(MC13783_SE1_EVENT); + mc13783_enable_event(MC13783_SE1_EVENT, true); } diff --git a/firmware/target/arm/imx31/gigabeat-s/usb-gigabeat-s.c b/firmware/target/arm/imx31/gigabeat-s/usb-gigabeat-s.c index b157544016..1584ffb574 100644 --- a/firmware/target/arm/imx31/gigabeat-s/usb-gigabeat-s.c +++ b/firmware/target/arm/imx31/gigabeat-s/usb-gigabeat-s.c @@ -59,16 +59,23 @@ bool usb_plugged(void) return mc13783_read(MC13783_INTERRUPT_SENSE0) & MC13783_USB4V4S; } -void usb_connect_event(void) +/* Helper to update the USB cable status */ +static void update_usb_status(bool sense) { - /* Read the immediate state of the cable from the PMIC */ - int status = usb_plugged() ? USB_INSERTED : USB_EXTRACTED; + int status = sense ? USB_INSERTED : USB_EXTRACTED; usb_status = status; /* Notify power that USB charging is potentially available */ charger_usb_detect_event(status); usb_status_event(status); } +/* Detect presence of USB bus - called from PMIC ISR */ +void usb_connect_event(void) +{ + /* Read the associated sense value */ + update_usb_status(mc13783_event_sense(MC13783_USB_EVENT)); +} + int usb_detect(void) { return usb_status; @@ -80,10 +87,10 @@ void usb_init_device(void) usb_drv_startup(); /* Initially poll */ - usb_connect_event(); + update_usb_status(usb_plugged()); /* Enable PMIC event */ - mc13783_enable_event(MC13783_USB_EVENT); + mc13783_enable_event(MC13783_USB_EVENT, true); } void usb_enable(bool on) -- cgit v1.2.3