diff options
Diffstat (limited to 'drivers/mxc/hdp/API_AFE.c')
-rw-r--r-- | drivers/mxc/hdp/API_AFE.c | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/drivers/mxc/hdp/API_AFE.c b/drivers/mxc/hdp/API_AFE.c new file mode 100644 index 000000000000..060a6a495710 --- /dev/null +++ b/drivers/mxc/hdp/API_AFE.c @@ -0,0 +1,188 @@ +/****************************************************************************** + * + * Copyright (C) 2016-2017 Cadence Design Systems, Inc. + * All rights reserved worldwide. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Copyright 2017-2018 NXP + * + ****************************************************************************** + * + * API_AFE.c + * + ****************************************************************************** + */ + +#include "address.h" +#include "API_AFE.h" +#include "API_General.h" + +void Afe_write(state_struct *state, u32 offset, u16 val) +{ + CDN_API_STATUS sts; + + sts = + CDN_API_General_Write_Register_blocking(state, + ADDR_AFE + (offset << 2), + val); + + if (sts != CDN_OK) { + pr_err + ("CDN_API_General_Write_Register_blocking(0x%.8X, 0x%.8X) returned %d\n", + offset, val, (int)sts); + } +} + +u16 Afe_read(state_struct *state, u32 offset) +{ + GENERAL_Read_Register_response resp; + CDN_API_STATUS sts; + + sts = + CDN_API_General_Read_Register_blocking(state, + ADDR_AFE + (offset << 2), + &resp); + + if (sts != CDN_OK) { + pr_err + ("CDN_API_General_Read_Register_blocking(0x%.8X) returned %d\n", + offset, (int)sts); + } + return resp.val; +} + +void set_field_value(reg_field_t *reg_field, u32 value) +{ + u8 length; + u32 max_value; + u32 trunc_val; + length = (reg_field->msb - reg_field->lsb + 1); + + max_value = (1 << length) - 1; + if (value > max_value) { + trunc_val = value; + trunc_val &= (1 << length) - 1; + pr_err("set_field_value() Error! Specified value (0x%0X)\ + exceeds field capacity - it will by truncated to\ + 0x%0X (%0d-bit field - max value: %0d dec)\n", + value, trunc_val, length, max_value); + } else + reg_field->value = value; +} + +int set_reg_value(reg_field_t reg_field) +{ + return reg_field.value << reg_field.lsb; +} + +int inside(u32 value, u32 left_sharp_corner, u32 right_sharp_corner) +{ + if (value < left_sharp_corner) + return 0; + if (value > right_sharp_corner) + return 0; + return 1; +} + +int get_table_row_match_column( + const u32 *array, + u32 table_rows, + u32 table_cols, + u32 start_row, + u32 column_to_search, + u32 value_to_search_in_column) +{ + u32 idx_cols, idx_rows; + u32 value; + + for (idx_rows = start_row; idx_rows < table_rows; idx_rows++) { + for (idx_cols = 0; idx_cols < table_cols; idx_cols++) { + if (idx_cols == column_to_search) { + value = *((array + idx_rows * table_cols) + + idx_cols); + if (value == value_to_search_in_column) { + return idx_rows; + } + } + } + } + return -1; +} + +int get_table_row( + const u32 *array, + u32 table_rows, + u32 table_cols, + u32 variable_in_range, + u32 range_min_column, + u32 range_max_column, + u32 column_to_search, + u32 column_value) +{ + u32 i = 0; + while (1) { + i = get_table_row_match_column(array, table_rows, table_cols, i, + column_to_search, column_value); + if (i + 1) { + if (inside(variable_in_range, + *((array + i * table_cols) + + range_min_column), + *((array + i * table_cols) + + range_max_column))) { + break; + } + i++; + } else { + break; + } + } + return i; +} + +u8 AFE_check_rate_supported(ENUM_AFE_LINK_RATE rate) +{ + switch (rate) { + case AFE_LINK_RATE_1_6: + case AFE_LINK_RATE_2_1: + case AFE_LINK_RATE_2_4: + case AFE_LINK_RATE_2_7: + case AFE_LINK_RATE_3_2: + case AFE_LINK_RATE_4_3: + case AFE_LINK_RATE_5_4: + return 1; + default: + return 0; + } +} + |