ipq40xx: Add support for Unielec U4019
[openwrt/openwrt.git] / target / linux / ipq40xx / patches-4.19 / 700-net-add-qualcomm-mdio.patch
index e939597b8e1d199e68403ec0d826839743055613..4be25186e65bdaf012575336b6992277aec180c0 100644 (file)
@@ -1,6 +1,20 @@
+From 234d6f40fb4b771b396b45a9492aab463771bd0b Mon Sep 17 00:00:00 2001
+From: Kristian Evensen <kristian.evensen@gmail.com>
+Date: Tue, 6 Aug 2019 11:42:57 +0200
+Subject: [PATCH] phy: Add ipq40xx mdio driver
+
+---
+ drivers/net/phy/Kconfig        |   7 +
+ drivers/net/phy/Makefile       |   1 +
+ drivers/net/phy/mdio-ipq40xx.c | 247 +++++++++++++++++++++++++++++++++
+ 3 files changed, 255 insertions(+)
+ create mode 100644 drivers/net/phy/mdio-ipq40xx.c
+
+diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig
+index 1f5fd24cd..eb71b47a3 100644
 --- a/drivers/net/phy/Kconfig
 +++ b/drivers/net/phy/Kconfig
-@@ -519,6 +519,13 @@ config XILINX_GMII2RGMII
+@@ -436,6 +436,13 @@ config XILINX_GMII2RGMII
          the Reduced Gigabit Media Independent Interface(RGMII) between
          Ethernet physical media devices and the Gigabit Ethernet controller.
  
  endif # PHYLIB
  
  config MICREL_KS8995MA
+diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile
+index f21cda9d8..804c52634 100644
 --- a/drivers/net/phy/Makefile
 +++ b/drivers/net/phy/Makefile
-@@ -48,6 +48,7 @@ obj-$(CONFIG_MDIO_CAVIUM)    += mdio-cavium
+@@ -33,6 +33,7 @@ obj-$(CONFIG_MDIO_CAVIUM)    += mdio-cavium.o
  obj-$(CONFIG_MDIO_GPIO)               += mdio-gpio.o
  obj-$(CONFIG_MDIO_HISI_FEMAC) += mdio-hisi-femac.o
  obj-$(CONFIG_MDIO_I2C)                += mdio-i2c.o
  obj-$(CONFIG_MDIO_MOXART)     += mdio-moxart.o
  obj-$(CONFIG_MDIO_MSCC_MIIM)  += mdio-mscc-miim.o
  obj-$(CONFIG_MDIO_OCTEON)     += mdio-octeon.o
+diff --git a/drivers/net/phy/mdio-ipq40xx.c b/drivers/net/phy/mdio-ipq40xx.c
+new file mode 100644
+index 000000000..88fe5dc2b
 --- /dev/null
 +++ b/drivers/net/phy/mdio-ipq40xx.c
-@@ -0,0 +1,196 @@
+@@ -0,0 +1,247 @@
 +/*
 + * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
 + *
 +#include <linux/io.h>
 +#include <linux/of_address.h>
 +#include <linux/of_mdio.h>
++#include <linux/of_gpio.h>
 +#include <linux/phy.h>
 +#include <linux/platform_device.h>
++#include <linux/gpio.h>
 +
 +#define MDIO_CTRL_0_REG               0x40
 +#define MDIO_CTRL_1_REG               0x44
 +      return 0;
 +}
 +
++static int ipq40xx_phy_reset(struct platform_device *pdev)
++{
++      struct device_node *mdio_node;
++      int phy_reset_gpio_number;
++      int ret;
++
++      mdio_node = of_find_node_by_name(NULL, "mdio");
++      if (!mdio_node) {
++              dev_err(&pdev->dev, "Could not find mdio node\n");
++              return -ENOENT;
++      }
++
++      ret = of_get_named_gpio(mdio_node, "phy-reset-gpio", 0);
++      if (ret < 0) {
++              dev_err(&pdev->dev, "Could not find phy-reset-gpio\n");
++              return ret;
++      }
++
++      phy_reset_gpio_number = ret;
++
++      ret = gpio_request(phy_reset_gpio_number, "phy-reset-gpio");
++      if (ret) {
++              dev_err(&pdev->dev, "Can't get phy-reset-gpio %d\n", ret);
++              return ret;
++      }
++
++      ret = gpio_direction_output(phy_reset_gpio_number, 0x0);
++      if (ret) {
++              dev_err(&pdev->dev,
++                      "Can't set direction for phy-reset-gpio %d\n", ret);
++              goto phy_reset_out;
++      }
++
++      usleep_range(1000, 10005);
++
++      gpio_set_value(phy_reset_gpio_number, 0x01);
++
++phy_reset_out:
++      gpio_free(phy_reset_gpio_number);
++
++      return ret;
++}
++
 +static int ipq40xx_mdio_probe(struct platform_device *pdev)
 +{
 +      struct ipq40xx_mdio_data *am;
 +      struct resource *res;
-+      int i;
++      int i, ret;
++
++      ret = ipq40xx_phy_reset(pdev);
++      if (ret) {
++              dev_err(&pdev->dev, "Could not find qca8075 reset gpio\n");
++              return -ENODEV;
++      }
 +
 +      am = devm_kzalloc(&pdev->dev, sizeof(*am), GFP_KERNEL);
 +      if (!am)
 +MODULE_AUTHOR("Qualcomm Atheros");
 +MODULE_VERSION(DRV_VERSION);
 +MODULE_LICENSE("Dual BSD/GPL");
+--
+2.20.1