From: Anton Vorontsov <avorontsov@ru.mvista.com>
To: Kumar Gala <galak@kernel.crashing.org>,
David Brownell <dbrownell@users.sourceforge.net>,
Pierre Ossman <drzeus-mmc@drzeus.cx>
Cc: Jochen Friedrich <jochen@scram.de>,
Timur Tabi <timur@freescale.com>,
linuxppc-dev@ozlabs.org, linux-kernel@vger.kernel.org,
spi-devel-general@lists.sourceforge.net
Subject: [PATCH 3/4] [MMC] mmc_spi: add polling support for the card detect line
Date: Fri, 16 May 2008 20:50:57 +0400 [thread overview]
Message-ID: <20080516165057.GC24196@polina.dev.rtsoft.ru> (raw)
Some boards do not use interrupts on the CD line, so we want to poll
the CD and see if there was a change. 1 second poll interval seems
resonable.
Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com>
---
drivers/mmc/host/mmc_spi.c | 51 +++++++++++++++++++++++++++++++++++++++++-
include/linux/spi/mmc_spi.h | 10 ++++++++
2 files changed, 59 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/host/mmc_spi.c b/drivers/mmc/host/mmc_spi.c
index 3550858..a3b46b1 100644
--- a/drivers/mmc/host/mmc_spi.c
+++ b/drivers/mmc/host/mmc_spi.c
@@ -31,6 +31,7 @@
#include <linux/crc7.h>
#include <linux/crc-itu-t.h>
#include <linux/scatterlist.h>
+#include <linux/workqueue.h>
#include <linux/mmc/host.h>
#include <linux/mmc/mmc.h> /* for R1_SPI_* bit values */
@@ -122,6 +123,11 @@ struct mmc_spi_host {
struct mmc_spi_platform_data *pdata;
+ /* stores last Card-Detect status (when polling) */
+ int cd_status;
+ struct workqueue_struct *cd_poll_wqueue;
+ struct delayed_work cd_poll_work;
+
/* for bulk data transfers */
struct spi_transfer token, t, crc, early_status;
struct spi_message m;
@@ -1155,6 +1161,26 @@ mmc_spi_detect_irq(int irq, void *mmc)
return IRQ_HANDLED;
}
+static void mmc_spi_cd_poll_work(struct work_struct *work)
+{
+ struct mmc_spi_host *host = container_of(work, struct mmc_spi_host,
+ cd_poll_work.work);
+ struct mmc_host *mmc = host->mmc;
+ int old_cd;
+
+ dev_dbg(&host->spi->dev, "polling for card detect...\n");
+
+ old_cd = host->cd_status;
+ host->cd_status = host->pdata->get_cd(mmc->parent);
+ if (old_cd != host->cd_status) {
+ /* ugh... this is ugly, but better than code duplication */
+ mmc_spi_detect_irq(NO_IRQ, mmc);
+ }
+
+ queue_delayed_work(host->cd_poll_wqueue, &host->cd_poll_work,
+ MMC_SPI_POLL_INT);
+}
+
struct count_children {
unsigned n;
struct bus_type *bus;
@@ -1323,13 +1349,28 @@ static int mmc_spi_probe(struct spi_device *spi)
if (status != 0)
goto fail_add_host;
- dev_info(&spi->dev, "SD/MMC host %s%s%s%s\n",
+ if (host->pdata && host->pdata->get_cd) {
+ host->cd_status = host->pdata->get_cd(mmc->parent);
+ INIT_DELAYED_WORK(&host->cd_poll_work, mmc_spi_cd_poll_work);
+ host->cd_poll_wqueue = create_singlethread_workqueue(
+ mmc->class_dev.bus_id);
+ if (!host->cd_poll_wqueue) {
+ status = -ENOMEM;
+ goto fail_add_host;
+ }
+ queue_delayed_work(host->cd_poll_wqueue, &host->cd_poll_work,
+ MMC_SPI_POLL_INT);
+ }
+
+ dev_info(&spi->dev, "SD/MMC host %s%s%s%s%s\n",
mmc->class_dev.bus_id,
host->dma_dev ? "" : ", no DMA",
(host->pdata && host->pdata->get_ro)
? "" : ", no WP",
(host->pdata && host->pdata->setpower)
- ? "" : ", no poweroff");
+ ? "" : ", no poweroff",
+ (host->pdata && host->pdata->get_cd)
+ ? ", cd polling" : "");
return 0;
fail_add_host:
@@ -1362,6 +1403,12 @@ static int __devexit mmc_spi_remove(struct spi_device *spi)
if (host->pdata && host->pdata->exit)
host->pdata->exit(&spi->dev, mmc);
+ if (host->pdata && host->pdata->get_cd) {
+ cancel_rearming_delayed_workqueue(
+ host->cd_poll_wqueue, &host->cd_poll_work);
+ destroy_workqueue(host->cd_poll_wqueue);
+ }
+
mmc_remove_host(mmc);
if (host->dma_dev) {
diff --git a/include/linux/spi/mmc_spi.h b/include/linux/spi/mmc_spi.h
index e9bbe3e..6ed6ee9 100644
--- a/include/linux/spi/mmc_spi.h
+++ b/include/linux/spi/mmc_spi.h
@@ -1,6 +1,10 @@
#ifndef __LINUX_SPI_MMC_SPI_H
#define __LINUX_SPI_MMC_SPI_H
+#include <asm/param.h> /* for HZ */
+
+#define MMC_SPI_POLL_INT HZ
+
struct device;
struct mmc_host;
@@ -21,6 +25,12 @@ struct mmc_spi_platform_data {
/* sense switch on sd cards */
int (*get_ro)(struct device *);
+ /*
+ * if board does not use CD interrupts, driver can poll the CD
+ * line using this function.
+ */
+ int (*get_cd)(struct device *);
+
/* how long to debounce card detect, in msecs */
u16 detect_delay;
--
1.5.5.1
WARNING: multiple messages have this Message-ID (diff)
From: Anton Vorontsov <avorontsov@ru.mvista.com>
To: Kumar Gala <galak@kernel.crashing.org>,
David Brownell <dbrownell@users.sourceforge.net>,
Pierre Ossman <drzeus-mmc@drzeus.cx>
Cc: linuxppc-dev@ozlabs.org, spi-devel-general@lists.sourceforge.net,
linux-kernel@vger.kernel.org, Timur Tabi <timur@freescale.com>
Subject: [PATCH 3/4] [MMC] mmc_spi: add polling support for the card detect line
Date: Fri, 16 May 2008 20:50:57 +0400 [thread overview]
Message-ID: <20080516165057.GC24196@polina.dev.rtsoft.ru> (raw)
Some boards do not use interrupts on the CD line, so we want to poll
the CD and see if there was a change. 1 second poll interval seems
resonable.
Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com>
---
drivers/mmc/host/mmc_spi.c | 51 +++++++++++++++++++++++++++++++++++++++++-
include/linux/spi/mmc_spi.h | 10 ++++++++
2 files changed, 59 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/host/mmc_spi.c b/drivers/mmc/host/mmc_spi.c
index 3550858..a3b46b1 100644
--- a/drivers/mmc/host/mmc_spi.c
+++ b/drivers/mmc/host/mmc_spi.c
@@ -31,6 +31,7 @@
#include <linux/crc7.h>
#include <linux/crc-itu-t.h>
#include <linux/scatterlist.h>
+#include <linux/workqueue.h>
#include <linux/mmc/host.h>
#include <linux/mmc/mmc.h> /* for R1_SPI_* bit values */
@@ -122,6 +123,11 @@ struct mmc_spi_host {
struct mmc_spi_platform_data *pdata;
+ /* stores last Card-Detect status (when polling) */
+ int cd_status;
+ struct workqueue_struct *cd_poll_wqueue;
+ struct delayed_work cd_poll_work;
+
/* for bulk data transfers */
struct spi_transfer token, t, crc, early_status;
struct spi_message m;
@@ -1155,6 +1161,26 @@ mmc_spi_detect_irq(int irq, void *mmc)
return IRQ_HANDLED;
}
+static void mmc_spi_cd_poll_work(struct work_struct *work)
+{
+ struct mmc_spi_host *host = container_of(work, struct mmc_spi_host,
+ cd_poll_work.work);
+ struct mmc_host *mmc = host->mmc;
+ int old_cd;
+
+ dev_dbg(&host->spi->dev, "polling for card detect...\n");
+
+ old_cd = host->cd_status;
+ host->cd_status = host->pdata->get_cd(mmc->parent);
+ if (old_cd != host->cd_status) {
+ /* ugh... this is ugly, but better than code duplication */
+ mmc_spi_detect_irq(NO_IRQ, mmc);
+ }
+
+ queue_delayed_work(host->cd_poll_wqueue, &host->cd_poll_work,
+ MMC_SPI_POLL_INT);
+}
+
struct count_children {
unsigned n;
struct bus_type *bus;
@@ -1323,13 +1349,28 @@ static int mmc_spi_probe(struct spi_device *spi)
if (status != 0)
goto fail_add_host;
- dev_info(&spi->dev, "SD/MMC host %s%s%s%s\n",
+ if (host->pdata && host->pdata->get_cd) {
+ host->cd_status = host->pdata->get_cd(mmc->parent);
+ INIT_DELAYED_WORK(&host->cd_poll_work, mmc_spi_cd_poll_work);
+ host->cd_poll_wqueue = create_singlethread_workqueue(
+ mmc->class_dev.bus_id);
+ if (!host->cd_poll_wqueue) {
+ status = -ENOMEM;
+ goto fail_add_host;
+ }
+ queue_delayed_work(host->cd_poll_wqueue, &host->cd_poll_work,
+ MMC_SPI_POLL_INT);
+ }
+
+ dev_info(&spi->dev, "SD/MMC host %s%s%s%s%s\n",
mmc->class_dev.bus_id,
host->dma_dev ? "" : ", no DMA",
(host->pdata && host->pdata->get_ro)
? "" : ", no WP",
(host->pdata && host->pdata->setpower)
- ? "" : ", no poweroff");
+ ? "" : ", no poweroff",
+ (host->pdata && host->pdata->get_cd)
+ ? ", cd polling" : "");
return 0;
fail_add_host:
@@ -1362,6 +1403,12 @@ static int __devexit mmc_spi_remove(struct spi_device *spi)
if (host->pdata && host->pdata->exit)
host->pdata->exit(&spi->dev, mmc);
+ if (host->pdata && host->pdata->get_cd) {
+ cancel_rearming_delayed_workqueue(
+ host->cd_poll_wqueue, &host->cd_poll_work);
+ destroy_workqueue(host->cd_poll_wqueue);
+ }
+
mmc_remove_host(mmc);
if (host->dma_dev) {
diff --git a/include/linux/spi/mmc_spi.h b/include/linux/spi/mmc_spi.h
index e9bbe3e..6ed6ee9 100644
--- a/include/linux/spi/mmc_spi.h
+++ b/include/linux/spi/mmc_spi.h
@@ -1,6 +1,10 @@
#ifndef __LINUX_SPI_MMC_SPI_H
#define __LINUX_SPI_MMC_SPI_H
+#include <asm/param.h> /* for HZ */
+
+#define MMC_SPI_POLL_INT HZ
+
struct device;
struct mmc_host;
@@ -21,6 +25,12 @@ struct mmc_spi_platform_data {
/* sense switch on sd cards */
int (*get_ro)(struct device *);
+ /*
+ * if board does not use CD interrupts, driver can poll the CD
+ * line using this function.
+ */
+ int (*get_cd)(struct device *);
+
/* how long to debounce card detect, in msecs */
u16 detect_delay;
--
1.5.5.1
next reply other threads:[~2008-05-16 16:50 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-05-16 16:50 Anton Vorontsov [this message]
2008-05-16 16:50 ` [PATCH 3/4] [MMC] mmc_spi: add polling support for the card detect line Anton Vorontsov
[not found] ` <20080516165057.GC24196-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-05-17 11:36 ` Pierre Ossman
2008-05-17 11:36 ` Pierre Ossman
2008-05-17 11:36 ` Pierre Ossman
[not found] ` <20080517133633.5aa26938-OhHrUh4vRMSnewYJFaQfwJ5kstrrjoWp@public.gmane.org>
2008-05-21 18:47 ` Anton Vorontsov
2008-05-21 18:47 ` Anton Vorontsov
2008-05-21 18:47 ` Anton Vorontsov
[not found] ` <20080521184713.GA30284-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-05-21 18:47 ` [PATCH 1/2] mmc: add support for card-detection polling Anton Vorontsov
2008-05-21 18:47 ` Anton Vorontsov
2008-05-21 18:47 ` Anton Vorontsov
2008-05-21 18:47 ` [PATCH 2/2] mmc_spi: " Anton Vorontsov
2008-05-21 18:47 ` Anton Vorontsov
2008-05-21 18:47 ` Anton Vorontsov
2008-05-21 19:28 ` [PATCH 3/4] [MMC] mmc_spi: add polling support for the card detect line Pierre Ossman
2008-05-21 19:28 ` Pierre Ossman
2008-05-22 18:17 ` Anton Vorontsov
2008-05-22 18:17 ` Anton Vorontsov
2008-05-22 18:18 ` [PATCH 3/3] mmc: change .get_ro() callback semantics Anton Vorontsov
2008-05-22 18:18 ` Anton Vorontsov
[not found] ` <20080522181713.GA26918-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-05-22 18:18 ` [PATCH 1/3] mmc: add support for card-detection polling Anton Vorontsov
2008-05-22 18:18 ` Anton Vorontsov
2008-05-22 18:18 ` Anton Vorontsov
2008-05-22 18:18 ` [PATCH 2/3] mmc_spi: " Anton Vorontsov
2008-05-22 18:18 ` Anton Vorontsov
2008-05-22 18:18 ` Anton Vorontsov
2008-05-22 19:34 ` [PATCH 3/4] [MMC] mmc_spi: add polling support for the card detect line Pierre Ossman
2008-05-22 19:34 ` Pierre Ossman
2008-05-23 15:42 ` Anton Vorontsov
2008-05-23 15:42 ` Anton Vorontsov
2008-05-23 15:43 ` [PATCH 1/3] mmc: add support for card-detection polling Anton Vorontsov
2008-05-23 15:43 ` Anton Vorontsov
[not found] ` <20080523154340.GA24862-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-06-01 10:23 ` Pierre Ossman
2008-06-01 10:23 ` Pierre Ossman
[not found] ` <20080523154204.GA19803-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-05-23 15:43 ` [PATCH 2/3] mmc_spi: " Anton Vorontsov
2008-05-23 15:43 ` Anton Vorontsov
2008-05-23 15:43 ` Anton Vorontsov
2008-05-23 15:43 ` [PATCH 3/3] mmc: change .get_ro() callback semantics Anton Vorontsov
2008-05-23 15:43 ` Anton Vorontsov
2008-05-23 15:43 ` Anton Vorontsov
[not found] ` <20080523154347.GC24862-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-06-03 10:07 ` Marc Pignat
2008-06-03 10:07 ` Marc Pignat
2008-06-03 10:07 ` Marc Pignat
2008-06-05 14:43 ` Anton Vorontsov
2008-06-05 14:43 ` Anton Vorontsov
[not found] ` <20080605144310.GA31596-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-06-05 15:58 ` Marc Pignat
2008-06-05 15:58 ` Marc Pignat
2008-06-05 15:58 ` Marc Pignat
2008-06-05 17:10 ` [PATCH] mmc: toughen get_ro() and get_cd() return values Anton Vorontsov
2008-06-05 17:10 ` Anton Vorontsov
[not found] ` <20080605171013.GA10513-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-06-14 14:36 ` Pierre Ossman
2008-06-14 14:36 ` Pierre Ossman
2008-06-17 14:16 ` Anton Vorontsov
2008-06-17 14:17 ` [PATCH 1/3] mmc: add support for card-detection polling Anton Vorontsov
2008-06-17 14:17 ` [PATCH 2/3] mmc_spi: " Anton Vorontsov
2008-06-17 14:17 ` [PATCH 3/3] mmc: change .get_ro() callback semantics Anton Vorontsov
2008-06-20 15:40 ` [PATCH] mmc: toughen get_ro() and get_cd() return values Pierre Ossman
2008-05-19 3:02 ` [PATCH 3/4] [MMC] mmc_spi: add polling support for the card detectline Chen Gong
2008-05-19 3:02 ` Chen Gong
2008-05-19 3:02 ` Chen Gong
[not found] ` <58A20A281BAF1047B4EAE68DE5C0BDC2F16E6A-bKEhWGtIRULiD3AT8lUqWFjVikpgYyvb5NbjCUgZEJk@public.gmane.org>
2008-05-22 12:38 ` Anton Vorontsov
2008-05-22 12:38 ` Anton Vorontsov
2008-05-22 12:38 ` Anton Vorontsov
[not found] ` <20080522123838.GA27149-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-05-22 13:44 ` [PATCH 3/4] [MMC] mmc_spi: add polling support for the carddetectline Chen Gong
2008-05-22 13:44 ` Chen Gong
2008-05-22 13:44 ` Chen Gong
[not found] ` <58A20A281BAF1047B4EAE68DE5C0BDC2F176EF-bKEhWGtIRULiD3AT8lUqWFjVikpgYyvb5NbjCUgZEJk@public.gmane.org>
2008-05-26 15:37 ` Anton Vorontsov
2008-05-26 15:37 ` Anton Vorontsov
2008-05-26 15:37 ` Anton Vorontsov
[not found] ` <20080526153747.GA31663-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-05-27 2:11 ` [PATCH 3/4] [MMC] mmc_spi: add polling support for thecarddetectline Chen Gong
2008-05-27 2:11 ` Chen Gong
2008-05-27 2:11 ` Chen Gong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080516165057.GC24196@polina.dev.rtsoft.ru \
--to=avorontsov@ru.mvista.com \
--cc=dbrownell@users.sourceforge.net \
--cc=drzeus-mmc@drzeus.cx \
--cc=galak@kernel.crashing.org \
--cc=jochen@scram.de \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxppc-dev@ozlabs.org \
--cc=spi-devel-general@lists.sourceforge.net \
--cc=timur@freescale.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.