linux/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
<<
>>
Prefs
   1/**
   2 * dwmac-rk.c - Rockchip RK3288 DWMAC specific glue layer
   3 *
   4 * Copyright (C) 2014 Chen-Zhi (Roger Chen)
   5 *
   6 * Chen-Zhi (Roger Chen)  <roger.chen@rock-chips.com>
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License as published by
  10 * the Free Software Foundation; either version 2 of the License, or
  11 * (at your option) any later version.
  12 *
  13 * This program is distributed in the hope that it will be useful,
  14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16 * GNU General Public License for more details.
  17 */
  18
  19#include <linux/stmmac.h>
  20#include <linux/bitops.h>
  21#include <linux/clk.h>
  22#include <linux/phy.h>
  23#include <linux/of_net.h>
  24#include <linux/gpio.h>
  25#include <linux/module.h>
  26#include <linux/of_gpio.h>
  27#include <linux/of_device.h>
  28#include <linux/platform_device.h>
  29#include <linux/regulator/consumer.h>
  30#include <linux/delay.h>
  31#include <linux/mfd/syscon.h>
  32#include <linux/regmap.h>
  33#include <linux/pm_runtime.h>
  34
  35#include "stmmac_platform.h"
  36
  37struct rk_priv_data;
  38struct rk_gmac_ops {
  39        void (*set_to_rgmii)(struct rk_priv_data *bsp_priv,
  40                             int tx_delay, int rx_delay);
  41        void (*set_to_rmii)(struct rk_priv_data *bsp_priv);
  42        void (*set_rgmii_speed)(struct rk_priv_data *bsp_priv, int speed);
  43        void (*set_rmii_speed)(struct rk_priv_data *bsp_priv, int speed);
  44        void (*integrated_phy_powerup)(struct rk_priv_data *bsp_priv);
  45};
  46
  47struct rk_priv_data {
  48        struct platform_device *pdev;
  49        int phy_iface;
  50        struct regulator *regulator;
  51        bool suspended;
  52        const struct rk_gmac_ops *ops;
  53
  54        bool clk_enabled;
  55        bool clock_input;
  56        bool integrated_phy;
  57
  58        struct clk *clk_mac;
  59        struct clk *gmac_clkin;
  60        struct clk *mac_clk_rx;
  61        struct clk *mac_clk_tx;
  62        struct clk *clk_mac_ref;
  63        struct clk *clk_mac_refout;
  64        struct clk *aclk_mac;
  65        struct clk *pclk_mac;
  66        struct clk *clk_phy;
  67
  68        struct reset_control *phy_reset;
  69
  70        int tx_delay;
  71        int rx_delay;
  72
  73        struct regmap *grf;
  74};
  75
  76#define HIWORD_UPDATE(val, mask, shift) \
  77                ((val) << (shift) | (mask) << ((shift) + 16))
  78
  79#define GRF_BIT(nr)     (BIT(nr) | BIT(nr+16))
  80#define GRF_CLR_BIT(nr) (BIT(nr+16))
  81
  82#define DELAY_ENABLE(soc, tx, rx) \
  83        (((tx) ? soc##_GMAC_TXCLK_DLY_ENABLE : soc##_GMAC_TXCLK_DLY_DISABLE) | \
  84         ((rx) ? soc##_GMAC_RXCLK_DLY_ENABLE : soc##_GMAC_RXCLK_DLY_DISABLE))
  85
  86#define RK3128_GRF_MAC_CON0     0x0168
  87#define RK3128_GRF_MAC_CON1     0x016c
  88
  89/* RK3128_GRF_MAC_CON0 */
  90#define RK3128_GMAC_TXCLK_DLY_ENABLE   GRF_BIT(14)
  91#define RK3128_GMAC_TXCLK_DLY_DISABLE  GRF_CLR_BIT(14)
  92#define RK3128_GMAC_RXCLK_DLY_ENABLE   GRF_BIT(15)
  93#define RK3128_GMAC_RXCLK_DLY_DISABLE  GRF_CLR_BIT(15)
  94#define RK3128_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7)
  95#define RK3128_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
  96
  97/* RK3128_GRF_MAC_CON1 */
  98#define RK3128_GMAC_PHY_INTF_SEL_RGMII  \
  99                (GRF_BIT(6) | GRF_CLR_BIT(7) | GRF_CLR_BIT(8))
 100#define RK3128_GMAC_PHY_INTF_SEL_RMII   \
 101                (GRF_CLR_BIT(6) | GRF_CLR_BIT(7) | GRF_BIT(8))
 102#define RK3128_GMAC_FLOW_CTRL          GRF_BIT(9)
 103#define RK3128_GMAC_FLOW_CTRL_CLR      GRF_CLR_BIT(9)
 104#define RK3128_GMAC_SPEED_10M          GRF_CLR_BIT(10)
 105#define RK3128_GMAC_SPEED_100M         GRF_BIT(10)
 106#define RK3128_GMAC_RMII_CLK_25M       GRF_BIT(11)
 107#define RK3128_GMAC_RMII_CLK_2_5M      GRF_CLR_BIT(11)
 108#define RK3128_GMAC_CLK_125M           (GRF_CLR_BIT(12) | GRF_CLR_BIT(13))
 109#define RK3128_GMAC_CLK_25M            (GRF_BIT(12) | GRF_BIT(13))
 110#define RK3128_GMAC_CLK_2_5M           (GRF_CLR_BIT(12) | GRF_BIT(13))
 111#define RK3128_GMAC_RMII_MODE          GRF_BIT(14)
 112#define RK3128_GMAC_RMII_MODE_CLR      GRF_CLR_BIT(14)
 113
 114static void rk3128_set_to_rgmii(struct rk_priv_data *bsp_priv,
 115                                int tx_delay, int rx_delay)
 116{
 117        struct device *dev = &bsp_priv->pdev->dev;
 118
 119        if (IS_ERR(bsp_priv->grf)) {
 120                dev_err(dev, "Missing rockchip,grf property\n");
 121                return;
 122        }
 123
 124        regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
 125                     RK3128_GMAC_PHY_INTF_SEL_RGMII |
 126                     RK3128_GMAC_RMII_MODE_CLR);
 127        regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON0,
 128                     DELAY_ENABLE(RK3128, tx_delay, rx_delay) |
 129                     RK3128_GMAC_CLK_RX_DL_CFG(rx_delay) |
 130                     RK3128_GMAC_CLK_TX_DL_CFG(tx_delay));
 131}
 132
 133static void rk3128_set_to_rmii(struct rk_priv_data *bsp_priv)
 134{
 135        struct device *dev = &bsp_priv->pdev->dev;
 136
 137        if (IS_ERR(bsp_priv->grf)) {
 138                dev_err(dev, "Missing rockchip,grf property\n");
 139                return;
 140        }
 141
 142        regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
 143                     RK3128_GMAC_PHY_INTF_SEL_RMII | RK3128_GMAC_RMII_MODE);
 144}
 145
 146static void rk3128_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
 147{
 148        struct device *dev = &bsp_priv->pdev->dev;
 149
 150        if (IS_ERR(bsp_priv->grf)) {
 151                dev_err(dev, "Missing rockchip,grf property\n");
 152                return;
 153        }
 154
 155        if (speed == 10)
 156                regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
 157                             RK3128_GMAC_CLK_2_5M);
 158        else if (speed == 100)
 159                regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
 160                             RK3128_GMAC_CLK_25M);
 161        else if (speed == 1000)
 162                regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
 163                             RK3128_GMAC_CLK_125M);
 164        else
 165                dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
 166}
 167
 168static void rk3128_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
 169{
 170        struct device *dev = &bsp_priv->pdev->dev;
 171
 172        if (IS_ERR(bsp_priv->grf)) {
 173                dev_err(dev, "Missing rockchip,grf property\n");
 174                return;
 175        }
 176
 177        if (speed == 10) {
 178                regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
 179                             RK3128_GMAC_RMII_CLK_2_5M |
 180                             RK3128_GMAC_SPEED_10M);
 181        } else if (speed == 100) {
 182                regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
 183                             RK3128_GMAC_RMII_CLK_25M |
 184                             RK3128_GMAC_SPEED_100M);
 185        } else {
 186                dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
 187        }
 188}
 189
 190static const struct rk_gmac_ops rk3128_ops = {
 191        .set_to_rgmii = rk3128_set_to_rgmii,
 192        .set_to_rmii = rk3128_set_to_rmii,
 193        .set_rgmii_speed = rk3128_set_rgmii_speed,
 194        .set_rmii_speed = rk3128_set_rmii_speed,
 195};
 196
 197#define RK3228_GRF_MAC_CON0     0x0900
 198#define RK3228_GRF_MAC_CON1     0x0904
 199
 200#define RK3228_GRF_CON_MUX      0x50
 201
 202/* RK3228_GRF_MAC_CON0 */
 203#define RK3228_GMAC_CLK_RX_DL_CFG(val)  HIWORD_UPDATE(val, 0x7F, 7)
 204#define RK3228_GMAC_CLK_TX_DL_CFG(val)  HIWORD_UPDATE(val, 0x7F, 0)
 205
 206/* RK3228_GRF_MAC_CON1 */
 207#define RK3228_GMAC_PHY_INTF_SEL_RGMII  \
 208                (GRF_BIT(4) | GRF_CLR_BIT(5) | GRF_CLR_BIT(6))
 209#define RK3228_GMAC_PHY_INTF_SEL_RMII   \
 210                (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
 211#define RK3228_GMAC_FLOW_CTRL           GRF_BIT(3)
 212#define RK3228_GMAC_FLOW_CTRL_CLR       GRF_CLR_BIT(3)
 213#define RK3228_GMAC_SPEED_10M           GRF_CLR_BIT(2)
 214#define RK3228_GMAC_SPEED_100M          GRF_BIT(2)
 215#define RK3228_GMAC_RMII_CLK_25M        GRF_BIT(7)
 216#define RK3228_GMAC_RMII_CLK_2_5M       GRF_CLR_BIT(7)
 217#define RK3228_GMAC_CLK_125M            (GRF_CLR_BIT(8) | GRF_CLR_BIT(9))
 218#define RK3228_GMAC_CLK_25M             (GRF_BIT(8) | GRF_BIT(9))
 219#define RK3228_GMAC_CLK_2_5M            (GRF_CLR_BIT(8) | GRF_BIT(9))
 220#define RK3228_GMAC_RMII_MODE           GRF_BIT(10)
 221#define RK3228_GMAC_RMII_MODE_CLR       GRF_CLR_BIT(10)
 222#define RK3228_GMAC_TXCLK_DLY_ENABLE    GRF_BIT(0)
 223#define RK3228_GMAC_TXCLK_DLY_DISABLE   GRF_CLR_BIT(0)
 224#define RK3228_GMAC_RXCLK_DLY_ENABLE    GRF_BIT(1)
 225#define RK3228_GMAC_RXCLK_DLY_DISABLE   GRF_CLR_BIT(1)
 226
 227/* RK3228_GRF_COM_MUX */
 228#define RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY  GRF_BIT(15)
 229
 230static void rk3228_set_to_rgmii(struct rk_priv_data *bsp_priv,
 231                                int tx_delay, int rx_delay)
 232{
 233        struct device *dev = &bsp_priv->pdev->dev;
 234
 235        if (IS_ERR(bsp_priv->grf)) {
 236                dev_err(dev, "Missing rockchip,grf property\n");
 237                return;
 238        }
 239
 240        regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
 241                     RK3228_GMAC_PHY_INTF_SEL_RGMII |
 242                     RK3228_GMAC_RMII_MODE_CLR |
 243                     DELAY_ENABLE(RK3228, tx_delay, rx_delay));
 244
 245        regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON0,
 246                     RK3228_GMAC_CLK_RX_DL_CFG(rx_delay) |
 247                     RK3228_GMAC_CLK_TX_DL_CFG(tx_delay));
 248}
 249
 250static void rk3228_set_to_rmii(struct rk_priv_data *bsp_priv)
 251{
 252        struct device *dev = &bsp_priv->pdev->dev;
 253
 254        if (IS_ERR(bsp_priv->grf)) {
 255                dev_err(dev, "Missing rockchip,grf property\n");
 256                return;
 257        }
 258
 259        regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
 260                     RK3228_GMAC_PHY_INTF_SEL_RMII |
 261                     RK3228_GMAC_RMII_MODE);
 262
 263        /* set MAC to RMII mode */
 264        regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1, GRF_BIT(11));
 265}
 266
 267static void rk3228_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
 268{
 269        struct device *dev = &bsp_priv->pdev->dev;
 270
 271        if (IS_ERR(bsp_priv->grf)) {
 272                dev_err(dev, "Missing rockchip,grf property\n");
 273                return;
 274        }
 275
 276        if (speed == 10)
 277                regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
 278                             RK3228_GMAC_CLK_2_5M);
 279        else if (speed == 100)
 280                regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
 281                             RK3228_GMAC_CLK_25M);
 282        else if (speed == 1000)
 283                regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
 284                             RK3228_GMAC_CLK_125M);
 285        else
 286                dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
 287}
 288
 289static void rk3228_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
 290{
 291        struct device *dev = &bsp_priv->pdev->dev;
 292
 293        if (IS_ERR(bsp_priv->grf)) {
 294                dev_err(dev, "Missing rockchip,grf property\n");
 295                return;
 296        }
 297
 298        if (speed == 10)
 299                regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
 300                             RK3228_GMAC_RMII_CLK_2_5M |
 301                             RK3228_GMAC_SPEED_10M);
 302        else if (speed == 100)
 303                regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
 304                             RK3228_GMAC_RMII_CLK_25M |
 305                             RK3228_GMAC_SPEED_100M);
 306        else
 307                dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
 308}
 309
 310static void rk3228_integrated_phy_powerup(struct rk_priv_data *priv)
 311{
 312        regmap_write(priv->grf, RK3228_GRF_CON_MUX,
 313                     RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY);
 314}
 315
 316static const struct rk_gmac_ops rk3228_ops = {
 317        .set_to_rgmii = rk3228_set_to_rgmii,
 318        .set_to_rmii = rk3228_set_to_rmii,
 319        .set_rgmii_speed = rk3228_set_rgmii_speed,
 320        .set_rmii_speed = rk3228_set_rmii_speed,
 321        .integrated_phy_powerup =  rk3228_integrated_phy_powerup,
 322};
 323
 324#define RK3288_GRF_SOC_CON1     0x0248
 325#define RK3288_GRF_SOC_CON3     0x0250
 326
 327/*RK3288_GRF_SOC_CON1*/
 328#define RK3288_GMAC_PHY_INTF_SEL_RGMII  (GRF_BIT(6) | GRF_CLR_BIT(7) | \
 329                                         GRF_CLR_BIT(8))
 330#define RK3288_GMAC_PHY_INTF_SEL_RMII   (GRF_CLR_BIT(6) | GRF_CLR_BIT(7) | \
 331                                         GRF_BIT(8))
 332#define RK3288_GMAC_FLOW_CTRL           GRF_BIT(9)
 333#define RK3288_GMAC_FLOW_CTRL_CLR       GRF_CLR_BIT(9)
 334#define RK3288_GMAC_SPEED_10M           GRF_CLR_BIT(10)
 335#define RK3288_GMAC_SPEED_100M          GRF_BIT(10)
 336#define RK3288_GMAC_RMII_CLK_25M        GRF_BIT(11)
 337#define RK3288_GMAC_RMII_CLK_2_5M       GRF_CLR_BIT(11)
 338#define RK3288_GMAC_CLK_125M            (GRF_CLR_BIT(12) | GRF_CLR_BIT(13))
 339#define RK3288_GMAC_CLK_25M             (GRF_BIT(12) | GRF_BIT(13))
 340#define RK3288_GMAC_CLK_2_5M            (GRF_CLR_BIT(12) | GRF_BIT(13))
 341#define RK3288_GMAC_RMII_MODE           GRF_BIT(14)
 342#define RK3288_GMAC_RMII_MODE_CLR       GRF_CLR_BIT(14)
 343
 344/*RK3288_GRF_SOC_CON3*/
 345#define RK3288_GMAC_TXCLK_DLY_ENABLE    GRF_BIT(14)
 346#define RK3288_GMAC_TXCLK_DLY_DISABLE   GRF_CLR_BIT(14)
 347#define RK3288_GMAC_RXCLK_DLY_ENABLE    GRF_BIT(15)
 348#define RK3288_GMAC_RXCLK_DLY_DISABLE   GRF_CLR_BIT(15)
 349#define RK3288_GMAC_CLK_RX_DL_CFG(val)  HIWORD_UPDATE(val, 0x7F, 7)
 350#define RK3288_GMAC_CLK_TX_DL_CFG(val)  HIWORD_UPDATE(val, 0x7F, 0)
 351
 352static void rk3288_set_to_rgmii(struct rk_priv_data *bsp_priv,
 353                                int tx_delay, int rx_delay)
 354{
 355        struct device *dev = &bsp_priv->pdev->dev;
 356
 357        if (IS_ERR(bsp_priv->grf)) {
 358                dev_err(dev, "Missing rockchip,grf property\n");
 359                return;
 360        }
 361
 362        regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
 363                     RK3288_GMAC_PHY_INTF_SEL_RGMII |
 364                     RK3288_GMAC_RMII_MODE_CLR);
 365        regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON3,
 366                     DELAY_ENABLE(RK3288, tx_delay, rx_delay) |
 367                     RK3288_GMAC_CLK_RX_DL_CFG(rx_delay) |
 368                     RK3288_GMAC_CLK_TX_DL_CFG(tx_delay));
 369}
 370
 371static void rk3288_set_to_rmii(struct rk_priv_data *bsp_priv)
 372{
 373        struct device *dev = &bsp_priv->pdev->dev;
 374
 375        if (IS_ERR(bsp_priv->grf)) {
 376                dev_err(dev, "Missing rockchip,grf property\n");
 377                return;
 378        }
 379
 380        regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
 381                     RK3288_GMAC_PHY_INTF_SEL_RMII | RK3288_GMAC_RMII_MODE);
 382}
 383
 384static void rk3288_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
 385{
 386        struct device *dev = &bsp_priv->pdev->dev;
 387
 388        if (IS_ERR(bsp_priv->grf)) {
 389                dev_err(dev, "Missing rockchip,grf property\n");
 390                return;
 391        }
 392
 393        if (speed == 10)
 394                regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
 395                             RK3288_GMAC_CLK_2_5M);
 396        else if (speed == 100)
 397                regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
 398                             RK3288_GMAC_CLK_25M);
 399        else if (speed == 1000)
 400                regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
 401                             RK3288_GMAC_CLK_125M);
 402        else
 403                dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
 404}
 405
 406static void rk3288_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
 407{
 408        struct device *dev = &bsp_priv->pdev->dev;
 409
 410        if (IS_ERR(bsp_priv->grf)) {
 411                dev_err(dev, "Missing rockchip,grf property\n");
 412                return;
 413        }
 414
 415        if (speed == 10) {
 416                regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
 417                             RK3288_GMAC_RMII_CLK_2_5M |
 418                             RK3288_GMAC_SPEED_10M);
 419        } else if (speed == 100) {
 420                regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
 421                             RK3288_GMAC_RMII_CLK_25M |
 422                             RK3288_GMAC_SPEED_100M);
 423        } else {
 424                dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
 425        }
 426}
 427
 428static const struct rk_gmac_ops rk3288_ops = {
 429        .set_to_rgmii = rk3288_set_to_rgmii,
 430        .set_to_rmii = rk3288_set_to_rmii,
 431        .set_rgmii_speed = rk3288_set_rgmii_speed,
 432        .set_rmii_speed = rk3288_set_rmii_speed,
 433};
 434
 435#define RK3328_GRF_MAC_CON0     0x0900
 436#define RK3328_GRF_MAC_CON1     0x0904
 437#define RK3328_GRF_MAC_CON2     0x0908
 438#define RK3328_GRF_MACPHY_CON1  0xb04
 439
 440/* RK3328_GRF_MAC_CON0 */
 441#define RK3328_GMAC_CLK_RX_DL_CFG(val)  HIWORD_UPDATE(val, 0x7F, 7)
 442#define RK3328_GMAC_CLK_TX_DL_CFG(val)  HIWORD_UPDATE(val, 0x7F, 0)
 443
 444/* RK3328_GRF_MAC_CON1 */
 445#define RK3328_GMAC_PHY_INTF_SEL_RGMII  \
 446                (GRF_BIT(4) | GRF_CLR_BIT(5) | GRF_CLR_BIT(6))
 447#define RK3328_GMAC_PHY_INTF_SEL_RMII   \
 448                (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
 449#define RK3328_GMAC_FLOW_CTRL           GRF_BIT(3)
 450#define RK3328_GMAC_FLOW_CTRL_CLR       GRF_CLR_BIT(3)
 451#define RK3328_GMAC_SPEED_10M           GRF_CLR_BIT(2)
 452#define RK3328_GMAC_SPEED_100M          GRF_BIT(2)
 453#define RK3328_GMAC_RMII_CLK_25M        GRF_BIT(7)
 454#define RK3328_GMAC_RMII_CLK_2_5M       GRF_CLR_BIT(7)
 455#define RK3328_GMAC_CLK_125M            (GRF_CLR_BIT(11) | GRF_CLR_BIT(12))
 456#define RK3328_GMAC_CLK_25M             (GRF_BIT(11) | GRF_BIT(12))
 457#define RK3328_GMAC_CLK_2_5M            (GRF_CLR_BIT(11) | GRF_BIT(12))
 458#define RK3328_GMAC_RMII_MODE           GRF_BIT(9)
 459#define RK3328_GMAC_RMII_MODE_CLR       GRF_CLR_BIT(9)
 460#define RK3328_GMAC_TXCLK_DLY_ENABLE    GRF_BIT(0)
 461#define RK3328_GMAC_TXCLK_DLY_DISABLE   GRF_CLR_BIT(0)
 462#define RK3328_GMAC_RXCLK_DLY_ENABLE    GRF_BIT(1)
 463#define RK3328_GMAC_RXCLK_DLY_DISABLE   GRF_CLR_BIT(0)
 464
 465/* RK3328_GRF_MACPHY_CON1 */
 466#define RK3328_MACPHY_RMII_MODE         GRF_BIT(9)
 467
 468static void rk3328_set_to_rgmii(struct rk_priv_data *bsp_priv,
 469                                int tx_delay, int rx_delay)
 470{
 471        struct device *dev = &bsp_priv->pdev->dev;
 472
 473        if (IS_ERR(bsp_priv->grf)) {
 474                dev_err(dev, "Missing rockchip,grf property\n");
 475                return;
 476        }
 477
 478        regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
 479                     RK3328_GMAC_PHY_INTF_SEL_RGMII |
 480                     RK3328_GMAC_RMII_MODE_CLR |
 481                     RK3328_GMAC_RXCLK_DLY_ENABLE |
 482                     RK3328_GMAC_TXCLK_DLY_ENABLE);
 483
 484        regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON0,
 485                     RK3328_GMAC_CLK_RX_DL_CFG(rx_delay) |
 486                     RK3328_GMAC_CLK_TX_DL_CFG(tx_delay));
 487}
 488
 489static void rk3328_set_to_rmii(struct rk_priv_data *bsp_priv)
 490{
 491        struct device *dev = &bsp_priv->pdev->dev;
 492        unsigned int reg;
 493
 494        if (IS_ERR(bsp_priv->grf)) {
 495                dev_err(dev, "Missing rockchip,grf property\n");
 496                return;
 497        }
 498
 499        reg = bsp_priv->integrated_phy ? RK3328_GRF_MAC_CON2 :
 500                  RK3328_GRF_MAC_CON1;
 501
 502        regmap_write(bsp_priv->grf, reg,
 503                     RK3328_GMAC_PHY_INTF_SEL_RMII |
 504                     RK3328_GMAC_RMII_MODE);
 505}
 506
 507static void rk3328_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
 508{
 509        struct device *dev = &bsp_priv->pdev->dev;
 510
 511        if (IS_ERR(bsp_priv->grf)) {
 512                dev_err(dev, "Missing rockchip,grf property\n");
 513                return;
 514        }
 515
 516        if (speed == 10)
 517                regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
 518                             RK3328_GMAC_CLK_2_5M);
 519        else if (speed == 100)
 520                regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
 521                             RK3328_GMAC_CLK_25M);
 522        else if (speed == 1000)
 523                regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
 524                             RK3328_GMAC_CLK_125M);
 525        else
 526                dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
 527}
 528
 529static void rk3328_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
 530{
 531        struct device *dev = &bsp_priv->pdev->dev;
 532        unsigned int reg;
 533
 534        if (IS_ERR(bsp_priv->grf)) {
 535                dev_err(dev, "Missing rockchip,grf property\n");
 536                return;
 537        }
 538
 539        reg = bsp_priv->integrated_phy ? RK3328_GRF_MAC_CON2 :
 540                  RK3328_GRF_MAC_CON1;
 541
 542        if (speed == 10)
 543                regmap_write(bsp_priv->grf, reg,
 544                             RK3328_GMAC_RMII_CLK_2_5M |
 545                             RK3328_GMAC_SPEED_10M);
 546        else if (speed == 100)
 547                regmap_write(bsp_priv->grf, reg,
 548                             RK3328_GMAC_RMII_CLK_25M |
 549                             RK3328_GMAC_SPEED_100M);
 550        else
 551                dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
 552}
 553
 554static void rk3328_integrated_phy_powerup(struct rk_priv_data *priv)
 555{
 556        regmap_write(priv->grf, RK3328_GRF_MACPHY_CON1,
 557                     RK3328_MACPHY_RMII_MODE);
 558}
 559
 560static const struct rk_gmac_ops rk3328_ops = {
 561        .set_to_rgmii = rk3328_set_to_rgmii,
 562        .set_to_rmii = rk3328_set_to_rmii,
 563        .set_rgmii_speed = rk3328_set_rgmii_speed,
 564        .set_rmii_speed = rk3328_set_rmii_speed,
 565        .integrated_phy_powerup =  rk3328_integrated_phy_powerup,
 566};
 567
 568#define RK3366_GRF_SOC_CON6     0x0418
 569#define RK3366_GRF_SOC_CON7     0x041c
 570
 571/* RK3366_GRF_SOC_CON6 */
 572#define RK3366_GMAC_PHY_INTF_SEL_RGMII  (GRF_BIT(9) | GRF_CLR_BIT(10) | \
 573                                         GRF_CLR_BIT(11))
 574#define RK3366_GMAC_PHY_INTF_SEL_RMII   (GRF_CLR_BIT(9) | GRF_CLR_BIT(10) | \
 575                                         GRF_BIT(11))
 576#define RK3366_GMAC_FLOW_CTRL           GRF_BIT(8)
 577#define RK3366_GMAC_FLOW_CTRL_CLR       GRF_CLR_BIT(8)
 578#define RK3366_GMAC_SPEED_10M           GRF_CLR_BIT(7)
 579#define RK3366_GMAC_SPEED_100M          GRF_BIT(7)
 580#define RK3366_GMAC_RMII_CLK_25M        GRF_BIT(3)
 581#define RK3366_GMAC_RMII_CLK_2_5M       GRF_CLR_BIT(3)
 582#define RK3366_GMAC_CLK_125M            (GRF_CLR_BIT(4) | GRF_CLR_BIT(5))
 583#define RK3366_GMAC_CLK_25M             (GRF_BIT(4) | GRF_BIT(5))
 584#define RK3366_GMAC_CLK_2_5M            (GRF_CLR_BIT(4) | GRF_BIT(5))
 585#define RK3366_GMAC_RMII_MODE           GRF_BIT(6)
 586#define RK3366_GMAC_RMII_MODE_CLR       GRF_CLR_BIT(6)
 587
 588/* RK3366_GRF_SOC_CON7 */
 589#define RK3366_GMAC_TXCLK_DLY_ENABLE    GRF_BIT(7)
 590#define RK3366_GMAC_TXCLK_DLY_DISABLE   GRF_CLR_BIT(7)
 591#define RK3366_GMAC_RXCLK_DLY_ENABLE    GRF_BIT(15)
 592#define RK3366_GMAC_RXCLK_DLY_DISABLE   GRF_CLR_BIT(15)
 593#define RK3366_GMAC_CLK_RX_DL_CFG(val)  HIWORD_UPDATE(val, 0x7F, 8)
 594#define RK3366_GMAC_CLK_TX_DL_CFG(val)  HIWORD_UPDATE(val, 0x7F, 0)
 595
 596static void rk3366_set_to_rgmii(struct rk_priv_data *bsp_priv,
 597                                int tx_delay, int rx_delay)
 598{
 599        struct device *dev = &bsp_priv->pdev->dev;
 600
 601        if (IS_ERR(bsp_priv->grf)) {
 602                dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
 603                return;
 604        }
 605
 606        regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
 607                     RK3366_GMAC_PHY_INTF_SEL_RGMII |
 608                     RK3366_GMAC_RMII_MODE_CLR);
 609        regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON7,
 610                     DELAY_ENABLE(RK3366, tx_delay, rx_delay) |
 611                     RK3366_GMAC_CLK_RX_DL_CFG(rx_delay) |
 612                     RK3366_GMAC_CLK_TX_DL_CFG(tx_delay));
 613}
 614
 615static void rk3366_set_to_rmii(struct rk_priv_data *bsp_priv)
 616{
 617        struct device *dev = &bsp_priv->pdev->dev;
 618
 619        if (IS_ERR(bsp_priv->grf)) {
 620                dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
 621                return;
 622        }
 623
 624        regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
 625                     RK3366_GMAC_PHY_INTF_SEL_RMII | RK3366_GMAC_RMII_MODE);
 626}
 627
 628static void rk3366_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
 629{
 630        struct device *dev = &bsp_priv->pdev->dev;
 631
 632        if (IS_ERR(bsp_priv->grf)) {
 633                dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
 634                return;
 635        }
 636
 637        if (speed == 10)
 638                regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
 639                             RK3366_GMAC_CLK_2_5M);
 640        else if (speed == 100)
 641                regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
 642                             RK3366_GMAC_CLK_25M);
 643        else if (speed == 1000)
 644                regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
 645                             RK3366_GMAC_CLK_125M);
 646        else
 647                dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
 648}
 649
 650static void rk3366_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
 651{
 652        struct device *dev = &bsp_priv->pdev->dev;
 653
 654        if (IS_ERR(bsp_priv->grf)) {
 655                dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
 656                return;
 657        }
 658
 659        if (speed == 10) {
 660                regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
 661                             RK3366_GMAC_RMII_CLK_2_5M |
 662                             RK3366_GMAC_SPEED_10M);
 663        } else if (speed == 100) {
 664                regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
 665                             RK3366_GMAC_RMII_CLK_25M |
 666                             RK3366_GMAC_SPEED_100M);
 667        } else {
 668                dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
 669        }
 670}
 671
 672static const struct rk_gmac_ops rk3366_ops = {
 673        .set_to_rgmii = rk3366_set_to_rgmii,
 674        .set_to_rmii = rk3366_set_to_rmii,
 675        .set_rgmii_speed = rk3366_set_rgmii_speed,
 676        .set_rmii_speed = rk3366_set_rmii_speed,
 677};
 678
 679#define RK3368_GRF_SOC_CON15    0x043c
 680#define RK3368_GRF_SOC_CON16    0x0440
 681
 682/* RK3368_GRF_SOC_CON15 */
 683#define RK3368_GMAC_PHY_INTF_SEL_RGMII  (GRF_BIT(9) | GRF_CLR_BIT(10) | \
 684                                         GRF_CLR_BIT(11))
 685#define RK3368_GMAC_PHY_INTF_SEL_RMII   (GRF_CLR_BIT(9) | GRF_CLR_BIT(10) | \
 686                                         GRF_BIT(11))
 687#define RK3368_GMAC_FLOW_CTRL           GRF_BIT(8)
 688#define RK3368_GMAC_FLOW_CTRL_CLR       GRF_CLR_BIT(8)
 689#define RK3368_GMAC_SPEED_10M           GRF_CLR_BIT(7)
 690#define RK3368_GMAC_SPEED_100M          GRF_BIT(7)
 691#define RK3368_GMAC_RMII_CLK_25M        GRF_BIT(3)
 692#define RK3368_GMAC_RMII_CLK_2_5M       GRF_CLR_BIT(3)
 693#define RK3368_GMAC_CLK_125M            (GRF_CLR_BIT(4) | GRF_CLR_BIT(5))
 694#define RK3368_GMAC_CLK_25M             (GRF_BIT(4) | GRF_BIT(5))
 695#define RK3368_GMAC_CLK_2_5M            (GRF_CLR_BIT(4) | GRF_BIT(5))
 696#define RK3368_GMAC_RMII_MODE           GRF_BIT(6)
 697#define RK3368_GMAC_RMII_MODE_CLR       GRF_CLR_BIT(6)
 698
 699/* RK3368_GRF_SOC_CON16 */
 700#define RK3368_GMAC_TXCLK_DLY_ENABLE    GRF_BIT(7)
 701#define RK3368_GMAC_TXCLK_DLY_DISABLE   GRF_CLR_BIT(7)
 702#define RK3368_GMAC_RXCLK_DLY_ENABLE    GRF_BIT(15)
 703#define RK3368_GMAC_RXCLK_DLY_DISABLE   GRF_CLR_BIT(15)
 704#define RK3368_GMAC_CLK_RX_DL_CFG(val)  HIWORD_UPDATE(val, 0x7F, 8)
 705#define RK3368_GMAC_CLK_TX_DL_CFG(val)  HIWORD_UPDATE(val, 0x7F, 0)
 706
 707static void rk3368_set_to_rgmii(struct rk_priv_data *bsp_priv,
 708                                int tx_delay, int rx_delay)
 709{
 710        struct device *dev = &bsp_priv->pdev->dev;
 711
 712        if (IS_ERR(bsp_priv->grf)) {
 713                dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
 714                return;
 715        }
 716
 717        regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
 718                     RK3368_GMAC_PHY_INTF_SEL_RGMII |
 719                     RK3368_GMAC_RMII_MODE_CLR);
 720        regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON16,
 721                     DELAY_ENABLE(RK3368, tx_delay, rx_delay) |
 722                     RK3368_GMAC_CLK_RX_DL_CFG(rx_delay) |
 723                     RK3368_GMAC_CLK_TX_DL_CFG(tx_delay));
 724}
 725
 726static void rk3368_set_to_rmii(struct rk_priv_data *bsp_priv)
 727{
 728        struct device *dev = &bsp_priv->pdev->dev;
 729
 730        if (IS_ERR(bsp_priv->grf)) {
 731                dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
 732                return;
 733        }
 734
 735        regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
 736                     RK3368_GMAC_PHY_INTF_SEL_RMII | RK3368_GMAC_RMII_MODE);
 737}
 738
 739static void rk3368_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
 740{
 741        struct device *dev = &bsp_priv->pdev->dev;
 742
 743        if (IS_ERR(bsp_priv->grf)) {
 744                dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
 745                return;
 746        }
 747
 748        if (speed == 10)
 749                regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
 750                             RK3368_GMAC_CLK_2_5M);
 751        else if (speed == 100)
 752                regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
 753                             RK3368_GMAC_CLK_25M);
 754        else if (speed == 1000)
 755                regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
 756                             RK3368_GMAC_CLK_125M);
 757        else
 758                dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
 759}
 760
 761static void rk3368_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
 762{
 763        struct device *dev = &bsp_priv->pdev->dev;
 764
 765        if (IS_ERR(bsp_priv->grf)) {
 766                dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
 767                return;
 768        }
 769
 770        if (speed == 10) {
 771                regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
 772                             RK3368_GMAC_RMII_CLK_2_5M |
 773                             RK3368_GMAC_SPEED_10M);
 774        } else if (speed == 100) {
 775                regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
 776                             RK3368_GMAC_RMII_CLK_25M |
 777                             RK3368_GMAC_SPEED_100M);
 778        } else {
 779                dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
 780        }
 781}
 782
 783static const struct rk_gmac_ops rk3368_ops = {
 784        .set_to_rgmii = rk3368_set_to_rgmii,
 785        .set_to_rmii = rk3368_set_to_rmii,
 786        .set_rgmii_speed = rk3368_set_rgmii_speed,
 787        .set_rmii_speed = rk3368_set_rmii_speed,
 788};
 789
 790#define RK3399_GRF_SOC_CON5     0xc214
 791#define RK3399_GRF_SOC_CON6     0xc218
 792
 793/* RK3399_GRF_SOC_CON5 */
 794#define RK3399_GMAC_PHY_INTF_SEL_RGMII  (GRF_BIT(9) | GRF_CLR_BIT(10) | \
 795                                         GRF_CLR_BIT(11))
 796#define RK3399_GMAC_PHY_INTF_SEL_RMII   (GRF_CLR_BIT(9) | GRF_CLR_BIT(10) | \
 797                                         GRF_BIT(11))
 798#define RK3399_GMAC_FLOW_CTRL           GRF_BIT(8)
 799#define RK3399_GMAC_FLOW_CTRL_CLR       GRF_CLR_BIT(8)
 800#define RK3399_GMAC_SPEED_10M           GRF_CLR_BIT(7)
 801#define RK3399_GMAC_SPEED_100M          GRF_BIT(7)
 802#define RK3399_GMAC_RMII_CLK_25M        GRF_BIT(3)
 803#define RK3399_GMAC_RMII_CLK_2_5M       GRF_CLR_BIT(3)
 804#define RK3399_GMAC_CLK_125M            (GRF_CLR_BIT(4) | GRF_CLR_BIT(5))
 805#define RK3399_GMAC_CLK_25M             (GRF_BIT(4) | GRF_BIT(5))
 806#define RK3399_GMAC_CLK_2_5M            (GRF_CLR_BIT(4) | GRF_BIT(5))
 807#define RK3399_GMAC_RMII_MODE           GRF_BIT(6)
 808#define RK3399_GMAC_RMII_MODE_CLR       GRF_CLR_BIT(6)
 809
 810/* RK3399_GRF_SOC_CON6 */
 811#define RK3399_GMAC_TXCLK_DLY_ENABLE    GRF_BIT(7)
 812#define RK3399_GMAC_TXCLK_DLY_DISABLE   GRF_CLR_BIT(7)
 813#define RK3399_GMAC_RXCLK_DLY_ENABLE    GRF_BIT(15)
 814#define RK3399_GMAC_RXCLK_DLY_DISABLE   GRF_CLR_BIT(15)
 815#define RK3399_GMAC_CLK_RX_DL_CFG(val)  HIWORD_UPDATE(val, 0x7F, 8)
 816#define RK3399_GMAC_CLK_TX_DL_CFG(val)  HIWORD_UPDATE(val, 0x7F, 0)
 817
 818static void rk3399_set_to_rgmii(struct rk_priv_data *bsp_priv,
 819                                int tx_delay, int rx_delay)
 820{
 821        struct device *dev = &bsp_priv->pdev->dev;
 822
 823        if (IS_ERR(bsp_priv->grf)) {
 824                dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
 825                return;
 826        }
 827
 828        regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
 829                     RK3399_GMAC_PHY_INTF_SEL_RGMII |
 830                     RK3399_GMAC_RMII_MODE_CLR);
 831        regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON6,
 832                     DELAY_ENABLE(RK3399, tx_delay, rx_delay) |
 833                     RK3399_GMAC_CLK_RX_DL_CFG(rx_delay) |
 834                     RK3399_GMAC_CLK_TX_DL_CFG(tx_delay));
 835}
 836
 837static void rk3399_set_to_rmii(struct rk_priv_data *bsp_priv)
 838{
 839        struct device *dev = &bsp_priv->pdev->dev;
 840
 841        if (IS_ERR(bsp_priv->grf)) {
 842                dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
 843                return;
 844        }
 845
 846        regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
 847                     RK3399_GMAC_PHY_INTF_SEL_RMII | RK3399_GMAC_RMII_MODE);
 848}
 849
 850static void rk3399_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
 851{
 852        struct device *dev = &bsp_priv->pdev->dev;
 853
 854        if (IS_ERR(bsp_priv->grf)) {
 855                dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
 856                return;
 857        }
 858
 859        if (speed == 10)
 860                regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
 861                             RK3399_GMAC_CLK_2_5M);
 862        else if (speed == 100)
 863                regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
 864                             RK3399_GMAC_CLK_25M);
 865        else if (speed == 1000)
 866                regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
 867                             RK3399_GMAC_CLK_125M);
 868        else
 869                dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
 870}
 871
 872static void rk3399_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
 873{
 874        struct device *dev = &bsp_priv->pdev->dev;
 875
 876        if (IS_ERR(bsp_priv->grf)) {
 877                dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
 878                return;
 879        }
 880
 881        if (speed == 10) {
 882                regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
 883                             RK3399_GMAC_RMII_CLK_2_5M |
 884                             RK3399_GMAC_SPEED_10M);
 885        } else if (speed == 100) {
 886                regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
 887                             RK3399_GMAC_RMII_CLK_25M |
 888                             RK3399_GMAC_SPEED_100M);
 889        } else {
 890                dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
 891        }
 892}
 893
 894static const struct rk_gmac_ops rk3399_ops = {
 895        .set_to_rgmii = rk3399_set_to_rgmii,
 896        .set_to_rmii = rk3399_set_to_rmii,
 897        .set_rgmii_speed = rk3399_set_rgmii_speed,
 898        .set_rmii_speed = rk3399_set_rmii_speed,
 899};
 900
 901#define RV1108_GRF_GMAC_CON0            0X0900
 902
 903/* RV1108_GRF_GMAC_CON0 */
 904#define RV1108_GMAC_PHY_INTF_SEL_RMII   (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | \
 905                                        GRF_BIT(6))
 906#define RV1108_GMAC_FLOW_CTRL           GRF_BIT(3)
 907#define RV1108_GMAC_FLOW_CTRL_CLR       GRF_CLR_BIT(3)
 908#define RV1108_GMAC_SPEED_10M           GRF_CLR_BIT(2)
 909#define RV1108_GMAC_SPEED_100M          GRF_BIT(2)
 910#define RV1108_GMAC_RMII_CLK_25M        GRF_BIT(7)
 911#define RV1108_GMAC_RMII_CLK_2_5M       GRF_CLR_BIT(7)
 912
 913static void rv1108_set_to_rmii(struct rk_priv_data *bsp_priv)
 914{
 915        struct device *dev = &bsp_priv->pdev->dev;
 916
 917        if (IS_ERR(bsp_priv->grf)) {
 918                dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
 919                return;
 920        }
 921
 922        regmap_write(bsp_priv->grf, RV1108_GRF_GMAC_CON0,
 923                     RV1108_GMAC_PHY_INTF_SEL_RMII);
 924}
 925
 926static void rv1108_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
 927{
 928        struct device *dev = &bsp_priv->pdev->dev;
 929
 930        if (IS_ERR(bsp_priv->grf)) {
 931                dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
 932                return;
 933        }
 934
 935        if (speed == 10) {
 936                regmap_write(bsp_priv->grf, RV1108_GRF_GMAC_CON0,
 937                             RV1108_GMAC_RMII_CLK_2_5M |
 938                             RV1108_GMAC_SPEED_10M);
 939        } else if (speed == 100) {
 940                regmap_write(bsp_priv->grf, RV1108_GRF_GMAC_CON0,
 941                             RV1108_GMAC_RMII_CLK_25M |
 942                             RV1108_GMAC_SPEED_100M);
 943        } else {
 944                dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
 945        }
 946}
 947
 948static const struct rk_gmac_ops rv1108_ops = {
 949        .set_to_rmii = rv1108_set_to_rmii,
 950        .set_rmii_speed = rv1108_set_rmii_speed,
 951};
 952
 953#define RK_GRF_MACPHY_CON0              0xb00
 954#define RK_GRF_MACPHY_CON1              0xb04
 955#define RK_GRF_MACPHY_CON2              0xb08
 956#define RK_GRF_MACPHY_CON3              0xb0c
 957
 958#define RK_MACPHY_ENABLE                GRF_BIT(0)
 959#define RK_MACPHY_DISABLE               GRF_CLR_BIT(0)
 960#define RK_MACPHY_CFG_CLK_50M           GRF_BIT(14)
 961#define RK_GMAC2PHY_RMII_MODE           (GRF_BIT(6) | GRF_CLR_BIT(7))
 962#define RK_GRF_CON2_MACPHY_ID           HIWORD_UPDATE(0x1234, 0xffff, 0)
 963#define RK_GRF_CON3_MACPHY_ID           HIWORD_UPDATE(0x35, 0x3f, 0)
 964
 965static void rk_gmac_integrated_phy_powerup(struct rk_priv_data *priv)
 966{
 967        if (priv->ops->integrated_phy_powerup)
 968                priv->ops->integrated_phy_powerup(priv);
 969
 970        regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_CFG_CLK_50M);
 971        regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_GMAC2PHY_RMII_MODE);
 972
 973        regmap_write(priv->grf, RK_GRF_MACPHY_CON2, RK_GRF_CON2_MACPHY_ID);
 974        regmap_write(priv->grf, RK_GRF_MACPHY_CON3, RK_GRF_CON3_MACPHY_ID);
 975
 976        if (priv->phy_reset) {
 977                /* PHY needs to be disabled before trying to reset it */
 978                regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE);
 979                if (priv->phy_reset)
 980                        reset_control_assert(priv->phy_reset);
 981                usleep_range(10, 20);
 982                if (priv->phy_reset)
 983                        reset_control_deassert(priv->phy_reset);
 984                usleep_range(10, 20);
 985                regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_ENABLE);
 986                msleep(30);
 987        }
 988}
 989
 990static void rk_gmac_integrated_phy_powerdown(struct rk_priv_data *priv)
 991{
 992        regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE);
 993        if (priv->phy_reset)
 994                reset_control_assert(priv->phy_reset);
 995}
 996
 997static int rk_gmac_clk_init(struct plat_stmmacenet_data *plat)
 998{
 999        struct rk_priv_data *bsp_priv = plat->bsp_priv;
1000        struct device *dev = &bsp_priv->pdev->dev;
1001        int ret;
1002
1003        bsp_priv->clk_enabled = false;
1004
1005        bsp_priv->mac_clk_rx = devm_clk_get(dev, "mac_clk_rx");
1006        if (IS_ERR(bsp_priv->mac_clk_rx))
1007                dev_err(dev, "cannot get clock %s\n",
1008                        "mac_clk_rx");
1009
1010        bsp_priv->mac_clk_tx = devm_clk_get(dev, "mac_clk_tx");
1011        if (IS_ERR(bsp_priv->mac_clk_tx))
1012                dev_err(dev, "cannot get clock %s\n",
1013                        "mac_clk_tx");
1014
1015        bsp_priv->aclk_mac = devm_clk_get(dev, "aclk_mac");
1016        if (IS_ERR(bsp_priv->aclk_mac))
1017                dev_err(dev, "cannot get clock %s\n",
1018                        "aclk_mac");
1019
1020        bsp_priv->pclk_mac = devm_clk_get(dev, "pclk_mac");
1021        if (IS_ERR(bsp_priv->pclk_mac))
1022                dev_err(dev, "cannot get clock %s\n",
1023                        "pclk_mac");
1024
1025        bsp_priv->clk_mac = devm_clk_get(dev, "stmmaceth");
1026        if (IS_ERR(bsp_priv->clk_mac))
1027                dev_err(dev, "cannot get clock %s\n",
1028                        "stmmaceth");
1029
1030        if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII) {
1031                bsp_priv->clk_mac_ref = devm_clk_get(dev, "clk_mac_ref");
1032                if (IS_ERR(bsp_priv->clk_mac_ref))
1033                        dev_err(dev, "cannot get clock %s\n",
1034                                "clk_mac_ref");
1035
1036                if (!bsp_priv->clock_input) {
1037                        bsp_priv->clk_mac_refout =
1038                                devm_clk_get(dev, "clk_mac_refout");
1039                        if (IS_ERR(bsp_priv->clk_mac_refout))
1040                                dev_err(dev, "cannot get clock %s\n",
1041                                        "clk_mac_refout");
1042                }
1043        }
1044
1045        if (bsp_priv->clock_input) {
1046                dev_info(dev, "clock input from PHY\n");
1047        } else {
1048                if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII)
1049                        clk_set_rate(bsp_priv->clk_mac, 50000000);
1050        }
1051
1052        if (plat->phy_node && bsp_priv->integrated_phy) {
1053                bsp_priv->clk_phy = of_clk_get(plat->phy_node, 0);
1054                if (IS_ERR(bsp_priv->clk_phy)) {
1055                        ret = PTR_ERR(bsp_priv->clk_phy);
1056                        dev_err(dev, "Cannot get PHY clock: %d\n", ret);
1057                        return -EINVAL;
1058                }
1059                clk_set_rate(bsp_priv->clk_phy, 50000000);
1060        }
1061
1062        return 0;
1063}
1064
1065static int gmac_clk_enable(struct rk_priv_data *bsp_priv, bool enable)
1066{
1067        int phy_iface = bsp_priv->phy_iface;
1068
1069        if (enable) {
1070                if (!bsp_priv->clk_enabled) {
1071                        if (phy_iface == PHY_INTERFACE_MODE_RMII) {
1072                                if (!IS_ERR(bsp_priv->mac_clk_rx))
1073                                        clk_prepare_enable(
1074                                                bsp_priv->mac_clk_rx);
1075
1076                                if (!IS_ERR(bsp_priv->clk_mac_ref))
1077                                        clk_prepare_enable(
1078                                                bsp_priv->clk_mac_ref);
1079
1080                                if (!IS_ERR(bsp_priv->clk_mac_refout))
1081                                        clk_prepare_enable(
1082                                                bsp_priv->clk_mac_refout);
1083                        }
1084
1085                        if (!IS_ERR(bsp_priv->clk_phy))
1086                                clk_prepare_enable(bsp_priv->clk_phy);
1087
1088                        if (!IS_ERR(bsp_priv->aclk_mac))
1089                                clk_prepare_enable(bsp_priv->aclk_mac);
1090
1091                        if (!IS_ERR(bsp_priv->pclk_mac))
1092                                clk_prepare_enable(bsp_priv->pclk_mac);
1093
1094                        if (!IS_ERR(bsp_priv->mac_clk_tx))
1095                                clk_prepare_enable(bsp_priv->mac_clk_tx);
1096
1097                        /**
1098                         * if (!IS_ERR(bsp_priv->clk_mac))
1099                         *      clk_prepare_enable(bsp_priv->clk_mac);
1100                         */
1101                        mdelay(5);
1102                        bsp_priv->clk_enabled = true;
1103                }
1104        } else {
1105                if (bsp_priv->clk_enabled) {
1106                        if (phy_iface == PHY_INTERFACE_MODE_RMII) {
1107                                if (!IS_ERR(bsp_priv->mac_clk_rx))
1108                                        clk_disable_unprepare(
1109                                                bsp_priv->mac_clk_rx);
1110
1111                                if (!IS_ERR(bsp_priv->clk_mac_ref))
1112                                        clk_disable_unprepare(
1113                                                bsp_priv->clk_mac_ref);
1114
1115                                if (!IS_ERR(bsp_priv->clk_mac_refout))
1116                                        clk_disable_unprepare(
1117                                                bsp_priv->clk_mac_refout);
1118                        }
1119
1120                        if (!IS_ERR(bsp_priv->clk_phy))
1121                                clk_disable_unprepare(bsp_priv->clk_phy);
1122
1123                        if (!IS_ERR(bsp_priv->aclk_mac))
1124                                clk_disable_unprepare(bsp_priv->aclk_mac);
1125
1126                        if (!IS_ERR(bsp_priv->pclk_mac))
1127                                clk_disable_unprepare(bsp_priv->pclk_mac);
1128
1129                        if (!IS_ERR(bsp_priv->mac_clk_tx))
1130                                clk_disable_unprepare(bsp_priv->mac_clk_tx);
1131                        /**
1132                         * if (!IS_ERR(bsp_priv->clk_mac))
1133                         *      clk_disable_unprepare(bsp_priv->clk_mac);
1134                         */
1135                        bsp_priv->clk_enabled = false;
1136                }
1137        }
1138
1139        return 0;
1140}
1141
1142static int phy_power_on(struct rk_priv_data *bsp_priv, bool enable)
1143{
1144        struct regulator *ldo = bsp_priv->regulator;
1145        int ret;
1146        struct device *dev = &bsp_priv->pdev->dev;
1147
1148        if (!ldo) {
1149                dev_err(dev, "no regulator found\n");
1150                return -1;
1151        }
1152
1153        if (enable) {
1154                ret = regulator_enable(ldo);
1155                if (ret)
1156                        dev_err(dev, "fail to enable phy-supply\n");
1157        } else {
1158                ret = regulator_disable(ldo);
1159                if (ret)
1160                        dev_err(dev, "fail to disable phy-supply\n");
1161        }
1162
1163        return 0;
1164}
1165
1166static struct rk_priv_data *rk_gmac_setup(struct platform_device *pdev,
1167                                          struct plat_stmmacenet_data *plat,
1168                                          const struct rk_gmac_ops *ops)
1169{
1170        struct rk_priv_data *bsp_priv;
1171        struct device *dev = &pdev->dev;
1172        int ret;
1173        const char *strings = NULL;
1174        int value;
1175
1176        bsp_priv = devm_kzalloc(dev, sizeof(*bsp_priv), GFP_KERNEL);
1177        if (!bsp_priv)
1178                return ERR_PTR(-ENOMEM);
1179
1180        bsp_priv->phy_iface = of_get_phy_mode(dev->of_node);
1181        bsp_priv->ops = ops;
1182
1183        bsp_priv->regulator = devm_regulator_get_optional(dev, "phy");
1184        if (IS_ERR(bsp_priv->regulator)) {
1185                if (PTR_ERR(bsp_priv->regulator) == -EPROBE_DEFER) {
1186                        dev_err(dev, "phy regulator is not available yet, deferred probing\n");
1187                        return ERR_PTR(-EPROBE_DEFER);
1188                }
1189                dev_err(dev, "no regulator found\n");
1190                bsp_priv->regulator = NULL;
1191        }
1192
1193        ret = of_property_read_string(dev->of_node, "clock_in_out", &strings);
1194        if (ret) {
1195                dev_err(dev, "Can not read property: clock_in_out.\n");
1196                bsp_priv->clock_input = true;
1197        } else {
1198                dev_info(dev, "clock input or output? (%s).\n",
1199                         strings);
1200                if (!strcmp(strings, "input"))
1201                        bsp_priv->clock_input = true;
1202                else
1203                        bsp_priv->clock_input = false;
1204        }
1205
1206        ret = of_property_read_u32(dev->of_node, "tx_delay", &value);
1207        if (ret) {
1208                bsp_priv->tx_delay = 0x30;
1209                dev_err(dev, "Can not read property: tx_delay.");
1210                dev_err(dev, "set tx_delay to 0x%x\n",
1211                        bsp_priv->tx_delay);
1212        } else {
1213                dev_info(dev, "TX delay(0x%x).\n", value);
1214                bsp_priv->tx_delay = value;
1215        }
1216
1217        ret = of_property_read_u32(dev->of_node, "rx_delay", &value);
1218        if (ret) {
1219                bsp_priv->rx_delay = 0x10;
1220                dev_err(dev, "Can not read property: rx_delay.");
1221                dev_err(dev, "set rx_delay to 0x%x\n",
1222                        bsp_priv->rx_delay);
1223        } else {
1224                dev_info(dev, "RX delay(0x%x).\n", value);
1225                bsp_priv->rx_delay = value;
1226        }
1227
1228        bsp_priv->grf = syscon_regmap_lookup_by_phandle(dev->of_node,
1229                                                        "rockchip,grf");
1230
1231        if (plat->phy_node) {
1232                bsp_priv->integrated_phy = of_property_read_bool(plat->phy_node,
1233                                                                 "phy-is-integrated");
1234                if (bsp_priv->integrated_phy) {
1235                        bsp_priv->phy_reset = of_reset_control_get(plat->phy_node, NULL);
1236                        if (IS_ERR(bsp_priv->phy_reset)) {
1237                                dev_err(&pdev->dev, "No PHY reset control found.\n");
1238                                bsp_priv->phy_reset = NULL;
1239                        }
1240                }
1241        }
1242        dev_info(dev, "integrated PHY? (%s).\n",
1243                 bsp_priv->integrated_phy ? "yes" : "no");
1244
1245        bsp_priv->pdev = pdev;
1246
1247        return bsp_priv;
1248}
1249
1250static int rk_gmac_powerup(struct rk_priv_data *bsp_priv)
1251{
1252        int ret;
1253        struct device *dev = &bsp_priv->pdev->dev;
1254
1255        ret = gmac_clk_enable(bsp_priv, true);
1256        if (ret)
1257                return ret;
1258
1259        /*rmii or rgmii*/
1260        switch (bsp_priv->phy_iface) {
1261        case PHY_INTERFACE_MODE_RGMII:
1262                dev_info(dev, "init for RGMII\n");
1263                bsp_priv->ops->set_to_rgmii(bsp_priv, bsp_priv->tx_delay,
1264                                            bsp_priv->rx_delay);
1265                break;
1266        case PHY_INTERFACE_MODE_RGMII_ID:
1267                dev_info(dev, "init for RGMII_ID\n");
1268                bsp_priv->ops->set_to_rgmii(bsp_priv, 0, 0);
1269                break;
1270        case PHY_INTERFACE_MODE_RGMII_RXID:
1271                dev_info(dev, "init for RGMII_RXID\n");
1272                bsp_priv->ops->set_to_rgmii(bsp_priv, bsp_priv->tx_delay, 0);
1273                break;
1274        case PHY_INTERFACE_MODE_RGMII_TXID:
1275                dev_info(dev, "init for RGMII_TXID\n");
1276                bsp_priv->ops->set_to_rgmii(bsp_priv, 0, bsp_priv->rx_delay);
1277                break;
1278        case PHY_INTERFACE_MODE_RMII:
1279                dev_info(dev, "init for RMII\n");
1280                bsp_priv->ops->set_to_rmii(bsp_priv);
1281                break;
1282        default:
1283                dev_err(dev, "NO interface defined!\n");
1284        }
1285
1286        ret = phy_power_on(bsp_priv, true);
1287        if (ret)
1288                return ret;
1289
1290        pm_runtime_enable(dev);
1291        pm_runtime_get_sync(dev);
1292
1293        if (bsp_priv->integrated_phy)
1294                rk_gmac_integrated_phy_powerup(bsp_priv);
1295
1296        return 0;
1297}
1298
1299static void rk_gmac_powerdown(struct rk_priv_data *gmac)
1300{
1301        struct device *dev = &gmac->pdev->dev;
1302
1303        if (gmac->integrated_phy)
1304                rk_gmac_integrated_phy_powerdown(gmac);
1305
1306        pm_runtime_put_sync(dev);
1307        pm_runtime_disable(dev);
1308
1309        phy_power_on(gmac, false);
1310        gmac_clk_enable(gmac, false);
1311}
1312
1313static void rk_fix_speed(void *priv, unsigned int speed)
1314{
1315        struct rk_priv_data *bsp_priv = priv;
1316        struct device *dev = &bsp_priv->pdev->dev;
1317
1318        switch (bsp_priv->phy_iface) {
1319        case PHY_INTERFACE_MODE_RGMII:
1320        case PHY_INTERFACE_MODE_RGMII_ID:
1321        case PHY_INTERFACE_MODE_RGMII_RXID:
1322        case PHY_INTERFACE_MODE_RGMII_TXID:
1323                bsp_priv->ops->set_rgmii_speed(bsp_priv, speed);
1324                break;
1325        case PHY_INTERFACE_MODE_RMII:
1326                bsp_priv->ops->set_rmii_speed(bsp_priv, speed);
1327                break;
1328        default:
1329                dev_err(dev, "unsupported interface %d", bsp_priv->phy_iface);
1330        }
1331}
1332
1333static int rk_gmac_probe(struct platform_device *pdev)
1334{
1335        struct plat_stmmacenet_data *plat_dat;
1336        struct stmmac_resources stmmac_res;
1337        const struct rk_gmac_ops *data;
1338        int ret;
1339
1340        data = of_device_get_match_data(&pdev->dev);
1341        if (!data) {
1342                dev_err(&pdev->dev, "no of match data provided\n");
1343                return -EINVAL;
1344        }
1345
1346        ret = stmmac_get_platform_resources(pdev, &stmmac_res);
1347        if (ret)
1348                return ret;
1349
1350        plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
1351        if (IS_ERR(plat_dat))
1352                return PTR_ERR(plat_dat);
1353
1354        plat_dat->has_gmac = true;
1355        plat_dat->fix_mac_speed = rk_fix_speed;
1356
1357        plat_dat->bsp_priv = rk_gmac_setup(pdev, plat_dat, data);
1358        if (IS_ERR(plat_dat->bsp_priv)) {
1359                ret = PTR_ERR(plat_dat->bsp_priv);
1360                goto err_remove_config_dt;
1361        }
1362
1363        ret = rk_gmac_clk_init(plat_dat);
1364        if (ret)
1365                return ret;
1366
1367        ret = rk_gmac_powerup(plat_dat->bsp_priv);
1368        if (ret)
1369                goto err_remove_config_dt;
1370
1371        ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
1372        if (ret)
1373                goto err_gmac_powerdown;
1374
1375        return 0;
1376
1377err_gmac_powerdown:
1378        rk_gmac_powerdown(plat_dat->bsp_priv);
1379err_remove_config_dt:
1380        stmmac_remove_config_dt(pdev, plat_dat);
1381
1382        return ret;
1383}
1384
1385static int rk_gmac_remove(struct platform_device *pdev)
1386{
1387        struct rk_priv_data *bsp_priv = get_stmmac_bsp_priv(&pdev->dev);
1388        int ret = stmmac_dvr_remove(&pdev->dev);
1389
1390        rk_gmac_powerdown(bsp_priv);
1391
1392        return ret;
1393}
1394
1395#ifdef CONFIG_PM_SLEEP
1396static int rk_gmac_suspend(struct device *dev)
1397{
1398        struct rk_priv_data *bsp_priv = get_stmmac_bsp_priv(dev);
1399        int ret = stmmac_suspend(dev);
1400
1401        /* Keep the PHY up if we use Wake-on-Lan. */
1402        if (!device_may_wakeup(dev)) {
1403                rk_gmac_powerdown(bsp_priv);
1404                bsp_priv->suspended = true;
1405        }
1406
1407        return ret;
1408}
1409
1410static int rk_gmac_resume(struct device *dev)
1411{
1412        struct rk_priv_data *bsp_priv = get_stmmac_bsp_priv(dev);
1413
1414        /* The PHY was up for Wake-on-Lan. */
1415        if (bsp_priv->suspended) {
1416                rk_gmac_powerup(bsp_priv);
1417                bsp_priv->suspended = false;
1418        }
1419
1420        return stmmac_resume(dev);
1421}
1422#endif /* CONFIG_PM_SLEEP */
1423
1424static SIMPLE_DEV_PM_OPS(rk_gmac_pm_ops, rk_gmac_suspend, rk_gmac_resume);
1425
1426static const struct of_device_id rk_gmac_dwmac_match[] = {
1427        { .compatible = "rockchip,rk3128-gmac", .data = &rk3128_ops },
1428        { .compatible = "rockchip,rk3228-gmac", .data = &rk3228_ops },
1429        { .compatible = "rockchip,rk3288-gmac", .data = &rk3288_ops },
1430        { .compatible = "rockchip,rk3328-gmac", .data = &rk3328_ops },
1431        { .compatible = "rockchip,rk3366-gmac", .data = &rk3366_ops },
1432        { .compatible = "rockchip,rk3368-gmac", .data = &rk3368_ops },
1433        { .compatible = "rockchip,rk3399-gmac", .data = &rk3399_ops },
1434        { .compatible = "rockchip,rv1108-gmac", .data = &rv1108_ops },
1435        { }
1436};
1437MODULE_DEVICE_TABLE(of, rk_gmac_dwmac_match);
1438
1439static struct platform_driver rk_gmac_dwmac_driver = {
1440        .probe  = rk_gmac_probe,
1441        .remove = rk_gmac_remove,
1442        .driver = {
1443                .name           = "rk_gmac-dwmac",
1444                .pm             = &rk_gmac_pm_ops,
1445                .of_match_table = rk_gmac_dwmac_match,
1446        },
1447};
1448module_platform_driver(rk_gmac_dwmac_driver);
1449
1450MODULE_AUTHOR("Chen-Zhi (Roger Chen) <roger.chen@rock-chips.com>");
1451MODULE_DESCRIPTION("Rockchip RK3288 DWMAC specific glue layer");
1452MODULE_LICENSE("GPL");
1453