Module Name:    src
Committed By:   jmcneill
Date:           Sat Feb 10 11:00:16 UTC 2024

Modified Files:
        src/sys/arch/evbppc/wii/dev: exi.c exi.h rtcsram.c

Log Message:
wii: Explicitly set EXI frequency when selecting a device.


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/evbppc/wii/dev/exi.c \
    src/sys/arch/evbppc/wii/dev/exi.h src/sys/arch/evbppc/wii/dev/rtcsram.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/evbppc/wii/dev/exi.c
diff -u src/sys/arch/evbppc/wii/dev/exi.c:1.1 src/sys/arch/evbppc/wii/dev/exi.c:1.2
--- src/sys/arch/evbppc/wii/dev/exi.c:1.1	Thu Jan 25 11:47:53 2024
+++ src/sys/arch/evbppc/wii/dev/exi.c	Sat Feb 10 11:00:15 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: exi.c,v 1.1 2024/01/25 11:47:53 jmcneill Exp $ */
+/* $NetBSD: exi.c,v 1.2 2024/02/10 11:00:15 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2024 Jared McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: exi.c,v 1.1 2024/01/25 11:47:53 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: exi.c,v 1.2 2024/02/10 11:00:15 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -52,6 +52,7 @@ __KERNEL_RCSID(0, "$NetBSD: exi.c,v 1.1 
 
 #define	EXI_CSR(n)		(0x00 + (n) * 0x14)
 #define	 EXI_CSR_CS		__BITS(9,7)
+#define	 EXI_CSR_CLK		__BITS(6,4)
 #define	EXI_MAR(n)		(0x04 + (n) * 0x14)
 #define	EXI_LENGTH(n)		(0x08 + (n) * 0x14)
 #define	EXI_CR(n)		(0x0c + (n) * 0x14)
@@ -162,7 +163,7 @@ exi_rescan(device_t self, const char *if
 				continue;
 			}
 
-			exi_select(chan, dev);
+			exi_select(chan, dev, EXI_FREQ_8MHZ);
 			exi_send_imm(chan, dev, &command, sizeof(command));
 			exi_recv_imm(chan, dev, &id, sizeof(id));
 			exi_unselect(chan);
@@ -199,7 +200,7 @@ exi_print(void *aux, const char *pnp)
 }
 
 void
-exi_select(uint8_t chan, uint8_t dev)
+exi_select(uint8_t chan, uint8_t dev, exi_freq_t freq)
 {
 	struct exi_channel *ch;
 	uint32_t val;
@@ -213,6 +214,8 @@ exi_select(uint8_t chan, uint8_t dev)
 	val = RD4(exi_softc, EXI_CSR(chan));
 	val &= ~EXI_CSR_CS;
 	val |= __SHIFTIN(__BIT(dev), EXI_CSR_CS);
+	val &= ~EXI_CSR_CLK;
+	val |= __SHIFTIN(freq, EXI_CSR_CLK);
 	WR4(exi_softc, EXI_CSR(chan), val);
 }
 
Index: src/sys/arch/evbppc/wii/dev/exi.h
diff -u src/sys/arch/evbppc/wii/dev/exi.h:1.1 src/sys/arch/evbppc/wii/dev/exi.h:1.2
--- src/sys/arch/evbppc/wii/dev/exi.h:1.1	Thu Jan 25 11:47:53 2024
+++ src/sys/arch/evbppc/wii/dev/exi.h	Sat Feb 10 11:00:15 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: exi.h,v 1.1 2024/01/25 11:47:53 jmcneill Exp $ */
+/* $NetBSD: exi.h,v 1.2 2024/02/10 11:00:15 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2024 Jared McNeill <jmcne...@invisible.ca>
@@ -29,13 +29,22 @@
 #ifndef _WII_DEV_EXI_H_
 #define _WII_DEV_EXI_H_
 
+typedef enum {
+	EXI_FREQ_1MHZ = 0,
+	EXI_FREQ_2MHZ = 1,
+	EXI_FREQ_4MHZ = 2,
+	EXI_FREQ_8MHZ = 3,
+	EXI_FREQ_16MHZ = 4,
+	EXI_FREQ_32MHZ = 5,
+} exi_freq_t;
+
 struct exi_attach_args {
 	uint32_t	eaa_id;
 	uint8_t		eaa_chan;
 	uint8_t		eaa_device;
 };
 
-void exi_select(uint8_t, uint8_t);
+void exi_select(uint8_t, uint8_t, exi_freq_t);
 void exi_unselect(uint8_t);
 void exi_send_imm(uint8_t, uint8_t, const void *, size_t);
 void exi_recv_imm(uint8_t, uint8_t, void *, size_t);
Index: src/sys/arch/evbppc/wii/dev/rtcsram.c
diff -u src/sys/arch/evbppc/wii/dev/rtcsram.c:1.1 src/sys/arch/evbppc/wii/dev/rtcsram.c:1.2
--- src/sys/arch/evbppc/wii/dev/rtcsram.c:1.1	Thu Jan 25 11:47:53 2024
+++ src/sys/arch/evbppc/wii/dev/rtcsram.c	Sat Feb 10 11:00:15 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: rtcsram.c,v 1.1 2024/01/25 11:47:53 jmcneill Exp $ */
+/* $NetBSD: rtcsram.c,v 1.2 2024/02/10 11:00:15 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2024 Jared McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rtcsram.c,v 1.1 2024/01/25 11:47:53 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtcsram.c,v 1.2 2024/02/10 11:00:15 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -40,6 +40,7 @@ __KERNEL_RCSID(0, "$NetBSD: rtcsram.c,v 
 #include "exi.h"
 
 #define	WII_RTCSRAM_ID		0xfffff308
+#define	WII_RTCSRAM_FREQ	EXI_FREQ_8MHZ
 
 #define	RTC_BASE		0x20000000
 #define	SRAM_BASE		0x20000100
@@ -124,7 +125,7 @@ rtcsram_read_4(struct rtcsram_softc *sc,
 {
 	uint32_t val;
 
-	exi_select(sc->sc_chan, sc->sc_device);
+	exi_select(sc->sc_chan, sc->sc_device, WII_RTCSRAM_FREQ);
 	exi_send_imm(sc->sc_chan, sc->sc_device, &offset, sizeof(offset));
 	exi_recv_imm(sc->sc_chan, sc->sc_device, &val, sizeof(val));
 	exi_unselect(sc->sc_chan);
@@ -137,7 +138,7 @@ rtcsram_write_4(struct rtcsram_softc *sc
 {
 	offset |= WRITE_OFFSET;
 
-	exi_select(sc->sc_chan, sc->sc_device);
+	exi_select(sc->sc_chan, sc->sc_device, WII_RTCSRAM_FREQ);
 	exi_send_imm(sc->sc_chan, sc->sc_device, &offset, sizeof(offset));
 	exi_send_imm(sc->sc_chan, sc->sc_device, &val, sizeof(val));
 	exi_unselect(sc->sc_chan);
@@ -147,7 +148,7 @@ static void
 rtcsram_read_buf(struct rtcsram_softc *sc, uint32_t offset, void *data,
     size_t datalen)
 {
-	exi_select(sc->sc_chan, sc->sc_device);
+	exi_select(sc->sc_chan, sc->sc_device, WII_RTCSRAM_FREQ);
 	exi_send_imm(sc->sc_chan, sc->sc_device, &offset, sizeof(offset));
 	exi_recv_dma(sc->sc_chan, sc->sc_device, data, datalen);
 	exi_unselect(sc->sc_chan);

Reply via email to