Module Name: src
Committed By: skrll
Date: Tue Oct 30 20:14:22 UTC 2012
Modified Files:
src/sys/arch/arm/broadcom: bcm2835_emmc.c
src/sys/arch/evbarm/rpi: rpi_machdep.c
Log Message:
Query the EMMC clock rate and use it if it's available.
To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/broadcom/bcm2835_emmc.c
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/evbarm/rpi/rpi_machdep.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/arm/broadcom/bcm2835_emmc.c
diff -u src/sys/arch/arm/broadcom/bcm2835_emmc.c:1.1 src/sys/arch/arm/broadcom/bcm2835_emmc.c:1.2
--- src/sys/arch/arm/broadcom/bcm2835_emmc.c:1.1 Thu Jul 26 06:21:57 2012
+++ src/sys/arch/arm/broadcom/bcm2835_emmc.c Tue Oct 30 20:14:22 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: bcm2835_emmc.c,v 1.1 2012/07/26 06:21:57 skrll Exp $ */
+/* $NetBSD: bcm2835_emmc.c,v 1.2 2012/10/30 20:14:22 skrll Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bcm2835_emmc.c,v 1.1 2012/07/26 06:21:57 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bcm2835_emmc.c,v 1.2 2012/10/30 20:14:22 skrll Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -77,7 +77,9 @@ static void
bcmemmc_attach(device_t parent, device_t self, void *aux)
{
struct bcmemmc_softc *sc = device_private(self);
+ prop_dictionary_t dict = device_properties(self);
struct amba_attach_args *aaa = aux;
+ prop_number_t frequency;
int error;
sc->sc.sc_dev = self;
@@ -88,9 +90,15 @@ bcmemmc_attach(device_t parent, device_t
sc->sc.sc_flags |= SDHC_FLAG_HOSTCAPS;
sc->sc.sc_caps = SDHC_VOLTAGE_SUPP_3_3V;
sc->sc.sc_host = sc->sc_hosts;
- sc->sc.sc_clkbase = 50000; /* 50MHz */
+ sc->sc.sc_clkbase = 50000; /* Default to 50MHz */
sc->sc_iot = aaa->aaa_iot;
+ /* Fetch the EMMC clock frequency from property if set. */
+ frequency = prop_dictionary_get(dict, "frequency");
+ if (frequency != NULL) {
+ sc->sc.sc_clkbase = prop_number_integer_value(frequency) / 1000;
+ }
+
error = bus_space_map(sc->sc_iot, aaa->aaa_addr, aaa->aaa_size, 0,
&sc->sc_ioh);
if (error) {
Index: src/sys/arch/evbarm/rpi/rpi_machdep.c
diff -u src/sys/arch/evbarm/rpi/rpi_machdep.c:1.17 src/sys/arch/evbarm/rpi/rpi_machdep.c:1.18
--- src/sys/arch/evbarm/rpi/rpi_machdep.c:1.17 Tue Oct 30 20:02:15 2012
+++ src/sys/arch/evbarm/rpi/rpi_machdep.c Tue Oct 30 20:14:22 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: rpi_machdep.c,v 1.17 2012/10/30 20:02:15 skrll Exp $ */
+/* $NetBSD: rpi_machdep.c,v 1.18 2012/10/30 20:14:22 skrll Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rpi_machdep.c,v 1.17 2012/10/30 20:02:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rpi_machdep.c,v 1.18 2012/10/30 20:14:22 skrll Exp $");
#include "opt_evbarm_boardtype.h"
@@ -39,12 +39,15 @@ __KERNEL_RCSID(0, "$NetBSD: rpi_machdep.
#include <sys/termios.h>
#include <sys/bus.h>
+#include <prop/proplib.h>
+
#include <dev/cons.h>
#include <uvm/uvm_extern.h>
#include <arm/arm32/machdep.h>
+#include <machine/autoconf.h>
#include <machine/vmparam.h>
#include <machine/bootconfig.h>
#include <machine/pmap.h>
@@ -75,6 +78,7 @@ static char bootargs[MAX_BOOT_STRING];
char *boot_args = NULL;
static void rpi_bootparams(void);
+static void rpi_device_register(device_t, void *);
/*
* Macros to translate between physical and virtual for a subset of the
@@ -125,6 +129,7 @@ static struct {
struct vcprop_tag_memory vbt_memory;
struct vcprop_tag_boardserial vbt_serial;
struct vcprop_tag_cmdline vbt_cmdline;
+ struct vcprop_tag_clockrate vbt_emmcclockrate;
struct vcprop_tag end;
} vb __packed __aligned(16) =
{
@@ -181,6 +186,14 @@ static struct {
.vpt_rcode = VCPROPTAG_REQUEST
},
},
+ .vbt_emmcclockrate = {
+ .tag = {
+ .vpt_tag = VCPROPTAG_GET_CLOCKRATE,
+ .vpt_len = VCPROPTAG_LEN(vb.vbt_emmcclockrate),
+ .vpt_rcode = VCPROPTAG_REQUEST
+ },
+ .id = VCPROP_CLK_EMMC
+ },
.end = {
.vpt_tag = VCPROPTAG_NULL
}
@@ -344,6 +357,9 @@ initarm(void *arg)
boothowto |= BOOTHOWTO;
#endif
+ /* we've a specific device_register routine */
+ evbarm_device_register = rpi_device_register;
+
return initarm_common(KERNEL_VM_BASE, KERNEL_VM_SIZE, NULL, 0);
}
@@ -377,3 +393,15 @@ consinit(void)
#endif
}
+
+static void
+rpi_device_register(device_t dev, void *aux)
+{
+ prop_dictionary_t dict = device_properties(dev);
+
+ if (device_is_a(dev, "sdhc") &&
+ vcprop_tag_success_p(&vb.vbt_emmcclockrate.tag)) {
+ prop_dictionary_set_uint32(dict,
+ "frequency", vb.vbt_emmcclockrate.rate);
+ }
+}