Lines Matching +full:i2s +full:- +full:rx
1 // SPDX-License-Identifier: GPL-2.0
3 // loongson_i2s_pci.c -- Loongson I2S controller driver
12 #include <linux/dma-mapping.h>
76 const struct fwnode_handle *fwnode = pdev->dev.fwnode; in loongson_i2s_pci_probe()
78 struct loongson_i2s *i2s; in loongson_i2s_pci_probe() local
82 dev_err(&pdev->dev, "pci_enable_device failed\n"); in loongson_i2s_pci_probe()
83 return -ENODEV; in loongson_i2s_pci_probe()
86 i2s = devm_kzalloc(&pdev->dev, sizeof(*i2s), GFP_KERNEL); in loongson_i2s_pci_probe()
87 if (!i2s) in loongson_i2s_pci_probe()
88 return -ENOMEM; in loongson_i2s_pci_probe()
90 i2s->rev_id = pdev->revision; in loongson_i2s_pci_probe()
91 i2s->dev = &pdev->dev; in loongson_i2s_pci_probe()
92 pci_set_drvdata(pdev, i2s); in loongson_i2s_pci_probe()
94 ret = pcim_iomap_regions(pdev, 1 << 0, dev_name(&pdev->dev)); in loongson_i2s_pci_probe()
96 dev_err(&pdev->dev, "iomap_regions failed\n"); in loongson_i2s_pci_probe()
99 i2s->reg_base = pcim_iomap_table(pdev)[0]; in loongson_i2s_pci_probe()
100 i2s->regmap = devm_regmap_init_mmio(&pdev->dev, i2s->reg_base, in loongson_i2s_pci_probe()
102 if (IS_ERR(i2s->regmap)) { in loongson_i2s_pci_probe()
103 dev_err(&pdev->dev, "regmap_init_mmio failed\n"); in loongson_i2s_pci_probe()
104 return PTR_ERR(i2s->regmap); in loongson_i2s_pci_probe()
107 tx_data = &i2s->tx_dma_data; in loongson_i2s_pci_probe()
108 rx_data = &i2s->rx_dma_data; in loongson_i2s_pci_probe()
110 tx_data->dev_addr = pci_resource_start(pdev, 0) + LS_I2S_TX_DATA; in loongson_i2s_pci_probe()
111 tx_data->order_addr = i2s->reg_base + LS_I2S_TX_ORDER; in loongson_i2s_pci_probe()
113 rx_data->dev_addr = pci_resource_start(pdev, 0) + LS_I2S_RX_DATA; in loongson_i2s_pci_probe()
114 rx_data->order_addr = i2s->reg_base + LS_I2S_RX_ORDER; in loongson_i2s_pci_probe()
116 tx_data->irq = fwnode_irq_get_byname(fwnode, "tx"); in loongson_i2s_pci_probe()
117 if (tx_data->irq < 0) { in loongson_i2s_pci_probe()
118 dev_err(&pdev->dev, "dma tx irq invalid\n"); in loongson_i2s_pci_probe()
119 return tx_data->irq; in loongson_i2s_pci_probe()
122 rx_data->irq = fwnode_irq_get_byname(fwnode, "rx"); in loongson_i2s_pci_probe()
123 if (rx_data->irq < 0) { in loongson_i2s_pci_probe()
124 dev_err(&pdev->dev, "dma rx irq invalid\n"); in loongson_i2s_pci_probe()
125 return rx_data->irq; in loongson_i2s_pci_probe()
128 device_property_read_u32(&pdev->dev, "clock-frequency", &i2s->clk_rate); in loongson_i2s_pci_probe()
129 if (!i2s->clk_rate) { in loongson_i2s_pci_probe()
130 dev_err(&pdev->dev, "clock-frequency property invalid\n"); in loongson_i2s_pci_probe()
131 return -EINVAL; in loongson_i2s_pci_probe()
134 dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); in loongson_i2s_pci_probe()
136 if (i2s->rev_id == 1) { in loongson_i2s_pci_probe()
137 regmap_write(i2s->regmap, LS_I2S_CTRL, I2S_CTRL_RESET); in loongson_i2s_pci_probe()
141 ret = devm_snd_soc_register_component(&pdev->dev, in loongson_i2s_pci_probe()
145 dev_err(&pdev->dev, "register DAI failed %d\n", ret); in loongson_i2s_pci_probe()
159 .name = "loongson-i2s-pci",
169 MODULE_DESCRIPTION("Loongson I2S Master Mode ASoC Driver");