mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-11-09 13:12:37 -05:00
imx233: enhance pinctrl irq with user pointer
Change-Id: I191704299487598a853af4df5aebbbf8a7134a34
This commit is contained in:
parent
918a06a12a
commit
8f351d6e21
6 changed files with 36 additions and 39 deletions
|
|
@ -66,10 +66,11 @@ static long mpr121_stack[DEFAULT_STACK_SIZE/sizeof(long)];
|
|||
static const char mpr121_thread_name[] = "mpr121";
|
||||
static struct event_queue mpr121_queue;
|
||||
|
||||
static void mpr121_irq_cb(int bank, int pin)
|
||||
static void mpr121_irq_cb(int bank, int pin, intptr_t user)
|
||||
{
|
||||
(void) bank;
|
||||
(void) pin;
|
||||
(void) user;
|
||||
/* the callback will not be fired until interrupt is enabled back so
|
||||
* the queue will not overflow or contain multiple MPR121_INTERRUPT events */
|
||||
queue_post(&mpr121_queue, MPR121_INTERRUPT, 0);
|
||||
|
|
@ -107,7 +108,7 @@ static void mpr121_thread(void)
|
|||
if(status & 0x80) touchpad_btns |= BUTTON_PLAY;
|
||||
}
|
||||
/* enable interrupt */
|
||||
imx233_pinctrl_setup_irq(0, 18, true, true, false, &mpr121_irq_cb);
|
||||
imx233_pinctrl_setup_irq(0, 18, true, true, false, &mpr121_irq_cb, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -125,7 +126,7 @@ void button_init_device(void)
|
|||
imx233_pinctrl_acquire(0, 18, "mpr121 int");
|
||||
imx233_pinctrl_set_function(0, 18, PINCTRL_FUNCTION_GPIO);
|
||||
imx233_pinctrl_enable_gpio(0, 18, false);
|
||||
imx233_pinctrl_setup_irq(0, 18, true, true, false, &mpr121_irq_cb);
|
||||
imx233_pinctrl_setup_irq(0, 18, true, true, false, &mpr121_irq_cb, 0);
|
||||
/* hold button */
|
||||
imx233_pinctrl_acquire(0, 4, "hold");
|
||||
imx233_pinctrl_set_function(0, 4, PINCTRL_FUNCTION_GPIO);
|
||||
|
|
|
|||
|
|
@ -63,6 +63,7 @@ const char *imx233_pinctrl_blame(unsigned bank, unsigned pin)
|
|||
#endif
|
||||
|
||||
static pin_irq_cb_t pin_cb[3][32]; /* 3 banks, 32 pins/bank */
|
||||
static intptr_t pin_cb_user[3][32];
|
||||
|
||||
static void INT_GPIO(int bank)
|
||||
{
|
||||
|
|
@ -71,9 +72,12 @@ static void INT_GPIO(int bank)
|
|||
if(fire & (1 << pin))
|
||||
{
|
||||
pin_irq_cb_t cb = pin_cb[bank][pin];
|
||||
imx233_pinctrl_setup_irq(bank, pin, false, false, false, NULL);
|
||||
intptr_t arg = pin_cb_user[bank][pin];
|
||||
/* WARNING: this call will modify pin_cb and pin_cb_user, that's
|
||||
* why we copy the data before ! */
|
||||
imx233_pinctrl_setup_irq(bank, pin, false, false, false, NULL, 0);
|
||||
if(cb)
|
||||
cb(bank, pin);
|
||||
cb(bank, pin, arg);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -92,13 +96,14 @@ void INT_GPIO2(void)
|
|||
INT_GPIO(2);
|
||||
}
|
||||
|
||||
void imx233_pinctrl_setup_irq(int bank, int pin, bool enable_int,
|
||||
bool level, bool polarity, pin_irq_cb_t cb)
|
||||
void imx233_pinctrl_setup_irq(unsigned bank, unsigned pin, bool enable_int,
|
||||
bool level, bool polarity, pin_irq_cb_t cb, intptr_t user)
|
||||
{
|
||||
HW_PINCTRL_PIN2IRQn_CLR(bank) = 1 << pin;
|
||||
HW_PINCTRL_IRQENn_CLR(bank) = 1 << pin;
|
||||
HW_PINCTRL_IRQSTATn_CLR(bank) = 1 << pin;
|
||||
pin_cb[bank][pin] = cb;
|
||||
pin_cb_user[bank][pin] = user;
|
||||
if(enable_int)
|
||||
{
|
||||
if(level)
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ const char *imx233_pinctrl_blame(unsigned bank, unsigned pin);
|
|||
#define imx233_pinctrl_blame(...) NULL
|
||||
#endif
|
||||
|
||||
typedef void (*pin_irq_cb_t)(int bank, int pin);
|
||||
typedef void (*pin_irq_cb_t)(int bank, int pin, intptr_t user);
|
||||
|
||||
static inline void imx233_pinctrl_init(void)
|
||||
{
|
||||
|
|
@ -69,7 +69,7 @@ static inline void imx233_pinctrl_set_drive(unsigned bank, unsigned pin, unsigne
|
|||
|
||||
static inline void imx233_pinctrl_enable_gpio(unsigned bank, unsigned pin, bool enable)
|
||||
{
|
||||
if(enable)
|
||||
if(enable)
|
||||
HW_PINCTRL_DOEn_SET(bank) = 1 << pin;
|
||||
else
|
||||
HW_PINCTRL_DOEn_CLR(bank) = 1 << pin;
|
||||
|
|
@ -128,7 +128,7 @@ static inline void imx233_pinctrl_enable_pullup_mask(unsigned bank, uint32_t pin
|
|||
|
||||
/** On irq, the pin irq interrupt is disable and then cb is called;
|
||||
* the setup_pin_irq function needs to be called again to enable it again */
|
||||
void imx233_pinctrl_setup_irq(int bank, int pin, bool enable_int,
|
||||
bool level, bool polarity, pin_irq_cb_t cb);
|
||||
void imx233_pinctrl_setup_irq(unsigned bank, unsigned pin, bool enable_int,
|
||||
bool level, bool polarity, pin_irq_cb_t cb, intptr_t user);
|
||||
|
||||
#endif /* __PINCTRL_IMX233_H__ */
|
||||
|
|
|
|||
|
|
@ -222,10 +222,11 @@ static int touchpad_read_device(void)
|
|||
return touchpad_btns;
|
||||
}
|
||||
|
||||
static void rmi_attn_cb(int bank, int pin)
|
||||
static void rmi_attn_cb(int bank, int pin, intptr_t user)
|
||||
{
|
||||
(void) bank;
|
||||
(void) pin;
|
||||
(void) user;
|
||||
/* the callback will not be fired until interrupt is enabled back so
|
||||
* the queue will not overflow or contain multiple RMI_INTERRUPT events */
|
||||
queue_post(&rmi_queue, RMI_INTERRUPT, 0);
|
||||
|
|
@ -271,7 +272,7 @@ static void rmi_thread(void)
|
|||
touchpad_btns = 0;
|
||||
|
||||
/* enable interrupt */
|
||||
imx233_pinctrl_setup_irq(0, 27, true, true, false, &rmi_attn_cb);
|
||||
imx233_pinctrl_setup_irq(0, 27, true, true, false, &rmi_attn_cb, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -328,7 +329,7 @@ void button_init_device(void)
|
|||
imx233_pinctrl_acquire(0, 27, "touchpad int");
|
||||
imx233_pinctrl_set_function(0, 27, PINCTRL_FUNCTION_GPIO);
|
||||
imx233_pinctrl_enable_gpio(0, 27, false);
|
||||
imx233_pinctrl_setup_irq(0, 27, true, true, false, &rmi_attn_cb);
|
||||
imx233_pinctrl_setup_irq(0, 27, true, true, false, &rmi_attn_cb, 0);
|
||||
/* Volume down */
|
||||
imx233_pinctrl_acquire(1, 30, "volume down");
|
||||
imx233_pinctrl_set_function(1, 30, PINCTRL_FUNCTION_GPIO);
|
||||
|
|
|
|||
|
|
@ -113,10 +113,11 @@ static struct semaphore rds_sema;
|
|||
static uint32_t rds_stack[DEFAULT_STACK_SIZE / sizeof(uint32_t)];
|
||||
|
||||
/* RDS GPIO interrupt handler */
|
||||
static void stc_rds_callback(int bank, int pin)
|
||||
static void stc_rds_callback(int bank, int pin, intptr_t user)
|
||||
{
|
||||
(void) bank;
|
||||
(void) pin;
|
||||
(void) user;
|
||||
|
||||
semaphore_release(&rds_sema);
|
||||
}
|
||||
|
|
@ -132,7 +133,7 @@ static void NORETURN_ATTR rds_thread(void)
|
|||
if(si4700_rds_read_raw(rds_data) && rds_process(rds_data))
|
||||
si4700_rds_set_event();
|
||||
/* renable callback */
|
||||
imx233_pinctrl_setup_irq(2, 27, true, true, false, &stc_rds_callback);
|
||||
imx233_pinctrl_setup_irq(2, 27, true, true, false, &stc_rds_callback, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -145,11 +146,11 @@ void si4700_rds_powerup(bool on)
|
|||
imx233_pinctrl_set_function(2, 27, PINCTRL_FUNCTION_GPIO);
|
||||
imx233_pinctrl_enable_gpio(2, 27, false);
|
||||
/* pin is set to 0 when an RDS packet has arrived */
|
||||
imx233_pinctrl_setup_irq(2, 27, true, true, false, &stc_rds_callback);
|
||||
imx233_pinctrl_setup_irq(2, 27, true, true, false, &stc_rds_callback, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
imx233_pinctrl_setup_irq(2, 27, false, false, false, NULL);
|
||||
imx233_pinctrl_setup_irq(2, 27, false, false, false, NULL, 0);
|
||||
imx233_pinctrl_release(2, 27, "tuner stc/rds");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -335,8 +335,9 @@ void imx233_ssp_sd_mmc_power_up_sequence(int ssp)
|
|||
SSP_CLRn(SSP_CMD0, ssp, CONT_CLKING_EN);
|
||||
}
|
||||
|
||||
static int ssp_detect_oneshot_callback(int ssp)
|
||||
static int ssp_detect_oneshot_callback(struct timeout *tmo)
|
||||
{
|
||||
int ssp = tmo->data;
|
||||
ASSERT_SSP(ssp)
|
||||
if(ssp_detect_cb[ssp - 1])
|
||||
ssp_detect_cb[ssp - 1](ssp);
|
||||
|
|
@ -344,26 +345,13 @@ static int ssp_detect_oneshot_callback(int ssp)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int ssp1_detect_oneshot_callback(struct timeout *tmo)
|
||||
{
|
||||
(void) tmo;
|
||||
return ssp_detect_oneshot_callback(1);
|
||||
}
|
||||
static struct timeout ssp_detect_oneshot[2];
|
||||
|
||||
static int ssp2_detect_oneshot_callback(struct timeout *tmo)
|
||||
static void detect_irq(int bank, int pin, intptr_t ssp)
|
||||
{
|
||||
(void) tmo;
|
||||
return ssp_detect_oneshot_callback(2);
|
||||
}
|
||||
|
||||
static void detect_irq(int bank, int pin)
|
||||
{
|
||||
static struct timeout ssp1_detect_oneshot;
|
||||
static struct timeout ssp2_detect_oneshot;
|
||||
if(bank == 2 && pin == 1)
|
||||
timeout_register(&ssp1_detect_oneshot, ssp1_detect_oneshot_callback, (3*HZ/10), 0);
|
||||
else if(bank == 0 && pin == 19)
|
||||
timeout_register(&ssp2_detect_oneshot, ssp2_detect_oneshot_callback, (3*HZ/10), 0);
|
||||
(void) bank;
|
||||
(void) pin;
|
||||
timeout_register(&ssp_detect_oneshot[ssp - 1], ssp_detect_oneshot_callback, (3*HZ/10), ssp);
|
||||
}
|
||||
|
||||
void imx233_ssp_sdmmc_setup_detect(int ssp, bool enable, ssp_detect_cb_t fn,
|
||||
|
|
@ -381,8 +369,9 @@ void imx233_ssp_sdmmc_setup_detect(int ssp, bool enable, ssp_detect_cb_t fn,
|
|||
imx233_pinctrl_enable_gpio(bank, pin, false);
|
||||
}
|
||||
if(first_time && imx233_ssp_sdmmc_detect(ssp))
|
||||
detect_irq(bank, pin);
|
||||
imx233_pinctrl_setup_irq(bank, pin, enable, true, !imx233_ssp_sdmmc_detect_raw(ssp), detect_irq);
|
||||
detect_irq(bank, pin, ssp);
|
||||
imx233_pinctrl_setup_irq(bank, pin, enable,
|
||||
true, !imx233_ssp_sdmmc_detect_raw(ssp), detect_irq, ssp);
|
||||
}
|
||||
|
||||
bool imx233_ssp_sdmmc_is_detect_inverted(int ssp)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue