aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ipq40xx/patches-4.19/700-net-add-qualcomm-mdio.patch
diff options
context:
space:
mode:
authorKristian Evensen <kristian.evensen@gmail.com>2019-10-20 11:33:13 +0200
committerJohn Crispin <john@phrozen.org>2019-10-21 12:28:03 +0200
commit6f6c00cfc95f603a533ff142cc0e1d34a4ab0588 (patch)
tree39173e7fe076ba1e988965433586bee88ff50914 /target/linux/ipq40xx/patches-4.19/700-net-add-qualcomm-mdio.patch
parentee41b602a2a2ced06c26e6edc160b2a5e9619f0d (diff)
downloadupstream-6f6c00cfc95f603a533ff142cc0e1d34a4ab0588.tar.gz
upstream-6f6c00cfc95f603a533ff142cc0e1d34a4ab0588.tar.bz2
upstream-6f6c00cfc95f603a533ff142cc0e1d34a4ab0588.zip
ipq40xx: Add support for Unielec U4019
This commit adds support for the 32MB storage/512MB RAM version of the U4019 IPQ4019-based board from Unielec. The board has the following specifications: * Qualcomm IPQ4019 (running at 717MHz) * 512MB DDR3 RAM (optional 256MB/1GB) * 32MB SPI NOR (optional 8/16MB or NAND) * Five gigabit ports (Qualcomm QCA8075) * 1x 2.4 GHz wifi (QCA4019 hw1.0) * 1x 5 Ghz wifi (QCA4019 hw1.0) * 1x mini-PCIe slot (only USB-pins connected) * 1x SIM slot (mini-SIM) * 1x USB2.0 port * 1x button * 1x controllable LED * 1x micro SD-card reader Working: * Ethernet * Wifi * USB-port * mini-PCIe slot + SIM slot * Button * Sysupgrade Not working: * SD card slot (no upstream support) Installation instructions: In order to install OpenWRT on the U4019, you need to go via the initramfs-image. The installation steps are as follows: * Connect to board via serial (header exposed and clearly marked). * Interrupt bootloader by pressing a button. * Copy the initramfs-image to your tftp folder, call the file C0A80079.img. * Give the network interface connected to the U4019 the address 192.168.0.156/24. * Start your tftp-server and run tftpboot on the board. * Run bootm when the file has been transferred, to boot OpenWRT. * Once OpenWRT has booted, copy the sysupgrade-image to the device and run sysupgrade to install OpenWRT on the U4019. Notes: - Since IPQ4019 has been moved to 4.19, I have not added support for kernel 4.14. - There is a bug with hardware encryption on IPQ4019, causing poor performance with TCP and ipsec (see for example FS#2355). In order to improve performance, I have disabled hardware encryption in the DTS. We can enable hw. enc. once/if bug is fixed. - In order for Ethernet to work, the phy has to be reset by setting gpio 47 low/high. Adding support for phy reset via gpio required patching the mdio-driver, and the code added comes from the vendor driver. I do not know if patching the driver is an acceptable approach or not. v1->v2: * Do not use wildcard as identifier in the board.d-scripts (thanks Adrian Schmutzler). Signed-off-by: Kristian Evensen <kristian.evensen@gmail.com>
Diffstat (limited to 'target/linux/ipq40xx/patches-4.19/700-net-add-qualcomm-mdio.patch')
-rw-r--r--target/linux/ipq40xx/patches-4.19/700-net-add-qualcomm-mdio.patch80
1 files changed, 76 insertions, 4 deletions
diff --git a/target/linux/ipq40xx/patches-4.19/700-net-add-qualcomm-mdio.patch b/target/linux/ipq40xx/patches-4.19/700-net-add-qualcomm-mdio.patch
index e939597b8e..4be25186e6 100644
--- a/target/linux/ipq40xx/patches-4.19/700-net-add-qualcomm-mdio.patch
+++ b/target/linux/ipq40xx/patches-4.19/700-net-add-qualcomm-mdio.patch
@@ -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.
@@ -14,9 +28,11 @@
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
@@ -24,9 +40,12 @@
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.
+ *
@@ -49,8 +68,10 @@
+#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
@@ -150,11 +171,60 @@
+ 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)
@@ -223,3 +293,5 @@
+MODULE_AUTHOR("Qualcomm Atheros");
+MODULE_VERSION(DRV_VERSION);
+MODULE_LICENSE("Dual BSD/GPL");
+--
+2.20.1