aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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/*