Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300     1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300     2)   Copyright (c), 2004-2005,2007-2010 Trident Microsystems, Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300     3)   All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300     4) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300     5)   Redistribution and use in source and binary forms, with or without
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300     6)   modification, are permitted provided that the following conditions are met:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300     7) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300     8)   * Redistributions of source code must retain the above copyright notice,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300     9)     this list of conditions and the following disclaimer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    10)   * Redistributions in binary form must reproduce the above copyright notice,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    11)     this list of conditions and the following disclaimer in the documentation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    12) 	and/or other materials provided with the distribution.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    13)   * Neither the name of Trident Microsystems nor Hauppauge Computer Works
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    14)     nor the names of its contributors may be used to endorse or promote
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    15) 	products derived from this software without specific prior written
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    16) 	permission.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    17) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    18)   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    19)   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    20)   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    21)   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    22)   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    23)   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    24)   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    25)   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    26)   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    27)   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    28)   POSSIBILITY OF SUCH DAMAGE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    29) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    30)   DRXJ specific implementation of DRX driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    31)   authors: Dragan Savic, Milos Nikolic, Mihajlo Katona, Tao Ding, Paul Janssen
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    32) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    33)   The Linux DVB Driver for Micronas DRX39xx family (drx3933j) was
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    34)   written by Devin Heitmueller <devin.heitmueller@kernellabs.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    35) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    36)   This program is free software; you can redistribute it and/or modify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    37)   it under the terms of the GNU General Public License as published by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    38)   the Free Software Foundation; either version 2 of the License, or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    39)   (at your option) any later version.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    40) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    41)   This program is distributed in the hope that it will be useful,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    42)   but WITHOUT ANY WARRANTY; without even the implied warranty of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    43)   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    44) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    45)   GNU General Public License for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    46) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    47)   You should have received a copy of the GNU General Public License
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    48)   along with this program; if not, write to the Free Software
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    49)   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    50) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    51) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    52) /*-----------------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    53) INCLUDE FILES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    54) ----------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    55) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    56) #define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    57) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    58) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    59) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    60) #include <linux/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    61) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    62) #include <asm/div64.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    63) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    64) #include <media/dvb_frontend.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    65) #include "drx39xxj.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    66) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    67) #include "drxj.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    68) #include "drxj_map.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    69) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    70) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    71) /*=== DEFINES ================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    72) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    73) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    74) #define DRX39XX_MAIN_FIRMWARE "dvb-fe-drxj-mc-1.0.8.fw"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    75) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    76) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    77) * \brief Maximum u32 value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    78) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    79) #ifndef MAX_U32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    80) #define MAX_U32  ((u32) (0xFFFFFFFFL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    81) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    82) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    83) /* Customer configurable hardware settings, etc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    84) #ifndef MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    85) #define MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    86) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    87) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    88) #ifndef MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    89) #define MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    90) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    91) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    92) #ifndef MPEG_OUTPUT_CLK_DRIVE_STRENGTH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    93) #define MPEG_OUTPUT_CLK_DRIVE_STRENGTH 0x06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    94) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    95) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    96) #ifndef OOB_CRX_DRIVE_STRENGTH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    97) #define OOB_CRX_DRIVE_STRENGTH 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    98) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    99) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   100) #ifndef OOB_DRX_DRIVE_STRENGTH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   101) #define OOB_DRX_DRIVE_STRENGTH 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   102) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   103) /*** START DJCOMBO patches to DRXJ registermap constants *********************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   104) /*** registermap 200706071303 from drxj **************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   105) #define   ATV_TOP_CR_AMP_TH_FM                                              0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   106) #define   ATV_TOP_CR_AMP_TH_L                                               0xA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   107) #define   ATV_TOP_CR_AMP_TH_LP                                              0xA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   108) #define   ATV_TOP_CR_AMP_TH_BG                                              0x8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   109) #define   ATV_TOP_CR_AMP_TH_DK                                              0x8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   110) #define   ATV_TOP_CR_AMP_TH_I                                               0x8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   111) #define     ATV_TOP_CR_CONT_CR_D_MN                                         0x18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   112) #define     ATV_TOP_CR_CONT_CR_D_FM                                         0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   113) #define     ATV_TOP_CR_CONT_CR_D_L                                          0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   114) #define     ATV_TOP_CR_CONT_CR_D_LP                                         0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   115) #define     ATV_TOP_CR_CONT_CR_D_BG                                         0x18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   116) #define     ATV_TOP_CR_CONT_CR_D_DK                                         0x18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   117) #define     ATV_TOP_CR_CONT_CR_D_I                                          0x18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   118) #define     ATV_TOP_CR_CONT_CR_I_MN                                         0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   119) #define     ATV_TOP_CR_CONT_CR_I_FM                                         0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   120) #define     ATV_TOP_CR_CONT_CR_I_L                                          0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   121) #define     ATV_TOP_CR_CONT_CR_I_LP                                         0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   122) #define     ATV_TOP_CR_CONT_CR_I_BG                                         0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   123) #define     ATV_TOP_CR_CONT_CR_I_DK                                         0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   124) #define     ATV_TOP_CR_CONT_CR_I_I                                          0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   125) #define     ATV_TOP_CR_CONT_CR_P_MN                                         0x4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   126) #define     ATV_TOP_CR_CONT_CR_P_FM                                         0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   127) #define     ATV_TOP_CR_CONT_CR_P_L                                          0x4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   128) #define     ATV_TOP_CR_CONT_CR_P_LP                                         0x4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   129) #define     ATV_TOP_CR_CONT_CR_P_BG                                         0x4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   130) #define     ATV_TOP_CR_CONT_CR_P_DK                                         0x4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   131) #define     ATV_TOP_CR_CONT_CR_P_I                                          0x4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   132) #define   ATV_TOP_CR_OVM_TH_MN                                              0xA0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   133) #define   ATV_TOP_CR_OVM_TH_FM                                              0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   134) #define   ATV_TOP_CR_OVM_TH_L                                               0xA0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   135) #define   ATV_TOP_CR_OVM_TH_LP                                              0xA0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   136) #define   ATV_TOP_CR_OVM_TH_BG                                              0xA0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   137) #define   ATV_TOP_CR_OVM_TH_DK                                              0xA0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   138) #define   ATV_TOP_CR_OVM_TH_I                                               0xA0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   139) #define     ATV_TOP_EQU0_EQU_C0_FM                                          0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   140) #define     ATV_TOP_EQU0_EQU_C0_L                                           0x3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   141) #define     ATV_TOP_EQU0_EQU_C0_LP                                          0x3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   142) #define     ATV_TOP_EQU0_EQU_C0_BG                                          0x7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   143) #define     ATV_TOP_EQU0_EQU_C0_DK                                          0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   144) #define     ATV_TOP_EQU0_EQU_C0_I                                           0x3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   145) #define     ATV_TOP_EQU1_EQU_C1_FM                                          0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   146) #define     ATV_TOP_EQU1_EQU_C1_L                                           0x1F6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   147) #define     ATV_TOP_EQU1_EQU_C1_LP                                          0x1F6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   148) #define     ATV_TOP_EQU1_EQU_C1_BG                                          0x197
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   149) #define     ATV_TOP_EQU1_EQU_C1_DK                                          0x198
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   150) #define     ATV_TOP_EQU1_EQU_C1_I                                           0x1F6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   151) #define     ATV_TOP_EQU2_EQU_C2_FM                                          0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   152) #define     ATV_TOP_EQU2_EQU_C2_L                                           0x28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   153) #define     ATV_TOP_EQU2_EQU_C2_LP                                          0x28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   154) #define     ATV_TOP_EQU2_EQU_C2_BG                                          0xC5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   155) #define     ATV_TOP_EQU2_EQU_C2_DK                                          0xB0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   156) #define     ATV_TOP_EQU2_EQU_C2_I                                           0x28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   157) #define     ATV_TOP_EQU3_EQU_C3_FM                                          0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   158) #define     ATV_TOP_EQU3_EQU_C3_L                                           0x192
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   159) #define     ATV_TOP_EQU3_EQU_C3_LP                                          0x192
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   160) #define     ATV_TOP_EQU3_EQU_C3_BG                                          0x12E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   161) #define     ATV_TOP_EQU3_EQU_C3_DK                                          0x18E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   162) #define     ATV_TOP_EQU3_EQU_C3_I                                           0x192
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   163) #define     ATV_TOP_STD_MODE_MN                                             0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   164) #define     ATV_TOP_STD_MODE_FM                                             0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   165) #define     ATV_TOP_STD_MODE_L                                              0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   166) #define     ATV_TOP_STD_MODE_LP                                             0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   167) #define     ATV_TOP_STD_MODE_BG                                             0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   168) #define     ATV_TOP_STD_MODE_DK                                             0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   169) #define     ATV_TOP_STD_MODE_I                                              0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   170) #define     ATV_TOP_STD_VID_POL_MN                                          0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   171) #define     ATV_TOP_STD_VID_POL_FM                                          0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   172) #define     ATV_TOP_STD_VID_POL_L                                           0x2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   173) #define     ATV_TOP_STD_VID_POL_LP                                          0x2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   174) #define     ATV_TOP_STD_VID_POL_BG                                          0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   175) #define     ATV_TOP_STD_VID_POL_DK                                          0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   176) #define     ATV_TOP_STD_VID_POL_I                                           0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   177) #define   ATV_TOP_VID_AMP_MN                                                0x380
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   178) #define   ATV_TOP_VID_AMP_FM                                                0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   179) #define   ATV_TOP_VID_AMP_L                                                 0xF50
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   180) #define   ATV_TOP_VID_AMP_LP                                                0xF50
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   181) #define   ATV_TOP_VID_AMP_BG                                                0x380
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   182) #define   ATV_TOP_VID_AMP_DK                                                0x394
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   183) #define   ATV_TOP_VID_AMP_I                                                 0x3D8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   184) #define   IQM_CF_OUT_ENA_OFDM__M                                            0x4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   185) #define     IQM_FS_ADJ_SEL_B_QAM                                            0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   186) #define     IQM_FS_ADJ_SEL_B_OFF                                            0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   187) #define     IQM_FS_ADJ_SEL_B_VSB                                            0x2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   188) #define     IQM_RC_ADJ_SEL_B_OFF                                            0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   189) #define     IQM_RC_ADJ_SEL_B_QAM                                            0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   190) #define     IQM_RC_ADJ_SEL_B_VSB                                            0x2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   191) /*** END DJCOMBO patches to DRXJ registermap *********************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   192) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   193) #include "drx_driver_version.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   194) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   195) /* #define DRX_DEBUG */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   196) #ifdef DRX_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   197) #include <stdio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   198) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   199) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   200) /*-----------------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   201) ENUMS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   202) ----------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   203) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   204) /*-----------------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   205) DEFINES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   206) ----------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   207) #ifndef DRXJ_WAKE_UP_KEY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   208) #define DRXJ_WAKE_UP_KEY (demod->my_i2c_dev_addr->i2c_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   209) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   210) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   211) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   212) * \def DRXJ_DEF_I2C_ADDR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   213) * \brief Default I2C address of a demodulator instance.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   214) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   215) #define DRXJ_DEF_I2C_ADDR (0x52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   216) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   217) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   218) * \def DRXJ_DEF_DEMOD_DEV_ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   219) * \brief Default device identifier of a demodultor instance.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   220) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   221) #define DRXJ_DEF_DEMOD_DEV_ID      (1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   222) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   223) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   224) * \def DRXJ_SCAN_TIMEOUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   225) * \brief Timeout value for waiting on demod lock during channel scan (millisec).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   226) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   227) #define DRXJ_SCAN_TIMEOUT    1000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   228) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   229) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   230) * \def HI_I2C_DELAY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   231) * \brief HI timing delay for I2C timing (in nano seconds)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   232) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   233) *  Used to compute HI_CFG_DIV
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   234) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   235) #define HI_I2C_DELAY    42
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   236) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   237) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   238) * \def HI_I2C_BRIDGE_DELAY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   239) * \brief HI timing delay for I2C timing (in nano seconds)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   240) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   241) *  Used to compute HI_CFG_BDL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   242) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   243) #define HI_I2C_BRIDGE_DELAY   750
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   244) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   245) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   246) * \brief Time Window for MER and SER Measurement in Units of Segment duration.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   247) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   248) #define VSB_TOP_MEASUREMENT_PERIOD  64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   249) #define SYMBOLS_PER_SEGMENT         832
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   250) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   251) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   252) * \brief bit rate and segment rate constants used for SER and BER.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   253) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   254) /* values taken from the QAM microcode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   255) #define DRXJ_QAM_SL_SIG_POWER_QAM_UNKNOWN 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   256) #define DRXJ_QAM_SL_SIG_POWER_QPSK        32768
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   257) #define DRXJ_QAM_SL_SIG_POWER_QAM8        24576
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   258) #define DRXJ_QAM_SL_SIG_POWER_QAM16       40960
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   259) #define DRXJ_QAM_SL_SIG_POWER_QAM32       20480
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   260) #define DRXJ_QAM_SL_SIG_POWER_QAM64       43008
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   261) #define DRXJ_QAM_SL_SIG_POWER_QAM128      20992
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   262) #define DRXJ_QAM_SL_SIG_POWER_QAM256      43520
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   263) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   264) * \brief Min supported symbolrates.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   265) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   266) #ifndef DRXJ_QAM_SYMBOLRATE_MIN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   267) #define DRXJ_QAM_SYMBOLRATE_MIN          (520000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   268) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   269) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   270) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   271) * \brief Max supported symbolrates.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   272) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   273) #ifndef DRXJ_QAM_SYMBOLRATE_MAX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   274) #define DRXJ_QAM_SYMBOLRATE_MAX         (7233000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   275) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   276) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   277) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   278) * \def DRXJ_QAM_MAX_WAITTIME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   279) * \brief Maximal wait time for QAM auto constellation in ms
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   280) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   281) #ifndef DRXJ_QAM_MAX_WAITTIME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   282) #define DRXJ_QAM_MAX_WAITTIME 900
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   283) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   284) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   285) #ifndef DRXJ_QAM_FEC_LOCK_WAITTIME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   286) #define DRXJ_QAM_FEC_LOCK_WAITTIME 150
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   287) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   288) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   289) #ifndef DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   290) #define DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME 200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   291) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   292) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   293) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   294) * \def SCU status and results
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   295) * \brief SCU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   296) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   297) #define DRX_SCU_READY               0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   298) #define DRXJ_MAX_WAITTIME           100	/* ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   299) #define FEC_RS_MEASUREMENT_PERIOD   12894	/* 1 sec */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   300) #define FEC_RS_MEASUREMENT_PRESCALE 1	/* n sec */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   301) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   302) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   303) * \def DRX_AUD_MAX_DEVIATION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   304) * \brief Needed for calculation of prescale feature in AUD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   305) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   306) #ifndef DRXJ_AUD_MAX_FM_DEVIATION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   307) #define DRXJ_AUD_MAX_FM_DEVIATION  100	/* kHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   308) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   309) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   310) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   311) * \brief Needed for calculation of NICAM prescale feature in AUD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   312) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   313) #ifndef DRXJ_AUD_MAX_NICAM_PRESCALE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   314) #define DRXJ_AUD_MAX_NICAM_PRESCALE  (9)	/* dB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   315) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   316) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   317) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   318) * \brief Needed for calculation of NICAM prescale feature in AUD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   319) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   320) #ifndef DRXJ_AUD_MAX_WAITTIME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   321) #define DRXJ_AUD_MAX_WAITTIME  250	/* ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   322) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   323) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   324) /* ATV config changed flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   325) #define DRXJ_ATV_CHANGED_COEF          (0x00000001UL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   326) #define DRXJ_ATV_CHANGED_PEAK_FLT      (0x00000008UL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   327) #define DRXJ_ATV_CHANGED_NOISE_FLT     (0x00000010UL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   328) #define DRXJ_ATV_CHANGED_OUTPUT        (0x00000020UL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   329) #define DRXJ_ATV_CHANGED_SIF_ATT       (0x00000040UL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   330) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   331) /* UIO define */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   332) #define DRX_UIO_MODE_FIRMWARE_SMA DRX_UIO_MODE_FIRMWARE0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   333) #define DRX_UIO_MODE_FIRMWARE_SAW DRX_UIO_MODE_FIRMWARE1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   334) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   335) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   336)  * MICROCODE RELATED DEFINES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   337)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   338) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   339) /* Magic word for checking correct Endianness of microcode data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   340) #define DRX_UCODE_MAGIC_WORD         ((((u16)'H')<<8)+((u16)'L'))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   341) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   342) /* CRC flag in ucode header, flags field. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   343) #define DRX_UCODE_CRC_FLAG           (0x0001)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   344) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   345) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   346)  * Maximum size of buffer used to verify the microcode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   347)  * Must be an even number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   348)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   349) #define DRX_UCODE_MAX_BUF_SIZE       (DRXDAP_MAX_RCHUNKSIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   350) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   351) #if DRX_UCODE_MAX_BUF_SIZE & 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   352) #error DRX_UCODE_MAX_BUF_SIZE must be an even number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   353) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   354) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   355) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   356)  * Power mode macros
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   357)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   358) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   359) #define DRX_ISPOWERDOWNMODE(mode) ((mode == DRX_POWER_MODE_9) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   360) 				       (mode == DRX_POWER_MODE_10) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   361) 				       (mode == DRX_POWER_MODE_11) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   362) 				       (mode == DRX_POWER_MODE_12) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   363) 				       (mode == DRX_POWER_MODE_13) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   364) 				       (mode == DRX_POWER_MODE_14) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   365) 				       (mode == DRX_POWER_MODE_15) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   366) 				       (mode == DRX_POWER_MODE_16) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   367) 				       (mode == DRX_POWER_DOWN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   368) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   369) /* Pin safe mode macro */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   370) #define DRXJ_PIN_SAFE_MODE 0x0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   371) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   372) /*=== GLOBAL VARIABLEs =======================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   373) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   374) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   375) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   376) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   377) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   378) * \brief Temporary register definitions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   379) *        (register definitions that are not yet available in register master)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   380) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   381) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   382) /*****************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   383) /* Audio block 0x103 is write only. To avoid shadowing in driver accessing   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   384) /* RAM addresses directly. This must be READ ONLY to avoid problems.         */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   385) /* Writing to the interface addresses are more than only writing the RAM     */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   386) /* locations                                                                 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   387) /*****************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   388) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   389) * \brief RAM location of MODUS registers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   390) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   391) #define AUD_DEM_RAM_MODUS_HI__A              0x10204A3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   392) #define AUD_DEM_RAM_MODUS_HI__M              0xF000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   393) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   394) #define AUD_DEM_RAM_MODUS_LO__A              0x10204A4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   395) #define AUD_DEM_RAM_MODUS_LO__M              0x0FFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   396) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   397) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   398) * \brief RAM location of I2S config registers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   399) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   400) #define AUD_DEM_RAM_I2S_CONFIG1__A           0x10204B1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   401) #define AUD_DEM_RAM_I2S_CONFIG2__A           0x10204B2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   402) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   403) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   404) * \brief RAM location of DCO config registers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   405) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   406) #define AUD_DEM_RAM_DCO_B_HI__A              0x1020461
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   407) #define AUD_DEM_RAM_DCO_B_LO__A              0x1020462
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   408) #define AUD_DEM_RAM_DCO_A_HI__A              0x1020463
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   409) #define AUD_DEM_RAM_DCO_A_LO__A              0x1020464
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   410) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   411) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   412) * \brief RAM location of Threshold registers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   413) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   414) #define AUD_DEM_RAM_NICAM_THRSHLD__A         0x102045A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   415) #define AUD_DEM_RAM_A2_THRSHLD__A            0x10204BB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   416) #define AUD_DEM_RAM_BTSC_THRSHLD__A          0x10204A6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   417) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   418) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   419) * \brief RAM location of Carrier Threshold registers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   420) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   421) #define AUD_DEM_RAM_CM_A_THRSHLD__A          0x10204AF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   422) #define AUD_DEM_RAM_CM_B_THRSHLD__A          0x10204B0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   423) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   424) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   425) * \brief FM Matrix register fix
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   426) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   427) #ifdef AUD_DEM_WR_FM_MATRIX__A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   428) #undef  AUD_DEM_WR_FM_MATRIX__A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   429) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   430) #define AUD_DEM_WR_FM_MATRIX__A              0x105006F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   431) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   432) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   433) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   434) * \brief Defines required for audio
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   435) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   436) #define AUD_VOLUME_ZERO_DB                      115
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   437) #define AUD_VOLUME_DB_MIN                       -60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   438) #define AUD_VOLUME_DB_MAX                       12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   439) #define AUD_CARRIER_STRENGTH_QP_0DB             0x4000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   440) #define AUD_CARRIER_STRENGTH_QP_0DB_LOG10T100   421
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   441) #define AUD_MAX_AVC_REF_LEVEL                   15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   442) #define AUD_I2S_FREQUENCY_MAX                   48000UL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   443) #define AUD_I2S_FREQUENCY_MIN                   12000UL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   444) #define AUD_RDS_ARRAY_SIZE                      18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   445) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   446) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   447) * \brief Needed for calculation of prescale feature in AUD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   448) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   449) #ifndef DRX_AUD_MAX_FM_DEVIATION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   450) #define DRX_AUD_MAX_FM_DEVIATION  (100)	/* kHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   451) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   452) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   453) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   454) * \brief Needed for calculation of NICAM prescale feature in AUD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   455) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   456) #ifndef DRX_AUD_MAX_NICAM_PRESCALE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   457) #define DRX_AUD_MAX_NICAM_PRESCALE  (9)	/* dB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   458) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   459) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   460) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   461) /* Values for I2S Master/Slave pin configurations */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   462) #define SIO_PDR_I2S_CL_CFG_MODE__MASTER      0x0004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   463) #define SIO_PDR_I2S_CL_CFG_DRIVE__MASTER     0x0008
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   464) #define SIO_PDR_I2S_CL_CFG_MODE__SLAVE       0x0004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   465) #define SIO_PDR_I2S_CL_CFG_DRIVE__SLAVE      0x0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   466) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   467) #define SIO_PDR_I2S_DA_CFG_MODE__MASTER      0x0003
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   468) #define SIO_PDR_I2S_DA_CFG_DRIVE__MASTER     0x0008
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   469) #define SIO_PDR_I2S_DA_CFG_MODE__SLAVE       0x0003
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   470) #define SIO_PDR_I2S_DA_CFG_DRIVE__SLAVE      0x0008
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   471) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   472) #define SIO_PDR_I2S_WS_CFG_MODE__MASTER      0x0004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   473) #define SIO_PDR_I2S_WS_CFG_DRIVE__MASTER     0x0008
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   474) #define SIO_PDR_I2S_WS_CFG_MODE__SLAVE       0x0004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   475) #define SIO_PDR_I2S_WS_CFG_DRIVE__SLAVE      0x0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   476) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   477) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   478) /*=== REGISTER ACCESS MACROS =================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   479) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   480) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   481) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   482) * This macro is used to create byte arrays for block writes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   483) * Block writes speed up I2C traffic between host and demod.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   484) * The macro takes care of the required byte order in a 16 bits word.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   485) * x -> lowbyte(x), highbyte(x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   486) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   487) #define DRXJ_16TO8(x) ((u8) (((u16)x) & 0xFF)), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   488) 		       ((u8)((((u16)x)>>8)&0xFF))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   489) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   490) * This macro is used to convert byte array to 16 bit register value for block read.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   491) * Block read speed up I2C traffic between host and demod.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   492) * The macro takes care of the required byte order in a 16 bits word.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   493) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   494) #define DRXJ_8TO16(x) ((u16) (x[0] | (x[1] << 8)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   495) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   496) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   497) /*=== MISC DEFINES ===========================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   498) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   499) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   500) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   501) /*=== HI COMMAND RELATED DEFINES =============================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   502) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   503) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   504) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   505) * \brief General maximum number of retries for ucode command interfaces
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   506) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   507) #define DRXJ_MAX_RETRIES (100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   508) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   509) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   510) /*=== STANDARD RELATED MACROS ================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   511) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   512) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   513) #define DRXJ_ISATVSTD(std) ((std == DRX_STANDARD_PAL_SECAM_BG) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   514) 			       (std == DRX_STANDARD_PAL_SECAM_DK) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   515) 			       (std == DRX_STANDARD_PAL_SECAM_I) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   516) 			       (std == DRX_STANDARD_PAL_SECAM_L) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   517) 			       (std == DRX_STANDARD_PAL_SECAM_LP) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   518) 			       (std == DRX_STANDARD_NTSC) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   519) 			       (std == DRX_STANDARD_FM))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   520) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   521) #define DRXJ_ISQAMSTD(std) ((std == DRX_STANDARD_ITU_A) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   522) 			       (std == DRX_STANDARD_ITU_B) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   523) 			       (std == DRX_STANDARD_ITU_C) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   524) 			       (std == DRX_STANDARD_ITU_D))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   525) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   526) /*-----------------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   527) GLOBAL VARIABLES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   528) ----------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   529) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   530)  * DRXJ DAP structures
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   531)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   532) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   533) static int drxdap_fasi_read_block(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   534) 				      u32 addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   535) 				      u16 datasize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   536) 				      u8 *data, u32 flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   537) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   538) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   539) static int drxj_dap_read_modify_write_reg16(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   540) 						 u32 waddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   541) 						 u32 raddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   542) 						 u16 wdata, u16 *rdata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   543) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   544) static int drxj_dap_read_reg16(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   545) 				      u32 addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   546) 				      u16 *data, u32 flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   547) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   548) static int drxdap_fasi_read_reg32(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   549) 				      u32 addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   550) 				      u32 *data, u32 flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   551) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   552) static int drxdap_fasi_write_block(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   553) 				       u32 addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   554) 				       u16 datasize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   555) 				       u8 *data, u32 flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   556) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   557) static int drxj_dap_write_reg16(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   558) 				       u32 addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   559) 				       u16 data, u32 flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   560) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   561) static int drxdap_fasi_write_reg32(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   562) 				       u32 addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   563) 				       u32 data, u32 flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   564) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   565) static struct drxj_data drxj_data_g = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   566) 	false,			/* has_lna : true if LNA (aka PGA) present      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   567) 	false,			/* has_oob : true if OOB supported              */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   568) 	false,			/* has_ntsc: true if NTSC supported             */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   569) 	false,			/* has_btsc: true if BTSC supported             */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   570) 	false,			/* has_smatx: true if SMA_TX pin is available   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   571) 	false,			/* has_smarx: true if SMA_RX pin is available   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   572) 	false,			/* has_gpio : true if GPIO pin is available     */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   573) 	false,			/* has_irqn : true if IRQN pin is available     */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   574) 	0,			/* mfx A1/A2/A... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   575) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   576) 	/* tuner settings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   577) 	false,			/* tuner mirrors RF signal    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   578) 	/* standard/channel settings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   579) 	DRX_STANDARD_UNKNOWN,	/* current standard           */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   580) 	DRX_CONSTELLATION_AUTO,	/* constellation              */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   581) 	0,			/* frequency in KHz           */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   582) 	DRX_BANDWIDTH_UNKNOWN,	/* curr_bandwidth              */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   583) 	DRX_MIRROR_NO,		/* mirror                     */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   584) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   585) 	/* signal quality information: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   586) 	/* default values taken from the QAM Programming guide */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   587) 	/*   fec_bits_desired should not be less than 4000000    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   588) 	4000000,		/* fec_bits_desired    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   589) 	5,			/* fec_vd_plen         */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   590) 	4,			/* qam_vd_prescale     */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   591) 	0xFFFF,			/* qamVDPeriod       */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   592) 	204 * 8,		/* fec_rs_plen annex A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   593) 	1,			/* fec_rs_prescale     */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   594) 	FEC_RS_MEASUREMENT_PERIOD,	/* fec_rs_period     */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   595) 	true,			/* reset_pkt_err_acc    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   596) 	0,			/* pkt_err_acc_start    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   597) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   598) 	/* HI configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   599) 	0,			/* hi_cfg_timing_div    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   600) 	0,			/* hi_cfg_bridge_delay  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   601) 	0,			/* hi_cfg_wake_up_key    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   602) 	0,			/* hi_cfg_ctrl         */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   603) 	0,			/* HICfgTimeout      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   604) 	/* UIO configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   605) 	DRX_UIO_MODE_DISABLE,	/* uio_sma_rx_mode      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   606) 	DRX_UIO_MODE_DISABLE,	/* uio_sma_tx_mode      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   607) 	DRX_UIO_MODE_DISABLE,	/* uioASELMode       */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   608) 	DRX_UIO_MODE_DISABLE,	/* uio_irqn_mode       */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   609) 	/* FS setting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   610) 	0UL,			/* iqm_fs_rate_ofs      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   611) 	false,			/* pos_image          */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   612) 	/* RC setting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   613) 	0UL,			/* iqm_rc_rate_ofs      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   614) 	/* AUD information */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   615) /*   false,                  * flagSetAUDdone    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   616) /*   false,                  * detectedRDS       */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   617) /*   true,                   * flagASDRequest    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   618) /*   false,                  * flagHDevClear     */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   619) /*   false,                  * flagHDevSet       */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   620) /*   (u16) 0xFFF,          * rdsLastCount      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   621) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   622) 	/* ATV configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   623) 	0UL,			/* flags cfg changes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   624) 	/* shadow of ATV_TOP_EQU0__A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   625) 	{-5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   626) 	 ATV_TOP_EQU0_EQU_C0_FM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   627) 	 ATV_TOP_EQU0_EQU_C0_L,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   628) 	 ATV_TOP_EQU0_EQU_C0_LP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   629) 	 ATV_TOP_EQU0_EQU_C0_BG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   630) 	 ATV_TOP_EQU0_EQU_C0_DK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   631) 	 ATV_TOP_EQU0_EQU_C0_I},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   632) 	/* shadow of ATV_TOP_EQU1__A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   633) 	{-50,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   634) 	 ATV_TOP_EQU1_EQU_C1_FM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   635) 	 ATV_TOP_EQU1_EQU_C1_L,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   636) 	 ATV_TOP_EQU1_EQU_C1_LP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   637) 	 ATV_TOP_EQU1_EQU_C1_BG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   638) 	 ATV_TOP_EQU1_EQU_C1_DK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   639) 	 ATV_TOP_EQU1_EQU_C1_I},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   640) 	/* shadow of ATV_TOP_EQU2__A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   641) 	{210,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   642) 	 ATV_TOP_EQU2_EQU_C2_FM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   643) 	 ATV_TOP_EQU2_EQU_C2_L,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   644) 	 ATV_TOP_EQU2_EQU_C2_LP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   645) 	 ATV_TOP_EQU2_EQU_C2_BG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   646) 	 ATV_TOP_EQU2_EQU_C2_DK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   647) 	 ATV_TOP_EQU2_EQU_C2_I},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   648) 	/* shadow of ATV_TOP_EQU3__A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   649) 	{-160,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   650) 	 ATV_TOP_EQU3_EQU_C3_FM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   651) 	 ATV_TOP_EQU3_EQU_C3_L,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   652) 	 ATV_TOP_EQU3_EQU_C3_LP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   653) 	 ATV_TOP_EQU3_EQU_C3_BG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   654) 	 ATV_TOP_EQU3_EQU_C3_DK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   655) 	 ATV_TOP_EQU3_EQU_C3_I},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   656) 	false,			/* flag: true=bypass             */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   657) 	ATV_TOP_VID_PEAK__PRE,	/* shadow of ATV_TOP_VID_PEAK__A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   658) 	ATV_TOP_NOISE_TH__PRE,	/* shadow of ATV_TOP_NOISE_TH__A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   659) 	true,			/* flag CVBS output enable       */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   660) 	false,			/* flag SIF output enable        */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   661) 	DRXJ_SIF_ATTENUATION_0DB,	/* current SIF att setting       */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   662) 	{			/* qam_rf_agc_cfg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   663) 	 DRX_STANDARD_ITU_B,	/* standard            */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   664) 	 DRX_AGC_CTRL_AUTO,	/* ctrl_mode            */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   665) 	 0,			/* output_level         */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   666) 	 0,			/* min_output_level      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   667) 	 0xFFFF,		/* max_output_level      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   668) 	 0x0000,		/* speed               */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   669) 	 0x0000,		/* top                 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   670) 	 0x0000			/* c.o.c.              */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   671) 	 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   672) 	{			/* qam_if_agc_cfg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   673) 	 DRX_STANDARD_ITU_B,	/* standard            */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   674) 	 DRX_AGC_CTRL_AUTO,	/* ctrl_mode            */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   675) 	 0,			/* output_level         */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   676) 	 0,			/* min_output_level      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   677) 	 0xFFFF,		/* max_output_level      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   678) 	 0x0000,		/* speed               */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   679) 	 0x0000,		/* top    (don't care) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   680) 	 0x0000			/* c.o.c. (don't care) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   681) 	 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   682) 	{			/* vsb_rf_agc_cfg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   683) 	 DRX_STANDARD_8VSB,	/* standard       */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   684) 	 DRX_AGC_CTRL_AUTO,	/* ctrl_mode       */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   685) 	 0,			/* output_level    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   686) 	 0,			/* min_output_level */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   687) 	 0xFFFF,		/* max_output_level */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   688) 	 0x0000,		/* speed          */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   689) 	 0x0000,		/* top    (don't care) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   690) 	 0x0000			/* c.o.c. (don't care) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   691) 	 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   692) 	{			/* vsb_if_agc_cfg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   693) 	 DRX_STANDARD_8VSB,	/* standard       */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   694) 	 DRX_AGC_CTRL_AUTO,	/* ctrl_mode       */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   695) 	 0,			/* output_level    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   696) 	 0,			/* min_output_level */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   697) 	 0xFFFF,		/* max_output_level */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   698) 	 0x0000,		/* speed          */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   699) 	 0x0000,		/* top    (don't care) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   700) 	 0x0000			/* c.o.c. (don't care) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   701) 	 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   702) 	0,			/* qam_pga_cfg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   703) 	0,			/* vsb_pga_cfg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   704) 	{			/* qam_pre_saw_cfg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   705) 	 DRX_STANDARD_ITU_B,	/* standard  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   706) 	 0,			/* reference */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   707) 	 false			/* use_pre_saw */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   708) 	 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   709) 	{			/* vsb_pre_saw_cfg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   710) 	 DRX_STANDARD_8VSB,	/* standard  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   711) 	 0,			/* reference */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   712) 	 false			/* use_pre_saw */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   713) 	 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   714) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   715) 	/* Version information */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   716) #ifndef _CH_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   717) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   718) 	 "01234567890",		/* human readable version microcode             */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   719) 	 "01234567890"		/* human readable version device specific code  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   720) 	 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   721) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   722) 	 {			/* struct drx_version for microcode                   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   723) 	  DRX_MODULE_UNKNOWN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   724) 	  (char *)(NULL),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   725) 	  0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   726) 	  0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   727) 	  0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   728) 	  (char *)(NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   729) 	  },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   730) 	 {			/* struct drx_version for device specific code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   731) 	  DRX_MODULE_UNKNOWN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   732) 	  (char *)(NULL),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   733) 	  0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   734) 	  0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   735) 	  0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   736) 	  (char *)(NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   737) 	  }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   738) 	 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   739) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   740) 	 {			/* struct drx_version_list for microcode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   741) 	  (struct drx_version *) (NULL),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   742) 	  (struct drx_version_list *) (NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   743) 	  },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   744) 	 {			/* struct drx_version_list for device specific code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   745) 	  (struct drx_version *) (NULL),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   746) 	  (struct drx_version_list *) (NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   747) 	  }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   748) 	 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   749) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   750) 	false,			/* smart_ant_inverted */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   751) 	/* Tracking filter setting for OOB  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   752) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   753) 	 12000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   754) 	 9300,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   755) 	 6600,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   756) 	 5280,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   757) 	 3700,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   758) 	 3000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   759) 	 2000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   760) 	 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   761) 	false,			/* oob_power_on           */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   762) 	0,			/* mpeg_ts_static_bitrate  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   763) 	false,			/* disable_te_ihandling   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   764) 	false,			/* bit_reverse_mpeg_outout */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   765) 	DRXJ_MPEGOUTPUT_CLOCK_RATE_AUTO,	/* mpeg_output_clock_rate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   766) 	DRXJ_MPEG_START_WIDTH_1CLKCYC,	/* mpeg_start_width */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   767) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   768) 	/* Pre SAW & Agc configuration for ATV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   769) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   770) 	 DRX_STANDARD_NTSC,	/* standard     */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   771) 	 7,			/* reference    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   772) 	 true			/* use_pre_saw    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   773) 	 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   774) 	{			/* ATV RF-AGC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   775) 	 DRX_STANDARD_NTSC,	/* standard              */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   776) 	 DRX_AGC_CTRL_AUTO,	/* ctrl_mode              */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   777) 	 0,			/* output_level           */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   778) 	 0,			/* min_output_level (d.c.) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   779) 	 0,			/* max_output_level (d.c.) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   780) 	 3,			/* speed                 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   781) 	 9500,			/* top                   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   782) 	 4000			/* cut-off current       */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   783) 	 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   784) 	{			/* ATV IF-AGC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   785) 	 DRX_STANDARD_NTSC,	/* standard              */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   786) 	 DRX_AGC_CTRL_AUTO,	/* ctrl_mode              */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   787) 	 0,			/* output_level           */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   788) 	 0,			/* min_output_level (d.c.) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   789) 	 0,			/* max_output_level (d.c.) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   790) 	 3,			/* speed                 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   791) 	 2400,			/* top                   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   792) 	 0			/* c.o.c.         (d.c.) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   793) 	 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   794) 	140,			/* ATV PGA config */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   795) 	0,			/* curr_symbol_rate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   796) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   797) 	false,			/* pdr_safe_mode     */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   798) 	SIO_PDR_GPIO_CFG__PRE,	/* pdr_safe_restore_val_gpio  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   799) 	SIO_PDR_VSYNC_CFG__PRE,	/* pdr_safe_restore_val_v_sync */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   800) 	SIO_PDR_SMA_RX_CFG__PRE,	/* pdr_safe_restore_val_sma_rx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   801) 	SIO_PDR_SMA_TX_CFG__PRE,	/* pdr_safe_restore_val_sma_tx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   802) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   803) 	4,			/* oob_pre_saw            */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   804) 	DRXJ_OOB_LO_POW_MINUS10DB,	/* oob_lo_pow             */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   805) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   806) 	 false			/* aud_data, only first member */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   807) 	 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   808) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   809) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   810) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   811) * \var drxj_default_addr_g
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   812) * \brief Default I2C address and device identifier.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   813) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   814) static struct i2c_device_addr drxj_default_addr_g = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   815) 	DRXJ_DEF_I2C_ADDR,	/* i2c address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   816) 	DRXJ_DEF_DEMOD_DEV_ID	/* device id */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   817) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   818) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   819) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   820) * \var drxj_default_comm_attr_g
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   821) * \brief Default common attributes of a drxj demodulator instance.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   822) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   823) static struct drx_common_attr drxj_default_comm_attr_g = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   824) 	NULL,			/* ucode file           */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   825) 	true,			/* ucode verify switch  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   826) 	{0},			/* version record       */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   827) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   828) 	44000,			/* IF in kHz in case no tuner instance is used  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   829) 	(151875 - 0),		/* system clock frequency in kHz                */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   830) 	0,			/* oscillator frequency kHz                     */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   831) 	0,			/* oscillator deviation in ppm, signed          */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   832) 	false,			/* If true mirror frequency spectrum            */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   833) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   834) 	 /* MPEG output configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   835) 	 true,			/* If true, enable MPEG output   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   836) 	 false,			/* If true, insert RS byte       */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   837) 	 false,			/* If true, parallel out otherwise serial */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   838) 	 false,			/* If true, invert DATA signals  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   839) 	 false,			/* If true, invert ERR signal    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   840) 	 false,			/* If true, invert STR signals   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   841) 	 false,			/* If true, invert VAL signals   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   842) 	 false,			/* If true, invert CLK signals   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   843) 	 true,			/* If true, static MPEG clockrate will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   844) 				   be used, otherwise clockrate will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   845) 				   adapt to the bitrate of the TS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   846) 	 19392658UL,		/* Maximum bitrate in b/s in case
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   847) 				   static clockrate is selected */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   848) 	 DRX_MPEG_STR_WIDTH_1	/* MPEG Start width in clock cycles */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   849) 	 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   850) 	/* Initilisations below can be omitted, they require no user input and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   851) 	   are initially 0, NULL or false. The compiler will initialize them to these
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   852) 	   values when omitted.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   853) 	false,			/* is_opened */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   854) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   855) 	/* SCAN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   856) 	NULL,			/* no scan params yet               */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   857) 	0,			/* current scan index               */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   858) 	0,			/* next scan frequency              */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   859) 	false,			/* scan ready flag                  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   860) 	0,			/* max channels to scan             */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   861) 	0,			/* nr of channels scanned           */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   862) 	NULL,			/* default scan function            */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   863) 	NULL,			/* default context pointer          */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   864) 	0,			/* millisec to wait for demod lock  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   865) 	DRXJ_DEMOD_LOCK,	/* desired lock               */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   866) 	false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   867) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   868) 	/* Power management */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   869) 	DRX_POWER_UP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   870) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   871) 	/* Tuner */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   872) 	1,			/* nr of I2C port to which tuner is    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   873) 	0L,			/* minimum RF input frequency, in kHz  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   874) 	0L,			/* maximum RF input frequency, in kHz  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   875) 	false,			/* Rf Agc Polarity                     */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   876) 	false,			/* If Agc Polarity                     */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   877) 	false,			/* tuner slow mode                     */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   878) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   879) 	{			/* current channel (all 0)             */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   880) 	 0UL			/* channel.frequency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   881) 	 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   882) 	DRX_STANDARD_UNKNOWN,	/* current standard */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   883) 	DRX_STANDARD_UNKNOWN,	/* previous standard */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   884) 	DRX_STANDARD_UNKNOWN,	/* di_cache_standard   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   885) 	false,			/* use_bootloader */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   886) 	0UL,			/* capabilities */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   887) 	0			/* mfx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   888) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   889) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   890) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   891) * \var drxj_default_demod_g
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   892) * \brief Default drxj demodulator instance.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   893) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   894) static struct drx_demod_instance drxj_default_demod_g = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   895) 	&drxj_default_addr_g,	/* i2c address & device id */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   896) 	&drxj_default_comm_attr_g,	/* demod common attributes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   897) 	&drxj_data_g		/* demod device specific attributes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   898) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   899) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   900) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   901) * \brief Default audio data structure for DRK demodulator instance.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   902) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   903) * This structure is DRXK specific.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   904) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   905) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   906) static struct drx_aud_data drxj_default_aud_data_g = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   907) 	false,			/* audio_is_active */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   908) 	DRX_AUD_STANDARD_AUTO,	/* audio_standard  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   909) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   910) 	/* i2sdata */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   911) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   912) 	 false,			/* output_enable   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   913) 	 48000,			/* frequency      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   914) 	 DRX_I2S_MODE_MASTER,	/* mode           */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   915) 	 DRX_I2S_WORDLENGTH_32,	/* word_length     */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   916) 	 DRX_I2S_POLARITY_RIGHT,	/* polarity       */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   917) 	 DRX_I2S_FORMAT_WS_WITH_DATA	/* format         */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   918) 	 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   919) 	/* volume            */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   920) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   921) 	 true,			/* mute;          */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   922) 	 0,			/* volume         */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   923) 	 DRX_AUD_AVC_OFF,	/* avc_mode        */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   924) 	 0,			/* avc_ref_level    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   925) 	 DRX_AUD_AVC_MAX_GAIN_12DB,	/* avc_max_gain     */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   926) 	 DRX_AUD_AVC_MAX_ATTEN_24DB,	/* avc_max_atten    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   927) 	 0,			/* strength_left   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   928) 	 0			/* strength_right  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   929) 	 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   930) 	DRX_AUD_AUTO_SOUND_SELECT_ON_CHANGE_ON,	/* auto_sound */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   931) 	/*  ass_thresholds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   932) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   933) 	 440,			/* A2    */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   934) 	 12,			/* BTSC  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   935) 	 700,			/* NICAM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   936) 	 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   937) 	/* carrier */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   938) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   939) 	 /* a */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   940) 	 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   941) 	  42,			/* thres */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   942) 	  DRX_NO_CARRIER_NOISE,	/* opt   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   943) 	  0,			/* shift */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   944) 	  0			/* dco   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   945) 	  },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   946) 	 /* b */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   947) 	 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   948) 	  42,			/* thres */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   949) 	  DRX_NO_CARRIER_MUTE,	/* opt   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   950) 	  0,			/* shift */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   951) 	  0			/* dco   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   952) 	  },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   953) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   954) 	 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   955) 	/* mixer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   956) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   957) 	 DRX_AUD_SRC_STEREO_OR_A,	/* source_i2s */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   958) 	 DRX_AUD_I2S_MATRIX_STEREO,	/* matrix_i2s */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   959) 	 DRX_AUD_FM_MATRIX_SOUND_A	/* matrix_fm  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   960) 	 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   961) 	DRX_AUD_DEVIATION_NORMAL,	/* deviation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   962) 	DRX_AUD_AVSYNC_OFF,	/* av_sync */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   963) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   964) 	/* prescale */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   965) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   966) 	 DRX_AUD_MAX_FM_DEVIATION,	/* fm_deviation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   967) 	 DRX_AUD_MAX_NICAM_PRESCALE	/* nicam_gain */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   968) 	 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   969) 	DRX_AUD_FM_DEEMPH_75US,	/* deemph */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   970) 	DRX_BTSC_STEREO,	/* btsc_detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   971) 	0,			/* rds_data_counter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   972) 	false			/* rds_data_present */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   973) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   974) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   975) /*-----------------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   976) STRUCTURES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   977) ----------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   978) struct drxjeq_stat {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   979) 	u16 eq_mse;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   980) 	u8 eq_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   981) 	u8 eq_ctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   982) 	u8 eq_stat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   983) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   984) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   985) /* HI command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   986) struct drxj_hi_cmd {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   987) 	u16 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   988) 	u16 param1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   989) 	u16 param2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   990) 	u16 param3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   991) 	u16 param4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   992) 	u16 param5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   993) 	u16 param6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   994) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   995) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   996) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   997) /*=== MICROCODE RELATED STRUCTURES ===========================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   998) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   999) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1000) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1001)  * struct drxu_code_block_hdr - Structure of the microcode block headers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1002)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1003)  * @addr:	Destination address of the data in this block
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1004)  * @size:	Size of the block data following this header counted in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1005)  *		16 bits words
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1006)  * @CRC:	CRC value of the data block, only valid if CRC flag is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1007)  *		set.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1008)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1009) struct drxu_code_block_hdr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1010) 	u32 addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1011) 	u16 size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1012) 	u16 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1013) 	u16 CRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1014) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1015) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1016) /*-----------------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1017) FUNCTIONS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1018) ----------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1019) /* Some prototypes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1020) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1021) hi_command(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1022) 	   const struct drxj_hi_cmd *cmd, u16 *result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1023) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1024) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1025) ctrl_lock_status(struct drx_demod_instance *demod, enum drx_lock_status *lock_stat);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1026) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1027) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1028) ctrl_power_mode(struct drx_demod_instance *demod, enum drx_power_mode *mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1029) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1030) static int power_down_aud(struct drx_demod_instance *demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1031) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1032) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1033) ctrl_set_cfg_pre_saw(struct drx_demod_instance *demod, struct drxj_cfg_pre_saw *pre_saw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1034) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1035) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1036) ctrl_set_cfg_afe_gain(struct drx_demod_instance *demod, struct drxj_cfg_afe_gain *afe_gain);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1037) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1038) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1039) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1040) /*==                          HELPER FUNCTIONS                              ==*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1041) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1042) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1043) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1044) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1045) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1046) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1047) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1048) * \fn u32 frac28(u32 N, u32 D)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1049) * \brief Compute: (1<<28)*N/D
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1050) * \param N 32 bits
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1051) * \param D 32 bits
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1052) * \return (1<<28)*N/D
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1053) * This function is used to avoid floating-point calculations as they may
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1054) * not be present on the target platform.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1055) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1056) * frac28 performs an unsigned 28/28 bits division to 32-bit fixed point
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1057) * fraction used for setting the Frequency Shifter registers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1058) * N and D can hold numbers up to width: 28-bits.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1059) * The 4 bits integer part and the 28 bits fractional part are calculated.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1060) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1061) * Usage condition: ((1<<28)*n)/d < ((1<<32)-1) => (n/d) < 15.999
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1062) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1063) * N: 0...(1<<28)-1 = 268435454
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1064) * D: 0...(1<<28)-1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1065) * Q: 0...(1<<32)-1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1066) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1067) static u32 frac28(u32 N, u32 D)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1068) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1069) 	int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1070) 	u32 Q1 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1071) 	u32 R0 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1072) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1073) 	R0 = (N % D) << 4;	/* 32-28 == 4 shifts possible at max */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1074) 	Q1 = N / D;		/* integer part, only the 4 least significant bits
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1075) 				   will be visible in the result */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1076) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1077) 	/* division using radix 16, 7 nibbles in the result */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1078) 	for (i = 0; i < 7; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1079) 		Q1 = (Q1 << 4) | R0 / D;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1080) 		R0 = (R0 % D) << 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1081) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1082) 	/* rounding */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1083) 	if ((R0 >> 3) >= D)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1084) 		Q1++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1085) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1086) 	return Q1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1087) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1088) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1089) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1090) * \fn u32 log1_times100( u32 x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1091) * \brief Compute: 100*log10(x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1092) * \param x 32 bits
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1093) * \return 100*log10(x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1094) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1095) * 100*log10(x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1096) * = 100*(log2(x)/log2(10)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1097) * = (100*(2^15)*log2(x))/((2^15)*log2(10))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1098) * = ((200*(2^15)*log2(x))/((2^15)*log2(10)))/2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1099) * = ((200*(2^15)*(log2(x/y)+log2(y)))/((2^15)*log2(10)))/2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1100) * = ((200*(2^15)*log2(x/y))+(200*(2^15)*log2(y)))/((2^15)*log2(10)))/2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1101) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1102) * where y = 2^k and 1<= (x/y) < 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1103) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1104) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1105) static u32 log1_times100(u32 x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1106) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1107) 	static const u8 scale = 15;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1108) 	static const u8 index_width = 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1109) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1110) 	   log2lut[n] = (1<<scale) * 200 * log2( 1.0 + ( (1.0/(1<<INDEXWIDTH)) * n ))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1111) 	   0 <= n < ((1<<INDEXWIDTH)+1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1112) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1113) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1114) 	static const u32 log2lut[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1115) 		0,		/* 0.000000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1116) 		290941,		/* 290941.300628 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1117) 		573196,		/* 573196.476418 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1118) 		847269,		/* 847269.179851 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1119) 		1113620,	/* 1113620.489452 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1120) 		1372674,	/* 1372673.576986 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1121) 		1624818,	/* 1624817.752104 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1122) 		1870412,	/* 1870411.981536 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1123) 		2109788,	/* 2109787.962654 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1124) 		2343253,	/* 2343252.817465 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1125) 		2571091,	/* 2571091.461923 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1126) 		2793569,	/* 2793568.696416 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1127) 		3010931,	/* 3010931.055901 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1128) 		3223408,	/* 3223408.452106 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1129) 		3431216,	/* 3431215.635215 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1130) 		3634553,	/* 3634553.498355 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1131) 		3833610,	/* 3833610.244726 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1132) 		4028562,	/* 4028562.434393 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1133) 		4219576,	/* 4219575.925308 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1134) 		4406807,	/* 4406806.721144 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1135) 		4590402,	/* 4590401.736809 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1136) 		4770499,	/* 4770499.491025 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1137) 		4947231,	/* 4947230.734179 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1138) 		5120719,	/* 5120719.018555 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1139) 		5291081,	/* 5291081.217197 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1140) 		5458428,	/* 5458427.996830 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1141) 		5622864,	/* 5622864.249668 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1142) 		5784489,	/* 5784489.488298 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1143) 		5943398,	/* 5943398.207380 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1144) 		6099680,	/* 6099680.215452 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1145) 		6253421,	/* 6253420.939751 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1146) 		6404702,	/* 6404701.706649 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1147) 		6553600,	/* 6553600.000000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1148) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1149) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1150) 	u8 i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1151) 	u32 y = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1152) 	u32 d = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1153) 	u32 k = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1154) 	u32 r = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1155) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1156) 	if (x == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1157) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1158) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1159) 	/* Scale x (normalize) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1160) 	/* computing y in log(x/y) = log(x) - log(y) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1161) 	if ((x & (((u32) (-1)) << (scale + 1))) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1162) 		for (k = scale; k > 0; k--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1163) 			if (x & (((u32) 1) << scale))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1164) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1165) 			x <<= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1166) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1167) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1168) 		for (k = scale; k < 31; k++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1169) 			if ((x & (((u32) (-1)) << (scale + 1))) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1170) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1171) 			x >>= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1172) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1173) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1174) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1175) 	   Now x has binary point between bit[scale] and bit[scale-1]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1176) 	   and 1.0 <= x < 2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1177) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1178) 	/* correction for division: log(x) = log(x/y)+log(y) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1179) 	y = k * ((((u32) 1) << scale) * 200);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1180) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1181) 	/* remove integer part */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1182) 	x &= ((((u32) 1) << scale) - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1183) 	/* get index */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1184) 	i = (u8) (x >> (scale - index_width));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1185) 	/* compute delta (x-a) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1186) 	d = x & ((((u32) 1) << (scale - index_width)) - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1187) 	/* compute log, multiplication ( d* (.. )) must be within range ! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1188) 	y += log2lut[i] +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1189) 	    ((d * (log2lut[i + 1] - log2lut[i])) >> (scale - index_width));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1190) 	/* Conver to log10() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1191) 	y /= 108853;		/* (log2(10) << scale) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1192) 	r = (y >> 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1193) 	/* rounding */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1194) 	if (y & ((u32)1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1195) 		r++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1196) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1197) 	return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1198) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1199) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1200) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1201) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1202) * \fn u32 frac_times1e6( u16 N, u32 D)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1203) * \brief Compute: (N/D) * 1000000.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1204) * \param N nominator 16-bits.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1205) * \param D denominator 32-bits.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1206) * \return u32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1207) * \retval ((N/D) * 1000000), 32 bits
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1208) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1209) * No check on D=0!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1210) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1211) static u32 frac_times1e6(u32 N, u32 D)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1212) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1213) 	u32 remainder = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1214) 	u32 frac = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1215) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1216) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1217) 	   frac = (N * 1000000) / D
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1218) 	   To let it fit in a 32 bits computation:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1219) 	   frac = (N * (1000000 >> 4)) / (D >> 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1220) 	   This would result in a problem in case D < 16 (div by 0).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1221) 	   So we do it more elaborate as shown below.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1222) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1223) 	frac = (((u32) N) * (1000000 >> 4)) / D;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1224) 	frac <<= 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1225) 	remainder = (((u32) N) * (1000000 >> 4)) % D;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1226) 	remainder <<= 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1227) 	frac += remainder / D;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1228) 	remainder = remainder % D;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1229) 	if ((remainder * 2) > D)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1230) 		frac++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1231) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1232) 	return frac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1233) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1234) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1235) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1236) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1237) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1238) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1239) * \brief Values for NICAM prescaler gain. Computed from dB to integer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1240) *        and rounded. For calc used formula: 16*10^(prescaleGain[dB]/20).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1241) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1242) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1243) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1244) /* Currently, unused as we lack support for analog TV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1245) static const u16 nicam_presc_table_val[43] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1246) 	1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1247) 	5, 5, 6, 6, 7, 8, 9, 10, 11, 13, 14, 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1248) 	18, 20, 23, 25, 28, 32, 36, 40, 45,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1249) 	51, 57, 64, 71, 80, 90, 101, 113, 127
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1250) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1251) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1252) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1253) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1254) /*==                        END HELPER FUNCTIONS                            ==*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1255) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1256) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1257) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1258) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1259) /*==                      DRXJ DAP FUNCTIONS                                ==*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1260) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1261) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1262) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1263) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1264)    This layer takes care of some device specific register access protocols:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1265)    -conversion to short address format
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1266)    -access to audio block
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1267)    This layer is placed between the drx_dap_fasi and the rest of the drxj
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1268)    specific implementation. This layer can use address map knowledge whereas
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1269)    dap_fasi may not use memory map knowledge.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1270) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1271)    * For audio currently only 16 bits read and write register access is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1272)      supported. More is not needed. RMW and 32 or 8 bit access on audio
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1273)      registers will have undefined behaviour. Flags (RMW, CRC reset, broadcast
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1274)      single/multi master) will be ignored.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1275) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1276)    TODO: check ignoring single/multimaster is ok for AUD access ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1277) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1278) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1279) #define DRXJ_ISAUDWRITE(addr) (((((addr)>>16)&1) == 1) ? true : false)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1280) #define DRXJ_DAP_AUDTRIF_TIMEOUT 80	/* millisec */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1281) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1282) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1283) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1284) * \fn bool is_handled_by_aud_tr_if( u32 addr )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1285) * \brief Check if this address is handled by the audio token ring interface.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1286) * \param addr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1287) * \return bool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1288) * \retval true  Yes, handled by audio token ring interface
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1289) * \retval false No, not handled by audio token ring interface
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1290) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1291) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1292) static
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1293) bool is_handled_by_aud_tr_if(u32 addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1294) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1295) 	bool retval = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1296) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1297) 	if ((DRXDAP_FASI_ADDR2BLOCK(addr) == 4) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1298) 	    (DRXDAP_FASI_ADDR2BANK(addr) > 1) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1299) 	    (DRXDAP_FASI_ADDR2BANK(addr) < 6)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1300) 		retval = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1301) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1302) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1303) 	return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1304) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1305) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1306) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1307) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1308) int drxbsp_i2c_write_read(struct i2c_device_addr *w_dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1309) 				 u16 w_count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1310) 				 u8 *wData,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1311) 				 struct i2c_device_addr *r_dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1312) 				 u16 r_count, u8 *r_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1313) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1314) 	struct drx39xxj_state *state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1315) 	struct i2c_msg msg[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1316) 	unsigned int num_msgs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1317) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1318) 	if (w_dev_addr == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1319) 		/* Read only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1320) 		state = r_dev_addr->user_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1321) 		msg[0].addr = r_dev_addr->i2c_addr >> 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1322) 		msg[0].flags = I2C_M_RD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1323) 		msg[0].buf = r_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1324) 		msg[0].len = r_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1325) 		num_msgs = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1326) 	} else if (r_dev_addr == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1327) 		/* Write only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1328) 		state = w_dev_addr->user_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1329) 		msg[0].addr = w_dev_addr->i2c_addr >> 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1330) 		msg[0].flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1331) 		msg[0].buf = wData;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1332) 		msg[0].len = w_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1333) 		num_msgs = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1334) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1335) 		/* Both write and read */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1336) 		state = w_dev_addr->user_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1337) 		msg[0].addr = w_dev_addr->i2c_addr >> 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1338) 		msg[0].flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1339) 		msg[0].buf = wData;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1340) 		msg[0].len = w_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1341) 		msg[1].addr = r_dev_addr->i2c_addr >> 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1342) 		msg[1].flags = I2C_M_RD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1343) 		msg[1].buf = r_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1344) 		msg[1].len = r_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1345) 		num_msgs = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1346) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1347) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1348) 	if (state->i2c == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1349) 		pr_err("i2c was zero, aborting\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1350) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1351) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1352) 	if (i2c_transfer(state->i2c, msg, num_msgs) != num_msgs) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1353) 		pr_warn("drx3933: I2C write/read failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1354) 		return -EREMOTEIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1355) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1356) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1357) #ifdef DJH_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1358) 	if (w_dev_addr == NULL || r_dev_addr == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1359) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1360) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1361) 	state = w_dev_addr->user_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1362) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1363) 	if (state->i2c == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1364) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1365) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1366) 	msg[0].addr = w_dev_addr->i2c_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1367) 	msg[0].flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1368) 	msg[0].buf = wData;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1369) 	msg[0].len = w_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1370) 	msg[1].addr = r_dev_addr->i2c_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1371) 	msg[1].flags = I2C_M_RD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1372) 	msg[1].buf = r_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1373) 	msg[1].len = r_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1374) 	num_msgs = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1375) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1376) 	pr_debug("drx3933 i2c operation addr=%x i2c=%p, wc=%x rc=%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1377) 	       w_dev_addr->i2c_addr, state->i2c, w_count, r_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1378) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1379) 	if (i2c_transfer(state->i2c, msg, 2) != 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1380) 		pr_warn("drx3933: I2C write/read failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1381) 		return -EREMOTEIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1382) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1383) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1384) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1385) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1386) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1387) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1388) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1389) /*****************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1390) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1391) * int drxdap_fasi_read_block (
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1392) *      struct i2c_device_addr *dev_addr,      -- address of I2C device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1393) *      u32 addr,         -- address of chip register/memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1394) *      u16            datasize,     -- number of bytes to read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1395) *      u8 *data,         -- data to receive
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1396) *      u32 flags)        -- special device flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1397) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1398) * Read block data from chip address. Because the chip is word oriented,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1399) * the number of bytes to read must be even.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1400) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1401) * Make sure that the buffer to receive the data is large enough.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1402) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1403) * Although this function expects an even number of bytes, it is still byte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1404) * oriented, and the data read back is NOT translated to the endianness of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1405) * the target platform.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1406) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1407) * Output:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1408) * - 0     if reading was successful
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1409) *                  in that case: data read is in *data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1410) * - -EIO  if anything went wrong
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1411) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1412) ******************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1413) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1414) static int drxdap_fasi_read_block(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1415) 					 u32 addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1416) 					 u16 datasize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1417) 					 u8 *data, u32 flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1418) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1419) 	u8 buf[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1420) 	u16 bufx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1421) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1422) 	u16 overhead_size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1423) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1424) 	/* Check parameters ******************************************************* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1425) 	if (dev_addr == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1426) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1427) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1428) 	overhead_size = (IS_I2C_10BIT(dev_addr->i2c_addr) ? 2 : 1) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1429) 	    (DRXDAP_FASI_LONG_FORMAT(addr) ? 4 : 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1430) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1431) 	if ((DRXDAP_FASI_OFFSET_TOO_LARGE(addr)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1432) 	    ((!(DRXDAPFASI_LONG_ADDR_ALLOWED)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1433) 	     DRXDAP_FASI_LONG_FORMAT(addr)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1434) 	    (overhead_size > (DRXDAP_MAX_WCHUNKSIZE)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1435) 	    ((datasize != 0) && (data == NULL)) || ((datasize & 1) == 1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1436) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1437) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1438) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1439) 	/* ReadModifyWrite & mode flag bits are not allowed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1440) 	flags &= (~DRXDAP_FASI_RMW & ~DRXDAP_FASI_MODEFLAGS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1441) #if DRXDAP_SINGLE_MASTER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1442) 	flags |= DRXDAP_FASI_SINGLE_MASTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1443) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1444) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1445) 	/* Read block from I2C **************************************************** */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1446) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1447) 		u16 todo = (datasize < DRXDAP_MAX_RCHUNKSIZE ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1448) 			      datasize : DRXDAP_MAX_RCHUNKSIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1449) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1450) 		bufx = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1451) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1452) 		addr &= ~DRXDAP_FASI_FLAGS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1453) 		addr |= flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1454) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1455) #if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 1) && (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1456) 		/* short format address preferred but long format otherwise */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1457) 		if (DRXDAP_FASI_LONG_FORMAT(addr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1458) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1459) #if (DRXDAPFASI_LONG_ADDR_ALLOWED == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1460) 			buf[bufx++] = (u8) (((addr << 1) & 0xFF) | 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1461) 			buf[bufx++] = (u8) ((addr >> 16) & 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1462) 			buf[bufx++] = (u8) ((addr >> 24) & 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1463) 			buf[bufx++] = (u8) ((addr >> 7) & 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1464) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1465) #if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 1) && (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1466) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1467) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1468) #if (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1469) 			buf[bufx++] = (u8) ((addr << 1) & 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1470) 			buf[bufx++] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1471) 			    (u8) (((addr >> 16) & 0x0F) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1472) 				    ((addr >> 18) & 0xF0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1473) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1474) #if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 1) && (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1475) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1476) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1477) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1478) #if DRXDAP_SINGLE_MASTER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1479) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1480) 		 * In single master mode, split the read and write actions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1481) 		 * No special action is needed for write chunks here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1482) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1483) 		rc = drxbsp_i2c_write_read(dev_addr, bufx, buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1484) 					   NULL, 0, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1485) 		if (rc == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1486) 			rc = drxbsp_i2c_write_read(NULL, 0, NULL, dev_addr, todo, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1487) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1488) 		/* In multi master mode, do everything in one RW action */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1489) 		rc = drxbsp_i2c_write_read(dev_addr, bufx, buf, dev_addr, todo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1490) 					  data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1491) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1492) 		data += todo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1493) 		addr += (todo >> 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1494) 		datasize -= todo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1495) 	} while (datasize && rc == 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1496) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1497) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1498) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1499) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1500) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1501) /*****************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1502) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1503) * int drxdap_fasi_read_reg16 (
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1504) *     struct i2c_device_addr *dev_addr, -- address of I2C device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1505) *     u32 addr,    -- address of chip register/memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1506) *     u16 *data,    -- data to receive
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1507) *     u32 flags)   -- special device flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1508) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1509) * Read one 16-bit register or memory location. The data received back is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1510) * converted back to the target platform's endianness.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1511) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1512) * Output:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1513) * - 0     if reading was successful
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1514) *                  in that case: read data is at *data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1515) * - -EIO  if anything went wrong
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1516) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1517) ******************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1518) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1519) static int drxdap_fasi_read_reg16(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1520) 					 u32 addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1521) 					 u16 *data, u32 flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1522) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1523) 	u8 buf[sizeof(*data)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1524) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1525) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1526) 	if (!data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1527) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1528) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1529) 	rc = drxdap_fasi_read_block(dev_addr, addr, sizeof(*data), buf, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1530) 	*data = buf[0] + (((u16) buf[1]) << 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1531) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1532) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1533) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1534) /*****************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1535) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1536) * int drxdap_fasi_read_reg32 (
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1537) *     struct i2c_device_addr *dev_addr, -- address of I2C device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1538) *     u32 addr,    -- address of chip register/memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1539) *     u32 *data,    -- data to receive
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1540) *     u32 flags)   -- special device flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1541) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1542) * Read one 32-bit register or memory location. The data received back is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1543) * converted back to the target platform's endianness.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1544) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1545) * Output:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1546) * - 0     if reading was successful
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1547) *                  in that case: read data is at *data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1548) * - -EIO  if anything went wrong
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1549) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1550) ******************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1551) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1552) static int drxdap_fasi_read_reg32(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1553) 					 u32 addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1554) 					 u32 *data, u32 flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1555) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1556) 	u8 buf[sizeof(*data)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1557) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1558) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1559) 	if (!data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1560) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1561) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1562) 	rc = drxdap_fasi_read_block(dev_addr, addr, sizeof(*data), buf, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1563) 	*data = (((u32) buf[0]) << 0) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1564) 	    (((u32) buf[1]) << 8) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1565) 	    (((u32) buf[2]) << 16) + (((u32) buf[3]) << 24);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1566) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1567) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1568) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1569) /*****************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1570) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1571) * int drxdap_fasi_write_block (
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1572) *      struct i2c_device_addr *dev_addr,    -- address of I2C device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1573) *      u32 addr,       -- address of chip register/memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1574) *      u16            datasize,   -- number of bytes to read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1575) *      u8 *data,       -- data to receive
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1576) *      u32 flags)      -- special device flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1577) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1578) * Write block data to chip address. Because the chip is word oriented,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1579) * the number of bytes to write must be even.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1580) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1581) * Although this function expects an even number of bytes, it is still byte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1582) * oriented, and the data being written is NOT translated from the endianness of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1583) * the target platform.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1584) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1585) * Output:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1586) * - 0     if writing was successful
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1587) * - -EIO  if anything went wrong
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1588) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1589) ******************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1590) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1591) static int drxdap_fasi_write_block(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1592) 					  u32 addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1593) 					  u16 datasize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1594) 					  u8 *data, u32 flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1595) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1596) 	u8 buf[DRXDAP_MAX_WCHUNKSIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1597) 	int st = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1598) 	int first_err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1599) 	u16 overhead_size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1600) 	u16 block_size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1601) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1602) 	/* Check parameters ******************************************************* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1603) 	if (dev_addr == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1604) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1605) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1606) 	overhead_size = (IS_I2C_10BIT(dev_addr->i2c_addr) ? 2 : 1) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1607) 	    (DRXDAP_FASI_LONG_FORMAT(addr) ? 4 : 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1608) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1609) 	if ((DRXDAP_FASI_OFFSET_TOO_LARGE(addr)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1610) 	    ((!(DRXDAPFASI_LONG_ADDR_ALLOWED)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1611) 	     DRXDAP_FASI_LONG_FORMAT(addr)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1612) 	    (overhead_size > (DRXDAP_MAX_WCHUNKSIZE)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1613) 	    ((datasize != 0) && (data == NULL)) || ((datasize & 1) == 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1614) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1615) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1616) 	flags &= DRXDAP_FASI_FLAGS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1617) 	flags &= ~DRXDAP_FASI_MODEFLAGS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1618) #if DRXDAP_SINGLE_MASTER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1619) 	flags |= DRXDAP_FASI_SINGLE_MASTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1620) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1621) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1622) 	/* Write block to I2C ***************************************************** */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1623) 	block_size = ((DRXDAP_MAX_WCHUNKSIZE) - overhead_size) & ~1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1624) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1625) 		u16 todo = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1626) 		u16 bufx = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1627) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1628) 		/* Buffer device address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1629) 		addr &= ~DRXDAP_FASI_FLAGS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1630) 		addr |= flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1631) #if (((DRXDAPFASI_LONG_ADDR_ALLOWED) == 1) && ((DRXDAPFASI_SHORT_ADDR_ALLOWED) == 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1632) 		/* short format address preferred but long format otherwise */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1633) 		if (DRXDAP_FASI_LONG_FORMAT(addr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1634) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1635) #if ((DRXDAPFASI_LONG_ADDR_ALLOWED) == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1636) 			buf[bufx++] = (u8) (((addr << 1) & 0xFF) | 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1637) 			buf[bufx++] = (u8) ((addr >> 16) & 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1638) 			buf[bufx++] = (u8) ((addr >> 24) & 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1639) 			buf[bufx++] = (u8) ((addr >> 7) & 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1640) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1641) #if (((DRXDAPFASI_LONG_ADDR_ALLOWED) == 1) && ((DRXDAPFASI_SHORT_ADDR_ALLOWED) == 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1642) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1643) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1644) #if ((DRXDAPFASI_SHORT_ADDR_ALLOWED) == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1645) 			buf[bufx++] = (u8) ((addr << 1) & 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1646) 			buf[bufx++] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1647) 			    (u8) (((addr >> 16) & 0x0F) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1648) 				    ((addr >> 18) & 0xF0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1649) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1650) #if (((DRXDAPFASI_LONG_ADDR_ALLOWED) == 1) && ((DRXDAPFASI_SHORT_ADDR_ALLOWED) == 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1651) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1652) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1653) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1654) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1655) 		   In single master mode block_size can be 0. In such a case this I2C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1656) 		   sequense will be visible: (1) write address {i2c addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1657) 		   4 bytes chip address} (2) write data {i2c addr, 4 bytes data }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1658) 		   (3) write address (4) write data etc...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1659) 		   Address must be rewritten because HI is reset after data transport and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1660) 		   expects an address.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1661) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1662) 		todo = (block_size < datasize ? block_size : datasize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1663) 		if (todo == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1664) 			u16 overhead_size_i2c_addr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1665) 			u16 data_block_size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1666) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1667) 			overhead_size_i2c_addr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1668) 			    (IS_I2C_10BIT(dev_addr->i2c_addr) ? 2 : 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1669) 			data_block_size =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1670) 			    (DRXDAP_MAX_WCHUNKSIZE - overhead_size_i2c_addr) & ~1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1671) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1672) 			/* write device address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1673) 			st = drxbsp_i2c_write_read(dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1674) 						  (u16) (bufx),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1675) 						  buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1676) 						  (struct i2c_device_addr *)(NULL),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1677) 						  0, (u8 *)(NULL));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1678) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1679) 			if ((st != 0) && (first_err == 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1680) 				/* at the end, return the first error encountered */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1681) 				first_err = st;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1682) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1683) 			bufx = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1684) 			todo =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1685) 			    (data_block_size <
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1686) 			     datasize ? data_block_size : datasize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1687) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1688) 		memcpy(&buf[bufx], data, todo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1689) 		/* write (address if can do and) data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1690) 		st = drxbsp_i2c_write_read(dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1691) 					  (u16) (bufx + todo),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1692) 					  buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1693) 					  (struct i2c_device_addr *)(NULL),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1694) 					  0, (u8 *)(NULL));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1695) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1696) 		if ((st != 0) && (first_err == 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1697) 			/* at the end, return the first error encountered */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1698) 			first_err = st;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1699) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1700) 		datasize -= todo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1701) 		data += todo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1702) 		addr += (todo >> 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1703) 	} while (datasize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1704) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1705) 	return first_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1706) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1707) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1708) /*****************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1709) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1710) * int drxdap_fasi_write_reg16 (
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1711) *     struct i2c_device_addr *dev_addr, -- address of I2C device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1712) *     u32 addr,    -- address of chip register/memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1713) *     u16            data,    -- data to send
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1714) *     u32 flags)   -- special device flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1715) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1716) * Write one 16-bit register or memory location. The data being written is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1717) * converted from the target platform's endianness to little endian.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1718) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1719) * Output:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1720) * - 0     if writing was successful
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1721) * - -EIO  if anything went wrong
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1722) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1723) ******************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1724) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1725) static int drxdap_fasi_write_reg16(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1726) 					  u32 addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1727) 					  u16 data, u32 flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1728) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1729) 	u8 buf[sizeof(data)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1730) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1731) 	buf[0] = (u8) ((data >> 0) & 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1732) 	buf[1] = (u8) ((data >> 8) & 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1733) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1734) 	return drxdap_fasi_write_block(dev_addr, addr, sizeof(data), buf, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1735) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1736) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1737) /*****************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1738) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1739) * int drxdap_fasi_read_modify_write_reg16 (
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1740) *      struct i2c_device_addr *dev_addr,   -- address of I2C device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1741) *      u32 waddr,     -- address of chip register/memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1742) *      u32 raddr,     -- chip address to read back from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1743) *      u16            wdata,     -- data to send
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1744) *      u16 *rdata)     -- data to receive back
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1745) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1746) * Write 16-bit data, then read back the original contents of that location.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1747) * Requires long addressing format to be allowed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1748) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1749) * Before sending data, the data is converted to little endian. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1750) * data received back is converted back to the target platform's endianness.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1751) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1752) * WARNING: This function is only guaranteed to work if there is one
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1753) * master on the I2C bus.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1754) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1755) * Output:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1756) * - 0     if reading was successful
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1757) *                  in that case: read back data is at *rdata
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1758) * - -EIO  if anything went wrong
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1759) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1760) ******************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1761) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1762) static int drxdap_fasi_read_modify_write_reg16(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1763) 						    u32 waddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1764) 						    u32 raddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1765) 						    u16 wdata, u16 *rdata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1766) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1767) 	int rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1768) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1769) #if (DRXDAPFASI_LONG_ADDR_ALLOWED == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1770) 	if (rdata == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1771) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1772) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1773) 	rc = drxdap_fasi_write_reg16(dev_addr, waddr, wdata, DRXDAP_FASI_RMW);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1774) 	if (rc == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1775) 		rc = drxdap_fasi_read_reg16(dev_addr, raddr, rdata, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1776) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1777) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1778) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1779) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1780) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1781) /*****************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1782) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1783) * int drxdap_fasi_write_reg32 (
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1784) *     struct i2c_device_addr *dev_addr, -- address of I2C device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1785) *     u32 addr,    -- address of chip register/memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1786) *     u32            data,    -- data to send
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1787) *     u32 flags)   -- special device flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1788) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1789) * Write one 32-bit register or memory location. The data being written is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1790) * converted from the target platform's endianness to little endian.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1791) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1792) * Output:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1793) * - 0     if writing was successful
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1794) * - -EIO  if anything went wrong
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1795) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1796) ******************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1797) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1798) static int drxdap_fasi_write_reg32(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1799) 					  u32 addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1800) 					  u32 data, u32 flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1801) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1802) 	u8 buf[sizeof(data)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1803) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1804) 	buf[0] = (u8) ((data >> 0) & 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1805) 	buf[1] = (u8) ((data >> 8) & 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1806) 	buf[2] = (u8) ((data >> 16) & 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1807) 	buf[3] = (u8) ((data >> 24) & 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1808) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1809) 	return drxdap_fasi_write_block(dev_addr, addr, sizeof(data), buf, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1810) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1811) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1812) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1813) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1814) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1815) * \fn int drxj_dap_rm_write_reg16short
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1816) * \brief Read modify write 16 bits audio register using short format only.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1817) * \param dev_addr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1818) * \param waddr    Address to write to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1819) * \param raddr    Address to read from (usually SIO_HI_RA_RAM_S0_RMWBUF__A)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1820) * \param wdata    Data to write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1821) * \param rdata    Buffer for data to read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1822) * \return int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1823) * \retval 0 Success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1824) * \retval -EIO Timeout, I2C error, illegal bank
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1825) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1826) * 16 bits register read modify write access using short addressing format only.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1827) * Requires knowledge of the registermap, thus device dependent.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1828) * Using DAP FASI directly to avoid endless recursion of RMWs to audio registers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1829) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1830) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1831) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1832) /* TODO correct define should be #if ( DRXDAPFASI_SHORT_ADDR_ALLOWED==1 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1833)    See comments drxj_dap_read_modify_write_reg16 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1834) #if (DRXDAPFASI_LONG_ADDR_ALLOWED == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1835) static int drxj_dap_rm_write_reg16short(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1836) 					      u32 waddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1837) 					      u32 raddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1838) 					      u16 wdata, u16 *rdata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1839) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1840) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1841) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1842) 	if (rdata == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1843) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1844) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1845) 	/* Set RMW flag */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1846) 	rc = drxdap_fasi_write_reg16(dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1847) 					      SIO_HI_RA_RAM_S0_FLG_ACC__A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1848) 					      SIO_HI_RA_RAM_S0_FLG_ACC_S0_RWM__M,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1849) 					      0x0000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1850) 	if (rc == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1851) 		/* Write new data: triggers RMW */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1852) 		rc = drxdap_fasi_write_reg16(dev_addr, waddr, wdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1853) 						      0x0000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1854) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1855) 	if (rc == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1856) 		/* Read old data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1857) 		rc = drxdap_fasi_read_reg16(dev_addr, raddr, rdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1858) 						     0x0000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1859) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1860) 	if (rc == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1861) 		/* Reset RMW flag */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1862) 		rc = drxdap_fasi_write_reg16(dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1863) 						      SIO_HI_RA_RAM_S0_FLG_ACC__A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1864) 						      0, 0x0000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1865) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1866) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1867) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1868) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1869) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1870) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1871) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1872) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1873) static int drxj_dap_read_modify_write_reg16(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1874) 						 u32 waddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1875) 						 u32 raddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1876) 						 u16 wdata, u16 *rdata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1877) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1878) 	/* TODO: correct short/long addressing format decision,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1879) 	   now long format has higher prio then short because short also
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1880) 	   needs virt bnks (not impl yet) for certain audio registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1881) #if (DRXDAPFASI_LONG_ADDR_ALLOWED == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1882) 	return drxdap_fasi_read_modify_write_reg16(dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1883) 							  waddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1884) 							  raddr, wdata, rdata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1885) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1886) 	return drxj_dap_rm_write_reg16short(dev_addr, waddr, raddr, wdata, rdata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1887) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1888) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1889) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1890) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1891) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1892) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1893) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1894) * \fn int drxj_dap_read_aud_reg16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1895) * \brief Read 16 bits audio register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1896) * \param dev_addr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1897) * \param addr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1898) * \param data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1899) * \return int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1900) * \retval 0 Success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1901) * \retval -EIO Timeout, I2C error, illegal bank
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1902) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1903) * 16 bits register read access via audio token ring interface.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1904) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1905) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1906) static int drxj_dap_read_aud_reg16(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1907) 					 u32 addr, u16 *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1908) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1909) 	u32 start_timer = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1910) 	u32 current_timer = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1911) 	u32 delta_timer = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1912) 	u16 tr_status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1913) 	int stat = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1914) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1915) 	/* No read possible for bank 3, return with error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1916) 	if (DRXDAP_FASI_ADDR2BANK(addr) == 3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1917) 		stat = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1918) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1919) 		const u32 write_bit = ((dr_xaddr_t) 1) << 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1920) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1921) 		/* Force reset write bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1922) 		addr &= (~write_bit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1923) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1924) 		/* Set up read */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1925) 		start_timer = jiffies_to_msecs(jiffies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1926) 		do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1927) 			/* RMW to aud TR IF until request is granted or timeout */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1928) 			stat = drxj_dap_read_modify_write_reg16(dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1929) 							     addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1930) 							     SIO_HI_RA_RAM_S0_RMWBUF__A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1931) 							     0x0000, &tr_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1932) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1933) 			if (stat != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1934) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1935) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1936) 			current_timer = jiffies_to_msecs(jiffies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1937) 			delta_timer = current_timer - start_timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1938) 			if (delta_timer > DRXJ_DAP_AUDTRIF_TIMEOUT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1939) 				stat = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1940) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1941) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1942) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1943) 		} while (((tr_status & AUD_TOP_TR_CTR_FIFO_LOCK__M) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1944) 			  AUD_TOP_TR_CTR_FIFO_LOCK_LOCKED) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1945) 			 ((tr_status & AUD_TOP_TR_CTR_FIFO_FULL__M) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1946) 			  AUD_TOP_TR_CTR_FIFO_FULL_FULL));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1947) 	}			/* if ( DRXDAP_FASI_ADDR2BANK(addr)!=3 ) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1948) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1949) 	/* Wait for read ready status or timeout */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1950) 	if (stat == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1951) 		start_timer = jiffies_to_msecs(jiffies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1952) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1953) 		while ((tr_status & AUD_TOP_TR_CTR_FIFO_RD_RDY__M) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1954) 		       AUD_TOP_TR_CTR_FIFO_RD_RDY_READY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1955) 			stat = drxj_dap_read_reg16(dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1956) 						  AUD_TOP_TR_CTR__A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1957) 						  &tr_status, 0x0000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1958) 			if (stat != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1959) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1960) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1961) 			current_timer = jiffies_to_msecs(jiffies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1962) 			delta_timer = current_timer - start_timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1963) 			if (delta_timer > DRXJ_DAP_AUDTRIF_TIMEOUT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1964) 				stat = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1965) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1966) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1967) 		}		/* while ( ... ) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1968) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1969) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1970) 	/* Read value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1971) 	if (stat == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1972) 		stat = drxj_dap_read_modify_write_reg16(dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1973) 						     AUD_TOP_TR_RD_REG__A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1974) 						     SIO_HI_RA_RAM_S0_RMWBUF__A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1975) 						     0x0000, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1976) 	return stat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1977) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1978) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1979) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1980) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1981) static int drxj_dap_read_reg16(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1982) 				      u32 addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1983) 				      u16 *data, u32 flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1984) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1985) 	int stat = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1986) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1987) 	/* Check param */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1988) 	if ((dev_addr == NULL) || (data == NULL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1989) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1990) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1991) 	if (is_handled_by_aud_tr_if(addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1992) 		stat = drxj_dap_read_aud_reg16(dev_addr, addr, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1993) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1994) 		stat = drxdap_fasi_read_reg16(dev_addr, addr, data, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1995) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1996) 	return stat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1997) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1998) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1999) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2000) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2001) * \fn int drxj_dap_write_aud_reg16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2002) * \brief Write 16 bits audio register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2003) * \param dev_addr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2004) * \param addr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2005) * \param data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2006) * \return int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2007) * \retval 0 Success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2008) * \retval -EIO Timeout, I2C error, illegal bank
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2009) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2010) * 16 bits register write access via audio token ring interface.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2011) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2012) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2013) static int drxj_dap_write_aud_reg16(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2014) 					  u32 addr, u16 data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2015) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2016) 	int stat = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2017) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2018) 	/* No write possible for bank 2, return with error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2019) 	if (DRXDAP_FASI_ADDR2BANK(addr) == 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2020) 		stat = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2021) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2022) 		u32 start_timer = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2023) 		u32 current_timer = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2024) 		u32 delta_timer = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2025) 		u16 tr_status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2026) 		const u32 write_bit = ((dr_xaddr_t) 1) << 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2027) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2028) 		/* Force write bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2029) 		addr |= write_bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2030) 		start_timer = jiffies_to_msecs(jiffies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2031) 		do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2032) 			/* RMW to aud TR IF until request is granted or timeout */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2033) 			stat = drxj_dap_read_modify_write_reg16(dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2034) 							     addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2035) 							     SIO_HI_RA_RAM_S0_RMWBUF__A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2036) 							     data, &tr_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2037) 			if (stat != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2038) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2039) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2040) 			current_timer = jiffies_to_msecs(jiffies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2041) 			delta_timer = current_timer - start_timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2042) 			if (delta_timer > DRXJ_DAP_AUDTRIF_TIMEOUT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2043) 				stat = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2044) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2045) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2046) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2047) 		} while (((tr_status & AUD_TOP_TR_CTR_FIFO_LOCK__M) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2048) 			  AUD_TOP_TR_CTR_FIFO_LOCK_LOCKED) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2049) 			 ((tr_status & AUD_TOP_TR_CTR_FIFO_FULL__M) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2050) 			  AUD_TOP_TR_CTR_FIFO_FULL_FULL));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2051) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2052) 	}			/* if ( DRXDAP_FASI_ADDR2BANK(addr)!=2 ) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2053) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2054) 	return stat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2055) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2056) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2057) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2058) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2059) static int drxj_dap_write_reg16(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2060) 				       u32 addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2061) 				       u16 data, u32 flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2062) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2063) 	int stat = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2064) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2065) 	/* Check param */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2066) 	if (dev_addr == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2067) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2068) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2069) 	if (is_handled_by_aud_tr_if(addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2070) 		stat = drxj_dap_write_aud_reg16(dev_addr, addr, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2071) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2072) 		stat = drxdap_fasi_write_reg16(dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2073) 							    addr, data, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2074) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2075) 	return stat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2076) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2077) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2078) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2079) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2080) /* Free data ram in SIO HI */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2081) #define SIO_HI_RA_RAM_USR_BEGIN__A 0x420040
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2082) #define SIO_HI_RA_RAM_USR_END__A   0x420060
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2083) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2084) #define DRXJ_HI_ATOMIC_BUF_START (SIO_HI_RA_RAM_USR_BEGIN__A)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2085) #define DRXJ_HI_ATOMIC_BUF_END   (SIO_HI_RA_RAM_USR_BEGIN__A + 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2086) #define DRXJ_HI_ATOMIC_READ      SIO_HI_RA_RAM_PAR_3_ACP_RW_READ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2087) #define DRXJ_HI_ATOMIC_WRITE     SIO_HI_RA_RAM_PAR_3_ACP_RW_WRITE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2088) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2089) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2090) * \fn int drxj_dap_atomic_read_write_block()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2091) * \brief Basic access routine for atomic read or write access
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2092) * \param dev_addr  pointer to i2c dev address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2093) * \param addr     destination/source address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2094) * \param datasize size of data buffer in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2095) * \param data     pointer to data buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2096) * \return int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2097) * \retval 0 Success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2098) * \retval -EIO Timeout, I2C error, illegal bank
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2099) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2100) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2101) static
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2102) int drxj_dap_atomic_read_write_block(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2103) 					  u32 addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2104) 					  u16 datasize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2105) 					  u8 *data, bool read_flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2106) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2107) 	struct drxj_hi_cmd hi_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2108) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2109) 	u16 word;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2110) 	u16 dummy = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2111) 	u16 i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2112) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2113) 	/* Parameter check */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2114) 	if (!data || !dev_addr || ((datasize % 2)) || ((datasize / 2) > 8))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2115) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2116) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2117) 	/* Set up HI parameters to read or write n bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2118) 	hi_cmd.cmd = SIO_HI_RA_RAM_CMD_ATOMIC_COPY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2119) 	hi_cmd.param1 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2120) 	    (u16) ((DRXDAP_FASI_ADDR2BLOCK(DRXJ_HI_ATOMIC_BUF_START) << 6) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2121) 		     DRXDAP_FASI_ADDR2BANK(DRXJ_HI_ATOMIC_BUF_START));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2122) 	hi_cmd.param2 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2123) 	    (u16) DRXDAP_FASI_ADDR2OFFSET(DRXJ_HI_ATOMIC_BUF_START);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2124) 	hi_cmd.param3 = (u16) ((datasize / 2) - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2125) 	if (!read_flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2126) 		hi_cmd.param3 |= DRXJ_HI_ATOMIC_WRITE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2127) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2128) 		hi_cmd.param3 |= DRXJ_HI_ATOMIC_READ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2129) 	hi_cmd.param4 = (u16) ((DRXDAP_FASI_ADDR2BLOCK(addr) << 6) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2130) 				DRXDAP_FASI_ADDR2BANK(addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2131) 	hi_cmd.param5 = (u16) DRXDAP_FASI_ADDR2OFFSET(addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2132) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2133) 	if (!read_flag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2134) 		/* write data to buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2135) 		for (i = 0; i < (datasize / 2); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2136) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2137) 			word = ((u16) data[2 * i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2138) 			word += (((u16) data[(2 * i) + 1]) << 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2139) 			drxj_dap_write_reg16(dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2140) 					     (DRXJ_HI_ATOMIC_BUF_START + i),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2141) 					    word, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2142) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2143) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2144) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2145) 	rc = hi_command(dev_addr, &hi_cmd, &dummy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2146) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2147) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2148) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2149) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2150) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2151) 	if (read_flag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2152) 		/* read data from buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2153) 		for (i = 0; i < (datasize / 2); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2154) 			rc = drxj_dap_read_reg16(dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2155) 						 (DRXJ_HI_ATOMIC_BUF_START + i),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2156) 						 &word, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2157) 			if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2158) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2159) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2160) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2161) 			data[2 * i] = (u8) (word & 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2162) 			data[(2 * i) + 1] = (u8) (word >> 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2163) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2164) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2165) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2166) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2167) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2168) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2169) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2170) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2171) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2172) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2173) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2174) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2175) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2176) * \fn int drxj_dap_atomic_read_reg32()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2177) * \brief Atomic read of 32 bits words
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2178) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2179) static
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2180) int drxj_dap_atomic_read_reg32(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2181) 				     u32 addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2182) 				     u32 *data, u32 flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2183) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2184) 	u8 buf[sizeof(*data)] = { 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2185) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2186) 	u32 word = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2187) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2188) 	if (!data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2189) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2191) 	rc = drxj_dap_atomic_read_write_block(dev_addr, addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2192) 					      sizeof(*data), buf, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2193) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2194) 	if (rc < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2195) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2196) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2197) 	word = (u32) buf[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2198) 	word <<= 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2199) 	word |= (u32) buf[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2200) 	word <<= 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2201) 	word |= (u32) buf[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2202) 	word <<= 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2203) 	word |= (u32) buf[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2204) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2205) 	*data = word;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2206) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2207) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2208) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2209) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2210) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2211) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2212) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2213) /*==                        END DRXJ DAP FUNCTIONS                          ==*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2214) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2215) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2216) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2217) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2218) /*==                      HOST INTERFACE FUNCTIONS                          ==*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2219) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2220) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2221) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2222) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2223) * \fn int hi_cfg_command()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2224) * \brief Configure HI with settings stored in the demod structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2225) * \param demod Demodulator.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2226) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2227) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2228) * This routine was created because to much orthogonal settings have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2229) * been put into one HI API function (configure). Especially the I2C bridge
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2230) * enable/disable should not need re-configuration of the HI.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2231) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2232) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2233) static int hi_cfg_command(const struct drx_demod_instance *demod)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2234) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2235) 	struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2236) 	struct drxj_hi_cmd hi_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2237) 	u16 result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2238) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2239) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2240) 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2241) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2242) 	hi_cmd.cmd = SIO_HI_RA_RAM_CMD_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2243) 	hi_cmd.param1 = SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2244) 	hi_cmd.param2 = ext_attr->hi_cfg_timing_div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2245) 	hi_cmd.param3 = ext_attr->hi_cfg_bridge_delay;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2246) 	hi_cmd.param4 = ext_attr->hi_cfg_wake_up_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2247) 	hi_cmd.param5 = ext_attr->hi_cfg_ctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2248) 	hi_cmd.param6 = ext_attr->hi_cfg_transmit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2249) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2250) 	rc = hi_command(demod->my_i2c_dev_addr, &hi_cmd, &result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2251) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2252) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2253) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2254) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2255) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2256) 	/* Reset power down flag (set one call only) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2257) 	ext_attr->hi_cfg_ctrl &= (~(SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2258) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2259) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2260) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2261) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2262) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2263) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2264) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2265) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2266) * \fn int hi_command()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2267) * \brief Configure HI with settings stored in the demod structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2268) * \param dev_addr I2C address.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2269) * \param cmd HI command.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2270) * \param result HI command result.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2271) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2272) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2273) * Sends command to HI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2274) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2275) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2276) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2277) hi_command(struct i2c_device_addr *dev_addr, const struct drxj_hi_cmd *cmd, u16 *result)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2278) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2279) 	u16 wait_cmd = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2280) 	u16 nr_retries = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2281) 	bool powerdown_cmd = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2282) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2283) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2284) 	/* Write parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2285) 	switch (cmd->cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2286) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2287) 	case SIO_HI_RA_RAM_CMD_CONFIG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2288) 	case SIO_HI_RA_RAM_CMD_ATOMIC_COPY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2289) 		rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_6__A, cmd->param6, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2290) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2291) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2292) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2293) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2294) 		rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_5__A, cmd->param5, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2295) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2296) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2297) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2298) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2299) 		rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_4__A, cmd->param4, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2300) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2301) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2302) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2303) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2304) 		rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_3__A, cmd->param3, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2305) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2306) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2307) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2308) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2309) 		fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2310) 	case SIO_HI_RA_RAM_CMD_BRDCTRL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2311) 		rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_2__A, cmd->param2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2312) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2313) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2314) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2315) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2316) 		rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_1__A, cmd->param1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2317) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2318) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2319) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2320) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2321) 		fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2322) 	case SIO_HI_RA_RAM_CMD_NULL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2323) 		/* No parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2324) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2325) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2326) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2327) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2328) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2329) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2330) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2331) 	/* Write command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2332) 	rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_CMD__A, cmd->cmd, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2333) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2334) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2335) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2336) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2337) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2338) 	if ((cmd->cmd) == SIO_HI_RA_RAM_CMD_RESET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2339) 		msleep(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2340) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2341) 	/* Detect power down to omit reading result */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2342) 	powerdown_cmd = (bool) ((cmd->cmd == SIO_HI_RA_RAM_CMD_CONFIG) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2343) 				  (((cmd->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2344) 				     param5) & SIO_HI_RA_RAM_PAR_5_CFG_SLEEP__M)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2345) 				   == SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2346) 	if (!powerdown_cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2347) 		/* Wait until command rdy */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2348) 		do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2349) 			nr_retries++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2350) 			if (nr_retries > DRXJ_MAX_RETRIES) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2351) 				pr_err("timeout\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2352) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2353) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2354) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2355) 			rc = drxj_dap_read_reg16(dev_addr, SIO_HI_RA_RAM_CMD__A, &wait_cmd, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2356) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2357) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2358) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2359) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2360) 		} while (wait_cmd != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2361) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2362) 		/* Read result */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2363) 		rc = drxj_dap_read_reg16(dev_addr, SIO_HI_RA_RAM_RES__A, result, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2364) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2365) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2366) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2367) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2368) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2369) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2370) 	/* if ( powerdown_cmd == true ) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2371) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2372) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2373) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2374) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2375) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2376) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2377) * \fn int init_hi( const struct drx_demod_instance *demod )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2378) * \brief Initialise and configurate HI.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2379) * \param demod pointer to demod data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2380) * \return int Return status.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2381) * \retval 0 Success.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2382) * \retval -EIO Failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2383) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2384) * Needs to know Psys (System Clock period) and Posc (Osc Clock period)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2385) * Need to store configuration in driver because of the way I2C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2386) * bridging is controlled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2387) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2388) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2389) static int init_hi(const struct drx_demod_instance *demod)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2390) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2391) 	struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2392) 	struct drx_common_attr *common_attr = (struct drx_common_attr *) (NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2393) 	struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2394) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2395) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2396) 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2397) 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2398) 	dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2399) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2400) 	/* PATCH for bug 5003, HI ucode v3.1.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2401) 	rc = drxj_dap_write_reg16(dev_addr, 0x4301D7, 0x801, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2402) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2403) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2404) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2405) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2406) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2407) 	/* Timing div, 250ns/Psys */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2408) 	/* Timing div, = ( delay (nano seconds) * sysclk (kHz) )/ 1000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2409) 	ext_attr->hi_cfg_timing_div =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2410) 	    (u16) ((common_attr->sys_clock_freq / 1000) * HI_I2C_DELAY) / 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2411) 	/* Clipping */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2412) 	if ((ext_attr->hi_cfg_timing_div) > SIO_HI_RA_RAM_PAR_2_CFG_DIV__M)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2413) 		ext_attr->hi_cfg_timing_div = SIO_HI_RA_RAM_PAR_2_CFG_DIV__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2414) 	/* Bridge delay, uses oscilator clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2415) 	/* Delay = ( delay (nano seconds) * oscclk (kHz) )/ 1000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2416) 	/* SDA brdige delay */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2417) 	ext_attr->hi_cfg_bridge_delay =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2418) 	    (u16) ((common_attr->osc_clock_freq / 1000) * HI_I2C_BRIDGE_DELAY) /
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2419) 	    1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2420) 	/* Clipping */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2421) 	if ((ext_attr->hi_cfg_bridge_delay) > SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2422) 		ext_attr->hi_cfg_bridge_delay = SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2423) 	/* SCL bridge delay, same as SDA for now */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2424) 	ext_attr->hi_cfg_bridge_delay += ((ext_attr->hi_cfg_bridge_delay) <<
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2425) 				      SIO_HI_RA_RAM_PAR_3_CFG_DBL_SCL__B);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2426) 	/* Wakeup key, setting the read flag (as suggest in the documentation) does
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2427) 	   not always result into a working solution (barebones worked VI2C failed).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2428) 	   Not setting the bit works in all cases . */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2429) 	ext_attr->hi_cfg_wake_up_key = DRXJ_WAKE_UP_KEY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2430) 	/* port/bridge/power down ctrl */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2431) 	ext_attr->hi_cfg_ctrl = (SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2432) 	/* transit mode time out delay and watch dog divider */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2433) 	ext_attr->hi_cfg_transmit = SIO_HI_RA_RAM_PAR_6__PRE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2434) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2435) 	rc = hi_cfg_command(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2436) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2437) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2438) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2439) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2440) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2441) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2442) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2443) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2444) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2445) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2446) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2447) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2448) /*==                   END HOST INTERFACE FUNCTIONS                         ==*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2449) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2450) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2451) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2452) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2453) /*==                        AUXILIARY FUNCTIONS                             ==*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2454) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2455) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2456) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2457) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2458) * \fn int get_device_capabilities()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2459) * \brief Get and store device capabilities.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2460) * \param demod  Pointer to demodulator instance.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2461) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2462) * \return 0    Success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2463) * \retval -EIO Failure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2464) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2465) * Depending on pulldowns on MDx pins the following internals are set:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2466) *  * common_attr->osc_clock_freq
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2467) *  * ext_attr->has_lna
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2468) *  * ext_attr->has_ntsc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2469) *  * ext_attr->has_btsc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2470) *  * ext_attr->has_oob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2471) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2472) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2473) static int get_device_capabilities(struct drx_demod_instance *demod)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2474) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2475) 	struct drx_common_attr *common_attr = (struct drx_common_attr *) (NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2476) 	struct drxj_data *ext_attr = (struct drxj_data *) NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2477) 	struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2478) 	u16 sio_pdr_ohw_cfg = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2479) 	u32 sio_top_jtagid_lo = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2480) 	u16 bid = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2481) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2482) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2483) 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2484) 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2485) 	dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2486) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2487) 	rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2488) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2489) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2490) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2491) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2492) 	rc = drxj_dap_read_reg16(dev_addr, SIO_PDR_OHW_CFG__A, &sio_pdr_ohw_cfg, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2493) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2494) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2495) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2496) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2497) 	rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY__PRE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2498) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2499) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2500) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2501) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2502) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2503) 	switch ((sio_pdr_ohw_cfg & SIO_PDR_OHW_CFG_FREF_SEL__M)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2504) 	case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2505) 		/* ignore (bypass ?) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2506) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2507) 	case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2508) 		/* 27 MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2509) 		common_attr->osc_clock_freq = 27000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2510) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2511) 	case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2512) 		/* 20.25 MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2513) 		common_attr->osc_clock_freq = 20250;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2514) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2515) 	case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2516) 		/* 4 MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2517) 		common_attr->osc_clock_freq = 4000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2518) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2519) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2520) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2521) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2522) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2523) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2524) 	   Determine device capabilities
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2525) 	   Based on pinning v47
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2526) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2527) 	rc = drxdap_fasi_read_reg32(dev_addr, SIO_TOP_JTAGID_LO__A, &sio_top_jtagid_lo, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2528) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2529) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2530) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2531) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2532) 	ext_attr->mfx = (u8) ((sio_top_jtagid_lo >> 29) & 0xF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2533) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2534) 	switch ((sio_top_jtagid_lo >> 12) & 0xFF) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2535) 	case 0x31:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2536) 		rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2537) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2538) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2539) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2540) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2541) 		rc = drxj_dap_read_reg16(dev_addr, SIO_PDR_UIO_IN_HI__A, &bid, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2542) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2543) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2544) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2545) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2546) 		bid = (bid >> 10) & 0xf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2547) 		rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY__PRE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2548) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2549) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2550) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2551) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2552) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2553) 		ext_attr->has_lna = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2554) 		ext_attr->has_ntsc = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2555) 		ext_attr->has_btsc = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2556) 		ext_attr->has_oob = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2557) 		ext_attr->has_smatx = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2558) 		ext_attr->has_smarx = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2559) 		ext_attr->has_gpio = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2560) 		ext_attr->has_irqn = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2561) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2562) 	case 0x33:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2563) 		ext_attr->has_lna = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2564) 		ext_attr->has_ntsc = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2565) 		ext_attr->has_btsc = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2566) 		ext_attr->has_oob = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2567) 		ext_attr->has_smatx = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2568) 		ext_attr->has_smarx = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2569) 		ext_attr->has_gpio = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2570) 		ext_attr->has_irqn = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2571) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2572) 	case 0x45:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2573) 		ext_attr->has_lna = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2574) 		ext_attr->has_ntsc = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2575) 		ext_attr->has_btsc = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2576) 		ext_attr->has_oob = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2577) 		ext_attr->has_smatx = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2578) 		ext_attr->has_smarx = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2579) 		ext_attr->has_gpio = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2580) 		ext_attr->has_irqn = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2581) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2582) 	case 0x46:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2583) 		ext_attr->has_lna = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2584) 		ext_attr->has_ntsc = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2585) 		ext_attr->has_btsc = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2586) 		ext_attr->has_oob = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2587) 		ext_attr->has_smatx = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2588) 		ext_attr->has_smarx = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2589) 		ext_attr->has_gpio = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2590) 		ext_attr->has_irqn = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2591) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2592) 	case 0x41:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2593) 		ext_attr->has_lna = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2594) 		ext_attr->has_ntsc = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2595) 		ext_attr->has_btsc = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2596) 		ext_attr->has_oob = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2597) 		ext_attr->has_smatx = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2598) 		ext_attr->has_smarx = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2599) 		ext_attr->has_gpio = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2600) 		ext_attr->has_irqn = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2601) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2602) 	case 0x43:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2603) 		ext_attr->has_lna = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2604) 		ext_attr->has_ntsc = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2605) 		ext_attr->has_btsc = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2606) 		ext_attr->has_oob = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2607) 		ext_attr->has_smatx = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2608) 		ext_attr->has_smarx = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2609) 		ext_attr->has_gpio = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2610) 		ext_attr->has_irqn = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2611) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2612) 	case 0x32:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2613) 		ext_attr->has_lna = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2614) 		ext_attr->has_ntsc = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2615) 		ext_attr->has_btsc = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2616) 		ext_attr->has_oob = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2617) 		ext_attr->has_smatx = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2618) 		ext_attr->has_smarx = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2619) 		ext_attr->has_gpio = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2620) 		ext_attr->has_irqn = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2621) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2622) 	case 0x34:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2623) 		ext_attr->has_lna = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2624) 		ext_attr->has_ntsc = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2625) 		ext_attr->has_btsc = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2626) 		ext_attr->has_oob = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2627) 		ext_attr->has_smatx = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2628) 		ext_attr->has_smarx = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2629) 		ext_attr->has_gpio = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2630) 		ext_attr->has_irqn = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2631) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2632) 	case 0x42:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2633) 		ext_attr->has_lna = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2634) 		ext_attr->has_ntsc = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2635) 		ext_attr->has_btsc = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2636) 		ext_attr->has_oob = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2637) 		ext_attr->has_smatx = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2638) 		ext_attr->has_smarx = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2639) 		ext_attr->has_gpio = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2640) 		ext_attr->has_irqn = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2641) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2642) 	case 0x44:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2643) 		ext_attr->has_lna = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2644) 		ext_attr->has_ntsc = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2645) 		ext_attr->has_btsc = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2646) 		ext_attr->has_oob = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2647) 		ext_attr->has_smatx = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2648) 		ext_attr->has_smarx = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2649) 		ext_attr->has_gpio = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2650) 		ext_attr->has_irqn = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2651) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2652) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2653) 		/* Unknown device variant */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2654) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2655) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2656) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2657) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2658) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2659) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2660) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2661) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2662) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2663) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2664) * \fn int power_up_device()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2665) * \brief Power up device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2666) * \param demod  Pointer to demodulator instance.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2667) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2668) * \return 0    Success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2669) * \retval -EIO Failure, I2C or max retries reached
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2670) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2671) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2672) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2673) #ifndef DRXJ_MAX_RETRIES_POWERUP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2674) #define DRXJ_MAX_RETRIES_POWERUP 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2675) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2676) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2677) static int power_up_device(struct drx_demod_instance *demod)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2678) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2679) 	struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2680) 	u8 data = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2681) 	u16 retry_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2682) 	struct i2c_device_addr wake_up_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2683) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2684) 	dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2685) 	wake_up_addr.i2c_addr = DRXJ_WAKE_UP_KEY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2686) 	wake_up_addr.i2c_dev_id = dev_addr->i2c_dev_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2687) 	wake_up_addr.user_data = dev_addr->user_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2688) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2689) 	 * I2C access may fail in this case: no ack
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2690) 	 * dummy write must be used to wake uop device, dummy read must be used to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2691) 	 * reset HI state machine (avoiding actual writes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2692) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2693) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2694) 		data = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2695) 		drxbsp_i2c_write_read(&wake_up_addr, 1, &data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2696) 				      (struct i2c_device_addr *)(NULL), 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2697) 				     (u8 *)(NULL));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2698) 		msleep(10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2699) 		retry_count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2700) 	} while ((drxbsp_i2c_write_read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2701) 		  ((struct i2c_device_addr *) (NULL), 0, (u8 *)(NULL), dev_addr, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2702) 		   &data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2703) 		  != 0) && (retry_count < DRXJ_MAX_RETRIES_POWERUP));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2704) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2705) 	/* Need some recovery time .... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2706) 	msleep(10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2707) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2708) 	if (retry_count == DRXJ_MAX_RETRIES_POWERUP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2709) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2710) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2711) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2712) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2713) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2714) /*----------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2715) /* MPEG Output Configuration Functions - begin                                */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2716) /*----------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2717) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2718) * \fn int ctrl_set_cfg_mpeg_output()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2719) * \brief Set MPEG output configuration of the device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2720) * \param devmod  Pointer to demodulator instance.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2721) * \param cfg_data Pointer to mpeg output configuaration.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2722) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2723) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2724) *  Configure MPEG output parameters.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2725) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2726) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2727) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2728) ctrl_set_cfg_mpeg_output(struct drx_demod_instance *demod, struct drx_cfg_mpeg_output *cfg_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2729) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2730) 	struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2731) 	struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2732) 	struct drx_common_attr *common_attr = (struct drx_common_attr *) (NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2733) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2734) 	u16 fec_oc_reg_mode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2735) 	u16 fec_oc_reg_ipr_mode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2736) 	u16 fec_oc_reg_ipr_invert = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2737) 	u32 max_bit_rate = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2738) 	u32 rcn_rate = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2739) 	u32 nr_bits = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2740) 	u16 sio_pdr_md_cfg = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2741) 	/* data mask for the output data byte */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2742) 	u16 invert_data_mask =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2743) 	    FEC_OC_IPR_INVERT_MD7__M | FEC_OC_IPR_INVERT_MD6__M |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2744) 	    FEC_OC_IPR_INVERT_MD5__M | FEC_OC_IPR_INVERT_MD4__M |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2745) 	    FEC_OC_IPR_INVERT_MD3__M | FEC_OC_IPR_INVERT_MD2__M |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2746) 	    FEC_OC_IPR_INVERT_MD1__M | FEC_OC_IPR_INVERT_MD0__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2747) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2748) 	/* check arguments */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2749) 	if ((demod == NULL) || (cfg_data == NULL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2750) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2751) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2752) 	dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2753) 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2754) 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2755) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2756) 	if (cfg_data->enable_mpeg_output == true) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2757) 		/* quick and dirty patch to set MPEG in case current std is not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2758) 		   producing MPEG */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2759) 		switch (ext_attr->standard) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2760) 		case DRX_STANDARD_8VSB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2761) 		case DRX_STANDARD_ITU_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2762) 		case DRX_STANDARD_ITU_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2763) 		case DRX_STANDARD_ITU_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2764) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2765) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2766) 			return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2767) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2768) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2769) 		rc = drxj_dap_write_reg16(dev_addr, FEC_OC_OCR_INVERT__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2770) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2771) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2772) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2773) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2774) 		switch (ext_attr->standard) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2775) 		case DRX_STANDARD_8VSB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2776) 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_FCT_USAGE__A, 7, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2777) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2778) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2779) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2780) 			}	/* 2048 bytes fifo ram */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2781) 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_CTL_UPD_RATE__A, 10, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2782) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2783) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2784) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2785) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2786) 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_INT_UPD_RATE__A, 10, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2787) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2788) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2789) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2790) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2791) 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_A__A, 5, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2792) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2793) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2794) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2795) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2796) 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_B__A, 7, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2797) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2798) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2799) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2800) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2801) 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_RCN_GAIN__A, 10, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2802) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2803) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2804) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2805) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2806) 			/* Low Water Mark for synchronization  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2807) 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_LWM__A, 3, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2808) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2809) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2810) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2811) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2812) 			/* High Water Mark for synchronization */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2813) 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_HWM__A, 5, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2814) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2815) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2816) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2817) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2818) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2819) 		case DRX_STANDARD_ITU_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2820) 		case DRX_STANDARD_ITU_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2821) 			switch (ext_attr->constellation) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2822) 			case DRX_CONSTELLATION_QAM256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2823) 				nr_bits = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2824) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2825) 			case DRX_CONSTELLATION_QAM128:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2826) 				nr_bits = 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2827) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2828) 			case DRX_CONSTELLATION_QAM64:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2829) 				nr_bits = 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2830) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2831) 			case DRX_CONSTELLATION_QAM32:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2832) 				nr_bits = 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2833) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2834) 			case DRX_CONSTELLATION_QAM16:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2835) 				nr_bits = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2836) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2837) 			default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2838) 				return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2839) 			}	/* ext_attr->constellation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2840) 			/* max_bit_rate = symbol_rate * nr_bits * coef */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2841) 			/* coef = 188/204                          */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2842) 			max_bit_rate =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2843) 			    (ext_attr->curr_symbol_rate / 8) * nr_bits * 188;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2844) 			fallthrough;	/* as b/c Annex A/C need following settings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2845) 		case DRX_STANDARD_ITU_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2846) 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_FCT_USAGE__A, FEC_OC_FCT_USAGE__PRE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2847) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2848) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2849) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2850) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2851) 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_CTL_UPD_RATE__A, FEC_OC_TMD_CTL_UPD_RATE__PRE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2852) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2853) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2854) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2855) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2856) 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_INT_UPD_RATE__A, 5, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2857) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2858) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2859) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2860) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2861) 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_A__A, FEC_OC_AVR_PARM_A__PRE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2862) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2863) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2864) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2865) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2866) 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_B__A, FEC_OC_AVR_PARM_B__PRE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2867) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2868) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2869) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2870) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2871) 			if (cfg_data->static_clk == true) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2872) 				rc = drxj_dap_write_reg16(dev_addr, FEC_OC_RCN_GAIN__A, 0xD, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2873) 				if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2874) 					pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2875) 					goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2876) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2877) 			} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2878) 				rc = drxj_dap_write_reg16(dev_addr, FEC_OC_RCN_GAIN__A, FEC_OC_RCN_GAIN__PRE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2879) 				if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2880) 					pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2881) 					goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2882) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2883) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2884) 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_LWM__A, 2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2885) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2886) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2887) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2888) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2889) 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_HWM__A, 12, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2890) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2891) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2892) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2893) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2894) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2895) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2896) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2897) 		}		/* switch (standard) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2898) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2899) 		/* Check insertion of the Reed-Solomon parity bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2900) 		rc = drxj_dap_read_reg16(dev_addr, FEC_OC_MODE__A, &fec_oc_reg_mode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2901) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2902) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2903) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2904) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2905) 		rc = drxj_dap_read_reg16(dev_addr, FEC_OC_IPR_MODE__A, &fec_oc_reg_ipr_mode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2906) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2907) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2908) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2909) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2910) 		if (cfg_data->insert_rs_byte == true) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2911) 			/* enable parity symbol forward */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2912) 			fec_oc_reg_mode |= FEC_OC_MODE_PARITY__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2913) 			/* MVAL disable during parity bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2914) 			fec_oc_reg_ipr_mode |= FEC_OC_IPR_MODE_MVAL_DIS_PAR__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2915) 			switch (ext_attr->standard) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2916) 			case DRX_STANDARD_8VSB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2917) 				rcn_rate = 0x004854D3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2918) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2919) 			case DRX_STANDARD_ITU_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2920) 				fec_oc_reg_mode |= FEC_OC_MODE_TRANSPARENT__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2921) 				switch (ext_attr->constellation) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2922) 				case DRX_CONSTELLATION_QAM256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2923) 					rcn_rate = 0x008945E7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2924) 					break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2925) 				case DRX_CONSTELLATION_QAM64:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2926) 					rcn_rate = 0x005F64D4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2927) 					break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2928) 				default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2929) 					return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2930) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2931) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2932) 			case DRX_STANDARD_ITU_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2933) 			case DRX_STANDARD_ITU_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2934) 				/* insert_rs_byte = true -> coef = 188/188 -> 1, RS bits are in MPEG output */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2935) 				rcn_rate =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2936) 				    (frac28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2937) 				     (max_bit_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2938) 				      (u32) (common_attr->sys_clock_freq / 8))) /
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2939) 				    188;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2940) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2941) 			default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2942) 				return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2943) 			}	/* ext_attr->standard */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2944) 		} else {	/* insert_rs_byte == false */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2945) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2946) 			/* disable parity symbol forward */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2947) 			fec_oc_reg_mode &= (~FEC_OC_MODE_PARITY__M);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2948) 			/* MVAL enable during parity bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2949) 			fec_oc_reg_ipr_mode &= (~FEC_OC_IPR_MODE_MVAL_DIS_PAR__M);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2950) 			switch (ext_attr->standard) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2951) 			case DRX_STANDARD_8VSB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2952) 				rcn_rate = 0x0041605C;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2953) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2954) 			case DRX_STANDARD_ITU_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2955) 				fec_oc_reg_mode &= (~FEC_OC_MODE_TRANSPARENT__M);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2956) 				switch (ext_attr->constellation) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2957) 				case DRX_CONSTELLATION_QAM256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2958) 					rcn_rate = 0x0082D6A0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2959) 					break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2960) 				case DRX_CONSTELLATION_QAM64:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2961) 					rcn_rate = 0x005AEC1A;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2962) 					break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2963) 				default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2964) 					return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2965) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2966) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2967) 			case DRX_STANDARD_ITU_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2968) 			case DRX_STANDARD_ITU_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2969) 				/* insert_rs_byte = false -> coef = 188/204, RS bits not in MPEG output */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2970) 				rcn_rate =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2971) 				    (frac28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2972) 				     (max_bit_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2973) 				      (u32) (common_attr->sys_clock_freq / 8))) /
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2974) 				    204;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2975) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2976) 			default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2977) 				return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2978) 			}	/* ext_attr->standard */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2979) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2980) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2981) 		if (cfg_data->enable_parallel == true) {	/* MPEG data output is parallel -> clear ipr_mode[0] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2982) 			fec_oc_reg_ipr_mode &= (~(FEC_OC_IPR_MODE_SERIAL__M));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2983) 		} else {	/* MPEG data output is serial -> set ipr_mode[0] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2984) 			fec_oc_reg_ipr_mode |= FEC_OC_IPR_MODE_SERIAL__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2985) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2986) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2987) 		/* Control slective inversion of output bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2988) 		if (cfg_data->invert_data == true)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2989) 			fec_oc_reg_ipr_invert |= invert_data_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2990) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2991) 			fec_oc_reg_ipr_invert &= (~(invert_data_mask));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2992) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2993) 		if (cfg_data->invert_err == true)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2994) 			fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MERR__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2995) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2996) 			fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MERR__M));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2997) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2998) 		if (cfg_data->invert_str == true)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2999) 			fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MSTRT__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3000) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3001) 			fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MSTRT__M));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3002) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3003) 		if (cfg_data->invert_val == true)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3004) 			fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MVAL__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3005) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3006) 			fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MVAL__M));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3007) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3008) 		if (cfg_data->invert_clk == true)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3009) 			fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MCLK__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3010) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3011) 			fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MCLK__M));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3012) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3013) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3014) 		if (cfg_data->static_clk == true) {	/* Static mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3015) 			u32 dto_rate = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3016) 			u32 bit_rate = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3017) 			u16 fec_oc_dto_burst_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3018) 			u16 fec_oc_dto_period = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3019) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3020) 			fec_oc_dto_burst_len = FEC_OC_DTO_BURST_LEN__PRE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3021) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3022) 			switch (ext_attr->standard) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3023) 			case DRX_STANDARD_8VSB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3024) 				fec_oc_dto_period = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3025) 				if (cfg_data->insert_rs_byte == true)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3026) 					fec_oc_dto_burst_len = 208;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3027) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3028) 			case DRX_STANDARD_ITU_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3029) 				{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3030) 					u32 symbol_rate_th = 6400000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3031) 					if (cfg_data->insert_rs_byte == true) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3032) 						fec_oc_dto_burst_len = 204;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3033) 						symbol_rate_th = 5900000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3034) 					}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3035) 					if (ext_attr->curr_symbol_rate >=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3036) 					    symbol_rate_th) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3037) 						fec_oc_dto_period = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3038) 					} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3039) 						fec_oc_dto_period = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3040) 					}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3041) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3042) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3043) 			case DRX_STANDARD_ITU_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3044) 				fec_oc_dto_period = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3045) 				if (cfg_data->insert_rs_byte == true)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3046) 					fec_oc_dto_burst_len = 128;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3047) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3048) 			case DRX_STANDARD_ITU_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3049) 				fec_oc_dto_period = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3050) 				if (cfg_data->insert_rs_byte == true)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3051) 					fec_oc_dto_burst_len = 204;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3052) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3053) 			default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3054) 				return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3055) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3056) 			bit_rate =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3057) 			    common_attr->sys_clock_freq * 1000 / (fec_oc_dto_period +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3058) 							       2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3059) 			dto_rate =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3060) 			    frac28(bit_rate, common_attr->sys_clock_freq * 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3061) 			dto_rate >>= 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3062) 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_RATE_HI__A, (u16)((dto_rate >> 16) & FEC_OC_DTO_RATE_HI__M), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3063) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3064) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3065) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3066) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3067) 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_RATE_LO__A, (u16)(dto_rate & FEC_OC_DTO_RATE_LO_RATE_LO__M), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3068) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3069) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3070) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3071) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3072) 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_MODE__A, FEC_OC_DTO_MODE_DYNAMIC__M | FEC_OC_DTO_MODE_OFFSET_ENABLE__M, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3073) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3074) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3075) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3076) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3077) 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_FCT_MODE__A, FEC_OC_FCT_MODE_RAT_ENA__M | FEC_OC_FCT_MODE_VIRT_ENA__M, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3078) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3079) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3080) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3081) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3082) 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_BURST_LEN__A, fec_oc_dto_burst_len, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3083) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3084) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3085) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3086) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3087) 			if (ext_attr->mpeg_output_clock_rate != DRXJ_MPEGOUTPUT_CLOCK_RATE_AUTO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3088) 				fec_oc_dto_period = ext_attr->mpeg_output_clock_rate - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3089) 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_PERIOD__A, fec_oc_dto_period, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3090) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3091) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3092) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3093) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3094) 		} else {	/* Dynamic mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3095) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3096) 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_MODE__A, FEC_OC_DTO_MODE_DYNAMIC__M, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3097) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3098) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3099) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3100) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3101) 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_FCT_MODE__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3102) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3103) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3104) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3105) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3106) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3108) 		rc = drxdap_fasi_write_reg32(dev_addr, FEC_OC_RCN_CTL_RATE_LO__A, rcn_rate, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3109) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3110) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3111) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3112) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3113) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3114) 		/* Write appropriate registers with requested configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3115) 		rc = drxj_dap_write_reg16(dev_addr, FEC_OC_MODE__A, fec_oc_reg_mode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3116) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3117) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3118) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3119) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3120) 		rc = drxj_dap_write_reg16(dev_addr, FEC_OC_IPR_MODE__A, fec_oc_reg_ipr_mode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3121) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3122) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3123) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3124) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3125) 		rc = drxj_dap_write_reg16(dev_addr, FEC_OC_IPR_INVERT__A, fec_oc_reg_ipr_invert, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3126) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3127) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3128) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3129) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3130) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3131) 		/* enabling for both parallel and serial now */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3132) 		/*  Write magic word to enable pdr reg write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3133) 		rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0xFABA, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3134) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3135) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3136) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3137) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3138) 		/*  Set MPEG TS pads to outputmode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3139) 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MSTRT_CFG__A, 0x0013, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3140) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3141) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3142) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3143) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3144) 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MERR_CFG__A, 0x0013, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3145) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3146) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3147) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3148) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3149) 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MCLK_CFG__A, MPEG_OUTPUT_CLK_DRIVE_STRENGTH << SIO_PDR_MCLK_CFG_DRIVE__B | 0x03 << SIO_PDR_MCLK_CFG_MODE__B, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3150) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3151) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3152) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3153) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3154) 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MVAL_CFG__A, 0x0013, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3155) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3156) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3157) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3158) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3159) 		sio_pdr_md_cfg =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3160) 		    MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH <<
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3161) 		    SIO_PDR_MD0_CFG_DRIVE__B | 0x03 << SIO_PDR_MD0_CFG_MODE__B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3162) 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD0_CFG__A, sio_pdr_md_cfg, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3163) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3164) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3165) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3166) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3167) 		if (cfg_data->enable_parallel == true) {	/* MPEG data output is parallel -> set MD1 to MD7 to output mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3168) 			sio_pdr_md_cfg =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3169) 			    MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH <<
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3170) 			    SIO_PDR_MD0_CFG_DRIVE__B | 0x03 <<
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3171) 			    SIO_PDR_MD0_CFG_MODE__B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3172) 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD0_CFG__A, sio_pdr_md_cfg, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3173) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3174) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3175) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3176) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3177) 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD1_CFG__A, sio_pdr_md_cfg, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3178) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3179) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3180) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3181) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3182) 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD2_CFG__A, sio_pdr_md_cfg, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3183) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3184) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3185) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3186) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3187) 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD3_CFG__A, sio_pdr_md_cfg, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3188) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3189) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3190) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3191) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3192) 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD4_CFG__A, sio_pdr_md_cfg, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3193) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3194) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3195) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3196) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3197) 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD5_CFG__A, sio_pdr_md_cfg, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3198) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3199) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3200) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3201) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3202) 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD6_CFG__A, sio_pdr_md_cfg, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3203) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3204) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3205) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3206) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3207) 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD7_CFG__A, sio_pdr_md_cfg, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3208) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3209) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3210) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3211) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3212) 		} else {	/* MPEG data output is serial -> set MD1 to MD7 to tri-state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3213) 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD1_CFG__A, 0x0000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3214) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3215) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3216) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3217) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3218) 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD2_CFG__A, 0x0000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3219) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3220) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3221) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3222) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3223) 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD3_CFG__A, 0x0000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3224) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3225) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3226) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3227) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3228) 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD4_CFG__A, 0x0000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3229) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3230) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3231) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3232) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3233) 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD5_CFG__A, 0x0000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3234) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3235) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3236) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3237) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3238) 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD6_CFG__A, 0x0000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3239) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3240) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3241) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3242) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3243) 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD7_CFG__A, 0x0000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3244) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3245) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3246) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3247) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3248) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3249) 		/*  Enable Monitor Bus output over MPEG pads and ctl input */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3250) 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MON_CFG__A, 0x0000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3251) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3252) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3253) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3254) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3255) 		/*  Write nomagic word to enable pdr reg write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3256) 		rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3257) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3258) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3259) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3260) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3261) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3262) 		/*  Write magic word to enable pdr reg write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3263) 		rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0xFABA, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3264) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3265) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3266) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3267) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3268) 		/*  Set MPEG TS pads to inputmode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3269) 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MSTRT_CFG__A, 0x0000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3270) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3271) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3272) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3273) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3274) 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MERR_CFG__A, 0x0000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3275) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3276) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3277) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3278) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3279) 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MCLK_CFG__A, 0x0000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3280) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3281) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3282) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3283) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3284) 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MVAL_CFG__A, 0x0000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3285) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3286) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3287) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3288) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3289) 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD0_CFG__A, 0x0000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3290) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3291) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3292) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3293) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3294) 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD1_CFG__A, 0x0000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3295) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3296) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3297) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3298) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3299) 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD2_CFG__A, 0x0000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3300) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3301) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3302) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3303) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3304) 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD3_CFG__A, 0x0000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3305) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3306) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3307) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3308) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3309) 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD4_CFG__A, 0x0000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3310) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3311) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3312) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3313) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3314) 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD5_CFG__A, 0x0000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3315) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3316) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3317) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3318) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3319) 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD6_CFG__A, 0x0000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3320) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3321) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3322) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3323) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3324) 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD7_CFG__A, 0x0000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3325) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3326) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3327) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3328) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3329) 		/* Enable Monitor Bus output over MPEG pads and ctl input */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3330) 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MON_CFG__A, 0x0000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3331) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3332) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3333) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3334) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3335) 		/* Write nomagic word to enable pdr reg write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3336) 		rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3337) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3338) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3339) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3340) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3341) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3342) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3343) 	/* save values for restore after re-acquire */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3344) 	common_attr->mpeg_cfg.enable_mpeg_output = cfg_data->enable_mpeg_output;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3345) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3346) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3347) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3348) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3349) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3350) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3351) /*----------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3352) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3353) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3354) /*----------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3355) /* MPEG Output Configuration Functions - end                                  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3356) /*----------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3357) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3358) /*----------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3359) /* miscellaneous configurations - begin                           */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3360) /*----------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3361) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3362) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3363) * \fn int set_mpegtei_handling()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3364) * \brief Activate MPEG TEI handling settings.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3365) * \param devmod  Pointer to demodulator instance.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3366) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3367) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3368) * This routine should be called during a set channel of QAM/VSB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3369) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3370) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3371) static int set_mpegtei_handling(struct drx_demod_instance *demod)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3372) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3373) 	struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3374) 	struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3375) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3376) 	u16 fec_oc_dpr_mode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3377) 	u16 fec_oc_snc_mode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3378) 	u16 fec_oc_ems_mode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3379) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3380) 	dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3381) 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3382) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3383) 	rc = drxj_dap_read_reg16(dev_addr, FEC_OC_DPR_MODE__A, &fec_oc_dpr_mode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3384) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3385) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3386) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3387) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3388) 	rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_MODE__A, &fec_oc_snc_mode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3389) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3390) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3391) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3392) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3393) 	rc = drxj_dap_read_reg16(dev_addr, FEC_OC_EMS_MODE__A, &fec_oc_ems_mode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3394) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3395) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3396) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3397) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3398) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3399) 	/* reset to default, allow TEI bit to be changed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3400) 	fec_oc_dpr_mode &= (~FEC_OC_DPR_MODE_ERR_DISABLE__M);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3401) 	fec_oc_snc_mode &= (~(FEC_OC_SNC_MODE_ERROR_CTL__M |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3402) 			   FEC_OC_SNC_MODE_CORR_DISABLE__M));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3403) 	fec_oc_ems_mode &= (~FEC_OC_EMS_MODE_MODE__M);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3404) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3405) 	if (ext_attr->disable_te_ihandling) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3406) 		/* do not change TEI bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3407) 		fec_oc_dpr_mode |= FEC_OC_DPR_MODE_ERR_DISABLE__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3408) 		fec_oc_snc_mode |= FEC_OC_SNC_MODE_CORR_DISABLE__M |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3409) 		    ((0x2) << (FEC_OC_SNC_MODE_ERROR_CTL__B));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3410) 		fec_oc_ems_mode |= ((0x01) << (FEC_OC_EMS_MODE_MODE__B));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3411) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3412) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3413) 	rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DPR_MODE__A, fec_oc_dpr_mode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3414) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3415) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3416) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3417) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3418) 	rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_MODE__A, fec_oc_snc_mode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3419) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3420) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3421) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3422) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3423) 	rc = drxj_dap_write_reg16(dev_addr, FEC_OC_EMS_MODE__A, fec_oc_ems_mode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3424) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3425) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3426) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3427) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3428) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3429) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3430) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3431) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3432) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3433) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3434) /*----------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3435) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3436) * \fn int bit_reverse_mpeg_output()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3437) * \brief Set MPEG output bit-endian settings.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3438) * \param devmod  Pointer to demodulator instance.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3439) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3440) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3441) * This routine should be called during a set channel of QAM/VSB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3442) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3443) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3444) static int bit_reverse_mpeg_output(struct drx_demod_instance *demod)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3445) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3446) 	struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3447) 	struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3448) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3449) 	u16 fec_oc_ipr_mode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3450) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3451) 	dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3452) 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3453) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3454) 	rc = drxj_dap_read_reg16(dev_addr, FEC_OC_IPR_MODE__A, &fec_oc_ipr_mode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3455) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3456) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3457) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3458) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3459) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3460) 	/* reset to default (normal bit order) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3461) 	fec_oc_ipr_mode &= (~FEC_OC_IPR_MODE_REVERSE_ORDER__M);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3462) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3463) 	if (ext_attr->bit_reverse_mpeg_outout)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3464) 		fec_oc_ipr_mode |= FEC_OC_IPR_MODE_REVERSE_ORDER__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3465) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3466) 	rc = drxj_dap_write_reg16(dev_addr, FEC_OC_IPR_MODE__A, fec_oc_ipr_mode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3467) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3468) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3469) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3470) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3471) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3472) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3473) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3474) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3475) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3476) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3477) /*----------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3478) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3479) * \fn int set_mpeg_start_width()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3480) * \brief Set MPEG start width.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3481) * \param devmod  Pointer to demodulator instance.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3482) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3483) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3484) * This routine should be called during a set channel of QAM/VSB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3485) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3486) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3487) static int set_mpeg_start_width(struct drx_demod_instance *demod)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3488) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3489) 	struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3490) 	struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3491) 	struct drx_common_attr *common_attr = (struct drx_common_attr *) NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3492) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3493) 	u16 fec_oc_comm_mb = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3494) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3495) 	dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3496) 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3497) 	common_attr = demod->my_common_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3498) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3499) 	if ((common_attr->mpeg_cfg.static_clk == true)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3500) 	    && (common_attr->mpeg_cfg.enable_parallel == false)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3501) 		rc = drxj_dap_read_reg16(dev_addr, FEC_OC_COMM_MB__A, &fec_oc_comm_mb, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3502) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3503) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3504) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3505) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3506) 		fec_oc_comm_mb &= ~FEC_OC_COMM_MB_CTL_ON;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3507) 		if (ext_attr->mpeg_start_width == DRXJ_MPEG_START_WIDTH_8CLKCYC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3508) 			fec_oc_comm_mb |= FEC_OC_COMM_MB_CTL_ON;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3509) 		rc = drxj_dap_write_reg16(dev_addr, FEC_OC_COMM_MB__A, fec_oc_comm_mb, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3510) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3511) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3512) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3513) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3514) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3515) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3516) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3517) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3518) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3519) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3520) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3521) /*----------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3522) /* miscellaneous configurations - end                             */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3523) /*----------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3524) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3525) /*----------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3526) /* UIO Configuration Functions - begin                                        */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3527) /*----------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3528) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3529) * \fn int ctrl_set_uio_cfg()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3530) * \brief Configure modus oprandi UIO.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3531) * \param demod Pointer to demodulator instance.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3532) * \param uio_cfg Pointer to a configuration setting for a certain UIO.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3533) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3534) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3535) static int ctrl_set_uio_cfg(struct drx_demod_instance *demod, struct drxuio_cfg *uio_cfg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3536) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3537) 	struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3538) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3539) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3540) 	if ((uio_cfg == NULL) || (demod == NULL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3541) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3542) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3543) 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3544) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3545) 	/*  Write magic word to enable pdr reg write               */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3546) 	rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3547) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3548) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3549) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3550) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3551) 	switch (uio_cfg->uio) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3552)       /*====================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3553) 	case DRX_UIO1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3554) 		/* DRX_UIO1: SMA_TX UIO-1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3555) 		if (!ext_attr->has_smatx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3556) 			return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3557) 		switch (uio_cfg->mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3558) 		case DRX_UIO_MODE_FIRMWARE_SMA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3559) 		case DRX_UIO_MODE_FIRMWARE_SAW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3560) 		case DRX_UIO_MODE_READWRITE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3561) 			ext_attr->uio_sma_tx_mode = uio_cfg->mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3562) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3563) 		case DRX_UIO_MODE_DISABLE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3564) 			ext_attr->uio_sma_tx_mode = uio_cfg->mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3565) 			/* pad configuration register is set 0 - input mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3566) 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_CFG__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3567) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3568) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3569) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3570) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3571) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3572) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3573) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3574) 		}		/* switch ( uio_cfg->mode ) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3575) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3576)       /*====================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3577) 	case DRX_UIO2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3578) 		/* DRX_UIO2: SMA_RX UIO-2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3579) 		if (!ext_attr->has_smarx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3580) 			return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3581) 		switch (uio_cfg->mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3582) 		case DRX_UIO_MODE_FIRMWARE0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3583) 		case DRX_UIO_MODE_READWRITE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3584) 			ext_attr->uio_sma_rx_mode = uio_cfg->mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3585) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3586) 		case DRX_UIO_MODE_DISABLE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3587) 			ext_attr->uio_sma_rx_mode = uio_cfg->mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3588) 			/* pad configuration register is set 0 - input mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3589) 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_RX_CFG__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3590) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3591) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3592) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3593) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3594) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3595) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3596) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3597) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3598) 		}		/* switch ( uio_cfg->mode ) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3599) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3600)       /*====================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3601) 	case DRX_UIO3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3602) 		/* DRX_UIO3: GPIO UIO-3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3603) 		if (!ext_attr->has_gpio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3604) 			return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3605) 		switch (uio_cfg->mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3606) 		case DRX_UIO_MODE_FIRMWARE0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3607) 		case DRX_UIO_MODE_READWRITE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3608) 			ext_attr->uio_gpio_mode = uio_cfg->mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3609) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3610) 		case DRX_UIO_MODE_DISABLE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3611) 			ext_attr->uio_gpio_mode = uio_cfg->mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3612) 			/* pad configuration register is set 0 - input mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3613) 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_GPIO_CFG__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3614) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3615) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3616) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3617) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3618) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3619) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3620) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3621) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3622) 		}		/* switch ( uio_cfg->mode ) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3623) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3624)       /*====================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3625) 	case DRX_UIO4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3626) 		/* DRX_UIO4: IRQN UIO-4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3627) 		if (!ext_attr->has_irqn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3628) 			return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3629) 		switch (uio_cfg->mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3630) 		case DRX_UIO_MODE_READWRITE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3631) 			ext_attr->uio_irqn_mode = uio_cfg->mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3632) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3633) 		case DRX_UIO_MODE_DISABLE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3634) 			/* pad configuration register is set 0 - input mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3635) 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_IRQN_CFG__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3636) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3637) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3638) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3639) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3640) 			ext_attr->uio_irqn_mode = uio_cfg->mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3641) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3642) 		case DRX_UIO_MODE_FIRMWARE0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3643) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3644) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3645) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3646) 		}		/* switch ( uio_cfg->mode ) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3647) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3648)       /*====================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3649) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3650) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3651) 	}			/* switch ( uio_cfg->uio ) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3652) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3653) 	/*  Write magic word to disable pdr reg write               */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3654) 	rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3655) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3656) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3657) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3658) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3659) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3660) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3661) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3662) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3663) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3664) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3665) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3666) * \fn int ctrl_uio_write()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3667) * \brief Write to a UIO.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3668) * \param demod Pointer to demodulator instance.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3669) * \param uio_data Pointer to data container for a certain UIO.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3670) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3671) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3672) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3673) ctrl_uio_write(struct drx_demod_instance *demod, struct drxuio_data *uio_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3674) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3675) 	struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3676) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3677) 	u16 pin_cfg_value = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3678) 	u16 value = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3679) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3680) 	if ((uio_data == NULL) || (demod == NULL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3681) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3682) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3683) 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3684) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3685) 	/*  Write magic word to enable pdr reg write               */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3686) 	rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3687) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3688) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3689) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3690) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3691) 	switch (uio_data->uio) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3692)       /*====================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3693) 	case DRX_UIO1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3694) 		/* DRX_UIO1: SMA_TX UIO-1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3695) 		if (!ext_attr->has_smatx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3696) 			return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3697) 		if ((ext_attr->uio_sma_tx_mode != DRX_UIO_MODE_READWRITE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3698) 		    && (ext_attr->uio_sma_tx_mode != DRX_UIO_MODE_FIRMWARE_SAW)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3699) 			return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3700) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3701) 		pin_cfg_value = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3702) 		/* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3703) 		pin_cfg_value |= 0x0113;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3704) 		/* io_pad_cfg_mode output mode is drive always */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3705) 		/* io_pad_cfg_drive is set to power 2 (23 mA) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3706) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3707) 		/* write to io pad configuration register - output mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3708) 		rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_CFG__A, pin_cfg_value, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3709) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3710) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3711) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3712) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3713) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3714) 		/* use corresponding bit in io data output registar */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3715) 		rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, &value, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3716) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3717) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3718) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3719) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3720) 		if (!uio_data->value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3721) 			value &= 0x7FFF;	/* write zero to 15th bit - 1st UIO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3722) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3723) 			value |= 0x8000;	/* write one to 15th bit - 1st UIO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3724) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3725) 		/* write back to io data output register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3726) 		rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, value, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3727) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3728) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3729) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3730) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3731) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3732)    /*======================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3733) 	case DRX_UIO2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3734) 		/* DRX_UIO2: SMA_RX UIO-2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3735) 		if (!ext_attr->has_smarx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3736) 			return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3737) 		if (ext_attr->uio_sma_rx_mode != DRX_UIO_MODE_READWRITE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3738) 			return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3739) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3740) 		pin_cfg_value = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3741) 		/* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3742) 		pin_cfg_value |= 0x0113;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3743) 		/* io_pad_cfg_mode output mode is drive always */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3744) 		/* io_pad_cfg_drive is set to power 2 (23 mA) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3745) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3746) 		/* write to io pad configuration register - output mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3747) 		rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_RX_CFG__A, pin_cfg_value, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3748) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3749) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3750) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3751) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3752) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3753) 		/* use corresponding bit in io data output registar */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3754) 		rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, &value, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3755) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3756) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3757) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3758) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3759) 		if (!uio_data->value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3760) 			value &= 0xBFFF;	/* write zero to 14th bit - 2nd UIO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3761) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3762) 			value |= 0x4000;	/* write one to 14th bit - 2nd UIO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3763) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3764) 		/* write back to io data output register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3765) 		rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, value, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3766) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3767) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3768) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3769) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3770) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3771)    /*====================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3772) 	case DRX_UIO3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3773) 		/* DRX_UIO3: ASEL UIO-3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3774) 		if (!ext_attr->has_gpio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3775) 			return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3776) 		if (ext_attr->uio_gpio_mode != DRX_UIO_MODE_READWRITE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3777) 			return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3778) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3779) 		pin_cfg_value = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3780) 		/* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3781) 		pin_cfg_value |= 0x0113;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3782) 		/* io_pad_cfg_mode output mode is drive always */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3783) 		/* io_pad_cfg_drive is set to power 2 (23 mA) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3784) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3785) 		/* write to io pad configuration register - output mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3786) 		rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_GPIO_CFG__A, pin_cfg_value, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3787) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3788) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3789) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3790) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3791) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3792) 		/* use corresponding bit in io data output registar */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3793) 		rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_HI__A, &value, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3794) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3795) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3796) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3797) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3798) 		if (!uio_data->value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3799) 			value &= 0xFFFB;	/* write zero to 2nd bit - 3rd UIO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3800) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3801) 			value |= 0x0004;	/* write one to 2nd bit - 3rd UIO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3802) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3803) 		/* write back to io data output register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3804) 		rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_HI__A, value, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3805) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3806) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3807) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3808) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3809) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3810)    /*=====================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3811) 	case DRX_UIO4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3812) 		/* DRX_UIO4: IRQN UIO-4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3813) 		if (!ext_attr->has_irqn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3814) 			return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3815) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3816) 		if (ext_attr->uio_irqn_mode != DRX_UIO_MODE_READWRITE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3817) 			return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3818) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3819) 		pin_cfg_value = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3820) 		/* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3821) 		pin_cfg_value |= 0x0113;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3822) 		/* io_pad_cfg_mode output mode is drive always */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3823) 		/* io_pad_cfg_drive is set to power 2 (23 mA) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3824) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3825) 		/* write to io pad configuration register - output mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3826) 		rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_IRQN_CFG__A, pin_cfg_value, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3827) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3828) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3829) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3830) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3831) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3832) 		/* use corresponding bit in io data output registar */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3833) 		rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, &value, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3834) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3835) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3836) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3837) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3838) 		if (uio_data->value == false)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3839) 			value &= 0xEFFF;	/* write zero to 12th bit - 4th UIO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3840) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3841) 			value |= 0x1000;	/* write one to 12th bit - 4th UIO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3842) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3843) 		/* write back to io data output register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3844) 		rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, value, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3845) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3846) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3847) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3848) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3849) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3850)       /*=====================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3851) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3852) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3853) 	}			/* switch ( uio_data->uio ) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3854) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3855) 	/*  Write magic word to disable pdr reg write               */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3856) 	rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3857) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3858) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3859) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3860) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3861) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3862) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3863) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3864) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3865) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3866) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3867) /*---------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3868) /* UIO Configuration Functions - end                                         */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3869) /*---------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3870) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3871) /*----------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3872) /* I2C Bridge Functions - begin                                               */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3873) /*----------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3874) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3875) * \fn int ctrl_i2c_bridge()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3876) * \brief Open or close the I2C switch to tuner.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3877) * \param demod Pointer to demodulator instance.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3878) * \param bridge_closed Pointer to bool indication if bridge is closed not.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3879) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3880) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3881) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3882) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3883) ctrl_i2c_bridge(struct drx_demod_instance *demod, bool *bridge_closed)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3884) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3885) 	struct drxj_hi_cmd hi_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3886) 	u16 result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3887) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3888) 	/* check arguments */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3889) 	if (bridge_closed == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3890) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3891) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3892) 	hi_cmd.cmd = SIO_HI_RA_RAM_CMD_BRDCTRL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3893) 	hi_cmd.param1 = SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3894) 	if (*bridge_closed)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3895) 		hi_cmd.param2 = SIO_HI_RA_RAM_PAR_2_BRD_CFG_CLOSED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3896) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3897) 		hi_cmd.param2 = SIO_HI_RA_RAM_PAR_2_BRD_CFG_OPEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3898) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3899) 	return hi_command(demod->my_i2c_dev_addr, &hi_cmd, &result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3900) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3901) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3902) /*----------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3903) /* I2C Bridge Functions - end                                                 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3904) /*----------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3905) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3906) /*----------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3907) /* Smart antenna Functions - begin                                            */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3908) /*----------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3909) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3910) * \fn int smart_ant_init()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3911) * \brief Initialize Smart Antenna.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3912) * \param pointer to struct drx_demod_instance.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3913) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3914) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3915) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3916) static int smart_ant_init(struct drx_demod_instance *demod)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3917) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3918) 	struct drxj_data *ext_attr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3919) 	struct i2c_device_addr *dev_addr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3920) 	struct drxuio_cfg uio_cfg = { DRX_UIO1, DRX_UIO_MODE_FIRMWARE_SMA };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3921) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3922) 	u16 data = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3923) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3924) 	dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3925) 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3926) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3927) 	/*  Write magic word to enable pdr reg write               */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3928) 	rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3929) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3930) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3931) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3932) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3933) 	/* init smart antenna */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3934) 	rc = drxj_dap_read_reg16(dev_addr, SIO_SA_TX_COMMAND__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3935) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3936) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3937) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3938) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3939) 	if (ext_attr->smart_ant_inverted) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3940) 		rc = drxj_dap_write_reg16(dev_addr, SIO_SA_TX_COMMAND__A, (data | SIO_SA_TX_COMMAND_TX_INVERT__M) | SIO_SA_TX_COMMAND_TX_ENABLE__M, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3941) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3942) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3943) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3944) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3945) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3946) 		rc = drxj_dap_write_reg16(dev_addr, SIO_SA_TX_COMMAND__A, (data & (~SIO_SA_TX_COMMAND_TX_INVERT__M)) | SIO_SA_TX_COMMAND_TX_ENABLE__M, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3947) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3948) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3949) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3950) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3951) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3952) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3953) 	/* config SMA_TX pin to smart antenna mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3954) 	rc = ctrl_set_uio_cfg(demod, &uio_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3955) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3956) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3957) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3958) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3959) 	rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_CFG__A, 0x13, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3960) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3961) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3962) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3963) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3964) 	rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_GPIO_FNC__A, 0x03, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3965) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3966) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3967) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3968) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3969) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3970) 	/*  Write magic word to disable pdr reg write               */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3971) 	rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3972) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3973) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3974) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3975) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3976) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3977) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3978) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3979) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3980) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3981) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3982) static int scu_command(struct i2c_device_addr *dev_addr, struct drxjscu_cmd *cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3983) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3984) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3985) 	u16 cur_cmd = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3986) 	unsigned long timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3987) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3988) 	/* Check param */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3989) 	if (cmd == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3990) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3991) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3992) 	/* Wait until SCU command interface is ready to receive command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3993) 	rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_COMMAND__A, &cur_cmd, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3994) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3995) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3996) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3997) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3998) 	if (cur_cmd != DRX_SCU_READY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3999) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4000) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4001) 	switch (cmd->parameter_len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4002) 	case 5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4003) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_4__A, *(cmd->parameter + 4), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4004) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4005) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4006) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4007) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4008) 		fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4009) 	case 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4010) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_3__A, *(cmd->parameter + 3), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4011) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4012) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4013) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4014) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4015) 		fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4016) 	case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4017) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_2__A, *(cmd->parameter + 2), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4018) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4019) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4020) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4021) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4022) 		fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4023) 	case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4024) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_1__A, *(cmd->parameter + 1), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4025) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4026) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4027) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4028) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4029) 		fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4030) 	case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4031) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_0__A, *(cmd->parameter + 0), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4032) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4033) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4034) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4035) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4036) 		fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4037) 	case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4038) 		/* do nothing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4039) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4040) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4041) 		/* this number of parameters is not supported */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4042) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4043) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4044) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_COMMAND__A, cmd->command, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4045) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4046) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4047) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4048) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4049) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4050) 	/* Wait until SCU has processed command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4051) 	timeout = jiffies + msecs_to_jiffies(DRXJ_MAX_WAITTIME);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4052) 	while (time_is_after_jiffies(timeout)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4053) 		rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_COMMAND__A, &cur_cmd, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4054) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4055) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4056) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4057) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4058) 		if (cur_cmd == DRX_SCU_READY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4059) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4060) 		usleep_range(1000, 2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4061) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4062) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4063) 	if (cur_cmd != DRX_SCU_READY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4064) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4065) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4066) 	/* read results */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4067) 	if ((cmd->result_len > 0) && (cmd->result != NULL)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4068) 		s16 err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4069) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4070) 		switch (cmd->result_len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4071) 		case 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4072) 			rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_3__A, cmd->result + 3, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4073) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4074) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4075) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4076) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4077) 			fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4078) 		case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4079) 			rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_2__A, cmd->result + 2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4080) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4081) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4082) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4083) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4084) 			fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4085) 		case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4086) 			rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_1__A, cmd->result + 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4087) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4088) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4089) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4090) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4091) 			fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4092) 		case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4093) 			rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_0__A, cmd->result + 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4094) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4095) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4096) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4097) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4098) 			fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4099) 		case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4100) 			/* do nothing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4101) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4102) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4103) 			/* this number of parameters is not supported */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4104) 			return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4105) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4106) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4107) 		/* Check if an error was reported by SCU */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4108) 		err = cmd->result[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4109) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4110) 		/* check a few fixed error codes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4111) 		if ((err == (s16) SCU_RAM_PARAM_0_RESULT_UNKSTD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4112) 		    || (err == (s16) SCU_RAM_PARAM_0_RESULT_UNKCMD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4113) 		    || (err == (s16) SCU_RAM_PARAM_0_RESULT_INVPAR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4114) 		    || (err == (s16) SCU_RAM_PARAM_0_RESULT_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4115) 		    ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4116) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4117) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4118) 		/* here it is assumed that negative means error, and positive no error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4119) 		else if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4120) 			return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4121) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4122) 			return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4123) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4124) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4125) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4126) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4127) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4128) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4129) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4130) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4131) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4132) * \fn int DRXJ_DAP_SCUAtomicReadWriteBlock()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4133) * \brief Basic access routine for SCU atomic read or write access
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4134) * \param dev_addr  pointer to i2c dev address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4135) * \param addr     destination/source address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4136) * \param datasize size of data buffer in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4137) * \param data     pointer to data buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4138) * \return int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4139) * \retval 0 Success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4140) * \retval -EIO Timeout, I2C error, illegal bank
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4141) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4142) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4143) #define ADDR_AT_SCU_SPACE(x) ((x - 0x82E000) * 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4144) static
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4145) int drxj_dap_scu_atomic_read_write_block(struct i2c_device_addr *dev_addr, u32 addr, u16 datasize,	/* max 30 bytes because the limit of SCU parameter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4146) 					      u8 *data, bool read_flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4147) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4148) 	struct drxjscu_cmd scu_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4149) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4150) 	u16 set_param_parameters[18];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4151) 	u16 cmd_result[15];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4152) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4153) 	/* Parameter check */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4154) 	if (!data || !dev_addr || (datasize % 2) || ((datasize / 2) > 16))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4155) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4156) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4157) 	set_param_parameters[1] = (u16) ADDR_AT_SCU_SPACE(addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4158) 	if (read_flag) {		/* read */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4159) 		set_param_parameters[0] = ((~(0x0080)) & datasize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4160) 		scu_cmd.parameter_len = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4161) 		scu_cmd.result_len = datasize / 2 + 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4162) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4163) 		int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4164) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4165) 		set_param_parameters[0] = 0x0080 | datasize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4166) 		for (i = 0; i < (datasize / 2); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4167) 			set_param_parameters[i + 2] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4168) 			    (data[2 * i] | (data[(2 * i) + 1] << 8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4169) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4170) 		scu_cmd.parameter_len = datasize / 2 + 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4171) 		scu_cmd.result_len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4172) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4173) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4174) 	scu_cmd.command =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4175) 	    SCU_RAM_COMMAND_STANDARD_TOP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4176) 	    SCU_RAM_COMMAND_CMD_AUX_SCU_ATOMIC_ACCESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4177) 	scu_cmd.result = cmd_result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4178) 	scu_cmd.parameter = set_param_parameters;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4179) 	rc = scu_command(dev_addr, &scu_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4180) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4181) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4182) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4183) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4184) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4185) 	if (read_flag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4186) 		int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4187) 		/* read data from buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4188) 		for (i = 0; i < (datasize / 2); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4189) 			data[2 * i] = (u8) (scu_cmd.result[i + 2] & 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4190) 			data[(2 * i) + 1] = (u8) (scu_cmd.result[i + 2] >> 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4191) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4192) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4193) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4194) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4195) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4196) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4197) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4198) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4199) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4200) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4201) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4202) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4203) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4204) * \fn int DRXJ_DAP_AtomicReadReg16()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4205) * \brief Atomic read of 16 bits words
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4206) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4207) static
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4208) int drxj_dap_scu_atomic_read_reg16(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4209) 					 u32 addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4210) 					 u16 *data, u32 flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4211) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4212) 	u8 buf[2] = { 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4213) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4214) 	u16 word = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4215) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4216) 	if (!data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4217) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4218) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4219) 	rc = drxj_dap_scu_atomic_read_write_block(dev_addr, addr, 2, buf, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4220) 	if (rc < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4221) 		return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4222) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4223) 	word = (u16) (buf[0] + (buf[1] << 8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4224) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4225) 	*data = word;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4226) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4227) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4228) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4229) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4230) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4231) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4232) * \fn int drxj_dap_scu_atomic_write_reg16()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4233) * \brief Atomic read of 16 bits words
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4234) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4235) static
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4236) int drxj_dap_scu_atomic_write_reg16(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4237) 					  u32 addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4238) 					  u16 data, u32 flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4239) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4240) 	u8 buf[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4241) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4242) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4243) 	buf[0] = (u8) (data & 0xff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4244) 	buf[1] = (u8) ((data >> 8) & 0xff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4245) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4246) 	rc = drxj_dap_scu_atomic_read_write_block(dev_addr, addr, 2, buf, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4247) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4248) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4249) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4250) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4251) /* -------------------------------------------------------------------------- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4252) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4253) * \brief Measure result of ADC synchronisation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4254) * \param demod demod instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4255) * \param count (returned) count
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4256) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4257) * \retval 0    Success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4258) * \retval -EIO Failure: I2C error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4259) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4260) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4261) static int adc_sync_measurement(struct drx_demod_instance *demod, u16 *count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4262) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4263) 	struct i2c_device_addr *dev_addr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4264) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4265) 	u16 data = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4266) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4267) 	dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4268) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4269) 	/* Start measurement */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4270) 	rc = drxj_dap_write_reg16(dev_addr, IQM_AF_COMM_EXEC__A, IQM_AF_COMM_EXEC_ACTIVE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4271) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4272) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4273) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4274) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4275) 	rc = drxj_dap_write_reg16(dev_addr, IQM_AF_START_LOCK__A, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4276) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4277) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4278) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4279) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4280) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4281) 	/* Wait at least 3*128*(1/sysclk) <<< 1 millisec */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4282) 	msleep(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4283) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4284) 	*count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4285) 	rc = drxj_dap_read_reg16(dev_addr, IQM_AF_PHASE0__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4286) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4287) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4288) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4289) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4290) 	if (data == 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4291) 		*count = *count + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4292) 	rc = drxj_dap_read_reg16(dev_addr, IQM_AF_PHASE1__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4293) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4294) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4295) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4296) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4297) 	if (data == 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4298) 		*count = *count + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4299) 	rc = drxj_dap_read_reg16(dev_addr, IQM_AF_PHASE2__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4300) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4301) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4302) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4303) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4304) 	if (data == 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4305) 		*count = *count + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4306) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4307) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4308) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4309) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4310) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4311) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4312) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4313) * \brief Synchronize analog and digital clock domains
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4314) * \param demod demod instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4315) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4316) * \retval 0    Success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4317) * \retval -EIO Failure: I2C error or failure to synchronize
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4318) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4319) * An IQM reset will also reset the results of this synchronization.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4320) * After an IQM reset this routine needs to be called again.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4321) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4322) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4323) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4324) static int adc_synchronization(struct drx_demod_instance *demod)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4325) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4326) 	struct i2c_device_addr *dev_addr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4327) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4328) 	u16 count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4329) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4330) 	dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4331) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4332) 	rc = adc_sync_measurement(demod, &count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4333) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4334) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4335) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4336) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4337) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4338) 	if (count == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4339) 		/* Try sampling on a different edge */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4340) 		u16 clk_neg = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4341) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4342) 		rc = drxj_dap_read_reg16(dev_addr, IQM_AF_CLKNEG__A, &clk_neg, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4343) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4344) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4345) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4346) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4347) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4348) 		clk_neg ^= IQM_AF_CLKNEG_CLKNEGDATA__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4349) 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLKNEG__A, clk_neg, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4350) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4351) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4352) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4353) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4354) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4355) 		rc = adc_sync_measurement(demod, &count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4356) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4357) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4358) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4359) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4360) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4361) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4362) 	/* TODO: implement fallback scenarios */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4363) 	if (count < 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4364) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4365) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4366) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4367) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4368) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4369) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4370) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4371) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4372) /*==                      END AUXILIARY FUNCTIONS                           ==*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4373) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4374) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4375) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4376) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4377) /*==                8VSB & QAM COMMON DATAPATH FUNCTIONS                    ==*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4378) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4379) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4380) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4381) * \fn int init_agc ()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4382) * \brief Initialize AGC for all standards.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4383) * \param demod instance of demodulator.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4384) * \param channel pointer to channel data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4385) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4386) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4387) static int init_agc(struct drx_demod_instance *demod)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4388) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4389) 	struct i2c_device_addr *dev_addr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4390) 	struct drx_common_attr *common_attr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4391) 	struct drxj_data *ext_attr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4392) 	struct drxj_cfg_agc *p_agc_rf_settings = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4393) 	struct drxj_cfg_agc *p_agc_if_settings = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4394) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4395) 	u16 ingain_tgt_max = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4396) 	u16 clp_dir_to = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4397) 	u16 sns_sum_max = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4398) 	u16 clp_sum_max = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4399) 	u16 sns_dir_to = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4400) 	u16 ki_innergain_min = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4401) 	u16 agc_ki = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4402) 	u16 ki_max = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4403) 	u16 if_iaccu_hi_tgt_min = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4404) 	u16 data = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4405) 	u16 agc_ki_dgain = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4406) 	u16 ki_min = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4407) 	u16 clp_ctrl_mode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4408) 	u16 agc_rf = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4409) 	u16 agc_if = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4410) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4411) 	dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4412) 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4413) 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4414) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4415) 	switch (ext_attr->standard) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4416) 	case DRX_STANDARD_8VSB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4417) 		clp_sum_max = 1023;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4418) 		clp_dir_to = (u16) (-9);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4419) 		sns_sum_max = 1023;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4420) 		sns_dir_to = (u16) (-9);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4421) 		ki_innergain_min = (u16) (-32768);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4422) 		ki_max = 0x032C;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4423) 		agc_ki_dgain = 0xC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4424) 		if_iaccu_hi_tgt_min = 2047;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4425) 		ki_min = 0x0117;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4426) 		ingain_tgt_max = 16383;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4427) 		clp_ctrl_mode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4428) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MINGAIN__A, 0x7fff, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4429) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4430) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4431) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4432) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4433) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAXGAIN__A, 0x0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4434) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4435) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4436) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4437) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4438) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4439) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4440) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4441) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4442) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4443) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CYCCNT__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4444) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4445) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4446) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4447) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4448) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_WD__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4449) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4450) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4451) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4452) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4453) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_STP__A, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4454) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4455) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4456) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4457) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4458) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4459) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4460) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4461) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4462) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4463) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_CYCCNT__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4464) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4465) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4466) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4467) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4468) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_WD__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4469) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4470) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4471) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4472) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4473) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_STP__A, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4474) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4475) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4476) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4477) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4478) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN__A, 1024, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4479) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4480) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4481) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4482) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4483) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_VSB_AGC_POW_TGT__A, 22600, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4484) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4485) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4486) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4487) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4488) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT__A, 13200, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4489) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4490) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4491) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4492) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4493) 		p_agc_if_settings = &(ext_attr->vsb_if_agc_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4494) 		p_agc_rf_settings = &(ext_attr->vsb_rf_agc_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4495) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4496) #ifndef DRXJ_VSB_ONLY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4497) 	case DRX_STANDARD_ITU_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4498) 	case DRX_STANDARD_ITU_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4499) 	case DRX_STANDARD_ITU_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4500) 		ingain_tgt_max = 5119;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4501) 		clp_sum_max = 1023;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4502) 		clp_dir_to = (u16) (-5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4503) 		sns_sum_max = 127;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4504) 		sns_dir_to = (u16) (-3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4505) 		ki_innergain_min = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4506) 		ki_max = 0x0657;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4507) 		if_iaccu_hi_tgt_min = 2047;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4508) 		agc_ki_dgain = 0x7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4509) 		ki_min = 0x0117;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4510) 		clp_ctrl_mode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4511) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MINGAIN__A, 0x7fff, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4512) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4513) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4514) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4515) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4516) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAXGAIN__A, 0x0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4517) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4518) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4519) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4520) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4521) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4522) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4523) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4524) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4525) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4526) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CYCCNT__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4527) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4528) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4529) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4530) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4531) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_WD__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4532) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4533) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4534) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4535) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4536) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_STP__A, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4537) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4538) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4539) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4540) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4541) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4542) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4543) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4544) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4545) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4546) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_CYCCNT__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4547) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4548) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4549) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4550) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4551) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_WD__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4552) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4553) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4554) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4555) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4556) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_STP__A, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4557) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4558) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4559) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4560) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4561) 		p_agc_if_settings = &(ext_attr->qam_if_agc_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4562) 		p_agc_rf_settings = &(ext_attr->qam_rf_agc_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4563) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT__A, p_agc_if_settings->top, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4564) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4565) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4566) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4567) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4568) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4569) 		rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_AGC_KI__A, &agc_ki, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4570) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4571) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4572) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4573) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4574) 		agc_ki &= 0xf000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4575) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI__A, agc_ki, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4576) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4577) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4578) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4579) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4580) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4581) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4582) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4583) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4584) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4585) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4586) 	/* for new AGC interface */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4587) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT_MIN__A, p_agc_if_settings->top, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4588) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4589) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4590) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4591) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4592) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN__A, p_agc_if_settings->top, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4593) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4594) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4595) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4596) 	}	/* Gain fed from inner to outer AGC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4597) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT_MAX__A, ingain_tgt_max, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4598) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4599) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4600) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4601) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4602) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MIN__A, if_iaccu_hi_tgt_min, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4603) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4604) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4605) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4606) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4607) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_IF_IACCU_HI__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4608) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4609) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4610) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4611) 	}	/* set to p_agc_settings->top before */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4612) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_IF_IACCU_LO__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4613) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4614) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4615) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4616) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4617) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_RF_IACCU_HI__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4618) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4619) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4620) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4621) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4622) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_RF_IACCU_LO__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4623) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4624) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4625) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4626) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4627) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_RF_MAX__A, 32767, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4628) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4629) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4630) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4631) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4632) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM_MAX__A, clp_sum_max, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4633) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4634) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4635) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4636) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4637) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM_MAX__A, sns_sum_max, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4638) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4639) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4640) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4641) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4642) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_INNERGAIN_MIN__A, ki_innergain_min, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4643) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4644) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4645) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4646) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4647) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_FAST_SNS_CTRL_DELAY__A, 50, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4648) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4649) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4650) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4651) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4652) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_CYCLEN__A, 500, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4653) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4654) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4655) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4656) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4657) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_CYCLEN__A, 500, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4658) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4659) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4660) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4661) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4662) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAXMINGAIN_TH__A, 20, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4663) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4664) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4665) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4666) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4667) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MIN__A, ki_min, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4668) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4669) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4670) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4671) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4672) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAX__A, ki_max, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4673) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4674) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4675) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4676) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4677) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_RED__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4678) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4679) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4680) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4681) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4682) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM_MIN__A, 8, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4683) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4684) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4685) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4686) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4687) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CYCLEN__A, 500, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4688) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4689) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4690) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4691) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4692) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_TO__A, clp_dir_to, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4693) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4694) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4695) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4696) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4697) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM_MIN__A, 8, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4698) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4699) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4700) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4701) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4702) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_TO__A, sns_dir_to, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4703) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4704) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4705) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4706) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4707) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A, 50, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4708) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4709) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4710) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4711) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4712) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CTRL_MODE__A, clp_ctrl_mode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4713) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4714) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4715) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4716) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4717) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4718) 	agc_rf = 0x800 + p_agc_rf_settings->cut_off_current;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4719) 	if (common_attr->tuner_rf_agc_pol == true)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4720) 		agc_rf = 0x87ff - agc_rf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4721) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4722) 	agc_if = 0x800;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4723) 	if (common_attr->tuner_if_agc_pol == true)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4724) 		agc_rf = 0x87ff - agc_rf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4725) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4726) 	rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AGC_RF__A, agc_rf, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4727) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4728) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4729) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4730) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4731) 	rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AGC_IF__A, agc_if, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4732) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4733) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4734) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4735) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4736) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4737) 	/* Set/restore Ki DGAIN factor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4738) 	rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4739) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4740) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4741) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4742) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4743) 	data &= ~SCU_RAM_AGC_KI_DGAIN__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4744) 	data |= (agc_ki_dgain << SCU_RAM_AGC_KI_DGAIN__B);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4745) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4746) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4747) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4748) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4749) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4750) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4751) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4752) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4753) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4754) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4755) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4756) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4757) * \fn int set_frequency ()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4758) * \brief Set frequency shift.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4759) * \param demod instance of demodulator.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4760) * \param channel pointer to channel data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4761) * \param tuner_freq_offset residual frequency from tuner.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4762) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4763) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4764) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4765) set_frequency(struct drx_demod_instance *demod,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4766) 	      struct drx_channel *channel, s32 tuner_freq_offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4767) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4768) 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4769) 	struct drxj_data *ext_attr = demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4770) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4771) 	s32 sampling_frequency = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4772) 	s32 frequency_shift = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4773) 	s32 if_freq_actual = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4774) 	s32 rf_freq_residual = -1 * tuner_freq_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4775) 	s32 adc_freq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4776) 	s32 intermediate_freq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4777) 	u32 iqm_fs_rate_ofs = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4778) 	bool adc_flip = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4779) 	bool select_pos_image = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4780) 	bool rf_mirror;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4781) 	bool tuner_mirror;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4782) 	bool image_to_select = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4783) 	s32 fm_frequency_shift = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4784) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4785) 	rf_mirror = (ext_attr->mirror == DRX_MIRROR_YES) ? true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4786) 	tuner_mirror = demod->my_common_attr->mirror_freq_spect ? false : true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4787) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4788) 	   Program frequency shifter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4789) 	   No need to account for mirroring on RF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4790) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4791) 	switch (ext_attr->standard) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4792) 	case DRX_STANDARD_ITU_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4793) 	case DRX_STANDARD_ITU_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4794) 	case DRX_STANDARD_PAL_SECAM_LP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4795) 	case DRX_STANDARD_8VSB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4796) 		select_pos_image = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4797) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4798) 	case DRX_STANDARD_FM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4799) 		/* After IQM FS sound carrier must appear at 4 Mhz in spect.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4800) 		   Sound carrier is already 3Mhz above centre frequency due
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4801) 		   to tuner setting so now add an extra shift of 1MHz... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4802) 		fm_frequency_shift = 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4803) 		fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4804) 	case DRX_STANDARD_ITU_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4805) 	case DRX_STANDARD_NTSC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4806) 	case DRX_STANDARD_PAL_SECAM_BG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4807) 	case DRX_STANDARD_PAL_SECAM_DK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4808) 	case DRX_STANDARD_PAL_SECAM_I:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4809) 	case DRX_STANDARD_PAL_SECAM_L:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4810) 		select_pos_image = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4811) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4812) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4813) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4814) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4815) 	intermediate_freq = demod->my_common_attr->intermediate_freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4816) 	sampling_frequency = demod->my_common_attr->sys_clock_freq / 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4817) 	if (tuner_mirror)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4818) 		if_freq_actual = intermediate_freq + rf_freq_residual + fm_frequency_shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4819) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4820) 		if_freq_actual = intermediate_freq - rf_freq_residual - fm_frequency_shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4821) 	if (if_freq_actual > sampling_frequency / 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4822) 		/* adc mirrors */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4823) 		adc_freq = sampling_frequency - if_freq_actual;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4824) 		adc_flip = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4825) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4826) 		/* adc doesn't mirror */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4827) 		adc_freq = if_freq_actual;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4828) 		adc_flip = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4829) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4830) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4831) 	frequency_shift = adc_freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4832) 	image_to_select =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4833) 	    (bool) (rf_mirror ^ tuner_mirror ^ adc_flip ^ select_pos_image);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4834) 	iqm_fs_rate_ofs = frac28(frequency_shift, sampling_frequency);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4835) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4836) 	if (image_to_select)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4837) 		iqm_fs_rate_ofs = ~iqm_fs_rate_ofs + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4838) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4839) 	/* Program frequency shifter with tuner offset compensation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4840) 	/* frequency_shift += tuner_freq_offset; TODO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4841) 	rc = drxdap_fasi_write_reg32(dev_addr, IQM_FS_RATE_OFS_LO__A, iqm_fs_rate_ofs, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4842) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4843) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4844) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4845) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4846) 	ext_attr->iqm_fs_rate_ofs = iqm_fs_rate_ofs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4847) 	ext_attr->pos_image = (bool) (rf_mirror ^ tuner_mirror ^ select_pos_image);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4848) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4849) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4850) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4851) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4852) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4853) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4854) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4855) * \fn int get_acc_pkt_err()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4856) * \brief Retrieve signal strength for VSB and QAM.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4857) * \param demod Pointer to demod instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4858) * \param packet_err Pointer to packet error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4859) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4860) * \retval 0 sig_strength contains valid data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4861) * \retval -EINVAL sig_strength is NULL.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4862) * \retval -EIO Erroneous data, sig_strength contains invalid data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4863) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4864) #ifdef DRXJ_SIGNAL_ACCUM_ERR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4865) static int get_acc_pkt_err(struct drx_demod_instance *demod, u16 *packet_err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4866) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4867) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4868) 	static u16 pkt_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4869) 	static u16 last_pkt_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4870) 	u16 data = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4871) 	struct drxj_data *ext_attr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4872) 	struct i2c_device_addr *dev_addr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4873) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4874) 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4875) 	dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4876) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4877) 	rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4878) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4879) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4880) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4881) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4882) 	if (ext_attr->reset_pkt_err_acc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4883) 		last_pkt_err = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4884) 		pkt_err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4885) 		ext_attr->reset_pkt_err_acc = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4886) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4887) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4888) 	if (data < last_pkt_err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4889) 		pkt_err += 0xffff - last_pkt_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4890) 		pkt_err += data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4891) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4892) 		pkt_err += (data - last_pkt_err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4893) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4894) 	*packet_err = pkt_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4895) 	last_pkt_err = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4896) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4897) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4898) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4899) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4900) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4901) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4902) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4903) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4904) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4905) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4906) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4907) * \fn int set_agc_rf ()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4908) * \brief Configure RF AGC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4909) * \param demod instance of demodulator.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4910) * \param agc_settings AGC configuration structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4911) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4912) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4913) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4914) set_agc_rf(struct drx_demod_instance *demod, struct drxj_cfg_agc *agc_settings, bool atomic)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4915) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4916) 	struct i2c_device_addr *dev_addr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4917) 	struct drxj_data *ext_attr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4918) 	struct drxj_cfg_agc *p_agc_settings = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4919) 	struct drx_common_attr *common_attr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4920) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4921) 	drx_write_reg16func_t scu_wr16 = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4922) 	drx_read_reg16func_t scu_rr16 = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4923) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4924) 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4925) 	dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4926) 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4927) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4928) 	if (atomic) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4929) 		scu_rr16 = drxj_dap_scu_atomic_read_reg16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4930) 		scu_wr16 = drxj_dap_scu_atomic_write_reg16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4931) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4932) 		scu_rr16 = drxj_dap_read_reg16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4933) 		scu_wr16 = drxj_dap_write_reg16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4934) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4935) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4936) 	/* Configure AGC only if standard is currently active */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4937) 	if ((ext_attr->standard == agc_settings->standard) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4938) 	    (DRXJ_ISQAMSTD(ext_attr->standard) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4939) 	     DRXJ_ISQAMSTD(agc_settings->standard)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4940) 	    (DRXJ_ISATVSTD(ext_attr->standard) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4941) 	     DRXJ_ISATVSTD(agc_settings->standard))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4942) 		u16 data = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4943) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4944) 		switch (agc_settings->ctrl_mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4945) 		case DRX_AGC_CTRL_AUTO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4946) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4947) 			/* Enable RF AGC DAC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4948) 			rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4949) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4950) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4951) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4952) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4953) 			data |= IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4954) 			rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4955) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4956) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4957) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4958) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4959) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4960) 			/* Enable SCU RF AGC loop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4961) 			rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4962) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4963) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4964) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4965) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4966) 			data &= ~SCU_RAM_AGC_KI_RF__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4967) 			if (ext_attr->standard == DRX_STANDARD_8VSB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4968) 				data |= (2 << SCU_RAM_AGC_KI_RF__B);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4969) 			else if (DRXJ_ISQAMSTD(ext_attr->standard))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4970) 				data |= (5 << SCU_RAM_AGC_KI_RF__B);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4971) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4972) 				data |= (4 << SCU_RAM_AGC_KI_RF__B);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4973) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4974) 			if (common_attr->tuner_rf_agc_pol)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4975) 				data |= SCU_RAM_AGC_KI_INV_RF_POL__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4976) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4977) 				data &= ~SCU_RAM_AGC_KI_INV_RF_POL__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4978) 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4979) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4980) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4981) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4982) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4983) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4984) 			/* Set speed ( using complementary reduction value ) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4985) 			rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI_RED__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4986) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4987) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4988) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4989) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4990) 			data &= ~SCU_RAM_AGC_KI_RED_RAGC_RED__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4991) 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI_RED__A, (~(agc_settings->speed << SCU_RAM_AGC_KI_RED_RAGC_RED__B) & SCU_RAM_AGC_KI_RED_RAGC_RED__M) | data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4992) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4993) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4994) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4995) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4996) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4997) 			if (agc_settings->standard == DRX_STANDARD_8VSB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4998) 				p_agc_settings = &(ext_attr->vsb_if_agc_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4999) 			else if (DRXJ_ISQAMSTD(agc_settings->standard))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5000) 				p_agc_settings = &(ext_attr->qam_if_agc_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5001) 			else if (DRXJ_ISATVSTD(agc_settings->standard))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5002) 				p_agc_settings = &(ext_attr->atv_if_agc_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5003) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5004) 				return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5005) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5006) 			/* Set TOP, only if IF-AGC is in AUTO mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5007) 			if (p_agc_settings->ctrl_mode == DRX_AGC_CTRL_AUTO) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5008) 				rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, agc_settings->top, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5009) 				if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5010) 					pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5011) 					goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5012) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5013) 				rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, agc_settings->top, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5014) 				if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5015) 					pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5016) 					goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5017) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5018) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5019) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5020) 			/* Cut-Off current */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5021) 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_RF_IACCU_HI_CO__A, agc_settings->cut_off_current, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5022) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5023) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5024) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5025) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5026) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5027) 		case DRX_AGC_CTRL_USER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5028) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5029) 			/* Enable RF AGC DAC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5030) 			rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5031) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5032) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5033) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5034) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5035) 			data |= IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5036) 			rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5037) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5038) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5039) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5040) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5041) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5042) 			/* Disable SCU RF AGC loop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5043) 			rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5044) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5045) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5046) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5047) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5048) 			data &= ~SCU_RAM_AGC_KI_RF__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5049) 			if (common_attr->tuner_rf_agc_pol)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5050) 				data |= SCU_RAM_AGC_KI_INV_RF_POL__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5051) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5052) 				data &= ~SCU_RAM_AGC_KI_INV_RF_POL__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5053) 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5054) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5055) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5056) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5057) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5058) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5059) 			/* Write value to output pin */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5060) 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_RF_IACCU_HI__A, agc_settings->output_level, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5061) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5062) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5063) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5064) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5065) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5066) 		case DRX_AGC_CTRL_OFF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5067) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5068) 			/* Disable RF AGC DAC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5069) 			rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5070) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5071) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5072) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5073) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5074) 			data &= (~IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5075) 			rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5076) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5077) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5078) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5079) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5080) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5081) 			/* Disable SCU RF AGC loop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5082) 			rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5083) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5084) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5085) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5086) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5087) 			data &= ~SCU_RAM_AGC_KI_RF__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5088) 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5089) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5090) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5091) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5092) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5093) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5094) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5095) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5096) 		}		/* switch ( agcsettings->ctrl_mode ) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5097) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5098) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5099) 	/* Store rf agc settings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5100) 	switch (agc_settings->standard) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5101) 	case DRX_STANDARD_8VSB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5102) 		ext_attr->vsb_rf_agc_cfg = *agc_settings;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5103) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5104) #ifndef DRXJ_VSB_ONLY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5105) 	case DRX_STANDARD_ITU_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5106) 	case DRX_STANDARD_ITU_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5107) 	case DRX_STANDARD_ITU_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5108) 		ext_attr->qam_rf_agc_cfg = *agc_settings;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5109) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5110) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5111) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5112) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5113) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5114) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5115) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5116) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5117) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5118) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5119) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5120) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5121) * \fn int set_agc_if ()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5122) * \brief Configure If AGC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5123) * \param demod instance of demodulator.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5124) * \param agc_settings AGC configuration structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5125) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5126) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5127) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5128) set_agc_if(struct drx_demod_instance *demod, struct drxj_cfg_agc *agc_settings, bool atomic)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5129) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5130) 	struct i2c_device_addr *dev_addr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5131) 	struct drxj_data *ext_attr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5132) 	struct drxj_cfg_agc *p_agc_settings = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5133) 	struct drx_common_attr *common_attr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5134) 	drx_write_reg16func_t scu_wr16 = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5135) 	drx_read_reg16func_t scu_rr16 = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5136) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5137) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5138) 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5139) 	dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5140) 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5141) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5142) 	if (atomic) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5143) 		scu_rr16 = drxj_dap_scu_atomic_read_reg16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5144) 		scu_wr16 = drxj_dap_scu_atomic_write_reg16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5145) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5146) 		scu_rr16 = drxj_dap_read_reg16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5147) 		scu_wr16 = drxj_dap_write_reg16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5148) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5149) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5150) 	/* Configure AGC only if standard is currently active */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5151) 	if ((ext_attr->standard == agc_settings->standard) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5152) 	    (DRXJ_ISQAMSTD(ext_attr->standard) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5153) 	     DRXJ_ISQAMSTD(agc_settings->standard)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5154) 	    (DRXJ_ISATVSTD(ext_attr->standard) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5155) 	     DRXJ_ISATVSTD(agc_settings->standard))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5156) 		u16 data = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5157) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5158) 		switch (agc_settings->ctrl_mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5159) 		case DRX_AGC_CTRL_AUTO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5160) 			/* Enable IF AGC DAC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5161) 			rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5162) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5163) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5164) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5165) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5166) 			data |= IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5167) 			rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5168) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5169) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5170) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5171) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5172) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5173) 			/* Enable SCU IF AGC loop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5174) 			rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5175) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5176) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5177) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5178) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5179) 			data &= ~SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5180) 			data &= ~SCU_RAM_AGC_KI_IF__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5181) 			if (ext_attr->standard == DRX_STANDARD_8VSB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5182) 				data |= (3 << SCU_RAM_AGC_KI_IF__B);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5183) 			else if (DRXJ_ISQAMSTD(ext_attr->standard))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5184) 				data |= (6 << SCU_RAM_AGC_KI_IF__B);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5185) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5186) 				data |= (5 << SCU_RAM_AGC_KI_IF__B);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5187) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5188) 			if (common_attr->tuner_if_agc_pol)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5189) 				data |= SCU_RAM_AGC_KI_INV_IF_POL__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5190) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5191) 				data &= ~SCU_RAM_AGC_KI_INV_IF_POL__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5192) 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5193) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5194) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5195) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5196) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5197) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5198) 			/* Set speed (using complementary reduction value) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5199) 			rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI_RED__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5200) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5201) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5202) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5203) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5204) 			data &= ~SCU_RAM_AGC_KI_RED_IAGC_RED__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5205) 			rc = (*scu_wr16) (dev_addr, SCU_RAM_AGC_KI_RED__A, (~(agc_settings->speed << SCU_RAM_AGC_KI_RED_IAGC_RED__B) & SCU_RAM_AGC_KI_RED_IAGC_RED__M) | data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5206) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5207) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5208) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5209) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5210) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5211) 			if (agc_settings->standard == DRX_STANDARD_8VSB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5212) 				p_agc_settings = &(ext_attr->vsb_rf_agc_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5213) 			else if (DRXJ_ISQAMSTD(agc_settings->standard))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5214) 				p_agc_settings = &(ext_attr->qam_rf_agc_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5215) 			else if (DRXJ_ISATVSTD(agc_settings->standard))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5216) 				p_agc_settings = &(ext_attr->atv_rf_agc_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5217) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5218) 				return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5219) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5220) 			/* Restore TOP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5221) 			if (p_agc_settings->ctrl_mode == DRX_AGC_CTRL_AUTO) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5222) 				rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, p_agc_settings->top, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5223) 				if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5224) 					pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5225) 					goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5226) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5227) 				rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, p_agc_settings->top, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5228) 				if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5229) 					pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5230) 					goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5231) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5232) 			} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5233) 				rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5234) 				if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5235) 					pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5236) 					goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5237) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5238) 				rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5239) 				if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5240) 					pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5241) 					goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5242) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5243) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5244) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5245) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5246) 		case DRX_AGC_CTRL_USER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5247) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5248) 			/* Enable IF AGC DAC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5249) 			rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5250) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5251) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5252) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5253) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5254) 			data |= IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5255) 			rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5256) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5257) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5258) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5259) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5260) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5261) 			/* Disable SCU IF AGC loop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5262) 			rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5263) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5264) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5265) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5266) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5267) 			data &= ~SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5268) 			data |= SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5269) 			if (common_attr->tuner_if_agc_pol)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5270) 				data |= SCU_RAM_AGC_KI_INV_IF_POL__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5271) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5272) 				data &= ~SCU_RAM_AGC_KI_INV_IF_POL__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5273) 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5274) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5275) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5276) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5277) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5278) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5279) 			/* Write value to output pin */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5280) 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, agc_settings->output_level, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5281) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5282) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5283) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5284) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5285) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5286) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5287) 		case DRX_AGC_CTRL_OFF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5288) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5289) 			/* Disable If AGC DAC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5290) 			rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5291) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5292) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5293) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5294) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5295) 			data &= (~IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5296) 			rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5297) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5298) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5299) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5300) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5301) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5302) 			/* Disable SCU IF AGC loop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5303) 			rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5304) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5305) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5306) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5307) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5308) 			data &= ~SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5309) 			data |= SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5310) 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5311) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5312) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5313) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5314) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5315) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5316) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5317) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5318) 		}		/* switch ( agcsettings->ctrl_mode ) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5319) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5320) 		/* always set the top to support configurations without if-loop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5321) 		rc = (*scu_wr16) (dev_addr, SCU_RAM_AGC_INGAIN_TGT_MIN__A, agc_settings->top, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5322) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5323) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5324) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5325) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5326) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5327) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5328) 	/* Store if agc settings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5329) 	switch (agc_settings->standard) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5330) 	case DRX_STANDARD_8VSB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5331) 		ext_attr->vsb_if_agc_cfg = *agc_settings;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5332) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5333) #ifndef DRXJ_VSB_ONLY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5334) 	case DRX_STANDARD_ITU_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5335) 	case DRX_STANDARD_ITU_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5336) 	case DRX_STANDARD_ITU_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5337) 		ext_attr->qam_if_agc_cfg = *agc_settings;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5338) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5339) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5340) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5341) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5342) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5343) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5344) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5345) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5346) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5347) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5348) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5349) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5350) * \fn int set_iqm_af ()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5351) * \brief Configure IQM AF registers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5352) * \param demod instance of demodulator.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5353) * \param active
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5354) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5355) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5356) static int set_iqm_af(struct drx_demod_instance *demod, bool active)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5357) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5358) 	u16 data = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5359) 	struct i2c_device_addr *dev_addr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5360) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5361) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5362) 	dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5363) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5364) 	/* Configure IQM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5365) 	rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5366) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5367) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5368) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5369) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5370) 	if (!active)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5371) 		data &= ((~IQM_AF_STDBY_STDBY_ADC_A2_ACTIVE) & (~IQM_AF_STDBY_STDBY_AMP_A2_ACTIVE) & (~IQM_AF_STDBY_STDBY_PD_A2_ACTIVE) & (~IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE) & (~IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5372) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5373) 		data |= (IQM_AF_STDBY_STDBY_ADC_A2_ACTIVE | IQM_AF_STDBY_STDBY_AMP_A2_ACTIVE | IQM_AF_STDBY_STDBY_PD_A2_ACTIVE | IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE | IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5374) 	rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5375) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5376) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5377) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5378) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5379) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5380) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5381) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5382) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5383) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5384) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5385) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5386) /*==              END 8VSB & QAM COMMON DATAPATH FUNCTIONS                  ==*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5387) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5388) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5389) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5390) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5391) /*==                       8VSB DATAPATH FUNCTIONS                          ==*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5392) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5393) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5394) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5395) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5396) * \fn int power_down_vsb ()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5397) * \brief Powr down QAM related blocks.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5398) * \param demod instance of demodulator.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5399) * \param channel pointer to channel data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5400) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5401) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5402) static int power_down_vsb(struct drx_demod_instance *demod, bool primary)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5403) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5404) 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5405) 	struct drxjscu_cmd cmd_scu = { /* command     */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5406) 		/* parameter_len */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5407) 		/* result_len    */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5408) 		/* *parameter   */ NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5409) 		/* *result      */ NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5410) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5411) 	struct drx_cfg_mpeg_output cfg_mpeg_output;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5412) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5413) 	u16 cmd_result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5414) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5415) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5416) 	   STOP demodulator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5417) 	   reset of FEC and VSB HW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5418) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5419) 	cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5420) 	    SCU_RAM_COMMAND_CMD_DEMOD_STOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5421) 	cmd_scu.parameter_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5422) 	cmd_scu.result_len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5423) 	cmd_scu.parameter = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5424) 	cmd_scu.result = &cmd_result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5425) 	rc = scu_command(dev_addr, &cmd_scu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5426) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5427) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5428) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5429) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5430) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5431) 	/* stop all comm_exec */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5432) 	rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5433) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5434) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5435) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5436) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5437) 	rc = drxj_dap_write_reg16(dev_addr, VSB_COMM_EXEC__A, VSB_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5438) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5439) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5440) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5441) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5442) 	if (primary) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5443) 		rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5444) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5445) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5446) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5447) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5448) 		rc = set_iqm_af(demod, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5449) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5450) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5451) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5452) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5453) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5454) 		rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5455) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5456) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5457) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5458) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5459) 		rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5460) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5461) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5462) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5463) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5464) 		rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5465) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5466) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5467) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5468) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5469) 		rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5470) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5471) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5472) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5473) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5474) 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5475) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5476) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5477) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5478) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5479) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5480) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5481) 	cfg_mpeg_output.enable_mpeg_output = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5482) 	rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5483) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5484) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5485) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5486) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5487) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5488) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5489) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5490) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5491) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5492) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5493) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5494) * \fn int set_vsb_leak_n_gain ()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5495) * \brief Set ATSC demod.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5496) * \param demod instance of demodulator.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5497) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5498) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5499) static int set_vsb_leak_n_gain(struct drx_demod_instance *demod)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5500) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5501) 	struct i2c_device_addr *dev_addr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5502) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5503) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5504) 	static const u8 vsb_ffe_leak_gain_ram0[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5505) 		DRXJ_16TO8(0x8),	/* FFETRAINLKRATIO1  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5506) 		DRXJ_16TO8(0x8),	/* FFETRAINLKRATIO2  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5507) 		DRXJ_16TO8(0x8),	/* FFETRAINLKRATIO3  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5508) 		DRXJ_16TO8(0xf),	/* FFETRAINLKRATIO4  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5509) 		DRXJ_16TO8(0xf),	/* FFETRAINLKRATIO5  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5510) 		DRXJ_16TO8(0xf),	/* FFETRAINLKRATIO6  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5511) 		DRXJ_16TO8(0xf),	/* FFETRAINLKRATIO7  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5512) 		DRXJ_16TO8(0xf),	/* FFETRAINLKRATIO8  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5513) 		DRXJ_16TO8(0xf),	/* FFETRAINLKRATIO9  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5514) 		DRXJ_16TO8(0x8),	/* FFETRAINLKRATIO10  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5515) 		DRXJ_16TO8(0x8),	/* FFETRAINLKRATIO11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5516) 		DRXJ_16TO8(0x8),	/* FFETRAINLKRATIO12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5517) 		DRXJ_16TO8(0x10),	/* FFERCA1TRAINLKRATIO1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5518) 		DRXJ_16TO8(0x10),	/* FFERCA1TRAINLKRATIO2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5519) 		DRXJ_16TO8(0x10),	/* FFERCA1TRAINLKRATIO3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5520) 		DRXJ_16TO8(0x20),	/* FFERCA1TRAINLKRATIO4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5521) 		DRXJ_16TO8(0x20),	/* FFERCA1TRAINLKRATIO5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5522) 		DRXJ_16TO8(0x20),	/* FFERCA1TRAINLKRATIO6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5523) 		DRXJ_16TO8(0x20),	/* FFERCA1TRAINLKRATIO7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5524) 		DRXJ_16TO8(0x20),	/* FFERCA1TRAINLKRATIO8 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5525) 		DRXJ_16TO8(0x20),	/* FFERCA1TRAINLKRATIO9 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5526) 		DRXJ_16TO8(0x10),	/* FFERCA1TRAINLKRATIO10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5527) 		DRXJ_16TO8(0x10),	/* FFERCA1TRAINLKRATIO11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5528) 		DRXJ_16TO8(0x10),	/* FFERCA1TRAINLKRATIO12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5529) 		DRXJ_16TO8(0x10),	/* FFERCA1DATALKRATIO1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5530) 		DRXJ_16TO8(0x10),	/* FFERCA1DATALKRATIO2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5531) 		DRXJ_16TO8(0x10),	/* FFERCA1DATALKRATIO3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5532) 		DRXJ_16TO8(0x20),	/* FFERCA1DATALKRATIO4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5533) 		DRXJ_16TO8(0x20),	/* FFERCA1DATALKRATIO5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5534) 		DRXJ_16TO8(0x20),	/* FFERCA1DATALKRATIO6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5535) 		DRXJ_16TO8(0x20),	/* FFERCA1DATALKRATIO7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5536) 		DRXJ_16TO8(0x20),	/* FFERCA1DATALKRATIO8 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5537) 		DRXJ_16TO8(0x20),	/* FFERCA1DATALKRATIO9 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5538) 		DRXJ_16TO8(0x10),	/* FFERCA1DATALKRATIO10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5539) 		DRXJ_16TO8(0x10),	/* FFERCA1DATALKRATIO11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5540) 		DRXJ_16TO8(0x10),	/* FFERCA1DATALKRATIO12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5541) 		DRXJ_16TO8(0x10),	/* FFERCA2TRAINLKRATIO1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5542) 		DRXJ_16TO8(0x10),	/* FFERCA2TRAINLKRATIO2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5543) 		DRXJ_16TO8(0x10),	/* FFERCA2TRAINLKRATIO3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5544) 		DRXJ_16TO8(0x20),	/* FFERCA2TRAINLKRATIO4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5545) 		DRXJ_16TO8(0x20),	/* FFERCA2TRAINLKRATIO5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5546) 		DRXJ_16TO8(0x20),	/* FFERCA2TRAINLKRATIO6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5547) 		DRXJ_16TO8(0x20),	/* FFERCA2TRAINLKRATIO7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5548) 		DRXJ_16TO8(0x20),	/* FFERCA2TRAINLKRATIO8 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5549) 		DRXJ_16TO8(0x20),	/* FFERCA2TRAINLKRATIO9 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5550) 		DRXJ_16TO8(0x10),	/* FFERCA2TRAINLKRATIO10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5551) 		DRXJ_16TO8(0x10),	/* FFERCA2TRAINLKRATIO11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5552) 		DRXJ_16TO8(0x10),	/* FFERCA2TRAINLKRATIO12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5553) 		DRXJ_16TO8(0x10),	/* FFERCA2DATALKRATIO1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5554) 		DRXJ_16TO8(0x10),	/* FFERCA2DATALKRATIO2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5555) 		DRXJ_16TO8(0x10),	/* FFERCA2DATALKRATIO3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5556) 		DRXJ_16TO8(0x20),	/* FFERCA2DATALKRATIO4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5557) 		DRXJ_16TO8(0x20),	/* FFERCA2DATALKRATIO5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5558) 		DRXJ_16TO8(0x20),	/* FFERCA2DATALKRATIO6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5559) 		DRXJ_16TO8(0x20),	/* FFERCA2DATALKRATIO7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5560) 		DRXJ_16TO8(0x20),	/* FFERCA2DATALKRATIO8 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5561) 		DRXJ_16TO8(0x20),	/* FFERCA2DATALKRATIO9 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5562) 		DRXJ_16TO8(0x10),	/* FFERCA2DATALKRATIO10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5563) 		DRXJ_16TO8(0x10),	/* FFERCA2DATALKRATIO11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5564) 		DRXJ_16TO8(0x10),	/* FFERCA2DATALKRATIO12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5565) 		DRXJ_16TO8(0x07),	/* FFEDDM1TRAINLKRATIO1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5566) 		DRXJ_16TO8(0x07),	/* FFEDDM1TRAINLKRATIO2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5567) 		DRXJ_16TO8(0x07),	/* FFEDDM1TRAINLKRATIO3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5568) 		DRXJ_16TO8(0x0e),	/* FFEDDM1TRAINLKRATIO4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5569) 		DRXJ_16TO8(0x0e),	/* FFEDDM1TRAINLKRATIO5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5570) 		DRXJ_16TO8(0x0e),	/* FFEDDM1TRAINLKRATIO6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5571) 		DRXJ_16TO8(0x0e),	/* FFEDDM1TRAINLKRATIO7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5572) 		DRXJ_16TO8(0x0e),	/* FFEDDM1TRAINLKRATIO8 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5573) 		DRXJ_16TO8(0x0e),	/* FFEDDM1TRAINLKRATIO9 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5574) 		DRXJ_16TO8(0x07),	/* FFEDDM1TRAINLKRATIO10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5575) 		DRXJ_16TO8(0x07),	/* FFEDDM1TRAINLKRATIO11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5576) 		DRXJ_16TO8(0x07),	/* FFEDDM1TRAINLKRATIO12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5577) 		DRXJ_16TO8(0x07),	/* FFEDDM1DATALKRATIO1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5578) 		DRXJ_16TO8(0x07),	/* FFEDDM1DATALKRATIO2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5579) 		DRXJ_16TO8(0x07),	/* FFEDDM1DATALKRATIO3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5580) 		DRXJ_16TO8(0x0e),	/* FFEDDM1DATALKRATIO4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5581) 		DRXJ_16TO8(0x0e),	/* FFEDDM1DATALKRATIO5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5582) 		DRXJ_16TO8(0x0e),	/* FFEDDM1DATALKRATIO6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5583) 		DRXJ_16TO8(0x0e),	/* FFEDDM1DATALKRATIO7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5584) 		DRXJ_16TO8(0x0e),	/* FFEDDM1DATALKRATIO8 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5585) 		DRXJ_16TO8(0x0e),	/* FFEDDM1DATALKRATIO9 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5586) 		DRXJ_16TO8(0x07),	/* FFEDDM1DATALKRATIO10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5587) 		DRXJ_16TO8(0x07),	/* FFEDDM1DATALKRATIO11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5588) 		DRXJ_16TO8(0x07),	/* FFEDDM1DATALKRATIO12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5589) 		DRXJ_16TO8(0x06),	/* FFEDDM2TRAINLKRATIO1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5590) 		DRXJ_16TO8(0x06),	/* FFEDDM2TRAINLKRATIO2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5591) 		DRXJ_16TO8(0x06),	/* FFEDDM2TRAINLKRATIO3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5592) 		DRXJ_16TO8(0x0c),	/* FFEDDM2TRAINLKRATIO4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5593) 		DRXJ_16TO8(0x0c),	/* FFEDDM2TRAINLKRATIO5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5594) 		DRXJ_16TO8(0x0c),	/* FFEDDM2TRAINLKRATIO6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5595) 		DRXJ_16TO8(0x0c),	/* FFEDDM2TRAINLKRATIO7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5596) 		DRXJ_16TO8(0x0c),	/* FFEDDM2TRAINLKRATIO8 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5597) 		DRXJ_16TO8(0x0c),	/* FFEDDM2TRAINLKRATIO9 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5598) 		DRXJ_16TO8(0x06),	/* FFEDDM2TRAINLKRATIO10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5599) 		DRXJ_16TO8(0x06),	/* FFEDDM2TRAINLKRATIO11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5600) 		DRXJ_16TO8(0x06),	/* FFEDDM2TRAINLKRATIO12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5601) 		DRXJ_16TO8(0x06),	/* FFEDDM2DATALKRATIO1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5602) 		DRXJ_16TO8(0x06),	/* FFEDDM2DATALKRATIO2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5603) 		DRXJ_16TO8(0x06),	/* FFEDDM2DATALKRATIO3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5604) 		DRXJ_16TO8(0x0c),	/* FFEDDM2DATALKRATIO4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5605) 		DRXJ_16TO8(0x0c),	/* FFEDDM2DATALKRATIO5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5606) 		DRXJ_16TO8(0x0c),	/* FFEDDM2DATALKRATIO6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5607) 		DRXJ_16TO8(0x0c),	/* FFEDDM2DATALKRATIO7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5608) 		DRXJ_16TO8(0x0c),	/* FFEDDM2DATALKRATIO8 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5609) 		DRXJ_16TO8(0x0c),	/* FFEDDM2DATALKRATIO9 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5610) 		DRXJ_16TO8(0x06),	/* FFEDDM2DATALKRATIO10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5611) 		DRXJ_16TO8(0x06),	/* FFEDDM2DATALKRATIO11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5612) 		DRXJ_16TO8(0x06),	/* FFEDDM2DATALKRATIO12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5613) 		DRXJ_16TO8(0x2020),	/* FIRTRAINGAIN1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5614) 		DRXJ_16TO8(0x2020),	/* FIRTRAINGAIN2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5615) 		DRXJ_16TO8(0x2020),	/* FIRTRAINGAIN3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5616) 		DRXJ_16TO8(0x4040),	/* FIRTRAINGAIN4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5617) 		DRXJ_16TO8(0x4040),	/* FIRTRAINGAIN5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5618) 		DRXJ_16TO8(0x4040),	/* FIRTRAINGAIN6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5619) 		DRXJ_16TO8(0x4040),	/* FIRTRAINGAIN7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5620) 		DRXJ_16TO8(0x4040),	/* FIRTRAINGAIN8 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5621) 		DRXJ_16TO8(0x4040),	/* FIRTRAINGAIN9 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5622) 		DRXJ_16TO8(0x2020),	/* FIRTRAINGAIN10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5623) 		DRXJ_16TO8(0x2020),	/* FIRTRAINGAIN11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5624) 		DRXJ_16TO8(0x2020),	/* FIRTRAINGAIN12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5625) 		DRXJ_16TO8(0x0808),	/* FIRRCA1GAIN1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5626) 		DRXJ_16TO8(0x0808),	/* FIRRCA1GAIN2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5627) 		DRXJ_16TO8(0x0808),	/* FIRRCA1GAIN3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5628) 		DRXJ_16TO8(0x1010),	/* FIRRCA1GAIN4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5629) 		DRXJ_16TO8(0x1010),	/* FIRRCA1GAIN5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5630) 		DRXJ_16TO8(0x1010),	/* FIRRCA1GAIN6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5631) 		DRXJ_16TO8(0x1010),	/* FIRRCA1GAIN7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5632) 		DRXJ_16TO8(0x1010)	/* FIRRCA1GAIN8 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5633) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5634) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5635) 	static const u8 vsb_ffe_leak_gain_ram1[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5636) 		DRXJ_16TO8(0x1010),	/* FIRRCA1GAIN9 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5637) 		DRXJ_16TO8(0x0808),	/* FIRRCA1GAIN10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5638) 		DRXJ_16TO8(0x0808),	/* FIRRCA1GAIN11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5639) 		DRXJ_16TO8(0x0808),	/* FIRRCA1GAIN12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5640) 		DRXJ_16TO8(0x0808),	/* FIRRCA2GAIN1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5641) 		DRXJ_16TO8(0x0808),	/* FIRRCA2GAIN2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5642) 		DRXJ_16TO8(0x0808),	/* FIRRCA2GAIN3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5643) 		DRXJ_16TO8(0x1010),	/* FIRRCA2GAIN4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5644) 		DRXJ_16TO8(0x1010),	/* FIRRCA2GAIN5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5645) 		DRXJ_16TO8(0x1010),	/* FIRRCA2GAIN6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5646) 		DRXJ_16TO8(0x1010),	/* FIRRCA2GAIN7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5647) 		DRXJ_16TO8(0x1010),	/* FIRRCA2GAIN8 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5648) 		DRXJ_16TO8(0x1010),	/* FIRRCA2GAIN9 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5649) 		DRXJ_16TO8(0x0808),	/* FIRRCA2GAIN10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5650) 		DRXJ_16TO8(0x0808),	/* FIRRCA2GAIN11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5651) 		DRXJ_16TO8(0x0808),	/* FIRRCA2GAIN12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5652) 		DRXJ_16TO8(0x0303),	/* FIRDDM1GAIN1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5653) 		DRXJ_16TO8(0x0303),	/* FIRDDM1GAIN2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5654) 		DRXJ_16TO8(0x0303),	/* FIRDDM1GAIN3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5655) 		DRXJ_16TO8(0x0606),	/* FIRDDM1GAIN4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5656) 		DRXJ_16TO8(0x0606),	/* FIRDDM1GAIN5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5657) 		DRXJ_16TO8(0x0606),	/* FIRDDM1GAIN6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5658) 		DRXJ_16TO8(0x0606),	/* FIRDDM1GAIN7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5659) 		DRXJ_16TO8(0x0606),	/* FIRDDM1GAIN8 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5660) 		DRXJ_16TO8(0x0606),	/* FIRDDM1GAIN9 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5661) 		DRXJ_16TO8(0x0303),	/* FIRDDM1GAIN10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5662) 		DRXJ_16TO8(0x0303),	/* FIRDDM1GAIN11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5663) 		DRXJ_16TO8(0x0303),	/* FIRDDM1GAIN12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5664) 		DRXJ_16TO8(0x0303),	/* FIRDDM2GAIN1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5665) 		DRXJ_16TO8(0x0303),	/* FIRDDM2GAIN2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5666) 		DRXJ_16TO8(0x0303),	/* FIRDDM2GAIN3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5667) 		DRXJ_16TO8(0x0505),	/* FIRDDM2GAIN4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5668) 		DRXJ_16TO8(0x0505),	/* FIRDDM2GAIN5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5669) 		DRXJ_16TO8(0x0505),	/* FIRDDM2GAIN6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5670) 		DRXJ_16TO8(0x0505),	/* FIRDDM2GAIN7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5671) 		DRXJ_16TO8(0x0505),	/* FIRDDM2GAIN8 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5672) 		DRXJ_16TO8(0x0505),	/* FIRDDM2GAIN9 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5673) 		DRXJ_16TO8(0x0303),	/* FIRDDM2GAIN10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5674) 		DRXJ_16TO8(0x0303),	/* FIRDDM2GAIN11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5675) 		DRXJ_16TO8(0x0303),	/* FIRDDM2GAIN12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5676) 		DRXJ_16TO8(0x001f),	/* DFETRAINLKRATIO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5677) 		DRXJ_16TO8(0x01ff),	/* DFERCA1TRAINLKRATIO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5678) 		DRXJ_16TO8(0x01ff),	/* DFERCA1DATALKRATIO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5679) 		DRXJ_16TO8(0x004f),	/* DFERCA2TRAINLKRATIO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5680) 		DRXJ_16TO8(0x004f),	/* DFERCA2DATALKRATIO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5681) 		DRXJ_16TO8(0x01ff),	/* DFEDDM1TRAINLKRATIO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5682) 		DRXJ_16TO8(0x01ff),	/* DFEDDM1DATALKRATIO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5683) 		DRXJ_16TO8(0x0352),	/* DFEDDM2TRAINLKRATIO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5684) 		DRXJ_16TO8(0x0352),	/* DFEDDM2DATALKRATIO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5685) 		DRXJ_16TO8(0x0000),	/* DFETRAINGAIN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5686) 		DRXJ_16TO8(0x2020),	/* DFERCA1GAIN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5687) 		DRXJ_16TO8(0x1010),	/* DFERCA2GAIN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5688) 		DRXJ_16TO8(0x1818),	/* DFEDDM1GAIN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5689) 		DRXJ_16TO8(0x1212)	/* DFEDDM2GAIN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5690) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5691) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5692) 	dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5693) 	rc = drxdap_fasi_write_block(dev_addr, VSB_SYSCTRL_RAM0_FFETRAINLKRATIO1__A, sizeof(vsb_ffe_leak_gain_ram0), ((u8 *)vsb_ffe_leak_gain_ram0), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5694) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5695) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5696) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5697) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5698) 	rc = drxdap_fasi_write_block(dev_addr, VSB_SYSCTRL_RAM1_FIRRCA1GAIN9__A, sizeof(vsb_ffe_leak_gain_ram1), ((u8 *)vsb_ffe_leak_gain_ram1), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5699) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5700) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5701) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5702) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5703) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5704) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5705) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5706) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5707) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5708) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5709) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5710) * \fn int set_vsb()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5711) * \brief Set 8VSB demod.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5712) * \param demod instance of demodulator.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5713) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5714) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5715) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5716) static int set_vsb(struct drx_demod_instance *demod)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5717) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5718) 	struct i2c_device_addr *dev_addr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5719) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5720) 	struct drx_common_attr *common_attr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5721) 	struct drxjscu_cmd cmd_scu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5722) 	struct drxj_data *ext_attr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5723) 	u16 cmd_result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5724) 	u16 cmd_param = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5725) 	static const u8 vsb_taps_re[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5726) 		DRXJ_16TO8(-2),	/* re0  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5727) 		DRXJ_16TO8(4),	/* re1  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5728) 		DRXJ_16TO8(1),	/* re2  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5729) 		DRXJ_16TO8(-4),	/* re3  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5730) 		DRXJ_16TO8(1),	/* re4  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5731) 		DRXJ_16TO8(4),	/* re5  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5732) 		DRXJ_16TO8(-3),	/* re6  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5733) 		DRXJ_16TO8(-3),	/* re7  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5734) 		DRXJ_16TO8(6),	/* re8  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5735) 		DRXJ_16TO8(1),	/* re9  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5736) 		DRXJ_16TO8(-9),	/* re10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5737) 		DRXJ_16TO8(3),	/* re11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5738) 		DRXJ_16TO8(12),	/* re12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5739) 		DRXJ_16TO8(-9),	/* re13 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5740) 		DRXJ_16TO8(-15),	/* re14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5741) 		DRXJ_16TO8(17),	/* re15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5742) 		DRXJ_16TO8(19),	/* re16 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5743) 		DRXJ_16TO8(-29),	/* re17 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5744) 		DRXJ_16TO8(-22),	/* re18 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5745) 		DRXJ_16TO8(45),	/* re19 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5746) 		DRXJ_16TO8(25),	/* re20 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5747) 		DRXJ_16TO8(-70),	/* re21 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5748) 		DRXJ_16TO8(-28),	/* re22 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5749) 		DRXJ_16TO8(111),	/* re23 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5750) 		DRXJ_16TO8(30),	/* re24 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5751) 		DRXJ_16TO8(-201),	/* re25 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5752) 		DRXJ_16TO8(-31),	/* re26 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5753) 		DRXJ_16TO8(629)	/* re27 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5754) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5755) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5756) 	dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5757) 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5758) 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5759) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5760) 	/* stop all comm_exec */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5761) 	rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5762) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5763) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5764) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5765) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5766) 	rc = drxj_dap_write_reg16(dev_addr, VSB_COMM_EXEC__A, VSB_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5767) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5768) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5769) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5770) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5771) 	rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5772) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5773) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5774) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5775) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5776) 	rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5777) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5778) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5779) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5780) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5781) 	rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5782) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5783) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5784) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5785) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5786) 	rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5787) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5788) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5789) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5790) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5791) 	rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5792) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5793) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5794) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5795) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5796) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5797) 	/* reset demodulator */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5798) 	cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5799) 	    | SCU_RAM_COMMAND_CMD_DEMOD_RESET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5800) 	cmd_scu.parameter_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5801) 	cmd_scu.result_len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5802) 	cmd_scu.parameter = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5803) 	cmd_scu.result = &cmd_result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5804) 	rc = scu_command(dev_addr, &cmd_scu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5805) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5806) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5807) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5808) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5809) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5810) 	rc = drxj_dap_write_reg16(dev_addr, IQM_AF_DCF_BYPASS__A, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5811) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5812) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5813) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5814) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5815) 	rc = drxj_dap_write_reg16(dev_addr, IQM_FS_ADJ_SEL__A, IQM_FS_ADJ_SEL_B_VSB, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5816) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5817) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5818) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5819) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5820) 	rc = drxj_dap_write_reg16(dev_addr, IQM_RC_ADJ_SEL__A, IQM_RC_ADJ_SEL_B_VSB, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5821) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5822) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5823) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5824) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5825) 	ext_attr->iqm_rc_rate_ofs = 0x00AD0D79;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5826) 	rc = drxdap_fasi_write_reg32(dev_addr, IQM_RC_RATE_OFS_LO__A, ext_attr->iqm_rc_rate_ofs, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5827) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5828) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5829) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5830) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5831) 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CFAGC_GAINSHIFT__A, 4, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5832) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5833) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5834) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5835) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5836) 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN1TRK__A, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5837) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5838) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5839) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5840) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5841) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5842) 	rc = drxj_dap_write_reg16(dev_addr, IQM_RC_CROUT_ENA__A, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5843) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5844) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5845) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5846) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5847) 	rc = drxj_dap_write_reg16(dev_addr, IQM_RC_STRETCH__A, 28, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5848) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5849) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5850) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5851) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5852) 	rc = drxj_dap_write_reg16(dev_addr, IQM_RT_ACTIVE__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5853) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5854) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5855) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5856) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5857) 	rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SYMMETRIC__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5858) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5859) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5860) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5861) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5862) 	rc = drxj_dap_write_reg16(dev_addr, IQM_CF_MIDTAP__A, 3, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5863) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5864) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5865) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5866) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5867) 	rc = drxj_dap_write_reg16(dev_addr, IQM_CF_OUT_ENA__A, IQM_CF_OUT_ENA_VSB__M, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5868) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5869) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5870) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5871) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5872) 	rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE__A, 1393, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5873) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5874) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5875) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5876) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5877) 	rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE_SH__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5878) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5879) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5880) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5881) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5882) 	rc = drxj_dap_write_reg16(dev_addr, IQM_CF_POW_MEAS_LEN__A, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5883) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5884) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5885) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5886) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5887) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5888) 	rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(vsb_taps_re), ((u8 *)vsb_taps_re), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5889) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5890) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5891) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5892) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5893) 	rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(vsb_taps_re), ((u8 *)vsb_taps_re), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5894) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5895) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5896) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5897) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5898) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5899) 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_BNTHRESH__A, 330, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5900) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5901) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5902) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5903) 	}	/* set higher threshold */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5904) 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CLPLASTNUM__A, 90, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5905) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5906) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5907) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5908) 	}	/* burst detection on   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5909) 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_RCA1__A, 0x0042, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5910) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5911) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5912) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5913) 	}	/* drop thresholds by 1 dB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5914) 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_RCA2__A, 0x0053, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5915) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5916) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5917) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5918) 	}	/* drop thresholds by 2 dB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5919) 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_EQCTRL__A, 0x1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5920) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5921) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5922) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5923) 	}	/* cma on               */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5924) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_GPIO__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5925) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5926) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5927) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5928) 	}	/* GPIO               */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5929) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5930) 	/* Initialize the FEC Subsystem */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5931) 	rc = drxj_dap_write_reg16(dev_addr, FEC_TOP_ANNEX__A, FEC_TOP_ANNEX_D, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5932) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5933) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5934) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5935) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5936) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5937) 		u16 fec_oc_snc_mode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5938) 		rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_MODE__A, &fec_oc_snc_mode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5939) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5940) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5941) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5942) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5943) 		/* output data even when not locked */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5944) 		rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_MODE__A, fec_oc_snc_mode | FEC_OC_SNC_MODE_UNLOCK_ENABLE__M, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5945) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5946) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5947) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5948) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5949) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5950) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5951) 	/* set clip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5952) 	rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLP_LEN__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5953) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5954) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5955) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5956) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5957) 	rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLP_TH__A, 470, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5958) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5959) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5960) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5961) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5962) 	rc = drxj_dap_write_reg16(dev_addr, IQM_AF_SNS_LEN__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5963) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5964) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5965) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5966) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5967) 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_PT__A, 0xD4, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5968) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5969) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5970) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5971) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5972) 	/* no transparent, no A&C framing; parity is set in mpegoutput */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5973) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5974) 		u16 fec_oc_reg_mode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5975) 		rc = drxj_dap_read_reg16(dev_addr, FEC_OC_MODE__A, &fec_oc_reg_mode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5976) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5977) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5978) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5979) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5980) 		rc = drxj_dap_write_reg16(dev_addr, FEC_OC_MODE__A, fec_oc_reg_mode & (~(FEC_OC_MODE_TRANSPARENT__M | FEC_OC_MODE_CLEAR__M | FEC_OC_MODE_RETAIN_FRAMING__M)), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5981) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5982) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5983) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5984) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5985) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5986) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5987) 	rc = drxj_dap_write_reg16(dev_addr, FEC_DI_TIMEOUT_LO__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5988) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5989) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5990) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5991) 	}	/* timeout counter for restarting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5992) 	rc = drxj_dap_write_reg16(dev_addr, FEC_DI_TIMEOUT_HI__A, 3, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5993) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5994) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5995) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5996) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5997) 	rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MODE__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5998) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5999) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6000) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6001) 	}	/* bypass disabled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6002) 	/* initialize RS packet error measurement parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6003) 	rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MEASUREMENT_PERIOD__A, FEC_RS_MEASUREMENT_PERIOD, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6004) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6005) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6006) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6007) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6008) 	rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MEASUREMENT_PRESCALE__A, FEC_RS_MEASUREMENT_PRESCALE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6009) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6010) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6011) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6012) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6013) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6014) 	/* init measurement period of MER/SER */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6015) 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_MEASUREMENT_PERIOD__A, VSB_TOP_MEASUREMENT_PERIOD, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6016) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6017) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6018) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6019) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6020) 	rc = drxdap_fasi_write_reg32(dev_addr, SCU_RAM_FEC_ACCUM_CW_CORRECTED_LO__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6021) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6022) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6023) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6024) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6025) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_MEAS_COUNT__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6026) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6027) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6028) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6029) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6030) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6031) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6032) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6033) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6034) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6035) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6036) 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CKGN1TRK__A, 128, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6037) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6038) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6039) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6040) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6041) 	/* B-Input to ADC, PGA+filter in standby */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6042) 	if (!ext_attr->has_lna) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6043) 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AMUX__A, 0x02, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6044) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6045) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6046) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6047) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6048) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6049) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6050) 	/* turn on IQMAF. It has to be in front of setAgc**() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6051) 	rc = set_iqm_af(demod, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6052) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6053) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6054) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6055) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6056) 	rc = adc_synchronization(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6057) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6058) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6059) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6060) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6061) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6062) 	rc = init_agc(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6063) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6064) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6065) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6066) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6067) 	rc = set_agc_if(demod, &(ext_attr->vsb_if_agc_cfg), false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6068) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6069) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6070) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6071) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6072) 	rc = set_agc_rf(demod, &(ext_attr->vsb_rf_agc_cfg), false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6073) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6074) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6075) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6076) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6077) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6078) 		/* TODO fix this, store a struct drxj_cfg_afe_gain structure in struct drxj_data instead
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6079) 		   of only the gain */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6080) 		struct drxj_cfg_afe_gain vsb_pga_cfg = { DRX_STANDARD_8VSB, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6081) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6082) 		vsb_pga_cfg.gain = ext_attr->vsb_pga_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6083) 		rc = ctrl_set_cfg_afe_gain(demod, &vsb_pga_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6084) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6085) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6086) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6087) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6088) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6089) 	rc = ctrl_set_cfg_pre_saw(demod, &(ext_attr->vsb_pre_saw_cfg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6090) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6091) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6092) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6093) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6094) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6095) 	/* Mpeg output has to be in front of FEC active */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6096) 	rc = set_mpegtei_handling(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6097) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6098) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6099) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6100) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6101) 	rc = bit_reverse_mpeg_output(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6102) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6103) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6104) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6105) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6106) 	rc = set_mpeg_start_width(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6107) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6108) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6109) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6110) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6111) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6112) 		/* TODO: move to set_standard after hardware reset value problem is solved */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6113) 		/* Configure initial MPEG output */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6114) 		struct drx_cfg_mpeg_output cfg_mpeg_output;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6115) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6116) 		memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6117) 		cfg_mpeg_output.enable_mpeg_output = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6119) 		rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6120) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6121) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6122) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6123) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6124) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6125) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6126) 	/* TBD: what parameters should be set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6127) 	cmd_param = 0x00;	/* Default mode AGC on, etc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6128) 	cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6129) 	    | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6130) 	cmd_scu.parameter_len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6131) 	cmd_scu.result_len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6132) 	cmd_scu.parameter = &cmd_param;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6133) 	cmd_scu.result = &cmd_result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6134) 	rc = scu_command(dev_addr, &cmd_scu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6135) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6136) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6137) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6138) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6139) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6140) 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_BEAGC_GAINSHIFT__A, 0x0004, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6141) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6142) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6143) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6144) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6145) 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_PT__A, 0x00D2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6146) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6147) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6148) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6149) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6150) 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SYSSMTRNCTRL__A, VSB_TOP_SYSSMTRNCTRL__PRE | VSB_TOP_SYSSMTRNCTRL_NCOTIMEOUTCNTEN__M, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6151) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6152) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6153) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6154) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6155) 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_BEDETCTRL__A, 0x142, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6156) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6157) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6158) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6159) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6160) 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_LBAGCREFLVL__A, 640, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6161) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6162) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6163) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6164) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6165) 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN1ACQ__A, 4, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6166) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6167) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6168) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6169) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6170) 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN1TRK__A, 2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6171) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6172) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6173) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6174) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6175) 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN2TRK__A, 3, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6176) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6177) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6178) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6179) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6180) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6181) 	/* start demodulator */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6182) 	cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6183) 	    | SCU_RAM_COMMAND_CMD_DEMOD_START;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6184) 	cmd_scu.parameter_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6185) 	cmd_scu.result_len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6186) 	cmd_scu.parameter = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6187) 	cmd_scu.result = &cmd_result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6188) 	rc = scu_command(dev_addr, &cmd_scu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6189) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6190) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6191) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6192) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6193) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6194) 	rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_ACTIVE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6195) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6196) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6197) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6198) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6199) 	rc = drxj_dap_write_reg16(dev_addr, VSB_COMM_EXEC__A, VSB_COMM_EXEC_ACTIVE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6200) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6201) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6202) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6203) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6204) 	rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6205) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6206) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6207) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6208) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6209) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6210) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6211) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6212) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6213) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6214) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6215) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6216) * \fn static short get_vsb_post_rs_pck_err(struct i2c_device_addr *dev_addr, u16 *PckErrs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6217) * \brief Get the values of packet error in 8VSB mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6218) * \return Error code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6219) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6220) static int get_vsb_post_rs_pck_err(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6221) 				   u32 *pck_errs, u32 *pck_count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6222) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6223) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6224) 	u16 data = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6225) 	u16 period = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6226) 	u16 prescale = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6227) 	u16 packet_errors_mant = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6228) 	u16 packet_errors_exp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6229) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6230) 	rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_FAILURES__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6231) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6232) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6233) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6234) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6235) 	packet_errors_mant = data & FEC_RS_NR_FAILURES_FIXED_MANT__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6236) 	packet_errors_exp = (data & FEC_RS_NR_FAILURES_EXP__M)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6237) 	    >> FEC_RS_NR_FAILURES_EXP__B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6238) 	period = FEC_RS_MEASUREMENT_PERIOD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6239) 	prescale = FEC_RS_MEASUREMENT_PRESCALE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6240) 	/* packet error rate = (error packet number) per second */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6241) 	/* 77.3 us is time for per packet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6242) 	if (period * prescale == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6243) 		pr_err("error: period and/or prescale is zero!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6244) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6245) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6246) 	*pck_errs = packet_errors_mant * (1 << packet_errors_exp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6247) 	*pck_count = period * prescale * 77;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6248) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6249) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6250) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6251) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6252) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6253) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6254) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6255) * \fn static short GetVSBBer(struct i2c_device_addr *dev_addr, u32 *ber)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6256) * \brief Get the values of ber in VSB mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6257) * \return Error code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6258) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6259) static int get_vs_bpost_viterbi_ber(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6260) 				    u32 *ber, u32 *cnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6261) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6262) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6263) 	u16 data = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6264) 	u16 period = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6265) 	u16 prescale = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6266) 	u16 bit_errors_mant = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6267) 	u16 bit_errors_exp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6268) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6269) 	rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_BIT_ERRORS__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6270) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6271) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6272) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6273) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6274) 	period = FEC_RS_MEASUREMENT_PERIOD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6275) 	prescale = FEC_RS_MEASUREMENT_PRESCALE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6276) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6277) 	bit_errors_mant = data & FEC_RS_NR_BIT_ERRORS_FIXED_MANT__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6278) 	bit_errors_exp = (data & FEC_RS_NR_BIT_ERRORS_EXP__M)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6279) 	    >> FEC_RS_NR_BIT_ERRORS_EXP__B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6280) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6281) 	*cnt = period * prescale * 207 * ((bit_errors_exp > 2) ? 1 : 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6282) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6283) 	if (((bit_errors_mant << bit_errors_exp) >> 3) > 68700)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6284) 		*ber = (*cnt) * 26570;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6285) 	else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6286) 		if (period * prescale == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6287) 			pr_err("error: period and/or prescale is zero!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6288) 			return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6289) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6290) 		*ber = bit_errors_mant << ((bit_errors_exp > 2) ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6291) 			(bit_errors_exp - 3) : bit_errors_exp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6292) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6293) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6294) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6295) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6296) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6297) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6298) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6299) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6300) * \fn static short get_vs_bpre_viterbi_ber(struct i2c_device_addr *dev_addr, u32 *ber)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6301) * \brief Get the values of ber in VSB mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6302) * \return Error code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6303) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6304) static int get_vs_bpre_viterbi_ber(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6305) 				   u32 *ber, u32 *cnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6306) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6307) 	u16 data = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6308) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6309) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6310) 	rc = drxj_dap_read_reg16(dev_addr, VSB_TOP_NR_SYM_ERRS__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6311) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6312) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6313) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6314) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6315) 	*ber = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6316) 	*cnt = VSB_TOP_MEASUREMENT_PERIOD * SYMBOLS_PER_SEGMENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6317) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6318) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6319) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6320) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6321) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6322) * \fn static int get_vsbmer(struct i2c_device_addr *dev_addr, u16 *mer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6323) * \brief Get the values of MER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6324) * \return Error code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6325) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6326) static int get_vsbmer(struct i2c_device_addr *dev_addr, u16 *mer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6327) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6328) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6329) 	u16 data_hi = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6330) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6331) 	rc = drxj_dap_read_reg16(dev_addr, VSB_TOP_ERR_ENERGY_H__A, &data_hi, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6332) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6333) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6334) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6335) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6336) 	*mer =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6337) 	    (u16) (log1_times100(21504) - log1_times100((data_hi << 6) / 52));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6338) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6339) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6340) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6341) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6342) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6343) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6344) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6345) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6346) /*==                     END 8VSB DATAPATH FUNCTIONS                        ==*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6347) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6348) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6349) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6350) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6351) /*==                       QAM DATAPATH FUNCTIONS                           ==*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6352) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6353) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6354) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6355) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6356) * \fn int power_down_qam ()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6357) * \brief Powr down QAM related blocks.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6358) * \param demod instance of demodulator.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6359) * \param channel pointer to channel data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6360) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6361) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6362) static int power_down_qam(struct drx_demod_instance *demod, bool primary)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6363) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6364) 	struct drxjscu_cmd cmd_scu = { /* command      */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6365) 		/* parameter_len */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6366) 		/* result_len    */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6367) 		/* *parameter   */ NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6368) 		/* *result      */ NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6369) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6370) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6371) 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6372) 	struct drx_cfg_mpeg_output cfg_mpeg_output;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6373) 	struct drx_common_attr *common_attr = demod->my_common_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6374) 	u16 cmd_result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6375) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6376) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6377) 	   STOP demodulator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6378) 	   resets IQM, QAM and FEC HW blocks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6379) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6380) 	/* stop all comm_exec */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6381) 	rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6382) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6383) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6384) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6385) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6386) 	rc = drxj_dap_write_reg16(dev_addr, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6387) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6388) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6389) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6390) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6391) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6392) 	cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6393) 	    SCU_RAM_COMMAND_CMD_DEMOD_STOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6394) 	cmd_scu.parameter_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6395) 	cmd_scu.result_len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6396) 	cmd_scu.parameter = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6397) 	cmd_scu.result = &cmd_result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6398) 	rc = scu_command(dev_addr, &cmd_scu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6399) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6400) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6401) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6402) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6403) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6404) 	if (primary) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6405) 		rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6406) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6407) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6408) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6409) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6410) 		rc = set_iqm_af(demod, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6411) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6412) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6413) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6414) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6415) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6416) 		rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6417) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6418) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6419) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6420) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6421) 		rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6422) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6423) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6424) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6425) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6426) 		rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6427) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6428) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6429) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6430) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6431) 		rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6432) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6433) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6434) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6435) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6436) 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6437) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6438) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6439) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6440) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6441) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6442) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6443) 	memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6444) 	cfg_mpeg_output.enable_mpeg_output = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6445) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6446) 	rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6447) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6448) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6449) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6450) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6451) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6452) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6453) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6454) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6455) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6456) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6457) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6458) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6459) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6460) * \fn int set_qam_measurement ()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6461) * \brief Setup of the QAM Measuremnt intervals for signal quality
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6462) * \param demod instance of demod.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6463) * \param constellation current constellation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6464) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6465) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6466) *  NOTE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6467) *  Take into account that for certain settings the errorcounters can overflow.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6468) *  The implementation does not check this.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6469) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6470) *  TODO: overriding the ext_attr->fec_bits_desired by constellation dependent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6471) *  constants to get a measurement period of approx. 1 sec. Remove fec_bits_desired
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6472) *  field ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6473) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6474) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6475) #ifndef DRXJ_VSB_ONLY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6476) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6477) set_qam_measurement(struct drx_demod_instance *demod,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6478) 		    enum drx_modulation constellation, u32 symbol_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6479) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6480) 	struct i2c_device_addr *dev_addr = NULL;	/* device address for I2C writes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6481) 	struct drxj_data *ext_attr = NULL;	/* Global data container for DRXJ specific data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6482) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6483) 	u32 fec_bits_desired = 0;	/* BER accounting period */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6484) 	u16 fec_rs_plen = 0;	/* defines RS BER measurement period */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6485) 	u16 fec_rs_prescale = 0;	/* ReedSolomon Measurement Prescale */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6486) 	u32 fec_rs_period = 0;	/* Value for corresponding I2C register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6487) 	u32 fec_rs_bit_cnt = 0;	/* Actual precise amount of bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6488) 	u32 fec_oc_snc_fail_period = 0;	/* Value for corresponding I2C register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6489) 	u32 qam_vd_period = 0;	/* Value for corresponding I2C register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6490) 	u32 qam_vd_bit_cnt = 0;	/* Actual precise amount of bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6491) 	u16 fec_vd_plen = 0;	/* no of trellis symbols: VD SER measur period */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6492) 	u16 qam_vd_prescale = 0;	/* Viterbi Measurement Prescale */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6493) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6494) 	dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6495) 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6496) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6497) 	fec_bits_desired = ext_attr->fec_bits_desired;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6498) 	fec_rs_prescale = ext_attr->fec_rs_prescale;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6499) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6500) 	switch (constellation) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6501) 	case DRX_CONSTELLATION_QAM16:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6502) 		fec_bits_desired = 4 * symbol_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6503) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6504) 	case DRX_CONSTELLATION_QAM32:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6505) 		fec_bits_desired = 5 * symbol_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6506) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6507) 	case DRX_CONSTELLATION_QAM64:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6508) 		fec_bits_desired = 6 * symbol_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6509) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6510) 	case DRX_CONSTELLATION_QAM128:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6511) 		fec_bits_desired = 7 * symbol_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6512) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6513) 	case DRX_CONSTELLATION_QAM256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6514) 		fec_bits_desired = 8 * symbol_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6515) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6516) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6517) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6518) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6519) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6520) 	/* Parameters for Reed-Solomon Decoder */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6521) 	/* fecrs_period = (int)ceil(FEC_BITS_DESIRED/(fecrs_prescale*plen)) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6522) 	/* rs_bit_cnt   = fecrs_period*fecrs_prescale*plen                  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6523) 	/*     result is within 32 bit arithmetic ->                        */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6524) 	/*     no need for mult or frac functions                           */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6525) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6526) 	/* TODO: use constant instead of calculation and remove the fec_rs_plen in ext_attr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6527) 	switch (ext_attr->standard) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6528) 	case DRX_STANDARD_ITU_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6529) 	case DRX_STANDARD_ITU_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6530) 		fec_rs_plen = 204 * 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6531) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6532) 	case DRX_STANDARD_ITU_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6533) 		fec_rs_plen = 128 * 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6534) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6535) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6536) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6537) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6538) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6539) 	ext_attr->fec_rs_plen = fec_rs_plen;	/* for getSigQual */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6540) 	fec_rs_bit_cnt = fec_rs_prescale * fec_rs_plen;	/* temp storage   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6541) 	if (fec_rs_bit_cnt == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6542) 		pr_err("error: fec_rs_bit_cnt is zero!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6543) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6544) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6545) 	fec_rs_period = fec_bits_desired / fec_rs_bit_cnt + 1;	/* ceil */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6546) 	if (ext_attr->standard != DRX_STANDARD_ITU_B)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6547) 		fec_oc_snc_fail_period = fec_rs_period;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6548) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6549) 	/* limit to max 16 bit value (I2C register width) if needed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6550) 	if (fec_rs_period > 0xFFFF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6551) 		fec_rs_period = 0xFFFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6552) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6553) 	/* write corresponding registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6554) 	switch (ext_attr->standard) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6555) 	case DRX_STANDARD_ITU_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6556) 	case DRX_STANDARD_ITU_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6557) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6558) 	case DRX_STANDARD_ITU_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6559) 		switch (constellation) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6560) 		case DRX_CONSTELLATION_QAM64:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6561) 			fec_rs_period = 31581;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6562) 			fec_oc_snc_fail_period = 17932;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6563) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6564) 		case DRX_CONSTELLATION_QAM256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6565) 			fec_rs_period = 45446;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6566) 			fec_oc_snc_fail_period = 25805;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6567) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6568) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6569) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6570) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6571) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6572) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6573) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6574) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6575) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6576) 	rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_FAIL_PERIOD__A, (u16)fec_oc_snc_fail_period, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6577) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6578) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6579) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6580) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6581) 	rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MEASUREMENT_PERIOD__A, (u16)fec_rs_period, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6582) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6583) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6584) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6585) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6586) 	rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MEASUREMENT_PRESCALE__A, fec_rs_prescale, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6587) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6588) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6589) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6590) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6591) 	ext_attr->fec_rs_period = (u16) fec_rs_period;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6592) 	ext_attr->fec_rs_prescale = fec_rs_prescale;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6593) 	rc = drxdap_fasi_write_reg32(dev_addr, SCU_RAM_FEC_ACCUM_CW_CORRECTED_LO__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6594) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6595) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6596) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6597) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6598) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_MEAS_COUNT__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6599) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6600) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6601) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6602) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6603) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6604) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6605) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6606) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6607) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6608) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6609) 	if (ext_attr->standard == DRX_STANDARD_ITU_B) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6610) 		/* Parameters for Viterbi Decoder */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6611) 		/* qamvd_period = (int)ceil(FEC_BITS_DESIRED/                      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6612) 		/*                    (qamvd_prescale*plen*(qam_constellation+1))) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6613) 		/* vd_bit_cnt   = qamvd_period*qamvd_prescale*plen                 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6614) 		/*     result is within 32 bit arithmetic ->                       */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6615) 		/*     no need for mult or frac functions                          */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6616) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6617) 		/* a(8 bit) * b(8 bit) = 16 bit result => mult32 not needed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6618) 		fec_vd_plen = ext_attr->fec_vd_plen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6619) 		qam_vd_prescale = ext_attr->qam_vd_prescale;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6620) 		qam_vd_bit_cnt = qam_vd_prescale * fec_vd_plen;	/* temp storage */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6621) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6622) 		switch (constellation) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6623) 		case DRX_CONSTELLATION_QAM64:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6624) 			/* a(16 bit) * b(4 bit) = 20 bit result => mult32 not needed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6625) 			qam_vd_period =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6626) 			    qam_vd_bit_cnt * (QAM_TOP_CONSTELLATION_QAM64 + 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6627) 			    * (QAM_TOP_CONSTELLATION_QAM64 + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6628) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6629) 		case DRX_CONSTELLATION_QAM256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6630) 			/* a(16 bit) * b(5 bit) = 21 bit result => mult32 not needed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6631) 			qam_vd_period =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6632) 			    qam_vd_bit_cnt * (QAM_TOP_CONSTELLATION_QAM256 + 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6633) 			    * (QAM_TOP_CONSTELLATION_QAM256 + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6634) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6635) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6636) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6637) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6638) 		if (qam_vd_period == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6639) 			pr_err("error: qam_vd_period is zero!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6640) 			return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6641) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6642) 		qam_vd_period = fec_bits_desired / qam_vd_period;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6643) 		/* limit to max 16 bit value (I2C register width) if needed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6644) 		if (qam_vd_period > 0xFFFF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6645) 			qam_vd_period = 0xFFFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6646) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6647) 		/* a(16 bit) * b(16 bit) = 32 bit result => mult32 not needed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6648) 		qam_vd_bit_cnt *= qam_vd_period;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6649) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6650) 		rc = drxj_dap_write_reg16(dev_addr, QAM_VD_MEASUREMENT_PERIOD__A, (u16)qam_vd_period, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6651) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6652) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6653) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6654) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6655) 		rc = drxj_dap_write_reg16(dev_addr, QAM_VD_MEASUREMENT_PRESCALE__A, qam_vd_prescale, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6656) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6657) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6658) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6659) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6660) 		ext_attr->qam_vd_period = (u16) qam_vd_period;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6661) 		ext_attr->qam_vd_prescale = qam_vd_prescale;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6662) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6663) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6664) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6665) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6666) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6667) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6668) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6669) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6670) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6671) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6672) * \fn int set_qam16 ()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6673) * \brief QAM16 specific setup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6674) * \param demod instance of demod.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6675) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6676) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6677) static int set_qam16(struct drx_demod_instance *demod)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6678) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6679) 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6680) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6681) 	static const u8 qam_dq_qual_fun[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6682) 		DRXJ_16TO8(2),	/* fun0  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6683) 		DRXJ_16TO8(2),	/* fun1  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6684) 		DRXJ_16TO8(2),	/* fun2  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6685) 		DRXJ_16TO8(2),	/* fun3  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6686) 		DRXJ_16TO8(3),	/* fun4  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6687) 		DRXJ_16TO8(3),	/* fun5  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6688) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6689) 	static const u8 qam_eq_cma_rad[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6690) 		DRXJ_16TO8(13517),	/* RAD0  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6691) 		DRXJ_16TO8(13517),	/* RAD1  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6692) 		DRXJ_16TO8(13517),	/* RAD2  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6693) 		DRXJ_16TO8(13517),	/* RAD3  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6694) 		DRXJ_16TO8(13517),	/* RAD4  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6695) 		DRXJ_16TO8(13517),	/* RAD5  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6696) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6697) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6698) 	rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6699) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6700) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6701) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6702) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6703) 	rc = drxdap_fasi_write_block(dev_addr, SCU_RAM_QAM_EQ_CMA_RAD0__A, sizeof(qam_eq_cma_rad), ((u8 *)qam_eq_cma_rad), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6704) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6705) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6706) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6707) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6708) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6709) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 140, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6710) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6711) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6712) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6713) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6714) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 50, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6715) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6716) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6717) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6718) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6719) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 120, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6720) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6721) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6722) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6723) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6724) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 230, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6725) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6726) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6727) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6728) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6729) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 95, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6730) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6731) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6732) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6733) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6734) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 105, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6735) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6736) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6737) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6738) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6739) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6740) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6741) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6742) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6743) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6744) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6745) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 56, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6746) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6747) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6748) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6749) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6750) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6751) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6752) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6753) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6754) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6755) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6756) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 16, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6757) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6758) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6759) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6760) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6761) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 220, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6762) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6763) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6764) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6765) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6766) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, 25, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6767) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6768) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6769) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6770) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6771) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, 6, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6772) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6773) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6774) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6775) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6776) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16)(-24), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6777) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6778) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6779) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6780) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6781) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16)(-65), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6782) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6783) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6784) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6785) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6786) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-127), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6787) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6788) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6789) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6790) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6791) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6792) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6793) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6794) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6795) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6796) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6797) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6798) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6799) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6800) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6801) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6802) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6803) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6804) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6805) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6806) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6807) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6808) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6809) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6810) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6811) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6812) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6813) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6814) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6815) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6816) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6817) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6818) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6819) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6820) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6821) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6822) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 10, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6823) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6824) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6825) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6826) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6827) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 50, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6828) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6829) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6830) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6831) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6832) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6833) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6834) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6835) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6836) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6837) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6838) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6839) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6840) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6841) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6842) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6843) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6844) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6845) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6846) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6847) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6848) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6849) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6850) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6851) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6852) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6853) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6854) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6855) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6856) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6857) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6858) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6859) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6860) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6861) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6862) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6863) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6864) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6865) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6866) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6867) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 32, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6868) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6869) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6870) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6871) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6872) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 240, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6873) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6874) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6875) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6876) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6877) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6878) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6879) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6880) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6881) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6882) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6883) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6884) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6885) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6886) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6887) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 32, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6888) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6889) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6890) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6891) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6892) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6893) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 40960, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6894) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6895) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6896) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6897) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6898) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6899) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6900) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6901) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6902) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6903) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6904) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6905) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6906) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6907) * \fn int set_qam32 ()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6908) * \brief QAM32 specific setup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6909) * \param demod instance of demod.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6910) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6911) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6912) static int set_qam32(struct drx_demod_instance *demod)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6913) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6914) 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6915) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6916) 	static const u8 qam_dq_qual_fun[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6917) 		DRXJ_16TO8(3),	/* fun0  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6918) 		DRXJ_16TO8(3),	/* fun1  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6919) 		DRXJ_16TO8(3),	/* fun2  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6920) 		DRXJ_16TO8(3),	/* fun3  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6921) 		DRXJ_16TO8(4),	/* fun4  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6922) 		DRXJ_16TO8(4),	/* fun5  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6923) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6924) 	static const u8 qam_eq_cma_rad[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6925) 		DRXJ_16TO8(6707),	/* RAD0  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6926) 		DRXJ_16TO8(6707),	/* RAD1  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6927) 		DRXJ_16TO8(6707),	/* RAD2  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6928) 		DRXJ_16TO8(6707),	/* RAD3  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6929) 		DRXJ_16TO8(6707),	/* RAD4  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6930) 		DRXJ_16TO8(6707),	/* RAD5  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6931) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6932) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6933) 	rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6934) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6935) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6936) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6937) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6938) 	rc = drxdap_fasi_write_block(dev_addr, SCU_RAM_QAM_EQ_CMA_RAD0__A, sizeof(qam_eq_cma_rad), ((u8 *)qam_eq_cma_rad), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6939) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6940) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6941) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6942) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6943) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6944) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 90, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6945) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6946) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6947) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6948) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6949) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 50, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6950) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6951) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6952) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6953) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6954) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 100, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6955) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6956) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6957) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6958) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6959) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 170, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6960) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6961) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6962) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6963) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6964) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6965) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6966) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6967) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6968) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6969) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 100, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6970) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6971) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6972) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6973) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6974) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6975) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6976) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6977) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6978) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6979) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6980) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 56, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6981) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6982) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6983) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6984) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6985) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6986) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6987) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6988) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6989) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6990) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6991) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 12, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6992) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6993) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6994) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6995) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6996) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 140, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6997) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6998) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6999) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7000) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7001) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16)(-8), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7002) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7003) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7004) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7005) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7006) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16)(-16), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7007) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7008) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7009) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7010) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7011) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16)(-26), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7012) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7013) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7014) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7015) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7016) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16)(-56), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7017) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7018) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7019) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7020) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7021) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-86), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7022) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7023) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7024) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7025) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7026) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7027) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7028) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7029) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7030) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7031) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7032) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7033) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7034) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7035) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7036) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7037) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7038) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7039) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7040) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7041) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7042) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7043) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7044) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7045) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7046) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7047) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7048) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7049) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7050) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7051) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7052) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7053) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7054) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7055) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7056) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7057) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 10, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7058) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7059) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7060) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7061) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7062) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 50, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7063) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7064) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7065) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7066) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7067) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7068) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7069) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7070) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7071) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7072) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7073) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7074) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7075) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7076) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7077) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7078) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7079) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7080) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7081) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7082) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7083) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7084) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7085) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7086) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7087) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7088) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7089) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7090) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7091) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7092) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7093) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7094) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7095) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7096) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7097) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7098) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7099) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7100) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7101) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7102) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 32, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7103) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7104) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7105) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7106) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7107) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 176, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7108) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7109) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7110) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7111) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7112) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7113) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7114) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7115) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7116) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7117) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7118) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7119) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7120) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7121) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7122) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 8, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7123) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7124) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7125) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7126) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7127) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7128) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 20480, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7129) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7130) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7131) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7132) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7133) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7134) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7135) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7136) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7137) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7138) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7139) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7140) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7141) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7142) * \fn int set_qam64 ()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7143) * \brief QAM64 specific setup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7144) * \param demod instance of demod.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7145) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7146) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7147) static int set_qam64(struct drx_demod_instance *demod)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7148) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7149) 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7150) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7151) 	static const u8 qam_dq_qual_fun[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7152) 		/* this is hw reset value. no necessary to re-write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7153) 		DRXJ_16TO8(4),	/* fun0  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7154) 		DRXJ_16TO8(4),	/* fun1  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7155) 		DRXJ_16TO8(4),	/* fun2  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7156) 		DRXJ_16TO8(4),	/* fun3  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7157) 		DRXJ_16TO8(6),	/* fun4  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7158) 		DRXJ_16TO8(6),	/* fun5  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7159) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7160) 	static const u8 qam_eq_cma_rad[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7161) 		DRXJ_16TO8(13336),	/* RAD0  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7162) 		DRXJ_16TO8(12618),	/* RAD1  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7163) 		DRXJ_16TO8(11988),	/* RAD2  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7164) 		DRXJ_16TO8(13809),	/* RAD3  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7165) 		DRXJ_16TO8(13809),	/* RAD4  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7166) 		DRXJ_16TO8(15609),	/* RAD5  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7167) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7168) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7169) 	rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7170) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7171) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7172) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7173) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7174) 	rc = drxdap_fasi_write_block(dev_addr, SCU_RAM_QAM_EQ_CMA_RAD0__A, sizeof(qam_eq_cma_rad), ((u8 *)qam_eq_cma_rad), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7175) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7176) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7177) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7178) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7179) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7180) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 105, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7181) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7182) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7183) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7184) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7185) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 60, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7186) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7187) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7188) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7189) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7190) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 100, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7191) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7192) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7193) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7194) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7195) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 195, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7196) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7197) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7198) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7199) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7200) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7201) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7202) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7203) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7204) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7205) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 84, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7206) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7207) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7208) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7209) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7210) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7211) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7212) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7213) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7214) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7215) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7216) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 32, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7217) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7218) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7219) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7220) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7221) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7222) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7223) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7224) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7225) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7226) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7227) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 12, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7228) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7229) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7230) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7231) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7232) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 141, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7233) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7234) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7235) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7236) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7237) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, 7, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7238) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7239) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7240) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7241) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7242) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7243) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7244) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7245) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7246) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7247) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16)(-15), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7248) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7249) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7250) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7251) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7252) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16)(-45), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7253) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7254) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7255) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7256) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7257) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-80), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7258) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7259) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7260) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7261) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7262) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7263) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7264) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7265) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7266) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7267) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7268) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7269) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7270) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7271) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7272) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7273) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7274) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7275) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7276) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7277) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7278) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 30, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7279) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7280) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7281) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7282) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7283) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7284) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7285) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7286) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7287) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7288) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7289) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7290) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7291) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7292) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7293) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 15, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7294) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7295) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7296) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7297) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7298) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 80, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7299) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7300) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7301) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7302) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7303) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7304) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7305) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7306) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7307) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7308) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7309) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7310) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7311) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7312) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7313) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7314) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7315) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7316) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7317) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7318) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7319) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7320) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7321) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7322) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7323) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7324) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7325) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7326) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7327) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7328) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7329) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7330) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7331) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7332) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7333) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7334) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7335) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7336) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7337) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7338) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 48, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7339) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7340) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7341) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7342) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7343) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 160, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7344) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7345) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7346) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7347) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7348) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7349) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7350) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7351) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7352) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7353) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7354) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7355) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7356) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7357) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7358) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 32, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7359) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7360) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7361) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7362) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7363) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7364) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 43008, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7365) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7366) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7367) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7368) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7369) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7370) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7371) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7372) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7373) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7374) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7375) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7376) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7377) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7378) * \fn int set_qam128 ()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7379) * \brief QAM128 specific setup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7380) * \param demod: instance of demod.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7381) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7382) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7383) static int set_qam128(struct drx_demod_instance *demod)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7384) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7385) 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7386) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7387) 	static const u8 qam_dq_qual_fun[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7388) 		DRXJ_16TO8(6),	/* fun0  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7389) 		DRXJ_16TO8(6),	/* fun1  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7390) 		DRXJ_16TO8(6),	/* fun2  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7391) 		DRXJ_16TO8(6),	/* fun3  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7392) 		DRXJ_16TO8(9),	/* fun4  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7393) 		DRXJ_16TO8(9),	/* fun5  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7394) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7395) 	static const u8 qam_eq_cma_rad[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7396) 		DRXJ_16TO8(6164),	/* RAD0  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7397) 		DRXJ_16TO8(6598),	/* RAD1  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7398) 		DRXJ_16TO8(6394),	/* RAD2  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7399) 		DRXJ_16TO8(6409),	/* RAD3  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7400) 		DRXJ_16TO8(6656),	/* RAD4  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7401) 		DRXJ_16TO8(7238),	/* RAD5  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7402) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7403) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7404) 	rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7405) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7406) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7407) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7408) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7409) 	rc = drxdap_fasi_write_block(dev_addr, SCU_RAM_QAM_EQ_CMA_RAD0__A, sizeof(qam_eq_cma_rad), ((u8 *)qam_eq_cma_rad), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7410) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7411) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7412) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7413) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7414) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7415) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 50, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7416) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7417) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7418) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7419) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7420) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 60, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7421) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7422) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7423) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7424) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7425) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 100, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7426) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7427) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7428) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7429) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7430) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 140, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7431) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7432) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7433) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7434) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7435) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7436) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7437) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7438) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7439) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7440) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 100, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7441) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7442) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7443) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7444) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7445) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7446) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7447) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7448) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7449) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7450) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7451) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 32, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7452) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7453) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7454) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7455) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7456) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7457) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7458) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7459) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7460) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7461) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7462) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 8, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7463) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7464) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7465) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7466) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7467) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 65, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7468) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7469) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7470) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7471) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7472) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, 5, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7473) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7474) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7475) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7476) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7477) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, 3, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7478) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7479) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7480) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7481) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7482) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16)(-1), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7483) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7484) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7485) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7486) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7487) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, 12, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7488) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7489) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7490) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7491) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7492) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-23), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7493) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7494) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7495) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7496) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7497) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7498) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7499) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7500) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7501) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7502) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7503) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7504) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7505) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7506) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7507) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7508) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7509) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7510) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7511) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7512) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7513) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 40, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7514) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7515) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7516) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7517) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7518) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7519) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7520) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7521) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7522) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7523) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7524) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7525) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7526) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7527) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7528) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7529) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7530) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7531) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7532) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7533) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 80, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7534) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7535) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7536) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7537) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7538) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7539) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7540) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7541) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7542) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7543) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7544) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7545) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7546) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7547) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7548) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7549) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7550) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7551) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7552) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7553) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7554) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7555) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7556) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7557) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7558) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7559) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7560) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7561) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7562) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7563) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7564) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7565) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7566) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7567) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7568) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7569) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7570) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7571) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7572) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7573) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 32, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7574) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7575) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7576) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7577) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7578) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 144, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7579) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7580) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7581) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7582) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7583) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7584) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7585) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7586) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7587) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7588) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7589) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7590) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7591) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7592) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7593) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 16, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7594) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7595) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7596) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7597) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7598) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7599) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 20992, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7600) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7601) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7602) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7603) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7604) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7605) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7606) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7607) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7608) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7609) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7610) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7611) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7612) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7613) * \fn int set_qam256 ()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7614) * \brief QAM256 specific setup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7615) * \param demod: instance of demod.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7616) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7617) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7618) static int set_qam256(struct drx_demod_instance *demod)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7619) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7620) 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7621) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7622) 	static const u8 qam_dq_qual_fun[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7623) 		DRXJ_16TO8(8),	/* fun0  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7624) 		DRXJ_16TO8(8),	/* fun1  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7625) 		DRXJ_16TO8(8),	/* fun2  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7626) 		DRXJ_16TO8(8),	/* fun3  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7627) 		DRXJ_16TO8(12),	/* fun4  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7628) 		DRXJ_16TO8(12),	/* fun5  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7629) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7630) 	static const u8 qam_eq_cma_rad[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7631) 		DRXJ_16TO8(12345),	/* RAD0  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7632) 		DRXJ_16TO8(12345),	/* RAD1  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7633) 		DRXJ_16TO8(13626),	/* RAD2  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7634) 		DRXJ_16TO8(12931),	/* RAD3  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7635) 		DRXJ_16TO8(14719),	/* RAD4  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7636) 		DRXJ_16TO8(15356),	/* RAD5  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7637) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7638) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7639) 	rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7640) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7641) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7642) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7643) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7644) 	rc = drxdap_fasi_write_block(dev_addr, SCU_RAM_QAM_EQ_CMA_RAD0__A, sizeof(qam_eq_cma_rad), ((u8 *)qam_eq_cma_rad), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7645) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7646) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7647) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7648) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7649) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7650) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 50, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7651) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7652) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7653) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7654) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7655) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 60, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7656) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7657) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7658) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7659) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7660) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 100, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7661) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7662) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7663) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7664) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7665) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 150, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7666) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7667) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7668) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7669) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7670) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7671) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7672) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7673) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7674) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7675) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 110, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7676) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7677) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7678) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7679) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7680) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7681) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7682) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7683) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7684) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7685) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7686) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 16, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7687) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7688) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7689) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7690) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7691) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7692) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7693) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7694) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7695) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7696) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7697) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 8, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7698) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7699) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7700) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7701) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7702) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 74, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7703) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7704) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7705) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7706) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7707) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, 18, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7708) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7709) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7710) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7711) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7712) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, 13, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7713) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7714) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7715) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7716) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7717) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, 7, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7718) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7719) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7720) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7721) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7722) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7723) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7724) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7725) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7726) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7727) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-8), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7728) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7729) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7730) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7731) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7732) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7733) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7734) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7735) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7736) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7737) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7738) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7739) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7740) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7741) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7742) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7743) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7744) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7745) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7746) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7747) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7748) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 50, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7749) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7750) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7751) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7752) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7753) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7754) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7755) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7756) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7757) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7758) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7759) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7760) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7761) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7762) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7763) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 25, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7764) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7765) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7766) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7767) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7768) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 80, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7769) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7770) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7771) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7772) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7773) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7774) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7775) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7776) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7777) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7778) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7779) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7780) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7781) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7782) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7783) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7784) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7785) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7786) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7787) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7788) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7789) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7790) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7791) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7792) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7793) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7794) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7795) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7796) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7797) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7798) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7799) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7800) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7801) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7802) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7803) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7804) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7805) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7806) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7807) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7808) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 48, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7809) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7810) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7811) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7812) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7813) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 80, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7814) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7815) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7816) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7817) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7818) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7819) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7820) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7821) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7822) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7823) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7824) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7825) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7826) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7827) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7828) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 16, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7829) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7830) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7831) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7832) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7833) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7834) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 43520, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7835) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7836) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7837) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7838) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7839) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7840) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7841) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7842) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7843) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7844) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7845) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7846) #define QAM_SET_OP_ALL 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7847) #define QAM_SET_OP_CONSTELLATION 0x2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7848) #define QAM_SET_OP_SPECTRUM 0X4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7849) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7850) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7851) * \fn int set_qam ()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7852) * \brief Set QAM demod.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7853) * \param demod:   instance of demod.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7854) * \param channel: pointer to channel data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7855) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7856) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7857) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7858) set_qam(struct drx_demod_instance *demod,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7859) 	struct drx_channel *channel, s32 tuner_freq_offset, u32 op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7860) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7861) 	struct i2c_device_addr *dev_addr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7862) 	struct drxj_data *ext_attr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7863) 	struct drx_common_attr *common_attr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7864) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7865) 	u32 adc_frequency = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7866) 	u32 iqm_rc_rate = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7867) 	u16 cmd_result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7868) 	u16 lc_symbol_freq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7869) 	u16 iqm_rc_stretch = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7870) 	u16 set_env_parameters = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7871) 	u16 set_param_parameters[2] = { 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7872) 	struct drxjscu_cmd cmd_scu = { /* command      */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7873) 		/* parameter_len */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7874) 		/* result_len    */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7875) 		/* parameter    */ NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7876) 		/* result       */ NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7877) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7878) 	static const u8 qam_a_taps[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7879) 		DRXJ_16TO8(-1),	/* re0  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7880) 		DRXJ_16TO8(1),	/* re1  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7881) 		DRXJ_16TO8(1),	/* re2  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7882) 		DRXJ_16TO8(-1),	/* re3  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7883) 		DRXJ_16TO8(-1),	/* re4  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7884) 		DRXJ_16TO8(2),	/* re5  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7885) 		DRXJ_16TO8(1),	/* re6  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7886) 		DRXJ_16TO8(-2),	/* re7  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7887) 		DRXJ_16TO8(0),	/* re8  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7888) 		DRXJ_16TO8(3),	/* re9  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7889) 		DRXJ_16TO8(-1),	/* re10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7890) 		DRXJ_16TO8(-3),	/* re11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7891) 		DRXJ_16TO8(4),	/* re12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7892) 		DRXJ_16TO8(1),	/* re13 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7893) 		DRXJ_16TO8(-8),	/* re14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7894) 		DRXJ_16TO8(4),	/* re15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7895) 		DRXJ_16TO8(13),	/* re16 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7896) 		DRXJ_16TO8(-13),	/* re17 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7897) 		DRXJ_16TO8(-19),	/* re18 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7898) 		DRXJ_16TO8(28),	/* re19 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7899) 		DRXJ_16TO8(25),	/* re20 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7900) 		DRXJ_16TO8(-53),	/* re21 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7901) 		DRXJ_16TO8(-31),	/* re22 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7902) 		DRXJ_16TO8(96),	/* re23 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7903) 		DRXJ_16TO8(37),	/* re24 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7904) 		DRXJ_16TO8(-190),	/* re25 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7905) 		DRXJ_16TO8(-40),	/* re26 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7906) 		DRXJ_16TO8(619)	/* re27 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7907) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7908) 	static const u8 qam_b64_taps[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7909) 		DRXJ_16TO8(0),	/* re0  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7910) 		DRXJ_16TO8(-2),	/* re1  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7911) 		DRXJ_16TO8(1),	/* re2  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7912) 		DRXJ_16TO8(2),	/* re3  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7913) 		DRXJ_16TO8(-2),	/* re4  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7914) 		DRXJ_16TO8(0),	/* re5  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7915) 		DRXJ_16TO8(4),	/* re6  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7916) 		DRXJ_16TO8(-2),	/* re7  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7917) 		DRXJ_16TO8(-4),	/* re8  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7918) 		DRXJ_16TO8(4),	/* re9  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7919) 		DRXJ_16TO8(3),	/* re10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7920) 		DRXJ_16TO8(-6),	/* re11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7921) 		DRXJ_16TO8(0),	/* re12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7922) 		DRXJ_16TO8(6),	/* re13 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7923) 		DRXJ_16TO8(-5),	/* re14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7924) 		DRXJ_16TO8(-3),	/* re15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7925) 		DRXJ_16TO8(11),	/* re16 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7926) 		DRXJ_16TO8(-4),	/* re17 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7927) 		DRXJ_16TO8(-19),	/* re18 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7928) 		DRXJ_16TO8(19),	/* re19 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7929) 		DRXJ_16TO8(28),	/* re20 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7930) 		DRXJ_16TO8(-45),	/* re21 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7931) 		DRXJ_16TO8(-36),	/* re22 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7932) 		DRXJ_16TO8(90),	/* re23 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7933) 		DRXJ_16TO8(42),	/* re24 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7934) 		DRXJ_16TO8(-185),	/* re25 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7935) 		DRXJ_16TO8(-46),	/* re26 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7936) 		DRXJ_16TO8(614)	/* re27 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7937) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7938) 	static const u8 qam_b256_taps[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7939) 		DRXJ_16TO8(-2),	/* re0  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7940) 		DRXJ_16TO8(4),	/* re1  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7941) 		DRXJ_16TO8(1),	/* re2  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7942) 		DRXJ_16TO8(-4),	/* re3  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7943) 		DRXJ_16TO8(0),	/* re4  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7944) 		DRXJ_16TO8(4),	/* re5  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7945) 		DRXJ_16TO8(-2),	/* re6  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7946) 		DRXJ_16TO8(-4),	/* re7  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7947) 		DRXJ_16TO8(5),	/* re8  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7948) 		DRXJ_16TO8(2),	/* re9  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7949) 		DRXJ_16TO8(-8),	/* re10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7950) 		DRXJ_16TO8(2),	/* re11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7951) 		DRXJ_16TO8(11),	/* re12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7952) 		DRXJ_16TO8(-8),	/* re13 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7953) 		DRXJ_16TO8(-15),	/* re14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7954) 		DRXJ_16TO8(16),	/* re15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7955) 		DRXJ_16TO8(19),	/* re16 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7956) 		DRXJ_16TO8(-27),	/* re17 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7957) 		DRXJ_16TO8(-22),	/* re18 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7958) 		DRXJ_16TO8(44),	/* re19 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7959) 		DRXJ_16TO8(26),	/* re20 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7960) 		DRXJ_16TO8(-69),	/* re21 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7961) 		DRXJ_16TO8(-28),	/* re22 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7962) 		DRXJ_16TO8(110),	/* re23 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7963) 		DRXJ_16TO8(31),	/* re24 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7964) 		DRXJ_16TO8(-201),	/* re25 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7965) 		DRXJ_16TO8(-32),	/* re26 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7966) 		DRXJ_16TO8(628)	/* re27 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7967) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7968) 	static const u8 qam_c_taps[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7969) 		DRXJ_16TO8(-3),	/* re0  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7970) 		DRXJ_16TO8(3),	/* re1  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7971) 		DRXJ_16TO8(2),	/* re2  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7972) 		DRXJ_16TO8(-4),	/* re3  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7973) 		DRXJ_16TO8(0),	/* re4  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7974) 		DRXJ_16TO8(4),	/* re5  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7975) 		DRXJ_16TO8(-1),	/* re6  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7976) 		DRXJ_16TO8(-4),	/* re7  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7977) 		DRXJ_16TO8(3),	/* re8  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7978) 		DRXJ_16TO8(3),	/* re9  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7979) 		DRXJ_16TO8(-5),	/* re10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7980) 		DRXJ_16TO8(0),	/* re11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7981) 		DRXJ_16TO8(9),	/* re12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7982) 		DRXJ_16TO8(-4),	/* re13 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7983) 		DRXJ_16TO8(-12),	/* re14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7984) 		DRXJ_16TO8(10),	/* re15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7985) 		DRXJ_16TO8(16),	/* re16 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7986) 		DRXJ_16TO8(-21),	/* re17 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7987) 		DRXJ_16TO8(-20),	/* re18 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7988) 		DRXJ_16TO8(37),	/* re19 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7989) 		DRXJ_16TO8(25),	/* re20 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7990) 		DRXJ_16TO8(-62),	/* re21 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7991) 		DRXJ_16TO8(-28),	/* re22 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7992) 		DRXJ_16TO8(105),	/* re23 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7993) 		DRXJ_16TO8(31),	/* re24 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7994) 		DRXJ_16TO8(-197),	/* re25 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7995) 		DRXJ_16TO8(-33),	/* re26 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7996) 		DRXJ_16TO8(626)	/* re27 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7997) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7998) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7999) 	dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8000) 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8001) 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8002) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8003) 	if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8004) 		if (ext_attr->standard == DRX_STANDARD_ITU_B) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8005) 			switch (channel->constellation) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8006) 			case DRX_CONSTELLATION_QAM256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8007) 				iqm_rc_rate = 0x00AE3562;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8008) 				lc_symbol_freq =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8009) 				    QAM_LC_SYMBOL_FREQ_FREQ_QAM_B_256;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8010) 				channel->symbolrate = 5360537;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8011) 				iqm_rc_stretch = IQM_RC_STRETCH_QAM_B_256;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8012) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8013) 			case DRX_CONSTELLATION_QAM64:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8014) 				iqm_rc_rate = 0x00C05A0E;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8015) 				lc_symbol_freq = 409;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8016) 				channel->symbolrate = 5056941;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8017) 				iqm_rc_stretch = IQM_RC_STRETCH_QAM_B_64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8018) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8019) 			default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8020) 				return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8021) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8022) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8023) 			adc_frequency = (common_attr->sys_clock_freq * 1000) / 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8024) 			if (channel->symbolrate == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8025) 				pr_err("error: channel symbolrate is zero!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8026) 				return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8027) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8028) 			iqm_rc_rate =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8029) 			    (adc_frequency / channel->symbolrate) * (1 << 21) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8030) 			    (frac28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8031) 			     ((adc_frequency % channel->symbolrate),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8032) 			      channel->symbolrate) >> 7) - (1 << 23);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8033) 			lc_symbol_freq =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8034) 			    (u16) (frac28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8035) 				     (channel->symbolrate +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8036) 				      (adc_frequency >> 13),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8037) 				      adc_frequency) >> 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8038) 			if (lc_symbol_freq > 511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8039) 				lc_symbol_freq = 511;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8040) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8041) 			iqm_rc_stretch = 21;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8042) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8043) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8044) 		if (ext_attr->standard == DRX_STANDARD_ITU_A) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8045) 			set_env_parameters = QAM_TOP_ANNEX_A;	/* annex             */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8046) 			set_param_parameters[0] = channel->constellation;	/* constellation     */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8047) 			set_param_parameters[1] = DRX_INTERLEAVEMODE_I12_J17;	/* interleave mode   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8048) 		} else if (ext_attr->standard == DRX_STANDARD_ITU_B) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8049) 			set_env_parameters = QAM_TOP_ANNEX_B;	/* annex             */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8050) 			set_param_parameters[0] = channel->constellation;	/* constellation     */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8051) 			set_param_parameters[1] = channel->interleavemode;	/* interleave mode   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8052) 		} else if (ext_attr->standard == DRX_STANDARD_ITU_C) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8053) 			set_env_parameters = QAM_TOP_ANNEX_C;	/* annex             */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8054) 			set_param_parameters[0] = channel->constellation;	/* constellation     */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8055) 			set_param_parameters[1] = DRX_INTERLEAVEMODE_I12_J17;	/* interleave mode   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8056) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8057) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8058) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8059) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8060) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8061) 	if (op & QAM_SET_OP_ALL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8062) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8063) 		   STEP 1: reset demodulator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8064) 		   resets IQM, QAM and FEC HW blocks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8065) 		   resets SCU variables
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8066) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8067) 		/* stop all comm_exec */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8068) 		rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8069) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8070) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8071) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8072) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8073) 		rc = drxj_dap_write_reg16(dev_addr, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8074) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8075) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8076) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8077) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8078) 		rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8079) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8080) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8081) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8082) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8083) 		rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8084) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8085) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8086) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8087) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8088) 		rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8089) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8090) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8091) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8092) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8093) 		rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8094) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8095) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8096) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8097) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8098) 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8099) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8100) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8101) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8102) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8103) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8104) 		cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8105) 		    SCU_RAM_COMMAND_CMD_DEMOD_RESET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8106) 		cmd_scu.parameter_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8107) 		cmd_scu.result_len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8108) 		cmd_scu.parameter = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8109) 		cmd_scu.result = &cmd_result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8110) 		rc = scu_command(dev_addr, &cmd_scu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8111) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8112) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8113) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8114) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8115) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8116) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8117) 	if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8118) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8119) 		   STEP 2: configure demodulator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8120) 		   -set env
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8121) 		   -set params (resets IQM,QAM,FEC HW; initializes some SCU variables )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8122) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8123) 		cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8124) 		    SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8125) 		cmd_scu.parameter_len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8126) 		cmd_scu.result_len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8127) 		cmd_scu.parameter = &set_env_parameters;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8128) 		cmd_scu.result = &cmd_result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8129) 		rc = scu_command(dev_addr, &cmd_scu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8130) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8131) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8132) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8133) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8134) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8135) 		cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8136) 		    SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8137) 		cmd_scu.parameter_len = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8138) 		cmd_scu.result_len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8139) 		cmd_scu.parameter = set_param_parameters;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8140) 		cmd_scu.result = &cmd_result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8141) 		rc = scu_command(dev_addr, &cmd_scu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8142) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8143) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8144) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8145) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8146) 		/* set symbol rate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8147) 		rc = drxdap_fasi_write_reg32(dev_addr, IQM_RC_RATE_OFS_LO__A, iqm_rc_rate, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8148) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8149) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8150) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8151) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8152) 		ext_attr->iqm_rc_rate_ofs = iqm_rc_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8153) 		rc = set_qam_measurement(demod, channel->constellation, channel->symbolrate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8154) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8155) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8156) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8157) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8158) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8159) 	/* STEP 3: enable the system in a mode where the ADC provides valid signal
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8160) 	   setup constellation independent registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8161) 	/* from qam_cmd.py script (qam_driver_b) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8162) 	/* TODO: remove re-writes of HW reset values */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8163) 	if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_SPECTRUM)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8164) 		rc = set_frequency(demod, channel, tuner_freq_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8165) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8166) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8167) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8168) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8169) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8170) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8171) 	if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8172) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8173) 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_SYMBOL_FREQ__A, lc_symbol_freq, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8174) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8175) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8176) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8177) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8178) 		rc = drxj_dap_write_reg16(dev_addr, IQM_RC_STRETCH__A, iqm_rc_stretch, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8179) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8180) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8181) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8182) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8183) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8184) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8185) 	if (op & QAM_SET_OP_ALL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8186) 		if (!ext_attr->has_lna) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8187) 			rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AMUX__A, 0x02, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8188) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8189) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8190) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8191) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8192) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8193) 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SYMMETRIC__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8194) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8195) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8196) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8197) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8198) 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_MIDTAP__A, 3, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8199) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8200) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8201) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8202) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8203) 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_OUT_ENA__A, IQM_CF_OUT_ENA_QAM__M, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8204) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8205) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8206) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8207) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8208) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8209) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_WR_RSV_0__A, 0x5f, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8210) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8211) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8212) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8213) 		}	/* scu temporary shut down agc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8214) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8215) 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_SYNC_SEL__A, 3, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8216) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8217) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8218) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8219) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8220) 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLP_LEN__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8221) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8222) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8223) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8224) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8225) 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLP_TH__A, 448, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8226) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8227) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8228) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8229) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8230) 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_SNS_LEN__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8231) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8232) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8233) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8234) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8235) 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_PDREF__A, 4, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8236) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8237) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8238) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8239) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8240) 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, 0x10, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8241) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8242) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8243) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8244) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8245) 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_PGA_GAIN__A, 11, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8246) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8247) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8248) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8249) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8250) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8251) 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_POW_MEAS_LEN__A, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8252) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8253) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8254) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8255) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8256) 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE_SH__A, IQM_CF_SCALE_SH__PRE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8257) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8258) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8259) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8260) 		}	/*! reset default val ! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8261) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8262) 		rc = drxj_dap_write_reg16(dev_addr, QAM_SY_TIMEOUT__A, QAM_SY_TIMEOUT__PRE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8263) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8264) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8265) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8266) 		}	/*! reset default val ! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8267) 		if (ext_attr->standard == DRX_STANDARD_ITU_B) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8268) 			rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_LWM__A, QAM_SY_SYNC_LWM__PRE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8269) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8270) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8271) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8272) 			}	/*! reset default val ! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8273) 			rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_AWM__A, QAM_SY_SYNC_AWM__PRE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8274) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8275) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8276) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8277) 			}	/*! reset default val ! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8278) 			rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_HWM__A, QAM_SY_SYNC_HWM__PRE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8279) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8280) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8281) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8282) 			}	/*! reset default val ! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8283) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8284) 			switch (channel->constellation) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8285) 			case DRX_CONSTELLATION_QAM16:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8286) 			case DRX_CONSTELLATION_QAM64:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8287) 			case DRX_CONSTELLATION_QAM256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8288) 				rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_LWM__A, 0x03, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8289) 				if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8290) 					pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8291) 					goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8292) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8293) 				rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_AWM__A, 0x04, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8294) 				if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8295) 					pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8296) 					goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8297) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8298) 				rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_HWM__A, QAM_SY_SYNC_HWM__PRE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8299) 				if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8300) 					pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8301) 					goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8302) 				}	/*! reset default val ! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8303) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8304) 			case DRX_CONSTELLATION_QAM32:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8305) 			case DRX_CONSTELLATION_QAM128:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8306) 				rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_LWM__A, 0x03, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8307) 				if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8308) 					pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8309) 					goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8310) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8311) 				rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_AWM__A, 0x05, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8312) 				if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8313) 					pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8314) 					goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8315) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8316) 				rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_HWM__A, 0x06, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8317) 				if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8318) 					pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8319) 					goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8320) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8321) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8322) 			default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8323) 				return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8324) 			}	/* switch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8325) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8326) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8327) 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_MODE__A, QAM_LC_MODE__PRE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8328) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8329) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8330) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8331) 		}	/*! reset default val ! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8332) 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_RATE_LIMIT__A, 3, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8333) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8334) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8335) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8336) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8337) 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_LPF_FACTORP__A, 4, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8338) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8339) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8340) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8341) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8342) 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_LPF_FACTORI__A, 4, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8343) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8344) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8345) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8346) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8347) 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_MODE__A, 7, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8348) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8349) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8350) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8351) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8352) 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB0__A, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8353) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8354) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8355) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8356) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8357) 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB1__A, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8358) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8359) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8360) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8361) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8362) 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB2__A, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8363) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8364) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8365) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8366) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8367) 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB3__A, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8368) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8369) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8370) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8371) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8372) 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB4__A, 2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8373) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8374) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8375) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8376) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8377) 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB5__A, 2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8378) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8379) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8380) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8381) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8382) 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB6__A, 2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8383) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8384) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8385) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8386) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8387) 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB8__A, 2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8388) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8389) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8390) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8391) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8392) 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB9__A, 2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8393) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8394) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8395) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8396) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8397) 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB10__A, 2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8398) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8399) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8400) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8401) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8402) 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB12__A, 2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8403) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8404) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8405) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8406) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8407) 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB15__A, 3, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8408) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8409) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8410) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8411) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8412) 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB16__A, 3, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8413) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8414) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8415) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8416) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8417) 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB20__A, 4, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8418) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8419) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8420) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8421) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8422) 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB25__A, 4, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8423) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8424) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8425) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8426) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8427) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8428) 		rc = drxj_dap_write_reg16(dev_addr, IQM_FS_ADJ_SEL__A, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8429) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8430) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8431) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8432) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8433) 		rc = drxj_dap_write_reg16(dev_addr, IQM_RC_ADJ_SEL__A, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8434) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8435) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8436) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8437) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8438) 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_ADJ_SEL__A, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8439) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8440) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8441) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8442) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8443) 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_POW_MEAS_LEN__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8444) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8445) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8446) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8447) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8448) 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_GPIO__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8449) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8450) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8451) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8452) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8453) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8454) 		/* No more resets of the IQM, current standard correctly set =>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8455) 		   now AGCs can be configured. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8456) 		/* turn on IQMAF. It has to be in front of setAgc**() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8457) 		rc = set_iqm_af(demod, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8458) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8459) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8460) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8461) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8462) 		rc = adc_synchronization(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8463) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8464) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8465) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8466) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8467) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8468) 		rc = init_agc(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8469) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8470) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8471) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8472) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8473) 		rc = set_agc_if(demod, &(ext_attr->qam_if_agc_cfg), false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8474) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8475) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8476) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8477) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8478) 		rc = set_agc_rf(demod, &(ext_attr->qam_rf_agc_cfg), false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8479) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8480) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8481) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8482) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8483) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8484) 			/* TODO fix this, store a struct drxj_cfg_afe_gain structure in struct drxj_data instead
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8485) 			   of only the gain */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8486) 			struct drxj_cfg_afe_gain qam_pga_cfg = { DRX_STANDARD_ITU_B, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8487) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8488) 			qam_pga_cfg.gain = ext_attr->qam_pga_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8489) 			rc = ctrl_set_cfg_afe_gain(demod, &qam_pga_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8490) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8491) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8492) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8493) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8494) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8495) 		rc = ctrl_set_cfg_pre_saw(demod, &(ext_attr->qam_pre_saw_cfg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8496) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8497) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8498) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8499) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8500) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8501) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8502) 	if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8503) 		if (ext_attr->standard == DRX_STANDARD_ITU_A) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8504) 			rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_a_taps), ((u8 *)qam_a_taps), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8505) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8506) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8507) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8508) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8509) 			rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_a_taps), ((u8 *)qam_a_taps), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8510) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8511) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8512) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8513) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8514) 		} else if (ext_attr->standard == DRX_STANDARD_ITU_B) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8515) 			switch (channel->constellation) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8516) 			case DRX_CONSTELLATION_QAM64:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8517) 				rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_b64_taps), ((u8 *)qam_b64_taps), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8518) 				if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8519) 					pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8520) 					goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8521) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8522) 				rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_b64_taps), ((u8 *)qam_b64_taps), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8523) 				if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8524) 					pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8525) 					goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8526) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8527) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8528) 			case DRX_CONSTELLATION_QAM256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8529) 				rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_b256_taps), ((u8 *)qam_b256_taps), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8530) 				if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8531) 					pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8532) 					goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8533) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8534) 				rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_b256_taps), ((u8 *)qam_b256_taps), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8535) 				if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8536) 					pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8537) 					goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8538) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8539) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8540) 			default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8541) 				return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8542) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8543) 		} else if (ext_attr->standard == DRX_STANDARD_ITU_C) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8544) 			rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_c_taps), ((u8 *)qam_c_taps), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8545) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8546) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8547) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8548) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8549) 			rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_c_taps), ((u8 *)qam_c_taps), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8550) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8551) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8552) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8553) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8554) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8555) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8556) 		/* SETP 4: constellation specific setup */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8557) 		switch (channel->constellation) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8558) 		case DRX_CONSTELLATION_QAM16:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8559) 			rc = set_qam16(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8560) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8561) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8562) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8563) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8564) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8565) 		case DRX_CONSTELLATION_QAM32:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8566) 			rc = set_qam32(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8567) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8568) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8569) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8570) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8571) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8572) 		case DRX_CONSTELLATION_QAM64:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8573) 			rc = set_qam64(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8574) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8575) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8576) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8577) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8578) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8579) 		case DRX_CONSTELLATION_QAM128:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8580) 			rc = set_qam128(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8581) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8582) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8583) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8584) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8585) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8586) 		case DRX_CONSTELLATION_QAM256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8587) 			rc = set_qam256(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8588) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8589) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8590) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8591) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8592) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8593) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8594) 			return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8595) 		}		/* switch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8596) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8597) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8598) 	if ((op & QAM_SET_OP_ALL)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8599) 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE_SH__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8600) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8601) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8602) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8603) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8604) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8605) 		/* Mpeg output has to be in front of FEC active */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8606) 		rc = set_mpegtei_handling(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8607) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8608) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8609) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8610) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8611) 		rc = bit_reverse_mpeg_output(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8612) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8613) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8614) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8615) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8616) 		rc = set_mpeg_start_width(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8617) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8618) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8619) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8620) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8621) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8622) 			/* TODO: move to set_standard after hardware reset value problem is solved */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8623) 			/* Configure initial MPEG output */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8624) 			struct drx_cfg_mpeg_output cfg_mpeg_output;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8625) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8626) 			memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8627) 			cfg_mpeg_output.enable_mpeg_output = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8628) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8629) 			rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8630) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8631) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8632) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8633) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8634) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8635) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8636) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8637) 	if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8638) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8639) 		/* STEP 5: start QAM demodulator (starts FEC, QAM and IQM HW) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8640) 		cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8641) 		    SCU_RAM_COMMAND_CMD_DEMOD_START;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8642) 		cmd_scu.parameter_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8643) 		cmd_scu.result_len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8644) 		cmd_scu.parameter = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8645) 		cmd_scu.result = &cmd_result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8646) 		rc = scu_command(dev_addr, &cmd_scu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8647) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8648) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8649) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8650) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8651) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8652) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8653) 	rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_ACTIVE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8654) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8655) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8656) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8657) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8658) 	rc = drxj_dap_write_reg16(dev_addr, QAM_COMM_EXEC__A, QAM_COMM_EXEC_ACTIVE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8659) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8660) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8661) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8662) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8663) 	rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8664) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8665) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8666) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8667) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8668) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8669) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8670) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8671) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8672) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8673) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8674) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8675) static int ctrl_get_qam_sig_quality(struct drx_demod_instance *demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8676) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8677) static int qam_flip_spec(struct drx_demod_instance *demod, struct drx_channel *channel)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8678) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8679) 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8680) 	struct drxj_data *ext_attr = demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8681) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8682) 	u32 iqm_fs_rate_ofs = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8683) 	u32 iqm_fs_rate_lo = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8684) 	u16 qam_ctl_ena = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8685) 	u16 data = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8686) 	u16 equ_mode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8687) 	u16 fsm_state = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8688) 	int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8689) 	int ofsofs = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8690) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8691) 	/* Silence the controlling of lc, equ, and the acquisition state machine */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8692) 	rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_QAM_CTL_ENA__A, &qam_ctl_ena, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8693) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8694) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8695) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8696) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8697) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_CTL_ENA__A, qam_ctl_ena & ~(SCU_RAM_QAM_CTL_ENA_ACQ__M | SCU_RAM_QAM_CTL_ENA_EQU__M | SCU_RAM_QAM_CTL_ENA_LC__M), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8698) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8699) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8700) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8701) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8702) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8703) 	/* freeze the frequency control loop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8704) 	rc = drxj_dap_write_reg16(dev_addr, QAM_LC_CF__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8705) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8706) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8707) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8708) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8709) 	rc = drxj_dap_write_reg16(dev_addr, QAM_LC_CF1__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8710) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8711) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8712) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8713) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8714) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8715) 	rc = drxj_dap_atomic_read_reg32(dev_addr, IQM_FS_RATE_OFS_LO__A, &iqm_fs_rate_ofs, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8716) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8717) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8718) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8719) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8720) 	rc = drxj_dap_atomic_read_reg32(dev_addr, IQM_FS_RATE_LO__A, &iqm_fs_rate_lo, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8721) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8722) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8723) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8724) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8725) 	ofsofs = iqm_fs_rate_lo - iqm_fs_rate_ofs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8726) 	iqm_fs_rate_ofs = ~iqm_fs_rate_ofs + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8727) 	iqm_fs_rate_ofs -= 2 * ofsofs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8728) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8729) 	/* freeze dq/fq updating */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8730) 	rc = drxj_dap_read_reg16(dev_addr, QAM_DQ_MODE__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8731) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8732) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8733) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8734) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8735) 	data = (data & 0xfff9);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8736) 	rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_MODE__A, data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8737) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8738) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8739) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8740) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8741) 	rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_MODE__A, data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8742) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8743) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8744) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8745) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8746) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8747) 	/* lc_cp / _ci / _ca */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8748) 	rc = drxj_dap_write_reg16(dev_addr, QAM_LC_CI__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8749) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8750) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8751) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8752) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8753) 	rc = drxj_dap_write_reg16(dev_addr, QAM_LC_EP__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8754) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8755) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8756) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8757) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8758) 	rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_LA_FACTOR__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8759) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8760) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8761) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8762) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8763) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8764) 	/* flip the spec */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8765) 	rc = drxdap_fasi_write_reg32(dev_addr, IQM_FS_RATE_OFS_LO__A, iqm_fs_rate_ofs, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8766) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8767) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8768) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8769) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8770) 	ext_attr->iqm_fs_rate_ofs = iqm_fs_rate_ofs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8771) 	ext_attr->pos_image = (ext_attr->pos_image) ? false : true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8772) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8773) 	/* freeze dq/fq updating */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8774) 	rc = drxj_dap_read_reg16(dev_addr, QAM_DQ_MODE__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8775) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8776) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8777) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8778) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8779) 	equ_mode = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8780) 	data = (data & 0xfff9);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8781) 	rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_MODE__A, data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8782) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8783) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8784) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8785) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8786) 	rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_MODE__A, data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8787) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8788) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8789) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8790) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8791) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8792) 	for (i = 0; i < 28; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8793) 		rc = drxj_dap_read_reg16(dev_addr, QAM_DQ_TAP_IM_EL0__A + (2 * i), &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8794) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8795) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8796) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8797) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8798) 		rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_TAP_IM_EL0__A + (2 * i), -data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8799) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8800) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8801) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8802) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8803) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8804) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8805) 	for (i = 0; i < 24; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8806) 		rc = drxj_dap_read_reg16(dev_addr, QAM_FQ_TAP_IM_EL0__A + (2 * i), &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8807) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8808) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8809) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8810) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8811) 		rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_TAP_IM_EL0__A + (2 * i), -data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8812) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8813) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8814) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8815) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8816) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8817) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8818) 	data = equ_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8819) 	rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_MODE__A, data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8820) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8821) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8822) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8823) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8824) 	rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_MODE__A, data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8825) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8826) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8827) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8828) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8829) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8830) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_STATE_TGT__A, 4, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8831) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8832) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8833) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8834) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8835) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8836) 	i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8837) 	while ((fsm_state != 4) && (i++ < 100)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8838) 		rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_QAM_FSM_STATE__A, &fsm_state, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8839) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8840) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8841) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8842) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8843) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8844) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_CTL_ENA__A, (qam_ctl_ena | 0x0016), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8845) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8846) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8847) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8848) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8849) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8850) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8851) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8852) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8853) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8854) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8855) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8856) #define  NO_LOCK        0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8857) #define  DEMOD_LOCKED   0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8858) #define  SYNC_FLIPPED   0x2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8859) #define  SPEC_MIRRORED  0x4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8860) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8861) * \fn int qam64auto ()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8862) * \brief auto do sync pattern switching and mirroring.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8863) * \param demod:   instance of demod.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8864) * \param channel: pointer to channel data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8865) * \param tuner_freq_offset: tuner frequency offset.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8866) * \param lock_status: pointer to lock status.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8867) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8868) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8869) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8870) qam64auto(struct drx_demod_instance *demod,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8871) 	  struct drx_channel *channel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8872) 	  s32 tuner_freq_offset, enum drx_lock_status *lock_status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8873) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8874) 	struct drxj_data *ext_attr = demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8875) 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8876) 	struct drx39xxj_state *state = dev_addr->user_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8877) 	struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8878) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8879) 	u32 lck_state = NO_LOCK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8880) 	u32 start_time = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8881) 	u32 d_locked_time = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8882) 	u32 timeout_ofs = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8883) 	u16 data = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8884) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8885) 	/* external attributes for storing acquired channel constellation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8886) 	*lock_status = DRX_NOT_LOCKED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8887) 	start_time = jiffies_to_msecs(jiffies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8888) 	lck_state = NO_LOCK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8889) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8890) 		rc = ctrl_lock_status(demod, lock_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8891) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8892) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8893) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8894) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8895) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8896) 		switch (lck_state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8897) 		case NO_LOCK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8898) 			if (*lock_status == DRXJ_DEMOD_LOCK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8899) 				rc = ctrl_get_qam_sig_quality(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8900) 				if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8901) 					pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8902) 					goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8903) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8904) 				if (p->cnr.stat[0].svalue > 20800) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8905) 					lck_state = DEMOD_LOCKED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8906) 					/* some delay to see if fec_lock possible TODO find the right value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8907) 					timeout_ofs += DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME;	/* see something, waiting longer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8908) 					d_locked_time = jiffies_to_msecs(jiffies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8909) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8910) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8911) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8912) 		case DEMOD_LOCKED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8913) 			if ((*lock_status == DRXJ_DEMOD_LOCK) &&	/* still demod_lock in 150ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8914) 			    ((jiffies_to_msecs(jiffies) - d_locked_time) >
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8915) 			     DRXJ_QAM_FEC_LOCK_WAITTIME)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8916) 				rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8917) 				if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8918) 					pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8919) 					goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8920) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8921) 				rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, data | 0x1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8922) 				if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8923) 					pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8924) 					goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8925) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8926) 				lck_state = SYNC_FLIPPED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8927) 				msleep(10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8928) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8929) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8930) 		case SYNC_FLIPPED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8931) 			if (*lock_status == DRXJ_DEMOD_LOCK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8932) 				if (channel->mirror == DRX_MIRROR_AUTO) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8933) 					/* flip sync pattern back */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8934) 					rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8935) 					if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8936) 						pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8937) 						goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8938) 					}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8939) 					rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, data & 0xFFFE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8940) 					if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8941) 						pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8942) 						goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8943) 					}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8944) 					/* flip spectrum */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8945) 					ext_attr->mirror = DRX_MIRROR_YES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8946) 					rc = qam_flip_spec(demod, channel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8947) 					if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8948) 						pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8949) 						goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8950) 					}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8951) 					lck_state = SPEC_MIRRORED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8952) 					/* reset timer TODO: still need 500ms? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8953) 					start_time = d_locked_time =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8954) 					    jiffies_to_msecs(jiffies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8955) 					timeout_ofs = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8956) 				} else {	/* no need to wait lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8957) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8958) 					start_time =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8959) 					    jiffies_to_msecs(jiffies) -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8960) 					    DRXJ_QAM_MAX_WAITTIME - timeout_ofs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8961) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8962) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8963) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8964) 		case SPEC_MIRRORED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8965) 			if ((*lock_status == DRXJ_DEMOD_LOCK) &&	/* still demod_lock in 150ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8966) 			    ((jiffies_to_msecs(jiffies) - d_locked_time) >
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8967) 			     DRXJ_QAM_FEC_LOCK_WAITTIME)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8968) 				rc = ctrl_get_qam_sig_quality(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8969) 				if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8970) 					pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8971) 					goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8972) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8973) 				if (p->cnr.stat[0].svalue > 20800) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8974) 					rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8975) 					if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8976) 						pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8977) 						goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8978) 					}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8979) 					rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, data | 0x1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8980) 					if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8981) 						pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8982) 						goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8983) 					}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8984) 					/* no need to wait lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8985) 					start_time =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8986) 					    jiffies_to_msecs(jiffies) -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8987) 					    DRXJ_QAM_MAX_WAITTIME - timeout_ofs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8988) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8989) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8990) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8991) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8992) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8993) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8994) 		msleep(10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8995) 	} while
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8996) 	    ((*lock_status != DRX_LOCKED) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8997) 	     (*lock_status != DRX_NEVER_LOCK) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8998) 	     ((jiffies_to_msecs(jiffies) - start_time) <
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8999) 	      (DRXJ_QAM_MAX_WAITTIME + timeout_ofs))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9000) 	    );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9001) 	/* Returning control to application ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9002) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9003) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9004) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9005) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9006) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9007) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9008) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9009) * \fn int qam256auto ()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9010) * \brief auto do sync pattern switching and mirroring.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9011) * \param demod:   instance of demod.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9012) * \param channel: pointer to channel data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9013) * \param tuner_freq_offset: tuner frequency offset.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9014) * \param lock_status: pointer to lock status.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9015) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9016) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9017) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9018) qam256auto(struct drx_demod_instance *demod,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9019) 	   struct drx_channel *channel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9020) 	   s32 tuner_freq_offset, enum drx_lock_status *lock_status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9021) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9022) 	struct drxj_data *ext_attr = demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9023) 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9024) 	struct drx39xxj_state *state = dev_addr->user_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9025) 	struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9026) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9027) 	u32 lck_state = NO_LOCK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9028) 	u32 start_time = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9029) 	u32 d_locked_time = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9030) 	u32 timeout_ofs = DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9031) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9032) 	/* external attributes for storing acquired channel constellation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9033) 	*lock_status = DRX_NOT_LOCKED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9034) 	start_time = jiffies_to_msecs(jiffies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9035) 	lck_state = NO_LOCK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9036) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9037) 		rc = ctrl_lock_status(demod, lock_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9038) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9039) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9040) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9041) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9042) 		switch (lck_state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9043) 		case NO_LOCK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9044) 			if (*lock_status == DRXJ_DEMOD_LOCK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9045) 				rc = ctrl_get_qam_sig_quality(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9046) 				if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9047) 					pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9048) 					goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9049) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9050) 				if (p->cnr.stat[0].svalue > 26800) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9051) 					lck_state = DEMOD_LOCKED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9052) 					timeout_ofs += DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME;	/* see something, wait longer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9053) 					d_locked_time = jiffies_to_msecs(jiffies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9054) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9055) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9056) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9057) 		case DEMOD_LOCKED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9058) 			if (*lock_status == DRXJ_DEMOD_LOCK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9059) 				if ((channel->mirror == DRX_MIRROR_AUTO) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9060) 				    ((jiffies_to_msecs(jiffies) - d_locked_time) >
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9061) 				     DRXJ_QAM_FEC_LOCK_WAITTIME)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9062) 					ext_attr->mirror = DRX_MIRROR_YES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9063) 					rc = qam_flip_spec(demod, channel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9064) 					if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9065) 						pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9066) 						goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9067) 					}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9068) 					lck_state = SPEC_MIRRORED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9069) 					/* reset timer TODO: still need 300ms? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9070) 					start_time = jiffies_to_msecs(jiffies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9071) 					timeout_ofs = -DRXJ_QAM_MAX_WAITTIME / 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9072) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9073) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9074) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9075) 		case SPEC_MIRRORED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9076) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9077) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9078) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9079) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9080) 		msleep(10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9081) 	} while
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9082) 	    ((*lock_status < DRX_LOCKED) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9083) 	     (*lock_status != DRX_NEVER_LOCK) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9084) 	     ((jiffies_to_msecs(jiffies) - start_time) <
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9085) 	      (DRXJ_QAM_MAX_WAITTIME + timeout_ofs)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9086) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9087) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9088) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9089) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9090) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9091) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9092) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9093) * \fn int set_qam_channel ()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9094) * \brief Set QAM channel according to the requested constellation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9095) * \param demod:   instance of demod.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9096) * \param channel: pointer to channel data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9097) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9098) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9099) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9100) set_qam_channel(struct drx_demod_instance *demod,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9101) 	       struct drx_channel *channel, s32 tuner_freq_offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9102) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9103) 	struct drxj_data *ext_attr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9104) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9105) 	enum drx_lock_status lock_status = DRX_NOT_LOCKED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9106) 	bool auto_flag = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9108) 	/* external attributes for storing acquired channel constellation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9109) 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9110) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9111) 	/* set QAM channel constellation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9112) 	switch (channel->constellation) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9113) 	case DRX_CONSTELLATION_QAM16:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9114) 	case DRX_CONSTELLATION_QAM32:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9115) 	case DRX_CONSTELLATION_QAM128:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9116) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9117) 	case DRX_CONSTELLATION_QAM64:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9118) 	case DRX_CONSTELLATION_QAM256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9119) 		if (ext_attr->standard != DRX_STANDARD_ITU_B)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9120) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9121) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9122) 		ext_attr->constellation = channel->constellation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9123) 		if (channel->mirror == DRX_MIRROR_AUTO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9124) 			ext_attr->mirror = DRX_MIRROR_NO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9125) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9126) 			ext_attr->mirror = channel->mirror;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9127) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9128) 		rc = set_qam(demod, channel, tuner_freq_offset, QAM_SET_OP_ALL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9129) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9130) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9131) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9132) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9133) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9134) 		if (channel->constellation == DRX_CONSTELLATION_QAM64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9135) 			rc = qam64auto(demod, channel, tuner_freq_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9136) 				       &lock_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9137) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9138) 			rc = qam256auto(demod, channel, tuner_freq_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9139) 					&lock_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9140) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9141) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9142) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9143) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9144) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9145) 	case DRX_CONSTELLATION_AUTO:	/* for channel scan */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9146) 		if (ext_attr->standard == DRX_STANDARD_ITU_B) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9147) 			u16 qam_ctl_ena = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9148) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9149) 			auto_flag = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9150) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9151) 			/* try to lock default QAM constellation: QAM256 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9152) 			channel->constellation = DRX_CONSTELLATION_QAM256;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9153) 			ext_attr->constellation = DRX_CONSTELLATION_QAM256;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9154) 			if (channel->mirror == DRX_MIRROR_AUTO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9155) 				ext_attr->mirror = DRX_MIRROR_NO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9156) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9157) 				ext_attr->mirror = channel->mirror;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9158) 			rc = set_qam(demod, channel, tuner_freq_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9159) 				     QAM_SET_OP_ALL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9160) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9161) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9162) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9163) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9164) 			rc = qam256auto(demod, channel, tuner_freq_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9165) 					&lock_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9166) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9167) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9168) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9169) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9170) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9171) 			if (lock_status >= DRX_LOCKED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9172) 				channel->constellation = DRX_CONSTELLATION_AUTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9173) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9174) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9175) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9176) 			/* QAM254 not locked. Try QAM64 constellation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9177) 			channel->constellation = DRX_CONSTELLATION_QAM64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9178) 			ext_attr->constellation = DRX_CONSTELLATION_QAM64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9179) 			if (channel->mirror == DRX_MIRROR_AUTO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9180) 				ext_attr->mirror = DRX_MIRROR_NO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9181) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9182) 				ext_attr->mirror = channel->mirror;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9183) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9184) 			rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9185) 						     SCU_RAM_QAM_CTL_ENA__A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9186) 						     &qam_ctl_ena, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9187) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9188) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9189) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9190) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9191) 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9192) 						      SCU_RAM_QAM_CTL_ENA__A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9193) 						      qam_ctl_ena & ~SCU_RAM_QAM_CTL_ENA_ACQ__M, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9194) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9195) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9196) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9197) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9198) 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9199) 						      SCU_RAM_QAM_FSM_STATE_TGT__A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9200) 						      0x2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9201) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9202) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9203) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9204) 			}	/* force to rate hunting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9205) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9206) 			rc = set_qam(demod, channel, tuner_freq_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9207) 				     QAM_SET_OP_CONSTELLATION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9208) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9209) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9210) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9211) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9212) 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9213) 						      SCU_RAM_QAM_CTL_ENA__A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9214) 						      qam_ctl_ena, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9215) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9216) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9217) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9218) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9219) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9220) 			rc = qam64auto(demod, channel, tuner_freq_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9221) 				       &lock_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9222) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9223) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9224) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9225) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9226) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9227) 			channel->constellation = DRX_CONSTELLATION_AUTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9228) 		} else if (ext_attr->standard == DRX_STANDARD_ITU_C) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9229) 			u16 qam_ctl_ena = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9230) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9231) 			channel->constellation = DRX_CONSTELLATION_QAM64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9232) 			ext_attr->constellation = DRX_CONSTELLATION_QAM64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9233) 			auto_flag = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9234) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9235) 			if (channel->mirror == DRX_MIRROR_AUTO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9236) 				ext_attr->mirror = DRX_MIRROR_NO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9237) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9238) 				ext_attr->mirror = channel->mirror;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9239) 			rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9240) 						     SCU_RAM_QAM_CTL_ENA__A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9241) 						     &qam_ctl_ena, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9242) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9243) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9244) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9245) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9246) 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9247) 						      SCU_RAM_QAM_CTL_ENA__A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9248) 						      qam_ctl_ena & ~SCU_RAM_QAM_CTL_ENA_ACQ__M, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9249) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9250) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9251) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9252) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9253) 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9254) 						      SCU_RAM_QAM_FSM_STATE_TGT__A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9255) 						      0x2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9256) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9257) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9258) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9259) 			}	/* force to rate hunting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9260) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9261) 			rc = set_qam(demod, channel, tuner_freq_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9262) 				     QAM_SET_OP_CONSTELLATION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9263) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9264) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9265) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9266) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9267) 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9268) 						      SCU_RAM_QAM_CTL_ENA__A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9269) 						      qam_ctl_ena, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9270) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9271) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9272) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9273) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9274) 			rc = qam64auto(demod, channel, tuner_freq_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9275) 				       &lock_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9276) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9277) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9278) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9279) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9280) 			channel->constellation = DRX_CONSTELLATION_AUTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9281) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9282) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9283) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9284) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9285) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9286) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9287) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9288) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9289) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9290) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9291) 	/* restore starting value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9292) 	if (auto_flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9293) 		channel->constellation = DRX_CONSTELLATION_AUTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9294) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9295) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9296) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9297) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9298) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9299) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9300) * \fn static short get_qamrs_err_count(struct i2c_device_addr *dev_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9301) * \brief Get RS error count in QAM mode (used for post RS BER calculation)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9302) * \return Error code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9303) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9304) * precondition: measurement period & measurement prescale must be set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9305) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9306) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9307) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9308) get_qamrs_err_count(struct i2c_device_addr *dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9309) 		    struct drxjrs_errors *rs_errors)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9310) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9311) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9312) 	u16 nr_bit_errors = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9313) 	    nr_symbol_errors = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9314) 	    nr_packet_errors = 0, nr_failures = 0, nr_snc_par_fail_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9315) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9316) 	/* check arguments */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9317) 	if (dev_addr == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9318) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9319) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9320) 	/* all reported errors are received in the  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9321) 	/* most recently finished measurement period */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9322) 	/*   no of pre RS bit errors */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9323) 	rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_BIT_ERRORS__A, &nr_bit_errors, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9324) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9325) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9326) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9327) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9328) 	/*   no of symbol errors      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9329) 	rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_SYMBOL_ERRORS__A, &nr_symbol_errors, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9330) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9331) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9332) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9333) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9334) 	/*   no of packet errors      */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9335) 	rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_PACKET_ERRORS__A, &nr_packet_errors, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9336) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9337) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9338) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9339) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9340) 	/*   no of failures to decode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9341) 	rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_FAILURES__A, &nr_failures, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9342) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9343) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9344) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9345) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9346) 	/*   no of post RS bit erros  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9347) 	rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_FAIL_COUNT__A, &nr_snc_par_fail_count, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9348) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9349) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9350) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9351) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9352) 	/* TODO: NOTE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9353) 	/* These register values are fetched in non-atomic fashion           */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9354) 	/* It is possible that the read values contain unrelated information */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9355) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9356) 	rs_errors->nr_bit_errors = nr_bit_errors & FEC_RS_NR_BIT_ERRORS__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9357) 	rs_errors->nr_symbol_errors = nr_symbol_errors & FEC_RS_NR_SYMBOL_ERRORS__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9358) 	rs_errors->nr_packet_errors = nr_packet_errors & FEC_RS_NR_PACKET_ERRORS__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9359) 	rs_errors->nr_failures = nr_failures & FEC_RS_NR_FAILURES__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9360) 	rs_errors->nr_snc_par_fail_count =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9361) 	    nr_snc_par_fail_count & FEC_OC_SNC_FAIL_COUNT__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9362) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9363) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9364) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9365) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9366) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9367) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9368) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9369) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9370) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9371)  * \fn int get_sig_strength()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9372)  * \brief Retrieve signal strength for VSB and QAM.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9373)  * \param demod Pointer to demod instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9374)  * \param u16-t Pointer to signal strength data; range 0, .. , 100.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9375)  * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9376)  * \retval 0 sig_strength contains valid data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9377)  * \retval -EINVAL sig_strength is NULL.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9378)  * \retval -EIO Erroneous data, sig_strength contains invalid data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9379)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9380) #define DRXJ_AGC_TOP    0x2800
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9381) #define DRXJ_AGC_SNS    0x1600
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9382) #define DRXJ_RFAGC_MAX  0x3fff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9383) #define DRXJ_RFAGC_MIN  0x800
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9384) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9385) static int get_sig_strength(struct drx_demod_instance *demod, u16 *sig_strength)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9386) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9387) 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9388) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9389) 	u16 rf_gain = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9390) 	u16 if_gain = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9391) 	u16 if_agc_sns = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9392) 	u16 if_agc_top = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9393) 	u16 rf_agc_max = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9394) 	u16 rf_agc_min = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9395) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9396) 	rc = drxj_dap_read_reg16(dev_addr, IQM_AF_AGC_IF__A, &if_gain, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9397) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9398) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9399) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9400) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9401) 	if_gain &= IQM_AF_AGC_IF__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9402) 	rc = drxj_dap_read_reg16(dev_addr, IQM_AF_AGC_RF__A, &rf_gain, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9403) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9404) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9405) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9406) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9407) 	rf_gain &= IQM_AF_AGC_RF__M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9408) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9409) 	if_agc_sns = DRXJ_AGC_SNS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9410) 	if_agc_top = DRXJ_AGC_TOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9411) 	rf_agc_max = DRXJ_RFAGC_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9412) 	rf_agc_min = DRXJ_RFAGC_MIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9413) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9414) 	if (if_gain > if_agc_top) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9415) 		if (rf_gain > rf_agc_max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9416) 			*sig_strength = 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9417) 		else if (rf_gain > rf_agc_min) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9418) 			if (rf_agc_max == rf_agc_min) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9419) 				pr_err("error: rf_agc_max == rf_agc_min\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9420) 				return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9421) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9422) 			*sig_strength =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9423) 			75 + 25 * (rf_gain - rf_agc_min) / (rf_agc_max -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9424) 								rf_agc_min);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9425) 		} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9426) 			*sig_strength = 75;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9427) 	} else if (if_gain > if_agc_sns) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9428) 		if (if_agc_top == if_agc_sns) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9429) 			pr_err("error: if_agc_top == if_agc_sns\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9430) 			return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9431) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9432) 		*sig_strength =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9433) 		20 + 55 * (if_gain - if_agc_sns) / (if_agc_top - if_agc_sns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9434) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9435) 		if (!if_agc_sns) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9436) 			pr_err("error: if_agc_sns is zero!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9437) 			return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9438) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9439) 		*sig_strength = (20 * if_gain / if_agc_sns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9440) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9441) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9442) 	if (*sig_strength <= 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9443) 		*sig_strength = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9444) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9445) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9446) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9447) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9448) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9449) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9450) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9451) * \fn int ctrl_get_qam_sig_quality()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9452) * \brief Retrieve QAM signal quality from device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9453) * \param devmod Pointer to demodulator instance.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9454) * \param sig_quality Pointer to signal quality data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9455) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9456) * \retval 0 sig_quality contains valid data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9457) * \retval -EINVAL sig_quality is NULL.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9458) * \retval -EIO Erroneous data, sig_quality contains invalid data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9459) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9460) *  Pre-condition: Device must be started and in lock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9461) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9462) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9463) ctrl_get_qam_sig_quality(struct drx_demod_instance *demod)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9464) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9465) 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9466) 	struct drxj_data *ext_attr = demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9467) 	struct drx39xxj_state *state = dev_addr->user_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9468) 	struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9469) 	struct drxjrs_errors measuredrs_errors = { 0, 0, 0, 0, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9470) 	enum drx_modulation constellation = ext_attr->constellation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9471) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9472) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9473) 	u32 pre_bit_err_rs = 0;	/* pre RedSolomon Bit Error Rate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9474) 	u32 post_bit_err_rs = 0;	/* post RedSolomon Bit Error Rate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9475) 	u32 pkt_errs = 0;	/* no of packet errors in RS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9476) 	u16 qam_sl_err_power = 0;	/* accumulated error between raw and sliced symbols */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9477) 	u16 qsym_err_vd = 0;	/* quadrature symbol errors in QAM_VD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9478) 	u16 fec_oc_period = 0;	/* SNC sync failure measurement period */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9479) 	u16 fec_rs_prescale = 0;	/* ReedSolomon Measurement Prescale */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9480) 	u16 fec_rs_period = 0;	/* Value for corresponding I2C register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9481) 	/* calculation constants */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9482) 	u32 rs_bit_cnt = 0;	/* RedSolomon Bit Count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9483) 	u32 qam_sl_sig_power = 0;	/* used for MER, depends of QAM constellation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9484) 	/* intermediate results */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9485) 	u32 e = 0;		/* exponent value used for QAM BER/SER */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9486) 	u32 m = 0;		/* mantisa value used for QAM BER/SER */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9487) 	u32 ber_cnt = 0;	/* BER count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9488) 	/* signal quality info */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9489) 	u32 qam_sl_mer = 0;	/* QAM MER */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9490) 	u32 qam_pre_rs_ber = 0;	/* Pre RedSolomon BER */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9491) 	u32 qam_post_rs_ber = 0;	/* Post RedSolomon BER */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9492) 	u32 qam_vd_ser = 0;	/* ViterbiDecoder SER */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9493) 	u16 qam_vd_prescale = 0;	/* Viterbi Measurement Prescale */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9494) 	u16 qam_vd_period = 0;	/* Viterbi Measurement period */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9495) 	u32 vd_bit_cnt = 0;	/* ViterbiDecoder Bit Count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9496) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9497) 	p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9498) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9499) 	/* read the physical registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9500) 	/*   Get the RS error data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9501) 	rc = get_qamrs_err_count(dev_addr, &measuredrs_errors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9502) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9503) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9504) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9505) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9506) 	/* get the register value needed for MER */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9507) 	rc = drxj_dap_read_reg16(dev_addr, QAM_SL_ERR_POWER__A, &qam_sl_err_power, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9508) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9509) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9510) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9511) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9512) 	/* get the register value needed for post RS BER */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9513) 	rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_FAIL_PERIOD__A, &fec_oc_period, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9514) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9515) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9516) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9517) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9518) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9519) 	/* get constants needed for signal quality calculation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9520) 	fec_rs_period = ext_attr->fec_rs_period;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9521) 	fec_rs_prescale = ext_attr->fec_rs_prescale;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9522) 	rs_bit_cnt = fec_rs_period * fec_rs_prescale * ext_attr->fec_rs_plen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9523) 	qam_vd_period = ext_attr->qam_vd_period;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9524) 	qam_vd_prescale = ext_attr->qam_vd_prescale;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9525) 	vd_bit_cnt = qam_vd_period * qam_vd_prescale * ext_attr->fec_vd_plen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9526) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9527) 	/* DRXJ_QAM_SL_SIG_POWER_QAMxxx  * 4     */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9528) 	switch (constellation) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9529) 	case DRX_CONSTELLATION_QAM16:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9530) 		qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM16 << 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9531) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9532) 	case DRX_CONSTELLATION_QAM32:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9533) 		qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM32 << 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9534) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9535) 	case DRX_CONSTELLATION_QAM64:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9536) 		qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM64 << 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9537) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9538) 	case DRX_CONSTELLATION_QAM128:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9539) 		qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM128 << 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9540) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9541) 	case DRX_CONSTELLATION_QAM256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9542) 		qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM256 << 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9543) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9544) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9545) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9546) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9547) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9548) 	/* ------------------------------ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9549) 	/* MER Calculation                */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9550) 	/* ------------------------------ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9551) 	/* MER is good if it is above 27.5 for QAM256 or 21.5 for QAM64 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9552) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9553) 	/* 10.0*log10(qam_sl_sig_power * 4.0 / qam_sl_err_power); */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9554) 	if (qam_sl_err_power == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9555) 		qam_sl_mer = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9556) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9557) 		qam_sl_mer = log1_times100(qam_sl_sig_power) - log1_times100((u32)qam_sl_err_power);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9558) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9559) 	/* ----------------------------------------- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9560) 	/* Pre Viterbi Symbol Error Rate Calculation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9561) 	/* ----------------------------------------- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9562) 	/* pre viterbi SER is good if it is below 0.025 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9563) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9564) 	/* get the register value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9565) 	/*   no of quadrature symbol errors */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9566) 	rc = drxj_dap_read_reg16(dev_addr, QAM_VD_NR_QSYM_ERRORS__A, &qsym_err_vd, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9567) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9568) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9569) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9570) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9571) 	/* Extract the Exponent and the Mantisa  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9572) 	/* of number of quadrature symbol errors */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9573) 	e = (qsym_err_vd & QAM_VD_NR_QSYM_ERRORS_EXP__M) >>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9574) 	    QAM_VD_NR_QSYM_ERRORS_EXP__B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9575) 	m = (qsym_err_vd & QAM_VD_NR_SYMBOL_ERRORS_FIXED_MANT__M) >>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9576) 	    QAM_VD_NR_SYMBOL_ERRORS_FIXED_MANT__B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9577) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9578) 	if ((m << e) >> 3 > 549752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9579) 		qam_vd_ser = 500000 * vd_bit_cnt * ((e > 2) ? 1 : 8) / 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9580) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9581) 		qam_vd_ser = m << ((e > 2) ? (e - 3) : e);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9582) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9583) 	/* --------------------------------------- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9584) 	/* pre and post RedSolomon BER Calculation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9585) 	/* --------------------------------------- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9586) 	/* pre RS BER is good if it is below 3.5e-4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9587) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9588) 	/* get the register values */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9589) 	pre_bit_err_rs = (u32) measuredrs_errors.nr_bit_errors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9590) 	pkt_errs = post_bit_err_rs = (u32) measuredrs_errors.nr_snc_par_fail_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9591) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9592) 	/* Extract the Exponent and the Mantisa of the */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9593) 	/* pre Reed-Solomon bit error count            */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9594) 	e = (pre_bit_err_rs & FEC_RS_NR_BIT_ERRORS_EXP__M) >>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9595) 	    FEC_RS_NR_BIT_ERRORS_EXP__B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9596) 	m = (pre_bit_err_rs & FEC_RS_NR_BIT_ERRORS_FIXED_MANT__M) >>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9597) 	    FEC_RS_NR_BIT_ERRORS_FIXED_MANT__B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9598) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9599) 	ber_cnt = m << e;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9600) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9601) 	/*qam_pre_rs_ber = frac_times1e6( ber_cnt, rs_bit_cnt ); */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9602) 	if (m > (rs_bit_cnt >> (e + 1)) || (rs_bit_cnt >> e) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9603) 		qam_pre_rs_ber = 500000 * rs_bit_cnt >> e;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9604) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9605) 		qam_pre_rs_ber = ber_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9606) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9607) 	/* post RS BER = 1000000* (11.17 * FEC_OC_SNC_FAIL_COUNT__A) /  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9608) 	/*               (1504.0 * FEC_OC_SNC_FAIL_PERIOD__A)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9609) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9610) 	   => c = (1000000*100*11.17)/1504 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9611) 	   post RS BER = (( c* FEC_OC_SNC_FAIL_COUNT__A) /
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9612) 	   (100 * FEC_OC_SNC_FAIL_PERIOD__A)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9613) 	   *100 and /100 is for more precision.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9614) 	   => (20 bits * 12 bits) /(16 bits * 7 bits)  => safe in 32 bits computation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9615) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9616) 	   Precision errors still possible.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9617) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9618) 	if (!fec_oc_period) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9619) 		qam_post_rs_ber = 0xFFFFFFFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9620) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9621) 		e = post_bit_err_rs * 742686;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9622) 		m = fec_oc_period * 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9623) 		qam_post_rs_ber = e / m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9624) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9625) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9626) 	/* fill signal quality data structure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9627) 	p->pre_bit_count.stat[0].scale = FE_SCALE_COUNTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9628) 	p->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9629) 	p->pre_bit_error.stat[0].scale = FE_SCALE_COUNTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9630) 	p->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9631) 	p->block_error.stat[0].scale = FE_SCALE_COUNTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9632) 	p->cnr.stat[0].scale = FE_SCALE_DECIBEL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9633) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9634) 	p->cnr.stat[0].svalue = ((u16) qam_sl_mer) * 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9635) 	if (ext_attr->standard == DRX_STANDARD_ITU_B) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9636) 		p->pre_bit_error.stat[0].uvalue += qam_vd_ser;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9637) 		p->pre_bit_count.stat[0].uvalue += vd_bit_cnt * ((e > 2) ? 1 : 8) / 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9638) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9639) 		p->pre_bit_error.stat[0].uvalue += qam_pre_rs_ber;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9640) 		p->pre_bit_count.stat[0].uvalue += rs_bit_cnt >> e;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9641) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9642) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9643) 	p->post_bit_error.stat[0].uvalue += qam_post_rs_ber;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9644) 	p->post_bit_count.stat[0].uvalue += rs_bit_cnt >> e;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9645) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9646) 	p->block_error.stat[0].uvalue += pkt_errs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9647) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9648) #ifdef DRXJ_SIGNAL_ACCUM_ERR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9649) 	rc = get_acc_pkt_err(demod, &sig_quality->packet_error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9650) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9651) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9652) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9653) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9654) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9655) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9656) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9657) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9658) 	p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9659) 	p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9660) 	p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9661) 	p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9662) 	p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9663) 	p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9664) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9665) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9666) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9667) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9668) #endif /* #ifndef DRXJ_VSB_ONLY */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9669) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9670) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9671) /*==                     END QAM DATAPATH FUNCTIONS                         ==*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9672) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9673) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9674) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9675) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9676) /*==                       ATV DATAPATH FUNCTIONS                           ==*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9677) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9678) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9679) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9680) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9681)    Implementation notes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9682) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9683)    NTSC/FM AGCs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9684) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9685)       Four AGCs are used for NTSC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9686)       (1) RF (used to attenuate the input signal in case of to much power)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9687)       (2) IF (used to attenuate the input signal in case of to much power)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9688)       (3) Video AGC (used to amplify the output signal in case input to low)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9689)       (4) SIF AGC (used to amplify the output signal in case input to low)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9690) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9691)       Video AGC is coupled to RF and IF. SIF AGC is not coupled. It is assumed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9692)       that the coupling between Video AGC and the RF and IF AGCs also works in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9693)       favor of the SIF AGC.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9694) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9695)       Three AGCs are used for FM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9696)       (1) RF (used to attenuate the input signal in case of to much power)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9697)       (2) IF (used to attenuate the input signal in case of to much power)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9698)       (3) SIF AGC (used to amplify the output signal in case input to low)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9699) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9700)       The SIF AGC is now coupled to the RF/IF AGCs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9701)       The SIF AGC is needed for both SIF output and the internal SIF signal to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9702)       the AUD block.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9703) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9704)       RF and IF AGCs DACs are part of AFE, Video and SIF AGC DACs are part of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9705)       the ATV block. The AGC control algorithms are all implemented in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9706)       microcode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9707) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9708)    ATV SETTINGS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9709) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9710)       (Shadow settings will not be used for now, they will be implemented
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9711)        later on because of the schedule)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9712) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9713)       Several HW/SCU "settings" can be used for ATV. The standard selection
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9714)       will reset most of these settings. To avoid that the end user application
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9715)       has to perform these settings each time the ATV or FM standards is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9716)       selected the driver will shadow these settings. This enables the end user
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9717)       to perform the settings only once after a drx_open(). The driver must
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9718)       write the shadow settings to HW/SCU in case:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9719) 	 ( setstandard FM/ATV) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9720) 	 ( settings have changed && FM/ATV standard is active)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9721)       The shadow settings will be stored in the device specific data container.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9722)       A set of flags will be defined to flag changes in shadow settings.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9723)       A routine will be implemented to write all changed shadow settings to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9724)       HW/SCU.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9725) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9726)       The "settings" will consist of: AGC settings, filter settings etc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9727) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9728)       Disadvantage of use of shadow settings:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9729)       Direct changes in HW/SCU registers will not be reflected in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9730)       shadow settings and these changes will be overwritten during a next
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9731)       update. This can happen during evaluation. This will not be a problem
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9732)       for normal customer usage.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9733) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9734) /* -------------------------------------------------------------------------- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9735) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9736) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9737) * \fn int power_down_atv ()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9738) * \brief Power down ATV.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9739) * \param demod instance of demodulator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9740) * \param standard either NTSC or FM (sub strandard for ATV )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9741) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9742) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9743) *  Stops and thus resets ATV and IQM block
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9744) *  SIF and CVBS ADC are powered down
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9745) *  Calls audio power down
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9746) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9747) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9748) power_down_atv(struct drx_demod_instance *demod, enum drx_standard standard, bool primary)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9749) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9750) 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9751) 	struct drxjscu_cmd cmd_scu = { /* command      */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9752) 		/* parameter_len */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9753) 		/* result_len    */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9754) 		/* *parameter   */ NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9755) 		/* *result      */ NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9756) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9757) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9758) 	u16 cmd_result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9759) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9760) 	/* ATV NTSC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9761) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9762) 	/* Stop ATV SCU (will reset ATV and IQM hardware */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9763) 	cmd_scu.command = SCU_RAM_COMMAND_STANDARD_ATV |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9764) 	    SCU_RAM_COMMAND_CMD_DEMOD_STOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9765) 	cmd_scu.parameter_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9766) 	cmd_scu.result_len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9767) 	cmd_scu.parameter = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9768) 	cmd_scu.result = &cmd_result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9769) 	rc = scu_command(dev_addr, &cmd_scu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9770) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9771) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9772) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9773) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9774) 	/* Disable ATV outputs (ATV reset enables CVBS, undo this) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9775) 	rc = drxj_dap_write_reg16(dev_addr, ATV_TOP_STDBY__A, (ATV_TOP_STDBY_SIF_STDBY_STANDBY & (~ATV_TOP_STDBY_CVBS_STDBY_A2_ACTIVE)), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9776) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9777) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9778) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9779) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9780) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9781) 	rc = drxj_dap_write_reg16(dev_addr, ATV_COMM_EXEC__A, ATV_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9782) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9783) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9784) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9785) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9786) 	if (primary) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9787) 		rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9788) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9789) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9790) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9791) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9792) 		rc = set_iqm_af(demod, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9793) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9794) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9795) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9796) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9797) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9798) 		rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9799) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9800) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9801) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9802) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9803) 		rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9804) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9805) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9806) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9807) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9808) 		rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9809) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9810) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9811) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9812) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9813) 		rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9814) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9815) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9816) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9817) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9818) 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9819) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9820) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9821) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9822) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9823) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9824) 	rc = power_down_aud(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9825) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9826) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9827) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9828) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9829) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9830) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9831) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9832) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9833) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9834) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9835) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9836) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9837) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9838) * \brief Power up AUD.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9839) * \param demod instance of demodulator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9840) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9841) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9842) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9843) static int power_down_aud(struct drx_demod_instance *demod)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9844) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9845) 	struct i2c_device_addr *dev_addr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9846) 	struct drxj_data *ext_attr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9847) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9848) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9849) 	dev_addr = (struct i2c_device_addr *)demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9850) 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9851) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9852) 	rc = drxj_dap_write_reg16(dev_addr, AUD_COMM_EXEC__A, AUD_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9853) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9854) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9855) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9856) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9857) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9858) 	ext_attr->aud_data.audio_is_active = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9859) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9860) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9861) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9862) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9863) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9864) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9865) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9866) * \fn int set_orx_nsu_aox()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9867) * \brief Configure OrxNsuAox for OOB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9868) * \param demod instance of demodulator.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9869) * \param active
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9870) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9871) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9872) static int set_orx_nsu_aox(struct drx_demod_instance *demod, bool active)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9873) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9874) 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9875) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9876) 	u16 data = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9877) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9878) 	/* Configure NSU_AOX */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9879) 	rc = drxj_dap_read_reg16(dev_addr, ORX_NSU_AOX_STDBY_W__A, &data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9880) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9881) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9882) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9883) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9884) 	if (!active)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9885) 		data &= ((~ORX_NSU_AOX_STDBY_W_STDBYADC_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYAMP_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYBIAS_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYPLL_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYPD_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYTAGC_IF_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYTAGC_RF_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYFLT_A2_ON));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9886) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9887) 		data |= (ORX_NSU_AOX_STDBY_W_STDBYADC_A2_ON | ORX_NSU_AOX_STDBY_W_STDBYAMP_A2_ON | ORX_NSU_AOX_STDBY_W_STDBYBIAS_A2_ON | ORX_NSU_AOX_STDBY_W_STDBYPLL_A2_ON | ORX_NSU_AOX_STDBY_W_STDBYPD_A2_ON | ORX_NSU_AOX_STDBY_W_STDBYTAGC_IF_A2_ON | ORX_NSU_AOX_STDBY_W_STDBYTAGC_RF_A2_ON | ORX_NSU_AOX_STDBY_W_STDBYFLT_A2_ON);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9888) 	rc = drxj_dap_write_reg16(dev_addr, ORX_NSU_AOX_STDBY_W__A, data, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9889) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9890) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9891) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9892) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9893) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9894) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9895) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9896) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9897) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9898) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9899) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9900) * \fn int ctrl_set_oob()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9901) * \brief Set OOB channel to be used.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9902) * \param demod instance of demodulator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9903) * \param oob_param OOB parameters for channel setting.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9904) * \frequency should be in KHz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9905) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9906) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9907) * Accepts  only. Returns error otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9908) * Demapper value is written after scu_command START
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9909) * because START command causes COMM_EXEC transition
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9910) * from 0 to 1 which causes all registers to be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9911) * overwritten with initial value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9912) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9913) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9914) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9915) /* Nyquist filter impulse response */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9916) #define IMPULSE_COSINE_ALPHA_0_3    {-3, -4, -1, 6, 10, 7, -5, -20, -25, -10, 29, 79, 123, 140}	/*sqrt raised-cosine filter with alpha=0.3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9917) #define IMPULSE_COSINE_ALPHA_0_5    { 2, 0, -2, -2, 2, 5, 2, -10, -20, -14, 20, 74, 125, 145}	/*sqrt raised-cosine filter with alpha=0.5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9918) #define IMPULSE_COSINE_ALPHA_RO_0_5 { 0, 0, 1, 2, 3, 0, -7, -15, -16,  0, 34, 77, 114, 128}	/*full raised-cosine filter with alpha=0.5 (receiver only) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9919) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9920) /* Coefficients for the nyquist filter (total: 27 taps) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9921) #define NYQFILTERLEN 27
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9922) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9923) static int ctrl_set_oob(struct drx_demod_instance *demod, struct drxoob *oob_param)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9924) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9925) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9926) 	s32 freq = 0;	/* KHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9927) 	struct i2c_device_addr *dev_addr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9928) 	struct drxj_data *ext_attr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9929) 	u16 i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9930) 	bool mirror_freq_spect_oob = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9931) 	u16 trk_filter_value = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9932) 	struct drxjscu_cmd scu_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9933) 	u16 set_param_parameters[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9934) 	u16 cmd_result[2] = { 0, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9935) 	s16 nyquist_coeffs[4][(NYQFILTERLEN + 1) / 2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9936) 		IMPULSE_COSINE_ALPHA_0_3,	/* Target Mode 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9937) 		IMPULSE_COSINE_ALPHA_0_3,	/* Target Mode 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9938) 		IMPULSE_COSINE_ALPHA_0_5,	/* Target Mode 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9939) 		IMPULSE_COSINE_ALPHA_RO_0_5	/* Target Mode 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9940) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9941) 	u8 mode_val[4] = { 2, 2, 0, 1 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9942) 	u8 pfi_coeffs[4][6] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9943) 		{DRXJ_16TO8(-92), DRXJ_16TO8(-108), DRXJ_16TO8(100)},	/* TARGET_MODE = 0:     PFI_A = -23/32; PFI_B = -54/32;  PFI_C = 25/32; fg = 0.5 MHz (Att=26dB) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9944) 		{DRXJ_16TO8(-64), DRXJ_16TO8(-80), DRXJ_16TO8(80)},	/* TARGET_MODE = 1:     PFI_A = -16/32; PFI_B = -40/32;  PFI_C = 20/32; fg = 1.0 MHz (Att=28dB) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9945) 		{DRXJ_16TO8(-80), DRXJ_16TO8(-98), DRXJ_16TO8(92)},	/* TARGET_MODE = 2, 3:  PFI_A = -20/32; PFI_B = -49/32;  PFI_C = 23/32; fg = 0.8 MHz (Att=25dB) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9946) 		{DRXJ_16TO8(-80), DRXJ_16TO8(-98), DRXJ_16TO8(92)}	/* TARGET_MODE = 2, 3:  PFI_A = -20/32; PFI_B = -49/32;  PFI_C = 23/32; fg = 0.8 MHz (Att=25dB) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9947) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9948) 	u16 mode_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9949) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9950) 	dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9951) 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9952) 	mirror_freq_spect_oob = ext_attr->mirror_freq_spect_oob;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9953) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9954) 	/* Check parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9955) 	if (oob_param == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9956) 		/* power off oob module  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9957) 		scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9958) 		    | SCU_RAM_COMMAND_CMD_DEMOD_STOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9959) 		scu_cmd.parameter_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9960) 		scu_cmd.result_len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9961) 		scu_cmd.result = cmd_result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9962) 		rc = scu_command(dev_addr, &scu_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9963) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9964) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9965) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9966) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9967) 		rc = set_orx_nsu_aox(demod, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9968) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9969) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9970) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9971) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9972) 		rc = drxj_dap_write_reg16(dev_addr, ORX_COMM_EXEC__A, ORX_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9973) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9974) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9975) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9976) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9977) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9978) 		ext_attr->oob_power_on = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9979) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9980) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9981) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9982) 	freq = oob_param->frequency;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9983) 	if ((freq < 70000) || (freq > 130000))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9984) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9985) 	freq = (freq - 50000) / 50;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9986) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9987) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9988) 		u16 index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9989) 		u16 remainder = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9990) 		u16 *trk_filtercfg = ext_attr->oob_trk_filter_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9991) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9992) 		index = (u16) ((freq - 400) / 200);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9993) 		remainder = (u16) ((freq - 400) % 200);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9994) 		trk_filter_value =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9995) 		    trk_filtercfg[index] - (trk_filtercfg[index] -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9996) 					   trk_filtercfg[index +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9997) 							1]) / 10 * remainder /
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9998) 		    20;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9999) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10000) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10001)    /********/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10002) 	/* Stop  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10003)    /********/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10004) 	rc = drxj_dap_write_reg16(dev_addr, ORX_COMM_EXEC__A, ORX_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10005) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10006) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10007) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10008) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10009) 	scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10010) 	    | SCU_RAM_COMMAND_CMD_DEMOD_STOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10011) 	scu_cmd.parameter_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10012) 	scu_cmd.result_len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10013) 	scu_cmd.result = cmd_result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10014) 	rc = scu_command(dev_addr, &scu_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10015) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10016) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10017) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10018) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10019)    /********/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10020) 	/* Reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10021)    /********/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10022) 	scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10023) 	    | SCU_RAM_COMMAND_CMD_DEMOD_RESET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10024) 	scu_cmd.parameter_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10025) 	scu_cmd.result_len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10026) 	scu_cmd.result = cmd_result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10027) 	rc = scu_command(dev_addr, &scu_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10028) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10029) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10030) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10031) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10032)    /**********/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10033) 	/* SET_ENV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10034)    /**********/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10035) 	/* set frequency, spectrum inversion and data rate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10036) 	scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10037) 	    | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10038) 	scu_cmd.parameter_len = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10039) 	/* 1-data rate;2-frequency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10040) 	switch (oob_param->standard) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10041) 	case DRX_OOB_MODE_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10042) 		if (
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10043) 			   /* signal is transmitted inverted */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10044) 			   ((oob_param->spectrum_inverted == true) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10045) 			    /* and tuner is not mirroring the signal */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10046) 			    (!mirror_freq_spect_oob)) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10047) 			   /* or */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10048) 			   /* signal is transmitted noninverted */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10049) 			   ((oob_param->spectrum_inverted == false) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10050) 			    /* and tuner is mirroring the signal */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10051) 			    (mirror_freq_spect_oob))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10052) 		    )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10053) 			set_param_parameters[0] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10054) 			    SCU_RAM_ORX_RF_RX_DATA_RATE_2048KBPS_INVSPEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10055) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10056) 			set_param_parameters[0] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10057) 			    SCU_RAM_ORX_RF_RX_DATA_RATE_2048KBPS_REGSPEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10058) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10059) 	case DRX_OOB_MODE_B_GRADE_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10060) 		if (
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10061) 			   /* signal is transmitted inverted */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10062) 			   ((oob_param->spectrum_inverted == true) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10063) 			    /* and tuner is not mirroring the signal */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10064) 			    (!mirror_freq_spect_oob)) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10065) 			   /* or */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10066) 			   /* signal is transmitted noninverted */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10067) 			   ((oob_param->spectrum_inverted == false) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10068) 			    /* and tuner is mirroring the signal */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10069) 			    (mirror_freq_spect_oob))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10070) 		    )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10071) 			set_param_parameters[0] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10072) 			    SCU_RAM_ORX_RF_RX_DATA_RATE_1544KBPS_INVSPEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10073) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10074) 			set_param_parameters[0] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10075) 			    SCU_RAM_ORX_RF_RX_DATA_RATE_1544KBPS_REGSPEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10076) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10077) 	case DRX_OOB_MODE_B_GRADE_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10078) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10079) 		if (
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10080) 			   /* signal is transmitted inverted */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10081) 			   ((oob_param->spectrum_inverted == true) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10082) 			    /* and tuner is not mirroring the signal */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10083) 			    (!mirror_freq_spect_oob)) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10084) 			   /* or */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10085) 			   /* signal is transmitted noninverted */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10086) 			   ((oob_param->spectrum_inverted == false) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10087) 			    /* and tuner is mirroring the signal */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10088) 			    (mirror_freq_spect_oob))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10089) 		    )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10090) 			set_param_parameters[0] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10091) 			    SCU_RAM_ORX_RF_RX_DATA_RATE_3088KBPS_INVSPEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10092) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10093) 			set_param_parameters[0] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10094) 			    SCU_RAM_ORX_RF_RX_DATA_RATE_3088KBPS_REGSPEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10095) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10096) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10097) 	set_param_parameters[1] = (u16) (freq & 0xFFFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10098) 	set_param_parameters[2] = trk_filter_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10099) 	scu_cmd.parameter = set_param_parameters;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10100) 	scu_cmd.result_len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10101) 	scu_cmd.result = cmd_result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10102) 	mode_index = mode_val[(set_param_parameters[0] & 0xC0) >> 6];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10103) 	rc = scu_command(dev_addr, &scu_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10104) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10105) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10106) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10107) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10108) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10109) 	rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0xFABA, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10110) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10111) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10112) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10113) 	}	/*  Write magic word to enable pdr reg write  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10114) 	rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_OOB_CRX_CFG__A, OOB_CRX_DRIVE_STRENGTH << SIO_PDR_OOB_CRX_CFG_DRIVE__B | 0x03 << SIO_PDR_OOB_CRX_CFG_MODE__B, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10115) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10116) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10117) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10118) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10119) 	rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_OOB_DRX_CFG__A, OOB_DRX_DRIVE_STRENGTH << SIO_PDR_OOB_DRX_CFG_DRIVE__B | 0x03 << SIO_PDR_OOB_DRX_CFG_MODE__B, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10120) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10121) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10122) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10123) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10124) 	rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10125) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10126) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10127) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10128) 	}	/*  Write magic word to disable pdr reg write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10130) 	rc = drxj_dap_write_reg16(dev_addr, ORX_TOP_COMM_KEY__A, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10131) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10132) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10133) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10134) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10135) 	rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_AAG_LEN_W__A, 16000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10136) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10137) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10138) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10139) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10140) 	rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_AAG_THR_W__A, 40, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10141) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10142) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10143) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10144) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10145) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10146) 	/* ddc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10147) 	rc = drxj_dap_write_reg16(dev_addr, ORX_DDC_OFO_SET_W__A, ORX_DDC_OFO_SET_W__PRE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10148) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10149) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10150) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10151) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10152) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10153) 	/* nsu */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10154) 	rc = drxj_dap_write_reg16(dev_addr, ORX_NSU_AOX_LOPOW_W__A, ext_attr->oob_lo_pow, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10155) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10156) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10157) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10158) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10159) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10160) 	/* initialization for target mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10161) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TARGET_MODE__A, SCU_RAM_ORX_TARGET_MODE_2048KBPS_SQRT, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10162) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10163) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10164) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10165) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10166) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FREQ_GAIN_CORR__A, SCU_RAM_ORX_FREQ_GAIN_CORR_2048KBPS, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10167) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10168) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10169) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10170) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10171) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10172) 	/* Reset bits for timing and freq. recovery */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10173) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_CPH__A, 0x0001, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10174) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10175) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10176) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10177) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10178) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_CTI__A, 0x0002, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10179) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10180) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10181) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10182) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10183) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_KRN__A, 0x0004, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10184) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10185) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10186) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10187) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10188) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_KRP__A, 0x0008, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10189) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10190) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10191) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10192) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10193) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10194) 	/* AGN_LOCK = {2048>>3, -2048, 8, -8, 0, 1}; */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10195) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_LOCK_TH__A, 2048 >> 3, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10196) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10197) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10198) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10199) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10200) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_LOCK_TOTH__A, (u16)(-2048), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10201) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10202) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10203) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10204) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10205) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_ONLOCK_TTH__A, 8, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10206) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10207) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10208) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10209) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10210) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_UNLOCK_TTH__A, (u16)(-8), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10211) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10212) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10213) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10214) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10215) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_LOCK_MASK__A, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10216) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10217) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10218) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10219) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10220) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10221) 	/* DGN_LOCK = {10, -2048, 8, -8, 0, 1<<1}; */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10222) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_LOCK_TH__A, 10, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10223) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10224) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10225) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10226) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10227) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_LOCK_TOTH__A, (u16)(-2048), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10228) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10229) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10230) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10231) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10232) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_ONLOCK_TTH__A, 8, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10233) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10234) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10235) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10236) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10237) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_UNLOCK_TTH__A, (u16)(-8), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10238) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10239) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10240) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10241) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10242) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_LOCK_MASK__A, 1 << 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10243) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10244) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10245) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10246) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10247) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10248) 	/* FRQ_LOCK = {15,-2048, 8, -8, 0, 1<<2}; */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10249) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_LOCK_TH__A, 17, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10250) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10251) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10252) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10253) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10254) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_LOCK_TOTH__A, (u16)(-2048), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10255) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10256) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10257) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10258) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10259) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_ONLOCK_TTH__A, 8, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10260) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10261) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10262) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10263) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10264) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_UNLOCK_TTH__A, (u16)(-8), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10265) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10266) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10267) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10268) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10269) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_LOCK_MASK__A, 1 << 2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10270) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10271) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10272) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10273) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10274) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10275) 	/* PHA_LOCK = {5000, -2048, 8, -8, 0, 1<<3}; */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10276) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_LOCK_TH__A, 3000, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10277) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10278) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10279) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10280) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10281) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_LOCK_TOTH__A, (u16)(-2048), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10282) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10283) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10284) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10285) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10286) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_ONLOCK_TTH__A, 8, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10287) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10288) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10289) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10290) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10291) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_UNLOCK_TTH__A, (u16)(-8), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10292) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10293) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10294) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10295) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10296) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_LOCK_MASK__A, 1 << 3, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10297) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10298) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10299) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10300) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10301) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10302) 	/* TIM_LOCK = {300,      -2048, 8, -8, 0, 1<<4}; */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10303) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_LOCK_TH__A, 400, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10304) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10305) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10306) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10307) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10308) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_LOCK_TOTH__A, (u16)(-2048), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10309) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10310) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10311) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10312) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10313) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_ONLOCK_TTH__A, 8, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10314) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10315) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10316) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10317) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10318) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_UNLOCK_TTH__A, (u16)(-8), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10319) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10320) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10321) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10322) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10323) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_LOCK_MASK__A, 1 << 4, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10324) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10325) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10326) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10327) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10328) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10329) 	/* EQU_LOCK = {20,      -2048, 8, -8, 0, 1<<5}; */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10330) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_LOCK_TH__A, 20, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10331) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10332) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10333) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10334) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10335) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_LOCK_TOTH__A, (u16)(-2048), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10336) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10337) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10338) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10339) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10340) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_ONLOCK_TTH__A, 4, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10341) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10342) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10343) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10344) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10345) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_UNLOCK_TTH__A, (u16)(-4), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10346) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10347) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10348) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10349) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10350) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_LOCK_MASK__A, 1 << 5, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10351) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10352) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10353) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10354) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10355) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10356) 	/* PRE-Filter coefficients (PFI) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10357) 	rc = drxdap_fasi_write_block(dev_addr, ORX_FWP_PFI_A_W__A, sizeof(pfi_coeffs[mode_index]), ((u8 *)pfi_coeffs[mode_index]), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10358) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10359) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10360) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10361) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10362) 	rc = drxj_dap_write_reg16(dev_addr, ORX_TOP_MDE_W__A, mode_index, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10363) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10364) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10365) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10366) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10367) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10368) 	/* NYQUIST-Filter coefficients (NYQ) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10369) 	for (i = 0; i < (NYQFILTERLEN + 1) / 2; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10370) 		rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_NYQ_ADR_W__A, i, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10371) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10372) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10373) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10374) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10375) 		rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_NYQ_COF_RW__A, nyquist_coeffs[mode_index][i], 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10376) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10377) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10378) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10379) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10380) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10381) 	rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_NYQ_ADR_W__A, 31, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10382) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10383) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10384) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10385) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10386) 	rc = drxj_dap_write_reg16(dev_addr, ORX_COMM_EXEC__A, ORX_COMM_EXEC_ACTIVE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10387) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10388) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10389) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10390) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10391) 	/********/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10392) 	/* Start */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10393) 	/********/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10394) 	scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10395) 	    | SCU_RAM_COMMAND_CMD_DEMOD_START;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10396) 	scu_cmd.parameter_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10397) 	scu_cmd.result_len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10398) 	scu_cmd.result = cmd_result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10399) 	rc = scu_command(dev_addr, &scu_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10400) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10401) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10402) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10403) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10404) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10405) 	rc = set_orx_nsu_aox(demod, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10406) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10407) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10408) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10409) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10410) 	rc = drxj_dap_write_reg16(dev_addr, ORX_NSU_AOX_STHR_W__A, ext_attr->oob_pre_saw, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10411) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10412) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10413) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10414) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10415) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10416) 	ext_attr->oob_power_on = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10417) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10418) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10419) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10420) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10421) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10422) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10423) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10424) /*==                     END OOB DATAPATH FUNCTIONS                         ==*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10425) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10426) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10427) /*=============================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10428)   ===== MC command related functions ==========================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10429)   ===========================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10430) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10431) /*=============================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10432)   ===== ctrl_set_channel() ==========================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10433)   ===========================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10434) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10435) * \fn int ctrl_set_channel()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10436) * \brief Select a new transmission channel.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10437) * \param demod instance of demod.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10438) * \param channel Pointer to channel data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10439) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10440) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10441) * In case the tuner module is not used and in case of NTSC/FM the pogrammer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10442) * must tune the tuner to the centre frequency of the NTSC/FM channel.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10443) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10444) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10445) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10446) ctrl_set_channel(struct drx_demod_instance *demod, struct drx_channel *channel)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10447) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10448) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10449) 	s32 tuner_freq_offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10450) 	struct drxj_data *ext_attr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10451) 	struct i2c_device_addr *dev_addr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10452) 	enum drx_standard standard = DRX_STANDARD_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10453) #ifndef DRXJ_VSB_ONLY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10454) 	u32 min_symbol_rate = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10455) 	u32 max_symbol_rate = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10456) 	int bandwidth_temp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10457) 	int bandwidth = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10458) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10459)    /*== check arguments ======================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10460) 	if ((demod == NULL) || (channel == NULL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10461) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10462) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10463) 	dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10464) 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10465) 	standard = ext_attr->standard;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10466) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10467) 	/* check valid standards */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10468) 	switch (standard) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10469) 	case DRX_STANDARD_8VSB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10470) #ifndef DRXJ_VSB_ONLY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10471) 	case DRX_STANDARD_ITU_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10472) 	case DRX_STANDARD_ITU_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10473) 	case DRX_STANDARD_ITU_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10474) #endif /* DRXJ_VSB_ONLY */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10475) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10476) 	case DRX_STANDARD_UNKNOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10477) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10478) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10479) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10480) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10481) 	/* check bandwidth QAM annex B, NTSC and 8VSB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10482) 	if ((standard == DRX_STANDARD_ITU_B) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10483) 	    (standard == DRX_STANDARD_8VSB) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10484) 	    (standard == DRX_STANDARD_NTSC)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10485) 		switch (channel->bandwidth) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10486) 		case DRX_BANDWIDTH_6MHZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10487) 		case DRX_BANDWIDTH_UNKNOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10488) 			channel->bandwidth = DRX_BANDWIDTH_6MHZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10489) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10490) 		case DRX_BANDWIDTH_8MHZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10491) 		case DRX_BANDWIDTH_7MHZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10492) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10493) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10494) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10495) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10496) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10497) 	/* For QAM annex A and annex C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10498) 	   -check symbolrate and constellation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10499) 	   -derive bandwidth from symbolrate (input bandwidth is ignored)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10500) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10501) #ifndef DRXJ_VSB_ONLY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10502) 	if ((standard == DRX_STANDARD_ITU_A) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10503) 	    (standard == DRX_STANDARD_ITU_C)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10504) 		struct drxuio_cfg uio_cfg = { DRX_UIO1, DRX_UIO_MODE_FIRMWARE_SAW };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10505) 		int bw_rolloff_factor = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10506) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10507) 		bw_rolloff_factor = (standard == DRX_STANDARD_ITU_A) ? 115 : 113;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10508) 		min_symbol_rate = DRXJ_QAM_SYMBOLRATE_MIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10509) 		max_symbol_rate = DRXJ_QAM_SYMBOLRATE_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10510) 		/* config SMA_TX pin to SAW switch mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10511) 		rc = ctrl_set_uio_cfg(demod, &uio_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10512) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10513) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10514) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10515) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10516) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10517) 		if (channel->symbolrate < min_symbol_rate ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10518) 		    channel->symbolrate > max_symbol_rate) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10519) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10520) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10521) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10522) 		switch (channel->constellation) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10523) 		case DRX_CONSTELLATION_QAM16:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10524) 		case DRX_CONSTELLATION_QAM32:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10525) 		case DRX_CONSTELLATION_QAM64:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10526) 		case DRX_CONSTELLATION_QAM128:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10527) 		case DRX_CONSTELLATION_QAM256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10528) 			bandwidth_temp = channel->symbolrate * bw_rolloff_factor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10529) 			bandwidth = bandwidth_temp / 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10530) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10531) 			if ((bandwidth_temp % 100) >= 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10532) 				bandwidth++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10533) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10534) 			if (bandwidth <= 6100000) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10535) 				channel->bandwidth = DRX_BANDWIDTH_6MHZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10536) 			} else if ((bandwidth > 6100000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10537) 				   && (bandwidth <= 7100000)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10538) 				channel->bandwidth = DRX_BANDWIDTH_7MHZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10539) 			} else if (bandwidth > 7100000) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10540) 				channel->bandwidth = DRX_BANDWIDTH_8MHZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10541) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10542) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10543) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10544) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10545) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10546) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10547) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10548) 	/* For QAM annex B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10549) 	   -check constellation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10550) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10551) 	if (standard == DRX_STANDARD_ITU_B) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10552) 		switch (channel->constellation) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10553) 		case DRX_CONSTELLATION_AUTO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10554) 		case DRX_CONSTELLATION_QAM256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10555) 		case DRX_CONSTELLATION_QAM64:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10556) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10557) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10558) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10559) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10560) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10561) 		switch (channel->interleavemode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10562) 		case DRX_INTERLEAVEMODE_I128_J1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10563) 		case DRX_INTERLEAVEMODE_I128_J1_V2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10564) 		case DRX_INTERLEAVEMODE_I128_J2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10565) 		case DRX_INTERLEAVEMODE_I64_J2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10566) 		case DRX_INTERLEAVEMODE_I128_J3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10567) 		case DRX_INTERLEAVEMODE_I32_J4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10568) 		case DRX_INTERLEAVEMODE_I128_J4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10569) 		case DRX_INTERLEAVEMODE_I16_J8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10570) 		case DRX_INTERLEAVEMODE_I128_J5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10571) 		case DRX_INTERLEAVEMODE_I8_J16:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10572) 		case DRX_INTERLEAVEMODE_I128_J6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10573) 		case DRX_INTERLEAVEMODE_I128_J7:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10574) 		case DRX_INTERLEAVEMODE_I128_J8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10575) 		case DRX_INTERLEAVEMODE_I12_J17:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10576) 		case DRX_INTERLEAVEMODE_I5_J4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10577) 		case DRX_INTERLEAVEMODE_B52_M240:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10578) 		case DRX_INTERLEAVEMODE_B52_M720:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10579) 		case DRX_INTERLEAVEMODE_UNKNOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10580) 		case DRX_INTERLEAVEMODE_AUTO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10581) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10582) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10583) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10584) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10585) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10586) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10587) 	if ((ext_attr->uio_sma_tx_mode) == DRX_UIO_MODE_FIRMWARE_SAW) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10588) 		/* SAW SW, user UIO is used for switchable SAW */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10589) 		struct drxuio_data uio1 = { DRX_UIO1, false };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10590) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10591) 		switch (channel->bandwidth) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10592) 		case DRX_BANDWIDTH_8MHZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10593) 			uio1.value = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10594) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10595) 		case DRX_BANDWIDTH_7MHZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10596) 			uio1.value = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10597) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10598) 		case DRX_BANDWIDTH_6MHZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10599) 			uio1.value = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10600) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10601) 		case DRX_BANDWIDTH_UNKNOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10602) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10603) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10604) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10605) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10606) 		rc = ctrl_uio_write(demod, &uio1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10607) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10608) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10609) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10610) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10611) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10612) #endif /* DRXJ_VSB_ONLY */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10613) 	rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10614) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10615) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10616) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10617) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10618) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10619) 	tuner_freq_offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10620) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10621)    /*== Setup demod for specific standard ====================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10622) 	switch (standard) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10623) 	case DRX_STANDARD_8VSB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10624) 		if (channel->mirror == DRX_MIRROR_AUTO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10625) 			ext_attr->mirror = DRX_MIRROR_NO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10626) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10627) 			ext_attr->mirror = channel->mirror;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10628) 		rc = set_vsb(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10629) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10630) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10631) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10632) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10633) 		rc = set_frequency(demod, channel, tuner_freq_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10634) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10635) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10636) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10637) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10638) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10639) #ifndef DRXJ_VSB_ONLY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10640) 	case DRX_STANDARD_ITU_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10641) 	case DRX_STANDARD_ITU_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10642) 	case DRX_STANDARD_ITU_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10643) 		rc = set_qam_channel(demod, channel, tuner_freq_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10644) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10645) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10646) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10647) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10648) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10649) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10650) 	case DRX_STANDARD_UNKNOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10651) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10652) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10653) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10654) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10655) 	/* flag the packet error counter reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10656) 	ext_attr->reset_pkt_err_acc = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10657) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10658) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10659) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10660) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10661) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10662) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10663) /*=============================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10664)   ===== SigQuality() ==========================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10665)   ===========================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10666) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10667) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10668) * \fn int ctrl_sig_quality()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10669) * \brief Retrieve signal quality form device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10670) * \param devmod Pointer to demodulator instance.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10671) * \param sig_quality Pointer to signal quality data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10672) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10673) * \retval 0 sig_quality contains valid data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10674) * \retval -EINVAL sig_quality is NULL.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10675) * \retval -EIO Erroneous data, sig_quality contains invalid data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10676) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10677) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10678) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10679) ctrl_sig_quality(struct drx_demod_instance *demod,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10680) 		 enum drx_lock_status lock_status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10681) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10682) 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10683) 	struct drxj_data *ext_attr = demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10684) 	struct drx39xxj_state *state = dev_addr->user_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10685) 	struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10686) 	enum drx_standard standard = ext_attr->standard;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10687) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10688) 	u32 ber, cnt, err, pkt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10689) 	u16 mer, strength = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10690) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10691) 	rc = get_sig_strength(demod, &strength);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10692) 	if (rc < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10693) 		pr_err("error getting signal strength %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10694) 		p->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10695) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10696) 		p->strength.stat[0].scale = FE_SCALE_RELATIVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10697) 		p->strength.stat[0].uvalue = 65535UL *  strength/ 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10698) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10699) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10700) 	switch (standard) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10701) 	case DRX_STANDARD_8VSB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10702) #ifdef DRXJ_SIGNAL_ACCUM_ERR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10703) 		rc = get_acc_pkt_err(demod, &pkt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10704) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10705) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10706) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10707) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10708) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10709) 		if (lock_status != DRXJ_DEMOD_LOCK && lock_status != DRX_LOCKED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10710) 			p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10711) 			p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10712) 			p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10713) 			p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10714) 			p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10715) 			p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10716) 			p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10717) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10718) 			rc = get_vsb_post_rs_pck_err(dev_addr, &err, &pkt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10719) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10720) 				pr_err("error %d getting UCB\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10721) 				p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10722) 			} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10723) 				p->block_error.stat[0].scale = FE_SCALE_COUNTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10724) 				p->block_error.stat[0].uvalue += err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10725) 				p->block_count.stat[0].scale = FE_SCALE_COUNTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10726) 				p->block_count.stat[0].uvalue += pkt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10727) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10728) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10729) 			/* PostViterbi is compute in steps of 10^(-6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10730) 			rc = get_vs_bpre_viterbi_ber(dev_addr, &ber, &cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10731) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10732) 				pr_err("error %d getting pre-ber\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10733) 				p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10734) 			} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10735) 				p->pre_bit_error.stat[0].scale = FE_SCALE_COUNTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10736) 				p->pre_bit_error.stat[0].uvalue += ber;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10737) 				p->pre_bit_count.stat[0].scale = FE_SCALE_COUNTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10738) 				p->pre_bit_count.stat[0].uvalue += cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10739) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10740) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10741) 			rc = get_vs_bpost_viterbi_ber(dev_addr, &ber, &cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10742) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10743) 				pr_err("error %d getting post-ber\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10744) 				p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10745) 			} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10746) 				p->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10747) 				p->post_bit_error.stat[0].uvalue += ber;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10748) 				p->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10749) 				p->post_bit_count.stat[0].uvalue += cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10750) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10751) 			rc = get_vsbmer(dev_addr, &mer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10752) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10753) 				pr_err("error %d getting MER\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10754) 				p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10755) 			} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10756) 				p->cnr.stat[0].svalue = mer * 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10757) 				p->cnr.stat[0].scale = FE_SCALE_DECIBEL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10758) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10759) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10760) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10761) #ifndef DRXJ_VSB_ONLY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10762) 	case DRX_STANDARD_ITU_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10763) 	case DRX_STANDARD_ITU_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10764) 	case DRX_STANDARD_ITU_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10765) 		rc = ctrl_get_qam_sig_quality(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10766) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10767) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10768) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10769) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10770) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10771) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10772) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10773) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10774) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10775) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10776) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10777) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10778) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10779) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10780) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10781) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10782) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10783) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10784) * \fn int ctrl_lock_status()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10785) * \brief Retrieve lock status .
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10786) * \param dev_addr Pointer to demodulator device address.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10787) * \param lock_stat Pointer to lock status structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10788) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10789) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10790) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10791) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10792) ctrl_lock_status(struct drx_demod_instance *demod, enum drx_lock_status *lock_stat)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10793) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10794) 	enum drx_standard standard = DRX_STANDARD_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10795) 	struct drxj_data *ext_attr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10796) 	struct i2c_device_addr *dev_addr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10797) 	struct drxjscu_cmd cmd_scu = { /* command      */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10798) 		/* parameter_len */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10799) 		/* result_len    */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10800) 		/* *parameter   */ NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10801) 		/* *result      */ NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10802) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10803) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10804) 	u16 cmd_result[2] = { 0, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10805) 	u16 demod_lock = SCU_RAM_PARAM_1_RES_DEMOD_GET_LOCK_DEMOD_LOCKED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10806) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10807) 	/* check arguments */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10808) 	if ((demod == NULL) || (lock_stat == NULL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10809) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10810) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10811) 	dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10812) 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10813) 	standard = ext_attr->standard;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10814) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10815) 	*lock_stat = DRX_NOT_LOCKED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10816) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10817) 	/* define the SCU command code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10818) 	switch (standard) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10819) 	case DRX_STANDARD_8VSB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10820) 		cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10821) 		    SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10822) 		demod_lock |= 0x6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10823) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10824) #ifndef DRXJ_VSB_ONLY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10825) 	case DRX_STANDARD_ITU_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10826) 	case DRX_STANDARD_ITU_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10827) 	case DRX_STANDARD_ITU_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10828) 		cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10829) 		    SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10830) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10831) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10832) 	case DRX_STANDARD_UNKNOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10833) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10834) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10835) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10836) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10837) 	/* define the SCU command parameters and execute the command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10838) 	cmd_scu.parameter_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10839) 	cmd_scu.result_len = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10840) 	cmd_scu.parameter = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10841) 	cmd_scu.result = cmd_result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10842) 	rc = scu_command(dev_addr, &cmd_scu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10843) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10844) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10845) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10846) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10847) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10848) 	/* set the lock status */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10849) 	if (cmd_scu.result[1] < demod_lock) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10850) 		/* 0x0000 NOT LOCKED */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10851) 		*lock_stat = DRX_NOT_LOCKED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10852) 	} else if (cmd_scu.result[1] < SCU_RAM_PARAM_1_RES_DEMOD_GET_LOCK_LOCKED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10853) 		*lock_stat = DRXJ_DEMOD_LOCK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10854) 	} else if (cmd_scu.result[1] <
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10855) 		   SCU_RAM_PARAM_1_RES_DEMOD_GET_LOCK_NEVER_LOCK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10856) 		/* 0x8000 DEMOD + FEC LOCKED (system lock) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10857) 		*lock_stat = DRX_LOCKED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10858) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10859) 		/* 0xC000 NEVER LOCKED */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10860) 		/* (system will never be able to lock to the signal) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10861) 		*lock_stat = DRX_NEVER_LOCK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10862) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10863) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10864) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10865) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10866) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10867) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10868) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10869) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10870) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10871) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10872) * \fn int ctrl_set_standard()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10873) * \brief Set modulation standard to be used.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10874) * \param standard Modulation standard.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10875) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10876) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10877) * Setup stuff for the desired demodulation standard.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10878) * Disable and power down the previous selected demodulation standard
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10879) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10880) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10881) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10882) ctrl_set_standard(struct drx_demod_instance *demod, enum drx_standard *standard)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10883) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10884) 	struct drxj_data *ext_attr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10885) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10886) 	enum drx_standard prev_standard;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10887) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10888) 	/* check arguments */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10889) 	if ((standard == NULL) || (demod == NULL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10890) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10891) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10892) 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10893) 	prev_standard = ext_attr->standard;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10894) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10895) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10896) 	   Stop and power down previous standard
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10897) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10898) 	switch (prev_standard) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10899) #ifndef DRXJ_VSB_ONLY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10900) 	case DRX_STANDARD_ITU_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10901) 	case DRX_STANDARD_ITU_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10902) 	case DRX_STANDARD_ITU_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10903) 		rc = power_down_qam(demod, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10904) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10905) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10906) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10907) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10908) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10909) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10910) 	case DRX_STANDARD_8VSB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10911) 		rc = power_down_vsb(demod, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10912) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10913) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10914) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10915) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10916) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10917) 	case DRX_STANDARD_UNKNOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10918) 		/* Do nothing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10919) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10920) 	case DRX_STANDARD_AUTO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10921) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10922) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10923) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10924) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10925) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10926) 	   Initialize channel independent registers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10927) 	   Power up new standard
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10928) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10929) 	ext_attr->standard = *standard;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10930) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10931) 	switch (*standard) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10932) #ifndef DRXJ_VSB_ONLY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10933) 	case DRX_STANDARD_ITU_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10934) 	case DRX_STANDARD_ITU_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10935) 	case DRX_STANDARD_ITU_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10936) 		do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10937) 			u16 dummy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10938) 			rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SCU_RAM_VERSION_HI__A, &dummy, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10939) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10940) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10941) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10942) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10943) 		} while (0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10944) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10945) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10946) 	case DRX_STANDARD_8VSB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10947) 		rc = set_vsb_leak_n_gain(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10948) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10949) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10950) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10951) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10952) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10953) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10954) 		ext_attr->standard = DRX_STANDARD_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10955) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10956) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10957) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10958) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10959) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10960) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10961) 	/* Don't know what the standard is now ... try again */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10962) 	ext_attr->standard = DRX_STANDARD_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10963) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10964) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10965) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10966) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10967) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10968) static void drxj_reset_mode(struct drxj_data *ext_attr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10969) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10970) 	/* Initialize default AFE configuration for QAM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10971) 	if (ext_attr->has_lna) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10972) 		/* IF AGC off, PGA active */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10973) #ifndef DRXJ_VSB_ONLY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10974) 		ext_attr->qam_if_agc_cfg.standard = DRX_STANDARD_ITU_B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10975) 		ext_attr->qam_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_OFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10976) 		ext_attr->qam_pga_cfg = 140 + (11 * 13);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10977) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10978) 		ext_attr->vsb_if_agc_cfg.standard = DRX_STANDARD_8VSB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10979) 		ext_attr->vsb_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_OFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10980) 		ext_attr->vsb_pga_cfg = 140 + (11 * 13);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10981) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10982) 		/* IF AGC on, PGA not active */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10983) #ifndef DRXJ_VSB_ONLY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10984) 		ext_attr->qam_if_agc_cfg.standard = DRX_STANDARD_ITU_B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10985) 		ext_attr->qam_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10986) 		ext_attr->qam_if_agc_cfg.min_output_level = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10987) 		ext_attr->qam_if_agc_cfg.max_output_level = 0x7FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10988) 		ext_attr->qam_if_agc_cfg.speed = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10989) 		ext_attr->qam_if_agc_cfg.top = 1297;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10990) 		ext_attr->qam_pga_cfg = 140;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10991) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10992) 		ext_attr->vsb_if_agc_cfg.standard = DRX_STANDARD_8VSB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10993) 		ext_attr->vsb_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10994) 		ext_attr->vsb_if_agc_cfg.min_output_level = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10995) 		ext_attr->vsb_if_agc_cfg.max_output_level = 0x7FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10996) 		ext_attr->vsb_if_agc_cfg.speed = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10997) 		ext_attr->vsb_if_agc_cfg.top = 1024;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10998) 		ext_attr->vsb_pga_cfg = 140;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10999) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11000) 	/* TODO: remove min_output_level and max_output_level for both QAM and VSB after */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11001) 	/* mc has not used them */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11002) #ifndef DRXJ_VSB_ONLY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11003) 	ext_attr->qam_rf_agc_cfg.standard = DRX_STANDARD_ITU_B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11004) 	ext_attr->qam_rf_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11005) 	ext_attr->qam_rf_agc_cfg.min_output_level = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11006) 	ext_attr->qam_rf_agc_cfg.max_output_level = 0x7FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11007) 	ext_attr->qam_rf_agc_cfg.speed = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11008) 	ext_attr->qam_rf_agc_cfg.top = 9500;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11009) 	ext_attr->qam_rf_agc_cfg.cut_off_current = 4000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11010) 	ext_attr->qam_pre_saw_cfg.standard = DRX_STANDARD_ITU_B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11011) 	ext_attr->qam_pre_saw_cfg.reference = 0x07;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11012) 	ext_attr->qam_pre_saw_cfg.use_pre_saw = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11013) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11014) 	/* Initialize default AFE configuration for VSB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11015) 	ext_attr->vsb_rf_agc_cfg.standard = DRX_STANDARD_8VSB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11016) 	ext_attr->vsb_rf_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11017) 	ext_attr->vsb_rf_agc_cfg.min_output_level = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11018) 	ext_attr->vsb_rf_agc_cfg.max_output_level = 0x7FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11019) 	ext_attr->vsb_rf_agc_cfg.speed = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11020) 	ext_attr->vsb_rf_agc_cfg.top = 9500;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11021) 	ext_attr->vsb_rf_agc_cfg.cut_off_current = 4000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11022) 	ext_attr->vsb_pre_saw_cfg.standard = DRX_STANDARD_8VSB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11023) 	ext_attr->vsb_pre_saw_cfg.reference = 0x07;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11024) 	ext_attr->vsb_pre_saw_cfg.use_pre_saw = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11025) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11026) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11027) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11028) * \fn int ctrl_power_mode()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11029) * \brief Set the power mode of the device to the specified power mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11030) * \param demod Pointer to demodulator instance.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11031) * \param mode  Pointer to new power mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11032) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11033) * \retval 0          Success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11034) * \retval -EIO       I2C error or other failure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11035) * \retval -EINVAL Invalid mode argument.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11036) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11037) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11038) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11039) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11040) ctrl_power_mode(struct drx_demod_instance *demod, enum drx_power_mode *mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11041) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11042) 	struct drx_common_attr *common_attr = (struct drx_common_attr *) NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11043) 	struct drxj_data *ext_attr = (struct drxj_data *) NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11044) 	struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11045) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11046) 	u16 sio_cc_pwd_mode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11047) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11048) 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11049) 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11050) 	dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11051) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11052) 	/* Check arguments */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11053) 	if (mode == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11054) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11055) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11056) 	/* If already in requested power mode, do nothing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11057) 	if (common_attr->current_power_mode == *mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11058) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11059) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11060) 	switch (*mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11061) 	case DRX_POWER_UP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11062) 	case DRXJ_POWER_DOWN_MAIN_PATH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11063) 		sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11064) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11065) 	case DRXJ_POWER_DOWN_CORE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11066) 		sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_CLOCK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11067) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11068) 	case DRXJ_POWER_DOWN_PLL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11069) 		sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_PLL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11070) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11071) 	case DRX_POWER_DOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11072) 		sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_OSC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11073) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11074) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11075) 		/* Unknow sleep mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11076) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11077) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11078) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11079) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11080) 	/* Check if device needs to be powered up */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11081) 	if ((common_attr->current_power_mode != DRX_POWER_UP)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11082) 		rc = power_up_device(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11083) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11084) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11085) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11086) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11087) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11088) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11089) 	if (*mode == DRX_POWER_UP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11090) 		/* Restore analog & pin configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11091) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11092) 		/* Initialize default AFE configuration for VSB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11093) 		drxj_reset_mode(ext_attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11094) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11095) 		/* Power down to requested mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11096) 		/* Backup some register settings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11097) 		/* Set pins with possible pull-ups connected to them in input mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11098) 		/* Analog power down */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11099) 		/* ADC power down */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11100) 		/* Power down device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11101) 		/* stop all comm_exec */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11102) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11103) 		   Stop and power down previous standard
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11104) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11105) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11106) 		switch (ext_attr->standard) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11107) 		case DRX_STANDARD_ITU_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11108) 		case DRX_STANDARD_ITU_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11109) 		case DRX_STANDARD_ITU_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11110) 			rc = power_down_qam(demod, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11111) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11112) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11113) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11114) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11115) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11116) 		case DRX_STANDARD_8VSB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11117) 			rc = power_down_vsb(demod, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11118) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11119) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11120) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11121) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11122) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11123) 		case DRX_STANDARD_PAL_SECAM_BG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11124) 		case DRX_STANDARD_PAL_SECAM_DK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11125) 		case DRX_STANDARD_PAL_SECAM_I:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11126) 		case DRX_STANDARD_PAL_SECAM_L:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11127) 		case DRX_STANDARD_PAL_SECAM_LP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11128) 		case DRX_STANDARD_NTSC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11129) 		case DRX_STANDARD_FM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11130) 			rc = power_down_atv(demod, ext_attr->standard, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11131) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11132) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11133) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11134) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11135) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11136) 		case DRX_STANDARD_UNKNOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11137) 			/* Do nothing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11138) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11139) 		case DRX_STANDARD_AUTO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11140) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11141) 			return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11142) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11143) 		ext_attr->standard = DRX_STANDARD_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11144) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11145) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11146) 	if (*mode != DRXJ_POWER_DOWN_MAIN_PATH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11147) 		rc = drxj_dap_write_reg16(dev_addr, SIO_CC_PWD_MODE__A, sio_cc_pwd_mode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11148) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11149) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11150) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11151) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11152) 		rc = drxj_dap_write_reg16(dev_addr, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11153) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11154) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11155) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11156) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11157) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11158) 		if ((*mode != DRX_POWER_UP)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11159) 			/* Initialize HI, wakeup key especially before put IC to sleep */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11160) 			rc = init_hi(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11161) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11162) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11163) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11164) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11165) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11166) 			ext_attr->hi_cfg_ctrl |= SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11167) 			rc = hi_cfg_command(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11168) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11169) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11170) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11171) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11172) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11173) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11174) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11175) 	common_attr->current_power_mode = *mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11176) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11177) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11178) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11179) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11180) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11181) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11182) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11183) /*== CTRL Set/Get Config related functions ===================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11184) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11185) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11186) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11187) * \fn int ctrl_set_cfg_pre_saw()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11188) * \brief Set Pre-saw reference.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11189) * \param demod demod instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11190) * \param u16 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11191) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11192) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11193) * Check arguments
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11194) * Dispatch handling to standard specific function.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11195) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11196) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11197) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11198) ctrl_set_cfg_pre_saw(struct drx_demod_instance *demod, struct drxj_cfg_pre_saw *pre_saw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11199) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11200) 	struct i2c_device_addr *dev_addr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11201) 	struct drxj_data *ext_attr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11202) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11203) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11204) 	dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11205) 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11206) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11207) 	/* check arguments */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11208) 	if ((pre_saw == NULL) || (pre_saw->reference > IQM_AF_PDREF__M)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11209) 	    ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11210) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11211) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11212) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11213) 	/* Only if standard is currently active */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11214) 	if ((ext_attr->standard == pre_saw->standard) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11215) 	    (DRXJ_ISQAMSTD(ext_attr->standard) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11216) 	     DRXJ_ISQAMSTD(pre_saw->standard)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11217) 	    (DRXJ_ISATVSTD(ext_attr->standard) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11218) 	     DRXJ_ISATVSTD(pre_saw->standard))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11219) 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_PDREF__A, pre_saw->reference, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11220) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11221) 			pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11222) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11223) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11224) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11225) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11226) 	/* Store pre-saw settings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11227) 	switch (pre_saw->standard) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11228) 	case DRX_STANDARD_8VSB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11229) 		ext_attr->vsb_pre_saw_cfg = *pre_saw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11230) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11231) #ifndef DRXJ_VSB_ONLY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11232) 	case DRX_STANDARD_ITU_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11233) 	case DRX_STANDARD_ITU_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11234) 	case DRX_STANDARD_ITU_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11235) 		ext_attr->qam_pre_saw_cfg = *pre_saw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11236) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11237) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11238) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11239) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11240) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11241) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11242) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11243) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11244) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11245) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11246) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11247) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11248) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11249) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11250) * \fn int ctrl_set_cfg_afe_gain()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11251) * \brief Set AFE Gain.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11252) * \param demod demod instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11253) * \param u16 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11254) * \return int.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11255) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11256) * Check arguments
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11257) * Dispatch handling to standard specific function.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11258) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11259) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11260) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11261) ctrl_set_cfg_afe_gain(struct drx_demod_instance *demod, struct drxj_cfg_afe_gain *afe_gain)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11262) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11263) 	struct i2c_device_addr *dev_addr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11264) 	struct drxj_data *ext_attr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11265) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11266) 	u8 gain = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11267) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11268) 	/* check arguments */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11269) 	if (afe_gain == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11270) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11271) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11272) 	dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11273) 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11274) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11275) 	switch (afe_gain->standard) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11276) 	case DRX_STANDARD_8VSB:	fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11277) #ifndef DRXJ_VSB_ONLY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11278) 	case DRX_STANDARD_ITU_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11279) 	case DRX_STANDARD_ITU_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11280) 	case DRX_STANDARD_ITU_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11281) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11282) 		/* Do nothing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11283) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11284) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11285) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11286) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11287) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11288) 	/* TODO PGA gain is also written by microcode (at least by QAM and VSB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11289) 	   So I (PJ) think interface requires choice between auto, user mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11290) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11291) 	if (afe_gain->gain >= 329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11292) 		gain = 15;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11293) 	else if (afe_gain->gain <= 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11294) 		gain = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11295) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11296) 		gain = (afe_gain->gain - 140 + 6) / 13;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11297) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11298) 	/* Only if standard is currently active */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11299) 	if (ext_attr->standard == afe_gain->standard) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11300) 			rc = drxj_dap_write_reg16(dev_addr, IQM_AF_PGA_GAIN__A, gain, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11301) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11302) 				pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11303) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11304) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11305) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11306) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11307) 	/* Store AFE Gain settings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11308) 	switch (afe_gain->standard) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11309) 	case DRX_STANDARD_8VSB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11310) 		ext_attr->vsb_pga_cfg = gain * 13 + 140;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11311) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11312) #ifndef DRXJ_VSB_ONLY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11313) 	case DRX_STANDARD_ITU_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11314) 	case DRX_STANDARD_ITU_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11315) 	case DRX_STANDARD_ITU_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11316) 		ext_attr->qam_pga_cfg = gain * 13 + 140;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11317) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11318) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11319) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11320) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11321) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11322) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11323) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11324) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11325) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11326) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11327) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11328) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11329) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11330) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11331) /*=============================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11332) ===== EXPORTED FUNCTIONS ====================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11333) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11334) static int drx_ctrl_u_code(struct drx_demod_instance *demod,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11335) 		       struct drxu_code_info *mc_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11336) 		       enum drxu_code_action action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11337) static int drxj_set_lna_state(struct drx_demod_instance *demod, bool state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11338) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11339) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11340) * \fn drxj_open()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11341) * \brief Open the demod instance, configure device, configure drxdriver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11342) * \return Status_t Return status.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11343) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11344) * drxj_open() can be called with a NULL ucode image => no ucode upload.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11345) * This means that drxj_open() must NOT contain SCU commands or, in general,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11346) * rely on SCU or AUD ucode to be present.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11347) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11348) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11349) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11350) static int drxj_open(struct drx_demod_instance *demod)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11351) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11352) 	struct i2c_device_addr *dev_addr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11353) 	struct drxj_data *ext_attr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11354) 	struct drx_common_attr *common_attr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11355) 	u32 driver_version = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11356) 	struct drxu_code_info ucode_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11357) 	struct drx_cfg_mpeg_output cfg_mpeg_output;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11358) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11359) 	enum drx_power_mode power_mode = DRX_POWER_UP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11360) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11361) 	if ((demod == NULL) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11362) 	    (demod->my_common_attr == NULL) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11363) 	    (demod->my_ext_attr == NULL) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11364) 	    (demod->my_i2c_dev_addr == NULL) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11365) 	    (demod->my_common_attr->is_opened)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11366) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11367) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11368) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11369) 	/* Check arguments */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11370) 	if (demod->my_ext_attr == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11371) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11372) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11373) 	dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11374) 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11375) 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11376) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11377) 	rc = ctrl_power_mode(demod, &power_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11378) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11379) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11380) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11381) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11382) 	if (power_mode != DRX_POWER_UP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11383) 		rc = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11384) 		pr_err("failed to powerup device\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11385) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11386) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11387) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11388) 	/* has to be in front of setIqmAf and setOrxNsuAox */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11389) 	rc = get_device_capabilities(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11390) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11391) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11392) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11393) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11394) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11395) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11396) 	 * Soft reset of sys- and osc-clockdomain
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11397) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11398) 	 * HACK: On windows, it writes a 0x07 here, instead of just 0x03.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11399) 	 * As we didn't load the firmware here yet, we should do the same.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11400) 	 * Btw, this is coherent with DRX-K, where we send reset codes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11401) 	 * for modulation (OFTM, in DRX-k), SYS and OSC clock domains.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11402) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11403) 	rc = drxj_dap_write_reg16(dev_addr, SIO_CC_SOFT_RST__A, (0x04 | SIO_CC_SOFT_RST_SYS__M | SIO_CC_SOFT_RST_OSC__M), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11404) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11405) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11406) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11407) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11408) 	rc = drxj_dap_write_reg16(dev_addr, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11409) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11410) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11411) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11412) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11413) 	msleep(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11414) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11415) 	/* TODO first make sure that everything keeps working before enabling this */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11416) 	/* PowerDownAnalogBlocks() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11417) 	rc = drxj_dap_write_reg16(dev_addr, ATV_TOP_STDBY__A, (~ATV_TOP_STDBY_CVBS_STDBY_A2_ACTIVE) | ATV_TOP_STDBY_SIF_STDBY_STANDBY, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11418) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11419) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11420) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11421) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11422) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11423) 	rc = set_iqm_af(demod, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11424) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11425) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11426) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11427) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11428) 	rc = set_orx_nsu_aox(demod, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11429) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11430) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11431) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11432) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11433) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11434) 	rc = init_hi(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11435) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11436) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11437) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11438) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11439) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11440) 	/* disable mpegoutput pins */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11441) 	memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11442) 	cfg_mpeg_output.enable_mpeg_output = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11443) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11444) 	rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11445) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11446) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11447) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11448) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11449) 	/* Stop AUD Inform SetAudio it will need to do all setting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11450) 	rc = power_down_aud(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11451) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11452) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11453) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11454) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11455) 	/* Stop SCU */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11456) 	rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11457) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11458) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11459) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11460) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11461) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11462) 	/* Upload microcode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11463) 	if (common_attr->microcode_file != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11464) 		/* Dirty trick to use common ucode upload & verify,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11465) 		   pretend device is already open */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11466) 		common_attr->is_opened = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11467) 		ucode_info.mc_file = common_attr->microcode_file;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11468) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11469) 		if (DRX_ISPOWERDOWNMODE(demod->my_common_attr->current_power_mode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11470) 			pr_err("Should powerup before loading the firmware.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11471) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11472) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11473) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11474) 		rc = drx_ctrl_u_code(demod, &ucode_info, UCODE_UPLOAD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11475) 		if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11476) 			pr_err("error %d while uploading the firmware\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11477) 			goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11478) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11479) 		if (common_attr->verify_microcode == true) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11480) 			rc = drx_ctrl_u_code(demod, &ucode_info, UCODE_VERIFY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11481) 			if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11482) 				pr_err("error %d while verifying the firmware\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11483) 				       rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11484) 				goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11485) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11486) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11487) 		common_attr->is_opened = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11488) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11489) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11490) 	/* Run SCU for a little while to initialize microcode version numbers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11491) 	rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11492) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11493) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11494) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11495) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11496) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11497) 	/* Initialize scan timeout */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11498) 	common_attr->scan_demod_lock_timeout = DRXJ_SCAN_TIMEOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11499) 	common_attr->scan_desired_lock = DRX_LOCKED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11500) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11501) 	drxj_reset_mode(ext_attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11502) 	ext_attr->standard = DRX_STANDARD_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11503) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11504) 	rc = smart_ant_init(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11505) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11506) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11507) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11508) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11509) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11510) 	/* Stamp driver version number in SCU data RAM in BCD code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11511) 	   Done to enable field application engineers to retrieve drxdriver version
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11512) 	   via I2C from SCU RAM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11513) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11514) 	driver_version = (VERSION_MAJOR / 100) % 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11515) 	driver_version <<= 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11516) 	driver_version += (VERSION_MAJOR / 10) % 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11517) 	driver_version <<= 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11518) 	driver_version += (VERSION_MAJOR % 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11519) 	driver_version <<= 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11520) 	driver_version += (VERSION_MINOR % 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11521) 	driver_version <<= 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11522) 	driver_version += (VERSION_PATCH / 1000) % 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11523) 	driver_version <<= 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11524) 	driver_version += (VERSION_PATCH / 100) % 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11525) 	driver_version <<= 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11526) 	driver_version += (VERSION_PATCH / 10) % 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11527) 	driver_version <<= 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11528) 	driver_version += (VERSION_PATCH % 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11529) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_DRIVER_VER_HI__A, (u16)(driver_version >> 16), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11530) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11531) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11532) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11533) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11534) 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_DRIVER_VER_LO__A, (u16)(driver_version & 0xFFFF), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11535) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11536) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11537) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11538) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11539) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11540) 	rc = ctrl_set_oob(demod, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11541) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11542) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11543) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11544) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11545) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11546) 	/* refresh the audio data structure with default */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11547) 	ext_attr->aud_data = drxj_default_aud_data_g;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11548) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11549) 	demod->my_common_attr->is_opened = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11550) 	drxj_set_lna_state(demod, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11551) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11552) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11553) 	common_attr->is_opened = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11554) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11555) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11556) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11557) /*============================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11558) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11559) * \fn drxj_close()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11560) * \brief Close the demod instance, power down the device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11561) * \return Status_t Return status.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11562) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11563) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11564) static int drxj_close(struct drx_demod_instance *demod)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11565) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11566) 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11567) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11568) 	enum drx_power_mode power_mode = DRX_POWER_UP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11569) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11570) 	if ((demod->my_common_attr == NULL) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11571) 	    (demod->my_ext_attr == NULL) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11572) 	    (demod->my_i2c_dev_addr == NULL) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11573) 	    (!demod->my_common_attr->is_opened)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11574) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11575) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11576) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11577) 	/* power up */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11578) 	rc = ctrl_power_mode(demod, &power_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11579) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11580) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11581) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11582) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11583) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11584) 	rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11585) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11586) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11587) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11588) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11589) 	power_mode = DRX_POWER_DOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11590) 	rc = ctrl_power_mode(demod, &power_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11591) 	if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11592) 		pr_err("error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11593) 		goto rw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11594) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11595) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11596) 	DRX_ATTR_ISOPENED(demod) = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11597) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11598) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11599) rw_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11600) 	DRX_ATTR_ISOPENED(demod) = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11601) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11602) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11603) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11604) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11605) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11606)  * Microcode related functions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11607)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11608) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11609) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11610)  * drx_u_code_compute_crc	- Compute CRC of block of microcode data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11611)  * @block_data: Pointer to microcode data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11612)  * @nr_words:   Size of microcode block (number of 16 bits words).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11613)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11614)  * returns The computed CRC residue.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11615)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11616) static u16 drx_u_code_compute_crc(u8 *block_data, u16 nr_words)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11617) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11618) 	u16 i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11619) 	u16 j = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11620) 	u32 crc_word = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11621) 	u32 carry = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11622) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11623) 	while (i < nr_words) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11624) 		crc_word |= (u32)be16_to_cpu(*(__be16 *)(block_data));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11625) 		for (j = 0; j < 16; j++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11626) 			crc_word <<= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11627) 			if (carry != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11628) 				crc_word ^= 0x80050000UL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11629) 			carry = crc_word & 0x80000000UL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11630) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11631) 		i++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11632) 		block_data += (sizeof(u16));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11633) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11634) 	return (u16)(crc_word >> 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11635) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11636) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11637) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11638)  * drx_check_firmware - checks if the loaded firmware is valid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11639)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11640)  * @demod:	demod structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11641)  * @mc_data:	pointer to the start of the firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11642)  * @size:	firmware size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11643)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11644) static int drx_check_firmware(struct drx_demod_instance *demod, u8 *mc_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11645) 			  unsigned size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11646) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11647) 	struct drxu_code_block_hdr block_hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11648) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11649) 	unsigned count = 2 * sizeof(u16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11650) 	u32 mc_dev_type, mc_version, mc_base_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11651) 	u16 mc_nr_of_blks = be16_to_cpu(*(__be16 *)(mc_data + sizeof(u16)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11652) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11653) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11654) 	 * Scan microcode blocks first for version info
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11655) 	 * and firmware check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11656) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11657) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11658) 	/* Clear version block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11659) 	DRX_ATTR_MCRECORD(demod).aux_type = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11660) 	DRX_ATTR_MCRECORD(demod).mc_dev_type = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11661) 	DRX_ATTR_MCRECORD(demod).mc_version = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11662) 	DRX_ATTR_MCRECORD(demod).mc_base_version = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11663) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11664) 	for (i = 0; i < mc_nr_of_blks; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11665) 		if (count + 3 * sizeof(u16) + sizeof(u32) > size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11666) 			goto eof;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11667) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11668) 		/* Process block header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11669) 		block_hdr.addr = be32_to_cpu(*(__be32 *)(mc_data + count));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11670) 		count += sizeof(u32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11671) 		block_hdr.size = be16_to_cpu(*(__be16 *)(mc_data + count));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11672) 		count += sizeof(u16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11673) 		block_hdr.flags = be16_to_cpu(*(__be16 *)(mc_data + count));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11674) 		count += sizeof(u16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11675) 		block_hdr.CRC = be16_to_cpu(*(__be16 *)(mc_data + count));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11676) 		count += sizeof(u16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11677) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11678) 		pr_debug("%u: addr %u, size %u, flags 0x%04x, CRC 0x%04x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11679) 			count, block_hdr.addr, block_hdr.size, block_hdr.flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11680) 			block_hdr.CRC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11681) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11682) 		if (block_hdr.flags & 0x8) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11683) 			u8 *auxblk = ((void *)mc_data) + block_hdr.addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11684) 			u16 auxtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11685) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11686) 			if (block_hdr.addr + sizeof(u16) > size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11687) 				goto eof;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11688) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11689) 			auxtype = be16_to_cpu(*(__be16 *)(auxblk));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11690) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11691) 			/* Aux block. Check type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11692) 			if (DRX_ISMCVERTYPE(auxtype)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11693) 				if (block_hdr.addr + 2 * sizeof(u16) + 2 * sizeof (u32) > size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11694) 					goto eof;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11695) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11696) 				auxblk += sizeof(u16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11697) 				mc_dev_type = be32_to_cpu(*(__be32 *)(auxblk));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11698) 				auxblk += sizeof(u32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11699) 				mc_version = be32_to_cpu(*(__be32 *)(auxblk));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11700) 				auxblk += sizeof(u32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11701) 				mc_base_version = be32_to_cpu(*(__be32 *)(auxblk));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11702) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11703) 				DRX_ATTR_MCRECORD(demod).aux_type = auxtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11704) 				DRX_ATTR_MCRECORD(demod).mc_dev_type = mc_dev_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11705) 				DRX_ATTR_MCRECORD(demod).mc_version = mc_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11706) 				DRX_ATTR_MCRECORD(demod).mc_base_version = mc_base_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11707) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11708) 				pr_info("Firmware dev %x, ver %x, base ver %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11709) 					mc_dev_type, mc_version, mc_base_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11710) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11711) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11712) 		} else if (count + block_hdr.size * sizeof(u16) > size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11713) 			goto eof;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11714) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11715) 		count += block_hdr.size * sizeof(u16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11716) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11717) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11718) eof:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11719) 	pr_err("Firmware is truncated at pos %u/%u\n", count, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11720) 	return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11721) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11722) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11723) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11724)  * drx_ctrl_u_code - Handle microcode upload or verify.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11725)  * @dev_addr: Address of device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11726)  * @mc_info:  Pointer to information about microcode data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11727)  * @action:  Either UCODE_UPLOAD or UCODE_VERIFY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11728)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11729)  * This function returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11730)  *	0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11731)  *		- In case of UCODE_UPLOAD: code is successfully uploaded.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11732)  *               - In case of UCODE_VERIFY: image on device is equal to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11733)  *		  image provided to this control function.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11734)  *	-EIO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11735)  *		- In case of UCODE_UPLOAD: I2C error.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11736)  *		- In case of UCODE_VERIFY: I2C error or image on device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11737)  *		  is not equal to image provided to this control function.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11738)  *	-EINVAL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11739)  *		- Invalid arguments.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11740)  *		- Provided image is corrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11741)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11742) static int drx_ctrl_u_code(struct drx_demod_instance *demod,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11743) 		       struct drxu_code_info *mc_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11744) 		       enum drxu_code_action action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11745) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11746) 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11747) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11748) 	u16 i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11749) 	u16 mc_nr_of_blks = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11750) 	u16 mc_magic_word = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11751) 	const u8 *mc_data_init = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11752) 	u8 *mc_data = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11753) 	unsigned size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11754) 	char *mc_file;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11755) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11756) 	/* Check arguments */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11757) 	if (!mc_info || !mc_info->mc_file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11758) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11759) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11760) 	mc_file = mc_info->mc_file;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11761) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11762) 	if (!demod->firmware) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11763) 		const struct firmware *fw = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11764) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11765) 		rc = request_firmware(&fw, mc_file, demod->i2c->dev.parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11766) 		if (rc < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11767) 			pr_err("Couldn't read firmware %s\n", mc_file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11768) 			return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11769) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11770) 		demod->firmware = fw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11771) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11772) 		if (demod->firmware->size < 2 * sizeof(u16)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11773) 			rc = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11774) 			pr_err("Firmware is too short!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11775) 			goto release;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11776) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11777) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11778) 		pr_info("Firmware %s, size %zu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11779) 			mc_file, demod->firmware->size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11780) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11781) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11782) 	mc_data_init = demod->firmware->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11783) 	size = demod->firmware->size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11784) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11785) 	mc_data = (void *)mc_data_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11786) 	/* Check data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11787) 	mc_magic_word = be16_to_cpu(*(__be16 *)(mc_data));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11788) 	mc_data += sizeof(u16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11789) 	mc_nr_of_blks = be16_to_cpu(*(__be16 *)(mc_data));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11790) 	mc_data += sizeof(u16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11791) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11792) 	if ((mc_magic_word != DRX_UCODE_MAGIC_WORD) || (mc_nr_of_blks == 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11793) 		rc = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11794) 		pr_err("Firmware magic word doesn't match\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11795) 		goto release;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11796) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11797) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11798) 	if (action == UCODE_UPLOAD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11799) 		rc = drx_check_firmware(demod, (u8 *)mc_data_init, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11800) 		if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11801) 			goto release;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11802) 		pr_info("Uploading firmware %s\n", mc_file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11803) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11804) 		pr_info("Verifying if firmware upload was ok.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11805) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11806) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11807) 	/* Process microcode blocks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11808) 	for (i = 0; i < mc_nr_of_blks; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11809) 		struct drxu_code_block_hdr block_hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11810) 		u16 mc_block_nr_bytes = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11811) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11812) 		/* Process block header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11813) 		block_hdr.addr = be32_to_cpu(*(__be32 *)(mc_data));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11814) 		mc_data += sizeof(u32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11815) 		block_hdr.size = be16_to_cpu(*(__be16 *)(mc_data));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11816) 		mc_data += sizeof(u16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11817) 		block_hdr.flags = be16_to_cpu(*(__be16 *)(mc_data));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11818) 		mc_data += sizeof(u16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11819) 		block_hdr.CRC = be16_to_cpu(*(__be16 *)(mc_data));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11820) 		mc_data += sizeof(u16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11821) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11822) 		pr_debug("%zd: addr %u, size %u, flags 0x%04x, CRC 0x%04x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11823) 			(mc_data - mc_data_init), block_hdr.addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11824) 			 block_hdr.size, block_hdr.flags, block_hdr.CRC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11825) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11826) 		/* Check block header on:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11827) 		   - data larger than 64Kb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11828) 		   - if CRC enabled check CRC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11829) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11830) 		if ((block_hdr.size > 0x7FFF) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11831) 		    (((block_hdr.flags & DRX_UCODE_CRC_FLAG) != 0) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11832) 		     (block_hdr.CRC != drx_u_code_compute_crc(mc_data, block_hdr.size)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11833) 		    ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11834) 			/* Wrong data ! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11835) 			rc = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11836) 			pr_err("firmware CRC is wrong\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11837) 			goto release;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11838) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11839) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11840) 		if (!block_hdr.size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11841) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11842) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11843) 		mc_block_nr_bytes = block_hdr.size * ((u16) sizeof(u16));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11844) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11845) 		/* Perform the desired action */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11846) 		switch (action) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11847) 		case UCODE_UPLOAD:	/* Upload microcode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11848) 			if (drxdap_fasi_write_block(dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11849) 							block_hdr.addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11850) 							mc_block_nr_bytes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11851) 							mc_data, 0x0000)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11852) 				rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11853) 				pr_err("error writing firmware at pos %zd\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11854) 				       mc_data - mc_data_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11855) 				goto release;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11856) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11857) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11858) 		case UCODE_VERIFY: {	/* Verify uploaded microcode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11859) 			int result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11860) 			u8 mc_data_buffer[DRX_UCODE_MAX_BUF_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11861) 			u32 bytes_to_comp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11862) 			u32 bytes_left = mc_block_nr_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11863) 			u32 curr_addr = block_hdr.addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11864) 			u8 *curr_ptr = mc_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11865) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11866) 			while (bytes_left != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11867) 				if (bytes_left > DRX_UCODE_MAX_BUF_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11868) 					bytes_to_comp = DRX_UCODE_MAX_BUF_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11869) 				else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11870) 					bytes_to_comp = bytes_left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11871) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11872) 				if (drxdap_fasi_read_block(dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11873) 						    curr_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11874) 						    (u16)bytes_to_comp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11875) 						    (u8 *)mc_data_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11876) 						    0x0000)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11877) 					pr_err("error reading firmware at pos %zd\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11878) 					       mc_data - mc_data_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11879) 					return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11880) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11881) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11882) 				result = memcmp(curr_ptr, mc_data_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11883) 						bytes_to_comp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11884) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11885) 				if (result) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11886) 					pr_err("error verifying firmware at pos %zd\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11887) 					       mc_data - mc_data_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11888) 					return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11889) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11890) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11891) 				curr_addr += ((dr_xaddr_t)(bytes_to_comp / 2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11892) 				curr_ptr =&(curr_ptr[bytes_to_comp]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11893) 				bytes_left -=((u32) bytes_to_comp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11894) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11895) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11896) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11897) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11898) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11899) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11900) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11901) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11902) 		mc_data += mc_block_nr_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11903) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11904) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11905) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11906) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11907) release:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11908) 	release_firmware(demod->firmware);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11909) 	demod->firmware = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11910) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11911) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11912) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11913) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11914) /* caller is expected to check if lna is supported before enabling */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11915) static int drxj_set_lna_state(struct drx_demod_instance *demod, bool state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11916) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11917) 	struct drxuio_cfg uio_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11918) 	struct drxuio_data uio_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11919) 	int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11920) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11921) 	uio_cfg.uio = DRX_UIO1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11922) 	uio_cfg.mode = DRX_UIO_MODE_READWRITE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11923) 	/* Configure user-I/O #3: enable read/write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11924) 	result = ctrl_set_uio_cfg(demod, &uio_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11925) 	if (result) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11926) 		pr_err("Failed to setup LNA GPIO!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11927) 		return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11928) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11929) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11930) 	uio_data.uio = DRX_UIO1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11931) 	uio_data.value = state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11932) 	result = ctrl_uio_write(demod, &uio_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11933) 	if (result != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11934) 		pr_err("Failed to %sable LNA!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11935) 		       state ? "en" : "dis");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11936) 		return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11937) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11938) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11939) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11940) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11941) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11942)  * The Linux DVB Driver for Micronas DRX39xx family (drx3933j)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11943)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11944)  * Written by Devin Heitmueller <devin.heitmueller@kernellabs.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11945)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11946) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11947) static int drx39xxj_set_powerstate(struct dvb_frontend *fe, int enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11948) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11949) 	struct drx39xxj_state *state = fe->demodulator_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11950) 	struct drx_demod_instance *demod = state->demod;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11951) 	int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11952) 	enum drx_power_mode power_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11953) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11954) 	if (enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11955) 		power_mode = DRX_POWER_UP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11956) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11957) 		power_mode = DRX_POWER_DOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11958) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11959) 	result = ctrl_power_mode(demod, &power_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11960) 	if (result != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11961) 		pr_err("Power state change failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11962) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11963) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11964) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11965) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11966) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11967) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11968) static int drx39xxj_read_status(struct dvb_frontend *fe, enum fe_status *status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11969) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11970) 	struct drx39xxj_state *state = fe->demodulator_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11971) 	struct drx_demod_instance *demod = state->demod;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11972) 	int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11973) 	enum drx_lock_status lock_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11974) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11975) 	*status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11976) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11977) 	result = ctrl_lock_status(demod, &lock_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11978) 	if (result != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11979) 		pr_err("drx39xxj: could not get lock status!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11980) 		*status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11981) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11982) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11983) 	switch (lock_status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11984) 	case DRX_NEVER_LOCK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11985) 		*status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11986) 		pr_err("drx says NEVER_LOCK\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11987) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11988) 	case DRX_NOT_LOCKED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11989) 		*status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11990) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11991) 	case DRX_LOCK_STATE_1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11992) 	case DRX_LOCK_STATE_2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11993) 	case DRX_LOCK_STATE_3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11994) 	case DRX_LOCK_STATE_4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11995) 	case DRX_LOCK_STATE_5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11996) 	case DRX_LOCK_STATE_6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11997) 	case DRX_LOCK_STATE_7:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11998) 	case DRX_LOCK_STATE_8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11999) 	case DRX_LOCK_STATE_9:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12000) 		*status = FE_HAS_SIGNAL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12001) 		    | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12002) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12003) 	case DRX_LOCKED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12004) 		*status = FE_HAS_SIGNAL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12005) 		    | FE_HAS_CARRIER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12006) 		    | FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12007) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12008) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12009) 		pr_err("Lock state unknown %d\n", lock_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12010) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12011) 	ctrl_sig_quality(demod, lock_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12012) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12013) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12014) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12015) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12016) static int drx39xxj_read_ber(struct dvb_frontend *fe, u32 *ber)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12017) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12018) 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12019) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12020) 	if (p->pre_bit_error.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12021) 		*ber = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12022) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12023) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12024) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12025) 	if (!p->pre_bit_count.stat[0].uvalue) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12026) 		if (!p->pre_bit_error.stat[0].uvalue)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12027) 			*ber = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12028) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12029) 			*ber = 1000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12030) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12031) 		*ber = frac_times1e6(p->pre_bit_error.stat[0].uvalue,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12032) 				     p->pre_bit_count.stat[0].uvalue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12033) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12034) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12035) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12036) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12037) static int drx39xxj_read_signal_strength(struct dvb_frontend *fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12038) 					 u16 *strength)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12039) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12040) 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12041) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12042) 	if (p->strength.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12043) 		*strength = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12044) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12045) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12046) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12047) 	*strength = p->strength.stat[0].uvalue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12048) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12049) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12050) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12051) static int drx39xxj_read_snr(struct dvb_frontend *fe, u16 *snr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12052) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12053) 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12054) 	u64 tmp64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12055) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12056) 	if (p->cnr.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12057) 		*snr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12058) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12059) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12060) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12061) 	tmp64 = p->cnr.stat[0].svalue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12062) 	do_div(tmp64, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12063) 	*snr = tmp64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12064) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12065) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12066) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12067) static int drx39xxj_read_ucblocks(struct dvb_frontend *fe, u32 *ucb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12068) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12069) 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12070) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12071) 	if (p->block_error.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12072) 		*ucb = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12073) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12074) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12075) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12076) 	*ucb = p->block_error.stat[0].uvalue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12077) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12078) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12079) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12080) static int drx39xxj_set_frontend(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12081) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12082) #ifdef DJH_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12083) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12084) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12085) 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12086) 	struct drx39xxj_state *state = fe->demodulator_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12087) 	struct drx_demod_instance *demod = state->demod;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12088) 	enum drx_standard standard = DRX_STANDARD_8VSB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12089) 	struct drx_channel channel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12090) 	int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12091) 	static const struct drx_channel def_channel = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12092) 		/* frequency      */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12093) 		/* bandwidth      */ DRX_BANDWIDTH_6MHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12094) 		/* mirror         */ DRX_MIRROR_NO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12095) 		/* constellation  */ DRX_CONSTELLATION_AUTO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12096) 		/* hierarchy      */ DRX_HIERARCHY_UNKNOWN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12097) 		/* priority       */ DRX_PRIORITY_UNKNOWN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12098) 		/* coderate       */ DRX_CODERATE_UNKNOWN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12099) 		/* guard          */ DRX_GUARD_UNKNOWN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12100) 		/* fftmode        */ DRX_FFTMODE_UNKNOWN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12101) 		/* classification */ DRX_CLASSIFICATION_AUTO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12102) 		/* symbolrate     */ 5057000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12103) 		/* interleavemode */ DRX_INTERLEAVEMODE_UNKNOWN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12104) 		/* ldpc           */ DRX_LDPC_UNKNOWN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12105) 		/* carrier        */ DRX_CARRIER_UNKNOWN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12106) 		/* frame mode     */ DRX_FRAMEMODE_UNKNOWN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12107) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12108) 	u32 constellation = DRX_CONSTELLATION_AUTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12109) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12110) 	/* Bring the demod out of sleep */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12111) 	drx39xxj_set_powerstate(fe, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12112) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12113) 	if (fe->ops.tuner_ops.set_params) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12114) 		u32 int_freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12115) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12116) 		if (fe->ops.i2c_gate_ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12117) 			fe->ops.i2c_gate_ctrl(fe, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12119) 		/* Set tuner to desired frequency and standard */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12120) 		fe->ops.tuner_ops.set_params(fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12121) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12122) 		/* Use the tuner's IF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12123) 		if (fe->ops.tuner_ops.get_if_frequency) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12124) 			fe->ops.tuner_ops.get_if_frequency(fe, &int_freq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12125) 			demod->my_common_attr->intermediate_freq = int_freq / 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12126) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12127) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12128) 		if (fe->ops.i2c_gate_ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12129) 			fe->ops.i2c_gate_ctrl(fe, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12130) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12131) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12132) 	switch (p->delivery_system) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12133) 	case SYS_ATSC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12134) 		standard = DRX_STANDARD_8VSB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12135) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12136) 	case SYS_DVBC_ANNEX_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12137) 		standard = DRX_STANDARD_ITU_B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12138) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12139) 		switch (p->modulation) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12140) 		case QAM_64:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12141) 			constellation = DRX_CONSTELLATION_QAM64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12142) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12143) 		case QAM_256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12144) 			constellation = DRX_CONSTELLATION_QAM256;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12145) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12146) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12147) 			constellation = DRX_CONSTELLATION_AUTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12148) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12149) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12150) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12151) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12152) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12153) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12154) 	/* Set the standard (will be powered up if necessary */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12155) 	result = ctrl_set_standard(demod, &standard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12156) 	if (result != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12157) 		pr_err("Failed to set standard! result=%02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12158) 			result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12159) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12160) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12161) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12162) 	/* set channel parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12163) 	channel = def_channel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12164) 	channel.frequency = p->frequency / 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12165) 	channel.bandwidth = DRX_BANDWIDTH_6MHZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12166) 	channel.constellation = constellation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12167) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12168) 	/* program channel */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12169) 	result = ctrl_set_channel(demod, &channel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12170) 	if (result != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12171) 		pr_err("Failed to set channel!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12172) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12173) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12174) 	/* Just for giggles, let's shut off the LNA again.... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12175) 	drxj_set_lna_state(demod, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12176) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12177) 	/* After set_frontend, except for strength, stats aren't available */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12178) 	p->strength.stat[0].scale = FE_SCALE_RELATIVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12179) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12180) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12181) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12182) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12183) static int drx39xxj_sleep(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12184) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12185) 	/* power-down the demodulator */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12186) 	return drx39xxj_set_powerstate(fe, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12187) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12188) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12189) static int drx39xxj_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12190) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12191) 	struct drx39xxj_state *state = fe->demodulator_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12192) 	struct drx_demod_instance *demod = state->demod;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12193) 	bool i2c_gate_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12194) 	int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12195) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12196) #ifdef DJH_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12197) 	pr_debug("i2c gate call: enable=%d state=%d\n", enable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12198) 	       state->i2c_gate_open);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12199) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12200) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12201) 	if (enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12202) 		i2c_gate_state = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12203) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12204) 		i2c_gate_state = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12205) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12206) 	if (state->i2c_gate_open == enable) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12207) 		/* We're already in the desired state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12208) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12209) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12210) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12211) 	result = ctrl_i2c_bridge(demod, &i2c_gate_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12212) 	if (result != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12213) 		pr_err("drx39xxj: could not open i2c gate [%d]\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12214) 		       result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12215) 		dump_stack();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12216) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12217) 		state->i2c_gate_open = enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12218) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12219) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12220) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12221) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12222) static int drx39xxj_init(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12223) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12224) 	struct drx39xxj_state *state = fe->demodulator_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12225) 	struct drx_demod_instance *demod = state->demod;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12226) 	int rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12227) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12228) 	if (fe->exit == DVB_FE_DEVICE_RESUME) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12229) 		/* so drxj_open() does what it needs to do */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12230) 		demod->my_common_attr->is_opened = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12231) 		rc = drxj_open(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12232) 		if (rc != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12233) 			pr_err("drx39xxj_init(): DRX open failed rc=%d!\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12234) 	} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12235) 		drx39xxj_set_powerstate(fe, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12236) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12237) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12238) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12239) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12240) static int drx39xxj_set_lna(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12241) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12242) 	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12243) 	struct drx39xxj_state *state = fe->demodulator_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12244) 	struct drx_demod_instance *demod = state->demod;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12245) 	struct drxj_data *ext_attr = demod->my_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12246) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12247) 	if (c->lna) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12248) 		if (!ext_attr->has_lna) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12249) 			pr_err("LNA is not supported on this device!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12250) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12251) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12252) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12253) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12254) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12255) 	return drxj_set_lna_state(demod, c->lna);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12257) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12258) static int drx39xxj_get_tune_settings(struct dvb_frontend *fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12259) 				      struct dvb_frontend_tune_settings *tune)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12260) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12261) 	tune->min_delay_ms = 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12262) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12263) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12264) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12265) static void drx39xxj_release(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12266) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12267) 	struct drx39xxj_state *state = fe->demodulator_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12268) 	struct drx_demod_instance *demod = state->demod;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12269) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12270) 	/* if device is removed don't access it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12271) 	if (fe->exit != DVB_FE_DEVICE_REMOVED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12272) 		drxj_close(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12273) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12274) 	kfree(demod->my_ext_attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12275) 	kfree(demod->my_common_attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12276) 	kfree(demod->my_i2c_dev_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12277) 	release_firmware(demod->firmware);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12278) 	kfree(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12279) 	kfree(state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12280) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12281) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12282) static const struct dvb_frontend_ops drx39xxj_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12283) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12284) struct dvb_frontend *drx39xxj_attach(struct i2c_adapter *i2c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12285) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12286) 	struct drx39xxj_state *state = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12287) 	struct i2c_device_addr *demod_addr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12288) 	struct drx_common_attr *demod_comm_attr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12289) 	struct drxj_data *demod_ext_attr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12290) 	struct drx_demod_instance *demod = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12291) 	struct dtv_frontend_properties *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12292) 	int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12293) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12294) 	/* allocate memory for the internal state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12295) 	state = kzalloc(sizeof(struct drx39xxj_state), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12296) 	if (state == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12297) 		goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12298) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12299) 	demod = kmemdup(&drxj_default_demod_g,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12300) 			sizeof(struct drx_demod_instance), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12301) 	if (demod == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12302) 		goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12303) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12304) 	demod_addr = kmemdup(&drxj_default_addr_g,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12305) 			     sizeof(struct i2c_device_addr), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12306) 	if (demod_addr == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12307) 		goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12308) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12309) 	demod_comm_attr = kmemdup(&drxj_default_comm_attr_g,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12310) 				  sizeof(struct drx_common_attr), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12311) 	if (demod_comm_attr == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12312) 		goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12313) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12314) 	demod_ext_attr = kmemdup(&drxj_data_g, sizeof(struct drxj_data),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12315) 				 GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12316) 	if (demod_ext_attr == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12317) 		goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12318) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12319) 	/* setup the state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12320) 	state->i2c = i2c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12321) 	state->demod = demod;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12322) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12323) 	/* setup the demod data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12324) 	demod->my_i2c_dev_addr = demod_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12325) 	demod->my_common_attr = demod_comm_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12326) 	demod->my_i2c_dev_addr->user_data = state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12327) 	demod->my_common_attr->microcode_file = DRX39XX_MAIN_FIRMWARE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12328) 	demod->my_common_attr->verify_microcode = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12329) 	demod->my_common_attr->intermediate_freq = 5000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12330) 	demod->my_common_attr->current_power_mode = DRX_POWER_DOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12331) 	demod->my_ext_attr = demod_ext_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12332) 	((struct drxj_data *)demod_ext_attr)->uio_sma_tx_mode = DRX_UIO_MODE_READWRITE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12333) 	demod->i2c = i2c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12334) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12335) 	result = drxj_open(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12336) 	if (result != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12337) 		pr_err("DRX open failed!  Aborting\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12338) 		goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12339) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12340) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12341) 	/* create dvb_frontend */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12342) 	memcpy(&state->frontend.ops, &drx39xxj_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12343) 	       sizeof(struct dvb_frontend_ops));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12344) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12345) 	state->frontend.demodulator_priv = state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12346) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12347) 	/* Initialize stats - needed for DVBv5 stats to work */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12348) 	p = &state->frontend.dtv_property_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12349) 	p->strength.len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12350) 	p->pre_bit_count.len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12351) 	p->pre_bit_error.len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12352) 	p->post_bit_count.len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12353) 	p->post_bit_error.len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12354) 	p->block_count.len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12355) 	p->block_error.len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12356) 	p->cnr.len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12357) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12358) 	p->strength.stat[0].scale = FE_SCALE_RELATIVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12359) 	p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12360) 	p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12361) 	p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12362) 	p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12363) 	p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12364) 	p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12365) 	p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12366) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12367) 	return &state->frontend;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12368) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12369) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12370) 	kfree(demod_ext_attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12371) 	kfree(demod_comm_attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12372) 	kfree(demod_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12373) 	kfree(demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12374) 	kfree(state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12375) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12376) 	return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12377) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12378) EXPORT_SYMBOL(drx39xxj_attach);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12379) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12380) static const struct dvb_frontend_ops drx39xxj_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12381) 	.delsys = { SYS_ATSC, SYS_DVBC_ANNEX_B },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12382) 	.info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12383) 		 .name = "Micronas DRX39xxj family Frontend",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12384) 		 .frequency_min_hz =  51 * MHz,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12385) 		 .frequency_max_hz = 858 * MHz,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12386) 		 .frequency_stepsize_hz = 62500,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12387) 		 .caps = FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_8VSB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12388) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12389) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12390) 	.init = drx39xxj_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12391) 	.i2c_gate_ctrl = drx39xxj_i2c_gate_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12392) 	.sleep = drx39xxj_sleep,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12393) 	.set_frontend = drx39xxj_set_frontend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12394) 	.get_tune_settings = drx39xxj_get_tune_settings,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12395) 	.read_status = drx39xxj_read_status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12396) 	.read_ber = drx39xxj_read_ber,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12397) 	.read_signal_strength = drx39xxj_read_signal_strength,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12398) 	.read_snr = drx39xxj_read_snr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12399) 	.read_ucblocks = drx39xxj_read_ucblocks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12400) 	.release = drx39xxj_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12401) 	.set_lna = drx39xxj_set_lna,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12402) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12403) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12404) MODULE_DESCRIPTION("Micronas DRX39xxj Frontend");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12405) MODULE_AUTHOR("Devin Heitmueller");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12406) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12407) MODULE_FIRMWARE(DRX39XX_MAIN_FIRMWARE);