Lines Matching refs:range
37 #define knav_range_offset_to_inst(kdev, range, q) \ argument
38 (range->queue_base_inst + (q << kdev->inst_shift))
40 static void __knav_acc_notify(struct knav_range_info *range, in __knav_acc_notify() argument
43 struct knav_device *kdev = range->kdev; in __knav_acc_notify()
47 range_base = kdev->base_id + range->queue_base; in __knav_acc_notify()
49 if (range->flags & RANGE_MULTI_QUEUE) { in __knav_acc_notify()
50 for (queue = 0; queue < range->num_queues; queue++) { in __knav_acc_notify()
51 inst = knav_range_offset_to_inst(kdev, range, in __knav_acc_notify()
61 queue = acc->channel - range->acc_info.start_channel; in __knav_acc_notify()
62 inst = knav_range_offset_to_inst(kdev, range, queue); in __knav_acc_notify()
69 static int knav_acc_set_notify(struct knav_range_info *range, in knav_acc_set_notify() argument
73 struct knav_pdsp_info *pdsp = range->acc_info.pdsp; in knav_acc_set_notify()
74 struct knav_device *kdev = range->kdev; in knav_acc_set_notify()
98 struct knav_range_info *range; in knav_acc_int_handler() local
107 range = _instdata; in knav_acc_int_handler()
108 info = &range->acc_info; in knav_acc_int_handler()
109 kdev = range->kdev; in knav_acc_int_handler()
110 pdsp = range->acc_info.pdsp; in knav_acc_int_handler()
111 acc = range->acc; in knav_acc_int_handler()
113 range_base = kdev->base_id + range->queue_base; in knav_acc_int_handler()
114 if ((range->flags & RANGE_MULTI_QUEUE) == 0) { in knav_acc_int_handler()
115 for (queue = 0; queue < range->num_irqs; queue++) in knav_acc_int_handler()
116 if (range->irqs[queue].irq == irq) in knav_acc_int_handler()
118 kq = knav_range_offset_to_inst(kdev, range, queue); in knav_acc_int_handler()
129 __knav_acc_notify(range, acc); in knav_acc_int_handler()
164 if (range->flags & RANGE_MULTI_QUEUE) { in knav_acc_int_handler()
167 queue >= range_base + range->num_queues) { in knav_acc_int_handler()
171 range_base + range->num_queues); in knav_acc_int_handler()
175 kq = knav_range_offset_to_inst(kdev, range, in knav_acc_int_handler()
194 __knav_acc_notify(range, acc); in knav_acc_int_handler()
212 static int knav_range_setup_acc_irq(struct knav_range_info *range, in knav_range_setup_acc_irq() argument
215 struct knav_device *kdev = range->kdev; in knav_range_setup_acc_irq()
221 if (range->flags & RANGE_MULTI_QUEUE) { in knav_range_setup_acc_irq()
222 acc = range->acc; in knav_range_setup_acc_irq()
223 irq = range->irqs[0].irq; in knav_range_setup_acc_irq()
224 cpu_map = range->irqs[0].cpu_map; in knav_range_setup_acc_irq()
226 acc = range->acc + queue; in knav_range_setup_acc_irq()
227 irq = range->irqs[queue].irq; in knav_range_setup_acc_irq()
228 cpu_map = range->irqs[queue].cpu_map; in knav_range_setup_acc_irq()
250 range); in knav_range_setup_acc_irq()
254 dev_warn(range->kdev->dev, in knav_range_setup_acc_irq()
266 dev_warn(range->kdev->dev, in knav_range_setup_acc_irq()
268 free_irq(irq, range); in knav_range_setup_acc_irq()
318 struct knav_range_info *range, in knav_acc_setup_cmd() argument
322 struct knav_acc_info *info = &range->acc_info; in knav_acc_setup_cmd()
327 if (range->flags & RANGE_MULTI_QUEUE) { in knav_acc_setup_cmd()
328 acc = range->acc; in knav_acc_setup_cmd()
329 queue_base = range->queue_base; in knav_acc_setup_cmd()
330 queue_mask = BIT(range->num_queues) - 1; in knav_acc_setup_cmd()
332 acc = range->acc + queue; in knav_acc_setup_cmd()
333 queue_base = range->queue_base + queue; in knav_acc_setup_cmd()
345 if (range->flags & RANGE_MULTI_QUEUE) in knav_acc_setup_cmd()
352 struct knav_range_info *range, in knav_acc_stop() argument
359 acc = range->acc + queue; in knav_acc_stop()
361 knav_acc_setup_cmd(kdev, range, &cmd, queue); in knav_acc_stop()
363 result = knav_acc_write(kdev, range->acc_info.pdsp, &cmd); in knav_acc_stop()
370 struct knav_range_info *range, in knav_acc_start() argument
377 acc = range->acc + queue; in knav_acc_start()
379 knav_acc_setup_cmd(kdev, range, &cmd, queue); in knav_acc_start()
381 result = knav_acc_write(kdev, range->acc_info.pdsp, &cmd); in knav_acc_start()
389 static int knav_acc_init_range(struct knav_range_info *range) in knav_acc_init_range() argument
391 struct knav_device *kdev = range->kdev; in knav_acc_init_range()
396 for (queue = 0; queue < range->num_queues; queue++) { in knav_acc_init_range()
397 acc = range->acc + queue; in knav_acc_init_range()
399 knav_acc_stop(kdev, range, queue); in knav_acc_init_range()
401 result = knav_acc_start(kdev, range, queue); in knav_acc_init_range()
406 if (range->flags & RANGE_MULTI_QUEUE) in knav_acc_init_range()
412 static int knav_acc_init_queue(struct knav_range_info *range, in knav_acc_init_queue() argument
415 unsigned id = kq->id - range->queue_base; in knav_acc_init_queue()
417 kq->descs = devm_kzalloc(range->kdev->dev, in knav_acc_init_queue()
422 kq->acc = range->acc; in knav_acc_init_queue()
423 if ((range->flags & RANGE_MULTI_QUEUE) == 0) in knav_acc_init_queue()
428 static int knav_acc_open_queue(struct knav_range_info *range, in knav_acc_open_queue() argument
431 unsigned id = inst->id - range->queue_base; in knav_acc_open_queue()
433 return knav_range_setup_acc_irq(range, id, true); in knav_acc_open_queue()
436 static int knav_acc_close_queue(struct knav_range_info *range, in knav_acc_close_queue() argument
439 unsigned id = inst->id - range->queue_base; in knav_acc_close_queue()
441 return knav_range_setup_acc_irq(range, id, false); in knav_acc_close_queue()
444 static int knav_acc_free_range(struct knav_range_info *range) in knav_acc_free_range() argument
446 struct knav_device *kdev = range->kdev; in knav_acc_free_range()
451 info = &range->acc_info; in knav_acc_free_range()
453 if (range->flags & RANGE_MULTI_QUEUE) in knav_acc_free_range()
456 channels = range->num_queues; in knav_acc_free_range()
459 acc = range->acc + channel; in knav_acc_free_range()
466 devm_kfree(range->kdev->dev, range->acc); in knav_acc_free_range()
490 struct knav_range_info *range) in knav_init_acc_range() argument
501 range->flags |= RANGE_HAS_ACCUMULATOR; in knav_init_acc_range()
502 info = &range->acc_info; in knav_init_acc_range()
516 info->start_channel, range->name); in knav_init_acc_range()
522 info->pacing_mode, range->name); in knav_init_acc_range()
529 info->pdsp_id, range->name); in knav_init_acc_range()
535 info->pdsp_id, range->name); in knav_init_acc_range()
540 channels = range->num_queues; in knav_init_acc_range()
542 range->flags |= RANGE_MULTI_QUEUE; in knav_init_acc_range()
544 if (range->queue_base & (32 - 1)) { in knav_init_acc_range()
547 range->name); in knav_init_acc_range()
550 if (range->num_queues > 32) { in knav_init_acc_range()
553 range->name); in knav_init_acc_range()
564 range->acc = devm_kzalloc(kdev->dev, channels * sizeof(*range->acc), in knav_init_acc_range()
566 if (!range->acc) in knav_init_acc_range()
570 acc = range->acc + channel; in knav_init_acc_range()
598 range->ops = &knav_acc_range_ops; in knav_init_acc_range()