diff options
author | Andre Heider <a.heider@gmail.com> | 2013-10-19 14:20:53 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2013-10-22 15:28:59 +0200 |
commit | a476255682c82ce4b9c790605eab75b1b5b9a9d0 (patch) | |
tree | 94d446caa35d40ef3e033aca372108a6126ee191 /arch/arm/boards/raspberry-pi | |
parent | 76cb4002af394c9179a0802f4b42edb897f7f793 (diff) | |
download | barebox-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.c | 40 |
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; |