void *control_data; /* codec control (i2c/3wire) data */
        hw_write_t hw_write;
        unsigned int (*hw_read)(struct snd_soc_codec *, unsigned int);
+       unsigned int (*read)(struct snd_soc_codec *, unsigned int);
+       int (*write)(struct snd_soc_codec *, unsigned int, unsigned int);
        void *reg_cache;
        const struct snd_soc_cache_ops *cache_ops;
        struct mutex cache_rw_mutex;
 
                return -EINVAL;
        }
 
-       codec->driver->write = io_types[i].write;
-       codec->driver->read = io_types[i].read;
+       codec->write = io_types[i].write;
+       codec->read = io_types[i].read;
 
        switch (control) {
        case SND_SOC_CUSTOM:
 
 {
        unsigned int ret;
 
-       ret = codec->driver->read(codec, reg);
+       ret = codec->read(codec, reg);
        dev_dbg(codec->dev, "read %x => %x\n", reg, ret);
        trace_snd_soc_reg_read(codec, reg, ret);
 
 {
        dev_dbg(codec->dev, "write %x = %x\n", reg, val);
        trace_snd_soc_reg_write(codec, reg, val);
-       return codec->driver->write(codec, reg, val);
+       return codec->write(codec, reg, val);
 }
 EXPORT_SYMBOL_GPL(snd_soc_write);
 
 
        INIT_LIST_HEAD(&codec->dapm.widgets);
        INIT_LIST_HEAD(&codec->dapm.paths);
+       codec->write = codec_drv->write;
+       codec->read = codec_drv->read;
        codec->dapm.bias_level = SND_SOC_BIAS_OFF;
        codec->dapm.dev = dev;
        codec->dapm.codec = codec;