From 84d489f64f3b382d5544e342f66d8806e94e85d3 Mon Sep 17 00:00:00 2001 From: Hauke Mehrtens Date: Sun, 26 Jun 2016 14:45:12 +0200 Subject: [PATCH] kernel: update to version 4.4.14 Changelog: https://cdn.kernel.org/pub/linux/kernel/v4.x/ChangeLog-4.4.14 Some manual changes to target/linux/generic/patches-4.4/610- netfilter_match_bypass_default_checks.patch were needed. Signed-off-by: Hauke Mehrtens --- include/kernel-version.mk | 4 +- ...8-MIPS-ath79-ubnt-xm-add-more-boards.patch | 2 +- ...0027-Main-bcm2708-bcm2709-linux-port.patch | 4 +- .../brcm47xx/patches-4.4/159-cpu_fixes.patch | 16 +- .../patches-4.4/160-kmap_coherent.patch | 4 +- ...nce-error-output-if-MS_SILENT-is-set.patch | 7 +- ...bc-compat.h-do-not-rely-on-__GLIBC__.patch | 2 +- ...t-command-line-parameters-from-users.patch | 10 +- .../patches-4.4/531-debloat_lzma.patch | 33 +- ...etfilter_match_bypass_default_checks.patch | 25 +- .../645-bridge_multicast_to_unicast.patch | 5 +- .../patches-4.4/834-ledtrig-libata.patch | 4 +- .../patches-4.4/022-add-db149-dts.patch | 2 +- ...-ipq806x-Disable-i2c-device-on-gsbi4.patch | 6 +- ...d-add-SMEM-parser-for-QCOM-platforms.patch | 11 +- ...-Add-Qualcomm-DWC3-HS-SS-PHY-drivers.patch | 8 +- ...-Add-Qualcomm-PCIe-controller-driver.patch | 6 +- ...Krait-L2-register-accessor-functions.patch | 4 +- ...lit-out-register-accessors-for-reuse.patch | 19 +- ...g-high-rates-to-downstream-clocks-du.patch | 15 +- .../136-clk-Add-safe-switch-hook.patch | 17 +- ...pport-for-High-Frequency-PLLs-HFPLLs.patch | 2 +- .../138-clk-qcom-Add-HFPLL-driver.patch | 4 +- .../139-clk-qcom-Add-IPQ806X-s-HFPLLs.patch | 4 +- ...lk-qcom-Add-support-for-Krait-clocks.patch | 5 +- ...141-clk-qcom-Add-KPSS-ACC-GCC-driver.patch | 6 +- ...om-Add-Krait-clock-controller-driver.patch | 4 +- ...le-to-register-cpufreq-on-Krait-CPUs.patch | 4 +- ...-Add-a-cpufreq-krait-based-on-cpufre.patch | 6 +- .../156-dmaengine-Add-ADM-driver.patch | 4 +- ...access-bad-block-markers-in-raw-mode.patch | 6 +- ...nand-Qualcomm-NAND-controller-driver.patch | 4 +- .../168-ARM-qcom-add-smb208-DT.patch | 49 +- ...arch-arm-force-ZRELADDR-on-arch-qcom.patch | 4 +- .../ipq806x/patches-4.4/400-dsa-add-qca.patch | 1111 +++++------------ ...-add-gmac-nodes-to-ipq806x-platforms.patch | 2 +- ...Fix-fifo-and-dma-support-for-IPQ806x.patch | 17 +- ...t-WDT_BARK_TIME-register-offset-to-o.patch | 7 +- ...stmmac-fix-ipq806x-DMA-configuration.patch | 4 +- .../ipq806x/patches-4.4/800-devicetree.patch | 2 +- .../996-ATAG_DTB_COMPAT_CMDLINE_MANGLE.patch | 10 +- .../0028-NET-lantiq-various-etop-fixes.patch | 81 +- .../0160-owrt-lantiq-multiple-flash.patch | 69 +- .../patches-4.4/0103-nand_fixes.patch | 4 +- .../octeon/patches-4.4/170-cisco-hack.patch | 2 +- .../300-introduce-oxnas-platform.patch | 4 +- ...0720-arch-mips-ralink-add-i2c-clocks.patch | 8 +- 47 files changed, 567 insertions(+), 1060 deletions(-) diff --git a/include/kernel-version.mk b/include/kernel-version.mk index fe3afde8d1..5304c652f6 100644 --- a/include/kernel-version.mk +++ b/include/kernel-version.mk @@ -4,11 +4,11 @@ LINUX_RELEASE?=1 LINUX_VERSION-3.18 = .29 LINUX_VERSION-4.1 = .20 -LINUX_VERSION-4.4 = .13 +LINUX_VERSION-4.4 = .14 LINUX_KERNEL_MD5SUM-3.18.29 = b25737a0bc98e80d12200de93f239c28 LINUX_KERNEL_MD5SUM-4.1.20 = 075c38a3a23ca5bc80437b13606df00a -LINUX_KERNEL_MD5SUM-4.4.13 = d70b6959d8db61bcea7070c089aace9b +LINUX_KERNEL_MD5SUM-4.4.14 = 59e99c3bf5d495f1f95d26257962ca3e ifdef KERNEL_PATCHVER LINUX_VERSION:=$(KERNEL_PATCHVER)$(strip $(LINUX_VERSION-$(KERNEL_PATCHVER))) diff --git a/target/linux/ar71xx/patches-4.4/608-MIPS-ath79-ubnt-xm-add-more-boards.patch b/target/linux/ar71xx/patches-4.4/608-MIPS-ath79-ubnt-xm-add-more-boards.patch index 2bfd58d4e8..b33db4dd0d 100644 --- a/target/linux/ar71xx/patches-4.4/608-MIPS-ath79-ubnt-xm-add-more-boards.patch +++ b/target/linux/ar71xx/patches-4.4/608-MIPS-ath79-ubnt-xm-add-more-boards.patch @@ -2,7 +2,7 @@ +++ b/arch/mips/ath79/Kconfig @@ -68,12 +68,16 @@ config ATH79_MACH_PB44 Atheros PB44 reference board. - + config ATH79_MACH_UBNT_XM - bool "Ubiquiti Networks XM (rev 1.0) board" + bool "Ubiquiti Networks XM/UniFi boards" diff --git a/target/linux/brcm2708/patches-4.4/0027-Main-bcm2708-bcm2709-linux-port.patch b/target/linux/brcm2708/patches-4.4/0027-Main-bcm2708-bcm2709-linux-port.patch index 249716c2b6..47bf84cb80 100644 --- a/target/linux/brcm2708/patches-4.4/0027-Main-bcm2708-bcm2709-linux-port.patch +++ b/target/linux/brcm2708/patches-4.4/0027-Main-bcm2708-bcm2709-linux-port.patch @@ -75,7 +75,7 @@ Signed-off-by: Noralf Trønnes --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig -@@ -317,6 +317,52 @@ choice +@@ -318,6 +318,52 @@ choice default ARCH_VERSATILE if !MMU default ARCH_MULTIPLATFORM if MMU @@ -128,7 +128,7 @@ Signed-off-by: Noralf Trønnes config ARCH_MULTIPLATFORM bool "Allow multiple platforms to be selected" depends on MMU -@@ -808,6 +854,9 @@ config ARCH_VIRT +@@ -809,6 +855,9 @@ config ARCH_VIRT # Kconfigs may be included either alphabetically (according to the # plat- suffix) or along side the corresponding mach-* source. # diff --git a/target/linux/brcm47xx/patches-4.4/159-cpu_fixes.patch b/target/linux/brcm47xx/patches-4.4/159-cpu_fixes.patch index 50df04f1e0..1a3e0a60f9 100644 --- a/target/linux/brcm47xx/patches-4.4/159-cpu_fixes.patch +++ b/target/linux/brcm47xx/patches-4.4/159-cpu_fixes.patch @@ -276,9 +276,9 @@ +int bcm4710 = 0; + /* - * Special Variant of smp_call_function for use by cache functions: + * Bits describing what cache ops an IPI callback function may perform. * -@@ -157,6 +160,9 @@ static void r4k_blast_dcache_user_page_s +@@ -202,6 +205,9 @@ static void r4k_blast_dcache_user_page_s { unsigned long dc_lsize = cpu_dcache_line_size(); @@ -288,7 +288,7 @@ if (dc_lsize == 0) r4k_blast_dcache_user_page = (void *)cache_noop; else if (dc_lsize == 16) -@@ -175,6 +181,9 @@ static void r4k_blast_dcache_page_indexe +@@ -220,6 +226,9 @@ static void r4k_blast_dcache_page_indexe { unsigned long dc_lsize = cpu_dcache_line_size(); @@ -298,7 +298,7 @@ if (dc_lsize == 0) r4k_blast_dcache_page_indexed = (void *)cache_noop; else if (dc_lsize == 16) -@@ -194,6 +203,9 @@ static void r4k_blast_dcache_setup(void) +@@ -239,6 +248,9 @@ static void r4k_blast_dcache_setup(void) { unsigned long dc_lsize = cpu_dcache_line_size(); @@ -308,7 +308,7 @@ if (dc_lsize == 0) r4k_blast_dcache = (void *)cache_noop; else if (dc_lsize == 16) -@@ -793,6 +805,8 @@ static void local_r4k_flush_cache_sigtra +@@ -880,6 +892,8 @@ static void local_r4k_flush_cache_sigtra unsigned long addr = (unsigned long) arg; R4600_HIT_CACHEOP_WAR_IMPL; @@ -317,7 +317,7 @@ if (dc_lsize) protected_writeback_dcache_line(addr & ~(dc_lsize - 1)); if (!cpu_icache_snoops_remote_store && scache_size) -@@ -1602,6 +1616,17 @@ static void coherency_setup(void) +@@ -1704,6 +1718,17 @@ static void coherency_setup(void) * silly idea of putting something else there ... */ switch (current_cpu_type()) { @@ -335,7 +335,7 @@ case CPU_R4000PC: case CPU_R4000SC: case CPU_R4000MC: -@@ -1648,6 +1673,15 @@ void r4k_cache_init(void) +@@ -1750,6 +1775,15 @@ void r4k_cache_init(void) extern void build_copy_page(void); struct cpuinfo_mips *c = ¤t_cpu_data; @@ -351,7 +351,7 @@ probe_pcache(); setup_scache(); -@@ -1717,7 +1751,15 @@ void r4k_cache_init(void) +@@ -1819,7 +1853,15 @@ void r4k_cache_init(void) */ local_r4k___flush_cache_all(NULL); diff --git a/target/linux/brcm47xx/patches-4.4/160-kmap_coherent.patch b/target/linux/brcm47xx/patches-4.4/160-kmap_coherent.patch index 3d65fdfd62..af8c27a674 100644 --- a/target/linux/brcm47xx/patches-4.4/160-kmap_coherent.patch +++ b/target/linux/brcm47xx/patches-4.4/160-kmap_coherent.patch @@ -29,7 +29,7 @@ This fixes OpenWrt ticket #1485: https://dev.openwrt.org/ticket/1485 #endif /* __ASM_MACH_BCM47XX_CPU_FEATURE_OVERRIDES_H */ --- a/arch/mips/mm/c-r4k.c +++ b/arch/mips/mm/c-r4k.c -@@ -600,7 +600,7 @@ static inline void local_r4k_flush_cache +@@ -645,7 +645,7 @@ static inline void local_r4k_flush_cache */ map_coherent = (cpu_has_dc_aliases && page_mapped(page) && !Page_dcache_dirty(page)); @@ -38,7 +38,7 @@ This fixes OpenWrt ticket #1485: https://dev.openwrt.org/ticket/1485 vaddr = kmap_coherent(page, addr); else vaddr = kmap_atomic(page); -@@ -625,7 +625,7 @@ static inline void local_r4k_flush_cache +@@ -670,7 +670,7 @@ static inline void local_r4k_flush_cache } if (vaddr) { diff --git a/target/linux/generic/patches-4.4/046-ubifs-silence-error-output-if-MS_SILENT-is-set.patch b/target/linux/generic/patches-4.4/046-ubifs-silence-error-output-if-MS_SILENT-is-set.patch index 7c01d77a18..ee679fa755 100644 --- a/target/linux/generic/patches-4.4/046-ubifs-silence-error-output-if-MS_SILENT-is-set.patch +++ b/target/linux/generic/patches-4.4/046-ubifs-silence-error-output-if-MS_SILENT-is-set.patch @@ -21,11 +21,9 @@ Signed-off-by: Daniel Golle fs/ubifs/super.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) -diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c -index 7034995..736dd58 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c -@@ -2108,8 +2108,9 @@ static struct dentry *ubifs_mount(struct file_system_type *fs_type, int flags, +@@ -2107,8 +2107,9 @@ static struct dentry *ubifs_mount(struct */ ubi = open_ubi(name, UBI_READONLY); if (IS_ERR(ubi)) { @@ -37,6 +35,3 @@ index 7034995..736dd58 100644 return ERR_CAST(ubi); } --- -2.8.3 - diff --git a/target/linux/generic/patches-4.4/271-uapi-libc-compat.h-do-not-rely-on-__GLIBC__.patch b/target/linux/generic/patches-4.4/271-uapi-libc-compat.h-do-not-rely-on-__GLIBC__.patch index b8e6a3a882..2a29535eed 100644 --- a/target/linux/generic/patches-4.4/271-uapi-libc-compat.h-do-not-rely-on-__GLIBC__.patch +++ b/target/linux/generic/patches-4.4/271-uapi-libc-compat.h-do-not-rely-on-__GLIBC__.patch @@ -28,7 +28,7 @@ Signed-off-by: Jonas Gorski -/* Coordinate with glibc net/if.h header. */ +/* Coordinate with libc net/if.h header. */ - #if defined(_NET_IF_H) + #if defined(_NET_IF_H) && defined(__USE_MISC) -/* GLIBC headers included first so don't define anything +/* LIBC headers included first so don't define anything diff --git a/target/linux/generic/patches-4.4/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch b/target/linux/generic/patches-4.4/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch index 4a056c8bb9..a69d197e62 100644 --- a/target/linux/generic/patches-4.4/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch +++ b/target/linux/generic/patches-4.4/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch @@ -284,15 +284,15 @@ Signed-off-by: Yousong Zhou + EXPORT(kexec_argv_buf) + .skip KEXEC_COMMAND_LINE_SIZE + .size kexec_argv_buf, KEXEC_COMMAND_LINE_SIZE ++ ++kexec_argv: ++ EXPORT(kexec_argv) ++ .skip KEXEC_ARGV_SIZE ++ .size kexec_argv, KEXEC_ARGV_SIZE -relocate_new_kernel_size: - EXPORT(relocate_new_kernel_size) - PTR relocate_new_kernel_end - relocate_new_kernel - .size relocate_new_kernel_size, PTRSIZE -+kexec_argv: -+ EXPORT(kexec_argv) -+ .skip KEXEC_ARGV_SIZE -+ .size kexec_argv, KEXEC_ARGV_SIZE -+ +kexec_relocate_new_kernel_end: + EXPORT(kexec_relocate_new_kernel_end) diff --git a/target/linux/generic/patches-4.4/531-debloat_lzma.patch b/target/linux/generic/patches-4.4/531-debloat_lzma.patch index bbf2b75304..aa3c498016 100644 --- a/target/linux/generic/patches-4.4/531-debloat_lzma.patch +++ b/target/linux/generic/patches-4.4/531-debloat_lzma.patch @@ -219,26 +219,26 @@ { UInt32 dicSize; Byte d; -@@ -935,33 +883,11 @@ static SRes LzmaDec_AllocateProbs2(CLzma +@@ -935,7 +883,7 @@ static SRes LzmaDec_AllocateProbs2(CLzma return SZ_OK; } -SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) --{ -- CLzmaProps propNew; -- RINOK(LzmaProps_Decode(&propNew, props, propsSize)); -- RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); -- p->prop = propNew; -- return SZ_OK; --} -- --SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) +static SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) { CLzmaProps propNew; -- SizeT dicBufSize; RINOK(LzmaProps_Decode(&propNew, props, propsSize)); - RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); +@@ -943,28 +891,6 @@ SRes LzmaDec_AllocateProbs(CLzmaDec *p, + p->prop = propNew; + return SZ_OK; + } +- +-SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) +-{ +- CLzmaProps propNew; +- SizeT dicBufSize; +- RINOK(LzmaProps_Decode(&propNew, props, propsSize)); +- RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); - dicBufSize = propNew.dicSize; - if (p->dic == 0 || dicBufSize != p->dicBufSize) - { @@ -251,9 +251,12 @@ - } - } - p->dicBufSize = dicBufSize; - p->prop = propNew; - return SZ_OK; - } +- p->prop = propNew; +- return SZ_OK; +-} + + SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, --- a/include/linux/lzma/LzmaEnc.h +++ b/include/linux/lzma/LzmaEnc.h @@ -31,9 +31,6 @@ typedef struct _CLzmaEncProps diff --git a/target/linux/generic/patches-4.4/610-netfilter_match_bypass_default_checks.patch b/target/linux/generic/patches-4.4/610-netfilter_match_bypass_default_checks.patch index eccad944ea..ea9558fccf 100644 --- a/target/linux/generic/patches-4.4/610-netfilter_match_bypass_default_checks.patch +++ b/target/linux/generic/patches-4.4/610-netfilter_match_bypass_default_checks.patch @@ -50,25 +50,16 @@ static bool ip_checkentry(const struct ipt_ip *ip) { -@@ -569,7 +595,7 @@ static void cleanup_match(struct xt_entr - } - - static int --check_entry(const struct ipt_entry *e, const char *name) -+check_entry(struct ipt_entry *e, const char *name) - { - const struct xt_entry_target *t; - -@@ -578,6 +604,8 @@ check_entry(const struct ipt_entry *e, c - return -EINVAL; - } +@@ -664,6 +690,8 @@ find_check_entry(struct ipt_entry *e, st + struct xt_mtchk_param mtpar; + struct xt_entry_match *ematch; + ip_checkdefault(&e->ip); + - if (e->target_offset + sizeof(struct xt_entry_target) > - e->next_offset) - return -EINVAL; -@@ -944,6 +972,7 @@ copy_entries_to_user(unsigned int total_ + e->counters.pcnt = xt_percpu_counter_alloc(); + if (IS_ERR_VALUE(e->counters.pcnt)) + return -ENOMEM; +@@ -948,6 +976,7 @@ copy_entries_to_user(unsigned int total_ const struct xt_table_info *private = table->private; int ret = 0; const void *loc_cpu_entry; @@ -76,7 +67,7 @@ counters = alloc_counters(table); if (IS_ERR(counters)) -@@ -970,6 +999,14 @@ copy_entries_to_user(unsigned int total_ +@@ -974,6 +1003,14 @@ copy_entries_to_user(unsigned int total_ ret = -EFAULT; goto free_counters; } diff --git a/target/linux/generic/patches-4.4/645-bridge_multicast_to_unicast.patch b/target/linux/generic/patches-4.4/645-bridge_multicast_to_unicast.patch index a6e974c5ad..bab091262c 100644 --- a/target/linux/generic/patches-4.4/645-bridge_multicast_to_unicast.patch +++ b/target/linux/generic/patches-4.4/645-bridge_multicast_to_unicast.patch @@ -382,6 +382,8 @@ Implement optinal multicast->unicast conversion for igmp snooping - port = (unsigned long)lport > (unsigned long)rport ? - lport : rport; +- +- prev = maybe_deliver(prev, port, skb, __packet_hook); + if ((unsigned long)lport > (unsigned long)rport) { + port = lport; + addr = p->unicast ? p->eth_addr : NULL; @@ -389,8 +391,7 @@ Implement optinal multicast->unicast conversion for igmp snooping + port = rport; + addr = NULL; + } - -- prev = maybe_deliver(prev, port, skb, __packet_hook); ++ + if (addr) + prev = maybe_deliver_addr(prev, port, skb, addr, + __packet_hook); diff --git a/target/linux/generic/patches-4.4/834-ledtrig-libata.patch b/target/linux/generic/patches-4.4/834-ledtrig-libata.patch index 9a9203b140..c60fc1a515 100644 --- a/target/linux/generic/patches-4.4/834-ledtrig-libata.patch +++ b/target/linux/generic/patches-4.4/834-ledtrig-libata.patch @@ -110,11 +110,11 @@ Signed-off-by: Daniel Golle + for (i = 0; i < host->n_ports; i++) { + if (unlikely(!host->ports[i]->ledtrig)) + continue; -+ + + snprintf(host->ports[i]->ledtrig_name, + sizeof(host->ports[i]->ledtrig_name), "ata%u", + host->ports[i]->print_id); - ++ + host->ports[i]->ledtrig->name = host->ports[i]->ledtrig_name; + + if (led_trigger_register(host->ports[i]->ledtrig)) { diff --git a/target/linux/ipq806x/patches-4.4/022-add-db149-dts.patch b/target/linux/ipq806x/patches-4.4/022-add-db149-dts.patch index 4d3e827b51..0845d3f213 100644 --- a/target/linux/ipq806x/patches-4.4/022-add-db149-dts.patch +++ b/target/linux/ipq806x/patches-4.4/022-add-db149-dts.patch @@ -15,7 +15,7 @@ Signed-off-by: Mathieu Olivari --- a/arch/arm/boot/dts/Makefile +++ b/arch/arm/boot/dts/Makefile -@@ -506,6 +506,7 @@ +@@ -506,6 +506,7 @@ dtb-$(CONFIG_ARCH_QCOM) += \ qcom-apq8084-ifc6540.dtb \ qcom-apq8084-mtp.dtb \ qcom-ipq8064-ap148.dtb \ diff --git a/target/linux/ipq806x/patches-4.4/023-ARM-dts-ipq806x-Disable-i2c-device-on-gsbi4.patch b/target/linux/ipq806x/patches-4.4/023-ARM-dts-ipq806x-Disable-i2c-device-on-gsbi4.patch index b8c527b6ae..705306d9f0 100644 --- a/target/linux/ipq806x/patches-4.4/023-ARM-dts-ipq806x-Disable-i2c-device-on-gsbi4.patch +++ b/target/linux/ipq806x/patches-4.4/023-ARM-dts-ipq806x-Disable-i2c-device-on-gsbi4.patch @@ -23,7 +23,7 @@ gsbi5: gsbi@1a200000 { --- a/drivers/clk/qcom/gcc-ipq806x.c +++ b/drivers/clk/qcom/gcc-ipq806x.c -@@ -294,7 +294,7 @@ +@@ -294,7 +294,7 @@ static struct clk_rcg gsbi1_uart_src = { .parent_names = gcc_pxo_pll8, .num_parents = 2, .ops = &clk_rcg_ops, @@ -32,7 +32,7 @@ }, }, }; -@@ -312,7 +312,7 @@ +@@ -312,7 +312,7 @@ static struct clk_branch gsbi1_uart_clk }, .num_parents = 1, .ops = &clk_branch_ops, @@ -41,7 +41,7 @@ }, }, }; -@@ -890,7 +890,7 @@ +@@ -890,7 +890,7 @@ static struct clk_branch gsbi1_h_clk = { .hw.init = &(struct clk_init_data){ .name = "gsbi1_h_clk", .ops = &clk_branch_ops, diff --git a/target/linux/ipq806x/patches-4.4/037-mtd-add-SMEM-parser-for-QCOM-platforms.patch b/target/linux/ipq806x/patches-4.4/037-mtd-add-SMEM-parser-for-QCOM-platforms.patch index d80eb86056..7c0c803565 100644 --- a/target/linux/ipq806x/patches-4.4/037-mtd-add-SMEM-parser-for-QCOM-platforms.patch +++ b/target/linux/ipq806x/patches-4.4/037-mtd-add-SMEM-parser-for-QCOM-platforms.patch @@ -16,11 +16,9 @@ Signed-off-by: Ram Chandra Jangir 3 files changed, 236 insertions(+) create mode 100644 drivers/mtd/qcom_smem_part.c -diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig -index a03ad29..debc887 100644 --- a/drivers/mtd/Kconfig +++ b/drivers/mtd/Kconfig -@@ -190,6 +190,13 @@ +@@ -190,6 +190,13 @@ config MTD_MYLOADER_PARTS You will still need the parsing functions to be called by the driver for your particular device. It won't happen automatically. @@ -34,11 +32,9 @@ index a03ad29..debc887 100644 comment "User Modules And Translation Layers" # -diff --git a/drivers/mtd/Makefile b/drivers/mtd/Makefile -index 99bb9a1..2a44a64 100644 --- a/drivers/mtd/Makefile +++ b/drivers/mtd/Makefile -@@ -16,6 +16,7 @@ +@@ -16,6 +16,7 @@ obj-$(CONFIG_MTD_AR7_PARTS) += ar7part.o obj-$(CONFIG_MTD_BCM63XX_PARTS) += bcm63xxpart.o obj-$(CONFIG_MTD_BCM47XX_PARTS) += bcm47xxpart.o obj-$(CONFIG_MTD_MYLOADER_PARTS) += myloader.o @@ -46,9 +42,6 @@ index 99bb9a1..2a44a64 100644 # 'Users' - code which presents functionality to userspace. obj-$(CONFIG_MTD_BLKDEVS) += mtd_blkdevs.o -diff --git a/drivers/mtd/qcom_smem_part.c b/drivers/mtd/qcom_smem_part.c -new file mode 100644 -index 0000000..f9c1bca --- /dev/null +++ b/drivers/mtd/qcom_smem_part.c @@ -0,0 +1,228 @@ diff --git a/target/linux/ipq806x/patches-4.4/100-usb-phy-Add-Qualcomm-DWC3-HS-SS-PHY-drivers.patch b/target/linux/ipq806x/patches-4.4/100-usb-phy-Add-Qualcomm-DWC3-HS-SS-PHY-drivers.patch index 68f2b39813..4bba0ac557 100644 --- a/target/linux/ipq806x/patches-4.4/100-usb-phy-Add-Qualcomm-DWC3-HS-SS-PHY-drivers.patch +++ b/target/linux/ipq806x/patches-4.4/100-usb-phy-Add-Qualcomm-DWC3-HS-SS-PHY-drivers.patch @@ -1,8 +1,8 @@ --- a/drivers/phy/Kconfig +++ b/drivers/phy/Kconfig -@@ -390,4 +390,15 @@ - Enable this to support the Broadcom Cygnus PCIe PHY. - If unsure, say N. +@@ -390,4 +390,15 @@ config PHY_CYGNUS_PCIE + Enable this to support the Broadcom Cygnus PCIe PHY. + If unsure, say N. +config PHY_QCOM_DWC3 + tristate "QCOM DWC3 USB PHY support" @@ -18,7 +18,7 @@ endmenu --- a/drivers/phy/Makefile +++ b/drivers/phy/Makefile -@@ -48,3 +48,4 @@ obj-$(CONFIG_PHY_TUSB1210) += +@@ -48,3 +48,4 @@ obj-$(CONFIG_PHY_TUSB1210) += phy-tusb1 obj-$(CONFIG_PHY_BRCMSTB_SATA) += phy-brcmstb-sata.o obj-$(CONFIG_PHY_PISTACHIO_USB) += phy-pistachio-usb.o obj-$(CONFIG_PHY_CYGNUS_PCIE) += phy-bcm-cygnus-pcie.o diff --git a/target/linux/ipq806x/patches-4.4/111-PCI-qcom-Add-Qualcomm-PCIe-controller-driver.patch b/target/linux/ipq806x/patches-4.4/111-PCI-qcom-Add-Qualcomm-PCIe-controller-driver.patch index ad1a1b9cb3..4d907988fb 100644 --- a/target/linux/ipq806x/patches-4.4/111-PCI-qcom-Add-Qualcomm-PCIe-controller-driver.patch +++ b/target/linux/ipq806x/patches-4.4/111-PCI-qcom-Add-Qualcomm-PCIe-controller-driver.patch @@ -34,7 +34,7 @@ MAINTAINERS | 7 + --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -8253,6 +8253,13 @@ +@@ -8253,6 +8253,13 @@ S: Maintained F: Documentation/devicetree/bindings/pci/hisilicon-pcie.txt F: drivers/pci/host/pcie-hisi.c @@ -50,7 +50,7 @@ MAINTAINERS | 7 + L: linux-pcmcia@lists.infradead.org --- a/drivers/pci/host/Kconfig +++ b/drivers/pci/host/Kconfig -@@ -173,4 +173,13 @@ +@@ -173,4 +173,13 @@ config PCI_HISI help Say Y here if you want PCIe controller support on HiSilicon HIP05 SoC @@ -745,7 +745,7 @@ MAINTAINERS | 7 + +MODULE_ALIAS("platform:qcom-pcie"); --- a/drivers/pci/host/Makefile +++ b/drivers/pci/host/Makefile -@@ -20,3 +20,4 @@ +@@ -20,3 +20,4 @@ obj-$(CONFIG_PCIE_IPROC_BCMA) += pcie-ip obj-$(CONFIG_PCIE_ALTERA) += pcie-altera.o obj-$(CONFIG_PCIE_ALTERA_MSI) += pcie-altera-msi.o obj-$(CONFIG_PCI_HISI) += pcie-hisi.o diff --git a/target/linux/ipq806x/patches-4.4/133-ARM-Add-Krait-L2-register-accessor-functions.patch b/target/linux/ipq806x/patches-4.4/133-ARM-Add-Krait-L2-register-accessor-functions.patch index 01bd7497d1..36a92c858a 100644 --- a/target/linux/ipq806x/patches-4.4/133-ARM-Add-Krait-L2-register-accessor-functions.patch +++ b/target/linux/ipq806x/patches-4.4/133-ARM-Add-Krait-L2-register-accessor-functions.patch @@ -38,7 +38,7 @@ arch/arm/common/Kconfig | 3 ++ --- a/arch/arm/common/Kconfig +++ b/arch/arm/common/Kconfig -@@ -9,6 +9,9 @@ +@@ -9,6 +9,9 @@ config DMABOUNCE bool select ZONE_DMA @@ -50,7 +50,7 @@ arch/arm/common/Kconfig | 3 ++ --- a/arch/arm/common/Makefile +++ b/arch/arm/common/Makefile -@@ -7,6 +7,7 @@ +@@ -7,6 +7,7 @@ obj-y += firmware.o obj-$(CONFIG_ICST) += icst.o obj-$(CONFIG_SA1111) += sa1111.o obj-$(CONFIG_DMABOUNCE) += dmabounce.o diff --git a/target/linux/ipq806x/patches-4.4/134-clk-mux-Split-out-register-accessors-for-reuse.patch b/target/linux/ipq806x/patches-4.4/134-clk-mux-Split-out-register-accessors-for-reuse.patch index acf5820e6c..6efa5d8045 100644 --- a/target/linux/ipq806x/patches-4.4/134-clk-mux-Split-out-register-accessors-for-reuse.patch +++ b/target/linux/ipq806x/patches-4.4/134-clk-mux-Split-out-register-accessors-for-reuse.patch @@ -18,8 +18,6 @@ Signed-off-by: Ram Chandra Jangir include/linux/clk-provider.h | 9 ++++-- 2 files changed, 53 insertions(+), 30 deletions(-) -diff --git a/drivers/clk/clk-mux.c b/drivers/clk/clk-mux.c -index 7129c86..b03a34d 100644 --- a/drivers/clk/clk-mux.c +++ b/drivers/clk/clk-mux.c @@ -28,35 +28,24 @@ @@ -64,7 +62,7 @@ index 7129c86..b03a34d 100644 val--; if (val >= num_parents) -@@ -64,24 +53,53 @@ static u8 clk_mux_get_parent(struct clk_hw *hw) +@@ -64,24 +53,53 @@ static u8 clk_mux_get_parent(struct clk_ return val; } @@ -127,7 +125,7 @@ index 7129c86..b03a34d 100644 if (mux->lock) spin_lock_irqsave(mux->lock, flags); else -@@ -105,7 +123,7 @@ static int clk_mux_set_parent(struct clk_hw *hw, u8 index) +@@ -105,7 +123,7 @@ static int clk_mux_set_parent(struct clk } const struct clk_ops clk_mux_ops = { @@ -136,7 +134,7 @@ index 7129c86..b03a34d 100644 .set_parent = clk_mux_set_parent, .determine_rate = __clk_mux_determine_rate, }; -@@ -120,7 +138,7 @@ struct clk *clk_register_mux_table(struct device *dev, const char *name, +@@ -120,7 +138,7 @@ struct clk *clk_register_mux_table(struc const char * const *parent_names, u8 num_parents, unsigned long flags, void __iomem *reg, u8 shift, u32 mask, @@ -145,11 +143,9 @@ index 7129c86..b03a34d 100644 { struct clk_mux *mux; struct clk *clk; -diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h -index c56988a..b6b17b5 100644 --- a/include/linux/clk-provider.h +++ b/include/linux/clk-provider.h -@@ -432,7 +432,7 @@ void clk_unregister_divider(struct clk *clk); +@@ -433,7 +433,7 @@ void clk_unregister_divider(struct clk * struct clk_mux { struct clk_hw hw; void __iomem *reg; @@ -158,7 +154,7 @@ index c56988a..b6b17b5 100644 u32 mask; u8 shift; u8 flags; -@@ -448,6 +448,11 @@ struct clk_mux { +@@ -449,6 +449,11 @@ struct clk_mux { extern const struct clk_ops clk_mux_ops; extern const struct clk_ops clk_mux_ro_ops; @@ -170,7 +166,7 @@ index c56988a..b6b17b5 100644 struct clk *clk_register_mux(struct device *dev, const char *name, const char * const *parent_names, u8 num_parents, unsigned long flags, -@@ -458,7 +463,7 @@ struct clk *clk_register_mux_table(struct device *dev, const char *name, +@@ -459,7 +464,7 @@ struct clk *clk_register_mux_table(struc const char * const *parent_names, u8 num_parents, unsigned long flags, void __iomem *reg, u8 shift, u32 mask, @@ -179,6 +175,3 @@ index c56988a..b6b17b5 100644 void clk_unregister_mux(struct clk *clk); --- -2.7.2 - diff --git a/target/linux/ipq806x/patches-4.4/135-clk-Avoid-sending-high-rates-to-downstream-clocks-du.patch b/target/linux/ipq806x/patches-4.4/135-clk-Avoid-sending-high-rates-to-downstream-clocks-du.patch index 5df0a5613e..5015d32d86 100644 --- a/target/linux/ipq806x/patches-4.4/135-clk-Avoid-sending-high-rates-to-downstream-clocks-du.patch +++ b/target/linux/ipq806x/patches-4.4/135-clk-Avoid-sending-high-rates-to-downstream-clocks-du.patch @@ -37,11 +37,9 @@ Signed-off-by: Ram Chandra Jangir drivers/clk/clk.c | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) -diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c -index f13c3f4..8404c3c 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c -@@ -1427,21 +1427,24 @@ static struct clk_core *clk_propagate_rate_change(struct clk_core *core, +@@ -1427,21 +1427,24 @@ static struct clk_core *clk_propagate_ra * walk down a subtree and set the new rates notifying the rate * change on the way */ @@ -73,7 +71,7 @@ index f13c3f4..8404c3c 100644 if (core->new_parent && core->new_parent != core->parent) { old_parent = __clk_set_parent_before(core, core->new_parent); -@@ -1467,7 +1470,7 @@ static void clk_change_rate(struct clk_core *core) +@@ -1467,7 +1470,7 @@ static void clk_change_rate(struct clk_c trace_clk_set_rate_complete(core, core->new_rate); @@ -82,7 +80,7 @@ index f13c3f4..8404c3c 100644 if (core->notifier_count && old_rate != core->rate) __clk_notify(core, POST_RATE_CHANGE, old_rate, core->rate); -@@ -1483,12 +1486,13 @@ static void clk_change_rate(struct clk_core *core) +@@ -1483,12 +1486,13 @@ static void clk_change_rate(struct clk_c /* Skip children who will be reparented to another clock */ if (child->new_parent && child->new_parent != core) continue; @@ -99,7 +97,7 @@ index f13c3f4..8404c3c 100644 } static int clk_core_set_rate_nolock(struct clk_core *core, -@@ -1497,6 +1501,7 @@ static int clk_core_set_rate_nolock(struct clk_core *core, +@@ -1497,6 +1501,7 @@ static int clk_core_set_rate_nolock(stru struct clk_core *top, *fail_clk; unsigned long rate = req_rate; int ret = 0; @@ -107,7 +105,7 @@ index f13c3f4..8404c3c 100644 if (!core) return 0; -@@ -1522,8 +1527,13 @@ static int clk_core_set_rate_nolock(struct clk_core *core, +@@ -1522,8 +1527,13 @@ static int clk_core_set_rate_nolock(stru return -EBUSY; } @@ -122,6 +120,3 @@ index f13c3f4..8404c3c 100644 core->req_rate = req_rate; --- -2.7.2 - diff --git a/target/linux/ipq806x/patches-4.4/136-clk-Add-safe-switch-hook.patch b/target/linux/ipq806x/patches-4.4/136-clk-Add-safe-switch-hook.patch index e969f6bca4..de3ac7d14c 100644 --- a/target/linux/ipq806x/patches-4.4/136-clk-Add-safe-switch-hook.patch +++ b/target/linux/ipq806x/patches-4.4/136-clk-Add-safe-switch-hook.patch @@ -19,8 +19,6 @@ Signed-off-by: Ram Chandra Jangir include/linux/clk-provider.h | 1 + 2 files changed, 54 insertions(+), 8 deletions(-) -diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c -index 8404c3c..a29319a 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -51,9 +51,12 @@ struct clk_core { @@ -46,7 +44,7 @@ index 8404c3c..a29319a 100644 core->new_rate = new_rate; core->new_parent = new_parent; -@@ -1281,6 +1285,18 @@ static void clk_calc_subtree(struct clk_core *core, unsigned long new_rate, +@@ -1281,6 +1285,18 @@ static void clk_calc_subtree(struct clk_ if (new_parent && new_parent != core->parent) new_parent->new_child = core; @@ -65,7 +63,7 @@ index 8404c3c..a29319a 100644 hlist_for_each_entry(child, &core->children, child_node) { child->new_rate = clk_recalc(child, new_rate); clk_calc_subtree(child, child->new_rate, NULL, 0); -@@ -1393,14 +1409,43 @@ static struct clk_core *clk_propagate_rate_change(struct clk_core *core, +@@ -1393,14 +1409,43 @@ static struct clk_core *clk_propagate_ra unsigned long event) { struct clk_core *child, *tmp_clk, *fail_clk = NULL; @@ -112,7 +110,7 @@ index 8404c3c..a29319a 100644 fail_clk = core; } -@@ -1446,7 +1491,8 @@ clk_change_rate(struct clk_core *core, unsigned long best_parent_rate) +@@ -1446,7 +1491,8 @@ clk_change_rate(struct clk_core *core, u old_rate = core->rate; @@ -122,7 +120,7 @@ index 8404c3c..a29319a 100644 old_parent = __clk_set_parent_before(core, core->new_parent); trace_clk_set_parent(core, core->new_parent); -@@ -1472,9 +1518,6 @@ clk_change_rate(struct clk_core *core, unsigned long best_parent_rate) +@@ -1472,9 +1518,6 @@ clk_change_rate(struct clk_core *core, u core->rate = core->new_rate; @@ -132,7 +130,7 @@ index 8404c3c..a29319a 100644 if (core->flags & CLK_RECALC_NEW_RATES) (void)clk_calc_new_rates(core, core->new_rate); -@@ -1537,6 +1580,8 @@ static int clk_core_set_rate_nolock(struct clk_core *core, +@@ -1537,6 +1580,8 @@ static int clk_core_set_rate_nolock(stru core->req_rate = req_rate; @@ -141,8 +139,6 @@ index 8404c3c..a29319a 100644 return ret; } -diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h -index b6b17b5..5d49262 100644 --- a/include/linux/clk-provider.h +++ b/include/linux/clk-provider.h @@ -202,6 +202,7 @@ struct clk_ops { @@ -153,6 +149,3 @@ index b6b17b5..5d49262 100644 int (*set_rate)(struct clk_hw *hw, unsigned long rate, unsigned long parent_rate); int (*set_rate_and_parent)(struct clk_hw *hw, --- -2.7.2 - diff --git a/target/linux/ipq806x/patches-4.4/137-clk-qcom-Add-support-for-High-Frequency-PLLs-HFPLLs.patch b/target/linux/ipq806x/patches-4.4/137-clk-qcom-Add-support-for-High-Frequency-PLLs-HFPLLs.patch index a1b1f4b1f7..4924e5ff4b 100644 --- a/target/linux/ipq806x/patches-4.4/137-clk-qcom-Add-support-for-High-Frequency-PLLs-HFPLLs.patch +++ b/target/linux/ipq806x/patches-4.4/137-clk-qcom-Add-support-for-High-Frequency-PLLs-HFPLLs.patch @@ -28,7 +28,7 @@ I'd really like to get rid of __clk_hfpll_init_once() if possible... --- a/drivers/clk/qcom/Makefile +++ b/drivers/clk/qcom/Makefile -@@ -8,6 +8,7 @@ +@@ -8,6 +8,7 @@ clk-qcom-y += clk-rcg2.o clk-qcom-y += clk-branch.o clk-qcom-y += clk-regmap-divider.o clk-qcom-y += clk-regmap-mux.o diff --git a/target/linux/ipq806x/patches-4.4/138-clk-qcom-Add-HFPLL-driver.patch b/target/linux/ipq806x/patches-4.4/138-clk-qcom-Add-HFPLL-driver.patch index 5a452dbcbc..cc7c4cd177 100644 --- a/target/linux/ipq806x/patches-4.4/138-clk-qcom-Add-HFPLL-driver.patch +++ b/target/linux/ipq806x/patches-4.4/138-clk-qcom-Add-HFPLL-driver.patch @@ -73,7 +73,7 @@ Signed-off-by: Stephen Boyd + }; --- a/drivers/clk/qcom/Kconfig +++ b/drivers/clk/qcom/Kconfig -@@ -106,3 +106,11 @@ +@@ -106,3 +106,11 @@ config MSM_MMCC_8974 Support for the multimedia clock controller on msm8974 devices. Say Y if you want to support multimedia devices such as display, graphics, video encode/decode, camera, etc. @@ -87,7 +87,7 @@ Signed-off-by: Stephen Boyd + such as MSM8974, APQ8084, etc. --- a/drivers/clk/qcom/Makefile +++ b/drivers/clk/qcom/Makefile -@@ -23,3 +23,4 @@ +@@ -23,3 +23,4 @@ obj-$(CONFIG_MSM_LCC_8960) += lcc-msm896 obj-$(CONFIG_MSM_GCC_8974) += gcc-msm8974.o obj-$(CONFIG_MSM_MMCC_8960) += mmcc-msm8960.o obj-$(CONFIG_MSM_MMCC_8974) += mmcc-msm8974.o diff --git a/target/linux/ipq806x/patches-4.4/139-clk-qcom-Add-IPQ806X-s-HFPLLs.patch b/target/linux/ipq806x/patches-4.4/139-clk-qcom-Add-IPQ806X-s-HFPLLs.patch index 5b191b5597..a01decfd8b 100644 --- a/target/linux/ipq806x/patches-4.4/139-clk-qcom-Add-IPQ806X-s-HFPLLs.patch +++ b/target/linux/ipq806x/patches-4.4/139-clk-qcom-Add-IPQ806X-s-HFPLLs.patch @@ -29,7 +29,7 @@ drivers/clk/qcom/gcc-ipq806x.c | 83 ++++++++++++++++++++++++++++++++++++++++++ #include "reset.h" static struct clk_pll pll0 = { -@@ -113,6 +114,85 @@ +@@ -113,6 +114,85 @@ static struct clk_regmap pll8_vote = { }, }; @@ -115,7 +115,7 @@ drivers/clk/qcom/gcc-ipq806x.c | 83 ++++++++++++++++++++++++++++++++++++++++++ static struct clk_pll pll14 = { .l_reg = 0x31c4, .m_reg = 0x31c8, -@@ -2837,6 +2917,9 @@ +@@ -2837,6 +2917,9 @@ static struct clk_regmap *gcc_ipq806x_cl [UBI32_CORE2_CLK_SRC] = &ubi32_core2_src_clk.clkr, [NSSTCM_CLK_SRC] = &nss_tcm_src.clkr, [NSSTCM_CLK] = &nss_tcm_clk.clkr, diff --git a/target/linux/ipq806x/patches-4.4/140-clk-qcom-Add-support-for-Krait-clocks.patch b/target/linux/ipq806x/patches-4.4/140-clk-qcom-Add-support-for-Krait-clocks.patch index 522482d841..ecf1ef589c 100644 --- a/target/linux/ipq806x/patches-4.4/140-clk-qcom-Add-support-for-Krait-clocks.patch +++ b/target/linux/ipq806x/patches-4.4/140-clk-qcom-Add-support-for-Krait-clocks.patch @@ -30,7 +30,7 @@ drivers/clk/qcom/Kconfig | 4 ++ --- a/drivers/clk/qcom/Kconfig +++ b/drivers/clk/qcom/Kconfig -@@ -114,3 +114,7 @@ +@@ -114,3 +114,7 @@ config QCOM_HFPLL Support for the high-frequency PLLs present on Qualcomm devices. Say Y if you want to support CPU frequency scaling on devices such as MSM8974, APQ8084, etc. @@ -40,7 +40,7 @@ drivers/clk/qcom/Kconfig | 4 ++ + select KRAIT_L2_ACCESSORS --- a/drivers/clk/qcom/Makefile +++ b/drivers/clk/qcom/Makefile -@@ -8,6 +8,7 @@ +@@ -8,6 +8,7 @@ clk-qcom-y += clk-rcg2.o clk-qcom-y += clk-branch.o clk-qcom-y += clk-regmap-divider.o clk-qcom-y += clk-regmap-mux.o @@ -48,7 +48,6 @@ drivers/clk/qcom/Kconfig | 4 ++ clk-qcom-y += clk-hfpll.o clk-qcom-y += reset.o clk-qcom-$(CONFIG_QCOM_GDSC) += gdsc.o - --- /dev/null +++ b/drivers/clk/qcom/clk-krait.c @@ -0,0 +1,166 @@ diff --git a/target/linux/ipq806x/patches-4.4/141-clk-qcom-Add-KPSS-ACC-GCC-driver.patch b/target/linux/ipq806x/patches-4.4/141-clk-qcom-Add-KPSS-ACC-GCC-driver.patch index b2ddbc8a68..2b0bbb01a3 100644 --- a/target/linux/ipq806x/patches-4.4/141-clk-qcom-Add-KPSS-ACC-GCC-driver.patch +++ b/target/linux/ipq806x/patches-4.4/141-clk-qcom-Add-KPSS-ACC-GCC-driver.patch @@ -31,7 +31,7 @@ Signed-off-by: Stephen Boyd --- a/Documentation/devicetree/bindings/arm/msm/qcom,kpss-acc.txt +++ b/Documentation/devicetree/bindings/arm/msm/qcom,kpss-acc.txt -@@ -21,10 +21,17 @@ +@@ -21,10 +21,17 @@ PROPERTIES the register region. An optional second element specifies the base address and size of the alias register region. @@ -82,7 +82,7 @@ Signed-off-by: Stephen Boyd + }; --- a/drivers/clk/qcom/Kconfig +++ b/drivers/clk/qcom/Kconfig -@@ -115,6 +115,14 @@ +@@ -115,6 +115,14 @@ config QCOM_HFPLL Say Y if you want to support CPU frequency scaling on devices such as MSM8974, APQ8084, etc. @@ -99,7 +99,7 @@ Signed-off-by: Stephen Boyd select KRAIT_L2_ACCESSORS --- a/drivers/clk/qcom/Makefile +++ b/drivers/clk/qcom/Makefile -@@ -9,6 +9,7 @@ +@@ -9,6 +9,7 @@ clk-qcom-y += clk-branch.o clk-qcom-y += clk-regmap-divider.o clk-qcom-y += clk-regmap-mux.o clk-qcom-$(CONFIG_KRAIT_CLOCKS) += clk-krait.o diff --git a/target/linux/ipq806x/patches-4.4/142-clk-qcom-Add-Krait-clock-controller-driver.patch b/target/linux/ipq806x/patches-4.4/142-clk-qcom-Add-Krait-clock-controller-driver.patch index f0e946781b..813366fdca 100644 --- a/target/linux/ipq806x/patches-4.4/142-clk-qcom-Add-Krait-clock-controller-driver.patch +++ b/target/linux/ipq806x/patches-4.4/142-clk-qcom-Add-Krait-clock-controller-driver.patch @@ -56,7 +56,7 @@ Signed-off-by: Stephen Boyd + }; --- a/drivers/clk/qcom/Kconfig +++ b/drivers/clk/qcom/Kconfig -@@ -123,6 +123,14 @@ +@@ -123,6 +123,14 @@ config KPSS_XCC if you want to support CPU frequency scaling on devices such as MSM8960, APQ8064, etc. @@ -73,7 +73,7 @@ Signed-off-by: Stephen Boyd select KRAIT_L2_ACCESSORS --- a/drivers/clk/qcom/Makefile +++ b/drivers/clk/qcom/Makefile -@@ -26,3 +26,4 @@ +@@ -26,3 +26,4 @@ obj-$(CONFIG_MSM_GCC_8974) += gcc-msm897 obj-$(CONFIG_MSM_MMCC_8960) += mmcc-msm8960.o obj-$(CONFIG_MSM_MMCC_8974) += mmcc-msm8974.o obj-$(CONFIG_QCOM_HFPLL) += hfpll.o diff --git a/target/linux/ipq806x/patches-4.4/143-cpufreq-Add-module-to-register-cpufreq-on-Krait-CPUs.patch b/target/linux/ipq806x/patches-4.4/143-cpufreq-Add-module-to-register-cpufreq-on-Krait-CPUs.patch index d4c43f412a..e8d8ddf674 100644 --- a/target/linux/ipq806x/patches-4.4/143-cpufreq-Add-module-to-register-cpufreq-on-Krait-CPUs.patch +++ b/target/linux/ipq806x/patches-4.4/143-cpufreq-Add-module-to-register-cpufreq-on-Krait-CPUs.patch @@ -69,7 +69,7 @@ Signed-off-by: Stephen Boyd + }; --- a/drivers/cpufreq/Kconfig.arm +++ b/drivers/cpufreq/Kconfig.arm -@@ -95,6 +95,15 @@ +@@ -95,6 +95,15 @@ config ARM_OMAP2PLUS_CPUFREQ depends on ARCH_OMAP2PLUS default ARCH_OMAP2PLUS @@ -87,7 +87,7 @@ Signed-off-by: Stephen Boyd help --- a/drivers/cpufreq/Makefile +++ b/drivers/cpufreq/Makefile -@@ -61,6 +61,7 @@ +@@ -61,6 +61,7 @@ obj-$(CONFIG_ARM_MT8173_CPUFREQ) += mt81 obj-$(CONFIG_ARM_OMAP2PLUS_CPUFREQ) += omap-cpufreq.o obj-$(CONFIG_ARM_PXA2xx_CPUFREQ) += pxa2xx-cpufreq.o obj-$(CONFIG_PXA3xx) += pxa3xx-cpufreq.o diff --git a/target/linux/ipq806x/patches-4.4/145-cpufreq-Add-a-cpufreq-krait-based-on-cpufre.patch b/target/linux/ipq806x/patches-4.4/145-cpufreq-Add-a-cpufreq-krait-based-on-cpufre.patch index f33c9e0d8c..67770e8ce9 100644 --- a/target/linux/ipq806x/patches-4.4/145-cpufreq-Add-a-cpufreq-krait-based-on-cpufre.patch +++ b/target/linux/ipq806x/patches-4.4/145-cpufreq-Add-a-cpufreq-krait-based-on-cpufre.patch @@ -21,7 +21,7 @@ Signed-off-by: Stephen Boyd --- a/drivers/cpufreq/Kconfig +++ b/drivers/cpufreq/Kconfig -@@ -198,6 +198,19 @@ +@@ -198,6 +198,19 @@ config CPUFREQ_DT If in doubt, say N. @@ -43,7 +43,7 @@ Signed-off-by: Stephen Boyd endif --- a/drivers/cpufreq/Makefile +++ b/drivers/cpufreq/Makefile -@@ -13,6 +13,7 @@ +@@ -13,6 +13,7 @@ obj-$(CONFIG_CPU_FREQ_GOV_CONSERVATIVE) obj-$(CONFIG_CPU_FREQ_GOV_COMMON) += cpufreq_governor.o obj-$(CONFIG_CPUFREQ_DT) += cpufreq-dt.o @@ -446,7 +446,7 @@ Signed-off-by: Stephen Boyd +MODULE_LICENSE("GPL v2"); --- a/drivers/cpufreq/qcom-cpufreq.c +++ b/drivers/cpufreq/qcom-cpufreq.c -@@ -168,11 +168,8 @@ +@@ -168,11 +168,8 @@ static int __init qcom_cpufreq_populate_ static int __init qcom_cpufreq_driver_init(void) { diff --git a/target/linux/ipq806x/patches-4.4/156-dmaengine-Add-ADM-driver.patch b/target/linux/ipq806x/patches-4.4/156-dmaengine-Add-ADM-driver.patch index 805f28f323..02038aa942 100644 --- a/target/linux/ipq806x/patches-4.4/156-dmaengine-Add-ADM-driver.patch +++ b/target/linux/ipq806x/patches-4.4/156-dmaengine-Add-ADM-driver.patch @@ -35,7 +35,7 @@ drivers/dma/Kconfig | 10 + --- a/drivers/dma/Kconfig +++ b/drivers/dma/Kconfig -@@ -558,4 +558,14 @@ +@@ -558,4 +558,14 @@ config DMATEST config DMA_ENGINE_RAID bool @@ -955,7 +955,7 @@ drivers/dma/Kconfig | 10 + +MODULE_LICENSE("GPL v2"); --- a/drivers/dma/Makefile +++ b/drivers/dma/Makefile -@@ -65,5 +65,6 @@ +@@ -65,5 +65,6 @@ obj-$(CONFIG_TI_DMA_CROSSBAR) += ti-dma- obj-$(CONFIG_TI_EDMA) += edma.o obj-$(CONFIG_XGENE_DMA) += xgene-dma.o obj-$(CONFIG_ZX_DMA) += zx296702_dma.o diff --git a/target/linux/ipq806x/patches-4.4/161-mtd-nand-Create-a-BBT-flag-to-access-bad-block-markers-in-raw-mode.patch b/target/linux/ipq806x/patches-4.4/161-mtd-nand-Create-a-BBT-flag-to-access-bad-block-markers-in-raw-mode.patch index 21fe405b90..154649dca6 100644 --- a/target/linux/ipq806x/patches-4.4/161-mtd-nand-Create-a-BBT-flag-to-access-bad-block-markers-in-raw-mode.patch +++ b/target/linux/ipq806x/patches-4.4/161-mtd-nand-Create-a-BBT-flag-to-access-bad-block-markers-in-raw-mode.patch @@ -38,7 +38,7 @@ drivers/mtd/nand/nand_base.c | 6 +++++- --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c -@@ -394,7 +394,11 @@ +@@ -394,7 +394,11 @@ static int nand_default_block_markbad(st } else { ops.len = ops.ooblen = 1; } @@ -53,7 +53,7 @@ drivers/mtd/nand/nand_base.c | 6 +++++- if (chip->bbt_options & NAND_BBT_SCANLASTPAGE) --- a/drivers/mtd/nand/nand_bbt.c +++ b/drivers/mtd/nand/nand_bbt.c -@@ -420,7 +420,11 @@ +@@ -420,7 +420,11 @@ static int scan_block_fast(struct mtd_in ops.oobbuf = buf; ops.ooboffs = 0; ops.datbuf = NULL; @@ -68,7 +68,7 @@ drivers/mtd/nand/nand_base.c | 6 +++++- /* --- a/include/linux/mtd/bbm.h +++ b/include/linux/mtd/bbm.h -@@ -116,6 +116,12 @@ +@@ -116,6 +116,12 @@ struct nand_bbt_descr { #define NAND_BBT_NO_OOB_BBM 0x00080000 /* diff --git a/target/linux/ipq806x/patches-4.4/162-mtd-nand-Qualcomm-NAND-controller-driver.patch b/target/linux/ipq806x/patches-4.4/162-mtd-nand-Qualcomm-NAND-controller-driver.patch index 19e5f91812..84ff6e74e0 100644 --- a/target/linux/ipq806x/patches-4.4/162-mtd-nand-Qualcomm-NAND-controller-driver.patch +++ b/target/linux/ipq806x/patches-4.4/162-mtd-nand-Qualcomm-NAND-controller-driver.patch @@ -80,7 +80,7 @@ drivers/mtd/nand/Kconfig | 7 + --- a/drivers/mtd/nand/Kconfig +++ b/drivers/mtd/nand/Kconfig -@@ -546,4 +546,11 @@ +@@ -546,4 +546,11 @@ config MTD_NAND_HISI504 help Enables support for NAND controller on Hisilicon SoC Hip04. @@ -2015,7 +2015,7 @@ drivers/mtd/nand/Kconfig | 7 + +MODULE_LICENSE("GPL v2"); --- a/drivers/mtd/nand/Makefile +++ b/drivers/mtd/nand/Makefile -@@ -55,5 +55,6 @@ +@@ -55,5 +55,6 @@ obj-$(CONFIG_MTD_NAND_BCM47XXNFLASH) += obj-$(CONFIG_MTD_NAND_SUNXI) += sunxi_nand.o obj-$(CONFIG_MTD_NAND_HISI504) += hisi504_nand.o obj-$(CONFIG_MTD_NAND_BRCMNAND) += brcmnand/ diff --git a/target/linux/ipq806x/patches-4.4/168-ARM-qcom-add-smb208-DT.patch b/target/linux/ipq806x/patches-4.4/168-ARM-qcom-add-smb208-DT.patch index ef81ed2e55..0ad0508a9d 100644 --- a/target/linux/ipq806x/patches-4.4/168-ARM-qcom-add-smb208-DT.patch +++ b/target/linux/ipq806x/patches-4.4/168-ARM-qcom-add-smb208-DT.patch @@ -11,31 +11,31 @@ Signed-off-by: Adrian Panella - smb208_s1a: smb208-s1a { - compatible = "qcom,rpm-smb208"; - reg = ; -- -- regulator-min-microvolt = <1050000>; -- regulator-max-microvolt = <1150000>; + regulators { + compatible = "qcom,rpm-smb208-regulators"; -- qcom,switch-mode-frequency = <1200000>; -- -- }; +- regulator-min-microvolt = <1050000>; +- regulator-max-microvolt = <1150000>; + smb208_s1a: s1a { + regulator-min-microvolt = <1050000>; + regulator-max-microvolt = <1150000>; +- qcom,switch-mode-frequency = <1200000>; ++ qcom,switch-mode-frequency = <1200000>; + +- }; +- - smb208_s1b: smb208-s1b { - compatible = "qcom,rpm-smb208"; - reg = ; -+ qcom,switch-mode-frequency = <1200000>; - +- - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1150000>; -- -- qcom,switch-mode-frequency = <1200000>; -- }; + }; +- qcom,switch-mode-frequency = <1200000>; +- }; +- - smb208_s2a: smb208-s2a { - compatible = "qcom,rpm-smb208"; - reg = ; @@ -71,7 +71,7 @@ Signed-off-by: Adrian Panella + }; }; }; - + --- a/arch/arm/boot/dts/qcom-ipq8065.dtsi +++ b/arch/arm/boot/dts/qcom-ipq8065.dtsi @@ -311,45 +311,37 @@ @@ -81,31 +81,31 @@ Signed-off-by: Adrian Panella - smb208_s1a: smb208-s1a { - compatible = "qcom,rpm-smb208"; - reg = ; -- -- regulator-min-microvolt = <1050000>; -- regulator-max-microvolt = <1150000>; + regulators { + compatible = "qcom,rpm-smb208-regulators"; -- qcom,switch-mode-frequency = <1200000>; -- -- }; +- regulator-min-microvolt = <1050000>; +- regulator-max-microvolt = <1150000>; + smb208_s1a: s1a { + regulator-min-microvolt = <1050000>; + regulator-max-microvolt = <1150000>; +- qcom,switch-mode-frequency = <1200000>; ++ qcom,switch-mode-frequency = <1200000>; + +- }; +- - smb208_s1b: smb208-s1b { - compatible = "qcom,rpm-smb208"; - reg = ; -+ qcom,switch-mode-frequency = <1200000>; - +- - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1150000>; -- -- qcom,switch-mode-frequency = <1200000>; -- }; + }; +- qcom,switch-mode-frequency = <1200000>; +- }; +- - smb208_s2a: smb208-s2a { - compatible = "qcom,rpm-smb208"; - reg = ; @@ -140,4 +140,5 @@ Signed-off-by: Adrian Panella + qcom,switch-mode-frequency = <1400000>; + }; }; - }; + + cxo_clk: cxo-clk { diff --git a/target/linux/ipq806x/patches-4.4/300-arch-arm-force-ZRELADDR-on-arch-qcom.patch b/target/linux/ipq806x/patches-4.4/300-arch-arm-force-ZRELADDR-on-arch-qcom.patch index c0281ff070..35ba6fbb22 100644 --- a/target/linux/ipq806x/patches-4.4/300-arch-arm-force-ZRELADDR-on-arch-qcom.patch +++ b/target/linux/ipq806x/patches-4.4/300-arch-arm-force-ZRELADDR-on-arch-qcom.patch @@ -33,7 +33,7 @@ Signed-off-by: Mathieu Olivari --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig -@@ -323,7 +323,7 @@ +@@ -324,7 +324,7 @@ config ARCH_MULTIPLATFORM select ARCH_WANT_OPTIONAL_GPIOLIB select ARM_HAS_SG_CHAIN select ARM_PATCH_PHYS_VIRT @@ -44,7 +44,7 @@ Signed-off-by: Mathieu Olivari select GENERIC_CLOCKEVENTS --- a/arch/arm/Makefile +++ b/arch/arm/Makefile -@@ -256,9 +256,11 @@ +@@ -256,9 +256,11 @@ MACHINE := arch/arm/mach-$(word 1,$(mac else MACHINE := endif diff --git a/target/linux/ipq806x/patches-4.4/400-dsa-add-qca.patch b/target/linux/ipq806x/patches-4.4/400-dsa-add-qca.patch index 9457e1d8ad..c369ab914a 100644 --- a/target/linux/ipq806x/patches-4.4/400-dsa-add-qca.patch +++ b/target/linux/ipq806x/patches-4.4/400-dsa-add-qca.patch @@ -40,24 +40,22 @@ Signed-off-by: Mathieu Olivari create mode 100644 drivers/net/dsa/ar8xxx.c create mode 100644 drivers/net/dsa/ar8xxx.h -diff --git a/drivers/net/dsa/Kconfig b/drivers/net/dsa/Kconfig -index 7ad0a4d..2aae541 100644 --- a/drivers/net/dsa/Kconfig +++ b/drivers/net/dsa/Kconfig -@@ -65,4 +65,11 @@ config NET_DSA_BCM_SF2 +@@ -65,4 +65,13 @@ config NET_DSA_BCM_SF2 This enables support for the Broadcom Starfighter 2 Ethernet switch chips. +config NET_DSA_AR8XXX + tristate "Qualcomm Atheros AR8XXX Ethernet switch family support" + depends on NET_DSA ++ select NET_DSA_TAG_QCA ++ select REGMAP + ---help--- + This enables support for the Qualcomm Atheros AR8XXX Ethernet + switch chips. + endmenu -diff --git a/drivers/net/dsa/Makefile b/drivers/net/dsa/Makefile -index e2d51c4..7647687 100644 --- a/drivers/net/dsa/Makefile +++ b/drivers/net/dsa/Makefile @@ -14,3 +14,4 @@ ifdef CONFIG_NET_DSA_MV88E6171 @@ -65,12 +63,9 @@ index e2d51c4..7647687 100644 endif obj-$(CONFIG_NET_DSA_BCM_SF2) += bcm_sf2.o +obj-$(CONFIG_NET_DSA_AR8XXX) += ar8xxx.o -diff --git a/drivers/net/dsa/ar8xxx.c b/drivers/net/dsa/ar8xxx.c -new file mode 100644 -index 0000000..4ce3ffc --- /dev/null +++ b/drivers/net/dsa/ar8xxx.c -@@ -0,0 +1,303 @@ +@@ -0,0 +1,529 @@ +/* + * Copyright (C) 2009 Felix Fietkau + * Copyright (C) 2011-2012 Gabor Juhos @@ -92,9 +87,59 @@ index 0000000..4ce3ffc +#include +#include +#include ++#include + +#include "ar8xxx.h" + ++#define MIB_DESC(_s, _o, _n) \ ++ { \ ++ .size = (_s), \ ++ .offset = (_o), \ ++ .name = (_n), \ ++ } ++ ++static const struct ar8xxx_mib_desc ar8327_mib[] = { ++ MIB_DESC(1, 0x00, "RxBroad"), ++ MIB_DESC(1, 0x04, "RxPause"), ++ MIB_DESC(1, 0x08, "RxMulti"), ++ MIB_DESC(1, 0x0c, "RxFcsErr"), ++ MIB_DESC(1, 0x10, "RxAlignErr"), ++ MIB_DESC(1, 0x14, "RxRunt"), ++ MIB_DESC(1, 0x18, "RxFragment"), ++ MIB_DESC(1, 0x1c, "Rx64Byte"), ++ MIB_DESC(1, 0x20, "Rx128Byte"), ++ MIB_DESC(1, 0x24, "Rx256Byte"), ++ MIB_DESC(1, 0x28, "Rx512Byte"), ++ MIB_DESC(1, 0x2c, "Rx1024Byte"), ++ MIB_DESC(1, 0x30, "Rx1518Byte"), ++ MIB_DESC(1, 0x34, "RxMaxByte"), ++ MIB_DESC(1, 0x38, "RxTooLong"), ++ MIB_DESC(2, 0x3c, "RxGoodByte"), ++ MIB_DESC(2, 0x44, "RxBadByte"), ++ MIB_DESC(1, 0x4c, "RxOverFlow"), ++ MIB_DESC(1, 0x50, "Filtered"), ++ MIB_DESC(1, 0x54, "TxBroad"), ++ MIB_DESC(1, 0x58, "TxPause"), ++ MIB_DESC(1, 0x5c, "TxMulti"), ++ MIB_DESC(1, 0x60, "TxUnderRun"), ++ MIB_DESC(1, 0x64, "Tx64Byte"), ++ MIB_DESC(1, 0x68, "Tx128Byte"), ++ MIB_DESC(1, 0x6c, "Tx256Byte"), ++ MIB_DESC(1, 0x70, "Tx512Byte"), ++ MIB_DESC(1, 0x74, "Tx1024Byte"), ++ MIB_DESC(1, 0x78, "Tx1518Byte"), ++ MIB_DESC(1, 0x7c, "TxMaxByte"), ++ MIB_DESC(1, 0x80, "TxOverSize"), ++ MIB_DESC(2, 0x84, "TxByte"), ++ MIB_DESC(1, 0x8c, "TxCollision"), ++ MIB_DESC(1, 0x90, "TxAbortCol"), ++ MIB_DESC(1, 0x94, "TxMultiCol"), ++ MIB_DESC(1, 0x98, "TxSingleCol"), ++ MIB_DESC(1, 0x9c, "TxExcDefer"), ++ MIB_DESC(1, 0xa0, "TxDefer"), ++ MIB_DESC(1, 0xa4, "TxLateCol"), ++}; ++ +u32 +ar8xxx_mii_read32(struct mii_bus *bus, int phy_id, int regnum) +{ @@ -200,6 +245,57 @@ index 0000000..4ce3ffc + } +} + ++static int ar8xxx_regmap_read(void *ctx, uint32_t reg, uint32_t *val) ++{ ++ struct dsa_switch *ds = (struct dsa_switch *)ctx; ++ ++ *val = ar8xxx_read(ds, reg); ++ ++ return 0; ++} ++ ++static int ar8xxx_regmap_write(void *ctx, uint32_t reg, uint32_t val) ++{ ++ struct dsa_switch *ds = (struct dsa_switch *)ctx; ++ ++ ar8xxx_write(ds, reg, val); ++ ++ return 0; ++} ++ ++static const struct regmap_range ar8xxx_readable_ranges[] = { ++ regmap_reg_range(0x0000, 0x00e4), /* Global control */ ++ regmap_reg_range(0x0100, 0x0168), /* EEE control */ ++ regmap_reg_range(0x0200, 0x0270), /* Parser control */ ++ regmap_reg_range(0x0400, 0x0454), /* ACL */ ++ regmap_reg_range(0x0600, 0x0718), /* Lookup */ ++ regmap_reg_range(0x0800, 0x0b70), /* QM */ ++ regmap_reg_range(0x0C00, 0x0c80), /* PKT */ ++ regmap_reg_range(0x1000, 0x10ac), /* MIB - Port0 */ ++ regmap_reg_range(0x1100, 0x11ac), /* MIB - Port1 */ ++ regmap_reg_range(0x1200, 0x12ac), /* MIB - Port2 */ ++ regmap_reg_range(0x1300, 0x13ac), /* MIB - Port3 */ ++ regmap_reg_range(0x1400, 0x14ac), /* MIB - Port4 */ ++ regmap_reg_range(0x1500, 0x15ac), /* MIB - Port5 */ ++ regmap_reg_range(0x1600, 0x16ac), /* MIB - Port6 */ ++ ++}; ++ ++static struct regmap_access_table ar8xxx_readable_table = { ++ .yes_ranges = ar8xxx_readable_ranges, ++ .n_yes_ranges = ARRAY_SIZE(ar8xxx_readable_ranges), ++}; ++ ++struct regmap_config ar8xxx_regmap_config = { ++ .reg_bits = 16, ++ .val_bits = 32, ++ .reg_stride = 4, ++ .max_register = 0x16ac, /* end MIB - Port6 range */ ++ .reg_read = ar8xxx_regmap_read, ++ .reg_write = ar8xxx_regmap_write, ++ .rd_table = &ar8xxx_readable_table, ++}; ++ +static int ar8xxx_set_pad_ctrl(struct dsa_switch *ds, int port, int mode) +{ + int reg; @@ -233,6 +329,9 @@ index 0000000..4ce3ffc + ar8xxx_write(ds, AR8327_REG_PORT5_PAD_CTRL, + AR8327_PORT_PAD_RGMII_RX_DELAY_EN); + break; ++ case PHY_INTERFACE_MODE_SGMII: ++ ar8xxx_write(ds, reg, AR8327_PORT_PAD_SGMII_EN); ++ break; + default: + pr_err("xMII mode %d not supported\n", mode); + return -EINVAL; @@ -241,11 +340,61 @@ index 0000000..4ce3ffc + return 0; +} + ++static int ar8xxx_of_setup(struct dsa_switch *ds) ++{ ++ struct device_node *dn = ds->pd->of_node; ++ const char *s_phymode; ++ int ret, mode; ++ u32 phy_id, ctrl; ++ ++ /* If port6-phy-mode property exists, configure it accordingly */ ++ if (!of_property_read_string(dn, "qca,port6-phy-mode", &s_phymode)) { ++ for (mode = 0; mode < PHY_INTERFACE_MODE_MAX; mode++) ++ if (!strcasecmp(s_phymode, phy_modes(mode))) ++ break; ++ ++ if (mode == PHY_INTERFACE_MODE_MAX) ++ pr_err("Unknown phy-mode: \"%s\"\n", s_phymode); ++ ++ ret = ar8xxx_set_pad_ctrl(ds, 6, mode); ++ if (ret < 0) ++ return ret; ++ } ++ ++ /* If a phy ID is specified for PORT6 mac, connect them together */ ++ if (!of_property_read_u32(dn, "qca,port6-phy-id", &phy_id)) { ++ ar8xxx_rmw(ds, AR8327_PORT_LOOKUP_CTRL(6), ++ AR8327_PORT_LOOKUP_MEMBER, BIT(phy_to_port(phy_id))); ++ ar8xxx_rmw(ds, AR8327_PORT_LOOKUP_CTRL(phy_to_port(phy_id)), ++ AR8327_PORT_LOOKUP_MEMBER, BIT(6)); ++ ++ /* We want the switch to be pass-through and act like a PHY on ++ * these ports. So BC/MC/UC & IGMP frames need to be accepted ++ */ ++ ctrl = BIT(phy_to_port(phy_id)) | BIT(6); ++ ar8xxx_reg_set(ds, AR8327_REG_GLOBAL_FW_CTRL1, ++ ctrl << AR8327_GLOBAL_FW_CTRL1_IGMP_DP_S | ++ ctrl << AR8327_GLOBAL_FW_CTRL1_BC_DP_S | ++ ctrl << AR8327_GLOBAL_FW_CTRL1_MC_DP_S | ++ ctrl << AR8327_GLOBAL_FW_CTRL1_UC_DP_S); ++ } ++ ++ return 0; ++} ++ +static int ar8xxx_setup(struct dsa_switch *ds) +{ ++ struct ar8xxx_priv *priv = ds_to_priv(ds); + struct net_device *netdev = ds->dst->pd->of_netdev; + int ret, i, phy_mode; + ++ /* Start by setting up the register mapping */ ++ priv->regmap = devm_regmap_init(ds->master_dev, NULL, ds, ++ &ar8xxx_regmap_config); ++ ++ if (IS_ERR(priv->regmap)) ++ pr_warn("regmap initialization failed"); ++ + /* Initialize CPU port pad mode (xMII type, delays...) */ + phy_mode = of_get_phy_mode(netdev->dev.parent->of_node); + if (phy_mode < 0) { @@ -257,11 +406,31 @@ index 0000000..4ce3ffc + if (ret < 0) + return ret; + ++ /* Enable CPU Port */ ++ ar8xxx_reg_set(ds, AR8327_REG_GLOBAL_FW_CTRL0, ++ AR8327_GLOBAL_FW_CTRL0_CPU_PORT_EN); ++ ++ /* Enable MIB counters */ ++ ar8xxx_reg_set(ds, AR8327_REG_MIB, AR8327_MIB_CPU_KEEP); ++ ar8xxx_write(ds, AR8327_REG_MODULE_EN, AR8327_MODULE_EN_MIB); ++ ++ /* Enable QCA header mode on Port 0 */ ++ ar8xxx_write(ds, AR8327_REG_PORT_HDR_CTRL(0), ++ AR8327_PORT_HDR_CTRL_ALL << AR8327_PORT_HDR_CTRL_TX_S | ++ AR8327_PORT_HDR_CTRL_ALL << AR8327_PORT_HDR_CTRL_RX_S); ++ + /* Disable forwarding by default on all ports */ + for (i = 0; i < AR8327_NUM_PORTS; i++) + ar8xxx_rmw(ds, AR8327_PORT_LOOKUP_CTRL(i), + AR8327_PORT_LOOKUP_MEMBER, 0); + ++ /* Forward all unknown frames to CPU port for Linux processing */ ++ ar8xxx_write(ds, AR8327_REG_GLOBAL_FW_CTRL1, ++ BIT(0) << AR8327_GLOBAL_FW_CTRL1_IGMP_DP_S | ++ BIT(0) << AR8327_GLOBAL_FW_CTRL1_BC_DP_S | ++ BIT(0) << AR8327_GLOBAL_FW_CTRL1_MC_DP_S | ++ BIT(0) << AR8327_GLOBAL_FW_CTRL1_UC_DP_S); ++ + /* Setup connection between CPU ports & PHYs */ + for (i = 0; i < DSA_MAX_PORTS; i++) { + /* CPU port gets connected to all PHYs in the switch */ @@ -273,11 +442,23 @@ index 0000000..4ce3ffc + + /* Invividual PHYs gets connected to CPU port only */ + if (ds->phys_port_mask & BIT(i)) { -+ ar8xxx_rmw(ds, AR8327_PORT_LOOKUP_CTRL(phy_to_port(i)), ++ int phy = phy_to_port(i); ++ ++ ar8xxx_rmw(ds, AR8327_PORT_LOOKUP_CTRL(phy), + AR8327_PORT_LOOKUP_MEMBER, BIT(0)); ++ ++ /* Disable Auto-learning by default so the switch ++ * doesn't try to forward the frame to another port ++ */ ++ ar8xxx_reg_clear(ds, AR8327_PORT_LOOKUP_CTRL(phy), ++ AR8327_PORT_LOOKUP_LEARN); + } + } + ++ ret = ar8xxx_of_setup(ds); ++ if (ret < 0) ++ return ret; ++ + return 0; +} + @@ -301,6 +482,42 @@ index 0000000..4ce3ffc + return mdiobus_write(bus, phy, regnum, val); +} + ++static void ar8xxx_get_strings(struct dsa_switch *ds, int phy, uint8_t *data) ++{ ++ int i; ++ ++ for (i = 0; i < ARRAY_SIZE(ar8327_mib); i++) { ++ strncpy(data + i * ETH_GSTRING_LEN, ar8327_mib[i].name, ++ ETH_GSTRING_LEN); ++ } ++} ++ ++static void ar8xxx_get_ethtool_stats(struct dsa_switch *ds, int phy, ++ uint64_t *data) ++{ ++ const struct ar8xxx_mib_desc *mib; ++ uint32_t reg, i, port; ++ u64 hi; ++ ++ port = phy_to_port(phy); ++ ++ for (i = 0; i < ARRAY_SIZE(ar8327_mib); i++) { ++ mib = &ar8327_mib[i]; ++ reg = AR8327_PORT_MIB_COUNTER(port) + mib->offset; ++ ++ data[i] = ar8xxx_read(ds, reg); ++ if (mib->size == 2) { ++ hi = ar8xxx_read(ds, reg + 4); ++ data[i] |= hi << 32; ++ } ++ } ++} ++ ++static int ar8xxx_get_sset_count(struct dsa_switch *ds) ++{ ++ return ARRAY_SIZE(ar8327_mib); ++} ++ +static void ar8xxx_poll_link(struct dsa_switch *ds) +{ + int i = 0; @@ -348,13 +565,17 @@ index 0000000..4ce3ffc +} + +static struct dsa_switch_driver ar8xxx_switch_driver = { -+ .tag_protocol = DSA_TAG_PROTO_NONE, -+ .probe = ar8xxx_probe, -+ .setup = ar8xxx_setup, -+ .set_addr = ar8xxx_set_addr, -+ .poll_link = ar8xxx_poll_link, -+ .phy_read = ar8xxx_phy_read, -+ .phy_write = ar8xxx_phy_write, ++ .tag_protocol = DSA_TAG_PROTO_QCA, ++ .priv_size = sizeof(struct ar8xxx_priv), ++ .probe = ar8xxx_probe, ++ .setup = ar8xxx_setup, ++ .set_addr = ar8xxx_set_addr, ++ .poll_link = ar8xxx_poll_link, ++ .phy_read = ar8xxx_phy_read, ++ .phy_write = ar8xxx_phy_write, ++ .get_strings = ar8xxx_get_strings, ++ .get_ethtool_stats = ar8xxx_get_ethtool_stats, ++ .get_sset_count = ar8xxx_get_sset_count, +}; + +static int __init ar8xxx_init(void) @@ -374,12 +595,9 @@ index 0000000..4ce3ffc +MODULE_DESCRIPTION("Driver for AR8XXX ethernet switch family"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:ar8xxx"); -diff --git a/drivers/net/dsa/ar8xxx.h b/drivers/net/dsa/ar8xxx.h -new file mode 100644 -index 0000000..a29b6d3 --- /dev/null +++ b/drivers/net/dsa/ar8xxx.h -@@ -0,0 +1,82 @@ +@@ -0,0 +1,156 @@ +/* + * Copyright (C) 2009 Felix Fietkau + * Copyright (C) 2011-2012 Gabor Juhos @@ -399,6 +617,17 @@ index 0000000..a29b6d3 +#define __AR8XXX_H + +#include ++#include ++ ++struct ar8xxx_priv { ++ struct regmap *regmap; ++}; ++ ++struct ar8xxx_mib_desc { ++ unsigned int size; ++ unsigned int offset; ++ const char *name; ++}; + +#define AR8327_NUM_PORTS 7 + @@ -413,6 +642,14 @@ index 0000000..a29b6d3 +#define AR8327_PORT_PAD_RGMII_RX_DELAY_EN BIT(24) +#define AR8327_PORT_PAD_SGMII_EN BIT(7) + ++#define AR8327_REG_MODULE_EN 0x030 ++#define AR8327_MODULE_EN_MIB BIT(0) ++#define AR8327_MODULE_EN_ACL BIT(1) ++#define AR8327_MODULE_EN_L3 BIT(2) ++ ++#define AR8327_REG_MIB 0x034 ++#define AR8327_MIB_CPU_KEEP BIT(20) ++ +#define AR8327_REG_PORT_STATUS(_i) (0x07c + (_i) * 4) +#define AR8XXX_PORT_STATUS_SPEED GENMASK(2, 0) +#define AR8XXX_PORT_STATUS_SPEED_S 0 @@ -425,7 +662,29 @@ index 0000000..a29b6d3 +#define AR8XXX_PORT_STATUS_LINK_AUTO BIT(9) +#define AR8XXX_PORT_STATUS_LINK_PAUSE BIT(10) + -+#define AR8327_PORT_LOOKUP_CTRL(_i) (0x660 + (_i) * 0xc) ++#define AR8327_REG_PORT_HDR_CTRL(_i) (0x9c + (_i * 4)) ++#define AR8327_PORT_HDR_CTRL_RX_MASK GENMASK(3, 2) ++#define AR8327_PORT_HDR_CTRL_RX_S 2 ++#define AR8327_PORT_HDR_CTRL_TX_MASK GENMASK(1, 0) ++#define AR8327_PORT_HDR_CTRL_TX_S 0 ++#define AR8327_PORT_HDR_CTRL_ALL 2 ++#define AR8327_PORT_HDR_CTRL_MGMT 1 ++#define AR8327_PORT_HDR_CTRL_NONE 0 ++ ++#define AR8327_REG_GLOBAL_FW_CTRL0 0x620 ++#define AR8327_GLOBAL_FW_CTRL0_CPU_PORT_EN BIT(10) ++ ++#define AR8327_REG_GLOBAL_FW_CTRL1 0x624 ++#define AR8327_GLOBAL_FW_CTRL1_IGMP_DP_MASK GENMASK(30, 24) ++#define AR8327_GLOBAL_FW_CTRL1_IGMP_DP_S 24 ++#define AR8327_GLOBAL_FW_CTRL1_BC_DP_MASK GENMASK(22, 16) ++#define AR8327_GLOBAL_FW_CTRL1_BC_DP_S 16 ++#define AR8327_GLOBAL_FW_CTRL1_MC_DP_MASK GENMASK(14, 8) ++#define AR8327_GLOBAL_FW_CTRL1_MC_DP_S 8 ++#define AR8327_GLOBAL_FW_CTRL1_UC_DP_MASK GENMASK(6, 0) ++#define AR8327_GLOBAL_FW_CTRL1_UC_DP_S 0 ++ ++#define AR8327_PORT_LOOKUP_CTRL(_i) (0x660 + (_i) * 0xc) +#define AR8327_PORT_LOOKUP_MEMBER GENMASK(6, 0) +#define AR8327_PORT_LOOKUP_IN_MODE GENMASK(9, 8) +#define AR8327_PORT_LOOKUP_IN_MODE_S 8 @@ -434,6 +693,8 @@ index 0000000..a29b6d3 +#define AR8327_PORT_LOOKUP_LEARN BIT(20) +#define AR8327_PORT_LOOKUP_ING_MIRROR_EN BIT(25) + ++#define AR8327_PORT_MIB_COUNTER(_i) (0x1000 + (_i) * 0x100) ++ +/* port speed */ +enum { + AR8XXX_PORT_SPEED_10M = 0, @@ -442,251 +703,6 @@ index 0000000..a29b6d3 + AR8XXX_PORT_SPEED_ERR = 3, +}; + -+static inline void -+split_addr(u32 regaddr, u16 *r1, u16 *r2, u16 *page) -+{ -+ regaddr >>= 1; -+ *r1 = regaddr & 0x1e; -+ -+ regaddr >>= 5; -+ *r2 = regaddr & 0x7; -+ -+ regaddr >>= 3; -+ *page = regaddr & 0x1ff; -+} -+ -+static inline void -+wait_for_page_switch(void) -+{ -+ udelay(5); -+} -+ -+#endif /* __AR8XXX_H */ -diff --git a/net/dsa/dsa.c b/net/dsa/dsa.c -index e6f6cc3..fffb9aa 100644 ---- a/net/dsa/dsa.c -+++ b/net/dsa/dsa.c -@@ -893,6 +893,7 @@ static SIMPLE_DEV_PM_OPS(dsa_pm_ops, dsa_suspend, dsa_resume); - - static const struct of_device_id dsa_of_match_table[] = { - { .compatible = "brcm,bcm7445-switch-v4.0" }, -+ { .compatible = "qca,ar8xxx", }, - { .compatible = "marvell,dsa", }, - {} - }; - -From patchwork Fri May 29 01:42:17 2015 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Subject: [2/7] net: dsa: ar8xxx: add ethtool hw statistics support -From: Mathieu Olivari -X-Patchwork-Id: 477524 -X-Patchwork-Delegate: davem@davemloft.net -Message-Id: <1432863742-18427-3-git-send-email-mathieu@codeaurora.org> -To: robh+dt@kernel.org, pawel.moll@arm.com, mark.rutland@arm.com, - ijc+devicetree@hellion.org.uk, galak@codeaurora.org, - davem@davemloft.net, mathieu@codeaurora.org, andrew@lunn.ch, - f.fainelli@gmail.com, linux@roeck-us.net, gang.chen.5i5j@gmail.com, - jiri@resnulli.us, leitec@staticky.com, fabf@skynet.be, - alexander.h.duyck@intel.com, pavel.nakonechny@skitlab.ru, - joe@perches.com, sfeldma@gmail.com, nbd@nbd.name, juhosg@openwrt.org -Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, - netdev@vger.kernel.org -Date: Thu, 28 May 2015 18:42:17 -0700 - -MIB counters can now be reported through each switch port by using -"ethtool -S". - -Signed-off-by: Mathieu Olivari ---- - drivers/net/dsa/ar8xxx.c | 106 +++++++++++++++++++++++++++++++++++++++++++---- - drivers/net/dsa/ar8xxx.h | 47 +++++++++++++++++++++ - 2 files changed, 146 insertions(+), 7 deletions(-) - -diff --git a/drivers/net/dsa/ar8xxx.c b/drivers/net/dsa/ar8xxx.c -index 4ce3ffc..2f0fa4d 100644 ---- a/drivers/net/dsa/ar8xxx.c -+++ b/drivers/net/dsa/ar8xxx.c -@@ -22,6 +22,55 @@ - - #include "ar8xxx.h" - -+#define MIB_DESC(_s, _o, _n) \ -+ { \ -+ .size = (_s), \ -+ .offset = (_o), \ -+ .name = (_n), \ -+ } -+ -+static const struct ar8xxx_mib_desc ar8327_mib[] = { -+ MIB_DESC(1, 0x00, "RxBroad"), -+ MIB_DESC(1, 0x04, "RxPause"), -+ MIB_DESC(1, 0x08, "RxMulti"), -+ MIB_DESC(1, 0x0c, "RxFcsErr"), -+ MIB_DESC(1, 0x10, "RxAlignErr"), -+ MIB_DESC(1, 0x14, "RxRunt"), -+ MIB_DESC(1, 0x18, "RxFragment"), -+ MIB_DESC(1, 0x1c, "Rx64Byte"), -+ MIB_DESC(1, 0x20, "Rx128Byte"), -+ MIB_DESC(1, 0x24, "Rx256Byte"), -+ MIB_DESC(1, 0x28, "Rx512Byte"), -+ MIB_DESC(1, 0x2c, "Rx1024Byte"), -+ MIB_DESC(1, 0x30, "Rx1518Byte"), -+ MIB_DESC(1, 0x34, "RxMaxByte"), -+ MIB_DESC(1, 0x38, "RxTooLong"), -+ MIB_DESC(2, 0x3c, "RxGoodByte"), -+ MIB_DESC(2, 0x44, "RxBadByte"), -+ MIB_DESC(1, 0x4c, "RxOverFlow"), -+ MIB_DESC(1, 0x50, "Filtered"), -+ MIB_DESC(1, 0x54, "TxBroad"), -+ MIB_DESC(1, 0x58, "TxPause"), -+ MIB_DESC(1, 0x5c, "TxMulti"), -+ MIB_DESC(1, 0x60, "TxUnderRun"), -+ MIB_DESC(1, 0x64, "Tx64Byte"), -+ MIB_DESC(1, 0x68, "Tx128Byte"), -+ MIB_DESC(1, 0x6c, "Tx256Byte"), -+ MIB_DESC(1, 0x70, "Tx512Byte"), -+ MIB_DESC(1, 0x74, "Tx1024Byte"), -+ MIB_DESC(1, 0x78, "Tx1518Byte"), -+ MIB_DESC(1, 0x7c, "TxMaxByte"), -+ MIB_DESC(1, 0x80, "TxOverSize"), -+ MIB_DESC(2, 0x84, "TxByte"), -+ MIB_DESC(1, 0x8c, "TxCollision"), -+ MIB_DESC(1, 0x90, "TxAbortCol"), -+ MIB_DESC(1, 0x94, "TxMultiCol"), -+ MIB_DESC(1, 0x98, "TxSingleCol"), -+ MIB_DESC(1, 0x9c, "TxExcDefer"), -+ MIB_DESC(1, 0xa0, "TxDefer"), -+ MIB_DESC(1, 0xa4, "TxLateCol"), -+}; -+ - u32 - ar8xxx_mii_read32(struct mii_bus *bus, int phy_id, int regnum) - { -@@ -184,6 +233,10 @@ static int ar8xxx_setup(struct dsa_switch *ds) - if (ret < 0) - return ret; - -+ /* Enable MIB counters */ -+ ar8xxx_reg_set(ds, AR8327_REG_MIB, AR8327_MIB_CPU_KEEP); -+ ar8xxx_write(ds, AR8327_REG_MODULE_EN, AR8327_MODULE_EN_MIB); -+ - /* Disable forwarding by default on all ports */ - for (i = 0; i < AR8327_NUM_PORTS; i++) - ar8xxx_rmw(ds, AR8327_PORT_LOOKUP_CTRL(i), -@@ -228,6 +281,42 @@ ar8xxx_phy_write(struct dsa_switch *ds, int phy, int regnum, u16 val) - return mdiobus_write(bus, phy, regnum, val); - } - -+static void ar8xxx_get_strings(struct dsa_switch *ds, int phy, uint8_t *data) -+{ -+ int i; -+ -+ for (i = 0; i < ARRAY_SIZE(ar8327_mib); i++) { -+ strncpy(data + i * ETH_GSTRING_LEN, ar8327_mib[i].name, -+ ETH_GSTRING_LEN); -+ } -+} -+ -+static void ar8xxx_get_ethtool_stats(struct dsa_switch *ds, int phy, -+ uint64_t *data) -+{ -+ const struct ar8xxx_mib_desc *mib; -+ uint32_t reg, i, port; -+ u64 hi; -+ -+ port = phy_to_port(phy); -+ -+ for (i = 0; i < ARRAY_SIZE(ar8327_mib); i++) { -+ mib = &ar8327_mib[i]; -+ reg = AR8327_PORT_MIB_COUNTER(port) + mib->offset; -+ -+ data[i] = ar8xxx_read(ds, reg); -+ if (mib->size == 2) { -+ hi = ar8xxx_read(ds, reg + 4); -+ data[i] |= hi << 32; -+ } -+ } -+} -+ -+static int ar8xxx_get_sset_count(struct dsa_switch *ds) -+{ -+ return ARRAY_SIZE(ar8327_mib); -+} -+ - static void ar8xxx_poll_link(struct dsa_switch *ds) - { - int i = 0; -@@ -275,13 +364,16 @@ static void ar8xxx_poll_link(struct dsa_switch *ds) - } - - static struct dsa_switch_driver ar8xxx_switch_driver = { -- .tag_protocol = DSA_TAG_PROTO_NONE, -- .probe = ar8xxx_probe, -- .setup = ar8xxx_setup, -- .set_addr = ar8xxx_set_addr, -- .poll_link = ar8xxx_poll_link, -- .phy_read = ar8xxx_phy_read, -- .phy_write = ar8xxx_phy_write, -+ .tag_protocol = DSA_TAG_PROTO_NONE, -+ .probe = ar8xxx_probe, -+ .setup = ar8xxx_setup, -+ .set_addr = ar8xxx_set_addr, -+ .poll_link = ar8xxx_poll_link, -+ .phy_read = ar8xxx_phy_read, -+ .phy_write = ar8xxx_phy_write, -+ .get_strings = ar8xxx_get_strings, -+ .get_ethtool_stats = ar8xxx_get_ethtool_stats, -+ .get_sset_count = ar8xxx_get_sset_count, - }; - - static int __init ar8xxx_init(void) -diff --git a/drivers/net/dsa/ar8xxx.h b/drivers/net/dsa/ar8xxx.h -index a29b6d3..7c7a125 100644 ---- a/drivers/net/dsa/ar8xxx.h -+++ b/drivers/net/dsa/ar8xxx.h -@@ -18,6 +18,12 @@ - - #include - -+struct ar8xxx_mib_desc { -+ unsigned int size; -+ unsigned int offset; -+ const char *name; -+}; -+ - #define AR8327_NUM_PORTS 7 - - #define PHY_ID_QCA8337 0x004dd036 -@@ -31,6 +37,14 @@ - #define AR8327_PORT_PAD_RGMII_RX_DELAY_EN BIT(24) - #define AR8327_PORT_PAD_SGMII_EN BIT(7) - -+#define AR8327_REG_MODULE_EN 0x030 -+#define AR8327_MODULE_EN_MIB BIT(0) -+#define AR8327_MODULE_EN_ACL BIT(1) -+#define AR8327_MODULE_EN_L3 BIT(2) -+ -+#define AR8327_REG_MIB 0x034 -+#define AR8327_MIB_CPU_KEEP BIT(20) -+ - #define AR8327_REG_PORT_STATUS(_i) (0x07c + (_i) * 4) - #define AR8XXX_PORT_STATUS_SPEED GENMASK(2, 0) - #define AR8XXX_PORT_STATUS_SPEED_S 0 -@@ -52,6 +66,8 @@ - #define AR8327_PORT_LOOKUP_LEARN BIT(20) - #define AR8327_PORT_LOOKUP_ING_MIRROR_EN BIT(25) - -+#define AR8327_PORT_MIB_COUNTER(_i) (0x1000 + (_i) * 0x100) -+ - /* port speed */ - enum { - AR8XXX_PORT_SPEED_10M = 0, -@@ -60,6 +76,25 @@ enum { - AR8XXX_PORT_SPEED_ERR = 3, - }; - +static inline int port_to_phy(int port) +{ + if (port >= 1 && port <= 6) @@ -705,216 +721,61 @@ index a29b6d3..7c7a125 100644 + +u32 +ar8xxx_rmw(struct dsa_switch *ds, int reg, u32 mask, u32 val); -+ - static inline void - split_addr(u32 regaddr, u16 *r1, u16 *r2, u16 *page) - { -@@ -79,4 +114,16 @@ wait_for_page_switch(void) - udelay(5); - } - -+static inline void -+ar8xxx_reg_set(struct dsa_switch *ds, int reg, u32 val) -+{ -+ ar8xxx_rmw(ds, reg, 0, val); -+} + +static inline void -+ar8xxx_reg_clear(struct dsa_switch *ds, int reg, u32 val) -+{ -+ ar8xxx_rmw(ds, reg, val, 0); -+} -+ - #endif /* __AR8XXX_H */ - -From patchwork Fri May 29 01:42:18 2015 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Subject: [3/7] net: dsa: ar8xxx: add regmap support -From: Mathieu Olivari -X-Patchwork-Id: 477522 -X-Patchwork-Delegate: davem@davemloft.net -Message-Id: <1432863742-18427-4-git-send-email-mathieu@codeaurora.org> -To: robh+dt@kernel.org, pawel.moll@arm.com, mark.rutland@arm.com, - ijc+devicetree@hellion.org.uk, galak@codeaurora.org, - davem@davemloft.net, mathieu@codeaurora.org, andrew@lunn.ch, - f.fainelli@gmail.com, linux@roeck-us.net, gang.chen.5i5j@gmail.com, - jiri@resnulli.us, leitec@staticky.com, fabf@skynet.be, - alexander.h.duyck@intel.com, pavel.nakonechny@skitlab.ru, - joe@perches.com, sfeldma@gmail.com, nbd@nbd.name, juhosg@openwrt.org -Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, - netdev@vger.kernel.org -Date: Thu, 28 May 2015 18:42:18 -0700 - -All switch registers can now be dumped using regmap/debugfs. - -\# cat /sys/kernel/debug/regmap//registers -0000: 00001302 -0004: ... -... - -Signed-off-by: Mathieu Olivari ---- - drivers/net/dsa/Kconfig | 1 + - drivers/net/dsa/ar8xxx.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ - drivers/net/dsa/ar8xxx.h | 5 ++++ - 3 files changed, 66 insertions(+) - -diff --git a/drivers/net/dsa/Kconfig b/drivers/net/dsa/Kconfig -index 2aae541..17fb296 100644 ---- a/drivers/net/dsa/Kconfig -+++ b/drivers/net/dsa/Kconfig -@@ -68,6 +68,7 @@ config NET_DSA_BCM_SF2 - config NET_DSA_AR8XXX - tristate "Qualcomm Atheros AR8XXX Ethernet switch family support" - depends on NET_DSA -+ select REGMAP - ---help--- - This enables support for the Qualcomm Atheros AR8XXX Ethernet - switch chips. -diff --git a/drivers/net/dsa/ar8xxx.c b/drivers/net/dsa/ar8xxx.c -index 2f0fa4d..327abd4 100644 ---- a/drivers/net/dsa/ar8xxx.c -+++ b/drivers/net/dsa/ar8xxx.c -@@ -176,6 +176,57 @@ static char *ar8xxx_probe(struct device *host_dev, int sw_addr) - } - } - -+static int ar8xxx_regmap_read(void *ctx, uint32_t reg, uint32_t *val) -+{ -+ struct dsa_switch *ds = (struct dsa_switch *)ctx; -+ -+ *val = ar8xxx_read(ds, reg); -+ -+ return 0; -+} -+ -+static int ar8xxx_regmap_write(void *ctx, uint32_t reg, uint32_t val) ++split_addr(u32 regaddr, u16 *r1, u16 *r2, u16 *page) +{ -+ struct dsa_switch *ds = (struct dsa_switch *)ctx; ++ regaddr >>= 1; ++ *r1 = regaddr & 0x1e; + -+ ar8xxx_write(ds, reg, val); ++ regaddr >>= 5; ++ *r2 = regaddr & 0x7; + -+ return 0; ++ regaddr >>= 3; ++ *page = regaddr & 0x1ff; +} + -+static const struct regmap_range ar8xxx_readable_ranges[] = { -+ regmap_reg_range(0x0000, 0x00e4), /* Global control */ -+ regmap_reg_range(0x0100, 0x0168), /* EEE control */ -+ regmap_reg_range(0x0200, 0x0270), /* Parser control */ -+ regmap_reg_range(0x0400, 0x0454), /* ACL */ -+ regmap_reg_range(0x0600, 0x0718), /* Lookup */ -+ regmap_reg_range(0x0800, 0x0b70), /* QM */ -+ regmap_reg_range(0x0C00, 0x0c80), /* PKT */ -+ regmap_reg_range(0x1000, 0x10ac), /* MIB - Port0 */ -+ regmap_reg_range(0x1100, 0x11ac), /* MIB - Port1 */ -+ regmap_reg_range(0x1200, 0x12ac), /* MIB - Port2 */ -+ regmap_reg_range(0x1300, 0x13ac), /* MIB - Port3 */ -+ regmap_reg_range(0x1400, 0x14ac), /* MIB - Port4 */ -+ regmap_reg_range(0x1500, 0x15ac), /* MIB - Port5 */ -+ regmap_reg_range(0x1600, 0x16ac), /* MIB - Port6 */ -+ -+}; -+ -+static struct regmap_access_table ar8xxx_readable_table = { -+ .yes_ranges = ar8xxx_readable_ranges, -+ .n_yes_ranges = ARRAY_SIZE(ar8xxx_readable_ranges), -+}; -+ -+struct regmap_config ar8xxx_regmap_config = { -+ .reg_bits = 16, -+ .val_bits = 32, -+ .reg_stride = 4, -+ .max_register = 0x16ac, /* end MIB - Port6 range */ -+ .reg_read = ar8xxx_regmap_read, -+ .reg_write = ar8xxx_regmap_write, -+ .rd_table = &ar8xxx_readable_table, -+}; -+ - static int ar8xxx_set_pad_ctrl(struct dsa_switch *ds, int port, int mode) - { - int reg; -@@ -219,9 +270,17 @@ static int ar8xxx_set_pad_ctrl(struct dsa_switch *ds, int port, int mode) - - static int ar8xxx_setup(struct dsa_switch *ds) - { -+ struct ar8xxx_priv *priv = ds_to_priv(ds); - struct net_device *netdev = ds->dst->pd->of_netdev; - int ret, i, phy_mode; - -+ /* Start by setting up the register mapping */ -+ priv->regmap = devm_regmap_init(ds->master_dev, NULL, ds, -+ &ar8xxx_regmap_config); ++static inline void ++wait_for_page_switch(void) ++{ ++ udelay(5); ++} + -+ if (IS_ERR(priv->regmap)) -+ pr_warn("regmap initialization failed"); ++static inline void ++ar8xxx_reg_set(struct dsa_switch *ds, int reg, u32 val) ++{ ++ ar8xxx_rmw(ds, reg, 0, val); ++} + - /* Initialize CPU port pad mode (xMII type, delays...) */ - phy_mode = of_get_phy_mode(netdev->dev.parent->of_node); - if (phy_mode < 0) { -@@ -365,6 +424,7 @@ static void ar8xxx_poll_link(struct dsa_switch *ds) - - static struct dsa_switch_driver ar8xxx_switch_driver = { - .tag_protocol = DSA_TAG_PROTO_NONE, -+ .priv_size = sizeof(struct ar8xxx_priv), - .probe = ar8xxx_probe, - .setup = ar8xxx_setup, - .set_addr = ar8xxx_set_addr, -diff --git a/drivers/net/dsa/ar8xxx.h b/drivers/net/dsa/ar8xxx.h -index 7c7a125..98cc7ed 100644 ---- a/drivers/net/dsa/ar8xxx.h -+++ b/drivers/net/dsa/ar8xxx.h -@@ -17,6 +17,11 @@ - #define __AR8XXX_H - - #include -+#include ++static inline void ++ar8xxx_reg_clear(struct dsa_switch *ds, int reg, u32 val) ++{ ++ ar8xxx_rmw(ds, reg, val, 0); ++} + -+struct ar8xxx_priv { -+ struct regmap *regmap; -+}; ++#endif /* __AR8XXX_H */ +--- a/net/dsa/dsa.c ++++ b/net/dsa/dsa.c +@@ -285,6 +285,11 @@ static int dsa_switch_setup_one(struct d + dst->rcv = brcm_netdev_ops.rcv; + break; + #endif ++#ifdef CONFIG_NET_DSA_TAG_QCA ++ case DSA_TAG_PROTO_QCA: ++ dst->rcv = qca_netdev_ops.rcv; ++ break; ++#endif + case DSA_TAG_PROTO_NONE: + break; + default: +@@ -1041,6 +1046,7 @@ static SIMPLE_DEV_PM_OPS(dsa_pm_ops, dsa - struct ar8xxx_mib_desc { - unsigned int size; - -From patchwork Fri May 29 01:42:19 2015 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Subject: [4/7] net: dsa: add QCA tag support -From: Mathieu Olivari -X-Patchwork-Id: 477521 -X-Patchwork-Delegate: davem@davemloft.net -Message-Id: <1432863742-18427-5-git-send-email-mathieu@codeaurora.org> -To: robh+dt@kernel.org, pawel.moll@arm.com, mark.rutland@arm.com, - ijc+devicetree@hellion.org.uk, galak@codeaurora.org, - davem@davemloft.net, mathieu@codeaurora.org, andrew@lunn.ch, - f.fainelli@gmail.com, linux@roeck-us.net, gang.chen.5i5j@gmail.com, - jiri@resnulli.us, leitec@staticky.com, fabf@skynet.be, - alexander.h.duyck@intel.com, pavel.nakonechny@skitlab.ru, - joe@perches.com, sfeldma@gmail.com, nbd@nbd.name, juhosg@openwrt.org -Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, - netdev@vger.kernel.org -Date: Thu, 28 May 2015 18:42:19 -0700 - -QCA tags are used on QCA ar8xxx switch family. This change adds support -for encap/decap using 2 bytes header mode. - -Signed-off-by: Mathieu Olivari ---- - include/net/dsa.h | 1 + - net/dsa/Kconfig | 3 + - net/dsa/Makefile | 1 + - net/dsa/dsa.c | 5 ++ - net/dsa/dsa_priv.h | 2 + - net/dsa/slave.c | 5 ++ - net/dsa/tag_qca.c | 158 +++++++++++++++++++++++++++++++++++++++++++++++++++++ - 7 files changed, 175 insertions(+) - create mode 100644 net/dsa/tag_qca.c - -diff --git a/include/net/dsa.h b/include/net/dsa.h -index fbca63b..64ddf6f 100644 + static const struct of_device_id dsa_of_match_table[] = { + { .compatible = "brcm,bcm7445-switch-v4.0" }, ++ { .compatible = "qca,ar8xxx", }, + { .compatible = "marvell,dsa", }, + {} + }; --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -26,6 +26,7 @@ enum dsa_tag_protocol { @@ -925,8 +786,6 @@ index fbca63b..64ddf6f 100644 }; #define DSA_MAX_SWITCHES 4 -diff --git a/net/dsa/Kconfig b/net/dsa/Kconfig -index ff7736f..4f3cce1 100644 --- a/net/dsa/Kconfig +++ b/net/dsa/Kconfig @@ -26,6 +26,9 @@ config NET_DSA_HWMON @@ -939,8 +798,6 @@ index ff7736f..4f3cce1 100644 config NET_DSA_TAG_BRCM bool -diff --git a/net/dsa/Makefile b/net/dsa/Makefile -index da06ed1..9feb86c 100644 --- a/net/dsa/Makefile +++ b/net/dsa/Makefile @@ -3,6 +3,7 @@ obj-$(CONFIG_NET_DSA) += dsa_core.o @@ -951,27 +808,9 @@ index da06ed1..9feb86c 100644 dsa_core-$(CONFIG_NET_DSA_TAG_BRCM) += tag_brcm.o dsa_core-$(CONFIG_NET_DSA_TAG_DSA) += tag_dsa.o dsa_core-$(CONFIG_NET_DSA_TAG_EDSA) += tag_edsa.o -diff --git a/net/dsa/dsa.c b/net/dsa/dsa.c -index fffb9aa..6010a7d 100644 ---- a/net/dsa/dsa.c -+++ b/net/dsa/dsa.c -@@ -249,6 +249,11 @@ static int dsa_switch_setup_one(struct dsa_switch *ds, struct device *parent) - dst->rcv = brcm_netdev_ops.rcv; - break; - #endif -+#ifdef CONFIG_NET_DSA_TAG_QCA -+ case DSA_TAG_PROTO_QCA: -+ dst->rcv = qca_netdev_ops.rcv; -+ break; -+#endif - case DSA_TAG_PROTO_NONE: - break; - default: -diff --git a/net/dsa/dsa_priv.h b/net/dsa/dsa_priv.h -index d5f1f9b..350c94b 100644 --- a/net/dsa/dsa_priv.h +++ b/net/dsa/dsa_priv.h -@@ -74,5 +74,7 @@ extern const struct dsa_device_ops trailer_netdev_ops; +@@ -78,5 +78,7 @@ extern const struct dsa_device_ops trail /* tag_brcm.c */ extern const struct dsa_device_ops brcm_netdev_ops; @@ -979,11 +818,9 @@ index d5f1f9b..350c94b 100644 +extern const struct dsa_device_ops qca_netdev_ops; #endif -diff --git a/net/dsa/slave.c b/net/dsa/slave.c -index 04ffad3..cd8f552 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c -@@ -925,6 +925,11 @@ int dsa_slave_create(struct dsa_switch *ds, struct device *parent, +@@ -1180,6 +1180,11 @@ int dsa_slave_create(struct dsa_switch * p->xmit = brcm_netdev_ops.xmit; break; #endif @@ -995,9 +832,6 @@ index 04ffad3..cd8f552 100644 default: p->xmit = dsa_slave_notag_xmit; break; -diff --git a/net/dsa/tag_qca.c b/net/dsa/tag_qca.c -new file mode 100644 -index 0000000..8f02196 --- /dev/null +++ b/net/dsa/tag_qca.c @@ -0,0 +1,158 @@ @@ -1159,293 +993,6 @@ index 0000000..8f02196 + .xmit = qca_tag_xmit, + .rcv = qca_tag_rcv, +}; - -From patchwork Fri May 29 01:42:20 2015 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Subject: [5/7] net: dsa: ar8xxx: enable QCA header support on AR8xxx -From: Mathieu Olivari -X-Patchwork-Id: 477527 -X-Patchwork-Delegate: davem@davemloft.net -Message-Id: <1432863742-18427-6-git-send-email-mathieu@codeaurora.org> -To: robh+dt@kernel.org, pawel.moll@arm.com, mark.rutland@arm.com, - ijc+devicetree@hellion.org.uk, galak@codeaurora.org, - davem@davemloft.net, mathieu@codeaurora.org, andrew@lunn.ch, - f.fainelli@gmail.com, linux@roeck-us.net, gang.chen.5i5j@gmail.com, - jiri@resnulli.us, leitec@staticky.com, fabf@skynet.be, - alexander.h.duyck@intel.com, pavel.nakonechny@skitlab.ru, - joe@perches.com, sfeldma@gmail.com, nbd@nbd.name, juhosg@openwrt.org -Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, - netdev@vger.kernel.org -Date: Thu, 28 May 2015 18:42:20 -0700 - -This change enable support for the QCA headers in QCA83337 driver. -A 2 bytes header will be added by the switch on every incoming packet -to identify the ingress port, and the DSA tagging code will add a -similar 2 bytes header to control which port is used to send a -particular packet. - -Signed-off-by: Mathieu Olivari ---- - drivers/net/dsa/Kconfig | 1 + - drivers/net/dsa/ar8xxx.c | 28 ++++++++++++++++++++++++++-- - drivers/net/dsa/ar8xxx.h | 22 ++++++++++++++++++++++ - 3 files changed, 49 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/dsa/Kconfig b/drivers/net/dsa/Kconfig -index 17fb296..fa8b484 100644 ---- a/drivers/net/dsa/Kconfig -+++ b/drivers/net/dsa/Kconfig -@@ -68,6 +68,7 @@ config NET_DSA_BCM_SF2 - config NET_DSA_AR8XXX - tristate "Qualcomm Atheros AR8XXX Ethernet switch family support" - depends on NET_DSA -+ select NET_DSA_TAG_QCA - select REGMAP - ---help--- - This enables support for the Qualcomm Atheros AR8XXX Ethernet -diff --git a/drivers/net/dsa/ar8xxx.c b/drivers/net/dsa/ar8xxx.c -index 327abd4..4044614 100644 ---- a/drivers/net/dsa/ar8xxx.c -+++ b/drivers/net/dsa/ar8xxx.c -@@ -292,15 +292,31 @@ static int ar8xxx_setup(struct dsa_switch *ds) - if (ret < 0) - return ret; - -+ /* Enable CPU Port */ -+ ar8xxx_reg_set(ds, AR8327_REG_GLOBAL_FW_CTRL0, -+ AR8327_GLOBAL_FW_CTRL0_CPU_PORT_EN); -+ - /* Enable MIB counters */ - ar8xxx_reg_set(ds, AR8327_REG_MIB, AR8327_MIB_CPU_KEEP); - ar8xxx_write(ds, AR8327_REG_MODULE_EN, AR8327_MODULE_EN_MIB); - -+ /* Enable QCA header mode on Port 0 */ -+ ar8xxx_write(ds, AR8327_REG_PORT_HDR_CTRL(0), -+ AR8327_PORT_HDR_CTRL_ALL << AR8327_PORT_HDR_CTRL_TX_S | -+ AR8327_PORT_HDR_CTRL_ALL << AR8327_PORT_HDR_CTRL_RX_S); -+ - /* Disable forwarding by default on all ports */ - for (i = 0; i < AR8327_NUM_PORTS; i++) - ar8xxx_rmw(ds, AR8327_PORT_LOOKUP_CTRL(i), - AR8327_PORT_LOOKUP_MEMBER, 0); - -+ /* Forward all unknown frames to CPU port for Linux processing */ -+ ar8xxx_write(ds, AR8327_REG_GLOBAL_FW_CTRL1, -+ BIT(0) << AR8327_GLOBAL_FW_CTRL1_IGMP_DP_S | -+ BIT(0) << AR8327_GLOBAL_FW_CTRL1_BC_DP_S | -+ BIT(0) << AR8327_GLOBAL_FW_CTRL1_MC_DP_S | -+ BIT(0) << AR8327_GLOBAL_FW_CTRL1_UC_DP_S); -+ - /* Setup connection between CPU ports & PHYs */ - for (i = 0; i < DSA_MAX_PORTS; i++) { - /* CPU port gets connected to all PHYs in the switch */ -@@ -312,8 +328,16 @@ static int ar8xxx_setup(struct dsa_switch *ds) - - /* Invividual PHYs gets connected to CPU port only */ - if (ds->phys_port_mask & BIT(i)) { -- ar8xxx_rmw(ds, AR8327_PORT_LOOKUP_CTRL(phy_to_port(i)), -+ int phy = phy_to_port(i); -+ -+ ar8xxx_rmw(ds, AR8327_PORT_LOOKUP_CTRL(phy), - AR8327_PORT_LOOKUP_MEMBER, BIT(0)); -+ -+ /* Disable Auto-learning by default so the switch -+ * doesn't try to forward the frame to another port -+ */ -+ ar8xxx_reg_clear(ds, AR8327_PORT_LOOKUP_CTRL(phy), -+ AR8327_PORT_LOOKUP_LEARN); - } - } - -@@ -423,7 +447,7 @@ static void ar8xxx_poll_link(struct dsa_switch *ds) - } - - static struct dsa_switch_driver ar8xxx_switch_driver = { -- .tag_protocol = DSA_TAG_PROTO_NONE, -+ .tag_protocol = DSA_TAG_PROTO_QCA, - .priv_size = sizeof(struct ar8xxx_priv), - .probe = ar8xxx_probe, - .setup = ar8xxx_setup, -diff --git a/drivers/net/dsa/ar8xxx.h b/drivers/net/dsa/ar8xxx.h -index 98cc7ed..e68b92a 100644 ---- a/drivers/net/dsa/ar8xxx.h -+++ b/drivers/net/dsa/ar8xxx.h -@@ -62,6 +62,28 @@ struct ar8xxx_mib_desc { - #define AR8XXX_PORT_STATUS_LINK_AUTO BIT(9) - #define AR8XXX_PORT_STATUS_LINK_PAUSE BIT(10) - -+#define AR8327_REG_PORT_HDR_CTRL(_i) (0x9c + (_i * 4)) -+#define AR8327_PORT_HDR_CTRL_RX_MASK GENMASK(3, 2) -+#define AR8327_PORT_HDR_CTRL_RX_S 2 -+#define AR8327_PORT_HDR_CTRL_TX_MASK GENMASK(1, 0) -+#define AR8327_PORT_HDR_CTRL_TX_S 0 -+#define AR8327_PORT_HDR_CTRL_ALL 2 -+#define AR8327_PORT_HDR_CTRL_MGMT 1 -+#define AR8327_PORT_HDR_CTRL_NONE 0 -+ -+#define AR8327_REG_GLOBAL_FW_CTRL0 0x620 -+#define AR8327_GLOBAL_FW_CTRL0_CPU_PORT_EN BIT(10) -+ -+#define AR8327_REG_GLOBAL_FW_CTRL1 0x624 -+#define AR8327_GLOBAL_FW_CTRL1_IGMP_DP_MASK GENMASK(30, 24) -+#define AR8327_GLOBAL_FW_CTRL1_IGMP_DP_S 24 -+#define AR8327_GLOBAL_FW_CTRL1_BC_DP_MASK GENMASK(22, 16) -+#define AR8327_GLOBAL_FW_CTRL1_BC_DP_S 16 -+#define AR8327_GLOBAL_FW_CTRL1_MC_DP_MASK GENMASK(14, 8) -+#define AR8327_GLOBAL_FW_CTRL1_MC_DP_S 8 -+#define AR8327_GLOBAL_FW_CTRL1_UC_DP_MASK GENMASK(6, 0) -+#define AR8327_GLOBAL_FW_CTRL1_UC_DP_S 0 -+ - #define AR8327_PORT_LOOKUP_CTRL(_i) (0x660 + (_i) * 0xc) - #define AR8327_PORT_LOOKUP_MEMBER GENMASK(6, 0) - #define AR8327_PORT_LOOKUP_IN_MODE GENMASK(9, 8) - -From patchwork Fri May 29 01:42:21 2015 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Subject: [6/7] net: dsa: ar8xxx: add support for second xMII interfaces - through DT -From: Mathieu Olivari -X-Patchwork-Id: 477525 -X-Patchwork-Delegate: davem@davemloft.net -Message-Id: <1432863742-18427-7-git-send-email-mathieu@codeaurora.org> -To: robh+dt@kernel.org, pawel.moll@arm.com, mark.rutland@arm.com, - ijc+devicetree@hellion.org.uk, galak@codeaurora.org, - davem@davemloft.net, mathieu@codeaurora.org, andrew@lunn.ch, - f.fainelli@gmail.com, linux@roeck-us.net, gang.chen.5i5j@gmail.com, - jiri@resnulli.us, leitec@staticky.com, fabf@skynet.be, - alexander.h.duyck@intel.com, pavel.nakonechny@skitlab.ru, - joe@perches.com, sfeldma@gmail.com, nbd@nbd.name, juhosg@openwrt.org -Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, - netdev@vger.kernel.org -Date: Thu, 28 May 2015 18:42:21 -0700 - -This patch is adding support for port6 specific options to device tree. -They can be used to setup the second xMII interface, and connect it to -one of the switch port. - -Signed-off-by: Mathieu Olivari ---- - drivers/net/dsa/ar8xxx.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 50 insertions(+) - -diff --git a/drivers/net/dsa/ar8xxx.c b/drivers/net/dsa/ar8xxx.c -index 4044614..7559249 100644 ---- a/drivers/net/dsa/ar8xxx.c -+++ b/drivers/net/dsa/ar8xxx.c -@@ -19,6 +19,7 @@ - #include - #include - #include -+#include - - #include "ar8xxx.h" - -@@ -260,6 +261,9 @@ static int ar8xxx_set_pad_ctrl(struct dsa_switch *ds, int port, int mode) - ar8xxx_write(ds, AR8327_REG_PORT5_PAD_CTRL, - AR8327_PORT_PAD_RGMII_RX_DELAY_EN); - break; -+ case PHY_INTERFACE_MODE_SGMII: -+ ar8xxx_write(ds, reg, AR8327_PORT_PAD_SGMII_EN); -+ break; - default: - pr_err("xMII mode %d not supported\n", mode); - return -EINVAL; -@@ -268,6 +272,48 @@ static int ar8xxx_set_pad_ctrl(struct dsa_switch *ds, int port, int mode) - return 0; - } - -+static int ar8xxx_of_setup(struct dsa_switch *ds) -+{ -+ struct device_node *dn = ds->pd->of_node; -+ const char *s_phymode; -+ int ret, mode; -+ u32 phy_id, ctrl; -+ -+ /* If port6-phy-mode property exists, configure it accordingly */ -+ if (!of_property_read_string(dn, "qca,port6-phy-mode", &s_phymode)) { -+ for (mode = 0; mode < PHY_INTERFACE_MODE_MAX; mode++) -+ if (!strcasecmp(s_phymode, phy_modes(mode))) -+ break; -+ -+ if (mode == PHY_INTERFACE_MODE_MAX) -+ pr_err("Unknown phy-mode: \"%s\"\n", s_phymode); -+ -+ ret = ar8xxx_set_pad_ctrl(ds, 6, mode); -+ if (ret < 0) -+ return ret; -+ } -+ -+ /* If a phy ID is specified for PORT6 mac, connect them together */ -+ if (!of_property_read_u32(dn, "qca,port6-phy-id", &phy_id)) { -+ ar8xxx_rmw(ds, AR8327_PORT_LOOKUP_CTRL(6), -+ AR8327_PORT_LOOKUP_MEMBER, BIT(phy_to_port(phy_id))); -+ ar8xxx_rmw(ds, AR8327_PORT_LOOKUP_CTRL(phy_to_port(phy_id)), -+ AR8327_PORT_LOOKUP_MEMBER, BIT(6)); -+ -+ /* We want the switch to be pass-through and act like a PHY on -+ * these ports. So BC/MC/UC & IGMP frames need to be accepted -+ */ -+ ctrl = BIT(phy_to_port(phy_id)) | BIT(6); -+ ar8xxx_reg_set(ds, AR8327_REG_GLOBAL_FW_CTRL1, -+ ctrl << AR8327_GLOBAL_FW_CTRL1_IGMP_DP_S | -+ ctrl << AR8327_GLOBAL_FW_CTRL1_BC_DP_S | -+ ctrl << AR8327_GLOBAL_FW_CTRL1_MC_DP_S | -+ ctrl << AR8327_GLOBAL_FW_CTRL1_UC_DP_S); -+ } -+ -+ return 0; -+} -+ - static int ar8xxx_setup(struct dsa_switch *ds) - { - struct ar8xxx_priv *priv = ds_to_priv(ds); -@@ -341,6 +387,10 @@ static int ar8xxx_setup(struct dsa_switch *ds) - } - } - -+ ret = ar8xxx_of_setup(ds); -+ if (ret < 0) -+ return ret; -+ - return 0; - } - - -From patchwork Fri May 29 01:42:22 2015 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Subject: [7/7] Documentation: devicetree: add ar8xxx binding -From: Mathieu Olivari -X-Patchwork-Id: 477528 -X-Patchwork-Delegate: davem@davemloft.net -Message-Id: <1432863742-18427-8-git-send-email-mathieu@codeaurora.org> -To: robh+dt@kernel.org, pawel.moll@arm.com, mark.rutland@arm.com, - ijc+devicetree@hellion.org.uk, galak@codeaurora.org, - davem@davemloft.net, mathieu@codeaurora.org, andrew@lunn.ch, - f.fainelli@gmail.com, linux@roeck-us.net, gang.chen.5i5j@gmail.com, - jiri@resnulli.us, leitec@staticky.com, fabf@skynet.be, - alexander.h.duyck@intel.com, pavel.nakonechny@skitlab.ru, - joe@perches.com, sfeldma@gmail.com, nbd@nbd.name, juhosg@openwrt.org -Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, - netdev@vger.kernel.org -Date: Thu, 28 May 2015 18:42:22 -0700 - -Add device-tree binding for ar8xxx switch families. - -Signed-off-by: Mathieu Olivari ---- - .../devicetree/bindings/net/dsa/qca-ar8xxx.txt | 70 ++++++++++++++++++++++ - 1 file changed, 70 insertions(+) - create mode 100644 Documentation/devicetree/bindings/net/dsa/qca-ar8xxx.txt - -diff --git a/Documentation/devicetree/bindings/net/dsa/qca-ar8xxx.txt b/Documentation/devicetree/bindings/net/dsa/qca-ar8xxx.txt -new file mode 100644 -index 0000000..f4fd3f1 --- /dev/null +++ b/Documentation/devicetree/bindings/net/dsa/qca-ar8xxx.txt @@ -0,0 +1,70 @@ diff --git a/target/linux/ipq806x/patches-4.4/708-ARM-dts-qcom-add-gmac-nodes-to-ipq806x-platforms.patch b/target/linux/ipq806x/patches-4.4/708-ARM-dts-qcom-add-gmac-nodes-to-ipq806x-platforms.patch index 691ebb66ba..d85d8b02aa 100644 --- a/target/linux/ipq806x/patches-4.4/708-ARM-dts-qcom-add-gmac-nodes-to-ipq806x-platforms.patch +++ b/target/linux/ipq806x/patches-4.4/708-ARM-dts-qcom-add-gmac-nodes-to-ipq806x-platforms.patch @@ -121,7 +121,7 @@ Signed-off-by: Mathieu Olivari }; --- a/arch/arm/boot/dts/qcom-ipq8064.dtsi +++ b/arch/arm/boot/dts/qcom-ipq8064.dtsi -@@ -763,6 +763,92 @@ +@@ -755,6 +755,92 @@ status = "disabled"; }; diff --git a/target/linux/ipq806x/patches-4.4/709-spi-qup-Fix-fifo-and-dma-support-for-IPQ806x.patch b/target/linux/ipq806x/patches-4.4/709-spi-qup-Fix-fifo-and-dma-support-for-IPQ806x.patch index 8c4718e2a6..fa78a0aeda 100644 --- a/target/linux/ipq806x/patches-4.4/709-spi-qup-Fix-fifo-and-dma-support-for-IPQ806x.patch +++ b/target/linux/ipq806x/patches-4.4/709-spi-qup-Fix-fifo-and-dma-support-for-IPQ806x.patch @@ -8,8 +8,6 @@ Signed-off-by: Ram Chandra Jangir drivers/spi/spi-qup.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) -diff --git a/drivers/spi/spi-qup.c b/drivers/spi/spi-qup.c -index 810a7fa..0808017 100644 --- a/drivers/spi/spi-qup.c +++ b/drivers/spi/spi-qup.c @@ -24,6 +24,7 @@ @@ -28,7 +26,7 @@ index 810a7fa..0808017 100644 }; -@@ -370,7 +372,8 @@ static int spi_qup_do_pio(struct spi_master *master, struct spi_transfer *xfer) +@@ -370,7 +372,8 @@ static int spi_qup_do_pio(struct spi_mas return ret; } @@ -38,7 +36,7 @@ index 810a7fa..0808017 100644 return 0; } -@@ -448,6 +451,7 @@ spi_qup_get_mode(struct spi_master *master, struct spi_transfer *xfer) +@@ -448,6 +451,7 @@ spi_qup_get_mode(struct spi_master *mast { struct spi_qup *qup = spi_master_get_devdata(master); u32 mode; @@ -46,7 +44,7 @@ index 810a7fa..0808017 100644 qup->w_size = 4; -@@ -458,6 +462,14 @@ spi_qup_get_mode(struct spi_master *master, struct spi_transfer *xfer) +@@ -458,6 +462,14 @@ spi_qup_get_mode(struct spi_master *mast qup->n_words = xfer->len / qup->w_size; @@ -61,7 +59,7 @@ index 810a7fa..0808017 100644 if (qup->n_words <= (qup->in_fifo_sz / sizeof(u32))) mode = QUP_IO_M_MODE_FIFO; else -@@ -491,7 +503,7 @@ static int spi_qup_io_config(struct spi_device *spi, struct spi_transfer *xfer) +@@ -491,7 +503,7 @@ static int spi_qup_io_config(struct spi_ return -EIO; } @@ -70,7 +68,7 @@ index 810a7fa..0808017 100644 n_words = controller->n_words; if (mode == QUP_IO_M_MODE_FIFO) { -@@ -500,6 +512,7 @@ static int spi_qup_io_config(struct spi_device *spi, struct spi_transfer *xfer) +@@ -500,6 +512,7 @@ static int spi_qup_io_config(struct spi_ /* must be zero for FIFO */ writel_relaxed(0, controller->base + QUP_MX_INPUT_CNT); writel_relaxed(0, controller->base + QUP_MX_OUTPUT_CNT); @@ -117,7 +115,7 @@ index 810a7fa..0808017 100644 static int spi_qup_probe(struct platform_device *pdev) { struct spi_master *master; -@@ -846,6 +891,11 @@ static int spi_qup_probe(struct platform_device *pdev) +@@ -846,6 +891,11 @@ static int spi_qup_probe(struct platform if (of_device_is_compatible(dev->of_node, "qcom,spi-qup-v1.1.1")) controller->qup_v1 = 1; @@ -129,6 +127,3 @@ index 810a7fa..0808017 100644 spin_lock_init(&controller->lock); init_completion(&controller->done); --- -2.7.2 - diff --git a/target/linux/ipq806x/patches-4.4/710-watchdog-qcom-set-WDT_BARK_TIME-register-offset-to-o.patch b/target/linux/ipq806x/patches-4.4/710-watchdog-qcom-set-WDT_BARK_TIME-register-offset-to-o.patch index 7573c963a7..dde5822f16 100644 --- a/target/linux/ipq806x/patches-4.4/710-watchdog-qcom-set-WDT_BARK_TIME-register-offset-to-o.patch +++ b/target/linux/ipq806x/patches-4.4/710-watchdog-qcom-set-WDT_BARK_TIME-register-offset-to-o.patch @@ -18,8 +18,6 @@ Signed-off-by: Ram Chandra Jangir drivers/watchdog/qcom-wdt.c | 2 ++ 1 file changed, 2 insertions(+) -diff --git a/drivers/watchdog/qcom-wdt.c b/drivers/watchdog/qcom-wdt.c -index 773dcfa..002274a 100644 --- a/drivers/watchdog/qcom-wdt.c +++ b/drivers/watchdog/qcom-wdt.c @@ -22,6 +22,7 @@ @@ -30,7 +28,7 @@ index 773dcfa..002274a 100644 #define WDT_BITE_TIME 0x5C struct qcom_wdt { -@@ -44,6 +45,7 @@ static int qcom_wdt_start(struct watchdog_device *wdd) +@@ -44,6 +45,7 @@ static int qcom_wdt_start(struct watchdo writel(0, wdt->base + WDT_EN); writel(1, wdt->base + WDT_RST); @@ -38,6 +36,3 @@ index 773dcfa..002274a 100644 writel(wdd->timeout * wdt->rate, wdt->base + WDT_BITE_TIME); writel(1, wdt->base + WDT_EN); return 0; --- -2.7.2 - diff --git a/target/linux/ipq806x/patches-4.4/711-stmmac-fix-ipq806x-DMA-configuration.patch b/target/linux/ipq806x/patches-4.4/711-stmmac-fix-ipq806x-DMA-configuration.patch index c99f60768f..58400314c7 100644 --- a/target/linux/ipq806x/patches-4.4/711-stmmac-fix-ipq806x-DMA-configuration.patch +++ b/target/linux/ipq806x/patches-4.4/711-stmmac-fix-ipq806x-DMA-configuration.patch @@ -94,7 +94,7 @@ int limit; --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c -@@ -1639,9 +1639,11 @@ static int stmmac_init_dma_engine(struct +@@ -1641,9 +1641,11 @@ static int stmmac_init_dma_engine(struct int pbl = DEFAULT_DMA_PBL, fixed_burst = 0, burst_len = 0; int mixed_burst = 0; int atds = 0; @@ -106,7 +106,7 @@ fixed_burst = priv->plat->dma_cfg->fixed_burst; mixed_burst = priv->plat->dma_cfg->mixed_burst; burst_len = priv->plat->dma_cfg->burst_len; -@@ -1652,7 +1654,7 @@ static int stmmac_init_dma_engine(struct +@@ -1654,7 +1656,7 @@ static int stmmac_init_dma_engine(struct return priv->hw->dma->init(priv->ioaddr, pbl, fixed_burst, mixed_burst, burst_len, priv->dma_tx_phy, diff --git a/target/linux/ipq806x/patches-4.4/800-devicetree.patch b/target/linux/ipq806x/patches-4.4/800-devicetree.patch index 0081a28885..39f59d36c8 100644 --- a/target/linux/ipq806x/patches-4.4/800-devicetree.patch +++ b/target/linux/ipq806x/patches-4.4/800-devicetree.patch @@ -12,7 +12,7 @@ Signed-off-by: Jonas Gorski --- a/arch/arm/boot/dts/Makefile +++ b/arch/arm/boot/dts/Makefile -@@ -506,7 +506,12 @@ +@@ -506,7 +506,12 @@ dtb-$(CONFIG_ARCH_QCOM) += \ qcom-apq8084-ifc6540.dtb \ qcom-apq8084-mtp.dtb \ qcom-ipq8064-ap148.dtb \ diff --git a/target/linux/ipq806x/patches-4.4/996-ATAG_DTB_COMPAT_CMDLINE_MANGLE.patch b/target/linux/ipq806x/patches-4.4/996-ATAG_DTB_COMPAT_CMDLINE_MANGLE.patch index 490886ee44..8d5cbf9102 100644 --- a/target/linux/ipq806x/patches-4.4/996-ATAG_DTB_COMPAT_CMDLINE_MANGLE.patch +++ b/target/linux/ipq806x/patches-4.4/996-ATAG_DTB_COMPAT_CMDLINE_MANGLE.patch @@ -18,7 +18,7 @@ Signed-off-by: Adrian Panella --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig -@@ -1927,6 +1927,17 @@ config ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEN +@@ -1928,6 +1928,17 @@ config ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEN The command-line arguments provided by the boot loader will be appended to the the device tree bootargs property. @@ -107,7 +107,7 @@ Signed-off-by: Adrian Panella static void merge_fdt_bootargs(void *fdt, const char *fdt_cmdline) { char cmdline[COMMAND_LINE_SIZE]; -@@ -85,12 +134,21 @@ static void merge_fdt_bootargs(void *fdt +@@ -85,12 +140,21 @@ static void merge_fdt_bootargs(void *fdt /* and append the ATAG_CMDLINE */ if (fdt_cmdline) { @@ -129,7 +129,7 @@ Signed-off-by: Adrian Panella } *ptr = '\0'; -@@ -147,7 +205,9 @@ int atags_to_fdt(void *atag_list, void * +@@ -147,7 +211,9 @@ int atags_to_fdt(void *atag_list, void * else setprop_string(fdt, "/chosen", "bootargs", atag->u.cmdline.cmdline); @@ -140,7 +140,7 @@ Signed-off-by: Adrian Panella if (memcount >= sizeof(mem_reg_property)/4) continue; if (!atag->u.mem.size) -@@ -186,6 +246,10 @@ int atags_to_fdt(void *atag_list, void * +@@ -186,6 +252,10 @@ int atags_to_fdt(void *atag_list, void * setprop(fdt, "/memory", "reg", mem_reg_property, 4 * memcount * memsize); } @@ -164,7 +164,7 @@ Signed-off-by: Adrian Panella static int kernel_init(void *); extern void init_IRQ(void); -@@ -585,6 +589,18 @@ asmlinkage __visible void __init start_k +@@ -560,6 +564,18 @@ asmlinkage __visible void __init start_k page_alloc_init(); pr_notice("Kernel command line: %s\n", boot_command_line); diff --git a/target/linux/lantiq/patches-4.4/0028-NET-lantiq-various-etop-fixes.patch b/target/linux/lantiq/patches-4.4/0028-NET-lantiq-various-etop-fixes.patch index a236da1efa..81eccf24bc 100644 --- a/target/linux/lantiq/patches-4.4/0028-NET-lantiq-various-etop-fixes.patch +++ b/target/linux/lantiq/patches-4.4/0028-NET-lantiq-various-etop-fixes.patch @@ -104,7 +104,7 @@ Signed-off-by: John Crispin + +#define PMAC_HD_CTL_AS (1 << 19) +#define PMAC_HD_CTL_RXSH (1 << 22) - ++ +/* Switch Enable (0=disable, 1=enable) */ +#define GCTL0_SE 0x80000000 +/* Disable MDIO auto polling (0=disable, 1=enable) */ @@ -124,7 +124,7 @@ Signed-off-by: John Crispin +#define MDIO_XR9_REG_OFFSET 0 +#define MDIO_XR9_ADDR_OFFSET 5 +#define MDIO_XR9_WR_OFFSET 16 -+ + +#define LTQ_DMA_ETOP ((of_machine_is_compatible("lantiq,ase")) ? \ + (INT_NUM_IM3_IRL0) : (INT_NUM_IM2_IRL0)) + @@ -333,8 +333,7 @@ Signed-off-by: John Crispin - ltq_pmu_enable(PMU_PPE); + clk_enable(priv->clk_ppe); - -- switch (priv->pldata->mii_mode) { ++ + if (of_machine_is_compatible("lantiq,ar9")) { + ltq_etop_gbit_init(dev); + /* force the etops link to the gbit to MII */ @@ -343,7 +342,8 @@ Signed-off-by: John Crispin + ltq_etop_w32_mask(MDIO_CFG_MASK, 0, LTQ_ETOP_MDIO_CFG); + ltq_etop_w32_mask(MAC_CFG_MASK, MAC_CFG_CGEN | MAC_CFG_DUPLEX | + MAC_CFG_SPEED | MAC_CFG_LINK, LTQ_ETOP_MAC_CFG); -+ + +- switch (priv->pldata->mii_mode) { + switch (mii_mode) { case PHY_INTERFACE_MODE_RMII: - ltq_etop_w32_mask(ETOP_MII_MASK, @@ -382,8 +382,7 @@ Signed-off-by: John Crispin - ltq_etop_w32(PPE32_CGEN, LQ_PPE32_ENET_MAC_CFG); + return 0; +} - -- ltq_dma_init_port(DMA_PORT_ETOP); ++ +static int +ltq_etop_dma_init(struct net_device *dev) +{ @@ -392,21 +391,14 @@ Signed-off-by: John Crispin + int rx = priv->rx_irq - LTQ_DMA_ETOP; + int err; + ltq_dma_init_port(DMA_PORT_ETOP); + - for (i = 0; i < MAX_DMA_CHAN; i++) { - int irq = LTQ_DMA_CH0_INT + i; - struct ltq_etop_chan *ch = &priv->ch[i]; -+ ltq_dma_init_port(DMA_PORT_ETOP); - +- - ch->idx = ch->dma.nr = i; -+ priv->txch.dma.nr = tx; -+ ltq_dma_alloc_tx(&priv->txch.dma); -+ err = request_irq(priv->tx_irq, ltq_etop_dma_irq, 0, "eth_tx", priv); -+ if (err) { -+ netdev_err(dev, "failed to allocate tx irq\n"); -+ goto err_out; -+ } -+ priv->txch.dma.irq = priv->tx_irq; - +- - if (IS_TX(i)) { - ltq_dma_alloc_tx(&ch->dma); - request_irq(irq, ltq_etop_dma_irq, 0, "etop_tx", priv); @@ -418,6 +410,15 @@ Signed-off-by: John Crispin - return -ENOMEM; - ch->dma.desc = 0; - request_irq(irq, ltq_etop_dma_irq, 0, "etop_rx", priv); ++ priv->txch.dma.nr = tx; ++ ltq_dma_alloc_tx(&priv->txch.dma); ++ err = request_irq(priv->tx_irq, ltq_etop_dma_irq, 0, "eth_tx", priv); ++ if (err) { ++ netdev_err(dev, "failed to allocate tx irq\n"); ++ goto err_out; ++ } ++ priv->txch.dma.irq = priv->tx_irq; ++ + priv->rxch.dma.nr = rx; + ltq_dma_alloc_rx(&priv->rxch.dma); + for (priv->rxch.dma.desc = 0; priv->rxch.dma.desc < LTQ_DESC_NUM; @@ -655,6 +656,12 @@ Signed-off-by: John Crispin - phy_stop(priv->phydev); - for (i = 0; i < MAX_DMA_CHAN; i++) { - struct ltq_etop_chan *ch = &priv->ch[i]; +- +- if (!IS_RX(i) && !IS_TX(i)) +- continue; +- napi_disable(&ch->napi); +- ltq_dma_close(&ch->dma); +- } + if (priv->phydev) + phy_stop(priv->phydev); + napi_disable(&priv->txch.napi); @@ -664,12 +671,7 @@ Signed-off-by: John Crispin + ltq_dma_close(&priv->txch.dma); + ltq_dma_close(&priv->rxch.dma); + spin_unlock_irqrestore(&priv->lock, flags); - -- if (!IS_RX(i) && !IS_TX(i)) -- continue; -- napi_disable(&ch->napi); -- ltq_dma_close(&ch->dma); -- } ++ return 0; } @@ -789,7 +791,7 @@ Signed-off-by: John Crispin res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { -@@ -733,31 +943,62 @@ ltq_etop_probe(struct platform_device *p +@@ -733,30 +943,61 @@ ltq_etop_probe(struct platform_device *p goto err_out; } @@ -823,19 +825,10 @@ Signed-off-by: John Crispin priv->pdev = pdev; - priv->pldata = dev_get_platdata(&pdev->dev); priv->netdev = dev; -- spin_lock_init(&priv->lock); + priv->tx_irq = irqres[0].start; + priv->rx_irq = irqres[1].start; + priv->mii_mode = of_get_phy_mode(pdev->dev.of_node); - -- for (i = 0; i < MAX_DMA_CHAN; i++) { -- if (IS_TX(i)) -- netif_napi_add(dev, &priv->ch[i].napi, -- ltq_etop_poll_tx, 8); -- else if (IS_RX(i)) -- netif_napi_add(dev, &priv->ch[i].napi, -- ltq_etop_poll_rx, 32); -- priv->ch[i].netdev = dev; ++ + mac = of_get_mac_address(pdev->dev.of_node); + if (mac) + memcpy(priv->mac, mac, ETH_ALEN); @@ -855,18 +848,26 @@ Signed-off-by: John Crispin + priv->clk_ephycgu = clk_get(&pdev->dev, "ephycgu"); + if (IS_ERR(priv->clk_ephycgu)) + return PTR_ERR(priv->clk_ephycgu); - } - -+ spin_lock_init(&priv->lock); ++ } + + spin_lock_init(&priv->lock); + +- for (i = 0; i < MAX_DMA_CHAN; i++) { +- if (IS_TX(i)) +- netif_napi_add(dev, &priv->ch[i].napi, +- ltq_etop_poll_tx, 8); +- else if (IS_RX(i)) +- netif_napi_add(dev, &priv->ch[i].napi, +- ltq_etop_poll_rx, 32); +- priv->ch[i].netdev = dev; +- } + netif_napi_add(dev, &priv->txch.napi, ltq_etop_poll_tx, 8); + netif_napi_add(dev, &priv->rxch.napi, ltq_etop_poll_rx, 32); + priv->txch.netdev = dev; + priv->rxch.netdev = dev; -+ + err = register_netdev(dev); if (err) - goto err_free; @@ -785,31 +1026,22 @@ ltq_etop_remove(struct platform_device * return 0; } diff --git a/target/linux/lantiq/patches-4.4/0160-owrt-lantiq-multiple-flash.patch b/target/linux/lantiq/patches-4.4/0160-owrt-lantiq-multiple-flash.patch index 4c45e4f8a1..087d923f7d 100644 --- a/target/linux/lantiq/patches-4.4/0160-owrt-lantiq-multiple-flash.patch +++ b/target/linux/lantiq/patches-4.4/0160-owrt-lantiq-multiple-flash.patch @@ -82,7 +82,6 @@ - if (!ltq_mtd->res) { - dev_err(&pdev->dev, "failed to get memory resource\n"); - return -ENOENT; -- } + for (i = 0; i < pdev->num_resources; i++) { + printk(KERN_NOTICE "lantiq nor flash device: %.8llx at %.8llx\n", + (unsigned long long)resource_size(&pdev->resource[i]), @@ -95,27 +94,14 @@ + dev_err(&pdev->dev, "Could not reserve memory region\n"); + return -ENOMEM; + } - -- ltq_mtd->map = devm_kzalloc(&pdev->dev, sizeof(struct map_info), -- GFP_KERNEL); -- if (!ltq_mtd->map) -- return -ENOMEM; ++ + ltq_mtd->map[i].name = ltq_map_name; + ltq_mtd->map[i].bankwidth = 2; + ltq_mtd->map[i].read = ltq_read16; + ltq_mtd->map[i].write = ltq_write16; + ltq_mtd->map[i].copy_from = ltq_copy_from; + ltq_mtd->map[i].copy_to = ltq_copy_to; - -- if (of_find_property(pdev->dev.of_node, "lantiq,noxip", NULL)) -- ltq_mtd->map->phys = NO_XIP; -- else -- ltq_mtd->map->phys = ltq_mtd->res->start; -- ltq_mtd->res->start; -- ltq_mtd->map->size = resource_size(ltq_mtd->res); -- ltq_mtd->map->virt = devm_ioremap_resource(&pdev->dev, ltq_mtd->res); -- if (IS_ERR(ltq_mtd->map->virt)) -- return PTR_ERR(ltq_mtd->map->virt); ++ + if (of_find_property(pdev->dev.of_node, "lantiq,noxip", NULL)) + ltq_mtd->map[i].phys = NO_XIP; + else @@ -125,30 +111,18 @@ + ltq_mtd->map[i].size); + if (IS_ERR(ltq_mtd->map[i].virt)) + return PTR_ERR(ltq_mtd->map[i].virt); - -- ltq_mtd->map->name = ltq_map_name; -- ltq_mtd->map->bankwidth = 2; -- ltq_mtd->map->read = ltq_read16; -- ltq_mtd->map->write = ltq_write16; -- ltq_mtd->map->copy_from = ltq_copy_from; -- ltq_mtd->map->copy_to = ltq_copy_to; ++ + if (ltq_mtd->map[i].virt == NULL) { + dev_err(&pdev->dev, "Failed to ioremap flash region\n"); + err = PTR_ERR(ltq_mtd->map[i].virt); + goto err_out; + } - -- ltq_mtd->map->map_priv_1 = LTQ_NOR_PROBING; -- ltq_mtd->mtd = do_map_probe("cfi_probe", ltq_mtd->map); -- ltq_mtd->map->map_priv_1 = LTQ_NOR_NORMAL; ++ + ltq_mtd->map[i].map_priv_1 = LTQ_NOR_PROBING; + for (type = rom_probe_types; !ltq_mtd->mtd[i] && *type; type++) + ltq_mtd->mtd[i] = do_map_probe(*type, <q_mtd->map[i]); + ltq_mtd->map[i].map_priv_1 = LTQ_NOR_NORMAL; - -- if (!ltq_mtd->mtd) { -- dev_err(&pdev->dev, "probing failed\n"); -- return -ENXIO; ++ + if (!ltq_mtd->mtd[i]) { + dev_err(&pdev->dev, "probing failed\n"); + return -ENXIO; @@ -164,7 +138,10 @@ + cfi->addr_unlock2 ^= 1; } -- ltq_mtd->mtd->dev.parent = &pdev->dev; +- ltq_mtd->map = devm_kzalloc(&pdev->dev, sizeof(struct map_info), +- GFP_KERNEL); +- if (!ltq_mtd->map) +- return -ENOMEM; + if (devices_found == 1) { + ltq_mtd->cmtd = ltq_mtd->mtd[0]; + } else if (devices_found > 1) { @@ -176,6 +153,34 @@ + err = -ENXIO; + } +- if (of_find_property(pdev->dev.of_node, "lantiq,noxip", NULL)) +- ltq_mtd->map->phys = NO_XIP; +- else +- ltq_mtd->map->phys = ltq_mtd->res->start; +- ltq_mtd->res->start; +- ltq_mtd->map->size = resource_size(ltq_mtd->res); +- ltq_mtd->map->virt = devm_ioremap_resource(&pdev->dev, ltq_mtd->res); +- if (IS_ERR(ltq_mtd->map->virt)) +- return PTR_ERR(ltq_mtd->map->virt); +- +- ltq_mtd->map->name = ltq_map_name; +- ltq_mtd->map->bankwidth = 2; +- ltq_mtd->map->read = ltq_read16; +- ltq_mtd->map->write = ltq_write16; +- ltq_mtd->map->copy_from = ltq_copy_from; +- ltq_mtd->map->copy_to = ltq_copy_to; +- +- ltq_mtd->map->map_priv_1 = LTQ_NOR_PROBING; +- ltq_mtd->mtd = do_map_probe("cfi_probe", ltq_mtd->map); +- ltq_mtd->map->map_priv_1 = LTQ_NOR_NORMAL; +- +- if (!ltq_mtd->mtd) { +- dev_err(&pdev->dev, "probing failed\n"); +- return -ENXIO; +- } +- +- ltq_mtd->mtd->dev.parent = &pdev->dev; +- - cfi = ltq_mtd->map->fldrv_priv; - cfi->addr_unlock1 ^= 1; - cfi->addr_unlock2 ^= 1; diff --git a/target/linux/mediatek/patches-4.4/0103-nand_fixes.patch b/target/linux/mediatek/patches-4.4/0103-nand_fixes.patch index 5e18fb4760..92f34c5fc2 100644 --- a/target/linux/mediatek/patches-4.4/0103-nand_fixes.patch +++ b/target/linux/mediatek/patches-4.4/0103-nand_fixes.patch @@ -1,6 +1,6 @@ --- a/drivers/mtd/nand/mtk_nand.c +++ b/drivers/mtd/nand/mtk_nand.c -@@ -1017,8 +1017,8 @@ +@@ -1017,8 +1017,8 @@ static int mtk_nfc_ooblayout_free(struct if (section >= eccsteps) return -ERANGE; @@ -11,7 +11,7 @@ return 0; } -@@ -1058,7 +1058,7 @@ +@@ -1058,7 +1058,7 @@ static void mtk_nfc_set_fdm(struct mtk_n fdm->reg_size = NFI_FDM_MAX_SIZE; /* bad block mark storage */ diff --git a/target/linux/octeon/patches-4.4/170-cisco-hack.patch b/target/linux/octeon/patches-4.4/170-cisco-hack.patch index 6e49100e6a..b975eef5f0 100644 --- a/target/linux/octeon/patches-4.4/170-cisco-hack.patch +++ b/target/linux/octeon/patches-4.4/170-cisco-hack.patch @@ -18,7 +18,7 @@ Signed-off-by: Michał Osowiecki --- a/arch/mips/cavium-octeon/setup.c +++ b/arch/mips/cavium-octeon/setup.c -@@ -944,6 +944,10 @@ +@@ -944,6 +944,10 @@ void __init plat_mem_setup(void) if (mem_alloc_size > MAX_MEMORY) mem_alloc_size = MAX_MEMORY; diff --git a/target/linux/oxnas/patches-4.4/300-introduce-oxnas-platform.patch b/target/linux/oxnas/patches-4.4/300-introduce-oxnas-platform.patch index b3a8dc0f90..a88d5d94b5 100644 --- a/target/linux/oxnas/patches-4.4/300-introduce-oxnas-platform.patch +++ b/target/linux/oxnas/patches-4.4/300-introduce-oxnas-platform.patch @@ -1,6 +1,6 @@ --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig -@@ -602,6 +602,19 @@ config ARCH_LPC32XX +@@ -603,6 +603,19 @@ config ARCH_LPC32XX help Support for the NXP LPC32XX family of processors @@ -20,7 +20,7 @@ config ARCH_PXA bool "PXA2xx/PXA3xx-based" depends on MMU -@@ -882,6 +895,8 @@ source "arch/arm/mach-omap2/Kconfig" +@@ -883,6 +896,8 @@ source "arch/arm/mach-omap2/Kconfig" source "arch/arm/mach-orion5x/Kconfig" diff --git a/target/linux/ramips/patches-4.4/0720-arch-mips-ralink-add-i2c-clocks.patch b/target/linux/ramips/patches-4.4/0720-arch-mips-ralink-add-i2c-clocks.patch index ae262ac97d..500625b4e5 100644 --- a/target/linux/ramips/patches-4.4/0720-arch-mips-ralink-add-i2c-clocks.patch +++ b/target/linux/ramips/patches-4.4/0720-arch-mips-ralink-add-i2c-clocks.patch @@ -1,6 +1,6 @@ --- a/arch/mips/ralink/mt7620.c +++ b/arch/mips/ralink/mt7620.c -@@ -389,6 +389,7 @@ void __init ralink_clk_init(void) +@@ -509,6 +509,7 @@ void __init ralink_clk_init(void) unsigned long sys_rate; unsigned long dram_rate; unsigned long periph_rate; @@ -8,7 +8,7 @@ xtal_rate = mt7620_get_xtal_rate(); -@@ -403,6 +404,7 @@ void __init ralink_clk_init(void) +@@ -523,6 +524,7 @@ void __init ralink_clk_init(void) cpu_rate = MHZ(575); dram_rate = sys_rate = cpu_rate / 3; periph_rate = MHZ(40); @@ -16,7 +16,7 @@ ralink_clk_add("10000d00.uartlite", periph_rate); ralink_clk_add("10000e00.uartlite", periph_rate); -@@ -414,6 +416,7 @@ void __init ralink_clk_init(void) +@@ -534,6 +536,7 @@ void __init ralink_clk_init(void) dram_rate = mt7620_get_dram_rate(pll_rate); sys_rate = mt7620_get_sys_rate(cpu_rate); periph_rate = mt7620_get_periph_rate(xtal_rate); @@ -24,7 +24,7 @@ pr_debug(RFMT("XTAL") RFMT("CPU_PLL") RFMT("PLL"), RINT(xtal_rate), RFRAC(xtal_rate), -@@ -435,6 +438,8 @@ void __init ralink_clk_init(void) +@@ -555,6 +558,8 @@ void __init ralink_clk_init(void) ralink_clk_add("cpu", cpu_rate); ralink_clk_add("10000100.timer", periph_rate); ralink_clk_add("10000120.watchdog", periph_rate); -- 2.25.1