ASoC: sh: fsi: free from NULL pointer of struct sh_fsi_platform_info
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Mon, 24 Jan 2011 01:42:33 +0000 (10:42 +0900)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Wed, 26 Jan 2011 11:25:33 +0000 (11:25 +0000)
Current FSI driver assumed master->info is not NULL.
This patch allow NULL in master->info

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Acked-by: Paul Mundt <lethal@linux-sh.org>
Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
sound/soc/sh/fsi.c

index 605ea7f17cf3f9216fa685944cfed5200cd564d2..3c53693d726688c4e5546b2d87d639eb57e2f640 100644 (file)
 
 #define FSI_FMTS (SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE)
 
+typedef int (*set_rate_func)(struct device *dev, int is_porta, int rate, int enable);
+
 /*
  * FSI driver use below type name for variable
  *
@@ -269,11 +271,22 @@ static struct fsi_priv *fsi_get_priv(struct snd_pcm_substream *substream)
        return fsi_get_priv_frm_dai(fsi_get_dai(substream));
 }
 
+static set_rate_func fsi_get_info_set_rate(struct fsi_master *master)
+{
+       if (!master->info)
+               return NULL;
+
+       return master->info->set_rate;
+}
+
 static u32 fsi_get_info_flags(struct fsi_priv *fsi)
 {
        int is_porta = fsi_is_port_a(fsi);
        struct fsi_master *master = fsi_get_master(fsi);
 
+       if (!master->info)
+               return 0;
+
        return is_porta ? master->info->porta_flags :
                master->info->portb_flags;
 }
@@ -830,12 +843,12 @@ static void fsi_dai_shutdown(struct snd_pcm_substream *substream,
        struct fsi_priv *fsi = fsi_get_priv(substream);
        int is_play = fsi_is_play(substream);
        struct fsi_master *master = fsi_get_master(fsi);
-       int (*set_rate)(struct device *dev, int is_porta, int rate, int enable);
+       set_rate_func set_rate;
 
        fsi_irq_disable(fsi, is_play);
        fsi_clk_ctrl(fsi, 0);
 
-       set_rate = master->info->set_rate;
+       set_rate = fsi_get_info_set_rate(master);
        if (set_rate && fsi->rate)
                set_rate(dai->dev, fsi_is_port_a(fsi), fsi->rate, 0);
        fsi->rate = 0;
@@ -902,12 +915,12 @@ static int fsi_dai_hw_params(struct snd_pcm_substream *substream,
 {
        struct fsi_priv *fsi = fsi_get_priv(substream);
        struct fsi_master *master = fsi_get_master(fsi);
-       int (*set_rate)(struct device *dev, int is_porta, int rate, int enable);
+       set_rate_func set_rate;
        int fsi_ver = master->core->ver;
        long rate = params_rate(params);
        int ret;
 
-       set_rate = master->info->set_rate;
+       set_rate = fsi_get_info_set_rate(master);
        if (!set_rate)
                return 0;