struct sun8i_codec_quirks {
        bool legacy_widgets     : 1;
+       bool lrck_inversion     : 1;
 };
 
 struct sun8i_codec {
                           value << SUN8I_AIF1CLK_CTRL_AIF1_BCLK_INV);
 
        /*
-        * It appears that the DAI and the codec don't share the same
-        * polarity for the LRCK signal when they mean 'normal' and
-        * 'inverted' in the datasheet.
+        * It appears that the DAI and the codec in the A33 SoC don't
+        * share the same polarity for the LRCK signal when they mean
+        * 'normal' and 'inverted' in the datasheet.
         *
         * Since the DAI here is our regular i2s driver that have been
         * tested with way more codecs than just this one, it means
         * that the codec probably gets it backward, and we have to
         * invert the value here.
         */
+       value ^= scodec->quirks->lrck_inversion;
        regmap_update_bits(scodec->regmap, SUN8I_AIF1CLK_CTRL,
                           BIT(SUN8I_AIF1CLK_CTRL_AIF1_LRCK_INV),
-                          !value << SUN8I_AIF1CLK_CTRL_AIF1_LRCK_INV);
+                          value << SUN8I_AIF1CLK_CTRL_AIF1_LRCK_INV);
 
        /* DAI format */
        switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
 
 static const struct sun8i_codec_quirks sun8i_a33_quirks = {
        .legacy_widgets = true,
+       .lrck_inversion = true,
 };
 
 static const struct sun8i_codec_quirks sun50i_a64_quirks = {