mirror of
https://github.com/torvalds/linux.git
synced 2024-12-26 21:02:19 +00:00
Merge branch 'hsmmc' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap into omap/hsmmc
This commit is contained in:
commit
28e20403a9
@ -404,6 +404,7 @@ static struct omap2_hsmmc_info mmc[] = {
|
||||
{
|
||||
.mmc = 5,
|
||||
.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_POWER_OFF_CARD,
|
||||
.pm_caps = MMC_PM_KEEP_POWER,
|
||||
.gpio_cd = -EINVAL,
|
||||
.gpio_wp = -EINVAL,
|
||||
.ocr_mask = MMC_VDD_165_195,
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include <linux/i2c/pca953x.h>
|
||||
#include <linux/can/platform/ti_hecc.h>
|
||||
#include <linux/davinci_emac.h>
|
||||
#include <linux/mmc/host.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/am35xx.h>
|
||||
@ -40,6 +41,7 @@
|
||||
|
||||
#include "mux.h"
|
||||
#include "control.h"
|
||||
#include "hsmmc.h"
|
||||
|
||||
#define AM35XX_EVM_MDIO_FREQUENCY (1000000)
|
||||
|
||||
@ -455,6 +457,23 @@ static void am3517_evm_hecc_init(struct ti_hecc_platform_data *pdata)
|
||||
static struct omap_board_config_kernel am3517_evm_config[] __initdata = {
|
||||
};
|
||||
|
||||
static struct omap2_hsmmc_info mmc[] = {
|
||||
{
|
||||
.mmc = 1,
|
||||
.caps = MMC_CAP_4_BIT_DATA,
|
||||
.gpio_cd = 127,
|
||||
.gpio_wp = 126,
|
||||
},
|
||||
{
|
||||
.mmc = 2,
|
||||
.caps = MMC_CAP_4_BIT_DATA,
|
||||
.gpio_cd = 128,
|
||||
.gpio_wp = 129,
|
||||
},
|
||||
{} /* Terminator */
|
||||
};
|
||||
|
||||
|
||||
static void __init am3517_evm_init(void)
|
||||
{
|
||||
omap_board_config = am3517_evm_config;
|
||||
@ -483,6 +502,9 @@ static void __init am3517_evm_init(void)
|
||||
|
||||
/* MUSB */
|
||||
am3517_evm_musb_init();
|
||||
|
||||
/* MMC init function */
|
||||
omap2_hsmmc_init(mmc);
|
||||
}
|
||||
|
||||
MACHINE_START(OMAP3517EVM, "OMAP3517/AM3517 EVM")
|
||||
|
@ -171,6 +171,17 @@ static void omap4_hsmmc1_after_set_reg(struct device *dev, int slot,
|
||||
}
|
||||
}
|
||||
|
||||
static void hsmmc2_select_input_clk_src(struct omap_mmc_platform_data *mmc)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
if (mmc->slots[0].internal_clock) {
|
||||
reg = omap_ctrl_readl(control_devconf1_offset);
|
||||
reg |= OMAP2_MMCSDIO2ADPCLKISEL;
|
||||
omap_ctrl_writel(reg, control_devconf1_offset);
|
||||
}
|
||||
}
|
||||
|
||||
static void hsmmc23_before_set_reg(struct device *dev, int slot,
|
||||
int power_on, int vdd)
|
||||
{
|
||||
@ -179,16 +190,19 @@ static void hsmmc23_before_set_reg(struct device *dev, int slot,
|
||||
if (mmc->slots[0].remux)
|
||||
mmc->slots[0].remux(dev, slot, power_on);
|
||||
|
||||
if (power_on) {
|
||||
/* Only MMC2 supports a CLKIN */
|
||||
if (mmc->slots[0].internal_clock) {
|
||||
u32 reg;
|
||||
if (power_on)
|
||||
hsmmc2_select_input_clk_src(mmc);
|
||||
}
|
||||
|
||||
reg = omap_ctrl_readl(control_devconf1_offset);
|
||||
reg |= OMAP2_MMCSDIO2ADPCLKISEL;
|
||||
omap_ctrl_writel(reg, control_devconf1_offset);
|
||||
}
|
||||
}
|
||||
static int am35x_hsmmc2_set_power(struct device *dev, int slot,
|
||||
int power_on, int vdd)
|
||||
{
|
||||
struct omap_mmc_platform_data *mmc = dev->platform_data;
|
||||
|
||||
if (power_on)
|
||||
hsmmc2_select_input_clk_src(mmc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int nop_mmc_set_power(struct device *dev, int slot, int power_on,
|
||||
@ -200,10 +214,12 @@ static int nop_mmc_set_power(struct device *dev, int slot, int power_on,
|
||||
static inline void omap_hsmmc_mux(struct omap_mmc_platform_data *mmc_controller,
|
||||
int controller_nr)
|
||||
{
|
||||
if (gpio_is_valid(mmc_controller->slots[0].switch_pin))
|
||||
if (gpio_is_valid(mmc_controller->slots[0].switch_pin) &&
|
||||
(mmc_controller->slots[0].switch_pin < OMAP_MAX_GPIO_LINES))
|
||||
omap_mux_init_gpio(mmc_controller->slots[0].switch_pin,
|
||||
OMAP_PIN_INPUT_PULLUP);
|
||||
if (gpio_is_valid(mmc_controller->slots[0].gpio_wp))
|
||||
if (gpio_is_valid(mmc_controller->slots[0].gpio_wp) &&
|
||||
(mmc_controller->slots[0].gpio_wp < OMAP_MAX_GPIO_LINES))
|
||||
omap_mux_init_gpio(mmc_controller->slots[0].gpio_wp,
|
||||
OMAP_PIN_INPUT_PULLUP);
|
||||
if (cpu_is_omap34xx()) {
|
||||
@ -296,6 +312,7 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c,
|
||||
mmc->slots[0].name = hc_name;
|
||||
mmc->nr_slots = 1;
|
||||
mmc->slots[0].caps = c->caps;
|
||||
mmc->slots[0].pm_caps = c->pm_caps;
|
||||
mmc->slots[0].internal_clock = !c->ext_clock;
|
||||
mmc->dma_mask = 0xffffffff;
|
||||
if (cpu_is_omap44xx())
|
||||
@ -336,11 +353,17 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c,
|
||||
*
|
||||
* temporary HACK: ocr_mask instead of fixed supply
|
||||
*/
|
||||
mmc->slots[0].ocr_mask = c->ocr_mask;
|
||||
|
||||
if (cpu_is_omap3517() || cpu_is_omap3505())
|
||||
mmc->slots[0].set_power = nop_mmc_set_power;
|
||||
if (cpu_is_omap3505() || cpu_is_omap3517())
|
||||
mmc->slots[0].ocr_mask = MMC_VDD_165_195 |
|
||||
MMC_VDD_26_27 |
|
||||
MMC_VDD_27_28 |
|
||||
MMC_VDD_29_30 |
|
||||
MMC_VDD_30_31 |
|
||||
MMC_VDD_31_32;
|
||||
else
|
||||
mmc->slots[0].ocr_mask = c->ocr_mask;
|
||||
|
||||
if (!cpu_is_omap3517() && !cpu_is_omap3505())
|
||||
mmc->slots[0].features |= HSMMC_HAS_PBIAS;
|
||||
|
||||
if (cpu_is_omap44xx() && (omap_rev() > OMAP4430_REV_ES1_0))
|
||||
@ -363,6 +386,9 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c,
|
||||
}
|
||||
}
|
||||
|
||||
if (cpu_is_omap3517() || cpu_is_omap3505())
|
||||
mmc->slots[0].set_power = nop_mmc_set_power;
|
||||
|
||||
/* OMAP3630 HSMMC1 supports only 4-bit */
|
||||
if (cpu_is_omap3630() &&
|
||||
(c->caps & MMC_CAP_8_BIT_DATA)) {
|
||||
@ -372,6 +398,9 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c,
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (cpu_is_omap3517() || cpu_is_omap3505())
|
||||
mmc->slots[0].set_power = am35x_hsmmc2_set_power;
|
||||
|
||||
if (c->ext_clock)
|
||||
c->transceiver = 1;
|
||||
if (c->transceiver && (c->caps & MMC_CAP_8_BIT_DATA)) {
|
||||
|
@ -12,6 +12,7 @@ struct omap2_hsmmc_info {
|
||||
u8 mmc; /* controller 1/2/3 */
|
||||
u32 caps; /* 4/8 wires and any additional host
|
||||
* capabilities OR'd (ref. linux/mmc/host.h) */
|
||||
u32 pm_caps; /* PM capabilities */
|
||||
bool transceiver; /* MMC-2 option */
|
||||
bool ext_clock; /* use external pin for input clock */
|
||||
bool cover_only; /* No card detect - just cover switch */
|
||||
|
@ -96,6 +96,7 @@ struct omap_mmc_platform_data {
|
||||
*/
|
||||
u8 wires; /* Used for the MMC driver on omap1 and 2420 */
|
||||
u32 caps; /* Used for the MMC driver on 2430 and later */
|
||||
u32 pm_caps; /* PM capabilities of the mmc */
|
||||
|
||||
/*
|
||||
* nomux means "standard" muxing is wrong on this board, and
|
||||
|
@ -1988,6 +1988,8 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev)
|
||||
if (mmc_slot(host).nonremovable)
|
||||
mmc->caps |= MMC_CAP_NONREMOVABLE;
|
||||
|
||||
mmc->pm_caps = mmc_slot(host).pm_caps;
|
||||
|
||||
omap_hsmmc_conf_bus_power(host);
|
||||
|
||||
/* Select DMA lines */
|
||||
@ -2176,13 +2178,7 @@ static int omap_hsmmc_suspend(struct device *dev)
|
||||
cancel_work_sync(&host->mmc_carddetect_work);
|
||||
ret = mmc_suspend_host(host->mmc);
|
||||
|
||||
if (ret == 0) {
|
||||
omap_hsmmc_disable_irq(host);
|
||||
OMAP_HSMMC_WRITE(host->base, HCTL,
|
||||
OMAP_HSMMC_READ(host->base, HCTL) & ~SDBP);
|
||||
if (host->got_dbclk)
|
||||
clk_disable(host->dbclk);
|
||||
} else {
|
||||
if (ret) {
|
||||
host->suspended = 0;
|
||||
if (host->pdata->resume) {
|
||||
ret = host->pdata->resume(&pdev->dev,
|
||||
@ -2191,9 +2187,20 @@ static int omap_hsmmc_suspend(struct device *dev)
|
||||
dev_dbg(mmc_dev(host->mmc),
|
||||
"Unmask interrupt failed\n");
|
||||
}
|
||||
goto err;
|
||||
}
|
||||
pm_runtime_put_sync(host->dev);
|
||||
|
||||
if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER)) {
|
||||
omap_hsmmc_disable_irq(host);
|
||||
OMAP_HSMMC_WRITE(host->base, HCTL,
|
||||
OMAP_HSMMC_READ(host->base, HCTL) & ~SDBP);
|
||||
}
|
||||
if (host->got_dbclk)
|
||||
clk_disable(host->dbclk);
|
||||
|
||||
}
|
||||
err:
|
||||
pm_runtime_put_sync(host->dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -2213,7 +2220,8 @@ static int omap_hsmmc_resume(struct device *dev)
|
||||
if (host->got_dbclk)
|
||||
clk_enable(host->dbclk);
|
||||
|
||||
omap_hsmmc_conf_bus_power(host);
|
||||
if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER))
|
||||
omap_hsmmc_conf_bus_power(host);
|
||||
|
||||
if (host->pdata->resume) {
|
||||
ret = host->pdata->resume(&pdev->dev, host->slot_id);
|
||||
|
Loading…
Reference in New Issue
Block a user