root/drivers/media/platform/ti/vpe/vpdma_priv.h
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (c) 2013 Texas Instruments Inc.
 *
 * David Griego, <dagriego@biglakesoftware.com>
 * Dale Farnsworth, <dale@farnsworth.org>
 * Archit Taneja, <archit@ti.com>
 */

#ifndef _TI_VPDMA_PRIV_H_
#define _TI_VPDMA_PRIV_H_

/*
 * VPDMA Register offsets
 */

/* Top level */
#define VPDMA_PID               0x00
#define VPDMA_LIST_ADDR         0x04
#define VPDMA_LIST_ATTR         0x08
#define VPDMA_LIST_STAT_SYNC    0x0c
#define VPDMA_BG_RGB            0x18
#define VPDMA_BG_YUV            0x1c
#define VPDMA_SETUP             0x30
#define VPDMA_MAX_SIZE1         0x34
#define VPDMA_MAX_SIZE2         0x38
#define VPDMA_MAX_SIZE3         0x3c
#define VPDMA_MAX_SIZE_WIDTH_MASK       0xffff
#define VPDMA_MAX_SIZE_WIDTH_SHFT       16
#define VPDMA_MAX_SIZE_HEIGHT_MASK      0xffff
#define VPDMA_MAX_SIZE_HEIGHT_SHFT      0

/* Interrupts */
#define VPDMA_INT_CHAN_STAT(grp)        (0x40 + grp * 8)
#define VPDMA_INT_CHAN_MASK(grp)        (VPDMA_INT_CHAN_STAT(grp) + 4)
#define VPDMA_INT_CLIENT0_STAT          0x78
#define VPDMA_INT_CLIENT0_MASK          0x7c
#define VPDMA_INT_CLIENT1_STAT          0x80
#define VPDMA_INT_CLIENT1_MASK          0x84
#define VPDMA_INT_LIST0_STAT            0x88
#define VPDMA_INT_LIST0_MASK            0x8c

#define VPDMA_INTX_OFFSET               0x50

#define VPDMA_PERFMON(i)                (0x200 + i * 4)

/* VIP/VPE client registers */
#define VPDMA_DEI_CHROMA1_CSTAT         0x0300
#define VPDMA_DEI_LUMA1_CSTAT           0x0304
#define VPDMA_DEI_LUMA2_CSTAT           0x0308
#define VPDMA_DEI_CHROMA2_CSTAT         0x030c
#define VPDMA_DEI_LUMA3_CSTAT           0x0310
#define VPDMA_DEI_CHROMA3_CSTAT         0x0314
#define VPDMA_DEI_MV_IN_CSTAT           0x0330
#define VPDMA_DEI_MV_OUT_CSTAT          0x033c
#define VPDMA_VIP_LO_Y_CSTAT            0x0388
#define VPDMA_VIP_LO_UV_CSTAT           0x038c
#define VPDMA_VIP_UP_Y_CSTAT            0x0390
#define VPDMA_VIP_UP_UV_CSTAT           0x0394
#define VPDMA_VPI_CTL_CSTAT             0x03d0

/* Reg field info for VPDMA_CLIENT_CSTAT registers */
#define VPDMA_CSTAT_LINE_MODE_MASK      0x03
#define VPDMA_CSTAT_LINE_MODE_SHIFT     8
#define VPDMA_CSTAT_FRAME_START_MASK    0xf
#define VPDMA_CSTAT_FRAME_START_SHIFT   10

#define VPDMA_LIST_NUM_MASK             0x07
#define VPDMA_LIST_NUM_SHFT             24
#define VPDMA_LIST_STOP_SHFT            20
#define VPDMA_LIST_RDY_MASK             0x01
#define VPDMA_LIST_RDY_SHFT             19
#define VPDMA_LIST_TYPE_MASK            0x03
#define VPDMA_LIST_TYPE_SHFT            16
#define VPDMA_LIST_SIZE_MASK            0xffff

/*
 * The YUV data type definition below are taken from
 * both the TRM and i839 Errata information.
 * Use the correct data type considering byte
 * reordering of components.
 *
 * Also since the single use of "C" in the 422 case
 * to mean "Cr" (i.e. V component). It was decided
 * to explicitly label them CR to remove any confusion.
 * Bear in mind that the type label refer to the memory
 * packed order (LSB - MSB).
 */
#define DATA_TYPE_Y444                          0x0
#define DATA_TYPE_Y422                          0x1
#define DATA_TYPE_Y420                          0x2
#define DATA_TYPE_C444                          0x4
#define DATA_TYPE_C422                          0x5
#define DATA_TYPE_C420                          0x6
#define DATA_TYPE_CB420                         0x16
#define DATA_TYPE_YC444                         0x8
#define DATA_TYPE_YCB422                        0x7
#define DATA_TYPE_YCR422                        0x17
#define DATA_TYPE_CBY422                        0x27
#define DATA_TYPE_CRY422                        0x37

/*
 * The RGB data type definition below are defined
 * to follow Errata i819.
 * The initial values were taken from:
 * VPDMA_data_type_mapping_v0.2vayu_c.pdf
 * But some of the ARGB definition appeared to be wrong
 * in the document also. As they would yield RGBA instead.
 * They have been corrected based on experimentation.
 */
#define DATA_TYPE_RGB16_565                     0x10
#define DATA_TYPE_ARGB_1555                     0x13
#define DATA_TYPE_ARGB_4444                     0x14
#define DATA_TYPE_RGBA_5551                     0x11
#define DATA_TYPE_RGBA_4444                     0x12
#define DATA_TYPE_ARGB24_6666                   0x18
#define DATA_TYPE_RGB24_888                     0x16
#define DATA_TYPE_ARGB32_8888                   0x17
#define DATA_TYPE_RGBA24_6666                   0x15
#define DATA_TYPE_RGBA32_8888                   0x19
#define DATA_TYPE_BGR16_565                     0x0
#define DATA_TYPE_ABGR_1555                     0x3
#define DATA_TYPE_ABGR_4444                     0x4
#define DATA_TYPE_BGRA_5551                     0x1
#define DATA_TYPE_BGRA_4444                     0x2
#define DATA_TYPE_ABGR24_6666                   0x8
#define DATA_TYPE_BGR24_888                     0x6
#define DATA_TYPE_ABGR32_8888                   0x7
#define DATA_TYPE_BGRA24_6666                   0x5
#define DATA_TYPE_BGRA32_8888                   0x9

#define DATA_TYPE_MV                            0x3

/* VPDMA channel numbers, some are common between VIP/VPE and appear twice */
#define VPE_CHAN_NUM_LUMA1_IN           0
#define VPE_CHAN_NUM_CHROMA1_IN         1
#define VPE_CHAN_NUM_LUMA2_IN           2
#define VPE_CHAN_NUM_CHROMA2_IN         3
#define VPE_CHAN_NUM_LUMA3_IN           4
#define VPE_CHAN_NUM_CHROMA3_IN         5
#define VPE_CHAN_NUM_MV_IN              12
#define VPE_CHAN_NUM_MV_OUT             15
#define VIP1_CHAN_NUM_MULT_PORT_A_SRC0  38
#define VIP1_CHAN_NUM_MULT_ANC_A_SRC0   70
#define VPE_CHAN_NUM_LUMA_OUT           102
#define VPE_CHAN_NUM_CHROMA_OUT         103
#define VIP1_CHAN_NUM_PORT_A_LUMA       102
#define VIP1_CHAN_NUM_PORT_A_CHROMA     103
#define VPE_CHAN_NUM_RGB_OUT            106
#define VIP1_CHAN_NUM_PORT_A_RGB        106
#define VIP1_CHAN_NUM_PORT_B_RGB        107
/*
 * a VPDMA address data block payload for a configuration descriptor needs to
 * have each sub block length as a multiple of 16 bytes. Therefore, the overall
 * size of the payload also needs to be a multiple of 16 bytes. The sub block
 * lengths should be ensured to be aligned by the VPDMA user.
 */
#define VPDMA_ADB_SIZE_ALIGN            0x0f

/*
 * data transfer descriptor
 */
struct vpdma_dtd {
        u32                     type_ctl_stride;
        union {
                u32             xfer_length_height;
                u32             w1;
        };
        u32                     start_addr;
        u32                     pkt_ctl;
        union {
                u32             frame_width_height;     /* inbound */
                u32             desc_write_addr;        /* outbound */
        };
        union {
                u32             start_h_v;              /* inbound */
                u32             max_width_height;       /* outbound */
        };
        u32                     client_attr0;
        u32                     client_attr1;
};

/* Data Transfer Descriptor specifics */
#define DTD_NO_NOTIFY           0
#define DTD_NOTIFY              1

#define DTD_PKT_TYPE            0xa
#define DTD_DIR_IN              0
#define DTD_DIR_OUT             1

/* type_ctl_stride */
#define DTD_DATA_TYPE_MASK      0x3f
#define DTD_DATA_TYPE_SHFT      26
#define DTD_NOTIFY_MASK         0x01
#define DTD_NOTIFY_SHFT         25
#define DTD_FIELD_MASK          0x01
#define DTD_FIELD_SHFT          24
#define DTD_1D_MASK             0x01
#define DTD_1D_SHFT             23
#define DTD_EVEN_LINE_SKIP_MASK 0x01
#define DTD_EVEN_LINE_SKIP_SHFT 20
#define DTD_ODD_LINE_SKIP_MASK  0x01
#define DTD_ODD_LINE_SKIP_SHFT  16
#define DTD_LINE_STRIDE_MASK    0xffff
#define DTD_LINE_STRIDE_SHFT    0

/* xfer_length_height */
#define DTD_LINE_LENGTH_MASK    0xffff
#define DTD_LINE_LENGTH_SHFT    16
#define DTD_XFER_HEIGHT_MASK    0xffff
#define DTD_XFER_HEIGHT_SHFT    0

/* pkt_ctl */
#define DTD_PKT_TYPE_MASK       0x1f
#define DTD_PKT_TYPE_SHFT       27
#define DTD_MODE_MASK           0x01
#define DTD_MODE_SHFT           26
#define DTD_DIR_MASK            0x01
#define DTD_DIR_SHFT            25
#define DTD_CHAN_MASK           0x01ff
#define DTD_CHAN_SHFT           16
#define DTD_PRI_MASK            0x0f
#define DTD_PRI_SHFT            9
#define DTD_NEXT_CHAN_MASK      0x01ff
#define DTD_NEXT_CHAN_SHFT      0

/* frame_width_height */
#define DTD_FRAME_WIDTH_MASK    0xffff
#define DTD_FRAME_WIDTH_SHFT    16
#define DTD_FRAME_HEIGHT_MASK   0xffff
#define DTD_FRAME_HEIGHT_SHFT   0

/* start_h_v */
#define DTD_H_START_MASK        0xffff
#define DTD_H_START_SHFT        16
#define DTD_V_START_MASK        0xffff
#define DTD_V_START_SHFT        0

#define DTD_DESC_START_MASK     0xffffffe0
#define DTD_DESC_START_SHIFT    5
#define DTD_WRITE_DESC_MASK     0x01
#define DTD_WRITE_DESC_SHIFT    2
#define DTD_DROP_DATA_MASK      0x01
#define DTD_DROP_DATA_SHIFT     1
#define DTD_USE_DESC_MASK       0x01
#define DTD_USE_DESC_SHIFT      0

/* max_width_height */
#define DTD_MAX_WIDTH_MASK      0x07
#define DTD_MAX_WIDTH_SHFT      4
#define DTD_MAX_HEIGHT_MASK     0x07
#define DTD_MAX_HEIGHT_SHFT     0

static inline u32 dtd_type_ctl_stride(int type, bool notify, int field,
                        bool one_d, bool even_line_skip, bool odd_line_skip,
                        int line_stride)
{
        return (type << DTD_DATA_TYPE_SHFT) | (notify << DTD_NOTIFY_SHFT) |
                (field << DTD_FIELD_SHFT) | (one_d << DTD_1D_SHFT) |
                (even_line_skip << DTD_EVEN_LINE_SKIP_SHFT) |
                (odd_line_skip << DTD_ODD_LINE_SKIP_SHFT) |
                line_stride;
}

static inline u32 dtd_xfer_length_height(int line_length, int xfer_height)
{
        return (line_length << DTD_LINE_LENGTH_SHFT) | xfer_height;
}

static inline u32 dtd_pkt_ctl(bool mode, bool dir, int chan, int pri,
                        int next_chan)
{
        return (DTD_PKT_TYPE << DTD_PKT_TYPE_SHFT) | (mode << DTD_MODE_SHFT) |
                (dir << DTD_DIR_SHFT) | (chan << DTD_CHAN_SHFT) |
                (pri << DTD_PRI_SHFT) | next_chan;
}

static inline u32 dtd_frame_width_height(int width, int height)
{
        return (width << DTD_FRAME_WIDTH_SHFT) | height;
}

static inline u32 dtd_desc_write_addr(unsigned int addr, bool write_desc,
                        bool drop_data, bool use_desc)
{
        return (addr & DTD_DESC_START_MASK) |
                (write_desc << DTD_WRITE_DESC_SHIFT) |
                (drop_data << DTD_DROP_DATA_SHIFT) |
                use_desc;
}

static inline u32 dtd_start_h_v(int h_start, int v_start)
{
        return (h_start << DTD_H_START_SHFT) | v_start;
}

static inline u32 dtd_max_width_height(int max_width, int max_height)
{
        return (max_width << DTD_MAX_WIDTH_SHFT) | max_height;
}

static inline int dtd_get_data_type(struct vpdma_dtd *dtd)
{
        return dtd->type_ctl_stride >> DTD_DATA_TYPE_SHFT;
}

static inline bool dtd_get_notify(struct vpdma_dtd *dtd)
{
        return (dtd->type_ctl_stride >> DTD_NOTIFY_SHFT) & DTD_NOTIFY_MASK;
}

static inline int dtd_get_field(struct vpdma_dtd *dtd)
{
        return (dtd->type_ctl_stride >> DTD_FIELD_SHFT) & DTD_FIELD_MASK;
}

static inline bool dtd_get_1d(struct vpdma_dtd *dtd)
{
        return (dtd->type_ctl_stride >> DTD_1D_SHFT) & DTD_1D_MASK;
}

static inline bool dtd_get_even_line_skip(struct vpdma_dtd *dtd)
{
        return (dtd->type_ctl_stride >> DTD_EVEN_LINE_SKIP_SHFT)
                & DTD_EVEN_LINE_SKIP_MASK;
}

static inline bool dtd_get_odd_line_skip(struct vpdma_dtd *dtd)
{
        return (dtd->type_ctl_stride >> DTD_ODD_LINE_SKIP_SHFT)
                & DTD_ODD_LINE_SKIP_MASK;
}

static inline int dtd_get_line_stride(struct vpdma_dtd *dtd)
{
        return dtd->type_ctl_stride & DTD_LINE_STRIDE_MASK;
}

static inline int dtd_get_line_length(struct vpdma_dtd *dtd)
{
        return dtd->xfer_length_height >> DTD_LINE_LENGTH_SHFT;
}

static inline int dtd_get_xfer_height(struct vpdma_dtd *dtd)
{
        return dtd->xfer_length_height & DTD_XFER_HEIGHT_MASK;
}

static inline int dtd_get_pkt_type(struct vpdma_dtd *dtd)
{
        return dtd->pkt_ctl >> DTD_PKT_TYPE_SHFT;
}

static inline bool dtd_get_mode(struct vpdma_dtd *dtd)
{
        return (dtd->pkt_ctl >> DTD_MODE_SHFT) & DTD_MODE_MASK;
}

static inline bool dtd_get_dir(struct vpdma_dtd *dtd)
{
        return (dtd->pkt_ctl >> DTD_DIR_SHFT) & DTD_DIR_MASK;
}

static inline int dtd_get_chan(struct vpdma_dtd *dtd)
{
        return (dtd->pkt_ctl >> DTD_CHAN_SHFT) & DTD_CHAN_MASK;
}

static inline int dtd_get_priority(struct vpdma_dtd *dtd)
{
        return (dtd->pkt_ctl >> DTD_PRI_SHFT) & DTD_PRI_MASK;
}

static inline int dtd_get_next_chan(struct vpdma_dtd *dtd)
{
        return (dtd->pkt_ctl >> DTD_NEXT_CHAN_SHFT) & DTD_NEXT_CHAN_MASK;
}

static inline int dtd_get_frame_width(struct vpdma_dtd *dtd)
{
        return dtd->frame_width_height >> DTD_FRAME_WIDTH_SHFT;
}

static inline int dtd_get_frame_height(struct vpdma_dtd *dtd)
{
        return dtd->frame_width_height & DTD_FRAME_HEIGHT_MASK;
}

static inline int dtd_get_desc_write_addr(struct vpdma_dtd *dtd)
{
        return dtd->desc_write_addr & DTD_DESC_START_MASK;
}

static inline bool dtd_get_write_desc(struct vpdma_dtd *dtd)
{
        return (dtd->desc_write_addr >> DTD_WRITE_DESC_SHIFT) &
                                                        DTD_WRITE_DESC_MASK;
}

static inline bool dtd_get_drop_data(struct vpdma_dtd *dtd)
{
        return (dtd->desc_write_addr >> DTD_DROP_DATA_SHIFT) &
                                                        DTD_DROP_DATA_MASK;
}

static inline bool dtd_get_use_desc(struct vpdma_dtd *dtd)
{
        return dtd->desc_write_addr & DTD_USE_DESC_MASK;
}

static inline int dtd_get_h_start(struct vpdma_dtd *dtd)
{
        return dtd->start_h_v >> DTD_H_START_SHFT;
}

static inline int dtd_get_v_start(struct vpdma_dtd *dtd)
{
        return dtd->start_h_v & DTD_V_START_MASK;
}

static inline int dtd_get_max_width(struct vpdma_dtd *dtd)
{
        return (dtd->max_width_height >> DTD_MAX_WIDTH_SHFT) &
                                                        DTD_MAX_WIDTH_MASK;
}

static inline int dtd_get_max_height(struct vpdma_dtd *dtd)
{
        return (dtd->max_width_height >> DTD_MAX_HEIGHT_SHFT) &
                                                        DTD_MAX_HEIGHT_MASK;
}

/*
 * configuration descriptor
 */
struct vpdma_cfd {
        union {
                u32     dest_addr_offset;
                u32     w0;
        };
        union {
                u32     block_len;              /* in words */
                u32     w1;
        };
        u32             payload_addr;
        u32             ctl_payload_len;        /* in words */
};

/* Configuration descriptor specifics */

#define CFD_PKT_TYPE            0xb

#define CFD_DIRECT              1
#define CFD_INDIRECT            0
#define CFD_CLS_ADB             0
#define CFD_CLS_BLOCK           1

/* block_len */
#define CFD__BLOCK_LEN_MASK     0xffff
#define CFD__BLOCK_LEN_SHFT     0

/* ctl_payload_len */
#define CFD_PKT_TYPE_MASK       0x1f
#define CFD_PKT_TYPE_SHFT       27
#define CFD_DIRECT_MASK         0x01
#define CFD_DIRECT_SHFT         26
#define CFD_CLASS_MASK          0x03
#define CFD_CLASS_SHFT          24
#define CFD_DEST_MASK           0xff
#define CFD_DEST_SHFT           16
#define CFD_PAYLOAD_LEN_MASK    0xffff
#define CFD_PAYLOAD_LEN_SHFT    0

static inline u32 cfd_pkt_payload_len(bool direct, int cls, int dest,
                int payload_len)
{
        return (CFD_PKT_TYPE << CFD_PKT_TYPE_SHFT) |
                (direct << CFD_DIRECT_SHFT) |
                (cls << CFD_CLASS_SHFT) |
                (dest << CFD_DEST_SHFT) |
                payload_len;
}

static inline int cfd_get_pkt_type(struct vpdma_cfd *cfd)
{
        return cfd->ctl_payload_len >> CFD_PKT_TYPE_SHFT;
}

static inline bool cfd_get_direct(struct vpdma_cfd *cfd)
{
        return (cfd->ctl_payload_len >> CFD_DIRECT_SHFT) & CFD_DIRECT_MASK;
}

static inline bool cfd_get_class(struct vpdma_cfd *cfd)
{
        return (cfd->ctl_payload_len >> CFD_CLASS_SHFT) & CFD_CLASS_MASK;
}

static inline int cfd_get_dest(struct vpdma_cfd *cfd)
{
        return (cfd->ctl_payload_len >> CFD_DEST_SHFT) & CFD_DEST_MASK;
}

static inline int cfd_get_payload_len(struct vpdma_cfd *cfd)
{
        return cfd->ctl_payload_len & CFD_PAYLOAD_LEN_MASK;
}

/*
 * control descriptor
 */
struct vpdma_ctd {
        union {
                u32     timer_value;
                u32     list_addr;
                u32     w0;
        };
        union {
                u32     pixel_line_count;
                u32     list_size;
                u32     w1;
        };
        union {
                u32     event;
                u32     fid_ctl;
                u32     w2;
        };
        u32             type_source_ctl;
};

/* control descriptor types */
#define CTD_TYPE_SYNC_ON_CLIENT         0
#define CTD_TYPE_SYNC_ON_LIST           1
#define CTD_TYPE_SYNC_ON_EXT            2
#define CTD_TYPE_SYNC_ON_LM_TIMER       3
#define CTD_TYPE_SYNC_ON_CHANNEL        4
#define CTD_TYPE_CHNG_CLIENT_IRQ        5
#define CTD_TYPE_SEND_IRQ               6
#define CTD_TYPE_RELOAD_LIST            7
#define CTD_TYPE_ABORT_CHANNEL          8

#define CTD_PKT_TYPE            0xc

/* timer_value */
#define CTD_TIMER_VALUE_MASK    0xffff
#define CTD_TIMER_VALUE_SHFT    0

/* pixel_line_count */
#define CTD_PIXEL_COUNT_MASK    0xffff
#define CTD_PIXEL_COUNT_SHFT    16
#define CTD_LINE_COUNT_MASK     0xffff
#define CTD_LINE_COUNT_SHFT     0

/* list_size */
#define CTD_LIST_SIZE_MASK      0xffff
#define CTD_LIST_SIZE_SHFT      0

/* event */
#define CTD_EVENT_MASK          0x0f
#define CTD_EVENT_SHFT          0

/* fid_ctl */
#define CTD_FID2_MASK           0x03
#define CTD_FID2_SHFT           4
#define CTD_FID1_MASK           0x03
#define CTD_FID1_SHFT           2
#define CTD_FID0_MASK           0x03
#define CTD_FID0_SHFT           0

/* type_source_ctl */
#define CTD_PKT_TYPE_MASK       0x1f
#define CTD_PKT_TYPE_SHFT       27
#define CTD_SOURCE_MASK         0xff
#define CTD_SOURCE_SHFT         16
#define CTD_CONTROL_MASK        0x0f
#define CTD_CONTROL_SHFT        0

static inline u32 ctd_pixel_line_count(int pixel_count, int line_count)
{
        return (pixel_count << CTD_PIXEL_COUNT_SHFT) | line_count;
}

static inline u32 ctd_set_fid_ctl(int fid0, int fid1, int fid2)
{
        return (fid2 << CTD_FID2_SHFT) | (fid1 << CTD_FID1_SHFT) | fid0;
}

static inline u32 ctd_type_source_ctl(int source, int control)
{
        return (CTD_PKT_TYPE << CTD_PKT_TYPE_SHFT) |
                (source << CTD_SOURCE_SHFT) | control;
}

static inline u32 ctd_get_pixel_count(struct vpdma_ctd *ctd)
{
        return ctd->pixel_line_count >> CTD_PIXEL_COUNT_SHFT;
}

static inline int ctd_get_line_count(struct vpdma_ctd *ctd)
{
        return ctd->pixel_line_count & CTD_LINE_COUNT_MASK;
}

static inline int ctd_get_event(struct vpdma_ctd *ctd)
{
        return ctd->event & CTD_EVENT_MASK;
}

static inline int ctd_get_fid2_ctl(struct vpdma_ctd *ctd)
{
        return (ctd->fid_ctl >> CTD_FID2_SHFT) & CTD_FID2_MASK;
}

static inline int ctd_get_fid1_ctl(struct vpdma_ctd *ctd)
{
        return (ctd->fid_ctl >> CTD_FID1_SHFT) & CTD_FID1_MASK;
}

static inline int ctd_get_fid0_ctl(struct vpdma_ctd *ctd)
{
        return ctd->fid_ctl & CTD_FID2_MASK;
}

static inline int ctd_get_pkt_type(struct vpdma_ctd *ctd)
{
        return ctd->type_source_ctl >> CTD_PKT_TYPE_SHFT;
}

static inline int ctd_get_source(struct vpdma_ctd *ctd)
{
        return (ctd->type_source_ctl >> CTD_SOURCE_SHFT) & CTD_SOURCE_MASK;
}

static inline int ctd_get_ctl(struct vpdma_ctd *ctd)
{
        return ctd->type_source_ctl & CTD_CONTROL_MASK;
}

#endif