summaryrefslogtreecommitdiff
path: root/sys/dev/ic
diff options
context:
space:
mode:
authorjdc <jdc@NetBSD.org>2020-05-11 14:55:20 +0000
committerjdc <jdc@NetBSD.org>2020-05-11 14:55:20 +0000
commit96a7de30c93e682121e3bf8b3ddda241b2ac5bf3 (patch)
treea643ae26245bafe68c46a4c6cee3dfd064af4535 /sys/dev/ic
parent8ed9e2355e8809d34223499e6db93fe9379b38a9 (diff)
Make the driver endian-independent.
Add a quirk so that the bus front end can specify 1-bit only mode. Remove unused isa includes. Change the error returned for unsupported opcodes to ENOTSUP, so that we can pass this back to sdmmc_mem, where it's handled since r1.72 of src/sys/dev/sdmmc/sdmmc_mem.c
Diffstat (limited to 'sys/dev/ic')
-rw-r--r--sys/dev/ic/w83l518d.c7
-rw-r--r--sys/dev/ic/w83l518d_sdmmc.c39
-rw-r--r--sys/dev/ic/w83l518dvar.h6
3 files changed, 36 insertions, 16 deletions
diff --git a/sys/dev/ic/w83l518d.c b/sys/dev/ic/w83l518d.c
index 05c696c5603..ffe5ccac48b 100644
--- a/sys/dev/ic/w83l518d.c
+++ b/sys/dev/ic/w83l518d.c
@@ -1,4 +1,4 @@
-/* $NetBSD: w83l518d.c,v 1.2 2010/08/19 14:58:22 jmcneill Exp $ */
+/* $NetBSD: w83l518d.c,v 1.3 2020/05/11 14:55:20 jdc Exp $ */
/*
* Copyright (c) 2009 Jared D. McNeill <jmcneill@invisible.ca>
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: w83l518d.c,v 1.2 2010/08/19 14:58:22 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: w83l518d.c,v 1.3 2020/05/11 14:55:20 jdc Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -39,9 +39,6 @@ __KERNEL_RCSID(0, "$NetBSD: w83l518d.c,v 1.2 2010/08/19 14:58:22 jmcneill Exp $"
#include <sys/bus.h>
-#include <dev/isa/isavar.h>
-#include <dev/isa/isadmavar.h>
-
#include <dev/ic/w83l518dreg.h>
#include <dev/ic/w83l518dvar.h>
#include <dev/ic/w83l518d_sdmmc.h>
diff --git a/sys/dev/ic/w83l518d_sdmmc.c b/sys/dev/ic/w83l518d_sdmmc.c
index 2e11535e47d..f559cc30206 100644
--- a/sys/dev/ic/w83l518d_sdmmc.c
+++ b/sys/dev/ic/w83l518d_sdmmc.c
@@ -1,4 +1,4 @@
-/* $NetBSD: w83l518d_sdmmc.c,v 1.3 2010/10/07 12:06:09 kiyohara Exp $ */
+/* $NetBSD: w83l518d_sdmmc.c,v 1.4 2020/05/11 14:55:20 jdc Exp $ */
/*
* Copyright (c) 2009 Jared D. McNeill <jmcneill@invisible.ca>
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: w83l518d_sdmmc.c,v 1.3 2010/10/07 12:06:09 kiyohara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: w83l518d_sdmmc.c,v 1.4 2020/05/11 14:55:20 jdc Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -43,9 +43,6 @@ __KERNEL_RCSID(0, "$NetBSD: w83l518d_sdmmc.c,v 1.3 2010/10/07 12:06:09 kiyohara
#include <dev/sdmmc/sdmmcchip.h>
#include <dev/sdmmc/sdmmc_ioreg.h>
-#include <dev/isa/isavar.h>
-#include <dev/isa/isadmavar.h>
-
#include <dev/ic/w83l518dreg.h>
#include <dev/ic/w83l518dvar.h>
#include <dev/ic/w83l518d_sdmmc.h>
@@ -185,7 +182,8 @@ wb_sdmmc_attach(struct wb_softc *wb)
saa.saa_sch = wb;
saa.saa_clkmin = 375;
saa.saa_clkmax = 24000;
- saa.saa_caps = SMC_CAPS_4BIT_MODE;
+ if (!ISSET(wb->wb_quirks, WB_QUIRK_1BIT))
+ saa.saa_caps = SMC_CAPS_4BIT_MODE;
wb->wb_sdmmc_dev = config_found(wb->wb_dev, &saa, NULL);
}
@@ -268,7 +266,7 @@ wb_sdmmc_write_protect(sdmmc_chipset_handle_t sch)
static int
wb_sdmmc_bus_power(sdmmc_chipset_handle_t sch, uint32_t ocr)
{
- REPORT(sch, "TRACE: sdmmc/bus_power(wb, ocr=%d)\n", ocr);
+ REPORT(sch, "TRACE: sdmmc/bus_power(wb, ocr=%x)\n", ocr);
return 0;
}
@@ -334,10 +332,19 @@ wb_sdmmc_rsp_read_long(struct wb_softc *wb, struct sdmmc_command *cmd)
}
for (i = 12; i >= 0; i -= 4) {
+#if BYTE_ORDER == LITTLE_ENDIAN
p[3] = wb_idx_read(wb, WB_INDEX_RESP(i + 0));
p[2] = wb_idx_read(wb, WB_INDEX_RESP(i + 1));
p[1] = wb_idx_read(wb, WB_INDEX_RESP(i + 2));
p[0] = wb_idx_read(wb, WB_INDEX_RESP(i + 3));
+#else
+ p[0] = wb_idx_read(wb, WB_INDEX_RESP(i + 0));
+ p[1] = wb_idx_read(wb, WB_INDEX_RESP(i + 1));
+ p[2] = wb_idx_read(wb, WB_INDEX_RESP(i + 2));
+ p[3] = wb_idx_read(wb, WB_INDEX_RESP(i + 3));
+#endif
+ REPORT(wb, "TRACE: sdmmc/read_long (%d) 0x%08x\n",
+ (12 - i) / 4, cmd->c_resp[(12 - i) / 4]);
p += 4;
}
}
@@ -352,10 +359,19 @@ wb_sdmmc_rsp_read_short(struct wb_softc *wb, struct sdmmc_command *cmd)
return;
}
+#if BYTE_ORDER == LITTLE_ENDIAN
p[3] = wb_idx_read(wb, WB_INDEX_RESP(12));
p[2] = wb_idx_read(wb, WB_INDEX_RESP(13));
p[1] = wb_idx_read(wb, WB_INDEX_RESP(14));
p[0] = wb_idx_read(wb, WB_INDEX_RESP(15));
+#else
+ p[0] = wb_idx_read(wb, WB_INDEX_RESP(12));
+ p[1] = wb_idx_read(wb, WB_INDEX_RESP(13));
+ p[2] = wb_idx_read(wb, WB_INDEX_RESP(14));
+ p[3] = wb_idx_read(wb, WB_INDEX_RESP(15));
+#endif
+ REPORT(wb, "TRACE: sdmmc/read_short 0x%08x\n",
+ cmd->c_resp[0]);
}
static int
@@ -430,8 +446,9 @@ wb_sdmmc_exec_command(sdmmc_chipset_handle_t sch, struct sdmmc_command *cmd)
int s;
REPORT(wb, "TRACE: sdmmc/exec_command(wb, cmd) "
- "opcode %d flags 0x%x data %p datalen %d\n",
- cmd->c_opcode, cmd->c_flags, cmd->c_data, cmd->c_datalen);
+ "opcode %d flags 0x%x data %p datalen %d arg 0x%08x\n",
+ cmd->c_opcode, cmd->c_flags, cmd->c_data, cmd->c_datalen,
+ cmd->c_arg);
if (cmd->c_datalen > 0) {
/* controller only supports a select number of data opcodes */
@@ -439,7 +456,9 @@ wb_sdmmc_exec_command(sdmmc_chipset_handle_t sch, struct sdmmc_command *cmd)
if (opcodes[i] == cmd->c_opcode)
break;
if (i == __arraycount(opcodes)) {
- cmd->c_error = EINVAL;
+ cmd->c_error = ENOTSUP;
+ aprint_debug_dev(wb->wb_dev,
+ "unsupported opcode %d\n", cmd->c_opcode);
goto done;
}
diff --git a/sys/dev/ic/w83l518dvar.h b/sys/dev/ic/w83l518dvar.h
index 54427f0d4a7..32a4639e9a8 100644
--- a/sys/dev/ic/w83l518dvar.h
+++ b/sys/dev/ic/w83l518dvar.h
@@ -1,4 +1,4 @@
-/* $NetBSD: w83l518dvar.h,v 1.2 2010/08/19 14:58:22 jmcneill Exp $ */
+/* $NetBSD: w83l518dvar.h,v 1.3 2020/05/11 14:55:20 jdc Exp $ */
/*
* Copyright (c) 2009 Jared D. McNeill <jmcneill@invisible.ca>
@@ -44,6 +44,10 @@ struct wb_softc {
uint8_t wb_sdmmc_clk;
uint8_t wb_sdmmc_intsts;
callout_t wb_sdmmc_callout;
+
+ /* quirks */
+#define WB_QUIRK_1BIT (1U << 0)
+ int wb_quirks;
};
void wb_attach(struct wb_softc *);