// SPDX-License-Identifier: GPL-2.0
/******************************************************************************
 *
 * Copyright(c) 2007 - 2016  Realtek Corporation.
 *
 * Contact Information:
 * wlanfae <wlanfae@realtek.com>
 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
 * Hsinchu 300, Taiwan.
 *
 * Larry Finger <Larry.Finger@lwfinger.net>
 *
 *****************************************************************************/

/*Image2HeaderVersion: 3.2*/
#include "../mp_precomp.h"
#include "../phydm_precomp.h"
#include <linux/kernel.h>

static bool check_positive(struct phy_dm_struct *dm, const u32 condition1,
			   const u32 condition2, const u32 condition3,
			   const u32 condition4)
{
	u8 _board_type = ((dm->board_type & BIT(4)) >> 4) << 0 | /* _GLNA*/
			 ((dm->board_type & BIT(3)) >> 3) << 1 | /* _GPA*/
			 ((dm->board_type & BIT(7)) >> 7) << 2 | /* _ALNA*/
			 ((dm->board_type & BIT(6)) >> 6) << 3 | /* _APA */
			 ((dm->board_type & BIT(2)) >> 2) << 4; /* _BT*/

	u32 cond1 = condition1, cond2 = condition2, cond3 = condition3,
	    cond4 = condition4;

	u8 cut_version_for_para =
		(dm->cut_version == ODM_CUT_A) ? 14 : dm->cut_version;
	u8 pkg_type_for_para = (dm->package_type == 0) ? 14 : dm->package_type;

	u32 driver1 = cut_version_for_para << 24 |
		      (dm->support_interface & 0xF0) << 16 |
		      dm->support_platform << 16 | pkg_type_for_para << 12 |
		      (dm->support_interface & 0x0F) << 8 | _board_type;

	u32 driver2 = (dm->type_glna & 0xFF) << 0 | (dm->type_gpa & 0xFF) << 8 |
		      (dm->type_alna & 0xFF) << 16 |
		      (dm->type_apa & 0xFF) << 24;

	u32 driver3 = 0;

	u32 driver4 = (dm->type_glna & 0xFF00) >> 8 | (dm->type_gpa & 0xFF00) |
		      (dm->type_alna & 0xFF00) << 8 |
		      (dm->type_apa & 0xFF00) << 16;

	ODM_RT_TRACE(
		dm, ODM_COMP_INIT,
		"===> %s (cond1, cond2, cond3, cond4) = (0x%X 0x%X 0x%X 0x%X)\n",
		__func__, cond1, cond2, cond3, cond4);
	ODM_RT_TRACE(
		dm, ODM_COMP_INIT,
		"===> %s (driver1, driver2, driver3, driver4) = (0x%X 0x%X 0x%X 0x%X)\n",
		__func__, driver1, driver2, driver3, driver4);

	ODM_RT_TRACE(dm, ODM_COMP_INIT,
		     "	(Platform, Interface) = (0x%X, 0x%X)\n",
		     dm->support_platform, dm->support_interface);
	ODM_RT_TRACE(dm, ODM_COMP_INIT,
		     "	(Board, Package) = (0x%X, 0x%X)\n",
		     dm->board_type, dm->package_type);

	/*============== value Defined Check ===============*/
	/*QFN type [15:12] and cut version [27:24] need to do value check*/

	if (((cond1 & 0x0000F000) != 0) &&
	    ((cond1 & 0x0000F000) != (driver1 & 0x0000F000)))
		return false;
	if (((cond1 & 0x0F000000) != 0) &&
	    ((cond1 & 0x0F000000) != (driver1 & 0x0F000000)))
		return false;

	/*=============== Bit Defined Check ================*/
	/* We don't care [31:28] */

	cond1 &= 0x00FF0FFF;
	driver1 &= 0x00FF0FFF;

	if ((cond1 & driver1) == cond1) {
		u32 bit_mask = 0;

		if ((cond1 & 0x0F) == 0) /* board_type is DONTCARE*/
			return true;

		if ((cond1 & BIT(0)) != 0) /*GLNA*/
			bit_mask |= 0x000000FF;
		if ((cond1 & BIT(1)) != 0) /*GPA*/
			bit_mask |= 0x0000FF00;
		if ((cond1 & BIT(2)) != 0) /*ALNA*/
			bit_mask |= 0x00FF0000;
		if ((cond1 & BIT(3)) != 0) /*APA*/
			bit_mask |= 0xFF000000;

		if (((cond2 & bit_mask) == (driver2 & bit_mask)) &&
		    ((cond4 & bit_mask) ==
		     (driver4 &
		      bit_mask))) /* board_type of each RF path is matched*/
			return true;
		else
			return false;
	} else {
		return false;
	}
}

/******************************************************************************
 *                           mac_reg.TXT
 ******************************************************************************/

static u32 array_mp_8822b_mac_reg[] = {
	0x029,  0x000000F9, 0x420,  0x00000080, 0x421,  0x0000000F,
	0x428,  0x0000000A, 0x429,  0x00000010, 0x430,  0x00000000,
	0x431,  0x00000000, 0x432,  0x00000000, 0x433,  0x00000001,
	0x434,  0x00000004, 0x435,  0x00000005, 0x436,  0x00000007,
	0x437,  0x00000008, 0x43C,  0x00000004, 0x43D,  0x00000005,
	0x43E,  0x00000007, 0x43F,  0x00000008, 0x440,  0x0000005D,
	0x441,  0x00000001, 0x442,  0x00000000, 0x444,  0x00000010,
	0x445,  0x000000F0, 0x446,  0x00000001, 0x447,  0x000000FE,
	0x448,  0x00000000, 0x449,  0x00000000, 0x44A,  0x00000000,
	0x44B,  0x00000040, 0x44C,  0x00000010, 0x44D,  0x000000F0,
	0x44E,  0x0000003F, 0x44F,  0x00000000, 0x450,  0x00000000,
	0x451,  0x00000000, 0x452,  0x00000000, 0x453,  0x00000040,
	0x455,  0x00000070, 0x45E,  0x00000004, 0x49C,  0x00000010,
	0x49D,  0x000000F0, 0x49E,  0x00000000, 0x49F,  0x00000006,
	0x4A0,  0x000000E0, 0x4A1,  0x00000003, 0x4A2,  0x00000000,
	0x4A3,  0x00000040, 0x4A4,  0x00000015, 0x4A5,  0x000000F0,
	0x4A6,  0x00000000, 0x4A7,  0x00000006, 0x4A8,  0x000000E0,
	0x4A9,  0x00000000, 0x4AA,  0x00000000, 0x4AB,  0x00000000,
	0x7DA,  0x00000008, 0x1448, 0x00000006, 0x144A, 0x00000006,
	0x144C, 0x00000006, 0x144E, 0x00000006, 0x4C8,  0x000000FF,
	0x4C9,  0x00000008, 0x4CA,  0x00000020, 0x4CB,  0x00000020,
	0x4CC,  0x000000FF, 0x4CD,  0x000000FF, 0x4CE,  0x00000001,
	0x4CF,  0x00000008, 0x500,  0x00000026, 0x501,  0x000000A2,
	0x502,  0x0000002F, 0x503,  0x00000000, 0x504,  0x00000028,
	0x505,  0x000000A3, 0x506,  0x0000005E, 0x507,  0x00000000,
	0x508,  0x0000002B, 0x509,  0x000000A4, 0x50A,  0x0000005E,
	0x50B,  0x00000000, 0x50C,  0x0000004F, 0x50D,  0x000000A4,
	0x50E,  0x00000000, 0x50F,  0x00000000, 0x512,  0x0000001C,
	0x514,  0x0000000A, 0x516,  0x0000000A, 0x521,  0x0000002F,
	0x525,  0x0000004F, 0x551,  0x00000010, 0x559,  0x00000002,
	0x55C,  0x00000050, 0x55D,  0x000000FF, 0x577,  0x0000000B,
	0x5BE,  0x00000064, 0x605,  0x00000030, 0x608,  0x0000000E,
	0x609,  0x00000022, 0x60C,  0x00000018, 0x6A0,  0x000000FF,
	0x6A1,  0x000000FF, 0x6A2,  0x000000FF, 0x6A3,  0x000000FF,
	0x6A4,  0x000000FF, 0x6A5,  0x000000FF, 0x6DE,  0x00000084,
	0x620,  0x000000FF, 0x621,  0x000000FF, 0x622,  0x000000FF,
	0x623,  0x000000FF, 0x624,  0x000000FF, 0x625,  0x000000FF,
	0x626,  0x000000FF, 0x627,  0x000000FF, 0x638,  0x00000050,
	0x63C,  0x0000000A, 0x63D,  0x0000000A, 0x63E,  0x0000000E,
	0x63F,  0x0000000E, 0x640,  0x00000040, 0x642,  0x00000040,
	0x643,  0x00000000, 0x652,  0x000000C8, 0x66E,  0x00000005,
	0x718,  0x00000040, 0x7D4,  0x00000098,

};

void odm_read_and_config_mp_8822b_mac_reg(struct phy_dm_struct *dm)
{
	u32 i = 0;
	u8 c_cond;
	bool is_matched = true, is_skipped = false;
	u32 *array = array_mp_8822b_mac_reg;

	u32 v1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0;

	ODM_RT_TRACE(dm, ODM_COMP_INIT,
		     "===> %s\n", __func__);

	for (; (i + 1) < ARRAY_SIZE(array_mp_8822b_mac_reg); i = i + 2) {
		v1 = array[i];
		v2 = array[i + 1];

		if (v1 & BIT(31)) { /* positive condition*/
			c_cond = (u8)((v1 & (BIT(29) | BIT(28))) >> 28);
			if (c_cond == COND_ENDIF) { /*end*/
				is_matched = true;
				is_skipped = false;
				ODM_RT_TRACE(dm, ODM_COMP_INIT, "ENDIF\n");
			} else if (c_cond == COND_ELSE) { /*else*/
				is_matched = is_skipped ? false : true;
				ODM_RT_TRACE(dm, ODM_COMP_INIT, "ELSE\n");
			} else { /*if , else if*/
				pre_v1 = v1;
				pre_v2 = v2;
				ODM_RT_TRACE(dm, ODM_COMP_INIT,
					     "IF or ELSE IF\n");
			}
		} else if (v1 & BIT(30)) { /*negative condition*/
			if (is_skipped) {
				is_matched = false;
				continue;
			}

			if (check_positive(dm, pre_v1, pre_v2, v1, v2)) {
				is_matched = true;
				is_skipped = true;
			} else {
				is_matched = false;
				is_skipped = false;
			}
		} else if (is_matched) {
			odm_config_mac_8822b(dm, v1, (u8)v2);
		}
	}
}

u32 odm_get_version_mp_8822b_mac_reg(void) { return 67; }
