aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>2013-11-28 21:43:13 -0500
committerMark Brown <broonie@linaro.org>2013-11-29 07:09:54 -0500
commit42ee5d22e3d2550a49bc5d3e6f19c92da9a19446 (patch)
treead389e7a5b773876fbe455c94d8188d57e5b6290
parentc1e6cc5e577d1d446a645aea02d28a924f20b834 (diff)
ASoC: rcar: add rsnd_is_accessible_reg()
Current rcar driver is supporting Gen1, and Gen2 will be supported soon. Then, some registers are used from Gen1 only, or from Gen2 only. To avoid NULL pointer access, this patch adds register accessible check function. Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Signed-off-by: Mark Brown <broonie@linaro.org>
-rw-r--r--sound/soc/sh/rcar/gen.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/sound/soc/sh/rcar/gen.c b/sound/soc/sh/rcar/gen.c
index 0ebea44e890f..970439d5ec0e 100644
--- a/sound/soc/sh/rcar/gen.c
+++ b/sound/soc/sh/rcar/gen.c
@@ -86,12 +86,28 @@ static struct regmap_bus rsnd_regmap_bus = {
86 .val_format_endian_default = REGMAP_ENDIAN_NATIVE, 86 .val_format_endian_default = REGMAP_ENDIAN_NATIVE,
87}; 87};
88 88
89static int rsnd_is_accessible_reg(struct rsnd_priv *priv,
90 struct rsnd_gen *gen, enum rsnd_reg reg)
91{
92 if (!gen->regs[reg]) {
93 struct device *dev = rsnd_priv_to_dev(priv);
94
95 dev_err(dev, "unsupported register access %x\n", reg);
96 return 0;
97 }
98
99 return 1;
100}
101
89u32 rsnd_read(struct rsnd_priv *priv, 102u32 rsnd_read(struct rsnd_priv *priv,
90 struct rsnd_mod *mod, enum rsnd_reg reg) 103 struct rsnd_mod *mod, enum rsnd_reg reg)
91{ 104{
92 struct rsnd_gen *gen = rsnd_priv_to_gen(priv); 105 struct rsnd_gen *gen = rsnd_priv_to_gen(priv);
93 u32 val; 106 u32 val;
94 107
108 if (!rsnd_is_accessible_reg(priv, gen, reg))
109 return 0;
110
95 regmap_fields_read(gen->regs[reg], rsnd_mod_id(mod), &val); 111 regmap_fields_read(gen->regs[reg], rsnd_mod_id(mod), &val);
96 112
97 return val; 113 return val;
@@ -103,6 +119,9 @@ void rsnd_write(struct rsnd_priv *priv,
103{ 119{
104 struct rsnd_gen *gen = rsnd_priv_to_gen(priv); 120 struct rsnd_gen *gen = rsnd_priv_to_gen(priv);
105 121
122 if (!rsnd_is_accessible_reg(priv, gen, reg))
123 return;
124
106 regmap_fields_write(gen->regs[reg], rsnd_mod_id(mod), data); 125 regmap_fields_write(gen->regs[reg], rsnd_mod_id(mod), data);
107} 126}
108 127
@@ -111,6 +130,9 @@ void rsnd_bset(struct rsnd_priv *priv, struct rsnd_mod *mod,
111{ 130{
112 struct rsnd_gen *gen = rsnd_priv_to_gen(priv); 131 struct rsnd_gen *gen = rsnd_priv_to_gen(priv);
113 132
133 if (!rsnd_is_accessible_reg(priv, gen, reg))
134 return;
135
114 regmap_fields_update_bits(gen->regs[reg], rsnd_mod_id(mod), 136 regmap_fields_update_bits(gen->regs[reg], rsnd_mod_id(mod),
115 mask, data); 137 mask, data);
116} 138}
@@ -134,6 +156,10 @@ static int rsnd_gen_regmap_init(struct rsnd_priv *priv,
134 } 156 }
135 157
136 for (i = 0; i < RSND_REG_MAX; i++) { 158 for (i = 0; i < RSND_REG_MAX; i++) {
159 gen->regs[i] = NULL;
160 if (!regf[i].reg)
161 continue;
162
137 gen->regs[i] = devm_regmap_field_alloc(dev, gen->regmap, regf[i]); 163 gen->regs[i] = devm_regmap_field_alloc(dev, gen->regmap, regf[i]);
138 if (IS_ERR(gen->regs[i])) 164 if (IS_ERR(gen->regs[i]))
139 return PTR_ERR(gen->regs[i]); 165 return PTR_ERR(gen->regs[i]);