devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sylwester Nawrocki <sylvester.nawrocki@gmail.com>
To: Sakari Ailus <sakari.ailus@iki.fi>, Sebastian Reichel <sre@debian.org>
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
	linux-media@vger.kernel.org, devicetree@vger.kernel.org,
	Rob Herring <rob.herring@calxeda.com>,
	Pawel Moll <pawel.moll@arm.com>,
	Mark Rutland <mark.rutland@arm.com>,
	Ian Campbell <ijc+devicetree@hellion.org.uk>
Subject: Re: [RFCv2] Device Tree bindings for OMAP3 Camera System
Date: Mon, 20 Jan 2014 23:16:43 +0100	[thread overview]
Message-ID: <52DDA04B.90809@gmail.com> (raw)
In-Reply-To: <20140120041904.GH9997@valkosipuli.retiisi.org.uk>

Hi,

On 01/20/2014 05:19 AM, Sakari Ailus wrote:
> Hi Sebastian,
>
> I've also been working on this (besides others); what I have however are
> mostly experimental patches. I'm also using patches from Laurent, Florian
> Vaussard (IOMMU) and Hiroshi Doyu (IOMMU as well). My tree is here:
>
> <URL:http://vihersipuli.retiisi.org.uk/cgi-bin/gitweb.cgi?p=~sailus/linux.git;a=summary>
>
> The branch is rm696-035-dt. The intent is to get the N9/N950 camera support
> to mainline. Most patches in that branch are experimental. What is missing
> entirely is constucting subdev groups off of the devices found. The rest
> will likely contain lots of bugs.
>
> Seems like you've started with documentation which I'm lacking entirely.
> Good! :)
>
> You might want to take a look at least at this one as well:
>
> <URL:http://vihersipuli.retiisi.org.uk/cgi-bin/gitweb.cgi?p=~sailus/linux.git;a=commitdiff;h=58f7754099539178f47dcca97981bf2ba4c73e54>
>
> On Wed, Jan 15, 2014 at 08:41:28PM +0100, Sebastian Reichel wrote:
>> Hi,
>>
>> I finally found some time to update the proposed binding
>> documentation for omap3isp according to the comments on RFCv1.
>>
>> Changes since v1:
>>   * Use common DT clock bindings to provide isp-xclk
>>   * Use common DT video-interface bindings to specify device connections
>>   * Apply style updates suggested by Mark Rutland
>>   * I renamed ti,enable-crc to ti,disable-crc, since I think its supposed
>>     to be used for remote hw adding broken crc values. I can't see other
>>     reasons for disabling it :)
>>   * I've kept the clocks the same for now. I think somebody else should look
>>     over them. Changing the actual referenced clocks / renaming them is just
>>     a small change and can be done at a later time in the omap3isp DT process
>>     IMHO.
>>   * I've kept the reg reference as a list for now, since that's how the
>>     omap3isp driver currently works and I can't see any disadvantages
>>     in making the memory segmentation visible in the DTS file.
>>
>> So here is the proposed DT binding documentation:
>>
>> Binding for the OMAP3 Camera subsystem with the image signal processor (ISP)
>> feature. The binding follows the common video-interfaces Device Tree binding,
>> so it is recommended to read the common binding description first. This description
>
> Over 80 characters per line.
>
>> can be found in Documentation/devicetree/bindings/media/video-interfaces.txt
>>
>> omap3isp node
>> -------------
>>
>> Required properties:
>>
>> - compatible    : should be "ti,omap3isp" for OMAP3.
>> - reg       : physical addresses and length of the registers set.
>> - clocks    : list of clock specifiers, corresponding to entries in
>>            clock-names property.
>> - clock-names   : must contain "cam_ick", "cam_mclk", "csi2_96m_fck",
>>            "l3_ick" entries, matching entries in the clocks property.
>> - interrupts    : must contain mmu interrupt.
>> - ti,iommu  : phandle to isp mmu.
>
> Is the TI specific? I'd assume not. Hiroshi's patches assume that at least.
>
>> - #address-cells: Should be set to<1>.
>> - #size-cells   : Should be set to<0>.
>
> The ISP also exports clocks. Shouldn't you add
>
> #clock-cells =<1>;

If we treat the omap3isp node as the clock provider node then yes, it
should be added. And I think it is reasonable to do so, instead of e.g.
adding a separate DT node for the clocks provider.

>> Optional properties:
>>
>> - vdd-csiphy1-supply    : regulator for csi phy1
>> - vdd-csiphy2-supply    : regulator for csi phy2
>>
>> isp-xclk subnode
>> ----------------
>>
>> The omap3 ISP provides two external clocks, which are available as subnodes of
>> the omap3isp node. Devices using one of these clock devices are supposed to follow
>> the common Device Tree clock bindings described in
>>
>> Documentation/devicetree/bindings/clock/clock-bindings.txt
>>
>> Required properties:
>>   - compatible   : should contain "ti,omap3-cam-xclk"
>>   - reg      : should be set to
>>    *<0>  for cam_xclka
>>    *<1>  for cam_xclkb
>>   - #clock-cells : should be set to<0>
>
> Or to do this instead. I'm not an expert (or perhaps not even a little less)
> in DT so I don't know. The ISP is still a single device, and I think you
> might not need these to just refer to the clocks from elsewhere in the DT.

This doesn't seem to follow the common clock bindings.

Instead, you could define value of #clock-cells to be 1 and allow clocks
consumers to reference the provider node in a standard way, e.g.:

/* clk provider node */
omap3isp-clocks {
	#clock-cells = <1>;
};

camera-sensor-0 {
	clocks = <&omap3isp-clocks 0>; /* XCLK A */
	clock-names = ...
};

camera-sensor-1 {	
	clocks = <&omap3isp-clocks 1>; /* XCLK B */
	clock-names = ...
};

>> port subnode
>> ------------
>>
>> The omap3 ISP provides three different physical interfaces for camera
>> connections. Each of them is described using a port node.
>>
>> Required properties:
>>   - reg : Should be set to one of the following values
>>     *<0>  for the parallel interface (CPI)
>>     *<1>  for the first serial interface (CSI1)
>>     *<2>  for the second serial interface (CSI2)
>
> There are two PHYs in 3630 but three receivers. Currently the two are
> combined in the configuration. I think I agree with your approach.
>
>> endpoint subnode for parallel interface
>> ---------------------------------------
>>
>> The endpoint subnode describes the connection between the port and the remote
>> camera device.
>>
>> Required properties:
>>   - remote-endpoint  : phandle to remote device
>>
>> Optional properties:
>>   - data-shift       : integer describing how far the data lanes are shifted.
>>   - pclk-sample      : integer describing if clk should be interpreted on
>>                rising (<1>) or falling edge (<0>). Default is<1>.
>>   - hsync-active     : integer describing if hsync is active high (<1>) or
>>                active low (<0>). Default is<1>.
>>   - vsync-active     : integer describing if vsync is active high (<1>) or
>>                active low (<0>). Default is<1>.
>>   - ti,data-ones-complement : boolean, describing that the data's polarity is
>>                   one's complement.
>>
>> endpoint subnode for serial interfaces
>> --------------------------------------
>>
>> Required properties:
>>   - ti,isp-interface-type    : should be one of the following values
>
> I think the interface type should be standardised at V4L2 level. We
> currently do not do that, but instead do a little bit of guessing.

I'm all for such a standard property. It seems much more clear to use such
a property. And I already run into issues with deriving the bus interface
type from existing properties, please see https://linuxtv.org/patch/19937

I assume it would be fine to add a string type property like 
"interface-type"
or "bus-type".

>>    *<0>  to use the phy in CSI mode
>>    *<1>  to use the phy in CCP mode
>>    *<2>  to use the phy in CCP mode, but configured for MIPI CSI2
>
> Hmm. I'm not entirely sure what does this last option mean. I could be
> forgetting something, though.
>
>>   - ti,isp-clock-divisor     : integer used for configuration of the
>>                    video port output clock control.
>>
>> Optional properties:
>>   - ti,disable-crc       : boolean, which disables crc checking.
>
> I think crc should be standardised as well.

Definitely something we should have a common definition for.

>>   - ti,strobe-mode       : boolean, which setups data/strobe physical
>>                    layer instead of data/clock physical layer.
>>   - pclk-sample          : integer describing if clk should be interpreted on
>>                    rising (<1>) or falling edge (<0>). Default is<1>.
>
> I see different values on the N9 platform data for CCP2 and CSI2 (front and
> back camera). I'm not sure the bus type is related to this or not.
>
>> - data-lanes: an array of physical data lane indexes. Position of an entry
>>    determines the logical lane number, while the value of an entry indicates
>>    physical lane, e.g. for 2-lane MIPI CSI-2 bus we could have
>>    "data-lanes =<1 2>;", assuming the clock lane is on hardware lane 0.
>>    This property is valid for serial busses only (e.g. MIPI CSI-2).
>> - clock-lanes: an array of physical clock lane indexes. Position of an entry
>>    determines the logical lane number, while the value of an entry indicates
>>    physical lane, e.g. for a MIPI CSI-2 bus we could have "clock-lanes =<0>;",
>>    which places the clock lane on hardware lane 0. This property is valid for
>>    serial busses only (e.g. MIPI CSI-2). Note that for the MIPI CSI-2 bus this
>>    array contains only one entry.
>
> I'd rather refer to
> Documentation/devicetree/bindings/media/video-interfaces.txt than copy from
> it. It's important that there's a single definition for the standard
> properties. Just mentioning the property by name should be enough. What do
> you think?

+1

>> Example for Nokia N900
>> ----------------------
>>
>> omap3isp: isp@480BC000 {
>>      compatible = "ti,omap3isp";
>>      reg =<0x480BC000 0x070>, /* base */
>>          <0x480BC100 0x078>, /* cbuf */
>>          <0x480BC400 0x1F0>, /* cpp2 */
>>          <0x480BC600 0x0A8>, /* ccdc */
>>          <0x480BCA00 0x048>, /* hist */
>>          <0x480BCC00 0x060>, /* h3a  */
>>          <0x480BCE00 0x0A0>, /* prev */
>>          <0x480BD000 0x0AC>, /* resz */
>>          <0x480BD200 0x0FC>, /* sbl  */
>>          <0x480BD400 0x070>; /* mmu  */
>
> Mmu is a separate device. (Please see my patches.)
>
>>      clocks =<&cam_ick>,
>>           <&cam_mclk>,
>>           <&csi2_96m_fck>,
>>           <&l3_ick>;
>>      clock-names = "cam_ick",
>>                "cam_mclk",
>>                "csi2_96m_fck",
>>                "l3_ick";
>>
>>      interrupts =<24>;
>>
>>      ti,iommu =<&mmu_isp>;


>>      isp_xclk1: isp-xclk@0 {
>>          compatible = "ti,omap3-isp-xclk";
>>          reg =<0>;
>>          #clock-cells =<0>;
>>      };
>>
>>      isp_xclk2: isp-xclk@1 {
>>          compatible = "ti,omap3-isp-xclk";
>>          reg =<1>;
>>          #clock-cells =<0>;
>>      };

I think these whole 2 nodes could be omitted...

>>      #address-cells =<1>;
>>      #size-cells =<0>;

.. if you add here:

	#clock-cells =<1>;

>>      port@0 {
>>          reg =<0>;
>>
>>          /* parallel interface is not used on Nokia N900 */
>>          parallel_ep: endpoint {};
>>      };
>>
>>      port@1 {
>>          reg =<1>;
>>
>>          csi1_ep: endpoint {
>>              remote-endpoint =<&switch_in>;
>>              ti,isp-clock-divisor =<1>;
>>              ti,strobe-mode;
>>          };
>>      }
>>
>>      port@2 {
>>          reg =<2>;
>>
>>          /* second serial interface is not used on Nokia N900 */
>>          csi2_ep: endpoint {};
>>      }
>> };
>>
>> camera-switch {
>>      /*
>>       * TODO:
>>       *  - check if the switching code is generic enough to use a
>>       *    more generic name like "gpio-camera-switch".
>>       *  - document the camera-switch binding
>>       */
>>      compatible = "nokia,n900-camera-switch";
>
> Indeed. I don't think the hardware engineers realised what kind of a long
> standing issue they created for us when they chose that solution. ;)
>
> Writing a small driver for this that exports a sub-device would probably be
> the best option as this is hardly very generic. Should this be shown to the
> user space or not? Probably it'd be nice to avoid showing the related sub-device
> if there would be one.

Probably we should avoid exposing such a hardware detail to user space.
OTOH it would be easy to handle as a media entity through the media 
controller
API.

> I'm still trying to get N9 support working first, the drivers are in a
> better shape and there are no such hardware hacks.
>
>>      gpios =<&gpio4 1>; /* 97 */

I think the binding should be defining how state of the GPIO corresponds
to state of the mux.

>>      port@0 {
>>          switch_in: endpoint {
>>              remote-endpoint =<&csi1_ep>;
>>          };
>>
>>          switch_out1: endpoint {
>>              remote-endpoint =<&et8ek8>;
>>          };
>>
>>          switch_out2: endpoint {
>>              remote-endpoint =<&smiapp_dfl>;
>>          };
>>      };

This won't work, since names of the nodes are identical they will be 
combined
by the dtc into a single 'endpoint' node with single 'remote-endpoint' 
property
- might not be exactly something that you want.
So it could be rewritten like:

  port@0 {
	#address-cells = <1>;
	#size-cells = <0>;

	switch_in: endpoint@0 {
		reg = <0>;
		remote-endpoint =<&csi1_ep>;
	};

         switch_out1: endpoint@1 {
		reg = <1>;
		remote-endpoint =<&et8ek8>;
	};

	switch_out2: endpoint@2 {
		reg = <2>;
		remote-endpoint =<&smiapp_dfl>;
	};
  };

However, simplifying a bit, the 'endpoint' nodes are supposed to describe
the configuration of a bus interface (port) for a specific remote device.
Then what you need might be something like:

  camera-switch {
	compatible = "nokia,n900-camera-switch";

	#address-cells = <1>;
	#size-cells = <0>;

	switch_in: port@0 {
		reg = <0>;
		endpoint {
			remote-endpoint =<&csi1_ep>;
		};
	};

         switch_out1: port@1 {
		reg = <1>;
		endpoint {
			remote-endpoint =<&et8ek8>;
		};
	};

	switch_out2: port@2 {
		endpoint {
			reg = <2>;
			remote-endpoint =<&smiapp_dfl>;
		};
	};
  };

I'm just wondering if we need to be describing this in DT in such detail.

--
Thanks,
Sylwester

  reply	other threads:[~2014-01-20 22:16 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-03 22:03 [early RFC] Device Tree bindings for OMAP3 Camera Subsystem Sebastian Reichel
2013-11-04 19:49 ` jean-philippe francois
2013-11-06  0:48 ` Laurent Pinchart
2013-11-15 17:18 ` Mark Rutland
2014-01-15 19:41 ` [RFCv2] Device Tree bindings for OMAP3 Camera System Sebastian Reichel
2014-01-20  4:19   ` Sakari Ailus
2014-01-20 22:16     ` Sylwester Nawrocki [this message]
2014-01-20 23:27       ` Sebastian Reichel
2014-01-22 22:27         ` Sylwester Nawrocki
2014-01-22 22:57           ` Laurent Pinchart
2014-01-23  0:11             ` Sebastian Reichel
2014-01-23 11:44               ` Laurent Pinchart
2014-02-01  9:39         ` Sakari Ailus

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=52DDA04B.90809@gmail.com \
    --to=sylvester.nawrocki@gmail.com \
    --cc=devicetree@vger.kernel.org \
    --cc=ijc+devicetree@hellion.org.uk \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux-media@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=pawel.moll@arm.com \
    --cc=rob.herring@calxeda.com \
    --cc=sakari.ailus@iki.fi \
    --cc=sre@debian.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).