* [PATCH V2 1/10] omap_hsmmc: Move gpio and regulator control from board file
2010-01-17 1:32 [PATCH V2 0/10] omap_hsmmc changes V2 Adrian Hunter
@ 2010-01-17 1:32 ` Adrian Hunter
2010-01-17 1:33 ` [PATCH V2 2/10] omap: Rename mmc-twl4030 files to hsmmc Adrian Hunter
` (9 subsequent siblings)
10 siblings, 0 replies; 21+ messages in thread
From: Adrian Hunter @ 2010-01-17 1:32 UTC (permalink / raw)
To: Tony Lindgren
Cc: Adrian Hunter, Madhusudhan Chikkature, Paul Walmsley,
linux-omap Mailing List, linux-mmc Mailing List, Andrew Morton
>From 4e67280a67a4ee532300e8cfba633766a4201a41 Mon Sep 17 00:00:00 2001
From: Adrian Hunter <adrian.hunter@nokia.com>
Date: Mon, 4 Jan 2010 13:44:36 +0200
Subject: [PATCH] omap_hsmmc: Move gpio and regulator control from board file
This patch moves the setup code for GPIO's and Voltage
Regulators from the board file mmc-twl4030.c to the
driver omap_hsmmc.c. PBIAS and other system control
configuration remains in the board file.
Moving GPIO code to the driver makes the board initialisation
code independent of when GPIO's are defined. That makes the
board initialisation now entirely independent of its original
twl4030 roots.
Moving Voltage Regulator code to the driver allows for further
development of regulator support in the core MMC code. It also
permits the MMC core to be compiled as a module, because the
board code no longer calls MMC core functions.
Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
---
arch/arm/configs/rx51_defconfig | 4 +-
arch/arm/mach-omap2/mmc-twl4030.c | 352 +++------------------------------
arch/arm/mach-omap2/mmc-twl4030.h | 4 +-
arch/arm/plat-omap/include/plat/mmc.h | 28 ++-
drivers/mmc/host/omap_hsmmc.c | 352 +++++++++++++++++++++++++++++++--
5 files changed, 391 insertions(+), 349 deletions(-)
diff --git a/arch/arm/configs/rx51_defconfig b/arch/arm/configs/rx51_defconfig
index b6eeebb..426ae94 100644
--- a/arch/arm/configs/rx51_defconfig
+++ b/arch/arm/configs/rx51_defconfig
@@ -1354,7 +1354,7 @@ CONFIG_USB_OTG_UTILS=y
# CONFIG_USB_GPIO_VBUS is not set
# CONFIG_ISP1301_OMAP is not set
CONFIG_TWL4030_USB=y
-CONFIG_MMC=y
+CONFIG_MMC=m
# CONFIG_MMC_DEBUG is not set
# CONFIG_MMC_UNSAFE_RESUME is not set
@@ -1362,7 +1362,7 @@ CONFIG_MMC=y
# MMC/SD/SDIO Card Drivers
#
CONFIG_MMC_BLOCK=m
-CONFIG_MMC_BLOCK_BOUNCE=y
+# CONFIG_MMC_BLOCK_BOUNCE is not set
# CONFIG_SDIO_UART is not set
# CONFIG_MMC_TEST is not set
diff --git a/arch/arm/mach-omap2/mmc-twl4030.c b/arch/arm/mach-omap2/mmc-twl4030.c
index 0c3c72d..9d5ad0b 100644
--- a/arch/arm/mach-omap2/mmc-twl4030.c
+++ b/arch/arm/mach-omap2/mmc-twl4030.c
@@ -9,26 +9,17 @@
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
-#include <linux/err.h>
-#include <linux/io.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/interrupt.h>
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/string.h>
#include <linux/delay.h>
-#include <linux/gpio.h>
-#include <linux/mmc/host.h>
-#include <linux/regulator/consumer.h>
-
#include <mach/hardware.h>
#include <plat/control.h>
#include <plat/mmc.h>
-#include <plat/board.h>
#include "mmc-twl4030.h"
-
-#if defined(CONFIG_REGULATOR) && \
- (defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE))
+#if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
static u16 control_pbias_offset;
static u16 control_devconf1_offset;
@@ -36,168 +27,9 @@ static u16 control_devconf1_offset;
#define HSMMC_NAME_LEN 9
static struct twl_mmc_controller {
- struct omap_mmc_platform_data *mmc;
- /* Vcc == configured supply
- * Vcc_alt == optional
- * - MMC1, supply for DAT4..DAT7
- * - MMC2/MMC2, external level shifter voltage supply, for
- * chip (SDIO, eMMC, etc) or transceiver (MMC2 only)
- */
- struct regulator *vcc;
- struct regulator *vcc_aux;
char name[HSMMC_NAME_LEN + 1];
} hsmmc[OMAP34XX_NR_MMC];
-static int twl_mmc_card_detect(int irq)
-{
- unsigned i;
-
- for (i = 0; i < ARRAY_SIZE(hsmmc); i++) {
- struct omap_mmc_platform_data *mmc;
-
- mmc = hsmmc[i].mmc;
- if (!mmc)
- continue;
- if (irq != mmc->slots[0].card_detect_irq)
- continue;
-
- /* NOTE: assumes card detect signal is active-low */
- return !gpio_get_value_cansleep(mmc->slots[0].switch_pin);
- }
- return -ENOSYS;
-}
-
-static int twl_mmc_get_ro(struct device *dev, int slot)
-{
- struct omap_mmc_platform_data *mmc = dev->platform_data;
-
- /* NOTE: assumes write protect signal is active-high */
- return gpio_get_value_cansleep(mmc->slots[0].gpio_wp);
-}
-
-static int twl_mmc_get_cover_state(struct device *dev, int slot)
-{
- struct omap_mmc_platform_data *mmc = dev->platform_data;
-
- /* NOTE: assumes card detect signal is active-low */
- return !gpio_get_value_cansleep(mmc->slots[0].switch_pin);
-}
-
-/*
- * MMC Slot Initialization.
- */
-static int twl_mmc_late_init(struct device *dev)
-{
- struct omap_mmc_platform_data *mmc = dev->platform_data;
- int ret = 0;
- int i;
-
- /* MMC/SD/SDIO doesn't require a card detect switch */
- if (gpio_is_valid(mmc->slots[0].switch_pin)) {
- ret = gpio_request(mmc->slots[0].switch_pin, "mmc_cd");
- if (ret)
- goto done;
- ret = gpio_direction_input(mmc->slots[0].switch_pin);
- if (ret)
- goto err;
- }
-
- /* require at least main regulator */
- for (i = 0; i < ARRAY_SIZE(hsmmc); i++) {
- if (hsmmc[i].name == mmc->slots[0].name) {
- struct regulator *reg;
-
- hsmmc[i].mmc = mmc;
-
- reg = regulator_get(dev, "vmmc");
- if (IS_ERR(reg)) {
- dev_dbg(dev, "vmmc regulator missing\n");
- /* HACK: until fixed.c regulator is usable,
- * we don't require a main regulator
- * for MMC2 or MMC3
- */
- if (i != 0)
- break;
- ret = PTR_ERR(reg);
- hsmmc[i].vcc = NULL;
- goto err;
- }
- hsmmc[i].vcc = reg;
- mmc->slots[0].ocr_mask = mmc_regulator_get_ocrmask(reg);
-
- /* allow an aux regulator */
- reg = regulator_get(dev, "vmmc_aux");
- hsmmc[i].vcc_aux = IS_ERR(reg) ? NULL : reg;
-
- /* UGLY HACK: workaround regulator framework bugs.
- * When the bootloader leaves a supply active, it's
- * initialized with zero usecount ... and we can't
- * disable it without first enabling it. Until the
- * framework is fixed, we need a workaround like this
- * (which is safe for MMC, but not in general).
- */
- if (regulator_is_enabled(hsmmc[i].vcc) > 0) {
- regulator_enable(hsmmc[i].vcc);
- regulator_disable(hsmmc[i].vcc);
- }
- if (hsmmc[i].vcc_aux) {
- if (regulator_is_enabled(reg) > 0) {
- regulator_enable(reg);
- regulator_disable(reg);
- }
- }
-
- break;
- }
- }
-
- return 0;
-
-err:
- gpio_free(mmc->slots[0].switch_pin);
-done:
- mmc->slots[0].card_detect_irq = 0;
- mmc->slots[0].card_detect = NULL;
-
- dev_err(dev, "err %d configuring card detect\n", ret);
- return ret;
-}
-
-static void twl_mmc_cleanup(struct device *dev)
-{
- struct omap_mmc_platform_data *mmc = dev->platform_data;
- int i;
-
- gpio_free(mmc->slots[0].switch_pin);
- for(i = 0; i < ARRAY_SIZE(hsmmc); i++) {
- regulator_put(hsmmc[i].vcc);
- regulator_put(hsmmc[i].vcc_aux);
- }
-}
-
-#ifdef CONFIG_PM
-
-static int twl_mmc_suspend(struct device *dev, int slot)
-{
- struct omap_mmc_platform_data *mmc = dev->platform_data;
-
- disable_irq(mmc->slots[0].card_detect_irq);
- return 0;
-}
-
-static int twl_mmc_resume(struct device *dev, int slot)
-{
- struct omap_mmc_platform_data *mmc = dev->platform_data;
-
- enable_irq(mmc->slots[0].card_detect_irq);
- return 0;
-}
-
-#else
-#define twl_mmc_suspend NULL
-#define twl_mmc_resume NULL
-#endif
-
#if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM)
static int twl4030_mmc_get_context_loss(struct device *dev)
@@ -210,12 +42,10 @@ static int twl4030_mmc_get_context_loss(struct device *dev)
#define twl4030_mmc_get_context_loss NULL
#endif
-static int twl_mmc1_set_power(struct device *dev, int slot, int power_on,
- int vdd)
+static void hsmmc1_before_set_reg(struct device *dev, int slot,
+ int power_on, int vdd)
{
u32 reg, prog_io;
- int ret = 0;
- struct twl_mmc_controller *c = &hsmmc[0];
struct omap_mmc_platform_data *mmc = dev->platform_data;
/*
@@ -255,11 +85,22 @@ static int twl_mmc1_set_power(struct device *dev, int slot, int power_on,
}
reg &= ~OMAP2_PBIASLITEPWRDNZ0;
omap_ctrl_writel(reg, control_pbias_offset);
+ } else {
+ reg = omap_ctrl_readl(control_pbias_offset);
+ reg &= ~OMAP2_PBIASLITEPWRDNZ0;
+ omap_ctrl_writel(reg, control_pbias_offset);
+ }
+}
- ret = mmc_regulator_set_ocr(c->vcc, vdd);
+static void hsmmc1_after_set_reg(struct device *dev, int slot,
+ int power_on, int vdd)
+{
+ u32 reg;
+
+ /* 100ms delay required for PBIAS configuration */
+ msleep(100);
- /* 100ms delay required for PBIAS configuration */
- msleep(100);
+ if (power_on) {
reg = omap_ctrl_readl(control_pbias_offset);
reg |= (OMAP2_PBIASLITEPWRDNZ0 | OMAP2_PBIASSPEEDCTRL0);
if ((1 << vdd) <= MMC_VDD_165_195)
@@ -269,60 +110,19 @@ static int twl_mmc1_set_power(struct device *dev, int slot, int power_on,
omap_ctrl_writel(reg, control_pbias_offset);
} else {
reg = omap_ctrl_readl(control_pbias_offset);
- reg &= ~OMAP2_PBIASLITEPWRDNZ0;
- omap_ctrl_writel(reg, control_pbias_offset);
-
- ret = mmc_regulator_set_ocr(c->vcc, 0);
-
- /* 100ms delay required for PBIAS configuration */
- msleep(100);
- reg = omap_ctrl_readl(control_pbias_offset);
reg |= (OMAP2_PBIASSPEEDCTRL0 | OMAP2_PBIASLITEPWRDNZ0 |
OMAP2_PBIASLITEVMODE0);
omap_ctrl_writel(reg, control_pbias_offset);
}
-
- return ret;
}
-static int twl_mmc23_set_power(struct device *dev, int slot, int power_on, int vdd)
+static void hsmmc23_before_set_reg(struct device *dev, int slot,
+ int power_on, int vdd)
{
- int ret = 0;
- struct twl_mmc_controller *c = NULL;
struct omap_mmc_platform_data *mmc = dev->platform_data;
- int i;
-
- for (i = 1; i < ARRAY_SIZE(hsmmc); i++) {
- if (mmc == hsmmc[i].mmc) {
- c = &hsmmc[i];
- break;
- }
- }
-
- if (c == NULL)
- return -ENODEV;
- /* If we don't see a Vcc regulator, assume it's a fixed
- * voltage always-on regulator.
- */
- if (!c->vcc)
- return 0;
-
- /*
- * Assume Vcc regulator is used only to power the card ... OMAP
- * VDDS is used to power the pins, optionally with a transceiver to
- * support cards using voltages other than VDDS (1.8V nominal). When a
- * transceiver is used, DAT3..7 are muxed as transceiver control pins.
- *
- * In some cases this regulator won't support enable/disable;
- * e.g. it's a fixed rail for a WLAN chip.
- *
- * In other cases vcc_aux switches interface power. Example, for
- * eMMC cards it represents VccQ. Sometimes transceivers or SDIO
- * chips/cards need an interface voltage rail too.
- */
if (power_on) {
- /* only MMC2 supports a CLKIN */
+ /* Only MMC2 supports a CLKIN */
if (mmc->slots[0].internal_clock) {
u32 reg;
@@ -330,76 +130,7 @@ static int twl_mmc23_set_power(struct device *dev, int slot, int power_on, int v
reg |= OMAP2_MMCSDIO2ADPCLKISEL;
omap_ctrl_writel(reg, control_devconf1_offset);
}
- ret = mmc_regulator_set_ocr(c->vcc, vdd);
- /* enable interface voltage rail, if needed */
- if (ret == 0 && c->vcc_aux) {
- ret = regulator_enable(c->vcc_aux);
- if (ret < 0)
- ret = mmc_regulator_set_ocr(c->vcc, 0);
- }
- } else {
- if (c->vcc_aux && (ret = regulator_is_enabled(c->vcc_aux)) > 0)
- ret = regulator_disable(c->vcc_aux);
- if (ret == 0)
- ret = mmc_regulator_set_ocr(c->vcc, 0);
- }
-
- return ret;
-}
-
-static int twl_mmc1_set_sleep(struct device *dev, int slot, int sleep, int vdd,
- int cardsleep)
-{
- struct twl_mmc_controller *c = &hsmmc[0];
- int mode = sleep ? REGULATOR_MODE_STANDBY : REGULATOR_MODE_NORMAL;
-
- return regulator_set_mode(c->vcc, mode);
-}
-
-static int twl_mmc23_set_sleep(struct device *dev, int slot, int sleep, int vdd,
- int cardsleep)
-{
- struct twl_mmc_controller *c = NULL;
- struct omap_mmc_platform_data *mmc = dev->platform_data;
- int i, err, mode;
-
- for (i = 1; i < ARRAY_SIZE(hsmmc); i++) {
- if (mmc == hsmmc[i].mmc) {
- c = &hsmmc[i];
- break;
- }
}
-
- if (c == NULL)
- return -ENODEV;
-
- /*
- * If we don't see a Vcc regulator, assume it's a fixed
- * voltage always-on regulator.
- */
- if (!c->vcc)
- return 0;
-
- mode = sleep ? REGULATOR_MODE_STANDBY : REGULATOR_MODE_NORMAL;
-
- if (!c->vcc_aux)
- return regulator_set_mode(c->vcc, mode);
-
- if (cardsleep) {
- /* VCC can be turned off if card is asleep */
- struct regulator *vcc_aux = c->vcc_aux;
-
- c->vcc_aux = NULL;
- if (sleep)
- err = twl_mmc23_set_power(dev, slot, 0, 0);
- else
- err = twl_mmc23_set_power(dev, slot, 1, vdd);
- c->vcc_aux = vcc_aux;
- } else
- err = regulator_set_mode(c->vcc, mode);
- if (err)
- return err;
- return regulator_set_mode(c->vcc_aux, mode);
}
static struct omap_mmc_platform_data *hsmmc_data[OMAP34XX_NR_MMC] __initdata;
@@ -412,7 +143,6 @@ void __init twl4030_mmc_init(struct twl4030_hsmmc_info *controllers)
if (cpu_is_omap2430()) {
control_pbias_offset = OMAP243X_CONTROL_PBIAS_LITE;
control_devconf1_offset = OMAP243X_CONTROL_DEVCONF1;
- nr_hsmmc = 2;
} else {
control_pbias_offset = OMAP343X_CONTROL_PBIAS_LITE;
control_devconf1_offset = OMAP343X_CONTROL_DEVCONF1;
@@ -447,35 +177,15 @@ void __init twl4030_mmc_init(struct twl4030_hsmmc_info *controllers)
mmc->slots[0].wires = c->wires;
mmc->slots[0].internal_clock = !c->ext_clock;
mmc->dma_mask = 0xffffffff;
- mmc->init = twl_mmc_late_init;
-
- /* note: twl4030 card detect GPIOs can disable VMMCx ... */
- if (gpio_is_valid(c->gpio_cd)) {
- mmc->cleanup = twl_mmc_cleanup;
- mmc->suspend = twl_mmc_suspend;
- mmc->resume = twl_mmc_resume;
-
- mmc->slots[0].switch_pin = c->gpio_cd;
- mmc->slots[0].card_detect_irq = gpio_to_irq(c->gpio_cd);
- if (c->cover_only)
- mmc->slots[0].get_cover_state = twl_mmc_get_cover_state;
- else
- mmc->slots[0].card_detect = twl_mmc_card_detect;
- } else
- mmc->slots[0].switch_pin = -EINVAL;
mmc->get_context_loss_count =
twl4030_mmc_get_context_loss;
- /* write protect normally uses an OMAP gpio */
- if (gpio_is_valid(c->gpio_wp)) {
- gpio_request(c->gpio_wp, "mmc_wp");
- gpio_direction_input(c->gpio_wp);
+ mmc->slots[0].switch_pin = c->gpio_cd;
+ mmc->slots[0].gpio_wp = c->gpio_wp;
- mmc->slots[0].gpio_wp = c->gpio_wp;
- mmc->slots[0].get_ro = twl_mmc_get_ro;
- } else
- mmc->slots[0].gpio_wp = -EINVAL;
+ if (c->cover_only)
+ mmc->slots[0].cover = 1;
if (c->nonremovable)
mmc->slots[0].nonremovable = 1;
@@ -494,8 +204,8 @@ void __init twl4030_mmc_init(struct twl4030_hsmmc_info *controllers)
switch (c->mmc) {
case 1:
/* on-chip level shifting via PBIAS0/PBIAS1 */
- mmc->slots[0].set_power = twl_mmc1_set_power;
- mmc->slots[0].set_sleep = twl_mmc1_set_sleep;
+ mmc->slots[0].before_set_reg = hsmmc1_before_set_reg;
+ mmc->slots[0].after_set_reg = hsmmc1_after_set_reg;
/* Omap3630 HSMMC1 supports only 4-bit */
if (cpu_is_omap3630() && c->wires > 4) {
@@ -511,8 +221,8 @@ void __init twl4030_mmc_init(struct twl4030_hsmmc_info *controllers)
/* FALLTHROUGH */
case 3:
/* off-chip level shifting, or none */
- mmc->slots[0].set_power = twl_mmc23_set_power;
- mmc->slots[0].set_sleep = twl_mmc23_set_sleep;
+ mmc->slots[0].before_set_reg = hsmmc23_before_set_reg;
+ mmc->slots[0].after_set_reg = NULL;
break;
default:
pr_err("MMC%d configuration not supported!\n", c->mmc);
diff --git a/arch/arm/mach-omap2/mmc-twl4030.h b/arch/arm/mach-omap2/mmc-twl4030.h
index a47e685..87d67c1 100644
--- a/arch/arm/mach-omap2/mmc-twl4030.h
+++ b/arch/arm/mach-omap2/mmc-twl4030.h
@@ -21,9 +21,7 @@ struct twl4030_hsmmc_info {
int ocr_mask; /* temporary HACK */
};
-#if defined(CONFIG_REGULATOR) && \
- (defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) || \
- defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE))
+#if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
void twl4030_mmc_init(struct twl4030_hsmmc_info *);
diff --git a/arch/arm/plat-omap/include/plat/mmc.h b/arch/arm/plat-omap/include/plat/mmc.h
index 2993713..515701b 100644
--- a/arch/arm/plat-omap/include/plat/mmc.h
+++ b/arch/arm/plat-omap/include/plat/mmc.h
@@ -55,12 +55,12 @@ struct omap_mmc_platform_data {
unsigned int max_freq;
/* switch the bus to a new slot */
- int (* switch_slot)(struct device *dev, int slot);
+ int (*switch_slot)(struct device *dev, int slot);
/* initialize board-specific MMC functionality, can be NULL if
* not supported */
- int (* init)(struct device *dev);
- void (* cleanup)(struct device *dev);
- void (* shutdown)(struct device *dev);
+ int (*init)(struct device *dev);
+ void (*cleanup)(struct device *dev);
+ void (*shutdown)(struct device *dev);
/* To handle board related suspend/resume functionality for MMC */
int (*suspend)(struct device *dev, int slot);
@@ -99,11 +99,18 @@ struct omap_mmc_platform_data {
int switch_pin; /* gpio (card detect) */
int gpio_wp; /* gpio (write protect) */
- int (* set_bus_mode)(struct device *dev, int slot, int bus_mode);
- int (* set_power)(struct device *dev, int slot, int power_on, int vdd);
- int (* get_ro)(struct device *dev, int slot);
+ int (*set_bus_mode)(struct device *dev, int slot, int bus_mode);
+ int (*set_power)(struct device *dev, int slot,
+ int power_on, int vdd);
+ int (*get_ro)(struct device *dev, int slot);
int (*set_sleep)(struct device *dev, int slot, int sleep,
int vdd, int cardsleep);
+ /* Call back before enabling / disabling regulators */
+ void (*before_set_reg)(struct device *dev, int slot,
+ int power_on, int vdd);
+ /* Call back after enabling / disabling regulators */
+ void (*after_set_reg)(struct device *dev, int slot,
+ int power_on, int vdd);
/* return MMC cover switch state, can be NULL if not supported.
*
@@ -111,14 +118,14 @@ struct omap_mmc_platform_data {
* 0 - closed
* 1 - open
*/
- int (* get_cover_state)(struct device *dev, int slot);
+ int (*get_cover_state)(struct device *dev, int slot);
const char *name;
u32 ocr_mask;
/* Card detection IRQs */
int card_detect_irq;
- int (* card_detect)(int irq);
+ int (*card_detect)(struct device *dev, int slot);
unsigned int ban_openended:1;
@@ -126,7 +133,8 @@ struct omap_mmc_platform_data {
};
/* called from board-specific card detection service routine */
-extern void omap_mmc_notify_cover_event(struct device *dev, int slot, int is_closed);
+extern void omap_mmc_notify_cover_event(struct device *dev, int slot,
+ int is_closed);
#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) || \
defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 4b23225..2c5e15d 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -30,6 +30,8 @@
#include <linux/mmc/core.h>
#include <linux/io.h>
#include <linux/semaphore.h>
+#include <linux/gpio.h>
+#include <linux/regulator/consumer.h>
#include <plat/dma.h>
#include <mach/hardware.h>
#include <plat/board.h>
@@ -146,6 +148,15 @@ struct omap_hsmmc_host {
struct clk *fclk;
struct clk *iclk;
struct clk *dbclk;
+ /*
+ * vcc == configured supply
+ * vcc_aux == optional
+ * - MMC1, supply for DAT4..DAT7
+ * - MMC2/MMC2, external level shifter voltage supply, for
+ * chip (SDIO, eMMC, etc) or transceiver (MMC2 only)
+ */
+ struct regulator *vcc;
+ struct regulator *vcc_aux;
struct semaphore sem;
struct work_struct mmc_carddetect_work;
void __iomem *base;
@@ -171,10 +182,308 @@ struct omap_hsmmc_host {
int vdd;
int protect_card;
int reqs_blocked;
+ int use_reg;
struct omap_mmc_platform_data *pdata;
};
+static int omap_hsmmc_card_detect(struct device *dev, int slot)
+{
+ struct omap_mmc_platform_data *mmc = dev->platform_data;
+
+ /* NOTE: assumes card detect signal is active-low */
+ return !gpio_get_value_cansleep(mmc->slots[0].switch_pin);
+}
+
+static int omap_hsmmc_get_wp(struct device *dev, int slot)
+{
+ struct omap_mmc_platform_data *mmc = dev->platform_data;
+
+ /* NOTE: assumes write protect signal is active-high */
+ return gpio_get_value_cansleep(mmc->slots[0].gpio_wp);
+}
+
+static int omap_hsmmc_get_cover_state(struct device *dev, int slot)
+{
+ struct omap_mmc_platform_data *mmc = dev->platform_data;
+
+ /* NOTE: assumes card detect signal is active-low */
+ return !gpio_get_value_cansleep(mmc->slots[0].switch_pin);
+}
+
+#ifdef CONFIG_PM
+
+static int omap_hsmmc_suspend_cdirq(struct device *dev, int slot)
+{
+ struct omap_mmc_platform_data *mmc = dev->platform_data;
+
+ disable_irq(mmc->slots[0].card_detect_irq);
+ return 0;
+}
+
+static int omap_hsmmc_resume_cdirq(struct device *dev, int slot)
+{
+ struct omap_mmc_platform_data *mmc = dev->platform_data;
+
+ enable_irq(mmc->slots[0].card_detect_irq);
+ return 0;
+}
+
+#else
+
+#define omap_hsmmc_suspend_cdirq NULL
+#define omap_hsmmc_resume_cdirq NULL
+
+#endif
+
+static int omap_hsmmc_1_set_power(struct device *dev, int slot, int power_on,
+ int vdd)
+{
+ struct omap_hsmmc_host *host =
+ platform_get_drvdata(to_platform_device(dev));
+ int ret;
+
+ if (mmc_slot(host).before_set_reg)
+ mmc_slot(host).before_set_reg(dev, slot, power_on, vdd);
+
+ if (power_on)
+ ret = mmc_regulator_set_ocr(host->vcc, vdd);
+ else
+ ret = mmc_regulator_set_ocr(host->vcc, 0);
+
+ if (mmc_slot(host).after_set_reg)
+ mmc_slot(host).after_set_reg(dev, slot, power_on, vdd);
+
+ return ret;
+}
+
+static int omap_hsmmc_23_set_power(struct device *dev, int slot, int power_on,
+ int vdd)
+{
+ struct omap_hsmmc_host *host =
+ platform_get_drvdata(to_platform_device(dev));
+ int ret = 0;
+
+ /*
+ * If we don't see a Vcc regulator, assume it's a fixed
+ * voltage always-on regulator.
+ */
+ if (!host->vcc)
+ return 0;
+
+ if (mmc_slot(host).before_set_reg)
+ mmc_slot(host).before_set_reg(dev, slot, power_on, vdd);
+
+ /*
+ * Assume Vcc regulator is used only to power the card ... OMAP
+ * VDDS is used to power the pins, optionally with a transceiver to
+ * support cards using voltages other than VDDS (1.8V nominal). When a
+ * transceiver is used, DAT3..7 are muxed as transceiver control pins.
+ *
+ * In some cases this regulator won't support enable/disable;
+ * e.g. it's a fixed rail for a WLAN chip.
+ *
+ * In other cases vcc_aux switches interface power. Example, for
+ * eMMC cards it represents VccQ. Sometimes transceivers or SDIO
+ * chips/cards need an interface voltage rail too.
+ */
+ if (power_on) {
+ ret = mmc_regulator_set_ocr(host->vcc, vdd);
+ /* Enable interface voltage rail, if needed */
+ if (ret == 0 && host->vcc_aux) {
+ ret = regulator_enable(host->vcc_aux);
+ if (ret < 0)
+ ret = mmc_regulator_set_ocr(host->vcc, 0);
+ }
+ } else {
+ if (host->vcc_aux) {
+ ret = regulator_is_enabled(host->vcc_aux);
+ if (ret > 0)
+ ret = regulator_disable(host->vcc_aux);
+ }
+ if (ret == 0)
+ ret = mmc_regulator_set_ocr(host->vcc, 0);
+ }
+
+ if (mmc_slot(host).after_set_reg)
+ mmc_slot(host).after_set_reg(dev, slot, power_on, vdd);
+
+ return ret;
+}
+
+static int omap_hsmmc_1_set_sleep(struct device *dev, int slot, int sleep,
+ int vdd, int cardsleep)
+{
+ struct omap_hsmmc_host *host =
+ platform_get_drvdata(to_platform_device(dev));
+ int mode = sleep ? REGULATOR_MODE_STANDBY : REGULATOR_MODE_NORMAL;
+
+ return regulator_set_mode(host->vcc, mode);
+}
+
+static int omap_hsmmc_23_set_sleep(struct device *dev, int slot, int sleep,
+ int vdd, int cardsleep)
+{
+ struct omap_hsmmc_host *host =
+ platform_get_drvdata(to_platform_device(dev));
+ int err, mode;
+
+ /*
+ * If we don't see a Vcc regulator, assume it's a fixed
+ * voltage always-on regulator.
+ */
+ if (!host->vcc)
+ return 0;
+
+ mode = sleep ? REGULATOR_MODE_STANDBY : REGULATOR_MODE_NORMAL;
+
+ if (!host->vcc_aux)
+ return regulator_set_mode(host->vcc, mode);
+
+ if (cardsleep) {
+ /* VCC can be turned off if card is asleep */
+ if (sleep)
+ err = mmc_regulator_set_ocr(host->vcc, 0);
+ else
+ err = mmc_regulator_set_ocr(host->vcc, vdd);
+ } else
+ err = regulator_set_mode(host->vcc, mode);
+ if (err)
+ return err;
+ return regulator_set_mode(host->vcc_aux, mode);
+}
+
+static int omap_hsmmc_gpio_init(struct omap_mmc_platform_data *pdata)
+{
+ int ret;
+
+ if (gpio_is_valid(pdata->slots[0].switch_pin)) {
+ pdata->suspend = omap_hsmmc_suspend_cdirq;
+ pdata->resume = omap_hsmmc_resume_cdirq;
+ if (pdata->slots[0].cover)
+ pdata->slots[0].get_cover_state =
+ omap_hsmmc_get_cover_state;
+ else
+ pdata->slots[0].card_detect = omap_hsmmc_card_detect;
+ pdata->slots[0].card_detect_irq =
+ gpio_to_irq(pdata->slots[0].switch_pin);
+ ret = gpio_request(pdata->slots[0].switch_pin, "mmc_cd");
+ if (ret)
+ return ret;
+ ret = gpio_direction_input(pdata->slots[0].switch_pin);
+ if (ret)
+ goto err_free_sp;
+ } else
+ pdata->slots[0].switch_pin = -EINVAL;
+
+ if (gpio_is_valid(pdata->slots[0].gpio_wp)) {
+ pdata->slots[0].get_ro = omap_hsmmc_get_wp;
+ ret = gpio_request(pdata->slots[0].gpio_wp, "mmc_wp");
+ if (ret)
+ goto err_free_cd;
+ ret = gpio_direction_input(pdata->slots[0].gpio_wp);
+ if (ret)
+ goto err_free_wp;
+ } else
+ pdata->slots[0].gpio_wp = -EINVAL;
+
+ return 0;
+
+err_free_wp:
+ gpio_free(pdata->slots[0].gpio_wp);
+err_free_cd:
+ if (gpio_is_valid(pdata->slots[0].switch_pin))
+err_free_sp:
+ gpio_free(pdata->slots[0].switch_pin);
+ return ret;
+}
+
+static void omap_hsmmc_gpio_free(struct omap_mmc_platform_data *pdata)
+{
+ if (gpio_is_valid(pdata->slots[0].gpio_wp))
+ gpio_free(pdata->slots[0].gpio_wp);
+ if (gpio_is_valid(pdata->slots[0].switch_pin))
+ gpio_free(pdata->slots[0].switch_pin);
+}
+
+static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
+{
+ struct regulator *reg;
+ int ret = 0;
+
+ switch (host->id) {
+ case OMAP_MMC1_DEVID:
+ /* On-chip level shifting via PBIAS0/PBIAS1 */
+ mmc_slot(host).set_power = omap_hsmmc_1_set_power;
+ mmc_slot(host).set_sleep = omap_hsmmc_1_set_sleep;
+ break;
+ case OMAP_MMC2_DEVID:
+ case OMAP_MMC3_DEVID:
+ /* Off-chip level shifting, or none */
+ mmc_slot(host).set_power = omap_hsmmc_23_set_power;
+ mmc_slot(host).set_sleep = omap_hsmmc_23_set_sleep;
+ break;
+ default:
+ pr_err("MMC%d configuration not supported!\n", host->id);
+ return -EINVAL;
+ }
+
+ reg = regulator_get(host->dev, "vmmc");
+ if (IS_ERR(reg)) {
+ dev_dbg(host->dev, "vmmc regulator missing\n");
+ /*
+ * HACK: until fixed.c regulator is usable,
+ * we don't require a main regulator
+ * for MMC2 or MMC3
+ */
+ if (host->id == OMAP_MMC1_DEVID) {
+ ret = PTR_ERR(reg);
+ goto err;
+ }
+ } else {
+ host->vcc = reg;
+ mmc_slot(host).ocr_mask = mmc_regulator_get_ocrmask(reg);
+
+ /* Allow an aux regulator */
+ reg = regulator_get(host->dev, "vmmc_aux");
+ host->vcc_aux = IS_ERR(reg) ? NULL : reg;
+
+ /*
+ * UGLY HACK: workaround regulator framework bugs.
+ * When the bootloader leaves a supply active, it's
+ * initialized with zero usecount ... and we can't
+ * disable it without first enabling it. Until the
+ * framework is fixed, we need a workaround like this
+ * (which is safe for MMC, but not in general).
+ */
+ if (regulator_is_enabled(host->vcc) > 0) {
+ regulator_enable(host->vcc);
+ regulator_disable(host->vcc);
+ }
+ if (host->vcc_aux) {
+ if (regulator_is_enabled(reg) > 0) {
+ regulator_enable(reg);
+ regulator_disable(reg);
+ }
+ }
+ }
+
+ return 0;
+
+err:
+ mmc_slot(host).set_power = NULL;
+ mmc_slot(host).set_sleep = NULL;
+ return ret;
+}
+
+static void omap_hsmmc_reg_put(struct omap_hsmmc_host *host)
+{
+ regulator_put(host->vcc);
+ regulator_put(host->vcc_aux);
+ mmc_slot(host).set_power = NULL;
+ mmc_slot(host).set_sleep = NULL;
+}
+
/*
* Stop clock to the card
*/
@@ -835,7 +1144,7 @@ static void omap_hsmmc_detect(struct work_struct *work)
sysfs_notify(&host->mmc->class_dev.kobj, NULL, "cover_switch");
if (slot->card_detect)
- carddetect = slot->card_detect(slot->card_detect_irq);
+ carddetect = slot->card_detect(host->dev, host->slot_id);
else {
omap_hsmmc_protect_card(host);
carddetect = -ENOSYS;
@@ -1242,7 +1551,7 @@ static int omap_hsmmc_get_cd(struct mmc_host *mmc)
if (!mmc_slot(host).card_detect)
return -ENOSYS;
- return mmc_slot(host).card_detect(mmc_slot(host).card_detect_irq);
+ return mmc_slot(host).card_detect(host->dev, host->slot_id);
}
static int omap_hsmmc_get_ro(struct mmc_host *mmc)
@@ -1616,7 +1925,7 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev)
struct mmc_host *mmc;
struct omap_hsmmc_host *host = NULL;
struct resource *res;
- int ret = 0, irq;
+ int ret, irq;
if (pdata == NULL) {
dev_err(&pdev->dev, "Platform Data is missing\n");
@@ -1638,10 +1947,14 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev)
if (res == NULL)
return -EBUSY;
+ ret = omap_hsmmc_gpio_init(pdata);
+ if (ret)
+ goto err;
+
mmc = mmc_alloc_host(sizeof(struct omap_hsmmc_host), &pdev->dev);
if (!mmc) {
ret = -ENOMEM;
- goto err;
+ goto err_alloc;
}
host = mmc_priv(mmc);
@@ -1781,7 +2094,6 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev)
goto err_irq;
}
- /* initialize power supplies, gpios, etc */
if (pdata->init != NULL) {
if (pdata->init(&pdev->dev) != 0) {
dev_dbg(mmc_dev(host->mmc),
@@ -1789,6 +2101,14 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev)
goto err_irq_cd_init;
}
}
+
+ if (!mmc_slot(host).set_power) {
+ ret = omap_hsmmc_reg_get(host);
+ if (ret)
+ goto err_reg;
+ host->use_reg = 1;
+ }
+
mmc->ocr_avail = mmc_slot(host).ocr_mask;
/* Request IRQ for card detect */
@@ -1823,19 +2143,22 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev)
ret = device_create_file(&mmc->class_dev,
&dev_attr_cover_switch);
if (ret < 0)
- goto err_cover_switch;
+ goto err_slot_name;
}
omap_hsmmc_debugfs(mmc);
return 0;
-err_cover_switch:
- device_remove_file(&mmc->class_dev, &dev_attr_cover_switch);
err_slot_name:
mmc_remove_host(mmc);
-err_irq_cd:
free_irq(mmc_slot(host).card_detect_irq, host);
+err_irq_cd:
+ if (host->use_reg)
+ omap_hsmmc_reg_put(host);
+err_reg:
+ if (host->pdata->cleanup)
+ host->pdata->cleanup(&pdev->dev);
err_irq_cd_init:
free_irq(host->irq, host);
err_irq:
@@ -1847,14 +2170,14 @@ err_irq:
clk_disable(host->dbclk);
clk_put(host->dbclk);
}
-
err1:
iounmap(host->base);
+ platform_set_drvdata(pdev, NULL);
+ mmc_free_host(mmc);
+err_alloc:
+ omap_hsmmc_gpio_free(pdata);
err:
- dev_dbg(mmc_dev(host->mmc), "Probe Failed\n");
release_mem_region(res->start, res->end - res->start + 1);
- if (host)
- mmc_free_host(mmc);
return ret;
}
@@ -1866,6 +2189,8 @@ static int omap_hsmmc_remove(struct platform_device *pdev)
if (host) {
mmc_host_enable(host->mmc);
mmc_remove_host(host->mmc);
+ if (host->use_reg)
+ omap_hsmmc_reg_put(host);
if (host->pdata->cleanup)
host->pdata->cleanup(&pdev->dev);
free_irq(host->irq, host);
@@ -1884,6 +2209,7 @@ static int omap_hsmmc_remove(struct platform_device *pdev)
mmc_free_host(host->mmc);
iounmap(host->base);
+ omap_hsmmc_gpio_free(pdev->dev.platform_data);
}
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
--
1.6.0.4
^ permalink raw reply related [flat|nested] 21+ messages in thread* [PATCH V2 2/10] omap: Rename mmc-twl4030 files to hsmmc
2010-01-17 1:32 [PATCH V2 0/10] omap_hsmmc changes V2 Adrian Hunter
2010-01-17 1:32 ` [PATCH V2 1/10] omap_hsmmc: Move gpio and regulator control from board file Adrian Hunter
@ 2010-01-17 1:33 ` Adrian Hunter
2010-01-20 23:41 ` Madhusudhan
2010-01-17 1:33 ` [PATCH V2 3/10] omap: Rename hsmmc symbols to reflect independence from twl4030 Adrian Hunter
` (8 subsequent siblings)
10 siblings, 1 reply; 21+ messages in thread
From: Adrian Hunter @ 2010-01-17 1:33 UTC (permalink / raw)
To: Tony Lindgren
Cc: Adrian Hunter, Madhusudhan Chikkature, Paul Walmsley,
linux-omap Mailing List, linux-mmc Mailing List, Andrew Morton
>From a65fae702aa81d4596d6fbefd2ab3c8ea87c244a Mon Sep 17 00:00:00 2001
From: Adrian Hunter <adrian.hunter@nokia.com>
Date: Sun, 17 Jan 2010 02:34:22 +0200
Subject: [PATCH] omap: Rename mmc-twl4030 files to hsmmc
mmc-twl4030.[ch] no longer has any dependency on twl4030
and should be renamed to reflect that.
Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
---
arch/arm/mach-omap2/Makefile | 28 ++--
arch/arm/mach-omap2/board-2430sdp.c | 2 +-
arch/arm/mach-omap2/board-3430sdp.c | 2 +-
arch/arm/mach-omap2/board-cm-t35.c | 2 +-
arch/arm/mach-omap2/board-igep0020.c | 2 +-
arch/arm/mach-omap2/board-ldp.c | 2 +-
arch/arm/mach-omap2/board-omap3beagle.c | 2 +-
arch/arm/mach-omap2/board-omap3evm.c | 2 +-
arch/arm/mach-omap2/board-omap3pandora.c | 2 +-
arch/arm/mach-omap2/board-omap3touchbook.c | 2 +-
arch/arm/mach-omap2/board-overo.c | 2 +-
arch/arm/mach-omap2/board-rx51-peripherals.c | 2 +-
arch/arm/mach-omap2/board-zoom-peripherals.c | 2 +-
arch/arm/mach-omap2/hsmmc.c | 247 ++++++++++++++++++++++++++
arch/arm/mach-omap2/hsmmc.h | 34 ++++
arch/arm/mach-omap2/mmc-twl4030.c | 247 --------------------------
arch/arm/mach-omap2/mmc-twl4030.h | 34 ----
17 files changed, 307 insertions(+), 307 deletions(-)
create mode 100644 arch/arm/mach-omap2/hsmmc.c
create mode 100644 arch/arm/mach-omap2/hsmmc.h
delete mode 100644 arch/arm/mach-omap2/mmc-twl4030.c
delete mode 100644 arch/arm/mach-omap2/mmc-twl4030.h
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
index b32678b..a7e4c5a 100644
--- a/arch/arm/mach-omap2/Makefile
+++ b/arch/arm/mach-omap2/Makefile
@@ -71,42 +71,42 @@ obj-y += $(i2c-omap-m) $(i2c-omap-y)
obj-$(CONFIG_MACH_OMAP_GENERIC) += board-generic.o
obj-$(CONFIG_MACH_OMAP_H4) += board-h4.o
obj-$(CONFIG_MACH_OMAP_2430SDP) += board-2430sdp.o \
- mmc-twl4030.o
+ hsmmc.o
obj-$(CONFIG_MACH_OMAP_APOLLON) += board-apollon.o
obj-$(CONFIG_MACH_OMAP3_BEAGLE) += board-omap3beagle.o \
- mmc-twl4030.o
+ hsmmc.o
obj-$(CONFIG_MACH_OMAP_LDP) += board-ldp.o \
- mmc-twl4030.o
+ hsmmc.o
obj-$(CONFIG_MACH_OVERO) += board-overo.o \
- mmc-twl4030.o
+ hsmmc.o
obj-$(CONFIG_MACH_OMAP3EVM) += board-omap3evm.o \
- mmc-twl4030.o
+ hsmmc.o
obj-$(CONFIG_MACH_OMAP3_PANDORA) += board-omap3pandora.o \
- mmc-twl4030.o
+ hsmmc.o
obj-$(CONFIG_MACH_OMAP_3430SDP) += board-3430sdp.o \
- mmc-twl4030.o
+ hsmmc.o
obj-$(CONFIG_MACH_NOKIA_N8X0) += board-n8x0.o
obj-$(CONFIG_MACH_NOKIA_RX51) += board-rx51.o \
board-rx51-sdram.o \
board-rx51-peripherals.o \
- mmc-twl4030.o
+ hsmmc.o
obj-$(CONFIG_MACH_OMAP_ZOOM2) += board-zoom2.o \
board-zoom-peripherals.o \
- mmc-twl4030.o \
+ hsmmc.o \
board-zoom-debugboard.o
obj-$(CONFIG_MACH_OMAP_ZOOM3) += board-zoom3.o \
board-zoom-peripherals.o \
- mmc-twl4030.o \
+ hsmmc.o \
board-zoom-debugboard.o
obj-$(CONFIG_MACH_OMAP_3630SDP) += board-3630sdp.o \
board-zoom-peripherals.o \
- mmc-twl4030.o
+ hsmmc.o
obj-$(CONFIG_MACH_CM_T35) += board-cm-t35.o \
- mmc-twl4030.o
+ hsmmc.o
obj-$(CONFIG_MACH_IGEP0020) += board-igep0020.o \
- mmc-twl4030.o
+ hsmmc.o
obj-$(CONFIG_MACH_OMAP3_TOUCHBOOK) += board-omap3touchbook.o \
- mmc-twl4030.o
+ hsmmc.o
obj-$(CONFIG_MACH_OMAP_4430SDP) += board-4430sdp.o
obj-$(CONFIG_MACH_OMAP3517EVM) += board-am3517evm.o
diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-omap2/board-2430sdp.c
index 31042ee..e42848d 100644
--- a/arch/arm/mach-omap2/board-2430sdp.c
+++ b/arch/arm/mach-omap2/board-2430sdp.c
@@ -38,7 +38,7 @@
#include <plat/usb.h>
#include <plat/gpmc-smc91x.h>
-#include "mmc-twl4030.h"
+#include "hsmmc.h"
#define SDP2430_CS0_BASE 0x04000000
#define SECONDARY_LCD_GPIO 147
diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c
index c90b0d0..a0cf00f 100644
--- a/arch/arm/mach-omap2/board-3430sdp.c
+++ b/arch/arm/mach-omap2/board-3430sdp.c
@@ -43,7 +43,7 @@
#include "mux.h"
#include "sdram-qimonda-hyb18m512160af-6.h"
-#include "mmc-twl4030.h"
+#include "hsmmc.h"
#define CONFIG_DISABLE_HFCLK 1
diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-omap2/board-cm-t35.c
index 2626a9f..214a2a8 100644
--- a/arch/arm/mach-omap2/board-cm-t35.c
+++ b/arch/arm/mach-omap2/board-cm-t35.c
@@ -46,7 +46,7 @@
#include "mux.h"
#include "sdram-micron-mt46h32m32lf-6.h"
-#include "mmc-twl4030.h"
+#include "hsmmc.h"
#define CM_T35_GPIO_PENDOWN 57
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c
index 117b8fd..9db061f 100644
--- a/arch/arm/mach-omap2/board-igep0020.c
+++ b/arch/arm/mach-omap2/board-igep0020.c
@@ -30,7 +30,7 @@
#include <plat/usb.h>
#include "mux.h"
-#include "mmc-twl4030.h"
+#include "hsmmc.h"
#define IGEP2_SMSC911X_CS 5
#define IGEP2_SMSC911X_GPIO 176
diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-ldp.c
index 995d4a2..635f54d 100644
--- a/arch/arm/mach-omap2/board-ldp.c
+++ b/arch/arm/mach-omap2/board-ldp.c
@@ -44,7 +44,7 @@
#include <plat/usb.h>
#include "mux.h"
-#include "mmc-twl4030.h"
+#include "hsmmc.h"
#define LDP_SMSC911X_CS 1
#define LDP_SMSC911X_GPIO 152
diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
index 231cb4e..aaa9760 100644
--- a/arch/arm/mach-omap2/board-omap3beagle.c
+++ b/arch/arm/mach-omap2/board-omap3beagle.c
@@ -45,7 +45,7 @@
#include <plat/timer-gp.h>
#include "mux.h"
-#include "mmc-twl4030.h"
+#include "hsmmc.h"
#define GPMC_CS0_BASE 0x60
#define GPMC_CS_SIZE 0x30
diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c
index 34de178..2dd52ad 100644
--- a/arch/arm/mach-omap2/board-omap3evm.c
+++ b/arch/arm/mach-omap2/board-omap3evm.c
@@ -44,7 +44,7 @@
#include "mux.h"
#include "sdram-micron-mt46h32m32lf-6.h"
-#include "mmc-twl4030.h"
+#include "hsmmc.h"
#define OMAP3_EVM_TS_GPIO 175
#define OMAP3_EVM_EHCI_VBUS 22
diff --git a/arch/arm/mach-omap2/board-omap3pandora.c b/arch/arm/mach-omap2/board-omap3pandora.c
index ef17cf1..3a11506 100644
--- a/arch/arm/mach-omap2/board-omap3pandora.c
+++ b/arch/arm/mach-omap2/board-omap3pandora.c
@@ -43,7 +43,7 @@
#include "mux.h"
#include "sdram-micron-mt46h32m32lf-6.h"
-#include "mmc-twl4030.h"
+#include "hsmmc.h"
#define OMAP3_PANDORA_TS_GPIO 94
diff --git a/arch/arm/mach-omap2/board-omap3touchbook.c b/arch/arm/mach-omap2/board-omap3touchbook.c
index fe3d22c..8efef51 100644
--- a/arch/arm/mach-omap2/board-omap3touchbook.c
+++ b/arch/arm/mach-omap2/board-omap3touchbook.c
@@ -50,7 +50,7 @@
#include <plat/timer-gp.h>
#include "mux.h"
-#include "mmc-twl4030.h"
+#include "hsmmc.h"
#include <asm/setup.h>
diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c
index d192dd9..8a9d439 100644
--- a/arch/arm/mach-omap2/board-overo.c
+++ b/arch/arm/mach-omap2/board-overo.c
@@ -48,7 +48,7 @@
#include "mux.h"
#include "sdram-micron-mt46h32m32lf-6.h"
-#include "mmc-twl4030.h"
+#include "hsmmc.h"
#define OVERO_GPIO_BT_XGATE 15
#define OVERO_GPIO_W2W_NRESET 16
diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c
index acafdbc..b2de206 100644
--- a/arch/arm/mach-omap2/board-rx51-peripherals.c
+++ b/arch/arm/mach-omap2/board-rx51-peripherals.c
@@ -34,7 +34,7 @@
#include <plat/gpmc-smc91x.h>
#include "mux.h"
-#include "mmc-twl4030.h"
+#include "hsmmc.h"
#define SYSTEM_REV_B_USES_VAUX3 0x1699
#define SYSTEM_REV_S_USES_VAUX3 0x8
diff --git a/arch/arm/mach-omap2/board-zoom-peripherals.c b/arch/arm/mach-omap2/board-zoom-peripherals.c
index 5c8474c..671dd06 100755
--- a/arch/arm/mach-omap2/board-zoom-peripherals.c
+++ b/arch/arm/mach-omap2/board-zoom-peripherals.c
@@ -25,7 +25,7 @@
#include <plat/usb.h>
#include "mux.h"
-#include "mmc-twl4030.h"
+#include "hsmmc.h"
/* Zoom2 has Qwerty keyboard*/
static int board_keymap[] = {
diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c
new file mode 100644
index 0000000..b88c538
--- /dev/null
+++ b/arch/arm/mach-omap2/hsmmc.c
@@ -0,0 +1,247 @@
+/*
+ * linux/arch/arm/mach-omap2/hsmmc.c
+ *
+ * Copyright (C) 2007-2008 Texas Instruments
+ * Copyright (C) 2008 Nokia Corporation
+ * Author: Texas Instruments
+ *
+ * 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.
+ */
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/delay.h>
+#include <mach/hardware.h>
+#include <plat/control.h>
+#include <plat/mmc.h>
+
+#include "hsmmc.h"
+
+#if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
+
+static u16 control_pbias_offset;
+static u16 control_devconf1_offset;
+
+#define HSMMC_NAME_LEN 9
+
+static struct twl_mmc_controller {
+ char name[HSMMC_NAME_LEN + 1];
+} hsmmc[OMAP34XX_NR_MMC];
+
+#if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM)
+
+static int twl4030_mmc_get_context_loss(struct device *dev)
+{
+ /* FIXME: PM DPS not implemented yet */
+ return 0;
+}
+
+#else
+#define twl4030_mmc_get_context_loss NULL
+#endif
+
+static void hsmmc1_before_set_reg(struct device *dev, int slot,
+ int power_on, int vdd)
+{
+ u32 reg, prog_io;
+ struct omap_mmc_platform_data *mmc = dev->platform_data;
+
+ /*
+ * Assume we power both OMAP VMMC1 (for CMD, CLK, DAT0..3) and the
+ * card with Vcc regulator (from twl4030 or whatever). OMAP has both
+ * 1.8V and 3.0V modes, controlled by the PBIAS register.
+ *
+ * In 8-bit modes, OMAP VMMC1A (for DAT4..7) needs a supply, which
+ * is most naturally TWL VSIM; those pins also use PBIAS.
+ *
+ * FIXME handle VMMC1A as needed ...
+ */
+ if (power_on) {
+ if (cpu_is_omap2430()) {
+ reg = omap_ctrl_readl(OMAP243X_CONTROL_DEVCONF1);
+ if ((1 << vdd) >= MMC_VDD_30_31)
+ reg |= OMAP243X_MMC1_ACTIVE_OVERWRITE;
+ else
+ reg &= ~OMAP243X_MMC1_ACTIVE_OVERWRITE;
+ omap_ctrl_writel(reg, OMAP243X_CONTROL_DEVCONF1);
+ }
+
+ if (mmc->slots[0].internal_clock) {
+ reg = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
+ reg |= OMAP2_MMCSDIO1ADPCLKISEL;
+ omap_ctrl_writel(reg, OMAP2_CONTROL_DEVCONF0);
+ }
+
+ reg = omap_ctrl_readl(control_pbias_offset);
+ if (cpu_is_omap3630()) {
+ /* Set MMC I/O to 52Mhz */
+ prog_io = omap_ctrl_readl(OMAP343X_CONTROL_PROG_IO1);
+ prog_io |= OMAP3630_PRG_SDMMC1_SPEEDCTRL;
+ omap_ctrl_writel(prog_io, OMAP343X_CONTROL_PROG_IO1);
+ } else {
+ reg |= OMAP2_PBIASSPEEDCTRL0;
+ }
+ reg &= ~OMAP2_PBIASLITEPWRDNZ0;
+ omap_ctrl_writel(reg, control_pbias_offset);
+ } else {
+ reg = omap_ctrl_readl(control_pbias_offset);
+ reg &= ~OMAP2_PBIASLITEPWRDNZ0;
+ omap_ctrl_writel(reg, control_pbias_offset);
+ }
+}
+
+static void hsmmc1_after_set_reg(struct device *dev, int slot,
+ int power_on, int vdd)
+{
+ u32 reg;
+
+ /* 100ms delay required for PBIAS configuration */
+ msleep(100);
+
+ if (power_on) {
+ reg = omap_ctrl_readl(control_pbias_offset);
+ reg |= (OMAP2_PBIASLITEPWRDNZ0 | OMAP2_PBIASSPEEDCTRL0);
+ if ((1 << vdd) <= MMC_VDD_165_195)
+ reg &= ~OMAP2_PBIASLITEVMODE0;
+ else
+ reg |= OMAP2_PBIASLITEVMODE0;
+ omap_ctrl_writel(reg, control_pbias_offset);
+ } else {
+ reg = omap_ctrl_readl(control_pbias_offset);
+ reg |= (OMAP2_PBIASSPEEDCTRL0 | OMAP2_PBIASLITEPWRDNZ0 |
+ OMAP2_PBIASLITEVMODE0);
+ omap_ctrl_writel(reg, control_pbias_offset);
+ }
+}
+
+static void hsmmc23_before_set_reg(struct device *dev, int slot,
+ int power_on, int vdd)
+{
+ struct omap_mmc_platform_data *mmc = dev->platform_data;
+
+ if (power_on) {
+ /* Only MMC2 supports a CLKIN */
+ if (mmc->slots[0].internal_clock) {
+ u32 reg;
+
+ reg = omap_ctrl_readl(control_devconf1_offset);
+ reg |= OMAP2_MMCSDIO2ADPCLKISEL;
+ omap_ctrl_writel(reg, control_devconf1_offset);
+ }
+ }
+}
+
+static struct omap_mmc_platform_data *hsmmc_data[OMAP34XX_NR_MMC] __initdata;
+
+void __init twl4030_mmc_init(struct twl4030_hsmmc_info *controllers)
+{
+ struct twl4030_hsmmc_info *c;
+ int nr_hsmmc = ARRAY_SIZE(hsmmc_data);
+
+ if (cpu_is_omap2430()) {
+ control_pbias_offset = OMAP243X_CONTROL_PBIAS_LITE;
+ control_devconf1_offset = OMAP243X_CONTROL_DEVCONF1;
+ } else {
+ control_pbias_offset = OMAP343X_CONTROL_PBIAS_LITE;
+ control_devconf1_offset = OMAP343X_CONTROL_DEVCONF1;
+ }
+
+ for (c = controllers; c->mmc; c++) {
+ struct twl_mmc_controller *twl = hsmmc + c->mmc - 1;
+ struct omap_mmc_platform_data *mmc = hsmmc_data[c->mmc - 1];
+
+ if (!c->mmc || c->mmc > nr_hsmmc) {
+ pr_debug("MMC%d: no such controller\n", c->mmc);
+ continue;
+ }
+ if (mmc) {
+ pr_debug("MMC%d: already configured\n", c->mmc);
+ continue;
+ }
+
+ mmc = kzalloc(sizeof(struct omap_mmc_platform_data), GFP_KERNEL);
+ if (!mmc) {
+ pr_err("Cannot allocate memory for mmc device!\n");
+ return;
+ }
+
+ if (c->name)
+ strncpy(twl->name, c->name, HSMMC_NAME_LEN);
+ else
+ snprintf(twl->name, ARRAY_SIZE(twl->name),
+ "mmc%islot%i", c->mmc, 1);
+ mmc->slots[0].name = twl->name;
+ mmc->nr_slots = 1;
+ mmc->slots[0].wires = c->wires;
+ mmc->slots[0].internal_clock = !c->ext_clock;
+ mmc->dma_mask = 0xffffffff;
+
+ mmc->get_context_loss_count =
+ twl4030_mmc_get_context_loss;
+
+ mmc->slots[0].switch_pin = c->gpio_cd;
+ mmc->slots[0].gpio_wp = c->gpio_wp;
+
+ if (c->cover_only)
+ mmc->slots[0].cover = 1;
+
+ if (c->nonremovable)
+ mmc->slots[0].nonremovable = 1;
+
+ if (c->power_saving)
+ mmc->slots[0].power_saving = 1;
+
+ /* NOTE: MMC slots should have a Vcc regulator set up.
+ * This may be from a TWL4030-family chip, another
+ * controllable regulator, or a fixed supply.
+ *
+ * temporary HACK: ocr_mask instead of fixed supply
+ */
+ mmc->slots[0].ocr_mask = c->ocr_mask;
+
+ switch (c->mmc) {
+ case 1:
+ /* on-chip level shifting via PBIAS0/PBIAS1 */
+ mmc->slots[0].before_set_reg = hsmmc1_before_set_reg;
+ mmc->slots[0].after_set_reg = hsmmc1_after_set_reg;
+
+ /* Omap3630 HSMMC1 supports only 4-bit */
+ if (cpu_is_omap3630() && c->wires > 4) {
+ c->wires = 4;
+ mmc->slots[0].wires = c->wires;
+ }
+ break;
+ case 2:
+ if (c->ext_clock)
+ c->transceiver = 1;
+ if (c->transceiver && c->wires > 4)
+ c->wires = 4;
+ /* FALLTHROUGH */
+ case 3:
+ /* off-chip level shifting, or none */
+ mmc->slots[0].before_set_reg = hsmmc23_before_set_reg;
+ mmc->slots[0].after_set_reg = NULL;
+ break;
+ default:
+ pr_err("MMC%d configuration not supported!\n", c->mmc);
+ kfree(mmc);
+ continue;
+ }
+ hsmmc_data[c->mmc - 1] = mmc;
+ }
+
+ omap2_init_mmc(hsmmc_data, OMAP34XX_NR_MMC);
+
+ /* pass the device nodes back to board setup code */
+ for (c = controllers; c->mmc; c++) {
+ struct omap_mmc_platform_data *mmc = hsmmc_data[c->mmc - 1];
+
+ if (!c->mmc || c->mmc > nr_hsmmc)
+ continue;
+ c->dev = mmc->dev;
+ }
+}
+
+#endif
diff --git a/arch/arm/mach-omap2/hsmmc.h b/arch/arm/mach-omap2/hsmmc.h
new file mode 100644
index 0000000..87d67c1
--- /dev/null
+++ b/arch/arm/mach-omap2/hsmmc.h
@@ -0,0 +1,34 @@
+/*
+ * MMC definitions for OMAP2
+ *
+ * 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.
+ */
+
+struct twl4030_hsmmc_info {
+ u8 mmc; /* controller 1/2/3 */
+ u8 wires; /* 1/4/8 wires */
+ bool transceiver; /* MMC-2 option */
+ bool ext_clock; /* use external pin for input clock */
+ bool cover_only; /* No card detect - just cover switch */
+ bool nonremovable; /* Nonremovable e.g. eMMC */
+ bool power_saving; /* Try to sleep or power off when possible */
+ int gpio_cd; /* or -EINVAL */
+ int gpio_wp; /* or -EINVAL */
+ char *name; /* or NULL for default */
+ struct device *dev; /* returned: pointer to mmc adapter */
+ int ocr_mask; /* temporary HACK */
+};
+
+#if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
+
+void twl4030_mmc_init(struct twl4030_hsmmc_info *);
+
+#else
+
+static inline void twl4030_mmc_init(struct twl4030_hsmmc_info *info)
+{
+}
+
+#endif
diff --git a/arch/arm/mach-omap2/mmc-twl4030.c b/arch/arm/mach-omap2/mmc-twl4030.c
deleted file mode 100644
index 9d5ad0b..0000000
--- a/arch/arm/mach-omap2/mmc-twl4030.c
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * linux/arch/arm/mach-omap2/mmc-twl4030.c
- *
- * Copyright (C) 2007-2008 Texas Instruments
- * Copyright (C) 2008 Nokia Corporation
- * Author: Texas Instruments
- *
- * 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.
- */
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <linux/string.h>
-#include <linux/delay.h>
-#include <mach/hardware.h>
-#include <plat/control.h>
-#include <plat/mmc.h>
-
-#include "mmc-twl4030.h"
-
-#if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
-
-static u16 control_pbias_offset;
-static u16 control_devconf1_offset;
-
-#define HSMMC_NAME_LEN 9
-
-static struct twl_mmc_controller {
- char name[HSMMC_NAME_LEN + 1];
-} hsmmc[OMAP34XX_NR_MMC];
-
-#if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM)
-
-static int twl4030_mmc_get_context_loss(struct device *dev)
-{
- /* FIXME: PM DPS not implemented yet */
- return 0;
-}
-
-#else
-#define twl4030_mmc_get_context_loss NULL
-#endif
-
-static void hsmmc1_before_set_reg(struct device *dev, int slot,
- int power_on, int vdd)
-{
- u32 reg, prog_io;
- struct omap_mmc_platform_data *mmc = dev->platform_data;
-
- /*
- * Assume we power both OMAP VMMC1 (for CMD, CLK, DAT0..3) and the
- * card with Vcc regulator (from twl4030 or whatever). OMAP has both
- * 1.8V and 3.0V modes, controlled by the PBIAS register.
- *
- * In 8-bit modes, OMAP VMMC1A (for DAT4..7) needs a supply, which
- * is most naturally TWL VSIM; those pins also use PBIAS.
- *
- * FIXME handle VMMC1A as needed ...
- */
- if (power_on) {
- if (cpu_is_omap2430()) {
- reg = omap_ctrl_readl(OMAP243X_CONTROL_DEVCONF1);
- if ((1 << vdd) >= MMC_VDD_30_31)
- reg |= OMAP243X_MMC1_ACTIVE_OVERWRITE;
- else
- reg &= ~OMAP243X_MMC1_ACTIVE_OVERWRITE;
- omap_ctrl_writel(reg, OMAP243X_CONTROL_DEVCONF1);
- }
-
- if (mmc->slots[0].internal_clock) {
- reg = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
- reg |= OMAP2_MMCSDIO1ADPCLKISEL;
- omap_ctrl_writel(reg, OMAP2_CONTROL_DEVCONF0);
- }
-
- reg = omap_ctrl_readl(control_pbias_offset);
- if (cpu_is_omap3630()) {
- /* Set MMC I/O to 52Mhz */
- prog_io = omap_ctrl_readl(OMAP343X_CONTROL_PROG_IO1);
- prog_io |= OMAP3630_PRG_SDMMC1_SPEEDCTRL;
- omap_ctrl_writel(prog_io, OMAP343X_CONTROL_PROG_IO1);
- } else {
- reg |= OMAP2_PBIASSPEEDCTRL0;
- }
- reg &= ~OMAP2_PBIASLITEPWRDNZ0;
- omap_ctrl_writel(reg, control_pbias_offset);
- } else {
- reg = omap_ctrl_readl(control_pbias_offset);
- reg &= ~OMAP2_PBIASLITEPWRDNZ0;
- omap_ctrl_writel(reg, control_pbias_offset);
- }
-}
-
-static void hsmmc1_after_set_reg(struct device *dev, int slot,
- int power_on, int vdd)
-{
- u32 reg;
-
- /* 100ms delay required for PBIAS configuration */
- msleep(100);
-
- if (power_on) {
- reg = omap_ctrl_readl(control_pbias_offset);
- reg |= (OMAP2_PBIASLITEPWRDNZ0 | OMAP2_PBIASSPEEDCTRL0);
- if ((1 << vdd) <= MMC_VDD_165_195)
- reg &= ~OMAP2_PBIASLITEVMODE0;
- else
- reg |= OMAP2_PBIASLITEVMODE0;
- omap_ctrl_writel(reg, control_pbias_offset);
- } else {
- reg = omap_ctrl_readl(control_pbias_offset);
- reg |= (OMAP2_PBIASSPEEDCTRL0 | OMAP2_PBIASLITEPWRDNZ0 |
- OMAP2_PBIASLITEVMODE0);
- omap_ctrl_writel(reg, control_pbias_offset);
- }
-}
-
-static void hsmmc23_before_set_reg(struct device *dev, int slot,
- int power_on, int vdd)
-{
- struct omap_mmc_platform_data *mmc = dev->platform_data;
-
- if (power_on) {
- /* Only MMC2 supports a CLKIN */
- if (mmc->slots[0].internal_clock) {
- u32 reg;
-
- reg = omap_ctrl_readl(control_devconf1_offset);
- reg |= OMAP2_MMCSDIO2ADPCLKISEL;
- omap_ctrl_writel(reg, control_devconf1_offset);
- }
- }
-}
-
-static struct omap_mmc_platform_data *hsmmc_data[OMAP34XX_NR_MMC] __initdata;
-
-void __init twl4030_mmc_init(struct twl4030_hsmmc_info *controllers)
-{
- struct twl4030_hsmmc_info *c;
- int nr_hsmmc = ARRAY_SIZE(hsmmc_data);
-
- if (cpu_is_omap2430()) {
- control_pbias_offset = OMAP243X_CONTROL_PBIAS_LITE;
- control_devconf1_offset = OMAP243X_CONTROL_DEVCONF1;
- } else {
- control_pbias_offset = OMAP343X_CONTROL_PBIAS_LITE;
- control_devconf1_offset = OMAP343X_CONTROL_DEVCONF1;
- }
-
- for (c = controllers; c->mmc; c++) {
- struct twl_mmc_controller *twl = hsmmc + c->mmc - 1;
- struct omap_mmc_platform_data *mmc = hsmmc_data[c->mmc - 1];
-
- if (!c->mmc || c->mmc > nr_hsmmc) {
- pr_debug("MMC%d: no such controller\n", c->mmc);
- continue;
- }
- if (mmc) {
- pr_debug("MMC%d: already configured\n", c->mmc);
- continue;
- }
-
- mmc = kzalloc(sizeof(struct omap_mmc_platform_data), GFP_KERNEL);
- if (!mmc) {
- pr_err("Cannot allocate memory for mmc device!\n");
- return;
- }
-
- if (c->name)
- strncpy(twl->name, c->name, HSMMC_NAME_LEN);
- else
- snprintf(twl->name, ARRAY_SIZE(twl->name),
- "mmc%islot%i", c->mmc, 1);
- mmc->slots[0].name = twl->name;
- mmc->nr_slots = 1;
- mmc->slots[0].wires = c->wires;
- mmc->slots[0].internal_clock = !c->ext_clock;
- mmc->dma_mask = 0xffffffff;
-
- mmc->get_context_loss_count =
- twl4030_mmc_get_context_loss;
-
- mmc->slots[0].switch_pin = c->gpio_cd;
- mmc->slots[0].gpio_wp = c->gpio_wp;
-
- if (c->cover_only)
- mmc->slots[0].cover = 1;
-
- if (c->nonremovable)
- mmc->slots[0].nonremovable = 1;
-
- if (c->power_saving)
- mmc->slots[0].power_saving = 1;
-
- /* NOTE: MMC slots should have a Vcc regulator set up.
- * This may be from a TWL4030-family chip, another
- * controllable regulator, or a fixed supply.
- *
- * temporary HACK: ocr_mask instead of fixed supply
- */
- mmc->slots[0].ocr_mask = c->ocr_mask;
-
- switch (c->mmc) {
- case 1:
- /* on-chip level shifting via PBIAS0/PBIAS1 */
- mmc->slots[0].before_set_reg = hsmmc1_before_set_reg;
- mmc->slots[0].after_set_reg = hsmmc1_after_set_reg;
-
- /* Omap3630 HSMMC1 supports only 4-bit */
- if (cpu_is_omap3630() && c->wires > 4) {
- c->wires = 4;
- mmc->slots[0].wires = c->wires;
- }
- break;
- case 2:
- if (c->ext_clock)
- c->transceiver = 1;
- if (c->transceiver && c->wires > 4)
- c->wires = 4;
- /* FALLTHROUGH */
- case 3:
- /* off-chip level shifting, or none */
- mmc->slots[0].before_set_reg = hsmmc23_before_set_reg;
- mmc->slots[0].after_set_reg = NULL;
- break;
- default:
- pr_err("MMC%d configuration not supported!\n", c->mmc);
- kfree(mmc);
- continue;
- }
- hsmmc_data[c->mmc - 1] = mmc;
- }
-
- omap2_init_mmc(hsmmc_data, OMAP34XX_NR_MMC);
-
- /* pass the device nodes back to board setup code */
- for (c = controllers; c->mmc; c++) {
- struct omap_mmc_platform_data *mmc = hsmmc_data[c->mmc - 1];
-
- if (!c->mmc || c->mmc > nr_hsmmc)
- continue;
- c->dev = mmc->dev;
- }
-}
-
-#endif
diff --git a/arch/arm/mach-omap2/mmc-twl4030.h b/arch/arm/mach-omap2/mmc-twl4030.h
deleted file mode 100644
index 87d67c1..0000000
--- a/arch/arm/mach-omap2/mmc-twl4030.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * MMC definitions for OMAP2
- *
- * 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.
- */
-
-struct twl4030_hsmmc_info {
- u8 mmc; /* controller 1/2/3 */
- u8 wires; /* 1/4/8 wires */
- bool transceiver; /* MMC-2 option */
- bool ext_clock; /* use external pin for input clock */
- bool cover_only; /* No card detect - just cover switch */
- bool nonremovable; /* Nonremovable e.g. eMMC */
- bool power_saving; /* Try to sleep or power off when possible */
- int gpio_cd; /* or -EINVAL */
- int gpio_wp; /* or -EINVAL */
- char *name; /* or NULL for default */
- struct device *dev; /* returned: pointer to mmc adapter */
- int ocr_mask; /* temporary HACK */
-};
-
-#if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
-
-void twl4030_mmc_init(struct twl4030_hsmmc_info *);
-
-#else
-
-static inline void twl4030_mmc_init(struct twl4030_hsmmc_info *info)
-{
-}
-
-#endif
--
1.6.0.4
^ permalink raw reply related [flat|nested] 21+ messages in thread* RE: [PATCH V2 2/10] omap: Rename mmc-twl4030 files to hsmmc
2010-01-17 1:33 ` [PATCH V2 2/10] omap: Rename mmc-twl4030 files to hsmmc Adrian Hunter
@ 2010-01-20 23:41 ` Madhusudhan
2010-01-20 23:48 ` Madhusudhan
0 siblings, 1 reply; 21+ messages in thread
From: Madhusudhan @ 2010-01-20 23:41 UTC (permalink / raw)
To: 'Adrian Hunter', 'Tony Lindgren'
Cc: 'Paul Walmsley', 'linux-omap Mailing List',
'linux-mmc Mailing List', 'Andrew Morton'
> -----Original Message-----
> From: Adrian Hunter [mailto:adrian.hunter@nokia.com]
> Sent: Saturday, January 16, 2010 7:33 PM
> To: Tony Lindgren
> Cc: Adrian Hunter; Madhusudhan Chikkature; Paul Walmsley; linux-omap
> Mailing List; linux-mmc Mailing List; Andrew Morton
> Subject: [PATCH V2 2/10] omap: Rename mmc-twl4030 files to hsmmc
>
> From a65fae702aa81d4596d6fbefd2ab3c8ea87c244a Mon Sep 17 00:00:00 2001
> From: Adrian Hunter <adrian.hunter@nokia.com>
> Date: Sun, 17 Jan 2010 02:34:22 +0200
> Subject: [PATCH] omap: Rename mmc-twl4030 files to hsmmc
>
> mmc-twl4030.[ch] no longer has any dependency on twl4030
> and should be renamed to reflect that.
>
> Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
> ---
> arch/arm/mach-omap2/Makefile | 28 ++--
> arch/arm/mach-omap2/board-2430sdp.c | 2 +-
> arch/arm/mach-omap2/board-3430sdp.c | 2 +-
> arch/arm/mach-omap2/board-cm-t35.c | 2 +-
> arch/arm/mach-omap2/board-igep0020.c | 2 +-
> arch/arm/mach-omap2/board-ldp.c | 2 +-
> arch/arm/mach-omap2/board-omap3beagle.c | 2 +-
> arch/arm/mach-omap2/board-omap3evm.c | 2 +-
> arch/arm/mach-omap2/board-omap3pandora.c | 2 +-
> arch/arm/mach-omap2/board-omap3touchbook.c | 2 +-
> arch/arm/mach-omap2/board-overo.c | 2 +-
> arch/arm/mach-omap2/board-rx51-peripherals.c | 2 +-
> arch/arm/mach-omap2/board-zoom-peripherals.c | 2 +-
> arch/arm/mach-omap2/hsmmc.c | 247
> ++++++++++++++++++++++++++
> arch/arm/mach-omap2/hsmmc.h | 34 ++++
> arch/arm/mach-omap2/mmc-twl4030.c | 247 ---------------------
> -----
> arch/arm/mach-omap2/mmc-twl4030.h | 34 ----
> 17 files changed, 307 insertions(+), 307 deletions(-)
> create mode 100644 arch/arm/mach-omap2/hsmmc.c
> create mode 100644 arch/arm/mach-omap2/hsmmc.h
> delete mode 100644 arch/arm/mach-omap2/mmc-twl4030.c
> delete mode 100644 arch/arm/mach-omap2/mmc-twl4030.h
>
> diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
> index b32678b..a7e4c5a 100644
> --- a/arch/arm/mach-omap2/Makefile
> +++ b/arch/arm/mach-omap2/Makefile
> @@ -71,42 +71,42 @@ obj-y +=
$(i2c-omap-m)
> $(i2c-omap-y)
> obj-$(CONFIG_MACH_OMAP_GENERIC) += board-generic.o
> obj-$(CONFIG_MACH_OMAP_H4) += board-h4.o
> obj-$(CONFIG_MACH_OMAP_2430SDP) += board-2430sdp.o \
> - mmc-twl4030.o
> + hsmmc.o
> obj-$(CONFIG_MACH_OMAP_APOLLON) += board-apollon.o
> obj-$(CONFIG_MACH_OMAP3_BEAGLE) += board-omap3beagle.o \
> - mmc-twl4030.o
> + hsmmc.o
> obj-$(CONFIG_MACH_OMAP_LDP) += board-ldp.o \
> - mmc-twl4030.o
> + hsmmc.o
> obj-$(CONFIG_MACH_OVERO) += board-overo.o \
> - mmc-twl4030.o
> + hsmmc.o
> obj-$(CONFIG_MACH_OMAP3EVM) += board-omap3evm.o \
> - mmc-twl4030.o
> + hsmmc.o
> obj-$(CONFIG_MACH_OMAP3_PANDORA) += board-omap3pandora.o \
> - mmc-twl4030.o
> + hsmmc.o
> obj-$(CONFIG_MACH_OMAP_3430SDP) += board-3430sdp.o \
> - mmc-twl4030.o
> + hsmmc.o
> obj-$(CONFIG_MACH_NOKIA_N8X0) += board-n8x0.o
> obj-$(CONFIG_MACH_NOKIA_RX51) += board-rx51.o \
> board-rx51-sdram.o \
> board-rx51-peripherals.o \
> - mmc-twl4030.o
> + hsmmc.o
> obj-$(CONFIG_MACH_OMAP_ZOOM2) += board-zoom2.o \
> board-zoom-peripherals.o \
> - mmc-twl4030.o \
> + hsmmc.o \
> board-zoom-debugboard.o
> obj-$(CONFIG_MACH_OMAP_ZOOM3) += board-zoom3.o \
> board-zoom-peripherals.o \
> - mmc-twl4030.o \
> + hsmmc.o \
> board-zoom-debugboard.o
> obj-$(CONFIG_MACH_OMAP_3630SDP) += board-3630sdp.o \
> board-zoom-peripherals.o \
> - mmc-twl4030.o
> + hsmmc.o
> obj-$(CONFIG_MACH_CM_T35) += board-cm-t35.o \
> - mmc-twl4030.o
> + hsmmc.o
> obj-$(CONFIG_MACH_IGEP0020) += board-igep0020.o \
> - mmc-twl4030.o
> + hsmmc.o
> obj-$(CONFIG_MACH_OMAP3_TOUCHBOOK) += board-omap3touchbook.o \
> - mmc-twl4030.o
> + hsmmc.o
> obj-$(CONFIG_MACH_OMAP_4430SDP) += board-4430sdp.o
>
> obj-$(CONFIG_MACH_OMAP3517EVM) += board-am3517evm.o
> diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-
> omap2/board-2430sdp.c
> index 31042ee..e42848d 100644
> --- a/arch/arm/mach-omap2/board-2430sdp.c
> +++ b/arch/arm/mach-omap2/board-2430sdp.c
> @@ -38,7 +38,7 @@
> #include <plat/usb.h>
> #include <plat/gpmc-smc91x.h>
>
> -#include "mmc-twl4030.h"
> +#include "hsmmc.h"
>
> #define SDP2430_CS0_BASE 0x04000000
> #define SECONDARY_LCD_GPIO 147
> diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-
> omap2/board-3430sdp.c
> index c90b0d0..a0cf00f 100644
> --- a/arch/arm/mach-omap2/board-3430sdp.c
> +++ b/arch/arm/mach-omap2/board-3430sdp.c
> @@ -43,7 +43,7 @@
>
> #include "mux.h"
> #include "sdram-qimonda-hyb18m512160af-6.h"
> -#include "mmc-twl4030.h"
> +#include "hsmmc.h"
>
> #define CONFIG_DISABLE_HFCLK 1
>
> diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-
> omap2/board-cm-t35.c
> index 2626a9f..214a2a8 100644
> --- a/arch/arm/mach-omap2/board-cm-t35.c
> +++ b/arch/arm/mach-omap2/board-cm-t35.c
> @@ -46,7 +46,7 @@
>
> #include "mux.h"
> #include "sdram-micron-mt46h32m32lf-6.h"
> -#include "mmc-twl4030.h"
> +#include "hsmmc.h"
>
> #define CM_T35_GPIO_PENDOWN 57
>
> diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-
> omap2/board-igep0020.c
> index 117b8fd..9db061f 100644
> --- a/arch/arm/mach-omap2/board-igep0020.c
> +++ b/arch/arm/mach-omap2/board-igep0020.c
> @@ -30,7 +30,7 @@
> #include <plat/usb.h>
>
> #include "mux.h"
> -#include "mmc-twl4030.h"
> +#include "hsmmc.h"
>
> #define IGEP2_SMSC911X_CS 5
> #define IGEP2_SMSC911X_GPIO 176
> diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-
> ldp.c
> index 995d4a2..635f54d 100644
> --- a/arch/arm/mach-omap2/board-ldp.c
> +++ b/arch/arm/mach-omap2/board-ldp.c
> @@ -44,7 +44,7 @@
> #include <plat/usb.h>
>
> #include "mux.h"
> -#include "mmc-twl4030.h"
> +#include "hsmmc.h"
>
> #define LDP_SMSC911X_CS 1
> #define LDP_SMSC911X_GPIO 152
> diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-
> omap2/board-omap3beagle.c
> index 231cb4e..aaa9760 100644
> --- a/arch/arm/mach-omap2/board-omap3beagle.c
> +++ b/arch/arm/mach-omap2/board-omap3beagle.c
> @@ -45,7 +45,7 @@
> #include <plat/timer-gp.h>
>
> #include "mux.h"
> -#include "mmc-twl4030.h"
> +#include "hsmmc.h"
>
> #define GPMC_CS0_BASE 0x60
> #define GPMC_CS_SIZE 0x30
> diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-
> omap2/board-omap3evm.c
> index 34de178..2dd52ad 100644
> --- a/arch/arm/mach-omap2/board-omap3evm.c
> +++ b/arch/arm/mach-omap2/board-omap3evm.c
> @@ -44,7 +44,7 @@
>
> #include "mux.h"
> #include "sdram-micron-mt46h32m32lf-6.h"
> -#include "mmc-twl4030.h"
> +#include "hsmmc.h"
>
> #define OMAP3_EVM_TS_GPIO 175
> #define OMAP3_EVM_EHCI_VBUS 22
> diff --git a/arch/arm/mach-omap2/board-omap3pandora.c b/arch/arm/mach-
> omap2/board-omap3pandora.c
> index ef17cf1..3a11506 100644
> --- a/arch/arm/mach-omap2/board-omap3pandora.c
> +++ b/arch/arm/mach-omap2/board-omap3pandora.c
> @@ -43,7 +43,7 @@
>
> #include "mux.h"
> #include "sdram-micron-mt46h32m32lf-6.h"
> -#include "mmc-twl4030.h"
> +#include "hsmmc.h"
>
> #define OMAP3_PANDORA_TS_GPIO 94
>
> diff --git a/arch/arm/mach-omap2/board-omap3touchbook.c b/arch/arm/mach-
> omap2/board-omap3touchbook.c
> index fe3d22c..8efef51 100644
> --- a/arch/arm/mach-omap2/board-omap3touchbook.c
> +++ b/arch/arm/mach-omap2/board-omap3touchbook.c
> @@ -50,7 +50,7 @@
> #include <plat/timer-gp.h>
>
> #include "mux.h"
> -#include "mmc-twl4030.h"
> +#include "hsmmc.h"
>
> #include <asm/setup.h>
>
> diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-
> omap2/board-overo.c
> index d192dd9..8a9d439 100644
> --- a/arch/arm/mach-omap2/board-overo.c
> +++ b/arch/arm/mach-omap2/board-overo.c
> @@ -48,7 +48,7 @@
>
> #include "mux.h"
> #include "sdram-micron-mt46h32m32lf-6.h"
> -#include "mmc-twl4030.h"
> +#include "hsmmc.h"
>
> #define OVERO_GPIO_BT_XGATE 15
> #define OVERO_GPIO_W2W_NRESET 16
> diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-
> omap2/board-rx51-peripherals.c
> index acafdbc..b2de206 100644
> --- a/arch/arm/mach-omap2/board-rx51-peripherals.c
> +++ b/arch/arm/mach-omap2/board-rx51-peripherals.c
> @@ -34,7 +34,7 @@
> #include <plat/gpmc-smc91x.h>
>
> #include "mux.h"
> -#include "mmc-twl4030.h"
> +#include "hsmmc.h"
>
> #define SYSTEM_REV_B_USES_VAUX3 0x1699
> #define SYSTEM_REV_S_USES_VAUX3 0x8
> diff --git a/arch/arm/mach-omap2/board-zoom-peripherals.c b/arch/arm/mach-
> omap2/board-zoom-peripherals.c
> index 5c8474c..671dd06 100755
> --- a/arch/arm/mach-omap2/board-zoom-peripherals.c
> +++ b/arch/arm/mach-omap2/board-zoom-peripherals.c
> @@ -25,7 +25,7 @@
> #include <plat/usb.h>
>
> #include "mux.h"
> -#include "mmc-twl4030.h"
> +#include "hsmmc.h"
>
> /* Zoom2 has Qwerty keyboard*/
> static int board_keymap[] = {
> diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c
> new file mode 100644
> index 0000000..b88c538
> --- /dev/null
> +++ b/arch/arm/mach-omap2/hsmmc.c
> @@ -0,0 +1,247 @@
> +/*
> + * linux/arch/arm/mach-omap2/hsmmc.c
> + *
> + * Copyright (C) 2007-2008 Texas Instruments
> + * Copyright (C) 2008 Nokia Corporation
> + * Author: Texas Instruments
> + *
> + * 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.
> + */
> +#include <linux/kernel.h>
> +#include <linux/slab.h>
> +#include <linux/string.h>
> +#include <linux/delay.h>
> +#include <mach/hardware.h>
> +#include <plat/control.h>
> +#include <plat/mmc.h>
> +
> +#include "hsmmc.h"
> +
> +#if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
> +
> +static u16 control_pbias_offset;
> +static u16 control_devconf1_offset;
> +
> +#define HSMMC_NAME_LEN 9
> +
> +static struct twl_mmc_controller {
Now that this file is hsmmc specific, how about renaming this as
"hsmmc_controller"?
> + char name[HSMMC_NAME_LEN + 1];
> +} hsmmc[OMAP34XX_NR_MMC];
> +
> +#if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM)
> +
> +static int twl4030_mmc_get_context_loss(struct device *dev)
Ditto, hsmmc_get_context_loss?
> +{
> + /* FIXME: PM DPS not implemented yet */
> + return 0;
> +}
> +
> +#else
> +#define twl4030_mmc_get_context_loss NULL
> +#endif
> +
> +static void hsmmc1_before_set_reg(struct device *dev, int slot,
> + int power_on, int vdd)
> +{
> + u32 reg, prog_io;
> + struct omap_mmc_platform_data *mmc = dev->platform_data;
> +
> + /*
> + * Assume we power both OMAP VMMC1 (for CMD, CLK, DAT0..3) and the
> + * card with Vcc regulator (from twl4030 or whatever). OMAP has
> both
> + * 1.8V and 3.0V modes, controlled by the PBIAS register.
> + *
> + * In 8-bit modes, OMAP VMMC1A (for DAT4..7) needs a supply, which
> + * is most naturally TWL VSIM; those pins also use PBIAS.
> + *
> + * FIXME handle VMMC1A as needed ...
> + */
> + if (power_on) {
> + if (cpu_is_omap2430()) {
> + reg = omap_ctrl_readl(OMAP243X_CONTROL_DEVCONF1);
> + if ((1 << vdd) >= MMC_VDD_30_31)
> + reg |= OMAP243X_MMC1_ACTIVE_OVERWRITE;
> + else
> + reg &= ~OMAP243X_MMC1_ACTIVE_OVERWRITE;
> + omap_ctrl_writel(reg, OMAP243X_CONTROL_DEVCONF1);
> + }
> +
> + if (mmc->slots[0].internal_clock) {
> + reg = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
> + reg |= OMAP2_MMCSDIO1ADPCLKISEL;
> + omap_ctrl_writel(reg, OMAP2_CONTROL_DEVCONF0);
> + }
> +
> + reg = omap_ctrl_readl(control_pbias_offset);
> + if (cpu_is_omap3630()) {
> + /* Set MMC I/O to 52Mhz */
> + prog_io =
omap_ctrl_readl(OMAP343X_CONTROL_PROG_IO1);
> + prog_io |= OMAP3630_PRG_SDMMC1_SPEEDCTRL;
> + omap_ctrl_writel(prog_io,
OMAP343X_CONTROL_PROG_IO1);
> + } else {
> + reg |= OMAP2_PBIASSPEEDCTRL0;
> + }
> + reg &= ~OMAP2_PBIASLITEPWRDNZ0;
> + omap_ctrl_writel(reg, control_pbias_offset);
> + } else {
> + reg = omap_ctrl_readl(control_pbias_offset);
> + reg &= ~OMAP2_PBIASLITEPWRDNZ0;
> + omap_ctrl_writel(reg, control_pbias_offset);
> + }
> +}
> +
> +static void hsmmc1_after_set_reg(struct device *dev, int slot,
> + int power_on, int vdd)
> +{
> + u32 reg;
> +
> + /* 100ms delay required for PBIAS configuration */
> + msleep(100);
> +
> + if (power_on) {
> + reg = omap_ctrl_readl(control_pbias_offset);
> + reg |= (OMAP2_PBIASLITEPWRDNZ0 | OMAP2_PBIASSPEEDCTRL0);
> + if ((1 << vdd) <= MMC_VDD_165_195)
> + reg &= ~OMAP2_PBIASLITEVMODE0;
> + else
> + reg |= OMAP2_PBIASLITEVMODE0;
> + omap_ctrl_writel(reg, control_pbias_offset);
> + } else {
> + reg = omap_ctrl_readl(control_pbias_offset);
> + reg |= (OMAP2_PBIASSPEEDCTRL0 | OMAP2_PBIASLITEPWRDNZ0 |
> + OMAP2_PBIASLITEVMODE0);
> + omap_ctrl_writel(reg, control_pbias_offset);
> + }
> +}
> +
> +static void hsmmc23_before_set_reg(struct device *dev, int slot,
> + int power_on, int vdd)
> +{
> + struct omap_mmc_platform_data *mmc = dev->platform_data;
> +
> + if (power_on) {
> + /* Only MMC2 supports a CLKIN */
> + if (mmc->slots[0].internal_clock) {
> + u32 reg;
> +
> + reg = omap_ctrl_readl(control_devconf1_offset);
> + reg |= OMAP2_MMCSDIO2ADPCLKISEL;
> + omap_ctrl_writel(reg, control_devconf1_offset);
> + }
> + }
> +}
> +
> +static struct omap_mmc_platform_data *hsmmc_data[OMAP34XX_NR_MMC]
> __initdata;
> +
> +void __init twl4030_mmc_init(struct twl4030_hsmmc_info *controllers)
Ditto, hsmmc_init?
> +{
> + struct twl4030_hsmmc_info *c;
> + int nr_hsmmc = ARRAY_SIZE(hsmmc_data);
> +
> + if (cpu_is_omap2430()) {
> + control_pbias_offset = OMAP243X_CONTROL_PBIAS_LITE;
> + control_devconf1_offset = OMAP243X_CONTROL_DEVCONF1;
> + } else {
> + control_pbias_offset = OMAP343X_CONTROL_PBIAS_LITE;
> + control_devconf1_offset = OMAP343X_CONTROL_DEVCONF1;
> + }
> +
> + for (c = controllers; c->mmc; c++) {
> + struct twl_mmc_controller *twl = hsmmc + c->mmc - 1;
> + struct omap_mmc_platform_data *mmc = hsmmc_data[c->mmc - 1];
> +
> + if (!c->mmc || c->mmc > nr_hsmmc) {
> + pr_debug("MMC%d: no such controller\n", c->mmc);
> + continue;
> + }
> + if (mmc) {
> + pr_debug("MMC%d: already configured\n", c->mmc);
> + continue;
> + }
> +
> + mmc = kzalloc(sizeof(struct omap_mmc_platform_data),
> GFP_KERNEL);
> + if (!mmc) {
> + pr_err("Cannot allocate memory for mmc device!\n");
> + return;
> + }
> +
> + if (c->name)
> + strncpy(twl->name, c->name, HSMMC_NAME_LEN);
> + else
> + snprintf(twl->name, ARRAY_SIZE(twl->name),
> + "mmc%islot%i", c->mmc, 1);
> + mmc->slots[0].name = twl->name;
> + mmc->nr_slots = 1;
> + mmc->slots[0].wires = c->wires;
> + mmc->slots[0].internal_clock = !c->ext_clock;
> + mmc->dma_mask = 0xffffffff;
> +
> + mmc->get_context_loss_count =
> + twl4030_mmc_get_context_loss;
> +
> + mmc->slots[0].switch_pin = c->gpio_cd;
> + mmc->slots[0].gpio_wp = c->gpio_wp;
> +
> + if (c->cover_only)
> + mmc->slots[0].cover = 1;
> +
> + if (c->nonremovable)
> + mmc->slots[0].nonremovable = 1;
> +
> + if (c->power_saving)
> + mmc->slots[0].power_saving = 1;
> +
> + /* NOTE: MMC slots should have a Vcc regulator set up.
> + * This may be from a TWL4030-family chip, another
> + * controllable regulator, or a fixed supply.
> + *
> + * temporary HACK: ocr_mask instead of fixed supply
> + */
> + mmc->slots[0].ocr_mask = c->ocr_mask;
> +
> + switch (c->mmc) {
> + case 1:
> + /* on-chip level shifting via PBIAS0/PBIAS1 */
> + mmc->slots[0].before_set_reg =
hsmmc1_before_set_reg;
> + mmc->slots[0].after_set_reg = hsmmc1_after_set_reg;
> +
> + /* Omap3630 HSMMC1 supports only 4-bit */
> + if (cpu_is_omap3630() && c->wires > 4) {
> + c->wires = 4;
> + mmc->slots[0].wires = c->wires;
> + }
> + break;
> + case 2:
> + if (c->ext_clock)
> + c->transceiver = 1;
> + if (c->transceiver && c->wires > 4)
> + c->wires = 4;
> + /* FALLTHROUGH */
> + case 3:
> + /* off-chip level shifting, or none */
> + mmc->slots[0].before_set_reg =
hsmmc23_before_set_reg;
> + mmc->slots[0].after_set_reg = NULL;
> + break;
> + default:
> + pr_err("MMC%d configuration not supported!\n",
c->mmc);
> + kfree(mmc);
> + continue;
> + }
> + hsmmc_data[c->mmc - 1] = mmc;
> + }
> +
> + omap2_init_mmc(hsmmc_data, OMAP34XX_NR_MMC);
> +
> + /* pass the device nodes back to board setup code */
> + for (c = controllers; c->mmc; c++) {
> + struct omap_mmc_platform_data *mmc = hsmmc_data[c->mmc - 1];
> +
> + if (!c->mmc || c->mmc > nr_hsmmc)
> + continue;
> + c->dev = mmc->dev;
> + }
> +}
> +
> +#endif
> diff --git a/arch/arm/mach-omap2/hsmmc.h b/arch/arm/mach-omap2/hsmmc.h
> new file mode 100644
> index 0000000..87d67c1
> --- /dev/null
> +++ b/arch/arm/mach-omap2/hsmmc.h
> @@ -0,0 +1,34 @@
> +/*
> + * MMC definitions for OMAP2
> + *
> + * 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.
> + */
> +
> +struct twl4030_hsmmc_info {
> + u8 mmc; /* controller 1/2/3 */
> + u8 wires; /* 1/4/8 wires */
> + bool transceiver; /* MMC-2 option */
> + bool ext_clock; /* use external pin for input clock */
> + bool cover_only; /* No card detect - just cover switch */
> + bool nonremovable; /* Nonremovable e.g. eMMC */
> + bool power_saving; /* Try to sleep or power off when possible
> */
> + int gpio_cd; /* or -EINVAL */
> + int gpio_wp; /* or -EINVAL */
> + char *name; /* or NULL for default */
> + struct device *dev; /* returned: pointer to mmc adapter */
> + int ocr_mask; /* temporary HACK */
> +};
> +
> +#if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
> +
> +void twl4030_mmc_init(struct twl4030_hsmmc_info *);
Ditto
> +
> +#else
> +
> +static inline void twl4030_mmc_init(struct twl4030_hsmmc_info *info)
> +{
> +}
> +
> +#endif
> diff --git a/arch/arm/mach-omap2/mmc-twl4030.c b/arch/arm/mach-omap2/mmc-
> twl4030.c
> deleted file mode 100644
> index 9d5ad0b..0000000
> --- a/arch/arm/mach-omap2/mmc-twl4030.c
> +++ /dev/null
> @@ -1,247 +0,0 @@
> -/*
> - * linux/arch/arm/mach-omap2/mmc-twl4030.c
> - *
> - * Copyright (C) 2007-2008 Texas Instruments
> - * Copyright (C) 2008 Nokia Corporation
> - * Author: Texas Instruments
> - *
> - * 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.
> - */
> -#include <linux/kernel.h>
> -#include <linux/slab.h>
> -#include <linux/string.h>
> -#include <linux/delay.h>
> -#include <mach/hardware.h>
> -#include <plat/control.h>
> -#include <plat/mmc.h>
> -
> -#include "mmc-twl4030.h"
> -
> -#if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
> -
> -static u16 control_pbias_offset;
> -static u16 control_devconf1_offset;
> -
> -#define HSMMC_NAME_LEN 9
> -
> -static struct twl_mmc_controller {
> - char name[HSMMC_NAME_LEN + 1];
> -} hsmmc[OMAP34XX_NR_MMC];
> -
> -#if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM)
> -
> -static int twl4030_mmc_get_context_loss(struct device *dev)
> -{
> - /* FIXME: PM DPS not implemented yet */
> - return 0;
> -}
> -
> -#else
> -#define twl4030_mmc_get_context_loss NULL
> -#endif
> -
> -static void hsmmc1_before_set_reg(struct device *dev, int slot,
> - int power_on, int vdd)
> -{
> - u32 reg, prog_io;
> - struct omap_mmc_platform_data *mmc = dev->platform_data;
> -
> - /*
> - * Assume we power both OMAP VMMC1 (for CMD, CLK, DAT0..3) and the
> - * card with Vcc regulator (from twl4030 or whatever). OMAP has
> both
> - * 1.8V and 3.0V modes, controlled by the PBIAS register.
> - *
> - * In 8-bit modes, OMAP VMMC1A (for DAT4..7) needs a supply, which
> - * is most naturally TWL VSIM; those pins also use PBIAS.
> - *
> - * FIXME handle VMMC1A as needed ...
> - */
> - if (power_on) {
> - if (cpu_is_omap2430()) {
> - reg = omap_ctrl_readl(OMAP243X_CONTROL_DEVCONF1);
> - if ((1 << vdd) >= MMC_VDD_30_31)
> - reg |= OMAP243X_MMC1_ACTIVE_OVERWRITE;
> - else
> - reg &= ~OMAP243X_MMC1_ACTIVE_OVERWRITE;
> - omap_ctrl_writel(reg, OMAP243X_CONTROL_DEVCONF1);
> - }
> -
> - if (mmc->slots[0].internal_clock) {
> - reg = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
> - reg |= OMAP2_MMCSDIO1ADPCLKISEL;
> - omap_ctrl_writel(reg, OMAP2_CONTROL_DEVCONF0);
> - }
> -
> - reg = omap_ctrl_readl(control_pbias_offset);
> - if (cpu_is_omap3630()) {
> - /* Set MMC I/O to 52Mhz */
> - prog_io =
omap_ctrl_readl(OMAP343X_CONTROL_PROG_IO1);
> - prog_io |= OMAP3630_PRG_SDMMC1_SPEEDCTRL;
> - omap_ctrl_writel(prog_io,
OMAP343X_CONTROL_PROG_IO1);
> - } else {
> - reg |= OMAP2_PBIASSPEEDCTRL0;
> - }
> - reg &= ~OMAP2_PBIASLITEPWRDNZ0;
> - omap_ctrl_writel(reg, control_pbias_offset);
> - } else {
> - reg = omap_ctrl_readl(control_pbias_offset);
> - reg &= ~OMAP2_PBIASLITEPWRDNZ0;
> - omap_ctrl_writel(reg, control_pbias_offset);
> - }
> -}
> -
> -static void hsmmc1_after_set_reg(struct device *dev, int slot,
> - int power_on, int vdd)
> -{
> - u32 reg;
> -
> - /* 100ms delay required for PBIAS configuration */
> - msleep(100);
> -
> - if (power_on) {
> - reg = omap_ctrl_readl(control_pbias_offset);
> - reg |= (OMAP2_PBIASLITEPWRDNZ0 | OMAP2_PBIASSPEEDCTRL0);
> - if ((1 << vdd) <= MMC_VDD_165_195)
> - reg &= ~OMAP2_PBIASLITEVMODE0;
> - else
> - reg |= OMAP2_PBIASLITEVMODE0;
> - omap_ctrl_writel(reg, control_pbias_offset);
> - } else {
> - reg = omap_ctrl_readl(control_pbias_offset);
> - reg |= (OMAP2_PBIASSPEEDCTRL0 | OMAP2_PBIASLITEPWRDNZ0 |
> - OMAP2_PBIASLITEVMODE0);
> - omap_ctrl_writel(reg, control_pbias_offset);
> - }
> -}
> -
> -static void hsmmc23_before_set_reg(struct device *dev, int slot,
> - int power_on, int vdd)
> -{
> - struct omap_mmc_platform_data *mmc = dev->platform_data;
> -
> - if (power_on) {
> - /* Only MMC2 supports a CLKIN */
> - if (mmc->slots[0].internal_clock) {
> - u32 reg;
> -
> - reg = omap_ctrl_readl(control_devconf1_offset);
> - reg |= OMAP2_MMCSDIO2ADPCLKISEL;
> - omap_ctrl_writel(reg, control_devconf1_offset);
> - }
> - }
> -}
> -
> -static struct omap_mmc_platform_data *hsmmc_data[OMAP34XX_NR_MMC]
> __initdata;
> -
> -void __init twl4030_mmc_init(struct twl4030_hsmmc_info *controllers)
> -{
> - struct twl4030_hsmmc_info *c;
> - int nr_hsmmc = ARRAY_SIZE(hsmmc_data);
> -
> - if (cpu_is_omap2430()) {
> - control_pbias_offset = OMAP243X_CONTROL_PBIAS_LITE;
> - control_devconf1_offset = OMAP243X_CONTROL_DEVCONF1;
> - } else {
> - control_pbias_offset = OMAP343X_CONTROL_PBIAS_LITE;
> - control_devconf1_offset = OMAP343X_CONTROL_DEVCONF1;
> - }
> -
> - for (c = controllers; c->mmc; c++) {
> - struct twl_mmc_controller *twl = hsmmc + c->mmc - 1;
> - struct omap_mmc_platform_data *mmc = hsmmc_data[c->mmc - 1];
> -
> - if (!c->mmc || c->mmc > nr_hsmmc) {
> - pr_debug("MMC%d: no such controller\n", c->mmc);
> - continue;
> - }
> - if (mmc) {
> - pr_debug("MMC%d: already configured\n", c->mmc);
> - continue;
> - }
> -
> - mmc = kzalloc(sizeof(struct omap_mmc_platform_data),
> GFP_KERNEL);
> - if (!mmc) {
> - pr_err("Cannot allocate memory for mmc device!\n");
> - return;
> - }
> -
> - if (c->name)
> - strncpy(twl->name, c->name, HSMMC_NAME_LEN);
> - else
> - snprintf(twl->name, ARRAY_SIZE(twl->name),
> - "mmc%islot%i", c->mmc, 1);
> - mmc->slots[0].name = twl->name;
> - mmc->nr_slots = 1;
> - mmc->slots[0].wires = c->wires;
> - mmc->slots[0].internal_clock = !c->ext_clock;
> - mmc->dma_mask = 0xffffffff;
> -
> - mmc->get_context_loss_count =
> - twl4030_mmc_get_context_loss;
> -
> - mmc->slots[0].switch_pin = c->gpio_cd;
> - mmc->slots[0].gpio_wp = c->gpio_wp;
> -
> - if (c->cover_only)
> - mmc->slots[0].cover = 1;
> -
> - if (c->nonremovable)
> - mmc->slots[0].nonremovable = 1;
> -
> - if (c->power_saving)
> - mmc->slots[0].power_saving = 1;
> -
> - /* NOTE: MMC slots should have a Vcc regulator set up.
> - * This may be from a TWL4030-family chip, another
> - * controllable regulator, or a fixed supply.
> - *
> - * temporary HACK: ocr_mask instead of fixed supply
> - */
> - mmc->slots[0].ocr_mask = c->ocr_mask;
> -
> - switch (c->mmc) {
> - case 1:
> - /* on-chip level shifting via PBIAS0/PBIAS1 */
> - mmc->slots[0].before_set_reg =
hsmmc1_before_set_reg;
> - mmc->slots[0].after_set_reg = hsmmc1_after_set_reg;
> -
> - /* Omap3630 HSMMC1 supports only 4-bit */
> - if (cpu_is_omap3630() && c->wires > 4) {
> - c->wires = 4;
> - mmc->slots[0].wires = c->wires;
> - }
> - break;
> - case 2:
> - if (c->ext_clock)
> - c->transceiver = 1;
> - if (c->transceiver && c->wires > 4)
> - c->wires = 4;
> - /* FALLTHROUGH */
> - case 3:
> - /* off-chip level shifting, or none */
> - mmc->slots[0].before_set_reg =
hsmmc23_before_set_reg;
> - mmc->slots[0].after_set_reg = NULL;
> - break;
> - default:
> - pr_err("MMC%d configuration not supported!\n",
c->mmc);
> - kfree(mmc);
> - continue;
> - }
> - hsmmc_data[c->mmc - 1] = mmc;
> - }
> -
> - omap2_init_mmc(hsmmc_data, OMAP34XX_NR_MMC);
> -
> - /* pass the device nodes back to board setup code */
> - for (c = controllers; c->mmc; c++) {
> - struct omap_mmc_platform_data *mmc = hsmmc_data[c->mmc - 1];
> -
> - if (!c->mmc || c->mmc > nr_hsmmc)
> - continue;
> - c->dev = mmc->dev;
> - }
> -}
> -
> -#endif
> diff --git a/arch/arm/mach-omap2/mmc-twl4030.h b/arch/arm/mach-omap2/mmc-
> twl4030.h
> deleted file mode 100644
> index 87d67c1..0000000
> --- a/arch/arm/mach-omap2/mmc-twl4030.h
> +++ /dev/null
> @@ -1,34 +0,0 @@
> -/*
> - * MMC definitions for OMAP2
> - *
> - * 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.
> - */
> -
> -struct twl4030_hsmmc_info {
> - u8 mmc; /* controller 1/2/3 */
> - u8 wires; /* 1/4/8 wires */
> - bool transceiver; /* MMC-2 option */
> - bool ext_clock; /* use external pin for input clock */
> - bool cover_only; /* No card detect - just cover switch */
> - bool nonremovable; /* Nonremovable e.g. eMMC */
> - bool power_saving; /* Try to sleep or power off when possible
> */
> - int gpio_cd; /* or -EINVAL */
> - int gpio_wp; /* or -EINVAL */
> - char *name; /* or NULL for default */
> - struct device *dev; /* returned: pointer to mmc adapter */
> - int ocr_mask; /* temporary HACK */
> -};
> -
> -#if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
> -
> -void twl4030_mmc_init(struct twl4030_hsmmc_info *);
> -
> -#else
> -
> -static inline void twl4030_mmc_init(struct twl4030_hsmmc_info *info)
> -{
> -}
> -
> -#endif
> --
> 1.6.0.4
^ permalink raw reply [flat|nested] 21+ messages in thread* RE: [PATCH V2 2/10] omap: Rename mmc-twl4030 files to hsmmc
2010-01-20 23:41 ` Madhusudhan
@ 2010-01-20 23:48 ` Madhusudhan
2010-01-21 9:07 ` Adrian Hunter
0 siblings, 1 reply; 21+ messages in thread
From: Madhusudhan @ 2010-01-20 23:48 UTC (permalink / raw)
To: 'Adrian Hunter', 'Tony Lindgren'
Cc: 'Paul Walmsley', 'linux-omap Mailing List',
'linux-mmc Mailing List', 'Andrew Morton'
> -----Original Message-----
> From: linux-mmc-owner@vger.kernel.org [mailto:linux-mmc-
> owner@vger.kernel.org] On Behalf Of Madhusudhan
> Sent: Wednesday, January 20, 2010 5:42 PM
> To: 'Adrian Hunter'; 'Tony Lindgren'
> Cc: 'Paul Walmsley'; 'linux-omap Mailing List'; 'linux-mmc Mailing List';
> 'Andrew Morton'
> Subject: RE: [PATCH V2 2/10] omap: Rename mmc-twl4030 files to hsmmc
>
>
>
> > -----Original Message-----
> > From: Adrian Hunter [mailto:adrian.hunter@nokia.com]
> > Sent: Saturday, January 16, 2010 7:33 PM
> > To: Tony Lindgren
> > Cc: Adrian Hunter; Madhusudhan Chikkature; Paul Walmsley; linux-omap
> > Mailing List; linux-mmc Mailing List; Andrew Morton
> > Subject: [PATCH V2 2/10] omap: Rename mmc-twl4030 files to hsmmc
> >
> > From a65fae702aa81d4596d6fbefd2ab3c8ea87c244a Mon Sep 17 00:00:00 2001
> > From: Adrian Hunter <adrian.hunter@nokia.com>
> > Date: Sun, 17 Jan 2010 02:34:22 +0200
> > Subject: [PATCH] omap: Rename mmc-twl4030 files to hsmmc
> >
> > mmc-twl4030.[ch] no longer has any dependency on twl4030
> > and should be renamed to reflect that.
> >
> > Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
> > ---
> > arch/arm/mach-omap2/Makefile | 28 ++--
> > arch/arm/mach-omap2/board-2430sdp.c | 2 +-
> > arch/arm/mach-omap2/board-3430sdp.c | 2 +-
> > arch/arm/mach-omap2/board-cm-t35.c | 2 +-
> > arch/arm/mach-omap2/board-igep0020.c | 2 +-
> > arch/arm/mach-omap2/board-ldp.c | 2 +-
> > arch/arm/mach-omap2/board-omap3beagle.c | 2 +-
> > arch/arm/mach-omap2/board-omap3evm.c | 2 +-
> > arch/arm/mach-omap2/board-omap3pandora.c | 2 +-
> > arch/arm/mach-omap2/board-omap3touchbook.c | 2 +-
> > arch/arm/mach-omap2/board-overo.c | 2 +-
> > arch/arm/mach-omap2/board-rx51-peripherals.c | 2 +-
> > arch/arm/mach-omap2/board-zoom-peripherals.c | 2 +-
> > arch/arm/mach-omap2/hsmmc.c | 247
> > ++++++++++++++++++++++++++
> > arch/arm/mach-omap2/hsmmc.h | 34 ++++
> > arch/arm/mach-omap2/mmc-twl4030.c | 247 -------------------
> --
> > -----
> > arch/arm/mach-omap2/mmc-twl4030.h | 34 ----
> > 17 files changed, 307 insertions(+), 307 deletions(-)
> > create mode 100644 arch/arm/mach-omap2/hsmmc.c
> > create mode 100644 arch/arm/mach-omap2/hsmmc.h
> > delete mode 100644 arch/arm/mach-omap2/mmc-twl4030.c
> > delete mode 100644 arch/arm/mach-omap2/mmc-twl4030.h
> >
> > diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
> > index b32678b..a7e4c5a 100644
> > --- a/arch/arm/mach-omap2/Makefile
> > +++ b/arch/arm/mach-omap2/Makefile
> > @@ -71,42 +71,42 @@ obj-y +=
> $(i2c-omap-m)
> > $(i2c-omap-y)
> > obj-$(CONFIG_MACH_OMAP_GENERIC) += board-generic.o
> > obj-$(CONFIG_MACH_OMAP_H4) += board-h4.o
> > obj-$(CONFIG_MACH_OMAP_2430SDP) += board-2430sdp.o \
> > - mmc-twl4030.o
> > + hsmmc.o
> > obj-$(CONFIG_MACH_OMAP_APOLLON) += board-apollon.o
> > obj-$(CONFIG_MACH_OMAP3_BEAGLE) += board-omap3beagle.o \
> > - mmc-twl4030.o
> > + hsmmc.o
> > obj-$(CONFIG_MACH_OMAP_LDP) += board-ldp.o \
> > - mmc-twl4030.o
> > + hsmmc.o
> > obj-$(CONFIG_MACH_OVERO) += board-overo.o \
> > - mmc-twl4030.o
> > + hsmmc.o
> > obj-$(CONFIG_MACH_OMAP3EVM) += board-omap3evm.o \
> > - mmc-twl4030.o
> > + hsmmc.o
> > obj-$(CONFIG_MACH_OMAP3_PANDORA) += board-omap3pandora.o \
> > - mmc-twl4030.o
> > + hsmmc.o
> > obj-$(CONFIG_MACH_OMAP_3430SDP) += board-3430sdp.o \
> > - mmc-twl4030.o
> > + hsmmc.o
> > obj-$(CONFIG_MACH_NOKIA_N8X0) += board-n8x0.o
> > obj-$(CONFIG_MACH_NOKIA_RX51) += board-rx51.o \
> > board-rx51-sdram.o \
> > board-rx51-peripherals.o \
> > - mmc-twl4030.o
> > + hsmmc.o
> > obj-$(CONFIG_MACH_OMAP_ZOOM2) += board-zoom2.o \
> > board-zoom-peripherals.o \
> > - mmc-twl4030.o \
> > + hsmmc.o \
> > board-zoom-debugboard.o
> > obj-$(CONFIG_MACH_OMAP_ZOOM3) += board-zoom3.o \
> > board-zoom-peripherals.o \
> > - mmc-twl4030.o \
> > + hsmmc.o \
> > board-zoom-debugboard.o
> > obj-$(CONFIG_MACH_OMAP_3630SDP) += board-3630sdp.o \
> > board-zoom-peripherals.o \
> > - mmc-twl4030.o
> > + hsmmc.o
> > obj-$(CONFIG_MACH_CM_T35) += board-cm-t35.o \
> > - mmc-twl4030.o
> > + hsmmc.o
> > obj-$(CONFIG_MACH_IGEP0020) += board-igep0020.o \
> > - mmc-twl4030.o
> > + hsmmc.o
> > obj-$(CONFIG_MACH_OMAP3_TOUCHBOOK) += board-omap3touchbook.o \
> > - mmc-twl4030.o
> > + hsmmc.o
> > obj-$(CONFIG_MACH_OMAP_4430SDP) += board-4430sdp.o
> >
> > obj-$(CONFIG_MACH_OMAP3517EVM) += board-am3517evm.o
> > diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-
> > omap2/board-2430sdp.c
> > index 31042ee..e42848d 100644
> > --- a/arch/arm/mach-omap2/board-2430sdp.c
> > +++ b/arch/arm/mach-omap2/board-2430sdp.c
> > @@ -38,7 +38,7 @@
> > #include <plat/usb.h>
> > #include <plat/gpmc-smc91x.h>
> >
> > -#include "mmc-twl4030.h"
> > +#include "hsmmc.h"
> >
> > #define SDP2430_CS0_BASE 0x04000000
> > #define SECONDARY_LCD_GPIO 147
> > diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-
> > omap2/board-3430sdp.c
> > index c90b0d0..a0cf00f 100644
> > --- a/arch/arm/mach-omap2/board-3430sdp.c
> > +++ b/arch/arm/mach-omap2/board-3430sdp.c
> > @@ -43,7 +43,7 @@
> >
> > #include "mux.h"
> > #include "sdram-qimonda-hyb18m512160af-6.h"
> > -#include "mmc-twl4030.h"
> > +#include "hsmmc.h"
> >
> > #define CONFIG_DISABLE_HFCLK 1
> >
> > diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-
> > omap2/board-cm-t35.c
> > index 2626a9f..214a2a8 100644
> > --- a/arch/arm/mach-omap2/board-cm-t35.c
> > +++ b/arch/arm/mach-omap2/board-cm-t35.c
> > @@ -46,7 +46,7 @@
> >
> > #include "mux.h"
> > #include "sdram-micron-mt46h32m32lf-6.h"
> > -#include "mmc-twl4030.h"
> > +#include "hsmmc.h"
> >
> > #define CM_T35_GPIO_PENDOWN 57
> >
> > diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-
> > omap2/board-igep0020.c
> > index 117b8fd..9db061f 100644
> > --- a/arch/arm/mach-omap2/board-igep0020.c
> > +++ b/arch/arm/mach-omap2/board-igep0020.c
> > @@ -30,7 +30,7 @@
> > #include <plat/usb.h>
> >
> > #include "mux.h"
> > -#include "mmc-twl4030.h"
> > +#include "hsmmc.h"
> >
> > #define IGEP2_SMSC911X_CS 5
> > #define IGEP2_SMSC911X_GPIO 176
> > diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-
> omap2/board-
> > ldp.c
> > index 995d4a2..635f54d 100644
> > --- a/arch/arm/mach-omap2/board-ldp.c
> > +++ b/arch/arm/mach-omap2/board-ldp.c
> > @@ -44,7 +44,7 @@
> > #include <plat/usb.h>
> >
> > #include "mux.h"
> > -#include "mmc-twl4030.h"
> > +#include "hsmmc.h"
> >
> > #define LDP_SMSC911X_CS 1
> > #define LDP_SMSC911X_GPIO 152
> > diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-
> > omap2/board-omap3beagle.c
> > index 231cb4e..aaa9760 100644
> > --- a/arch/arm/mach-omap2/board-omap3beagle.c
> > +++ b/arch/arm/mach-omap2/board-omap3beagle.c
> > @@ -45,7 +45,7 @@
> > #include <plat/timer-gp.h>
> >
> > #include "mux.h"
> > -#include "mmc-twl4030.h"
> > +#include "hsmmc.h"
> >
> > #define GPMC_CS0_BASE 0x60
> > #define GPMC_CS_SIZE 0x30
> > diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-
> > omap2/board-omap3evm.c
> > index 34de178..2dd52ad 100644
> > --- a/arch/arm/mach-omap2/board-omap3evm.c
> > +++ b/arch/arm/mach-omap2/board-omap3evm.c
> > @@ -44,7 +44,7 @@
> >
> > #include "mux.h"
> > #include "sdram-micron-mt46h32m32lf-6.h"
> > -#include "mmc-twl4030.h"
> > +#include "hsmmc.h"
> >
> > #define OMAP3_EVM_TS_GPIO 175
> > #define OMAP3_EVM_EHCI_VBUS 22
> > diff --git a/arch/arm/mach-omap2/board-omap3pandora.c b/arch/arm/mach-
> > omap2/board-omap3pandora.c
> > index ef17cf1..3a11506 100644
> > --- a/arch/arm/mach-omap2/board-omap3pandora.c
> > +++ b/arch/arm/mach-omap2/board-omap3pandora.c
> > @@ -43,7 +43,7 @@
> >
> > #include "mux.h"
> > #include "sdram-micron-mt46h32m32lf-6.h"
> > -#include "mmc-twl4030.h"
> > +#include "hsmmc.h"
> >
> > #define OMAP3_PANDORA_TS_GPIO 94
> >
> > diff --git a/arch/arm/mach-omap2/board-omap3touchbook.c b/arch/arm/mach-
> > omap2/board-omap3touchbook.c
> > index fe3d22c..8efef51 100644
> > --- a/arch/arm/mach-omap2/board-omap3touchbook.c
> > +++ b/arch/arm/mach-omap2/board-omap3touchbook.c
> > @@ -50,7 +50,7 @@
> > #include <plat/timer-gp.h>
> >
> > #include "mux.h"
> > -#include "mmc-twl4030.h"
> > +#include "hsmmc.h"
> >
> > #include <asm/setup.h>
> >
> > diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-
> > omap2/board-overo.c
> > index d192dd9..8a9d439 100644
> > --- a/arch/arm/mach-omap2/board-overo.c
> > +++ b/arch/arm/mach-omap2/board-overo.c
> > @@ -48,7 +48,7 @@
> >
> > #include "mux.h"
> > #include "sdram-micron-mt46h32m32lf-6.h"
> > -#include "mmc-twl4030.h"
> > +#include "hsmmc.h"
> >
> > #define OVERO_GPIO_BT_XGATE 15
> > #define OVERO_GPIO_W2W_NRESET 16
> > diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c
> b/arch/arm/mach-
> > omap2/board-rx51-peripherals.c
> > index acafdbc..b2de206 100644
> > --- a/arch/arm/mach-omap2/board-rx51-peripherals.c
> > +++ b/arch/arm/mach-omap2/board-rx51-peripherals.c
> > @@ -34,7 +34,7 @@
> > #include <plat/gpmc-smc91x.h>
> >
> > #include "mux.h"
> > -#include "mmc-twl4030.h"
> > +#include "hsmmc.h"
> >
> > #define SYSTEM_REV_B_USES_VAUX3 0x1699
> > #define SYSTEM_REV_S_USES_VAUX3 0x8
> > diff --git a/arch/arm/mach-omap2/board-zoom-peripherals.c
> b/arch/arm/mach-
> > omap2/board-zoom-peripherals.c
> > index 5c8474c..671dd06 100755
> > --- a/arch/arm/mach-omap2/board-zoom-peripherals.c
> > +++ b/arch/arm/mach-omap2/board-zoom-peripherals.c
> > @@ -25,7 +25,7 @@
> > #include <plat/usb.h>
> >
> > #include "mux.h"
> > -#include "mmc-twl4030.h"
> > +#include "hsmmc.h"
> >
> > /* Zoom2 has Qwerty keyboard*/
> > static int board_keymap[] = {
> > diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c
> > new file mode 100644
> > index 0000000..b88c538
> > --- /dev/null
> > +++ b/arch/arm/mach-omap2/hsmmc.c
> > @@ -0,0 +1,247 @@
> > +/*
> > + * linux/arch/arm/mach-omap2/hsmmc.c
> > + *
> > + * Copyright (C) 2007-2008 Texas Instruments
> > + * Copyright (C) 2008 Nokia Corporation
> > + * Author: Texas Instruments
> > + *
> > + * 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.
> > + */
> > +#include <linux/kernel.h>
> > +#include <linux/slab.h>
> > +#include <linux/string.h>
> > +#include <linux/delay.h>
> > +#include <mach/hardware.h>
> > +#include <plat/control.h>
> > +#include <plat/mmc.h>
> > +
> > +#include "hsmmc.h"
> > +
> > +#if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
> > +
> > +static u16 control_pbias_offset;
> > +static u16 control_devconf1_offset;
> > +
> > +#define HSMMC_NAME_LEN 9
> > +
> > +static struct twl_mmc_controller {
>
> Now that this file is hsmmc specific, how about renaming this as
> "hsmmc_controller"?
>
My bad, please ignore. The 3rd patch in the series seems to take care of
renaming these bits.
Regards,
Madhu
> > + char name[HSMMC_NAME_LEN + 1];
> > +} hsmmc[OMAP34XX_NR_MMC];
> > +
> > +#if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM)
> > +
> > +static int twl4030_mmc_get_context_loss(struct device *dev)
>
> Ditto, hsmmc_get_context_loss?
>
> > +{
> > + /* FIXME: PM DPS not implemented yet */
> > + return 0;
> > +}
> > +
> > +#else
> > +#define twl4030_mmc_get_context_loss NULL
> > +#endif
> > +
> > +static void hsmmc1_before_set_reg(struct device *dev, int slot,
> > + int power_on, int vdd)
> > +{
> > + u32 reg, prog_io;
> > + struct omap_mmc_platform_data *mmc = dev->platform_data;
> > +
> > + /*
> > + * Assume we power both OMAP VMMC1 (for CMD, CLK, DAT0..3) and the
> > + * card with Vcc regulator (from twl4030 or whatever). OMAP has
> > both
> > + * 1.8V and 3.0V modes, controlled by the PBIAS register.
> > + *
> > + * In 8-bit modes, OMAP VMMC1A (for DAT4..7) needs a supply, which
> > + * is most naturally TWL VSIM; those pins also use PBIAS.
> > + *
> > + * FIXME handle VMMC1A as needed ...
> > + */
> > + if (power_on) {
> > + if (cpu_is_omap2430()) {
> > + reg = omap_ctrl_readl(OMAP243X_CONTROL_DEVCONF1);
> > + if ((1 << vdd) >= MMC_VDD_30_31)
> > + reg |= OMAP243X_MMC1_ACTIVE_OVERWRITE;
> > + else
> > + reg &= ~OMAP243X_MMC1_ACTIVE_OVERWRITE;
> > + omap_ctrl_writel(reg, OMAP243X_CONTROL_DEVCONF1);
> > + }
> > +
> > + if (mmc->slots[0].internal_clock) {
> > + reg = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
> > + reg |= OMAP2_MMCSDIO1ADPCLKISEL;
> > + omap_ctrl_writel(reg, OMAP2_CONTROL_DEVCONF0);
> > + }
> > +
> > + reg = omap_ctrl_readl(control_pbias_offset);
> > + if (cpu_is_omap3630()) {
> > + /* Set MMC I/O to 52Mhz */
> > + prog_io =
> omap_ctrl_readl(OMAP343X_CONTROL_PROG_IO1);
> > + prog_io |= OMAP3630_PRG_SDMMC1_SPEEDCTRL;
> > + omap_ctrl_writel(prog_io,
> OMAP343X_CONTROL_PROG_IO1);
> > + } else {
> > + reg |= OMAP2_PBIASSPEEDCTRL0;
> > + }
> > + reg &= ~OMAP2_PBIASLITEPWRDNZ0;
> > + omap_ctrl_writel(reg, control_pbias_offset);
> > + } else {
> > + reg = omap_ctrl_readl(control_pbias_offset);
> > + reg &= ~OMAP2_PBIASLITEPWRDNZ0;
> > + omap_ctrl_writel(reg, control_pbias_offset);
> > + }
> > +}
> > +
> > +static void hsmmc1_after_set_reg(struct device *dev, int slot,
> > + int power_on, int vdd)
> > +{
> > + u32 reg;
> > +
> > + /* 100ms delay required for PBIAS configuration */
> > + msleep(100);
> > +
> > + if (power_on) {
> > + reg = omap_ctrl_readl(control_pbias_offset);
> > + reg |= (OMAP2_PBIASLITEPWRDNZ0 | OMAP2_PBIASSPEEDCTRL0);
> > + if ((1 << vdd) <= MMC_VDD_165_195)
> > + reg &= ~OMAP2_PBIASLITEVMODE0;
> > + else
> > + reg |= OMAP2_PBIASLITEVMODE0;
> > + omap_ctrl_writel(reg, control_pbias_offset);
> > + } else {
> > + reg = omap_ctrl_readl(control_pbias_offset);
> > + reg |= (OMAP2_PBIASSPEEDCTRL0 | OMAP2_PBIASLITEPWRDNZ0 |
> > + OMAP2_PBIASLITEVMODE0);
> > + omap_ctrl_writel(reg, control_pbias_offset);
> > + }
> > +}
> > +
> > +static void hsmmc23_before_set_reg(struct device *dev, int slot,
> > + int power_on, int vdd)
> > +{
> > + struct omap_mmc_platform_data *mmc = dev->platform_data;
> > +
> > + if (power_on) {
> > + /* Only MMC2 supports a CLKIN */
> > + if (mmc->slots[0].internal_clock) {
> > + u32 reg;
> > +
> > + reg = omap_ctrl_readl(control_devconf1_offset);
> > + reg |= OMAP2_MMCSDIO2ADPCLKISEL;
> > + omap_ctrl_writel(reg, control_devconf1_offset);
> > + }
> > + }
> > +}
> > +
> > +static struct omap_mmc_platform_data *hsmmc_data[OMAP34XX_NR_MMC]
> > __initdata;
> > +
> > +void __init twl4030_mmc_init(struct twl4030_hsmmc_info *controllers)
>
> Ditto, hsmmc_init?
>
> > +{
> > + struct twl4030_hsmmc_info *c;
> > + int nr_hsmmc = ARRAY_SIZE(hsmmc_data);
> > +
> > + if (cpu_is_omap2430()) {
> > + control_pbias_offset = OMAP243X_CONTROL_PBIAS_LITE;
> > + control_devconf1_offset = OMAP243X_CONTROL_DEVCONF1;
> > + } else {
> > + control_pbias_offset = OMAP343X_CONTROL_PBIAS_LITE;
> > + control_devconf1_offset = OMAP343X_CONTROL_DEVCONF1;
> > + }
> > +
> > + for (c = controllers; c->mmc; c++) {
> > + struct twl_mmc_controller *twl = hsmmc + c->mmc - 1;
> > + struct omap_mmc_platform_data *mmc = hsmmc_data[c->mmc - 1];
> > +
> > + if (!c->mmc || c->mmc > nr_hsmmc) {
> > + pr_debug("MMC%d: no such controller\n", c->mmc);
> > + continue;
> > + }
> > + if (mmc) {
> > + pr_debug("MMC%d: already configured\n", c->mmc);
> > + continue;
> > + }
> > +
> > + mmc = kzalloc(sizeof(struct omap_mmc_platform_data),
> > GFP_KERNEL);
> > + if (!mmc) {
> > + pr_err("Cannot allocate memory for mmc device!\n");
> > + return;
> > + }
> > +
> > + if (c->name)
> > + strncpy(twl->name, c->name, HSMMC_NAME_LEN);
> > + else
> > + snprintf(twl->name, ARRAY_SIZE(twl->name),
> > + "mmc%islot%i", c->mmc, 1);
> > + mmc->slots[0].name = twl->name;
> > + mmc->nr_slots = 1;
> > + mmc->slots[0].wires = c->wires;
> > + mmc->slots[0].internal_clock = !c->ext_clock;
> > + mmc->dma_mask = 0xffffffff;
> > +
> > + mmc->get_context_loss_count =
> > + twl4030_mmc_get_context_loss;
> > +
> > + mmc->slots[0].switch_pin = c->gpio_cd;
> > + mmc->slots[0].gpio_wp = c->gpio_wp;
> > +
> > + if (c->cover_only)
> > + mmc->slots[0].cover = 1;
> > +
> > + if (c->nonremovable)
> > + mmc->slots[0].nonremovable = 1;
> > +
> > + if (c->power_saving)
> > + mmc->slots[0].power_saving = 1;
> > +
> > + /* NOTE: MMC slots should have a Vcc regulator set up.
> > + * This may be from a TWL4030-family chip, another
> > + * controllable regulator, or a fixed supply.
> > + *
> > + * temporary HACK: ocr_mask instead of fixed supply
> > + */
> > + mmc->slots[0].ocr_mask = c->ocr_mask;
> > +
> > + switch (c->mmc) {
> > + case 1:
> > + /* on-chip level shifting via PBIAS0/PBIAS1 */
> > + mmc->slots[0].before_set_reg =
> hsmmc1_before_set_reg;
> > + mmc->slots[0].after_set_reg = hsmmc1_after_set_reg;
> > +
> > + /* Omap3630 HSMMC1 supports only 4-bit */
> > + if (cpu_is_omap3630() && c->wires > 4) {
> > + c->wires = 4;
> > + mmc->slots[0].wires = c->wires;
> > + }
> > + break;
> > + case 2:
> > + if (c->ext_clock)
> > + c->transceiver = 1;
> > + if (c->transceiver && c->wires > 4)
> > + c->wires = 4;
> > + /* FALLTHROUGH */
> > + case 3:
> > + /* off-chip level shifting, or none */
> > + mmc->slots[0].before_set_reg =
> hsmmc23_before_set_reg;
> > + mmc->slots[0].after_set_reg = NULL;
> > + break;
> > + default:
> > + pr_err("MMC%d configuration not supported!\n",
> c->mmc);
> > + kfree(mmc);
> > + continue;
> > + }
> > + hsmmc_data[c->mmc - 1] = mmc;
> > + }
> > +
> > + omap2_init_mmc(hsmmc_data, OMAP34XX_NR_MMC);
> > +
> > + /* pass the device nodes back to board setup code */
> > + for (c = controllers; c->mmc; c++) {
> > + struct omap_mmc_platform_data *mmc = hsmmc_data[c->mmc - 1];
> > +
> > + if (!c->mmc || c->mmc > nr_hsmmc)
> > + continue;
> > + c->dev = mmc->dev;
> > + }
> > +}
> > +
> > +#endif
> > diff --git a/arch/arm/mach-omap2/hsmmc.h b/arch/arm/mach-omap2/hsmmc.h
> > new file mode 100644
> > index 0000000..87d67c1
> > --- /dev/null
> > +++ b/arch/arm/mach-omap2/hsmmc.h
> > @@ -0,0 +1,34 @@
> > +/*
> > + * MMC definitions for OMAP2
> > + *
> > + * 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.
> > + */
> > +
> > +struct twl4030_hsmmc_info {
> > + u8 mmc; /* controller 1/2/3 */
> > + u8 wires; /* 1/4/8 wires */
> > + bool transceiver; /* MMC-2 option */
> > + bool ext_clock; /* use external pin for input clock */
> > + bool cover_only; /* No card detect - just cover switch */
> > + bool nonremovable; /* Nonremovable e.g. eMMC */
> > + bool power_saving; /* Try to sleep or power off when possible
> > */
> > + int gpio_cd; /* or -EINVAL */
> > + int gpio_wp; /* or -EINVAL */
> > + char *name; /* or NULL for default */
> > + struct device *dev; /* returned: pointer to mmc adapter */
> > + int ocr_mask; /* temporary HACK */
> > +};
> > +
> > +#if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
> > +
> > +void twl4030_mmc_init(struct twl4030_hsmmc_info *);
>
> Ditto
>
> > +
> > +#else
> > +
> > +static inline void twl4030_mmc_init(struct twl4030_hsmmc_info *info)
> > +{
> > +}
> > +
> > +#endif
> > diff --git a/arch/arm/mach-omap2/mmc-twl4030.c b/arch/arm/mach-
> omap2/mmc-
> > twl4030.c
> > deleted file mode 100644
> > index 9d5ad0b..0000000
> > --- a/arch/arm/mach-omap2/mmc-twl4030.c
> > +++ /dev/null
> > @@ -1,247 +0,0 @@
> > -/*
> > - * linux/arch/arm/mach-omap2/mmc-twl4030.c
> > - *
> > - * Copyright (C) 2007-2008 Texas Instruments
> > - * Copyright (C) 2008 Nokia Corporation
> > - * Author: Texas Instruments
> > - *
> > - * 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.
> > - */
> > -#include <linux/kernel.h>
> > -#include <linux/slab.h>
> > -#include <linux/string.h>
> > -#include <linux/delay.h>
> > -#include <mach/hardware.h>
> > -#include <plat/control.h>
> > -#include <plat/mmc.h>
> > -
> > -#include "mmc-twl4030.h"
> > -
> > -#if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
> > -
> > -static u16 control_pbias_offset;
> > -static u16 control_devconf1_offset;
> > -
> > -#define HSMMC_NAME_LEN 9
> > -
> > -static struct twl_mmc_controller {
> > - char name[HSMMC_NAME_LEN + 1];
> > -} hsmmc[OMAP34XX_NR_MMC];
> > -
> > -#if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM)
> > -
> > -static int twl4030_mmc_get_context_loss(struct device *dev)
> > -{
> > - /* FIXME: PM DPS not implemented yet */
> > - return 0;
> > -}
> > -
> > -#else
> > -#define twl4030_mmc_get_context_loss NULL
> > -#endif
> > -
> > -static void hsmmc1_before_set_reg(struct device *dev, int slot,
> > - int power_on, int vdd)
> > -{
> > - u32 reg, prog_io;
> > - struct omap_mmc_platform_data *mmc = dev->platform_data;
> > -
> > - /*
> > - * Assume we power both OMAP VMMC1 (for CMD, CLK, DAT0..3) and the
> > - * card with Vcc regulator (from twl4030 or whatever). OMAP has
> > both
> > - * 1.8V and 3.0V modes, controlled by the PBIAS register.
> > - *
> > - * In 8-bit modes, OMAP VMMC1A (for DAT4..7) needs a supply, which
> > - * is most naturally TWL VSIM; those pins also use PBIAS.
> > - *
> > - * FIXME handle VMMC1A as needed ...
> > - */
> > - if (power_on) {
> > - if (cpu_is_omap2430()) {
> > - reg = omap_ctrl_readl(OMAP243X_CONTROL_DEVCONF1);
> > - if ((1 << vdd) >= MMC_VDD_30_31)
> > - reg |= OMAP243X_MMC1_ACTIVE_OVERWRITE;
> > - else
> > - reg &= ~OMAP243X_MMC1_ACTIVE_OVERWRITE;
> > - omap_ctrl_writel(reg, OMAP243X_CONTROL_DEVCONF1);
> > - }
> > -
> > - if (mmc->slots[0].internal_clock) {
> > - reg = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
> > - reg |= OMAP2_MMCSDIO1ADPCLKISEL;
> > - omap_ctrl_writel(reg, OMAP2_CONTROL_DEVCONF0);
> > - }
> > -
> > - reg = omap_ctrl_readl(control_pbias_offset);
> > - if (cpu_is_omap3630()) {
> > - /* Set MMC I/O to 52Mhz */
> > - prog_io =
> omap_ctrl_readl(OMAP343X_CONTROL_PROG_IO1);
> > - prog_io |= OMAP3630_PRG_SDMMC1_SPEEDCTRL;
> > - omap_ctrl_writel(prog_io,
> OMAP343X_CONTROL_PROG_IO1);
> > - } else {
> > - reg |= OMAP2_PBIASSPEEDCTRL0;
> > - }
> > - reg &= ~OMAP2_PBIASLITEPWRDNZ0;
> > - omap_ctrl_writel(reg, control_pbias_offset);
> > - } else {
> > - reg = omap_ctrl_readl(control_pbias_offset);
> > - reg &= ~OMAP2_PBIASLITEPWRDNZ0;
> > - omap_ctrl_writel(reg, control_pbias_offset);
> > - }
> > -}
> > -
> > -static void hsmmc1_after_set_reg(struct device *dev, int slot,
> > - int power_on, int vdd)
> > -{
> > - u32 reg;
> > -
> > - /* 100ms delay required for PBIAS configuration */
> > - msleep(100);
> > -
> > - if (power_on) {
> > - reg = omap_ctrl_readl(control_pbias_offset);
> > - reg |= (OMAP2_PBIASLITEPWRDNZ0 | OMAP2_PBIASSPEEDCTRL0);
> > - if ((1 << vdd) <= MMC_VDD_165_195)
> > - reg &= ~OMAP2_PBIASLITEVMODE0;
> > - else
> > - reg |= OMAP2_PBIASLITEVMODE0;
> > - omap_ctrl_writel(reg, control_pbias_offset);
> > - } else {
> > - reg = omap_ctrl_readl(control_pbias_offset);
> > - reg |= (OMAP2_PBIASSPEEDCTRL0 | OMAP2_PBIASLITEPWRDNZ0 |
> > - OMAP2_PBIASLITEVMODE0);
> > - omap_ctrl_writel(reg, control_pbias_offset);
> > - }
> > -}
> > -
> > -static void hsmmc23_before_set_reg(struct device *dev, int slot,
> > - int power_on, int vdd)
> > -{
> > - struct omap_mmc_platform_data *mmc = dev->platform_data;
> > -
> > - if (power_on) {
> > - /* Only MMC2 supports a CLKIN */
> > - if (mmc->slots[0].internal_clock) {
> > - u32 reg;
> > -
> > - reg = omap_ctrl_readl(control_devconf1_offset);
> > - reg |= OMAP2_MMCSDIO2ADPCLKISEL;
> > - omap_ctrl_writel(reg, control_devconf1_offset);
> > - }
> > - }
> > -}
> > -
> > -static struct omap_mmc_platform_data *hsmmc_data[OMAP34XX_NR_MMC]
> > __initdata;
> > -
> > -void __init twl4030_mmc_init(struct twl4030_hsmmc_info *controllers)
> > -{
> > - struct twl4030_hsmmc_info *c;
> > - int nr_hsmmc = ARRAY_SIZE(hsmmc_data);
> > -
> > - if (cpu_is_omap2430()) {
> > - control_pbias_offset = OMAP243X_CONTROL_PBIAS_LITE;
> > - control_devconf1_offset = OMAP243X_CONTROL_DEVCONF1;
> > - } else {
> > - control_pbias_offset = OMAP343X_CONTROL_PBIAS_LITE;
> > - control_devconf1_offset = OMAP343X_CONTROL_DEVCONF1;
> > - }
> > -
> > - for (c = controllers; c->mmc; c++) {
> > - struct twl_mmc_controller *twl = hsmmc + c->mmc - 1;
> > - struct omap_mmc_platform_data *mmc = hsmmc_data[c->mmc - 1];
> > -
> > - if (!c->mmc || c->mmc > nr_hsmmc) {
> > - pr_debug("MMC%d: no such controller\n", c->mmc);
> > - continue;
> > - }
> > - if (mmc) {
> > - pr_debug("MMC%d: already configured\n", c->mmc);
> > - continue;
> > - }
> > -
> > - mmc = kzalloc(sizeof(struct omap_mmc_platform_data),
> > GFP_KERNEL);
> > - if (!mmc) {
> > - pr_err("Cannot allocate memory for mmc device!\n");
> > - return;
> > - }
> > -
> > - if (c->name)
> > - strncpy(twl->name, c->name, HSMMC_NAME_LEN);
> > - else
> > - snprintf(twl->name, ARRAY_SIZE(twl->name),
> > - "mmc%islot%i", c->mmc, 1);
> > - mmc->slots[0].name = twl->name;
> > - mmc->nr_slots = 1;
> > - mmc->slots[0].wires = c->wires;
> > - mmc->slots[0].internal_clock = !c->ext_clock;
> > - mmc->dma_mask = 0xffffffff;
> > -
> > - mmc->get_context_loss_count =
> > - twl4030_mmc_get_context_loss;
> > -
> > - mmc->slots[0].switch_pin = c->gpio_cd;
> > - mmc->slots[0].gpio_wp = c->gpio_wp;
> > -
> > - if (c->cover_only)
> > - mmc->slots[0].cover = 1;
> > -
> > - if (c->nonremovable)
> > - mmc->slots[0].nonremovable = 1;
> > -
> > - if (c->power_saving)
> > - mmc->slots[0].power_saving = 1;
> > -
> > - /* NOTE: MMC slots should have a Vcc regulator set up.
> > - * This may be from a TWL4030-family chip, another
> > - * controllable regulator, or a fixed supply.
> > - *
> > - * temporary HACK: ocr_mask instead of fixed supply
> > - */
> > - mmc->slots[0].ocr_mask = c->ocr_mask;
> > -
> > - switch (c->mmc) {
> > - case 1:
> > - /* on-chip level shifting via PBIAS0/PBIAS1 */
> > - mmc->slots[0].before_set_reg =
> hsmmc1_before_set_reg;
> > - mmc->slots[0].after_set_reg = hsmmc1_after_set_reg;
> > -
> > - /* Omap3630 HSMMC1 supports only 4-bit */
> > - if (cpu_is_omap3630() && c->wires > 4) {
> > - c->wires = 4;
> > - mmc->slots[0].wires = c->wires;
> > - }
> > - break;
> > - case 2:
> > - if (c->ext_clock)
> > - c->transceiver = 1;
> > - if (c->transceiver && c->wires > 4)
> > - c->wires = 4;
> > - /* FALLTHROUGH */
> > - case 3:
> > - /* off-chip level shifting, or none */
> > - mmc->slots[0].before_set_reg =
> hsmmc23_before_set_reg;
> > - mmc->slots[0].after_set_reg = NULL;
> > - break;
> > - default:
> > - pr_err("MMC%d configuration not supported!\n",
> c->mmc);
> > - kfree(mmc);
> > - continue;
> > - }
> > - hsmmc_data[c->mmc - 1] = mmc;
> > - }
> > -
> > - omap2_init_mmc(hsmmc_data, OMAP34XX_NR_MMC);
> > -
> > - /* pass the device nodes back to board setup code */
> > - for (c = controllers; c->mmc; c++) {
> > - struct omap_mmc_platform_data *mmc = hsmmc_data[c->mmc - 1];
> > -
> > - if (!c->mmc || c->mmc > nr_hsmmc)
> > - continue;
> > - c->dev = mmc->dev;
> > - }
> > -}
> > -
> > -#endif
> > diff --git a/arch/arm/mach-omap2/mmc-twl4030.h b/arch/arm/mach-
> omap2/mmc-
> > twl4030.h
> > deleted file mode 100644
> > index 87d67c1..0000000
> > --- a/arch/arm/mach-omap2/mmc-twl4030.h
> > +++ /dev/null
> > @@ -1,34 +0,0 @@
> > -/*
> > - * MMC definitions for OMAP2
> > - *
> > - * 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.
> > - */
> > -
> > -struct twl4030_hsmmc_info {
> > - u8 mmc; /* controller 1/2/3 */
> > - u8 wires; /* 1/4/8 wires */
> > - bool transceiver; /* MMC-2 option */
> > - bool ext_clock; /* use external pin for input clock */
> > - bool cover_only; /* No card detect - just cover switch */
> > - bool nonremovable; /* Nonremovable e.g. eMMC */
> > - bool power_saving; /* Try to sleep or power off when possible
> > */
> > - int gpio_cd; /* or -EINVAL */
> > - int gpio_wp; /* or -EINVAL */
> > - char *name; /* or NULL for default */
> > - struct device *dev; /* returned: pointer to mmc adapter */
> > - int ocr_mask; /* temporary HACK */
> > -};
> > -
> > -#if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
> > -
> > -void twl4030_mmc_init(struct twl4030_hsmmc_info *);
> > -
> > -#else
> > -
> > -static inline void twl4030_mmc_init(struct twl4030_hsmmc_info *info)
> > -{
> > -}
> > -
> > -#endif
> > --
> > 1.6.0.4
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 21+ messages in thread* Re: [PATCH V2 2/10] omap: Rename mmc-twl4030 files to hsmmc
2010-01-20 23:48 ` Madhusudhan
@ 2010-01-21 9:07 ` Adrian Hunter
2010-01-21 17:23 ` Madhusudhan
0 siblings, 1 reply; 21+ messages in thread
From: Adrian Hunter @ 2010-01-21 9:07 UTC (permalink / raw)
To: Madhusudhan
Cc: 'Tony Lindgren', 'Paul Walmsley',
'linux-omap Mailing List',
'linux-mmc Mailing List', 'Andrew Morton'
ext Madhusudhan wrote:
>
>> -----Original Message-----
>> From: linux-mmc-owner@vger.kernel.org [mailto:linux-mmc-
>> owner@vger.kernel.org] On Behalf Of Madhusudhan
>> Sent: Wednesday, January 20, 2010 5:42 PM
>> To: 'Adrian Hunter'; 'Tony Lindgren'
>> Cc: 'Paul Walmsley'; 'linux-omap Mailing List'; 'linux-mmc Mailing List';
>> 'Andrew Morton'
>> Subject: RE: [PATCH V2 2/10] omap: Rename mmc-twl4030 files to hsmmc
>>
>>
>>
>>> -----Original Message-----
>>> From: Adrian Hunter [mailto:adrian.hunter@nokia.com]
>>> Sent: Saturday, January 16, 2010 7:33 PM
>>> To: Tony Lindgren
>>> Cc: Adrian Hunter; Madhusudhan Chikkature; Paul Walmsley; linux-omap
>>> Mailing List; linux-mmc Mailing List; Andrew Morton
>>> Subject: [PATCH V2 2/10] omap: Rename mmc-twl4030 files to hsmmc
>>>
>>> From a65fae702aa81d4596d6fbefd2ab3c8ea87c244a Mon Sep 17 00:00:00 2001
>>> From: Adrian Hunter <adrian.hunter@nokia.com>
>>> Date: Sun, 17 Jan 2010 02:34:22 +0200
>>> Subject: [PATCH] omap: Rename mmc-twl4030 files to hsmmc
>>>
>>> mmc-twl4030.[ch] no longer has any dependency on twl4030
>>> and should be renamed to reflect that.
>>>
>>> Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
>>> ---
>>> arch/arm/mach-omap2/Makefile | 28 ++--
>>> arch/arm/mach-omap2/board-2430sdp.c | 2 +-
>>> arch/arm/mach-omap2/board-3430sdp.c | 2 +-
>>> arch/arm/mach-omap2/board-cm-t35.c | 2 +-
>>> arch/arm/mach-omap2/board-igep0020.c | 2 +-
>>> arch/arm/mach-omap2/board-ldp.c | 2 +-
>>> arch/arm/mach-omap2/board-omap3beagle.c | 2 +-
>>> arch/arm/mach-omap2/board-omap3evm.c | 2 +-
>>> arch/arm/mach-omap2/board-omap3pandora.c | 2 +-
>>> arch/arm/mach-omap2/board-omap3touchbook.c | 2 +-
>>> arch/arm/mach-omap2/board-overo.c | 2 +-
>>> arch/arm/mach-omap2/board-rx51-peripherals.c | 2 +-
>>> arch/arm/mach-omap2/board-zoom-peripherals.c | 2 +-
>>> arch/arm/mach-omap2/hsmmc.c | 247
>>> ++++++++++++++++++++++++++
>>> arch/arm/mach-omap2/hsmmc.h | 34 ++++
>>> arch/arm/mach-omap2/mmc-twl4030.c | 247 -------------------
>> --
>>> -----
>>> arch/arm/mach-omap2/mmc-twl4030.h | 34 ----
>>> 17 files changed, 307 insertions(+), 307 deletions(-)
>>> create mode 100644 arch/arm/mach-omap2/hsmmc.c
>>> create mode 100644 arch/arm/mach-omap2/hsmmc.h
>>> delete mode 100644 arch/arm/mach-omap2/mmc-twl4030.c
>>> delete mode 100644 arch/arm/mach-omap2/mmc-twl4030.h
>>>
>>> diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
>>> index b32678b..a7e4c5a 100644
>>> --- a/arch/arm/mach-omap2/Makefile
>>> +++ b/arch/arm/mach-omap2/Makefile
>>> @@ -71,42 +71,42 @@ obj-y +=
>> $(i2c-omap-m)
>>> $(i2c-omap-y)
>>> obj-$(CONFIG_MACH_OMAP_GENERIC) += board-generic.o
>>> obj-$(CONFIG_MACH_OMAP_H4) += board-h4.o
>>> obj-$(CONFIG_MACH_OMAP_2430SDP) += board-2430sdp.o \
>>> - mmc-twl4030.o
>>> + hsmmc.o
>>> obj-$(CONFIG_MACH_OMAP_APOLLON) += board-apollon.o
>>> obj-$(CONFIG_MACH_OMAP3_BEAGLE) += board-omap3beagle.o \
>>> - mmc-twl4030.o
>>> + hsmmc.o
>>> obj-$(CONFIG_MACH_OMAP_LDP) += board-ldp.o \
>>> - mmc-twl4030.o
>>> + hsmmc.o
>>> obj-$(CONFIG_MACH_OVERO) += board-overo.o \
>>> - mmc-twl4030.o
>>> + hsmmc.o
>>> obj-$(CONFIG_MACH_OMAP3EVM) += board-omap3evm.o \
>>> - mmc-twl4030.o
>>> + hsmmc.o
>>> obj-$(CONFIG_MACH_OMAP3_PANDORA) += board-omap3pandora.o \
>>> - mmc-twl4030.o
>>> + hsmmc.o
>>> obj-$(CONFIG_MACH_OMAP_3430SDP) += board-3430sdp.o \
>>> - mmc-twl4030.o
>>> + hsmmc.o
>>> obj-$(CONFIG_MACH_NOKIA_N8X0) += board-n8x0.o
>>> obj-$(CONFIG_MACH_NOKIA_RX51) += board-rx51.o \
>>> board-rx51-sdram.o \
>>> board-rx51-peripherals.o \
>>> - mmc-twl4030.o
>>> + hsmmc.o
>>> obj-$(CONFIG_MACH_OMAP_ZOOM2) += board-zoom2.o \
>>> board-zoom-peripherals.o \
>>> - mmc-twl4030.o \
>>> + hsmmc.o \
>>> board-zoom-debugboard.o
>>> obj-$(CONFIG_MACH_OMAP_ZOOM3) += board-zoom3.o \
>>> board-zoom-peripherals.o \
>>> - mmc-twl4030.o \
>>> + hsmmc.o \
>>> board-zoom-debugboard.o
>>> obj-$(CONFIG_MACH_OMAP_3630SDP) += board-3630sdp.o \
>>> board-zoom-peripherals.o \
>>> - mmc-twl4030.o
>>> + hsmmc.o
>>> obj-$(CONFIG_MACH_CM_T35) += board-cm-t35.o \
>>> - mmc-twl4030.o
>>> + hsmmc.o
>>> obj-$(CONFIG_MACH_IGEP0020) += board-igep0020.o \
>>> - mmc-twl4030.o
>>> + hsmmc.o
>>> obj-$(CONFIG_MACH_OMAP3_TOUCHBOOK) += board-omap3touchbook.o \
>>> - mmc-twl4030.o
>>> + hsmmc.o
>>> obj-$(CONFIG_MACH_OMAP_4430SDP) += board-4430sdp.o
>>>
>>> obj-$(CONFIG_MACH_OMAP3517EVM) += board-am3517evm.o
>>> diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-
>>> omap2/board-2430sdp.c
>>> index 31042ee..e42848d 100644
>>> --- a/arch/arm/mach-omap2/board-2430sdp.c
>>> +++ b/arch/arm/mach-omap2/board-2430sdp.c
>>> @@ -38,7 +38,7 @@
>>> #include <plat/usb.h>
>>> #include <plat/gpmc-smc91x.h>
>>>
>>> -#include "mmc-twl4030.h"
>>> +#include "hsmmc.h"
>>>
>>> #define SDP2430_CS0_BASE 0x04000000
>>> #define SECONDARY_LCD_GPIO 147
>>> diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-
>>> omap2/board-3430sdp.c
>>> index c90b0d0..a0cf00f 100644
>>> --- a/arch/arm/mach-omap2/board-3430sdp.c
>>> +++ b/arch/arm/mach-omap2/board-3430sdp.c
>>> @@ -43,7 +43,7 @@
>>>
>>> #include "mux.h"
>>> #include "sdram-qimonda-hyb18m512160af-6.h"
>>> -#include "mmc-twl4030.h"
>>> +#include "hsmmc.h"
>>>
>>> #define CONFIG_DISABLE_HFCLK 1
>>>
>>> diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-
>>> omap2/board-cm-t35.c
>>> index 2626a9f..214a2a8 100644
>>> --- a/arch/arm/mach-omap2/board-cm-t35.c
>>> +++ b/arch/arm/mach-omap2/board-cm-t35.c
>>> @@ -46,7 +46,7 @@
>>>
>>> #include "mux.h"
>>> #include "sdram-micron-mt46h32m32lf-6.h"
>>> -#include "mmc-twl4030.h"
>>> +#include "hsmmc.h"
>>>
>>> #define CM_T35_GPIO_PENDOWN 57
>>>
>>> diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-
>>> omap2/board-igep0020.c
>>> index 117b8fd..9db061f 100644
>>> --- a/arch/arm/mach-omap2/board-igep0020.c
>>> +++ b/arch/arm/mach-omap2/board-igep0020.c
>>> @@ -30,7 +30,7 @@
>>> #include <plat/usb.h>
>>>
>>> #include "mux.h"
>>> -#include "mmc-twl4030.h"
>>> +#include "hsmmc.h"
>>>
>>> #define IGEP2_SMSC911X_CS 5
>>> #define IGEP2_SMSC911X_GPIO 176
>>> diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-
>> omap2/board-
>>> ldp.c
>>> index 995d4a2..635f54d 100644
>>> --- a/arch/arm/mach-omap2/board-ldp.c
>>> +++ b/arch/arm/mach-omap2/board-ldp.c
>>> @@ -44,7 +44,7 @@
>>> #include <plat/usb.h>
>>>
>>> #include "mux.h"
>>> -#include "mmc-twl4030.h"
>>> +#include "hsmmc.h"
>>>
>>> #define LDP_SMSC911X_CS 1
>>> #define LDP_SMSC911X_GPIO 152
>>> diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-
>>> omap2/board-omap3beagle.c
>>> index 231cb4e..aaa9760 100644
>>> --- a/arch/arm/mach-omap2/board-omap3beagle.c
>>> +++ b/arch/arm/mach-omap2/board-omap3beagle.c
>>> @@ -45,7 +45,7 @@
>>> #include <plat/timer-gp.h>
>>>
>>> #include "mux.h"
>>> -#include "mmc-twl4030.h"
>>> +#include "hsmmc.h"
>>>
>>> #define GPMC_CS0_BASE 0x60
>>> #define GPMC_CS_SIZE 0x30
>>> diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-
>>> omap2/board-omap3evm.c
>>> index 34de178..2dd52ad 100644
>>> --- a/arch/arm/mach-omap2/board-omap3evm.c
>>> +++ b/arch/arm/mach-omap2/board-omap3evm.c
>>> @@ -44,7 +44,7 @@
>>>
>>> #include "mux.h"
>>> #include "sdram-micron-mt46h32m32lf-6.h"
>>> -#include "mmc-twl4030.h"
>>> +#include "hsmmc.h"
>>>
>>> #define OMAP3_EVM_TS_GPIO 175
>>> #define OMAP3_EVM_EHCI_VBUS 22
>>> diff --git a/arch/arm/mach-omap2/board-omap3pandora.c b/arch/arm/mach-
>>> omap2/board-omap3pandora.c
>>> index ef17cf1..3a11506 100644
>>> --- a/arch/arm/mach-omap2/board-omap3pandora.c
>>> +++ b/arch/arm/mach-omap2/board-omap3pandora.c
>>> @@ -43,7 +43,7 @@
>>>
>>> #include "mux.h"
>>> #include "sdram-micron-mt46h32m32lf-6.h"
>>> -#include "mmc-twl4030.h"
>>> +#include "hsmmc.h"
>>>
>>> #define OMAP3_PANDORA_TS_GPIO 94
>>>
>>> diff --git a/arch/arm/mach-omap2/board-omap3touchbook.c b/arch/arm/mach-
>>> omap2/board-omap3touchbook.c
>>> index fe3d22c..8efef51 100644
>>> --- a/arch/arm/mach-omap2/board-omap3touchbook.c
>>> +++ b/arch/arm/mach-omap2/board-omap3touchbook.c
>>> @@ -50,7 +50,7 @@
>>> #include <plat/timer-gp.h>
>>>
>>> #include "mux.h"
>>> -#include "mmc-twl4030.h"
>>> +#include "hsmmc.h"
>>>
>>> #include <asm/setup.h>
>>>
>>> diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-
>>> omap2/board-overo.c
>>> index d192dd9..8a9d439 100644
>>> --- a/arch/arm/mach-omap2/board-overo.c
>>> +++ b/arch/arm/mach-omap2/board-overo.c
>>> @@ -48,7 +48,7 @@
>>>
>>> #include "mux.h"
>>> #include "sdram-micron-mt46h32m32lf-6.h"
>>> -#include "mmc-twl4030.h"
>>> +#include "hsmmc.h"
>>>
>>> #define OVERO_GPIO_BT_XGATE 15
>>> #define OVERO_GPIO_W2W_NRESET 16
>>> diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c
>> b/arch/arm/mach-
>>> omap2/board-rx51-peripherals.c
>>> index acafdbc..b2de206 100644
>>> --- a/arch/arm/mach-omap2/board-rx51-peripherals.c
>>> +++ b/arch/arm/mach-omap2/board-rx51-peripherals.c
>>> @@ -34,7 +34,7 @@
>>> #include <plat/gpmc-smc91x.h>
>>>
>>> #include "mux.h"
>>> -#include "mmc-twl4030.h"
>>> +#include "hsmmc.h"
>>>
>>> #define SYSTEM_REV_B_USES_VAUX3 0x1699
>>> #define SYSTEM_REV_S_USES_VAUX3 0x8
>>> diff --git a/arch/arm/mach-omap2/board-zoom-peripherals.c
>> b/arch/arm/mach-
>>> omap2/board-zoom-peripherals.c
>>> index 5c8474c..671dd06 100755
>>> --- a/arch/arm/mach-omap2/board-zoom-peripherals.c
>>> +++ b/arch/arm/mach-omap2/board-zoom-peripherals.c
>>> @@ -25,7 +25,7 @@
>>> #include <plat/usb.h>
>>>
>>> #include "mux.h"
>>> -#include "mmc-twl4030.h"
>>> +#include "hsmmc.h"
>>>
>>> /* Zoom2 has Qwerty keyboard*/
>>> static int board_keymap[] = {
>>> diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c
>>> new file mode 100644
>>> index 0000000..b88c538
>>> --- /dev/null
>>> +++ b/arch/arm/mach-omap2/hsmmc.c
>>> @@ -0,0 +1,247 @@
>>> +/*
>>> + * linux/arch/arm/mach-omap2/hsmmc.c
>>> + *
>>> + * Copyright (C) 2007-2008 Texas Instruments
>>> + * Copyright (C) 2008 Nokia Corporation
>>> + * Author: Texas Instruments
>>> + *
>>> + * 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.
>>> + */
>>> +#include <linux/kernel.h>
>>> +#include <linux/slab.h>
>>> +#include <linux/string.h>
>>> +#include <linux/delay.h>
>>> +#include <mach/hardware.h>
>>> +#include <plat/control.h>
>>> +#include <plat/mmc.h>
>>> +
>>> +#include "hsmmc.h"
>>> +
>>> +#if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
>>> +
>>> +static u16 control_pbias_offset;
>>> +static u16 control_devconf1_offset;
>>> +
>>> +#define HSMMC_NAME_LEN 9
>>> +
>>> +static struct twl_mmc_controller {
>> Now that this file is hsmmc specific, how about renaming this as
>> "hsmmc_controller"?
>>
>
> My bad, please ignore. The 3rd patch in the series seems to take care of
> renaming these bits.
>
> Regards,
> Madhu
>
Will you be Ack'ing these patches?
>>> + char name[HSMMC_NAME_LEN + 1];
>>> +} hsmmc[OMAP34XX_NR_MMC];
>>> +
>>> +#if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM)
>>> +
>>> +static int twl4030_mmc_get_context_loss(struct device *dev)
>> Ditto, hsmmc_get_context_loss?
>>
>>> +{
>>> + /* FIXME: PM DPS not implemented yet */
>>> + return 0;
>>> +}
>>> +
>>> +#else
>>> +#define twl4030_mmc_get_context_loss NULL
>>> +#endif
>>> +
>>> +static void hsmmc1_before_set_reg(struct device *dev, int slot,
>>> + int power_on, int vdd)
>>> +{
>>> + u32 reg, prog_io;
>>> + struct omap_mmc_platform_data *mmc = dev->platform_data;
>>> +
>>> + /*
>>> + * Assume we power both OMAP VMMC1 (for CMD, CLK, DAT0..3) and the
>>> + * card with Vcc regulator (from twl4030 or whatever). OMAP has
>>> both
>>> + * 1.8V and 3.0V modes, controlled by the PBIAS register.
>>> + *
>>> + * In 8-bit modes, OMAP VMMC1A (for DAT4..7) needs a supply, which
>>> + * is most naturally TWL VSIM; those pins also use PBIAS.
>>> + *
>>> + * FIXME handle VMMC1A as needed ...
>>> + */
>>> + if (power_on) {
>>> + if (cpu_is_omap2430()) {
>>> + reg = omap_ctrl_readl(OMAP243X_CONTROL_DEVCONF1);
>>> + if ((1 << vdd) >= MMC_VDD_30_31)
>>> + reg |= OMAP243X_MMC1_ACTIVE_OVERWRITE;
>>> + else
>>> + reg &= ~OMAP243X_MMC1_ACTIVE_OVERWRITE;
>>> + omap_ctrl_writel(reg, OMAP243X_CONTROL_DEVCONF1);
>>> + }
>>> +
>>> + if (mmc->slots[0].internal_clock) {
>>> + reg = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
>>> + reg |= OMAP2_MMCSDIO1ADPCLKISEL;
>>> + omap_ctrl_writel(reg, OMAP2_CONTROL_DEVCONF0);
>>> + }
>>> +
>>> + reg = omap_ctrl_readl(control_pbias_offset);
>>> + if (cpu_is_omap3630()) {
>>> + /* Set MMC I/O to 52Mhz */
>>> + prog_io =
>> omap_ctrl_readl(OMAP343X_CONTROL_PROG_IO1);
>>> + prog_io |= OMAP3630_PRG_SDMMC1_SPEEDCTRL;
>>> + omap_ctrl_writel(prog_io,
>> OMAP343X_CONTROL_PROG_IO1);
>>> + } else {
>>> + reg |= OMAP2_PBIASSPEEDCTRL0;
>>> + }
>>> + reg &= ~OMAP2_PBIASLITEPWRDNZ0;
>>> + omap_ctrl_writel(reg, control_pbias_offset);
>>> + } else {
>>> + reg = omap_ctrl_readl(control_pbias_offset);
>>> + reg &= ~OMAP2_PBIASLITEPWRDNZ0;
>>> + omap_ctrl_writel(reg, control_pbias_offset);
>>> + }
>>> +}
>>> +
>>> +static void hsmmc1_after_set_reg(struct device *dev, int slot,
>>> + int power_on, int vdd)
>>> +{
>>> + u32 reg;
>>> +
>>> + /* 100ms delay required for PBIAS configuration */
>>> + msleep(100);
>>> +
>>> + if (power_on) {
>>> + reg = omap_ctrl_readl(control_pbias_offset);
>>> + reg |= (OMAP2_PBIASLITEPWRDNZ0 | OMAP2_PBIASSPEEDCTRL0);
>>> + if ((1 << vdd) <= MMC_VDD_165_195)
>>> + reg &= ~OMAP2_PBIASLITEVMODE0;
>>> + else
>>> + reg |= OMAP2_PBIASLITEVMODE0;
>>> + omap_ctrl_writel(reg, control_pbias_offset);
>>> + } else {
>>> + reg = omap_ctrl_readl(control_pbias_offset);
>>> + reg |= (OMAP2_PBIASSPEEDCTRL0 | OMAP2_PBIASLITEPWRDNZ0 |
>>> + OMAP2_PBIASLITEVMODE0);
>>> + omap_ctrl_writel(reg, control_pbias_offset);
>>> + }
>>> +}
>>> +
>>> +static void hsmmc23_before_set_reg(struct device *dev, int slot,
>>> + int power_on, int vdd)
>>> +{
>>> + struct omap_mmc_platform_data *mmc = dev->platform_data;
>>> +
>>> + if (power_on) {
>>> + /* Only MMC2 supports a CLKIN */
>>> + if (mmc->slots[0].internal_clock) {
>>> + u32 reg;
>>> +
>>> + reg = omap_ctrl_readl(control_devconf1_offset);
>>> + reg |= OMAP2_MMCSDIO2ADPCLKISEL;
>>> + omap_ctrl_writel(reg, control_devconf1_offset);
>>> + }
>>> + }
>>> +}
>>> +
>>> +static struct omap_mmc_platform_data *hsmmc_data[OMAP34XX_NR_MMC]
>>> __initdata;
>>> +
>>> +void __init twl4030_mmc_init(struct twl4030_hsmmc_info *controllers)
>> Ditto, hsmmc_init?
>>
>>> +{
>>> + struct twl4030_hsmmc_info *c;
>>> + int nr_hsmmc = ARRAY_SIZE(hsmmc_data);
>>> +
>>> + if (cpu_is_omap2430()) {
>>> + control_pbias_offset = OMAP243X_CONTROL_PBIAS_LITE;
>>> + control_devconf1_offset = OMAP243X_CONTROL_DEVCONF1;
>>> + } else {
>>> + control_pbias_offset = OMAP343X_CONTROL_PBIAS_LITE;
>>> + control_devconf1_offset = OMAP343X_CONTROL_DEVCONF1;
>>> + }
>>> +
>>> + for (c = controllers; c->mmc; c++) {
>>> + struct twl_mmc_controller *twl = hsmmc + c->mmc - 1;
>>> + struct omap_mmc_platform_data *mmc = hsmmc_data[c->mmc - 1];
>>> +
>>> + if (!c->mmc || c->mmc > nr_hsmmc) {
>>> + pr_debug("MMC%d: no such controller\n", c->mmc);
>>> + continue;
>>> + }
>>> + if (mmc) {
>>> + pr_debug("MMC%d: already configured\n", c->mmc);
>>> + continue;
>>> + }
>>> +
>>> + mmc = kzalloc(sizeof(struct omap_mmc_platform_data),
>>> GFP_KERNEL);
>>> + if (!mmc) {
>>> + pr_err("Cannot allocate memory for mmc device!\n");
>>> + return;
>>> + }
>>> +
>>> + if (c->name)
>>> + strncpy(twl->name, c->name, HSMMC_NAME_LEN);
>>> + else
>>> + snprintf(twl->name, ARRAY_SIZE(twl->name),
>>> + "mmc%islot%i", c->mmc, 1);
>>> + mmc->slots[0].name = twl->name;
>>> + mmc->nr_slots = 1;
>>> + mmc->slots[0].wires = c->wires;
>>> + mmc->slots[0].internal_clock = !c->ext_clock;
>>> + mmc->dma_mask = 0xffffffff;
>>> +
>>> + mmc->get_context_loss_count =
>>> + twl4030_mmc_get_context_loss;
>>> +
>>> + mmc->slots[0].switch_pin = c->gpio_cd;
>>> + mmc->slots[0].gpio_wp = c->gpio_wp;
>>> +
>>> + if (c->cover_only)
>>> + mmc->slots[0].cover = 1;
>>> +
>>> + if (c->nonremovable)
>>> + mmc->slots[0].nonremovable = 1;
>>> +
>>> + if (c->power_saving)
>>> + mmc->slots[0].power_saving = 1;
>>> +
>>> + /* NOTE: MMC slots should have a Vcc regulator set up.
>>> + * This may be from a TWL4030-family chip, another
>>> + * controllable regulator, or a fixed supply.
>>> + *
>>> + * temporary HACK: ocr_mask instead of fixed supply
>>> + */
>>> + mmc->slots[0].ocr_mask = c->ocr_mask;
>>> +
>>> + switch (c->mmc) {
>>> + case 1:
>>> + /* on-chip level shifting via PBIAS0/PBIAS1 */
>>> + mmc->slots[0].before_set_reg =
>> hsmmc1_before_set_reg;
>>> + mmc->slots[0].after_set_reg = hsmmc1_after_set_reg;
>>> +
>>> + /* Omap3630 HSMMC1 supports only 4-bit */
>>> + if (cpu_is_omap3630() && c->wires > 4) {
>>> + c->wires = 4;
>>> + mmc->slots[0].wires = c->wires;
>>> + }
>>> + break;
>>> + case 2:
>>> + if (c->ext_clock)
>>> + c->transceiver = 1;
>>> + if (c->transceiver && c->wires > 4)
>>> + c->wires = 4;
>>> + /* FALLTHROUGH */
>>> + case 3:
>>> + /* off-chip level shifting, or none */
>>> + mmc->slots[0].before_set_reg =
>> hsmmc23_before_set_reg;
>>> + mmc->slots[0].after_set_reg = NULL;
>>> + break;
>>> + default:
>>> + pr_err("MMC%d configuration not supported!\n",
>> c->mmc);
>>> + kfree(mmc);
>>> + continue;
>>> + }
>>> + hsmmc_data[c->mmc - 1] = mmc;
>>> + }
>>> +
>>> + omap2_init_mmc(hsmmc_data, OMAP34XX_NR_MMC);
>>> +
>>> + /* pass the device nodes back to board setup code */
>>> + for (c = controllers; c->mmc; c++) {
>>> + struct omap_mmc_platform_data *mmc = hsmmc_data[c->mmc - 1];
>>> +
>>> + if (!c->mmc || c->mmc > nr_hsmmc)
>>> + continue;
>>> + c->dev = mmc->dev;
>>> + }
>>> +}
>>> +
>>> +#endif
>>> diff --git a/arch/arm/mach-omap2/hsmmc.h b/arch/arm/mach-omap2/hsmmc.h
>>> new file mode 100644
>>> index 0000000..87d67c1
>>> --- /dev/null
>>> +++ b/arch/arm/mach-omap2/hsmmc.h
>>> @@ -0,0 +1,34 @@
>>> +/*
>>> + * MMC definitions for OMAP2
>>> + *
>>> + * 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.
>>> + */
>>> +
>>> +struct twl4030_hsmmc_info {
>>> + u8 mmc; /* controller 1/2/3 */
>>> + u8 wires; /* 1/4/8 wires */
>>> + bool transceiver; /* MMC-2 option */
>>> + bool ext_clock; /* use external pin for input clock */
>>> + bool cover_only; /* No card detect - just cover switch */
>>> + bool nonremovable; /* Nonremovable e.g. eMMC */
>>> + bool power_saving; /* Try to sleep or power off when possible
>>> */
>>> + int gpio_cd; /* or -EINVAL */
>>> + int gpio_wp; /* or -EINVAL */
>>> + char *name; /* or NULL for default */
>>> + struct device *dev; /* returned: pointer to mmc adapter */
>>> + int ocr_mask; /* temporary HACK */
>>> +};
>>> +
>>> +#if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
>>> +
>>> +void twl4030_mmc_init(struct twl4030_hsmmc_info *);
>> Ditto
>>
>>> +
>>> +#else
>>> +
>>> +static inline void twl4030_mmc_init(struct twl4030_hsmmc_info *info)
>>> +{
>>> +}
>>> +
>>> +#endif
>>> diff --git a/arch/arm/mach-omap2/mmc-twl4030.c b/arch/arm/mach-
>> omap2/mmc-
>>> twl4030.c
>>> deleted file mode 100644
>>> index 9d5ad0b..0000000
>>> --- a/arch/arm/mach-omap2/mmc-twl4030.c
>>> +++ /dev/null
>>> @@ -1,247 +0,0 @@
>>> -/*
>>> - * linux/arch/arm/mach-omap2/mmc-twl4030.c
>>> - *
>>> - * Copyright (C) 2007-2008 Texas Instruments
>>> - * Copyright (C) 2008 Nokia Corporation
>>> - * Author: Texas Instruments
>>> - *
>>> - * 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.
>>> - */
>>> -#include <linux/kernel.h>
>>> -#include <linux/slab.h>
>>> -#include <linux/string.h>
>>> -#include <linux/delay.h>
>>> -#include <mach/hardware.h>
>>> -#include <plat/control.h>
>>> -#include <plat/mmc.h>
>>> -
>>> -#include "mmc-twl4030.h"
>>> -
>>> -#if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
>>> -
>>> -static u16 control_pbias_offset;
>>> -static u16 control_devconf1_offset;
>>> -
>>> -#define HSMMC_NAME_LEN 9
>>> -
>>> -static struct twl_mmc_controller {
>>> - char name[HSMMC_NAME_LEN + 1];
>>> -} hsmmc[OMAP34XX_NR_MMC];
>>> -
>>> -#if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM)
>>> -
>>> -static int twl4030_mmc_get_context_loss(struct device *dev)
>>> -{
>>> - /* FIXME: PM DPS not implemented yet */
>>> - return 0;
>>> -}
>>> -
>>> -#else
>>> -#define twl4030_mmc_get_context_loss NULL
>>> -#endif
>>> -
>>> -static void hsmmc1_before_set_reg(struct device *dev, int slot,
>>> - int power_on, int vdd)
>>> -{
>>> - u32 reg, prog_io;
>>> - struct omap_mmc_platform_data *mmc = dev->platform_data;
>>> -
>>> - /*
>>> - * Assume we power both OMAP VMMC1 (for CMD, CLK, DAT0..3) and the
>>> - * card with Vcc regulator (from twl4030 or whatever). OMAP has
>>> both
>>> - * 1.8V and 3.0V modes, controlled by the PBIAS register.
>>> - *
>>> - * In 8-bit modes, OMAP VMMC1A (for DAT4..7) needs a supply, which
>>> - * is most naturally TWL VSIM; those pins also use PBIAS.
>>> - *
>>> - * FIXME handle VMMC1A as needed ...
>>> - */
>>> - if (power_on) {
>>> - if (cpu_is_omap2430()) {
>>> - reg = omap_ctrl_readl(OMAP243X_CONTROL_DEVCONF1);
>>> - if ((1 << vdd) >= MMC_VDD_30_31)
>>> - reg |= OMAP243X_MMC1_ACTIVE_OVERWRITE;
>>> - else
>>> - reg &= ~OMAP243X_MMC1_ACTIVE_OVERWRITE;
>>> - omap_ctrl_writel(reg, OMAP243X_CONTROL_DEVCONF1);
>>> - }
>>> -
>>> - if (mmc->slots[0].internal_clock) {
>>> - reg = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
>>> - reg |= OMAP2_MMCSDIO1ADPCLKISEL;
>>> - omap_ctrl_writel(reg, OMAP2_CONTROL_DEVCONF0);
>>> - }
>>> -
>>> - reg = omap_ctrl_readl(control_pbias_offset);
>>> - if (cpu_is_omap3630()) {
>>> - /* Set MMC I/O to 52Mhz */
>>> - prog_io =
>> omap_ctrl_readl(OMAP343X_CONTROL_PROG_IO1);
>>> - prog_io |= OMAP3630_PRG_SDMMC1_SPEEDCTRL;
>>> - omap_ctrl_writel(prog_io,
>> OMAP343X_CONTROL_PROG_IO1);
>>> - } else {
>>> - reg |= OMAP2_PBIASSPEEDCTRL0;
>>> - }
>>> - reg &= ~OMAP2_PBIASLITEPWRDNZ0;
>>> - omap_ctrl_writel(reg, control_pbias_offset);
>>> - } else {
>>> - reg = omap_ctrl_readl(control_pbias_offset);
>>> - reg &= ~OMAP2_PBIASLITEPWRDNZ0;
>>> - omap_ctrl_writel(reg, control_pbias_offset);
>>> - }
>>> -}
>>> -
>>> -static void hsmmc1_after_set_reg(struct device *dev, int slot,
>>> - int power_on, int vdd)
>>> -{
>>> - u32 reg;
>>> -
>>> - /* 100ms delay required for PBIAS configuration */
>>> - msleep(100);
>>> -
>>> - if (power_on) {
>>> - reg = omap_ctrl_readl(control_pbias_offset);
>>> - reg |= (OMAP2_PBIASLITEPWRDNZ0 | OMAP2_PBIASSPEEDCTRL0);
>>> - if ((1 << vdd) <= MMC_VDD_165_195)
>>> - reg &= ~OMAP2_PBIASLITEVMODE0;
>>> - else
>>> - reg |= OMAP2_PBIASLITEVMODE0;
>>> - omap_ctrl_writel(reg, control_pbias_offset);
>>> - } else {
>>> - reg = omap_ctrl_readl(control_pbias_offset);
>>> - reg |= (OMAP2_PBIASSPEEDCTRL0 | OMAP2_PBIASLITEPWRDNZ0 |
>>> - OMAP2_PBIASLITEVMODE0);
>>> - omap_ctrl_writel(reg, control_pbias_offset);
>>> - }
>>> -}
>>> -
>>> -static void hsmmc23_before_set_reg(struct device *dev, int slot,
>>> - int power_on, int vdd)
>>> -{
>>> - struct omap_mmc_platform_data *mmc = dev->platform_data;
>>> -
>>> - if (power_on) {
>>> - /* Only MMC2 supports a CLKIN */
>>> - if (mmc->slots[0].internal_clock) {
>>> - u32 reg;
>>> -
>>> - reg = omap_ctrl_readl(control_devconf1_offset);
>>> - reg |= OMAP2_MMCSDIO2ADPCLKISEL;
>>> - omap_ctrl_writel(reg, control_devconf1_offset);
>>> - }
>>> - }
>>> -}
>>> -
>>> -static struct omap_mmc_platform_data *hsmmc_data[OMAP34XX_NR_MMC]
>>> __initdata;
>>> -
>>> -void __init twl4030_mmc_init(struct twl4030_hsmmc_info *controllers)
>>> -{
>>> - struct twl4030_hsmmc_info *c;
>>> - int nr_hsmmc = ARRAY_SIZE(hsmmc_data);
>>> -
>>> - if (cpu_is_omap2430()) {
>>> - control_pbias_offset = OMAP243X_CONTROL_PBIAS_LITE;
>>> - control_devconf1_offset = OMAP243X_CONTROL_DEVCONF1;
>>> - } else {
>>> - control_pbias_offset = OMAP343X_CONTROL_PBIAS_LITE;
>>> - control_devconf1_offset = OMAP343X_CONTROL_DEVCONF1;
>>> - }
>>> -
>>> - for (c = controllers; c->mmc; c++) {
>>> - struct twl_mmc_controller *twl = hsmmc + c->mmc - 1;
>>> - struct omap_mmc_platform_data *mmc = hsmmc_data[c->mmc - 1];
>>> -
>>> - if (!c->mmc || c->mmc > nr_hsmmc) {
>>> - pr_debug("MMC%d: no such controller\n", c->mmc);
>>> - continue;
>>> - }
>>> - if (mmc) {
>>> - pr_debug("MMC%d: already configured\n", c->mmc);
>>> - continue;
>>> - }
>>> -
>>> - mmc = kzalloc(sizeof(struct omap_mmc_platform_data),
>>> GFP_KERNEL);
>>> - if (!mmc) {
>>> - pr_err("Cannot allocate memory for mmc device!\n");
>>> - return;
>>> - }
>>> -
>>> - if (c->name)
>>> - strncpy(twl->name, c->name, HSMMC_NAME_LEN);
>>> - else
>>> - snprintf(twl->name, ARRAY_SIZE(twl->name),
>>> - "mmc%islot%i", c->mmc, 1);
>>> - mmc->slots[0].name = twl->name;
>>> - mmc->nr_slots = 1;
>>> - mmc->slots[0].wires = c->wires;
>>> - mmc->slots[0].internal_clock = !c->ext_clock;
>>> - mmc->dma_mask = 0xffffffff;
>>> -
>>> - mmc->get_context_loss_count =
>>> - twl4030_mmc_get_context_loss;
>>> -
>>> - mmc->slots[0].switch_pin = c->gpio_cd;
>>> - mmc->slots[0].gpio_wp = c->gpio_wp;
>>> -
>>> - if (c->cover_only)
>>> - mmc->slots[0].cover = 1;
>>> -
>>> - if (c->nonremovable)
>>> - mmc->slots[0].nonremovable = 1;
>>> -
>>> - if (c->power_saving)
>>> - mmc->slots[0].power_saving = 1;
>>> -
>>> - /* NOTE: MMC slots should have a Vcc regulator set up.
>>> - * This may be from a TWL4030-family chip, another
>>> - * controllable regulator, or a fixed supply.
>>> - *
>>> - * temporary HACK: ocr_mask instead of fixed supply
>>> - */
>>> - mmc->slots[0].ocr_mask = c->ocr_mask;
>>> -
>>> - switch (c->mmc) {
>>> - case 1:
>>> - /* on-chip level shifting via PBIAS0/PBIAS1 */
>>> - mmc->slots[0].before_set_reg =
>> hsmmc1_before_set_reg;
>>> - mmc->slots[0].after_set_reg = hsmmc1_after_set_reg;
>>> -
>>> - /* Omap3630 HSMMC1 supports only 4-bit */
>>> - if (cpu_is_omap3630() && c->wires > 4) {
>>> - c->wires = 4;
>>> - mmc->slots[0].wires = c->wires;
>>> - }
>>> - break;
>>> - case 2:
>>> - if (c->ext_clock)
>>> - c->transceiver = 1;
>>> - if (c->transceiver && c->wires > 4)
>>> - c->wires = 4;
>>> - /* FALLTHROUGH */
>>> - case 3:
>>> - /* off-chip level shifting, or none */
>>> - mmc->slots[0].before_set_reg =
>> hsmmc23_before_set_reg;
>>> - mmc->slots[0].after_set_reg = NULL;
>>> - break;
>>> - default:
>>> - pr_err("MMC%d configuration not supported!\n",
>> c->mmc);
>>> - kfree(mmc);
>>> - continue;
>>> - }
>>> - hsmmc_data[c->mmc - 1] = mmc;
>>> - }
>>> -
>>> - omap2_init_mmc(hsmmc_data, OMAP34XX_NR_MMC);
>>> -
>>> - /* pass the device nodes back to board setup code */
>>> - for (c = controllers; c->mmc; c++) {
>>> - struct omap_mmc_platform_data *mmc = hsmmc_data[c->mmc - 1];
>>> -
>>> - if (!c->mmc || c->mmc > nr_hsmmc)
>>> - continue;
>>> - c->dev = mmc->dev;
>>> - }
>>> -}
>>> -
>>> -#endif
>>> diff --git a/arch/arm/mach-omap2/mmc-twl4030.h b/arch/arm/mach-
>> omap2/mmc-
>>> twl4030.h
>>> deleted file mode 100644
>>> index 87d67c1..0000000
>>> --- a/arch/arm/mach-omap2/mmc-twl4030.h
>>> +++ /dev/null
>>> @@ -1,34 +0,0 @@
>>> -/*
>>> - * MMC definitions for OMAP2
>>> - *
>>> - * 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.
>>> - */
>>> -
>>> -struct twl4030_hsmmc_info {
>>> - u8 mmc; /* controller 1/2/3 */
>>> - u8 wires; /* 1/4/8 wires */
>>> - bool transceiver; /* MMC-2 option */
>>> - bool ext_clock; /* use external pin for input clock */
>>> - bool cover_only; /* No card detect - just cover switch */
>>> - bool nonremovable; /* Nonremovable e.g. eMMC */
>>> - bool power_saving; /* Try to sleep or power off when possible
>>> */
>>> - int gpio_cd; /* or -EINVAL */
>>> - int gpio_wp; /* or -EINVAL */
>>> - char *name; /* or NULL for default */
>>> - struct device *dev; /* returned: pointer to mmc adapter */
>>> - int ocr_mask; /* temporary HACK */
>>> -};
>>> -
>>> -#if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
>>> -
>>> -void twl4030_mmc_init(struct twl4030_hsmmc_info *);
>>> -
>>> -#else
>>> -
>>> -static inline void twl4030_mmc_init(struct twl4030_hsmmc_info *info)
>>> -{
>>> -}
>>> -
>>> -#endif
>>> --
>>> 1.6.0.4
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
>
^ permalink raw reply [flat|nested] 21+ messages in thread* RE: [PATCH V2 2/10] omap: Rename mmc-twl4030 files to hsmmc
2010-01-21 9:07 ` Adrian Hunter
@ 2010-01-21 17:23 ` Madhusudhan
0 siblings, 0 replies; 21+ messages in thread
From: Madhusudhan @ 2010-01-21 17:23 UTC (permalink / raw)
To: 'Adrian Hunter'
Cc: 'Tony Lindgren', 'Paul Walmsley',
'linux-omap Mailing List',
'linux-mmc Mailing List', 'Andrew Morton'
<snip>
> >>
> >
> > My bad, please ignore. The 3rd patch in the series seems to take care of
> > renaming these bits.
> >
> > Regards,
> > Madhu
> >
>
> Will you be Ack'ing these patches?
Sure. I will do that. The changes to hsmmc look okay to me. Having the
controller driver call the mmc core regulator fns is good.
Regards,
Madhu
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH V2 3/10] omap: Rename hsmmc symbols to reflect independence from twl4030
2010-01-17 1:32 [PATCH V2 0/10] omap_hsmmc changes V2 Adrian Hunter
2010-01-17 1:32 ` [PATCH V2 1/10] omap_hsmmc: Move gpio and regulator control from board file Adrian Hunter
2010-01-17 1:33 ` [PATCH V2 2/10] omap: Rename mmc-twl4030 files to hsmmc Adrian Hunter
@ 2010-01-17 1:33 ` Adrian Hunter
2010-01-17 1:33 ` [PATCH V2 4/10] omap: Reconnect hsmmc context loss count Adrian Hunter
` (7 subsequent siblings)
10 siblings, 0 replies; 21+ messages in thread
From: Adrian Hunter @ 2010-01-17 1:33 UTC (permalink / raw)
To: Tony Lindgren
Cc: Adrian Hunter, Madhusudhan Chikkature, Paul Walmsley,
linux-omap Mailing List, linux-mmc Mailing List, Andrew Morton
>From 189a7b728445f49557bfd3d08af8ec5341632dae Mon Sep 17 00:00:00 2001
From: Adrian Hunter <adrian.hunter@nokia.com>
Date: Sun, 17 Jan 2010 02:41:07 +0200
Subject: [PATCH] omap: Rename hsmmc symbols to reflect independence from twl4030
hsmmc.[ch] no longer has any dependency on twl4030
and variable names should be renamed to reflect that.
Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
---
arch/arm/mach-omap2/board-2430sdp.c | 4 ++--
arch/arm/mach-omap2/board-3430sdp.c | 4 ++--
arch/arm/mach-omap2/board-cm-t35.c | 4 ++--
arch/arm/mach-omap2/board-igep0020.c | 4 ++--
arch/arm/mach-omap2/board-ldp.c | 4 ++--
arch/arm/mach-omap2/board-omap3beagle.c | 4 ++--
arch/arm/mach-omap2/board-omap3evm.c | 4 ++--
arch/arm/mach-omap2/board-omap3pandora.c | 4 ++--
arch/arm/mach-omap2/board-omap3touchbook.c | 4 ++--
arch/arm/mach-omap2/board-overo.c | 4 ++--
arch/arm/mach-omap2/board-rx51-peripherals.c | 18 ++++++++----------
arch/arm/mach-omap2/board-zoom-peripherals.c | 4 ++--
arch/arm/mach-omap2/hsmmc.c | 24 ++++++++++++------------
arch/arm/mach-omap2/hsmmc.h | 6 +++---
14 files changed, 45 insertions(+), 47 deletions(-)
diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-omap2/board-2430sdp.c
index e42848d..a3d21a6 100644
--- a/arch/arm/mach-omap2/board-2430sdp.c
+++ b/arch/arm/mach-omap2/board-2430sdp.c
@@ -182,7 +182,7 @@ static int __init omap2430_i2c_init(void)
return 0;
}
-static struct twl4030_hsmmc_info mmc[] __initdata = {
+static struct omap2_hsmmc_info mmc[] __initdata = {
{
.mmc = 1,
.wires = 4,
@@ -201,7 +201,7 @@ static void __init omap_2430sdp_init(void)
platform_add_devices(sdp2430_devices, ARRAY_SIZE(sdp2430_devices));
omap_serial_init();
- twl4030_mmc_init(mmc);
+ omap2_hsmmc_init(mmc);
usb_musb_init();
board_smc91x_init();
diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c
index a0cf00f..a77b25e 100644
--- a/arch/arm/mach-omap2/board-3430sdp.c
+++ b/arch/arm/mach-omap2/board-3430sdp.c
@@ -326,7 +326,7 @@ static struct twl4030_bci_platform_data sdp3430_bci_data = {
.tblsize = ARRAY_SIZE(sdp3430_batt_table),
};
-static struct twl4030_hsmmc_info mmc[] = {
+static struct omap2_hsmmc_info mmc[] = {
{
.mmc = 1,
/* 8 bits (default) requires S6.3 == ON,
@@ -363,7 +363,7 @@ static int sdp3430_twl_gpio_setup(struct device *dev,
*/
mmc[0].gpio_cd = gpio + 0;
mmc[1].gpio_cd = gpio + 1;
- twl4030_mmc_init(mmc);
+ omap2_hsmmc_init(mmc);
/* link regulators to MMC adapters ... we "know" the
* regulators will be set up only *after* we return.
diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-omap2/board-cm-t35.c
index 214a2a8..e2b1885 100644
--- a/arch/arm/mach-omap2/board-cm-t35.c
+++ b/arch/arm/mach-omap2/board-cm-t35.c
@@ -364,7 +364,7 @@ static struct twl4030_keypad_data cm_t35_kp_data = {
.rep = 1,
};
-static struct twl4030_hsmmc_info mmc[] = {
+static struct omap2_hsmmc_info mmc[] = {
{
.mmc = 1,
.wires = 4,
@@ -413,7 +413,7 @@ static int cm_t35_twl_gpio_setup(struct device *dev, unsigned gpio,
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
mmc[0].gpio_cd = gpio + 0;
- twl4030_mmc_init(mmc);
+ omap2_hsmmc_init(mmc);
/* link regulators to MMC adapters */
cm_t35_vmmc1_supply.dev = mmc[0].dev;
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c
index 9db061f..754bcc0 100644
--- a/arch/arm/mach-omap2/board-igep0020.c
+++ b/arch/arm/mach-omap2/board-igep0020.c
@@ -121,7 +121,7 @@ static struct regulator_init_data igep2_vmmc1 = {
.consumer_supplies = &igep2_vmmc1_supply,
};
-static struct twl4030_hsmmc_info mmc[] = {
+static struct omap2_hsmmc_info mmc[] = {
{
.mmc = 1,
.wires = 4,
@@ -142,7 +142,7 @@ static int igep2_twl_gpio_setup(struct device *dev,
{
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
mmc[0].gpio_cd = gpio + 0;
- twl4030_mmc_init(mmc);
+ omap2_hsmmc_init(mmc);
/* link regulators to MMC adapters ... we "know" the
* regulators will be set up only *after* we return.
diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-ldp.c
index 635f54d..e3b0fcd 100644
--- a/arch/arm/mach-omap2/board-ldp.c
+++ b/arch/arm/mach-omap2/board-ldp.c
@@ -359,7 +359,7 @@ static int __init omap_i2c_init(void)
return 0;
}
-static struct twl4030_hsmmc_info mmc[] __initdata = {
+static struct omap2_hsmmc_info mmc[] __initdata = {
{
.mmc = 1,
.wires = 4,
@@ -396,7 +396,7 @@ static void __init omap_ldp_init(void)
omap_serial_init();
usb_musb_init();
- twl4030_mmc_init(mmc);
+ omap2_hsmmc_init(mmc);
/* link regulators to MMC adapters */
ldp_vmmc1_supply.dev = mmc[0].dev;
}
diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
index aaa9760..518fde6 100644
--- a/arch/arm/mach-omap2/board-omap3beagle.c
+++ b/arch/arm/mach-omap2/board-omap3beagle.c
@@ -108,7 +108,7 @@ static struct platform_device omap3beagle_nand_device = {
#include "sdram-micron-mt46h32m32lf-6.h"
-static struct twl4030_hsmmc_info mmc[] = {
+static struct omap2_hsmmc_info mmc[] = {
{
.mmc = 1,
.wires = 8,
@@ -147,7 +147,7 @@ static int beagle_twl_gpio_setup(struct device *dev,
}
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
mmc[0].gpio_cd = gpio + 0;
- twl4030_mmc_init(mmc);
+ omap2_hsmmc_init(mmc);
/* link regulators to MMC adapters */
beagle_vmmc1_supply.dev = mmc[0].dev;
diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c
index 2dd52ad..7916faa 100644
--- a/arch/arm/mach-omap2/board-omap3evm.c
+++ b/arch/arm/mach-omap2/board-omap3evm.c
@@ -185,7 +185,7 @@ static struct regulator_init_data omap3evm_vsim = {
.consumer_supplies = &omap3evm_vsim_supply,
};
-static struct twl4030_hsmmc_info mmc[] = {
+static struct omap2_hsmmc_info mmc[] = {
{
.mmc = 1,
.wires = 4,
@@ -225,7 +225,7 @@ static int omap3evm_twl_gpio_setup(struct device *dev,
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
omap_mux_init_gpio(63, OMAP_PIN_INPUT);
mmc[0].gpio_cd = gpio + 0;
- twl4030_mmc_init(mmc);
+ omap2_hsmmc_init(mmc);
/* link regulators to MMC adapters */
omap3evm_vmmc1_supply.dev = mmc[0].dev;
diff --git a/arch/arm/mach-omap2/board-omap3pandora.c b/arch/arm/mach-omap2/board-omap3pandora.c
index 3a11506..148be6d 100644
--- a/arch/arm/mach-omap2/board-omap3pandora.c
+++ b/arch/arm/mach-omap2/board-omap3pandora.c
@@ -192,7 +192,7 @@ static struct twl4030_keypad_data pandora_kp_data = {
.rep = 1,
};
-static struct twl4030_hsmmc_info omap3pandora_mmc[] = {
+static struct omap2_hsmmc_info omap3pandora_mmc[] = {
{
.mmc = 1,
.wires = 4,
@@ -231,7 +231,7 @@ static int omap3pandora_twl_gpio_setup(struct device *dev,
/* gpio + {0,1} is "mmc{0,1}_cd" (input/IRQ) */
omap3pandora_mmc[0].gpio_cd = gpio + 0;
omap3pandora_mmc[1].gpio_cd = gpio + 1;
- twl4030_mmc_init(omap3pandora_mmc);
+ omap2_hsmmc_init(omap3pandora_mmc);
/* link regulators to MMC adapters */
pandora_vmmc1_supply.dev = omap3pandora_mmc[0].dev;
diff --git a/arch/arm/mach-omap2/board-omap3touchbook.c b/arch/arm/mach-omap2/board-omap3touchbook.c
index 8efef51..f4987a1 100644
--- a/arch/arm/mach-omap2/board-omap3touchbook.c
+++ b/arch/arm/mach-omap2/board-omap3touchbook.c
@@ -122,7 +122,7 @@ static struct platform_device omap3touchbook_nand_device = {
#include "sdram-micron-mt46h32m32lf-6.h"
-static struct twl4030_hsmmc_info mmc[] = {
+static struct omap2_hsmmc_info mmc[] = {
{
.mmc = 1,
.wires = 8,
@@ -161,7 +161,7 @@ static int touchbook_twl_gpio_setup(struct device *dev,
}
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
mmc[0].gpio_cd = gpio + 0;
- twl4030_mmc_init(mmc);
+ omap2_hsmmc_init(mmc);
/* link regulators to MMC adapters */
touchbook_vmmc1_supply.dev = mmc[0].dev;
diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c
index 8a9d439..0597245 100644
--- a/arch/arm/mach-omap2/board-overo.c
+++ b/arch/arm/mach-omap2/board-overo.c
@@ -272,7 +272,7 @@ static void __init overo_flash_init(void)
}
}
-static struct twl4030_hsmmc_info mmc[] = {
+static struct omap2_hsmmc_info mmc[] = {
{
.mmc = 1,
.wires = 4,
@@ -297,7 +297,7 @@ static struct regulator_consumer_supply overo_vmmc1_supply = {
static int overo_twl_gpio_setup(struct device *dev,
unsigned gpio, unsigned ngpio)
{
- twl4030_mmc_init(mmc);
+ omap2_hsmmc_init(mmc);
overo_vmmc1_supply.dev = mmc[0].dev;
diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c
index b2de206..ab07ca2 100644
--- a/arch/arm/mach-omap2/board-rx51-peripherals.c
+++ b/arch/arm/mach-omap2/board-rx51-peripherals.c
@@ -209,7 +209,7 @@ static struct twl4030_madc_platform_data rx51_madc_data = {
.irq_line = 1,
};
-static struct twl4030_hsmmc_info mmc[] = {
+static struct omap2_hsmmc_info mmc[] __initdata = {
{
.name = "external",
.mmc = 1,
@@ -232,15 +232,18 @@ static struct twl4030_hsmmc_info mmc[] = {
};
static struct regulator_consumer_supply rx51_vmmc1_supply = {
- .supply = "vmmc",
+ .supply = "vmmc",
+ .dev_name = "mmci-omap-hs.0",
};
static struct regulator_consumer_supply rx51_vmmc2_supply = {
- .supply = "vmmc",
+ .supply = "vmmc",
+ .dev_name = "mmci-omap-hs.1",
};
static struct regulator_consumer_supply rx51_vsim_supply = {
- .supply = "vmmc_aux",
+ .supply = "vmmc_aux",
+ .dev_name = "mmci-omap-hs.1",
};
static struct regulator_init_data rx51_vaux1 = {
@@ -375,12 +378,6 @@ static int rx51_twlgpio_setup(struct device *dev, unsigned gpio, unsigned n)
gpio_request(gpio + 7, "speaker_en");
gpio_direction_output(gpio + 7, 1);
- /* set up MMC adapters, linking their regulators to them */
- twl4030_mmc_init(mmc);
- rx51_vmmc1_supply.dev = mmc[0].dev;
- rx51_vmmc2_supply.dev = mmc[1].dev;
- rx51_vsim_supply.dev = mmc[1].dev;
-
return 0;
}
@@ -751,5 +748,6 @@ void __init rx51_peripherals_init(void)
rx51_init_wl1251();
spi_register_board_info(rx51_peripherals_spi_board_info,
ARRAY_SIZE(rx51_peripherals_spi_board_info));
+ omap2_hsmmc_init(mmc);
}
diff --git a/arch/arm/mach-omap2/board-zoom-peripherals.c b/arch/arm/mach-omap2/board-zoom-peripherals.c
index 671dd06..9a0821f 100755
--- a/arch/arm/mach-omap2/board-zoom-peripherals.c
+++ b/arch/arm/mach-omap2/board-zoom-peripherals.c
@@ -151,7 +151,7 @@ static struct regulator_init_data zoom_vsim = {
.consumer_supplies = &zoom_vsim_supply,
};
-static struct twl4030_hsmmc_info mmc[] __initdata = {
+static struct omap2_hsmmc_info mmc[] __initdata = {
{
.name = "external",
.mmc = 1,
@@ -176,7 +176,7 @@ static int zoom_twl_gpio_setup(struct device *dev,
{
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
mmc[0].gpio_cd = gpio + 0;
- twl4030_mmc_init(mmc);
+ omap2_hsmmc_init(mmc);
/* link regulators to MMC adapters ... we "know" the
* regulators will be set up only *after* we return.
diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c
index b88c538..90bf8ce 100644
--- a/arch/arm/mach-omap2/hsmmc.c
+++ b/arch/arm/mach-omap2/hsmmc.c
@@ -26,20 +26,20 @@ static u16 control_devconf1_offset;
#define HSMMC_NAME_LEN 9
-static struct twl_mmc_controller {
+static struct hsmmc_controller {
char name[HSMMC_NAME_LEN + 1];
} hsmmc[OMAP34XX_NR_MMC];
#if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM)
-static int twl4030_mmc_get_context_loss(struct device *dev)
+static int hsmmc_get_context_loss(struct device *dev)
{
/* FIXME: PM DPS not implemented yet */
return 0;
}
#else
-#define twl4030_mmc_get_context_loss NULL
+#define hsmmc_get_context_loss NULL
#endif
static void hsmmc1_before_set_reg(struct device *dev, int slot,
@@ -135,9 +135,9 @@ static void hsmmc23_before_set_reg(struct device *dev, int slot,
static struct omap_mmc_platform_data *hsmmc_data[OMAP34XX_NR_MMC] __initdata;
-void __init twl4030_mmc_init(struct twl4030_hsmmc_info *controllers)
+void __init omap2_hsmmc_init(struct omap2_hsmmc_info *controllers)
{
- struct twl4030_hsmmc_info *c;
+ struct omap2_hsmmc_info *c;
int nr_hsmmc = ARRAY_SIZE(hsmmc_data);
if (cpu_is_omap2430()) {
@@ -149,7 +149,7 @@ void __init twl4030_mmc_init(struct twl4030_hsmmc_info *controllers)
}
for (c = controllers; c->mmc; c++) {
- struct twl_mmc_controller *twl = hsmmc + c->mmc - 1;
+ struct hsmmc_controller *hc = hsmmc + c->mmc - 1;
struct omap_mmc_platform_data *mmc = hsmmc_data[c->mmc - 1];
if (!c->mmc || c->mmc > nr_hsmmc) {
@@ -161,25 +161,25 @@ void __init twl4030_mmc_init(struct twl4030_hsmmc_info *controllers)
continue;
}
- mmc = kzalloc(sizeof(struct omap_mmc_platform_data), GFP_KERNEL);
+ mmc = kzalloc(sizeof(struct omap_mmc_platform_data),
+ GFP_KERNEL);
if (!mmc) {
pr_err("Cannot allocate memory for mmc device!\n");
return;
}
if (c->name)
- strncpy(twl->name, c->name, HSMMC_NAME_LEN);
+ strncpy(hc->name, c->name, HSMMC_NAME_LEN);
else
- snprintf(twl->name, ARRAY_SIZE(twl->name),
+ snprintf(hc->name, ARRAY_SIZE(hc->name),
"mmc%islot%i", c->mmc, 1);
- mmc->slots[0].name = twl->name;
+ mmc->slots[0].name = hc->name;
mmc->nr_slots = 1;
mmc->slots[0].wires = c->wires;
mmc->slots[0].internal_clock = !c->ext_clock;
mmc->dma_mask = 0xffffffff;
- mmc->get_context_loss_count =
- twl4030_mmc_get_context_loss;
+ mmc->get_context_loss_count = hsmmc_get_context_loss;
mmc->slots[0].switch_pin = c->gpio_cd;
mmc->slots[0].gpio_wp = c->gpio_wp;
diff --git a/arch/arm/mach-omap2/hsmmc.h b/arch/arm/mach-omap2/hsmmc.h
index 87d67c1..e946b5f 100644
--- a/arch/arm/mach-omap2/hsmmc.h
+++ b/arch/arm/mach-omap2/hsmmc.h
@@ -6,7 +6,7 @@
* published by the Free Software Foundation.
*/
-struct twl4030_hsmmc_info {
+struct omap2_hsmmc_info {
u8 mmc; /* controller 1/2/3 */
u8 wires; /* 1/4/8 wires */
bool transceiver; /* MMC-2 option */
@@ -23,11 +23,11 @@ struct twl4030_hsmmc_info {
#if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
-void twl4030_mmc_init(struct twl4030_hsmmc_info *);
+void omap2_hsmmc_init(struct omap2_hsmmc_info *);
#else
-static inline void twl4030_mmc_init(struct twl4030_hsmmc_info *info)
+static inline void omap2_hsmmc_init(struct omap2_hsmmc_info *info)
{
}
--
1.6.0.4
^ permalink raw reply related [flat|nested] 21+ messages in thread* [PATCH V2 4/10] omap: Reconnect hsmmc context loss count
2010-01-17 1:32 [PATCH V2 0/10] omap_hsmmc changes V2 Adrian Hunter
` (2 preceding siblings ...)
2010-01-17 1:33 ` [PATCH V2 3/10] omap: Rename hsmmc symbols to reflect independence from twl4030 Adrian Hunter
@ 2010-01-17 1:33 ` Adrian Hunter
2010-01-17 1:33 ` [PATCH V2 5/10] omap: Add functions for dynamic remuxing of pins Adrian Hunter
` (6 subsequent siblings)
10 siblings, 0 replies; 21+ messages in thread
From: Adrian Hunter @ 2010-01-17 1:33 UTC (permalink / raw)
To: Tony Lindgren
Cc: Adrian Hunter, Madhusudhan Chikkature, Paul Walmsley,
linux-omap Mailing List, linux-mmc Mailing List, Andrew Morton
>From 3c112c3bb8c8457283862468574be9b0c18dc27e Mon Sep 17 00:00:00 2001
From: Adrian Hunter <adrian.hunter@nokia.com>
Date: Tue, 5 Jan 2010 10:06:58 +0200
Subject: [PATCH] omap: Reconnect hsmmc context loss count
Call the PM context-loss count function, now that there
is a prototype for it.
Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
---
arch/arm/mach-omap2/hsmmc.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c
index 90bf8ce..2a88f49 100644
--- a/arch/arm/mach-omap2/hsmmc.c
+++ b/arch/arm/mach-omap2/hsmmc.c
@@ -16,6 +16,7 @@
#include <mach/hardware.h>
#include <plat/control.h>
#include <plat/mmc.h>
+#include <plat/omap-pm.h>
#include "hsmmc.h"
@@ -34,8 +35,7 @@ static struct hsmmc_controller {
static int hsmmc_get_context_loss(struct device *dev)
{
- /* FIXME: PM DPS not implemented yet */
- return 0;
+ return omap_pm_get_dev_context_loss_count(dev);
}
#else
--
1.6.0.4
^ permalink raw reply related [flat|nested] 21+ messages in thread* [PATCH V2 5/10] omap: Add functions for dynamic remuxing of pins
2010-01-17 1:32 [PATCH V2 0/10] omap_hsmmc changes V2 Adrian Hunter
` (3 preceding siblings ...)
2010-01-17 1:33 ` [PATCH V2 4/10] omap: Reconnect hsmmc context loss count Adrian Hunter
@ 2010-01-17 1:33 ` Adrian Hunter
2010-01-20 1:21 ` Tony Lindgren
2010-01-17 1:33 ` [PATCH V2 6/10] omap: RX51: Remux to pull eMMC lines down when powering off Adrian Hunter
` (5 subsequent siblings)
10 siblings, 1 reply; 21+ messages in thread
From: Adrian Hunter @ 2010-01-17 1:33 UTC (permalink / raw)
To: Tony Lindgren
Cc: Adrian Hunter, Madhusudhan Chikkature, Paul Walmsley,
linux-omap Mailing List, linux-mmc Mailing List, Andrew Morton
>From 33beb5bc36cba739971dc8919a6929925ad3dafc Mon Sep 17 00:00:00 2001
From: Tony Lindgren <tony@atomide.com>
Date: Wed, 13 Jan 2010 10:27:17 -0800
Subject: [PATCH] omap: Add functions for dynamic remuxing of pins
Make the omap_mux_read and write available for board code,
and rename omap_mux_set_board_signals into omap_mux_write_array.
In some cases we want to change the signals dynamically,
mostly for power management.
Note that we cannot use the signal names as they are set
__init to save memory.
Signed-off-by: Tony Lindgren <tony@atomide.com>
---
arch/arm/mach-omap2/mux.c | 22 +++++++++++-----------
arch/arm/mach-omap2/mux.h | 24 ++++++++++++++++++++++++
2 files changed, 35 insertions(+), 11 deletions(-)
diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c
index a8febd3..50298b4 100644
--- a/arch/arm/mach-omap2/mux.c
+++ b/arch/arm/mach-omap2/mux.c
@@ -51,7 +51,7 @@ struct omap_mux_entry {
static unsigned long mux_phys;
static void __iomem *mux_base;
-static inline u16 omap_mux_read(u16 reg)
+u16 omap_mux_read(u16 reg)
{
if (cpu_is_omap24xx())
return __raw_readb(mux_base + reg);
@@ -59,7 +59,7 @@ static inline u16 omap_mux_read(u16 reg)
return __raw_readw(mux_base + reg);
}
-static inline void omap_mux_write(u16 val, u16 reg)
+void omap_mux_write(u16 val, u16 reg)
{
if (cpu_is_omap24xx())
__raw_writeb(val, mux_base + reg);
@@ -67,6 +67,14 @@ static inline void omap_mux_write(u16 val, u16 reg)
__raw_writew(val, mux_base + reg);
}
+void omap_mux_write_array(struct omap_board_mux *board_mux)
+{
+ while (board_mux->reg_offset != OMAP_MUX_TERMINATOR) {
+ omap_mux_write(board_mux->value, board_mux->reg_offset);
+ board_mux++;
+ }
+}
+
#if defined(CONFIG_ARCH_OMAP24XX) && defined(CONFIG_OMAP_MUX)
static struct omap_mux_cfg arch_mux_cfg;
@@ -833,14 +841,6 @@ static void __init omap_mux_set_cmdline_signals(void)
kfree(options);
}
-static void __init omap_mux_set_board_signals(struct omap_board_mux *board_mux)
-{
- while (board_mux->reg_offset != OMAP_MUX_TERMINATOR) {
- omap_mux_write(board_mux->value, board_mux->reg_offset);
- board_mux++;
- }
-}
-
static int __init omap_mux_copy_names(struct omap_mux *src,
struct omap_mux *dst)
{
@@ -992,7 +992,7 @@ static void omap_mux_init_package(struct omap_mux *superset,
static void omap_mux_init_signals(struct omap_board_mux *board_mux)
{
omap_mux_set_cmdline_signals();
- omap_mux_set_board_signals(board_mux);
+ omap_mux_write_array(board_mux);
}
#else
diff --git a/arch/arm/mach-omap2/mux.h b/arch/arm/mach-omap2/mux.h
index d8b4d5a..f8c2e7a 100644
--- a/arch/arm/mach-omap2/mux.h
+++ b/arch/arm/mach-omap2/mux.h
@@ -147,6 +147,30 @@ u16 omap_mux_get_gpio(int gpio);
void omap_mux_set_gpio(u16 val, int gpio);
/**
+ * omap_mux_read() - read mux register
+ * @mux_offset: Offset of the mux register
+ *
+ */
+u16 omap_mux_read(u16 mux_offset);
+
+/**
+ * omap_mux_write() - write mux register
+ * @val: New mux register value
+ * @mux_offset: Offset of the mux register
+ *
+ * This should be only needed for dynamic remuxing of non-gpio signals.
+ */
+void omap_mux_write(u16 val, u16 mux_offset);
+
+/**
+ * omap_mux_write_array() - write an array of mux registers
+ * @board_mux: Array of mux registers terminated by MAP_MUX_TERMINATOR
+ *
+ * This should be only needed for dynamic remuxing of non-gpio signals.
+ */
+void omap_mux_write_array(struct omap_board_mux *board_mux);
+
+/**
* omap3_mux_init() - initialize mux system with board specific set
* @board_mux: Board specific mux table
* @flags: OMAP package type used for the board
--
1.6.0.4
^ permalink raw reply related [flat|nested] 21+ messages in thread* Re: [PATCH V2 5/10] omap: Add functions for dynamic remuxing of pins
2010-01-17 1:33 ` [PATCH V2 5/10] omap: Add functions for dynamic remuxing of pins Adrian Hunter
@ 2010-01-20 1:21 ` Tony Lindgren
2010-01-20 8:05 ` Adrian Hunter
0 siblings, 1 reply; 21+ messages in thread
From: Tony Lindgren @ 2010-01-20 1:21 UTC (permalink / raw)
To: Adrian Hunter
Cc: Madhusudhan Chikkature, Paul Walmsley, linux-omap Mailing List,
linux-mmc Mailing List, Andrew Morton
* Adrian Hunter <adrian.hunter@nokia.com> [100116 17:31]:
> From 33beb5bc36cba739971dc8919a6929925ad3dafc Mon Sep 17 00:00:00 2001
> From: Tony Lindgren <tony@atomide.com>
> Date: Wed, 13 Jan 2010 10:27:17 -0800
> Subject: [PATCH] omap: Add functions for dynamic remuxing of pins
>
> Make the omap_mux_read and write available for board code,
> and rename omap_mux_set_board_signals into omap_mux_write_array.
>
> In some cases we want to change the signals dynamically,
> mostly for power management.
>
> Note that we cannot use the signal names as they are set
> __init to save memory.
I'll try to merge this as a fix since it fixes dynamic remuxing.
Adrian, can I add your Acked-by?
Regards,
Tony
> Signed-off-by: Tony Lindgren <tony@atomide.com>
> ---
> arch/arm/mach-omap2/mux.c | 22 +++++++++++-----------
> arch/arm/mach-omap2/mux.h | 24 ++++++++++++++++++++++++
> 2 files changed, 35 insertions(+), 11 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c
> index a8febd3..50298b4 100644
> --- a/arch/arm/mach-omap2/mux.c
> +++ b/arch/arm/mach-omap2/mux.c
> @@ -51,7 +51,7 @@ struct omap_mux_entry {
> static unsigned long mux_phys;
> static void __iomem *mux_base;
>
> -static inline u16 omap_mux_read(u16 reg)
> +u16 omap_mux_read(u16 reg)
> {
> if (cpu_is_omap24xx())
> return __raw_readb(mux_base + reg);
> @@ -59,7 +59,7 @@ static inline u16 omap_mux_read(u16 reg)
> return __raw_readw(mux_base + reg);
> }
>
> -static inline void omap_mux_write(u16 val, u16 reg)
> +void omap_mux_write(u16 val, u16 reg)
> {
> if (cpu_is_omap24xx())
> __raw_writeb(val, mux_base + reg);
> @@ -67,6 +67,14 @@ static inline void omap_mux_write(u16 val, u16 reg)
> __raw_writew(val, mux_base + reg);
> }
>
> +void omap_mux_write_array(struct omap_board_mux *board_mux)
> +{
> + while (board_mux->reg_offset != OMAP_MUX_TERMINATOR) {
> + omap_mux_write(board_mux->value, board_mux->reg_offset);
> + board_mux++;
> + }
> +}
> +
> #if defined(CONFIG_ARCH_OMAP24XX) && defined(CONFIG_OMAP_MUX)
>
> static struct omap_mux_cfg arch_mux_cfg;
> @@ -833,14 +841,6 @@ static void __init omap_mux_set_cmdline_signals(void)
> kfree(options);
> }
>
> -static void __init omap_mux_set_board_signals(struct omap_board_mux *board_mux)
> -{
> - while (board_mux->reg_offset != OMAP_MUX_TERMINATOR) {
> - omap_mux_write(board_mux->value, board_mux->reg_offset);
> - board_mux++;
> - }
> -}
> -
> static int __init omap_mux_copy_names(struct omap_mux *src,
> struct omap_mux *dst)
> {
> @@ -992,7 +992,7 @@ static void omap_mux_init_package(struct omap_mux *superset,
> static void omap_mux_init_signals(struct omap_board_mux *board_mux)
> {
> omap_mux_set_cmdline_signals();
> - omap_mux_set_board_signals(board_mux);
> + omap_mux_write_array(board_mux);
> }
>
> #else
> diff --git a/arch/arm/mach-omap2/mux.h b/arch/arm/mach-omap2/mux.h
> index d8b4d5a..f8c2e7a 100644
> --- a/arch/arm/mach-omap2/mux.h
> +++ b/arch/arm/mach-omap2/mux.h
> @@ -147,6 +147,30 @@ u16 omap_mux_get_gpio(int gpio);
> void omap_mux_set_gpio(u16 val, int gpio);
>
> /**
> + * omap_mux_read() - read mux register
> + * @mux_offset: Offset of the mux register
> + *
> + */
> +u16 omap_mux_read(u16 mux_offset);
> +
> +/**
> + * omap_mux_write() - write mux register
> + * @val: New mux register value
> + * @mux_offset: Offset of the mux register
> + *
> + * This should be only needed for dynamic remuxing of non-gpio signals.
> + */
> +void omap_mux_write(u16 val, u16 mux_offset);
> +
> +/**
> + * omap_mux_write_array() - write an array of mux registers
> + * @board_mux: Array of mux registers terminated by MAP_MUX_TERMINATOR
> + *
> + * This should be only needed for dynamic remuxing of non-gpio signals.
> + */
> +void omap_mux_write_array(struct omap_board_mux *board_mux);
> +
> +/**
> * omap3_mux_init() - initialize mux system with board specific set
> * @board_mux: Board specific mux table
> * @flags: OMAP package type used for the board
> --
> 1.6.0.4
>
^ permalink raw reply [flat|nested] 21+ messages in thread* Re: [PATCH V2 5/10] omap: Add functions for dynamic remuxing of pins
2010-01-20 1:21 ` Tony Lindgren
@ 2010-01-20 8:05 ` Adrian Hunter
2010-01-22 17:17 ` Tony Lindgren
0 siblings, 1 reply; 21+ messages in thread
From: Adrian Hunter @ 2010-01-20 8:05 UTC (permalink / raw)
To: Tony Lindgren
Cc: Madhusudhan Chikkature, Paul Walmsley, linux-omap Mailing List,
linux-mmc Mailing List, Andrew Morton
Tony Lindgren wrote:
> * Adrian Hunter <adrian.hunter@nokia.com> [100116 17:31]:
>> From 33beb5bc36cba739971dc8919a6929925ad3dafc Mon Sep 17 00:00:00 2001
>> From: Tony Lindgren <tony@atomide.com>
>> Date: Wed, 13 Jan 2010 10:27:17 -0800
>> Subject: [PATCH] omap: Add functions for dynamic remuxing of pins
>>
>> Make the omap_mux_read and write available for board code,
>> and rename omap_mux_set_board_signals into omap_mux_write_array.
>>
>> In some cases we want to change the signals dynamically,
>> mostly for power management.
>>
>> Note that we cannot use the signal names as they are set
>> __init to save memory.
>
> I'll try to merge this as a fix since it fixes dynamic remuxing.
>
> Adrian, can I add your Acked-by?
Sure.
Acked-by: Adrian Hunter <adrian.hunter@nokia.com>
>
> Regards,
>
> Tony
>
>> Signed-off-by: Tony Lindgren <tony@atomide.com>
>> ---
>> arch/arm/mach-omap2/mux.c | 22 +++++++++++-----------
>> arch/arm/mach-omap2/mux.h | 24 ++++++++++++++++++++++++
>> 2 files changed, 35 insertions(+), 11 deletions(-)
>>
>> diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c
>> index a8febd3..50298b4 100644
>> --- a/arch/arm/mach-omap2/mux.c
>> +++ b/arch/arm/mach-omap2/mux.c
>> @@ -51,7 +51,7 @@ struct omap_mux_entry {
>> static unsigned long mux_phys;
>> static void __iomem *mux_base;
>>
>> -static inline u16 omap_mux_read(u16 reg)
>> +u16 omap_mux_read(u16 reg)
>> {
>> if (cpu_is_omap24xx())
>> return __raw_readb(mux_base + reg);
>> @@ -59,7 +59,7 @@ static inline u16 omap_mux_read(u16 reg)
>> return __raw_readw(mux_base + reg);
>> }
>>
>> -static inline void omap_mux_write(u16 val, u16 reg)
>> +void omap_mux_write(u16 val, u16 reg)
>> {
>> if (cpu_is_omap24xx())
>> __raw_writeb(val, mux_base + reg);
>> @@ -67,6 +67,14 @@ static inline void omap_mux_write(u16 val, u16 reg)
>> __raw_writew(val, mux_base + reg);
>> }
>>
>> +void omap_mux_write_array(struct omap_board_mux *board_mux)
>> +{
>> + while (board_mux->reg_offset != OMAP_MUX_TERMINATOR) {
>> + omap_mux_write(board_mux->value, board_mux->reg_offset);
>> + board_mux++;
>> + }
>> +}
>> +
>> #if defined(CONFIG_ARCH_OMAP24XX) && defined(CONFIG_OMAP_MUX)
>>
>> static struct omap_mux_cfg arch_mux_cfg;
>> @@ -833,14 +841,6 @@ static void __init omap_mux_set_cmdline_signals(void)
>> kfree(options);
>> }
>>
>> -static void __init omap_mux_set_board_signals(struct omap_board_mux *board_mux)
>> -{
>> - while (board_mux->reg_offset != OMAP_MUX_TERMINATOR) {
>> - omap_mux_write(board_mux->value, board_mux->reg_offset);
>> - board_mux++;
>> - }
>> -}
>> -
>> static int __init omap_mux_copy_names(struct omap_mux *src,
>> struct omap_mux *dst)
>> {
>> @@ -992,7 +992,7 @@ static void omap_mux_init_package(struct omap_mux *superset,
>> static void omap_mux_init_signals(struct omap_board_mux *board_mux)
>> {
>> omap_mux_set_cmdline_signals();
>> - omap_mux_set_board_signals(board_mux);
>> + omap_mux_write_array(board_mux);
>> }
>>
>> #else
>> diff --git a/arch/arm/mach-omap2/mux.h b/arch/arm/mach-omap2/mux.h
>> index d8b4d5a..f8c2e7a 100644
>> --- a/arch/arm/mach-omap2/mux.h
>> +++ b/arch/arm/mach-omap2/mux.h
>> @@ -147,6 +147,30 @@ u16 omap_mux_get_gpio(int gpio);
>> void omap_mux_set_gpio(u16 val, int gpio);
>>
>> /**
>> + * omap_mux_read() - read mux register
>> + * @mux_offset: Offset of the mux register
>> + *
>> + */
>> +u16 omap_mux_read(u16 mux_offset);
>> +
>> +/**
>> + * omap_mux_write() - write mux register
>> + * @val: New mux register value
>> + * @mux_offset: Offset of the mux register
>> + *
>> + * This should be only needed for dynamic remuxing of non-gpio signals.
>> + */
>> +void omap_mux_write(u16 val, u16 mux_offset);
>> +
>> +/**
>> + * omap_mux_write_array() - write an array of mux registers
>> + * @board_mux: Array of mux registers terminated by MAP_MUX_TERMINATOR
>> + *
>> + * This should be only needed for dynamic remuxing of non-gpio signals.
>> + */
>> +void omap_mux_write_array(struct omap_board_mux *board_mux);
>> +
>> +/**
>> * omap3_mux_init() - initialize mux system with board specific set
>> * @board_mux: Board specific mux table
>> * @flags: OMAP package type used for the board
>> --
>> 1.6.0.4
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
^ permalink raw reply [flat|nested] 21+ messages in thread* Re: [PATCH V2 5/10] omap: Add functions for dynamic remuxing of pins
2010-01-20 8:05 ` Adrian Hunter
@ 2010-01-22 17:17 ` Tony Lindgren
0 siblings, 0 replies; 21+ messages in thread
From: Tony Lindgren @ 2010-01-22 17:17 UTC (permalink / raw)
To: Adrian Hunter
Cc: Madhusudhan Chikkature, Paul Walmsley, linux-omap Mailing List,
linux-mmc Mailing List, Andrew Morton
* Adrian Hunter <adrian.hunter@nokia.com> [100120 00:04]:
> Tony Lindgren wrote:
> >* Adrian Hunter <adrian.hunter@nokia.com> [100116 17:31]:
> >>From 33beb5bc36cba739971dc8919a6929925ad3dafc Mon Sep 17 00:00:00 2001
> >>From: Tony Lindgren <tony@atomide.com>
> >>Date: Wed, 13 Jan 2010 10:27:17 -0800
> >>Subject: [PATCH] omap: Add functions for dynamic remuxing of pins
> >>
> >>Make the omap_mux_read and write available for board code,
> >>and rename omap_mux_set_board_signals into omap_mux_write_array.
> >>
> >>In some cases we want to change the signals dynamically,
> >>mostly for power management.
> >>
> >>Note that we cannot use the signal names as they are set
> >>__init to save memory.
> >
> >I'll try to merge this as a fix since it fixes dynamic remuxing.
> >
> >Adrian, can I add your Acked-by?
>
> Sure.
>
> Acked-by: Adrian Hunter <adrian.hunter@nokia.com>
Already got the omap-fixes-for-linus queued up, so I'd rather
not start messing again. So a bit too late for your ack, but
thanks anyways for testing.
Tony
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH V2 6/10] omap: RX51: Remux to pull eMMC lines down when powering off
2010-01-17 1:32 [PATCH V2 0/10] omap_hsmmc changes V2 Adrian Hunter
` (4 preceding siblings ...)
2010-01-17 1:33 ` [PATCH V2 5/10] omap: Add functions for dynamic remuxing of pins Adrian Hunter
@ 2010-01-17 1:33 ` Adrian Hunter
2010-01-17 1:33 ` [PATCH V2 7/10] omap_hsmmc: Allow for power saving without going off Adrian Hunter
` (4 subsequent siblings)
10 siblings, 0 replies; 21+ messages in thread
From: Adrian Hunter @ 2010-01-17 1:33 UTC (permalink / raw)
To: Tony Lindgren
Cc: Adrian Hunter, Madhusudhan Chikkature, Paul Walmsley,
linux-omap Mailing List, linux-mmc Mailing List, Andrew Morton
>From 58f549be326b94b9e1eb74f31d751d01605229d5 Mon Sep 17 00:00:00 2001
From: Adrian Hunter <adrian.hunter@nokia.com>
Date: Fri, 15 Jan 2010 15:18:39 +0200
Subject: [PATCH] omap: RX51: Remux to pull eMMC lines down when powering off
It has been discovered that, when eMMC is powered off, current
will flow from OMAP eMMC data pull-ups to the eMMC voltage supply.
Configuring pads for OMAP off-mode does not help because eMMC is
powered off independently of OMAP off-mode. Hence the pads are
now re-configured when eMMC is powered on or off.
Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
---
arch/arm/mach-omap2/board-rx51-peripherals.c | 43 +++++++++++++++++++++++++-
arch/arm/mach-omap2/hsmmc.c | 8 +++++
arch/arm/mach-omap2/hsmmc.h | 2 +
arch/arm/plat-omap/include/plat/mmc.h | 1 +
4 files changed, 53 insertions(+), 1 deletions(-)
diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c
index ab07ca2..4377a4c 100644
--- a/arch/arm/mach-omap2/board-rx51-peripherals.c
+++ b/arch/arm/mach-omap2/board-rx51-peripherals.c
@@ -209,6 +209,46 @@ static struct twl4030_madc_platform_data rx51_madc_data = {
.irq_line = 1,
};
+/* Enable input logic and pull all lines up when eMMC is on. */
+static struct omap_board_mux rx51_mmc2_on_mux[] = {
+ OMAP3_MUX(SDMMC2_CMD, OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),
+ OMAP3_MUX(SDMMC2_DAT0, OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),
+ OMAP3_MUX(SDMMC2_DAT1, OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),
+ OMAP3_MUX(SDMMC2_DAT2, OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),
+ OMAP3_MUX(SDMMC2_DAT3, OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),
+ OMAP3_MUX(SDMMC2_DAT4, OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),
+ OMAP3_MUX(SDMMC2_DAT5, OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),
+ OMAP3_MUX(SDMMC2_DAT6, OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),
+ OMAP3_MUX(SDMMC2_DAT7, OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),
+ { .reg_offset = OMAP_MUX_TERMINATOR },
+};
+
+/* Disable input logic and pull all lines down when eMMC is off. */
+static struct omap_board_mux rx51_mmc2_off_mux[] = {
+ OMAP3_MUX(SDMMC2_CMD, OMAP_PULL_ENA | OMAP_MUX_MODE0),
+ OMAP3_MUX(SDMMC2_DAT0, OMAP_PULL_ENA | OMAP_MUX_MODE0),
+ OMAP3_MUX(SDMMC2_DAT1, OMAP_PULL_ENA | OMAP_MUX_MODE0),
+ OMAP3_MUX(SDMMC2_DAT2, OMAP_PULL_ENA | OMAP_MUX_MODE0),
+ OMAP3_MUX(SDMMC2_DAT3, OMAP_PULL_ENA | OMAP_MUX_MODE0),
+ OMAP3_MUX(SDMMC2_DAT4, OMAP_PULL_ENA | OMAP_MUX_MODE0),
+ OMAP3_MUX(SDMMC2_DAT5, OMAP_PULL_ENA | OMAP_MUX_MODE0),
+ OMAP3_MUX(SDMMC2_DAT6, OMAP_PULL_ENA | OMAP_MUX_MODE0),
+ OMAP3_MUX(SDMMC2_DAT7, OMAP_PULL_ENA | OMAP_MUX_MODE0),
+ { .reg_offset = OMAP_MUX_TERMINATOR },
+};
+
+/*
+ * Current flows to eMMC when eMMC is off and the data lines are pulled up,
+ * so pull them down. N.B. we pull 8 lines because we are using 8 lines.
+ */
+static void rx51_mmc2_remux(struct device *dev, int slot, int power_on)
+{
+ if (power_on)
+ omap_mux_write_array(rx51_mmc2_on_mux);
+ else
+ omap_mux_write_array(rx51_mmc2_off_mux);
+}
+
static struct omap2_hsmmc_info mmc[] __initdata = {
{
.name = "external",
@@ -222,11 +262,12 @@ static struct omap2_hsmmc_info mmc[] __initdata = {
{
.name = "internal",
.mmc = 2,
- .wires = 8,
+ .wires = 8, /* See also rx51_mmc2_remux */
.gpio_cd = -EINVAL,
.gpio_wp = -EINVAL,
.nonremovable = true,
.power_saving = true,
+ .remux = rx51_mmc2_remux,
},
{} /* Terminator */
};
diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c
index 2a88f49..0ac5e4e 100644
--- a/arch/arm/mach-omap2/hsmmc.c
+++ b/arch/arm/mach-omap2/hsmmc.c
@@ -48,6 +48,9 @@ static void hsmmc1_before_set_reg(struct device *dev, int slot,
u32 reg, prog_io;
struct omap_mmc_platform_data *mmc = dev->platform_data;
+ if (mmc->slots[0].remux)
+ mmc->slots[0].remux(dev, slot, power_on);
+
/*
* Assume we power both OMAP VMMC1 (for CMD, CLK, DAT0..3) and the
* card with Vcc regulator (from twl4030 or whatever). OMAP has both
@@ -121,6 +124,9 @@ static void hsmmc23_before_set_reg(struct device *dev, int slot,
{
struct omap_mmc_platform_data *mmc = dev->platform_data;
+ 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) {
@@ -184,6 +190,8 @@ void __init omap2_hsmmc_init(struct omap2_hsmmc_info *controllers)
mmc->slots[0].switch_pin = c->gpio_cd;
mmc->slots[0].gpio_wp = c->gpio_wp;
+ mmc->slots[0].remux = c->remux;
+
if (c->cover_only)
mmc->slots[0].cover = 1;
diff --git a/arch/arm/mach-omap2/hsmmc.h b/arch/arm/mach-omap2/hsmmc.h
index e946b5f..f641f59 100644
--- a/arch/arm/mach-omap2/hsmmc.h
+++ b/arch/arm/mach-omap2/hsmmc.h
@@ -19,6 +19,8 @@ struct omap2_hsmmc_info {
char *name; /* or NULL for default */
struct device *dev; /* returned: pointer to mmc adapter */
int ocr_mask; /* temporary HACK */
+ /* Remux (pad configuation) when powering on/off */
+ void (*remux)(struct device *dev, int slot, int power_on);
};
#if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
diff --git a/arch/arm/plat-omap/include/plat/mmc.h b/arch/arm/plat-omap/include/plat/mmc.h
index 515701b..8b23d32 100644
--- a/arch/arm/plat-omap/include/plat/mmc.h
+++ b/arch/arm/plat-omap/include/plat/mmc.h
@@ -105,6 +105,7 @@ struct omap_mmc_platform_data {
int (*get_ro)(struct device *dev, int slot);
int (*set_sleep)(struct device *dev, int slot, int sleep,
int vdd, int cardsleep);
+ void (*remux)(struct device *dev, int slot, int power_on);
/* Call back before enabling / disabling regulators */
void (*before_set_reg)(struct device *dev, int slot,
int power_on, int vdd);
--
1.6.0.4
^ permalink raw reply related [flat|nested] 21+ messages in thread* [PATCH V2 7/10] omap_hsmmc: Allow for power saving without going off
2010-01-17 1:32 [PATCH V2 0/10] omap_hsmmc changes V2 Adrian Hunter
` (5 preceding siblings ...)
2010-01-17 1:33 ` [PATCH V2 6/10] omap: RX51: Remux to pull eMMC lines down when powering off Adrian Hunter
@ 2010-01-17 1:33 ` Adrian Hunter
2010-01-17 1:33 ` [PATCH V2 8/10] omap_hsmmc: Fix disable timeouts Adrian Hunter
` (3 subsequent siblings)
10 siblings, 0 replies; 21+ messages in thread
From: Adrian Hunter @ 2010-01-17 1:33 UTC (permalink / raw)
To: Tony Lindgren
Cc: Adrian Hunter, Madhusudhan Chikkature, Paul Walmsley,
linux-omap Mailing List, linux-mmc Mailing List, Andrew Morton
>From 9906604c602bff545e09cd78070c1c26b4ee8855 Mon Sep 17 00:00:00 2001
From: Adrian Hunter <adrian.hunter@nokia.com>
Date: Tue, 5 Jan 2010 14:14:07 +0200
Subject: [PATCH] omap_hsmmc: Allow for power saving without going off
An eMMC may be always powered on, so that the lowest
power saving state possible is sleeping. Add a field
to the platform data to indicate that.
Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
---
arch/arm/mach-omap2/hsmmc.c | 3 +++
arch/arm/mach-omap2/hsmmc.h | 1 +
arch/arm/plat-omap/include/plat/mmc.h | 3 +++
drivers/mmc/host/omap_hsmmc.c | 6 ++++++
4 files changed, 13 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c
index 0ac5e4e..7e63296 100644
--- a/arch/arm/mach-omap2/hsmmc.c
+++ b/arch/arm/mach-omap2/hsmmc.c
@@ -201,6 +201,9 @@ void __init omap2_hsmmc_init(struct omap2_hsmmc_info *controllers)
if (c->power_saving)
mmc->slots[0].power_saving = 1;
+ if (c->no_off)
+ mmc->slots[0].no_off = 1;
+
/* NOTE: MMC slots should have a Vcc regulator set up.
* This may be from a TWL4030-family chip, another
* controllable regulator, or a fixed supply.
diff --git a/arch/arm/mach-omap2/hsmmc.h b/arch/arm/mach-omap2/hsmmc.h
index f641f59..2453a7a 100644
--- a/arch/arm/mach-omap2/hsmmc.h
+++ b/arch/arm/mach-omap2/hsmmc.h
@@ -14,6 +14,7 @@ struct omap2_hsmmc_info {
bool cover_only; /* No card detect - just cover switch */
bool nonremovable; /* Nonremovable e.g. eMMC */
bool power_saving; /* Try to sleep or power off when possible */
+ bool no_off; /* power_saving and power is not to go off */
int gpio_cd; /* or -EINVAL */
int gpio_wp; /* or -EINVAL */
char *name; /* or NULL for default */
diff --git a/arch/arm/plat-omap/include/plat/mmc.h b/arch/arm/plat-omap/include/plat/mmc.h
index 8b23d32..b463949 100644
--- a/arch/arm/plat-omap/include/plat/mmc.h
+++ b/arch/arm/plat-omap/include/plat/mmc.h
@@ -96,6 +96,9 @@ struct omap_mmc_platform_data {
/* Try to sleep or power off when possible */
unsigned power_saving:1;
+ /* If using power_saving and the MMC power is not to go off */
+ unsigned no_off:1;
+
int switch_pin; /* gpio (card detect) */
int gpio_wp; /* gpio (write protect) */
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 2c5e15d..e15d0f4 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -1656,6 +1656,9 @@ static int omap_hsmmc_disabled_to_sleep(struct omap_hsmmc_host *host)
dev_dbg(mmc_dev(host->mmc), "DISABLED -> %s\n",
host->dpm_state == CARDSLEEP ? "CARDSLEEP" : "REGSLEEP");
+ if (mmc_slot(host).no_off)
+ return 0;
+
if ((host->mmc->caps & MMC_CAP_NONREMOVABLE) ||
mmc_slot(host).card_detect ||
(mmc_slot(host).get_cover_state &&
@@ -1671,6 +1674,9 @@ static int omap_hsmmc_sleep_to_off(struct omap_hsmmc_host *host)
if (!mmc_try_claim_host(host->mmc))
return 0;
+ if (mmc_slot(host).no_off)
+ return 0;
+
if (!((host->mmc->caps & MMC_CAP_NONREMOVABLE) ||
mmc_slot(host).card_detect ||
(mmc_slot(host).get_cover_state &&
--
1.6.0.4
^ permalink raw reply related [flat|nested] 21+ messages in thread* [PATCH V2 8/10] omap_hsmmc: Fix disable timeouts
2010-01-17 1:32 [PATCH V2 0/10] omap_hsmmc changes V2 Adrian Hunter
` (6 preceding siblings ...)
2010-01-17 1:33 ` [PATCH V2 7/10] omap_hsmmc: Allow for power saving without going off Adrian Hunter
@ 2010-01-17 1:33 ` Adrian Hunter
2010-01-17 1:33 ` [PATCH V2 9/10] omap_hsmmc: Ensure regulator enable / disable are paired Adrian Hunter
` (2 subsequent siblings)
10 siblings, 0 replies; 21+ messages in thread
From: Adrian Hunter @ 2010-01-17 1:33 UTC (permalink / raw)
To: Tony Lindgren
Cc: Adrian Hunter, Madhusudhan Chikkature, Paul Walmsley,
linux-omap Mailing List, linux-mmc Mailing List, Andrew Morton
>From c72533ba49f8810bcb67ac8ebcb57d440480a06b Mon Sep 17 00:00:00 2001
From: Adrian Hunter <adrian.hunter@nokia.com>
Date: Tue, 5 Jan 2010 14:20:23 +0200
Subject: [PATCH] omap_hsmmc: Fix disable timeouts
Disable timeouts are in msecs not jiffies.
Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
---
drivers/mmc/host/omap_hsmmc.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index e15d0f4..cb94044 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -1620,7 +1620,7 @@ static int omap_hsmmc_enabled_to_disabled(struct omap_hsmmc_host *host)
if (host->power_mode == MMC_POWER_OFF)
return 0;
- return msecs_to_jiffies(OMAP_MMC_SLEEP_TIMEOUT);
+ return OMAP_MMC_SLEEP_TIMEOUT;
}
/* Handler for [DISABLED -> REGSLEEP / CARDSLEEP] transition */
@@ -1663,7 +1663,7 @@ static int omap_hsmmc_disabled_to_sleep(struct omap_hsmmc_host *host)
mmc_slot(host).card_detect ||
(mmc_slot(host).get_cover_state &&
mmc_slot(host).get_cover_state(host->dev, host->slot_id)))
- return msecs_to_jiffies(OMAP_MMC_OFF_TIMEOUT);
+ return OMAP_MMC_OFF_TIMEOUT;
return 0;
}
--
1.6.0.4
^ permalink raw reply related [flat|nested] 21+ messages in thread* [PATCH V2 9/10] omap_hsmmc: Ensure regulator enable / disable are paired
2010-01-17 1:32 [PATCH V2 0/10] omap_hsmmc changes V2 Adrian Hunter
` (7 preceding siblings ...)
2010-01-17 1:33 ` [PATCH V2 8/10] omap_hsmmc: Fix disable timeouts Adrian Hunter
@ 2010-01-17 1:33 ` Adrian Hunter
2010-01-17 1:34 ` [PATCH V2 10/10] omap_hsmmc: Allow for a shared VccQ Adrian Hunter
2010-01-21 17:29 ` [PATCH V2 0/10] omap_hsmmc changes V2 Madhusudhan
10 siblings, 0 replies; 21+ messages in thread
From: Adrian Hunter @ 2010-01-17 1:33 UTC (permalink / raw)
To: Tony Lindgren
Cc: Adrian Hunter, Madhusudhan Chikkature, Paul Walmsley,
linux-omap Mailing List, linux-mmc Mailing List, Andrew Morton
>From aab14d3bf93b2b44d2f9ac09752666cc8857bf0e Mon Sep 17 00:00:00 2001
From: Adrian Hunter <adrian.hunter@nokia.com>
Date: Fri, 15 Jan 2010 22:10:10 +0200
Subject: [PATCH] omap_hsmmc: Ensure regulator enable / disable are paired
Stop using 'regulator_is_enabled()' and just pair enables
with disables so that the regulator reference counts can
work correctly.
Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
---
drivers/mmc/host/omap_hsmmc.c | 9 +++------
1 files changed, 3 insertions(+), 6 deletions(-)
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index cb94044..d2fad58 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -296,11 +296,8 @@ static int omap_hsmmc_23_set_power(struct device *dev, int slot, int power_on,
ret = mmc_regulator_set_ocr(host->vcc, 0);
}
} else {
- if (host->vcc_aux) {
- ret = regulator_is_enabled(host->vcc_aux);
- if (ret > 0)
- ret = regulator_disable(host->vcc_aux);
- }
+ if (host->vcc_aux)
+ ret = regulator_disable(host->vcc_aux);
if (ret == 0)
ret = mmc_regulator_set_ocr(host->vcc, 0);
}
@@ -1975,7 +1972,7 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev)
host->slot_id = 0;
host->mapbase = res->start;
host->base = ioremap(host->mapbase, SZ_4K);
- host->power_mode = -1;
+ host->power_mode = MMC_POWER_OFF;
platform_set_drvdata(pdev, host);
INIT_WORK(&host->mmc_carddetect_work, omap_hsmmc_detect);
--
1.6.0.4
^ permalink raw reply related [flat|nested] 21+ messages in thread* [PATCH V2 10/10] omap_hsmmc: Allow for a shared VccQ
2010-01-17 1:32 [PATCH V2 0/10] omap_hsmmc changes V2 Adrian Hunter
` (8 preceding siblings ...)
2010-01-17 1:33 ` [PATCH V2 9/10] omap_hsmmc: Ensure regulator enable / disable are paired Adrian Hunter
@ 2010-01-17 1:34 ` Adrian Hunter
2010-01-21 17:29 ` [PATCH V2 0/10] omap_hsmmc changes V2 Madhusudhan
10 siblings, 0 replies; 21+ messages in thread
From: Adrian Hunter @ 2010-01-17 1:34 UTC (permalink / raw)
To: Tony Lindgren
Cc: Adrian Hunter, Madhusudhan Chikkature, Paul Walmsley,
linux-omap Mailing List, linux-mmc Mailing List, Andrew Morton
>From 4efc87c9092d87dcb315196c4c40ffa220956cf6 Mon Sep 17 00:00:00 2001
From: Adrian Hunter <adrian.hunter@nokia.com>
Date: Thu, 7 Jan 2010 13:54:45 +0200
Subject: [PATCH] omap_hsmmc: Allow for a shared VccQ
EMMC can have two voltage supplies, Vcc and VccQ
which are implemented in the code as consumer
supplies vmmc and vmmc_aux.
If the regulator that supplies vmmc_aux is shared
with other consumers, then sending it to sleep
will disrupt those consumers. However, the
TWL4030-family regulators may have OFF remapped
to SLEEP, in which case 'regulator_disable()'
will put the regulator to sleep only when all
consumers are disabled - which is the desired
behaviour.
This patch adds a platform data field to allow
that option.
Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
---
arch/arm/mach-omap2/hsmmc.c | 3 +++
arch/arm/mach-omap2/hsmmc.h | 1 +
arch/arm/plat-omap/include/plat/mmc.h | 3 +++
drivers/mmc/host/omap_hsmmc.c | 16 +++++++++++++++-
4 files changed, 22 insertions(+), 1 deletions(-)
diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c
index 7e63296..1156b28 100644
--- a/arch/arm/mach-omap2/hsmmc.c
+++ b/arch/arm/mach-omap2/hsmmc.c
@@ -204,6 +204,9 @@ void __init omap2_hsmmc_init(struct omap2_hsmmc_info *controllers)
if (c->no_off)
mmc->slots[0].no_off = 1;
+ if (c->vcc_aux_disable_is_sleep)
+ mmc->slots[0].vcc_aux_disable_is_sleep = 1;
+
/* NOTE: MMC slots should have a Vcc regulator set up.
* This may be from a TWL4030-family chip, another
* controllable regulator, or a fixed supply.
diff --git a/arch/arm/mach-omap2/hsmmc.h b/arch/arm/mach-omap2/hsmmc.h
index 2453a7a..36f0ba8 100644
--- a/arch/arm/mach-omap2/hsmmc.h
+++ b/arch/arm/mach-omap2/hsmmc.h
@@ -15,6 +15,7 @@ struct omap2_hsmmc_info {
bool nonremovable; /* Nonremovable e.g. eMMC */
bool power_saving; /* Try to sleep or power off when possible */
bool no_off; /* power_saving and power is not to go off */
+ bool vcc_aux_disable_is_sleep; /* Regulator off remapped to sleep */
int gpio_cd; /* or -EINVAL */
int gpio_wp; /* or -EINVAL */
char *name; /* or NULL for default */
diff --git a/arch/arm/plat-omap/include/plat/mmc.h b/arch/arm/plat-omap/include/plat/mmc.h
index b463949..a1bac07 100644
--- a/arch/arm/plat-omap/include/plat/mmc.h
+++ b/arch/arm/plat-omap/include/plat/mmc.h
@@ -99,6 +99,9 @@ struct omap_mmc_platform_data {
/* If using power_saving and the MMC power is not to go off */
unsigned no_off:1;
+ /* Regulator off remapped to sleep */
+ unsigned vcc_aux_disable_is_sleep:1;
+
int switch_pin; /* gpio (card detect) */
int gpio_wp; /* gpio (write protect) */
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index d2fad58..af37477 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -347,7 +347,14 @@ static int omap_hsmmc_23_set_sleep(struct device *dev, int slot, int sleep,
err = regulator_set_mode(host->vcc, mode);
if (err)
return err;
- return regulator_set_mode(host->vcc_aux, mode);
+
+ if (!mmc_slot(host).vcc_aux_disable_is_sleep)
+ return regulator_set_mode(host->vcc_aux, mode);
+
+ if (sleep)
+ return regulator_disable(host->vcc_aux);
+ else
+ return regulator_enable(host->vcc_aux);
}
static int omap_hsmmc_gpio_init(struct omap_mmc_platform_data *pdata)
@@ -1982,6 +1989,13 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev)
else
mmc->ops = &omap_hsmmc_ops;
+ /*
+ * If regulator_disable can only put vcc_aux to sleep then there is
+ * no off state.
+ */
+ if (mmc_slot(host).vcc_aux_disable_is_sleep)
+ mmc_slot(host).no_off = 1;
+
mmc->f_min = 400000;
mmc->f_max = 52000000;
--
1.6.0.4
^ permalink raw reply related [flat|nested] 21+ messages in thread* RE: [PATCH V2 0/10] omap_hsmmc changes V2
2010-01-17 1:32 [PATCH V2 0/10] omap_hsmmc changes V2 Adrian Hunter
` (9 preceding siblings ...)
2010-01-17 1:34 ` [PATCH V2 10/10] omap_hsmmc: Allow for a shared VccQ Adrian Hunter
@ 2010-01-21 17:29 ` Madhusudhan
2010-01-22 8:41 ` Adrian Hunter
10 siblings, 1 reply; 21+ messages in thread
From: Madhusudhan @ 2010-01-21 17:29 UTC (permalink / raw)
To: 'Adrian Hunter', 'Tony Lindgren'
Cc: 'Paul Walmsley', 'linux-omap Mailing List',
'linux-mmc Mailing List', 'Andrew Morton'
> -----Original Message-----
> From: Adrian Hunter [mailto:adrian.hunter@nokia.com]
> Sent: Saturday, January 16, 2010 7:33 PM
> To: Tony Lindgren
> Cc: Adrian Hunter; Madhusudhan Chikkature; Paul Walmsley; linux-omap
> Mailing List; linux-mmc Mailing List; Andrew Morton
> Subject: [PATCH V2 0/10] omap_hsmmc changes V2
>
> Hi
>
> Here are some changes we need for omap_hsmmc. They are dependent on OMAP
> board files so it would be simplest if the patches all went via the OMAP
> tree.
>
> This is version 2 of this patch set. Thank you Tony, Paul and Madhu for
> your comments.
>
> Changes from version 1:
> - amended patch 'omap_hsmmc: Move gpio and regulator control from
> board file' so that system control functions remain in the board
> file
> - for clarity, split patch 'omap: Rename mmc-twl4030 to hsmmc' into
> 'omap: Rename mmc-twl4030 files to hsmmc' and
> 'omap: Rename hsmmc symbols to reflect independence from twl4030'
> - removed patch 'omap_hsmmc: set DVFS/PM constraints'
> - added patch 'omap: Add functions for dynamic remuxing of pins'
> - renamed and reworked patch 'omap: RX51: Remux to pull eMMC lines
> down when powering off' (was 'omap_hsmmc: RX51: set padconfs to pull
> down when powering off eMMC')
> - added patch 'omap_hsmmc: Ensure regulator enable / disable are
> paired'
> - fixed mistakes in patch 'omap_hsmmc: Allow for a shared VccQ'
>
Reviewed the omap_hsmmc changes and did a sanity test on Zoom2.
Acked-by: Madhusudhan Chikkature <madhu.cr@ti.com>
Regards,
Madhu
>
> Adrian Hunter (9):
> omap_hsmmc: Move gpio and regulator control from board file
> omap: Rename mmc-twl4030 files to hsmmc
> omap: Rename hsmmc symbols to reflect independence from twl4030
> omap: Reconnect hsmmc context loss count
> omap: RX51: Remux to pull eMMC lines down when powering off
> omap_hsmmc: Allow for power saving without going off
> omap_hsmmc: Fix disable timeouts
> omap_hsmmc: Ensure regulator enable / disable are paired
> omap_hsmmc: Allow for a shared VccQ
>
> Tony Lindgren (1):
> omap: Add functions for dynamic remuxing of pins
>
> arch/arm/configs/rx51_defconfig | 4 +-
> arch/arm/mach-omap2/Makefile | 28 +-
> arch/arm/mach-omap2/board-2430sdp.c | 6 +-
> arch/arm/mach-omap2/board-3430sdp.c | 6 +-
> arch/arm/mach-omap2/board-cm-t35.c | 6 +-
> arch/arm/mach-omap2/board-igep0020.c | 6 +-
> arch/arm/mach-omap2/board-ldp.c | 6 +-
> arch/arm/mach-omap2/board-omap3beagle.c | 6 +-
> arch/arm/mach-omap2/board-omap3evm.c | 6 +-
> arch/arm/mach-omap2/board-omap3pandora.c | 6 +-
> arch/arm/mach-omap2/board-omap3touchbook.c | 6 +-
> arch/arm/mach-omap2/board-overo.c | 6 +-
> arch/arm/mach-omap2/board-rx51-peripherals.c | 63 +++-
> arch/arm/mach-omap2/board-zoom-peripherals.c | 6 +-
> arch/arm/mach-omap2/hsmmc.c | 261 ++++++++++++
> arch/arm/mach-omap2/{mmc-twl4030.h => hsmmc.h} | 14 +-
> arch/arm/mach-omap2/mmc-twl4030.c | 537 -------------------
> -----
> arch/arm/mach-omap2/mux.c | 22 +-
> arch/arm/mach-omap2/mux.h | 24 +
> arch/arm/plat-omap/include/plat/mmc.h | 35 ++-
> drivers/mmc/host/omap_hsmmc.c | 375 ++++++++++++++++-
> 21 files changed, 788 insertions(+), 641 deletions(-)
> create mode 100644 arch/arm/mach-omap2/hsmmc.c
> rename arch/arm/mach-omap2/{mmc-twl4030.h => hsmmc.h} (63%)
> delete mode 100644 arch/arm/mach-omap2/mmc-twl4030.c
>
>
>
> Regards
> Adrian
^ permalink raw reply [flat|nested] 21+ messages in thread* Re: [PATCH V2 0/10] omap_hsmmc changes V2
2010-01-21 17:29 ` [PATCH V2 0/10] omap_hsmmc changes V2 Madhusudhan
@ 2010-01-22 8:41 ` Adrian Hunter
0 siblings, 0 replies; 21+ messages in thread
From: Adrian Hunter @ 2010-01-22 8:41 UTC (permalink / raw)
To: Madhusudhan
Cc: 'Tony Lindgren', 'Paul Walmsley',
'linux-omap Mailing List',
'linux-mmc Mailing List', 'Andrew Morton'
Madhusudhan wrote:
>
>> -----Original Message-----
>> From: Adrian Hunter [mailto:adrian.hunter@nokia.com]
>> Sent: Saturday, January 16, 2010 7:33 PM
>> To: Tony Lindgren
>> Cc: Adrian Hunter; Madhusudhan Chikkature; Paul Walmsley; linux-omap
>> Mailing List; linux-mmc Mailing List; Andrew Morton
>> Subject: [PATCH V2 0/10] omap_hsmmc changes V2
>>
>> Hi
>>
>> Here are some changes we need for omap_hsmmc. They are dependent on OMAP
>> board files so it would be simplest if the patches all went via the OMAP
>> tree.
>>
>> This is version 2 of this patch set. Thank you Tony, Paul and Madhu for
>> your comments.
>>
>> Changes from version 1:
>> - amended patch 'omap_hsmmc: Move gpio and regulator control from
>> board file' so that system control functions remain in the board
>> file
>> - for clarity, split patch 'omap: Rename mmc-twl4030 to hsmmc' into
>> 'omap: Rename mmc-twl4030 files to hsmmc' and
>> 'omap: Rename hsmmc symbols to reflect independence from twl4030'
>> - removed patch 'omap_hsmmc: set DVFS/PM constraints'
>> - added patch 'omap: Add functions for dynamic remuxing of pins'
>> - renamed and reworked patch 'omap: RX51: Remux to pull eMMC lines
>> down when powering off' (was 'omap_hsmmc: RX51: set padconfs to pull
>> down when powering off eMMC')
>> - added patch 'omap_hsmmc: Ensure regulator enable / disable are
>> paired'
>> - fixed mistakes in patch 'omap_hsmmc: Allow for a shared VccQ'
>>
> Reviewed the omap_hsmmc changes and did a sanity test on Zoom2.
> Acked-by: Madhusudhan Chikkature <madhu.cr@ti.com>
>
> Regards,
> Madhu
Thanks Madhu. Tony, are you ok taking these patches into your tree?
>> Adrian Hunter (9):
>> omap_hsmmc: Move gpio and regulator control from board file
>> omap: Rename mmc-twl4030 files to hsmmc
>> omap: Rename hsmmc symbols to reflect independence from twl4030
>> omap: Reconnect hsmmc context loss count
>> omap: RX51: Remux to pull eMMC lines down when powering off
>> omap_hsmmc: Allow for power saving without going off
>> omap_hsmmc: Fix disable timeouts
>> omap_hsmmc: Ensure regulator enable / disable are paired
>> omap_hsmmc: Allow for a shared VccQ
>>
>> Tony Lindgren (1):
>> omap: Add functions for dynamic remuxing of pins
>>
>> arch/arm/configs/rx51_defconfig | 4 +-
>> arch/arm/mach-omap2/Makefile | 28 +-
>> arch/arm/mach-omap2/board-2430sdp.c | 6 +-
>> arch/arm/mach-omap2/board-3430sdp.c | 6 +-
>> arch/arm/mach-omap2/board-cm-t35.c | 6 +-
>> arch/arm/mach-omap2/board-igep0020.c | 6 +-
>> arch/arm/mach-omap2/board-ldp.c | 6 +-
>> arch/arm/mach-omap2/board-omap3beagle.c | 6 +-
>> arch/arm/mach-omap2/board-omap3evm.c | 6 +-
>> arch/arm/mach-omap2/board-omap3pandora.c | 6 +-
>> arch/arm/mach-omap2/board-omap3touchbook.c | 6 +-
>> arch/arm/mach-omap2/board-overo.c | 6 +-
>> arch/arm/mach-omap2/board-rx51-peripherals.c | 63 +++-
>> arch/arm/mach-omap2/board-zoom-peripherals.c | 6 +-
>> arch/arm/mach-omap2/hsmmc.c | 261 ++++++++++++
>> arch/arm/mach-omap2/{mmc-twl4030.h => hsmmc.h} | 14 +-
>> arch/arm/mach-omap2/mmc-twl4030.c | 537 -------------------
>> -----
>> arch/arm/mach-omap2/mux.c | 22 +-
>> arch/arm/mach-omap2/mux.h | 24 +
>> arch/arm/plat-omap/include/plat/mmc.h | 35 ++-
>> drivers/mmc/host/omap_hsmmc.c | 375 ++++++++++++++++-
>> 21 files changed, 788 insertions(+), 641 deletions(-)
>> create mode 100644 arch/arm/mach-omap2/hsmmc.c
>> rename arch/arm/mach-omap2/{mmc-twl4030.h => hsmmc.h} (63%)
>> delete mode 100644 arch/arm/mach-omap2/mmc-twl4030.c
>>
>>
>>
>> Regards
>> Adrian
>
>
>
^ permalink raw reply [flat|nested] 21+ messages in thread