blob: 8bb4ef42ab0480155186a6245f5e3ea7088d04fc [file] [log] [blame]
Linus Walleijbb3cee22009-04-23 10:22:13 +01001/*
2 *
3 * arch/arm/mach-u300/mmc.c
4 *
5 *
6 * Copyright (C) 2009 ST-Ericsson AB
7 * License terms: GNU General Public License (GPL) version 2
8 *
9 * Author: Linus Walleij <linus.walleij@stericsson.com>
10 * Author: Johan Lundin <johan.lundin@stericsson.com>
11 * Author: Jonas Aaberg <jonas.aberg@stericsson.com>
12 */
13#include <linux/device.h>
14#include <linux/amba/bus.h>
15#include <linux/mmc/host.h>
Linus Walleijbb3cee22009-04-23 10:22:13 +010016#include <linux/gpio.h>
Linus Walleij6ef297f2009-09-22 14:29:36 +010017#include <linux/amba/mmci.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090018#include <linux/slab.h>
Linus Walleijbb3cee22009-04-23 10:22:13 +010019
Linus Walleijbb3cee22009-04-23 10:22:13 +010020#include "mmc.h"
Linus Walleijdf1e0522009-08-10 12:52:40 +010021#include "padmux.h"
Linus Walleijbb3cee22009-04-23 10:22:13 +010022
Linus Walleij1a721852011-02-02 14:41:19 +010023static struct mmci_platform_data mmc0_plat_data = {
Linus Walleijf9e8eef2009-09-24 21:42:44 +010024 /*
25 * Do not set ocr_mask or voltage translation function,
26 * we have a regulator we can control instead.
27 */
Linus Walleijbb3cee22009-04-23 10:22:13 +010028 /* Nominally 2.85V on our platform */
Linus Walleij1a721852011-02-02 14:41:19 +010029 .f_max = 24000000,
30 .gpio_wp = -1,
31 .gpio_cd = U300_GPIO_PIN_MMC_CD,
32 .cd_invert = true,
33 .capabilities = MMC_CAP_MMC_HIGHSPEED |
34 MMC_CAP_SD_HIGHSPEED | MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
35};
Linus Walleijbb3cee22009-04-23 10:22:13 +010036
Linus Walleij1a721852011-02-02 14:41:19 +010037int __devinit mmc_init(struct amba_device *adev)
38{
39 struct device *mmcsd_device = &adev->dev;
40 struct pmx *pmx;
41 int ret = 0;
Linus Walleijbb3cee22009-04-23 10:22:13 +010042
Linus Walleij1a721852011-02-02 14:41:19 +010043 mmcsd_device->platform_data = &mmc0_plat_data;
Linus Walleijbb3cee22009-04-23 10:22:13 +010044
Linus Walleijdf1e0522009-08-10 12:52:40 +010045 /*
46 * Setup padmuxing for MMC. Since this must always be
47 * compiled into the kernel, pmx is never released.
48 */
49 pmx = pmx_get(mmcsd_device, U300_APP_PMX_MMC_SETTING);
50
51 if (IS_ERR(pmx))
52 pr_warning("Could not get padmux handle\n");
53 else {
54 ret = pmx_activate(mmcsd_device, pmx);
55 if (IS_ERR_VALUE(ret))
56 pr_warning("Could not activate padmuxing\n");
57 }
58
Linus Walleijbb3cee22009-04-23 10:22:13 +010059 return ret;
60}