Lines Matching refs:fsi

240 			struct fsi_priv *fsi);
268 int (*init)(struct fsi_priv *fsi, struct fsi_stream *io);
269 int (*quit)(struct fsi_priv *fsi, struct fsi_stream *io);
270 int (*probe)(struct fsi_priv *fsi, struct fsi_stream *io, struct device *dev);
271 int (*transfer)(struct fsi_priv *fsi, struct fsi_stream *io);
272 int (*remove)(struct fsi_priv *fsi, struct fsi_stream *io);
273 int (*start_stop)(struct fsi_priv *fsi, struct fsi_stream *io,
299 static inline int fsi_stream_is_play(struct fsi_priv *fsi,
302 return &fsi->playback == io;
376 static struct fsi_master *fsi_get_master(struct fsi_priv *fsi)
378 return fsi->master;
381 static int fsi_is_clk_master(struct fsi_priv *fsi)
383 return fsi->clk_master;
386 static int fsi_is_port_a(struct fsi_priv *fsi)
388 return fsi->master->base == fsi->base;
391 static int fsi_is_spdif(struct fsi_priv *fsi)
393 return fsi->spdif;
396 static int fsi_is_enable_stream(struct fsi_priv *fsi)
398 return fsi->enable_stream;
428 static u32 fsi_get_port_shift(struct fsi_priv *fsi, struct fsi_stream *io)
430 int is_play = fsi_stream_is_play(fsi, io);
431 int is_porta = fsi_is_port_a(fsi);
442 static int fsi_frame2sample(struct fsi_priv *fsi, int frames)
444 return frames * fsi->chan_num;
447 static int fsi_sample2frame(struct fsi_priv *fsi, int samples)
449 return samples / fsi->chan_num;
452 static int fsi_get_current_fifo_samples(struct fsi_priv *fsi,
455 int is_play = fsi_stream_is_play(fsi, io);
460 fsi_reg_read(fsi, DOFF_ST) :
461 fsi_reg_read(fsi, DIFF_ST);
465 return fsi_frame2sample(fsi, frames);
468 static void fsi_count_fifo_err(struct fsi_priv *fsi)
470 u32 ostatus = fsi_reg_read(fsi, DOFF_ST);
471 u32 istatus = fsi_reg_read(fsi, DIFF_ST);
474 fsi->playback.oerr_num++;
477 fsi->playback.uerr_num++;
480 fsi->capture.oerr_num++;
483 fsi->capture.uerr_num++;
485 fsi_reg_write(fsi, DOFF_ST, 0);
486 fsi_reg_write(fsi, DIFF_ST, 0);
492 static inline struct fsi_stream *fsi_stream_get(struct fsi_priv *fsi,
495 return fsi_is_play(substream) ? &fsi->playback : &fsi->capture;
498 static int fsi_stream_is_working(struct fsi_priv *fsi,
501 struct fsi_master *master = fsi_get_master(fsi);
517 static void fsi_stream_init(struct fsi_priv *fsi,
522 struct fsi_master *master = fsi_get_master(fsi);
527 io->buff_sample_capa = fsi_frame2sample(fsi, runtime->buffer_size);
529 io->period_samples = fsi_frame2sample(fsi, runtime->period_size);
535 fsi_stream_handler_call(io, init, fsi, io);
539 static void fsi_stream_quit(struct fsi_priv *fsi, struct fsi_stream *io)
542 struct fsi_master *master = fsi_get_master(fsi);
553 fsi_stream_handler_call(io, quit, fsi, io);
568 struct fsi_priv *fsi = fsi_stream_to_priv(io);
569 if (!fsi)
572 return fsi_stream_handler_call(io, transfer, fsi, io);
575 #define fsi_stream_start(fsi, io)\
576 fsi_stream_handler_call(io, start_stop, fsi, io, 1)
578 #define fsi_stream_stop(fsi, io)\
579 fsi_stream_handler_call(io, start_stop, fsi, io, 0)
581 static int fsi_stream_probe(struct fsi_priv *fsi, struct device *dev)
586 io = &fsi->playback;
587 ret1 = fsi_stream_handler_call(io, probe, fsi, io, dev);
589 io = &fsi->capture;
590 ret2 = fsi_stream_handler_call(io, probe, fsi, io, dev);
600 static int fsi_stream_remove(struct fsi_priv *fsi)
605 io = &fsi->playback;
606 ret1 = fsi_stream_handler_call(io, remove, fsi, io);
608 io = &fsi->capture;
609 ret2 = fsi_stream_handler_call(io, remove, fsi, io);
622 static void fsi_format_bus_setup(struct fsi_priv *fsi, struct fsi_stream *io,
625 struct fsi_master *master = fsi_get_master(fsi);
626 int is_play = fsi_stream_is_play(fsi, io);
627 u32 fmt = fsi->fmt;
655 fsi_reg_write(fsi, OUT_DMAC, dma);
657 fsi_reg_write(fsi, IN_DMAC, dma);
661 fsi_reg_write(fsi, DO_FMT, fmt);
663 fsi_reg_write(fsi, DI_FMT, fmt);
670 static void fsi_irq_enable(struct fsi_priv *fsi, struct fsi_stream *io)
672 u32 data = AB_IO(1, fsi_get_port_shift(fsi, io));
673 struct fsi_master *master = fsi_get_master(fsi);
679 static void fsi_irq_disable(struct fsi_priv *fsi, struct fsi_stream *io)
681 u32 data = AB_IO(1, fsi_get_port_shift(fsi, io));
682 struct fsi_master *master = fsi_get_master(fsi);
693 static void fsi_irq_clear_status(struct fsi_priv *fsi)
696 struct fsi_master *master = fsi_get_master(fsi);
698 data |= AB_IO(1, fsi_get_port_shift(fsi, &fsi->playback));
699 data |= AB_IO(1, fsi_get_port_shift(fsi, &fsi->capture));
710 static void fsi_spdif_clk_ctrl(struct fsi_priv *fsi, int enable)
712 struct fsi_master *master = fsi_get_master(fsi);
718 fsi_is_port_a(fsi) ?
727 struct fsi_priv *fsi,
732 struct fsi_priv *fsi))
734 struct fsi_clk *clock = &fsi->clock;
735 int is_porta = fsi_is_port_a(fsi);
790 #define fsi_clk_invalid(fsi) fsi_clk_valid(fsi, 0)
791 static void fsi_clk_valid(struct fsi_priv *fsi, unsigned long rate)
793 fsi->clock.rate = rate;
796 static int fsi_clk_is_valid(struct fsi_priv *fsi)
798 return fsi->clock.set_rate &&
799 fsi->clock.rate;
803 struct fsi_priv *fsi)
805 struct fsi_clk *clock = &fsi->clock;
808 if (!fsi_clk_is_valid(fsi))
812 ret = clock->set_rate(dev, fsi);
814 fsi_clk_invalid(fsi);
842 struct fsi_priv *fsi)
844 struct fsi_clk *clock = &fsi->clock;
846 if (!fsi_clk_is_valid(fsi))
859 struct fsi_priv *fsi,
919 fsi_reg_mask_set(fsi, CKG1, (ACKMD_MASK | BPFMD_MASK) , data);
926 struct fsi_priv *fsi)
928 struct clk *xck = fsi->clock.xck;
929 struct clk *ick = fsi->clock.ick;
930 unsigned long rate = fsi->clock.rate;
945 bpfmd = fsi->chan_num * 32;
950 ret = fsi_clk_set_ackbpf(dev, fsi, ackmd, bpfmd);
958 struct fsi_priv *fsi)
960 struct clk *ick = fsi->clock.ick;
961 struct clk *div = fsi->clock.div;
962 unsigned long rate = fsi->clock.rate;
980 bpfmd = fsi->chan_num * 32;
982 ret = fsi_clk_set_ackbpf(dev, fsi, ackmd, bpfmd);
1066 static void fsi_pio_push16(struct fsi_priv *fsi, u8 *_buf, int samples)
1070 if (fsi_is_enable_stream(fsi)) {
1079 fsi_reg_write(fsi, DODT, buf[i]);
1085 fsi_reg_write(fsi, DODT, ((u32)*(buf + i) << 8));
1089 static void fsi_pio_pop16(struct fsi_priv *fsi, u8 *_buf, int samples)
1095 *(buf + i) = (u16)(fsi_reg_read(fsi, DIDT) >> 8);
1098 static void fsi_pio_push32(struct fsi_priv *fsi, u8 *_buf, int samples)
1104 fsi_reg_write(fsi, DODT, *(buf + i));
1107 static void fsi_pio_pop32(struct fsi_priv *fsi, u8 *_buf, int samples)
1113 *(buf + i) = fsi_reg_read(fsi, DIDT);
1116 static u8 *fsi_pio_get_area(struct fsi_priv *fsi, struct fsi_stream *io)
1124 static int fsi_pio_transfer(struct fsi_priv *fsi, struct fsi_stream *io,
1125 void (*run16)(struct fsi_priv *fsi, u8 *buf, int samples),
1126 void (*run32)(struct fsi_priv *fsi, u8 *buf, int samples),
1131 if (!fsi_stream_is_working(fsi, io))
1134 buf = fsi_pio_get_area(fsi, io);
1138 run16(fsi, buf, samples);
1141 run32(fsi, buf, samples);
1152 static int fsi_pio_pop(struct fsi_priv *fsi, struct fsi_stream *io)
1158 sample_residues = fsi_get_current_fifo_samples(fsi, io);
1163 return fsi_pio_transfer(fsi, io,
1169 static int fsi_pio_push(struct fsi_priv *fsi, struct fsi_stream *io)
1177 fsi_get_current_fifo_samples(fsi, io);
1181 return fsi_pio_transfer(fsi, io,
1187 static int fsi_pio_start_stop(struct fsi_priv *fsi, struct fsi_stream *io,
1190 struct fsi_master *master = fsi_get_master(fsi);
1191 u32 clk = fsi_is_port_a(fsi) ? CRA : CRB;
1194 fsi_irq_enable(fsi, io);
1196 fsi_irq_disable(fsi, io);
1198 if (fsi_is_clk_master(fsi))
1204 static int fsi_pio_push_init(struct fsi_priv *fsi, struct fsi_stream *io)
1213 if (fsi_is_enable_stream(fsi))
1222 static int fsi_pio_pop_init(struct fsi_priv *fsi, struct fsi_stream *io)
1274 static int fsi_dma_init(struct fsi_priv *fsi, struct fsi_stream *io)
1289 struct fsi_priv *fsi = fsi_stream_to_priv(io);
1293 fsi_count_fifo_err(fsi);
1296 static int fsi_dma_transfer(struct fsi_priv *fsi, struct fsi_stream *io)
1301 int is_play = fsi_stream_is_play(fsi, io);
1341 if (ERR_OVER & fsi_reg_read(fsi, DIFF_ST)) {
1342 fsi_reg_mask_set(fsi, DIFF_CTL, FIFO_CLR, FIFO_CLR);
1343 fsi_reg_write(fsi, DIFF_ST, 0);
1353 static int fsi_dma_push_start_stop(struct fsi_priv *fsi, struct fsi_stream *io,
1356 struct fsi_master *master = fsi_get_master(fsi);
1357 u32 clk = fsi_is_port_a(fsi) ? CRA : CRB;
1360 fsi_reg_mask_set(fsi, OUT_DMAC, DMA_ON, enable);
1364 if (fsi_is_clk_master(fsi))
1370 static int fsi_dma_probe(struct fsi_priv *fsi, struct fsi_stream *io, struct device *dev)
1372 int is_play = fsi_stream_is_play(fsi, io);
1391 cfg.dst_addr = fsi->phys + REG_DODT;
1395 cfg.src_addr = fsi->phys + REG_DIDT;
1411 fsi->playback.handler = &fsi_pio_push_handler;
1413 fsi->capture.handler = &fsi_pio_pop_handler;
1418 return fsi_stream_probe(fsi, dev);
1424 static int fsi_dma_remove(struct fsi_priv *fsi, struct fsi_stream *io)
1426 fsi_stream_stop(fsi, io);
1446 static void fsi_fifo_init(struct fsi_priv *fsi,
1450 struct fsi_master *master = fsi_get_master(fsi);
1451 int is_play = fsi_stream_is_play(fsi, io);
1457 shift >>= fsi_get_port_shift(fsi, io);
1481 for (i = 1; i < fsi->chan_num; i <<= 1)
1484 fsi->chan_num, frame_capa);
1486 io->fifo_sample_capa = fsi_frame2sample(fsi, frame_capa);
1493 fsi_reg_write(fsi, DOFF_CTL, IRQ_HALF);
1494 fsi_reg_mask_set(fsi, DOFF_CTL, FIFO_CLR, FIFO_CLR);
1496 fsi_reg_write(fsi, DIFF_CTL, IRQ_HALF);
1497 fsi_reg_mask_set(fsi, DIFF_CTL, FIFO_CLR, FIFO_CLR);
1501 static int fsi_hw_startup(struct fsi_priv *fsi,
1508 if (fsi_is_clk_master(fsi))
1511 fsi_reg_mask_set(fsi, CKG1, (DIMD | DOMD), data);
1515 if (fsi->bit_clk_inv)
1517 if (fsi->lr_clk_inv)
1519 if (fsi_is_clk_master(fsi))
1521 fsi_reg_write(fsi, CKG2, data);
1524 if (fsi_is_spdif(fsi)) {
1525 fsi_spdif_clk_ctrl(fsi, 1);
1526 fsi_reg_mask_set(fsi, OUT_SEL, DMMD, DMMD);
1541 fsi_format_bus_setup(fsi, io, data, dev);
1544 fsi_irq_disable(fsi, io);
1545 fsi_irq_clear_status(fsi);
1548 fsi_fifo_init(fsi, io, dev);
1551 if (fsi_is_clk_master(fsi))
1552 return fsi_clk_enable(dev, fsi);
1557 static int fsi_hw_shutdown(struct fsi_priv *fsi,
1561 if (fsi_is_clk_master(fsi))
1562 return fsi_clk_disable(dev, fsi);
1570 struct fsi_priv *fsi = fsi_get_priv(substream);
1572 fsi_clk_invalid(fsi);
1580 struct fsi_priv *fsi = fsi_get_priv(substream);
1582 fsi_clk_invalid(fsi);
1588 struct fsi_priv *fsi = fsi_get_priv(substream);
1589 struct fsi_stream *io = fsi_stream_get(fsi, substream);
1594 fsi_stream_init(fsi, io, substream);
1596 ret = fsi_hw_startup(fsi, io, dai->dev);
1598 ret = fsi_stream_start(fsi, io);
1604 ret = fsi_hw_shutdown(fsi, dai->dev);
1605 fsi_stream_stop(fsi, io);
1606 fsi_stream_quit(fsi, io);
1613 static int fsi_set_fmt_dai(struct fsi_priv *fsi, unsigned int fmt)
1617 fsi->fmt = CR_I2S;
1618 fsi->chan_num = 2;
1621 fsi->fmt = CR_PCM;
1622 fsi->chan_num = 2;
1631 static int fsi_set_fmt_spdif(struct fsi_priv *fsi)
1633 struct fsi_master *master = fsi_get_master(fsi);
1638 fsi->fmt = CR_DTMD_SPDIF_PCM | CR_PCM;
1639 fsi->chan_num = 2;
1646 struct fsi_priv *fsi = fsi_get_priv_frm_dai(dai);
1654 fsi->clk_master = 1; /* cpu is master */
1663 fsi->bit_clk_inv = 0;
1664 fsi->lr_clk_inv = 1;
1667 fsi->bit_clk_inv = 1;
1668 fsi->lr_clk_inv = 0;
1671 fsi->bit_clk_inv = 1;
1672 fsi->lr_clk_inv = 1;
1676 fsi->bit_clk_inv = 0;
1677 fsi->lr_clk_inv = 0;
1681 if (fsi_is_clk_master(fsi)) {
1682 if (fsi->clk_cpg)
1683 fsi_clk_init(dai->dev, fsi, 0, 1, 1,
1686 fsi_clk_init(dai->dev, fsi, 1, 1, 0,
1691 if (fsi_is_spdif(fsi))
1692 ret = fsi_set_fmt_spdif(fsi);
1694 ret = fsi_set_fmt_dai(fsi, fmt & SND_SOC_DAIFMT_FORMAT_MASK);
1703 struct fsi_priv *fsi = fsi_get_priv(substream);
1705 if (fsi_is_clk_master(fsi))
1706 fsi_clk_valid(fsi, params_rate(params));
1767 struct fsi_priv *fsi = fsi_get_priv(substream);
1768 struct fsi_stream *io = fsi_stream_get(fsi, substream);
1770 return fsi_sample2frame(fsi, io->buff_sample_pos);
1831 .name = "fsi",
1867 static void fsi_port_info_init(struct fsi_priv *fsi,
1871 fsi->spdif = 1;
1874 fsi->clk_cpg = 1;
1877 fsi->enable_stream = 1;
1880 static void fsi_handler_init(struct fsi_priv *fsi,
1883 fsi->playback.handler = &fsi_pio_push_handler; /* default PIO */
1884 fsi->playback.priv = fsi;
1885 fsi->capture.handler = &fsi_pio_pop_handler; /* default PIO */
1886 fsi->capture.priv = fsi;
1889 fsi->playback.dma_id = info->tx_id;
1890 fsi->playback.handler = &fsi_dma_push_handler;
1933 struct fsi_priv *fsi;
1955 dev_err(&pdev->dev, "unknown fsi device\n");
1981 fsi = &master->fsia;
1982 fsi->base = master->base;
1983 fsi->phys = res->start;
1984 fsi->master = master;
1985 fsi_port_info_init(fsi, &info.port_a);
1986 fsi_handler_init(fsi, &info.port_a);
1987 ret = fsi_stream_probe(fsi, &pdev->dev);
1994 fsi = &master->fsib;
1995 fsi->base = master->base + 0x40;
1996 fsi->phys = res->start + 0x40;
1997 fsi->master = master;
1998 fsi_port_info_init(fsi, &info.port_b);
1999 fsi_handler_init(fsi, &info.port_b);
2000 ret = fsi_stream_probe(fsi, &pdev->dev);
2046 static void __fsi_suspend(struct fsi_priv *fsi,
2050 if (!fsi_stream_is_working(fsi, io))
2053 fsi_stream_stop(fsi, io);
2054 fsi_hw_shutdown(fsi, dev);
2057 static void __fsi_resume(struct fsi_priv *fsi,
2061 if (!fsi_stream_is_working(fsi, io))
2064 fsi_hw_startup(fsi, io, dev);
2065 fsi_stream_start(fsi, io);
2105 .name = "fsi-pcm-audio",
2119 MODULE_ALIAS("platform:fsi-pcm-audio");