#include <linux/acpi.h>
 #include <linux/clk.h>
 #include <linux/device.h>
+#include <linux/device/bus.h>
 #include <linux/dmi.h>
 #include <linux/gpio/consumer.h>
 #include <linux/gpio/machine.h>
 #include "../atom/sst-atom-controls.h"
 #include "../common/soc-intel-quirks.h"
 
+#define BYT_RT5640_FALLBACK_CODEC_DEV_NAME     "i2c-rt5640"
+
 enum {
        BYT_RT5640_DMIC1_MAP,
        BYT_RT5640_DMIC2_MAP,
 
        codec_dev = acpi_get_first_physical_node(adev);
        acpi_dev_put(adev);
-       if (!codec_dev)
-               return -EPROBE_DEFER;
-       priv->codec_dev = get_device(codec_dev);
+
+       if (codec_dev) {
+               priv->codec_dev = get_device(codec_dev);
+       } else {
+               /*
+                * Special case for Android tablets where the codec i2c_client
+                * has been manually instantiated by x86_android_tablets.ko due
+                * to a broken DSDT.
+                */
+               codec_dev = bus_find_device_by_name(&i2c_bus_type, NULL,
+                                       BYT_RT5640_FALLBACK_CODEC_DEV_NAME);
+               if (!codec_dev)
+                       return -EPROBE_DEFER;
+
+               if (!i2c_verify_client(codec_dev)) {
+                       dev_err(dev, "Error '%s' is not an i2c_client\n",
+                               BYT_RT5640_FALLBACK_CODEC_DEV_NAME);
+                       put_device(codec_dev);
+               }
+
+               /* fixup codec name */
+               strscpy(byt_rt5640_codec_name, BYT_RT5640_FALLBACK_CODEC_DEV_NAME,
+                       sizeof(byt_rt5640_codec_name));
+
+               /* bus_find_device() returns a reference no need to get() */
+               priv->codec_dev = codec_dev;
+       }
 
        /*
         * swap SSP0 if bytcr is detected