aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>2010-12-03 03:38:03 -0500
committerMark Brown <broonie@opensource.wolfsonmicro.com>2010-12-03 07:24:15 -0500
commit43fa95caab86fec0af7333bda407dd14f0c2127c (patch)
tree32003d033a627ba8502c7521721dddc67f483165
parente8c8b6318c3dad742d03b5fff5360729f7ac2e5a (diff)
ASoC: sh: fsi: remove runtime register check from fsi_master_xxx
Current FSI driver was checking register range on fsi_master_xxx function. This runtime check was added to avoid an illegal access from wrong/mistake implementation. But it is useless check under the correct implementation. This patch escape runtime check by using macro technique. If there is wrong implementation, it will be compile error. Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Acked-by: Liam Girdwood <lrg@slimlogic.co.uk> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
-rw-r--r--sound/soc/sh/fsi.c48
1 files changed, 20 insertions, 28 deletions
diff --git a/sound/soc/sh/fsi.c b/sound/soc/sh/fsi.c
index 66abb6ec0442..19a2f99be60c 100644
--- a/sound/soc/sh/fsi.c
+++ b/sound/soc/sh/fsi.c
@@ -33,6 +33,12 @@
33#define REG_MUTE_ST 0x0028 33#define REG_MUTE_ST 0x0028
34#define REG_OUT_SEL 0x0030 34#define REG_OUT_SEL 0x0030
35 35
36/* master register */
37#define MST_CLK_RST 0x0210
38#define MST_SOFT_RST 0x0214
39#define MST_FIFO_SZ 0x0218
40
41/* core register (depend on FSI version) */
36#define A_MST_CTLR 0x0180 42#define A_MST_CTLR 0x0180
37#define B_MST_CTLR 0x01A0 43#define B_MST_CTLR 0x01A0
38#define CPU_INT_ST 0x01F4 44#define CPU_INT_ST 0x01F4
@@ -41,12 +47,6 @@
41#define INT_ST 0x0200 47#define INT_ST 0x0200
42#define IEMSK 0x0204 48#define IEMSK 0x0204
43#define IMSK 0x0208 49#define IMSK 0x0208
44#define MUTE 0x020C
45#define CLK_RST 0x0210
46#define SOFT_RST 0x0214
47#define FIFO_SZ 0x0218
48#define MREG_START A_MST_CTLR
49#define MREG_END FIFO_SZ
50 50
51/* DO_FMT */ 51/* DO_FMT */
52/* DI_FMT */ 52/* DI_FMT */
@@ -200,17 +200,13 @@ static void __fsi_reg_mask_set(u32 reg, u32 mask, u32 data)
200#define fsi_reg_mask_set(p, r, m, d)\ 200#define fsi_reg_mask_set(p, r, m, d)\
201 __fsi_reg_mask_set((u32)(p->base + REG_##r), m, d) 201 __fsi_reg_mask_set((u32)(p->base + REG_##r), m, d)
202 202
203static u32 fsi_master_read(struct fsi_master *master, u32 reg) 203#define fsi_master_read(p, r) _fsi_master_read(p, MST_##r)
204#define fsi_core_read(p, r) _fsi_master_read(p, p->core->r)
205static u32 _fsi_master_read(struct fsi_master *master, u32 reg)
204{ 206{
205 u32 ret; 207 u32 ret;
206 unsigned long flags; 208 unsigned long flags;
207 209
208 if ((reg < MREG_START) ||
209 (reg > MREG_END)) {
210 pr_err("fsi: register access err (%s)\n", __func__);
211 return 0;
212 }
213
214 spin_lock_irqsave(&master->lock, flags); 210 spin_lock_irqsave(&master->lock, flags);
215 ret = __fsi_reg_read((u32)(master->base + reg)); 211 ret = __fsi_reg_read((u32)(master->base + reg));
216 spin_unlock_irqrestore(&master->lock, flags); 212 spin_unlock_irqrestore(&master->lock, flags);
@@ -218,17 +214,13 @@ static u32 fsi_master_read(struct fsi_master *master, u32 reg)
218 return ret; 214 return ret;
219} 215}
220 216
221static void fsi_master_mask_set(struct fsi_master *master, 217#define fsi_master_mask_set(p, r, m, d) _fsi_master_mask_set(p, MST_##r, m, d)
218#define fsi_core_mask_set(p, r, m, d) _fsi_master_mask_set(p, p->core->r, m, d)
219static void _fsi_master_mask_set(struct fsi_master *master,
222 u32 reg, u32 mask, u32 data) 220 u32 reg, u32 mask, u32 data)
223{ 221{
224 unsigned long flags; 222 unsigned long flags;
225 223
226 if ((reg < MREG_START) ||
227 (reg > MREG_END)) {
228 pr_err("fsi: register access err (%s)\n", __func__);
229 return;
230 }
231
232 spin_lock_irqsave(&master->lock, flags); 224 spin_lock_irqsave(&master->lock, flags);
233 __fsi_reg_mask_set((u32)(master->base + reg), mask, data); 225 __fsi_reg_mask_set((u32)(master->base + reg), mask, data);
234 spin_unlock_irqrestore(&master->lock, flags); 226 spin_unlock_irqrestore(&master->lock, flags);
@@ -448,8 +440,8 @@ static void fsi_irq_enable(struct fsi_priv *fsi, int is_play)
448 u32 data = AB_IO(1, fsi_get_port_shift(fsi, is_play)); 440 u32 data = AB_IO(1, fsi_get_port_shift(fsi, is_play));
449 struct fsi_master *master = fsi_get_master(fsi); 441 struct fsi_master *master = fsi_get_master(fsi);
450 442
451 fsi_master_mask_set(master, master->core->imsk, data, data); 443 fsi_core_mask_set(master, imsk, data, data);
452 fsi_master_mask_set(master, master->core->iemsk, data, data); 444 fsi_core_mask_set(master, iemsk, data, data);
453} 445}
454 446
455static void fsi_irq_disable(struct fsi_priv *fsi, int is_play) 447static void fsi_irq_disable(struct fsi_priv *fsi, int is_play)
@@ -457,13 +449,13 @@ static void fsi_irq_disable(struct fsi_priv *fsi, int is_play)
457 u32 data = AB_IO(1, fsi_get_port_shift(fsi, is_play)); 449 u32 data = AB_IO(1, fsi_get_port_shift(fsi, is_play));
458 struct fsi_master *master = fsi_get_master(fsi); 450 struct fsi_master *master = fsi_get_master(fsi);
459 451
460 fsi_master_mask_set(master, master->core->imsk, data, 0); 452 fsi_core_mask_set(master, imsk, data, 0);
461 fsi_master_mask_set(master, master->core->iemsk, data, 0); 453 fsi_core_mask_set(master, iemsk, data, 0);
462} 454}
463 455
464static u32 fsi_irq_get_status(struct fsi_master *master) 456static u32 fsi_irq_get_status(struct fsi_master *master)
465{ 457{
466 return fsi_master_read(master, master->core->int_st); 458 return fsi_core_read(master, int_st);
467} 459}
468 460
469static void fsi_irq_clear_status(struct fsi_priv *fsi) 461static void fsi_irq_clear_status(struct fsi_priv *fsi)
@@ -475,7 +467,7 @@ static void fsi_irq_clear_status(struct fsi_priv *fsi)
475 data |= AB_IO(1, fsi_get_port_shift(fsi, 1)); 467 data |= AB_IO(1, fsi_get_port_shift(fsi, 1));
476 468
477 /* clear interrupt factor */ 469 /* clear interrupt factor */
478 fsi_master_mask_set(master, master->core->int_st, data, 0); 470 fsi_core_mask_set(master, int_st, data, 0);
479} 471}
480 472
481/* 473/*
@@ -497,8 +489,8 @@ static void fsi_spdif_clk_ctrl(struct fsi_priv *fsi, int enable)
497 val = enable ? mask : 0; 489 val = enable ? mask : 0;
498 490
499 fsi_is_port_a(fsi) ? 491 fsi_is_port_a(fsi) ?
500 fsi_master_mask_set(master, master->core->a_mclk, mask, val) : 492 fsi_core_mask_set(master, a_mclk, mask, val) :
501 fsi_master_mask_set(master, master->core->b_mclk, mask, val); 493 fsi_core_mask_set(master, b_mclk, mask, val);
502} 494}
503 495
504/* 496/*