int remove_order;
 };
 
+/* for Playback/Capture */
+struct snd_soc_dai_stream {
+       struct snd_soc_dapm_widget *widget;
+
+       unsigned int active;    /* usage count */
+       unsigned int tdm_mask;  /* CODEC TDM slot masks and params (for fixup) */
+
+       void *dma_data;         /* DAI DMA data */
+};
+
 /*
  * Digital Audio Interface runtime data.
  *
        struct snd_soc_dai_driver *driver;
 
        /* DAI runtime info */
-       unsigned int stream_active[SNDRV_PCM_STREAM_LAST + 1]; /* usage count */
-
-       struct snd_soc_dapm_widget *playback_widget;
-       struct snd_soc_dapm_widget *capture_widget;
-
-       /* DAI DMA data */
-       void *playback_dma_data;
-       void *capture_dma_data;
+       struct snd_soc_dai_stream stream[SNDRV_PCM_STREAM_LAST + 1];
 
        /* Symmetry data - only valid if symmetry is being enforced */
        unsigned int rate;
        /* parent platform/codec */
        struct snd_soc_component *component;
 
-       /* CODEC TDM slot masks and params (for fixup) */
-       unsigned int tx_mask;
-       unsigned int rx_mask;
-
        struct list_head list;
 
        /* function mark */
 static inline
 struct snd_soc_dapm_widget *snd_soc_dai_get_widget(struct snd_soc_dai *dai, int stream)
 {
-       return (stream == SNDRV_PCM_STREAM_PLAYBACK) ?
-               dai->playback_widget : dai->capture_widget;
+       return dai->stream[stream].widget;
 }
 
 #define snd_soc_dai_set_widget_playback(dai, widget)   snd_soc_dai_set_widget(dai, SNDRV_PCM_STREAM_PLAYBACK, widget)
 static inline
 void snd_soc_dai_set_widget(struct snd_soc_dai *dai, int stream, struct snd_soc_dapm_widget *widget)
 {
-       if (stream == SNDRV_PCM_STREAM_PLAYBACK)
-               dai->playback_widget = widget;
-       else
-               dai->capture_widget  = widget;
+       dai->stream[stream].widget = widget;
 }
 
 #define snd_soc_dai_dma_data_get_playback(dai) snd_soc_dai_dma_data_get(dai, SNDRV_PCM_STREAM_PLAYBACK)
 #define snd_soc_dai_get_dma_data(dai, ss)      snd_soc_dai_dma_data_get(dai, ss->stream)
 static inline void *snd_soc_dai_dma_data_get(const struct snd_soc_dai *dai, int stream)
 {
-       return (stream == SNDRV_PCM_STREAM_PLAYBACK) ?
-               dai->playback_dma_data : dai->capture_dma_data;
+       return dai->stream[stream].dma_data;
 }
 
 #define snd_soc_dai_dma_data_set_playback(dai, data)   snd_soc_dai_dma_data_set(dai, SNDRV_PCM_STREAM_PLAYBACK, data)
 #define snd_soc_dai_set_dma_data(dai, ss, data)                snd_soc_dai_dma_data_set(dai, ss->stream, data)
 static inline void snd_soc_dai_dma_data_set(struct snd_soc_dai *dai, int stream, void *data)
 {
-       if (stream == SNDRV_PCM_STREAM_PLAYBACK)
-               dai->playback_dma_data = data;
-       else
-               dai->capture_dma_data = data;
+       dai->stream[stream].dma_data = data;
 }
 
-static inline void snd_soc_dai_init_dma_data(struct snd_soc_dai *dai,
-                                            void *playback, void *capture)
+static inline void snd_soc_dai_init_dma_data(struct snd_soc_dai *dai, void *playback, void *capture)
 {
-       dai->playback_dma_data = playback;
-       dai->capture_dma_data = capture;
+       snd_soc_dai_dma_data_set_playback(dai, playback);
+       snd_soc_dai_dma_data_set_capture(dai,  capture);
 }
 
 static inline unsigned int snd_soc_dai_tdm_mask_get(struct snd_soc_dai *dai, int stream)
 {
-       if (stream == SNDRV_PCM_STREAM_PLAYBACK)
-               return dai->tx_mask;
-       else
-               return dai->rx_mask;
+       return dai->stream[stream].tdm_mask;
 }
 
 static inline void snd_soc_dai_tdm_mask_set(struct snd_soc_dai *dai, int stream,
                                            unsigned int tdm_mask)
 {
-       if (stream == SNDRV_PCM_STREAM_PLAYBACK)
-               dai->tx_mask = tdm_mask;
-       else
-               dai->rx_mask = tdm_mask;
+       dai->stream[stream].tdm_mask = tdm_mask;
+}
+
+static inline unsigned int snd_soc_dai_stream_active(struct snd_soc_dai *dai, int stream)
+{
+       /* see snd_soc_dai_action() for setup */
+       return dai->stream[stream].active;
 }
 
 static inline void snd_soc_dai_set_drvdata(struct snd_soc_dai *dai,
                return ERR_PTR(-ENOTSUPP);
 }
 
-static inline unsigned int
-snd_soc_dai_stream_active(struct snd_soc_dai *dai, int stream)
-{
-       return dai->stream_active[stream];
-}
-
 #endif