xref: /netbsd-src/sys/arch/luna68k/dev/xpcmd.c (revision 8b8575d933fe91428231bb68e1efabe962f2b668)
1*8b8575d9Stsutsui /*	$NetBSD: xpcmd.c,v 1.1 2022/06/10 21:42:23 tsutsui Exp $	*/
2*8b8575d9Stsutsui 
3*8b8575d9Stsutsui /*
4*8b8575d9Stsutsui  * Copyright (c) 2018 Yosuke Sugahara. All rights reserved.
5*8b8575d9Stsutsui  *
6*8b8575d9Stsutsui  * Redistribution and use in source and binary forms, with or without
7*8b8575d9Stsutsui  * modification, are permitted provided that the following conditions
8*8b8575d9Stsutsui  * are met:
9*8b8575d9Stsutsui  * 1. Redistributions of source code must retain the above copyright
10*8b8575d9Stsutsui  *    notice, this list of conditions and the following disclaimer.
11*8b8575d9Stsutsui  * 2. Redistributions in binary form must reproduce the above copyright
12*8b8575d9Stsutsui  *    notice, this list of conditions and the following disclaimer in the
13*8b8575d9Stsutsui  *    documentation and/or other materials provided with the distribution.
14*8b8575d9Stsutsui  *
15*8b8575d9Stsutsui  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16*8b8575d9Stsutsui  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17*8b8575d9Stsutsui  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18*8b8575d9Stsutsui  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19*8b8575d9Stsutsui  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
20*8b8575d9Stsutsui  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21*8b8575d9Stsutsui  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
22*8b8575d9Stsutsui  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
23*8b8575d9Stsutsui  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24*8b8575d9Stsutsui  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25*8b8575d9Stsutsui  * SUCH DAMAGE.
26*8b8575d9Stsutsui  */
27*8b8575d9Stsutsui 
28*8b8575d9Stsutsui #include <sys/types.h>
29*8b8575d9Stsutsui 
30*8b8575d9Stsutsui #if defined(_KERNEL)
31*8b8575d9Stsutsui 
32*8b8575d9Stsutsui #include <sys/param.h>
33*8b8575d9Stsutsui 
34*8b8575d9Stsutsui #include <luna68k/dev/xpbusvar.h>
35*8b8575d9Stsutsui #include <luna68k/dev/xpcmd.h>
36*8b8575d9Stsutsui #include <luna68k/dev/xplx/xplxdefs.h>
37*8b8575d9Stsutsui #else
38*8b8575d9Stsutsui 
39*8b8575d9Stsutsui #include <stdint.h>
40*8b8575d9Stsutsui #include "xpbusvar.h"
41*8b8575d9Stsutsui #include "xpcmd.h"
42*8b8575d9Stsutsui #include "xplx/xplxdefs.h"
43*8b8575d9Stsutsui 
44*8b8575d9Stsutsui #endif
45*8b8575d9Stsutsui 
46*8b8575d9Stsutsui enum {
47*8b8575d9Stsutsui 	READY = 0,
48*8b8575d9Stsutsui 	CMD = 1,
49*8b8575d9Stsutsui 	RESULT = 2,
50*8b8575d9Stsutsui };
51*8b8575d9Stsutsui 
52*8b8575d9Stsutsui static int
xp_waitfor_ready(int xplx_devid,int timeout)53*8b8575d9Stsutsui xp_waitfor_ready(int xplx_devid, int timeout)
54*8b8575d9Stsutsui {
55*8b8575d9Stsutsui 	uint16_t addr = XPLX_VAR_BASE + xplx_devid * 16;
56*8b8575d9Stsutsui 
57*8b8575d9Stsutsui 	do {
58*8b8575d9Stsutsui 		int r;
59*8b8575d9Stsutsui 		r = xp_readmem8(addr + READY);
60*8b8575d9Stsutsui 		if (r)
61*8b8575d9Stsutsui 			return 1;
62*8b8575d9Stsutsui 		delay(100);
63*8b8575d9Stsutsui 	} while (timeout--);
64*8b8575d9Stsutsui 	return 0;
65*8b8575d9Stsutsui }
66*8b8575d9Stsutsui 
67*8b8575d9Stsutsui int
xp_cmd_nowait(int xplx_devid,uint8_t cmd)68*8b8575d9Stsutsui xp_cmd_nowait(int xplx_devid, uint8_t cmd)
69*8b8575d9Stsutsui {
70*8b8575d9Stsutsui 	uint8_t r;
71*8b8575d9Stsutsui 
72*8b8575d9Stsutsui 	uint16_t addr = XPLX_VAR_BASE + xplx_devid * 16;
73*8b8575d9Stsutsui 	r = xp_waitfor_ready(xplx_devid, 1000);
74*8b8575d9Stsutsui 	if (r == 0)
75*8b8575d9Stsutsui 		return 0;
76*8b8575d9Stsutsui 	xp_writemem8(addr + RESULT, 0);
77*8b8575d9Stsutsui 	xp_writemem8(addr + CMD, cmd);
78*8b8575d9Stsutsui 	return XPLX_R_OK;
79*8b8575d9Stsutsui }
80*8b8575d9Stsutsui 
81*8b8575d9Stsutsui int
xp_cmd(int xplx_devid,uint8_t cmd)82*8b8575d9Stsutsui xp_cmd(int xplx_devid, uint8_t cmd)
83*8b8575d9Stsutsui {
84*8b8575d9Stsutsui 	uint8_t rv;
85*8b8575d9Stsutsui 	uint8_t r;
86*8b8575d9Stsutsui 	uint16_t addr = XPLX_VAR_BASE + xplx_devid * 16;
87*8b8575d9Stsutsui 
88*8b8575d9Stsutsui 	r = xp_waitfor_ready(xplx_devid, 1000);
89*8b8575d9Stsutsui 	if (r == 0)
90*8b8575d9Stsutsui 		return 0;
91*8b8575d9Stsutsui 	xp_writemem8(addr + RESULT, 0);
92*8b8575d9Stsutsui 	xp_writemem8(addr + CMD, cmd);
93*8b8575d9Stsutsui 	while ((rv = xp_readmem8(addr + RESULT)) == 0)
94*8b8575d9Stsutsui 		continue;
95*8b8575d9Stsutsui 	return rv;
96*8b8575d9Stsutsui }
97