Skip to content
Snippets Groups Projects
Commit be788727 authored by Luis Horacio Arnaldi's avatar Luis Horacio Arnaldi
Browse files

Agrgeo los patches

parent 3a73e5cf
No related branches found
No related tags found
No related merge requests found
set display_name {AXI4-Stream Red Pitaya ADC}
set display_name {AXI4-Stream Red Pitaya ADC v1.0}
set core [ipx::current_core]
......
set display_name {AXI4-Stream Red Pitaya ADC}
set display_name {AXI4-Stream Red Pitaya ADC v3.0}
set core [ipx::current_core]
......
#include <linux/miscdevice.h>
#include <linux/module.h>
#include <linux/uaccess.h>
#include <linux/dma-mapping.h>
#include <linux/dma-map-ops.h>
#define CMA_ALLOC _IOWR('Z', 0, u32)
static struct device *dma_device = NULL;
static size_t dma_size = 0;
static void *cpu_addr = NULL;
static dma_addr_t dma_addr;
static void cma_free(void)
{
if(!cpu_addr) return;
dma_free_coherent(dma_device, dma_size, cpu_addr, dma_addr);
cpu_addr = NULL;
}
static long cma_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
long rc;
u32 buffer;
if(cmd != CMA_ALLOC) return -ENOTTY;
rc = copy_from_user(&buffer, (void __user *)arg, sizeof(buffer));
if(rc) return rc;
cma_free();
dma_size = buffer;
cpu_addr = dma_alloc_coherent(dma_device, dma_size, &dma_addr, GFP_KERNEL);
if(IS_ERR_OR_NULL(cpu_addr))
{
rc = PTR_ERR(cpu_addr);
if(rc == 0) rc = -ENOMEM;
cpu_addr = NULL;
return rc;
}
buffer = dma_addr;
return copy_to_user((void __user *)arg, &buffer, sizeof(buffer));
}
static int cma_mmap(struct file *file, struct vm_area_struct *vma)
{
return dma_mmap_coherent(dma_device, vma, cpu_addr, dma_addr, dma_size);
}
static int cma_release(struct inode *inode, struct file *file)
{
cma_free();
return 0;
}
static struct file_operations cma_fops =
{
.unlocked_ioctl = cma_ioctl,
.mmap = cma_mmap,
.release = cma_release
};
struct miscdevice cma_device =
{
.minor = MISC_DYNAMIC_MINOR,
.name = "cma",
.fops = &cma_fops
};
static int __init cma_init(void)
{
int rc;
rc = misc_register(&cma_device);
if(rc) return rc;
dma_device = cma_device.this_device;
dma_device->dma_ops = &arm_coherent_dma_ops;
dma_device->coherent_dma_mask = DMA_BIT_MASK(32);
return 0;
}
static void __exit cma_exit(void)
{
cma_free();
misc_deregister(&cma_device);
}
module_init(cma_init);
module_exit(cma_exit);
MODULE_LICENSE("MIT");
diff -rupN pl.dtsi.old pl.dtsi
--- pl.dtsi.old
+++ pl.dtsi
@@ -15,7 +15,7 @@
#interrupt-cells = <2>;
clock-names = "s_axi_aclk";
clocks = <&misc_clk_0>;
- compatible = "xlnx,axi-intc-4.1", "xlnx,xps-intc-1.00.a";
+ compatible = "generic-uio";
interrupt-controller ;
interrupt-names = "irq";
interrupt-parent = <&intc>;
@@ -32,19 +32,19 @@
cfg_0: axi_cfg_register@40001000 {
clock-names = "aclk";
clocks = <&misc_clk_0>;
- compatible = "xlnx,axi-cfg-register-1.0";
+ compatible = "generic-uio";
reg = <0x40001000 0x1000>;
};
sts_0: axi_sts_register@40002000 {
clock-names = "aclk";
clocks = <&misc_clk_0>;
- compatible = "xlnx,axi-sts-register-1.0";
+ compatible = "generic-uio";
reg = <0x40002000 0x1000>;
};
xadc_wiz_0: xadc_wiz@40003000 {
clock-names = "s_axi_aclk";
clocks = <&misc_clk_0>;
- compatible = "xlnx,xadc-wiz-3.3", "xlnx,axi-xadc-1.00.a";
+ compatible = "generic-uio";
reg = <0x40003000 0x1000>;
xlnx,alarm-limit-r0 = <0xb5ed>;
xlnx,alarm-limit-r1 = <0x57e4>;
@@ -126,5 +126,17 @@
xlnx,vaux8 = <0x1>;
xlnx,vaux9 = <0x1>;
};
- };
+ hst0_reader_0: axi_bram_reader@40010000 {
+ clock-names = "aclk";
+ clocks = <&misc_clk_0>;
+ compatible = "generic-uio";
+ reg = <0x40010000 0x10000>;
+ };
+ hst1_reader_1: axi_bram_reader@40020000 {
+ clock-names = "aclk";
+ clocks = <&misc_clk_0>;
+ compatible = "generic-uio";
+ reg = <0x40020000 0x10000>;
+ };
+ };
};
diff -rupN pcw.dtsi.old pcw.dtsi
--- pcw.dtsi.old
+++ pcw.dtsi
@@ -26,6 +26,19 @@
clock-frequency = <400000>;
status = "okay";
};
+&i2c0 {
+ eep@50 {
+ compatible = "24c64";
+ size = <8192>;
+ pagesize = <32>;
+ reg = <0x50>;
+ };
+ bmp180@77{
+ compatible = "bosch,bmp280";
+ reg = <0x77>;
+ status = "okay";
+ };
+};
&intc {
num_cpus = <2>;
num_interrupts = <96>;
@@ -45,6 +51,11 @@
is-decoded-cs = <0>;
num-cs = <1>;
status = "okay";
+ spidev@0 {
+ compatible = "spidev";
+ reg = <0x0>;
+ spi-max-frequency = <10000000>;
+ };
};
&uart0 {
device_type = "serial";
@@ -57,11 +68,33 @@
status = "okay";
};
&usb0 {
+ dr_mode = "host";
- phy_type = "ulpi";
+ usb-phy = <&usb_phy0>;
status = "okay";
- usb-reset = <&gpio0 48 0>;
+ xlnx,phy-reset-gpio = <&gpio0 48 0>;
};
&clkc {
fclk-enable = <0x0>;
ps-clk-frequency = <33333333>;
};
+&adc {
+ xlnx,channels {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ channel@0 {
+ reg = <0>;
+ };
+ channel@1 {
+ reg = <1>;
+ };
+ channel@2 {
+ reg = <2>;
+ };
+ channel@9 {
+ reg = <9>;
+ };
+ channel@10 {
+ reg = <10>;
+ };
+ };
+};
diff -rupN system-top.dts.old system-top.dts
--- system-top.dts.old
+++ system-top.dts
@@ -14,6 +14,18 @@
bootargs = "console=ttyPS0,115200 earlyprintk earlycon";
stdout-path = "serial0:115200n8";
};
+ usb_phy0: phy0 {
+ #phy-cells = <0>;
+ compatible = "ulpi-phy";
+ reg = <0xe0002000 0x1000>;
+ view-port = <0x0170>;
+ drv-vbus;
+ };
+ pps {
+ compatible = "pps-gpio";
+ gpios = <&gpio0 54 0>;
+ capture-clear;
+ };
aliases {
ethernet0 = &gem0;
i2c0 = &i2c0;
diff -rupN old/linux-5.10/arch/arm/mach-zynq/common.c linux-5.10/arch/arm/mach-zynq/common.c
--- old/linux-5.10/arch/arm/mach-zynq/common.c
+++ linux-5.10/arch/arm/mach-zynq/common.c
@@ -95,6 +95,7 @@ static void __init zynq_init_late(void)
{
zynq_core_pm_init();
zynq_pm_late_init();
+ zynq_prefetch_init();
}
/**
@@ -186,8 +187,13 @@ static const char * const zynq_dt_match[
DT_MACHINE_START(XILINX_EP107, "Xilinx Zynq Platform")
/* 64KB way size, 8-way associativity, parity disabled */
- .l2c_aux_val = 0x00400000,
+#ifdef CONFIG_XILINX_PREFETCH
+ .l2c_aux_val = 0x30400000,
+ .l2c_aux_mask = 0xcfbfffff,
+#else
+ .l2c_aux_val = 0x00400000,
.l2c_aux_mask = 0xffbfffff,
+#endif
.smp = smp_ops(zynq_smp_ops),
.map_io = zynq_map_io,
.init_irq = zynq_irq_init,
diff -rupN old/linux-5.10/arch/arm/mach-zynq/common.h linux-5.10/arch/arm/mach-zynq/common.h
--- old/linux-5.10/arch/arm/mach-zynq/common.h
+++ linux-5.10/arch/arm/mach-zynq/common.h
@@ -15,6 +15,7 @@ extern void zynq_slcr_cpu_stop(int cpu);
extern void zynq_slcr_cpu_start(int cpu);
extern bool zynq_slcr_cpu_state_read(int cpu);
extern void zynq_slcr_cpu_state_write(int cpu, bool die);
+extern u32 zynq_slcr_get_ocm_config(void);
extern u32 zynq_slcr_get_device_id(void);
#ifdef CONFIG_SMP
@@ -29,6 +30,22 @@ extern void __iomem *zynq_scu_base;
void zynq_pm_late_init(void);
+static inline void zynq_prefetch_init(void)
+{
+ /*
+ * Enable prefetching in aux control register. L2 prefetch must
+ * only be enabled if the slave supports it (PL310 does)
+ */
+ asm volatile ("mrc p15, 0, r1, c1, c0, 1\n"
+#ifdef CONFIG_XILINX_PREFETCH
+ "orr r1, r1, #6\n"
+#else
+ "bic r1, r1, #6\n"
+#endif
+ "mcr p15, 0, r1, c1, c0, 1\n"
+ : : : "r1");
+}
+
static inline void zynq_core_pm_init(void)
{
/* A9 clock gating */
diff -rupN old/linux-5.10/arch/arm/mach-zynq/Kconfig linux-5.10/arch/arm/mach-zynq/Kconfig
--- old/linux-5.10/arch/arm/mach-zynq/Kconfig
+++ linux-5.10/arch/arm/mach-zynq/Kconfig
@@ -16,3 +16,19 @@ config ARCH_ZYNQ
select SOC_BUS
help
Support for Xilinx Zynq ARM Cortex A9 Platform
+
+if ARCH_ZYNQ
+
+menu "Xilinx Specific Options"
+
+config XILINX_PREFETCH
+ bool "Cache Prefetch"
+ default y
+ help
+ This option turns on L1 & L2 cache prefetching to get the best performance
+ in many cases. This may not always be the best performance depending on
+ the usage.
+
+endmenu
+
+endif
diff -rupN old/linux-5.10/arch/arm/mach-zynq/Makefile linux-5.10/arch/arm/mach-zynq/Makefile
--- old/linux-5.10/arch/arm/mach-zynq/Makefile
+++ linux-5.10/arch/arm/mach-zynq/Makefile
@@ -4,5 +4,5 @@
#
# Common support
-obj-y := common.o slcr.o pm.o
+obj-y := common.o slcr.o zynq_ocm.o pm.o
obj-$(CONFIG_SMP) += headsmp.o platsmp.o
diff -rupN old/linux-5.10/arch/arm/mach-zynq/platsmp.c linux-5.10/arch/arm/mach-zynq/platsmp.c
--- old/linux-5.10/arch/arm/mach-zynq/platsmp.c
+++ linux-5.10/arch/arm/mach-zynq/platsmp.c
@@ -115,6 +115,7 @@ static void __init zynq_smp_prepare_cpus
static void zynq_secondary_init(unsigned int cpu)
{
zynq_core_pm_init();
+ zynq_prefetch_init();
}
#ifdef CONFIG_HOTPLUG_CPU
diff -rupN old/linux-5.10/arch/arm/mach-zynq/slcr.c linux-5.10/arch/arm/mach-zynq/slcr.c
--- old/linux-5.10/arch/arm/mach-zynq/slcr.c
+++ linux-5.10/arch/arm/mach-zynq/slcr.c
@@ -20,6 +20,7 @@
#define SLCR_REBOOT_STATUS_OFFSET 0x258 /* PS Reboot Status */
#define SLCR_PSS_IDCODE 0x530 /* PS IDCODE */
#define SLCR_L2C_RAM 0xA1C /* L2C_RAM in AR#54190 */
+#define SLCR_OCM_CFG_OFFSET 0x910 /* OCM Address Mapping */
#define SLCR_UNLOCK_MAGIC 0xDF0D
#define SLCR_A9_CPU_CLKSTOP 0x10
@@ -116,6 +117,19 @@ static struct notifier_block zynq_slcr_r
};
/**
+ * zynq_slcr_get_ocm_config - Get SLCR OCM config
+ *
+ * return: OCM config bits
+ */
+u32 zynq_slcr_get_ocm_config(void)
+{
+ u32 ret;
+
+ zynq_slcr_read(&ret, SLCR_OCM_CFG_OFFSET);
+ return ret;
+}
+
+/**
* zynq_slcr_cpu_start - Start cpu
* @cpu: cpu number
*/
diff -rupN old/linux-5.10/drivers/char/Kconfig linux-5.10/drivers/char/Kconfig
--- old/linux-5.10/drivers/char/Kconfig
+++ linux-5.10/drivers/char/Kconfig
@@ -471,6 +471,14 @@ config ADI
and SSM (Silicon Secured Memory). Intended consumers of this
driver include crash and makedumpfile.
+config DEVCMA
+ bool "/dev/cma virtual device support"
+ default y
+
+config XILINX_DEVCFG
+ tristate "Xilinx Device Configuration"
+ depends on ARCH_ZYNQ
+
endmenu
config RANDOM_TRUST_CPU
diff -rupN old/linux-5.10/drivers/char/Makefile linux-5.10/drivers/char/Makefile
--- old/linux-5.10/drivers/char/Makefile
+++ linux-5.10/drivers/char/Makefile
@@ -47,3 +47,5 @@ obj-$(CONFIG_PS3_FLASH) += ps3flash.o
obj-$(CONFIG_XILLYBUS) += xillybus/
obj-$(CONFIG_POWERNV_OP_PANEL) += powernv-op-panel.o
obj-$(CONFIG_ADI) += adi.o
+obj-$(CONFIG_DEVCMA) += cma.o
+obj-$(CONFIG_XILINX_DEVCFG) += xilinx_devcfg.o
diff -rupN old/linux-5.10/drivers/net/phy/intel-xway.c linux-5.10/drivers/net/phy/intel-xway.c
--- old/linux-5.10/drivers/net/phy/intel-xway.c
+++ linux-5.10/drivers/net/phy/intel-xway.c
@@ -180,6 +180,12 @@ static int xway_gphy_config_init(struct
if (err)
return err;
+ /* Set SGMII RX & TX timing skew to 2 ns & 2.5 ns respectively. */
+ /* Set MII power supply to 2V5. */
+ err = phy_write(phydev, 0x17, 0x4D00);
+ if (err)
+ return err;
+
phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LEDCH,
XWAY_MMD_LEDCH_NACS_NONE |
XWAY_MMD_LEDCH_SBF_F02HZ |
@@ -189,20 +195,16 @@ static int xway_gphy_config_init(struct
XWAY_MMD_LEDCH_SCAN_NONE);
/**
- * In most cases only one LED is connected to this phy, so
- * configure them all to constant on and pulse mode. LED3 is
- * only available in some packages, leave it in its reset
- * configuration.
+ * Set LED0 blinking on RX/TX.
+ * Set LED1 blinking on link speed: slow=10M, fast=100M, on=1G.
*/
- ledxh = XWAY_MMD_LEDxH_BLINKF_NONE | XWAY_MMD_LEDxH_CON_LINK10XX;
- ledxl = XWAY_MMD_LEDxL_PULSE_TXACT | XWAY_MMD_LEDxL_PULSE_RXACT |
- XWAY_MMD_LEDxL_BLINKS_NONE;
- phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED0H, ledxh);
+ ledxl = XWAY_MMD_LEDxL_PULSE_TXACT | XWAY_MMD_LEDxL_PULSE_RXACT;
+ phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED0H, 0);
phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED0L, ledxl);
+ ledxh = XWAY_MMD_LEDxH_CON_LINK1000 | XWAY_MMD_LEDxH_BLINKF_LINK100;
+ ledxl = XWAY_MMD_LEDxH_CON_LINK10;
phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED1H, ledxh);
phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED1L, ledxl);
- phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED2H, ledxh);
- phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED2L, ledxl);
return 0;
}
diff -rupN old/linux-5.10/drivers/net/wireless/realtek/Kconfig linux-5.10/drivers/net/wireless/realtek/Kconfig
--- old/linux-5.10/drivers/net/wireless/realtek/Kconfig
+++ linux-5.10/drivers/net/wireless/realtek/Kconfig
@@ -13,8 +13,9 @@ config WLAN_VENDOR_REALTEK
if WLAN_VENDOR_REALTEK
source "drivers/net/wireless/realtek/rtl818x/Kconfig"
-source "drivers/net/wireless/realtek/rtlwifi/Kconfig"
source "drivers/net/wireless/realtek/rtl8xxxu/Kconfig"
source "drivers/net/wireless/realtek/rtw88/Kconfig"
+source "drivers/net/wireless/realtek/rtl8188eu/Kconfig"
+source "drivers/net/wireless/realtek/rtl8192cu/Kconfig"
endif # WLAN_VENDOR_REALTEK
diff -rupN old/linux-5.10/drivers/net/wireless/realtek/Makefile linux-5.10/drivers/net/wireless/realtek/Makefile
--- old/linux-5.10/drivers/net/wireless/realtek/Makefile
+++ linux-5.10/drivers/net/wireless/realtek/Makefile
@@ -5,7 +5,8 @@
obj-$(CONFIG_RTL8180) += rtl818x/
obj-$(CONFIG_RTL8187) += rtl818x/
-obj-$(CONFIG_RTLWIFI) += rtlwifi/
obj-$(CONFIG_RTL8XXXU) += rtl8xxxu/
obj-$(CONFIG_RTW88) += rtw88/
+obj-$(CONFIG_RTL8188EU) += rtl8188eu/
+obj-$(CONFIG_RTL8192CU) += rtl8192cu/
diff -rupN old/linux-5.10/drivers/net/wireless/realtek/rtl8188eu/Kconfig linux-5.10/drivers/net/wireless/realtek/rtl8188eu/Kconfig
--- old/linux-5.10/drivers/net/wireless/realtek/rtl8188eu/Kconfig
+++ linux-5.10/drivers/net/wireless/realtek/rtl8188eu/Kconfig
@@ -1,6 +1,6 @@
config RTL8188EU
tristate "Realtek 8188E USB WiFi"
depends on USB
- ---help---
+ help
Help message of RTL8188EU
diff -rupN old/linux-5.10/drivers/net/wireless/realtek/rtl8192cu/Kconfig linux-5.10/drivers/net/wireless/realtek/rtl8192cu/Kconfig
--- old/linux-5.10/drivers/net/wireless/realtek/rtl8192cu/Kconfig 1970-01-01 00:00:00.000000000 +0000
+++ linux-5.10/drivers/net/wireless/realtek/rtl8192cu/Kconfig
@@ -0,0 +1,9 @@
+config RTL8192CU
+ tristate "Realtek 8192CU USB WiFi"
+ depends on MAC80211 && USB
+ select CFG80211_WEXT
+ select WIRELESS_EXT
+ select WEXT_PRIV
+ help
+ This option adds the Realtek RTL8192CU USB device.
+
diff -rupN old/linux-5.10/drivers/pps/clients/pps-gpio.c linux-5.10/drivers/pps/clients/pps-gpio.c
--- old/linux-5.10/drivers/pps/clients/pps-gpio.c
+++ linux-5.10/drivers/pps/clients/pps-gpio.c
@@ -145,6 +145,8 @@ static int pps_gpio_setup(struct platfor
if (of_property_read_bool(np, "assert-falling-edge"))
data->assert_falling_edge = true;
+ if (of_get_property(np, "capture-clear", NULL))
+ data->capture_clear = true;
return 0;
}
diff -rupN old/linux-5.10/drivers/usb/chipidea/ci_hdrc_usb2.c linux-5.10/drivers/usb/chipidea/ci_hdrc_usb2.c
--- old/linux-5.10/drivers/usb/chipidea/ci_hdrc_usb2.c
+++ linux-5.10/drivers/usb/chipidea/ci_hdrc_usb2.c
@@ -30,6 +30,7 @@ static const struct ci_hdrc_platform_dat
static const struct ci_hdrc_platform_data ci_zynq_pdata = {
.capoffset = DEF_CAPOFFSET,
+ .flags = CI_HDRC_PHY_VBUS_CONTROL,
};
static const struct ci_hdrc_platform_data ci_zevio_pdata = {
@@ -64,6 +65,9 @@ static int ci_hdrc_usb2_probe(struct pla
if (match && match->data) {
/* struct copy */
*ci_pdata = *(struct ci_hdrc_platform_data *)match->data;
+ ci_pdata->usb_phy = devm_usb_get_phy_by_phandle(dev, "usb-phy", 0);
+ if (IS_ERR(ci_pdata->usb_phy))
+ return PTR_ERR(ci_pdata->usb_phy);
}
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
diff -rupN old/linux-5.10/drivers/usb/chipidea/host.c linux-5.10/drivers/usb/chipidea/host.c
--- old/linux-5.10/drivers/usb/chipidea/host.c
+++ linux-5.10/drivers/usb/chipidea/host.c
@@ -57,6 +57,14 @@ static int ehci_ci_portpower(struct usb_
priv->enabled = enable;
}
+ if (ci->platdata->flags & CI_HDRC_PHY_VBUS_CONTROL &&
+ ci->usb_phy && ci->usb_phy->set_vbus) {
+ if (enable)
+ ci->usb_phy->set_vbus(ci->usb_phy, 1);
+ else
+ ci->usb_phy->set_vbus(ci->usb_phy, 0);
+ }
+
if (enable && (ci->platdata->phy_mode == USBPHY_INTERFACE_MODE_HSIC)) {
/*
* Marvell 28nm HSIC PHY requires forcing the port to HS mode.
diff -rupN old/linux-5.10/drivers/usb/chipidea/otg_fsm.c linux-5.10/drivers/usb/chipidea/otg_fsm.c
--- old/linux-5.10/drivers/usb/chipidea/otg_fsm.c
+++ linux-5.10/drivers/usb/chipidea/otg_fsm.c
@@ -471,6 +471,11 @@ static void ci_otg_drv_vbus(struct otg_f
return;
}
}
+
+ if (ci->platdata->flags & CI_HDRC_PHY_VBUS_CONTROL &&
+ ci->usb_phy && ci->usb_phy->set_vbus)
+ ci->usb_phy->set_vbus(ci->usb_phy, 1);
+
/* Disable data pulse irq */
hw_write_otgsc(ci, OTGSC_DPIE, 0);
@@ -480,6 +485,10 @@ static void ci_otg_drv_vbus(struct otg_f
if (ci->platdata->reg_vbus)
regulator_disable(ci->platdata->reg_vbus);
+ if (ci->platdata->flags & CI_HDRC_PHY_VBUS_CONTROL &&
+ ci->usb_phy && ci->usb_phy->set_vbus)
+ ci->usb_phy->set_vbus(ci->usb_phy, 0);
+
fsm->a_bus_drop = 1;
fsm->a_bus_req = 0;
}
diff -rupN old/linux-5.10/drivers/usb/phy/phy-ulpi.c linux-5.10/drivers/usb/phy/phy-ulpi.c
--- old/linux-5.10/drivers/usb/phy/phy-ulpi.c
+++ linux-5.10/drivers/usb/phy/phy-ulpi.c
@@ -13,9 +13,16 @@
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/export.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/io.h>
+#include <linux/of_address.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
#include <linux/usb.h>
#include <linux/usb/otg.h>
#include <linux/usb/ulpi.h>
+#include <linux/usb/phy.h>
struct ulpi_info {
@@ -39,6 +46,13 @@ static struct ulpi_info ulpi_ids[] = {
ULPI_INFO(ULPI_ID(0x0451, 0x1507), "TI TUSB1210"),
};
+struct ulpi_phy {
+ struct usb_phy *usb_phy;
+ void __iomem *regs;
+ unsigned int vp_offset;
+ unsigned int flags;
+};
+
static int ulpi_set_otg_flags(struct usb_phy *phy)
{
unsigned int flags = ULPI_OTG_CTRL_DP_PULLDOWN |
@@ -240,6 +254,23 @@ static int ulpi_set_vbus(struct usb_otg
return usb_phy_io_write(phy, flags, ULPI_OTG_CTRL);
}
+static int usbphy_set_vbus(struct usb_phy *phy, int on)
+{
+ unsigned int flags = usb_phy_io_read(phy, ULPI_OTG_CTRL);
+
+ flags &= ~(ULPI_OTG_CTRL_DRVVBUS | ULPI_OTG_CTRL_DRVVBUS_EXT);
+
+ if (on) {
+ if (phy->flags & ULPI_OTG_DRVVBUS)
+ flags |= ULPI_OTG_CTRL_DRVVBUS;
+
+ if (phy->flags & ULPI_OTG_DRVVBUS_EXT)
+ flags |= ULPI_OTG_CTRL_DRVVBUS_EXT;
+ }
+
+ return usb_phy_io_write(phy, flags, ULPI_OTG_CTRL);
+}
+
static void otg_ulpi_init(struct usb_phy *phy, struct usb_otg *otg,
struct usb_phy_io_ops *ops,
unsigned int flags)
@@ -249,6 +280,7 @@ static void otg_ulpi_init(struct usb_phy
phy->io_ops = ops;
phy->otg = otg;
phy->init = ulpi_init;
+ phy->set_vbus = usbphy_set_vbus;
otg->usb_phy = phy;
otg->set_host = ulpi_set_host;
@@ -301,3 +333,83 @@ devm_otg_ulpi_create(struct device *dev,
return phy;
}
EXPORT_SYMBOL_GPL(devm_otg_ulpi_create);
+
+static int ulpi_phy_probe(struct platform_device *pdev)
+{
+ struct device_node *np = pdev->dev.of_node;
+ struct resource *res;
+ struct ulpi_phy *uphy;
+ bool flag;
+ int ret;
+
+ uphy = devm_kzalloc(&pdev->dev, sizeof(*uphy), GFP_KERNEL);
+ if (!uphy)
+ return -ENOMEM;
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!res) {
+ dev_err(&pdev->dev, "no phy I/O memory resource defined\n");
+ return -ENODEV;
+ }
+
+ uphy->regs = devm_ioremap(&pdev->dev, res->start, resource_size(res));
+ if (!uphy->regs) {
+ dev_err(&pdev->dev, "failed to map phy I/O memory\n");
+ return -EFAULT;
+ }
+
+ if (IS_ERR(uphy->regs))
+ return PTR_ERR(uphy->regs);
+
+ if (of_property_read_u32(np, "view-port", &uphy->vp_offset))
+ dev_dbg(&pdev->dev, "Missing view-port property\n");
+
+ if (IS_ERR(uphy->regs)) {
+ dev_err(&pdev->dev, "view-port register not specified\n");
+ return PTR_ERR(uphy->regs);
+ }
+
+ flag = of_property_read_bool(np, "drv-vbus");
+ if (flag)
+ uphy->flags |= ULPI_OTG_DRVVBUS | ULPI_OTG_DRVVBUS_EXT;
+
+ uphy->usb_phy = otg_ulpi_create(&ulpi_viewport_access_ops, uphy->flags);
+
+ uphy->usb_phy->dev = &pdev->dev;
+
+ uphy->usb_phy->io_priv = uphy->regs + uphy->vp_offset;
+
+ ret = usb_add_phy_dev(uphy->usb_phy);
+ if (ret < 0)
+ return ret;
+
+ return 0;
+}
+
+static int ulpi_phy_remove(struct platform_device *pdev)
+{
+ struct ulpi_phy *uphy = platform_get_drvdata(pdev);
+
+ usb_remove_phy(uphy->usb_phy);
+
+ return 0;
+}
+
+static const struct of_device_id ulpi_phy_table[] = {
+ { .compatible = "ulpi-phy" },
+ { },
+};
+MODULE_DEVICE_TABLE(of, ulpi_phy_table);
+
+static struct platform_driver ulpi_phy_driver = {
+ .probe = ulpi_phy_probe,
+ .remove = ulpi_phy_remove,
+ .driver = {
+ .name = "ulpi-phy",
+ .of_match_table = ulpi_phy_table,
+ },
+};
+module_platform_driver(ulpi_phy_driver);
+
+MODULE_DESCRIPTION("ULPI PHY driver");
+MODULE_LICENSE("GPL v2");
diff -rupN old/linux-5.10/include/linux/usb/chipidea.h linux-5.10/include/linux/usb/chipidea.h
--- old/linux-5.10/include/linux/usb/chipidea.h
+++ linux-5.10/include/linux/usb/chipidea.h
@@ -62,6 +62,7 @@ struct ci_hdrc_platform_data {
#define CI_HDRC_REQUIRES_ALIGNED_DMA BIT(13)
#define CI_HDRC_IMX_IS_HSIC BIT(14)
#define CI_HDRC_PMQOS BIT(15)
+#define CI_HDRC_PHY_VBUS_CONTROL BIT(16)
enum usb_dr_mode dr_mode;
#define CI_HDRC_CONTROLLER_RESET_EVENT 0
#define CI_HDRC_CONTROLLER_STOPPED_EVENT 1
diff -rupN old/u-boot-2021.04/arch/arm/dts/Makefile u-boot-2021.04/arch/arm/dts/Makefile
--- old/u-boot-2021.04/arch/arm/dts/Makefile
+++ u-boot-2021.04/arch/arm/dts/Makefile
@@ -286,7 +286,8 @@ dtb-$(CONFIG_ARCH_ZYNQ) += \
zynq-zturn.dtb \
zynq-zturn-v5.dtb \
zynq-zybo.dtb \
- zynq-zybo-z7.dtb
+ zynq-zybo-z7.dtb \
+ zynq-red-pitaya.dtb
dtb-$(CONFIG_ARCH_ZYNQMP) += \
avnet-ultra96-rev1.dtb \
avnet-ultrazedev-cc-v1.0-ultrazedev-som-v1.0.dtb \
diff -rupN old/u-boot-2021.04/board/xilinx/zynq/board.c u-boot-2021.04/board/xilinx/zynq/board.c
--- old/u-boot-2021.04/board/xilinx/zynq/board.c
+++ u-boot-2021.04/board/xilinx/zynq/board.c
@@ -37,12 +37,12 @@ int board_late_init(void)
const char *mode;
char *new_targets;
char *env_targets;
-
+/*
if (!(gd->flags & GD_FLG_ENV_DEFAULT)) {
debug("Saved variables - Skipping\n");
return 0;
}
-
+*/
if (!CONFIG_IS_ENABLED(ENV_VARS_UBOOT_RUNTIME_CONFIG))
return 0;
diff -rupN old/u-boot-2021.04/common/main.c u-boot-2021.04/common/main.c
--- old/u-boot-2021.04/common/main.c
+++ u-boot-2021.04/common/main.c
@@ -61,6 +61,8 @@ void main_loop(void)
if (cli_process_fdt(&s))
cli_secure_boot_cmd(s);
+ env_set("sdboot", "echo Importing environment from SD... && mmcinfo && load mmc 0 0x2000000 uEnv.txt && env import -t 0x2000000 ${filesize} && boot");
+
autoboot_command(s);
cli_loop();
This diff is collapsed.
CONFIG_LOCALVERSION="-xilinx"
CONFIG_SYSVIPC=y
CONFIG_NO_HZ=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_PREEMPT=y
CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
CONFIG_LOG_BUF_SHIFT=14
CONFIG_CGROUPS=y
CONFIG_BLK_DEV_INITRD=y
CONFIG_BPF_SYSCALL=y
# CONFIG_BUG is not set
CONFIG_EMBEDDED=y
CONFIG_PERF_EVENTS=y
CONFIG_SLAB=y
CONFIG_ARCH_VEXPRESS=y
CONFIG_ARCH_ZYNQ=y
CONFIG_PL310_ERRATA_588369=y
CONFIG_PL310_ERRATA_727915=y
CONFIG_PL310_ERRATA_769419=y
CONFIG_ARM_ERRATA_754322=y
CONFIG_ARM_ERRATA_754327=y
CONFIG_ARM_ERRATA_764369=y
CONFIG_ARM_ERRATA_775420=y
CONFIG_SMP=y
CONFIG_SCHED_MC=y
CONFIG_SCHED_SMT=y
CONFIG_BIG_LITTLE=y
CONFIG_BL_SWITCHER=y
CONFIG_HIGHMEM=y
CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
CONFIG_CPU_IDLE=y
CONFIG_ARM_ZYNQ_CPUIDLE=y
CONFIG_VFP=y
CONFIG_NEON=y
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
CONFIG_MODULE_FORCE_UNLOAD=y
CONFIG_MODVERSIONS=y
# CONFIG_BLK_DEV_BSG is not set
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
# CONFIG_COMPACTION is not set
CONFIG_CMA=y
CONFIG_NET=y
CONFIG_PACKET=y
CONFIG_UNIX=y
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
CONFIG_IP_PNP_BOOTP=y
CONFIG_IP_PNP_RARP=y
CONFIG_NET_IPIP=m
CONFIG_SYN_COOKIES=y
CONFIG_BRIDGE=m
CONFIG_VLAN_8021Q=m
CONFIG_CAN=y
CONFIG_CAN_XILINXCAN=y
CONFIG_UEVENT_HELPER=y
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
CONFIG_PCI=y
CONFIG_PCI_MSI=y
CONFIG_PCIE_XILINX=y
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
CONFIG_CONNECTOR=y
CONFIG_MTD=y
CONFIG_MTD_CMDLINE_PARTS=y
CONFIG_MTD_BLOCK=y
CONFIG_MTD_CFI=y
CONFIG_MTD_CFI_AMDSTD=y
CONFIG_MTD_PHYSMAP=y
CONFIG_MTD_PHYSMAP_OF=y
CONFIG_MTD_RAW_NAND=y
CONFIG_MTD_NAND_PL353=y
CONFIG_MTD_SPI_NOR=y
CONFIG_OF_OVERLAY=y
CONFIG_OF_CONFIGFS=y
CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=16384
CONFIG_XILINX_TRAFGEN=y
CONFIG_EEPROM_AT24=y
CONFIG_EEPROM_AT25=y
CONFIG_SCSI=y
CONFIG_BLK_DEV_SD=y
CONFIG_CHR_DEV_SG=y
CONFIG_NETDEVICES=y
CONFIG_MACB=y
# CONFIG_NET_VENDOR_CIRRUS is not set
# CONFIG_NET_VENDOR_FARADAY is not set
CONFIG_E1000E=y
# CONFIG_NET_VENDOR_MARVELL is not set
# CONFIG_NET_VENDOR_MICREL is not set
# CONFIG_NET_VENDOR_MICROCHIP is not set
# CONFIG_NET_VENDOR_NATSEMI is not set
CONFIG_R8169=y
# CONFIG_NET_VENDOR_SEEQ is not set
# CONFIG_NET_VENDOR_SMSC is not set
# CONFIG_NET_VENDOR_STMICRO is not set
# CONFIG_NET_VENDOR_VIA is not set
# CONFIG_NET_VENDOR_WIZNET is not set
CONFIG_XILINX_EMACLITE=y
CONFIG_XILINX_AXI_EMAC=y
CONFIG_MARVELL_PHY=y
CONFIG_VITESSE_PHY=y
CONFIG_INTEL_XWAY_PHY=y
CONFIG_MDIO_BITBANG=y
CONFIG_INPUT_SPARSEKMAP=y
CONFIG_INPUT_EVDEV=y
CONFIG_KEYBOARD_GPIO=y
CONFIG_KEYBOARD_GPIO_POLLED=y
# CONFIG_LEGACY_PTYS is not set
CONFIG_SERIAL_XILINX_PS_UART=y
CONFIG_SERIAL_XILINX_PS_UART_CONSOLE=y
# CONFIG_HW_RANDOM is not set
CONFIG_XILINX_DEVCFG=y
CONFIG_I2C_CHARDEV=y
CONFIG_I2C_MUX=y
CONFIG_I2C_MUX_PCA954x=y
CONFIG_I2C_CADENCE=y
CONFIG_SPI=y
CONFIG_SPI_CADENCE=y
CONFIG_SPI_XILINX=y
CONFIG_SPI_ZYNQ_QSPI=y
CONFIG_GPIO_SYSFS=y
CONFIG_GPIO_XILINX=y
CONFIG_GPIO_ZYNQ=y
CONFIG_PMBUS=y
CONFIG_SENSORS_UCD9000=y
CONFIG_SENSORS_UCD9200=y
CONFIG_BMP280=y
CONFIG_THERMAL=y
CONFIG_CPU_THERMAL=y
CONFIG_WATCHDOG=y
CONFIG_XILINX_WATCHDOG=y
CONFIG_CADENCE_WATCHDOG=y
CONFIG_REGULATOR=y
CONFIG_MEDIA_SUPPORT=y
CONFIG_V4L_PLATFORM_DRIVERS=y
CONFIG_VIDEO_XILINX=y
CONFIG_VIDEO_XILINX_CFA=y
CONFIG_VIDEO_XILINX_CRESAMPLE=y
CONFIG_VIDEO_XILINX_REMAPPER=y
CONFIG_VIDEO_XILINX_RGB2YUV=y
CONFIG_VIDEO_XILINX_SCALER=y
CONFIG_VIDEO_XILINX_SWITCH=y
CONFIG_VIDEO_XILINX_TPG=y
CONFIG_VIDEO_ADV7604=y
CONFIG_DRM=y
CONFIG_DRM_XLNX=y
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_SOUND=y
CONFIG_SND=y
CONFIG_SND_SOC=y
CONFIG_SND_SOC_ADI=y
CONFIG_SND_SOC_ADI_AXI_I2S=y
CONFIG_SND_SOC_ADI_AXI_SPDIF=y
CONFIG_HID_MICROSOFT=y
CONFIG_USB=y
CONFIG_USB_EHCI_HCD=y
# CONFIG_USB_EHCI_TT_NEWSCHED is not set
CONFIG_USB_STORAGE=y
CONFIG_USB_UAS=m
CONFIG_USB_CHIPIDEA=y
CONFIG_USB_CHIPIDEA_UDC=y
CONFIG_USB_CHIPIDEA_HOST=y
CONFIG_NOP_USB_XCEIV=y
CONFIG_USB_ULPI=y
CONFIG_USB_GADGET=y
CONFIG_USB_GADGET_XILINX=y
CONFIG_USB_CONFIGFS=m
CONFIG_USB_CONFIGFS_MASS_STORAGE=y
CONFIG_USB_ZERO=m
CONFIG_MMC=y
CONFIG_MMC_SDHCI=y
CONFIG_MMC_SDHCI_PLTFM=y
CONFIG_MMC_SDHCI_OF_ARASAN=y
CONFIG_NEW_LEDS=y
CONFIG_LEDS_CLASS=y
CONFIG_LEDS_GPIO=y
CONFIG_LEDS_TRIGGERS=y
CONFIG_LEDS_TRIGGER_TIMER=y
CONFIG_LEDS_TRIGGER_ONESHOT=y
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
CONFIG_LEDS_TRIGGER_BACKLIGHT=y
CONFIG_LEDS_TRIGGER_CPU=y
CONFIG_LEDS_TRIGGER_GPIO=y
CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
CONFIG_LEDS_TRIGGER_TRANSIENT=y
CONFIG_LEDS_TRIGGER_CAMERA=y
CONFIG_EDAC=y
CONFIG_EDAC_SYNOPSYS=y
CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_PCF8563=y
CONFIG_DMADEVICES=y
CONFIG_PL330_DMA=y
CONFIG_XILINX_DMA=y
CONFIG_UIO=y
CONFIG_UIO_PDRV_GENIRQ=y
CONFIG_UIO_XILINX_APM=y
CONFIG_COMMON_CLK_SI570=y
CONFIG_REMOTEPROC=y
CONFIG_ZYNQ_REMOTEPROC=m
CONFIG_MEMORY=y
CONFIG_IIO=y
CONFIG_XILINX_XADC=y
CONFIG_XILINX_INTC=y
CONFIG_RAS=y
CONFIG_EXT3_FS=y
# CONFIG_DNOTIFY is not set
CONFIG_MSDOS_FS=y
CONFIG_VFAT_FS=y
CONFIG_TMPFS=y
CONFIG_JFFS2_FS=y
CONFIG_JFFS2_SUMMARY=y
CONFIG_NFS_FS=y
CONFIG_ROOT_NFS=y
CONFIG_NLS_CODEPAGE_437=y
CONFIG_NLS_ASCII=y
CONFIG_NLS_ISO8859_1=y
CONFIG_DMA_CMA=y
CONFIG_FONTS=y
CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y
# CONFIG_SCHED_DEBUG is not set
# CONFIG_DEBUG_PREEMPT is not set
CONFIG_RCU_CPU_STALL_TIMEOUT=60
# CONFIG_FTRACE is not set
CONFIG_OVERLAY_FS=y
CONFIG_SQUASHFS=y
CONFIG_SQUASHFS_XZ=y
CONFIG_SYN_COOKIES=y
CONFIG_WIRELESS=y
CONFIG_CFG80211=m
CONFIG_MAC80211=m
CONFIG_RTL8188EU=m
CONFIG_RTL8192CU=m
CONFIG_RT2X00=m
CONFIG_RT2800USB=m
CONFIG_RT2800USB_RT3573=y
CONFIG_RT2800USB_RT53XX=y
CONFIG_RT2800USB_RT55XX=y
CONFIG_RT2800USB_UNKNOWN=y
CONFIG_MT7601U=m
CONFIG_ATH9K_HTC=m
CONFIG_B43=m
CONFIG_BRCMFMAC=m
CONFIG_BRCMFMAC_USB=y
CONFIG_PPP=m
CONFIG_PPP_ASYNC=m
CONFIG_PPP_BSDCOMP=m
CONFIG_PPP_DEFLATE=m
CONFIG_PPP_FILTER=y
CONFIG_PPP_MULTILINK=y
CONFIG_PPP_SYNC_TTY=m
CONFIG_USB_USBNET=m
CONFIG_USB_NET_CDC_EEM=m
CONFIG_USB_NET_CDC_MBIM=m
CONFIG_USB_NET_HUAWEI_CDC_NCM=m
CONFIG_USB_NET_QMI_WWAN=m
CONFIG_NAMESPACES=y
CONFIG_NETFILTER=y
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
CONFIG_NETFILTER_XT_MATCH_STATE=m
CONFIG_NF_CONNTRACK=m
CONFIG_NF_NAT_IPV4=m
CONFIG_IP_NF_IPTABLES=m
CONFIG_IP_NF_NAT=m
CONFIG_IP_NF_TARGET_MASQUERADE=m
CONFIG_IP_NF_FILTER=m
CONFIG_IP_NF_MANGLE=m
CONFIG_MACVLAN=m
CONFIG_TUN=m
CONFIG_INPUT_TOUCHSCREEN=y
CONFIG_TOUCHSCREEN_USB_COMPOSITE=m
CONFIG_FB_DEFERRED_IO=y
CONFIG_FB_MODE_HELPERS=y
CONFIG_FB_UDL=m
CONFIG_FUSE_FS=m
CONFIG_SPI_SPIDEV=m
CONFIG_PPS_CLIENT_GPIO=m
CONFIG_PPS_CLIENT_LDISC=m
CONFIG_USB_GPIO_VBUS=y
CONFIG_USB_ULPI_BUS=y
CONFIG_USB_EHCI_TT_NEWSCHED=y
CONFIG_SND_USB_AUDIO=m
CONFIG_USB_SERIAL=m
CONFIG_USB_SERIAL_GENERIC=y
CONFIG_USB_SERIAL_OPTION=m
CONFIG_USB_SERIAL_FTDI_SIO=m
CONFIG_CIFS=m
CONFIG_CIFS_STATS2=y
CONFIG_CIFS_UPCALL=y
CONFIG_CIFS_XATTR=y
CONFIG_CIFS_POSIX=y
CONFIG_CIFS_ACL=y
CONFIG_CIFS_DFS_UPCALL=y
CONFIG_STAGING=y
CONFIG_FB_TFT=m
CONFIG_FB_TFT_AGM1264K_FL=m
CONFIG_FB_TFT_BD663474=m
CONFIG_FB_TFT_HX8340BN=m
CONFIG_FB_TFT_HX8347D=m
CONFIG_FB_TFT_HX8353D=m
CONFIG_FB_TFT_HX8357D=m
CONFIG_FB_TFT_ILI9163=m
CONFIG_FB_TFT_ILI9320=m
CONFIG_FB_TFT_ILI9325=m
CONFIG_FB_TFT_ILI9340=m
CONFIG_FB_TFT_ILI9341=m
CONFIG_FB_TFT_ILI9481=m
CONFIG_FB_TFT_ILI9486=m
CONFIG_FB_TFT_PCD8544=m
CONFIG_FB_TFT_RA8875=m
CONFIG_FB_TFT_S6D02A1=m
CONFIG_FB_TFT_S6D1121=m
CONFIG_FB_TFT_SSD1289=m
CONFIG_FB_TFT_SSD1306=m
CONFIG_FB_TFT_SSD1331=m
CONFIG_FB_TFT_SSD1351=m
CONFIG_FB_TFT_ST7735R=m
CONFIG_FB_TFT_ST7789V=m
CONFIG_FB_TFT_TINYLCD=m
CONFIG_FB_TFT_TLS8204=m
CONFIG_FB_TFT_UC1611=m
CONFIG_FB_TFT_UC1701=m
CONFIG_FB_TFT_UPD161704=m
CONFIG_FB_TFT_WATTEROTT=m
CONFIG_FB_FLEX=m
CONFIG_FB_TFT_FBTFT_DEVICE=m
CONFIG_USB_ACM=m
CONFIG_USB_TMC=m
CONFIG_VIDEOBUF2_VMALLOC=m
CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=8
CONFIG_U_SERIAL_CONSOLE=y
CONFIG_USB_F_ACM=m
CONFIG_USB_U_SERIAL=m
CONFIG_USB_U_ETHER=m
CONFIG_USB_F_SERIAL=m
CONFIG_USB_F_OBEX=m
CONFIG_USB_F_NCM=m
CONFIG_USB_F_ECM=m
CONFIG_USB_F_EEM=m
CONFIG_USB_F_SUBSET=m
CONFIG_USB_F_RNDIS=m
CONFIG_USB_F_FS=m
CONFIG_USB_F_UAC1=m
CONFIG_USB_F_UAC2=m
CONFIG_USB_F_UVC=m
CONFIG_USB_F_MIDI=m
CONFIG_USB_F_HID=m
CONFIG_USB_F_PRINTER=m
CONFIG_USB_CONFIGFS_SERIAL=y
CONFIG_USB_CONFIGFS_ACM=y
CONFIG_USB_CONFIGFS_OBEX=y
CONFIG_USB_CONFIGFS_NCM=y
CONFIG_USB_CONFIGFS_ECM=y
CONFIG_USB_CONFIGFS_ECM_SUBSET=y
CONFIG_USB_CONFIGFS_RNDIS=y
CONFIG_USB_CONFIGFS_EEM=y
CONFIG_USB_CONFIGFS_F_LB_SS=y
CONFIG_USB_CONFIGFS_F_FS=y
CONFIG_USB_CONFIGFS_F_UAC1=y
CONFIG_USB_CONFIGFS_F_UAC2=y
CONFIG_USB_CONFIGFS_F_MIDI=y
CONFIG_USB_CONFIGFS_F_HID=y
CONFIG_USB_CONFIGFS_F_UVC=y
CONFIG_USB_CONFIGFS_F_PRINTER=y
CONFIG_USB_AUDIO=m
CONFIG_GADGET_UAC1=y
CONFIG_USB_ETH=m
CONFIG_USB_ETH_RNDIS=y
CONFIG_USB_ETH_EEM=y
CONFIG_USB_G_NCM=m
CONFIG_USB_GADGETFS=m
CONFIG_USB_FUNCTIONFS=m
CONFIG_USB_FUNCTIONFS_ETH=y
CONFIG_USB_FUNCTIONFS_RNDIS=y
CONFIG_USB_FUNCTIONFS_GENERIC=y
CONFIG_USB_MASS_STORAGE=m
CONFIG_USB_G_SERIAL=m
CONFIG_USB_MIDI_GADGET=m
CONFIG_USB_G_PRINTER=m
CONFIG_USB_CDC_COMPOSITE=m
CONFIG_USB_G_ACM_MS=m
CONFIG_USB_G_MULTI=m
CONFIG_USB_G_MULTI_RNDIS=y
CONFIG_USB_G_MULTI_CDC=y
CONFIG_USB_G_HID=m
CONFIG_USB_G_WEBCAM=m
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (C) 2011 - 2015 Xilinx
* Copyright (C) 2012 National Instruments Corp.
*/
/dts-v1/;
#include "zynq-7000.dtsi"
/ {
model = "Red Pitaya Board";
compatible = "xlnx,zynq-red-pitaya", "xlnx,zynq-7000";
aliases {
ethernet0 = &gem0;
serial0 = &uart0;
mmc0 = &sdhci0;
};
memory@0 {
device_type = "memory";
reg = <0x0 0x20000000>;
};
chosen {
bootargs = "";
stdout-path = "serial0:115200n8";
};
usb_phy0: phy0 {
#phy-cells = <0>;
compatible = "usb-nop-xceiv";
};
};
&clkc {
ps-clk-frequency = <33333333>;
};
&gem0 {
status = "okay";
phy-mode = "rgmii-id";
phy-handle = <&ethernet_phy>;
ethernet_phy: ethernet-phy@1 {
reg = <1>;
device_type = "ethernet-phy";
};
};
&i2c0 {
status = "okay";
clock-frequency = <400000>;
eeprom@50 {
compatible = "24c64";
reg = <0x50>;
};
bmp180@77{
compatible = "bosch,bmp280";
reg = <0x77>;
};
};
&sdhci0 {
u-boot,dm-pre-reloc;
status = "okay";
};
&uart0 {
u-boot,dm-pre-reloc;
status = "okay";
};
&usb0 {
status = "okay";
dr_mode = "host";
usb-phy = <&usb_phy0>;
};
/*
* Copyright (C) 2013 Xilinx
*
* Based on "Generic on-chip SRAM allocation driver"
*
* Copyright (C) 2012 Philipp Zabel, Pengutronix
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include <linux/kernel.h>
#include <linux/err.h>
#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/of_irq.h>
#include <linux/platform_device.h>
#include <linux/genalloc.h>
#include "common.h"
#define ZYNQ_OCM_HIGHADDR 0xfffc0000
#define ZYNQ_OCM_LOWADDR 0x0
#define ZYNQ_OCM_BLOCK_SIZE 0x10000
#define ZYNQ_OCM_BLOCKS 4
#define ZYNQ_OCM_GRANULARITY 32
#define ZYNQ_OCM_PARITY_CTRL 0x0
#define ZYNQ_OCM_PARITY_ENABLE 0x1e
#define ZYNQ_OCM_PARITY_ERRADDRESS 0x4
#define ZYNQ_OCM_IRQ_STS 0x8
#define ZYNQ_OCM_IRQ_STS_ERR_MASK 0x7
struct zynq_ocm_dev {
void __iomem *base;
int irq;
struct gen_pool *pool;
struct resource res[ZYNQ_OCM_BLOCKS];
};
/**
* zynq_ocm_irq_handler - Interrupt service routine of the OCM controller
* @irq: IRQ number
* @data: Pointer to the zynq_ocm_dev structure
*
* Return: IRQ_HANDLED when handled; IRQ_NONE otherwise.
*/
static irqreturn_t zynq_ocm_irq_handler(int irq, void *data)
{
u32 sts;
u32 err_addr;
struct zynq_ocm_dev *zynq_ocm = data;
/* check status */
sts = readl(zynq_ocm->base + ZYNQ_OCM_IRQ_STS);
if (sts & ZYNQ_OCM_IRQ_STS_ERR_MASK) {
/* check error address */
err_addr = readl(zynq_ocm->base + ZYNQ_OCM_PARITY_ERRADDRESS);
pr_err("%s: OCM err intr generated at 0x%04x (stat: 0x%08x).",
__func__, err_addr, sts & ZYNQ_OCM_IRQ_STS_ERR_MASK);
return IRQ_HANDLED;
}
pr_warn("%s: Interrupt generated by OCM, but no error is found.",
__func__);
return IRQ_NONE;
}
/**
* zynq_ocm_probe - Probe method for the OCM driver
* @pdev: Pointer to the platform_device structure
*
* This function initializes the driver data structures and the hardware.
*
* Return: 0 on success and error value on failure
*/
static int zynq_ocm_probe(struct platform_device *pdev)
{
int ret;
struct zynq_ocm_dev *zynq_ocm;
u32 i, ocm_config, curr;
struct resource *res;
ocm_config = zynq_slcr_get_ocm_config();
zynq_ocm = devm_kzalloc(&pdev->dev, sizeof(*zynq_ocm), GFP_KERNEL);
if (!zynq_ocm)
return -ENOMEM;
zynq_ocm->pool = devm_gen_pool_create(&pdev->dev,
ilog2(ZYNQ_OCM_GRANULARITY),
NUMA_NO_NODE, NULL);
if (!zynq_ocm->pool)
return -ENOMEM;
curr = 0; /* For storing current struct resource for OCM */
for (i = 0; i < ZYNQ_OCM_BLOCKS; i++) {
u32 base, start, end;
/* Setup base address for 64kB OCM block */
if (ocm_config & BIT(i))
base = ZYNQ_OCM_HIGHADDR;
else
base = ZYNQ_OCM_LOWADDR;
/* Calculate start and end block addresses */
start = i * ZYNQ_OCM_BLOCK_SIZE + base;
end = start + (ZYNQ_OCM_BLOCK_SIZE - 1);
/* Concatenate OCM blocks together to get bigger pool */
if (i > 0 && start == (zynq_ocm->res[curr - 1].end + 1)) {
zynq_ocm->res[curr - 1].end = end;
} else {
#ifdef CONFIG_SMP
/*
* OCM block if placed at 0x0 has special meaning
* for SMP because jump trampoline is added there.
* Ensure that this address won't be allocated.
*/
if (!base) {
u32 trampoline_code_size =
&zynq_secondary_trampoline_end -
&zynq_secondary_trampoline;
dev_dbg(&pdev->dev,
"Allocate reset vector table %dB\n",
trampoline_code_size);
/* postpone start offset */
start += trampoline_code_size;
}
#endif
/* First resource is always initialized */
zynq_ocm->res[curr].start = start;
zynq_ocm->res[curr].end = end;
zynq_ocm->res[curr].flags = IORESOURCE_MEM;
curr++; /* Increment curr value */
}
dev_dbg(&pdev->dev, "OCM block %d, start %x, end %x\n",
i, start, end);
}
/*
* Separate pool allocation from OCM block detection to ensure
* the biggest possible pool.
*/
for (i = 0; i < ZYNQ_OCM_BLOCKS; i++) {
unsigned long size;
void __iomem *virt_base;
/* Skip all zero size resources */
if (zynq_ocm->res[i].end == 0)
break;
dev_dbg(&pdev->dev, "OCM resources %d, start %x, end %x\n",
i, zynq_ocm->res[i].start, zynq_ocm->res[i].end);
size = resource_size(&zynq_ocm->res[i]);
virt_base = devm_ioremap_resource(&pdev->dev,
&zynq_ocm->res[i]);
if (IS_ERR(virt_base))
return PTR_ERR(virt_base);
ret = gen_pool_add_virt(zynq_ocm->pool,
(unsigned long)virt_base,
zynq_ocm->res[i].start, size, -1);
if (ret < 0) {
dev_err(&pdev->dev, "Gen pool failed\n");
return ret;
}
dev_info(&pdev->dev, "ZYNQ OCM pool: %ld KiB @ 0x%p\n",
size / 1024, virt_base);
}
/* Get OCM config space */
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
zynq_ocm->base = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(zynq_ocm->base))
return PTR_ERR(zynq_ocm->base);
/* Allocate OCM parity IRQ */
zynq_ocm->irq = platform_get_irq(pdev, 0);
if (zynq_ocm->irq < 0) {
dev_err(&pdev->dev, "irq resource not found\n");
return zynq_ocm->irq;
}
ret = devm_request_irq(&pdev->dev, zynq_ocm->irq, zynq_ocm_irq_handler,
0, pdev->name, zynq_ocm);
if (ret != 0) {
dev_err(&pdev->dev, "request_irq failed\n");
return ret;
}
/* Enable parity errors */
writel(ZYNQ_OCM_PARITY_ENABLE, zynq_ocm->base + ZYNQ_OCM_PARITY_CTRL);
platform_set_drvdata(pdev, zynq_ocm);
return 0;
}
/**
* zynq_ocm_remove - Remove method for the OCM driver
* @pdev: Pointer to the platform_device structure
*
* This function is called if a device is physically removed from the system or
* if the driver module is being unloaded. It frees all resources allocated to
* the device.
*
* Return: 0 on success and error value on failure
*/
static int zynq_ocm_remove(struct platform_device *pdev)
{
struct zynq_ocm_dev *zynq_ocm = platform_get_drvdata(pdev);
if (gen_pool_avail(zynq_ocm->pool) < gen_pool_size(zynq_ocm->pool))
dev_dbg(&pdev->dev, "removed while SRAM allocated\n");
return 0;
}
static struct of_device_id zynq_ocm_dt_ids[] = {
{ .compatible = "xlnx,zynq-ocmc-1.0" },
{ /* end of table */ }
};
static struct platform_driver zynq_ocm_driver = {
.driver = {
.name = "zynq-ocm",
.of_match_table = zynq_ocm_dt_ids,
},
.probe = zynq_ocm_probe,
.remove = zynq_ocm_remove,
};
static int __init zynq_ocm_init(void)
{
return platform_driver_register(&zynq_ocm_driver);
}
arch_initcall(zynq_ocm_init);
#ifndef __CONFIG_ZYNQ_RED_PITAYA_H
#define __CONFIG_ZYNQ_RED_PITAYA_H
#include <configs/zynq-common.h>
#undef CONFIG_SYS_I2C_EEPROM_ADDR_LEN
#undef CONFIG_SYS_I2C_EEPROM_ADDR
#undef CONFIG_SYS_EEPROM_PAGE_WRITE_BITS
#undef CONFIG_SYS_EEPROM_SIZE
#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2
#define CONFIG_SYS_I2C_EEPROM_ADDR 0x50
#define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS 5
#define CONFIG_SYS_EEPROM_SIZE 8192 /* Bytes */
#endif /* __CONFIG_ZYNQ_RED_PITAYA_H */
CONFIG_ARM=y
CONFIG_ARCH_ZYNQ=y
CONFIG_SYS_TEXT_BASE=0x4000000
CONFIG_SYS_CUSTOM_LDSCRIPT=y
CONFIG_SYS_LDSCRIPT="arch/arm/mach-zynq/u-boot.lds"
CONFIG_DEFAULT_DEVICE_TREE="zynq-red-pitaya"
CONFIG_DISTRO_DEFAULTS=y
CONFIG_CMD_MMC=y
CONFIG_ENV_OVERWRITE=y
CONFIG_ENV_IS_IN_EEPROM=y
CONFIG_ENV_OFFSET=0x1800
CONFIG_ENV_SIZE=0x400
CONFIG_SYS_RELOC_GD_ENV_ADDR=y
CONFIG_MISC=y
CONFIG_I2C_EEPROM=y
CONFIG_DM_I2C=y
CONFIG_SYS_I2C_CADENCE=y
CONFIG_SYS_I2C_EEPROM_ADDR=0x50
CONFIG_SYS_I2C_EEPROM_ADDR_LEN=2
CONFIG_MMC_SDHCI=y
CONFIG_MMC_SDHCI_ZYNQ=y
CONFIG_NET_RANDOM_ETHADDR=y
CONFIG_ZYNQ_GEM=y
CONFIG_ZYNQ_SERIAL=y
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment