Lines Matching defs:vpdma
23 #include "vpdma.h"
26 #define VPDMA_FIRMWARE "vpdma-1b8.bin"
198 * vpdma data type so that we use the vpdma to re-order
280 static u32 read_reg(struct vpdma_data *vpdma, int offset)
282 return ioread32(vpdma->base + offset);
285 static void write_reg(struct vpdma_data *vpdma, int offset, u32 value)
287 iowrite32(value, vpdma->base + offset);
290 static int read_field_reg(struct vpdma_data *vpdma, int offset,
293 return (read_reg(vpdma, offset) & (mask << shift)) >> shift;
296 static void write_field_reg(struct vpdma_data *vpdma, int offset, u32 field,
299 u32 val = read_reg(vpdma, offset);
304 write_reg(vpdma, offset, val);
307 void vpdma_dump_regs(struct vpdma_data *vpdma)
309 struct device *dev = &vpdma->pdev->dev;
311 #define DUMPREG(r) dev_dbg(dev, "%-35s %08x\n", #r, read_reg(vpdma, VPDMA_##r))
389 int vpdma_map_desc_buf(struct vpdma_data *vpdma, struct vpdma_buf *buf)
391 struct device *dev = &vpdma->pdev->dev;
411 void vpdma_unmap_desc_buf(struct vpdma_data *vpdma, struct vpdma_buf *buf)
413 struct device *dev = &vpdma->pdev->dev;
426 * If the VPDMA was busy, this step makes vpdma to accept post lists.
430 int vpdma_list_cleanup(struct vpdma_data *vpdma, int list_num,
436 write_reg(vpdma, VPDMA_LIST_ATTR,
451 ret = vpdma_map_desc_buf(vpdma, &abort_list.buf);
454 ret = vpdma_submit_descs(vpdma, &abort_list, list_num);
458 while (vpdma_list_busy(vpdma, list_num) && --timeout)
462 dev_err(&vpdma->pdev->dev, "Timed out cleaning up VPDMA list\n");
467 vpdma_unmap_desc_buf(vpdma, &abort_list.buf);
519 bool vpdma_list_busy(struct vpdma_data *vpdma, int list_num)
521 return read_reg(vpdma, VPDMA_LIST_STAT_SYNC) & BIT(list_num + 16);
528 int vpdma_submit_descs(struct vpdma_data *vpdma,
534 if (vpdma_list_busy(vpdma, list_num))
540 spin_lock_irqsave(&vpdma->lock, flags);
541 write_reg(vpdma, VPDMA_LIST_ADDR, (u32) list->buf.dma_addr);
543 write_reg(vpdma, VPDMA_LIST_ATTR,
547 spin_unlock_irqrestore(&vpdma->lock, flags);
555 void vpdma_update_dma_addr(struct vpdma_data *vpdma,
564 vpdma_unmap_desc_buf(vpdma, &list->buf);
581 vpdma_map_desc_buf(vpdma, &list->buf);
587 void vpdma_set_max_size(struct vpdma_data *vpdma, int reg_addr,
594 write_field_reg(vpdma, reg_addr, width - 1,
597 write_field_reg(vpdma, reg_addr, height - 1,
797 * @list: vpdma desc list to which we add this descriptor
800 * @fmt: vpdma data format of the buffer
871 * @list: vpdma desc list to which we add this descriptor
874 * @fmt: vpdma data format of the buffer
939 int vpdma_hwlist_alloc(struct vpdma_data *vpdma, void *priv)
944 spin_lock_irqsave(&vpdma->lock, flags);
946 vpdma->hwlist_used[i] == true; i++)
951 vpdma->hwlist_used[i] = true;
952 vpdma->hwlist_priv[i] = priv;
954 spin_unlock_irqrestore(&vpdma->lock, flags);
960 void *vpdma_hwlist_get_priv(struct vpdma_data *vpdma, int list_num)
962 if (!vpdma || list_num >= VPDMA_MAX_NUM_LIST)
965 return vpdma->hwlist_priv[list_num];
969 void *vpdma_hwlist_release(struct vpdma_data *vpdma, int list_num)
974 spin_lock_irqsave(&vpdma->lock, flags);
975 vpdma->hwlist_used[list_num] = false;
976 priv = vpdma->hwlist_priv;
977 spin_unlock_irqrestore(&vpdma->lock, flags);
984 void vpdma_enable_list_complete_irq(struct vpdma_data *vpdma, int irq_num,
990 val = read_reg(vpdma, reg_addr);
995 write_reg(vpdma, reg_addr, val);
1000 unsigned int vpdma_get_list_stat(struct vpdma_data *vpdma, int irq_num)
1004 return read_reg(vpdma, reg_addr);
1009 unsigned int vpdma_get_list_mask(struct vpdma_data *vpdma, int irq_num)
1013 return read_reg(vpdma, reg_addr);
1018 void vpdma_clear_list_stat(struct vpdma_data *vpdma, int irq_num,
1023 write_reg(vpdma, reg_addr, 3 << (list_num * 2));
1027 void vpdma_set_bg_color(struct vpdma_data *vpdma,
1031 write_reg(vpdma, VPDMA_BG_RGB, color);
1033 write_reg(vpdma, VPDMA_BG_YUV, color);
1042 void vpdma_set_line_mode(struct vpdma_data *vpdma, int line_mode,
1047 write_field_reg(vpdma, client_cstat, line_mode,
1056 void vpdma_set_frame_start_event(struct vpdma_data *vpdma,
1062 write_field_reg(vpdma, client_cstat, fs_event,
1069 struct vpdma_data *vpdma = context;
1073 dev_dbg(&vpdma->pdev->dev, "firmware callback\n");
1076 dev_err(&vpdma->pdev->dev, "couldn't get firmware\n");
1081 if (read_field_reg(vpdma, VPDMA_LIST_ATTR, VPDMA_LIST_RDY_MASK,
1083 vpdma->cb(vpdma->pdev);
1089 dev_err(&vpdma->pdev->dev,
1096 vpdma_map_desc_buf(vpdma, &fw_dma_buf);
1098 write_reg(vpdma, VPDMA_LIST_ADDR, (u32) fw_dma_buf.dma_addr);
1103 if (read_field_reg(vpdma, VPDMA_LIST_ATTR, VPDMA_LIST_RDY_MASK,
1109 dev_err(&vpdma->pdev->dev, "firmware upload failed\n");
1113 vpdma->cb(vpdma->pdev);
1116 vpdma_unmap_desc_buf(vpdma, &fw_dma_buf);
1123 static int vpdma_load_firmware(struct vpdma_data *vpdma)
1126 struct device *dev = &vpdma->pdev->dev;
1129 (const char *) VPDMA_FIRMWARE, dev, GFP_KERNEL, vpdma,
1141 int vpdma_create(struct platform_device *pdev, struct vpdma_data *vpdma,
1149 vpdma->pdev = pdev;
1150 vpdma->cb = cb;
1151 spin_lock_init(&vpdma->lock);
1153 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "vpdma");
1159 vpdma->base = devm_ioremap(&pdev->dev, res->start, resource_size(res));
1160 if (!vpdma->base) {
1165 r = vpdma_load_firmware(vpdma);