From 7af23757bc75551fdaef3716632a8e1790d7ded3 Mon Sep 17 00:00:00 2001 From: Tomasz Bursztyka Date: Wed, 8 Jul 2020 13:20:19 +0200 Subject: [PATCH] drivers: kscan: Fix device instance const qualifier loss SDL one needs to wrap device pointer into its data and xec do not need to pass any argument to its thread. Fixes #27399 Signed-off-by: Tomasz Bursztyka --- drivers/kscan/kscan_mchp_xec.c | 14 ++++++++++---- drivers/kscan/kscan_sdl.c | 12 ++++++++---- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/drivers/kscan/kscan_mchp_xec.c b/drivers/kscan/kscan_mchp_xec.c index 3f5de3ee4fa..5e964d60847 100644 --- a/drivers/kscan/kscan_mchp_xec.c +++ b/drivers/kscan/kscan_mchp_xec.c @@ -62,6 +62,8 @@ static KSCAN_Type *base = (KSCAN_Type *) static struct kscan_xec_data kbd_data; +DEVICE_DECLARE(kscan_xec); + static void drive_keyboard_column(int data) { if (data == KEYBOARD_COLUMN_DRIVE_ALL) { @@ -153,7 +155,7 @@ static void scan_matrix_xec_isr(void *arg) LOG_DBG(" "); } -static bool check_key_events(void *dev) +static bool check_key_events(const struct device *dev) { uint8_t matrix_new_state[MAX_MATRIX_KEY_COLS] = {0U}; bool key_pressed = false; @@ -267,13 +269,17 @@ static bool poll_expired(uint32_t start_cycles, int64_t *timeout) } -void polling_task(void *dev, void *dummy2, void *dummy3) +void polling_task(void *dummy1, void *dummy2, void *dummy3) { uint32_t current_cycles; uint32_t cycles_diff; uint32_t wait_period; int64_t local_poll_timeout = kbd_data.poll_timeout; + ARG_UNUSED(dummy1); + ARG_UNUSED(dummy2); + ARG_UNUSED(dummy3); + while (true) { base->KSI_STS = MCHP_KSCAN_KSO_SEL_REG_MASK; @@ -289,7 +295,7 @@ void polling_task(void *dev, void *dummy2, void *dummy3) while (atomic_get(&kbd_data.enable_scan) == 1U) { uint32_t start_period_cycles = k_cycle_get_32(); - if (check_key_events(dev)) { + if (check_key_events(DEVICE_GET(kscan_xec))) { local_poll_timeout = kbd_data.poll_timeout; start_poll_cycles = k_cycle_get_32(); } else if (!poll_expired(start_poll_cycles, @@ -399,7 +405,7 @@ static int kscan_xec_init(const struct device *dev) k_thread_create(&kbd_data.thread, kbd_data.thread_stack, TASK_STACK_SIZE, - polling_task, dev, NULL, NULL, + polling_task, NULL, NULL, NULL, K_PRIO_COOP(4), 0, K_NO_WAIT); /* Interrupts are enabled in the thread function */ diff --git a/drivers/kscan/kscan_sdl.c b/drivers/kscan/kscan_sdl.c index c587ab9ccbb..a95e83f22a1 100644 --- a/drivers/kscan/kscan_sdl.c +++ b/drivers/kscan/kscan_sdl.c @@ -12,14 +12,14 @@ LOG_MODULE_REGISTER(kscan, CONFIG_KSCAN_LOG_LEVEL); struct sdl_data { + const struct device *dev; kscan_callback_t callback; bool enabled; }; static int sdl_filter(void *arg, SDL_Event *event) { - const struct device *dev = arg; - struct sdl_data *data = dev->data; + struct sdl_data *data = arg; uint32_t row = 0; uint32_t column = 0; bool pressed = 0; @@ -47,7 +47,7 @@ static int sdl_filter(void *arg, SDL_Event *event) } if (data->enabled && data->callback) { - data->callback(dev, row, column, pressed); + data->callback(data->dev, row, column, pressed); } return 1; } @@ -87,8 +87,12 @@ static int sdl_disable_callback(const struct device *dev) static int sdl_init(const struct device *dev) { + struct sdl_data *data = dev->driver_data; + + data->dev = dev; + LOG_INF("Init '%s' device", dev->name); - SDL_AddEventWatch(sdl_filter, dev); + SDL_AddEventWatch(sdl_filter, data); return 0; }