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);