* [PATCH v2 1/4] omap4 hsmmc: Adding card detect support for MMC1
@ 2010-09-18 16:33 kishore kadiyala
2010-09-22 8:51 ` Felipe Balbi
0 siblings, 1 reply; 3+ messages in thread
From: kishore kadiyala @ 2010-09-18 16:33 UTC (permalink / raw)
To: linux-arm-kernel
Adding card detect callback function and card detect configuration
function for MMC1 Controller.
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 and the card detect call back function provides card present/absent
status by reading MMC Control register.
Signed-off-by: Kishore Kadiyala <kishore.kadiyala@ti.com>
---
arch/arm/mach-omap2/board-4430sdp.c | 7 +++-
drivers/mfd/twl6030-irq.c | 76 +++++++++++++++++++++++++++++++++++
drivers/mmc/host/omap_hsmmc.c | 4 +-
include/linux/i2c/twl.h | 31 ++++++++++++++
4 files changed, 115 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..de232b1 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,81 @@ 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 */
+ if (twl_class_is_6030()) {
+ 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 = container_of(dev,
+ struct platform_device, dev);
+
+ switch (pdev->id) {
+ case 0:
+ /*
+ * BIT0 of REG_MMC_CTRL
+ * 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;
+ break;
+ default:
+ pr_err("Unkown MMC controller %d in %s\n", pdev->id, __func__);
+ }
+ 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..eba9541 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_err("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_err("Call back twl6030_mmc_card_detect not supported\n");
+ return -EIO;
+}
+#endif
/*----------------------------------------------------------------------*/
/*
--
1.7.0.4
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH v2 1/4] omap4 hsmmc: Adding card detect support for MMC1
2010-09-18 16:33 [PATCH v2 1/4] omap4 hsmmc: Adding card detect support for MMC1 kishore kadiyala
@ 2010-09-22 8:51 ` Felipe Balbi
2010-09-22 9:38 ` kishore kadiyala
0 siblings, 1 reply; 3+ messages in thread
From: Felipe Balbi @ 2010-09-22 8:51 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
On Sat, Sep 18, 2010 at 11:33:56AM -0500, kishore kadiyala wrote:
>@@ -223,6 +224,81 @@ 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 */
>+ if (twl_class_is_6030()) {
which other class can this be ?
>+ /*
>+ * 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);
is this a gpio ? Could gpiolib take care of this ?
>+ 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);
ditto.
>+int twl6030_mmc_card_detect(struct device *dev, int slot)
>+{
>+ int ret = -EIO;
>+ u8 read_reg = 0;
>+ struct platform_device *pdev = container_of(dev,
>+ struct platform_device, dev);
how about:
struct platform_device *pdev = to_platform_device(dev);
>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;
this doesn't look to be part of $SUBJECT, care to explain ?
>@@ -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_err("twl6030_mmc_card_detect_config not supported\n");
pr_debug() would be better ??
>+/* 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_err("Call back twl6030_mmc_card_detect not supported\n");
ditto.
--
balbi
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH v2 1/4] omap4 hsmmc: Adding card detect support for MMC1
2010-09-22 8:51 ` Felipe Balbi
@ 2010-09-22 9:38 ` kishore kadiyala
0 siblings, 0 replies; 3+ messages in thread
From: kishore kadiyala @ 2010-09-22 9:38 UTC (permalink / raw)
To: linux-arm-kernel
Hi balbi,
On Wed, Sep 22, 2010 at 2:21 PM, Felipe Balbi <balbi@ti.com> wrote:
> Hi,
>
> On Sat, Sep 18, 2010 at 11:33:56AM -0500, kishore kadiyala wrote:
>>
>> @@ -223,6 +224,81 @@ 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
>> */
>> + ? ? ? if (twl_class_is_6030()) {
>
> which other class can this be ?
It can only be a 6030 class.
as twl6030_mmc_card_detect_config is called only in board file I can
remove the check.
>
>> + ? ? ? /*
>> + ? ? ? ?* 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);
>
> is this a gpio ? Could gpiolib take care of this ?
This is not a gpio but an interrupt line from twl6030 to MMC controller
>
>> + ? ? ? 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);
>
> ditto.
This is not a gpio
>
>> +int twl6030_mmc_card_detect(struct device *dev, int slot)
>> +{
>> + ? ? ? int ret = -EIO;
>> + ? ? ? u8 read_reg = 0;
>> + ? ? ? struct platform_device *pdev = container_of(dev,
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? struct platform_device, dev);
>
> how about:
>
> ? ? ? ?struct platform_device *pdev = to_platform_device(dev);
ok will use this .
>
>> 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;
>
> this doesn't look to be part of $SUBJECT, care to explain ?
I've just moved the initialization of suspend & resume which was
previously done in omap_hsmmc_gpio_init.
Ok will update in the log
>
>> @@ -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_err("twl6030_mmc_card_detect_config not supported\n");
>
> pr_debug() would be better ??
ok will update with pr_debug
>
>> +/* 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_err("Call back twl6030_mmc_card_detect not supported\n");
>
> ditto.
ok will update with pr_debug
>
> --
> balbi
Regards,
Kishore
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2010-09-22 9:38 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-09-18 16:33 [PATCH v2 1/4] omap4 hsmmc: Adding card detect support for MMC1 kishore kadiyala
2010-09-22 8:51 ` Felipe Balbi
2010-09-22 9:38 ` kishore kadiyala
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).