xref: /kernel/linux/linux-6.6/arch/mips/jazz/reset.c (revision 62306a36)
162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Reset a Jazz machine.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * We don't trust the firmware so we do it the classic way by poking and
662306a36Sopenharmony_ci * stabbing at the keyboard controller ...
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci#include <linux/jiffies.h>
962306a36Sopenharmony_ci#include <asm/jazz.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#define KBD_STAT_IBF		0x02	/* Keyboard input buffer full */
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_cistatic void jazz_write_output(unsigned char val)
1462306a36Sopenharmony_ci{
1562306a36Sopenharmony_ci	int status;
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci	do {
1862306a36Sopenharmony_ci		status = jazz_kh->command;
1962306a36Sopenharmony_ci	} while (status & KBD_STAT_IBF);
2062306a36Sopenharmony_ci	jazz_kh->data = val;
2162306a36Sopenharmony_ci}
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cistatic void jazz_write_command(unsigned char val)
2462306a36Sopenharmony_ci{
2562306a36Sopenharmony_ci	int status;
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci	do {
2862306a36Sopenharmony_ci		status = jazz_kh->command;
2962306a36Sopenharmony_ci	} while (status & KBD_STAT_IBF);
3062306a36Sopenharmony_ci	jazz_kh->command = val;
3162306a36Sopenharmony_ci}
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_cistatic unsigned char jazz_read_status(void)
3462306a36Sopenharmony_ci{
3562306a36Sopenharmony_ci	return jazz_kh->command;
3662306a36Sopenharmony_ci}
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cistatic inline void kb_wait(void)
3962306a36Sopenharmony_ci{
4062306a36Sopenharmony_ci	unsigned long start = jiffies;
4162306a36Sopenharmony_ci	unsigned long timeout = start + HZ/2;
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci	do {
4462306a36Sopenharmony_ci		if (! (jazz_read_status() & 0x02))
4562306a36Sopenharmony_ci			return;
4662306a36Sopenharmony_ci	} while (time_before_eq(jiffies, timeout));
4762306a36Sopenharmony_ci}
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_civoid jazz_machine_restart(char *command)
5062306a36Sopenharmony_ci{
5162306a36Sopenharmony_ci	while(1) {
5262306a36Sopenharmony_ci		kb_wait();
5362306a36Sopenharmony_ci		jazz_write_command(0xd1);
5462306a36Sopenharmony_ci		kb_wait();
5562306a36Sopenharmony_ci		jazz_write_output(0x00);
5662306a36Sopenharmony_ci	}
5762306a36Sopenharmony_ci}
58