drivers/input/serio/i8042-acpipnpio.h

Source file repositories/reference/linux-study-clean/drivers/input/serio/i8042-acpipnpio.h

File Facts

System
Linux kernel
Corpus path
drivers/input/serio/i8042-acpipnpio.h
Extension
.h
Size
47949 bytes
Lines
1856
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.

Dependency Surface

Detected Declarations

Annotated Snippet

if (!pnp_data_busted && i8042_pnp_kbd_irq) {
			pr_warn("PNP: PS/2 appears to have AUX port disabled, "
				"if this is incorrect please boot with i8042.nopnp\n");
			i8042_noaux = true;
		} else {
			pr_warn("PNP: PS/2 controller doesn't have AUX irq; using default %d\n",
				i8042_aux_irq);
			i8042_pnp_aux_irq = i8042_aux_irq;
		}
	}

	i8042_data_reg = i8042_pnp_data_reg;
	i8042_command_reg = i8042_pnp_command_reg;
	i8042_kbd_irq = i8042_pnp_kbd_irq;
	i8042_aux_irq = i8042_pnp_aux_irq;

#ifdef CONFIG_X86
	i8042_bypass_aux_irq_test = !pnp_data_busted &&
				    dmi_check_system(i8042_dmi_laptop_table);
#endif

	return 0;
}

#else  /* !CONFIG_PNP */
static inline int i8042_pnp_init(void) { return 0; }
static inline void i8042_pnp_exit(void) { }
#endif /* CONFIG_PNP */


#ifdef CONFIG_X86
static void __init i8042_check_quirks(void)
{
	const struct dmi_system_id *device_quirk_info;
	uintptr_t quirks;

	device_quirk_info = dmi_first_match(i8042_dmi_quirk_table);
	if (!device_quirk_info)
		return;

	quirks = (uintptr_t)device_quirk_info->driver_data;

	if (quirks & SERIO_QUIRK_NOKBD)
		i8042_nokbd = true;
	if (quirks & SERIO_QUIRK_NOAUX)
		i8042_noaux = true;
	if (quirks & SERIO_QUIRK_NOMUX)
		i8042_nomux = true;
	if (quirks & SERIO_QUIRK_FORCEMUX)
		i8042_nomux = false;
	if (quirks & SERIO_QUIRK_UNLOCK)
		i8042_unlock = true;
	if (quirks & SERIO_QUIRK_PROBE_DEFER)
		i8042_probe_defer = true;
	/* Honor module parameter when value is not default */
	if (i8042_reset == I8042_RESET_DEFAULT) {
		if (quirks & SERIO_QUIRK_RESET_ALWAYS)
			i8042_reset = I8042_RESET_ALWAYS;
		if (quirks & SERIO_QUIRK_RESET_NEVER)
			i8042_reset = I8042_RESET_NEVER;
	}
	if (quirks & SERIO_QUIRK_DIRECT)
		i8042_direct = true;
	if (quirks & SERIO_QUIRK_DUMBKBD)
		i8042_dumbkbd = true;
	if (quirks & SERIO_QUIRK_NOLOOP)
		i8042_noloop = true;
	if (quirks & SERIO_QUIRK_NOTIMEOUT)
		i8042_notimeout = true;
	if (quirks & SERIO_QUIRK_KBDRESET)
		i8042_kbdreset = true;
	if (quirks & SERIO_QUIRK_DRITEK)
		i8042_dritek = true;
#ifdef CONFIG_PNP
	if (quirks & SERIO_QUIRK_NOPNP)
		i8042_nopnp = true;
#endif
	if (quirks & SERIO_QUIRK_FORCENORESTORE)
		i8042_forcenorestore = true;
}
#else
static inline void i8042_check_quirks(void) {}
#endif

static int __init i8042_platform_init(void)
{
	int retval;

#ifdef CONFIG_X86
	u8 a20_on = 0xdf;

Annotation

Implementation Notes