int (*set_bias_level)(struct snd_soc_component *component,
                              enum snd_soc_bias_level level);
 
+       int (*open)(struct snd_soc_component *component,
+                   struct snd_pcm_substream *substream);
+       int (*close)(struct snd_soc_component *component,
+                    struct snd_pcm_substream *substream);
+       int (*ioctl)(struct snd_soc_component *component,
+                    struct snd_pcm_substream *substream,
+                    unsigned int cmd, void *arg);
+       int (*hw_params)(struct snd_soc_component *component,
+                        struct snd_pcm_substream *substream,
+                        struct snd_pcm_hw_params *params);
+       int (*hw_free)(struct snd_soc_component *component,
+                      struct snd_pcm_substream *substream);
+       int (*prepare)(struct snd_soc_component *component,
+                      struct snd_pcm_substream *substream);
+       int (*trigger)(struct snd_soc_component *component,
+                      struct snd_pcm_substream *substream, int cmd);
+       snd_pcm_uframes_t (*pointer)(struct snd_soc_component *component,
+                                    struct snd_pcm_substream *substream);
+       int (*get_time_info)(struct snd_soc_component *component,
+               struct snd_pcm_substream *substream, struct timespec *system_ts,
+               struct timespec *audio_ts,
+               struct snd_pcm_audio_tstamp_config *audio_tstamp_config,
+               struct snd_pcm_audio_tstamp_report *audio_tstamp_report);
+       int (*copy_user)(struct snd_soc_component *component,
+                        struct snd_pcm_substream *substream, int channel,
+                        unsigned long pos, void __user *buf,
+                        unsigned long bytes);
+       struct page *(*page)(struct snd_soc_component *component,
+                            struct snd_pcm_substream *substream,
+                            unsigned long offset);
+       int (*mmap)(struct snd_soc_component *component,
+                   struct snd_pcm_substream *substream,
+                   struct vm_area_struct *vma);
+
        const struct snd_pcm_ops *ops;
        const struct snd_compr_ops *compr_ops;
 
 
 int snd_soc_component_open(struct snd_soc_component *component,
                           struct snd_pcm_substream *substream)
 {
+       if (component->driver->open)
+               return component->driver->open(component, substream);
+
+       /* remove me */
        if (component->driver->ops &&
            component->driver->ops->open)
                return component->driver->ops->open(substream);
 int snd_soc_component_close(struct snd_soc_component *component,
                            struct snd_pcm_substream *substream)
 {
+       if (component->driver->close)
+               return component->driver->close(component, substream);
+
+       /* remove me */
        if (component->driver->ops &&
            component->driver->ops->close)
                return component->driver->ops->close(substream);
 int snd_soc_component_prepare(struct snd_soc_component *component,
                              struct snd_pcm_substream *substream)
 {
+       if (component->driver->prepare)
+               return component->driver->prepare(component, substream);
+
+       /* remove me */
        if (component->driver->ops &&
            component->driver->ops->prepare)
                return component->driver->ops->prepare(substream);
                                struct snd_pcm_substream *substream,
                                struct snd_pcm_hw_params *params)
 {
+       if (component->driver->hw_params)
+               return component->driver->hw_params(component,
+                                                   substream, params);
+
+       /* remove me */
        if (component->driver->ops &&
            component->driver->ops->hw_params)
                return component->driver->ops->hw_params(substream, params);
 int snd_soc_component_hw_free(struct snd_soc_component *component,
                               struct snd_pcm_substream *substream)
 {
+       if (component->driver->hw_free)
+               return component->driver->hw_free(component, substream);
+
+       /* remove me */
        if (component->driver->ops &&
            component->driver->ops->hw_free)
                return component->driver->ops->hw_free(substream);
                              struct snd_pcm_substream *substream,
                              int cmd)
 {
+       if (component->driver->trigger)
+               return component->driver->trigger(component, substream, cmd);
+
+       /* remove me */
        if (component->driver->ops &&
            component->driver->ops->trigger)
                return component->driver->ops->trigger(substream, cmd);
                component = rtdcom->component;
 
                /* FIXME: use 1st pointer */
+               if (component->driver->pointer)
+                       return component->driver->pointer(component, substream);
+
+               /* remove me */
                if (component->driver->ops &&
                    component->driver->ops->pointer)
                        return component->driver->ops->pointer(substream);
                component = rtdcom->component;
 
                /* FIXME: use 1st ioctl */
+               if (component->driver->ioctl)
+                       return component->driver->ioctl(component, substream,
+                                                       cmd, arg);
+
+               /* remove me */
                if (component->driver->ops &&
                    component->driver->ops->ioctl)
                        return component->driver->ops->ioctl(substream,
                component = rtdcom->component;
 
                /* FIXME. it returns 1st copy now */
+               if (component->driver->copy_user)
+                       return component->driver->copy_user(
+                               component, substream, channel, pos, buf, bytes);
+
+               /* remove me */
                if (component->driver->ops &&
                    component->driver->ops->copy_user)
                        return component->driver->ops->copy_user(
                component = rtdcom->component;
 
                /* FIXME. it returns 1st page now */
+               if (component->driver->page) {
+                       page = component->driver->page(component,
+                                                      substream, offset);
+                       if (page)
+                               return page;
+               }
+
+               /* remove me */
                if (component->driver->ops &&
                    component->driver->ops->page) {
                        page = component->driver->ops->page(substream, offset);
                component = rtdcom->component;
 
                /* FIXME. it returns 1st mmap now */
+               if (component->driver->mmap)
+                       return component->driver->mmap(component,
+                                                      substream, vma);
+
+               /* remove me */
                if (component->driver->ops &&
                    component->driver->ops->mmap)
                        return component->driver->ops->mmap(substream, vma);