diff options
author | Kristian Evensen <kristian.evensen@gmail.com> | 2019-10-20 11:33:13 +0200 |
---|---|---|
committer | John Crispin <john@phrozen.org> | 2019-10-21 12:28:03 +0200 |
commit | 6f6c00cfc95f603a533ff142cc0e1d34a4ab0588 (patch) | |
tree | 39173e7fe076ba1e988965433586bee88ff50914 /target/linux/ipq40xx/patches-4.19/700-net-add-qualcomm-mdio.patch | |
parent | ee41b602a2a2ced06c26e6edc160b2a5e9619f0d (diff) | |
download | upstream-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.patch | 80 |
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 |