Hi Tony, On Mon, 1 Oct 2018 07:47:45 -0700 Tony Lindgren <tony@xxxxxxxxxxx> wrote: > * Andreas Kemnade <andreas@xxxxxxxxxxxx> [180929 22:39]: > > + * needed to disable autoidle, if system power state is too low > > + * hdq transactions will not work correctly, although registers > > + * are accessible. > > + * According to AM/DM3730 TRM p.2879 the hwmod has to way to > > + * keep iclk running during a transfer if autoidle is enabled > > Sounds like hdq1w is not wake-up capable and the uart is blocking > deeper SoC idle states. To me it seems that you should rather just > use pm_qos in the hdq1w driver to block SoC idle for the duration > of transfers. > > We had a similar problem with audio playback glitches a while > back, see commit 9834ffd1ecc3 ("ASoC: omap-mcbsp: Add PM QoS > support for McBSP to prevent glitches"). See how it does > pm_qos_add_request(), pm_qos_update_request() and > pm_qos_remove_request(). I found this interesting function: /** * _setup_iclk_autoidle - configure an IP block's interface clocks * @oh: struct omap_hwmod * * * Set up the module's interface clocks. XXX This function is still mostly * a stub; implementing this properly requires iclk autoidle usecounting in * the clock code. No return value. */ static void __init _setup_iclk_autoidle(struct omap_hwmod *oh) { struct omap_hwmod_ocp_if *os; if (oh->_state != _HWMOD_STATE_INITIALIZED) return; list_for_each_entry(os, &oh->slave_ports, node) { if (!os->_clk) continue; if (os->flags & OCPIF_SWSUP_IDLE) { /* XXX omap_iclk_deny_idle(c); */ } else { /* XXX omap_iclk_allow_idle(c); */ clk_enable(os->_clk); } } return; } So at first glance it looks like we just need to uncomment the first XXX line here. But why the heck we need usecounting for the autoidle stuff? How do I test it (if I would implement some counter)? IMHO the clean solution for the hdq problem would be to fix this function. Regards, Andreas
Attachment:
pgppIUM_C8C0G.pgp
Description: OpenPGP digital signature