cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

dwmac-qcom-ethqos.c (18763B)


      1// SPDX-License-Identifier: GPL-2.0
      2// Copyright (c) 2018-19, Linaro Limited
      3
      4#include <linux/module.h>
      5#include <linux/of.h>
      6#include <linux/of_device.h>
      7#include <linux/platform_device.h>
      8#include <linux/phy.h>
      9#include "stmmac.h"
     10#include "stmmac_platform.h"
     11
     12#define RGMII_IO_MACRO_CONFIG		0x0
     13#define SDCC_HC_REG_DLL_CONFIG		0x4
     14#define SDCC_HC_REG_DDR_CONFIG		0xC
     15#define SDCC_HC_REG_DLL_CONFIG2		0x10
     16#define SDC4_STATUS			0x14
     17#define SDCC_USR_CTL			0x18
     18#define RGMII_IO_MACRO_CONFIG2		0x1C
     19#define RGMII_IO_MACRO_DEBUG1		0x20
     20#define EMAC_SYSTEM_LOW_POWER_DEBUG	0x28
     21
     22/* RGMII_IO_MACRO_CONFIG fields */
     23#define RGMII_CONFIG_FUNC_CLK_EN		BIT(30)
     24#define RGMII_CONFIG_POS_NEG_DATA_SEL		BIT(23)
     25#define RGMII_CONFIG_GPIO_CFG_RX_INT		GENMASK(21, 20)
     26#define RGMII_CONFIG_GPIO_CFG_TX_INT		GENMASK(19, 17)
     27#define RGMII_CONFIG_MAX_SPD_PRG_9		GENMASK(16, 8)
     28#define RGMII_CONFIG_MAX_SPD_PRG_2		GENMASK(7, 6)
     29#define RGMII_CONFIG_INTF_SEL			GENMASK(5, 4)
     30#define RGMII_CONFIG_BYPASS_TX_ID_EN		BIT(3)
     31#define RGMII_CONFIG_LOOPBACK_EN		BIT(2)
     32#define RGMII_CONFIG_PROG_SWAP			BIT(1)
     33#define RGMII_CONFIG_DDR_MODE			BIT(0)
     34
     35/* SDCC_HC_REG_DLL_CONFIG fields */
     36#define SDCC_DLL_CONFIG_DLL_RST			BIT(30)
     37#define SDCC_DLL_CONFIG_PDN			BIT(29)
     38#define SDCC_DLL_CONFIG_MCLK_FREQ		GENMASK(26, 24)
     39#define SDCC_DLL_CONFIG_CDR_SELEXT		GENMASK(23, 20)
     40#define SDCC_DLL_CONFIG_CDR_EXT_EN		BIT(19)
     41#define SDCC_DLL_CONFIG_CK_OUT_EN		BIT(18)
     42#define SDCC_DLL_CONFIG_CDR_EN			BIT(17)
     43#define SDCC_DLL_CONFIG_DLL_EN			BIT(16)
     44#define SDCC_DLL_MCLK_GATING_EN			BIT(5)
     45#define SDCC_DLL_CDR_FINE_PHASE			GENMASK(3, 2)
     46
     47/* SDCC_HC_REG_DDR_CONFIG fields */
     48#define SDCC_DDR_CONFIG_PRG_DLY_EN		BIT(31)
     49#define SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY	GENMASK(26, 21)
     50#define SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY_CODE	GENMASK(29, 27)
     51#define SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY_EN	BIT(30)
     52#define SDCC_DDR_CONFIG_PRG_RCLK_DLY		GENMASK(8, 0)
     53
     54/* SDCC_HC_REG_DLL_CONFIG2 fields */
     55#define SDCC_DLL_CONFIG2_DLL_CLOCK_DIS		BIT(21)
     56#define SDCC_DLL_CONFIG2_MCLK_FREQ_CALC		GENMASK(17, 10)
     57#define SDCC_DLL_CONFIG2_DDR_TRAFFIC_INIT_SEL	GENMASK(3, 2)
     58#define SDCC_DLL_CONFIG2_DDR_TRAFFIC_INIT_SW	BIT(1)
     59#define SDCC_DLL_CONFIG2_DDR_CAL_EN		BIT(0)
     60
     61/* SDC4_STATUS bits */
     62#define SDC4_STATUS_DLL_LOCK			BIT(7)
     63
     64/* RGMII_IO_MACRO_CONFIG2 fields */
     65#define RGMII_CONFIG2_RSVD_CONFIG15		GENMASK(31, 17)
     66#define RGMII_CONFIG2_RGMII_CLK_SEL_CFG		BIT(16)
     67#define RGMII_CONFIG2_TX_TO_RX_LOOPBACK_EN	BIT(13)
     68#define RGMII_CONFIG2_CLK_DIVIDE_SEL		BIT(12)
     69#define RGMII_CONFIG2_RX_PROG_SWAP		BIT(7)
     70#define RGMII_CONFIG2_DATA_DIVIDE_CLK_SEL	BIT(6)
     71#define RGMII_CONFIG2_TX_CLK_PHASE_SHIFT_EN	BIT(5)
     72
     73struct ethqos_emac_por {
     74	unsigned int offset;
     75	unsigned int value;
     76};
     77
     78struct ethqos_emac_driver_data {
     79	const struct ethqos_emac_por *por;
     80	unsigned int num_por;
     81	bool rgmii_config_looback_en;
     82};
     83
     84struct qcom_ethqos {
     85	struct platform_device *pdev;
     86	void __iomem *rgmii_base;
     87
     88	unsigned int rgmii_clk_rate;
     89	struct clk *rgmii_clk;
     90	unsigned int speed;
     91
     92	const struct ethqos_emac_por *por;
     93	unsigned int num_por;
     94	bool rgmii_config_looback_en;
     95};
     96
     97static int rgmii_readl(struct qcom_ethqos *ethqos, unsigned int offset)
     98{
     99	return readl(ethqos->rgmii_base + offset);
    100}
    101
    102static void rgmii_writel(struct qcom_ethqos *ethqos,
    103			 int value, unsigned int offset)
    104{
    105	writel(value, ethqos->rgmii_base + offset);
    106}
    107
    108static void rgmii_updatel(struct qcom_ethqos *ethqos,
    109			  int mask, int val, unsigned int offset)
    110{
    111	unsigned int temp;
    112
    113	temp =  rgmii_readl(ethqos, offset);
    114	temp = (temp & ~(mask)) | val;
    115	rgmii_writel(ethqos, temp, offset);
    116}
    117
    118static void rgmii_dump(void *priv)
    119{
    120	struct qcom_ethqos *ethqos = priv;
    121
    122	dev_dbg(&ethqos->pdev->dev, "Rgmii register dump\n");
    123	dev_dbg(&ethqos->pdev->dev, "RGMII_IO_MACRO_CONFIG: %x\n",
    124		rgmii_readl(ethqos, RGMII_IO_MACRO_CONFIG));
    125	dev_dbg(&ethqos->pdev->dev, "SDCC_HC_REG_DLL_CONFIG: %x\n",
    126		rgmii_readl(ethqos, SDCC_HC_REG_DLL_CONFIG));
    127	dev_dbg(&ethqos->pdev->dev, "SDCC_HC_REG_DDR_CONFIG: %x\n",
    128		rgmii_readl(ethqos, SDCC_HC_REG_DDR_CONFIG));
    129	dev_dbg(&ethqos->pdev->dev, "SDCC_HC_REG_DLL_CONFIG2: %x\n",
    130		rgmii_readl(ethqos, SDCC_HC_REG_DLL_CONFIG2));
    131	dev_dbg(&ethqos->pdev->dev, "SDC4_STATUS: %x\n",
    132		rgmii_readl(ethqos, SDC4_STATUS));
    133	dev_dbg(&ethqos->pdev->dev, "SDCC_USR_CTL: %x\n",
    134		rgmii_readl(ethqos, SDCC_USR_CTL));
    135	dev_dbg(&ethqos->pdev->dev, "RGMII_IO_MACRO_CONFIG2: %x\n",
    136		rgmii_readl(ethqos, RGMII_IO_MACRO_CONFIG2));
    137	dev_dbg(&ethqos->pdev->dev, "RGMII_IO_MACRO_DEBUG1: %x\n",
    138		rgmii_readl(ethqos, RGMII_IO_MACRO_DEBUG1));
    139	dev_dbg(&ethqos->pdev->dev, "EMAC_SYSTEM_LOW_POWER_DEBUG: %x\n",
    140		rgmii_readl(ethqos, EMAC_SYSTEM_LOW_POWER_DEBUG));
    141}
    142
    143/* Clock rates */
    144#define RGMII_1000_NOM_CLK_FREQ			(250 * 1000 * 1000UL)
    145#define RGMII_ID_MODE_100_LOW_SVS_CLK_FREQ	 (50 * 1000 * 1000UL)
    146#define RGMII_ID_MODE_10_LOW_SVS_CLK_FREQ	  (5 * 1000 * 1000UL)
    147
    148static void
    149ethqos_update_rgmii_clk(struct qcom_ethqos *ethqos, unsigned int speed)
    150{
    151	switch (speed) {
    152	case SPEED_1000:
    153		ethqos->rgmii_clk_rate =  RGMII_1000_NOM_CLK_FREQ;
    154		break;
    155
    156	case SPEED_100:
    157		ethqos->rgmii_clk_rate =  RGMII_ID_MODE_100_LOW_SVS_CLK_FREQ;
    158		break;
    159
    160	case SPEED_10:
    161		ethqos->rgmii_clk_rate =  RGMII_ID_MODE_10_LOW_SVS_CLK_FREQ;
    162		break;
    163	}
    164
    165	clk_set_rate(ethqos->rgmii_clk, ethqos->rgmii_clk_rate);
    166}
    167
    168static void ethqos_set_func_clk_en(struct qcom_ethqos *ethqos)
    169{
    170	rgmii_updatel(ethqos, RGMII_CONFIG_FUNC_CLK_EN,
    171		      RGMII_CONFIG_FUNC_CLK_EN, RGMII_IO_MACRO_CONFIG);
    172}
    173
    174static const struct ethqos_emac_por emac_v2_3_0_por[] = {
    175	{ .offset = RGMII_IO_MACRO_CONFIG,	.value = 0x00C01343 },
    176	{ .offset = SDCC_HC_REG_DLL_CONFIG,	.value = 0x2004642C },
    177	{ .offset = SDCC_HC_REG_DDR_CONFIG,	.value = 0x00000000 },
    178	{ .offset = SDCC_HC_REG_DLL_CONFIG2,	.value = 0x00200000 },
    179	{ .offset = SDCC_USR_CTL,		.value = 0x00010800 },
    180	{ .offset = RGMII_IO_MACRO_CONFIG2,	.value = 0x00002060 },
    181};
    182
    183static const struct ethqos_emac_driver_data emac_v2_3_0_data = {
    184	.por = emac_v2_3_0_por,
    185	.num_por = ARRAY_SIZE(emac_v2_3_0_por),
    186	.rgmii_config_looback_en = true,
    187};
    188
    189static const struct ethqos_emac_por emac_v2_1_0_por[] = {
    190	{ .offset = RGMII_IO_MACRO_CONFIG,	.value = 0x40C01343 },
    191	{ .offset = SDCC_HC_REG_DLL_CONFIG,	.value = 0x2004642C },
    192	{ .offset = SDCC_HC_REG_DDR_CONFIG,	.value = 0x00000000 },
    193	{ .offset = SDCC_HC_REG_DLL_CONFIG2,	.value = 0x00200000 },
    194	{ .offset = SDCC_USR_CTL,		.value = 0x00010800 },
    195	{ .offset = RGMII_IO_MACRO_CONFIG2,	.value = 0x00002060 },
    196};
    197
    198static const struct ethqos_emac_driver_data emac_v2_1_0_data = {
    199	.por = emac_v2_1_0_por,
    200	.num_por = ARRAY_SIZE(emac_v2_1_0_por),
    201	.rgmii_config_looback_en = false,
    202};
    203
    204static int ethqos_dll_configure(struct qcom_ethqos *ethqos)
    205{
    206	unsigned int val;
    207	int retry = 1000;
    208
    209	/* Set CDR_EN */
    210	rgmii_updatel(ethqos, SDCC_DLL_CONFIG_CDR_EN,
    211		      SDCC_DLL_CONFIG_CDR_EN, SDCC_HC_REG_DLL_CONFIG);
    212
    213	/* Set CDR_EXT_EN */
    214	rgmii_updatel(ethqos, SDCC_DLL_CONFIG_CDR_EXT_EN,
    215		      SDCC_DLL_CONFIG_CDR_EXT_EN, SDCC_HC_REG_DLL_CONFIG);
    216
    217	/* Clear CK_OUT_EN */
    218	rgmii_updatel(ethqos, SDCC_DLL_CONFIG_CK_OUT_EN,
    219		      0, SDCC_HC_REG_DLL_CONFIG);
    220
    221	/* Set DLL_EN */
    222	rgmii_updatel(ethqos, SDCC_DLL_CONFIG_DLL_EN,
    223		      SDCC_DLL_CONFIG_DLL_EN, SDCC_HC_REG_DLL_CONFIG);
    224
    225	rgmii_updatel(ethqos, SDCC_DLL_MCLK_GATING_EN,
    226		      0, SDCC_HC_REG_DLL_CONFIG);
    227
    228	rgmii_updatel(ethqos, SDCC_DLL_CDR_FINE_PHASE,
    229		      0, SDCC_HC_REG_DLL_CONFIG);
    230
    231	/* Wait for CK_OUT_EN clear */
    232	do {
    233		val = rgmii_readl(ethqos, SDCC_HC_REG_DLL_CONFIG);
    234		val &= SDCC_DLL_CONFIG_CK_OUT_EN;
    235		if (!val)
    236			break;
    237		mdelay(1);
    238		retry--;
    239	} while (retry > 0);
    240	if (!retry)
    241		dev_err(&ethqos->pdev->dev, "Clear CK_OUT_EN timedout\n");
    242
    243	/* Set CK_OUT_EN */
    244	rgmii_updatel(ethqos, SDCC_DLL_CONFIG_CK_OUT_EN,
    245		      SDCC_DLL_CONFIG_CK_OUT_EN, SDCC_HC_REG_DLL_CONFIG);
    246
    247	/* Wait for CK_OUT_EN set */
    248	retry = 1000;
    249	do {
    250		val = rgmii_readl(ethqos, SDCC_HC_REG_DLL_CONFIG);
    251		val &= SDCC_DLL_CONFIG_CK_OUT_EN;
    252		if (val)
    253			break;
    254		mdelay(1);
    255		retry--;
    256	} while (retry > 0);
    257	if (!retry)
    258		dev_err(&ethqos->pdev->dev, "Set CK_OUT_EN timedout\n");
    259
    260	/* Set DDR_CAL_EN */
    261	rgmii_updatel(ethqos, SDCC_DLL_CONFIG2_DDR_CAL_EN,
    262		      SDCC_DLL_CONFIG2_DDR_CAL_EN, SDCC_HC_REG_DLL_CONFIG2);
    263
    264	rgmii_updatel(ethqos, SDCC_DLL_CONFIG2_DLL_CLOCK_DIS,
    265		      0, SDCC_HC_REG_DLL_CONFIG2);
    266
    267	rgmii_updatel(ethqos, SDCC_DLL_CONFIG2_MCLK_FREQ_CALC,
    268		      0x1A << 10, SDCC_HC_REG_DLL_CONFIG2);
    269
    270	rgmii_updatel(ethqos, SDCC_DLL_CONFIG2_DDR_TRAFFIC_INIT_SEL,
    271		      BIT(2), SDCC_HC_REG_DLL_CONFIG2);
    272
    273	rgmii_updatel(ethqos, SDCC_DLL_CONFIG2_DDR_TRAFFIC_INIT_SW,
    274		      SDCC_DLL_CONFIG2_DDR_TRAFFIC_INIT_SW,
    275		      SDCC_HC_REG_DLL_CONFIG2);
    276
    277	return 0;
    278}
    279
    280static int ethqos_rgmii_macro_init(struct qcom_ethqos *ethqos)
    281{
    282	/* Disable loopback mode */
    283	rgmii_updatel(ethqos, RGMII_CONFIG2_TX_TO_RX_LOOPBACK_EN,
    284		      0, RGMII_IO_MACRO_CONFIG2);
    285
    286	/* Select RGMII, write 0 to interface select */
    287	rgmii_updatel(ethqos, RGMII_CONFIG_INTF_SEL,
    288		      0, RGMII_IO_MACRO_CONFIG);
    289
    290	switch (ethqos->speed) {
    291	case SPEED_1000:
    292		rgmii_updatel(ethqos, RGMII_CONFIG_DDR_MODE,
    293			      RGMII_CONFIG_DDR_MODE, RGMII_IO_MACRO_CONFIG);
    294		rgmii_updatel(ethqos, RGMII_CONFIG_BYPASS_TX_ID_EN,
    295			      0, RGMII_IO_MACRO_CONFIG);
    296		rgmii_updatel(ethqos, RGMII_CONFIG_POS_NEG_DATA_SEL,
    297			      RGMII_CONFIG_POS_NEG_DATA_SEL,
    298			      RGMII_IO_MACRO_CONFIG);
    299		rgmii_updatel(ethqos, RGMII_CONFIG_PROG_SWAP,
    300			      RGMII_CONFIG_PROG_SWAP, RGMII_IO_MACRO_CONFIG);
    301		rgmii_updatel(ethqos, RGMII_CONFIG2_DATA_DIVIDE_CLK_SEL,
    302			      0, RGMII_IO_MACRO_CONFIG2);
    303		rgmii_updatel(ethqos, RGMII_CONFIG2_TX_CLK_PHASE_SHIFT_EN,
    304			      RGMII_CONFIG2_TX_CLK_PHASE_SHIFT_EN,
    305			      RGMII_IO_MACRO_CONFIG2);
    306		rgmii_updatel(ethqos, RGMII_CONFIG2_RSVD_CONFIG15,
    307			      0, RGMII_IO_MACRO_CONFIG2);
    308		rgmii_updatel(ethqos, RGMII_CONFIG2_RX_PROG_SWAP,
    309			      RGMII_CONFIG2_RX_PROG_SWAP,
    310			      RGMII_IO_MACRO_CONFIG2);
    311
    312		/* Set PRG_RCLK_DLY to 57 for 1.8 ns delay */
    313		rgmii_updatel(ethqos, SDCC_DDR_CONFIG_PRG_RCLK_DLY,
    314			      57, SDCC_HC_REG_DDR_CONFIG);
    315		rgmii_updatel(ethqos, SDCC_DDR_CONFIG_PRG_DLY_EN,
    316			      SDCC_DDR_CONFIG_PRG_DLY_EN,
    317			      SDCC_HC_REG_DDR_CONFIG);
    318		if (ethqos->rgmii_config_looback_en)
    319			rgmii_updatel(ethqos, RGMII_CONFIG_LOOPBACK_EN,
    320				      RGMII_CONFIG_LOOPBACK_EN, RGMII_IO_MACRO_CONFIG);
    321		else
    322			rgmii_updatel(ethqos, RGMII_CONFIG_LOOPBACK_EN,
    323				      0, RGMII_IO_MACRO_CONFIG);
    324		break;
    325
    326	case SPEED_100:
    327		rgmii_updatel(ethqos, RGMII_CONFIG_DDR_MODE,
    328			      RGMII_CONFIG_DDR_MODE, RGMII_IO_MACRO_CONFIG);
    329		rgmii_updatel(ethqos, RGMII_CONFIG_BYPASS_TX_ID_EN,
    330			      RGMII_CONFIG_BYPASS_TX_ID_EN,
    331			      RGMII_IO_MACRO_CONFIG);
    332		rgmii_updatel(ethqos, RGMII_CONFIG_POS_NEG_DATA_SEL,
    333			      0, RGMII_IO_MACRO_CONFIG);
    334		rgmii_updatel(ethqos, RGMII_CONFIG_PROG_SWAP,
    335			      0, RGMII_IO_MACRO_CONFIG);
    336		rgmii_updatel(ethqos, RGMII_CONFIG2_DATA_DIVIDE_CLK_SEL,
    337			      0, RGMII_IO_MACRO_CONFIG2);
    338		rgmii_updatel(ethqos, RGMII_CONFIG2_TX_CLK_PHASE_SHIFT_EN,
    339			      RGMII_CONFIG2_TX_CLK_PHASE_SHIFT_EN,
    340			      RGMII_IO_MACRO_CONFIG2);
    341		rgmii_updatel(ethqos, RGMII_CONFIG_MAX_SPD_PRG_2,
    342			      BIT(6), RGMII_IO_MACRO_CONFIG);
    343		rgmii_updatel(ethqos, RGMII_CONFIG2_RSVD_CONFIG15,
    344			      0, RGMII_IO_MACRO_CONFIG2);
    345		rgmii_updatel(ethqos, RGMII_CONFIG2_RX_PROG_SWAP,
    346			      0, RGMII_IO_MACRO_CONFIG2);
    347		/* Write 0x5 to PRG_RCLK_DLY_CODE */
    348		rgmii_updatel(ethqos, SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY_CODE,
    349			      (BIT(29) | BIT(27)), SDCC_HC_REG_DDR_CONFIG);
    350		rgmii_updatel(ethqos, SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY,
    351			      SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY,
    352			      SDCC_HC_REG_DDR_CONFIG);
    353		rgmii_updatel(ethqos, SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY_EN,
    354			      SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY_EN,
    355			      SDCC_HC_REG_DDR_CONFIG);
    356		if (ethqos->rgmii_config_looback_en)
    357			rgmii_updatel(ethqos, RGMII_CONFIG_LOOPBACK_EN,
    358				      RGMII_CONFIG_LOOPBACK_EN, RGMII_IO_MACRO_CONFIG);
    359		else
    360			rgmii_updatel(ethqos, RGMII_CONFIG_LOOPBACK_EN,
    361				      0, RGMII_IO_MACRO_CONFIG);
    362
    363		break;
    364
    365	case SPEED_10:
    366		rgmii_updatel(ethqos, RGMII_CONFIG_DDR_MODE,
    367			      RGMII_CONFIG_DDR_MODE, RGMII_IO_MACRO_CONFIG);
    368		rgmii_updatel(ethqos, RGMII_CONFIG_BYPASS_TX_ID_EN,
    369			      RGMII_CONFIG_BYPASS_TX_ID_EN,
    370			      RGMII_IO_MACRO_CONFIG);
    371		rgmii_updatel(ethqos, RGMII_CONFIG_POS_NEG_DATA_SEL,
    372			      0, RGMII_IO_MACRO_CONFIG);
    373		rgmii_updatel(ethqos, RGMII_CONFIG_PROG_SWAP,
    374			      0, RGMII_IO_MACRO_CONFIG);
    375		rgmii_updatel(ethqos, RGMII_CONFIG2_DATA_DIVIDE_CLK_SEL,
    376			      0, RGMII_IO_MACRO_CONFIG2);
    377		rgmii_updatel(ethqos, RGMII_CONFIG2_TX_CLK_PHASE_SHIFT_EN,
    378			      0, RGMII_IO_MACRO_CONFIG2);
    379		rgmii_updatel(ethqos, RGMII_CONFIG_MAX_SPD_PRG_9,
    380			      BIT(12) | GENMASK(9, 8),
    381			      RGMII_IO_MACRO_CONFIG);
    382		rgmii_updatel(ethqos, RGMII_CONFIG2_RSVD_CONFIG15,
    383			      0, RGMII_IO_MACRO_CONFIG2);
    384		rgmii_updatel(ethqos, RGMII_CONFIG2_RX_PROG_SWAP,
    385			      0, RGMII_IO_MACRO_CONFIG2);
    386		/* Write 0x5 to PRG_RCLK_DLY_CODE */
    387		rgmii_updatel(ethqos, SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY_CODE,
    388			      (BIT(29) | BIT(27)), SDCC_HC_REG_DDR_CONFIG);
    389		rgmii_updatel(ethqos, SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY,
    390			      SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY,
    391			      SDCC_HC_REG_DDR_CONFIG);
    392		rgmii_updatel(ethqos, SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY_EN,
    393			      SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY_EN,
    394			      SDCC_HC_REG_DDR_CONFIG);
    395		rgmii_updatel(ethqos, RGMII_CONFIG_LOOPBACK_EN,
    396			      RGMII_CONFIG_LOOPBACK_EN, RGMII_IO_MACRO_CONFIG);
    397		break;
    398	default:
    399		dev_err(&ethqos->pdev->dev,
    400			"Invalid speed %d\n", ethqos->speed);
    401		return -EINVAL;
    402	}
    403
    404	return 0;
    405}
    406
    407static int ethqos_configure(struct qcom_ethqos *ethqos)
    408{
    409	volatile unsigned int dll_lock;
    410	unsigned int i, retry = 1000;
    411
    412	/* Reset to POR values and enable clk */
    413	for (i = 0; i < ethqos->num_por; i++)
    414		rgmii_writel(ethqos, ethqos->por[i].value,
    415			     ethqos->por[i].offset);
    416	ethqos_set_func_clk_en(ethqos);
    417
    418	/* Initialize the DLL first */
    419
    420	/* Set DLL_RST */
    421	rgmii_updatel(ethqos, SDCC_DLL_CONFIG_DLL_RST,
    422		      SDCC_DLL_CONFIG_DLL_RST, SDCC_HC_REG_DLL_CONFIG);
    423
    424	/* Set PDN */
    425	rgmii_updatel(ethqos, SDCC_DLL_CONFIG_PDN,
    426		      SDCC_DLL_CONFIG_PDN, SDCC_HC_REG_DLL_CONFIG);
    427
    428	/* Clear DLL_RST */
    429	rgmii_updatel(ethqos, SDCC_DLL_CONFIG_DLL_RST, 0,
    430		      SDCC_HC_REG_DLL_CONFIG);
    431
    432	/* Clear PDN */
    433	rgmii_updatel(ethqos, SDCC_DLL_CONFIG_PDN, 0,
    434		      SDCC_HC_REG_DLL_CONFIG);
    435
    436	if (ethqos->speed != SPEED_100 && ethqos->speed != SPEED_10) {
    437		/* Set DLL_EN */
    438		rgmii_updatel(ethqos, SDCC_DLL_CONFIG_DLL_EN,
    439			      SDCC_DLL_CONFIG_DLL_EN, SDCC_HC_REG_DLL_CONFIG);
    440
    441		/* Set CK_OUT_EN */
    442		rgmii_updatel(ethqos, SDCC_DLL_CONFIG_CK_OUT_EN,
    443			      SDCC_DLL_CONFIG_CK_OUT_EN,
    444			      SDCC_HC_REG_DLL_CONFIG);
    445
    446		/* Set USR_CTL bit 26 with mask of 3 bits */
    447		rgmii_updatel(ethqos, GENMASK(26, 24), BIT(26), SDCC_USR_CTL);
    448
    449		/* wait for DLL LOCK */
    450		do {
    451			mdelay(1);
    452			dll_lock = rgmii_readl(ethqos, SDC4_STATUS);
    453			if (dll_lock & SDC4_STATUS_DLL_LOCK)
    454				break;
    455			retry--;
    456		} while (retry > 0);
    457		if (!retry)
    458			dev_err(&ethqos->pdev->dev,
    459				"Timeout while waiting for DLL lock\n");
    460	}
    461
    462	if (ethqos->speed == SPEED_1000)
    463		ethqos_dll_configure(ethqos);
    464
    465	ethqos_rgmii_macro_init(ethqos);
    466
    467	return 0;
    468}
    469
    470static void ethqos_fix_mac_speed(void *priv, unsigned int speed)
    471{
    472	struct qcom_ethqos *ethqos = priv;
    473
    474	ethqos->speed = speed;
    475	ethqos_update_rgmii_clk(ethqos, speed);
    476	ethqos_configure(ethqos);
    477}
    478
    479static int ethqos_clks_config(void *priv, bool enabled)
    480{
    481	struct qcom_ethqos *ethqos = priv;
    482	int ret = 0;
    483
    484	if (enabled) {
    485		ret = clk_prepare_enable(ethqos->rgmii_clk);
    486		if (ret) {
    487			dev_err(&ethqos->pdev->dev, "rgmii_clk enable failed\n");
    488			return ret;
    489		}
    490
    491		/* Enable functional clock to prevent DMA reset to timeout due
    492		 * to lacking PHY clock after the hardware block has been power
    493		 * cycled. The actual configuration will be adjusted once
    494		 * ethqos_fix_mac_speed() is invoked.
    495		 */
    496		ethqos_set_func_clk_en(ethqos);
    497	} else {
    498		clk_disable_unprepare(ethqos->rgmii_clk);
    499	}
    500
    501	return ret;
    502}
    503
    504static int qcom_ethqos_probe(struct platform_device *pdev)
    505{
    506	struct device_node *np = pdev->dev.of_node;
    507	struct plat_stmmacenet_data *plat_dat;
    508	struct stmmac_resources stmmac_res;
    509	const struct ethqos_emac_driver_data *data;
    510	struct qcom_ethqos *ethqos;
    511	int ret;
    512
    513	ret = stmmac_get_platform_resources(pdev, &stmmac_res);
    514	if (ret)
    515		return ret;
    516
    517	plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
    518	if (IS_ERR(plat_dat)) {
    519		dev_err(&pdev->dev, "dt configuration failed\n");
    520		return PTR_ERR(plat_dat);
    521	}
    522
    523	plat_dat->clks_config = ethqos_clks_config;
    524
    525	ethqos = devm_kzalloc(&pdev->dev, sizeof(*ethqos), GFP_KERNEL);
    526	if (!ethqos) {
    527		ret = -ENOMEM;
    528		goto err_mem;
    529	}
    530
    531	ethqos->pdev = pdev;
    532	ethqos->rgmii_base = devm_platform_ioremap_resource_byname(pdev, "rgmii");
    533	if (IS_ERR(ethqos->rgmii_base)) {
    534		ret = PTR_ERR(ethqos->rgmii_base);
    535		goto err_mem;
    536	}
    537
    538	data = of_device_get_match_data(&pdev->dev);
    539	ethqos->por = data->por;
    540	ethqos->num_por = data->num_por;
    541	ethqos->rgmii_config_looback_en = data->rgmii_config_looback_en;
    542
    543	ethqos->rgmii_clk = devm_clk_get(&pdev->dev, "rgmii");
    544	if (IS_ERR(ethqos->rgmii_clk)) {
    545		ret = PTR_ERR(ethqos->rgmii_clk);
    546		goto err_mem;
    547	}
    548
    549	ret = ethqos_clks_config(ethqos, true);
    550	if (ret)
    551		goto err_mem;
    552
    553	ethqos->speed = SPEED_1000;
    554	ethqos_update_rgmii_clk(ethqos, SPEED_1000);
    555	ethqos_set_func_clk_en(ethqos);
    556
    557	plat_dat->bsp_priv = ethqos;
    558	plat_dat->fix_mac_speed = ethqos_fix_mac_speed;
    559	plat_dat->dump_debug_regs = rgmii_dump;
    560	plat_dat->has_gmac4 = 1;
    561	plat_dat->pmt = 1;
    562	plat_dat->tso_en = of_property_read_bool(np, "snps,tso");
    563
    564	ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
    565	if (ret)
    566		goto err_clk;
    567
    568	return ret;
    569
    570err_clk:
    571	ethqos_clks_config(ethqos, false);
    572
    573err_mem:
    574	stmmac_remove_config_dt(pdev, plat_dat);
    575
    576	return ret;
    577}
    578
    579static int qcom_ethqos_remove(struct platform_device *pdev)
    580{
    581	struct qcom_ethqos *ethqos;
    582	int ret;
    583
    584	ethqos = get_stmmac_bsp_priv(&pdev->dev);
    585	if (!ethqos)
    586		return -ENODEV;
    587
    588	ret = stmmac_pltfr_remove(pdev);
    589	ethqos_clks_config(ethqos, false);
    590
    591	return ret;
    592}
    593
    594static const struct of_device_id qcom_ethqos_match[] = {
    595	{ .compatible = "qcom,qcs404-ethqos", .data = &emac_v2_3_0_data},
    596	{ .compatible = "qcom,sm8150-ethqos", .data = &emac_v2_1_0_data},
    597	{ }
    598};
    599MODULE_DEVICE_TABLE(of, qcom_ethqos_match);
    600
    601static struct platform_driver qcom_ethqos_driver = {
    602	.probe  = qcom_ethqos_probe,
    603	.remove = qcom_ethqos_remove,
    604	.driver = {
    605		.name           = "qcom-ethqos",
    606		.pm		= &stmmac_pltfr_pm_ops,
    607		.of_match_table = of_match_ptr(qcom_ethqos_match),
    608	},
    609};
    610module_platform_driver(qcom_ethqos_driver);
    611
    612MODULE_DESCRIPTION("Qualcomm ETHQOS driver");
    613MODULE_LICENSE("GPL v2");