a generic clock framework in the kernel: why we need it & why … · 2016-07-06 · slide 1 -...
TRANSCRIPT
![Page 1: A Generic Clock Framework in the Kernel: Why We Need It & Why … · 2016-07-06 · Slide 1 - © Pengutronix - - 08/11/2011 A Generic Clock Framework in the Kernel: Why We Need It](https://reader036.vdocument.in/reader036/viewer/2022081607/5ecb22dbc4bb4006b457bc12/html5/thumbnails/1.jpg)
Slide 1 - © Pengutronix - http://www.pengutronix.de - 08/11/2011
A Generic Clock Framework in the Kernel: Why We Need It & Why We Still Don't Have It
ELC Europe 2011
Sascha Hauer <[email protected]>
![Page 2: A Generic Clock Framework in the Kernel: Why We Need It & Why … · 2016-07-06 · Slide 1 - © Pengutronix - - 08/11/2011 A Generic Clock Framework in the Kernel: Why We Need It](https://reader036.vdocument.in/reader036/viewer/2022081607/5ecb22dbc4bb4006b457bc12/html5/thumbnails/2.jpg)
Slide 2 - © Pengutronix - http://www.pengutronix.de - 08/11/2011
Overview
● What are clocks?● What do we have now● Problems● What are we working on
![Page 3: A Generic Clock Framework in the Kernel: Why We Need It & Why … · 2016-07-06 · Slide 1 - © Pengutronix - - 08/11/2011 A Generic Clock Framework in the Kernel: Why We Need It](https://reader036.vdocument.in/reader036/viewer/2022081607/5ecb22dbc4bb4006b457bc12/html5/thumbnails/3.jpg)
Slide 3 - © Pengutronix - http://www.pengutronix.de - 08/11/2011
What are clocks?
● Powermanagement● Exact Baud/Pixel clocks
![Page 4: A Generic Clock Framework in the Kernel: Why We Need It & Why … · 2016-07-06 · Slide 1 - © Pengutronix - - 08/11/2011 A Generic Clock Framework in the Kernel: Why We Need It](https://reader036.vdocument.in/reader036/viewer/2022081607/5ecb22dbc4bb4006b457bc12/html5/thumbnails/4.jpg)
Slide 4 - © Pengutronix - http://www.pengutronix.de - 08/11/2011
Good old days
Source: Freescale I.MX1 reference manual
![Page 5: A Generic Clock Framework in the Kernel: Why We Need It & Why … · 2016-07-06 · Slide 1 - © Pengutronix - - 08/11/2011 A Generic Clock Framework in the Kernel: Why We Need It](https://reader036.vdocument.in/reader036/viewer/2022081607/5ecb22dbc4bb4006b457bc12/html5/thumbnails/5.jpg)
Slide 5 - © Pengutronix - http://www.pengutronix.de - 08/11/2011
Today
Source: Freescale I.MX53 reference manual
![Page 6: A Generic Clock Framework in the Kernel: Why We Need It & Why … · 2016-07-06 · Slide 1 - © Pengutronix - - 08/11/2011 A Generic Clock Framework in the Kernel: Why We Need It](https://reader036.vdocument.in/reader036/viewer/2022081607/5ecb22dbc4bb4006b457bc12/html5/thumbnails/6.jpg)
Slide 6 - © Pengutronix - http://www.pengutronix.de - 08/11/2011
What do we have now? The API
Getting clocks:● struct clk *clk_get(struct device *dev, const char *id);● void clk_put(struct clk *clk);
Enabling/disabling:● int clk_enable(struct clk *clk);● void clk_disable(struct clk *clk);
Rate functions:● unsigned long clk_get_rate(struct clk *clk);● int clk_set_rate(struct clk *clk, unsigned long rate);● long clk_round_rate(struct clk *clk, unsigned long rate);
Parent functions:● int clk_set_parent(struct clk *clk, struct clk *parent);● struct clk *clk_get_parent(struct clk *clk);
![Page 7: A Generic Clock Framework in the Kernel: Why We Need It & Why … · 2016-07-06 · Slide 1 - © Pengutronix - - 08/11/2011 A Generic Clock Framework in the Kernel: Why We Need It](https://reader036.vdocument.in/reader036/viewer/2022081607/5ecb22dbc4bb4006b457bc12/html5/thumbnails/7.jpg)
Slide 7 - © Pengutronix - http://www.pengutronix.de - 08/11/2011
Problems
There are currently 37 implementations of the clock API in the tree!
This means:
● 37 times reinventing the wheel● 37 ways to have buggy implementations● 37 different struct clk● ~60000 lines of code● code and data mixed● No way to build Kernels for multiple SoCs● No way to implement off-SoC clocks
![Page 8: A Generic Clock Framework in the Kernel: Why We Need It & Why … · 2016-07-06 · Slide 1 - © Pengutronix - - 08/11/2011 A Generic Clock Framework in the Kernel: Why We Need It](https://reader036.vdocument.in/reader036/viewer/2022081607/5ecb22dbc4bb4006b457bc12/html5/thumbnails/8.jpg)
Slide 8 - © Pengutronix - http://www.pengutronix.de - 08/11/2011
Our way out. History
Jeremy Kerr: A common struct clk
● Unify the different implementations of struct clk● A single implementation for clock functions● Create a common debugfs entry for clocks
![Page 9: A Generic Clock Framework in the Kernel: Why We Need It & Why … · 2016-07-06 · Slide 1 - © Pengutronix - - 08/11/2011 A Generic Clock Framework in the Kernel: Why We Need It](https://reader036.vdocument.in/reader036/viewer/2022081607/5ecb22dbc4bb4006b457bc12/html5/thumbnails/9.jpg)
Slide 9 - © Pengutronix - http://www.pengutronix.de - 08/11/2011
Locking
● For maximum power saving clk_enable/clk_disable shall be usable in Interrupt context
● Most implementations use spinlocks● Slow PLLs and clocks behind I2C busses cannot be
controlled with spinlocks held● The solution: clk_prepare/clk_unprepare
![Page 10: A Generic Clock Framework in the Kernel: Why We Need It & Why … · 2016-07-06 · Slide 1 - © Pengutronix - - 08/11/2011 A Generic Clock Framework in the Kernel: Why We Need It](https://reader036.vdocument.in/reader036/viewer/2022081607/5ecb22dbc4bb4006b457bc12/html5/thumbnails/10.jpg)
Slide 10 - © Pengutronix - http://www.pengutronix.de - 08/11/2011
clk_prepare() / clk_unprepare()
Fast Clock Slow Clock
clk_prepare() enable()
clk_enable() enable()
clk_disable() disable()
clk_unprepare disable()
![Page 11: A Generic Clock Framework in the Kernel: Why We Need It & Why … · 2016-07-06 · Slide 1 - © Pengutronix - - 08/11/2011 A Generic Clock Framework in the Kernel: Why We Need It](https://reader036.vdocument.in/reader036/viewer/2022081607/5ecb22dbc4bb4006b457bc12/html5/thumbnails/11.jpg)
Slide 11 - © Pengutronix - http://www.pengutronix.de - 08/11/2011
Locking
● Jeremys patches used a lock per clock● Too complex
![Page 12: A Generic Clock Framework in the Kernel: Why We Need It & Why … · 2016-07-06 · Slide 1 - © Pengutronix - - 08/11/2011 A Generic Clock Framework in the Kernel: Why We Need It](https://reader036.vdocument.in/reader036/viewer/2022081607/5ecb22dbc4bb4006b457bc12/html5/thumbnails/12.jpg)
Slide 12 - © Pengutronix - http://www.pengutronix.de - 08/11/2011
Building blocks
divider
Mux
gatePLL
![Page 13: A Generic Clock Framework in the Kernel: Why We Need It & Why … · 2016-07-06 · Slide 1 - © Pengutronix - - 08/11/2011 A Generic Clock Framework in the Kernel: Why We Need It](https://reader036.vdocument.in/reader036/viewer/2022081607/5ecb22dbc4bb4006b457bc12/html5/thumbnails/13.jpg)
Slide 13 - © Pengutronix - http://www.pengutronix.de - 08/11/2011
How we implement this today
Mux divider
gate
divider
struct clk
![Page 14: A Generic Clock Framework in the Kernel: Why We Need It & Why … · 2016-07-06 · Slide 1 - © Pengutronix - - 08/11/2011 A Generic Clock Framework in the Kernel: Why We Need It](https://reader036.vdocument.in/reader036/viewer/2022081607/5ecb22dbc4bb4006b457bc12/html5/thumbnails/14.jpg)
Slide 14 - © Pengutronix - http://www.pengutronix.de - 08/11/2011
How we implement this today
● Complex structure● Layout is unknown to the kernel● Hard to represent as data● Makes for huge and hard to change SoC specific files
![Page 15: A Generic Clock Framework in the Kernel: Why We Need It & Why … · 2016-07-06 · Slide 1 - © Pengutronix - - 08/11/2011 A Generic Clock Framework in the Kernel: Why We Need It](https://reader036.vdocument.in/reader036/viewer/2022081607/5ecb22dbc4bb4006b457bc12/html5/thumbnails/15.jpg)
Slide 15 - © Pengutronix - http://www.pengutronix.de - 08/11/2011
Building blocks
● Each block is simple with one or few implementation● Each block can be represented as few bytes of data● code for building blocks can be shared across
architectures● Code and data can be seperated
![Page 16: A Generic Clock Framework in the Kernel: Why We Need It & Why … · 2016-07-06 · Slide 1 - © Pengutronix - - 08/11/2011 A Generic Clock Framework in the Kernel: Why We Need It](https://reader036.vdocument.in/reader036/viewer/2022081607/5ecb22dbc4bb4006b457bc12/html5/thumbnails/16.jpg)
Slide 16 - © Pengutronix - http://www.pengutronix.de - 08/11/2011
Towards a generic clock framework
● The tree layout belongs to the core and nowhere else● Struct clk shall be opaque to both users and
implementers of a clock● Clocks need to be registered
![Page 17: A Generic Clock Framework in the Kernel: Why We Need It & Why … · 2016-07-06 · Slide 1 - © Pengutronix - - 08/11/2011 A Generic Clock Framework in the Kernel: Why We Need It](https://reader036.vdocument.in/reader036/viewer/2022081607/5ecb22dbc4bb4006b457bc12/html5/thumbnails/17.jpg)
Slide 17 - © Pengutronix - http://www.pengutronix.de - 08/11/2011
Initialization
● The clock tree layout has to be initialized and synchronized with the hardware
and
● Boards want to configure dividers and muxes for their needs
![Page 18: A Generic Clock Framework in the Kernel: Why We Need It & Why … · 2016-07-06 · Slide 1 - © Pengutronix - - 08/11/2011 A Generic Clock Framework in the Kernel: Why We Need It](https://reader036.vdocument.in/reader036/viewer/2022081607/5ecb22dbc4bb4006b457bc12/html5/thumbnails/18.jpg)
Slide 18 - © Pengutronix - http://www.pengutronix.de - 08/11/2011
The devicetree
● The devicetree is ideal to describe the exact layout (including registers) of the clocktree
● The devicetree makes it easy to associate clocks with their users
● The devicetree can be used to both describe the clock tree and the static configuration
![Page 19: A Generic Clock Framework in the Kernel: Why We Need It & Why … · 2016-07-06 · Slide 1 - © Pengutronix - - 08/11/2011 A Generic Clock Framework in the Kernel: Why We Need It](https://reader036.vdocument.in/reader036/viewer/2022081607/5ecb22dbc4bb4006b457bc12/html5/thumbnails/19.jpg)
Slide 19 - © Pengutronix - http://www.pengutronix.de - 08/11/2011
The devicetree
Board.dts
/include/ “SoC.dtsi”
…
clocks { uart_divider:uart_divider { divider-value = <3>; };};
…
SoC.dtsi
…
clocks { uart_divider:uart_divider { reg = <0x30 0x0>; clk-parent = <&other_clk>; shift = <13> width = <4> };};
...
![Page 20: A Generic Clock Framework in the Kernel: Why We Need It & Why … · 2016-07-06 · Slide 1 - © Pengutronix - - 08/11/2011 A Generic Clock Framework in the Kernel: Why We Need It](https://reader036.vdocument.in/reader036/viewer/2022081607/5ecb22dbc4bb4006b457bc12/html5/thumbnails/20.jpg)
Slide 20 - © Pengutronix - http://www.pengutronix.de - 08/11/2011
The rate propagation problem
● How do we make sure unrelated clocks are not affected during clk_set_rate()
divider divider
divider
Device A
Device B
![Page 21: A Generic Clock Framework in the Kernel: Why We Need It & Why … · 2016-07-06 · Slide 1 - © Pengutronix - - 08/11/2011 A Generic Clock Framework in the Kernel: Why We Need It](https://reader036.vdocument.in/reader036/viewer/2022081607/5ecb22dbc4bb4006b457bc12/html5/thumbnails/21.jpg)
Slide 21 - © Pengutronix - http://www.pengutronix.de - 08/11/2011
Clocks and DVFS, ...
● Yes, we can do....
But
● Let's not mix this with clock stuff
![Page 22: A Generic Clock Framework in the Kernel: Why We Need It & Why … · 2016-07-06 · Slide 1 - © Pengutronix - - 08/11/2011 A Generic Clock Framework in the Kernel: Why We Need It](https://reader036.vdocument.in/reader036/viewer/2022081607/5ecb22dbc4bb4006b457bc12/html5/thumbnails/22.jpg)
Slide 22 - © Pengutronix - http://www.pengutronix.de - 08/11/2011
Conclusion
● Locking problems solved● Patches on Mailing list are in good shape and mostly
agreed upon● Still need to implement drivers for dividers, muxes and
PLLs● Devicetree bindings have to be fixed● Rate propagation has to be worked upon● Still need to mass convert the SoC Clock trees
![Page 23: A Generic Clock Framework in the Kernel: Why We Need It & Why … · 2016-07-06 · Slide 1 - © Pengutronix - - 08/11/2011 A Generic Clock Framework in the Kernel: Why We Need It](https://reader036.vdocument.in/reader036/viewer/2022081607/5ecb22dbc4bb4006b457bc12/html5/thumbnails/23.jpg)
Slide 23 - © Pengutronix - http://www.pengutronix.de - 08/11/2011
Questions?