diff mbox series

[1/2,v2] mmc: omap_hsmmc: Kill off cover detection

Message ID 20180924113051.8699-1-linus.walleij@linaro.org (mailing list archive)
State New, archived
Headers show
Series [1/2,v2] mmc: omap_hsmmc: Kill off cover detection | expand

Commit Message

Linus Walleij Sept. 24, 2018, 11:30 a.m. UTC
Cover detection appears to be a feature protecting the SD
card on mobile phones with a slide-cover, such as some Nokia
phones. The idea seems to be to not allow access to the
SD card when the cover is open.

It is only usable with platform data from board files, but
no board file in the kernel is using it, yet it takes up
a sizeable chunk of code in the OMAP HSMMC driver.

Since we do not add new board files for the OMAPs any target
that need this should anyway reimplement it properly using
the device tree, so delete this legacy code.

The driver is marked as orphan in MAINTAINERS by the way.

Cc: Tony Lindgren <tony@atomide.com>
Cc: linux-omap@vger.kernel.org
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v1->v2:
- Remove a stray function call.
---
 drivers/mmc/host/omap_hsmmc.c            | 121 +----------------------
 include/linux/platform_data/hsmmc-omap.h |   1 -
 2 files changed, 2 insertions(+), 120 deletions(-)

Comments

Tony Lindgren Sept. 24, 2018, 5:51 p.m. UTC | #1
* Linus Walleij <linus.walleij@linaro.org> [180924 11:35]:
> Cover detection appears to be a feature protecting the SD
> card on mobile phones with a slide-cover, such as some Nokia
> phones. The idea seems to be to not allow access to the
> SD card when the cover is open.
> 
> It is only usable with platform data from board files, but
> no board file in the kernel is using it, yet it takes up
> a sizeable chunk of code in the OMAP HSMMC driver.
> 
> Since we do not add new board files for the OMAPs any target
> that need this should anyway reimplement it properly using
> the device tree, so delete this legacy code.

Nice to see it unused, sounds good to me:

Acked-by: Tony Lindgren <tony@atomide.com>

> The driver is marked as orphan in MAINTAINERS by the way.

Well there's the drivers/mmc/host/sdhci-omap.c Kishon has
done but still lacking some features. I think Kishon should
be listed as the maintainer also for omap_hsmmc.c, Kishon
does that sound OK to you?

Regards,

Tony
Kishon Vijay Abraham I Sept. 25, 2018, 11:02 a.m. UTC | #2
On Monday 24 September 2018 11:21 PM, Tony Lindgren wrote:
> * Linus Walleij <linus.walleij@linaro.org> [180924 11:35]:
>> Cover detection appears to be a feature protecting the SD
>> card on mobile phones with a slide-cover, such as some Nokia
>> phones. The idea seems to be to not allow access to the
>> SD card when the cover is open.
>>
>> It is only usable with platform data from board files, but
>> no board file in the kernel is using it, yet it takes up
>> a sizeable chunk of code in the OMAP HSMMC driver.
>>
>> Since we do not add new board files for the OMAPs any target
>> that need this should anyway reimplement it properly using
>> the device tree, so delete this legacy code.
> 
> Nice to see it unused, sounds good to me:
> 
> Acked-by: Tony Lindgren <tony@atomide.com>

Acked-by: Kishon Vijay Abraham I <kishon@ti.com>
> 
>> The driver is marked as orphan in MAINTAINERS by the way.
> 
> Well there's the drivers/mmc/host/sdhci-omap.c Kishon has
> done but still lacking some features. I think Kishon should
> be listed as the maintainer also for omap_hsmmc.c, Kishon
> does that sound OK to you?

Sure, I'll send a patch to update the maintainer entry.

Thanks
Kishon
Tony Lindgren Sept. 25, 2018, 2:41 p.m. UTC | #3
* Kishon Vijay Abraham I <kishon@ti.com> [180925 11:06]:
> On Monday 24 September 2018 11:21 PM, Tony Lindgren wrote:
> > * Linus Walleij <linus.walleij@linaro.org> [180924 11:35]:
> >> The driver is marked as orphan in MAINTAINERS by the way.
> > 
> > Well there's the drivers/mmc/host/sdhci-omap.c Kishon has
> > done but still lacking some features. I think Kishon should
> > be listed as the maintainer also for omap_hsmmc.c, Kishon
> > does that sound OK to you?
> 
> Sure, I'll send a patch to update the maintainer entry.

OK sounds good to me.

Regards,

Tony
Ulf Hansson Sept. 26, 2018, 11:48 p.m. UTC | #4
On 24 September 2018 at 13:30, Linus Walleij <linus.walleij@linaro.org> wrote:
> Cover detection appears to be a feature protecting the SD
> card on mobile phones with a slide-cover, such as some Nokia
> phones. The idea seems to be to not allow access to the
> SD card when the cover is open.
>
> It is only usable with platform data from board files, but
> no board file in the kernel is using it, yet it takes up
> a sizeable chunk of code in the OMAP HSMMC driver.
>
> Since we do not add new board files for the OMAPs any target
> that need this should anyway reimplement it properly using
> the device tree, so delete this legacy code.
>
> The driver is marked as orphan in MAINTAINERS by the way.
>
> Cc: Tony Lindgren <tony@atomide.com>
> Cc: linux-omap@vger.kernel.org
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

Applied for next, thanks!

Kind regards
Uffe

> ---
> ChangeLog v1->v2:
> - Remove a stray function call.
> ---
>  drivers/mmc/host/omap_hsmmc.c            | 121 +----------------------
>  include/linux/platform_data/hsmmc-omap.h |   1 -
>  2 files changed, 2 insertions(+), 120 deletions(-)
>
> diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
> index 071693ebfe18..3b38d2a592c2 100644
> --- a/drivers/mmc/host/omap_hsmmc.c
> +++ b/drivers/mmc/host/omap_hsmmc.c
> @@ -198,7 +198,6 @@ struct omap_hsmmc_host {
>         struct dma_chan         *rx_chan;
>         int                     response_busy;
>         int                     context_loss;
> -       int                     protect_card;
>         int                     reqs_blocked;
>         int                     req_in_progress;
>         unsigned long           clk_rate;
> @@ -207,15 +206,6 @@ struct omap_hsmmc_host {
>  #define HSMMC_SDIO_IRQ_ENABLED (1 << 1)        /* SDIO irq enabled */
>         struct omap_hsmmc_next  next_data;
>         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);
>  };
>
> @@ -233,13 +223,6 @@ static int omap_hsmmc_card_detect(struct device *dev)
>         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)
>  {
>         int ret;
> @@ -484,22 +467,13 @@ static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
>         return 0;
>  }
>
> -static irqreturn_t omap_hsmmc_cover_irq(int irq, void *dev_id);
> -
>  static int omap_hsmmc_gpio_init(struct mmc_host *mmc,
>                                 struct omap_hsmmc_host *host,
>                                 struct omap_hsmmc_platform_data *pdata)
>  {
>         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);
>                 if (ret)
>                         return ret;
> @@ -781,9 +755,6 @@ static void send_init_stream(struct omap_hsmmc_host *host)
>         int reg = 0;
>         unsigned long timeout;
>
> -       if (host->protect_card)
> -               return;
> -
>         disable_irq(host->irq);
>
>         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);
>  }
>
> -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
>  omap_hsmmc_show_slot_name(struct device *dev, struct device_attribute *attr,
>                         char *buf)
> @@ -1247,44 +1195,6 @@ static int omap_hsmmc_switch_opcond(struct omap_hsmmc_host *host, int vdd)
>         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)
>  {
>         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->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;
>         WARN_ON(host->mrq != NULL);
>         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->gpio_cd = -EINVAL;
> -       pdata->gpio_cod = -EINVAL;
>         pdata->gpio_wp = -EINVAL;
>
>         if (of_find_property(np, "ti,non-removable", NULL)) {
> @@ -2125,8 +2017,6 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
>         if (!ret)
>                 mmc->caps |= MMC_CAP_SDIO_IRQ;
>
> -       omap_hsmmc_protect_card(host);
> -
>         mmc_add_host(mmc);
>
>         if (mmc_pdata(host)->name != NULL) {
> @@ -2134,12 +2024,6 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
>                 if (ret < 0)
>                         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);
>         pm_runtime_mark_last_busy(host->dev);
> @@ -2230,7 +2114,6 @@ static int omap_hsmmc_resume(struct device *dev)
>         if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER))
>                 omap_hsmmc_conf_bus_power(host);
>
> -       omap_hsmmc_protect_card(host);
>         pm_runtime_mark_last_busy(host->dev);
>         pm_runtime_put_autosuspend(host->dev);
>         return 0;
> diff --git a/include/linux/platform_data/hsmmc-omap.h b/include/linux/platform_data/hsmmc-omap.h
> index 73d9098ada2d..c055d7eda085 100644
> --- a/include/linux/platform_data/hsmmc-omap.h
> +++ b/include/linux/platform_data/hsmmc-omap.h
> @@ -71,7 +71,6 @@ struct omap_hsmmc_platform_data {
>         char *version;
>
>         int gpio_cd;                    /* gpio (card detect) */
> -       int gpio_cod;                   /* gpio (cover detect) */
>         int gpio_wp;                    /* gpio (write protect) */
>         /* if we have special card, init it using this callback */
>         void (*init_card)(struct mmc_card *card);
> --
> 2.17.1
>
diff mbox series

Patch

diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 071693ebfe18..3b38d2a592c2 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -198,7 +198,6 @@  struct omap_hsmmc_host {
 	struct dma_chan		*rx_chan;
 	int			response_busy;
 	int			context_loss;
-	int			protect_card;
 	int			reqs_blocked;
 	int			req_in_progress;
 	unsigned long		clk_rate;
@@ -207,15 +206,6 @@  struct omap_hsmmc_host {
 #define HSMMC_SDIO_IRQ_ENABLED	(1 << 1)        /* SDIO irq enabled */
 	struct omap_hsmmc_next	next_data;
 	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);
 };
 
@@ -233,13 +223,6 @@  static int omap_hsmmc_card_detect(struct device *dev)
 	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)
 {
 	int ret;
@@ -484,22 +467,13 @@  static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
 	return 0;
 }
 
-static irqreturn_t omap_hsmmc_cover_irq(int irq, void *dev_id);
-
 static int omap_hsmmc_gpio_init(struct mmc_host *mmc,
 				struct omap_hsmmc_host *host,
 				struct omap_hsmmc_platform_data *pdata)
 {
 	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);
 		if (ret)
 			return ret;
@@ -781,9 +755,6 @@  static void send_init_stream(struct omap_hsmmc_host *host)
 	int reg = 0;
 	unsigned long timeout;
 
-	if (host->protect_card)
-		return;
-
 	disable_irq(host->irq);
 
 	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);
 }
 
-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
 omap_hsmmc_show_slot_name(struct device *dev, struct device_attribute *attr,
 			char *buf)
@@ -1247,44 +1195,6 @@  static int omap_hsmmc_switch_opcond(struct omap_hsmmc_host *host, int vdd)
 	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)
 {
 	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->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;
 	WARN_ON(host->mrq != NULL);
 	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->gpio_cd = -EINVAL;
-	pdata->gpio_cod = -EINVAL;
 	pdata->gpio_wp = -EINVAL;
 
 	if (of_find_property(np, "ti,non-removable", NULL)) {
@@ -2125,8 +2017,6 @@  static int omap_hsmmc_probe(struct platform_device *pdev)
 	if (!ret)
 		mmc->caps |= MMC_CAP_SDIO_IRQ;
 
-	omap_hsmmc_protect_card(host);
-
 	mmc_add_host(mmc);
 
 	if (mmc_pdata(host)->name != NULL) {
@@ -2134,12 +2024,6 @@  static int omap_hsmmc_probe(struct platform_device *pdev)
 		if (ret < 0)
 			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);
 	pm_runtime_mark_last_busy(host->dev);
@@ -2230,7 +2114,6 @@  static int omap_hsmmc_resume(struct device *dev)
 	if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER))
 		omap_hsmmc_conf_bus_power(host);
 
-	omap_hsmmc_protect_card(host);
 	pm_runtime_mark_last_busy(host->dev);
 	pm_runtime_put_autosuspend(host->dev);
 	return 0;
diff --git a/include/linux/platform_data/hsmmc-omap.h b/include/linux/platform_data/hsmmc-omap.h
index 73d9098ada2d..c055d7eda085 100644
--- a/include/linux/platform_data/hsmmc-omap.h
+++ b/include/linux/platform_data/hsmmc-omap.h
@@ -71,7 +71,6 @@  struct omap_hsmmc_platform_data {
 	char *version;
 
 	int gpio_cd;			/* gpio (card detect) */
-	int gpio_cod;			/* gpio (cover detect) */
 	int gpio_wp;			/* gpio (write protect) */
 	/* if we have special card, init it using this callback */
 	void (*init_card)(struct mmc_card *card);