2 * Renesas R-Car SSIU/SSI support
4 * Copyright (C) 2013 Renesas Solutions Corp.
5 * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
8 * Kuninori Morimoto <morimoto.kuninori@renesas.com>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
14 #include <linux/delay.h>
16 #define RSND_SSI_NAME_SIZE 16
21 #define FORCE (1 << 31) /* Fixed */
22 #define UIEN (1 << 27) /* Underflow Interrupt Enable */
23 #define OIEN (1 << 26) /* Overflow Interrupt Enable */
24 #define IIEN (1 << 25) /* Idle Mode Interrupt Enable */
25 #define DIEN (1 << 24) /* Data Interrupt Enable */
27 #define DWL_8 (0 << 19) /* Data Word Length */
28 #define DWL_16 (1 << 19) /* Data Word Length */
29 #define DWL_18 (2 << 19) /* Data Word Length */
30 #define DWL_20 (3 << 19) /* Data Word Length */
31 #define DWL_22 (4 << 19) /* Data Word Length */
32 #define DWL_24 (5 << 19) /* Data Word Length */
33 #define DWL_32 (6 << 19) /* Data Word Length */
35 #define SWL_32 (3 << 16) /* R/W System Word Length */
36 #define SCKD (1 << 15) /* Serial Bit Clock Direction */
37 #define SWSD (1 << 14) /* Serial WS Direction */
38 #define SCKP (1 << 13) /* Serial Bit Clock Polarity */
39 #define SWSP (1 << 12) /* Serial WS Polarity */
40 #define SDTA (1 << 10) /* Serial Data Alignment */
41 #define DEL (1 << 8) /* Serial Data Delay */
42 #define CKDV(v) (v << 4) /* Serial Clock Division Ratio */
43 #define TRMD (1 << 1) /* Transmit/Receive Mode Select */
44 #define EN (1 << 0) /* SSI Module Enable */
49 #define UIRQ (1 << 27) /* Underflow Error Interrupt Status */
50 #define OIRQ (1 << 26) /* Overflow Error Interrupt Status */
51 #define IIRQ (1 << 25) /* Idle Mode Interrupt Status */
52 #define DIRQ (1 << 24) /* Data Interrupt Status Flag */
56 struct rsnd_ssi_platform_info
*info
; /* rcar_snd.h */
57 struct rsnd_ssi
*parent
;
60 struct rsnd_dai
*rdai
;
61 struct rsnd_dai_stream
*io
;
78 #define for_each_rsnd_ssi(pos, priv, i) \
80 (i < rsnd_ssi_nr(priv)) && \
81 ((pos) = ((struct rsnd_ssiu *)((priv)->ssiu))->ssi + i); \
84 #define rsnd_ssi_nr(priv) (((struct rsnd_ssiu *)((priv)->ssiu))->ssi_nr)
85 #define rsnd_mod_to_ssi(_mod) container_of((_mod), struct rsnd_ssi, mod)
86 #define rsnd_ssi_is_pio(ssi) ((ssi)->info->pio_irq > 0)
87 #define rsnd_ssi_clk_from_parent(ssi) ((ssi)->parent)
88 #define rsnd_rdai_is_clk_master(rdai) ((rdai)->clk_master)
89 #define rsnd_ssi_mode_flags(p) ((p)->info->flags)
90 #define rsnd_ssi_dai_id(ssi) ((ssi)->info->dai_id)
91 #define rsnd_ssi_to_ssiu(ssi)\
92 (((struct rsnd_ssiu *)((ssi) - rsnd_mod_id(&(ssi)->mod))) - 1)
94 static void rsnd_ssi_mode_init(struct rsnd_priv
*priv
,
95 struct rsnd_ssiu
*ssiu
)
106 for_each_rsnd_ssi(ssi
, priv
, i
)
107 ssiu
->ssi_mode0
|= (1 << i
);
112 #define ssi_parent_set(p, sync, adg, ext) \
114 ssi->parent = ssiu->ssi + p; \
115 if (flags & RSND_SSI_CLK_FROM_ADG) \
119 if (flags & RSND_SSI_SYNC) \
124 for_each_rsnd_ssi(ssi
, priv
, i
) {
125 flags
= rsnd_ssi_mode_flags(ssi
);
127 if (!(flags
& RSND_SSI_CLK_PIN_SHARE
))
133 ssi_parent_set(0, (1 << 4), (0x2 << 0), (0x1 << 0));
136 ssi_parent_set(0, (1 << 4), (0x2 << 2), (0x1 << 2));
139 ssi_parent_set(3, (1 << 20), (0x2 << 16), (0x1 << 16));
142 ssi_parent_set(7, 0, 0, 0);
146 ssiu
->ssi_mode1
|= val
;
150 static void rsnd_ssi_mode_set(struct rsnd_ssi
*ssi
)
152 struct rsnd_ssiu
*ssiu
= rsnd_ssi_to_ssiu(ssi
);
154 rsnd_mod_write(&ssi
->mod
, SSI_MODE0
, ssiu
->ssi_mode0
);
155 rsnd_mod_write(&ssi
->mod
, SSI_MODE1
, ssiu
->ssi_mode1
);
158 static void rsnd_ssi_status_check(struct rsnd_mod
*mod
,
161 struct rsnd_priv
*priv
= rsnd_mod_to_priv(mod
);
162 struct device
*dev
= rsnd_priv_to_dev(priv
);
166 for (i
= 0; i
< 1024; i
++) {
167 status
= rsnd_mod_read(mod
, SSISR
);
174 dev_warn(dev
, "status check failed\n");
177 static int rsnd_ssi_master_clk_start(struct rsnd_ssi
*ssi
,
180 struct rsnd_priv
*priv
= rsnd_mod_to_priv(&ssi
->mod
);
181 struct device
*dev
= rsnd_priv_to_dev(priv
);
183 int adg_clk_div_table
[] = {
184 1, 6, /* see adg.c */
186 int ssi_clk_mul_table
[] = {
187 1, 2, 4, 8, 16, 6, 12,
189 unsigned int main_rate
;
192 * Find best clock, and try to start ADG
194 for (i
= 0; i
< ARRAY_SIZE(adg_clk_div_table
); i
++) {
195 for (j
= 0; j
< ARRAY_SIZE(ssi_clk_mul_table
); j
++) {
198 * this driver is assuming that
199 * system word is 64fs (= 2 x 32bit)
200 * see rsnd_ssi_start()
202 main_rate
= rate
/ adg_clk_div_table
[i
]
203 * 32 * 2 * ssi_clk_mul_table
[j
];
205 ret
= rsnd_adg_ssi_clk_try_start(&ssi
->mod
, main_rate
);
208 ssi
->cr_clk
= FORCE
| SWL_32
|
209 SCKD
| SWSD
| CKDV(j
);
211 dev_dbg(dev
, "ssi%d outputs %u Hz\n",
212 rsnd_mod_id(&ssi
->mod
), rate
);
219 dev_err(dev
, "unsupported clock rate\n");
223 static void rsnd_ssi_master_clk_stop(struct rsnd_ssi
*ssi
)
227 rsnd_adg_ssi_clk_stop(&ssi
->mod
);
230 static void rsnd_ssi_hw_start(struct rsnd_ssi
*ssi
,
231 struct rsnd_dai
*rdai
,
232 struct rsnd_dai_stream
*io
)
234 struct rsnd_priv
*priv
= rsnd_mod_to_priv(&ssi
->mod
);
235 struct device
*dev
= rsnd_priv_to_dev(priv
);
238 if (0 == ssi
->usrcnt
) {
239 clk_enable(ssi
->clk
);
241 if (rsnd_rdai_is_clk_master(rdai
)) {
242 struct snd_pcm_runtime
*runtime
;
244 runtime
= rsnd_io_to_runtime(io
);
246 if (rsnd_ssi_clk_from_parent(ssi
))
247 rsnd_ssi_hw_start(ssi
->parent
, rdai
, io
);
249 rsnd_ssi_master_clk_start(ssi
, runtime
->rate
);
258 rsnd_mod_write(&ssi
->mod
, SSICR
, cr
);
262 dev_dbg(dev
, "ssi%d hw started\n", rsnd_mod_id(&ssi
->mod
));
265 static void rsnd_ssi_hw_stop(struct rsnd_ssi
*ssi
,
266 struct rsnd_dai
*rdai
)
268 struct rsnd_priv
*priv
= rsnd_mod_to_priv(&ssi
->mod
);
269 struct device
*dev
= rsnd_priv_to_dev(priv
);
272 if (0 == ssi
->usrcnt
) /* stop might be called without start */
277 if (0 == ssi
->usrcnt
) {
280 * and, wait all data was sent
285 rsnd_mod_write(&ssi
->mod
, SSICR
, cr
| EN
);
286 rsnd_ssi_status_check(&ssi
->mod
, DIRQ
);
290 * and, wait idle state
292 rsnd_mod_write(&ssi
->mod
, SSICR
, cr
); /* disabled all */
293 rsnd_ssi_status_check(&ssi
->mod
, IIRQ
);
295 if (rsnd_rdai_is_clk_master(rdai
)) {
296 if (rsnd_ssi_clk_from_parent(ssi
))
297 rsnd_ssi_hw_stop(ssi
->parent
, rdai
);
299 rsnd_ssi_master_clk_stop(ssi
);
302 clk_disable(ssi
->clk
);
305 dev_dbg(dev
, "ssi%d hw stopped\n", rsnd_mod_id(&ssi
->mod
));
309 * SSI mod common functions
311 static int rsnd_ssi_init(struct rsnd_mod
*mod
,
312 struct rsnd_dai
*rdai
,
313 struct rsnd_dai_stream
*io
)
315 struct rsnd_ssi
*ssi
= rsnd_mod_to_ssi(mod
);
316 struct rsnd_priv
*priv
= rsnd_mod_to_priv(mod
);
317 struct device
*dev
= rsnd_priv_to_dev(priv
);
318 struct snd_pcm_runtime
*runtime
= rsnd_io_to_runtime(io
);
324 * always use 32bit system word for easy clock calculation.
325 * see also rsnd_ssi_master_clk_enable()
330 * init clock settings for SSICR
332 switch (runtime
->sample_bits
) {
343 if (rdai
->bit_clk_inv
)
345 if (rdai
->frm_clk_inv
)
347 if (rdai
->data_alignment
)
351 if (rsnd_dai_is_play(rdai
, io
))
360 ssi
->err
= -1; /* ignore 1st error */
362 rsnd_ssi_mode_set(ssi
);
364 dev_dbg(dev
, "%s.%d init\n", rsnd_mod_name(mod
), rsnd_mod_id(mod
));
369 static int rsnd_ssi_quit(struct rsnd_mod
*mod
,
370 struct rsnd_dai
*rdai
,
371 struct rsnd_dai_stream
*io
)
373 struct rsnd_ssi
*ssi
= rsnd_mod_to_ssi(mod
);
374 struct rsnd_priv
*priv
= rsnd_mod_to_priv(mod
);
375 struct device
*dev
= rsnd_priv_to_dev(priv
);
377 dev_dbg(dev
, "%s.%d quit\n", rsnd_mod_name(mod
), rsnd_mod_id(mod
));
380 dev_warn(dev
, "ssi under/over flow err = %d\n", ssi
->err
);
390 static void rsnd_ssi_record_error(struct rsnd_ssi
*ssi
, u32 status
)
392 /* under/over flow error */
393 if (status
& (UIRQ
| OIRQ
)) {
396 /* clear error status */
397 rsnd_mod_write(&ssi
->mod
, SSISR
, 0);
404 static irqreturn_t
rsnd_ssi_pio_interrupt(int irq
, void *data
)
406 struct rsnd_ssi
*ssi
= data
;
407 struct rsnd_dai_stream
*io
= ssi
->io
;
408 u32 status
= rsnd_mod_read(&ssi
->mod
, SSISR
);
409 irqreturn_t ret
= IRQ_NONE
;
411 if (io
&& (status
& DIRQ
)) {
412 struct rsnd_dai
*rdai
= ssi
->rdai
;
413 struct snd_pcm_runtime
*runtime
= rsnd_io_to_runtime(io
);
414 u32
*buf
= (u32
*)(runtime
->dma_area
+
415 rsnd_dai_pointer_offset(io
, 0));
417 rsnd_ssi_record_error(ssi
, status
);
420 * 8/16/32 data can be assesse to TDR/RDR register
421 * directly as 32bit data
422 * see rsnd_ssi_init()
424 if (rsnd_dai_is_play(rdai
, io
))
425 rsnd_mod_write(&ssi
->mod
, SSITDR
, *buf
);
427 *buf
= rsnd_mod_read(&ssi
->mod
, SSIRDR
);
429 rsnd_dai_pointer_update(io
, sizeof(*buf
));
437 static int rsnd_ssi_pio_start(struct rsnd_mod
*mod
,
438 struct rsnd_dai
*rdai
,
439 struct rsnd_dai_stream
*io
)
441 struct rsnd_priv
*priv
= rsnd_mod_to_priv(mod
);
442 struct rsnd_ssi
*ssi
= rsnd_mod_to_ssi(mod
);
443 struct device
*dev
= rsnd_priv_to_dev(priv
);
446 ssi
->cr_etc
= UIEN
| OIEN
| DIEN
;
448 rsnd_ssi_hw_start(ssi
, rdai
, io
);
450 dev_dbg(dev
, "%s.%d start\n", rsnd_mod_name(mod
), rsnd_mod_id(mod
));
455 static int rsnd_ssi_pio_stop(struct rsnd_mod
*mod
,
456 struct rsnd_dai
*rdai
,
457 struct rsnd_dai_stream
*io
)
459 struct rsnd_priv
*priv
= rsnd_mod_to_priv(mod
);
460 struct device
*dev
= rsnd_priv_to_dev(priv
);
461 struct rsnd_ssi
*ssi
= rsnd_mod_to_ssi(mod
);
463 dev_dbg(dev
, "%s.%d stop\n", rsnd_mod_name(mod
), rsnd_mod_id(mod
));
467 rsnd_ssi_hw_stop(ssi
, rdai
);
472 static struct rsnd_mod_ops rsnd_ssi_pio_ops
= {
474 .init
= rsnd_ssi_init
,
475 .quit
= rsnd_ssi_quit
,
476 .start
= rsnd_ssi_pio_start
,
477 .stop
= rsnd_ssi_pio_stop
,
483 static int rsnd_ssi_non(struct rsnd_mod
*mod
,
484 struct rsnd_dai
*rdai
,
485 struct rsnd_dai_stream
*io
)
487 struct rsnd_priv
*priv
= rsnd_mod_to_priv(mod
);
488 struct device
*dev
= rsnd_priv_to_dev(priv
);
490 dev_dbg(dev
, "%s\n", __func__
);
495 static struct rsnd_mod_ops rsnd_ssi_non_ops
= {
497 .init
= rsnd_ssi_non
,
498 .quit
= rsnd_ssi_non
,
499 .start
= rsnd_ssi_non
,
500 .stop
= rsnd_ssi_non
,
506 struct rsnd_mod
*rsnd_ssi_mod_get_frm_dai(struct rsnd_priv
*priv
,
507 int dai_id
, int is_play
)
509 struct rsnd_ssi
*ssi
;
514 for_each_rsnd_ssi(ssi
, priv
, i
) {
515 if (rsnd_ssi_dai_id(ssi
) != dai_id
)
518 has_play
= !!(rsnd_ssi_mode_flags(ssi
) & RSND_SSI_PLAY
);
520 if (is_play
== has_play
)
527 struct rsnd_mod
*rsnd_ssi_mod_get(struct rsnd_priv
*priv
, int id
)
529 BUG_ON(id
< 0 || id
>= rsnd_ssi_nr(priv
));
531 return &(((struct rsnd_ssiu
*)(priv
->ssiu
))->ssi
+ id
)->mod
;
534 int rsnd_ssi_probe(struct platform_device
*pdev
,
535 struct rcar_snd_info
*info
,
536 struct rsnd_priv
*priv
)
538 struct rsnd_ssi_platform_info
*pinfo
;
539 struct device
*dev
= rsnd_priv_to_dev(priv
);
540 struct rsnd_mod_ops
*ops
;
542 struct rsnd_ssiu
*ssiu
;
543 struct rsnd_ssi
*ssi
;
544 char name
[RSND_SSI_NAME_SIZE
];
550 nr
= info
->ssi_info_nr
;
551 ssiu
= devm_kzalloc(dev
, sizeof(*ssiu
) + (sizeof(*ssi
) * nr
),
554 dev_err(dev
, "SSI allocate failed\n");
559 ssiu
->ssi
= (struct rsnd_ssi
*)(ssiu
+ 1);
562 for_each_rsnd_ssi(ssi
, priv
, i
) {
563 pinfo
= &info
->ssi_info
[i
];
565 snprintf(name
, RSND_SSI_NAME_SIZE
, "ssi.%d", i
);
567 clk
= clk_get(dev
, name
);
574 ops
= &rsnd_ssi_non_ops
;
579 if (rsnd_ssi_is_pio(ssi
)) {
580 ret
= devm_request_irq(dev
, pinfo
->pio_irq
,
581 &rsnd_ssi_pio_interrupt
,
585 dev_err(dev
, "SSI request interrupt failed\n");
589 ops
= &rsnd_ssi_pio_ops
;
592 rsnd_mod_init(priv
, &ssi
->mod
, ops
, i
);
595 rsnd_ssi_mode_init(priv
, ssiu
);
597 dev_dbg(dev
, "ssi probed\n");
602 void rsnd_ssi_remove(struct platform_device
*pdev
,
603 struct rsnd_priv
*priv
)
605 struct rsnd_ssi
*ssi
;
608 for_each_rsnd_ssi(ssi
, priv
, i
)