summaryrefslogtreecommitdiff
path: root/arch/arm/plat-mxc
diff options
context:
space:
mode:
authorXinyu Chen <xinyu.chen@freescale.com>2012-08-01 10:03:09 +0800
committerXinyu Chen <xinyu.chen@freescale.com>2012-08-01 10:03:09 +0800
commitd81dac54ea06a1f8a74acf91499d5946d94d9e6a (patch)
treea137a6698343f3dfb880456cc4d89872f2a9b877 /arch/arm/plat-mxc
parentc72eec4afb9215391f06c1a1ce14a63e17ed64e2 (diff)
parent091604c85f017199cae9d437545a96157ab063e0 (diff)
Merge remote branch 'fsl-linux-sdk/imx_3.0.35' into imx_3.0.35_android
Conflicts: drivers/mxc/vpu/mxc_vpu.c
Diffstat (limited to 'arch/arm/plat-mxc')
-rwxr-xr-xarch/arm/plat-mxc/cpufreq.c6
-rw-r--r--arch/arm/plat-mxc/devices/platform-fsl-usb2-wakeup.c1
-rw-r--r--arch/arm/plat-mxc/devices/platform-mxc-ehci.c2
-rw-r--r--arch/arm/plat-mxc/include/mach/dma.h2
-rw-r--r--arch/arm/plat-mxc/include/mach/sdma.h1
-rwxr-xr-xarch/arm/plat-mxc/usb_common.c24
-rwxr-xr-xarch/arm/plat-mxc/usb_wakeup.c11
7 files changed, 42 insertions, 5 deletions
diff --git a/arch/arm/plat-mxc/cpufreq.c b/arch/arm/plat-mxc/cpufreq.c
index b31970c667d2..765f05e23712 100755
--- a/arch/arm/plat-mxc/cpufreq.c
+++ b/arch/arm/plat-mxc/cpufreq.c
@@ -56,6 +56,7 @@ extern struct regulator *cpu_regulator;
extern int dvfs_core_is_active;
extern struct cpu_op *(*get_cpu_op)(int *op);
extern int low_bus_freq_mode;
+extern int audio_bus_freq_mode;
extern int high_bus_freq_mode;
extern int set_low_bus_freq(void);
extern int set_high_bus_freq(int high_bus_speed);
@@ -85,7 +86,7 @@ int set_cpu_freq(int freq)
#endif
/*Set the voltage for the GP domain. */
if (freq > org_cpu_rate) {
- if (low_bus_freq_mode)
+ if (low_bus_freq_mode || audio_bus_freq_mode)
set_high_bus_freq(0);
ret = regulator_set_voltage(cpu_regulator, gp_volt,
gp_volt);
@@ -108,7 +109,8 @@ int set_cpu_freq(int freq)
printk(KERN_DEBUG "COULD NOT SET GP VOLTAGE!!!!\n");
return ret;
}
- if (low_freq_bus_used() && !low_bus_freq_mode)
+ if (low_freq_bus_used() &&
+ !(low_bus_freq_mode || audio_bus_freq_mode))
set_low_bus_freq();
}
diff --git a/arch/arm/plat-mxc/devices/platform-fsl-usb2-wakeup.c b/arch/arm/plat-mxc/devices/platform-fsl-usb2-wakeup.c
index 986b766fabde..3dacd287c6b8 100644
--- a/arch/arm/plat-mxc/devices/platform-fsl-usb2-wakeup.c
+++ b/arch/arm/plat-mxc/devices/platform-fsl-usb2-wakeup.c
@@ -52,3 +52,4 @@ struct platform_device *__init imx_add_fsl_usb2_wakeup(
res, ARRAY_SIZE(res),
pdata, sizeof(*pdata), DMA_BIT_MASK(32));
}
+EXPORT_SYMBOL(imx_add_fsl_usb2_wakeup);
diff --git a/arch/arm/plat-mxc/devices/platform-mxc-ehci.c b/arch/arm/plat-mxc/devices/platform-mxc-ehci.c
index c39f6d7561c6..2b9cdff2ff97 100644
--- a/arch/arm/plat-mxc/devices/platform-mxc-ehci.c
+++ b/arch/arm/plat-mxc/devices/platform-mxc-ehci.c
@@ -83,6 +83,7 @@ struct platform_device *__init imx_add_mxc_ehci(
res, ARRAY_SIZE(res),
pdata, sizeof(*pdata), DMA_BIT_MASK(32));
}
+EXPORT_SYMBOL(imx_add_mxc_ehci);
/* FSL internal non-upstream code */
struct platform_device *__init imx_add_fsl_ehci(
@@ -104,3 +105,4 @@ struct platform_device *__init imx_add_fsl_ehci(
res, ARRAY_SIZE(res),
pdata, sizeof(*pdata), DMA_BIT_MASK(32));
}
+EXPORT_SYMBOL(imx_add_fsl_ehci);
diff --git a/arch/arm/plat-mxc/include/mach/dma.h b/arch/arm/plat-mxc/include/mach/dma.h
index ba00959c19fa..3fccb3be9e15 100644
--- a/arch/arm/plat-mxc/include/mach/dma.h
+++ b/arch/arm/plat-mxc/include/mach/dma.h
@@ -45,6 +45,7 @@ enum sdma_peripheral_type {
IMX_DMATYPE_IPU_MEMORY, /* IPU Memory */
IMX_DMATYPE_ASRC, /* ASRC */
IMX_DMATYPE_ESAI, /* ESAI */
+ IMX_DMATYPE_HDMI,
};
enum imx_dma_prio {
@@ -58,6 +59,7 @@ struct imx_dma_data {
int dma_request_p2p;
enum sdma_peripheral_type peripheral_type;
int priority;
+ void *private;
};
struct imx_pcm_dma_params {
diff --git a/arch/arm/plat-mxc/include/mach/sdma.h b/arch/arm/plat-mxc/include/mach/sdma.h
index a145c56b649d..cee7fe490188 100644
--- a/arch/arm/plat-mxc/include/mach/sdma.h
+++ b/arch/arm/plat-mxc/include/mach/sdma.h
@@ -45,6 +45,7 @@ struct sdma_script_start_addrs {
s32 ram_code_start_addr;
s32 mcu_2_ssish_addr;
s32 ssish_2_mcu_addr;
+ s32 hdmi_dma_addr;
};
/**
diff --git a/arch/arm/plat-mxc/usb_common.c b/arch/arm/plat-mxc/usb_common.c
index b18f5239c8b9..97d963a54a54 100755
--- a/arch/arm/plat-mxc/usb_common.c
+++ b/arch/arm/plat-mxc/usb_common.c
@@ -49,8 +49,12 @@
#include <mach/arc_otg.h>
#include <mach/hardware.h>
#include <mach/mxc.h>
+typedef void (*driver_vbus_func)(bool);
void __iomem *imx_otg_base;
+static driver_vbus_func s_driver_vbus;
+
+EXPORT_SYMBOL(imx_otg_base);
#define MXC_NUMBER_USB_TRANSCEIVER 6
struct fsl_xcvr_ops *g_xc_ops[MXC_NUMBER_USB_TRANSCEIVER] = { NULL };
@@ -59,10 +63,26 @@ bool usb_icbug_swfix_need(void)
{
if (cpu_is_mx6sl())
return false;
- else
- return true;
+ else if ((mx6q_revision() > IMX_CHIP_REVISION_1_1))
+ return false;
+ else if ((mx6dl_revision() > IMX_CHIP_REVISION_1_0))
+ return false;
+ return true;
+}
+EXPORT_SYMBOL(usb_icbug_swfix_need);
+
+void mx6_set_host1_vbus_func(driver_vbus_func driver_vbus)
+{
+ s_driver_vbus = driver_vbus;
}
+void mx6_set_usb_host1_vbus_func(driver_vbus_func *driver_vbus)
+{
+ *driver_vbus = s_driver_vbus;
+}
+EXPORT_SYMBOL(mx6_set_usb_host1_vbus_func);
+
+
enum fsl_usb2_modes get_usb_mode(struct fsl_usb2_platform_data *pdata)
{
enum fsl_usb2_modes mode;
diff --git a/arch/arm/plat-mxc/usb_wakeup.c b/arch/arm/plat-mxc/usb_wakeup.c
index 4704eae91a51..e67c2219e52d 100755
--- a/arch/arm/plat-mxc/usb_wakeup.c
+++ b/arch/arm/plat-mxc/usb_wakeup.c
@@ -32,6 +32,7 @@
struct wakeup_ctrl {
int wakeup_irq;
int usb_irq;
+ bool thread_close;
struct fsl_usb2_wakeup_platform_data *pdata;
struct task_struct *thread;
struct completion event;
@@ -145,12 +146,18 @@ static int wakeup_event_thread(void *param)
{
struct wakeup_ctrl *ctrl = (struct wakeup_ctrl *)param;
struct sched_param sch_param = {.sched_priority = 1};
+ u32 timeout = 0;
sched_setscheduler(current, SCHED_RR, &sch_param);
while (1) {
wait_for_completion_interruptible(&ctrl->event);
- if (kthread_should_stop())
+ if (ctrl->thread_close) {
+ while (!kthread_should_stop() && (timeout < 1000)) {
+ timeout++;
+ msleep(1);
+ }
break;
+ }
wakeup_event_handler(ctrl);
enable_irq(ctrl->wakeup_irq);
if ((ctrl->usb_irq > 0) && (ctrl->wakeup_irq != ctrl->usb_irq))
@@ -184,6 +191,7 @@ static int wakeup_dev_probe(struct platform_device *pdev)
*/
ctrl->wakeup_irq = platform_get_irq(pdev, 1);
ctrl->usb_irq = platform_get_irq(pdev, 1);
+ ctrl->thread_close = false;
if (ctrl->wakeup_irq != ctrl->usb_irq)
interrupt_flag = IRQF_DISABLED;
else
@@ -210,6 +218,7 @@ error1:
static int wakeup_dev_exit(struct platform_device *pdev)
{
if (g_ctrl->thread) {
+ g_ctrl->thread_close = true;
complete(&g_ctrl->event);
kthread_stop(g_ctrl->thread);
}