Hi:
In the development work, we found that some of the previous
incorrect clock configuration on the RK3399 platform, we should
fix and optimize them.
Changes in v3:
- list more details of the testing steps
- add the regresson message "Fixes: 3bd14ae9da91 ..." to track the previous commit
- remove the patch "clk: rockchip: rk3399: fix incorrect parent for rk3399's {c, g}pll_aclk_perihp_src"
- add "Reviewed-by: Shawn Lin [off-list ref]"
Changes in v2:
- add this patch " clk: rockchip: rk3399: fix incorrect GATE bits for {c, g}pll_aclk_perihp_src" into the patchset
Elaine Zhang (1):
clk: rockchip: rk3399: delete the CLK_IGNORE_UNUSED for aclk_pcie
Xing Zheng (6):
clk: rockchip: rk3399: export USBPHYx_480M_SRC clock IDs
clk: rockchip: rk3399: export 480M_SRC clock id for usbphy0/usbphy1
clk: rockchip: rk3399: fix incorrect GATE bits for {c,
g}pll_aclk_perihp_src
clk: rockchip: rk3399: fix incorrect aclk_emmc source gate bits
clk: rockchip: rk3399: add 65MHz and 106.5MHz clocks for HDMI
clk: rockchip: rk3399: Add support frac mode frequencies
drivers/clk/rockchip/clk-rk3399.c | 39 ++++++++++++++++++++++++--------
include/dt-bindings/clock/rk3399-cru.h | 2 ++
2 files changed, 32 insertions(+), 9 deletions(-)
--
1.7.9.5
Sorry to refer incorrect clock diagram, we double check it that the bits
configuration of the Xpll_aclk_perihp_src need to be fixed:
bit 1 - shows aclk_perihp_cpll_src_en
bit 0 - shows aclk_perihp_gpll_src_en
Through the testing that plug/unplug the USB ethernet cable on the RK3399 kevin board.
1. the hclk_host0 and hclk_host1 are endpoint clocks:
cpll --> G5[1] --> aclk_perihp_cpll_src --\ |--> hclk_host0
| --> ... ---> |
gpll --> G5[0] --> aclk_perihp_gpll_src --/ |--> hclk_host1
2. there is no clock below the cpll_aclk_perihp_src,
and the hclk_hostX are below the gpll_aclk_perihp_src:
pll_cpll 1 1 800000000 0 0
cpll 7 19 800000000 0 0
cpll_aclk_perihp_src 0 0 800000000 0 0
...
pll_gpll 1 1 594000000 0 0
gpll 10 10 594000000 0 0
gpll_aclk_perihp_src 2 2 594000000 0 0
hclk_perihp 5 5 74250000 0 0
hclk_host1_arb 2 2 74250000 0 0
hclk_host1 2 2 74250000 0 0
hclk_host0_arb 2 2 74250000 0 0
hclk_host0 2 2 74250000 0 0
3. by default, G5[0] and G5[1] are enabled:
localhost ~ # mem r 0xff760314
0x000003e0
4. close the G5[1] (aclk_perihp_cpll_src), and plug/unplug USB ethernet cable,
the DUT still works well:
localhost ~ # mem w 0xff760314 0xffff03e2
localhost ~ # mem r 0xff760314
0x000003e2
plug/unplug, the work statue is ok
5. close the G5[0] (aclk_perihp_gpll_src), , and plug/unplug USB ethernet cable,
the DUT will be crashed:
localhost ~ # mem w 0xff760314 0xffff03e1
localhost ~ # mem r 0xff760314
0x000003e1
plug/unplug, the DUT is crashed
Summary:
bit 1 - shows aclk_perihp_cpll_src_en
bit 0 - shows aclk_perihp_gpll_src_en
Fixes: 3bd14ae9da91 ("clk: rockchip: fix incorrect parent for rk3399's {c,g}pll_aclk_perihp_src")
Signed-off-by: Xing Zheng <redacted>
---
Changes in v3:
- list more details of the testing steps
- add the regresson message "Fixes: 3bd14ae9da91 ..." to track the previous commit
- remove the patch "clk: rockchip: rk3399: fix incorrect parent for rk3399's {c, g}pll_aclk_perihp_src"
Changes in v2:
- add this patch " clk: rockchip: rk3399: fix incorrect GATE bits for {c, g}pll_aclk_perihp_src" into the patchset
drivers/clk/rockchip/clk-rk3399.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
We need to add more clocks for supporting more display resolution
for HDMI.
Signed-off-by: Xing Zheng <redacted>
---
Changes in v3: None
Changes in v2: None
drivers/clk/rockchip/clk-rk3399.c | 2 ++
1 file changed, 2 insertions(+)
We need to support various display resolutions for external
display devices like HDMI/DP, the frac mode can help us to
acquire almost any frequencies, and need higher VCOs to reduce
clock jitters.
Signed-off-by: Xing Zheng <redacted>
---
Changes in v3: None
Changes in v2: None
drivers/clk/rockchip/clk-rk3399.c | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
Hi Xing,
Am Dienstag, 2. August 2016, 15:19:56 schrieb Xing Zheng:
Export these source clocks for usbphy.
Signed-off-by: Xing Zheng <redacted>
can you please provide a rationale why you need manual control over that
intermediate clock?
The two usbphys seem to use the clk_usb2phyX_ref clocks, generate the 480m
clocks, but do not seem to need the clk_usbphyX_480m_src gates.
The clk_usbphyX_480m_src clocks on the other hand only lead to the
clk_usbphy_480m mux, so I'd like some explanation on what you want to achieve
here :-)
Thanks
Heiko
Hi Xing,
Am Dienstag, 2. August 2016, 15:22:59 schrieb Xing Zheng:
We need to support various display resolutions for external
display devices like HDMI/DP, the frac mode can help us to
acquire almost any frequencies, and need higher VCOs to reduce
clock jitters.
Signed-off-by: Xing Zheng <redacted>
why does this need to be a separate rate array and cannot live in the general
pll rate array?
The plls are general purpose, so we shouldn't limit them arbitarily.
I currently only see some frequencies (594MHz, 297MHz, 54MHz) that are present
in both arrays but have different settings. As your patch description says
that these settings reduce clock jitter, wouldn't the general frequencies also
profit from merging these new values into the general rate array?
Heiko
Hi Heiko,
On 2016?08?05? 03:19, Heiko St?bner wrote:
Hi Xing,
Am Dienstag, 2. August 2016, 15:22:59 schrieb Xing Zheng:
quoted
We need to support various display resolutions for external
display devices like HDMI/DP, the frac mode can help us to
acquire almost any frequencies, and need higher VCOs to reduce
clock jitters.
Signed-off-by: Xing Zheng<redacted>
why does this need to be a separate rate array and cannot live in the general
pll rate array?
The plls are general purpose, so we shouldn't limit them arbitarily.
Yes, I understand your mean. :-)
I currently only see some frequencies (594MHz, 297MHz, 54MHz) that are present
in both arrays but have different settings. As your patch description says
that these settings reduce clock jitter, wouldn't the general frequencies also
profit from merging these new values into the general rate array?
and here are some of our ideas:
"WIth the frac mode and higher VCO to reduce clock jitters" that
suggestion is from IC designer.
There are many and various kinds resolution and needed frequencies for
external disaplay devices. For example, the DP needs:
3840x2160 533250KHz
3840x2160 297000KHz
3840x2160 296703KHz
2560x1440 241500KHz
1920x1080 148500KHz
1920x1080 148352KHz
1680x1050 146250KHz
1600x900 108000KHz
1280x1024 135000KHz
1280x1024 108000KHz
... and so on
There some frequencies must be allocated with frac mode. We separate
these frequencies that are only used for display (VPLL) from the general
rate table, and put them to be classified into a frac mode table, we can
reduce the frequency of the query time, the two rate tables will not
interfere with each other. Because other PLLs don't need to assgin these
various frequencies with frac mode.
Thanks
--
- Xing Zheng
From: Frank Wang <hidden> Date: 2016-08-05 08:35:38
Hi Heiko,
On 2016/8/5 3:10, Heiko St?bner wrote:
Hi Xing,
Am Dienstag, 2. August 2016, 15:19:56 schrieb Xing Zheng:
quoted
Export these source clocks for usbphy.
Signed-off-by: Xing Zheng <redacted>
can you please provide a rationale why you need manual control over that
intermediate clock?
Well, From below graph, you can see that 'clk_usbphyX_480m' is generated
from usb2phy, and 'clk_usbphy_480m' which select from
clk_usbphyX_480m_src via a gate (G13[12]) provided 480M clock to other
modules.
xin24m
|__ clk_usb2phy0_ref
| |__ clk_usbphy0_480m
| |__clk_usbphy0_480m_src
| |__clk_usbphy_480m
| |__ ... ...
|__ clk_usb2phy1_ref
|__ clk_usbphy1_480m
|__clk_usbphy1_480m_src
The two usbphys seem to use the clk_usb2phyX_ref clocks, generate the 480m
clocks, but do not seem to need the clk_usbphyX_480m_src gates.
Yeah, they used to be. However, the story went something like this,
Some PM suspend process related ehci/ohci controller are base on 480m
clocks, unfortunately, usb2-phy suspended earlier than ehci/ohci
(usb2-phy will be auto suspended if no devices plug-in), and the
clk-480m provided by it was disabled if no module used. As a result, the
PM suspend process was blocked when it run into ehci/ohci module.
Hence, we are planing to refer clk_usbphyX_480m_src into each ehci/ohci
driver. Maybe you will challenge why not refer clk_usbphy_480m directly?
because there are two ehci/ohci connected in the different usb2phy, and
only one clk_usbphy_480m clock was selected in clock tree.
BR.
Frank
The clk_usbphyX_480m_src clocks on the other hand only lead to the
clk_usbphy_480m mux, so I'd like some explanation on what you want to achieve
here :-)
Thanks
Heiko
Hi Xing,
Am Freitag, 5. August 2016, 10:26:57 schrieb Xing Zheng:
On 2016?08?05? 03:19, Heiko St?bner wrote:
quoted
Am Dienstag, 2. August 2016, 15:22:59 schrieb Xing Zheng:
quoted
We need to support various display resolutions for external
display devices like HDMI/DP, the frac mode can help us to
acquire almost any frequencies, and need higher VCOs to reduce
clock jitters.
Signed-off-by: Xing Zheng<redacted>
why does this need to be a separate rate array and cannot live in the
general pll rate array?
The plls are general purpose, so we shouldn't limit them arbitarily.
Yes, I understand your mean. :-)
quoted
I currently only see some frequencies (594MHz, 297MHz, 54MHz) that are
present in both arrays but have different settings. As your patch
description says that these settings reduce clock jitter, wouldn't the
general frequencies also profit from merging these new values into the
general rate array?
and here are some of our ideas:
"WIth the frac mode and higher VCO to reduce clock jitters" that
suggestion is from IC designer.
There are many and various kinds resolution and needed frequencies for
external disaplay devices. For example, the DP needs:
3840x2160 533250KHz
3840x2160 297000KHz
3840x2160 296703KHz
2560x1440 241500KHz
1920x1080 148500KHz
1920x1080 148352KHz
1680x1050 146250KHz
1600x900 108000KHz
1280x1024 135000KHz
1280x1024 108000KHz
... and so on
There some frequencies must be allocated with frac mode. We separate
these frequencies that are only used for display (VPLL) from the general
rate table, and put them to be classified into a frac mode table, we can
reduce the frequency of the query time, the two rate tables will not
interfere with each other. Because other PLLs don't need to assgin these
various frequencies with frac mode.
Hmm, you're adding 14 frequencies to that new table (4 or so of them
duplicating existing frequencies). So even if the effective number of new
frequencies goes from now 10 to 20, I don't think walking that table will take
an excessive time longer than now.
After the patch introducing the automatic rate calculation, the rate table we
need to walk, will even get smaller.
Other components might also profit from the updated standard frequencies with
less jitter you're introducing here.
And of course there is also the possibility somebody might want to build some
rk3399 device without any graphics output at all [arm-server seem to be the
new hype :-) ], so may want to use the vpll for something else completely.
So I still don't see an argument why it needs to be a separate table, as I
currently don't see a case were it will really hurt the other PLLs.
Heiko
Hi Heiko,
On 2016?08?05? 16:48, Heiko St?bner wrote:
Hi Xing,
Am Freitag, 5. August 2016, 10:26:57 schrieb Xing Zheng:
quoted
On 2016?08?05? 03:19, Heiko St?bner wrote:
quoted
Am Dienstag, 2. August 2016, 15:22:59 schrieb Xing Zheng:
quoted
We need to support various display resolutions for external
display devices like HDMI/DP, the frac mode can help us to
acquire almost any frequencies, and need higher VCOs to reduce
clock jitters.
Signed-off-by: Xing Zheng<redacted>
why does this need to be a separate rate array and cannot live in the
general pll rate array?
The plls are general purpose, so we shouldn't limit them arbitarily.
Yes, I understand your mean. :-)
quoted
I currently only see some frequencies (594MHz, 297MHz, 54MHz) that are
present in both arrays but have different settings. As your patch
description says that these settings reduce clock jitter, wouldn't the
general frequencies also profit from merging these new values into the
general rate array?
and here are some of our ideas:
"WIth the frac mode and higher VCO to reduce clock jitters" that
suggestion is from IC designer.
There are many and various kinds resolution and needed frequencies for
external disaplay devices. For example, the DP needs:
3840x2160 533250KHz
3840x2160 297000KHz
3840x2160 296703KHz
2560x1440 241500KHz
1920x1080 148500KHz
1920x1080 148352KHz
1680x1050 146250KHz
1600x900 108000KHz
1280x1024 135000KHz
1280x1024 108000KHz
... and so on
There some frequencies must be allocated with frac mode. We separate
these frequencies that are only used for display (VPLL) from the general
rate table, and put them to be classified into a frac mode table, we can
reduce the frequency of the query time, the two rate tables will not
interfere with each other. Because other PLLs don't need to assgin these
various frequencies with frac mode.
Hmm, you're adding 14 frequencies to that new table (4 or so of them
duplicating existing frequencies). So even if the effective number of new
frequencies goes from now 10 to 20, I don't think walking that table will take
an excessive time longer than now.
After the patch introducing the automatic rate calculation, the rate table we
need to walk, will even get smaller.
Other components might also profit from the updated standard frequencies with
less jitter you're introducing here.
And of course there is also the possibility somebody might want to build some
rk3399 device without any graphics output at all [arm-server seem to be the
new hype :-) ], so may want to use the vpll for something else completely.
So I still don't see an argument why it needs to be a separate table, as I
currently don't see a case were it will really hurt the other PLLs.
Heiko
Yes, sorry to this idea is not comprehensive. I will try to find a
better way.
Thanks for your comments. :-)
--
- Xing Zheng
Am Freitag, 5. August 2016, 21:23:14 schrieb Xing Zheng:
Hi Heiko,
On 2016?08?05? 16:48, Heiko St?bner wrote:
quoted
Hi Xing,
Am Freitag, 5. August 2016, 10:26:57 schrieb Xing Zheng:
quoted
On 2016?08?05? 03:19, Heiko St?bner wrote:
quoted
Am Dienstag, 2. August 2016, 15:22:59 schrieb Xing Zheng:
quoted
We need to support various display resolutions for external
display devices like HDMI/DP, the frac mode can help us to
acquire almost any frequencies, and need higher VCOs to reduce
clock jitters.
Signed-off-by: Xing Zheng<redacted>
why does this need to be a separate rate array and cannot live in the
general pll rate array?
The plls are general purpose, so we shouldn't limit them arbitarily.
Yes, I understand your mean. :-)
quoted
I currently only see some frequencies (594MHz, 297MHz, 54MHz) that are
present in both arrays but have different settings. As your patch
description says that these settings reduce clock jitter, wouldn't the
general frequencies also profit from merging these new values into the
general rate array?
and here are some of our ideas:
"WIth the frac mode and higher VCO to reduce clock jitters" that
suggestion is from IC designer.
There are many and various kinds resolution and needed frequencies for
external disaplay devices. For example, the DP needs:
3840x2160 533250KHz
3840x2160 297000KHz
3840x2160 296703KHz
2560x1440 241500KHz
1920x1080 148500KHz
1920x1080 148352KHz
1680x1050 146250KHz
1600x900 108000KHz
1280x1024 135000KHz
1280x1024 108000KHz
... and so on
There some frequencies must be allocated with frac mode. We separate
these frequencies that are only used for display (VPLL) from the general
rate table, and put them to be classified into a frac mode table, we can
reduce the frequency of the query time, the two rate tables will not
interfere with each other. Because other PLLs don't need to assgin these
various frequencies with frac mode.
Hmm, you're adding 14 frequencies to that new table (4 or so of them
duplicating existing frequencies). So even if the effective number of new
frequencies goes from now 10 to 20, I don't think walking that table will
take an excessive time longer than now.
After the patch introducing the automatic rate calculation, the rate table
we need to walk, will even get smaller.
Other components might also profit from the updated standard frequencies
with less jitter you're introducing here.
And of course there is also the possibility somebody might want to build
some rk3399 device without any graphics output at all [arm-server seem to
be the new hype :-) ], so may want to use the vpll for something else
completely.
So I still don't see an argument why it needs to be a separate table, as I
currently don't see a case were it will really hurt the other PLLs.
Heiko
Yes, sorry to this idea is not comprehensive. I will try to find a
better way.
Thanks for your comments. :-)
as I said, to me just merging the new clock rates into the existing pll rate
array looks like it should work just fine :-)
Hi Frank,
Am Freitag, 5. August 2016, 16:34:42 schrieb Frank Wang:
On 2016/8/5 3:10, Heiko St?bner wrote:
quoted
Am Dienstag, 2. August 2016, 15:19:56 schrieb Xing Zheng:
quoted
Export these source clocks for usbphy.
Signed-off-by: Xing Zheng <redacted>
can you please provide a rationale why you need manual control over that
intermediate clock?
Well, From below graph, you can see that 'clk_usbphyX_480m' is generated
from usb2phy, and 'clk_usbphy_480m' which select from
clk_usbphyX_480m_src via a gate (G13[12]) provided 480M clock to other
modules.
xin24m
|__ clk_usb2phy0_ref
|
| |__ clk_usbphy0_480m
| |
| |__clk_usbphy0_480m_src
| |
| |__clk_usbphy_480m
| |
| |__ ... ...
|
|__ clk_usb2phy1_ref
|
|__ clk_usbphy1_480m
|
|__clk_usbphy1_480m_src
quoted
The two usbphys seem to use the clk_usb2phyX_ref clocks, generate the
480m
clocks, but do not seem to need the clk_usbphyX_480m_src gates.
Yeah, they used to be. However, the story went something like this,
Some PM suspend process related ehci/ohci controller are base on 480m
clocks, unfortunately, usb2-phy suspended earlier than ehci/ohci
(usb2-phy will be auto suspended if no devices plug-in), and the
clk-480m provided by it was disabled if no module used. As a result, the
PM suspend process was blocked when it run into ehci/ohci module.
ah, so the ehci controller needs that 480m clock as well? Do you happen to
have example patches for the ehci/ohci side already? I'd like to peak at what
you mean with "some PM suspend process related" things.
Depending on what is actually needed, you could also pull the usbphy out of
autosuspend in a pm-prepare callback of the phy driver itself ... see
http://lxr.free-electrons.com/source/include/linux/pm.h#L86
Like
- in the .prepare callback make sure to unsuspend the phy
and deactivate the autosuspend
- ehci/ohci will poweroff the phy in it s suspend callback (already does that)
- suspend -> resume
- ehci/ohci will poweron the phy
- in the phy's .complete callback you can reactivate the autosuspend timer
Because it looks more like you actually need the phy and not the clock alone.
So it would be nicer to use mechanisms already in place instead of creating
new dependencies.
Hence, we are planing to refer clk_usbphyX_480m_src into each ehci/ohci
driver. Maybe you will challenge why not refer clk_usbphy_480m directly?
because there are two ehci/ohci connected in the different usb2phy, and
only one clk_usbphy_480m clock was selected in clock tree.
Nope, no argument from me as I fully understand that each phy provides its own
480m clock :-) .
Heiko
From: Frank Wang <hidden> Date: 2016-08-08 09:55:49
Hi Heiko,
On 2016/8/6 0:05, Heiko St?bner wrote:
Hi Frank,
Am Freitag, 5. August 2016, 16:34:42 schrieb Frank Wang:
quoted
On 2016/8/5 3:10, Heiko St?bner wrote:
quoted
Am Dienstag, 2. August 2016, 15:19:56 schrieb Xing Zheng:
quoted
Export these source clocks for usbphy.
Signed-off-by: Xing Zheng <redacted>
can you please provide a rationale why you need manual control over that
intermediate clock?
Well, From below graph, you can see that 'clk_usbphyX_480m' is generated
from usb2phy, and 'clk_usbphy_480m' which select from
clk_usbphyX_480m_src via a gate (G13[12]) provided 480M clock to other
modules.
xin24m
|__ clk_usb2phy0_ref
| |
| |__ clk_usbphy0_480m
| |
| |__clk_usbphy0_480m_src
| |
| |__clk_usbphy_480m
| |__ ... ...
|
|__ clk_usb2phy1_ref
|
|__ clk_usbphy1_480m
|
|__clk_usbphy1_480m_src
quoted
The two usbphys seem to use the clk_usb2phyX_ref clocks, generate the
480m
clocks, but do not seem to need the clk_usbphyX_480m_src gates.
Yeah, they used to be. However, the story went something like this,
Some PM suspend process related ehci/ohci controller are base on 480m
clocks, unfortunately, usb2-phy suspended earlier than ehci/ohci
(usb2-phy will be auto suspended if no devices plug-in), and the
clk-480m provided by it was disabled if no module used. As a result, the
PM suspend process was blocked when it run into ehci/ohci module.
ah, so the ehci controller needs that 480m clock as well? Do you happen to
have example patches for the ehci/ohci side already? I'd like to peak at what
you mean with "some PM suspend process related" things.
Actually, no patches for it, I just make below steps manually :-).
1. set two usb2-phy into suspend mode.
2. disable 480m clock on each usb2-phy (assume only usb2-phy used it).
3. press power button let system into PM suspend.
Then, the kernel will be blocked and you can see the following log from
console.
... ....
[ 123.763848] calling usb6+ @ 166, parent: xhci-hcd.0.auto
[ 123.764503] call usb6+ returned 0 after 163 usecs
[ 123.765106] calling usb5+ @ 166, parent: xhci-hcd.0.auto
[ 123.765719] call usb5+ returned 0 after 121 usecs
[ 123.766294] calling usb4+ @ 166, parent: fe3e0000.usb
[ 123.766917] calling usb3+ @ 55, parent: fe3a0000.usb
Depending on what is actually needed, you could also pull the usbphy out of
autosuspend in a pm-prepare callback of the phy driver itself ... see
http://lxr.free-electrons.com/source/include/linux/pm.h#L86
Like
- in the .prepare callback make sure to unsuspend the phy
and deactivate the autosuspend
- ehci/ohci will poweroff the phy in it s suspend callback (already does that)
Hmm, do you remember that we have previously discussed there are some
oddities in ehci/ohci driver? phy_power_on() gets called twice at
ehci/ohci driver probe time, one is at pdata->power_on(); another is at
usb_add_hcd(), then the power_count of phy increases to 2, but
phy_power_off() is just invoked one time when ehci/ohci goes to PM
suspend, so phy->ops->power_off is never be invoked.
In this way, the usb-phy maybe never go to suspend.
- suspend -> resume
- ehci/ohci will poweron the phy
- in the phy's .complete callback you can reactivate the autosuspend timer
Because it looks more like you actually need the phy and not the clock alone.
So it would be nicer to use mechanisms already in place instead of creating
new dependencies.
Theoretically, phy_init() will be invoked when ehci/ohci power on, and
the sm_work will be reactivated (have already implemented) in
phy->ops->init, but unfortunately, the same issue as phy_power_on()
mentioned above, it never run there too .
quoted
Hence, we are planing to refer clk_usbphyX_480m_src into each ehci/ohci
driver. Maybe you will challenge why not refer clk_usbphy_480m directly?
because there are two ehci/ohci connected in the different usb2phy, and
only one clk_usbphy_480m clock was selected in clock tree.
Nope, no argument from me as I fully understand that each phy provides its own
480m clock :-) .
Heiko
Am Dienstag, 2. August 2016, 15:19:58 schrieb Xing Zheng:
Dues to incorrect diagram, we need to fix incorrect bits for
(c/g)pll_aclk_emmc_src:
cpll_aclk_emmc_src --> G6[13]
gpll_aclk_emmc_src --> G6[12]
Signed-off-by: Xing Zheng <redacted>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
applied to my clk-fixes branch for 4.8
Thanks
Heiko
Am Dienstag, 2. August 2016, 15:19:57 schrieb Xing Zheng:
Sorry to refer incorrect clock diagram, we double check it that the bits
configuration of the Xpll_aclk_perihp_src need to be fixed:
bit 1 - shows aclk_perihp_cpll_src_en
bit 0 - shows aclk_perihp_gpll_src_en
Through the testing that plug/unplug the USB ethernet cable on the RK3399
kevin board.
1. the hclk_host0 and hclk_host1 are endpoint clocks:
cpll --> G5[1] --> aclk_perihp_cpll_src --\ |--> hclk_host0
| --> ... ---> |
gpll --> G5[0] --> aclk_perihp_gpll_src --/ |--> hclk_host1
2. there is no clock below the cpll_aclk_perihp_src,
and the hclk_hostX are below the gpll_aclk_perihp_src:
pll_cpll 1 1 800000000
0 0 cpll 7 19 800000000
0 0 cpll_aclk_perihp_src 0 0 800000000 0 0
...
pll_gpll 1 1 594000000
0 0 gpll 10 10 594000000
0 0 gpll_aclk_perihp_src 2 2 594000000 0 0
hclk_perihp 5 5 74250000 0 0
hclk_host1_arb 2 2 74250000 0 0 hclk_host1
2 2 74250000 0 0 hclk_host0_arb 2
2 74250000 0 0 hclk_host0 2 2
74250000 0 0
3. by default, G5[0] and G5[1] are enabled:
localhost ~ # mem r 0xff760314
0x000003e0
4. close the G5[1] (aclk_perihp_cpll_src), and plug/unplug USB ethernet
cable, the DUT still works well:
localhost ~ # mem w 0xff760314 0xffff03e2
localhost ~ # mem r 0xff760314
0x000003e2
plug/unplug, the work statue is ok
5. close the G5[0] (aclk_perihp_gpll_src), , and plug/unplug USB ethernet
cable, the DUT will be crashed:
localhost ~ # mem w 0xff760314 0xffff03e1
localhost ~ # mem r 0xff760314
0x000003e1
plug/unplug, the DUT is crashed
Summary:
bit 1 - shows aclk_perihp_cpll_src_en
bit 0 - shows aclk_perihp_gpll_src_en
Fixes: 3bd14ae9da91 ("clk: rockchip: fix incorrect parent for rk3399's
{c,g}pll_aclk_perihp_src") Signed-off-by: Xing Zheng
[off-list ref]
applied to my clk-fixes branch for 4.8
Thanks
Heiko
From: Frank Wang <hidden> Date: 2016-08-16 06:35:39
Hi Heiko,
On 2016/8/8 17:55, Frank Wang wrote:
Hi Heiko,
On 2016/8/6 0:05, Heiko St?bner wrote:
quoted
Hi Frank,
Am Freitag, 5. August 2016, 16:34:42 schrieb Frank Wang:
quoted
On 2016/8/5 3:10, Heiko St?bner wrote:
quoted
Am Dienstag, 2. August 2016, 15:19:56 schrieb Xing Zheng:
quoted
Export these source clocks for usbphy.
Signed-off-by: Xing Zheng <redacted>
can you please provide a rationale why you need manual control over
that
intermediate clock?
Well, From below graph, you can see that 'clk_usbphyX_480m' is
generated
from usb2phy, and 'clk_usbphy_480m' which select from
clk_usbphyX_480m_src via a gate (G13[12]) provided 480M clock to other
modules.
xin24m
|__ clk_usb2phy0_ref
| |
| |__ clk_usbphy0_480m
| |
| |__clk_usbphy0_480m_src
| |
| |__clk_usbphy_480m
| |__ ... ...
|
|__ clk_usb2phy1_ref
|
|__ clk_usbphy1_480m
|
|__clk_usbphy1_480m_src
quoted
The two usbphys seem to use the clk_usb2phyX_ref clocks, generate the
480m
clocks, but do not seem to need the clk_usbphyX_480m_src gates.
Yeah, they used to be. However, the story went something like this,
Some PM suspend process related ehci/ohci controller are base on 480m
clocks, unfortunately, usb2-phy suspended earlier than ehci/ohci
(usb2-phy will be auto suspended if no devices plug-in), and the
clk-480m provided by it was disabled if no module used. As a result,
the
PM suspend process was blocked when it run into ehci/ohci module.
ah, so the ehci controller needs that 480m clock as well? Do you
happen to
have example patches for the ehci/ohci side already? I'd like to peak
at what
you mean with "some PM suspend process related" things.
Actually, no patches for it, I just make below steps manually :-).
1. set two usb2-phy into suspend mode.
2. disable 480m clock on each usb2-phy (assume only usb2-phy used it).
3. press power button let system into PM suspend.
Then, the kernel will be blocked and you can see the following log
from console.
... ....
[ 123.763848] calling usb6+ @ 166, parent: xhci-hcd.0.auto
[ 123.764503] call usb6+ returned 0 after 163 usecs
[ 123.765106] calling usb5+ @ 166, parent: xhci-hcd.0.auto
[ 123.765719] call usb5+ returned 0 after 121 usecs
[ 123.766294] calling usb4+ @ 166, parent: fe3e0000.usb
[ 123.766917] calling usb3+ @ 55, parent: fe3a0000.usb
May I know have you tried reproducing on your board or not?
quoted
Depending on what is actually needed, you could also pull the usbphy
out of
autosuspend in a pm-prepare callback of the phy driver itself ... see
http://lxr.free-electrons.com/source/include/linux/pm.h#L86
Like
- in the .prepare callback make sure to unsuspend the phy
and deactivate the autosuspend
- ehci/ohci will poweroff the phy in it s suspend callback (already
does that)
Hmm, do you remember that we have previously discussed there are some
oddities in ehci/ohci driver? phy_power_on() gets called twice at
ehci/ohci driver probe time, one is at pdata->power_on(); another is
at usb_add_hcd(), then the power_count of phy increases to 2, but
phy_power_off() is just invoked one time when ehci/ohci goes to PM
suspend, so phy->ops->power_off is never be invoked.
In this way, the usb-phy maybe never go to suspend.
quoted
- suspend -> resume
- ehci/ohci will poweron the phy
- in the phy's .complete callback you can reactivate the autosuspend
timer
Because it looks more like you actually need the phy and not the
clock alone.
So it would be nicer to use mechanisms already in place instead of
creating
new dependencies.
Theoretically, phy_init() will be invoked when ehci/ohci power on, and
the sm_work will be reactivated (have already implemented) in
phy->ops->init, but unfortunately, the same issue as phy_power_on()
mentioned above, it never run there too .
Would you like to give some comments on above two oddities please?
BR.
Frank
quoted
quoted
Hence, we are planing to refer clk_usbphyX_480m_src into each ehci/ohci
driver. Maybe you will challenge why not refer clk_usbphy_480m
directly?
because there are two ehci/ohci connected in the different usb2phy, and
only one clk_usbphy_480m clock was selected in clock tree.
Nope, no argument from me as I fully understand that each phy
provides its own
480m clock :-) .
Heiko