diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index b6d808c067913d6e551d7b8e6dff020f0ecd7d6e..abcb4719632f9b536229ec7d83c3a0e7a97ea306 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -2103,13 +2103,17 @@ unsigned int snd_soc_read(struct snd_soc_codec *codec, unsigned int reg)
 {
 	unsigned int ret;
 
-	if (unlikely(!snd_card_is_online_state(codec->card->snd_card))) {
-		dev_err(codec->dev, "read 0x%02x while offline\n", reg);
-		return -ENODEV;
-	}
-	ret = codec->read(codec, reg);
-	dev_dbg(codec->dev, "read %x => %x\n", reg, ret);
-	trace_snd_soc_reg_read(codec, reg, ret);
+        if (codec->read) {
+		if (unlikely(!snd_card_is_online_state(codec->card->snd_card))) {
+			dev_err(codec->dev, "read 0x%02x while offline\n", reg);
+			return -ENODEV;
+		}
+		ret = codec->read(codec, reg);
+		dev_dbg(codec->dev, "read %x => %x\n", reg, ret);
+		trace_snd_soc_reg_read(codec, reg, ret);
+        }
+        else
+		ret = -EIO;
 
 	return ret;
 }
@@ -2118,13 +2122,17 @@ EXPORT_SYMBOL_GPL(snd_soc_read);
 unsigned int snd_soc_write(struct snd_soc_codec *codec,
 			   unsigned int reg, unsigned int val)
 {
-	if (unlikely(!snd_card_is_online_state(codec->card->snd_card))) {
-		dev_err(codec->dev, "write 0x%02x while offline\n", reg);
-		return -ENODEV;
-	}
-	dev_dbg(codec->dev, "write %x = %x\n", reg, val);
-	trace_snd_soc_reg_write(codec, reg, val);
-	return codec->write(codec, reg, val);
+	if (codec->write) {
+		if (unlikely(!snd_card_is_online_state(codec->card->snd_card))) {
+			dev_err(codec->dev, "write 0x%02x while offline\n", reg);
+			return -ENODEV;
+		}
+		dev_dbg(codec->dev, "write %x = %x\n", reg, val);
+		trace_snd_soc_reg_write(codec, reg, val);
+		return codec->write(codec, reg, val);
+        }
+	else
+		return -EIO;
 }
 EXPORT_SYMBOL_GPL(snd_soc_write);