summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSeshendra Gadagottu <sgadagottu@nvidia.com>2011-11-17 11:35:08 +0530
committerVarun Wadekar <vwadekar@nvidia.com>2011-12-15 11:40:13 +0530
commit2ba736d71d0903d86290fe00505aacc18065d3cf (patch)
treebfd9230959e2189007acba8879b335ad165c58a4
parent8c484387c9b969a21b7a032ec22da0b845dc05d5 (diff)
arm: tegra: comms: dynamic loading of hcd driver
ehci on/off mechanism is replaced with dynamic add/removel of ehci-hcd driver. BUG 787270 Reviewed-on: http://git-master/r/65091 (cherry picked from commit 50381a027547354140d599876f452ff6a304e330) Change-Id: Ic9827c23fdbf367b87bb4ba153b65e7c867576d3 Reviewed-on: http://git-master/r/68391 Reviewed-by: Seshendra Gadagottu <sgadagottu@nvidia.com> Tested-by: Seshendra Gadagottu <sgadagottu@nvidia.com> Reviewed-by: Venkat Moganty <vmoganty@nvidia.com>
-rw-r--r--arch/arm/mach-tegra/baseband-xmm-power.c74
-rw-r--r--arch/arm/mach-tegra/baseband-xmm-power.h2
-rw-r--r--arch/arm/mach-tegra/baseband-xmm-power2.c63
3 files changed, 55 insertions, 84 deletions
diff --git a/arch/arm/mach-tegra/baseband-xmm-power.c b/arch/arm/mach-tegra/baseband-xmm-power.c
index 26ca73d3c4f5..215f63dbb1ed 100644
--- a/arch/arm/mach-tegra/baseband-xmm-power.c
+++ b/arch/arm/mach-tegra/baseband-xmm-power.c
@@ -140,7 +140,7 @@ static int baseband_xmm_power_on(struct platform_device *device)
pr_debug("%s - %d\n", __func__, __LINE__);
- /* register / turn on usb host controller */
+ /* register usb host controller */
if (!modem_flash) {
pr_debug("%s - %d\n", __func__, __LINE__);
/* register usb host controller only once */
@@ -148,24 +148,18 @@ static int baseband_xmm_power_on(struct platform_device *device)
pr_debug("%s: register usb host controller\n",
__func__);
modem_power_on = true;
- platform_device_register(data->modem.xmm.hsic_device);
+ if (data->hsic_register)
+ data->modem.xmm.hsic_device =
+ data->hsic_register();
+ else
+ pr_err("%s: hsic_register is missing\n",
+ __func__);
register_hsic_device = false;
} else {
- /* turn on ehci controller */
- mm_segment_t oldfs;
- struct file *filp;
- pr_debug("%s: register usb host controller echo on\n",
- __func__);
- oldfs = get_fs();
- set_fs(KERNEL_DS);
- filp = filp_open(TEGRA_EHCI_DEVICE, O_RDWR, 0);
- if (IS_ERR(filp) || (filp == NULL)) {
- pr_err("open ehci_power failed\n");
- } else {
- filp->f_op->write(filp, "1", 1, &filp->f_pos);
- filp_close(filp, NULL);
- }
- set_fs(oldfs);
+ /* register usb host controller */
+ if (data->hsic_register)
+ data->modem.xmm.hsic_device =
+ data->hsic_register();
/* turn on modem */
pr_debug("%s call baseband_modem_power_on\n", __func__);
baseband_modem_power_on(data);
@@ -195,21 +189,12 @@ static int baseband_xmm_power_off(struct platform_device *device)
return -EINVAL;
}
- /* turn off usb host controller */
- {
- mm_segment_t oldfs;
- struct file *filp;
- oldfs = get_fs();
- set_fs(KERNEL_DS);
- filp = filp_open(TEGRA_EHCI_DEVICE, O_RDWR, 0);
- if (IS_ERR(filp) || (filp == NULL)) {
- pr_err("open ehci_power failed\n");
- } else {
- filp->f_op->write(filp, "0", 1, &filp->f_pos);
- filp_close(filp, NULL);
- }
- set_fs(oldfs);
- }
+ /* unregister usb host controller */
+ pr_info("%s: hsic device: %x\n", __func__, data->modem.xmm.hsic_device);
+ if (data->hsic_unregister)
+ data->hsic_unregister(data->modem.xmm.hsic_device);
+ else
+ pr_err("%s: hsic_unregister is missing\n", __func__);
/* set IPC_HSIC_ACTIVE low */
gpio_set_value(baseband_power_driver_data->
@@ -316,7 +301,6 @@ void baseband_xmm_set_power_status(unsigned int status)
}
EXPORT_SYMBOL_GPL(baseband_xmm_set_power_status);
-
irqreturn_t baseband_xmm_power_ipc_ap_wake_irq(int irq, void *dev_id)
{
int value;
@@ -458,7 +442,10 @@ static void baseband_xmm_power_init2_work(struct work_struct *work)
/* register usb host controller only once */
if (register_hsic_device) {
- platform_device_register(data->modem.xmm.hsic_device);
+ if (data->hsic_register)
+ data->modem.xmm.hsic_device = data->hsic_register();
+ else
+ pr_err("%s: hsic_register is missing\n", __func__);
register_hsic_device = false;
}
@@ -555,8 +542,11 @@ static void baseband_xmm_power_work_func(struct work_struct *work)
pr_debug("BBXMM_WORK_INIT_FLASH_STEP1\n");
/* register usb host controller */
pr_debug("%s: register usb host controller\n", __func__);
- platform_device_register(baseband_power_driver_data->modem
- .xmm.hsic_device);
+ if (baseband_power_driver_data->hsic_register)
+ baseband_power_driver_data->modem.xmm.hsic_device =
+ baseband_power_driver_data->hsic_register();
+ else
+ pr_err("%s: hsic_register is missing\n", __func__);
break;
case BBXMM_WORK_INIT_FLASH_PM_STEP1:
pr_debug("BBXMM_WORK_INIT_FLASH_PM_STEP1\n");
@@ -583,8 +573,11 @@ static void baseband_xmm_power_work_func(struct work_struct *work)
mdelay(enum_delay_ms);
/* register usb host controller */
pr_debug("%s: register usb host controller\n", __func__);
- platform_device_register(baseband_power_driver_data->modem
- .xmm.hsic_device);
+ if (baseband_power_driver_data->hsic_register)
+ baseband_power_driver_data->modem.xmm.hsic_device =
+ baseband_power_driver_data->hsic_register();
+ else
+ pr_err("%s: hsic_register is missing\n", __func__);
/* go to next state */
bbxmm_work->state = (modem_ver < XMM_MODEM_VER_1130)
? BBXMM_WORK_INIT_FLASH_PM_VER_LT_1130_STEP1
@@ -810,7 +803,10 @@ static int baseband_xmm_power_driver_remove(struct platform_device *device)
device_remove_file(dev, &dev_attr_xmm_onoff);
/* unregister usb host controller */
- platform_device_unregister(data->modem.xmm.hsic_device);
+ if (data->hsic_unregister)
+ data->hsic_unregister(data->modem.xmm.hsic_device);
+ else
+ pr_err("%s: hsic_unregister is missing\n", __func__);
return 0;
}
diff --git a/arch/arm/mach-tegra/baseband-xmm-power.h b/arch/arm/mach-tegra/baseband-xmm-power.h
index 0445714a0acc..0768ed191b05 100644
--- a/arch/arm/mach-tegra/baseband-xmm-power.h
+++ b/arch/arm/mach-tegra/baseband-xmm-power.h
@@ -40,6 +40,8 @@ enum baseband_type {
struct baseband_power_platform_data {
enum baseband_type baseband_type;
+ struct platform_device* (*hsic_register)(void);
+ void (*hsic_unregister)(struct platform_device *);
union {
struct {
int mdm_reset;
diff --git a/arch/arm/mach-tegra/baseband-xmm-power2.c b/arch/arm/mach-tegra/baseband-xmm-power2.c
index bdb3fe3cfba3..dd05202ba6ec 100644
--- a/arch/arm/mach-tegra/baseband-xmm-power2.c
+++ b/arch/arm/mach-tegra/baseband-xmm-power2.c
@@ -230,21 +230,12 @@ static void baseband_xmm_power2_flashless_pm_ver_lt_1130_step2
/* wait 1 ms */
mdelay(1);
- /* turn on usb host controller */
- {
- mm_segment_t oldfs;
- struct file *filp;
- oldfs = get_fs();
- set_fs(KERNEL_DS);
- filp = filp_open(TEGRA_EHCI_DEVICE, O_RDWR, 0);
- if (IS_ERR(filp) || (filp == NULL)) {
- pr_err("open ehci_power failed\n");
- } else {
- filp->f_op->write(filp, "1", 1, &filp->f_pos);
- filp_close(filp, NULL);
- }
- set_fs(oldfs);
- }
+ /* unregister usb host controller */
+ if (baseband_power2_driver_data->hsic_unregister)
+ baseband_power2_driver_data->hsic_unregister(
+ baseband_power2_driver_data->modem.xmm.hsic_device);
+ else
+ pr_err("%s: hsic_unregister is missing\n", __func__);
/* set IPC_HSIC_ACTIVE high */
gpio_set_value(baseband_power2_driver_data->
@@ -282,21 +273,12 @@ static void baseband_xmm_power2_flashless_pm_ver_ge_1130_step1
if (!baseband_power2_driver_data)
return;
- /* turn off usb host controller */
- {
- mm_segment_t oldfs;
- struct file *filp;
- oldfs = get_fs();
- set_fs(KERNEL_DS);
- filp = filp_open(TEGRA_EHCI_DEVICE, O_RDWR, 0);
- if (IS_ERR(filp) || (filp == NULL)) {
- pr_err("open ehci_power failed\n");
- } else {
- filp->f_op->write(filp, "0", 1, &filp->f_pos);
- filp_close(filp, NULL);
- }
- set_fs(oldfs);
- }
+ /* unregister usb host controller */
+ if (baseband_power2_driver_data->hsic_unregister)
+ baseband_power2_driver_data->hsic_unregister(
+ baseband_power2_driver_data->modem.xmm.hsic_device);
+ else
+ pr_err("%s: hsic_unregister is missing\n", __func__);
/* wait X ms */
mdelay(X);
@@ -326,21 +308,12 @@ static void baseband_xmm_power2_flashless_pm_ver_ge_1130_step2
/* wait Y ms */
mdelay(Y);
- /* turn on usb host controller */
- {
- mm_segment_t oldfs;
- struct file *filp;
- oldfs = get_fs();
- set_fs(KERNEL_DS);
- filp = filp_open(TEGRA_EHCI_DEVICE, O_RDWR, 0);
- if (IS_ERR(filp) || (filp == NULL)) {
- pr_err("open ehci_power failed\n");
- } else {
- filp->f_op->write(filp, "1", 1, &filp->f_pos);
- filp_close(filp, NULL);
- }
- set_fs(oldfs);
- }
+ /* register usb host controller */
+ if (baseband_power2_driver_data->hsic_register)
+ baseband_power2_driver_data->modem.xmm.hsic_device =
+ baseband_power2_driver_data->hsic_register();
+ else
+ pr_err("%s: hsic_register is missing\n", __func__);
/* wait Z ms */
mdelay(Z);