Lines Matching refs:range

20 #define knav_range_offset_to_inst(kdev, range, q)	\
21 (range->queue_base_inst + (q << kdev->inst_shift))
23 static void __knav_acc_notify(struct knav_range_info *range,
26 struct knav_device *kdev = range->kdev;
30 range_base = kdev->base_id + range->queue_base;
32 if (range->flags & RANGE_MULTI_QUEUE) {
33 for (queue = 0; queue < range->num_queues; queue++) {
34 inst = knav_range_offset_to_inst(kdev, range,
44 queue = acc->channel - range->acc_info.start_channel;
45 inst = knav_range_offset_to_inst(kdev, range, queue);
52 static int knav_acc_set_notify(struct knav_range_info *range,
56 struct knav_pdsp_info *pdsp = range->acc_info.pdsp;
57 struct knav_device *kdev = range->kdev;
81 struct knav_range_info *range;
90 range = _instdata;
91 info = &range->acc_info;
92 kdev = range->kdev;
93 pdsp = range->acc_info.pdsp;
94 acc = range->acc;
96 range_base = kdev->base_id + range->queue_base;
97 if ((range->flags & RANGE_MULTI_QUEUE) == 0) {
98 for (queue = 0; queue < range->num_irqs; queue++)
99 if (range->irqs[queue].irq == irq)
101 kq = knav_range_offset_to_inst(kdev, range, queue);
112 __knav_acc_notify(range, acc);
147 if (range->flags & RANGE_MULTI_QUEUE) {
150 queue >= range_base + range->num_queues) {
154 range_base + range->num_queues);
158 kq = knav_range_offset_to_inst(kdev, range,
177 __knav_acc_notify(range, acc);
195 static int knav_range_setup_acc_irq(struct knav_range_info *range,
198 struct knav_device *kdev = range->kdev;
204 if (range->flags & RANGE_MULTI_QUEUE) {
205 acc = range->acc;
206 irq = range->irqs[0].irq;
207 cpu_mask = range->irqs[0].cpu_mask;
209 acc = range->acc + queue;
210 irq = range->irqs[queue].irq;
211 cpu_mask = range->irqs[queue].cpu_mask;
233 range);
237 dev_warn(range->kdev->dev,
249 dev_warn(range->kdev->dev,
251 free_irq(irq, range);
301 struct knav_range_info *range,
305 struct knav_acc_info *info = &range->acc_info;
310 if (range->flags & RANGE_MULTI_QUEUE) {
311 acc = range->acc;
312 queue_base = range->queue_base;
313 queue_mask = BIT(range->num_queues) - 1;
315 acc = range->acc + queue;
316 queue_base = range->queue_base + queue;
328 if (range->flags & RANGE_MULTI_QUEUE)
335 struct knav_range_info *range,
342 acc = range->acc + queue;
344 knav_acc_setup_cmd(kdev, range, &cmd, queue);
346 result = knav_acc_write(kdev, range->acc_info.pdsp, &cmd);
353 struct knav_range_info *range,
360 acc = range->acc + queue;
362 knav_acc_setup_cmd(kdev, range, &cmd, queue);
364 result = knav_acc_write(kdev, range->acc_info.pdsp, &cmd);
372 static int knav_acc_init_range(struct knav_range_info *range)
374 struct knav_device *kdev = range->kdev;
379 for (queue = 0; queue < range->num_queues; queue++) {
380 acc = range->acc + queue;
382 knav_acc_stop(kdev, range, queue);
384 result = knav_acc_start(kdev, range, queue);
389 if (range->flags & RANGE_MULTI_QUEUE)
395 static int knav_acc_init_queue(struct knav_range_info *range,
398 unsigned id = kq->id - range->queue_base;
400 kq->descs = devm_kcalloc(range->kdev->dev,
405 kq->acc = range->acc;
406 if ((range->flags & RANGE_MULTI_QUEUE) == 0)
411 static int knav_acc_open_queue(struct knav_range_info *range,
414 unsigned id = inst->id - range->queue_base;
416 return knav_range_setup_acc_irq(range, id, true);
419 static int knav_acc_close_queue(struct knav_range_info *range,
422 unsigned id = inst->id - range->queue_base;
424 return knav_range_setup_acc_irq(range, id, false);
427 static int knav_acc_free_range(struct knav_range_info *range)
429 struct knav_device *kdev = range->kdev;
434 info = &range->acc_info;
436 if (range->flags & RANGE_MULTI_QUEUE)
439 channels = range->num_queues;
442 acc = range->acc + channel;
449 devm_kfree(range->kdev->dev, range->acc);
467 * @range: qmms range information
473 struct knav_range_info *range)
484 range->flags |= RANGE_HAS_ACCUMULATOR;
485 info = &range->acc_info;
498 dev_err(kdev->dev, "channel %d invalid for range %s\n",
499 info->start_channel, range->name);
504 dev_err(kdev->dev, "pacing mode %d invalid for range %s\n",
505 info->pacing_mode, range->name);
511 dev_err(kdev->dev, "pdsp id %d not found for range %s\n",
512 info->pdsp_id, range->name);
517 dev_err(kdev->dev, "pdsp id %d not started for range %s\n",
518 info->pdsp_id, range->name);
523 channels = range->num_queues;
525 range->flags |= RANGE_MULTI_QUEUE;
527 if (range->queue_base & (32 - 1)) {
529 "misaligned multi-queue accumulator range %s\n",
530 range->name);
533 if (range->num_queues > 32) {
535 "too many queues in accumulator range %s\n",
536 range->name);
547 range->acc = devm_kcalloc(kdev->dev, channels, sizeof(*range->acc),
549 if (!range->acc)
553 acc = range->acc + channel;
581 range->ops = &knav_acc_range_ops;