I think what you need to use is use azx_get_pos_posbuf(chip, azx_dev); unconditionally, both for capture and playback, and remove the use of the skylake specific stuff and the delay.
When I measured, I saw a slight difference between values in DPIB and posbuf, so I wonder which is actually more accurate. The latter is sometimes a bit behind the former.
If the posbuf is more correct in the sense for the PCM pointer, we can simply move back to the posbuf like other platforms.
DPIB registers are known to be updated 'too early' in the case of VC1 traffic, the recommendation is to use posbuf as a 'safer' alternative. And it's certainly 'more correct' that the current work-arounds which apply different solutions on capture and playback for no apparent reason.