drivers/input/keyboard/imx_sc_key.c
Source file repositories/reference/linux-study-clean/drivers/input/keyboard/imx_sc_key.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/input/keyboard/imx_sc_key.c- Extension
.c- Size
- 4711 bytes
- Lines
- 191
- Domain
- Driver Families
- Bucket
- drivers/input
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/err.hlinux/device.hlinux/firmware/imx/sci.hlinux/init.hlinux/input.hlinux/interrupt.hlinux/jiffies.hlinux/kernel.hlinux/module.hlinux/of.hlinux/platform_device.hlinux/property.h
Detected Declarations
struct imx_key_drv_datastruct imx_sc_msg_keyfunction imx_sc_key_notifyfunction imx_sc_check_for_eventsfunction imx_sc_key_actionfunction imx_sc_key_probe
Annotated Snippet
struct imx_key_drv_data {
u32 keycode;
bool keystate; /* true: pressed, false: released */
struct delayed_work check_work;
struct input_dev *input;
struct imx_sc_ipc *key_ipc_handle;
struct notifier_block key_notifier;
};
struct imx_sc_msg_key {
struct imx_sc_rpc_msg hdr;
u32 state;
};
static int imx_sc_key_notify(struct notifier_block *nb,
unsigned long event, void *group)
{
struct imx_key_drv_data *priv =
container_of(nb,
struct imx_key_drv_data,
key_notifier);
if ((event & SC_IRQ_BUTTON) && (*(u8 *)group == SC_IRQ_GROUP_WAKE)) {
schedule_delayed_work(&priv->check_work,
msecs_to_jiffies(DEBOUNCE_TIME));
pm_wakeup_event(priv->input->dev.parent, 0);
}
return 0;
}
static void imx_sc_check_for_events(struct work_struct *work)
{
struct imx_key_drv_data *priv =
container_of(work,
struct imx_key_drv_data,
check_work.work);
struct input_dev *input = priv->input;
struct imx_sc_msg_key msg;
struct imx_sc_rpc_msg *hdr = &msg.hdr;
bool state;
int error;
hdr->ver = IMX_SC_RPC_VERSION;
hdr->svc = IMX_SC_RPC_SVC_MISC;
hdr->func = IMX_SC_MISC_FUNC_GET_BUTTON_STATUS;
hdr->size = 1;
error = imx_scu_call_rpc(priv->key_ipc_handle, &msg, true);
if (error) {
dev_err(&input->dev, "read imx sc key failed, error %d\n", error);
return;
}
/*
* The response data from SCU firmware is 4 bytes,
* but ONLY the first byte is the key state, other
* 3 bytes could be some dirty data, so we should
* ONLY take the first byte as key state.
*/
state = (bool)(msg.state & 0xff);
if (state ^ priv->keystate) {
priv->keystate = state;
input_event(input, EV_KEY, priv->keycode, state);
input_sync(input);
if (!priv->keystate)
pm_relax(priv->input->dev.parent);
}
if (state)
schedule_delayed_work(&priv->check_work,
msecs_to_jiffies(REPEAT_INTERVAL));
}
static void imx_sc_key_action(void *data)
{
struct imx_key_drv_data *priv = data;
imx_scu_irq_group_enable(SC_IRQ_GROUP_WAKE, SC_IRQ_BUTTON, false);
imx_scu_irq_unregister_notifier(&priv->key_notifier);
cancel_delayed_work_sync(&priv->check_work);
}
static int imx_sc_key_probe(struct platform_device *pdev)
{
struct imx_key_drv_data *priv;
struct input_dev *input;
int error;
Annotation
- Immediate include surface: `linux/err.h`, `linux/device.h`, `linux/firmware/imx/sci.h`, `linux/init.h`, `linux/input.h`, `linux/interrupt.h`, `linux/jiffies.h`, `linux/kernel.h`.
- Detected declarations: `struct imx_key_drv_data`, `struct imx_sc_msg_key`, `function imx_sc_key_notify`, `function imx_sc_check_for_events`, `function imx_sc_key_action`, `function imx_sc_key_probe`.
- Atlas domain: Driver Families / drivers/input.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.