On 07/13/2013 10:35 AM, Jean-Francois Moine wrote: > On Fri, 12 Jul 2013 13:00:23 -0600 Daniel Drake<dsd at laptop.org> wrote: >> On Fri, Jul 12, 2013 at 12:39 PM, Jean-Francois Moine<moinejf at free.fr> >> wrote:
>>> - the phandles to the clocks does not tell how the clock may be set by >>> the driver (it is an array index in the 510). >> >> In the other threads on clock selection, we decided that that exact >> information on how to select a clock (i.e. register bits/values) must >> be in the driver, not in the DT. What was suggested there is a >> well-documented scheme for clock naming, so the driver knows which >> clock is which. That is defined in the proposed DT binding though the >> "valid clock names" part. For an example driver implementation of this >> you can see my patch "armada_drm clock selection - try 2". > > OK. > > Sorry to go back to this thread. > > I use my Cubox for daily jobs as a desktop computer. My kernel is a DT > driven 3.10.0. The dove-drm, tda998x and si5351 (clock) are kernel > modules. I set 3 clocks in the DT for the LCD0: lcdclk, axi and extclk0 Hmm, a bit off topic question, does it work when the si5351 module gets removed ? I can't see anything preventing clock provider module from being removed why any of its clocks is used and clk_unregister() function is currently unimplemented. > (si5351). Normally, the external clock is used, but, sometimes, the > si5351 module is not yet initialized when the drm driver starts. So, > for 1920x1080p, it uses the lcdclk which sets the LCD clock to 133333 > (400000/3) instead of 148500. As a result, display and sound still work > correctly on my TV set thru HDMI. > > So, it would be nice to have 2 usable clocks per LCD, until we find a > good way to initialize the modules in the right order at startup time. Doesn't deferred probing help here ? >>> - I don't see the use of the phandles in the leaves (dcon and tda998x). >> >> That is defined by the video interfaces common binding. I'm not >> immediately aware of the use, but the ability to easily traverse the >> graph in both directions seems like a requirement that could easily >> emerge from somewhere. > > OK, but I am not convinced... > >>> Well, here is how I feel the DTs: >>> >>> - for the Cubox (one LCD, the DCON is not used, TDA998x for HDMI/DVI >>> output): >> >> That is the same as my proposal except you have decided to use direct >> phandle properties instead of using the common video interfaces >> binding (which is just a slightly more detailed way of describing such >> links). In the "best practices" thread, the suggestion was raised >> multiple times of doing what v4l2 does, so thats why I decided to >> explore this here. >> >>> - for some tablet based on the Armada 510 with a LCD and a VGA connector: >>> >>> video { >>> compatible = "marvell,armada-video"; >>> marvell,video-devices =<&lcd0>,<&lcd1>,<&dcon> >>> }; >> >> This proposal is slightly different because it does not describe the >> relationship between the LCD controllers and the DCON. Focusing >> specifically on LCD1, which would be connected to a DAC via a phandle >> property in your proposal. The interconnectivity between the >> components represented as a graph (and in the v4l2 way, which includes >> my proposal) would be: >> >> LCD1 --- DCON --- DAC >> >> However your phandle properties would "suggest" that LCD1 is directly >> connected to the DAC. The driver would have to have special knowledge >> that the DCON sits right in the middle. Maybe that is not an issue, as >> it is obviously OK for the driver to have *some* knowledge about how >> the hardware works :) >> >> I don't think we have a full consensus on whether we want to go the >> "v4l2 way" here. But I figured that would be a good thing to propose >> in a first iteration to have a clearer idea of what the result would >> look like. It sounds like you are not overly keen on it, I would be >> interested to hear exactly why. > > I think this is because I was focused on the software and not on the > hardware. > > Back to the specific case of the Cubox with new ideas. > > The Cubox is based on the Armada 510 (Dove), so, all the hardware must > be described in dove.dtsi. This includes the LCDs and DCON/IRE, the > possible clocks and the (static) v4l2 links: > > lcd0: lcd-controller at 820000 { > compatible = "marvell,dove-lcd0"; [...] > }; > > lcd1: lcd-controller at 810000 { > compatible = "marvell,dove-lcd1"; [...] > }; Using different compatible strings to indicate multiple instances of same hardware doesn't seem right. Unless LCD0, LCD1 are really different pieces of hardware incompatible with each other I think it would be more correct to use same compatible property and DT node aliases, similarly as is now done with e.g. I2C busses: aliases { lcd0 = &lcd_0; lcd1 = &lcd_1; }; lcd_0: lcd-controller at 820000 { compatible = "marvell,dove-lcd"; ... }; lcd_1: lcd-controller at 820000 { compatible = "marvell,dove-lcd"; ... }; > /* display controller and image rotation engine */ > dcon: display-controller at 830000 { > compatible = "marvell,dove-dcon"; > reg =<0x830000 0xc4>, /* DCON */ > <0x831000 0x8c>; /* IRE */ > interrupts =<45>; > marvell-input =<&lcd0>,<&lcd1>; > status = "disabled"; > }; > > The specific Cubox hardware (tda998x and si5351) is described in > dove-cubox.dts, with the new clocks and the v4l2 link dcon0<--> tda998x. > > &i2c0 { > si5351: clock-generator { > ... > }; > tda998x: hdmi-encoder { > compatible = "nxp,tda998x"; > reg =<0x70>; > interrupt-parent =<&gpio0>; > interrupts =<27 2>; /* falling edge */ > marvell-input =<&dcon 0>; > }; > }; > &lcd0 { > status = "okay"; > clocks =<&si5351 0>; > clock-names = "extclk0"; > }; > &dcon { > status = "okay"; > marvell-output =<&tda998x>, 0; /* no connector on port > B */ Hmm, was this custom binding intended or did you mean rather something like: &i2c0 { si5351: clock-generator { ... }; tda998x: hdmi-encoder { compatible = "nxp,tda998x"; reg =<0x70>; interrupt-parent =<&gpio0>; interrupts =<27 2>; /* falling edge */ marvell-input =<&dcon 0>; port at I { reg = <I>; /* input (or reg omitted completely) */ endpoint { remote-endpoint = <&dcon>; }; } }; }; &lcd0 { status = "okay"; clocks =<&si5351 0>; clock-names = "extclk0"; }; &dcon { status = "okay"; port at A { reg = <A>; /* port A */ endpoint { remote-endpoint = <&tda998x>; }; } /* no connector on port B */ }; I think it should be tried to use common binding for common problems, then a common parser library could be used, instead of repeating similar code in each driver. > }; > > Then, about the software, the drm driver may not need to know anything > more (it scans the DT for the LCDs and gets all the subdevices thanks > to the v4l2 links): > > video { > compatible = "marvell,armada-video"; > }; > > For some boards / other SoCs, there may be independant drm devices. In > this case, there would be descriptions as: > > video0 { > compatible = "marvell,armada-video0"; > marvell,video-devices =<&lcd0>; > }; > video1 { > compatible = "marvell,armada-video1"; > marvell,video-devices =<&lcd1>; > }; > > About the LCD clocks, the drm driver may choose itself one of the > clocks declared in the DT. If a clock should not be used, if should be > zeroed in the board specific DT: > > &lcd0 { > status = "okay"; > clocks = 0, 0,<&si5351 0>; > clock-names = "axi", "lcdclk", "extclk0"; > }; Hmm, not sure how that could work. IIUC there should be same number of cells used in the clocks property for each clock specifier (clocks provider's node #clock-cells), so &si5351 cell would need to be at offset 4. Maybe there is some convention to specify null phandles but I'm not aware of it. -- Regards, Sylwester