* [PATCH v4 1/4] omap4 hsmmc: Adding card detect support for MMC1
@ 2010-09-24 17:13 kishore kadiyala
2010-09-25 0:38 ` Tony Lindgren
` (2 more replies)
0 siblings, 3 replies; 14+ messages in thread
From: kishore kadiyala @ 2010-09-24 17:13 UTC (permalink / raw)
To: linux-arm-kernel
Adding card detect callback function and card detect configuration
function for MMC1 Controller on OMAP4.
Card detect configuration function does initial configuration of the
MMC Control & PullUp-PullDown registers of Phoenix.
For MMC1 Controller, card detect interrupt source is
twl6030 which is non-gpio. The card detect call back function provides
card present/absent status by reading MMC Control register present
on twl6030.
Since OMAP4 doesn't use any GPIO line as used in OMAP3 for card detect,
the suspend/resume initialization which was done in omap_hsmmc_gpio_init
previously is moved to the probe thus making it generic for both OMAP3 & OMAP4.
Cc: Tony Lindgren <tony@atomide.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Madhusudhan Chikkature <madhu.cr@ti.com>
Cc: Adrian Hunter <adrian.hunter@nokia.com>
Signed-off-by: Kishore Kadiyala <kishore.kadiyala@ti.com>
---
arch/arm/mach-omap2/board-4430sdp.c | 7 +++-
drivers/mfd/twl6030-irq.c | 73 +++++++++++++++++++++++++++++++++++
drivers/mmc/host/omap_hsmmc.c | 4 +-
include/linux/i2c/twl.h | 31 +++++++++++++++
4 files changed, 112 insertions(+), 3 deletions(-)
diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c
index 9447644..a49f285 100644
--- a/arch/arm/mach-omap2/board-4430sdp.c
+++ b/arch/arm/mach-omap2/board-4430sdp.c
@@ -227,9 +227,14 @@ static int omap4_twl6030_hsmmc_late_init(struct device *dev)
struct omap_mmc_platform_data *pdata = dev->platform_data;
/* Setting MMC1 Card detect Irq */
- if (pdev->id == 0)
+ if (pdev->id == 0) {
+ ret = twl6030_mmc_card_detect_config();
+ if (ret)
+ pr_err("Failed configuring MMC1 card detect\n");
pdata->slots[0].card_detect_irq = TWL6030_IRQ_BASE +
MMCDETECT_INTR_OFFSET;
+ pdata->slots[0].card_detect = twl6030_mmc_card_detect;
+ }
return ret;
}
diff --git a/drivers/mfd/twl6030-irq.c b/drivers/mfd/twl6030-irq.c
index 10bf228..2d3bb82 100644
--- a/drivers/mfd/twl6030-irq.c
+++ b/drivers/mfd/twl6030-irq.c
@@ -36,6 +36,7 @@
#include <linux/irq.h>
#include <linux/kthread.h>
#include <linux/i2c/twl.h>
+#include <linux/platform_device.h>
/*
* TWL6030 (unlike its predecessors, which had two level interrupt handling)
@@ -223,6 +224,78 @@ int twl6030_interrupt_mask(u8 bit_mask, u8 offset)
}
EXPORT_SYMBOL(twl6030_interrupt_mask);
+int twl6030_mmc_card_detect_config(void)
+{
+ int ret;
+ u8 reg_val = 0;
+
+ /* Unmasking the Card detect Interrupt line for MMC1 from Phoenix */
+ twl6030_interrupt_unmask(TWL6030_MMCDETECT_INT_MASK,
+ REG_INT_MSK_LINE_B);
+ twl6030_interrupt_unmask(TWL6030_MMCDETECT_INT_MASK,
+ REG_INT_MSK_STS_B);
+ /*
+ * Intially Configuring MMC_CTRL for receving interrupts &
+ * Card status on TWL6030 for MMC1
+ */
+ ret = twl_i2c_read_u8(TWL6030_MODULE_ID0, ®_val, TWL6030_MMCCTRL);
+ if (ret < 0) {
+ pr_err("twl6030: Failed to read MMCCTRL, error %d\n", ret);
+ return ret;
+ }
+ reg_val &= ~VMMC_AUTO_OFF;
+ reg_val |= SW_FC;
+ ret = twl_i2c_write_u8(TWL6030_MODULE_ID0, reg_val, TWL6030_MMCCTRL);
+ if (ret < 0) {
+ pr_err("twl6030: Failed to write MMCCTRL, error %d\n", ret);
+ return ret;
+ }
+
+ /* Configuring PullUp-PullDown register */
+ ret = twl_i2c_read_u8(TWL6030_MODULE_ID0, ®_val,
+ TWL6030_CFG_INPUT_PUPD3);
+ if (ret < 0) {
+ pr_err("twl6030: Failed to read CFG_INPUT_PUPD3, error %d\n",
+ ret);
+ return ret;
+ }
+ reg_val &= ~(MMC_PU | MMC_PD);
+ ret = twl_i2c_write_u8(TWL6030_MODULE_ID0, reg_val,
+ TWL6030_CFG_INPUT_PUPD3);
+ if (ret < 0) {
+ pr_err("twl6030: Failed to write CFG_INPUT_PUPD3, error %d\n",
+ ret);
+ return ret;
+ }
+ return 0;
+}
+EXPORT_SYMBOL(twl6030_mmc_card_detect_config);
+
+int twl6030_mmc_card_detect(struct device *dev, int slot)
+{
+ int ret = -EIO;
+ u8 read_reg = 0;
+ struct platform_device *pdev = to_platform_device(dev);
+
+ if (pdev->id) {
+ /* TWL6030 provide's Card detect support for
+ * only MMC1 controller.
+ */
+ pr_err("Unkown MMC controller %d in %s\n", pdev->id, __func__);
+ return ret;
+ }
+ /*
+ * BIT0 of MMC_CTRL on TWL6030 provides card status for MMC1
+ * 0 - Card not present ,1 - Card present
+ */
+ ret = twl_i2c_read_u8(TWL6030_MODULE_ID0, &read_reg,
+ TWL6030_MMCCTRL);
+ if (ret >= 0)
+ ret = read_reg & STS_MMC;
+ return ret;
+}
+EXPORT_SYMBOL(twl6030_mmc_card_detect);
+
int twl6030_init_irq(int irq_num, unsigned irq_base, unsigned irq_end)
{
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 562dbbb..a51894d 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -466,8 +466,6 @@ static int omap_hsmmc_gpio_init(struct omap_mmc_platform_data *pdata)
int ret;
if (gpio_is_valid(pdata->slots[0].switch_pin)) {
- pdata->suspend = omap_hsmmc_suspend_cdirq;
- pdata->resume = omap_hsmmc_resume_cdirq;
if (pdata->slots[0].cover)
pdata->slots[0].get_cover_state =
omap_hsmmc_get_cover_state;
@@ -2211,6 +2209,8 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev)
"Unable to grab MMC CD IRQ\n");
goto err_irq_cd;
}
+ pdata->suspend = omap_hsmmc_suspend_cdirq;
+ pdata->resume = omap_hsmmc_resume_cdirq;
}
omap_hsmmc_disable_irq(host);
diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h
index 6de90bf..e64894c 100644
--- a/include/linux/i2c/twl.h
+++ b/include/linux/i2c/twl.h
@@ -141,6 +141,16 @@
#define TWL6030_CHARGER_CTRL_INT_MASK 0x10
#define TWL6030_CHARGER_FAULT_INT_MASK 0x60
+#define TWL6030_MMCCTRL 0xEE
+#define VMMC_AUTO_OFF (0x1 << 3)
+#define SW_FC (0x1 << 2)
+#define STS_MMC 0x1
+
+#define TWL6030_CFG_INPUT_PUPD3 0xF2
+#define MMC_PU (0x1 << 3)
+#define MMC_PD (0x1 << 2)
+
+
#define TWL4030_CLASS_ID 0x4030
#define TWL6030_CLASS_ID 0x6030
@@ -173,6 +183,27 @@ int twl_i2c_read(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes);
int twl6030_interrupt_unmask(u8 bit_mask, u8 offset);
int twl6030_interrupt_mask(u8 bit_mask, u8 offset);
+/* Card detect Configuration for MMC1 Controller on OMAP4 */
+#ifdef CONFIG_TWL4030_CORE
+int twl6030_mmc_card_detect_config(void);
+#else
+static inline int twl6030_mmc_card_detect_config(void)
+{
+ pr_debug("twl6030_mmc_card_detect_config not supported\n");
+ return 0;
+}
+#endif
+
+/* MMC1 Controller on OMAP4 uses Phoenix irq for Card detect */
+#ifdef CONFIG_TWL4030_CORE
+int twl6030_mmc_card_detect(struct device *dev, int slot);
+#else
+static inline int twl6030_mmc_card_detect(struct device *dev, int slot)
+{
+ pr_debug("Call back twl6030_mmc_card_detect not supported\n");
+ return -EIO;
+}
+#endif
/*----------------------------------------------------------------------*/
/*
--
1.7.0.4
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH v4 1/4] omap4 hsmmc: Adding card detect support for MMC1 2010-09-24 17:13 [PATCH v4 1/4] omap4 hsmmc: Adding card detect support for MMC1 kishore kadiyala @ 2010-09-25 0:38 ` Tony Lindgren 2010-09-27 7:52 ` kishore kadiyala 2010-09-27 7:55 ` kishore kadiyala 2010-10-01 14:46 ` Varadarajan, Charulatha 2 siblings, 1 reply; 14+ messages in thread From: Tony Lindgren @ 2010-09-25 0:38 UTC (permalink / raw) To: linux-arm-kernel * kishore kadiyala <kishore.kadiyala@ti.com> [100924 10:05]: > Adding card detect callback function and card detect configuration > function for MMC1 Controller on OMAP4. > > Card detect configuration function does initial configuration of the > MMC Control & PullUp-PullDown registers of Phoenix. > > For MMC1 Controller, card detect interrupt source is > twl6030 which is non-gpio. The card detect call back function provides > card present/absent status by reading MMC Control register present > on twl6030. > > Since OMAP4 doesn't use any GPIO line as used in OMAP3 for card detect, > the suspend/resume initialization which was done in omap_hsmmc_gpio_init > previously is moved to the probe thus making it generic for both OMAP3 & OMAP4. > --- a/drivers/mfd/twl6030-irq.c > +++ b/drivers/mfd/twl6030-irq.c Looks like this patch should be sent to Samuel Ortiz as it's mostly mfd related. Tony ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v4 1/4] omap4 hsmmc: Adding card detect support for MMC1 2010-09-25 0:38 ` Tony Lindgren @ 2010-09-27 7:52 ` kishore kadiyala 0 siblings, 0 replies; 14+ messages in thread From: kishore kadiyala @ 2010-09-27 7:52 UTC (permalink / raw) To: linux-arm-kernel Hi Tony, On Sat, Sep 25, 2010 at 6:08 AM, Tony Lindgren <tony@atomide.com> wrote: > * kishore kadiyala <kishore.kadiyala@ti.com> [100924 10:05]: >> Adding card detect callback function and card detect configuration >> function for MMC1 Controller on OMAP4. >> >> Card detect configuration function does initial configuration of the >> MMC Control & PullUp-PullDown registers of Phoenix. >> >> For MMC1 Controller, card detect interrupt source is >> twl6030 which is non-gpio. The card detect call back function provides >> card present/absent status by reading MMC Control register present >> on twl6030. >> >> Since OMAP4 doesn't use any GPIO line as used in OMAP3 for card detect, >> the suspend/resume initialization which was done in omap_hsmmc_gpio_init >> previously is moved to the probe thus making it generic for both OMAP3 & OMAP4. > >> --- a/drivers/mfd/twl6030-irq.c >> +++ b/drivers/mfd/twl6030-irq.c > > Looks like this patch should be sent to Samuel Ortiz as it's mostly > mfd related. Thanks , I will send this patch to Samuel. <snip> Regards, Kishore ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v4 1/4] omap4 hsmmc: Adding card detect support for MMC1 2010-09-24 17:13 [PATCH v4 1/4] omap4 hsmmc: Adding card detect support for MMC1 kishore kadiyala 2010-09-25 0:38 ` Tony Lindgren @ 2010-09-27 7:55 ` kishore kadiyala 2010-09-28 6:52 ` kishore kadiyala 2010-10-01 14:46 ` Varadarajan, Charulatha 2 siblings, 1 reply; 14+ messages in thread From: kishore kadiyala @ 2010-09-27 7:55 UTC (permalink / raw) To: linux-arm-kernel Cc: Samuel Ortiz <sameo@linux.intel.com> On Fri, Sep 24, 2010 at 10:43 PM, kishore kadiyala <kishore.kadiyala@ti.com> wrote: > Adding card detect callback function and card detect configuration > function for MMC1 Controller on OMAP4. > > Card detect configuration function does initial configuration of the > MMC Control & PullUp-PullDown registers of Phoenix. > > For MMC1 Controller, card detect interrupt source is > twl6030 which is non-gpio. The card detect call back function provides > card present/absent status by reading MMC Control register present > on twl6030. > > Since OMAP4 doesn't use any GPIO line as used in OMAP3 for card detect, > the suspend/resume initialization which was done in omap_hsmmc_gpio_init > previously is moved to the probe thus making it generic for both OMAP3 & OMAP4. > > Cc: Tony Lindgren <tony@atomide.com> > Cc: Andrew Morton <akpm@linux-foundation.org> > Cc: Madhusudhan Chikkature <madhu.cr@ti.com> > Cc: Adrian Hunter <adrian.hunter@nokia.com> > Signed-off-by: Kishore Kadiyala <kishore.kadiyala@ti.com> > --- > ?arch/arm/mach-omap2/board-4430sdp.c | ? ?7 +++- > ?drivers/mfd/twl6030-irq.c ? ? ? ? ? | ? 73 +++++++++++++++++++++++++++++++++++ > ?drivers/mmc/host/omap_hsmmc.c ? ? ? | ? ?4 +- > ?include/linux/i2c/twl.h ? ? ? ? ? ? | ? 31 +++++++++++++++ > ?4 files changed, 112 insertions(+), 3 deletions(-) > > diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c > index 9447644..a49f285 100644 > --- a/arch/arm/mach-omap2/board-4430sdp.c > +++ b/arch/arm/mach-omap2/board-4430sdp.c > @@ -227,9 +227,14 @@ static int omap4_twl6030_hsmmc_late_init(struct device *dev) > ? ? ? ?struct omap_mmc_platform_data *pdata = dev->platform_data; > > ? ? ? ?/* Setting MMC1 Card detect Irq */ > - ? ? ? if (pdev->id == 0) > + ? ? ? if (pdev->id == 0) { > + ? ? ? ? ? ? ? ret = twl6030_mmc_card_detect_config(); > + ? ? ? ? ? ? ? if (ret) > + ? ? ? ? ? ? ? ? ? ? ? pr_err("Failed configuring MMC1 card detect\n"); > ? ? ? ? ? ? ? ?pdata->slots[0].card_detect_irq = TWL6030_IRQ_BASE + > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?MMCDETECT_INTR_OFFSET; > + ? ? ? ? ? ? ? pdata->slots[0].card_detect = twl6030_mmc_card_detect; > + ? ? ? } > ? ? ? ?return ret; > ?} > > diff --git a/drivers/mfd/twl6030-irq.c b/drivers/mfd/twl6030-irq.c > index 10bf228..2d3bb82 100644 > --- a/drivers/mfd/twl6030-irq.c > +++ b/drivers/mfd/twl6030-irq.c > @@ -36,6 +36,7 @@ > ?#include <linux/irq.h> > ?#include <linux/kthread.h> > ?#include <linux/i2c/twl.h> > +#include <linux/platform_device.h> > > ?/* > ?* TWL6030 (unlike its predecessors, which had two level interrupt handling) > @@ -223,6 +224,78 @@ int twl6030_interrupt_mask(u8 bit_mask, u8 offset) > ?} > ?EXPORT_SYMBOL(twl6030_interrupt_mask); > > +int twl6030_mmc_card_detect_config(void) > +{ > + ? ? ? int ret; > + ? ? ? u8 reg_val = 0; > + > + ? ? ? /* Unmasking the Card detect Interrupt line for MMC1 from Phoenix */ > + ? ? ? twl6030_interrupt_unmask(TWL6030_MMCDETECT_INT_MASK, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? REG_INT_MSK_LINE_B); > + ? ? ? twl6030_interrupt_unmask(TWL6030_MMCDETECT_INT_MASK, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? REG_INT_MSK_STS_B); > + ? ? ? /* > + ? ? ? ?* Intially Configuring MMC_CTRL for receving interrupts & > + ? ? ? ?* Card status on TWL6030 for MMC1 > + ? ? ? ?*/ > + ? ? ? ret = twl_i2c_read_u8(TWL6030_MODULE_ID0, ®_val, TWL6030_MMCCTRL); > + ? ? ? if (ret < 0) { > + ? ? ? ? ? ? ? pr_err("twl6030: Failed to read MMCCTRL, error %d\n", ret); > + ? ? ? ? ? ? ? return ret; > + ? ? ? } > + ? ? ? reg_val &= ~VMMC_AUTO_OFF; > + ? ? ? reg_val |= SW_FC; > + ? ? ? ret = twl_i2c_write_u8(TWL6030_MODULE_ID0, reg_val, TWL6030_MMCCTRL); > + ? ? ? if (ret < 0) { > + ? ? ? ? ? ? ? pr_err("twl6030: Failed to write MMCCTRL, error %d\n", ret); > + ? ? ? ? ? ? ? return ret; > + ? ? ? } > + > + ? ? ? /* Configuring PullUp-PullDown register */ > + ? ? ? ret = twl_i2c_read_u8(TWL6030_MODULE_ID0, ®_val, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TWL6030_CFG_INPUT_PUPD3); > + ? ? ? if (ret < 0) { > + ? ? ? ? ? ? ? pr_err("twl6030: Failed to read CFG_INPUT_PUPD3, error %d\n", > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ret); > + ? ? ? ? ? ? ? return ret; > + ? ? ? } > + ? ? ? reg_val &= ~(MMC_PU | MMC_PD); > + ? ? ? ret = twl_i2c_write_u8(TWL6030_MODULE_ID0, reg_val, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TWL6030_CFG_INPUT_PUPD3); > + ? ? ? if (ret < 0) { > + ? ? ? ? ? ? ? pr_err("twl6030: Failed to write CFG_INPUT_PUPD3, error %d\n", > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ret); > + ? ? ? ? ? ? ? return ret; > + ? ? ? } > + ? ? ? return 0; > +} > +EXPORT_SYMBOL(twl6030_mmc_card_detect_config); > + > +int twl6030_mmc_card_detect(struct device *dev, int slot) > +{ > + ? ? ? int ret = -EIO; > + ? ? ? u8 read_reg = 0; > + ? ? ? struct platform_device *pdev = to_platform_device(dev); > + > + ? ? ? if (pdev->id) { > + ? ? ? ? ? ? ? /* TWL6030 provide's Card detect support for > + ? ? ? ? ? ? ? ?* only MMC1 controller. > + ? ? ? ? ? ? ? ?*/ > + ? ? ? ? ? ? ? pr_err("Unkown MMC controller %d in %s\n", pdev->id, __func__); > + ? ? ? ? ? ? ? return ret; > + ? ? ? } > + ? ? ? /* > + ? ? ? ?* BIT0 of MMC_CTRL on TWL6030 provides card status for MMC1 > + ? ? ? ?* 0 - Card not present ,1 - Card present > + ? ? ? ?*/ > + ? ? ? ret = twl_i2c_read_u8(TWL6030_MODULE_ID0, &read_reg, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TWL6030_MMCCTRL); > + ? ? ? if (ret >= 0) > + ? ? ? ? ? ? ? ret = read_reg & STS_MMC; > + ? ? ? return ret; > +} > +EXPORT_SYMBOL(twl6030_mmc_card_detect); > + > ?int twl6030_init_irq(int irq_num, unsigned irq_base, unsigned irq_end) > ?{ > > diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c > index 562dbbb..a51894d 100644 > --- a/drivers/mmc/host/omap_hsmmc.c > +++ b/drivers/mmc/host/omap_hsmmc.c > @@ -466,8 +466,6 @@ static int omap_hsmmc_gpio_init(struct omap_mmc_platform_data *pdata) > ? ? ? ?int ret; > > ? ? ? ?if (gpio_is_valid(pdata->slots[0].switch_pin)) { > - ? ? ? ? ? ? ? pdata->suspend = omap_hsmmc_suspend_cdirq; > - ? ? ? ? ? ? ? pdata->resume = omap_hsmmc_resume_cdirq; > ? ? ? ? ? ? ? ?if (pdata->slots[0].cover) > ? ? ? ? ? ? ? ? ? ? ? ?pdata->slots[0].get_cover_state = > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?omap_hsmmc_get_cover_state; > @@ -2211,6 +2209,8 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev) > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"Unable to grab MMC CD IRQ\n"); > ? ? ? ? ? ? ? ? ? ? ? ?goto err_irq_cd; > ? ? ? ? ? ? ? ?} > + ? ? ? ? ? ? ? pdata->suspend = omap_hsmmc_suspend_cdirq; > + ? ? ? ? ? ? ? pdata->resume = omap_hsmmc_resume_cdirq; > ? ? ? ?} > > ? ? ? ?omap_hsmmc_disable_irq(host); > diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h > index 6de90bf..e64894c 100644 > --- a/include/linux/i2c/twl.h > +++ b/include/linux/i2c/twl.h > @@ -141,6 +141,16 @@ > ?#define TWL6030_CHARGER_CTRL_INT_MASK ?0x10 > ?#define TWL6030_CHARGER_FAULT_INT_MASK ? ? ? ? 0x60 > > +#define TWL6030_MMCCTRL ? ? ? ? ? ? ? ?0xEE > +#define VMMC_AUTO_OFF ? ? ? ? ? ? ? ? ?(0x1 << 3) > +#define SW_FC ? ? ? ? ? ? ? ? ? ? ? ? ?(0x1 << 2) > +#define STS_MMC ? ? ? ? ? ? ? ? ? ? ? ?0x1 > + > +#define TWL6030_CFG_INPUT_PUPD3 ? ? ? ?0xF2 > +#define MMC_PU ? ? ? ? ? ? ? ? ? ? ? ? (0x1 << 3) > +#define MMC_PD ? ? ? ? ? ? ? ? ? ? ? ? (0x1 << 2) > + > + > > ?#define TWL4030_CLASS_ID ? ? ? ? ? ? ? 0x4030 > ?#define TWL6030_CLASS_ID ? ? ? ? ? ? ? 0x6030 > @@ -173,6 +183,27 @@ int twl_i2c_read(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes); > ?int twl6030_interrupt_unmask(u8 bit_mask, u8 offset); > ?int twl6030_interrupt_mask(u8 bit_mask, u8 offset); > > +/* Card detect Configuration for MMC1 Controller on OMAP4 */ > +#ifdef CONFIG_TWL4030_CORE > +int twl6030_mmc_card_detect_config(void); > +#else > +static inline int twl6030_mmc_card_detect_config(void) > +{ > + ? ? ? pr_debug("twl6030_mmc_card_detect_config not supported\n"); > + ? ? ? return 0; > +} > +#endif > + > +/* MMC1 Controller on OMAP4 uses Phoenix irq for Card detect */ > +#ifdef CONFIG_TWL4030_CORE > +int twl6030_mmc_card_detect(struct device *dev, int slot); > +#else > +static inline int twl6030_mmc_card_detect(struct device *dev, int slot) > +{ > + ? ? ? pr_debug("Call back twl6030_mmc_card_detect not supported\n"); > + ? ? ? return -EIO; > +} > +#endif > ?/*----------------------------------------------------------------------*/ > > ?/* > -- > 1.7.0.4 > > > -- > To unsubscribe from this list: send the line "unsubscribe linux-mmc" in > the body of a message to majordomo at vger.kernel.org > More majordomo info at ?http://vger.kernel.org/majordomo-info.html > ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v4 1/4] omap4 hsmmc: Adding card detect support for MMC1 2010-09-27 7:55 ` kishore kadiyala @ 2010-09-28 6:52 ` kishore kadiyala 2010-09-29 10:41 ` kishore kadiyala 0 siblings, 1 reply; 14+ messages in thread From: kishore kadiyala @ 2010-09-28 6:52 UTC (permalink / raw) To: linux-arm-kernel Hi Samuel, Could you please review this patch which touches mfd/twl6030-irq.c for card detect support of MMC1 controller on OMAP4. Regards, Kishore On Mon, Sep 27, 2010 at 1:25 PM, kishore kadiyala <kishorek.kadiyala@gmail.com> wrote: > Cc: Samuel Ortiz <sameo@linux.intel.com> > > On Fri, Sep 24, 2010 at 10:43 PM, kishore kadiyala > <kishore.kadiyala@ti.com> wrote: >> Adding card detect callback function and card detect configuration >> function for MMC1 Controller on OMAP4. >> >> Card detect configuration function does initial configuration of the >> MMC Control & PullUp-PullDown registers of Phoenix. >> >> For MMC1 Controller, card detect interrupt source is >> twl6030 which is non-gpio. The card detect call back function provides >> card present/absent status by reading MMC Control register present >> on twl6030. >> >> Since OMAP4 doesn't use any GPIO line as used in OMAP3 for card detect, >> the suspend/resume initialization which was done in omap_hsmmc_gpio_init >> previously is moved to the probe thus making it generic for both OMAP3 & OMAP4. >> >> Cc: Tony Lindgren <tony@atomide.com> >> Cc: Andrew Morton <akpm@linux-foundation.org> >> Cc: Madhusudhan Chikkature <madhu.cr@ti.com> >> Cc: Adrian Hunter <adrian.hunter@nokia.com> >> Signed-off-by: Kishore Kadiyala <kishore.kadiyala@ti.com> >> --- >> ?arch/arm/mach-omap2/board-4430sdp.c | ? ?7 +++- >> ?drivers/mfd/twl6030-irq.c ? ? ? ? ? | ? 73 +++++++++++++++++++++++++++++++++++ >> ?drivers/mmc/host/omap_hsmmc.c ? ? ? | ? ?4 +- >> ?include/linux/i2c/twl.h ? ? ? ? ? ? | ? 31 +++++++++++++++ >> ?4 files changed, 112 insertions(+), 3 deletions(-) >> >> diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c >> index 9447644..a49f285 100644 >> --- a/arch/arm/mach-omap2/board-4430sdp.c >> +++ b/arch/arm/mach-omap2/board-4430sdp.c >> @@ -227,9 +227,14 @@ static int omap4_twl6030_hsmmc_late_init(struct device *dev) >> ? ? ? ?struct omap_mmc_platform_data *pdata = dev->platform_data; >> >> ? ? ? ?/* Setting MMC1 Card detect Irq */ >> - ? ? ? if (pdev->id == 0) >> + ? ? ? if (pdev->id == 0) { >> + ? ? ? ? ? ? ? ret = twl6030_mmc_card_detect_config(); >> + ? ? ? ? ? ? ? if (ret) >> + ? ? ? ? ? ? ? ? ? ? ? pr_err("Failed configuring MMC1 card detect\n"); >> ? ? ? ? ? ? ? ?pdata->slots[0].card_detect_irq = TWL6030_IRQ_BASE + >> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?MMCDETECT_INTR_OFFSET; >> + ? ? ? ? ? ? ? pdata->slots[0].card_detect = twl6030_mmc_card_detect; >> + ? ? ? } >> ? ? ? ?return ret; >> ?} >> >> diff --git a/drivers/mfd/twl6030-irq.c b/drivers/mfd/twl6030-irq.c >> index 10bf228..2d3bb82 100644 >> --- a/drivers/mfd/twl6030-irq.c >> +++ b/drivers/mfd/twl6030-irq.c >> @@ -36,6 +36,7 @@ >> ?#include <linux/irq.h> >> ?#include <linux/kthread.h> >> ?#include <linux/i2c/twl.h> >> +#include <linux/platform_device.h> >> >> ?/* >> ?* TWL6030 (unlike its predecessors, which had two level interrupt handling) >> @@ -223,6 +224,78 @@ int twl6030_interrupt_mask(u8 bit_mask, u8 offset) >> ?} >> ?EXPORT_SYMBOL(twl6030_interrupt_mask); >> >> +int twl6030_mmc_card_detect_config(void) >> +{ >> + ? ? ? int ret; >> + ? ? ? u8 reg_val = 0; >> + >> + ? ? ? /* Unmasking the Card detect Interrupt line for MMC1 from Phoenix */ >> + ? ? ? twl6030_interrupt_unmask(TWL6030_MMCDETECT_INT_MASK, >> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? REG_INT_MSK_LINE_B); >> + ? ? ? twl6030_interrupt_unmask(TWL6030_MMCDETECT_INT_MASK, >> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? REG_INT_MSK_STS_B); >> + ? ? ? /* >> + ? ? ? ?* Intially Configuring MMC_CTRL for receving interrupts & >> + ? ? ? ?* Card status on TWL6030 for MMC1 >> + ? ? ? ?*/ >> + ? ? ? ret = twl_i2c_read_u8(TWL6030_MODULE_ID0, ®_val, TWL6030_MMCCTRL); >> + ? ? ? if (ret < 0) { >> + ? ? ? ? ? ? ? pr_err("twl6030: Failed to read MMCCTRL, error %d\n", ret); >> + ? ? ? ? ? ? ? return ret; >> + ? ? ? } >> + ? ? ? reg_val &= ~VMMC_AUTO_OFF; >> + ? ? ? reg_val |= SW_FC; >> + ? ? ? ret = twl_i2c_write_u8(TWL6030_MODULE_ID0, reg_val, TWL6030_MMCCTRL); >> + ? ? ? if (ret < 0) { >> + ? ? ? ? ? ? ? pr_err("twl6030: Failed to write MMCCTRL, error %d\n", ret); >> + ? ? ? ? ? ? ? return ret; >> + ? ? ? } >> + >> + ? ? ? /* Configuring PullUp-PullDown register */ >> + ? ? ? ret = twl_i2c_read_u8(TWL6030_MODULE_ID0, ®_val, >> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TWL6030_CFG_INPUT_PUPD3); >> + ? ? ? if (ret < 0) { >> + ? ? ? ? ? ? ? pr_err("twl6030: Failed to read CFG_INPUT_PUPD3, error %d\n", >> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ret); >> + ? ? ? ? ? ? ? return ret; >> + ? ? ? } >> + ? ? ? reg_val &= ~(MMC_PU | MMC_PD); >> + ? ? ? ret = twl_i2c_write_u8(TWL6030_MODULE_ID0, reg_val, >> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TWL6030_CFG_INPUT_PUPD3); >> + ? ? ? if (ret < 0) { >> + ? ? ? ? ? ? ? pr_err("twl6030: Failed to write CFG_INPUT_PUPD3, error %d\n", >> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ret); >> + ? ? ? ? ? ? ? return ret; >> + ? ? ? } >> + ? ? ? return 0; >> +} >> +EXPORT_SYMBOL(twl6030_mmc_card_detect_config); >> + >> +int twl6030_mmc_card_detect(struct device *dev, int slot) >> +{ >> + ? ? ? int ret = -EIO; >> + ? ? ? u8 read_reg = 0; >> + ? ? ? struct platform_device *pdev = to_platform_device(dev); >> + >> + ? ? ? if (pdev->id) { >> + ? ? ? ? ? ? ? /* TWL6030 provide's Card detect support for >> + ? ? ? ? ? ? ? ?* only MMC1 controller. >> + ? ? ? ? ? ? ? ?*/ >> + ? ? ? ? ? ? ? pr_err("Unkown MMC controller %d in %s\n", pdev->id, __func__); >> + ? ? ? ? ? ? ? return ret; >> + ? ? ? } >> + ? ? ? /* >> + ? ? ? ?* BIT0 of MMC_CTRL on TWL6030 provides card status for MMC1 >> + ? ? ? ?* 0 - Card not present ,1 - Card present >> + ? ? ? ?*/ >> + ? ? ? ret = twl_i2c_read_u8(TWL6030_MODULE_ID0, &read_reg, >> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TWL6030_MMCCTRL); >> + ? ? ? if (ret >= 0) >> + ? ? ? ? ? ? ? ret = read_reg & STS_MMC; >> + ? ? ? return ret; >> +} >> +EXPORT_SYMBOL(twl6030_mmc_card_detect); >> + >> ?int twl6030_init_irq(int irq_num, unsigned irq_base, unsigned irq_end) >> ?{ >> >> diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c >> index 562dbbb..a51894d 100644 >> --- a/drivers/mmc/host/omap_hsmmc.c >> +++ b/drivers/mmc/host/omap_hsmmc.c >> @@ -466,8 +466,6 @@ static int omap_hsmmc_gpio_init(struct omap_mmc_platform_data *pdata) >> ? ? ? ?int ret; >> >> ? ? ? ?if (gpio_is_valid(pdata->slots[0].switch_pin)) { >> - ? ? ? ? ? ? ? pdata->suspend = omap_hsmmc_suspend_cdirq; >> - ? ? ? ? ? ? ? pdata->resume = omap_hsmmc_resume_cdirq; >> ? ? ? ? ? ? ? ?if (pdata->slots[0].cover) >> ? ? ? ? ? ? ? ? ? ? ? ?pdata->slots[0].get_cover_state = >> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?omap_hsmmc_get_cover_state; >> @@ -2211,6 +2209,8 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev) >> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"Unable to grab MMC CD IRQ\n"); >> ? ? ? ? ? ? ? ? ? ? ? ?goto err_irq_cd; >> ? ? ? ? ? ? ? ?} >> + ? ? ? ? ? ? ? pdata->suspend = omap_hsmmc_suspend_cdirq; >> + ? ? ? ? ? ? ? pdata->resume = omap_hsmmc_resume_cdirq; >> ? ? ? ?} >> >> ? ? ? ?omap_hsmmc_disable_irq(host); >> diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h >> index 6de90bf..e64894c 100644 >> --- a/include/linux/i2c/twl.h >> +++ b/include/linux/i2c/twl.h >> @@ -141,6 +141,16 @@ >> ?#define TWL6030_CHARGER_CTRL_INT_MASK ?0x10 >> ?#define TWL6030_CHARGER_FAULT_INT_MASK ? ? ? ? 0x60 >> >> +#define TWL6030_MMCCTRL ? ? ? ? ? ? ? ?0xEE >> +#define VMMC_AUTO_OFF ? ? ? ? ? ? ? ? ?(0x1 << 3) >> +#define SW_FC ? ? ? ? ? ? ? ? ? ? ? ? ?(0x1 << 2) >> +#define STS_MMC ? ? ? ? ? ? ? ? ? ? ? ?0x1 >> + >> +#define TWL6030_CFG_INPUT_PUPD3 ? ? ? ?0xF2 >> +#define MMC_PU ? ? ? ? ? ? ? ? ? ? ? ? (0x1 << 3) >> +#define MMC_PD ? ? ? ? ? ? ? ? ? ? ? ? (0x1 << 2) >> + >> + >> >> ?#define TWL4030_CLASS_ID ? ? ? ? ? ? ? 0x4030 >> ?#define TWL6030_CLASS_ID ? ? ? ? ? ? ? 0x6030 >> @@ -173,6 +183,27 @@ int twl_i2c_read(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes); >> ?int twl6030_interrupt_unmask(u8 bit_mask, u8 offset); >> ?int twl6030_interrupt_mask(u8 bit_mask, u8 offset); >> >> +/* Card detect Configuration for MMC1 Controller on OMAP4 */ >> +#ifdef CONFIG_TWL4030_CORE >> +int twl6030_mmc_card_detect_config(void); >> +#else >> +static inline int twl6030_mmc_card_detect_config(void) >> +{ >> + ? ? ? pr_debug("twl6030_mmc_card_detect_config not supported\n"); >> + ? ? ? return 0; >> +} >> +#endif >> + >> +/* MMC1 Controller on OMAP4 uses Phoenix irq for Card detect */ >> +#ifdef CONFIG_TWL4030_CORE >> +int twl6030_mmc_card_detect(struct device *dev, int slot); >> +#else >> +static inline int twl6030_mmc_card_detect(struct device *dev, int slot) >> +{ >> + ? ? ? pr_debug("Call back twl6030_mmc_card_detect not supported\n"); >> + ? ? ? return -EIO; >> +} >> +#endif >> ?/*----------------------------------------------------------------------*/ >> >> ?/* >> -- >> 1.7.0.4 >> >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in >> the body of a message to majordomo at vger.kernel.org >> More majordomo info at ?http://vger.kernel.org/majordomo-info.html >> > ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v4 1/4] omap4 hsmmc: Adding card detect support for MMC1 2010-09-28 6:52 ` kishore kadiyala @ 2010-09-29 10:41 ` kishore kadiyala 2010-10-01 6:59 ` kishore kadiyala 0 siblings, 1 reply; 14+ messages in thread From: kishore kadiyala @ 2010-09-29 10:41 UTC (permalink / raw) To: linux-arm-kernel Gentle Reminder ! Regards, Kishore On Tue, Sep 28, 2010 at 12:22 PM, kishore kadiyala <kishorek.kadiyala@gmail.com> wrote: > Hi Samuel, > > Could you please review this patch which touches mfd/twl6030-irq.c for > card detect support > of MMC1 controller on OMAP4. > > Regards, > Kishore > > On Mon, Sep 27, 2010 at 1:25 PM, kishore kadiyala > <kishorek.kadiyala@gmail.com> wrote: >> Cc: Samuel Ortiz <sameo@linux.intel.com> >> >> On Fri, Sep 24, 2010 at 10:43 PM, kishore kadiyala >> <kishore.kadiyala@ti.com> wrote: >>> Adding card detect callback function and card detect configuration >>> function for MMC1 Controller on OMAP4. >>> >>> Card detect configuration function does initial configuration of the >>> MMC Control & PullUp-PullDown registers of Phoenix. >>> >>> For MMC1 Controller, card detect interrupt source is >>> twl6030 which is non-gpio. The card detect call back function provides >>> card present/absent status by reading MMC Control register present >>> on twl6030. >>> >>> Since OMAP4 doesn't use any GPIO line as used in OMAP3 for card detect, >>> the suspend/resume initialization which was done in omap_hsmmc_gpio_init >>> previously is moved to the probe thus making it generic for both OMAP3 & OMAP4. >>> >>> Cc: Tony Lindgren <tony@atomide.com> >>> Cc: Andrew Morton <akpm@linux-foundation.org> >>> Cc: Madhusudhan Chikkature <madhu.cr@ti.com> >>> Cc: Adrian Hunter <adrian.hunter@nokia.com> >>> Signed-off-by: Kishore Kadiyala <kishore.kadiyala@ti.com> >>> --- >>> ?arch/arm/mach-omap2/board-4430sdp.c | ? ?7 +++- >>> ?drivers/mfd/twl6030-irq.c ? ? ? ? ? | ? 73 +++++++++++++++++++++++++++++++++++ >>> ?drivers/mmc/host/omap_hsmmc.c ? ? ? | ? ?4 +- >>> ?include/linux/i2c/twl.h ? ? ? ? ? ? | ? 31 +++++++++++++++ >>> ?4 files changed, 112 insertions(+), 3 deletions(-) >>> >>> diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c >>> index 9447644..a49f285 100644 >>> --- a/arch/arm/mach-omap2/board-4430sdp.c >>> +++ b/arch/arm/mach-omap2/board-4430sdp.c >>> @@ -227,9 +227,14 @@ static int omap4_twl6030_hsmmc_late_init(struct device *dev) >>> ? ? ? ?struct omap_mmc_platform_data *pdata = dev->platform_data; >>> >>> ? ? ? ?/* Setting MMC1 Card detect Irq */ >>> - ? ? ? if (pdev->id == 0) >>> + ? ? ? if (pdev->id == 0) { >>> + ? ? ? ? ? ? ? ret = twl6030_mmc_card_detect_config(); >>> + ? ? ? ? ? ? ? if (ret) >>> + ? ? ? ? ? ? ? ? ? ? ? pr_err("Failed configuring MMC1 card detect\n"); >>> ? ? ? ? ? ? ? ?pdata->slots[0].card_detect_irq = TWL6030_IRQ_BASE + >>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?MMCDETECT_INTR_OFFSET; >>> + ? ? ? ? ? ? ? pdata->slots[0].card_detect = twl6030_mmc_card_detect; >>> + ? ? ? } >>> ? ? ? ?return ret; >>> ?} >>> >>> diff --git a/drivers/mfd/twl6030-irq.c b/drivers/mfd/twl6030-irq.c >>> index 10bf228..2d3bb82 100644 >>> --- a/drivers/mfd/twl6030-irq.c >>> +++ b/drivers/mfd/twl6030-irq.c >>> @@ -36,6 +36,7 @@ >>> ?#include <linux/irq.h> >>> ?#include <linux/kthread.h> >>> ?#include <linux/i2c/twl.h> >>> +#include <linux/platform_device.h> >>> >>> ?/* >>> ?* TWL6030 (unlike its predecessors, which had two level interrupt handling) >>> @@ -223,6 +224,78 @@ int twl6030_interrupt_mask(u8 bit_mask, u8 offset) >>> ?} >>> ?EXPORT_SYMBOL(twl6030_interrupt_mask); >>> >>> +int twl6030_mmc_card_detect_config(void) >>> +{ >>> + ? ? ? int ret; >>> + ? ? ? u8 reg_val = 0; >>> + >>> + ? ? ? /* Unmasking the Card detect Interrupt line for MMC1 from Phoenix */ >>> + ? ? ? twl6030_interrupt_unmask(TWL6030_MMCDETECT_INT_MASK, >>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? REG_INT_MSK_LINE_B); >>> + ? ? ? twl6030_interrupt_unmask(TWL6030_MMCDETECT_INT_MASK, >>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? REG_INT_MSK_STS_B); >>> + ? ? ? /* >>> + ? ? ? ?* Intially Configuring MMC_CTRL for receving interrupts & >>> + ? ? ? ?* Card status on TWL6030 for MMC1 >>> + ? ? ? ?*/ >>> + ? ? ? ret = twl_i2c_read_u8(TWL6030_MODULE_ID0, ®_val, TWL6030_MMCCTRL); >>> + ? ? ? if (ret < 0) { >>> + ? ? ? ? ? ? ? pr_err("twl6030: Failed to read MMCCTRL, error %d\n", ret); >>> + ? ? ? ? ? ? ? return ret; >>> + ? ? ? } >>> + ? ? ? reg_val &= ~VMMC_AUTO_OFF; >>> + ? ? ? reg_val |= SW_FC; >>> + ? ? ? ret = twl_i2c_write_u8(TWL6030_MODULE_ID0, reg_val, TWL6030_MMCCTRL); >>> + ? ? ? if (ret < 0) { >>> + ? ? ? ? ? ? ? pr_err("twl6030: Failed to write MMCCTRL, error %d\n", ret); >>> + ? ? ? ? ? ? ? return ret; >>> + ? ? ? } >>> + >>> + ? ? ? /* Configuring PullUp-PullDown register */ >>> + ? ? ? ret = twl_i2c_read_u8(TWL6030_MODULE_ID0, ®_val, >>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TWL6030_CFG_INPUT_PUPD3); >>> + ? ? ? if (ret < 0) { >>> + ? ? ? ? ? ? ? pr_err("twl6030: Failed to read CFG_INPUT_PUPD3, error %d\n", >>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ret); >>> + ? ? ? ? ? ? ? return ret; >>> + ? ? ? } >>> + ? ? ? reg_val &= ~(MMC_PU | MMC_PD); >>> + ? ? ? ret = twl_i2c_write_u8(TWL6030_MODULE_ID0, reg_val, >>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TWL6030_CFG_INPUT_PUPD3); >>> + ? ? ? if (ret < 0) { >>> + ? ? ? ? ? ? ? pr_err("twl6030: Failed to write CFG_INPUT_PUPD3, error %d\n", >>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ret); >>> + ? ? ? ? ? ? ? return ret; >>> + ? ? ? } >>> + ? ? ? return 0; >>> +} >>> +EXPORT_SYMBOL(twl6030_mmc_card_detect_config); >>> + >>> +int twl6030_mmc_card_detect(struct device *dev, int slot) >>> +{ >>> + ? ? ? int ret = -EIO; >>> + ? ? ? u8 read_reg = 0; >>> + ? ? ? struct platform_device *pdev = to_platform_device(dev); >>> + >>> + ? ? ? if (pdev->id) { >>> + ? ? ? ? ? ? ? /* TWL6030 provide's Card detect support for >>> + ? ? ? ? ? ? ? ?* only MMC1 controller. >>> + ? ? ? ? ? ? ? ?*/ >>> + ? ? ? ? ? ? ? pr_err("Unkown MMC controller %d in %s\n", pdev->id, __func__); >>> + ? ? ? ? ? ? ? return ret; >>> + ? ? ? } >>> + ? ? ? /* >>> + ? ? ? ?* BIT0 of MMC_CTRL on TWL6030 provides card status for MMC1 >>> + ? ? ? ?* 0 - Card not present ,1 - Card present >>> + ? ? ? ?*/ >>> + ? ? ? ret = twl_i2c_read_u8(TWL6030_MODULE_ID0, &read_reg, >>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TWL6030_MMCCTRL); >>> + ? ? ? if (ret >= 0) >>> + ? ? ? ? ? ? ? ret = read_reg & STS_MMC; >>> + ? ? ? return ret; >>> +} >>> +EXPORT_SYMBOL(twl6030_mmc_card_detect); >>> + >>> ?int twl6030_init_irq(int irq_num, unsigned irq_base, unsigned irq_end) >>> ?{ >>> >>> diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c >>> index 562dbbb..a51894d 100644 >>> --- a/drivers/mmc/host/omap_hsmmc.c >>> +++ b/drivers/mmc/host/omap_hsmmc.c >>> @@ -466,8 +466,6 @@ static int omap_hsmmc_gpio_init(struct omap_mmc_platform_data *pdata) >>> ? ? ? ?int ret; >>> >>> ? ? ? ?if (gpio_is_valid(pdata->slots[0].switch_pin)) { >>> - ? ? ? ? ? ? ? pdata->suspend = omap_hsmmc_suspend_cdirq; >>> - ? ? ? ? ? ? ? pdata->resume = omap_hsmmc_resume_cdirq; >>> ? ? ? ? ? ? ? ?if (pdata->slots[0].cover) >>> ? ? ? ? ? ? ? ? ? ? ? ?pdata->slots[0].get_cover_state = >>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?omap_hsmmc_get_cover_state; >>> @@ -2211,6 +2209,8 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev) >>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"Unable to grab MMC CD IRQ\n"); >>> ? ? ? ? ? ? ? ? ? ? ? ?goto err_irq_cd; >>> ? ? ? ? ? ? ? ?} >>> + ? ? ? ? ? ? ? pdata->suspend = omap_hsmmc_suspend_cdirq; >>> + ? ? ? ? ? ? ? pdata->resume = omap_hsmmc_resume_cdirq; >>> ? ? ? ?} >>> >>> ? ? ? ?omap_hsmmc_disable_irq(host); >>> diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h >>> index 6de90bf..e64894c 100644 >>> --- a/include/linux/i2c/twl.h >>> +++ b/include/linux/i2c/twl.h >>> @@ -141,6 +141,16 @@ >>> ?#define TWL6030_CHARGER_CTRL_INT_MASK ?0x10 >>> ?#define TWL6030_CHARGER_FAULT_INT_MASK ? ? ? ? 0x60 >>> >>> +#define TWL6030_MMCCTRL ? ? ? ? ? ? ? ?0xEE >>> +#define VMMC_AUTO_OFF ? ? ? ? ? ? ? ? ?(0x1 << 3) >>> +#define SW_FC ? ? ? ? ? ? ? ? ? ? ? ? ?(0x1 << 2) >>> +#define STS_MMC ? ? ? ? ? ? ? ? ? ? ? ?0x1 >>> + >>> +#define TWL6030_CFG_INPUT_PUPD3 ? ? ? ?0xF2 >>> +#define MMC_PU ? ? ? ? ? ? ? ? ? ? ? ? (0x1 << 3) >>> +#define MMC_PD ? ? ? ? ? ? ? ? ? ? ? ? (0x1 << 2) >>> + >>> + >>> >>> ?#define TWL4030_CLASS_ID ? ? ? ? ? ? ? 0x4030 >>> ?#define TWL6030_CLASS_ID ? ? ? ? ? ? ? 0x6030 >>> @@ -173,6 +183,27 @@ int twl_i2c_read(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes); >>> ?int twl6030_interrupt_unmask(u8 bit_mask, u8 offset); >>> ?int twl6030_interrupt_mask(u8 bit_mask, u8 offset); >>> >>> +/* Card detect Configuration for MMC1 Controller on OMAP4 */ >>> +#ifdef CONFIG_TWL4030_CORE >>> +int twl6030_mmc_card_detect_config(void); >>> +#else >>> +static inline int twl6030_mmc_card_detect_config(void) >>> +{ >>> + ? ? ? pr_debug("twl6030_mmc_card_detect_config not supported\n"); >>> + ? ? ? return 0; >>> +} >>> +#endif >>> + >>> +/* MMC1 Controller on OMAP4 uses Phoenix irq for Card detect */ >>> +#ifdef CONFIG_TWL4030_CORE >>> +int twl6030_mmc_card_detect(struct device *dev, int slot); >>> +#else >>> +static inline int twl6030_mmc_card_detect(struct device *dev, int slot) >>> +{ >>> + ? ? ? pr_debug("Call back twl6030_mmc_card_detect not supported\n"); >>> + ? ? ? return -EIO; >>> +} >>> +#endif >>> ?/*----------------------------------------------------------------------*/ >>> >>> ?/* >>> -- >>> 1.7.0.4 >>> >>> >>> -- >>> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in >>> the body of a message to majordomo at vger.kernel.org >>> More majordomo info at ?http://vger.kernel.org/majordomo-info.html >>> >> > ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v4 1/4] omap4 hsmmc: Adding card detect support for MMC1 2010-09-29 10:41 ` kishore kadiyala @ 2010-10-01 6:59 ` kishore kadiyala 2010-10-01 11:29 ` Samuel Ortiz 0 siblings, 1 reply; 14+ messages in thread From: kishore kadiyala @ 2010-10-01 6:59 UTC (permalink / raw) To: linux-arm-kernel Ping !! On Wed, Sep 29, 2010 at 4:11 PM, kishore kadiyala <kishorek.kadiyala@gmail.com> wrote: > Gentle Reminder ! > > Regards, > Kishore > > On Tue, Sep 28, 2010 at 12:22 PM, kishore kadiyala > <kishorek.kadiyala@gmail.com> wrote: >> Hi Samuel, >> >> Could you please review this patch which touches mfd/twl6030-irq.c for >> card detect support >> of MMC1 controller on OMAP4. >> >> Regards, >> Kishore >> >> On Mon, Sep 27, 2010 at 1:25 PM, kishore kadiyala >> <kishorek.kadiyala@gmail.com> wrote: >>> Cc: Samuel Ortiz <sameo@linux.intel.com> >>> >>> On Fri, Sep 24, 2010 at 10:43 PM, kishore kadiyala >>> <kishore.kadiyala@ti.com> wrote: >>>> Adding card detect callback function and card detect configuration >>>> function for MMC1 Controller on OMAP4. >>>> >>>> Card detect configuration function does initial configuration of the >>>> MMC Control & PullUp-PullDown registers of Phoenix. >>>> >>>> For MMC1 Controller, card detect interrupt source is >>>> twl6030 which is non-gpio. The card detect call back function provides >>>> card present/absent status by reading MMC Control register present >>>> on twl6030. >>>> >>>> Since OMAP4 doesn't use any GPIO line as used in OMAP3 for card detect, >>>> the suspend/resume initialization which was done in omap_hsmmc_gpio_init >>>> previously is moved to the probe thus making it generic for both OMAP3 & OMAP4. >>>> >>>> Cc: Tony Lindgren <tony@atomide.com> >>>> Cc: Andrew Morton <akpm@linux-foundation.org> >>>> Cc: Madhusudhan Chikkature <madhu.cr@ti.com> >>>> Cc: Adrian Hunter <adrian.hunter@nokia.com> >>>> Signed-off-by: Kishore Kadiyala <kishore.kadiyala@ti.com> >>>> --- >>>> ?arch/arm/mach-omap2/board-4430sdp.c | ? ?7 +++- >>>> ?drivers/mfd/twl6030-irq.c ? ? ? ? ? | ? 73 +++++++++++++++++++++++++++++++++++ >>>> ?drivers/mmc/host/omap_hsmmc.c ? ? ? | ? ?4 +- >>>> ?include/linux/i2c/twl.h ? ? ? ? ? ? | ? 31 +++++++++++++++ >>>> ?4 files changed, 112 insertions(+), 3 deletions(-) >>>> >>>> diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c >>>> index 9447644..a49f285 100644 >>>> --- a/arch/arm/mach-omap2/board-4430sdp.c >>>> +++ b/arch/arm/mach-omap2/board-4430sdp.c >>>> @@ -227,9 +227,14 @@ static int omap4_twl6030_hsmmc_late_init(struct device *dev) >>>> ? ? ? ?struct omap_mmc_platform_data *pdata = dev->platform_data; >>>> >>>> ? ? ? ?/* Setting MMC1 Card detect Irq */ >>>> - ? ? ? if (pdev->id == 0) >>>> + ? ? ? if (pdev->id == 0) { >>>> + ? ? ? ? ? ? ? ret = twl6030_mmc_card_detect_config(); >>>> + ? ? ? ? ? ? ? if (ret) >>>> + ? ? ? ? ? ? ? ? ? ? ? pr_err("Failed configuring MMC1 card detect\n"); >>>> ? ? ? ? ? ? ? ?pdata->slots[0].card_detect_irq = TWL6030_IRQ_BASE + >>>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?MMCDETECT_INTR_OFFSET; >>>> + ? ? ? ? ? ? ? pdata->slots[0].card_detect = twl6030_mmc_card_detect; >>>> + ? ? ? } >>>> ? ? ? ?return ret; >>>> ?} >>>> >>>> diff --git a/drivers/mfd/twl6030-irq.c b/drivers/mfd/twl6030-irq.c >>>> index 10bf228..2d3bb82 100644 >>>> --- a/drivers/mfd/twl6030-irq.c >>>> +++ b/drivers/mfd/twl6030-irq.c >>>> @@ -36,6 +36,7 @@ >>>> ?#include <linux/irq.h> >>>> ?#include <linux/kthread.h> >>>> ?#include <linux/i2c/twl.h> >>>> +#include <linux/platform_device.h> >>>> >>>> ?/* >>>> ?* TWL6030 (unlike its predecessors, which had two level interrupt handling) >>>> @@ -223,6 +224,78 @@ int twl6030_interrupt_mask(u8 bit_mask, u8 offset) >>>> ?} >>>> ?EXPORT_SYMBOL(twl6030_interrupt_mask); >>>> >>>> +int twl6030_mmc_card_detect_config(void) >>>> +{ >>>> + ? ? ? int ret; >>>> + ? ? ? u8 reg_val = 0; >>>> + >>>> + ? ? ? /* Unmasking the Card detect Interrupt line for MMC1 from Phoenix */ >>>> + ? ? ? twl6030_interrupt_unmask(TWL6030_MMCDETECT_INT_MASK, >>>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? REG_INT_MSK_LINE_B); >>>> + ? ? ? twl6030_interrupt_unmask(TWL6030_MMCDETECT_INT_MASK, >>>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? REG_INT_MSK_STS_B); >>>> + ? ? ? /* >>>> + ? ? ? ?* Intially Configuring MMC_CTRL for receving interrupts & >>>> + ? ? ? ?* Card status on TWL6030 for MMC1 >>>> + ? ? ? ?*/ >>>> + ? ? ? ret = twl_i2c_read_u8(TWL6030_MODULE_ID0, ®_val, TWL6030_MMCCTRL); >>>> + ? ? ? if (ret < 0) { >>>> + ? ? ? ? ? ? ? pr_err("twl6030: Failed to read MMCCTRL, error %d\n", ret); >>>> + ? ? ? ? ? ? ? return ret; >>>> + ? ? ? } >>>> + ? ? ? reg_val &= ~VMMC_AUTO_OFF; >>>> + ? ? ? reg_val |= SW_FC; >>>> + ? ? ? ret = twl_i2c_write_u8(TWL6030_MODULE_ID0, reg_val, TWL6030_MMCCTRL); >>>> + ? ? ? if (ret < 0) { >>>> + ? ? ? ? ? ? ? pr_err("twl6030: Failed to write MMCCTRL, error %d\n", ret); >>>> + ? ? ? ? ? ? ? return ret; >>>> + ? ? ? } >>>> + >>>> + ? ? ? /* Configuring PullUp-PullDown register */ >>>> + ? ? ? ret = twl_i2c_read_u8(TWL6030_MODULE_ID0, ®_val, >>>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TWL6030_CFG_INPUT_PUPD3); >>>> + ? ? ? if (ret < 0) { >>>> + ? ? ? ? ? ? ? pr_err("twl6030: Failed to read CFG_INPUT_PUPD3, error %d\n", >>>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ret); >>>> + ? ? ? ? ? ? ? return ret; >>>> + ? ? ? } >>>> + ? ? ? reg_val &= ~(MMC_PU | MMC_PD); >>>> + ? ? ? ret = twl_i2c_write_u8(TWL6030_MODULE_ID0, reg_val, >>>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TWL6030_CFG_INPUT_PUPD3); >>>> + ? ? ? if (ret < 0) { >>>> + ? ? ? ? ? ? ? pr_err("twl6030: Failed to write CFG_INPUT_PUPD3, error %d\n", >>>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ret); >>>> + ? ? ? ? ? ? ? return ret; >>>> + ? ? ? } >>>> + ? ? ? return 0; >>>> +} >>>> +EXPORT_SYMBOL(twl6030_mmc_card_detect_config); >>>> + >>>> +int twl6030_mmc_card_detect(struct device *dev, int slot) >>>> +{ >>>> + ? ? ? int ret = -EIO; >>>> + ? ? ? u8 read_reg = 0; >>>> + ? ? ? struct platform_device *pdev = to_platform_device(dev); >>>> + >>>> + ? ? ? if (pdev->id) { >>>> + ? ? ? ? ? ? ? /* TWL6030 provide's Card detect support for >>>> + ? ? ? ? ? ? ? ?* only MMC1 controller. >>>> + ? ? ? ? ? ? ? ?*/ >>>> + ? ? ? ? ? ? ? pr_err("Unkown MMC controller %d in %s\n", pdev->id, __func__); >>>> + ? ? ? ? ? ? ? return ret; >>>> + ? ? ? } >>>> + ? ? ? /* >>>> + ? ? ? ?* BIT0 of MMC_CTRL on TWL6030 provides card status for MMC1 >>>> + ? ? ? ?* 0 - Card not present ,1 - Card present >>>> + ? ? ? ?*/ >>>> + ? ? ? ret = twl_i2c_read_u8(TWL6030_MODULE_ID0, &read_reg, >>>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TWL6030_MMCCTRL); >>>> + ? ? ? if (ret >= 0) >>>> + ? ? ? ? ? ? ? ret = read_reg & STS_MMC; >>>> + ? ? ? return ret; >>>> +} >>>> +EXPORT_SYMBOL(twl6030_mmc_card_detect); >>>> + >>>> ?int twl6030_init_irq(int irq_num, unsigned irq_base, unsigned irq_end) >>>> ?{ >>>> >>>> diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c >>>> index 562dbbb..a51894d 100644 >>>> --- a/drivers/mmc/host/omap_hsmmc.c >>>> +++ b/drivers/mmc/host/omap_hsmmc.c >>>> @@ -466,8 +466,6 @@ static int omap_hsmmc_gpio_init(struct omap_mmc_platform_data *pdata) >>>> ? ? ? ?int ret; >>>> >>>> ? ? ? ?if (gpio_is_valid(pdata->slots[0].switch_pin)) { >>>> - ? ? ? ? ? ? ? pdata->suspend = omap_hsmmc_suspend_cdirq; >>>> - ? ? ? ? ? ? ? pdata->resume = omap_hsmmc_resume_cdirq; >>>> ? ? ? ? ? ? ? ?if (pdata->slots[0].cover) >>>> ? ? ? ? ? ? ? ? ? ? ? ?pdata->slots[0].get_cover_state = >>>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?omap_hsmmc_get_cover_state; >>>> @@ -2211,6 +2209,8 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev) >>>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"Unable to grab MMC CD IRQ\n"); >>>> ? ? ? ? ? ? ? ? ? ? ? ?goto err_irq_cd; >>>> ? ? ? ? ? ? ? ?} >>>> + ? ? ? ? ? ? ? pdata->suspend = omap_hsmmc_suspend_cdirq; >>>> + ? ? ? ? ? ? ? pdata->resume = omap_hsmmc_resume_cdirq; >>>> ? ? ? ?} >>>> >>>> ? ? ? ?omap_hsmmc_disable_irq(host); >>>> diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h >>>> index 6de90bf..e64894c 100644 >>>> --- a/include/linux/i2c/twl.h >>>> +++ b/include/linux/i2c/twl.h >>>> @@ -141,6 +141,16 @@ >>>> ?#define TWL6030_CHARGER_CTRL_INT_MASK ?0x10 >>>> ?#define TWL6030_CHARGER_FAULT_INT_MASK ? ? ? ? 0x60 >>>> >>>> +#define TWL6030_MMCCTRL ? ? ? ? ? ? ? ?0xEE >>>> +#define VMMC_AUTO_OFF ? ? ? ? ? ? ? ? ?(0x1 << 3) >>>> +#define SW_FC ? ? ? ? ? ? ? ? ? ? ? ? ?(0x1 << 2) >>>> +#define STS_MMC ? ? ? ? ? ? ? ? ? ? ? ?0x1 >>>> + >>>> +#define TWL6030_CFG_INPUT_PUPD3 ? ? ? ?0xF2 >>>> +#define MMC_PU ? ? ? ? ? ? ? ? ? ? ? ? (0x1 << 3) >>>> +#define MMC_PD ? ? ? ? ? ? ? ? ? ? ? ? (0x1 << 2) >>>> + >>>> + >>>> >>>> ?#define TWL4030_CLASS_ID ? ? ? ? ? ? ? 0x4030 >>>> ?#define TWL6030_CLASS_ID ? ? ? ? ? ? ? 0x6030 >>>> @@ -173,6 +183,27 @@ int twl_i2c_read(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes); >>>> ?int twl6030_interrupt_unmask(u8 bit_mask, u8 offset); >>>> ?int twl6030_interrupt_mask(u8 bit_mask, u8 offset); >>>> >>>> +/* Card detect Configuration for MMC1 Controller on OMAP4 */ >>>> +#ifdef CONFIG_TWL4030_CORE >>>> +int twl6030_mmc_card_detect_config(void); >>>> +#else >>>> +static inline int twl6030_mmc_card_detect_config(void) >>>> +{ >>>> + ? ? ? pr_debug("twl6030_mmc_card_detect_config not supported\n"); >>>> + ? ? ? return 0; >>>> +} >>>> +#endif >>>> + >>>> +/* MMC1 Controller on OMAP4 uses Phoenix irq for Card detect */ >>>> +#ifdef CONFIG_TWL4030_CORE >>>> +int twl6030_mmc_card_detect(struct device *dev, int slot); >>>> +#else >>>> +static inline int twl6030_mmc_card_detect(struct device *dev, int slot) >>>> +{ >>>> + ? ? ? pr_debug("Call back twl6030_mmc_card_detect not supported\n"); >>>> + ? ? ? return -EIO; >>>> +} >>>> +#endif >>>> ?/*----------------------------------------------------------------------*/ >>>> >>>> ?/* >>>> -- >>>> 1.7.0.4 >>>> >>>> >>>> -- >>>> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in >>>> the body of a message to majordomo at vger.kernel.org >>>> More majordomo info at ?http://vger.kernel.org/majordomo-info.html >>>> >>> >> > ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v4 1/4] omap4 hsmmc: Adding card detect support for MMC1 2010-10-01 6:59 ` kishore kadiyala @ 2010-10-01 11:29 ` Samuel Ortiz 2010-10-01 12:02 ` kishore kadiyala 0 siblings, 1 reply; 14+ messages in thread From: Samuel Ortiz @ 2010-10-01 11:29 UTC (permalink / raw) To: linux-arm-kernel On Fri, Oct 01, 2010 at 12:29:48PM +0530, kishore kadiyala wrote: > Ping !! Applied !! BTW, please add the full patch when you cc me, so that I don't have to dig through patchwork to grab something I can git-am. Cheers, Samuel. > On Wed, Sep 29, 2010 at 4:11 PM, kishore kadiyala > <kishorek.kadiyala@gmail.com> wrote: > > Gentle Reminder ! > > > > Regards, > > Kishore > > > > On Tue, Sep 28, 2010 at 12:22 PM, kishore kadiyala > > <kishorek.kadiyala@gmail.com> wrote: > >> Hi Samuel, > >> > >> Could you please review this patch which touches mfd/twl6030-irq.c for > >> card detect support > >> of MMC1 controller on OMAP4. > >> > >> Regards, > >> Kishore > >> > >> On Mon, Sep 27, 2010 at 1:25 PM, kishore kadiyala > >> <kishorek.kadiyala@gmail.com> wrote: > >>> Cc: Samuel Ortiz <sameo@linux.intel.com> > >>> > >>> On Fri, Sep 24, 2010 at 10:43 PM, kishore kadiyala > >>> <kishore.kadiyala@ti.com> wrote: > >>>> Adding card detect callback function and card detect configuration > >>>> function for MMC1 Controller on OMAP4. > >>>> > >>>> Card detect configuration function does initial configuration of the > >>>> MMC Control & PullUp-PullDown registers of Phoenix. > >>>> > >>>> For MMC1 Controller, card detect interrupt source is > >>>> twl6030 which is non-gpio. The card detect call back function provides > >>>> card present/absent status by reading MMC Control register present > >>>> on twl6030. > >>>> > >>>> Since OMAP4 doesn't use any GPIO line as used in OMAP3 for card detect, > >>>> the suspend/resume initialization which was done in omap_hsmmc_gpio_init > >>>> previously is moved to the probe thus making it generic for both OMAP3 & OMAP4. > >>>> > >>>> Cc: Tony Lindgren <tony@atomide.com> > >>>> Cc: Andrew Morton <akpm@linux-foundation.org> > >>>> Cc: Madhusudhan Chikkature <madhu.cr@ti.com> > >>>> Cc: Adrian Hunter <adrian.hunter@nokia.com> > >>>> Signed-off-by: Kishore Kadiyala <kishore.kadiyala@ti.com> > >>>> --- > >>>> ?arch/arm/mach-omap2/board-4430sdp.c | ? ?7 +++- > >>>> ?drivers/mfd/twl6030-irq.c ? ? ? ? ? | ? 73 +++++++++++++++++++++++++++++++++++ > >>>> ?drivers/mmc/host/omap_hsmmc.c ? ? ? | ? ?4 +- > >>>> ?include/linux/i2c/twl.h ? ? ? ? ? ? | ? 31 +++++++++++++++ > >>>> ?4 files changed, 112 insertions(+), 3 deletions(-) > >>>> > >>>> diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c > >>>> index 9447644..a49f285 100644 > >>>> --- a/arch/arm/mach-omap2/board-4430sdp.c > >>>> +++ b/arch/arm/mach-omap2/board-4430sdp.c > >>>> @@ -227,9 +227,14 @@ static int omap4_twl6030_hsmmc_late_init(struct device *dev) > >>>> ? ? ? ?struct omap_mmc_platform_data *pdata = dev->platform_data; > >>>> > >>>> ? ? ? ?/* Setting MMC1 Card detect Irq */ > >>>> - ? ? ? if (pdev->id == 0) > >>>> + ? ? ? if (pdev->id == 0) { > >>>> + ? ? ? ? ? ? ? ret = twl6030_mmc_card_detect_config(); > >>>> + ? ? ? ? ? ? ? if (ret) > >>>> + ? ? ? ? ? ? ? ? ? ? ? pr_err("Failed configuring MMC1 card detect\n"); > >>>> ? ? ? ? ? ? ? ?pdata->slots[0].card_detect_irq = TWL6030_IRQ_BASE + > >>>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?MMCDETECT_INTR_OFFSET; > >>>> + ? ? ? ? ? ? ? pdata->slots[0].card_detect = twl6030_mmc_card_detect; > >>>> + ? ? ? } > >>>> ? ? ? ?return ret; > >>>> ?} > >>>> > >>>> diff --git a/drivers/mfd/twl6030-irq.c b/drivers/mfd/twl6030-irq.c > >>>> index 10bf228..2d3bb82 100644 > >>>> --- a/drivers/mfd/twl6030-irq.c > >>>> +++ b/drivers/mfd/twl6030-irq.c > >>>> @@ -36,6 +36,7 @@ > >>>> ?#include <linux/irq.h> > >>>> ?#include <linux/kthread.h> > >>>> ?#include <linux/i2c/twl.h> > >>>> +#include <linux/platform_device.h> > >>>> > >>>> ?/* > >>>> ?* TWL6030 (unlike its predecessors, which had two level interrupt handling) > >>>> @@ -223,6 +224,78 @@ int twl6030_interrupt_mask(u8 bit_mask, u8 offset) > >>>> ?} > >>>> ?EXPORT_SYMBOL(twl6030_interrupt_mask); > >>>> > >>>> +int twl6030_mmc_card_detect_config(void) > >>>> +{ > >>>> + ? ? ? int ret; > >>>> + ? ? ? u8 reg_val = 0; > >>>> + > >>>> + ? ? ? /* Unmasking the Card detect Interrupt line for MMC1 from Phoenix */ > >>>> + ? ? ? twl6030_interrupt_unmask(TWL6030_MMCDETECT_INT_MASK, > >>>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? REG_INT_MSK_LINE_B); > >>>> + ? ? ? twl6030_interrupt_unmask(TWL6030_MMCDETECT_INT_MASK, > >>>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? REG_INT_MSK_STS_B); > >>>> + ? ? ? /* > >>>> + ? ? ? ?* Intially Configuring MMC_CTRL for receving interrupts & > >>>> + ? ? ? ?* Card status on TWL6030 for MMC1 > >>>> + ? ? ? ?*/ > >>>> + ? ? ? ret = twl_i2c_read_u8(TWL6030_MODULE_ID0, ®_val, TWL6030_MMCCTRL); > >>>> + ? ? ? if (ret < 0) { > >>>> + ? ? ? ? ? ? ? pr_err("twl6030: Failed to read MMCCTRL, error %d\n", ret); > >>>> + ? ? ? ? ? ? ? return ret; > >>>> + ? ? ? } > >>>> + ? ? ? reg_val &= ~VMMC_AUTO_OFF; > >>>> + ? ? ? reg_val |= SW_FC; > >>>> + ? ? ? ret = twl_i2c_write_u8(TWL6030_MODULE_ID0, reg_val, TWL6030_MMCCTRL); > >>>> + ? ? ? if (ret < 0) { > >>>> + ? ? ? ? ? ? ? pr_err("twl6030: Failed to write MMCCTRL, error %d\n", ret); > >>>> + ? ? ? ? ? ? ? return ret; > >>>> + ? ? ? } > >>>> + > >>>> + ? ? ? /* Configuring PullUp-PullDown register */ > >>>> + ? ? ? ret = twl_i2c_read_u8(TWL6030_MODULE_ID0, ®_val, > >>>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TWL6030_CFG_INPUT_PUPD3); > >>>> + ? ? ? if (ret < 0) { > >>>> + ? ? ? ? ? ? ? pr_err("twl6030: Failed to read CFG_INPUT_PUPD3, error %d\n", > >>>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ret); > >>>> + ? ? ? ? ? ? ? return ret; > >>>> + ? ? ? } > >>>> + ? ? ? reg_val &= ~(MMC_PU | MMC_PD); > >>>> + ? ? ? ret = twl_i2c_write_u8(TWL6030_MODULE_ID0, reg_val, > >>>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TWL6030_CFG_INPUT_PUPD3); > >>>> + ? ? ? if (ret < 0) { > >>>> + ? ? ? ? ? ? ? pr_err("twl6030: Failed to write CFG_INPUT_PUPD3, error %d\n", > >>>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ret); > >>>> + ? ? ? ? ? ? ? return ret; > >>>> + ? ? ? } > >>>> + ? ? ? return 0; > >>>> +} > >>>> +EXPORT_SYMBOL(twl6030_mmc_card_detect_config); > >>>> + > >>>> +int twl6030_mmc_card_detect(struct device *dev, int slot) > >>>> +{ > >>>> + ? ? ? int ret = -EIO; > >>>> + ? ? ? u8 read_reg = 0; > >>>> + ? ? ? struct platform_device *pdev = to_platform_device(dev); > >>>> + > >>>> + ? ? ? if (pdev->id) { > >>>> + ? ? ? ? ? ? ? /* TWL6030 provide's Card detect support for > >>>> + ? ? ? ? ? ? ? ?* only MMC1 controller. > >>>> + ? ? ? ? ? ? ? ?*/ > >>>> + ? ? ? ? ? ? ? pr_err("Unkown MMC controller %d in %s\n", pdev->id, __func__); > >>>> + ? ? ? ? ? ? ? return ret; > >>>> + ? ? ? } > >>>> + ? ? ? /* > >>>> + ? ? ? ?* BIT0 of MMC_CTRL on TWL6030 provides card status for MMC1 > >>>> + ? ? ? ?* 0 - Card not present ,1 - Card present > >>>> + ? ? ? ?*/ > >>>> + ? ? ? ret = twl_i2c_read_u8(TWL6030_MODULE_ID0, &read_reg, > >>>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TWL6030_MMCCTRL); > >>>> + ? ? ? if (ret >= 0) > >>>> + ? ? ? ? ? ? ? ret = read_reg & STS_MMC; > >>>> + ? ? ? return ret; > >>>> +} > >>>> +EXPORT_SYMBOL(twl6030_mmc_card_detect); > >>>> + > >>>> ?int twl6030_init_irq(int irq_num, unsigned irq_base, unsigned irq_end) > >>>> ?{ > >>>> > >>>> diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c > >>>> index 562dbbb..a51894d 100644 > >>>> --- a/drivers/mmc/host/omap_hsmmc.c > >>>> +++ b/drivers/mmc/host/omap_hsmmc.c > >>>> @@ -466,8 +466,6 @@ static int omap_hsmmc_gpio_init(struct omap_mmc_platform_data *pdata) > >>>> ? ? ? ?int ret; > >>>> > >>>> ? ? ? ?if (gpio_is_valid(pdata->slots[0].switch_pin)) { > >>>> - ? ? ? ? ? ? ? pdata->suspend = omap_hsmmc_suspend_cdirq; > >>>> - ? ? ? ? ? ? ? pdata->resume = omap_hsmmc_resume_cdirq; > >>>> ? ? ? ? ? ? ? ?if (pdata->slots[0].cover) > >>>> ? ? ? ? ? ? ? ? ? ? ? ?pdata->slots[0].get_cover_state = > >>>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?omap_hsmmc_get_cover_state; > >>>> @@ -2211,6 +2209,8 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev) > >>>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"Unable to grab MMC CD IRQ\n"); > >>>> ? ? ? ? ? ? ? ? ? ? ? ?goto err_irq_cd; > >>>> ? ? ? ? ? ? ? ?} > >>>> + ? ? ? ? ? ? ? pdata->suspend = omap_hsmmc_suspend_cdirq; > >>>> + ? ? ? ? ? ? ? pdata->resume = omap_hsmmc_resume_cdirq; > >>>> ? ? ? ?} > >>>> > >>>> ? ? ? ?omap_hsmmc_disable_irq(host); > >>>> diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h > >>>> index 6de90bf..e64894c 100644 > >>>> --- a/include/linux/i2c/twl.h > >>>> +++ b/include/linux/i2c/twl.h > >>>> @@ -141,6 +141,16 @@ > >>>> ?#define TWL6030_CHARGER_CTRL_INT_MASK ?0x10 > >>>> ?#define TWL6030_CHARGER_FAULT_INT_MASK ? ? ? ? 0x60 > >>>> > >>>> +#define TWL6030_MMCCTRL ? ? ? ? ? ? ? ?0xEE > >>>> +#define VMMC_AUTO_OFF ? ? ? ? ? ? ? ? ?(0x1 << 3) > >>>> +#define SW_FC ? ? ? ? ? ? ? ? ? ? ? ? ?(0x1 << 2) > >>>> +#define STS_MMC ? ? ? ? ? ? ? ? ? ? ? ?0x1 > >>>> + > >>>> +#define TWL6030_CFG_INPUT_PUPD3 ? ? ? ?0xF2 > >>>> +#define MMC_PU ? ? ? ? ? ? ? ? ? ? ? ? (0x1 << 3) > >>>> +#define MMC_PD ? ? ? ? ? ? ? ? ? ? ? ? (0x1 << 2) > >>>> + > >>>> + > >>>> > >>>> ?#define TWL4030_CLASS_ID ? ? ? ? ? ? ? 0x4030 > >>>> ?#define TWL6030_CLASS_ID ? ? ? ? ? ? ? 0x6030 > >>>> @@ -173,6 +183,27 @@ int twl_i2c_read(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes); > >>>> ?int twl6030_interrupt_unmask(u8 bit_mask, u8 offset); > >>>> ?int twl6030_interrupt_mask(u8 bit_mask, u8 offset); > >>>> > >>>> +/* Card detect Configuration for MMC1 Controller on OMAP4 */ > >>>> +#ifdef CONFIG_TWL4030_CORE > >>>> +int twl6030_mmc_card_detect_config(void); > >>>> +#else > >>>> +static inline int twl6030_mmc_card_detect_config(void) > >>>> +{ > >>>> + ? ? ? pr_debug("twl6030_mmc_card_detect_config not supported\n"); > >>>> + ? ? ? return 0; > >>>> +} > >>>> +#endif > >>>> + > >>>> +/* MMC1 Controller on OMAP4 uses Phoenix irq for Card detect */ > >>>> +#ifdef CONFIG_TWL4030_CORE > >>>> +int twl6030_mmc_card_detect(struct device *dev, int slot); > >>>> +#else > >>>> +static inline int twl6030_mmc_card_detect(struct device *dev, int slot) > >>>> +{ > >>>> + ? ? ? pr_debug("Call back twl6030_mmc_card_detect not supported\n"); > >>>> + ? ? ? return -EIO; > >>>> +} > >>>> +#endif > >>>> ?/*----------------------------------------------------------------------*/ > >>>> > >>>> ?/* > >>>> -- > >>>> 1.7.0.4 > >>>> > >>>> > >>>> -- > >>>> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in > >>>> the body of a message to majordomo at vger.kernel.org > >>>> More majordomo info at ?http://vger.kernel.org/majordomo-info.html > >>>> > >>> > >> > > -- Intel Open Source Technology Centre http://oss.intel.com/ ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v4 1/4] omap4 hsmmc: Adding card detect support for MMC1 2010-10-01 11:29 ` Samuel Ortiz @ 2010-10-01 12:02 ` kishore kadiyala 2010-10-01 14:41 ` Varadarajan, Charulatha 0 siblings, 1 reply; 14+ messages in thread From: kishore kadiyala @ 2010-10-01 12:02 UTC (permalink / raw) To: linux-arm-kernel Samuel, Sorry , I will ensure to CC you for MFD related changes in future. Regards, Kishore On Fri, Oct 1, 2010 at 4:59 PM, Samuel Ortiz <sameo@linux.intel.com> wrote: > On Fri, Oct 01, 2010 at 12:29:48PM +0530, kishore kadiyala wrote: >> Ping !! > Applied !! > > BTW, please add the full patch when you cc me, so that I don't have to dig > through patchwork to grab something I can git-am. > > Cheers, > Samuel. > > >> On Wed, Sep 29, 2010 at 4:11 PM, kishore kadiyala >> <kishorek.kadiyala@gmail.com> wrote: >> > Gentle Reminder ! >> > >> > Regards, >> > Kishore >> > >> > On Tue, Sep 28, 2010 at 12:22 PM, kishore kadiyala >> > <kishorek.kadiyala@gmail.com> wrote: >> >> Hi Samuel, >> >> >> >> Could you please review this patch which touches mfd/twl6030-irq.c for >> >> card detect support >> >> of MMC1 controller on OMAP4. >> >> >> >> Regards, >> >> Kishore >> >> >> >> On Mon, Sep 27, 2010 at 1:25 PM, kishore kadiyala >> >> <kishorek.kadiyala@gmail.com> wrote: >> >>> Cc: Samuel Ortiz <sameo@linux.intel.com> >> >>> >> >>> On Fri, Sep 24, 2010 at 10:43 PM, kishore kadiyala >> >>> <kishore.kadiyala@ti.com> wrote: >> >>>> Adding card detect callback function and card detect configuration >> >>>> function for MMC1 Controller on OMAP4. >> >>>> >> >>>> Card detect configuration function does initial configuration of the >> >>>> MMC Control & PullUp-PullDown registers of Phoenix. >> >>>> >> >>>> For MMC1 Controller, card detect interrupt source is >> >>>> twl6030 which is non-gpio. The card detect call back function provides >> >>>> card present/absent status by reading MMC Control register present >> >>>> on twl6030. >> >>>> >> >>>> Since OMAP4 doesn't use any GPIO line as used in OMAP3 for card detect, >> >>>> the suspend/resume initialization which was done in omap_hsmmc_gpio_init >> >>>> previously is moved to the probe thus making it generic for both OMAP3 & OMAP4. >> >>>> >> >>>> Cc: Tony Lindgren <tony@atomide.com> >> >>>> Cc: Andrew Morton <akpm@linux-foundation.org> >> >>>> Cc: Madhusudhan Chikkature <madhu.cr@ti.com> >> >>>> Cc: Adrian Hunter <adrian.hunter@nokia.com> >> >>>> Signed-off-by: Kishore Kadiyala <kishore.kadiyala@ti.com> >> >>>> --- >> >>>> ?arch/arm/mach-omap2/board-4430sdp.c | ? ?7 +++- >> >>>> ?drivers/mfd/twl6030-irq.c ? ? ? ? ? | ? 73 +++++++++++++++++++++++++++++++++++ >> >>>> ?drivers/mmc/host/omap_hsmmc.c ? ? ? | ? ?4 +- >> >>>> ?include/linux/i2c/twl.h ? ? ? ? ? ? | ? 31 +++++++++++++++ >> >>>> ?4 files changed, 112 insertions(+), 3 deletions(-) >> >>>> >> >>>> diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c >> >>>> index 9447644..a49f285 100644 >> >>>> --- a/arch/arm/mach-omap2/board-4430sdp.c >> >>>> +++ b/arch/arm/mach-omap2/board-4430sdp.c >> >>>> @@ -227,9 +227,14 @@ static int omap4_twl6030_hsmmc_late_init(struct device *dev) >> >>>> ? ? ? ?struct omap_mmc_platform_data *pdata = dev->platform_data; >> >>>> >> >>>> ? ? ? ?/* Setting MMC1 Card detect Irq */ >> >>>> - ? ? ? if (pdev->id == 0) >> >>>> + ? ? ? if (pdev->id == 0) { >> >>>> + ? ? ? ? ? ? ? ret = twl6030_mmc_card_detect_config(); >> >>>> + ? ? ? ? ? ? ? if (ret) >> >>>> + ? ? ? ? ? ? ? ? ? ? ? pr_err("Failed configuring MMC1 card detect\n"); >> >>>> ? ? ? ? ? ? ? ?pdata->slots[0].card_detect_irq = TWL6030_IRQ_BASE + >> >>>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?MMCDETECT_INTR_OFFSET; >> >>>> + ? ? ? ? ? ? ? pdata->slots[0].card_detect = twl6030_mmc_card_detect; >> >>>> + ? ? ? } >> >>>> ? ? ? ?return ret; >> >>>> ?} >> >>>> >> >>>> diff --git a/drivers/mfd/twl6030-irq.c b/drivers/mfd/twl6030-irq.c >> >>>> index 10bf228..2d3bb82 100644 >> >>>> --- a/drivers/mfd/twl6030-irq.c >> >>>> +++ b/drivers/mfd/twl6030-irq.c >> >>>> @@ -36,6 +36,7 @@ >> >>>> ?#include <linux/irq.h> >> >>>> ?#include <linux/kthread.h> >> >>>> ?#include <linux/i2c/twl.h> >> >>>> +#include <linux/platform_device.h> >> >>>> >> >>>> ?/* >> >>>> ?* TWL6030 (unlike its predecessors, which had two level interrupt handling) >> >>>> @@ -223,6 +224,78 @@ int twl6030_interrupt_mask(u8 bit_mask, u8 offset) >> >>>> ?} >> >>>> ?EXPORT_SYMBOL(twl6030_interrupt_mask); >> >>>> >> >>>> +int twl6030_mmc_card_detect_config(void) >> >>>> +{ >> >>>> + ? ? ? int ret; >> >>>> + ? ? ? u8 reg_val = 0; >> >>>> + >> >>>> + ? ? ? /* Unmasking the Card detect Interrupt line for MMC1 from Phoenix */ >> >>>> + ? ? ? twl6030_interrupt_unmask(TWL6030_MMCDETECT_INT_MASK, >> >>>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? REG_INT_MSK_LINE_B); >> >>>> + ? ? ? twl6030_interrupt_unmask(TWL6030_MMCDETECT_INT_MASK, >> >>>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? REG_INT_MSK_STS_B); >> >>>> + ? ? ? /* >> >>>> + ? ? ? ?* Intially Configuring MMC_CTRL for receving interrupts & >> >>>> + ? ? ? ?* Card status on TWL6030 for MMC1 >> >>>> + ? ? ? ?*/ >> >>>> + ? ? ? ret = twl_i2c_read_u8(TWL6030_MODULE_ID0, ®_val, TWL6030_MMCCTRL); >> >>>> + ? ? ? if (ret < 0) { >> >>>> + ? ? ? ? ? ? ? pr_err("twl6030: Failed to read MMCCTRL, error %d\n", ret); >> >>>> + ? ? ? ? ? ? ? return ret; >> >>>> + ? ? ? } >> >>>> + ? ? ? reg_val &= ~VMMC_AUTO_OFF; >> >>>> + ? ? ? reg_val |= SW_FC; >> >>>> + ? ? ? ret = twl_i2c_write_u8(TWL6030_MODULE_ID0, reg_val, TWL6030_MMCCTRL); >> >>>> + ? ? ? if (ret < 0) { >> >>>> + ? ? ? ? ? ? ? pr_err("twl6030: Failed to write MMCCTRL, error %d\n", ret); >> >>>> + ? ? ? ? ? ? ? return ret; >> >>>> + ? ? ? } >> >>>> + >> >>>> + ? ? ? /* Configuring PullUp-PullDown register */ >> >>>> + ? ? ? ret = twl_i2c_read_u8(TWL6030_MODULE_ID0, ®_val, >> >>>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TWL6030_CFG_INPUT_PUPD3); >> >>>> + ? ? ? if (ret < 0) { >> >>>> + ? ? ? ? ? ? ? pr_err("twl6030: Failed to read CFG_INPUT_PUPD3, error %d\n", >> >>>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ret); >> >>>> + ? ? ? ? ? ? ? return ret; >> >>>> + ? ? ? } >> >>>> + ? ? ? reg_val &= ~(MMC_PU | MMC_PD); >> >>>> + ? ? ? ret = twl_i2c_write_u8(TWL6030_MODULE_ID0, reg_val, >> >>>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TWL6030_CFG_INPUT_PUPD3); >> >>>> + ? ? ? if (ret < 0) { >> >>>> + ? ? ? ? ? ? ? pr_err("twl6030: Failed to write CFG_INPUT_PUPD3, error %d\n", >> >>>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ret); >> >>>> + ? ? ? ? ? ? ? return ret; >> >>>> + ? ? ? } >> >>>> + ? ? ? return 0; >> >>>> +} >> >>>> +EXPORT_SYMBOL(twl6030_mmc_card_detect_config); >> >>>> + >> >>>> +int twl6030_mmc_card_detect(struct device *dev, int slot) >> >>>> +{ >> >>>> + ? ? ? int ret = -EIO; >> >>>> + ? ? ? u8 read_reg = 0; >> >>>> + ? ? ? struct platform_device *pdev = to_platform_device(dev); >> >>>> + >> >>>> + ? ? ? if (pdev->id) { >> >>>> + ? ? ? ? ? ? ? /* TWL6030 provide's Card detect support for >> >>>> + ? ? ? ? ? ? ? ?* only MMC1 controller. >> >>>> + ? ? ? ? ? ? ? ?*/ >> >>>> + ? ? ? ? ? ? ? pr_err("Unkown MMC controller %d in %s\n", pdev->id, __func__); >> >>>> + ? ? ? ? ? ? ? return ret; >> >>>> + ? ? ? } >> >>>> + ? ? ? /* >> >>>> + ? ? ? ?* BIT0 of MMC_CTRL on TWL6030 provides card status for MMC1 >> >>>> + ? ? ? ?* 0 - Card not present ,1 - Card present >> >>>> + ? ? ? ?*/ >> >>>> + ? ? ? ret = twl_i2c_read_u8(TWL6030_MODULE_ID0, &read_reg, >> >>>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TWL6030_MMCCTRL); >> >>>> + ? ? ? if (ret >= 0) >> >>>> + ? ? ? ? ? ? ? ret = read_reg & STS_MMC; >> >>>> + ? ? ? return ret; >> >>>> +} >> >>>> +EXPORT_SYMBOL(twl6030_mmc_card_detect); >> >>>> + >> >>>> ?int twl6030_init_irq(int irq_num, unsigned irq_base, unsigned irq_end) >> >>>> ?{ >> >>>> >> >>>> diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c >> >>>> index 562dbbb..a51894d 100644 >> >>>> --- a/drivers/mmc/host/omap_hsmmc.c >> >>>> +++ b/drivers/mmc/host/omap_hsmmc.c >> >>>> @@ -466,8 +466,6 @@ static int omap_hsmmc_gpio_init(struct omap_mmc_platform_data *pdata) >> >>>> ? ? ? ?int ret; >> >>>> >> >>>> ? ? ? ?if (gpio_is_valid(pdata->slots[0].switch_pin)) { >> >>>> - ? ? ? ? ? ? ? pdata->suspend = omap_hsmmc_suspend_cdirq; >> >>>> - ? ? ? ? ? ? ? pdata->resume = omap_hsmmc_resume_cdirq; >> >>>> ? ? ? ? ? ? ? ?if (pdata->slots[0].cover) >> >>>> ? ? ? ? ? ? ? ? ? ? ? ?pdata->slots[0].get_cover_state = >> >>>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?omap_hsmmc_get_cover_state; >> >>>> @@ -2211,6 +2209,8 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev) >> >>>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"Unable to grab MMC CD IRQ\n"); >> >>>> ? ? ? ? ? ? ? ? ? ? ? ?goto err_irq_cd; >> >>>> ? ? ? ? ? ? ? ?} >> >>>> + ? ? ? ? ? ? ? pdata->suspend = omap_hsmmc_suspend_cdirq; >> >>>> + ? ? ? ? ? ? ? pdata->resume = omap_hsmmc_resume_cdirq; >> >>>> ? ? ? ?} >> >>>> >> >>>> ? ? ? ?omap_hsmmc_disable_irq(host); >> >>>> diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h >> >>>> index 6de90bf..e64894c 100644 >> >>>> --- a/include/linux/i2c/twl.h >> >>>> +++ b/include/linux/i2c/twl.h >> >>>> @@ -141,6 +141,16 @@ >> >>>> ?#define TWL6030_CHARGER_CTRL_INT_MASK ?0x10 >> >>>> ?#define TWL6030_CHARGER_FAULT_INT_MASK ? ? ? ? 0x60 >> >>>> >> >>>> +#define TWL6030_MMCCTRL ? ? ? ? ? ? ? ?0xEE >> >>>> +#define VMMC_AUTO_OFF ? ? ? ? ? ? ? ? ?(0x1 << 3) >> >>>> +#define SW_FC ? ? ? ? ? ? ? ? ? ? ? ? ?(0x1 << 2) >> >>>> +#define STS_MMC ? ? ? ? ? ? ? ? ? ? ? ?0x1 >> >>>> + >> >>>> +#define TWL6030_CFG_INPUT_PUPD3 ? ? ? ?0xF2 >> >>>> +#define MMC_PU ? ? ? ? ? ? ? ? ? ? ? ? (0x1 << 3) >> >>>> +#define MMC_PD ? ? ? ? ? ? ? ? ? ? ? ? (0x1 << 2) >> >>>> + >> >>>> + >> >>>> >> >>>> ?#define TWL4030_CLASS_ID ? ? ? ? ? ? ? 0x4030 >> >>>> ?#define TWL6030_CLASS_ID ? ? ? ? ? ? ? 0x6030 >> >>>> @@ -173,6 +183,27 @@ int twl_i2c_read(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes); >> >>>> ?int twl6030_interrupt_unmask(u8 bit_mask, u8 offset); >> >>>> ?int twl6030_interrupt_mask(u8 bit_mask, u8 offset); >> >>>> >> >>>> +/* Card detect Configuration for MMC1 Controller on OMAP4 */ >> >>>> +#ifdef CONFIG_TWL4030_CORE >> >>>> +int twl6030_mmc_card_detect_config(void); >> >>>> +#else >> >>>> +static inline int twl6030_mmc_card_detect_config(void) >> >>>> +{ >> >>>> + ? ? ? pr_debug("twl6030_mmc_card_detect_config not supported\n"); >> >>>> + ? ? ? return 0; >> >>>> +} >> >>>> +#endif >> >>>> + >> >>>> +/* MMC1 Controller on OMAP4 uses Phoenix irq for Card detect */ >> >>>> +#ifdef CONFIG_TWL4030_CORE >> >>>> +int twl6030_mmc_card_detect(struct device *dev, int slot); >> >>>> +#else >> >>>> +static inline int twl6030_mmc_card_detect(struct device *dev, int slot) >> >>>> +{ >> >>>> + ? ? ? pr_debug("Call back twl6030_mmc_card_detect not supported\n"); >> >>>> + ? ? ? return -EIO; >> >>>> +} >> >>>> +#endif >> >>>> ?/*----------------------------------------------------------------------*/ >> >>>> >> >>>> ?/* >> >>>> -- >> >>>> 1.7.0.4 >> >>>> >> >>>> >> >>>> -- >> >>>> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in >> >>>> the body of a message to majordomo at vger.kernel.org >> >>>> More majordomo info at ?http://vger.kernel.org/majordomo-info.html >> >>>> >> >>> >> >> >> > > > -- > Intel Open Source Technology Centre > http://oss.intel.com/ > ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v4 1/4] omap4 hsmmc: Adding card detect support for MMC1 2010-10-01 12:02 ` kishore kadiyala @ 2010-10-01 14:41 ` Varadarajan, Charulatha 2010-10-01 14:44 ` kishore kadiyala 0 siblings, 1 reply; 14+ messages in thread From: Varadarajan, Charulatha @ 2010-10-01 14:41 UTC (permalink / raw) To: linux-arm-kernel <<snip>> > >> >>>> diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h > >> >>>> index 6de90bf..e64894c 100644 > >> >>>> --- a/include/linux/i2c/twl.h > >> >>>> +++ b/include/linux/i2c/twl.h > >> >>>> @@ -141,6 +141,16 @@ > >> >>>> ?#define TWL6030_CHARGER_CTRL_INT_MASK ?0x10 > >> >>>> ?#define TWL6030_CHARGER_FAULT_INT_MASK ? ? ? ? 0x60 > >> >>>> > >> >>>> +#define TWL6030_MMCCTRL ? ? ? ? ? ? ? ?0xEE > >> >>>> +#define VMMC_AUTO_OFF ? ? ? ? ? ? ? ? ?(0x1 << 3) > >> >>>> +#define SW_FC ? ? ? ? ? ? ? ? ? ? ? ? ?(0x1 << 2) > >> >>>> +#define STS_MMC ? ? ? ? ? ? ? ? ? ? ? ?0x1 > >> >>>> + > >> >>>> +#define TWL6030_CFG_INPUT_PUPD3 ? ? ? ?0xF2 > >> >>>> +#define MMC_PU ? ? ? ? ? ? ? ? ? ? ? ? (0x1 << 3) > >> >>>> +#define MMC_PD ? ? ? ? ? ? ? ? ? ? ? ? (0x1 << 2) > >> >>>> + > >> >>>> + > >> >>>> > >> >>>> ?#define TWL4030_CLASS_ID ? ? ? ? ? ? ? 0x4030 > >> >>>> ?#define TWL6030_CLASS_ID ? ? ? ? ? ? ? 0x6030 > >> >>>> @@ -173,6 +183,27 @@ int twl_i2c_read(u8 mod_no, u8 > *value, u8 reg, unsigned num_bytes); > >> >>>> ?int twl6030_interrupt_unmask(u8 bit_mask, u8 offset); > >> >>>> ?int twl6030_interrupt_mask(u8 bit_mask, u8 offset); > >> >>>> > >> >>>> +/* Card detect Configuration for MMC1 Controller on OMAP4 */ > >> >>>> +#ifdef CONFIG_TWL4030_CORE > >> >>>> +int twl6030_mmc_card_detect_config(void); > >> >>>> +#else > >> >>>> +static inline int twl6030_mmc_card_detect_config(void) > >> >>>> +{ > >> >>>> + ? ? ? pr_debug("twl6030_mmc_card_detect_config not > supported\n"); > >> >>>> + ? ? ? return 0; > >> >>>> +} > >> >>>> +#endif > >> >>>> + > >> >>>> +/* MMC1 Controller on OMAP4 uses Phoenix irq for > Card detect */ > >> >>>> +#ifdef CONFIG_TWL4030_CORE > >> >>>> +int twl6030_mmc_card_detect(struct device *dev, int slot); > >> >>>> +#else > >> >>>> +static inline int twl6030_mmc_card_detect(struct > device *dev, int slot) > >> >>>> +{ > >> >>>> + ? ? ? pr_debug("Call back twl6030_mmc_card_detect > not supported\n"); Use dev_dbg() instead of pr_debug... Same comment applies across this patch series whereever pr_err/pr_debug APIs are used. > >> >>>> + ? ? ? return -EIO; > >> >>>> +} > >> >>>> +#endif <<snip>> ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v4 1/4] omap4 hsmmc: Adding card detect support for MMC1 2010-10-01 14:41 ` Varadarajan, Charulatha @ 2010-10-01 14:44 ` kishore kadiyala 2010-10-01 14:54 ` Varadarajan, Charulatha 2010-10-20 13:11 ` DebBarma, Tarun Kanti 0 siblings, 2 replies; 14+ messages in thread From: kishore kadiyala @ 2010-10-01 14:44 UTC (permalink / raw) To: linux-arm-kernel On Fri, Oct 1, 2010 at 8:11 PM, Varadarajan, Charulatha <charu@ti.com> wrote: > > <<snip>> > >> >> >>>> diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h >> >> >>>> index 6de90bf..e64894c 100644 >> >> >>>> --- a/include/linux/i2c/twl.h >> >> >>>> +++ b/include/linux/i2c/twl.h >> >> >>>> @@ -141,6 +141,16 @@ >> >> >>>> ?#define TWL6030_CHARGER_CTRL_INT_MASK ?0x10 >> >> >>>> ?#define TWL6030_CHARGER_FAULT_INT_MASK ? ? ? ? 0x60 >> >> >>>> >> >> >>>> +#define TWL6030_MMCCTRL ? ? ? ? ? ? ? ?0xEE >> >> >>>> +#define VMMC_AUTO_OFF ? ? ? ? ? ? ? ? ?(0x1 << 3) >> >> >>>> +#define SW_FC ? ? ? ? ? ? ? ? ? ? ? ? ?(0x1 << 2) >> >> >>>> +#define STS_MMC ? ? ? ? ? ? ? ? ? ? ? ?0x1 >> >> >>>> + >> >> >>>> +#define TWL6030_CFG_INPUT_PUPD3 ? ? ? ?0xF2 >> >> >>>> +#define MMC_PU ? ? ? ? ? ? ? ? ? ? ? ? (0x1 << 3) >> >> >>>> +#define MMC_PD ? ? ? ? ? ? ? ? ? ? ? ? (0x1 << 2) >> >> >>>> + >> >> >>>> + >> >> >>>> >> >> >>>> ?#define TWL4030_CLASS_ID ? ? ? ? ? ? ? 0x4030 >> >> >>>> ?#define TWL6030_CLASS_ID ? ? ? ? ? ? ? 0x6030 >> >> >>>> @@ -173,6 +183,27 @@ int twl_i2c_read(u8 mod_no, u8 >> *value, u8 reg, unsigned num_bytes); >> >> >>>> ?int twl6030_interrupt_unmask(u8 bit_mask, u8 offset); >> >> >>>> ?int twl6030_interrupt_mask(u8 bit_mask, u8 offset); >> >> >>>> >> >> >>>> +/* Card detect Configuration for MMC1 Controller on OMAP4 */ >> >> >>>> +#ifdef CONFIG_TWL4030_CORE >> >> >>>> +int twl6030_mmc_card_detect_config(void); >> >> >>>> +#else >> >> >>>> +static inline int twl6030_mmc_card_detect_config(void) >> >> >>>> +{ >> >> >>>> + ? ? ? pr_debug("twl6030_mmc_card_detect_config not >> supported\n"); >> >> >>>> + ? ? ? return 0; >> >> >>>> +} >> >> >>>> +#endif >> >> >>>> + >> >> >>>> +/* MMC1 Controller on OMAP4 uses Phoenix irq for >> Card detect */ >> >> >>>> +#ifdef CONFIG_TWL4030_CORE >> >> >>>> +int twl6030_mmc_card_detect(struct device *dev, int slot); >> >> >>>> +#else >> >> >>>> +static inline int twl6030_mmc_card_detect(struct >> device *dev, int slot) >> >> >>>> +{ >> >> >>>> + ? ? ? pr_debug("Call back twl6030_mmc_card_detect >> not supported\n"); > > Use dev_dbg() instead of pr_debug... > Same comment applies across this patch series whereever pr_err/pr_debug > APIs are used. Couldn't get it how it makes a difference ? could you explain Regards, Kishore > >> >> >>>> + ? ? ? return -EIO; >> >> >>>> +} >> >> >>>> +#endif > > <<snip>> ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v4 1/4] omap4 hsmmc: Adding card detect support for MMC1 2010-10-01 14:44 ` kishore kadiyala @ 2010-10-01 14:54 ` Varadarajan, Charulatha 2010-10-20 13:11 ` DebBarma, Tarun Kanti 1 sibling, 0 replies; 14+ messages in thread From: Varadarajan, Charulatha @ 2010-10-01 14:54 UTC (permalink / raw) To: linux-arm-kernel > -----Original Message----- > From: kishore kadiyala [mailto:kishorek.kadiyala at gmail.com] > Sent: Friday, October 01, 2010 8:15 PM > To: Varadarajan, Charulatha > Cc: Samuel Ortiz; linux-mmc at vger.kernel.org; linux-omap at vger.kernel.org; > linux-arm-kernel at lists.infradead.org; tony at atomide.com; akpm at linux- > foundation.org; Chikkature Rajashekar, Madhusudhan; > adrian.hunter at nokia.com > Subject: Re: [PATCH v4 1/4] omap4 hsmmc: Adding card detect support for > MMC1 > > On Fri, Oct 1, 2010 at 8:11 PM, Varadarajan, Charulatha <charu@ti.com> > wrote: > > > > <<snip>> > > > >> >> >>>> diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h > >> >> >>>> index 6de90bf..e64894c 100644 > >> >> >>>> --- a/include/linux/i2c/twl.h > >> >> >>>> +++ b/include/linux/i2c/twl.h > >> >> >>>> @@ -141,6 +141,16 @@ > >> >> >>>> ?#define TWL6030_CHARGER_CTRL_INT_MASK ?0x10 > >> >> >>>> ?#define TWL6030_CHARGER_FAULT_INT_MASK ? ? ? ? 0x60 > >> >> >>>> > >> >> >>>> +#define TWL6030_MMCCTRL ? ? ? ? ? ? ? ?0xEE > >> >> >>>> +#define VMMC_AUTO_OFF ? ? ? ? ? ? ? ? ?(0x1 << 3) > >> >> >>>> +#define SW_FC ? ? ? ? ? ? ? ? ? ? ? ? ?(0x1 << 2) > >> >> >>>> +#define STS_MMC ? ? ? ? ? ? ? ? ? ? ? ?0x1 > >> >> >>>> + > >> >> >>>> +#define TWL6030_CFG_INPUT_PUPD3 ? ? ? ?0xF2 > >> >> >>>> +#define MMC_PU ? ? ? ? ? ? ? ? ? ? ? ? (0x1 << 3) > >> >> >>>> +#define MMC_PD ? ? ? ? ? ? ? ? ? ? ? ? (0x1 << 2) > >> >> >>>> + > >> >> >>>> + > >> >> >>>> > >> >> >>>> ?#define TWL4030_CLASS_ID ? ? ? ? ? ? ? 0x4030 > >> >> >>>> ?#define TWL6030_CLASS_ID ? ? ? ? ? ? ? 0x6030 > >> >> >>>> @@ -173,6 +183,27 @@ int twl_i2c_read(u8 mod_no, u8 > >> *value, u8 reg, unsigned num_bytes); > >> >> >>>> ?int twl6030_interrupt_unmask(u8 bit_mask, u8 offset); > >> >> >>>> ?int twl6030_interrupt_mask(u8 bit_mask, u8 offset); > >> >> >>>> > >> >> >>>> +/* Card detect Configuration for MMC1 Controller on OMAP4 */ > >> >> >>>> +#ifdef CONFIG_TWL4030_CORE > >> >> >>>> +int twl6030_mmc_card_detect_config(void); > >> >> >>>> +#else > >> >> >>>> +static inline int twl6030_mmc_card_detect_config(void) > >> >> >>>> +{ > >> >> >>>> + ? ? ? pr_debug("twl6030_mmc_card_detect_config not > >> supported\n"); > >> >> >>>> + ? ? ? return 0; > >> >> >>>> +} > >> >> >>>> +#endif > >> >> >>>> + > >> >> >>>> +/* MMC1 Controller on OMAP4 uses Phoenix irq for > >> Card detect */ > >> >> >>>> +#ifdef CONFIG_TWL4030_CORE > >> >> >>>> +int twl6030_mmc_card_detect(struct device *dev, int slot); > >> >> >>>> +#else > >> >> >>>> +static inline int twl6030_mmc_card_detect(struct > >> device *dev, int slot) > >> >> >>>> +{ > >> >> >>>> + ? ? ? pr_debug("Call back twl6030_mmc_card_detect > >> not supported\n"); > > > > Use dev_dbg() instead of pr_debug... > > Same comment applies across this patch series whereever pr_err/pr_debug > > APIs are used. > > Couldn't get it how it makes a difference ? could you explain > device information gets added for debug prints which is very useful while debugging > Regards, > Kishore > > > >> >> >>>> + ? ? ? return -EIO; > >> >> >>>> +} > >> >> >>>> +#endif > > > > <<snip>> ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v4 1/4] omap4 hsmmc: Adding card detect support for MMC1 2010-10-01 14:44 ` kishore kadiyala 2010-10-01 14:54 ` Varadarajan, Charulatha @ 2010-10-20 13:11 ` DebBarma, Tarun Kanti 1 sibling, 0 replies; 14+ messages in thread From: DebBarma, Tarun Kanti @ 2010-10-20 13:11 UTC (permalink / raw) To: linux-arm-kernel > -----Original Message----- > From: linux-omap-owner at vger.kernel.org [mailto:linux-omap- > owner at vger.kernel.org] On Behalf Of kishore kadiyala > Sent: Friday, October 01, 2010 8:15 PM > To: Varadarajan, Charulatha > Cc: Samuel Ortiz; linux-mmc at vger.kernel.org; linux-omap at vger.kernel.org; > linux-arm-kernel at lists.infradead.org; tony at atomide.com; akpm at linux- > foundation.org; Chikkature Rajashekar, Madhusudhan; > adrian.hunter at nokia.com > Subject: Re: [PATCH v4 1/4] omap4 hsmmc: Adding card detect support for > MMC1 > > On Fri, Oct 1, 2010 at 8:11 PM, Varadarajan, Charulatha <charu@ti.com> > wrote: > > > > <<snip>> > > > >> >> >>>> diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h > >> >> >>>> index 6de90bf..e64894c 100644 > >> >> >>>> --- a/include/linux/i2c/twl.h > >> >> >>>> +++ b/include/linux/i2c/twl.h > >> >> >>>> @@ -141,6 +141,16 @@ > >> >> >>>> ?#define TWL6030_CHARGER_CTRL_INT_MASK ?0x10 > >> >> >>>> ?#define TWL6030_CHARGER_FAULT_INT_MASK ? ? ? ? 0x60 > >> >> >>>> > >> >> >>>> +#define TWL6030_MMCCTRL ? ? ? ? ? ? ? ?0xEE > >> >> >>>> +#define VMMC_AUTO_OFF ? ? ? ? ? ? ? ? ?(0x1 << 3) > >> >> >>>> +#define SW_FC ? ? ? ? ? ? ? ? ? ? ? ? ?(0x1 << 2) > >> >> >>>> +#define STS_MMC ? ? ? ? ? ? ? ? ? ? ? ?0x1 > >> >> >>>> + > >> >> >>>> +#define TWL6030_CFG_INPUT_PUPD3 ? ? ? ?0xF2 > >> >> >>>> +#define MMC_PU ? ? ? ? ? ? ? ? ? ? ? ? (0x1 << 3) > >> >> >>>> +#define MMC_PD ? ? ? ? ? ? ? ? ? ? ? ? (0x1 << 2) > >> >> >>>> + > >> >> >>>> + > >> >> >>>> > >> >> >>>> ?#define TWL4030_CLASS_ID ? ? ? ? ? ? ? 0x4030 > >> >> >>>> ?#define TWL6030_CLASS_ID ? ? ? ? ? ? ? 0x6030 > >> >> >>>> @@ -173,6 +183,27 @@ int twl_i2c_read(u8 mod_no, u8 > >> *value, u8 reg, unsigned num_bytes); > >> >> >>>> ?int twl6030_interrupt_unmask(u8 bit_mask, u8 offset); > >> >> >>>> ?int twl6030_interrupt_mask(u8 bit_mask, u8 offset); > >> >> >>>> > >> >> >>>> +/* Card detect Configuration for MMC1 Controller on OMAP4 */ > >> >> >>>> +#ifdef CONFIG_TWL4030_CORE > >> >> >>>> +int twl6030_mmc_card_detect_config(void); > >> >> >>>> +#else > >> >> >>>> +static inline int twl6030_mmc_card_detect_config(void) > >> >> >>>> +{ > >> >> >>>> + ? ? ? pr_debug("twl6030_mmc_card_detect_config not > >> supported\n"); > >> >> >>>> + ? ? ? return 0; > >> >> >>>> +} > >> >> >>>> +#endif > >> >> >>>> + > >> >> >>>> +/* MMC1 Controller on OMAP4 uses Phoenix irq for > >> Card detect */ > >> >> >>>> +#ifdef CONFIG_TWL4030_CORE > >> >> >>>> +int twl6030_mmc_card_detect(struct device *dev, int slot); > >> >> >>>> +#else > >> >> >>>> +static inline int twl6030_mmc_card_detect(struct > >> device *dev, int slot) > >> >> >>>> +{ > >> >> >>>> + ? ? ? pr_debug("Call back twl6030_mmc_card_detect > >> not supported\n"); > > > > Use dev_dbg() instead of pr_debug... > > Same comment applies across this patch series whereever pr_err/pr_debug > > APIs are used. > > Couldn't get it how it makes a difference ? could you explain One things which I can think of is dev_dbg() would contain the device name so that you know which device the error is associated with. -tarun > > > > >> >> >>>> + ? ? ? return -EIO; > >> >> >>>> +} > >> >> >>>> +#endif > > > > <<snip>> > -- > To unsubscribe from this list: send the line "unsubscribe linux-omap" in > the body of a message to majordomo at vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v4 1/4] omap4 hsmmc: Adding card detect support for MMC1 2010-09-24 17:13 [PATCH v4 1/4] omap4 hsmmc: Adding card detect support for MMC1 kishore kadiyala 2010-09-25 0:38 ` Tony Lindgren 2010-09-27 7:55 ` kishore kadiyala @ 2010-10-01 14:46 ` Varadarajan, Charulatha 2 siblings, 0 replies; 14+ messages in thread From: Varadarajan, Charulatha @ 2010-10-01 14:46 UTC (permalink / raw) To: linux-arm-kernel Kishore, <<snip>> A minor comment > +int twl6030_mmc_card_detect(struct device *dev, int slot) > +{ > + int ret = -EIO; > + u8 read_reg = 0; > + struct platform_device *pdev = to_platform_device(dev); > + > + if (pdev->id) { > + /* TWL6030 provide's Card detect support for > + * only MMC1 controller. > + */ Check multiline comment style > + pr_err("Unkown MMC controller %d in %s\n", > pdev->id, __func__); > + return ret; > + } > + /* > + * BIT0 of MMC_CTRL on TWL6030 provides card status for MMC1 > + * 0 - Card not present ,1 - Card present > + */ > + ret = twl_i2c_read_u8(TWL6030_MODULE_ID0, &read_reg, > + TWL6030_MMCCTRL); > + if (ret >= 0) > + ret = read_reg & STS_MMC; > + return ret; > +} > +EXPORT_SYMBOL(twl6030_mmc_card_detect); > + <<snip>> ^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2010-10-20 13:11 UTC | newest] Thread overview: 14+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-09-24 17:13 [PATCH v4 1/4] omap4 hsmmc: Adding card detect support for MMC1 kishore kadiyala 2010-09-25 0:38 ` Tony Lindgren 2010-09-27 7:52 ` kishore kadiyala 2010-09-27 7:55 ` kishore kadiyala 2010-09-28 6:52 ` kishore kadiyala 2010-09-29 10:41 ` kishore kadiyala 2010-10-01 6:59 ` kishore kadiyala 2010-10-01 11:29 ` Samuel Ortiz 2010-10-01 12:02 ` kishore kadiyala 2010-10-01 14:41 ` Varadarajan, Charulatha 2010-10-01 14:44 ` kishore kadiyala 2010-10-01 14:54 ` Varadarajan, Charulatha 2010-10-20 13:11 ` DebBarma, Tarun Kanti 2010-10-01 14:46 ` Varadarajan, Charulatha
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).