Lines Matching defs:tsa
10 #include "tsa.h"
11 #include <dt-bindings/soc/cpm1-fsl,tsa.h>
118 struct tsa {
132 static inline struct tsa *tsa_serial_get_tsa(struct tsa_serial *tsa_serial)
135 return container_of(tsa_serial, struct tsa, serials[tsa_serial->id]);
165 struct tsa *tsa = tsa_serial_get_tsa(tsa_serial);
184 dev_err(tsa->dev, "Unsupported serial id %u\n", tsa_serial->id);
188 spin_lock_irqsave(&tsa->lock, flags);
189 tsa_clrsetbits32(tsa->si_regs + TSA_SICR, clear, set);
190 spin_unlock_irqrestore(&tsa->lock, flags);
198 struct tsa *tsa = tsa_serial_get_tsa(tsa_serial);
213 dev_err(tsa->dev, "Unsupported serial id %u\n", tsa_serial->id);
217 spin_lock_irqsave(&tsa->lock, flags);
218 tsa_clrsetbits32(tsa->si_regs + TSA_SICR, clear, 0);
219 spin_unlock_irqrestore(&tsa->lock, flags);
232 static void tsa_init_entries_area(struct tsa *tsa, struct tsa_entries_area *area,
238 quarter = tsa->si_ram_sz/4;
239 half = tsa->si_ram_sz/2;
245 area->entries_start = tsa->si_ram;
250 area->entries_start = tsa->si_ram + half;
259 area->entries_start = tsa->si_ram;
264 area->entries_start = tsa->si_ram + (2 * quarter);
271 area->entries_start = tsa->si_ram + quarter;
276 area->entries_start = tsa->si_ram + (3 * quarter);
284 static const char *tsa_serial_id2name(struct tsa *tsa, u32 serial_id)
299 static u32 tsa_serial_id2csel(struct tsa *tsa, u32 serial_id)
313 static int tsa_add_entry(struct tsa *tsa, struct tsa_entries_area *area,
326 dev_err(tsa->dev, "si ram area full\n");
337 val = TSA_SIRAM_ENTRY_BYTE | tsa_serial_id2csel(tsa, serial_id);
356 static int tsa_of_parse_tdm_route(struct tsa *tsa, struct device_node *tdm_np,
374 dev_err(tsa->dev, "%pOF: failed to read %s\n", tdm_np, route_name);
378 dev_err(tsa->dev, "%pOF: wrong %s format\n", tdm_np, route_name);
382 tsa_init_entries_area(tsa, &area, tdms, tdm_id, is_rx);
388 if (serial_id >= ARRAY_SIZE(tsa->serials)) {
389 dev_err(tsa->dev, "%pOF: invalid serial id (%u)\n",
394 serial_name = tsa_serial_id2name(tsa, serial_id);
396 dev_err(tsa->dev, "%pOF: unsupported serial id (%u)\n",
401 dev_dbg(tsa->dev, "tdm_id=%u, %s ts %u..%u -> %s\n",
405 ret = tsa_add_entry(tsa, &area, count, serial_id);
409 serial_info = &tsa->serials[serial_id].info;
410 tdm = &tsa->tdm[tdm_id];
428 static inline int tsa_of_parse_tdm_rx_route(struct tsa *tsa,
432 return tsa_of_parse_tdm_route(tsa, tdm_np, tdms, tdm_id, true);
435 static inline int tsa_of_parse_tdm_tx_route(struct tsa *tsa,
439 return tsa_of_parse_tdm_route(tsa, tdm_np, tdms, tdm_id, false);
442 static int tsa_of_parse_tdms(struct tsa *tsa, struct device_node *np)
451 tsa->tdms = 0;
452 tsa->tdm[0].is_enable = false;
453 tsa->tdm[1].is_enable = false;
458 dev_err(tsa->dev, "%pOF: failed to read reg\n", tdm_np);
464 tsa->tdms |= BIT(TSA_TDMA);
467 tsa->tdms |= BIT(TSA_TDMB);
470 dev_err(tsa->dev, "%pOF: Invalid tdm_id (%u)\n", tdm_np,
480 dev_err(tsa->dev, "%pOF: failed to read reg\n", tdm_np);
485 tdm = &tsa->tdm[tdm_id];
492 dev_err(tsa->dev,
499 dev_err(tsa->dev,
511 dev_err(tsa->dev,
518 dev_err(tsa->dev,
596 ret = tsa_of_parse_tdm_rx_route(tsa, tdm_np, tsa->tdms, tdm_id);
602 ret = tsa_of_parse_tdm_tx_route(tsa, tdm_np, tsa->tdms, tdm_id);
614 if (tsa->tdm[i].l1rsync_clk) {
615 clk_disable_unprepare(tsa->tdm[i].l1rsync_clk);
616 clk_put(tsa->tdm[i].l1rsync_clk);
618 if (tsa->tdm[i].l1rclk_clk) {
619 clk_disable_unprepare(tsa->tdm[i].l1rclk_clk);
620 clk_put(tsa->tdm[i].l1rclk_clk);
622 if (tsa->tdm[i].l1tsync_clk) {
623 clk_disable_unprepare(tsa->tdm[i].l1rsync_clk);
624 clk_put(tsa->tdm[i].l1rsync_clk);
626 if (tsa->tdm[i].l1tclk_clk) {
627 clk_disable_unprepare(tsa->tdm[i].l1rclk_clk);
628 clk_put(tsa->tdm[i].l1rclk_clk);
634 static void tsa_init_si_ram(struct tsa *tsa)
639 for (i = 0; i < tsa->si_ram_sz; i += 4)
640 tsa_write32(tsa->si_ram + i, TSA_SIRAM_ENTRY_LAST);
647 struct tsa *tsa;
652 tsa = devm_kzalloc(&pdev->dev, sizeof(*tsa), GFP_KERNEL);
653 if (!tsa)
656 tsa->dev = &pdev->dev;
658 for (i = 0; i < ARRAY_SIZE(tsa->serials); i++)
659 tsa->serials[i].id = i;
661 spin_lock_init(&tsa->lock);
663 tsa->si_regs = devm_platform_ioremap_resource_byname(pdev, "si_regs");
664 if (IS_ERR(tsa->si_regs))
665 return PTR_ERR(tsa->si_regs);
669 dev_err(tsa->dev, "si_ram resource missing\n");
672 tsa->si_ram_sz = resource_size(res);
673 tsa->si_ram = devm_ioremap_resource(&pdev->dev, res);
674 if (IS_ERR(tsa->si_ram))
675 return PTR_ERR(tsa->si_ram);
677 tsa_init_si_ram(tsa);
679 ret = tsa_of_parse_tdms(tsa, np);
685 if (tsa->tdm[0].is_enable)
686 val |= TSA_SIMODE_TDMA(tsa->tdm[0].simode_tdm);
687 if (tsa->tdm[1].is_enable)
688 val |= TSA_SIMODE_TDMB(tsa->tdm[1].simode_tdm);
690 tsa_clrsetbits32(tsa->si_regs + TSA_SIMODE,
696 val = (tsa->tdms == BIT(TSA_TDMA)) ?
698 if (tsa->tdms & BIT(TSA_TDMA))
700 if (tsa->tdms & BIT(TSA_TDMB))
702 tsa_write8(tsa->si_regs + TSA_SIGMR, val);
704 platform_set_drvdata(pdev, tsa);
711 struct tsa *tsa = platform_get_drvdata(pdev);
715 if (tsa->tdm[i].l1rsync_clk) {
716 clk_disable_unprepare(tsa->tdm[i].l1rsync_clk);
717 clk_put(tsa->tdm[i].l1rsync_clk);
719 if (tsa->tdm[i].l1rclk_clk) {
720 clk_disable_unprepare(tsa->tdm[i].l1rclk_clk);
721 clk_put(tsa->tdm[i].l1rclk_clk);
723 if (tsa->tdm[i].l1tsync_clk) {
724 clk_disable_unprepare(tsa->tdm[i].l1rsync_clk);
725 clk_put(tsa->tdm[i].l1rsync_clk);
727 if (tsa->tdm[i].l1tclk_clk) {
728 clk_disable_unprepare(tsa->tdm[i].l1rclk_clk);
729 clk_put(tsa->tdm[i].l1rclk_clk);
736 { .compatible = "fsl,cpm1-tsa" },
743 .name = "fsl-tsa",
757 struct tsa *tsa;
774 tsa = platform_get_drvdata(pdev);
775 if (!tsa) {
785 if (out_args.args[0] >= ARRAY_SIZE(tsa->serials)) {
790 tsa_serial = &tsa->serials[out_args.args[0]];
808 struct tsa *tsa = tsa_serial_get_tsa(tsa_serial);
810 put_device(tsa->dev);