Lines Matching full:fsi
3 // Fifo-attached Serial Interface (FSI) support for SH7724
47 /* core register (depend on FSI version) */
152 * FSI driver use below type name for variable
177 * FSI FIFO image
189 * FSI clock
207 int fifo_sample_capa; /* sample capacity of FSI FIFO */
235 /* see [FSI clock] */
241 struct fsi_priv *fsi);
269 int (*init)(struct fsi_priv *fsi, struct fsi_stream *io);
270 int (*quit)(struct fsi_priv *fsi, struct fsi_stream *io);
271 int (*probe)(struct fsi_priv *fsi, struct fsi_stream *io, struct device *dev);
272 int (*transfer)(struct fsi_priv *fsi, struct fsi_stream *io);
273 int (*remove)(struct fsi_priv *fsi, struct fsi_stream *io);
274 int (*start_stop)(struct fsi_priv *fsi, struct fsi_stream *io,
300 static inline int fsi_stream_is_play(struct fsi_priv *fsi, in fsi_stream_is_play() argument
303 return &fsi->playback == io; in fsi_stream_is_play()
377 static struct fsi_master *fsi_get_master(struct fsi_priv *fsi) in fsi_get_master() argument
379 return fsi->master; in fsi_get_master()
382 static int fsi_is_clk_master(struct fsi_priv *fsi) in fsi_is_clk_master() argument
384 return fsi->clk_master; in fsi_is_clk_master()
387 static int fsi_is_port_a(struct fsi_priv *fsi) in fsi_is_port_a() argument
389 return fsi->master->base == fsi->base; in fsi_is_port_a()
392 static int fsi_is_spdif(struct fsi_priv *fsi) in fsi_is_spdif() argument
394 return fsi->spdif; in fsi_is_spdif()
397 static int fsi_is_enable_stream(struct fsi_priv *fsi) in fsi_is_enable_stream() argument
399 return fsi->enable_stream; in fsi_is_enable_stream()
429 static u32 fsi_get_port_shift(struct fsi_priv *fsi, struct fsi_stream *io) in fsi_get_port_shift() argument
431 int is_play = fsi_stream_is_play(fsi, io); in fsi_get_port_shift()
432 int is_porta = fsi_is_port_a(fsi); in fsi_get_port_shift()
443 static int fsi_frame2sample(struct fsi_priv *fsi, int frames) in fsi_frame2sample() argument
445 return frames * fsi->chan_num; in fsi_frame2sample()
448 static int fsi_sample2frame(struct fsi_priv *fsi, int samples) in fsi_sample2frame() argument
450 return samples / fsi->chan_num; in fsi_sample2frame()
453 static int fsi_get_current_fifo_samples(struct fsi_priv *fsi, in fsi_get_current_fifo_samples() argument
456 int is_play = fsi_stream_is_play(fsi, io); in fsi_get_current_fifo_samples()
461 fsi_reg_read(fsi, DOFF_ST) : in fsi_get_current_fifo_samples()
462 fsi_reg_read(fsi, DIFF_ST); in fsi_get_current_fifo_samples()
466 return fsi_frame2sample(fsi, frames); in fsi_get_current_fifo_samples()
469 static void fsi_count_fifo_err(struct fsi_priv *fsi) in fsi_count_fifo_err() argument
471 u32 ostatus = fsi_reg_read(fsi, DOFF_ST); in fsi_count_fifo_err()
472 u32 istatus = fsi_reg_read(fsi, DIFF_ST); in fsi_count_fifo_err()
475 fsi->playback.oerr_num++; in fsi_count_fifo_err()
478 fsi->playback.uerr_num++; in fsi_count_fifo_err()
481 fsi->capture.oerr_num++; in fsi_count_fifo_err()
484 fsi->capture.uerr_num++; in fsi_count_fifo_err()
486 fsi_reg_write(fsi, DOFF_ST, 0); in fsi_count_fifo_err()
487 fsi_reg_write(fsi, DIFF_ST, 0); in fsi_count_fifo_err()
493 static inline struct fsi_stream *fsi_stream_get(struct fsi_priv *fsi, in fsi_stream_get() argument
496 return fsi_is_play(substream) ? &fsi->playback : &fsi->capture; in fsi_stream_get()
499 static int fsi_stream_is_working(struct fsi_priv *fsi, in fsi_stream_is_working() argument
502 struct fsi_master *master = fsi_get_master(fsi); in fsi_stream_is_working()
518 static void fsi_stream_init(struct fsi_priv *fsi, in fsi_stream_init() argument
523 struct fsi_master *master = fsi_get_master(fsi); in fsi_stream_init()
528 io->buff_sample_capa = fsi_frame2sample(fsi, runtime->buffer_size); in fsi_stream_init()
530 io->period_samples = fsi_frame2sample(fsi, runtime->period_size); in fsi_stream_init()
536 fsi_stream_handler_call(io, init, fsi, io); in fsi_stream_init()
540 static void fsi_stream_quit(struct fsi_priv *fsi, struct fsi_stream *io) in fsi_stream_quit() argument
543 struct fsi_master *master = fsi_get_master(fsi); in fsi_stream_quit()
554 fsi_stream_handler_call(io, quit, fsi, io); in fsi_stream_quit()
569 struct fsi_priv *fsi = fsi_stream_to_priv(io); in fsi_stream_transfer() local
570 if (!fsi) in fsi_stream_transfer()
573 return fsi_stream_handler_call(io, transfer, fsi, io); in fsi_stream_transfer()
576 #define fsi_stream_start(fsi, io)\ argument
577 fsi_stream_handler_call(io, start_stop, fsi, io, 1)
579 #define fsi_stream_stop(fsi, io)\ argument
580 fsi_stream_handler_call(io, start_stop, fsi, io, 0)
582 static int fsi_stream_probe(struct fsi_priv *fsi, struct device *dev) in fsi_stream_probe() argument
587 io = &fsi->playback; in fsi_stream_probe()
588 ret1 = fsi_stream_handler_call(io, probe, fsi, io, dev); in fsi_stream_probe()
590 io = &fsi->capture; in fsi_stream_probe()
591 ret2 = fsi_stream_handler_call(io, probe, fsi, io, dev); in fsi_stream_probe()
601 static int fsi_stream_remove(struct fsi_priv *fsi) in fsi_stream_remove() argument
606 io = &fsi->playback; in fsi_stream_remove()
607 ret1 = fsi_stream_handler_call(io, remove, fsi, io); in fsi_stream_remove()
609 io = &fsi->capture; in fsi_stream_remove()
610 ret2 = fsi_stream_handler_call(io, remove, fsi, io); in fsi_stream_remove()
623 static void fsi_format_bus_setup(struct fsi_priv *fsi, struct fsi_stream *io, in fsi_format_bus_setup() argument
626 struct fsi_master *master = fsi_get_master(fsi); in fsi_format_bus_setup()
627 int is_play = fsi_stream_is_play(fsi, io); in fsi_format_bus_setup()
628 u32 fmt = fsi->fmt; in fsi_format_bus_setup()
656 fsi_reg_write(fsi, OUT_DMAC, dma); in fsi_format_bus_setup()
658 fsi_reg_write(fsi, IN_DMAC, dma); in fsi_format_bus_setup()
662 fsi_reg_write(fsi, DO_FMT, fmt); in fsi_format_bus_setup()
664 fsi_reg_write(fsi, DI_FMT, fmt); in fsi_format_bus_setup()
671 static void fsi_irq_enable(struct fsi_priv *fsi, struct fsi_stream *io) in fsi_irq_enable() argument
673 u32 data = AB_IO(1, fsi_get_port_shift(fsi, io)); in fsi_irq_enable()
674 struct fsi_master *master = fsi_get_master(fsi); in fsi_irq_enable()
680 static void fsi_irq_disable(struct fsi_priv *fsi, struct fsi_stream *io) in fsi_irq_disable() argument
682 u32 data = AB_IO(1, fsi_get_port_shift(fsi, io)); in fsi_irq_disable()
683 struct fsi_master *master = fsi_get_master(fsi); in fsi_irq_disable()
694 static void fsi_irq_clear_status(struct fsi_priv *fsi) in fsi_irq_clear_status() argument
697 struct fsi_master *master = fsi_get_master(fsi); in fsi_irq_clear_status()
699 data |= AB_IO(1, fsi_get_port_shift(fsi, &fsi->playback)); in fsi_irq_clear_status()
700 data |= AB_IO(1, fsi_get_port_shift(fsi, &fsi->capture)); in fsi_irq_clear_status()
711 static void fsi_spdif_clk_ctrl(struct fsi_priv *fsi, int enable) in fsi_spdif_clk_ctrl() argument
713 struct fsi_master *master = fsi_get_master(fsi); in fsi_spdif_clk_ctrl()
719 fsi_is_port_a(fsi) ? in fsi_spdif_clk_ctrl()
728 struct fsi_priv *fsi, in fsi_clk_init() argument
733 struct fsi_priv *fsi)) in fsi_clk_init()
735 struct fsi_clk *clock = &fsi->clock; in fsi_clk_init()
736 int is_porta = fsi_is_port_a(fsi); in fsi_clk_init()
775 /* FSI-DIV */ in fsi_clk_init()
791 #define fsi_clk_invalid(fsi) fsi_clk_valid(fsi, 0) argument
792 static void fsi_clk_valid(struct fsi_priv *fsi, unsigned long rate) in fsi_clk_valid() argument
794 fsi->clock.rate = rate; in fsi_clk_valid()
797 static int fsi_clk_is_valid(struct fsi_priv *fsi) in fsi_clk_is_valid() argument
799 return fsi->clock.set_rate && in fsi_clk_is_valid()
800 fsi->clock.rate; in fsi_clk_is_valid()
804 struct fsi_priv *fsi) in fsi_clk_enable() argument
806 struct fsi_clk *clock = &fsi->clock; in fsi_clk_enable()
809 if (!fsi_clk_is_valid(fsi)) in fsi_clk_enable()
813 ret = clock->set_rate(dev, fsi); in fsi_clk_enable()
815 fsi_clk_invalid(fsi); in fsi_clk_enable()
830 struct fsi_priv *fsi) in fsi_clk_disable() argument
832 struct fsi_clk *clock = &fsi->clock; in fsi_clk_disable()
834 if (!fsi_clk_is_valid(fsi)) in fsi_clk_disable()
847 struct fsi_priv *fsi, in fsi_clk_set_ackbpf() argument
907 fsi_reg_mask_set(fsi, CKG1, (ACKMD_MASK | BPFMD_MASK) , data); in fsi_clk_set_ackbpf()
914 struct fsi_priv *fsi) in fsi_clk_set_rate_external() argument
916 struct clk *xck = fsi->clock.xck; in fsi_clk_set_rate_external()
917 struct clk *ick = fsi->clock.ick; in fsi_clk_set_rate_external()
918 unsigned long rate = fsi->clock.rate; in fsi_clk_set_rate_external()
933 bpfmd = fsi->chan_num * 32; in fsi_clk_set_rate_external()
938 ret = fsi_clk_set_ackbpf(dev, fsi, ackmd, bpfmd); in fsi_clk_set_rate_external()
946 struct fsi_priv *fsi) in fsi_clk_set_rate_cpg() argument
948 struct clk *ick = fsi->clock.ick; in fsi_clk_set_rate_cpg()
949 struct clk *div = fsi->clock.div; in fsi_clk_set_rate_cpg()
950 unsigned long rate = fsi->clock.rate; in fsi_clk_set_rate_cpg()
968 bpfmd = fsi->chan_num * 32; in fsi_clk_set_rate_cpg()
970 ret = fsi_clk_set_ackbpf(dev, fsi, ackmd, bpfmd); in fsi_clk_set_rate_cpg()
979 * [CPG] = cout => [FSI_DIV] = audio => [FSI] => [codec] in fsi_clk_set_rate_cpg()
988 * actual = cout / adjustment (by FSI-DIV) ~= target in fsi_clk_set_rate_cpg()
1054 static void fsi_pio_push16(struct fsi_priv *fsi, u8 *_buf, int samples) in fsi_pio_push16() argument
1058 if (fsi_is_enable_stream(fsi)) { in fsi_pio_push16()
1067 fsi_reg_write(fsi, DODT, buf[i]); in fsi_pio_push16()
1073 fsi_reg_write(fsi, DODT, ((u32)*(buf + i) << 8)); in fsi_pio_push16()
1077 static void fsi_pio_pop16(struct fsi_priv *fsi, u8 *_buf, int samples) in fsi_pio_pop16() argument
1083 *(buf + i) = (u16)(fsi_reg_read(fsi, DIDT) >> 8); in fsi_pio_pop16()
1086 static void fsi_pio_push32(struct fsi_priv *fsi, u8 *_buf, int samples) in fsi_pio_push32() argument
1092 fsi_reg_write(fsi, DODT, *(buf + i)); in fsi_pio_push32()
1095 static void fsi_pio_pop32(struct fsi_priv *fsi, u8 *_buf, int samples) in fsi_pio_pop32() argument
1101 *(buf + i) = fsi_reg_read(fsi, DIDT); in fsi_pio_pop32()
1104 static u8 *fsi_pio_get_area(struct fsi_priv *fsi, struct fsi_stream *io) in fsi_pio_get_area() argument
1112 static int fsi_pio_transfer(struct fsi_priv *fsi, struct fsi_stream *io, in fsi_pio_transfer() argument
1113 void (*run16)(struct fsi_priv *fsi, u8 *buf, int samples), in fsi_pio_transfer() argument
1114 void (*run32)(struct fsi_priv *fsi, u8 *buf, int samples), in fsi_pio_transfer() argument
1119 if (!fsi_stream_is_working(fsi, io)) in fsi_pio_transfer()
1122 buf = fsi_pio_get_area(fsi, io); in fsi_pio_transfer()
1126 run16(fsi, buf, samples); in fsi_pio_transfer()
1129 run32(fsi, buf, samples); in fsi_pio_transfer()
1140 static int fsi_pio_pop(struct fsi_priv *fsi, struct fsi_stream *io) in fsi_pio_pop() argument
1142 int sample_residues; /* samples in FSI fifo */ in fsi_pio_pop()
1146 sample_residues = fsi_get_current_fifo_samples(fsi, io); in fsi_pio_pop()
1151 return fsi_pio_transfer(fsi, io, in fsi_pio_pop()
1157 static int fsi_pio_push(struct fsi_priv *fsi, struct fsi_stream *io) in fsi_pio_push() argument
1160 int sample_space; /* FSI fifo free samples space */ in fsi_pio_push()
1165 fsi_get_current_fifo_samples(fsi, io); in fsi_pio_push()
1169 return fsi_pio_transfer(fsi, io, in fsi_pio_push()
1175 static int fsi_pio_start_stop(struct fsi_priv *fsi, struct fsi_stream *io, in fsi_pio_start_stop() argument
1178 struct fsi_master *master = fsi_get_master(fsi); in fsi_pio_start_stop()
1179 u32 clk = fsi_is_port_a(fsi) ? CRA : CRB; in fsi_pio_start_stop()
1182 fsi_irq_enable(fsi, io); in fsi_pio_start_stop()
1184 fsi_irq_disable(fsi, io); in fsi_pio_start_stop()
1186 if (fsi_is_clk_master(fsi)) in fsi_pio_start_stop()
1192 static int fsi_pio_push_init(struct fsi_priv *fsi, struct fsi_stream *io) in fsi_pio_push_init() argument
1201 if (fsi_is_enable_stream(fsi)) in fsi_pio_push_init()
1210 static int fsi_pio_pop_init(struct fsi_priv *fsi, struct fsi_stream *io) in fsi_pio_pop_init() argument
1262 static int fsi_dma_init(struct fsi_priv *fsi, struct fsi_stream *io) in fsi_dma_init() argument
1277 struct fsi_priv *fsi = fsi_stream_to_priv(io); in fsi_dma_complete() local
1281 fsi_count_fifo_err(fsi); in fsi_dma_complete()
1284 static int fsi_dma_transfer(struct fsi_priv *fsi, struct fsi_stream *io) in fsi_dma_transfer() argument
1289 int is_play = fsi_stream_is_play(fsi, io); in fsi_dma_transfer()
1322 * In DMAEngine case, codec and FSI cannot be started simultaneously in fsi_dma_transfer()
1323 * since FSI is using the scheduler work queue. in fsi_dma_transfer()
1324 * Therefore, in capture case, probably FSI FIFO will have got in fsi_dma_transfer()
1329 if (ERR_OVER & fsi_reg_read(fsi, DIFF_ST)) { in fsi_dma_transfer()
1330 fsi_reg_mask_set(fsi, DIFF_CTL, FIFO_CLR, FIFO_CLR); in fsi_dma_transfer()
1331 fsi_reg_write(fsi, DIFF_ST, 0); in fsi_dma_transfer()
1341 static int fsi_dma_push_start_stop(struct fsi_priv *fsi, struct fsi_stream *io, in fsi_dma_push_start_stop() argument
1344 struct fsi_master *master = fsi_get_master(fsi); in fsi_dma_push_start_stop()
1345 u32 clk = fsi_is_port_a(fsi) ? CRA : CRB; in fsi_dma_push_start_stop()
1348 fsi_reg_mask_set(fsi, OUT_DMAC, DMA_ON, enable); in fsi_dma_push_start_stop()
1352 if (fsi_is_clk_master(fsi)) in fsi_dma_push_start_stop()
1358 static int fsi_dma_probe(struct fsi_priv *fsi, struct fsi_stream *io, struct device *dev) in fsi_dma_probe() argument
1360 int is_play = fsi_stream_is_play(fsi, io); in fsi_dma_probe()
1377 cfg.dst_addr = fsi->phys + REG_DODT; in fsi_dma_probe()
1381 cfg.src_addr = fsi->phys + REG_DIDT; in fsi_dma_probe()
1397 fsi->playback.handler = &fsi_pio_push_handler; in fsi_dma_probe()
1399 fsi->capture.handler = &fsi_pio_pop_handler; in fsi_dma_probe()
1404 return fsi_stream_probe(fsi, dev); in fsi_dma_probe()
1410 static int fsi_dma_remove(struct fsi_priv *fsi, struct fsi_stream *io) in fsi_dma_remove() argument
1412 fsi_stream_stop(fsi, io); in fsi_dma_remove()
1432 static void fsi_fifo_init(struct fsi_priv *fsi, in fsi_fifo_init() argument
1436 struct fsi_master *master = fsi_get_master(fsi); in fsi_fifo_init()
1437 int is_play = fsi_stream_is_play(fsi, io); in fsi_fifo_init()
1443 shift >>= fsi_get_port_shift(fsi, io); in fsi_fifo_init()
1467 for (i = 1; i < fsi->chan_num; i <<= 1) in fsi_fifo_init()
1470 fsi->chan_num, frame_capa); in fsi_fifo_init()
1472 io->fifo_sample_capa = fsi_frame2sample(fsi, frame_capa); in fsi_fifo_init()
1479 fsi_reg_write(fsi, DOFF_CTL, IRQ_HALF); in fsi_fifo_init()
1480 fsi_reg_mask_set(fsi, DOFF_CTL, FIFO_CLR, FIFO_CLR); in fsi_fifo_init()
1482 fsi_reg_write(fsi, DIFF_CTL, IRQ_HALF); in fsi_fifo_init()
1483 fsi_reg_mask_set(fsi, DIFF_CTL, FIFO_CLR, FIFO_CLR); in fsi_fifo_init()
1487 static int fsi_hw_startup(struct fsi_priv *fsi, in fsi_hw_startup() argument
1494 if (fsi_is_clk_master(fsi)) in fsi_hw_startup()
1497 fsi_reg_mask_set(fsi, CKG1, (DIMD | DOMD), data); in fsi_hw_startup()
1501 if (fsi->bit_clk_inv) in fsi_hw_startup()
1503 if (fsi->lr_clk_inv) in fsi_hw_startup()
1505 if (fsi_is_clk_master(fsi)) in fsi_hw_startup()
1507 fsi_reg_write(fsi, CKG2, data); in fsi_hw_startup()
1510 if (fsi_is_spdif(fsi)) { in fsi_hw_startup()
1511 fsi_spdif_clk_ctrl(fsi, 1); in fsi_hw_startup()
1512 fsi_reg_mask_set(fsi, OUT_SEL, DMMD, DMMD); in fsi_hw_startup()
1527 fsi_format_bus_setup(fsi, io, data, dev); in fsi_hw_startup()
1530 fsi_irq_disable(fsi, io); in fsi_hw_startup()
1531 fsi_irq_clear_status(fsi); in fsi_hw_startup()
1534 fsi_fifo_init(fsi, io, dev); in fsi_hw_startup()
1537 if (fsi_is_clk_master(fsi)) in fsi_hw_startup()
1538 return fsi_clk_enable(dev, fsi); in fsi_hw_startup()
1543 static int fsi_hw_shutdown(struct fsi_priv *fsi, in fsi_hw_shutdown() argument
1547 if (fsi_is_clk_master(fsi)) in fsi_hw_shutdown()
1548 return fsi_clk_disable(dev, fsi); in fsi_hw_shutdown()
1556 struct fsi_priv *fsi = fsi_get_priv(substream); in fsi_dai_startup() local
1558 fsi_clk_invalid(fsi); in fsi_dai_startup()
1566 struct fsi_priv *fsi = fsi_get_priv(substream); in fsi_dai_shutdown() local
1568 fsi_clk_invalid(fsi); in fsi_dai_shutdown()
1574 struct fsi_priv *fsi = fsi_get_priv(substream); in fsi_dai_trigger() local
1575 struct fsi_stream *io = fsi_stream_get(fsi, substream); in fsi_dai_trigger()
1580 fsi_stream_init(fsi, io, substream); in fsi_dai_trigger()
1582 ret = fsi_hw_startup(fsi, io, dai->dev); in fsi_dai_trigger()
1584 ret = fsi_stream_start(fsi, io); in fsi_dai_trigger()
1590 ret = fsi_hw_shutdown(fsi, dai->dev); in fsi_dai_trigger()
1591 fsi_stream_stop(fsi, io); in fsi_dai_trigger()
1592 fsi_stream_quit(fsi, io); in fsi_dai_trigger()
1599 static int fsi_set_fmt_dai(struct fsi_priv *fsi, unsigned int fmt) in fsi_set_fmt_dai() argument
1603 fsi->fmt = CR_I2S; in fsi_set_fmt_dai()
1604 fsi->chan_num = 2; in fsi_set_fmt_dai()
1607 fsi->fmt = CR_PCM; in fsi_set_fmt_dai()
1608 fsi->chan_num = 2; in fsi_set_fmt_dai()
1617 static int fsi_set_fmt_spdif(struct fsi_priv *fsi) in fsi_set_fmt_spdif() argument
1619 struct fsi_master *master = fsi_get_master(fsi); in fsi_set_fmt_spdif()
1624 fsi->fmt = CR_DTMD_SPDIF_PCM | CR_PCM; in fsi_set_fmt_spdif()
1625 fsi->chan_num = 2; in fsi_set_fmt_spdif()
1632 struct fsi_priv *fsi = fsi_get_priv_frm_dai(dai); in fsi_dai_set_fmt() local
1640 fsi->clk_master = 1; /* cpu is master */ in fsi_dai_set_fmt()
1649 fsi->bit_clk_inv = 0; in fsi_dai_set_fmt()
1650 fsi->lr_clk_inv = 1; in fsi_dai_set_fmt()
1653 fsi->bit_clk_inv = 1; in fsi_dai_set_fmt()
1654 fsi->lr_clk_inv = 0; in fsi_dai_set_fmt()
1657 fsi->bit_clk_inv = 1; in fsi_dai_set_fmt()
1658 fsi->lr_clk_inv = 1; in fsi_dai_set_fmt()
1662 fsi->bit_clk_inv = 0; in fsi_dai_set_fmt()
1663 fsi->lr_clk_inv = 0; in fsi_dai_set_fmt()
1667 if (fsi_is_clk_master(fsi)) { in fsi_dai_set_fmt()
1668 if (fsi->clk_cpg) in fsi_dai_set_fmt()
1669 fsi_clk_init(dai->dev, fsi, 0, 1, 1, in fsi_dai_set_fmt()
1672 fsi_clk_init(dai->dev, fsi, 1, 1, 0, in fsi_dai_set_fmt()
1677 if (fsi_is_spdif(fsi)) in fsi_dai_set_fmt()
1678 ret = fsi_set_fmt_spdif(fsi); in fsi_dai_set_fmt()
1680 ret = fsi_set_fmt_dai(fsi, fmt & SND_SOC_DAIFMT_FORMAT_MASK); in fsi_dai_set_fmt()
1689 struct fsi_priv *fsi = fsi_get_priv(substream); in fsi_dai_hw_params() local
1691 if (fsi_is_clk_master(fsi)) in fsi_dai_hw_params()
1692 fsi_clk_valid(fsi, params_rate(params)); in fsi_dai_hw_params()
1738 struct fsi_priv *fsi = fsi_get_priv(substream); in fsi_pointer() local
1739 struct fsi_stream *io = fsi_stream_get(fsi, substream); in fsi_pointer()
1741 return fsi_sample2frame(fsi, io->buff_sample_pos); in fsi_pointer()
1802 .name = "fsi",
1838 static void fsi_port_info_init(struct fsi_priv *fsi, in fsi_port_info_init() argument
1842 fsi->spdif = 1; in fsi_port_info_init()
1845 fsi->clk_cpg = 1; in fsi_port_info_init()
1848 fsi->enable_stream = 1; in fsi_port_info_init()
1851 static void fsi_handler_init(struct fsi_priv *fsi, in fsi_handler_init() argument
1854 fsi->playback.handler = &fsi_pio_push_handler; /* default PIO */ in fsi_handler_init()
1855 fsi->playback.priv = fsi; in fsi_handler_init()
1856 fsi->capture.handler = &fsi_pio_pop_handler; /* default PIO */ in fsi_handler_init()
1857 fsi->capture.priv = fsi; in fsi_handler_init()
1860 fsi->playback.dma_id = info->tx_id; in fsi_handler_init()
1861 fsi->playback.handler = &fsi_dma_push_handler; in fsi_handler_init()
1904 struct fsi_priv *fsi; in fsi_probe() local
1926 dev_err(&pdev->dev, "unknown fsi device\n"); in fsi_probe()
1933 dev_err(&pdev->dev, "Not enough FSI platform resources.\n"); in fsi_probe()
1943 dev_err(&pdev->dev, "Unable to ioremap FSI registers.\n"); in fsi_probe()
1951 /* FSI A setting */ in fsi_probe()
1952 fsi = &master->fsia; in fsi_probe()
1953 fsi->base = master->base; in fsi_probe()
1954 fsi->phys = res->start; in fsi_probe()
1955 fsi->master = master; in fsi_probe()
1956 fsi_port_info_init(fsi, &info.port_a); in fsi_probe()
1957 fsi_handler_init(fsi, &info.port_a); in fsi_probe()
1958 ret = fsi_stream_probe(fsi, &pdev->dev); in fsi_probe()
1964 /* FSI B setting */ in fsi_probe()
1965 fsi = &master->fsib; in fsi_probe()
1966 fsi->base = master->base + 0x40; in fsi_probe()
1967 fsi->phys = res->start + 0x40; in fsi_probe()
1968 fsi->master = master; in fsi_probe()
1969 fsi_port_info_init(fsi, &info.port_b); in fsi_probe()
1970 fsi_handler_init(fsi, &info.port_b); in fsi_probe()
1971 ret = fsi_stream_probe(fsi, &pdev->dev); in fsi_probe()
2019 static void __fsi_suspend(struct fsi_priv *fsi, in __fsi_suspend() argument
2023 if (!fsi_stream_is_working(fsi, io)) in __fsi_suspend()
2026 fsi_stream_stop(fsi, io); in __fsi_suspend()
2027 fsi_hw_shutdown(fsi, dev); in __fsi_suspend()
2030 static void __fsi_resume(struct fsi_priv *fsi, in __fsi_resume() argument
2034 if (!fsi_stream_is_working(fsi, io)) in __fsi_resume()
2037 fsi_hw_startup(fsi, io, dev); in __fsi_resume()
2038 fsi_stream_start(fsi, io); in __fsi_resume()
2078 .name = "fsi-pcm-audio",
2090 MODULE_DESCRIPTION("SuperH onchip FSI audio driver");
2092 MODULE_ALIAS("platform:fsi-pcm-audio");