/*
 * (c) Copyright 2002-2010, Ralink Technology, Inc.
 * Copyright (C) 2015 Jakub Kicinski <kubakici@wp.pl>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2
 * as published by the Free Software Foundation
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

#ifndef __MT7601U_PHY_INITVALS_H
#define __MT7601U_PHY_INITVALS_H

#define RF_REG_PAIR(bank, reg, value)				\
	{ MT_MCU_MEMMAP_RF | (bank) << 16 | (reg), value }

static const struct mt76_reg_pair rf_central[] = {
	/* Bank 0 - for central blocks: BG, PLL, XTAL, LO, ADC/DAC */
	RF_REG_PAIR(0,	 0, 0x02),
	RF_REG_PAIR(0,	 1, 0x01),
	RF_REG_PAIR(0,	 2, 0x11),
	RF_REG_PAIR(0,	 3, 0xff),
	RF_REG_PAIR(0,	 4, 0x0a),
	RF_REG_PAIR(0,	 5, 0x20),
	RF_REG_PAIR(0,	 6, 0x00),
	/* B/G */
	RF_REG_PAIR(0,	 7, 0x00),
	RF_REG_PAIR(0,	 8, 0x00),
	RF_REG_PAIR(0,	 9, 0x00),
	RF_REG_PAIR(0,	10, 0x00),
	RF_REG_PAIR(0,	11, 0x21),
	/* XO */
	RF_REG_PAIR(0,	13, 0x00),		/* 40mhz xtal */
	/* RF_REG_PAIR(0,	13, 0x13), */	/* 20mhz xtal */
	RF_REG_PAIR(0,	14, 0x7c),
	RF_REG_PAIR(0,	15, 0x22),
	RF_REG_PAIR(0,	16, 0x80),
	/* PLL */
	RF_REG_PAIR(0,	17, 0x99),
	RF_REG_PAIR(0,	18, 0x99),
	RF_REG_PAIR(0,	19, 0x09),
	RF_REG_PAIR(0,	20, 0x50),
	RF_REG_PAIR(0,	21, 0xb0),
	RF_REG_PAIR(0,	22, 0x00),
	RF_REG_PAIR(0,	23, 0xc5),
	RF_REG_PAIR(0,	24, 0xfc),
	RF_REG_PAIR(0,	25, 0x40),
	RF_REG_PAIR(0,	26, 0x4d),
	RF_REG_PAIR(0,	27, 0x02),
	RF_REG_PAIR(0,	28, 0x72),
	RF_REG_PAIR(0,	29, 0x01),
	RF_REG_PAIR(0,	30, 0x00),
	RF_REG_PAIR(0,	31, 0x00),
	/* test ports */
	RF_REG_PAIR(0,	32, 0x00),
	RF_REG_PAIR(0,	33, 0x00),
	RF_REG_PAIR(0,	34, 0x23),
	RF_REG_PAIR(0,	35, 0x01), /* change setting to reduce spurs */
	RF_REG_PAIR(0,	36, 0x00),
	RF_REG_PAIR(0,	37, 0x00),
	/* ADC/DAC */
	RF_REG_PAIR(0,	38, 0x00),
	RF_REG_PAIR(0,	39, 0x20),
	RF_REG_PAIR(0,	40, 0x00),
	RF_REG_PAIR(0,	41, 0xd0),
	RF_REG_PAIR(0,	42, 0x1b),
	RF_REG_PAIR(0,	43, 0x02),
	RF_REG_PAIR(0,	44, 0x00),
};

static const struct mt76_reg_pair rf_channel[] = {
	RF_REG_PAIR(4,	 0, 0x01),
	RF_REG_PAIR(4,	 1, 0x00),
	RF_REG_PAIR(4,	 2, 0x00),
	RF_REG_PAIR(4,	 3, 0x00),
	/* LDO */
	RF_REG_PAIR(4,	 4, 0x00),
	RF_REG_PAIR(4,	 5, 0x08),
	RF_REG_PAIR(4,	 6, 0x00),
	/* RX */
	RF_REG_PAIR(4,	 7, 0x5b),
	RF_REG_PAIR(4,	 8, 0x52),
	RF_REG_PAIR(4,	 9, 0xb6),
	RF_REG_PAIR(4,	10, 0x57),
	RF_REG_PAIR(4,	11, 0x33),
	RF_REG_PAIR(4,	12, 0x22),
	RF_REG_PAIR(4,	13, 0x3d),
	RF_REG_PAIR(4,	14, 0x3e),
	RF_REG_PAIR(4,	15, 0x13),
	RF_REG_PAIR(4,	16, 0x22),
	RF_REG_PAIR(4,	17, 0x23),
	RF_REG_PAIR(4,	18, 0x02),
	RF_REG_PAIR(4,	19, 0xa4),
	RF_REG_PAIR(4,	20, 0x01),
	RF_REG_PAIR(4,	21, 0x12),
	RF_REG_PAIR(4,	22, 0x80),
	RF_REG_PAIR(4,	23, 0xb3),
	RF_REG_PAIR(4,	24, 0x00), /* reserved */
	RF_REG_PAIR(4,	25, 0x00), /* reserved */
	RF_REG_PAIR(4,	26, 0x00), /* reserved */
	RF_REG_PAIR(4,	27, 0x00), /* reserved */
	/* LOGEN */
	RF_REG_PAIR(4,	28, 0x18),
	RF_REG_PAIR(4,	29, 0xee),
	RF_REG_PAIR(4,	30, 0x6b),
	RF_REG_PAIR(4,	31, 0x31),
	RF_REG_PAIR(4,	32, 0x5d),
	RF_REG_PAIR(4,	33, 0x00), /* reserved */
	/* TX */
	RF_REG_PAIR(4,	34, 0x96),
	RF_REG_PAIR(4,	35, 0x55),
	RF_REG_PAIR(4,	36, 0x08),
	RF_REG_PAIR(4,	37, 0xbb),
	RF_REG_PAIR(4,	38, 0xb3),
	RF_REG_PAIR(4,	39, 0xb3),
	RF_REG_PAIR(4,	40, 0x03),
	RF_REG_PAIR(4,	41, 0x00), /* reserved */
	RF_REG_PAIR(4,	42, 0x00), /* reserved */
	RF_REG_PAIR(4,	43, 0xc5),
	RF_REG_PAIR(4,	44, 0xc5),
	RF_REG_PAIR(4,	45, 0xc5),
	RF_REG_PAIR(4,	46, 0x07),
	RF_REG_PAIR(4,	47, 0xa8),
	RF_REG_PAIR(4,	48, 0xef),
	RF_REG_PAIR(4,	49, 0x1a),
	/* PA */
	RF_REG_PAIR(4,	54, 0x07),
	RF_REG_PAIR(4,	55, 0xa7),
	RF_REG_PAIR(4,	56, 0xcc),
	RF_REG_PAIR(4,	57, 0x14),
	RF_REG_PAIR(4,	58, 0x07),
	RF_REG_PAIR(4,	59, 0xa8),
	RF_REG_PAIR(4,	60, 0xd7),
	RF_REG_PAIR(4,	61, 0x10),
	RF_REG_PAIR(4,	62, 0x1c),
	RF_REG_PAIR(4,	63, 0x00), /* reserved */
};

static const struct mt76_reg_pair rf_vga[] = {
	RF_REG_PAIR(5,	 0, 0x47),
	RF_REG_PAIR(5,	 1, 0x00),
	RF_REG_PAIR(5,	 2, 0x00),
	RF_REG_PAIR(5,	 3, 0x08),
	RF_REG_PAIR(5,	 4, 0x04),
	RF_REG_PAIR(5,	 5, 0x20),
	RF_REG_PAIR(5,	 6, 0x3a),
	RF_REG_PAIR(5,	 7, 0x3a),
	RF_REG_PAIR(5,	 8, 0x00),
	RF_REG_PAIR(5,	 9, 0x00),
	RF_REG_PAIR(5,	10, 0x10),
	RF_REG_PAIR(5,	11, 0x10),
	RF_REG_PAIR(5,	12, 0x10),
	RF_REG_PAIR(5,	13, 0x10),
	RF_REG_PAIR(5,	14, 0x10),
	RF_REG_PAIR(5,	15, 0x20),
	RF_REG_PAIR(5,	16, 0x22),
	RF_REG_PAIR(5,	17, 0x7c),
	RF_REG_PAIR(5,	18, 0x00),
	RF_REG_PAIR(5,	19, 0x00),
	RF_REG_PAIR(5,	20, 0x00),
	RF_REG_PAIR(5,	21, 0xf1),
	RF_REG_PAIR(5,	22, 0x11),
	RF_REG_PAIR(5,	23, 0x02),
	RF_REG_PAIR(5,	24, 0x41),
	RF_REG_PAIR(5,	25, 0x20),
	RF_REG_PAIR(5,	26, 0x00),
	RF_REG_PAIR(5,	27, 0xd7),
	RF_REG_PAIR(5,	28, 0xa2),
	RF_REG_PAIR(5,	29, 0x20),
	RF_REG_PAIR(5,	30, 0x49),
	RF_REG_PAIR(5,	31, 0x20),
	RF_REG_PAIR(5,	32, 0x04),
	RF_REG_PAIR(5,	33, 0xf1),
	RF_REG_PAIR(5,	34, 0xa1),
	RF_REG_PAIR(5,	35, 0x01),
	RF_REG_PAIR(5,	41, 0x00),
	RF_REG_PAIR(5,	42, 0x00),
	RF_REG_PAIR(5,	43, 0x00),
	RF_REG_PAIR(5,	44, 0x00),
	RF_REG_PAIR(5,	45, 0x00),
	RF_REG_PAIR(5,	46, 0x00),
	RF_REG_PAIR(5,	47, 0x00),
	RF_REG_PAIR(5,	48, 0x00),
	RF_REG_PAIR(5,	49, 0x00),
	RF_REG_PAIR(5,	50, 0x00),
	RF_REG_PAIR(5,	51, 0x00),
	RF_REG_PAIR(5,	52, 0x00),
	RF_REG_PAIR(5,	53, 0x00),
	RF_REG_PAIR(5,	54, 0x00),
	RF_REG_PAIR(5,	55, 0x00),
	RF_REG_PAIR(5,	56, 0x00),
	RF_REG_PAIR(5,	57, 0x00),
	RF_REG_PAIR(5,	58, 0x31),
	RF_REG_PAIR(5,	59, 0x31),
	RF_REG_PAIR(5,	60, 0x0a),
	RF_REG_PAIR(5,	61, 0x02),
	RF_REG_PAIR(5,	62, 0x00),
	RF_REG_PAIR(5,	63, 0x00),
};

/* TODO: BBP178 is set to 0xff for "CCK CH14 OBW" which overrides the settings
 *	 from channel switching. Seems stupid at best.
 */
static const struct mt76_reg_pair bbp_high_temp[] = {
	{  75, 0x60 },
	{  92, 0x02 },
	{ 178, 0xff }, /* For CCK CH14 OBW */
	{ 195, 0x88 }, { 196, 0x60 },
}, bbp_high_temp_bw20[] = {
	{  69, 0x12 },
	{  91, 0x07 },
	{ 195, 0x23 }, { 196, 0x17 },
	{ 195, 0x24 }, { 196, 0x06 },
	{ 195, 0x81 }, { 196, 0x12 },
	{ 195, 0x83 }, { 196, 0x17 },
}, bbp_high_temp_bw40[] = {
	{  69, 0x15 },
	{  91, 0x04 },
	{ 195, 0x23 }, { 196, 0x12 },
	{ 195, 0x24 }, { 196, 0x08 },
	{ 195, 0x81 }, { 196, 0x15 },
	{ 195, 0x83 }, { 196, 0x16 },
}, bbp_low_temp[] = {
	{ 178, 0xff }, /* For CCK CH14 OBW */
}, bbp_low_temp_bw20[] = {
	{  69, 0x12 },
	{  75, 0x5e },
	{  91, 0x07 },
	{  92, 0x02 },
	{ 195, 0x23 }, { 196, 0x17 },
	{ 195, 0x24 }, { 196, 0x06 },
	{ 195, 0x81 }, { 196, 0x12 },
	{ 195, 0x83 }, { 196, 0x17 },
	{ 195, 0x88 }, { 196, 0x5e },
}, bbp_low_temp_bw40[] = {
	{  69, 0x15 },
	{  75, 0x5c },
	{  91, 0x04 },
	{  92, 0x03 },
	{ 195, 0x23 }, { 196, 0x10 },
	{ 195, 0x24 }, { 196, 0x08 },
	{ 195, 0x81 }, { 196, 0x15 },
	{ 195, 0x83 }, { 196, 0x16 },
	{ 195, 0x88 }, { 196, 0x5b },
}, bbp_normal_temp[] = {
	{  75, 0x60 },
	{  92, 0x02 },
	{ 178, 0xff }, /* For CCK CH14 OBW */
	{ 195, 0x88 }, { 196, 0x60 },
}, bbp_normal_temp_bw20[] = {
	{  69, 0x12 },
	{  91, 0x07 },
	{ 195, 0x23 }, { 196, 0x17 },
	{ 195, 0x24 }, { 196, 0x06 },
	{ 195, 0x81 }, { 196, 0x12 },
	{ 195, 0x83 }, { 196, 0x17 },
}, bbp_normal_temp_bw40[] = {
	{  69, 0x15 },
	{  91, 0x04 },
	{ 195, 0x23 }, { 196, 0x12 },
	{ 195, 0x24 }, { 196, 0x08 },
	{ 195, 0x81 }, { 196, 0x15 },
	{ 195, 0x83 }, { 196, 0x16 },
};

#define BBP_TABLE(arr) { arr, ARRAY_SIZE(arr), }

static const struct reg_table {
	const struct mt76_reg_pair *regs;
	size_t n;
} bbp_mode_table[3][3] = {
	{
		BBP_TABLE(bbp_normal_temp_bw20),
		BBP_TABLE(bbp_normal_temp_bw40),
		BBP_TABLE(bbp_normal_temp),
	}, {
		BBP_TABLE(bbp_high_temp_bw20),
		BBP_TABLE(bbp_high_temp_bw40),
		BBP_TABLE(bbp_high_temp),
	}, {
		BBP_TABLE(bbp_low_temp_bw20),
		BBP_TABLE(bbp_low_temp_bw40),
		BBP_TABLE(bbp_low_temp),
	}
};

#endif
