Lines Matching full:cx
105 static void dump_mb(struct cx18 *cx, struct cx18_mailbox *mb, char *name)
204 static void cx18_mdl_send_to_alsa(struct cx18 *cx, struct cx18_stream *s,
219 cx->pcm_announce_callback(cx->alsa, buf->buf,
227 cx->pcm_announce_callback(cx->alsa, buf->buf, buf->bytesused);
231 static void epu_dma_done(struct cx18 *cx, struct cx18_in_work_order *order)
242 s = cx18_handle_to_stream(cx, handle);
301 if (cx->pcm_announce_callback != NULL) {
302 cx18_mdl_send_to_alsa(cx, s, mdl);
313 cx18_stream_rotate_idx_mdls(cx);
319 wake_up(&cx->dma_waitq);
324 static void epu_debug(struct cx18 *cx, struct cx18_in_work_order *order)
331 if (!test_bit(CX18_F_I_LOADED_FW, &cx->i_flags) && p && p > str)
335 static void epu_cmd(struct cx18 *cx, struct cx18_in_work_order *order)
342 epu_dma_done(cx, order);
345 epu_debug(cx, order);
364 void free_in_work_order(struct cx18 *cx, struct cx18_in_work_order *order)
373 struct cx18 *cx = order->cx;
374 epu_cmd(cx, order);
375 free_in_work_order(cx, order);
383 static void mb_ack_irq(struct cx18 *cx, struct cx18_in_work_order *order)
391 ack_mb = &cx->scb->apu2epu_mb;
395 ack_mb = &cx->scb->cpu2epu_mb;
405 if (req != cx18_readl(cx, &ack_mb->request) ||
406 req == cx18_readl(cx, &ack_mb->ack)) {
412 cx18_writel(cx, req, &ack_mb->ack);
413 cx18_write_reg_expect(cx, ack_irq, SW2_INT_SET, ack_irq, ack_irq);
417 static int epu_dma_done_irq(struct cx18 *cx, struct cx18_in_work_order *order)
431 mb_ack_irq(cx, order);
437 cx18_readl(cx, cx->enc_mem + mdl_ack_offset + i);
440 mb_ack_irq(cx, order);
445 int epu_debug_irq(struct cx18 *cx, struct cx18_in_work_order *order)
453 cx18_setup_page(cx, str_offset);
454 cx18_memcpy_fromio(cx, str, cx->enc_mem + str_offset, 252);
456 cx18_setup_page(cx, SCB_OFFSET);
460 mb_ack_irq(cx, order);
466 int epu_cmd_irq(struct cx18 *cx, struct cx18_in_work_order *order)
475 ret = epu_dma_done_irq(cx, order);
478 ret = epu_debug_irq(cx, order);
498 struct cx18_in_work_order *alloc_in_work_order_irq(struct cx18 *cx)
512 if (atomic_read(&cx->in_work_order[i].pending) == 0) {
513 order = &cx->in_work_order[i];
521 void cx18_api_epu_cmd_irq(struct cx18 *cx, int rpu)
531 mb = &cx->scb->cpu2epu_mb;
534 mb = &cx->scb->apu2epu_mb;
540 order = alloc_in_work_order_irq(cx);
552 (&order_mb->cmd)[i] = cx18_readl(cx, &mb->cmd + i);
556 (&order_mb->request)[i] = cx18_readl(cx, &mb->request + i);
562 dump_mb(cx, order_mb, "incoming");
570 submit = epu_cmd_irq(cx, order);
572 queue_work(cx->in_work_queue, &order->work);
581 static int cx18_api_call(struct cx18 *cx, u32 cmd, int args, u32 data[])
612 waitq = &cx->mb_apu_waitq;
613 mb_lock = &cx->epu2apu_mb_lock;
615 mb = &cx->scb->epu2apu_mb;
618 waitq = &cx->mb_cpu_waitq;
619 mb_lock = &cx->epu2cpu_mb_lock;
621 mb = &cx->scb->epu2cpu_mb;
639 req = cx18_readl(cx, &mb->request);
642 (ack = cx18_readl(cx, &mb->ack)) == req,
646 cx18_writel(cx, req, &mb->ack);
656 cx18_writel(cx, cmd, &mb->cmd);
658 cx18_writel(cx, data[i], &mb->args[i]);
659 cx18_writel(cx, 0, &mb->error);
660 cx18_writel(cx, req, &mb->request);
661 cx18_writel(cx, req - 1, &mb->ack); /* ensure ack & req are distinct */
673 cx18_write_reg_expect(cx, irq, SW1_INT_SET, irq, irq);
676 ack = cx18_readl(cx, &mb->ack);
680 ack = cx18_readl(cx, &mb->ack);
711 data[i] = cx18_readl(cx, &mb->args[i]);
712 err = cx18_readl(cx, &mb->error);
729 int cx18_api(struct cx18 *cx, u32 cmd, int args, u32 data[])
731 return cx18_api_call(cx, cmd, args, data);
736 struct cx18 *cx = s->cx;
740 mode = (cx->filter_mode & 1) ? 2 : (cx->spatial_strength ? 1 : 0);
741 ret = cx18_vapi(cx, CX18_CPU_SET_FILTER_PARAM, 4,
742 s->handle, 1, mode, cx->spatial_strength);
743 mode = (cx->filter_mode & 2) ? 2 : (cx->temporal_strength ? 1 : 0);
744 ret = ret ? ret : cx18_vapi(cx, CX18_CPU_SET_FILTER_PARAM, 4,
745 s->handle, 0, mode, cx->temporal_strength);
746 ret = ret ? ret : cx18_vapi(cx, CX18_CPU_SET_FILTER_PARAM, 4,
747 s->handle, 2, cx->filter_mode >> 2, 0);
755 struct cx18 *cx = s->cx;
761 return cx18_vapi(cx, CX18_CPU_SET_VIDEO_IN, 6,
764 return cx18_vapi(cx, CX18_CPU_SET_VIDEO_RESOLUTION, 3,
767 return cx18_vapi(cx, CX18_CPU_SET_STREAM_OUTPUT_TYPE, 2,
770 return cx18_vapi(cx, CX18_CPU_SET_ASPECT_RATIO, 2,
774 return cx18_vapi(cx, CX18_CPU_SET_GOP_STRUCTURE, 3,
779 return cx18_vapi(cx, CX18_CPU_SET_AUDIO_PARAMETERS, 2,
782 return cx18_vapi(cx, CX18_CPU_SET_AUDIO_MUTE, 2,
785 return cx18_vapi(cx, CX18_CPU_SET_VIDEO_RATE, 5,
788 return cx18_vapi(cx, CX18_CPU_SET_VIDEO_MUTE, 2,
791 return cx18_vapi(cx, CX18_CPU_SET_SKIP_INPUT_FRAME, 2,
794 return cx18_vapi(cx, CX18_CPU_SET_MISC_PARAMETERS, 4,
797 cx->filter_mode = (data[0] & 3) | (data[1] << 2);
800 cx->spatial_strength = data[0];
801 cx->temporal_strength = data[1];
804 return cx18_vapi(cx, CX18_CPU_SET_SPATIAL_FILTER_TYPE, 3,
807 return cx18_vapi(cx, CX18_CPU_SET_MEDIAN_CORING, 5,
814 int cx18_vapi_result(struct cx18 *cx, u32 data[MAX_MB_ARGUMENTS],
824 return cx18_api(cx, cmd, args, data);
827 int cx18_vapi(struct cx18 *cx, u32 cmd, int args, ...)
833 if (cx == NULL) {
834 pr_err("cx == NULL (cmd=%x)\n", cmd);
845 return cx18_api(cx, cmd, args, data);