* [PATCH (mmc-next) 1/3] mmc: add suspend/resume in the sdhci-pltfm driver
@ 2010-09-23 9:14 Giuseppe CAVALLARO
2010-09-23 9:14 ` [PATCH (mmc-next) 2/3] mmc: split the sdhci.h to help platforms that uses shdci-pltfm d.d Giuseppe CAVALLARO
` (2 more replies)
0 siblings, 3 replies; 19+ messages in thread
From: Giuseppe CAVALLARO @ 2010-09-23 9:14 UTC (permalink / raw)
To: linux-mmc; +Cc: Giuseppe Cavallaro
Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
---
drivers/mmc/host/sdhci-pltfm.c | 22 ++++++++++++++++++++++
1 files changed, 22 insertions(+), 0 deletions(-)
diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c
index e045e3c..89ea64b 100644
--- a/drivers/mmc/host/sdhci-pltfm.c
+++ b/drivers/mmc/host/sdhci-pltfm.c
@@ -165,6 +165,24 @@ static const struct platform_device_id sdhci_pltfm_ids[] = {
};
MODULE_DEVICE_TABLE(platform, sdhci_pltfm_ids);
+#ifdef CONFIG_PM
+static int sdhci_pltfm_suspend(struct platform_device *dev, pm_message_t pm)
+{
+ struct sdhci_host *host = platform_get_drvdata(dev);
+
+ sdhci_suspend_host(host, pm);
+ return 0;
+}
+
+static int sdhci_pltfm_resume(struct platform_device *dev)
+{
+ struct sdhci_host *host = platform_get_drvdata(dev);
+
+ sdhci_resume_host(host);
+ return 0;
+}
+#endif
+
static struct platform_driver sdhci_pltfm_driver = {
.driver = {
.name = "sdhci",
@@ -173,6 +191,10 @@ static struct platform_driver sdhci_pltfm_driver = {
.probe = sdhci_pltfm_probe,
.remove = __devexit_p(sdhci_pltfm_remove),
.id_table = sdhci_pltfm_ids,
+#ifdef CONFIG_PM
+ .suspend = sdhci_pltfm_suspend,
+ .resume = sdhci_pltfm_resume,
+#endif
};
/*****************************************************************************\
--
1.5.5.6
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH (mmc-next) 2/3] mmc: split the sdhci.h to help platforms that uses shdci-pltfm d.d.
2010-09-23 9:14 [PATCH (mmc-next) 1/3] mmc: add suspend/resume in the sdhci-pltfm driver Giuseppe CAVALLARO
@ 2010-09-23 9:14 ` Giuseppe CAVALLARO
2010-09-23 9:14 ` [PATCH (mmc-next) 3/3] mmc: fix a warning when compile the sdhci d.d Giuseppe CAVALLARO
2010-09-27 10:43 ` [PATCH (mmc-next) 2/3] mmc: split the sdhci.h to help platforms that uses shdci-pltfm d.d Wolfram Sang
2010-09-24 5:54 ` [PATCH (mmc-next) 1/3] mmc: add suspend/resume in the sdhci-pltfm driver Peppe CAVALLARO
2010-09-27 10:37 ` Wolfram Sang
2 siblings, 2 replies; 19+ messages in thread
From: Giuseppe CAVALLARO @ 2010-09-23 9:14 UTC (permalink / raw)
To: linux-mmc; +Cc: Giuseppe Cavallaro
Some platforms based on the shdci-pltfm device driver need to
set own quirks (that currently are in drivers/mmc/host/sdhci.h).
This patch splits this header file in two parts:
o drivers/mmc/host/sdhci.h
it includes the HC registers
o include/linux/mmc/sdhci.h
it includes the private structures, callbacks, quirks etc.
So, instead of including the shdci.h from devices/mmc/host, all
the platforms based on shdci-pltfm will be able to only include:
include/linux/mmc/sdhci.h and include/linux/sdhci-pltfm.h.
This has been tested on STM targets (STx7106, STx7108, STx5206).
Note: drivers/mmc/host/sdhci.h also includes the linux/mmc/sdhci.h
and no modifications should be needed on other sdhci-<XXX> drivers.
Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
---
drivers/mmc/host/sdhci.h | 271 ++-------------------------------------------
include/linux/mmc/sdhci.h | 269 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 280 insertions(+), 260 deletions(-)
create mode 100644 include/linux/mmc/sdhci.h
diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
index ae28a31..3b96e4a 100644
--- a/drivers/mmc/host/sdhci.h
+++ b/drivers/mmc/host/sdhci.h
@@ -1,5 +1,7 @@
/*
- * linux/drivers/mmc/host/sdhci.h - Secure Digital Host Controller Interface driver
+ * linux/drivers/mmc/host/sdhci.h - Secure Digital Host Controller Interface
+ *
+ * Host Controller registers.
*
* Copyright (C) 2005-2008 Pierre Ossman, All Rights Reserved.
*
@@ -8,13 +10,10 @@
* the Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*/
-#ifndef __SDHCI_H
-#define __SDHCI_H
+#ifndef __SDHCI_HW_H
+#define __SDHCI_HW_H
-#include <linux/scatterlist.h>
-#include <linux/compiler.h>
-#include <linux/types.h>
-#include <linux/io.h>
+#include <linux/mmc/sdhci.h>
/*
* Controller registers
@@ -181,256 +180,8 @@
#define SDHCI_VENDOR_VER_SHIFT 8
#define SDHCI_SPEC_VER_MASK 0x00FF
#define SDHCI_SPEC_VER_SHIFT 0
-#define SDHCI_SPEC_100 0
-#define SDHCI_SPEC_200 1
-#define SDHCI_SPEC_300 2
-
-struct sdhci_ops;
-
-struct sdhci_host {
- /* Data set by hardware interface driver */
- const char *hw_name; /* Hardware bus name */
-
- unsigned int quirks; /* Deviations from spec. */
-
-/* Controller doesn't honor resets unless we touch the clock register */
-#define SDHCI_QUIRK_CLOCK_BEFORE_RESET (1<<0)
-/* Controller has bad caps bits, but really supports DMA */
-#define SDHCI_QUIRK_FORCE_DMA (1<<1)
-/* Controller doesn't like to be reset when there is no card inserted. */
-#define SDHCI_QUIRK_NO_CARD_NO_RESET (1<<2)
-/* Controller doesn't like clearing the power reg before a change */
-#define SDHCI_QUIRK_SINGLE_POWER_WRITE (1<<3)
-/* Controller has flaky internal state so reset it on each ios change */
-#define SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS (1<<4)
-/* Controller has an unusable DMA engine */
-#define SDHCI_QUIRK_BROKEN_DMA (1<<5)
-/* Controller has an unusable ADMA engine */
-#define SDHCI_QUIRK_BROKEN_ADMA (1<<6)
-/* Controller can only DMA from 32-bit aligned addresses */
-#define SDHCI_QUIRK_32BIT_DMA_ADDR (1<<7)
-/* Controller can only DMA chunk sizes that are a multiple of 32 bits */
-#define SDHCI_QUIRK_32BIT_DMA_SIZE (1<<8)
-/* Controller can only ADMA chunks that are a multiple of 32 bits */
-#define SDHCI_QUIRK_32BIT_ADMA_SIZE (1<<9)
-/* Controller needs to be reset after each request to stay stable */
-#define SDHCI_QUIRK_RESET_AFTER_REQUEST (1<<10)
-/* Controller needs voltage and power writes to happen separately */
-#define SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER (1<<11)
-/* Controller provides an incorrect timeout value for transfers */
-#define SDHCI_QUIRK_BROKEN_TIMEOUT_VAL (1<<12)
-/* Controller has an issue with buffer bits for small transfers */
-#define SDHCI_QUIRK_BROKEN_SMALL_PIO (1<<13)
-/* Controller does not provide transfer-complete interrupt when not busy */
-#define SDHCI_QUIRK_NO_BUSY_IRQ (1<<14)
-/* Controller has unreliable card detection */
-#define SDHCI_QUIRK_BROKEN_CARD_DETECTION (1<<15)
-/* Controller reports inverted write-protect state */
-#define SDHCI_QUIRK_INVERTED_WRITE_PROTECT (1<<16)
-/* Controller has nonstandard clock management */
-#define SDHCI_QUIRK_NONSTANDARD_CLOCK (1<<17)
-/* Controller does not like fast PIO transfers */
-#define SDHCI_QUIRK_PIO_NEEDS_DELAY (1<<18)
-/* Controller losing signal/interrupt enable states after reset */
-#define SDHCI_QUIRK_RESTORE_IRQS_AFTER_RESET (1<<19)
-/* Controller has to be forced to use block size of 2048 bytes */
-#define SDHCI_QUIRK_FORCE_BLK_SZ_2048 (1<<20)
-/* Controller cannot do multi-block transfers */
-#define SDHCI_QUIRK_NO_MULTIBLOCK (1<<21)
-/* Controller can only handle 1-bit data transfers */
-#define SDHCI_QUIRK_FORCE_1_BIT_DATA (1<<22)
-/* Controller needs 10ms delay between applying power and clock */
-#define SDHCI_QUIRK_DELAY_AFTER_POWER (1<<23)
-/* Controller uses SDCLK instead of TMCLK for data timeouts */
-#define SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK (1<<24)
-/* Controller reports wrong base clock capability */
-#define SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN (1<<25)
-/* Controller cannot support End Attribute in NOP ADMA descriptor */
-#define SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC (1<<26)
-/* Controller is missing device caps. Use caps provided by host */
-#define SDHCI_QUIRK_MISSING_CAPS (1<<27)
-/* Controller uses Auto CMD12 command to stop the transfer */
-#define SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12 (1<<28)
-/* Controller doesn't have HISPD bit field in HI-SPEED SD card */
-#define SDHCI_QUIRK_NO_HISPD_BIT (1<<29)
-
- int irq; /* Device IRQ */
- void __iomem * ioaddr; /* Mapped address */
-
- const struct sdhci_ops *ops; /* Low level hw interface */
-
- struct regulator *vmmc; /* Power regulator */
-
- /* Internal data */
- struct mmc_host *mmc; /* MMC structure */
- u64 dma_mask; /* custom DMA mask */
-
-#if defined(CONFIG_LEDS_CLASS) || defined(CONFIG_LEDS_CLASS_MODULE)
- struct led_classdev led; /* LED control */
- char led_name[32];
-#endif
-
- spinlock_t lock; /* Mutex */
-
- int flags; /* Host attributes */
-#define SDHCI_USE_SDMA (1<<0) /* Host is SDMA capable */
-#define SDHCI_USE_ADMA (1<<1) /* Host is ADMA capable */
-#define SDHCI_REQ_USE_DMA (1<<2) /* Use DMA for this req. */
-#define SDHCI_DEVICE_DEAD (1<<3) /* Device unresponsive */
-
- unsigned int version; /* SDHCI spec. version */
-
- unsigned int max_clk; /* Max possible freq (MHz) */
- unsigned int timeout_clk; /* Timeout freq (KHz) */
-
- unsigned int clock; /* Current clock (MHz) */
- u8 pwr; /* Current voltage */
-
- struct mmc_request *mrq; /* Current request */
- struct mmc_command *cmd; /* Current command */
- struct mmc_data *data; /* Current data request */
- unsigned int data_early:1; /* Data finished before cmd */
-
- struct sg_mapping_iter sg_miter; /* SG state for PIO */
- unsigned int blocks; /* remaining PIO blocks */
-
- int sg_count; /* Mapped sg entries */
-
- u8 *adma_desc; /* ADMA descriptor table */
- u8 *align_buffer; /* Bounce buffer */
-
- dma_addr_t adma_addr; /* Mapped ADMA descr. table */
- dma_addr_t align_addr; /* Mapped bounce buffer */
-
- struct tasklet_struct card_tasklet; /* Tasklet structures */
- struct tasklet_struct finish_tasklet;
-
- struct timer_list timer; /* Timer for timeouts */
-
- unsigned int caps; /* Alternative capabilities */
-
- unsigned long private[0] ____cacheline_aligned;
-};
-
-
-struct sdhci_ops {
-#ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS
- u32 (*read_l)(struct sdhci_host *host, int reg);
- u16 (*read_w)(struct sdhci_host *host, int reg);
- u8 (*read_b)(struct sdhci_host *host, int reg);
- void (*write_l)(struct sdhci_host *host, u32 val, int reg);
- void (*write_w)(struct sdhci_host *host, u16 val, int reg);
- void (*write_b)(struct sdhci_host *host, u8 val, int reg);
-#endif
-
- void (*set_clock)(struct sdhci_host *host, unsigned int clock);
-
- int (*enable_dma)(struct sdhci_host *host);
- unsigned int (*get_max_clock)(struct sdhci_host *host);
- unsigned int (*get_min_clock)(struct sdhci_host *host);
- unsigned int (*get_timeout_clock)(struct sdhci_host *host);
-};
-
-#ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS
-
-static inline void sdhci_writel(struct sdhci_host *host, u32 val, int reg)
-{
- if (unlikely(host->ops->write_l))
- host->ops->write_l(host, val, reg);
- else
- writel(val, host->ioaddr + reg);
-}
-
-static inline void sdhci_writew(struct sdhci_host *host, u16 val, int reg)
-{
- if (unlikely(host->ops->write_w))
- host->ops->write_w(host, val, reg);
- else
- writew(val, host->ioaddr + reg);
-}
-
-static inline void sdhci_writeb(struct sdhci_host *host, u8 val, int reg)
-{
- if (unlikely(host->ops->write_b))
- host->ops->write_b(host, val, reg);
- else
- writeb(val, host->ioaddr + reg);
-}
-
-static inline u32 sdhci_readl(struct sdhci_host *host, int reg)
-{
- if (unlikely(host->ops->read_l))
- return host->ops->read_l(host, reg);
- else
- return readl(host->ioaddr + reg);
-}
-
-static inline u16 sdhci_readw(struct sdhci_host *host, int reg)
-{
- if (unlikely(host->ops->read_w))
- return host->ops->read_w(host, reg);
- else
- return readw(host->ioaddr + reg);
-}
-
-static inline u8 sdhci_readb(struct sdhci_host *host, int reg)
-{
- if (unlikely(host->ops->read_b))
- return host->ops->read_b(host, reg);
- else
- return readb(host->ioaddr + reg);
-}
-
-#else
-
-static inline void sdhci_writel(struct sdhci_host *host, u32 val, int reg)
-{
- writel(val, host->ioaddr + reg);
-}
-
-static inline void sdhci_writew(struct sdhci_host *host, u16 val, int reg)
-{
- writew(val, host->ioaddr + reg);
-}
-
-static inline void sdhci_writeb(struct sdhci_host *host, u8 val, int reg)
-{
- writeb(val, host->ioaddr + reg);
-}
-
-static inline u32 sdhci_readl(struct sdhci_host *host, int reg)
-{
- return readl(host->ioaddr + reg);
-}
-
-static inline u16 sdhci_readw(struct sdhci_host *host, int reg)
-{
- return readw(host->ioaddr + reg);
-}
-
-static inline u8 sdhci_readb(struct sdhci_host *host, int reg)
-{
- return readb(host->ioaddr + reg);
-}
-
-#endif /* CONFIG_MMC_SDHCI_IO_ACCESSORS */
-
-extern struct sdhci_host *sdhci_alloc_host(struct device *dev,
- size_t priv_size);
-extern void sdhci_free_host(struct sdhci_host *host);
-
-static inline void *sdhci_priv(struct sdhci_host *host)
-{
- return (void *)host->private;
-}
-
-extern void sdhci_card_detect(struct sdhci_host *host);
-extern int sdhci_add_host(struct sdhci_host *host);
-extern void sdhci_remove_host(struct sdhci_host *host, int dead);
-
-#ifdef CONFIG_PM
-extern int sdhci_suspend_host(struct sdhci_host *host, pm_message_t state);
-extern int sdhci_resume_host(struct sdhci_host *host);
-#endif
-
-#endif /* __SDHCI_H */
+#define SDHCI_SPEC_100 0
+#define SDHCI_SPEC_200 1
+#define SDHCI_SPEC_300 2
+
+#endif /* __SDHCI_HW_H */
diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h
new file mode 100644
index 0000000..dd4552d
--- /dev/null
+++ b/include/linux/mmc/sdhci.h
@@ -0,0 +1,269 @@
+/*
+ * linux/drivers/mmc/host/sdhci.h - Secure Digital Host Controller Interface
+ *
+ * * Private sdhci structure, quirks, callbacks.
+ *
+ * Copyright (C) 2005-2008 Pierre Ossman, All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ */
+#ifndef __SDHCI_H
+#define __SDHCI_H
+
+#include <linux/scatterlist.h>
+#include <linux/compiler.h>
+#include <linux/types.h>
+#include <linux/io.h>
+#include <linux/mmc/host.h>
+
+struct sdhci_ops;
+
+struct sdhci_host {
+ /* Data set by hardware interface driver */
+ const char *hw_name; /* Hardware bus name */
+
+ unsigned int quirks; /* Deviations from spec. */
+
+/* Controller doesn't honor resets unless we touch the clock register */
+#define SDHCI_QUIRK_CLOCK_BEFORE_RESET (1<<0)
+/* Controller has bad caps bits, but really supports DMA */
+#define SDHCI_QUIRK_FORCE_DMA (1<<1)
+/* Controller doesn't like to be reset when there is no card inserted. */
+#define SDHCI_QUIRK_NO_CARD_NO_RESET (1<<2)
+/* Controller doesn't like clearing the power reg before a change */
+#define SDHCI_QUIRK_SINGLE_POWER_WRITE (1<<3)
+/* Controller has flaky internal state so reset it on each ios change */
+#define SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS (1<<4)
+/* Controller has an unusable DMA engine */
+#define SDHCI_QUIRK_BROKEN_DMA (1<<5)
+/* Controller has an unusable ADMA engine */
+#define SDHCI_QUIRK_BROKEN_ADMA (1<<6)
+/* Controller can only DMA from 32-bit aligned addresses */
+#define SDHCI_QUIRK_32BIT_DMA_ADDR (1<<7)
+/* Controller can only DMA chunk sizes that are a multiple of 32 bits */
+#define SDHCI_QUIRK_32BIT_DMA_SIZE (1<<8)
+/* Controller can only ADMA chunks that are a multiple of 32 bits */
+#define SDHCI_QUIRK_32BIT_ADMA_SIZE (1<<9)
+/* Controller needs to be reset after each request to stay stable */
+#define SDHCI_QUIRK_RESET_AFTER_REQUEST (1<<10)
+/* Controller needs voltage and power writes to happen separately */
+#define SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER (1<<11)
+/* Controller provides an incorrect timeout value for transfers */
+#define SDHCI_QUIRK_BROKEN_TIMEOUT_VAL (1<<12)
+/* Controller has an issue with buffer bits for small transfers */
+#define SDHCI_QUIRK_BROKEN_SMALL_PIO (1<<13)
+/* Controller does not provide transfer-complete interrupt when not busy */
+#define SDHCI_QUIRK_NO_BUSY_IRQ (1<<14)
+/* Controller has unreliable card detection */
+#define SDHCI_QUIRK_BROKEN_CARD_DETECTION (1<<15)
+/* Controller reports inverted write-protect state */
+#define SDHCI_QUIRK_INVERTED_WRITE_PROTECT (1<<16)
+/* Controller has nonstandard clock management */
+#define SDHCI_QUIRK_NONSTANDARD_CLOCK (1<<17)
+/* Controller does not like fast PIO transfers */
+#define SDHCI_QUIRK_PIO_NEEDS_DELAY (1<<18)
+/* Controller losing signal/interrupt enable states after reset */
+#define SDHCI_QUIRK_RESTORE_IRQS_AFTER_RESET (1<<19)
+/* Controller has to be forced to use block size of 2048 bytes */
+#define SDHCI_QUIRK_FORCE_BLK_SZ_2048 (1<<20)
+/* Controller cannot do multi-block transfers */
+#define SDHCI_QUIRK_NO_MULTIBLOCK (1<<21)
+/* Controller can only handle 1-bit data transfers */
+#define SDHCI_QUIRK_FORCE_1_BIT_DATA (1<<22)
+/* Controller needs 10ms delay between applying power and clock */
+#define SDHCI_QUIRK_DELAY_AFTER_POWER (1<<23)
+/* Controller uses SDCLK instead of TMCLK for data timeouts */
+#define SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK (1<<24)
+/* Controller reports wrong base clock capability */
+#define SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN (1<<25)
+/* Controller cannot support End Attribute in NOP ADMA descriptor */
+#define SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC (1<<26)
+/* Controller is missing device caps. Use caps provided by host */
+#define SDHCI_QUIRK_MISSING_CAPS (1<<27)
+/* Controller uses Auto CMD12 command to stop the transfer */
+#define SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12 (1<<28)
+/* Controller doesn't have HISPD bit field in HI-SPEED SD card */
+#define SDHCI_QUIRK_NO_HISPD_BIT (1<<29)
+
+ int irq; /* Device IRQ */
+ void __iomem *ioaddr; /* Mapped address */
+
+ const struct sdhci_ops *ops; /* Low level hw interface */
+
+ struct regulator *vmmc; /* Power regulator */
+
+ /* Internal data */
+ struct mmc_host *mmc; /* MMC structure */
+ u64 dma_mask; /* custom DMA mask */
+
+#if defined(CONFIG_LEDS_CLASS) || defined(CONFIG_LEDS_CLASS_MODULE)
+ struct led_classdev led; /* LED control */
+ char led_name[32];
+#endif
+
+ spinlock_t lock; /* Mutex */
+
+ int flags; /* Host attributes */
+#define SDHCI_USE_SDMA (1<<0) /* Host is SDMA capable */
+#define SDHCI_USE_ADMA (1<<1) /* Host is ADMA capable */
+#define SDHCI_REQ_USE_DMA (1<<2) /* Use DMA for this req. */
+#define SDHCI_DEVICE_DEAD (1<<3) /* Device unresponsive */
+
+ unsigned int version; /* SDHCI spec. version */
+
+ unsigned int max_clk; /* Max possible freq (MHz) */
+ unsigned int timeout_clk; /* Timeout freq (KHz) */
+
+ unsigned int clock; /* Current clock (MHz) */
+ u8 pwr; /* Current voltage */
+
+ struct mmc_request *mrq; /* Current request */
+ struct mmc_command *cmd; /* Current command */
+ struct mmc_data *data; /* Current data request */
+ unsigned int data_early:1; /* Data finished before cmd */
+
+ struct sg_mapping_iter sg_miter; /* SG state for PIO */
+ unsigned int blocks; /* remaining PIO blocks */
+
+ int sg_count; /* Mapped sg entries */
+
+ u8 *adma_desc; /* ADMA descriptor table */
+ u8 *align_buffer; /* Bounce buffer */
+
+ dma_addr_t adma_addr; /* Mapped ADMA descr. table */
+ dma_addr_t align_addr; /* Mapped bounce buffer */
+
+ struct tasklet_struct card_tasklet; /* Tasklet structures */
+ struct tasklet_struct finish_tasklet;
+
+ struct timer_list timer; /* Timer for timeouts */
+
+ unsigned int caps; /* Alternative capabilities */
+
+ unsigned long private[0] ____cacheline_aligned;
+};
+
+struct sdhci_ops {
+#ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS
+ u32(*read_l) (struct sdhci_host *host, int reg);
+ u16(*read_w) (struct sdhci_host *host, int reg);
+ u8(*read_b) (struct sdhci_host *host, int reg);
+ void (*write_l) (struct sdhci_host *host, u32 val, int reg);
+ void (*write_w) (struct sdhci_host *host, u16 val, int reg);
+ void (*write_b) (struct sdhci_host *host, u8 val, int reg);
+#endif
+
+ void (*set_clock) (struct sdhci_host *host, unsigned int clock);
+
+ int (*enable_dma) (struct sdhci_host *host);
+ unsigned int (*get_max_clock) (struct sdhci_host *host);
+ unsigned int (*get_min_clock) (struct sdhci_host *host);
+ unsigned int (*get_timeout_clock) (struct sdhci_host *host);
+};
+
+#ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS
+
+static inline void sdhci_writel(struct sdhci_host *host, u32 val, int reg)
+{
+ if (unlikely(host->ops->write_l))
+ host->ops->write_l(host, val, reg);
+ else
+ writel(val, host->ioaddr + reg);
+}
+
+static inline void sdhci_writew(struct sdhci_host *host, u16 val, int reg)
+{
+ if (unlikely(host->ops->write_w))
+ host->ops->write_w(host, val, reg);
+ else
+ writew(val, host->ioaddr + reg);
+}
+
+static inline void sdhci_writeb(struct sdhci_host *host, u8 val, int reg)
+{
+ if (unlikely(host->ops->write_b))
+ host->ops->write_b(host, val, reg);
+ else
+ writeb(val, host->ioaddr + reg);
+}
+
+static inline u32 sdhci_readl(struct sdhci_host *host, int reg)
+{
+ if (unlikely(host->ops->read_l))
+ return host->ops->read_l(host, reg);
+ else
+ return readl(host->ioaddr + reg);
+}
+
+static inline u16 sdhci_readw(struct sdhci_host *host, int reg)
+{
+ if (unlikely(host->ops->read_w))
+ return host->ops->read_w(host, reg);
+ else
+ return readw(host->ioaddr + reg);
+}
+
+static inline u8 sdhci_readb(struct sdhci_host *host, int reg)
+{
+ if (unlikely(host->ops->read_b))
+ return host->ops->read_b(host, reg);
+ else
+ return readb(host->ioaddr + reg);
+}
+
+#else
+
+static inline void sdhci_writel(struct sdhci_host *host, u32 val, int reg)
+{
+ writel(val, host->ioaddr + reg);
+}
+
+static inline void sdhci_writew(struct sdhci_host *host, u16 val, int reg)
+{
+ writew(val, host->ioaddr + reg);
+}
+
+static inline void sdhci_writeb(struct sdhci_host *host, u8 val, int reg)
+{
+ writeb(val, host->ioaddr + reg);
+}
+
+static inline u32 sdhci_readl(struct sdhci_host *host, int reg)
+{
+ return readl(host->ioaddr + reg);
+}
+
+static inline u16 sdhci_readw(struct sdhci_host *host, int reg)
+{
+ return readw(host->ioaddr + reg);
+}
+
+static inline u8 sdhci_readb(struct sdhci_host *host, int reg)
+{
+ return readb(host->ioaddr + reg);
+}
+
+#endif /* CONFIG_MMC_SDHCI_IO_ACCESSORS */
+
+extern struct sdhci_host *sdhci_alloc_host(struct device *dev,
+ size_t priv_size);
+extern void sdhci_free_host(struct sdhci_host *host);
+
+static inline void *sdhci_priv(struct sdhci_host *host)
+{
+ return (void *)host->private;
+}
+
+extern void sdhci_card_detect(struct sdhci_host *host);
+extern int sdhci_add_host(struct sdhci_host *host);
+extern void sdhci_remove_host(struct sdhci_host *host, int dead);
+
+#ifdef CONFIG_PM
+extern int sdhci_suspend_host(struct sdhci_host *host, pm_message_t state);
+extern int sdhci_resume_host(struct sdhci_host *host);
+#endif
+
+#endif /* __SDHCI_H */
--
1.5.5.6
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH (mmc-next) 3/3] mmc: fix a warning when compile the sdhci d.d.
2010-09-23 9:14 ` [PATCH (mmc-next) 2/3] mmc: split the sdhci.h to help platforms that uses shdci-pltfm d.d Giuseppe CAVALLARO
@ 2010-09-23 9:14 ` Giuseppe CAVALLARO
2010-09-27 10:54 ` Wolfram Sang
2010-09-27 10:43 ` [PATCH (mmc-next) 2/3] mmc: split the sdhci.h to help platforms that uses shdci-pltfm d.d Wolfram Sang
1 sibling, 1 reply; 19+ messages in thread
From: Giuseppe CAVALLARO @ 2010-09-23 9:14 UTC (permalink / raw)
To: linux-mmc; +Cc: Giuseppe Cavallaro
This patch fixes a warning when compile the sdhci:
pwr may be used uninitialized in sdhci_set_power
Also removes some include files that live in sdhci.h
header file.
Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
---
drivers/mmc/host/sdhci.c | 11 ++---------
1 files changed, 2 insertions(+), 9 deletions(-)
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 5928b0a..058dacd 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -18,13 +18,8 @@
#include <linux/io.h>
#include <linux/dma-mapping.h>
#include <linux/slab.h>
-#include <linux/scatterlist.h>
#include <linux/regulator/consumer.h>
-#include <linux/leds.h>
-
-#include <linux/mmc/host.h>
-
#include "sdhci.h"
#define DRIVER_NAME "sdhci"
@@ -1050,11 +1045,9 @@ out:
static void sdhci_set_power(struct sdhci_host *host, unsigned short power)
{
- u8 pwr;
+ u8 pwr = 0;
- if (power == (unsigned short)-1)
- pwr = 0;
- else {
+ if (power != (unsigned short)-1) {
switch (1 << power) {
case MMC_VDD_165_195:
pwr = SDHCI_POWER_180;
--
1.5.5.6
^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [PATCH (mmc-next) 1/3] mmc: add suspend/resume in the sdhci-pltfm driver
2010-09-23 9:14 [PATCH (mmc-next) 1/3] mmc: add suspend/resume in the sdhci-pltfm driver Giuseppe CAVALLARO
2010-09-23 9:14 ` [PATCH (mmc-next) 2/3] mmc: split the sdhci.h to help platforms that uses shdci-pltfm d.d Giuseppe CAVALLARO
@ 2010-09-24 5:54 ` Peppe CAVALLARO
2010-09-24 9:04 ` Wolfram Sang
2010-09-27 10:37 ` Wolfram Sang
2 siblings, 1 reply; 19+ messages in thread
From: Peppe CAVALLARO @ 2010-09-24 5:54 UTC (permalink / raw)
To: Wolfram Sang; +Cc: linux-mmc@vger.kernel.org, Andrew Morton, Matt Fleming
Hello
I wonder if you could review the three patches I sent the mailing list:
especially the following ones:
mmc: add suspend/resume in the sdhci-pltfm driver
mmc: split the sdhci.h to help platforms that uses shdci-pltfm d.d.
These follow the advice discussed with Wolfram in the thread named:
"[PATCH] mmc: add SDHCI driver for STM platforms (V2)."
I just noticed to have forgotten to put in cc Andrew and Matt (sorry).
In fact, I want to remove the stm driver and use the pltfm driver
instead of. To do that on my platforms, I need have the support provided
in these patches. This support could actually be useful for others.
Let me know.
Best Regards,
Peppe
On 09/23/2010 11:14 AM, Giuseppe CAVALLARO wrote:
> Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
> ---
> drivers/mmc/host/sdhci-pltfm.c | 22 ++++++++++++++++++++++
> 1 files changed, 22 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c
> index e045e3c..89ea64b 100644
> --- a/drivers/mmc/host/sdhci-pltfm.c
> +++ b/drivers/mmc/host/sdhci-pltfm.c
> @@ -165,6 +165,24 @@ static const struct platform_device_id sdhci_pltfm_ids[] = {
> };
> MODULE_DEVICE_TABLE(platform, sdhci_pltfm_ids);
>
> +#ifdef CONFIG_PM
> +static int sdhci_pltfm_suspend(struct platform_device *dev, pm_message_t pm)
> +{
> + struct sdhci_host *host = platform_get_drvdata(dev);
> +
> + sdhci_suspend_host(host, pm);
> + return 0;
> +}
> +
> +static int sdhci_pltfm_resume(struct platform_device *dev)
> +{
> + struct sdhci_host *host = platform_get_drvdata(dev);
> +
> + sdhci_resume_host(host);
> + return 0;
> +}
> +#endif
> +
> static struct platform_driver sdhci_pltfm_driver = {
> .driver = {
> .name = "sdhci",
> @@ -173,6 +191,10 @@ static struct platform_driver sdhci_pltfm_driver = {
> .probe = sdhci_pltfm_probe,
> .remove = __devexit_p(sdhci_pltfm_remove),
> .id_table = sdhci_pltfm_ids,
> +#ifdef CONFIG_PM
> + .suspend = sdhci_pltfm_suspend,
> + .resume = sdhci_pltfm_resume,
> +#endif
> };
>
> /*****************************************************************************\
> --
> 1.5.5.6
>
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH (mmc-next) 1/3] mmc: add suspend/resume in the sdhci-pltfm driver
2010-09-24 5:54 ` [PATCH (mmc-next) 1/3] mmc: add suspend/resume in the sdhci-pltfm driver Peppe CAVALLARO
@ 2010-09-24 9:04 ` Wolfram Sang
2010-09-24 9:49 ` Peppe CAVALLARO
0 siblings, 1 reply; 19+ messages in thread
From: Wolfram Sang @ 2010-09-24 9:04 UTC (permalink / raw)
To: Peppe CAVALLARO; +Cc: linux-mmc@vger.kernel.org, Andrew Morton, Matt Fleming
[-- Attachment #1: Type: text/plain, Size: 492 bytes --]
On Fri, Sep 24, 2010 at 07:54:53AM +0200, Peppe CAVALLARO wrote:
> Hello
> I wonder if you could review the three patches I sent the mailing list:
> especially the following ones:
I intend to have a closer look at them, but please give me a few days. I
first need to get my "official" tasks done...
Regards,
Wolfram
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH (mmc-next) 1/3] mmc: add suspend/resume in the sdhci-pltfm driver
2010-09-24 9:04 ` Wolfram Sang
@ 2010-09-24 9:49 ` Peppe CAVALLARO
0 siblings, 0 replies; 19+ messages in thread
From: Peppe CAVALLARO @ 2010-09-24 9:49 UTC (permalink / raw)
To: Wolfram Sang; +Cc: linux-mmc@vger.kernel.org, Andrew Morton, Matt Fleming
On 09/24/2010 11:04 AM, Wolfram Sang wrote:
> On Fri, Sep 24, 2010 at 07:54:53AM +0200, Peppe CAVALLARO wrote:
>> Hello
>> I wonder if you could review the three patches I sent the mailing list:
>> especially the following ones:
>
> I intend to have a closer look at them, but please give me a few days. I
> first need to get my "official" tasks done...
Hi Wolfram,
no problem take it easy. Let me know as soon as you complete it.
Kind Regards
Peppe
>
> Regards,
>
> Wolfram
>
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH (mmc-next) 1/3] mmc: add suspend/resume in the sdhci-pltfm driver
2010-09-23 9:14 [PATCH (mmc-next) 1/3] mmc: add suspend/resume in the sdhci-pltfm driver Giuseppe CAVALLARO
2010-09-23 9:14 ` [PATCH (mmc-next) 2/3] mmc: split the sdhci.h to help platforms that uses shdci-pltfm d.d Giuseppe CAVALLARO
2010-09-24 5:54 ` [PATCH (mmc-next) 1/3] mmc: add suspend/resume in the sdhci-pltfm driver Peppe CAVALLARO
@ 2010-09-27 10:37 ` Wolfram Sang
2010-09-27 12:57 ` Peppe CAVALLARO
2 siblings, 1 reply; 19+ messages in thread
From: Wolfram Sang @ 2010-09-27 10:37 UTC (permalink / raw)
To: Giuseppe CAVALLARO; +Cc: linux-mmc
[-- Attachment #1: Type: text/plain, Size: 2058 bytes --]
On Thu, Sep 23, 2010 at 11:14:24AM +0200, Giuseppe CAVALLARO wrote:
> Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
I'd prefer it the way sdhci-mv.c is doing it (just one #if-block and
returning the code from the sdhci_*-functions). Then it should be fine.
> ---
> drivers/mmc/host/sdhci-pltfm.c | 22 ++++++++++++++++++++++
> 1 files changed, 22 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c
> index e045e3c..89ea64b 100644
> --- a/drivers/mmc/host/sdhci-pltfm.c
> +++ b/drivers/mmc/host/sdhci-pltfm.c
> @@ -165,6 +165,24 @@ static const struct platform_device_id sdhci_pltfm_ids[] = {
> };
> MODULE_DEVICE_TABLE(platform, sdhci_pltfm_ids);
>
> +#ifdef CONFIG_PM
> +static int sdhci_pltfm_suspend(struct platform_device *dev, pm_message_t pm)
> +{
> + struct sdhci_host *host = platform_get_drvdata(dev);
> +
> + sdhci_suspend_host(host, pm);
> + return 0;
> +}
> +
> +static int sdhci_pltfm_resume(struct platform_device *dev)
> +{
> + struct sdhci_host *host = platform_get_drvdata(dev);
> +
> + sdhci_resume_host(host);
> + return 0;
> +}
> +#endif
> +
> static struct platform_driver sdhci_pltfm_driver = {
> .driver = {
> .name = "sdhci",
> @@ -173,6 +191,10 @@ static struct platform_driver sdhci_pltfm_driver = {
> .probe = sdhci_pltfm_probe,
> .remove = __devexit_p(sdhci_pltfm_remove),
> .id_table = sdhci_pltfm_ids,
> +#ifdef CONFIG_PM
> + .suspend = sdhci_pltfm_suspend,
> + .resume = sdhci_pltfm_resume,
> +#endif
> };
>
> /*****************************************************************************\
> --
> 1.5.5.6
>
> --
> 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
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH (mmc-next) 2/3] mmc: split the sdhci.h to help platforms that uses shdci-pltfm d.d.
2010-09-23 9:14 ` [PATCH (mmc-next) 2/3] mmc: split the sdhci.h to help platforms that uses shdci-pltfm d.d Giuseppe CAVALLARO
2010-09-23 9:14 ` [PATCH (mmc-next) 3/3] mmc: fix a warning when compile the sdhci d.d Giuseppe CAVALLARO
@ 2010-09-27 10:43 ` Wolfram Sang
2010-09-27 12:57 ` Peppe CAVALLARO
1 sibling, 1 reply; 19+ messages in thread
From: Wolfram Sang @ 2010-09-27 10:43 UTC (permalink / raw)
To: Giuseppe CAVALLARO; +Cc: linux-mmc, Chris Ball
[-- Attachment #1: Type: text/plain, Size: 22885 bytes --]
On Thu, Sep 23, 2010 at 11:14:25AM +0200, Giuseppe CAVALLARO wrote:
> Some platforms based on the shdci-pltfm device driver need to
> set own quirks (that currently are in drivers/mmc/host/sdhci.h).
>
> This patch splits this header file in two parts:
>
> o drivers/mmc/host/sdhci.h
> it includes the HC registers
>
> o include/linux/mmc/sdhci.h
> it includes the private structures, callbacks, quirks etc.
>
> So, instead of including the shdci.h from devices/mmc/host, all
> the platforms based on shdci-pltfm will be able to only include:
> include/linux/mmc/sdhci.h and include/linux/sdhci-pltfm.h.
>
> This has been tested on STM targets (STx7106, STx7108, STx5206).
>
> Note: drivers/mmc/host/sdhci.h also includes the linux/mmc/sdhci.h
> and no modifications should be needed on other sdhci-<XXX> drivers.
>
> Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
IMO this is too much exporting here. I can't see a reason to export the
sdhci_host-structure, for example. My idea would be to start with a
minimal approach and just copy over the stuff we need now (the quirks).
If we need more later, we add it seperately then.
> ---
> drivers/mmc/host/sdhci.h | 271 ++-------------------------------------------
> include/linux/mmc/sdhci.h | 269 ++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 280 insertions(+), 260 deletions(-)
> create mode 100644 include/linux/mmc/sdhci.h
>
> diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
> index ae28a31..3b96e4a 100644
> --- a/drivers/mmc/host/sdhci.h
> +++ b/drivers/mmc/host/sdhci.h
> @@ -1,5 +1,7 @@
> /*
> - * linux/drivers/mmc/host/sdhci.h - Secure Digital Host Controller Interface driver
> + * linux/drivers/mmc/host/sdhci.h - Secure Digital Host Controller Interface
> + *
> + * Host Controller registers.
> *
> * Copyright (C) 2005-2008 Pierre Ossman, All Rights Reserved.
> *
> @@ -8,13 +10,10 @@
> * the Free Software Foundation; either version 2 of the License, or (at
> * your option) any later version.
> */
> -#ifndef __SDHCI_H
> -#define __SDHCI_H
> +#ifndef __SDHCI_HW_H
> +#define __SDHCI_HW_H
>
> -#include <linux/scatterlist.h>
> -#include <linux/compiler.h>
> -#include <linux/types.h>
> -#include <linux/io.h>
> +#include <linux/mmc/sdhci.h>
>
> /*
> * Controller registers
> @@ -181,256 +180,8 @@
> #define SDHCI_VENDOR_VER_SHIFT 8
> #define SDHCI_SPEC_VER_MASK 0x00FF
> #define SDHCI_SPEC_VER_SHIFT 0
> -#define SDHCI_SPEC_100 0
> -#define SDHCI_SPEC_200 1
> -#define SDHCI_SPEC_300 2
> -
> -struct sdhci_ops;
> -
> -struct sdhci_host {
> - /* Data set by hardware interface driver */
> - const char *hw_name; /* Hardware bus name */
> -
> - unsigned int quirks; /* Deviations from spec. */
> -
> -/* Controller doesn't honor resets unless we touch the clock register */
> -#define SDHCI_QUIRK_CLOCK_BEFORE_RESET (1<<0)
> -/* Controller has bad caps bits, but really supports DMA */
> -#define SDHCI_QUIRK_FORCE_DMA (1<<1)
> -/* Controller doesn't like to be reset when there is no card inserted. */
> -#define SDHCI_QUIRK_NO_CARD_NO_RESET (1<<2)
> -/* Controller doesn't like clearing the power reg before a change */
> -#define SDHCI_QUIRK_SINGLE_POWER_WRITE (1<<3)
> -/* Controller has flaky internal state so reset it on each ios change */
> -#define SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS (1<<4)
> -/* Controller has an unusable DMA engine */
> -#define SDHCI_QUIRK_BROKEN_DMA (1<<5)
> -/* Controller has an unusable ADMA engine */
> -#define SDHCI_QUIRK_BROKEN_ADMA (1<<6)
> -/* Controller can only DMA from 32-bit aligned addresses */
> -#define SDHCI_QUIRK_32BIT_DMA_ADDR (1<<7)
> -/* Controller can only DMA chunk sizes that are a multiple of 32 bits */
> -#define SDHCI_QUIRK_32BIT_DMA_SIZE (1<<8)
> -/* Controller can only ADMA chunks that are a multiple of 32 bits */
> -#define SDHCI_QUIRK_32BIT_ADMA_SIZE (1<<9)
> -/* Controller needs to be reset after each request to stay stable */
> -#define SDHCI_QUIRK_RESET_AFTER_REQUEST (1<<10)
> -/* Controller needs voltage and power writes to happen separately */
> -#define SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER (1<<11)
> -/* Controller provides an incorrect timeout value for transfers */
> -#define SDHCI_QUIRK_BROKEN_TIMEOUT_VAL (1<<12)
> -/* Controller has an issue with buffer bits for small transfers */
> -#define SDHCI_QUIRK_BROKEN_SMALL_PIO (1<<13)
> -/* Controller does not provide transfer-complete interrupt when not busy */
> -#define SDHCI_QUIRK_NO_BUSY_IRQ (1<<14)
> -/* Controller has unreliable card detection */
> -#define SDHCI_QUIRK_BROKEN_CARD_DETECTION (1<<15)
> -/* Controller reports inverted write-protect state */
> -#define SDHCI_QUIRK_INVERTED_WRITE_PROTECT (1<<16)
> -/* Controller has nonstandard clock management */
> -#define SDHCI_QUIRK_NONSTANDARD_CLOCK (1<<17)
> -/* Controller does not like fast PIO transfers */
> -#define SDHCI_QUIRK_PIO_NEEDS_DELAY (1<<18)
> -/* Controller losing signal/interrupt enable states after reset */
> -#define SDHCI_QUIRK_RESTORE_IRQS_AFTER_RESET (1<<19)
> -/* Controller has to be forced to use block size of 2048 bytes */
> -#define SDHCI_QUIRK_FORCE_BLK_SZ_2048 (1<<20)
> -/* Controller cannot do multi-block transfers */
> -#define SDHCI_QUIRK_NO_MULTIBLOCK (1<<21)
> -/* Controller can only handle 1-bit data transfers */
> -#define SDHCI_QUIRK_FORCE_1_BIT_DATA (1<<22)
> -/* Controller needs 10ms delay between applying power and clock */
> -#define SDHCI_QUIRK_DELAY_AFTER_POWER (1<<23)
> -/* Controller uses SDCLK instead of TMCLK for data timeouts */
> -#define SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK (1<<24)
> -/* Controller reports wrong base clock capability */
> -#define SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN (1<<25)
> -/* Controller cannot support End Attribute in NOP ADMA descriptor */
> -#define SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC (1<<26)
> -/* Controller is missing device caps. Use caps provided by host */
> -#define SDHCI_QUIRK_MISSING_CAPS (1<<27)
> -/* Controller uses Auto CMD12 command to stop the transfer */
> -#define SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12 (1<<28)
> -/* Controller doesn't have HISPD bit field in HI-SPEED SD card */
> -#define SDHCI_QUIRK_NO_HISPD_BIT (1<<29)
> -
> - int irq; /* Device IRQ */
> - void __iomem * ioaddr; /* Mapped address */
> -
> - const struct sdhci_ops *ops; /* Low level hw interface */
> -
> - struct regulator *vmmc; /* Power regulator */
> -
> - /* Internal data */
> - struct mmc_host *mmc; /* MMC structure */
> - u64 dma_mask; /* custom DMA mask */
> -
> -#if defined(CONFIG_LEDS_CLASS) || defined(CONFIG_LEDS_CLASS_MODULE)
> - struct led_classdev led; /* LED control */
> - char led_name[32];
> -#endif
> -
> - spinlock_t lock; /* Mutex */
> -
> - int flags; /* Host attributes */
> -#define SDHCI_USE_SDMA (1<<0) /* Host is SDMA capable */
> -#define SDHCI_USE_ADMA (1<<1) /* Host is ADMA capable */
> -#define SDHCI_REQ_USE_DMA (1<<2) /* Use DMA for this req. */
> -#define SDHCI_DEVICE_DEAD (1<<3) /* Device unresponsive */
> -
> - unsigned int version; /* SDHCI spec. version */
> -
> - unsigned int max_clk; /* Max possible freq (MHz) */
> - unsigned int timeout_clk; /* Timeout freq (KHz) */
> -
> - unsigned int clock; /* Current clock (MHz) */
> - u8 pwr; /* Current voltage */
> -
> - struct mmc_request *mrq; /* Current request */
> - struct mmc_command *cmd; /* Current command */
> - struct mmc_data *data; /* Current data request */
> - unsigned int data_early:1; /* Data finished before cmd */
> -
> - struct sg_mapping_iter sg_miter; /* SG state for PIO */
> - unsigned int blocks; /* remaining PIO blocks */
> -
> - int sg_count; /* Mapped sg entries */
> -
> - u8 *adma_desc; /* ADMA descriptor table */
> - u8 *align_buffer; /* Bounce buffer */
> -
> - dma_addr_t adma_addr; /* Mapped ADMA descr. table */
> - dma_addr_t align_addr; /* Mapped bounce buffer */
> -
> - struct tasklet_struct card_tasklet; /* Tasklet structures */
> - struct tasklet_struct finish_tasklet;
> -
> - struct timer_list timer; /* Timer for timeouts */
> -
> - unsigned int caps; /* Alternative capabilities */
> -
> - unsigned long private[0] ____cacheline_aligned;
> -};
> -
> -
> -struct sdhci_ops {
> -#ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS
> - u32 (*read_l)(struct sdhci_host *host, int reg);
> - u16 (*read_w)(struct sdhci_host *host, int reg);
> - u8 (*read_b)(struct sdhci_host *host, int reg);
> - void (*write_l)(struct sdhci_host *host, u32 val, int reg);
> - void (*write_w)(struct sdhci_host *host, u16 val, int reg);
> - void (*write_b)(struct sdhci_host *host, u8 val, int reg);
> -#endif
> -
> - void (*set_clock)(struct sdhci_host *host, unsigned int clock);
> -
> - int (*enable_dma)(struct sdhci_host *host);
> - unsigned int (*get_max_clock)(struct sdhci_host *host);
> - unsigned int (*get_min_clock)(struct sdhci_host *host);
> - unsigned int (*get_timeout_clock)(struct sdhci_host *host);
> -};
> -
> -#ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS
> -
> -static inline void sdhci_writel(struct sdhci_host *host, u32 val, int reg)
> -{
> - if (unlikely(host->ops->write_l))
> - host->ops->write_l(host, val, reg);
> - else
> - writel(val, host->ioaddr + reg);
> -}
> -
> -static inline void sdhci_writew(struct sdhci_host *host, u16 val, int reg)
> -{
> - if (unlikely(host->ops->write_w))
> - host->ops->write_w(host, val, reg);
> - else
> - writew(val, host->ioaddr + reg);
> -}
> -
> -static inline void sdhci_writeb(struct sdhci_host *host, u8 val, int reg)
> -{
> - if (unlikely(host->ops->write_b))
> - host->ops->write_b(host, val, reg);
> - else
> - writeb(val, host->ioaddr + reg);
> -}
> -
> -static inline u32 sdhci_readl(struct sdhci_host *host, int reg)
> -{
> - if (unlikely(host->ops->read_l))
> - return host->ops->read_l(host, reg);
> - else
> - return readl(host->ioaddr + reg);
> -}
> -
> -static inline u16 sdhci_readw(struct sdhci_host *host, int reg)
> -{
> - if (unlikely(host->ops->read_w))
> - return host->ops->read_w(host, reg);
> - else
> - return readw(host->ioaddr + reg);
> -}
> -
> -static inline u8 sdhci_readb(struct sdhci_host *host, int reg)
> -{
> - if (unlikely(host->ops->read_b))
> - return host->ops->read_b(host, reg);
> - else
> - return readb(host->ioaddr + reg);
> -}
> -
> -#else
> -
> -static inline void sdhci_writel(struct sdhci_host *host, u32 val, int reg)
> -{
> - writel(val, host->ioaddr + reg);
> -}
> -
> -static inline void sdhci_writew(struct sdhci_host *host, u16 val, int reg)
> -{
> - writew(val, host->ioaddr + reg);
> -}
> -
> -static inline void sdhci_writeb(struct sdhci_host *host, u8 val, int reg)
> -{
> - writeb(val, host->ioaddr + reg);
> -}
> -
> -static inline u32 sdhci_readl(struct sdhci_host *host, int reg)
> -{
> - return readl(host->ioaddr + reg);
> -}
> -
> -static inline u16 sdhci_readw(struct sdhci_host *host, int reg)
> -{
> - return readw(host->ioaddr + reg);
> -}
> -
> -static inline u8 sdhci_readb(struct sdhci_host *host, int reg)
> -{
> - return readb(host->ioaddr + reg);
> -}
> -
> -#endif /* CONFIG_MMC_SDHCI_IO_ACCESSORS */
> -
> -extern struct sdhci_host *sdhci_alloc_host(struct device *dev,
> - size_t priv_size);
> -extern void sdhci_free_host(struct sdhci_host *host);
> -
> -static inline void *sdhci_priv(struct sdhci_host *host)
> -{
> - return (void *)host->private;
> -}
> -
> -extern void sdhci_card_detect(struct sdhci_host *host);
> -extern int sdhci_add_host(struct sdhci_host *host);
> -extern void sdhci_remove_host(struct sdhci_host *host, int dead);
> -
> -#ifdef CONFIG_PM
> -extern int sdhci_suspend_host(struct sdhci_host *host, pm_message_t state);
> -extern int sdhci_resume_host(struct sdhci_host *host);
> -#endif
> -
> -#endif /* __SDHCI_H */
> +#define SDHCI_SPEC_100 0
> +#define SDHCI_SPEC_200 1
> +#define SDHCI_SPEC_300 2
> +
> +#endif /* __SDHCI_HW_H */
> diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h
> new file mode 100644
> index 0000000..dd4552d
> --- /dev/null
> +++ b/include/linux/mmc/sdhci.h
> @@ -0,0 +1,269 @@
> +/*
> + * linux/drivers/mmc/host/sdhci.h - Secure Digital Host Controller Interface
> + *
> + * * Private sdhci structure, quirks, callbacks.
> + *
> + * Copyright (C) 2005-2008 Pierre Ossman, All Rights Reserved.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or (at
> + * your option) any later version.
> + */
> +#ifndef __SDHCI_H
> +#define __SDHCI_H
> +
> +#include <linux/scatterlist.h>
> +#include <linux/compiler.h>
> +#include <linux/types.h>
> +#include <linux/io.h>
> +#include <linux/mmc/host.h>
> +
> +struct sdhci_ops;
> +
> +struct sdhci_host {
> + /* Data set by hardware interface driver */
> + const char *hw_name; /* Hardware bus name */
> +
> + unsigned int quirks; /* Deviations from spec. */
> +
> +/* Controller doesn't honor resets unless we touch the clock register */
> +#define SDHCI_QUIRK_CLOCK_BEFORE_RESET (1<<0)
> +/* Controller has bad caps bits, but really supports DMA */
> +#define SDHCI_QUIRK_FORCE_DMA (1<<1)
> +/* Controller doesn't like to be reset when there is no card inserted. */
> +#define SDHCI_QUIRK_NO_CARD_NO_RESET (1<<2)
> +/* Controller doesn't like clearing the power reg before a change */
> +#define SDHCI_QUIRK_SINGLE_POWER_WRITE (1<<3)
> +/* Controller has flaky internal state so reset it on each ios change */
> +#define SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS (1<<4)
> +/* Controller has an unusable DMA engine */
> +#define SDHCI_QUIRK_BROKEN_DMA (1<<5)
> +/* Controller has an unusable ADMA engine */
> +#define SDHCI_QUIRK_BROKEN_ADMA (1<<6)
> +/* Controller can only DMA from 32-bit aligned addresses */
> +#define SDHCI_QUIRK_32BIT_DMA_ADDR (1<<7)
> +/* Controller can only DMA chunk sizes that are a multiple of 32 bits */
> +#define SDHCI_QUIRK_32BIT_DMA_SIZE (1<<8)
> +/* Controller can only ADMA chunks that are a multiple of 32 bits */
> +#define SDHCI_QUIRK_32BIT_ADMA_SIZE (1<<9)
> +/* Controller needs to be reset after each request to stay stable */
> +#define SDHCI_QUIRK_RESET_AFTER_REQUEST (1<<10)
> +/* Controller needs voltage and power writes to happen separately */
> +#define SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER (1<<11)
> +/* Controller provides an incorrect timeout value for transfers */
> +#define SDHCI_QUIRK_BROKEN_TIMEOUT_VAL (1<<12)
> +/* Controller has an issue with buffer bits for small transfers */
> +#define SDHCI_QUIRK_BROKEN_SMALL_PIO (1<<13)
> +/* Controller does not provide transfer-complete interrupt when not busy */
> +#define SDHCI_QUIRK_NO_BUSY_IRQ (1<<14)
> +/* Controller has unreliable card detection */
> +#define SDHCI_QUIRK_BROKEN_CARD_DETECTION (1<<15)
> +/* Controller reports inverted write-protect state */
> +#define SDHCI_QUIRK_INVERTED_WRITE_PROTECT (1<<16)
> +/* Controller has nonstandard clock management */
> +#define SDHCI_QUIRK_NONSTANDARD_CLOCK (1<<17)
> +/* Controller does not like fast PIO transfers */
> +#define SDHCI_QUIRK_PIO_NEEDS_DELAY (1<<18)
> +/* Controller losing signal/interrupt enable states after reset */
> +#define SDHCI_QUIRK_RESTORE_IRQS_AFTER_RESET (1<<19)
> +/* Controller has to be forced to use block size of 2048 bytes */
> +#define SDHCI_QUIRK_FORCE_BLK_SZ_2048 (1<<20)
> +/* Controller cannot do multi-block transfers */
> +#define SDHCI_QUIRK_NO_MULTIBLOCK (1<<21)
> +/* Controller can only handle 1-bit data transfers */
> +#define SDHCI_QUIRK_FORCE_1_BIT_DATA (1<<22)
> +/* Controller needs 10ms delay between applying power and clock */
> +#define SDHCI_QUIRK_DELAY_AFTER_POWER (1<<23)
> +/* Controller uses SDCLK instead of TMCLK for data timeouts */
> +#define SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK (1<<24)
> +/* Controller reports wrong base clock capability */
> +#define SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN (1<<25)
> +/* Controller cannot support End Attribute in NOP ADMA descriptor */
> +#define SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC (1<<26)
> +/* Controller is missing device caps. Use caps provided by host */
> +#define SDHCI_QUIRK_MISSING_CAPS (1<<27)
> +/* Controller uses Auto CMD12 command to stop the transfer */
> +#define SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12 (1<<28)
> +/* Controller doesn't have HISPD bit field in HI-SPEED SD card */
> +#define SDHCI_QUIRK_NO_HISPD_BIT (1<<29)
> +
> + int irq; /* Device IRQ */
> + void __iomem *ioaddr; /* Mapped address */
> +
> + const struct sdhci_ops *ops; /* Low level hw interface */
> +
> + struct regulator *vmmc; /* Power regulator */
> +
> + /* Internal data */
> + struct mmc_host *mmc; /* MMC structure */
> + u64 dma_mask; /* custom DMA mask */
> +
> +#if defined(CONFIG_LEDS_CLASS) || defined(CONFIG_LEDS_CLASS_MODULE)
> + struct led_classdev led; /* LED control */
> + char led_name[32];
> +#endif
> +
> + spinlock_t lock; /* Mutex */
> +
> + int flags; /* Host attributes */
> +#define SDHCI_USE_SDMA (1<<0) /* Host is SDMA capable */
> +#define SDHCI_USE_ADMA (1<<1) /* Host is ADMA capable */
> +#define SDHCI_REQ_USE_DMA (1<<2) /* Use DMA for this req. */
> +#define SDHCI_DEVICE_DEAD (1<<3) /* Device unresponsive */
> +
> + unsigned int version; /* SDHCI spec. version */
> +
> + unsigned int max_clk; /* Max possible freq (MHz) */
> + unsigned int timeout_clk; /* Timeout freq (KHz) */
> +
> + unsigned int clock; /* Current clock (MHz) */
> + u8 pwr; /* Current voltage */
> +
> + struct mmc_request *mrq; /* Current request */
> + struct mmc_command *cmd; /* Current command */
> + struct mmc_data *data; /* Current data request */
> + unsigned int data_early:1; /* Data finished before cmd */
> +
> + struct sg_mapping_iter sg_miter; /* SG state for PIO */
> + unsigned int blocks; /* remaining PIO blocks */
> +
> + int sg_count; /* Mapped sg entries */
> +
> + u8 *adma_desc; /* ADMA descriptor table */
> + u8 *align_buffer; /* Bounce buffer */
> +
> + dma_addr_t adma_addr; /* Mapped ADMA descr. table */
> + dma_addr_t align_addr; /* Mapped bounce buffer */
> +
> + struct tasklet_struct card_tasklet; /* Tasklet structures */
> + struct tasklet_struct finish_tasklet;
> +
> + struct timer_list timer; /* Timer for timeouts */
> +
> + unsigned int caps; /* Alternative capabilities */
> +
> + unsigned long private[0] ____cacheline_aligned;
> +};
> +
> +struct sdhci_ops {
> +#ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS
> + u32(*read_l) (struct sdhci_host *host, int reg);
> + u16(*read_w) (struct sdhci_host *host, int reg);
> + u8(*read_b) (struct sdhci_host *host, int reg);
> + void (*write_l) (struct sdhci_host *host, u32 val, int reg);
> + void (*write_w) (struct sdhci_host *host, u16 val, int reg);
> + void (*write_b) (struct sdhci_host *host, u8 val, int reg);
> +#endif
> +
> + void (*set_clock) (struct sdhci_host *host, unsigned int clock);
> +
> + int (*enable_dma) (struct sdhci_host *host);
> + unsigned int (*get_max_clock) (struct sdhci_host *host);
> + unsigned int (*get_min_clock) (struct sdhci_host *host);
> + unsigned int (*get_timeout_clock) (struct sdhci_host *host);
> +};
> +
> +#ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS
> +
> +static inline void sdhci_writel(struct sdhci_host *host, u32 val, int reg)
> +{
> + if (unlikely(host->ops->write_l))
> + host->ops->write_l(host, val, reg);
> + else
> + writel(val, host->ioaddr + reg);
> +}
> +
> +static inline void sdhci_writew(struct sdhci_host *host, u16 val, int reg)
> +{
> + if (unlikely(host->ops->write_w))
> + host->ops->write_w(host, val, reg);
> + else
> + writew(val, host->ioaddr + reg);
> +}
> +
> +static inline void sdhci_writeb(struct sdhci_host *host, u8 val, int reg)
> +{
> + if (unlikely(host->ops->write_b))
> + host->ops->write_b(host, val, reg);
> + else
> + writeb(val, host->ioaddr + reg);
> +}
> +
> +static inline u32 sdhci_readl(struct sdhci_host *host, int reg)
> +{
> + if (unlikely(host->ops->read_l))
> + return host->ops->read_l(host, reg);
> + else
> + return readl(host->ioaddr + reg);
> +}
> +
> +static inline u16 sdhci_readw(struct sdhci_host *host, int reg)
> +{
> + if (unlikely(host->ops->read_w))
> + return host->ops->read_w(host, reg);
> + else
> + return readw(host->ioaddr + reg);
> +}
> +
> +static inline u8 sdhci_readb(struct sdhci_host *host, int reg)
> +{
> + if (unlikely(host->ops->read_b))
> + return host->ops->read_b(host, reg);
> + else
> + return readb(host->ioaddr + reg);
> +}
> +
> +#else
> +
> +static inline void sdhci_writel(struct sdhci_host *host, u32 val, int reg)
> +{
> + writel(val, host->ioaddr + reg);
> +}
> +
> +static inline void sdhci_writew(struct sdhci_host *host, u16 val, int reg)
> +{
> + writew(val, host->ioaddr + reg);
> +}
> +
> +static inline void sdhci_writeb(struct sdhci_host *host, u8 val, int reg)
> +{
> + writeb(val, host->ioaddr + reg);
> +}
> +
> +static inline u32 sdhci_readl(struct sdhci_host *host, int reg)
> +{
> + return readl(host->ioaddr + reg);
> +}
> +
> +static inline u16 sdhci_readw(struct sdhci_host *host, int reg)
> +{
> + return readw(host->ioaddr + reg);
> +}
> +
> +static inline u8 sdhci_readb(struct sdhci_host *host, int reg)
> +{
> + return readb(host->ioaddr + reg);
> +}
> +
> +#endif /* CONFIG_MMC_SDHCI_IO_ACCESSORS */
> +
> +extern struct sdhci_host *sdhci_alloc_host(struct device *dev,
> + size_t priv_size);
> +extern void sdhci_free_host(struct sdhci_host *host);
> +
> +static inline void *sdhci_priv(struct sdhci_host *host)
> +{
> + return (void *)host->private;
> +}
> +
> +extern void sdhci_card_detect(struct sdhci_host *host);
> +extern int sdhci_add_host(struct sdhci_host *host);
> +extern void sdhci_remove_host(struct sdhci_host *host, int dead);
> +
> +#ifdef CONFIG_PM
> +extern int sdhci_suspend_host(struct sdhci_host *host, pm_message_t state);
> +extern int sdhci_resume_host(struct sdhci_host *host);
> +#endif
> +
> +#endif /* __SDHCI_H */
> --
> 1.5.5.6
>
> --
> 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
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH (mmc-next) 3/3] mmc: fix a warning when compile the sdhci d.d.
2010-09-23 9:14 ` [PATCH (mmc-next) 3/3] mmc: fix a warning when compile the sdhci d.d Giuseppe CAVALLARO
@ 2010-09-27 10:54 ` Wolfram Sang
2010-09-27 12:57 ` Peppe CAVALLARO
0 siblings, 1 reply; 19+ messages in thread
From: Wolfram Sang @ 2010-09-27 10:54 UTC (permalink / raw)
To: Giuseppe CAVALLARO; +Cc: linux-mmc
[-- Attachment #1: Type: text/plain, Size: 1849 bytes --]
On Thu, Sep 23, 2010 at 11:14:26AM +0200, Giuseppe CAVALLARO wrote:
> This patch fixes a warning when compile the sdhci:
> pwr may be used uninitialized in sdhci_set_power
> Also removes some include files that live in sdhci.h
> header file.
>
> Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
Okay for the set_power-part (what compiler are you using? Newer one
should detect that BUG never returns). The include-removal could be in a
seperate patch, not sure if it is worth, though.
> ---
> drivers/mmc/host/sdhci.c | 11 ++---------
> 1 files changed, 2 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
> index 5928b0a..058dacd 100644
> --- a/drivers/mmc/host/sdhci.c
> +++ b/drivers/mmc/host/sdhci.c
> @@ -18,13 +18,8 @@
> #include <linux/io.h>
> #include <linux/dma-mapping.h>
> #include <linux/slab.h>
> -#include <linux/scatterlist.h>
> #include <linux/regulator/consumer.h>
>
> -#include <linux/leds.h>
> -
> -#include <linux/mmc/host.h>
> -
> #include "sdhci.h"
>
> #define DRIVER_NAME "sdhci"
> @@ -1050,11 +1045,9 @@ out:
>
> static void sdhci_set_power(struct sdhci_host *host, unsigned short power)
> {
> - u8 pwr;
> + u8 pwr = 0;
>
> - if (power == (unsigned short)-1)
> - pwr = 0;
> - else {
> + if (power != (unsigned short)-1) {
> switch (1 << power) {
> case MMC_VDD_165_195:
> pwr = SDHCI_POWER_180;
> --
> 1.5.5.6
>
> --
> 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
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH (mmc-next) 3/3] mmc: fix a warning when compile the sdhci d.d.
2010-09-27 10:54 ` Wolfram Sang
@ 2010-09-27 12:57 ` Peppe CAVALLARO
2010-09-27 14:17 ` Wolfram Sang
0 siblings, 1 reply; 19+ messages in thread
From: Peppe CAVALLARO @ 2010-09-27 12:57 UTC (permalink / raw)
To: Wolfram Sang; +Cc: linux-mmc@vger.kernel.org
Hi Wolfram,
On 09/27/2010 12:54 PM, Wolfram Sang wrote:
> On Thu, Sep 23, 2010 at 11:14:26AM +0200, Giuseppe CAVALLARO wrote:
>> This patch fixes a warning when compile the sdhci:
>> pwr may be used uninitialized in sdhci_set_power
>> Also removes some include files that live in sdhci.h
>> header file.
>>
>> Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
>
> Okay for the set_power-part (what compiler are you using? Newer one
I tried with both 4.2.4 and 4.4.4 without any problems.
> should detect that BUG never returns). The include-removal could be in a
> seperate patch, not sure if it is worth, though.
It can include in a separate patch.
It makes sense if apply the previous patch to split the header file
because we remove duplicated include files.
Regards,
Peppe
>
>> ---
>> drivers/mmc/host/sdhci.c | 11 ++---------
>> 1 files changed, 2 insertions(+), 9 deletions(-)
>>
>> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
>> index 5928b0a..058dacd 100644
>> --- a/drivers/mmc/host/sdhci.c
>> +++ b/drivers/mmc/host/sdhci.c
>> @@ -18,13 +18,8 @@
>> #include <linux/io.h>
>> #include <linux/dma-mapping.h>
>> #include <linux/slab.h>
>> -#include <linux/scatterlist.h>
>> #include <linux/regulator/consumer.h>
>>
>> -#include <linux/leds.h>
>> -
>> -#include <linux/mmc/host.h>
>> -
>> #include "sdhci.h"
>>
>> #define DRIVER_NAME "sdhci"
>> @@ -1050,11 +1045,9 @@ out:
>>
>> static void sdhci_set_power(struct sdhci_host *host, unsigned short power)
>> {
>> - u8 pwr;
>> + u8 pwr = 0;
>>
>> - if (power == (unsigned short)-1)
>> - pwr = 0;
>> - else {
>> + if (power != (unsigned short)-1) {
>> switch (1 << power) {
>> case MMC_VDD_165_195:
>> pwr = SDHCI_POWER_180;
>> --
>> 1.5.5.6
>>
>> --
>> 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] 19+ messages in thread
* Re: [PATCH (mmc-next) 2/3] mmc: split the sdhci.h to help platforms that uses shdci-pltfm d.d.
2010-09-27 10:43 ` [PATCH (mmc-next) 2/3] mmc: split the sdhci.h to help platforms that uses shdci-pltfm d.d Wolfram Sang
@ 2010-09-27 12:57 ` Peppe CAVALLARO
2010-09-27 14:13 ` Wolfram Sang
0 siblings, 1 reply; 19+ messages in thread
From: Peppe CAVALLARO @ 2010-09-27 12:57 UTC (permalink / raw)
To: Wolfram Sang; +Cc: linux-mmc@vger.kernel.org, Chris Ball
Hi Wolfram,
On 09/27/2010 12:43 PM, Wolfram Sang wrote:
> On Thu, Sep 23, 2010 at 11:14:25AM +0200, Giuseppe CAVALLARO wrote:
>> Some platforms based on the shdci-pltfm device driver need to
>> set own quirks (that currently are in drivers/mmc/host/sdhci.h).
>>
>> This patch splits this header file in two parts:
>>
>> o drivers/mmc/host/sdhci.h
>> it includes the HC registers
>>
>> o include/linux/mmc/sdhci.h
>> it includes the private structures, callbacks, quirks etc.
>>
>> So, instead of including the shdci.h from devices/mmc/host, all
>> the platforms based on shdci-pltfm will be able to only include:
>> include/linux/mmc/sdhci.h and include/linux/sdhci-pltfm.h.
>>
>> This has been tested on STM targets (STx7106, STx7108, STx5206).
>>
>> Note: drivers/mmc/host/sdhci.h also includes the linux/mmc/sdhci.h
>> and no modifications should be needed on other sdhci-<XXX> drivers.
>>
>> Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
>
> IMO this is too much exporting here. I can't see a reason to export the
> sdhci_host-structure, for example. My idea would be to start with a
> minimal approach and just copy over the stuff we need now (the quirks).
> If we need more later, we add it seperately then.
I had just started doing that but I decided to split the file to solve
the issue for the .init call (we discussed in the thread
http://marc.info/?l=linux-mmc&m=128523426925028&w=2).
Indeed, this approach avoids to add other callbacks and reuses the
existent code.
Let me know.
Regards,
Peppe
>> ---
>> drivers/mmc/host/sdhci.h | 271 ++-------------------------------------------
>> include/linux/mmc/sdhci.h | 269 ++++++++++++++++++++++++++++++++++++++++++++
>> 2 files changed, 280 insertions(+), 260 deletions(-)
>> create mode 100644 include/linux/mmc/sdhci.h
>>
>> diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
>> index ae28a31..3b96e4a 100644
>> --- a/drivers/mmc/host/sdhci.h
>> +++ b/drivers/mmc/host/sdhci.h
>> @@ -1,5 +1,7 @@
>> /*
>> - * linux/drivers/mmc/host/sdhci.h - Secure Digital Host Controller Interface driver
>> + * linux/drivers/mmc/host/sdhci.h - Secure Digital Host Controller Interface
>> + *
>> + * Host Controller registers.
>> *
>> * Copyright (C) 2005-2008 Pierre Ossman, All Rights Reserved.
>> *
>> @@ -8,13 +10,10 @@
>> * the Free Software Foundation; either version 2 of the License, or (at
>> * your option) any later version.
>> */
>> -#ifndef __SDHCI_H
>> -#define __SDHCI_H
>> +#ifndef __SDHCI_HW_H
>> +#define __SDHCI_HW_H
>>
>> -#include <linux/scatterlist.h>
>> -#include <linux/compiler.h>
>> -#include <linux/types.h>
>> -#include <linux/io.h>
>> +#include <linux/mmc/sdhci.h>
>>
>> /*
>> * Controller registers
>> @@ -181,256 +180,8 @@
>> #define SDHCI_VENDOR_VER_SHIFT 8
>> #define SDHCI_SPEC_VER_MASK 0x00FF
>> #define SDHCI_SPEC_VER_SHIFT 0
>> -#define SDHCI_SPEC_100 0
>> -#define SDHCI_SPEC_200 1
>> -#define SDHCI_SPEC_300 2
>> -
>> -struct sdhci_ops;
>> -
>> -struct sdhci_host {
>> - /* Data set by hardware interface driver */
>> - const char *hw_name; /* Hardware bus name */
>> -
>> - unsigned int quirks; /* Deviations from spec. */
>> -
>> -/* Controller doesn't honor resets unless we touch the clock register */
>> -#define SDHCI_QUIRK_CLOCK_BEFORE_RESET (1<<0)
>> -/* Controller has bad caps bits, but really supports DMA */
>> -#define SDHCI_QUIRK_FORCE_DMA (1<<1)
>> -/* Controller doesn't like to be reset when there is no card inserted. */
>> -#define SDHCI_QUIRK_NO_CARD_NO_RESET (1<<2)
>> -/* Controller doesn't like clearing the power reg before a change */
>> -#define SDHCI_QUIRK_SINGLE_POWER_WRITE (1<<3)
>> -/* Controller has flaky internal state so reset it on each ios change */
>> -#define SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS (1<<4)
>> -/* Controller has an unusable DMA engine */
>> -#define SDHCI_QUIRK_BROKEN_DMA (1<<5)
>> -/* Controller has an unusable ADMA engine */
>> -#define SDHCI_QUIRK_BROKEN_ADMA (1<<6)
>> -/* Controller can only DMA from 32-bit aligned addresses */
>> -#define SDHCI_QUIRK_32BIT_DMA_ADDR (1<<7)
>> -/* Controller can only DMA chunk sizes that are a multiple of 32 bits */
>> -#define SDHCI_QUIRK_32BIT_DMA_SIZE (1<<8)
>> -/* Controller can only ADMA chunks that are a multiple of 32 bits */
>> -#define SDHCI_QUIRK_32BIT_ADMA_SIZE (1<<9)
>> -/* Controller needs to be reset after each request to stay stable */
>> -#define SDHCI_QUIRK_RESET_AFTER_REQUEST (1<<10)
>> -/* Controller needs voltage and power writes to happen separately */
>> -#define SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER (1<<11)
>> -/* Controller provides an incorrect timeout value for transfers */
>> -#define SDHCI_QUIRK_BROKEN_TIMEOUT_VAL (1<<12)
>> -/* Controller has an issue with buffer bits for small transfers */
>> -#define SDHCI_QUIRK_BROKEN_SMALL_PIO (1<<13)
>> -/* Controller does not provide transfer-complete interrupt when not busy */
>> -#define SDHCI_QUIRK_NO_BUSY_IRQ (1<<14)
>> -/* Controller has unreliable card detection */
>> -#define SDHCI_QUIRK_BROKEN_CARD_DETECTION (1<<15)
>> -/* Controller reports inverted write-protect state */
>> -#define SDHCI_QUIRK_INVERTED_WRITE_PROTECT (1<<16)
>> -/* Controller has nonstandard clock management */
>> -#define SDHCI_QUIRK_NONSTANDARD_CLOCK (1<<17)
>> -/* Controller does not like fast PIO transfers */
>> -#define SDHCI_QUIRK_PIO_NEEDS_DELAY (1<<18)
>> -/* Controller losing signal/interrupt enable states after reset */
>> -#define SDHCI_QUIRK_RESTORE_IRQS_AFTER_RESET (1<<19)
>> -/* Controller has to be forced to use block size of 2048 bytes */
>> -#define SDHCI_QUIRK_FORCE_BLK_SZ_2048 (1<<20)
>> -/* Controller cannot do multi-block transfers */
>> -#define SDHCI_QUIRK_NO_MULTIBLOCK (1<<21)
>> -/* Controller can only handle 1-bit data transfers */
>> -#define SDHCI_QUIRK_FORCE_1_BIT_DATA (1<<22)
>> -/* Controller needs 10ms delay between applying power and clock */
>> -#define SDHCI_QUIRK_DELAY_AFTER_POWER (1<<23)
>> -/* Controller uses SDCLK instead of TMCLK for data timeouts */
>> -#define SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK (1<<24)
>> -/* Controller reports wrong base clock capability */
>> -#define SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN (1<<25)
>> -/* Controller cannot support End Attribute in NOP ADMA descriptor */
>> -#define SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC (1<<26)
>> -/* Controller is missing device caps. Use caps provided by host */
>> -#define SDHCI_QUIRK_MISSING_CAPS (1<<27)
>> -/* Controller uses Auto CMD12 command to stop the transfer */
>> -#define SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12 (1<<28)
>> -/* Controller doesn't have HISPD bit field in HI-SPEED SD card */
>> -#define SDHCI_QUIRK_NO_HISPD_BIT (1<<29)
>> -
>> - int irq; /* Device IRQ */
>> - void __iomem * ioaddr; /* Mapped address */
>> -
>> - const struct sdhci_ops *ops; /* Low level hw interface */
>> -
>> - struct regulator *vmmc; /* Power regulator */
>> -
>> - /* Internal data */
>> - struct mmc_host *mmc; /* MMC structure */
>> - u64 dma_mask; /* custom DMA mask */
>> -
>> -#if defined(CONFIG_LEDS_CLASS) || defined(CONFIG_LEDS_CLASS_MODULE)
>> - struct led_classdev led; /* LED control */
>> - char led_name[32];
>> -#endif
>> -
>> - spinlock_t lock; /* Mutex */
>> -
>> - int flags; /* Host attributes */
>> -#define SDHCI_USE_SDMA (1<<0) /* Host is SDMA capable */
>> -#define SDHCI_USE_ADMA (1<<1) /* Host is ADMA capable */
>> -#define SDHCI_REQ_USE_DMA (1<<2) /* Use DMA for this req. */
>> -#define SDHCI_DEVICE_DEAD (1<<3) /* Device unresponsive */
>> -
>> - unsigned int version; /* SDHCI spec. version */
>> -
>> - unsigned int max_clk; /* Max possible freq (MHz) */
>> - unsigned int timeout_clk; /* Timeout freq (KHz) */
>> -
>> - unsigned int clock; /* Current clock (MHz) */
>> - u8 pwr; /* Current voltage */
>> -
>> - struct mmc_request *mrq; /* Current request */
>> - struct mmc_command *cmd; /* Current command */
>> - struct mmc_data *data; /* Current data request */
>> - unsigned int data_early:1; /* Data finished before cmd */
>> -
>> - struct sg_mapping_iter sg_miter; /* SG state for PIO */
>> - unsigned int blocks; /* remaining PIO blocks */
>> -
>> - int sg_count; /* Mapped sg entries */
>> -
>> - u8 *adma_desc; /* ADMA descriptor table */
>> - u8 *align_buffer; /* Bounce buffer */
>> -
>> - dma_addr_t adma_addr; /* Mapped ADMA descr. table */
>> - dma_addr_t align_addr; /* Mapped bounce buffer */
>> -
>> - struct tasklet_struct card_tasklet; /* Tasklet structures */
>> - struct tasklet_struct finish_tasklet;
>> -
>> - struct timer_list timer; /* Timer for timeouts */
>> -
>> - unsigned int caps; /* Alternative capabilities */
>> -
>> - unsigned long private[0] ____cacheline_aligned;
>> -};
>> -
>> -
>> -struct sdhci_ops {
>> -#ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS
>> - u32 (*read_l)(struct sdhci_host *host, int reg);
>> - u16 (*read_w)(struct sdhci_host *host, int reg);
>> - u8 (*read_b)(struct sdhci_host *host, int reg);
>> - void (*write_l)(struct sdhci_host *host, u32 val, int reg);
>> - void (*write_w)(struct sdhci_host *host, u16 val, int reg);
>> - void (*write_b)(struct sdhci_host *host, u8 val, int reg);
>> -#endif
>> -
>> - void (*set_clock)(struct sdhci_host *host, unsigned int clock);
>> -
>> - int (*enable_dma)(struct sdhci_host *host);
>> - unsigned int (*get_max_clock)(struct sdhci_host *host);
>> - unsigned int (*get_min_clock)(struct sdhci_host *host);
>> - unsigned int (*get_timeout_clock)(struct sdhci_host *host);
>> -};
>> -
>> -#ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS
>> -
>> -static inline void sdhci_writel(struct sdhci_host *host, u32 val, int reg)
>> -{
>> - if (unlikely(host->ops->write_l))
>> - host->ops->write_l(host, val, reg);
>> - else
>> - writel(val, host->ioaddr + reg);
>> -}
>> -
>> -static inline void sdhci_writew(struct sdhci_host *host, u16 val, int reg)
>> -{
>> - if (unlikely(host->ops->write_w))
>> - host->ops->write_w(host, val, reg);
>> - else
>> - writew(val, host->ioaddr + reg);
>> -}
>> -
>> -static inline void sdhci_writeb(struct sdhci_host *host, u8 val, int reg)
>> -{
>> - if (unlikely(host->ops->write_b))
>> - host->ops->write_b(host, val, reg);
>> - else
>> - writeb(val, host->ioaddr + reg);
>> -}
>> -
>> -static inline u32 sdhci_readl(struct sdhci_host *host, int reg)
>> -{
>> - if (unlikely(host->ops->read_l))
>> - return host->ops->read_l(host, reg);
>> - else
>> - return readl(host->ioaddr + reg);
>> -}
>> -
>> -static inline u16 sdhci_readw(struct sdhci_host *host, int reg)
>> -{
>> - if (unlikely(host->ops->read_w))
>> - return host->ops->read_w(host, reg);
>> - else
>> - return readw(host->ioaddr + reg);
>> -}
>> -
>> -static inline u8 sdhci_readb(struct sdhci_host *host, int reg)
>> -{
>> - if (unlikely(host->ops->read_b))
>> - return host->ops->read_b(host, reg);
>> - else
>> - return readb(host->ioaddr + reg);
>> -}
>> -
>> -#else
>> -
>> -static inline void sdhci_writel(struct sdhci_host *host, u32 val, int reg)
>> -{
>> - writel(val, host->ioaddr + reg);
>> -}
>> -
>> -static inline void sdhci_writew(struct sdhci_host *host, u16 val, int reg)
>> -{
>> - writew(val, host->ioaddr + reg);
>> -}
>> -
>> -static inline void sdhci_writeb(struct sdhci_host *host, u8 val, int reg)
>> -{
>> - writeb(val, host->ioaddr + reg);
>> -}
>> -
>> -static inline u32 sdhci_readl(struct sdhci_host *host, int reg)
>> -{
>> - return readl(host->ioaddr + reg);
>> -}
>> -
>> -static inline u16 sdhci_readw(struct sdhci_host *host, int reg)
>> -{
>> - return readw(host->ioaddr + reg);
>> -}
>> -
>> -static inline u8 sdhci_readb(struct sdhci_host *host, int reg)
>> -{
>> - return readb(host->ioaddr + reg);
>> -}
>> -
>> -#endif /* CONFIG_MMC_SDHCI_IO_ACCESSORS */
>> -
>> -extern struct sdhci_host *sdhci_alloc_host(struct device *dev,
>> - size_t priv_size);
>> -extern void sdhci_free_host(struct sdhci_host *host);
>> -
>> -static inline void *sdhci_priv(struct sdhci_host *host)
>> -{
>> - return (void *)host->private;
>> -}
>> -
>> -extern void sdhci_card_detect(struct sdhci_host *host);
>> -extern int sdhci_add_host(struct sdhci_host *host);
>> -extern void sdhci_remove_host(struct sdhci_host *host, int dead);
>> -
>> -#ifdef CONFIG_PM
>> -extern int sdhci_suspend_host(struct sdhci_host *host, pm_message_t state);
>> -extern int sdhci_resume_host(struct sdhci_host *host);
>> -#endif
>> -
>> -#endif /* __SDHCI_H */
>> +#define SDHCI_SPEC_100 0
>> +#define SDHCI_SPEC_200 1
>> +#define SDHCI_SPEC_300 2
>> +
>> +#endif /* __SDHCI_HW_H */
>> diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h
>> new file mode 100644
>> index 0000000..dd4552d
>> --- /dev/null
>> +++ b/include/linux/mmc/sdhci.h
>> @@ -0,0 +1,269 @@
>> +/*
>> + * linux/drivers/mmc/host/sdhci.h - Secure Digital Host Controller Interface
>> + *
>> + * * Private sdhci structure, quirks, callbacks.
>> + *
>> + * Copyright (C) 2005-2008 Pierre Ossman, All Rights Reserved.
>> + *
>> + * This program is free software; you can redistribute it and/or modify
>> + * it under the terms of the GNU General Public License as published by
>> + * the Free Software Foundation; either version 2 of the License, or (at
>> + * your option) any later version.
>> + */
>> +#ifndef __SDHCI_H
>> +#define __SDHCI_H
>> +
>> +#include <linux/scatterlist.h>
>> +#include <linux/compiler.h>
>> +#include <linux/types.h>
>> +#include <linux/io.h>
>> +#include <linux/mmc/host.h>
>> +
>> +struct sdhci_ops;
>> +
>> +struct sdhci_host {
>> + /* Data set by hardware interface driver */
>> + const char *hw_name; /* Hardware bus name */
>> +
>> + unsigned int quirks; /* Deviations from spec. */
>> +
>> +/* Controller doesn't honor resets unless we touch the clock register */
>> +#define SDHCI_QUIRK_CLOCK_BEFORE_RESET (1<<0)
>> +/* Controller has bad caps bits, but really supports DMA */
>> +#define SDHCI_QUIRK_FORCE_DMA (1<<1)
>> +/* Controller doesn't like to be reset when there is no card inserted. */
>> +#define SDHCI_QUIRK_NO_CARD_NO_RESET (1<<2)
>> +/* Controller doesn't like clearing the power reg before a change */
>> +#define SDHCI_QUIRK_SINGLE_POWER_WRITE (1<<3)
>> +/* Controller has flaky internal state so reset it on each ios change */
>> +#define SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS (1<<4)
>> +/* Controller has an unusable DMA engine */
>> +#define SDHCI_QUIRK_BROKEN_DMA (1<<5)
>> +/* Controller has an unusable ADMA engine */
>> +#define SDHCI_QUIRK_BROKEN_ADMA (1<<6)
>> +/* Controller can only DMA from 32-bit aligned addresses */
>> +#define SDHCI_QUIRK_32BIT_DMA_ADDR (1<<7)
>> +/* Controller can only DMA chunk sizes that are a multiple of 32 bits */
>> +#define SDHCI_QUIRK_32BIT_DMA_SIZE (1<<8)
>> +/* Controller can only ADMA chunks that are a multiple of 32 bits */
>> +#define SDHCI_QUIRK_32BIT_ADMA_SIZE (1<<9)
>> +/* Controller needs to be reset after each request to stay stable */
>> +#define SDHCI_QUIRK_RESET_AFTER_REQUEST (1<<10)
>> +/* Controller needs voltage and power writes to happen separately */
>> +#define SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER (1<<11)
>> +/* Controller provides an incorrect timeout value for transfers */
>> +#define SDHCI_QUIRK_BROKEN_TIMEOUT_VAL (1<<12)
>> +/* Controller has an issue with buffer bits for small transfers */
>> +#define SDHCI_QUIRK_BROKEN_SMALL_PIO (1<<13)
>> +/* Controller does not provide transfer-complete interrupt when not busy */
>> +#define SDHCI_QUIRK_NO_BUSY_IRQ (1<<14)
>> +/* Controller has unreliable card detection */
>> +#define SDHCI_QUIRK_BROKEN_CARD_DETECTION (1<<15)
>> +/* Controller reports inverted write-protect state */
>> +#define SDHCI_QUIRK_INVERTED_WRITE_PROTECT (1<<16)
>> +/* Controller has nonstandard clock management */
>> +#define SDHCI_QUIRK_NONSTANDARD_CLOCK (1<<17)
>> +/* Controller does not like fast PIO transfers */
>> +#define SDHCI_QUIRK_PIO_NEEDS_DELAY (1<<18)
>> +/* Controller losing signal/interrupt enable states after reset */
>> +#define SDHCI_QUIRK_RESTORE_IRQS_AFTER_RESET (1<<19)
>> +/* Controller has to be forced to use block size of 2048 bytes */
>> +#define SDHCI_QUIRK_FORCE_BLK_SZ_2048 (1<<20)
>> +/* Controller cannot do multi-block transfers */
>> +#define SDHCI_QUIRK_NO_MULTIBLOCK (1<<21)
>> +/* Controller can only handle 1-bit data transfers */
>> +#define SDHCI_QUIRK_FORCE_1_BIT_DATA (1<<22)
>> +/* Controller needs 10ms delay between applying power and clock */
>> +#define SDHCI_QUIRK_DELAY_AFTER_POWER (1<<23)
>> +/* Controller uses SDCLK instead of TMCLK for data timeouts */
>> +#define SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK (1<<24)
>> +/* Controller reports wrong base clock capability */
>> +#define SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN (1<<25)
>> +/* Controller cannot support End Attribute in NOP ADMA descriptor */
>> +#define SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC (1<<26)
>> +/* Controller is missing device caps. Use caps provided by host */
>> +#define SDHCI_QUIRK_MISSING_CAPS (1<<27)
>> +/* Controller uses Auto CMD12 command to stop the transfer */
>> +#define SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12 (1<<28)
>> +/* Controller doesn't have HISPD bit field in HI-SPEED SD card */
>> +#define SDHCI_QUIRK_NO_HISPD_BIT (1<<29)
>> +
>> + int irq; /* Device IRQ */
>> + void __iomem *ioaddr; /* Mapped address */
>> +
>> + const struct sdhci_ops *ops; /* Low level hw interface */
>> +
>> + struct regulator *vmmc; /* Power regulator */
>> +
>> + /* Internal data */
>> + struct mmc_host *mmc; /* MMC structure */
>> + u64 dma_mask; /* custom DMA mask */
>> +
>> +#if defined(CONFIG_LEDS_CLASS) || defined(CONFIG_LEDS_CLASS_MODULE)
>> + struct led_classdev led; /* LED control */
>> + char led_name[32];
>> +#endif
>> +
>> + spinlock_t lock; /* Mutex */
>> +
>> + int flags; /* Host attributes */
>> +#define SDHCI_USE_SDMA (1<<0) /* Host is SDMA capable */
>> +#define SDHCI_USE_ADMA (1<<1) /* Host is ADMA capable */
>> +#define SDHCI_REQ_USE_DMA (1<<2) /* Use DMA for this req. */
>> +#define SDHCI_DEVICE_DEAD (1<<3) /* Device unresponsive */
>> +
>> + unsigned int version; /* SDHCI spec. version */
>> +
>> + unsigned int max_clk; /* Max possible freq (MHz) */
>> + unsigned int timeout_clk; /* Timeout freq (KHz) */
>> +
>> + unsigned int clock; /* Current clock (MHz) */
>> + u8 pwr; /* Current voltage */
>> +
>> + struct mmc_request *mrq; /* Current request */
>> + struct mmc_command *cmd; /* Current command */
>> + struct mmc_data *data; /* Current data request */
>> + unsigned int data_early:1; /* Data finished before cmd */
>> +
>> + struct sg_mapping_iter sg_miter; /* SG state for PIO */
>> + unsigned int blocks; /* remaining PIO blocks */
>> +
>> + int sg_count; /* Mapped sg entries */
>> +
>> + u8 *adma_desc; /* ADMA descriptor table */
>> + u8 *align_buffer; /* Bounce buffer */
>> +
>> + dma_addr_t adma_addr; /* Mapped ADMA descr. table */
>> + dma_addr_t align_addr; /* Mapped bounce buffer */
>> +
>> + struct tasklet_struct card_tasklet; /* Tasklet structures */
>> + struct tasklet_struct finish_tasklet;
>> +
>> + struct timer_list timer; /* Timer for timeouts */
>> +
>> + unsigned int caps; /* Alternative capabilities */
>> +
>> + unsigned long private[0] ____cacheline_aligned;
>> +};
>> +
>> +struct sdhci_ops {
>> +#ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS
>> + u32(*read_l) (struct sdhci_host *host, int reg);
>> + u16(*read_w) (struct sdhci_host *host, int reg);
>> + u8(*read_b) (struct sdhci_host *host, int reg);
>> + void (*write_l) (struct sdhci_host *host, u32 val, int reg);
>> + void (*write_w) (struct sdhci_host *host, u16 val, int reg);
>> + void (*write_b) (struct sdhci_host *host, u8 val, int reg);
>> +#endif
>> +
>> + void (*set_clock) (struct sdhci_host *host, unsigned int clock);
>> +
>> + int (*enable_dma) (struct sdhci_host *host);
>> + unsigned int (*get_max_clock) (struct sdhci_host *host);
>> + unsigned int (*get_min_clock) (struct sdhci_host *host);
>> + unsigned int (*get_timeout_clock) (struct sdhci_host *host);
>> +};
>> +
>> +#ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS
>> +
>> +static inline void sdhci_writel(struct sdhci_host *host, u32 val, int reg)
>> +{
>> + if (unlikely(host->ops->write_l))
>> + host->ops->write_l(host, val, reg);
>> + else
>> + writel(val, host->ioaddr + reg);
>> +}
>> +
>> +static inline void sdhci_writew(struct sdhci_host *host, u16 val, int reg)
>> +{
>> + if (unlikely(host->ops->write_w))
>> + host->ops->write_w(host, val, reg);
>> + else
>> + writew(val, host->ioaddr + reg);
>> +}
>> +
>> +static inline void sdhci_writeb(struct sdhci_host *host, u8 val, int reg)
>> +{
>> + if (unlikely(host->ops->write_b))
>> + host->ops->write_b(host, val, reg);
>> + else
>> + writeb(val, host->ioaddr + reg);
>> +}
>> +
>> +static inline u32 sdhci_readl(struct sdhci_host *host, int reg)
>> +{
>> + if (unlikely(host->ops->read_l))
>> + return host->ops->read_l(host, reg);
>> + else
>> + return readl(host->ioaddr + reg);
>> +}
>> +
>> +static inline u16 sdhci_readw(struct sdhci_host *host, int reg)
>> +{
>> + if (unlikely(host->ops->read_w))
>> + return host->ops->read_w(host, reg);
>> + else
>> + return readw(host->ioaddr + reg);
>> +}
>> +
>> +static inline u8 sdhci_readb(struct sdhci_host *host, int reg)
>> +{
>> + if (unlikely(host->ops->read_b))
>> + return host->ops->read_b(host, reg);
>> + else
>> + return readb(host->ioaddr + reg);
>> +}
>> +
>> +#else
>> +
>> +static inline void sdhci_writel(struct sdhci_host *host, u32 val, int reg)
>> +{
>> + writel(val, host->ioaddr + reg);
>> +}
>> +
>> +static inline void sdhci_writew(struct sdhci_host *host, u16 val, int reg)
>> +{
>> + writew(val, host->ioaddr + reg);
>> +}
>> +
>> +static inline void sdhci_writeb(struct sdhci_host *host, u8 val, int reg)
>> +{
>> + writeb(val, host->ioaddr + reg);
>> +}
>> +
>> +static inline u32 sdhci_readl(struct sdhci_host *host, int reg)
>> +{
>> + return readl(host->ioaddr + reg);
>> +}
>> +
>> +static inline u16 sdhci_readw(struct sdhci_host *host, int reg)
>> +{
>> + return readw(host->ioaddr + reg);
>> +}
>> +
>> +static inline u8 sdhci_readb(struct sdhci_host *host, int reg)
>> +{
>> + return readb(host->ioaddr + reg);
>> +}
>> +
>> +#endif /* CONFIG_MMC_SDHCI_IO_ACCESSORS */
>> +
>> +extern struct sdhci_host *sdhci_alloc_host(struct device *dev,
>> + size_t priv_size);
>> +extern void sdhci_free_host(struct sdhci_host *host);
>> +
>> +static inline void *sdhci_priv(struct sdhci_host *host)
>> +{
>> + return (void *)host->private;
>> +}
>> +
>> +extern void sdhci_card_detect(struct sdhci_host *host);
>> +extern int sdhci_add_host(struct sdhci_host *host);
>> +extern void sdhci_remove_host(struct sdhci_host *host, int dead);
>> +
>> +#ifdef CONFIG_PM
>> +extern int sdhci_suspend_host(struct sdhci_host *host, pm_message_t state);
>> +extern int sdhci_resume_host(struct sdhci_host *host);
>> +#endif
>> +
>> +#endif /* __SDHCI_H */
>> --
>> 1.5.5.6
>>
>> --
>> 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] 19+ messages in thread
* Re: [PATCH (mmc-next) 1/3] mmc: add suspend/resume in the sdhci-pltfm driver
2010-09-27 10:37 ` Wolfram Sang
@ 2010-09-27 12:57 ` Peppe CAVALLARO
2010-09-27 13:24 ` Peppe CAVALLARO
0 siblings, 1 reply; 19+ messages in thread
From: Peppe CAVALLARO @ 2010-09-27 12:57 UTC (permalink / raw)
To: Wolfram Sang; +Cc: linux-mmc@vger.kernel.org
On 09/27/2010 12:37 PM, Wolfram Sang wrote:
> On Thu, Sep 23, 2010 at 11:14:24AM +0200, Giuseppe CAVALLARO wrote:
>> Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
>
> I'd prefer it the way sdhci-mv.c is doing it (just one #if-block and
> returning the code from the sdhci_*-functions). Then it should be fine.
Okay! I can rework it without any problems.
Peppe
>
>> ---
>> drivers/mmc/host/sdhci-pltfm.c | 22 ++++++++++++++++++++++
>> 1 files changed, 22 insertions(+), 0 deletions(-)
>>
>> diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c
>> index e045e3c..89ea64b 100644
>> --- a/drivers/mmc/host/sdhci-pltfm.c
>> +++ b/drivers/mmc/host/sdhci-pltfm.c
>> @@ -165,6 +165,24 @@ static const struct platform_device_id sdhci_pltfm_ids[] = {
>> };
>> MODULE_DEVICE_TABLE(platform, sdhci_pltfm_ids);
>>
>> +#ifdef CONFIG_PM
>> +static int sdhci_pltfm_suspend(struct platform_device *dev, pm_message_t pm)
>> +{
>> + struct sdhci_host *host = platform_get_drvdata(dev);
>> +
>> + sdhci_suspend_host(host, pm);
>> + return 0;
>> +}
>> +
>> +static int sdhci_pltfm_resume(struct platform_device *dev)
>> +{
>> + struct sdhci_host *host = platform_get_drvdata(dev);
>> +
>> + sdhci_resume_host(host);
>> + return 0;
>> +}
>> +#endif
>> +
>> static struct platform_driver sdhci_pltfm_driver = {
>> .driver = {
>> .name = "sdhci",
>> @@ -173,6 +191,10 @@ static struct platform_driver sdhci_pltfm_driver = {
>> .probe = sdhci_pltfm_probe,
>> .remove = __devexit_p(sdhci_pltfm_remove),
>> .id_table = sdhci_pltfm_ids,
>> +#ifdef CONFIG_PM
>> + .suspend = sdhci_pltfm_suspend,
>> + .resume = sdhci_pltfm_resume,
>> +#endif
>> };
>>
>> /*****************************************************************************\
>> --
>> 1.5.5.6
>>
>> --
>> 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] 19+ messages in thread
* Re: [PATCH (mmc-next) 1/3] mmc: add suspend/resume in the sdhci-pltfm driver
2010-09-27 12:57 ` Peppe CAVALLARO
@ 2010-09-27 13:24 ` Peppe CAVALLARO
2010-09-27 14:15 ` Wolfram Sang
0 siblings, 1 reply; 19+ messages in thread
From: Peppe CAVALLARO @ 2010-09-27 13:24 UTC (permalink / raw)
To: Wolfram Sang; +Cc: linux-mmc@vger.kernel.org
[-- Attachment #1: Type: text/plain, Size: 2575 bytes --]
On 09/27/2010 02:57 PM, Peppe CAVALLARO wrote:
> On 09/27/2010 12:37 PM, Wolfram Sang wrote:
> > On Thu, Sep 23, 2010 at 11:14:24AM +0200, Giuseppe CAVALLARO wrote:
> >> Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
> >
> > I'd prefer it the way sdhci-mv.c is doing it (just one #if-block and
> > returning the code from the sdhci_*-functions). Then it should be fine.
>
> Okay! I can rework it without any problems.
Hi Wolfram
attached the new patch:
Let me know if it's ok.
Best Regards,
Peppe
>
> Peppe
>
> >
> >> ---
> >> drivers/mmc/host/sdhci-pltfm.c | 22 ++++++++++++++++++++++
> >> 1 files changed, 22 insertions(+), 0 deletions(-)
> >>
> >> diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c
> >> index e045e3c..89ea64b 100644
> >> --- a/drivers/mmc/host/sdhci-pltfm.c
> >> +++ b/drivers/mmc/host/sdhci-pltfm.c
> >> @@ -165,6 +165,24 @@ static const struct platform_device_id
> sdhci_pltfm_ids[] = {
> >> };
> >> MODULE_DEVICE_TABLE(platform, sdhci_pltfm_ids);
> >>
> >> +#ifdef CONFIG_PM
> >> +static int sdhci_pltfm_suspend(struct platform_device *dev, pm_message_t pm)
> >> +{
> >> + struct sdhci_host *host = platform_get_drvdata(dev);
> >> +
> >> + sdhci_suspend_host(host, pm);
> >> + return 0;
> >> +}
> >> +
> >> +static int sdhci_pltfm_resume(struct platform_device *dev)
> >> +{
> >> + struct sdhci_host *host = platform_get_drvdata(dev);
> >> +
> >> + sdhci_resume_host(host);
> >> + return 0;
> >> +}
> >> +#endif
> >> +
> >> static struct platform_driver sdhci_pltfm_driver = {
> >> .driver = {
> >> .name = "sdhci",
> >> @@ -173,6 +191,10 @@ static struct platform_driver sdhci_pltfm_driver = {
> >> .probe = sdhci_pltfm_probe,
> >> .remove = __devexit_p(sdhci_pltfm_remove),
> >> .id_table = sdhci_pltfm_ids,
> >> +#ifdef CONFIG_PM
> >> + .suspend = sdhci_pltfm_suspend,
> >> + .resume = sdhci_pltfm_resume,
> >> +#endif
> >> };
> >>
> >> /*****************************************************************************\
> >> --
> >> 1.5.5.6
> >>
> >> --
> >> 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
> >
> --
> 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
>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-mmc-add-suspend-resume-in-the-sdhci-pltfm-driver-V.patch --]
[-- Type: text/x-patch; name="0001-mmc-add-suspend-resume-in-the-sdhci-pltfm-driver-V.patch", Size: 1680 bytes --]
From 847f635d0824c88f6575d86f5e9f50283883cd60 Mon Sep 17 00:00:00 2001
From: Giuseppe Cavallaro <peppe.cavallaro@st.com>
Date: Thu, 23 Sep 2010 10:13:00 +0200
Subject: [PATCH (mmc-next)] mmc: add suspend/resume in the sdhci-pltfm driver (V2)
Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
---
drivers/mmc/host/sdhci-pltfm.c | 23 +++++++++++++++++++++++
1 files changed, 23 insertions(+), 0 deletions(-)
diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c
index e045e3c..c43f954 100644
--- a/drivers/mmc/host/sdhci-pltfm.c
+++ b/drivers/mmc/host/sdhci-pltfm.c
@@ -165,6 +165,27 @@ static const struct platform_device_id sdhci_pltfm_ids[] = {
};
MODULE_DEVICE_TABLE(platform, sdhci_pltfm_ids);
+#ifdef CONFIG_PM
+static int sdhci_pltfm_suspend(struct platform_device *dev, pm_message_t pm)
+{
+ struct sdhci_host *host = platform_get_drvdata(dev);
+
+ sdhci_suspend_host(host, pm);
+ return 0;
+}
+
+static int sdhci_pltfm_resume(struct platform_device *dev)
+{
+ struct sdhci_host *host = platform_get_drvdata(dev);
+
+ sdhci_resume_host(host);
+ return 0;
+}
+#else
+#define sdhci_pltfm_suspend NULL
+#define sdhci_pltfm_resume NULL
+#endif
+
static struct platform_driver sdhci_pltfm_driver = {
.driver = {
.name = "sdhci",
@@ -173,6 +194,8 @@ static struct platform_driver sdhci_pltfm_driver = {
.probe = sdhci_pltfm_probe,
.remove = __devexit_p(sdhci_pltfm_remove),
.id_table = sdhci_pltfm_ids,
+ .suspend = sdhci_pltfm_suspend,
+ .resume = sdhci_pltfm_resume,
};
/*****************************************************************************\
--
1.5.5.6
^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [PATCH (mmc-next) 2/3] mmc: split the sdhci.h to help platforms that uses shdci-pltfm d.d.
2010-09-27 12:57 ` Peppe CAVALLARO
@ 2010-09-27 14:13 ` Wolfram Sang
2010-09-27 14:20 ` Peppe CAVALLARO
0 siblings, 1 reply; 19+ messages in thread
From: Wolfram Sang @ 2010-09-27 14:13 UTC (permalink / raw)
To: Peppe CAVALLARO; +Cc: linux-mmc@vger.kernel.org, Chris Ball
[-- Attachment #1: Type: text/plain, Size: 1918 bytes --]
On Mon, Sep 27, 2010 at 02:57:50PM +0200, Peppe CAVALLARO wrote:
> Hi Wolfram,
>
> On 09/27/2010 12:43 PM, Wolfram Sang wrote:
> > On Thu, Sep 23, 2010 at 11:14:25AM +0200, Giuseppe CAVALLARO wrote:
> >> Some platforms based on the shdci-pltfm device driver need to
> >> set own quirks (that currently are in drivers/mmc/host/sdhci.h).
> >>
> >> This patch splits this header file in two parts:
> >>
> >> o drivers/mmc/host/sdhci.h
> >> it includes the HC registers
> >>
> >> o include/linux/mmc/sdhci.h
> >> it includes the private structures, callbacks, quirks etc.
> >>
> >> So, instead of including the shdci.h from devices/mmc/host, all
> >> the platforms based on shdci-pltfm will be able to only include:
> >> include/linux/mmc/sdhci.h and include/linux/sdhci-pltfm.h.
> >>
> >> This has been tested on STM targets (STx7106, STx7108, STx5206).
> >>
> >> Note: drivers/mmc/host/sdhci.h also includes the linux/mmc/sdhci.h
> >> and no modifications should be needed on other sdhci-<XXX> drivers.
> >>
> >> Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
> >
> > IMO this is too much exporting here. I can't see a reason to export the
> > sdhci_host-structure, for example. My idea would be to start with a
> > minimal approach and just copy over the stuff we need now (the quirks).
> > If we need more later, we add it seperately then.
>
> I had just started doing that but I decided to split the file to solve
> the issue for the .init call (we discussed in the thread
> http://marc.info/?l=linux-mmc&m=128523426925028&w=2).
> Indeed, this approach avoids to add other callbacks and reuses the
> existent code.
OK for the host-struct. What about the io-accessors? Do we really need
them?
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH (mmc-next) 1/3] mmc: add suspend/resume in the sdhci-pltfm driver
2010-09-27 13:24 ` Peppe CAVALLARO
@ 2010-09-27 14:15 ` Wolfram Sang
2010-09-27 14:25 ` Peppe CAVALLARO
0 siblings, 1 reply; 19+ messages in thread
From: Wolfram Sang @ 2010-09-27 14:15 UTC (permalink / raw)
To: Peppe CAVALLARO; +Cc: linux-mmc@vger.kernel.org
[-- Attachment #1: Type: text/plain, Size: 2821 bytes --]
On Mon, Sep 27, 2010 at 03:24:02PM +0200, Peppe CAVALLARO wrote:
> On 09/27/2010 02:57 PM, Peppe CAVALLARO wrote:
> > On 09/27/2010 12:37 PM, Wolfram Sang wrote:
> > > On Thu, Sep 23, 2010 at 11:14:24AM +0200, Giuseppe CAVALLARO wrote:
> > >> Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
> > >
> > > I'd prefer it the way sdhci-mv.c is doing it (just one #if-block and
> > > returning the code from the sdhci_*-functions). Then it should be fine.
> >
> > Okay! I can rework it without any problems.
>
> Hi Wolfram
> attached the new patch:
> Let me know if it's ok.
Better, but you still do not return the retval from the sdhci-functions.
And please annotate the #endif with the define it depends on as a
comment. And wait for more comments and respin the series as a whole,
not every patch independently. That soon gets a mess.
> From 847f635d0824c88f6575d86f5e9f50283883cd60 Mon Sep 17 00:00:00 2001
> From: Giuseppe Cavallaro <peppe.cavallaro@st.com>
> Date: Thu, 23 Sep 2010 10:13:00 +0200
> Subject: [PATCH (mmc-next)] mmc: add suspend/resume in the sdhci-pltfm driver (V2)
>
> Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
> ---
> drivers/mmc/host/sdhci-pltfm.c | 23 +++++++++++++++++++++++
> 1 files changed, 23 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c
> index e045e3c..c43f954 100644
> --- a/drivers/mmc/host/sdhci-pltfm.c
> +++ b/drivers/mmc/host/sdhci-pltfm.c
> @@ -165,6 +165,27 @@ static const struct platform_device_id sdhci_pltfm_ids[] = {
> };
> MODULE_DEVICE_TABLE(platform, sdhci_pltfm_ids);
>
> +#ifdef CONFIG_PM
> +static int sdhci_pltfm_suspend(struct platform_device *dev, pm_message_t pm)
> +{
> + struct sdhci_host *host = platform_get_drvdata(dev);
> +
> + sdhci_suspend_host(host, pm);
> + return 0;
> +}
> +
> +static int sdhci_pltfm_resume(struct platform_device *dev)
> +{
> + struct sdhci_host *host = platform_get_drvdata(dev);
> +
> + sdhci_resume_host(host);
> + return 0;
> +}
> +#else
> +#define sdhci_pltfm_suspend NULL
> +#define sdhci_pltfm_resume NULL
> +#endif
> +
> static struct platform_driver sdhci_pltfm_driver = {
> .driver = {
> .name = "sdhci",
> @@ -173,6 +194,8 @@ static struct platform_driver sdhci_pltfm_driver = {
> .probe = sdhci_pltfm_probe,
> .remove = __devexit_p(sdhci_pltfm_remove),
> .id_table = sdhci_pltfm_ids,
> + .suspend = sdhci_pltfm_suspend,
> + .resume = sdhci_pltfm_resume,
> };
>
> /*****************************************************************************\
> --
> 1.5.5.6
>
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH (mmc-next) 3/3] mmc: fix a warning when compile the sdhci d.d.
2010-09-27 12:57 ` Peppe CAVALLARO
@ 2010-09-27 14:17 ` Wolfram Sang
0 siblings, 0 replies; 19+ messages in thread
From: Wolfram Sang @ 2010-09-27 14:17 UTC (permalink / raw)
To: Peppe CAVALLARO; +Cc: linux-mmc@vger.kernel.org
[-- Attachment #1: Type: text/plain, Size: 625 bytes --]
> > should detect that BUG never returns). The include-removal could be in a
> > seperate patch, not sure if it is worth, though.
>
> It can include in a separate patch.
> It makes sense if apply the previous patch to split the header file
> because we remove duplicated include files.
I understand, but I am still sceptical. If the source file itself uses
something from the h-file, it should include it IMHO. Don't know if it
is common sense this way.
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH (mmc-next) 2/3] mmc: split the sdhci.h to help platforms that uses shdci-pltfm d.d.
2010-09-27 14:13 ` Wolfram Sang
@ 2010-09-27 14:20 ` Peppe CAVALLARO
2010-09-27 14:30 ` Wolfram Sang
0 siblings, 1 reply; 19+ messages in thread
From: Peppe CAVALLARO @ 2010-09-27 14:20 UTC (permalink / raw)
To: Wolfram Sang; +Cc: linux-mmc@vger.kernel.org, Chris Ball
On 09/27/2010 04:13 PM, Wolfram Sang wrote:
> On Mon, Sep 27, 2010 at 02:57:50PM +0200, Peppe CAVALLARO wrote:
> OK for the host-struct. What about the io-accessors? Do we really need
> them?
Hi Wolfram.
Hmm, it's not necessary to move them, indeed.
They can stay in the original header if you prefer.
No issues on my side at all.
Let me know so I'll rework the patch and send it again.
Regards,
Peppe
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH (mmc-next) 1/3] mmc: add suspend/resume in the sdhci-pltfm driver
2010-09-27 14:15 ` Wolfram Sang
@ 2010-09-27 14:25 ` Peppe CAVALLARO
0 siblings, 0 replies; 19+ messages in thread
From: Peppe CAVALLARO @ 2010-09-27 14:25 UTC (permalink / raw)
To: Wolfram Sang; +Cc: linux-mmc@vger.kernel.org
On 09/27/2010 04:15 PM, Wolfram Sang wrote:
>
> Better, but you still do not return the retval from the sdhci-functions.
> And please annotate the #endif with the define it depends on as a
> comment. And wait for more comments and respin the series as a whole,
> not every patch independently. That soon gets a mess.
Hi Wolfram,
Thanks for reviewing it. I'll modify the patch and send it again to you.
Regards,
Peppe
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH (mmc-next) 2/3] mmc: split the sdhci.h to help platforms that uses shdci-pltfm d.d.
2010-09-27 14:20 ` Peppe CAVALLARO
@ 2010-09-27 14:30 ` Wolfram Sang
0 siblings, 0 replies; 19+ messages in thread
From: Wolfram Sang @ 2010-09-27 14:30 UTC (permalink / raw)
To: Peppe CAVALLARO; +Cc: linux-mmc@vger.kernel.org, Chris Ball
[-- Attachment #1: Type: text/plain, Size: 397 bytes --]
> Hmm, it's not necessary to move them, indeed.
> They can stay in the original header if you prefer.
> No issues on my side at all.
> Let me know so I'll rework the patch and send it again.
You should know that yourself by now ;)
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply [flat|nested] 19+ messages in thread
end of thread, other threads:[~2010-09-27 14:30 UTC | newest]
Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-09-23 9:14 [PATCH (mmc-next) 1/3] mmc: add suspend/resume in the sdhci-pltfm driver Giuseppe CAVALLARO
2010-09-23 9:14 ` [PATCH (mmc-next) 2/3] mmc: split the sdhci.h to help platforms that uses shdci-pltfm d.d Giuseppe CAVALLARO
2010-09-23 9:14 ` [PATCH (mmc-next) 3/3] mmc: fix a warning when compile the sdhci d.d Giuseppe CAVALLARO
2010-09-27 10:54 ` Wolfram Sang
2010-09-27 12:57 ` Peppe CAVALLARO
2010-09-27 14:17 ` Wolfram Sang
2010-09-27 10:43 ` [PATCH (mmc-next) 2/3] mmc: split the sdhci.h to help platforms that uses shdci-pltfm d.d Wolfram Sang
2010-09-27 12:57 ` Peppe CAVALLARO
2010-09-27 14:13 ` Wolfram Sang
2010-09-27 14:20 ` Peppe CAVALLARO
2010-09-27 14:30 ` Wolfram Sang
2010-09-24 5:54 ` [PATCH (mmc-next) 1/3] mmc: add suspend/resume in the sdhci-pltfm driver Peppe CAVALLARO
2010-09-24 9:04 ` Wolfram Sang
2010-09-24 9:49 ` Peppe CAVALLARO
2010-09-27 10:37 ` Wolfram Sang
2010-09-27 12:57 ` Peppe CAVALLARO
2010-09-27 13:24 ` Peppe CAVALLARO
2010-09-27 14:15 ` Wolfram Sang
2010-09-27 14:25 ` Peppe CAVALLARO
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox