diff options
author | Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com> | 2011-05-22 23:22:42 +0200 |
---|---|---|
committer | Philippe LANGLAIS <philippe.langlais@stericsson.com> | 2011-05-24 08:26:11 +0200 |
commit | fe661018f93da9a823447d2813eea8d9b0b43db2 (patch) | |
tree | b9df1ae6d9638da75d3830f576634ca28ff3c519 | |
parent | ea46b1c727697ac60318bfe1d38695ced0554a3d (diff) |
cw1200: Request SDIO pins at device registration.
ux500 platform requires hardware pins to be explicitly requested.
Change-Id: I739b6badfb5d19e6e1c49eb8232df3b8aaa958e9
Signed-off-by: Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/23620
Reviewed-by: Par-Gunnar HJALMDAHL <par-gunnar.p.hjalmdahl@stericsson.com>
Reviewed-by: Bartosz MARKOWSKI <bartosz.markowski@tieto.com>
Reviewed-by: Janusz DZIEDZIC <janusz.dziedzic@tieto.com>
Reviewed-by: Philippe LANGLAIS <philippe.langlais@stericsson.com>
-rw-r--r-- | arch/arm/mach-ux500/board-mop500-wlan.c | 42 |
1 files changed, 40 insertions, 2 deletions
diff --git a/arch/arm/mach-ux500/board-mop500-wlan.c b/arch/arm/mach-ux500/board-mop500-wlan.c index c24069600ca..90b17e70e23 100644 --- a/arch/arm/mach-ux500/board-mop500-wlan.c +++ b/arch/arm/mach-ux500/board-mop500-wlan.c @@ -9,6 +9,8 @@ #include <linux/platform_device.h> #include <asm/mach-types.h> #include <mach/irqs-board-mop500.h> +#include <plat/pincfg.h> +#include "pins.h" #include "../drivers/staging/cw1200/cw1200_plat.h" static void cw1200_release(struct device *dev); @@ -66,8 +68,36 @@ const struct cw1200_platform_data *cw1200_get_platform_data(void) } EXPORT_SYMBOL_GPL(cw1200_get_platform_data); +static int cw1200_pins_enable(bool enable) +{ + struct ux500_pins *pins; + int ret = 0; + + pins = ux500_pins_get("sdi1"); + if (!pins) { + printk(KERN_ERR "cw1200: Pins are not found. " + "Check platform data.\n"); + return -ENOENT; + } + + if (enable) + ret = ux500_pins_enable(pins); + else + ret = ux500_pins_disable(pins); + + if (ret) + printk(KERN_ERR "cw1200: Pins can not be %s: %d.\n", + enable ? "enabled" : "disabled", + ret); + + ux500_pins_put(pins); + + return ret; +} + int __init mop500_wlan_init(void) { + int ret; if (machine_is_snowball() || machine_is_u8500() || machine_is_u5500() || @@ -99,10 +129,18 @@ int __init mop500_wlan_init(void) cw1200_device.dev.release = cw1200_release; - return platform_device_register(&cw1200_device); + ret = cw1200_pins_enable(true); + if (WARN_ON(ret)) + return ret; + + ret = platform_device_register(&cw1200_device); + if (ret) + cw1200_pins_enable(false); + + return ret; } static void cw1200_release(struct device *dev) { - /* Do nothing: release is handled by SDIO stack */ + cw1200_pins_enable(false); } |