mmc: add bcm2835 driver
Subsystems (4)
PATCH v2 1/2 mmc: add bcm2835 driver
This adds a simple driver for the BCM2835's SD controller.
Workarounds are implemented for:
* Register writes can't be too close to each-other in time, or they will be lost.
* Register accesses must all be 32-bit, so implement custom accessors.
This code was extracted from:git://github.com/gonzoua/u-boot-pi.git master
which was created by Oleksandr Tymoshenko.
Portions of the code there were obviously based on the Linux kernel at:git://github.com/raspberrypi/linux.git rpi-3.6.y
commit f5b930b "Main bcm2708 linux port" signed-off-by Dom Cobley.
swarren changed the following for upstream:
* Removed hack udelay()s in bcm2835_sdhci_raw_writel(); setting SDHCI_QUIRK_WAIT_SEND_CMD appears to solve the issues.
* Remove register logging from read*/write* functions.
* Sort out confusion with min/max_freq values passed to add_sdhci().
* Use more descriptive variable names and calculations in IO accessors.
* Simplified and commented twoticks_delay calculation.
* checkpatch fixes.
---
This series is based on the previous bcm2835 patches I sent, to add the mbox and video drivers. Patch 1 should be independant, but patch 2 depends on those other patches.
v2:
* Use more descriptive variable names and calculations in IO accessors.
* Add Oleksandr's S-o-b.
* Rewrite commit description to note that the Linux code this was derived from was S-o-b Dom Cobley.
--- arch/arm/include/asm/arch-bcm2835/sdhci.h | 24 ++++ drivers/mmc/Makefile | 1 + drivers/mmc/bcm2835_sdhci.c | 177 +++++++++++++++++++++++++++++ 3 files changed, 202 insertions(+) create mode 100644 arch/arm/include/asm/arch-bcm2835/sdhci.h create mode 100644 drivers/mmc/bcm2835_sdhci.c
arch/arm/include/asm/arch-bcm2835/sdhci.h new file +24 -0
@@ -0,0 +1,24 @@ +/* +* (C) Copyright 2012 Stephen Warren +* +* See file CREDITS for list of people who contributed to this +* project. +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* version 2 as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +*/ + +#ifndef _BCM2835_SDHCI_H_ +#define _BCM2835_SDHCI_H_ + +#define BCM2835_SDHCI_BASE 0x20300000 + +int bcm2835_sdhci_init (u32 regbase,u32 emmc_freq); + +#endif
drivers/mmc/Makefile +1 -0
@@ -43,6 +43,7 @@ COBJS-$(CONFIG_MXS_MMC) += mxsmmc.o COBJS-$(CONFIG_OMAP_HSMMC) += omap_hsmmc.o COBJS-$(CONFIG_PXA_MMC_GENERIC) += pxa_mmc_gen.o COBJS-$(CONFIG_SDHCI) += sdhci.o +COBJS-$(CONFIG_BCM2835_SDHCI) += bcm2835_sdhci.o COBJS-$(CONFIG_S5P_SDHCI) += s5p_sdhci.o COBJS-$(CONFIG_SH_MMCIF) += sh_mmcif.o COBJS-$(CONFIG_TEGRA_MMC) += tegra_mmc.o
drivers/mmc/bcm2835_sdhci.c new file +177 -0
177 lines not on this page · raw message
Signature · 1 line
1.7.9.5
PATCH v2 2/2 ARM: rpi_b: enable SD controller, add related env/cmds
Enable the SD controller driver for the Raspberry Pi. Enable a number of useful MMC, partition, and filesystem-related commands. Set up the environment to provide standard locations for loading a kernel, DTB, etc. Provide a boot command that loads and executes boot.scr.uimg from the SD card; this is written considering future extensibilty to USB storage.
--- arch/arm/include/asm/arch-bcm2835/mbox.h | 26 ++++++++++++ board/raspberrypi/rpi_b/rpi_b.c | 26 ++++++++++++ include/configs/rpi_b.h | 68 ++++++++++++++++++++++++++++-- 3 files changed, 117 insertions(+), 3 deletions(-)
arch/arm/include/asm/arch-bcm2835/mbox.h +26 -0
@@ -144,6 +144,32 @@ struct bcm2835_mbox_tag_get_arm_mem { } body; }; +#define BCM2835_MBOX_TAG_GET_CLOCK_RATE 0x00030002 + +#define BCM2835_MBOX_CLOCK_ID_EMMC 1 +#define BCM2835_MBOX_CLOCK_ID_UART 2 +#define BCM2835_MBOX_CLOCK_ID_ARM 3 +#define BCM2835_MBOX_CLOCK_ID_CORE 4 +#define BCM2835_MBOX_CLOCK_ID_V3D 5 +#define BCM2835_MBOX_CLOCK_ID_H264 6 +#define BCM2835_MBOX_CLOCK_ID_ISP 7 +#define BCM2835_MBOX_CLOCK_ID_SDRAM 8 +#define BCM2835_MBOX_CLOCK_ID_PIXEL 9 +#define BCM2835_MBOX_CLOCK_ID_PWM 10 + +struct bcm2835_mbox_tag_get_clock_rate { +struct bcm2835_mbox_tag_hdr tag_hdr; +union { +struct { +u32 clock_id; + } req; +struct { +u32 clock_id; +u32 rate_hz; + } resp; + } body; +}; +#define BCM2835_MBOX_TAG_ALLOCATE_BUFFER 0x00040001struct bcm2835_mbox_tag_allocate_buffer {
board/raspberrypi/rpi_b/rpi_b.c +26 -0
@@ -16,6 +16,7 @@#include <common.h> #include <asm/arch/mbox.h> +#include <asm/arch/sdhci.h> #include <asm/global_data.h> DECLARE_GLOBAL_DATA_PTR ;
@@ -26,6 +27,12 @@ struct msg_get_arm_mem {u32 end_tag; }; +struct msg_get_clock_rate { +struct bcm2835_mbox_hdr hdr; +struct bcm2835_mbox_tag_get_clock_rate get_clock_rate; +u32 end_tag; +}; +int dram_init (void ) { ALLOC_ALIGN_BUFFER(struct msg_get_arm_mem, msg, 1, 16);
@@ -51,3 +58,22 @@ int board_init(void)return 0 ; } + +int board_mmc_init (void ) +{ + ALLOC_ALIGN_BUFFER(struct msg_get_clock_rate, msg_clk, 1, 16); +int ret; + +BCM2835_MBOX_INIT_HDR (msg_clk); +BCM2835_MBOX_INIT_TAG (&msg_clk->get_clock_rate,GET_CLOCK_RATE ); + msg_clk->get_clock_rate.body.req.clock_id =BCM2835_MBOX_CLOCK_ID_EMMC ; + + ret =bcm2835_mbox_call_prop (BCM2835_MBOX_PROP_CHAN , &msg_clk->hdr); +if (ret) { +printf ("bcm2835: Could not query eMMC clock rate\n" ); +return -1 ; + } + +return bcm2835_sdhci_init (BCM2835_SDHCI_BASE , + msg_clk->get_clock_rate.body.resp.rate_hz); +}
include/configs/rpi_b.h +65 -3
95 lines not on this page · raw message
Signature · 1 line
1.7.9.5
PATCH v2 1/2 mmc: add bcm2835 driver
In reply to Stephen WarrenHi Stephen,
Quoted 6 lines
arch/arm/include/asm/arch-bcm2835/sdhci.h | 24 ++++ drivers/mmc/Makefile | 1 + drivers/mmc/bcm2835_sdhci.c | 177 +++++++++++++++++++++++++++++ 3 files changed, 202 insertions(+) create mode 100644 arch/arm/include/asm/arch-bcm2835/sdhci.h create mode 100644 drivers/mmc/bcm2835_sdhci.c
Actually the patch is essentially an MMC driver one, with the ARM file touched only to add a base address. I have reassigned the patch to Andy.
Amicalement,
Signature · 1 line
Albert.
PATCH v2 1/2 mmc: add bcm2835 driver
Quoted 9 lines · Albert ARIBAUD
Hi Stephen,
Quoted 6 lines
arch/arm/include/asm/arch-bcm2835/sdhci.h | 24 ++++ drivers/mmc/Makefile | 1 + drivers/mmc/bcm2835_sdhci.c | 177 +++++++++++++++++++++++++++++ 3 files changed, 202 insertions(+) create mode 100644 arch/arm/include/asm/arch-bcm2835/sdhci.h create mode 100644 drivers/mmc/bcm2835_sdhci.c
Quoted 3 lines
Actually the patch is essentially an MMC driver one, with the ARM file touched only to add a base address. I have reassigned the patch to Andy.
OK. Note that patch 2/2 is all ARM and relies on patch 1/2 to compile though.
PATCH v2 1/2 mmc: add bcm2835 driver
Hi Stephen,
Quoted 10 lines · Stephen Warren
Quoted 9 lines · Albert ARIBAUD
Hi Stephen,
Quoted 6 lines
arch/arm/include/asm/arch-bcm2835/sdhci.h | 24 ++++ drivers/mmc/Makefile | 1 + drivers/mmc/bcm2835_sdhci.c | 177 +++++++++++++++++++++++++++++ 3 files changed, 202 insertions(+) create mode 100644 arch/arm/include/asm/arch-bcm2835/sdhci.h create mode 100644 drivers/mmc/bcm2835_sdhci.c
Quoted 6 lines
Quoted 3 lines
Actually the patch is essentially an MMC driver one, with the ARM file touched only to add a base address. I have reassigned the patch to Andy.
OK. Note that patch 2/2 is all ARM and relies on patch 1/2 to compile though.
If you prefer, Andy can give his Acked-By: and reassign to me, and I will apply the series.
Amicalement,
Signature · 1 line
Albert.