On Fri, 16 Dec 2011, Tomi Valkeinen wrote: > Ricardo, struct omap_dss_board_info already contains a few function > pointers, for example get_context_loss_count. I think > omap_hwmod_set_slave_idlemode can be handled the same way. > > Although I'm not sure should the function pointer be just > "set_slave_idlemode", and thus just a direct way to call the hwmod func, > or should it be something more use case specific, like, say > "hdmi_audio_start/stop". > > I'm thinking it should be the latter. As far as I understand, the bug is > not in the HDMI IP, but somewhere in the L3 side? And if so, it's not > the HDMI driver's job to know how to fix the bug, but just to offer > hooks so that the platform code can fix it. Should the HDMI module ever be allowed to run in smart-idle wakeup mode while it's active? If not, then the easy way to fix this bug would be to add the HWMOD_SWSUP_SIDLE flag to the HDMI omap_hwmod.flags field. No omap_device/omap_hwmod code/pdata hacking needed. On the other hand, if there are times when the HDMI module should run in smart-idle wakeup while it's active, then some code would be needed. It's ironic that the bug is related to L3 interface clock autoidle, but that we no longer have the ability to control that on OMAP4... My recollection is that the McBSP + sidetone blocks have exactly the same bug on OMAP3, but that case is even worse because they can't use the module slave idle bits to fix the problem due to some power management regression. So anyway, off the top of my head, I'd naïvely suggest something like omap_hwmod_block_slave_autoidle() and omap_hwmod_allow_slave_autoidle(). I don't think we'd have a situation where we'd need to use-count these, unless you think otherwise. So I'd suggest having those functions do nothing if HWMOD_SWSUP_SIDLE is set in omap_hwmod.flags. Otherwise, I'd suggest that block() should set a new omap_hwmod._int_flags bit, _HWMOD_SWSUP_SIDLE_FORCE or something, and call _set_slave_idlemode() appropriately. allow() should clear that flag and call _set_slave_idlemode() appropriately. It will also be necessary to change every place in the hwmod code that tests omap_hwmod.flags against HWMOD_SWSUP_SIDLE to also test omap_hwmod._int_flags against _HWMOD_SWSUP_SIDLE_FORCE, e.g., in _{enable,disable}_wakeup(), _{enable,idle}_sysc(), etc. Thoughts welcome. - Paul