diff options
-rw-r--r-- | sound/soc/sh/fsi.c | 48 |
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 | ||
203 | static 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) | ||
205 | static 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 | ||
221 | static 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) | ||
219 | static 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 | ||
455 | static void fsi_irq_disable(struct fsi_priv *fsi, int is_play) | 447 | static 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 | ||
464 | static u32 fsi_irq_get_status(struct fsi_master *master) | 456 | static 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 | ||
469 | static void fsi_irq_clear_status(struct fsi_priv *fsi) | 461 | static 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 | /* |