summaryrefslogtreecommitdiffstats
path: root/arch/arm/boards/raspberry-pi
diff options
context:
space:
mode:
authorAndre Heider <a.heider@gmail.com>2013-10-19 14:20:53 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2013-10-22 15:28:59 +0200
commita476255682c82ce4b9c790605eab75b1b5b9a9d0 (patch)
tree94d446caa35d40ef3e033aca372108a6126ee191 /arch/arm/boards/raspberry-pi
parent76cb4002af394c9179a0802f4b42edb897f7f793 (diff)
downloadbarebox-a476255682c82ce4b9c790605eab75b1b5b9a9d0.tar.gz
barebox-a476255682c82ce4b9c790605eab75b1b5b9a9d0.tar.xz
ARM: rpi: register a clkdev for the eMMC clock
Use the mailbox driver to query the clock frequency and create a clkdev for the bcm2835_mci driver. Signed-off-by: Andre Heider <a.heider@gmail.com> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/arm/boards/raspberry-pi')
-rw-r--r--arch/arm/boards/raspberry-pi/rpi.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/arch/arm/boards/raspberry-pi/rpi.c b/arch/arm/boards/raspberry-pi/rpi.c
index 971a603bf0..d3c6b117dd 100644
--- a/arch/arm/boards/raspberry-pi/rpi.c
+++ b/arch/arm/boards/raspberry-pi/rpi.c
@@ -17,11 +17,44 @@
#include <init.h>
#include <fs.h>
#include <linux/stat.h>
+#include <linux/clk.h>
+#include <linux/clkdev.h>
#include <envfs.h>
#include <asm/armlinux.h>
#include <generated/mach-types.h>
#include <mach/core.h>
+#include <mach/mbox.h>
+
+struct msg_get_clock_rate {
+ struct bcm2835_mbox_hdr hdr;
+ struct bcm2835_mbox_tag_get_clock_rate get_clock_rate;
+ u32 end_tag;
+};
+
+static int rpi_register_clkdev(u32 clock_id, const char *name)
+{
+ BCM2835_MBOX_STACK_ALIGN(struct msg_get_clock_rate, msg);
+ struct clk *clk;
+ int ret;
+
+ BCM2835_MBOX_INIT_HDR(msg);
+ BCM2835_MBOX_INIT_TAG(&msg->get_clock_rate, GET_CLOCK_RATE);
+ msg->get_clock_rate.body.req.clock_id = clock_id;
+
+ ret = bcm2835_mbox_call_prop(BCM2835_MBOX_PROP_CHAN, &msg->hdr);
+ if (ret)
+ return ret;
+
+ clk = clk_fixed(name, msg->get_clock_rate.body.resp.rate_hz);
+ if (IS_ERR(clk))
+ return PTR_ERR(clk);
+
+ if (!clk_register_clkdev(clk, NULL, name))
+ return -ENODEV;
+
+ return 0;
+}
static int rpi_mem_init(void)
{
@@ -40,6 +73,13 @@ static int rpi_console_init(void)
}
console_initcall(rpi_console_init);
+static int rpi_clock_init(void)
+{
+ rpi_register_clkdev(BCM2835_MBOX_CLOCK_ID_EMMC, "bcm2835_mci0");
+ return 0;
+}
+postconsole_initcall(rpi_clock_init);
+
static int rpi_env_init(void)
{
struct stat s;