Message ID | 1392925237-31394-5-git-send-email-s.nawrocki@samsung.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, Feb 20, 2014 at 07:40:30PM +0000, Sylwester Nawrocki wrote: > This patch documents following updates of the Exynos4 SoC camera subsystem > devicetree binding: > - addition of #clock-cells property to 'camera' node - the #clock-cells > property is needed when the sensor sub-devices use clock provided by > the camera host interface; > - addition of an optional clock-output-names property; > - change of the clock-frequency at image sensor node from mandatory to > an optional property - there should be no need to require this property > by the camera host device binding, a default frequency value can ofen > be used; > - addition of a requirement of specific order of values in clocks/ > clock-names properties, so the first two entry in the clock-names > property can be used as parent clock names for the camera master > clock provider. It happens all in-kernel dts files list the clock > in such order, thus there should be no regression as far as in-kernel > dts files are concerned. I'm not sure I follow the reasoning here. Why does this matter? Why can child nodes not get these by name if they have to? > > Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com> > Acked-by: Kyungmin Park <kyungmin.park@samsung.com> > --- > .../devicetree/bindings/media/samsung-fimc.txt | 36 +++++++++++++++----- > 1 file changed, 28 insertions(+), 8 deletions(-) > > diff --git a/Documentation/devicetree/bindings/media/samsung-fimc.txt b/Documentation/devicetree/bindings/media/samsung-fimc.txt > index 96312f6..1a5820d 100644 > --- a/Documentation/devicetree/bindings/media/samsung-fimc.txt > +++ b/Documentation/devicetree/bindings/media/samsung-fimc.txt > @@ -20,6 +20,7 @@ Required properties: > the clock-names property; > - clock-names : must contain "sclk_cam0", "sclk_cam1", "pxl_async0", > "pxl_async1" entries, matching entries in the clocks property. > + First two entries must be "sclk_cam0", "sclk_cam1". I don't think this is a good idea. > > The pinctrl bindings defined in ../pinctrl/pinctrl-bindings.txt must be used > to define a required pinctrl state named "default" and optional pinctrl states: > @@ -32,6 +33,22 @@ way around. > > The 'camera' node must include at least one 'fimc' child node. > > +Optional properties (*: Is that a smiley face? > + > +- #clock-cells: from the common clock bindings (../clock/clock-bindings.txt), > + must be 1. A clock provider is associated with the 'camera' node and it should > + be referenced by external sensors that use clocks provided by the SoC on > + CAM_*_CLKOUT pins. The clock specifier cell stores an index of a clock. > + The indices are 0, 1 for CAM_A_CLKOUT, CAM_B_CLKOUT clocks respectively. > + > +- clock-output-names: from the common clock bindings, should contain names of > + clocks registered by the camera subsystem corresponding to CAM_A_CLKOUT, > + CAM_B_CLKOUT output clocks, in this order. Parent clock of these clocks are > + specified be first two entries of the clock-names property. Do you need this? That's not how clock-names is supposed to work. The clock-names property is for the names of the _input_ clock lines on the device, not the output names on whichever parent clock they came from. Any clock-names property description should define absolutely the set of names. As this does not, NAK. > + > +(* #clock-cells and clock-output-names are mandatory properties if external > +image sensor devices reference 'camera' device node as a clock provider. s/(*/Note:/ > + > 'fimc' device nodes > ------------------- > > @@ -97,8 +114,8 @@ Image sensor nodes > The sensor device nodes should be added to their control bus controller (e.g. > I2C0) nodes and linked to a port node in the csis or the parallel-ports node, > using the common video interfaces bindings, defined in video-interfaces.txt. > -The implementation of this bindings requires clock-frequency property to be > -present in the sensor device nodes. > +An optional clock-frequency property needs to be present in the sensor device > +nodes. Default value when this property is not present is 24 MHz. s/needs to/should/ ? What is this the frequency of? Thanks, Mark.
On 02/21/2014 04:50 PM, Mark Rutland wrote: > On Thu, Feb 20, 2014 at 07:40:30PM +0000, Sylwester Nawrocki wrote: >> This patch documents following updates of the Exynos4 SoC camera subsystem >> devicetree binding: >> - addition of #clock-cells property to 'camera' node - the #clock-cells >> property is needed when the sensor sub-devices use clock provided by >> the camera host interface; >> - addition of an optional clock-output-names property; >> - change of the clock-frequency at image sensor node from mandatory to >> an optional property - there should be no need to require this property >> by the camera host device binding, a default frequency value can ofen >> be used; >> - addition of a requirement of specific order of values in clocks/ >> clock-names properties, so the first two entry in the clock-names >> property can be used as parent clock names for the camera master >> clock provider. It happens all in-kernel dts files list the clock >> in such order, thus there should be no regression as far as in-kernel >> dts files are concerned. > > I'm not sure I follow the reasoning here. Why does this matter? Why can > child nodes not get these by name if they have to? These input clocks won't be used directly by child nodes. More details below... >> Signed-off-by: Sylwester Nawrocki<s.nawrocki@samsung.com> >> Acked-by: Kyungmin Park<kyungmin.park@samsung.com> >> --- >> .../devicetree/bindings/media/samsung-fimc.txt | 36 +++++++++++++++----- >> 1 file changed, 28 insertions(+), 8 deletions(-) >> >> diff --git a/Documentation/devicetree/bindings/media/samsung-fimc.txt b/Documentation/devicetree/bindings/media/samsung-fimc.txt >> index 96312f6..1a5820d 100644 >> --- a/Documentation/devicetree/bindings/media/samsung-fimc.txt >> +++ b/Documentation/devicetree/bindings/media/samsung-fimc.txt >> @@ -20,6 +20,7 @@ Required properties: >> the clock-names property; >> - clock-names : must contain "sclk_cam0", "sclk_cam1", "pxl_async0", >> "pxl_async1" entries, matching entries in the clocks property. >> + First two entries must be "sclk_cam0", "sclk_cam1". > > I don't think this is a good idea. > >> >> The pinctrl bindings defined in ../pinctrl/pinctrl-bindings.txt must be used >> to define a required pinctrl state named "default" and optional pinctrl states: >> @@ -32,6 +33,22 @@ way around. >> >> The 'camera' node must include at least one 'fimc' child node. >> >> +Optional properties (*: > > Is that a smiley face? Sorry, it was supposed to be a reference mark, will remove this. >> +- #clock-cells: from the common clock bindings (../clock/clock-bindings.txt), >> + must be 1. A clock provider is associated with the 'camera' node and it should >> + be referenced by external sensors that use clocks provided by the SoC on >> + CAM_*_CLKOUT pins. The clock specifier cell stores an index of a clock. >> + The indices are 0, 1 for CAM_A_CLKOUT, CAM_B_CLKOUT clocks respectively. >> + >> +- clock-output-names: from the common clock bindings, should contain names of >> + clocks registered by the camera subsystem corresponding to CAM_A_CLKOUT, >> + CAM_B_CLKOUT output clocks, in this order. Parent clock of these clocks are >> + specified be first two entries of the clock-names property. > > Do you need this? All right, that might have been a bad idea, it mixes names of clocks registered by the main clock controller with names of clock input lines at the device. It's a mistake I have been usually sensitive to and now made it myself. :/ My intention was to maintain the clock tree, since the camera block doesn't generate the clock itself, it merely passes through the clocks from the SoC main clock controller (CMU). So clk parents need to be properly set and since there is no clock-output-names property at the CMU DT node, of_clk_get_parent_name() cannot be used. So presumably the DT binding would be only specifying that the sclk_cam0, sclk_cam1 clock input entries are associated with output clocks named as in clock-output-names property. And the driver could either: 1) hard code those (well defined) CMU clock (clk parent) names, 2) clk_get() its input clock, retrieve name with __clk_get_name() and pass it as parent name to clk_register() - it sounds a bit hacky though. The output clock names could be also well defined by the binding per the IP's compatible. Nevertheless using clock-output-names seems cleaner to me than defining character strings in the driver. What do you think ? > That's not how clock-names is supposed to work. The clock-names property > is for the names of the _input_ clock lines on the device, not the > output names on whichever parent clock they came from. Yes, I agree, that was a pretty bad abuse of the bindings. > Any clock-names property description should define absolutely the set of > names. As this does not, NAK. > >> + >> +(* #clock-cells and clock-output-names are mandatory properties if external >> +image sensor devices reference 'camera' device node as a clock provider. > > s/(*/Note:/ Thanks, will fix that. >> 'fimc' device nodes >> ------------------- >> >> @@ -97,8 +114,8 @@ Image sensor nodes >> The sensor device nodes should be added to their control bus controller (e.g. >> I2C0) nodes and linked to a port node in the csis or the parallel-ports node, >> using the common video interfaces bindings, defined in video-interfaces.txt. >> -The implementation of this bindings requires clock-frequency property to be >> -present in the sensor device nodes. >> +An optional clock-frequency property needs to be present in the sensor device >> +nodes. Default value when this property is not present is 24 MHz. > > s/needs to/should/ ? Sounds better, I'll change it. > What is this the frequency of? It's frequency of an external sensor's master clock, which is provided by the SoC. Since the sensors have now possibility to control the clock themselves the host interface (binding) doesn't have to care about that frequency. This is supposed to be an assigned frequency, it has been discussed already on devicetree mailing list a few months ago. -- Regards, Sylwester
[Ccing Mike] On 22.02.2014 23:02, Sylwester Nawrocki wrote: > On 02/21/2014 04:50 PM, Mark Rutland wrote: >> On Thu, Feb 20, 2014 at 07:40:30PM +0000, Sylwester Nawrocki wrote: >>> +- #clock-cells: from the common clock bindings >>> (../clock/clock-bindings.txt), >>> + must be 1. A clock provider is associated with the 'camera' node >>> and it should >>> + be referenced by external sensors that use clocks provided by the >>> SoC on >>> + CAM_*_CLKOUT pins. The clock specifier cell stores an index of a >>> clock. >>> + The indices are 0, 1 for CAM_A_CLKOUT, CAM_B_CLKOUT clocks >>> respectively. >>> + >>> +- clock-output-names: from the common clock bindings, should contain >>> names of >>> + clocks registered by the camera subsystem corresponding to >>> CAM_A_CLKOUT, >>> + CAM_B_CLKOUT output clocks, in this order. Parent clock of these >>> clocks are >>> + specified be first two entries of the clock-names property. >> >> Do you need this? > > All right, that might have been a bad idea, it mixes names of clocks > registered > by the main clock controller with names of clock input lines at the device. > It's a mistake I have been usually sensitive to and now made it myself. :/ > > My intention was to maintain the clock tree, since the camera block doesn't > generate the clock itself, it merely passes through the clocks from the > SoC main > clock controller (CMU). So clk parents need to be properly set and since > there > is no clock-output-names property at the CMU DT node, > of_clk_get_parent_name() > cannot be used. > > So presumably the DT binding would be only specifying that the sclk_cam0, > sclk_cam1 clock input entries are associated with output clocks named as > in clock-output-names property. > > And the driver could either: > 1) hard code those (well defined) CMU clock (clk parent) names, I don't think this would be a good idea, as those CMU clock names may vary between SoCs. > 2) clk_get() its input clock, retrieve name with __clk_get_name() and > pass > it as parent name to clk_register() - it sounds a bit hacky though. This looks fine, at least until proper interface is added to CCF. Exynos audio subsystem clock driver does exactly the same. However, the right thing would be to make it possible to use pointers to struct clk instead of strings to list parent(s). This could be done by adding .parents field (struct clk **) to clk_init_data struct and make clk_register() use it if available. > > The output clock names could be also well defined by the binding per the > IP's > compatible. Nevertheless using clock-output-names seems cleaner to me than > defining character strings in the driver. > > What do you think ? <RANT> Personally, I don't like clock-output-names at all. The idea of having a global namespace for all clock providers looks flawed to me. This property only tries to work around the not-quite-right design by giving device tree the right to force CCF to use particular internal clock identifiers and avoid collisions if two providers happen to have the same internal clock names. I believe there should be completely no need for clock-output-names, (other than a textual label for debugging purposes, analogically to regulator-name). If one clock provider needs a clock from another, then you should list it using clock bindings in node of the former, not rely on some static name assignments. Then, after eliminating the need to use static names anymore, the namespace could be split into per-provider namespaces and we would have no collision issue anymore. Of course it's probably to late already for such changes, as there are already systems relying on clock-output-names (i.e. without inter-IP clock dependencies listed using clock bindings) and we would have to keep backwards compatibility anyway... </RANT> Best regards, Tomasz
On 02/22/2014 11:26 PM, Tomasz Figa wrote: > [Ccing Mike] > > On 22.02.2014 23:02, Sylwester Nawrocki wrote: >> On 02/21/2014 04:50 PM, Mark Rutland wrote: >>> On Thu, Feb 20, 2014 at 07:40:30PM +0000, Sylwester Nawrocki wrote: >>>> +- #clock-cells: from the common clock bindings >>>> (../clock/clock-bindings.txt), >>>> + must be 1. A clock provider is associated with the 'camera' node >>>> and it should >>>> + be referenced by external sensors that use clocks provided by the >>>> SoC on >>>> + CAM_*_CLKOUT pins. The clock specifier cell stores an index of a >>>> clock. >>>> + The indices are 0, 1 for CAM_A_CLKOUT, CAM_B_CLKOUT clocks >>>> respectively. >>>> + >>>> +- clock-output-names: from the common clock bindings, should contain >>>> names of >>>> + clocks registered by the camera subsystem corresponding to >>>> CAM_A_CLKOUT, >>>> + CAM_B_CLKOUT output clocks, in this order. Parent clock of these >>>> clocks are >>>> + specified be first two entries of the clock-names property. >>> >>> Do you need this? >> >> All right, that might have been a bad idea, it mixes names of clocks >> registered >> by the main clock controller with names of clock input lines at the >> device. >> It's a mistake I have been usually sensitive to and now made it >> myself. :/ >> >> My intention was to maintain the clock tree, since the camera block >> doesn't >> generate the clock itself, it merely passes through the clocks from the >> SoC main >> clock controller (CMU). So clk parents need to be properly set and since >> there is no clock-output-names property at the CMU DT node, >> of_clk_get_parent_name() cannot be used. >> >> So presumably the DT binding would be only specifying that the sclk_cam0, >> sclk_cam1 clock input entries are associated with output clocks named as >> in clock-output-names property. >> >> And the driver could either: >> 1) hard code those (well defined) CMU clock (clk parent) names, > > I don't think this would be a good idea, as those CMU clock names may > vary between SoCs. For the record, I'm not in favour of this approach, even though these clock names happen to be same for all relevant SoCs. >> 2) clk_get() its input clock, retrieve name with __clk_get_name() and >> pass >> it as parent name to clk_register() - it sounds a bit hacky though. > > This looks fine, at least until proper interface is added to CCF. Exynos > audio subsystem clock driver does exactly the same. Hmm, I looked at this driver and somehow missed that. > However, the right thing would be to make it possible to use pointers to > struct clk instead of strings to list parent(s). This could be done by > adding .parents field (struct clk **) to clk_init_data struct and make > clk_register() use it if available. We would just need to ensure the locking is done properly. -- Regards, Sylwester
diff --git a/Documentation/devicetree/bindings/media/samsung-fimc.txt b/Documentation/devicetree/bindings/media/samsung-fimc.txt index 96312f6..1a5820d 100644 --- a/Documentation/devicetree/bindings/media/samsung-fimc.txt +++ b/Documentation/devicetree/bindings/media/samsung-fimc.txt @@ -20,6 +20,7 @@ Required properties: the clock-names property; - clock-names : must contain "sclk_cam0", "sclk_cam1", "pxl_async0", "pxl_async1" entries, matching entries in the clocks property. + First two entries must be "sclk_cam0", "sclk_cam1". The pinctrl bindings defined in ../pinctrl/pinctrl-bindings.txt must be used to define a required pinctrl state named "default" and optional pinctrl states: @@ -32,6 +33,22 @@ way around. The 'camera' node must include at least one 'fimc' child node. +Optional properties (*: + +- #clock-cells: from the common clock bindings (../clock/clock-bindings.txt), + must be 1. A clock provider is associated with the 'camera' node and it should + be referenced by external sensors that use clocks provided by the SoC on + CAM_*_CLKOUT pins. The clock specifier cell stores an index of a clock. + The indices are 0, 1 for CAM_A_CLKOUT, CAM_B_CLKOUT clocks respectively. + +- clock-output-names: from the common clock bindings, should contain names of + clocks registered by the camera subsystem corresponding to CAM_A_CLKOUT, + CAM_B_CLKOUT output clocks, in this order. Parent clock of these clocks are + specified be first two entries of the clock-names property. + +(* #clock-cells and clock-output-names are mandatory properties if external +image sensor devices reference 'camera' device node as a clock provider. + 'fimc' device nodes ------------------- @@ -97,8 +114,8 @@ Image sensor nodes The sensor device nodes should be added to their control bus controller (e.g. I2C0) nodes and linked to a port node in the csis or the parallel-ports node, using the common video interfaces bindings, defined in video-interfaces.txt. -The implementation of this bindings requires clock-frequency property to be -present in the sensor device nodes. +An optional clock-frequency property needs to be present in the sensor device +nodes. Default value when this property is not present is 24 MHz. Example: @@ -114,7 +131,7 @@ Example: vddio-supply = <...>; clock-frequency = <24000000>; - clocks = <...>; + clocks = <&camera 1>; clock-names = "mclk"; port { @@ -135,7 +152,7 @@ Example: vddio-supply = <...>; clock-frequency = <24000000>; - clocks = <...>; + clocks = <&camera 0>; clock-names = "mclk"; port { @@ -149,12 +166,15 @@ Example: camera { compatible = "samsung,fimc", "simple-bus"; - #address-cells = <1>; - #size-cells = <1>; - status = "okay"; - + clocks = <&clock 132>, <&clock 133>; + clock-names = "sclk_cam0", "sclk_cam1"; + #clock-cells = <1>; + clock-output-names = "cam_mclk_a", "cam_mclk_b"; pinctrl-names = "default"; pinctrl-0 = <&cam_port_a_clk_active>; + status = "okay"; + #address-cells = <1>; + #size-cells = <1>; /* parallel camera ports */ parallel-ports {