Hi, On Wed, Aug 14, 2024 at 2:48 PM Stefan Wahren <wahrenst@xxxxxxx> wrote: > > >> You're saying that your > >> registers get saved _unless_ the power domain gets turned off, right? > On BCM2835 there is no need to store the registers because there is no > power management supported by USB core except of the power domain. So > DWC2 don't expect a register loss. > >> ...and the device core keeps power domains on for suspended devices if > >> they are wakeup sources, which makes sense. > >> > >> So with that, your patch sounds like a plausible way to do it. I guess > >> one other way to do it would be some sort of "canary" approach. You > >> could _always_ save registers and then, at resume time, you could > >> detect if some "canary" register had reset to its power-on default. If > >> you see this then you can assume power was lost and re-init all the > >> registers. This could be pretty much any register that you know won't > >> be its power on default. In some ways a "canary" approach is uglier > >> but it also might be more reliable across more configurations? > I don't have enough knowledge about DWC2 and i also don't have the > databook to figure out if there is a magic register which could be used > for the canary approach. But all these different platforms, host vs > gadget role, different low modes let me think the resulting solution > would be also fragile and ugly. I won't admit to having a DWC2 databook. ;-) ...but don't think it's too hard to find a good canary. What about "GAHBCFG_GLBL_INTR_EN" ? From a quick glance it looks like the driver seems to set that bit during driver startup and then it stays on until driver shutdown. The databook that I definitely won't admit to having almost certainly says that this register resets to 0 on all hardware and it's applicable to both host and device. I think you could say that if the register is 0 at resume time that registers must have been lost and you can restore them. I guess if that doesn't work then "GUSBCFG_TOUTCAL" could be used (I think that resets to 0 but must be initted to non-0 by the driver). Yet another register that could probably work as a canary would be "GINTMSK". I believe that inits to all 0 (everything is masked) and obviously to use the device we've got to unmask _some_ interrupts. I can look for more, if need be. -Doug