提交 c02d7da3 编写于 作者: L Linus Torvalds

Merge tag 'media/v4.1-3' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media

Pull media fixes from Mauro Carvalho Chehab:
 "Three driver fixes:

   - fix for omap4, fixing a regression due to a subsystem API that got
     removed for 4.1 (commit efde2346);

   - fix for one of the formats supported by Marvel ccic driver;

   - fix rcar_vin driver that, when stopping abnormally, the driver
     can't return from wait_for_completion"

* tag 'media/v4.1-3' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media:
  [media] v4l: omap4iss: Replace outdated OMAP4 control pad API with syscon
  [media] media: soc_camera: rcar_vin: Fix wait_for_completion
  [media] marvell-ccic: fix Y'CbCr ordering
...@@ -116,8 +116,8 @@ static struct mcam_format_struct { ...@@ -116,8 +116,8 @@ static struct mcam_format_struct {
.planar = false, .planar = false,
}, },
{ {
.desc = "UYVY 4:2:2", .desc = "YVYU 4:2:2",
.pixelformat = V4L2_PIX_FMT_UYVY, .pixelformat = V4L2_PIX_FMT_YVYU,
.mbus_code = MEDIA_BUS_FMT_YUYV8_2X8, .mbus_code = MEDIA_BUS_FMT_YUYV8_2X8,
.bpp = 2, .bpp = 2,
.planar = false, .planar = false,
...@@ -748,7 +748,7 @@ static void mcam_ctlr_image(struct mcam_camera *cam) ...@@ -748,7 +748,7 @@ static void mcam_ctlr_image(struct mcam_camera *cam)
switch (fmt->pixelformat) { switch (fmt->pixelformat) {
case V4L2_PIX_FMT_YUYV: case V4L2_PIX_FMT_YUYV:
case V4L2_PIX_FMT_UYVY: case V4L2_PIX_FMT_YVYU:
widthy = fmt->width * 2; widthy = fmt->width * 2;
widthuv = 0; widthuv = 0;
break; break;
...@@ -784,15 +784,15 @@ static void mcam_ctlr_image(struct mcam_camera *cam) ...@@ -784,15 +784,15 @@ static void mcam_ctlr_image(struct mcam_camera *cam)
case V4L2_PIX_FMT_YUV420: case V4L2_PIX_FMT_YUV420:
case V4L2_PIX_FMT_YVU420: case V4L2_PIX_FMT_YVU420:
mcam_reg_write_mask(cam, REG_CTRL0, mcam_reg_write_mask(cam, REG_CTRL0,
C0_DF_YUV | C0_YUV_420PL | C0_YUVE_YVYU, C0_DF_MASK); C0_DF_YUV | C0_YUV_420PL | C0_YUVE_VYUY, C0_DF_MASK);
break; break;
case V4L2_PIX_FMT_YUYV: case V4L2_PIX_FMT_YUYV:
mcam_reg_write_mask(cam, REG_CTRL0, mcam_reg_write_mask(cam, REG_CTRL0,
C0_DF_YUV | C0_YUV_PACKED | C0_YUVE_UYVY, C0_DF_MASK); C0_DF_YUV | C0_YUV_PACKED | C0_YUVE_NOSWAP, C0_DF_MASK);
break; break;
case V4L2_PIX_FMT_UYVY: case V4L2_PIX_FMT_YVYU:
mcam_reg_write_mask(cam, REG_CTRL0, mcam_reg_write_mask(cam, REG_CTRL0,
C0_DF_YUV | C0_YUV_PACKED | C0_YUVE_YUYV, C0_DF_MASK); C0_DF_YUV | C0_YUV_PACKED | C0_YUVE_SWAP24, C0_DF_MASK);
break; break;
case V4L2_PIX_FMT_JPEG: case V4L2_PIX_FMT_JPEG:
mcam_reg_write_mask(cam, REG_CTRL0, mcam_reg_write_mask(cam, REG_CTRL0,
......
...@@ -330,10 +330,10 @@ int mccic_resume(struct mcam_camera *cam); ...@@ -330,10 +330,10 @@ int mccic_resume(struct mcam_camera *cam);
#define C0_YUVE_YVYU 0x00010000 /* Y1CrY0Cb */ #define C0_YUVE_YVYU 0x00010000 /* Y1CrY0Cb */
#define C0_YUVE_VYUY 0x00020000 /* CrY1CbY0 */ #define C0_YUVE_VYUY 0x00020000 /* CrY1CbY0 */
#define C0_YUVE_UYVY 0x00030000 /* CbY1CrY0 */ #define C0_YUVE_UYVY 0x00030000 /* CbY1CrY0 */
#define C0_YUVE_XYUV 0x00000000 /* 420: .YUV */ #define C0_YUVE_NOSWAP 0x00000000 /* no bytes swapping */
#define C0_YUVE_XYVU 0x00010000 /* 420: .YVU */ #define C0_YUVE_SWAP13 0x00010000 /* swap byte 1 and 3 */
#define C0_YUVE_XUVY 0x00020000 /* 420: .UVY */ #define C0_YUVE_SWAP24 0x00020000 /* swap byte 2 and 4 */
#define C0_YUVE_XVUY 0x00030000 /* 420: .VUY */ #define C0_YUVE_SWAP1324 0x00030000 /* swap bytes 1&3 and 2&4 */
/* Bayer bits 18,19 if needed */ /* Bayer bits 18,19 if needed */
#define C0_EOF_VSYNC 0x00400000 /* Generate EOF by VSYNC */ #define C0_EOF_VSYNC 0x00400000 /* Generate EOF by VSYNC */
#define C0_VEDGE_CTRL 0x00800000 /* Detect falling edge of VSYNC */ #define C0_VEDGE_CTRL 0x00800000 /* Detect falling edge of VSYNC */
......
...@@ -135,6 +135,8 @@ ...@@ -135,6 +135,8 @@
#define VIN_MAX_WIDTH 2048 #define VIN_MAX_WIDTH 2048
#define VIN_MAX_HEIGHT 2048 #define VIN_MAX_HEIGHT 2048
#define TIMEOUT_MS 100
enum chip_id { enum chip_id {
RCAR_GEN2, RCAR_GEN2,
RCAR_H1, RCAR_H1,
...@@ -820,7 +822,10 @@ static void rcar_vin_wait_stop_streaming(struct rcar_vin_priv *priv) ...@@ -820,7 +822,10 @@ static void rcar_vin_wait_stop_streaming(struct rcar_vin_priv *priv)
if (priv->state == STOPPING) { if (priv->state == STOPPING) {
priv->request_to_stop = true; priv->request_to_stop = true;
spin_unlock_irq(&priv->lock); spin_unlock_irq(&priv->lock);
wait_for_completion(&priv->capture_stop); if (!wait_for_completion_timeout(
&priv->capture_stop,
msecs_to_jiffies(TIMEOUT_MS)))
priv->state = STOPPED;
spin_lock_irq(&priv->lock); spin_lock_irq(&priv->lock);
} }
} }
......
...@@ -2,6 +2,7 @@ config VIDEO_OMAP4 ...@@ -2,6 +2,7 @@ config VIDEO_OMAP4
bool "OMAP 4 Camera support" bool "OMAP 4 Camera support"
depends on VIDEO_V4L2=y && VIDEO_V4L2_SUBDEV_API && I2C=y && ARCH_OMAP4 depends on VIDEO_V4L2=y && VIDEO_V4L2_SUBDEV_API && I2C=y && ARCH_OMAP4
depends on HAS_DMA depends on HAS_DMA
select MFD_SYSCON
select VIDEOBUF2_DMA_CONTIG select VIDEOBUF2_DMA_CONTIG
---help--- ---help---
Driver for an OMAP 4 ISS controller. Driver for an OMAP 4 ISS controller.
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/mfd/syscon.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -1386,6 +1387,16 @@ static int iss_probe(struct platform_device *pdev) ...@@ -1386,6 +1387,16 @@ static int iss_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, iss); platform_set_drvdata(pdev, iss);
/*
* TODO: When implementing DT support switch to syscon regmap lookup by
* phandle.
*/
iss->syscon = syscon_regmap_lookup_by_compatible("syscon");
if (IS_ERR(iss->syscon)) {
ret = PTR_ERR(iss->syscon);
goto error;
}
/* Clocks */ /* Clocks */
ret = iss_map_mem_resource(pdev, iss, OMAP4_ISS_MEM_TOP); ret = iss_map_mem_resource(pdev, iss, OMAP4_ISS_MEM_TOP);
if (ret < 0) if (ret < 0)
......
...@@ -29,6 +29,8 @@ ...@@ -29,6 +29,8 @@
#include "iss_ipipe.h" #include "iss_ipipe.h"
#include "iss_resizer.h" #include "iss_resizer.h"
struct regmap;
#define to_iss_device(ptr_module) \ #define to_iss_device(ptr_module) \
container_of(ptr_module, struct iss_device, ptr_module) container_of(ptr_module, struct iss_device, ptr_module)
#define to_device(ptr_module) \ #define to_device(ptr_module) \
...@@ -79,6 +81,7 @@ struct iss_reg { ...@@ -79,6 +81,7 @@ struct iss_reg {
/* /*
* struct iss_device - ISS device structure. * struct iss_device - ISS device structure.
* @syscon: Regmap for the syscon register space
* @crashed: Bitmask of crashed entities (indexed by entity ID) * @crashed: Bitmask of crashed entities (indexed by entity ID)
*/ */
struct iss_device { struct iss_device {
...@@ -93,6 +96,7 @@ struct iss_device { ...@@ -93,6 +96,7 @@ struct iss_device {
struct resource *res[OMAP4_ISS_MEM_LAST]; struct resource *res[OMAP4_ISS_MEM_LAST];
void __iomem *regs[OMAP4_ISS_MEM_LAST]; void __iomem *regs[OMAP4_ISS_MEM_LAST];
struct regmap *syscon;
u64 raw_dmamask; u64 raw_dmamask;
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/regmap.h>
#include "../../../../arch/arm/mach-omap2/control.h" #include "../../../../arch/arm/mach-omap2/control.h"
...@@ -140,9 +141,11 @@ int omap4iss_csiphy_config(struct iss_device *iss, ...@@ -140,9 +141,11 @@ int omap4iss_csiphy_config(struct iss_device *iss,
* - bit [18] : CSIPHY1 CTRLCLK enable * - bit [18] : CSIPHY1 CTRLCLK enable
* - bit [17:16] : CSIPHY1 config: 00 d-phy, 01/10 ccp2 * - bit [17:16] : CSIPHY1 config: 00 d-phy, 01/10 ccp2
*/ */
cam_rx_ctrl = omap4_ctrl_pad_readl( /*
OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_CAMERA_RX); * TODO: When implementing DT support specify the CONTROL_CAMERA_RX
* register offset in the syscon property instead of hardcoding it.
*/
regmap_read(iss->syscon, 0x68, &cam_rx_ctrl);
if (subdevs->interface == ISS_INTERFACE_CSI2A_PHY1) { if (subdevs->interface == ISS_INTERFACE_CSI2A_PHY1) {
cam_rx_ctrl &= ~(OMAP4_CAMERARX_CSI21_LANEENABLE_MASK | cam_rx_ctrl &= ~(OMAP4_CAMERARX_CSI21_LANEENABLE_MASK |
...@@ -166,8 +169,7 @@ int omap4iss_csiphy_config(struct iss_device *iss, ...@@ -166,8 +169,7 @@ int omap4iss_csiphy_config(struct iss_device *iss,
cam_rx_ctrl |= OMAP4_CAMERARX_CSI22_CTRLCLKEN_MASK; cam_rx_ctrl |= OMAP4_CAMERARX_CSI22_CTRLCLKEN_MASK;
} }
omap4_ctrl_pad_writel(cam_rx_ctrl, regmap_write(iss->syscon, 0x68, cam_rx_ctrl);
OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_CAMERA_RX);
/* Reset used lane count */ /* Reset used lane count */
csi2->phy->used_data_lanes = 0; csi2->phy->used_data_lanes = 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册