We have a custom board with i.MX6D and a SGTL5000 chip. On that board we are running Linux built with Yocto (1.6) and kernel 3.10.17. Recently we have experienced an issue when we play sound on SGTL5000 and after that do a reboot/reset (no power cycle). After that sequence the whole I2C bus is hanged because SGTL5000 holds the SDA low until next power cycle.
We have read the errata for the SGTL5000 that recommends the usage of external regulator for VDDD. In our design we have that design, VDDIO/VDDA is 3.3V and VDDD is 1.5V provided externally.
In Linux at boot time we see the trace:
sgtl5000 0-000a: Failed to get supply 'VDDD': -19
sgtl5000 0-000a: Using internal LDO instead of VDDD
The conclusion is that there is a missconfiguration in our system. Linux uses the internal LDO but we have external regulator for VDDD. To fix this issue we tried to change the DTB and added VDDD-supply but with no luck. To fix this issue we had to comment code in the driver to not use the internal LDO and then we get rid of the problem.
In the sgtl5000 driver (3.10.17_1.0.1_ga) on line 1064 we see this comment:
* 3. chip revision >=0x11 or not. If >=0x11, not use external vddd.
We have chip version 0x11 and because of this the driver (unpatched) will always use internal VDO for VDDD. That was the cause that our device tree change did not take effect and we had to patch the code to use external regulator for VDDD.
We see a glitch in the communication from Freescale. The errata and manual for SGTL5000 recommends to use external regulator for VDDD but the driver code force us to use the internal LDO for VDDD. We need to use the external regulator in our design otherwise we can not reset the board without hanging the I2C bus. How should we handle this? Comments on this?