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 <[email protected]>
@@ -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 <[email protected]>
@@ -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 <[email protected]>
@@ -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);