/* FS need to be inverted */
                inv_fs = true;
                break;
+       case SND_SOC_DAIFMT_RIGHT_J:
        case SND_SOC_DAIFMT_LEFT_J:
                /* configure a full-word SYNC pulse (LRCLK) */
                mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
                                       int sample_width)
 {
        u32 fmt;
-       u32 tx_rotate = (sample_width / 4) & 0x7;
+       u32 tx_rotate, rx_rotate, slot_width;
        u32 mask = (1ULL << sample_width) - 1;
-       u32 slot_width = sample_width;
-
-       /*
-        * For captured data we should not rotate, inversion and masking is
-        * enoguh to get the data to the right position:
-        * Format         data from bus         after reverse (XRBUF)
-        * S16_LE:      |LSB|MSB|xxx|xxx|       |xxx|xxx|MSB|LSB|
-        * S24_3LE:     |LSB|DAT|MSB|xxx|       |xxx|MSB|DAT|LSB|
-        * S24_LE:      |LSB|DAT|MSB|xxx|       |xxx|MSB|DAT|LSB|
-        * S32_LE:      |LSB|DAT|DAT|MSB|       |MSB|DAT|DAT|LSB|
-        */
-       u32 rx_rotate = 0;
 
+       if (mcasp->slot_width)
+               slot_width = mcasp->slot_width;
+       else
+               slot_width = sample_width;
        /*
-        * Setting the tdm slot width either with set_clkdiv() or
-        * set_tdm_slot() allows us to for example send 32 bits per
-        * channel to the codec, while only 16 of them carry audio
-        * payload.
+        * TX rotation:
+        * right aligned formats: rotate w/ slot_width
+        * left aligned formats: rotate w/ sample_width
+        *
+        * RX rotation:
+        * right aligned formats: no rotation needed
+        * left aligned formats: rotate w/ (slot_width - sample_width)
         */
-       if (mcasp->slot_width) {
-               /*
-                * When we have more bclk then it is needed for the
-                * data, we need to use the rotation to move the
-                * received samples to have correct alignment.
-                */
-               slot_width = mcasp->slot_width;
+       if ((mcasp->dai_fmt & SND_SOC_DAIFMT_FORMAT_MASK) ==
+           SND_SOC_DAIFMT_RIGHT_J) {
+               tx_rotate = (slot_width / 4) & 0x7;
+               rx_rotate = 0;
+       } else {
+               tx_rotate = (sample_width / 4) & 0x7;
                rx_rotate = (slot_width - sample_width) / 4;
        }