|
@@ -198,7 +198,6 @@ struct omap_hsmmc_host {
|
|
struct dma_chan *rx_chan;
|
|
struct dma_chan *rx_chan;
|
|
int response_busy;
|
|
int response_busy;
|
|
int context_loss;
|
|
int context_loss;
|
|
- int protect_card;
|
|
|
|
int reqs_blocked;
|
|
int reqs_blocked;
|
|
int req_in_progress;
|
|
int req_in_progress;
|
|
unsigned long clk_rate;
|
|
unsigned long clk_rate;
|
|
@@ -207,15 +206,6 @@ struct omap_hsmmc_host {
|
|
#define HSMMC_SDIO_IRQ_ENABLED (1 << 1) /* SDIO irq enabled */
|
|
#define HSMMC_SDIO_IRQ_ENABLED (1 << 1) /* SDIO irq enabled */
|
|
struct omap_hsmmc_next next_data;
|
|
struct omap_hsmmc_next next_data;
|
|
struct omap_hsmmc_platform_data *pdata;
|
|
struct omap_hsmmc_platform_data *pdata;
|
|
-
|
|
|
|
- /* return MMC cover switch state, can be NULL if not supported.
|
|
|
|
- *
|
|
|
|
- * possible return values:
|
|
|
|
- * 0 - closed
|
|
|
|
- * 1 - open
|
|
|
|
- */
|
|
|
|
- int (*get_cover_state)(struct device *dev);
|
|
|
|
-
|
|
|
|
int (*card_detect)(struct device *dev);
|
|
int (*card_detect)(struct device *dev);
|
|
};
|
|
};
|
|
|
|
|
|
@@ -233,13 +223,6 @@ static int omap_hsmmc_card_detect(struct device *dev)
|
|
return mmc_gpio_get_cd(host->mmc);
|
|
return mmc_gpio_get_cd(host->mmc);
|
|
}
|
|
}
|
|
|
|
|
|
-static int omap_hsmmc_get_cover_state(struct device *dev)
|
|
|
|
-{
|
|
|
|
- struct omap_hsmmc_host *host = dev_get_drvdata(dev);
|
|
|
|
-
|
|
|
|
- return mmc_gpio_get_cd(host->mmc);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static int omap_hsmmc_enable_supply(struct mmc_host *mmc)
|
|
static int omap_hsmmc_enable_supply(struct mmc_host *mmc)
|
|
{
|
|
{
|
|
int ret;
|
|
int ret;
|
|
@@ -484,22 +467,13 @@ static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-static irqreturn_t omap_hsmmc_cover_irq(int irq, void *dev_id);
|
|
|
|
-
|
|
|
|
static int omap_hsmmc_gpio_init(struct mmc_host *mmc,
|
|
static int omap_hsmmc_gpio_init(struct mmc_host *mmc,
|
|
struct omap_hsmmc_host *host,
|
|
struct omap_hsmmc_host *host,
|
|
struct omap_hsmmc_platform_data *pdata)
|
|
struct omap_hsmmc_platform_data *pdata)
|
|
{
|
|
{
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
- if (gpio_is_valid(pdata->gpio_cod)) {
|
|
|
|
- ret = mmc_gpio_request_cd(mmc, pdata->gpio_cod, 0);
|
|
|
|
- if (ret)
|
|
|
|
- return ret;
|
|
|
|
-
|
|
|
|
- host->get_cover_state = omap_hsmmc_get_cover_state;
|
|
|
|
- mmc_gpio_set_cd_isr(mmc, omap_hsmmc_cover_irq);
|
|
|
|
- } else if (gpio_is_valid(pdata->gpio_cd)) {
|
|
|
|
|
|
+ if (gpio_is_valid(pdata->gpio_cd)) {
|
|
ret = mmc_gpio_request_cd(mmc, pdata->gpio_cd, 0);
|
|
ret = mmc_gpio_request_cd(mmc, pdata->gpio_cd, 0);
|
|
if (ret)
|
|
if (ret)
|
|
return ret;
|
|
return ret;
|
|
@@ -781,9 +755,6 @@ static void send_init_stream(struct omap_hsmmc_host *host)
|
|
int reg = 0;
|
|
int reg = 0;
|
|
unsigned long timeout;
|
|
unsigned long timeout;
|
|
|
|
|
|
- if (host->protect_card)
|
|
|
|
- return;
|
|
|
|
-
|
|
|
|
disable_irq(host->irq);
|
|
disable_irq(host->irq);
|
|
|
|
|
|
OMAP_HSMMC_WRITE(host->base, IE, INT_EN_MASK);
|
|
OMAP_HSMMC_WRITE(host->base, IE, INT_EN_MASK);
|
|
@@ -804,29 +775,6 @@ static void send_init_stream(struct omap_hsmmc_host *host)
|
|
enable_irq(host->irq);
|
|
enable_irq(host->irq);
|
|
}
|
|
}
|
|
|
|
|
|
-static inline
|
|
|
|
-int omap_hsmmc_cover_is_closed(struct omap_hsmmc_host *host)
|
|
|
|
-{
|
|
|
|
- int r = 1;
|
|
|
|
-
|
|
|
|
- if (host->get_cover_state)
|
|
|
|
- r = host->get_cover_state(host->dev);
|
|
|
|
- return r;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static ssize_t
|
|
|
|
-omap_hsmmc_show_cover_switch(struct device *dev, struct device_attribute *attr,
|
|
|
|
- char *buf)
|
|
|
|
-{
|
|
|
|
- struct mmc_host *mmc = container_of(dev, struct mmc_host, class_dev);
|
|
|
|
- struct omap_hsmmc_host *host = mmc_priv(mmc);
|
|
|
|
-
|
|
|
|
- return sprintf(buf, "%s\n",
|
|
|
|
- omap_hsmmc_cover_is_closed(host) ? "closed" : "open");
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static DEVICE_ATTR(cover_switch, S_IRUGO, omap_hsmmc_show_cover_switch, NULL);
|
|
|
|
-
|
|
|
|
static ssize_t
|
|
static ssize_t
|
|
omap_hsmmc_show_slot_name(struct device *dev, struct device_attribute *attr,
|
|
omap_hsmmc_show_slot_name(struct device *dev, struct device_attribute *attr,
|
|
char *buf)
|
|
char *buf)
|
|
@@ -1247,44 +1195,6 @@ err:
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
-/* Protect the card while the cover is open */
|
|
|
|
-static void omap_hsmmc_protect_card(struct omap_hsmmc_host *host)
|
|
|
|
-{
|
|
|
|
- if (!host->get_cover_state)
|
|
|
|
- return;
|
|
|
|
-
|
|
|
|
- host->reqs_blocked = 0;
|
|
|
|
- if (host->get_cover_state(host->dev)) {
|
|
|
|
- if (host->protect_card) {
|
|
|
|
- dev_info(host->dev, "%s: cover is closed, "
|
|
|
|
- "card is now accessible\n",
|
|
|
|
- mmc_hostname(host->mmc));
|
|
|
|
- host->protect_card = 0;
|
|
|
|
- }
|
|
|
|
- } else {
|
|
|
|
- if (!host->protect_card) {
|
|
|
|
- dev_info(host->dev, "%s: cover is open, "
|
|
|
|
- "card is now inaccessible\n",
|
|
|
|
- mmc_hostname(host->mmc));
|
|
|
|
- host->protect_card = 1;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * irq handler when (cell-phone) cover is mounted/removed
|
|
|
|
- */
|
|
|
|
-static irqreturn_t omap_hsmmc_cover_irq(int irq, void *dev_id)
|
|
|
|
-{
|
|
|
|
- struct omap_hsmmc_host *host = dev_id;
|
|
|
|
-
|
|
|
|
- sysfs_notify(&host->mmc->class_dev.kobj, NULL, "cover_switch");
|
|
|
|
-
|
|
|
|
- omap_hsmmc_protect_card(host);
|
|
|
|
- mmc_detect_change(host->mmc, (HZ * 200) / 1000);
|
|
|
|
- return IRQ_HANDLED;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static void omap_hsmmc_dma_callback(void *param)
|
|
static void omap_hsmmc_dma_callback(void *param)
|
|
{
|
|
{
|
|
struct omap_hsmmc_host *host = param;
|
|
struct omap_hsmmc_host *host = param;
|
|
@@ -1555,24 +1465,7 @@ static void omap_hsmmc_request(struct mmc_host *mmc, struct mmc_request *req)
|
|
|
|
|
|
BUG_ON(host->req_in_progress);
|
|
BUG_ON(host->req_in_progress);
|
|
BUG_ON(host->dma_ch != -1);
|
|
BUG_ON(host->dma_ch != -1);
|
|
- if (host->protect_card) {
|
|
|
|
- if (host->reqs_blocked < 3) {
|
|
|
|
- /*
|
|
|
|
- * Ensure the controller is left in a consistent
|
|
|
|
- * state by resetting the command and data state
|
|
|
|
- * machines.
|
|
|
|
- */
|
|
|
|
- omap_hsmmc_reset_controller_fsm(host, SRD);
|
|
|
|
- omap_hsmmc_reset_controller_fsm(host, SRC);
|
|
|
|
- host->reqs_blocked += 1;
|
|
|
|
- }
|
|
|
|
- req->cmd->error = -EBADF;
|
|
|
|
- if (req->data)
|
|
|
|
- req->data->error = -EBADF;
|
|
|
|
- req->cmd->retries = 0;
|
|
|
|
- mmc_request_done(mmc, req);
|
|
|
|
- return;
|
|
|
|
- } else if (host->reqs_blocked)
|
|
|
|
|
|
+ if (host->reqs_blocked)
|
|
host->reqs_blocked = 0;
|
|
host->reqs_blocked = 0;
|
|
WARN_ON(host->mrq != NULL);
|
|
WARN_ON(host->mrq != NULL);
|
|
host->mrq = req;
|
|
host->mrq = req;
|
|
@@ -1921,7 +1814,6 @@ static struct omap_hsmmc_platform_data *of_get_hsmmc_pdata(struct device *dev)
|
|
pdata->controller_flags |= OMAP_HSMMC_SUPPORTS_DUAL_VOLT;
|
|
pdata->controller_flags |= OMAP_HSMMC_SUPPORTS_DUAL_VOLT;
|
|
|
|
|
|
pdata->gpio_cd = -EINVAL;
|
|
pdata->gpio_cd = -EINVAL;
|
|
- pdata->gpio_cod = -EINVAL;
|
|
|
|
pdata->gpio_wp = -EINVAL;
|
|
pdata->gpio_wp = -EINVAL;
|
|
|
|
|
|
if (of_find_property(np, "ti,non-removable", NULL)) {
|
|
if (of_find_property(np, "ti,non-removable", NULL)) {
|
|
@@ -2125,8 +2017,6 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
|
|
if (!ret)
|
|
if (!ret)
|
|
mmc->caps |= MMC_CAP_SDIO_IRQ;
|
|
mmc->caps |= MMC_CAP_SDIO_IRQ;
|
|
|
|
|
|
- omap_hsmmc_protect_card(host);
|
|
|
|
-
|
|
|
|
mmc_add_host(mmc);
|
|
mmc_add_host(mmc);
|
|
|
|
|
|
if (mmc_pdata(host)->name != NULL) {
|
|
if (mmc_pdata(host)->name != NULL) {
|
|
@@ -2134,12 +2024,6 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
|
|
if (ret < 0)
|
|
if (ret < 0)
|
|
goto err_slot_name;
|
|
goto err_slot_name;
|
|
}
|
|
}
|
|
- if (host->get_cover_state) {
|
|
|
|
- ret = device_create_file(&mmc->class_dev,
|
|
|
|
- &dev_attr_cover_switch);
|
|
|
|
- if (ret < 0)
|
|
|
|
- goto err_slot_name;
|
|
|
|
- }
|
|
|
|
|
|
|
|
omap_hsmmc_debugfs(mmc);
|
|
omap_hsmmc_debugfs(mmc);
|
|
pm_runtime_mark_last_busy(host->dev);
|
|
pm_runtime_mark_last_busy(host->dev);
|
|
@@ -2231,7 +2115,6 @@ static int omap_hsmmc_resume(struct device *dev)
|
|
if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER))
|
|
if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER))
|
|
omap_hsmmc_conf_bus_power(host);
|
|
omap_hsmmc_conf_bus_power(host);
|
|
|
|
|
|
- omap_hsmmc_protect_card(host);
|
|
|
|
pm_runtime_mark_last_busy(host->dev);
|
|
pm_runtime_mark_last_busy(host->dev);
|
|
pm_runtime_put_autosuspend(host->dev);
|
|
pm_runtime_put_autosuspend(host->dev);
|
|
return 0;
|
|
return 0;
|