From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Pavel Machek <pavel@ucw.cz>
Cc: Sakari Ailus <sakari.ailus@iki.fi>,
mchehab@kernel.org, kernel list <linux-kernel@vger.kernel.org>,
ivo.g.dimitrov.75@gmail.com, sre@kernel.org,
pali.rohar@gmail.com, linux-media@vger.kernel.org
Subject: Re: [PATCH] omap3isp: add support for CSI1 bus
Date: Wed, 08 Feb 2017 23:03:31 +0200 [thread overview]
Message-ID: <10545906.Gxg3yScdu4@avalon> (raw)
In-Reply-To: <20170208125738.GA23236@amd>
Hi Pavel,
Thank you for the patch.
On Wednesday 08 Feb 2017 13:57:38 Pavel Machek wrote:
> Obtain the CSI1/CCP2 bus parameters from the OF node.
>
> ISP CSI1 module needs all the bits correctly set to work.
>
> OMAP3430 needs various syscon CONTROL_CSIRXFE bits set in order to
> operate. Implement the missing functionality.
>
> Signed-off-by: Sakari Ailus <sakari.ailus@iki.fi>
> Signed-off-by: Ivaylo Dimitrov <ivo.g.dimitrov.75@gmail.com>
> Signed-off-by: Pavel Machek <pavel@ucw.cz>
>
> ---
>
> > How about the rest? :-) I guess we could get the CCP2 support in omap3isp
> > without the video bus switch. It'd be nice to have this in a single
> > patchset.
>
> Ok, here you go, what about this?
>
> Pavel
>
> diff --git a/drivers/media/platform/omap3isp/isp.c
> b/drivers/media/platform/omap3isp/isp.c index 0321d84..88bc7c6 100644
> --- a/drivers/media/platform/omap3isp/isp.c
> +++ b/drivers/media/platform/omap3isp/isp.c
> @@ -2024,21 +2024,92 @@ enum isp_of_phy {
> ISP_OF_PHY_CSIPHY2,
> };
>
> -static int isp_of_parse_node(struct device *dev, struct device_node *node,
> - struct isp_async_subdev *isd)
> +void __isp_of_parse_node_csi1(struct device *dev,
> + struct isp_ccp2_cfg *buscfg,
> + struct v4l2_of_endpoint *vep)
This function isn't use anywhere else, you can merge it with
isp_of_parse_node_csi1().
> +{
> + buscfg->lanecfg.clk.pos = vep->bus.mipi_csi1.clock_lane;
> + buscfg->lanecfg.clk.pol =
> + vep->bus.mipi_csi1.lane_polarity[0];
> + dev_dbg(dev, "clock lane polarity %u, pos %u\n",
> + buscfg->lanecfg.clk.pol,
> + buscfg->lanecfg.clk.pos);
> +
> + buscfg->lanecfg.data[0].pos = vep->bus.mipi_csi2.data_lanes[0];
> + buscfg->lanecfg.data[0].pol =
> + vep->bus.mipi_csi2.lane_polarities[1];
bus.mipi_csi2 ?
> + dev_dbg(dev, "data lane polarity %u, pos %u\n",
> + buscfg->lanecfg.data[0].pol,
> + buscfg->lanecfg.data[0].pos);
> +
> + buscfg->strobe_clk_pol = vep->bus.mipi_csi1.clock_inv;
> + buscfg->phy_layer = vep->bus.mipi_csi1.strobe;
> + buscfg->ccp2_mode = vep->bus_type == V4L2_MBUS_CCP2;
> +
> + dev_dbg(dev, "clock_inv %u strobe %u ccp2 %u\n",
> + buscfg->strobe_clk_pol,
> + buscfg->phy_layer,
> + buscfg->ccp2_mode);
> + /*
> + * FIXME: now we assume the CRC is always there.
> + * Implement a way to obtain this information from the
> + * sensor. Frame descriptors, perhaps?
> + */
> + buscfg->crc = 1;
> +
> + buscfg->vp_clk_pol = 1;
> +}
> +
> +static void isp_of_parse_node_csi1(struct device *dev,
> + struct isp_bus_cfg *buscfg,
> + struct v4l2_of_endpoint *vep)
> +{
> + if (vep->base.port == ISP_OF_PHY_CSIPHY1)
> + buscfg->interface = ISP_INTERFACE_CCP2B_PHY1;
> + else
> + buscfg->interface = ISP_INTERFACE_CCP2B_PHY2;
> + __isp_of_parse_node_csi1(dev, &buscfg->bus.ccp2, vep);
> +}
> +
> +static void isp_of_parse_node_csi2(struct device *dev,
> + struct isp_bus_cfg *buscfg,
> + struct v4l2_of_endpoint *vep)
> {
> - struct isp_bus_cfg *buscfg = &isd->bus;
> - struct v4l2_of_endpoint vep;
> unsigned int i;
> - int ret;
>
> - ret = v4l2_of_parse_endpoint(node, &vep);
> - if (ret)
> - return ret;
> + if (vep->base.port == ISP_OF_PHY_CSIPHY1)
> + buscfg->interface = ISP_INTERFACE_CSI2C_PHY1;
> + else
> + buscfg->interface = ISP_INTERFACE_CSI2A_PHY2;
I would keep this code in the caller to avoid code duplication with
isp_of_parse_node_csi1().
> + buscfg->bus.csi2.lanecfg.clk.pos = vep->bus.mipi_csi2.clock_lane;
> + buscfg->bus.csi2.lanecfg.clk.pol =
> + vep->bus.mipi_csi2.lane_polarities[0];
> + dev_dbg(dev, "clock lane polarity %u, pos %u\n",
> + buscfg->bus.csi2.lanecfg.clk.pol,
> + buscfg->bus.csi2.lanecfg.clk.pos);
> +
> + for (i = 0; i < ISP_CSIPHY2_NUM_DATA_LANES; i++) {
> + buscfg->bus.csi2.lanecfg.data[i].pos =
> + vep->bus.mipi_csi2.data_lanes[i];
> + buscfg->bus.csi2.lanecfg.data[i].pol =
> + vep->bus.mipi_csi2.lane_polarities[i + 1];
> + dev_dbg(dev, "data lane %u polarity %u, pos %u\n", i,
> + buscfg->bus.csi2.lanecfg.data[i].pol,
> + buscfg->bus.csi2.lanecfg.data[i].pos);
> + }
>
> - dev_dbg(dev, "parsing endpoint %s, interface %u\n", node->full_name,
> - vep.base.port);
> + /*
> + * FIXME: now we assume the CRC is always there.
> + * Implement a way to obtain this information from the
> + * sensor. Frame descriptors, perhaps?
> + */
> + buscfg->bus.csi2.crc = 1;
> +}
>
> +static int isp_endpoint_to_buscfg(struct device *dev,
> + struct v4l2_of_endpoint vep,
> + struct isp_bus_cfg *buscfg)
> +{
> switch (vep.base.port) {
> case ISP_OF_PHY_PARALLEL:
> buscfg->interface = ISP_INTERFACE_PARALLEL;
> @@ -2059,45 +2130,42 @@ static int isp_of_parse_node(struct device *dev,
> struct device_node *node,
>
> case ISP_OF_PHY_CSIPHY1:
> case ISP_OF_PHY_CSIPHY2:
> - /* FIXME: always assume CSI-2 for now. */
> - switch (vep.base.port) {
> - case ISP_OF_PHY_CSIPHY1:
> - buscfg->interface = ISP_INTERFACE_CSI2C_PHY1;
> - break;
> - case ISP_OF_PHY_CSIPHY2:
> - buscfg->interface = ISP_INTERFACE_CSI2A_PHY2;
> - break;
> - }
> - buscfg->bus.csi2.lanecfg.clk.pos =
vep.bus.mipi_csi2.clock_lane;
> - buscfg->bus.csi2.lanecfg.clk.pol =
> - vep.bus.mipi_csi2.lane_polarities[0];
> - dev_dbg(dev, "clock lane polarity %u, pos %u\n",
> - buscfg->bus.csi2.lanecfg.clk.pol,
> - buscfg->bus.csi2.lanecfg.clk.pos);
> -
> - for (i = 0; i < ISP_CSIPHY2_NUM_DATA_LANES; i++) {
> - buscfg->bus.csi2.lanecfg.data[i].pos =
> - vep.bus.mipi_csi2.data_lanes[i];
> - buscfg->bus.csi2.lanecfg.data[i].pol =
> - vep.bus.mipi_csi2.lane_polarities[i + 1];
> - dev_dbg(dev, "data lane %u polarity %u, pos %u\n", i,
> - buscfg->bus.csi2.lanecfg.data[i].pol,
> - buscfg->bus.csi2.lanecfg.data[i].pos);
> - }
> -
> - /*
> - * FIXME: now we assume the CRC is always there.
> - * Implement a way to obtain this information from the
> - * sensor. Frame descriptors, perhaps?
> - */
> - buscfg->bus.csi2.crc = 1;
> + if (vep.bus_type == V4L2_MBUS_CSI2)
> + isp_of_parse_node_csi2(dev, buscfg, &vep);
> + else
> + isp_of_parse_node_csi1(dev, buscfg, &vep);
> break;
>
> default:
> + return -1;
Please use the appropriate error code.
> + }
> + return 0;
> +}
> +
> +static int isp_of_parse_node_endpoint(struct device *dev,
> + struct device_node *node,
> + struct isp_async_subdev *isd)
> +{
> + struct isp_bus_cfg *buscfg;
> + struct v4l2_of_endpoint vep;
> + int ret;
> +
> + isd->bus = devm_kzalloc(dev, sizeof(*isd->bus), GFP_KERNEL);
Why do you now need to allocate this manually ?
> + if (!isd->bus)
> + return -ENOMEM;
> +
> + buscfg = isd->bus;
> +
> + ret = (node, &vep);
> + if (ret)
> + return ret;
> +
> + dev_dbg(dev, "parsing endpoint %s, interface %u\n", node->full_name,
> + vep.base.port);
> +
> + if (isp_endpoint_to_buscfg(dev, vep, buscfg))
I'm fine splitting the CSI1/CSI2 parsing code to separate functions, but I
don't think there's a need to split isp_endpoint_to_buscfg(). You can keep
that part inline.
> dev_warn(dev, "%s: invalid interface %u\n", node->full_name,
> vep.base.port);
> - break;
> - }
>
> return 0;
> }
> @@ -2124,7 +2192,7 @@ static int isp_of_parse_nodes(struct device *dev,
>
> notifier->subdevs[notifier->num_subdevs] = &isd->asd;
>
> - if (isp_of_parse_node(dev, node, isd)) {
> + if (isp_of_parse_node_endpoint(dev, node, isd)) {
> of_node_put(node);
> return -EINVAL;
> }
> diff --git a/drivers/media/platform/omap3isp/isp.h
> b/drivers/media/platform/omap3isp/isp.h index 7e6f663..c0b9d1d 100644
> --- a/drivers/media/platform/omap3isp/isp.h
> +++ b/drivers/media/platform/omap3isp/isp.h
> @@ -228,7 +228,7 @@ struct isp_device {
>
> struct isp_async_subdev {
> struct v4l2_subdev *sd;
> - struct isp_bus_cfg bus;
> + struct isp_bus_cfg *bus;
> struct v4l2_async_subdev asd;
> };
>
> diff --git a/drivers/media/platform/omap3isp/ispccp2.c
> b/drivers/media/platform/omap3isp/ispccp2.c index ca09523..4edb55a 100644
> --- a/drivers/media/platform/omap3isp/ispccp2.c
> +++ b/drivers/media/platform/omap3isp/ispccp2.c
> @@ -21,6 +21,9 @@
> #include <linux/mutex.h>
> #include <linux/uaccess.h>
> #include <linux/regulator/consumer.h>
> +#include <linux/regmap.h>
> +
> +#include <media/v4l2-of.h>
>
> #include "isp.h"
> #include "ispreg.h"
> @@ -160,6 +163,33 @@ static int ccp2_if_enable(struct isp_ccp2_device *ccp2,
> u8 enable) return ret;
> }
>
> + if (isp->revision == ISP_REVISION_2_0) {
The isp_csiphy.c code checks phy->isp->phy_type for the same purpose,
shouldn't you use that too ?
> + struct media_pad *pad;
> + struct v4l2_subdev *sensor;
> + const struct isp_ccp2_cfg *buscfg;
> + u32 csirxfe;
> +
> + pad = media_entity_remote_pad(&ccp2->pads[CCP2_PAD_SINK]);
> + sensor = media_entity_to_v4l2_subdev(pad->entity);
> + /* Struct isp_bus_cfg has union inside */
> + buscfg = &((struct isp_bus_cfg *)sensor->host_priv)->bus.ccp2;
> +
> +
One blank line is enough.
> + if (enable) {
> + csirxfe = OMAP343X_CONTROL_CSIRXFE_PWRDNZ |
> + OMAP343X_CONTROL_CSIRXFE_RESET;
> +
> + if (buscfg->phy_layer)
> + csirxfe |= OMAP343X_CONTROL_CSIRXFE_SELFORM;
> +
> + if (buscfg->strobe_clk_pol)
> + csirxfe |= OMAP343X_CONTROL_CSIRXFE_CSIB_INV;
> + } else
> + csirxfe = 0;
You need curly braces for the else statement too.
> +
> + regmap_write(isp->syscon, isp->syscon_offset, csirxfe);
Isn't this already configured by csiphy_routing_cfg_3430(), called through
omap3isp_csiphy_acquire() ? You'll need to add support for the strobe/clock
polarity there, but the rest should already be handled.
> + }
> +
> /* Enable/Disable all the LCx channels */
> for (i = 0; i < CCP2_LCx_CHANS_NUM; i++)
> isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_CCP2,
ISPCCP2_LCx_CTRL(i),
> @@ -213,14 +243,17 @@ static int ccp2_phyif_config(struct isp_ccp2_device
> *ccp2, struct isp_device *isp = to_isp_device(ccp2);
> u32 val;
>
> - /* CCP2B mode */
> val = isp_reg_readl(isp, OMAP3_ISP_IOMEM_CCP2, ISPCCP2_CTRL) |
> - ISPCCP2_CTRL_IO_OUT_SEL | ISPCCP2_CTRL_MODE;
> + ISPCCP2_CTRL_MODE;
> /* Data/strobe physical layer */
> BIT_SET(val, ISPCCP2_CTRL_PHY_SEL_SHIFT, ISPCCP2_CTRL_PHY_SEL_MASK,
> buscfg->phy_layer);
> + BIT_SET(val, ISPCCP2_CTRL_IO_OUT_SEL_SHIFT,
> + ISPCCP2_CTRL_IO_OUT_SEL_MASK, buscfg->ccp2_mode);
> BIT_SET(val, ISPCCP2_CTRL_INV_SHIFT, ISPCCP2_CTRL_INV_MASK,
> buscfg->strobe_clk_pol);
> + BIT_SET(val, ISPCCP2_CTRL_VP_CLK_POL_SHIFT,
> + ISPCCP2_CTRL_VP_CLK_POL_MASK, buscfg->vp_clk_pol);
> isp_reg_writel(isp, val, OMAP3_ISP_IOMEM_CCP2, ISPCCP2_CTRL);
>
> val = isp_reg_readl(isp, OMAP3_ISP_IOMEM_CCP2, ISPCCP2_CTRL);
> @@ -339,6 +372,9 @@ static void ccp2_lcx_config(struct isp_ccp2_device
> *ccp2, isp_reg_set(isp, OMAP3_ISP_IOMEM_CCP2, ISPCCP2_LC01_IRQENABLE, val);
> }
>
> +void __isp_of_parse_node_csi1(struct device *dev,
> + struct isp_ccp2_cfg *buscfg,
> + struct v4l2_of_endpoint *vep);
This isn't needed.
> /*
> * ccp2_if_configure - Configure ccp2 with data from sensor
> * @ccp2: Pointer to ISP CCP2 device
> @@ -1137,6 +1173,8 @@ int omap3isp_ccp2_init(struct isp_device *isp)
> if (isp->revision == ISP_REVISION_2_0) {
> ccp2->vdds_csib = devm_regulator_get(isp->dev, "vdds_csib");
> if (IS_ERR(ccp2->vdds_csib)) {
> + if (PTR_ERR(ccp2->vdds_csib) == -EPROBE_DEFER)
> + return -EPROBE_DEFER;
> dev_dbg(isp->dev,
> "Could not get regulator vdds_csib\n");
> ccp2->vdds_csib = NULL;
> diff --git a/drivers/media/platform/omap3isp/ispreg.h
> b/drivers/media/platform/omap3isp/ispreg.h index b5ea8da..d084839 100644
> --- a/drivers/media/platform/omap3isp/ispreg.h
> +++ b/drivers/media/platform/omap3isp/ispreg.h
> @@ -87,6 +87,8 @@
> #define ISPCCP2_CTRL_PHY_SEL_MASK 0x1
> #define ISPCCP2_CTRL_PHY_SEL_SHIFT 1
> #define ISPCCP2_CTRL_IO_OUT_SEL (1 << 2)
> +#define ISPCCP2_CTRL_IO_OUT_SEL_MASK 0x1
> +#define ISPCCP2_CTRL_IO_OUT_SEL_SHIFT 2
> #define ISPCCP2_CTRL_MODE (1 << 4)
> #define ISPCCP2_CTRL_VP_CLK_FORCE_ON (1 << 9)
> #define ISPCCP2_CTRL_INV (1 << 10)
> @@ -94,6 +96,8 @@
> #define ISPCCP2_CTRL_INV_SHIFT 10
> #define ISPCCP2_CTRL_VP_ONLY_EN (1 << 11)
> #define ISPCCP2_CTRL_VP_CLK_POL (1 << 12)
> +#define ISPCCP2_CTRL_VP_CLK_POL_MASK 0x1
> +#define ISPCCP2_CTRL_VP_CLK_POL_SHIFT 12
> #define ISPCCP2_CTRL_VPCLK_DIV_SHIFT 15
> #define ISPCCP2_CTRL_VPCLK_DIV_MASK 0x1ffff /* [31:15] */
> #define ISPCCP2_CTRL_VP_OUT_CTRL_SHIFT 8 /* 3430 bits */
> diff --git a/drivers/media/platform/omap3isp/omap3isp.h
> b/drivers/media/platform/omap3isp/omap3isp.h index 443e8f7..f6d1d0d 100644
> --- a/drivers/media/platform/omap3isp/omap3isp.h
> +++ b/drivers/media/platform/omap3isp/omap3isp.h
> @@ -108,6 +108,7 @@ struct isp_ccp2_cfg {
> unsigned int ccp2_mode:1;
> unsigned int phy_layer:1;
> unsigned int vpclk_div:2;
> + unsigned int vp_clk_pol:1;
> struct isp_csiphy_lanes_cfg lanecfg;
> };
>
> diff --git a/include/media/v4l2-mediabus.h b/include/media/v4l2-mediabus.h
> index 34cc99e..315c167 100644
> --- a/include/media/v4l2-mediabus.h
> +++ b/include/media/v4l2-mediabus.h
You should split the V4L2 core changes to a separate patch.
> @@ -69,11 +69,15 @@
> * @V4L2_MBUS_PARALLEL: parallel interface with hsync and vsync
> * @V4L2_MBUS_BT656: parallel interface with embedded synchronisation, can
> * also be used for BT.1120
> + * @V4L2_MBUS_CSI1: MIPI CSI-1 serial interface
> + * @V4L2_MBUS_CCP2: CCP2 (Compact Camera Port 2)
It would help if you could provide, in comments or in the commit message, a
few pointers to information about CSI-1 and CCP2.
> * @V4L2_MBUS_CSI2: MIPI CSI-2 serial interface
> */
> enum v4l2_mbus_type {
> V4L2_MBUS_PARALLEL,
> V4L2_MBUS_BT656,
> + V4L2_MBUS_CSI1,
> + V4L2_MBUS_CCP2,
That's nice, but v4l2_of_parse_endpoint() never sets the bus type to CSI1 or
CCP2. You need to fix that (and update the related DT bindings).
> V4L2_MBUS_CSI2,
> };
>
> diff --git a/include/media/v4l2-of.h b/include/media/v4l2-of.h
> index 4dc34b2..63a52ee 100644
> --- a/include/media/v4l2-of.h
> +++ b/include/media/v4l2-of.h
> @@ -53,6 +53,22 @@ struct v4l2_of_bus_parallel {
> };
>
> /**
> + * struct v4l2_of_bus_csi1 - CSI-1/CCP2 data bus structure
> + * @clock_inv: polarity of clock/strobe signal
> + * false - not inverted, true - inverted
> + * @strobe: false - data/clock, true - data/strobe
> + * @data_lane: the number of the data lane
> + * @clock_lane: the number of the clock lane
> + */
> +struct v4l2_of_bus_mipi_csi1 {
> + bool clock_inv;
> + bool strobe;
> + bool lane_polarity[2];
This field isn't documented.
> + unsigned char data_lane;
> + unsigned char clock_lane;
> +};
> +
> +/**
> * struct v4l2_of_endpoint - the endpoint data structure
> * @base: struct of_endpoint containing port, id, and local of_node
> * @bus_type: bus type
> @@ -66,6 +82,7 @@ struct v4l2_of_endpoint {
> enum v4l2_mbus_type bus_type;
> union {
> struct v4l2_of_bus_parallel parallel;
> + struct v4l2_of_bus_mipi_csi1 mipi_csi1;
> struct v4l2_of_bus_mipi_csi2 mipi_csi2;
> } bus;
> u64 *link_frequencies;
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2017-02-08 21:56 UTC|newest]
Thread overview: 91+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-28 18:30 [PATCH] dt: bindings: Add support for CSI1 bus Pavel Machek
2017-01-02 7:00 ` Sakari Ailus
2017-01-02 7:00 ` Sakari Ailus
2017-01-11 21:38 ` Pavel Machek
2017-01-03 20:38 ` Rob Herring
2017-01-03 20:38 ` Rob Herring
2017-01-04 8:54 ` Sakari Ailus
2017-01-04 8:54 ` Sakari Ailus
2017-01-11 22:06 ` Pavel Machek
2017-01-11 22:19 ` Sakari Ailus
2017-01-11 22:53 ` [PATCHv2] " Pavel Machek
2017-01-11 22:53 ` Pavel Machek
2017-01-11 23:55 ` Sebastian Reichel
2017-01-11 23:55 ` Sebastian Reichel
2017-01-12 12:06 ` Baruch Siach
2017-01-12 12:06 ` Baruch Siach
2017-01-19 21:37 ` Sakari Ailus
2017-01-19 21:49 ` Sakari Ailus
2017-01-19 21:49 ` Sakari Ailus
[not found] ` <20170119214905.GD3205-S+BSfZ9RZZmRSg0ZkenSGLdO1Tsj/99ntUK59QYPAWc@public.gmane.org>
2017-01-20 7:59 ` Ivaylo Dimitrov
2017-01-20 7:59 ` Ivaylo Dimitrov
[not found] ` <cf372233-f047-6e2c-01eb-02e30e6b2de5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-01-20 11:46 ` Sakari Ailus
2017-01-20 11:46 ` Sakari Ailus
2017-02-03 11:50 ` Pavel Machek
2017-02-03 11:50 ` Pavel Machek
2017-02-03 14:16 ` Sakari Ailus
2017-02-03 14:16 ` Sakari Ailus
[not found] ` <20170203141649.GC12291-S+BSfZ9RZZmRSg0ZkenSGLdO1Tsj/99ntUK59QYPAWc@public.gmane.org>
2017-02-06 9:53 ` Pavel Machek
2017-02-06 9:53 ` Pavel Machek
2017-02-06 9:49 ` Pavel Machek
2017-02-06 9:49 ` Pavel Machek
2017-02-08 8:38 ` Sakari Ailus
2017-02-08 12:57 ` [PATCH] omap3isp: add " Pavel Machek
2017-02-08 18:32 ` kbuild test robot
2017-02-08 21:03 ` Laurent Pinchart [this message]
2017-02-15 9:42 ` Pavel Machek
2017-02-20 0:59 ` Laurent Pinchart
2017-02-20 12:06 ` [PATCH] omap3isp: avoid uninitialized memory Pavel Machek
2017-02-21 11:20 ` Sakari Ailus
2017-03-01 11:45 ` [media] omap3isp: Correctly set IO_OUT_SEL and VP_CLK_POL for CCP2 mode Pavel Machek
2017-03-03 11:13 ` kbuild test robot
2017-03-03 21:48 ` Pavel Machek
2017-03-10 1:24 ` [kbuild-all] " Ye Xiaolong
2017-03-10 2:49 ` Fengguang Wu
2017-03-04 15:15 ` Sakari Ailus
2017-03-04 19:44 ` Pavel Machek
2017-03-02 9:01 ` [PATCH] omap3isp: add support for CSI1 bus Pavel Machek
2017-03-02 10:16 ` [PATCHv2] " Pavel Machek
2017-03-02 11:24 ` Sakari Ailus
2017-03-02 12:38 ` Pavel Machek
2017-03-03 22:17 ` Sakari Ailus
2017-03-04 13:03 ` Sakari Ailus
2017-03-04 15:39 ` Sakari Ailus
2017-03-04 18:44 ` Laurent Pinchart
2017-04-26 21:19 ` [bug] omap3isp: missing support for ENUM_FMT Pavel Machek
2017-04-28 7:59 ` Sakari Ailus
2017-03-04 22:53 ` [PATCHv2] omap3isp: add support for CSI1 bus Pavel Machek
2017-03-05 14:13 ` Pavel Machek
2017-03-06 7:23 ` [PATCH] v4l2-fwnode: Fix clock lane parsing Pavel Machek
2017-03-10 22:54 ` Sakari Ailus
2017-06-13 12:22 ` v4l2-fwnode: status, plans for merge, any branch to merge against? Pavel Machek
2017-06-13 12:47 ` Sakari Ailus
2017-06-13 21:09 ` Pavel Machek
2017-06-14 11:06 ` Sakari Ailus
2017-06-14 19:41 ` Pavel Machek
2017-06-15 22:07 ` Sakari Ailus
2017-06-16 6:23 ` Pavel Machek
2017-06-15 22:22 ` n900 camera on v4.12-rc (was Re: v4l2-fwnode: status, plans for merge, any branch to merge against?) Pavel Machek
2017-06-15 22:23 ` [PATCH] omap3isp: fix compilation Pavel Machek
2017-06-16 8:03 ` Hans Verkuil
2017-06-16 11:59 ` Sakari Ailus
2017-07-04 15:08 ` v4l2-fwnode: status, plans for merge, any branch to merge against? Pavel Machek
2017-07-05 9:32 ` Sakari Ailus
2017-07-06 10:38 ` Pavel Machek
2017-07-11 16:12 ` Sakari Ailus
2017-07-12 16:32 ` Pavel Machek
2017-07-12 20:31 ` omap3isp: is capture mode working? what hardware? was " Pavel Machek
2017-03-06 7:57 ` [RFC] omap3isp: add support for CSI1 bus Pavel Machek
2017-03-10 13:41 ` Pavel Machek
2017-04-11 18:15 ` Pavel Machek
2017-05-03 7:43 ` [PATCHv2] " Sakari Ailus
2017-05-03 19:50 ` Pavel Machek
2017-05-03 20:24 ` Pavel Machek
2017-03-02 12:45 ` [PATCH] omap3isp: wait for regulators to come up Pavel Machek
2017-03-02 14:46 ` Laurent Pinchart
2017-03-04 15:33 ` Sakari Ailus
2017-02-15 10:23 ` [PATCH] omap3isp: add support for CSI1 bus Pavel Machek
2017-02-15 16:57 ` Sebastian Reichel
2017-02-15 17:06 ` Pavel Machek
2017-02-08 23:03 ` [PATCHv2] dt: bindings: Add " Rob Herring
2017-02-08 23:03 ` Rob Herring
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=10545906.Gxg3yScdu4@avalon \
--to=laurent.pinchart@ideasonboard.com \
--cc=ivo.g.dimitrov.75@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@kernel.org \
--cc=pali.rohar@gmail.com \
--cc=pavel@ucw.cz \
--cc=sakari.ailus@iki.fi \
--cc=sre@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.