// SPDX-License-Identifier: GPL-2.0-only /* * Copyright (C) ST-Ericsson SA 2007-2010 * Author: Per Forlin <per.forlin@stericsson.com> for ST-Ericsson * Author: Jonas Aaberg <jonas.aberg@stericsson.com> for ST-Ericsson
*/
if ((cfg->dir == DMA_DEV_TO_MEM) ||
(cfg->dir == DMA_DEV_TO_DEV)) { /* Set master port to 1 */
src |= BIT(D40_SREG_CFG_MST_POS);
src |= D40_TYPE_TO_EVENT(cfg->dev_type);
if (cfg->src_info.flow_ctrl == STEDMA40_NO_FLOW_CTRL)
src |= BIT(D40_SREG_CFG_PHY_TM_POS); else
src |= 3 << D40_SREG_CFG_PHY_TM_POS;
} if ((cfg->dir == DMA_MEM_TO_DEV) ||
(cfg->dir == DMA_DEV_TO_DEV)) { /* Set master port to 1 */
dst |= BIT(D40_SREG_CFG_MST_POS);
dst |= D40_TYPE_TO_EVENT(cfg->dev_type);
if (cfg->dst_info.flow_ctrl == STEDMA40_NO_FLOW_CTRL)
dst |= BIT(D40_SREG_CFG_PHY_TM_POS); else
dst |= 3 << D40_SREG_CFG_PHY_TM_POS;
} /* Interrupt on end of transfer for destination */
dst |= BIT(D40_SREG_CFG_TIM_POS);
/* Set the priority bit to high for the physical channel */ if (cfg->high_priority) {
src |= BIT(D40_SREG_CFG_PRI_POS);
dst |= BIT(D40_SREG_CFG_PRI_POS);
}
if (cfg->src_info.big_endian)
src |= BIT(D40_SREG_CFG_LBE_POS); if (cfg->dst_info.big_endian)
dst |= BIT(D40_SREG_CFG_LBE_POS);
/* Must be aligned */ if (!IS_ALIGNED(data, data_width)) return -EINVAL;
/* Transfer size can't be smaller than (num_elms * elem_size) */ if (data_size < num_elems * data_width) return -EINVAL;
/* The number of elements. IE now many chunks */
lli->reg_elt = (data_size / data_width) << D40_SREG_ELEM_PHY_ECNT_POS;
/* * Distance to next element sized entry. * Usually the size of the element unless you want gaps.
*/ if (addr_inc)
lli->reg_elt |= data_width << D40_SREG_ELEM_PHY_EIDX_POS;
/* Where the data is */
lli->reg_ptr = data;
lli->reg_cfg = reg_cfg;
/* If this scatter list entry is the last one, no next link */ if (next_lli == 0)
lli->reg_lnk = BIT(D40_SREG_LNK_PHY_TCP_POS); else
lli->reg_lnk = next_lli;
/* Set/clear interrupt generation on this link item.*/ if (term_int)
lli->reg_cfg |= BIT(D40_SREG_CFG_TIM_POS); else
lli->reg_cfg &= ~BIT(D40_SREG_CFG_TIM_POS);
/* * Post link - D40_SREG_LNK_PHY_PRE_POS = 0 * Relink happens after transfer completion.
*/
/* 16 LSBs address of the current element */
lli->lcsp02 |= data & D40_MEM_LCSP0_SPTR_MASK; /* 16 MSBs address of the current element */
lli->lcsp13 |= data & D40_MEM_LCSP1_SPTR_MASK;
if (addr_inc)
lli->lcsp13 |= D40_MEM_LCSP1_SCFG_INCR_MASK;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.