forked from Minki/linux
99c6bcf46d
More multiplatform enablement for ARM platforms. The ones converted in this branch are: - bcm2835 - cns3xxx - sirf - nomadik - msx - spear - tegra - ux500 We're getting close to having most of them converted! One of the larger platforms remaining is Samsung Exynos, and there are a bunch of supporting patches in this merge window for it. There was a patch in this branch to a early version of multiplatform conversion, but it ended up being reverted due to need of more bake time. The revert commit is part of the branch since it would have required rebasing multiple dependent branches and they were stable by then. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iQIcBAABAgAGBQJRgg99AAoJEIwa5zzehBx3n78P/j0w/8v+F4dM29ba5M/tqbFI e3wpeFykZ/HJH+FFIEYfIablpfHsLB0LEMh0dZmwHESFC6eR0RfGL2jOkpfcH9Ne 7B/JIFN4l1iwqqKCXf+QbYL6e8YFxlJkg6BIB4KhNgliQoO/ASP/8EbcgROYuxmN KPVdw9laUCCvb5Ogh2NWVAkBHhVGAEiqK20r4TQz8alI8RUmMleWM3o+wLBWVhOO d3gtYSfuFSbrJfbpKSdycLizoV/NekdOC1A9Ov9YuOdw8DzNbrThCRQtu0tIUgxN JjfnGlEJLsJS9SESfr8SYWxTuhe/lB2dGqjQPvRtl2HGBhbtTlnWfQ0k2ZHdeJuD J50SLrGA2gN9E5PlHJXjYk8uhhGIq8bNTJ//CtDkfKTq1D7PuHVEpEctsaz3BBbM U+x9zP2v4FB+yrZu8w+gkQY/wDgHsxj08mT6BK0+l8ePdyQV22CvwmM5XlJFI03x 5J0nLYiYfef+ZN9rGgVrQbn+yv+IEkE4DmeiscjeVJE5LVdVrDpYGfx7UA7V0UA7 i3KRVpNKuy1v7GJDnKlEBPkmB+vgXTRXUPDVCuC4n0Hi5PYj4es1gY6AoXGF90wm vtKxGr/2XDLP7Ro+m0OXMttSgQShnmbrbOngfkWcFwUmG7cB3SSUUOGKM+2LNnXM MJTqVhPjkZ2GYBi/J6S/ =4hSo -----END PGP SIGNATURE----- Merge tag 'multiplatform-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc Pull ARM SoC multiplatform updates from Olof Johansson: "More multiplatform enablement for ARM platforms. The ones converted in this branch are: - bcm2835 - cns3xxx - sirf - nomadik - msx - spear - tegra - ux500 We're getting close to having most of them converted! One of the larger platforms remaining is Samsung Exynos, and there are a bunch of supporting patches in this merge window for it. There was a patch in this branch to a early version of multiplatform conversion, but it ended up being reverted due to need of more bake time. The revert commit is part of the branch since it would have required rebasing multiple dependent branches and they were stable by then" * tag 'multiplatform-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (70 commits) mmc: sdhci-s3c: Fix operation on non-single image Samsung platforms clocksource: nomadik-mtu: fix up clocksource/timer Revert "ARM: exynos: enable multiplatform support" ARM: SPEAr13xx: Fix typo "ARCH_HAVE_CPUFREQ" ARM: exynos: enable multiplatform support rtc: s3c: make header file local mtd: onenand/samsung: make regs-onenand.h file local thermal/exynos: remove unnecessary header inclusions mmc: sdhci-s3c: remove platform dependencies ARM: samsung: move mfc device definition to s5p-dev-mfc.c ARM: exynos: move debug-macro.S to include/debug/ ARM: exynos: prepare for sparse IRQ ARM: exynos: introduce EXYNOS_ATAGS symbol ARM: tegra: build assembly files with -march=armv7-a ARM: Push selects for TWD/SCU into machine entries ARM: ux500: build hotplug.o for ARMv7-a ARM: ux500: move to multiplatform ARM: ux500: make remaining headers local ARM: ux500: make irqs.h local to platform ARM: ux500: get rid of <mach/[hardware|db8500-regs].h> ...
234 lines
6.2 KiB
C
234 lines
6.2 KiB
C
/*
|
|
* Copyright (C) ST-Ericsson SA 2010
|
|
*
|
|
* Author: Hanumath Prasad <hanumath.prasad@stericsson.com>
|
|
* License terms: GNU General Public License (GPL) version 2
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/gpio.h>
|
|
#include <linux/amba/bus.h>
|
|
#include <linux/amba/mmci.h>
|
|
#include <linux/mmc/host.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/platform_data/dma-ste-dma40.h>
|
|
|
|
#include <asm/mach-types.h>
|
|
#include "devices.h"
|
|
|
|
#include "db8500-regs.h"
|
|
#include "devices-db8500.h"
|
|
#include "board-mop500.h"
|
|
#include "ste-dma40-db8500.h"
|
|
|
|
/*
|
|
* v2 has a new version of this block that need to be forced, the number found
|
|
* in hardware is incorrect
|
|
*/
|
|
#define U8500_SDI_V2_PERIPHID 0x10480180
|
|
|
|
/*
|
|
* SDI 0 (MicroSD slot)
|
|
*/
|
|
|
|
#ifdef CONFIG_STE_DMA40
|
|
struct stedma40_chan_cfg mop500_sdi0_dma_cfg_rx = {
|
|
.mode = STEDMA40_MODE_LOGICAL,
|
|
.dir = STEDMA40_PERIPH_TO_MEM,
|
|
.src_dev_type = DB8500_DMA_DEV29_SD_MM0_RX,
|
|
.dst_dev_type = STEDMA40_DEV_DST_MEMORY,
|
|
.src_info.data_width = STEDMA40_WORD_WIDTH,
|
|
.dst_info.data_width = STEDMA40_WORD_WIDTH,
|
|
};
|
|
|
|
static struct stedma40_chan_cfg mop500_sdi0_dma_cfg_tx = {
|
|
.mode = STEDMA40_MODE_LOGICAL,
|
|
.dir = STEDMA40_MEM_TO_PERIPH,
|
|
.src_dev_type = STEDMA40_DEV_SRC_MEMORY,
|
|
.dst_dev_type = DB8500_DMA_DEV29_SD_MM0_TX,
|
|
.src_info.data_width = STEDMA40_WORD_WIDTH,
|
|
.dst_info.data_width = STEDMA40_WORD_WIDTH,
|
|
};
|
|
#endif
|
|
|
|
struct mmci_platform_data mop500_sdi0_data = {
|
|
.ocr_mask = MMC_VDD_29_30,
|
|
.f_max = 50000000,
|
|
.capabilities = MMC_CAP_4_BIT_DATA |
|
|
MMC_CAP_SD_HIGHSPEED |
|
|
MMC_CAP_MMC_HIGHSPEED,
|
|
.gpio_wp = -1,
|
|
.sigdir = MCI_ST_FBCLKEN |
|
|
MCI_ST_CMDDIREN |
|
|
MCI_ST_DATA0DIREN |
|
|
MCI_ST_DATA2DIREN,
|
|
#ifdef CONFIG_STE_DMA40
|
|
.dma_filter = stedma40_filter,
|
|
.dma_rx_param = &mop500_sdi0_dma_cfg_rx,
|
|
.dma_tx_param = &mop500_sdi0_dma_cfg_tx,
|
|
#endif
|
|
};
|
|
|
|
static void sdi0_configure(struct device *parent)
|
|
{
|
|
/* Add the device, force v2 to subrevision 1 */
|
|
db8500_add_sdi0(parent, &mop500_sdi0_data, U8500_SDI_V2_PERIPHID);
|
|
}
|
|
|
|
void mop500_sdi_tc35892_init(struct device *parent)
|
|
{
|
|
mop500_sdi0_data.gpio_cd = GPIO_SDMMC_CD;
|
|
sdi0_configure(parent);
|
|
}
|
|
|
|
/*
|
|
* SDI1 (SDIO WLAN)
|
|
*/
|
|
#ifdef CONFIG_STE_DMA40
|
|
static struct stedma40_chan_cfg sdi1_dma_cfg_rx = {
|
|
.mode = STEDMA40_MODE_LOGICAL,
|
|
.dir = STEDMA40_PERIPH_TO_MEM,
|
|
.src_dev_type = DB8500_DMA_DEV32_SD_MM1_RX,
|
|
.dst_dev_type = STEDMA40_DEV_DST_MEMORY,
|
|
.src_info.data_width = STEDMA40_WORD_WIDTH,
|
|
.dst_info.data_width = STEDMA40_WORD_WIDTH,
|
|
};
|
|
|
|
static struct stedma40_chan_cfg sdi1_dma_cfg_tx = {
|
|
.mode = STEDMA40_MODE_LOGICAL,
|
|
.dir = STEDMA40_MEM_TO_PERIPH,
|
|
.src_dev_type = STEDMA40_DEV_SRC_MEMORY,
|
|
.dst_dev_type = DB8500_DMA_DEV32_SD_MM1_TX,
|
|
.src_info.data_width = STEDMA40_WORD_WIDTH,
|
|
.dst_info.data_width = STEDMA40_WORD_WIDTH,
|
|
};
|
|
#endif
|
|
|
|
struct mmci_platform_data mop500_sdi1_data = {
|
|
.ocr_mask = MMC_VDD_29_30,
|
|
.f_max = 50000000,
|
|
.capabilities = MMC_CAP_4_BIT_DATA,
|
|
.gpio_cd = -1,
|
|
.gpio_wp = -1,
|
|
#ifdef CONFIG_STE_DMA40
|
|
.dma_filter = stedma40_filter,
|
|
.dma_rx_param = &sdi1_dma_cfg_rx,
|
|
.dma_tx_param = &sdi1_dma_cfg_tx,
|
|
#endif
|
|
};
|
|
|
|
/*
|
|
* SDI 2 (POP eMMC, not on DB8500ed)
|
|
*/
|
|
|
|
#ifdef CONFIG_STE_DMA40
|
|
struct stedma40_chan_cfg mop500_sdi2_dma_cfg_rx = {
|
|
.mode = STEDMA40_MODE_LOGICAL,
|
|
.dir = STEDMA40_PERIPH_TO_MEM,
|
|
.src_dev_type = DB8500_DMA_DEV28_SD_MM2_RX,
|
|
.dst_dev_type = STEDMA40_DEV_DST_MEMORY,
|
|
.src_info.data_width = STEDMA40_WORD_WIDTH,
|
|
.dst_info.data_width = STEDMA40_WORD_WIDTH,
|
|
};
|
|
|
|
static struct stedma40_chan_cfg mop500_sdi2_dma_cfg_tx = {
|
|
.mode = STEDMA40_MODE_LOGICAL,
|
|
.dir = STEDMA40_MEM_TO_PERIPH,
|
|
.src_dev_type = STEDMA40_DEV_SRC_MEMORY,
|
|
.dst_dev_type = DB8500_DMA_DEV28_SD_MM2_TX,
|
|
.src_info.data_width = STEDMA40_WORD_WIDTH,
|
|
.dst_info.data_width = STEDMA40_WORD_WIDTH,
|
|
};
|
|
#endif
|
|
|
|
struct mmci_platform_data mop500_sdi2_data = {
|
|
.ocr_mask = MMC_VDD_165_195,
|
|
.f_max = 50000000,
|
|
.capabilities = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA |
|
|
MMC_CAP_MMC_HIGHSPEED,
|
|
.gpio_cd = -1,
|
|
.gpio_wp = -1,
|
|
#ifdef CONFIG_STE_DMA40
|
|
.dma_filter = stedma40_filter,
|
|
.dma_rx_param = &mop500_sdi2_dma_cfg_rx,
|
|
.dma_tx_param = &mop500_sdi2_dma_cfg_tx,
|
|
#endif
|
|
};
|
|
|
|
/*
|
|
* SDI 4 (on-board eMMC)
|
|
*/
|
|
|
|
#ifdef CONFIG_STE_DMA40
|
|
struct stedma40_chan_cfg mop500_sdi4_dma_cfg_rx = {
|
|
.mode = STEDMA40_MODE_LOGICAL,
|
|
.dir = STEDMA40_PERIPH_TO_MEM,
|
|
.src_dev_type = DB8500_DMA_DEV42_SD_MM4_RX,
|
|
.dst_dev_type = STEDMA40_DEV_DST_MEMORY,
|
|
.src_info.data_width = STEDMA40_WORD_WIDTH,
|
|
.dst_info.data_width = STEDMA40_WORD_WIDTH,
|
|
};
|
|
|
|
static struct stedma40_chan_cfg mop500_sdi4_dma_cfg_tx = {
|
|
.mode = STEDMA40_MODE_LOGICAL,
|
|
.dir = STEDMA40_MEM_TO_PERIPH,
|
|
.src_dev_type = STEDMA40_DEV_SRC_MEMORY,
|
|
.dst_dev_type = DB8500_DMA_DEV42_SD_MM4_TX,
|
|
.src_info.data_width = STEDMA40_WORD_WIDTH,
|
|
.dst_info.data_width = STEDMA40_WORD_WIDTH,
|
|
};
|
|
#endif
|
|
|
|
struct mmci_platform_data mop500_sdi4_data = {
|
|
.ocr_mask = MMC_VDD_29_30,
|
|
.f_max = 50000000,
|
|
.capabilities = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA |
|
|
MMC_CAP_MMC_HIGHSPEED,
|
|
.gpio_cd = -1,
|
|
.gpio_wp = -1,
|
|
#ifdef CONFIG_STE_DMA40
|
|
.dma_filter = stedma40_filter,
|
|
.dma_rx_param = &mop500_sdi4_dma_cfg_rx,
|
|
.dma_tx_param = &mop500_sdi4_dma_cfg_tx,
|
|
#endif
|
|
};
|
|
|
|
void __init mop500_sdi_init(struct device *parent)
|
|
{
|
|
/* PoP:ed eMMC */
|
|
db8500_add_sdi2(parent, &mop500_sdi2_data, U8500_SDI_V2_PERIPHID);
|
|
/* On-board eMMC */
|
|
db8500_add_sdi4(parent, &mop500_sdi4_data, U8500_SDI_V2_PERIPHID);
|
|
|
|
/*
|
|
* On boards with the TC35892 GPIO expander, sdi0 will finally
|
|
* be added when the TC35892 initializes and calls
|
|
* mop500_sdi_tc35892_init() above.
|
|
*/
|
|
}
|
|
|
|
void __init snowball_sdi_init(struct device *parent)
|
|
{
|
|
/* On Snowball MMC_CAP_SD_HIGHSPEED isn't supported (Hardware issue?) */
|
|
mop500_sdi0_data.capabilities &= ~MMC_CAP_SD_HIGHSPEED;
|
|
/* On-board eMMC */
|
|
db8500_add_sdi4(parent, &mop500_sdi4_data, U8500_SDI_V2_PERIPHID);
|
|
/* External Micro SD slot */
|
|
mop500_sdi0_data.gpio_cd = SNOWBALL_SDMMC_CD_GPIO;
|
|
mop500_sdi0_data.cd_invert = true;
|
|
sdi0_configure(parent);
|
|
}
|
|
|
|
void __init hrefv60_sdi_init(struct device *parent)
|
|
{
|
|
/* PoP:ed eMMC */
|
|
db8500_add_sdi2(parent, &mop500_sdi2_data, U8500_SDI_V2_PERIPHID);
|
|
/* On-board eMMC */
|
|
db8500_add_sdi4(parent, &mop500_sdi4_data, U8500_SDI_V2_PERIPHID);
|
|
/* External Micro SD slot */
|
|
mop500_sdi0_data.gpio_cd = HREFV60_SDMMC_CD_GPIO;
|
|
sdi0_configure(parent);
|
|
/* WLAN SDIO channel */
|
|
db8500_add_sdi1(parent, &mop500_sdi1_data, U8500_SDI_V2_PERIPHID);
|
|
}
|