diff --git a/audio/aidl/default/Configuration.cpp b/audio/aidl/default/Configuration.cpp
index baaa55f..2a8e58f 100644
--- a/audio/aidl/default/Configuration.cpp
+++ b/audio/aidl/default/Configuration.cpp
@@ -32,7 +32,6 @@
 using aidl::android::media::audio::common::AudioFormatDescription;
 using aidl::android::media::audio::common::AudioFormatType;
 using aidl::android::media::audio::common::AudioGainConfig;
-using aidl::android::media::audio::common::AudioInputFlags;
 using aidl::android::media::audio::common::AudioIoFlags;
 using aidl::android::media::audio::common::AudioOutputFlags;
 using aidl::android::media::audio::common::AudioPort;
@@ -322,25 +321,20 @@
 //
 // Mix ports:
 //  * "r_submix output", maximum 10 opened streams, maximum 10 active streams
-//    - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000, 192000
+//    - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000
 //  * "r_submix input", maximum 10 opened streams, maximum 10 active streams
-//    - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000, 192000
-//  * "r_submix output direct", DIRECT|IEC958_NONAUDIO, 1 max open, 1 max active
-//    - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000, 192000
-//  * "r_submix input direct", DIRECT, 1 max open, 1 max active
-//    - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000, 192000
-
+//    - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000
 //
 // Routes:
-//  "r_submix output", "r_submix output direct" -> "Remote Submix Out"
-//  "Remote Submix In" -> "r_submix input", "r_submix input direct"
+//  "r_submix output" -> "Remote Submix Out"
+//  "Remote Submix In" -> "r_submix input"
 //
 std::unique_ptr<Configuration> getRSubmixConfiguration() {
     static const Configuration configuration = []() {
         Configuration c;
         const std::vector<AudioProfile> remoteSubmixPcmAudioProfiles{
                 createProfile(PcmType::INT_16_BIT, {AudioChannelLayout::LAYOUT_STEREO},
-                              {8000, 11025, 16000, 32000, 44100, 48000, 192000})};
+                              {8000, 11025, 16000, 32000, 44100, 48000})};
 
         // Device ports
 
@@ -365,41 +359,13 @@
         rsubmixOutMix.profiles = remoteSubmixPcmAudioProfiles;
         c.ports.push_back(rsubmixOutMix);
 
-        // Adding a DIRECT flag to rsubmixInMix breaks the mixer paths, so we need separate
-        // non direct and direct paths. It is added because for IEC61937 encapsulated over PCM, we
-        // need the DIRECT and IEC958_NONAUDIO flags as AudioFlinger adds them.
-        AudioPort rsubmixOutDirectMix =
-                createPort(c.nextPortId++, "r_submix output direct",
-                                makeBitPositionFlagMask({
-                                        AudioOutputFlags::DIRECT,
-                                        AudioOutputFlags::IEC958_NONAUDIO}),
-                                false /* isInput */,
-                                createPortMixExt(1 /* maxOpenStreamCount */,
-                                                 1 /* maxActiveStreamCount */));
-        rsubmixOutDirectMix.profiles = remoteSubmixPcmAudioProfiles;
-        c.ports.push_back(rsubmixOutDirectMix);
-
         AudioPort rsubmixInMix =
                 createPort(c.nextPortId++, "r_submix input", 0, true, createPortMixExt(10, 10));
         rsubmixInMix.profiles = remoteSubmixPcmAudioProfiles;
         c.ports.push_back(rsubmixInMix);
 
-        // Adding a DIRECT flag to rsubmixInMix breaks the capture paths, so we need separate
-        // non direct and direct paths. It is added because for IEC61937 encapsulated over PCM, we
-        // need the DIRECT flag for the capability so AudioFlinger can find a DIRECT input match.
-        AudioPort rsubmixInDirectMix =
-                createPort(c.nextPortId++, "r_submix input direct",
-                                makeBitPositionFlagMask({AudioInputFlags::DIRECT}),
-                                true /* isInput */,
-                                createPortMixExt(1 /* maxOpenStreamCount */,
-                                                 1 /* maxActiveStreamCount */));
-        rsubmixInDirectMix.profiles = remoteSubmixPcmAudioProfiles;
-        c.ports.push_back(rsubmixInDirectMix);
-
-        c.routes.push_back(createRoute(
-                {rsubmixOutMix, rsubmixOutDirectMix}, rsubmixOutDevice));
+        c.routes.push_back(createRoute({rsubmixOutMix}, rsubmixOutDevice));
         c.routes.push_back(createRoute({rsubmixInDevice}, rsubmixInMix));
-        c.routes.push_back(createRoute({rsubmixInDevice}, rsubmixInDirectMix));
 
         return c;
     }();
