162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci#ifndef _I8042_IO_H
362306a36Sopenharmony_ci#define _I8042_IO_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci/*
762306a36Sopenharmony_ci * Names.
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#define I8042_KBD_PHYS_DESC "isa0060/serio0"
1162306a36Sopenharmony_ci#define I8042_AUX_PHYS_DESC "isa0060/serio1"
1262306a36Sopenharmony_ci#define I8042_MUX_PHYS_DESC "isa0060/serio%d"
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci/*
1562306a36Sopenharmony_ci * IRQs.
1662306a36Sopenharmony_ci */
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#ifdef __alpha__
1962306a36Sopenharmony_ci# define I8042_KBD_IRQ	1
2062306a36Sopenharmony_ci# define I8042_AUX_IRQ	(RTC_PORT(0) == 0x170 ? 9 : 12)	/* Jensen is special */
2162306a36Sopenharmony_ci#elif defined(__arm__)
2262306a36Sopenharmony_ci/* defined in include/asm-arm/arch-xxx/irqs.h */
2362306a36Sopenharmony_ci#include <asm/irq.h>
2462306a36Sopenharmony_ci#elif defined(CONFIG_PPC)
2562306a36Sopenharmony_ciextern int of_i8042_kbd_irq;
2662306a36Sopenharmony_ciextern int of_i8042_aux_irq;
2762306a36Sopenharmony_ci# define I8042_KBD_IRQ  of_i8042_kbd_irq
2862306a36Sopenharmony_ci# define I8042_AUX_IRQ  of_i8042_aux_irq
2962306a36Sopenharmony_ci#else
3062306a36Sopenharmony_ci# define I8042_KBD_IRQ	1
3162306a36Sopenharmony_ci# define I8042_AUX_IRQ	12
3262306a36Sopenharmony_ci#endif
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci/*
3662306a36Sopenharmony_ci * Register numbers.
3762306a36Sopenharmony_ci */
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci#define I8042_COMMAND_REG	0x64
4062306a36Sopenharmony_ci#define I8042_STATUS_REG	0x64
4162306a36Sopenharmony_ci#define I8042_DATA_REG		0x60
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_cistatic inline int i8042_read_data(void)
4462306a36Sopenharmony_ci{
4562306a36Sopenharmony_ci	return inb(I8042_DATA_REG);
4662306a36Sopenharmony_ci}
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cistatic inline int i8042_read_status(void)
4962306a36Sopenharmony_ci{
5062306a36Sopenharmony_ci	return inb(I8042_STATUS_REG);
5162306a36Sopenharmony_ci}
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cistatic inline void i8042_write_data(int val)
5462306a36Sopenharmony_ci{
5562306a36Sopenharmony_ci	outb(val, I8042_DATA_REG);
5662306a36Sopenharmony_ci}
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_cistatic inline void i8042_write_command(int val)
5962306a36Sopenharmony_ci{
6062306a36Sopenharmony_ci	outb(val, I8042_COMMAND_REG);
6162306a36Sopenharmony_ci}
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cistatic inline int i8042_platform_init(void)
6462306a36Sopenharmony_ci{
6562306a36Sopenharmony_ci/*
6662306a36Sopenharmony_ci * On some platforms touching the i8042 data register region can do really
6762306a36Sopenharmony_ci * bad things. Because of this the region is always reserved on such boxes.
6862306a36Sopenharmony_ci */
6962306a36Sopenharmony_ci#if defined(CONFIG_PPC)
7062306a36Sopenharmony_ci	if (check_legacy_ioport(I8042_DATA_REG))
7162306a36Sopenharmony_ci		return -ENODEV;
7262306a36Sopenharmony_ci#endif
7362306a36Sopenharmony_ci#if !defined(__sh__) && !defined(__alpha__)
7462306a36Sopenharmony_ci	if (!request_region(I8042_DATA_REG, 16, "i8042"))
7562306a36Sopenharmony_ci		return -EBUSY;
7662306a36Sopenharmony_ci#endif
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci	i8042_reset = I8042_RESET_ALWAYS;
7962306a36Sopenharmony_ci	return 0;
8062306a36Sopenharmony_ci}
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_cistatic inline void i8042_platform_exit(void)
8362306a36Sopenharmony_ci{
8462306a36Sopenharmony_ci#if !defined(__sh__) && !defined(__alpha__)
8562306a36Sopenharmony_ci	release_region(I8042_DATA_REG, 16);
8662306a36Sopenharmony_ci#endif
8762306a36Sopenharmony_ci}
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci#endif /* _I8042_IO_H */
90