Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bus: ti-sysc: Flush posted write only after srst_udelay

Commit 34539b442b3b ("bus: ti-sysc: Flush posted write on enable before
reset") caused a regression reproducable on omap4 duovero where the ISS
target module can produce interconnect errors on boot. Turns out the
registers are not accessible until after a delay for devices needing
a ti,sysc-delay-us value.

Let's fix this by flushing the posted write only after the reset delay.
We do flushing also for ti,sysc-delay-us using devices as that should
trigger an interconnect error if the delay is not properly configured.

Let's also add some comments while at it.

Fixes: 34539b442b3b ("bus: ti-sysc: Flush posted write on enable before reset")
Cc: stable@vger.kernel.org
Signed-off-by: Tony Lindgren <tony@atomide.com>

+14 -4
+14 -4
drivers/bus/ti-sysc.c
··· 2158 2158 sysc_val = sysc_read_sysconfig(ddata); 2159 2159 sysc_val |= sysc_mask; 2160 2160 sysc_write(ddata, sysc_offset, sysc_val); 2161 - /* Flush posted write */ 2161 + 2162 + /* 2163 + * Some devices need a delay before reading registers 2164 + * after reset. Presumably a srst_udelay is not needed 2165 + * for devices that use a rstctrl register reset. 2166 + */ 2167 + if (ddata->cfg.srst_udelay) 2168 + fsleep(ddata->cfg.srst_udelay); 2169 + 2170 + /* 2171 + * Flush posted write. For devices needing srst_udelay 2172 + * this should trigger an interconnect error if the 2173 + * srst_udelay value is needed but not configured. 2174 + */ 2162 2175 sysc_val = sysc_read_sysconfig(ddata); 2163 2176 } 2164 - 2165 - if (ddata->cfg.srst_udelay) 2166 - fsleep(ddata->cfg.srst_udelay); 2167 2177 2168 2178 if (ddata->post_reset_quirk) 2169 2179 ddata->post_reset_quirk(ddata);