On Tuesday 16 July 2013 03:57 PM, Grygorii Strashko wrote: > Hi Rajendra, > > On 07/11/2013 12:17 PM, Rajendra Nayak wrote: >> On Wednesday 10 July 2013 09:37 PM, Felipe Balbi wrote: >>> how about something like below ? It makes omap_device/hwmod and >>> pm_runtime agree on the initial state of the device and will prevent >>> ->runtime_resume() from being called on first pm_runtime_get*() done >>> during probe. >>> >>> This is similar to what PCI bus does (if you look at pci_pm_init()). >> >> I tried something similar [1] but what I found is that the serial >> runtime resume was called despite it being marked as active using >> pm_runtime_set_active(). >> >> That seems to be because of the pm_runtime_set_autosuspend_delay() >> because we have the autosuspend_delay = -1 >> >> ----- >> static void update_autosuspend(struct device *dev, int old_delay, int >> old_use) >> { >> int delay = dev->power.autosuspend_delay; >> >> /* Should runtime suspend be prevented now? */ >> if (dev->power.use_autosuspend && delay < 0) { >> >> /* If it used to be allowed then prevent it. */ >> if (!old_use || old_delay >= 0) { >> atomic_inc(&dev->power.usage_count); >> rpm_resume(dev, 0); >> <------------------------------- calls serial runtime resume. >> } >> } >> ----- >> >> So we end up with the same issue with serial resume being called before >> set_termios() >> >> [1] >> >> diff --git a/arch/arm/mach-omap2/omap_device.c >> b/arch/arm/mach-omap2/omap_device.c >> index 5cc9287..c71d47d 100644 >> --- a/arch/arm/mach-omap2/omap_device.c >> +++ b/arch/arm/mach-omap2/omap_device.c >> @@ -129,6 +129,7 @@ static int omap_device_build_from_dt(struct >> platform_device *pdev) >> struct device_node *node = pdev->dev.of_node; >> const char *oh_name; >> int oh_cnt, i, ret = 0; >> + bool device_active = false; >> >> oh_cnt = of_property_count_strings(node, "ti,hwmods"); >> if (oh_cnt <= 0) { >> @@ -152,6 +153,9 @@ static int omap_device_build_from_dt(struct >> platform_device *pdev) >> goto odbfd_exit1; >> } >> hwmods[i] = oh; >> + if (oh->flags & HWMOD_INIT_NO_IDLE) >> + device_active = true; >> + >> } >> >> od = omap_device_alloc(pdev, hwmods, oh_cnt); >> @@ -172,6 +176,11 @@ static int omap_device_build_from_dt(struct >> platform_device *pdev) >> >> pdev->dev.pm_domain = &omap_device_pm_domain; >> >> + if (device_active) { >> + omap_device_enable(pdev); >> + pm_runtime_set_active(&pdev->dev); >> + } >> + >> odbfd_exit1: >> kfree(hwmods); >> odbfd_exit: > > This solution works good for me in combination with > "serial: omap: enable PM runtime only when its fully configured" > http://www.spinics.net/lists/linux-serial/msg10317.html > (earlyprintk use case) > > And I think the best way would be to move forward with yours solution. > - it will affect only on needed IPs drivers - not on all, so no issues with > iommu and etc.
Ok, good to know that this solution works. Anyone has any other thoughts on whats the best way to fix this for the -rcs? (Note that we have bootup broken on all OMAPs with DEBUG_LL for now, atleast for all DT only platforms) The other option of course is to use the patch posted by Felipe [1], thought that had issues handling processor IPs as pointed out by Grygorii and Suman [2], the fix I posted [3] to make omap_device aware of hwmod bypassing these IPs might fix some of those, but this solution in general would need more testing as it affects all modules on the bus. [1] http://www.spinics.net/lists/arm-kernel/msg258062.html [2] http://www.spinics.net/lists/arm-kernel/msg258061.html [3] http://www.spinics.net/lists/arm-kernel/msg258465.html > > But issue with *non console" UARTs will still be here and, I think, > there are no way ti solve it from OMAP device/hwmod frameworks side, > because only driver can know when his context is ready. > To test do: #echo 0xDEAD > dev/ttyO3 > > Regards, > -grygorii -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html