Lines Matching +full:3 +full:- +full:5 +full:v
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
5 * lpass-sc7180.c -- ALSA SoC platform-machine driver for QTi LPASS
13 #include <dt-bindings/sound/sc7180-lpass.h>
15 #include "lpass-lpaif-reg.h"
113 struct lpass_variant *v = drvdata->variant; in sc7280_lpass_alloc_dma_channel() local
119 chan = find_first_zero_bit(&drvdata->dma_ch_bit_map, in sc7280_lpass_alloc_dma_channel()
120 v->rdma_channels); in sc7280_lpass_alloc_dma_channel()
122 if (chan >= v->rdma_channels) in sc7280_lpass_alloc_dma_channel()
123 return -EBUSY; in sc7280_lpass_alloc_dma_channel()
125 chan = find_next_zero_bit(&drvdata->dma_ch_bit_map, in sc7280_lpass_alloc_dma_channel()
126 v->wrdma_channel_start + in sc7280_lpass_alloc_dma_channel()
127 v->wrdma_channels, in sc7280_lpass_alloc_dma_channel()
128 v->wrdma_channel_start); in sc7280_lpass_alloc_dma_channel()
130 if (chan >= v->wrdma_channel_start + v->wrdma_channels) in sc7280_lpass_alloc_dma_channel()
131 return -EBUSY; in sc7280_lpass_alloc_dma_channel()
133 set_bit(chan, &drvdata->dma_ch_bit_map); in sc7280_lpass_alloc_dma_channel()
136 chan = find_first_zero_bit(&drvdata->hdmi_dma_ch_bit_map, in sc7280_lpass_alloc_dma_channel()
137 v->hdmi_rdma_channels); in sc7280_lpass_alloc_dma_channel()
138 if (chan >= v->hdmi_rdma_channels) in sc7280_lpass_alloc_dma_channel()
139 return -EBUSY; in sc7280_lpass_alloc_dma_channel()
140 set_bit(chan, &drvdata->hdmi_dma_ch_bit_map); in sc7280_lpass_alloc_dma_channel()
143 chan = find_first_zero_bit(&drvdata->rxtx_dma_ch_bit_map, in sc7280_lpass_alloc_dma_channel()
144 v->rxtx_rdma_channels); in sc7280_lpass_alloc_dma_channel()
145 if (chan >= v->rxtx_rdma_channels) in sc7280_lpass_alloc_dma_channel()
146 return -EBUSY; in sc7280_lpass_alloc_dma_channel()
149 chan = find_next_zero_bit(&drvdata->rxtx_dma_ch_bit_map, in sc7280_lpass_alloc_dma_channel()
150 v->rxtx_wrdma_channel_start + in sc7280_lpass_alloc_dma_channel()
151 v->rxtx_wrdma_channels, in sc7280_lpass_alloc_dma_channel()
152 v->rxtx_wrdma_channel_start); in sc7280_lpass_alloc_dma_channel()
153 if (chan >= v->rxtx_wrdma_channel_start + v->rxtx_wrdma_channels) in sc7280_lpass_alloc_dma_channel()
154 return -EBUSY; in sc7280_lpass_alloc_dma_channel()
155 set_bit(chan, &drvdata->rxtx_dma_ch_bit_map); in sc7280_lpass_alloc_dma_channel()
158 chan = find_next_zero_bit(&drvdata->va_dma_ch_bit_map, in sc7280_lpass_alloc_dma_channel()
159 v->va_wrdma_channel_start + in sc7280_lpass_alloc_dma_channel()
160 v->va_wrdma_channels, in sc7280_lpass_alloc_dma_channel()
161 v->va_wrdma_channel_start); in sc7280_lpass_alloc_dma_channel()
162 if (chan >= v->va_wrdma_channel_start + v->va_wrdma_channels) in sc7280_lpass_alloc_dma_channel()
163 return -EBUSY; in sc7280_lpass_alloc_dma_channel()
164 set_bit(chan, &drvdata->va_dma_ch_bit_map); in sc7280_lpass_alloc_dma_channel()
177 clear_bit(chan, &drvdata->dma_ch_bit_map); in sc7280_lpass_free_dma_channel()
180 clear_bit(chan, &drvdata->hdmi_dma_ch_bit_map); in sc7280_lpass_free_dma_channel()
184 clear_bit(chan, &drvdata->rxtx_dma_ch_bit_map); in sc7280_lpass_free_dma_channel()
187 clear_bit(chan, &drvdata->va_dma_ch_bit_map); in sc7280_lpass_free_dma_channel()
199 struct lpass_variant *variant = drvdata->variant; in sc7280_lpass_init()
200 struct device *dev = &pdev->dev; in sc7280_lpass_init()
203 drvdata->clks = devm_kcalloc(dev, variant->num_clks, in sc7280_lpass_init()
204 sizeof(*drvdata->clks), GFP_KERNEL); in sc7280_lpass_init()
205 if (!drvdata->clks) in sc7280_lpass_init()
206 return -ENOMEM; in sc7280_lpass_init()
208 drvdata->num_clks = variant->num_clks; in sc7280_lpass_init()
210 for (i = 0; i < drvdata->num_clks; i++) in sc7280_lpass_init()
211 drvdata->clks[i].id = variant->clk_name[i]; in sc7280_lpass_init()
213 ret = devm_clk_bulk_get(dev, drvdata->num_clks, drvdata->clks); in sc7280_lpass_init()
219 ret = clk_bulk_prepare_enable(drvdata->num_clks, drvdata->clks); in sc7280_lpass_init()
232 clk_bulk_disable_unprepare(drvdata->num_clks, drvdata->clks); in sc7280_lpass_exit()
240 return clk_bulk_prepare_enable(drvdata->num_clks, drvdata->clks); in sc7280_lpass_dev_resume()
247 clk_bulk_disable_unprepare(drvdata->num_clks, drvdata->clks); in sc7280_lpass_dev_suspend()
258 .i2s_ports = 3,
261 .irq_ports = 3,
264 .rdma_channels = 5,
274 .wrdma_channel_start = 5,
278 .rxtx_irq_ports = 3,
281 .rxtx_wrdma_channel_start = 5,
285 .va_wrdma_channel_start = 5,
286 .va_wrdma_channels = 3,
289 .va_irq_ports = 3,
291 .loopback = REG_FIELD_ID(0x1000, 17, 17, 3, 0x1000),
292 .spken = REG_FIELD_ID(0x1000, 16, 16, 3, 0x1000),
293 .spkmode = REG_FIELD_ID(0x1000, 11, 15, 3, 0x1000),
294 .spkmono = REG_FIELD_ID(0x1000, 10, 10, 3, 0x1000),
295 .micen = REG_FIELD_ID(0x1000, 9, 9, 3, 0x1000),
296 .micmode = REG_FIELD_ID(0x1000, 4, 8, 3, 0x1000),
297 .micmono = REG_FIELD_ID(0x1000, 3, 3, 3, 0x1000),
298 .wssrc = REG_FIELD_ID(0x1000, 2, 2, 3, 0x1000),
299 .bitwidth = REG_FIELD_ID(0x1000, 0, 1, 3, 0x1000),
301 .rdma_dyncclk = REG_FIELD_ID(0xC000, 21, 21, 5, 0x1000),
302 .rdma_bursten = REG_FIELD_ID(0xC000, 20, 20, 5, 0x1000),
303 .rdma_wpscnt = REG_FIELD_ID(0xC000, 16, 19, 5, 0x1000),
304 .rdma_intf = REG_FIELD_ID(0xC000, 12, 15, 5, 0x1000),
305 .rdma_fifowm = REG_FIELD_ID(0xC000, 1, 5, 5, 0x1000),
306 .rdma_enable = REG_FIELD_ID(0xC000, 0, 0, 5, 0x1000),
312 .wrdma_fifowm = REG_FIELD_ID(0x18000, 1, 5, 4, 0x1000),
326 .rxtx_rdma_codec_pack = REG_FIELD_ID(0xC050, 29, 29, 5, 0x1000),
329 .rxtx_wrdma_enable = REG_FIELD_ID(0x18000, 0, 0, 5, 0x1000),
330 .rxtx_wrdma_fifowm = REG_FIELD_ID(0x18000, 1, 11, 5, 0x1000),
331 .rxtx_wrdma_intf = REG_FIELD_ID(0x18000, 12, 16, 5, 0x1000),
332 .rxtx_wrdma_wpscnt = REG_FIELD_ID(0x18000, 17, 20, 5, 0x1000),
333 .rxtx_wrdma_bursten = REG_FIELD_ID(0x18000, 21, 21, 5, 0x1000),
334 .rxtx_wrdma_dyncclk = REG_FIELD_ID(0x18000, 22, 22, 5, 0x1000),
336 .rxtx_wrdma_codec_ch = REG_FIELD_ID(0x18050, 0, 7, 5, 0x1000),
337 .rxtx_wrdma_codec_intf = REG_FIELD_ID(0x18050, 16, 19, 5, 0x1000),
338 .rxtx_wrdma_codec_fs_delay = REG_FIELD_ID(0x18050, 21, 24, 5, 0x1000),
339 .rxtx_wrdma_codec_fs_sel = REG_FIELD_ID(0x18050, 25, 27, 5, 0x1000),
340 .rxtx_wrdma_codec_pack = REG_FIELD_ID(0x18050, 29, 29, 5, 0x1000),
341 .rxtx_wrdma_codec_enable = REG_FIELD_ID(0x18050, 30, 30, 5, 0x1000),
343 .va_wrdma_enable = REG_FIELD_ID(0x18000, 0, 0, 5, 0x1000),
344 .va_wrdma_fifowm = REG_FIELD_ID(0x18000, 1, 11, 5, 0x1000),
345 .va_wrdma_intf = REG_FIELD_ID(0x18000, 12, 16, 5, 0x1000),
346 .va_wrdma_wpscnt = REG_FIELD_ID(0x18000, 17, 20, 5, 0x1000),
347 .va_wrdma_bursten = REG_FIELD_ID(0x18000, 21, 21, 5, 0x1000),
348 .va_wrdma_dyncclk = REG_FIELD_ID(0x18000, 22, 22, 5, 0x1000),
350 .va_wrdma_codec_ch = REG_FIELD_ID(0x18050, 0, 7, 5, 0x1000),
351 .va_wrdma_codec_intf = REG_FIELD_ID(0x18050, 16, 19, 5, 0x1000),
352 .va_wrdma_codec_fs_delay = REG_FIELD_ID(0x18050, 21, 24, 5, 0x1000),
353 .va_wrdma_codec_fs_sel = REG_FIELD_ID(0x18050, 25, 27, 5, 0x1000),
354 .va_wrdma_codec_pack = REG_FIELD_ID(0x18050, 29, 29, 5, 0x1000),
355 .va_wrdma_codec_enable = REG_FIELD_ID(0x18050, 30, 30, 5, 0x1000),
377 .hdmi_rdma_fifowm = REG_FIELD_ID(0x64000, 1, 5, 4, 0x1000),
382 .auto_bbit_en = REG_FIELD(0x6101c, 3, 3),
384 .layout_sp = REG_FIELD(0x6101c, 5, 8),
391 .as_sdp_cc = REG_FIELD(0x610c8, 1, 3),
404 .hw_usr_sel = REG_FIELD(0x61038, 5, 6),
436 {.compatible = "qcom,sc7280-lpass-cpu", .data = &sc7280_data},
443 .name = "sc7280-lpass-cpu",