summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorXinyu Chen <xinyu.chen@freescale.com>2013-01-04 13:41:54 +0800
committerXinyu Chen <xinyu.chen@freescale.com>2013-01-04 13:41:54 +0800
commitccce7dc63f494aaed6bd3ea55b9e14c76da0931e (patch)
tree6892e44aff8fda5dac08bb0aefa6a0d9b3b92af2 /drivers
parent60daab290bbab00c73cc057ff868f658ec73d304 (diff)
parentc27cb3851bb6f822f8a92e4a1e10fba19284bdd4 (diff)
Merge tag 'rel_imx_3.0.35_1.1.0' into imx_3.0.35_android
Conflicts: drivers/mxc/vpu/mxc_vpu.c drivers/usb/gadget/arcotg_udc.c sound/soc/imx/imx-wm8962.c
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/video/mxc/capture/ipu_csi_enc.c2
-rw-r--r--drivers/media/video/mxc/capture/ipu_prp_enc.c3
-rw-r--r--drivers/media/video/mxc/capture/mxc_v4l2_capture.c2
-rw-r--r--drivers/media/video/mxc/output/mxc_vout.c4
-rw-r--r--drivers/mxc/asrc/mxc_asrc.c27
-rw-r--r--drivers/mxc/vpu/mxc_vpu.c180
-rwxr-xr-xdrivers/net/fec.c3
-rwxr-xr-xdrivers/usb/gadget/arcotg_udc.c9
8 files changed, 115 insertions, 115 deletions
diff --git a/drivers/media/video/mxc/capture/ipu_csi_enc.c b/drivers/media/video/mxc/capture/ipu_csi_enc.c
index b0919106a9bf..28c25f2cce34 100644
--- a/drivers/media/video/mxc/capture/ipu_csi_enc.c
+++ b/drivers/media/video/mxc/capture/ipu_csi_enc.c
@@ -104,6 +104,8 @@ static int csi_enc_setup(cam_data *cam)
if (cam->v2f.fmt.pix.pixelformat == V4L2_PIX_FMT_YUV420)
pixel_fmt = IPU_PIX_FMT_YUV420P;
+ else if (cam->v2f.fmt.pix.pixelformat == V4L2_PIX_FMT_YVU420)
+ pixel_fmt = IPU_PIX_FMT_YVU420P;
else if (cam->v2f.fmt.pix.pixelformat == V4L2_PIX_FMT_YUV422P)
pixel_fmt = IPU_PIX_FMT_YUV422P;
else if (cam->v2f.fmt.pix.pixelformat == V4L2_PIX_FMT_UYVY)
diff --git a/drivers/media/video/mxc/capture/ipu_prp_enc.c b/drivers/media/video/mxc/capture/ipu_prp_enc.c
index a3c90d53f2eb..e24b1b086d68 100644
--- a/drivers/media/video/mxc/capture/ipu_prp_enc.c
+++ b/drivers/media/video/mxc/capture/ipu_prp_enc.c
@@ -99,6 +99,9 @@ static int prp_enc_setup(cam_data *cam)
if (cam->v2f.fmt.pix.pixelformat == V4L2_PIX_FMT_YUV420) {
enc.csi_prp_enc_mem.out_pixel_fmt = IPU_PIX_FMT_YUV420P;
pr_info("YUV420\n");
+ } else if (cam->v2f.fmt.pix.pixelformat == V4L2_PIX_FMT_YVU420) {
+ enc.csi_prp_enc_mem.out_pixel_fmt = IPU_PIX_FMT_YVU420P;
+ pr_info("YVU420\n");
} else if (cam->v2f.fmt.pix.pixelformat == V4L2_PIX_FMT_YUV422P) {
enc.csi_prp_enc_mem.out_pixel_fmt = IPU_PIX_FMT_YUV422P;
pr_info("YUV422P\n");
diff --git a/drivers/media/video/mxc/capture/mxc_v4l2_capture.c b/drivers/media/video/mxc/capture/mxc_v4l2_capture.c
index 04aa0de4388b..a99cabbcee25 100644
--- a/drivers/media/video/mxc/capture/mxc_v4l2_capture.c
+++ b/drivers/media/video/mxc/capture/mxc_v4l2_capture.c
@@ -366,6 +366,7 @@ static inline int valid_mode(u32 palette)
(palette == V4L2_PIX_FMT_UYVY) ||
(palette == V4L2_PIX_FMT_YUYV) ||
(palette == V4L2_PIX_FMT_YUV420) ||
+ (palette == V4L2_PIX_FMT_YVU420) ||
(palette == V4L2_PIX_FMT_NV12));
}
@@ -881,6 +882,7 @@ static int mxc_v4l2_s_fmt(cam_data *cam, struct v4l2_format *f)
bytesperline = f->fmt.pix.width * 2;
break;
case V4L2_PIX_FMT_YUV420:
+ case V4L2_PIX_FMT_YVU420:
size = f->fmt.pix.width * f->fmt.pix.height * 3 / 2;
bytesperline = f->fmt.pix.width;
break;
diff --git a/drivers/media/video/mxc/output/mxc_vout.c b/drivers/media/video/mxc/output/mxc_vout.c
index 388c4b39570f..ec789ec2e826 100644
--- a/drivers/media/video/mxc/output/mxc_vout.c
+++ b/drivers/media/video/mxc/output/mxc_vout.c
@@ -189,6 +189,10 @@ const static struct v4l2_fmtdesc mxc_formats[] = {
.pixelformat = V4L2_PIX_FMT_YUV420,
},
{
+ .description = "YVU420",
+ .pixelformat = V4L2_PIX_FMT_YVU420,
+ },
+ {
.description = "TILED NV12P",
.pixelformat = IPU_PIX_FMT_TILED_NV12,
},
diff --git a/drivers/mxc/asrc/mxc_asrc.c b/drivers/mxc/asrc/mxc_asrc.c
index 4a17f5856d45..9962698473af 100644
--- a/drivers/mxc/asrc/mxc_asrc.c
+++ b/drivers/mxc/asrc/mxc_asrc.c
@@ -1213,33 +1213,6 @@ static int imx_asrc_dma_config(
}
-static int asrc_get_output_buffer_size(int input_buffer_size,
- int input_sample_rate,
- int output_sample_rate)
-{
- int i = 0;
- int outbuffer_size = 0;
- int outsample = output_sample_rate;
- while (outsample >= input_sample_rate) {
- ++i;
- outsample -= input_sample_rate;
- }
- outbuffer_size = i * input_buffer_size;
- i = 1;
- while (((input_buffer_size >> i) > 2) && (outsample != 0)) {
- if (((outsample << 1) - input_sample_rate) >= 0) {
- outsample = (outsample << 1) - input_sample_rate;
- outbuffer_size += (input_buffer_size >> i);
- } else {
- outsample = outsample << 1;
- }
- i++;
- }
- outbuffer_size = (outbuffer_size >> 3) << 3;
- return outbuffer_size;
-}
-
-
static int mxc_asrc_prepare_input_buffer(struct asrc_pair_params *params,
struct asrc_convert_buffer *pbuf)
{
diff --git a/drivers/mxc/vpu/mxc_vpu.c b/drivers/mxc/vpu/mxc_vpu.c
index 2a1b2cd0685c..3652e54f05cd 100644
--- a/drivers/mxc/vpu/mxc_vpu.c
+++ b/drivers/mxc/vpu/mxc_vpu.c
@@ -112,6 +112,7 @@ static int vpu_jpu_irq;
static unsigned int regBk[64];
static struct regulator *vpu_regulator;
+static unsigned int pc_before_suspend;
#define READ_REG(x) __raw_readl(vpu_base + x)
#define WRITE_REG(val, x) __raw_writel(val, vpu_base + x)
@@ -716,9 +717,16 @@ static int vpu_dev_probe(struct platform_device *pdev)
goto err_out_class;
vpu_regulator = regulator_get(NULL, "cpu_vddvpu");
if (IS_ERR(vpu_regulator)) {
- printk(KERN_ERR
- "%s: failed to get vpu regulator\n", __func__);
- goto err_out_class;
+ if (!(cpu_is_mx51() || cpu_is_mx53())) {
+ printk(KERN_ERR
+ "%s: failed to get vpu regulator\n", __func__);
+ goto err_out_class;
+ } else {
+ /* regulator_get will return error on MX5x,
+ * just igore it everywhere*/
+ printk(KERN_WARNING
+ "%s: failed to get vpu regulator\n", __func__);
+ }
}
#ifdef MXC_VPU_HAS_JPU
@@ -778,107 +786,112 @@ static int vpu_suspend(struct platform_device *pdev, pm_message_t state)
int i;
unsigned long timeout;
- if (!IS_ERR(vpu_regulator))
- regulator_enable(vpu_regulator);
- /* Wait for vpu go to idle state, suspect vpu cannot be changed
- to idle state after about 1 sec */
- if (open_count > 0) {
+ mutex_lock(&vpu_data.lock);
+ if (open_count == 0) {
+ /* VPU is released (all instances are freed),
+ * clock is already off, context is no longer needed,
+ * power is already off on MX6,
+ * gate power on MX51 */
+ if (cpu_is_mx51()) {
+ if (vpu_plat->pg)
+ vpu_plat->pg(1);
+ }
+ } else {
+ /* Wait for vpu go to idle state, suspect vpu cannot be changed
+ to idle state after about 1 sec */
timeout = jiffies + HZ;
clk_enable(vpu_clk);
while (READ_REG(BIT_BUSY_FLAG)) {
msleep(1);
- if (time_after(jiffies, timeout))
- goto out;
+ if (time_after(jiffies, timeout)) {
+ clk_disable(vpu_clk);
+ mutex_unlock(&vpu_data.lock);
+ return -EAGAIN;
+ }
}
clk_disable(vpu_clk);
- }
- /* Make sure clock is disabled before suspend */
- vpu_clk_usercount = clk_get_usecount(vpu_clk);
- for (i = 0; i < vpu_clk_usercount; i++)
- clk_disable(vpu_clk);
+ /* Make sure clock is disabled before suspend */
+ vpu_clk_usercount = clk_get_usecount(vpu_clk);
+ for (i = 0; i < vpu_clk_usercount; i++)
+ clk_disable(vpu_clk);
- if (cpu_is_mx53())
- return 0;
+ if (cpu_is_mx53()) {
+ mutex_unlock(&vpu_data.lock);
+ return 0;
+ }
- if (bitwork_mem.cpu_addr != 0) {
- clk_enable(vpu_clk);
- /* Save 64 registers from BIT_CODE_BUF_ADDR */
- for (i = 0; i < 64; i++)
- regBk[i] = READ_REG(BIT_CODE_BUF_ADDR + (i * 4));
- clk_disable(vpu_clk);
- }
+ if (bitwork_mem.cpu_addr != 0) {
+ clk_enable(vpu_clk);
+ /* Save 64 registers from BIT_CODE_BUF_ADDR */
+ for (i = 0; i < 64; i++)
+ regBk[i] = READ_REG(BIT_CODE_BUF_ADDR + (i * 4));
+ pc_before_suspend = READ_REG(BIT_CUR_PC);
+ clk_disable(vpu_clk);
+ }
- if (vpu_plat->pg)
- vpu_plat->pg(1);
+ if (vpu_plat->pg)
+ vpu_plat->pg(1);
- /* If VPU is working before suspend, disable
- * regulator to make usecount right. */
- if (open_count > 0) {
+ /* If VPU is working before suspend, disable
+ * regulator to make usecount right. */
if (!IS_ERR(vpu_regulator))
regulator_disable(vpu_regulator);
}
- if (!IS_ERR(vpu_regulator))
- regulator_disable(vpu_regulator);
+ mutex_unlock(&vpu_data.lock);
return 0;
-
-out:
- clk_disable(vpu_clk);
- if (!IS_ERR(vpu_regulator))
- regulator_disable(vpu_regulator);
- return -EAGAIN;
-
}
static int vpu_resume(struct platform_device *pdev)
{
int i;
- if (cpu_is_mx53())
- goto recover_clk;
-
- if (!IS_ERR(vpu_regulator))
- regulator_enable(vpu_regulator);
- if (vpu_plat->pg)
- vpu_plat->pg(0);
+ mutex_lock(&vpu_data.lock);
+ if (open_count == 0) {
+ /* VPU is released (all instances are freed),
+ * clock should be kept off, context is no longer needed,
+ * power should be kept off on MX6,
+ * disable power gating on MX51 */
+ if (cpu_is_mx51()) {
+ if (vpu_plat->pg)
+ vpu_plat->pg(0);
+ }
+ } else {
+ if (cpu_is_mx53())
+ goto recover_clk;
- /* If VPU is working before suspend, enable
- * regulator to make usecount right. */
- if (open_count > 0) {
+ /* If VPU is working before suspend, enable
+ * regulator to make usecount right. */
if (!IS_ERR(vpu_regulator))
regulator_enable(vpu_regulator);
- }
- if (bitwork_mem.cpu_addr != 0) {
- u32 *p = (u32 *) bitwork_mem.cpu_addr;
- u32 data, pc;
- u16 data_hi;
- u16 data_lo;
+ if (vpu_plat->pg)
+ vpu_plat->pg(0);
- clk_enable(vpu_clk);
+ if (bitwork_mem.cpu_addr != 0) {
+ u32 *p = (u32 *) bitwork_mem.cpu_addr;
+ u32 data, pc;
+ u16 data_hi;
+ u16 data_lo;
- /* reset VPU in case of voltage change */
- if (vpu_plat->reset)
- vpu_plat->reset();
+ clk_enable(vpu_clk);
- pc = READ_REG(BIT_CUR_PC);
- if (pc) {
- clk_disable(vpu_clk);
- goto recover_clk;
- }
+ pc = READ_REG(BIT_CUR_PC);
+ if (pc) {
+ printk(KERN_WARNING "Not power off after suspend (PC=0x%x)\n", pc);
+ clk_disable(vpu_clk);
+ goto recover_clk;
+ }
- /*
- * Only recover vpu if it is been using.
- * If not been used, vpu will be reinited in user space lib.
- */
- if (open_count > 0) {
/* Restore registers */
for (i = 0; i < 64; i++)
WRITE_REG(regBk[i], BIT_CODE_BUF_ADDR + (i * 4));
WRITE_REG(0x0, BIT_RESET_CTRL);
WRITE_REG(0x0, BIT_CODE_RUN);
+ /* MX6 RTL has a bug not to init MBC_SET_SUBBLK_EN on reset */
+ WRITE_REG(0x0, MBC_SET_SUBBLK_EN);
/*
* Re-load boot code, from the codebuffer in external RAM.
@@ -890,32 +903,35 @@ static int vpu_resume(struct platform_device *pdev)
data_lo = data & 0xFFFF;
WRITE_REG((i << 16) | data_hi, BIT_CODE_DOWN);
WRITE_REG(((i + 1) << 16) | data_lo,
- BIT_CODE_DOWN);
+ BIT_CODE_DOWN);
data = p[i / 2];
data_hi = (data >> 16) & 0xFFFF;
data_lo = data & 0xFFFF;
WRITE_REG(((i + 2) << 16) | data_hi,
- BIT_CODE_DOWN);
+ BIT_CODE_DOWN);
WRITE_REG(((i + 3) << 16) | data_lo,
- BIT_CODE_DOWN);
+ BIT_CODE_DOWN);
}
- WRITE_REG(0x1, BIT_BUSY_FLAG);
- WRITE_REG(0x1, BIT_CODE_RUN);
- while (READ_REG(BIT_BUSY_FLAG))
- ;
+ if (pc_before_suspend) {
+ WRITE_REG(0x1, BIT_BUSY_FLAG);
+ WRITE_REG(0x1, BIT_CODE_RUN);
+ while (READ_REG(BIT_BUSY_FLAG))
+ ;
+ } else {
+ printk(KERN_WARNING "PC=0 before suspend\n");
+ }
+ clk_disable(vpu_clk);
}
- clk_disable(vpu_clk);
- }
recover_clk:
- /* Recover vpu clock */
- for (i = 0; i < vpu_clk_usercount; i++)
- clk_enable(vpu_clk);
- if (!IS_ERR(vpu_regulator))
- regulator_disable(vpu_regulator);
+ /* Recover vpu clock */
+ for (i = 0; i < vpu_clk_usercount; i++)
+ clk_enable(vpu_clk);
+ }
+ mutex_unlock(&vpu_data.lock);
return 0;
}
#else
diff --git a/drivers/net/fec.c b/drivers/net/fec.c
index 23f688c6a585..d09aa984c97e 100755
--- a/drivers/net/fec.c
+++ b/drivers/net/fec.c
@@ -1046,6 +1046,9 @@ static int fec_enet_mii_probe(struct net_device *ndev)
else
phy_dev->supported &= PHY_BASIC_FEATURES;
+ /* enable phy pause frame for any platform */
+ phy_dev->supported |= ADVERTISED_Pause;
+
phy_dev->advertising = phy_dev->supported;
fep->phy_dev = phy_dev;
diff --git a/drivers/usb/gadget/arcotg_udc.c b/drivers/usb/gadget/arcotg_udc.c
index 61d7c237e881..5397efc61ddb 100755
--- a/drivers/usb/gadget/arcotg_udc.c
+++ b/drivers/usb/gadget/arcotg_udc.c
@@ -2911,6 +2911,7 @@ static void fsl_udc_release(struct device *dev)
dma_free_coherent(dev, udc_controller->ep_qh_size,
udc_controller->ep_qh, udc_controller->ep_qh_dma);
kfree(udc_controller);
+ udc_controller = NULL;
}
/******************************************************************
@@ -3255,8 +3256,7 @@ static int fsl_udc_remove(struct platform_device *pdev)
return -ENODEV;
udc_controller->done = &done;
/* open USB PHY clock */
- if (udc_controller->stopped)
- dr_clk_gate(true);
+ dr_clk_gate(true);
/* disable wake up and otgsc interrupt for safely remove udc driver*/
temp = fsl_readl(&dr_regs->otgsc);
@@ -3296,7 +3296,7 @@ static int fsl_udc_remove(struct platform_device *pdev)
release_mem_region(res->start, resource_size(res));
}
#endif
-
+ dr_clk_gate(false);
device_unregister(&udc_controller->gadget.dev);
/* free udc --wait for the release() finished */
wait_for_completion(&done);
@@ -3307,9 +3307,6 @@ static int fsl_udc_remove(struct platform_device *pdev)
if (pdata->exit)
pdata->exit(pdata->pdev);
- if (udc_controller->stopped)
- dr_clk_gate(false);
-
return 0;
}